From bc5f382af0106e9e54c940849a3baad087454f68 Mon Sep 17 00:00:00 2001 From: joewdavies Date: Fri, 7 Jul 2023 11:53:51 +0200 Subject: [PATCH] Fix: ensure tooltip stays in container, default parentElement for tooltip no longer body it is now App container. Added aria-live and role attr to tooltip --- dist/gridviz.js | 70 +++++++++------ dist/gridviz.min.js | 2 +- docs/reference.md | 183 +++++++++++++++++++--------------------- examples/test/test.html | 11 +++ src/App.js | 6 +- src/Tooltip.js | 62 +++++++++----- 6 files changed, 190 insertions(+), 144 deletions(-) diff --git a/dist/gridviz.js b/dist/gridviz.js index 67a3e3e9c..334900ad9 100644 --- a/dist/gridviz.js +++ b/dist/gridviz.js @@ -26651,7 +26651,7 @@ class App { this.legendDivId = opts.legendDivId || 'gvizLegend' this.legend = (0,d3_selection__WEBPACK_IMPORTED_MODULE_11__["default"])('#' + this.legendDivId) if (this.legend.empty()) { - this.legend = (0,d3_selection__WEBPACK_IMPORTED_MODULE_11__["default"])('body') + this.legend = (0,d3_selection__WEBPACK_IMPORTED_MODULE_11__["default"])('#' + container.id) .append('div') .attr('id', this.legendDivId) .style('position', 'absolute') @@ -26671,6 +26671,10 @@ class App { //tooltip + // set App container as default parent element for tooltip + if (!opts.tooltip) opts.tooltip = {} + if (!opts.tooltip.parentElement) opts.tooltip.parentElement = container + /** * @private * @type {Tooltip} */ @@ -28906,12 +28910,17 @@ class Tooltip { this.yMouseOffset = opts.yMouseOffset || 0 /** @type {number} */ this.xMouseOffset = opts.xMouseOffset || 0 + /** @type {HTMLElement} */ + this.parentElement = opts.parentElement || document.body /** * @private * @type {import("d3-selection").Selection} */ this.tooltip = (0,d3_selection__WEBPACK_IMPORTED_MODULE_0__["default"])('#' + this.div) - if (this.tooltip.empty()) this.tooltip = (0,d3_selection__WEBPACK_IMPORTED_MODULE_0__["default"])('body').append('div').attr('id', this.div) + if (this.tooltip.empty()) + this.tooltip = (0,d3_selection__WEBPACK_IMPORTED_MODULE_0__["default"])('#' + this.parentElement.id) + .append('div') + .attr('id', this.div) //initialise this.tooltip.style('max-width', this.maxWidth) @@ -28926,6 +28935,9 @@ class Tooltip { this.tooltip.style('position', 'absolute') this.tooltip.style('pointer-events', 'none') this.tooltip.style('opacity', '0') + + // aria-labels (thanks to wahlatlas) + this.tooltip.attr('role', 'tooltip').attr('aria-live', 'polite') } /** Show the tooltip */ @@ -28956,6 +28968,8 @@ class Tooltip { this.tooltip .style('left', event.pageX + this.xOffset + 'px') .style('top', event.pageY - this.yOffset + 'px') + + this.ensureTooltipInsideContainer(event) } /* @@ -28963,12 +28977,12 @@ class Tooltip { if (html) my.html(html); my.setPosition(event); my.show() - //this.ensureTooltipOnScreen(); + //this.ensureTooltipInsideContainer(); }; my.mousemove = function (event) { my.setPosition(event); - //this.ensureTooltipOnScreen(); + //this.ensureTooltipInsideContainer(); }; my.mouseout = function () { @@ -28988,27 +29002,33 @@ class Tooltip { } /** - * @function ensureTooltipOnScreen - * @description Prevents the tooltip from overflowing off screen + * @function ensureTooltipInsideContainer + * @description Prevents the tooltip from overflowing out of the App container (ensures that the tooltip is inside the gridviz container) + * @param {MouseEvent} event */ - /*my.ensureTooltipOnScreen = function () { - // TODO: parent needs to be the all-encompassing container, not the map SVG id otherwise it just uses the last SVG which will be an inset SVG. - let parent = document.getElementById(config.parentContainerId); - let bbox = parent.getBBox(); - let parentWidth = bbox.width; - let parentHeight = bbox.height; - let node = tooltip.node(); - //too far right - if (node.offsetLeft > parentWidth - node.clientWidth) { - node.style.left = node.offsetLeft - (node.clientWidth + config.xOffset * 2) + "px"; - - } - //too far down - if (node.offsetTop + node.clientHeight > parentHeight) { - node.style.top = node.offsetTop - (node.clientHeight + config.yOffset * 2) + "px"; - } - - }*/ + ensureTooltipInsideContainer = function (event) { + let node = this.tooltip.node() + let rect = this.parentElement.getBoundingClientRect() + let parentWidth = rect.width + let parentHeight = rect.height + + //too far right + if (node.offsetLeft > rect.left + parentWidth - node.clientWidth) { + let left = event.x - node.clientWidth - this.xOffset + node.style.left = left + 'px' + // check if mouse covers tooltip + if (node.offsetLeft + node.clientWidth > event.x) { + //move tooltip left so it doesnt cover mouse + let left2 = event.x - (node.clientWidth + this.xOffset) + node.style.left = left2 + 'px' + } + } + + //too far down + if (node.offsetTop + node.clientHeight > rect.top + parentHeight) { + node.style.top = node.offsetTop - node.clientHeight + 'px' + } + } } @@ -34405,4 +34425,4 @@ const getParameterByName = _GeoCanvas_js__WEBPACK_IMPORTED_MODULE_1__.GeoCanvas. /******/ })() ; }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHZpei5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTzs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHVCQUF1QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBZSxvQ0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVlO0FBQ2Y7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUjJDO0FBQ3dEO0FBQ3JFO0FBQ3ZCO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0Esa0JBQWtCLDZEQUFtQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsZUFBZTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3Qyw4QkFBOEI7QUFDdEU7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiw2REFBbUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0RBQVUsTUFBTTtBQUNsQyxpREFBaUQsa0RBQVU7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGVBQWU7QUFDdkMsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsK0JBQStCO0FBQzlDO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0EsdURBQXVELG9EQUFZO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLHlCQUF5QjtBQUN6RDtBQUNBO0FBQ0EsNkJBQTZCLG9EQUFZLEVBQUUsU0FBUyxLQUFLLG9EQUFZO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsMERBQWtCO0FBQ2hFO0FBQ0E7QUFDQSxxQ0FBcUMsa0RBQVU7QUFDL0MsZ0JBQWdCLDhEQUFzQjtBQUN0QywwQ0FBMEMsOERBQXNCO0FBQ2hFO0FBQ0Esb0JBQW9CLDhEQUFzQjtBQUMxQztBQUNBLHlCQUF5Qiw4REFBc0IsTUFBTSxRQUFRO0FBQzdEO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxrREFBVTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrREFBVTtBQUM1QixxREFBcUQ7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRSxpQkFBaUI7QUFDdkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsOENBQVc7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQywwQ0FBMEM7QUFDM0M7QUFDQSxVQUFVO0FBQ1Y7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLENBQUMsOEJBQThCO0FBQy9CO0FBQ0EsVUFBVTtBQUNWO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsOEJBQThCO0FBQy9CO0FBQ0EsVUFBVTtBQUNWO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxDQUFDLDRCQUE0QjtBQUM3QjtBQUNBLFVBQVU7QUFDVjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsNEJBQTRCO0FBQzdCO0FBQ0EsVUFBVTtBQUNWO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsb0NBQW9DO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsc0NBQXNDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLFFBQVE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLFFBQVE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbElBO0FBQzJDO0FBQ3BDO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsMkRBQThCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDM0NBO0FBQzJDO0FBQ3BDO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsMkRBQThCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7OztBQzNDQTtBQUMyQztBQUNDO0FBQ3JDO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsMkRBQThCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFLDBEQUFjO0FBQ2hGO0FBQ0E7QUFDQTtB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O0FBQ0EsdUNBQXVDLDJEQUE4QjtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDcENBO0FBQzJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QywyREFBOEI7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3BDQTtBQUMyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsMkRBQThCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwQ0E7QUFDMkM7QUFDcEM7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QywyREFBOEI7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7OztBQ2hDQTtBQUMyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFD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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUMsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0hBO0FBQzJDO0FBQ0w7QUFDTjtBQUNoQztBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLDJEQUE4QjtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyx5Q0FBRztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQywrQ0FBTTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyx5Q0FBRztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQywrQ0FBTTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsMkRBQThCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFLGdFQUFvQjtBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsZ0VBQW9CO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqRUE7QUFDMkM7QUFDQTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNPO0FBQ1A7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dkU7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGNBQWM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLGNBQWM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNBO0FBQ1A7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUN1QztBQUNFO0FBQ0Q7QUFDUztBQUNPO0FBQ0k7QUFDVTtBQUM5QjtBQUN4QztBQUNPLDhCQUE4QixpREFBTztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qix5REFBVztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLCtDQUFN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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0RBQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRWU7QUFDZjtBQUNBO0FBQ0E7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Q0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxRQUFRLG1EQUFxQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDJCQUEyQix1RUFBNEI7QUFDOUQ7QUFDQTtBQUNBLENBQStDO0FBQy9DLHNEQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ndml6L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9mc3VtLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21lcmdlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZmxhdGJ1ZmZlcnMvbWpzL2J1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9mbGF0YnVmZmVycy9tanMvYnl0ZS1idWZmZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9mbGF0YnVmZmVycy9tanMvY29uc3RhbnRzLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZmxhdGJ1ZmZlcnMvbWpzL2VuY29kaW5nLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZmxhdGJ1ZmZlcnMvbWpzL2ZsYXRidWZmZXJzLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZmxhdGJ1ZmZlcnMvbWpzL2xvbmcuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9mbGF0YnVmZmVycy9tanMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvYnVpbGRlci5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvYnVpbGRlci9iaW5hcnkubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2J1aWxkZXIvYm9vbC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvYnVpbGRlci9idWZmZXIubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2J1aWxkZXIvZGF0ZS5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvYnVpbGRlci9kZWNpbWFsLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9idWlsZGVyL2RpY3Rpb25hcnkubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2J1aWxkZXIvZml4ZWRzaXplYmluYXJ5Lm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9idWlsZGVyL2ZpeGVkc2l6ZWxpc3QubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2J1aWxkZXIvZmxvYXQubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2J1aWxkZXIvaW50Lm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9idWlsZGVyL2ludGVydmFsLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9idWlsZGVyL2xpc3QubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2J1aWxkZXIvbWFwLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9idWlsZGVyL251bGwubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2J1aWxkZXIvc3RydWN0Lm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9idWlsZGVyL3RpbWUubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2J1aWxkZXIvdGltZXN0YW1wLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9idWlsZGVyL3VuaW9uLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9idWlsZGVyL3V0ZjgubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2J1aWxkZXIvdmFsaWQubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2RhdGEubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2VudW0ubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZhY3Rvcmllcy5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvYmluYXJ5Lm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9ibG9jay5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvYm9keS1jb21wcmVzc2lvbi1tZXRob2QubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL2JvZHktY29tcHJlc3Npb24ubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL2Jvb2wubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL2J1ZmZlci5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvY29tcHJlc3Npb24tdHlwZS5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvZGF0ZS11bml0Lm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9kYXRlLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9kZWNpbWFsLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9kaWN0aW9uYXJ5LWJhdGNoLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9kaWN0aW9uYXJ5LWVuY29kaW5nLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9kaWN0aW9uYXJ5LWtpbmQubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL2R1cmF0aW9uLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9lbmRpYW5uZXNzLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9maWVsZC1ub2RlLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9maWVsZC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvZml4ZWQtc2l6ZS1iaW5hcnkubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL2ZpeGVkLXNpemUtbGlzdC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvZmxvYXRpbmctcG9pbnQubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL2Zvb3Rlci5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvaW50Lm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9pbnRlcnZhbC11bml0Lm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9pbnRlcnZhbC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIva2V5LXZhbHVlLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9sYXJnZS1iaW5hcnkubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL2xhcmdlLWxpc3QubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL2xhcmdlLXV0ZjgubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL2xpc3QubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL21hcC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvbWVzc2FnZS1oZWFkZXIubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL21lc3NhZ2UubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL21ldGFkYXRhLXZlcnNpb24ubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL251bGwubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL3ByZWNpc2lvbi5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvcmVjb3JkLWJhdGNoLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9zY2hlbWEubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL3NwYXJzZS1tYXRyaXgtY29tcHJlc3NlZC1heGlzLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9zcGFyc2UtbWF0cml4LWluZGV4LWMtcy14Lm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9zcGFyc2UtdGVuc29yLWluZGV4LWMtby1vLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9zcGFyc2UtdGVuc29yLWluZGV4LWMtcy1mLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9zcGFyc2UtdGVuc29yLWluZGV4Lm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9zcGFyc2UtdGVuc29yLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9zdHJ1Y3RfLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi90ZW5zb3ItZGltLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi90ZW5zb3IubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL3RpbWUtdW5pdC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvdGltZS5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvdGltZXN0YW1wLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi90eXBlLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi91bmlvbi1tb2RlLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi91bmlvbi5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvdXRmOC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvaW8vYWRhcHRlcnMubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2lvL2ZpbGUubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2lvL2ludGVyZmFjZXMubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2lvL3N0cmVhbS5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvaXBjL21lc3NhZ2UubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2lwYy9tZXRhZGF0YS9maWxlLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9pcGMvbWV0YWRhdGEvanNvbi5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvaXBjL21ldGFkYXRhL21lc3NhZ2UubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2lwYy9yZWFkZXIubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2lwYy9zZXJpYWxpemF0aW9uLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9pcGMvd3JpdGVyLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9yZWNvcmRiYXRjaC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvcm93L21hcC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvcm93L3N0cnVjdC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvc2NoZW1hLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy90YWJsZS5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvdHlwZS5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvdXRpbC9iaXQubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L3V0aWwvYm4ubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L3V0aWwvYnVmZmVyLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy91dGlsL2NodW5rLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy91dGlsL2NvbXBhdC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvdXRpbC9pbnQubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L3V0aWwvbWF0aC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvdXRpbC9wcmV0dHkubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L3V0aWwvcmVjb3JkYmF0Y2gubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L3V0aWwvdXRmOC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvdXRpbC92ZWN0b3IubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L3ZlY3Rvci5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvdmlzaXRvci5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvdmlzaXRvci9idWlsZGVyY3Rvci5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvdmlzaXRvci9ieXRlbGVuZ3RoLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy92aXNpdG9yL2dldC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvdmlzaXRvci9pbmRleG9mLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy92aXNpdG9yL2l0ZXJhdG9yLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy92aXNpdG9yL2pzb250eXBlYXNzZW1ibGVyLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy92aXNpdG9yL2pzb252ZWN0b3Jhc3NlbWJsZXIubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L3Zpc2l0b3Ivc2V0Lm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy92aXNpdG9yL3R5cGVhc3NlbWJsZXIubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L3Zpc2l0b3IvdHlwZWNvbXBhcmF0b3IubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L3Zpc2l0b3IvdmVjdG9yYXNzZW1ibGVyLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy92aXNpdG9yL3ZlY3RvcmxvYWRlci5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvY29sb3IuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvZGVmaW5lLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZGlzcGF0Y2gvc3JjL2Rpc3BhdGNoLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvbm9kcmFnLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvbm9ldmVudC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWRzdi9zcmMvY3N2LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZHN2L3NyYy9kc3YuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1kc3Yvc3JjL3Rzdi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2N1YmljLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZmV0Y2gvc3JjL2Rzdi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZldGNoL3NyYy9qc29uLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZmV0Y2gvc3JjL3RleHQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2RlZmF1bHRMb2NhbGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2V4cG9uZW50LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXREZWNpbWFsLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRHcm91cC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0TnVtZXJhbHMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFByZWZpeEF1dG8uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFJvdW5kZWQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFNwZWNpZmllci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0VHJpbS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0VHlwZXMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2lkZW50aXR5LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9sb2NhbGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2NhcnRlc2lhbi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvY2lyY2xlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9jbGlwL2FudGltZXJpZGlhbi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvY2xpcC9idWZmZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2NsaXAvY2lyY2xlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9jbGlwL2luZGV4LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9jbGlwL2xpbmUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2NsaXAvcmVjdGFuZ2xlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9jbGlwL3Jlam9pbi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvY29tcG9zZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2lkZW50aXR5LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9tYXRoLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9ub29wLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wYXRoL2JvdW5kcy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvcG9pbnRFcXVhbC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvcG9seWdvbkNvbnRhaW5zLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wcm9qZWN0aW9uL2F6aW11dGhhbC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvcHJvamVjdGlvbi9hemltdXRoYWxFcXVhbEFyZWEuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3Byb2plY3Rpb24vZml0LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wcm9qZWN0aW9uL2luZGV4LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wcm9qZWN0aW9uL3Jlc2FtcGxlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9yb3RhdGlvbi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvc3RyZWFtLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy90cmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvYmFzaXMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvYmFzaXNDbG9zZWQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29sb3IuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvbnVtYmVyLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3JnYi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2RlY29tcG9zZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy90cmFuc2Zvcm0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL3BhcnNlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3pvb20uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1yYW5kb20vc3JjL2RlZmF1bHRTb3VyY2UuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1yYW5kb20vc3JjL25vcm1hbC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvYXJyYXkuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NvbnN0YW50LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9jcmVhdG9yLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9tYXRjaGVyLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9uYW1lc3BhY2UuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL25hbWVzcGFjZXMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3BvaW50ZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2FwcGVuZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2F0dHIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9jYWxsLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2xhc3NlZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Nsb25lLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGF0YS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdHVtLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGlzcGF0Y2guanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lYWNoLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZW1wdHkuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lbnRlci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2V4aXQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9odG1sLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pbnNlcnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2pvaW4uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9sb3dlci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL21lcmdlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbm9kZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL25vZGVzLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vb24uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9vcmRlci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3Byb3BlcnR5LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vcmFpc2UuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yZW1vdmUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3QuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3RBbGwuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3RDaGlsZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdENoaWxkcmVuLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2l6ZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NvcnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zcGFyc2UuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3RleHQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3RvckFsbC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc291cmNlRXZlbnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3dpbmRvdy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRpbWVyL3NyYy90aW1lb3V0LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdGltZXIvc3JjL3RpbWVyLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvYWN0aXZlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9pbnRlcnJ1cHQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vaW50ZXJydXB0LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL3RyYW5zaXRpb24uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2F0dHIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2F0dHJUd2Vlbi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZGVsYXkuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2R1cmF0aW9uLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lYXNlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lYXNlVmFyeWluZy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZW5kLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2luZGV4LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9pbnRlcnBvbGF0ZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vbWVyZ2UuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL29uLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9yZW1vdmUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NjaGVkdWxlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zZWxlY3QuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdEFsbC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2VsZWN0aW9uLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc3R5bGVUd2Vlbi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdGV4dC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdGV4dFR3ZWVuLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90cmFuc2l0aW9uLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90d2Vlbi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL2NvbnN0YW50LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvZXZlbnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL25vZXZlbnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy90cmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy96b29tLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZmFzdC1rZGUvc3JjL2FjY2Vzc29yLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZmFzdC1rZGUvc3JjL2JpbjFkLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZmFzdC1rZGUvc3JjL2JpbjJkLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZmFzdC1rZGUvc3JjL2RlbnNpdHkxZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2Zhc3Qta2RlL3NyYy9kZW5zaXR5MmQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9mYXN0LWtkZS9zcmMvZGVyaWNoZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2Zhc3Qta2RlL3NyYy9leHRlbnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9mYXN0LWtkZS9zcmMvaGVhdG1hcC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2Zhc3Qta2RlL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2Zhc3Qta2RlL3NyYy9ucmQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9BcHAuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9CYWNrZ3JvdW5kTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9CYWNrZ3JvdW5kTGF5ZXJXTVMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9EYXRhc2V0LmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvRGF0YXNldENvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL0dlb0NhbnZhcy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL0xhYmVsTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9MYXllci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL0xlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL0xpbmVMYXllci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL1N0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvVG9vbHRpcC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL2RhdGFzZXQvQ1NWR3JpZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL2RhdGFzZXQvR3JpZFRpbGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9kYXRhc2V0L1RpbGVkR3JpZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL2xlZ2VuZC9Db2xvckNhdGVnb3J5TGVnZW5kLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvbGVnZW5kL0NvbG9yRGlzY3JldGVMZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9sZWdlbmQvQ29sb3JMZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9sZWdlbmQvU2VnbWVudE9yaWVudGF0aW9uTGVnZW5kLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvbGVnZW5kL1NlZ21lbnRXaWR0aExlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL2xlZ2VuZC9TaXplTGVnZW5kLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvQ29tcG9zaXRpb25TdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL0NvbnRvdXJTdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL0RvdERlbnNpdHlTdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL0pveVBsb3RTdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL0tlcm5lbFNtb290aGluZ1N0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvTGVnb1N0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvTW9zYWljU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9OaW5qYVN0YXJTdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL1BpbGxhclN0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvU2VnbWVudFN0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvU2hhcGVDb2xvclNpemVTdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL1NpZGVDYXRTdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL1NpZGVTdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL1NxdWFyZUNvbG9yQ2F0V0dMU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9TcXVhcmVDb2xvcldHTFN0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvU3Ryb2tlU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9UYW5ha2FTdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL1RleHRTdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3V0aWxzL1V0aWxzLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3V0aWxzL1dlYkdMU3F1YXJlQ29sb3JpbmdBZHZhbmNlZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3V0aWxzL1dlYkdMU3F1YXJlQ29sb3JpbmdDYXRBZHZhbmNlZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3V0aWxzL3N0cmV0Y2hpbmcuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy91dGlscy93ZWJHTFV0aWxzLmpzIiwid2VicGFjazovL2d2aXovd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vZ3Zpei93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vZ3Zpei93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL2d2aXovd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImd2aXpcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiZ3ZpelwiXSA9IGZhY3RvcnkoKTtcbn0pKHNlbGYsICgpID0+IHtcbnJldHVybiAiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vcHl0aG9uL2NweXRob24vYmxvYi9hNzRlZWEyMzhmNWJhYmExNTc5N2UyZThiNTcwZDE1M2JjODY5MGE3L01vZHVsZXMvbWF0aG1vZHVsZS5jI0wxNDIzXG5leHBvcnQgY2xhc3MgQWRkZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9wYXJ0aWFscyA9IG5ldyBGbG9hdDY0QXJyYXkoMzIpO1xuICAgIHRoaXMuX24gPSAwO1xuICB9XG4gIGFkZCh4KSB7XG4gICAgY29uc3QgcCA9IHRoaXMuX3BhcnRpYWxzO1xuICAgIGxldCBpID0gMDtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuX24gJiYgaiA8IDMyOyBqKyspIHtcbiAgICAgIGNvbnN0IHkgPSBwW2pdLFxuICAgICAgICBoaSA9IHggKyB5LFxuICAgICAgICBsbyA9IE1hdGguYWJzKHgpIDwgTWF0aC5hYnMoeSkgPyB4IC0gKGhpIC0geSkgOiB5IC0gKGhpIC0geCk7XG4gICAgICBpZiAobG8pIHBbaSsrXSA9IGxvO1xuICAgICAgeCA9IGhpO1xuICAgIH1cbiAgICBwW2ldID0geDtcbiAgICB0aGlzLl9uID0gaSArIDE7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdmFsdWVPZigpIHtcbiAgICBjb25zdCBwID0gdGhpcy5fcGFydGlhbHM7XG4gICAgbGV0IG4gPSB0aGlzLl9uLCB4LCB5LCBsbywgaGkgPSAwO1xuICAgIGlmIChuID4gMCkge1xuICAgICAgaGkgPSBwWy0tbl07XG4gICAgICB3aGlsZSAobiA+IDApIHtcbiAgICAgICAgeCA9IGhpO1xuICAgICAgICB5ID0gcFstLW5dO1xuICAgICAgICBoaSA9IHggKyB5O1xuICAgICAgICBsbyA9IHkgLSAoaGkgLSB4KTtcbiAgICAgICAgaWYgKGxvKSBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChuID4gMCAmJiAoKGxvIDwgMCAmJiBwW24gLSAxXSA8IDApIHx8IChsbyA+IDAgJiYgcFtuIC0gMV0gPiAwKSkpIHtcbiAgICAgICAgeSA9IGxvICogMjtcbiAgICAgICAgeCA9IGhpICsgeTtcbiAgICAgICAgaWYgKHkgPT0geCAtIGhpKSBoaSA9IHg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoaTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgY29uc3QgYWRkZXIgPSBuZXcgQWRkZXIoKTtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlID0gK3ZhbHVlKSB7XG4gICAgICAgIGFkZGVyLmFkZCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlID0gK3ZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpIHtcbiAgICAgICAgYWRkZXIuYWRkKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuICthZGRlcjtcbn1cbiIsImZ1bmN0aW9uKiBmbGF0dGVuKGFycmF5cykge1xuICBmb3IgKGNvbnN0IGFycmF5IG9mIGFycmF5cykge1xuICAgIHlpZWxkKiBhcnJheTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZShhcnJheXMpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20oZmxhdHRlbihhcnJheXMpKTtcbn1cbiIsImltcG9ydCB7IEJ5dGVCdWZmZXIgfSBmcm9tIFwiLi9ieXRlLWJ1ZmZlclwiO1xyXG5pbXBvcnQgeyBTSVpFT0ZfU0hPUlQsIFNJWkVfUFJFRklYX0xFTkdUSCwgU0laRU9GX0lOVCwgRklMRV9JREVOVElGSUVSX0xFTkdUSCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgeyBMb25nIH0gZnJvbSBcIi4vbG9uZ1wiO1xyXG5leHBvcnQgY2xhc3MgQnVpbGRlciB7XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBhIEZsYXRCdWZmZXJCdWlsZGVyLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRfaW5pdGlhbF9zaXplKSB7XHJcbiAgICAgICAgLyoqIE1pbmltdW0gYWxpZ25tZW50IGVuY291bnRlcmVkIHNvIGZhci4gKi9cclxuICAgICAgICB0aGlzLm1pbmFsaWduID0gMTtcclxuICAgICAgICAvKiogVGhlIHZ0YWJsZSBmb3IgdGhlIGN1cnJlbnQgdGFibGUuICovXHJcbiAgICAgICAgdGhpcy52dGFibGUgPSBudWxsO1xyXG4gICAgICAgIC8qKiBUaGUgYW1vdW50IG9mIGZpZWxkcyB3ZSdyZSBhY3R1YWxseSB1c2luZy4gKi9cclxuICAgICAgICB0aGlzLnZ0YWJsZV9pbl91c2UgPSAwO1xyXG4gICAgICAgIC8qKiBXaGV0aGVyIHdlIGFyZSBjdXJyZW50bHkgc2VyaWFsaXppbmcgYSB0YWJsZS4gKi9cclxuICAgICAgICB0aGlzLmlzTmVzdGVkID0gZmFsc2U7XHJcbiAgICAgICAgLyoqIFN0YXJ0aW5nIG9mZnNldCBvZiB0aGUgY3VycmVudCBzdHJ1Y3QvdGFibGUuICovXHJcbiAgICAgICAgdGhpcy5vYmplY3Rfc3RhcnQgPSAwO1xyXG4gICAgICAgIC8qKiBMaXN0IG9mIG9mZnNldHMgb2YgYWxsIHZ0YWJsZXMuICovXHJcbiAgICAgICAgdGhpcy52dGFibGVzID0gW107XHJcbiAgICAgICAgLyoqIEZvciB0aGUgY3VycmVudCB2ZWN0b3IgYmVpbmcgYnVpbHQuICovXHJcbiAgICAgICAgdGhpcy52ZWN0b3JfbnVtX2VsZW1zID0gMDtcclxuICAgICAgICAvKiogRmFsc2Ugb21pdHMgZGVmYXVsdCB2YWx1ZXMgZnJvbSB0aGUgc2VyaWFsaXplZCBkYXRhICovXHJcbiAgICAgICAgdGhpcy5mb3JjZV9kZWZhdWx0cyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc3RyaW5nX21hcHMgPSBudWxsO1xyXG4gICAgICAgIGxldCBpbml0aWFsX3NpemU7XHJcbiAgICAgICAgaWYgKCFvcHRfaW5pdGlhbF9zaXplKSB7XHJcbiAgICAgICAgICAgIGluaXRpYWxfc2l6ZSA9IDEwMjQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpbml0aWFsX3NpemUgPSBvcHRfaW5pdGlhbF9zaXplO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAdHlwZSB7Qnl0ZUJ1ZmZlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYmIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGluaXRpYWxfc2l6ZSk7XHJcbiAgICAgICAgdGhpcy5zcGFjZSA9IGluaXRpYWxfc2l6ZTtcclxuICAgIH1cclxuICAgIGNsZWFyKCkge1xyXG4gICAgICAgIHRoaXMuYmIuY2xlYXIoKTtcclxuICAgICAgICB0aGlzLnNwYWNlID0gdGhpcy5iYi5jYXBhY2l0eSgpO1xyXG4gICAgICAgIHRoaXMubWluYWxpZ24gPSAxO1xyXG4gICAgICAgIHRoaXMudnRhYmxlID0gbnVsbDtcclxuICAgICAgICB0aGlzLnZ0YWJsZV9pbl91c2UgPSAwO1xyXG4gICAgICAgIHRoaXMuaXNOZXN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm9iamVjdF9zdGFydCA9IDA7XHJcbiAgICAgICAgdGhpcy52dGFibGVzID0gW107XHJcbiAgICAgICAgdGhpcy52ZWN0b3JfbnVtX2VsZW1zID0gMDtcclxuICAgICAgICB0aGlzLmZvcmNlX2RlZmF1bHRzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zdHJpbmdfbWFwcyA9IG51bGw7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEluIG9yZGVyIHRvIHNhdmUgc3BhY2UsIGZpZWxkcyB0aGF0IGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZVxyXG4gICAgICogZG9uJ3QgZ2V0IHNlcmlhbGl6ZWQgaW50byB0aGUgYnVmZmVyLiBGb3JjaW5nIGRlZmF1bHRzIHByb3ZpZGVzIGFcclxuICAgICAqIHdheSB0byBtYW51YWxseSBkaXNhYmxlIHRoaXMgb3B0aW1pemF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBmb3JjZURlZmF1bHRzIHRydWUgYWx3YXlzIHNlcmlhbGl6ZXMgZGVmYXVsdCB2YWx1ZXNcclxuICAgICAqL1xyXG4gICAgZm9yY2VEZWZhdWx0cyhmb3JjZURlZmF1bHRzKSB7XHJcbiAgICAgICAgdGhpcy5mb3JjZV9kZWZhdWx0cyA9IGZvcmNlRGVmYXVsdHM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgQnl0ZUJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIEZsYXRCdWZmZXIuIE9ubHkgY2FsbCB0aGlzIGFmdGVyIHlvdSd2ZVxyXG4gICAgICogY2FsbGVkIGZpbmlzaCgpLiBUaGUgYWN0dWFsIGRhdGEgc3RhcnRzIGF0IHRoZSBCeXRlQnVmZmVyJ3MgY3VycmVudCBwb3NpdGlvbixcclxuICAgICAqIG5vdCBuZWNlc3NhcmlseSBhdCAwLlxyXG4gICAgICovXHJcbiAgICBkYXRhQnVmZmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJiO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgRmxhdEJ1ZmZlci4gT25seSBjYWxsIHRoaXMgYWZ0ZXIgeW91J3ZlXHJcbiAgICAgKiBjYWxsZWQgZmluaXNoKCkuXHJcbiAgICAgKi9cclxuICAgIGFzVWludDhBcnJheSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5iYi5ieXRlcygpLnN1YmFycmF5KHRoaXMuYmIucG9zaXRpb24oKSwgdGhpcy5iYi5wb3NpdGlvbigpICsgdGhpcy5vZmZzZXQoKSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFByZXBhcmUgdG8gd3JpdGUgYW4gZWxlbWVudCBvZiBgc2l6ZWAgYWZ0ZXIgYGFkZGl0aW9uYWxfYnl0ZXNgIGhhdmUgYmVlblxyXG4gICAgICogd3JpdHRlbiwgZS5nLiBpZiB5b3Ugd3JpdGUgYSBzdHJpbmcsIHlvdSBuZWVkIHRvIGFsaWduIHN1Y2ggdGhlIGludCBsZW5ndGhcclxuICAgICAqIGZpZWxkIGlzIGFsaWduZWQgdG8gNCBieXRlcywgYW5kIHRoZSBzdHJpbmcgZGF0YSBmb2xsb3dzIGl0IGRpcmVjdGx5LiBJZiBhbGxcclxuICAgICAqIHlvdSBuZWVkIHRvIGRvIGlzIGFsaWdubWVudCwgYGFkZGl0aW9uYWxfYnl0ZXNgIHdpbGwgYmUgMC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gc2l6ZSBUaGlzIGlzIHRoZSBvZiB0aGUgbmV3IGVsZW1lbnQgdG8gd3JpdGVcclxuICAgICAqIEBwYXJhbSBhZGRpdGlvbmFsX2J5dGVzIFRoZSBwYWRkaW5nIHNpemVcclxuICAgICAqL1xyXG4gICAgcHJlcChzaXplLCBhZGRpdGlvbmFsX2J5dGVzKSB7XHJcbiAgICAgICAgLy8gVHJhY2sgdGhlIGJpZ2dlc3QgdGhpbmcgd2UndmUgZXZlciBhbGlnbmVkIHRvLlxyXG4gICAgICAgIGlmIChzaXplID4gdGhpcy5taW5hbGlnbikge1xyXG4gICAgICAgICAgICB0aGlzLm1pbmFsaWduID0gc2l6ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRmluZCB0aGUgYW1vdW50IG9mIGFsaWdubWVudCBuZWVkZWQgc3VjaCB0aGF0IGBzaXplYCBpcyBwcm9wZXJseVxyXG4gICAgICAgIC8vIGFsaWduZWQgYWZ0ZXIgYGFkZGl0aW9uYWxfYnl0ZXNgXHJcbiAgICAgICAgY29uc3QgYWxpZ25fc2l6ZSA9ICgofih0aGlzLmJiLmNhcGFjaXR5KCkgLSB0aGlzLnNwYWNlICsgYWRkaXRpb25hbF9ieXRlcykpICsgMSkgJiAoc2l6ZSAtIDEpO1xyXG4gICAgICAgIC8vIFJlYWxsb2NhdGUgdGhlIGJ1ZmZlciBpZiBuZWVkZWQuXHJcbiAgICAgICAgd2hpbGUgKHRoaXMuc3BhY2UgPCBhbGlnbl9zaXplICsgc2l6ZSArIGFkZGl0aW9uYWxfYnl0ZXMpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2xkX2J1Zl9zaXplID0gdGhpcy5iYi5jYXBhY2l0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmJiID0gQnVpbGRlci5ncm93Qnl0ZUJ1ZmZlcih0aGlzLmJiKTtcclxuICAgICAgICAgICAgdGhpcy5zcGFjZSArPSB0aGlzLmJiLmNhcGFjaXR5KCkgLSBvbGRfYnVmX3NpemU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucGFkKGFsaWduX3NpemUpO1xyXG4gICAgfVxyXG4gICAgcGFkKGJ5dGVfc2l6ZSkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZV9zaXplOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5iYi53cml0ZUludDgoLS10aGlzLnNwYWNlLCAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB3cml0ZUludDgodmFsdWUpIHtcclxuICAgICAgICB0aGlzLmJiLndyaXRlSW50OCh0aGlzLnNwYWNlIC09IDEsIHZhbHVlKTtcclxuICAgIH1cclxuICAgIHdyaXRlSW50MTYodmFsdWUpIHtcclxuICAgICAgICB0aGlzLmJiLndyaXRlSW50MTYodGhpcy5zcGFjZSAtPSAyLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICB3cml0ZUludDMyKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5iYi53cml0ZUludDMyKHRoaXMuc3BhY2UgLT0gNCwgdmFsdWUpO1xyXG4gICAgfVxyXG4gICAgd3JpdGVJbnQ2NCh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuYmIud3JpdGVJbnQ2NCh0aGlzLnNwYWNlIC09IDgsIHZhbHVlKTtcclxuICAgIH1cclxuICAgIHdyaXRlRmxvYXQzMih2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuYmIud3JpdGVGbG9hdDMyKHRoaXMuc3BhY2UgLT0gNCwgdmFsdWUpO1xyXG4gICAgfVxyXG4gICAgd3JpdGVGbG9hdDY0KHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5iYi53cml0ZUZsb2F0NjQodGhpcy5zcGFjZSAtPSA4LCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhbiBgaW50OGAgdG8gdGhlIGJ1ZmZlciwgcHJvcGVybHkgYWxpZ25lZCwgYW5kIGdyb3dzIHRoZSBidWZmZXIgKGlmIG5lY2Vzc2FyeSkuXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGBpbnQ4YCB0byBhZGQgdGhlIHRoZSBidWZmZXIuXHJcbiAgICAgKi9cclxuICAgIGFkZEludDgodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnByZXAoMSwgMCk7XHJcbiAgICAgICAgdGhpcy53cml0ZUludDgodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYW4gYGludDE2YCB0byB0aGUgYnVmZmVyLCBwcm9wZXJseSBhbGlnbmVkLCBhbmQgZ3Jvd3MgdGhlIGJ1ZmZlciAoaWYgbmVjZXNzYXJ5KS5cclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgYGludDE2YCB0byBhZGQgdGhlIHRoZSBidWZmZXIuXHJcbiAgICAgKi9cclxuICAgIGFkZEludDE2KHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5wcmVwKDIsIDApO1xyXG4gICAgICAgIHRoaXMud3JpdGVJbnQxNih2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhbiBgaW50MzJgIHRvIHRoZSBidWZmZXIsIHByb3Blcmx5IGFsaWduZWQsIGFuZCBncm93cyB0aGUgYnVmZmVyIChpZiBuZWNlc3NhcnkpLlxyXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSBgaW50MzJgIHRvIGFkZCB0aGUgdGhlIGJ1ZmZlci5cclxuICAgICAqL1xyXG4gICAgYWRkSW50MzIodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnByZXAoNCwgMCk7XHJcbiAgICAgICAgdGhpcy53cml0ZUludDMyKHZhbHVlKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQWRkIGFuIGBpbnQ2NGAgdG8gdGhlIGJ1ZmZlciwgcHJvcGVybHkgYWxpZ25lZCwgYW5kIGdyb3dzIHRoZSBidWZmZXIgKGlmIG5lY2Vzc2FyeSkuXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGBpbnQ2NGAgdG8gYWRkIHRoZSB0aGUgYnVmZmVyLlxyXG4gICAgICovXHJcbiAgICBhZGRJbnQ2NCh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMucHJlcCg4LCAwKTtcclxuICAgICAgICB0aGlzLndyaXRlSW50NjQodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYSBgZmxvYXQzMmAgdG8gdGhlIGJ1ZmZlciwgcHJvcGVybHkgYWxpZ25lZCwgYW5kIGdyb3dzIHRoZSBidWZmZXIgKGlmIG5lY2Vzc2FyeSkuXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGBmbG9hdDMyYCB0byBhZGQgdGhlIHRoZSBidWZmZXIuXHJcbiAgICAgKi9cclxuICAgIGFkZEZsb2F0MzIodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnByZXAoNCwgMCk7XHJcbiAgICAgICAgdGhpcy53cml0ZUZsb2F0MzIodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYSBgZmxvYXQ2NGAgdG8gdGhlIGJ1ZmZlciwgcHJvcGVybHkgYWxpZ25lZCwgYW5kIGdyb3dzIHRoZSBidWZmZXIgKGlmIG5lY2Vzc2FyeSkuXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGBmbG9hdDY0YCB0byBhZGQgdGhlIHRoZSBidWZmZXIuXHJcbiAgICAgKi9cclxuICAgIGFkZEZsb2F0NjQodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnByZXAoOCwgMCk7XHJcbiAgICAgICAgdGhpcy53cml0ZUZsb2F0NjQodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgYWRkRmllbGRJbnQ4KHZvZmZzZXQsIHZhbHVlLCBkZWZhdWx0VmFsdWUpIHtcclxuICAgICAgICBpZiAodGhpcy5mb3JjZV9kZWZhdWx0cyB8fCB2YWx1ZSAhPSBkZWZhdWx0VmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRJbnQ4KHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5zbG90KHZvZmZzZXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFkZEZpZWxkSW50MTYodm9mZnNldCwgdmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xyXG4gICAgICAgIGlmICh0aGlzLmZvcmNlX2RlZmF1bHRzIHx8IHZhbHVlICE9IGRlZmF1bHRWYWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZEludDE2KHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5zbG90KHZvZmZzZXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFkZEZpZWxkSW50MzIodm9mZnNldCwgdmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xyXG4gICAgICAgIGlmICh0aGlzLmZvcmNlX2RlZmF1bHRzIHx8IHZhbHVlICE9IGRlZmF1bHRWYWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZEludDMyKHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5zbG90KHZvZmZzZXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFkZEZpZWxkSW50NjQodm9mZnNldCwgdmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xyXG4gICAgICAgIGlmICh0aGlzLmZvcmNlX2RlZmF1bHRzIHx8ICF2YWx1ZS5lcXVhbHMoZGVmYXVsdFZhbHVlKSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZEludDY0KHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5zbG90KHZvZmZzZXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFkZEZpZWxkRmxvYXQzMih2b2Zmc2V0LCB2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZm9yY2VfZGVmYXVsdHMgfHwgdmFsdWUgIT0gZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkRmxvYXQzMih2YWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2xvdCh2b2Zmc2V0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhZGRGaWVsZEZsb2F0NjQodm9mZnNldCwgdmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xyXG4gICAgICAgIGlmICh0aGlzLmZvcmNlX2RlZmF1bHRzIHx8IHZhbHVlICE9IGRlZmF1bHRWYWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZEZsb2F0NjQodmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLnNsb3Qodm9mZnNldCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYWRkRmllbGRPZmZzZXQodm9mZnNldCwgdmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xyXG4gICAgICAgIGlmICh0aGlzLmZvcmNlX2RlZmF1bHRzIHx8IHZhbHVlICE9IGRlZmF1bHRWYWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZE9mZnNldCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2xvdCh2b2Zmc2V0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFN0cnVjdHMgYXJlIHN0b3JlZCBpbmxpbmUsIHNvIG5vdGhpbmcgYWRkaXRpb25hbCBpcyBiZWluZyBhZGRlZC4gYGRgIGlzIGFsd2F5cyAwLlxyXG4gICAgICovXHJcbiAgICBhZGRGaWVsZFN0cnVjdCh2b2Zmc2V0LCB2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlICE9IGRlZmF1bHRWYWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLm5lc3RlZCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2xvdCh2b2Zmc2V0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFN0cnVjdHVyZXMgYXJlIGFsd2F5cyBzdG9yZWQgaW5saW5lLCB0aGV5IG5lZWQgdG8gYmUgY3JlYXRlZCByaWdodFxyXG4gICAgICogd2hlcmUgdGhleSdyZSB1c2VkLiAgWW91J2xsIGdldCB0aGlzIGFzc2VydGlvbiBmYWlsdXJlIGlmIHlvdVxyXG4gICAgICogY3JlYXRlZCBpdCBlbHNld2hlcmUuXHJcbiAgICAgKi9cclxuICAgIG5lc3RlZChvYmopIHtcclxuICAgICAgICBpZiAob2JqICE9IHRoaXMub2Zmc2V0KCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbGF0QnVmZmVyczogc3RydWN0IG11c3QgYmUgc2VyaWFsaXplZCBpbmxpbmUuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG91bGQgbm90IGJlIGNyZWF0aW5nIGFueSBvdGhlciBvYmplY3QsIHN0cmluZyBvciB2ZWN0b3JcclxuICAgICAqIHdoaWxlIGFuIG9iamVjdCBpcyBiZWluZyBjb25zdHJ1Y3RlZFxyXG4gICAgICovXHJcbiAgICBub3ROZXN0ZWQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNOZXN0ZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbGF0QnVmZmVyczogb2JqZWN0IHNlcmlhbGl6YXRpb24gbXVzdCBub3QgYmUgbmVzdGVkLicpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBjdXJyZW50IHZ0YWJsZSBhdCBgdm9mZnNldGAgdG8gdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIGJ1ZmZlci5cclxuICAgICAqL1xyXG4gICAgc2xvdCh2b2Zmc2V0KSB7XHJcbiAgICAgICAgaWYgKHRoaXMudnRhYmxlICE9PSBudWxsKVxyXG4gICAgICAgICAgICB0aGlzLnZ0YWJsZVt2b2Zmc2V0XSA9IHRoaXMub2Zmc2V0KCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEByZXR1cm5zIE9mZnNldCByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuXHJcbiAgICAgKi9cclxuICAgIG9mZnNldCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5iYi5jYXBhY2l0eSgpIC0gdGhpcy5zcGFjZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRG91YmxlcyB0aGUgc2l6ZSBvZiB0aGUgYmFja2luZyBCeXRlQnVmZmVyIGFuZCBjb3BpZXMgdGhlIG9sZCBkYXRhIHRvd2FyZHNcclxuICAgICAqIHRoZSBlbmQgb2YgdGhlIG5ldyBidWZmZXIgKHNpbmNlIHdlIGJ1aWxkIHRoZSBidWZmZXIgYmFja3dhcmRzKS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gYmIgVGhlIGN1cnJlbnQgYnVmZmVyIHdpdGggdGhlIGV4aXN0aW5nIGRhdGFcclxuICAgICAqIEByZXR1cm5zIEEgbmV3IGJ5dGUgYnVmZmVyIHdpdGggdGhlIG9sZCBkYXRhIGNvcGllZFxyXG4gICAgICogdG8gaXQuIFRoZSBkYXRhIGlzIGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLlxyXG4gICAgICpcclxuICAgICAqIHVpbnQ4QXJyYXkuc2V0KCkgZm9ybWFsbHkgdGFrZXMge0FycmF5PG51bWJlcj58QXJyYXlCdWZmZXJWaWV3fSwgc28gdG8gcGFzc1xyXG4gICAgICogaXQgYSB1aW50OEFycmF5IHdlIG5lZWQgdG8gc3VwcHJlc3MgdGhlIHR5cGUgY2hlY2s6XHJcbiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXN9XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBncm93Qnl0ZUJ1ZmZlcihiYikge1xyXG4gICAgICAgIGNvbnN0IG9sZF9idWZfc2l6ZSA9IGJiLmNhcGFjaXR5KCk7XHJcbiAgICAgICAgLy8gRW5zdXJlIHdlIGRvbid0IGdyb3cgYmV5b25kIHdoYXQgZml0cyBpbiBhbiBpbnQuXHJcbiAgICAgICAgaWYgKG9sZF9idWZfc2l6ZSAmIDB4QzAwMDAwMDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbGF0QnVmZmVyczogY2Fubm90IGdyb3cgYnVmZmVyIGJleW9uZCAyIGdpZ2FieXRlcy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV3X2J1Zl9zaXplID0gb2xkX2J1Zl9zaXplIDw8IDE7XHJcbiAgICAgICAgY29uc3QgbmJiID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShuZXdfYnVmX3NpemUpO1xyXG4gICAgICAgIG5iYi5zZXRQb3NpdGlvbihuZXdfYnVmX3NpemUgLSBvbGRfYnVmX3NpemUpO1xyXG4gICAgICAgIG5iYi5ieXRlcygpLnNldChiYi5ieXRlcygpLCBuZXdfYnVmX3NpemUgLSBvbGRfYnVmX3NpemUpO1xyXG4gICAgICAgIHJldHVybiBuYmI7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgb24gb2Zmc2V0LCByZWxhdGl2ZSB0byB3aGVyZSBpdCB3aWxsIGJlIHdyaXR0ZW4uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IHRvIGFkZC5cclxuICAgICAqL1xyXG4gICAgYWRkT2Zmc2V0KG9mZnNldCkge1xyXG4gICAgICAgIHRoaXMucHJlcChTSVpFT0ZfSU5ULCAwKTsgLy8gRW5zdXJlIGFsaWdubWVudCBpcyBhbHJlYWR5IGRvbmUuXHJcbiAgICAgICAgdGhpcy53cml0ZUludDMyKHRoaXMub2Zmc2V0KCkgLSBvZmZzZXQgKyBTSVpFT0ZfSU5UKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU3RhcnQgZW5jb2RpbmcgYSBuZXcgb2JqZWN0IGluIHRoZSBidWZmZXIuICBVc2VycyB3aWxsIG5vdCB1c3VhbGx5IG5lZWQgdG9cclxuICAgICAqIGNhbGwgdGhpcyBkaXJlY3RseS4gVGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyIHdpbGwgZ2VuZXJhdGUgaGVscGVyIG1ldGhvZHNcclxuICAgICAqIHRoYXQgY2FsbCB0aGlzIG1ldGhvZCBpbnRlcm5hbGx5LlxyXG4gICAgICovXHJcbiAgICBzdGFydE9iamVjdChudW1maWVsZHMpIHtcclxuICAgICAgICB0aGlzLm5vdE5lc3RlZCgpO1xyXG4gICAgICAgIGlmICh0aGlzLnZ0YWJsZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMudnRhYmxlID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudnRhYmxlX2luX3VzZSA9IG51bWZpZWxkcztcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWZpZWxkczsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMudnRhYmxlW2ldID0gMDsgLy8gVGhpcyB3aWxsIHB1c2ggYWRkaXRpb25hbCBlbGVtZW50cyBhcyBuZWVkZWRcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc05lc3RlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5vYmplY3Rfc3RhcnQgPSB0aGlzLm9mZnNldCgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5pc2ggb2ZmIHdyaXRpbmcgdGhlIG9iamVjdCB0aGF0IGlzIHVuZGVyIGNvbnN0cnVjdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgb2Zmc2V0IHRvIHRoZSBvYmplY3QgaW5zaWRlIGBkYXRhQnVmZmVyYFxyXG4gICAgICovXHJcbiAgICBlbmRPYmplY3QoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudnRhYmxlID09IG51bGwgfHwgIXRoaXMuaXNOZXN0ZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbGF0QnVmZmVyczogZW5kT2JqZWN0IGNhbGxlZCB3aXRob3V0IHN0YXJ0T2JqZWN0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWRkSW50MzIoMCk7XHJcbiAgICAgICAgY29uc3QgdnRhYmxlbG9jID0gdGhpcy5vZmZzZXQoKTtcclxuICAgICAgICAvLyBUcmltIHRyYWlsaW5nIHplcm9lcy5cclxuICAgICAgICBsZXQgaSA9IHRoaXMudnRhYmxlX2luX3VzZSAtIDE7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XHJcbiAgICAgICAgZm9yICg7IGkgPj0gMCAmJiB0aGlzLnZ0YWJsZVtpXSA9PSAwOyBpLS0pIHsgfVxyXG4gICAgICAgIGNvbnN0IHRyaW1tZWRfc2l6ZSA9IGkgKyAxO1xyXG4gICAgICAgIC8vIFdyaXRlIG91dCB0aGUgY3VycmVudCB2dGFibGUuXHJcbiAgICAgICAgZm9yICg7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgIC8vIE9mZnNldCByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHRhYmxlLlxyXG4gICAgICAgICAgICB0aGlzLmFkZEludDE2KHRoaXMudnRhYmxlW2ldICE9IDAgPyB2dGFibGVsb2MgLSB0aGlzLnZ0YWJsZVtpXSA6IDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzdGFuZGFyZF9maWVsZHMgPSAyOyAvLyBUaGUgZmllbGRzIGJlbG93OlxyXG4gICAgICAgIHRoaXMuYWRkSW50MTYodnRhYmxlbG9jIC0gdGhpcy5vYmplY3Rfc3RhcnQpO1xyXG4gICAgICAgIGNvbnN0IGxlbiA9ICh0cmltbWVkX3NpemUgKyBzdGFuZGFyZF9maWVsZHMpICogU0laRU9GX1NIT1JUO1xyXG4gICAgICAgIHRoaXMuYWRkSW50MTYobGVuKTtcclxuICAgICAgICAvLyBTZWFyY2ggZm9yIGFuIGV4aXN0aW5nIHZ0YWJsZSB0aGF0IG1hdGNoZXMgdGhlIGN1cnJlbnQgb25lLlxyXG4gICAgICAgIGxldCBleGlzdGluZ192dGFibGUgPSAwO1xyXG4gICAgICAgIGNvbnN0IHZ0MSA9IHRoaXMuc3BhY2U7XHJcbiAgICAgICAgb3V0ZXJfbG9vcDogZm9yIChpID0gMDsgaSA8IHRoaXMudnRhYmxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCB2dDIgPSB0aGlzLmJiLmNhcGFjaXR5KCkgLSB0aGlzLnZ0YWJsZXNbaV07XHJcbiAgICAgICAgICAgIGlmIChsZW4gPT0gdGhpcy5iYi5yZWFkSW50MTYodnQyKSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IFNJWkVPRl9TSE9SVDsgaiA8IGxlbjsgaiArPSBTSVpFT0ZfU0hPUlQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5iYi5yZWFkSW50MTYodnQxICsgaikgIT0gdGhpcy5iYi5yZWFkSW50MTYodnQyICsgaikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgb3V0ZXJfbG9vcDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBleGlzdGluZ192dGFibGUgPSB0aGlzLnZ0YWJsZXNbaV07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXhpc3RpbmdfdnRhYmxlKSB7XHJcbiAgICAgICAgICAgIC8vIEZvdW5kIGEgbWF0Y2g6XHJcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgY3VycmVudCB2dGFibGUuXHJcbiAgICAgICAgICAgIHRoaXMuc3BhY2UgPSB0aGlzLmJiLmNhcGFjaXR5KCkgLSB2dGFibGVsb2M7XHJcbiAgICAgICAgICAgIC8vIFBvaW50IHRhYmxlIHRvIGV4aXN0aW5nIHZ0YWJsZS5cclxuICAgICAgICAgICAgdGhpcy5iYi53cml0ZUludDMyKHRoaXMuc3BhY2UsIGV4aXN0aW5nX3Z0YWJsZSAtIHZ0YWJsZWxvYyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBObyBtYXRjaDpcclxuICAgICAgICAgICAgLy8gQWRkIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCB2dGFibGUgdG8gdGhlIGxpc3Qgb2YgdnRhYmxlcy5cclxuICAgICAgICAgICAgdGhpcy52dGFibGVzLnB1c2godGhpcy5vZmZzZXQoKSk7XHJcbiAgICAgICAgICAgIC8vIFBvaW50IHRhYmxlIHRvIGN1cnJlbnQgdnRhYmxlLlxyXG4gICAgICAgICAgICB0aGlzLmJiLndyaXRlSW50MzIodGhpcy5iYi5jYXBhY2l0eSgpIC0gdnRhYmxlbG9jLCB0aGlzLm9mZnNldCgpIC0gdnRhYmxlbG9jKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc05lc3RlZCA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiB2dGFibGVsb2M7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZpbmFsaXplIGEgYnVmZmVyLCBwb2l0aW5nIHRvIHRoZSBnaXZlbiBgcm9vdF90YWJsZWAuXHJcbiAgICAgKi9cclxuICAgIGZpbmlzaChyb290X3RhYmxlLCBvcHRfZmlsZV9pZGVudGlmaWVyLCBvcHRfc2l6ZV9wcmVmaXgpIHtcclxuICAgICAgICBjb25zdCBzaXplX3ByZWZpeCA9IG9wdF9zaXplX3ByZWZpeCA/IFNJWkVfUFJFRklYX0xFTkdUSCA6IDA7XHJcbiAgICAgICAgaWYgKG9wdF9maWxlX2lkZW50aWZpZXIpIHtcclxuICAgICAgICAgICAgY29uc3QgZmlsZV9pZGVudGlmaWVyID0gb3B0X2ZpbGVfaWRlbnRpZmllcjtcclxuICAgICAgICAgICAgdGhpcy5wcmVwKHRoaXMubWluYWxpZ24sIFNJWkVPRl9JTlQgK1xyXG4gICAgICAgICAgICAgICAgRklMRV9JREVOVElGSUVSX0xFTkdUSCArIHNpemVfcHJlZml4KTtcclxuICAgICAgICAgICAgaWYgKGZpbGVfaWRlbnRpZmllci5sZW5ndGggIT0gRklMRV9JREVOVElGSUVSX0xFTkdUSCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbGF0QnVmZmVyczogZmlsZSBpZGVudGlmaWVyIG11c3QgYmUgbGVuZ3RoICcgK1xyXG4gICAgICAgICAgICAgICAgICAgIEZJTEVfSURFTlRJRklFUl9MRU5HVEgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBGSUxFX0lERU5USUZJRVJfTEVOR1RIIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVJbnQ4KGZpbGVfaWRlbnRpZmllci5jaGFyQ29kZUF0KGkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnByZXAodGhpcy5taW5hbGlnbiwgU0laRU9GX0lOVCArIHNpemVfcHJlZml4KTtcclxuICAgICAgICB0aGlzLmFkZE9mZnNldChyb290X3RhYmxlKTtcclxuICAgICAgICBpZiAoc2l6ZV9wcmVmaXgpIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRJbnQzMih0aGlzLmJiLmNhcGFjaXR5KCkgLSB0aGlzLnNwYWNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5iYi5zZXRQb3NpdGlvbih0aGlzLnNwYWNlKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmluYWxpemUgYSBzaXplIHByZWZpeGVkIGJ1ZmZlciwgcG9pbnRpbmcgdG8gdGhlIGdpdmVuIGByb290X3RhYmxlYC5cclxuICAgICAqL1xyXG4gICAgZmluaXNoU2l6ZVByZWZpeGVkKHJvb3RfdGFibGUsIG9wdF9maWxlX2lkZW50aWZpZXIpIHtcclxuICAgICAgICB0aGlzLmZpbmlzaChyb290X3RhYmxlLCBvcHRfZmlsZV9pZGVudGlmaWVyLCB0cnVlKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBjaGVja3MgYSByZXF1aXJlZCBmaWVsZCBoYXMgYmVlbiBzZXQgaW4gYSBnaXZlbiB0YWJsZSB0aGF0IGhhc1xyXG4gICAgICoganVzdCBiZWVuIGNvbnN0cnVjdGVkLlxyXG4gICAgICovXHJcbiAgICByZXF1aXJlZEZpZWxkKHRhYmxlLCBmaWVsZCkge1xyXG4gICAgICAgIGNvbnN0IHRhYmxlX3N0YXJ0ID0gdGhpcy5iYi5jYXBhY2l0eSgpIC0gdGFibGU7XHJcbiAgICAgICAgY29uc3QgdnRhYmxlX3N0YXJ0ID0gdGFibGVfc3RhcnQgLSB0aGlzLmJiLnJlYWRJbnQzMih0YWJsZV9zdGFydCk7XHJcbiAgICAgICAgY29uc3Qgb2sgPSB0aGlzLmJiLnJlYWRJbnQxNih2dGFibGVfc3RhcnQgKyBmaWVsZCkgIT0gMDtcclxuICAgICAgICAvLyBJZiB0aGlzIGZhaWxzLCB0aGUgY2FsbGVyIHdpbGwgc2hvdyB3aGF0IGZpZWxkIG5lZWRzIHRvIGJlIHNldC5cclxuICAgICAgICBpZiAoIW9rKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmxhdEJ1ZmZlcnM6IGZpZWxkICcgKyBmaWVsZCArICcgbXVzdCBiZSBzZXQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFN0YXJ0IGEgbmV3IGFycmF5L3ZlY3RvciBvZiBvYmplY3RzLiAgVXNlcnMgdXN1YWxseSB3aWxsIG5vdCBjYWxsXHJcbiAgICAgKiB0aGlzIGRpcmVjdGx5LiBUaGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIgd2lsbCBjcmVhdGUgYSBzdGFydC9lbmRcclxuICAgICAqIG1ldGhvZCBmb3IgdmVjdG9yIHR5cGVzIGluIGdlbmVyYXRlZCBjb2RlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBlbGVtX3NpemUgVGhlIHNpemUgb2YgZWFjaCBlbGVtZW50IGluIHRoZSBhcnJheVxyXG4gICAgICogQHBhcmFtIG51bV9lbGVtcyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheVxyXG4gICAgICogQHBhcmFtIGFsaWdubWVudCBUaGUgYWxpZ25tZW50IG9mIHRoZSBhcnJheVxyXG4gICAgICovXHJcbiAgICBzdGFydFZlY3RvcihlbGVtX3NpemUsIG51bV9lbGVtcywgYWxpZ25tZW50KSB7XHJcbiAgICAgICAgdGhpcy5ub3ROZXN0ZWQoKTtcclxuICAgICAgICB0aGlzLnZlY3Rvcl9udW1fZWxlbXMgPSBudW1fZWxlbXM7XHJcbiAgICAgICAgdGhpcy5wcmVwKFNJWkVPRl9JTlQsIGVsZW1fc2l6ZSAqIG51bV9lbGVtcyk7XHJcbiAgICAgICAgdGhpcy5wcmVwKGFsaWdubWVudCwgZWxlbV9zaXplICogbnVtX2VsZW1zKTsgLy8gSnVzdCBpbiBjYXNlIGFsaWdubWVudCA+IGludC5cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmluaXNoIG9mZiB0aGUgY3JlYXRpb24gb2YgYW4gYXJyYXkgYW5kIGFsbCBpdHMgZWxlbWVudHMuIFRoZSBhcnJheSBtdXN0IGJlXHJcbiAgICAgKiBjcmVhdGVkIHdpdGggYHN0YXJ0VmVjdG9yYC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgb2Zmc2V0IGF0IHdoaWNoIHRoZSBuZXdseSBjcmVhdGVkIGFycmF5XHJcbiAgICAgKiBzdGFydHMuXHJcbiAgICAgKi9cclxuICAgIGVuZFZlY3RvcigpIHtcclxuICAgICAgICB0aGlzLndyaXRlSW50MzIodGhpcy52ZWN0b3JfbnVtX2VsZW1zKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5vZmZzZXQoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRW5jb2RlIHRoZSBzdHJpbmcgYHNgIGluIHRoZSBidWZmZXIgdXNpbmcgVVRGLTguIElmIHRoZSBzdHJpbmcgcGFzc2VkIGhhc1xyXG4gICAgICogYWxyZWFkeSBiZWVuIHNlZW4sIHdlIHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBhbHJlYWR5IHdyaXR0ZW4gc3RyaW5nXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHMgVGhlIHN0cmluZyB0byBlbmNvZGVcclxuICAgICAqIEByZXR1cm4gVGhlIG9mZnNldCBpbiB0aGUgYnVmZmVyIHdoZXJlIHRoZSBlbmNvZGVkIHN0cmluZyBzdGFydHNcclxuICAgICAqL1xyXG4gICAgY3JlYXRlU2hhcmVkU3RyaW5nKHMpIHtcclxuICAgICAgICBpZiAoIXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5zdHJpbmdfbWFwcykge1xyXG4gICAgICAgICAgICB0aGlzLnN0cmluZ19tYXBzID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5zdHJpbmdfbWFwcy5oYXMocykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nX21hcHMuZ2V0KHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmNyZWF0ZVN0cmluZyhzKTtcclxuICAgICAgICB0aGlzLnN0cmluZ19tYXBzLnNldChzLCBvZmZzZXQpO1xyXG4gICAgICAgIHJldHVybiBvZmZzZXQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEVuY29kZSB0aGUgc3RyaW5nIGBzYCBpbiB0aGUgYnVmZmVyIHVzaW5nIFVURi04LiBJZiBhIFVpbnQ4QXJyYXkgaXMgcGFzc2VkXHJcbiAgICAgKiBpbnN0ZWFkIG9mIGEgc3RyaW5nLCBpdCBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gdmFsaWQgVVRGLTggZW5jb2RlZCBkYXRhLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBzIFRoZSBzdHJpbmcgdG8gZW5jb2RlXHJcbiAgICAgKiBAcmV0dXJuIFRoZSBvZmZzZXQgaW4gdGhlIGJ1ZmZlciB3aGVyZSB0aGUgZW5jb2RlZCBzdHJpbmcgc3RhcnRzXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVN0cmluZyhzKSB7XHJcbiAgICAgICAgaWYgKCFzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdXRmODtcclxuICAgICAgICBpZiAocyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcclxuICAgICAgICAgICAgdXRmOCA9IHM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB1dGY4ID0gW107XHJcbiAgICAgICAgICAgIGxldCBpID0gMDtcclxuICAgICAgICAgICAgd2hpbGUgKGkgPCBzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvZGVQb2ludDtcclxuICAgICAgICAgICAgICAgIC8vIERlY29kZSBVVEYtMTZcclxuICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBzLmNoYXJDb2RlQXQoaSsrKTtcclxuICAgICAgICAgICAgICAgIGlmIChhIDwgMHhEODAwIHx8IGEgPj0gMHhEQzAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29kZVBvaW50ID0gYTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSBzLmNoYXJDb2RlQXQoaSsrKTtcclxuICAgICAgICAgICAgICAgICAgICBjb2RlUG9pbnQgPSAoYSA8PCAxMCkgKyBiICsgKDB4MTAwMDAgLSAoMHhEODAwIDw8IDEwKSAtIDB4REMwMCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBFbmNvZGUgVVRGLThcclxuICAgICAgICAgICAgICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRmOC5wdXNoKGNvZGVQb2ludCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXRmOC5wdXNoKCgoY29kZVBvaW50ID4+IDYpICYgMHgxRikgfCAweEMwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGY4LnB1c2goKChjb2RlUG9pbnQgPj4gMTIpICYgMHgwRikgfCAweEUwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0ZjgucHVzaCgoKGNvZGVQb2ludCA+PiAxOCkgJiAweDA3KSB8IDB4RjAsICgoY29kZVBvaW50ID4+IDEyKSAmIDB4M0YpIHwgMHg4MCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdXRmOC5wdXNoKCgoY29kZVBvaW50ID4+IDYpICYgMHgzRikgfCAweDgwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdXRmOC5wdXNoKChjb2RlUG9pbnQgJiAweDNGKSB8IDB4ODApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWRkSW50OCgwKTtcclxuICAgICAgICB0aGlzLnN0YXJ0VmVjdG9yKDEsIHV0ZjgubGVuZ3RoLCAxKTtcclxuICAgICAgICB0aGlzLmJiLnNldFBvc2l0aW9uKHRoaXMuc3BhY2UgLT0gdXRmOC5sZW5ndGgpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBvZmZzZXQgPSB0aGlzLnNwYWNlLCBieXRlcyA9IHRoaXMuYmIuYnl0ZXMoKTsgaSA8IHV0ZjgubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgYnl0ZXNbb2Zmc2V0KytdID0gdXRmOFtpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5kVmVjdG9yKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGF2b2lkIGdlbmVyYXRlZCBjb2RlIGRlcGVuZGluZyBvbiB0aGlzIGZpbGUgZGlyZWN0bHkuXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUxvbmcobG93LCBoaWdoKSB7XHJcbiAgICAgICAgcmV0dXJuIExvbmcuY3JlYXRlKGxvdywgaGlnaCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIHBhY2sgYW4gb2JqZWN0XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgb2Zmc2V0IG9mIG9ialxyXG4gICAgICovXHJcbiAgICBjcmVhdGVPYmplY3RPZmZzZXQob2JqKSB7XHJcbiAgICAgICAgaWYgKG9iaiA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVN0cmluZyhvYmopO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9iai5wYWNrKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gcGFjayBhIGxpc3Qgb2Ygb2JqZWN0XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgbGlzdCBvZiBvZmZzZXRzIG9mIGVhY2ggbm9uIG51bGwgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZU9iamVjdE9mZnNldExpc3QobGlzdCkge1xyXG4gICAgICAgIGNvbnN0IHJldCA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWwgPSBsaXN0W2ldO1xyXG4gICAgICAgICAgICBpZiAodmFsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXQucHVzaCh0aGlzLmNyZWF0ZU9iamVjdE9mZnNldCh2YWwpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmxhdEJ1ZmZlcnM6IEFyZ3VtZW50IGZvciBjcmVhdGVPYmplY3RPZmZzZXRMaXN0IGNhbm5vdCBjb250YWluIG51bGwuJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgIH1cclxuICAgIGNyZWF0ZVN0cnVjdE9mZnNldExpc3QobGlzdCwgc3RhcnRGdW5jKSB7XHJcbiAgICAgICAgc3RhcnRGdW5jKHRoaXMsIGxpc3QubGVuZ3RoKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZU9iamVjdE9mZnNldExpc3QobGlzdCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5kVmVjdG9yKCk7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRklMRV9JREVOVElGSUVSX0xFTkdUSCwgU0laRU9GX0lOVCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgeyBMb25nIH0gZnJvbSBcIi4vbG9uZ1wiO1xyXG5pbXBvcnQgeyBpbnQzMiwgaXNMaXR0bGVFbmRpYW4sIGZsb2F0MzIsIGZsb2F0NjQgfSBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgeyBFbmNvZGluZyB9IGZyb20gXCIuL2VuY29kaW5nXCI7XHJcbmV4cG9ydCBjbGFzcyBCeXRlQnVmZmVyIHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgbmV3IEJ5dGVCdWZmZXIgd2l0aCBhIGdpdmVuIGFycmF5IG9mIGJ5dGVzIChgVWludDhBcnJheWApXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGJ5dGVzXykge1xyXG4gICAgICAgIHRoaXMuYnl0ZXNfID0gYnl0ZXNfO1xyXG4gICAgICAgIHRoaXMucG9zaXRpb25fID0gMDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGFuZCBhbGxvY2F0ZSBhIG5ldyBCeXRlQnVmZmVyIHdpdGggYSBnaXZlbiBzaXplLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYWxsb2NhdGUoYnl0ZV9zaXplKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBCeXRlQnVmZmVyKG5ldyBVaW50OEFycmF5KGJ5dGVfc2l6ZSkpO1xyXG4gICAgfVxyXG4gICAgY2xlYXIoKSB7XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbl8gPSAwO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgYFVpbnQ4QXJyYXlgLlxyXG4gICAgICovXHJcbiAgICBieXRlcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ieXRlc187XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgYnVmZmVyJ3MgcG9zaXRpb24uXHJcbiAgICAgKi9cclxuICAgIHBvc2l0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uXztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBidWZmZXIncyBwb3NpdGlvbi5cclxuICAgICAqL1xyXG4gICAgc2V0UG9zaXRpb24ocG9zaXRpb24pIHtcclxuICAgICAgICB0aGlzLnBvc2l0aW9uXyA9IHBvc2l0aW9uO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGJ1ZmZlcidzIGNhcGFjaXR5LlxyXG4gICAgICovXHJcbiAgICBjYXBhY2l0eSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ieXRlc18ubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgcmVhZEludDgob2Zmc2V0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFVpbnQ4KG9mZnNldCkgPDwgMjQgPj4gMjQ7XHJcbiAgICB9XHJcbiAgICByZWFkVWludDgob2Zmc2V0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYnl0ZXNfW29mZnNldF07XHJcbiAgICB9XHJcbiAgICByZWFkSW50MTYob2Zmc2V0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFVpbnQxNihvZmZzZXQpIDw8IDE2ID4+IDE2O1xyXG4gICAgfVxyXG4gICAgcmVhZFVpbnQxNihvZmZzZXQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ieXRlc19bb2Zmc2V0XSB8IHRoaXMuYnl0ZXNfW29mZnNldCArIDFdIDw8IDg7XHJcbiAgICB9XHJcbiAgICByZWFkSW50MzIob2Zmc2V0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYnl0ZXNfW29mZnNldF0gfCB0aGlzLmJ5dGVzX1tvZmZzZXQgKyAxXSA8PCA4IHwgdGhpcy5ieXRlc19bb2Zmc2V0ICsgMl0gPDwgMTYgfCB0aGlzLmJ5dGVzX1tvZmZzZXQgKyAzXSA8PCAyNDtcclxuICAgIH1cclxuICAgIHJlYWRVaW50MzIob2Zmc2V0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEludDMyKG9mZnNldCkgPj4+IDA7XHJcbiAgICB9XHJcbiAgICByZWFkSW50NjQob2Zmc2V0KSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBMb25nKHRoaXMucmVhZEludDMyKG9mZnNldCksIHRoaXMucmVhZEludDMyKG9mZnNldCArIDQpKTtcclxuICAgIH1cclxuICAgIHJlYWRVaW50NjQob2Zmc2V0KSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBMb25nKHRoaXMucmVhZFVpbnQzMihvZmZzZXQpLCB0aGlzLnJlYWRVaW50MzIob2Zmc2V0ICsgNCkpO1xyXG4gICAgfVxyXG4gICAgcmVhZEZsb2F0MzIob2Zmc2V0KSB7XHJcbiAgICAgICAgaW50MzJbMF0gPSB0aGlzLnJlYWRJbnQzMihvZmZzZXQpO1xyXG4gICAgICAgIHJldHVybiBmbG9hdDMyWzBdO1xyXG4gICAgfVxyXG4gICAgcmVhZEZsb2F0NjQob2Zmc2V0KSB7XHJcbiAgICAgICAgaW50MzJbaXNMaXR0bGVFbmRpYW4gPyAwIDogMV0gPSB0aGlzLnJlYWRJbnQzMihvZmZzZXQpO1xyXG4gICAgICAgIGludDMyW2lzTGl0dGxlRW5kaWFuID8gMSA6IDBdID0gdGhpcy5yZWFkSW50MzIob2Zmc2V0ICsgNCk7XHJcbiAgICAgICAgcmV0dXJuIGZsb2F0NjRbMF07XHJcbiAgICB9XHJcbiAgICB3cml0ZUludDgob2Zmc2V0LCB2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuYnl0ZXNfW29mZnNldF0gPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIHdyaXRlVWludDgob2Zmc2V0LCB2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuYnl0ZXNfW29mZnNldF0gPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIHdyaXRlSW50MTYob2Zmc2V0LCB2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuYnl0ZXNfW29mZnNldF0gPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLmJ5dGVzX1tvZmZzZXQgKyAxXSA9IHZhbHVlID4+IDg7XHJcbiAgICB9XHJcbiAgICB3cml0ZVVpbnQxNihvZmZzZXQsIHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5ieXRlc19bb2Zmc2V0XSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuYnl0ZXNfW29mZnNldCArIDFdID0gdmFsdWUgPj4gODtcclxuICAgIH1cclxuICAgIHdyaXRlSW50MzIob2Zmc2V0LCB2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuYnl0ZXNfW29mZnNldF0gPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLmJ5dGVzX1tvZmZzZXQgKyAxXSA9IHZhbHVlID4+IDg7XHJcbiAgICAgICAgdGhpcy5ieXRlc19bb2Zmc2V0ICsgMl0gPSB2YWx1ZSA+PiAxNjtcclxuICAgICAgICB0aGlzLmJ5dGVzX1tvZmZzZXQgKyAzXSA9IHZhbHVlID4+IDI0O1xyXG4gICAgfVxyXG4gICAgd3JpdGVVaW50MzIob2Zmc2V0LCB2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuYnl0ZXNfW29mZnNldF0gPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLmJ5dGVzX1tvZmZzZXQgKyAxXSA9IHZhbHVlID4+IDg7XHJcbiAgICAgICAgdGhpcy5ieXRlc19bb2Zmc2V0ICsgMl0gPSB2YWx1ZSA+PiAxNjtcclxuICAgICAgICB0aGlzLmJ5dGVzX1tvZmZzZXQgKyAzXSA9IHZhbHVlID4+IDI0O1xyXG4gICAgfVxyXG4gICAgd3JpdGVJbnQ2NChvZmZzZXQsIHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy53cml0ZUludDMyKG9mZnNldCwgdmFsdWUubG93KTtcclxuICAgICAgICB0aGlzLndyaXRlSW50MzIob2Zmc2V0ICsgNCwgdmFsdWUuaGlnaCk7XHJcbiAgICB9XHJcbiAgICB3cml0ZVVpbnQ2NChvZmZzZXQsIHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy53cml0ZVVpbnQzMihvZmZzZXQsIHZhbHVlLmxvdyk7XHJcbiAgICAgICAgdGhpcy53cml0ZVVpbnQzMihvZmZzZXQgKyA0LCB2YWx1ZS5oaWdoKTtcclxuICAgIH1cclxuICAgIHdyaXRlRmxvYXQzMihvZmZzZXQsIHZhbHVlKSB7XHJcbiAgICAgICAgZmxvYXQzMlswXSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMud3JpdGVJbnQzMihvZmZzZXQsIGludDMyWzBdKTtcclxuICAgIH1cclxuICAgIHdyaXRlRmxvYXQ2NChvZmZzZXQsIHZhbHVlKSB7XHJcbiAgICAgICAgZmxvYXQ2NFswXSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMud3JpdGVJbnQzMihvZmZzZXQsIGludDMyW2lzTGl0dGxlRW5kaWFuID8gMCA6IDFdKTtcclxuICAgICAgICB0aGlzLndyaXRlSW50MzIob2Zmc2V0ICsgNCwgaW50MzJbaXNMaXR0bGVFbmRpYW4gPyAxIDogMF0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIGZpbGUgaWRlbnRpZmllci4gICBCZWhhdmlvciBpcyB1bmRlZmluZWQgZm9yIEZsYXRCdWZmZXJzIHdob3NlXHJcbiAgICAgKiBzY2hlbWEgZG9lcyBub3QgaW5jbHVkZSBhIGZpbGVfaWRlbnRpZmllciAobGlrZWx5IHBvaW50cyBhdCBwYWRkaW5nIG9yIHRoZVxyXG4gICAgICogc3RhcnQgb2YgYSB0aGUgcm9vdCB2dGFibGUpLlxyXG4gICAgICovXHJcbiAgICBnZXRCdWZmZXJJZGVudGlmaWVyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmJ5dGVzXy5sZW5ndGggPCB0aGlzLnBvc2l0aW9uXyArIFNJWkVPRl9JTlQgK1xyXG4gICAgICAgICAgICBGSUxFX0lERU5USUZJRVJfTEVOR1RIKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmxhdEJ1ZmZlcnM6IEJ5dGVCdWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4gYW4gaWRlbnRpZmllci4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBGSUxFX0lERU5USUZJRVJfTEVOR1RIOyBpKyspIHtcclxuICAgICAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5yZWFkSW50OCh0aGlzLnBvc2l0aW9uXyArIFNJWkVPRl9JTlQgKyBpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIExvb2sgdXAgYSBmaWVsZCBpbiB0aGUgdnRhYmxlLCByZXR1cm4gYW4gb2Zmc2V0IGludG8gdGhlIG9iamVjdCwgb3IgMCBpZiB0aGVcclxuICAgICAqIGZpZWxkIGlzIG5vdCBwcmVzZW50LlxyXG4gICAgICovXHJcbiAgICBfX29mZnNldChiYl9wb3MsIHZ0YWJsZV9vZmZzZXQpIHtcclxuICAgICAgICBjb25zdCB2dGFibGUgPSBiYl9wb3MgLSB0aGlzLnJlYWRJbnQzMihiYl9wb3MpO1xyXG4gICAgICAgIHJldHVybiB2dGFibGVfb2Zmc2V0IDwgdGhpcy5yZWFkSW50MTYodnRhYmxlKSA/IHRoaXMucmVhZEludDE2KHZ0YWJsZSArIHZ0YWJsZV9vZmZzZXQpIDogMDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSW5pdGlhbGl6ZSBhbnkgVGFibGUtZGVyaXZlZCB0eXBlIHRvIHBvaW50IHRvIHRoZSB1bmlvbiBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LlxyXG4gICAgICovXHJcbiAgICBfX3VuaW9uKHQsIG9mZnNldCkge1xyXG4gICAgICAgIHQuYmJfcG9zID0gb2Zmc2V0ICsgdGhpcy5yZWFkSW50MzIob2Zmc2V0KTtcclxuICAgICAgICB0LmJiID0gdGhpcztcclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgSmF2YVNjcmlwdCBzdHJpbmcgZnJvbSBVVEYtOCBkYXRhIHN0b3JlZCBpbnNpZGUgdGhlIEZsYXRCdWZmZXIuXHJcbiAgICAgKiBUaGlzIGFsbG9jYXRlcyBhIG5ldyBzdHJpbmcgYW5kIGNvbnZlcnRzIHRvIHdpZGUgY2hhcnMgdXBvbiBlYWNoIGFjY2Vzcy5cclxuICAgICAqXHJcbiAgICAgKiBUbyBhdm9pZCB0aGUgY29udmVyc2lvbiB0byBVVEYtMTYsIHBhc3MgRW5jb2RpbmcuVVRGOF9CWVRFUyBhc1xyXG4gICAgICogdGhlIFwib3B0aW9uYWxFbmNvZGluZ1wiIGFyZ3VtZW50LiBUaGlzIGlzIHVzZWZ1bCBmb3IgYXZvaWRpbmcgY29udmVyc2lvbiB0b1xyXG4gICAgICogYW5kIGZyb20gVVRGLTE2IHdoZW4gdGhlIGRhdGEgd2lsbCBqdXN0IGJlIHBhY2thZ2VkIGJhY2sgdXAgaW4gYW5vdGhlclxyXG4gICAgICogRmxhdEJ1ZmZlciBsYXRlciBvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gb2Zmc2V0XHJcbiAgICAgKiBAcGFyYW0gb3B0X2VuY29kaW5nIERlZmF1bHRzIHRvIFVURjE2X1NUUklOR1xyXG4gICAgICovXHJcbiAgICBfX3N0cmluZyhvZmZzZXQsIG9wdF9lbmNvZGluZykge1xyXG4gICAgICAgIG9mZnNldCArPSB0aGlzLnJlYWRJbnQzMihvZmZzZXQpO1xyXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMucmVhZEludDMyKG9mZnNldCk7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xyXG4gICAgICAgIGxldCBpID0gMDtcclxuICAgICAgICBvZmZzZXQgKz0gU0laRU9GX0lOVDtcclxuICAgICAgICBpZiAob3B0X2VuY29kaW5nID09PSBFbmNvZGluZy5VVEY4X0JZVEVTKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ5dGVzXy5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGxldCBjb2RlUG9pbnQ7XHJcbiAgICAgICAgICAgIC8vIERlY29kZSBVVEYtOFxyXG4gICAgICAgICAgICBjb25zdCBhID0gdGhpcy5yZWFkVWludDgob2Zmc2V0ICsgaSsrKTtcclxuICAgICAgICAgICAgaWYgKGEgPCAweEMwKSB7XHJcbiAgICAgICAgICAgICAgICBjb2RlUG9pbnQgPSBhO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMucmVhZFVpbnQ4KG9mZnNldCArIGkrKyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYSA8IDB4RTApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2RlUG9pbnQgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoKGEgJiAweDFGKSA8PCA2KSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYiAmIDB4M0YpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IHRoaXMucmVhZFVpbnQ4KG9mZnNldCArIGkrKyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEgPCAweEYwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVQb2ludCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGEgJiAweDBGKSA8PCAxMikgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYiAmIDB4M0YpIDw8IDYpIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYyAmIDB4M0YpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZCA9IHRoaXMucmVhZFVpbnQ4KG9mZnNldCArIGkrKyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVQb2ludCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGEgJiAweDA3KSA8PCAxOCkgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYiAmIDB4M0YpIDw8IDEyKSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjICYgMHgzRikgPDwgNikgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkICYgMHgzRik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIEVuY29kZSBVVEYtMTZcclxuICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVQb2ludCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMDtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjb2RlUG9pbnQgPj4gMTApICsgMHhEODAwLCAoY29kZVBvaW50ICYgKCgxIDw8IDEwKSAtIDEpKSArIDB4REMwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlIHVuaW9ucyB0aGF0IGNhbiBjb250YWluIHN0cmluZyBhcyBpdHMgbWVtYmVyLCBpZiBhIFRhYmxlLWRlcml2ZWQgdHlwZSB0aGVuIGluaXRpYWxpemUgaXQsXHJcbiAgICAgKiBpZiBhIHN0cmluZyB0aGVuIHJldHVybiBhIG5ldyBvbmVcclxuICAgICAqXHJcbiAgICAgKiBXQVJOSU5HOiBzdHJpbmdzIGFyZSBpbW11dGFibGUgaW4gSlMgc28gd2UgY2FuJ3QgY2hhbmdlIHRoZSBzdHJpbmcgdGhhdCB0aGUgdXNlciBnYXZlIHVzLCB0aGlzXHJcbiAgICAgKiBtYWtlcyB0aGUgYmVoYXZpb3VyIG9mIF9fdW5pb25fd2l0aF9zdHJpbmcgZGlmZmVyZW50IGNvbXBhcmVkIHRvIF9fdW5pb25cclxuICAgICAqL1xyXG4gICAgX191bmlvbl93aXRoX3N0cmluZyhvLCBvZmZzZXQpIHtcclxuICAgICAgICBpZiAodHlwZW9mIG8gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9fc3RyaW5nKG9mZnNldCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9fdW5pb24obywgb2Zmc2V0KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmUgdGhlIHJlbGF0aXZlIG9mZnNldCBzdG9yZWQgYXQgXCJvZmZzZXRcIlxyXG4gICAgICovXHJcbiAgICBfX2luZGlyZWN0KG9mZnNldCkge1xyXG4gICAgICAgIHJldHVybiBvZmZzZXQgKyB0aGlzLnJlYWRJbnQzMihvZmZzZXQpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHN0YXJ0IG9mIGRhdGEgb2YgYSB2ZWN0b3Igd2hvc2Ugb2Zmc2V0IGlzIHN0b3JlZCBhdCBcIm9mZnNldFwiIGluIHRoaXMgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBfX3ZlY3RvcihvZmZzZXQpIHtcclxuICAgICAgICByZXR1cm4gb2Zmc2V0ICsgdGhpcy5yZWFkSW50MzIob2Zmc2V0KSArIFNJWkVPRl9JTlQ7IC8vIGRhdGEgc3RhcnRzIGFmdGVyIHRoZSBsZW5ndGhcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBsZW5ndGggb2YgYSB2ZWN0b3Igd2hvc2Ugb2Zmc2V0IGlzIHN0b3JlZCBhdCBcIm9mZnNldFwiIGluIHRoaXMgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBfX3ZlY3Rvcl9sZW4ob2Zmc2V0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEludDMyKG9mZnNldCArIHRoaXMucmVhZEludDMyKG9mZnNldCkpO1xyXG4gICAgfVxyXG4gICAgX19oYXNfaWRlbnRpZmllcihpZGVudCkge1xyXG4gICAgICAgIGlmIChpZGVudC5sZW5ndGggIT0gRklMRV9JREVOVElGSUVSX0xFTkdUSCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZsYXRCdWZmZXJzOiBmaWxlIGlkZW50aWZpZXIgbXVzdCBiZSBsZW5ndGggJyArXHJcbiAgICAgICAgICAgICAgICBGSUxFX0lERU5USUZJRVJfTEVOR1RIKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBGSUxFX0lERU5USUZJRVJfTEVOR1RIOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGlkZW50LmNoYXJDb2RlQXQoaSkgIT0gdGhpcy5yZWFkSW50OCh0aGlzLnBvc2l0aW9uKCkgKyBTSVpFT0ZfSU5UICsgaSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gYXZvaWQgZ2VuZXJhdGVkIGNvZGUgZGVwZW5kaW5nIG9uIHRoaXMgZmlsZSBkaXJlY3RseS5cclxuICAgICAqL1xyXG4gICAgY3JlYXRlTG9uZyhsb3csIGhpZ2gpIHtcclxuICAgICAgICByZXR1cm4gTG9uZy5jcmVhdGUobG93LCBoaWdoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQSBoZWxwZXIgZnVuY3Rpb24gZm9yIGdlbmVyYXRpbmcgbGlzdCBmb3Igb2JqIGFwaVxyXG4gICAgICovXHJcbiAgICBjcmVhdGVTY2FsYXJMaXN0KGxpc3RBY2Nlc3NvciwgbGlzdExlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IHJldCA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgICAgIGlmIChsaXN0QWNjZXNzb3IoaSkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldC5wdXNoKGxpc3RBY2Nlc3NvcihpKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQSBoZWxwZXIgZnVuY3Rpb24gZm9yIGdlbmVyYXRpbmcgbGlzdCBmb3Igb2JqIGFwaVxyXG4gICAgICogQHBhcmFtIGxpc3RBY2Nlc3NvciBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYW4gaW5kZXggYW5kIHJldHVybiBkYXRhIGF0IHRoYXQgaW5kZXhcclxuICAgICAqIEBwYXJhbSBsaXN0TGVuZ3RoIGxpc3RMZW5ndGhcclxuICAgICAqIEBwYXJhbSByZXMgcmVzdWx0IGxpc3RcclxuICAgICAqL1xyXG4gICAgY3JlYXRlT2JqTGlzdChsaXN0QWNjZXNzb3IsIGxpc3RMZW5ndGgpIHtcclxuICAgICAgICBjb25zdCByZXQgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7ICsraSkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWwgPSBsaXN0QWNjZXNzb3IoaSk7XHJcbiAgICAgICAgICAgIGlmICh2YWwgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldC5wdXNoKHZhbC51bnBhY2soKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgIH1cclxufVxyXG4iLCJleHBvcnQgY29uc3QgU0laRU9GX1NIT1JUID0gMjtcclxuZXhwb3J0IGNvbnN0IFNJWkVPRl9JTlQgPSA0O1xyXG5leHBvcnQgY29uc3QgRklMRV9JREVOVElGSUVSX0xFTkdUSCA9IDQ7XHJcbmV4cG9ydCBjb25zdCBTSVpFX1BSRUZJWF9MRU5HVEggPSA0O1xyXG4iLCJleHBvcnQgdmFyIEVuY29kaW5nO1xyXG4oZnVuY3Rpb24gKEVuY29kaW5nKSB7XHJcbiAgICBFbmNvZGluZ1tFbmNvZGluZ1tcIlVURjhfQllURVNcIl0gPSAxXSA9IFwiVVRGOF9CWVRFU1wiO1xyXG4gICAgRW5jb2RpbmdbRW5jb2RpbmdbXCJVVEYxNl9TVFJJTkdcIl0gPSAyXSA9IFwiVVRGMTZfU1RSSU5HXCI7XHJcbn0pKEVuY29kaW5nIHx8IChFbmNvZGluZyA9IHt9KSk7XHJcbiIsImV4cG9ydCB7IFNJWkVPRl9TSE9SVCB9IGZyb20gJy4vY29uc3RhbnRzJztcclxuZXhwb3J0IHsgU0laRU9GX0lOVCB9IGZyb20gJy4vY29uc3RhbnRzJztcclxuZXhwb3J0IHsgRklMRV9JREVOVElGSUVSX0xFTkdUSCB9IGZyb20gJy4vY29uc3RhbnRzJztcclxuZXhwb3J0IHsgU0laRV9QUkVGSVhfTEVOR1RIIH0gZnJvbSAnLi9jb25zdGFudHMnO1xyXG5leHBvcnQgeyBpbnQzMiwgZmxvYXQzMiwgZmxvYXQ2NCwgaXNMaXR0bGVFbmRpYW4gfSBmcm9tICcuL3V0aWxzJztcclxuZXhwb3J0IHsgTG9uZywgY3JlYXRlTG9uZyB9IGZyb20gJy4vbG9uZyc7XHJcbmV4cG9ydCB7IEVuY29kaW5nIH0gZnJvbSAnLi9lbmNvZGluZyc7XHJcbmV4cG9ydCB7IEJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXInO1xyXG5leHBvcnQgeyBCeXRlQnVmZmVyIH0gZnJvbSAnLi9ieXRlLWJ1ZmZlcic7XHJcbiIsImV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb25nKGxvdywgaGlnaCkge1xyXG4gICAgcmV0dXJuIExvbmcuY3JlYXRlKGxvdywgaGlnaCk7XHJcbn1cclxuZXhwb3J0IGNsYXNzIExvbmcge1xyXG4gICAgY29uc3RydWN0b3IobG93LCBoaWdoKSB7XHJcbiAgICAgICAgdGhpcy5sb3cgPSBsb3cgfCAwO1xyXG4gICAgICAgIHRoaXMuaGlnaCA9IGhpZ2ggfCAwO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGNyZWF0ZShsb3csIGhpZ2gpIHtcclxuICAgICAgICAvLyBTcGVjaWFsLWNhc2UgemVybyB0byBhdm9pZCBHQyBvdmVyaGVhZCBmb3IgZGVmYXVsdCB2YWx1ZXNcclxuICAgICAgICByZXR1cm4gbG93ID09IDAgJiYgaGlnaCA9PSAwID8gTG9uZy5aRVJPIDogbmV3IExvbmcobG93LCBoaWdoKTtcclxuICAgIH1cclxuICAgIHRvRmxvYXQ2NCgpIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMubG93ID4+PiAwKSArIHRoaXMuaGlnaCAqIDB4MTAwMDAwMDAwO1xyXG4gICAgfVxyXG4gICAgZXF1YWxzKG90aGVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubG93ID09IG90aGVyLmxvdyAmJiB0aGlzLmhpZ2ggPT0gb3RoZXIuaGlnaDtcclxuICAgIH1cclxufVxyXG5Mb25nLlpFUk8gPSBuZXcgTG9uZygwLCAwKTtcclxuIiwiZXhwb3J0IGNvbnN0IGludDMyID0gbmV3IEludDMyQXJyYXkoMik7XHJcbmV4cG9ydCBjb25zdCBmbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheShpbnQzMi5idWZmZXIpO1xyXG5leHBvcnQgY29uc3QgZmxvYXQ2NCA9IG5ldyBGbG9hdDY0QXJyYXkoaW50MzIuYnVmZmVyKTtcclxuZXhwb3J0IGNvbnN0IGlzTGl0dGxlRW5kaWFuID0gbmV3IFVpbnQxNkFycmF5KG5ldyBVaW50OEFycmF5KFsxLCAwXSkuYnVmZmVyKVswXSA9PT0gMTtcclxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcclxuICAgIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxyXG4gICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcclxuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xyXG4gICAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XHJcbiAgICB2YXIgXywgZG9uZSA9IGZhbHNlO1xyXG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICB2YXIgY29udGV4dCA9IHt9O1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xyXG4gICAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XHJcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnB1c2goXyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xyXG4gICAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMucHVzaChfKTtcclxuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcclxuICAgIGRvbmUgPSB0cnVlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcclxuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xyXG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSBuYW1lID0gbmFtZS5kZXNjcmlwdGlvbiA/IFwiW1wiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCBcIl1cIikgOiBcIlwiO1xyXG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XHJcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xyXG4gICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XHJcbiAgICB9XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xyXG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xyXG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XHJcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcclxuICAgIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xyXG4gICAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcclxufVxyXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IFZlY3RvciB9IGZyb20gJy4vdmVjdG9yLm1qcyc7XG5pbXBvcnQgeyBtYWtlRGF0YSB9IGZyb20gJy4vZGF0YS5tanMnO1xuaW1wb3J0IHsgTWFwUm93LCBrS2V5cyB9IGZyb20gJy4vcm93L21hcC5tanMnO1xuaW1wb3J0IHsgc3RyaWRlRm9yVHlwZSwgfSBmcm9tICcuL3R5cGUubWpzJztcbmltcG9ydCB7IGNyZWF0ZUlzVmFsaWRGdW5jdGlvbiB9IGZyb20gJy4vYnVpbGRlci92YWxpZC5tanMnO1xuaW1wb3J0IHsgQml0bWFwQnVmZmVyQnVpbGRlciwgRGF0YUJ1ZmZlckJ1aWxkZXIsIE9mZnNldHNCdWZmZXJCdWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyL2J1ZmZlci5tanMnO1xuLyoqXG4gKiBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB0eXBlcyB0aGF0IGNvbnN0cnVjdCBBcnJvdyBWZWN0b3JzIGZyb20gYXJiaXRyYXJ5IEphdmFTY3JpcHQgdmFsdWVzLlxuICpcbiAqIEEgYEJ1aWxkZXJgIGlzIHJlc3BvbnNpYmxlIGZvciB3cml0aW5nIGFyYml0cmFyeSBKYXZhU2NyaXB0IHZhbHVlc1xuICogdG8gQXJyYXlCdWZmZXJzIGFuZC9vciBjaGlsZCBCdWlsZGVycyBhY2NvcmRpbmcgdG8gdGhlIEFycm93IHNwZWNpZmljYXRpb25cbiAqIGZvciBlYWNoIERhdGFUeXBlLCBjcmVhdGluZyBvciByZXNpemluZyB0aGUgdW5kZXJseWluZyBBcnJheUJ1ZmZlcnMgYXMgbmVjZXNzYXJ5LlxuICpcbiAqIFRoZSBgQnVpbGRlcmAgZm9yIGVhY2ggQXJyb3cgYERhdGFUeXBlYCBoYW5kbGVzIGNvbnZlcnRpbmcgYW5kIGFwcGVuZGluZ1xuICogdmFsdWVzIGZvciBhIGdpdmVuIGBEYXRhVHlwZWAuIFRoZSBoaWdoLWxldmVsIHtAbGluayBtYWtlQnVpbGRlciBgbWFrZUJ1aWxkZXIoKWB9IGNvbnZlbmllbmNlXG4gKiBtZXRob2QgY3JlYXRlcyB0aGUgc3BlY2lmaWMgYEJ1aWxkZXJgIHN1YmNsYXNzIGZvciB0aGUgc3VwcGxpZWQgYERhdGFUeXBlYC5cbiAqXG4gKiBPbmNlIGNyZWF0ZWQsIGBCdWlsZGVyYCBpbnN0YW5jZXMgc3VwcG9ydCBib3RoIGFwcGVuZGluZyB2YWx1ZXMgdG8gdGhlIGVuZFxuICogb2YgdGhlIGBCdWlsZGVyYCwgYW5kIHJhbmRvbS1hY2Nlc3Mgd3JpdGVzIHRvIHNwZWNpZmljIGluZGljZXNcbiAqIChgQnVpbGRlci5wcm90b3R5cGUuYXBwZW5kKHZhbHVlKWAgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZm9yXG4gKiBgYnVpbGRlci5zZXQoYnVpbGRlci5sZW5ndGgsIHZhbHVlKWApLiBBcHBlbmRpbmcgb3Igc2V0dGluZyB2YWx1ZXMgYmV5b25kIHRoZVxuICogQnVpbGRlcidzIGN1cnJlbnQgbGVuZ3RoIG1heSBjYXVzZSB0aGUgYnVpbGRlciB0byBncm93IGl0cyB1bmRlcmx5aW5nIGJ1ZmZlcnNcbiAqIG9yIGNoaWxkIEJ1aWxkZXJzIChpZiBhcHBsaWNhYmxlKSB0byBhY2NvbW1vZGF0ZSB0aGUgbmV3IHZhbHVlcy5cbiAqXG4gKiBBZnRlciBlbm91Z2ggdmFsdWVzIGhhdmUgYmVlbiB3cml0dGVuIHRvIGEgYEJ1aWxkZXJgLCBgQnVpbGRlci5wcm90b3R5cGUuZmx1c2goKWBcbiAqIHdpbGwgY29tbWl0IHRoZSB2YWx1ZXMgdG8gdGhlIHVuZGVybHlpbmcgQXJyYXlCdWZmZXJzIChvciBjaGlsZCBCdWlsZGVycykuIFRoZVxuICogaW50ZXJuYWwgQnVpbGRlciBzdGF0ZSB3aWxsIGJlIHJlc2V0LCBhbmQgYW4gaW5zdGFuY2Ugb2YgYERhdGE8VD5gIGlzIHJldHVybmVkLlxuICogQWx0ZXJuYXRpdmVseSwgYEJ1aWxkZXIucHJvdG90eXBlLnRvVmVjdG9yKClgIHdpbGwgZmx1c2ggdGhlIGBCdWlsZGVyYCBhbmQgcmV0dXJuXG4gKiBhbiBpbnN0YW5jZSBvZiBgVmVjdG9yPFQ+YCBpbnN0ZWFkLlxuICpcbiAqIFdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgdmFsdWVzIHRvIHdyaXRlLCB1c2UgYEJ1aWxkZXIucHJvdG90eXBlLmZpbmlzaCgpYCB0b1xuICogZmluYWxpemUgdGhlIGBCdWlsZGVyYC4gVGhpcyBkb2VzIG5vdCByZXNldCB0aGUgaW50ZXJuYWwgc3RhdGUsIHNvIGl0IGlzXG4gKiBuZWNlc3NhcnkgdG8gY2FsbCBgQnVpbGRlci5wcm90b3R5cGUuZmx1c2goKWAgb3IgYHRvVmVjdG9yKClgIG9uZSBsYXN0IHRpbWVcbiAqIGlmIHRoZXJlIGFyZSBzdGlsbCB2YWx1ZXMgcXVldWVkIHRvIGJlIGZsdXNoZWQuXG4gKlxuICogTm90ZTogY2FsbGluZyBgQnVpbGRlci5wcm90b3R5cGUuZmluaXNoKClgIGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgYSBgRGljdGlvbmFyeUJ1aWxkZXJgLFxuICogYmVjYXVzZSB0aGlzIGlzIHdoZW4gaXQgZmx1c2hlcyB0aGUgdmFsdWVzIHRoYXQgaGF2ZSBiZWVuIGVucXVldWVkIGluIGl0cyBpbnRlcm5hbFxuICogZGljdGlvbmFyeSdzIGBCdWlsZGVyYCwgYW5kIGNyZWF0ZXMgdGhlIGBkaWN0aW9uYXJ5VmVjdG9yYCBmb3IgdGhlIGBEaWN0aW9uYXJ5YCBgRGF0YVR5cGVgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQnVpbGRlciwgVXRmOCB9IGZyb20gJ2FwYWNoZS1hcnJvdyc7XG4gKlxuICogY29uc3QgdXRmOEJ1aWxkZXIgPSBtYWtlQnVpbGRlcih7XG4gKiAgICAgdHlwZTogbmV3IFV0ZjgoKSxcbiAqICAgICBudWxsVmFsdWVzOiBbbnVsbCwgJ24vYSddXG4gKiB9KTtcbiAqXG4gKiB1dGY4QnVpbGRlclxuICogICAgIC5hcHBlbmQoJ2hlbGxvJylcbiAqICAgICAuYXBwZW5kKCduL2EnKVxuICogICAgIC5hcHBlbmQoJ3dvcmxkJylcbiAqICAgICAuYXBwZW5kKG51bGwpO1xuICpcbiAqIGNvbnN0IHV0ZjhWZWN0b3IgPSB1dGY4QnVpbGRlci5maW5pc2goKS50b1ZlY3RvcigpO1xuICpcbiAqIGNvbnNvbGUubG9nKHV0ZjhWZWN0b3IudG9KU09OKCkpO1xuICogLy8gPiBbXCJoZWxsb1wiLCBudWxsLCBcIndvcmxkXCIsIG51bGxdXG4gKiBgYGBcbiAqXG4gKiBAdHlwZXBhcmFtIFQgVGhlIGBEYXRhVHlwZWAgb2YgdGhpcyBgQnVpbGRlcmAuXG4gKiBAdHlwZXBhcmFtIFROdWxsIFRoZSB0eXBlKHMpIG9mIHZhbHVlcyB3aGljaCB3aWxsIGJlIGNvbnNpZGVyZWQgbnVsbC12YWx1ZSBzZW50aW5lbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBCdWlsZGVyIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBidWlsZGVyIHdpdGggdGhlIGdpdmVuIEFycm93IERhdGFUeXBlIHdpdGggb3B0aW9uYWwgbnVsbCB2YWx1ZXMsXG4gICAgICogd2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBcIm51bGxcIiB3aGVuIHNldCBvciBhcHBlbmRlZCB0byB0aGUgYEJ1aWxkZXJgLlxuICAgICAqIEBwYXJhbSB7eyB0eXBlOiBULCBudWxsVmFsdWVzPzogYW55W10gfX0gb3B0aW9ucyBBIGBCdWlsZGVyT3B0aW9uc2Agb2JqZWN0IHVzZWQgdG8gY3JlYXRlIHRoaXMgYEJ1aWxkZXJgLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHsgJ3R5cGUnOiB0eXBlLCAnbnVsbFZhbHVlcyc6IG51bGxzIH0pIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBudW1iZXIgb2YgdmFsdWVzIHdyaXR0ZW4gdG8gdGhlIGBCdWlsZGVyYCB0aGF0IGhhdmVuJ3QgYmVlbiBmbHVzaGVkIHlldC5cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGBCdWlsZGVyLnByb3RvdHlwZS5maW5pc2goKWAgaGFzIGJlZW4gY2FsbGVkIG9uIHRoaXMgYEJ1aWxkZXJgLlxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgICAgICB0aGlzLm51bGxWYWx1ZXMgPSBudWxscztcbiAgICAgICAgdGhpcy5zdHJpZGUgPSBzdHJpZGVGb3JUeXBlKHR5cGUpO1xuICAgICAgICB0aGlzLl9udWxscyA9IG5ldyBCaXRtYXBCdWZmZXJCdWlsZGVyKCk7XG4gICAgICAgIGlmIChudWxscyAmJiBudWxscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9pc1ZhbGlkID0gY3JlYXRlSXNWYWxpZEZ1bmN0aW9uKG51bGxzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgc3RhdGljIHRocm91Z2hOb2RlKG9wdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcInRocm91Z2hOb2RlXCIgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50YCk7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBzdGF0aWMgdGhyb3VnaERPTShvcHRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJ0aHJvdWdoRE9NXCIgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50YCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZsdXNoIHRoZSBgQnVpbGRlcmAgYW5kIHJldHVybiBhIGBWZWN0b3I8VD5gLlxuICAgICAqIEByZXR1cm5zIHtWZWN0b3I8VD59IEEgYFZlY3RvcjxUPmAgb2YgdGhlIGZsdXNoZWQgdmFsdWVzLlxuICAgICAqL1xuICAgIHRvVmVjdG9yKCkgeyByZXR1cm4gbmV3IFZlY3RvcihbdGhpcy5mbHVzaCgpXSk7IH1cbiAgICBnZXQgQXJyYXlUeXBlKCkgeyByZXR1cm4gdGhpcy50eXBlLkFycmF5VHlwZTsgfVxuICAgIGdldCBudWxsQ291bnQoKSB7IHJldHVybiB0aGlzLl9udWxscy5udW1JbnZhbGlkOyB9XG4gICAgZ2V0IG51bUNoaWxkcmVuKCkgeyByZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgYWdncmVnYXRlIGxlbmd0aCAoaW4gYnl0ZXMpIG9mIHRoZSB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4gd3JpdHRlbi5cbiAgICAgKi9cbiAgICBnZXQgYnl0ZUxlbmd0aCgpIHtcbiAgICAgICAgbGV0IHNpemUgPSAwO1xuICAgICAgICBjb25zdCB7IF9vZmZzZXRzLCBfdmFsdWVzLCBfbnVsbHMsIF90eXBlSWRzLCBjaGlsZHJlbiB9ID0gdGhpcztcbiAgICAgICAgX29mZnNldHMgJiYgKHNpemUgKz0gX29mZnNldHMuYnl0ZUxlbmd0aCk7XG4gICAgICAgIF92YWx1ZXMgJiYgKHNpemUgKz0gX3ZhbHVlcy5ieXRlTGVuZ3RoKTtcbiAgICAgICAgX251bGxzICYmIChzaXplICs9IF9udWxscy5ieXRlTGVuZ3RoKTtcbiAgICAgICAgX3R5cGVJZHMgJiYgKHNpemUgKz0gX3R5cGVJZHMuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHJldHVybiBjaGlsZHJlbi5yZWR1Y2UoKHNpemUsIGNoaWxkKSA9PiBzaXplICsgY2hpbGQuYnl0ZUxlbmd0aCwgc2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRoZSBhZ2dyZWdhdGUgbnVtYmVyIG9mIHJvd3MgdGhhdCBoYXZlIGJlZW4gcmVzZXJ2ZWQgdG8gd3JpdGUgbmV3IHZhbHVlcy5cbiAgICAgKi9cbiAgICBnZXQgcmVzZXJ2ZWRMZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udWxscy5yZXNlcnZlZExlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIGFnZ3JlZ2F0ZSBsZW5ndGggKGluIGJ5dGVzKSB0aGF0IGhhcyBiZWVuIHJlc2VydmVkIHRvIHdyaXRlIG5ldyB2YWx1ZXMuXG4gICAgICovXG4gICAgZ2V0IHJlc2VydmVkQnl0ZUxlbmd0aCgpIHtcbiAgICAgICAgbGV0IHNpemUgPSAwO1xuICAgICAgICB0aGlzLl9vZmZzZXRzICYmIChzaXplICs9IHRoaXMuX29mZnNldHMucmVzZXJ2ZWRCeXRlTGVuZ3RoKTtcbiAgICAgICAgdGhpcy5fdmFsdWVzICYmIChzaXplICs9IHRoaXMuX3ZhbHVlcy5yZXNlcnZlZEJ5dGVMZW5ndGgpO1xuICAgICAgICB0aGlzLl9udWxscyAmJiAoc2l6ZSArPSB0aGlzLl9udWxscy5yZXNlcnZlZEJ5dGVMZW5ndGgpO1xuICAgICAgICB0aGlzLl90eXBlSWRzICYmIChzaXplICs9IHRoaXMuX3R5cGVJZHMucmVzZXJ2ZWRCeXRlTGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ucmVkdWNlKChzaXplLCBjaGlsZCkgPT4gc2l6ZSArIGNoaWxkLnJlc2VydmVkQnl0ZUxlbmd0aCwgc2l6ZSk7XG4gICAgfVxuICAgIGdldCB2YWx1ZU9mZnNldHMoKSB7IHJldHVybiB0aGlzLl9vZmZzZXRzID8gdGhpcy5fb2Zmc2V0cy5idWZmZXIgOiBudWxsOyB9XG4gICAgZ2V0IHZhbHVlcygpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlcyA/IHRoaXMuX3ZhbHVlcy5idWZmZXIgOiBudWxsOyB9XG4gICAgZ2V0IG51bGxCaXRtYXAoKSB7IHJldHVybiB0aGlzLl9udWxscyA/IHRoaXMuX251bGxzLmJ1ZmZlciA6IG51bGw7IH1cbiAgICBnZXQgdHlwZUlkcygpIHsgcmV0dXJuIHRoaXMuX3R5cGVJZHMgPyB0aGlzLl90eXBlSWRzLmJ1ZmZlciA6IG51bGw7IH1cbiAgICAvKipcbiAgICAgKiBBcHBlbmRzIGEgdmFsdWUgKG9yIG51bGwpIHRvIHRoaXMgYEJ1aWxkZXJgLlxuICAgICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byBgYnVpbGRlci5zZXQoYnVpbGRlci5sZW5ndGgsIHZhbHVlKWAuXG4gICAgICogQHBhcmFtIHtUWydUVmFsdWUnXSB8IFROdWxsIH0gdmFsdWUgVGhlIHZhbHVlIHRvIGFwcGVuZC5cbiAgICAgKi9cbiAgICBhcHBlbmQodmFsdWUpIHsgcmV0dXJuIHRoaXMuc2V0KHRoaXMubGVuZ3RoLCB2YWx1ZSk7IH1cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZXMgd2hldGhlciBhIHZhbHVlIGlzIHZhbGlkICh0cnVlKSwgb3IgbnVsbCAoZmFsc2UpXG4gICAgICogQHBhcmFtIHtUWydUVmFsdWUnXSB8IFROdWxsIH0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUgYWdhaW5zdCBudWxsIHRoZSB2YWx1ZSByZXByZXNlbnRhdGlvbnNcbiAgICAgKi9cbiAgICBpc1ZhbGlkKHZhbHVlKSB7IHJldHVybiB0aGlzLl9pc1ZhbGlkKHZhbHVlKTsgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgdmFsdWUgKG9yIG51bGwtdmFsdWUgc2VudGluZWwpIGF0IHRoZSBzdXBwbGllZCBpbmRleC5cbiAgICAgKiBJZiB0aGUgdmFsdWUgbWF0Y2hlcyBvbmUgb2YgdGhlIG51bGwtdmFsdWUgcmVwcmVzZW50YXRpb25zLCBhIDEtYml0IGlzXG4gICAgICogd3JpdHRlbiB0byB0aGUgbnVsbCBgQml0bWFwQnVmZmVyQnVpbGRlcmAuIE90aGVyd2lzZSwgYSAwIGlzIHdyaXR0ZW4gdG9cbiAgICAgKiB0aGUgbnVsbCBgQml0bWFwQnVmZmVyQnVpbGRlcmAsIGFuZCB0aGUgdmFsdWUgaXMgcGFzc2VkIHRvXG4gICAgICogYEJ1aWxkZXIucHJvdG90eXBlLnNldFZhbHVlKClgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSB7VFsnVFZhbHVlJ10gfCBUTnVsbCB9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cml0ZSBhdCB0aGUgc3VwcGxpZWQgaW5kZXguXG4gICAgICogQHJldHVybnMge3RoaXN9IFRoZSB1cGRhdGVkIGBCdWlsZGVyYCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBzZXQoaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnNldFZhbGlkKGluZGV4LCB0aGlzLmlzVmFsaWQodmFsdWUpKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShpbmRleCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIHZhbHVlIHRvIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlcnMgYXQgdGhlIHN1cHBsaWVkIGluZGV4LCBieXBhc3NpbmdcbiAgICAgKiB0aGUgbnVsbC12YWx1ZSBjaGVjay4gVGhpcyBpcyBhIGxvdy1sZXZlbCBtZXRob2QgdGhhdFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICAgICAqIEBwYXJhbSB7VFsnVFZhbHVlJ10gfCBUTnVsbCB9IHZhbHVlXG4gICAgICovXG4gICAgc2V0VmFsdWUoaW5kZXgsIHZhbHVlKSB7IHRoaXMuX3NldFZhbHVlKHRoaXMsIGluZGV4LCB2YWx1ZSk7IH1cbiAgICBzZXRWYWxpZChpbmRleCwgdmFsaWQpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLl9udWxscy5zZXQoaW5kZXgsICt2YWxpZCkubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBhZGRDaGlsZChjaGlsZCwgbmFtZSA9IGAke3RoaXMubnVtQ2hpbGRyZW59YCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBhcHBlbmQgY2hpbGRyZW4gdG8gbm9uLW5lc3RlZCB0eXBlIFwiJHt0aGlzLnR5cGV9XCJgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgdGhlIGNoaWxkIGBCdWlsZGVyYCBhdCB0aGUgc3VwcGxpZWQgYGluZGV4YCwgb3IgbnVsbCBpZiBubyBjaGlsZFxuICAgICAqIGV4aXN0cyBhdCB0aGF0IGluZGV4LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGNoaWxkIGBCdWlsZGVyYCB0byByZXRyaWV2ZS5cbiAgICAgKiBAcmV0dXJucyB7QnVpbGRlciB8IG51bGx9IFRoZSBjaGlsZCBCdWlsZGVyIGF0IHRoZSBzdXBwbGllZCBpbmRleCBvciBudWxsLlxuICAgICAqL1xuICAgIGdldENoaWxkQXQoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW5baW5kZXhdIHx8IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbW1pdCBhbGwgdGhlIHZhbHVlcyB0aGF0IGhhdmUgYmVlbiB3cml0dGVuIHRvIHRoZWlyIHVuZGVybHlpbmdcbiAgICAgKiBBcnJheUJ1ZmZlcnMsIGluY2x1ZGluZyBhbnkgY2hpbGQgQnVpbGRlcnMgaWYgYXBwbGljYWJsZSwgYW5kIHJlc2V0XG4gICAgICogdGhlIGludGVybmFsIGBCdWlsZGVyYCBzdGF0ZS5cbiAgICAgKiBAcmV0dXJucyBBIGBEYXRhPFQ+YCBvZiB0aGUgYnVmZmVycyBhbmQgY2hpbGRyZW4gcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgd3JpdHRlbi5cbiAgICAgKi9cbiAgICBmbHVzaCgpIHtcbiAgICAgICAgbGV0IGRhdGE7XG4gICAgICAgIGxldCB0eXBlSWRzO1xuICAgICAgICBsZXQgbnVsbEJpdG1hcDtcbiAgICAgICAgbGV0IHZhbHVlT2Zmc2V0cztcbiAgICAgICAgY29uc3QgeyB0eXBlLCBsZW5ndGgsIG51bGxDb3VudCwgX3R5cGVJZHMsIF9vZmZzZXRzLCBfdmFsdWVzLCBfbnVsbHMgfSA9IHRoaXM7XG4gICAgICAgIGlmICh0eXBlSWRzID0gX3R5cGVJZHMgPT09IG51bGwgfHwgX3R5cGVJZHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90eXBlSWRzLmZsdXNoKGxlbmd0aCkpIHsgLy8gVW5pb25zXG4gICAgICAgICAgICAvLyBEZW5zZVVuaW9uc1xuICAgICAgICAgICAgdmFsdWVPZmZzZXRzID0gX29mZnNldHMgPT09IG51bGwgfHwgX29mZnNldHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vZmZzZXRzLmZsdXNoKGxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWVPZmZzZXRzID0gX29mZnNldHMgPT09IG51bGwgfHwgX29mZnNldHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vZmZzZXRzLmZsdXNoKGxlbmd0aCkpIHsgLy8gVmFyaWFibGUtd2lkdGggcHJpbWl0aXZlcyAoQmluYXJ5LCBVdGY4KSwgYW5kIExpc3RzXG4gICAgICAgICAgICAvLyBCaW5hcnksIFV0ZjhcbiAgICAgICAgICAgIGRhdGEgPSBfdmFsdWVzID09PSBudWxsIHx8IF92YWx1ZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF92YWx1ZXMuZmx1c2goX29mZnNldHMubGFzdCgpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gRml4ZWQtd2lkdGggcHJpbWl0aXZlcyAoSW50LCBGbG9hdCwgRGVjaW1hbCwgVGltZSwgVGltZXN0YW1wLCBhbmQgSW50ZXJ2YWwpXG4gICAgICAgICAgICBkYXRhID0gX3ZhbHVlcyA9PT0gbnVsbCB8fCBfdmFsdWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdmFsdWVzLmZsdXNoKGxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG51bGxDb3VudCA+IDApIHtcbiAgICAgICAgICAgIG51bGxCaXRtYXAgPSBfbnVsbHMgPT09IG51bGwgfHwgX251bGxzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbnVsbHMuZmx1c2gobGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4ubWFwKChjaGlsZCkgPT4gY2hpbGQuZmx1c2goKSk7XG4gICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgcmV0dXJuIG1ha2VEYXRhKHtcbiAgICAgICAgICAgIHR5cGUsIGxlbmd0aCwgbnVsbENvdW50LFxuICAgICAgICAgICAgY2hpbGRyZW4sICdjaGlsZCc6IGNoaWxkcmVuWzBdLFxuICAgICAgICAgICAgZGF0YSwgdHlwZUlkcywgbnVsbEJpdG1hcCwgdmFsdWVPZmZzZXRzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmluYWxpemUgdGhpcyBgQnVpbGRlcmAsIGFuZCBjaGlsZCBidWlsZGVycyBpZiBhcHBsaWNhYmxlLlxuICAgICAqIEByZXR1cm5zIHt0aGlzfSBUaGUgZmluYWxpemVkIGBCdWlsZGVyYCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmaW5pc2goKSB7XG4gICAgICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pXG4gICAgICAgICAgICBjaGlsZC5maW5pc2goKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFyIHRoaXMgQnVpbGRlcidzIGludGVybmFsIHN0YXRlLCBpbmNsdWRpbmcgY2hpbGQgQnVpbGRlcnMgaWYgYXBwbGljYWJsZSwgYW5kIHJlc2V0IHRoZSBsZW5ndGggdG8gMC5cbiAgICAgKiBAcmV0dXJucyB7dGhpc30gVGhlIGNsZWFyZWQgYEJ1aWxkZXJgIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNsZWFyKCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICAgICAgKF9hID0gdGhpcy5fbnVsbHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jbGVhcigpO1xuICAgICAgICAoX2IgPSB0aGlzLl92YWx1ZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jbGVhcigpO1xuICAgICAgICAoX2MgPSB0aGlzLl9vZmZzZXRzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuY2xlYXIoKTtcbiAgICAgICAgKF9kID0gdGhpcy5fdHlwZUlkcykgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmNsZWFyKCk7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbilcbiAgICAgICAgICAgIGNoaWxkLmNsZWFyKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbkJ1aWxkZXIucHJvdG90eXBlLmxlbmd0aCA9IDE7XG5CdWlsZGVyLnByb3RvdHlwZS5zdHJpZGUgPSAxO1xuQnVpbGRlci5wcm90b3R5cGUuY2hpbGRyZW4gPSBudWxsO1xuQnVpbGRlci5wcm90b3R5cGUuZmluaXNoZWQgPSBmYWxzZTtcbkJ1aWxkZXIucHJvdG90eXBlLm51bGxWYWx1ZXMgPSBudWxsO1xuQnVpbGRlci5wcm90b3R5cGUuX2lzVmFsaWQgPSAoKSA9PiB0cnVlO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBGaXhlZFdpZHRoQnVpbGRlciBleHRlbmRzIEJ1aWxkZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IG5ldyBEYXRhQnVmZmVyQnVpbGRlcihuZXcgdGhpcy5BcnJheVR5cGUoMCksIHRoaXMuc3RyaWRlKTtcbiAgICB9XG4gICAgc2V0VmFsdWUoaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuX3ZhbHVlcztcbiAgICAgICAgdmFsdWVzLnJlc2VydmUoaW5kZXggLSB2YWx1ZXMubGVuZ3RoICsgMSk7XG4gICAgICAgIHJldHVybiBzdXBlci5zZXRWYWx1ZShpbmRleCwgdmFsdWUpO1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVmFyaWFibGVXaWR0aEJ1aWxkZXIgZXh0ZW5kcyBCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzLl9wZW5kaW5nTGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5fb2Zmc2V0cyA9IG5ldyBPZmZzZXRzQnVmZmVyQnVpbGRlcigpO1xuICAgIH1cbiAgICBzZXRWYWx1ZShpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMuX3BlbmRpbmcgfHwgKHRoaXMuX3BlbmRpbmcgPSBuZXcgTWFwKCkpO1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gcGVuZGluZy5nZXQoaW5kZXgpO1xuICAgICAgICBjdXJyZW50ICYmICh0aGlzLl9wZW5kaW5nTGVuZ3RoIC09IGN1cnJlbnQubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5fcGVuZGluZ0xlbmd0aCArPSAodmFsdWUgaW5zdGFuY2VvZiBNYXBSb3cpID8gdmFsdWVba0tleXNdLmxlbmd0aCA6IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgcGVuZGluZy5zZXQoaW5kZXgsIHZhbHVlKTtcbiAgICB9XG4gICAgc2V0VmFsaWQoaW5kZXgsIGlzVmFsaWQpIHtcbiAgICAgICAgaWYgKCFzdXBlci5zZXRWYWxpZChpbmRleCwgaXNWYWxpZCkpIHtcbiAgICAgICAgICAgICh0aGlzLl9wZW5kaW5nIHx8ICh0aGlzLl9wZW5kaW5nID0gbmV3IE1hcCgpKSkuc2V0KGluZGV4LCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5fcGVuZGluZ0xlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX3BlbmRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBzdXBlci5jbGVhcigpO1xuICAgIH1cbiAgICBmbHVzaCgpIHtcbiAgICAgICAgdGhpcy5fZmx1c2goKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmZsdXNoKCk7XG4gICAgfVxuICAgIGZpbmlzaCgpIHtcbiAgICAgICAgdGhpcy5fZmx1c2goKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmZpbmlzaCgpO1xuICAgIH1cbiAgICBfZmx1c2goKSB7XG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLl9wZW5kaW5nO1xuICAgICAgICBjb25zdCBwZW5kaW5nTGVuZ3RoID0gdGhpcy5fcGVuZGluZ0xlbmd0aDtcbiAgICAgICAgdGhpcy5fcGVuZGluZ0xlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX3BlbmRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChwZW5kaW5nICYmIHBlbmRpbmcuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2ZsdXNoUGVuZGluZyhwZW5kaW5nLCBwZW5kaW5nTGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJ1aWxkZXIubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyB0b1VpbnQ4QXJyYXkgfSBmcm9tICcuLi91dGlsL2J1ZmZlci5tanMnO1xuaW1wb3J0IHsgQnVmZmVyQnVpbGRlciB9IGZyb20gJy4vYnVmZmVyLm1qcyc7XG5pbXBvcnQgeyBWYXJpYWJsZVdpZHRoQnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgQmluYXJ5QnVpbGRlciBleHRlbmRzIFZhcmlhYmxlV2lkdGhCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzLl92YWx1ZXMgPSBuZXcgQnVmZmVyQnVpbGRlcihuZXcgVWludDhBcnJheSgwKSk7XG4gICAgfVxuICAgIGdldCBieXRlTGVuZ3RoKCkge1xuICAgICAgICBsZXQgc2l6ZSA9IHRoaXMuX3BlbmRpbmdMZW5ndGggKyAodGhpcy5sZW5ndGggKiA0KTtcbiAgICAgICAgdGhpcy5fb2Zmc2V0cyAmJiAoc2l6ZSArPSB0aGlzLl9vZmZzZXRzLmJ5dGVMZW5ndGgpO1xuICAgICAgICB0aGlzLl92YWx1ZXMgJiYgKHNpemUgKz0gdGhpcy5fdmFsdWVzLmJ5dGVMZW5ndGgpO1xuICAgICAgICB0aGlzLl9udWxscyAmJiAoc2l6ZSArPSB0aGlzLl9udWxscy5ieXRlTGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgfVxuICAgIHNldFZhbHVlKGluZGV4LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gc3VwZXIuc2V0VmFsdWUoaW5kZXgsIHRvVWludDhBcnJheSh2YWx1ZSkpO1xuICAgIH1cbiAgICBfZmx1c2hQZW5kaW5nKHBlbmRpbmcsIHBlbmRpbmdMZW5ndGgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0cyA9IHRoaXMuX29mZnNldHM7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl92YWx1ZXMucmVzZXJ2ZShwZW5kaW5nTGVuZ3RoKS5idWZmZXI7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgdmFsdWVdIG9mIHBlbmRpbmcpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0cy5zZXQoaW5kZXgsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGRhdGEuc2V0KHZhbHVlLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIG9mZnNldHMuc2V0KGluZGV4LCBsZW5ndGgpO1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSBsZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJpbmFyeS5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IEJpdG1hcEJ1ZmZlckJ1aWxkZXIgfSBmcm9tICcuL2J1ZmZlci5tanMnO1xuaW1wb3J0IHsgQnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgQm9vbEJ1aWxkZXIgZXh0ZW5kcyBCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLl92YWx1ZXMgPSBuZXcgQml0bWFwQnVmZmVyQnVpbGRlcigpO1xuICAgIH1cbiAgICBzZXRWYWx1ZShpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fdmFsdWVzLnNldChpbmRleCwgK3ZhbHVlKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJvb2wubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBtZW1jcHkgfSBmcm9tICcuLi91dGlsL2J1ZmZlci5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IHJvdW5kTGVuZ3RoVXBUb05lYXJlc3Q2NEJ5dGVzID0gKGxlbiwgQlBFKSA9PiAoKCgobGVuICogQlBFKSArIDYzKSAmIH42MykgfHwgNjQpIC8gQlBFO1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IHNsaWNlT3JFeHRlbmRBcnJheSA9IChhcnIsIGxlbiA9IDApID0+IChhcnIubGVuZ3RoID49IGxlbiA/IGFyci5zdWJhcnJheSgwLCBsZW4pIDogbWVtY3B5KG5ldyBhcnIuY29uc3RydWN0b3IobGVuKSwgYXJyLCAwKSk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEJ1ZmZlckJ1aWxkZXIge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlciwgc3RyaWRlID0gMSkge1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgICAgdGhpcy5zdHJpZGUgPSBzdHJpZGU7XG4gICAgICAgIHRoaXMuQllURVNfUEVSX0VMRU1FTlQgPSBidWZmZXIuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgIHRoaXMuQXJyYXlUeXBlID0gYnVmZmVyLmNvbnN0cnVjdG9yO1xuICAgICAgICB0aGlzLl9yZXNpemUodGhpcy5sZW5ndGggPSBNYXRoLnRydW5jKGJ1ZmZlci5sZW5ndGggLyBzdHJpZGUpKTtcbiAgICB9XG4gICAgZ2V0IGJ5dGVMZW5ndGgoKSB7IHJldHVybiBNYXRoLnRydW5jKHRoaXMubGVuZ3RoICogdGhpcy5zdHJpZGUgKiB0aGlzLkJZVEVTX1BFUl9FTEVNRU5UKTsgfVxuICAgIGdldCByZXNlcnZlZExlbmd0aCgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyLmxlbmd0aCAvIHRoaXMuc3RyaWRlOyB9XG4gICAgZ2V0IHJlc2VydmVkQnl0ZUxlbmd0aCgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGg7IH1cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgc2V0KGluZGV4LCB2YWx1ZSkgeyByZXR1cm4gdGhpczsgfVxuICAgIGFwcGVuZCh2YWx1ZSkgeyByZXR1cm4gdGhpcy5zZXQodGhpcy5sZW5ndGgsIHZhbHVlKTsgfVxuICAgIHJlc2VydmUoZXh0cmEpIHtcbiAgICAgICAgaWYgKGV4dHJhID4gMCkge1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggKz0gZXh0cmE7XG4gICAgICAgICAgICBjb25zdCBzdHJpZGUgPSB0aGlzLnN0cmlkZTtcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMubGVuZ3RoICogc3RyaWRlO1xuICAgICAgICAgICAgY29uc3QgcmVzZXJ2ZWQgPSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgICAgICAgICBpZiAobGVuZ3RoID49IHJlc2VydmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzaXplKHJlc2VydmVkID09PSAwXG4gICAgICAgICAgICAgICAgICAgID8gcm91bmRMZW5ndGhVcFRvTmVhcmVzdDY0Qnl0ZXMobGVuZ3RoICogMSwgdGhpcy5CWVRFU19QRVJfRUxFTUVOVClcbiAgICAgICAgICAgICAgICAgICAgOiByb3VuZExlbmd0aFVwVG9OZWFyZXN0NjRCeXRlcyhsZW5ndGggKiAyLCB0aGlzLkJZVEVTX1BFUl9FTEVNRU5UKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGZsdXNoKGxlbmd0aCA9IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgIGxlbmd0aCA9IHJvdW5kTGVuZ3RoVXBUb05lYXJlc3Q2NEJ5dGVzKGxlbmd0aCAqIHRoaXMuc3RyaWRlLCB0aGlzLkJZVEVTX1BFUl9FTEVNRU5UKTtcbiAgICAgICAgY29uc3QgYXJyYXkgPSBzbGljZU9yRXh0ZW5kQXJyYXkodGhpcy5idWZmZXIsIGxlbmd0aCk7XG4gICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl9yZXNpemUoMCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBfcmVzaXplKG5ld0xlbmd0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIgPSBtZW1jcHkobmV3IHRoaXMuQXJyYXlUeXBlKG5ld0xlbmd0aCksIHRoaXMuYnVmZmVyKTtcbiAgICB9XG59XG5CdWZmZXJCdWlsZGVyLnByb3RvdHlwZS5vZmZzZXQgPSAwO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBEYXRhQnVmZmVyQnVpbGRlciBleHRlbmRzIEJ1ZmZlckJ1aWxkZXIge1xuICAgIGxhc3QoKSB7IHJldHVybiB0aGlzLmdldCh0aGlzLmxlbmd0aCAtIDEpOyB9XG4gICAgZ2V0KGluZGV4KSB7IHJldHVybiB0aGlzLmJ1ZmZlcltpbmRleF07IH1cbiAgICBzZXQoaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMucmVzZXJ2ZShpbmRleCAtIHRoaXMubGVuZ3RoICsgMSk7XG4gICAgICAgIHRoaXMuYnVmZmVyW2luZGV4ICogdGhpcy5zdHJpZGVdID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgQml0bWFwQnVmZmVyQnVpbGRlciBleHRlbmRzIERhdGFCdWZmZXJCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhID0gbmV3IFVpbnQ4QXJyYXkoMCkpIHtcbiAgICAgICAgc3VwZXIoZGF0YSwgMSAvIDgpO1xuICAgICAgICB0aGlzLm51bVZhbGlkID0gMDtcbiAgICB9XG4gICAgZ2V0IG51bUludmFsaWQoKSB7IHJldHVybiB0aGlzLmxlbmd0aCAtIHRoaXMubnVtVmFsaWQ7IH1cbiAgICBnZXQoaWR4KSB7IHJldHVybiB0aGlzLmJ1ZmZlcltpZHggPj4gM10gPj4gaWR4ICUgOCAmIDE7IH1cbiAgICBzZXQoaWR4LCB2YWwpIHtcbiAgICAgICAgY29uc3QgeyBidWZmZXIgfSA9IHRoaXMucmVzZXJ2ZShpZHggLSB0aGlzLmxlbmd0aCArIDEpO1xuICAgICAgICBjb25zdCBieXRlID0gaWR4ID4+IDMsIGJpdCA9IGlkeCAlIDgsIGN1ciA9IGJ1ZmZlcltieXRlXSA+PiBiaXQgJiAxO1xuICAgICAgICAvLyBJZiBgdmFsYCBpcyB0cnV0aHkgYW5kIHRoZSBjdXJyZW50IGJpdCBpcyAwLCBmbGlwIGl0IHRvIDEgYW5kIGluY3JlbWVudCBgbnVtVmFsaWRgLlxuICAgICAgICAvLyBJZiBgdmFsYCBpcyBmYWxzZXkgYW5kIHRoZSBjdXJyZW50IGJpdCBpcyAxLCBmbGlwIGl0IHRvIDAgYW5kIGRlY3JlbWVudCBgbnVtVmFsaWRgLlxuICAgICAgICB2YWwgPyBjdXIgPT09IDAgJiYgKChidWZmZXJbYnl0ZV0gfD0gKDEgPDwgYml0KSksICsrdGhpcy5udW1WYWxpZClcbiAgICAgICAgICAgIDogY3VyID09PSAxICYmICgoYnVmZmVyW2J5dGVdICY9IH4oMSA8PCBiaXQpKSwgLS10aGlzLm51bVZhbGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLm51bVZhbGlkID0gMDtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmNsZWFyKCk7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBPZmZzZXRzQnVmZmVyQnVpbGRlciBleHRlbmRzIERhdGFCdWZmZXJCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhID0gbmV3IEludDMyQXJyYXkoMSkpIHsgc3VwZXIoZGF0YSwgMSk7IH1cbiAgICBhcHBlbmQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0KHRoaXMubGVuZ3RoIC0gMSwgdmFsdWUpO1xuICAgIH1cbiAgICBzZXQoaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMubGVuZ3RoIC0gMTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5yZXNlcnZlKGluZGV4IC0gb2Zmc2V0ICsgMSkuYnVmZmVyO1xuICAgICAgICBpZiAob2Zmc2V0IDwgaW5kZXgrKykge1xuICAgICAgICAgICAgYnVmZmVyLmZpbGwoYnVmZmVyW29mZnNldF0sIG9mZnNldCwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlcltpbmRleF0gPSBidWZmZXJbaW5kZXggLSAxXSArIHZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZmx1c2gobGVuZ3RoID0gdGhpcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIGlmIChsZW5ndGggPiB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5zZXQobGVuZ3RoIC0gMSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLmZsdXNoKGxlbmd0aCArIDEpO1xuICAgIH1cbn1cbi8vIC8qKiBAaWdub3JlICovXG4vLyBleHBvcnQgY2xhc3MgV2lkZUJ1ZmZlckJ1aWxkZXI8VCBleHRlbmRzIFR5cGVkQXJyYXksIFIgZXh0ZW5kcyBCaWdJbnRBcnJheT4gZXh0ZW5kcyBCdWZmZXJCdWlsZGVyPFQsIERhdGFWYWx1ZTxUPj4ge1xuLy8gICAgIHB1YmxpYyBidWZmZXI2NCE6IFI7XG4vLyAgICAgcHJvdGVjdGVkIF9BcnJheVR5cGU2NCE6IEJpZ0ludEFycmF5Q29uc3RydWN0b3I8Uj47XG4vLyAgICAgcHVibGljIGdldCBBcnJheVR5cGU2NCgpIHtcbi8vICAgICAgICAgcmV0dXJuIHRoaXMuX0FycmF5VHlwZTY0IHx8ICh0aGlzLl9BcnJheVR5cGU2NCA9IDxCaWdJbnRBcnJheUNvbnN0cnVjdG9yPFI+PiAodGhpcy5idWZmZXIgaW5zdGFuY2VvZiBJbnQzMkFycmF5ID8gQmlnSW50NjRBcnJheSA6IEJpZ1VpbnQ2NEFycmF5KSk7XG4vLyAgICAgfVxuLy8gICAgIHB1YmxpYyBzZXQoaW5kZXg6IG51bWJlciwgdmFsdWU6IERhdGFWYWx1ZTxUPikge1xuLy8gICAgICAgICB0aGlzLnJlc2VydmUoaW5kZXggLSB0aGlzLmxlbmd0aCArIDEpO1xuLy8gICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuLy8gICAgICAgICAgICAgY2FzZSAnYmlnaW50JzogdGhpcy5idWZmZXI2NFtpbmRleF0gPSB2YWx1ZTsgYnJlYWs7XG4vLyAgICAgICAgICAgICBjYXNlICdudW1iZXInOiB0aGlzLmJ1ZmZlcltpbmRleCAqIHRoaXMuc3RyaWRlXSA9IHZhbHVlOyBicmVhaztcbi8vICAgICAgICAgICAgIGRlZmF1bHQ6IHRoaXMuYnVmZmVyLnNldCh2YWx1ZSBhcyBUeXBlZEFycmF5LCBpbmRleCAqIHRoaXMuc3RyaWRlKTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgICByZXR1cm4gdGhpcztcbi8vICAgICB9XG4vLyAgICAgcHJvdGVjdGVkIF9yZXNpemUobmV3TGVuZ3RoOiBudW1iZXIpIHtcbi8vICAgICAgICAgY29uc3QgZGF0YSA9IHN1cGVyLl9yZXNpemUobmV3TGVuZ3RoKTtcbi8vICAgICAgICAgY29uc3QgbGVuZ3RoID0gZGF0YS5ieXRlTGVuZ3RoIC8gKHRoaXMuQllURVNfUEVSX0VMRU1FTlQgKiB0aGlzLnN0cmlkZSk7XG4vLyAgICAgICAgIGlmIChCaWdJbnRBdmFpbGFibGUpIHtcbi8vICAgICAgICAgICAgIHRoaXMuYnVmZmVyNjQgPSBuZXcgdGhpcy5BcnJheVR5cGU2NChkYXRhLmJ1ZmZlciwgZGF0YS5ieXRlT2Zmc2V0LCBsZW5ndGgpO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHJldHVybiBkYXRhO1xuLy8gICAgIH1cbi8vIH1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnVmZmVyLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgRml4ZWRXaWR0aEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyLm1qcyc7XG5pbXBvcnQgeyBzZXREYXRlLCBzZXREYXRlRGF5LCBzZXREYXRlTWlsbGlzZWNvbmQgfSBmcm9tICcuLi92aXNpdG9yL3NldC5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBEYXRlQnVpbGRlciBleHRlbmRzIEZpeGVkV2lkdGhCdWlsZGVyIHtcbn1cbkRhdGVCdWlsZGVyLnByb3RvdHlwZS5fc2V0VmFsdWUgPSBzZXREYXRlO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBEYXRlRGF5QnVpbGRlciBleHRlbmRzIERhdGVCdWlsZGVyIHtcbn1cbkRhdGVEYXlCdWlsZGVyLnByb3RvdHlwZS5fc2V0VmFsdWUgPSBzZXREYXRlRGF5O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBEYXRlTWlsbGlzZWNvbmRCdWlsZGVyIGV4dGVuZHMgRGF0ZUJ1aWxkZXIge1xufVxuRGF0ZU1pbGxpc2Vjb25kQnVpbGRlci5wcm90b3R5cGUuX3NldFZhbHVlID0gc2V0RGF0ZU1pbGxpc2Vjb25kO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRlLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgRml4ZWRXaWR0aEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyLm1qcyc7XG5pbXBvcnQgeyBzZXREZWNpbWFsIH0gZnJvbSAnLi4vdmlzaXRvci9zZXQubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgRGVjaW1hbEJ1aWxkZXIgZXh0ZW5kcyBGaXhlZFdpZHRoQnVpbGRlciB7XG59XG5EZWNpbWFsQnVpbGRlci5wcm90b3R5cGUuX3NldFZhbHVlID0gc2V0RGVjaW1hbDtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVjaW1hbC5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IERpY3Rpb25hcnkgfSBmcm9tICcuLi90eXBlLm1qcyc7XG5pbXBvcnQgeyBCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci5tanMnO1xuaW1wb3J0IHsgbWFrZUJ1aWxkZXIgfSBmcm9tICcuLi9mYWN0b3JpZXMubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgRGljdGlvbmFyeUJ1aWxkZXIgZXh0ZW5kcyBCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih7ICd0eXBlJzogdHlwZSwgJ251bGxWYWx1ZXMnOiBudWxscywgJ2RpY3Rpb25hcnlIYXNoRnVuY3Rpb24nOiBoYXNoRm4gfSkge1xuICAgICAgICBzdXBlcih7IHR5cGU6IG5ldyBEaWN0aW9uYXJ5KHR5cGUuZGljdGlvbmFyeSwgdHlwZS5pbmRpY2VzLCB0eXBlLmlkLCB0eXBlLmlzT3JkZXJlZCkgfSk7XG4gICAgICAgIHRoaXMuX251bGxzID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZGljdGlvbmFyeU9mZnNldCA9IDA7XG4gICAgICAgIHRoaXMuX2tleXNUb0luZGljZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLmluZGljZXMgPSBtYWtlQnVpbGRlcih7ICd0eXBlJzogdGhpcy50eXBlLmluZGljZXMsICdudWxsVmFsdWVzJzogbnVsbHMgfSk7XG4gICAgICAgIHRoaXMuZGljdGlvbmFyeSA9IG1ha2VCdWlsZGVyKHsgJ3R5cGUnOiB0aGlzLnR5cGUuZGljdGlvbmFyeSwgJ251bGxWYWx1ZXMnOiBudWxsIH0pO1xuICAgICAgICBpZiAodHlwZW9mIGhhc2hGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy52YWx1ZVRvS2V5ID0gaGFzaEZuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCB2YWx1ZXMoKSB7IHJldHVybiB0aGlzLmluZGljZXMudmFsdWVzOyB9XG4gICAgZ2V0IG51bGxDb3VudCgpIHsgcmV0dXJuIHRoaXMuaW5kaWNlcy5udWxsQ291bnQ7IH1cbiAgICBnZXQgbnVsbEJpdG1hcCgpIHsgcmV0dXJuIHRoaXMuaW5kaWNlcy5udWxsQml0bWFwOyB9XG4gICAgZ2V0IGJ5dGVMZW5ndGgoKSB7IHJldHVybiB0aGlzLmluZGljZXMuYnl0ZUxlbmd0aCArIHRoaXMuZGljdGlvbmFyeS5ieXRlTGVuZ3RoOyB9XG4gICAgZ2V0IHJlc2VydmVkTGVuZ3RoKCkgeyByZXR1cm4gdGhpcy5pbmRpY2VzLnJlc2VydmVkTGVuZ3RoICsgdGhpcy5kaWN0aW9uYXJ5LnJlc2VydmVkTGVuZ3RoOyB9XG4gICAgZ2V0IHJlc2VydmVkQnl0ZUxlbmd0aCgpIHsgcmV0dXJuIHRoaXMuaW5kaWNlcy5yZXNlcnZlZEJ5dGVMZW5ndGggKyB0aGlzLmRpY3Rpb25hcnkucmVzZXJ2ZWRCeXRlTGVuZ3RoOyB9XG4gICAgaXNWYWxpZCh2YWx1ZSkgeyByZXR1cm4gdGhpcy5pbmRpY2VzLmlzVmFsaWQodmFsdWUpOyB9XG4gICAgc2V0VmFsaWQoaW5kZXgsIHZhbGlkKSB7XG4gICAgICAgIGNvbnN0IGluZGljZXMgPSB0aGlzLmluZGljZXM7XG4gICAgICAgIHZhbGlkID0gaW5kaWNlcy5zZXRWYWxpZChpbmRleCwgdmFsaWQpO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGluZGljZXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxuICAgIHNldFZhbHVlKGluZGV4LCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBrZXlzVG9JbmRpY2VzID0gdGhpcy5fa2V5c1RvSW5kaWNlcztcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy52YWx1ZVRvS2V5KHZhbHVlKTtcbiAgICAgICAgbGV0IGlkeCA9IGtleXNUb0luZGljZXNba2V5XTtcbiAgICAgICAgaWYgKGlkeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBrZXlzVG9JbmRpY2VzW2tleV0gPSBpZHggPSB0aGlzLl9kaWN0aW9uYXJ5T2Zmc2V0ICsgdGhpcy5kaWN0aW9uYXJ5LmFwcGVuZCh2YWx1ZSkubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pbmRpY2VzLnNldFZhbHVlKGluZGV4LCBpZHgpO1xuICAgIH1cbiAgICBmbHVzaCgpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZTtcbiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMuX2RpY3Rpb25hcnk7XG4gICAgICAgIGNvbnN0IGN1cnIgPSB0aGlzLmRpY3Rpb25hcnkudG9WZWN0b3IoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuaW5kaWNlcy5mbHVzaCgpLmNsb25lKHR5cGUpO1xuICAgICAgICBkYXRhLmRpY3Rpb25hcnkgPSBwcmV2ID8gcHJldi5jb25jYXQoY3VycikgOiBjdXJyO1xuICAgICAgICB0aGlzLmZpbmlzaGVkIHx8ICh0aGlzLl9kaWN0aW9uYXJ5T2Zmc2V0ICs9IGN1cnIubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5fZGljdGlvbmFyeSA9IGRhdGEuZGljdGlvbmFyeTtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgZmluaXNoKCkge1xuICAgICAgICB0aGlzLmluZGljZXMuZmluaXNoKCk7XG4gICAgICAgIHRoaXMuZGljdGlvbmFyeS5maW5pc2goKTtcbiAgICAgICAgdGhpcy5fZGljdGlvbmFyeU9mZnNldCA9IDA7XG4gICAgICAgIHRoaXMuX2tleXNUb0luZGljZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICByZXR1cm4gc3VwZXIuZmluaXNoKCk7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmluZGljZXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5LmNsZWFyKCk7XG4gICAgICAgIHJldHVybiBzdXBlci5jbGVhcigpO1xuICAgIH1cbiAgICB2YWx1ZVRvS2V5KHZhbCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyB2YWwgOiBgJHt2YWx9YDtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpY3Rpb25hcnkubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBGaXhlZFdpZHRoQnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIubWpzJztcbmltcG9ydCB7IHNldEZpeGVkU2l6ZUJpbmFyeSB9IGZyb20gJy4uL3Zpc2l0b3Ivc2V0Lm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEZpeGVkU2l6ZUJpbmFyeUJ1aWxkZXIgZXh0ZW5kcyBGaXhlZFdpZHRoQnVpbGRlciB7XG59XG5GaXhlZFNpemVCaW5hcnlCdWlsZGVyLnByb3RvdHlwZS5fc2V0VmFsdWUgPSBzZXRGaXhlZFNpemVCaW5hcnk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpeGVkc2l6ZWJpbmFyeS5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi4vc2NoZW1hLm1qcyc7XG5pbXBvcnQgeyBCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci5tanMnO1xuaW1wb3J0IHsgRml4ZWRTaXplTGlzdCB9IGZyb20gJy4uL3R5cGUubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgRml4ZWRTaXplTGlzdEJ1aWxkZXIgZXh0ZW5kcyBCdWlsZGVyIHtcbiAgICBzZXRWYWx1ZShpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgW2NoaWxkXSA9IHRoaXMuY2hpbGRyZW47XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gaW5kZXggKiB0aGlzLnN0cmlkZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IC0xLCBuID0gdmFsdWUubGVuZ3RoOyArK2kgPCBuOykge1xuICAgICAgICAgICAgY2hpbGQuc2V0KHN0YXJ0ICsgaSwgdmFsdWVbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZENoaWxkKGNoaWxkLCBuYW1lID0gJzAnKSB7XG4gICAgICAgIGlmICh0aGlzLm51bUNoaWxkcmVuID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaXhlZFNpemVMaXN0QnVpbGRlciBjYW4gb25seSBoYXZlIG9uZSBjaGlsZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGlsZEluZGV4ID0gdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgICAgdGhpcy50eXBlID0gbmV3IEZpeGVkU2l6ZUxpc3QodGhpcy50eXBlLmxpc3RTaXplLCBuZXcgRmllbGQobmFtZSwgY2hpbGQudHlwZSwgdHJ1ZSkpO1xuICAgICAgICByZXR1cm4gY2hpbGRJbmRleDtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpeGVkc2l6ZWxpc3QubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBmbG9hdDY0VG9VaW50MTYgfSBmcm9tICcuLi91dGlsL21hdGgubWpzJztcbmltcG9ydCB7IEZpeGVkV2lkdGhCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBGbG9hdEJ1aWxkZXIgZXh0ZW5kcyBGaXhlZFdpZHRoQnVpbGRlciB7XG4gICAgc2V0VmFsdWUoaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5zZXQoaW5kZXgsIHZhbHVlKTtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEZsb2F0MTZCdWlsZGVyIGV4dGVuZHMgRmxvYXRCdWlsZGVyIHtcbiAgICBzZXRWYWx1ZShpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgLy8gY29udmVydCBKUyBmbG9hdDY0IHRvIGEgdWludDE2XG4gICAgICAgIHN1cGVyLnNldFZhbHVlKGluZGV4LCBmbG9hdDY0VG9VaW50MTYodmFsdWUpKTtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEZsb2F0MzJCdWlsZGVyIGV4dGVuZHMgRmxvYXRCdWlsZGVyIHtcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgRmxvYXQ2NEJ1aWxkZXIgZXh0ZW5kcyBGbG9hdEJ1aWxkZXIge1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1mbG9hdC5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IEZpeGVkV2lkdGhCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBJbnRCdWlsZGVyIGV4dGVuZHMgRml4ZWRXaWR0aEJ1aWxkZXIge1xuICAgIHNldFZhbHVlKGluZGV4LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLl92YWx1ZXMuc2V0KGluZGV4LCB2YWx1ZSk7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBJbnQ4QnVpbGRlciBleHRlbmRzIEludEJ1aWxkZXIge1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBJbnQxNkJ1aWxkZXIgZXh0ZW5kcyBJbnRCdWlsZGVyIHtcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgSW50MzJCdWlsZGVyIGV4dGVuZHMgSW50QnVpbGRlciB7XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEludDY0QnVpbGRlciBleHRlbmRzIEludEJ1aWxkZXIge1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBVaW50OEJ1aWxkZXIgZXh0ZW5kcyBJbnRCdWlsZGVyIHtcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVWludDE2QnVpbGRlciBleHRlbmRzIEludEJ1aWxkZXIge1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBVaW50MzJCdWlsZGVyIGV4dGVuZHMgSW50QnVpbGRlciB7XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFVpbnQ2NEJ1aWxkZXIgZXh0ZW5kcyBJbnRCdWlsZGVyIHtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW50Lm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgRml4ZWRXaWR0aEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyLm1qcyc7XG5pbXBvcnQgeyBzZXRJbnRlcnZhbFZhbHVlLCBzZXRJbnRlcnZhbERheVRpbWUsIHNldEludGVydmFsWWVhck1vbnRoIH0gZnJvbSAnLi4vdmlzaXRvci9zZXQubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgSW50ZXJ2YWxCdWlsZGVyIGV4dGVuZHMgRml4ZWRXaWR0aEJ1aWxkZXIge1xufVxuSW50ZXJ2YWxCdWlsZGVyLnByb3RvdHlwZS5fc2V0VmFsdWUgPSBzZXRJbnRlcnZhbFZhbHVlO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBJbnRlcnZhbERheVRpbWVCdWlsZGVyIGV4dGVuZHMgSW50ZXJ2YWxCdWlsZGVyIHtcbn1cbkludGVydmFsRGF5VGltZUJ1aWxkZXIucHJvdG90eXBlLl9zZXRWYWx1ZSA9IHNldEludGVydmFsRGF5VGltZTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgSW50ZXJ2YWxZZWFyTW9udGhCdWlsZGVyIGV4dGVuZHMgSW50ZXJ2YWxCdWlsZGVyIHtcbn1cbkludGVydmFsWWVhck1vbnRoQnVpbGRlci5wcm90b3R5cGUuX3NldFZhbHVlID0gc2V0SW50ZXJ2YWxZZWFyTW9udGg7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWludGVydmFsLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuLi9zY2hlbWEubWpzJztcbmltcG9ydCB7IExpc3QgfSBmcm9tICcuLi90eXBlLm1qcyc7XG5pbXBvcnQgeyBPZmZzZXRzQnVmZmVyQnVpbGRlciB9IGZyb20gJy4vYnVmZmVyLm1qcyc7XG5pbXBvcnQgeyBWYXJpYWJsZVdpZHRoQnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgTGlzdEJ1aWxkZXIgZXh0ZW5kcyBWYXJpYWJsZVdpZHRoQnVpbGRlciB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy5fb2Zmc2V0cyA9IG5ldyBPZmZzZXRzQnVmZmVyQnVpbGRlcigpO1xuICAgIH1cbiAgICBhZGRDaGlsZChjaGlsZCwgbmFtZSA9ICcwJykge1xuICAgICAgICBpZiAodGhpcy5udW1DaGlsZHJlbiA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTGlzdEJ1aWxkZXIgY2FuIG9ubHkgaGF2ZSBvbmUgY2hpbGQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGlsZHJlblt0aGlzLm51bUNoaWxkcmVuXSA9IGNoaWxkO1xuICAgICAgICB0aGlzLnR5cGUgPSBuZXcgTGlzdChuZXcgRmllbGQobmFtZSwgY2hpbGQudHlwZSwgdHJ1ZSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5udW1DaGlsZHJlbiAtIDE7XG4gICAgfVxuICAgIF9mbHVzaFBlbmRpbmcocGVuZGluZykge1xuICAgICAgICBjb25zdCBvZmZzZXRzID0gdGhpcy5fb2Zmc2V0cztcbiAgICAgICAgY29uc3QgW2NoaWxkXSA9IHRoaXMuY2hpbGRyZW47XG4gICAgICAgIGZvciAoY29uc3QgW2luZGV4LCB2YWx1ZV0gb2YgcGVuZGluZykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXRzLnNldChpbmRleCwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gb2Zmc2V0cy5zZXQoaW5kZXgsIG4pLmJ1ZmZlcltpbmRleF07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IC0xOyArK2kgPCBuOykge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5zZXQoc3RhcnQgKyBpLCB2YWx1ZVtpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1saXN0Lm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuLi9zY2hlbWEubWpzJztcbmltcG9ydCB7IE1hcF8gfSBmcm9tICcuLi90eXBlLm1qcyc7XG5pbXBvcnQgeyBWYXJpYWJsZVdpZHRoQnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgTWFwQnVpbGRlciBleHRlbmRzIFZhcmlhYmxlV2lkdGhCdWlsZGVyIHtcbiAgICBzZXQoaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5zZXQoaW5kZXgsIHZhbHVlKTtcbiAgICB9XG4gICAgc2V0VmFsdWUoaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHJvdyA9ICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCA/IHZhbHVlIDogbmV3IE1hcChPYmplY3QuZW50cmllcyh2YWx1ZSkpKTtcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMuX3BlbmRpbmcgfHwgKHRoaXMuX3BlbmRpbmcgPSBuZXcgTWFwKCkpO1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gcGVuZGluZy5nZXQoaW5kZXgpO1xuICAgICAgICBjdXJyZW50ICYmICh0aGlzLl9wZW5kaW5nTGVuZ3RoIC09IGN1cnJlbnQuc2l6ZSk7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdMZW5ndGggKz0gcm93LnNpemU7XG4gICAgICAgIHBlbmRpbmcuc2V0KGluZGV4LCByb3cpO1xuICAgIH1cbiAgICBhZGRDaGlsZChjaGlsZCwgbmFtZSA9IGAke3RoaXMubnVtQ2hpbGRyZW59YCkge1xuICAgICAgICBpZiAodGhpcy5udW1DaGlsZHJlbiA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTGlzdEJ1aWxkZXIgY2FuIG9ubHkgaGF2ZSBvbmUgY2hpbGQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGlsZHJlblt0aGlzLm51bUNoaWxkcmVuXSA9IGNoaWxkO1xuICAgICAgICB0aGlzLnR5cGUgPSBuZXcgTWFwXyhuZXcgRmllbGQobmFtZSwgY2hpbGQudHlwZSwgdHJ1ZSksIHRoaXMudHlwZS5rZXlzU29ydGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubnVtQ2hpbGRyZW4gLSAxO1xuICAgIH1cbiAgICBfZmx1c2hQZW5kaW5nKHBlbmRpbmcpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0cyA9IHRoaXMuX29mZnNldHM7XG4gICAgICAgIGNvbnN0IFtjaGlsZF0gPSB0aGlzLmNoaWxkcmVuO1xuICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgdmFsdWVdIG9mIHBlbmRpbmcpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0cy5zZXQoaW5kZXgsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgW2luZGV4XTogaWR4LCBbaW5kZXggKyAxXTogZW5kIH0gPSBvZmZzZXRzLnNldChpbmRleCwgdmFsdWUuc2l6ZSkuYnVmZmVyO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsIG9mIHZhbHVlLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5zZXQoaWR4LCB2YWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKytpZHggPj0gZW5kKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXAubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBOdWxsQnVpbGRlciBleHRlbmRzIEJ1aWxkZXIge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBzZXRWYWx1ZShpbmRleCwgdmFsdWUpIHsgfVxuICAgIHNldFZhbGlkKGluZGV4LCB2YWxpZCkge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IE1hdGgubWF4KGluZGV4ICsgMSwgdGhpcy5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1udWxsLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1hcnJheS1mb3ItZWFjaCAqL1xuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuLi9zY2hlbWEubWpzJztcbmltcG9ydCB7IEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyLm1qcyc7XG5pbXBvcnQgeyBTdHJ1Y3QgfSBmcm9tICcuLi90eXBlLm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFN0cnVjdEJ1aWxkZXIgZXh0ZW5kcyBCdWlsZGVyIHtcbiAgICBzZXRWYWx1ZShpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgeyBjaGlsZHJlbiwgdHlwZSB9ID0gdGhpcztcbiAgICAgICAgc3dpdGNoIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5jb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgY2FzZSB0cnVlOiByZXR1cm4gdHlwZS5jaGlsZHJlbi5mb3JFYWNoKChfLCBpKSA9PiBjaGlsZHJlbltpXS5zZXQoaW5kZXgsIHZhbHVlW2ldKSk7XG4gICAgICAgICAgICBjYXNlIE1hcDogcmV0dXJuIHR5cGUuY2hpbGRyZW4uZm9yRWFjaCgoZiwgaSkgPT4gY2hpbGRyZW5baV0uc2V0KGluZGV4LCB2YWx1ZS5nZXQoZi5uYW1lKSkpO1xuICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIHR5cGUuY2hpbGRyZW4uZm9yRWFjaCgoZiwgaSkgPT4gY2hpbGRyZW5baV0uc2V0KGluZGV4LCB2YWx1ZVtmLm5hbWVdKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqIEBpbmhlcml0ZG9jICovXG4gICAgc2V0VmFsaWQoaW5kZXgsIHZhbGlkKSB7XG4gICAgICAgIGlmICghc3VwZXIuc2V0VmFsaWQoaW5kZXgsIHZhbGlkKSkge1xuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4gY2hpbGQuc2V0VmFsaWQoaW5kZXgsIHZhbGlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbGlkO1xuICAgIH1cbiAgICBhZGRDaGlsZChjaGlsZCwgbmFtZSA9IGAke3RoaXMubnVtQ2hpbGRyZW59YCkge1xuICAgICAgICBjb25zdCBjaGlsZEluZGV4ID0gdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgICAgdGhpcy50eXBlID0gbmV3IFN0cnVjdChbLi4udGhpcy50eXBlLmNoaWxkcmVuLCBuZXcgRmllbGQobmFtZSwgY2hpbGQudHlwZSwgdHJ1ZSldKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkSW5kZXg7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJ1Y3QubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBGaXhlZFdpZHRoQnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIubWpzJztcbmltcG9ydCB7IHNldFRpbWUsIHNldFRpbWVTZWNvbmQsIHNldFRpbWVNaWxsaXNlY29uZCwgc2V0VGltZU1pY3Jvc2Vjb25kLCBzZXRUaW1lTmFub3NlY29uZCB9IGZyb20gJy4uL3Zpc2l0b3Ivc2V0Lm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFRpbWVCdWlsZGVyIGV4dGVuZHMgRml4ZWRXaWR0aEJ1aWxkZXIge1xufVxuVGltZUJ1aWxkZXIucHJvdG90eXBlLl9zZXRWYWx1ZSA9IHNldFRpbWU7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFRpbWVTZWNvbmRCdWlsZGVyIGV4dGVuZHMgVGltZUJ1aWxkZXIge1xufVxuVGltZVNlY29uZEJ1aWxkZXIucHJvdG90eXBlLl9zZXRWYWx1ZSA9IHNldFRpbWVTZWNvbmQ7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFRpbWVNaWxsaXNlY29uZEJ1aWxkZXIgZXh0ZW5kcyBUaW1lQnVpbGRlciB7XG59XG5UaW1lTWlsbGlzZWNvbmRCdWlsZGVyLnByb3RvdHlwZS5fc2V0VmFsdWUgPSBzZXRUaW1lTWlsbGlzZWNvbmQ7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFRpbWVNaWNyb3NlY29uZEJ1aWxkZXIgZXh0ZW5kcyBUaW1lQnVpbGRlciB7XG59XG5UaW1lTWljcm9zZWNvbmRCdWlsZGVyLnByb3RvdHlwZS5fc2V0VmFsdWUgPSBzZXRUaW1lTWljcm9zZWNvbmQ7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFRpbWVOYW5vc2Vjb25kQnVpbGRlciBleHRlbmRzIFRpbWVCdWlsZGVyIHtcbn1cblRpbWVOYW5vc2Vjb25kQnVpbGRlci5wcm90b3R5cGUuX3NldFZhbHVlID0gc2V0VGltZU5hbm9zZWNvbmQ7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRpbWUubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBGaXhlZFdpZHRoQnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIubWpzJztcbmltcG9ydCB7IHNldFRpbWVzdGFtcCwgc2V0VGltZXN0YW1wU2Vjb25kLCBzZXRUaW1lc3RhbXBNaWxsaXNlY29uZCwgc2V0VGltZXN0YW1wTWljcm9zZWNvbmQsIHNldFRpbWVzdGFtcE5hbm9zZWNvbmQgfSBmcm9tICcuLi92aXNpdG9yL3NldC5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBUaW1lc3RhbXBCdWlsZGVyIGV4dGVuZHMgRml4ZWRXaWR0aEJ1aWxkZXIge1xufVxuVGltZXN0YW1wQnVpbGRlci5wcm90b3R5cGUuX3NldFZhbHVlID0gc2V0VGltZXN0YW1wO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBUaW1lc3RhbXBTZWNvbmRCdWlsZGVyIGV4dGVuZHMgVGltZXN0YW1wQnVpbGRlciB7XG59XG5UaW1lc3RhbXBTZWNvbmRCdWlsZGVyLnByb3RvdHlwZS5fc2V0VmFsdWUgPSBzZXRUaW1lc3RhbXBTZWNvbmQ7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFRpbWVzdGFtcE1pbGxpc2Vjb25kQnVpbGRlciBleHRlbmRzIFRpbWVzdGFtcEJ1aWxkZXIge1xufVxuVGltZXN0YW1wTWlsbGlzZWNvbmRCdWlsZGVyLnByb3RvdHlwZS5fc2V0VmFsdWUgPSBzZXRUaW1lc3RhbXBNaWxsaXNlY29uZDtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVGltZXN0YW1wTWljcm9zZWNvbmRCdWlsZGVyIGV4dGVuZHMgVGltZXN0YW1wQnVpbGRlciB7XG59XG5UaW1lc3RhbXBNaWNyb3NlY29uZEJ1aWxkZXIucHJvdG90eXBlLl9zZXRWYWx1ZSA9IHNldFRpbWVzdGFtcE1pY3Jvc2Vjb25kO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBUaW1lc3RhbXBOYW5vc2Vjb25kQnVpbGRlciBleHRlbmRzIFRpbWVzdGFtcEJ1aWxkZXIge1xufVxuVGltZXN0YW1wTmFub3NlY29uZEJ1aWxkZXIucHJvdG90eXBlLl9zZXRWYWx1ZSA9IHNldFRpbWVzdGFtcE5hbm9zZWNvbmQ7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRpbWVzdGFtcC5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi4vc2NoZW1hLm1qcyc7XG5pbXBvcnQgeyBEYXRhQnVmZmVyQnVpbGRlciB9IGZyb20gJy4vYnVmZmVyLm1qcyc7XG5pbXBvcnQgeyBCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci5tanMnO1xuaW1wb3J0IHsgVW5pb24gfSBmcm9tICcuLi90eXBlLm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFVuaW9uQnVpbGRlciBleHRlbmRzIEJ1aWxkZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX3R5cGVJZHMgPSBuZXcgRGF0YUJ1ZmZlckJ1aWxkZXIobmV3IEludDhBcnJheSgwKSwgMSk7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9uc1sndmFsdWVUb0NoaWxkVHlwZUlkJ10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlVG9DaGlsZFR5cGVJZCA9IG9wdGlvbnNbJ3ZhbHVlVG9DaGlsZFR5cGVJZCddO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCB0eXBlSWRUb0NoaWxkSW5kZXgoKSB7IHJldHVybiB0aGlzLnR5cGUudHlwZUlkVG9DaGlsZEluZGV4OyB9XG4gICAgYXBwZW5kKHZhbHVlLCBjaGlsZFR5cGVJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXQodGhpcy5sZW5ndGgsIHZhbHVlLCBjaGlsZFR5cGVJZCk7XG4gICAgfVxuICAgIHNldChpbmRleCwgdmFsdWUsIGNoaWxkVHlwZUlkKSB7XG4gICAgICAgIGlmIChjaGlsZFR5cGVJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjaGlsZFR5cGVJZCA9IHRoaXMuX3ZhbHVlVG9DaGlsZFR5cGVJZCh0aGlzLCB2YWx1ZSwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNldFZhbGlkKGluZGV4LCB0aGlzLmlzVmFsaWQodmFsdWUpKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShpbmRleCwgdmFsdWUsIGNoaWxkVHlwZUlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2V0VmFsdWUoaW5kZXgsIHZhbHVlLCBjaGlsZFR5cGVJZCkge1xuICAgICAgICB0aGlzLl90eXBlSWRzLnNldChpbmRleCwgY2hpbGRUeXBlSWQpO1xuICAgICAgICBjb25zdCBjaGlsZEluZGV4ID0gdGhpcy50eXBlLnR5cGVJZFRvQ2hpbGRJbmRleFtjaGlsZFR5cGVJZF07XG4gICAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltjaGlsZEluZGV4XTtcbiAgICAgICAgY2hpbGQgPT09IG51bGwgfHwgY2hpbGQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoaWxkLnNldChpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgICBhZGRDaGlsZChjaGlsZCwgbmFtZSA9IGAke3RoaXMuY2hpbGRyZW4ubGVuZ3RofWApIHtcbiAgICAgICAgY29uc3QgY2hpbGRUeXBlSWQgPSB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgICBjb25zdCB7IHR5cGU6IHsgY2hpbGRyZW4sIG1vZGUsIHR5cGVJZHMgfSB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgZmllbGRzID0gWy4uLmNoaWxkcmVuLCBuZXcgRmllbGQobmFtZSwgY2hpbGQudHlwZSldO1xuICAgICAgICB0aGlzLnR5cGUgPSBuZXcgVW5pb24obW9kZSwgWy4uLnR5cGVJZHMsIGNoaWxkVHlwZUlkXSwgZmllbGRzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkVHlwZUlkO1xuICAgIH1cbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBfdmFsdWVUb0NoaWxkVHlwZUlkKGJ1aWxkZXIsIHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgbWFwIFVuaW9uQnVpbGRlciB2YWx1ZSB0byBjaGlsZCB0eXBlSWQuIFxcXG5QYXNzIHRoZSBcXGBjaGlsZFR5cGVJZFxcYCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHVuaW9uQnVpbGRlci5hcHBlbmQoKSwgXFxcbm9yIHN1cHBseSBhIFxcYHZhbHVlVG9DaGlsZFR5cGVJZFxcYCBmdW5jdGlvbiBhcyBwYXJ0IG9mIHRoZSBVbmlvbkJ1aWxkZXIgY29uc3RydWN0b3Igb3B0aW9ucy5gKTtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFNwYXJzZVVuaW9uQnVpbGRlciBleHRlbmRzIFVuaW9uQnVpbGRlciB7XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIERlbnNlVW5pb25CdWlsZGVyIGV4dGVuZHMgVW5pb25CdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLl9vZmZzZXRzID0gbmV3IERhdGFCdWZmZXJCdWlsZGVyKG5ldyBJbnQzMkFycmF5KDApKTtcbiAgICB9XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBzZXRWYWx1ZShpbmRleCwgdmFsdWUsIGNoaWxkVHlwZUlkKSB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5fdHlwZUlkcy5zZXQoaW5kZXgsIGNoaWxkVHlwZUlkKS5idWZmZXJbaW5kZXhdO1xuICAgICAgICBjb25zdCBjaGlsZCA9IHRoaXMuZ2V0Q2hpbGRBdCh0aGlzLnR5cGUudHlwZUlkVG9DaGlsZEluZGV4W2lkXSk7XG4gICAgICAgIGNvbnN0IGRlbnNlSW5kZXggPSB0aGlzLl9vZmZzZXRzLnNldChpbmRleCwgY2hpbGQubGVuZ3RoKS5idWZmZXJbaW5kZXhdO1xuICAgICAgICBjaGlsZCA9PT0gbnVsbCB8fCBjaGlsZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hpbGQuc2V0KGRlbnNlSW5kZXgsIHZhbHVlKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuaW9uLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgZW5jb2RlVXRmOCB9IGZyb20gJy4uL3V0aWwvdXRmOC5tanMnO1xuaW1wb3J0IHsgQmluYXJ5QnVpbGRlciB9IGZyb20gJy4vYmluYXJ5Lm1qcyc7XG5pbXBvcnQgeyBCdWZmZXJCdWlsZGVyIH0gZnJvbSAnLi9idWZmZXIubWpzJztcbmltcG9ydCB7IFZhcmlhYmxlV2lkdGhCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBVdGY4QnVpbGRlciBleHRlbmRzIFZhcmlhYmxlV2lkdGhCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzLl92YWx1ZXMgPSBuZXcgQnVmZmVyQnVpbGRlcihuZXcgVWludDhBcnJheSgwKSk7XG4gICAgfVxuICAgIGdldCBieXRlTGVuZ3RoKCkge1xuICAgICAgICBsZXQgc2l6ZSA9IHRoaXMuX3BlbmRpbmdMZW5ndGggKyAodGhpcy5sZW5ndGggKiA0KTtcbiAgICAgICAgdGhpcy5fb2Zmc2V0cyAmJiAoc2l6ZSArPSB0aGlzLl9vZmZzZXRzLmJ5dGVMZW5ndGgpO1xuICAgICAgICB0aGlzLl92YWx1ZXMgJiYgKHNpemUgKz0gdGhpcy5fdmFsdWVzLmJ5dGVMZW5ndGgpO1xuICAgICAgICB0aGlzLl9udWxscyAmJiAoc2l6ZSArPSB0aGlzLl9udWxscy5ieXRlTGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgfVxuICAgIHNldFZhbHVlKGluZGV4LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gc3VwZXIuc2V0VmFsdWUoaW5kZXgsIGVuY29kZVV0ZjgodmFsdWUpKTtcbiAgICB9XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIF9mbHVzaFBlbmRpbmcocGVuZGluZywgcGVuZGluZ0xlbmd0aCkgeyB9XG59XG5VdGY4QnVpbGRlci5wcm90b3R5cGUuX2ZsdXNoUGVuZGluZyA9IEJpbmFyeUJ1aWxkZXIucHJvdG90eXBlLl9mbHVzaFBlbmRpbmc7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0ZjgubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyB2YWx1ZVRvU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9wcmV0dHkubWpzJztcbmltcG9ydCB7IEJpZ0ludEF2YWlsYWJsZSB9IGZyb20gJy4uL3V0aWwvY29tcGF0Lm1qcyc7XG4vKipcbiAqIER5bmFtaWNhbGx5IGNvbXBpbGUgdGhlIG51bGwgdmFsdWVzIGludG8gYW4gYGlzVmFsaWQoKWAgZnVuY3Rpb24gd2hvc2VcbiAqIGltcGxlbWVudGF0aW9uIGlzIGEgc3dpdGNoIHN0YXRlbWVudC4gTWljcm9iZW5jaG1hcmtzIGluIHY4IGluZGljYXRlXG4gKiB0aGlzIGFwcHJvYWNoIGlzIDI1JSBmYXN0ZXIgdGhhbiB1c2luZyBhbiBFUzYgTWFwLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zb2xlLmxvZyhjcmVhdGVJc1ZhbGlkRnVuY3Rpb24oW251bGwsICdOL0EnLCBOYU5dKSk7XG4gKiBgZnVuY3Rpb24gKHgpIHtcbiAqICAgICBpZiAoeCAhPT0geCkgcmV0dXJuIGZhbHNlO1xuICogICAgIHN3aXRjaCAoeCkge1xuICogICAgICAgICBjYXNlIG51bGw6XG4gKiAgICAgICAgIGNhc2UgXCJOL0FcIjpcbiAqICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAqICAgICB9XG4gKiAgICAgcmV0dXJuIHRydWU7XG4gKiB9YFxuICpcbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSBudWxsVmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJc1ZhbGlkRnVuY3Rpb24obnVsbFZhbHVlcykge1xuICAgIGlmICghbnVsbFZhbHVlcyB8fCBudWxsVmFsdWVzLmxlbmd0aCA8PSAwKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGlzVmFsaWQodmFsdWUpIHsgcmV0dXJuIHRydWU7IH07XG4gICAgfVxuICAgIGxldCBmbkJvZHkgPSAnJztcbiAgICBjb25zdCBub05hTnMgPSBudWxsVmFsdWVzLmZpbHRlcigoeCkgPT4geCA9PT0geCk7XG4gICAgaWYgKG5vTmFOcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZuQm9keSA9IGBcbiAgICBzd2l0Y2ggKHgpIHske25vTmFOcy5tYXAoKHgpID0+IGBcbiAgICAgICAgY2FzZSAke3ZhbHVlVG9DYXNlKHgpfTpgKS5qb2luKCcnKX1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9YDtcbiAgICB9XG4gICAgLy8gTmFOIGRvZXNuJ3QgZXF1YWwgYW55dGhpbmcgaW5jbHVkaW5nIGl0c2VsZiwgc28gaXQgZG9lc24ndCB3b3JrIGFzIGFcbiAgICAvLyBzd2l0Y2ggY2FzZS4gSW5zdGVhZCB3ZSBtdXN0IGV4cGxpY2l0bHkgY2hlY2sgZm9yIE5hTiBiZWZvcmUgdGhlIHN3aXRjaC5cbiAgICBpZiAobnVsbFZhbHVlcy5sZW5ndGggIT09IG5vTmFOcy5sZW5ndGgpIHtcbiAgICAgICAgZm5Cb2R5ID0gYGlmICh4ICE9PSB4KSByZXR1cm4gZmFsc2U7XFxuJHtmbkJvZHl9YDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbihgeGAsIGAke2ZuQm9keX1cXG5yZXR1cm4gdHJ1ZTtgKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiB2YWx1ZVRvQ2FzZSh4KSB7XG4gICAgaWYgKHR5cGVvZiB4ICE9PSAnYmlnaW50Jykge1xuICAgICAgICByZXR1cm4gdmFsdWVUb1N0cmluZyh4KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoQmlnSW50QXZhaWxhYmxlKSB7XG4gICAgICAgIHJldHVybiBgJHt2YWx1ZVRvU3RyaW5nKHgpfW5gO1xuICAgIH1cbiAgICByZXR1cm4gYFwiJHt2YWx1ZVRvU3RyaW5nKHgpfVwiYDtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmFsaWQubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBWZWN0b3IgfSBmcm9tICcuL3ZlY3Rvci5tanMnO1xuaW1wb3J0IHsgQnVmZmVyVHlwZSwgVHlwZSB9IGZyb20gJy4vZW51bS5tanMnO1xuaW1wb3J0IHsgRGF0YVR5cGUsIHN0cmlkZUZvclR5cGUgfSBmcm9tICcuL3R5cGUubWpzJztcbmltcG9ydCB7IHBvcGNudF9iaXRfcmFuZ2UsIHRydW5jYXRlQml0bWFwIH0gZnJvbSAnLi91dGlsL2JpdC5tanMnO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IGtVbmtub3duTnVsbENvdW50ID0gLTE7XG4vKipcbiAqIERhdGEgc3RydWN0dXJlIHVuZGVybHlpbmcge0BsaW5rIFZlY3Rvcn1zLiBVc2UgdGhlIGNvbnZlbmllbmNlIG1ldGhvZCB7QGxpbmsgbWFrZURhdGF9LlxuICovXG5leHBvcnQgY2xhc3MgRGF0YSB7XG4gICAgY29uc3RydWN0b3IodHlwZSwgb2Zmc2V0LCBsZW5ndGgsIG51bGxDb3VudCwgYnVmZmVycywgY2hpbGRyZW4gPSBbXSwgZGljdGlvbmFyeSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIHRoaXMuZGljdGlvbmFyeSA9IGRpY3Rpb25hcnk7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gTWF0aC5mbG9vcihNYXRoLm1heChvZmZzZXQgfHwgMCwgMCkpO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IE1hdGguZmxvb3IoTWF0aC5tYXgobGVuZ3RoIHx8IDAsIDApKTtcbiAgICAgICAgdGhpcy5fbnVsbENvdW50ID0gTWF0aC5mbG9vcihNYXRoLm1heChudWxsQ291bnQgfHwgMCwgLTEpKTtcbiAgICAgICAgbGV0IGJ1ZmZlcjtcbiAgICAgICAgaWYgKGJ1ZmZlcnMgaW5zdGFuY2VvZiBEYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnN0cmlkZSA9IGJ1ZmZlcnMuc3RyaWRlO1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSBidWZmZXJzLnZhbHVlcztcbiAgICAgICAgICAgIHRoaXMudHlwZUlkcyA9IGJ1ZmZlcnMudHlwZUlkcztcbiAgICAgICAgICAgIHRoaXMubnVsbEJpdG1hcCA9IGJ1ZmZlcnMubnVsbEJpdG1hcDtcbiAgICAgICAgICAgIHRoaXMudmFsdWVPZmZzZXRzID0gYnVmZmVycy52YWx1ZU9mZnNldHM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0cmlkZSA9IHN0cmlkZUZvclR5cGUodHlwZSk7XG4gICAgICAgICAgICBpZiAoYnVmZmVycykge1xuICAgICAgICAgICAgICAgIChidWZmZXIgPSBidWZmZXJzWzBdKSAmJiAodGhpcy52YWx1ZU9mZnNldHMgPSBidWZmZXIpO1xuICAgICAgICAgICAgICAgIChidWZmZXIgPSBidWZmZXJzWzFdKSAmJiAodGhpcy52YWx1ZXMgPSBidWZmZXIpO1xuICAgICAgICAgICAgICAgIChidWZmZXIgPSBidWZmZXJzWzJdKSAmJiAodGhpcy5udWxsQml0bWFwID0gYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAoYnVmZmVyID0gYnVmZmVyc1szXSkgJiYgKHRoaXMudHlwZUlkcyA9IGJ1ZmZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5udWxsYWJsZSA9IHRoaXMuX251bGxDb3VudCAhPT0gMCAmJiB0aGlzLm51bGxCaXRtYXAgJiYgdGhpcy5udWxsQml0bWFwLmJ5dGVMZW5ndGggPiAwO1xuICAgIH1cbiAgICBnZXQgdHlwZUlkKCkgeyByZXR1cm4gdGhpcy50eXBlLnR5cGVJZDsgfVxuICAgIGdldCBBcnJheVR5cGUoKSB7IHJldHVybiB0aGlzLnR5cGUuQXJyYXlUeXBlOyB9XG4gICAgZ2V0IGJ1ZmZlcnMoKSB7XG4gICAgICAgIHJldHVybiBbdGhpcy52YWx1ZU9mZnNldHMsIHRoaXMudmFsdWVzLCB0aGlzLm51bGxCaXRtYXAsIHRoaXMudHlwZUlkc107XG4gICAgfVxuICAgIGdldCBieXRlTGVuZ3RoKCkge1xuICAgICAgICBsZXQgYnl0ZUxlbmd0aCA9IDA7XG4gICAgICAgIGNvbnN0IHsgdmFsdWVPZmZzZXRzLCB2YWx1ZXMsIG51bGxCaXRtYXAsIHR5cGVJZHMgfSA9IHRoaXM7XG4gICAgICAgIHZhbHVlT2Zmc2V0cyAmJiAoYnl0ZUxlbmd0aCArPSB2YWx1ZU9mZnNldHMuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHZhbHVlcyAmJiAoYnl0ZUxlbmd0aCArPSB2YWx1ZXMuYnl0ZUxlbmd0aCk7XG4gICAgICAgIG51bGxCaXRtYXAgJiYgKGJ5dGVMZW5ndGggKz0gbnVsbEJpdG1hcC5ieXRlTGVuZ3RoKTtcbiAgICAgICAgdHlwZUlkcyAmJiAoYnl0ZUxlbmd0aCArPSB0eXBlSWRzLmJ5dGVMZW5ndGgpO1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5yZWR1Y2UoKGJ5dGVMZW5ndGgsIGNoaWxkKSA9PiBieXRlTGVuZ3RoICsgY2hpbGQuYnl0ZUxlbmd0aCwgYnl0ZUxlbmd0aCk7XG4gICAgfVxuICAgIGdldCBudWxsQ291bnQoKSB7XG4gICAgICAgIGxldCBudWxsQ291bnQgPSB0aGlzLl9udWxsQ291bnQ7XG4gICAgICAgIGxldCBudWxsQml0bWFwO1xuICAgICAgICBpZiAobnVsbENvdW50IDw9IGtVbmtub3duTnVsbENvdW50ICYmIChudWxsQml0bWFwID0gdGhpcy5udWxsQml0bWFwKSkge1xuICAgICAgICAgICAgdGhpcy5fbnVsbENvdW50ID0gbnVsbENvdW50ID0gdGhpcy5sZW5ndGggLSBwb3BjbnRfYml0X3JhbmdlKG51bGxCaXRtYXAsIHRoaXMub2Zmc2V0LCB0aGlzLm9mZnNldCArIHRoaXMubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbENvdW50O1xuICAgIH1cbiAgICBnZXRWYWxpZChpbmRleCkge1xuICAgICAgICBpZiAodGhpcy5udWxsYWJsZSAmJiB0aGlzLm51bGxDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHBvcyA9IHRoaXMub2Zmc2V0ICsgaW5kZXg7XG4gICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLm51bGxCaXRtYXBbcG9zID4+IDNdO1xuICAgICAgICAgICAgcmV0dXJuICh2YWwgJiAoMSA8PCAocG9zICUgOCkpKSAhPT0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc2V0VmFsaWQoaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIC8vIERvbid0IGludGVyYWN0IHcvIG51bGxCaXRtYXAgaWYgbm90IG51bGxhYmxlXG4gICAgICAgIGlmICghdGhpcy5udWxsYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vIG51bGwgYml0bWFwLCBpbml0aWFsaXplIG9uZSBvbiB0aGUgZmx5XG4gICAgICAgIGlmICghdGhpcy5udWxsQml0bWFwIHx8IHRoaXMubnVsbEJpdG1hcC5ieXRlTGVuZ3RoIDw9IChpbmRleCA+PiAzKSkge1xuICAgICAgICAgICAgY29uc3QgeyBudWxsQml0bWFwIH0gPSB0aGlzLl9jaGFuZ2VMZW5ndGhBbmRCYWNrZmlsbE51bGxCaXRtYXAodGhpcy5sZW5ndGgpO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCB7IG51bGxCaXRtYXAsIF9udWxsQ291bnQ6IDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBudWxsQml0bWFwLCBvZmZzZXQgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHBvcyA9IChvZmZzZXQgKyBpbmRleCkgPj4gMztcbiAgICAgICAgY29uc3QgYml0ID0gKG9mZnNldCArIGluZGV4KSAlIDg7XG4gICAgICAgIGNvbnN0IHZhbCA9IChudWxsQml0bWFwW3Bvc10gPj4gYml0KSAmIDE7XG4gICAgICAgIC8vIElmIGB2YWxgIGlzIHRydXRoeSBhbmQgdGhlIGN1cnJlbnQgYml0IGlzIDAsIGZsaXAgaXQgdG8gMSBhbmQgaW5jcmVtZW50IGBfbnVsbENvdW50YC5cbiAgICAgICAgLy8gSWYgYHZhbGAgaXMgZmFsc2V5IGFuZCB0aGUgY3VycmVudCBiaXQgaXMgMSwgZmxpcCBpdCB0byAwIGFuZCBkZWNyZW1lbnQgYF9udWxsQ291bnRgLlxuICAgICAgICB2YWx1ZSA/IHZhbCA9PT0gMCAmJiAoKG51bGxCaXRtYXBbcG9zXSB8PSAoMSA8PCBiaXQpKSwgKHRoaXMuX251bGxDb3VudCA9IHRoaXMubnVsbENvdW50ICsgMSkpXG4gICAgICAgICAgICA6IHZhbCA9PT0gMSAmJiAoKG51bGxCaXRtYXBbcG9zXSAmPSB+KDEgPDwgYml0KSksICh0aGlzLl9udWxsQ291bnQgPSB0aGlzLm51bGxDb3VudCAtIDEpKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjbG9uZSh0eXBlID0gdGhpcy50eXBlLCBvZmZzZXQgPSB0aGlzLm9mZnNldCwgbGVuZ3RoID0gdGhpcy5sZW5ndGgsIG51bGxDb3VudCA9IHRoaXMuX251bGxDb3VudCwgYnVmZmVycyA9IHRoaXMsIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbikge1xuICAgICAgICByZXR1cm4gbmV3IERhdGEodHlwZSwgb2Zmc2V0LCBsZW5ndGgsIG51bGxDb3VudCwgYnVmZmVycywgY2hpbGRyZW4sIHRoaXMuZGljdGlvbmFyeSk7XG4gICAgfVxuICAgIHNsaWNlKG9mZnNldCwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHsgc3RyaWRlLCB0eXBlSWQsIGNoaWxkcmVuIH0gPSB0aGlzO1xuICAgICAgICAvLyArdHJ1ZSA9PT0gMSwgK2ZhbHNlID09PSAwLCBzbyB0aGlzIG1lYW5zXG4gICAgICAgIC8vIHdlIGtlZXAgbnVsbENvdW50IGF0IDAgaWYgaXQncyBhbHJlYWR5IDAsXG4gICAgICAgIC8vIG90aGVyd2lzZSBzZXQgdG8gdGhlIGludmFsaWRhdGVkIGZsYWcgLTFcbiAgICAgICAgY29uc3QgbnVsbENvdW50ID0gKyh0aGlzLl9udWxsQ291bnQgPT09IDApIC0gMTtcbiAgICAgICAgY29uc3QgY2hpbGRTdHJpZGUgPSB0eXBlSWQgPT09IDE2IC8qIEZpeGVkU2l6ZUxpc3QgKi8gPyBzdHJpZGUgOiAxO1xuICAgICAgICBjb25zdCBidWZmZXJzID0gdGhpcy5fc2xpY2VCdWZmZXJzKG9mZnNldCwgbGVuZ3RoLCBzdHJpZGUsIHR5cGVJZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKHRoaXMudHlwZSwgdGhpcy5vZmZzZXQgKyBvZmZzZXQsIGxlbmd0aCwgbnVsbENvdW50LCBidWZmZXJzLCBcbiAgICAgICAgLy8gRG9uJ3Qgc2xpY2UgY2hpbGRyZW4gaWYgd2UgaGF2ZSB2YWx1ZSBvZmZzZXRzICh0aGUgdmFyaWFibGUtd2lkdGggdHlwZXMpXG4gICAgICAgIChjaGlsZHJlbi5sZW5ndGggPT09IDAgfHwgdGhpcy52YWx1ZU9mZnNldHMpID8gY2hpbGRyZW4gOiB0aGlzLl9zbGljZUNoaWxkcmVuKGNoaWxkcmVuLCBjaGlsZFN0cmlkZSAqIG9mZnNldCwgY2hpbGRTdHJpZGUgKiBsZW5ndGgpKTtcbiAgICB9XG4gICAgX2NoYW5nZUxlbmd0aEFuZEJhY2tmaWxsTnVsbEJpdG1hcChuZXdMZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZUlkID09PSBUeXBlLk51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb25lKHRoaXMudHlwZSwgMCwgbmV3TGVuZ3RoLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGxlbmd0aCwgbnVsbENvdW50IH0gPSB0aGlzO1xuICAgICAgICAvLyBzdGFydCBpbml0aWFsaXplZCB3aXRoIDBzIChudWxscyksIHRoZW4gZmlsbCBmcm9tIDAgdG8gbGVuZ3RoIHdpdGggMXMgKG5vdCBudWxsKVxuICAgICAgICBjb25zdCBiaXRtYXAgPSBuZXcgVWludDhBcnJheSgoKG5ld0xlbmd0aCArIDYzKSAmIH42MykgPj4gMykuZmlsbCgyNTUsIDAsIGxlbmd0aCA+PiAzKTtcbiAgICAgICAgLy8gc2V0IGFsbCB0aGUgYml0cyBpbiB0aGUgbGFzdCBieXRlICh1cCB0byBiaXQgYGxlbmd0aCAtIGxlbmd0aCAlIDhgKSB0byAxIChub3QgbnVsbClcbiAgICAgICAgYml0bWFwW2xlbmd0aCA+PiAzXSA9ICgxIDw8IChsZW5ndGggLSAobGVuZ3RoICYgfjcpKSkgLSAxO1xuICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgbnVsbEJpdG1hcCwgdHJ1bmNhdGUgKyBzbGljZSBhbmQgc2V0IGl0IG92ZXIgdGhlIHByZS1maWxsZWQgMXNcbiAgICAgICAgaWYgKG51bGxDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGJpdG1hcC5zZXQodHJ1bmNhdGVCaXRtYXAodGhpcy5vZmZzZXQsIGxlbmd0aCwgdGhpcy5udWxsQml0bWFwKSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnVmZmVycyA9IHRoaXMuYnVmZmVycztcbiAgICAgICAgYnVmZmVyc1tCdWZmZXJUeXBlLlZBTElESVRZXSA9IGJpdG1hcDtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUodGhpcy50eXBlLCAwLCBuZXdMZW5ndGgsIG51bGxDb3VudCArIChuZXdMZW5ndGggLSBsZW5ndGgpLCBidWZmZXJzKTtcbiAgICB9XG4gICAgX3NsaWNlQnVmZmVycyhvZmZzZXQsIGxlbmd0aCwgc3RyaWRlLCB0eXBlSWQpIHtcbiAgICAgICAgbGV0IGFycjtcbiAgICAgICAgY29uc3QgeyBidWZmZXJzIH0gPSB0aGlzO1xuICAgICAgICAvLyBJZiB0eXBlSWRzIGV4aXN0LCBzbGljZSB0aGUgdHlwZUlkcyBidWZmZXJcbiAgICAgICAgKGFyciA9IGJ1ZmZlcnNbQnVmZmVyVHlwZS5UWVBFXSkgJiYgKGJ1ZmZlcnNbQnVmZmVyVHlwZS5UWVBFXSA9IGFyci5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCkpO1xuICAgICAgICAvLyBJZiBvZmZzZXRzIGV4aXN0LCBvbmx5IHNsaWNlIHRoZSBvZmZzZXRzIGJ1ZmZlclxuICAgICAgICAoYXJyID0gYnVmZmVyc1tCdWZmZXJUeXBlLk9GRlNFVF0pICYmIChidWZmZXJzW0J1ZmZlclR5cGUuT0ZGU0VUXSA9IGFyci5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCArIDEpKSB8fFxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGlmIG5vIG9mZnNldHMsIHNsaWNlIHRoZSBkYXRhIGJ1ZmZlci4gRG9uJ3Qgc2xpY2UgdGhlIGRhdGEgdmVjdG9yIGZvciBCb29sZWFucywgc2luY2UgdGhlIG9mZnNldCBnb2VzIGJ5IGJpdHMgbm90IGJ5dGVzXG4gICAgICAgICAgICAoYXJyID0gYnVmZmVyc1tCdWZmZXJUeXBlLkRBVEFdKSAmJiAoYnVmZmVyc1tCdWZmZXJUeXBlLkRBVEFdID0gdHlwZUlkID09PSA2ID8gYXJyIDogYXJyLnN1YmFycmF5KHN0cmlkZSAqIG9mZnNldCwgc3RyaWRlICogKG9mZnNldCArIGxlbmd0aCkpKTtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcnM7XG4gICAgfVxuICAgIF9zbGljZUNoaWxkcmVuKGNoaWxkcmVuLCBvZmZzZXQsIGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gY2hpbGRyZW4ubWFwKChjaGlsZCkgPT4gY2hpbGQuc2xpY2Uob2Zmc2V0LCBsZW5ndGgpKTtcbiAgICB9XG59XG5EYXRhLnByb3RvdHlwZS5jaGlsZHJlbiA9IE9iamVjdC5mcmVlemUoW10pO1xuaW1wb3J0IHsgVmlzaXRvciB9IGZyb20gJy4vdmlzaXRvci5tanMnO1xuaW1wb3J0IHsgdG9BcnJheUJ1ZmZlclZpZXcsIHRvSW50MzJBcnJheSwgdG9VaW50OEFycmF5IH0gZnJvbSAnLi91dGlsL2J1ZmZlci5tanMnO1xuY2xhc3MgTWFrZURhdGFWaXNpdG9yIGV4dGVuZHMgVmlzaXRvciB7XG4gICAgdmlzaXQocHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmlzaXRGbihwcm9wc1sndHlwZSddKS5jYWxsKHRoaXMsIHByb3BzKTtcbiAgICB9XG4gICAgdmlzaXROdWxsKHByb3BzKSB7XG4gICAgICAgIGNvbnN0IHsgWyd0eXBlJ106IHR5cGUsIFsnb2Zmc2V0J106IG9mZnNldCA9IDAsIFsnbGVuZ3RoJ106IGxlbmd0aCA9IDAsIH0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhKHR5cGUsIG9mZnNldCwgbGVuZ3RoLCAwKTtcbiAgICB9XG4gICAgdmlzaXRCb29sKHByb3BzKSB7XG4gICAgICAgIGNvbnN0IHsgWyd0eXBlJ106IHR5cGUsIFsnb2Zmc2V0J106IG9mZnNldCA9IDAgfSA9IHByb3BzO1xuICAgICAgICBjb25zdCBudWxsQml0bWFwID0gdG9VaW50OEFycmF5KHByb3BzWydudWxsQml0bWFwJ10pO1xuICAgICAgICBjb25zdCBkYXRhID0gdG9BcnJheUJ1ZmZlclZpZXcodHlwZS5BcnJheVR5cGUsIHByb3BzWydkYXRhJ10pO1xuICAgICAgICBjb25zdCB7IFsnbGVuZ3RoJ106IGxlbmd0aCA9IGRhdGEubGVuZ3RoID4+IDMsIFsnbnVsbENvdW50J106IG51bGxDb3VudCA9IHByb3BzWydudWxsQml0bWFwJ10gPyAtMSA6IDAsIH0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhKHR5cGUsIG9mZnNldCwgbGVuZ3RoLCBudWxsQ291bnQsIFt1bmRlZmluZWQsIGRhdGEsIG51bGxCaXRtYXBdKTtcbiAgICB9XG4gICAgdmlzaXRJbnQocHJvcHMpIHtcbiAgICAgICAgY29uc3QgeyBbJ3R5cGUnXTogdHlwZSwgWydvZmZzZXQnXTogb2Zmc2V0ID0gMCB9ID0gcHJvcHM7XG4gICAgICAgIGNvbnN0IG51bGxCaXRtYXAgPSB0b1VpbnQ4QXJyYXkocHJvcHNbJ251bGxCaXRtYXAnXSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0b0FycmF5QnVmZmVyVmlldyh0eXBlLkFycmF5VHlwZSwgcHJvcHNbJ2RhdGEnXSk7XG4gICAgICAgIGNvbnN0IHsgWydsZW5ndGgnXTogbGVuZ3RoID0gZGF0YS5sZW5ndGgsIFsnbnVsbENvdW50J106IG51bGxDb3VudCA9IHByb3BzWydudWxsQml0bWFwJ10gPyAtMSA6IDAsIH0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhKHR5cGUsIG9mZnNldCwgbGVuZ3RoLCBudWxsQ291bnQsIFt1bmRlZmluZWQsIGRhdGEsIG51bGxCaXRtYXBdKTtcbiAgICB9XG4gICAgdmlzaXRGbG9hdChwcm9wcykge1xuICAgICAgICBjb25zdCB7IFsndHlwZSddOiB0eXBlLCBbJ29mZnNldCddOiBvZmZzZXQgPSAwIH0gPSBwcm9wcztcbiAgICAgICAgY29uc3QgbnVsbEJpdG1hcCA9IHRvVWludDhBcnJheShwcm9wc1snbnVsbEJpdG1hcCddKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRvQXJyYXlCdWZmZXJWaWV3KHR5cGUuQXJyYXlUeXBlLCBwcm9wc1snZGF0YSddKTtcbiAgICAgICAgY29uc3QgeyBbJ2xlbmd0aCddOiBsZW5ndGggPSBkYXRhLmxlbmd0aCwgWydudWxsQ291bnQnXTogbnVsbENvdW50ID0gcHJvcHNbJ251bGxCaXRtYXAnXSA/IC0xIDogMCwgfSA9IHByb3BzO1xuICAgICAgICByZXR1cm4gbmV3IERhdGEodHlwZSwgb2Zmc2V0LCBsZW5ndGgsIG51bGxDb3VudCwgW3VuZGVmaW5lZCwgZGF0YSwgbnVsbEJpdG1hcF0pO1xuICAgIH1cbiAgICB2aXNpdFV0ZjgocHJvcHMpIHtcbiAgICAgICAgY29uc3QgeyBbJ3R5cGUnXTogdHlwZSwgWydvZmZzZXQnXTogb2Zmc2V0ID0gMCB9ID0gcHJvcHM7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0b1VpbnQ4QXJyYXkocHJvcHNbJ2RhdGEnXSk7XG4gICAgICAgIGNvbnN0IG51bGxCaXRtYXAgPSB0b1VpbnQ4QXJyYXkocHJvcHNbJ251bGxCaXRtYXAnXSk7XG4gICAgICAgIGNvbnN0IHZhbHVlT2Zmc2V0cyA9IHRvSW50MzJBcnJheShwcm9wc1sndmFsdWVPZmZzZXRzJ10pO1xuICAgICAgICBjb25zdCB7IFsnbGVuZ3RoJ106IGxlbmd0aCA9IHZhbHVlT2Zmc2V0cy5sZW5ndGggLSAxLCBbJ251bGxDb3VudCddOiBudWxsQ291bnQgPSBwcm9wc1snbnVsbEJpdG1hcCddID8gLTEgOiAwIH0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhKHR5cGUsIG9mZnNldCwgbGVuZ3RoLCBudWxsQ291bnQsIFt2YWx1ZU9mZnNldHMsIGRhdGEsIG51bGxCaXRtYXBdKTtcbiAgICB9XG4gICAgdmlzaXRCaW5hcnkocHJvcHMpIHtcbiAgICAgICAgY29uc3QgeyBbJ3R5cGUnXTogdHlwZSwgWydvZmZzZXQnXTogb2Zmc2V0ID0gMCB9ID0gcHJvcHM7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0b1VpbnQ4QXJyYXkocHJvcHNbJ2RhdGEnXSk7XG4gICAgICAgIGNvbnN0IG51bGxCaXRtYXAgPSB0b1VpbnQ4QXJyYXkocHJvcHNbJ251bGxCaXRtYXAnXSk7XG4gICAgICAgIGNvbnN0IHZhbHVlT2Zmc2V0cyA9IHRvSW50MzJBcnJheShwcm9wc1sndmFsdWVPZmZzZXRzJ10pO1xuICAgICAgICBjb25zdCB7IFsnbGVuZ3RoJ106IGxlbmd0aCA9IHZhbHVlT2Zmc2V0cy5sZW5ndGggLSAxLCBbJ251bGxDb3VudCddOiBudWxsQ291bnQgPSBwcm9wc1snbnVsbEJpdG1hcCddID8gLTEgOiAwIH0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhKHR5cGUsIG9mZnNldCwgbGVuZ3RoLCBudWxsQ291bnQsIFt2YWx1ZU9mZnNldHMsIGRhdGEsIG51bGxCaXRtYXBdKTtcbiAgICB9XG4gICAgdmlzaXRGaXhlZFNpemVCaW5hcnkocHJvcHMpIHtcbiAgICAgICAgY29uc3QgeyBbJ3R5cGUnXTogdHlwZSwgWydvZmZzZXQnXTogb2Zmc2V0ID0gMCB9ID0gcHJvcHM7XG4gICAgICAgIGNvbnN0IG51bGxCaXRtYXAgPSB0b1VpbnQ4QXJyYXkocHJvcHNbJ251bGxCaXRtYXAnXSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0b0FycmF5QnVmZmVyVmlldyh0eXBlLkFycmF5VHlwZSwgcHJvcHNbJ2RhdGEnXSk7XG4gICAgICAgIGNvbnN0IHsgWydsZW5ndGgnXTogbGVuZ3RoID0gZGF0YS5sZW5ndGggLyBzdHJpZGVGb3JUeXBlKHR5cGUpLCBbJ251bGxDb3VudCddOiBudWxsQ291bnQgPSBwcm9wc1snbnVsbEJpdG1hcCddID8gLTEgOiAwLCB9ID0gcHJvcHM7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YSh0eXBlLCBvZmZzZXQsIGxlbmd0aCwgbnVsbENvdW50LCBbdW5kZWZpbmVkLCBkYXRhLCBudWxsQml0bWFwXSk7XG4gICAgfVxuICAgIHZpc2l0RGF0ZShwcm9wcykge1xuICAgICAgICBjb25zdCB7IFsndHlwZSddOiB0eXBlLCBbJ29mZnNldCddOiBvZmZzZXQgPSAwIH0gPSBwcm9wcztcbiAgICAgICAgY29uc3QgbnVsbEJpdG1hcCA9IHRvVWludDhBcnJheShwcm9wc1snbnVsbEJpdG1hcCddKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRvQXJyYXlCdWZmZXJWaWV3KHR5cGUuQXJyYXlUeXBlLCBwcm9wc1snZGF0YSddKTtcbiAgICAgICAgY29uc3QgeyBbJ2xlbmd0aCddOiBsZW5ndGggPSBkYXRhLmxlbmd0aCAvIHN0cmlkZUZvclR5cGUodHlwZSksIFsnbnVsbENvdW50J106IG51bGxDb3VudCA9IHByb3BzWydudWxsQml0bWFwJ10gPyAtMSA6IDAsIH0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhKHR5cGUsIG9mZnNldCwgbGVuZ3RoLCBudWxsQ291bnQsIFt1bmRlZmluZWQsIGRhdGEsIG51bGxCaXRtYXBdKTtcbiAgICB9XG4gICAgdmlzaXRUaW1lc3RhbXAocHJvcHMpIHtcbiAgICAgICAgY29uc3QgeyBbJ3R5cGUnXTogdHlwZSwgWydvZmZzZXQnXTogb2Zmc2V0ID0gMCB9ID0gcHJvcHM7XG4gICAgICAgIGNvbnN0IG51bGxCaXRtYXAgPSB0b1VpbnQ4QXJyYXkocHJvcHNbJ251bGxCaXRtYXAnXSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0b0FycmF5QnVmZmVyVmlldyh0eXBlLkFycmF5VHlwZSwgcHJvcHNbJ2RhdGEnXSk7XG4gICAgICAgIGNvbnN0IHsgWydsZW5ndGgnXTogbGVuZ3RoID0gZGF0YS5sZW5ndGggLyBzdHJpZGVGb3JUeXBlKHR5cGUpLCBbJ251bGxDb3VudCddOiBudWxsQ291bnQgPSBwcm9wc1snbnVsbEJpdG1hcCddID8gLTEgOiAwLCB9ID0gcHJvcHM7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YSh0eXBlLCBvZmZzZXQsIGxlbmd0aCwgbnVsbENvdW50LCBbdW5kZWZpbmVkLCBkYXRhLCBudWxsQml0bWFwXSk7XG4gICAgfVxuICAgIHZpc2l0VGltZShwcm9wcykge1xuICAgICAgICBjb25zdCB7IFsndHlwZSddOiB0eXBlLCBbJ29mZnNldCddOiBvZmZzZXQgPSAwIH0gPSBwcm9wcztcbiAgICAgICAgY29uc3QgbnVsbEJpdG1hcCA9IHRvVWludDhBcnJheShwcm9wc1snbnVsbEJpdG1hcCddKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRvQXJyYXlCdWZmZXJWaWV3KHR5cGUuQXJyYXlUeXBlLCBwcm9wc1snZGF0YSddKTtcbiAgICAgICAgY29uc3QgeyBbJ2xlbmd0aCddOiBsZW5ndGggPSBkYXRhLmxlbmd0aCAvIHN0cmlkZUZvclR5cGUodHlwZSksIFsnbnVsbENvdW50J106IG51bGxDb3VudCA9IHByb3BzWydudWxsQml0bWFwJ10gPyAtMSA6IDAsIH0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhKHR5cGUsIG9mZnNldCwgbGVuZ3RoLCBudWxsQ291bnQsIFt1bmRlZmluZWQsIGRhdGEsIG51bGxCaXRtYXBdKTtcbiAgICB9XG4gICAgdmlzaXREZWNpbWFsKHByb3BzKSB7XG4gICAgICAgIGNvbnN0IHsgWyd0eXBlJ106IHR5cGUsIFsnb2Zmc2V0J106IG9mZnNldCA9IDAgfSA9IHByb3BzO1xuICAgICAgICBjb25zdCBudWxsQml0bWFwID0gdG9VaW50OEFycmF5KHByb3BzWydudWxsQml0bWFwJ10pO1xuICAgICAgICBjb25zdCBkYXRhID0gdG9BcnJheUJ1ZmZlclZpZXcodHlwZS5BcnJheVR5cGUsIHByb3BzWydkYXRhJ10pO1xuICAgICAgICBjb25zdCB7IFsnbGVuZ3RoJ106IGxlbmd0aCA9IGRhdGEubGVuZ3RoIC8gc3RyaWRlRm9yVHlwZSh0eXBlKSwgWydudWxsQ291bnQnXTogbnVsbENvdW50ID0gcHJvcHNbJ251bGxCaXRtYXAnXSA/IC0xIDogMCwgfSA9IHByb3BzO1xuICAgICAgICByZXR1cm4gbmV3IERhdGEodHlwZSwgb2Zmc2V0LCBsZW5ndGgsIG51bGxDb3VudCwgW3VuZGVmaW5lZCwgZGF0YSwgbnVsbEJpdG1hcF0pO1xuICAgIH1cbiAgICB2aXNpdExpc3QocHJvcHMpIHtcbiAgICAgICAgY29uc3QgeyBbJ3R5cGUnXTogdHlwZSwgWydvZmZzZXQnXTogb2Zmc2V0ID0gMCwgWydjaGlsZCddOiBjaGlsZCB9ID0gcHJvcHM7XG4gICAgICAgIGNvbnN0IG51bGxCaXRtYXAgPSB0b1VpbnQ4QXJyYXkocHJvcHNbJ251bGxCaXRtYXAnXSk7XG4gICAgICAgIGNvbnN0IHZhbHVlT2Zmc2V0cyA9IHRvSW50MzJBcnJheShwcm9wc1sndmFsdWVPZmZzZXRzJ10pO1xuICAgICAgICBjb25zdCB7IFsnbGVuZ3RoJ106IGxlbmd0aCA9IHZhbHVlT2Zmc2V0cy5sZW5ndGggLSAxLCBbJ251bGxDb3VudCddOiBudWxsQ291bnQgPSBwcm9wc1snbnVsbEJpdG1hcCddID8gLTEgOiAwIH0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhKHR5cGUsIG9mZnNldCwgbGVuZ3RoLCBudWxsQ291bnQsIFt2YWx1ZU9mZnNldHMsIHVuZGVmaW5lZCwgbnVsbEJpdG1hcF0sIFtjaGlsZF0pO1xuICAgIH1cbiAgICB2aXNpdFN0cnVjdChwcm9wcykge1xuICAgICAgICBjb25zdCB7IFsndHlwZSddOiB0eXBlLCBbJ29mZnNldCddOiBvZmZzZXQgPSAwLCBbJ2NoaWxkcmVuJ106IGNoaWxkcmVuID0gW10gfSA9IHByb3BzO1xuICAgICAgICBjb25zdCBudWxsQml0bWFwID0gdG9VaW50OEFycmF5KHByb3BzWydudWxsQml0bWFwJ10pO1xuICAgICAgICBjb25zdCB7IGxlbmd0aCA9IGNoaWxkcmVuLnJlZHVjZSgobGVuLCB7IGxlbmd0aCB9KSA9PiBNYXRoLm1heChsZW4sIGxlbmd0aCksIDApLCBudWxsQ291bnQgPSBwcm9wc1snbnVsbEJpdG1hcCddID8gLTEgOiAwIH0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhKHR5cGUsIG9mZnNldCwgbGVuZ3RoLCBudWxsQ291bnQsIFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgbnVsbEJpdG1hcF0sIGNoaWxkcmVuKTtcbiAgICB9XG4gICAgdmlzaXRVbmlvbihwcm9wcykge1xuICAgICAgICBjb25zdCB7IFsndHlwZSddOiB0eXBlLCBbJ29mZnNldCddOiBvZmZzZXQgPSAwLCBbJ2NoaWxkcmVuJ106IGNoaWxkcmVuID0gW10gfSA9IHByb3BzO1xuICAgICAgICBjb25zdCBudWxsQml0bWFwID0gdG9VaW50OEFycmF5KHByb3BzWydudWxsQml0bWFwJ10pO1xuICAgICAgICBjb25zdCB0eXBlSWRzID0gdG9BcnJheUJ1ZmZlclZpZXcodHlwZS5BcnJheVR5cGUsIHByb3BzWyd0eXBlSWRzJ10pO1xuICAgICAgICBjb25zdCB7IFsnbGVuZ3RoJ106IGxlbmd0aCA9IHR5cGVJZHMubGVuZ3RoLCBbJ251bGxDb3VudCddOiBudWxsQ291bnQgPSBwcm9wc1snbnVsbEJpdG1hcCddID8gLTEgOiAwLCB9ID0gcHJvcHM7XG4gICAgICAgIGlmIChEYXRhVHlwZS5pc1NwYXJzZVVuaW9uKHR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGEodHlwZSwgb2Zmc2V0LCBsZW5ndGgsIG51bGxDb3VudCwgW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCBudWxsQml0bWFwLCB0eXBlSWRzXSwgY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlT2Zmc2V0cyA9IHRvSW50MzJBcnJheShwcm9wc1sndmFsdWVPZmZzZXRzJ10pO1xuICAgICAgICByZXR1cm4gbmV3IERhdGEodHlwZSwgb2Zmc2V0LCBsZW5ndGgsIG51bGxDb3VudCwgW3ZhbHVlT2Zmc2V0cywgdW5kZWZpbmVkLCBudWxsQml0bWFwLCB0eXBlSWRzXSwgY2hpbGRyZW4pO1xuICAgIH1cbiAgICB2aXNpdERpY3Rpb25hcnkocHJvcHMpIHtcbiAgICAgICAgY29uc3QgeyBbJ3R5cGUnXTogdHlwZSwgWydvZmZzZXQnXTogb2Zmc2V0ID0gMCB9ID0gcHJvcHM7XG4gICAgICAgIGNvbnN0IG51bGxCaXRtYXAgPSB0b1VpbnQ4QXJyYXkocHJvcHNbJ251bGxCaXRtYXAnXSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0b0FycmF5QnVmZmVyVmlldyh0eXBlLmluZGljZXMuQXJyYXlUeXBlLCBwcm9wc1snZGF0YSddKTtcbiAgICAgICAgY29uc3QgeyBbJ2RpY3Rpb25hcnknXTogZGljdGlvbmFyeSA9IG5ldyBWZWN0b3IoW25ldyBNYWtlRGF0YVZpc2l0b3IoKS52aXNpdCh7IHR5cGU6IHR5cGUuZGljdGlvbmFyeSB9KV0pIH0gPSBwcm9wcztcbiAgICAgICAgY29uc3QgeyBbJ2xlbmd0aCddOiBsZW5ndGggPSBkYXRhLmxlbmd0aCwgWydudWxsQ291bnQnXTogbnVsbENvdW50ID0gcHJvcHNbJ251bGxCaXRtYXAnXSA/IC0xIDogMCB9ID0gcHJvcHM7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YSh0eXBlLCBvZmZzZXQsIGxlbmd0aCwgbnVsbENvdW50LCBbdW5kZWZpbmVkLCBkYXRhLCBudWxsQml0bWFwXSwgW10sIGRpY3Rpb25hcnkpO1xuICAgIH1cbiAgICB2aXNpdEludGVydmFsKHByb3BzKSB7XG4gICAgICAgIGNvbnN0IHsgWyd0eXBlJ106IHR5cGUsIFsnb2Zmc2V0J106IG9mZnNldCA9IDAgfSA9IHByb3BzO1xuICAgICAgICBjb25zdCBudWxsQml0bWFwID0gdG9VaW50OEFycmF5KHByb3BzWydudWxsQml0bWFwJ10pO1xuICAgICAgICBjb25zdCBkYXRhID0gdG9BcnJheUJ1ZmZlclZpZXcodHlwZS5BcnJheVR5cGUsIHByb3BzWydkYXRhJ10pO1xuICAgICAgICBjb25zdCB7IFsnbGVuZ3RoJ106IGxlbmd0aCA9IGRhdGEubGVuZ3RoIC8gc3RyaWRlRm9yVHlwZSh0eXBlKSwgWydudWxsQ291bnQnXTogbnVsbENvdW50ID0gcHJvcHNbJ251bGxCaXRtYXAnXSA/IC0xIDogMCwgfSA9IHByb3BzO1xuICAgICAgICByZXR1cm4gbmV3IERhdGEodHlwZSwgb2Zmc2V0LCBsZW5ndGgsIG51bGxDb3VudCwgW3VuZGVmaW5lZCwgZGF0YSwgbnVsbEJpdG1hcF0pO1xuICAgIH1cbiAgICB2aXNpdEZpeGVkU2l6ZUxpc3QocHJvcHMpIHtcbiAgICAgICAgY29uc3QgeyBbJ3R5cGUnXTogdHlwZSwgWydvZmZzZXQnXTogb2Zmc2V0ID0gMCwgWydjaGlsZCddOiBjaGlsZCA9IG5ldyBNYWtlRGF0YVZpc2l0b3IoKS52aXNpdCh7IHR5cGU6IHR5cGUudmFsdWVUeXBlIH0pIH0gPSBwcm9wcztcbiAgICAgICAgY29uc3QgbnVsbEJpdG1hcCA9IHRvVWludDhBcnJheShwcm9wc1snbnVsbEJpdG1hcCddKTtcbiAgICAgICAgY29uc3QgeyBbJ2xlbmd0aCddOiBsZW5ndGggPSBjaGlsZC5sZW5ndGggLyBzdHJpZGVGb3JUeXBlKHR5cGUpLCBbJ251bGxDb3VudCddOiBudWxsQ291bnQgPSBwcm9wc1snbnVsbEJpdG1hcCddID8gLTEgOiAwIH0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhKHR5cGUsIG9mZnNldCwgbGVuZ3RoLCBudWxsQ291bnQsIFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgbnVsbEJpdG1hcF0sIFtjaGlsZF0pO1xuICAgIH1cbiAgICB2aXNpdE1hcChwcm9wcykge1xuICAgICAgICBjb25zdCB7IFsndHlwZSddOiB0eXBlLCBbJ29mZnNldCddOiBvZmZzZXQgPSAwLCBbJ2NoaWxkJ106IGNoaWxkID0gbmV3IE1ha2VEYXRhVmlzaXRvcigpLnZpc2l0KHsgdHlwZTogdHlwZS5jaGlsZFR5cGUgfSkgfSA9IHByb3BzO1xuICAgICAgICBjb25zdCBudWxsQml0bWFwID0gdG9VaW50OEFycmF5KHByb3BzWydudWxsQml0bWFwJ10pO1xuICAgICAgICBjb25zdCB2YWx1ZU9mZnNldHMgPSB0b0ludDMyQXJyYXkocHJvcHNbJ3ZhbHVlT2Zmc2V0cyddKTtcbiAgICAgICAgY29uc3QgeyBbJ2xlbmd0aCddOiBsZW5ndGggPSB2YWx1ZU9mZnNldHMubGVuZ3RoIC0gMSwgWydudWxsQ291bnQnXTogbnVsbENvdW50ID0gcHJvcHNbJ251bGxCaXRtYXAnXSA/IC0xIDogMCwgfSA9IHByb3BzO1xuICAgICAgICByZXR1cm4gbmV3IERhdGEodHlwZSwgb2Zmc2V0LCBsZW5ndGgsIG51bGxDb3VudCwgW3ZhbHVlT2Zmc2V0cywgdW5kZWZpbmVkLCBudWxsQml0bWFwXSwgW2NoaWxkXSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VEYXRhKHByb3BzKSB7XG4gICAgcmV0dXJuIG5ldyBNYWtlRGF0YVZpc2l0b3IoKS52aXNpdChwcm9wcyk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGEubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG4vLy8vXG4vL1xuLy8gQSBmZXcgZW51bXMgY29waWVkIGZyb20gYGZiL1NjaGVtYS50c2AgYW5kIGBmYi9NZXNzYWdlLnRzYCBiZWNhdXNlIFdlYnBhY2tcbi8vIHY0IGRvZXNuJ3Qgc2VlbSB0byBiZSBhYmxlIHRvIHRyZWUtc2hha2UgdGhlIHJlc3Qgb2YgdGhvc2UgZXhwb3J0cy5cbi8vXG4vLyBXZSB3aWxsIGhhdmUgdG8ga2VlcCB0aGVzZSBlbnVtcyBpbiBzeW5jIHdoZW4gd2UgcmUtZ2VuZXJhdGUgdGhlIGZsYXRidWZmZXJzXG4vLyBjb2RlIGZyb20gdGhlIHNoY2hlbWFzLiBTZWUganMvREVWRUxPUC5tZCBmb3IgaW5mbyBvbiBob3cgdG8gcnVuIGZsYXRidWZmZXJzXG4vLyBjb2RlIGdlbmVyYXRpb24uXG4vL1xuLy8vL1xuLyoqXG4gKiBMb2dpY2FsIHR5cGVzLCB2ZWN0b3IgbGF5b3V0cywgYW5kIHNjaGVtYXNcbiAqXG4gKiBAZW51bSB7bnVtYmVyfVxuICovXG5leHBvcnQgdmFyIE1ldGFkYXRhVmVyc2lvbjtcbihmdW5jdGlvbiAoTWV0YWRhdGFWZXJzaW9uKSB7XG4gICAgLyoqXG4gICAgICogMC4xLjAgKE9jdG9iZXIgMjAxNikuXG4gICAgICovXG4gICAgTWV0YWRhdGFWZXJzaW9uW01ldGFkYXRhVmVyc2lvbltcIlYxXCJdID0gMF0gPSBcIlYxXCI7XG4gICAgLyoqXG4gICAgICogMC4yLjAgKEZlYnJ1YXJ5IDIwMTcpLiBOb24tYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBWMS5cbiAgICAgKi9cbiAgICBNZXRhZGF0YVZlcnNpb25bTWV0YWRhdGFWZXJzaW9uW1wiVjJcIl0gPSAxXSA9IFwiVjJcIjtcbiAgICAvKipcbiAgICAgKiAwLjMuMCAtPiAwLjcuMSAoTWF5IC0gRGVjZW1iZXIgMjAxNykuIE5vbi1iYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIFYyLlxuICAgICAqL1xuICAgIE1ldGFkYXRhVmVyc2lvbltNZXRhZGF0YVZlcnNpb25bXCJWM1wiXSA9IDJdID0gXCJWM1wiO1xuICAgIC8qKlxuICAgICAqID49IDAuOC4wIChEZWNlbWJlciAyMDE3KS4gTm9uLWJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggVjMuXG4gICAgICovXG4gICAgTWV0YWRhdGFWZXJzaW9uW01ldGFkYXRhVmVyc2lvbltcIlY0XCJdID0gM10gPSBcIlY0XCI7XG4gICAgLyoqXG4gICAgICogPj0gMS4wLjAgKEp1bHkgMjAyMC4gQmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBWNCAoVjUgcmVhZGVycyBjYW4gcmVhZCBWNFxuICAgICAqIG1ldGFkYXRhIGFuZCBJUEMgbWVzc2FnZXMpLiBJbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHByb3ZpZGUgYVxuICAgICAqIFY0IGNvbXBhdGliaWxpdHkgbW9kZSB3aXRoIFY1IGZvcm1hdCBjaGFuZ2VzIGRpc2FibGVkLlxuICAgICAqXG4gICAgICogSW5jb21wYXRpYmxlIGNoYW5nZXMgYmV0d2VlbiBWNCBhbmQgVjU6XG4gICAgICogLSBVbmlvbiBidWZmZXIgbGF5b3V0IGhhcyBjaGFuZ2VkLiBJbiBWNSwgVW5pb25zIGRvbid0IGhhdmUgYSB2YWxpZGl0eVxuICAgICAqICAgYml0bWFwIGJ1ZmZlci5cbiAgICAgKi9cbiAgICBNZXRhZGF0YVZlcnNpb25bTWV0YWRhdGFWZXJzaW9uW1wiVjVcIl0gPSA0XSA9IFwiVjVcIjtcbn0pKE1ldGFkYXRhVmVyc2lvbiB8fCAoTWV0YWRhdGFWZXJzaW9uID0ge30pKTtcbi8qKlxuICogQGVudW0ge251bWJlcn1cbiAqL1xuZXhwb3J0IHZhciBVbmlvbk1vZGU7XG4oZnVuY3Rpb24gKFVuaW9uTW9kZSkge1xuICAgIFVuaW9uTW9kZVtVbmlvbk1vZGVbXCJTcGFyc2VcIl0gPSAwXSA9IFwiU3BhcnNlXCI7XG4gICAgVW5pb25Nb2RlW1VuaW9uTW9kZVtcIkRlbnNlXCJdID0gMV0gPSBcIkRlbnNlXCI7XG59KShVbmlvbk1vZGUgfHwgKFVuaW9uTW9kZSA9IHt9KSk7XG4vKipcbiAqIEBlbnVtIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCB2YXIgUHJlY2lzaW9uO1xuKGZ1bmN0aW9uIChQcmVjaXNpb24pIHtcbiAgICBQcmVjaXNpb25bUHJlY2lzaW9uW1wiSEFMRlwiXSA9IDBdID0gXCJIQUxGXCI7XG4gICAgUHJlY2lzaW9uW1ByZWNpc2lvbltcIlNJTkdMRVwiXSA9IDFdID0gXCJTSU5HTEVcIjtcbiAgICBQcmVjaXNpb25bUHJlY2lzaW9uW1wiRE9VQkxFXCJdID0gMl0gPSBcIkRPVUJMRVwiO1xufSkoUHJlY2lzaW9uIHx8IChQcmVjaXNpb24gPSB7fSkpO1xuLyoqXG4gKiBAZW51bSB7bnVtYmVyfVxuICovXG5leHBvcnQgdmFyIERhdGVVbml0O1xuKGZ1bmN0aW9uIChEYXRlVW5pdCkge1xuICAgIERhdGVVbml0W0RhdGVVbml0W1wiREFZXCJdID0gMF0gPSBcIkRBWVwiO1xuICAgIERhdGVVbml0W0RhdGVVbml0W1wiTUlMTElTRUNPTkRcIl0gPSAxXSA9IFwiTUlMTElTRUNPTkRcIjtcbn0pKERhdGVVbml0IHx8IChEYXRlVW5pdCA9IHt9KSk7XG4vKipcbiAqIEBlbnVtIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCB2YXIgVGltZVVuaXQ7XG4oZnVuY3Rpb24gKFRpbWVVbml0KSB7XG4gICAgVGltZVVuaXRbVGltZVVuaXRbXCJTRUNPTkRcIl0gPSAwXSA9IFwiU0VDT05EXCI7XG4gICAgVGltZVVuaXRbVGltZVVuaXRbXCJNSUxMSVNFQ09ORFwiXSA9IDFdID0gXCJNSUxMSVNFQ09ORFwiO1xuICAgIFRpbWVVbml0W1RpbWVVbml0W1wiTUlDUk9TRUNPTkRcIl0gPSAyXSA9IFwiTUlDUk9TRUNPTkRcIjtcbiAgICBUaW1lVW5pdFtUaW1lVW5pdFtcIk5BTk9TRUNPTkRcIl0gPSAzXSA9IFwiTkFOT1NFQ09ORFwiO1xufSkoVGltZVVuaXQgfHwgKFRpbWVVbml0ID0ge30pKTtcbi8qKlxuICogQGVudW0ge251bWJlcn1cbiAqL1xuZXhwb3J0IHZhciBJbnRlcnZhbFVuaXQ7XG4oZnVuY3Rpb24gKEludGVydmFsVW5pdCkge1xuICAgIEludGVydmFsVW5pdFtJbnRlcnZhbFVuaXRbXCJZRUFSX01PTlRIXCJdID0gMF0gPSBcIllFQVJfTU9OVEhcIjtcbiAgICBJbnRlcnZhbFVuaXRbSW50ZXJ2YWxVbml0W1wiREFZX1RJTUVcIl0gPSAxXSA9IFwiREFZX1RJTUVcIjtcbiAgICBJbnRlcnZhbFVuaXRbSW50ZXJ2YWxVbml0W1wiTU9OVEhfREFZX05BTk9cIl0gPSAyXSA9IFwiTU9OVEhfREFZX05BTk9cIjtcbn0pKEludGVydmFsVW5pdCB8fCAoSW50ZXJ2YWxVbml0ID0ge30pKTtcbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogVGhlIHJvb3QgTWVzc2FnZSB0eXBlXG4gKiBUaGlzIHVuaW9uIGVuYWJsZXMgdXMgdG8gZWFzaWx5IHNlbmQgZGlmZmVyZW50IG1lc3NhZ2UgdHlwZXMgd2l0aG91dFxuICogcmVkdW5kYW50IHN0b3JhZ2UsIGFuZCBpbiB0aGUgZnV0dXJlIHdlIGNhbiBlYXNpbHkgYWRkIG5ldyBtZXNzYWdlIHR5cGVzLlxuICpcbiAqIEFycm93IGltcGxlbWVudGF0aW9ucyBkbyBub3QgbmVlZCB0byBpbXBsZW1lbnQgYWxsIG9mIHRoZSBtZXNzYWdlIHR5cGVzLFxuICogd2hpY2ggbWF5IGluY2x1ZGUgZXhwZXJpbWVudGFsIG1ldGFkYXRhIHR5cGVzLiBGb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5LFxuICogaXQgaXMgYmVzdCB0byBzZW5kIGRhdGEgdXNpbmcgUmVjb3JkQmF0Y2hcbiAqXG4gKiBAZW51bSB7bnVtYmVyfVxuICovXG5leHBvcnQgdmFyIE1lc3NhZ2VIZWFkZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VIZWFkZXIpIHtcbiAgICBNZXNzYWdlSGVhZGVyW01lc3NhZ2VIZWFkZXJbXCJOT05FXCJdID0gMF0gPSBcIk5PTkVcIjtcbiAgICBNZXNzYWdlSGVhZGVyW01lc3NhZ2VIZWFkZXJbXCJTY2hlbWFcIl0gPSAxXSA9IFwiU2NoZW1hXCI7XG4gICAgTWVzc2FnZUhlYWRlcltNZXNzYWdlSGVhZGVyW1wiRGljdGlvbmFyeUJhdGNoXCJdID0gMl0gPSBcIkRpY3Rpb25hcnlCYXRjaFwiO1xuICAgIE1lc3NhZ2VIZWFkZXJbTWVzc2FnZUhlYWRlcltcIlJlY29yZEJhdGNoXCJdID0gM10gPSBcIlJlY29yZEJhdGNoXCI7XG4gICAgTWVzc2FnZUhlYWRlcltNZXNzYWdlSGVhZGVyW1wiVGVuc29yXCJdID0gNF0gPSBcIlRlbnNvclwiO1xuICAgIE1lc3NhZ2VIZWFkZXJbTWVzc2FnZUhlYWRlcltcIlNwYXJzZVRlbnNvclwiXSA9IDVdID0gXCJTcGFyc2VUZW5zb3JcIjtcbn0pKE1lc3NhZ2VIZWFkZXIgfHwgKE1lc3NhZ2VIZWFkZXIgPSB7fSkpO1xuLyoqXG4gKiBNYWluIGRhdGEgdHlwZSBlbnVtZXJhdGlvbi5cbiAqXG4gKiBEYXRhIHR5cGVzIGluIHRoaXMgbGlicmFyeSBhcmUgYWxsICpsb2dpY2FsKi4gVGhleSBjYW4gYmUgZXhwcmVzc2VkIGFzXG4gKiBlaXRoZXIgYSBwcmltaXRpdmUgcGh5c2ljYWwgdHlwZSAoYnl0ZXMgb3IgYml0cyBvZiBzb21lIGZpeGVkIHNpemUpLCBhXG4gKiBuZXN0ZWQgdHlwZSBjb25zaXN0aW5nIG9mIG90aGVyIGRhdGEgdHlwZXMsIG9yIGFub3RoZXIgZGF0YSB0eXBlIChlLmcuIGFcbiAqIHRpbWVzdGFtcCBlbmNvZGVkIGFzIGFuIGludDY0KS5cbiAqXG4gKiAqKk5vdGUqKjogT25seSBlbnVtIHZhbHVlcyAwLTE3IChOT05FIHRocm91Z2ggTWFwKSBhcmUgd3JpdHRlbiB0byBhbiBBcnJvd1xuICogSVBDIHBheWxvYWQuXG4gKlxuICogVGhlIHJlc3Qgb2YgdGhlIHZhbHVlcyBhcmUgc3BlY2lmaWVkIGhlcmUgc28gVHlwZVNjcmlwdCBjYW4gbmFycm93IHRoZSB0eXBlXG4gKiBzaWduYXR1cmVzIGZ1cnRoZXIgYmV5b25kIHRoZSBiYXNlIEFycm93IFR5cGVzLiBUaGUgQXJyb3cgRGF0YVR5cGVzIGluY2x1ZGVcbiAqIG1ldGFkYXRhIGxpa2UgYGJpdFdpZHRoYCB0aGF0IGltcGFjdCB0aGUgdHlwZSBzaWduYXR1cmVzIG9mIHRoZSB2YWx1ZXMgd2VcbiAqIGFjY2VwdCBhbmQgcmV0dXJuLlxuICpcbiAqIEZvciBleGFtcGxlLCB0aGUgYEludDhWZWN0b3JgIHJlYWRzIDEtYnl0ZSBudW1iZXJzIGZyb20gYW4gYEludDhBcnJheWAsIGFuXG4gKiBgSW50MzJWZWN0b3JgIHJlYWRzIGEgNC1ieXRlIG51bWJlciBmcm9tIGFuIGBJbnQzMkFycmF5YCwgYW5kIGFuIGBJbnQ2NFZlY3RvcmBcbiAqIHJlYWRzIGEgcGFpciBvZiA0LWJ5dGUgbG8sIGhpIDMyLWJpdCBpbnRlZ2VycyBhcyBhIHplcm8tY29weSBzbGljZSBmcm9tIHRoZVxuICogdW5kZXJseWluZyBgSW50MzJBcnJheWAuXG4gKlxuICogTGlicmFyeSBjb25zdW1lcnMgYmVuZWZpdCBieSBrbm93aW5nIHRoZSBuYXJyb3dlc3QgdHlwZSwgc2luY2Ugd2UgY2FuIGVuc3VyZVxuICogdGhlIHR5cGVzIGFjcm9zcyBhbGwgcHVibGljIG1ldGhvZHMgYXJlIHByb3BhZ2F0ZWQsIGFuZCBuZXZlciBiYWlsIHRvIGBhbnlgLlxuICogVGhlc2UgdmFsdWVzIGFyZSBfbmV2ZXJfIHVzZWQgYXQgcnVudGltZSwgYW5kIHRoZXkgd2lsbCBfbmV2ZXJfIGJlIHdyaXR0ZW5cbiAqIHRvIHRoZSBmbGF0YnVmZmVycyBtZXRhZGF0YSBvZiBzZXJpYWxpemVkIEFycm93IElQQyBwYXlsb2Fkcy5cbiAqL1xuZXhwb3J0IHZhciBUeXBlO1xuKGZ1bmN0aW9uIChUeXBlKSB7XG4gICAgVHlwZVtUeXBlW1wiTk9ORVwiXSA9IDBdID0gXCJOT05FXCI7XG4gICAgVHlwZVtUeXBlW1wiTnVsbFwiXSA9IDFdID0gXCJOdWxsXCI7XG4gICAgVHlwZVtUeXBlW1wiSW50XCJdID0gMl0gPSBcIkludFwiO1xuICAgIFR5cGVbVHlwZVtcIkZsb2F0XCJdID0gM10gPSBcIkZsb2F0XCI7XG4gICAgVHlwZVtUeXBlW1wiQmluYXJ5XCJdID0gNF0gPSBcIkJpbmFyeVwiO1xuICAgIFR5cGVbVHlwZVtcIlV0ZjhcIl0gPSA1XSA9IFwiVXRmOFwiO1xuICAgIFR5cGVbVHlwZVtcIkJvb2xcIl0gPSA2XSA9IFwiQm9vbFwiO1xuICAgIFR5cGVbVHlwZVtcIkRlY2ltYWxcIl0gPSA3XSA9IFwiRGVjaW1hbFwiO1xuICAgIFR5cGVbVHlwZVtcIkRhdGVcIl0gPSA4XSA9IFwiRGF0ZVwiO1xuICAgIFR5cGVbVHlwZVtcIlRpbWVcIl0gPSA5XSA9IFwiVGltZVwiO1xuICAgIFR5cGVbVHlwZVtcIlRpbWVzdGFtcFwiXSA9IDEwXSA9IFwiVGltZXN0YW1wXCI7XG4gICAgVHlwZVtUeXBlW1wiSW50ZXJ2YWxcIl0gPSAxMV0gPSBcIkludGVydmFsXCI7XG4gICAgVHlwZVtUeXBlW1wiTGlzdFwiXSA9IDEyXSA9IFwiTGlzdFwiO1xuICAgIFR5cGVbVHlwZVtcIlN0cnVjdFwiXSA9IDEzXSA9IFwiU3RydWN0XCI7XG4gICAgVHlwZVtUeXBlW1wiVW5pb25cIl0gPSAxNF0gPSBcIlVuaW9uXCI7XG4gICAgVHlwZVtUeXBlW1wiRml4ZWRTaXplQmluYXJ5XCJdID0gMTVdID0gXCJGaXhlZFNpemVCaW5hcnlcIjtcbiAgICBUeXBlW1R5cGVbXCJGaXhlZFNpemVMaXN0XCJdID0gMTZdID0gXCJGaXhlZFNpemVMaXN0XCI7XG4gICAgVHlwZVtUeXBlW1wiTWFwXCJdID0gMTddID0gXCJNYXBcIjtcbiAgICBUeXBlW1R5cGVbXCJEaWN0aW9uYXJ5XCJdID0gLTFdID0gXCJEaWN0aW9uYXJ5XCI7XG4gICAgVHlwZVtUeXBlW1wiSW50OFwiXSA9IC0yXSA9IFwiSW50OFwiO1xuICAgIFR5cGVbVHlwZVtcIkludDE2XCJdID0gLTNdID0gXCJJbnQxNlwiO1xuICAgIFR5cGVbVHlwZVtcIkludDMyXCJdID0gLTRdID0gXCJJbnQzMlwiO1xuICAgIFR5cGVbVHlwZVtcIkludDY0XCJdID0gLTVdID0gXCJJbnQ2NFwiO1xuICAgIFR5cGVbVHlwZVtcIlVpbnQ4XCJdID0gLTZdID0gXCJVaW50OFwiO1xuICAgIFR5cGVbVHlwZVtcIlVpbnQxNlwiXSA9IC03XSA9IFwiVWludDE2XCI7XG4gICAgVHlwZVtUeXBlW1wiVWludDMyXCJdID0gLThdID0gXCJVaW50MzJcIjtcbiAgICBUeXBlW1R5cGVbXCJVaW50NjRcIl0gPSAtOV0gPSBcIlVpbnQ2NFwiO1xuICAgIFR5cGVbVHlwZVtcIkZsb2F0MTZcIl0gPSAtMTBdID0gXCJGbG9hdDE2XCI7XG4gICAgVHlwZVtUeXBlW1wiRmxvYXQzMlwiXSA9IC0xMV0gPSBcIkZsb2F0MzJcIjtcbiAgICBUeXBlW1R5cGVbXCJGbG9hdDY0XCJdID0gLTEyXSA9IFwiRmxvYXQ2NFwiO1xuICAgIFR5cGVbVHlwZVtcIkRhdGVEYXlcIl0gPSAtMTNdID0gXCJEYXRlRGF5XCI7XG4gICAgVHlwZVtUeXBlW1wiRGF0ZU1pbGxpc2Vjb25kXCJdID0gLTE0XSA9IFwiRGF0ZU1pbGxpc2Vjb25kXCI7XG4gICAgVHlwZVtUeXBlW1wiVGltZXN0YW1wU2Vjb25kXCJdID0gLTE1XSA9IFwiVGltZXN0YW1wU2Vjb25kXCI7XG4gICAgVHlwZVtUeXBlW1wiVGltZXN0YW1wTWlsbGlzZWNvbmRcIl0gPSAtMTZdID0gXCJUaW1lc3RhbXBNaWxsaXNlY29uZFwiO1xuICAgIFR5cGVbVHlwZVtcIlRpbWVzdGFtcE1pY3Jvc2Vjb25kXCJdID0gLTE3XSA9IFwiVGltZXN0YW1wTWljcm9zZWNvbmRcIjtcbiAgICBUeXBlW1R5cGVbXCJUaW1lc3RhbXBOYW5vc2Vjb25kXCJdID0gLTE4XSA9IFwiVGltZXN0YW1wTmFub3NlY29uZFwiO1xuICAgIFR5cGVbVHlwZVtcIlRpbWVTZWNvbmRcIl0gPSAtMTldID0gXCJUaW1lU2Vjb25kXCI7XG4gICAgVHlwZVtUeXBlW1wiVGltZU1pbGxpc2Vjb25kXCJdID0gLTIwXSA9IFwiVGltZU1pbGxpc2Vjb25kXCI7XG4gICAgVHlwZVtUeXBlW1wiVGltZU1pY3Jvc2Vjb25kXCJdID0gLTIxXSA9IFwiVGltZU1pY3Jvc2Vjb25kXCI7XG4gICAgVHlwZVtUeXBlW1wiVGltZU5hbm9zZWNvbmRcIl0gPSAtMjJdID0gXCJUaW1lTmFub3NlY29uZFwiO1xuICAgIFR5cGVbVHlwZVtcIkRlbnNlVW5pb25cIl0gPSAtMjNdID0gXCJEZW5zZVVuaW9uXCI7XG4gICAgVHlwZVtUeXBlW1wiU3BhcnNlVW5pb25cIl0gPSAtMjRdID0gXCJTcGFyc2VVbmlvblwiO1xuICAgIFR5cGVbVHlwZVtcIkludGVydmFsRGF5VGltZVwiXSA9IC0yNV0gPSBcIkludGVydmFsRGF5VGltZVwiO1xuICAgIFR5cGVbVHlwZVtcIkludGVydmFsWWVhck1vbnRoXCJdID0gLTI2XSA9IFwiSW50ZXJ2YWxZZWFyTW9udGhcIjtcbn0pKFR5cGUgfHwgKFR5cGUgPSB7fSkpO1xuZXhwb3J0IHZhciBCdWZmZXJUeXBlO1xuKGZ1bmN0aW9uIChCdWZmZXJUeXBlKSB7XG4gICAgLyoqXG4gICAgICogdXNlZCBpbiBMaXN0IHR5cGUsIERlbnNlIFVuaW9uIGFuZCB2YXJpYWJsZSBsZW5ndGggcHJpbWl0aXZlIHR5cGVzIChTdHJpbmcsIEJpbmFyeSlcbiAgICAgKi9cbiAgICBCdWZmZXJUeXBlW0J1ZmZlclR5cGVbXCJPRkZTRVRcIl0gPSAwXSA9IFwiT0ZGU0VUXCI7XG4gICAgLyoqXG4gICAgICogYWN0dWFsIGRhdGEsIGVpdGhlciB3aXhlZCB3aWR0aCBwcmltaXRpdmUgdHlwZXMgaW4gc2xvdHMgb3IgdmFyaWFibGUgd2lkdGggZGVsaW1pdGVkIGJ5IGFuIE9GRlNFVCB2ZWN0b3JcbiAgICAgKi9cbiAgICBCdWZmZXJUeXBlW0J1ZmZlclR5cGVbXCJEQVRBXCJdID0gMV0gPSBcIkRBVEFcIjtcbiAgICAvKipcbiAgICAgKiBCaXQgdmVjdG9yIGluZGljYXRpbmcgaWYgZWFjaCB2YWx1ZSBpcyBudWxsXG4gICAgICovXG4gICAgQnVmZmVyVHlwZVtCdWZmZXJUeXBlW1wiVkFMSURJVFlcIl0gPSAyXSA9IFwiVkFMSURJVFlcIjtcbiAgICAvKipcbiAgICAgKiBUeXBlIHZlY3RvciB1c2VkIGluIFVuaW9uIHR5cGVcbiAgICAgKi9cbiAgICBCdWZmZXJUeXBlW0J1ZmZlclR5cGVbXCJUWVBFXCJdID0gM10gPSBcIlRZUEVcIjtcbn0pKEJ1ZmZlclR5cGUgfHwgKEJ1ZmZlclR5cGUgPSB7fSkpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbnVtLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgX19hc3luY0dlbmVyYXRvciwgX19hc3luY1ZhbHVlcywgX19hd2FpdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgRmllbGQsIFNjaGVtYSB9IGZyb20gJy4vc2NoZW1hLm1qcyc7XG5pbXBvcnQgKiBhcyBkdHlwZXMgZnJvbSAnLi90eXBlLm1qcyc7XG5pbXBvcnQgeyBEYXRhIH0gZnJvbSAnLi9kYXRhLm1qcyc7XG5pbXBvcnQgeyBWZWN0b3IsIG1ha2VWZWN0b3IgfSBmcm9tICcuL3ZlY3Rvci5tanMnO1xuaW1wb3J0IHsgaW5zdGFuY2UgYXMgZ2V0QnVpbGRlckNvbnN0cnVjdG9yIH0gZnJvbSAnLi92aXNpdG9yL2J1aWxkZXJjdG9yLm1qcyc7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gJy4vdGFibGUubWpzJztcbmltcG9ydCB7IFJlY29yZEJhdGNoIH0gZnJvbSAnLi9yZWNvcmRiYXRjaC5tanMnO1xuaW1wb3J0IHsgY29tcGFyZVR5cGVzIH0gZnJvbSAnLi92aXNpdG9yL3R5cGVjb21wYXJhdG9yLm1qcyc7XG5leHBvcnQgZnVuY3Rpb24gbWFrZUJ1aWxkZXIob3B0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBvcHRpb25zLnR5cGU7XG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyAoZ2V0QnVpbGRlckNvbnN0cnVjdG9yLmdldFZpc2l0Rm4odHlwZSkoKSkob3B0aW9ucyk7XG4gICAgaWYgKHR5cGUuY2hpbGRyZW4gJiYgdHlwZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gb3B0aW9uc1snY2hpbGRyZW4nXSB8fCBbXTtcbiAgICAgICAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7ICdudWxsVmFsdWVzJzogb3B0aW9uc1snbnVsbFZhbHVlcyddIH07XG4gICAgICAgIGNvbnN0IGdldENoaWxkT3B0aW9ucyA9IEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pXG4gICAgICAgICAgICA/ICgoXywgaSkgPT4gY2hpbGRyZW5baV0gfHwgZGVmYXVsdE9wdGlvbnMpXG4gICAgICAgICAgICA6ICgoeyBuYW1lIH0pID0+IGNoaWxkcmVuW25hbWVdIHx8IGRlZmF1bHRPcHRpb25zKTtcbiAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGZpZWxkXSBvZiB0eXBlLmNoaWxkcmVuLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgeyB0eXBlIH0gPSBmaWVsZDtcbiAgICAgICAgICAgIGNvbnN0IG9wdHMgPSBnZXRDaGlsZE9wdGlvbnMoZmllbGQsIGluZGV4KTtcbiAgICAgICAgICAgIGJ1aWxkZXIuY2hpbGRyZW4ucHVzaChtYWtlQnVpbGRlcihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdHMpLCB7IHR5cGUgfSkpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYnVpbGRlcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JGcm9tQXJyYXkoaW5pdCwgdHlwZSkge1xuICAgIGlmIChpbml0IGluc3RhbmNlb2YgRGF0YSB8fCBpbml0IGluc3RhbmNlb2YgVmVjdG9yIHx8IGluaXQudHlwZSBpbnN0YW5jZW9mIGR0eXBlcy5EYXRhVHlwZSB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcoaW5pdCkpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VWZWN0b3IoaW5pdCk7XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvbnMgPSB7IHR5cGU6IHR5cGUgIT09IG51bGwgJiYgdHlwZSAhPT0gdm9pZCAwID8gdHlwZSA6IGluZmVyVHlwZShpbml0KSwgbnVsbFZhbHVlczogW251bGxdIH07XG4gICAgY29uc3QgY2h1bmtzID0gWy4uLmJ1aWxkZXJUaHJvdWdoSXRlcmFibGUob3B0aW9ucykoaW5pdCldO1xuICAgIGNvbnN0IHZlY3RvciA9IGNodW5rcy5sZW5ndGggPT09IDEgPyBjaHVua3NbMF0gOiBjaHVua3MucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSk7XG4gICAgaWYgKGR0eXBlcy5EYXRhVHlwZS5pc0RpY3Rpb25hcnkodmVjdG9yLnR5cGUpKSB7XG4gICAgICAgIHJldHVybiB2ZWN0b3IubWVtb2l6ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdmVjdG9yO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEge0BsaW5rIFRhYmxlfSBmcm9tIGFuIGFycmF5IG9mIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIGFycmF5IEEgdGFibGUgb2Ygb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhYmxlRnJvbUpTT04oYXJyYXkpIHtcbiAgICBjb25zdCB2ZWN0b3IgPSB2ZWN0b3JGcm9tQXJyYXkoYXJyYXkpO1xuICAgIGNvbnN0IGJhdGNoID0gbmV3IFJlY29yZEJhdGNoKG5ldyBTY2hlbWEodmVjdG9yLnR5cGUuY2hpbGRyZW4pLCB2ZWN0b3IuZGF0YVswXSk7XG4gICAgcmV0dXJuIG5ldyBUYWJsZShiYXRjaCk7XG59XG5mdW5jdGlvbiBpbmZlclR5cGUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgZHR5cGVzLk51bGw7XG4gICAgfVxuICAgIGxldCBudWxsc0NvdW50ID0gMDtcbiAgICBsZXQgYXJyYXlzQ291bnQgPSAwO1xuICAgIGxldCBvYmplY3RzQ291bnQgPSAwO1xuICAgIGxldCBudW1iZXJzQ291bnQgPSAwO1xuICAgIGxldCBzdHJpbmdzQ291bnQgPSAwO1xuICAgIGxldCBiaWdpbnRzQ291bnQgPSAwO1xuICAgIGxldCBib29sZWFuc0NvdW50ID0gMDtcbiAgICBsZXQgZGF0ZXNDb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCB2YWwgb2YgdmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgICAgICArK251bGxzQ291bnQ7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWwpIHtcbiAgICAgICAgICAgIGNhc2UgJ2JpZ2ludCc6XG4gICAgICAgICAgICAgICAgKytiaWdpbnRzQ291bnQ7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICAgICAgICArK2Jvb2xlYW5zQ291bnQ7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgICAgICsrbnVtYmVyc0NvdW50O1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICArK3N0cmluZ3NDb3VudDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgICAgICAgICArK2FycmF5c0NvdW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRGF0ZV0nKSB7XG4gICAgICAgICAgICAgICAgICAgICsrZGF0ZXNDb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICsrb2JqZWN0c0NvdW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmFibGUgdG8gaW5mZXIgVmVjdG9yIHR5cGUgZnJvbSBpbnB1dCB2YWx1ZXMsIGV4cGxpY2l0IHR5cGUgZGVjbGFyYXRpb24gZXhwZWN0ZWQnKTtcbiAgICB9XG4gICAgaWYgKG51bWJlcnNDb3VudCArIG51bGxzQ291bnQgPT09IHZhbHVlLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IGR0eXBlcy5GbG9hdDY0O1xuICAgIH1cbiAgICBlbHNlIGlmIChzdHJpbmdzQ291bnQgKyBudWxsc0NvdW50ID09PSB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBkdHlwZXMuRGljdGlvbmFyeShuZXcgZHR5cGVzLlV0ZjgsIG5ldyBkdHlwZXMuSW50MzIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChiaWdpbnRzQ291bnQgKyBudWxsc0NvdW50ID09PSB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBkdHlwZXMuSW50NjQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGJvb2xlYW5zQ291bnQgKyBudWxsc0NvdW50ID09PSB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBkdHlwZXMuQm9vbDtcbiAgICB9XG4gICAgZWxzZSBpZiAoZGF0ZXNDb3VudCArIG51bGxzQ291bnQgPT09IHZhbHVlLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IGR0eXBlcy5EYXRlTWlsbGlzZWNvbmQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFycmF5c0NvdW50ICsgbnVsbHNDb3VudCA9PT0gdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGFycmF5ID0gdmFsdWU7XG4gICAgICAgIGNvbnN0IGNoaWxkVHlwZSA9IGluZmVyVHlwZShhcnJheVthcnJheS5maW5kSW5kZXgoKGFyeSkgPT4gYXJ5ICE9IG51bGwpXSk7XG4gICAgICAgIGlmIChhcnJheS5ldmVyeSgoYXJ5KSA9PiBhcnkgPT0gbnVsbCB8fCBjb21wYXJlVHlwZXMoY2hpbGRUeXBlLCBpbmZlclR5cGUoYXJ5KSkpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGR0eXBlcy5MaXN0KG5ldyBGaWVsZCgnJywgY2hpbGRUeXBlLCB0cnVlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAob2JqZWN0c0NvdW50ICsgbnVsbHNDb3VudCA9PT0gdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgZm9yIChjb25zdCByb3cgb2YgdmFsdWUpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJvdykpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWZpZWxkcy5oYXMoa2V5KSAmJiByb3dba2V5XSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgdHlwZSBpbmZlcnJlZCBmb3IgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGEgZm91bmQga2V5XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkcy5zZXQoa2V5LCBuZXcgRmllbGQoa2V5LCBpbmZlclR5cGUoW3Jvd1trZXldXSksIHRydWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBkdHlwZXMuU3RydWN0KFsuLi5maWVsZHMudmFsdWVzKCldKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5hYmxlIHRvIGluZmVyIFZlY3RvciB0eXBlIGZyb20gaW5wdXQgdmFsdWVzLCBleHBsaWNpdCB0eXBlIGRlY2xhcmF0aW9uIGV4cGVjdGVkJyk7XG59XG4vKipcbiAqIFRyYW5zZm9ybSBhIHN5bmNocm9ub3VzIGBJdGVyYWJsZWAgb2YgYXJiaXRyYXJ5IEphdmFTY3JpcHQgdmFsdWVzIGludG8gYVxuICogc2VxdWVuY2Ugb2YgQXJyb3cgVmVjdG9yPFQ+IGZvbGxvd2luZyB0aGUgY2h1bmtpbmcgc2VtYW50aWNzIGRlZmluZWQgaW5cbiAqIHRoZSBzdXBwbGllZCBgb3B0aW9uc2AgYXJndW1lbnQuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFuIGBJdGVyYWJsZWAgb2YgdmFsdWVzIHRvXG4gKiB0cmFuc2Zvcm0uIFdoZW4gY2FsbGVkLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gSXRlcmF0b3Igb2YgYFZlY3RvcjxUPmAuXG4gKlxuICogVGhlIHJlc3VsdGluZyBgSXRlcmF0b3I8VmVjdG9yPFQ+PmAgeWllbGRzIFZlY3RvcnMgYmFzZWQgb24gdGhlXG4gKiBgcXVldWVpbmdTdHJhdGVneWAgYW5kIGBoaWdoV2F0ZXJNYXJrYCBzcGVjaWZpZWQgaW4gdGhlIGBvcHRpb25zYCBhcmd1bWVudC5cbiAqXG4gKiAqIElmIGBxdWV1ZWluZ1N0cmF0ZWd5YCBpcyBgXCJjb3VudFwiYCAob3Igb21pdHRlZCksIFRoZSBgSXRlcmF0b3I8VmVjdG9yPFQ+PmBcbiAqICAgd2lsbCBmbHVzaCB0aGUgdW5kZXJseWluZyBgQnVpbGRlcmAgKGFuZCB5aWVsZCBhIG5ldyBgVmVjdG9yPFQ+YCkgb25jZSB0aGVcbiAqICAgQnVpbGRlcidzIGBsZW5ndGhgIHJlYWNoZXMgb3IgZXhjZWVkcyB0aGUgc3VwcGxpZWQgYGhpZ2hXYXRlck1hcmtgLlxuICogKiBJZiBgcXVldWVpbmdTdHJhdGVneWAgaXMgYFwiYnl0ZXNcImAsIHRoZSBgSXRlcmF0b3I8VmVjdG9yPFQ+PmAgd2lsbCBmbHVzaFxuICogICB0aGUgdW5kZXJseWluZyBgQnVpbGRlcmAgKGFuZCB5aWVsZCBhIG5ldyBgVmVjdG9yPFQ+YCkgb25jZSBpdHMgYGJ5dGVMZW5ndGhgXG4gKiAgIHJlYWNoZXMgb3IgZXhjZWVkcyB0aGUgc3VwcGxpZWQgYGhpZ2hXYXRlck1hcmtgLlxuICpcbiAqIEBwYXJhbSB7SXRlcmFibGVCdWlsZGVyT3B0aW9uczxULCBUTnVsbD59IG9wdGlvbnMgQW4gb2JqZWN0IG9mIHByb3BlcnRpZXMgd2hpY2ggZGV0ZXJtaW5lIHRoZSBgQnVpbGRlcmAgdG8gY3JlYXRlIGFuZCB0aGUgY2h1bmtpbmcgc2VtYW50aWNzIHRvIHVzZS5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gd2hpY2ggYWNjZXB0cyBhIEphdmFTY3JpcHQgYEl0ZXJhYmxlYCBvZiB2YWx1ZXMgdG9cbiAqICAgICAgICAgIHdyaXRlLCBhbmQgcmV0dXJucyBhbiBgSXRlcmF0b3JgIHRoYXQgeWllbGRzIFZlY3RvcnMgYWNjb3JkaW5nXG4gKiAgICAgICAgICB0byB0aGUgY2h1bmtpbmcgc2VtYW50aWNzIGRlZmluZWQgaW4gdGhlIGBvcHRpb25zYCBhcmd1bWVudC5cbiAqIEBub2NvbGxhcHNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZGVyVGhyb3VnaEl0ZXJhYmxlKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IFsncXVldWVpbmdTdHJhdGVneSddOiBxdWV1ZWluZ1N0cmF0ZWd5ID0gJ2NvdW50JyB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB7IFsnaGlnaFdhdGVyTWFyayddOiBoaWdoV2F0ZXJNYXJrID0gcXVldWVpbmdTdHJhdGVneSAhPT0gJ2J5dGVzJyA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6IE1hdGgucG93KDIsIDE0KSB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBzaXplUHJvcGVydHkgPSBxdWV1ZWluZ1N0cmF0ZWd5ICE9PSAnYnl0ZXMnID8gJ2xlbmd0aCcgOiAnYnl0ZUxlbmd0aCc7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKiAoc291cmNlKSB7XG4gICAgICAgIGxldCBudW1DaHVua3MgPSAwO1xuICAgICAgICBjb25zdCBidWlsZGVyID0gbWFrZUJ1aWxkZXIob3B0aW9ucyk7XG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoYnVpbGRlci5hcHBlbmQodmFsdWUpW3NpemVQcm9wZXJ0eV0gPj0gaGlnaFdhdGVyTWFyaykge1xuICAgICAgICAgICAgICAgICsrbnVtQ2h1bmtzICYmICh5aWVsZCBidWlsZGVyLnRvVmVjdG9yKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChidWlsZGVyLmZpbmlzaCgpLmxlbmd0aCA+IDAgfHwgbnVtQ2h1bmtzID09PSAwKSB7XG4gICAgICAgICAgICB5aWVsZCBidWlsZGVyLnRvVmVjdG9yKCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuLyoqXG4gKiBUcmFuc2Zvcm0gYW4gYEFzeW5jSXRlcmFibGVgIG9mIGFyYml0cmFyeSBKYXZhU2NyaXB0IHZhbHVlcyBpbnRvIGFcbiAqIHNlcXVlbmNlIG9mIEFycm93IFZlY3RvcjxUPiBmb2xsb3dpbmcgdGhlIGNodW5raW5nIHNlbWFudGljcyBkZWZpbmVkIGluXG4gKiB0aGUgc3VwcGxpZWQgYG9wdGlvbnNgIGFyZ3VtZW50LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhbiBgQXN5bmNJdGVyYWJsZWAgb2YgdmFsdWVzIHRvXG4gKiB0cmFuc2Zvcm0uIFdoZW4gY2FsbGVkLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gQXN5bmNJdGVyYXRvciBvZiBgVmVjdG9yPFQ+YC5cbiAqXG4gKiBUaGUgcmVzdWx0aW5nIGBBc3luY0l0ZXJhdG9yPFZlY3RvcjxUPj5gIHlpZWxkcyBWZWN0b3JzIGJhc2VkIG9uIHRoZVxuICogYHF1ZXVlaW5nU3RyYXRlZ3lgIGFuZCBgaGlnaFdhdGVyTWFya2Agc3BlY2lmaWVkIGluIHRoZSBgb3B0aW9uc2AgYXJndW1lbnQuXG4gKlxuICogKiBJZiBgcXVldWVpbmdTdHJhdGVneWAgaXMgYFwiY291bnRcImAgKG9yIG9taXR0ZWQpLCBUaGUgYEFzeW5jSXRlcmF0b3I8VmVjdG9yPFQ+PmBcbiAqICAgd2lsbCBmbHVzaCB0aGUgdW5kZXJseWluZyBgQnVpbGRlcmAgKGFuZCB5aWVsZCBhIG5ldyBgVmVjdG9yPFQ+YCkgb25jZSB0aGVcbiAqICAgQnVpbGRlcidzIGBsZW5ndGhgIHJlYWNoZXMgb3IgZXhjZWVkcyB0aGUgc3VwcGxpZWQgYGhpZ2hXYXRlck1hcmtgLlxuICogKiBJZiBgcXVldWVpbmdTdHJhdGVneWAgaXMgYFwiYnl0ZXNcImAsIHRoZSBgQXN5bmNJdGVyYXRvcjxWZWN0b3I8VD4+YCB3aWxsIGZsdXNoXG4gKiAgIHRoZSB1bmRlcmx5aW5nIGBCdWlsZGVyYCAoYW5kIHlpZWxkIGEgbmV3IGBWZWN0b3I8VD5gKSBvbmNlIGl0cyBgYnl0ZUxlbmd0aGBcbiAqICAgcmVhY2hlcyBvciBleGNlZWRzIHRoZSBzdXBwbGllZCBgaGlnaFdhdGVyTWFya2AuXG4gKlxuICogQHBhcmFtIHtJdGVyYWJsZUJ1aWxkZXJPcHRpb25zPFQsIFROdWxsPn0gb3B0aW9ucyBBbiBvYmplY3Qgb2YgcHJvcGVydGllcyB3aGljaCBkZXRlcm1pbmUgdGhlIGBCdWlsZGVyYCB0byBjcmVhdGUgYW5kIHRoZSBjaHVua2luZyBzZW1hbnRpY3MgdG8gdXNlLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB3aGljaCBhY2NlcHRzIGEgSmF2YVNjcmlwdCBgQXN5bmNJdGVyYWJsZWAgb2YgdmFsdWVzXG4gKiAgICAgICAgICB0byB3cml0ZSwgYW5kIHJldHVybnMgYW4gYEFzeW5jSXRlcmF0b3JgIHRoYXQgeWllbGRzIFZlY3RvcnNcbiAqICAgICAgICAgIGFjY29yZGluZyB0byB0aGUgY2h1bmtpbmcgc2VtYW50aWNzIGRlZmluZWQgaW4gdGhlIGBvcHRpb25zYFxuICogICAgICAgICAgYXJndW1lbnQuXG4gKiBAbm9jb2xsYXBzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRlclRocm91Z2hBc3luY0l0ZXJhYmxlKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IFsncXVldWVpbmdTdHJhdGVneSddOiBxdWV1ZWluZ1N0cmF0ZWd5ID0gJ2NvdW50JyB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB7IFsnaGlnaFdhdGVyTWFyayddOiBoaWdoV2F0ZXJNYXJrID0gcXVldWVpbmdTdHJhdGVneSAhPT0gJ2J5dGVzJyA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6IE1hdGgucG93KDIsIDE0KSB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBzaXplUHJvcGVydHkgPSBxdWV1ZWluZ1N0cmF0ZWd5ICE9PSAnYnl0ZXMnID8gJ2xlbmd0aCcgOiAnYnl0ZUxlbmd0aCc7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgICAgICBsZXQgbnVtQ2h1bmtzID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBtYWtlQnVpbGRlcihvcHRpb25zKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgc291cmNlXzEgPSBfX2FzeW5jVmFsdWVzKHNvdXJjZSksIHNvdXJjZV8xXzE7IHNvdXJjZV8xXzEgPSB5aWVsZCBfX2F3YWl0KHNvdXJjZV8xLm5leHQoKSksICFzb3VyY2VfMV8xLmRvbmU7KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gc291cmNlXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIuYXBwZW5kKHZhbHVlKVtzaXplUHJvcGVydHldID49IGhpZ2hXYXRlck1hcmspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICsrbnVtQ2h1bmtzICYmICh5aWVsZCB5aWVsZCBfX2F3YWl0KGJ1aWxkZXIudG9WZWN0b3IoKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VfMV8xICYmICFzb3VyY2VfMV8xLmRvbmUgJiYgKF9hID0gc291cmNlXzEucmV0dXJuKSkgeWllbGQgX19hd2FpdChfYS5jYWxsKHNvdXJjZV8xKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChidWlsZGVyLmZpbmlzaCgpLmxlbmd0aCA+IDAgfHwgbnVtQ2h1bmtzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgeWllbGQgX19hd2FpdChidWlsZGVyLnRvVmVjdG9yKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1mYWN0b3JpZXMubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG4vKipcbiAqIE9wYXF1ZSBiaW5hcnkgZGF0YVxuICovXG5leHBvcnQgY2xhc3MgQmluYXJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc0JpbmFyeShiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBCaW5hcnkoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0JpbmFyeShiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgQmluYXJ5KCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydEJpbmFyeShidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmRCaW5hcnkoYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlQmluYXJ5KGJ1aWxkZXIpIHtcbiAgICAgICAgQmluYXJ5LnN0YXJ0QmluYXJ5KGJ1aWxkZXIpO1xuICAgICAgICByZXR1cm4gQmluYXJ5LmVuZEJpbmFyeShidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJpbmFyeS5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmV4cG9ydCBjbGFzcyBCbG9jayB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluZGV4IHRvIHRoZSBzdGFydCBvZiB0aGUgUmVjb3JkQmxvY2sgKG5vdGUgdGhpcyBpcyBwYXN0IHRoZSBNZXNzYWdlIGhlYWRlcilcbiAgICAgKi9cbiAgICBvZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3Bvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExlbmd0aCBvZiB0aGUgbWV0YWRhdGFcbiAgICAgKi9cbiAgICBtZXRhRGF0YUxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zICsgOCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExlbmd0aCBvZiB0aGUgZGF0YSAodGhpcyBpcyBhbGlnbmVkIHNvIHRoZXJlIGNhbiBiZSBhIGdhcCBiZXR3ZWVuIHRoaXMgYW5kXG4gICAgICogdGhlIG1ldGFkYXRhKS5cbiAgICAgKi9cbiAgICBib2R5TGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3MgKyAxNik7XG4gICAgfVxuICAgIHN0YXRpYyBzaXplT2YoKSB7XG4gICAgICAgIHJldHVybiAyNDtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUJsb2NrKGJ1aWxkZXIsIG9mZnNldCwgbWV0YURhdGFMZW5ndGgsIGJvZHlMZW5ndGgpIHtcbiAgICAgICAgYnVpbGRlci5wcmVwKDgsIDI0KTtcbiAgICAgICAgYnVpbGRlci53cml0ZUludDY0KGJvZHlMZW5ndGgpO1xuICAgICAgICBidWlsZGVyLnBhZCg0KTtcbiAgICAgICAgYnVpbGRlci53cml0ZUludDMyKG1ldGFEYXRhTGVuZ3RoKTtcbiAgICAgICAgYnVpbGRlci53cml0ZUludDY0KG9mZnNldCk7XG4gICAgICAgIHJldHVybiBidWlsZGVyLm9mZnNldCgpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmxvY2subWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG4vKipcbiAqIFByb3ZpZGVkIGZvciBmb3J3YXJkIGNvbXBhdGliaWxpdHkgaW4gY2FzZSB3ZSBuZWVkIHRvIHN1cHBvcnQgZGlmZmVyZW50XG4gKiBzdHJhdGVnaWVzIGZvciBjb21wcmVzc2luZyB0aGUgSVBDIG1lc3NhZ2UgYm9keSAobGlrZSB3aG9sZS1ib2R5XG4gKiBjb21wcmVzc2lvbiByYXRoZXIgdGhhbiBidWZmZXItbGV2ZWwpIGluIHRoZSBmdXR1cmVcbiAqL1xuZXhwb3J0IHZhciBCb2R5Q29tcHJlc3Npb25NZXRob2Q7XG4oZnVuY3Rpb24gKEJvZHlDb21wcmVzc2lvbk1ldGhvZCkge1xuICAgIC8qKlxuICAgICAqIEVhY2ggY29uc3RpdHVlbnQgYnVmZmVyIGlzIGZpcnN0IGNvbXByZXNzZWQgd2l0aCB0aGUgaW5kaWNhdGVkXG4gICAgICogY29tcHJlc3NvciwgYW5kIHRoZW4gd3JpdHRlbiB3aXRoIHRoZSB1bmNvbXByZXNzZWQgbGVuZ3RoIGluIHRoZSBmaXJzdCA4XG4gICAgICogYnl0ZXMgYXMgYSA2NC1iaXQgbGl0dGxlLWVuZGlhbiBzaWduZWQgaW50ZWdlciBmb2xsb3dlZCBieSB0aGUgY29tcHJlc3NlZFxuICAgICAqIGJ1ZmZlciBieXRlcyAoYW5kIHRoZW4gcGFkZGluZyBhcyByZXF1aXJlZCBieSB0aGUgcHJvdG9jb2wpLiBUaGVcbiAgICAgKiB1bmNvbXByZXNzZWQgbGVuZ3RoIG1heSBiZSBzZXQgdG8gLTEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZGF0YSB0aGF0XG4gICAgICogZm9sbG93cyBpcyBub3QgY29tcHJlc3NlZCwgd2hpY2ggY2FuIGJlIHVzZWZ1bCBmb3IgY2FzZXMgd2hlcmVcbiAgICAgKiBjb21wcmVzc2lvbiBkb2VzIG5vdCB5aWVsZCBhcHByZWNpYWJsZSBzYXZpbmdzLlxuICAgICAqL1xuICAgIEJvZHlDb21wcmVzc2lvbk1ldGhvZFtCb2R5Q29tcHJlc3Npb25NZXRob2RbXCJCVUZGRVJcIl0gPSAwXSA9IFwiQlVGRkVSXCI7XG59KShCb2R5Q29tcHJlc3Npb25NZXRob2QgfHwgKEJvZHlDb21wcmVzc2lvbk1ldGhvZCA9IHt9KSk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJvZHktY29tcHJlc3Npb24tbWV0aG9kLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuaW1wb3J0IHsgQm9keUNvbXByZXNzaW9uTWV0aG9kIH0gZnJvbSAnLi9ib2R5LWNvbXByZXNzaW9uLW1ldGhvZC5tanMnO1xuaW1wb3J0IHsgQ29tcHJlc3Npb25UeXBlIH0gZnJvbSAnLi9jb21wcmVzc2lvbi10eXBlLm1qcyc7XG4vKipcbiAqIE9wdGlvbmFsIGNvbXByZXNzaW9uIGZvciB0aGUgbWVtb3J5IGJ1ZmZlcnMgY29uc3RpdHV0aW5nIElQQyBtZXNzYWdlXG4gKiBib2RpZXMuIEludGVuZGVkIGZvciB1c2Ugd2l0aCBSZWNvcmRCYXRjaCBidXQgY291bGQgYmUgdXNlZCBmb3Igb3RoZXJcbiAqIG1lc3NhZ2UgdHlwZXNcbiAqL1xuZXhwb3J0IGNsYXNzIEJvZHlDb21wcmVzc2lvbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNCb2R5Q29tcHJlc3Npb24oYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgQm9keUNvbXByZXNzaW9uKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNCb2R5Q29tcHJlc3Npb24oYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IEJvZHlDb21wcmVzc2lvbigpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wcmVzc29yIGxpYnJhcnkuXG4gICAgICogRm9yIExaNF9GUkFNRSwgZWFjaCBjb21wcmVzc2VkIGJ1ZmZlciBtdXN0IGNvbnNpc3Qgb2YgYSBzaW5nbGUgZnJhbWUuXG4gICAgICovXG4gICAgY29kZWMoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBDb21wcmVzc2lvblR5cGUuTFo0X0ZSQU1FO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhlIHdheSB0aGUgcmVjb3JkIGJhdGNoIGJvZHkgd2FzIGNvbXByZXNzZWRcbiAgICAgKi9cbiAgICBtZXRob2QoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBCb2R5Q29tcHJlc3Npb25NZXRob2QuQlVGRkVSO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRCb2R5Q29tcHJlc3Npb24oYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDIpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkQ29kZWMoYnVpbGRlciwgY29kZWMpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDgoMCwgY29kZWMsIENvbXByZXNzaW9uVHlwZS5MWjRfRlJBTUUpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkTWV0aG9kKGJ1aWxkZXIsIG1ldGhvZCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50OCgxLCBtZXRob2QsIEJvZHlDb21wcmVzc2lvbk1ldGhvZC5CVUZGRVIpO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kQm9keUNvbXByZXNzaW9uKGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUJvZHlDb21wcmVzc2lvbihidWlsZGVyLCBjb2RlYywgbWV0aG9kKSB7XG4gICAgICAgIEJvZHlDb21wcmVzc2lvbi5zdGFydEJvZHlDb21wcmVzc2lvbihidWlsZGVyKTtcbiAgICAgICAgQm9keUNvbXByZXNzaW9uLmFkZENvZGVjKGJ1aWxkZXIsIGNvZGVjKTtcbiAgICAgICAgQm9keUNvbXByZXNzaW9uLmFkZE1ldGhvZChidWlsZGVyLCBtZXRob2QpO1xuICAgICAgICByZXR1cm4gQm9keUNvbXByZXNzaW9uLmVuZEJvZHlDb21wcmVzc2lvbihidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJvZHktY29tcHJlc3Npb24ubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5leHBvcnQgY2xhc3MgQm9vbCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNCb29sKGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IEJvb2woKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0Jvb2woYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IEJvb2woKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0Qm9vbChidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmRCb29sKGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUJvb2woYnVpbGRlcikge1xuICAgICAgICBCb29sLnN0YXJ0Qm9vbChidWlsZGVyKTtcbiAgICAgICAgcmV0dXJuIEJvb2wuZW5kQm9vbChidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJvb2wubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEEgQnVmZmVyIHJlcHJlc2VudHMgYSBzaW5nbGUgY29udGlndW91cyBtZW1vcnkgc2VnbWVudFxuICovXG5leHBvcnQgY2xhc3MgQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlbGF0aXZlIG9mZnNldCBpbnRvIHRoZSBzaGFyZWQgbWVtb3J5IHBhZ2Ugd2hlcmUgdGhlIGJ5dGVzIGZvciB0aGlzXG4gICAgICogYnVmZmVyIHN0YXJ0c1xuICAgICAqL1xuICAgIG9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGFic29sdXRlIGxlbmd0aCAoaW4gYnl0ZXMpIG9mIHRoZSBtZW1vcnkgYnVmZmVyLiBUaGUgbWVtb3J5IGlzIGZvdW5kXG4gICAgICogZnJvbSBvZmZzZXQgKGluY2x1c2l2ZSkgdG8gb2Zmc2V0ICsgbGVuZ3RoIChub24taW5jbHVzaXZlKS4gV2hlbiBidWlsZGluZ1xuICAgICAqIG1lc3NhZ2VzIHVzaW5nIHRoZSBlbmNhcHN1bGF0ZWQgSVBDIG1lc3NhZ2UsIHBhZGRpbmcgYnl0ZXMgbWF5IGJlIHdyaXR0ZW5cbiAgICAgKiBhZnRlciBhIGJ1ZmZlciwgYnV0IHN1Y2ggcGFkZGluZyBieXRlcyBkbyBub3QgbmVlZCB0byBiZSBhY2NvdW50ZWQgZm9yIGluXG4gICAgICogdGhlIHNpemUgaGVyZS5cbiAgICAgKi9cbiAgICBsZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcyArIDgpO1xuICAgIH1cbiAgICBzdGF0aWMgc2l6ZU9mKCkge1xuICAgICAgICByZXR1cm4gMTY7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVCdWZmZXIoYnVpbGRlciwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICAgICAgYnVpbGRlci5wcmVwKDgsIDE2KTtcbiAgICAgICAgYnVpbGRlci53cml0ZUludDY0KGxlbmd0aCk7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVJbnQ2NChvZmZzZXQpO1xuICAgICAgICByZXR1cm4gYnVpbGRlci5vZmZzZXQoKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJ1ZmZlci5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmV4cG9ydCB2YXIgQ29tcHJlc3Npb25UeXBlO1xuKGZ1bmN0aW9uIChDb21wcmVzc2lvblR5cGUpIHtcbiAgICBDb21wcmVzc2lvblR5cGVbQ29tcHJlc3Npb25UeXBlW1wiTFo0X0ZSQU1FXCJdID0gMF0gPSBcIkxaNF9GUkFNRVwiO1xuICAgIENvbXByZXNzaW9uVHlwZVtDb21wcmVzc2lvblR5cGVbXCJaU1REXCJdID0gMV0gPSBcIlpTVERcIjtcbn0pKENvbXByZXNzaW9uVHlwZSB8fCAoQ29tcHJlc3Npb25UeXBlID0ge30pKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tcHJlc3Npb24tdHlwZS5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmV4cG9ydCB2YXIgRGF0ZVVuaXQ7XG4oZnVuY3Rpb24gKERhdGVVbml0KSB7XG4gICAgRGF0ZVVuaXRbRGF0ZVVuaXRbXCJEQVlcIl0gPSAwXSA9IFwiREFZXCI7XG4gICAgRGF0ZVVuaXRbRGF0ZVVuaXRbXCJNSUxMSVNFQ09ORFwiXSA9IDFdID0gXCJNSUxMSVNFQ09ORFwiO1xufSkoRGF0ZVVuaXQgfHwgKERhdGVVbml0ID0ge30pKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0ZS11bml0Lm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuaW1wb3J0IHsgRGF0ZVVuaXQgfSBmcm9tICcuL2RhdGUtdW5pdC5tanMnO1xuLyoqXG4gKiBEYXRlIGlzIGVpdGhlciBhIDMyLWJpdCBvciA2NC1iaXQgc2lnbmVkIGludGVnZXIgdHlwZSByZXByZXNlbnRpbmcgYW5cbiAqIGVsYXBzZWQgdGltZSBzaW5jZSBVTklYIGVwb2NoICgxOTcwLTAxLTAxKSwgc3RvcmVkIGluIGVpdGhlciBvZiB0d28gdW5pdHM6XG4gKlxuICogKiBNaWxsaXNlY29uZHMgKDY0IGJpdHMpIGluZGljYXRpbmcgVU5JWCB0aW1lIGVsYXBzZWQgc2luY2UgdGhlIGVwb2NoIChub1xuICogICBsZWFwIHNlY29uZHMpLCB3aGVyZSB0aGUgdmFsdWVzIGFyZSBldmVubHkgZGl2aXNpYmxlIGJ5IDg2NDAwMDAwXG4gKiAqIERheXMgKDMyIGJpdHMpIHNpbmNlIHRoZSBVTklYIGVwb2NoXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc0RhdGUoYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRGF0ZSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRGF0ZShiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRGF0ZSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICB1bml0KCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IERhdGVVbml0Lk1JTExJU0VDT05EO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnREYXRlKGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCgxKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZFVuaXQoYnVpbGRlciwgdW5pdCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MTYoMCwgdW5pdCwgRGF0ZVVuaXQuTUlMTElTRUNPTkQpO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kRGF0ZShidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVEYXRlKGJ1aWxkZXIsIHVuaXQpIHtcbiAgICAgICAgRGF0ZS5zdGFydERhdGUoYnVpbGRlcik7XG4gICAgICAgIERhdGUuYWRkVW5pdChidWlsZGVyLCB1bml0KTtcbiAgICAgICAgcmV0dXJuIERhdGUuZW5kRGF0ZShidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGUubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG4vKipcbiAqIEV4YWN0IGRlY2ltYWwgdmFsdWUgcmVwcmVzZW50ZWQgYXMgYW4gaW50ZWdlciB2YWx1ZSBpbiB0d28nc1xuICogY29tcGxlbWVudC4gQ3VycmVudGx5IG9ubHkgMTI4LWJpdCAoMTYtYnl0ZSkgYW5kIDI1Ni1iaXQgKDMyLWJ5dGUpIGludGVnZXJzXG4gKiBhcmUgdXNlZC4gVGhlIHJlcHJlc2VudGF0aW9uIHVzZXMgdGhlIGVuZGlhbm5lc3MgaW5kaWNhdGVkXG4gKiBpbiB0aGUgU2NoZW1hLlxuICovXG5leHBvcnQgY2xhc3MgRGVjaW1hbCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNEZWNpbWFsKGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IERlY2ltYWwoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0RlY2ltYWwoYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IERlY2ltYWwoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG90YWwgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzXG4gICAgICovXG4gICAgcHJlY2lzaW9uKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQgXCIuXCJcbiAgICAgKi9cbiAgICBzY2FsZSgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgYml0cyBwZXIgdmFsdWUuIFRoZSBvbmx5IGFjY2VwdGVkIHdpZHRocyBhcmUgMTI4IGFuZCAyNTYuXG4gICAgICogV2UgdXNlIGJpdFdpZHRoIGZvciBjb25zaXN0ZW5jeSB3aXRoIEludDo6Yml0V2lkdGguXG4gICAgICovXG4gICAgYml0V2lkdGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMTI4O1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnREZWNpbWFsKGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCgzKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZFByZWNpc2lvbihidWlsZGVyLCBwcmVjaXNpb24pIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDMyKDAsIHByZWNpc2lvbiwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRTY2FsZShidWlsZGVyLCBzY2FsZSkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMSwgc2NhbGUsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkQml0V2lkdGgoYnVpbGRlciwgYml0V2lkdGgpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDMyKDIsIGJpdFdpZHRoLCAxMjgpO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kRGVjaW1hbChidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVEZWNpbWFsKGJ1aWxkZXIsIHByZWNpc2lvbiwgc2NhbGUsIGJpdFdpZHRoKSB7XG4gICAgICAgIERlY2ltYWwuc3RhcnREZWNpbWFsKGJ1aWxkZXIpO1xuICAgICAgICBEZWNpbWFsLmFkZFByZWNpc2lvbihidWlsZGVyLCBwcmVjaXNpb24pO1xuICAgICAgICBEZWNpbWFsLmFkZFNjYWxlKGJ1aWxkZXIsIHNjYWxlKTtcbiAgICAgICAgRGVjaW1hbC5hZGRCaXRXaWR0aChidWlsZGVyLCBiaXRXaWR0aCk7XG4gICAgICAgIHJldHVybiBEZWNpbWFsLmVuZERlY2ltYWwoYnVpbGRlcik7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWNpbWFsLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuaW1wb3J0IHsgUmVjb3JkQmF0Y2ggfSBmcm9tICcuL3JlY29yZC1iYXRjaC5tanMnO1xuLyoqXG4gKiBGb3Igc2VuZGluZyBkaWN0aW9uYXJ5IGVuY29kaW5nIGluZm9ybWF0aW9uLiBBbnkgRmllbGQgY2FuIGJlXG4gKiBkaWN0aW9uYXJ5LWVuY29kZWQsIGJ1dCBpbiB0aGlzIGNhc2Ugbm9uZSBvZiBpdHMgY2hpbGRyZW4gbWF5IGJlXG4gKiBkaWN0aW9uYXJ5LWVuY29kZWQuXG4gKiBUaGVyZSBpcyBvbmUgdmVjdG9yIC8gY29sdW1uIHBlciBkaWN0aW9uYXJ5LCBidXQgdGhhdCB2ZWN0b3IgLyBjb2x1bW5cbiAqIG1heSBiZSBzcHJlYWQgYWNyb3NzIG11bHRpcGxlIGRpY3Rpb25hcnkgYmF0Y2hlcyBieSB1c2luZyB0aGUgaXNEZWx0YVxuICogZmxhZ1xuICovXG5leHBvcnQgY2xhc3MgRGljdGlvbmFyeUJhdGNoIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc0RpY3Rpb25hcnlCYXRjaChiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBEaWN0aW9uYXJ5QmF0Y2goKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0RpY3Rpb25hcnlCYXRjaChiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRGljdGlvbmFyeUJhdGNoKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIGlkKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IHRoaXMuYmIuY3JlYXRlTG9uZygwLCAwKTtcbiAgICB9XG4gICAgZGF0YShvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBSZWNvcmRCYXRjaCgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiBpc0RlbHRhIGlzIHRydWUgdGhlIHZhbHVlcyBpbiB0aGUgZGljdGlvbmFyeSBhcmUgdG8gYmUgYXBwZW5kZWQgdG8gYVxuICAgICAqIGRpY3Rpb25hcnkgd2l0aCB0aGUgaW5kaWNhdGVkIGlkLiBJZiBpc0RlbHRhIGlzIGZhbHNlIHRoaXMgZGljdGlvbmFyeVxuICAgICAqIHNob3VsZCByZXBsYWNlIHRoZSBleGlzdGluZyBkaWN0aW9uYXJ5LlxuICAgICAqL1xuICAgIGlzRGVsdGEoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gISF0aGlzLmJiLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IGZhbHNlO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnREaWN0aW9uYXJ5QmF0Y2goYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDMpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkSWQoYnVpbGRlciwgaWQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDY0KDAsIGlkLCBidWlsZGVyLmNyZWF0ZUxvbmcoMCwgMCkpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkRGF0YShidWlsZGVyLCBkYXRhT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgZGF0YU9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRJc0RlbHRhKGJ1aWxkZXIsIGlzRGVsdGEpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDgoMiwgK2lzRGVsdGEsICtmYWxzZSk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmREaWN0aW9uYXJ5QmF0Y2goYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGljdGlvbmFyeS1iYXRjaC5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJztcbmltcG9ydCB7IERpY3Rpb25hcnlLaW5kIH0gZnJvbSAnLi9kaWN0aW9uYXJ5LWtpbmQubWpzJztcbmltcG9ydCB7IEludCB9IGZyb20gJy4vaW50Lm1qcyc7XG5leHBvcnQgY2xhc3MgRGljdGlvbmFyeUVuY29kaW5nIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc0RpY3Rpb25hcnlFbmNvZGluZyhiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBEaWN0aW9uYXJ5RW5jb2RpbmcoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0RpY3Rpb25hcnlFbmNvZGluZyhiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRGljdGlvbmFyeUVuY29kaW5nKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBrbm93biBkaWN0aW9uYXJ5IGlkIGluIHRoZSBhcHBsaWNhdGlvbiB3aGVyZSB0aGlzIGRhdGEgaXMgdXNlZC4gSW5cbiAgICAgKiB0aGUgZmlsZSBvciBzdHJlYW1pbmcgZm9ybWF0cywgdGhlIGRpY3Rpb25hcnkgaWRzIGFyZSBmb3VuZCBpbiB0aGVcbiAgICAgKiBEaWN0aW9uYXJ5QmF0Y2ggbWVzc2FnZXNcbiAgICAgKi9cbiAgICBpZCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiB0aGlzLmJiLmNyZWF0ZUxvbmcoMCwgMCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBkaWN0aW9uYXJ5IGluZGljZXMgYXJlIGNvbnN0cmFpbmVkIHRvIGJlIG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycy4gSWZcbiAgICAgKiB0aGlzIGZpZWxkIGlzIG51bGwsIHRoZSBpbmRpY2VzIG11c3QgYmUgc2lnbmVkIGludDMyLiBUbyBtYXhpbWl6ZVxuICAgICAqIGNyb3NzLWxhbmd1YWdlIGNvbXBhdGliaWxpdHkgYW5kIHBlcmZvcm1hbmNlLCBpbXBsZW1lbnRhdGlvbnMgYXJlXG4gICAgICogcmVjb21tZW5kZWQgdG8gcHJlZmVyIHNpZ25lZCBpbnRlZ2VyIHR5cGVzIG92ZXIgdW5zaWduZWQgaW50ZWdlciB0eXBlc1xuICAgICAqIGFuZCB0byBhdm9pZCB1aW50NjQgaW5kaWNlcyB1bmxlc3MgdGhleSBhcmUgcmVxdWlyZWQgYnkgYW4gYXBwbGljYXRpb24uXG4gICAgICovXG4gICAgaW5kZXhUeXBlKG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEludCgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCBkaWN0aW9uYXJpZXMgYXJlIG5vdCBvcmRlcmVkLCBvciB0aGUgb3JkZXIgZG9lcyBub3QgaGF2ZVxuICAgICAqIHNlbWFudGljIG1lYW5pbmcuIEluIHNvbWUgc3RhdGlzdGljYWwsIGFwcGxpY2F0aW9ucywgZGljdGlvbmFyeS1lbmNvZGluZ1xuICAgICAqIGlzIHVzZWQgdG8gcmVwcmVzZW50IG9yZGVyZWQgY2F0ZWdvcmljYWwgZGF0YSwgYW5kIHdlIHByb3ZpZGUgYSB3YXkgdG9cbiAgICAgKiBwcmVzZXJ2ZSB0aGF0IG1ldGFkYXRhIGhlcmVcbiAgICAgKi9cbiAgICBpc09yZGVyZWQoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gISF0aGlzLmJiLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IGZhbHNlO1xuICAgIH1cbiAgICBkaWN0aW9uYXJ5S2luZCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogRGljdGlvbmFyeUtpbmQuRGVuc2VBcnJheTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0RGljdGlvbmFyeUVuY29kaW5nKGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCg0KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZElkKGJ1aWxkZXIsIGlkKSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ2NCgwLCBpZCwgYnVpbGRlci5jcmVhdGVMb25nKDAsIDApKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZEluZGV4VHlwZShidWlsZGVyLCBpbmRleFR5cGVPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxLCBpbmRleFR5cGVPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkSXNPcmRlcmVkKGJ1aWxkZXIsIGlzT3JkZXJlZCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50OCgyLCAraXNPcmRlcmVkLCArZmFsc2UpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkRGljdGlvbmFyeUtpbmQoYnVpbGRlciwgZGljdGlvbmFyeUtpbmQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDE2KDMsIGRpY3Rpb25hcnlLaW5kLCBEaWN0aW9uYXJ5S2luZC5EZW5zZUFycmF5KTtcbiAgICB9XG4gICAgc3RhdGljIGVuZERpY3Rpb25hcnlFbmNvZGluZyhidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWN0aW9uYXJ5LWVuY29kaW5nLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBEaWN0aW9uYXJ5IGVuY29kaW5nIG1ldGFkYXRhXG4gKiBNYWludGFpbmVkIGZvciBmb3J3YXJkcyBjb21wYXRpYmlsaXR5LCBpbiB0aGUgZnV0dXJlXG4gKiBEaWN0aW9uYXJpZXMgbWlnaHQgYmUgZXhwbGljaXQgbWFwcyBiZXR3ZWVuIGludGVnZXJzIGFuZCB2YWx1ZXNcbiAqIGFsbG93aW5nIGZvciBub24tY29udGlndW91cyBpbmRleCB2YWx1ZXNcbiAqL1xuZXhwb3J0IHZhciBEaWN0aW9uYXJ5S2luZDtcbihmdW5jdGlvbiAoRGljdGlvbmFyeUtpbmQpIHtcbiAgICBEaWN0aW9uYXJ5S2luZFtEaWN0aW9uYXJ5S2luZFtcIkRlbnNlQXJyYXlcIl0gPSAwXSA9IFwiRGVuc2VBcnJheVwiO1xufSkoRGljdGlvbmFyeUtpbmQgfHwgKERpY3Rpb25hcnlLaW5kID0ge30pKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGljdGlvbmFyeS1raW5kLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuaW1wb3J0IHsgVGltZVVuaXQgfSBmcm9tICcuL3RpbWUtdW5pdC5tanMnO1xuZXhwb3J0IGNsYXNzIER1cmF0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc0R1cmF0aW9uKGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IER1cmF0aW9uKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNEdXJhdGlvbihiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRHVyYXRpb24oKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgdW5pdCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBUaW1lVW5pdC5NSUxMSVNFQ09ORDtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0RHVyYXRpb24oYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDEpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkVW5pdChidWlsZGVyLCB1bml0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQxNigwLCB1bml0LCBUaW1lVW5pdC5NSUxMSVNFQ09ORCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmREdXJhdGlvbihidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVEdXJhdGlvbihidWlsZGVyLCB1bml0KSB7XG4gICAgICAgIER1cmF0aW9uLnN0YXJ0RHVyYXRpb24oYnVpbGRlcik7XG4gICAgICAgIER1cmF0aW9uLmFkZFVuaXQoYnVpbGRlciwgdW5pdCk7XG4gICAgICAgIHJldHVybiBEdXJhdGlvbi5lbmREdXJhdGlvbihidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWR1cmF0aW9uLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBFbmRpYW5uZXNzIG9mIHRoZSBwbGF0Zm9ybSBwcm9kdWNpbmcgdGhlIGRhdGFcbiAqL1xuZXhwb3J0IHZhciBFbmRpYW5uZXNzO1xuKGZ1bmN0aW9uIChFbmRpYW5uZXNzKSB7XG4gICAgRW5kaWFubmVzc1tFbmRpYW5uZXNzW1wiTGl0dGxlXCJdID0gMF0gPSBcIkxpdHRsZVwiO1xuICAgIEVuZGlhbm5lc3NbRW5kaWFubmVzc1tcIkJpZ1wiXSA9IDFdID0gXCJCaWdcIjtcbn0pKEVuZGlhbm5lc3MgfHwgKEVuZGlhbm5lc3MgPSB7fSkpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbmRpYW5uZXNzLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBEYXRhIHN0cnVjdHVyZXMgZm9yIGRlc2NyaWJpbmcgYSB0YWJsZSByb3cgYmF0Y2ggKGEgY29sbGVjdGlvbiBvZlxuICogZXF1YWwtbGVuZ3RoIEFycm93IGFycmF5cylcbiAqIE1ldGFkYXRhIGFib3V0IGEgZmllbGQgYXQgc29tZSBsZXZlbCBvZiBhIG5lc3RlZCB0eXBlIHRyZWUgKGJ1dCBub3RcbiAqIGl0cyBjaGlsZHJlbikuXG4gKlxuICogRm9yIGV4YW1wbGUsIGEgTGlzdDxJbnQxNj4gd2l0aCB2YWx1ZXMgYFtbMSwgMiwgM10sIG51bGwsIFs0XSwgWzUsIDZdLCBudWxsXWBcbiAqIHdvdWxkIGhhdmUge2xlbmd0aDogNSwgbnVsbF9jb3VudDogMn0gZm9yIGl0cyBMaXN0IG5vZGUsIGFuZCB7bGVuZ3RoOiA2LFxuICogbnVsbF9jb3VudDogMH0gZm9yIGl0cyBJbnQxNiBub2RlLCBhcyBzZXBhcmF0ZSBGaWVsZE5vZGUgc3RydWN0c1xuICovXG5leHBvcnQgY2xhc3MgRmllbGROb2RlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB2YWx1ZSBzbG90cyBpbiB0aGUgQXJyb3cgYXJyYXkgYXQgdGhpcyBsZXZlbCBvZiBhIG5lc3RlZFxuICAgICAqIHRyZWVcbiAgICAgKi9cbiAgICBsZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3Bvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygb2JzZXJ2ZWQgbnVsbHMuIEZpZWxkcyB3aXRoIG51bGxfY291bnQgPT0gMCBtYXkgY2hvb3NlIG5vdFxuICAgICAqIHRvIHdyaXRlIHRoZWlyIHBoeXNpY2FsIHZhbGlkaXR5IGJpdG1hcCBvdXQgYXMgYSBtYXRlcmlhbGl6ZWQgYnVmZmVyLFxuICAgICAqIGluc3RlYWQgc2V0dGluZyB0aGUgbGVuZ3RoIG9mIHRoZSBiaXRtYXAgYnVmZmVyIHRvIDAuXG4gICAgICovXG4gICAgbnVsbENvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3MgKyA4KTtcbiAgICB9XG4gICAgc3RhdGljIHNpemVPZigpIHtcbiAgICAgICAgcmV0dXJuIDE2O1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlRmllbGROb2RlKGJ1aWxkZXIsIGxlbmd0aCwgbnVsbF9jb3VudCkge1xuICAgICAgICBidWlsZGVyLnByZXAoOCwgMTYpO1xuICAgICAgICBidWlsZGVyLndyaXRlSW50NjQobnVsbF9jb3VudCk7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVJbnQ2NChsZW5ndGgpO1xuICAgICAgICByZXR1cm4gYnVpbGRlci5vZmZzZXQoKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpZWxkLW5vZGUubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5pbXBvcnQgeyBEaWN0aW9uYXJ5RW5jb2RpbmcgfSBmcm9tICcuL2RpY3Rpb25hcnktZW5jb2RpbmcubWpzJztcbmltcG9ydCB7IEtleVZhbHVlIH0gZnJvbSAnLi9rZXktdmFsdWUubWpzJztcbmltcG9ydCB7IFR5cGUgfSBmcm9tICcuL3R5cGUubWpzJztcbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQSBmaWVsZCByZXByZXNlbnRzIGEgbmFtZWQgY29sdW1uIGluIGEgcmVjb3JkIC8gcm93IGJhdGNoIG9yIGNoaWxkIG9mIGFcbiAqIG5lc3RlZCB0eXBlLlxuICovXG5leHBvcnQgY2xhc3MgRmllbGQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzRmllbGQoYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRmllbGQoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0ZpZWxkKGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBGaWVsZCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBuYW1lKG9wdGlvbmFsRW5jb2RpbmcpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoaXMgZmllbGQgY2FuIGNvbnRhaW4gbnVsbHMuIFNob3VsZCBiZSB0cnVlIGluIGdlbmVyYWwuXG4gICAgICovXG4gICAgbnVsbGFibGUoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gISF0aGlzLmJiLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IGZhbHNlO1xuICAgIH1cbiAgICB0eXBlVHlwZSgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRVaW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBUeXBlLk5PTkU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgdGhlIHR5cGUgb2YgdGhlIGRlY29kZWQgdmFsdWUgaWYgdGhlIGZpZWxkIGlzIGRpY3Rpb25hcnkgZW5jb2RlZC5cbiAgICAgKi9cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdHlwZShvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3VuaW9uKG9iaiwgdGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJlc2VudCBvbmx5IGlmIHRoZSBmaWVsZCBpcyBkaWN0aW9uYXJ5IGVuY29kZWQuXG4gICAgICovXG4gICAgZGljdGlvbmFyeShvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgRGljdGlvbmFyeUVuY29kaW5nKCkpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiKSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGNoaWxkcmVuIGFwcGx5IG9ubHkgdG8gbmVzdGVkIGRhdGEgdHlwZXMgbGlrZSBTdHJ1Y3QsIExpc3QgYW5kIFVuaW9uLiBGb3JcbiAgICAgKiBwcmltaXRpdmUgdHlwZXMgY2hpbGRyZW4gd2lsbCBoYXZlIGxlbmd0aCAwLlxuICAgICAqL1xuICAgIGNoaWxkcmVuKGluZGV4LCBvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgRmllbGQoKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIpIDogbnVsbDtcbiAgICB9XG4gICAgY2hpbGRyZW5MZW5ndGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVzZXItZGVmaW5lZCBtZXRhZGF0YVxuICAgICAqL1xuICAgIGN1c3RvbU1ldGFkYXRhKGluZGV4LCBvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTYpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgS2V5VmFsdWUoKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIpIDogbnVsbDtcbiAgICB9XG4gICAgY3VzdG9tTWV0YWRhdGFMZW5ndGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydEZpZWxkKGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCg3KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZE5hbWUoYnVpbGRlciwgbmFtZU9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDAsIG5hbWVPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkTnVsbGFibGUoYnVpbGRlciwgbnVsbGFibGUpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDgoMSwgK251bGxhYmxlLCArZmFsc2UpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkVHlwZVR5cGUoYnVpbGRlciwgdHlwZVR5cGUpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDgoMiwgdHlwZVR5cGUsIFR5cGUuTk9ORSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRUeXBlKGJ1aWxkZXIsIHR5cGVPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzLCB0eXBlT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZERpY3Rpb25hcnkoYnVpbGRlciwgZGljdGlvbmFyeU9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDQsIGRpY3Rpb25hcnlPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkQ2hpbGRyZW4oYnVpbGRlciwgY2hpbGRyZW5PZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg1LCBjaGlsZHJlbk9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVDaGlsZHJlblZlY3RvcihidWlsZGVyLCBkYXRhKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpO1xuICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydENoaWxkcmVuVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkQ3VzdG9tTWV0YWRhdGEoYnVpbGRlciwgY3VzdG9tTWV0YWRhdGFPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg2LCBjdXN0b21NZXRhZGF0YU9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVDdXN0b21NZXRhZGF0YVZlY3RvcihidWlsZGVyLCBkYXRhKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpO1xuICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydEN1c3RvbU1ldGFkYXRhVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kRmllbGQoYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmllbGQubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5leHBvcnQgY2xhc3MgRml4ZWRTaXplQmluYXJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc0ZpeGVkU2l6ZUJpbmFyeShiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBGaXhlZFNpemVCaW5hcnkoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0ZpeGVkU2l6ZUJpbmFyeShiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRml4ZWRTaXplQmluYXJ5KCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBieXRlcyBwZXIgdmFsdWVcbiAgICAgKi9cbiAgICBieXRlV2lkdGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0Rml4ZWRTaXplQmluYXJ5KGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCgxKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZEJ5dGVXaWR0aChidWlsZGVyLCBieXRlV2lkdGgpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDMyKDAsIGJ5dGVXaWR0aCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmRGaXhlZFNpemVCaW5hcnkoYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlRml4ZWRTaXplQmluYXJ5KGJ1aWxkZXIsIGJ5dGVXaWR0aCkge1xuICAgICAgICBGaXhlZFNpemVCaW5hcnkuc3RhcnRGaXhlZFNpemVCaW5hcnkoYnVpbGRlcik7XG4gICAgICAgIEZpeGVkU2l6ZUJpbmFyeS5hZGRCeXRlV2lkdGgoYnVpbGRlciwgYnl0ZVdpZHRoKTtcbiAgICAgICAgcmV0dXJuIEZpeGVkU2l6ZUJpbmFyeS5lbmRGaXhlZFNpemVCaW5hcnkoYnVpbGRlcik7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1maXhlZC1zaXplLWJpbmFyeS5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJztcbmV4cG9ydCBjbGFzcyBGaXhlZFNpemVMaXN0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc0ZpeGVkU2l6ZUxpc3QoYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRml4ZWRTaXplTGlzdCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRml4ZWRTaXplTGlzdChiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRml4ZWRTaXplTGlzdCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgbGlzdCBpdGVtcyBwZXIgdmFsdWVcbiAgICAgKi9cbiAgICBsaXN0U2l6ZSgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRGaXhlZFNpemVMaXN0KGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCgxKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZExpc3RTaXplKGJ1aWxkZXIsIGxpc3RTaXplKSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMigwLCBsaXN0U2l6ZSwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmRGaXhlZFNpemVMaXN0KGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUZpeGVkU2l6ZUxpc3QoYnVpbGRlciwgbGlzdFNpemUpIHtcbiAgICAgICAgRml4ZWRTaXplTGlzdC5zdGFydEZpeGVkU2l6ZUxpc3QoYnVpbGRlcik7XG4gICAgICAgIEZpeGVkU2l6ZUxpc3QuYWRkTGlzdFNpemUoYnVpbGRlciwgbGlzdFNpemUpO1xuICAgICAgICByZXR1cm4gRml4ZWRTaXplTGlzdC5lbmRGaXhlZFNpemVMaXN0KGJ1aWxkZXIpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zml4ZWQtc2l6ZS1saXN0Lm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuaW1wb3J0IHsgUHJlY2lzaW9uIH0gZnJvbSAnLi9wcmVjaXNpb24ubWpzJztcbmV4cG9ydCBjbGFzcyBGbG9hdGluZ1BvaW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc0Zsb2F0aW5nUG9pbnQoYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRmxvYXRpbmdQb2ludCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRmxvYXRpbmdQb2ludChiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRmxvYXRpbmdQb2ludCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBwcmVjaXNpb24oKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogUHJlY2lzaW9uLkhBTEY7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydEZsb2F0aW5nUG9pbnQoYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDEpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkUHJlY2lzaW9uKGJ1aWxkZXIsIHByZWNpc2lvbikge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MTYoMCwgcHJlY2lzaW9uLCBQcmVjaXNpb24uSEFMRik7XG4gICAgfVxuICAgIHN0YXRpYyBlbmRGbG9hdGluZ1BvaW50KGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUZsb2F0aW5nUG9pbnQoYnVpbGRlciwgcHJlY2lzaW9uKSB7XG4gICAgICAgIEZsb2F0aW5nUG9pbnQuc3RhcnRGbG9hdGluZ1BvaW50KGJ1aWxkZXIpO1xuICAgICAgICBGbG9hdGluZ1BvaW50LmFkZFByZWNpc2lvbihidWlsZGVyLCBwcmVjaXNpb24pO1xuICAgICAgICByZXR1cm4gRmxvYXRpbmdQb2ludC5lbmRGbG9hdGluZ1BvaW50KGJ1aWxkZXIpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmxvYXRpbmctcG9pbnQubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5pbXBvcnQgeyBCbG9jayB9IGZyb20gJy4vYmxvY2subWpzJztcbmltcG9ydCB7IEtleVZhbHVlIH0gZnJvbSAnLi9rZXktdmFsdWUubWpzJztcbmltcG9ydCB7IE1ldGFkYXRhVmVyc2lvbiB9IGZyb20gJy4vbWV0YWRhdGEtdmVyc2lvbi5tanMnO1xuaW1wb3J0IHsgU2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEubWpzJztcbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQXJyb3cgRmlsZSBtZXRhZGF0YVxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIEZvb3RlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNGb290ZXIoYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRm9vdGVyKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNGb290ZXIoYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IEZvb3RlcigpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICB2ZXJzaW9uKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IE1ldGFkYXRhVmVyc2lvbi5WMTtcbiAgICB9XG4gICAgc2NoZW1hKG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IFNjaGVtYSgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICBkaWN0aW9uYXJpZXMoaW5kZXgsIG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEJsb2NrKCkpLl9faW5pdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogMjQsIHRoaXMuYmIpIDogbnVsbDtcbiAgICB9XG4gICAgZGljdGlvbmFyaWVzTGVuZ3RoKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7XG4gICAgfVxuICAgIHJlY29yZEJhdGNoZXMoaW5kZXgsIG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBCbG9jaygpKS5fX2luaXQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDI0LCB0aGlzLmJiKSA6IG51bGw7XG4gICAgfVxuICAgIHJlY29yZEJhdGNoZXNMZW5ndGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVzZXItZGVmaW5lZCBtZXRhZGF0YVxuICAgICAqL1xuICAgIGN1c3RvbU1ldGFkYXRhKGluZGV4LCBvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgS2V5VmFsdWUoKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIpIDogbnVsbDtcbiAgICB9XG4gICAgY3VzdG9tTWV0YWRhdGFMZW5ndGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydEZvb3RlcihidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoNSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRWZXJzaW9uKGJ1aWxkZXIsIHZlcnNpb24pIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDE2KDAsIHZlcnNpb24sIE1ldGFkYXRhVmVyc2lvbi5WMSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRTY2hlbWEoYnVpbGRlciwgc2NoZW1hT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgc2NoZW1hT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZERpY3Rpb25hcmllcyhidWlsZGVyLCBkaWN0aW9uYXJpZXNPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgyLCBkaWN0aW9uYXJpZXNPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnREaWN0aW9uYXJpZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydFZlY3RvcigyNCwgbnVtRWxlbXMsIDgpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkUmVjb3JkQmF0Y2hlcyhidWlsZGVyLCByZWNvcmRCYXRjaGVzT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMywgcmVjb3JkQmF0Y2hlc09mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydFJlY29yZEJhdGNoZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydFZlY3RvcigyNCwgbnVtRWxlbXMsIDgpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkQ3VzdG9tTWV0YWRhdGEoYnVpbGRlciwgY3VzdG9tTWV0YWRhdGFPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg0LCBjdXN0b21NZXRhZGF0YU9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVDdXN0b21NZXRhZGF0YVZlY3RvcihidWlsZGVyLCBkYXRhKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpO1xuICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydEN1c3RvbU1ldGFkYXRhVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kRm9vdGVyKGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGZpbmlzaEZvb3RlckJ1ZmZlcihidWlsZGVyLCBvZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5maW5pc2gob2Zmc2V0KTtcbiAgICB9XG4gICAgc3RhdGljIGZpbmlzaFNpemVQcmVmaXhlZEZvb3RlckJ1ZmZlcihidWlsZGVyLCBvZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5maW5pc2gob2Zmc2V0LCB1bmRlZmluZWQsIHRydWUpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9vdGVyLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuZXhwb3J0IGNsYXNzIEludCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNJbnQoYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgSW50KCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNJbnQoYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IEludCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBiaXRXaWR0aCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwO1xuICAgIH1cbiAgICBpc1NpZ25lZCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAhIXRoaXMuYmIucmVhZEludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogZmFsc2U7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydEludChidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMik7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRCaXRXaWR0aChidWlsZGVyLCBiaXRXaWR0aCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMCwgYml0V2lkdGgsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkSXNTaWduZWQoYnVpbGRlciwgaXNTaWduZWQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDgoMSwgK2lzU2lnbmVkLCArZmFsc2UpO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kSW50KGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUludChidWlsZGVyLCBiaXRXaWR0aCwgaXNTaWduZWQpIHtcbiAgICAgICAgSW50LnN0YXJ0SW50KGJ1aWxkZXIpO1xuICAgICAgICBJbnQuYWRkQml0V2lkdGgoYnVpbGRlciwgYml0V2lkdGgpO1xuICAgICAgICBJbnQuYWRkSXNTaWduZWQoYnVpbGRlciwgaXNTaWduZWQpO1xuICAgICAgICByZXR1cm4gSW50LmVuZEludChidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWludC5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmV4cG9ydCB2YXIgSW50ZXJ2YWxVbml0O1xuKGZ1bmN0aW9uIChJbnRlcnZhbFVuaXQpIHtcbiAgICBJbnRlcnZhbFVuaXRbSW50ZXJ2YWxVbml0W1wiWUVBUl9NT05USFwiXSA9IDBdID0gXCJZRUFSX01PTlRIXCI7XG4gICAgSW50ZXJ2YWxVbml0W0ludGVydmFsVW5pdFtcIkRBWV9USU1FXCJdID0gMV0gPSBcIkRBWV9USU1FXCI7XG4gICAgSW50ZXJ2YWxVbml0W0ludGVydmFsVW5pdFtcIk1PTlRIX0RBWV9OQU5PXCJdID0gMl0gPSBcIk1PTlRIX0RBWV9OQU5PXCI7XG59KShJbnRlcnZhbFVuaXQgfHwgKEludGVydmFsVW5pdCA9IHt9KSk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWludGVydmFsLXVuaXQubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5pbXBvcnQgeyBJbnRlcnZhbFVuaXQgfSBmcm9tICcuL2ludGVydmFsLXVuaXQubWpzJztcbmV4cG9ydCBjbGFzcyBJbnRlcnZhbCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNJbnRlcnZhbChiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBJbnRlcnZhbCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzSW50ZXJ2YWwoYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IEludGVydmFsKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHVuaXQoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogSW50ZXJ2YWxVbml0LllFQVJfTU9OVEg7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydEludGVydmFsKGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCgxKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZFVuaXQoYnVpbGRlciwgdW5pdCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MTYoMCwgdW5pdCwgSW50ZXJ2YWxVbml0LllFQVJfTU9OVEgpO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kSW50ZXJ2YWwoYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlSW50ZXJ2YWwoYnVpbGRlciwgdW5pdCkge1xuICAgICAgICBJbnRlcnZhbC5zdGFydEludGVydmFsKGJ1aWxkZXIpO1xuICAgICAgICBJbnRlcnZhbC5hZGRVbml0KGJ1aWxkZXIsIHVuaXQpO1xuICAgICAgICByZXR1cm4gSW50ZXJ2YWwuZW5kSW50ZXJ2YWwoYnVpbGRlcik7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnRlcnZhbC5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJztcbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogdXNlciBkZWZpbmVkIGtleSB2YWx1ZSBwYWlycyB0byBhZGQgY3VzdG9tIG1ldGFkYXRhIHRvIGFycm93XG4gKiBrZXkgbmFtZXNwYWNpbmcgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB1c2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBLZXlWYWx1ZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNLZXlWYWx1ZShiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBLZXlWYWx1ZSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzS2V5VmFsdWUoYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IEtleVZhbHVlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIGtleShvcHRpb25hbEVuY29kaW5nKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcyArIG9mZnNldCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsO1xuICAgIH1cbiAgICB2YWx1ZShvcHRpb25hbEVuY29kaW5nKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcyArIG9mZnNldCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRLZXlWYWx1ZShidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMik7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRLZXkoYnVpbGRlciwga2V5T2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMCwga2V5T2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZFZhbHVlKGJ1aWxkZXIsIHZhbHVlT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgdmFsdWVPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kS2V5VmFsdWUoYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlS2V5VmFsdWUoYnVpbGRlciwga2V5T2Zmc2V0LCB2YWx1ZU9mZnNldCkge1xuICAgICAgICBLZXlWYWx1ZS5zdGFydEtleVZhbHVlKGJ1aWxkZXIpO1xuICAgICAgICBLZXlWYWx1ZS5hZGRLZXkoYnVpbGRlciwga2V5T2Zmc2V0KTtcbiAgICAgICAgS2V5VmFsdWUuYWRkVmFsdWUoYnVpbGRlciwgdmFsdWVPZmZzZXQpO1xuICAgICAgICByZXR1cm4gS2V5VmFsdWUuZW5kS2V5VmFsdWUoYnVpbGRlcik7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1rZXktdmFsdWUubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG4vKipcbiAqIFNhbWUgYXMgQmluYXJ5LCBidXQgd2l0aCA2NC1iaXQgb2Zmc2V0cywgYWxsb3dpbmcgdG8gcmVwcmVzZW50XG4gKiBleHRyZW1lbHkgbGFyZ2UgZGF0YSB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXJnZUJpbmFyeSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNMYXJnZUJpbmFyeShiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBMYXJnZUJpbmFyeSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzTGFyZ2VCaW5hcnkoYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IExhcmdlQmluYXJ5KCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydExhcmdlQmluYXJ5KGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCgwKTtcbiAgICB9XG4gICAgc3RhdGljIGVuZExhcmdlQmluYXJ5KGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUxhcmdlQmluYXJ5KGJ1aWxkZXIpIHtcbiAgICAgICAgTGFyZ2VCaW5hcnkuc3RhcnRMYXJnZUJpbmFyeShidWlsZGVyKTtcbiAgICAgICAgcmV0dXJuIExhcmdlQmluYXJ5LmVuZExhcmdlQmluYXJ5KGJ1aWxkZXIpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGFyZ2UtYmluYXJ5Lm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuLyoqXG4gKiBTYW1lIGFzIExpc3QsIGJ1dCB3aXRoIDY0LWJpdCBvZmZzZXRzLCBhbGxvd2luZyB0byByZXByZXNlbnRcbiAqIGV4dHJlbWVseSBsYXJnZSBkYXRhIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIExhcmdlTGlzdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNMYXJnZUxpc3QoYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgTGFyZ2VMaXN0KCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNMYXJnZUxpc3QoYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IExhcmdlTGlzdCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRMYXJnZUxpc3QoYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDApO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kTGFyZ2VMaXN0KGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUxhcmdlTGlzdChidWlsZGVyKSB7XG4gICAgICAgIExhcmdlTGlzdC5zdGFydExhcmdlTGlzdChidWlsZGVyKTtcbiAgICAgICAgcmV0dXJuIExhcmdlTGlzdC5lbmRMYXJnZUxpc3QoYnVpbGRlcik7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYXJnZS1saXN0Lm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuLyoqXG4gKiBTYW1lIGFzIFV0ZjgsIGJ1dCB3aXRoIDY0LWJpdCBvZmZzZXRzLCBhbGxvd2luZyB0byByZXByZXNlbnRcbiAqIGV4dHJlbWVseSBsYXJnZSBkYXRhIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIExhcmdlVXRmOCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNMYXJnZVV0ZjgoYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgTGFyZ2VVdGY4KCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNMYXJnZVV0ZjgoYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IExhcmdlVXRmOCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRMYXJnZVV0ZjgoYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDApO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kTGFyZ2VVdGY4KGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUxhcmdlVXRmOChidWlsZGVyKSB7XG4gICAgICAgIExhcmdlVXRmOC5zdGFydExhcmdlVXRmOChidWlsZGVyKTtcbiAgICAgICAgcmV0dXJuIExhcmdlVXRmOC5lbmRMYXJnZVV0ZjgoYnVpbGRlcik7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYXJnZS11dGY4Lm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuZXhwb3J0IGNsYXNzIExpc3Qge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzTGlzdChiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBMaXN0KCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNMaXN0KGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBMaXN0KCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydExpc3QoYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDApO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kTGlzdChidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVMaXN0KGJ1aWxkZXIpIHtcbiAgICAgICAgTGlzdC5zdGFydExpc3QoYnVpbGRlcik7XG4gICAgICAgIHJldHVybiBMaXN0LmVuZExpc3QoYnVpbGRlcik7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1saXN0Lm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuLyoqXG4gKiBBIE1hcCBpcyBhIGxvZ2ljYWwgbmVzdGVkIHR5cGUgdGhhdCBpcyByZXByZXNlbnRlZCBhc1xuICpcbiAqIExpc3Q8ZW50cmllczogU3RydWN0PGtleTogSywgdmFsdWU6IFY+PlxuICpcbiAqIEluIHRoaXMgbGF5b3V0LCB0aGUga2V5cyBhbmQgdmFsdWVzIGFyZSBlYWNoIHJlc3BlY3RpdmVseSBjb250aWd1b3VzLiBXZSBkb1xuICogbm90IGNvbnN0cmFpbiB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlcywgc28gdGhlIGFwcGxpY2F0aW9uIGlzIHJlc3BvbnNpYmxlXG4gKiBmb3IgZW5zdXJpbmcgdGhhdCB0aGUga2V5cyBhcmUgaGFzaGFibGUgYW5kIHVuaXF1ZS4gV2hldGhlciB0aGUga2V5cyBhcmUgc29ydGVkXG4gKiBtYXkgYmUgc2V0IGluIHRoZSBtZXRhZGF0YSBmb3IgdGhpcyBmaWVsZC5cbiAqXG4gKiBJbiBhIGZpZWxkIHdpdGggTWFwIHR5cGUsIHRoZSBmaWVsZCBoYXMgYSBjaGlsZCBTdHJ1Y3QgZmllbGQsIHdoaWNoIHRoZW5cbiAqIGhhcyB0d28gY2hpbGRyZW46IGtleSB0eXBlIGFuZCB0aGUgc2Vjb25kIHRoZSB2YWx1ZSB0eXBlLiBUaGUgbmFtZXMgb2YgdGhlXG4gKiBjaGlsZCBmaWVsZHMgbWF5IGJlIHJlc3BlY3RpdmVseSBcImVudHJpZXNcIiwgXCJrZXlcIiwgYW5kIFwidmFsdWVcIiwgYnV0IHRoaXMgaXNcbiAqIG5vdCBlbmZvcmNlZC5cbiAqXG4gKiBNYXBcbiAqIGBgYHRleHRcbiAqICAgLSBjaGlsZFswXSBlbnRyaWVzOiBTdHJ1Y3RcbiAqICAgICAtIGNoaWxkWzBdIGtleTogS1xuICogICAgIC0gY2hpbGRbMV0gdmFsdWU6IFZcbiAqIGBgYFxuICogTmVpdGhlciB0aGUgXCJlbnRyaWVzXCIgZmllbGQgbm9yIHRoZSBcImtleVwiIGZpZWxkIG1heSBiZSBudWxsYWJsZS5cbiAqXG4gKiBUaGUgbWV0YWRhdGEgaXMgc3RydWN0dXJlZCBzbyB0aGF0IEFycm93IHN5c3RlbXMgd2l0aG91dCBzcGVjaWFsIGhhbmRsaW5nXG4gKiBmb3IgTWFwIGNhbiBtYWtlIE1hcCBhbiBhbGlhcyBmb3IgTGlzdC4gVGhlIFwibGF5b3V0XCIgYXR0cmlidXRlIGZvciB0aGUgTWFwXG4gKiBmaWVsZCBtdXN0IGhhdmUgdGhlIHNhbWUgY29udGVudHMgYXMgYSBMaXN0LlxuICovXG5leHBvcnQgY2xhc3MgTWFwIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc01hcChiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBNYXAoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc01hcChiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgTWFwKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0byB0cnVlIGlmIHRoZSBrZXlzIHdpdGhpbiBlYWNoIHZhbHVlIGFyZSBzb3J0ZWRcbiAgICAgKi9cbiAgICBrZXlzU29ydGVkKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/ICEhdGhpcy5iYi5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBmYWxzZTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0TWFwKGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCgxKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZEtleXNTb3J0ZWQoYnVpbGRlciwga2V5c1NvcnRlZCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50OCgwLCAra2V5c1NvcnRlZCwgK2ZhbHNlKTtcbiAgICB9XG4gICAgc3RhdGljIGVuZE1hcChidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVNYXAoYnVpbGRlciwga2V5c1NvcnRlZCkge1xuICAgICAgICBNYXAuc3RhcnRNYXAoYnVpbGRlcik7XG4gICAgICAgIE1hcC5hZGRLZXlzU29ydGVkKGJ1aWxkZXIsIGtleXNTb3J0ZWQpO1xuICAgICAgICByZXR1cm4gTWFwLmVuZE1hcChidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hcC5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmltcG9ydCB7IERpY3Rpb25hcnlCYXRjaCB9IGZyb20gJy4vZGljdGlvbmFyeS1iYXRjaC5tanMnO1xuaW1wb3J0IHsgUmVjb3JkQmF0Y2ggfSBmcm9tICcuL3JlY29yZC1iYXRjaC5tanMnO1xuaW1wb3J0IHsgU2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEubWpzJztcbmltcG9ydCB7IFNwYXJzZVRlbnNvciB9IGZyb20gJy4vc3BhcnNlLXRlbnNvci5tanMnO1xuaW1wb3J0IHsgVGVuc29yIH0gZnJvbSAnLi90ZW5zb3IubWpzJztcbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogVGhlIHJvb3QgTWVzc2FnZSB0eXBlXG4gKiBUaGlzIHVuaW9uIGVuYWJsZXMgdXMgdG8gZWFzaWx5IHNlbmQgZGlmZmVyZW50IG1lc3NhZ2UgdHlwZXMgd2l0aG91dFxuICogcmVkdW5kYW50IHN0b3JhZ2UsIGFuZCBpbiB0aGUgZnV0dXJlIHdlIGNhbiBlYXNpbHkgYWRkIG5ldyBtZXNzYWdlIHR5cGVzLlxuICpcbiAqIEFycm93IGltcGxlbWVudGF0aW9ucyBkbyBub3QgbmVlZCB0byBpbXBsZW1lbnQgYWxsIG9mIHRoZSBtZXNzYWdlIHR5cGVzLFxuICogd2hpY2ggbWF5IGluY2x1ZGUgZXhwZXJpbWVudGFsIG1ldGFkYXRhIHR5cGVzLiBGb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5LFxuICogaXQgaXMgYmVzdCB0byBzZW5kIGRhdGEgdXNpbmcgUmVjb3JkQmF0Y2hcbiAqL1xuZXhwb3J0IHZhciBNZXNzYWdlSGVhZGVyO1xuKGZ1bmN0aW9uIChNZXNzYWdlSGVhZGVyKSB7XG4gICAgTWVzc2FnZUhlYWRlcltNZXNzYWdlSGVhZGVyW1wiTk9ORVwiXSA9IDBdID0gXCJOT05FXCI7XG4gICAgTWVzc2FnZUhlYWRlcltNZXNzYWdlSGVhZGVyW1wiU2NoZW1hXCJdID0gMV0gPSBcIlNjaGVtYVwiO1xuICAgIE1lc3NhZ2VIZWFkZXJbTWVzc2FnZUhlYWRlcltcIkRpY3Rpb25hcnlCYXRjaFwiXSA9IDJdID0gXCJEaWN0aW9uYXJ5QmF0Y2hcIjtcbiAgICBNZXNzYWdlSGVhZGVyW01lc3NhZ2VIZWFkZXJbXCJSZWNvcmRCYXRjaFwiXSA9IDNdID0gXCJSZWNvcmRCYXRjaFwiO1xuICAgIE1lc3NhZ2VIZWFkZXJbTWVzc2FnZUhlYWRlcltcIlRlbnNvclwiXSA9IDRdID0gXCJUZW5zb3JcIjtcbiAgICBNZXNzYWdlSGVhZGVyW01lc3NhZ2VIZWFkZXJbXCJTcGFyc2VUZW5zb3JcIl0gPSA1XSA9IFwiU3BhcnNlVGVuc29yXCI7XG59KShNZXNzYWdlSGVhZGVyIHx8IChNZXNzYWdlSGVhZGVyID0ge30pKTtcbmV4cG9ydCBmdW5jdGlvbiB1bmlvblRvTWVzc2FnZUhlYWRlcih0eXBlLCBhY2Nlc3Nvcikge1xuICAgIHN3aXRjaCAoTWVzc2FnZUhlYWRlclt0eXBlXSkge1xuICAgICAgICBjYXNlICdOT05FJzogcmV0dXJuIG51bGw7XG4gICAgICAgIGNhc2UgJ1NjaGVtYSc6IHJldHVybiBhY2Nlc3NvcihuZXcgU2NoZW1hKCkpO1xuICAgICAgICBjYXNlICdEaWN0aW9uYXJ5QmF0Y2gnOiByZXR1cm4gYWNjZXNzb3IobmV3IERpY3Rpb25hcnlCYXRjaCgpKTtcbiAgICAgICAgY2FzZSAnUmVjb3JkQmF0Y2gnOiByZXR1cm4gYWNjZXNzb3IobmV3IFJlY29yZEJhdGNoKCkpO1xuICAgICAgICBjYXNlICdUZW5zb3InOiByZXR1cm4gYWNjZXNzb3IobmV3IFRlbnNvcigpKTtcbiAgICAgICAgY2FzZSAnU3BhcnNlVGVuc29yJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBTcGFyc2VUZW5zb3IoKSk7XG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB1bmlvbkxpc3RUb01lc3NhZ2VIZWFkZXIodHlwZSwgYWNjZXNzb3IsIGluZGV4KSB7XG4gICAgc3dpdGNoIChNZXNzYWdlSGVhZGVyW3R5cGVdKSB7XG4gICAgICAgIGNhc2UgJ05PTkUnOiByZXR1cm4gbnVsbDtcbiAgICAgICAgY2FzZSAnU2NoZW1hJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgU2NoZW1hKCkpO1xuICAgICAgICBjYXNlICdEaWN0aW9uYXJ5QmF0Y2gnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBEaWN0aW9uYXJ5QmF0Y2goKSk7XG4gICAgICAgIGNhc2UgJ1JlY29yZEJhdGNoJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgUmVjb3JkQmF0Y2goKSk7XG4gICAgICAgIGNhc2UgJ1RlbnNvcic6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IFRlbnNvcigpKTtcbiAgICAgICAgY2FzZSAnU3BhcnNlVGVuc29yJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgU3BhcnNlVGVuc29yKCkpO1xuICAgICAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lc3NhZ2UtaGVhZGVyLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuaW1wb3J0IHsgS2V5VmFsdWUgfSBmcm9tICcuL2tleS12YWx1ZS5tanMnO1xuaW1wb3J0IHsgTWVzc2FnZUhlYWRlciB9IGZyb20gJy4vbWVzc2FnZS1oZWFkZXIubWpzJztcbmltcG9ydCB7IE1ldGFkYXRhVmVyc2lvbiB9IGZyb20gJy4vbWV0YWRhdGEtdmVyc2lvbi5tanMnO1xuZXhwb3J0IGNsYXNzIE1lc3NhZ2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzTWVzc2FnZShiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBNZXNzYWdlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNNZXNzYWdlKGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBNZXNzYWdlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHZlcnNpb24oKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogTWV0YWRhdGFWZXJzaW9uLlYxO1xuICAgIH1cbiAgICBoZWFkZXJUeXBlKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZFVpbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IE1lc3NhZ2VIZWFkZXIuTk9ORTtcbiAgICB9XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGhlYWRlcihvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdW5pb24ob2JqLCB0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBudWxsO1xuICAgIH1cbiAgICBib2R5TGVuZ3RoKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiB0aGlzLmJiLmNyZWF0ZUxvbmcoMCwgMCk7XG4gICAgfVxuICAgIGN1c3RvbU1ldGFkYXRhKGluZGV4LCBvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgS2V5VmFsdWUoKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIpIDogbnVsbDtcbiAgICB9XG4gICAgY3VzdG9tTWV0YWRhdGFMZW5ndGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydE1lc3NhZ2UoYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDUpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkVmVyc2lvbihidWlsZGVyLCB2ZXJzaW9uKSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQxNigwLCB2ZXJzaW9uLCBNZXRhZGF0YVZlcnNpb24uVjEpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkSGVhZGVyVHlwZShidWlsZGVyLCBoZWFkZXJUeXBlKSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDEsIGhlYWRlclR5cGUsIE1lc3NhZ2VIZWFkZXIuTk9ORSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRIZWFkZXIoYnVpbGRlciwgaGVhZGVyT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMiwgaGVhZGVyT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZEJvZHlMZW5ndGgoYnVpbGRlciwgYm9keUxlbmd0aCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50NjQoMywgYm9keUxlbmd0aCwgYnVpbGRlci5jcmVhdGVMb25nKDAsIDApKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZEN1c3RvbU1ldGFkYXRhKGJ1aWxkZXIsIGN1c3RvbU1ldGFkYXRhT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNCwgY3VzdG9tTWV0YWRhdGFPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlQ3VzdG9tTWV0YWRhdGFWZWN0b3IoYnVpbGRlciwgZGF0YSkge1xuICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRDdXN0b21NZXRhZGF0YVZlY3RvcihidWlsZGVyLCBudW1FbGVtcykge1xuICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTtcbiAgICB9XG4gICAgc3RhdGljIGVuZE1lc3NhZ2UoYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgZmluaXNoTWVzc2FnZUJ1ZmZlcihidWlsZGVyLCBvZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5maW5pc2gob2Zmc2V0KTtcbiAgICB9XG4gICAgc3RhdGljIGZpbmlzaFNpemVQcmVmaXhlZE1lc3NhZ2VCdWZmZXIoYnVpbGRlciwgb2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuZmluaXNoKG9mZnNldCwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZU1lc3NhZ2UoYnVpbGRlciwgdmVyc2lvbiwgaGVhZGVyVHlwZSwgaGVhZGVyT2Zmc2V0LCBib2R5TGVuZ3RoLCBjdXN0b21NZXRhZGF0YU9mZnNldCkge1xuICAgICAgICBNZXNzYWdlLnN0YXJ0TWVzc2FnZShidWlsZGVyKTtcbiAgICAgICAgTWVzc2FnZS5hZGRWZXJzaW9uKGJ1aWxkZXIsIHZlcnNpb24pO1xuICAgICAgICBNZXNzYWdlLmFkZEhlYWRlclR5cGUoYnVpbGRlciwgaGVhZGVyVHlwZSk7XG4gICAgICAgIE1lc3NhZ2UuYWRkSGVhZGVyKGJ1aWxkZXIsIGhlYWRlck9mZnNldCk7XG4gICAgICAgIE1lc3NhZ2UuYWRkQm9keUxlbmd0aChidWlsZGVyLCBib2R5TGVuZ3RoKTtcbiAgICAgICAgTWVzc2FnZS5hZGRDdXN0b21NZXRhZGF0YShidWlsZGVyLCBjdXN0b21NZXRhZGF0YU9mZnNldCk7XG4gICAgICAgIHJldHVybiBNZXNzYWdlLmVuZE1lc3NhZ2UoYnVpbGRlcik7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXNzYWdlLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuLyoqXG4gKiBMb2dpY2FsIHR5cGVzLCB2ZWN0b3IgbGF5b3V0cywgYW5kIHNjaGVtYXNcbiAqIEZvcm1hdCBWZXJzaW9uIEhpc3RvcnkuXG4gKiBWZXJzaW9uIDEuMCAtIEZvcndhcmQgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGd1YXJhbnRlZWQuXG4gKiBWZXJzaW9uIDEuMSAtIEFkZCBEZWNpbWFsMjU2IChObyBmb3JtYXQgcmVsZWFzZSkuXG4gKiBWZXJzaW9uIDEuMiAoUGVuZGluZyktIEFkZCBJbnRlcnZhbCBNT05USF9EQVlfTkFOT1xuICovXG5leHBvcnQgdmFyIE1ldGFkYXRhVmVyc2lvbjtcbihmdW5jdGlvbiAoTWV0YWRhdGFWZXJzaW9uKSB7XG4gICAgLyoqXG4gICAgICogMC4xLjAgKE9jdG9iZXIgMjAxNikuXG4gICAgICovXG4gICAgTWV0YWRhdGFWZXJzaW9uW01ldGFkYXRhVmVyc2lvbltcIlYxXCJdID0gMF0gPSBcIlYxXCI7XG4gICAgLyoqXG4gICAgICogMC4yLjAgKEZlYnJ1YXJ5IDIwMTcpLiBOb24tYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBWMS5cbiAgICAgKi9cbiAgICBNZXRhZGF0YVZlcnNpb25bTWV0YWRhdGFWZXJzaW9uW1wiVjJcIl0gPSAxXSA9IFwiVjJcIjtcbiAgICAvKipcbiAgICAgKiAwLjMuMCAtPiAwLjcuMSAoTWF5IC0gRGVjZW1iZXIgMjAxNykuIE5vbi1iYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIFYyLlxuICAgICAqL1xuICAgIE1ldGFkYXRhVmVyc2lvbltNZXRhZGF0YVZlcnNpb25bXCJWM1wiXSA9IDJdID0gXCJWM1wiO1xuICAgIC8qKlxuICAgICAqID49IDAuOC4wIChEZWNlbWJlciAyMDE3KS4gTm9uLWJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggVjMuXG4gICAgICovXG4gICAgTWV0YWRhdGFWZXJzaW9uW01ldGFkYXRhVmVyc2lvbltcIlY0XCJdID0gM10gPSBcIlY0XCI7XG4gICAgLyoqXG4gICAgICogPj0gMS4wLjAgKEp1bHkgMjAyMC4gQmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBWNCAoVjUgcmVhZGVycyBjYW4gcmVhZCBWNFxuICAgICAqIG1ldGFkYXRhIGFuZCBJUEMgbWVzc2FnZXMpLiBJbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHByb3ZpZGUgYVxuICAgICAqIFY0IGNvbXBhdGliaWxpdHkgbW9kZSB3aXRoIFY1IGZvcm1hdCBjaGFuZ2VzIGRpc2FibGVkLlxuICAgICAqXG4gICAgICogSW5jb21wYXRpYmxlIGNoYW5nZXMgYmV0d2VlbiBWNCBhbmQgVjU6XG4gICAgICogLSBVbmlvbiBidWZmZXIgbGF5b3V0IGhhcyBjaGFuZ2VkLiBJbiBWNSwgVW5pb25zIGRvbid0IGhhdmUgYSB2YWxpZGl0eVxuICAgICAqICAgYml0bWFwIGJ1ZmZlci5cbiAgICAgKi9cbiAgICBNZXRhZGF0YVZlcnNpb25bTWV0YWRhdGFWZXJzaW9uW1wiVjVcIl0gPSA0XSA9IFwiVjVcIjtcbn0pKE1ldGFkYXRhVmVyc2lvbiB8fCAoTWV0YWRhdGFWZXJzaW9uID0ge30pKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWV0YWRhdGEtdmVyc2lvbi5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJztcbi8qKlxuICogVGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgZmxhdGJ1ZmZlciBpbiB0aGUgVHlwZSB1bmlvbiBiZWxvd1xuICovXG5leHBvcnQgY2xhc3MgTnVsbCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNOdWxsKGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IE51bGwoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc051bGwoYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IE51bGwoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0TnVsbChidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmROdWxsKGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZU51bGwoYnVpbGRlcikge1xuICAgICAgICBOdWxsLnN0YXJ0TnVsbChidWlsZGVyKTtcbiAgICAgICAgcmV0dXJuIE51bGwuZW5kTnVsbChidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW51bGwubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5leHBvcnQgdmFyIFByZWNpc2lvbjtcbihmdW5jdGlvbiAoUHJlY2lzaW9uKSB7XG4gICAgUHJlY2lzaW9uW1ByZWNpc2lvbltcIkhBTEZcIl0gPSAwXSA9IFwiSEFMRlwiO1xuICAgIFByZWNpc2lvbltQcmVjaXNpb25bXCJTSU5HTEVcIl0gPSAxXSA9IFwiU0lOR0xFXCI7XG4gICAgUHJlY2lzaW9uW1ByZWNpc2lvbltcIkRPVUJMRVwiXSA9IDJdID0gXCJET1VCTEVcIjtcbn0pKFByZWNpc2lvbiB8fCAoUHJlY2lzaW9uID0ge30pKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJlY2lzaW9uLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuaW1wb3J0IHsgQm9keUNvbXByZXNzaW9uIH0gZnJvbSAnLi9ib2R5LWNvbXByZXNzaW9uLm1qcyc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICcuL2J1ZmZlci5tanMnO1xuaW1wb3J0IHsgRmllbGROb2RlIH0gZnJvbSAnLi9maWVsZC1ub2RlLm1qcyc7XG4vKipcbiAqIEEgZGF0YSBoZWFkZXIgZGVzY3JpYmluZyB0aGUgc2hhcmVkIG1lbW9yeSBsYXlvdXQgb2YgYSBcInJlY29yZFwiIG9yIFwicm93XCJcbiAqIGJhdGNoLiBTb21lIHN5c3RlbXMgY2FsbCB0aGlzIGEgXCJyb3cgYmF0Y2hcIiBpbnRlcm5hbGx5IGFuZCBvdGhlcnMgYSBcInJlY29yZFxuICogYmF0Y2hcIi5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlY29yZEJhdGNoIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc1JlY29yZEJhdGNoKGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFJlY29yZEJhdGNoKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNSZWNvcmRCYXRjaChiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgUmVjb3JkQmF0Y2goKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogbnVtYmVyIG9mIHJlY29yZHMgLyByb3dzLiBUaGUgYXJyYXlzIGluIHRoZSBiYXRjaCBzaG91bGQgYWxsIGhhdmUgdGhpc1xuICAgICAqIGxlbmd0aFxuICAgICAqL1xuICAgIGxlbmd0aCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiB0aGlzLmJiLmNyZWF0ZUxvbmcoMCwgMCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5vZGVzIGNvcnJlc3BvbmQgdG8gdGhlIHByZS1vcmRlcmVkIGZsYXR0ZW5lZCBsb2dpY2FsIHNjaGVtYVxuICAgICAqL1xuICAgIG5vZGVzKGluZGV4LCBvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBGaWVsZE5vZGUoKSkuX19pbml0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiAxNiwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICBub2Rlc0xlbmd0aCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCdWZmZXJzIGNvcnJlc3BvbmQgdG8gdGhlIHByZS1vcmRlcmVkIGZsYXR0ZW5lZCBidWZmZXIgdHJlZVxuICAgICAqXG4gICAgICogVGhlIG51bWJlciBvZiBidWZmZXJzIGFwcGVuZGVkIHRvIHRoaXMgbGlzdCBkZXBlbmRzIG9uIHRoZSBzY2hlbWEuIEZvclxuICAgICAqIGV4YW1wbGUsIG1vc3QgcHJpbWl0aXZlIGFycmF5cyB3aWxsIGhhdmUgMiBidWZmZXJzLCAxIGZvciB0aGUgdmFsaWRpdHlcbiAgICAgKiBiaXRtYXAgYW5kIDEgZm9yIHRoZSB2YWx1ZXMuIEZvciBzdHJ1Y3QgYXJyYXlzLCB0aGVyZSB3aWxsIG9ubHkgYmUgYVxuICAgICAqIHNpbmdsZSBidWZmZXIgZm9yIHRoZSB2YWxpZGl0eSAobnVsbHMpIGJpdG1hcFxuICAgICAqL1xuICAgIGJ1ZmZlcnMoaW5kZXgsIG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEJ1ZmZlcigpKS5fX2luaXQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDE2LCB0aGlzLmJiKSA6IG51bGw7XG4gICAgfVxuICAgIGJ1ZmZlcnNMZW5ndGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgY29tcHJlc3Npb24gb2YgdGhlIG1lc3NhZ2UgYm9keVxuICAgICAqL1xuICAgIGNvbXByZXNzaW9uKG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBCb2R5Q29tcHJlc3Npb24oKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIpIDogbnVsbDtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0UmVjb3JkQmF0Y2goYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDQpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkTGVuZ3RoKGJ1aWxkZXIsIGxlbmd0aCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50NjQoMCwgbGVuZ3RoLCBidWlsZGVyLmNyZWF0ZUxvbmcoMCwgMCkpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkTm9kZXMoYnVpbGRlciwgbm9kZXNPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxLCBub2Rlc09mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydE5vZGVzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoMTYsIG51bUVsZW1zLCA4KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZEJ1ZmZlcnMoYnVpbGRlciwgYnVmZmVyc09mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDIsIGJ1ZmZlcnNPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRCdWZmZXJzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoMTYsIG51bUVsZW1zLCA4KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZENvbXByZXNzaW9uKGJ1aWxkZXIsIGNvbXByZXNzaW9uT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMywgY29tcHJlc3Npb25PZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kUmVjb3JkQmF0Y2goYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVjb3JkLWJhdGNoLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuaW1wb3J0IHsgRW5kaWFubmVzcyB9IGZyb20gJy4vZW5kaWFubmVzcy5tanMnO1xuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuL2ZpZWxkLm1qcyc7XG5pbXBvcnQgeyBLZXlWYWx1ZSB9IGZyb20gJy4va2V5LXZhbHVlLm1qcyc7XG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEEgU2NoZW1hIGRlc2NyaWJlcyB0aGUgY29sdW1ucyBpbiBhIHJvdyBiYXRjaFxuICovXG5leHBvcnQgY2xhc3MgU2NoZW1hIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc1NjaGVtYShiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBTY2hlbWEoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1NjaGVtYShiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgU2NoZW1hKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGVuZGlhbm5lc3Mgb2YgdGhlIGJ1ZmZlclxuICAgICAqIGl0IGlzIExpdHRsZSBFbmRpYW4gYnkgZGVmYXVsdFxuICAgICAqIGlmIGVuZGlhbm5lc3MgZG9lc24ndCBtYXRjaCB0aGUgdW5kZXJseWluZyBzeXN0ZW0gdGhlbiB0aGUgdmVjdG9ycyBuZWVkIHRvIGJlIGNvbnZlcnRlZFxuICAgICAqL1xuICAgIGVuZGlhbm5lc3MoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogRW5kaWFubmVzcy5MaXR0bGU7XG4gICAgfVxuICAgIGZpZWxkcyhpbmRleCwgb2JqKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgRmllbGQoKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIpIDogbnVsbDtcbiAgICB9XG4gICAgZmllbGRzTGVuZ3RoKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7XG4gICAgfVxuICAgIGN1c3RvbU1ldGFkYXRhKGluZGV4LCBvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBLZXlWYWx1ZSgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICBjdXN0b21NZXRhZGF0YUxlbmd0aCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZWF0dXJlcyB1c2VkIGluIHRoZSBzdHJlYW0vZmlsZS5cbiAgICAgKi9cbiAgICBmZWF0dXJlcyhpbmRleCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogOCkgOiB0aGlzLmJiLmNyZWF0ZUxvbmcoMCwgMCk7XG4gICAgfVxuICAgIGZlYXR1cmVzTGVuZ3RoKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRTY2hlbWEoYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDQpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkRW5kaWFubmVzcyhidWlsZGVyLCBlbmRpYW5uZXNzKSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQxNigwLCBlbmRpYW5uZXNzLCBFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRGaWVsZHMoYnVpbGRlciwgZmllbGRzT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgZmllbGRzT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUZpZWxkc1ZlY3RvcihidWlsZGVyLCBkYXRhKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpO1xuICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydEZpZWxkc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykge1xuICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZEN1c3RvbU1ldGFkYXRhKGJ1aWxkZXIsIGN1c3RvbU1ldGFkYXRhT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMiwgY3VzdG9tTWV0YWRhdGFPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlQ3VzdG9tTWV0YWRhdGFWZWN0b3IoYnVpbGRlciwgZGF0YSkge1xuICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRDdXN0b21NZXRhZGF0YVZlY3RvcihidWlsZGVyLCBudW1FbGVtcykge1xuICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZEZlYXR1cmVzKGJ1aWxkZXIsIGZlYXR1cmVzT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMywgZmVhdHVyZXNPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlRmVhdHVyZXNWZWN0b3IoYnVpbGRlciwgZGF0YSkge1xuICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDgsIGRhdGEubGVuZ3RoLCA4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGJ1aWxkZXIuYWRkSW50NjQoZGF0YVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydEZlYXR1cmVzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kU2NoZW1hKGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGZpbmlzaFNjaGVtYUJ1ZmZlcihidWlsZGVyLCBvZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5maW5pc2gob2Zmc2V0KTtcbiAgICB9XG4gICAgc3RhdGljIGZpbmlzaFNpemVQcmVmaXhlZFNjaGVtYUJ1ZmZlcihidWlsZGVyLCBvZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5maW5pc2gob2Zmc2V0LCB1bmRlZmluZWQsIHRydWUpO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlU2NoZW1hKGJ1aWxkZXIsIGVuZGlhbm5lc3MsIGZpZWxkc09mZnNldCwgY3VzdG9tTWV0YWRhdGFPZmZzZXQsIGZlYXR1cmVzT2Zmc2V0KSB7XG4gICAgICAgIFNjaGVtYS5zdGFydFNjaGVtYShidWlsZGVyKTtcbiAgICAgICAgU2NoZW1hLmFkZEVuZGlhbm5lc3MoYnVpbGRlciwgZW5kaWFubmVzcyk7XG4gICAgICAgIFNjaGVtYS5hZGRGaWVsZHMoYnVpbGRlciwgZmllbGRzT2Zmc2V0KTtcbiAgICAgICAgU2NoZW1hLmFkZEN1c3RvbU1ldGFkYXRhKGJ1aWxkZXIsIGN1c3RvbU1ldGFkYXRhT2Zmc2V0KTtcbiAgICAgICAgU2NoZW1hLmFkZEZlYXR1cmVzKGJ1aWxkZXIsIGZlYXR1cmVzT2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIFNjaGVtYS5lbmRTY2hlbWEoYnVpbGRlcik7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1zY2hlbWEubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5leHBvcnQgdmFyIFNwYXJzZU1hdHJpeENvbXByZXNzZWRBeGlzO1xuKGZ1bmN0aW9uIChTcGFyc2VNYXRyaXhDb21wcmVzc2VkQXhpcykge1xuICAgIFNwYXJzZU1hdHJpeENvbXByZXNzZWRBeGlzW1NwYXJzZU1hdHJpeENvbXByZXNzZWRBeGlzW1wiUm93XCJdID0gMF0gPSBcIlJvd1wiO1xuICAgIFNwYXJzZU1hdHJpeENvbXByZXNzZWRBeGlzW1NwYXJzZU1hdHJpeENvbXByZXNzZWRBeGlzW1wiQ29sdW1uXCJdID0gMV0gPSBcIkNvbHVtblwiO1xufSkoU3BhcnNlTWF0cml4Q29tcHJlc3NlZEF4aXMgfHwgKFNwYXJzZU1hdHJpeENvbXByZXNzZWRBeGlzID0ge30pKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3BhcnNlLW1hdHJpeC1jb21wcmVzc2VkLWF4aXMubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICcuL2J1ZmZlci5tanMnO1xuaW1wb3J0IHsgSW50IH0gZnJvbSAnLi9pbnQubWpzJztcbmltcG9ydCB7IFNwYXJzZU1hdHJpeENvbXByZXNzZWRBeGlzIH0gZnJvbSAnLi9zcGFyc2UtbWF0cml4LWNvbXByZXNzZWQtYXhpcy5tanMnO1xuLyoqXG4gKiBDb21wcmVzc2VkIFNwYXJzZSBmb3JtYXQsIHRoYXQgaXMgbWF0cml4LXNwZWNpZmljLlxuICovXG5leHBvcnQgY2xhc3MgU3BhcnNlTWF0cml4SW5kZXhDU1gge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzU3BhcnNlTWF0cml4SW5kZXhDU1goYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgU3BhcnNlTWF0cml4SW5kZXhDU1goKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1NwYXJzZU1hdHJpeEluZGV4Q1NYKGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBTcGFyc2VNYXRyaXhJbmRleENTWCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGljaCBheGlzLCByb3cgb3IgY29sdW1uLCBpcyBjb21wcmVzc2VkXG4gICAgICovXG4gICAgY29tcHJlc3NlZEF4aXMoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogU3BhcnNlTWF0cml4Q29tcHJlc3NlZEF4aXMuUm93O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB2YWx1ZXMgaW4gaW5kcHRyQnVmZmVyXG4gICAgICovXG4gICAgaW5kcHRyVHlwZShvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBJbnQoKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIpIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogaW5kcHRyQnVmZmVyIHN0b3JlcyB0aGUgbG9jYXRpb24gYW5kIHNpemUgb2YgaW5kcHRyIGFycmF5IHRoYXRcbiAgICAgKiByZXByZXNlbnRzIHRoZSByYW5nZSBvZiB0aGUgcm93cy5cbiAgICAgKiBUaGUgaS10aCByb3cgc3BhbnMgZnJvbSBgaW5kcHRyW2ldYCB0byBgaW5kcHRyW2krMV1gIGluIHRoZSBkYXRhLlxuICAgICAqIFRoZSBsZW5ndGggb2YgdGhpcyBhcnJheSBpcyAxICsgKHRoZSBudW1iZXIgb2Ygcm93cyksIGFuZCB0aGUgdHlwZVxuICAgICAqIG9mIGluZGV4IHZhbHVlIGlzIGxvbmcuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZSwgbGV0IFggYmUgdGhlIGZvbGxvd2luZyA2eDQgbWF0cml4OlxuICAgICAqIGBgYHRleHRcbiAgICAgKiAgIFggOj0gW1swLCAxLCAyLCAwXSxcbiAgICAgKiAgICAgICAgIFswLCAwLCAzLCAwXSxcbiAgICAgKiAgICAgICAgIFswLCA0LCAwLCA1XSxcbiAgICAgKiAgICAgICAgIFswLCAwLCAwLCAwXSxcbiAgICAgKiAgICAgICAgIFs2LCAwLCA3LCA4XSxcbiAgICAgKiAgICAgICAgIFswLCA5LCAwLCAwXV0uXG4gICAgICogYGBgXG4gICAgICogVGhlIGFycmF5IG9mIG5vbi16ZXJvIHZhbHVlcyBpbiBYIGlzOlxuICAgICAqIGBgYHRleHRcbiAgICAgKiAgIHZhbHVlcyhYKSA9IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XS5cbiAgICAgKiBgYGBcbiAgICAgKiBBbmQgdGhlIGluZHB0ciBvZiBYIGlzOlxuICAgICAqIGBgYHRleHRcbiAgICAgKiAgIGluZHB0cihYKSA9IFswLCAyLCAzLCA1LCA1LCA4LCAxMF0uXG4gICAgICogYGBgXG4gICAgICovXG4gICAgaW5kcHRyQnVmZmVyKG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEJ1ZmZlcigpKS5fX2luaXQodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHRoaXMuYmIpIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdmFsdWVzIGluIGluZGljZXNCdWZmZXJcbiAgICAgKi9cbiAgICBpbmRpY2VzVHlwZShvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgSW50KCkpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiKSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGluZGljZXNCdWZmZXIgc3RvcmVzIHRoZSBsb2NhdGlvbiBhbmQgc2l6ZSBvZiB0aGUgYXJyYXkgdGhhdFxuICAgICAqIGNvbnRhaW5zIHRoZSBjb2x1bW4gaW5kaWNlcyBvZiB0aGUgY29ycmVzcG9uZGluZyBub24temVybyB2YWx1ZXMuXG4gICAgICogVGhlIHR5cGUgb2YgaW5kZXggdmFsdWUgaXMgbG9uZy5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlLCB0aGUgaW5kaWNlcyBvZiB0aGUgYWJvdmUgWCBpczpcbiAgICAgKiBgYGB0ZXh0XG4gICAgICogICBpbmRpY2VzKFgpID0gWzEsIDIsIDIsIDEsIDMsIDAsIDIsIDMsIDFdLlxuICAgICAqIGBgYFxuICAgICAqIE5vdGUgdGhhdCB0aGUgaW5kaWNlcyBhcmUgc29ydGVkIGluIGxleGljb2dyYXBoaWNhbCBvcmRlciBmb3IgZWFjaCByb3cuXG4gICAgICovXG4gICAgaW5kaWNlc0J1ZmZlcihvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgQnVmZmVyKCkpLl9faW5pdCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRTcGFyc2VNYXRyaXhJbmRleENTWChidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoNSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRDb21wcmVzc2VkQXhpcyhidWlsZGVyLCBjb21wcmVzc2VkQXhpcykge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MTYoMCwgY29tcHJlc3NlZEF4aXMsIFNwYXJzZU1hdHJpeENvbXByZXNzZWRBeGlzLlJvdyk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRJbmRwdHJUeXBlKGJ1aWxkZXIsIGluZHB0clR5cGVPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxLCBpbmRwdHJUeXBlT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZEluZHB0ckJ1ZmZlcihidWlsZGVyLCBpbmRwdHJCdWZmZXJPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZFN0cnVjdCgyLCBpbmRwdHJCdWZmZXJPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkSW5kaWNlc1R5cGUoYnVpbGRlciwgaW5kaWNlc1R5cGVPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzLCBpbmRpY2VzVHlwZU9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRJbmRpY2VzQnVmZmVyKGJ1aWxkZXIsIGluZGljZXNCdWZmZXJPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZFN0cnVjdCg0LCBpbmRpY2VzQnVmZmVyT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGVuZFNwYXJzZU1hdHJpeEluZGV4Q1NYKGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNik7IC8vIGluZHB0clR5cGVcbiAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgOCk7IC8vIGluZHB0ckJ1ZmZlclxuICAgICAgICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCAxMCk7IC8vIGluZGljZXNUeXBlXG4gICAgICAgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDEyKTsgLy8gaW5kaWNlc0J1ZmZlclxuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3BhcnNlLW1hdHJpeC1pbmRleC1jLXMteC5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJy4vYnVmZmVyLm1qcyc7XG5pbXBvcnQgeyBJbnQgfSBmcm9tICcuL2ludC5tanMnO1xuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBFWFBFUklNRU5UQUw6IERhdGEgc3RydWN0dXJlcyBmb3Igc3BhcnNlIHRlbnNvcnNcbiAqIENvb3JkaW5hdGUgKENPTykgZm9ybWF0IG9mIHNwYXJzZSB0ZW5zb3IgaW5kZXguXG4gKlxuICogQ09PJ3MgaW5kZXggbGlzdCBhcmUgcmVwcmVzZW50ZWQgYXMgYSBOeE0gbWF0cml4LFxuICogd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIHZhbHVlcyxcbiAqIGFuZCBNIGlzIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBvZiBhIHNwYXJzZSB0ZW5zb3IuXG4gKlxuICogaW5kaWNlc0J1ZmZlciBzdG9yZXMgdGhlIGxvY2F0aW9uIGFuZCBzaXplIG9mIHRoZSBkYXRhIG9mIHRoaXMgaW5kaWNlc1xuICogbWF0cml4LiAgVGhlIHZhbHVlIHR5cGUgYW5kIHRoZSBzdHJpZGUgb2YgdGhlIGluZGljZXMgbWF0cml4IGlzXG4gKiBzcGVjaWZpZWQgaW4gaW5kaWNlc1R5cGUgYW5kIGluZGljZXNTdHJpZGVzIGZpZWxkcy5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgbGV0IFggYmUgYSAyeDN4NHg1IHRlbnNvciwgYW5kIGl0IGhhcyB0aGUgZm9sbG93aW5nXG4gKiA2IG5vbi16ZXJvIHZhbHVlczpcbiAqIGBgYHRleHRcbiAqICAgWFswLCAxLCAyLCAwXSA6PSAxXG4gKiAgIFhbMSwgMSwgMiwgM10gOj0gMlxuICogICBYWzAsIDIsIDEsIDBdIDo9IDNcbiAqICAgWFswLCAxLCAzLCAwXSA6PSA0XG4gKiAgIFhbMCwgMSwgMiwgMV0gOj0gNVxuICogICBYWzEsIDIsIDAsIDRdIDo9IDZcbiAqIGBgYFxuICogSW4gQ09PIGZvcm1hdCwgdGhlIGluZGV4IG1hdHJpeCBvZiBYIGlzIHRoZSBmb2xsb3dpbmcgNHg2IG1hdHJpeDpcbiAqIGBgYHRleHRcbiAqICAgW1swLCAwLCAwLCAwLCAxLCAxXSxcbiAqICAgIFsxLCAxLCAxLCAyLCAxLCAyXSxcbiAqICAgIFsyLCAyLCAzLCAxLCAyLCAwXSxcbiAqICAgIFswLCAxLCAwLCAwLCAzLCA0XV1cbiAqIGBgYFxuICogV2hlbiBpc0Nhbm9uaWNhbCBpcyB0cnVlLCB0aGUgaW5kaWNlcyBpcyBzb3J0ZWQgaW4gbGV4aWNvZ3JhcGhpY2FsIG9yZGVyXG4gKiAocm93LW1ham9yIG9yZGVyKSwgYW5kIGl0IGRvZXMgbm90IGhhdmUgZHVwbGljYXRlZCBlbnRyaWVzLiAgT3RoZXJ3aXNlLFxuICogdGhlIGluZGljZXMgbWF5IG5vdCBiZSBzb3J0ZWQsIG9yIG1heSBoYXZlIGR1cGxpY2F0ZWQgZW50cmllcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNwYXJzZVRlbnNvckluZGV4Q09PIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc1NwYXJzZVRlbnNvckluZGV4Q09PKGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFNwYXJzZVRlbnNvckluZGV4Q09PKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNTcGFyc2VUZW5zb3JJbmRleENPTyhiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgU3BhcnNlVGVuc29ySW5kZXhDT08oKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdmFsdWVzIGluIGluZGljZXNCdWZmZXJcbiAgICAgKi9cbiAgICBpbmRpY2VzVHlwZShvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBJbnQoKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIpIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTm9uLW5lZ2F0aXZlIGJ5dGUgb2Zmc2V0cyB0byBhZHZhbmNlIG9uZSB2YWx1ZSBjZWxsIGFsb25nIGVhY2ggZGltZW5zaW9uXG4gICAgICogSWYgb21pdHRlZCwgZGVmYXVsdCB0byByb3ctbWFqb3Igb3JkZXIgKEMtbGlrZSkuXG4gICAgICovXG4gICAgaW5kaWNlc1N0cmlkZXMoaW5kZXgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogOCkgOiB0aGlzLmJiLmNyZWF0ZUxvbmcoMCwgMCk7XG4gICAgfVxuICAgIGluZGljZXNTdHJpZGVzTGVuZ3RoKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBsb2NhdGlvbiBhbmQgc2l6ZSBvZiB0aGUgaW5kaWNlcyBtYXRyaXgncyBkYXRhXG4gICAgICovXG4gICAgaW5kaWNlc0J1ZmZlcihvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBCdWZmZXIoKSkuX19pbml0KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB0aGlzLmJiKSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgZmxhZyBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBpbmRpY2VzIG1hdHJpeCBpcyBzb3J0ZWQgaW5cbiAgICAgKiByb3ctbWFqb3Igb3JkZXIsIGFuZCBkb2VzIG5vdCBoYXZlIGR1cGxpY2F0ZWQgZW50cmllcy5cbiAgICAgKiBUaGlzIHNvcnQgb3JkZXIgaXMgdGhlIHNhbWUgYXMgb2YgVGVuc29yZmxvdydzIFNwYXJzZVRlbnNvcixcbiAgICAgKiBidXQgaXQgaXMgaW52ZXJzZSBvcmRlciBvZiBTY2lQeSdzIGNhbm9uaWNhbCBjb29fbWF0cml4XG4gICAgICogKFNjaVB5IGVtcGxveXMgY29sdW1uLW1ham9yIG9yZGVyIGZvciBpdHMgY29vX21hdHJpeCkuXG4gICAgICovXG4gICAgaXNDYW5vbmljYWwoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/ICEhdGhpcy5iYi5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBmYWxzZTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0U3BhcnNlVGVuc29ySW5kZXhDT08oYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDQpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkSW5kaWNlc1R5cGUoYnVpbGRlciwgaW5kaWNlc1R5cGVPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgwLCBpbmRpY2VzVHlwZU9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRJbmRpY2VzU3RyaWRlcyhidWlsZGVyLCBpbmRpY2VzU3RyaWRlc09mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDEsIGluZGljZXNTdHJpZGVzT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUluZGljZXNTdHJpZGVzVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig4LCBkYXRhLmxlbmd0aCwgOCk7XG4gICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBidWlsZGVyLmFkZEludDY0KGRhdGFbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRJbmRpY2VzU3RyaWRlc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykge1xuICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA4KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZEluZGljZXNCdWZmZXIoYnVpbGRlciwgaW5kaWNlc0J1ZmZlck9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkU3RydWN0KDIsIGluZGljZXNCdWZmZXJPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkSXNDYW5vbmljYWwoYnVpbGRlciwgaXNDYW5vbmljYWwpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDgoMywgK2lzQ2Fub25pY2FsLCArZmFsc2UpO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kU3BhcnNlVGVuc29ySW5kZXhDT08oYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA0KTsgLy8gaW5kaWNlc1R5cGVcbiAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgOCk7IC8vIGluZGljZXNCdWZmZXJcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNwYXJzZS10ZW5zb3ItaW5kZXgtYy1vLW8ubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICcuL2J1ZmZlci5tanMnO1xuaW1wb3J0IHsgSW50IH0gZnJvbSAnLi9pbnQubWpzJztcbi8qKlxuICogQ29tcHJlc3NlZCBTcGFyc2UgRmliZXIgKENTRikgc3BhcnNlIHRlbnNvciBpbmRleC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNwYXJzZVRlbnNvckluZGV4Q1NGIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc1NwYXJzZVRlbnNvckluZGV4Q1NGKGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFNwYXJzZVRlbnNvckluZGV4Q1NGKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNTcGFyc2VUZW5zb3JJbmRleENTRihiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgU3BhcnNlVGVuc29ySW5kZXhDU0YoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ1NGIGlzIGEgZ2VuZXJhbGl6YXRpb24gb2YgY29tcHJlc3NlZCBzcGFyc2Ugcm93IChDU1IpIGluZGV4LlxuICAgICAqIFNlZSBbc21pdGgyMDE3a25sXShodHRwOi8vc2hhZGVuLmlvL3B1Yi1maWxlcy9zbWl0aDIwMTdrbmwucGRmKVxuICAgICAqXG4gICAgICogQ1NGIGluZGV4IHJlY3Vyc2l2ZWx5IGNvbXByZXNzZXMgZWFjaCBkaW1lbnNpb24gb2YgYSB0ZW5zb3IgaW50byBhIHNldFxuICAgICAqIG9mIHByZWZpeCB0cmVlcy4gRWFjaCBwYXRoIGZyb20gYSByb290IHRvIGxlYWYgZm9ybXMgb25lIHRlbnNvclxuICAgICAqIG5vbi16ZXJvIGluZGV4LiBDU0YgaXMgaW1wbGVtZW50ZWQgd2l0aCB0d28gYXJyYXlzIG9mIGJ1ZmZlcnMgYW5kIG9uZVxuICAgICAqIGFycmF5cyBvZiBpbnRlZ2Vycy5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlLCBsZXQgWCBiZSBhIDJ4M3g0eDUgdGVuc29yIGFuZCBsZXQgaXQgaGF2ZSB0aGUgZm9sbG93aW5nXG4gICAgICogOCBub24temVybyB2YWx1ZXM6XG4gICAgICogYGBgdGV4dFxuICAgICAqICAgWFswLCAwLCAwLCAxXSA6PSAxXG4gICAgICogICBYWzAsIDAsIDAsIDJdIDo9IDJcbiAgICAgKiAgIFhbMCwgMSwgMCwgMF0gOj0gM1xuICAgICAqICAgWFswLCAxLCAwLCAyXSA6PSA0XG4gICAgICogICBYWzAsIDEsIDEsIDBdIDo9IDVcbiAgICAgKiAgIFhbMSwgMSwgMSwgMF0gOj0gNlxuICAgICAqICAgWFsxLCAxLCAxLCAxXSA6PSA3XG4gICAgICogICBYWzEsIDEsIDEsIDJdIDo9IDhcbiAgICAgKiBgYGBcbiAgICAgKiBBcyBhIHByZWZpeCB0cmVlIHRoaXMgd291bGQgYmUgcmVwcmVzZW50ZWQgYXM6XG4gICAgICogYGBgdGV4dFxuICAgICAqICAgICAgICAgMCAgICAgICAgICAxXG4gICAgICogICAgICAgIC8gXFwgICAgICAgICB8XG4gICAgICogICAgICAgMCAgIDEgICAgICAgIDFcbiAgICAgKiAgICAgIC8gICAvIFxcICAgICAgIHxcbiAgICAgKiAgICAgMCAgIDAgICAxICAgICAgMVxuICAgICAqICAgIC98ICAvfCAgIHwgICAgL3wgfFxuICAgICAqICAgMSAyIDAgMiAgIDAgICAwIDEgMlxuICAgICAqIGBgYFxuICAgICAqIFRoZSB0eXBlIG9mIHZhbHVlcyBpbiBpbmRwdHJCdWZmZXJzXG4gICAgICovXG4gICAgaW5kcHRyVHlwZShvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBJbnQoKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIpIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogaW5kcHRyQnVmZmVycyBzdG9yZXMgdGhlIHNwYXJzaXR5IHN0cnVjdHVyZS5cbiAgICAgKiBFYWNoIHR3byBjb25zZWN1dGl2ZSBkaW1lbnNpb25zIGluIGEgdGVuc29yIGNvcnJlc3BvbmQgdG8gYSBidWZmZXIgaW5cbiAgICAgKiBpbmRwdHJCdWZmZXJzLiBBIHBhaXIgb2YgY29uc2VjdXRpdmUgdmFsdWVzIGF0IGBpbmRwdHJCdWZmZXJzW2RpbV1baV1gXG4gICAgICogYW5kIGBpbmRwdHJCdWZmZXJzW2RpbV1baSArIDFdYCBzaWduaWZ5IGEgcmFuZ2Ugb2Ygbm9kZXMgaW5cbiAgICAgKiBgaW5kaWNlc0J1ZmZlcnNbZGltICsgMV1gIHdobyBhcmUgY2hpbGRyZW4gb2YgYGluZGljZXNCdWZmZXJzW2RpbV1baV1gIG5vZGUuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZSwgdGhlIGluZHB0ckJ1ZmZlcnMgZm9yIHRoZSBhYm92ZSBYIGlzOlxuICAgICAqIGBgYHRleHRcbiAgICAgKiAgIGluZHB0ckJ1ZmZlcihYKSA9IFtcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgWzAsIDIsIDNdLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICBbMCwgMSwgMywgNF0sXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgIFswLCAyLCA0LCA1LCA4XVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgXS5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBpbmRwdHJCdWZmZXJzKGluZGV4LCBvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBCdWZmZXIoKSkuX19pbml0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiAxNiwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICBpbmRwdHJCdWZmZXJzTGVuZ3RoKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHZhbHVlcyBpbiBpbmRpY2VzQnVmZmVyc1xuICAgICAqL1xuICAgIGluZGljZXNUeXBlKG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEludCgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBpbmRpY2VzQnVmZmVycyBzdG9yZXMgdmFsdWVzIG9mIG5vZGVzLlxuICAgICAqIEVhY2ggdGVuc29yIGRpbWVuc2lvbiBjb3JyZXNwb25kcyB0byBhIGJ1ZmZlciBpbiBpbmRpY2VzQnVmZmVycy5cbiAgICAgKiBGb3IgZXhhbXBsZSwgdGhlIGluZGljZXNCdWZmZXJzIGZvciB0aGUgYWJvdmUgWCBpczpcbiAgICAgKiBgYGB0ZXh0XG4gICAgICogICBpbmRpY2VzQnVmZmVyKFgpID0gW1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgWzAsIDFdLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgWzAsIDEsIDFdLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgWzAsIDAsIDEsIDFdLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgWzEsIDIsIDAsIDIsIDAsIDAsIDEsIDJdXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgXS5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBpbmRpY2VzQnVmZmVycyhpbmRleCwgb2JqKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEJ1ZmZlcigpKS5fX2luaXQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDE2LCB0aGlzLmJiKSA6IG51bGw7XG4gICAgfVxuICAgIGluZGljZXNCdWZmZXJzTGVuZ3RoKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBheGlzT3JkZXIgc3RvcmVzIHRoZSBzZXF1ZW5jZSBpbiB3aGljaCBkaW1lbnNpb25zIHdlcmUgdHJhdmVyc2VkIHRvXG4gICAgICogcHJvZHVjZSB0aGUgcHJlZml4IHRyZWUuXG4gICAgICogRm9yIGV4YW1wbGUsIHRoZSBheGlzT3JkZXIgZm9yIHRoZSBhYm92ZSBYIGlzOlxuICAgICAqIGBgYHRleHRcbiAgICAgKiAgIGF4aXNPcmRlcihYKSA9IFswLCAxLCAyLCAzXS5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBheGlzT3JkZXIoaW5kZXgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpIDogMDtcbiAgICB9XG4gICAgYXhpc09yZGVyTGVuZ3RoKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwO1xuICAgIH1cbiAgICBheGlzT3JkZXJBcnJheSgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gbmV3IEludDMyQXJyYXkodGhpcy5iYi5ieXRlcygpLmJ1ZmZlciwgdGhpcy5iYi5ieXRlcygpLmJ5dGVPZmZzZXQgKyB0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpKSA6IG51bGw7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydFNwYXJzZVRlbnNvckluZGV4Q1NGKGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCg1KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZEluZHB0clR5cGUoYnVpbGRlciwgaW5kcHRyVHlwZU9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDAsIGluZHB0clR5cGVPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkSW5kcHRyQnVmZmVycyhidWlsZGVyLCBpbmRwdHJCdWZmZXJzT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgaW5kcHRyQnVmZmVyc09mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydEluZHB0ckJ1ZmZlcnNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydFZlY3RvcigxNiwgbnVtRWxlbXMsIDgpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkSW5kaWNlc1R5cGUoYnVpbGRlciwgaW5kaWNlc1R5cGVPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgyLCBpbmRpY2VzVHlwZU9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRJbmRpY2VzQnVmZmVycyhidWlsZGVyLCBpbmRpY2VzQnVmZmVyc09mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDMsIGluZGljZXNCdWZmZXJzT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0SW5kaWNlc0J1ZmZlcnNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydFZlY3RvcigxNiwgbnVtRWxlbXMsIDgpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkQXhpc09yZGVyKGJ1aWxkZXIsIGF4aXNPcmRlck9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDQsIGF4aXNPcmRlck9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVBeGlzT3JkZXJWZWN0b3IoYnVpbGRlciwgZGF0YSkge1xuICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGJ1aWxkZXIuYWRkSW50MzIoZGF0YVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydEF4aXNPcmRlclZlY3RvcihidWlsZGVyLCBudW1FbGVtcykge1xuICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTtcbiAgICB9XG4gICAgc3RhdGljIGVuZFNwYXJzZVRlbnNvckluZGV4Q1NGKGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNCk7IC8vIGluZHB0clR5cGVcbiAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNik7IC8vIGluZHB0ckJ1ZmZlcnNcbiAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgOCk7IC8vIGluZGljZXNUeXBlXG4gICAgICAgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDEwKTsgLy8gaW5kaWNlc0J1ZmZlcnNcbiAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgMTIpOyAvLyBheGlzT3JkZXJcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNwYXJzZS10ZW5zb3ItaW5kZXgtYy1zLWYubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgeyBTcGFyc2VNYXRyaXhJbmRleENTWCB9IGZyb20gJy4vc3BhcnNlLW1hdHJpeC1pbmRleC1jLXMteC5tanMnO1xuaW1wb3J0IHsgU3BhcnNlVGVuc29ySW5kZXhDT08gfSBmcm9tICcuL3NwYXJzZS10ZW5zb3ItaW5kZXgtYy1vLW8ubWpzJztcbmltcG9ydCB7IFNwYXJzZVRlbnNvckluZGV4Q1NGIH0gZnJvbSAnLi9zcGFyc2UtdGVuc29yLWluZGV4LWMtcy1mLm1qcyc7XG5leHBvcnQgdmFyIFNwYXJzZVRlbnNvckluZGV4O1xuKGZ1bmN0aW9uIChTcGFyc2VUZW5zb3JJbmRleCkge1xuICAgIFNwYXJzZVRlbnNvckluZGV4W1NwYXJzZVRlbnNvckluZGV4W1wiTk9ORVwiXSA9IDBdID0gXCJOT05FXCI7XG4gICAgU3BhcnNlVGVuc29ySW5kZXhbU3BhcnNlVGVuc29ySW5kZXhbXCJTcGFyc2VUZW5zb3JJbmRleENPT1wiXSA9IDFdID0gXCJTcGFyc2VUZW5zb3JJbmRleENPT1wiO1xuICAgIFNwYXJzZVRlbnNvckluZGV4W1NwYXJzZVRlbnNvckluZGV4W1wiU3BhcnNlTWF0cml4SW5kZXhDU1hcIl0gPSAyXSA9IFwiU3BhcnNlTWF0cml4SW5kZXhDU1hcIjtcbiAgICBTcGFyc2VUZW5zb3JJbmRleFtTcGFyc2VUZW5zb3JJbmRleFtcIlNwYXJzZVRlbnNvckluZGV4Q1NGXCJdID0gM10gPSBcIlNwYXJzZVRlbnNvckluZGV4Q1NGXCI7XG59KShTcGFyc2VUZW5zb3JJbmRleCB8fCAoU3BhcnNlVGVuc29ySW5kZXggPSB7fSkpO1xuZXhwb3J0IGZ1bmN0aW9uIHVuaW9uVG9TcGFyc2VUZW5zb3JJbmRleCh0eXBlLCBhY2Nlc3Nvcikge1xuICAgIHN3aXRjaCAoU3BhcnNlVGVuc29ySW5kZXhbdHlwZV0pIHtcbiAgICAgICAgY2FzZSAnTk9ORSc6IHJldHVybiBudWxsO1xuICAgICAgICBjYXNlICdTcGFyc2VUZW5zb3JJbmRleENPTyc6IHJldHVybiBhY2Nlc3NvcihuZXcgU3BhcnNlVGVuc29ySW5kZXhDT08oKSk7XG4gICAgICAgIGNhc2UgJ1NwYXJzZU1hdHJpeEluZGV4Q1NYJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBTcGFyc2VNYXRyaXhJbmRleENTWCgpKTtcbiAgICAgICAgY2FzZSAnU3BhcnNlVGVuc29ySW5kZXhDU0YnOiByZXR1cm4gYWNjZXNzb3IobmV3IFNwYXJzZVRlbnNvckluZGV4Q1NGKCkpO1xuICAgICAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gdW5pb25MaXN0VG9TcGFyc2VUZW5zb3JJbmRleCh0eXBlLCBhY2Nlc3NvciwgaW5kZXgpIHtcbiAgICBzd2l0Y2ggKFNwYXJzZVRlbnNvckluZGV4W3R5cGVdKSB7XG4gICAgICAgIGNhc2UgJ05PTkUnOiByZXR1cm4gbnVsbDtcbiAgICAgICAgY2FzZSAnU3BhcnNlVGVuc29ySW5kZXhDT08nOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBTcGFyc2VUZW5zb3JJbmRleENPTygpKTtcbiAgICAgICAgY2FzZSAnU3BhcnNlTWF0cml4SW5kZXhDU1gnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBTcGFyc2VNYXRyaXhJbmRleENTWCgpKTtcbiAgICAgICAgY2FzZSAnU3BhcnNlVGVuc29ySW5kZXhDU0YnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBTcGFyc2VUZW5zb3JJbmRleENTRigpKTtcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcGFyc2UtdGVuc29yLWluZGV4Lm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnLi9idWZmZXIubWpzJztcbmltcG9ydCB7IFNwYXJzZVRlbnNvckluZGV4IH0gZnJvbSAnLi9zcGFyc2UtdGVuc29yLWluZGV4Lm1qcyc7XG5pbXBvcnQgeyBUZW5zb3JEaW0gfSBmcm9tICcuL3RlbnNvci1kaW0ubWpzJztcbmltcG9ydCB7IFR5cGUgfSBmcm9tICcuL3R5cGUubWpzJztcbmV4cG9ydCBjbGFzcyBTcGFyc2VUZW5zb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzU3BhcnNlVGVuc29yKGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFNwYXJzZVRlbnNvcigpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzU3BhcnNlVGVuc29yKGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBTcGFyc2VUZW5zb3IoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgdHlwZVR5cGUoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkVWludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogVHlwZS5OT05FO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBkYXRhIGNvbnRhaW5lZCBpbiBhIHZhbHVlIGNlbGwuXG4gICAgICogQ3VycmVudGx5IG9ubHkgZml4ZWQtd2lkdGggdmFsdWUgdHlwZXMgYXJlIHN1cHBvcnRlZCxcbiAgICAgKiBubyBzdHJpbmdzIG9yIG5lc3RlZCB0eXBlcy5cbiAgICAgKi9cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdHlwZShvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdW5pb24ob2JqLCB0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZGltZW5zaW9ucyBvZiB0aGUgdGVuc29yLCBvcHRpb25hbGx5IG5hbWVkLlxuICAgICAqL1xuICAgIHNoYXBlKGluZGV4LCBvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBUZW5zb3JEaW0oKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIpIDogbnVsbDtcbiAgICB9XG4gICAgc2hhcGVMZW5ndGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBub24temVybyB2YWx1ZXMgaW4gYSBzcGFyc2UgdGVuc29yLlxuICAgICAqL1xuICAgIG5vblplcm9MZW5ndGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IHRoaXMuYmIuY3JlYXRlTG9uZygwLCAwKTtcbiAgICB9XG4gICAgc3BhcnNlSW5kZXhUeXBlKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRVaW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBTcGFyc2VUZW5zb3JJbmRleC5OT05FO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGFyc2UgdGVuc29yIGluZGV4XG4gICAgICovXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHNwYXJzZUluZGV4KG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdW5pb24ob2JqLCB0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbG9jYXRpb24gYW5kIHNpemUgb2YgdGhlIHRlbnNvcidzIGRhdGFcbiAgICAgKi9cbiAgICBkYXRhKG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBCdWZmZXIoKSkuX19pbml0KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB0aGlzLmJiKSA6IG51bGw7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydFNwYXJzZVRlbnNvcihidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoNyk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRUeXBlVHlwZShidWlsZGVyLCB0eXBlVHlwZSkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50OCgwLCB0eXBlVHlwZSwgVHlwZS5OT05FKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZFR5cGUoYnVpbGRlciwgdHlwZU9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDEsIHR5cGVPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkU2hhcGUoYnVpbGRlciwgc2hhcGVPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgyLCBzaGFwZU9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVTaGFwZVZlY3RvcihidWlsZGVyLCBkYXRhKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpO1xuICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydFNoYXBlVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkTm9uWmVyb0xlbmd0aChidWlsZGVyLCBub25aZXJvTGVuZ3RoKSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ2NCgzLCBub25aZXJvTGVuZ3RoLCBidWlsZGVyLmNyZWF0ZUxvbmcoMCwgMCkpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkU3BhcnNlSW5kZXhUeXBlKGJ1aWxkZXIsIHNwYXJzZUluZGV4VHlwZSkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50OCg0LCBzcGFyc2VJbmRleFR5cGUsIFNwYXJzZVRlbnNvckluZGV4Lk5PTkUpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkU3BhcnNlSW5kZXgoYnVpbGRlciwgc3BhcnNlSW5kZXhPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg1LCBzcGFyc2VJbmRleE9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGREYXRhKGJ1aWxkZXIsIGRhdGFPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZFN0cnVjdCg2LCBkYXRhT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGVuZFNwYXJzZVRlbnNvcihidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7XG4gICAgICAgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDYpOyAvLyB0eXBlXG4gICAgICAgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDgpOyAvLyBzaGFwZVxuICAgICAgICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCAxNCk7IC8vIHNwYXJzZUluZGV4XG4gICAgICAgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDE2KTsgLy8gZGF0YVxuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgZmluaXNoU3BhcnNlVGVuc29yQnVmZmVyKGJ1aWxkZXIsIG9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmZpbmlzaChvZmZzZXQpO1xuICAgIH1cbiAgICBzdGF0aWMgZmluaXNoU2l6ZVByZWZpeGVkU3BhcnNlVGVuc29yQnVmZmVyKGJ1aWxkZXIsIG9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmZpbmlzaChvZmZzZXQsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcGFyc2UtdGVuc29yLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuLyoqXG4gKiBBIFN0cnVjdF8gaW4gdGhlIGZsYXRidWZmZXIgbWV0YWRhdGEgaXMgdGhlIHNhbWUgYXMgYW4gQXJyb3cgU3RydWN0XG4gKiAoYWNjb3JkaW5nIHRvIHRoZSBwaHlzaWNhbCBtZW1vcnkgbGF5b3V0KS4gV2UgdXNlZCBTdHJ1Y3RfIGhlcmUgYXNcbiAqIFN0cnVjdCBpcyBhIHJlc2VydmVkIHdvcmQgaW4gRmxhdGJ1ZmZlcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFN0cnVjdF8ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzU3RydWN0XyhiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBTdHJ1Y3RfKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNTdHJ1Y3RfKGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBTdHJ1Y3RfKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydFN0cnVjdF8oYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDApO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kU3RydWN0XyhidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVTdHJ1Y3RfKGJ1aWxkZXIpIHtcbiAgICAgICAgU3RydWN0Xy5zdGFydFN0cnVjdF8oYnVpbGRlcik7XG4gICAgICAgIHJldHVybiBTdHJ1Y3RfLmVuZFN0cnVjdF8oYnVpbGRlcik7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJ1Y3RfLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBEYXRhIHN0cnVjdHVyZXMgZm9yIGRlbnNlIHRlbnNvcnNcbiAqIFNoYXBlIGRhdGEgZm9yIGEgc2luZ2xlIGF4aXMgaW4gYSB0ZW5zb3JcbiAqL1xuZXhwb3J0IGNsYXNzIFRlbnNvckRpbSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNUZW5zb3JEaW0oYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgVGVuc29yRGltKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNUZW5zb3JEaW0oYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFRlbnNvckRpbSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMZW5ndGggb2YgZGltZW5zaW9uXG4gICAgICovXG4gICAgc2l6ZSgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiB0aGlzLmJiLmNyZWF0ZUxvbmcoMCwgMCk7XG4gICAgfVxuICAgIG5hbWUob3B0aW9uYWxFbmNvZGluZykge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0VGVuc29yRGltKGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCgyKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZFNpemUoYnVpbGRlciwgc2l6ZSkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50NjQoMCwgc2l6ZSwgYnVpbGRlci5jcmVhdGVMb25nKDAsIDApKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZE5hbWUoYnVpbGRlciwgbmFtZU9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDEsIG5hbWVPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kVGVuc29yRGltKGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZVRlbnNvckRpbShidWlsZGVyLCBzaXplLCBuYW1lT2Zmc2V0KSB7XG4gICAgICAgIFRlbnNvckRpbS5zdGFydFRlbnNvckRpbShidWlsZGVyKTtcbiAgICAgICAgVGVuc29yRGltLmFkZFNpemUoYnVpbGRlciwgc2l6ZSk7XG4gICAgICAgIFRlbnNvckRpbS5hZGROYW1lKGJ1aWxkZXIsIG5hbWVPZmZzZXQpO1xuICAgICAgICByZXR1cm4gVGVuc29yRGltLmVuZFRlbnNvckRpbShidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRlbnNvci1kaW0ubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICcuL2J1ZmZlci5tanMnO1xuaW1wb3J0IHsgVGVuc29yRGltIH0gZnJvbSAnLi90ZW5zb3ItZGltLm1qcyc7XG5pbXBvcnQgeyBUeXBlIH0gZnJvbSAnLi90eXBlLm1qcyc7XG5leHBvcnQgY2xhc3MgVGVuc29yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc1RlbnNvcihiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBUZW5zb3IoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1RlbnNvcihiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgVGVuc29yKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHR5cGVUeXBlKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZFVpbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IFR5cGUuTk9ORTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgZGF0YSBjb250YWluZWQgaW4gYSB2YWx1ZSBjZWxsLiBDdXJyZW50bHkgb25seSBmaXhlZC13aWR0aFxuICAgICAqIHZhbHVlIHR5cGVzIGFyZSBzdXBwb3J0ZWQsIG5vIHN0cmluZ3Mgb3IgbmVzdGVkIHR5cGVzXG4gICAgICovXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHR5cGUob2JqKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3VuaW9uKG9iaiwgdGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGRpbWVuc2lvbnMgb2YgdGhlIHRlbnNvciwgb3B0aW9uYWxseSBuYW1lZFxuICAgICAqL1xuICAgIHNoYXBlKGluZGV4LCBvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBUZW5zb3JEaW0oKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCksIHRoaXMuYmIpIDogbnVsbDtcbiAgICB9XG4gICAgc2hhcGVMZW5ndGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTm9uLW5lZ2F0aXZlIGJ5dGUgb2Zmc2V0cyB0byBhZHZhbmNlIG9uZSB2YWx1ZSBjZWxsIGFsb25nIGVhY2ggZGltZW5zaW9uXG4gICAgICogSWYgb21pdHRlZCwgZGVmYXVsdCB0byByb3ctbWFqb3Igb3JkZXIgKEMtbGlrZSkuXG4gICAgICovXG4gICAgc3RyaWRlcyhpbmRleCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogOCkgOiB0aGlzLmJiLmNyZWF0ZUxvbmcoMCwgMCk7XG4gICAgfVxuICAgIHN0cmlkZXNMZW5ndGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBsb2NhdGlvbiBhbmQgc2l6ZSBvZiB0aGUgdGVuc29yJ3MgZGF0YVxuICAgICAqL1xuICAgIGRhdGEob2JqKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEJ1ZmZlcigpKS5fX2luaXQodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHRoaXMuYmIpIDogbnVsbDtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0VGVuc29yKGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCg1KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZFR5cGVUeXBlKGJ1aWxkZXIsIHR5cGVUeXBlKSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDAsIHR5cGVUeXBlLCBUeXBlLk5PTkUpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkVHlwZShidWlsZGVyLCB0eXBlT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgdHlwZU9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRTaGFwZShidWlsZGVyLCBzaGFwZU9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDIsIHNoYXBlT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZVNoYXBlVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7XG4gICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0U2hhcGVWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRTdHJpZGVzKGJ1aWxkZXIsIHN0cmlkZXNPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzLCBzdHJpZGVzT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZVN0cmlkZXNWZWN0b3IoYnVpbGRlciwgZGF0YSkge1xuICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDgsIGRhdGEubGVuZ3RoLCA4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGJ1aWxkZXIuYWRkSW50NjQoZGF0YVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydFN0cmlkZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGREYXRhKGJ1aWxkZXIsIGRhdGFPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZFN0cnVjdCg0LCBkYXRhT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGVuZFRlbnNvcihidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7XG4gICAgICAgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDYpOyAvLyB0eXBlXG4gICAgICAgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDgpOyAvLyBzaGFwZVxuICAgICAgICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCAxMik7IC8vIGRhdGFcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGZpbmlzaFRlbnNvckJ1ZmZlcihidWlsZGVyLCBvZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5maW5pc2gob2Zmc2V0KTtcbiAgICB9XG4gICAgc3RhdGljIGZpbmlzaFNpemVQcmVmaXhlZFRlbnNvckJ1ZmZlcihidWlsZGVyLCBvZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5maW5pc2gob2Zmc2V0LCB1bmRlZmluZWQsIHRydWUpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGVuc29yLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuZXhwb3J0IHZhciBUaW1lVW5pdDtcbihmdW5jdGlvbiAoVGltZVVuaXQpIHtcbiAgICBUaW1lVW5pdFtUaW1lVW5pdFtcIlNFQ09ORFwiXSA9IDBdID0gXCJTRUNPTkRcIjtcbiAgICBUaW1lVW5pdFtUaW1lVW5pdFtcIk1JTExJU0VDT05EXCJdID0gMV0gPSBcIk1JTExJU0VDT05EXCI7XG4gICAgVGltZVVuaXRbVGltZVVuaXRbXCJNSUNST1NFQ09ORFwiXSA9IDJdID0gXCJNSUNST1NFQ09ORFwiO1xuICAgIFRpbWVVbml0W1RpbWVVbml0W1wiTkFOT1NFQ09ORFwiXSA9IDNdID0gXCJOQU5PU0VDT05EXCI7XG59KShUaW1lVW5pdCB8fCAoVGltZVVuaXQgPSB7fSkpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD10aW1lLXVuaXQubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5pbXBvcnQgeyBUaW1lVW5pdCB9IGZyb20gJy4vdGltZS11bml0Lm1qcyc7XG4vKipcbiAqIFRpbWUgaXMgZWl0aGVyIGEgMzItYml0IG9yIDY0LWJpdCBzaWduZWQgaW50ZWdlciB0eXBlIHJlcHJlc2VudGluZyBhblxuICogZWxhcHNlZCB0aW1lIHNpbmNlIG1pZG5pZ2h0LCBzdG9yZWQgaW4gZWl0aGVyIG9mIGZvdXIgdW5pdHM6IHNlY29uZHMsXG4gKiBtaWxsaXNlY29uZHMsIG1pY3Jvc2Vjb25kcyBvciBuYW5vc2Vjb25kcy5cbiAqXG4gKiBUaGUgaW50ZWdlciBgYml0V2lkdGhgIGRlcGVuZHMgb24gdGhlIGB1bml0YCBhbmQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiAqICogU0VDT05EIGFuZCBNSUxMSVNFQ09ORDogMzIgYml0c1xuICogKiBNSUNST1NFQ09ORCBhbmQgTkFOT1NFQ09ORDogNjQgYml0c1xuICpcbiAqIFRoZSBhbGxvd2VkIHZhbHVlcyBhcmUgYmV0d2VlbiAwIChpbmNsdXNpdmUpIGFuZCA4NjQwMCAoPTI0KjYwKjYwKSBzZWNvbmRzXG4gKiAoZXhjbHVzaXZlKSwgYWRqdXN0ZWQgZm9yIHRoZSB0aW1lIHVuaXQgKGZvciBleGFtcGxlLCB1cCB0byA4NjQwMDAwMFxuICogZXhjbHVzaXZlIGZvciB0aGUgTUlMTElTRUNPTkQgdW5pdCkuXG4gKiBUaGlzIGRlZmluaXRpb24gZG9lc24ndCBhbGxvdyBmb3IgbGVhcCBzZWNvbmRzLiBUaW1lIHZhbHVlcyBmcm9tXG4gKiBtZWFzdXJlbWVudHMgd2l0aCBsZWFwIHNlY29uZHMgd2lsbCBuZWVkIHRvIGJlIGNvcnJlY3RlZCB3aGVuIGluZ2VzdGluZ1xuICogaW50byBBcnJvdyAoZm9yIGV4YW1wbGUgYnkgcmVwbGFjaW5nIHRoZSB2YWx1ZSA4NjQwMCB3aXRoIDg2Mzk5KS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRpbWUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzVGltZShiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBUaW1lKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNUaW1lKGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBUaW1lKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHVuaXQoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogVGltZVVuaXQuTUlMTElTRUNPTkQ7XG4gICAgfVxuICAgIGJpdFdpZHRoKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDMyO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRUaW1lKGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCgyKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZFVuaXQoYnVpbGRlciwgdW5pdCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MTYoMCwgdW5pdCwgVGltZVVuaXQuTUlMTElTRUNPTkQpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkQml0V2lkdGgoYnVpbGRlciwgYml0V2lkdGgpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDMyKDEsIGJpdFdpZHRoLCAzMik7XG4gICAgfVxuICAgIHN0YXRpYyBlbmRUaW1lKGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZVRpbWUoYnVpbGRlciwgdW5pdCwgYml0V2lkdGgpIHtcbiAgICAgICAgVGltZS5zdGFydFRpbWUoYnVpbGRlcik7XG4gICAgICAgIFRpbWUuYWRkVW5pdChidWlsZGVyLCB1bml0KTtcbiAgICAgICAgVGltZS5hZGRCaXRXaWR0aChidWlsZGVyLCBiaXRXaWR0aCk7XG4gICAgICAgIHJldHVybiBUaW1lLmVuZFRpbWUoYnVpbGRlcik7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD10aW1lLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuaW1wb3J0IHsgVGltZVVuaXQgfSBmcm9tICcuL3RpbWUtdW5pdC5tanMnO1xuLyoqXG4gKiBUaW1lc3RhbXAgaXMgYSA2NC1iaXQgc2lnbmVkIGludGVnZXIgcmVwcmVzZW50aW5nIGFuIGVsYXBzZWQgdGltZSBzaW5jZSBhXG4gKiBmaXhlZCBlcG9jaCwgc3RvcmVkIGluIGVpdGhlciBvZiBmb3VyIHVuaXRzOiBzZWNvbmRzLCBtaWxsaXNlY29uZHMsXG4gKiBtaWNyb3NlY29uZHMgb3IgbmFub3NlY29uZHMsIGFuZCBpcyBvcHRpb25hbGx5IGFubm90YXRlZCB3aXRoIGEgdGltZXpvbmUuXG4gKlxuICogVGltZXN0YW1wIHZhbHVlcyBkbyBub3QgaW5jbHVkZSBhbnkgbGVhcCBzZWNvbmRzIChpbiBvdGhlciB3b3JkcywgYWxsXG4gKiBkYXlzIGFyZSBjb25zaWRlcmVkIDg2NDAwIHNlY29uZHMgbG9uZykuXG4gKlxuICogVGltZXN0YW1wcyB3aXRoIGEgbm9uLWVtcHR5IHRpbWV6b25lXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqXG4gKiBJZiBhIFRpbWVzdGFtcCBjb2x1bW4gaGFzIGEgbm9uLWVtcHR5IHRpbWV6b25lIHZhbHVlLCBpdHMgZXBvY2ggaXNcbiAqIDE5NzAtMDEtMDEgMDA6MDA6MDAgKEphbnVhcnkgMXN0IDE5NzAsIG1pZG5pZ2h0KSBpbiB0aGUgKlVUQyogdGltZXpvbmVcbiAqICh0aGUgVW5peCBlcG9jaCksIHJlZ2FyZGxlc3Mgb2YgdGhlIFRpbWVzdGFtcCdzIG93biB0aW1lem9uZS5cbiAqXG4gKiBUaGVyZWZvcmUsIHRpbWVzdGFtcCB2YWx1ZXMgd2l0aCBhIG5vbi1lbXB0eSB0aW1lem9uZSBjb3JyZXNwb25kIHRvXG4gKiBwaHlzaWNhbCBwb2ludHMgaW4gdGltZSB0b2dldGhlciB3aXRoIHNvbWUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dFxuICogaG93IHRoZSBkYXRhIHdhcyBvYnRhaW5lZCBhbmQvb3IgaG93IHRvIGRpc3BsYXkgaXQgKHRoZSB0aW1lem9uZSkuXG4gKlxuICogICBGb3IgZXhhbXBsZSwgdGhlIHRpbWVzdGFtcCB2YWx1ZSAwIHdpdGggdGhlIHRpbWV6b25lIHN0cmluZyBcIkV1cm9wZS9QYXJpc1wiXG4gKiAgIGNvcnJlc3BvbmRzIHRvIFwiSmFudWFyeSAxc3QgMTk3MCwgMDBoMDBcIiBpbiB0aGUgVVRDIHRpbWV6b25lLCBidXQgdGhlXG4gKiAgIGFwcGxpY2F0aW9uIG1heSBwcmVmZXIgdG8gZGlzcGxheSBpdCBhcyBcIkphbnVhcnkgMXN0IDE5NzAsIDAxaDAwXCIgaW5cbiAqICAgdGhlIEV1cm9wZS9QYXJpcyB0aW1lem9uZSAod2hpY2ggaXMgdGhlIHNhbWUgcGh5c2ljYWwgcG9pbnQgaW4gdGltZSkuXG4gKlxuICogT25lIGNvbnNlcXVlbmNlIGlzIHRoYXQgdGltZXN0YW1wIHZhbHVlcyB3aXRoIGEgbm9uLWVtcHR5IHRpbWV6b25lXG4gKiBjYW4gYmUgY29tcGFyZWQgYW5kIG9yZGVyZWQgZGlyZWN0bHksIHNpbmNlIHRoZXkgYWxsIHNoYXJlIHRoZSBzYW1lXG4gKiB3ZWxsLWtub3duIHBvaW50IG9mIHJlZmVyZW5jZSAodGhlIFVuaXggZXBvY2gpLlxuICpcbiAqIFRpbWVzdGFtcHMgd2l0aCBhbiB1bnNldCAvIGVtcHR5IHRpbWV6b25lXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIElmIGEgVGltZXN0YW1wIGNvbHVtbiBoYXMgbm8gdGltZXpvbmUgdmFsdWUsIGl0cyBlcG9jaCBpc1xuICogMTk3MC0wMS0wMSAwMDowMDowMCAoSmFudWFyeSAxc3QgMTk3MCwgbWlkbmlnaHQpIGluIGFuICp1bmtub3duKiB0aW1lem9uZS5cbiAqXG4gKiBUaGVyZWZvcmUsIHRpbWVzdGFtcCB2YWx1ZXMgd2l0aG91dCBhIHRpbWV6b25lIGNhbm5vdCBiZSBtZWFuaW5nZnVsbHlcbiAqIGludGVycHJldGVkIGFzIHBoeXNpY2FsIHBvaW50cyBpbiB0aW1lLCBidXQgb25seSBhcyBjYWxlbmRhciAvIGNsb2NrXG4gKiBpbmRpY2F0aW9ucyAoXCJ3YWxsIGNsb2NrIHRpbWVcIikgaW4gYW4gdW5zcGVjaWZpZWQgdGltZXpvbmUuXG4gKlxuICogICBGb3IgZXhhbXBsZSwgdGhlIHRpbWVzdGFtcCB2YWx1ZSAwIHdpdGggYW4gZW1wdHkgdGltZXpvbmUgc3RyaW5nXG4gKiAgIGNvcnJlc3BvbmRzIHRvIFwiSmFudWFyeSAxc3QgMTk3MCwgMDBoMDBcIiBpbiBhbiB1bmtub3duIHRpbWV6b25lOiB0aGVyZVxuICogICBpcyBub3QgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGludGVycHJldCBpdCBhcyBhIHdlbGwtZGVmaW5lZCBwaHlzaWNhbFxuICogICBwb2ludCBpbiB0aW1lLlxuICpcbiAqIE9uZSBjb25zZXF1ZW5jZSBpcyB0aGF0IHRpbWVzdGFtcCB2YWx1ZXMgd2l0aG91dCBhIHRpbWV6b25lIGNhbm5vdFxuICogYmUgcmVsaWFibHkgY29tcGFyZWQgb3Igb3JkZXJlZCwgc2luY2UgdGhleSBtYXkgaGF2ZSBkaWZmZXJlbnQgcG9pbnRzIG9mXG4gKiByZWZlcmVuY2UuICBJbiBwYXJ0aWN1bGFyLCBpdCBpcyAqbm90KiBwb3NzaWJsZSB0byBpbnRlcnByZXQgYW4gdW5zZXRcbiAqIG9yIGVtcHR5IHRpbWV6b25lIGFzIHRoZSBzYW1lIGFzIFwiVVRDXCIuXG4gKlxuICogQ29udmVyc2lvbiBiZXR3ZWVuIHRpbWV6b25lc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIElmIGEgVGltZXN0YW1wIGNvbHVtbiBoYXMgYSBub24tZW1wdHkgdGltZXpvbmUsIGNoYW5naW5nIHRoZSB0aW1lem9uZVxuICogdG8gYSBkaWZmZXJlbnQgbm9uLWVtcHR5IHZhbHVlIGlzIGEgbWV0YWRhdGEtb25seSBvcGVyYXRpb246XG4gKiB0aGUgdGltZXN0YW1wIHZhbHVlcyBuZWVkIG5vdCBjaGFuZ2UgYXMgdGhlaXIgcG9pbnQgb2YgcmVmZXJlbmNlIHJlbWFpbnNcbiAqIHRoZSBzYW1lICh0aGUgVW5peCBlcG9jaCkuXG4gKlxuICogSG93ZXZlciwgaWYgYSBUaW1lc3RhbXAgY29sdW1uIGhhcyBubyB0aW1lem9uZSB2YWx1ZSwgY2hhbmdpbmcgaXQgdG8gYVxuICogbm9uLWVtcHR5IHZhbHVlIHJlcXVpcmVzIHRvIHRoaW5rIGFib3V0IHRoZSBkZXNpcmVkIHNlbWFudGljcy5cbiAqIE9uZSBwb3NzaWJpbGl0eSBpcyB0byBhc3N1bWUgdGhhdCB0aGUgb3JpZ2luYWwgdGltZXN0YW1wIHZhbHVlcyBhcmVcbiAqIHJlbGF0aXZlIHRvIHRoZSBlcG9jaCBvZiB0aGUgdGltZXpvbmUgYmVpbmcgc2V0OyB0aW1lc3RhbXAgdmFsdWVzIHNob3VsZFxuICogdGhlbiBhZGp1c3RlZCB0byB0aGUgVW5peCBlcG9jaCAoZm9yIGV4YW1wbGUsIGNoYW5naW5nIHRoZSB0aW1lem9uZSBmcm9tXG4gKiBlbXB0eSB0byBcIkV1cm9wZS9QYXJpc1wiIHdvdWxkIHJlcXVpcmUgY29udmVydGluZyB0aGUgdGltZXN0YW1wIHZhbHVlc1xuICogZnJvbSBcIkV1cm9wZS9QYXJpc1wiIHRvIFwiVVRDXCIsIHdoaWNoIHNlZW1zIGNvdW50ZXItaW50dWl0aXZlIGJ1dCBpc1xuICogbmV2ZXJ0aGVsZXNzIGNvcnJlY3QpLlxuICpcbiAqIEd1aWRlbGluZXMgZm9yIGVuY29kaW5nIGRhdGEgZnJvbSBleHRlcm5hbCBsaWJyYXJpZXNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqXG4gKiBEYXRlICYgdGltZSBsaWJyYXJpZXMgb2Z0ZW4gaGF2ZSBtdWx0aXBsZSBkaWZmZXJlbnQgZGF0YSB0eXBlcyBmb3IgdGVtcG9yYWxcbiAqIGRhdGEuIEluIG9yZGVyIHRvIGVhc2UgaW50ZXJvcGVyYWJpbGl0eSBiZXR3ZWVuIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgdGhlXG4gKiBBcnJvdyBwcm9qZWN0IGhhcyBzb21lIHJlY29tbWVuZGF0aW9ucyBmb3IgZW5jb2RpbmcgdGhlc2UgdHlwZXMgaW50byBhIFRpbWVzdGFtcFxuICogY29sdW1uLlxuICpcbiAqIEFuIFwiaW5zdGFudFwiIHJlcHJlc2VudHMgYSBwaHlzaWNhbCBwb2ludCBpbiB0aW1lIHRoYXQgaGFzIG5vIHJlbGV2YW50IHRpbWV6b25lXG4gKiAoZm9yIGV4YW1wbGUsIGFzdHJvbm9taWNhbCBkYXRhKS4gVG8gZW5jb2RlIGFuIGluc3RhbnQsIHVzZSBhIFRpbWVzdGFtcCB3aXRoXG4gKiB0aGUgdGltZXpvbmUgc3RyaW5nIHNldCB0byBcIlVUQ1wiLCBhbmQgbWFrZSBzdXJlIHRoZSBUaW1lc3RhbXAgdmFsdWVzXG4gKiBhcmUgcmVsYXRpdmUgdG8gdGhlIFVUQyBlcG9jaCAoSmFudWFyeSAxc3QgMTk3MCwgbWlkbmlnaHQpLlxuICpcbiAqIEEgXCJ6b25lZCBkYXRlLXRpbWVcIiByZXByZXNlbnRzIGEgcGh5c2ljYWwgcG9pbnQgaW4gdGltZSBhbm5vdGF0ZWQgd2l0aCBhblxuICogaW5mb3JtYXRpdmUgdGltZXpvbmUgKGZvciBleGFtcGxlLCB0aGUgdGltZXpvbmUgaW4gd2hpY2ggdGhlIGRhdGEgd2FzXG4gKiByZWNvcmRlZCkuICBUbyBlbmNvZGUgYSB6b25lZCBkYXRlLXRpbWUsIHVzZSBhIFRpbWVzdGFtcCB3aXRoIHRoZSB0aW1lem9uZVxuICogc3RyaW5nIHNldCB0byB0aGUgbmFtZSBvZiB0aGUgdGltZXpvbmUsIGFuZCBtYWtlIHN1cmUgdGhlIFRpbWVzdGFtcCB2YWx1ZXNcbiAqIGFyZSByZWxhdGl2ZSB0byB0aGUgVVRDIGVwb2NoIChKYW51YXJ5IDFzdCAxOTcwLCBtaWRuaWdodCkuXG4gKlxuICogIChUaGVyZSBpcyBzb21lIGFtYmlndWl0eSBiZXR3ZWVuIGFuIGluc3RhbnQgYW5kIGEgem9uZWQgZGF0ZS10aW1lIHdpdGggdGhlXG4gKiAgIFVUQyB0aW1lem9uZS4gIEJvdGggb2YgdGhlc2UgYXJlIHN0b3JlZCB0aGUgc2FtZSBpbiBBcnJvdy4gIFR5cGljYWxseSxcbiAqICAgdGhpcyBkaXN0aW5jdGlvbiBkb2VzIG5vdCBtYXR0ZXIuICBJZiBpdCBkb2VzLCB0aGVuIGFuIGFwcGxpY2F0aW9uIHNob3VsZFxuICogICB1c2UgY3VzdG9tIG1ldGFkYXRhIG9yIGFuIGV4dGVuc2lvbiB0eXBlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIHR3byBjYXNlcy4pXG4gKlxuICogQW4gXCJvZmZzZXQgZGF0ZS10aW1lXCIgcmVwcmVzZW50cyBhIHBoeXNpY2FsIHBvaW50IGluIHRpbWUgY29tYmluZWQgd2l0aCBhblxuICogZXhwbGljaXQgb2Zmc2V0IGZyb20gVVRDLiAgVG8gZW5jb2RlIGFuIG9mZnNldCBkYXRlLXRpbWUsIHVzZSBhIFRpbWVzdGFtcFxuICogd2l0aCB0aGUgdGltZXpvbmUgc3RyaW5nIHNldCB0byB0aGUgbnVtZXJpYyB0aW1lem9uZSBvZmZzZXQgc3RyaW5nXG4gKiAoZS5nLiBcIiswMzowMFwiKSwgYW5kIG1ha2Ugc3VyZSB0aGUgVGltZXN0YW1wIHZhbHVlcyBhcmUgcmVsYXRpdmUgdG9cbiAqIHRoZSBVVEMgZXBvY2ggKEphbnVhcnkgMXN0IDE5NzAsIG1pZG5pZ2h0KS5cbiAqXG4gKiBBIFwibmFpdmUgZGF0ZS10aW1lXCIgKGFsc28gY2FsbGVkIFwibG9jYWwgZGF0ZS10aW1lXCIgaW4gc29tZSBsaWJyYXJpZXMpXG4gKiByZXByZXNlbnRzIGEgd2FsbCBjbG9jayB0aW1lIGNvbWJpbmVkIHdpdGggYSBjYWxlbmRhciBkYXRlLCBidXQgd2l0aFxuICogbm8gaW5kaWNhdGlvbiBvZiBob3cgdG8gbWFwIHRoaXMgaW5mb3JtYXRpb24gdG8gYSBwaHlzaWNhbCBwb2ludCBpbiB0aW1lLlxuICogTmFpdmUgZGF0ZS10aW1lcyBtdXN0IGJlIGhhbmRsZWQgd2l0aCBjYXJlIGJlY2F1c2Ugb2YgdGhpcyBtaXNzaW5nXG4gKiBpbmZvcm1hdGlvbiwgYW5kIGFsc28gYmVjYXVzZSBkYXlsaWdodCBzYXZpbmcgdGltZSAoRFNUKSBtYXkgbWFrZVxuICogc29tZSB2YWx1ZXMgYW1iaWd1b3VzIG9yIG5vbi1leGlzdGVudC4gQSBuYWl2ZSBkYXRlLXRpbWUgbWF5IGJlXG4gKiBzdG9yZWQgYXMgYSBzdHJ1Y3Qgd2l0aCBEYXRlIGFuZCBUaW1lIGZpZWxkcy4gSG93ZXZlciwgaXQgbWF5IGFsc28gYmVcbiAqIGVuY29kZWQgaW50byBhIFRpbWVzdGFtcCBjb2x1bW4gd2l0aCBhbiBlbXB0eSB0aW1lem9uZS4gVGhlIHRpbWVzdGFtcFxuICogdmFsdWVzIHNob3VsZCBiZSBjb21wdXRlZCBcImFzIGlmXCIgdGhlIHRpbWV6b25lIG9mIHRoZSBkYXRlLXRpbWUgdmFsdWVzXG4gKiB3YXMgVVRDOyBmb3IgZXhhbXBsZSwgdGhlIG5haXZlIGRhdGUtdGltZSBcIkphbnVhcnkgMXN0IDE5NzAsIDAwaDAwXCIgd291bGRcbiAqIGJlIGVuY29kZWQgYXMgdGltZXN0YW1wIHZhbHVlIDAuXG4gKi9cbmV4cG9ydCBjbGFzcyBUaW1lc3RhbXAge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzVGltZXN0YW1wKGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFRpbWVzdGFtcCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzVGltZXN0YW1wKGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBUaW1lc3RhbXAoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgdW5pdCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBUaW1lVW5pdC5TRUNPTkQ7XG4gICAgfVxuICAgIHRpbWV6b25lKG9wdGlvbmFsRW5jb2RpbmcpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydFRpbWVzdGFtcChidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMik7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRVbml0KGJ1aWxkZXIsIHVuaXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDE2KDAsIHVuaXQsIFRpbWVVbml0LlNFQ09ORCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRUaW1lem9uZShidWlsZGVyLCB0aW1lem9uZU9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDEsIHRpbWV6b25lT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGVuZFRpbWVzdGFtcChidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVUaW1lc3RhbXAoYnVpbGRlciwgdW5pdCwgdGltZXpvbmVPZmZzZXQpIHtcbiAgICAgICAgVGltZXN0YW1wLnN0YXJ0VGltZXN0YW1wKGJ1aWxkZXIpO1xuICAgICAgICBUaW1lc3RhbXAuYWRkVW5pdChidWlsZGVyLCB1bml0KTtcbiAgICAgICAgVGltZXN0YW1wLmFkZFRpbWV6b25lKGJ1aWxkZXIsIHRpbWV6b25lT2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIFRpbWVzdGFtcC5lbmRUaW1lc3RhbXAoYnVpbGRlcik7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD10aW1lc3RhbXAubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgeyBCaW5hcnkgfSBmcm9tICcuL2JpbmFyeS5tanMnO1xuaW1wb3J0IHsgQm9vbCB9IGZyb20gJy4vYm9vbC5tanMnO1xuaW1wb3J0IHsgRGF0ZSB9IGZyb20gJy4vZGF0ZS5tanMnO1xuaW1wb3J0IHsgRGVjaW1hbCB9IGZyb20gJy4vZGVjaW1hbC5tanMnO1xuaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tICcuL2R1cmF0aW9uLm1qcyc7XG5pbXBvcnQgeyBGaXhlZFNpemVCaW5hcnkgfSBmcm9tICcuL2ZpeGVkLXNpemUtYmluYXJ5Lm1qcyc7XG5pbXBvcnQgeyBGaXhlZFNpemVMaXN0IH0gZnJvbSAnLi9maXhlZC1zaXplLWxpc3QubWpzJztcbmltcG9ydCB7IEZsb2F0aW5nUG9pbnQgfSBmcm9tICcuL2Zsb2F0aW5nLXBvaW50Lm1qcyc7XG5pbXBvcnQgeyBJbnQgfSBmcm9tICcuL2ludC5tanMnO1xuaW1wb3J0IHsgSW50ZXJ2YWwgfSBmcm9tICcuL2ludGVydmFsLm1qcyc7XG5pbXBvcnQgeyBMYXJnZUJpbmFyeSB9IGZyb20gJy4vbGFyZ2UtYmluYXJ5Lm1qcyc7XG5pbXBvcnQgeyBMYXJnZUxpc3QgfSBmcm9tICcuL2xhcmdlLWxpc3QubWpzJztcbmltcG9ydCB7IExhcmdlVXRmOCB9IGZyb20gJy4vbGFyZ2UtdXRmOC5tanMnO1xuaW1wb3J0IHsgTGlzdCB9IGZyb20gJy4vbGlzdC5tanMnO1xuaW1wb3J0IHsgTWFwIH0gZnJvbSAnLi9tYXAubWpzJztcbmltcG9ydCB7IE51bGwgfSBmcm9tICcuL251bGwubWpzJztcbmltcG9ydCB7IFN0cnVjdF8gfSBmcm9tICcuL3N0cnVjdF8ubWpzJztcbmltcG9ydCB7IFRpbWUgfSBmcm9tICcuL3RpbWUubWpzJztcbmltcG9ydCB7IFRpbWVzdGFtcCB9IGZyb20gJy4vdGltZXN0YW1wLm1qcyc7XG5pbXBvcnQgeyBVbmlvbiB9IGZyb20gJy4vdW5pb24ubWpzJztcbmltcG9ydCB7IFV0ZjggfSBmcm9tICcuL3V0ZjgubWpzJztcbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogVG9wLWxldmVsIFR5cGUgdmFsdWUsIGVuYWJsaW5nIGV4dGVuc2libGUgdHlwZS1zcGVjaWZpYyBtZXRhZGF0YS4gV2UgY2FuXG4gKiBhZGQgbmV3IGxvZ2ljYWwgdHlwZXMgdG8gVHlwZSB3aXRob3V0IGJyZWFraW5nIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gKi9cbmV4cG9ydCB2YXIgVHlwZTtcbihmdW5jdGlvbiAoVHlwZSkge1xuICAgIFR5cGVbVHlwZVtcIk5PTkVcIl0gPSAwXSA9IFwiTk9ORVwiO1xuICAgIFR5cGVbVHlwZVtcIk51bGxcIl0gPSAxXSA9IFwiTnVsbFwiO1xuICAgIFR5cGVbVHlwZVtcIkludFwiXSA9IDJdID0gXCJJbnRcIjtcbiAgICBUeXBlW1R5cGVbXCJGbG9hdGluZ1BvaW50XCJdID0gM10gPSBcIkZsb2F0aW5nUG9pbnRcIjtcbiAgICBUeXBlW1R5cGVbXCJCaW5hcnlcIl0gPSA0XSA9IFwiQmluYXJ5XCI7XG4gICAgVHlwZVtUeXBlW1wiVXRmOFwiXSA9IDVdID0gXCJVdGY4XCI7XG4gICAgVHlwZVtUeXBlW1wiQm9vbFwiXSA9IDZdID0gXCJCb29sXCI7XG4gICAgVHlwZVtUeXBlW1wiRGVjaW1hbFwiXSA9IDddID0gXCJEZWNpbWFsXCI7XG4gICAgVHlwZVtUeXBlW1wiRGF0ZVwiXSA9IDhdID0gXCJEYXRlXCI7XG4gICAgVHlwZVtUeXBlW1wiVGltZVwiXSA9IDldID0gXCJUaW1lXCI7XG4gICAgVHlwZVtUeXBlW1wiVGltZXN0YW1wXCJdID0gMTBdID0gXCJUaW1lc3RhbXBcIjtcbiAgICBUeXBlW1R5cGVbXCJJbnRlcnZhbFwiXSA9IDExXSA9IFwiSW50ZXJ2YWxcIjtcbiAgICBUeXBlW1R5cGVbXCJMaXN0XCJdID0gMTJdID0gXCJMaXN0XCI7XG4gICAgVHlwZVtUeXBlW1wiU3RydWN0X1wiXSA9IDEzXSA9IFwiU3RydWN0X1wiO1xuICAgIFR5cGVbVHlwZVtcIlVuaW9uXCJdID0gMTRdID0gXCJVbmlvblwiO1xuICAgIFR5cGVbVHlwZVtcIkZpeGVkU2l6ZUJpbmFyeVwiXSA9IDE1XSA9IFwiRml4ZWRTaXplQmluYXJ5XCI7XG4gICAgVHlwZVtUeXBlW1wiRml4ZWRTaXplTGlzdFwiXSA9IDE2XSA9IFwiRml4ZWRTaXplTGlzdFwiO1xuICAgIFR5cGVbVHlwZVtcIk1hcFwiXSA9IDE3XSA9IFwiTWFwXCI7XG4gICAgVHlwZVtUeXBlW1wiRHVyYXRpb25cIl0gPSAxOF0gPSBcIkR1cmF0aW9uXCI7XG4gICAgVHlwZVtUeXBlW1wiTGFyZ2VCaW5hcnlcIl0gPSAxOV0gPSBcIkxhcmdlQmluYXJ5XCI7XG4gICAgVHlwZVtUeXBlW1wiTGFyZ2VVdGY4XCJdID0gMjBdID0gXCJMYXJnZVV0ZjhcIjtcbiAgICBUeXBlW1R5cGVbXCJMYXJnZUxpc3RcIl0gPSAyMV0gPSBcIkxhcmdlTGlzdFwiO1xufSkoVHlwZSB8fCAoVHlwZSA9IHt9KSk7XG5leHBvcnQgZnVuY3Rpb24gdW5pb25Ub1R5cGUodHlwZSwgYWNjZXNzb3IpIHtcbiAgICBzd2l0Y2ggKFR5cGVbdHlwZV0pIHtcbiAgICAgICAgY2FzZSAnTk9ORSc6IHJldHVybiBudWxsO1xuICAgICAgICBjYXNlICdOdWxsJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBOdWxsKCkpO1xuICAgICAgICBjYXNlICdJbnQnOiByZXR1cm4gYWNjZXNzb3IobmV3IEludCgpKTtcbiAgICAgICAgY2FzZSAnRmxvYXRpbmdQb2ludCc6IHJldHVybiBhY2Nlc3NvcihuZXcgRmxvYXRpbmdQb2ludCgpKTtcbiAgICAgICAgY2FzZSAnQmluYXJ5JzogcmV0dXJuIGFjY2Vzc29yKG5ldyBCaW5hcnkoKSk7XG4gICAgICAgIGNhc2UgJ1V0ZjgnOiByZXR1cm4gYWNjZXNzb3IobmV3IFV0ZjgoKSk7XG4gICAgICAgIGNhc2UgJ0Jvb2wnOiByZXR1cm4gYWNjZXNzb3IobmV3IEJvb2woKSk7XG4gICAgICAgIGNhc2UgJ0RlY2ltYWwnOiByZXR1cm4gYWNjZXNzb3IobmV3IERlY2ltYWwoKSk7XG4gICAgICAgIGNhc2UgJ0RhdGUnOiByZXR1cm4gYWNjZXNzb3IobmV3IERhdGUoKSk7XG4gICAgICAgIGNhc2UgJ1RpbWUnOiByZXR1cm4gYWNjZXNzb3IobmV3IFRpbWUoKSk7XG4gICAgICAgIGNhc2UgJ1RpbWVzdGFtcCc6IHJldHVybiBhY2Nlc3NvcihuZXcgVGltZXN0YW1wKCkpO1xuICAgICAgICBjYXNlICdJbnRlcnZhbCc6IHJldHVybiBhY2Nlc3NvcihuZXcgSW50ZXJ2YWwoKSk7XG4gICAgICAgIGNhc2UgJ0xpc3QnOiByZXR1cm4gYWNjZXNzb3IobmV3IExpc3QoKSk7XG4gICAgICAgIGNhc2UgJ1N0cnVjdF8nOiByZXR1cm4gYWNjZXNzb3IobmV3IFN0cnVjdF8oKSk7XG4gICAgICAgIGNhc2UgJ1VuaW9uJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBVbmlvbigpKTtcbiAgICAgICAgY2FzZSAnRml4ZWRTaXplQmluYXJ5JzogcmV0dXJuIGFjY2Vzc29yKG5ldyBGaXhlZFNpemVCaW5hcnkoKSk7XG4gICAgICAgIGNhc2UgJ0ZpeGVkU2l6ZUxpc3QnOiByZXR1cm4gYWNjZXNzb3IobmV3IEZpeGVkU2l6ZUxpc3QoKSk7XG4gICAgICAgIGNhc2UgJ01hcCc6IHJldHVybiBhY2Nlc3NvcihuZXcgTWFwKCkpO1xuICAgICAgICBjYXNlICdEdXJhdGlvbic6IHJldHVybiBhY2Nlc3NvcihuZXcgRHVyYXRpb24oKSk7XG4gICAgICAgIGNhc2UgJ0xhcmdlQmluYXJ5JzogcmV0dXJuIGFjY2Vzc29yKG5ldyBMYXJnZUJpbmFyeSgpKTtcbiAgICAgICAgY2FzZSAnTGFyZ2VVdGY4JzogcmV0dXJuIGFjY2Vzc29yKG5ldyBMYXJnZVV0ZjgoKSk7XG4gICAgICAgIGNhc2UgJ0xhcmdlTGlzdCc6IHJldHVybiBhY2Nlc3NvcihuZXcgTGFyZ2VMaXN0KCkpO1xuICAgICAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gdW5pb25MaXN0VG9UeXBlKHR5cGUsIGFjY2Vzc29yLCBpbmRleCkge1xuICAgIHN3aXRjaCAoVHlwZVt0eXBlXSkge1xuICAgICAgICBjYXNlICdOT05FJzogcmV0dXJuIG51bGw7XG4gICAgICAgIGNhc2UgJ051bGwnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBOdWxsKCkpO1xuICAgICAgICBjYXNlICdJbnQnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBJbnQoKSk7XG4gICAgICAgIGNhc2UgJ0Zsb2F0aW5nUG9pbnQnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBGbG9hdGluZ1BvaW50KCkpO1xuICAgICAgICBjYXNlICdCaW5hcnknOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBCaW5hcnkoKSk7XG4gICAgICAgIGNhc2UgJ1V0ZjgnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBVdGY4KCkpO1xuICAgICAgICBjYXNlICdCb29sJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgQm9vbCgpKTtcbiAgICAgICAgY2FzZSAnRGVjaW1hbCc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IERlY2ltYWwoKSk7XG4gICAgICAgIGNhc2UgJ0RhdGUnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBEYXRlKCkpO1xuICAgICAgICBjYXNlICdUaW1lJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgVGltZSgpKTtcbiAgICAgICAgY2FzZSAnVGltZXN0YW1wJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgVGltZXN0YW1wKCkpO1xuICAgICAgICBjYXNlICdJbnRlcnZhbCc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IEludGVydmFsKCkpO1xuICAgICAgICBjYXNlICdMaXN0JzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgTGlzdCgpKTtcbiAgICAgICAgY2FzZSAnU3RydWN0Xyc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IFN0cnVjdF8oKSk7XG4gICAgICAgIGNhc2UgJ1VuaW9uJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgVW5pb24oKSk7XG4gICAgICAgIGNhc2UgJ0ZpeGVkU2l6ZUJpbmFyeSc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IEZpeGVkU2l6ZUJpbmFyeSgpKTtcbiAgICAgICAgY2FzZSAnRml4ZWRTaXplTGlzdCc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IEZpeGVkU2l6ZUxpc3QoKSk7XG4gICAgICAgIGNhc2UgJ01hcCc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IE1hcCgpKTtcbiAgICAgICAgY2FzZSAnRHVyYXRpb24nOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBEdXJhdGlvbigpKTtcbiAgICAgICAgY2FzZSAnTGFyZ2VCaW5hcnknOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBMYXJnZUJpbmFyeSgpKTtcbiAgICAgICAgY2FzZSAnTGFyZ2VVdGY4JzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgTGFyZ2VVdGY4KCkpO1xuICAgICAgICBjYXNlICdMYXJnZUxpc3QnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBMYXJnZUxpc3QoKSk7XG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZS5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmV4cG9ydCB2YXIgVW5pb25Nb2RlO1xuKGZ1bmN0aW9uIChVbmlvbk1vZGUpIHtcbiAgICBVbmlvbk1vZGVbVW5pb25Nb2RlW1wiU3BhcnNlXCJdID0gMF0gPSBcIlNwYXJzZVwiO1xuICAgIFVuaW9uTW9kZVtVbmlvbk1vZGVbXCJEZW5zZVwiXSA9IDFdID0gXCJEZW5zZVwiO1xufSkoVW5pb25Nb2RlIHx8IChVbmlvbk1vZGUgPSB7fSkpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD11bmlvbi1tb2RlLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuaW1wb3J0IHsgVW5pb25Nb2RlIH0gZnJvbSAnLi91bmlvbi1tb2RlLm1qcyc7XG4vKipcbiAqIEEgdW5pb24gaXMgYSBjb21wbGV4IHR5cGUgd2l0aCBjaGlsZHJlbiBpbiBGaWVsZFxuICogQnkgZGVmYXVsdCBpZHMgaW4gdGhlIHR5cGUgdmVjdG9yIHJlZmVyIHRvIHRoZSBvZmZzZXRzIGluIHRoZSBjaGlsZHJlblxuICogb3B0aW9uYWxseSB0eXBlSWRzIHByb3ZpZGVzIGFuIGluZGlyZWN0aW9uIGJldHdlZW4gdGhlIGNoaWxkIG9mZnNldCBhbmQgdGhlIHR5cGUgaWRcbiAqIGZvciBlYWNoIGNoaWxkIGB0eXBlSWRzW29mZnNldF1gIGlzIHRoZSBpZCB1c2VkIGluIHRoZSB0eXBlIHZlY3RvclxuICovXG5leHBvcnQgY2xhc3MgVW5pb24ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzVW5pb24oYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgVW5pb24oKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1VuaW9uKGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBVbmlvbigpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBtb2RlKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IFVuaW9uTW9kZS5TcGFyc2U7XG4gICAgfVxuICAgIHR5cGVJZHMoaW5kZXgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCkgOiAwO1xuICAgIH1cbiAgICB0eXBlSWRzTGVuZ3RoKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7XG4gICAgfVxuICAgIHR5cGVJZHNBcnJheSgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyBuZXcgSW50MzJBcnJheSh0aGlzLmJiLmJ5dGVzKCkuYnVmZmVyLCB0aGlzLmJiLmJ5dGVzKCkuYnl0ZU9mZnNldCArIHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkpIDogbnVsbDtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0VW5pb24oYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDIpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkTW9kZShidWlsZGVyLCBtb2RlKSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQxNigwLCBtb2RlLCBVbmlvbk1vZGUuU3BhcnNlKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZFR5cGVJZHMoYnVpbGRlciwgdHlwZUlkc09mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDEsIHR5cGVJZHNPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlVHlwZUlkc1ZlY3RvcihidWlsZGVyLCBkYXRhKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpO1xuICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgYnVpbGRlci5hZGRJbnQzMihkYXRhW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0VHlwZUlkc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykge1xuICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTtcbiAgICB9XG4gICAgc3RhdGljIGVuZFVuaW9uKGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZVVuaW9uKGJ1aWxkZXIsIG1vZGUsIHR5cGVJZHNPZmZzZXQpIHtcbiAgICAgICAgVW5pb24uc3RhcnRVbmlvbihidWlsZGVyKTtcbiAgICAgICAgVW5pb24uYWRkTW9kZShidWlsZGVyLCBtb2RlKTtcbiAgICAgICAgVW5pb24uYWRkVHlwZUlkcyhidWlsZGVyLCB0eXBlSWRzT2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIFVuaW9uLmVuZFVuaW9uKGJ1aWxkZXIpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5pb24ubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG4vKipcbiAqIFVuaWNvZGUgd2l0aCBVVEYtOCBlbmNvZGluZ1xuICovXG5leHBvcnQgY2xhc3MgVXRmOCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNVdGY4KGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFV0ZjgoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1V0ZjgoYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFV0ZjgoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0VXRmOChidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmRVdGY4KGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZVV0ZjgoYnVpbGRlcikge1xuICAgICAgICBVdGY4LnN0YXJ0VXRmOChidWlsZGVyKTtcbiAgICAgICAgcmV0dXJuIFV0ZjguZW5kVXRmOChidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0ZjgubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBfX2FzeW5jR2VuZXJhdG9yLCBfX2F3YWl0LCBfX2F3YWl0ZXIgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IHRvVWludDhBcnJheSwgam9pblVpbnQ4QXJyYXlzLCB0b1VpbnQ4QXJyYXlJdGVyYXRvciwgdG9VaW50OEFycmF5QXN5bmNJdGVyYXRvciB9IGZyb20gJy4uL3V0aWwvYnVmZmVyLm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGRlZmF1bHQge1xuICAgIGZyb21JdGVyYWJsZShzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHB1bXAoZnJvbUl0ZXJhYmxlKHNvdXJjZSkpO1xuICAgIH0sXG4gICAgZnJvbUFzeW5jSXRlcmFibGUoc291cmNlKSB7XG4gICAgICAgIHJldHVybiBwdW1wKGZyb21Bc3luY0l0ZXJhYmxlKHNvdXJjZSkpO1xuICAgIH0sXG4gICAgZnJvbURPTVN0cmVhbShzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHB1bXAoZnJvbURPTVN0cmVhbShzb3VyY2UpKTtcbiAgICB9LFxuICAgIGZyb21Ob2RlU3RyZWFtKHN0cmVhbSkge1xuICAgICAgICByZXR1cm4gcHVtcChmcm9tTm9kZVN0cmVhbShzdHJlYW0pKTtcbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0b0RPTVN0cmVhbShzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcInRvRE9NU3RyZWFtXCIgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50YCk7XG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdG9Ob2RlU3RyZWFtKHNvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwidG9Ob2RlU3RyZWFtXCIgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50YCk7XG4gICAgfSxcbn07XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgcHVtcCA9IChpdGVyYXRvcikgPT4geyBpdGVyYXRvci5uZXh0KCk7IHJldHVybiBpdGVyYXRvcjsgfTtcbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiogZnJvbUl0ZXJhYmxlKHNvdXJjZSkge1xuICAgIGxldCBkb25lLCB0aHJldyA9IGZhbHNlO1xuICAgIGxldCBidWZmZXJzID0gW10sIGJ1ZmZlcjtcbiAgICBsZXQgY21kLCBzaXplLCBidWZmZXJMZW5ndGggPSAwO1xuICAgIGZ1bmN0aW9uIGJ5dGVSYW5nZSgpIHtcbiAgICAgICAgaWYgKGNtZCA9PT0gJ3BlZWsnKSB7XG4gICAgICAgICAgICByZXR1cm4gam9pblVpbnQ4QXJyYXlzKGJ1ZmZlcnMsIHNpemUpWzBdO1xuICAgICAgICB9XG4gICAgICAgIFtidWZmZXIsIGJ1ZmZlcnMsIGJ1ZmZlckxlbmd0aF0gPSBqb2luVWludDhBcnJheXMoYnVmZmVycywgc2l6ZSk7XG4gICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfVxuICAgIC8vIFlpZWxkIHNvIHRoZSBjYWxsZXIgY2FuIGluamVjdCB0aGUgcmVhZCBjb21tYW5kIGJlZm9yZSBjcmVhdGluZyB0aGUgc291cmNlIEl0ZXJhdG9yXG4gICAgKHsgY21kLCBzaXplIH0gPSB5aWVsZCBudWxsKTtcbiAgICAvLyBpbml0aWFsaXplIHRoZSBpdGVyYXRvclxuICAgIGNvbnN0IGl0ID0gdG9VaW50OEFycmF5SXRlcmF0b3Ioc291cmNlKVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgdHJ5IHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgLy8gcmVhZCB0aGUgbmV4dCB2YWx1ZVxuICAgICAgICAgICAgKHsgZG9uZSwgdmFsdWU6IGJ1ZmZlciB9ID0gTnVtYmVyLmlzTmFOKHNpemUgLSBidWZmZXJMZW5ndGgpID9cbiAgICAgICAgICAgICAgICBpdC5uZXh0KCkgOiBpdC5uZXh0KHNpemUgLSBidWZmZXJMZW5ndGgpKTtcbiAgICAgICAgICAgIC8vIGlmIGNodW5rIGlzIG5vdCBudWxsIG9yIGVtcHR5LCBwdXNoIGl0IG9udG8gdGhlIHF1ZXVlXG4gICAgICAgICAgICBpZiAoIWRvbmUgJiYgYnVmZmVyLmJ5dGVMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVycy5wdXNoKGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgYnVmZmVyTGVuZ3RoICs9IGJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBlbm91Z2ggYnl0ZXMgaW4gb3VyIGJ1ZmZlciwgeWllbGQgY2h1bmtzIHVudGlsIHdlIGRvbid0XG4gICAgICAgICAgICBpZiAoZG9uZSB8fCBzaXplIDw9IGJ1ZmZlckxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgKHsgY21kLCBzaXplIH0gPSB5aWVsZCBieXRlUmFuZ2UoKSk7XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAoc2l6ZSA8IGJ1ZmZlckxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKCFkb25lKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgKHRocmV3ID0gdHJ1ZSkgJiYgKHR5cGVvZiBpdC50aHJvdyA9PT0gJ2Z1bmN0aW9uJykgJiYgKGl0LnRocm93KGUpKTtcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICAgICh0aHJldyA9PT0gZmFsc2UpICYmICh0eXBlb2YgaXQucmV0dXJuID09PSAnZnVuY3Rpb24nKSAmJiAoaXQucmV0dXJuKG51bGwpKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZnJvbUFzeW5jSXRlcmFibGUoc291cmNlKSB7XG4gICAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogZnJvbUFzeW5jSXRlcmFibGVfMSgpIHtcbiAgICAgICAgbGV0IGRvbmUsIHRocmV3ID0gZmFsc2U7XG4gICAgICAgIGxldCBidWZmZXJzID0gW10sIGJ1ZmZlcjtcbiAgICAgICAgbGV0IGNtZCwgc2l6ZSwgYnVmZmVyTGVuZ3RoID0gMDtcbiAgICAgICAgZnVuY3Rpb24gYnl0ZVJhbmdlKCkge1xuICAgICAgICAgICAgaWYgKGNtZCA9PT0gJ3BlZWsnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGpvaW5VaW50OEFycmF5cyhidWZmZXJzLCBzaXplKVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFtidWZmZXIsIGJ1ZmZlcnMsIGJ1ZmZlckxlbmd0aF0gPSBqb2luVWludDhBcnJheXMoYnVmZmVycywgc2l6ZSk7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIC8vIFlpZWxkIHNvIHRoZSBjYWxsZXIgY2FuIGluamVjdCB0aGUgcmVhZCBjb21tYW5kIGJlZm9yZSBjcmVhdGluZyB0aGUgc291cmNlIEFzeW5jSXRlcmF0b3JcbiAgICAgICAgKHsgY21kLCBzaXplIH0gPSAoeWllbGQgeWllbGQgX19hd2FpdChudWxsKSkpO1xuICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBpdGVyYXRvclxuICAgICAgICBjb25zdCBpdCA9IHRvVWludDhBcnJheUFzeW5jSXRlcmF0b3Ioc291cmNlKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAvLyByZWFkIHRoZSBuZXh0IHZhbHVlXG4gICAgICAgICAgICAgICAgKHsgZG9uZSwgdmFsdWU6IGJ1ZmZlciB9ID0gTnVtYmVyLmlzTmFOKHNpemUgLSBidWZmZXJMZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgID8geWllbGQgX19hd2FpdChpdC5uZXh0KCkpXG4gICAgICAgICAgICAgICAgICAgIDogeWllbGQgX19hd2FpdChpdC5uZXh0KHNpemUgLSBidWZmZXJMZW5ndGgpKSk7XG4gICAgICAgICAgICAgICAgLy8gaWYgY2h1bmsgaXMgbm90IG51bGwgb3IgZW1wdHksIHB1c2ggaXQgb250byB0aGUgcXVldWVcbiAgICAgICAgICAgICAgICBpZiAoIWRvbmUgJiYgYnVmZmVyLmJ5dGVMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnMucHVzaChidWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICBidWZmZXJMZW5ndGggKz0gYnVmZmVyLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgZW5vdWdoIGJ5dGVzIGluIG91ciBidWZmZXIsIHlpZWxkIGNodW5rcyB1bnRpbCB3ZSBkb24ndFxuICAgICAgICAgICAgICAgIGlmIChkb25lIHx8IHNpemUgPD0gYnVmZmVyTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICh7IGNtZCwgc2l6ZSB9ID0geWllbGQgeWllbGQgX19hd2FpdChieXRlUmFuZ2UoKSkpO1xuICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChzaXplIDwgYnVmZmVyTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlICghZG9uZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICh0aHJldyA9IHRydWUpICYmICh0eXBlb2YgaXQudGhyb3cgPT09ICdmdW5jdGlvbicpICYmICh5aWVsZCBfX2F3YWl0KGl0LnRocm93KGUpKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAodGhyZXcgPT09IGZhbHNlKSAmJiAodHlwZW9mIGl0LnJldHVybiA9PT0gJ2Z1bmN0aW9uJykgJiYgKHlpZWxkIF9fYXdhaXQoaXQucmV0dXJuKG5ldyBVaW50OEFycmF5KDApKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5aWVsZCBfX2F3YWl0KG51bGwpO1xuICAgIH0pO1xufVxuLy8gQWxsIHRoaXMgbWFudWFsIFVpbnQ4QXJyYXkgY2h1bmsgbWFuYWdlbWVudCBjYW4gYmUgYXZvaWRlZCBpZi93aGVuIGVuZ2luZXNcbi8vIGFkZCBzdXBwb3J0IGZvciBBcnJheUJ1ZmZlci50cmFuc2ZlcigpIG9yIEFycmF5QnVmZmVyLnByb3RvdHlwZS5yZWFsbG9jKCk6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZG9tZW5pYy9wcm9wb3NhbC1hcnJheWJ1ZmZlci10cmFuc2ZlclxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGZyb21ET01TdHJlYW0oc291cmNlKSB7XG4gICAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogZnJvbURPTVN0cmVhbV8xKCkge1xuICAgICAgICBsZXQgZG9uZSA9IGZhbHNlLCB0aHJldyA9IGZhbHNlO1xuICAgICAgICBsZXQgYnVmZmVycyA9IFtdLCBidWZmZXI7XG4gICAgICAgIGxldCBjbWQsIHNpemUsIGJ1ZmZlckxlbmd0aCA9IDA7XG4gICAgICAgIGZ1bmN0aW9uIGJ5dGVSYW5nZSgpIHtcbiAgICAgICAgICAgIGlmIChjbWQgPT09ICdwZWVrJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBqb2luVWludDhBcnJheXMoYnVmZmVycywgc2l6ZSlbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBbYnVmZmVyLCBidWZmZXJzLCBidWZmZXJMZW5ndGhdID0gam9pblVpbnQ4QXJyYXlzKGJ1ZmZlcnMsIHNpemUpO1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBZaWVsZCBzbyB0aGUgY2FsbGVyIGNhbiBpbmplY3QgdGhlIHJlYWQgY29tbWFuZCBiZWZvcmUgd2UgZXN0YWJsaXNoIHRoZSBSZWFkYWJsZVN0cmVhbSBsb2NrXG4gICAgICAgICh7IGNtZCwgc2l6ZSB9ID0geWllbGQgeWllbGQgX19hd2FpdChudWxsKSk7XG4gICAgICAgIC8vIGluaXRpYWxpemUgdGhlIHJlYWRlciBhbmQgbG9jayB0aGUgc3RyZWFtXG4gICAgICAgIGNvbnN0IGl0ID0gbmV3IEFkYXB0aXZlQnl0ZVJlYWRlcihzb3VyY2UpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIC8vIHJlYWQgdGhlIG5leHQgdmFsdWVcbiAgICAgICAgICAgICAgICAoeyBkb25lLCB2YWx1ZTogYnVmZmVyIH0gPSBOdW1iZXIuaXNOYU4oc2l6ZSAtIGJ1ZmZlckxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgPyB5aWVsZCBfX2F3YWl0KGl0WydyZWFkJ10oKSlcbiAgICAgICAgICAgICAgICAgICAgOiB5aWVsZCBfX2F3YWl0KGl0WydyZWFkJ10oc2l6ZSAtIGJ1ZmZlckxlbmd0aCkpKTtcbiAgICAgICAgICAgICAgICAvLyBpZiBjaHVuayBpcyBub3QgbnVsbCBvciBlbXB0eSwgcHVzaCBpdCBvbnRvIHRoZSBxdWV1ZVxuICAgICAgICAgICAgICAgIGlmICghZG9uZSAmJiBidWZmZXIuYnl0ZUxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVycy5wdXNoKHRvVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyTGVuZ3RoICs9IGJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGVub3VnaCBieXRlcyBpbiBvdXIgYnVmZmVyLCB5aWVsZCBjaHVua3MgdW50aWwgd2UgZG9uJ3RcbiAgICAgICAgICAgICAgICBpZiAoZG9uZSB8fCBzaXplIDw9IGJ1ZmZlckxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAoeyBjbWQsIHNpemUgfSA9IHlpZWxkIHlpZWxkIF9fYXdhaXQoYnl0ZVJhbmdlKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoc2l6ZSA8IGJ1ZmZlckxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAoIWRvbmUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAodGhyZXcgPSB0cnVlKSAmJiAoeWllbGQgX19hd2FpdChpdFsnY2FuY2VsJ10oZSkpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICh0aHJldyA9PT0gZmFsc2UpID8gKHlpZWxkIF9fYXdhaXQoaXRbJ2NhbmNlbCddKCkpKVxuICAgICAgICAgICAgICAgIDogc291cmNlWydsb2NrZWQnXSAmJiBpdC5yZWxlYXNlTG9jaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5aWVsZCBfX2F3YWl0KG51bGwpO1xuICAgIH0pO1xufVxuLyoqIEBpZ25vcmUgKi9cbmNsYXNzIEFkYXB0aXZlQnl0ZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3Ioc291cmNlKSB7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLnJlYWRlciA9IG51bGw7XG4gICAgICAgIHRoaXMucmVhZGVyID0gdGhpcy5zb3VyY2VbJ2dldFJlYWRlciddKCk7XG4gICAgICAgIC8vIFdlIGhhdmUgdG8gY2F0Y2ggYW5kIHN3YWxsb3cgZXJyb3JzIGhlcmUgdG8gYXZvaWQgdW5jYXVnaHQgcHJvbWlzZSByZWplY3Rpb24gZXhjZXB0aW9uc1xuICAgICAgICAvLyB0aGF0IHNlZW0gdG8gYmUgcmFpc2VkIHdoZW4gd2UgY2FsbCBgcmVsZWFzZUxvY2soKWAgb24gdGhpcyByZWFkZXIuIEknbSBzdGlsbCBteXN0aWZpZWRcbiAgICAgICAgLy8gYWJvdXQgd2h5IHRoZXNlIGVycm9ycyBhcmUgcmFpc2VkLCBidXQgSSdtIHN1cmUgdGhlcmUncyBzb21lIGltcG9ydGFudCBzcGVjIHJlYXNvbiB0aGF0XG4gICAgICAgIC8vIEkgaGF2ZW4ndCBjb25zaWRlcmVkLiBJIGhhdGUgdG8gZW1wbG95IHN1Y2ggYW4gYW50aS1wYXR0ZXJuIGhlcmUsIGJ1dCBpdCBzZWVtcyBsaWtlIHRoZVxuICAgICAgICAvLyBvbmx5IHNvbHV0aW9uIGluIHRoaXMgY2FzZSA6L1xuICAgICAgICB0aGlzLnJlYWRlclsnY2xvc2VkJ10uY2F0Y2goKCkgPT4geyB9KTtcbiAgICB9XG4gICAgZ2V0IGNsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZGVyID8gdGhpcy5yZWFkZXJbJ2Nsb3NlZCddLmNhdGNoKCgpID0+IHsgfSkgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgcmVsZWFzZUxvY2soKSB7XG4gICAgICAgIGlmICh0aGlzLnJlYWRlcikge1xuICAgICAgICAgICAgdGhpcy5yZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlYWRlciA9IG51bGw7XG4gICAgfVxuICAgIGNhbmNlbChyZWFzb24pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgcmVhZGVyLCBzb3VyY2UgfSA9IHRoaXM7XG4gICAgICAgICAgICByZWFkZXIgJiYgKHlpZWxkIHJlYWRlclsnY2FuY2VsJ10ocmVhc29uKS5jYXRjaCgoKSA9PiB7IH0pKTtcbiAgICAgICAgICAgIHNvdXJjZSAmJiAoc291cmNlWydsb2NrZWQnXSAmJiB0aGlzLnJlbGVhc2VMb2NrKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVhZChzaXplKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRoaXMucmVhZGVyID09IG51bGwsIHZhbHVlOiBuZXcgVWludDhBcnJheSgwKSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgdGhpcy5yZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgIXJlc3VsdC5kb25lICYmIChyZXN1bHQudmFsdWUgPSB0b1VpbnQ4QXJyYXkocmVzdWx0KSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuY29uc3Qgb25FdmVudCA9IChzdHJlYW0sIGV2ZW50KSA9PiB7XG4gICAgY29uc3QgaGFuZGxlciA9IChfKSA9PiByZXNvbHZlKFtldmVudCwgX10pO1xuICAgIGxldCByZXNvbHZlO1xuICAgIHJldHVybiBbZXZlbnQsIGhhbmRsZXIsIG5ldyBQcm9taXNlKChyKSA9PiAocmVzb2x2ZSA9IHIpICYmIHN0cmVhbVsnb25jZSddKGV2ZW50LCBoYW5kbGVyKSldO1xufTtcbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBmcm9tTm9kZVN0cmVhbShzdHJlYW0pIHtcbiAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBmcm9tTm9kZVN0cmVhbV8xKCkge1xuICAgICAgICBjb25zdCBldmVudHMgPSBbXTtcbiAgICAgICAgbGV0IGV2ZW50ID0gJ2Vycm9yJztcbiAgICAgICAgbGV0IGRvbmUgPSBmYWxzZSwgZXJyID0gbnVsbDtcbiAgICAgICAgbGV0IGNtZCwgc2l6ZSwgYnVmZmVyTGVuZ3RoID0gMDtcbiAgICAgICAgbGV0IGJ1ZmZlcnMgPSBbXSwgYnVmZmVyO1xuICAgICAgICBmdW5jdGlvbiBieXRlUmFuZ2UoKSB7XG4gICAgICAgICAgICBpZiAoY21kID09PSAncGVlaycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gam9pblVpbnQ4QXJyYXlzKGJ1ZmZlcnMsIHNpemUpWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgW2J1ZmZlciwgYnVmZmVycywgYnVmZmVyTGVuZ3RoXSA9IGpvaW5VaW50OEFycmF5cyhidWZmZXJzLCBzaXplKTtcbiAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gWWllbGQgc28gdGhlIGNhbGxlciBjYW4gaW5qZWN0IHRoZSByZWFkIGNvbW1hbmQgYmVmb3JlIHdlXG4gICAgICAgIC8vIGFkZCB0aGUgbGlzdGVuZXIgZm9yIHRoZSBzb3VyY2Ugc3RyZWFtJ3MgJ3JlYWRhYmxlJyBldmVudC5cbiAgICAgICAgKHsgY21kLCBzaXplIH0gPSB5aWVsZCB5aWVsZCBfX2F3YWl0KG51bGwpKTtcbiAgICAgICAgLy8gaWdub3JlIHN0ZGluIGlmIGl0J3MgYSBUVFlcbiAgICAgICAgaWYgKHN0cmVhbVsnaXNUVFknXSkge1xuICAgICAgICAgICAgeWllbGQgeWllbGQgX19hd2FpdChuZXcgVWludDhBcnJheSgwKSk7XG4gICAgICAgICAgICByZXR1cm4geWllbGQgX19hd2FpdChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgc3RyZWFtIGV2ZW50IGhhbmRsZXJzXG4gICAgICAgICAgICBldmVudHNbMF0gPSBvbkV2ZW50KHN0cmVhbSwgJ2VuZCcpO1xuICAgICAgICAgICAgZXZlbnRzWzFdID0gb25FdmVudChzdHJlYW0sICdlcnJvcicpO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGV2ZW50c1syXSA9IG9uRXZlbnQoc3RyZWFtLCAncmVhZGFibGUnKTtcbiAgICAgICAgICAgICAgICAvLyB3YWl0IG9uIHRoZSBmaXJzdCBtZXNzYWdlIGV2ZW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgICAgIFtldmVudCwgZXJyXSA9IHlpZWxkIF9fYXdhaXQoUHJvbWlzZS5yYWNlKGV2ZW50cy5tYXAoKHgpID0+IHhbMl0pKSk7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHN0cmVhbSBlbWl0dGVkIGFuIEVycm9yLCByZXRocm93IGl0XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIShkb25lID0gZXZlbnQgPT09ICdlbmQnKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2l6ZSBpcyBOYU4sIHJlcXVlc3QgdG8gcmVhZCBldmVyeXRoaW5nIGluIHRoZSBzdHJlYW0ncyBpbnRlcm5hbCBidWZmZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoc2l6ZSAtIGJ1ZmZlckxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHRvVWludDhBcnJheShzdHJlYW1bJ3JlYWQnXSgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHRvVWludDhBcnJheShzdHJlYW1bJ3JlYWQnXShzaXplIC0gYnVmZmVyTGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYnl0ZUxlbmd0aCBpcyAwLCB0aGVuIHRoZSByZXF1ZXN0ZWQgYW1vdW50IGlzIG1vcmUgdGhhbiB0aGUgc3RyZWFtIGhhc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gaXRzIGludGVybmFsIGJ1ZmZlci4gSW4gdGhpcyBjYXNlIHRoZSBzdHJlYW0gbmVlZHMgYSBcImtpY2tcIiB0byB0ZWxsIGl0IHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51ZSBlbWl0dGluZyByZWFkYWJsZSBldmVudHMsIHNvIHJlcXVlc3QgdG8gcmVhZCBldmVyeXRoaW5nIHRoZSBzdHJlYW1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhcyBpbiBpdHMgaW50ZXJuYWwgYnVmZmVyIHJpZ2h0IG5vdy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXIuYnl0ZUxlbmd0aCA8IChzaXplIC0gYnVmZmVyTGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHRvVWludDhBcnJheShzdHJlYW1bJ3JlYWQnXSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBpZiBjaHVuayBpcyBub3QgbnVsbCBvciBlbXB0eSwgcHVzaCBpdCBvbnRvIHRoZSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLmJ5dGVMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzLnB1c2goYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckxlbmd0aCArPSBidWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGVub3VnaCBieXRlcyBpbiBvdXIgYnVmZmVyLCB5aWVsZCBjaHVua3MgdW50aWwgd2UgZG9uJ3RcbiAgICAgICAgICAgICAgICBpZiAoZG9uZSB8fCBzaXplIDw9IGJ1ZmZlckxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAoeyBjbWQsIHNpemUgfSA9IHlpZWxkIHlpZWxkIF9fYXdhaXQoYnl0ZVJhbmdlKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoc2l6ZSA8IGJ1ZmZlckxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAoIWRvbmUpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgeWllbGQgX19hd2FpdChjbGVhbnVwKGV2ZW50cywgZXZlbnQgPT09ICdlcnJvcicgPyBlcnIgOiBudWxsKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHlpZWxkIF9fYXdhaXQobnVsbCk7XG4gICAgICAgIGZ1bmN0aW9uIGNsZWFudXAoZXZlbnRzLCBlcnIpIHtcbiAgICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlcnMgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtldnQsIGZuXSBvZiBldmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtWydvZmYnXShldnQsIGZuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU29tZSBzdHJlYW0gaW1wbGVtZW50YXRpb25zIGRvbid0IGNhbGwgdGhlIGRlc3Ryb3kgY2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgaXQncyByZWFsbHkgYSBub2RlLWludGVybmFsIEFQSS4gSnVzdCBjYWxsaW5nIGBkZXN0cm95YFxuICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIHNob3VsZCBiZSBlbm91Z2ggdG8gY29uZm9ybSB0byB0aGUgUmVhZGFibGVTdHJlYW0gY29udHJhY3RcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzdHJveSA9IHN0cmVhbVsnZGVzdHJveSddO1xuICAgICAgICAgICAgICAgICAgICBkZXN0cm95ICYmIGRlc3Ryb3kuY2FsbChzdHJlYW0sIGVycik7XG4gICAgICAgICAgICAgICAgICAgIGVyciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyID0gZSB8fCBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBlcnIgIT0gbnVsbCA/IHJlamVjdChlcnIpIDogcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkYXB0ZXJzLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgX19hd2FpdGVyIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBCeXRlU3RyZWFtLCBBc3luY0J5dGVTdHJlYW0gfSBmcm9tICcuL3N0cmVhbS5tanMnO1xuaW1wb3J0IHsgdG9VaW50OEFycmF5IH0gZnJvbSAnLi4vdXRpbC9idWZmZXIubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgUmFuZG9tQWNjZXNzRmlsZSBleHRlbmRzIEJ5dGVTdHJlYW0ge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlciwgYnl0ZUxlbmd0aCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gMDtcbiAgICAgICAgdGhpcy5idWZmZXIgPSB0b1VpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICAgICAgdGhpcy5zaXplID0gdHlwZW9mIGJ5dGVMZW5ndGggPT09ICd1bmRlZmluZWQnID8gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCA6IGJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHJlYWRJbnQzMihwb3NpdGlvbikge1xuICAgICAgICBjb25zdCB7IGJ1ZmZlciwgYnl0ZU9mZnNldCB9ID0gdGhpcy5yZWFkQXQocG9zaXRpb24sIDQpO1xuICAgICAgICByZXR1cm4gbmV3IERhdGFWaWV3KGJ1ZmZlciwgYnl0ZU9mZnNldCkuZ2V0SW50MzIoMCwgdHJ1ZSk7XG4gICAgfVxuICAgIHNlZWsocG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IE1hdGgubWluKHBvc2l0aW9uLCB0aGlzLnNpemUpO1xuICAgICAgICByZXR1cm4gcG9zaXRpb24gPCB0aGlzLnNpemU7XG4gICAgfVxuICAgIHJlYWQobkJ5dGVzKSB7XG4gICAgICAgIGNvbnN0IHsgYnVmZmVyLCBzaXplLCBwb3NpdGlvbiB9ID0gdGhpcztcbiAgICAgICAgaWYgKGJ1ZmZlciAmJiBwb3NpdGlvbiA8IHNpemUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbkJ5dGVzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIG5CeXRlcyA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBNYXRoLm1pbihzaXplLCBwb3NpdGlvbiArIE1hdGgubWluKHNpemUgLSBwb3NpdGlvbiwgbkJ5dGVzKSk7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyLnN1YmFycmF5KHBvc2l0aW9uLCB0aGlzLnBvc2l0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmVhZEF0KHBvc2l0aW9uLCBuQnl0ZXMpIHtcbiAgICAgICAgY29uc3QgYnVmID0gdGhpcy5idWZmZXI7XG4gICAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWluKHRoaXMuc2l6ZSwgcG9zaXRpb24gKyBuQnl0ZXMpO1xuICAgICAgICByZXR1cm4gYnVmID8gYnVmLnN1YmFycmF5KHBvc2l0aW9uLCBlbmQpIDogbmV3IFVpbnQ4QXJyYXkobkJ5dGVzKTtcbiAgICB9XG4gICAgY2xvc2UoKSB7IHRoaXMuYnVmZmVyICYmICh0aGlzLmJ1ZmZlciA9IG51bGwpOyB9XG4gICAgdGhyb3codmFsdWUpIHsgdGhpcy5jbG9zZSgpOyByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZSB9OyB9XG4gICAgcmV0dXJuKHZhbHVlKSB7IHRoaXMuY2xvc2UoKTsgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWUgfTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBBc3luY1JhbmRvbUFjY2Vzc0ZpbGUgZXh0ZW5kcyBBc3luY0J5dGVTdHJlYW0ge1xuICAgIGNvbnN0cnVjdG9yKGZpbGUsIGJ5dGVMZW5ndGgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IDA7XG4gICAgICAgIHRoaXMuX2hhbmRsZSA9IGZpbGU7XG4gICAgICAgIGlmICh0eXBlb2YgYnl0ZUxlbmd0aCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IGJ5dGVMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nID0gKCgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNpemUgPSAoeWllbGQgZmlsZS5zdGF0KCkpLnNpemU7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3BlbmRpbmc7XG4gICAgICAgICAgICB9KSkoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWFkSW50MzIocG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgYnVmZmVyLCBieXRlT2Zmc2V0IH0gPSB5aWVsZCB0aGlzLnJlYWRBdChwb3NpdGlvbiwgNCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGFWaWV3KGJ1ZmZlciwgYnl0ZU9mZnNldCkuZ2V0SW50MzIoMCwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZWVrKHBvc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nICYmICh5aWVsZCB0aGlzLl9wZW5kaW5nKTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBNYXRoLm1pbihwb3NpdGlvbiwgdGhpcy5zaXplKTtcbiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbiA8IHRoaXMuc2l6ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlYWQobkJ5dGVzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nICYmICh5aWVsZCB0aGlzLl9wZW5kaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IHsgX2hhbmRsZTogZmlsZSwgc2l6ZSwgcG9zaXRpb24gfSA9IHRoaXM7XG4gICAgICAgICAgICBpZiAoZmlsZSAmJiBwb3NpdGlvbiA8IHNpemUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5CeXRlcyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgbkJ5dGVzID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcG9zID0gcG9zaXRpb24sIG9mZnNldCA9IDAsIGJ5dGVzUmVhZCA9IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4oc2l6ZSwgcG9zICsgTWF0aC5taW4oc2l6ZSAtIHBvcywgbkJ5dGVzKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoTWF0aC5tYXgoMCwgKHRoaXMucG9zaXRpb24gPSBlbmQpIC0gcG9zKSk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKChwb3MgKz0gYnl0ZXNSZWFkKSA8IGVuZCAmJiAob2Zmc2V0ICs9IGJ5dGVzUmVhZCkgPCBidWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAoeyBieXRlc1JlYWQgfSA9IHlpZWxkIGZpbGUucmVhZChidWZmZXIsIG9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGggLSBvZmZzZXQsIHBvcykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWFkQXQocG9zaXRpb24sIG5CeXRlcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdGhpcy5fcGVuZGluZyAmJiAoeWllbGQgdGhpcy5fcGVuZGluZyk7XG4gICAgICAgICAgICBjb25zdCB7IF9oYW5kbGU6IGZpbGUsIHNpemUgfSA9IHRoaXM7XG4gICAgICAgICAgICBpZiAoZmlsZSAmJiAocG9zaXRpb24gKyBuQnl0ZXMpIDwgc2l6ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWluKHNpemUsIHBvc2l0aW9uICsgbkJ5dGVzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheShlbmQgLSBwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh5aWVsZCBmaWxlLnJlYWQoYnVmZmVyLCAwLCBuQnl0ZXMsIHBvc2l0aW9uKSkuYnVmZmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KG5CeXRlcyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsgY29uc3QgZiA9IHRoaXMuX2hhbmRsZTsgdGhpcy5faGFuZGxlID0gbnVsbDsgZiAmJiAoeWllbGQgZi5jbG9zZSgpKTsgfSk7XG4gICAgfVxuICAgIHRocm93KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7IHlpZWxkIHRoaXMuY2xvc2UoKTsgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWUgfTsgfSk7XG4gICAgfVxuICAgIHJldHVybih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgeyB5aWVsZCB0aGlzLmNsb3NlKCk7IHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlIH07IH0pO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmlsZS5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IF9fYXdhaXRlciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHN0cmVhbUFkYXB0ZXJzIGZyb20gJy4vYWRhcHRlcnMubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgSVRFUkFUT1JfRE9ORSA9IE9iamVjdC5mcmVlemUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdm9pZCAoMCkgfSk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEFycm93SlNPTiB7XG4gICAgY29uc3RydWN0b3IoX2pzb24pIHtcbiAgICAgICAgdGhpcy5fanNvbiA9IF9qc29uO1xuICAgIH1cbiAgICBnZXQgc2NoZW1hKCkgeyByZXR1cm4gdGhpcy5fanNvblsnc2NoZW1hJ107IH1cbiAgICBnZXQgYmF0Y2hlcygpIHsgcmV0dXJuICh0aGlzLl9qc29uWydiYXRjaGVzJ10gfHwgW10pOyB9XG4gICAgZ2V0IGRpY3Rpb25hcmllcygpIHsgcmV0dXJuICh0aGlzLl9qc29uWydkaWN0aW9uYXJpZXMnXSB8fCBbXSk7IH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgUmVhZGFibGVJbnRlcm9wIHtcbiAgICB0ZWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRET01TdHJlYW0oKS50ZWUoKTtcbiAgICB9XG4gICAgcGlwZSh3cml0YWJsZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Tm9kZVN0cmVhbSgpLnBpcGUod3JpdGFibGUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBwaXBlVG8od3JpdGFibGUsIG9wdGlvbnMpIHsgcmV0dXJuIHRoaXMuX2dldERPTVN0cmVhbSgpLnBpcGVUbyh3cml0YWJsZSwgb3B0aW9ucyk7IH1cbiAgICBwaXBlVGhyb3VnaChkdXBsZXgsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldERPTVN0cmVhbSgpLnBpcGVUaHJvdWdoKGR1cGxleCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIF9nZXRET01TdHJlYW0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ET01TdHJlYW0gfHwgKHRoaXMuX0RPTVN0cmVhbSA9IHRoaXMudG9ET01TdHJlYW0oKSk7XG4gICAgfVxuICAgIF9nZXROb2RlU3RyZWFtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbm9kZVN0cmVhbSB8fCAodGhpcy5fbm9kZVN0cmVhbSA9IHRoaXMudG9Ob2RlU3RyZWFtKCkpO1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgQXN5bmNRdWV1ZSBleHRlbmRzIFJlYWRhYmxlSW50ZXJvcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xuICAgICAgICB0aGlzLnJlc29sdmVycyA9IFtdO1xuICAgICAgICB0aGlzLl9jbG9zZWRQcm9taXNlID0gbmV3IFByb21pc2UoKHIpID0+IHRoaXMuX2Nsb3NlZFByb21pc2VSZXNvbHZlID0gcik7XG4gICAgfVxuICAgIGdldCBjbG9zZWQoKSB7IHJldHVybiB0aGlzLl9jbG9zZWRQcm9taXNlOyB9XG4gICAgY2FuY2VsKHJlYXNvbikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgeyB5aWVsZCB0aGlzLnJldHVybihyZWFzb24pOyB9KTtcbiAgICB9XG4gICAgd3JpdGUodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Vuc3VyZU9wZW4oKSkge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlcnMubGVuZ3RoIDw9IDBcbiAgICAgICAgICAgICAgICA/ICh0aGlzLl92YWx1ZXMucHVzaCh2YWx1ZSkpXG4gICAgICAgICAgICAgICAgOiAodGhpcy5yZXNvbHZlcnMuc2hpZnQoKS5yZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhYm9ydCh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5fY2xvc2VkUHJvbWlzZVJlc29sdmUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZXJzLmxlbmd0aCA8PSAwXG4gICAgICAgICAgICAgICAgPyAodGhpcy5fZXJyb3IgPSB7IGVycm9yOiB2YWx1ZSB9KVxuICAgICAgICAgICAgICAgIDogKHRoaXMucmVzb2x2ZXJzLnNoaWZ0KCkucmVqZWN0KHsgZG9uZTogdHJ1ZSwgdmFsdWUgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5fY2xvc2VkUHJvbWlzZVJlc29sdmUpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgcmVzb2x2ZXJzIH0gPSB0aGlzO1xuICAgICAgICAgICAgd2hpbGUgKHJlc29sdmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZXJzLnNoaWZ0KCkucmVzb2x2ZShJVEVSQVRPUl9ET05FKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlZFByb21pc2VSZXNvbHZlKCk7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZWRQcm9taXNlUmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIHRvRE9NU3RyZWFtKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHN0cmVhbUFkYXB0ZXJzLnRvRE9NU3RyZWFtKCh0aGlzLl9jbG9zZWRQcm9taXNlUmVzb2x2ZSB8fCB0aGlzLl9lcnJvcilcbiAgICAgICAgICAgID8gdGhpc1xuICAgICAgICAgICAgOiB0aGlzLl92YWx1ZXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICB0b05vZGVTdHJlYW0ob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gc3RyZWFtQWRhcHRlcnMudG9Ob2RlU3RyZWFtKCh0aGlzLl9jbG9zZWRQcm9taXNlUmVzb2x2ZSB8fCB0aGlzLl9lcnJvcilcbiAgICAgICAgICAgID8gdGhpc1xuICAgICAgICAgICAgOiB0aGlzLl92YWx1ZXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICB0aHJvdyhfKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7IHlpZWxkIHRoaXMuYWJvcnQoXyk7IHJldHVybiBJVEVSQVRPUl9ET05FOyB9KTtcbiAgICB9XG4gICAgcmV0dXJuKF8pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsgeWllbGQgdGhpcy5jbG9zZSgpOyByZXR1cm4gSVRFUkFUT1JfRE9ORTsgfSk7XG4gICAgfVxuICAgIHJlYWQoc2l6ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgeyByZXR1cm4gKHlpZWxkIHRoaXMubmV4dChzaXplLCAncmVhZCcpKS52YWx1ZTsgfSk7XG4gICAgfVxuICAgIHBlZWsoc2l6ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgeyByZXR1cm4gKHlpZWxkIHRoaXMubmV4dChzaXplLCAncGVlaycpKS52YWx1ZTsgfSk7XG4gICAgfVxuICAgIG5leHQoLi4uX2FyZ3MpIHtcbiAgICAgICAgaWYgKHRoaXMuX3ZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiB0aGlzLl92YWx1ZXMuc2hpZnQoKSB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl9lcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHRoaXMuX2Vycm9yLmVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9jbG9zZWRQcm9taXNlUmVzb2x2ZSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShJVEVSQVRPUl9ET05FKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlcnMucHVzaCh7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9lbnN1cmVPcGVuKCkge1xuICAgICAgICBpZiAodGhpcy5fY2xvc2VkUHJvbWlzZVJlc29sdmUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXN5bmNRdWV1ZSBpcyBjbG9zZWRgKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWludGVyZmFjZXMubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBfX2FzeW5jVmFsdWVzLCBfX2F3YWl0ZXIgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBzdHJlYW1BZGFwdGVycyBmcm9tICcuL2FkYXB0ZXJzLm1qcyc7XG5pbXBvcnQgeyBkZWNvZGVVdGY4IH0gZnJvbSAnLi4vdXRpbC91dGY4Lm1qcyc7XG5pbXBvcnQgeyBJVEVSQVRPUl9ET05FLCBBc3luY1F1ZXVlIH0gZnJvbSAnLi9pbnRlcmZhY2VzLm1qcyc7XG5pbXBvcnQgeyB0b1VpbnQ4QXJyYXksIGpvaW5VaW50OEFycmF5cyB9IGZyb20gJy4uL3V0aWwvYnVmZmVyLm1qcyc7XG5pbXBvcnQgeyBpc1Byb21pc2UsIGlzRmV0Y2hSZXNwb25zZSwgaXNJdGVyYWJsZSwgaXNBc3luY0l0ZXJhYmxlLCBpc1JlYWRhYmxlRE9NU3RyZWFtLCBpc1JlYWRhYmxlTm9kZVN0cmVhbSB9IGZyb20gJy4uL3V0aWwvY29tcGF0Lm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEFzeW5jQnl0ZVF1ZXVlIGV4dGVuZHMgQXN5bmNRdWV1ZSB7XG4gICAgd3JpdGUodmFsdWUpIHtcbiAgICAgICAgaWYgKCh2YWx1ZSA9IHRvVWludDhBcnJheSh2YWx1ZSkpLmJ5dGVMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIud3JpdGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvU3RyaW5nKHN5bmMgPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gc3luY1xuICAgICAgICAgICAgPyBkZWNvZGVVdGY4KHRoaXMudG9VaW50OEFycmF5KHRydWUpKVxuICAgICAgICAgICAgOiB0aGlzLnRvVWludDhBcnJheShmYWxzZSkudGhlbihkZWNvZGVVdGY4KTtcbiAgICB9XG4gICAgdG9VaW50OEFycmF5KHN5bmMgPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gc3luYyA/IGpvaW5VaW50OEFycmF5cyh0aGlzLl92YWx1ZXMpWzBdIDogKCgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgICAgICAgY29uc3QgYnVmZmVycyA9IFtdO1xuICAgICAgICAgICAgbGV0IGJ5dGVMZW5ndGggPSAwO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fYXN5bmNWYWx1ZXModGhpcyksIF9jOyBfYyA9IHlpZWxkIF9iLm5leHQoKSwgIV9jLmRvbmU7KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnMucHVzaChjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVMZW5ndGggKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIHlpZWxkIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gam9pblVpbnQ4QXJyYXlzKGJ1ZmZlcnMsIGJ5dGVMZW5ndGgpWzBdO1xuICAgICAgICB9KSkoKTtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEJ5dGVTdHJlYW0ge1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSkge1xuICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IG5ldyBCeXRlU3RyZWFtU291cmNlKHN0cmVhbUFkYXB0ZXJzLmZyb21JdGVyYWJsZShzb3VyY2UpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICBuZXh0KHZhbHVlKSB7IHJldHVybiB0aGlzLnNvdXJjZS5uZXh0KHZhbHVlKTsgfVxuICAgIHRocm93KHZhbHVlKSB7IHJldHVybiB0aGlzLnNvdXJjZS50aHJvdyh2YWx1ZSk7IH1cbiAgICByZXR1cm4odmFsdWUpIHsgcmV0dXJuIHRoaXMuc291cmNlLnJldHVybih2YWx1ZSk7IH1cbiAgICBwZWVrKHNpemUpIHsgcmV0dXJuIHRoaXMuc291cmNlLnBlZWsoc2l6ZSk7IH1cbiAgICByZWFkKHNpemUpIHsgcmV0dXJuIHRoaXMuc291cmNlLnJlYWQoc2l6ZSk7IH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgQXN5bmNCeXRlU3RyZWFtIHtcbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHtcbiAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIEFzeW5jQnl0ZVN0cmVhbSkge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2Uuc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIEFzeW5jQnl0ZVF1ZXVlKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IG5ldyBBc3luY0J5dGVTdHJlYW1Tb3VyY2Uoc3RyZWFtQWRhcHRlcnMuZnJvbUFzeW5jSXRlcmFibGUoc291cmNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNSZWFkYWJsZU5vZGVTdHJlYW0oc291cmNlKSkge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBuZXcgQXN5bmNCeXRlU3RyZWFtU291cmNlKHN0cmVhbUFkYXB0ZXJzLmZyb21Ob2RlU3RyZWFtKHNvdXJjZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUmVhZGFibGVET01TdHJlYW0oc291cmNlKSkge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBuZXcgQXN5bmNCeXRlU3RyZWFtU291cmNlKHN0cmVhbUFkYXB0ZXJzLmZyb21ET01TdHJlYW0oc291cmNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNGZXRjaFJlc3BvbnNlKHNvdXJjZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlID0gbmV3IEFzeW5jQnl0ZVN0cmVhbVNvdXJjZShzdHJlYW1BZGFwdGVycy5mcm9tRE9NU3RyZWFtKHNvdXJjZS5ib2R5KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNJdGVyYWJsZShzb3VyY2UpKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IG5ldyBBc3luY0J5dGVTdHJlYW1Tb3VyY2Uoc3RyZWFtQWRhcHRlcnMuZnJvbUl0ZXJhYmxlKHNvdXJjZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUHJvbWlzZShzb3VyY2UpKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IG5ldyBBc3luY0J5dGVTdHJlYW1Tb3VyY2Uoc3RyZWFtQWRhcHRlcnMuZnJvbUFzeW5jSXRlcmFibGUoc291cmNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNBc3luY0l0ZXJhYmxlKHNvdXJjZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlID0gbmV3IEFzeW5jQnl0ZVN0cmVhbVNvdXJjZShzdHJlYW1BZGFwdGVycy5mcm9tQXN5bmNJdGVyYWJsZShzb3VyY2UpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIG5leHQodmFsdWUpIHsgcmV0dXJuIHRoaXMuc291cmNlLm5leHQodmFsdWUpOyB9XG4gICAgdGhyb3codmFsdWUpIHsgcmV0dXJuIHRoaXMuc291cmNlLnRocm93KHZhbHVlKTsgfVxuICAgIHJldHVybih2YWx1ZSkgeyByZXR1cm4gdGhpcy5zb3VyY2UucmV0dXJuKHZhbHVlKTsgfVxuICAgIGdldCBjbG9zZWQoKSB7IHJldHVybiB0aGlzLnNvdXJjZS5jbG9zZWQ7IH1cbiAgICBjYW5jZWwocmVhc29uKSB7IHJldHVybiB0aGlzLnNvdXJjZS5jYW5jZWwocmVhc29uKTsgfVxuICAgIHBlZWsoc2l6ZSkgeyByZXR1cm4gdGhpcy5zb3VyY2UucGVlayhzaXplKTsgfVxuICAgIHJlYWQoc2l6ZSkgeyByZXR1cm4gdGhpcy5zb3VyY2UucmVhZChzaXplKTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmNsYXNzIEJ5dGVTdHJlYW1Tb3VyY2Uge1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSkge1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICB9XG4gICAgY2FuY2VsKHJlYXNvbikgeyB0aGlzLnJldHVybihyZWFzb24pOyB9XG4gICAgcGVlayhzaXplKSB7IHJldHVybiB0aGlzLm5leHQoc2l6ZSwgJ3BlZWsnKS52YWx1ZTsgfVxuICAgIHJlYWQoc2l6ZSkgeyByZXR1cm4gdGhpcy5uZXh0KHNpemUsICdyZWFkJykudmFsdWU7IH1cbiAgICBuZXh0KHNpemUsIGNtZCA9ICdyZWFkJykgeyByZXR1cm4gdGhpcy5zb3VyY2UubmV4dCh7IGNtZCwgc2l6ZSB9KTsgfVxuICAgIHRocm93KHZhbHVlKSB7IHJldHVybiBPYmplY3QuY3JlYXRlKCh0aGlzLnNvdXJjZS50aHJvdyAmJiB0aGlzLnNvdXJjZS50aHJvdyh2YWx1ZSkpIHx8IElURVJBVE9SX0RPTkUpOyB9XG4gICAgcmV0dXJuKHZhbHVlKSB7IHJldHVybiBPYmplY3QuY3JlYXRlKCh0aGlzLnNvdXJjZS5yZXR1cm4gJiYgdGhpcy5zb3VyY2UucmV0dXJuKHZhbHVlKSkgfHwgSVRFUkFUT1JfRE9ORSk7IH1cbn1cbi8qKiBAaWdub3JlICovXG5jbGFzcyBBc3luY0J5dGVTdHJlYW1Tb3VyY2Uge1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSkge1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgdGhpcy5fY2xvc2VkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyKSA9PiB0aGlzLl9jbG9zZWRQcm9taXNlUmVzb2x2ZSA9IHIpO1xuICAgIH1cbiAgICBjYW5jZWwocmVhc29uKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7IHlpZWxkIHRoaXMucmV0dXJuKHJlYXNvbik7IH0pO1xuICAgIH1cbiAgICBnZXQgY2xvc2VkKCkgeyByZXR1cm4gdGhpcy5fY2xvc2VkUHJvbWlzZTsgfVxuICAgIHJlYWQoc2l6ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgeyByZXR1cm4gKHlpZWxkIHRoaXMubmV4dChzaXplLCAncmVhZCcpKS52YWx1ZTsgfSk7XG4gICAgfVxuICAgIHBlZWsoc2l6ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgeyByZXR1cm4gKHlpZWxkIHRoaXMubmV4dChzaXplLCAncGVlaycpKS52YWx1ZTsgfSk7XG4gICAgfVxuICAgIG5leHQoc2l6ZSwgY21kID0gJ3JlYWQnKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7IHJldHVybiAoeWllbGQgdGhpcy5zb3VyY2UubmV4dCh7IGNtZCwgc2l6ZSB9KSk7IH0pO1xuICAgIH1cbiAgICB0aHJvdyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gKHRoaXMuc291cmNlLnRocm93ICYmICh5aWVsZCB0aGlzLnNvdXJjZS50aHJvdyh2YWx1ZSkpKSB8fCBJVEVSQVRPUl9ET05FO1xuICAgICAgICAgICAgdGhpcy5fY2xvc2VkUHJvbWlzZVJlc29sdmUgJiYgdGhpcy5fY2xvc2VkUHJvbWlzZVJlc29sdmUoKTtcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlZFByb21pc2VSZXNvbHZlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUocmVzdWx0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gKHRoaXMuc291cmNlLnJldHVybiAmJiAoeWllbGQgdGhpcy5zb3VyY2UucmV0dXJuKHZhbHVlKSkpIHx8IElURVJBVE9SX0RPTkU7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZWRQcm9taXNlUmVzb2x2ZSAmJiB0aGlzLl9jbG9zZWRQcm9taXNlUmVzb2x2ZSgpO1xuICAgICAgICAgICAgdGhpcy5fY2xvc2VkUHJvbWlzZVJlc29sdmUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShyZXN1bHQpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmVhbS5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IF9fYXdhaXRlciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgTWVzc2FnZUhlYWRlciB9IGZyb20gJy4uL2VudW0ubWpzJztcbmltcG9ydCB7IEJ5dGVCdWZmZXIgfSBmcm9tICdmbGF0YnVmZmVycyc7XG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAnLi9tZXRhZGF0YS9tZXNzYWdlLm1qcyc7XG5pbXBvcnQgeyBpc0ZpbGVIYW5kbGUgfSBmcm9tICcuLi91dGlsL2NvbXBhdC5tanMnO1xuaW1wb3J0IHsgQXN5bmNSYW5kb21BY2Nlc3NGaWxlIH0gZnJvbSAnLi4vaW8vZmlsZS5tanMnO1xuaW1wb3J0IHsgdG9VaW50OEFycmF5IH0gZnJvbSAnLi4vdXRpbC9idWZmZXIubWpzJztcbmltcG9ydCB7IEJ5dGVTdHJlYW0sIEFzeW5jQnl0ZVN0cmVhbSB9IGZyb20gJy4uL2lvL3N0cmVhbS5tanMnO1xuaW1wb3J0IHsgQXJyb3dKU09OLCBJVEVSQVRPUl9ET05FIH0gZnJvbSAnLi4vaW8vaW50ZXJmYWNlcy5tanMnO1xuLyoqIEBpZ25vcmUgKi8gY29uc3QgaW52YWxpZE1lc3NhZ2VUeXBlID0gKHR5cGUpID0+IGBFeHBlY3RlZCAke01lc3NhZ2VIZWFkZXJbdHlwZV19IE1lc3NhZ2UgaW4gc3RyZWFtLCBidXQgd2FzIG51bGwgb3IgbGVuZ3RoIDAuYDtcbi8qKiBAaWdub3JlICovIGNvbnN0IG51bGxNZXNzYWdlID0gKHR5cGUpID0+IGBIZWFkZXIgcG9pbnRlciBvZiBmbGF0YnVmZmVyLWVuY29kZWQgJHtNZXNzYWdlSGVhZGVyW3R5cGVdfSBNZXNzYWdlIGlzIG51bGwgb3IgbGVuZ3RoIDAuYDtcbi8qKiBAaWdub3JlICovIGNvbnN0IGludmFsaWRNZXNzYWdlTWV0YWRhdGEgPSAoZXhwZWN0ZWQsIGFjdHVhbCkgPT4gYEV4cGVjdGVkIHRvIHJlYWQgJHtleHBlY3RlZH0gbWV0YWRhdGEgYnl0ZXMsIGJ1dCBvbmx5IHJlYWQgJHthY3R1YWx9LmA7XG4vKiogQGlnbm9yZSAqLyBjb25zdCBpbnZhbGlkTWVzc2FnZUJvZHlMZW5ndGggPSAoZXhwZWN0ZWQsIGFjdHVhbCkgPT4gYEV4cGVjdGVkIHRvIHJlYWQgJHtleHBlY3RlZH0gYnl0ZXMgZm9yIG1lc3NhZ2UgYm9keSwgYnV0IG9ubHkgcmVhZCAke2FjdHVhbH0uYDtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgTWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3Ioc291cmNlKSB7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlIGluc3RhbmNlb2YgQnl0ZVN0cmVhbSA/IHNvdXJjZSA6IG5ldyBCeXRlU3RyZWFtKHNvdXJjZSk7XG4gICAgfVxuICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIGxldCByO1xuICAgICAgICBpZiAoKHIgPSB0aGlzLnJlYWRNZXRhZGF0YUxlbmd0aCgpKS5kb25lKSB7XG4gICAgICAgICAgICByZXR1cm4gSVRFUkFUT1JfRE9ORTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBUlJPVy02MzEzOiBJZiB0aGUgZmlyc3QgNCBieXRlcyBhcmUgY29udGludWF0aW9uIGluZGljYXRvciAoLTEpLCByZWFkXG4gICAgICAgIC8vIHRoZSBuZXh0IDQgZm9yIHRoZSAzMi1iaXQgbWV0YWRhdGEgbGVuZ3RoLiBPdGhlcndpc2UsIGFzc3VtZSB0aGlzIGlzIGFcbiAgICAgICAgLy8gcHJlLXYwLjE1IG1lc3NhZ2UsIHdoZXJlIHRoZSBmaXJzdCA0IGJ5dGVzIGFyZSB0aGUgbWV0YWRhdGEgbGVuZ3RoLlxuICAgICAgICBpZiAoKHIudmFsdWUgPT09IC0xKSAmJlxuICAgICAgICAgICAgKHIgPSB0aGlzLnJlYWRNZXRhZGF0YUxlbmd0aCgpKS5kb25lKSB7XG4gICAgICAgICAgICByZXR1cm4gSVRFUkFUT1JfRE9ORTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHIgPSB0aGlzLnJlYWRNZXRhZGF0YShyLnZhbHVlKSkuZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIElURVJBVE9SX0RPTkU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgfVxuICAgIHRocm93KHZhbHVlKSB7IHJldHVybiB0aGlzLnNvdXJjZS50aHJvdyh2YWx1ZSk7IH1cbiAgICByZXR1cm4odmFsdWUpIHsgcmV0dXJuIHRoaXMuc291cmNlLnJldHVybih2YWx1ZSk7IH1cbiAgICByZWFkTWVzc2FnZSh0eXBlKSB7XG4gICAgICAgIGxldCByO1xuICAgICAgICBpZiAoKHIgPSB0aGlzLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0eXBlICE9IG51bGwpICYmIHIudmFsdWUuaGVhZGVyVHlwZSAhPT0gdHlwZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGludmFsaWRNZXNzYWdlVHlwZSh0eXBlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHIudmFsdWU7XG4gICAgfVxuICAgIHJlYWRNZXNzYWdlQm9keShib2R5TGVuZ3RoKSB7XG4gICAgICAgIGlmIChib2R5TGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBidWYgPSB0b1VpbnQ4QXJyYXkodGhpcy5zb3VyY2UucmVhZChib2R5TGVuZ3RoKSk7XG4gICAgICAgIGlmIChidWYuYnl0ZUxlbmd0aCA8IGJvZHlMZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihpbnZhbGlkTWVzc2FnZUJvZHlMZW5ndGgoYm9keUxlbmd0aCwgYnVmLmJ5dGVMZW5ndGgpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAxLiBXb3JrIGFyb3VuZCBidWdzIGluIGZzLlJlYWRTdHJlYW0ncyBpbnRlcm5hbCBCdWZmZXIgcG9vbGluZywgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzI0ODE3XG4gICAgICAgIC8vIDIuIFdvcmsgYXJvdW5kIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvc3RyZWFtcy9ibG9iLzBlYmU0YjA0MmU0NjdkOTg3NmQ4MGFlMDQ1ZGUzODQzMDkyYWQ3OTcvcmVmZXJlbmNlLWltcGxlbWVudGF0aW9uL2xpYi9oZWxwZXJzLmpzI0wxMjZcbiAgICAgICAgcmV0dXJuIC8qIDEuICovIChidWYuYnl0ZU9mZnNldCAlIDggPT09IDApICYmXG4gICAgICAgICAgICAvKiAyLiAqLyAoYnVmLmJ5dGVPZmZzZXQgKyBidWYuYnl0ZUxlbmd0aCkgPD0gYnVmLmJ1ZmZlci5ieXRlTGVuZ3RoID8gYnVmIDogYnVmLnNsaWNlKCk7XG4gICAgfVxuICAgIHJlYWRTY2hlbWEodGhyb3dJZk51bGwgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCB0eXBlID0gTWVzc2FnZUhlYWRlci5TY2hlbWE7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnJlYWRNZXNzYWdlKHR5cGUpO1xuICAgICAgICBjb25zdCBzY2hlbWEgPSBtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lc3NhZ2UuaGVhZGVyKCk7XG4gICAgICAgIGlmICh0aHJvd0lmTnVsbCAmJiAhc2NoZW1hKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobnVsbE1lc3NhZ2UodHlwZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzY2hlbWE7XG4gICAgfVxuICAgIHJlYWRNZXRhZGF0YUxlbmd0aCgpIHtcbiAgICAgICAgY29uc3QgYnVmID0gdGhpcy5zb3VyY2UucmVhZChQQURESU5HKTtcbiAgICAgICAgY29uc3QgYmIgPSBidWYgJiYgbmV3IEJ5dGVCdWZmZXIoYnVmKTtcbiAgICAgICAgY29uc3QgbGVuID0gKGJiID09PSBudWxsIHx8IGJiID09PSB2b2lkIDAgPyB2b2lkIDAgOiBiYi5yZWFkSW50MzIoMCkpIHx8IDA7XG4gICAgICAgIHJldHVybiB7IGRvbmU6IGxlbiA9PT0gMCwgdmFsdWU6IGxlbiB9O1xuICAgIH1cbiAgICByZWFkTWV0YWRhdGEobWV0YWRhdGFMZW5ndGgpIHtcbiAgICAgICAgY29uc3QgYnVmID0gdGhpcy5zb3VyY2UucmVhZChtZXRhZGF0YUxlbmd0aCk7XG4gICAgICAgIGlmICghYnVmKSB7XG4gICAgICAgICAgICByZXR1cm4gSVRFUkFUT1JfRE9ORTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnVmLmJ5dGVMZW5ndGggPCBtZXRhZGF0YUxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGludmFsaWRNZXNzYWdlTWV0YWRhdGEobWV0YWRhdGFMZW5ndGgsIGJ1Zi5ieXRlTGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBNZXNzYWdlLmRlY29kZShidWYpIH07XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBBc3luY01lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgYnl0ZUxlbmd0aCkge1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZSBpbnN0YW5jZW9mIEFzeW5jQnl0ZVN0cmVhbSA/IHNvdXJjZVxuICAgICAgICAgICAgOiBpc0ZpbGVIYW5kbGUoc291cmNlKVxuICAgICAgICAgICAgICAgID8gbmV3IEFzeW5jUmFuZG9tQWNjZXNzRmlsZShzb3VyY2UsIGJ5dGVMZW5ndGgpXG4gICAgICAgICAgICAgICAgOiBuZXcgQXN5bmNCeXRlU3RyZWFtKHNvdXJjZSk7XG4gICAgfVxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7IHJldHVybiB0aGlzOyB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGxldCByO1xuICAgICAgICAgICAgaWYgKChyID0geWllbGQgdGhpcy5yZWFkTWV0YWRhdGFMZW5ndGgoKSkuZG9uZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBJVEVSQVRPUl9ET05FO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQVJST1ctNjMxMzogSWYgdGhlIGZpcnN0IDQgYnl0ZXMgYXJlIGNvbnRpbnVhdGlvbiBpbmRpY2F0b3IgKC0xKSwgcmVhZFxuICAgICAgICAgICAgLy8gdGhlIG5leHQgNCBmb3IgdGhlIDMyLWJpdCBtZXRhZGF0YSBsZW5ndGguIE90aGVyd2lzZSwgYXNzdW1lIHRoaXMgaXMgYVxuICAgICAgICAgICAgLy8gcHJlLXYwLjE1IG1lc3NhZ2UsIHdoZXJlIHRoZSBmaXJzdCA0IGJ5dGVzIGFyZSB0aGUgbWV0YWRhdGEgbGVuZ3RoLlxuICAgICAgICAgICAgaWYgKChyLnZhbHVlID09PSAtMSkgJiZcbiAgICAgICAgICAgICAgICAociA9IHlpZWxkIHRoaXMucmVhZE1ldGFkYXRhTGVuZ3RoKCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSVRFUkFUT1JfRE9ORTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgociA9IHlpZWxkIHRoaXMucmVhZE1ldGFkYXRhKHIudmFsdWUpKS5kb25lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIElURVJBVE9SX0RPTkU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRocm93KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7IHJldHVybiB5aWVsZCB0aGlzLnNvdXJjZS50aHJvdyh2YWx1ZSk7IH0pO1xuICAgIH1cbiAgICByZXR1cm4odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsgcmV0dXJuIHlpZWxkIHRoaXMuc291cmNlLnJldHVybih2YWx1ZSk7IH0pO1xuICAgIH1cbiAgICByZWFkTWVzc2FnZSh0eXBlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgcjtcbiAgICAgICAgICAgIGlmICgociA9IHlpZWxkIHRoaXMubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHR5cGUgIT0gbnVsbCkgJiYgci52YWx1ZS5oZWFkZXJUeXBlICE9PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGludmFsaWRNZXNzYWdlVHlwZSh0eXBlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gci52YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlYWRNZXNzYWdlQm9keShib2R5TGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAoYm9keUxlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYnVmID0gdG9VaW50OEFycmF5KHlpZWxkIHRoaXMuc291cmNlLnJlYWQoYm9keUxlbmd0aCkpO1xuICAgICAgICAgICAgaWYgKGJ1Zi5ieXRlTGVuZ3RoIDwgYm9keUxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihpbnZhbGlkTWVzc2FnZUJvZHlMZW5ndGgoYm9keUxlbmd0aCwgYnVmLmJ5dGVMZW5ndGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDEuIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gZnMuUmVhZFN0cmVhbSdzIGludGVybmFsIEJ1ZmZlciBwb29saW5nLCBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvMjQ4MTdcbiAgICAgICAgICAgIC8vIDIuIFdvcmsgYXJvdW5kIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvc3RyZWFtcy9ibG9iLzBlYmU0YjA0MmU0NjdkOTg3NmQ4MGFlMDQ1ZGUzODQzMDkyYWQ3OTcvcmVmZXJlbmNlLWltcGxlbWVudGF0aW9uL2xpYi9oZWxwZXJzLmpzI0wxMjZcbiAgICAgICAgICAgIHJldHVybiAvKiAxLiAqLyAoYnVmLmJ5dGVPZmZzZXQgJSA4ID09PSAwKSAmJlxuICAgICAgICAgICAgICAgIC8qIDIuICovIChidWYuYnl0ZU9mZnNldCArIGJ1Zi5ieXRlTGVuZ3RoKSA8PSBidWYuYnVmZmVyLmJ5dGVMZW5ndGggPyBidWYgOiBidWYuc2xpY2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlYWRTY2hlbWEodGhyb3dJZk51bGwgPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IE1lc3NhZ2VIZWFkZXIuU2NoZW1hO1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHlpZWxkIHRoaXMucmVhZE1lc3NhZ2UodHlwZSk7XG4gICAgICAgICAgICBjb25zdCBzY2hlbWEgPSBtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lc3NhZ2UuaGVhZGVyKCk7XG4gICAgICAgICAgICBpZiAodGhyb3dJZk51bGwgJiYgIXNjaGVtYSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihudWxsTWVzc2FnZSh0eXBlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2NoZW1hO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVhZE1ldGFkYXRhTGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgYnVmID0geWllbGQgdGhpcy5zb3VyY2UucmVhZChQQURESU5HKTtcbiAgICAgICAgICAgIGNvbnN0IGJiID0gYnVmICYmIG5ldyBCeXRlQnVmZmVyKGJ1Zik7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSAoYmIgPT09IG51bGwgfHwgYmIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJiLnJlYWRJbnQzMigwKSkgfHwgMDtcbiAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IGxlbiA9PT0gMCwgdmFsdWU6IGxlbiB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVhZE1ldGFkYXRhKG1ldGFkYXRhTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBidWYgPSB5aWVsZCB0aGlzLnNvdXJjZS5yZWFkKG1ldGFkYXRhTGVuZ3RoKTtcbiAgICAgICAgICAgIGlmICghYnVmKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIElURVJBVE9SX0RPTkU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYnVmLmJ5dGVMZW5ndGggPCBtZXRhZGF0YUxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihpbnZhbGlkTWVzc2FnZU1ldGFkYXRhKG1ldGFkYXRhTGVuZ3RoLCBidWYuYnl0ZUxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBNZXNzYWdlLmRlY29kZShidWYpIH07XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgSlNPTk1lc3NhZ2VSZWFkZXIgZXh0ZW5kcyBNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHtcbiAgICAgICAgc3VwZXIobmV3IFVpbnQ4QXJyYXkoMCkpO1xuICAgICAgICB0aGlzLl9zY2hlbWEgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYm9keSA9IFtdO1xuICAgICAgICB0aGlzLl9iYXRjaEluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5fZGljdGlvbmFyeUluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5fanNvbiA9IHNvdXJjZSBpbnN0YW5jZW9mIEFycm93SlNPTiA/IHNvdXJjZSA6IG5ldyBBcnJvd0pTT04oc291cmNlKTtcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgY29uc3QgeyBfanNvbiB9ID0gdGhpcztcbiAgICAgICAgaWYgKCF0aGlzLl9zY2hlbWEpIHtcbiAgICAgICAgICAgIHRoaXMuX3NjaGVtYSA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gTWVzc2FnZS5mcm9tSlNPTihfanNvbi5zY2hlbWEsIE1lc3NhZ2VIZWFkZXIuU2NoZW1hKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogbWVzc2FnZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kaWN0aW9uYXJ5SW5kZXggPCBfanNvbi5kaWN0aW9uYXJpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBiYXRjaCA9IF9qc29uLmRpY3Rpb25hcmllc1t0aGlzLl9kaWN0aW9uYXJ5SW5kZXgrK107XG4gICAgICAgICAgICB0aGlzLl9ib2R5ID0gYmF0Y2hbJ2RhdGEnXVsnY29sdW1ucyddO1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IE1lc3NhZ2UuZnJvbUpTT04oYmF0Y2gsIE1lc3NhZ2VIZWFkZXIuRGljdGlvbmFyeUJhdGNoKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogbWVzc2FnZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9iYXRjaEluZGV4IDwgX2pzb24uYmF0Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhdGNoID0gX2pzb24uYmF0Y2hlc1t0aGlzLl9iYXRjaEluZGV4KytdO1xuICAgICAgICAgICAgdGhpcy5fYm9keSA9IGJhdGNoWydjb2x1bW5zJ107XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gTWVzc2FnZS5mcm9tSlNPTihiYXRjaCwgTWVzc2FnZUhlYWRlci5SZWNvcmRCYXRjaCk7XG4gICAgICAgICAgICByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG1lc3NhZ2UgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9ib2R5ID0gW107XG4gICAgICAgIHJldHVybiBJVEVSQVRPUl9ET05FO1xuICAgIH1cbiAgICByZWFkTWVzc2FnZUJvZHkoX2JvZHlMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZsYXR0ZW5EYXRhU291cmNlcyh0aGlzLl9ib2R5KTtcbiAgICAgICAgZnVuY3Rpb24gZmxhdHRlbkRhdGFTb3VyY2VzKHhzKSB7XG4gICAgICAgICAgICByZXR1cm4gKHhzIHx8IFtdKS5yZWR1Y2UoKGJ1ZmZlcnMsIGNvbHVtbikgPT4gW1xuICAgICAgICAgICAgICAgIC4uLmJ1ZmZlcnMsXG4gICAgICAgICAgICAgICAgLi4uKGNvbHVtblsnVkFMSURJVFknXSAmJiBbY29sdW1uWydWQUxJRElUWSddXSB8fCBbXSksXG4gICAgICAgICAgICAgICAgLi4uKGNvbHVtblsnVFlQRSddICYmIFtjb2x1bW5bJ1RZUEUnXV0gfHwgW10pLFxuICAgICAgICAgICAgICAgIC4uLihjb2x1bW5bJ09GRlNFVCddICYmIFtjb2x1bW5bJ09GRlNFVCddXSB8fCBbXSksXG4gICAgICAgICAgICAgICAgLi4uKGNvbHVtblsnREFUQSddICYmIFtjb2x1bW5bJ0RBVEEnXV0gfHwgW10pLFxuICAgICAgICAgICAgICAgIC4uLmZsYXR0ZW5EYXRhU291cmNlcyhjb2x1bW5bJ2NoaWxkcmVuJ10pXG4gICAgICAgICAgICBdLCBbXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVhZE1lc3NhZ2UodHlwZSkge1xuICAgICAgICBsZXQgcjtcbiAgICAgICAgaWYgKChyID0gdGhpcy5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICgodHlwZSAhPSBudWxsKSAmJiByLnZhbHVlLmhlYWRlclR5cGUgIT09IHR5cGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihpbnZhbGlkTWVzc2FnZVR5cGUodHlwZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByLnZhbHVlO1xuICAgIH1cbiAgICByZWFkU2NoZW1hKCkge1xuICAgICAgICBjb25zdCB0eXBlID0gTWVzc2FnZUhlYWRlci5TY2hlbWE7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnJlYWRNZXNzYWdlKHR5cGUpO1xuICAgICAgICBjb25zdCBzY2hlbWEgPSBtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lc3NhZ2UuaGVhZGVyKCk7XG4gICAgICAgIGlmICghbWVzc2FnZSB8fCAhc2NoZW1hKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobnVsbE1lc3NhZ2UodHlwZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzY2hlbWE7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBQQURESU5HID0gNDtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgTUFHSUNfU1RSID0gJ0FSUk9XMSc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IE1BR0lDID0gbmV3IFVpbnQ4QXJyYXkoTUFHSUNfU1RSLmxlbmd0aCk7XG5mb3IgKGxldCBpID0gMDsgaSA8IE1BR0lDX1NUUi5sZW5ndGg7IGkgKz0gMSkge1xuICAgIE1BR0lDW2ldID0gTUFHSUNfU1RSLmNvZGVQb2ludEF0KGkpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0Zvck1hZ2ljQXJyb3dTdHJpbmcoYnVmZmVyLCBpbmRleCA9IDApIHtcbiAgICBmb3IgKGxldCBpID0gLTEsIG4gPSBNQUdJQy5sZW5ndGg7ICsraSA8IG47KSB7XG4gICAgICAgIGlmIChNQUdJQ1tpXSAhPT0gYnVmZmVyW2luZGV4ICsgaV0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgbWFnaWNMZW5ndGggPSBNQUdJQy5sZW5ndGg7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IG1hZ2ljQW5kUGFkZGluZyA9IG1hZ2ljTGVuZ3RoICsgUEFERElORztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgbWFnaWNYMkFuZFBhZGRpbmcgPSBtYWdpY0xlbmd0aCAqIDIgKyBQQURESU5HO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXNzYWdlLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uICovXG5pbXBvcnQgeyBCbG9jayBhcyBfQmxvY2sgfSBmcm9tICcuLi8uLi9mYi9ibG9jay5tanMnO1xuaW1wb3J0IHsgRm9vdGVyIGFzIF9Gb290ZXIgfSBmcm9tICcuLi8uLi9mYi9mb290ZXIubWpzJztcbmltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJztcbnZhciBMb25nID0gZmxhdGJ1ZmZlcnMuTG9uZztcbnZhciBCdWlsZGVyID0gZmxhdGJ1ZmZlcnMuQnVpbGRlcjtcbnZhciBCeXRlQnVmZmVyID0gZmxhdGJ1ZmZlcnMuQnl0ZUJ1ZmZlcjtcbmltcG9ydCB7IFNjaGVtYSB9IGZyb20gJy4uLy4uL3NjaGVtYS5tanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFWZXJzaW9uIH0gZnJvbSAnLi4vLi4vZW51bS5tanMnO1xuaW1wb3J0IHsgdG9VaW50OEFycmF5IH0gZnJvbSAnLi4vLi4vdXRpbC9idWZmZXIubWpzJztcbi8qKiBAaWdub3JlICovXG5jbGFzcyBGb290ZXJfIHtcbiAgICBjb25zdHJ1Y3RvcihzY2hlbWEsIHZlcnNpb24gPSBNZXRhZGF0YVZlcnNpb24uVjQsIHJlY29yZEJhdGNoZXMsIGRpY3Rpb25hcnlCYXRjaGVzKSB7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICByZWNvcmRCYXRjaGVzICYmICh0aGlzLl9yZWNvcmRCYXRjaGVzID0gcmVjb3JkQmF0Y2hlcyk7XG4gICAgICAgIGRpY3Rpb25hcnlCYXRjaGVzICYmICh0aGlzLl9kaWN0aW9uYXJ5QmF0Y2hlcyA9IGRpY3Rpb25hcnlCYXRjaGVzKTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGRlY29kZShidWYpIHtcbiAgICAgICAgYnVmID0gbmV3IEJ5dGVCdWZmZXIodG9VaW50OEFycmF5KGJ1ZikpO1xuICAgICAgICBjb25zdCBmb290ZXIgPSBfRm9vdGVyLmdldFJvb3RBc0Zvb3RlcihidWYpO1xuICAgICAgICBjb25zdCBzY2hlbWEgPSBTY2hlbWEuZGVjb2RlKGZvb3Rlci5zY2hlbWEoKSk7XG4gICAgICAgIHJldHVybiBuZXcgT2ZmSGVhcEZvb3RlcihzY2hlbWEsIGZvb3Rlcik7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBlbmNvZGUoZm9vdGVyKSB7XG4gICAgICAgIGNvbnN0IGIgPSBuZXcgQnVpbGRlcigpO1xuICAgICAgICBjb25zdCBzY2hlbWFPZmZzZXQgPSBTY2hlbWEuZW5jb2RlKGIsIGZvb3Rlci5zY2hlbWEpO1xuICAgICAgICBfRm9vdGVyLnN0YXJ0UmVjb3JkQmF0Y2hlc1ZlY3RvcihiLCBmb290ZXIubnVtUmVjb3JkQmF0Y2hlcyk7XG4gICAgICAgIGZvciAoY29uc3QgcmIgb2YgWy4uLmZvb3Rlci5yZWNvcmRCYXRjaGVzKCldLnNsaWNlKCkucmV2ZXJzZSgpKSB7XG4gICAgICAgICAgICBGaWxlQmxvY2suZW5jb2RlKGIsIHJiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWNvcmRCYXRjaGVzT2Zmc2V0ID0gYi5lbmRWZWN0b3IoKTtcbiAgICAgICAgX0Zvb3Rlci5zdGFydERpY3Rpb25hcmllc1ZlY3RvcihiLCBmb290ZXIubnVtRGljdGlvbmFyaWVzKTtcbiAgICAgICAgZm9yIChjb25zdCBkYiBvZiBbLi4uZm9vdGVyLmRpY3Rpb25hcnlCYXRjaGVzKCldLnNsaWNlKCkucmV2ZXJzZSgpKSB7XG4gICAgICAgICAgICBGaWxlQmxvY2suZW5jb2RlKGIsIGRiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaWN0aW9uYXJ5QmF0Y2hlc09mZnNldCA9IGIuZW5kVmVjdG9yKCk7XG4gICAgICAgIF9Gb290ZXIuc3RhcnRGb290ZXIoYik7XG4gICAgICAgIF9Gb290ZXIuYWRkU2NoZW1hKGIsIHNjaGVtYU9mZnNldCk7XG4gICAgICAgIF9Gb290ZXIuYWRkVmVyc2lvbihiLCBNZXRhZGF0YVZlcnNpb24uVjQpO1xuICAgICAgICBfRm9vdGVyLmFkZFJlY29yZEJhdGNoZXMoYiwgcmVjb3JkQmF0Y2hlc09mZnNldCk7XG4gICAgICAgIF9Gb290ZXIuYWRkRGljdGlvbmFyaWVzKGIsIGRpY3Rpb25hcnlCYXRjaGVzT2Zmc2V0KTtcbiAgICAgICAgX0Zvb3Rlci5maW5pc2hGb290ZXJCdWZmZXIoYiwgX0Zvb3Rlci5lbmRGb290ZXIoYikpO1xuICAgICAgICByZXR1cm4gYi5hc1VpbnQ4QXJyYXkoKTtcbiAgICB9XG4gICAgZ2V0IG51bVJlY29yZEJhdGNoZXMoKSB7IHJldHVybiB0aGlzLl9yZWNvcmRCYXRjaGVzLmxlbmd0aDsgfVxuICAgIGdldCBudW1EaWN0aW9uYXJpZXMoKSB7IHJldHVybiB0aGlzLl9kaWN0aW9uYXJ5QmF0Y2hlcy5sZW5ndGg7IH1cbiAgICAqcmVjb3JkQmF0Y2hlcygpIHtcbiAgICAgICAgZm9yIChsZXQgYmxvY2ssIGkgPSAtMSwgbiA9IHRoaXMubnVtUmVjb3JkQmF0Y2hlczsgKytpIDwgbjspIHtcbiAgICAgICAgICAgIGlmIChibG9jayA9IHRoaXMuZ2V0UmVjb3JkQmF0Y2goaSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBibG9jaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAqZGljdGlvbmFyeUJhdGNoZXMoKSB7XG4gICAgICAgIGZvciAobGV0IGJsb2NrLCBpID0gLTEsIG4gPSB0aGlzLm51bURpY3Rpb25hcmllczsgKytpIDwgbjspIHtcbiAgICAgICAgICAgIGlmIChibG9jayA9IHRoaXMuZ2V0RGljdGlvbmFyeUJhdGNoKGkpKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgYmxvY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0UmVjb3JkQmF0Y2goaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4ID49IDBcbiAgICAgICAgICAgICYmIGluZGV4IDwgdGhpcy5udW1SZWNvcmRCYXRjaGVzXG4gICAgICAgICAgICAmJiB0aGlzLl9yZWNvcmRCYXRjaGVzW2luZGV4XSB8fCBudWxsO1xuICAgIH1cbiAgICBnZXREaWN0aW9uYXJ5QmF0Y2goaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4ID49IDBcbiAgICAgICAgICAgICYmIGluZGV4IDwgdGhpcy5udW1EaWN0aW9uYXJpZXNcbiAgICAgICAgICAgICYmIHRoaXMuX2RpY3Rpb25hcnlCYXRjaGVzW2luZGV4XSB8fCBudWxsO1xuICAgIH1cbn1cbmV4cG9ydCB7IEZvb3Rlcl8gYXMgRm9vdGVyIH07XG4vKiogQGlnbm9yZSAqL1xuY2xhc3MgT2ZmSGVhcEZvb3RlciBleHRlbmRzIEZvb3Rlcl8ge1xuICAgIGNvbnN0cnVjdG9yKHNjaGVtYSwgX2Zvb3Rlcikge1xuICAgICAgICBzdXBlcihzY2hlbWEsIF9mb290ZXIudmVyc2lvbigpKTtcbiAgICAgICAgdGhpcy5fZm9vdGVyID0gX2Zvb3RlcjtcbiAgICB9XG4gICAgZ2V0IG51bVJlY29yZEJhdGNoZXMoKSB7IHJldHVybiB0aGlzLl9mb290ZXIucmVjb3JkQmF0Y2hlc0xlbmd0aCgpOyB9XG4gICAgZ2V0IG51bURpY3Rpb25hcmllcygpIHsgcmV0dXJuIHRoaXMuX2Zvb3Rlci5kaWN0aW9uYXJpZXNMZW5ndGgoKTsgfVxuICAgIGdldFJlY29yZEJhdGNoKGluZGV4KSB7XG4gICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5udW1SZWNvcmRCYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlQmxvY2sgPSB0aGlzLl9mb290ZXIucmVjb3JkQmF0Y2hlcyhpbmRleCk7XG4gICAgICAgICAgICBpZiAoZmlsZUJsb2NrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZpbGVCbG9jay5kZWNvZGUoZmlsZUJsb2NrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZ2V0RGljdGlvbmFyeUJhdGNoKGluZGV4KSB7XG4gICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5udW1EaWN0aW9uYXJpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVCbG9jayA9IHRoaXMuX2Zvb3Rlci5kaWN0aW9uYXJpZXMoaW5kZXgpO1xuICAgICAgICAgICAgaWYgKGZpbGVCbG9jaykge1xuICAgICAgICAgICAgICAgIHJldHVybiBGaWxlQmxvY2suZGVjb2RlKGZpbGVCbG9jayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBGaWxlQmxvY2sge1xuICAgIGNvbnN0cnVjdG9yKG1ldGFEYXRhTGVuZ3RoLCBib2R5TGVuZ3RoLCBvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5tZXRhRGF0YUxlbmd0aCA9IG1ldGFEYXRhTGVuZ3RoO1xuICAgICAgICB0aGlzLm9mZnNldCA9IHR5cGVvZiBvZmZzZXQgPT09ICdudW1iZXInID8gb2Zmc2V0IDogb2Zmc2V0LmxvdztcbiAgICAgICAgdGhpcy5ib2R5TGVuZ3RoID0gdHlwZW9mIGJvZHlMZW5ndGggPT09ICdudW1iZXInID8gYm9keUxlbmd0aCA6IGJvZHlMZW5ndGgubG93O1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZGVjb2RlKGJsb2NrKSB7XG4gICAgICAgIHJldHVybiBuZXcgRmlsZUJsb2NrKGJsb2NrLm1ldGFEYXRhTGVuZ3RoKCksIGJsb2NrLmJvZHlMZW5ndGgoKSwgYmxvY2sub2Zmc2V0KCkpO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZW5jb2RlKGIsIGZpbGVCbG9jaykge1xuICAgICAgICBjb25zdCB7IG1ldGFEYXRhTGVuZ3RoIH0gPSBmaWxlQmxvY2s7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IG5ldyBMb25nKGZpbGVCbG9jay5vZmZzZXQsIDApO1xuICAgICAgICBjb25zdCBib2R5TGVuZ3RoID0gbmV3IExvbmcoZmlsZUJsb2NrLmJvZHlMZW5ndGgsIDApO1xuICAgICAgICByZXR1cm4gX0Jsb2NrLmNyZWF0ZUJsb2NrKGIsIG9mZnNldCwgbWV0YURhdGFMZW5ndGgsIGJvZHlMZW5ndGgpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmlsZS5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbi8qIGVzbGludC1kaXNhYmxlIGJyYWNlLXN0eWxlICovXG5pbXBvcnQgeyBTY2hlbWEsIEZpZWxkIH0gZnJvbSAnLi4vLi4vc2NoZW1hLm1qcyc7XG5pbXBvcnQgeyBEaWN0aW9uYXJ5LCBVdGY4LCBCaW5hcnksIERlY2ltYWwsIEZpeGVkU2l6ZUJpbmFyeSwgTGlzdCwgRml4ZWRTaXplTGlzdCwgTWFwXywgU3RydWN0LCBVbmlvbiwgQm9vbCwgTnVsbCwgSW50LCBGbG9hdCwgRGF0ZV8sIFRpbWUsIEludGVydmFsLCBUaW1lc3RhbXAsIEludDMyLCB9IGZyb20gJy4uLy4uL3R5cGUubWpzJztcbmltcG9ydCB7IERpY3Rpb25hcnlCYXRjaCwgUmVjb3JkQmF0Y2gsIEZpZWxkTm9kZSwgQnVmZmVyUmVnaW9uIH0gZnJvbSAnLi9tZXNzYWdlLm1qcyc7XG5pbXBvcnQgeyBUaW1lVW5pdCwgUHJlY2lzaW9uLCBJbnRlcnZhbFVuaXQsIFVuaW9uTW9kZSwgRGF0ZVVuaXQgfSBmcm9tICcuLi8uLi9lbnVtLm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjaGVtYUZyb21KU09OKF9zY2hlbWEsIGRpY3Rpb25hcmllcyA9IG5ldyBNYXAoKSkge1xuICAgIHJldHVybiBuZXcgU2NoZW1hKHNjaGVtYUZpZWxkc0Zyb21KU09OKF9zY2hlbWEsIGRpY3Rpb25hcmllcyksIGN1c3RvbU1ldGFkYXRhRnJvbUpTT04oX3NjaGVtYVsnY3VzdG9tTWV0YWRhdGEnXSksIGRpY3Rpb25hcmllcyk7XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEJhdGNoRnJvbUpTT04oYikge1xuICAgIHJldHVybiBuZXcgUmVjb3JkQmF0Y2goYlsnY291bnQnXSwgZmllbGROb2Rlc0Zyb21KU09OKGJbJ2NvbHVtbnMnXSksIGJ1ZmZlcnNGcm9tSlNPTihiWydjb2x1bW5zJ10pKTtcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgZnVuY3Rpb24gZGljdGlvbmFyeUJhdGNoRnJvbUpTT04oYikge1xuICAgIHJldHVybiBuZXcgRGljdGlvbmFyeUJhdGNoKHJlY29yZEJhdGNoRnJvbUpTT04oYlsnZGF0YSddKSwgYlsnaWQnXSwgYlsnaXNEZWx0YSddKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBzY2hlbWFGaWVsZHNGcm9tSlNPTihfc2NoZW1hLCBkaWN0aW9uYXJpZXMpIHtcbiAgICByZXR1cm4gKF9zY2hlbWFbJ2ZpZWxkcyddIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikubWFwKChmKSA9PiBGaWVsZC5mcm9tSlNPTihmLCBkaWN0aW9uYXJpZXMpKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBmaWVsZENoaWxkcmVuRnJvbUpTT04oX2ZpZWxkLCBkaWN0aW9uYXJpZXMpIHtcbiAgICByZXR1cm4gKF9maWVsZFsnY2hpbGRyZW4nXSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLm1hcCgoZikgPT4gRmllbGQuZnJvbUpTT04oZiwgZGljdGlvbmFyaWVzKSk7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZmllbGROb2Rlc0Zyb21KU09OKHhzKSB7XG4gICAgcmV0dXJuICh4cyB8fCBbXSkucmVkdWNlKChmaWVsZE5vZGVzLCBjb2x1bW4pID0+IFtcbiAgICAgICAgLi4uZmllbGROb2RlcyxcbiAgICAgICAgbmV3IEZpZWxkTm9kZShjb2x1bW5bJ2NvdW50J10sIG51bGxDb3VudEZyb21KU09OKGNvbHVtblsnVkFMSURJVFknXSkpLFxuICAgICAgICAuLi5maWVsZE5vZGVzRnJvbUpTT04oY29sdW1uWydjaGlsZHJlbiddKVxuICAgIF0sIFtdKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBidWZmZXJzRnJvbUpTT04oeHMsIGJ1ZmZlcnMgPSBbXSkge1xuICAgIGZvciAobGV0IGkgPSAtMSwgbiA9ICh4cyB8fCBbXSkubGVuZ3RoOyArK2kgPCBuOykge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB4c1tpXTtcbiAgICAgICAgY29sdW1uWydWQUxJRElUWSddICYmIGJ1ZmZlcnMucHVzaChuZXcgQnVmZmVyUmVnaW9uKGJ1ZmZlcnMubGVuZ3RoLCBjb2x1bW5bJ1ZBTElESVRZJ10ubGVuZ3RoKSk7XG4gICAgICAgIGNvbHVtblsnVFlQRSddICYmIGJ1ZmZlcnMucHVzaChuZXcgQnVmZmVyUmVnaW9uKGJ1ZmZlcnMubGVuZ3RoLCBjb2x1bW5bJ1RZUEUnXS5sZW5ndGgpKTtcbiAgICAgICAgY29sdW1uWydPRkZTRVQnXSAmJiBidWZmZXJzLnB1c2gobmV3IEJ1ZmZlclJlZ2lvbihidWZmZXJzLmxlbmd0aCwgY29sdW1uWydPRkZTRVQnXS5sZW5ndGgpKTtcbiAgICAgICAgY29sdW1uWydEQVRBJ10gJiYgYnVmZmVycy5wdXNoKG5ldyBCdWZmZXJSZWdpb24oYnVmZmVycy5sZW5ndGgsIGNvbHVtblsnREFUQSddLmxlbmd0aCkpO1xuICAgICAgICBidWZmZXJzID0gYnVmZmVyc0Zyb21KU09OKGNvbHVtblsnY2hpbGRyZW4nXSwgYnVmZmVycyk7XG4gICAgfVxuICAgIHJldHVybiBidWZmZXJzO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIG51bGxDb3VudEZyb21KU09OKHZhbGlkaXR5KSB7XG4gICAgcmV0dXJuICh2YWxpZGl0eSB8fCBbXSkucmVkdWNlKChzdW0sIHZhbCkgPT4gc3VtICsgKyh2YWwgPT09IDApLCAwKTtcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgZnVuY3Rpb24gZmllbGRGcm9tSlNPTihfZmllbGQsIGRpY3Rpb25hcmllcykge1xuICAgIGxldCBpZDtcbiAgICBsZXQga2V5cztcbiAgICBsZXQgZmllbGQ7XG4gICAgbGV0IGRpY3RNZXRhO1xuICAgIGxldCB0eXBlO1xuICAgIGxldCBkaWN0VHlwZTtcbiAgICAvLyBJZiBubyBkaWN0aW9uYXJ5IGVuY29kaW5nXG4gICAgaWYgKCFkaWN0aW9uYXJpZXMgfHwgIShkaWN0TWV0YSA9IF9maWVsZFsnZGljdGlvbmFyeSddKSkge1xuICAgICAgICB0eXBlID0gdHlwZUZyb21KU09OKF9maWVsZCwgZmllbGRDaGlsZHJlbkZyb21KU09OKF9maWVsZCwgZGljdGlvbmFyaWVzKSk7XG4gICAgICAgIGZpZWxkID0gbmV3IEZpZWxkKF9maWVsZFsnbmFtZSddLCB0eXBlLCBfZmllbGRbJ251bGxhYmxlJ10sIGN1c3RvbU1ldGFkYXRhRnJvbUpTT04oX2ZpZWxkWydjdXN0b21NZXRhZGF0YSddKSk7XG4gICAgfVxuICAgIC8vIElmIGRpY3Rpb25hcnkgZW5jb2RlZCBhbmQgdGhlIGZpcnN0IHRpbWUgd2UndmUgc2VlbiB0aGlzIGRpY3Rpb25hcnkgaWQsIGRlY29kZVxuICAgIC8vIHRoZSBkYXRhIHR5cGUgYW5kIGNoaWxkIGZpZWxkcywgdGhlbiB3cmFwIGluIGEgRGljdGlvbmFyeSB0eXBlIGFuZCBpbnNlcnQgdGhlXG4gICAgLy8gZGF0YSB0eXBlIGludG8gdGhlIGRpY3Rpb25hcnkgdHlwZXMgbWFwLlxuICAgIGVsc2UgaWYgKCFkaWN0aW9uYXJpZXMuaGFzKGlkID0gZGljdE1ldGFbJ2lkJ10pKSB7XG4gICAgICAgIC8vIGEgZGljdGlvbmFyeSBpbmRleCBkZWZhdWx0cyB0byBzaWduZWQgMzIgYml0IGludCBpZiB1bnNwZWNpZmllZFxuICAgICAgICBrZXlzID0gKGtleXMgPSBkaWN0TWV0YVsnaW5kZXhUeXBlJ10pID8gaW5kZXhUeXBlRnJvbUpTT04oa2V5cykgOiBuZXcgSW50MzIoKTtcbiAgICAgICAgZGljdGlvbmFyaWVzLnNldChpZCwgdHlwZSA9IHR5cGVGcm9tSlNPTihfZmllbGQsIGZpZWxkQ2hpbGRyZW5Gcm9tSlNPTihfZmllbGQsIGRpY3Rpb25hcmllcykpKTtcbiAgICAgICAgZGljdFR5cGUgPSBuZXcgRGljdGlvbmFyeSh0eXBlLCBrZXlzLCBpZCwgZGljdE1ldGFbJ2lzT3JkZXJlZCddKTtcbiAgICAgICAgZmllbGQgPSBuZXcgRmllbGQoX2ZpZWxkWyduYW1lJ10sIGRpY3RUeXBlLCBfZmllbGRbJ251bGxhYmxlJ10sIGN1c3RvbU1ldGFkYXRhRnJvbUpTT04oX2ZpZWxkWydjdXN0b21NZXRhZGF0YSddKSk7XG4gICAgfVxuICAgIC8vIElmIGRpY3Rpb25hcnkgZW5jb2RlZCwgYW5kIGhhdmUgYWxyZWFkeSBzZWVuIHRoaXMgZGljdGlvbmFyeSBJZCBpbiB0aGUgc2NoZW1hLCB0aGVuIHJldXNlIHRoZVxuICAgIC8vIGRhdGEgdHlwZSBhbmQgd3JhcCBpbiBhIG5ldyBEaWN0aW9uYXJ5IHR5cGUgYW5kIGZpZWxkLlxuICAgIGVsc2Uge1xuICAgICAgICAvLyBhIGRpY3Rpb25hcnkgaW5kZXggZGVmYXVsdHMgdG8gc2lnbmVkIDMyIGJpdCBpbnQgaWYgdW5zcGVjaWZpZWRcbiAgICAgICAga2V5cyA9IChrZXlzID0gZGljdE1ldGFbJ2luZGV4VHlwZSddKSA/IGluZGV4VHlwZUZyb21KU09OKGtleXMpIDogbmV3IEludDMyKCk7XG4gICAgICAgIGRpY3RUeXBlID0gbmV3IERpY3Rpb25hcnkoZGljdGlvbmFyaWVzLmdldChpZCksIGtleXMsIGlkLCBkaWN0TWV0YVsnaXNPcmRlcmVkJ10pO1xuICAgICAgICBmaWVsZCA9IG5ldyBGaWVsZChfZmllbGRbJ25hbWUnXSwgZGljdFR5cGUsIF9maWVsZFsnbnVsbGFibGUnXSwgY3VzdG9tTWV0YWRhdGFGcm9tSlNPTihfZmllbGRbJ2N1c3RvbU1ldGFkYXRhJ10pKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkIHx8IG51bGw7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gY3VzdG9tTWV0YWRhdGFGcm9tSlNPTihfbWV0YWRhdGEpIHtcbiAgICByZXR1cm4gbmV3IE1hcChPYmplY3QuZW50cmllcyhfbWV0YWRhdGEgfHwge30pKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBpbmRleFR5cGVGcm9tSlNPTihfdHlwZSkge1xuICAgIHJldHVybiBuZXcgSW50KF90eXBlWydpc1NpZ25lZCddLCBfdHlwZVsnYml0V2lkdGgnXSk7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gdHlwZUZyb21KU09OKGYsIGNoaWxkcmVuKSB7XG4gICAgY29uc3QgdHlwZUlkID0gZlsndHlwZSddWyduYW1lJ107XG4gICAgc3dpdGNoICh0eXBlSWQpIHtcbiAgICAgICAgY2FzZSAnTk9ORSc6IHJldHVybiBuZXcgTnVsbCgpO1xuICAgICAgICBjYXNlICdudWxsJzogcmV0dXJuIG5ldyBOdWxsKCk7XG4gICAgICAgIGNhc2UgJ2JpbmFyeSc6IHJldHVybiBuZXcgQmluYXJ5KCk7XG4gICAgICAgIGNhc2UgJ3V0ZjgnOiByZXR1cm4gbmV3IFV0ZjgoKTtcbiAgICAgICAgY2FzZSAnYm9vbCc6IHJldHVybiBuZXcgQm9vbCgpO1xuICAgICAgICBjYXNlICdsaXN0JzogcmV0dXJuIG5ldyBMaXN0KChjaGlsZHJlbiB8fCBbXSlbMF0pO1xuICAgICAgICBjYXNlICdzdHJ1Y3QnOiByZXR1cm4gbmV3IFN0cnVjdChjaGlsZHJlbiB8fCBbXSk7XG4gICAgICAgIGNhc2UgJ3N0cnVjdF8nOiByZXR1cm4gbmV3IFN0cnVjdChjaGlsZHJlbiB8fCBbXSk7XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZUlkKSB7XG4gICAgICAgIGNhc2UgJ2ludCc6IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBmWyd0eXBlJ107XG4gICAgICAgICAgICByZXR1cm4gbmV3IEludCh0Wydpc1NpZ25lZCddLCB0WydiaXRXaWR0aCddKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdmbG9hdGluZ3BvaW50Jzoge1xuICAgICAgICAgICAgY29uc3QgdCA9IGZbJ3R5cGUnXTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXQoUHJlY2lzaW9uW3RbJ3ByZWNpc2lvbiddXSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZGVjaW1hbCc6IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBmWyd0eXBlJ107XG4gICAgICAgICAgICByZXR1cm4gbmV3IERlY2ltYWwodFsnc2NhbGUnXSwgdFsncHJlY2lzaW9uJ10sIHRbJ2JpdFdpZHRoJ10pO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RhdGUnOiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZlsndHlwZSddO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlXyhEYXRlVW5pdFt0Wyd1bml0J11dKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0aW1lJzoge1xuICAgICAgICAgICAgY29uc3QgdCA9IGZbJ3R5cGUnXTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGltZShUaW1lVW5pdFt0Wyd1bml0J11dLCB0WydiaXRXaWR0aCddKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0aW1lc3RhbXAnOiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZlsndHlwZSddO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lc3RhbXAoVGltZVVuaXRbdFsndW5pdCddXSwgdFsndGltZXpvbmUnXSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaW50ZXJ2YWwnOiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZlsndHlwZSddO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlcnZhbChJbnRlcnZhbFVuaXRbdFsndW5pdCddXSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndW5pb24nOiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZlsndHlwZSddO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBVbmlvbihVbmlvbk1vZGVbdFsnbW9kZSddXSwgKHRbJ3R5cGVJZHMnXSB8fCBbXSksIGNoaWxkcmVuIHx8IFtdKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdmaXhlZHNpemViaW5hcnknOiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZlsndHlwZSddO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGaXhlZFNpemVCaW5hcnkodFsnYnl0ZVdpZHRoJ10pO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2ZpeGVkc2l6ZWxpc3QnOiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZlsndHlwZSddO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGaXhlZFNpemVMaXN0KHRbJ2xpc3RTaXplJ10sIChjaGlsZHJlbiB8fCBbXSlbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ21hcCc6IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBmWyd0eXBlJ107XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1hcF8oKGNoaWxkcmVuIHx8IFtdKVswXSwgdFsna2V5c1NvcnRlZCddKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCB0eXBlOiBcIiR7dHlwZUlkfVwiYCk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWpzb24ubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG4vKiBlc2xpbnQtZGlzYWJsZSBicmFjZS1zdHlsZSAqL1xuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuaW1wb3J0IHsgU2NoZW1hIGFzIF9TY2hlbWEgfSBmcm9tICcuLi8uLi9mYi9zY2hlbWEubWpzJztcbmltcG9ydCB7IEludCBhcyBfSW50IH0gZnJvbSAnLi4vLi4vZmIvaW50Lm1qcyc7XG5pbXBvcnQgeyBSZWNvcmRCYXRjaCBhcyBfUmVjb3JkQmF0Y2ggfSBmcm9tICcuLi8uLi9mYi9yZWNvcmQtYmF0Y2gubWpzJztcbmltcG9ydCB7IERpY3Rpb25hcnlCYXRjaCBhcyBfRGljdGlvbmFyeUJhdGNoIH0gZnJvbSAnLi4vLi4vZmIvZGljdGlvbmFyeS1iYXRjaC5tanMnO1xuaW1wb3J0IHsgQnVmZmVyIGFzIF9CdWZmZXIgfSBmcm9tICcuLi8uLi9mYi9idWZmZXIubWpzJztcbmltcG9ydCB7IEZpZWxkIGFzIF9GaWVsZCB9IGZyb20gJy4uLy4uL2ZiL2ZpZWxkLm1qcyc7XG5pbXBvcnQgeyBGaWVsZE5vZGUgYXMgX0ZpZWxkTm9kZSB9IGZyb20gJy4uLy4uL2ZiL2ZpZWxkLW5vZGUubWpzJztcbmltcG9ydCB7IFR5cGUgfSBmcm9tICcuLi8uLi9mYi90eXBlLm1qcyc7XG5pbXBvcnQgeyBLZXlWYWx1ZSBhcyBfS2V5VmFsdWUgfSBmcm9tICcuLi8uLi9mYi9rZXktdmFsdWUubWpzJztcbmltcG9ydCB7IEVuZGlhbm5lc3MgYXMgX0VuZGlhbm5lc3MgfSBmcm9tICcuLi8uLi9mYi9lbmRpYW5uZXNzLm1qcyc7XG5pbXBvcnQgeyBGbG9hdGluZ1BvaW50IGFzIF9GbG9hdGluZ1BvaW50IH0gZnJvbSAnLi4vLi4vZmIvZmxvYXRpbmctcG9pbnQubWpzJztcbmltcG9ydCB7IERlY2ltYWwgYXMgX0RlY2ltYWwgfSBmcm9tICcuLi8uLi9mYi9kZWNpbWFsLm1qcyc7XG5pbXBvcnQgeyBEYXRlIGFzIF9EYXRlIH0gZnJvbSAnLi4vLi4vZmIvZGF0ZS5tanMnO1xuaW1wb3J0IHsgVGltZSBhcyBfVGltZSB9IGZyb20gJy4uLy4uL2ZiL3RpbWUubWpzJztcbmltcG9ydCB7IFRpbWVzdGFtcCBhcyBfVGltZXN0YW1wIH0gZnJvbSAnLi4vLi4vZmIvdGltZXN0YW1wLm1qcyc7XG5pbXBvcnQgeyBJbnRlcnZhbCBhcyBfSW50ZXJ2YWwgfSBmcm9tICcuLi8uLi9mYi9pbnRlcnZhbC5tanMnO1xuaW1wb3J0IHsgVW5pb24gYXMgX1VuaW9uIH0gZnJvbSAnLi4vLi4vZmIvdW5pb24ubWpzJztcbmltcG9ydCB7IEZpeGVkU2l6ZUJpbmFyeSBhcyBfRml4ZWRTaXplQmluYXJ5IH0gZnJvbSAnLi4vLi4vZmIvZml4ZWQtc2l6ZS1iaW5hcnkubWpzJztcbmltcG9ydCB7IEZpeGVkU2l6ZUxpc3QgYXMgX0ZpeGVkU2l6ZUxpc3QgfSBmcm9tICcuLi8uLi9mYi9maXhlZC1zaXplLWxpc3QubWpzJztcbmltcG9ydCB7IE1hcCBhcyBfTWFwIH0gZnJvbSAnLi4vLi4vZmIvbWFwLm1qcyc7XG5pbXBvcnQgeyBNZXNzYWdlIGFzIF9NZXNzYWdlIH0gZnJvbSAnLi4vLi4vZmIvbWVzc2FnZS5tanMnO1xuaW1wb3J0IHsgU2NoZW1hLCBGaWVsZCB9IGZyb20gJy4uLy4uL3NjaGVtYS5tanMnO1xuaW1wb3J0IHsgdG9VaW50OEFycmF5IH0gZnJvbSAnLi4vLi4vdXRpbC9idWZmZXIubWpzJztcbmltcG9ydCB7IE1lc3NhZ2VIZWFkZXIsIE1ldGFkYXRhVmVyc2lvbiB9IGZyb20gJy4uLy4uL2VudW0ubWpzJztcbmltcG9ydCB7IGluc3RhbmNlIGFzIHR5cGVBc3NlbWJsZXIgfSBmcm9tICcuLi8uLi92aXNpdG9yL3R5cGVhc3NlbWJsZXIubWpzJztcbmltcG9ydCB7IGZpZWxkRnJvbUpTT04sIHNjaGVtYUZyb21KU09OLCByZWNvcmRCYXRjaEZyb21KU09OLCBkaWN0aW9uYXJ5QmF0Y2hGcm9tSlNPTiB9IGZyb20gJy4vanNvbi5tanMnO1xudmFyIExvbmcgPSBmbGF0YnVmZmVycy5Mb25nO1xudmFyIEJ1aWxkZXIgPSBmbGF0YnVmZmVycy5CdWlsZGVyO1xudmFyIEJ5dGVCdWZmZXIgPSBmbGF0YnVmZmVycy5CeXRlQnVmZmVyO1xuaW1wb3J0IHsgRGF0YVR5cGUsIERpY3Rpb25hcnksIFV0ZjgsIEJpbmFyeSwgRGVjaW1hbCwgRml4ZWRTaXplQmluYXJ5LCBMaXN0LCBGaXhlZFNpemVMaXN0LCBNYXBfLCBTdHJ1Y3QsIFVuaW9uLCBCb29sLCBOdWxsLCBJbnQsIEZsb2F0LCBEYXRlXywgVGltZSwgSW50ZXJ2YWwsIFRpbWVzdGFtcCwgSW50MzIsIH0gZnJvbSAnLi4vLi4vdHlwZS5tanMnO1xuLyoqXG4gKiBAaWdub3JlXG4gKiBAcHJpdmF0ZVxuICoqL1xuZXhwb3J0IGNsYXNzIE1lc3NhZ2Uge1xuICAgIGNvbnN0cnVjdG9yKGJvZHlMZW5ndGgsIHZlcnNpb24sIGhlYWRlclR5cGUsIGhlYWRlcikge1xuICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5faGVhZGVyVHlwZSA9IGhlYWRlclR5cGU7XG4gICAgICAgIHRoaXMuYm9keSA9IG5ldyBVaW50OEFycmF5KDApO1xuICAgICAgICBoZWFkZXIgJiYgKHRoaXMuX2NyZWF0ZUhlYWRlciA9ICgpID0+IGhlYWRlcik7XG4gICAgICAgIHRoaXMuX2JvZHlMZW5ndGggPSB0eXBlb2YgYm9keUxlbmd0aCA9PT0gJ251bWJlcicgPyBib2R5TGVuZ3RoIDogYm9keUxlbmd0aC5sb3c7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihtc2csIGhlYWRlclR5cGUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKDAsIE1ldGFkYXRhVmVyc2lvbi5WNCwgaGVhZGVyVHlwZSk7XG4gICAgICAgIG1lc3NhZ2UuX2NyZWF0ZUhlYWRlciA9IG1lc3NhZ2VIZWFkZXJGcm9tSlNPTihtc2csIGhlYWRlclR5cGUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGRlY29kZShidWYpIHtcbiAgICAgICAgYnVmID0gbmV3IEJ5dGVCdWZmZXIodG9VaW50OEFycmF5KGJ1ZikpO1xuICAgICAgICBjb25zdCBfbWVzc2FnZSA9IF9NZXNzYWdlLmdldFJvb3RBc01lc3NhZ2UoYnVmKTtcbiAgICAgICAgY29uc3QgYm9keUxlbmd0aCA9IF9tZXNzYWdlLmJvZHlMZW5ndGgoKTtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IF9tZXNzYWdlLnZlcnNpb24oKTtcbiAgICAgICAgY29uc3QgaGVhZGVyVHlwZSA9IF9tZXNzYWdlLmhlYWRlclR5cGUoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKGJvZHlMZW5ndGgsIHZlcnNpb24sIGhlYWRlclR5cGUpO1xuICAgICAgICBtZXNzYWdlLl9jcmVhdGVIZWFkZXIgPSBkZWNvZGVNZXNzYWdlSGVhZGVyKF9tZXNzYWdlLCBoZWFkZXJUeXBlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBlbmNvZGUobWVzc2FnZSkge1xuICAgICAgICBjb25zdCBiID0gbmV3IEJ1aWxkZXIoKTtcbiAgICAgICAgbGV0IGhlYWRlck9mZnNldCA9IC0xO1xuICAgICAgICBpZiAobWVzc2FnZS5pc1NjaGVtYSgpKSB7XG4gICAgICAgICAgICBoZWFkZXJPZmZzZXQgPSBTY2hlbWEuZW5jb2RlKGIsIG1lc3NhZ2UuaGVhZGVyKCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuaXNSZWNvcmRCYXRjaCgpKSB7XG4gICAgICAgICAgICBoZWFkZXJPZmZzZXQgPSBSZWNvcmRCYXRjaC5lbmNvZGUoYiwgbWVzc2FnZS5oZWFkZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWVzc2FnZS5pc0RpY3Rpb25hcnlCYXRjaCgpKSB7XG4gICAgICAgICAgICBoZWFkZXJPZmZzZXQgPSBEaWN0aW9uYXJ5QmF0Y2guZW5jb2RlKGIsIG1lc3NhZ2UuaGVhZGVyKCkpO1xuICAgICAgICB9XG4gICAgICAgIF9NZXNzYWdlLnN0YXJ0TWVzc2FnZShiKTtcbiAgICAgICAgX01lc3NhZ2UuYWRkVmVyc2lvbihiLCBNZXRhZGF0YVZlcnNpb24uVjQpO1xuICAgICAgICBfTWVzc2FnZS5hZGRIZWFkZXIoYiwgaGVhZGVyT2Zmc2V0KTtcbiAgICAgICAgX01lc3NhZ2UuYWRkSGVhZGVyVHlwZShiLCBtZXNzYWdlLmhlYWRlclR5cGUpO1xuICAgICAgICBfTWVzc2FnZS5hZGRCb2R5TGVuZ3RoKGIsIG5ldyBMb25nKG1lc3NhZ2UuYm9keUxlbmd0aCwgMCkpO1xuICAgICAgICBfTWVzc2FnZS5maW5pc2hNZXNzYWdlQnVmZmVyKGIsIF9NZXNzYWdlLmVuZE1lc3NhZ2UoYikpO1xuICAgICAgICByZXR1cm4gYi5hc1VpbnQ4QXJyYXkoKTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGZyb20oaGVhZGVyLCBib2R5TGVuZ3RoID0gMCkge1xuICAgICAgICBpZiAoaGVhZGVyIGluc3RhbmNlb2YgU2NoZW1hKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2UoMCwgTWV0YWRhdGFWZXJzaW9uLlY0LCBNZXNzYWdlSGVhZGVyLlNjaGVtYSwgaGVhZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVhZGVyIGluc3RhbmNlb2YgUmVjb3JkQmF0Y2gpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZShib2R5TGVuZ3RoLCBNZXRhZGF0YVZlcnNpb24uVjQsIE1lc3NhZ2VIZWFkZXIuUmVjb3JkQmF0Y2gsIGhlYWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlYWRlciBpbnN0YW5jZW9mIERpY3Rpb25hcnlCYXRjaCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlKGJvZHlMZW5ndGgsIE1ldGFkYXRhVmVyc2lvbi5WNCwgTWVzc2FnZUhlYWRlci5EaWN0aW9uYXJ5QmF0Y2gsIGhlYWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgTWVzc2FnZSBoZWFkZXI6ICR7aGVhZGVyfWApO1xuICAgIH1cbiAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuaGVhZGVyVHlwZTsgfVxuICAgIGdldCB2ZXJzaW9uKCkgeyByZXR1cm4gdGhpcy5fdmVyc2lvbjsgfVxuICAgIGdldCBoZWFkZXJUeXBlKCkgeyByZXR1cm4gdGhpcy5faGVhZGVyVHlwZTsgfVxuICAgIGdldCBib2R5TGVuZ3RoKCkgeyByZXR1cm4gdGhpcy5fYm9keUxlbmd0aDsgfVxuICAgIGhlYWRlcigpIHsgcmV0dXJuIHRoaXMuX2NyZWF0ZUhlYWRlcigpOyB9XG4gICAgaXNTY2hlbWEoKSB7IHJldHVybiB0aGlzLmhlYWRlclR5cGUgPT09IE1lc3NhZ2VIZWFkZXIuU2NoZW1hOyB9XG4gICAgaXNSZWNvcmRCYXRjaCgpIHsgcmV0dXJuIHRoaXMuaGVhZGVyVHlwZSA9PT0gTWVzc2FnZUhlYWRlci5SZWNvcmRCYXRjaDsgfVxuICAgIGlzRGljdGlvbmFyeUJhdGNoKCkgeyByZXR1cm4gdGhpcy5oZWFkZXJUeXBlID09PSBNZXNzYWdlSGVhZGVyLkRpY3Rpb25hcnlCYXRjaDsgfVxufVxuLyoqXG4gKiBAaWdub3JlXG4gKiBAcHJpdmF0ZVxuICoqL1xuZXhwb3J0IGNsYXNzIFJlY29yZEJhdGNoIHtcbiAgICBjb25zdHJ1Y3RvcihsZW5ndGgsIG5vZGVzLCBidWZmZXJzKSB7XG4gICAgICAgIHRoaXMuX25vZGVzID0gbm9kZXM7XG4gICAgICAgIHRoaXMuX2J1ZmZlcnMgPSBidWZmZXJzO1xuICAgICAgICB0aGlzLl9sZW5ndGggPSB0eXBlb2YgbGVuZ3RoID09PSAnbnVtYmVyJyA/IGxlbmd0aCA6IGxlbmd0aC5sb3c7XG4gICAgfVxuICAgIGdldCBub2RlcygpIHsgcmV0dXJuIHRoaXMuX25vZGVzOyB9XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMuX2xlbmd0aDsgfVxuICAgIGdldCBidWZmZXJzKCkgeyByZXR1cm4gdGhpcy5fYnVmZmVyczsgfVxufVxuLyoqXG4gKiBAaWdub3JlXG4gKiBAcHJpdmF0ZVxuICoqL1xuZXhwb3J0IGNsYXNzIERpY3Rpb25hcnlCYXRjaCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSwgaWQsIGlzRGVsdGEgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5faXNEZWx0YSA9IGlzRGVsdGE7XG4gICAgICAgIHRoaXMuX2lkID0gdHlwZW9mIGlkID09PSAnbnVtYmVyJyA/IGlkIDogaWQubG93O1xuICAgIH1cbiAgICBnZXQgaWQoKSB7IHJldHVybiB0aGlzLl9pZDsgfVxuICAgIGdldCBkYXRhKCkgeyByZXR1cm4gdGhpcy5fZGF0YTsgfVxuICAgIGdldCBpc0RlbHRhKCkgeyByZXR1cm4gdGhpcy5faXNEZWx0YTsgfVxuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLmRhdGEubGVuZ3RoOyB9XG4gICAgZ2V0IG5vZGVzKCkgeyByZXR1cm4gdGhpcy5kYXRhLm5vZGVzOyB9XG4gICAgZ2V0IGJ1ZmZlcnMoKSB7IHJldHVybiB0aGlzLmRhdGEuYnVmZmVyczsgfVxufVxuLyoqXG4gKiBAaWdub3JlXG4gKiBAcHJpdmF0ZVxuICoqL1xuZXhwb3J0IGNsYXNzIEJ1ZmZlclJlZ2lvbiB7XG4gICAgY29uc3RydWN0b3Iob2Zmc2V0LCBsZW5ndGgpIHtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSB0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJyA/IG9mZnNldCA6IG9mZnNldC5sb3c7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gdHlwZW9mIGxlbmd0aCA9PT0gJ251bWJlcicgPyBsZW5ndGggOiBsZW5ndGgubG93O1xuICAgIH1cbn1cbi8qKlxuICogQGlnbm9yZVxuICogQHByaXZhdGVcbiAqKi9cbmV4cG9ydCBjbGFzcyBGaWVsZE5vZGUge1xuICAgIGNvbnN0cnVjdG9yKGxlbmd0aCwgbnVsbENvdW50KSB7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gdHlwZW9mIGxlbmd0aCA9PT0gJ251bWJlcicgPyBsZW5ndGggOiBsZW5ndGgubG93O1xuICAgICAgICB0aGlzLm51bGxDb3VudCA9IHR5cGVvZiBudWxsQ291bnQgPT09ICdudW1iZXInID8gbnVsbENvdW50IDogbnVsbENvdW50LmxvdztcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gbWVzc2FnZUhlYWRlckZyb21KU09OKG1lc3NhZ2UsIHR5cGUpIHtcbiAgICByZXR1cm4gKCgpID0+IHtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIE1lc3NhZ2VIZWFkZXIuU2NoZW1hOiByZXR1cm4gU2NoZW1hLmZyb21KU09OKG1lc3NhZ2UpO1xuICAgICAgICAgICAgY2FzZSBNZXNzYWdlSGVhZGVyLlJlY29yZEJhdGNoOiByZXR1cm4gUmVjb3JkQmF0Y2guZnJvbUpTT04obWVzc2FnZSk7XG4gICAgICAgICAgICBjYXNlIE1lc3NhZ2VIZWFkZXIuRGljdGlvbmFyeUJhdGNoOiByZXR1cm4gRGljdGlvbmFyeUJhdGNoLmZyb21KU09OKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIE1lc3NhZ2UgdHlwZTogeyBuYW1lOiAke01lc3NhZ2VIZWFkZXJbdHlwZV19LCB0eXBlOiAke3R5cGV9IH1gKTtcbiAgICB9KTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBkZWNvZGVNZXNzYWdlSGVhZGVyKG1lc3NhZ2UsIHR5cGUpIHtcbiAgICByZXR1cm4gKCgpID0+IHtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIE1lc3NhZ2VIZWFkZXIuU2NoZW1hOiByZXR1cm4gU2NoZW1hLmRlY29kZShtZXNzYWdlLmhlYWRlcihuZXcgX1NjaGVtYSgpKSk7XG4gICAgICAgICAgICBjYXNlIE1lc3NhZ2VIZWFkZXIuUmVjb3JkQmF0Y2g6IHJldHVybiBSZWNvcmRCYXRjaC5kZWNvZGUobWVzc2FnZS5oZWFkZXIobmV3IF9SZWNvcmRCYXRjaCgpKSwgbWVzc2FnZS52ZXJzaW9uKCkpO1xuICAgICAgICAgICAgY2FzZSBNZXNzYWdlSGVhZGVyLkRpY3Rpb25hcnlCYXRjaDogcmV0dXJuIERpY3Rpb25hcnlCYXRjaC5kZWNvZGUobWVzc2FnZS5oZWFkZXIobmV3IF9EaWN0aW9uYXJ5QmF0Y2goKSksIG1lc3NhZ2UudmVyc2lvbigpKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBNZXNzYWdlIHR5cGU6IHsgbmFtZTogJHtNZXNzYWdlSGVhZGVyW3R5cGVdfSwgdHlwZTogJHt0eXBlfSB9YCk7XG4gICAgfSk7XG59XG5GaWVsZFsnZW5jb2RlJ10gPSBlbmNvZGVGaWVsZDtcbkZpZWxkWydkZWNvZGUnXSA9IGRlY29kZUZpZWxkO1xuRmllbGRbJ2Zyb21KU09OJ10gPSBmaWVsZEZyb21KU09OO1xuU2NoZW1hWydlbmNvZGUnXSA9IGVuY29kZVNjaGVtYTtcblNjaGVtYVsnZGVjb2RlJ10gPSBkZWNvZGVTY2hlbWE7XG5TY2hlbWFbJ2Zyb21KU09OJ10gPSBzY2hlbWFGcm9tSlNPTjtcblJlY29yZEJhdGNoWydlbmNvZGUnXSA9IGVuY29kZVJlY29yZEJhdGNoO1xuUmVjb3JkQmF0Y2hbJ2RlY29kZSddID0gZGVjb2RlUmVjb3JkQmF0Y2g7XG5SZWNvcmRCYXRjaFsnZnJvbUpTT04nXSA9IHJlY29yZEJhdGNoRnJvbUpTT047XG5EaWN0aW9uYXJ5QmF0Y2hbJ2VuY29kZSddID0gZW5jb2RlRGljdGlvbmFyeUJhdGNoO1xuRGljdGlvbmFyeUJhdGNoWydkZWNvZGUnXSA9IGRlY29kZURpY3Rpb25hcnlCYXRjaDtcbkRpY3Rpb25hcnlCYXRjaFsnZnJvbUpTT04nXSA9IGRpY3Rpb25hcnlCYXRjaEZyb21KU09OO1xuRmllbGROb2RlWydlbmNvZGUnXSA9IGVuY29kZUZpZWxkTm9kZTtcbkZpZWxkTm9kZVsnZGVjb2RlJ10gPSBkZWNvZGVGaWVsZE5vZGU7XG5CdWZmZXJSZWdpb25bJ2VuY29kZSddID0gZW5jb2RlQnVmZmVyUmVnaW9uO1xuQnVmZmVyUmVnaW9uWydkZWNvZGUnXSA9IGRlY29kZUJ1ZmZlclJlZ2lvbjtcbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBkZWNvZGVTY2hlbWEoX3NjaGVtYSwgZGljdGlvbmFyaWVzID0gbmV3IE1hcCgpKSB7XG4gICAgY29uc3QgZmllbGRzID0gZGVjb2RlU2NoZW1hRmllbGRzKF9zY2hlbWEsIGRpY3Rpb25hcmllcyk7XG4gICAgcmV0dXJuIG5ldyBTY2hlbWEoZmllbGRzLCBkZWNvZGVDdXN0b21NZXRhZGF0YShfc2NoZW1hKSwgZGljdGlvbmFyaWVzKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBkZWNvZGVSZWNvcmRCYXRjaChiYXRjaCwgdmVyc2lvbiA9IE1ldGFkYXRhVmVyc2lvbi5WNCkge1xuICAgIGlmIChiYXRjaC5jb21wcmVzc2lvbigpICE9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVjb3JkIGJhdGNoIGNvbXByZXNzaW9uIG5vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFJlY29yZEJhdGNoKGJhdGNoLmxlbmd0aCgpLCBkZWNvZGVGaWVsZE5vZGVzKGJhdGNoKSwgZGVjb2RlQnVmZmVycyhiYXRjaCwgdmVyc2lvbikpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGRlY29kZURpY3Rpb25hcnlCYXRjaChiYXRjaCwgdmVyc2lvbiA9IE1ldGFkYXRhVmVyc2lvbi5WNCkge1xuICAgIHJldHVybiBuZXcgRGljdGlvbmFyeUJhdGNoKFJlY29yZEJhdGNoLmRlY29kZShiYXRjaC5kYXRhKCksIHZlcnNpb24pLCBiYXRjaC5pZCgpLCBiYXRjaC5pc0RlbHRhKCkpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGRlY29kZUJ1ZmZlclJlZ2lvbihiKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXJSZWdpb24oYi5vZmZzZXQoKSwgYi5sZW5ndGgoKSk7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZGVjb2RlRmllbGROb2RlKGYpIHtcbiAgICByZXR1cm4gbmV3IEZpZWxkTm9kZShmLmxlbmd0aCgpLCBmLm51bGxDb3VudCgpKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBkZWNvZGVGaWVsZE5vZGVzKGJhdGNoKSB7XG4gICAgY29uc3Qgbm9kZXMgPSBbXTtcbiAgICBmb3IgKGxldCBmLCBpID0gLTEsIGogPSAtMSwgbiA9IGJhdGNoLm5vZGVzTGVuZ3RoKCk7ICsraSA8IG47KSB7XG4gICAgICAgIGlmIChmID0gYmF0Y2gubm9kZXMoaSkpIHtcbiAgICAgICAgICAgIG5vZGVzWysral0gPSBGaWVsZE5vZGUuZGVjb2RlKGYpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub2Rlcztcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBkZWNvZGVCdWZmZXJzKGJhdGNoLCB2ZXJzaW9uKSB7XG4gICAgY29uc3QgYnVmZmVyUmVnaW9ucyA9IFtdO1xuICAgIGZvciAobGV0IGIsIGkgPSAtMSwgaiA9IC0xLCBuID0gYmF0Y2guYnVmZmVyc0xlbmd0aCgpOyArK2kgPCBuOykge1xuICAgICAgICBpZiAoYiA9IGJhdGNoLmJ1ZmZlcnMoaSkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoaXMgQXJyb3cgYnVmZmVyIHdhcyB3cml0dGVuIGJlZm9yZSB2ZXJzaW9uIDQsXG4gICAgICAgICAgICAvLyBhZHZhbmNlIHRoZSBidWZmZXIncyBiYl9wb3MgOCBieXRlcyB0byBza2lwIHBhc3RcbiAgICAgICAgICAgIC8vIHRoZSBub3ctcmVtb3ZlZCBwYWdlX2lkIGZpZWxkXG4gICAgICAgICAgICBpZiAodmVyc2lvbiA8IE1ldGFkYXRhVmVyc2lvbi5WNCkge1xuICAgICAgICAgICAgICAgIGIuYmJfcG9zICs9ICg4ICogKGkgKyAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWZmZXJSZWdpb25zWysral0gPSBCdWZmZXJSZWdpb24uZGVjb2RlKGIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBidWZmZXJSZWdpb25zO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGRlY29kZVNjaGVtYUZpZWxkcyhzY2hlbWEsIGRpY3Rpb25hcmllcykge1xuICAgIGNvbnN0IGZpZWxkcyA9IFtdO1xuICAgIGZvciAobGV0IGYsIGkgPSAtMSwgaiA9IC0xLCBuID0gc2NoZW1hLmZpZWxkc0xlbmd0aCgpOyArK2kgPCBuOykge1xuICAgICAgICBpZiAoZiA9IHNjaGVtYS5maWVsZHMoaSkpIHtcbiAgICAgICAgICAgIGZpZWxkc1srK2pdID0gRmllbGQuZGVjb2RlKGYsIGRpY3Rpb25hcmllcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkcztcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBkZWNvZGVGaWVsZENoaWxkcmVuKGZpZWxkLCBkaWN0aW9uYXJpZXMpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IFtdO1xuICAgIGZvciAobGV0IGYsIGkgPSAtMSwgaiA9IC0xLCBuID0gZmllbGQuY2hpbGRyZW5MZW5ndGgoKTsgKytpIDwgbjspIHtcbiAgICAgICAgaWYgKGYgPSBmaWVsZC5jaGlsZHJlbihpKSkge1xuICAgICAgICAgICAgY2hpbGRyZW5bKytqXSA9IEZpZWxkLmRlY29kZShmLCBkaWN0aW9uYXJpZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaGlsZHJlbjtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBkZWNvZGVGaWVsZChmLCBkaWN0aW9uYXJpZXMpIHtcbiAgICBsZXQgaWQ7XG4gICAgbGV0IGZpZWxkO1xuICAgIGxldCB0eXBlO1xuICAgIGxldCBrZXlzO1xuICAgIGxldCBkaWN0VHlwZTtcbiAgICBsZXQgZGljdE1ldGE7XG4gICAgLy8gSWYgbm8gZGljdGlvbmFyeSBlbmNvZGluZ1xuICAgIGlmICghZGljdGlvbmFyaWVzIHx8ICEoZGljdE1ldGEgPSBmLmRpY3Rpb25hcnkoKSkpIHtcbiAgICAgICAgdHlwZSA9IGRlY29kZUZpZWxkVHlwZShmLCBkZWNvZGVGaWVsZENoaWxkcmVuKGYsIGRpY3Rpb25hcmllcykpO1xuICAgICAgICBmaWVsZCA9IG5ldyBGaWVsZChmLm5hbWUoKSwgdHlwZSwgZi5udWxsYWJsZSgpLCBkZWNvZGVDdXN0b21NZXRhZGF0YShmKSk7XG4gICAgfVxuICAgIC8vIElmIGRpY3Rpb25hcnkgZW5jb2RlZCBhbmQgdGhlIGZpcnN0IHRpbWUgd2UndmUgc2VlbiB0aGlzIGRpY3Rpb25hcnkgaWQsIGRlY29kZVxuICAgIC8vIHRoZSBkYXRhIHR5cGUgYW5kIGNoaWxkIGZpZWxkcywgdGhlbiB3cmFwIGluIGEgRGljdGlvbmFyeSB0eXBlIGFuZCBpbnNlcnQgdGhlXG4gICAgLy8gZGF0YSB0eXBlIGludG8gdGhlIGRpY3Rpb25hcnkgdHlwZXMgbWFwLlxuICAgIGVsc2UgaWYgKCFkaWN0aW9uYXJpZXMuaGFzKGlkID0gZGljdE1ldGEuaWQoKS5sb3cpKSB7XG4gICAgICAgIC8vIGEgZGljdGlvbmFyeSBpbmRleCBkZWZhdWx0cyB0byBzaWduZWQgMzIgYml0IGludCBpZiB1bnNwZWNpZmllZFxuICAgICAgICBrZXlzID0gKGtleXMgPSBkaWN0TWV0YS5pbmRleFR5cGUoKSkgPyBkZWNvZGVJbmRleFR5cGUoa2V5cykgOiBuZXcgSW50MzIoKTtcbiAgICAgICAgZGljdGlvbmFyaWVzLnNldChpZCwgdHlwZSA9IGRlY29kZUZpZWxkVHlwZShmLCBkZWNvZGVGaWVsZENoaWxkcmVuKGYsIGRpY3Rpb25hcmllcykpKTtcbiAgICAgICAgZGljdFR5cGUgPSBuZXcgRGljdGlvbmFyeSh0eXBlLCBrZXlzLCBpZCwgZGljdE1ldGEuaXNPcmRlcmVkKCkpO1xuICAgICAgICBmaWVsZCA9IG5ldyBGaWVsZChmLm5hbWUoKSwgZGljdFR5cGUsIGYubnVsbGFibGUoKSwgZGVjb2RlQ3VzdG9tTWV0YWRhdGEoZikpO1xuICAgIH1cbiAgICAvLyBJZiBkaWN0aW9uYXJ5IGVuY29kZWQsIGFuZCBoYXZlIGFscmVhZHkgc2VlbiB0aGlzIGRpY3Rpb25hcnkgSWQgaW4gdGhlIHNjaGVtYSwgdGhlbiByZXVzZSB0aGVcbiAgICAvLyBkYXRhIHR5cGUgYW5kIHdyYXAgaW4gYSBuZXcgRGljdGlvbmFyeSB0eXBlIGFuZCBmaWVsZC5cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gYSBkaWN0aW9uYXJ5IGluZGV4IGRlZmF1bHRzIHRvIHNpZ25lZCAzMiBiaXQgaW50IGlmIHVuc3BlY2lmaWVkXG4gICAgICAgIGtleXMgPSAoa2V5cyA9IGRpY3RNZXRhLmluZGV4VHlwZSgpKSA/IGRlY29kZUluZGV4VHlwZShrZXlzKSA6IG5ldyBJbnQzMigpO1xuICAgICAgICBkaWN0VHlwZSA9IG5ldyBEaWN0aW9uYXJ5KGRpY3Rpb25hcmllcy5nZXQoaWQpLCBrZXlzLCBpZCwgZGljdE1ldGEuaXNPcmRlcmVkKCkpO1xuICAgICAgICBmaWVsZCA9IG5ldyBGaWVsZChmLm5hbWUoKSwgZGljdFR5cGUsIGYubnVsbGFibGUoKSwgZGVjb2RlQ3VzdG9tTWV0YWRhdGEoZikpO1xuICAgIH1cbiAgICByZXR1cm4gZmllbGQgfHwgbnVsbDtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBkZWNvZGVDdXN0b21NZXRhZGF0YShwYXJlbnQpIHtcbiAgICBjb25zdCBkYXRhID0gbmV3IE1hcCgpO1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgZm9yIChsZXQgZW50cnksIGtleSwgaSA9IC0xLCBuID0gTWF0aC50cnVuYyhwYXJlbnQuY3VzdG9tTWV0YWRhdGFMZW5ndGgoKSk7ICsraSA8IG47KSB7XG4gICAgICAgICAgICBpZiAoKGVudHJ5ID0gcGFyZW50LmN1c3RvbU1ldGFkYXRhKGkpKSAmJiAoa2V5ID0gZW50cnkua2V5KCkpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkYXRhLnNldChrZXksIGVudHJ5LnZhbHVlKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGRlY29kZUluZGV4VHlwZShfdHlwZSkge1xuICAgIHJldHVybiBuZXcgSW50KF90eXBlLmlzU2lnbmVkKCksIF90eXBlLmJpdFdpZHRoKCkpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGRlY29kZUZpZWxkVHlwZShmLCBjaGlsZHJlbikge1xuICAgIGNvbnN0IHR5cGVJZCA9IGYudHlwZVR5cGUoKTtcbiAgICBzd2l0Y2ggKHR5cGVJZCkge1xuICAgICAgICBjYXNlIFR5cGVbJ05PTkUnXTogcmV0dXJuIG5ldyBOdWxsKCk7XG4gICAgICAgIGNhc2UgVHlwZVsnTnVsbCddOiByZXR1cm4gbmV3IE51bGwoKTtcbiAgICAgICAgY2FzZSBUeXBlWydCaW5hcnknXTogcmV0dXJuIG5ldyBCaW5hcnkoKTtcbiAgICAgICAgY2FzZSBUeXBlWydVdGY4J106IHJldHVybiBuZXcgVXRmOCgpO1xuICAgICAgICBjYXNlIFR5cGVbJ0Jvb2wnXTogcmV0dXJuIG5ldyBCb29sKCk7XG4gICAgICAgIGNhc2UgVHlwZVsnTGlzdCddOiByZXR1cm4gbmV3IExpc3QoKGNoaWxkcmVuIHx8IFtdKVswXSk7XG4gICAgICAgIGNhc2UgVHlwZVsnU3RydWN0XyddOiByZXR1cm4gbmV3IFN0cnVjdChjaGlsZHJlbiB8fCBbXSk7XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZUlkKSB7XG4gICAgICAgIGNhc2UgVHlwZVsnSW50J106IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBmLnR5cGUobmV3IF9JbnQoKSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEludCh0LmlzU2lnbmVkKCksIHQuYml0V2lkdGgoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBUeXBlWydGbG9hdGluZ1BvaW50J106IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBmLnR5cGUobmV3IF9GbG9hdGluZ1BvaW50KCkpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdCh0LnByZWNpc2lvbigpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFR5cGVbJ0RlY2ltYWwnXToge1xuICAgICAgICAgICAgY29uc3QgdCA9IGYudHlwZShuZXcgX0RlY2ltYWwoKSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERlY2ltYWwodC5zY2FsZSgpLCB0LnByZWNpc2lvbigpLCB0LmJpdFdpZHRoKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgVHlwZVsnRGF0ZSddOiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZi50eXBlKG5ldyBfRGF0ZSgpKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZV8odC51bml0KCkpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgVHlwZVsnVGltZSddOiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZi50eXBlKG5ldyBfVGltZSgpKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGltZSh0LnVuaXQoKSwgdC5iaXRXaWR0aCgpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFR5cGVbJ1RpbWVzdGFtcCddOiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZi50eXBlKG5ldyBfVGltZXN0YW1wKCkpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lc3RhbXAodC51bml0KCksIHQudGltZXpvbmUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBUeXBlWydJbnRlcnZhbCddOiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZi50eXBlKG5ldyBfSW50ZXJ2YWwoKSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEludGVydmFsKHQudW5pdCgpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFR5cGVbJ1VuaW9uJ106IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBmLnR5cGUobmV3IF9VbmlvbigpKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVW5pb24odC5tb2RlKCksIHQudHlwZUlkc0FycmF5KCkgfHwgW10sIGNoaWxkcmVuIHx8IFtdKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFR5cGVbJ0ZpeGVkU2l6ZUJpbmFyeSddOiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZi50eXBlKG5ldyBfRml4ZWRTaXplQmluYXJ5KCkpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGaXhlZFNpemVCaW5hcnkodC5ieXRlV2lkdGgoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBUeXBlWydGaXhlZFNpemVMaXN0J106IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBmLnR5cGUobmV3IF9GaXhlZFNpemVMaXN0KCkpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGaXhlZFNpemVMaXN0KHQubGlzdFNpemUoKSwgKGNoaWxkcmVuIHx8IFtdKVswXSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBUeXBlWydNYXAnXToge1xuICAgICAgICAgICAgY29uc3QgdCA9IGYudHlwZShuZXcgX01hcCgpKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTWFwXygoY2hpbGRyZW4gfHwgW10pWzBdLCB0LmtleXNTb3J0ZWQoKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgdHlwZTogXCIke1R5cGVbdHlwZUlkXX1cIiAoJHt0eXBlSWR9KWApO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGVuY29kZVNjaGVtYShiLCBzY2hlbWEpIHtcbiAgICBjb25zdCBmaWVsZE9mZnNldHMgPSBzY2hlbWEuZmllbGRzLm1hcCgoZikgPT4gRmllbGQuZW5jb2RlKGIsIGYpKTtcbiAgICBfU2NoZW1hLnN0YXJ0RmllbGRzVmVjdG9yKGIsIGZpZWxkT2Zmc2V0cy5sZW5ndGgpO1xuICAgIGNvbnN0IGZpZWxkc1ZlY3Rvck9mZnNldCA9IF9TY2hlbWEuY3JlYXRlRmllbGRzVmVjdG9yKGIsIGZpZWxkT2Zmc2V0cyk7XG4gICAgY29uc3QgbWV0YWRhdGFPZmZzZXQgPSAhKHNjaGVtYS5tZXRhZGF0YSAmJiBzY2hlbWEubWV0YWRhdGEuc2l6ZSA+IDApID8gLTEgOlxuICAgICAgICBfU2NoZW1hLmNyZWF0ZUN1c3RvbU1ldGFkYXRhVmVjdG9yKGIsIFsuLi5zY2hlbWEubWV0YWRhdGFdLm1hcCgoW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBiLmNyZWF0ZVN0cmluZyhgJHtrfWApO1xuICAgICAgICAgICAgY29uc3QgdmFsID0gYi5jcmVhdGVTdHJpbmcoYCR7dn1gKTtcbiAgICAgICAgICAgIF9LZXlWYWx1ZS5zdGFydEtleVZhbHVlKGIpO1xuICAgICAgICAgICAgX0tleVZhbHVlLmFkZEtleShiLCBrZXkpO1xuICAgICAgICAgICAgX0tleVZhbHVlLmFkZFZhbHVlKGIsIHZhbCk7XG4gICAgICAgICAgICByZXR1cm4gX0tleVZhbHVlLmVuZEtleVZhbHVlKGIpO1xuICAgICAgICB9KSk7XG4gICAgX1NjaGVtYS5zdGFydFNjaGVtYShiKTtcbiAgICBfU2NoZW1hLmFkZEZpZWxkcyhiLCBmaWVsZHNWZWN0b3JPZmZzZXQpO1xuICAgIF9TY2hlbWEuYWRkRW5kaWFubmVzcyhiLCBwbGF0Zm9ybUlzTGl0dGxlRW5kaWFuID8gX0VuZGlhbm5lc3MuTGl0dGxlIDogX0VuZGlhbm5lc3MuQmlnKTtcbiAgICBpZiAobWV0YWRhdGFPZmZzZXQgIT09IC0xKSB7XG4gICAgICAgIF9TY2hlbWEuYWRkQ3VzdG9tTWV0YWRhdGEoYiwgbWV0YWRhdGFPZmZzZXQpO1xuICAgIH1cbiAgICByZXR1cm4gX1NjaGVtYS5lbmRTY2hlbWEoYik7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZW5jb2RlRmllbGQoYiwgZmllbGQpIHtcbiAgICBsZXQgbmFtZU9mZnNldCA9IC0xO1xuICAgIGxldCB0eXBlT2Zmc2V0ID0gLTE7XG4gICAgbGV0IGRpY3Rpb25hcnlPZmZzZXQgPSAtMTtcbiAgICBjb25zdCB0eXBlID0gZmllbGQudHlwZTtcbiAgICBsZXQgdHlwZUlkID0gZmllbGQudHlwZUlkO1xuICAgIGlmICghRGF0YVR5cGUuaXNEaWN0aW9uYXJ5KHR5cGUpKSB7XG4gICAgICAgIHR5cGVPZmZzZXQgPSB0eXBlQXNzZW1ibGVyLnZpc2l0KHR5cGUsIGIpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdHlwZUlkID0gdHlwZS5kaWN0aW9uYXJ5LnR5cGVJZDtcbiAgICAgICAgZGljdGlvbmFyeU9mZnNldCA9IHR5cGVBc3NlbWJsZXIudmlzaXQodHlwZSwgYik7XG4gICAgICAgIHR5cGVPZmZzZXQgPSB0eXBlQXNzZW1ibGVyLnZpc2l0KHR5cGUuZGljdGlvbmFyeSwgYik7XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkT2Zmc2V0cyA9ICh0eXBlLmNoaWxkcmVuIHx8IFtdKS5tYXAoKGYpID0+IEZpZWxkLmVuY29kZShiLCBmKSk7XG4gICAgY29uc3QgY2hpbGRyZW5WZWN0b3JPZmZzZXQgPSBfRmllbGQuY3JlYXRlQ2hpbGRyZW5WZWN0b3IoYiwgY2hpbGRPZmZzZXRzKTtcbiAgICBjb25zdCBtZXRhZGF0YU9mZnNldCA9ICEoZmllbGQubWV0YWRhdGEgJiYgZmllbGQubWV0YWRhdGEuc2l6ZSA+IDApID8gLTEgOlxuICAgICAgICBfRmllbGQuY3JlYXRlQ3VzdG9tTWV0YWRhdGFWZWN0b3IoYiwgWy4uLmZpZWxkLm1ldGFkYXRhXS5tYXAoKFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gYi5jcmVhdGVTdHJpbmcoYCR7a31gKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IGIuY3JlYXRlU3RyaW5nKGAke3Z9YCk7XG4gICAgICAgICAgICBfS2V5VmFsdWUuc3RhcnRLZXlWYWx1ZShiKTtcbiAgICAgICAgICAgIF9LZXlWYWx1ZS5hZGRLZXkoYiwga2V5KTtcbiAgICAgICAgICAgIF9LZXlWYWx1ZS5hZGRWYWx1ZShiLCB2YWwpO1xuICAgICAgICAgICAgcmV0dXJuIF9LZXlWYWx1ZS5lbmRLZXlWYWx1ZShiKTtcbiAgICAgICAgfSkpO1xuICAgIGlmIChmaWVsZC5uYW1lKSB7XG4gICAgICAgIG5hbWVPZmZzZXQgPSBiLmNyZWF0ZVN0cmluZyhmaWVsZC5uYW1lKTtcbiAgICB9XG4gICAgX0ZpZWxkLnN0YXJ0RmllbGQoYik7XG4gICAgX0ZpZWxkLmFkZFR5cGUoYiwgdHlwZU9mZnNldCk7XG4gICAgX0ZpZWxkLmFkZFR5cGVUeXBlKGIsIHR5cGVJZCk7XG4gICAgX0ZpZWxkLmFkZENoaWxkcmVuKGIsIGNoaWxkcmVuVmVjdG9yT2Zmc2V0KTtcbiAgICBfRmllbGQuYWRkTnVsbGFibGUoYiwgISFmaWVsZC5udWxsYWJsZSk7XG4gICAgaWYgKG5hbWVPZmZzZXQgIT09IC0xKSB7XG4gICAgICAgIF9GaWVsZC5hZGROYW1lKGIsIG5hbWVPZmZzZXQpO1xuICAgIH1cbiAgICBpZiAoZGljdGlvbmFyeU9mZnNldCAhPT0gLTEpIHtcbiAgICAgICAgX0ZpZWxkLmFkZERpY3Rpb25hcnkoYiwgZGljdGlvbmFyeU9mZnNldCk7XG4gICAgfVxuICAgIGlmIChtZXRhZGF0YU9mZnNldCAhPT0gLTEpIHtcbiAgICAgICAgX0ZpZWxkLmFkZEN1c3RvbU1ldGFkYXRhKGIsIG1ldGFkYXRhT2Zmc2V0KTtcbiAgICB9XG4gICAgcmV0dXJuIF9GaWVsZC5lbmRGaWVsZChiKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBlbmNvZGVSZWNvcmRCYXRjaChiLCByZWNvcmRCYXRjaCkge1xuICAgIGNvbnN0IG5vZGVzID0gcmVjb3JkQmF0Y2gubm9kZXMgfHwgW107XG4gICAgY29uc3QgYnVmZmVycyA9IHJlY29yZEJhdGNoLmJ1ZmZlcnMgfHwgW107XG4gICAgX1JlY29yZEJhdGNoLnN0YXJ0Tm9kZXNWZWN0b3IoYiwgbm9kZXMubGVuZ3RoKTtcbiAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMuc2xpY2UoKS5yZXZlcnNlKCkpXG4gICAgICAgIEZpZWxkTm9kZS5lbmNvZGUoYiwgbik7XG4gICAgY29uc3Qgbm9kZXNWZWN0b3JPZmZzZXQgPSBiLmVuZFZlY3RvcigpO1xuICAgIF9SZWNvcmRCYXRjaC5zdGFydEJ1ZmZlcnNWZWN0b3IoYiwgYnVmZmVycy5sZW5ndGgpO1xuICAgIGZvciAoY29uc3QgYl8gb2YgYnVmZmVycy5zbGljZSgpLnJldmVyc2UoKSlcbiAgICAgICAgQnVmZmVyUmVnaW9uLmVuY29kZShiLCBiXyk7XG4gICAgY29uc3QgYnVmZmVyc1ZlY3Rvck9mZnNldCA9IGIuZW5kVmVjdG9yKCk7XG4gICAgX1JlY29yZEJhdGNoLnN0YXJ0UmVjb3JkQmF0Y2goYik7XG4gICAgX1JlY29yZEJhdGNoLmFkZExlbmd0aChiLCBuZXcgTG9uZyhyZWNvcmRCYXRjaC5sZW5ndGgsIDApKTtcbiAgICBfUmVjb3JkQmF0Y2guYWRkTm9kZXMoYiwgbm9kZXNWZWN0b3JPZmZzZXQpO1xuICAgIF9SZWNvcmRCYXRjaC5hZGRCdWZmZXJzKGIsIGJ1ZmZlcnNWZWN0b3JPZmZzZXQpO1xuICAgIHJldHVybiBfUmVjb3JkQmF0Y2guZW5kUmVjb3JkQmF0Y2goYik7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZW5jb2RlRGljdGlvbmFyeUJhdGNoKGIsIGRpY3Rpb25hcnlCYXRjaCkge1xuICAgIGNvbnN0IGRhdGFPZmZzZXQgPSBSZWNvcmRCYXRjaC5lbmNvZGUoYiwgZGljdGlvbmFyeUJhdGNoLmRhdGEpO1xuICAgIF9EaWN0aW9uYXJ5QmF0Y2guc3RhcnREaWN0aW9uYXJ5QmF0Y2goYik7XG4gICAgX0RpY3Rpb25hcnlCYXRjaC5hZGRJZChiLCBuZXcgTG9uZyhkaWN0aW9uYXJ5QmF0Y2guaWQsIDApKTtcbiAgICBfRGljdGlvbmFyeUJhdGNoLmFkZElzRGVsdGEoYiwgZGljdGlvbmFyeUJhdGNoLmlzRGVsdGEpO1xuICAgIF9EaWN0aW9uYXJ5QmF0Y2guYWRkRGF0YShiLCBkYXRhT2Zmc2V0KTtcbiAgICByZXR1cm4gX0RpY3Rpb25hcnlCYXRjaC5lbmREaWN0aW9uYXJ5QmF0Y2goYik7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZW5jb2RlRmllbGROb2RlKGIsIG5vZGUpIHtcbiAgICByZXR1cm4gX0ZpZWxkTm9kZS5jcmVhdGVGaWVsZE5vZGUoYiwgbmV3IExvbmcobm9kZS5sZW5ndGgsIDApLCBuZXcgTG9uZyhub2RlLm51bGxDb3VudCwgMCkpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGVuY29kZUJ1ZmZlclJlZ2lvbihiLCBub2RlKSB7XG4gICAgcmV0dXJuIF9CdWZmZXIuY3JlYXRlQnVmZmVyKGIsIG5ldyBMb25nKG5vZGUub2Zmc2V0LCAwKSwgbmV3IExvbmcobm9kZS5sZW5ndGgsIDApKTtcbn1cbi8qKiBAaWdub3JlICovXG5jb25zdCBwbGF0Zm9ybUlzTGl0dGxlRW5kaWFuID0gKCgpID0+IHtcbiAgICBjb25zdCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoMik7XG4gICAgbmV3IERhdGFWaWV3KGJ1ZmZlcikuc2V0SW50MTYoMCwgMjU2LCB0cnVlIC8qIGxpdHRsZUVuZGlhbiAqLyk7XG4gICAgLy8gSW50MTZBcnJheSB1c2VzIHRoZSBwbGF0Zm9ybSdzIGVuZGlhbm5lc3MuXG4gICAgcmV0dXJuIG5ldyBJbnQxNkFycmF5KGJ1ZmZlcilbMF0gPT09IDI1Njtcbn0pKCk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lc3NhZ2UubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBfX2FzeW5jRGVsZWdhdG9yLCBfX2FzeW5jR2VuZXJhdG9yLCBfX2FzeW5jVmFsdWVzLCBfX2F3YWl0LCBfX2F3YWl0ZXIgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IG1ha2VEYXRhIH0gZnJvbSAnLi4vZGF0YS5tanMnO1xuaW1wb3J0IHsgVmVjdG9yIH0gZnJvbSAnLi4vdmVjdG9yLm1qcyc7XG5pbXBvcnQgeyBTdHJ1Y3QgfSBmcm9tICcuLi90eXBlLm1qcyc7XG5pbXBvcnQgeyBNZXNzYWdlSGVhZGVyIH0gZnJvbSAnLi4vZW51bS5tanMnO1xuaW1wb3J0IHsgRm9vdGVyIH0gZnJvbSAnLi9tZXRhZGF0YS9maWxlLm1qcyc7XG5pbXBvcnQgc3RyZWFtQWRhcHRlcnMgZnJvbSAnLi4vaW8vYWRhcHRlcnMubWpzJztcbmltcG9ydCB7IEJ5dGVTdHJlYW0sIEFzeW5jQnl0ZVN0cmVhbSB9IGZyb20gJy4uL2lvL3N0cmVhbS5tanMnO1xuaW1wb3J0IHsgUmFuZG9tQWNjZXNzRmlsZSwgQXN5bmNSYW5kb21BY2Nlc3NGaWxlIH0gZnJvbSAnLi4vaW8vZmlsZS5tanMnO1xuaW1wb3J0IHsgVmVjdG9yTG9hZGVyLCBKU09OVmVjdG9yTG9hZGVyIH0gZnJvbSAnLi4vdmlzaXRvci92ZWN0b3Jsb2FkZXIubWpzJztcbmltcG9ydCB7IFJlY29yZEJhdGNoLCBfSW50ZXJuYWxFbXB0eVBsYWNlaG9sZGVyUmVjb3JkQmF0Y2ggfSBmcm9tICcuLi9yZWNvcmRiYXRjaC5tanMnO1xuaW1wb3J0IHsgSVRFUkFUT1JfRE9ORSwgUmVhZGFibGVJbnRlcm9wLCB9IGZyb20gJy4uL2lvL2ludGVyZmFjZXMubWpzJztcbmltcG9ydCB7IE1lc3NhZ2VSZWFkZXIsIEFzeW5jTWVzc2FnZVJlYWRlciwgSlNPTk1lc3NhZ2VSZWFkZXIsIGNoZWNrRm9yTWFnaWNBcnJvd1N0cmluZywgbWFnaWNMZW5ndGgsIG1hZ2ljQW5kUGFkZGluZywgbWFnaWNYMkFuZFBhZGRpbmcgfSBmcm9tICcuL21lc3NhZ2UubWpzJztcbmltcG9ydCB7IGlzUHJvbWlzZSwgaXNJdGVyYWJsZSwgaXNBc3luY0l0ZXJhYmxlLCBpc0l0ZXJhdG9yUmVzdWx0LCBpc0Fycm93SlNPTiwgaXNGaWxlSGFuZGxlLCBpc0ZldGNoUmVzcG9uc2UsIGlzUmVhZGFibGVET01TdHJlYW0sIGlzUmVhZGFibGVOb2RlU3RyZWFtIH0gZnJvbSAnLi4vdXRpbC9jb21wYXQubWpzJztcbmV4cG9ydCBjbGFzcyBSZWNvcmRCYXRjaFJlYWRlciBleHRlbmRzIFJlYWRhYmxlSW50ZXJvcCB7XG4gICAgY29uc3RydWN0b3IoaW1wbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9pbXBsID0gaW1wbDtcbiAgICB9XG4gICAgZ2V0IGNsb3NlZCgpIHsgcmV0dXJuIHRoaXMuX2ltcGwuY2xvc2VkOyB9XG4gICAgZ2V0IHNjaGVtYSgpIHsgcmV0dXJuIHRoaXMuX2ltcGwuc2NoZW1hOyB9XG4gICAgZ2V0IGF1dG9EZXN0cm95KCkgeyByZXR1cm4gdGhpcy5faW1wbC5hdXRvRGVzdHJveTsgfVxuICAgIGdldCBkaWN0aW9uYXJpZXMoKSB7IHJldHVybiB0aGlzLl9pbXBsLmRpY3Rpb25hcmllczsgfVxuICAgIGdldCBudW1EaWN0aW9uYXJpZXMoKSB7IHJldHVybiB0aGlzLl9pbXBsLm51bURpY3Rpb25hcmllczsgfVxuICAgIGdldCBudW1SZWNvcmRCYXRjaGVzKCkgeyByZXR1cm4gdGhpcy5faW1wbC5udW1SZWNvcmRCYXRjaGVzOyB9XG4gICAgZ2V0IGZvb3RlcigpIHsgcmV0dXJuIHRoaXMuX2ltcGwuaXNGaWxlKCkgPyB0aGlzLl9pbXBsLmZvb3RlciA6IG51bGw7IH1cbiAgICBpc1N5bmMoKSB7IHJldHVybiB0aGlzLl9pbXBsLmlzU3luYygpOyB9XG4gICAgaXNBc3luYygpIHsgcmV0dXJuIHRoaXMuX2ltcGwuaXNBc3luYygpOyB9XG4gICAgaXNGaWxlKCkgeyByZXR1cm4gdGhpcy5faW1wbC5pc0ZpbGUoKTsgfVxuICAgIGlzU3RyZWFtKCkgeyByZXR1cm4gdGhpcy5faW1wbC5pc1N0cmVhbSgpOyB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ltcGwubmV4dCgpO1xuICAgIH1cbiAgICB0aHJvdyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW1wbC50aHJvdyh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW1wbC5yZXR1cm4odmFsdWUpO1xuICAgIH1cbiAgICBjYW5jZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbXBsLmNhbmNlbCgpO1xuICAgIH1cbiAgICByZXNldChzY2hlbWEpIHtcbiAgICAgICAgdGhpcy5faW1wbC5yZXNldChzY2hlbWEpO1xuICAgICAgICB0aGlzLl9ET01TdHJlYW0gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX25vZGVTdHJlYW0gPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBvcGVuKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3BlbmluZyA9IHRoaXMuX2ltcGwub3BlbihvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIGlzUHJvbWlzZShvcGVuaW5nKSA/IG9wZW5pbmcudGhlbigoKSA9PiB0aGlzKSA6IHRoaXM7XG4gICAgfVxuICAgIHJlYWRSZWNvcmRCYXRjaChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW1wbC5pc0ZpbGUoKSA/IHRoaXMuX2ltcGwucmVhZFJlY29yZEJhdGNoKGluZGV4KSA6IG51bGw7XG4gICAgfVxuICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW1wbFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgfVxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbXBsW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICAgIH1cbiAgICB0b0RPTVN0cmVhbSgpIHtcbiAgICAgICAgcmV0dXJuIHN0cmVhbUFkYXB0ZXJzLnRvRE9NU3RyZWFtKCh0aGlzLmlzU3luYygpXG4gICAgICAgICAgICA/IHsgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHRoaXMgfVxuICAgICAgICAgICAgOiB7IFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHRoaXMgfSkpO1xuICAgIH1cbiAgICB0b05vZGVTdHJlYW0oKSB7XG4gICAgICAgIHJldHVybiBzdHJlYW1BZGFwdGVycy50b05vZGVTdHJlYW0oKHRoaXMuaXNTeW5jKClcbiAgICAgICAgICAgID8geyBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4gdGhpcyB9XG4gICAgICAgICAgICA6IHsgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gdGhpcyB9KSwgeyBvYmplY3RNb2RlOiB0cnVlIH0pO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgc3RhdGljIHRocm91Z2hOb2RlKG9wdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcInRocm91Z2hOb2RlXCIgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50YCk7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyB0aHJvdWdoRE9NKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3cml0YWJsZVN0cmF0ZWd5LCBcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmVhZGFibGVTdHJhdGVneSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwidGhyb3VnaERPTVwiIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudGApO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbShzb3VyY2UpIHtcbiAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFJlY29yZEJhdGNoUmVhZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQXJyb3dKU09OKHNvdXJjZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmcm9tQXJyb3dKU09OKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNGaWxlSGFuZGxlKHNvdXJjZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmcm9tRmlsZUhhbmRsZShzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUHJvbWlzZShzb3VyY2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gKCgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsgcmV0dXJuIHlpZWxkIFJlY29yZEJhdGNoUmVhZGVyLmZyb20oeWllbGQgc291cmNlKTsgfSkpKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNGZXRjaFJlc3BvbnNlKHNvdXJjZSkgfHwgaXNSZWFkYWJsZURPTVN0cmVhbShzb3VyY2UpIHx8IGlzUmVhZGFibGVOb2RlU3RyZWFtKHNvdXJjZSkgfHwgaXNBc3luY0l0ZXJhYmxlKHNvdXJjZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmcm9tQXN5bmNCeXRlU3RyZWFtKG5ldyBBc3luY0J5dGVTdHJlYW0oc291cmNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZyb21CeXRlU3RyZWFtKG5ldyBCeXRlU3RyZWFtKHNvdXJjZSkpO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgcmVhZEFsbChzb3VyY2UpIHtcbiAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFJlY29yZEJhdGNoUmVhZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlLmlzU3luYygpID8gcmVhZEFsbFN5bmMoc291cmNlKSA6IHJlYWRBbGxBc3luYyhzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQXJyb3dKU09OKHNvdXJjZSkgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KHNvdXJjZSkgfHwgaXNJdGVyYWJsZShzb3VyY2UpIHx8IGlzSXRlcmF0b3JSZXN1bHQoc291cmNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlYWRBbGxTeW5jKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlYWRBbGxBc3luYyhzb3VyY2UpO1xuICAgIH1cbn1cbi8vXG4vLyBTaW5jZSBUUyBpcyBhIHN0cnVjdHVyYWwgdHlwZSBzeXN0ZW0sIHdlIGRlZmluZSB0aGUgZm9sbG93aW5nIHN1YmNsYXNzIHN0dWJzXG4vLyBzbyB0aGF0IGNvbmNyZXRlIHR5cGVzIGV4aXN0IHRvIGFzc29jaWF0ZSB3aXRoIHdpdGggdGhlIGludGVyZmFjZXMgYmVsb3cuXG4vL1xuLy8gVGhlIGltcGxlbWVudGF0aW9uIGZvciBlYWNoIFJlY29yZEJhdGNoUmVhZGVyIGlzIGhpZGRlbiBhd2F5IGluIHRoZSBzZXQgb2Zcbi8vIGBSZWNvcmRCYXRjaFJlYWRlckltcGxgIGNsYXNzZXMgaW4gdGhlIHNlY29uZCBoYWxmIG9mIHRoaXMgZmlsZS4gVGhpcyBhbGxvd3Ncbi8vIHVzIHRvIGV4cG9ydCBhIHNpbmdsZSBSZWNvcmRCYXRjaFJlYWRlciBjbGFzcywgYW5kIHN3YXAgb3V0IHRoZSBpbXBsIGJhc2VkXG4vLyBvbiB0aGUgaW8gcHJpbWl0aXZlcyBvciB1bmRlcmx5aW5nIGFycm93IChKU09OLCBmaWxlLCBvciBzdHJlYW0pIGF0IHJ1bnRpbWUuXG4vL1xuLy8gQXN5bmMvYXdhaXQgbWFrZXMgb3VyIGpvYiBhIGJpdCBoYXJkZXIsIHNpbmNlIGl0IGZvcmNlcyBldmVyeXRoaW5nIHRvIGJlXG4vLyBlaXRoZXIgZnVsbHkgc3luYyBvciBmdWxseSBhc3luYy4gVGhpcyBpcyB3aHkgdGhlIGxvZ2ljIGZvciB0aGUgcmVhZGVyIGltcGxzXG4vLyBoYXMgYmVlbiBkdXBsaWNhdGVkIGludG8gYm90aCBzeW5jIGFuZCBhc3luYyB2YXJpYW50cy4gU2luY2UgdGhlIFJCUlxuLy8gZGVsZWdhdGVzIHRvIGl0cyBpbXBsLCBhbiBSQlIgd2l0aCBhbiBBc3luY1JlY29yZEJhdGNoRmlsZVJlYWRlckltcGwgZm9yXG4vLyBleGFtcGxlIHdpbGwgcmV0dXJuIGFzeW5jL2F3YWl0LWZyaWVuZGx5IFByb21pc2VzLCBidXQgb25lIHdpdGggYSAoc3luYylcbi8vIFJlY29yZEJhdGNoU3RyZWFtUmVhZGVySW1wbCB3aWxsIGFsd2F5cyByZXR1cm4gdmFsdWVzLiBOb3RoaW5nIHNob3VsZCBiZVxuLy8gZGlmZmVyZW50IGFib3V0IHRoZWlyIGxvZ2ljLCBhc2lkZSBmcm9tIHRoZSBhc3luYyBoYW5kbGluZy4gVGhpcyBpcyBhbHNvIHdoeVxuLy8gdGhpcyBjb2RlIGxvb2tzIGhpZ2hseSBzdHJ1Y3R1cmVkLCBhcyBpdCBzaG91bGQgYmUgbmVhcmx5IGlkZW50aWNhbCBhbmQgZWFzeVxuLy8gdG8gZm9sbG93LlxuLy9cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgUmVjb3JkQmF0Y2hTdHJlYW1SZWFkZXIgZXh0ZW5kcyBSZWNvcmRCYXRjaFJlYWRlciB7XG4gICAgY29uc3RydWN0b3IoX2ltcGwpIHtcbiAgICAgICAgc3VwZXIoX2ltcGwpO1xuICAgICAgICB0aGlzLl9pbXBsID0gX2ltcGw7XG4gICAgfVxuICAgIHJlYWRBbGwoKSB7IHJldHVybiBbLi4udGhpc107IH1cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHsgcmV0dXJuIHRoaXMuX2ltcGxbU3ltYm9sLml0ZXJhdG9yXSgpOyB9XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHsgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogX2EoKSB7IHlpZWxkIF9fYXdhaXQoeWllbGQqIF9fYXN5bmNEZWxlZ2F0b3IoX19hc3luY1ZhbHVlcyh0aGlzW1N5bWJvbC5pdGVyYXRvcl0oKSkpKTsgfSk7IH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgQXN5bmNSZWNvcmRCYXRjaFN0cmVhbVJlYWRlciBleHRlbmRzIFJlY29yZEJhdGNoUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihfaW1wbCkge1xuICAgICAgICBzdXBlcihfaW1wbCk7XG4gICAgICAgIHRoaXMuX2ltcGwgPSBfaW1wbDtcbiAgICB9XG4gICAgcmVhZEFsbCgpIHtcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBiYXRjaGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9iID0gX19hc3luY1ZhbHVlcyh0aGlzKSwgX2M7IF9jID0geWllbGQgX2IubmV4dCgpLCAhX2MuZG9uZTspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmF0Y2ggPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYmF0Y2hlcy5wdXNoKGJhdGNoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIHlpZWxkIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYmF0Y2hlcztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkgeyB0aHJvdyBuZXcgRXJyb3IoYEFzeW5jUmVjb3JkQmF0Y2hTdHJlYW1SZWFkZXIgaXMgbm90IEl0ZXJhYmxlYCk7IH1cbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkgeyByZXR1cm4gdGhpcy5faW1wbFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBSZWNvcmRCYXRjaEZpbGVSZWFkZXIgZXh0ZW5kcyBSZWNvcmRCYXRjaFN0cmVhbVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IoX2ltcGwpIHtcbiAgICAgICAgc3VwZXIoX2ltcGwpO1xuICAgICAgICB0aGlzLl9pbXBsID0gX2ltcGw7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBBc3luY1JlY29yZEJhdGNoRmlsZVJlYWRlciBleHRlbmRzIEFzeW5jUmVjb3JkQmF0Y2hTdHJlYW1SZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKF9pbXBsKSB7XG4gICAgICAgIHN1cGVyKF9pbXBsKTtcbiAgICAgICAgdGhpcy5faW1wbCA9IF9pbXBsO1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5jbGFzcyBSZWNvcmRCYXRjaFJlYWRlckltcGwge1xuICAgIGNvbnN0cnVjdG9yKGRpY3Rpb25hcmllcyA9IG5ldyBNYXAoKSkge1xuICAgICAgICB0aGlzLmNsb3NlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmF1dG9EZXN0cm95ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZGljdGlvbmFyeUluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5fcmVjb3JkQmF0Y2hJbmRleCA9IDA7XG4gICAgICAgIHRoaXMuZGljdGlvbmFyaWVzID0gZGljdGlvbmFyaWVzO1xuICAgIH1cbiAgICBnZXQgbnVtRGljdGlvbmFyaWVzKCkgeyByZXR1cm4gdGhpcy5fZGljdGlvbmFyeUluZGV4OyB9XG4gICAgZ2V0IG51bVJlY29yZEJhdGNoZXMoKSB7IHJldHVybiB0aGlzLl9yZWNvcmRCYXRjaEluZGV4OyB9XG4gICAgaXNTeW5jKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpc0FzeW5jKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpc0ZpbGUoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlzU3RyZWFtKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICByZXNldChzY2hlbWEpIHtcbiAgICAgICAgdGhpcy5fZGljdGlvbmFyeUluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5fcmVjb3JkQmF0Y2hJbmRleCA9IDA7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICB0aGlzLmRpY3Rpb25hcmllcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIF9sb2FkUmVjb3JkQmF0Y2goaGVhZGVyLCBib2R5KSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fbG9hZFZlY3RvcnMoaGVhZGVyLCBib2R5LCB0aGlzLnNjaGVtYS5maWVsZHMpO1xuICAgICAgICBjb25zdCBkYXRhID0gbWFrZURhdGEoeyB0eXBlOiBuZXcgU3RydWN0KHRoaXMuc2NoZW1hLmZpZWxkcyksIGxlbmd0aDogaGVhZGVyLmxlbmd0aCwgY2hpbGRyZW4gfSk7XG4gICAgICAgIHJldHVybiBuZXcgUmVjb3JkQmF0Y2godGhpcy5zY2hlbWEsIGRhdGEpO1xuICAgIH1cbiAgICBfbG9hZERpY3Rpb25hcnlCYXRjaChoZWFkZXIsIGJvZHkpIHtcbiAgICAgICAgY29uc3QgeyBpZCwgaXNEZWx0YSB9ID0gaGVhZGVyO1xuICAgICAgICBjb25zdCB7IGRpY3Rpb25hcmllcywgc2NoZW1hIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBkaWN0aW9uYXJ5ID0gZGljdGlvbmFyaWVzLmdldChpZCk7XG4gICAgICAgIGlmIChpc0RlbHRhIHx8ICFkaWN0aW9uYXJ5KSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gc2NoZW1hLmRpY3Rpb25hcmllcy5nZXQoaWQpO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuX2xvYWRWZWN0b3JzKGhlYWRlci5kYXRhLCBib2R5LCBbdHlwZV0pO1xuICAgICAgICAgICAgcmV0dXJuIChkaWN0aW9uYXJ5ICYmIGlzRGVsdGEgPyBkaWN0aW9uYXJ5LmNvbmNhdChuZXcgVmVjdG9yKGRhdGEpKSA6XG4gICAgICAgICAgICAgICAgbmV3IFZlY3RvcihkYXRhKSkubWVtb2l6ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkaWN0aW9uYXJ5Lm1lbW9pemUoKTtcbiAgICB9XG4gICAgX2xvYWRWZWN0b3JzKGhlYWRlciwgYm9keSwgdHlwZXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3JMb2FkZXIoYm9keSwgaGVhZGVyLm5vZGVzLCBoZWFkZXIuYnVmZmVycywgdGhpcy5kaWN0aW9uYXJpZXMpLnZpc2l0TWFueSh0eXBlcyk7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmNsYXNzIFJlY29yZEJhdGNoU3RyZWFtUmVhZGVySW1wbCBleHRlbmRzIFJlY29yZEJhdGNoUmVhZGVySW1wbCB7XG4gICAgY29uc3RydWN0b3Ioc291cmNlLCBkaWN0aW9uYXJpZXMpIHtcbiAgICAgICAgc3VwZXIoZGljdGlvbmFyaWVzKTtcbiAgICAgICAgdGhpcy5fcmVhZGVyID0gIWlzQXJyb3dKU09OKHNvdXJjZSlcbiAgICAgICAgICAgID8gbmV3IE1lc3NhZ2VSZWFkZXIodGhpcy5faGFuZGxlID0gc291cmNlKVxuICAgICAgICAgICAgOiBuZXcgSlNPTk1lc3NhZ2VSZWFkZXIodGhpcy5faGFuZGxlID0gc291cmNlKTtcbiAgICB9XG4gICAgaXNTeW5jKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGlzU3RyZWFtKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2FuY2VsKCkge1xuICAgICAgICBpZiAoIXRoaXMuY2xvc2VkICYmICh0aGlzLmNsb3NlZCA9IHRydWUpKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KCkuX3JlYWRlci5yZXR1cm4oKTtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRlciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmRpY3Rpb25hcmllcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb3BlbihvcHRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b0Rlc3Ryb3kgPSBzaG91bGRBdXRvRGVzdHJveSh0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGlmICghKHRoaXMuc2NoZW1hIHx8ICh0aGlzLnNjaGVtYSA9IHRoaXMuX3JlYWRlci5yZWFkU2NoZW1hKCkpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRocm93KHZhbHVlKSB7XG4gICAgICAgIGlmICghdGhpcy5jbG9zZWQgJiYgdGhpcy5hdXRvRGVzdHJveSAmJiAodGhpcy5jbG9zZWQgPSB0cnVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzZXQoKS5fcmVhZGVyLnRocm93KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSVRFUkFUT1JfRE9ORTtcbiAgICB9XG4gICAgcmV0dXJuKHZhbHVlKSB7XG4gICAgICAgIGlmICghdGhpcy5jbG9zZWQgJiYgdGhpcy5hdXRvRGVzdHJveSAmJiAodGhpcy5jbG9zZWQgPSB0cnVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzZXQoKS5fcmVhZGVyLnJldHVybih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIElURVJBVE9SX0RPTkU7XG4gICAgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIElURVJBVE9SX0RPTkU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgIGNvbnN0IHsgX3JlYWRlcjogcmVhZGVyIH0gPSB0aGlzO1xuICAgICAgICB3aGlsZSAobWVzc2FnZSA9IHRoaXMuX3JlYWROZXh0TWVzc2FnZUFuZFZhbGlkYXRlKCkpIHtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLmlzU2NoZW1hKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KG1lc3NhZ2UuaGVhZGVyKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWVzc2FnZS5pc1JlY29yZEJhdGNoKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWNvcmRCYXRjaEluZGV4Kys7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gbWVzc2FnZS5oZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSByZWFkZXIucmVhZE1lc3NhZ2VCb2R5KG1lc3NhZ2UuYm9keUxlbmd0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkQmF0Y2ggPSB0aGlzLl9sb2FkUmVjb3JkQmF0Y2goaGVhZGVyLCBidWZmZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogcmVjb3JkQmF0Y2ggfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuaXNEaWN0aW9uYXJ5QmF0Y2goKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RpY3Rpb25hcnlJbmRleCsrO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IG1lc3NhZ2UuaGVhZGVyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gcmVhZGVyLnJlYWRNZXNzYWdlQm9keShtZXNzYWdlLmJvZHlMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvciA9IHRoaXMuX2xvYWREaWN0aW9uYXJ5QmF0Y2goaGVhZGVyLCBidWZmZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyaWVzLnNldChoZWFkZXIuaWQsIHZlY3Rvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2NoZW1hICYmIHRoaXMuX3JlY29yZEJhdGNoSW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3JlY29yZEJhdGNoSW5kZXgrKztcbiAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogbmV3IF9JbnRlcm5hbEVtcHR5UGxhY2Vob2xkZXJSZWNvcmRCYXRjaCh0aGlzLnNjaGVtYSkgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm4oKTtcbiAgICB9XG4gICAgX3JlYWROZXh0TWVzc2FnZUFuZFZhbGlkYXRlKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRlci5yZWFkTWVzc2FnZSh0eXBlKTtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuY2xhc3MgQXN5bmNSZWNvcmRCYXRjaFN0cmVhbVJlYWRlckltcGwgZXh0ZW5kcyBSZWNvcmRCYXRjaFJlYWRlckltcGwge1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgZGljdGlvbmFyaWVzKSB7XG4gICAgICAgIHN1cGVyKGRpY3Rpb25hcmllcyk7XG4gICAgICAgIHRoaXMuX3JlYWRlciA9IG5ldyBBc3luY01lc3NhZ2VSZWFkZXIodGhpcy5faGFuZGxlID0gc291cmNlKTtcbiAgICB9XG4gICAgaXNBc3luYygpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBpc1N0cmVhbSgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2FuY2VsKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCAmJiAodGhpcy5jbG9zZWQgPSB0cnVlKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMucmVzZXQoKS5fcmVhZGVyLnJldHVybigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJpZXMgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb3BlbihvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvRGVzdHJveSA9IHNob3VsZEF1dG9EZXN0cm95KHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmICghKHRoaXMuc2NoZW1hIHx8ICh0aGlzLnNjaGVtYSA9ICh5aWVsZCB0aGlzLl9yZWFkZXIucmVhZFNjaGVtYSgpKSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuY2FuY2VsKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0aHJvdyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCAmJiB0aGlzLmF1dG9EZXN0cm95ICYmICh0aGlzLmNsb3NlZCA9IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkIHRoaXMucmVzZXQoKS5fcmVhZGVyLnRocm93KHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBJVEVSQVRPUl9ET05FO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2xvc2VkICYmIHRoaXMuYXV0b0Rlc3Ryb3kgJiYgKHRoaXMuY2xvc2VkID0gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQgdGhpcy5yZXNldCgpLl9yZWFkZXIucmV0dXJuKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBJVEVSQVRPUl9ET05FO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBJVEVSQVRPUl9ET05FO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgICAgICBjb25zdCB7IF9yZWFkZXI6IHJlYWRlciB9ID0gdGhpcztcbiAgICAgICAgICAgIHdoaWxlIChtZXNzYWdlID0geWllbGQgdGhpcy5fcmVhZE5leHRNZXNzYWdlQW5kVmFsaWRhdGUoKSkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmlzU2NoZW1hKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgdGhpcy5yZXNldChtZXNzYWdlLmhlYWRlcigpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWVzc2FnZS5pc1JlY29yZEJhdGNoKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVjb3JkQmF0Y2hJbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXIgPSBtZXNzYWdlLmhlYWRlcigpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSB5aWVsZCByZWFkZXIucmVhZE1lc3NhZ2VCb2R5KG1lc3NhZ2UuYm9keUxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZEJhdGNoID0gdGhpcy5fbG9hZFJlY29yZEJhdGNoKGhlYWRlciwgYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiByZWNvcmRCYXRjaCB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtZXNzYWdlLmlzRGljdGlvbmFyeUJhdGNoKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGljdGlvbmFyeUluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IG1lc3NhZ2UuaGVhZGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHlpZWxkIHJlYWRlci5yZWFkTWVzc2FnZUJvZHkobWVzc2FnZS5ib2R5TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yID0gdGhpcy5fbG9hZERpY3Rpb25hcnlCYXRjaChoZWFkZXIsIGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyaWVzLnNldChoZWFkZXIuaWQsIHZlY3Rvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1hICYmIHRoaXMuX3JlY29yZEJhdGNoSW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWNvcmRCYXRjaEluZGV4Kys7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBuZXcgX0ludGVybmFsRW1wdHlQbGFjZWhvbGRlclJlY29yZEJhdGNoKHRoaXMuc2NoZW1hKSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIHRoaXMucmV0dXJuKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfcmVhZE5leHRNZXNzYWdlQW5kVmFsaWRhdGUodHlwZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIHRoaXMuX3JlYWRlci5yZWFkTWVzc2FnZSh0eXBlKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmNsYXNzIFJlY29yZEJhdGNoRmlsZVJlYWRlckltcGwgZXh0ZW5kcyBSZWNvcmRCYXRjaFN0cmVhbVJlYWRlckltcGwge1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgZGljdGlvbmFyaWVzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSBpbnN0YW5jZW9mIFJhbmRvbUFjY2Vzc0ZpbGUgPyBzb3VyY2UgOiBuZXcgUmFuZG9tQWNjZXNzRmlsZShzb3VyY2UpLCBkaWN0aW9uYXJpZXMpO1xuICAgIH1cbiAgICBnZXQgZm9vdGVyKCkgeyByZXR1cm4gdGhpcy5fZm9vdGVyOyB9XG4gICAgZ2V0IG51bURpY3Rpb25hcmllcygpIHsgcmV0dXJuIHRoaXMuX2Zvb3RlciA/IHRoaXMuX2Zvb3Rlci5udW1EaWN0aW9uYXJpZXMgOiAwOyB9XG4gICAgZ2V0IG51bVJlY29yZEJhdGNoZXMoKSB7IHJldHVybiB0aGlzLl9mb290ZXIgPyB0aGlzLl9mb290ZXIubnVtUmVjb3JkQmF0Y2hlcyA6IDA7IH1cbiAgICBpc1N5bmMoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaXNGaWxlKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIG9wZW4ob3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuY2xvc2VkICYmICF0aGlzLl9mb290ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gKHRoaXMuX2Zvb3RlciA9IHRoaXMuX3JlYWRGb290ZXIoKSkuc2NoZW1hO1xuICAgICAgICAgICAgZm9yIChjb25zdCBibG9jayBvZiB0aGlzLl9mb290ZXIuZGljdGlvbmFyeUJhdGNoZXMoKSkge1xuICAgICAgICAgICAgICAgIGJsb2NrICYmIHRoaXMuX3JlYWREaWN0aW9uYXJ5QmF0Y2godGhpcy5fZGljdGlvbmFyeUluZGV4KyspO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci5vcGVuKG9wdGlvbnMpO1xuICAgIH1cbiAgICByZWFkUmVjb3JkQmF0Y2goaW5kZXgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZm9vdGVyKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBibG9jayA9IChfYSA9IHRoaXMuX2Zvb3RlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdldFJlY29yZEJhdGNoKGluZGV4KTtcbiAgICAgICAgaWYgKGJsb2NrICYmIHRoaXMuX2hhbmRsZS5zZWVrKGJsb2NrLm9mZnNldCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLl9yZWFkZXIucmVhZE1lc3NhZ2UoTWVzc2FnZUhlYWRlci5SZWNvcmRCYXRjaCk7XG4gICAgICAgICAgICBpZiAobWVzc2FnZSA9PT0gbnVsbCB8fCBtZXNzYWdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXNzYWdlLmlzUmVjb3JkQmF0Y2goKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IG1lc3NhZ2UuaGVhZGVyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5fcmVhZGVyLnJlYWRNZXNzYWdlQm9keShtZXNzYWdlLmJvZHlMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZEJhdGNoID0gdGhpcy5fbG9hZFJlY29yZEJhdGNoKGhlYWRlciwgYnVmZmVyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjb3JkQmF0Y2g7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIF9yZWFkRGljdGlvbmFyeUJhdGNoKGluZGV4KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgYmxvY2sgPSAoX2EgPSB0aGlzLl9mb290ZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXREaWN0aW9uYXJ5QmF0Y2goaW5kZXgpO1xuICAgICAgICBpZiAoYmxvY2sgJiYgdGhpcy5faGFuZGxlLnNlZWsoYmxvY2sub2Zmc2V0KSkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuX3JlYWRlci5yZWFkTWVzc2FnZShNZXNzYWdlSGVhZGVyLkRpY3Rpb25hcnlCYXRjaCk7XG4gICAgICAgICAgICBpZiAobWVzc2FnZSA9PT0gbnVsbCB8fCBtZXNzYWdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXNzYWdlLmlzRGljdGlvbmFyeUJhdGNoKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXIgPSBtZXNzYWdlLmhlYWRlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWRlci5yZWFkTWVzc2FnZUJvZHkobWVzc2FnZS5ib2R5TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3IgPSB0aGlzLl9sb2FkRGljdGlvbmFyeUJhdGNoKGhlYWRlciwgYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpY3Rpb25hcmllcy5zZXQoaGVhZGVyLmlkLCB2ZWN0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIF9yZWFkRm9vdGVyKCkge1xuICAgICAgICBjb25zdCB7IF9oYW5kbGUgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IF9oYW5kbGUuc2l6ZSAtIG1hZ2ljQW5kUGFkZGluZztcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gX2hhbmRsZS5yZWFkSW50MzIob2Zmc2V0KTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gX2hhbmRsZS5yZWFkQXQob2Zmc2V0IC0gbGVuZ3RoLCBsZW5ndGgpO1xuICAgICAgICByZXR1cm4gRm9vdGVyLmRlY29kZShidWZmZXIpO1xuICAgIH1cbiAgICBfcmVhZE5leHRNZXNzYWdlQW5kVmFsaWRhdGUodHlwZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICghdGhpcy5fZm9vdGVyKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZm9vdGVyICYmIHRoaXMuX3JlY29yZEJhdGNoSW5kZXggPCB0aGlzLm51bVJlY29yZEJhdGNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gKF9hID0gdGhpcy5fZm9vdGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0UmVjb3JkQmF0Y2godGhpcy5fcmVjb3JkQmF0Y2hJbmRleCk7XG4gICAgICAgICAgICBpZiAoYmxvY2sgJiYgdGhpcy5faGFuZGxlLnNlZWsoYmxvY2sub2Zmc2V0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWFkZXIucmVhZE1lc3NhZ2UodHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmNsYXNzIEFzeW5jUmVjb3JkQmF0Y2hGaWxlUmVhZGVySW1wbCBleHRlbmRzIEFzeW5jUmVjb3JkQmF0Y2hTdHJlYW1SZWFkZXJJbXBsIHtcbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIC4uLnJlc3QpIHtcbiAgICAgICAgY29uc3QgYnl0ZUxlbmd0aCA9IHR5cGVvZiByZXN0WzBdICE9PSAnbnVtYmVyJyA/IHJlc3Quc2hpZnQoKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgZGljdGlvbmFyaWVzID0gcmVzdFswXSBpbnN0YW5jZW9mIE1hcCA/IHJlc3Quc2hpZnQoKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgc3VwZXIoc291cmNlIGluc3RhbmNlb2YgQXN5bmNSYW5kb21BY2Nlc3NGaWxlID8gc291cmNlIDogbmV3IEFzeW5jUmFuZG9tQWNjZXNzRmlsZShzb3VyY2UsIGJ5dGVMZW5ndGgpLCBkaWN0aW9uYXJpZXMpO1xuICAgIH1cbiAgICBnZXQgZm9vdGVyKCkgeyByZXR1cm4gdGhpcy5fZm9vdGVyOyB9XG4gICAgZ2V0IG51bURpY3Rpb25hcmllcygpIHsgcmV0dXJuIHRoaXMuX2Zvb3RlciA/IHRoaXMuX2Zvb3Rlci5udW1EaWN0aW9uYXJpZXMgOiAwOyB9XG4gICAgZ2V0IG51bVJlY29yZEJhdGNoZXMoKSB7IHJldHVybiB0aGlzLl9mb290ZXIgPyB0aGlzLl9mb290ZXIubnVtUmVjb3JkQmF0Y2hlcyA6IDA7IH1cbiAgICBpc0ZpbGUoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaXNBc3luYygpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBvcGVuKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgX3N1cGVyID0gT2JqZWN0LmNyZWF0ZShudWxsLCB7XG4gICAgICAgICAgICBvcGVuOiB7IGdldDogKCkgPT4gc3VwZXIub3BlbiB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCAmJiAhdGhpcy5fZm9vdGVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSAodGhpcy5fZm9vdGVyID0geWllbGQgdGhpcy5fcmVhZEZvb3RlcigpKS5zY2hlbWE7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBibG9jayBvZiB0aGlzLl9mb290ZXIuZGljdGlvbmFyeUJhdGNoZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICBibG9jayAmJiAoeWllbGQgdGhpcy5fcmVhZERpY3Rpb25hcnlCYXRjaCh0aGlzLl9kaWN0aW9uYXJ5SW5kZXgrKykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB5aWVsZCBfc3VwZXIub3Blbi5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVhZFJlY29yZEJhdGNoKGluZGV4KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLl9mb290ZXIpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLm9wZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gKF9hID0gdGhpcy5fZm9vdGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0UmVjb3JkQmF0Y2goaW5kZXgpO1xuICAgICAgICAgICAgaWYgKGJsb2NrICYmICh5aWVsZCB0aGlzLl9oYW5kbGUuc2VlayhibG9jay5vZmZzZXQpKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB5aWVsZCB0aGlzLl9yZWFkZXIucmVhZE1lc3NhZ2UoTWVzc2FnZUhlYWRlci5SZWNvcmRCYXRjaCk7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT09IG51bGwgfHwgbWVzc2FnZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWVzc2FnZS5pc1JlY29yZEJhdGNoKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gbWVzc2FnZS5oZWFkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0geWllbGQgdGhpcy5fcmVhZGVyLnJlYWRNZXNzYWdlQm9keShtZXNzYWdlLmJvZHlMZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRCYXRjaCA9IHRoaXMuX2xvYWRSZWNvcmRCYXRjaChoZWFkZXIsIGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWNvcmRCYXRjaDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9yZWFkRGljdGlvbmFyeUJhdGNoKGluZGV4KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gKF9hID0gdGhpcy5fZm9vdGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0RGljdGlvbmFyeUJhdGNoKGluZGV4KTtcbiAgICAgICAgICAgIGlmIChibG9jayAmJiAoeWllbGQgdGhpcy5faGFuZGxlLnNlZWsoYmxvY2sub2Zmc2V0KSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0geWllbGQgdGhpcy5fcmVhZGVyLnJlYWRNZXNzYWdlKE1lc3NhZ2VIZWFkZXIuRGljdGlvbmFyeUJhdGNoKTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSA9PT0gbnVsbCB8fCBtZXNzYWdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXNzYWdlLmlzRGljdGlvbmFyeUJhdGNoKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gbWVzc2FnZS5oZWFkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0geWllbGQgdGhpcy5fcmVhZGVyLnJlYWRNZXNzYWdlQm9keShtZXNzYWdlLmJvZHlMZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3IgPSB0aGlzLl9sb2FkRGljdGlvbmFyeUJhdGNoKGhlYWRlciwgYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJpZXMuc2V0KGhlYWRlci5pZCwgdmVjdG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfcmVhZEZvb3RlcigpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgX2hhbmRsZSB9ID0gdGhpcztcbiAgICAgICAgICAgIF9oYW5kbGUuX3BlbmRpbmcgJiYgKHlpZWxkIF9oYW5kbGUuX3BlbmRpbmcpO1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gX2hhbmRsZS5zaXplIC0gbWFnaWNBbmRQYWRkaW5nO1xuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0geWllbGQgX2hhbmRsZS5yZWFkSW50MzIob2Zmc2V0KTtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHlpZWxkIF9oYW5kbGUucmVhZEF0KG9mZnNldCAtIGxlbmd0aCwgbGVuZ3RoKTtcbiAgICAgICAgICAgIHJldHVybiBGb290ZXIuZGVjb2RlKGJ1ZmZlcik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfcmVhZE5leHRNZXNzYWdlQW5kVmFsaWRhdGUodHlwZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9mb290ZXIpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLm9wZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9mb290ZXIgJiYgdGhpcy5fcmVjb3JkQmF0Y2hJbmRleCA8IHRoaXMubnVtUmVjb3JkQmF0Y2hlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gdGhpcy5fZm9vdGVyLmdldFJlY29yZEJhdGNoKHRoaXMuX3JlY29yZEJhdGNoSW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmIChibG9jayAmJiAoeWllbGQgdGhpcy5faGFuZGxlLnNlZWsoYmxvY2sub2Zmc2V0KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkIHRoaXMuX3JlYWRlci5yZWFkTWVzc2FnZSh0eXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmNsYXNzIFJlY29yZEJhdGNoSlNPTlJlYWRlckltcGwgZXh0ZW5kcyBSZWNvcmRCYXRjaFN0cmVhbVJlYWRlckltcGwge1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgZGljdGlvbmFyaWVzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgZGljdGlvbmFyaWVzKTtcbiAgICB9XG4gICAgX2xvYWRWZWN0b3JzKGhlYWRlciwgYm9keSwgdHlwZXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKU09OVmVjdG9yTG9hZGVyKGJvZHksIGhlYWRlci5ub2RlcywgaGVhZGVyLmJ1ZmZlcnMsIHRoaXMuZGljdGlvbmFyaWVzKS52aXNpdE1hbnkodHlwZXMpO1xuICAgIH1cbn1cbi8vXG4vLyBEZWZpbmUgc29tZSBoZWxwZXIgZnVuY3Rpb25zIGFuZCBzdGF0aWMgaW1wbGVtZW50YXRpb25zIGRvd24gaGVyZS4gVGhlcmUnc1xuLy8gYSBiaXQgb2YgYnJhbmNoaW5nIGluIHRoZSBzdGF0aWMgbWV0aG9kcyB0aGF0IGNhbiBsZWFkIHRvIHRoZSBzYW1lIHJvdXRpbmVzXG4vLyBiZWluZyBleGVjdXRlZCwgc28gd2UndmUgYnJva2VuIHRob3NlIG91dCBoZXJlIGZvciByZWFkYWJpbGl0eS5cbi8vXG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gc2hvdWxkQXV0b0Rlc3Ryb3koc2VsZiwgb3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zICYmICh0eXBlb2Ygb3B0aW9uc1snYXV0b0Rlc3Ryb3knXSA9PT0gJ2Jvb2xlYW4nKSA/IG9wdGlvbnNbJ2F1dG9EZXN0cm95J10gOiBzZWxmWydhdXRvRGVzdHJveSddO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uKiByZWFkQWxsU3luYyhzb3VyY2UpIHtcbiAgICBjb25zdCByZWFkZXIgPSBSZWNvcmRCYXRjaFJlYWRlci5mcm9tKHNvdXJjZSk7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKCFyZWFkZXIub3Blbih7IGF1dG9EZXN0cm95OiBmYWxzZSB9KS5jbG9zZWQpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB5aWVsZCByZWFkZXI7XG4gICAgICAgICAgICB9IHdoaWxlICghKHJlYWRlci5yZXNldCgpLm9wZW4oKSkuY2xvc2VkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgcmVhZGVyLmNhbmNlbCgpO1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiByZWFkQWxsQXN5bmMoc291cmNlKSB7XG4gICAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogcmVhZEFsbEFzeW5jXzEoKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IHlpZWxkIF9fYXdhaXQoUmVjb3JkQmF0Y2hSZWFkZXIuZnJvbShzb3VyY2UpKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghKHlpZWxkIF9fYXdhaXQocmVhZGVyLm9wZW4oeyBhdXRvRGVzdHJveTogZmFsc2UgfSkpKS5jbG9zZWQpIHtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHlpZWxkIF9fYXdhaXQocmVhZGVyKTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlICghKHlpZWxkIF9fYXdhaXQocmVhZGVyLnJlc2V0KCkub3BlbigpKSkuY2xvc2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHlpZWxkIF9fYXdhaXQocmVhZGVyLmNhbmNlbCgpKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGZyb21BcnJvd0pTT04oc291cmNlKSB7XG4gICAgcmV0dXJuIG5ldyBSZWNvcmRCYXRjaFN0cmVhbVJlYWRlcihuZXcgUmVjb3JkQmF0Y2hKU09OUmVhZGVySW1wbChzb3VyY2UpKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBmcm9tQnl0ZVN0cmVhbShzb3VyY2UpIHtcbiAgICBjb25zdCBieXRlcyA9IHNvdXJjZS5wZWVrKChtYWdpY0xlbmd0aCArIDcpICYgfjcpO1xuICAgIHJldHVybiBieXRlcyAmJiBieXRlcy5ieXRlTGVuZ3RoID49IDQgPyAhY2hlY2tGb3JNYWdpY0Fycm93U3RyaW5nKGJ5dGVzKVxuICAgICAgICA/IG5ldyBSZWNvcmRCYXRjaFN0cmVhbVJlYWRlcihuZXcgUmVjb3JkQmF0Y2hTdHJlYW1SZWFkZXJJbXBsKHNvdXJjZSkpXG4gICAgICAgIDogbmV3IFJlY29yZEJhdGNoRmlsZVJlYWRlcihuZXcgUmVjb3JkQmF0Y2hGaWxlUmVhZGVySW1wbChzb3VyY2UucmVhZCgpKSlcbiAgICAgICAgOiBuZXcgUmVjb3JkQmF0Y2hTdHJlYW1SZWFkZXIobmV3IFJlY29yZEJhdGNoU3RyZWFtUmVhZGVySW1wbChmdW5jdGlvbiogKCkgeyB9KCkpKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBmcm9tQXN5bmNCeXRlU3RyZWFtKHNvdXJjZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0geWllbGQgc291cmNlLnBlZWsoKG1hZ2ljTGVuZ3RoICsgNykgJiB+Nyk7XG4gICAgICAgIHJldHVybiBieXRlcyAmJiBieXRlcy5ieXRlTGVuZ3RoID49IDQgPyAhY2hlY2tGb3JNYWdpY0Fycm93U3RyaW5nKGJ5dGVzKVxuICAgICAgICAgICAgPyBuZXcgQXN5bmNSZWNvcmRCYXRjaFN0cmVhbVJlYWRlcihuZXcgQXN5bmNSZWNvcmRCYXRjaFN0cmVhbVJlYWRlckltcGwoc291cmNlKSlcbiAgICAgICAgICAgIDogbmV3IFJlY29yZEJhdGNoRmlsZVJlYWRlcihuZXcgUmVjb3JkQmF0Y2hGaWxlUmVhZGVySW1wbCh5aWVsZCBzb3VyY2UucmVhZCgpKSlcbiAgICAgICAgICAgIDogbmV3IEFzeW5jUmVjb3JkQmF0Y2hTdHJlYW1SZWFkZXIobmV3IEFzeW5jUmVjb3JkQmF0Y2hTdHJlYW1SZWFkZXJJbXBsKGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogKCkgeyB9KTsgfSgpKSk7XG4gICAgfSk7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZnJvbUZpbGVIYW5kbGUoc291cmNlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgeyBzaXplIH0gPSB5aWVsZCBzb3VyY2Uuc3RhdCgpO1xuICAgICAgICBjb25zdCBmaWxlID0gbmV3IEFzeW5jUmFuZG9tQWNjZXNzRmlsZShzb3VyY2UsIHNpemUpO1xuICAgICAgICBpZiAoc2l6ZSA+PSBtYWdpY1gyQW5kUGFkZGluZyAmJiBjaGVja0Zvck1hZ2ljQXJyb3dTdHJpbmcoeWllbGQgZmlsZS5yZWFkQXQoMCwgKG1hZ2ljTGVuZ3RoICsgNykgJiB+NykpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFzeW5jUmVjb3JkQmF0Y2hGaWxlUmVhZGVyKG5ldyBBc3luY1JlY29yZEJhdGNoRmlsZVJlYWRlckltcGwoZmlsZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQXN5bmNSZWNvcmRCYXRjaFN0cmVhbVJlYWRlcihuZXcgQXN5bmNSZWNvcmRCYXRjaFN0cmVhbVJlYWRlckltcGwoZmlsZSkpO1xuICAgIH0pO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWFkZXIubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gJy4uL3RhYmxlLm1qcyc7XG5pbXBvcnQgeyBpc1Byb21pc2UgfSBmcm9tICcuLi91dGlsL2NvbXBhdC5tanMnO1xuaW1wb3J0IHsgUmVjb3JkQmF0Y2hSZWFkZXIgfSBmcm9tICcuL3JlYWRlci5tanMnO1xuaW1wb3J0IHsgUmVjb3JkQmF0Y2hGaWxlV3JpdGVyLCBSZWNvcmRCYXRjaFN0cmVhbVdyaXRlciB9IGZyb20gJy4vd3JpdGVyLm1qcyc7XG5leHBvcnQgZnVuY3Rpb24gdGFibGVGcm9tSVBDKGlucHV0KSB7XG4gICAgY29uc3QgcmVhZGVyID0gUmVjb3JkQmF0Y2hSZWFkZXIuZnJvbShpbnB1dCk7XG4gICAgaWYgKGlzUHJvbWlzZShyZWFkZXIpKSB7XG4gICAgICAgIHJldHVybiByZWFkZXIudGhlbigocmVhZGVyKSA9PiB0YWJsZUZyb21JUEMocmVhZGVyKSk7XG4gICAgfVxuICAgIGlmIChyZWFkZXIuaXNBc3luYygpKSB7XG4gICAgICAgIHJldHVybiByZWFkZXIucmVhZEFsbCgpLnRoZW4oKHhzKSA9PiBuZXcgVGFibGUoeHMpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUYWJsZShyZWFkZXIucmVhZEFsbCgpKTtcbn1cbi8qKlxuICogU2VyaWFsaXplIGEge0BsaW5rIFRhYmxlfSB0byB0aGUgSVBDIGZvcm1hdC4gVGhpcyBmdW5jdGlvbiBpcyBhIGNvbnZlbmllbmNlXG4gKiB3cmFwcGVyIGZvciB7QGxpbmsgUmVjb3JkQmF0Y2hTdHJlYW1Xcml0ZXJ9IGFuZCB7QGxpbmsgUmVjb3JkQmF0Y2hGaWxlV3JpdGVyfS5cbiAqIE9wcG9zaXRlIG9mIHtAbGluayB0YWJsZUZyb21JUEN9LlxuICpcbiAqIEBwYXJhbSB0YWJsZSBUaGUgVGFibGUgdG8gc2VyaWFsaXplLlxuICogQHBhcmFtIHR5cGUgV2hldGhlciB0byBzZXJpYWxpemUgdGhlIFRhYmxlIGFzIGEgZmlsZSBvciBhIHN0cmVhbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhYmxlVG9JUEModGFibGUsIHR5cGUgPSAnc3RyZWFtJykge1xuICAgIHJldHVybiAodHlwZSA9PT0gJ3N0cmVhbScgPyBSZWNvcmRCYXRjaFN0cmVhbVdyaXRlciA6IFJlY29yZEJhdGNoRmlsZVdyaXRlcilcbiAgICAgICAgLndyaXRlQWxsKHRhYmxlKVxuICAgICAgICAudG9VaW50OEFycmF5KHRydWUpO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZXJpYWxpemF0aW9uLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgX19hc3luY1ZhbHVlcywgX19hd2FpdGVyIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gJy4uL3RhYmxlLm1qcyc7XG5pbXBvcnQgeyBNQUdJQyB9IGZyb20gJy4vbWVzc2FnZS5tanMnO1xuaW1wb3J0IHsgVmVjdG9yIH0gZnJvbSAnLi4vdmVjdG9yLm1qcyc7XG5pbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uL3R5cGUubWpzJztcbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICcuL21ldGFkYXRhL21lc3NhZ2UubWpzJztcbmltcG9ydCAqIGFzIG1ldGFkYXRhIGZyb20gJy4vbWV0YWRhdGEvbWVzc2FnZS5tanMnO1xuaW1wb3J0IHsgRmlsZUJsb2NrLCBGb290ZXIgfSBmcm9tICcuL21ldGFkYXRhL2ZpbGUubWpzJztcbmltcG9ydCB7IE1lc3NhZ2VIZWFkZXIsIE1ldGFkYXRhVmVyc2lvbiB9IGZyb20gJy4uL2VudW0ubWpzJztcbmltcG9ydCB7IGNvbXBhcmVTY2hlbWFzIH0gZnJvbSAnLi4vdmlzaXRvci90eXBlY29tcGFyYXRvci5tanMnO1xuaW1wb3J0IHsgQXN5bmNCeXRlUXVldWUgfSBmcm9tICcuLi9pby9zdHJlYW0ubWpzJztcbmltcG9ydCB7IFZlY3RvckFzc2VtYmxlciB9IGZyb20gJy4uL3Zpc2l0b3IvdmVjdG9yYXNzZW1ibGVyLm1qcyc7XG5pbXBvcnQgeyBKU09OVHlwZUFzc2VtYmxlciB9IGZyb20gJy4uL3Zpc2l0b3IvanNvbnR5cGVhc3NlbWJsZXIubWpzJztcbmltcG9ydCB7IEpTT05WZWN0b3JBc3NlbWJsZXIgfSBmcm9tICcuLi92aXNpdG9yL2pzb252ZWN0b3Jhc3NlbWJsZXIubWpzJztcbmltcG9ydCB7IHRvVWludDhBcnJheSB9IGZyb20gJy4uL3V0aWwvYnVmZmVyLm1qcyc7XG5pbXBvcnQgeyBSZWNvcmRCYXRjaCwgX0ludGVybmFsRW1wdHlQbGFjZWhvbGRlclJlY29yZEJhdGNoIH0gZnJvbSAnLi4vcmVjb3JkYmF0Y2gubWpzJztcbmltcG9ydCB7IFJlYWRhYmxlSW50ZXJvcCB9IGZyb20gJy4uL2lvL2ludGVyZmFjZXMubWpzJztcbmltcG9ydCB7IGlzUHJvbWlzZSwgaXNBc3luY0l0ZXJhYmxlLCBpc1dyaXRhYmxlRE9NU3RyZWFtLCBpc1dyaXRhYmxlTm9kZVN0cmVhbSwgaXNJdGVyYWJsZSwgaXNPYmplY3QgfSBmcm9tICcuLi91dGlsL2NvbXBhdC5tanMnO1xuZXhwb3J0IGNsYXNzIFJlY29yZEJhdGNoV3JpdGVyIGV4dGVuZHMgUmVhZGFibGVJbnRlcm9wIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uID0gMDtcbiAgICAgICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuX3NpbmsgPSBuZXcgQXN5bmNCeXRlUXVldWUoKTtcbiAgICAgICAgdGhpcy5fc2NoZW1hID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZGljdGlvbmFyeUJsb2NrcyA9IFtdO1xuICAgICAgICB0aGlzLl9yZWNvcmRCYXRjaEJsb2NrcyA9IFtdO1xuICAgICAgICB0aGlzLl9kaWN0aW9uYXJ5RGVsdGFPZmZzZXRzID0gbmV3IE1hcCgpO1xuICAgICAgICBpc09iamVjdChvcHRpb25zKSB8fCAob3B0aW9ucyA9IHsgYXV0b0Rlc3Ryb3k6IHRydWUsIHdyaXRlTGVnYWN5SXBjRm9ybWF0OiBmYWxzZSB9KTtcbiAgICAgICAgdGhpcy5fYXV0b0Rlc3Ryb3kgPSAodHlwZW9mIG9wdGlvbnMuYXV0b0Rlc3Ryb3kgPT09ICdib29sZWFuJykgPyBvcHRpb25zLmF1dG9EZXN0cm95IDogdHJ1ZTtcbiAgICAgICAgdGhpcy5fd3JpdGVMZWdhY3lJcGNGb3JtYXQgPSAodHlwZW9mIG9wdGlvbnMud3JpdGVMZWdhY3lJcGNGb3JtYXQgPT09ICdib29sZWFuJykgPyBvcHRpb25zLndyaXRlTGVnYWN5SXBjRm9ybWF0IDogZmFsc2U7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBzdGF0aWMgdGhyb3VnaE5vZGUob3B0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwidGhyb3VnaE5vZGVcIiBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnRgKTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIHRocm91Z2hET00oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdyaXRhYmxlU3RyYXRlZ3ksIFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZWFkYWJsZVN0cmF0ZWd5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJ0aHJvdWdoRE9NXCIgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50YCk7XG4gICAgfVxuICAgIHRvU3RyaW5nKHN5bmMgPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2luay50b1N0cmluZyhzeW5jKTtcbiAgICB9XG4gICAgdG9VaW50OEFycmF5KHN5bmMgPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2luay50b1VpbnQ4QXJyYXkoc3luYyk7XG4gICAgfVxuICAgIHdyaXRlQWxsKGlucHV0KSB7XG4gICAgICAgIGlmIChpc1Byb21pc2UoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQudGhlbigoeCkgPT4gdGhpcy53cml0ZUFsbCh4KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNBc3luY0l0ZXJhYmxlKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHdyaXRlQWxsQXN5bmModGhpcywgaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZUFsbCh0aGlzLCBpbnB1dCk7XG4gICAgfVxuICAgIGdldCBjbG9zZWQoKSB7IHJldHVybiB0aGlzLl9zaW5rLmNsb3NlZDsgfVxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7IHJldHVybiB0aGlzLl9zaW5rW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOyB9XG4gICAgdG9ET01TdHJlYW0ob3B0aW9ucykgeyByZXR1cm4gdGhpcy5fc2luay50b0RPTVN0cmVhbShvcHRpb25zKTsgfVxuICAgIHRvTm9kZVN0cmVhbShvcHRpb25zKSB7IHJldHVybiB0aGlzLl9zaW5rLnRvTm9kZVN0cmVhbShvcHRpb25zKTsgfVxuICAgIGNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNldCgpLl9zaW5rLmNsb3NlKCk7XG4gICAgfVxuICAgIGFib3J0KHJlYXNvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNldCgpLl9zaW5rLmFib3J0KHJlYXNvbik7XG4gICAgfVxuICAgIGZpbmlzaCgpIHtcbiAgICAgICAgdGhpcy5fYXV0b0Rlc3Ryb3kgPyB0aGlzLmNsb3NlKCkgOiB0aGlzLnJlc2V0KHRoaXMuX3NpbmssIHRoaXMuX3NjaGVtYSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXNldChzaW5rID0gdGhpcy5fc2luaywgc2NoZW1hID0gbnVsbCkge1xuICAgICAgICBpZiAoKHNpbmsgPT09IHRoaXMuX3NpbmspIHx8IChzaW5rIGluc3RhbmNlb2YgQXN5bmNCeXRlUXVldWUpKSB7XG4gICAgICAgICAgICB0aGlzLl9zaW5rID0gc2luaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3NpbmsgPSBuZXcgQXN5bmNCeXRlUXVldWUoKTtcbiAgICAgICAgICAgIGlmIChzaW5rICYmIGlzV3JpdGFibGVET01TdHJlYW0oc2luaykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvRE9NU3RyZWFtKHsgdHlwZTogJ2J5dGVzJyB9KS5waXBlVG8oc2luayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzaW5rICYmIGlzV3JpdGFibGVOb2RlU3RyZWFtKHNpbmspKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b05vZGVTdHJlYW0oeyBvYmplY3RNb2RlOiBmYWxzZSB9KS5waXBlKHNpbmspO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zdGFydGVkICYmIHRoaXMuX3NjaGVtYSkge1xuICAgICAgICAgICAgdGhpcy5fd3JpdGVGb290ZXIodGhpcy5fc2NoZW1hKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2RpY3Rpb25hcnlCbG9ja3MgPSBbXTtcbiAgICAgICAgdGhpcy5fcmVjb3JkQmF0Y2hCbG9ja3MgPSBbXTtcbiAgICAgICAgdGhpcy5fZGljdGlvbmFyeURlbHRhT2Zmc2V0cyA9IG5ldyBNYXAoKTtcbiAgICAgICAgaWYgKCFzY2hlbWEgfHwgIShjb21wYXJlU2NoZW1hcyhzY2hlbWEsIHRoaXMuX3NjaGVtYSkpKSB7XG4gICAgICAgICAgICBpZiAoc2NoZW1hID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3NpdGlvbiA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2NoZW1hID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVtYSA9IHNjaGVtYTtcbiAgICAgICAgICAgICAgICB0aGlzLl93cml0ZVNjaGVtYShzY2hlbWEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB3cml0ZShwYXlsb2FkKSB7XG4gICAgICAgIGxldCBzY2hlbWEgPSBudWxsO1xuICAgICAgICBpZiAoIXRoaXMuX3NpbmspIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjb3JkQmF0Y2hXcml0ZXIgaXMgY2xvc2VkYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGF5bG9hZCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2goKSAmJiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGF5bG9hZCBpbnN0YW5jZW9mIFRhYmxlICYmICEoc2NoZW1hID0gcGF5bG9hZC5zY2hlbWEpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2goKSAmJiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGF5bG9hZCBpbnN0YW5jZW9mIFJlY29yZEJhdGNoICYmICEoc2NoZW1hID0gcGF5bG9hZC5zY2hlbWEpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2goKSAmJiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjaGVtYSAmJiAhY29tcGFyZVNjaGVtYXMoc2NoZW1hLCB0aGlzLl9zY2hlbWEpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc3RhcnRlZCAmJiB0aGlzLl9hdXRvRGVzdHJveSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlc2V0KHRoaXMuX3NpbmssIHNjaGVtYSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBheWxvYWQgaW5zdGFuY2VvZiBSZWNvcmRCYXRjaCkge1xuICAgICAgICAgICAgaWYgKCEocGF5bG9hZCBpbnN0YW5jZW9mIF9JbnRlcm5hbEVtcHR5UGxhY2Vob2xkZXJSZWNvcmRCYXRjaCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93cml0ZVJlY29yZEJhdGNoKHBheWxvYWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBheWxvYWQgaW5zdGFuY2VvZiBUYWJsZSkge1xuICAgICAgICAgICAgdGhpcy53cml0ZUFsbChwYXlsb2FkLmJhdGNoZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzSXRlcmFibGUocGF5bG9hZCkpIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVBbGwocGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX3dyaXRlTWVzc2FnZShtZXNzYWdlLCBhbGlnbm1lbnQgPSA4KSB7XG4gICAgICAgIGNvbnN0IGEgPSBhbGlnbm1lbnQgLSAxO1xuICAgICAgICBjb25zdCBidWZmZXIgPSBNZXNzYWdlLmVuY29kZShtZXNzYWdlKTtcbiAgICAgICAgY29uc3QgZmxhdGJ1ZmZlclNpemUgPSBidWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgY29uc3QgcHJlZml4U2l6ZSA9ICF0aGlzLl93cml0ZUxlZ2FjeUlwY0Zvcm1hdCA/IDggOiA0O1xuICAgICAgICBjb25zdCBhbGlnbmVkU2l6ZSA9IChmbGF0YnVmZmVyU2l6ZSArIHByZWZpeFNpemUgKyBhKSAmIH5hO1xuICAgICAgICBjb25zdCBuUGFkZGluZ0J5dGVzID0gYWxpZ25lZFNpemUgLSBmbGF0YnVmZmVyU2l6ZSAtIHByZWZpeFNpemU7XG4gICAgICAgIGlmIChtZXNzYWdlLmhlYWRlclR5cGUgPT09IE1lc3NhZ2VIZWFkZXIuUmVjb3JkQmF0Y2gpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlY29yZEJhdGNoQmxvY2tzLnB1c2gobmV3IEZpbGVCbG9jayhhbGlnbmVkU2l6ZSwgbWVzc2FnZS5ib2R5TGVuZ3RoLCB0aGlzLl9wb3NpdGlvbikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuaGVhZGVyVHlwZSA9PT0gTWVzc2FnZUhlYWRlci5EaWN0aW9uYXJ5QmF0Y2gpIHtcbiAgICAgICAgICAgIHRoaXMuX2RpY3Rpb25hcnlCbG9ja3MucHVzaChuZXcgRmlsZUJsb2NrKGFsaWduZWRTaXplLCBtZXNzYWdlLmJvZHlMZW5ndGgsIHRoaXMuX3Bvc2l0aW9uKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm90IGluIGxlZ2FjeSBwcmUtMC4xNS4wIG1vZGUsIHdyaXRlIHRoZSBzdHJlYW0gY29udGludWF0aW9uIGluZGljYXRvclxuICAgICAgICBpZiAoIXRoaXMuX3dyaXRlTGVnYWN5SXBjRm9ybWF0KSB7XG4gICAgICAgICAgICB0aGlzLl93cml0ZShJbnQzMkFycmF5Lm9mKC0xKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV3JpdGUgdGhlIGZsYXRidWZmZXIgc2l6ZSBwcmVmaXggaW5jbHVkaW5nIHBhZGRpbmdcbiAgICAgICAgdGhpcy5fd3JpdGUoSW50MzJBcnJheS5vZihhbGlnbmVkU2l6ZSAtIHByZWZpeFNpemUpKTtcbiAgICAgICAgLy8gV3JpdGUgdGhlIGZsYXRidWZmZXJcbiAgICAgICAgaWYgKGZsYXRidWZmZXJTaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fd3JpdGUoYnVmZmVyKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXcml0ZSBhbnkgcGFkZGluZ1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVQYWRkaW5nKG5QYWRkaW5nQnl0ZXMpO1xuICAgIH1cbiAgICBfd3JpdGUoY2h1bmspIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXJ0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRvVWludDhBcnJheShjaHVuayk7XG4gICAgICAgICAgICBpZiAoYnVmZmVyICYmIGJ1ZmZlci5ieXRlTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Npbmsud3JpdGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3NpdGlvbiArPSBidWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgX3dyaXRlU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVNZXNzYWdlKE1lc3NhZ2UuZnJvbShzY2hlbWEpKTtcbiAgICB9XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIF93cml0ZUZvb3RlcihzY2hlbWEpIHtcbiAgICAgICAgLy8gZW9zIGJ5dGVzXG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZUxlZ2FjeUlwY0Zvcm1hdFxuICAgICAgICAgICAgPyB0aGlzLl93cml0ZShJbnQzMkFycmF5Lm9mKDApKVxuICAgICAgICAgICAgOiB0aGlzLl93cml0ZShJbnQzMkFycmF5Lm9mKC0xLCAwKSk7XG4gICAgfVxuICAgIF93cml0ZU1hZ2ljKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGUoTUFHSUMpO1xuICAgIH1cbiAgICBfd3JpdGVQYWRkaW5nKG5CeXRlcykge1xuICAgICAgICByZXR1cm4gbkJ5dGVzID4gMCA/IHRoaXMuX3dyaXRlKG5ldyBVaW50OEFycmF5KG5CeXRlcykpIDogdGhpcztcbiAgICB9XG4gICAgX3dyaXRlUmVjb3JkQmF0Y2goYmF0Y2gpIHtcbiAgICAgICAgY29uc3QgeyBieXRlTGVuZ3RoLCBub2RlcywgYnVmZmVyUmVnaW9ucywgYnVmZmVycyB9ID0gVmVjdG9yQXNzZW1ibGVyLmFzc2VtYmxlKGJhdGNoKTtcbiAgICAgICAgY29uc3QgcmVjb3JkQmF0Y2ggPSBuZXcgbWV0YWRhdGEuUmVjb3JkQmF0Y2goYmF0Y2gubnVtUm93cywgbm9kZXMsIGJ1ZmZlclJlZ2lvbnMpO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gTWVzc2FnZS5mcm9tKHJlY29yZEJhdGNoLCBieXRlTGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICAgIC5fd3JpdGVEaWN0aW9uYXJpZXMoYmF0Y2gpXG4gICAgICAgICAgICAuX3dyaXRlTWVzc2FnZShtZXNzYWdlKVxuICAgICAgICAgICAgLl93cml0ZUJvZHlCdWZmZXJzKGJ1ZmZlcnMpO1xuICAgIH1cbiAgICBfd3JpdGVEaWN0aW9uYXJ5QmF0Y2goZGljdGlvbmFyeSwgaWQsIGlzRGVsdGEgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLl9kaWN0aW9uYXJ5RGVsdGFPZmZzZXRzLnNldChpZCwgZGljdGlvbmFyeS5sZW5ndGggKyAodGhpcy5fZGljdGlvbmFyeURlbHRhT2Zmc2V0cy5nZXQoaWQpIHx8IDApKTtcbiAgICAgICAgY29uc3QgeyBieXRlTGVuZ3RoLCBub2RlcywgYnVmZmVyUmVnaW9ucywgYnVmZmVycyB9ID0gVmVjdG9yQXNzZW1ibGVyLmFzc2VtYmxlKG5ldyBWZWN0b3IoW2RpY3Rpb25hcnldKSk7XG4gICAgICAgIGNvbnN0IHJlY29yZEJhdGNoID0gbmV3IG1ldGFkYXRhLlJlY29yZEJhdGNoKGRpY3Rpb25hcnkubGVuZ3RoLCBub2RlcywgYnVmZmVyUmVnaW9ucyk7XG4gICAgICAgIGNvbnN0IGRpY3Rpb25hcnlCYXRjaCA9IG5ldyBtZXRhZGF0YS5EaWN0aW9uYXJ5QmF0Y2gocmVjb3JkQmF0Y2gsIGlkLCBpc0RlbHRhKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IE1lc3NhZ2UuZnJvbShkaWN0aW9uYXJ5QmF0Y2gsIGJ5dGVMZW5ndGgpO1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICAgICAgLl93cml0ZU1lc3NhZ2UobWVzc2FnZSlcbiAgICAgICAgICAgIC5fd3JpdGVCb2R5QnVmZmVycyhidWZmZXJzKTtcbiAgICB9XG4gICAgX3dyaXRlQm9keUJ1ZmZlcnMoYnVmZmVycykge1xuICAgICAgICBsZXQgYnVmZmVyO1xuICAgICAgICBsZXQgc2l6ZSwgcGFkZGluZztcbiAgICAgICAgZm9yIChsZXQgaSA9IC0xLCBuID0gYnVmZmVycy5sZW5ndGg7ICsraSA8IG47KSB7XG4gICAgICAgICAgICBpZiAoKGJ1ZmZlciA9IGJ1ZmZlcnNbaV0pICYmIChzaXplID0gYnVmZmVyLmJ5dGVMZW5ndGgpID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dyaXRlKGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgaWYgKChwYWRkaW5nID0gKChzaXplICsgNykgJiB+NykgLSBzaXplKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fd3JpdGVQYWRkaW5nKHBhZGRpbmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgX3dyaXRlRGljdGlvbmFyaWVzKGJhdGNoKSB7XG4gICAgICAgIGZvciAobGV0IFtpZCwgZGljdGlvbmFyeV0gb2YgYmF0Y2guZGljdGlvbmFyaWVzKSB7XG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gdGhpcy5fZGljdGlvbmFyeURlbHRhT2Zmc2V0cy5nZXQoaWQpIHx8IDA7XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID09PSAwIHx8IChkaWN0aW9uYXJ5ID0gZGljdGlvbmFyeSA9PT0gbnVsbCB8fCBkaWN0aW9uYXJ5ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkaWN0aW9uYXJ5LnNsaWNlKG9mZnNldCkpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRhdGEgb2YgZGljdGlvbmFyeS5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3dyaXRlRGljdGlvbmFyeUJhdGNoKGRhdGEsIGlkLCBvZmZzZXQgPiAwKTtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFJlY29yZEJhdGNoU3RyZWFtV3JpdGVyIGV4dGVuZHMgUmVjb3JkQmF0Y2hXcml0ZXIge1xuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyB3cml0ZUFsbChpbnB1dCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCB3cml0ZXIgPSBuZXcgUmVjb3JkQmF0Y2hTdHJlYW1Xcml0ZXIob3B0aW9ucyk7XG4gICAgICAgIGlmIChpc1Byb21pc2UoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQudGhlbigoeCkgPT4gd3JpdGVyLndyaXRlQWxsKHgpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0FzeW5jSXRlcmFibGUoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gd3JpdGVBbGxBc3luYyh3cml0ZXIsIGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVBbGwod3JpdGVyLCBpbnB1dCk7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBSZWNvcmRCYXRjaEZpbGVXcml0ZXIgZXh0ZW5kcyBSZWNvcmRCYXRjaFdyaXRlciB7XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIHdyaXRlQWxsKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBSZWNvcmRCYXRjaEZpbGVXcml0ZXIoKTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZShpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC50aGVuKCh4KSA9PiB3cml0ZXIud3JpdGVBbGwoeCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQXN5bmNJdGVyYWJsZShpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiB3cml0ZUFsbEFzeW5jKHdyaXRlciwgaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZUFsbCh3cml0ZXIsIGlucHV0KTtcbiAgICB9XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX2F1dG9EZXN0cm95ID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIF93cml0ZVNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTWFnaWMoKS5fd3JpdGVQYWRkaW5nKDIpO1xuICAgIH1cbiAgICBfd3JpdGVGb290ZXIoc2NoZW1hKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IEZvb3Rlci5lbmNvZGUobmV3IEZvb3RlcihzY2hlbWEsIE1ldGFkYXRhVmVyc2lvbi5WNCwgdGhpcy5fcmVjb3JkQmF0Y2hCbG9ja3MsIHRoaXMuX2RpY3Rpb25hcnlCbG9ja3MpKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyXG4gICAgICAgICAgICAuX3dyaXRlRm9vdGVyKHNjaGVtYSkgLy8gRU9TIGJ5dGVzIGZvciBzZXF1ZW50aWFsIHJlYWRlcnNcbiAgICAgICAgICAgIC5fd3JpdGUoYnVmZmVyKSAvLyBXcml0ZSB0aGUgZmxhdGJ1ZmZlclxuICAgICAgICAgICAgLl93cml0ZShJbnQzMkFycmF5Lm9mKGJ1ZmZlci5ieXRlTGVuZ3RoKSkgLy8gdGhlbiB0aGUgZm9vdGVyIHNpemUgc3VmZml4XG4gICAgICAgICAgICAuX3dyaXRlTWFnaWMoKTsgLy8gdGhlbiB0aGUgbWFnaWMgc3VmZml4XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBSZWNvcmRCYXRjaEpTT05Xcml0ZXIgZXh0ZW5kcyBSZWNvcmRCYXRjaFdyaXRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX2F1dG9EZXN0cm95ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fcmVjb3JkQmF0Y2hlcyA9IFtdO1xuICAgICAgICB0aGlzLl9kaWN0aW9uYXJpZXMgPSBbXTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIHdyaXRlQWxsKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVjb3JkQmF0Y2hKU09OV3JpdGVyKCkud3JpdGVBbGwoaW5wdXQpO1xuICAgIH1cbiAgICBfd3JpdGVNZXNzYWdlKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBfd3JpdGVGb290ZXIoc2NoZW1hKSB7IHJldHVybiB0aGlzOyB9XG4gICAgX3dyaXRlU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGUoYHtcXG4gIFwic2NoZW1hXCI6ICR7SlNPTi5zdHJpbmdpZnkoeyBmaWVsZHM6IHNjaGVtYS5maWVsZHMubWFwKGZpZWxkID0+IGZpZWxkVG9KU09OKGZpZWxkKSkgfSwgbnVsbCwgMil9YCk7XG4gICAgfVxuICAgIF93cml0ZURpY3Rpb25hcmllcyhiYXRjaCkge1xuICAgICAgICBpZiAoYmF0Y2guZGljdGlvbmFyaWVzLnNpemUgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9kaWN0aW9uYXJpZXMucHVzaChiYXRjaCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIF93cml0ZURpY3Rpb25hcnlCYXRjaChkaWN0aW9uYXJ5LCBpZCwgaXNEZWx0YSA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2RpY3Rpb25hcnlEZWx0YU9mZnNldHMuc2V0KGlkLCBkaWN0aW9uYXJ5Lmxlbmd0aCArICh0aGlzLl9kaWN0aW9uYXJ5RGVsdGFPZmZzZXRzLmdldChpZCkgfHwgMCkpO1xuICAgICAgICB0aGlzLl93cml0ZSh0aGlzLl9kaWN0aW9uYXJ5QmxvY2tzLmxlbmd0aCA9PT0gMCA/IGAgICAgYCA6IGAsXFxuICAgIGApO1xuICAgICAgICB0aGlzLl93cml0ZShgJHtkaWN0aW9uYXJ5QmF0Y2hUb0pTT04oZGljdGlvbmFyeSwgaWQsIGlzRGVsdGEpfWApO1xuICAgICAgICB0aGlzLl9kaWN0aW9uYXJ5QmxvY2tzLnB1c2gobmV3IEZpbGVCbG9jaygwLCAwLCAwKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBfd3JpdGVSZWNvcmRCYXRjaChiYXRjaCkge1xuICAgICAgICB0aGlzLl93cml0ZURpY3Rpb25hcmllcyhiYXRjaCk7XG4gICAgICAgIHRoaXMuX3JlY29yZEJhdGNoZXMucHVzaChiYXRjaCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RpY3Rpb25hcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl93cml0ZShgLFxcbiAgXCJkaWN0aW9uYXJpZXNcIjogW1xcbmApO1xuICAgICAgICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiB0aGlzLl9kaWN0aW9uYXJpZXMpIHtcbiAgICAgICAgICAgICAgICBzdXBlci5fd3JpdGVEaWN0aW9uYXJpZXMoYmF0Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fd3JpdGUoYFxcbiAgXWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9yZWNvcmRCYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAtMSwgbiA9IHRoaXMuX3JlY29yZEJhdGNoZXMubGVuZ3RoOyArK2kgPCBuOykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dyaXRlKGkgPT09IDAgPyBgLFxcbiAgXCJiYXRjaGVzXCI6IFtcXG4gICAgYCA6IGAsXFxuICAgIGApO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dyaXRlKGAke3JlY29yZEJhdGNoVG9KU09OKHRoaXMuX3JlY29yZEJhdGNoZXNbaV0pfWApO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlY29yZEJhdGNoQmxvY2tzLnB1c2gobmV3IEZpbGVCbG9jaygwLCAwLCAwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl93cml0ZShgXFxuICBdYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3NjaGVtYSkge1xuICAgICAgICAgICAgdGhpcy5fd3JpdGUoYFxcbn1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kaWN0aW9uYXJpZXMgPSBbXTtcbiAgICAgICAgdGhpcy5fcmVjb3JkQmF0Y2hlcyA9IFtdO1xuICAgICAgICByZXR1cm4gc3VwZXIuY2xvc2UoKTtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gd3JpdGVBbGwod3JpdGVyLCBpbnB1dCkge1xuICAgIGxldCBjaHVua3MgPSBpbnB1dDtcbiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBUYWJsZSkge1xuICAgICAgICBjaHVua3MgPSBpbnB1dC5iYXRjaGVzO1xuICAgICAgICB3cml0ZXIucmVzZXQodW5kZWZpbmVkLCBpbnB1dC5zY2hlbWEpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIGNodW5rcykge1xuICAgICAgICB3cml0ZXIud3JpdGUoYmF0Y2gpO1xuICAgIH1cbiAgICByZXR1cm4gd3JpdGVyLmZpbmlzaCgpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIHdyaXRlQWxsQXN5bmMod3JpdGVyLCBiYXRjaGVzKSB7XG4gICAgdmFyIGJhdGNoZXNfMSwgYmF0Y2hlc18xXzE7XG4gICAgdmFyIGVfMSwgX2E7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAoYmF0Y2hlc18xID0gX19hc3luY1ZhbHVlcyhiYXRjaGVzKTsgYmF0Y2hlc18xXzEgPSB5aWVsZCBiYXRjaGVzXzEubmV4dCgpLCAhYmF0Y2hlc18xXzEuZG9uZTspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXRjaCA9IGJhdGNoZXNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShiYXRjaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChiYXRjaGVzXzFfMSAmJiAhYmF0Y2hlc18xXzEuZG9uZSAmJiAoX2EgPSBiYXRjaGVzXzEucmV0dXJuKSkgeWllbGQgX2EuY2FsbChiYXRjaGVzXzEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG4gICAgfSk7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZmllbGRUb0pTT04oeyBuYW1lLCB0eXBlLCBudWxsYWJsZSB9KSB7XG4gICAgY29uc3QgYXNzZW1ibGVyID0gbmV3IEpTT05UeXBlQXNzZW1ibGVyKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ25hbWUnOiBuYW1lLCAnbnVsbGFibGUnOiBudWxsYWJsZSxcbiAgICAgICAgJ3R5cGUnOiBhc3NlbWJsZXIudmlzaXQodHlwZSksXG4gICAgICAgICdjaGlsZHJlbic6ICh0eXBlLmNoaWxkcmVuIHx8IFtdKS5tYXAoKGZpZWxkKSA9PiBmaWVsZFRvSlNPTihmaWVsZCkpLFxuICAgICAgICAnZGljdGlvbmFyeSc6ICFEYXRhVHlwZS5pc0RpY3Rpb25hcnkodHlwZSkgPyB1bmRlZmluZWQgOiB7XG4gICAgICAgICAgICAnaWQnOiB0eXBlLmlkLFxuICAgICAgICAgICAgJ2lzT3JkZXJlZCc6IHR5cGUuaXNPcmRlcmVkLFxuICAgICAgICAgICAgJ2luZGV4VHlwZSc6IGFzc2VtYmxlci52aXNpdCh0eXBlLmluZGljZXMpXG4gICAgICAgIH1cbiAgICB9O1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGRpY3Rpb25hcnlCYXRjaFRvSlNPTihkaWN0aW9uYXJ5LCBpZCwgaXNEZWx0YSA9IGZhbHNlKSB7XG4gICAgY29uc3QgW2NvbHVtbnNdID0gSlNPTlZlY3RvckFzc2VtYmxlci5hc3NlbWJsZShuZXcgUmVjb3JkQmF0Y2goeyBbaWRdOiBkaWN0aW9uYXJ5IH0pKTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAnaWQnOiBpZCxcbiAgICAgICAgJ2lzRGVsdGEnOiBpc0RlbHRhLFxuICAgICAgICAnZGF0YSc6IHtcbiAgICAgICAgICAgICdjb3VudCc6IGRpY3Rpb25hcnkubGVuZ3RoLFxuICAgICAgICAgICAgJ2NvbHVtbnMnOiBjb2x1bW5zXG4gICAgICAgIH1cbiAgICB9LCBudWxsLCAyKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiByZWNvcmRCYXRjaFRvSlNPTihyZWNvcmRzKSB7XG4gICAgY29uc3QgW2NvbHVtbnNdID0gSlNPTlZlY3RvckFzc2VtYmxlci5hc3NlbWJsZShyZWNvcmRzKTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAnY291bnQnOiByZWNvcmRzLm51bVJvd3MsXG4gICAgICAgICdjb2x1bW5zJzogY29sdW1uc1xuICAgIH0sIG51bGwsIDIpO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD13cml0ZXIubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG52YXIgX2E7XG5pbXBvcnQgeyBEYXRhLCBtYWtlRGF0YSB9IGZyb20gJy4vZGF0YS5tanMnO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tICcuL3RhYmxlLm1qcyc7XG5pbXBvcnQgeyBWZWN0b3IgfSBmcm9tICcuL3ZlY3Rvci5tanMnO1xuaW1wb3J0IHsgU2NoZW1hLCBGaWVsZCB9IGZyb20gJy4vc2NoZW1hLm1qcyc7XG5pbXBvcnQgeyBEYXRhVHlwZSwgU3RydWN0LCBOdWxsIH0gZnJvbSAnLi90eXBlLm1qcyc7XG5pbXBvcnQgeyBpbnN0YW5jZSBhcyBnZXRWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yL2dldC5tanMnO1xuaW1wb3J0IHsgaW5zdGFuY2UgYXMgc2V0VmlzaXRvciB9IGZyb20gJy4vdmlzaXRvci9zZXQubWpzJztcbmltcG9ydCB7IGluc3RhbmNlIGFzIGluZGV4T2ZWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yL2luZGV4b2YubWpzJztcbmltcG9ydCB7IGluc3RhbmNlIGFzIGl0ZXJhdG9yVmlzaXRvciB9IGZyb20gJy4vdmlzaXRvci9pdGVyYXRvci5tanMnO1xuaW1wb3J0IHsgaW5zdGFuY2UgYXMgYnl0ZUxlbmd0aFZpc2l0b3IgfSBmcm9tICcuL3Zpc2l0b3IvYnl0ZWxlbmd0aC5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBSZWNvcmRCYXRjaCB7XG4gICAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDI6IHtcbiAgICAgICAgICAgICAgICBbdGhpcy5zY2hlbWFdID0gYXJncztcbiAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnNjaGVtYSBpbnN0YW5jZW9mIFNjaGVtYSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVjb3JkQmF0Y2ggY29uc3RydWN0b3IgZXhwZWN0cyBhIFtTY2hlbWEsIERhdGFdIHBhaXIuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFssXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG1ha2VEYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGxDb3VudDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG5ldyBTdHJ1Y3QodGhpcy5zY2hlbWEuZmllbGRzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiB0aGlzLnNjaGVtYS5maWVsZHMubWFwKChmKSA9PiBtYWtlRGF0YSh7IHR5cGU6IGYudHlwZSwgbnVsbENvdW50OiAwIH0pKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIF0gPSBhcmdzO1xuICAgICAgICAgICAgICAgIGlmICghKHRoaXMuZGF0YSBpbnN0YW5jZW9mIERhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlY29yZEJhdGNoIGNvbnN0cnVjdG9yIGV4cGVjdHMgYSBbU2NoZW1hLCBEYXRhXSBwYWlyLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBbdGhpcy5zY2hlbWEsIHRoaXMuZGF0YV0gPSBlbnN1cmVTYW1lTGVuZ3RoRGF0YSh0aGlzLnNjaGVtYSwgdGhpcy5kYXRhLmNoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgMToge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtvYmpdID0gYXJncztcbiAgICAgICAgICAgICAgICBjb25zdCB7IGZpZWxkcywgY2hpbGRyZW4sIGxlbmd0aCB9ID0gT2JqZWN0LmtleXMob2JqKS5yZWR1Y2UoKG1lbW8sIG5hbWUsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbWVtby5jaGlsZHJlbltpXSA9IG9ialtuYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgbWVtby5sZW5ndGggPSBNYXRoLm1heChtZW1vLmxlbmd0aCwgb2JqW25hbWVdLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIG1lbW8uZmllbGRzW2ldID0gRmllbGQubmV3KHsgbmFtZSwgdHlwZTogb2JqW25hbWVdLnR5cGUsIG51bGxhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVtbztcbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aDogMCxcbiAgICAgICAgICAgICAgICAgICAgZmllbGRzOiBuZXcgQXJyYXkoKSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IG5ldyBBcnJheSgpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IG5ldyBTY2hlbWEoZmllbGRzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gbWFrZURhdGEoeyB0eXBlOiBuZXcgU3RydWN0KGZpZWxkcyksIGxlbmd0aCwgY2hpbGRyZW4sIG51bGxDb3VudDogMCB9KTtcbiAgICAgICAgICAgICAgICBbdGhpcy5zY2hlbWEsIHRoaXMuZGF0YV0gPSBlbnN1cmVTYW1lTGVuZ3RoRGF0YShzY2hlbWEsIGRhdGEuY2hpbGRyZW4sIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWNvcmRCYXRjaCBjb25zdHJ1Y3RvciBleHBlY3RzIGFuIE9iamVjdCBtYXBwaW5nIG5hbWVzIHRvIGNoaWxkIERhdGEsIG9yIGEgW1NjaGVtYSwgRGF0YV0gcGFpci4nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZGljdGlvbmFyaWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGljdGlvbmFyaWVzIHx8ICh0aGlzLl9kaWN0aW9uYXJpZXMgPSBjb2xsZWN0RGljdGlvbmFyaWVzKHRoaXMuc2NoZW1hLmZpZWxkcywgdGhpcy5kYXRhLmNoaWxkcmVuKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGlzIFJlY29yZEJhdGNoLlxuICAgICAqL1xuICAgIGdldCBudW1Db2xzKCkgeyByZXR1cm4gdGhpcy5zY2hlbWEuZmllbGRzLmxlbmd0aDsgfVxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGlzIFJlY29yZEJhdGNoLlxuICAgICAqL1xuICAgIGdldCBudW1Sb3dzKCkgeyByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aDsgfVxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbnVsbCByb3dzIGluIHRoaXMgUmVjb3JkQmF0Y2guXG4gICAgICovXG4gICAgZ2V0IG51bGxDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5udWxsQ291bnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBudWxsLlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdG8gcmVhZCB0aGUgdmFsaWRpdHkgYml0bWFwLlxuICAgICAqL1xuICAgIGlzVmFsaWQoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5nZXRWYWxpZChpbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhIHJvdyBieSBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJlYWQuXG4gICAgICovXG4gICAgZ2V0KGluZGV4KSB7XG4gICAgICAgIHJldHVybiBnZXRWaXNpdG9yLnZpc2l0KHRoaXMuZGF0YSwgaW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgYSByb3cgYnkgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKi9cbiAgICBzZXQoaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBzZXRWaXNpdG9yLnZpc2l0KHRoaXMuZGF0YSwgaW5kZXgsIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGEgcm93IGluIGFuIFJlY29yZEJhdGNoLlxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSByb3cgdG8gbG9jYXRlIGluIHRoZSBSZWNvcmRCYXRjaC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBpbmRleCBhdCB3aGljaCB0byBiZWdpbiB0aGUgc2VhcmNoLiBJZiBvZmZzZXQgaXMgb21pdHRlZCwgdGhlIHNlYXJjaCBzdGFydHMgYXQgaW5kZXggMC5cbiAgICAgKi9cbiAgICBpbmRleE9mKGVsZW1lbnQsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gaW5kZXhPZlZpc2l0b3IudmlzaXQodGhpcy5kYXRhLCBlbGVtZW50LCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNpemUgKGluIGJ5dGVzKSBvZiBhIHJvdyBieSBpbmRleC5cbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIHJvdyBpbmRleCBmb3Igd2hpY2ggdG8gY29tcHV0ZSB0aGUgYnl0ZUxlbmd0aC5cbiAgICAgKi9cbiAgICBnZXRCeXRlTGVuZ3RoKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBieXRlTGVuZ3RoVmlzaXRvci52aXNpdCh0aGlzLmRhdGEsIGluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXRlcmF0b3IgZm9yIHJvd3MgaW4gdGhpcyBSZWNvcmRCYXRjaC5cbiAgICAgKi9cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yVmlzaXRvci52aXNpdChuZXcgVmVjdG9yKFt0aGlzLmRhdGFdKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIEphdmFTY3JpcHQgQXJyYXkgb2YgdGhlIFJlY29yZEJhdGNoIHJvd3MuXG4gICAgICogQHJldHVybnMgQW4gQXJyYXkgb2YgUmVjb3JkQmF0Y2ggcm93cy5cbiAgICAgKi9cbiAgICB0b0FycmF5KCkge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXNdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21iaW5lcyB0d28gb3IgbW9yZSBSZWNvcmRCYXRjaCBvZiB0aGUgc2FtZSBzY2hlbWEuXG4gICAgICogQHBhcmFtIG90aGVycyBBZGRpdGlvbmFsIFJlY29yZEJhdGNoIHRvIGFkZCB0byB0aGUgZW5kIG9mIHRoaXMgUmVjb3JkQmF0Y2guXG4gICAgICovXG4gICAgY29uY2F0KC4uLm90aGVycykge1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlKHRoaXMuc2NoZW1hLCBbdGhpcywgLi4ub3RoZXJzXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIHplcm8tY29weSBzdWItc2VjdGlvbiBvZiB0aGlzIFJlY29yZEJhdGNoLlxuICAgICAqIEBwYXJhbSBzdGFydCBUaGUgYmVnaW5uaW5nIG9mIHRoZSBzcGVjaWZpZWQgcG9ydGlvbiBvZiB0aGUgUmVjb3JkQmF0Y2guXG4gICAgICogQHBhcmFtIGVuZCBUaGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgcG9ydGlvbiBvZiB0aGUgUmVjb3JkQmF0Y2guIFRoaXMgaXMgZXhjbHVzaXZlIG9mIHRoZSBlbGVtZW50IGF0IHRoZSBpbmRleCAnZW5kJy5cbiAgICAgKi9cbiAgICBzbGljZShiZWdpbiwgZW5kKSB7XG4gICAgICAgIGNvbnN0IFtzbGljZV0gPSBuZXcgVmVjdG9yKFt0aGlzLmRhdGFdKS5zbGljZShiZWdpbiwgZW5kKS5kYXRhO1xuICAgICAgICByZXR1cm4gbmV3IFJlY29yZEJhdGNoKHRoaXMuc2NoZW1hLCBzbGljZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjaGlsZCBWZWN0b3IgYnkgbmFtZSwgb3IgbnVsbCBpZiB0aGlzIFZlY3RvciBoYXMgbm8gY2hpbGQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY2hpbGQgdG8gcmV0cmlldmUuXG4gICAgICovXG4gICAgZ2V0Q2hpbGQobmFtZSkge1xuICAgICAgICB2YXIgX2I7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENoaWxkQXQoKF9iID0gdGhpcy5zY2hlbWEuZmllbGRzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmluZEluZGV4KChmKSA9PiBmLm5hbWUgPT09IG5hbWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNoaWxkIFZlY3RvciBieSBpbmRleCwgb3IgbnVsbCBpZiB0aGlzIFZlY3RvciBoYXMgbm8gY2hpbGQgYXQgdGhlIHN1cHBsaWVkIGluZGV4LlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIHJldHJpZXZlLlxuICAgICAqL1xuICAgIGdldENoaWxkQXQoaW5kZXgpIHtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEgJiYgaW5kZXggPCB0aGlzLnNjaGVtYS5maWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFZlY3RvcihbdGhpcy5kYXRhLmNoaWxkcmVuW2luZGV4XV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgY2hpbGQgVmVjdG9yIGJ5IG5hbWUuXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNoaWxkIHRvIG92ZXJ3cml0ZS5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBSZWNvcmRCYXRjaCB3aXRoIHRoZSBuZXcgY2hpbGQgZm9yIHRoZSBzcGVjaWZpZWQgbmFtZS5cbiAgICAgKi9cbiAgICBzZXRDaGlsZChuYW1lLCBjaGlsZCkge1xuICAgICAgICB2YXIgX2I7XG4gICAgICAgIHJldHVybiB0aGlzLnNldENoaWxkQXQoKF9iID0gdGhpcy5zY2hlbWEuZmllbGRzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmluZEluZGV4KChmKSA9PiBmLm5hbWUgPT09IG5hbWUpLCBjaGlsZCk7XG4gICAgfVxuICAgIHNldENoaWxkQXQoaW5kZXgsIGNoaWxkKSB7XG4gICAgICAgIGxldCBzY2hlbWEgPSB0aGlzLnNjaGVtYTtcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIGlmIChpbmRleCA+IC0xICYmIGluZGV4IDwgdGhpcy5udW1Db2xzKSB7XG4gICAgICAgICAgICBpZiAoIWNoaWxkKSB7XG4gICAgICAgICAgICAgICAgY2hpbGQgPSBuZXcgVmVjdG9yKFttYWtlRGF0YSh7IHR5cGU6IG5ldyBOdWxsLCBsZW5ndGg6IHRoaXMubnVtUm93cyB9KV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmllbGRzID0gc2NoZW1hLmZpZWxkcy5zbGljZSgpO1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBkYXRhLmNoaWxkcmVuLnNsaWNlKCk7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGZpZWxkc1tpbmRleF0uY2xvbmUoeyB0eXBlOiBjaGlsZC50eXBlIH0pO1xuICAgICAgICAgICAgW2ZpZWxkc1tpbmRleF0sIGNoaWxkcmVuW2luZGV4XV0gPSBbZmllbGQsIGNoaWxkLmRhdGFbMF1dO1xuICAgICAgICAgICAgc2NoZW1hID0gbmV3IFNjaGVtYShmaWVsZHMsIG5ldyBNYXAodGhpcy5zY2hlbWEubWV0YWRhdGEpKTtcbiAgICAgICAgICAgIGRhdGEgPSBtYWtlRGF0YSh7IHR5cGU6IG5ldyBTdHJ1Y3QoZmllbGRzKSwgY2hpbGRyZW4gfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZWNvcmRCYXRjaChzY2hlbWEsIGRhdGEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgUmVjb3JkQmF0Y2ggY29udGFpbmluZyBvbmx5IHNwZWNpZmllZCBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbHVtbk5hbWVzIE5hbWVzIG9mIGNvbHVtbnMgdG8ga2VlcC5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBSZWNvcmRCYXRjaCBvZiBjb2x1bW5zIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgbmFtZXMuXG4gICAgICovXG4gICAgc2VsZWN0KGNvbHVtbk5hbWVzKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuc2NoZW1hLnNlbGVjdChjb2x1bW5OYW1lcyk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBuZXcgU3RydWN0KHNjaGVtYS5maWVsZHMpO1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgY29sdW1uTmFtZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zY2hlbWEuZmllbGRzLmZpbmRJbmRleCgoZikgPT4gZi5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICAgIGlmICh+aW5kZXgpIHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbltpbmRleF0gPSB0aGlzLmRhdGEuY2hpbGRyZW5baW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVjb3JkQmF0Y2goc2NoZW1hLCBtYWtlRGF0YSh7IHR5cGUsIGxlbmd0aDogdGhpcy5udW1Sb3dzLCBjaGlsZHJlbiB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIG5ldyBSZWNvcmRCYXRjaCBjb250YWluaW5nIG9ubHkgY29sdW1ucyBhdCB0aGUgc3BlY2lmaWVkIGluZGljZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29sdW1uSW5kaWNlcyBJbmRpY2VzIG9mIGNvbHVtbnMgdG8ga2VlcC5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBSZWNvcmRCYXRjaCBvZiBjb2x1bW5zIG1hdGNoaW5nIGF0IHRoZSBzcGVjaWZpZWQgaW5kaWNlcy5cbiAgICAgKi9cbiAgICBzZWxlY3RBdChjb2x1bW5JbmRpY2VzKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuc2NoZW1hLnNlbGVjdEF0KGNvbHVtbkluZGljZXMpO1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNvbHVtbkluZGljZXMubWFwKChpKSA9PiB0aGlzLmRhdGEuY2hpbGRyZW5baV0pLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgY29uc3Qgc3Vic2V0ID0gbWFrZURhdGEoeyB0eXBlOiBuZXcgU3RydWN0KHNjaGVtYS5maWVsZHMpLCBsZW5ndGg6IHRoaXMubnVtUm93cywgY2hpbGRyZW4gfSk7XG4gICAgICAgIHJldHVybiBuZXcgUmVjb3JkQmF0Y2goc2NoZW1hLCBzdWJzZXQpO1xuICAgIH1cbn1cbl9hID0gU3ltYm9sLnRvU3RyaW5nVGFnO1xuLy8gSW5pdGlhbGl6ZSB0aGlzIHN0YXRpYyBwcm9wZXJ0eSB2aWEgYW4gSUlGRSBzbyBidW5kbGVycyBkb24ndCB0cmVlLXNoYWtlXG4vLyBvdXQgdGhpcyBsb2dpYywgYnV0IGFsc28gc28gd2UncmUgc3RpbGwgY29tcGxpYW50IHdpdGggYFwic2lkZUVmZmVjdHNcIjogZmFsc2VgXG5SZWNvcmRCYXRjaFtfYV0gPSAoKHByb3RvKSA9PiB7XG4gICAgcHJvdG8uX251bGxDb3VudCA9IC0xO1xuICAgIHByb3RvW1N5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGVdID0gdHJ1ZTtcbiAgICByZXR1cm4gJ1JlY29yZEJhdGNoJztcbn0pKFJlY29yZEJhdGNoLnByb3RvdHlwZSk7XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZW5zdXJlU2FtZUxlbmd0aERhdGEoc2NoZW1hLCBjaHVua3MsIG1heExlbmd0aCA9IGNodW5rcy5yZWR1Y2UoKG1heCwgY29sKSA9PiBNYXRoLm1heChtYXgsIGNvbC5sZW5ndGgpLCAwKSkge1xuICAgIHZhciBfYjtcbiAgICBjb25zdCBmaWVsZHMgPSBbLi4uc2NoZW1hLmZpZWxkc107XG4gICAgY29uc3QgY2hpbGRyZW4gPSBbLi4uY2h1bmtzXTtcbiAgICBjb25zdCBudWxsQml0bWFwU2l6ZSA9ICgobWF4TGVuZ3RoICsgNjMpICYgfjYzKSA+PiAzO1xuICAgIGZvciAoY29uc3QgW2lkeCwgZmllbGRdIG9mIHNjaGVtYS5maWVsZHMuZW50cmllcygpKSB7XG4gICAgICAgIGNvbnN0IGNodW5rID0gY2h1bmtzW2lkeF07XG4gICAgICAgIGlmICghY2h1bmsgfHwgY2h1bmsubGVuZ3RoICE9PSBtYXhMZW5ndGgpIHtcbiAgICAgICAgICAgIGZpZWxkc1tpZHhdID0gZmllbGQuY2xvbmUoeyBudWxsYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGNoaWxkcmVuW2lkeF0gPSAoX2IgPSBjaHVuayA9PT0gbnVsbCB8fCBjaHVuayA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2h1bmsuX2NoYW5nZUxlbmd0aEFuZEJhY2tmaWxsTnVsbEJpdG1hcChtYXhMZW5ndGgpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBtYWtlRGF0YSh7XG4gICAgICAgICAgICAgICAgdHlwZTogZmllbGQudHlwZSxcbiAgICAgICAgICAgICAgICBsZW5ndGg6IG1heExlbmd0aCxcbiAgICAgICAgICAgICAgICBudWxsQ291bnQ6IG1heExlbmd0aCxcbiAgICAgICAgICAgICAgICBudWxsQml0bWFwOiBuZXcgVWludDhBcnJheShudWxsQml0bWFwU2l6ZSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICAgIHNjaGVtYS5hc3NpZ24oZmllbGRzKSxcbiAgICAgICAgbWFrZURhdGEoeyB0eXBlOiBuZXcgU3RydWN0KGZpZWxkcyksIGxlbmd0aDogbWF4TGVuZ3RoLCBjaGlsZHJlbiB9KVxuICAgIF07XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gY29sbGVjdERpY3Rpb25hcmllcyhmaWVsZHMsIGNoaWxkcmVuLCBkaWN0aW9uYXJpZXMgPSBuZXcgTWFwKCkpIHtcbiAgICBmb3IgKGxldCBpID0gLTEsIG4gPSBmaWVsZHMubGVuZ3RoOyArK2kgPCBuOykge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGZpZWxkc1tpXTtcbiAgICAgICAgY29uc3QgdHlwZSA9IGZpZWxkLnR5cGU7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgaWYgKERhdGFUeXBlLmlzRGljdGlvbmFyeSh0eXBlKSkge1xuICAgICAgICAgICAgaWYgKCFkaWN0aW9uYXJpZXMuaGFzKHR5cGUuaWQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuZGljdGlvbmFyeSkge1xuICAgICAgICAgICAgICAgICAgICBkaWN0aW9uYXJpZXMuc2V0KHR5cGUuaWQsIGRhdGEuZGljdGlvbmFyeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZGljdGlvbmFyaWVzLmdldCh0eXBlLmlkKSAhPT0gZGF0YS5kaWN0aW9uYXJ5KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY3JlYXRlIFNjaGVtYSBjb250YWluaW5nIHR3byBkaWZmZXJlbnQgZGljdGlvbmFyaWVzIHdpdGggdGhlIHNhbWUgSWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZS5jaGlsZHJlbiAmJiB0eXBlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbGxlY3REaWN0aW9uYXJpZXModHlwZS5jaGlsZHJlbiwgZGF0YS5jaGlsZHJlbiwgZGljdGlvbmFyaWVzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGljdGlvbmFyaWVzO1xufVxuLyoqXG4gKiBBbiBpbnRlcm5hbCBjbGFzcyB1c2VkIGJ5IHRoZSBgUmVjb3JkQmF0Y2hSZWFkZXJgIGFuZCBgUmVjb3JkQmF0Y2hXcml0ZXJgXG4gKiBpbXBsZW1lbnRhdGlvbnMgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEgc3RyZWFtIHdpdGggdmFsaWQgemVyby1sZW5ndGhcbiAqIFJlY29yZEJhdGNoZXMsIGFuZCBhIHN0cmVhbSB3aXRoIGEgU2NoZW1hIG1lc3NhZ2UsIGJ1dCBubyBSZWNvcmRCYXRjaGVzLlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Fycm93L3B1bGwvNDM3M1xuICogQGlnbm9yZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIF9JbnRlcm5hbEVtcHR5UGxhY2Vob2xkZXJSZWNvcmRCYXRjaCBleHRlbmRzIFJlY29yZEJhdGNoIHtcbiAgICBjb25zdHJ1Y3RvcihzY2hlbWEpIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBzY2hlbWEuZmllbGRzLm1hcCgoZikgPT4gbWFrZURhdGEoeyB0eXBlOiBmLnR5cGUgfSkpO1xuICAgICAgICBjb25zdCBkYXRhID0gbWFrZURhdGEoeyB0eXBlOiBuZXcgU3RydWN0KHNjaGVtYS5maWVsZHMpLCBudWxsQ291bnQ6IDAsIGNoaWxkcmVuIH0pO1xuICAgICAgICBzdXBlcihzY2hlbWEsIGRhdGEpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVjb3JkYmF0Y2gubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBWZWN0b3IgfSBmcm9tICcuLi92ZWN0b3IubWpzJztcbmltcG9ydCB7IHZhbHVlVG9TdHJpbmcgfSBmcm9tICcuLi91dGlsL3ByZXR0eS5tanMnO1xuaW1wb3J0IHsgaW5zdGFuY2UgYXMgZ2V0VmlzaXRvciB9IGZyb20gJy4uL3Zpc2l0b3IvZ2V0Lm1qcyc7XG5pbXBvcnQgeyBpbnN0YW5jZSBhcyBzZXRWaXNpdG9yIH0gZnJvbSAnLi4vdmlzaXRvci9zZXQubWpzJztcbi8qKiBAaWdub3JlICovIGV4cG9ydCBjb25zdCBrS2V5cyA9IFN5bWJvbC5mb3IoJ2tleXMnKTtcbi8qKiBAaWdub3JlICovIGV4cG9ydCBjb25zdCBrVmFscyA9IFN5bWJvbC5mb3IoJ3ZhbHMnKTtcbmV4cG9ydCBjbGFzcyBNYXBSb3cge1xuICAgIGNvbnN0cnVjdG9yKHNsaWNlKSB7XG4gICAgICAgIHRoaXNba0tleXNdID0gbmV3IFZlY3Rvcihbc2xpY2UuY2hpbGRyZW5bMF1dKS5tZW1vaXplKCk7XG4gICAgICAgIHRoaXNba1ZhbHNdID0gc2xpY2UuY2hpbGRyZW5bMV07XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkodGhpcywgbmV3IE1hcFJvd1Byb3h5SGFuZGxlcigpKTtcbiAgICB9XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWFwUm93SXRlcmF0b3IodGhpc1trS2V5c10sIHRoaXNba1ZhbHNdKTtcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7IHJldHVybiB0aGlzW2tLZXlzXS5sZW5ndGg7IH1cbiAgICB0b0FycmF5KCkgeyByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLnRvSlNPTigpKTsgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IHRoaXNba0tleXNdO1xuICAgICAgICBjb25zdCB2YWxzID0gdGhpc1trVmFsc107XG4gICAgICAgIGNvbnN0IGpzb24gPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IC0xLCBuID0ga2V5cy5sZW5ndGg7ICsraSA8IG47KSB7XG4gICAgICAgICAgICBqc29uW2tleXMuZ2V0KGkpXSA9IGdldFZpc2l0b3IudmlzaXQodmFscywgaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYHske1suLi50aGlzXS5tYXAoKFtrZXksIHZhbF0pID0+IGAke3ZhbHVlVG9TdHJpbmcoa2V5KX06ICR7dmFsdWVUb1N0cmluZyh2YWwpfWApLmpvaW4oJywgJyl9fWA7XG4gICAgfVxuICAgIFtTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgICB9XG59XG5jbGFzcyBNYXBSb3dJdGVyYXRvciB7XG4gICAgY29uc3RydWN0b3Ioa2V5cywgdmFscykge1xuICAgICAgICB0aGlzLmtleXMgPSBrZXlzO1xuICAgICAgICB0aGlzLnZhbHMgPSB2YWxzO1xuICAgICAgICB0aGlzLmtleUluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5udW1LZXlzID0ga2V5cy5sZW5ndGg7XG4gICAgfVxuICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmtleUluZGV4O1xuICAgICAgICBpZiAoaSA9PT0gdGhpcy5udW1LZXlzKSB7XG4gICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogbnVsbCB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMua2V5SW5kZXgrKztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IFtcbiAgICAgICAgICAgICAgICB0aGlzLmtleXMuZ2V0KGkpLFxuICAgICAgICAgICAgICAgIGdldFZpc2l0b3IudmlzaXQodGhpcy52YWxzLCBpKSxcbiAgICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuY2xhc3MgTWFwUm93UHJveHlIYW5kbGVyIHtcbiAgICBpc0V4dGVuc2libGUoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGRlbGV0ZVByb3BlcnR5KCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBwcmV2ZW50RXh0ZW5zaW9ucygpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBvd25LZXlzKHJvdykge1xuICAgICAgICByZXR1cm4gcm93W2tLZXlzXS50b0FycmF5KCkubWFwKFN0cmluZyk7XG4gICAgfVxuICAgIGhhcyhyb3csIGtleSkge1xuICAgICAgICByZXR1cm4gcm93W2tLZXlzXS5pbmNsdWRlcyhrZXkpO1xuICAgIH1cbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iocm93LCBrZXkpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gcm93W2tLZXlzXS5pbmRleE9mKGtleSk7XG4gICAgICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4geyB3cml0YWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBnZXQocm93LCBrZXkpIHtcbiAgICAgICAgLy8gTG9vayB1cCBrZXkgaW4gcm93IGZpcnN0XG4gICAgICAgIGlmIChSZWZsZWN0Lmhhcyhyb3csIGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiByb3dba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpZHggPSByb3dba0tleXNdLmluZGV4T2Yoa2V5KTtcbiAgICAgICAgaWYgKGlkeCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IGdldFZpc2l0b3IudmlzaXQoUmVmbGVjdC5nZXQocm93LCBrVmFscyksIGlkeCk7XG4gICAgICAgICAgICAvLyBDYWNoZSBrZXkvdmFsIGxvb2t1cHNcbiAgICAgICAgICAgIFJlZmxlY3Quc2V0KHJvdywga2V5LCB2YWwpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXQocm93LCBrZXksIHZhbCkge1xuICAgICAgICBjb25zdCBpZHggPSByb3dba0tleXNdLmluZGV4T2Yoa2V5KTtcbiAgICAgICAgaWYgKGlkeCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHNldFZpc2l0b3IudmlzaXQoUmVmbGVjdC5nZXQocm93LCBrVmFscyksIGlkeCwgdmFsKTtcbiAgICAgICAgICAgIC8vIENhY2hlIGtleS92YWwgbG9va3Vwc1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHJvdywga2V5LCB2YWwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFJlZmxlY3QuaGFzKHJvdywga2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHJvdywga2V5LCB2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhNYXBSb3cucHJvdG90eXBlLCB7XG4gICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgZW51bWVyYWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIHZhbHVlOiAnUm93JyB9LFxuICAgIFtrS2V5c106IHsgd3JpdGFibGU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCB2YWx1ZTogbnVsbCB9LFxuICAgIFtrVmFsc106IHsgd3JpdGFibGU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCB2YWx1ZTogbnVsbCB9LFxufSk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hcC5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IHZhbHVlVG9TdHJpbmcgfSBmcm9tICcuLi91dGlsL3ByZXR0eS5tanMnO1xuaW1wb3J0IHsgaW5zdGFuY2UgYXMgZ2V0VmlzaXRvciB9IGZyb20gJy4uL3Zpc2l0b3IvZ2V0Lm1qcyc7XG5pbXBvcnQgeyBpbnN0YW5jZSBhcyBzZXRWaXNpdG9yIH0gZnJvbSAnLi4vdmlzaXRvci9zZXQubWpzJztcbi8qKiBAaWdub3JlICovIGNvbnN0IGtQYXJlbnQgPSBTeW1ib2wuZm9yKCdwYXJlbnQnKTtcbi8qKiBAaWdub3JlICovIGNvbnN0IGtSb3dJbmRleCA9IFN5bWJvbC5mb3IoJ3Jvd0luZGV4Jyk7XG5leHBvcnQgY2xhc3MgU3RydWN0Um93IHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIHJvd0luZGV4KSB7XG4gICAgICAgIHRoaXNba1BhcmVudF0gPSBwYXJlbnQ7XG4gICAgICAgIHRoaXNba1Jvd0luZGV4XSA9IHJvd0luZGV4O1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KHRoaXMsIG5ldyBTdHJ1Y3RSb3dQcm94eUhhbmRsZXIoKSk7XG4gICAgfVxuICAgIHRvQXJyYXkoKSB7IHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMudG9KU09OKCkpOyB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBjb25zdCBpID0gdGhpc1trUm93SW5kZXhdO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzW2tQYXJlbnRdO1xuICAgICAgICBjb25zdCBrZXlzID0gcGFyZW50LnR5cGUuY2hpbGRyZW47XG4gICAgICAgIGNvbnN0IGpzb24gPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaiA9IC0xLCBuID0ga2V5cy5sZW5ndGg7ICsraiA8IG47KSB7XG4gICAgICAgICAgICBqc29uW2tleXNbal0ubmFtZV0gPSBnZXRWaXNpdG9yLnZpc2l0KHBhcmVudC5jaGlsZHJlbltqXSwgaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYHske1suLi50aGlzXS5tYXAoKFtrZXksIHZhbF0pID0+IGAke3ZhbHVlVG9TdHJpbmcoa2V5KX06ICR7dmFsdWVUb1N0cmluZyh2YWwpfWApLmpvaW4oJywgJyl9fWA7XG4gICAgfVxuICAgIFtTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RydWN0Um93SXRlcmF0b3IodGhpc1trUGFyZW50XSwgdGhpc1trUm93SW5kZXhdKTtcbiAgICB9XG59XG5jbGFzcyBTdHJ1Y3RSb3dJdGVyYXRvciB7XG4gICAgY29uc3RydWN0b3IoZGF0YSwgcm93SW5kZXgpIHtcbiAgICAgICAgdGhpcy5jaGlsZEluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGRhdGEuY2hpbGRyZW47XG4gICAgICAgIHRoaXMucm93SW5kZXggPSByb3dJbmRleDtcbiAgICAgICAgdGhpcy5jaGlsZEZpZWxkcyA9IGRhdGEudHlwZS5jaGlsZHJlbjtcbiAgICAgICAgdGhpcy5udW1DaGlsZHJlbiA9IHRoaXMuY2hpbGRGaWVsZHMubGVuZ3RoO1xuICAgIH1cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICBuZXh0KCkge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5jaGlsZEluZGV4O1xuICAgICAgICBpZiAoaSA8IHRoaXMubnVtQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRJbmRleCA9IGkgKyAxO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkRmllbGRzW2ldLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGdldFZpc2l0b3IudmlzaXQodGhpcy5jaGlsZHJlbltpXSwgdGhpcy5yb3dJbmRleClcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBudWxsIH07XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoU3RydWN0Um93LnByb3RvdHlwZSwge1xuICAgIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7IGVudW1lcmFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCB2YWx1ZTogJ1JvdycgfSxcbiAgICBba1BhcmVudF06IHsgd3JpdGFibGU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCB2YWx1ZTogbnVsbCB9LFxuICAgIFtrUm93SW5kZXhdOiB7IHdyaXRhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgdmFsdWU6IC0xIH0sXG59KTtcbmNsYXNzIFN0cnVjdFJvd1Byb3h5SGFuZGxlciB7XG4gICAgaXNFeHRlbnNpYmxlKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBkZWxldGVQcm9wZXJ0eSgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgcHJldmVudEV4dGVuc2lvbnMoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgb3duS2V5cyhyb3cpIHtcbiAgICAgICAgcmV0dXJuIHJvd1trUGFyZW50XS50eXBlLmNoaWxkcmVuLm1hcCgoZikgPT4gZi5uYW1lKTtcbiAgICB9XG4gICAgaGFzKHJvdywga2V5KSB7XG4gICAgICAgIHJldHVybiByb3dba1BhcmVudF0udHlwZS5jaGlsZHJlbi5maW5kSW5kZXgoKGYpID0+IGYubmFtZSA9PT0ga2V5KSAhPT0gLTE7XG4gICAgfVxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihyb3csIGtleSkge1xuICAgICAgICBpZiAocm93W2tQYXJlbnRdLnR5cGUuY2hpbGRyZW4uZmluZEluZGV4KChmKSA9PiBmLm5hbWUgPT09IGtleSkgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4geyB3cml0YWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBnZXQocm93LCBrZXkpIHtcbiAgICAgICAgLy8gTG9vayB1cCBrZXkgaW4gcm93IGZpcnN0XG4gICAgICAgIGlmIChSZWZsZWN0Lmhhcyhyb3csIGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiByb3dba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpZHggPSByb3dba1BhcmVudF0udHlwZS5jaGlsZHJlbi5maW5kSW5kZXgoKGYpID0+IGYubmFtZSA9PT0ga2V5KTtcbiAgICAgICAgaWYgKGlkeCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IGdldFZpc2l0b3IudmlzaXQocm93W2tQYXJlbnRdLmNoaWxkcmVuW2lkeF0sIHJvd1trUm93SW5kZXhdKTtcbiAgICAgICAgICAgIC8vIENhY2hlIGtleS92YWwgbG9va3Vwc1xuICAgICAgICAgICAgUmVmbGVjdC5zZXQocm93LCBrZXksIHZhbCk7XG4gICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldChyb3csIGtleSwgdmFsKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHJvd1trUGFyZW50XS50eXBlLmNoaWxkcmVuLmZpbmRJbmRleCgoZikgPT4gZi5uYW1lID09PSBrZXkpO1xuICAgICAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgICAgICAgc2V0VmlzaXRvci52aXNpdChyb3dba1BhcmVudF0uY2hpbGRyZW5baWR4XSwgcm93W2tSb3dJbmRleF0sIHZhbCk7XG4gICAgICAgICAgICAvLyBDYWNoZSBrZXkvdmFsIGxvb2t1cHNcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LnNldChyb3csIGtleSwgdmFsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChSZWZsZWN0Lmhhcyhyb3csIGtleSkgfHwgdHlwZW9mIGtleSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LnNldChyb3csIGtleSwgdmFsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJ1Y3QubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4vdHlwZS5tanMnO1xuZXhwb3J0IGNsYXNzIFNjaGVtYSB7XG4gICAgY29uc3RydWN0b3IoZmllbGRzID0gW10sIG1ldGFkYXRhLCBkaWN0aW9uYXJpZXMpIHtcbiAgICAgICAgdGhpcy5maWVsZHMgPSAoZmllbGRzIHx8IFtdKTtcbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhIHx8IG5ldyBNYXAoKTtcbiAgICAgICAgaWYgKCFkaWN0aW9uYXJpZXMpIHtcbiAgICAgICAgICAgIGRpY3Rpb25hcmllcyA9IGdlbmVyYXRlRGljdGlvbmFyeU1hcChmaWVsZHMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGljdGlvbmFyaWVzID0gZGljdGlvbmFyaWVzO1xuICAgIH1cbiAgICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7IHJldHVybiAnU2NoZW1hJzsgfVxuICAgIGdldCBuYW1lcygpIHsgcmV0dXJuIHRoaXMuZmllbGRzLm1hcCgoZikgPT4gZi5uYW1lKTsgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYFNjaGVtYTx7ICR7dGhpcy5maWVsZHMubWFwKChmLCBpKSA9PiBgJHtpfTogJHtmfWApLmpvaW4oJywgJyl9IH0+YDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgbmV3IFNjaGVtYSBjb250YWluaW5nIG9ubHkgc3BlY2lmaWVkIGZpZWxkcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWVsZE5hbWVzIE5hbWVzIG9mIGZpZWxkcyB0byBrZWVwLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IFNjaGVtYSBvZiBmaWVsZHMgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBuYW1lcy5cbiAgICAgKi9cbiAgICBzZWxlY3QoZmllbGROYW1lcykge1xuICAgICAgICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoZmllbGROYW1lcyk7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzLmZpbHRlcigoZikgPT4gbmFtZXMuaGFzKGYubmFtZSkpO1xuICAgICAgICByZXR1cm4gbmV3IFNjaGVtYShmaWVsZHMsIHRoaXMubWV0YWRhdGEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgU2NoZW1hIGNvbnRhaW5pbmcgb25seSBmaWVsZHMgYXQgdGhlIHNwZWNpZmllZCBpbmRpY2VzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpZWxkSW5kaWNlcyBJbmRpY2VzIG9mIGZpZWxkcyB0byBrZWVwLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IFNjaGVtYSBvZiBmaWVsZHMgYXQgdGhlIHNwZWNpZmllZCBpbmRpY2VzLlxuICAgICAqL1xuICAgIHNlbGVjdEF0KGZpZWxkSW5kaWNlcykge1xuICAgICAgICBjb25zdCBmaWVsZHMgPSBmaWVsZEluZGljZXMubWFwKChpKSA9PiB0aGlzLmZpZWxkc1tpXSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICByZXR1cm4gbmV3IFNjaGVtYShmaWVsZHMsIHRoaXMubWV0YWRhdGEpO1xuICAgIH1cbiAgICBhc3NpZ24oLi4uYXJncykge1xuICAgICAgICBjb25zdCBvdGhlciA9IChhcmdzWzBdIGluc3RhbmNlb2YgU2NoZW1hXG4gICAgICAgICAgICA/IGFyZ3NbMF1cbiAgICAgICAgICAgIDogQXJyYXkuaXNBcnJheShhcmdzWzBdKVxuICAgICAgICAgICAgICAgID8gbmV3IFNjaGVtYShhcmdzWzBdKVxuICAgICAgICAgICAgICAgIDogbmV3IFNjaGVtYShhcmdzKSk7XG4gICAgICAgIGNvbnN0IGN1ckZpZWxkcyA9IFsuLi50aGlzLmZpZWxkc107XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gbWVyZ2VNYXBzKG1lcmdlTWFwcyhuZXcgTWFwKCksIHRoaXMubWV0YWRhdGEpLCBvdGhlci5tZXRhZGF0YSk7XG4gICAgICAgIGNvbnN0IG5ld0ZpZWxkcyA9IG90aGVyLmZpZWxkcy5maWx0ZXIoKGYyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpID0gY3VyRmllbGRzLmZpbmRJbmRleCgoZikgPT4gZi5uYW1lID09PSBmMi5uYW1lKTtcbiAgICAgICAgICAgIHJldHVybiB+aSA/IChjdXJGaWVsZHNbaV0gPSBmMi5jbG9uZSh7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IG1lcmdlTWFwcyhtZXJnZU1hcHMobmV3IE1hcCgpLCBjdXJGaWVsZHNbaV0ubWV0YWRhdGEpLCBmMi5tZXRhZGF0YSlcbiAgICAgICAgICAgIH0pKSAmJiBmYWxzZSA6IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBuZXdEaWN0aW9uYXJpZXMgPSBnZW5lcmF0ZURpY3Rpb25hcnlNYXAobmV3RmllbGRzLCBuZXcgTWFwKCkpO1xuICAgICAgICByZXR1cm4gbmV3IFNjaGVtYShbLi4uY3VyRmllbGRzLCAuLi5uZXdGaWVsZHNdLCBtZXRhZGF0YSwgbmV3IE1hcChbLi4udGhpcy5kaWN0aW9uYXJpZXMsIC4uLm5ld0RpY3Rpb25hcmllc10pKTtcbiAgICB9XG59XG4vLyBBZGQgdGhlc2UgaGVyZSBzbyB0aGV5J3JlIHBpY2tlZCB1cCBieSB0aGUgZXh0ZXJucyBjcmVhdG9yXG4vLyBpbiB0aGUgYnVpbGQsIGFuZCBjbG9zdXJlLWNvbXBpbGVyIGRvZXNuJ3QgbWluaWZ5IHRoZW0gYXdheVxuU2NoZW1hLnByb3RvdHlwZS5maWVsZHMgPSBudWxsO1xuU2NoZW1hLnByb3RvdHlwZS5tZXRhZGF0YSA9IG51bGw7XG5TY2hlbWEucHJvdG90eXBlLmRpY3Rpb25hcmllcyA9IG51bGw7XG5leHBvcnQgY2xhc3MgRmllbGQge1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHR5cGUsIG51bGxhYmxlID0gZmFsc2UsIG1ldGFkYXRhKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMubnVsbGFibGUgPSBudWxsYWJsZTtcbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhIHx8IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIG5ldyguLi5hcmdzKSB7XG4gICAgICAgIGxldCBbbmFtZSwgdHlwZSwgbnVsbGFibGUsIG1ldGFkYXRhXSA9IGFyZ3M7XG4gICAgICAgIGlmIChhcmdzWzBdICYmIHR5cGVvZiBhcmdzWzBdID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgKHsgbmFtZSB9ID0gYXJnc1swXSk7XG4gICAgICAgICAgICAodHlwZSA9PT0gdW5kZWZpbmVkKSAmJiAodHlwZSA9IGFyZ3NbMF0udHlwZSk7XG4gICAgICAgICAgICAobnVsbGFibGUgPT09IHVuZGVmaW5lZCkgJiYgKG51bGxhYmxlID0gYXJnc1swXS5udWxsYWJsZSk7XG4gICAgICAgICAgICAobWV0YWRhdGEgPT09IHVuZGVmaW5lZCkgJiYgKG1ldGFkYXRhID0gYXJnc1swXS5tZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBGaWVsZChgJHtuYW1lfWAsIHR5cGUsIG51bGxhYmxlLCBtZXRhZGF0YSk7XG4gICAgfVxuICAgIGdldCB0eXBlSWQoKSB7IHJldHVybiB0aGlzLnR5cGUudHlwZUlkOyB9XG4gICAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkgeyByZXR1cm4gJ0ZpZWxkJzsgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gYCR7dGhpcy5uYW1lfTogJHt0aGlzLnR5cGV9YDsgfVxuICAgIGNsb25lKC4uLmFyZ3MpIHtcbiAgICAgICAgbGV0IFtuYW1lLCB0eXBlLCBudWxsYWJsZSwgbWV0YWRhdGFdID0gYXJncztcbiAgICAgICAgKCFhcmdzWzBdIHx8IHR5cGVvZiBhcmdzWzBdICE9PSAnb2JqZWN0JylcbiAgICAgICAgICAgID8gKFtuYW1lID0gdGhpcy5uYW1lLCB0eXBlID0gdGhpcy50eXBlLCBudWxsYWJsZSA9IHRoaXMubnVsbGFibGUsIG1ldGFkYXRhID0gdGhpcy5tZXRhZGF0YV0gPSBhcmdzKVxuICAgICAgICAgICAgOiAoeyBuYW1lID0gdGhpcy5uYW1lLCB0eXBlID0gdGhpcy50eXBlLCBudWxsYWJsZSA9IHRoaXMubnVsbGFibGUsIG1ldGFkYXRhID0gdGhpcy5tZXRhZGF0YSB9ID0gYXJnc1swXSk7XG4gICAgICAgIHJldHVybiBGaWVsZC5uZXcobmFtZSwgdHlwZSwgbnVsbGFibGUsIG1ldGFkYXRhKTtcbiAgICB9XG59XG4vLyBBZGQgdGhlc2UgaGVyZSBzbyB0aGV5J3JlIHBpY2tlZCB1cCBieSB0aGUgZXh0ZXJucyBjcmVhdG9yXG4vLyBpbiB0aGUgYnVpbGQsIGFuZCBjbG9zdXJlLWNvbXBpbGVyIGRvZXNuJ3QgbWluaWZ5IHRoZW0gYXdheVxuRmllbGQucHJvdG90eXBlLnR5cGUgPSBudWxsO1xuRmllbGQucHJvdG90eXBlLm5hbWUgPSBudWxsO1xuRmllbGQucHJvdG90eXBlLm51bGxhYmxlID0gbnVsbDtcbkZpZWxkLnByb3RvdHlwZS5tZXRhZGF0YSA9IG51bGw7XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gbWVyZ2VNYXBzKG0xLCBtMikge1xuICAgIHJldHVybiBuZXcgTWFwKFsuLi4obTEgfHwgbmV3IE1hcCgpKSwgLi4uKG0yIHx8IG5ldyBNYXAoKSldKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBnZW5lcmF0ZURpY3Rpb25hcnlNYXAoZmllbGRzLCBkaWN0aW9uYXJpZXMgPSBuZXcgTWFwKCkpIHtcbiAgICBmb3IgKGxldCBpID0gLTEsIG4gPSBmaWVsZHMubGVuZ3RoOyArK2kgPCBuOykge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGZpZWxkc1tpXTtcbiAgICAgICAgY29uc3QgdHlwZSA9IGZpZWxkLnR5cGU7XG4gICAgICAgIGlmIChEYXRhVHlwZS5pc0RpY3Rpb25hcnkodHlwZSkpIHtcbiAgICAgICAgICAgIGlmICghZGljdGlvbmFyaWVzLmhhcyh0eXBlLmlkKSkge1xuICAgICAgICAgICAgICAgIGRpY3Rpb25hcmllcy5zZXQodHlwZS5pZCwgdHlwZS5kaWN0aW9uYXJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRpY3Rpb25hcmllcy5nZXQodHlwZS5pZCkgIT09IHR5cGUuZGljdGlvbmFyeSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBTY2hlbWEgY29udGFpbmluZyB0d28gZGlmZmVyZW50IGRpY3Rpb25hcmllcyB3aXRoIHRoZSBzYW1lIElkYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUuY2hpbGRyZW4gJiYgdHlwZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBnZW5lcmF0ZURpY3Rpb25hcnlNYXAodHlwZS5jaGlsZHJlbiwgZGljdGlvbmFyaWVzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGljdGlvbmFyaWVzO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1zY2hlbWEubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG52YXIgX2E7XG5pbXBvcnQgeyBUeXBlIH0gZnJvbSAnLi9lbnVtLm1qcyc7XG5pbXBvcnQgeyBEYXRhLCBtYWtlRGF0YSB9IGZyb20gJy4vZGF0YS5tanMnO1xuaW1wb3J0IHsgdmVjdG9yRnJvbUFycmF5IH0gZnJvbSAnLi9mYWN0b3JpZXMubWpzJztcbmltcG9ydCB7IG1ha2VWZWN0b3IsIFZlY3RvciB9IGZyb20gJy4vdmVjdG9yLm1qcyc7XG5pbXBvcnQgeyBGaWVsZCwgU2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEubWpzJztcbmltcG9ydCB7IE51bGwsIFN0cnVjdCB9IGZyb20gJy4vdHlwZS5tanMnO1xuaW1wb3J0IHsgY29tcGFyZVNjaGVtYXMgfSBmcm9tICcuL3Zpc2l0b3IvdHlwZWNvbXBhcmF0b3IubWpzJztcbmltcG9ydCB7IGRpc3RyaWJ1dGVWZWN0b3JzSW50b1JlY29yZEJhdGNoZXMgfSBmcm9tICcuL3V0aWwvcmVjb3JkYmF0Y2gubWpzJztcbmltcG9ydCB7IGlzQ2h1bmtlZFZhbGlkLCBjb21wdXRlQ2h1bmtPZmZzZXRzLCBjb21wdXRlQ2h1bmtOdWxsQ291bnRzLCB3cmFwQ2h1bmtlZENhbGwxLCB3cmFwQ2h1bmtlZENhbGwyLCB3cmFwQ2h1bmtlZEluZGV4T2YsIHNsaWNlQ2h1bmtzLCB9IGZyb20gJy4vdXRpbC9jaHVuay5tanMnO1xuaW1wb3J0IHsgaW5zdGFuY2UgYXMgZ2V0VmlzaXRvciB9IGZyb20gJy4vdmlzaXRvci9nZXQubWpzJztcbmltcG9ydCB7IGluc3RhbmNlIGFzIHNldFZpc2l0b3IgfSBmcm9tICcuL3Zpc2l0b3Ivc2V0Lm1qcyc7XG5pbXBvcnQgeyBpbnN0YW5jZSBhcyBpbmRleE9mVmlzaXRvciB9IGZyb20gJy4vdmlzaXRvci9pbmRleG9mLm1qcyc7XG5pbXBvcnQgeyBpbnN0YW5jZSBhcyBpdGVyYXRvclZpc2l0b3IgfSBmcm9tICcuL3Zpc2l0b3IvaXRlcmF0b3IubWpzJztcbmltcG9ydCB7IGluc3RhbmNlIGFzIGJ5dGVMZW5ndGhWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yL2J5dGVsZW5ndGgubWpzJztcbmltcG9ydCB7IGNsYW1wUmFuZ2UgfSBmcm9tICcuL3V0aWwvdmVjdG9yLm1qcyc7XG5pbXBvcnQgeyBSZWNvcmRCYXRjaCB9IGZyb20gJy4vcmVjb3JkYmF0Y2gubWpzJztcbi8qKlxuICogVGFibGVzIGFyZSBjb2xsZWN0aW9ucyBvZiB7QGxpbmsgVmVjdG9yfXMgYW5kIGhhdmUgYSB7QGxpbmsgU2NoZW1hfS4gVXNlIHRoZSBjb252ZW5pZW5jZSBtZXRob2RzIHtAbGluayBtYWtlVGFibGV9XG4gKiBvciB7QGxpbmsgdGFibGVGcm9tQXJyYXlzfSB0byBjcmVhdGUgYSB0YWJsZSBpbiBKYXZhU2NyaXB0LiBUbyBjcmVhdGUgYSB0YWJsZSBmcm9tIHRoZSBJUEMgZm9ybWF0LCB1c2VcbiAqIHtAbGluayB0YWJsZUZyb21JUEN9LlxuICovXG5leHBvcnQgY2xhc3MgVGFibGUge1xuICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHtcbiAgICAgICAgdmFyIF9iLCBfYztcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmJhdGNoZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gbmV3IFNjaGVtYShbXSk7XG4gICAgICAgICAgICB0aGlzLl9vZmZzZXRzID0gWzBdO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNjaGVtYTtcbiAgICAgICAgbGV0IG9mZnNldHM7XG4gICAgICAgIGlmIChhcmdzWzBdIGluc3RhbmNlb2YgU2NoZW1hKSB7XG4gICAgICAgICAgICBzY2hlbWEgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFyZ3NbYXJncy5sZW5ndGggLSAxXSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5KSB7XG4gICAgICAgICAgICBvZmZzZXRzID0gYXJncy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1bndyYXAgPSAoeCkgPT4ge1xuICAgICAgICAgICAgaWYgKHgpIHtcbiAgICAgICAgICAgICAgICBpZiAoeCBpbnN0YW5jZW9mIFJlY29yZEJhdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbeF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHggaW5zdGFuY2VvZiBUYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geC5iYXRjaGVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh4IGluc3RhbmNlb2YgRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoeC50eXBlIGluc3RhbmNlb2YgU3RydWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW25ldyBSZWNvcmRCYXRjaChuZXcgU2NoZW1hKHgudHlwZS5jaGlsZHJlbiksIHgpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4LmZsYXRNYXAodiA9PiB1bndyYXAodikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgeFtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbLi4ueF0uZmxhdE1hcCh2ID0+IHVud3JhcCh2KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB4ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoeCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3MgPSBrZXlzLm1hcCgoaykgPT4gbmV3IFZlY3RvcihbeFtrXV0pKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gbmV3IFNjaGVtYShrZXlzLm1hcCgoaywgaSkgPT4gbmV3IEZpZWxkKFN0cmluZyhrKSwgdmVjc1tpXS50eXBlKSkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbLCBiYXRjaGVzXSA9IGRpc3RyaWJ1dGVWZWN0b3JzSW50b1JlY29yZEJhdGNoZXMoc2NoZW1hLCB2ZWNzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhdGNoZXMubGVuZ3RoID09PSAwID8gW25ldyBSZWNvcmRCYXRjaCh4KV0gOiBiYXRjaGVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYmF0Y2hlcyA9IGFyZ3MuZmxhdE1hcCh2ID0+IHVud3JhcCh2KSk7XG4gICAgICAgIHNjaGVtYSA9IChfYyA9IHNjaGVtYSAhPT0gbnVsbCAmJiBzY2hlbWEgIT09IHZvaWQgMCA/IHNjaGVtYSA6IChfYiA9IGJhdGNoZXNbMF0pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5zY2hlbWEpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IG5ldyBTY2hlbWEoW10pO1xuICAgICAgICBpZiAoIShzY2hlbWEgaW5zdGFuY2VvZiBTY2hlbWEpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUYWJsZSBjb25zdHJ1Y3RvciBleHBlY3RzIGEgW1NjaGVtYSwgUmVjb3JkQmF0Y2hbXV0gcGFpci4nKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIGJhdGNoZXMpIHtcbiAgICAgICAgICAgIGlmICghKGJhdGNoIGluc3RhbmNlb2YgUmVjb3JkQmF0Y2gpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGFibGUgY29uc3RydWN0b3IgZXhwZWN0cyBhIFtTY2hlbWEsIFJlY29yZEJhdGNoW11dIHBhaXIuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNvbXBhcmVTY2hlbWFzKHNjaGVtYSwgYmF0Y2guc2NoZW1hKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RhYmxlIGFuZCBpbm5lciBSZWNvcmRCYXRjaCBzY2hlbWFzIG11c3QgYmUgZXF1aXZhbGVudC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICAgICAgdGhpcy5iYXRjaGVzID0gYmF0Y2hlcztcbiAgICAgICAgdGhpcy5fb2Zmc2V0cyA9IG9mZnNldHMgIT09IG51bGwgJiYgb2Zmc2V0cyAhPT0gdm9pZCAwID8gb2Zmc2V0cyA6IGNvbXB1dGVDaHVua09mZnNldHModGhpcy5kYXRhKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnRpZ3VvdXMge0BsaW5rIFJlY29yZEJhdGNoIGBSZWNvcmRCYXRjaGB9IGNodW5rcyBvZiB0aGUgVGFibGUgcm93cy5cbiAgICAgKi9cbiAgICBnZXQgZGF0YSgpIHsgcmV0dXJuIHRoaXMuYmF0Y2hlcy5tYXAoKHsgZGF0YSB9KSA9PiBkYXRhKTsgfVxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGlzIFRhYmxlLlxuICAgICAqL1xuICAgIGdldCBudW1Db2xzKCkgeyByZXR1cm4gdGhpcy5zY2hlbWEuZmllbGRzLmxlbmd0aDsgfVxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGlzIFRhYmxlLlxuICAgICAqL1xuICAgIGdldCBudW1Sb3dzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnJlZHVjZSgobnVtUm93cywgZGF0YSkgPT4gbnVtUm93cyArIGRhdGEubGVuZ3RoLCAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBudWxsIHJvd3MgaW4gdGhpcyBUYWJsZS5cbiAgICAgKi9cbiAgICBnZXQgbnVsbENvdW50KCkge1xuICAgICAgICBpZiAodGhpcy5fbnVsbENvdW50ID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5fbnVsbENvdW50ID0gY29tcHV0ZUNodW5rTnVsbENvdW50cyh0aGlzLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9udWxsQ291bnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBudWxsLlxuICAgICAqXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0byByZWFkIHRoZSB2YWxpZGl0eSBiaXRtYXAuXG4gICAgICovXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlzVmFsaWQoaW5kZXgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLyoqXG4gICAgICogR2V0IGFuIGVsZW1lbnQgdmFsdWUgYnkgcG9zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJlYWQuXG4gICAgICovXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGdldChpbmRleCkgeyByZXR1cm4gbnVsbDsgfVxuICAgIC8qKlxuICAgICAqIFNldCBhbiBlbGVtZW50IHZhbHVlIGJ5IHBvc2l0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKi9cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgc2V0KGluZGV4LCB2YWx1ZSkgeyByZXR1cm47IH1cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYSB2YWx1ZSBpbiBhbiBWZWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgdmFsdWUgdG8gbG9jYXRlIGluIHRoZSBWZWN0b3IuXG4gICAgICogQHBhcmFtIG9mZnNldCBUaGUgaW5kZXggYXQgd2hpY2ggdG8gYmVnaW4gdGhlIHNlYXJjaC4gSWYgb2Zmc2V0IGlzIG9taXR0ZWQsIHRoZSBzZWFyY2ggc3RhcnRzIGF0IGluZGV4IDAuXG4gICAgICovXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGluZGV4T2YoZWxlbWVudCwgb2Zmc2V0KSB7IHJldHVybiAtMTsgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBlbGVtZW50IGJ5IGluZGV4LlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdG8gZ2V0IHRoZSBieXRlTGVuZ3RoLlxuICAgICAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBnZXRCeXRlTGVuZ3RoKGluZGV4KSB7IHJldHVybiAwOyB9XG4gICAgLyoqXG4gICAgICogSXRlcmF0b3IgZm9yIHJvd3MgaW4gdGhpcyBUYWJsZS5cbiAgICAgKi9cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgaWYgKHRoaXMuYmF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3JWaXNpdG9yLnZpc2l0KG5ldyBWZWN0b3IodGhpcy5kYXRhKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChuZXcgQXJyYXkoMCkpW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgSmF2YVNjcmlwdCBBcnJheSBvZiB0aGUgVGFibGUgcm93cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFuIEFycmF5IG9mIFRhYmxlIHJvd3MuXG4gICAgICovXG4gICAgdG9BcnJheSgpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgVGFibGUgcm93cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBUYWJsZSByb3dzLlxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYFtcXG4gICR7dGhpcy50b0FycmF5KCkuam9pbignLFxcbiAgJyl9XFxuXWA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbWJpbmVzIHR3byBvciBtb3JlIFRhYmxlcyBvZiB0aGUgc2FtZSBzY2hlbWEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3RoZXJzIEFkZGl0aW9uYWwgVGFibGVzIHRvIGFkZCB0byB0aGUgZW5kIG9mIHRoaXMgVGFibGVzLlxuICAgICAqL1xuICAgIGNvbmNhdCguLi5vdGhlcnMpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5zY2hlbWE7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGEuY29uY2F0KG90aGVycy5mbGF0TWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpO1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlKHNjaGVtYSwgZGF0YS5tYXAoKGRhdGEpID0+IG5ldyBSZWNvcmRCYXRjaChzY2hlbWEsIGRhdGEpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIHplcm8tY29weSBzdWItc2VjdGlvbiBvZiB0aGlzIFRhYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGJlZ2luIFRoZSBiZWdpbm5pbmcgb2YgdGhlIHNwZWNpZmllZCBwb3J0aW9uIG9mIHRoZSBUYWJsZS5cbiAgICAgKiBAcGFyYW0gZW5kIFRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZCBwb3J0aW9uIG9mIHRoZSBUYWJsZS4gVGhpcyBpcyBleGNsdXNpdmUgb2YgdGhlIGVsZW1lbnQgYXQgdGhlIGluZGV4ICdlbmQnLlxuICAgICAqL1xuICAgIHNsaWNlKGJlZ2luLCBlbmQpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5zY2hlbWE7XG4gICAgICAgIFtiZWdpbiwgZW5kXSA9IGNsYW1wUmFuZ2UoeyBsZW5ndGg6IHRoaXMubnVtUm93cyB9LCBiZWdpbiwgZW5kKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHNsaWNlQ2h1bmtzKHRoaXMuZGF0YSwgdGhpcy5fb2Zmc2V0cywgYmVnaW4sIGVuZCk7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGUoc2NoZW1hLCBkYXRhLm1hcCgoY2h1bmspID0+IG5ldyBSZWNvcmRCYXRjaChzY2hlbWEsIGNodW5rKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY2hpbGQgVmVjdG9yIGJ5IG5hbWUsIG9yIG51bGwgaWYgdGhpcyBWZWN0b3IgaGFzIG5vIGNoaWxkIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY2hpbGQgdG8gcmV0cmlldmUuXG4gICAgICovXG4gICAgZ2V0Q2hpbGQobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRDaGlsZEF0KHRoaXMuc2NoZW1hLmZpZWxkcy5maW5kSW5kZXgoKGYpID0+IGYubmFtZSA9PT0gbmFtZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY2hpbGQgVmVjdG9yIGJ5IGluZGV4LCBvciBudWxsIGlmIHRoaXMgVmVjdG9yIGhhcyBubyBjaGlsZCBhdCB0aGUgc3VwcGxpZWQgaW5kZXguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byByZXRyaWV2ZS5cbiAgICAgKi9cbiAgICBnZXRDaGlsZEF0KGluZGV4KSB7XG4gICAgICAgIGlmIChpbmRleCA+IC0xICYmIGluZGV4IDwgdGhpcy5zY2hlbWEuZmllbGRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YS5tYXAoKGRhdGEpID0+IGRhdGEuY2hpbGRyZW5baW5kZXhdKTtcbiAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgdHlwZSB9ID0gdGhpcy5zY2hlbWEuZmllbGRzW2luZGV4XTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbXB0eSA9IG1ha2VEYXRhKHsgdHlwZSwgbGVuZ3RoOiAwLCBudWxsQ291bnQ6IDAgfSk7XG4gICAgICAgICAgICAgICAgZGF0YS5wdXNoKGVtcHR5Ll9jaGFuZ2VMZW5ndGhBbmRCYWNrZmlsbE51bGxCaXRtYXAodGhpcy5udW1Sb3dzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IFZlY3RvcihkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIGNoaWxkIFZlY3RvciBieSBuYW1lLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNoaWxkIHRvIG92ZXJ3cml0ZS5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBUYWJsZSB3aXRoIHRoZSBzdXBwbGllZCBjaGlsZCBmb3IgdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqL1xuICAgIHNldENoaWxkKG5hbWUsIGNoaWxkKSB7XG4gICAgICAgIHZhciBfYjtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0Q2hpbGRBdCgoX2IgPSB0aGlzLnNjaGVtYS5maWVsZHMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kSW5kZXgoKGYpID0+IGYubmFtZSA9PT0gbmFtZSksIGNoaWxkKTtcbiAgICB9XG4gICAgc2V0Q2hpbGRBdChpbmRleCwgY2hpbGQpIHtcbiAgICAgICAgbGV0IHNjaGVtYSA9IHRoaXMuc2NoZW1hO1xuICAgICAgICBsZXQgYmF0Y2hlcyA9IFsuLi50aGlzLmJhdGNoZXNdO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSAmJiBpbmRleCA8IHRoaXMubnVtQ29scykge1xuICAgICAgICAgICAgaWYgKCFjaGlsZCkge1xuICAgICAgICAgICAgICAgIGNoaWxkID0gbmV3IFZlY3RvcihbbWFrZURhdGEoeyB0eXBlOiBuZXcgTnVsbCwgbGVuZ3RoOiB0aGlzLm51bVJvd3MgfSldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IHNjaGVtYS5maWVsZHMuc2xpY2UoKTtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZmllbGRzW2luZGV4XS5jbG9uZSh7IHR5cGU6IGNoaWxkLnR5cGUgfSk7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuc2NoZW1hLmZpZWxkcy5tYXAoKF8sIGkpID0+IHRoaXMuZ2V0Q2hpbGRBdChpKSk7XG4gICAgICAgICAgICBbZmllbGRzW2luZGV4XSwgY2hpbGRyZW5baW5kZXhdXSA9IFtmaWVsZCwgY2hpbGRdO1xuICAgICAgICAgICAgW3NjaGVtYSwgYmF0Y2hlc10gPSBkaXN0cmlidXRlVmVjdG9yc0ludG9SZWNvcmRCYXRjaGVzKHNjaGVtYSwgY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVGFibGUoc2NoZW1hLCBiYXRjaGVzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgbmV3IFRhYmxlIGNvbnRhaW5pbmcgb25seSBzcGVjaWZpZWQgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lcyBOYW1lcyBvZiBjb2x1bW5zIHRvIGtlZXAuXG4gICAgICogQHJldHVybnMgQSBuZXcgVGFibGUgb2YgY29sdW1ucyBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIG5hbWVzLlxuICAgICAqL1xuICAgIHNlbGVjdChjb2x1bW5OYW1lcykge1xuICAgICAgICBjb25zdCBuYW1lVG9JbmRleCA9IHRoaXMuc2NoZW1hLmZpZWxkcy5yZWR1Y2UoKG0sIGYsIGkpID0+IG0uc2V0KGYubmFtZSwgaSksIG5ldyBNYXAoKSk7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0KGNvbHVtbk5hbWVzLm1hcCgoY29sdW1uTmFtZSkgPT4gbmFtZVRvSW5kZXguZ2V0KGNvbHVtbk5hbWUpKS5maWx0ZXIoKHgpID0+IHggPiAtMSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgVGFibGUgY29udGFpbmluZyBvbmx5IGNvbHVtbnMgYXQgdGhlIHNwZWNpZmllZCBpbmRpY2VzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbHVtbkluZGljZXMgSW5kaWNlcyBvZiBjb2x1bW5zIHRvIGtlZXAuXG4gICAgICogQHJldHVybnMgQSBuZXcgVGFibGUgb2YgY29sdW1ucyBhdCB0aGUgc3BlY2lmaWVkIGluZGljZXMuXG4gICAgICovXG4gICAgc2VsZWN0QXQoY29sdW1uSW5kaWNlcykge1xuICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLnNjaGVtYS5zZWxlY3RBdChjb2x1bW5JbmRpY2VzKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuYmF0Y2hlcy5tYXAoKGJhdGNoKSA9PiBiYXRjaC5zZWxlY3RBdChjb2x1bW5JbmRpY2VzKSk7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGUoc2NoZW1hLCBkYXRhKTtcbiAgICB9XG4gICAgYXNzaWduKG90aGVyKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuc2NoZW1hLmZpZWxkcztcbiAgICAgICAgY29uc3QgW2luZGljZXMsIG9sZFRvTmV3XSA9IG90aGVyLnNjaGVtYS5maWVsZHMucmVkdWNlKChtZW1vLCBmMiwgbmV3SWR4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbaW5kaWNlcywgb2xkVG9OZXddID0gbWVtbztcbiAgICAgICAgICAgIGNvbnN0IGkgPSBmaWVsZHMuZmluZEluZGV4KChmKSA9PiBmLm5hbWUgPT09IGYyLm5hbWUpO1xuICAgICAgICAgICAgfmkgPyAob2xkVG9OZXdbaV0gPSBuZXdJZHgpIDogaW5kaWNlcy5wdXNoKG5ld0lkeCk7XG4gICAgICAgICAgICByZXR1cm4gbWVtbztcbiAgICAgICAgfSwgW1tdLCBbXV0pO1xuICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLnNjaGVtYS5hc3NpZ24ob3RoZXIuc2NoZW1hKTtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IFtcbiAgICAgICAgICAgIC4uLmZpZWxkcy5tYXAoKF8sIGkpID0+IFtpLCBvbGRUb05ld1tpXV0pLm1hcCgoW2ksIGpdKSA9PiAoaiA9PT0gdW5kZWZpbmVkID8gdGhpcy5nZXRDaGlsZEF0KGkpIDogb3RoZXIuZ2V0Q2hpbGRBdChqKSkpLFxuICAgICAgICAgICAgLi4uaW5kaWNlcy5tYXAoKGkpID0+IG90aGVyLmdldENoaWxkQXQoaSkpXG4gICAgICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlKC4uLmRpc3RyaWJ1dGVWZWN0b3JzSW50b1JlY29yZEJhdGNoZXMoc2NoZW1hLCBjb2x1bW5zKSk7XG4gICAgfVxufVxuX2EgPSBTeW1ib2wudG9TdHJpbmdUYWc7XG4vLyBJbml0aWFsaXplIHRoaXMgc3RhdGljIHByb3BlcnR5IHZpYSBhbiBJSUZFIHNvIGJ1bmRsZXJzIGRvbid0IHRyZWUtc2hha2Vcbi8vIG91dCB0aGlzIGxvZ2ljLCBidXQgYWxzbyBzbyB3ZSdyZSBzdGlsbCBjb21wbGlhbnQgd2l0aCBgXCJzaWRlRWZmZWN0c1wiOiBmYWxzZWBcblRhYmxlW19hXSA9ICgocHJvdG8pID0+IHtcbiAgICBwcm90by5zY2hlbWEgPSBudWxsO1xuICAgIHByb3RvLmJhdGNoZXMgPSBbXTtcbiAgICBwcm90by5fb2Zmc2V0cyA9IG5ldyBVaW50MzJBcnJheShbMF0pO1xuICAgIHByb3RvLl9udWxsQ291bnQgPSAtMTtcbiAgICBwcm90b1tTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlXSA9IHRydWU7XG4gICAgcHJvdG9bJ2lzVmFsaWQnXSA9IHdyYXBDaHVua2VkQ2FsbDEoaXNDaHVua2VkVmFsaWQpO1xuICAgIHByb3RvWydnZXQnXSA9IHdyYXBDaHVua2VkQ2FsbDEoZ2V0VmlzaXRvci5nZXRWaXNpdEZuKFR5cGUuU3RydWN0KSk7XG4gICAgcHJvdG9bJ3NldCddID0gd3JhcENodW5rZWRDYWxsMihzZXRWaXNpdG9yLmdldFZpc2l0Rm4oVHlwZS5TdHJ1Y3QpKTtcbiAgICBwcm90b1snaW5kZXhPZiddID0gd3JhcENodW5rZWRJbmRleE9mKGluZGV4T2ZWaXNpdG9yLmdldFZpc2l0Rm4oVHlwZS5TdHJ1Y3QpKTtcbiAgICBwcm90b1snZ2V0Qnl0ZUxlbmd0aCddID0gd3JhcENodW5rZWRDYWxsMShieXRlTGVuZ3RoVmlzaXRvci5nZXRWaXNpdEZuKFR5cGUuU3RydWN0KSk7XG4gICAgcmV0dXJuICdUYWJsZSc7XG59KShUYWJsZS5wcm90b3R5cGUpO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFRhYmxlIGZyb20gYW4gb2JqZWN0IG9mIHR5cGVkIGFycmF5cy5cbiAqXG4qICBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHRhYmxlID0gbWFrZVRhYmxlKHtcbiAqICAgYTogbmV3IEludDhBcnJheShbMSwgMiwgM10pLFxuICogfSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBpbnB1dCBJbnB1dCBhbiBvYmplY3Qgb2YgdHlwZWQgYXJyYXlzLlxuICogQHJldHVybnMgQSBuZXcgVGFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlVGFibGUoaW5wdXQpIHtcbiAgICBjb25zdCB2ZWNzID0ge307XG4gICAgY29uc3QgaW5wdXRzID0gT2JqZWN0LmVudHJpZXMoaW5wdXQpO1xuICAgIGZvciAoY29uc3QgW2tleSwgY29sXSBvZiBpbnB1dHMpIHtcbiAgICAgICAgdmVjc1trZXldID0gbWFrZVZlY3Rvcihjb2wpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRhYmxlKHZlY3MpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFRhYmxlIGZyb20gYW4gb2JqZWN0IG9mIHR5cGVkIGFycmF5cyBvciBKYXZhU2NyaXB0IGFycmF5cy5cbiAqXG4gKiAgQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCB0YWJsZSA9IHRhYmxlRnJvbUFycmF5cyh7XG4gKiAgIGE6IFsxLCAyLCAzXSxcbiAqICAgYjogbmV3IEludDhBcnJheShbMSwgMiwgM10pLFxuICogfSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBpbnB1dCBJbnB1dCBhbiBvYmplY3Qgb2YgdHlwZWQgYXJyYXlzIG9yIEphdmFTY3JpcHQgYXJyYXlzLlxuICogQHJldHVybnMgQSBuZXcgVGFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWJsZUZyb21BcnJheXMoaW5wdXQpIHtcbiAgICBjb25zdCB2ZWNzID0ge307XG4gICAgY29uc3QgaW5wdXRzID0gT2JqZWN0LmVudHJpZXMoaW5wdXQpO1xuICAgIGZvciAoY29uc3QgW2tleSwgY29sXSBvZiBpbnB1dHMpIHtcbiAgICAgICAgdmVjc1trZXldID0gdmVjdG9yRnJvbUFycmF5KGNvbCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGFibGUodmVjcyk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhYmxlLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxudmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2osIF9rLCBfbCwgX20sIF9vLCBfcCwgX3EsIF9yLCBfcywgX3QsIF91O1xuaW1wb3J0IHsgVHlwZSwgUHJlY2lzaW9uLCBVbmlvbk1vZGUsIERhdGVVbml0LCBUaW1lVW5pdCwgSW50ZXJ2YWxVbml0IH0gZnJvbSAnLi9lbnVtLm1qcyc7XG4vKipcbiAqIEFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGNsYXNzZXMgdGhhdCBlbmNhcHN1bGF0ZSBtZXRhZGF0YSBhYm91dCBlYWNoIG9mXG4gKiB0aGUgbG9naWNhbCB0eXBlcyB0aGF0IEFycm93IGNhbiByZXByZXNlbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhVHlwZSB7XG4gICAgLyoqIEBub2NvbGxhcHNlICovIHN0YXRpYyBpc051bGwoeCkgeyByZXR1cm4gKHggPT09IG51bGwgfHwgeCA9PT0gdm9pZCAwID8gdm9pZCAwIDogeC50eXBlSWQpID09PSBUeXBlLk51bGw7IH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi8gc3RhdGljIGlzSW50KHgpIHsgcmV0dXJuICh4ID09PSBudWxsIHx8IHggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHgudHlwZUlkKSA9PT0gVHlwZS5JbnQ7IH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi8gc3RhdGljIGlzRmxvYXQoeCkgeyByZXR1cm4gKHggPT09IG51bGwgfHwgeCA9PT0gdm9pZCAwID8gdm9pZCAwIDogeC50eXBlSWQpID09PSBUeXBlLkZsb2F0OyB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovIHN0YXRpYyBpc0JpbmFyeSh4KSB7IHJldHVybiAoeCA9PT0gbnVsbCB8fCB4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB4LnR5cGVJZCkgPT09IFR5cGUuQmluYXJ5OyB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovIHN0YXRpYyBpc1V0ZjgoeCkgeyByZXR1cm4gKHggPT09IG51bGwgfHwgeCA9PT0gdm9pZCAwID8gdm9pZCAwIDogeC50eXBlSWQpID09PSBUeXBlLlV0Zjg7IH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi8gc3RhdGljIGlzQm9vbCh4KSB7IHJldHVybiAoeCA9PT0gbnVsbCB8fCB4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB4LnR5cGVJZCkgPT09IFR5cGUuQm9vbDsgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBzdGF0aWMgaXNEZWNpbWFsKHgpIHsgcmV0dXJuICh4ID09PSBudWxsIHx8IHggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHgudHlwZUlkKSA9PT0gVHlwZS5EZWNpbWFsOyB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovIHN0YXRpYyBpc0RhdGUoeCkgeyByZXR1cm4gKHggPT09IG51bGwgfHwgeCA9PT0gdm9pZCAwID8gdm9pZCAwIDogeC50eXBlSWQpID09PSBUeXBlLkRhdGU7IH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi8gc3RhdGljIGlzVGltZSh4KSB7IHJldHVybiAoeCA9PT0gbnVsbCB8fCB4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB4LnR5cGVJZCkgPT09IFR5cGUuVGltZTsgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBzdGF0aWMgaXNUaW1lc3RhbXAoeCkgeyByZXR1cm4gKHggPT09IG51bGwgfHwgeCA9PT0gdm9pZCAwID8gdm9pZCAwIDogeC50eXBlSWQpID09PSBUeXBlLlRpbWVzdGFtcDsgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBzdGF0aWMgaXNJbnRlcnZhbCh4KSB7IHJldHVybiAoeCA9PT0gbnVsbCB8fCB4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB4LnR5cGVJZCkgPT09IFR5cGUuSW50ZXJ2YWw7IH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi8gc3RhdGljIGlzTGlzdCh4KSB7IHJldHVybiAoeCA9PT0gbnVsbCB8fCB4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB4LnR5cGVJZCkgPT09IFR5cGUuTGlzdDsgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBzdGF0aWMgaXNTdHJ1Y3QoeCkgeyByZXR1cm4gKHggPT09IG51bGwgfHwgeCA9PT0gdm9pZCAwID8gdm9pZCAwIDogeC50eXBlSWQpID09PSBUeXBlLlN0cnVjdDsgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBzdGF0aWMgaXNVbmlvbih4KSB7IHJldHVybiAoeCA9PT0gbnVsbCB8fCB4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB4LnR5cGVJZCkgPT09IFR5cGUuVW5pb247IH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi8gc3RhdGljIGlzRml4ZWRTaXplQmluYXJ5KHgpIHsgcmV0dXJuICh4ID09PSBudWxsIHx8IHggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHgudHlwZUlkKSA9PT0gVHlwZS5GaXhlZFNpemVCaW5hcnk7IH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi8gc3RhdGljIGlzRml4ZWRTaXplTGlzdCh4KSB7IHJldHVybiAoeCA9PT0gbnVsbCB8fCB4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB4LnR5cGVJZCkgPT09IFR5cGUuRml4ZWRTaXplTGlzdDsgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBzdGF0aWMgaXNNYXAoeCkgeyByZXR1cm4gKHggPT09IG51bGwgfHwgeCA9PT0gdm9pZCAwID8gdm9pZCAwIDogeC50eXBlSWQpID09PSBUeXBlLk1hcDsgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBzdGF0aWMgaXNEaWN0aW9uYXJ5KHgpIHsgcmV0dXJuICh4ID09PSBudWxsIHx8IHggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHgudHlwZUlkKSA9PT0gVHlwZS5EaWN0aW9uYXJ5OyB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovIHN0YXRpYyBpc0RlbnNlVW5pb24oeCkgeyByZXR1cm4gRGF0YVR5cGUuaXNVbmlvbih4KSAmJiB4Lm1vZGUgPT09IFVuaW9uTW9kZS5EZW5zZTsgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBzdGF0aWMgaXNTcGFyc2VVbmlvbih4KSB7IHJldHVybiBEYXRhVHlwZS5pc1VuaW9uKHgpICYmIHgubW9kZSA9PT0gVW5pb25Nb2RlLlNwYXJzZTsgfVxuICAgIGdldCB0eXBlSWQoKSB7IHJldHVybiBUeXBlLk5PTkU7IH1cbn1cbl9hID0gU3ltYm9sLnRvU3RyaW5nVGFnO1xuRGF0YVR5cGVbX2FdID0gKChwcm90bykgPT4ge1xuICAgIHByb3RvLmNoaWxkcmVuID0gbnVsbDtcbiAgICBwcm90by5BcnJheVR5cGUgPSBBcnJheTtcbiAgICByZXR1cm4gcHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdEYXRhVHlwZSc7XG59KShEYXRhVHlwZS5wcm90b3R5cGUpO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBOdWxsIGV4dGVuZHMgRGF0YVR5cGUge1xuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gYE51bGxgOyB9XG4gICAgZ2V0IHR5cGVJZCgpIHsgcmV0dXJuIFR5cGUuTnVsbDsgfVxufVxuX2IgPSBTeW1ib2wudG9TdHJpbmdUYWc7XG5OdWxsW19iXSA9ICgocHJvdG8pID0+IHByb3RvW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnTnVsbCcpKE51bGwucHJvdG90eXBlKTtcbi8qKiBAaWdub3JlICovXG5jbGFzcyBJbnRfIGV4dGVuZHMgRGF0YVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKGlzU2lnbmVkLCBiaXRXaWR0aCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmlzU2lnbmVkID0gaXNTaWduZWQ7XG4gICAgICAgIHRoaXMuYml0V2lkdGggPSBiaXRXaWR0aDtcbiAgICB9XG4gICAgZ2V0IHR5cGVJZCgpIHsgcmV0dXJuIFR5cGUuSW50OyB9XG4gICAgZ2V0IEFycmF5VHlwZSgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmJpdFdpZHRoKSB7XG4gICAgICAgICAgICBjYXNlIDg6IHJldHVybiB0aGlzLmlzU2lnbmVkID8gSW50OEFycmF5IDogVWludDhBcnJheTtcbiAgICAgICAgICAgIGNhc2UgMTY6IHJldHVybiB0aGlzLmlzU2lnbmVkID8gSW50MTZBcnJheSA6IFVpbnQxNkFycmF5O1xuICAgICAgICAgICAgY2FzZSAzMjogcmV0dXJuIHRoaXMuaXNTaWduZWQgPyBJbnQzMkFycmF5IDogVWludDMyQXJyYXk7XG4gICAgICAgICAgICBjYXNlIDY0OiByZXR1cm4gdGhpcy5pc1NpZ25lZCA/IEJpZ0ludDY0QXJyYXkgOiBCaWdVaW50NjRBcnJheTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCAke3RoaXNbU3ltYm9sLnRvU3RyaW5nVGFnXX0gdHlwZWApO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIGAke3RoaXMuaXNTaWduZWQgPyBgSWAgOiBgVWlgfW50JHt0aGlzLmJpdFdpZHRofWA7IH1cbn1cbl9jID0gU3ltYm9sLnRvU3RyaW5nVGFnO1xuSW50X1tfY10gPSAoKHByb3RvKSA9PiB7XG4gICAgcHJvdG8uaXNTaWduZWQgPSBudWxsO1xuICAgIHByb3RvLmJpdFdpZHRoID0gbnVsbDtcbiAgICByZXR1cm4gcHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdJbnQnO1xufSkoSW50Xy5wcm90b3R5cGUpO1xuZXhwb3J0IHsgSW50XyBhcyBJbnQgfTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgSW50OCBleHRlbmRzIEludF8ge1xuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcih0cnVlLCA4KTsgfVxuICAgIGdldCBBcnJheVR5cGUoKSB7IHJldHVybiBJbnQ4QXJyYXk7IH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgSW50MTYgZXh0ZW5kcyBJbnRfIHtcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIodHJ1ZSwgMTYpOyB9XG4gICAgZ2V0IEFycmF5VHlwZSgpIHsgcmV0dXJuIEludDE2QXJyYXk7IH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgSW50MzIgZXh0ZW5kcyBJbnRfIHtcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIodHJ1ZSwgMzIpOyB9XG4gICAgZ2V0IEFycmF5VHlwZSgpIHsgcmV0dXJuIEludDMyQXJyYXk7IH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgSW50NjQgZXh0ZW5kcyBJbnRfIHtcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIodHJ1ZSwgNjQpOyB9XG4gICAgZ2V0IEFycmF5VHlwZSgpIHsgcmV0dXJuIEJpZ0ludDY0QXJyYXk7IH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVWludDggZXh0ZW5kcyBJbnRfIHtcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoZmFsc2UsIDgpOyB9XG4gICAgZ2V0IEFycmF5VHlwZSgpIHsgcmV0dXJuIFVpbnQ4QXJyYXk7IH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVWludDE2IGV4dGVuZHMgSW50XyB7XG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKGZhbHNlLCAxNik7IH1cbiAgICBnZXQgQXJyYXlUeXBlKCkgeyByZXR1cm4gVWludDE2QXJyYXk7IH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVWludDMyIGV4dGVuZHMgSW50XyB7XG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKGZhbHNlLCAzMik7IH1cbiAgICBnZXQgQXJyYXlUeXBlKCkgeyByZXR1cm4gVWludDMyQXJyYXk7IH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVWludDY0IGV4dGVuZHMgSW50XyB7XG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKGZhbHNlLCA2NCk7IH1cbiAgICBnZXQgQXJyYXlUeXBlKCkgeyByZXR1cm4gQmlnVWludDY0QXJyYXk7IH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShJbnQ4LnByb3RvdHlwZSwgJ0FycmF5VHlwZScsIHsgdmFsdWU6IEludDhBcnJheSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShJbnQxNi5wcm90b3R5cGUsICdBcnJheVR5cGUnLCB7IHZhbHVlOiBJbnQxNkFycmF5IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEludDMyLnByb3RvdHlwZSwgJ0FycmF5VHlwZScsIHsgdmFsdWU6IEludDMyQXJyYXkgfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoSW50NjQucHJvdG90eXBlLCAnQXJyYXlUeXBlJywgeyB2YWx1ZTogQmlnSW50NjRBcnJheSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShVaW50OC5wcm90b3R5cGUsICdBcnJheVR5cGUnLCB7IHZhbHVlOiBVaW50OEFycmF5IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFVpbnQxNi5wcm90b3R5cGUsICdBcnJheVR5cGUnLCB7IHZhbHVlOiBVaW50MTZBcnJheSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShVaW50MzIucHJvdG90eXBlLCAnQXJyYXlUeXBlJywgeyB2YWx1ZTogVWludDMyQXJyYXkgfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVWludDY0LnByb3RvdHlwZSwgJ0FycmF5VHlwZScsIHsgdmFsdWU6IEJpZ1VpbnQ2NEFycmF5IH0pO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBGbG9hdCBleHRlbmRzIERhdGFUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihwcmVjaXNpb24pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wcmVjaXNpb24gPSBwcmVjaXNpb247XG4gICAgfVxuICAgIGdldCB0eXBlSWQoKSB7IHJldHVybiBUeXBlLkZsb2F0OyB9XG4gICAgZ2V0IEFycmF5VHlwZSgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnByZWNpc2lvbikge1xuICAgICAgICAgICAgY2FzZSBQcmVjaXNpb24uSEFMRjogcmV0dXJuIFVpbnQxNkFycmF5O1xuICAgICAgICAgICAgY2FzZSBQcmVjaXNpb24uU0lOR0xFOiByZXR1cm4gRmxvYXQzMkFycmF5O1xuICAgICAgICAgICAgY2FzZSBQcmVjaXNpb24uRE9VQkxFOiByZXR1cm4gRmxvYXQ2NEFycmF5O1xuICAgICAgICB9XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgJHt0aGlzW1N5bWJvbC50b1N0cmluZ1RhZ119IHR5cGVgKTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiBgRmxvYXQkeyh0aGlzLnByZWNpc2lvbiA8PCA1KSB8fCAxNn1gOyB9XG59XG5fZCA9IFN5bWJvbC50b1N0cmluZ1RhZztcbkZsb2F0W19kXSA9ICgocHJvdG8pID0+IHtcbiAgICBwcm90by5wcmVjaXNpb24gPSBudWxsO1xuICAgIHJldHVybiBwcm90b1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ0Zsb2F0Jztcbn0pKEZsb2F0LnByb3RvdHlwZSk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEZsb2F0MTYgZXh0ZW5kcyBGbG9hdCB7XG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKFByZWNpc2lvbi5IQUxGKTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBGbG9hdDMyIGV4dGVuZHMgRmxvYXQge1xuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcihQcmVjaXNpb24uU0lOR0xFKTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBGbG9hdDY0IGV4dGVuZHMgRmxvYXQge1xuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcihQcmVjaXNpb24uRE9VQkxFKTsgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEZsb2F0MTYucHJvdG90eXBlLCAnQXJyYXlUeXBlJywgeyB2YWx1ZTogVWludDE2QXJyYXkgfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRmxvYXQzMi5wcm90b3R5cGUsICdBcnJheVR5cGUnLCB7IHZhbHVlOiBGbG9hdDMyQXJyYXkgfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRmxvYXQ2NC5wcm90b3R5cGUsICdBcnJheVR5cGUnLCB7IHZhbHVlOiBGbG9hdDY0QXJyYXkgfSk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEJpbmFyeSBleHRlbmRzIERhdGFUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgZ2V0IHR5cGVJZCgpIHsgcmV0dXJuIFR5cGUuQmluYXJ5OyB9XG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiBgQmluYXJ5YDsgfVxufVxuX2UgPSBTeW1ib2wudG9TdHJpbmdUYWc7XG5CaW5hcnlbX2VdID0gKChwcm90bykgPT4ge1xuICAgIHByb3RvLkFycmF5VHlwZSA9IFVpbnQ4QXJyYXk7XG4gICAgcmV0dXJuIHByb3RvW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnQmluYXJ5Jztcbn0pKEJpbmFyeS5wcm90b3R5cGUpO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBVdGY4IGV4dGVuZHMgRGF0YVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbiAgICBnZXQgdHlwZUlkKCkgeyByZXR1cm4gVHlwZS5VdGY4OyB9XG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiBgVXRmOGA7IH1cbn1cbl9mID0gU3ltYm9sLnRvU3RyaW5nVGFnO1xuVXRmOFtfZl0gPSAoKHByb3RvKSA9PiB7XG4gICAgcHJvdG8uQXJyYXlUeXBlID0gVWludDhBcnJheTtcbiAgICByZXR1cm4gcHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdVdGY4Jztcbn0pKFV0ZjgucHJvdG90eXBlKTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgQm9vbCBleHRlbmRzIERhdGFUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgZ2V0IHR5cGVJZCgpIHsgcmV0dXJuIFR5cGUuQm9vbDsgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gYEJvb2xgOyB9XG59XG5fZyA9IFN5bWJvbC50b1N0cmluZ1RhZztcbkJvb2xbX2ddID0gKChwcm90bykgPT4ge1xuICAgIHByb3RvLkFycmF5VHlwZSA9IFVpbnQ4QXJyYXk7XG4gICAgcmV0dXJuIHByb3RvW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnQm9vbCc7XG59KShCb29sLnByb3RvdHlwZSk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIERlY2ltYWwgZXh0ZW5kcyBEYXRhVHlwZSB7XG4gICAgY29uc3RydWN0b3Ioc2NhbGUsIHByZWNpc2lvbiwgYml0V2lkdGggPSAxMjgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zY2FsZSA9IHNjYWxlO1xuICAgICAgICB0aGlzLnByZWNpc2lvbiA9IHByZWNpc2lvbjtcbiAgICAgICAgdGhpcy5iaXRXaWR0aCA9IGJpdFdpZHRoO1xuICAgIH1cbiAgICBnZXQgdHlwZUlkKCkgeyByZXR1cm4gVHlwZS5EZWNpbWFsOyB9XG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiBgRGVjaW1hbFske3RoaXMucHJlY2lzaW9ufWUke3RoaXMuc2NhbGUgPiAwID8gYCtgIDogYGB9JHt0aGlzLnNjYWxlfV1gOyB9XG59XG5faCA9IFN5bWJvbC50b1N0cmluZ1RhZztcbkRlY2ltYWxbX2hdID0gKChwcm90bykgPT4ge1xuICAgIHByb3RvLnNjYWxlID0gbnVsbDtcbiAgICBwcm90by5wcmVjaXNpb24gPSBudWxsO1xuICAgIHByb3RvLkFycmF5VHlwZSA9IFVpbnQzMkFycmF5O1xuICAgIHJldHVybiBwcm90b1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ0RlY2ltYWwnO1xufSkoRGVjaW1hbC5wcm90b3R5cGUpO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBEYXRlXyBleHRlbmRzIERhdGFUeXBlIHtcbiAgICBjb25zdHJ1Y3Rvcih1bml0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudW5pdCA9IHVuaXQ7XG4gICAgfVxuICAgIGdldCB0eXBlSWQoKSB7IHJldHVybiBUeXBlLkRhdGU7IH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIGBEYXRlJHsodGhpcy51bml0ICsgMSkgKiAzMn08JHtEYXRlVW5pdFt0aGlzLnVuaXRdfT5gOyB9XG59XG5faiA9IFN5bWJvbC50b1N0cmluZ1RhZztcbkRhdGVfW19qXSA9ICgocHJvdG8pID0+IHtcbiAgICBwcm90by51bml0ID0gbnVsbDtcbiAgICBwcm90by5BcnJheVR5cGUgPSBJbnQzMkFycmF5O1xuICAgIHJldHVybiBwcm90b1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ0RhdGUnO1xufSkoRGF0ZV8ucHJvdG90eXBlKTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgRGF0ZURheSBleHRlbmRzIERhdGVfIHtcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoRGF0ZVVuaXQuREFZKTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBEYXRlTWlsbGlzZWNvbmQgZXh0ZW5kcyBEYXRlXyB7XG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKERhdGVVbml0Lk1JTExJU0VDT05EKTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmNsYXNzIFRpbWVfIGV4dGVuZHMgRGF0YVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKHVuaXQsIGJpdFdpZHRoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudW5pdCA9IHVuaXQ7XG4gICAgICAgIHRoaXMuYml0V2lkdGggPSBiaXRXaWR0aDtcbiAgICB9XG4gICAgZ2V0IHR5cGVJZCgpIHsgcmV0dXJuIFR5cGUuVGltZTsgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gYFRpbWUke3RoaXMuYml0V2lkdGh9PCR7VGltZVVuaXRbdGhpcy51bml0XX0+YDsgfVxuICAgIGdldCBBcnJheVR5cGUoKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5iaXRXaWR0aCkge1xuICAgICAgICAgICAgY2FzZSAzMjogcmV0dXJuIEludDMyQXJyYXk7XG4gICAgICAgICAgICBjYXNlIDY0OiByZXR1cm4gQmlnSW50NjRBcnJheTtcbiAgICAgICAgfVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkICR7dGhpc1tTeW1ib2wudG9TdHJpbmdUYWddfSB0eXBlYCk7XG4gICAgfVxufVxuX2sgPSBTeW1ib2wudG9TdHJpbmdUYWc7XG5UaW1lX1tfa10gPSAoKHByb3RvKSA9PiB7XG4gICAgcHJvdG8udW5pdCA9IG51bGw7XG4gICAgcHJvdG8uYml0V2lkdGggPSBudWxsO1xuICAgIHJldHVybiBwcm90b1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ1RpbWUnO1xufSkoVGltZV8ucHJvdG90eXBlKTtcbmV4cG9ydCB7IFRpbWVfIGFzIFRpbWUgfTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVGltZVNlY29uZCBleHRlbmRzIFRpbWVfIHtcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoVGltZVVuaXQuU0VDT05ELCAzMik7IH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVGltZU1pbGxpc2Vjb25kIGV4dGVuZHMgVGltZV8ge1xuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcihUaW1lVW5pdC5NSUxMSVNFQ09ORCwgMzIpOyB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFRpbWVNaWNyb3NlY29uZCBleHRlbmRzIFRpbWVfIHtcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoVGltZVVuaXQuTUlDUk9TRUNPTkQsIDY0KTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBUaW1lTmFub3NlY29uZCBleHRlbmRzIFRpbWVfIHtcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoVGltZVVuaXQuTkFOT1NFQ09ORCwgNjQpOyB9XG59XG4vKiogQGlnbm9yZSAqL1xuY2xhc3MgVGltZXN0YW1wXyBleHRlbmRzIERhdGFUeXBlIHtcbiAgICBjb25zdHJ1Y3Rvcih1bml0LCB0aW1lem9uZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnVuaXQgPSB1bml0O1xuICAgICAgICB0aGlzLnRpbWV6b25lID0gdGltZXpvbmU7XG4gICAgfVxuICAgIGdldCB0eXBlSWQoKSB7IHJldHVybiBUeXBlLlRpbWVzdGFtcDsgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gYFRpbWVzdGFtcDwke1RpbWVVbml0W3RoaXMudW5pdF19JHt0aGlzLnRpbWV6b25lID8gYCwgJHt0aGlzLnRpbWV6b25lfWAgOiBgYH0+YDsgfVxufVxuX2wgPSBTeW1ib2wudG9TdHJpbmdUYWc7XG5UaW1lc3RhbXBfW19sXSA9ICgocHJvdG8pID0+IHtcbiAgICBwcm90by51bml0ID0gbnVsbDtcbiAgICBwcm90by50aW1lem9uZSA9IG51bGw7XG4gICAgcHJvdG8uQXJyYXlUeXBlID0gSW50MzJBcnJheTtcbiAgICByZXR1cm4gcHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdUaW1lc3RhbXAnO1xufSkoVGltZXN0YW1wXy5wcm90b3R5cGUpO1xuZXhwb3J0IHsgVGltZXN0YW1wXyBhcyBUaW1lc3RhbXAgfTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVGltZXN0YW1wU2Vjb25kIGV4dGVuZHMgVGltZXN0YW1wXyB7XG4gICAgY29uc3RydWN0b3IodGltZXpvbmUpIHsgc3VwZXIoVGltZVVuaXQuU0VDT05ELCB0aW1lem9uZSk7IH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVGltZXN0YW1wTWlsbGlzZWNvbmQgZXh0ZW5kcyBUaW1lc3RhbXBfIHtcbiAgICBjb25zdHJ1Y3Rvcih0aW1lem9uZSkgeyBzdXBlcihUaW1lVW5pdC5NSUxMSVNFQ09ORCwgdGltZXpvbmUpOyB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFRpbWVzdGFtcE1pY3Jvc2Vjb25kIGV4dGVuZHMgVGltZXN0YW1wXyB7XG4gICAgY29uc3RydWN0b3IodGltZXpvbmUpIHsgc3VwZXIoVGltZVVuaXQuTUlDUk9TRUNPTkQsIHRpbWV6b25lKTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBUaW1lc3RhbXBOYW5vc2Vjb25kIGV4dGVuZHMgVGltZXN0YW1wXyB7XG4gICAgY29uc3RydWN0b3IodGltZXpvbmUpIHsgc3VwZXIoVGltZVVuaXQuTkFOT1NFQ09ORCwgdGltZXpvbmUpOyB9XG59XG4vKiogQGlnbm9yZSAqL1xuY2xhc3MgSW50ZXJ2YWxfIGV4dGVuZHMgRGF0YVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKHVuaXQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy51bml0ID0gdW5pdDtcbiAgICB9XG4gICAgZ2V0IHR5cGVJZCgpIHsgcmV0dXJuIFR5cGUuSW50ZXJ2YWw7IH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIGBJbnRlcnZhbDwke0ludGVydmFsVW5pdFt0aGlzLnVuaXRdfT5gOyB9XG59XG5fbSA9IFN5bWJvbC50b1N0cmluZ1RhZztcbkludGVydmFsX1tfbV0gPSAoKHByb3RvKSA9PiB7XG4gICAgcHJvdG8udW5pdCA9IG51bGw7XG4gICAgcHJvdG8uQXJyYXlUeXBlID0gSW50MzJBcnJheTtcbiAgICByZXR1cm4gcHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdJbnRlcnZhbCc7XG59KShJbnRlcnZhbF8ucHJvdG90eXBlKTtcbmV4cG9ydCB7IEludGVydmFsXyBhcyBJbnRlcnZhbCB9O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBJbnRlcnZhbERheVRpbWUgZXh0ZW5kcyBJbnRlcnZhbF8ge1xuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcihJbnRlcnZhbFVuaXQuREFZX1RJTUUpOyB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEludGVydmFsWWVhck1vbnRoIGV4dGVuZHMgSW50ZXJ2YWxfIHtcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoSW50ZXJ2YWxVbml0LllFQVJfTU9OVEgpOyB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIExpc3QgZXh0ZW5kcyBEYXRhVHlwZSB7XG4gICAgY29uc3RydWN0b3IoY2hpbGQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtjaGlsZF07XG4gICAgfVxuICAgIGdldCB0eXBlSWQoKSB7IHJldHVybiBUeXBlLkxpc3Q7IH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIGBMaXN0PCR7dGhpcy52YWx1ZVR5cGV9PmA7IH1cbiAgICBnZXQgdmFsdWVUeXBlKCkgeyByZXR1cm4gdGhpcy5jaGlsZHJlblswXS50eXBlOyB9XG4gICAgZ2V0IHZhbHVlRmllbGQoKSB7IHJldHVybiB0aGlzLmNoaWxkcmVuWzBdOyB9XG4gICAgZ2V0IEFycmF5VHlwZSgpIHsgcmV0dXJuIHRoaXMudmFsdWVUeXBlLkFycmF5VHlwZTsgfVxufVxuX28gPSBTeW1ib2wudG9TdHJpbmdUYWc7XG5MaXN0W19vXSA9ICgocHJvdG8pID0+IHtcbiAgICBwcm90by5jaGlsZHJlbiA9IG51bGw7XG4gICAgcmV0dXJuIHByb3RvW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnTGlzdCc7XG59KShMaXN0LnByb3RvdHlwZSk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFN0cnVjdCBleHRlbmRzIERhdGFUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihjaGlsZHJlbikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgfVxuICAgIGdldCB0eXBlSWQoKSB7IHJldHVybiBUeXBlLlN0cnVjdDsgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gYFN0cnVjdDx7JHt0aGlzLmNoaWxkcmVuLm1hcCgoZikgPT4gYCR7Zi5uYW1lfToke2YudHlwZX1gKS5qb2luKGAsIGApfX0+YDsgfVxufVxuX3AgPSBTeW1ib2wudG9TdHJpbmdUYWc7XG5TdHJ1Y3RbX3BdID0gKChwcm90bykgPT4ge1xuICAgIHByb3RvLmNoaWxkcmVuID0gbnVsbDtcbiAgICByZXR1cm4gcHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdTdHJ1Y3QnO1xufSkoU3RydWN0LnByb3RvdHlwZSk7XG4vKiogQGlnbm9yZSAqL1xuY2xhc3MgVW5pb25fIGV4dGVuZHMgRGF0YVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKG1vZGUsIHR5cGVJZHMsIGNoaWxkcmVuKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgdGhpcy50eXBlSWRzID0gdHlwZUlkcyA9IEludDMyQXJyYXkuZnJvbSh0eXBlSWRzKTtcbiAgICAgICAgdGhpcy50eXBlSWRUb0NoaWxkSW5kZXggPSB0eXBlSWRzLnJlZHVjZSgodHlwZUlkVG9DaGlsZEluZGV4LCB0eXBlSWQsIGlkeCkgPT4gKHR5cGVJZFRvQ2hpbGRJbmRleFt0eXBlSWRdID0gaWR4KSAmJiB0eXBlSWRUb0NoaWxkSW5kZXggfHwgdHlwZUlkVG9DaGlsZEluZGV4LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAgICB9XG4gICAgZ2V0IHR5cGVJZCgpIHsgcmV0dXJuIFR5cGUuVW5pb247IH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXNbU3ltYm9sLnRvU3RyaW5nVGFnXX08JHt0aGlzLmNoaWxkcmVuLm1hcCgoeCkgPT4gYCR7eC50eXBlfWApLmpvaW4oYCB8IGApfT5gO1xuICAgIH1cbn1cbl9xID0gU3ltYm9sLnRvU3RyaW5nVGFnO1xuVW5pb25fW19xXSA9ICgocHJvdG8pID0+IHtcbiAgICBwcm90by5tb2RlID0gbnVsbDtcbiAgICBwcm90by50eXBlSWRzID0gbnVsbDtcbiAgICBwcm90by5jaGlsZHJlbiA9IG51bGw7XG4gICAgcHJvdG8udHlwZUlkVG9DaGlsZEluZGV4ID0gbnVsbDtcbiAgICBwcm90by5BcnJheVR5cGUgPSBJbnQ4QXJyYXk7XG4gICAgcmV0dXJuIHByb3RvW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnVW5pb24nO1xufSkoVW5pb25fLnByb3RvdHlwZSk7XG5leHBvcnQgeyBVbmlvbl8gYXMgVW5pb24gfTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgRGVuc2VVbmlvbiBleHRlbmRzIFVuaW9uXyB7XG4gICAgY29uc3RydWN0b3IodHlwZUlkcywgY2hpbGRyZW4pIHtcbiAgICAgICAgc3VwZXIoVW5pb25Nb2RlLkRlbnNlLCB0eXBlSWRzLCBjaGlsZHJlbik7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBTcGFyc2VVbmlvbiBleHRlbmRzIFVuaW9uXyB7XG4gICAgY29uc3RydWN0b3IodHlwZUlkcywgY2hpbGRyZW4pIHtcbiAgICAgICAgc3VwZXIoVW5pb25Nb2RlLlNwYXJzZSwgdHlwZUlkcywgY2hpbGRyZW4pO1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgRml4ZWRTaXplQmluYXJ5IGV4dGVuZHMgRGF0YVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKGJ5dGVXaWR0aCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmJ5dGVXaWR0aCA9IGJ5dGVXaWR0aDtcbiAgICB9XG4gICAgZ2V0IHR5cGVJZCgpIHsgcmV0dXJuIFR5cGUuRml4ZWRTaXplQmluYXJ5OyB9XG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiBgRml4ZWRTaXplQmluYXJ5WyR7dGhpcy5ieXRlV2lkdGh9XWA7IH1cbn1cbl9yID0gU3ltYm9sLnRvU3RyaW5nVGFnO1xuRml4ZWRTaXplQmluYXJ5W19yXSA9ICgocHJvdG8pID0+IHtcbiAgICBwcm90by5ieXRlV2lkdGggPSBudWxsO1xuICAgIHByb3RvLkFycmF5VHlwZSA9IFVpbnQ4QXJyYXk7XG4gICAgcmV0dXJuIHByb3RvW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnRml4ZWRTaXplQmluYXJ5Jztcbn0pKEZpeGVkU2l6ZUJpbmFyeS5wcm90b3R5cGUpO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBGaXhlZFNpemVMaXN0IGV4dGVuZHMgRGF0YVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKGxpc3RTaXplLCBjaGlsZCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxpc3RTaXplID0gbGlzdFNpemU7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBbY2hpbGRdO1xuICAgIH1cbiAgICBnZXQgdHlwZUlkKCkgeyByZXR1cm4gVHlwZS5GaXhlZFNpemVMaXN0OyB9XG4gICAgZ2V0IHZhbHVlVHlwZSgpIHsgcmV0dXJuIHRoaXMuY2hpbGRyZW5bMF0udHlwZTsgfVxuICAgIGdldCB2YWx1ZUZpZWxkKCkgeyByZXR1cm4gdGhpcy5jaGlsZHJlblswXTsgfVxuICAgIGdldCBBcnJheVR5cGUoKSB7IHJldHVybiB0aGlzLnZhbHVlVHlwZS5BcnJheVR5cGU7IH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIGBGaXhlZFNpemVMaXN0WyR7dGhpcy5saXN0U2l6ZX1dPCR7dGhpcy52YWx1ZVR5cGV9PmA7IH1cbn1cbl9zID0gU3ltYm9sLnRvU3RyaW5nVGFnO1xuRml4ZWRTaXplTGlzdFtfc10gPSAoKHByb3RvKSA9PiB7XG4gICAgcHJvdG8uY2hpbGRyZW4gPSBudWxsO1xuICAgIHByb3RvLmxpc3RTaXplID0gbnVsbDtcbiAgICByZXR1cm4gcHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdGaXhlZFNpemVMaXN0Jztcbn0pKEZpeGVkU2l6ZUxpc3QucHJvdG90eXBlKTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgTWFwXyBleHRlbmRzIERhdGFUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihjaGlsZCwga2V5c1NvcnRlZCA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBbY2hpbGRdO1xuICAgICAgICB0aGlzLmtleXNTb3J0ZWQgPSBrZXlzU29ydGVkO1xuICAgIH1cbiAgICBnZXQgdHlwZUlkKCkgeyByZXR1cm4gVHlwZS5NYXA7IH1cbiAgICBnZXQga2V5VHlwZSgpIHsgcmV0dXJuIHRoaXMuY2hpbGRyZW5bMF0udHlwZS5jaGlsZHJlblswXS50eXBlOyB9XG4gICAgZ2V0IHZhbHVlVHlwZSgpIHsgcmV0dXJuIHRoaXMuY2hpbGRyZW5bMF0udHlwZS5jaGlsZHJlblsxXS50eXBlOyB9XG4gICAgZ2V0IGNoaWxkVHlwZSgpIHsgcmV0dXJuIHRoaXMuY2hpbGRyZW5bMF0udHlwZTsgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gYE1hcDx7JHt0aGlzLmNoaWxkcmVuWzBdLnR5cGUuY2hpbGRyZW4ubWFwKChmKSA9PiBgJHtmLm5hbWV9OiR7Zi50eXBlfWApLmpvaW4oYCwgYCl9fT5gOyB9XG59XG5fdCA9IFN5bWJvbC50b1N0cmluZ1RhZztcbk1hcF9bX3RdID0gKChwcm90bykgPT4ge1xuICAgIHByb3RvLmNoaWxkcmVuID0gbnVsbDtcbiAgICBwcm90by5rZXlzU29ydGVkID0gbnVsbDtcbiAgICByZXR1cm4gcHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdNYXBfJztcbn0pKE1hcF8ucHJvdG90eXBlKTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXRJZCA9ICgoYXRvbWljRGljdGlvbmFyeUlkKSA9PiAoKSA9PiArK2F0b21pY0RpY3Rpb25hcnlJZCkoLTEpO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBEaWN0aW9uYXJ5IGV4dGVuZHMgRGF0YVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKGRpY3Rpb25hcnksIGluZGljZXMsIGlkLCBpc09yZGVyZWQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5pbmRpY2VzID0gaW5kaWNlcztcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5ID0gZGljdGlvbmFyeTtcbiAgICAgICAgdGhpcy5pc09yZGVyZWQgPSBpc09yZGVyZWQgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuaWQgPSBpZCA9PSBudWxsID8gZ2V0SWQoKSA6ICh0eXBlb2YgaWQgPT09ICdudW1iZXInID8gaWQgOiBpZC5sb3cpO1xuICAgIH1cbiAgICBnZXQgdHlwZUlkKCkgeyByZXR1cm4gVHlwZS5EaWN0aW9uYXJ5OyB9XG4gICAgZ2V0IGNoaWxkcmVuKCkgeyByZXR1cm4gdGhpcy5kaWN0aW9uYXJ5LmNoaWxkcmVuOyB9XG4gICAgZ2V0IHZhbHVlVHlwZSgpIHsgcmV0dXJuIHRoaXMuZGljdGlvbmFyeTsgfVxuICAgIGdldCBBcnJheVR5cGUoKSB7IHJldHVybiB0aGlzLmRpY3Rpb25hcnkuQXJyYXlUeXBlOyB9XG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiBgRGljdGlvbmFyeTwke3RoaXMuaW5kaWNlc30sICR7dGhpcy5kaWN0aW9uYXJ5fT5gOyB9XG59XG5fdSA9IFN5bWJvbC50b1N0cmluZ1RhZztcbkRpY3Rpb25hcnlbX3VdID0gKChwcm90bykgPT4ge1xuICAgIHByb3RvLmlkID0gbnVsbDtcbiAgICBwcm90by5pbmRpY2VzID0gbnVsbDtcbiAgICBwcm90by5pc09yZGVyZWQgPSBudWxsO1xuICAgIHByb3RvLmRpY3Rpb25hcnkgPSBudWxsO1xuICAgIHJldHVybiBwcm90b1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ0RpY3Rpb25hcnknO1xufSkoRGljdGlvbmFyeS5wcm90b3R5cGUpO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpZGVGb3JUeXBlKHR5cGUpIHtcbiAgICBjb25zdCB0ID0gdHlwZTtcbiAgICBzd2l0Y2ggKHR5cGUudHlwZUlkKSB7XG4gICAgICAgIGNhc2UgVHlwZS5EZWNpbWFsOiByZXR1cm4gdHlwZS5iaXRXaWR0aCAvIDMyO1xuICAgICAgICBjYXNlIFR5cGUuVGltZXN0YW1wOiByZXR1cm4gMjtcbiAgICAgICAgY2FzZSBUeXBlLkRhdGU6IHJldHVybiAxICsgdC51bml0O1xuICAgICAgICBjYXNlIFR5cGUuSW50ZXJ2YWw6IHJldHVybiAxICsgdC51bml0O1xuICAgICAgICAvLyBjYXNlIFR5cGUuSW50OiByZXR1cm4gMSArICsoKHQgYXMgSW50XykuYml0V2lkdGggPiAzMik7XG4gICAgICAgIC8vIGNhc2UgVHlwZS5UaW1lOiByZXR1cm4gMSArICsoKHQgYXMgVGltZV8pLmJpdFdpZHRoID4gMzIpO1xuICAgICAgICBjYXNlIFR5cGUuRml4ZWRTaXplTGlzdDogcmV0dXJuIHQubGlzdFNpemU7XG4gICAgICAgIGNhc2UgVHlwZS5GaXhlZFNpemVCaW5hcnk6IHJldHVybiB0LmJ5dGVXaWR0aDtcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuIDE7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCb29sKF9kYXRhLCBfaW5kZXgsIGJ5dGUsIGJpdCkge1xuICAgIHJldHVybiAoYnl0ZSAmIDEgPDwgYml0KSAhPT0gMDtcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Qml0KF9kYXRhLCBfaW5kZXgsIGJ5dGUsIGJpdCkge1xuICAgIHJldHVybiAoYnl0ZSAmIDEgPDwgYml0KSA+PiBiaXQ7XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEJvb2woYnl0ZXMsIGluZGV4LCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA/XG4gICAgICAgICEhKGJ5dGVzW2luZGV4ID4+IDNdIHw9ICgxIDw8IChpbmRleCAlIDgpKSkgfHwgdHJ1ZSA6XG4gICAgICAgICEoYnl0ZXNbaW5kZXggPj4gM10gJj0gfigxIDw8IChpbmRleCAlIDgpKSkgJiYgZmFsc2U7XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRydW5jYXRlQml0bWFwKG9mZnNldCwgbGVuZ3RoLCBiaXRtYXApIHtcbiAgICBjb25zdCBhbGlnbmVkU2l6ZSA9IChiaXRtYXAuYnl0ZUxlbmd0aCArIDcpICYgfjc7XG4gICAgaWYgKG9mZnNldCA+IDAgfHwgYml0bWFwLmJ5dGVMZW5ndGggPCBhbGlnbmVkU2l6ZSkge1xuICAgICAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGFsaWduZWRTaXplKTtcbiAgICAgICAgLy8gSWYgdGhlIG9mZnNldCBpcyBhIG11bHRpcGxlIG9mIDggYml0cywgaXQncyBzYWZlIHRvIHNsaWNlIHRoZSBiaXRtYXBcbiAgICAgICAgYnl0ZXMuc2V0KG9mZnNldCAlIDggPT09IDAgPyBiaXRtYXAuc3ViYXJyYXkob2Zmc2V0ID4+IDMpIDpcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSBpdGVyYXRlIGVhY2ggYml0IGZyb20gdGhlIG9mZnNldCBhbmQgcmV0dXJuIGEgbmV3IG9uZVxuICAgICAgICAgICAgcGFja0Jvb2xzKG5ldyBCaXRJdGVyYXRvcihiaXRtYXAsIG9mZnNldCwgbGVuZ3RoLCBudWxsLCBnZXRCb29sKSkuc3ViYXJyYXkoMCwgYWxpZ25lZFNpemUpKTtcbiAgICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgIH1cbiAgICByZXR1cm4gYml0bWFwO1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiBwYWNrQm9vbHModmFsdWVzKSB7XG4gICAgY29uc3QgeHMgPSBbXTtcbiAgICBsZXQgaSA9IDAsIGJpdCA9IDAsIGJ5dGUgPSAwO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgIHZhbHVlICYmIChieXRlIHw9IDEgPDwgYml0KTtcbiAgICAgICAgaWYgKCsrYml0ID09PSA4KSB7XG4gICAgICAgICAgICB4c1tpKytdID0gYnl0ZTtcbiAgICAgICAgICAgIGJ5dGUgPSBiaXQgPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpID09PSAwIHx8IGJpdCA+IDApIHtcbiAgICAgICAgeHNbaSsrXSA9IGJ5dGU7XG4gICAgfVxuICAgIGNvbnN0IGIgPSBuZXcgVWludDhBcnJheSgoeHMubGVuZ3RoICsgNykgJiB+Nyk7XG4gICAgYi5zZXQoeHMpO1xuICAgIHJldHVybiBiO1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBCaXRJdGVyYXRvciB7XG4gICAgY29uc3RydWN0b3IoYnl0ZXMsIGJlZ2luLCBsZW5ndGgsIGNvbnRleHQsIGdldCkge1xuICAgICAgICB0aGlzLmJ5dGVzID0gYnl0ZXM7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmdldCA9IGdldDtcbiAgICAgICAgdGhpcy5iaXQgPSBiZWdpbiAlIDg7XG4gICAgICAgIHRoaXMuYnl0ZUluZGV4ID0gYmVnaW4gPj4gMztcbiAgICAgICAgdGhpcy5ieXRlID0gYnl0ZXNbdGhpcy5ieXRlSW5kZXgrK107XG4gICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIH1cbiAgICBuZXh0KCkge1xuICAgICAgICBpZiAodGhpcy5pbmRleCA8IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5iaXQgPT09IDgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJpdCA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5ieXRlID0gdGhpcy5ieXRlc1t0aGlzLmJ5dGVJbmRleCsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuZ2V0KHRoaXMuY29udGV4dCwgdGhpcy5pbmRleCsrLCB0aGlzLmJ5dGUsIHRoaXMuYml0KyspXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBudWxsIH07XG4gICAgfVxuICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG4vKipcbiAqIENvbXB1dGUgdGhlIHBvcHVsYXRpb24gY291bnQgKHRoZSBudW1iZXIgb2YgYml0cyBzZXQgdG8gMSkgZm9yIGEgcmFuZ2Ugb2YgYml0cyBpbiBhIFVpbnQ4QXJyYXkuXG4gKiBAcGFyYW0gdmVjdG9yIFRoZSBVaW50OEFycmF5IG9mIGJpdHMgZm9yIHdoaWNoIHRvIGNvbXB1dGUgdGhlIHBvcHVsYXRpb24gY291bnQuXG4gKiBAcGFyYW0gbGhzIFRoZSByYW5nZSdzIGxlZnQtaGFuZCBzaWRlIChvciBzdGFydCkgYml0XG4gKiBAcGFyYW0gcmhzIFRoZSByYW5nZSdzIHJpZ2h0LWhhbmQgc2lkZSAob3IgZW5kKSBiaXRcbiAqL1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3BjbnRfYml0X3JhbmdlKGRhdGEsIGxocywgcmhzKSB7XG4gICAgaWYgKHJocyAtIGxocyA8PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvLyBJZiB0aGUgYml0IHJhbmdlIGlzIGxlc3MgdGhhbiBvbmUgYnl0ZSwgc3VtIHRoZSAxIGJpdHMgaW4gdGhlIGJpdCByYW5nZVxuICAgIGlmIChyaHMgLSBsaHMgPCA4KSB7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGJpdCBvZiBuZXcgQml0SXRlcmF0b3IoZGF0YSwgbGhzLCByaHMgLSBsaHMsIGRhdGEsIGdldEJpdCkpIHtcbiAgICAgICAgICAgIHN1bSArPSBiaXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1bTtcbiAgICB9XG4gICAgLy8gR2V0IHRoZSBuZXh0IGxvd2VzdCBtdWx0aXBsZSBvZiA4IGZyb20gdGhlIHJpZ2h0IGhhbmQgc2lkZVxuICAgIGNvbnN0IHJoc0luc2lkZSA9IHJocyA+PiAzIDw8IDM7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgbXVsdGlwbGUgb2YgOCBmcm9tIHRoZSBsZWZ0IGhhbmQgc2lkZVxuICAgIGNvbnN0IGxoc0luc2lkZSA9IGxocyArIChsaHMgJSA4ID09PSAwID8gMCA6IDggLSBsaHMgJSA4KTtcbiAgICByZXR1cm4gKFxuICAgIC8vIEdldCB0aGUgcG9wY250IG9mIGJpdHMgYmV0d2VlbiB0aGUgbGVmdCBoYW5kIHNpZGUsIGFuZCB0aGUgbmV4dCBoaWdoZXN0IG11bHRpcGxlIG9mIDhcbiAgICBwb3BjbnRfYml0X3JhbmdlKGRhdGEsIGxocywgbGhzSW5zaWRlKSArXG4gICAgICAgIC8vIEdldCB0aGUgcG9wY250IG9mIGJpdHMgYmV0d2VlbiB0aGUgcmlnaHQgaGFuZCBzaWRlLCBhbmQgdGhlIG5leHQgbG93ZXN0IG11bHRpcGxlIG9mIDhcbiAgICAgICAgcG9wY250X2JpdF9yYW5nZShkYXRhLCByaHNJbnNpZGUsIHJocykgK1xuICAgICAgICAvLyBHZXQgdGhlIHBvcGNudCBvZiBhbGwgYml0cyBiZXR3ZWVuIHRoZSBsZWZ0IGFuZCByaWdodCBoYW5kIHNpZGVzJyBtdWx0aXBsZXMgb2YgOFxuICAgICAgICBwb3BjbnRfYXJyYXkoZGF0YSwgbGhzSW5zaWRlID4+IDMsIChyaHNJbnNpZGUgLSBsaHNJbnNpZGUpID4+IDMpKTtcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgZnVuY3Rpb24gcG9wY250X2FycmF5KGFyciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCkge1xuICAgIGxldCBjbnQgPSAwLCBwb3MgPSBNYXRoLnRydW5jKGJ5dGVPZmZzZXQpO1xuICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoYXJyLmJ1ZmZlciwgYXJyLmJ5dGVPZmZzZXQsIGFyci5ieXRlTGVuZ3RoKTtcbiAgICBjb25zdCBsZW4gPSBieXRlTGVuZ3RoID09PSB2b2lkIDAgPyBhcnIuYnl0ZUxlbmd0aCA6IHBvcyArIGJ5dGVMZW5ndGg7XG4gICAgd2hpbGUgKGxlbiAtIHBvcyA+PSA0KSB7XG4gICAgICAgIGNudCArPSBwb3BjbnRfdWludDMyKHZpZXcuZ2V0VWludDMyKHBvcykpO1xuICAgICAgICBwb3MgKz0gNDtcbiAgICB9XG4gICAgd2hpbGUgKGxlbiAtIHBvcyA+PSAyKSB7XG4gICAgICAgIGNudCArPSBwb3BjbnRfdWludDMyKHZpZXcuZ2V0VWludDE2KHBvcykpO1xuICAgICAgICBwb3MgKz0gMjtcbiAgICB9XG4gICAgd2hpbGUgKGxlbiAtIHBvcyA+PSAxKSB7XG4gICAgICAgIGNudCArPSBwb3BjbnRfdWludDMyKHZpZXcuZ2V0VWludDgocG9zKSk7XG4gICAgICAgIHBvcyArPSAxO1xuICAgIH1cbiAgICByZXR1cm4gY250O1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3BjbnRfdWludDMyKHVpbnQzMikge1xuICAgIGxldCBpID0gTWF0aC50cnVuYyh1aW50MzIpO1xuICAgIGkgPSBpIC0gKChpID4+PiAxKSAmIDB4NTU1NTU1NTUpO1xuICAgIGkgPSAoaSAmIDB4MzMzMzMzMzMpICsgKChpID4+PiAyKSAmIDB4MzMzMzMzMzMpO1xuICAgIHJldHVybiAoKChpICsgKGkgPj4+IDQpKSAmIDB4MEYwRjBGMEYpICogMHgwMTAxMDEwMSkgPj4+IDI0O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1iaXQubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyB0b0FycmF5QnVmZmVyVmlldyB9IGZyb20gJy4vYnVmZmVyLm1qcyc7XG5pbXBvcnQgeyBCaWdJbnRBdmFpbGFibGUsIEJpZ0ludDY0QXJyYXksIEJpZ1VpbnQ2NEFycmF5IH0gZnJvbSAnLi9jb21wYXQubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgaXNBcnJvd0JpZ051bVN5bWJvbCA9IFN5bWJvbC5mb3IoJ2lzQXJyb3dCaWdOdW0nKTtcbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBCaWdOdW0oeCwgLi4ueHMpIHtcbiAgICBpZiAoeHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YodG9BcnJheUJ1ZmZlclZpZXcodGhpc1snVHlwZWRBcnJheSddLCB4KSwgdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKG5ldyB0aGlzWydUeXBlZEFycmF5J10oeCwgLi4ueHMpLCB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSk7XG59XG5CaWdOdW0ucHJvdG90eXBlW2lzQXJyb3dCaWdOdW1TeW1ib2xdID0gdHJ1ZTtcbkJpZ051bS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gYFwiJHtiaWdudW1Ub1N0cmluZyh0aGlzKX1cImA7IH07XG5CaWdOdW0ucHJvdG90eXBlLnZhbHVlT2YgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBiaWdudW1Ub051bWJlcih0aGlzKTsgfTtcbkJpZ051bS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBiaWdudW1Ub1N0cmluZyh0aGlzKTsgfTtcbkJpZ051bS5wcm90b3R5cGVbU3ltYm9sLnRvUHJpbWl0aXZlXSA9IGZ1bmN0aW9uIChoaW50ID0gJ2RlZmF1bHQnKSB7XG4gICAgc3dpdGNoIChoaW50KSB7XG4gICAgICAgIGNhc2UgJ251bWJlcic6IHJldHVybiBiaWdudW1Ub051bWJlcih0aGlzKTtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzogcmV0dXJuIGJpZ251bVRvU3RyaW5nKHRoaXMpO1xuICAgICAgICBjYXNlICdkZWZhdWx0JzogcmV0dXJuIGJpZ251bVRvQmlnSW50KHRoaXMpO1xuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIGJpZ251bVRvU3RyaW5nKHRoaXMpO1xufTtcbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBTaWduZWRCaWdOdW0oLi4uYXJncykgeyByZXR1cm4gQmlnTnVtLmFwcGx5KHRoaXMsIGFyZ3MpOyB9XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gVW5zaWduZWRCaWdOdW0oLi4uYXJncykgeyByZXR1cm4gQmlnTnVtLmFwcGx5KHRoaXMsIGFyZ3MpOyB9XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gRGVjaW1hbEJpZ051bSguLi5hcmdzKSB7IHJldHVybiBCaWdOdW0uYXBwbHkodGhpcywgYXJncyk7IH1cbk9iamVjdC5zZXRQcm90b3R5cGVPZihTaWduZWRCaWdOdW0ucHJvdG90eXBlLCBPYmplY3QuY3JlYXRlKEludDMyQXJyYXkucHJvdG90eXBlKSk7XG5PYmplY3Quc2V0UHJvdG90eXBlT2YoVW5zaWduZWRCaWdOdW0ucHJvdG90eXBlLCBPYmplY3QuY3JlYXRlKFVpbnQzMkFycmF5LnByb3RvdHlwZSkpO1xuT2JqZWN0LnNldFByb3RvdHlwZU9mKERlY2ltYWxCaWdOdW0ucHJvdG90eXBlLCBPYmplY3QuY3JlYXRlKFVpbnQzMkFycmF5LnByb3RvdHlwZSkpO1xuT2JqZWN0LmFzc2lnbihTaWduZWRCaWdOdW0ucHJvdG90eXBlLCBCaWdOdW0ucHJvdG90eXBlLCB7ICdjb25zdHJ1Y3Rvcic6IFNpZ25lZEJpZ051bSwgJ3NpZ25lZCc6IHRydWUsICdUeXBlZEFycmF5JzogSW50MzJBcnJheSwgJ0JpZ0ludEFycmF5JzogQmlnSW50NjRBcnJheSB9KTtcbk9iamVjdC5hc3NpZ24oVW5zaWduZWRCaWdOdW0ucHJvdG90eXBlLCBCaWdOdW0ucHJvdG90eXBlLCB7ICdjb25zdHJ1Y3Rvcic6IFVuc2lnbmVkQmlnTnVtLCAnc2lnbmVkJzogZmFsc2UsICdUeXBlZEFycmF5JzogVWludDMyQXJyYXksICdCaWdJbnRBcnJheSc6IEJpZ1VpbnQ2NEFycmF5IH0pO1xuT2JqZWN0LmFzc2lnbihEZWNpbWFsQmlnTnVtLnByb3RvdHlwZSwgQmlnTnVtLnByb3RvdHlwZSwgeyAnY29uc3RydWN0b3InOiBEZWNpbWFsQmlnTnVtLCAnc2lnbmVkJzogdHJ1ZSwgJ1R5cGVkQXJyYXknOiBVaW50MzJBcnJheSwgJ0JpZ0ludEFycmF5JzogQmlnVWludDY0QXJyYXkgfSk7XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gYmlnbnVtVG9OdW1iZXIoYm4pIHtcbiAgICBjb25zdCB7IGJ1ZmZlciwgYnl0ZU9mZnNldCwgbGVuZ3RoLCAnc2lnbmVkJzogc2lnbmVkIH0gPSBibjtcbiAgICBjb25zdCB3b3JkcyA9IG5ldyBCaWdVaW50NjRBcnJheShidWZmZXIsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gICAgY29uc3QgbmVnYXRpdmUgPSBzaWduZWQgJiYgd29yZHNbd29yZHMubGVuZ3RoIC0gMV0gJiAoQmlnSW50KDEpIDw8IEJpZ0ludCg2MykpO1xuICAgIGxldCBudW1iZXIgPSBuZWdhdGl2ZSA/IEJpZ0ludCgxKSA6IEJpZ0ludCgwKTtcbiAgICBsZXQgaSA9IEJpZ0ludCgwKTtcbiAgICBpZiAoIW5lZ2F0aXZlKSB7XG4gICAgICAgIGZvciAoY29uc3Qgd29yZCBvZiB3b3Jkcykge1xuICAgICAgICAgICAgbnVtYmVyICs9IHdvcmQgKiAoQmlnSW50KDEpIDw8IChCaWdJbnQoMzIpICogaSsrKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3Qgd29yZCBvZiB3b3Jkcykge1xuICAgICAgICAgICAgbnVtYmVyICs9IH53b3JkICogKEJpZ0ludCgxKSA8PCAoQmlnSW50KDMyKSAqIGkrKykpO1xuICAgICAgICB9XG4gICAgICAgIG51bWJlciAqPSBCaWdJbnQoLTEpO1xuICAgIH1cbiAgICByZXR1cm4gbnVtYmVyO1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBsZXQgYmlnbnVtVG9TdHJpbmc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGxldCBiaWdudW1Ub0JpZ0ludDtcbmlmICghQmlnSW50QXZhaWxhYmxlKSB7XG4gICAgYmlnbnVtVG9TdHJpbmcgPSBkZWNpbWFsVG9TdHJpbmc7XG4gICAgYmlnbnVtVG9CaWdJbnQgPSBiaWdudW1Ub1N0cmluZztcbn1cbmVsc2Uge1xuICAgIGJpZ251bVRvQmlnSW50ID0gKChhKSA9PiBhLmJ5dGVMZW5ndGggPT09IDggPyBuZXcgYVsnQmlnSW50QXJyYXknXShhLmJ1ZmZlciwgYS5ieXRlT2Zmc2V0LCAxKVswXSA6IGRlY2ltYWxUb1N0cmluZyhhKSk7XG4gICAgYmlnbnVtVG9TdHJpbmcgPSAoKGEpID0+IGEuYnl0ZUxlbmd0aCA9PT0gOCA/IGAke25ldyBhWydCaWdJbnRBcnJheSddKGEuYnVmZmVyLCBhLmJ5dGVPZmZzZXQsIDEpWzBdfWAgOiBkZWNpbWFsVG9TdHJpbmcoYSkpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGRlY2ltYWxUb1N0cmluZyhhKSB7XG4gICAgbGV0IGRpZ2l0cyA9ICcnO1xuICAgIGNvbnN0IGJhc2U2NCA9IG5ldyBVaW50MzJBcnJheSgyKTtcbiAgICBsZXQgYmFzZTMyID0gbmV3IFVpbnQxNkFycmF5KGEuYnVmZmVyLCBhLmJ5dGVPZmZzZXQsIGEuYnl0ZUxlbmd0aCAvIDIpO1xuICAgIGNvbnN0IGNoZWNrcyA9IG5ldyBVaW50MzJBcnJheSgoYmFzZTMyID0gbmV3IFVpbnQxNkFycmF5KGJhc2UzMikucmV2ZXJzZSgpKS5idWZmZXIpO1xuICAgIGxldCBpID0gLTE7XG4gICAgY29uc3QgbiA9IGJhc2UzMi5sZW5ndGggLSAxO1xuICAgIGRvIHtcbiAgICAgICAgZm9yIChiYXNlNjRbMF0gPSBiYXNlMzJbaSA9IDBdOyBpIDwgbjspIHtcbiAgICAgICAgICAgIGJhc2UzMltpKytdID0gYmFzZTY0WzFdID0gYmFzZTY0WzBdIC8gMTA7XG4gICAgICAgICAgICBiYXNlNjRbMF0gPSAoKGJhc2U2NFswXSAtIGJhc2U2NFsxXSAqIDEwKSA8PCAxNikgKyBiYXNlMzJbaV07XG4gICAgICAgIH1cbiAgICAgICAgYmFzZTMyW2ldID0gYmFzZTY0WzFdID0gYmFzZTY0WzBdIC8gMTA7XG4gICAgICAgIGJhc2U2NFswXSA9IGJhc2U2NFswXSAtIGJhc2U2NFsxXSAqIDEwO1xuICAgICAgICBkaWdpdHMgPSBgJHtiYXNlNjRbMF19JHtkaWdpdHN9YDtcbiAgICB9IHdoaWxlIChjaGVja3NbMF0gfHwgY2hlY2tzWzFdIHx8IGNoZWNrc1syXSB8fCBjaGVja3NbM10pO1xuICAgIHJldHVybiBkaWdpdHMgIT09IG51bGwgJiYgZGlnaXRzICE9PSB2b2lkIDAgPyBkaWdpdHMgOiBgMGA7XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEJOIHtcbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgbmV3KG51bSwgaXNTaWduZWQpIHtcbiAgICAgICAgc3dpdGNoIChpc1NpZ25lZCkge1xuICAgICAgICAgICAgY2FzZSB0cnVlOiByZXR1cm4gbmV3IFNpZ25lZEJpZ051bShudW0pO1xuICAgICAgICAgICAgY2FzZSBmYWxzZTogcmV0dXJuIG5ldyBVbnNpZ25lZEJpZ051bShudW0pO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAobnVtLmNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICBjYXNlIEludDhBcnJheTpcbiAgICAgICAgICAgIGNhc2UgSW50MTZBcnJheTpcbiAgICAgICAgICAgIGNhc2UgSW50MzJBcnJheTpcbiAgICAgICAgICAgIGNhc2UgQmlnSW50NjRBcnJheTpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpZ25lZEJpZ051bShudW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChudW0uYnl0ZUxlbmd0aCA9PT0gMTYpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGVjaW1hbEJpZ051bShudW0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5zaWduZWRCaWdOdW0obnVtKTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIHNpZ25lZChudW0pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTaWduZWRCaWdOdW0obnVtKTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIHVuc2lnbmVkKG51bSkge1xuICAgICAgICByZXR1cm4gbmV3IFVuc2lnbmVkQmlnTnVtKG51bSk7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBkZWNpbWFsKG51bSkge1xuICAgICAgICByZXR1cm4gbmV3IERlY2ltYWxCaWdOdW0obnVtKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3IobnVtLCBpc1NpZ25lZCkge1xuICAgICAgICByZXR1cm4gQk4ubmV3KG51bSwgaXNTaWduZWQpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Ym4ubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBfX2FzeW5jRGVsZWdhdG9yLCBfX2FzeW5jR2VuZXJhdG9yLCBfX2FzeW5jVmFsdWVzLCBfX2F3YWl0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBlbmNvZGVVdGY4IH0gZnJvbSAnLi4vdXRpbC91dGY4Lm1qcyc7XG5pbXBvcnQgeyBpc1Byb21pc2UsIGlzSXRlcmFibGUsIGlzQXN5bmNJdGVyYWJsZSwgaXNJdGVyYXRvclJlc3VsdCwgaXNGbGF0YnVmZmVyc0J5dGVCdWZmZXIsIEJpZ0ludDY0QXJyYXksIEJpZ1VpbnQ2NEFycmF5IH0gZnJvbSAnLi9jb21wYXQubWpzJztcbi8qKiBAaWdub3JlICovXG5jb25zdCBTaGFyZWRBcnJheUJ1ZiA9ICh0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnID8gU2hhcmVkQXJyYXlCdWZmZXIgOiBBcnJheUJ1ZmZlcik7XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gY29sbGFwc2VDb250aWd1b3VzQnl0ZVJhbmdlcyhjaHVua3MpIHtcbiAgICBjb25zdCByZXN1bHQgPSBjaHVua3NbMF0gPyBbY2h1bmtzWzBdXSA6IFtdO1xuICAgIGxldCB4T2Zmc2V0LCB5T2Zmc2V0LCB4TGVuLCB5TGVuO1xuICAgIGZvciAobGV0IHgsIHksIGkgPSAwLCBqID0gMCwgbiA9IGNodW5rcy5sZW5ndGg7ICsraSA8IG47KSB7XG4gICAgICAgIHggPSByZXN1bHRbal07XG4gICAgICAgIHkgPSBjaHVua3NbaV07XG4gICAgICAgIC8vIGNvbnRpbnVlIGlmIHggYW5kIHkgZG9uJ3Qgc2hhcmUgdGhlIHNhbWUgdW5kZXJseWluZyBBcnJheUJ1ZmZlciwgb3IgaWYgeCBpc24ndCBiZWZvcmUgeVxuICAgICAgICBpZiAoIXggfHwgIXkgfHwgeC5idWZmZXIgIT09IHkuYnVmZmVyIHx8IHkuYnl0ZU9mZnNldCA8IHguYnl0ZU9mZnNldCkge1xuICAgICAgICAgICAgeSAmJiAocmVzdWx0Wysral0gPSB5KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgICh7IGJ5dGVPZmZzZXQ6IHhPZmZzZXQsIGJ5dGVMZW5ndGg6IHhMZW4gfSA9IHgpO1xuICAgICAgICAoeyBieXRlT2Zmc2V0OiB5T2Zmc2V0LCBieXRlTGVuZ3RoOiB5TGVuIH0gPSB5KTtcbiAgICAgICAgLy8gY29udGludWUgaWYgdGhlIGJ5dGUgcmFuZ2VzIG9mIHggYW5kIHkgYXJlbid0IGNvbnRpZ3VvdXNcbiAgICAgICAgaWYgKCh4T2Zmc2V0ICsgeExlbikgPCB5T2Zmc2V0IHx8ICh5T2Zmc2V0ICsgeUxlbikgPCB4T2Zmc2V0KSB7XG4gICAgICAgICAgICB5ICYmIChyZXN1bHRbKytqXSA9IHkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W2pdID0gbmV3IFVpbnQ4QXJyYXkoeC5idWZmZXIsIHhPZmZzZXQsIHlPZmZzZXQgLSB4T2Zmc2V0ICsgeUxlbik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbWNweSh0YXJnZXQsIHNvdXJjZSwgdGFyZ2V0Qnl0ZU9mZnNldCA9IDAsIHNvdXJjZUJ5dGVMZW5ndGggPSBzb3VyY2UuYnl0ZUxlbmd0aCkge1xuICAgIGNvbnN0IHRhcmdldEJ5dGVMZW5ndGggPSB0YXJnZXQuYnl0ZUxlbmd0aDtcbiAgICBjb25zdCBkc3QgPSBuZXcgVWludDhBcnJheSh0YXJnZXQuYnVmZmVyLCB0YXJnZXQuYnl0ZU9mZnNldCwgdGFyZ2V0Qnl0ZUxlbmd0aCk7XG4gICAgY29uc3Qgc3JjID0gbmV3IFVpbnQ4QXJyYXkoc291cmNlLmJ1ZmZlciwgc291cmNlLmJ5dGVPZmZzZXQsIE1hdGgubWluKHNvdXJjZUJ5dGVMZW5ndGgsIHRhcmdldEJ5dGVMZW5ndGgpKTtcbiAgICBkc3Quc2V0KHNyYywgdGFyZ2V0Qnl0ZU9mZnNldCk7XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgZnVuY3Rpb24gam9pblVpbnQ4QXJyYXlzKGNodW5rcywgc2l6ZSkge1xuICAgIC8vIGNvbGxhcHNlIGNodW5rcyB0aGF0IHNoYXJlIHRoZSBzYW1lIHVuZGVybHlpbmcgQXJyYXlCdWZmZXIgYW5kIHdob3NlIGJ5dGUgcmFuZ2VzIG92ZXJsYXAsXG4gICAgLy8gdG8gYXZvaWQgdW5uZWNlc3NhcmlseSBjb3B5aW5nIHRoZSBieXRlcyB0byBkbyB0aGlzIGJ1ZmZlciBqb2luLiBUaGlzIGlzIGEgY29tbW9uIGNhc2UgZHVyaW5nXG4gICAgLy8gc3RyZWFtaW5nLCB3aGVyZSB3ZSBtYXkgYmUgcmVhZGluZyBwYXJ0aWFsIGJ5dGUgcmFuZ2VzIG91dCBvZiB0aGUgc2FtZSB1bmRlcmx5aW5nIEFycmF5QnVmZmVyXG4gICAgY29uc3QgcmVzdWx0ID0gY29sbGFwc2VDb250aWd1b3VzQnl0ZVJhbmdlcyhjaHVua3MpO1xuICAgIGNvbnN0IGJ5dGVMZW5ndGggPSByZXN1bHQucmVkdWNlKCh4LCBiKSA9PiB4ICsgYi5ieXRlTGVuZ3RoLCAwKTtcbiAgICBsZXQgc291cmNlLCBzbGljZWQsIGJ1ZmZlcjtcbiAgICBsZXQgb2Zmc2V0ID0gMCwgaW5kZXggPSAtMTtcbiAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihzaXplIHx8IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgYnl0ZUxlbmd0aCk7XG4gICAgZm9yIChjb25zdCBuID0gcmVzdWx0Lmxlbmd0aDsgKytpbmRleCA8IG47KSB7XG4gICAgICAgIHNvdXJjZSA9IHJlc3VsdFtpbmRleF07XG4gICAgICAgIHNsaWNlZCA9IHNvdXJjZS5zdWJhcnJheSgwLCBNYXRoLm1pbihzb3VyY2UubGVuZ3RoLCBsZW5ndGggLSBvZmZzZXQpKTtcbiAgICAgICAgaWYgKGxlbmd0aCA8PSAob2Zmc2V0ICsgc2xpY2VkLmxlbmd0aCkpIHtcbiAgICAgICAgICAgIGlmIChzbGljZWQubGVuZ3RoIDwgc291cmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBzb3VyY2Uuc3ViYXJyYXkoc2xpY2VkLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzbGljZWQubGVuZ3RoID09PSBzb3VyY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlciA/IG1lbWNweShidWZmZXIsIHNsaWNlZCwgb2Zmc2V0KSA6IChidWZmZXIgPSBzbGljZWQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbWVtY3B5KGJ1ZmZlciB8fCAoYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKSksIHNsaWNlZCwgb2Zmc2V0KTtcbiAgICAgICAgb2Zmc2V0ICs9IHNsaWNlZC5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBbYnVmZmVyIHx8IG5ldyBVaW50OEFycmF5KDApLCByZXN1bHQuc2xpY2UoaW5kZXgpLCBieXRlTGVuZ3RoIC0gKGJ1ZmZlciA/IGJ1ZmZlci5ieXRlTGVuZ3RoIDogMCldO1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5QnVmZmVyVmlldyhBcnJheUJ1ZmZlclZpZXdDdG9yLCBpbnB1dCkge1xuICAgIGxldCB2YWx1ZSA9IGlzSXRlcmF0b3JSZXN1bHQoaW5wdXQpID8gaW5wdXQudmFsdWUgOiBpbnB1dDtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlclZpZXdDdG9yKSB7XG4gICAgICAgIGlmIChBcnJheUJ1ZmZlclZpZXdDdG9yID09PSBVaW50OEFycmF5KSB7XG4gICAgICAgICAgICAvLyBOb2RlJ3MgYEJ1ZmZlcmAgY2xhc3MgcGFzc2VzIHRoZSBgaW5zdGFuY2VvZiBVaW50OEFycmF5YCBjaGVjaywgYnV0IHdlIG5lZWRcbiAgICAgICAgICAgIC8vIGEgcmVhbCBVaW50OEFycmF5LCBzaW5jZSBCdWZmZXIjc2xpY2UgaXNuJ3QgdGhlIHNhbWUgYXMgVWludDhBcnJheSNzbGljZSA6L1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUJ1ZmZlclZpZXdDdG9yKHZhbHVlLmJ1ZmZlciwgdmFsdWUuYnl0ZU9mZnNldCwgdmFsdWUuYnl0ZUxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQXJyYXlCdWZmZXJWaWV3Q3RvcigwKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFsdWUgPSBlbmNvZGVVdGY4KHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBcnJheUJ1ZmZlclZpZXdDdG9yKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWYpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBcnJheUJ1ZmZlclZpZXdDdG9yKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGlzRmxhdGJ1ZmZlcnNCeXRlQnVmZmVyKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdG9BcnJheUJ1ZmZlclZpZXcoQXJyYXlCdWZmZXJWaWV3Q3RvciwgdmFsdWUuYnl0ZXMoKSk7XG4gICAgfVxuICAgIHJldHVybiAhQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSA/IEFycmF5QnVmZmVyVmlld0N0b3IuZnJvbSh2YWx1ZSkgOiAodmFsdWUuYnl0ZUxlbmd0aCA8PSAwID8gbmV3IEFycmF5QnVmZmVyVmlld0N0b3IoMClcbiAgICAgICAgOiBuZXcgQXJyYXlCdWZmZXJWaWV3Q3Rvcih2YWx1ZS5idWZmZXIsIHZhbHVlLmJ5dGVPZmZzZXQsIHZhbHVlLmJ5dGVMZW5ndGggLyBBcnJheUJ1ZmZlclZpZXdDdG9yLkJZVEVTX1BFUl9FTEVNRU5UKSk7XG59XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9JbnQ4QXJyYXkgPSAoaW5wdXQpID0+IHRvQXJyYXlCdWZmZXJWaWV3KEludDhBcnJheSwgaW5wdXQpO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IHRvSW50MTZBcnJheSA9IChpbnB1dCkgPT4gdG9BcnJheUJ1ZmZlclZpZXcoSW50MTZBcnJheSwgaW5wdXQpO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IHRvSW50MzJBcnJheSA9IChpbnB1dCkgPT4gdG9BcnJheUJ1ZmZlclZpZXcoSW50MzJBcnJheSwgaW5wdXQpO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IHRvQmlnSW50NjRBcnJheSA9IChpbnB1dCkgPT4gdG9BcnJheUJ1ZmZlclZpZXcoQmlnSW50NjRBcnJheSwgaW5wdXQpO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IHRvVWludDhBcnJheSA9IChpbnB1dCkgPT4gdG9BcnJheUJ1ZmZlclZpZXcoVWludDhBcnJheSwgaW5wdXQpO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IHRvVWludDE2QXJyYXkgPSAoaW5wdXQpID0+IHRvQXJyYXlCdWZmZXJWaWV3KFVpbnQxNkFycmF5LCBpbnB1dCk7XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9VaW50MzJBcnJheSA9IChpbnB1dCkgPT4gdG9BcnJheUJ1ZmZlclZpZXcoVWludDMyQXJyYXksIGlucHV0KTtcbi8qKiBAaWdub3JlICovIGV4cG9ydCBjb25zdCB0b0JpZ1VpbnQ2NEFycmF5ID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlldyhCaWdVaW50NjRBcnJheSwgaW5wdXQpO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IHRvRmxvYXQzMkFycmF5ID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlldyhGbG9hdDMyQXJyYXksIGlucHV0KTtcbi8qKiBAaWdub3JlICovIGV4cG9ydCBjb25zdCB0b0Zsb2F0NjRBcnJheSA9IChpbnB1dCkgPT4gdG9BcnJheUJ1ZmZlclZpZXcoRmxvYXQ2NEFycmF5LCBpbnB1dCk7XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9VaW50OENsYW1wZWRBcnJheSA9IChpbnB1dCkgPT4gdG9BcnJheUJ1ZmZlclZpZXcoVWludDhDbGFtcGVkQXJyYXksIGlucHV0KTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBwdW1wID0gKGl0ZXJhdG9yKSA9PiB7IGl0ZXJhdG9yLm5leHQoKTsgcmV0dXJuIGl0ZXJhdG9yOyB9O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiogdG9BcnJheUJ1ZmZlclZpZXdJdGVyYXRvcihBcnJheUN0b3IsIHNvdXJjZSkge1xuICAgIGNvbnN0IHdyYXAgPSBmdW5jdGlvbiogKHgpIHsgeWllbGQgeDsgfTtcbiAgICBjb25zdCBidWZmZXJzID0gKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnKSA/IHdyYXAoc291cmNlKVxuICAgICAgICA6IChBcnJheUJ1ZmZlci5pc1ZpZXcoc291cmNlKSkgPyB3cmFwKHNvdXJjZSlcbiAgICAgICAgICAgIDogKHNvdXJjZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSA/IHdyYXAoc291cmNlKVxuICAgICAgICAgICAgICAgIDogKHNvdXJjZSBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmKSA/IHdyYXAoc291cmNlKVxuICAgICAgICAgICAgICAgICAgICA6ICFpc0l0ZXJhYmxlKHNvdXJjZSkgPyB3cmFwKHNvdXJjZSkgOiBzb3VyY2U7XG4gICAgeWllbGQqIHB1bXAoKGZ1bmN0aW9uKiAoaXQpIHtcbiAgICAgICAgbGV0IHIgPSBudWxsO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICByID0gaXQubmV4dCh5aWVsZCB0b0FycmF5QnVmZmVyVmlldyhBcnJheUN0b3IsIHIpKTtcbiAgICAgICAgfSB3aGlsZSAoIXIuZG9uZSk7XG4gICAgfSkoYnVmZmVyc1tTeW1ib2wuaXRlcmF0b3JdKCkpKTtcbiAgICByZXR1cm4gbmV3IEFycmF5Q3RvcigpO1xufVxuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IHRvSW50OEFycmF5SXRlcmF0b3IgPSAoaW5wdXQpID0+IHRvQXJyYXlCdWZmZXJWaWV3SXRlcmF0b3IoSW50OEFycmF5LCBpbnB1dCk7XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9JbnQxNkFycmF5SXRlcmF0b3IgPSAoaW5wdXQpID0+IHRvQXJyYXlCdWZmZXJWaWV3SXRlcmF0b3IoSW50MTZBcnJheSwgaW5wdXQpO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IHRvSW50MzJBcnJheUl0ZXJhdG9yID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlld0l0ZXJhdG9yKEludDMyQXJyYXksIGlucHV0KTtcbi8qKiBAaWdub3JlICovIGV4cG9ydCBjb25zdCB0b1VpbnQ4QXJyYXlJdGVyYXRvciA9IChpbnB1dCkgPT4gdG9BcnJheUJ1ZmZlclZpZXdJdGVyYXRvcihVaW50OEFycmF5LCBpbnB1dCk7XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9VaW50MTZBcnJheUl0ZXJhdG9yID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlld0l0ZXJhdG9yKFVpbnQxNkFycmF5LCBpbnB1dCk7XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9VaW50MzJBcnJheUl0ZXJhdG9yID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlld0l0ZXJhdG9yKFVpbnQzMkFycmF5LCBpbnB1dCk7XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9GbG9hdDMyQXJyYXlJdGVyYXRvciA9IChpbnB1dCkgPT4gdG9BcnJheUJ1ZmZlclZpZXdJdGVyYXRvcihGbG9hdDMyQXJyYXksIGlucHV0KTtcbi8qKiBAaWdub3JlICovIGV4cG9ydCBjb25zdCB0b0Zsb2F0NjRBcnJheUl0ZXJhdG9yID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlld0l0ZXJhdG9yKEZsb2F0NjRBcnJheSwgaW5wdXQpO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IHRvVWludDhDbGFtcGVkQXJyYXlJdGVyYXRvciA9IChpbnB1dCkgPT4gdG9BcnJheUJ1ZmZlclZpZXdJdGVyYXRvcihVaW50OENsYW1wZWRBcnJheSwgaW5wdXQpO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5QnVmZmVyVmlld0FzeW5jSXRlcmF0b3IoQXJyYXlDdG9yLCBzb3VyY2UpIHtcbiAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiB0b0FycmF5QnVmZmVyVmlld0FzeW5jSXRlcmF0b3JfMSgpIHtcbiAgICAgICAgLy8gaWYgYSBQcm9taXNlLCB1bndyYXAgdGhlIFByb21pc2UgYW5kIGl0ZXJhdGUgdGhlIHJlc29sdmVkIHZhbHVlXG4gICAgICAgIGlmIChpc1Byb21pc2Uoc291cmNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIF9fYXdhaXQoeWllbGQgX19hd2FpdCh5aWVsZCogX19hc3luY0RlbGVnYXRvcihfX2FzeW5jVmFsdWVzKHRvQXJyYXlCdWZmZXJWaWV3QXN5bmNJdGVyYXRvcihBcnJheUN0b3IsIHlpZWxkIF9fYXdhaXQoc291cmNlKSkpKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdyYXAgPSBmdW5jdGlvbiAoeCkgeyByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiAoKSB7IHlpZWxkIHlpZWxkIF9fYXdhaXQoeWllbGQgX19hd2FpdCh4KSk7IH0pOyB9O1xuICAgICAgICBjb25zdCBlbWl0ID0gZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIF9fYXdhaXQoeWllbGQqIF9fYXN5bmNEZWxlZ2F0b3IoX19hc3luY1ZhbHVlcyhwdW1wKChmdW5jdGlvbiogKGl0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgciA9IGl0Lm5leHQoeWllbGQgciA9PT0gbnVsbCB8fCByID09PSB2b2lkIDAgPyB2b2lkIDAgOiByLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoIXIuZG9uZSk7XG4gICAgICAgICAgICAgICAgfSkoc291cmNlW1N5bWJvbC5pdGVyYXRvcl0oKSkpKSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGJ1ZmZlcnMgPSAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycpID8gd3JhcChzb3VyY2UpIC8vIGlmIHN0cmluZywgd3JhcCBpbiBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3JcbiAgICAgICAgICAgIDogKEFycmF5QnVmZmVyLmlzVmlldyhzb3VyY2UpKSA/IHdyYXAoc291cmNlKSAvLyBpZiBUeXBlZEFycmF5LCB3cmFwIGluIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvclxuICAgICAgICAgICAgICAgIDogKHNvdXJjZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSA/IHdyYXAoc291cmNlKSAvLyBpZiBBcnJheUJ1ZmZlciwgd3JhcCBpbiBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3JcbiAgICAgICAgICAgICAgICAgICAgOiAoc291cmNlIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWYpID8gd3JhcChzb3VyY2UpIC8vIGlmIFNoYXJlZEFycmF5QnVmZmVyLCB3cmFwIGluIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBpc0l0ZXJhYmxlKHNvdXJjZSkgPyBlbWl0KHNvdXJjZSkgLy8gSWYgSXRlcmFibGUsIHdyYXAgaW4gYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIGFuZCBjb21wb3NlIHRoZSBgbmV4dGAgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAhaXNBc3luY0l0ZXJhYmxlKHNvdXJjZSkgPyB3cmFwKHNvdXJjZSkgLy8gSWYgbm90IGFuIEFzeW5jSXRlcmFibGUsIHRyZWF0IGFzIGEgc2VudGluZWwgYW5kIHdyYXAgaW4gYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc291cmNlOyAvLyBvdGhlcndpc2UgaWYgQXN5bmNJdGVyYWJsZSwgdXNlIGl0XG4gICAgICAgIHlpZWxkIF9fYXdhaXQoLy8gb3RoZXJ3aXNlIGlmIEFzeW5jSXRlcmFibGUsIHVzZSBpdFxuICAgICAgICB5aWVsZCogX19hc3luY0RlbGVnYXRvcihfX2FzeW5jVmFsdWVzKHB1bXAoKGZ1bmN0aW9uIChpdCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGxldCByID0gbnVsbDtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIHIgPSB5aWVsZCBfX2F3YWl0KGl0Lm5leHQoeWllbGQgeWllbGQgX19hd2FpdCh0b0FycmF5QnVmZmVyVmlldyhBcnJheUN0b3IsIHIpKSkpO1xuICAgICAgICAgICAgICAgIH0gd2hpbGUgKCFyLmRvbmUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pKGJ1ZmZlcnNbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkpKSkpKTtcbiAgICAgICAgcmV0dXJuIHlpZWxkIF9fYXdhaXQobmV3IEFycmF5Q3RvcigpKTtcbiAgICB9KTtcbn1cbi8qKiBAaWdub3JlICovIGV4cG9ydCBjb25zdCB0b0ludDhBcnJheUFzeW5jSXRlcmF0b3IgPSAoaW5wdXQpID0+IHRvQXJyYXlCdWZmZXJWaWV3QXN5bmNJdGVyYXRvcihJbnQ4QXJyYXksIGlucHV0KTtcbi8qKiBAaWdub3JlICovIGV4cG9ydCBjb25zdCB0b0ludDE2QXJyYXlBc3luY0l0ZXJhdG9yID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlld0FzeW5jSXRlcmF0b3IoSW50MTZBcnJheSwgaW5wdXQpO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IHRvSW50MzJBcnJheUFzeW5jSXRlcmF0b3IgPSAoaW5wdXQpID0+IHRvQXJyYXlCdWZmZXJWaWV3QXN5bmNJdGVyYXRvcihJbnQzMkFycmF5LCBpbnB1dCk7XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9VaW50OEFycmF5QXN5bmNJdGVyYXRvciA9IChpbnB1dCkgPT4gdG9BcnJheUJ1ZmZlclZpZXdBc3luY0l0ZXJhdG9yKFVpbnQ4QXJyYXksIGlucHV0KTtcbi8qKiBAaWdub3JlICovIGV4cG9ydCBjb25zdCB0b1VpbnQxNkFycmF5QXN5bmNJdGVyYXRvciA9IChpbnB1dCkgPT4gdG9BcnJheUJ1ZmZlclZpZXdBc3luY0l0ZXJhdG9yKFVpbnQxNkFycmF5LCBpbnB1dCk7XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9VaW50MzJBcnJheUFzeW5jSXRlcmF0b3IgPSAoaW5wdXQpID0+IHRvQXJyYXlCdWZmZXJWaWV3QXN5bmNJdGVyYXRvcihVaW50MzJBcnJheSwgaW5wdXQpO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IHRvRmxvYXQzMkFycmF5QXN5bmNJdGVyYXRvciA9IChpbnB1dCkgPT4gdG9BcnJheUJ1ZmZlclZpZXdBc3luY0l0ZXJhdG9yKEZsb2F0MzJBcnJheSwgaW5wdXQpO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IHRvRmxvYXQ2NEFycmF5QXN5bmNJdGVyYXRvciA9IChpbnB1dCkgPT4gdG9BcnJheUJ1ZmZlclZpZXdBc3luY0l0ZXJhdG9yKEZsb2F0NjRBcnJheSwgaW5wdXQpO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IHRvVWludDhDbGFtcGVkQXJyYXlBc3luY0l0ZXJhdG9yID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlld0FzeW5jSXRlcmF0b3IoVWludDhDbGFtcGVkQXJyYXksIGlucHV0KTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgZnVuY3Rpb24gcmViYXNlVmFsdWVPZmZzZXRzKG9mZnNldCwgbGVuZ3RoLCB2YWx1ZU9mZnNldHMpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGEgbm9uLXplcm8gb2Zmc2V0LCBjcmVhdGUgYSBuZXcgb2Zmc2V0cyBhcnJheSB3aXRoIHRoZSB2YWx1ZXNcbiAgICAvLyBzaGlmdGVkIGJ5IHRoZSBzdGFydCBvZmZzZXQsIHN1Y2ggdGhhdCB0aGUgbmV3IHN0YXJ0IG9mZnNldCBpcyAwXG4gICAgaWYgKG9mZnNldCAhPT0gMCkge1xuICAgICAgICB2YWx1ZU9mZnNldHMgPSB2YWx1ZU9mZnNldHMuc2xpY2UoMCwgbGVuZ3RoICsgMSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAtMTsgKytpIDw9IGxlbmd0aDspIHtcbiAgICAgICAgICAgIHZhbHVlT2Zmc2V0c1tpXSArPSBvZmZzZXQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlT2Zmc2V0cztcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZUFycmF5TGlrZShhLCBiKSB7XG4gICAgbGV0IGkgPSAwO1xuICAgIGNvbnN0IG4gPSBhLmxlbmd0aDtcbiAgICBpZiAobiAhPT0gYi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobiA+IDApIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKCsraSA8IG4pO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnVmZmVyLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBDaHVua2VkSXRlcmF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKG51bUNodW5rcyA9IDAsIGdldENodW5rSXRlcmF0b3IpIHtcbiAgICAgICAgdGhpcy5udW1DaHVua3MgPSBudW1DaHVua3M7XG4gICAgICAgIHRoaXMuZ2V0Q2h1bmtJdGVyYXRvciA9IGdldENodW5rSXRlcmF0b3I7XG4gICAgICAgIHRoaXMuY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIHRoaXMuY2h1bmtJdGVyYXRvciA9IHRoaXMuZ2V0Q2h1bmtJdGVyYXRvcigwKTtcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuY2h1bmtJbmRleCA8IHRoaXMubnVtQ2h1bmtzKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5jaHVua0l0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIGlmICghbmV4dC5kb25lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKyt0aGlzLmNodW5rSW5kZXggPCB0aGlzLm51bUNodW5rcykge1xuICAgICAgICAgICAgICAgIHRoaXMuY2h1bmtJdGVyYXRvciA9IHRoaXMuZ2V0Q2h1bmtJdGVyYXRvcih0aGlzLmNodW5rSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBudWxsIH07XG4gICAgfVxuICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDaHVua051bGxDb3VudHMoY2h1bmtzKSB7XG4gICAgcmV0dXJuIGNodW5rcy5yZWR1Y2UoKG51bGxDb3VudCwgY2h1bmspID0+IG51bGxDb3VudCArIGNodW5rLm51bGxDb3VudCwgMCk7XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDaHVua09mZnNldHMoY2h1bmtzKSB7XG4gICAgcmV0dXJuIGNodW5rcy5yZWR1Y2UoKG9mZnNldHMsIGNodW5rLCBpbmRleCkgPT4ge1xuICAgICAgICBvZmZzZXRzW2luZGV4ICsgMV0gPSBvZmZzZXRzW2luZGV4XSArIGNodW5rLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIG9mZnNldHM7XG4gICAgfSwgbmV3IFVpbnQzMkFycmF5KGNodW5rcy5sZW5ndGggKyAxKSk7XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlQ2h1bmtzKGNodW5rcywgb2Zmc2V0cywgYmVnaW4sIGVuZCkge1xuICAgIGNvbnN0IHNsaWNlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAtMSwgbiA9IGNodW5rcy5sZW5ndGg7ICsraSA8IG47KSB7XG4gICAgICAgIGNvbnN0IGNodW5rID0gY2h1bmtzW2ldO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBvZmZzZXRzW2ldO1xuICAgICAgICBjb25zdCB7IGxlbmd0aCB9ID0gY2h1bms7XG4gICAgICAgIC8vIFN0b3AgaWYgdGhlIGNoaWxkIGlzIHRvIHRoZSByaWdodCBvZiB0aGUgc2xpY2UgYm91bmRhcnlcbiAgICAgICAgaWYgKG9mZnNldCA+PSBlbmQpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIEV4Y2x1ZGUgY2hpbGRyZW4gdG8gdGhlIGxlZnQgb2Ygb2YgdGhlIHNsaWNlIGJvdW5kYXJ5XG4gICAgICAgIGlmIChiZWdpbiA+PSBvZmZzZXQgKyBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEluY2x1ZGUgZW50aXJlIGNoaWxkIGlmIGJldHdlZW4gYm90aCBsZWZ0IGFuZCByaWdodCBib3VuZGFyaWVzXG4gICAgICAgIGlmIChvZmZzZXQgPj0gYmVnaW4gJiYgKG9mZnNldCArIGxlbmd0aCkgPD0gZW5kKSB7XG4gICAgICAgICAgICBzbGljZXMucHVzaChjaHVuayk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbmNsdWRlIHRoZSBjaGlsZCBzbGljZSB0aGF0IG92ZXJsYXBzIG9uZSBvZiB0aGUgc2xpY2UgYm91bmRhcmllc1xuICAgICAgICBjb25zdCBmcm9tID0gTWF0aC5tYXgoMCwgYmVnaW4gLSBvZmZzZXQpO1xuICAgICAgICBjb25zdCB0byA9IE1hdGgubWluKGVuZCAtIG9mZnNldCwgbGVuZ3RoKTtcbiAgICAgICAgc2xpY2VzLnB1c2goY2h1bmsuc2xpY2UoZnJvbSwgdG8gLSBmcm9tKSk7XG4gICAgfVxuICAgIGlmIChzbGljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHNsaWNlcy5wdXNoKGNodW5rc1swXS5zbGljZSgwLCAwKSk7XG4gICAgfVxuICAgIHJldHVybiBzbGljZXM7XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeVNlYXJjaChjaHVua3MsIG9mZnNldHMsIGlkeCwgZm4pIHtcbiAgICBsZXQgbGhzID0gMCwgbWlkID0gMCwgcmhzID0gb2Zmc2V0cy5sZW5ndGggLSAxO1xuICAgIGRvIHtcbiAgICAgICAgaWYgKGxocyA+PSByaHMgLSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gKGlkeCA8IG9mZnNldHNbcmhzXSkgPyBmbihjaHVua3MsIGxocywgaWR4IC0gb2Zmc2V0c1tsaHNdKSA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbWlkID0gbGhzICsgKE1hdGgudHJ1bmMoKHJocyAtIGxocykgKiAuNSkpO1xuICAgICAgICBpZHggPCBvZmZzZXRzW21pZF0gPyAocmhzID0gbWlkKSA6IChsaHMgPSBtaWQpO1xuICAgIH0gd2hpbGUgKGxocyA8IHJocyk7XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2h1bmtlZFZhbGlkKGRhdGEsIGluZGV4KSB7XG4gICAgcmV0dXJuIGRhdGEuZ2V0VmFsaWQoaW5kZXgpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwQ2h1bmtlZENhbGwxKGZuKSB7XG4gICAgZnVuY3Rpb24gY2h1bmtlZEZuKGNodW5rcywgaSwgaikgeyByZXR1cm4gZm4oY2h1bmtzW2ldLCBqKTsgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICAgICAgcmV0dXJuIGJpbmFyeVNlYXJjaChkYXRhLCB0aGlzLl9vZmZzZXRzLCBpbmRleCwgY2h1bmtlZEZuKTtcbiAgICB9O1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwQ2h1bmtlZENhbGwyKGZuKSB7XG4gICAgbGV0IF8yO1xuICAgIGZ1bmN0aW9uIGNodW5rZWRGbihjaHVua3MsIGksIGopIHsgcmV0dXJuIGZuKGNodW5rc1tpXSwgaiwgXzIpOyB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICAgICAgXzIgPSB2YWx1ZTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYmluYXJ5U2VhcmNoKGRhdGEsIHRoaXMuX29mZnNldHMsIGluZGV4LCBjaHVua2VkRm4pO1xuICAgICAgICBfMiA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwQ2h1bmtlZEluZGV4T2YoaW5kZXhPZikge1xuICAgIGxldCBfMTtcbiAgICBmdW5jdGlvbiBjaHVua2VkSW5kZXhPZihkYXRhLCBjaHVua0luZGV4LCBmcm9tSW5kZXgpIHtcbiAgICAgICAgbGV0IGJlZ2luID0gZnJvbUluZGV4LCBpbmRleCA9IDAsIHRvdGFsID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IGNodW5rSW5kZXggLSAxLCBuID0gZGF0YS5sZW5ndGg7ICsraSA8IG47KSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IGRhdGFbaV07XG4gICAgICAgICAgICBpZiAofihpbmRleCA9IGluZGV4T2YoY2h1bmssIF8xLCBiZWdpbikpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvdGFsICsgaW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiZWdpbiA9IDA7XG4gICAgICAgICAgICB0b3RhbCArPSBjaHVuay5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKGVsZW1lbnQsIG9mZnNldCkge1xuICAgICAgICBfMSA9IGVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHR5cGVvZiBvZmZzZXQgIT09ICdudW1iZXInXG4gICAgICAgICAgICA/IGNodW5rZWRJbmRleE9mKGRhdGEsIDAsIDApXG4gICAgICAgICAgICA6IGJpbmFyeVNlYXJjaChkYXRhLCB0aGlzLl9vZmZzZXRzLCBvZmZzZXQsIGNodW5rZWRJbmRleE9mKTtcbiAgICAgICAgXzEgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2h1bmsubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG4vKiogQGlnbm9yZSAqL1xuY29uc3QgW0JpZ0ludEN0b3IsIEJpZ0ludEF2YWlsYWJsZV0gPSAoKCkgPT4ge1xuICAgIGNvbnN0IEJpZ0ludFVuYXZhaWxhYmxlRXJyb3IgPSAoKSA9PiB7IHRocm93IG5ldyBFcnJvcignQmlnSW50IGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudCcpOyB9O1xuICAgIGZ1bmN0aW9uIEJpZ0ludFVuYXZhaWxhYmxlKCkgeyB0aHJvdyBCaWdJbnRVbmF2YWlsYWJsZUVycm9yKCk7IH1cbiAgICBCaWdJbnRVbmF2YWlsYWJsZS5hc0ludE4gPSAoKSA9PiB7IHRocm93IEJpZ0ludFVuYXZhaWxhYmxlRXJyb3IoKTsgfTtcbiAgICBCaWdJbnRVbmF2YWlsYWJsZS5hc1VpbnROID0gKCkgPT4geyB0aHJvdyBCaWdJbnRVbmF2YWlsYWJsZUVycm9yKCk7IH07XG4gICAgcmV0dXJuIHR5cGVvZiBCaWdJbnQgIT09ICd1bmRlZmluZWQnID8gW0JpZ0ludCwgdHJ1ZV0gOiBbQmlnSW50VW5hdmFpbGFibGUsIGZhbHNlXTtcbn0pKCk7XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgW0JpZ0ludDY0QXJyYXlDdG9yLCBCaWdJbnQ2NEFycmF5QXZhaWxhYmxlXSA9ICgoKSA9PiB7XG4gICAgY29uc3QgQmlnSW50NjRBcnJheVVuYXZhaWxhYmxlRXJyb3IgPSAoKSA9PiB7IHRocm93IG5ldyBFcnJvcignQmlnSW50NjRBcnJheSBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQnKTsgfTtcbiAgICBjbGFzcyBCaWdJbnQ2NEFycmF5VW5hdmFpbGFibGUge1xuICAgICAgICBzdGF0aWMgZ2V0IEJZVEVTX1BFUl9FTEVNRU5UKCkgeyByZXR1cm4gODsgfVxuICAgICAgICBzdGF0aWMgb2YoKSB7IHRocm93IEJpZ0ludDY0QXJyYXlVbmF2YWlsYWJsZUVycm9yKCk7IH1cbiAgICAgICAgc3RhdGljIGZyb20oKSB7IHRocm93IEJpZ0ludDY0QXJyYXlVbmF2YWlsYWJsZUVycm9yKCk7IH1cbiAgICAgICAgY29uc3RydWN0b3IoKSB7IHRocm93IEJpZ0ludDY0QXJyYXlVbmF2YWlsYWJsZUVycm9yKCk7IH1cbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBCaWdJbnQ2NEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFtCaWdJbnQ2NEFycmF5LCB0cnVlXSA6IFtCaWdJbnQ2NEFycmF5VW5hdmFpbGFibGUsIGZhbHNlXTtcbn0pKCk7XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgW0JpZ1VpbnQ2NEFycmF5Q3RvciwgQmlnVWludDY0QXJyYXlBdmFpbGFibGVdID0gKCgpID0+IHtcbiAgICBjb25zdCBCaWdVaW50NjRBcnJheVVuYXZhaWxhYmxlRXJyb3IgPSAoKSA9PiB7IHRocm93IG5ldyBFcnJvcignQmlnVWludDY0QXJyYXkgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50Jyk7IH07XG4gICAgY2xhc3MgQmlnVWludDY0QXJyYXlVbmF2YWlsYWJsZSB7XG4gICAgICAgIHN0YXRpYyBnZXQgQllURVNfUEVSX0VMRU1FTlQoKSB7IHJldHVybiA4OyB9XG4gICAgICAgIHN0YXRpYyBvZigpIHsgdGhyb3cgQmlnVWludDY0QXJyYXlVbmF2YWlsYWJsZUVycm9yKCk7IH1cbiAgICAgICAgc3RhdGljIGZyb20oKSB7IHRocm93IEJpZ1VpbnQ2NEFycmF5VW5hdmFpbGFibGVFcnJvcigpOyB9XG4gICAgICAgIGNvbnN0cnVjdG9yKCkgeyB0aHJvdyBCaWdVaW50NjRBcnJheVVuYXZhaWxhYmxlRXJyb3IoKTsgfVxuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIEJpZ1VpbnQ2NEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFtCaWdVaW50NjRBcnJheSwgdHJ1ZV0gOiBbQmlnVWludDY0QXJyYXlVbmF2YWlsYWJsZSwgZmFsc2VdO1xufSkoKTtcbmV4cG9ydCB7IEJpZ0ludEN0b3IgYXMgQmlnSW50LCBCaWdJbnRBdmFpbGFibGUgfTtcbmV4cG9ydCB7IEJpZ0ludDY0QXJyYXlDdG9yIGFzIEJpZ0ludDY0QXJyYXksIEJpZ0ludDY0QXJyYXlBdmFpbGFibGUgfTtcbmV4cG9ydCB7IEJpZ1VpbnQ2NEFycmF5Q3RvciBhcyBCaWdVaW50NjRBcnJheSwgQmlnVWludDY0QXJyYXlBdmFpbGFibGUgfTtcbi8qKiBAaWdub3JlICovIGNvbnN0IGlzTnVtYmVyID0gKHgpID0+IHR5cGVvZiB4ID09PSAnbnVtYmVyJztcbi8qKiBAaWdub3JlICovIGNvbnN0IGlzQm9vbGVhbiA9ICh4KSA9PiB0eXBlb2YgeCA9PT0gJ2Jvb2xlYW4nO1xuLyoqIEBpZ25vcmUgKi8gY29uc3QgaXNGdW5jdGlvbiA9ICh4KSA9PiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbi8qKiBAaWdub3JlICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuZXhwb3J0IGNvbnN0IGlzT2JqZWN0ID0gKHgpID0+IHggIT0gbnVsbCAmJiBPYmplY3QoeCkgPT09IHg7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IGlzUHJvbWlzZSA9ICh4KSA9PiB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHgpICYmIGlzRnVuY3Rpb24oeC50aGVuKTtcbn07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IGlzT2JzZXJ2YWJsZSA9ICh4KSA9PiB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHgpICYmIGlzRnVuY3Rpb24oeC5zdWJzY3JpYmUpO1xufTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgaXNJdGVyYWJsZSA9ICh4KSA9PiB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHgpICYmIGlzRnVuY3Rpb24oeFtTeW1ib2wuaXRlcmF0b3JdKTtcbn07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IGlzQXN5bmNJdGVyYWJsZSA9ICh4KSA9PiB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHgpICYmIGlzRnVuY3Rpb24oeFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0pO1xufTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgaXNBcnJvd0pTT04gPSAoeCkgPT4ge1xuICAgIHJldHVybiBpc09iamVjdCh4KSAmJiBpc09iamVjdCh4WydzY2hlbWEnXSk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBpc0FycmF5TGlrZSA9ICh4KSA9PiB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHgpICYmIGlzTnVtYmVyKHhbJ2xlbmd0aCddKTtcbn07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IGlzSXRlcmF0b3JSZXN1bHQgPSAoeCkgPT4ge1xuICAgIHJldHVybiBpc09iamVjdCh4KSAmJiAoJ2RvbmUnIGluIHgpICYmICgndmFsdWUnIGluIHgpO1xufTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgaXNVbmRlcmx5aW5nU2luayA9ICh4KSA9PiB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHgpICYmXG4gICAgICAgIGlzRnVuY3Rpb24oeFsnYWJvcnQnXSkgJiZcbiAgICAgICAgaXNGdW5jdGlvbih4WydjbG9zZSddKSAmJlxuICAgICAgICBpc0Z1bmN0aW9uKHhbJ3N0YXJ0J10pICYmXG4gICAgICAgIGlzRnVuY3Rpb24oeFsnd3JpdGUnXSk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBpc0ZpbGVIYW5kbGUgPSAoeCkgPT4ge1xuICAgIHJldHVybiBpc09iamVjdCh4KSAmJiBpc0Z1bmN0aW9uKHhbJ3N0YXQnXSkgJiYgaXNOdW1iZXIoeFsnZmQnXSk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBpc0ZTUmVhZFN0cmVhbSA9ICh4KSA9PiB7XG4gICAgcmV0dXJuIGlzUmVhZGFibGVOb2RlU3RyZWFtKHgpICYmIGlzTnVtYmVyKHhbJ2J5dGVzUmVhZCddKTtcbn07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IGlzRmV0Y2hSZXNwb25zZSA9ICh4KSA9PiB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHgpICYmIGlzUmVhZGFibGVET01TdHJlYW0oeFsnYm9keSddKTtcbn07XG5jb25zdCBpc1JlYWRhYmxlSW50ZXJvcCA9ICh4KSA9PiAoJ19nZXRET01TdHJlYW0nIGluIHggJiYgJ19nZXROb2RlU3RyZWFtJyBpbiB4KTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgaXNXcml0YWJsZURPTVN0cmVhbSA9ICh4KSA9PiB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHgpICYmXG4gICAgICAgIGlzRnVuY3Rpb24oeFsnYWJvcnQnXSkgJiZcbiAgICAgICAgaXNGdW5jdGlvbih4WydnZXRXcml0ZXInXSkgJiZcbiAgICAgICAgIWlzUmVhZGFibGVJbnRlcm9wKHgpO1xufTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgaXNSZWFkYWJsZURPTVN0cmVhbSA9ICh4KSA9PiB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHgpICYmXG4gICAgICAgIGlzRnVuY3Rpb24oeFsnY2FuY2VsJ10pICYmXG4gICAgICAgIGlzRnVuY3Rpb24oeFsnZ2V0UmVhZGVyJ10pICYmXG4gICAgICAgICFpc1JlYWRhYmxlSW50ZXJvcCh4KTtcbn07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IGlzV3JpdGFibGVOb2RlU3RyZWFtID0gKHgpID0+IHtcbiAgICByZXR1cm4gaXNPYmplY3QoeCkgJiZcbiAgICAgICAgaXNGdW5jdGlvbih4WydlbmQnXSkgJiZcbiAgICAgICAgaXNGdW5jdGlvbih4Wyd3cml0ZSddKSAmJlxuICAgICAgICBpc0Jvb2xlYW4oeFsnd3JpdGFibGUnXSkgJiZcbiAgICAgICAgIWlzUmVhZGFibGVJbnRlcm9wKHgpO1xufTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgaXNSZWFkYWJsZU5vZGVTdHJlYW0gPSAoeCkgPT4ge1xuICAgIHJldHVybiBpc09iamVjdCh4KSAmJlxuICAgICAgICBpc0Z1bmN0aW9uKHhbJ3JlYWQnXSkgJiZcbiAgICAgICAgaXNGdW5jdGlvbih4WydwaXBlJ10pICYmXG4gICAgICAgIGlzQm9vbGVhbih4WydyZWFkYWJsZSddKSAmJlxuICAgICAgICAhaXNSZWFkYWJsZUludGVyb3AoeCk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBpc0ZsYXRidWZmZXJzQnl0ZUJ1ZmZlciA9ICh4KSA9PiB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHgpICYmXG4gICAgICAgIGlzRnVuY3Rpb24oeFsnY2xlYXInXSkgJiZcbiAgICAgICAgaXNGdW5jdGlvbih4WydieXRlcyddKSAmJlxuICAgICAgICBpc0Z1bmN0aW9uKHhbJ3Bvc2l0aW9uJ10pICYmXG4gICAgICAgIGlzRnVuY3Rpb24oeFsnc2V0UG9zaXRpb24nXSkgJiZcbiAgICAgICAgaXNGdW5jdGlvbih4WydjYXBhY2l0eSddKSAmJlxuICAgICAgICBpc0Z1bmN0aW9uKHhbJ2dldEJ1ZmZlcklkZW50aWZpZXInXSkgJiZcbiAgICAgICAgaXNGdW5jdGlvbih4WydjcmVhdGVMb25nJ10pO1xufTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tcGF0Lm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGNhcnJ5Qml0MTYgPSAxIDw8IDE2O1xuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGludEFzSGV4KHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgICB2YWx1ZSA9IDB4RkZGRkZGRkYgKyB2YWx1ZSArIDE7XG4gICAgfVxuICAgIHJldHVybiBgMHgke3ZhbHVlLnRvU3RyaW5nKDE2KX1gO1xufVxuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGtJbnQzMkRlY2ltYWxEaWdpdHMgPSA4O1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGtQb3dlcnNPZlRlbiA9IFtcbiAgICAxLFxuICAgIDEwLFxuICAgIDEwMCxcbiAgICAxMDAwLFxuICAgIDEwMDAwLFxuICAgIDEwMDAwMCxcbiAgICAxMDAwMDAwLFxuICAgIDEwMDAwMDAwLFxuICAgIDEwMDAwMDAwMFxuXTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgQmFzZUludDY0IHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgfVxuICAgIGhpZ2goKSB7IHJldHVybiB0aGlzLmJ1ZmZlclsxXTsgfVxuICAgIGxvdygpIHsgcmV0dXJuIHRoaXMuYnVmZmVyWzBdOyB9XG4gICAgX3RpbWVzKG90aGVyKSB7XG4gICAgICAgIC8vIEJyZWFrIHRoZSBsZWZ0IGFuZCByaWdodCBudW1iZXJzIGludG8gMTYgYml0IGNodW5rc1xuICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiBtdWx0aXBseSB0aGVtIHdpdGhvdXQgb3ZlcmZsb3cuXG4gICAgICAgIGNvbnN0IEwgPSBuZXcgVWludDMyQXJyYXkoW1xuICAgICAgICAgICAgdGhpcy5idWZmZXJbMV0gPj4+IDE2LFxuICAgICAgICAgICAgdGhpcy5idWZmZXJbMV0gJiAweEZGRkYsXG4gICAgICAgICAgICB0aGlzLmJ1ZmZlclswXSA+Pj4gMTYsXG4gICAgICAgICAgICB0aGlzLmJ1ZmZlclswXSAmIDB4RkZGRlxuICAgICAgICBdKTtcbiAgICAgICAgY29uc3QgUiA9IG5ldyBVaW50MzJBcnJheShbXG4gICAgICAgICAgICBvdGhlci5idWZmZXJbMV0gPj4+IDE2LFxuICAgICAgICAgICAgb3RoZXIuYnVmZmVyWzFdICYgMHhGRkZGLFxuICAgICAgICAgICAgb3RoZXIuYnVmZmVyWzBdID4+PiAxNixcbiAgICAgICAgICAgIG90aGVyLmJ1ZmZlclswXSAmIDB4RkZGRlxuICAgICAgICBdKTtcbiAgICAgICAgbGV0IHByb2R1Y3QgPSBMWzNdICogUlszXTtcbiAgICAgICAgdGhpcy5idWZmZXJbMF0gPSBwcm9kdWN0ICYgMHhGRkZGO1xuICAgICAgICBsZXQgc3VtID0gcHJvZHVjdCA+Pj4gMTY7XG4gICAgICAgIHByb2R1Y3QgPSBMWzJdICogUlszXTtcbiAgICAgICAgc3VtICs9IHByb2R1Y3Q7XG4gICAgICAgIHByb2R1Y3QgPSAoTFszXSAqIFJbMl0pID4+PiAwO1xuICAgICAgICBzdW0gKz0gcHJvZHVjdDtcbiAgICAgICAgdGhpcy5idWZmZXJbMF0gKz0gc3VtIDw8IDE2O1xuICAgICAgICB0aGlzLmJ1ZmZlclsxXSA9IChzdW0gPj4+IDAgPCBwcm9kdWN0ID8gY2FycnlCaXQxNiA6IDApO1xuICAgICAgICB0aGlzLmJ1ZmZlclsxXSArPSBzdW0gPj4+IDE2O1xuICAgICAgICB0aGlzLmJ1ZmZlclsxXSArPSBMWzFdICogUlszXSArIExbMl0gKiBSWzJdICsgTFszXSAqIFJbMV07XG4gICAgICAgIHRoaXMuYnVmZmVyWzFdICs9IChMWzBdICogUlszXSArIExbMV0gKiBSWzJdICsgTFsyXSAqIFJbMV0gKyBMWzNdICogUlswXSkgPDwgMTY7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBfcGx1cyhvdGhlcikge1xuICAgICAgICBjb25zdCBzdW0gPSAodGhpcy5idWZmZXJbMF0gKyBvdGhlci5idWZmZXJbMF0pID4+PiAwO1xuICAgICAgICB0aGlzLmJ1ZmZlclsxXSArPSBvdGhlci5idWZmZXJbMV07XG4gICAgICAgIGlmIChzdW0gPCAodGhpcy5idWZmZXJbMF0gPj4+IDApKSB7XG4gICAgICAgICAgICArK3RoaXMuYnVmZmVyWzFdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmZmVyWzBdID0gc3VtO1xuICAgIH1cbiAgICBsZXNzVGhhbihvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXJbMV0gPCBvdGhlci5idWZmZXJbMV0gfHxcbiAgICAgICAgICAgICh0aGlzLmJ1ZmZlclsxXSA9PT0gb3RoZXIuYnVmZmVyWzFdICYmIHRoaXMuYnVmZmVyWzBdIDwgb3RoZXIuYnVmZmVyWzBdKTtcbiAgICB9XG4gICAgZXF1YWxzKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlclsxXSA9PT0gb3RoZXIuYnVmZmVyWzFdICYmIHRoaXMuYnVmZmVyWzBdID09IG90aGVyLmJ1ZmZlclswXTtcbiAgICB9XG4gICAgZ3JlYXRlclRoYW4ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyLmxlc3NUaGFuKHRoaXMpO1xuICAgIH1cbiAgICBoZXgoKSB7XG4gICAgICAgIHJldHVybiBgJHtpbnRBc0hleCh0aGlzLmJ1ZmZlclsxXSl9ICR7aW50QXNIZXgodGhpcy5idWZmZXJbMF0pfWA7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBVaW50NjQgZXh0ZW5kcyBCYXNlSW50NjQge1xuICAgIHRpbWVzKG90aGVyKSB7XG4gICAgICAgIHRoaXMuX3RpbWVzKG90aGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHBsdXMob3RoZXIpIHtcbiAgICAgICAgdGhpcy5fcGx1cyhvdGhlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbSh2YWwsIG91dF9idWZmZXIgPSBuZXcgVWludDMyQXJyYXkoMikpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ2NC5mcm9tU3RyaW5nKHR5cGVvZiAodmFsKSA9PT0gJ3N0cmluZycgPyB2YWwgOiB2YWwudG9TdHJpbmcoKSwgb3V0X2J1ZmZlcik7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBmcm9tTnVtYmVyKG51bSwgb3V0X2J1ZmZlciA9IG5ldyBVaW50MzJBcnJheSgyKSkge1xuICAgICAgICAvLyBBbHdheXMgcGFyc2UgbnVtYmVycyBhcyBzdHJpbmdzIC0gcHVsbGluZyBvdXQgaGlnaCBhbmQgbG93IGJpdHNcbiAgICAgICAgLy8gZGlyZWN0bHkgc2VlbXMgdG8gbG9zZSBwcmVjaXNpb24gc29tZXRpbWVzXG4gICAgICAgIC8vIEZvciBleGFtcGxlOlxuICAgICAgICAvLyAgICAgPiAtNDYxMzAzNDE1NjQwMDIxMjAwMCA+Pj4gMFxuICAgICAgICAvLyAgICAgNzIxNzgyNzg0XG4gICAgICAgIC8vIFRoZSBjb3JyZWN0IGxvd2VyIDMyLWJpdHMgYXJlIDcyMTc4Mjc1MlxuICAgICAgICByZXR1cm4gVWludDY0LmZyb21TdHJpbmcobnVtLnRvU3RyaW5nKCksIG91dF9idWZmZXIpO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbVN0cmluZyhzdHIsIG91dF9idWZmZXIgPSBuZXcgVWludDMyQXJyYXkoMikpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gc3RyLmxlbmd0aDtcbiAgICAgICAgY29uc3Qgb3V0ID0gbmV3IFVpbnQ2NChvdXRfYnVmZmVyKTtcbiAgICAgICAgZm9yIChsZXQgcG9zbiA9IDA7IHBvc24gPCBsZW5ndGg7KSB7XG4gICAgICAgICAgICBjb25zdCBncm91cCA9IGtJbnQzMkRlY2ltYWxEaWdpdHMgPCBsZW5ndGggLSBwb3NuID9cbiAgICAgICAgICAgICAgICBrSW50MzJEZWNpbWFsRGlnaXRzIDogbGVuZ3RoIC0gcG9zbjtcbiAgICAgICAgICAgIGNvbnN0IGNodW5rID0gbmV3IFVpbnQ2NChuZXcgVWludDMyQXJyYXkoW051bWJlci5wYXJzZUludChzdHIuc2xpY2UocG9zbiwgcG9zbiArIGdyb3VwKSwgMTApLCAwXSkpO1xuICAgICAgICAgICAgY29uc3QgbXVsdGlwbGUgPSBuZXcgVWludDY0KG5ldyBVaW50MzJBcnJheShba1Bvd2Vyc09mVGVuW2dyb3VwXSwgMF0pKTtcbiAgICAgICAgICAgIG91dC50aW1lcyhtdWx0aXBsZSk7XG4gICAgICAgICAgICBvdXQucGx1cyhjaHVuayk7XG4gICAgICAgICAgICBwb3NuICs9IGdyb3VwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBjb252ZXJ0QXJyYXkodmFsdWVzKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDMyQXJyYXkodmFsdWVzLmxlbmd0aCAqIDIpO1xuICAgICAgICBmb3IgKGxldCBpID0gLTEsIG4gPSB2YWx1ZXMubGVuZ3RoOyArK2kgPCBuOykge1xuICAgICAgICAgICAgVWludDY0LmZyb20odmFsdWVzW2ldLCBuZXcgVWludDMyQXJyYXkoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCArIDIgKiBpICogNCwgMikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgbXVsdGlwbHkobGVmdCwgcmlnaHQpIHtcbiAgICAgICAgY29uc3QgcnRybiA9IG5ldyBVaW50NjQobmV3IFVpbnQzMkFycmF5KGxlZnQuYnVmZmVyKSk7XG4gICAgICAgIHJldHVybiBydHJuLnRpbWVzKHJpZ2h0KTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGFkZChsZWZ0LCByaWdodCkge1xuICAgICAgICBjb25zdCBydHJuID0gbmV3IFVpbnQ2NChuZXcgVWludDMyQXJyYXkobGVmdC5idWZmZXIpKTtcbiAgICAgICAgcmV0dXJuIHJ0cm4ucGx1cyhyaWdodCk7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBJbnQ2NCBleHRlbmRzIEJhc2VJbnQ2NCB7XG4gICAgbmVnYXRlKCkge1xuICAgICAgICB0aGlzLmJ1ZmZlclswXSA9IH50aGlzLmJ1ZmZlclswXSArIDE7XG4gICAgICAgIHRoaXMuYnVmZmVyWzFdID0gfnRoaXMuYnVmZmVyWzFdO1xuICAgICAgICBpZiAodGhpcy5idWZmZXJbMF0gPT0gMCkge1xuICAgICAgICAgICAgKyt0aGlzLmJ1ZmZlclsxXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGltZXMob3RoZXIpIHtcbiAgICAgICAgdGhpcy5fdGltZXMob3RoZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcGx1cyhvdGhlcikge1xuICAgICAgICB0aGlzLl9wbHVzKG90aGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGxlc3NUaGFuKG90aGVyKSB7XG4gICAgICAgIC8vIGZvcmNlIGhpZ2ggYnl0ZXMgdG8gYmUgc2lnbmVkXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1tYXRoLXRydW5jXG4gICAgICAgIGNvbnN0IHRoaXNfaGlnaCA9IHRoaXMuYnVmZmVyWzFdIDw8IDA7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1tYXRoLXRydW5jXG4gICAgICAgIGNvbnN0IG90aGVyX2hpZ2ggPSBvdGhlci5idWZmZXJbMV0gPDwgMDtcbiAgICAgICAgcmV0dXJuIHRoaXNfaGlnaCA8IG90aGVyX2hpZ2ggfHxcbiAgICAgICAgICAgICh0aGlzX2hpZ2ggPT09IG90aGVyX2hpZ2ggJiYgdGhpcy5idWZmZXJbMF0gPCBvdGhlci5idWZmZXJbMF0pO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbSh2YWwsIG91dF9idWZmZXIgPSBuZXcgVWludDMyQXJyYXkoMikpIHtcbiAgICAgICAgcmV0dXJuIEludDY0LmZyb21TdHJpbmcodHlwZW9mICh2YWwpID09PSAnc3RyaW5nJyA/IHZhbCA6IHZhbC50b1N0cmluZygpLCBvdXRfYnVmZmVyKTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGZyb21OdW1iZXIobnVtLCBvdXRfYnVmZmVyID0gbmV3IFVpbnQzMkFycmF5KDIpKSB7XG4gICAgICAgIC8vIEFsd2F5cyBwYXJzZSBudW1iZXJzIGFzIHN0cmluZ3MgLSBwdWxsaW5nIG91dCBoaWdoIGFuZCBsb3cgYml0c1xuICAgICAgICAvLyBkaXJlY3RseSBzZWVtcyB0byBsb3NlIHByZWNpc2lvbiBzb21ldGltZXNcbiAgICAgICAgLy8gRm9yIGV4YW1wbGU6XG4gICAgICAgIC8vICAgICA+IC00NjEzMDM0MTU2NDAwMjEyMDAwID4+PiAwXG4gICAgICAgIC8vICAgICA3MjE3ODI3ODRcbiAgICAgICAgLy8gVGhlIGNvcnJlY3QgbG93ZXIgMzItYml0cyBhcmUgNzIxNzgyNzUyXG4gICAgICAgIHJldHVybiBJbnQ2NC5mcm9tU3RyaW5nKG51bS50b1N0cmluZygpLCBvdXRfYnVmZmVyKTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGZyb21TdHJpbmcoc3RyLCBvdXRfYnVmZmVyID0gbmV3IFVpbnQzMkFycmF5KDIpKSB7XG4gICAgICAgIC8vIFRPRE86IEFzc2VydCB0aGF0IG91dF9idWZmZXIgaXMgMCBhbmQgbGVuZ3RoID0gMlxuICAgICAgICBjb25zdCBuZWdhdGUgPSBzdHIuc3RhcnRzV2l0aCgnLScpO1xuICAgICAgICBjb25zdCBsZW5ndGggPSBzdHIubGVuZ3RoO1xuICAgICAgICBjb25zdCBvdXQgPSBuZXcgSW50NjQob3V0X2J1ZmZlcik7XG4gICAgICAgIGZvciAobGV0IHBvc24gPSBuZWdhdGUgPyAxIDogMDsgcG9zbiA8IGxlbmd0aDspIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0ga0ludDMyRGVjaW1hbERpZ2l0cyA8IGxlbmd0aCAtIHBvc24gP1xuICAgICAgICAgICAgICAgIGtJbnQzMkRlY2ltYWxEaWdpdHMgOiBsZW5ndGggLSBwb3NuO1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBuZXcgSW50NjQobmV3IFVpbnQzMkFycmF5KFtOdW1iZXIucGFyc2VJbnQoc3RyLnNsaWNlKHBvc24sIHBvc24gKyBncm91cCksIDEwKSwgMF0pKTtcbiAgICAgICAgICAgIGNvbnN0IG11bHRpcGxlID0gbmV3IEludDY0KG5ldyBVaW50MzJBcnJheShba1Bvd2Vyc09mVGVuW2dyb3VwXSwgMF0pKTtcbiAgICAgICAgICAgIG91dC50aW1lcyhtdWx0aXBsZSk7XG4gICAgICAgICAgICBvdXQucGx1cyhjaHVuayk7XG4gICAgICAgICAgICBwb3NuICs9IGdyb3VwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZWdhdGUgPyBvdXQubmVnYXRlKCkgOiBvdXQ7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBjb252ZXJ0QXJyYXkodmFsdWVzKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDMyQXJyYXkodmFsdWVzLmxlbmd0aCAqIDIpO1xuICAgICAgICBmb3IgKGxldCBpID0gLTEsIG4gPSB2YWx1ZXMubGVuZ3RoOyArK2kgPCBuOykge1xuICAgICAgICAgICAgSW50NjQuZnJvbSh2YWx1ZXNbaV0sIG5ldyBVaW50MzJBcnJheShkYXRhLmJ1ZmZlciwgZGF0YS5ieXRlT2Zmc2V0ICsgMiAqIGkgKiA0LCAyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBtdWx0aXBseShsZWZ0LCByaWdodCkge1xuICAgICAgICBjb25zdCBydHJuID0gbmV3IEludDY0KG5ldyBVaW50MzJBcnJheShsZWZ0LmJ1ZmZlcikpO1xuICAgICAgICByZXR1cm4gcnRybi50aW1lcyhyaWdodCk7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBhZGQobGVmdCwgcmlnaHQpIHtcbiAgICAgICAgY29uc3QgcnRybiA9IG5ldyBJbnQ2NChuZXcgVWludDMyQXJyYXkobGVmdC5idWZmZXIpKTtcbiAgICAgICAgcmV0dXJuIHJ0cm4ucGx1cyhyaWdodCk7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBJbnQxMjgge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgICAgLy8gYnVmZmVyWzNdIE1TQiAoaGlnaClcbiAgICAgICAgLy8gYnVmZmVyWzJdXG4gICAgICAgIC8vIGJ1ZmZlclsxXVxuICAgICAgICAvLyBidWZmZXJbMF0gTFNCIChsb3cpXG4gICAgfVxuICAgIGhpZ2goKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW50NjQobmV3IFVpbnQzMkFycmF5KHRoaXMuYnVmZmVyLmJ1ZmZlciwgdGhpcy5idWZmZXIuYnl0ZU9mZnNldCArIDgsIDIpKTtcbiAgICB9XG4gICAgbG93KCkge1xuICAgICAgICByZXR1cm4gbmV3IEludDY0KG5ldyBVaW50MzJBcnJheSh0aGlzLmJ1ZmZlci5idWZmZXIsIHRoaXMuYnVmZmVyLmJ5dGVPZmZzZXQsIDIpKTtcbiAgICB9XG4gICAgbmVnYXRlKCkge1xuICAgICAgICB0aGlzLmJ1ZmZlclswXSA9IH50aGlzLmJ1ZmZlclswXSArIDE7XG4gICAgICAgIHRoaXMuYnVmZmVyWzFdID0gfnRoaXMuYnVmZmVyWzFdO1xuICAgICAgICB0aGlzLmJ1ZmZlclsyXSA9IH50aGlzLmJ1ZmZlclsyXTtcbiAgICAgICAgdGhpcy5idWZmZXJbM10gPSB+dGhpcy5idWZmZXJbM107XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlclswXSA9PSAwKSB7XG4gICAgICAgICAgICArK3RoaXMuYnVmZmVyWzFdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlclsxXSA9PSAwKSB7XG4gICAgICAgICAgICArK3RoaXMuYnVmZmVyWzJdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlclsyXSA9PSAwKSB7XG4gICAgICAgICAgICArK3RoaXMuYnVmZmVyWzNdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aW1lcyhvdGhlcikge1xuICAgICAgICAvLyBCcmVhayB0aGUgbGVmdCBhbmQgcmlnaHQgbnVtYmVycyBpbnRvIDMyIGJpdCBjaHVua3NcbiAgICAgICAgLy8gc28gdGhhdCB3ZSBjYW4gbXVsdGlwbHkgdGhlbSB3aXRob3V0IG92ZXJmbG93LlxuICAgICAgICBjb25zdCBMMCA9IG5ldyBVaW50NjQobmV3IFVpbnQzMkFycmF5KFt0aGlzLmJ1ZmZlclszXSwgMF0pKTtcbiAgICAgICAgY29uc3QgTDEgPSBuZXcgVWludDY0KG5ldyBVaW50MzJBcnJheShbdGhpcy5idWZmZXJbMl0sIDBdKSk7XG4gICAgICAgIGNvbnN0IEwyID0gbmV3IFVpbnQ2NChuZXcgVWludDMyQXJyYXkoW3RoaXMuYnVmZmVyWzFdLCAwXSkpO1xuICAgICAgICBjb25zdCBMMyA9IG5ldyBVaW50NjQobmV3IFVpbnQzMkFycmF5KFt0aGlzLmJ1ZmZlclswXSwgMF0pKTtcbiAgICAgICAgY29uc3QgUjAgPSBuZXcgVWludDY0KG5ldyBVaW50MzJBcnJheShbb3RoZXIuYnVmZmVyWzNdLCAwXSkpO1xuICAgICAgICBjb25zdCBSMSA9IG5ldyBVaW50NjQobmV3IFVpbnQzMkFycmF5KFtvdGhlci5idWZmZXJbMl0sIDBdKSk7XG4gICAgICAgIGNvbnN0IFIyID0gbmV3IFVpbnQ2NChuZXcgVWludDMyQXJyYXkoW290aGVyLmJ1ZmZlclsxXSwgMF0pKTtcbiAgICAgICAgY29uc3QgUjMgPSBuZXcgVWludDY0KG5ldyBVaW50MzJBcnJheShbb3RoZXIuYnVmZmVyWzBdLCAwXSkpO1xuICAgICAgICBsZXQgcHJvZHVjdCA9IFVpbnQ2NC5tdWx0aXBseShMMywgUjMpO1xuICAgICAgICB0aGlzLmJ1ZmZlclswXSA9IHByb2R1Y3QubG93KCk7XG4gICAgICAgIGNvbnN0IHN1bSA9IG5ldyBVaW50NjQobmV3IFVpbnQzMkFycmF5KFtwcm9kdWN0LmhpZ2goKSwgMF0pKTtcbiAgICAgICAgcHJvZHVjdCA9IFVpbnQ2NC5tdWx0aXBseShMMiwgUjMpO1xuICAgICAgICBzdW0ucGx1cyhwcm9kdWN0KTtcbiAgICAgICAgcHJvZHVjdCA9IFVpbnQ2NC5tdWx0aXBseShMMywgUjIpO1xuICAgICAgICBzdW0ucGx1cyhwcm9kdWN0KTtcbiAgICAgICAgdGhpcy5idWZmZXJbMV0gPSBzdW0ubG93KCk7XG4gICAgICAgIHRoaXMuYnVmZmVyWzNdID0gKHN1bS5sZXNzVGhhbihwcm9kdWN0KSA/IDEgOiAwKTtcbiAgICAgICAgdGhpcy5idWZmZXJbMl0gPSBzdW0uaGlnaCgpO1xuICAgICAgICBjb25zdCBoaWdoID0gbmV3IFVpbnQ2NChuZXcgVWludDMyQXJyYXkodGhpcy5idWZmZXIuYnVmZmVyLCB0aGlzLmJ1ZmZlci5ieXRlT2Zmc2V0ICsgOCwgMikpO1xuICAgICAgICBoaWdoLnBsdXMoVWludDY0Lm11bHRpcGx5KEwxLCBSMykpXG4gICAgICAgICAgICAucGx1cyhVaW50NjQubXVsdGlwbHkoTDIsIFIyKSlcbiAgICAgICAgICAgIC5wbHVzKFVpbnQ2NC5tdWx0aXBseShMMywgUjEpKTtcbiAgICAgICAgdGhpcy5idWZmZXJbM10gKz0gVWludDY0Lm11bHRpcGx5KEwwLCBSMylcbiAgICAgICAgICAgIC5wbHVzKFVpbnQ2NC5tdWx0aXBseShMMSwgUjIpKVxuICAgICAgICAgICAgLnBsdXMoVWludDY0Lm11bHRpcGx5KEwyLCBSMSkpXG4gICAgICAgICAgICAucGx1cyhVaW50NjQubXVsdGlwbHkoTDMsIFIwKSkubG93KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBwbHVzKG90aGVyKSB7XG4gICAgICAgIGNvbnN0IHN1bXMgPSBuZXcgVWludDMyQXJyYXkoNCk7XG4gICAgICAgIHN1bXNbM10gPSAodGhpcy5idWZmZXJbM10gKyBvdGhlci5idWZmZXJbM10pID4+PiAwO1xuICAgICAgICBzdW1zWzJdID0gKHRoaXMuYnVmZmVyWzJdICsgb3RoZXIuYnVmZmVyWzJdKSA+Pj4gMDtcbiAgICAgICAgc3Vtc1sxXSA9ICh0aGlzLmJ1ZmZlclsxXSArIG90aGVyLmJ1ZmZlclsxXSkgPj4+IDA7XG4gICAgICAgIHN1bXNbMF0gPSAodGhpcy5idWZmZXJbMF0gKyBvdGhlci5idWZmZXJbMF0pID4+PiAwO1xuICAgICAgICBpZiAoc3Vtc1swXSA8ICh0aGlzLmJ1ZmZlclswXSA+Pj4gMCkpIHtcbiAgICAgICAgICAgICsrc3Vtc1sxXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3Vtc1sxXSA8ICh0aGlzLmJ1ZmZlclsxXSA+Pj4gMCkpIHtcbiAgICAgICAgICAgICsrc3Vtc1syXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3Vtc1syXSA8ICh0aGlzLmJ1ZmZlclsyXSA+Pj4gMCkpIHtcbiAgICAgICAgICAgICsrc3Vtc1szXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1ZmZlclszXSA9IHN1bXNbM107XG4gICAgICAgIHRoaXMuYnVmZmVyWzJdID0gc3Vtc1syXTtcbiAgICAgICAgdGhpcy5idWZmZXJbMV0gPSBzdW1zWzFdO1xuICAgICAgICB0aGlzLmJ1ZmZlclswXSA9IHN1bXNbMF07XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBoZXgoKSB7XG4gICAgICAgIHJldHVybiBgJHtpbnRBc0hleCh0aGlzLmJ1ZmZlclszXSl9ICR7aW50QXNIZXgodGhpcy5idWZmZXJbMl0pfSAke2ludEFzSGV4KHRoaXMuYnVmZmVyWzFdKX0gJHtpbnRBc0hleCh0aGlzLmJ1ZmZlclswXSl9YDtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIG11bHRpcGx5KGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIGNvbnN0IHJ0cm4gPSBuZXcgSW50MTI4KG5ldyBVaW50MzJBcnJheShsZWZ0LmJ1ZmZlcikpO1xuICAgICAgICByZXR1cm4gcnRybi50aW1lcyhyaWdodCk7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBhZGQobGVmdCwgcmlnaHQpIHtcbiAgICAgICAgY29uc3QgcnRybiA9IG5ldyBJbnQxMjgobmV3IFVpbnQzMkFycmF5KGxlZnQuYnVmZmVyKSk7XG4gICAgICAgIHJldHVybiBydHJuLnBsdXMocmlnaHQpO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbSh2YWwsIG91dF9idWZmZXIgPSBuZXcgVWludDMyQXJyYXkoNCkpIHtcbiAgICAgICAgcmV0dXJuIEludDEyOC5mcm9tU3RyaW5nKHR5cGVvZiAodmFsKSA9PT0gJ3N0cmluZycgPyB2YWwgOiB2YWwudG9TdHJpbmcoKSwgb3V0X2J1ZmZlcik7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBmcm9tTnVtYmVyKG51bSwgb3V0X2J1ZmZlciA9IG5ldyBVaW50MzJBcnJheSg0KSkge1xuICAgICAgICAvLyBBbHdheXMgcGFyc2UgbnVtYmVycyBhcyBzdHJpbmdzIC0gcHVsbGluZyBvdXQgaGlnaCBhbmQgbG93IGJpdHNcbiAgICAgICAgLy8gZGlyZWN0bHkgc2VlbXMgdG8gbG9zZSBwcmVjaXNpb24gc29tZXRpbWVzXG4gICAgICAgIC8vIEZvciBleGFtcGxlOlxuICAgICAgICAvLyAgICAgPiAtNDYxMzAzNDE1NjQwMDIxMjAwMCA+Pj4gMFxuICAgICAgICAvLyAgICAgNzIxNzgyNzg0XG4gICAgICAgIC8vIFRoZSBjb3JyZWN0IGxvd2VyIDMyLWJpdHMgYXJlIDcyMTc4Mjc1MlxuICAgICAgICByZXR1cm4gSW50MTI4LmZyb21TdHJpbmcobnVtLnRvU3RyaW5nKCksIG91dF9idWZmZXIpO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbVN0cmluZyhzdHIsIG91dF9idWZmZXIgPSBuZXcgVWludDMyQXJyYXkoNCkpIHtcbiAgICAgICAgLy8gVE9ETzogQXNzZXJ0IHRoYXQgb3V0X2J1ZmZlciBpcyAwIGFuZCBsZW5ndGggPSA0XG4gICAgICAgIGNvbnN0IG5lZ2F0ZSA9IHN0ci5zdGFydHNXaXRoKCctJyk7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHN0ci5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG91dCA9IG5ldyBJbnQxMjgob3V0X2J1ZmZlcik7XG4gICAgICAgIGZvciAobGV0IHBvc24gPSBuZWdhdGUgPyAxIDogMDsgcG9zbiA8IGxlbmd0aDspIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0ga0ludDMyRGVjaW1hbERpZ2l0cyA8IGxlbmd0aCAtIHBvc24gP1xuICAgICAgICAgICAgICAgIGtJbnQzMkRlY2ltYWxEaWdpdHMgOiBsZW5ndGggLSBwb3NuO1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBuZXcgSW50MTI4KG5ldyBVaW50MzJBcnJheShbTnVtYmVyLnBhcnNlSW50KHN0ci5zbGljZShwb3NuLCBwb3NuICsgZ3JvdXApLCAxMCksIDAsIDAsIDBdKSk7XG4gICAgICAgICAgICBjb25zdCBtdWx0aXBsZSA9IG5ldyBJbnQxMjgobmV3IFVpbnQzMkFycmF5KFtrUG93ZXJzT2ZUZW5bZ3JvdXBdLCAwLCAwLCAwXSkpO1xuICAgICAgICAgICAgb3V0LnRpbWVzKG11bHRpcGxlKTtcbiAgICAgICAgICAgIG91dC5wbHVzKGNodW5rKTtcbiAgICAgICAgICAgIHBvc24gKz0gZ3JvdXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5lZ2F0ZSA/IG91dC5uZWdhdGUoKSA6IG91dDtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGNvbnZlcnRBcnJheSh2YWx1ZXMpIHtcbiAgICAgICAgLy8gVE9ETzogRGlzdGluZ3Vpc2ggYmV0d2VlbiBzdHJpbmcgYW5kIG51bWJlciBhdCBjb21waWxlLXRpbWVcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50MzJBcnJheSh2YWx1ZXMubGVuZ3RoICogNCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAtMSwgbiA9IHZhbHVlcy5sZW5ndGg7ICsraSA8IG47KSB7XG4gICAgICAgICAgICBJbnQxMjguZnJvbSh2YWx1ZXNbaV0sIG5ldyBVaW50MzJBcnJheShkYXRhLmJ1ZmZlciwgZGF0YS5ieXRlT2Zmc2V0ICsgNCAqIDQgKiBpLCA0KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnQubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5jb25zdCBmNjQgPSBuZXcgRmxvYXQ2NEFycmF5KDEpO1xuY29uc3QgdTMyID0gbmV3IFVpbnQzMkFycmF5KGY2NC5idWZmZXIpO1xuLyoqXG4gKiBDb252ZXJ0IHVpbnQxNiAobG9naWNhbGx5IGEgZmxvYXQxNikgdG8gYSBKUyBmbG9hdDY0LiBJbnNwaXJlZCBieSBudW1weSdzIGBucHlfaGFsZl90b19kb3VibGVgOlxuICogaHR0cHM6Ly9naXRodWIuY29tL251bXB5L251bXB5L2Jsb2IvNWE1OTg3MjkxZGM5NTM3NmJiMDk4YmU4ZDhlNTM5MWU4OWU3N2EyYy9udW1weS9jb3JlL3NyYy9ucHltYXRoL2hhbGZmbG9hdC5jI0wyOVxuICogQHBhcmFtIGgge251bWJlcn0gdGhlIHVpbnQxNiB0byBjb252ZXJ0XG4gKiBAcHJpdmF0ZVxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdWludDE2VG9GbG9hdDY0KGgpIHtcbiAgICBjb25zdCBleHBvID0gKGggJiAweDdDMDApID4+IDEwO1xuICAgIGNvbnN0IHNpZ2YgPSAoaCAmIDB4MDNGRikgLyAxMDI0O1xuICAgIGNvbnN0IHNpZ24gPSBNYXRoLnBvdygoLTEpLCAoKGggJiAweDgwMDApID4+IDE1KSk7XG4gICAgc3dpdGNoIChleHBvKSB7XG4gICAgICAgIGNhc2UgMHgxRjogcmV0dXJuIHNpZ24gKiAoc2lnZiA/IE51bWJlci5OYU4gOiAxIC8gMCk7XG4gICAgICAgIGNhc2UgMHgwMDogcmV0dXJuIHNpZ24gKiAoc2lnZiA/IDYuMTAzNTE1NjI1ZS01ICogc2lnZiA6IDApO1xuICAgIH1cbiAgICByZXR1cm4gc2lnbiAqIChNYXRoLnBvdygyLCAoZXhwbyAtIDE1KSkpICogKDEgKyBzaWdmKTtcbn1cbi8qKlxuICogQ29udmVydCBhIGZsb2F0NjQgdG8gdWludDE2IChhc3N1bWluZyB0aGUgZmxvYXQ2NCBpcyBsb2dpY2FsbHkgYSBmbG9hdDE2KS4gSW5zcGlyZWQgYnkgbnVtcHkncyBgbnB5X2RvdWJsZV90b19oYWxmYDpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9udW1weS9udW1weS9ibG9iLzVhNTk4NzI5MWRjOTUzNzZiYjA5OGJlOGQ4ZTUzOTFlODllNzdhMmMvbnVtcHkvY29yZS9zcmMvbnB5bWF0aC9oYWxmZmxvYXQuYyNMNDNcbiAqIEBwYXJhbSBkIHtudW1iZXJ9IFRoZSBmbG9hdDY0IHRvIGNvbnZlcnRcbiAqIEBwcml2YXRlXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbG9hdDY0VG9VaW50MTYoZCkge1xuICAgIGlmIChkICE9PSBkKSB7XG4gICAgICAgIHJldHVybiAweDdFMDA7XG4gICAgfSAvLyBOYU5cbiAgICBmNjRbMF0gPSBkO1xuICAgIC8vIE1hZ2ljIG51bWJlcnM6XG4gICAgLy8gMHg4MDAwMDAwMCA9IDEwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIC0tIG1hc2tzIHRoZSAzMm5kIGJpdFxuICAgIC8vIDB4N2ZmMDAwMDAgPSAwMTExMTExMSAxMTExMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAtLSBtYXNrcyB0aGUgMjFzdC0zMXN0IGJpdHNcbiAgICAvLyAweDAwMGZmZmZmID0gMDAwMDAwMDAgMDAwMDExMTEgMTExMTExMTEgMTExMTExMTEgLS0gbWFza3MgdGhlIDFzdC0yMHRoIGJpdFxuICAgIGNvbnN0IHNpZ24gPSAodTMyWzFdICYgMHg4MDAwMDAwMCkgPj4gMTYgJiAweEZGRkY7XG4gICAgbGV0IGV4cG8gPSAodTMyWzFdICYgMHg3RkYwMDAwMCksIHNpZ2YgPSAweDAwMDA7XG4gICAgaWYgKGV4cG8gPj0gMHg0MEYwMDAwMCkge1xuICAgICAgICAvL1xuICAgICAgICAvLyBJZiBleHBvbmVudCBvdmVyZmxvd2VkLCB0aGUgZmxvYXQxNiBpcyBlaXRoZXIgTmFOIG9yIEluZmluaXR5LlxuICAgICAgICAvLyBSdWxlcyB0byBwcm9wYWdhdGUgdGhlIHNpZ24gYml0OiBtYW50aXNzYSA+IDAgPyBOYU4gOiArLy1JbmZpbml0eVxuICAgICAgICAvL1xuICAgICAgICAvLyBNYWdpYyBudW1iZXJzOlxuICAgICAgICAvLyAweDQwRjAwMDAwID0gMDEwMDAwMDAgMTExMTAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgLS0gNi1iaXQgZXhwb25lbnQgb3ZlcmZsb3dcbiAgICAgICAgLy8gMHg3QzAwMDAwMCA9IDAxMTExMTAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIC0tIG1hc2tzIHRoZSAyN3RoLTMxc3QgYml0c1xuICAgICAgICAvL1xuICAgICAgICAvLyByZXR1cm5zOlxuICAgICAgICAvLyBxTmFOLCBha2EgMzIyNTYgZGVjaW1hbCwgMHg3RTAwIGhleCwgb3IgMDExMTExMTAgMDAwMDAwMDAgYmluYXJ5XG4gICAgICAgIC8vIHNOYU4sIGFrYSAzMjAwMCBkZWNpbWFsLCAweDdEMDAgaGV4LCBvciAwMTExMTEwMSAwMDAwMDAwMCBiaW5hcnlcbiAgICAgICAgLy8gK2luZiwgYWthIDMxNzQ0IGRlY2ltYWwsIDB4N0MwMCBoZXgsIG9yIDAxMTExMTAwIDAwMDAwMDAwIGJpbmFyeVxuICAgICAgICAvLyAtaW5mLCBha2EgNjQ1MTIgZGVjaW1hbCwgMHhGQzAwIGhleCwgb3IgMTExMTExMDAgMDAwMDAwMDAgYmluYXJ5XG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIG1hbnRpc3NhIGlzIGdyZWF0ZXIgdGhhbiAyMyBiaXRzLCBzZXQgdG8gK0luZmluaXR5IGxpa2UgbnVtcHlcbiAgICAgICAgaWYgKHUzMlswXSA+IDApIHtcbiAgICAgICAgICAgIGV4cG8gPSAweDdDMDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBleHBvID0gKGV4cG8gJiAweDdDMDAwMDAwKSA+PiAxNjtcbiAgICAgICAgICAgIHNpZ2YgPSAodTMyWzFdICYgMHgwMDBGRkZGRikgPj4gMTA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoZXhwbyA8PSAweDNGMDAwMDAwKSB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIGV4cG9uZW50IHVuZGVyZmxvd2VkLCB0aGUgZmxvYXQgaXMgZWl0aGVyIHNpZ25lZCB6ZXJvIG9yIHN1Ym5vcm1hbC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gTWFnaWMgbnVtYmVyczpcbiAgICAgICAgLy8gMHgzRjAwMDAwMCA9IDAwMTExMTExIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIC0tIDYtYml0IGV4cG9uZW50IHVuZGVyZmxvd1xuICAgICAgICAvL1xuICAgICAgICBzaWdmID0gMHgxMDAwMDAgKyAodTMyWzFdICYgMHgwMDBGRkZGRik7XG4gICAgICAgIHNpZ2YgPSAweDEwMDAwMCArIChzaWdmIDw8ICgoZXhwbyA+PiAyMCkgLSA5OTgpKSA+PiAyMTtcbiAgICAgICAgZXhwbyA9IDA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvL1xuICAgICAgICAvLyBObyBvdmVyZmxvdyBvciB1bmRlcmZsb3csIHJlYmFzZSB0aGUgZXhwb25lbnQgYW5kIHJvdW5kIHRoZSBtYW50aXNzYVxuICAgICAgICAvLyBNYWdpYyBudW1iZXJzOlxuICAgICAgICAvLyAweDIwMCA9IDAwMDAwMDEwIDAwMDAwMDAwIC0tIG1hc2tzIG9mZiB0aGUgMTB0aCBiaXRcbiAgICAgICAgLy9cbiAgICAgICAgLy8gRW5zdXJlIHRoZSBmaXJzdCBtYW50aXNzYSBiaXQgKHRoZSAxMHRoIG9uZSkgaXMgMSBhbmQgcm91bmRcbiAgICAgICAgZXhwbyA9IChleHBvIC0gMHgzRjAwMDAwMCkgPj4gMTA7XG4gICAgICAgIHNpZ2YgPSAoKHUzMlsxXSAmIDB4MDAwRkZGRkYpICsgMHgyMDApID4+IDEwO1xuICAgIH1cbiAgICByZXR1cm4gc2lnbiB8IGV4cG8gfCBzaWdmICYgMHhGRkZGO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXRoLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuLyoqIEBpZ25vcmUgKi8gY29uc3QgdW5kZiA9IHZvaWQgKDApO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZVRvU3RyaW5nKHgpIHtcbiAgICBpZiAoeCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgIH1cbiAgICBpZiAoeCA9PT0gdW5kZikge1xuICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZW9mIHgpIHtcbiAgICAgICAgY2FzZSAnbnVtYmVyJzogcmV0dXJuIGAke3h9YDtcbiAgICAgICAgY2FzZSAnYmlnaW50JzogcmV0dXJuIGAke3h9YDtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzogcmV0dXJuIGBcIiR7eH1cImA7XG4gICAgfVxuICAgIC8vIElmIFtTeW1ib2wudG9QcmltaXRpdmVdIGlzIGltcGxlbWVudGVkIChsaWtlIGluIEJOKVxuICAgIC8vIHVzZSBpdCBpbnN0ZWFkIG9mIEpTT04uc3RyaW5naWZ5KCkuIFRoaXMgZW5zdXJlcyB3ZVxuICAgIC8vIHByaW50IEJpZ0ludHMsIERlY2ltYWxzLCBhbmQgQmluYXJ5IGluIHRoZWlyIG5hdGl2ZVxuICAgIC8vIHJlcHJlc2VudGF0aW9uXG4gICAgaWYgKHR5cGVvZiB4W1N5bWJvbC50b1ByaW1pdGl2ZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHhbU3ltYm9sLnRvUHJpbWl0aXZlXSgnc3RyaW5nJyk7XG4gICAgfVxuICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoeCkpIHtcbiAgICAgICAgaWYgKHggaW5zdGFuY2VvZiBCaWdJbnQ2NEFycmF5IHx8IHggaW5zdGFuY2VvZiBCaWdVaW50NjRBcnJheSkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHtbLi4ueF0ubWFwKHggPT4gdmFsdWVUb1N0cmluZyh4KSl9XWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBbJHt4fV1gO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KHgpID8gYFske3h9XWAgOiBKU09OLnN0cmluZ2lmeSh4LCAoXywgeSkgPT4gdHlwZW9mIHkgPT09ICdiaWdpbnQnID8gYCR7eX1gIDogeSk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByZXR0eS5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IG1ha2VEYXRhIH0gZnJvbSAnLi4vZGF0YS5tanMnO1xuaW1wb3J0IHsgU3RydWN0IH0gZnJvbSAnLi4vdHlwZS5tanMnO1xuaW1wb3J0IHsgUmVjb3JkQmF0Y2ggfSBmcm9tICcuLi9yZWNvcmRiYXRjaC5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXN0cmlidXRlVmVjdG9yc0ludG9SZWNvcmRCYXRjaGVzKHNjaGVtYSwgdmVjcykge1xuICAgIHJldHVybiB1bmlmb3JtbHlEaXN0cmlidXRlQ2h1bmtzQWNyb3NzUmVjb3JkQmF0Y2hlcyhzY2hlbWEsIHZlY3MubWFwKCh2KSA9PiB2LmRhdGEuY29uY2F0KCkpKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiB1bmlmb3JtbHlEaXN0cmlidXRlQ2h1bmtzQWNyb3NzUmVjb3JkQmF0Y2hlcyhzY2hlbWEsIGNvbHMpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBbLi4uc2NoZW1hLmZpZWxkc107XG4gICAgY29uc3QgYmF0Y2hlcyA9IFtdO1xuICAgIGNvbnN0IG1lbW8gPSB7IG51bUJhdGNoZXM6IGNvbHMucmVkdWNlKChuLCBjKSA9PiBNYXRoLm1heChuLCBjLmxlbmd0aCksIDApIH07XG4gICAgbGV0IG51bUJhdGNoZXMgPSAwLCBiYXRjaExlbmd0aCA9IDA7XG4gICAgbGV0IGkgPSAtMTtcbiAgICBjb25zdCBudW1Db2x1bW5zID0gY29scy5sZW5ndGg7XG4gICAgbGV0IGNoaWxkLCBjaGlsZHJlbiA9IFtdO1xuICAgIHdoaWxlIChtZW1vLm51bUJhdGNoZXMtLSA+IDApIHtcbiAgICAgICAgZm9yIChiYXRjaExlbmd0aCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgaSA9IC0xOyArK2kgPCBudW1Db2x1bW5zOykge1xuICAgICAgICAgICAgY2hpbGRyZW5baV0gPSBjaGlsZCA9IGNvbHNbaV0uc2hpZnQoKTtcbiAgICAgICAgICAgIGJhdGNoTGVuZ3RoID0gTWF0aC5taW4oYmF0Y2hMZW5ndGgsIGNoaWxkID8gY2hpbGQubGVuZ3RoIDogYmF0Y2hMZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoYmF0Y2hMZW5ndGgpKSB7XG4gICAgICAgICAgICBjaGlsZHJlbiA9IGRpc3RyaWJ1dGVDaGlsZHJlbihmaWVsZHMsIGJhdGNoTGVuZ3RoLCBjaGlsZHJlbiwgY29scywgbWVtbyk7XG4gICAgICAgICAgICBpZiAoYmF0Y2hMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYmF0Y2hlc1tudW1CYXRjaGVzKytdID0gbWFrZURhdGEoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBuZXcgU3RydWN0KGZpZWxkcyksXG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aDogYmF0Y2hMZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIG51bGxDb3VudDogMCxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLnNsaWNlKClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgICBzY2hlbWEgPSBzY2hlbWEuYXNzaWduKGZpZWxkcyksXG4gICAgICAgIGJhdGNoZXMubWFwKChkYXRhKSA9PiBuZXcgUmVjb3JkQmF0Y2goc2NoZW1hLCBkYXRhKSlcbiAgICBdO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGRpc3RyaWJ1dGVDaGlsZHJlbihmaWVsZHMsIGJhdGNoTGVuZ3RoLCBjaGlsZHJlbiwgY29sdW1ucywgbWVtbykge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBudWxsQml0bWFwU2l6ZSA9ICgoYmF0Y2hMZW5ndGggKyA2MykgJiB+NjMpID4+IDM7XG4gICAgZm9yIChsZXQgaSA9IC0xLCBuID0gY29sdW1ucy5sZW5ndGg7ICsraSA8IG47KSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGNoaWxkID09PSBudWxsIHx8IGNoaWxkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGlsZC5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPj0gYmF0Y2hMZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChsZW5ndGggPT09IGJhdGNoTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW5baV0gPSBjaGlsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuW2ldID0gY2hpbGQuc2xpY2UoMCwgYmF0Y2hMZW5ndGgpO1xuICAgICAgICAgICAgICAgIG1lbW8ubnVtQmF0Y2hlcyA9IE1hdGgubWF4KG1lbW8ubnVtQmF0Y2hlcywgY29sdW1uc1tpXS51bnNoaWZ0KGNoaWxkLnNsaWNlKGJhdGNoTGVuZ3RoLCBsZW5ndGggLSBiYXRjaExlbmd0aCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZmllbGRzW2ldO1xuICAgICAgICAgICAgZmllbGRzW2ldID0gZmllbGQuY2xvbmUoeyBudWxsYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGNoaWxkcmVuW2ldID0gKF9hID0gY2hpbGQgPT09IG51bGwgfHwgY2hpbGQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoaWxkLl9jaGFuZ2VMZW5ndGhBbmRCYWNrZmlsbE51bGxCaXRtYXAoYmF0Y2hMZW5ndGgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBtYWtlRGF0YSh7XG4gICAgICAgICAgICAgICAgdHlwZTogZmllbGQudHlwZSxcbiAgICAgICAgICAgICAgICBsZW5ndGg6IGJhdGNoTGVuZ3RoLFxuICAgICAgICAgICAgICAgIG51bGxDb3VudDogYmF0Y2hMZW5ndGgsXG4gICAgICAgICAgICAgICAgbnVsbEJpdG1hcDogbmV3IFVpbnQ4QXJyYXkobnVsbEJpdG1hcFNpemUpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2hpbGRyZW47XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlY29yZGJhdGNoLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnKTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgZGVjb2RlVXRmOCA9IChidWZmZXIpID0+IGRlY29kZXIuZGVjb2RlKGJ1ZmZlcik7XG5jb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IGVuY29kZVV0ZjggPSAodmFsdWUpID0+IGVuY29kZXIuZW5jb2RlKHZhbHVlKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRmOC5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IFZlY3RvciB9IGZyb20gJy4uL3ZlY3Rvci5tanMnO1xuaW1wb3J0IHsgTWFwUm93IH0gZnJvbSAnLi4vcm93L21hcC5tanMnO1xuaW1wb3J0IHsgU3RydWN0Um93IH0gZnJvbSAnLi4vcm93L3N0cnVjdC5tanMnO1xuaW1wb3J0IHsgY29tcGFyZUFycmF5TGlrZSB9IGZyb20gJy4uL3V0aWwvYnVmZmVyLm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wSW5kZXgoc291cmNlLCBpbmRleCwgdGhlbikge1xuICAgIGNvbnN0IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgY29uc3QgYWRqdXN0ID0gaW5kZXggPiAtMSA/IGluZGV4IDogKGxlbmd0aCArIChpbmRleCAlIGxlbmd0aCkpO1xuICAgIHJldHVybiB0aGVuID8gdGhlbihzb3VyY2UsIGFkanVzdCkgOiBhZGp1c3Q7XG59XG4vKiogQGlnbm9yZSAqL1xubGV0IHRtcDtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgZnVuY3Rpb24gY2xhbXBSYW5nZShzb3VyY2UsIGJlZ2luLCBlbmQsIHRoZW4pIHtcbiAgICAvLyBBZGp1c3QgYXJncyBzaW1pbGFyIHRvIEFycmF5LnByb3RvdHlwZS5zbGljZS4gTm9ybWFsaXplIGJlZ2luL2VuZCB0b1xuICAgIC8vIGNsYW1wIGJldHdlZW4gMCBhbmQgbGVuZ3RoLCBhbmQgd3JhcCBhcm91bmQgb24gbmVnYXRpdmUgaW5kaWNlcywgZS5nLlxuICAgIC8vIHNsaWNlKC0xLCA1KSBvciBzbGljZSg1LCAtMSlcbiAgICBjb25zdCB7IGxlbmd0aDogbGVuID0gMCB9ID0gc291cmNlO1xuICAgIGxldCBsaHMgPSB0eXBlb2YgYmVnaW4gIT09ICdudW1iZXInID8gMCA6IGJlZ2luO1xuICAgIGxldCByaHMgPSB0eXBlb2YgZW5kICE9PSAnbnVtYmVyJyA/IGxlbiA6IGVuZDtcbiAgICAvLyB3cmFwIGFyb3VuZCBvbiBuZWdhdGl2ZSBzdGFydC9lbmQgcG9zaXRpb25zXG4gICAgKGxocyA8IDApICYmIChsaHMgPSAoKGxocyAlIGxlbikgKyBsZW4pICUgbGVuKTtcbiAgICAocmhzIDwgMCkgJiYgKHJocyA9ICgocmhzICUgbGVuKSArIGxlbikgJSBsZW4pO1xuICAgIC8vIGVuc3VyZSBsaHMgPD0gcmhzXG4gICAgKHJocyA8IGxocykgJiYgKHRtcCA9IGxocywgbGhzID0gcmhzLCByaHMgPSB0bXApO1xuICAgIC8vIGVuc3VyZSByaHMgPD0gbGVuZ3RoXG4gICAgKHJocyA+IGxlbikgJiYgKHJocyA9IGxlbik7XG4gICAgcmV0dXJuIHRoZW4gPyB0aGVuKHNvdXJjZSwgbGhzLCByaHMpIDogW2xocywgcmhzXTtcbn1cbmNvbnN0IGlzTmFORmFzdCA9ICh2YWx1ZSkgPT4gdmFsdWUgIT09IHZhbHVlO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbGVtZW50Q29tcGFyYXRvcihzZWFyY2gpIHtcbiAgICBjb25zdCB0eXBlb2ZTZWFyY2ggPSB0eXBlb2Ygc2VhcmNoO1xuICAgIC8vIENvbXBhcmUgcHJpbWl0aXZlc1xuICAgIGlmICh0eXBlb2ZTZWFyY2ggIT09ICdvYmplY3QnIHx8IHNlYXJjaCA9PT0gbnVsbCkge1xuICAgICAgICAvLyBDb21wYXJlIE5hTlxuICAgICAgICBpZiAoaXNOYU5GYXN0KHNlYXJjaCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpc05hTkZhc3Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh2YWx1ZSkgPT4gdmFsdWUgPT09IHNlYXJjaDtcbiAgICB9XG4gICAgLy8gQ29tcGFyZSBEYXRlc1xuICAgIGlmIChzZWFyY2ggaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlT2ZTZWFyY2ggPSBzZWFyY2gudmFsdWVPZigpO1xuICAgICAgICByZXR1cm4gKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyAodmFsdWUudmFsdWVPZigpID09PSB2YWx1ZU9mU2VhcmNoKSA6IGZhbHNlO1xuICAgIH1cbiAgICAvLyBDb21wYXJlIFR5cGVkQXJyYXlzXG4gICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhzZWFyY2gpKSB7XG4gICAgICAgIHJldHVybiAodmFsdWUpID0+IHZhbHVlID8gY29tcGFyZUFycmF5TGlrZShzZWFyY2gsIHZhbHVlKSA6IGZhbHNlO1xuICAgIH1cbiAgICAvLyBDb21wYXJlIE1hcHMgYW5kIFJvd3NcbiAgICBpZiAoc2VhcmNoIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVNYXBDb21wYXJhdG9yKHNlYXJjaCk7XG4gICAgfVxuICAgIC8vIENvbXBhcmUgQXJyYXktbGlrZXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzZWFyY2gpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVBcnJheUxpa2VDb21wYXJhdG9yKHNlYXJjaCk7XG4gICAgfVxuICAgIC8vIENvbXBhcmUgVmVjdG9yc1xuICAgIGlmIChzZWFyY2ggaW5zdGFuY2VvZiBWZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVZlY3RvckNvbXBhcmF0b3Ioc2VhcmNoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZU9iamVjdENvbXBhcmF0b3Ioc2VhcmNoLCB0cnVlKTtcbiAgICAvLyBDb21wYXJlIG5vbi1lbXB0eSBPYmplY3RzXG4gICAgLy8gcmV0dXJuIGNyZWF0ZU9iamVjdENvbXBhcmF0b3Ioc2VhcmNoLCBzZWFyY2ggaW5zdGFuY2VvZiBQcm94eSk7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gY3JlYXRlQXJyYXlMaWtlQ29tcGFyYXRvcihsaHMpIHtcbiAgICBjb25zdCBjb21wYXJhdG9ycyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAtMSwgbiA9IGxocy5sZW5ndGg7ICsraSA8IG47KSB7XG4gICAgICAgIGNvbXBhcmF0b3JzW2ldID0gY3JlYXRlRWxlbWVudENvbXBhcmF0b3IobGhzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZVN1YkVsZW1lbnRzQ29tcGFyYXRvcihjb21wYXJhdG9ycyk7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gY3JlYXRlTWFwQ29tcGFyYXRvcihsaHMpIHtcbiAgICBsZXQgaSA9IC0xO1xuICAgIGNvbnN0IGNvbXBhcmF0b3JzID0gW107XG4gICAgZm9yIChjb25zdCB2IG9mIGxocy52YWx1ZXMoKSlcbiAgICAgICAgY29tcGFyYXRvcnNbKytpXSA9IGNyZWF0ZUVsZW1lbnRDb21wYXJhdG9yKHYpO1xuICAgIHJldHVybiBjcmVhdGVTdWJFbGVtZW50c0NvbXBhcmF0b3IoY29tcGFyYXRvcnMpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGNyZWF0ZVZlY3RvckNvbXBhcmF0b3IobGhzKSB7XG4gICAgY29uc3QgY29tcGFyYXRvcnMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gLTEsIG4gPSBsaHMubGVuZ3RoOyArK2kgPCBuOykge1xuICAgICAgICBjb21wYXJhdG9yc1tpXSA9IGNyZWF0ZUVsZW1lbnRDb21wYXJhdG9yKGxocy5nZXQoaSkpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlU3ViRWxlbWVudHNDb21wYXJhdG9yKGNvbXBhcmF0b3JzKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBjcmVhdGVPYmplY3RDb21wYXJhdG9yKGxocywgYWxsb3dFbXB0eSA9IGZhbHNlKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGxocyk7XG4gICAgLy8gT25seSBjb21wYXJlIG5vbi1lbXB0eSBPYmplY3RzXG4gICAgaWYgKCFhbGxvd0VtcHR5ICYmIGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAoKSA9PiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY29tcGFyYXRvcnMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gLTEsIG4gPSBrZXlzLmxlbmd0aDsgKytpIDwgbjspIHtcbiAgICAgICAgY29tcGFyYXRvcnNbaV0gPSBjcmVhdGVFbGVtZW50Q29tcGFyYXRvcihsaHNba2V5c1tpXV0pO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlU3ViRWxlbWVudHNDb21wYXJhdG9yKGNvbXBhcmF0b3JzLCBrZXlzKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVN1YkVsZW1lbnRzQ29tcGFyYXRvcihjb21wYXJhdG9ycywga2V5cykge1xuICAgIHJldHVybiAocmhzKSA9PiB7XG4gICAgICAgIGlmICghcmhzIHx8IHR5cGVvZiByaHMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChyaHMuY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIGNhc2UgQXJyYXk6IHJldHVybiBjb21wYXJlQXJyYXkoY29tcGFyYXRvcnMsIHJocyk7XG4gICAgICAgICAgICBjYXNlIE1hcDpcbiAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZU9iamVjdChjb21wYXJhdG9ycywgcmhzLCByaHMua2V5cygpKTtcbiAgICAgICAgICAgIGNhc2UgTWFwUm93OlxuICAgICAgICAgICAgY2FzZSBTdHJ1Y3RSb3c6XG4gICAgICAgICAgICBjYXNlIE9iamVjdDpcbiAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOiAvLyBzdXBwb3J0IGBPYmplY3QuY3JlYXRlKG51bGwpYCBvYmplY3RzXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVPYmplY3QoY29tcGFyYXRvcnMsIHJocywga2V5cyB8fCBPYmplY3Qua2V5cyhyaHMpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmhzIGluc3RhbmNlb2YgVmVjdG9yID8gY29tcGFyZVZlY3Rvcihjb21wYXJhdG9ycywgcmhzKSA6IGZhbHNlO1xuICAgIH07XG59XG5mdW5jdGlvbiBjb21wYXJlQXJyYXkoY29tcGFyYXRvcnMsIGFycikge1xuICAgIGNvbnN0IG4gPSBjb21wYXJhdG9ycy5sZW5ndGg7XG4gICAgaWYgKGFyci5sZW5ndGggIT09IG4pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gLTE7ICsraSA8IG47KSB7XG4gICAgICAgIGlmICghKGNvbXBhcmF0b3JzW2ldKGFycltpXSkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBjb21wYXJlVmVjdG9yKGNvbXBhcmF0b3JzLCB2ZWMpIHtcbiAgICBjb25zdCBuID0gY29tcGFyYXRvcnMubGVuZ3RoO1xuICAgIGlmICh2ZWMubGVuZ3RoICE9PSBuKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IC0xOyArK2kgPCBuOykge1xuICAgICAgICBpZiAoIShjb21wYXJhdG9yc1tpXSh2ZWMuZ2V0KGkpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVPYmplY3QoY29tcGFyYXRvcnMsIG9iaiwga2V5cykge1xuICAgIGNvbnN0IGxLZXlJdHIgPSBrZXlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICBjb25zdCByS2V5SXRyID0gb2JqIGluc3RhbmNlb2YgTWFwID8gb2JqLmtleXMoKSA6IE9iamVjdC5rZXlzKG9iailbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgIGNvbnN0IHJWYWxJdHIgPSBvYmogaW5zdGFuY2VvZiBNYXAgPyBvYmoudmFsdWVzKCkgOiBPYmplY3QudmFsdWVzKG9iailbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgIGxldCBpID0gMDtcbiAgICBjb25zdCBuID0gY29tcGFyYXRvcnMubGVuZ3RoO1xuICAgIGxldCByVmFsID0gclZhbEl0ci5uZXh0KCk7XG4gICAgbGV0IGxLZXkgPSBsS2V5SXRyLm5leHQoKTtcbiAgICBsZXQgcktleSA9IHJLZXlJdHIubmV4dCgpO1xuICAgIGZvciAoOyBpIDwgbiAmJiAhbEtleS5kb25lICYmICFyS2V5LmRvbmUgJiYgIXJWYWwuZG9uZTsgKytpLCBsS2V5ID0gbEtleUl0ci5uZXh0KCksIHJLZXkgPSByS2V5SXRyLm5leHQoKSwgclZhbCA9IHJWYWxJdHIubmV4dCgpKSB7XG4gICAgICAgIGlmIChsS2V5LnZhbHVlICE9PSByS2V5LnZhbHVlIHx8ICFjb21wYXJhdG9yc1tpXShyVmFsLnZhbHVlKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGkgPT09IG4gJiYgbEtleS5kb25lICYmIHJLZXkuZG9uZSAmJiByVmFsLmRvbmUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGxLZXlJdHIucmV0dXJuICYmIGxLZXlJdHIucmV0dXJuKCk7XG4gICAgcktleUl0ci5yZXR1cm4gJiYgcktleUl0ci5yZXR1cm4oKTtcbiAgICByVmFsSXRyLnJldHVybiAmJiByVmFsSXRyLnJldHVybigpO1xuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmVjdG9yLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxudmFyIF9hO1xuaW1wb3J0IHsgVHlwZSB9IGZyb20gJy4vZW51bS5tanMnO1xuaW1wb3J0IHsgY2xhbXBSYW5nZSB9IGZyb20gJy4vdXRpbC92ZWN0b3IubWpzJztcbmltcG9ydCB7IERhdGFUeXBlLCBzdHJpZGVGb3JUeXBlIH0gZnJvbSAnLi90eXBlLm1qcyc7XG5pbXBvcnQgeyBEYXRhLCBtYWtlRGF0YSB9IGZyb20gJy4vZGF0YS5tanMnO1xuaW1wb3J0IHsgaXNDaHVua2VkVmFsaWQsIGNvbXB1dGVDaHVua09mZnNldHMsIGNvbXB1dGVDaHVua051bGxDb3VudHMsIHNsaWNlQ2h1bmtzLCB3cmFwQ2h1bmtlZENhbGwxLCB3cmFwQ2h1bmtlZENhbGwyLCB3cmFwQ2h1bmtlZEluZGV4T2YsIH0gZnJvbSAnLi91dGlsL2NodW5rLm1qcyc7XG5pbXBvcnQgeyBpbnN0YW5jZSBhcyBnZXRWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yL2dldC5tanMnO1xuaW1wb3J0IHsgaW5zdGFuY2UgYXMgc2V0VmlzaXRvciB9IGZyb20gJy4vdmlzaXRvci9zZXQubWpzJztcbmltcG9ydCB7IGluc3RhbmNlIGFzIGluZGV4T2ZWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yL2luZGV4b2YubWpzJztcbmltcG9ydCB7IGluc3RhbmNlIGFzIGl0ZXJhdG9yVmlzaXRvciB9IGZyb20gJy4vdmlzaXRvci9pdGVyYXRvci5tanMnO1xuaW1wb3J0IHsgaW5zdGFuY2UgYXMgYnl0ZUxlbmd0aFZpc2l0b3IgfSBmcm9tICcuL3Zpc2l0b3IvYnl0ZWxlbmd0aC5tanMnO1xuY29uc3QgdmlzaXRvcnNCeVR5cGVJZCA9IHt9O1xuY29uc3QgdmVjdG9yUHJvdG90eXBlc0J5VHlwZUlkID0ge307XG4vKipcbiAqIEFycmF5LWxpa2UgZGF0YSBzdHJ1Y3R1cmUuIFVzZSB0aGUgY29udmVuaWVuY2UgbWV0aG9kIHtAbGluayBtYWtlVmVjdG9yfSBhbmQge0BsaW5rIHZlY3RvckZyb21BcnJheX0gdG8gY3JlYXRlIHZlY3RvcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBWZWN0b3Ige1xuICAgIGNvbnN0cnVjdG9yKGlucHV0KSB7XG4gICAgICAgIHZhciBfYiwgX2MsIF9kO1xuICAgICAgICBjb25zdCBkYXRhID0gaW5wdXRbMF0gaW5zdGFuY2VvZiBWZWN0b3JcbiAgICAgICAgICAgID8gaW5wdXQuZmxhdE1hcCh4ID0+IHguZGF0YSlcbiAgICAgICAgICAgIDogaW5wdXQ7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCB8fCBkYXRhLnNvbWUoKHgpID0+ICEoeCBpbnN0YW5jZW9mIERhdGEpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVmVjdG9yIGNvbnN0cnVjdG9yIGV4cGVjdHMgYW4gQXJyYXkgb2YgRGF0YSBpbnN0YW5jZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHlwZSA9IChfYiA9IGRhdGFbMF0pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi50eXBlO1xuICAgICAgICBzd2l0Y2ggKGRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgdGhpcy5fb2Zmc2V0cyA9IFswXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMToge1xuICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgdW5jaHVua2VkIHZlY3RvcnNcbiAgICAgICAgICAgICAgICBjb25zdCB7IGdldCwgc2V0LCBpbmRleE9mLCBieXRlTGVuZ3RoIH0gPSB2aXNpdG9yc0J5VHlwZUlkW3R5cGUudHlwZUlkXTtcbiAgICAgICAgICAgICAgICBjb25zdCB1bmNodW5rZWREYXRhID0gZGF0YVswXTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzVmFsaWQgPSAoaW5kZXgpID0+IGlzQ2h1bmtlZFZhbGlkKHVuY2h1bmtlZERhdGEsIGluZGV4KTtcbiAgICAgICAgICAgICAgICB0aGlzLmdldCA9IChpbmRleCkgPT4gZ2V0KHVuY2h1bmtlZERhdGEsIGluZGV4KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldCA9IChpbmRleCwgdmFsdWUpID0+IHNldCh1bmNodW5rZWREYXRhLCBpbmRleCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhPZiA9IChpbmRleCkgPT4gaW5kZXhPZih1bmNodW5rZWREYXRhLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRCeXRlTGVuZ3RoID0gKGluZGV4KSA9PiBieXRlTGVuZ3RoKHVuY2h1bmtlZERhdGEsIGluZGV4KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vZmZzZXRzID0gWzAsIHVuY2h1bmtlZERhdGEubGVuZ3RoXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIHZlY3RvclByb3RvdHlwZXNCeVR5cGVJZFt0eXBlLnR5cGVJZF0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX29mZnNldHMgPSBjb21wdXRlQ2h1bmtPZmZzZXRzKGRhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuc3RyaWRlID0gc3RyaWRlRm9yVHlwZSh0eXBlKTtcbiAgICAgICAgdGhpcy5udW1DaGlsZHJlbiA9IChfZCA9IChfYyA9IHR5cGUuY2hpbGRyZW4pID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5sZW5ndGgpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDA7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5fb2Zmc2V0c1t0aGlzLl9vZmZzZXRzLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYWdncmVnYXRlIHNpemUgKGluIGJ5dGVzKSBvZiB0aGlzIFZlY3RvcidzIGJ1ZmZlcnMgYW5kL29yIGNoaWxkIFZlY3RvcnMuXG4gICAgICovXG4gICAgZ2V0IGJ5dGVMZW5ndGgoKSB7XG4gICAgICAgIGlmICh0aGlzLl9ieXRlTGVuZ3RoID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5fYnl0ZUxlbmd0aCA9IHRoaXMuZGF0YS5yZWR1Y2UoKGJ5dGVMZW5ndGgsIGRhdGEpID0+IGJ5dGVMZW5ndGggKyBkYXRhLmJ5dGVMZW5ndGgsIDApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ieXRlTGVuZ3RoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG51bGwgZWxlbWVudHMgaW4gdGhpcyBWZWN0b3IuXG4gICAgICovXG4gICAgZ2V0IG51bGxDb3VudCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX251bGxDb3VudCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuX251bGxDb3VudCA9IGNvbXB1dGVDaHVua051bGxDb3VudHModGhpcy5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbnVsbENvdW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgQXJyYXkgb3IgVHlwZWRBcmF5IGNvbnN0cnVjdG9yIHVzZWQgZm9yIHRoZSBKUyByZXByZXNlbnRhdGlvblxuICAgICAqICBvZiB0aGUgZWxlbWVudCdzIHZhbHVlcyBpbiB7QGxpbmsgVmVjdG9yLnByb3RvdHlwZS50b0FycmF5IGB0b0FycmF5KClgfS5cbiAgICAgKi9cbiAgICBnZXQgQXJyYXlUeXBlKCkgeyByZXR1cm4gdGhpcy50eXBlLkFycmF5VHlwZTsgfVxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIHRoYXQgc2hvdWxkIGJlIHByaW50ZWQgd2hlbiB0aGUgVmVjdG9yIGlzIGxvZ2dlZCBpbiBhIG1lc3NhZ2UuXG4gICAgICovXG4gICAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5WZWN0b3JOYW1lfTwke3RoaXMudHlwZVtTeW1ib2wudG9TdHJpbmdUYWddfT5gO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGlzIFZlY3Rvci5cbiAgICAgKi9cbiAgICBnZXQgVmVjdG9yTmFtZSgpIHsgcmV0dXJuIGAke1R5cGVbdGhpcy50eXBlLnR5cGVJZF19VmVjdG9yYDsgfVxuICAgIC8qKlxuICAgICAqIENoZWNrIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBudWxsLlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdG8gcmVhZCB0aGUgdmFsaWRpdHkgYml0bWFwLlxuICAgICAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpc1ZhbGlkKGluZGV4KSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKlxuICAgICAqIEdldCBhbiBlbGVtZW50IHZhbHVlIGJ5IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmVhZC5cbiAgICAgKi9cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgZ2V0KGluZGV4KSB7IHJldHVybiBudWxsOyB9XG4gICAgLyoqXG4gICAgICogU2V0IGFuIGVsZW1lbnQgdmFsdWUgYnkgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKi9cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgc2V0KGluZGV4LCB2YWx1ZSkgeyByZXR1cm47IH1cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYSB2YWx1ZSBpbiBhbiBWZWN0b3IuXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIHZhbHVlIHRvIGxvY2F0ZSBpbiB0aGUgVmVjdG9yLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIGluZGV4IGF0IHdoaWNoIHRvIGJlZ2luIHRoZSBzZWFyY2guIElmIG9mZnNldCBpcyBvbWl0dGVkLCB0aGUgc2VhcmNoIHN0YXJ0cyBhdCBpbmRleCAwLlxuICAgICAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpbmRleE9mKGVsZW1lbnQsIG9mZnNldCkgeyByZXR1cm4gLTE7IH1cbiAgICBpbmNsdWRlcyhlbGVtZW50LCBvZmZzZXQpIHsgcmV0dXJuIHRoaXMuaW5kZXhPZihlbGVtZW50LCBvZmZzZXQpID4gMDsgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBlbGVtZW50IGJ5IGluZGV4LlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdG8gZ2V0IHRoZSBieXRlTGVuZ3RoLlxuICAgICAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBnZXRCeXRlTGVuZ3RoKGluZGV4KSB7IHJldHVybiAwOyB9XG4gICAgLyoqXG4gICAgICogSXRlcmF0b3IgZm9yIHRoZSBWZWN0b3IncyBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yVmlzaXRvci52aXNpdCh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tYmluZXMgdHdvIG9yIG1vcmUgVmVjdG9ycyBvZiB0aGUgc2FtZSB0eXBlLlxuICAgICAqIEBwYXJhbSBvdGhlcnMgQWRkaXRpb25hbCBWZWN0b3JzIHRvIGFkZCB0byB0aGUgZW5kIG9mIHRoaXMgVmVjdG9yLlxuICAgICAqL1xuICAgIGNvbmNhdCguLi5vdGhlcnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IodGhpcy5kYXRhLmNvbmNhdChvdGhlcnMuZmxhdE1hcCgoeCkgPT4geC5kYXRhKS5mbGF0KE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgemVyby1jb3B5IHN1Yi1zZWN0aW9uIG9mIHRoaXMgVmVjdG9yLlxuICAgICAqIEBwYXJhbSBzdGFydCBUaGUgYmVnaW5uaW5nIG9mIHRoZSBzcGVjaWZpZWQgcG9ydGlvbiBvZiB0aGUgVmVjdG9yLlxuICAgICAqIEBwYXJhbSBlbmQgVGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIHBvcnRpb24gb2YgdGhlIFZlY3Rvci4gVGhpcyBpcyBleGNsdXNpdmUgb2YgdGhlIGVsZW1lbnQgYXQgdGhlIGluZGV4ICdlbmQnLlxuICAgICAqL1xuICAgIHNsaWNlKGJlZ2luLCBlbmQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IoY2xhbXBSYW5nZSh0aGlzLCBiZWdpbiwgZW5kLCAoeyBkYXRhLCBfb2Zmc2V0cyB9LCBiZWdpbiwgZW5kKSA9PiBzbGljZUNodW5rcyhkYXRhLCBfb2Zmc2V0cywgYmVnaW4sIGVuZCkpKTtcbiAgICB9XG4gICAgdG9KU09OKCkgeyByZXR1cm4gWy4uLnRoaXNdOyB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgSmF2YVNjcmlwdCBBcnJheSBvciBUeXBlZEFycmF5IG9mIHRoZSBWZWN0b3IncyBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEBub3RlIElmIHRoaXMgVmVjdG9yIGNvbnRhaW5zIGEgc2luZ2xlIERhdGEgY2h1bmsgYW5kIHRoZSBWZWN0b3IncyB0eXBlIGlzIGFcbiAgICAgKiAgcHJpbWl0aXZlIG51bWVyaWMgdHlwZSBjb3JyZXNwb25kaW5nIHRvIG9uZSBvZiB0aGUgSmF2YVNjcmlwdCBUeXBlZEFycmF5cywgdGhpc1xuICAgICAqICBtZXRob2QgcmV0dXJucyBhIHplcm8tY29weSBzbGljZSBvZiB0aGUgdW5kZXJseWluZyBUeXBlZEFycmF5IHZhbHVlcy4gSWYgdGhlcmUnc1xuICAgICAqICBtb3JlIHRoYW4gb25lIGNodW5rLCB0aGUgcmVzdWx0aW5nIFR5cGVkQXJyYXkgd2lsbCBiZSBhIGNvcHkgb2YgdGhlIGRhdGEgZnJvbSBlYWNoXG4gICAgICogIGNodW5rJ3MgdW5kZXJseWluZyBUeXBlZEFycmF5IHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFuIEFycmF5IG9yIFR5cGVkQXJyYXkgb2YgdGhlIFZlY3RvcidzIGVsZW1lbnRzLCBiYXNlZCBvbiB0aGUgVmVjdG9yJ3MgRGF0YVR5cGUuXG4gICAgICovXG4gICAgdG9BcnJheSgpIHtcbiAgICAgICAgY29uc3QgeyB0eXBlLCBkYXRhLCBsZW5ndGgsIHN0cmlkZSwgQXJyYXlUeXBlIH0gPSB0aGlzO1xuICAgICAgICAvLyBGYXN0IGNhc2UsIHJldHVybiBzdWJhcnJheSBpZiBwb3NzaWJsZVxuICAgICAgICBzd2l0Y2ggKHR5cGUudHlwZUlkKSB7XG4gICAgICAgICAgICBjYXNlIFR5cGUuSW50OlxuICAgICAgICAgICAgY2FzZSBUeXBlLkZsb2F0OlxuICAgICAgICAgICAgY2FzZSBUeXBlLkRlY2ltYWw6XG4gICAgICAgICAgICBjYXNlIFR5cGUuVGltZTpcbiAgICAgICAgICAgIGNhc2UgVHlwZS5UaW1lc3RhbXA6XG4gICAgICAgICAgICAgICAgc3dpdGNoIChkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgQXJyYXlUeXBlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIGRhdGFbMF0udmFsdWVzLnN1YmFycmF5KDAsIGxlbmd0aCAqIHN0cmlkZSk7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBkYXRhLnJlZHVjZSgobWVtbywgeyB2YWx1ZXMgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVtby5hcnJheS5zZXQodmFsdWVzLCBtZW1vLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZW1vLm9mZnNldCArPSB2YWx1ZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lbW87XG4gICAgICAgICAgICAgICAgICAgIH0sIHsgYXJyYXk6IG5ldyBBcnJheVR5cGUobGVuZ3RoICogc3RyaWRlKSwgb2Zmc2V0OiAwIH0pLmFycmF5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UgaWYgbm90IHByaW1pdGl2ZSwgc2xvdyBjb3B5XG4gICAgICAgIHJldHVybiBbLi4udGhpc107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFZlY3Rvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBWZWN0b3IuXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgWyR7Wy4uLnRoaXNdLmpvaW4oJywnKX1dYDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNoaWxkIFZlY3RvciBieSBuYW1lLCBvciBudWxsIGlmIHRoaXMgVmVjdG9yIGhhcyBubyBjaGlsZCB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjaGlsZCB0byByZXRyaWV2ZS5cbiAgICAgKi9cbiAgICBnZXRDaGlsZChuYW1lKSB7XG4gICAgICAgIHZhciBfYjtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hpbGRBdCgoX2IgPSB0aGlzLnR5cGUuY2hpbGRyZW4pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kSW5kZXgoKGYpID0+IGYubmFtZSA9PT0gbmFtZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY2hpbGQgVmVjdG9yIGJ5IGluZGV4LCBvciBudWxsIGlmIHRoaXMgVmVjdG9yIGhhcyBubyBjaGlsZCBhdCB0aGUgc3VwcGxpZWQgaW5kZXguXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gcmV0cmlldmUuXG4gICAgICovXG4gICAgZ2V0Q2hpbGRBdChpbmRleCkge1xuICAgICAgICBpZiAoaW5kZXggPiAtMSAmJiBpbmRleCA8IHRoaXMubnVtQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yKHRoaXMuZGF0YS5tYXAoKHsgY2hpbGRyZW4gfSkgPT4gY2hpbGRyZW5baW5kZXhdKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGdldCBpc01lbW9pemVkKCkge1xuICAgICAgICBpZiAoRGF0YVR5cGUuaXNEaWN0aW9uYXJ5KHRoaXMudHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFbMF0uZGljdGlvbmFyeS5pc01lbW9pemVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBtZW1vaXphdGlvbiB0byB0aGUgVmVjdG9yJ3Mge0BsaW5rIGdldH0gbWV0aG9kLiBGb3IgZGljdGlvbmFyeVxuICAgICAqIHZlY3RvcnMsIHRoaXMgbWV0aG9kIHJldHVybiBhIHZlY3RvciB0aGF0IG1lbW9pemVzIG9ubHkgdGhlIGRpY3Rpb25hcnlcbiAgICAgKiB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBNZW1vaXphdGlvbiBpcyB2ZXJ5IHVzZWZ1bCB3aGVuIGRlY29kaW5nIGEgdmFsdWUgaXMgZXhwZW5zaXZlIHN1Y2ggYXNcbiAgICAgKiBVZnQ4LiBUaGUgbWVtb2l6YXRpb24gY3JlYXRlcyBhIGNhY2hlIG9mIHRoZSBzaXplIG9mIHRoZSBWZWN0b3IgYW5kXG4gICAgICogdGhlcmZvcmUgaW5jcmVhc2VzIG1lbW9yeSB1c2FnZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgbmV3IHZlY3RvciB0aGF0IG1lbW9pemVzIGNhbGxzIHRvIHtAbGluayBnZXR9LlxuICAgICAqL1xuICAgIG1lbW9pemUoKSB7XG4gICAgICAgIGlmIChEYXRhVHlwZS5pc0RpY3Rpb25hcnkodGhpcy50eXBlKSkge1xuICAgICAgICAgICAgY29uc3QgZGljdGlvbmFyeSA9IG5ldyBNZW1vaXplZFZlY3Rvcih0aGlzLmRhdGFbMF0uZGljdGlvbmFyeSk7XG4gICAgICAgICAgICBjb25zdCBuZXdEYXRhID0gdGhpcy5kYXRhLm1hcCgoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsb25lZCA9IGRhdGEuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICBjbG9uZWQuZGljdGlvbmFyeSA9IGRpY3Rpb25hcnk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsb25lZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IobmV3RGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNZW1vaXplZFZlY3Rvcih0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHZlY3RvciB3aXRob3V0IG1lbW9pemF0aW9uIG9mIHRoZSB7QGxpbmsgZ2V0fSBtZXRob2QuIElmIHRoaXNcbiAgICAgKiB2ZWN0b3IgaXMgbm90IG1lbW9pemVkLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoaXMgdmVjdG9yLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBhIHZlY3RvciB3aXRob3V0IG1lbW9pemF0aW9uLlxuICAgICAqL1xuICAgIHVubWVtb2l6ZSgpIHtcbiAgICAgICAgaWYgKERhdGFUeXBlLmlzRGljdGlvbmFyeSh0aGlzLnR5cGUpICYmIHRoaXMuaXNNZW1vaXplZCkge1xuICAgICAgICAgICAgY29uc3QgZGljdGlvbmFyeSA9IHRoaXMuZGF0YVswXS5kaWN0aW9uYXJ5LnVubWVtb2l6ZSgpO1xuICAgICAgICAgICAgY29uc3QgbmV3RGF0YSA9IHRoaXMuZGF0YS5tYXAoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdEYXRhID0gZGF0YS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIG5ld0RhdGEuZGljdGlvbmFyeSA9IGRpY3Rpb25hcnk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ld0RhdGE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yKG5ld0RhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbl9hID0gU3ltYm9sLnRvU3RyaW5nVGFnO1xuLy8gSW5pdGlhbGl6ZSB0aGlzIHN0YXRpYyBwcm9wZXJ0eSB2aWEgYW4gSUlGRSBzbyBidW5kbGVycyBkb24ndCB0cmVlLXNoYWtlXG4vLyBvdXQgdGhpcyBsb2dpYywgYnV0IGFsc28gc28gd2UncmUgc3RpbGwgY29tcGxpYW50IHdpdGggYFwic2lkZUVmZmVjdHNcIjogZmFsc2VgXG5WZWN0b3JbX2FdID0gKChwcm90bykgPT4ge1xuICAgIHByb3RvLnR5cGUgPSBEYXRhVHlwZS5wcm90b3R5cGU7XG4gICAgcHJvdG8uZGF0YSA9IFtdO1xuICAgIHByb3RvLmxlbmd0aCA9IDA7XG4gICAgcHJvdG8uc3RyaWRlID0gMTtcbiAgICBwcm90by5udW1DaGlsZHJlbiA9IDA7XG4gICAgcHJvdG8uX251bGxDb3VudCA9IC0xO1xuICAgIHByb3RvLl9ieXRlTGVuZ3RoID0gLTE7XG4gICAgcHJvdG8uX29mZnNldHMgPSBuZXcgVWludDMyQXJyYXkoWzBdKTtcbiAgICBwcm90b1tTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlXSA9IHRydWU7XG4gICAgY29uc3QgdHlwZUlkcyA9IE9iamVjdC5rZXlzKFR5cGUpXG4gICAgICAgIC5tYXAoKFQpID0+IFR5cGVbVF0pXG4gICAgICAgIC5maWx0ZXIoKFQpID0+IHR5cGVvZiBUID09PSAnbnVtYmVyJyAmJiBUICE9PSBUeXBlLk5PTkUpO1xuICAgIGZvciAoY29uc3QgdHlwZUlkIG9mIHR5cGVJZHMpIHtcbiAgICAgICAgY29uc3QgZ2V0ID0gZ2V0VmlzaXRvci5nZXRWaXNpdEZuQnlUeXBlSWQodHlwZUlkKTtcbiAgICAgICAgY29uc3Qgc2V0ID0gc2V0VmlzaXRvci5nZXRWaXNpdEZuQnlUeXBlSWQodHlwZUlkKTtcbiAgICAgICAgY29uc3QgaW5kZXhPZiA9IGluZGV4T2ZWaXNpdG9yLmdldFZpc2l0Rm5CeVR5cGVJZCh0eXBlSWQpO1xuICAgICAgICBjb25zdCBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFZpc2l0b3IuZ2V0VmlzaXRGbkJ5VHlwZUlkKHR5cGVJZCk7XG4gICAgICAgIHZpc2l0b3JzQnlUeXBlSWRbdHlwZUlkXSA9IHsgZ2V0LCBzZXQsIGluZGV4T2YsIGJ5dGVMZW5ndGggfTtcbiAgICAgICAgdmVjdG9yUHJvdG90eXBlc0J5VHlwZUlkW3R5cGVJZF0gPSBPYmplY3QuY3JlYXRlKHByb3RvLCB7XG4gICAgICAgICAgICBbJ2lzVmFsaWQnXTogeyB2YWx1ZTogd3JhcENodW5rZWRDYWxsMShpc0NodW5rZWRWYWxpZCkgfSxcbiAgICAgICAgICAgIFsnZ2V0J106IHsgdmFsdWU6IHdyYXBDaHVua2VkQ2FsbDEoZ2V0VmlzaXRvci5nZXRWaXNpdEZuQnlUeXBlSWQodHlwZUlkKSkgfSxcbiAgICAgICAgICAgIFsnc2V0J106IHsgdmFsdWU6IHdyYXBDaHVua2VkQ2FsbDIoc2V0VmlzaXRvci5nZXRWaXNpdEZuQnlUeXBlSWQodHlwZUlkKSkgfSxcbiAgICAgICAgICAgIFsnaW5kZXhPZiddOiB7IHZhbHVlOiB3cmFwQ2h1bmtlZEluZGV4T2YoaW5kZXhPZlZpc2l0b3IuZ2V0VmlzaXRGbkJ5VHlwZUlkKHR5cGVJZCkpIH0sXG4gICAgICAgICAgICBbJ2dldEJ5dGVMZW5ndGgnXTogeyB2YWx1ZTogd3JhcENodW5rZWRDYWxsMShieXRlTGVuZ3RoVmlzaXRvci5nZXRWaXNpdEZuQnlUeXBlSWQodHlwZUlkKSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiAnVmVjdG9yJztcbn0pKFZlY3Rvci5wcm90b3R5cGUpO1xuY2xhc3MgTWVtb2l6ZWRWZWN0b3IgZXh0ZW5kcyBWZWN0b3Ige1xuICAgIGNvbnN0cnVjdG9yKHZlY3Rvcikge1xuICAgICAgICBzdXBlcih2ZWN0b3IuZGF0YSk7XG4gICAgICAgIGNvbnN0IGdldCA9IHRoaXMuZ2V0O1xuICAgICAgICBjb25zdCBzZXQgPSB0aGlzLnNldDtcbiAgICAgICAgY29uc3Qgc2xpY2UgPSB0aGlzLnNsaWNlO1xuICAgICAgICBjb25zdCBjYWNoZSA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZ2V0Jywge1xuICAgICAgICAgICAgdmFsdWUoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZWRWYWx1ZSA9IGNhY2hlW2luZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVkVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0LmNhbGwodGhpcywgaW5kZXgpO1xuICAgICAgICAgICAgICAgIGNhY2hlW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc2V0Jywge1xuICAgICAgICAgICAgdmFsdWUoaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc2V0LmNhbGwodGhpcywgaW5kZXgsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBjYWNoZVtpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc2xpY2UnLCB7XG4gICAgICAgICAgICB2YWx1ZTogKGJlZ2luLCBlbmQpID0+IG5ldyBNZW1vaXplZFZlY3RvcihzbGljZS5jYWxsKHRoaXMsIGJlZ2luLCBlbmQpKVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdpc01lbW9pemVkJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd1bm1lbW9pemUnLCB7XG4gICAgICAgICAgICB2YWx1ZTogKCkgPT4gbmV3IFZlY3Rvcih0aGlzLmRhdGEpXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ21lbW9pemUnLCB7XG4gICAgICAgICAgICB2YWx1ZTogKCkgPT4gdGhpc1xuICAgICAgICB9KTtcbiAgICB9XG59XG5pbXBvcnQgKiBhcyBkdHlwZXMgZnJvbSAnLi90eXBlLm1qcyc7XG5leHBvcnQgZnVuY3Rpb24gbWFrZVZlY3Rvcihpbml0KSB7XG4gICAgaWYgKGluaXQpIHtcbiAgICAgICAgaWYgKGluaXQgaW5zdGFuY2VvZiBEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFZlY3RvcihbaW5pdF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbml0IGluc3RhbmNlb2YgVmVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFZlY3Rvcihpbml0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbml0LnR5cGUgaW5zdGFuY2VvZiBEYXRhVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IoW21ha2VEYXRhKGluaXQpXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yKGluaXQuZmxhdE1hcCh2ID0+IHVud3JhcElucHV0cyh2KSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoaW5pdCkpIHtcbiAgICAgICAgICAgIGlmIChpbml0IGluc3RhbmNlb2YgRGF0YVZpZXcpIHtcbiAgICAgICAgICAgICAgICBpbml0ID0gbmV3IFVpbnQ4QXJyYXkoaW5pdC5idWZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB7IG9mZnNldDogMCwgbGVuZ3RoOiBpbml0Lmxlbmd0aCwgbnVsbENvdW50OiAwLCBkYXRhOiBpbml0IH07XG4gICAgICAgICAgICBpZiAoaW5pdCBpbnN0YW5jZW9mIEludDhBcnJheSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yKFttYWtlRGF0YShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByb3BzKSwgeyB0eXBlOiBuZXcgZHR5cGVzLkludDggfSkpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5pdCBpbnN0YW5jZW9mIEludDE2QXJyYXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFZlY3RvcihbbWFrZURhdGEoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcm9wcyksIHsgdHlwZTogbmV3IGR0eXBlcy5JbnQxNiB9KSldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbml0IGluc3RhbmNlb2YgSW50MzJBcnJheSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yKFttYWtlRGF0YShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByb3BzKSwgeyB0eXBlOiBuZXcgZHR5cGVzLkludDMyIH0pKV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGluaXQgaW5zdGFuY2VvZiBCaWdJbnQ2NEFycmF5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IoW21ha2VEYXRhKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMpLCB7IHR5cGU6IG5ldyBkdHlwZXMuSW50NjQgfSkpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5pdCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHwgaW5pdCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IoW21ha2VEYXRhKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMpLCB7IHR5cGU6IG5ldyBkdHlwZXMuVWludDggfSkpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5pdCBpbnN0YW5jZW9mIFVpbnQxNkFycmF5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IoW21ha2VEYXRhKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMpLCB7IHR5cGU6IG5ldyBkdHlwZXMuVWludDE2IH0pKV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGluaXQgaW5zdGFuY2VvZiBVaW50MzJBcnJheSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yKFttYWtlRGF0YShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByb3BzKSwgeyB0eXBlOiBuZXcgZHR5cGVzLlVpbnQzMiB9KSldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbml0IGluc3RhbmNlb2YgQmlnVWludDY0QXJyYXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFZlY3RvcihbbWFrZURhdGEoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcm9wcyksIHsgdHlwZTogbmV3IGR0eXBlcy5VaW50NjQgfSkpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5pdCBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yKFttYWtlRGF0YShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByb3BzKSwgeyB0eXBlOiBuZXcgZHR5cGVzLkZsb2F0MzIgfSkpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5pdCBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yKFttYWtlRGF0YShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByb3BzKSwgeyB0eXBlOiBuZXcgZHR5cGVzLkZsb2F0NjQgfSkpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VucmVjb2duaXplZCBpbnB1dCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignVW5yZWNvZ25pemVkIGlucHV0Jyk7XG59XG5mdW5jdGlvbiB1bndyYXBJbnB1dHMoeCkge1xuICAgIHJldHVybiB4IGluc3RhbmNlb2YgRGF0YSA/IFt4XSA6ICh4IGluc3RhbmNlb2YgVmVjdG9yID8geC5kYXRhIDogbWFrZVZlY3Rvcih4KS5kYXRhKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmVjdG9yLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgVHlwZSwgUHJlY2lzaW9uLCBEYXRlVW5pdCwgVGltZVVuaXQsIEludGVydmFsVW5pdCwgVW5pb25Nb2RlIH0gZnJvbSAnLi9lbnVtLm1qcyc7XG5pbXBvcnQgeyBEYXRhVHlwZSwgfSBmcm9tICcuL3R5cGUubWpzJztcbmV4cG9ydCBjbGFzcyBWaXNpdG9yIHtcbiAgICB2aXNpdE1hbnkobm9kZXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVzLm1hcCgobm9kZSwgaSkgPT4gdGhpcy52aXNpdChub2RlLCAuLi5hcmdzLm1hcCgoeCkgPT4geFtpXSkpKTtcbiAgICB9XG4gICAgdmlzaXQoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRWaXNpdEZuKGFyZ3NbMF0sIGZhbHNlKS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gICAgZ2V0VmlzaXRGbihub2RlLCB0aHJvd0lmTm90Rm91bmQgPSB0cnVlKSB7XG4gICAgICAgIHJldHVybiBnZXRWaXNpdEZuKHRoaXMsIG5vZGUsIHRocm93SWZOb3RGb3VuZCk7XG4gICAgfVxuICAgIGdldFZpc2l0Rm5CeVR5cGVJZCh0eXBlSWQsIHRocm93SWZOb3RGb3VuZCA9IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIGdldFZpc2l0Rm5CeVR5cGVJZCh0aGlzLCB0eXBlSWQsIHRocm93SWZOb3RGb3VuZCk7XG4gICAgfVxuICAgIHZpc2l0TnVsbChfbm9kZSwgLi4uX2FyZ3MpIHsgcmV0dXJuIG51bGw7IH1cbiAgICB2aXNpdEJvb2woX25vZGUsIC4uLl9hcmdzKSB7IHJldHVybiBudWxsOyB9XG4gICAgdmlzaXRJbnQoX25vZGUsIC4uLl9hcmdzKSB7IHJldHVybiBudWxsOyB9XG4gICAgdmlzaXRGbG9hdChfbm9kZSwgLi4uX2FyZ3MpIHsgcmV0dXJuIG51bGw7IH1cbiAgICB2aXNpdFV0ZjgoX25vZGUsIC4uLl9hcmdzKSB7IHJldHVybiBudWxsOyB9XG4gICAgdmlzaXRCaW5hcnkoX25vZGUsIC4uLl9hcmdzKSB7IHJldHVybiBudWxsOyB9XG4gICAgdmlzaXRGaXhlZFNpemVCaW5hcnkoX25vZGUsIC4uLl9hcmdzKSB7IHJldHVybiBudWxsOyB9XG4gICAgdmlzaXREYXRlKF9ub2RlLCAuLi5fYXJncykgeyByZXR1cm4gbnVsbDsgfVxuICAgIHZpc2l0VGltZXN0YW1wKF9ub2RlLCAuLi5fYXJncykgeyByZXR1cm4gbnVsbDsgfVxuICAgIHZpc2l0VGltZShfbm9kZSwgLi4uX2FyZ3MpIHsgcmV0dXJuIG51bGw7IH1cbiAgICB2aXNpdERlY2ltYWwoX25vZGUsIC4uLl9hcmdzKSB7IHJldHVybiBudWxsOyB9XG4gICAgdmlzaXRMaXN0KF9ub2RlLCAuLi5fYXJncykgeyByZXR1cm4gbnVsbDsgfVxuICAgIHZpc2l0U3RydWN0KF9ub2RlLCAuLi5fYXJncykgeyByZXR1cm4gbnVsbDsgfVxuICAgIHZpc2l0VW5pb24oX25vZGUsIC4uLl9hcmdzKSB7IHJldHVybiBudWxsOyB9XG4gICAgdmlzaXREaWN0aW9uYXJ5KF9ub2RlLCAuLi5fYXJncykgeyByZXR1cm4gbnVsbDsgfVxuICAgIHZpc2l0SW50ZXJ2YWwoX25vZGUsIC4uLl9hcmdzKSB7IHJldHVybiBudWxsOyB9XG4gICAgdmlzaXRGaXhlZFNpemVMaXN0KF9ub2RlLCAuLi5fYXJncykgeyByZXR1cm4gbnVsbDsgfVxuICAgIHZpc2l0TWFwKF9ub2RlLCAuLi5fYXJncykgeyByZXR1cm4gbnVsbDsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGdldFZpc2l0Rm4odmlzaXRvciwgbm9kZSwgdGhyb3dJZk5vdEZvdW5kID0gdHJ1ZSkge1xuICAgIGlmICh0eXBlb2Ygbm9kZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIGdldFZpc2l0Rm5CeVR5cGVJZCh2aXNpdG9yLCBub2RlLCB0aHJvd0lmTm90Rm91bmQpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG5vZGUgPT09ICdzdHJpbmcnICYmIChub2RlIGluIFR5cGUpKSB7XG4gICAgICAgIHJldHVybiBnZXRWaXNpdEZuQnlUeXBlSWQodmlzaXRvciwgVHlwZVtub2RlXSwgdGhyb3dJZk5vdEZvdW5kKTtcbiAgICB9XG4gICAgaWYgKG5vZGUgJiYgKG5vZGUgaW5zdGFuY2VvZiBEYXRhVHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGdldFZpc2l0Rm5CeVR5cGVJZCh2aXNpdG9yLCBpbmZlckRUeXBlKG5vZGUpLCB0aHJvd0lmTm90Rm91bmQpO1xuICAgIH1cbiAgICBpZiAoKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm9kZS50eXBlKSAmJiAobm9kZS50eXBlIGluc3RhbmNlb2YgRGF0YVR5cGUpKSB7XG4gICAgICAgIHJldHVybiBnZXRWaXNpdEZuQnlUeXBlSWQodmlzaXRvciwgaW5mZXJEVHlwZShub2RlLnR5cGUpLCB0aHJvd0lmTm90Rm91bmQpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0VmlzaXRGbkJ5VHlwZUlkKHZpc2l0b3IsIFR5cGUuTk9ORSwgdGhyb3dJZk5vdEZvdW5kKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBnZXRWaXNpdEZuQnlUeXBlSWQodmlzaXRvciwgZHR5cGUsIHRocm93SWZOb3RGb3VuZCA9IHRydWUpIHtcbiAgICBsZXQgZm4gPSBudWxsO1xuICAgIHN3aXRjaCAoZHR5cGUpIHtcbiAgICAgICAgY2FzZSBUeXBlLk51bGw6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXROdWxsO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5Cb29sOlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0Qm9vbDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuSW50OlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0SW50O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5JbnQ4OlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0SW50OCB8fCB2aXNpdG9yLnZpc2l0SW50O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5JbnQxNjpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdEludDE2IHx8IHZpc2l0b3IudmlzaXRJbnQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLkludDMyOlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0SW50MzIgfHwgdmlzaXRvci52aXNpdEludDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuSW50NjQ6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRJbnQ2NCB8fCB2aXNpdG9yLnZpc2l0SW50O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5VaW50ODpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdFVpbnQ4IHx8IHZpc2l0b3IudmlzaXRJbnQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLlVpbnQxNjpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdFVpbnQxNiB8fCB2aXNpdG9yLnZpc2l0SW50O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5VaW50MzI6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRVaW50MzIgfHwgdmlzaXRvci52aXNpdEludDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuVWludDY0OlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0VWludDY0IHx8IHZpc2l0b3IudmlzaXRJbnQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLkZsb2F0OlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0RmxvYXQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLkZsb2F0MTY6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRGbG9hdDE2IHx8IHZpc2l0b3IudmlzaXRGbG9hdDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuRmxvYXQzMjpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdEZsb2F0MzIgfHwgdmlzaXRvci52aXNpdEZsb2F0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5GbG9hdDY0OlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0RmxvYXQ2NCB8fCB2aXNpdG9yLnZpc2l0RmxvYXQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLlV0Zjg6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRVdGY4O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5CaW5hcnk6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRCaW5hcnk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLkZpeGVkU2l6ZUJpbmFyeTpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdEZpeGVkU2l6ZUJpbmFyeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuRGF0ZTpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdERhdGU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLkRhdGVEYXk6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXREYXRlRGF5IHx8IHZpc2l0b3IudmlzaXREYXRlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5EYXRlTWlsbGlzZWNvbmQ6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXREYXRlTWlsbGlzZWNvbmQgfHwgdmlzaXRvci52aXNpdERhdGU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLlRpbWVzdGFtcDpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdFRpbWVzdGFtcDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuVGltZXN0YW1wU2Vjb25kOlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0VGltZXN0YW1wU2Vjb25kIHx8IHZpc2l0b3IudmlzaXRUaW1lc3RhbXA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLlRpbWVzdGFtcE1pbGxpc2Vjb25kOlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0VGltZXN0YW1wTWlsbGlzZWNvbmQgfHwgdmlzaXRvci52aXNpdFRpbWVzdGFtcDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuVGltZXN0YW1wTWljcm9zZWNvbmQ6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRUaW1lc3RhbXBNaWNyb3NlY29uZCB8fCB2aXNpdG9yLnZpc2l0VGltZXN0YW1wO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5UaW1lc3RhbXBOYW5vc2Vjb25kOlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0VGltZXN0YW1wTmFub3NlY29uZCB8fCB2aXNpdG9yLnZpc2l0VGltZXN0YW1wO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5UaW1lOlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0VGltZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuVGltZVNlY29uZDpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdFRpbWVTZWNvbmQgfHwgdmlzaXRvci52aXNpdFRpbWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLlRpbWVNaWxsaXNlY29uZDpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdFRpbWVNaWxsaXNlY29uZCB8fCB2aXNpdG9yLnZpc2l0VGltZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuVGltZU1pY3Jvc2Vjb25kOlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0VGltZU1pY3Jvc2Vjb25kIHx8IHZpc2l0b3IudmlzaXRUaW1lO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5UaW1lTmFub3NlY29uZDpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdFRpbWVOYW5vc2Vjb25kIHx8IHZpc2l0b3IudmlzaXRUaW1lO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5EZWNpbWFsOlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0RGVjaW1hbDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuTGlzdDpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdExpc3Q7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLlN0cnVjdDpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdFN0cnVjdDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuVW5pb246XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRVbmlvbjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuRGVuc2VVbmlvbjpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdERlbnNlVW5pb24gfHwgdmlzaXRvci52aXNpdFVuaW9uO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5TcGFyc2VVbmlvbjpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdFNwYXJzZVVuaW9uIHx8IHZpc2l0b3IudmlzaXRVbmlvbjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuRGljdGlvbmFyeTpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdERpY3Rpb25hcnk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLkludGVydmFsOlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0SW50ZXJ2YWw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLkludGVydmFsRGF5VGltZTpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdEludGVydmFsRGF5VGltZSB8fCB2aXNpdG9yLnZpc2l0SW50ZXJ2YWw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLkludGVydmFsWWVhck1vbnRoOlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0SW50ZXJ2YWxZZWFyTW9udGggfHwgdmlzaXRvci52aXNpdEludGVydmFsO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5GaXhlZFNpemVMaXN0OlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0Rml4ZWRTaXplTGlzdDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuTWFwOlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0TWFwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpXG4gICAgICAgIHJldHVybiBmbjtcbiAgICBpZiAoIXRocm93SWZOb3RGb3VuZClcbiAgICAgICAgcmV0dXJuICgpID0+IG51bGw7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgdHlwZSAnJHtUeXBlW2R0eXBlXX0nYCk7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gaW5mZXJEVHlwZSh0eXBlKSB7XG4gICAgc3dpdGNoICh0eXBlLnR5cGVJZCkge1xuICAgICAgICBjYXNlIFR5cGUuTnVsbDogcmV0dXJuIFR5cGUuTnVsbDtcbiAgICAgICAgY2FzZSBUeXBlLkludDoge1xuICAgICAgICAgICAgY29uc3QgeyBiaXRXaWR0aCwgaXNTaWduZWQgfSA9IHR5cGU7XG4gICAgICAgICAgICBzd2l0Y2ggKGJpdFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gaXNTaWduZWQgPyBUeXBlLkludDggOiBUeXBlLlVpbnQ4O1xuICAgICAgICAgICAgICAgIGNhc2UgMTY6IHJldHVybiBpc1NpZ25lZCA/IFR5cGUuSW50MTYgOiBUeXBlLlVpbnQxNjtcbiAgICAgICAgICAgICAgICBjYXNlIDMyOiByZXR1cm4gaXNTaWduZWQgPyBUeXBlLkludDMyIDogVHlwZS5VaW50MzI7XG4gICAgICAgICAgICAgICAgY2FzZSA2NDogcmV0dXJuIGlzU2lnbmVkID8gVHlwZS5JbnQ2NCA6IFR5cGUuVWludDY0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgcmV0dXJuIFR5cGUuSW50O1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgVHlwZS5GbG9hdDpcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZS5wcmVjaXNpb24pIHtcbiAgICAgICAgICAgICAgICBjYXNlIFByZWNpc2lvbi5IQUxGOiByZXR1cm4gVHlwZS5GbG9hdDE2O1xuICAgICAgICAgICAgICAgIGNhc2UgUHJlY2lzaW9uLlNJTkdMRTogcmV0dXJuIFR5cGUuRmxvYXQzMjtcbiAgICAgICAgICAgICAgICBjYXNlIFByZWNpc2lvbi5ET1VCTEU6IHJldHVybiBUeXBlLkZsb2F0NjQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICByZXR1cm4gVHlwZS5GbG9hdDtcbiAgICAgICAgY2FzZSBUeXBlLkJpbmFyeTogcmV0dXJuIFR5cGUuQmluYXJ5O1xuICAgICAgICBjYXNlIFR5cGUuVXRmODogcmV0dXJuIFR5cGUuVXRmODtcbiAgICAgICAgY2FzZSBUeXBlLkJvb2w6IHJldHVybiBUeXBlLkJvb2w7XG4gICAgICAgIGNhc2UgVHlwZS5EZWNpbWFsOiByZXR1cm4gVHlwZS5EZWNpbWFsO1xuICAgICAgICBjYXNlIFR5cGUuVGltZTpcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZS51bml0KSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUaW1lVW5pdC5TRUNPTkQ6IHJldHVybiBUeXBlLlRpbWVTZWNvbmQ7XG4gICAgICAgICAgICAgICAgY2FzZSBUaW1lVW5pdC5NSUxMSVNFQ09ORDogcmV0dXJuIFR5cGUuVGltZU1pbGxpc2Vjb25kO1xuICAgICAgICAgICAgICAgIGNhc2UgVGltZVVuaXQuTUlDUk9TRUNPTkQ6IHJldHVybiBUeXBlLlRpbWVNaWNyb3NlY29uZDtcbiAgICAgICAgICAgICAgICBjYXNlIFRpbWVVbml0Lk5BTk9TRUNPTkQ6IHJldHVybiBUeXBlLlRpbWVOYW5vc2Vjb25kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgcmV0dXJuIFR5cGUuVGltZTtcbiAgICAgICAgY2FzZSBUeXBlLlRpbWVzdGFtcDpcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZS51bml0KSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUaW1lVW5pdC5TRUNPTkQ6IHJldHVybiBUeXBlLlRpbWVzdGFtcFNlY29uZDtcbiAgICAgICAgICAgICAgICBjYXNlIFRpbWVVbml0Lk1JTExJU0VDT05EOiByZXR1cm4gVHlwZS5UaW1lc3RhbXBNaWxsaXNlY29uZDtcbiAgICAgICAgICAgICAgICBjYXNlIFRpbWVVbml0Lk1JQ1JPU0VDT05EOiByZXR1cm4gVHlwZS5UaW1lc3RhbXBNaWNyb3NlY29uZDtcbiAgICAgICAgICAgICAgICBjYXNlIFRpbWVVbml0Lk5BTk9TRUNPTkQ6IHJldHVybiBUeXBlLlRpbWVzdGFtcE5hbm9zZWNvbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICByZXR1cm4gVHlwZS5UaW1lc3RhbXA7XG4gICAgICAgIGNhc2UgVHlwZS5EYXRlOlxuICAgICAgICAgICAgc3dpdGNoICh0eXBlLnVuaXQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIERhdGVVbml0LkRBWTogcmV0dXJuIFR5cGUuRGF0ZURheTtcbiAgICAgICAgICAgICAgICBjYXNlIERhdGVVbml0Lk1JTExJU0VDT05EOiByZXR1cm4gVHlwZS5EYXRlTWlsbGlzZWNvbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICByZXR1cm4gVHlwZS5EYXRlO1xuICAgICAgICBjYXNlIFR5cGUuSW50ZXJ2YWw6XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUudW5pdCkge1xuICAgICAgICAgICAgICAgIGNhc2UgSW50ZXJ2YWxVbml0LkRBWV9USU1FOiByZXR1cm4gVHlwZS5JbnRlcnZhbERheVRpbWU7XG4gICAgICAgICAgICAgICAgY2FzZSBJbnRlcnZhbFVuaXQuWUVBUl9NT05USDogcmV0dXJuIFR5cGUuSW50ZXJ2YWxZZWFyTW9udGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICByZXR1cm4gVHlwZS5JbnRlcnZhbDtcbiAgICAgICAgY2FzZSBUeXBlLk1hcDogcmV0dXJuIFR5cGUuTWFwO1xuICAgICAgICBjYXNlIFR5cGUuTGlzdDogcmV0dXJuIFR5cGUuTGlzdDtcbiAgICAgICAgY2FzZSBUeXBlLlN0cnVjdDogcmV0dXJuIFR5cGUuU3RydWN0O1xuICAgICAgICBjYXNlIFR5cGUuVW5pb246XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUubW9kZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgVW5pb25Nb2RlLkRlbnNlOiByZXR1cm4gVHlwZS5EZW5zZVVuaW9uO1xuICAgICAgICAgICAgICAgIGNhc2UgVW5pb25Nb2RlLlNwYXJzZTogcmV0dXJuIFR5cGUuU3BhcnNlVW5pb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICByZXR1cm4gVHlwZS5VbmlvbjtcbiAgICAgICAgY2FzZSBUeXBlLkZpeGVkU2l6ZUJpbmFyeTogcmV0dXJuIFR5cGUuRml4ZWRTaXplQmluYXJ5O1xuICAgICAgICBjYXNlIFR5cGUuRml4ZWRTaXplTGlzdDogcmV0dXJuIFR5cGUuRml4ZWRTaXplTGlzdDtcbiAgICAgICAgY2FzZSBUeXBlLkRpY3Rpb25hcnk6IHJldHVybiBUeXBlLkRpY3Rpb25hcnk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIHR5cGUgJyR7VHlwZVt0eXBlLnR5cGVJZF19J2ApO1xufVxuLy8gQWRkIHRoZXNlIGhlcmUgc28gdGhleSdyZSBwaWNrZWQgdXAgYnkgdGhlIGV4dGVybnMgY3JlYXRvclxuLy8gaW4gdGhlIGJ1aWxkLCBhbmQgY2xvc3VyZS1jb21waWxlciBkb2Vzbid0IG1pbmlmeSB0aGVtIGF3YXlcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50OCA9IG51bGw7XG5WaXNpdG9yLnByb3RvdHlwZS52aXNpdEludDE2ID0gbnVsbDtcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50MzIgPSBudWxsO1xuVmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnQ2NCA9IG51bGw7XG5WaXNpdG9yLnByb3RvdHlwZS52aXNpdFVpbnQ4ID0gbnVsbDtcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0VWludDE2ID0gbnVsbDtcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0VWludDMyID0gbnVsbDtcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0VWludDY0ID0gbnVsbDtcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0RmxvYXQxNiA9IG51bGw7XG5WaXNpdG9yLnByb3RvdHlwZS52aXNpdEZsb2F0MzIgPSBudWxsO1xuVmlzaXRvci5wcm90b3R5cGUudmlzaXRGbG9hdDY0ID0gbnVsbDtcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGF0ZURheSA9IG51bGw7XG5WaXNpdG9yLnByb3RvdHlwZS52aXNpdERhdGVNaWxsaXNlY29uZCA9IG51bGw7XG5WaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcFNlY29uZCA9IG51bGw7XG5WaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcE1pbGxpc2Vjb25kID0gbnVsbDtcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wTWljcm9zZWNvbmQgPSBudWxsO1xuVmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBOYW5vc2Vjb25kID0gbnVsbDtcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZVNlY29uZCA9IG51bGw7XG5WaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVNaWxsaXNlY29uZCA9IG51bGw7XG5WaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVNaWNyb3NlY29uZCA9IG51bGw7XG5WaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVOYW5vc2Vjb25kID0gbnVsbDtcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVuc2VVbmlvbiA9IG51bGw7XG5WaXNpdG9yLnByb3RvdHlwZS52aXNpdFNwYXJzZVVuaW9uID0gbnVsbDtcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50ZXJ2YWxEYXlUaW1lID0gbnVsbDtcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50ZXJ2YWxZZWFyTW9udGggPSBudWxsO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD12aXNpdG9yLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgVmlzaXRvciB9IGZyb20gJy4uL3Zpc2l0b3IubWpzJztcbmltcG9ydCB7IEJpbmFyeUJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyL2JpbmFyeS5tanMnO1xuaW1wb3J0IHsgQm9vbEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyL2Jvb2wubWpzJztcbmltcG9ydCB7IERhdGVCdWlsZGVyLCBEYXRlRGF5QnVpbGRlciwgRGF0ZU1pbGxpc2Vjb25kQnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIvZGF0ZS5tanMnO1xuaW1wb3J0IHsgRGVjaW1hbEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyL2RlY2ltYWwubWpzJztcbmltcG9ydCB7IERpY3Rpb25hcnlCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci9kaWN0aW9uYXJ5Lm1qcyc7XG5pbXBvcnQgeyBGaXhlZFNpemVCaW5hcnlCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci9maXhlZHNpemViaW5hcnkubWpzJztcbmltcG9ydCB7IEZpeGVkU2l6ZUxpc3RCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci9maXhlZHNpemVsaXN0Lm1qcyc7XG5pbXBvcnQgeyBGbG9hdEJ1aWxkZXIsIEZsb2F0MTZCdWlsZGVyLCBGbG9hdDMyQnVpbGRlciwgRmxvYXQ2NEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyL2Zsb2F0Lm1qcyc7XG5pbXBvcnQgeyBJbnRlcnZhbEJ1aWxkZXIsIEludGVydmFsRGF5VGltZUJ1aWxkZXIsIEludGVydmFsWWVhck1vbnRoQnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIvaW50ZXJ2YWwubWpzJztcbmltcG9ydCB7IEludEJ1aWxkZXIsIEludDhCdWlsZGVyLCBJbnQxNkJ1aWxkZXIsIEludDMyQnVpbGRlciwgSW50NjRCdWlsZGVyLCBVaW50OEJ1aWxkZXIsIFVpbnQxNkJ1aWxkZXIsIFVpbnQzMkJ1aWxkZXIsIFVpbnQ2NEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyL2ludC5tanMnO1xuaW1wb3J0IHsgTGlzdEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyL2xpc3QubWpzJztcbmltcG9ydCB7IE1hcEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyL21hcC5tanMnO1xuaW1wb3J0IHsgTnVsbEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyL251bGwubWpzJztcbmltcG9ydCB7IFN0cnVjdEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyL3N0cnVjdC5tanMnO1xuaW1wb3J0IHsgVGltZXN0YW1wQnVpbGRlciwgVGltZXN0YW1wU2Vjb25kQnVpbGRlciwgVGltZXN0YW1wTWlsbGlzZWNvbmRCdWlsZGVyLCBUaW1lc3RhbXBNaWNyb3NlY29uZEJ1aWxkZXIsIFRpbWVzdGFtcE5hbm9zZWNvbmRCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci90aW1lc3RhbXAubWpzJztcbmltcG9ydCB7IFRpbWVCdWlsZGVyLCBUaW1lU2Vjb25kQnVpbGRlciwgVGltZU1pbGxpc2Vjb25kQnVpbGRlciwgVGltZU1pY3Jvc2Vjb25kQnVpbGRlciwgVGltZU5hbm9zZWNvbmRCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci90aW1lLm1qcyc7XG5pbXBvcnQgeyBVbmlvbkJ1aWxkZXIsIERlbnNlVW5pb25CdWlsZGVyLCBTcGFyc2VVbmlvbkJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyL3VuaW9uLm1qcyc7XG5pbXBvcnQgeyBVdGY4QnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIvdXRmOC5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBHZXRCdWlsZGVyQ3RvciBleHRlbmRzIFZpc2l0b3Ige1xuICAgIHZpc2l0TnVsbCgpIHsgcmV0dXJuIE51bGxCdWlsZGVyOyB9XG4gICAgdmlzaXRCb29sKCkgeyByZXR1cm4gQm9vbEJ1aWxkZXI7IH1cbiAgICB2aXNpdEludCgpIHsgcmV0dXJuIEludEJ1aWxkZXI7IH1cbiAgICB2aXNpdEludDgoKSB7IHJldHVybiBJbnQ4QnVpbGRlcjsgfVxuICAgIHZpc2l0SW50MTYoKSB7IHJldHVybiBJbnQxNkJ1aWxkZXI7IH1cbiAgICB2aXNpdEludDMyKCkgeyByZXR1cm4gSW50MzJCdWlsZGVyOyB9XG4gICAgdmlzaXRJbnQ2NCgpIHsgcmV0dXJuIEludDY0QnVpbGRlcjsgfVxuICAgIHZpc2l0VWludDgoKSB7IHJldHVybiBVaW50OEJ1aWxkZXI7IH1cbiAgICB2aXNpdFVpbnQxNigpIHsgcmV0dXJuIFVpbnQxNkJ1aWxkZXI7IH1cbiAgICB2aXNpdFVpbnQzMigpIHsgcmV0dXJuIFVpbnQzMkJ1aWxkZXI7IH1cbiAgICB2aXNpdFVpbnQ2NCgpIHsgcmV0dXJuIFVpbnQ2NEJ1aWxkZXI7IH1cbiAgICB2aXNpdEZsb2F0KCkgeyByZXR1cm4gRmxvYXRCdWlsZGVyOyB9XG4gICAgdmlzaXRGbG9hdDE2KCkgeyByZXR1cm4gRmxvYXQxNkJ1aWxkZXI7IH1cbiAgICB2aXNpdEZsb2F0MzIoKSB7IHJldHVybiBGbG9hdDMyQnVpbGRlcjsgfVxuICAgIHZpc2l0RmxvYXQ2NCgpIHsgcmV0dXJuIEZsb2F0NjRCdWlsZGVyOyB9XG4gICAgdmlzaXRVdGY4KCkgeyByZXR1cm4gVXRmOEJ1aWxkZXI7IH1cbiAgICB2aXNpdEJpbmFyeSgpIHsgcmV0dXJuIEJpbmFyeUJ1aWxkZXI7IH1cbiAgICB2aXNpdEZpeGVkU2l6ZUJpbmFyeSgpIHsgcmV0dXJuIEZpeGVkU2l6ZUJpbmFyeUJ1aWxkZXI7IH1cbiAgICB2aXNpdERhdGUoKSB7IHJldHVybiBEYXRlQnVpbGRlcjsgfVxuICAgIHZpc2l0RGF0ZURheSgpIHsgcmV0dXJuIERhdGVEYXlCdWlsZGVyOyB9XG4gICAgdmlzaXREYXRlTWlsbGlzZWNvbmQoKSB7IHJldHVybiBEYXRlTWlsbGlzZWNvbmRCdWlsZGVyOyB9XG4gICAgdmlzaXRUaW1lc3RhbXAoKSB7IHJldHVybiBUaW1lc3RhbXBCdWlsZGVyOyB9XG4gICAgdmlzaXRUaW1lc3RhbXBTZWNvbmQoKSB7IHJldHVybiBUaW1lc3RhbXBTZWNvbmRCdWlsZGVyOyB9XG4gICAgdmlzaXRUaW1lc3RhbXBNaWxsaXNlY29uZCgpIHsgcmV0dXJuIFRpbWVzdGFtcE1pbGxpc2Vjb25kQnVpbGRlcjsgfVxuICAgIHZpc2l0VGltZXN0YW1wTWljcm9zZWNvbmQoKSB7IHJldHVybiBUaW1lc3RhbXBNaWNyb3NlY29uZEJ1aWxkZXI7IH1cbiAgICB2aXNpdFRpbWVzdGFtcE5hbm9zZWNvbmQoKSB7IHJldHVybiBUaW1lc3RhbXBOYW5vc2Vjb25kQnVpbGRlcjsgfVxuICAgIHZpc2l0VGltZSgpIHsgcmV0dXJuIFRpbWVCdWlsZGVyOyB9XG4gICAgdmlzaXRUaW1lU2Vjb25kKCkgeyByZXR1cm4gVGltZVNlY29uZEJ1aWxkZXI7IH1cbiAgICB2aXNpdFRpbWVNaWxsaXNlY29uZCgpIHsgcmV0dXJuIFRpbWVNaWxsaXNlY29uZEJ1aWxkZXI7IH1cbiAgICB2aXNpdFRpbWVNaWNyb3NlY29uZCgpIHsgcmV0dXJuIFRpbWVNaWNyb3NlY29uZEJ1aWxkZXI7IH1cbiAgICB2aXNpdFRpbWVOYW5vc2Vjb25kKCkgeyByZXR1cm4gVGltZU5hbm9zZWNvbmRCdWlsZGVyOyB9XG4gICAgdmlzaXREZWNpbWFsKCkgeyByZXR1cm4gRGVjaW1hbEJ1aWxkZXI7IH1cbiAgICB2aXNpdExpc3QoKSB7IHJldHVybiBMaXN0QnVpbGRlcjsgfVxuICAgIHZpc2l0U3RydWN0KCkgeyByZXR1cm4gU3RydWN0QnVpbGRlcjsgfVxuICAgIHZpc2l0VW5pb24oKSB7IHJldHVybiBVbmlvbkJ1aWxkZXI7IH1cbiAgICB2aXNpdERlbnNlVW5pb24oKSB7IHJldHVybiBEZW5zZVVuaW9uQnVpbGRlcjsgfVxuICAgIHZpc2l0U3BhcnNlVW5pb24oKSB7IHJldHVybiBTcGFyc2VVbmlvbkJ1aWxkZXI7IH1cbiAgICB2aXNpdERpY3Rpb25hcnkoKSB7IHJldHVybiBEaWN0aW9uYXJ5QnVpbGRlcjsgfVxuICAgIHZpc2l0SW50ZXJ2YWwoKSB7IHJldHVybiBJbnRlcnZhbEJ1aWxkZXI7IH1cbiAgICB2aXNpdEludGVydmFsRGF5VGltZSgpIHsgcmV0dXJuIEludGVydmFsRGF5VGltZUJ1aWxkZXI7IH1cbiAgICB2aXNpdEludGVydmFsWWVhck1vbnRoKCkgeyByZXR1cm4gSW50ZXJ2YWxZZWFyTW9udGhCdWlsZGVyOyB9XG4gICAgdmlzaXRGaXhlZFNpemVMaXN0KCkgeyByZXR1cm4gRml4ZWRTaXplTGlzdEJ1aWxkZXI7IH1cbiAgICB2aXNpdE1hcCgpIHsgcmV0dXJuIE1hcEJ1aWxkZXI7IH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgaW5zdGFuY2UgPSBuZXcgR2V0QnVpbGRlckN0b3IoKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnVpbGRlcmN0b3IubWpzLm1hcFxuIiwiLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cbmltcG9ydCB7IFZpc2l0b3IgfSBmcm9tICcuLi92aXNpdG9yLm1qcyc7XG5pbXBvcnQgeyBUaW1lVW5pdCwgVW5pb25Nb2RlIH0gZnJvbSAnLi4vZW51bS5tanMnO1xuLyoqIEBpZ25vcmUgKi8gY29uc3Qgc3VtID0gKHgsIHkpID0+IHggKyB5O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBHZXRCeXRlTGVuZ3RoVmlzaXRvciBleHRlbmRzIFZpc2l0b3Ige1xuICAgIHZpc2l0TnVsbChfX19fLCBfKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICB2aXNpdEludChkYXRhLCBfKSB7XG4gICAgICAgIHJldHVybiBkYXRhLnR5cGUuYml0V2lkdGggLyA4O1xuICAgIH1cbiAgICB2aXNpdEZsb2F0KGRhdGEsIF8pIHtcbiAgICAgICAgcmV0dXJuIGRhdGEudHlwZS5BcnJheVR5cGUuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgfVxuICAgIHZpc2l0Qm9vbChfX19fLCBfKSB7XG4gICAgICAgIHJldHVybiAxIC8gODtcbiAgICB9XG4gICAgdmlzaXREZWNpbWFsKGRhdGEsIF8pIHtcbiAgICAgICAgcmV0dXJuIGRhdGEudHlwZS5iaXRXaWR0aCAvIDg7XG4gICAgfVxuICAgIHZpc2l0RGF0ZShkYXRhLCBfKSB7XG4gICAgICAgIHJldHVybiAoZGF0YS50eXBlLnVuaXQgKyAxKSAqIDQ7XG4gICAgfVxuICAgIHZpc2l0VGltZShkYXRhLCBfKSB7XG4gICAgICAgIHJldHVybiBkYXRhLnR5cGUuYml0V2lkdGggLyA4O1xuICAgIH1cbiAgICB2aXNpdFRpbWVzdGFtcChkYXRhLCBfKSB7XG4gICAgICAgIHJldHVybiBkYXRhLnR5cGUudW5pdCA9PT0gVGltZVVuaXQuU0VDT05EID8gNCA6IDg7XG4gICAgfVxuICAgIHZpc2l0SW50ZXJ2YWwoZGF0YSwgXykge1xuICAgICAgICByZXR1cm4gKGRhdGEudHlwZS51bml0ICsgMSkgKiA0O1xuICAgIH1cbiAgICB2aXNpdFN0cnVjdChkYXRhLCBpKSB7XG4gICAgICAgIHJldHVybiBkYXRhLmNoaWxkcmVuLnJlZHVjZSgodG90YWwsIGNoaWxkKSA9PiB0b3RhbCArIGluc3RhbmNlLnZpc2l0KGNoaWxkLCBpKSwgMCk7XG4gICAgfVxuICAgIHZpc2l0Rml4ZWRTaXplQmluYXJ5KGRhdGEsIF8pIHtcbiAgICAgICAgcmV0dXJuIGRhdGEudHlwZS5ieXRlV2lkdGg7XG4gICAgfVxuICAgIHZpc2l0TWFwKGRhdGEsIGkpIHtcbiAgICAgICAgLy8gNCArIDQgZm9yIHRoZSBpbmRpY2VzXG4gICAgICAgIHJldHVybiA4ICsgZGF0YS5jaGlsZHJlbi5yZWR1Y2UoKHRvdGFsLCBjaGlsZCkgPT4gdG90YWwgKyBpbnN0YW5jZS52aXNpdChjaGlsZCwgaSksIDApO1xuICAgIH1cbiAgICB2aXNpdERpY3Rpb25hcnkoZGF0YSwgaSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoZGF0YS50eXBlLmluZGljZXMuYml0V2lkdGggLyA4KSArICgoKF9hID0gZGF0YS5kaWN0aW9uYXJ5KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0Qnl0ZUxlbmd0aChkYXRhLnZhbHVlc1tpXSkpIHx8IDApO1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXRVdGY4Qnl0ZUxlbmd0aCA9ICh7IHZhbHVlT2Zmc2V0cyB9LCBpbmRleCkgPT4ge1xuICAgIC8vIDQgKyA0IGZvciB0aGUgaW5kaWNlcywgYGVuZCAtIHN0YXJ0YCBmb3IgdGhlIGRhdGEgYnl0ZXNcbiAgICByZXR1cm4gOCArICh2YWx1ZU9mZnNldHNbaW5kZXggKyAxXSAtIHZhbHVlT2Zmc2V0c1tpbmRleF0pO1xufTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXRCaW5hcnlCeXRlTGVuZ3RoID0gKHsgdmFsdWVPZmZzZXRzIH0sIGluZGV4KSA9PiB7XG4gICAgLy8gNCArIDQgZm9yIHRoZSBpbmRpY2VzLCBgZW5kIC0gc3RhcnRgIGZvciB0aGUgZGF0YSBieXRlc1xuICAgIHJldHVybiA4ICsgKHZhbHVlT2Zmc2V0c1tpbmRleCArIDFdIC0gdmFsdWVPZmZzZXRzW2luZGV4XSk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldExpc3RCeXRlTGVuZ3RoID0gKHsgdmFsdWVPZmZzZXRzLCBzdHJpZGUsIGNoaWxkcmVuIH0sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlblswXTtcbiAgICBjb25zdCB7IFtpbmRleCAqIHN0cmlkZV06IHN0YXJ0IH0gPSB2YWx1ZU9mZnNldHM7XG4gICAgY29uc3QgeyBbaW5kZXggKiBzdHJpZGUgKyAxXTogZW5kIH0gPSB2YWx1ZU9mZnNldHM7XG4gICAgY29uc3QgdmlzaXQgPSBpbnN0YW5jZS5nZXRWaXNpdEZuKGNoaWxkLnR5cGUpO1xuICAgIGNvbnN0IHNsaWNlID0gY2hpbGQuc2xpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0KTtcbiAgICBsZXQgc2l6ZSA9IDg7IC8vIDQgKyA0IGZvciB0aGUgaW5kaWNlc1xuICAgIGZvciAobGV0IGlkeCA9IC0xLCBsZW4gPSBlbmQgLSBzdGFydDsgKytpZHggPCBsZW47KSB7XG4gICAgICAgIHNpemUgKz0gdmlzaXQoc2xpY2UsIGlkeCk7XG4gICAgfVxuICAgIHJldHVybiBzaXplO1xufTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXRGaXhlZFNpemVMaXN0Qnl0ZUxlbmd0aCA9ICh7IHN0cmlkZSwgY2hpbGRyZW4gfSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuWzBdO1xuICAgIGNvbnN0IHNsaWNlID0gY2hpbGQuc2xpY2UoaW5kZXggKiBzdHJpZGUsIHN0cmlkZSk7XG4gICAgY29uc3QgdmlzaXQgPSBpbnN0YW5jZS5nZXRWaXNpdEZuKGNoaWxkLnR5cGUpO1xuICAgIGxldCBzaXplID0gMDtcbiAgICBmb3IgKGxldCBpZHggPSAtMSwgbGVuID0gc2xpY2UubGVuZ3RoOyArK2lkeCA8IGxlbjspIHtcbiAgICAgICAgc2l6ZSArPSB2aXNpdChzbGljZSwgaWR4KTtcbiAgICB9XG4gICAgcmV0dXJuIHNpemU7XG59O1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXRVbmlvbkJ5dGVMZW5ndGggPSAoZGF0YSwgaW5kZXgpID0+IHtcbiAgICByZXR1cm4gZGF0YS50eXBlLm1vZGUgPT09IFVuaW9uTW9kZS5EZW5zZSA/XG4gICAgICAgIGdldERlbnNlVW5pb25CeXRlTGVuZ3RoKGRhdGEsIGluZGV4KSA6XG4gICAgICAgIGdldFNwYXJzZVVuaW9uQnl0ZUxlbmd0aChkYXRhLCBpbmRleCk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldERlbnNlVW5pb25CeXRlTGVuZ3RoID0gKHsgdHlwZSwgY2hpbGRyZW4sIHR5cGVJZHMsIHZhbHVlT2Zmc2V0cyB9LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkSW5kZXggPSB0eXBlLnR5cGVJZFRvQ2hpbGRJbmRleFt0eXBlSWRzW2luZGV4XV07XG4gICAgLy8gNCBmb3IgdGhlIHR5cGVJZCwgNCBmb3IgdGhlIHZhbHVlT2Zmc2V0cywgdGhlbiB0aGUgY2hpbGQgYXQgdGhlIG9mZnNldFxuICAgIHJldHVybiA4ICsgaW5zdGFuY2UudmlzaXQoY2hpbGRyZW5bY2hpbGRJbmRleF0sIHZhbHVlT2Zmc2V0c1tpbmRleF0pO1xufTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXRTcGFyc2VVbmlvbkJ5dGVMZW5ndGggPSAoeyBjaGlsZHJlbiB9LCBpbmRleCkgPT4ge1xuICAgIC8vIDQgZm9yIHRoZSB0eXBlSWQsIHRoZW4gb25jZSBlYWNoIGZvciB0aGUgY2hpbGRyZW4gYXQgdGhpcyBpbmRleFxuICAgIHJldHVybiA0ICsgaW5zdGFuY2UudmlzaXRNYW55KGNoaWxkcmVuLCBjaGlsZHJlbi5tYXAoKCkgPT4gaW5kZXgpKS5yZWR1Y2Uoc3VtLCAwKTtcbn07XG5HZXRCeXRlTGVuZ3RoVmlzaXRvci5wcm90b3R5cGUudmlzaXRVdGY4ID0gZ2V0VXRmOEJ5dGVMZW5ndGg7XG5HZXRCeXRlTGVuZ3RoVmlzaXRvci5wcm90b3R5cGUudmlzaXRCaW5hcnkgPSBnZXRCaW5hcnlCeXRlTGVuZ3RoO1xuR2V0Qnl0ZUxlbmd0aFZpc2l0b3IucHJvdG90eXBlLnZpc2l0TGlzdCA9IGdldExpc3RCeXRlTGVuZ3RoO1xuR2V0Qnl0ZUxlbmd0aFZpc2l0b3IucHJvdG90eXBlLnZpc2l0Rml4ZWRTaXplTGlzdCA9IGdldEZpeGVkU2l6ZUxpc3RCeXRlTGVuZ3RoO1xuR2V0Qnl0ZUxlbmd0aFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VW5pb24gPSBnZXRVbmlvbkJ5dGVMZW5ndGg7XG5HZXRCeXRlTGVuZ3RoVmlzaXRvci5wcm90b3R5cGUudmlzaXREZW5zZVVuaW9uID0gZ2V0RGVuc2VVbmlvbkJ5dGVMZW5ndGg7XG5HZXRCeXRlTGVuZ3RoVmlzaXRvci5wcm90b3R5cGUudmlzaXRTcGFyc2VVbmlvbiA9IGdldFNwYXJzZVVuaW9uQnl0ZUxlbmd0aDtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgaW5zdGFuY2UgPSBuZXcgR2V0Qnl0ZUxlbmd0aFZpc2l0b3IoKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Ynl0ZWxlbmd0aC5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IEJOIH0gZnJvbSAnLi4vdXRpbC9ibi5tanMnO1xuaW1wb3J0IHsgVmVjdG9yIH0gZnJvbSAnLi4vdmVjdG9yLm1qcyc7XG5pbXBvcnQgeyBWaXNpdG9yIH0gZnJvbSAnLi4vdmlzaXRvci5tanMnO1xuaW1wb3J0IHsgTWFwUm93IH0gZnJvbSAnLi4vcm93L21hcC5tanMnO1xuaW1wb3J0IHsgU3RydWN0Um93IH0gZnJvbSAnLi4vcm93L3N0cnVjdC5tanMnO1xuaW1wb3J0IHsgZGVjb2RlVXRmOCB9IGZyb20gJy4uL3V0aWwvdXRmOC5tanMnO1xuaW1wb3J0IHsgdWludDE2VG9GbG9hdDY0IH0gZnJvbSAnLi4vdXRpbC9tYXRoLm1qcyc7XG5pbXBvcnQgeyBVbmlvbk1vZGUsIFByZWNpc2lvbiwgRGF0ZVVuaXQsIFRpbWVVbml0LCBJbnRlcnZhbFVuaXQgfSBmcm9tICcuLi9lbnVtLm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEdldFZpc2l0b3IgZXh0ZW5kcyBWaXNpdG9yIHtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiB3cmFwR2V0KGZuKSB7XG4gICAgcmV0dXJuIChkYXRhLCBfMSkgPT4gZGF0YS5nZXRWYWxpZChfMSkgPyBmbihkYXRhLCBfMSkgOiBudWxsO1xufVxuLyoqIEBpZ25vcmUgKi8gY29uc3QgZXBvY2hEYXlzVG9NcyA9IChkYXRhLCBpbmRleCkgPT4gODY0MDAwMDAgKiBkYXRhW2luZGV4XTtcbi8qKiBAaWdub3JlICovIGNvbnN0IGVwb2NoTWlsbGlzZWNvbmRzTG9uZ1RvTXMgPSAoZGF0YSwgaW5kZXgpID0+IDQyOTQ5NjcyOTYgKiAoZGF0YVtpbmRleCArIDFdKSArIChkYXRhW2luZGV4XSA+Pj4gMCk7XG4vKiogQGlnbm9yZSAqLyBjb25zdCBlcG9jaE1pY3Jvc2Vjb25kc0xvbmdUb01zID0gKGRhdGEsIGluZGV4KSA9PiA0Mjk0OTY3Mjk2ICogKGRhdGFbaW5kZXggKyAxXSAvIDEwMDApICsgKChkYXRhW2luZGV4XSA+Pj4gMCkgLyAxMDAwKTtcbi8qKiBAaWdub3JlICovIGNvbnN0IGVwb2NoTmFub3NlY29uZHNMb25nVG9NcyA9IChkYXRhLCBpbmRleCkgPT4gNDI5NDk2NzI5NiAqIChkYXRhW2luZGV4ICsgMV0gLyAxMDAwMDAwKSArICgoZGF0YVtpbmRleF0gPj4+IDApIC8gMTAwMDAwMCk7XG4vKiogQGlnbm9yZSAqLyBjb25zdCBlcG9jaE1pbGxpc2Vjb25kc1RvRGF0ZSA9IChlcG9jaE1zKSA9PiBuZXcgRGF0ZShlcG9jaE1zKTtcbi8qKiBAaWdub3JlICovIGNvbnN0IGVwb2NoRGF5c1RvRGF0ZSA9IChkYXRhLCBpbmRleCkgPT4gZXBvY2hNaWxsaXNlY29uZHNUb0RhdGUoZXBvY2hEYXlzVG9NcyhkYXRhLCBpbmRleCkpO1xuLyoqIEBpZ25vcmUgKi8gY29uc3QgZXBvY2hNaWxsaXNlY29uZHNMb25nVG9EYXRlID0gKGRhdGEsIGluZGV4KSA9PiBlcG9jaE1pbGxpc2Vjb25kc1RvRGF0ZShlcG9jaE1pbGxpc2Vjb25kc0xvbmdUb01zKGRhdGEsIGluZGV4KSk7XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0TnVsbCA9IChfZGF0YSwgX2luZGV4KSA9PiBudWxsO1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldFZhcmlhYmxlV2lkdGhCeXRlcyA9ICh2YWx1ZXMsIHZhbHVlT2Zmc2V0cywgaW5kZXgpID0+IHtcbiAgICBpZiAoaW5kZXggKyAxID49IHZhbHVlT2Zmc2V0cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHggPSB2YWx1ZU9mZnNldHNbaW5kZXhdO1xuICAgIGNvbnN0IHkgPSB2YWx1ZU9mZnNldHNbaW5kZXggKyAxXTtcbiAgICByZXR1cm4gdmFsdWVzLnN1YmFycmF5KHgsIHkpO1xufTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXRCb29sID0gKHsgb2Zmc2V0LCB2YWx1ZXMgfSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBpZHggPSBvZmZzZXQgKyBpbmRleDtcbiAgICBjb25zdCBieXRlID0gdmFsdWVzW2lkeCA+PiAzXTtcbiAgICByZXR1cm4gKGJ5dGUgJiAxIDw8IChpZHggJSA4KSkgIT09IDA7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldERhdGVEYXkgPSAoeyB2YWx1ZXMgfSwgaW5kZXgpID0+IGVwb2NoRGF5c1RvRGF0ZSh2YWx1ZXMsIGluZGV4KTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXREYXRlTWlsbGlzZWNvbmQgPSAoeyB2YWx1ZXMgfSwgaW5kZXgpID0+IGVwb2NoTWlsbGlzZWNvbmRzTG9uZ1RvRGF0ZSh2YWx1ZXMsIGluZGV4ICogMik7XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0TnVtZXJpYyA9ICh7IHN0cmlkZSwgdmFsdWVzIH0sIGluZGV4KSA9PiB2YWx1ZXNbc3RyaWRlICogaW5kZXhdO1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldEZsb2F0MTYgPSAoeyBzdHJpZGUsIHZhbHVlcyB9LCBpbmRleCkgPT4gdWludDE2VG9GbG9hdDY0KHZhbHVlc1tzdHJpZGUgKiBpbmRleF0pO1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldEJpZ0ludHMgPSAoeyB2YWx1ZXMgfSwgaW5kZXgpID0+IHZhbHVlc1tpbmRleF07XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0Rml4ZWRTaXplQmluYXJ5ID0gKHsgc3RyaWRlLCB2YWx1ZXMgfSwgaW5kZXgpID0+IHZhbHVlcy5zdWJhcnJheShzdHJpZGUgKiBpbmRleCwgc3RyaWRlICogKGluZGV4ICsgMSkpO1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldEJpbmFyeSA9ICh7IHZhbHVlcywgdmFsdWVPZmZzZXRzIH0sIGluZGV4KSA9PiBnZXRWYXJpYWJsZVdpZHRoQnl0ZXModmFsdWVzLCB2YWx1ZU9mZnNldHMsIGluZGV4KTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXRVdGY4ID0gKHsgdmFsdWVzLCB2YWx1ZU9mZnNldHMgfSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBieXRlcyA9IGdldFZhcmlhYmxlV2lkdGhCeXRlcyh2YWx1ZXMsIHZhbHVlT2Zmc2V0cywgaW5kZXgpO1xuICAgIHJldHVybiBieXRlcyAhPT0gbnVsbCA/IGRlY29kZVV0ZjgoYnl0ZXMpIDogbnVsbDtcbn07XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldEludCA9ICh7IHZhbHVlcyB9LCBpbmRleCkgPT4gdmFsdWVzW2luZGV4XTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0RmxvYXQgPSAoeyB0eXBlLCB2YWx1ZXMgfSwgaW5kZXgpID0+ICh0eXBlLnByZWNpc2lvbiAhPT0gUHJlY2lzaW9uLkhBTEYgPyB2YWx1ZXNbaW5kZXhdIDogdWludDE2VG9GbG9hdDY0KHZhbHVlc1tpbmRleF0pKTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0RGF0ZSA9IChkYXRhLCBpbmRleCkgPT4gKGRhdGEudHlwZS51bml0ID09PSBEYXRlVW5pdC5EQVlcbiAgICA/IGdldERhdGVEYXkoZGF0YSwgaW5kZXgpXG4gICAgOiBnZXREYXRlTWlsbGlzZWNvbmQoZGF0YSwgaW5kZXgpKTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXRUaW1lc3RhbXBTZWNvbmQgPSAoeyB2YWx1ZXMgfSwgaW5kZXgpID0+IDEwMDAgKiBlcG9jaE1pbGxpc2Vjb25kc0xvbmdUb01zKHZhbHVlcywgaW5kZXggKiAyKTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXRUaW1lc3RhbXBNaWxsaXNlY29uZCA9ICh7IHZhbHVlcyB9LCBpbmRleCkgPT4gZXBvY2hNaWxsaXNlY29uZHNMb25nVG9Ncyh2YWx1ZXMsIGluZGV4ICogMik7XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0VGltZXN0YW1wTWljcm9zZWNvbmQgPSAoeyB2YWx1ZXMgfSwgaW5kZXgpID0+IGVwb2NoTWljcm9zZWNvbmRzTG9uZ1RvTXModmFsdWVzLCBpbmRleCAqIDIpO1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldFRpbWVzdGFtcE5hbm9zZWNvbmQgPSAoeyB2YWx1ZXMgfSwgaW5kZXgpID0+IGVwb2NoTmFub3NlY29uZHNMb25nVG9Ncyh2YWx1ZXMsIGluZGV4ICogMik7XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldFRpbWVzdGFtcCA9IChkYXRhLCBpbmRleCkgPT4ge1xuICAgIHN3aXRjaCAoZGF0YS50eXBlLnVuaXQpIHtcbiAgICAgICAgY2FzZSBUaW1lVW5pdC5TRUNPTkQ6IHJldHVybiBnZXRUaW1lc3RhbXBTZWNvbmQoZGF0YSwgaW5kZXgpO1xuICAgICAgICBjYXNlIFRpbWVVbml0Lk1JTExJU0VDT05EOiByZXR1cm4gZ2V0VGltZXN0YW1wTWlsbGlzZWNvbmQoZGF0YSwgaW5kZXgpO1xuICAgICAgICBjYXNlIFRpbWVVbml0Lk1JQ1JPU0VDT05EOiByZXR1cm4gZ2V0VGltZXN0YW1wTWljcm9zZWNvbmQoZGF0YSwgaW5kZXgpO1xuICAgICAgICBjYXNlIFRpbWVVbml0Lk5BTk9TRUNPTkQ6IHJldHVybiBnZXRUaW1lc3RhbXBOYW5vc2Vjb25kKGRhdGEsIGluZGV4KTtcbiAgICB9XG59O1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldFRpbWVTZWNvbmQgPSAoeyB2YWx1ZXMgfSwgaW5kZXgpID0+IHZhbHVlc1tpbmRleF07XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0VGltZU1pbGxpc2Vjb25kID0gKHsgdmFsdWVzIH0sIGluZGV4KSA9PiB2YWx1ZXNbaW5kZXhdO1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldFRpbWVNaWNyb3NlY29uZCA9ICh7IHZhbHVlcyB9LCBpbmRleCkgPT4gdmFsdWVzW2luZGV4XTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXRUaW1lTmFub3NlY29uZCA9ICh7IHZhbHVlcyB9LCBpbmRleCkgPT4gdmFsdWVzW2luZGV4XTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0VGltZSA9IChkYXRhLCBpbmRleCkgPT4ge1xuICAgIHN3aXRjaCAoZGF0YS50eXBlLnVuaXQpIHtcbiAgICAgICAgY2FzZSBUaW1lVW5pdC5TRUNPTkQ6IHJldHVybiBnZXRUaW1lU2Vjb25kKGRhdGEsIGluZGV4KTtcbiAgICAgICAgY2FzZSBUaW1lVW5pdC5NSUxMSVNFQ09ORDogcmV0dXJuIGdldFRpbWVNaWxsaXNlY29uZChkYXRhLCBpbmRleCk7XG4gICAgICAgIGNhc2UgVGltZVVuaXQuTUlDUk9TRUNPTkQ6IHJldHVybiBnZXRUaW1lTWljcm9zZWNvbmQoZGF0YSwgaW5kZXgpO1xuICAgICAgICBjYXNlIFRpbWVVbml0Lk5BTk9TRUNPTkQ6IHJldHVybiBnZXRUaW1lTmFub3NlY29uZChkYXRhLCBpbmRleCk7XG4gICAgfVxufTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXREZWNpbWFsID0gKHsgdmFsdWVzLCBzdHJpZGUgfSwgaW5kZXgpID0+IEJOLmRlY2ltYWwodmFsdWVzLnN1YmFycmF5KHN0cmlkZSAqIGluZGV4LCBzdHJpZGUgKiAoaW5kZXggKyAxKSkpO1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldExpc3QgPSAoZGF0YSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCB7IHZhbHVlT2Zmc2V0cywgc3RyaWRlLCBjaGlsZHJlbiB9ID0gZGF0YTtcbiAgICBjb25zdCB7IFtpbmRleCAqIHN0cmlkZV06IGJlZ2luLCBbaW5kZXggKiBzdHJpZGUgKyAxXTogZW5kIH0gPSB2YWx1ZU9mZnNldHM7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlblswXTtcbiAgICBjb25zdCBzbGljZSA9IGNoaWxkLnNsaWNlKGJlZ2luLCBlbmQgLSBiZWdpbik7XG4gICAgcmV0dXJuIG5ldyBWZWN0b3IoW3NsaWNlXSk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldE1hcCA9IChkYXRhLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHsgdmFsdWVPZmZzZXRzLCBjaGlsZHJlbiB9ID0gZGF0YTtcbiAgICBjb25zdCB7IFtpbmRleF06IGJlZ2luLCBbaW5kZXggKyAxXTogZW5kIH0gPSB2YWx1ZU9mZnNldHM7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlblswXTtcbiAgICByZXR1cm4gbmV3IE1hcFJvdyhjaGlsZC5zbGljZShiZWdpbiwgZW5kIC0gYmVnaW4pKTtcbn07XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0U3RydWN0ID0gKGRhdGEsIGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIG5ldyBTdHJ1Y3RSb3coZGF0YSwgaW5kZXgpO1xufTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0VW5pb24gPSAoZGF0YSwgaW5kZXgpID0+IHtcbiAgICByZXR1cm4gZGF0YS50eXBlLm1vZGUgPT09IFVuaW9uTW9kZS5EZW5zZSA/XG4gICAgICAgIGdldERlbnNlVW5pb24oZGF0YSwgaW5kZXgpIDpcbiAgICAgICAgZ2V0U3BhcnNlVW5pb24oZGF0YSwgaW5kZXgpO1xufTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXREZW5zZVVuaW9uID0gKGRhdGEsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgY2hpbGRJbmRleCA9IGRhdGEudHlwZS50eXBlSWRUb0NoaWxkSW5kZXhbZGF0YS50eXBlSWRzW2luZGV4XV07XG4gICAgY29uc3QgY2hpbGQgPSBkYXRhLmNoaWxkcmVuW2NoaWxkSW5kZXhdO1xuICAgIHJldHVybiBpbnN0YW5jZS52aXNpdChjaGlsZCwgZGF0YS52YWx1ZU9mZnNldHNbaW5kZXhdKTtcbn07XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0U3BhcnNlVW5pb24gPSAoZGF0YSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBjaGlsZEluZGV4ID0gZGF0YS50eXBlLnR5cGVJZFRvQ2hpbGRJbmRleFtkYXRhLnR5cGVJZHNbaW5kZXhdXTtcbiAgICBjb25zdCBjaGlsZCA9IGRhdGEuY2hpbGRyZW5bY2hpbGRJbmRleF07XG4gICAgcmV0dXJuIGluc3RhbmNlLnZpc2l0KGNoaWxkLCBpbmRleCk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldERpY3Rpb25hcnkgPSAoZGF0YSwgaW5kZXgpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIChfYSA9IGRhdGEuZGljdGlvbmFyeSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdldChkYXRhLnZhbHVlc1tpbmRleF0pO1xufTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0SW50ZXJ2YWwgPSAoZGF0YSwgaW5kZXgpID0+IChkYXRhLnR5cGUudW5pdCA9PT0gSW50ZXJ2YWxVbml0LkRBWV9USU1FKVxuICAgID8gZ2V0SW50ZXJ2YWxEYXlUaW1lKGRhdGEsIGluZGV4KVxuICAgIDogZ2V0SW50ZXJ2YWxZZWFyTW9udGgoZGF0YSwgaW5kZXgpO1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldEludGVydmFsRGF5VGltZSA9ICh7IHZhbHVlcyB9LCBpbmRleCkgPT4gdmFsdWVzLnN1YmFycmF5KDIgKiBpbmRleCwgMiAqIChpbmRleCArIDEpKTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXRJbnRlcnZhbFllYXJNb250aCA9ICh7IHZhbHVlcyB9LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGludGVydmFsID0gdmFsdWVzW2luZGV4XTtcbiAgICBjb25zdCBpbnQzMnMgPSBuZXcgSW50MzJBcnJheSgyKTtcbiAgICBpbnQzMnNbMF0gPSBNYXRoLnRydW5jKGludGVydmFsIC8gMTIpOyAvKiB5ZWFycyAqL1xuICAgIGludDMyc1sxXSA9IE1hdGgudHJ1bmMoaW50ZXJ2YWwgJSAxMik7IC8qIG1vbnRocyAqL1xuICAgIHJldHVybiBpbnQzMnM7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldEZpeGVkU2l6ZUxpc3QgPSAoZGF0YSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCB7IHN0cmlkZSwgY2hpbGRyZW4gfSA9IGRhdGE7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlblswXTtcbiAgICBjb25zdCBzbGljZSA9IGNoaWxkLnNsaWNlKGluZGV4ICogc3RyaWRlLCBzdHJpZGUpO1xuICAgIHJldHVybiBuZXcgVmVjdG9yKFtzbGljZV0pO1xufTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0TnVsbCA9IHdyYXBHZXQoZ2V0TnVsbCk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdEJvb2wgPSB3cmFwR2V0KGdldEJvb2wpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnQgPSB3cmFwR2V0KGdldEludCk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludDggPSB3cmFwR2V0KGdldE51bWVyaWMpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnQxNiA9IHdyYXBHZXQoZ2V0TnVtZXJpYyk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludDMyID0gd3JhcEdldChnZXROdW1lcmljKTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50NjQgPSB3cmFwR2V0KGdldEJpZ0ludHMpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRVaW50OCA9IHdyYXBHZXQoZ2V0TnVtZXJpYyk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFVpbnQxNiA9IHdyYXBHZXQoZ2V0TnVtZXJpYyk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFVpbnQzMiA9IHdyYXBHZXQoZ2V0TnVtZXJpYyk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFVpbnQ2NCA9IHdyYXBHZXQoZ2V0QmlnSW50cyk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdEZsb2F0ID0gd3JhcEdldChnZXRGbG9hdCk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdEZsb2F0MTYgPSB3cmFwR2V0KGdldEZsb2F0MTYpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRGbG9hdDMyID0gd3JhcEdldChnZXROdW1lcmljKTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0RmxvYXQ2NCA9IHdyYXBHZXQoZ2V0TnVtZXJpYyk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFV0ZjggPSB3cmFwR2V0KGdldFV0ZjgpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRCaW5hcnkgPSB3cmFwR2V0KGdldEJpbmFyeSk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdEZpeGVkU2l6ZUJpbmFyeSA9IHdyYXBHZXQoZ2V0Rml4ZWRTaXplQmluYXJ5KTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGF0ZSA9IHdyYXBHZXQoZ2V0RGF0ZSk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdERhdGVEYXkgPSB3cmFwR2V0KGdldERhdGVEYXkpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXREYXRlTWlsbGlzZWNvbmQgPSB3cmFwR2V0KGdldERhdGVNaWxsaXNlY29uZCk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcCA9IHdyYXBHZXQoZ2V0VGltZXN0YW1wKTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wU2Vjb25kID0gd3JhcEdldChnZXRUaW1lc3RhbXBTZWNvbmQpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBNaWxsaXNlY29uZCA9IHdyYXBHZXQoZ2V0VGltZXN0YW1wTWlsbGlzZWNvbmQpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBNaWNyb3NlY29uZCA9IHdyYXBHZXQoZ2V0VGltZXN0YW1wTWljcm9zZWNvbmQpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBOYW5vc2Vjb25kID0gd3JhcEdldChnZXRUaW1lc3RhbXBOYW5vc2Vjb25kKTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZSA9IHdyYXBHZXQoZ2V0VGltZSk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVTZWNvbmQgPSB3cmFwR2V0KGdldFRpbWVTZWNvbmQpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lTWlsbGlzZWNvbmQgPSB3cmFwR2V0KGdldFRpbWVNaWxsaXNlY29uZCk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVNaWNyb3NlY29uZCA9IHdyYXBHZXQoZ2V0VGltZU1pY3Jvc2Vjb25kKTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZU5hbm9zZWNvbmQgPSB3cmFwR2V0KGdldFRpbWVOYW5vc2Vjb25kKTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVjaW1hbCA9IHdyYXBHZXQoZ2V0RGVjaW1hbCk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdExpc3QgPSB3cmFwR2V0KGdldExpc3QpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRTdHJ1Y3QgPSB3cmFwR2V0KGdldFN0cnVjdCk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFVuaW9uID0gd3JhcEdldChnZXRVbmlvbik7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdERlbnNlVW5pb24gPSB3cmFwR2V0KGdldERlbnNlVW5pb24pO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRTcGFyc2VVbmlvbiA9IHdyYXBHZXQoZ2V0U3BhcnNlVW5pb24pO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXREaWN0aW9uYXJ5ID0gd3JhcEdldChnZXREaWN0aW9uYXJ5KTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50ZXJ2YWwgPSB3cmFwR2V0KGdldEludGVydmFsKTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50ZXJ2YWxEYXlUaW1lID0gd3JhcEdldChnZXRJbnRlcnZhbERheVRpbWUpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnRlcnZhbFllYXJNb250aCA9IHdyYXBHZXQoZ2V0SW50ZXJ2YWxZZWFyTW9udGgpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRGaXhlZFNpemVMaXN0ID0gd3JhcEdldChnZXRGaXhlZFNpemVMaXN0KTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0TWFwID0gd3JhcEdldChnZXRNYXApO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBpbnN0YW5jZSA9IG5ldyBHZXRWaXNpdG9yKCk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldC5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IFZpc2l0b3IgfSBmcm9tICcuLi92aXNpdG9yLm1qcyc7XG5pbXBvcnQgeyBpbnN0YW5jZSBhcyBnZXRWaXNpdG9yIH0gZnJvbSAnLi9nZXQubWpzJztcbmltcG9ydCB7IGdldEJvb2wsIEJpdEl0ZXJhdG9yIH0gZnJvbSAnLi4vdXRpbC9iaXQubWpzJztcbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnRDb21wYXJhdG9yIH0gZnJvbSAnLi4vdXRpbC92ZWN0b3IubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgSW5kZXhPZlZpc2l0b3IgZXh0ZW5kcyBWaXNpdG9yIHtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBudWxsSW5kZXhPZihkYXRhLCBzZWFyY2hFbGVtZW50KSB7XG4gICAgLy8gaWYgeW91J3JlIGxvb2tpbmcgZm9yIG51bGxzIGFuZCB0aGUgdmVjdG9yIGlzbid0IGVtcHR5LCB3ZSd2ZSBnb3QgJ2VtIVxuICAgIHJldHVybiBzZWFyY2hFbGVtZW50ID09PSBudWxsICYmIGRhdGEubGVuZ3RoID4gMCA/IDAgOiAtMTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBpbmRleE9mTnVsbChkYXRhLCBmcm9tSW5kZXgpIHtcbiAgICBjb25zdCB7IG51bGxCaXRtYXAgfSA9IGRhdGE7XG4gICAgaWYgKCFudWxsQml0bWFwIHx8IGRhdGEubnVsbENvdW50IDw9IDApIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yIChjb25zdCBpc1ZhbGlkIG9mIG5ldyBCaXRJdGVyYXRvcihudWxsQml0bWFwLCBkYXRhLm9mZnNldCArIChmcm9tSW5kZXggfHwgMCksIGRhdGEubGVuZ3RoLCBudWxsQml0bWFwLCBnZXRCb29sKSkge1xuICAgICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICAgICsraTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGluZGV4T2ZWYWx1ZShkYXRhLCBzZWFyY2hFbGVtZW50LCBmcm9tSW5kZXgpIHtcbiAgICBpZiAoc2VhcmNoRWxlbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgaWYgKHNlYXJjaEVsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4T2ZOdWxsKGRhdGEsIGZyb21JbmRleCk7XG4gICAgfVxuICAgIGNvbnN0IGdldCA9IGdldFZpc2l0b3IuZ2V0VmlzaXRGbihkYXRhKTtcbiAgICBjb25zdCBjb21wYXJlID0gY3JlYXRlRWxlbWVudENvbXBhcmF0b3Ioc2VhcmNoRWxlbWVudCk7XG4gICAgZm9yIChsZXQgaSA9IChmcm9tSW5kZXggfHwgMCkgLSAxLCBuID0gZGF0YS5sZW5ndGg7ICsraSA8IG47KSB7XG4gICAgICAgIGlmIChjb21wYXJlKGdldChkYXRhLCBpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBpbmRleE9mVW5pb24oZGF0YSwgc2VhcmNoRWxlbWVudCwgZnJvbUluZGV4KSB7XG4gICAgLy8gVW5pb25zIGFyZSBzcGVjaWFsIC0tIHRoZXkgZG8gaGF2ZSBhIG51bGxCaXRtYXAsIGJ1dCBzbyBjYW4gdGhlaXIgY2hpbGRyZW4uXG4gICAgLy8gSWYgdGhlIHNlYXJjaEVsZW1lbnQgaXMgbnVsbCwgd2UgZG9uJ3Qga25vdyB3aGV0aGVyIGl0IGNhbWUgZnJvbSB0aGUgVW5pb24nc1xuICAgIC8vIGJpdG1hcCBvciBvbmUgb2YgaXRzIGNoaWxkcmVucycuIFNvIHdlIGRvbid0IGludGVycm9nYXRlIHRoZSBVbmlvbidzIGJpdG1hcCxcbiAgICAvLyBzaW5jZSB0aGF0IHdpbGwgcmVwb3J0IHRoZSB3cm9uZyBpbmRleCBpZiBhIGNoaWxkIGhhcyBhIG51bGwgYmVmb3JlIHRoZSBVbmlvbi5cbiAgICBjb25zdCBnZXQgPSBnZXRWaXNpdG9yLmdldFZpc2l0Rm4oZGF0YSk7XG4gICAgY29uc3QgY29tcGFyZSA9IGNyZWF0ZUVsZW1lbnRDb21wYXJhdG9yKHNlYXJjaEVsZW1lbnQpO1xuICAgIGZvciAobGV0IGkgPSAoZnJvbUluZGV4IHx8IDApIC0gMSwgbiA9IGRhdGEubGVuZ3RoOyArK2kgPCBuOykge1xuICAgICAgICBpZiAoY29tcGFyZShnZXQoZGF0YSwgaSkpKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXROdWxsID0gbnVsbEluZGV4T2Y7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRCb29sID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50ID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50OCA9IGluZGV4T2ZWYWx1ZTtcbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludDE2ID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50MzIgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnQ2NCA9IGluZGV4T2ZWYWx1ZTtcbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdFVpbnQ4ID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0VWludDE2ID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0VWludDMyID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0VWludDY0ID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0RmxvYXQgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRGbG9hdDE2ID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0RmxvYXQzMiA9IGluZGV4T2ZWYWx1ZTtcbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdEZsb2F0NjQgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRVdGY4ID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0QmluYXJ5ID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0Rml4ZWRTaXplQmluYXJ5ID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGF0ZSA9IGluZGV4T2ZWYWx1ZTtcbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdERhdGVEYXkgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXREYXRlTWlsbGlzZWNvbmQgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXAgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBTZWNvbmQgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBNaWxsaXNlY29uZCA9IGluZGV4T2ZWYWx1ZTtcbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcE1pY3Jvc2Vjb25kID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wTmFub3NlY29uZCA9IGluZGV4T2ZWYWx1ZTtcbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWUgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lU2Vjb25kID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZU1pbGxpc2Vjb25kID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZU1pY3Jvc2Vjb25kID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZU5hbm9zZWNvbmQgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXREZWNpbWFsID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0TGlzdCA9IGluZGV4T2ZWYWx1ZTtcbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdFN0cnVjdCA9IGluZGV4T2ZWYWx1ZTtcbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdFVuaW9uID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVuc2VVbmlvbiA9IGluZGV4T2ZVbmlvbjtcbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdFNwYXJzZVVuaW9uID0gaW5kZXhPZlVuaW9uO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGljdGlvbmFyeSA9IGluZGV4T2ZWYWx1ZTtcbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludGVydmFsID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50ZXJ2YWxEYXlUaW1lID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50ZXJ2YWxZZWFyTW9udGggPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRGaXhlZFNpemVMaXN0ID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0TWFwID0gaW5kZXhPZlZhbHVlO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBpbnN0YW5jZSA9IG5ldyBJbmRleE9mVmlzaXRvcigpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleG9mLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgVmlzaXRvciB9IGZyb20gJy4uL3Zpc2l0b3IubWpzJztcbmltcG9ydCB7IFR5cGUsIFByZWNpc2lvbiB9IGZyb20gJy4uL2VudW0ubWpzJztcbmltcG9ydCB7IEZsb2F0LCBJbnQsIFRpbWUsIH0gZnJvbSAnLi4vdHlwZS5tanMnO1xuaW1wb3J0IHsgQ2h1bmtlZEl0ZXJhdG9yIH0gZnJvbSAnLi4vdXRpbC9jaHVuay5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBJdGVyYXRvclZpc2l0b3IgZXh0ZW5kcyBWaXNpdG9yIHtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiB2ZWN0b3JJdGVyYXRvcih2ZWN0b3IpIHtcbiAgICBjb25zdCB7IHR5cGUgfSA9IHZlY3RvcjtcbiAgICAvLyBGYXN0IGNhc2UsIGRlZmVyIHRvIG5hdGl2ZSBpdGVyYXRvcnMgaWYgcG9zc2libGVcbiAgICBpZiAodmVjdG9yLm51bGxDb3VudCA9PT0gMCAmJiB2ZWN0b3Iuc3RyaWRlID09PSAxICYmICgodHlwZS50eXBlSWQgPT09IFR5cGUuVGltZXN0YW1wKSB8fFxuICAgICAgICAodHlwZSBpbnN0YW5jZW9mIEludCAmJiB0eXBlLmJpdFdpZHRoICE9PSA2NCkgfHxcbiAgICAgICAgKHR5cGUgaW5zdGFuY2VvZiBUaW1lICYmIHR5cGUuYml0V2lkdGggIT09IDY0KSB8fFxuICAgICAgICAodHlwZSBpbnN0YW5jZW9mIEZsb2F0ICYmIHR5cGUucHJlY2lzaW9uICE9PSBQcmVjaXNpb24uSEFMRikpKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2h1bmtlZEl0ZXJhdG9yKHZlY3Rvci5kYXRhLmxlbmd0aCwgKGNodW5rSW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB2ZWN0b3IuZGF0YVtjaHVua0luZGV4XTtcbiAgICAgICAgICAgIHJldHVybiBkYXRhLnZhbHVlcy5zdWJhcnJheSgwLCBkYXRhLmxlbmd0aClbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gT3RoZXJ3aXNlLCBpdGVyYXRlIG1hbnVhbGx5XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgcmV0dXJuIG5ldyBDaHVua2VkSXRlcmF0b3IodmVjdG9yLmRhdGEubGVuZ3RoLCAoY2h1bmtJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gdmVjdG9yLmRhdGFbY2h1bmtJbmRleF07XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgICAgICBjb25zdCBpbm5lciA9IHZlY3Rvci5zbGljZShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7XG4gICAgICAgIG9mZnNldCArPSBsZW5ndGg7XG4gICAgICAgIHJldHVybiBuZXcgVmVjdG9ySXRlcmF0b3IoaW5uZXIpO1xuICAgIH0pO1xufVxuLyoqIEBpZ25vcmUgKi9cbmNsYXNzIFZlY3Rvckl0ZXJhdG9yIHtcbiAgICBjb25zdHJ1Y3Rvcih2ZWN0b3IpIHtcbiAgICAgICAgdGhpcy52ZWN0b3IgPSB2ZWN0b3I7XG4gICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIH1cbiAgICBuZXh0KCkge1xuICAgICAgICBpZiAodGhpcy5pbmRleCA8IHRoaXMudmVjdG9yLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy52ZWN0b3IuZ2V0KHRoaXMuaW5kZXgrKylcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGwgfTtcbiAgICB9XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXROdWxsID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0Qm9vbCA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludCA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludDggPSB2ZWN0b3JJdGVyYXRvcjtcbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnQxNiA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludDMyID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50NjQgPSB2ZWN0b3JJdGVyYXRvcjtcbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXRVaW50OCA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdFVpbnQxNiA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdFVpbnQzMiA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdFVpbnQ2NCA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdEZsb2F0ID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RmxvYXQxNiA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdEZsb2F0MzIgPSB2ZWN0b3JJdGVyYXRvcjtcbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXRGbG9hdDY0ID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VXRmOCA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdEJpbmFyeSA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdEZpeGVkU2l6ZUJpbmFyeSA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdERhdGUgPSB2ZWN0b3JJdGVyYXRvcjtcbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXREYXRlRGF5ID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGF0ZU1pbGxpc2Vjb25kID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wU2Vjb25kID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wTWlsbGlzZWNvbmQgPSB2ZWN0b3JJdGVyYXRvcjtcbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBNaWNyb3NlY29uZCA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcE5hbm9zZWNvbmQgPSB2ZWN0b3JJdGVyYXRvcjtcbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZVNlY29uZCA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVNaWxsaXNlY29uZCA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVNaWNyb3NlY29uZCA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVOYW5vc2Vjb25kID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVjaW1hbCA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdExpc3QgPSB2ZWN0b3JJdGVyYXRvcjtcbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXRTdHJ1Y3QgPSB2ZWN0b3JJdGVyYXRvcjtcbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXRVbmlvbiA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdERlbnNlVW5pb24gPSB2ZWN0b3JJdGVyYXRvcjtcbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXRTcGFyc2VVbmlvbiA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdERpY3Rpb25hcnkgPSB2ZWN0b3JJdGVyYXRvcjtcbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnRlcnZhbCA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludGVydmFsRGF5VGltZSA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludGVydmFsWWVhck1vbnRoID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0Rml4ZWRTaXplTGlzdCA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdE1hcCA9IHZlY3Rvckl0ZXJhdG9yO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBpbnN0YW5jZSA9IG5ldyBJdGVyYXRvclZpc2l0b3IoKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXRlcmF0b3IubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBWaXNpdG9yIH0gZnJvbSAnLi4vdmlzaXRvci5tanMnO1xuaW1wb3J0IHsgVHlwZSBhcyBBcnJvd1R5cGUgfSBmcm9tICcuLi9mYi90eXBlLm1qcyc7XG5pbXBvcnQgeyBQcmVjaXNpb24sIERhdGVVbml0LCBUaW1lVW5pdCwgSW50ZXJ2YWxVbml0LCBVbmlvbk1vZGUgfSBmcm9tICcuLi9lbnVtLm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEpTT05UeXBlQXNzZW1ibGVyIGV4dGVuZHMgVmlzaXRvciB7XG4gICAgdmlzaXQobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZSA9PSBudWxsID8gdW5kZWZpbmVkIDogc3VwZXIudmlzaXQobm9kZSk7XG4gICAgfVxuICAgIHZpc2l0TnVsbCh7IHR5cGVJZCB9KSB7XG4gICAgICAgIHJldHVybiB7ICduYW1lJzogQXJyb3dUeXBlW3R5cGVJZF0udG9Mb3dlckNhc2UoKSB9O1xuICAgIH1cbiAgICB2aXNpdEludCh7IHR5cGVJZCwgYml0V2lkdGgsIGlzU2lnbmVkIH0pIHtcbiAgICAgICAgcmV0dXJuIHsgJ25hbWUnOiBBcnJvd1R5cGVbdHlwZUlkXS50b0xvd2VyQ2FzZSgpLCAnYml0V2lkdGgnOiBiaXRXaWR0aCwgJ2lzU2lnbmVkJzogaXNTaWduZWQgfTtcbiAgICB9XG4gICAgdmlzaXRGbG9hdCh7IHR5cGVJZCwgcHJlY2lzaW9uIH0pIHtcbiAgICAgICAgcmV0dXJuIHsgJ25hbWUnOiBBcnJvd1R5cGVbdHlwZUlkXS50b0xvd2VyQ2FzZSgpLCAncHJlY2lzaW9uJzogUHJlY2lzaW9uW3ByZWNpc2lvbl0gfTtcbiAgICB9XG4gICAgdmlzaXRCaW5hcnkoeyB0eXBlSWQgfSkge1xuICAgICAgICByZXR1cm4geyAnbmFtZSc6IEFycm93VHlwZVt0eXBlSWRdLnRvTG93ZXJDYXNlKCkgfTtcbiAgICB9XG4gICAgdmlzaXRCb29sKHsgdHlwZUlkIH0pIHtcbiAgICAgICAgcmV0dXJuIHsgJ25hbWUnOiBBcnJvd1R5cGVbdHlwZUlkXS50b0xvd2VyQ2FzZSgpIH07XG4gICAgfVxuICAgIHZpc2l0VXRmOCh7IHR5cGVJZCB9KSB7XG4gICAgICAgIHJldHVybiB7ICduYW1lJzogQXJyb3dUeXBlW3R5cGVJZF0udG9Mb3dlckNhc2UoKSB9O1xuICAgIH1cbiAgICB2aXNpdERlY2ltYWwoeyB0eXBlSWQsIHNjYWxlLCBwcmVjaXNpb24sIGJpdFdpZHRoIH0pIHtcbiAgICAgICAgcmV0dXJuIHsgJ25hbWUnOiBBcnJvd1R5cGVbdHlwZUlkXS50b0xvd2VyQ2FzZSgpLCAnc2NhbGUnOiBzY2FsZSwgJ3ByZWNpc2lvbic6IHByZWNpc2lvbiwgJ2JpdFdpZHRoJzogYml0V2lkdGggfTtcbiAgICB9XG4gICAgdmlzaXREYXRlKHsgdHlwZUlkLCB1bml0IH0pIHtcbiAgICAgICAgcmV0dXJuIHsgJ25hbWUnOiBBcnJvd1R5cGVbdHlwZUlkXS50b0xvd2VyQ2FzZSgpLCAndW5pdCc6IERhdGVVbml0W3VuaXRdIH07XG4gICAgfVxuICAgIHZpc2l0VGltZSh7IHR5cGVJZCwgdW5pdCwgYml0V2lkdGggfSkge1xuICAgICAgICByZXR1cm4geyAnbmFtZSc6IEFycm93VHlwZVt0eXBlSWRdLnRvTG93ZXJDYXNlKCksICd1bml0JzogVGltZVVuaXRbdW5pdF0sIGJpdFdpZHRoIH07XG4gICAgfVxuICAgIHZpc2l0VGltZXN0YW1wKHsgdHlwZUlkLCB0aW1lem9uZSwgdW5pdCB9KSB7XG4gICAgICAgIHJldHVybiB7ICduYW1lJzogQXJyb3dUeXBlW3R5cGVJZF0udG9Mb3dlckNhc2UoKSwgJ3VuaXQnOiBUaW1lVW5pdFt1bml0XSwgdGltZXpvbmUgfTtcbiAgICB9XG4gICAgdmlzaXRJbnRlcnZhbCh7IHR5cGVJZCwgdW5pdCB9KSB7XG4gICAgICAgIHJldHVybiB7ICduYW1lJzogQXJyb3dUeXBlW3R5cGVJZF0udG9Mb3dlckNhc2UoKSwgJ3VuaXQnOiBJbnRlcnZhbFVuaXRbdW5pdF0gfTtcbiAgICB9XG4gICAgdmlzaXRMaXN0KHsgdHlwZUlkIH0pIHtcbiAgICAgICAgcmV0dXJuIHsgJ25hbWUnOiBBcnJvd1R5cGVbdHlwZUlkXS50b0xvd2VyQ2FzZSgpIH07XG4gICAgfVxuICAgIHZpc2l0U3RydWN0KHsgdHlwZUlkIH0pIHtcbiAgICAgICAgcmV0dXJuIHsgJ25hbWUnOiBBcnJvd1R5cGVbdHlwZUlkXS50b0xvd2VyQ2FzZSgpIH07XG4gICAgfVxuICAgIHZpc2l0VW5pb24oeyB0eXBlSWQsIG1vZGUsIHR5cGVJZHMgfSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ25hbWUnOiBBcnJvd1R5cGVbdHlwZUlkXS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgJ21vZGUnOiBVbmlvbk1vZGVbbW9kZV0sXG4gICAgICAgICAgICAndHlwZUlkcyc6IFsuLi50eXBlSWRzXVxuICAgICAgICB9O1xuICAgIH1cbiAgICB2aXNpdERpY3Rpb25hcnkobm9kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpdChub2RlLmRpY3Rpb25hcnkpO1xuICAgIH1cbiAgICB2aXNpdEZpeGVkU2l6ZUJpbmFyeSh7IHR5cGVJZCwgYnl0ZVdpZHRoIH0pIHtcbiAgICAgICAgcmV0dXJuIHsgJ25hbWUnOiBBcnJvd1R5cGVbdHlwZUlkXS50b0xvd2VyQ2FzZSgpLCAnYnl0ZVdpZHRoJzogYnl0ZVdpZHRoIH07XG4gICAgfVxuICAgIHZpc2l0Rml4ZWRTaXplTGlzdCh7IHR5cGVJZCwgbGlzdFNpemUgfSkge1xuICAgICAgICByZXR1cm4geyAnbmFtZSc6IEFycm93VHlwZVt0eXBlSWRdLnRvTG93ZXJDYXNlKCksICdsaXN0U2l6ZSc6IGxpc3RTaXplIH07XG4gICAgfVxuICAgIHZpc2l0TWFwKHsgdHlwZUlkLCBrZXlzU29ydGVkIH0pIHtcbiAgICAgICAgcmV0dXJuIHsgJ25hbWUnOiBBcnJvd1R5cGVbdHlwZUlkXS50b0xvd2VyQ2FzZSgpLCAna2V5c1NvcnRlZCc6IGtleXNTb3J0ZWQgfTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWpzb250eXBlYXNzZW1ibGVyLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgQk4gfSBmcm9tICcuLi91dGlsL2JuLm1qcyc7XG5pbXBvcnQgeyBWZWN0b3IgfSBmcm9tICcuLi92ZWN0b3IubWpzJztcbmltcG9ydCB7IFZpc2l0b3IgfSBmcm9tICcuLi92aXNpdG9yLm1qcyc7XG5pbXBvcnQgeyBCdWZmZXJUeXBlIH0gZnJvbSAnLi4vZW51bS5tanMnO1xuaW1wb3J0IHsgVW5pb25Nb2RlLCBEYXRlVW5pdCwgVGltZVVuaXQgfSBmcm9tICcuLi9lbnVtLm1qcyc7XG5pbXBvcnQgeyBCaXRJdGVyYXRvciwgZ2V0Qml0LCBnZXRCb29sIH0gZnJvbSAnLi4vdXRpbC9iaXQubWpzJztcbmltcG9ydCB7IERhdGFUeXBlLCB9IGZyb20gJy4uL3R5cGUubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgSlNPTlZlY3RvckFzc2VtYmxlciBleHRlbmRzIFZpc2l0b3Ige1xuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBhc3NlbWJsZSguLi5iYXRjaGVzKSB7XG4gICAgICAgIGNvbnN0IGFzc2VtbGJlciA9IG5ldyBKU09OVmVjdG9yQXNzZW1ibGVyKCk7XG4gICAgICAgIHJldHVybiBiYXRjaGVzLm1hcCgoeyBzY2hlbWEsIGRhdGEgfSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFzc2VtbGJlci52aXNpdE1hbnkoc2NoZW1hLmZpZWxkcywgZGF0YS5jaGlsZHJlbik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB2aXNpdCh7IG5hbWUgfSwgZGF0YSkge1xuICAgICAgICBjb25zdCB7IGxlbmd0aCB9ID0gZGF0YTtcbiAgICAgICAgY29uc3QgeyBvZmZzZXQsIG51bGxDb3VudCwgbnVsbEJpdG1hcCB9ID0gZGF0YTtcbiAgICAgICAgY29uc3QgdHlwZSA9IERhdGFUeXBlLmlzRGljdGlvbmFyeShkYXRhLnR5cGUpID8gZGF0YS50eXBlLmluZGljZXMgOiBkYXRhLnR5cGU7XG4gICAgICAgIGNvbnN0IGJ1ZmZlcnMgPSBPYmplY3QuYXNzaWduKFtdLCBkYXRhLmJ1ZmZlcnMsIHsgW0J1ZmZlclR5cGUuVkFMSURJVFldOiB1bmRlZmluZWQgfSk7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsgJ25hbWUnOiBuYW1lLCAnY291bnQnOiBsZW5ndGgsICdWQUxJRElUWSc6IERhdGFUeXBlLmlzTnVsbCh0eXBlKSA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIDogbnVsbENvdW50IDw9IDAgPyBBcnJheS5mcm9tKHsgbGVuZ3RoIH0sICgpID0+IDEpXG4gICAgICAgICAgICAgICAgICAgIDogWy4uLm5ldyBCaXRJdGVyYXRvcihudWxsQml0bWFwLCBvZmZzZXQsIGxlbmd0aCwgbnVsbCwgZ2V0Qml0KV0gfSwgc3VwZXIudmlzaXQoZGF0YS5jbG9uZSh0eXBlLCBvZmZzZXQsIGxlbmd0aCwgMCwgYnVmZmVycykpKTtcbiAgICB9XG4gICAgdmlzaXROdWxsKCkgeyByZXR1cm4ge307IH1cbiAgICB2aXNpdEJvb2woeyB2YWx1ZXMsIG9mZnNldCwgbGVuZ3RoIH0pIHtcbiAgICAgICAgcmV0dXJuIHsgJ0RBVEEnOiBbLi4ubmV3IEJpdEl0ZXJhdG9yKHZhbHVlcywgb2Zmc2V0LCBsZW5ndGgsIG51bGwsIGdldEJvb2wpXSB9O1xuICAgIH1cbiAgICB2aXNpdEludChkYXRhKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnREFUQSc6IGRhdGEudHlwZS5iaXRXaWR0aCA8IDY0XG4gICAgICAgICAgICAgICAgPyBbLi4uZGF0YS52YWx1ZXNdXG4gICAgICAgICAgICAgICAgOiBbLi4uYmlnTnVtc1RvU3RyaW5ncyhkYXRhLnZhbHVlcywgMildXG4gICAgICAgIH07XG4gICAgfVxuICAgIHZpc2l0RmxvYXQoZGF0YSkge1xuICAgICAgICByZXR1cm4geyAnREFUQSc6IFsuLi5kYXRhLnZhbHVlc10gfTtcbiAgICB9XG4gICAgdmlzaXRVdGY4KGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHsgJ0RBVEEnOiBbLi4ubmV3IFZlY3RvcihbZGF0YV0pXSwgJ09GRlNFVCc6IFsuLi5kYXRhLnZhbHVlT2Zmc2V0c10gfTtcbiAgICB9XG4gICAgdmlzaXRCaW5hcnkoZGF0YSkge1xuICAgICAgICByZXR1cm4geyAnREFUQSc6IFsuLi5iaW5hcnlUb1N0cmluZyhuZXcgVmVjdG9yKFtkYXRhXSkpXSwgT0ZGU0VUOiBbLi4uZGF0YS52YWx1ZU9mZnNldHNdIH07XG4gICAgfVxuICAgIHZpc2l0Rml4ZWRTaXplQmluYXJ5KGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHsgJ0RBVEEnOiBbLi4uYmluYXJ5VG9TdHJpbmcobmV3IFZlY3RvcihbZGF0YV0pKV0gfTtcbiAgICB9XG4gICAgdmlzaXREYXRlKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdEQVRBJzogZGF0YS50eXBlLnVuaXQgPT09IERhdGVVbml0LkRBWVxuICAgICAgICAgICAgICAgID8gWy4uLmRhdGEudmFsdWVzXVxuICAgICAgICAgICAgICAgIDogWy4uLmJpZ051bXNUb1N0cmluZ3MoZGF0YS52YWx1ZXMsIDIpXVxuICAgICAgICB9O1xuICAgIH1cbiAgICB2aXNpdFRpbWVzdGFtcChkYXRhKSB7XG4gICAgICAgIHJldHVybiB7ICdEQVRBJzogWy4uLmJpZ051bXNUb1N0cmluZ3MoZGF0YS52YWx1ZXMsIDIpXSB9O1xuICAgIH1cbiAgICB2aXNpdFRpbWUoZGF0YSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ0RBVEEnOiBkYXRhLnR5cGUudW5pdCA8IFRpbWVVbml0Lk1JQ1JPU0VDT05EXG4gICAgICAgICAgICAgICAgPyBbLi4uZGF0YS52YWx1ZXNdXG4gICAgICAgICAgICAgICAgOiBbLi4uYmlnTnVtc1RvU3RyaW5ncyhkYXRhLnZhbHVlcywgMildXG4gICAgICAgIH07XG4gICAgfVxuICAgIHZpc2l0RGVjaW1hbChkYXRhKSB7XG4gICAgICAgIHJldHVybiB7ICdEQVRBJzogWy4uLmJpZ051bXNUb1N0cmluZ3MoZGF0YS52YWx1ZXMsIDQpXSB9O1xuICAgIH1cbiAgICB2aXNpdExpc3QoZGF0YSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ09GRlNFVCc6IFsuLi5kYXRhLnZhbHVlT2Zmc2V0c10sXG4gICAgICAgICAgICAnY2hpbGRyZW4nOiB0aGlzLnZpc2l0TWFueShkYXRhLnR5cGUuY2hpbGRyZW4sIGRhdGEuY2hpbGRyZW4pXG4gICAgICAgIH07XG4gICAgfVxuICAgIHZpc2l0U3RydWN0KGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdjaGlsZHJlbic6IHRoaXMudmlzaXRNYW55KGRhdGEudHlwZS5jaGlsZHJlbiwgZGF0YS5jaGlsZHJlbilcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdmlzaXRVbmlvbihkYXRhKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnVFlQRSc6IFsuLi5kYXRhLnR5cGVJZHNdLFxuICAgICAgICAgICAgJ09GRlNFVCc6IGRhdGEudHlwZS5tb2RlID09PSBVbmlvbk1vZGUuRGVuc2UgPyBbLi4uZGF0YS52YWx1ZU9mZnNldHNdIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgJ2NoaWxkcmVuJzogdGhpcy52aXNpdE1hbnkoZGF0YS50eXBlLmNoaWxkcmVuLCBkYXRhLmNoaWxkcmVuKVxuICAgICAgICB9O1xuICAgIH1cbiAgICB2aXNpdEludGVydmFsKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHsgJ0RBVEEnOiBbLi4uZGF0YS52YWx1ZXNdIH07XG4gICAgfVxuICAgIHZpc2l0Rml4ZWRTaXplTGlzdChkYXRhKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnY2hpbGRyZW4nOiB0aGlzLnZpc2l0TWFueShkYXRhLnR5cGUuY2hpbGRyZW4sIGRhdGEuY2hpbGRyZW4pXG4gICAgICAgIH07XG4gICAgfVxuICAgIHZpc2l0TWFwKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdPRkZTRVQnOiBbLi4uZGF0YS52YWx1ZU9mZnNldHNdLFxuICAgICAgICAgICAgJ2NoaWxkcmVuJzogdGhpcy52aXNpdE1hbnkoZGF0YS50eXBlLmNoaWxkcmVuLCBkYXRhLmNoaWxkcmVuKVxuICAgICAgICB9O1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiogYmluYXJ5VG9TdHJpbmcodmVjdG9yKSB7XG4gICAgZm9yIChjb25zdCBvY3RldHMgb2YgdmVjdG9yKSB7XG4gICAgICAgIHlpZWxkIG9jdGV0cy5yZWR1Y2UoKHN0ciwgYnl0ZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAke3N0cn0keygnMCcgKyAoYnl0ZSAmIDB4RkYpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpfWA7XG4gICAgICAgIH0sICcnKS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiogYmlnTnVtc1RvU3RyaW5ncyh2YWx1ZXMsIHN0cmlkZSkge1xuICAgIGNvbnN0IHUzMnMgPSBuZXcgVWludDMyQXJyYXkodmFsdWVzLmJ1ZmZlcik7XG4gICAgZm9yIChsZXQgaSA9IC0xLCBuID0gdTMycy5sZW5ndGggLyBzdHJpZGU7ICsraSA8IG47KSB7XG4gICAgICAgIHlpZWxkIGAke0JOLm5ldyh1MzJzLnN1YmFycmF5KChpICsgMCkgKiBzdHJpZGUsIChpICsgMSkgKiBzdHJpZGUpLCBmYWxzZSl9YDtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWpzb252ZWN0b3Jhc3NlbWJsZXIubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBWZWN0b3IgfSBmcm9tICcuLi92ZWN0b3IubWpzJztcbmltcG9ydCB7IFZpc2l0b3IgfSBmcm9tICcuLi92aXNpdG9yLm1qcyc7XG5pbXBvcnQgeyBlbmNvZGVVdGY4IH0gZnJvbSAnLi4vdXRpbC91dGY4Lm1qcyc7XG5pbXBvcnQgeyBmbG9hdDY0VG9VaW50MTYgfSBmcm9tICcuLi91dGlsL21hdGgubWpzJztcbmltcG9ydCB7IFVuaW9uTW9kZSwgUHJlY2lzaW9uLCBEYXRlVW5pdCwgVGltZVVuaXQsIEludGVydmFsVW5pdCB9IGZyb20gJy4uL2VudW0ubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgU2V0VmlzaXRvciBleHRlbmRzIFZpc2l0b3Ige1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIHdyYXBTZXQoZm4pIHtcbiAgICByZXR1cm4gKGRhdGEsIF8xLCBfMikgPT4ge1xuICAgICAgICBpZiAoZGF0YS5zZXRWYWxpZChfMSwgXzIgIT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmbihkYXRhLCBfMSwgXzIpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3Qgc2V0RXBvY2hNc1RvRGF5cyA9IChkYXRhLCBpbmRleCwgZXBvY2hNcykgPT4geyBkYXRhW2luZGV4XSA9IE1hdGgudHJ1bmMoZXBvY2hNcyAvIDg2NDAwMDAwKTsgfTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3Qgc2V0RXBvY2hNc1RvTWlsbGlzZWNvbmRzTG9uZyA9IChkYXRhLCBpbmRleCwgZXBvY2hNcykgPT4ge1xuICAgIGRhdGFbaW5kZXhdID0gTWF0aC50cnVuYyhlcG9jaE1zICUgNDI5NDk2NzI5Nik7XG4gICAgZGF0YVtpbmRleCArIDFdID0gTWF0aC50cnVuYyhlcG9jaE1zIC8gNDI5NDk2NzI5Nik7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBzZXRFcG9jaE1zVG9NaWNyb3NlY29uZHNMb25nID0gKGRhdGEsIGluZGV4LCBlcG9jaE1zKSA9PiB7XG4gICAgZGF0YVtpbmRleF0gPSBNYXRoLnRydW5jKChlcG9jaE1zICogMTAwMCkgJSA0Mjk0OTY3Mjk2KTtcbiAgICBkYXRhW2luZGV4ICsgMV0gPSBNYXRoLnRydW5jKChlcG9jaE1zICogMTAwMCkgLyA0Mjk0OTY3Mjk2KTtcbn07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IHNldEVwb2NoTXNUb05hbm9zZWNvbmRzTG9uZyA9IChkYXRhLCBpbmRleCwgZXBvY2hNcykgPT4ge1xuICAgIGRhdGFbaW5kZXhdID0gTWF0aC50cnVuYygoZXBvY2hNcyAqIDEwMDAwMDApICUgNDI5NDk2NzI5Nik7XG4gICAgZGF0YVtpbmRleCArIDFdID0gTWF0aC50cnVuYygoZXBvY2hNcyAqIDEwMDAwMDApIC8gNDI5NDk2NzI5Nik7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBzZXRWYXJpYWJsZVdpZHRoQnl0ZXMgPSAodmFsdWVzLCB2YWx1ZU9mZnNldHMsIGluZGV4LCB2YWx1ZSkgPT4ge1xuICAgIGlmIChpbmRleCArIDEgPCB2YWx1ZU9mZnNldHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHsgW2luZGV4XTogeCwgW2luZGV4ICsgMV06IHkgfSA9IHZhbHVlT2Zmc2V0cztcbiAgICAgICAgdmFsdWVzLnNldCh2YWx1ZS5zdWJhcnJheSgwLCB5IC0geCksIHgpO1xuICAgIH1cbn07XG4vKiogQGlnbm9yZSAqL1xuY29uc3Qgc2V0Qm9vbCA9ICh7IG9mZnNldCwgdmFsdWVzIH0sIGluZGV4LCB2YWwpID0+IHtcbiAgICBjb25zdCBpZHggPSBvZmZzZXQgKyBpbmRleDtcbiAgICB2YWwgPyAodmFsdWVzW2lkeCA+PiAzXSB8PSAoMSA8PCAoaWR4ICUgOCkpKSAvLyB0cnVlXG4gICAgICAgIDogKHZhbHVlc1tpZHggPj4gM10gJj0gfigxIDw8IChpZHggJSA4KSkpOyAvLyBmYWxzZVxufTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3Qgc2V0SW50ID0gKHsgdmFsdWVzIH0sIGluZGV4LCB2YWx1ZSkgPT4geyB2YWx1ZXNbaW5kZXhdID0gdmFsdWU7IH07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IHNldEZsb2F0ID0gKHsgdmFsdWVzIH0sIGluZGV4LCB2YWx1ZSkgPT4geyB2YWx1ZXNbaW5kZXhdID0gdmFsdWU7IH07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IHNldEZsb2F0MTYgPSAoeyB2YWx1ZXMgfSwgaW5kZXgsIHZhbHVlKSA9PiB7IHZhbHVlc1tpbmRleF0gPSBmbG9hdDY0VG9VaW50MTYodmFsdWUpOyB9O1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3Qgc2V0QW55RmxvYXQgPSAoZGF0YSwgaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgc3dpdGNoIChkYXRhLnR5cGUucHJlY2lzaW9uKSB7XG4gICAgICAgIGNhc2UgUHJlY2lzaW9uLkhBTEY6XG4gICAgICAgICAgICByZXR1cm4gc2V0RmxvYXQxNihkYXRhLCBpbmRleCwgdmFsdWUpO1xuICAgICAgICBjYXNlIFByZWNpc2lvbi5TSU5HTEU6XG4gICAgICAgIGNhc2UgUHJlY2lzaW9uLkRPVUJMRTpcbiAgICAgICAgICAgIHJldHVybiBzZXRGbG9hdChkYXRhLCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbn07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IHNldERhdGVEYXkgPSAoeyB2YWx1ZXMgfSwgaW5kZXgsIHZhbHVlKSA9PiB7IHNldEVwb2NoTXNUb0RheXModmFsdWVzLCBpbmRleCwgdmFsdWUudmFsdWVPZigpKTsgfTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3Qgc2V0RGF0ZU1pbGxpc2Vjb25kID0gKHsgdmFsdWVzIH0sIGluZGV4LCB2YWx1ZSkgPT4geyBzZXRFcG9jaE1zVG9NaWxsaXNlY29uZHNMb25nKHZhbHVlcywgaW5kZXggKiAyLCB2YWx1ZS52YWx1ZU9mKCkpOyB9O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBzZXRGaXhlZFNpemVCaW5hcnkgPSAoeyBzdHJpZGUsIHZhbHVlcyB9LCBpbmRleCwgdmFsdWUpID0+IHsgdmFsdWVzLnNldCh2YWx1ZS5zdWJhcnJheSgwLCBzdHJpZGUpLCBzdHJpZGUgKiBpbmRleCk7IH07XG4vKiogQGlnbm9yZSAqL1xuY29uc3Qgc2V0QmluYXJ5ID0gKHsgdmFsdWVzLCB2YWx1ZU9mZnNldHMgfSwgaW5kZXgsIHZhbHVlKSA9PiBzZXRWYXJpYWJsZVdpZHRoQnl0ZXModmFsdWVzLCB2YWx1ZU9mZnNldHMsIGluZGV4LCB2YWx1ZSk7XG4vKiogQGlnbm9yZSAqL1xuY29uc3Qgc2V0VXRmOCA9ICh7IHZhbHVlcywgdmFsdWVPZmZzZXRzIH0sIGluZGV4LCB2YWx1ZSkgPT4ge1xuICAgIHNldFZhcmlhYmxlV2lkdGhCeXRlcyh2YWx1ZXMsIHZhbHVlT2Zmc2V0cywgaW5kZXgsIGVuY29kZVV0ZjgodmFsdWUpKTtcbn07XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZXhwb3J0IGNvbnN0IHNldERhdGUgPSAoZGF0YSwgaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgZGF0YS50eXBlLnVuaXQgPT09IERhdGVVbml0LkRBWVxuICAgICAgICA/IHNldERhdGVEYXkoZGF0YSwgaW5kZXgsIHZhbHVlKVxuICAgICAgICA6IHNldERhdGVNaWxsaXNlY29uZChkYXRhLCBpbmRleCwgdmFsdWUpO1xufTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3Qgc2V0VGltZXN0YW1wU2Vjb25kID0gKHsgdmFsdWVzIH0sIGluZGV4LCB2YWx1ZSkgPT4gc2V0RXBvY2hNc1RvTWlsbGlzZWNvbmRzTG9uZyh2YWx1ZXMsIGluZGV4ICogMiwgdmFsdWUgLyAxMDAwKTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3Qgc2V0VGltZXN0YW1wTWlsbGlzZWNvbmQgPSAoeyB2YWx1ZXMgfSwgaW5kZXgsIHZhbHVlKSA9PiBzZXRFcG9jaE1zVG9NaWxsaXNlY29uZHNMb25nKHZhbHVlcywgaW5kZXggKiAyLCB2YWx1ZSk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IHNldFRpbWVzdGFtcE1pY3Jvc2Vjb25kID0gKHsgdmFsdWVzIH0sIGluZGV4LCB2YWx1ZSkgPT4gc2V0RXBvY2hNc1RvTWljcm9zZWNvbmRzTG9uZyh2YWx1ZXMsIGluZGV4ICogMiwgdmFsdWUpO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBzZXRUaW1lc3RhbXBOYW5vc2Vjb25kID0gKHsgdmFsdWVzIH0sIGluZGV4LCB2YWx1ZSkgPT4gc2V0RXBvY2hNc1RvTmFub3NlY29uZHNMb25nKHZhbHVlcywgaW5kZXggKiAyLCB2YWx1ZSk7XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBzZXRUaW1lc3RhbXAgPSAoZGF0YSwgaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgc3dpdGNoIChkYXRhLnR5cGUudW5pdCkge1xuICAgICAgICBjYXNlIFRpbWVVbml0LlNFQ09ORDogcmV0dXJuIHNldFRpbWVzdGFtcFNlY29uZChkYXRhLCBpbmRleCwgdmFsdWUpO1xuICAgICAgICBjYXNlIFRpbWVVbml0Lk1JTExJU0VDT05EOiByZXR1cm4gc2V0VGltZXN0YW1wTWlsbGlzZWNvbmQoZGF0YSwgaW5kZXgsIHZhbHVlKTtcbiAgICAgICAgY2FzZSBUaW1lVW5pdC5NSUNST1NFQ09ORDogcmV0dXJuIHNldFRpbWVzdGFtcE1pY3Jvc2Vjb25kKGRhdGEsIGluZGV4LCB2YWx1ZSk7XG4gICAgICAgIGNhc2UgVGltZVVuaXQuTkFOT1NFQ09ORDogcmV0dXJuIHNldFRpbWVzdGFtcE5hbm9zZWNvbmQoZGF0YSwgaW5kZXgsIHZhbHVlKTtcbiAgICB9XG59O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBzZXRUaW1lU2Vjb25kID0gKHsgdmFsdWVzIH0sIGluZGV4LCB2YWx1ZSkgPT4geyB2YWx1ZXNbaW5kZXhdID0gdmFsdWU7IH07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IHNldFRpbWVNaWxsaXNlY29uZCA9ICh7IHZhbHVlcyB9LCBpbmRleCwgdmFsdWUpID0+IHsgdmFsdWVzW2luZGV4XSA9IHZhbHVlOyB9O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBzZXRUaW1lTWljcm9zZWNvbmQgPSAoeyB2YWx1ZXMgfSwgaW5kZXgsIHZhbHVlKSA9PiB7IHZhbHVlc1tpbmRleF0gPSB2YWx1ZTsgfTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3Qgc2V0VGltZU5hbm9zZWNvbmQgPSAoeyB2YWx1ZXMgfSwgaW5kZXgsIHZhbHVlKSA9PiB7IHZhbHVlc1tpbmRleF0gPSB2YWx1ZTsgfTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IHNldFRpbWUgPSAoZGF0YSwgaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgc3dpdGNoIChkYXRhLnR5cGUudW5pdCkge1xuICAgICAgICBjYXNlIFRpbWVVbml0LlNFQ09ORDogcmV0dXJuIHNldFRpbWVTZWNvbmQoZGF0YSwgaW5kZXgsIHZhbHVlKTtcbiAgICAgICAgY2FzZSBUaW1lVW5pdC5NSUxMSVNFQ09ORDogcmV0dXJuIHNldFRpbWVNaWxsaXNlY29uZChkYXRhLCBpbmRleCwgdmFsdWUpO1xuICAgICAgICBjYXNlIFRpbWVVbml0Lk1JQ1JPU0VDT05EOiByZXR1cm4gc2V0VGltZU1pY3Jvc2Vjb25kKGRhdGEsIGluZGV4LCB2YWx1ZSk7XG4gICAgICAgIGNhc2UgVGltZVVuaXQuTkFOT1NFQ09ORDogcmV0dXJuIHNldFRpbWVOYW5vc2Vjb25kKGRhdGEsIGluZGV4LCB2YWx1ZSk7XG4gICAgfVxufTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3Qgc2V0RGVjaW1hbCA9ICh7IHZhbHVlcywgc3RyaWRlIH0sIGluZGV4LCB2YWx1ZSkgPT4geyB2YWx1ZXMuc2V0KHZhbHVlLnN1YmFycmF5KDAsIHN0cmlkZSksIHN0cmlkZSAqIGluZGV4KTsgfTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBzZXRMaXN0ID0gKGRhdGEsIGluZGV4LCB2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlcyA9IGRhdGEuY2hpbGRyZW5bMF07XG4gICAgY29uc3QgdmFsdWVPZmZzZXRzID0gZGF0YS52YWx1ZU9mZnNldHM7XG4gICAgY29uc3Qgc2V0ID0gaW5zdGFuY2UuZ2V0VmlzaXRGbih2YWx1ZXMpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBmb3IgKGxldCBpZHggPSAtMSwgaXRyID0gdmFsdWVPZmZzZXRzW2luZGV4XSwgZW5kID0gdmFsdWVPZmZzZXRzW2luZGV4ICsgMV07IGl0ciA8IGVuZDspIHtcbiAgICAgICAgICAgIHNldCh2YWx1ZXMsIGl0cisrLCB2YWx1ZVsrK2lkeF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpZHggPSAtMSwgaXRyID0gdmFsdWVPZmZzZXRzW2luZGV4XSwgZW5kID0gdmFsdWVPZmZzZXRzW2luZGV4ICsgMV07IGl0ciA8IGVuZDspIHtcbiAgICAgICAgICAgIHNldCh2YWx1ZXMsIGl0cisrLCB2YWx1ZS5nZXQoKytpZHgpKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4vKiogQGlnbm9yZSAqL1xuY29uc3Qgc2V0TWFwID0gKGRhdGEsIGluZGV4LCB2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlcyA9IGRhdGEuY2hpbGRyZW5bMF07XG4gICAgY29uc3QgeyB2YWx1ZU9mZnNldHMgfSA9IGRhdGE7XG4gICAgY29uc3Qgc2V0ID0gaW5zdGFuY2UuZ2V0VmlzaXRGbih2YWx1ZXMpO1xuICAgIGxldCB7IFtpbmRleF06IGlkeCwgW2luZGV4ICsgMV06IGVuZCB9ID0gdmFsdWVPZmZzZXRzO1xuICAgIGNvbnN0IGVudHJpZXMgPSB2YWx1ZSBpbnN0YW5jZW9mIE1hcCA/IHZhbHVlLmVudHJpZXMoKSA6IE9iamVjdC5lbnRyaWVzKHZhbHVlKTtcbiAgICBmb3IgKGNvbnN0IHZhbCBvZiBlbnRyaWVzKSB7XG4gICAgICAgIHNldCh2YWx1ZXMsIGlkeCwgdmFsKTtcbiAgICAgICAgaWYgKCsraWR4ID49IGVuZClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbn07XG4vKiogQGlnbm9yZSAqLyBjb25zdCBfc2V0U3RydWN0QXJyYXlWYWx1ZSA9IChvLCB2KSA9PiAoc2V0LCBjLCBfLCBpKSA9PiBjICYmIHNldChjLCBvLCB2W2ldKTtcbi8qKiBAaWdub3JlICovIGNvbnN0IF9zZXRTdHJ1Y3RWZWN0b3JWYWx1ZSA9IChvLCB2KSA9PiAoc2V0LCBjLCBfLCBpKSA9PiBjICYmIHNldChjLCBvLCB2LmdldChpKSk7XG4vKiogQGlnbm9yZSAqLyBjb25zdCBfc2V0U3RydWN0TWFwVmFsdWUgPSAobywgdikgPT4gKHNldCwgYywgZiwgXykgPT4gYyAmJiBzZXQoYywgbywgdi5nZXQoZi5uYW1lKSk7XG4vKiogQGlnbm9yZSAqLyBjb25zdCBfc2V0U3RydWN0T2JqZWN0VmFsdWUgPSAobywgdikgPT4gKHNldCwgYywgZiwgXykgPT4gYyAmJiBzZXQoYywgbywgdltmLm5hbWVdKTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBzZXRTdHJ1Y3QgPSAoZGF0YSwgaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgY29uc3QgY2hpbGRTZXR0ZXJzID0gZGF0YS50eXBlLmNoaWxkcmVuLm1hcCgoZikgPT4gaW5zdGFuY2UuZ2V0VmlzaXRGbihmLnR5cGUpKTtcbiAgICBjb25zdCBzZXQgPSB2YWx1ZSBpbnN0YW5jZW9mIE1hcCA/IF9zZXRTdHJ1Y3RNYXBWYWx1ZShpbmRleCwgdmFsdWUpIDpcbiAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBWZWN0b3IgPyBfc2V0U3RydWN0VmVjdG9yVmFsdWUoaW5kZXgsIHZhbHVlKSA6XG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlKSA/IF9zZXRTdHJ1Y3RBcnJheVZhbHVlKGluZGV4LCB2YWx1ZSkgOlxuICAgICAgICAgICAgICAgIF9zZXRTdHJ1Y3RPYmplY3RWYWx1ZShpbmRleCwgdmFsdWUpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLWFycmF5LWZvci1lYWNoXG4gICAgZGF0YS50eXBlLmNoaWxkcmVuLmZvckVhY2goKGYsIGkpID0+IHNldChjaGlsZFNldHRlcnNbaV0sIGRhdGEuY2hpbGRyZW5baV0sIGYsIGkpKTtcbn07XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IHNldFVuaW9uID0gKGRhdGEsIGluZGV4LCB2YWx1ZSkgPT4ge1xuICAgIGRhdGEudHlwZS5tb2RlID09PSBVbmlvbk1vZGUuRGVuc2UgP1xuICAgICAgICBzZXREZW5zZVVuaW9uKGRhdGEsIGluZGV4LCB2YWx1ZSkgOlxuICAgICAgICBzZXRTcGFyc2VVbmlvbihkYXRhLCBpbmRleCwgdmFsdWUpO1xufTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBzZXREZW5zZVVuaW9uID0gKGRhdGEsIGluZGV4LCB2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IGNoaWxkSW5kZXggPSBkYXRhLnR5cGUudHlwZUlkVG9DaGlsZEluZGV4W2RhdGEudHlwZUlkc1tpbmRleF1dO1xuICAgIGNvbnN0IGNoaWxkID0gZGF0YS5jaGlsZHJlbltjaGlsZEluZGV4XTtcbiAgICBpbnN0YW5jZS52aXNpdChjaGlsZCwgZGF0YS52YWx1ZU9mZnNldHNbaW5kZXhdLCB2YWx1ZSk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IHNldFNwYXJzZVVuaW9uID0gKGRhdGEsIGluZGV4LCB2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IGNoaWxkSW5kZXggPSBkYXRhLnR5cGUudHlwZUlkVG9DaGlsZEluZGV4W2RhdGEudHlwZUlkc1tpbmRleF1dO1xuICAgIGNvbnN0IGNoaWxkID0gZGF0YS5jaGlsZHJlbltjaGlsZEluZGV4XTtcbiAgICBpbnN0YW5jZS52aXNpdChjaGlsZCwgaW5kZXgsIHZhbHVlKTtcbn07XG4vKiogQGlnbm9yZSAqL1xuY29uc3Qgc2V0RGljdGlvbmFyeSA9IChkYXRhLCBpbmRleCwgdmFsdWUpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgKF9hID0gZGF0YS5kaWN0aW9uYXJ5KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc2V0KGRhdGEudmFsdWVzW2luZGV4XSwgdmFsdWUpO1xufTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IHNldEludGVydmFsVmFsdWUgPSAoZGF0YSwgaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgKGRhdGEudHlwZS51bml0ID09PSBJbnRlcnZhbFVuaXQuREFZX1RJTUUpXG4gICAgICAgID8gc2V0SW50ZXJ2YWxEYXlUaW1lKGRhdGEsIGluZGV4LCB2YWx1ZSlcbiAgICAgICAgOiBzZXRJbnRlcnZhbFllYXJNb250aChkYXRhLCBpbmRleCwgdmFsdWUpO1xufTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3Qgc2V0SW50ZXJ2YWxEYXlUaW1lID0gKHsgdmFsdWVzIH0sIGluZGV4LCB2YWx1ZSkgPT4geyB2YWx1ZXMuc2V0KHZhbHVlLnN1YmFycmF5KDAsIDIpLCAyICogaW5kZXgpOyB9O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBzZXRJbnRlcnZhbFllYXJNb250aCA9ICh7IHZhbHVlcyB9LCBpbmRleCwgdmFsdWUpID0+IHsgdmFsdWVzW2luZGV4XSA9ICh2YWx1ZVswXSAqIDEyKSArICh2YWx1ZVsxXSAlIDEyKTsgfTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBzZXRGaXhlZFNpemVMaXN0ID0gKGRhdGEsIGluZGV4LCB2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IHsgc3RyaWRlIH0gPSBkYXRhO1xuICAgIGNvbnN0IGNoaWxkID0gZGF0YS5jaGlsZHJlblswXTtcbiAgICBjb25zdCBzZXQgPSBpbnN0YW5jZS5nZXRWaXNpdEZuKGNoaWxkKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gLTEsIG9mZnNldCA9IGluZGV4ICogc3RyaWRlOyArK2lkeCA8IHN0cmlkZTspIHtcbiAgICAgICAgICAgIHNldChjaGlsZCwgb2Zmc2V0ICsgaWR4LCB2YWx1ZVtpZHhdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gLTEsIG9mZnNldCA9IGluZGV4ICogc3RyaWRlOyArK2lkeCA8IHN0cmlkZTspIHtcbiAgICAgICAgICAgIHNldChjaGlsZCwgb2Zmc2V0ICsgaWR4LCB2YWx1ZS5nZXQoaWR4KSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRCb29sID0gd3JhcFNldChzZXRCb29sKTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50ID0gd3JhcFNldChzZXRJbnQpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnQ4ID0gd3JhcFNldChzZXRJbnQpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnQxNiA9IHdyYXBTZXQoc2V0SW50KTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50MzIgPSB3cmFwU2V0KHNldEludCk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludDY0ID0gd3JhcFNldChzZXRJbnQpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRVaW50OCA9IHdyYXBTZXQoc2V0SW50KTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VWludDE2ID0gd3JhcFNldChzZXRJbnQpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRVaW50MzIgPSB3cmFwU2V0KHNldEludCk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFVpbnQ2NCA9IHdyYXBTZXQoc2V0SW50KTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0RmxvYXQgPSB3cmFwU2V0KHNldEFueUZsb2F0KTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0RmxvYXQxNiA9IHdyYXBTZXQoc2V0RmxvYXQxNik7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdEZsb2F0MzIgPSB3cmFwU2V0KHNldEZsb2F0KTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0RmxvYXQ2NCA9IHdyYXBTZXQoc2V0RmxvYXQpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRVdGY4ID0gd3JhcFNldChzZXRVdGY4KTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0QmluYXJ5ID0gd3JhcFNldChzZXRCaW5hcnkpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRGaXhlZFNpemVCaW5hcnkgPSB3cmFwU2V0KHNldEZpeGVkU2l6ZUJpbmFyeSk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdERhdGUgPSB3cmFwU2V0KHNldERhdGUpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXREYXRlRGF5ID0gd3JhcFNldChzZXREYXRlRGF5KTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGF0ZU1pbGxpc2Vjb25kID0gd3JhcFNldChzZXREYXRlTWlsbGlzZWNvbmQpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXAgPSB3cmFwU2V0KHNldFRpbWVzdGFtcCk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcFNlY29uZCA9IHdyYXBTZXQoc2V0VGltZXN0YW1wU2Vjb25kKTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wTWlsbGlzZWNvbmQgPSB3cmFwU2V0KHNldFRpbWVzdGFtcE1pbGxpc2Vjb25kKTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wTWljcm9zZWNvbmQgPSB3cmFwU2V0KHNldFRpbWVzdGFtcE1pY3Jvc2Vjb25kKTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wTmFub3NlY29uZCA9IHdyYXBTZXQoc2V0VGltZXN0YW1wTmFub3NlY29uZCk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWUgPSB3cmFwU2V0KHNldFRpbWUpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lU2Vjb25kID0gd3JhcFNldChzZXRUaW1lU2Vjb25kKTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZU1pbGxpc2Vjb25kID0gd3JhcFNldChzZXRUaW1lTWlsbGlzZWNvbmQpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lTWljcm9zZWNvbmQgPSB3cmFwU2V0KHNldFRpbWVNaWNyb3NlY29uZCk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVOYW5vc2Vjb25kID0gd3JhcFNldChzZXRUaW1lTmFub3NlY29uZCk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdERlY2ltYWwgPSB3cmFwU2V0KHNldERlY2ltYWwpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRMaXN0ID0gd3JhcFNldChzZXRMaXN0KTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0U3RydWN0ID0gd3JhcFNldChzZXRTdHJ1Y3QpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRVbmlvbiA9IHdyYXBTZXQoc2V0VW5pb24pO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXREZW5zZVVuaW9uID0gd3JhcFNldChzZXREZW5zZVVuaW9uKTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0U3BhcnNlVW5pb24gPSB3cmFwU2V0KHNldFNwYXJzZVVuaW9uKTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGljdGlvbmFyeSA9IHdyYXBTZXQoc2V0RGljdGlvbmFyeSk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludGVydmFsID0gd3JhcFNldChzZXRJbnRlcnZhbFZhbHVlKTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50ZXJ2YWxEYXlUaW1lID0gd3JhcFNldChzZXRJbnRlcnZhbERheVRpbWUpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnRlcnZhbFllYXJNb250aCA9IHdyYXBTZXQoc2V0SW50ZXJ2YWxZZWFyTW9udGgpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRGaXhlZFNpemVMaXN0ID0gd3JhcFNldChzZXRGaXhlZFNpemVMaXN0KTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0TWFwID0gd3JhcFNldChzZXRNYXApO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBpbnN0YW5jZSA9IG5ldyBTZXRWaXNpdG9yKCk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNldC5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJztcbnZhciBMb25nID0gZmxhdGJ1ZmZlcnMuTG9uZztcbmltcG9ydCB7IFZpc2l0b3IgfSBmcm9tICcuLi92aXNpdG9yLm1qcyc7XG5pbXBvcnQgeyBOdWxsIH0gZnJvbSAnLi4vZmIvbnVsbC5tanMnO1xuaW1wb3J0IHsgSW50IH0gZnJvbSAnLi4vZmIvaW50Lm1qcyc7XG5pbXBvcnQgeyBGbG9hdGluZ1BvaW50IH0gZnJvbSAnLi4vZmIvZmxvYXRpbmctcG9pbnQubWpzJztcbmltcG9ydCB7IEJpbmFyeSB9IGZyb20gJy4uL2ZiL2JpbmFyeS5tanMnO1xuaW1wb3J0IHsgQm9vbCB9IGZyb20gJy4uL2ZiL2Jvb2wubWpzJztcbmltcG9ydCB7IFV0ZjggfSBmcm9tICcuLi9mYi91dGY4Lm1qcyc7XG5pbXBvcnQgeyBEZWNpbWFsIH0gZnJvbSAnLi4vZmIvZGVjaW1hbC5tanMnO1xuaW1wb3J0IHsgRGF0ZSB9IGZyb20gJy4uL2ZiL2RhdGUubWpzJztcbmltcG9ydCB7IFRpbWUgfSBmcm9tICcuLi9mYi90aW1lLm1qcyc7XG5pbXBvcnQgeyBUaW1lc3RhbXAgfSBmcm9tICcuLi9mYi90aW1lc3RhbXAubWpzJztcbmltcG9ydCB7IEludGVydmFsIH0gZnJvbSAnLi4vZmIvaW50ZXJ2YWwubWpzJztcbmltcG9ydCB7IExpc3QgfSBmcm9tICcuLi9mYi9saXN0Lm1qcyc7XG5pbXBvcnQgeyBTdHJ1Y3RfIGFzIFN0cnVjdCB9IGZyb20gJy4uL2ZiL3N0cnVjdF8ubWpzJztcbmltcG9ydCB7IFVuaW9uIH0gZnJvbSAnLi4vZmIvdW5pb24ubWpzJztcbmltcG9ydCB7IERpY3Rpb25hcnlFbmNvZGluZyB9IGZyb20gJy4uL2ZiL2RpY3Rpb25hcnktZW5jb2RpbmcubWpzJztcbmltcG9ydCB7IEZpeGVkU2l6ZUJpbmFyeSB9IGZyb20gJy4uL2ZiL2ZpeGVkLXNpemUtYmluYXJ5Lm1qcyc7XG5pbXBvcnQgeyBGaXhlZFNpemVMaXN0IH0gZnJvbSAnLi4vZmIvZml4ZWQtc2l6ZS1saXN0Lm1qcyc7XG5pbXBvcnQgeyBNYXAgYXMgTWFwXyB9IGZyb20gJy4uL2ZiL21hcC5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBUeXBlQXNzZW1ibGVyIGV4dGVuZHMgVmlzaXRvciB7XG4gICAgdmlzaXQobm9kZSwgYnVpbGRlcikge1xuICAgICAgICByZXR1cm4gKG5vZGUgPT0gbnVsbCB8fCBidWlsZGVyID09IG51bGwpID8gdW5kZWZpbmVkIDogc3VwZXIudmlzaXQobm9kZSwgYnVpbGRlcik7XG4gICAgfVxuICAgIHZpc2l0TnVsbChfbm9kZSwgYikge1xuICAgICAgICBOdWxsLnN0YXJ0TnVsbChiKTtcbiAgICAgICAgcmV0dXJuIE51bGwuZW5kTnVsbChiKTtcbiAgICB9XG4gICAgdmlzaXRJbnQobm9kZSwgYikge1xuICAgICAgICBJbnQuc3RhcnRJbnQoYik7XG4gICAgICAgIEludC5hZGRCaXRXaWR0aChiLCBub2RlLmJpdFdpZHRoKTtcbiAgICAgICAgSW50LmFkZElzU2lnbmVkKGIsIG5vZGUuaXNTaWduZWQpO1xuICAgICAgICByZXR1cm4gSW50LmVuZEludChiKTtcbiAgICB9XG4gICAgdmlzaXRGbG9hdChub2RlLCBiKSB7XG4gICAgICAgIEZsb2F0aW5nUG9pbnQuc3RhcnRGbG9hdGluZ1BvaW50KGIpO1xuICAgICAgICBGbG9hdGluZ1BvaW50LmFkZFByZWNpc2lvbihiLCBub2RlLnByZWNpc2lvbik7XG4gICAgICAgIHJldHVybiBGbG9hdGluZ1BvaW50LmVuZEZsb2F0aW5nUG9pbnQoYik7XG4gICAgfVxuICAgIHZpc2l0QmluYXJ5KF9ub2RlLCBiKSB7XG4gICAgICAgIEJpbmFyeS5zdGFydEJpbmFyeShiKTtcbiAgICAgICAgcmV0dXJuIEJpbmFyeS5lbmRCaW5hcnkoYik7XG4gICAgfVxuICAgIHZpc2l0Qm9vbChfbm9kZSwgYikge1xuICAgICAgICBCb29sLnN0YXJ0Qm9vbChiKTtcbiAgICAgICAgcmV0dXJuIEJvb2wuZW5kQm9vbChiKTtcbiAgICB9XG4gICAgdmlzaXRVdGY4KF9ub2RlLCBiKSB7XG4gICAgICAgIFV0Zjguc3RhcnRVdGY4KGIpO1xuICAgICAgICByZXR1cm4gVXRmOC5lbmRVdGY4KGIpO1xuICAgIH1cbiAgICB2aXNpdERlY2ltYWwobm9kZSwgYikge1xuICAgICAgICBEZWNpbWFsLnN0YXJ0RGVjaW1hbChiKTtcbiAgICAgICAgRGVjaW1hbC5hZGRTY2FsZShiLCBub2RlLnNjYWxlKTtcbiAgICAgICAgRGVjaW1hbC5hZGRQcmVjaXNpb24oYiwgbm9kZS5wcmVjaXNpb24pO1xuICAgICAgICBEZWNpbWFsLmFkZEJpdFdpZHRoKGIsIG5vZGUuYml0V2lkdGgpO1xuICAgICAgICByZXR1cm4gRGVjaW1hbC5lbmREZWNpbWFsKGIpO1xuICAgIH1cbiAgICB2aXNpdERhdGUobm9kZSwgYikge1xuICAgICAgICBEYXRlLnN0YXJ0RGF0ZShiKTtcbiAgICAgICAgRGF0ZS5hZGRVbml0KGIsIG5vZGUudW5pdCk7XG4gICAgICAgIHJldHVybiBEYXRlLmVuZERhdGUoYik7XG4gICAgfVxuICAgIHZpc2l0VGltZShub2RlLCBiKSB7XG4gICAgICAgIFRpbWUuc3RhcnRUaW1lKGIpO1xuICAgICAgICBUaW1lLmFkZFVuaXQoYiwgbm9kZS51bml0KTtcbiAgICAgICAgVGltZS5hZGRCaXRXaWR0aChiLCBub2RlLmJpdFdpZHRoKTtcbiAgICAgICAgcmV0dXJuIFRpbWUuZW5kVGltZShiKTtcbiAgICB9XG4gICAgdmlzaXRUaW1lc3RhbXAobm9kZSwgYikge1xuICAgICAgICBjb25zdCB0aW1lem9uZSA9IChub2RlLnRpbWV6b25lICYmIGIuY3JlYXRlU3RyaW5nKG5vZGUudGltZXpvbmUpKSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIFRpbWVzdGFtcC5zdGFydFRpbWVzdGFtcChiKTtcbiAgICAgICAgVGltZXN0YW1wLmFkZFVuaXQoYiwgbm9kZS51bml0KTtcbiAgICAgICAgaWYgKHRpbWV6b25lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIFRpbWVzdGFtcC5hZGRUaW1lem9uZShiLCB0aW1lem9uZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRpbWVzdGFtcC5lbmRUaW1lc3RhbXAoYik7XG4gICAgfVxuICAgIHZpc2l0SW50ZXJ2YWwobm9kZSwgYikge1xuICAgICAgICBJbnRlcnZhbC5zdGFydEludGVydmFsKGIpO1xuICAgICAgICBJbnRlcnZhbC5hZGRVbml0KGIsIG5vZGUudW5pdCk7XG4gICAgICAgIHJldHVybiBJbnRlcnZhbC5lbmRJbnRlcnZhbChiKTtcbiAgICB9XG4gICAgdmlzaXRMaXN0KF9ub2RlLCBiKSB7XG4gICAgICAgIExpc3Quc3RhcnRMaXN0KGIpO1xuICAgICAgICByZXR1cm4gTGlzdC5lbmRMaXN0KGIpO1xuICAgIH1cbiAgICB2aXNpdFN0cnVjdChfbm9kZSwgYikge1xuICAgICAgICBTdHJ1Y3Quc3RhcnRTdHJ1Y3RfKGIpO1xuICAgICAgICByZXR1cm4gU3RydWN0LmVuZFN0cnVjdF8oYik7XG4gICAgfVxuICAgIHZpc2l0VW5pb24obm9kZSwgYikge1xuICAgICAgICBVbmlvbi5zdGFydFR5cGVJZHNWZWN0b3IoYiwgbm9kZS50eXBlSWRzLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHR5cGVJZHMgPSBVbmlvbi5jcmVhdGVUeXBlSWRzVmVjdG9yKGIsIG5vZGUudHlwZUlkcyk7XG4gICAgICAgIFVuaW9uLnN0YXJ0VW5pb24oYik7XG4gICAgICAgIFVuaW9uLmFkZE1vZGUoYiwgbm9kZS5tb2RlKTtcbiAgICAgICAgVW5pb24uYWRkVHlwZUlkcyhiLCB0eXBlSWRzKTtcbiAgICAgICAgcmV0dXJuIFVuaW9uLmVuZFVuaW9uKGIpO1xuICAgIH1cbiAgICB2aXNpdERpY3Rpb25hcnkobm9kZSwgYikge1xuICAgICAgICBjb25zdCBpbmRleFR5cGUgPSB0aGlzLnZpc2l0KG5vZGUuaW5kaWNlcywgYik7XG4gICAgICAgIERpY3Rpb25hcnlFbmNvZGluZy5zdGFydERpY3Rpb25hcnlFbmNvZGluZyhiKTtcbiAgICAgICAgRGljdGlvbmFyeUVuY29kaW5nLmFkZElkKGIsIG5ldyBMb25nKG5vZGUuaWQsIDApKTtcbiAgICAgICAgRGljdGlvbmFyeUVuY29kaW5nLmFkZElzT3JkZXJlZChiLCBub2RlLmlzT3JkZXJlZCk7XG4gICAgICAgIGlmIChpbmRleFR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgRGljdGlvbmFyeUVuY29kaW5nLmFkZEluZGV4VHlwZShiLCBpbmRleFR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEaWN0aW9uYXJ5RW5jb2RpbmcuZW5kRGljdGlvbmFyeUVuY29kaW5nKGIpO1xuICAgIH1cbiAgICB2aXNpdEZpeGVkU2l6ZUJpbmFyeShub2RlLCBiKSB7XG4gICAgICAgIEZpeGVkU2l6ZUJpbmFyeS5zdGFydEZpeGVkU2l6ZUJpbmFyeShiKTtcbiAgICAgICAgRml4ZWRTaXplQmluYXJ5LmFkZEJ5dGVXaWR0aChiLCBub2RlLmJ5dGVXaWR0aCk7XG4gICAgICAgIHJldHVybiBGaXhlZFNpemVCaW5hcnkuZW5kRml4ZWRTaXplQmluYXJ5KGIpO1xuICAgIH1cbiAgICB2aXNpdEZpeGVkU2l6ZUxpc3Qobm9kZSwgYikge1xuICAgICAgICBGaXhlZFNpemVMaXN0LnN0YXJ0Rml4ZWRTaXplTGlzdChiKTtcbiAgICAgICAgRml4ZWRTaXplTGlzdC5hZGRMaXN0U2l6ZShiLCBub2RlLmxpc3RTaXplKTtcbiAgICAgICAgcmV0dXJuIEZpeGVkU2l6ZUxpc3QuZW5kRml4ZWRTaXplTGlzdChiKTtcbiAgICB9XG4gICAgdmlzaXRNYXAobm9kZSwgYikge1xuICAgICAgICBNYXBfLnN0YXJ0TWFwKGIpO1xuICAgICAgICBNYXBfLmFkZEtleXNTb3J0ZWQoYiwgbm9kZS5rZXlzU29ydGVkKTtcbiAgICAgICAgcmV0dXJuIE1hcF8uZW5kTWFwKGIpO1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgaW5zdGFuY2UgPSBuZXcgVHlwZUFzc2VtYmxlcigpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlYXNzZW1ibGVyLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgVmlzaXRvciB9IGZyb20gJy4uL3Zpc2l0b3IubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVHlwZUNvbXBhcmF0b3IgZXh0ZW5kcyBWaXNpdG9yIHtcbiAgICBjb21wYXJlU2NoZW1hcyhzY2hlbWEsIG90aGVyKSB7XG4gICAgICAgIHJldHVybiAoc2NoZW1hID09PSBvdGhlcikgfHwgKG90aGVyIGluc3RhbmNlb2Ygc2NoZW1hLmNvbnN0cnVjdG9yICYmXG4gICAgICAgICAgICB0aGlzLmNvbXBhcmVNYW55RmllbGRzKHNjaGVtYS5maWVsZHMsIG90aGVyLmZpZWxkcykpO1xuICAgIH1cbiAgICBjb21wYXJlTWFueUZpZWxkcyhmaWVsZHMsIG90aGVycykge1xuICAgICAgICByZXR1cm4gKGZpZWxkcyA9PT0gb3RoZXJzKSB8fCAoQXJyYXkuaXNBcnJheShmaWVsZHMpICYmXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KG90aGVycykgJiZcbiAgICAgICAgICAgIGZpZWxkcy5sZW5ndGggPT09IG90aGVycy5sZW5ndGggJiZcbiAgICAgICAgICAgIGZpZWxkcy5ldmVyeSgoZiwgaSkgPT4gdGhpcy5jb21wYXJlRmllbGRzKGYsIG90aGVyc1tpXSkpKTtcbiAgICB9XG4gICAgY29tcGFyZUZpZWxkcyhmaWVsZCwgb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIChmaWVsZCA9PT0gb3RoZXIpIHx8IChvdGhlciBpbnN0YW5jZW9mIGZpZWxkLmNvbnN0cnVjdG9yICYmXG4gICAgICAgICAgICBmaWVsZC5uYW1lID09PSBvdGhlci5uYW1lICYmXG4gICAgICAgICAgICBmaWVsZC5udWxsYWJsZSA9PT0gb3RoZXIubnVsbGFibGUgJiZcbiAgICAgICAgICAgIHRoaXMudmlzaXQoZmllbGQudHlwZSwgb3RoZXIudHlwZSkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXBhcmVDb25zdHJ1Y3Rvcih0eXBlLCBvdGhlcikge1xuICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIHR5cGUuY29uc3RydWN0b3I7XG59XG5mdW5jdGlvbiBjb21wYXJlQW55KHR5cGUsIG90aGVyKSB7XG4gICAgcmV0dXJuICh0eXBlID09PSBvdGhlcikgfHwgY29tcGFyZUNvbnN0cnVjdG9yKHR5cGUsIG90aGVyKTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVJbnQodHlwZSwgb3RoZXIpIHtcbiAgICByZXR1cm4gKHR5cGUgPT09IG90aGVyKSB8fCAoY29tcGFyZUNvbnN0cnVjdG9yKHR5cGUsIG90aGVyKSAmJlxuICAgICAgICB0eXBlLmJpdFdpZHRoID09PSBvdGhlci5iaXRXaWR0aCAmJlxuICAgICAgICB0eXBlLmlzU2lnbmVkID09PSBvdGhlci5pc1NpZ25lZCk7XG59XG5mdW5jdGlvbiBjb21wYXJlRmxvYXQodHlwZSwgb3RoZXIpIHtcbiAgICByZXR1cm4gKHR5cGUgPT09IG90aGVyKSB8fCAoY29tcGFyZUNvbnN0cnVjdG9yKHR5cGUsIG90aGVyKSAmJlxuICAgICAgICB0eXBlLnByZWNpc2lvbiA9PT0gb3RoZXIucHJlY2lzaW9uKTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVGaXhlZFNpemVCaW5hcnkodHlwZSwgb3RoZXIpIHtcbiAgICByZXR1cm4gKHR5cGUgPT09IG90aGVyKSB8fCAoY29tcGFyZUNvbnN0cnVjdG9yKHR5cGUsIG90aGVyKSAmJlxuICAgICAgICB0eXBlLmJ5dGVXaWR0aCA9PT0gb3RoZXIuYnl0ZVdpZHRoKTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVEYXRlKHR5cGUsIG90aGVyKSB7XG4gICAgcmV0dXJuICh0eXBlID09PSBvdGhlcikgfHwgKGNvbXBhcmVDb25zdHJ1Y3Rvcih0eXBlLCBvdGhlcikgJiZcbiAgICAgICAgdHlwZS51bml0ID09PSBvdGhlci51bml0KTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVUaW1lc3RhbXAodHlwZSwgb3RoZXIpIHtcbiAgICByZXR1cm4gKHR5cGUgPT09IG90aGVyKSB8fCAoY29tcGFyZUNvbnN0cnVjdG9yKHR5cGUsIG90aGVyKSAmJlxuICAgICAgICB0eXBlLnVuaXQgPT09IG90aGVyLnVuaXQgJiZcbiAgICAgICAgdHlwZS50aW1lem9uZSA9PT0gb3RoZXIudGltZXpvbmUpO1xufVxuZnVuY3Rpb24gY29tcGFyZVRpbWUodHlwZSwgb3RoZXIpIHtcbiAgICByZXR1cm4gKHR5cGUgPT09IG90aGVyKSB8fCAoY29tcGFyZUNvbnN0cnVjdG9yKHR5cGUsIG90aGVyKSAmJlxuICAgICAgICB0eXBlLnVuaXQgPT09IG90aGVyLnVuaXQgJiZcbiAgICAgICAgdHlwZS5iaXRXaWR0aCA9PT0gb3RoZXIuYml0V2lkdGgpO1xufVxuZnVuY3Rpb24gY29tcGFyZUxpc3QodHlwZSwgb3RoZXIpIHtcbiAgICByZXR1cm4gKHR5cGUgPT09IG90aGVyKSB8fCAoY29tcGFyZUNvbnN0cnVjdG9yKHR5cGUsIG90aGVyKSAmJlxuICAgICAgICB0eXBlLmNoaWxkcmVuLmxlbmd0aCA9PT0gb3RoZXIuY2hpbGRyZW4ubGVuZ3RoICYmXG4gICAgICAgIGluc3RhbmNlLmNvbXBhcmVNYW55RmllbGRzKHR5cGUuY2hpbGRyZW4sIG90aGVyLmNoaWxkcmVuKSk7XG59XG5mdW5jdGlvbiBjb21wYXJlU3RydWN0KHR5cGUsIG90aGVyKSB7XG4gICAgcmV0dXJuICh0eXBlID09PSBvdGhlcikgfHwgKGNvbXBhcmVDb25zdHJ1Y3Rvcih0eXBlLCBvdGhlcikgJiZcbiAgICAgICAgdHlwZS5jaGlsZHJlbi5sZW5ndGggPT09IG90aGVyLmNoaWxkcmVuLmxlbmd0aCAmJlxuICAgICAgICBpbnN0YW5jZS5jb21wYXJlTWFueUZpZWxkcyh0eXBlLmNoaWxkcmVuLCBvdGhlci5jaGlsZHJlbikpO1xufVxuZnVuY3Rpb24gY29tcGFyZVVuaW9uKHR5cGUsIG90aGVyKSB7XG4gICAgcmV0dXJuICh0eXBlID09PSBvdGhlcikgfHwgKGNvbXBhcmVDb25zdHJ1Y3Rvcih0eXBlLCBvdGhlcikgJiZcbiAgICAgICAgdHlwZS5tb2RlID09PSBvdGhlci5tb2RlICYmXG4gICAgICAgIHR5cGUudHlwZUlkcy5ldmVyeSgoeCwgaSkgPT4geCA9PT0gb3RoZXIudHlwZUlkc1tpXSkgJiZcbiAgICAgICAgaW5zdGFuY2UuY29tcGFyZU1hbnlGaWVsZHModHlwZS5jaGlsZHJlbiwgb3RoZXIuY2hpbGRyZW4pKTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVEaWN0aW9uYXJ5KHR5cGUsIG90aGVyKSB7XG4gICAgcmV0dXJuICh0eXBlID09PSBvdGhlcikgfHwgKGNvbXBhcmVDb25zdHJ1Y3Rvcih0eXBlLCBvdGhlcikgJiZcbiAgICAgICAgdHlwZS5pZCA9PT0gb3RoZXIuaWQgJiZcbiAgICAgICAgdHlwZS5pc09yZGVyZWQgPT09IG90aGVyLmlzT3JkZXJlZCAmJlxuICAgICAgICBpbnN0YW5jZS52aXNpdCh0eXBlLmluZGljZXMsIG90aGVyLmluZGljZXMpICYmXG4gICAgICAgIGluc3RhbmNlLnZpc2l0KHR5cGUuZGljdGlvbmFyeSwgb3RoZXIuZGljdGlvbmFyeSkpO1xufVxuZnVuY3Rpb24gY29tcGFyZUludGVydmFsKHR5cGUsIG90aGVyKSB7XG4gICAgcmV0dXJuICh0eXBlID09PSBvdGhlcikgfHwgKGNvbXBhcmVDb25zdHJ1Y3Rvcih0eXBlLCBvdGhlcikgJiZcbiAgICAgICAgdHlwZS51bml0ID09PSBvdGhlci51bml0KTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVGaXhlZFNpemVMaXN0KHR5cGUsIG90aGVyKSB7XG4gICAgcmV0dXJuICh0eXBlID09PSBvdGhlcikgfHwgKGNvbXBhcmVDb25zdHJ1Y3Rvcih0eXBlLCBvdGhlcikgJiZcbiAgICAgICAgdHlwZS5saXN0U2l6ZSA9PT0gb3RoZXIubGlzdFNpemUgJiZcbiAgICAgICAgdHlwZS5jaGlsZHJlbi5sZW5ndGggPT09IG90aGVyLmNoaWxkcmVuLmxlbmd0aCAmJlxuICAgICAgICBpbnN0YW5jZS5jb21wYXJlTWFueUZpZWxkcyh0eXBlLmNoaWxkcmVuLCBvdGhlci5jaGlsZHJlbikpO1xufVxuZnVuY3Rpb24gY29tcGFyZU1hcCh0eXBlLCBvdGhlcikge1xuICAgIHJldHVybiAodHlwZSA9PT0gb3RoZXIpIHx8IChjb21wYXJlQ29uc3RydWN0b3IodHlwZSwgb3RoZXIpICYmXG4gICAgICAgIHR5cGUua2V5c1NvcnRlZCA9PT0gb3RoZXIua2V5c1NvcnRlZCAmJlxuICAgICAgICB0eXBlLmNoaWxkcmVuLmxlbmd0aCA9PT0gb3RoZXIuY2hpbGRyZW4ubGVuZ3RoICYmXG4gICAgICAgIGluc3RhbmNlLmNvbXBhcmVNYW55RmllbGRzKHR5cGUuY2hpbGRyZW4sIG90aGVyLmNoaWxkcmVuKSk7XG59XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXROdWxsID0gY29tcGFyZUFueTtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdEJvb2wgPSBjb21wYXJlQW55O1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0SW50ID0gY29tcGFyZUludDtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdEludDggPSBjb21wYXJlSW50O1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0SW50MTYgPSBjb21wYXJlSW50O1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0SW50MzIgPSBjb21wYXJlSW50O1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0SW50NjQgPSBjb21wYXJlSW50O1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0VWludDggPSBjb21wYXJlSW50O1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0VWludDE2ID0gY29tcGFyZUludDtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdFVpbnQzMiA9IGNvbXBhcmVJbnQ7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRVaW50NjQgPSBjb21wYXJlSW50O1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0RmxvYXQgPSBjb21wYXJlRmxvYXQ7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRGbG9hdDE2ID0gY29tcGFyZUZsb2F0O1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0RmxvYXQzMiA9IGNvbXBhcmVGbG9hdDtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdEZsb2F0NjQgPSBjb21wYXJlRmxvYXQ7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRVdGY4ID0gY29tcGFyZUFueTtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdEJpbmFyeSA9IGNvbXBhcmVBbnk7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRGaXhlZFNpemVCaW5hcnkgPSBjb21wYXJlRml4ZWRTaXplQmluYXJ5O1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0RGF0ZSA9IGNvbXBhcmVEYXRlO1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0RGF0ZURheSA9IGNvbXBhcmVEYXRlO1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0RGF0ZU1pbGxpc2Vjb25kID0gY29tcGFyZURhdGU7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXAgPSBjb21wYXJlVGltZXN0YW1wO1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wU2Vjb25kID0gY29tcGFyZVRpbWVzdGFtcDtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcE1pbGxpc2Vjb25kID0gY29tcGFyZVRpbWVzdGFtcDtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcE1pY3Jvc2Vjb25kID0gY29tcGFyZVRpbWVzdGFtcDtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcE5hbm9zZWNvbmQgPSBjb21wYXJlVGltZXN0YW1wO1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0VGltZSA9IGNvbXBhcmVUaW1lO1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0VGltZVNlY29uZCA9IGNvbXBhcmVUaW1lO1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0VGltZU1pbGxpc2Vjb25kID0gY29tcGFyZVRpbWU7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRUaW1lTWljcm9zZWNvbmQgPSBjb21wYXJlVGltZTtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdFRpbWVOYW5vc2Vjb25kID0gY29tcGFyZVRpbWU7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXREZWNpbWFsID0gY29tcGFyZUFueTtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdExpc3QgPSBjb21wYXJlTGlzdDtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdFN0cnVjdCA9IGNvbXBhcmVTdHJ1Y3Q7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRVbmlvbiA9IGNvbXBhcmVVbmlvbjtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdERlbnNlVW5pb24gPSBjb21wYXJlVW5pb247XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRTcGFyc2VVbmlvbiA9IGNvbXBhcmVVbmlvbjtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdERpY3Rpb25hcnkgPSBjb21wYXJlRGljdGlvbmFyeTtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdEludGVydmFsID0gY29tcGFyZUludGVydmFsO1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0SW50ZXJ2YWxEYXlUaW1lID0gY29tcGFyZUludGVydmFsO1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0SW50ZXJ2YWxZZWFyTW9udGggPSBjb21wYXJlSW50ZXJ2YWw7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRGaXhlZFNpemVMaXN0ID0gY29tcGFyZUZpeGVkU2l6ZUxpc3Q7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRNYXAgPSBjb21wYXJlTWFwO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBpbnN0YW5jZSA9IG5ldyBUeXBlQ29tcGFyYXRvcigpO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVTY2hlbWFzKHNjaGVtYSwgb3RoZXIpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UuY29tcGFyZVNjaGVtYXMoc2NoZW1hLCBvdGhlcik7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZUZpZWxkcyhmaWVsZCwgb3RoZXIpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UuY29tcGFyZUZpZWxkcyhmaWVsZCwgb3RoZXIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVUeXBlcyh0eXBlLCBvdGhlcikge1xuICAgIHJldHVybiBpbnN0YW5jZS52aXNpdCh0eXBlLCBvdGhlcik7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVjb21wYXJhdG9yLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgVmVjdG9yIH0gZnJvbSAnLi4vdmVjdG9yLm1qcyc7XG5pbXBvcnQgeyBWaXNpdG9yIH0gZnJvbSAnLi4vdmlzaXRvci5tanMnO1xuaW1wb3J0IHsgVW5pb25Nb2RlIH0gZnJvbSAnLi4vZW51bS5tanMnO1xuaW1wb3J0IHsgUmVjb3JkQmF0Y2ggfSBmcm9tICcuLi9yZWNvcmRiYXRjaC5tanMnO1xuaW1wb3J0IHsgcmViYXNlVmFsdWVPZmZzZXRzIH0gZnJvbSAnLi4vdXRpbC9idWZmZXIubWpzJztcbmltcG9ydCB7IHBhY2tCb29scywgdHJ1bmNhdGVCaXRtYXAgfSBmcm9tICcuLi91dGlsL2JpdC5tanMnO1xuaW1wb3J0IHsgQnVmZmVyUmVnaW9uLCBGaWVsZE5vZGUgfSBmcm9tICcuLi9pcGMvbWV0YWRhdGEvbWVzc2FnZS5tanMnO1xuaW1wb3J0IHsgRGF0YVR5cGUsIH0gZnJvbSAnLi4vdHlwZS5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBWZWN0b3JBc3NlbWJsZXIgZXh0ZW5kcyBWaXNpdG9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fYnl0ZUxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX25vZGVzID0gW107XG4gICAgICAgIHRoaXMuX2J1ZmZlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5fYnVmZmVyUmVnaW9ucyA9IFtdO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgYXNzZW1ibGUoLi4uYXJncykge1xuICAgICAgICBjb25zdCB1bndyYXAgPSAobm9kZXMpID0+IG5vZGVzLmZsYXRNYXAoKG5vZGUpID0+IEFycmF5LmlzQXJyYXkobm9kZSkgPyB1bndyYXAobm9kZSkgOlxuICAgICAgICAgICAgKG5vZGUgaW5zdGFuY2VvZiBSZWNvcmRCYXRjaCkgPyBub2RlLmRhdGEuY2hpbGRyZW4gOiBub2RlLmRhdGEpO1xuICAgICAgICBjb25zdCBhc3NlbWJsZXIgPSBuZXcgVmVjdG9yQXNzZW1ibGVyKCk7XG4gICAgICAgIGFzc2VtYmxlci52aXNpdE1hbnkodW53cmFwKGFyZ3MpKTtcbiAgICAgICAgcmV0dXJuIGFzc2VtYmxlcjtcbiAgICB9XG4gICAgdmlzaXQoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFZlY3Rvcikge1xuICAgICAgICAgICAgdGhpcy52aXNpdE1hbnkoZGF0YS5kYXRhKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgdHlwZSB9ID0gZGF0YTtcbiAgICAgICAgaWYgKCFEYXRhVHlwZS5pc0RpY3Rpb25hcnkodHlwZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbGVuZ3RoLCBudWxsQ291bnQgfSA9IGRhdGE7XG4gICAgICAgICAgICBpZiAobGVuZ3RoID4gMjE0NzQ4MzY0Nykge1xuICAgICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0Nhbm5vdCB3cml0ZSBhcnJheXMgbGFyZ2VyIHRoYW4gMl4zMSAtIDEgaW4gbGVuZ3RoJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIURhdGFUeXBlLmlzTnVsbCh0eXBlKSkge1xuICAgICAgICAgICAgICAgIGFkZEJ1ZmZlci5jYWxsKHRoaXMsIG51bGxDb3VudCA8PSAwXG4gICAgICAgICAgICAgICAgICAgID8gbmV3IFVpbnQ4QXJyYXkoMCkgLy8gcGxhY2Vob2xkZXIgdmFsaWRpdHkgYnVmZmVyXG4gICAgICAgICAgICAgICAgICAgIDogdHJ1bmNhdGVCaXRtYXAoZGF0YS5vZmZzZXQsIGxlbmd0aCwgZGF0YS5udWxsQml0bWFwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm5vZGVzLnB1c2gobmV3IEZpZWxkTm9kZShsZW5ndGgsIG51bGxDb3VudCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci52aXNpdChkYXRhKTtcbiAgICB9XG4gICAgdmlzaXROdWxsKF9udWxsKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB2aXNpdERpY3Rpb25hcnkoZGF0YSkge1xuICAgICAgICAvLyBBc3NlbWJsZSB0aGUgaW5kaWNlcyBoZXJlLCBEaWN0aW9uYXJ5IGFzc2VtYmxlZCBzZXBhcmF0ZWx5LlxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdChkYXRhLmNsb25lKGRhdGEudHlwZS5pbmRpY2VzKSk7XG4gICAgfVxuICAgIGdldCBub2RlcygpIHsgcmV0dXJuIHRoaXMuX25vZGVzOyB9XG4gICAgZ2V0IGJ1ZmZlcnMoKSB7IHJldHVybiB0aGlzLl9idWZmZXJzOyB9XG4gICAgZ2V0IGJ5dGVMZW5ndGgoKSB7IHJldHVybiB0aGlzLl9ieXRlTGVuZ3RoOyB9XG4gICAgZ2V0IGJ1ZmZlclJlZ2lvbnMoKSB7IHJldHVybiB0aGlzLl9idWZmZXJSZWdpb25zOyB9XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gYWRkQnVmZmVyKHZhbHVlcykge1xuICAgIGNvbnN0IGJ5dGVMZW5ndGggPSAodmFsdWVzLmJ5dGVMZW5ndGggKyA3KSAmIH43OyAvLyBSb3VuZCB1cCB0byBhIG11bHRpcGxlIG9mIDhcbiAgICB0aGlzLmJ1ZmZlcnMucHVzaCh2YWx1ZXMpO1xuICAgIHRoaXMuYnVmZmVyUmVnaW9ucy5wdXNoKG5ldyBCdWZmZXJSZWdpb24odGhpcy5fYnl0ZUxlbmd0aCwgYnl0ZUxlbmd0aCkpO1xuICAgIHRoaXMuX2J5dGVMZW5ndGggKz0gYnl0ZUxlbmd0aDtcbiAgICByZXR1cm4gdGhpcztcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBhc3NlbWJsZVVuaW9uKGRhdGEpIHtcbiAgICBjb25zdCB7IHR5cGUsIGxlbmd0aCwgdHlwZUlkcywgdmFsdWVPZmZzZXRzIH0gPSBkYXRhO1xuICAgIC8vIEFsbCBVbmlvbiBWZWN0b3JzIGhhdmUgYSB0eXBlSWRzIGJ1ZmZlclxuICAgIGFkZEJ1ZmZlci5jYWxsKHRoaXMsIHR5cGVJZHMpO1xuICAgIC8vIElmIHRoaXMgaXMgYSBTcGFyc2UgVW5pb24sIHRyZWF0IGl0IGxpa2UgYWxsIG90aGVyIE5lc3RlZCB0eXBlc1xuICAgIGlmICh0eXBlLm1vZGUgPT09IFVuaW9uTW9kZS5TcGFyc2UpIHtcbiAgICAgICAgcmV0dXJuIGFzc2VtYmxlTmVzdGVkVmVjdG9yLmNhbGwodGhpcywgZGF0YSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUubW9kZSA9PT0gVW5pb25Nb2RlLkRlbnNlKSB7XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBEZW5zZSBVbmlvbiwgYWRkIHRoZSB2YWx1ZU9mZnNldHMgYnVmZmVyIGFuZCBwb3RlbnRpYWxseSBzbGljZSB0aGUgY2hpbGRyZW5cbiAgICAgICAgaWYgKGRhdGEub2Zmc2V0IDw9IDApIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBWZWN0b3IgaGFzbid0IGJlZW4gc2xpY2VkLCB3cml0ZSB0aGUgZXhpc3RpbmcgdmFsdWVPZmZzZXRzXG4gICAgICAgICAgICBhZGRCdWZmZXIuY2FsbCh0aGlzLCB2YWx1ZU9mZnNldHMpO1xuICAgICAgICAgICAgLy8gV2UgY2FuIHRyZWF0IHRoaXMgbGlrZSBhbGwgb3RoZXIgTmVzdGVkIHR5cGVzXG4gICAgICAgICAgICByZXR1cm4gYXNzZW1ibGVOZXN0ZWRWZWN0b3IuY2FsbCh0aGlzLCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEEgc2xpY2VkIERlbnNlIFVuaW9uIGlzIGFuIHVucGxlYXNhbnQgY2FzZS4gQmVjYXVzZSB0aGUgb2Zmc2V0cyBhcmUgZGlmZmVyZW50IGZvclxuICAgICAgICAgICAgLy8gZWFjaCBjaGlsZCB2ZWN0b3IsIHdlIG5lZWQgdG8gXCJyZWJhc2VcIiB0aGUgdmFsdWVPZmZzZXRzIGZvciBlYWNoIGNoaWxkXG4gICAgICAgICAgICAvLyBVbmlvbiB0eXBlSWRzIGFyZSBub3QgbmVjZXNzYXJ5IDAtaW5kZXhlZFxuICAgICAgICAgICAgY29uc3QgbWF4Q2hpbGRUeXBlSWQgPSB0eXBlSWRzLnJlZHVjZSgoeCwgeSkgPT4gTWF0aC5tYXgoeCwgeSksIHR5cGVJZHNbMF0pO1xuICAgICAgICAgICAgY29uc3QgY2hpbGRMZW5ndGhzID0gbmV3IEludDMyQXJyYXkobWF4Q2hpbGRUeXBlSWQgKyAxKTtcbiAgICAgICAgICAgIC8vIFNldCBhbGwgdG8gLTEgdG8gaW5kaWNhdGUgdGhhdCB3ZSBoYXZlbid0IG9ic2VydmVkIGEgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhIHBhcnRpY3VsYXIgY2hpbGQgeWV0XG4gICAgICAgICAgICBjb25zdCBjaGlsZE9mZnNldHMgPSBuZXcgSW50MzJBcnJheShtYXhDaGlsZFR5cGVJZCArIDEpLmZpbGwoLTEpO1xuICAgICAgICAgICAgY29uc3Qgc2hpZnRlZE9mZnNldHMgPSBuZXcgSW50MzJBcnJheShsZW5ndGgpO1xuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIG5vbi16ZXJvIG9mZnNldCwgdGhlbiB0aGUgdmFsdWUgb2Zmc2V0cyBkbyBub3Qgc3RhcnQgYXRcbiAgICAgICAgICAgIC8vIHplcm8uIFdlIG11c3QgYSkgY3JlYXRlIGEgbmV3IG9mZnNldHMgYXJyYXkgd2l0aCBzaGlmdGVkIG9mZnNldHMgYW5kXG4gICAgICAgICAgICAvLyBiKSBzbGljZSB0aGUgdmFsdWVzIGFycmF5IGFjY29yZGluZ2x5XG4gICAgICAgICAgICBjb25zdCB1bnNoaWZ0ZWRPZmZzZXRzID0gcmViYXNlVmFsdWVPZmZzZXRzKC12YWx1ZU9mZnNldHNbMF0sIGxlbmd0aCwgdmFsdWVPZmZzZXRzKTtcbiAgICAgICAgICAgIGZvciAobGV0IHR5cGVJZCwgc2hpZnQsIGluZGV4ID0gLTE7ICsraW5kZXggPCBsZW5ndGg7KSB7XG4gICAgICAgICAgICAgICAgaWYgKChzaGlmdCA9IGNoaWxkT2Zmc2V0c1t0eXBlSWQgPSB0eXBlSWRzW2luZGV4XV0pID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IGNoaWxkT2Zmc2V0c1t0eXBlSWRdID0gdW5zaGlmdGVkT2Zmc2V0c1t0eXBlSWRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzaGlmdGVkT2Zmc2V0c1tpbmRleF0gPSB1bnNoaWZ0ZWRPZmZzZXRzW2luZGV4XSAtIHNoaWZ0O1xuICAgICAgICAgICAgICAgICsrY2hpbGRMZW5ndGhzW3R5cGVJZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRCdWZmZXIuY2FsbCh0aGlzLCBzaGlmdGVkT2Zmc2V0cyk7XG4gICAgICAgICAgICAvLyBTbGljZSBhbmQgdmlzaXQgY2hpbGRyZW4gYWNjb3JkaW5nbHlcbiAgICAgICAgICAgIGZvciAobGV0IGNoaWxkLCBjaGlsZEluZGV4ID0gLTEsIG51bUNoaWxkcmVuID0gdHlwZS5jaGlsZHJlbi5sZW5ndGg7ICsrY2hpbGRJbmRleCA8IG51bUNoaWxkcmVuOykge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZCA9IGRhdGEuY2hpbGRyZW5bY2hpbGRJbmRleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZUlkID0gdHlwZS50eXBlSWRzW2NoaWxkSW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZExlbmd0aCA9IE1hdGgubWluKGxlbmd0aCwgY2hpbGRMZW5ndGhzW3R5cGVJZF0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpc2l0KGNoaWxkLnNsaWNlKGNoaWxkT2Zmc2V0c1t0eXBlSWRdLCBjaGlsZExlbmd0aCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBhc3NlbWJsZUJvb2xWZWN0b3IoZGF0YSkge1xuICAgIC8vIEJvb2wgdmVjdG9yIGlzIGEgc3BlY2lhbCBjYXNlIG9mIEZsYXRWZWN0b3IsIGFzIGl0cyBkYXRhIGJ1ZmZlciBuZWVkcyB0byBzdGF5IHBhY2tlZFxuICAgIGxldCB2YWx1ZXM7XG4gICAgaWYgKGRhdGEubnVsbENvdW50ID49IGRhdGEubGVuZ3RoKSB7XG4gICAgICAgIC8vIElmIGFsbCB2YWx1ZXMgYXJlIG51bGwsIGp1c3QgaW5zZXJ0IGEgcGxhY2Vob2xkZXIgZW1wdHkgZGF0YSBidWZmZXIgKGZhc3Rlc3QgcGF0aClcbiAgICAgICAgcmV0dXJuIGFkZEJ1ZmZlci5jYWxsKHRoaXMsIG5ldyBVaW50OEFycmF5KDApKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoKHZhbHVlcyA9IGRhdGEudmFsdWVzKSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgLy8gSWYgdmFsdWVzIGlzIGFscmVhZHkgYSBVaW50OEFycmF5LCBzbGljZSB0aGUgYml0bWFwIChmYXN0IHBhdGgpXG4gICAgICAgIHJldHVybiBhZGRCdWZmZXIuY2FsbCh0aGlzLCB0cnVuY2F0ZUJpdG1hcChkYXRhLm9mZnNldCwgZGF0YS5sZW5ndGgsIHZhbHVlcykpO1xuICAgIH1cbiAgICAvLyBPdGhlcndpc2UgaWYgdGhlIHVuZGVybHlpbmcgZGF0YSAqaXNuJ3QqIGEgVWludDhBcnJheSwgZW51bWVyYXRlIHRoZVxuICAgIC8vIHZhbHVlcyBhcyBib29scyBhbmQgcmUtcGFjayB0aGVtIGludG8gYSBVaW50OEFycmF5LiBUaGlzIGNvZGUgaXNuJ3RcbiAgICAvLyByZWFjaGFibGUgdW5sZXNzIHlvdSdyZSB0cnlpbmcgdG8gbWFuaXB1bGF0ZSB0aGUgRGF0YSBpbnRlcm5hbHMsXG4gICAgLy8gd2UncmUgb25seSBkb2luZyB0aGlzIGZvciBzYWZldHkuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gYWRkQnVmZmVyLmNhbGwodGhpcywgcGFja0Jvb2xzKGRhdGEudmFsdWVzKSk7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gYXNzZW1ibGVGbGF0VmVjdG9yKGRhdGEpIHtcbiAgICByZXR1cm4gYWRkQnVmZmVyLmNhbGwodGhpcywgZGF0YS52YWx1ZXMuc3ViYXJyYXkoMCwgZGF0YS5sZW5ndGggKiBkYXRhLnN0cmlkZSkpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGFzc2VtYmxlRmxhdExpc3RWZWN0b3IoZGF0YSkge1xuICAgIGNvbnN0IHsgbGVuZ3RoLCB2YWx1ZXMsIHZhbHVlT2Zmc2V0cyB9ID0gZGF0YTtcbiAgICBjb25zdCBmaXJzdE9mZnNldCA9IHZhbHVlT2Zmc2V0c1swXTtcbiAgICBjb25zdCBsYXN0T2Zmc2V0ID0gdmFsdWVPZmZzZXRzW2xlbmd0aF07XG4gICAgY29uc3QgYnl0ZUxlbmd0aCA9IE1hdGgubWluKGxhc3RPZmZzZXQgLSBmaXJzdE9mZnNldCwgdmFsdWVzLmJ5dGVMZW5ndGggLSBmaXJzdE9mZnNldCk7XG4gICAgLy8gUHVzaCBpbiB0aGUgb3JkZXIgRmxhdExpc3QgdHlwZXMgcmVhZCB0aGVpciBidWZmZXJzXG4gICAgYWRkQnVmZmVyLmNhbGwodGhpcywgcmViYXNlVmFsdWVPZmZzZXRzKC12YWx1ZU9mZnNldHNbMF0sIGxlbmd0aCwgdmFsdWVPZmZzZXRzKSk7IC8vIHZhbHVlT2Zmc2V0cyBidWZmZXIgZmlyc3RcbiAgICBhZGRCdWZmZXIuY2FsbCh0aGlzLCB2YWx1ZXMuc3ViYXJyYXkoZmlyc3RPZmZzZXQsIGZpcnN0T2Zmc2V0ICsgYnl0ZUxlbmd0aCkpOyAvLyBzbGljZWQgdmFsdWVzIGJ1ZmZlciBzZWNvbmRcbiAgICByZXR1cm4gdGhpcztcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBhc3NlbWJsZUxpc3RWZWN0b3IoZGF0YSkge1xuICAgIGNvbnN0IHsgbGVuZ3RoLCB2YWx1ZU9mZnNldHMgfSA9IGRhdGE7XG4gICAgLy8gSWYgd2UgaGF2ZSB2YWx1ZU9mZnNldHMgKE1hcFZlY3RvciwgTGlzdFZlY3RvciksIHB1c2ggdGhhdCBidWZmZXIgZmlyc3RcbiAgICBpZiAodmFsdWVPZmZzZXRzKSB7XG4gICAgICAgIGFkZEJ1ZmZlci5jYWxsKHRoaXMsIHJlYmFzZVZhbHVlT2Zmc2V0cyh2YWx1ZU9mZnNldHNbMF0sIGxlbmd0aCwgdmFsdWVPZmZzZXRzKSk7XG4gICAgfVxuICAgIC8vIFRoZW4gaW5zZXJ0IHRoZSBMaXN0J3MgdmFsdWVzIGNoaWxkXG4gICAgcmV0dXJuIHRoaXMudmlzaXQoZGF0YS5jaGlsZHJlblswXSk7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gYXNzZW1ibGVOZXN0ZWRWZWN0b3IoZGF0YSkge1xuICAgIHJldHVybiB0aGlzLnZpc2l0TWFueShkYXRhLnR5cGUuY2hpbGRyZW4ubWFwKChfLCBpKSA9PiBkYXRhLmNoaWxkcmVuW2ldKS5maWx0ZXIoQm9vbGVhbikpWzBdO1xufVxuVmVjdG9yQXNzZW1ibGVyLnByb3RvdHlwZS52aXNpdEJvb2wgPSBhc3NlbWJsZUJvb2xWZWN0b3I7XG5WZWN0b3JBc3NlbWJsZXIucHJvdG90eXBlLnZpc2l0SW50ID0gYXNzZW1ibGVGbGF0VmVjdG9yO1xuVmVjdG9yQXNzZW1ibGVyLnByb3RvdHlwZS52aXNpdEZsb2F0ID0gYXNzZW1ibGVGbGF0VmVjdG9yO1xuVmVjdG9yQXNzZW1ibGVyLnByb3RvdHlwZS52aXNpdFV0ZjggPSBhc3NlbWJsZUZsYXRMaXN0VmVjdG9yO1xuVmVjdG9yQXNzZW1ibGVyLnByb3RvdHlwZS52aXNpdEJpbmFyeSA9IGFzc2VtYmxlRmxhdExpc3RWZWN0b3I7XG5WZWN0b3JBc3NlbWJsZXIucHJvdG90eXBlLnZpc2l0Rml4ZWRTaXplQmluYXJ5ID0gYXNzZW1ibGVGbGF0VmVjdG9yO1xuVmVjdG9yQXNzZW1ibGVyLnByb3RvdHlwZS52aXNpdERhdGUgPSBhc3NlbWJsZUZsYXRWZWN0b3I7XG5WZWN0b3JBc3NlbWJsZXIucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wID0gYXNzZW1ibGVGbGF0VmVjdG9yO1xuVmVjdG9yQXNzZW1ibGVyLnByb3RvdHlwZS52aXNpdFRpbWUgPSBhc3NlbWJsZUZsYXRWZWN0b3I7XG5WZWN0b3JBc3NlbWJsZXIucHJvdG90eXBlLnZpc2l0RGVjaW1hbCA9IGFzc2VtYmxlRmxhdFZlY3RvcjtcblZlY3RvckFzc2VtYmxlci5wcm90b3R5cGUudmlzaXRMaXN0ID0gYXNzZW1ibGVMaXN0VmVjdG9yO1xuVmVjdG9yQXNzZW1ibGVyLnByb3RvdHlwZS52aXNpdFN0cnVjdCA9IGFzc2VtYmxlTmVzdGVkVmVjdG9yO1xuVmVjdG9yQXNzZW1ibGVyLnByb3RvdHlwZS52aXNpdFVuaW9uID0gYXNzZW1ibGVVbmlvbjtcblZlY3RvckFzc2VtYmxlci5wcm90b3R5cGUudmlzaXRJbnRlcnZhbCA9IGFzc2VtYmxlRmxhdFZlY3RvcjtcblZlY3RvckFzc2VtYmxlci5wcm90b3R5cGUudmlzaXRGaXhlZFNpemVMaXN0ID0gYXNzZW1ibGVMaXN0VmVjdG9yO1xuVmVjdG9yQXNzZW1ibGVyLnByb3RvdHlwZS52aXNpdE1hcCA9IGFzc2VtYmxlTGlzdFZlY3RvcjtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmVjdG9yYXNzZW1ibGVyLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgbWFrZURhdGEgfSBmcm9tICcuLi9kYXRhLm1qcyc7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4uL3NjaGVtYS5tanMnO1xuaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuLi90eXBlLm1qcyc7XG5pbXBvcnQgeyBWaXNpdG9yIH0gZnJvbSAnLi4vdmlzaXRvci5tanMnO1xuaW1wb3J0IHsgcGFja0Jvb2xzIH0gZnJvbSAnLi4vdXRpbC9iaXQubWpzJztcbmltcG9ydCB7IGVuY29kZVV0ZjggfSBmcm9tICcuLi91dGlsL3V0ZjgubWpzJztcbmltcG9ydCB7IEludDY0LCBJbnQxMjggfSBmcm9tICcuLi91dGlsL2ludC5tanMnO1xuaW1wb3J0IHsgVW5pb25Nb2RlLCBEYXRlVW5pdCB9IGZyb20gJy4uL2VudW0ubWpzJztcbmltcG9ydCB7IHRvQXJyYXlCdWZmZXJWaWV3IH0gZnJvbSAnLi4vdXRpbC9idWZmZXIubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVmVjdG9yTG9hZGVyIGV4dGVuZHMgVmlzaXRvciB7XG4gICAgY29uc3RydWN0b3IoYnl0ZXMsIG5vZGVzLCBidWZmZXJzLCBkaWN0aW9uYXJpZXMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5ub2Rlc0luZGV4ID0gLTE7XG4gICAgICAgIHRoaXMuYnVmZmVyc0luZGV4ID0gLTE7XG4gICAgICAgIHRoaXMuYnl0ZXMgPSBieXRlcztcbiAgICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzO1xuICAgICAgICB0aGlzLmJ1ZmZlcnMgPSBidWZmZXJzO1xuICAgICAgICB0aGlzLmRpY3Rpb25hcmllcyA9IGRpY3Rpb25hcmllcztcbiAgICB9XG4gICAgdmlzaXQobm9kZSkge1xuICAgICAgICByZXR1cm4gc3VwZXIudmlzaXQobm9kZSBpbnN0YW5jZW9mIEZpZWxkID8gbm9kZS50eXBlIDogbm9kZSk7XG4gICAgfVxuICAgIHZpc2l0TnVsbCh0eXBlLCB7IGxlbmd0aCB9ID0gdGhpcy5uZXh0RmllbGROb2RlKCkpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VEYXRhKHsgdHlwZSwgbGVuZ3RoIH0pO1xuICAgIH1cbiAgICB2aXNpdEJvb2wodHlwZSwgeyBsZW5ndGgsIG51bGxDb3VudCB9ID0gdGhpcy5uZXh0RmllbGROb2RlKCkpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VEYXRhKHsgdHlwZSwgbGVuZ3RoLCBudWxsQ291bnQsIG51bGxCaXRtYXA6IHRoaXMucmVhZE51bGxCaXRtYXAodHlwZSwgbnVsbENvdW50KSwgZGF0YTogdGhpcy5yZWFkRGF0YSh0eXBlKSB9KTtcbiAgICB9XG4gICAgdmlzaXRJbnQodHlwZSwgeyBsZW5ndGgsIG51bGxDb3VudCB9ID0gdGhpcy5uZXh0RmllbGROb2RlKCkpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VEYXRhKHsgdHlwZSwgbGVuZ3RoLCBudWxsQ291bnQsIG51bGxCaXRtYXA6IHRoaXMucmVhZE51bGxCaXRtYXAodHlwZSwgbnVsbENvdW50KSwgZGF0YTogdGhpcy5yZWFkRGF0YSh0eXBlKSB9KTtcbiAgICB9XG4gICAgdmlzaXRGbG9hdCh0eXBlLCB7IGxlbmd0aCwgbnVsbENvdW50IH0gPSB0aGlzLm5leHRGaWVsZE5vZGUoKSkge1xuICAgICAgICByZXR1cm4gbWFrZURhdGEoeyB0eXBlLCBsZW5ndGgsIG51bGxDb3VudCwgbnVsbEJpdG1hcDogdGhpcy5yZWFkTnVsbEJpdG1hcCh0eXBlLCBudWxsQ291bnQpLCBkYXRhOiB0aGlzLnJlYWREYXRhKHR5cGUpIH0pO1xuICAgIH1cbiAgICB2aXNpdFV0ZjgodHlwZSwgeyBsZW5ndGgsIG51bGxDb3VudCB9ID0gdGhpcy5uZXh0RmllbGROb2RlKCkpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VEYXRhKHsgdHlwZSwgbGVuZ3RoLCBudWxsQ291bnQsIG51bGxCaXRtYXA6IHRoaXMucmVhZE51bGxCaXRtYXAodHlwZSwgbnVsbENvdW50KSwgdmFsdWVPZmZzZXRzOiB0aGlzLnJlYWRPZmZzZXRzKHR5cGUpLCBkYXRhOiB0aGlzLnJlYWREYXRhKHR5cGUpIH0pO1xuICAgIH1cbiAgICB2aXNpdEJpbmFyeSh0eXBlLCB7IGxlbmd0aCwgbnVsbENvdW50IH0gPSB0aGlzLm5leHRGaWVsZE5vZGUoKSkge1xuICAgICAgICByZXR1cm4gbWFrZURhdGEoeyB0eXBlLCBsZW5ndGgsIG51bGxDb3VudCwgbnVsbEJpdG1hcDogdGhpcy5yZWFkTnVsbEJpdG1hcCh0eXBlLCBudWxsQ291bnQpLCB2YWx1ZU9mZnNldHM6IHRoaXMucmVhZE9mZnNldHModHlwZSksIGRhdGE6IHRoaXMucmVhZERhdGEodHlwZSkgfSk7XG4gICAgfVxuICAgIHZpc2l0Rml4ZWRTaXplQmluYXJ5KHR5cGUsIHsgbGVuZ3RoLCBudWxsQ291bnQgfSA9IHRoaXMubmV4dEZpZWxkTm9kZSgpKSB7XG4gICAgICAgIHJldHVybiBtYWtlRGF0YSh7IHR5cGUsIGxlbmd0aCwgbnVsbENvdW50LCBudWxsQml0bWFwOiB0aGlzLnJlYWROdWxsQml0bWFwKHR5cGUsIG51bGxDb3VudCksIGRhdGE6IHRoaXMucmVhZERhdGEodHlwZSkgfSk7XG4gICAgfVxuICAgIHZpc2l0RGF0ZSh0eXBlLCB7IGxlbmd0aCwgbnVsbENvdW50IH0gPSB0aGlzLm5leHRGaWVsZE5vZGUoKSkge1xuICAgICAgICByZXR1cm4gbWFrZURhdGEoeyB0eXBlLCBsZW5ndGgsIG51bGxDb3VudCwgbnVsbEJpdG1hcDogdGhpcy5yZWFkTnVsbEJpdG1hcCh0eXBlLCBudWxsQ291bnQpLCBkYXRhOiB0aGlzLnJlYWREYXRhKHR5cGUpIH0pO1xuICAgIH1cbiAgICB2aXNpdFRpbWVzdGFtcCh0eXBlLCB7IGxlbmd0aCwgbnVsbENvdW50IH0gPSB0aGlzLm5leHRGaWVsZE5vZGUoKSkge1xuICAgICAgICByZXR1cm4gbWFrZURhdGEoeyB0eXBlLCBsZW5ndGgsIG51bGxDb3VudCwgbnVsbEJpdG1hcDogdGhpcy5yZWFkTnVsbEJpdG1hcCh0eXBlLCBudWxsQ291bnQpLCBkYXRhOiB0aGlzLnJlYWREYXRhKHR5cGUpIH0pO1xuICAgIH1cbiAgICB2aXNpdFRpbWUodHlwZSwgeyBsZW5ndGgsIG51bGxDb3VudCB9ID0gdGhpcy5uZXh0RmllbGROb2RlKCkpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VEYXRhKHsgdHlwZSwgbGVuZ3RoLCBudWxsQ291bnQsIG51bGxCaXRtYXA6IHRoaXMucmVhZE51bGxCaXRtYXAodHlwZSwgbnVsbENvdW50KSwgZGF0YTogdGhpcy5yZWFkRGF0YSh0eXBlKSB9KTtcbiAgICB9XG4gICAgdmlzaXREZWNpbWFsKHR5cGUsIHsgbGVuZ3RoLCBudWxsQ291bnQgfSA9IHRoaXMubmV4dEZpZWxkTm9kZSgpKSB7XG4gICAgICAgIHJldHVybiBtYWtlRGF0YSh7IHR5cGUsIGxlbmd0aCwgbnVsbENvdW50LCBudWxsQml0bWFwOiB0aGlzLnJlYWROdWxsQml0bWFwKHR5cGUsIG51bGxDb3VudCksIGRhdGE6IHRoaXMucmVhZERhdGEodHlwZSkgfSk7XG4gICAgfVxuICAgIHZpc2l0TGlzdCh0eXBlLCB7IGxlbmd0aCwgbnVsbENvdW50IH0gPSB0aGlzLm5leHRGaWVsZE5vZGUoKSkge1xuICAgICAgICByZXR1cm4gbWFrZURhdGEoeyB0eXBlLCBsZW5ndGgsIG51bGxDb3VudCwgbnVsbEJpdG1hcDogdGhpcy5yZWFkTnVsbEJpdG1hcCh0eXBlLCBudWxsQ291bnQpLCB2YWx1ZU9mZnNldHM6IHRoaXMucmVhZE9mZnNldHModHlwZSksICdjaGlsZCc6IHRoaXMudmlzaXQodHlwZS5jaGlsZHJlblswXSkgfSk7XG4gICAgfVxuICAgIHZpc2l0U3RydWN0KHR5cGUsIHsgbGVuZ3RoLCBudWxsQ291bnQgfSA9IHRoaXMubmV4dEZpZWxkTm9kZSgpKSB7XG4gICAgICAgIHJldHVybiBtYWtlRGF0YSh7IHR5cGUsIGxlbmd0aCwgbnVsbENvdW50LCBudWxsQml0bWFwOiB0aGlzLnJlYWROdWxsQml0bWFwKHR5cGUsIG51bGxDb3VudCksIGNoaWxkcmVuOiB0aGlzLnZpc2l0TWFueSh0eXBlLmNoaWxkcmVuKSB9KTtcbiAgICB9XG4gICAgdmlzaXRVbmlvbih0eXBlKSB7XG4gICAgICAgIHJldHVybiB0eXBlLm1vZGUgPT09IFVuaW9uTW9kZS5TcGFyc2UgPyB0aGlzLnZpc2l0U3BhcnNlVW5pb24odHlwZSkgOiB0aGlzLnZpc2l0RGVuc2VVbmlvbih0eXBlKTtcbiAgICB9XG4gICAgdmlzaXREZW5zZVVuaW9uKHR5cGUsIHsgbGVuZ3RoLCBudWxsQ291bnQgfSA9IHRoaXMubmV4dEZpZWxkTm9kZSgpKSB7XG4gICAgICAgIHJldHVybiBtYWtlRGF0YSh7IHR5cGUsIGxlbmd0aCwgbnVsbENvdW50LCBudWxsQml0bWFwOiB0aGlzLnJlYWROdWxsQml0bWFwKHR5cGUsIG51bGxDb3VudCksIHR5cGVJZHM6IHRoaXMucmVhZFR5cGVJZHModHlwZSksIHZhbHVlT2Zmc2V0czogdGhpcy5yZWFkT2Zmc2V0cyh0eXBlKSwgY2hpbGRyZW46IHRoaXMudmlzaXRNYW55KHR5cGUuY2hpbGRyZW4pIH0pO1xuICAgIH1cbiAgICB2aXNpdFNwYXJzZVVuaW9uKHR5cGUsIHsgbGVuZ3RoLCBudWxsQ291bnQgfSA9IHRoaXMubmV4dEZpZWxkTm9kZSgpKSB7XG4gICAgICAgIHJldHVybiBtYWtlRGF0YSh7IHR5cGUsIGxlbmd0aCwgbnVsbENvdW50LCBudWxsQml0bWFwOiB0aGlzLnJlYWROdWxsQml0bWFwKHR5cGUsIG51bGxDb3VudCksIHR5cGVJZHM6IHRoaXMucmVhZFR5cGVJZHModHlwZSksIGNoaWxkcmVuOiB0aGlzLnZpc2l0TWFueSh0eXBlLmNoaWxkcmVuKSB9KTtcbiAgICB9XG4gICAgdmlzaXREaWN0aW9uYXJ5KHR5cGUsIHsgbGVuZ3RoLCBudWxsQ291bnQgfSA9IHRoaXMubmV4dEZpZWxkTm9kZSgpKSB7XG4gICAgICAgIHJldHVybiBtYWtlRGF0YSh7IHR5cGUsIGxlbmd0aCwgbnVsbENvdW50LCBudWxsQml0bWFwOiB0aGlzLnJlYWROdWxsQml0bWFwKHR5cGUsIG51bGxDb3VudCksIGRhdGE6IHRoaXMucmVhZERhdGEodHlwZS5pbmRpY2VzKSwgZGljdGlvbmFyeTogdGhpcy5yZWFkRGljdGlvbmFyeSh0eXBlKSB9KTtcbiAgICB9XG4gICAgdmlzaXRJbnRlcnZhbCh0eXBlLCB7IGxlbmd0aCwgbnVsbENvdW50IH0gPSB0aGlzLm5leHRGaWVsZE5vZGUoKSkge1xuICAgICAgICByZXR1cm4gbWFrZURhdGEoeyB0eXBlLCBsZW5ndGgsIG51bGxDb3VudCwgbnVsbEJpdG1hcDogdGhpcy5yZWFkTnVsbEJpdG1hcCh0eXBlLCBudWxsQ291bnQpLCBkYXRhOiB0aGlzLnJlYWREYXRhKHR5cGUpIH0pO1xuICAgIH1cbiAgICB2aXNpdEZpeGVkU2l6ZUxpc3QodHlwZSwgeyBsZW5ndGgsIG51bGxDb3VudCB9ID0gdGhpcy5uZXh0RmllbGROb2RlKCkpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VEYXRhKHsgdHlwZSwgbGVuZ3RoLCBudWxsQ291bnQsIG51bGxCaXRtYXA6IHRoaXMucmVhZE51bGxCaXRtYXAodHlwZSwgbnVsbENvdW50KSwgJ2NoaWxkJzogdGhpcy52aXNpdCh0eXBlLmNoaWxkcmVuWzBdKSB9KTtcbiAgICB9XG4gICAgdmlzaXRNYXAodHlwZSwgeyBsZW5ndGgsIG51bGxDb3VudCB9ID0gdGhpcy5uZXh0RmllbGROb2RlKCkpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VEYXRhKHsgdHlwZSwgbGVuZ3RoLCBudWxsQ291bnQsIG51bGxCaXRtYXA6IHRoaXMucmVhZE51bGxCaXRtYXAodHlwZSwgbnVsbENvdW50KSwgdmFsdWVPZmZzZXRzOiB0aGlzLnJlYWRPZmZzZXRzKHR5cGUpLCAnY2hpbGQnOiB0aGlzLnZpc2l0KHR5cGUuY2hpbGRyZW5bMF0pIH0pO1xuICAgIH1cbiAgICBuZXh0RmllbGROb2RlKCkgeyByZXR1cm4gdGhpcy5ub2Rlc1srK3RoaXMubm9kZXNJbmRleF07IH1cbiAgICBuZXh0QnVmZmVyUmFuZ2UoKSB7IHJldHVybiB0aGlzLmJ1ZmZlcnNbKyt0aGlzLmJ1ZmZlcnNJbmRleF07IH1cbiAgICByZWFkTnVsbEJpdG1hcCh0eXBlLCBudWxsQ291bnQsIGJ1ZmZlciA9IHRoaXMubmV4dEJ1ZmZlclJhbmdlKCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGxDb3VudCA+IDAgJiYgdGhpcy5yZWFkRGF0YSh0eXBlLCBidWZmZXIpIHx8IG5ldyBVaW50OEFycmF5KDApO1xuICAgIH1cbiAgICByZWFkT2Zmc2V0cyh0eXBlLCBidWZmZXIpIHsgcmV0dXJuIHRoaXMucmVhZERhdGEodHlwZSwgYnVmZmVyKTsgfVxuICAgIHJlYWRUeXBlSWRzKHR5cGUsIGJ1ZmZlcikgeyByZXR1cm4gdGhpcy5yZWFkRGF0YSh0eXBlLCBidWZmZXIpOyB9XG4gICAgcmVhZERhdGEoX3R5cGUsIHsgbGVuZ3RoLCBvZmZzZXQgfSA9IHRoaXMubmV4dEJ1ZmZlclJhbmdlKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnl0ZXMuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpO1xuICAgIH1cbiAgICByZWFkRGljdGlvbmFyeSh0eXBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3Rpb25hcmllcy5nZXQodHlwZS5pZCk7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBKU09OVmVjdG9yTG9hZGVyIGV4dGVuZHMgVmVjdG9yTG9hZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2VzLCBub2RlcywgYnVmZmVycywgZGljdGlvbmFyaWVzKSB7XG4gICAgICAgIHN1cGVyKG5ldyBVaW50OEFycmF5KDApLCBub2RlcywgYnVmZmVycywgZGljdGlvbmFyaWVzKTtcbiAgICAgICAgdGhpcy5zb3VyY2VzID0gc291cmNlcztcbiAgICB9XG4gICAgcmVhZE51bGxCaXRtYXAoX3R5cGUsIG51bGxDb3VudCwgeyBvZmZzZXQgfSA9IHRoaXMubmV4dEJ1ZmZlclJhbmdlKCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGxDb3VudCA8PSAwID8gbmV3IFVpbnQ4QXJyYXkoMCkgOiBwYWNrQm9vbHModGhpcy5zb3VyY2VzW29mZnNldF0pO1xuICAgIH1cbiAgICByZWFkT2Zmc2V0cyhfdHlwZSwgeyBvZmZzZXQgfSA9IHRoaXMubmV4dEJ1ZmZlclJhbmdlKCkpIHtcbiAgICAgICAgcmV0dXJuIHRvQXJyYXlCdWZmZXJWaWV3KFVpbnQ4QXJyYXksIHRvQXJyYXlCdWZmZXJWaWV3KEludDMyQXJyYXksIHRoaXMuc291cmNlc1tvZmZzZXRdKSk7XG4gICAgfVxuICAgIHJlYWRUeXBlSWRzKHR5cGUsIHsgb2Zmc2V0IH0gPSB0aGlzLm5leHRCdWZmZXJSYW5nZSgpKSB7XG4gICAgICAgIHJldHVybiB0b0FycmF5QnVmZmVyVmlldyhVaW50OEFycmF5LCB0b0FycmF5QnVmZmVyVmlldyh0eXBlLkFycmF5VHlwZSwgdGhpcy5zb3VyY2VzW29mZnNldF0pKTtcbiAgICB9XG4gICAgcmVhZERhdGEodHlwZSwgeyBvZmZzZXQgfSA9IHRoaXMubmV4dEJ1ZmZlclJhbmdlKCkpIHtcbiAgICAgICAgY29uc3QgeyBzb3VyY2VzIH0gPSB0aGlzO1xuICAgICAgICBpZiAoRGF0YVR5cGUuaXNUaW1lc3RhbXAodHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0b0FycmF5QnVmZmVyVmlldyhVaW50OEFycmF5LCBJbnQ2NC5jb252ZXJ0QXJyYXkoc291cmNlc1tvZmZzZXRdKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKERhdGFUeXBlLmlzSW50KHR5cGUpIHx8IERhdGFUeXBlLmlzVGltZSh0eXBlKSkgJiYgdHlwZS5iaXRXaWR0aCA9PT0gNjQpIHtcbiAgICAgICAgICAgIHJldHVybiB0b0FycmF5QnVmZmVyVmlldyhVaW50OEFycmF5LCBJbnQ2NC5jb252ZXJ0QXJyYXkoc291cmNlc1tvZmZzZXRdKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoRGF0YVR5cGUuaXNEYXRlKHR5cGUpICYmIHR5cGUudW5pdCA9PT0gRGF0ZVVuaXQuTUlMTElTRUNPTkQpIHtcbiAgICAgICAgICAgIHJldHVybiB0b0FycmF5QnVmZmVyVmlldyhVaW50OEFycmF5LCBJbnQ2NC5jb252ZXJ0QXJyYXkoc291cmNlc1tvZmZzZXRdKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoRGF0YVR5cGUuaXNEZWNpbWFsKHR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdG9BcnJheUJ1ZmZlclZpZXcoVWludDhBcnJheSwgSW50MTI4LmNvbnZlcnRBcnJheShzb3VyY2VzW29mZnNldF0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChEYXRhVHlwZS5pc0JpbmFyeSh0eXBlKSB8fCBEYXRhVHlwZS5pc0ZpeGVkU2l6ZUJpbmFyeSh0eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGJpbmFyeURhdGFGcm9tSlNPTihzb3VyY2VzW29mZnNldF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKERhdGFUeXBlLmlzQm9vbCh0eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhY2tCb29scyhzb3VyY2VzW29mZnNldF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKERhdGFUeXBlLmlzVXRmOCh0eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kZVV0Zjgoc291cmNlc1tvZmZzZXRdLmpvaW4oJycpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9BcnJheUJ1ZmZlclZpZXcoVWludDhBcnJheSwgdG9BcnJheUJ1ZmZlclZpZXcodHlwZS5BcnJheVR5cGUsIHNvdXJjZXNbb2Zmc2V0XS5tYXAoKHgpID0+ICt4KSkpO1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBiaW5hcnlEYXRhRnJvbUpTT04odmFsdWVzKSB7XG4gICAgLy8gXCJEQVRBXCI6IFtcIjQ5QkM3RDVCNkM0N0QyXCIsXCIzRjVGQjZEOTMyMjAyNlwiXVxuICAgIC8vIFRoZXJlIGFyZSBkZWZpbml0ZWx5IG1vcmUgZWZmaWNpZW50IHdheXMgdG8gZG8gdGhpcy4uLiBidXQgaXQgZ2V0cyB0aGVcbiAgICAvLyBqb2IgZG9uZS5cbiAgICBjb25zdCBqb2luZWQgPSB2YWx1ZXMuam9pbignJyk7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KGpvaW5lZC5sZW5ndGggLyAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGpvaW5lZC5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBkYXRhW2kgPj4gMV0gPSBOdW1iZXIucGFyc2VJbnQoam9pbmVkLnNsaWNlKGksIGkgKyAyKSwgMTYpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmVjdG9ybG9hZGVyLm1qcy5tYXBcbiIsImltcG9ydCBkZWZpbmUsIHtleHRlbmR9IGZyb20gXCIuL2RlZmluZS5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gQ29sb3IoKSB7fVxuXG5leHBvcnQgdmFyIGRhcmtlciA9IDAuNztcbmV4cG9ydCB2YXIgYnJpZ2h0ZXIgPSAxIC8gZGFya2VyO1xuXG52YXIgcmVJID0gXCJcXFxccyooWystXT9cXFxcZCspXFxcXHMqXCIsXG4gICAgcmVOID0gXCJcXFxccyooWystXT8oPzpcXFxcZCpcXFxcLik/XFxcXGQrKD86W2VFXVsrLV0/XFxcXGQrKT8pXFxcXHMqXCIsXG4gICAgcmVQID0gXCJcXFxccyooWystXT8oPzpcXFxcZCpcXFxcLik/XFxcXGQrKD86W2VFXVsrLV0/XFxcXGQrKT8pJVxcXFxzKlwiLFxuICAgIHJlSGV4ID0gL14jKFswLTlhLWZdezMsOH0pJC8sXG4gICAgcmVSZ2JJbnRlZ2VyID0gbmV3IFJlZ0V4cChgXnJnYlxcXFwoJHtyZUl9LCR7cmVJfSwke3JlSX1cXFxcKSRgKSxcbiAgICByZVJnYlBlcmNlbnQgPSBuZXcgUmVnRXhwKGBecmdiXFxcXCgke3JlUH0sJHtyZVB9LCR7cmVQfVxcXFwpJGApLFxuICAgIHJlUmdiYUludGVnZXIgPSBuZXcgUmVnRXhwKGBecmdiYVxcXFwoJHtyZUl9LCR7cmVJfSwke3JlSX0sJHtyZU59XFxcXCkkYCksXG4gICAgcmVSZ2JhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5yZ2JhXFxcXCgke3JlUH0sJHtyZVB9LCR7cmVQfSwke3JlTn1cXFxcKSRgKSxcbiAgICByZUhzbFBlcmNlbnQgPSBuZXcgUmVnRXhwKGBeaHNsXFxcXCgke3JlTn0sJHtyZVB9LCR7cmVQfVxcXFwpJGApLFxuICAgIHJlSHNsYVBlcmNlbnQgPSBuZXcgUmVnRXhwKGBeaHNsYVxcXFwoJHtyZU59LCR7cmVQfSwke3JlUH0sJHtyZU59XFxcXCkkYCk7XG5cbnZhciBuYW1lZCA9IHtcbiAgYWxpY2VibHVlOiAweGYwZjhmZixcbiAgYW50aXF1ZXdoaXRlOiAweGZhZWJkNyxcbiAgYXF1YTogMHgwMGZmZmYsXG4gIGFxdWFtYXJpbmU6IDB4N2ZmZmQ0LFxuICBhenVyZTogMHhmMGZmZmYsXG4gIGJlaWdlOiAweGY1ZjVkYyxcbiAgYmlzcXVlOiAweGZmZTRjNCxcbiAgYmxhY2s6IDB4MDAwMDAwLFxuICBibGFuY2hlZGFsbW9uZDogMHhmZmViY2QsXG4gIGJsdWU6IDB4MDAwMGZmLFxuICBibHVldmlvbGV0OiAweDhhMmJlMixcbiAgYnJvd246IDB4YTUyYTJhLFxuICBidXJseXdvb2Q6IDB4ZGViODg3LFxuICBjYWRldGJsdWU6IDB4NWY5ZWEwLFxuICBjaGFydHJldXNlOiAweDdmZmYwMCxcbiAgY2hvY29sYXRlOiAweGQyNjkxZSxcbiAgY29yYWw6IDB4ZmY3ZjUwLFxuICBjb3JuZmxvd2VyYmx1ZTogMHg2NDk1ZWQsXG4gIGNvcm5zaWxrOiAweGZmZjhkYyxcbiAgY3JpbXNvbjogMHhkYzE0M2MsXG4gIGN5YW46IDB4MDBmZmZmLFxuICBkYXJrYmx1ZTogMHgwMDAwOGIsXG4gIGRhcmtjeWFuOiAweDAwOGI4YixcbiAgZGFya2dvbGRlbnJvZDogMHhiODg2MGIsXG4gIGRhcmtncmF5OiAweGE5YTlhOSxcbiAgZGFya2dyZWVuOiAweDAwNjQwMCxcbiAgZGFya2dyZXk6IDB4YTlhOWE5LFxuICBkYXJra2hha2k6IDB4YmRiNzZiLFxuICBkYXJrbWFnZW50YTogMHg4YjAwOGIsXG4gIGRhcmtvbGl2ZWdyZWVuOiAweDU1NmIyZixcbiAgZGFya29yYW5nZTogMHhmZjhjMDAsXG4gIGRhcmtvcmNoaWQ6IDB4OTkzMmNjLFxuICBkYXJrcmVkOiAweDhiMDAwMCxcbiAgZGFya3NhbG1vbjogMHhlOTk2N2EsXG4gIGRhcmtzZWFncmVlbjogMHg4ZmJjOGYsXG4gIGRhcmtzbGF0ZWJsdWU6IDB4NDgzZDhiLFxuICBkYXJrc2xhdGVncmF5OiAweDJmNGY0ZixcbiAgZGFya3NsYXRlZ3JleTogMHgyZjRmNGYsXG4gIGRhcmt0dXJxdW9pc2U6IDB4MDBjZWQxLFxuICBkYXJrdmlvbGV0OiAweDk0MDBkMyxcbiAgZGVlcHBpbms6IDB4ZmYxNDkzLFxuICBkZWVwc2t5Ymx1ZTogMHgwMGJmZmYsXG4gIGRpbWdyYXk6IDB4Njk2OTY5LFxuICBkaW1ncmV5OiAweDY5Njk2OSxcbiAgZG9kZ2VyYmx1ZTogMHgxZTkwZmYsXG4gIGZpcmVicmljazogMHhiMjIyMjIsXG4gIGZsb3JhbHdoaXRlOiAweGZmZmFmMCxcbiAgZm9yZXN0Z3JlZW46IDB4MjI4YjIyLFxuICBmdWNoc2lhOiAweGZmMDBmZixcbiAgZ2FpbnNib3JvOiAweGRjZGNkYyxcbiAgZ2hvc3R3aGl0ZTogMHhmOGY4ZmYsXG4gIGdvbGQ6IDB4ZmZkNzAwLFxuICBnb2xkZW5yb2Q6IDB4ZGFhNTIwLFxuICBncmF5OiAweDgwODA4MCxcbiAgZ3JlZW46IDB4MDA4MDAwLFxuICBncmVlbnllbGxvdzogMHhhZGZmMmYsXG4gIGdyZXk6IDB4ODA4MDgwLFxuICBob25leWRldzogMHhmMGZmZjAsXG4gIGhvdHBpbms6IDB4ZmY2OWI0LFxuICBpbmRpYW5yZWQ6IDB4Y2Q1YzVjLFxuICBpbmRpZ286IDB4NGIwMDgyLFxuICBpdm9yeTogMHhmZmZmZjAsXG4gIGtoYWtpOiAweGYwZTY4YyxcbiAgbGF2ZW5kZXI6IDB4ZTZlNmZhLFxuICBsYXZlbmRlcmJsdXNoOiAweGZmZjBmNSxcbiAgbGF3bmdyZWVuOiAweDdjZmMwMCxcbiAgbGVtb25jaGlmZm9uOiAweGZmZmFjZCxcbiAgbGlnaHRibHVlOiAweGFkZDhlNixcbiAgbGlnaHRjb3JhbDogMHhmMDgwODAsXG4gIGxpZ2h0Y3lhbjogMHhlMGZmZmYsXG4gIGxpZ2h0Z29sZGVucm9keWVsbG93OiAweGZhZmFkMixcbiAgbGlnaHRncmF5OiAweGQzZDNkMyxcbiAgbGlnaHRncmVlbjogMHg5MGVlOTAsXG4gIGxpZ2h0Z3JleTogMHhkM2QzZDMsXG4gIGxpZ2h0cGluazogMHhmZmI2YzEsXG4gIGxpZ2h0c2FsbW9uOiAweGZmYTA3YSxcbiAgbGlnaHRzZWFncmVlbjogMHgyMGIyYWEsXG4gIGxpZ2h0c2t5Ymx1ZTogMHg4N2NlZmEsXG4gIGxpZ2h0c2xhdGVncmF5OiAweDc3ODg5OSxcbiAgbGlnaHRzbGF0ZWdyZXk6IDB4Nzc4ODk5LFxuICBsaWdodHN0ZWVsYmx1ZTogMHhiMGM0ZGUsXG4gIGxpZ2h0eWVsbG93OiAweGZmZmZlMCxcbiAgbGltZTogMHgwMGZmMDAsXG4gIGxpbWVncmVlbjogMHgzMmNkMzIsXG4gIGxpbmVuOiAweGZhZjBlNixcbiAgbWFnZW50YTogMHhmZjAwZmYsXG4gIG1hcm9vbjogMHg4MDAwMDAsXG4gIG1lZGl1bWFxdWFtYXJpbmU6IDB4NjZjZGFhLFxuICBtZWRpdW1ibHVlOiAweDAwMDBjZCxcbiAgbWVkaXVtb3JjaGlkOiAweGJhNTVkMyxcbiAgbWVkaXVtcHVycGxlOiAweDkzNzBkYixcbiAgbWVkaXVtc2VhZ3JlZW46IDB4M2NiMzcxLFxuICBtZWRpdW1zbGF0ZWJsdWU6IDB4N2I2OGVlLFxuICBtZWRpdW1zcHJpbmdncmVlbjogMHgwMGZhOWEsXG4gIG1lZGl1bXR1cnF1b2lzZTogMHg0OGQxY2MsXG4gIG1lZGl1bXZpb2xldHJlZDogMHhjNzE1ODUsXG4gIG1pZG5pZ2h0Ymx1ZTogMHgxOTE5NzAsXG4gIG1pbnRjcmVhbTogMHhmNWZmZmEsXG4gIG1pc3R5cm9zZTogMHhmZmU0ZTEsXG4gIG1vY2Nhc2luOiAweGZmZTRiNSxcbiAgbmF2YWpvd2hpdGU6IDB4ZmZkZWFkLFxuICBuYXZ5OiAweDAwMDA4MCxcbiAgb2xkbGFjZTogMHhmZGY1ZTYsXG4gIG9saXZlOiAweDgwODAwMCxcbiAgb2xpdmVkcmFiOiAweDZiOGUyMyxcbiAgb3JhbmdlOiAweGZmYTUwMCxcbiAgb3JhbmdlcmVkOiAweGZmNDUwMCxcbiAgb3JjaGlkOiAweGRhNzBkNixcbiAgcGFsZWdvbGRlbnJvZDogMHhlZWU4YWEsXG4gIHBhbGVncmVlbjogMHg5OGZiOTgsXG4gIHBhbGV0dXJxdW9pc2U6IDB4YWZlZWVlLFxuICBwYWxldmlvbGV0cmVkOiAweGRiNzA5MyxcbiAgcGFwYXlhd2hpcDogMHhmZmVmZDUsXG4gIHBlYWNocHVmZjogMHhmZmRhYjksXG4gIHBlcnU6IDB4Y2Q4NTNmLFxuICBwaW5rOiAweGZmYzBjYixcbiAgcGx1bTogMHhkZGEwZGQsXG4gIHBvd2RlcmJsdWU6IDB4YjBlMGU2LFxuICBwdXJwbGU6IDB4ODAwMDgwLFxuICByZWJlY2NhcHVycGxlOiAweDY2MzM5OSxcbiAgcmVkOiAweGZmMDAwMCxcbiAgcm9zeWJyb3duOiAweGJjOGY4ZixcbiAgcm95YWxibHVlOiAweDQxNjllMSxcbiAgc2FkZGxlYnJvd246IDB4OGI0NTEzLFxuICBzYWxtb246IDB4ZmE4MDcyLFxuICBzYW5keWJyb3duOiAweGY0YTQ2MCxcbiAgc2VhZ3JlZW46IDB4MmU4YjU3LFxuICBzZWFzaGVsbDogMHhmZmY1ZWUsXG4gIHNpZW5uYTogMHhhMDUyMmQsXG4gIHNpbHZlcjogMHhjMGMwYzAsXG4gIHNreWJsdWU6IDB4ODdjZWViLFxuICBzbGF0ZWJsdWU6IDB4NmE1YWNkLFxuICBzbGF0ZWdyYXk6IDB4NzA4MDkwLFxuICBzbGF0ZWdyZXk6IDB4NzA4MDkwLFxuICBzbm93OiAweGZmZmFmYSxcbiAgc3ByaW5nZ3JlZW46IDB4MDBmZjdmLFxuICBzdGVlbGJsdWU6IDB4NDY4MmI0LFxuICB0YW46IDB4ZDJiNDhjLFxuICB0ZWFsOiAweDAwODA4MCxcbiAgdGhpc3RsZTogMHhkOGJmZDgsXG4gIHRvbWF0bzogMHhmZjYzNDcsXG4gIHR1cnF1b2lzZTogMHg0MGUwZDAsXG4gIHZpb2xldDogMHhlZTgyZWUsXG4gIHdoZWF0OiAweGY1ZGViMyxcbiAgd2hpdGU6IDB4ZmZmZmZmLFxuICB3aGl0ZXNtb2tlOiAweGY1ZjVmNSxcbiAgeWVsbG93OiAweGZmZmYwMCxcbiAgeWVsbG93Z3JlZW46IDB4OWFjZDMyXG59O1xuXG5kZWZpbmUoQ29sb3IsIGNvbG9yLCB7XG4gIGNvcHkoY2hhbm5lbHMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3RvciwgdGhpcywgY2hhbm5lbHMpO1xuICB9LFxuICBkaXNwbGF5YWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpO1xuICB9LFxuICBoZXg6IGNvbG9yX2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC5cbiAgZm9ybWF0SGV4OiBjb2xvcl9mb3JtYXRIZXgsXG4gIGZvcm1hdEhleDg6IGNvbG9yX2Zvcm1hdEhleDgsXG4gIGZvcm1hdEhzbDogY29sb3JfZm9ybWF0SHNsLFxuICBmb3JtYXRSZ2I6IGNvbG9yX2Zvcm1hdFJnYixcbiAgdG9TdHJpbmc6IGNvbG9yX2Zvcm1hdFJnYlxufSk7XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhleCgpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCk7XG59XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhleDgoKSB7XG4gIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleDgoKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SHNsKCkge1xuICByZXR1cm4gaHNsQ29udmVydCh0aGlzKS5mb3JtYXRIc2woKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0UmdiKCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29sb3IoZm9ybWF0KSB7XG4gIHZhciBtLCBsO1xuICBmb3JtYXQgPSAoZm9ybWF0ICsgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiAobSA9IHJlSGV4LmV4ZWMoZm9ybWF0KSkgPyAobCA9IG1bMV0ubGVuZ3RoLCBtID0gcGFyc2VJbnQobVsxXSwgMTYpLCBsID09PSA2ID8gcmdibihtKSAvLyAjZmYwMDAwXG4gICAgICA6IGwgPT09IDMgPyBuZXcgUmdiKChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4ZiksIDEpIC8vICNmMDBcbiAgICAgIDogbCA9PT0gOCA/IHJnYmEobSA+PiAyNCAmIDB4ZmYsIG0gPj4gMTYgJiAweGZmLCBtID4+IDggJiAweGZmLCAobSAmIDB4ZmYpIC8gMHhmZikgLy8gI2ZmMDAwMDAwXG4gICAgICA6IGwgPT09IDQgPyByZ2JhKChtID4+IDEyICYgMHhmKSB8IChtID4+IDggJiAweGYwKSwgKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKCgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4ZikpIC8gMHhmZikgLy8gI2YwMDBcbiAgICAgIDogbnVsbCkgLy8gaW52YWxpZCBoZXhcbiAgICAgIDogKG0gPSByZVJnYkludGVnZXIuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSwgbVsyXSwgbVszXSwgMSkgLy8gcmdiKDI1NSwgMCwgMClcbiAgICAgIDogKG0gPSByZVJnYlBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgMSkgLy8gcmdiKDEwMCUsIDAlLCAwJSlcbiAgICAgIDogKG0gPSByZVJnYmFJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pIC8vIHJnYmEoMjU1LCAwLCAwLCAxKVxuICAgICAgOiAobSA9IHJlUmdiYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgbVs0XSkgLy8gcmdiKDEwMCUsIDAlLCAwJSwgMSlcbiAgICAgIDogKG0gPSByZUhzbFBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgMSkgLy8gaHNsKDEyMCwgNTAlLCA1MCUpXG4gICAgICA6IChtID0gcmVIc2xhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCBtWzRdKSAvLyBoc2xhKDEyMCwgNTAlLCA1MCUsIDEpXG4gICAgICA6IG5hbWVkLmhhc093blByb3BlcnR5KGZvcm1hdCkgPyByZ2JuKG5hbWVkW2Zvcm1hdF0pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICA6IGZvcm1hdCA9PT0gXCJ0cmFuc3BhcmVudFwiID8gbmV3IFJnYihOYU4sIE5hTiwgTmFOLCAwKVxuICAgICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiByZ2JuKG4pIHtcbiAgcmV0dXJuIG5ldyBSZ2IobiA+PiAxNiAmIDB4ZmYsIG4gPj4gOCAmIDB4ZmYsIG4gJiAweGZmLCAxKTtcbn1cblxuZnVuY3Rpb24gcmdiYShyLCBnLCBiLCBhKSB7XG4gIGlmIChhIDw9IDApIHIgPSBnID0gYiA9IE5hTjtcbiAgcmV0dXJuIG5ldyBSZ2IociwgZywgYiwgYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2JDb252ZXJ0KG8pIHtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pO1xuICBpZiAoIW8pIHJldHVybiBuZXcgUmdiO1xuICBvID0gby5yZ2IoKTtcbiAgcmV0dXJuIG5ldyBSZ2Ioby5yLCBvLmcsIG8uYiwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYihyLCBnLCBiLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gcmdiQ29udmVydChyKSA6IG5ldyBSZ2IociwgZywgYiwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUmdiKHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgdGhpcy5yID0gK3I7XG4gIHRoaXMuZyA9ICtnO1xuICB0aGlzLmIgPSArYjtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShSZ2IsIHJnYiwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBSZ2IodGhpcy5yICogaywgdGhpcy5nICogaywgdGhpcy5iICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2IoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGNsYW1wKCkge1xuICAgIHJldHVybiBuZXcgUmdiKGNsYW1waSh0aGlzLnIpLCBjbGFtcGkodGhpcy5nKSwgY2xhbXBpKHRoaXMuYiksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTtcbiAgfSxcbiAgZGlzcGxheWFibGUoKSB7XG4gICAgcmV0dXJuICgtMC41IDw9IHRoaXMuciAmJiB0aGlzLnIgPCAyNTUuNSlcbiAgICAgICAgJiYgKC0wLjUgPD0gdGhpcy5nICYmIHRoaXMuZyA8IDI1NS41KVxuICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmIgJiYgdGhpcy5iIDwgMjU1LjUpXG4gICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7XG4gIH0sXG4gIGhleDogcmdiX2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC5cbiAgZm9ybWF0SGV4OiByZ2JfZm9ybWF0SGV4LFxuICBmb3JtYXRIZXg4OiByZ2JfZm9ybWF0SGV4OCxcbiAgZm9ybWF0UmdiOiByZ2JfZm9ybWF0UmdiLFxuICB0b1N0cmluZzogcmdiX2Zvcm1hdFJnYlxufSkpO1xuXG5mdW5jdGlvbiByZ2JfZm9ybWF0SGV4KCkge1xuICByZXR1cm4gYCMke2hleCh0aGlzLnIpfSR7aGV4KHRoaXMuZyl9JHtoZXgodGhpcy5iKX1gO1xufVxuXG5mdW5jdGlvbiByZ2JfZm9ybWF0SGV4OCgpIHtcbiAgcmV0dXJuIGAjJHtoZXgodGhpcy5yKX0ke2hleCh0aGlzLmcpfSR7aGV4KHRoaXMuYil9JHtoZXgoKGlzTmFOKHRoaXMub3BhY2l0eSkgPyAxIDogdGhpcy5vcGFjaXR5KSAqIDI1NSl9YDtcbn1cblxuZnVuY3Rpb24gcmdiX2Zvcm1hdFJnYigpIHtcbiAgY29uc3QgYSA9IGNsYW1wYSh0aGlzLm9wYWNpdHkpO1xuICByZXR1cm4gYCR7YSA9PT0gMSA/IFwicmdiKFwiIDogXCJyZ2JhKFwifSR7Y2xhbXBpKHRoaXMucil9LCAke2NsYW1waSh0aGlzLmcpfSwgJHtjbGFtcGkodGhpcy5iKX0ke2EgPT09IDEgPyBcIilcIiA6IGAsICR7YX0pYH1gO1xufVxuXG5mdW5jdGlvbiBjbGFtcGEob3BhY2l0eSkge1xuICByZXR1cm4gaXNOYU4ob3BhY2l0eSkgPyAxIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgb3BhY2l0eSkpO1xufVxuXG5mdW5jdGlvbiBjbGFtcGkodmFsdWUpIHtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh2YWx1ZSkgfHwgMCkpO1xufVxuXG5mdW5jdGlvbiBoZXgodmFsdWUpIHtcbiAgdmFsdWUgPSBjbGFtcGkodmFsdWUpO1xuICByZXR1cm4gKHZhbHVlIDwgMTYgPyBcIjBcIiA6IFwiXCIpICsgdmFsdWUudG9TdHJpbmcoMTYpO1xufVxuXG5mdW5jdGlvbiBoc2xhKGgsIHMsIGwsIGEpIHtcbiAgaWYgKGEgPD0gMCkgaCA9IHMgPSBsID0gTmFOO1xuICBlbHNlIGlmIChsIDw9IDAgfHwgbCA+PSAxKSBoID0gcyA9IE5hTjtcbiAgZWxzZSBpZiAocyA8PSAwKSBoID0gTmFOO1xuICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhzbENvbnZlcnQobykge1xuICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG5ldyBIc2woby5oLCBvLnMsIG8ubCwgby5vcGFjaXR5KTtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pO1xuICBpZiAoIW8pIHJldHVybiBuZXcgSHNsO1xuICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG87XG4gIG8gPSBvLnJnYigpO1xuICB2YXIgciA9IG8uciAvIDI1NSxcbiAgICAgIGcgPSBvLmcgLyAyNTUsXG4gICAgICBiID0gby5iIC8gMjU1LFxuICAgICAgbWluID0gTWF0aC5taW4ociwgZywgYiksXG4gICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSxcbiAgICAgIGggPSBOYU4sXG4gICAgICBzID0gbWF4IC0gbWluLFxuICAgICAgbCA9IChtYXggKyBtaW4pIC8gMjtcbiAgaWYgKHMpIHtcbiAgICBpZiAociA9PT0gbWF4KSBoID0gKGcgLSBiKSAvIHMgKyAoZyA8IGIpICogNjtcbiAgICBlbHNlIGlmIChnID09PSBtYXgpIGggPSAoYiAtIHIpIC8gcyArIDI7XG4gICAgZWxzZSBoID0gKHIgLSBnKSAvIHMgKyA0O1xuICAgIHMgLz0gbCA8IDAuNSA/IG1heCArIG1pbiA6IDIgLSBtYXggLSBtaW47XG4gICAgaCAqPSA2MDtcbiAgfSBlbHNlIHtcbiAgICBzID0gbCA+IDAgJiYgbCA8IDEgPyAwIDogaDtcbiAgfVxuICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHNsKGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoc2xDb252ZXJ0KGgpIDogbmV3IEhzbChoLCBzLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmZ1bmN0aW9uIEhzbChoLCBzLCBsLCBvcGFjaXR5KSB7XG4gIHRoaXMuaCA9ICtoO1xuICB0aGlzLnMgPSArcztcbiAgdGhpcy5sID0gK2w7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5kZWZpbmUoSHNsLCBoc2wsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspO1xuICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2IoKSB7XG4gICAgdmFyIGggPSB0aGlzLmggJSAzNjAgKyAodGhpcy5oIDwgMCkgKiAzNjAsXG4gICAgICAgIHMgPSBpc05hTihoKSB8fCBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucyxcbiAgICAgICAgbCA9IHRoaXMubCxcbiAgICAgICAgbTIgPSBsICsgKGwgPCAwLjUgPyBsIDogMSAtIGwpICogcyxcbiAgICAgICAgbTEgPSAyICogbCAtIG0yO1xuICAgIHJldHVybiBuZXcgUmdiKFxuICAgICAgaHNsMnJnYihoID49IDI0MCA/IGggLSAyNDAgOiBoICsgMTIwLCBtMSwgbTIpLFxuICAgICAgaHNsMnJnYihoLCBtMSwgbTIpLFxuICAgICAgaHNsMnJnYihoIDwgMTIwID8gaCArIDI0MCA6IGggLSAxMjAsIG0xLCBtMiksXG4gICAgICB0aGlzLm9wYWNpdHlcbiAgICApO1xuICB9LFxuICBjbGFtcCgpIHtcbiAgICByZXR1cm4gbmV3IEhzbChjbGFtcGgodGhpcy5oKSwgY2xhbXB0KHRoaXMucyksIGNsYW1wdCh0aGlzLmwpLCBjbGFtcGEodGhpcy5vcGFjaXR5KSk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlKCkge1xuICAgIHJldHVybiAoMCA8PSB0aGlzLnMgJiYgdGhpcy5zIDw9IDEgfHwgaXNOYU4odGhpcy5zKSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5sICYmIHRoaXMubCA8PSAxKVxuICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpO1xuICB9LFxuICBmb3JtYXRIc2woKSB7XG4gICAgY29uc3QgYSA9IGNsYW1wYSh0aGlzLm9wYWNpdHkpO1xuICAgIHJldHVybiBgJHthID09PSAxID8gXCJoc2woXCIgOiBcImhzbGEoXCJ9JHtjbGFtcGgodGhpcy5oKX0sICR7Y2xhbXB0KHRoaXMucykgKiAxMDB9JSwgJHtjbGFtcHQodGhpcy5sKSAqIDEwMH0lJHthID09PSAxID8gXCIpXCIgOiBgLCAke2F9KWB9YDtcbiAgfVxufSkpO1xuXG5mdW5jdGlvbiBjbGFtcGgodmFsdWUpIHtcbiAgdmFsdWUgPSAodmFsdWUgfHwgMCkgJSAzNjA7XG4gIHJldHVybiB2YWx1ZSA8IDAgPyB2YWx1ZSArIDM2MCA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjbGFtcHQodmFsdWUpIHtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHZhbHVlIHx8IDApKTtcbn1cblxuLyogRnJvbSBGdkQgMTMuMzcsIENTUyBDb2xvciBNb2R1bGUgTGV2ZWwgMyAqL1xuZnVuY3Rpb24gaHNsMnJnYihoLCBtMSwgbTIpIHtcbiAgcmV0dXJuIChoIDwgNjAgPyBtMSArIChtMiAtIG0xKSAqIGggLyA2MFxuICAgICAgOiBoIDwgMTgwID8gbTJcbiAgICAgIDogaCA8IDI0MCA/IG0xICsgKG0yIC0gbTEpICogKDI0MCAtIGgpIC8gNjBcbiAgICAgIDogbTEpICogMjU1O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29uc3RydWN0b3IsIGZhY3RvcnksIHByb3RvdHlwZSkge1xuICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBmYWN0b3J5LnByb3RvdHlwZSA9IHByb3RvdHlwZTtcbiAgcHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQocGFyZW50LCBkZWZpbml0aW9uKSB7XG4gIHZhciBwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUpO1xuICBmb3IgKHZhciBrZXkgaW4gZGVmaW5pdGlvbikgcHJvdG90eXBlW2tleV0gPSBkZWZpbml0aW9uW2tleV07XG4gIHJldHVybiBwcm90b3R5cGU7XG59XG4iLCJ2YXIgbm9vcCA9IHt2YWx1ZTogKCkgPT4ge319O1xuXG5mdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoLCBfID0ge30sIHQ7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAoISh0ID0gYXJndW1lbnRzW2ldICsgXCJcIikgfHwgKHQgaW4gXykgfHwgL1tcXHMuXS8udGVzdCh0KSkgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCB0eXBlOiBcIiArIHQpO1xuICAgIF9bdF0gPSBbXTtcbiAgfVxuICByZXR1cm4gbmV3IERpc3BhdGNoKF8pO1xufVxuXG5mdW5jdGlvbiBEaXNwYXRjaChfKSB7XG4gIHRoaXMuXyA9IF87XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcywgdHlwZXMpIHtcbiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XFxzKy8pLm1hcChmdW5jdGlvbih0KSB7XG4gICAgdmFyIG5hbWUgPSBcIlwiLCBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIGlmICh0ICYmICF0eXBlcy5oYXNPd25Qcm9wZXJ0eSh0KSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHQpO1xuICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07XG4gIH0pO1xufVxuXG5EaXNwYXRjaC5wcm90b3R5cGUgPSBkaXNwYXRjaC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBEaXNwYXRjaCxcbiAgb246IGZ1bmN0aW9uKHR5cGVuYW1lLCBjYWxsYmFjaykge1xuICAgIHZhciBfID0gdGhpcy5fLFxuICAgICAgICBUID0gcGFyc2VUeXBlbmFtZXModHlwZW5hbWUgKyBcIlwiLCBfKSxcbiAgICAgICAgdCxcbiAgICAgICAgaSA9IC0xLFxuICAgICAgICBuID0gVC5sZW5ndGg7XG5cbiAgICAvLyBJZiBubyBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGNhbGxiYWNrIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLlxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpICYmICh0ID0gZ2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUpKSkgcmV0dXJuIHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgYSB0eXBlIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgY2FsbGJhY2sgZm9yIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLlxuICAgIC8vIE90aGVyd2lzZSwgaWYgYSBudWxsIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJlbW92ZSBjYWxsYmFja3Mgb2YgdGhlIGdpdmVuIG5hbWUuXG4gICAgaWYgKGNhbGxiYWNrICE9IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgY2FsbGJhY2s6IFwiICsgY2FsbGJhY2spO1xuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICBpZiAodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgY2FsbGJhY2spO1xuICAgICAgZWxzZSBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgZm9yICh0IGluIF8pIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgbnVsbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGNvcHk6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjb3B5ID0ge30sIF8gPSB0aGlzLl87XG4gICAgZm9yICh2YXIgdCBpbiBfKSBjb3B5W3RdID0gX1t0XS5zbGljZSgpO1xuICAgIHJldHVybiBuZXcgRGlzcGF0Y2goY29weSk7XG4gIH0sXG4gIGNhbGw6IGZ1bmN0aW9uKHR5cGUsIHRoYXQpIHtcbiAgICBpZiAoKG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMikgPiAwKSBmb3IgKHZhciBhcmdzID0gbmV3IEFycmF5KG4pLCBpID0gMCwgbiwgdDsgaSA8IG47ICsraSkgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0eXBlKTtcbiAgICBmb3IgKHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7XG4gIH0sXG4gIGFwcGx5OiBmdW5jdGlvbih0eXBlLCB0aGF0LCBhcmdzKSB7XG4gICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0eXBlKTtcbiAgICBmb3IgKHZhciB0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBnZXQodHlwZSwgbmFtZSkge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoLCBjOyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKChjID0gdHlwZVtpXSkubmFtZSA9PT0gbmFtZSkge1xuICAgICAgcmV0dXJuIGMudmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldCh0eXBlLCBuYW1lLCBjYWxsYmFjaykge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKHR5cGVbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgdHlwZVtpXSA9IG5vb3AsIHR5cGUgPSB0eXBlLnNsaWNlKDAsIGkpLmNvbmNhdCh0eXBlLnNsaWNlKGkgKyAxKSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHR5cGUucHVzaCh7bmFtZTogbmFtZSwgdmFsdWU6IGNhbGxiYWNrfSk7XG4gIHJldHVybiB0eXBlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBkaXNwYXRjaDtcbiIsImltcG9ydCB7c2VsZWN0fSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgbm9ldmVudCwge25vbnBhc3NpdmVjYXB0dXJlfSBmcm9tIFwiLi9ub2V2ZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZpZXcpIHtcbiAgdmFyIHJvb3QgPSB2aWV3LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdCh2aWV3KS5vbihcImRyYWdzdGFydC5kcmFnXCIsIG5vZXZlbnQsIG5vbnBhc3NpdmVjYXB0dXJlKTtcbiAgaWYgKFwib25zZWxlY3RzdGFydFwiIGluIHJvb3QpIHtcbiAgICBzZWxlY3Rpb24ub24oXCJzZWxlY3RzdGFydC5kcmFnXCIsIG5vZXZlbnQsIG5vbnBhc3NpdmVjYXB0dXJlKTtcbiAgfSBlbHNlIHtcbiAgICByb290Ll9fbm9zZWxlY3QgPSByb290LnN0eWxlLk1velVzZXJTZWxlY3Q7XG4gICAgcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gXCJub25lXCI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHllc2RyYWcodmlldywgbm9jbGljaykge1xuICB2YXIgcm9vdCA9IHZpZXcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgc2VsZWN0aW9uID0gc2VsZWN0KHZpZXcpLm9uKFwiZHJhZ3N0YXJ0LmRyYWdcIiwgbnVsbCk7XG4gIGlmIChub2NsaWNrKSB7XG4gICAgc2VsZWN0aW9uLm9uKFwiY2xpY2suZHJhZ1wiLCBub2V2ZW50LCBub25wYXNzaXZlY2FwdHVyZSk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgc2VsZWN0aW9uLm9uKFwiY2xpY2suZHJhZ1wiLCBudWxsKTsgfSwgMCk7XG4gIH1cbiAgaWYgKFwib25zZWxlY3RzdGFydFwiIGluIHJvb3QpIHtcbiAgICBzZWxlY3Rpb24ub24oXCJzZWxlY3RzdGFydC5kcmFnXCIsIG51bGwpO1xuICB9IGVsc2Uge1xuICAgIHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdCA9IHJvb3QuX19ub3NlbGVjdDtcbiAgICBkZWxldGUgcm9vdC5fX25vc2VsZWN0O1xuICB9XG59XG4iLCIvLyBUaGVzZSBhcmUgdHlwaWNhbGx5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBub2V2ZW50IHRvIGVuc3VyZSB0aGF0IHdlIGNhblxuLy8gcHJldmVudERlZmF1bHQgb24gdGhlIGV2ZW50LlxuZXhwb3J0IGNvbnN0IG5vbnBhc3NpdmUgPSB7cGFzc2l2ZTogZmFsc2V9O1xuZXhwb3J0IGNvbnN0IG5vbnBhc3NpdmVjYXB0dXJlID0ge2NhcHR1cmU6IHRydWUsIHBhc3NpdmU6IGZhbHNlfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcHJvcGFnYXRpb24oZXZlbnQpIHtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuIiwiaW1wb3J0IGRzdiBmcm9tIFwiLi9kc3YuanNcIjtcblxudmFyIGNzdiA9IGRzdihcIixcIik7XG5cbmV4cG9ydCB2YXIgY3N2UGFyc2UgPSBjc3YucGFyc2U7XG5leHBvcnQgdmFyIGNzdlBhcnNlUm93cyA9IGNzdi5wYXJzZVJvd3M7XG5leHBvcnQgdmFyIGNzdkZvcm1hdCA9IGNzdi5mb3JtYXQ7XG5leHBvcnQgdmFyIGNzdkZvcm1hdEJvZHkgPSBjc3YuZm9ybWF0Qm9keTtcbmV4cG9ydCB2YXIgY3N2Rm9ybWF0Um93cyA9IGNzdi5mb3JtYXRSb3dzO1xuZXhwb3J0IHZhciBjc3ZGb3JtYXRSb3cgPSBjc3YuZm9ybWF0Um93O1xuZXhwb3J0IHZhciBjc3ZGb3JtYXRWYWx1ZSA9IGNzdi5mb3JtYXRWYWx1ZTtcbiIsInZhciBFT0wgPSB7fSxcbiAgICBFT0YgPSB7fSxcbiAgICBRVU9URSA9IDM0LFxuICAgIE5FV0xJTkUgPSAxMCxcbiAgICBSRVRVUk4gPSAxMztcblxuZnVuY3Rpb24gb2JqZWN0Q29udmVydGVyKGNvbHVtbnMpIHtcbiAgcmV0dXJuIG5ldyBGdW5jdGlvbihcImRcIiwgXCJyZXR1cm4ge1wiICsgY29sdW1ucy5tYXAoZnVuY3Rpb24obmFtZSwgaSkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShuYW1lKSArIFwiOiBkW1wiICsgaSArIFwiXSB8fCBcXFwiXFxcIlwiO1xuICB9KS5qb2luKFwiLFwiKSArIFwifVwiKTtcbn1cblxuZnVuY3Rpb24gY3VzdG9tQ29udmVydGVyKGNvbHVtbnMsIGYpIHtcbiAgdmFyIG9iamVjdCA9IG9iamVjdENvbnZlcnRlcihjb2x1bW5zKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHJvdywgaSkge1xuICAgIHJldHVybiBmKG9iamVjdChyb3cpLCBpLCBjb2x1bW5zKTtcbiAgfTtcbn1cblxuLy8gQ29tcHV0ZSB1bmlxdWUgY29sdW1ucyBpbiBvcmRlciBvZiBkaXNjb3ZlcnkuXG5mdW5jdGlvbiBpbmZlckNvbHVtbnMocm93cykge1xuICB2YXIgY29sdW1uU2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgIGNvbHVtbnMgPSBbXTtcblxuICByb3dzLmZvckVhY2goZnVuY3Rpb24ocm93KSB7XG4gICAgZm9yICh2YXIgY29sdW1uIGluIHJvdykge1xuICAgICAgaWYgKCEoY29sdW1uIGluIGNvbHVtblNldCkpIHtcbiAgICAgICAgY29sdW1ucy5wdXNoKGNvbHVtblNldFtjb2x1bW5dID0gY29sdW1uKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBjb2x1bW5zO1xufVxuXG5mdW5jdGlvbiBwYWQodmFsdWUsIHdpZHRoKSB7XG4gIHZhciBzID0gdmFsdWUgKyBcIlwiLCBsZW5ndGggPSBzLmxlbmd0aDtcbiAgcmV0dXJuIGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbigwKSArIHMgOiBzO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRZZWFyKHllYXIpIHtcbiAgcmV0dXJuIHllYXIgPCAwID8gXCItXCIgKyBwYWQoLXllYXIsIDYpXG4gICAgOiB5ZWFyID4gOTk5OSA/IFwiK1wiICsgcGFkKHllYXIsIDYpXG4gICAgOiBwYWQoeWVhciwgNCk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZSkge1xuICB2YXIgaG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCksXG4gICAgICBtaW51dGVzID0gZGF0ZS5nZXRVVENNaW51dGVzKCksXG4gICAgICBzZWNvbmRzID0gZGF0ZS5nZXRVVENTZWNvbmRzKCksXG4gICAgICBtaWxsaXNlY29uZHMgPSBkYXRlLmdldFVUQ01pbGxpc2Vjb25kcygpO1xuICByZXR1cm4gaXNOYU4oZGF0ZSkgPyBcIkludmFsaWQgRGF0ZVwiXG4gICAgICA6IGZvcm1hdFllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpLCA0KSArIFwiLVwiICsgcGFkKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEsIDIpICsgXCItXCIgKyBwYWQoZGF0ZS5nZXRVVENEYXRlKCksIDIpXG4gICAgICArIChtaWxsaXNlY29uZHMgPyBcIlRcIiArIHBhZChob3VycywgMikgKyBcIjpcIiArIHBhZChtaW51dGVzLCAyKSArIFwiOlwiICsgcGFkKHNlY29uZHMsIDIpICsgXCIuXCIgKyBwYWQobWlsbGlzZWNvbmRzLCAzKSArIFwiWlwiXG4gICAgICA6IHNlY29uZHMgPyBcIlRcIiArIHBhZChob3VycywgMikgKyBcIjpcIiArIHBhZChtaW51dGVzLCAyKSArIFwiOlwiICsgcGFkKHNlY29uZHMsIDIpICsgXCJaXCJcbiAgICAgIDogbWludXRlcyB8fCBob3VycyA/IFwiVFwiICsgcGFkKGhvdXJzLCAyKSArIFwiOlwiICsgcGFkKG1pbnV0ZXMsIDIpICsgXCJaXCJcbiAgICAgIDogXCJcIik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGRlbGltaXRlcikge1xuICB2YXIgcmVGb3JtYXQgPSBuZXcgUmVnRXhwKFwiW1xcXCJcIiArIGRlbGltaXRlciArIFwiXFxuXFxyXVwiKSxcbiAgICAgIERFTElNSVRFUiA9IGRlbGltaXRlci5jaGFyQ29kZUF0KDApO1xuXG4gIGZ1bmN0aW9uIHBhcnNlKHRleHQsIGYpIHtcbiAgICB2YXIgY29udmVydCwgY29sdW1ucywgcm93cyA9IHBhcnNlUm93cyh0ZXh0LCBmdW5jdGlvbihyb3csIGkpIHtcbiAgICAgIGlmIChjb252ZXJ0KSByZXR1cm4gY29udmVydChyb3csIGkgLSAxKTtcbiAgICAgIGNvbHVtbnMgPSByb3csIGNvbnZlcnQgPSBmID8gY3VzdG9tQ29udmVydGVyKHJvdywgZikgOiBvYmplY3RDb252ZXJ0ZXIocm93KTtcbiAgICB9KTtcbiAgICByb3dzLmNvbHVtbnMgPSBjb2x1bW5zIHx8IFtdO1xuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VSb3dzKHRleHQsIGYpIHtcbiAgICB2YXIgcm93cyA9IFtdLCAvLyBvdXRwdXQgcm93c1xuICAgICAgICBOID0gdGV4dC5sZW5ndGgsXG4gICAgICAgIEkgPSAwLCAvLyBjdXJyZW50IGNoYXJhY3RlciBpbmRleFxuICAgICAgICBuID0gMCwgLy8gY3VycmVudCBsaW5lIG51bWJlclxuICAgICAgICB0LCAvLyBjdXJyZW50IHRva2VuXG4gICAgICAgIGVvZiA9IE4gPD0gMCwgLy8gY3VycmVudCB0b2tlbiBmb2xsb3dlZCBieSBFT0Y/XG4gICAgICAgIGVvbCA9IGZhbHNlOyAvLyBjdXJyZW50IHRva2VuIGZvbGxvd2VkIGJ5IEVPTD9cblxuICAgIC8vIFN0cmlwIHRoZSB0cmFpbGluZyBuZXdsaW5lLlxuICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoTiAtIDEpID09PSBORVdMSU5FKSAtLU47XG4gICAgaWYgKHRleHQuY2hhckNvZGVBdChOIC0gMSkgPT09IFJFVFVSTikgLS1OO1xuXG4gICAgZnVuY3Rpb24gdG9rZW4oKSB7XG4gICAgICBpZiAoZW9mKSByZXR1cm4gRU9GO1xuICAgICAgaWYgKGVvbCkgcmV0dXJuIGVvbCA9IGZhbHNlLCBFT0w7XG5cbiAgICAgIC8vIFVuZXNjYXBlIHF1b3Rlcy5cbiAgICAgIHZhciBpLCBqID0gSSwgYztcbiAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaikgPT09IFFVT1RFKSB7XG4gICAgICAgIHdoaWxlIChJKysgPCBOICYmIHRleHQuY2hhckNvZGVBdChJKSAhPT0gUVVPVEUgfHwgdGV4dC5jaGFyQ29kZUF0KCsrSSkgPT09IFFVT1RFKTtcbiAgICAgICAgaWYgKChpID0gSSkgPj0gTikgZW9mID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoKGMgPSB0ZXh0LmNoYXJDb2RlQXQoSSsrKSkgPT09IE5FV0xJTkUpIGVvbCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKGMgPT09IFJFVFVSTikgeyBlb2wgPSB0cnVlOyBpZiAodGV4dC5jaGFyQ29kZUF0KEkpID09PSBORVdMSU5FKSArK0k7IH1cbiAgICAgICAgcmV0dXJuIHRleHQuc2xpY2UoaiArIDEsIGkgLSAxKS5yZXBsYWNlKC9cIlwiL2csIFwiXFxcIlwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gRmluZCBuZXh0IGRlbGltaXRlciBvciBuZXdsaW5lLlxuICAgICAgd2hpbGUgKEkgPCBOKSB7XG4gICAgICAgIGlmICgoYyA9IHRleHQuY2hhckNvZGVBdChpID0gSSsrKSkgPT09IE5FV0xJTkUpIGVvbCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKGMgPT09IFJFVFVSTikgeyBlb2wgPSB0cnVlOyBpZiAodGV4dC5jaGFyQ29kZUF0KEkpID09PSBORVdMSU5FKSArK0k7IH1cbiAgICAgICAgZWxzZSBpZiAoYyAhPT0gREVMSU1JVEVSKSBjb250aW51ZTtcbiAgICAgICAgcmV0dXJuIHRleHQuc2xpY2UoaiwgaSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJldHVybiBsYXN0IHRva2VuIGJlZm9yZSBFT0YuXG4gICAgICByZXR1cm4gZW9mID0gdHJ1ZSwgdGV4dC5zbGljZShqLCBOKTtcbiAgICB9XG5cbiAgICB3aGlsZSAoKHQgPSB0b2tlbigpKSAhPT0gRU9GKSB7XG4gICAgICB2YXIgcm93ID0gW107XG4gICAgICB3aGlsZSAodCAhPT0gRU9MICYmIHQgIT09IEVPRikgcm93LnB1c2godCksIHQgPSB0b2tlbigpO1xuICAgICAgaWYgKGYgJiYgKHJvdyA9IGYocm93LCBuKyspKSA9PSBudWxsKSBjb250aW51ZTtcbiAgICAgIHJvd3MucHVzaChyb3cpO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJlZm9ybWF0Qm9keShyb3dzLCBjb2x1bW5zKSB7XG4gICAgcmV0dXJuIHJvd3MubWFwKGZ1bmN0aW9uKHJvdykge1xuICAgICAgcmV0dXJuIGNvbHVtbnMubWFwKGZ1bmN0aW9uKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gZm9ybWF0VmFsdWUocm93W2NvbHVtbl0pO1xuICAgICAgfSkuam9pbihkZWxpbWl0ZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0KHJvd3MsIGNvbHVtbnMpIHtcbiAgICBpZiAoY29sdW1ucyA9PSBudWxsKSBjb2x1bW5zID0gaW5mZXJDb2x1bW5zKHJvd3MpO1xuICAgIHJldHVybiBbY29sdW1ucy5tYXAoZm9ybWF0VmFsdWUpLmpvaW4oZGVsaW1pdGVyKV0uY29uY2F0KHByZWZvcm1hdEJvZHkocm93cywgY29sdW1ucykpLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRCb2R5KHJvd3MsIGNvbHVtbnMpIHtcbiAgICBpZiAoY29sdW1ucyA9PSBudWxsKSBjb2x1bW5zID0gaW5mZXJDb2x1bW5zKHJvd3MpO1xuICAgIHJldHVybiBwcmVmb3JtYXRCb2R5KHJvd3MsIGNvbHVtbnMpLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRSb3dzKHJvd3MpIHtcbiAgICByZXR1cm4gcm93cy5tYXAoZm9ybWF0Um93KS5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0Um93KHJvdykge1xuICAgIHJldHVybiByb3cubWFwKGZvcm1hdFZhbHVlKS5qb2luKGRlbGltaXRlcik7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gXCJcIlxuICAgICAgICA6IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/IGZvcm1hdERhdGUodmFsdWUpXG4gICAgICAgIDogcmVGb3JtYXQudGVzdCh2YWx1ZSArPSBcIlwiKSA/IFwiXFxcIlwiICsgdmFsdWUucmVwbGFjZSgvXCIvZywgXCJcXFwiXFxcIlwiKSArIFwiXFxcIlwiXG4gICAgICAgIDogdmFsdWU7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBhcnNlOiBwYXJzZSxcbiAgICBwYXJzZVJvd3M6IHBhcnNlUm93cyxcbiAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICBmb3JtYXRCb2R5OiBmb3JtYXRCb2R5LFxuICAgIGZvcm1hdFJvd3M6IGZvcm1hdFJvd3MsXG4gICAgZm9ybWF0Um93OiBmb3JtYXRSb3csXG4gICAgZm9ybWF0VmFsdWU6IGZvcm1hdFZhbHVlXG4gIH07XG59XG4iLCJpbXBvcnQgZHN2IGZyb20gXCIuL2Rzdi5qc1wiO1xuXG52YXIgdHN2ID0gZHN2KFwiXFx0XCIpO1xuXG5leHBvcnQgdmFyIHRzdlBhcnNlID0gdHN2LnBhcnNlO1xuZXhwb3J0IHZhciB0c3ZQYXJzZVJvd3MgPSB0c3YucGFyc2VSb3dzO1xuZXhwb3J0IHZhciB0c3ZGb3JtYXQgPSB0c3YuZm9ybWF0O1xuZXhwb3J0IHZhciB0c3ZGb3JtYXRCb2R5ID0gdHN2LmZvcm1hdEJvZHk7XG5leHBvcnQgdmFyIHRzdkZvcm1hdFJvd3MgPSB0c3YuZm9ybWF0Um93cztcbmV4cG9ydCB2YXIgdHN2Rm9ybWF0Um93ID0gdHN2LmZvcm1hdFJvdztcbmV4cG9ydCB2YXIgdHN2Rm9ybWF0VmFsdWUgPSB0c3YuZm9ybWF0VmFsdWU7XG4iLCJleHBvcnQgZnVuY3Rpb24gY3ViaWNJbih0KSB7XG4gIHJldHVybiB0ICogdCAqIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjdWJpY091dCh0KSB7XG4gIHJldHVybiAtLXQgKiB0ICogdCArIDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjdWJpY0luT3V0KHQpIHtcbiAgcmV0dXJuICgodCAqPSAyKSA8PSAxID8gdCAqIHQgKiB0IDogKHQgLT0gMikgKiB0ICogdCArIDIpIC8gMjtcbn1cbiIsImltcG9ydCB7Y3N2UGFyc2UsIGRzdkZvcm1hdCwgdHN2UGFyc2V9IGZyb20gXCJkMy1kc3ZcIjtcbmltcG9ydCB0ZXh0IGZyb20gXCIuL3RleHQuanNcIjtcblxuZnVuY3Rpb24gZHN2UGFyc2UocGFyc2UpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGlucHV0LCBpbml0LCByb3cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMiAmJiB0eXBlb2YgaW5pdCA9PT0gXCJmdW5jdGlvblwiKSByb3cgPSBpbml0LCBpbml0ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0ZXh0KGlucHV0LCBpbml0KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gcGFyc2UocmVzcG9uc2UsIHJvdyk7XG4gICAgfSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRzdihkZWxpbWl0ZXIsIGlucHV0LCBpbml0LCByb3cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIGluaXQgPT09IFwiZnVuY3Rpb25cIikgcm93ID0gaW5pdCwgaW5pdCA9IHVuZGVmaW5lZDtcbiAgdmFyIGZvcm1hdCA9IGRzdkZvcm1hdChkZWxpbWl0ZXIpO1xuICByZXR1cm4gdGV4dChpbnB1dCwgaW5pdCkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuICAgIHJldHVybiBmb3JtYXQucGFyc2UocmVzcG9uc2UsIHJvdyk7XG4gIH0pO1xufVxuXG5leHBvcnQgdmFyIGNzdiA9IGRzdlBhcnNlKGNzdlBhcnNlKTtcbmV4cG9ydCB2YXIgdHN2ID0gZHN2UGFyc2UodHN2UGFyc2UpO1xuIiwiZnVuY3Rpb24gcmVzcG9uc2VKc29uKHJlc3BvbnNlKSB7XG4gIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXMgKyBcIiBcIiArIHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDQgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSAyMDUpIHJldHVybjtcbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5wdXQsIGluaXQpIHtcbiAgcmV0dXJuIGZldGNoKGlucHV0LCBpbml0KS50aGVuKHJlc3BvbnNlSnNvbik7XG59XG4iLCJmdW5jdGlvbiByZXNwb25zZVRleHQocmVzcG9uc2UpIHtcbiAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1cyArIFwiIFwiICsgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGlucHV0LCBpbml0KSB7XG4gIHJldHVybiBmZXRjaChpbnB1dCwgaW5pdCkudGhlbihyZXNwb25zZVRleHQpO1xufVxuIiwiaW1wb3J0IGZvcm1hdExvY2FsZSBmcm9tIFwiLi9sb2NhbGUuanNcIjtcblxudmFyIGxvY2FsZTtcbmV4cG9ydCB2YXIgZm9ybWF0O1xuZXhwb3J0IHZhciBmb3JtYXRQcmVmaXg7XG5cbmRlZmF1bHRMb2NhbGUoe1xuICB0aG91c2FuZHM6IFwiLFwiLFxuICBncm91cGluZzogWzNdLFxuICBjdXJyZW5jeTogW1wiJFwiLCBcIlwiXVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlZmF1bHRMb2NhbGUoZGVmaW5pdGlvbikge1xuICBsb2NhbGUgPSBmb3JtYXRMb2NhbGUoZGVmaW5pdGlvbik7XG4gIGZvcm1hdCA9IGxvY2FsZS5mb3JtYXQ7XG4gIGZvcm1hdFByZWZpeCA9IGxvY2FsZS5mb3JtYXRQcmVmaXg7XG4gIHJldHVybiBsb2NhbGU7XG59XG4iLCJpbXBvcnQge2Zvcm1hdERlY2ltYWxQYXJ0c30gZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4ID0gZm9ybWF0RGVjaW1hbFBhcnRzKE1hdGguYWJzKHgpKSwgeCA/IHhbMV0gOiBOYU47XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBNYXRoLmFicyh4ID0gTWF0aC5yb3VuZCh4KSkgPj0gMWUyMVxuICAgICAgPyB4LnRvTG9jYWxlU3RyaW5nKFwiZW5cIikucmVwbGFjZSgvLC9nLCBcIlwiKVxuICAgICAgOiB4LnRvU3RyaW5nKDEwKTtcbn1cblxuLy8gQ29tcHV0ZXMgdGhlIGRlY2ltYWwgY29lZmZpY2llbnQgYW5kIGV4cG9uZW50IG9mIHRoZSBzcGVjaWZpZWQgbnVtYmVyIHggd2l0aFxuLy8gc2lnbmlmaWNhbnQgZGlnaXRzIHAsIHdoZXJlIHggaXMgcG9zaXRpdmUgYW5kIHAgaXMgaW4gWzEsIDIxXSBvciB1bmRlZmluZWQuXG4vLyBGb3IgZXhhbXBsZSwgZm9ybWF0RGVjaW1hbFBhcnRzKDEuMjMpIHJldHVybnMgW1wiMTIzXCIsIDBdLlxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBwKSB7XG4gIGlmICgoaSA9ICh4ID0gcCA/IHgudG9FeHBvbmVudGlhbChwIC0gMSkgOiB4LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZihcImVcIikpIDwgMCkgcmV0dXJuIG51bGw7IC8vIE5hTiwgwrFJbmZpbml0eVxuICB2YXIgaSwgY29lZmZpY2llbnQgPSB4LnNsaWNlKDAsIGkpO1xuXG4gIC8vIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdG9FeHBvbmVudGlhbCBlaXRoZXIgaGFzIHRoZSBmb3JtIFxcZFxcLlxcZCtlWy0rXVxcZCtcbiAgLy8gKGUuZy4sIDEuMmUrMykgb3IgdGhlIGZvcm0gXFxkZVstK11cXGQrIChlLmcuLCAxZSszKS5cbiAgcmV0dXJuIFtcbiAgICBjb2VmZmljaWVudC5sZW5ndGggPiAxID8gY29lZmZpY2llbnRbMF0gKyBjb2VmZmljaWVudC5zbGljZSgyKSA6IGNvZWZmaWNpZW50LFxuICAgICt4LnNsaWNlKGkgKyAxKVxuICBdO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZ3JvdXBpbmcsIHRob3VzYW5kcykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIHdpZHRoKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5sZW5ndGgsXG4gICAgICAgIHQgPSBbXSxcbiAgICAgICAgaiA9IDAsXG4gICAgICAgIGcgPSBncm91cGluZ1swXSxcbiAgICAgICAgbGVuZ3RoID0gMDtcblxuICAgIHdoaWxlIChpID4gMCAmJiBnID4gMCkge1xuICAgICAgaWYgKGxlbmd0aCArIGcgKyAxID4gd2lkdGgpIGcgPSBNYXRoLm1heCgxLCB3aWR0aCAtIGxlbmd0aCk7XG4gICAgICB0LnB1c2godmFsdWUuc3Vic3RyaW5nKGkgLT0gZywgaSArIGcpKTtcbiAgICAgIGlmICgobGVuZ3RoICs9IGcgKyAxKSA+IHdpZHRoKSBicmVhaztcbiAgICAgIGcgPSBncm91cGluZ1tqID0gKGogKyAxKSAlIGdyb3VwaW5nLmxlbmd0aF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHQucmV2ZXJzZSgpLmpvaW4odGhvdXNhbmRzKTtcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG51bWVyYWxzKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9bMC05XS9nLCBmdW5jdGlvbihpKSB7XG4gICAgICByZXR1cm4gbnVtZXJhbHNbK2ldO1xuICAgIH0pO1xuICB9O1xufVxuIiwiaW1wb3J0IHtmb3JtYXREZWNpbWFsUGFydHN9IGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcblxuZXhwb3J0IHZhciBwcmVmaXhFeHBvbmVudDtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCwgcCkge1xuICB2YXIgZCA9IGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBwKTtcbiAgaWYgKCFkKSByZXR1cm4geCArIFwiXCI7XG4gIHZhciBjb2VmZmljaWVudCA9IGRbMF0sXG4gICAgICBleHBvbmVudCA9IGRbMV0sXG4gICAgICBpID0gZXhwb25lbnQgLSAocHJlZml4RXhwb25lbnQgPSBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCAvIDMpKSkgKiAzKSArIDEsXG4gICAgICBuID0gY29lZmZpY2llbnQubGVuZ3RoO1xuICByZXR1cm4gaSA9PT0gbiA/IGNvZWZmaWNpZW50XG4gICAgICA6IGkgPiBuID8gY29lZmZpY2llbnQgKyBuZXcgQXJyYXkoaSAtIG4gKyAxKS5qb2luKFwiMFwiKVxuICAgICAgOiBpID4gMCA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGkpICsgXCIuXCIgKyBjb2VmZmljaWVudC5zbGljZShpKVxuICAgICAgOiBcIjAuXCIgKyBuZXcgQXJyYXkoMSAtIGkpLmpvaW4oXCIwXCIpICsgZm9ybWF0RGVjaW1hbFBhcnRzKHgsIE1hdGgubWF4KDAsIHAgKyBpIC0gMSkpWzBdOyAvLyBsZXNzIHRoYW4gMXkhXG59XG4iLCJpbXBvcnQge2Zvcm1hdERlY2ltYWxQYXJ0c30gZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCBwKSB7XG4gIHZhciBkID0gZm9ybWF0RGVjaW1hbFBhcnRzKHgsIHApO1xuICBpZiAoIWQpIHJldHVybiB4ICsgXCJcIjtcbiAgdmFyIGNvZWZmaWNpZW50ID0gZFswXSxcbiAgICAgIGV4cG9uZW50ID0gZFsxXTtcbiAgcmV0dXJuIGV4cG9uZW50IDwgMCA/IFwiMC5cIiArIG5ldyBBcnJheSgtZXhwb25lbnQpLmpvaW4oXCIwXCIpICsgY29lZmZpY2llbnRcbiAgICAgIDogY29lZmZpY2llbnQubGVuZ3RoID4gZXhwb25lbnQgKyAxID8gY29lZmZpY2llbnQuc2xpY2UoMCwgZXhwb25lbnQgKyAxKSArIFwiLlwiICsgY29lZmZpY2llbnQuc2xpY2UoZXhwb25lbnQgKyAxKVxuICAgICAgOiBjb2VmZmljaWVudCArIG5ldyBBcnJheShleHBvbmVudCAtIGNvZWZmaWNpZW50Lmxlbmd0aCArIDIpLmpvaW4oXCIwXCIpO1xufVxuIiwiLy8gW1tmaWxsXWFsaWduXVtzaWduXVtzeW1ib2xdWzBdW3dpZHRoXVssXVsucHJlY2lzaW9uXVt+XVt0eXBlXVxudmFyIHJlID0gL14oPzooLik/KFs8Pj1eXSkpPyhbK1xcLSggXSk/KFskI10pPygwKT8oXFxkKyk/KCwpPyhcXC5cXGQrKT8ofik/KFthLXolXSk/JC9pO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSB7XG4gIGlmICghKG1hdGNoID0gcmUuZXhlYyhzcGVjaWZpZXIpKSkgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBmb3JtYXQ6IFwiICsgc3BlY2lmaWVyKTtcbiAgdmFyIG1hdGNoO1xuICByZXR1cm4gbmV3IEZvcm1hdFNwZWNpZmllcih7XG4gICAgZmlsbDogbWF0Y2hbMV0sXG4gICAgYWxpZ246IG1hdGNoWzJdLFxuICAgIHNpZ246IG1hdGNoWzNdLFxuICAgIHN5bWJvbDogbWF0Y2hbNF0sXG4gICAgemVybzogbWF0Y2hbNV0sXG4gICAgd2lkdGg6IG1hdGNoWzZdLFxuICAgIGNvbW1hOiBtYXRjaFs3XSxcbiAgICBwcmVjaXNpb246IG1hdGNoWzhdICYmIG1hdGNoWzhdLnNsaWNlKDEpLFxuICAgIHRyaW06IG1hdGNoWzldLFxuICAgIHR5cGU6IG1hdGNoWzEwXVxuICB9KTtcbn1cblxuZm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZSA9IEZvcm1hdFNwZWNpZmllci5wcm90b3R5cGU7IC8vIGluc3RhbmNlb2ZcblxuZXhwb3J0IGZ1bmN0aW9uIEZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpIHtcbiAgdGhpcy5maWxsID0gc3BlY2lmaWVyLmZpbGwgPT09IHVuZGVmaW5lZCA/IFwiIFwiIDogc3BlY2lmaWVyLmZpbGwgKyBcIlwiO1xuICB0aGlzLmFsaWduID0gc3BlY2lmaWVyLmFsaWduID09PSB1bmRlZmluZWQgPyBcIj5cIiA6IHNwZWNpZmllci5hbGlnbiArIFwiXCI7XG4gIHRoaXMuc2lnbiA9IHNwZWNpZmllci5zaWduID09PSB1bmRlZmluZWQgPyBcIi1cIiA6IHNwZWNpZmllci5zaWduICsgXCJcIjtcbiAgdGhpcy5zeW1ib2wgPSBzcGVjaWZpZXIuc3ltYm9sID09PSB1bmRlZmluZWQgPyBcIlwiIDogc3BlY2lmaWVyLnN5bWJvbCArIFwiXCI7XG4gIHRoaXMuemVybyA9ICEhc3BlY2lmaWVyLnplcm87XG4gIHRoaXMud2lkdGggPSBzcGVjaWZpZXIud2lkdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICtzcGVjaWZpZXIud2lkdGg7XG4gIHRoaXMuY29tbWEgPSAhIXNwZWNpZmllci5jb21tYTtcbiAgdGhpcy5wcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiArc3BlY2lmaWVyLnByZWNpc2lvbjtcbiAgdGhpcy50cmltID0gISFzcGVjaWZpZXIudHJpbTtcbiAgdGhpcy50eXBlID0gc3BlY2lmaWVyLnR5cGUgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBzcGVjaWZpZXIudHlwZSArIFwiXCI7XG59XG5cbkZvcm1hdFNwZWNpZmllci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZmlsbFxuICAgICAgKyB0aGlzLmFsaWduXG4gICAgICArIHRoaXMuc2lnblxuICAgICAgKyB0aGlzLnN5bWJvbFxuICAgICAgKyAodGhpcy56ZXJvID8gXCIwXCIgOiBcIlwiKVxuICAgICAgKyAodGhpcy53aWR0aCA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IE1hdGgubWF4KDEsIHRoaXMud2lkdGggfCAwKSlcbiAgICAgICsgKHRoaXMuY29tbWEgPyBcIixcIiA6IFwiXCIpXG4gICAgICArICh0aGlzLnByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IFwiLlwiICsgTWF0aC5tYXgoMCwgdGhpcy5wcmVjaXNpb24gfCAwKSlcbiAgICAgICsgKHRoaXMudHJpbSA/IFwiflwiIDogXCJcIilcbiAgICAgICsgdGhpcy50eXBlO1xufTtcbiIsIi8vIFRyaW1zIGluc2lnbmlmaWNhbnQgemVyb3MsIGUuZy4sIHJlcGxhY2VzIDEuMjAwMGsgd2l0aCAxLjJrLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocykge1xuICBvdXQ6IGZvciAodmFyIG4gPSBzLmxlbmd0aCwgaSA9IDEsIGkwID0gLTEsIGkxOyBpIDwgbjsgKytpKSB7XG4gICAgc3dpdGNoIChzW2ldKSB7XG4gICAgICBjYXNlIFwiLlwiOiBpMCA9IGkxID0gaTsgYnJlYWs7XG4gICAgICBjYXNlIFwiMFwiOiBpZiAoaTAgPT09IDApIGkwID0gaTsgaTEgPSBpOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IGlmICghK3NbaV0pIGJyZWFrIG91dDsgaWYgKGkwID4gMCkgaTAgPSAwOyBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGkwID4gMCA/IHMuc2xpY2UoMCwgaTApICsgcy5zbGljZShpMSArIDEpIDogcztcbn1cbiIsImltcG9ydCBmb3JtYXREZWNpbWFsIGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcbmltcG9ydCBmb3JtYXRQcmVmaXhBdXRvIGZyb20gXCIuL2Zvcm1hdFByZWZpeEF1dG8uanNcIjtcbmltcG9ydCBmb3JtYXRSb3VuZGVkIGZyb20gXCIuL2Zvcm1hdFJvdW5kZWQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBcIiVcIjogKHgsIHApID0+ICh4ICogMTAwKS50b0ZpeGVkKHApLFxuICBcImJcIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoMiksXG4gIFwiY1wiOiAoeCkgPT4geCArIFwiXCIsXG4gIFwiZFwiOiBmb3JtYXREZWNpbWFsLFxuICBcImVcIjogKHgsIHApID0+IHgudG9FeHBvbmVudGlhbChwKSxcbiAgXCJmXCI6ICh4LCBwKSA9PiB4LnRvRml4ZWQocCksXG4gIFwiZ1wiOiAoeCwgcCkgPT4geC50b1ByZWNpc2lvbihwKSxcbiAgXCJvXCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDgpLFxuICBcInBcIjogKHgsIHApID0+IGZvcm1hdFJvdW5kZWQoeCAqIDEwMCwgcCksXG4gIFwiclwiOiBmb3JtYXRSb3VuZGVkLFxuICBcInNcIjogZm9ybWF0UHJlZml4QXV0byxcbiAgXCJYXCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLFxuICBcInhcIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpXG59O1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4geDtcbn1cbiIsImltcG9ydCBleHBvbmVudCBmcm9tIFwiLi9leHBvbmVudC5qc1wiO1xuaW1wb3J0IGZvcm1hdEdyb3VwIGZyb20gXCIuL2Zvcm1hdEdyb3VwLmpzXCI7XG5pbXBvcnQgZm9ybWF0TnVtZXJhbHMgZnJvbSBcIi4vZm9ybWF0TnVtZXJhbHMuanNcIjtcbmltcG9ydCBmb3JtYXRTcGVjaWZpZXIgZnJvbSBcIi4vZm9ybWF0U3BlY2lmaWVyLmpzXCI7XG5pbXBvcnQgZm9ybWF0VHJpbSBmcm9tIFwiLi9mb3JtYXRUcmltLmpzXCI7XG5pbXBvcnQgZm9ybWF0VHlwZXMgZnJvbSBcIi4vZm9ybWF0VHlwZXMuanNcIjtcbmltcG9ydCB7cHJlZml4RXhwb25lbnR9IGZyb20gXCIuL2Zvcm1hdFByZWZpeEF1dG8uanNcIjtcbmltcG9ydCBpZGVudGl0eSBmcm9tIFwiLi9pZGVudGl0eS5qc1wiO1xuXG52YXIgbWFwID0gQXJyYXkucHJvdG90eXBlLm1hcCxcbiAgICBwcmVmaXhlcyA9IFtcInlcIixcInpcIixcImFcIixcImZcIixcInBcIixcIm5cIixcIsK1XCIsXCJtXCIsXCJcIixcImtcIixcIk1cIixcIkdcIixcIlRcIixcIlBcIixcIkVcIixcIlpcIixcIllcIl07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGxvY2FsZSkge1xuICB2YXIgZ3JvdXAgPSBsb2NhbGUuZ3JvdXBpbmcgPT09IHVuZGVmaW5lZCB8fCBsb2NhbGUudGhvdXNhbmRzID09PSB1bmRlZmluZWQgPyBpZGVudGl0eSA6IGZvcm1hdEdyb3VwKG1hcC5jYWxsKGxvY2FsZS5ncm91cGluZywgTnVtYmVyKSwgbG9jYWxlLnRob3VzYW5kcyArIFwiXCIpLFxuICAgICAgY3VycmVuY3lQcmVmaXggPSBsb2NhbGUuY3VycmVuY3kgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBsb2NhbGUuY3VycmVuY3lbMF0gKyBcIlwiLFxuICAgICAgY3VycmVuY3lTdWZmaXggPSBsb2NhbGUuY3VycmVuY3kgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBsb2NhbGUuY3VycmVuY3lbMV0gKyBcIlwiLFxuICAgICAgZGVjaW1hbCA9IGxvY2FsZS5kZWNpbWFsID09PSB1bmRlZmluZWQgPyBcIi5cIiA6IGxvY2FsZS5kZWNpbWFsICsgXCJcIixcbiAgICAgIG51bWVyYWxzID0gbG9jYWxlLm51bWVyYWxzID09PSB1bmRlZmluZWQgPyBpZGVudGl0eSA6IGZvcm1hdE51bWVyYWxzKG1hcC5jYWxsKGxvY2FsZS5udW1lcmFscywgU3RyaW5nKSksXG4gICAgICBwZXJjZW50ID0gbG9jYWxlLnBlcmNlbnQgPT09IHVuZGVmaW5lZCA/IFwiJVwiIDogbG9jYWxlLnBlcmNlbnQgKyBcIlwiLFxuICAgICAgbWludXMgPSBsb2NhbGUubWludXMgPT09IHVuZGVmaW5lZCA/IFwi4oiSXCIgOiBsb2NhbGUubWludXMgKyBcIlwiLFxuICAgICAgbmFuID0gbG9jYWxlLm5hbiA9PT0gdW5kZWZpbmVkID8gXCJOYU5cIiA6IGxvY2FsZS5uYW4gKyBcIlwiO1xuXG4gIGZ1bmN0aW9uIG5ld0Zvcm1hdChzcGVjaWZpZXIpIHtcbiAgICBzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKTtcblxuICAgIHZhciBmaWxsID0gc3BlY2lmaWVyLmZpbGwsXG4gICAgICAgIGFsaWduID0gc3BlY2lmaWVyLmFsaWduLFxuICAgICAgICBzaWduID0gc3BlY2lmaWVyLnNpZ24sXG4gICAgICAgIHN5bWJvbCA9IHNwZWNpZmllci5zeW1ib2wsXG4gICAgICAgIHplcm8gPSBzcGVjaWZpZXIuemVybyxcbiAgICAgICAgd2lkdGggPSBzcGVjaWZpZXIud2lkdGgsXG4gICAgICAgIGNvbW1hID0gc3BlY2lmaWVyLmNvbW1hLFxuICAgICAgICBwcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uLFxuICAgICAgICB0cmltID0gc3BlY2lmaWVyLnRyaW0sXG4gICAgICAgIHR5cGUgPSBzcGVjaWZpZXIudHlwZTtcblxuICAgIC8vIFRoZSBcIm5cIiB0eXBlIGlzIGFuIGFsaWFzIGZvciBcIixnXCIuXG4gICAgaWYgKHR5cGUgPT09IFwiblwiKSBjb21tYSA9IHRydWUsIHR5cGUgPSBcImdcIjtcblxuICAgIC8vIFRoZSBcIlwiIHR5cGUsIGFuZCBhbnkgaW52YWxpZCB0eXBlLCBpcyBhbiBhbGlhcyBmb3IgXCIuMTJ+Z1wiLlxuICAgIGVsc2UgaWYgKCFmb3JtYXRUeXBlc1t0eXBlXSkgcHJlY2lzaW9uID09PSB1bmRlZmluZWQgJiYgKHByZWNpc2lvbiA9IDEyKSwgdHJpbSA9IHRydWUsIHR5cGUgPSBcImdcIjtcblxuICAgIC8vIElmIHplcm8gZmlsbCBpcyBzcGVjaWZpZWQsIHBhZGRpbmcgZ29lcyBhZnRlciBzaWduIGFuZCBiZWZvcmUgZGlnaXRzLlxuICAgIGlmICh6ZXJvIHx8IChmaWxsID09PSBcIjBcIiAmJiBhbGlnbiA9PT0gXCI9XCIpKSB6ZXJvID0gdHJ1ZSwgZmlsbCA9IFwiMFwiLCBhbGlnbiA9IFwiPVwiO1xuXG4gICAgLy8gQ29tcHV0ZSB0aGUgcHJlZml4IGFuZCBzdWZmaXguXG4gICAgLy8gRm9yIFNJLXByZWZpeCwgdGhlIHN1ZmZpeCBpcyBsYXppbHkgY29tcHV0ZWQuXG4gICAgdmFyIHByZWZpeCA9IHN5bWJvbCA9PT0gXCIkXCIgPyBjdXJyZW5jeVByZWZpeCA6IHN5bWJvbCA9PT0gXCIjXCIgJiYgL1tib3hYXS8udGVzdCh0eXBlKSA/IFwiMFwiICsgdHlwZS50b0xvd2VyQ2FzZSgpIDogXCJcIixcbiAgICAgICAgc3VmZml4ID0gc3ltYm9sID09PSBcIiRcIiA/IGN1cnJlbmN5U3VmZml4IDogL1slcF0vLnRlc3QodHlwZSkgPyBwZXJjZW50IDogXCJcIjtcblxuICAgIC8vIFdoYXQgZm9ybWF0IGZ1bmN0aW9uIHNob3VsZCB3ZSB1c2U/XG4gICAgLy8gSXMgdGhpcyBhbiBpbnRlZ2VyIHR5cGU/XG4gICAgLy8gQ2FuIHRoaXMgdHlwZSBnZW5lcmF0ZSBleHBvbmVudGlhbCBub3RhdGlvbj9cbiAgICB2YXIgZm9ybWF0VHlwZSA9IGZvcm1hdFR5cGVzW3R5cGVdLFxuICAgICAgICBtYXliZVN1ZmZpeCA9IC9bZGVmZ3BycyVdLy50ZXN0KHR5cGUpO1xuXG4gICAgLy8gU2V0IHRoZSBkZWZhdWx0IHByZWNpc2lvbiBpZiBub3Qgc3BlY2lmaWVkLFxuICAgIC8vIG9yIGNsYW1wIHRoZSBzcGVjaWZpZWQgcHJlY2lzaW9uIHRvIHRoZSBzdXBwb3J0ZWQgcmFuZ2UuXG4gICAgLy8gRm9yIHNpZ25pZmljYW50IHByZWNpc2lvbiwgaXQgbXVzdCBiZSBpbiBbMSwgMjFdLlxuICAgIC8vIEZvciBmaXhlZCBwcmVjaXNpb24sIGl0IG11c3QgYmUgaW4gWzAsIDIwXS5cbiAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IDZcbiAgICAgICAgOiAvW2dwcnNdLy50ZXN0KHR5cGUpID8gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjEsIHByZWNpc2lvbikpXG4gICAgICAgIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMjAsIHByZWNpc2lvbikpO1xuXG4gICAgZnVuY3Rpb24gZm9ybWF0KHZhbHVlKSB7XG4gICAgICB2YXIgdmFsdWVQcmVmaXggPSBwcmVmaXgsXG4gICAgICAgICAgdmFsdWVTdWZmaXggPSBzdWZmaXgsXG4gICAgICAgICAgaSwgbiwgYztcblxuICAgICAgaWYgKHR5cGUgPT09IFwiY1wiKSB7XG4gICAgICAgIHZhbHVlU3VmZml4ID0gZm9ybWF0VHlwZSh2YWx1ZSkgKyB2YWx1ZVN1ZmZpeDtcbiAgICAgICAgdmFsdWUgPSBcIlwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSArdmFsdWU7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBzaWduLiAtMCBpcyBub3QgbGVzcyB0aGFuIDAsIGJ1dCAxIC8gLTAgaXMhXG4gICAgICAgIHZhciB2YWx1ZU5lZ2F0aXZlID0gdmFsdWUgPCAwIHx8IDEgLyB2YWx1ZSA8IDA7XG5cbiAgICAgICAgLy8gUGVyZm9ybSB0aGUgaW5pdGlhbCBmb3JtYXR0aW5nLlxuICAgICAgICB2YWx1ZSA9IGlzTmFOKHZhbHVlKSA/IG5hbiA6IGZvcm1hdFR5cGUoTWF0aC5hYnModmFsdWUpLCBwcmVjaXNpb24pO1xuXG4gICAgICAgIC8vIFRyaW0gaW5zaWduaWZpY2FudCB6ZXJvcy5cbiAgICAgICAgaWYgKHRyaW0pIHZhbHVlID0gZm9ybWF0VHJpbSh2YWx1ZSk7XG5cbiAgICAgICAgLy8gSWYgYSBuZWdhdGl2ZSB2YWx1ZSByb3VuZHMgdG8gemVybyBhZnRlciBmb3JtYXR0aW5nLCBhbmQgbm8gZXhwbGljaXQgcG9zaXRpdmUgc2lnbiBpcyByZXF1ZXN0ZWQsIGhpZGUgdGhlIHNpZ24uXG4gICAgICAgIGlmICh2YWx1ZU5lZ2F0aXZlICYmICt2YWx1ZSA9PT0gMCAmJiBzaWduICE9PSBcIitcIikgdmFsdWVOZWdhdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LlxuICAgICAgICB2YWx1ZVByZWZpeCA9ICh2YWx1ZU5lZ2F0aXZlID8gKHNpZ24gPT09IFwiKFwiID8gc2lnbiA6IG1pbnVzKSA6IHNpZ24gPT09IFwiLVwiIHx8IHNpZ24gPT09IFwiKFwiID8gXCJcIiA6IHNpZ24pICsgdmFsdWVQcmVmaXg7XG4gICAgICAgIHZhbHVlU3VmZml4ID0gKHR5cGUgPT09IFwic1wiID8gcHJlZml4ZXNbOCArIHByZWZpeEV4cG9uZW50IC8gM10gOiBcIlwiKSArIHZhbHVlU3VmZml4ICsgKHZhbHVlTmVnYXRpdmUgJiYgc2lnbiA9PT0gXCIoXCIgPyBcIilcIiA6IFwiXCIpO1xuXG4gICAgICAgIC8vIEJyZWFrIHRoZSBmb3JtYXR0ZWQgdmFsdWUgaW50byB0aGUgaW50ZWdlciDigJx2YWx1ZeKAnSBwYXJ0IHRoYXQgY2FuIGJlXG4gICAgICAgIC8vIGdyb3VwZWQsIGFuZCBmcmFjdGlvbmFsIG9yIGV4cG9uZW50aWFsIOKAnHN1ZmZpeOKAnSBwYXJ0IHRoYXQgaXMgbm90LlxuICAgICAgICBpZiAobWF5YmVTdWZmaXgpIHtcbiAgICAgICAgICBpID0gLTEsIG4gPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgICAgIGlmIChjID0gdmFsdWUuY2hhckNvZGVBdChpKSwgNDggPiBjIHx8IGMgPiA1Nykge1xuICAgICAgICAgICAgICB2YWx1ZVN1ZmZpeCA9IChjID09PSA0NiA/IGRlY2ltYWwgKyB2YWx1ZS5zbGljZShpICsgMSkgOiB2YWx1ZS5zbGljZShpKSkgKyB2YWx1ZVN1ZmZpeDtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBmaWxsIGNoYXJhY3RlciBpcyBub3QgXCIwXCIsIGdyb3VwaW5nIGlzIGFwcGxpZWQgYmVmb3JlIHBhZGRpbmcuXG4gICAgICBpZiAoY29tbWEgJiYgIXplcm8pIHZhbHVlID0gZ3JvdXAodmFsdWUsIEluZmluaXR5KTtcblxuICAgICAgLy8gQ29tcHV0ZSB0aGUgcGFkZGluZy5cbiAgICAgIHZhciBsZW5ndGggPSB2YWx1ZVByZWZpeC5sZW5ndGggKyB2YWx1ZS5sZW5ndGggKyB2YWx1ZVN1ZmZpeC5sZW5ndGgsXG4gICAgICAgICAgcGFkZGluZyA9IGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSA6IFwiXCI7XG5cbiAgICAgIC8vIElmIHRoZSBmaWxsIGNoYXJhY3RlciBpcyBcIjBcIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBhZnRlciBwYWRkaW5nLlxuICAgICAgaWYgKGNvbW1hICYmIHplcm8pIHZhbHVlID0gZ3JvdXAocGFkZGluZyArIHZhbHVlLCBwYWRkaW5nLmxlbmd0aCA/IHdpZHRoIC0gdmFsdWVTdWZmaXgubGVuZ3RoIDogSW5maW5pdHkpLCBwYWRkaW5nID0gXCJcIjtcblxuICAgICAgLy8gUmVjb25zdHJ1Y3QgdGhlIGZpbmFsIG91dHB1dCBiYXNlZCBvbiB0aGUgZGVzaXJlZCBhbGlnbm1lbnQuXG4gICAgICBzd2l0Y2ggKGFsaWduKSB7XG4gICAgICAgIGNhc2UgXCI8XCI6IHZhbHVlID0gdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZzsgYnJlYWs7XG4gICAgICAgIGNhc2UgXCI9XCI6IHZhbHVlID0gdmFsdWVQcmVmaXggKyBwYWRkaW5nICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJeXCI6IHZhbHVlID0gcGFkZGluZy5zbGljZSgwLCBsZW5ndGggPSBwYWRkaW5nLmxlbmd0aCA+PiAxKSArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmcuc2xpY2UobGVuZ3RoKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IHZhbHVlID0gcGFkZGluZyArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudW1lcmFscyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgZm9ybWF0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc3BlY2lmaWVyICsgXCJcIjtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFByZWZpeChzcGVjaWZpZXIsIHZhbHVlKSB7XG4gICAgdmFyIGYgPSBuZXdGb3JtYXQoKHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpLCBzcGVjaWZpZXIudHlwZSA9IFwiZlwiLCBzcGVjaWZpZXIpKSxcbiAgICAgICAgZSA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50KHZhbHVlKSAvIDMpKSkgKiAzLFxuICAgICAgICBrID0gTWF0aC5wb3coMTAsIC1lKSxcbiAgICAgICAgcHJlZml4ID0gcHJlZml4ZXNbOCArIGUgLyAzXTtcbiAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBmKGsgKiB2YWx1ZSkgKyBwcmVmaXg7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZm9ybWF0OiBuZXdGb3JtYXQsXG4gICAgZm9ybWF0UHJlZml4OiBmb3JtYXRQcmVmaXhcbiAgfTtcbn1cbiIsImltcG9ydCB7YXNpbiwgYXRhbjIsIGNvcywgc2luLCBzcXJ0fSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGhlcmljYWwoY2FydGVzaWFuKSB7XG4gIHJldHVybiBbYXRhbjIoY2FydGVzaWFuWzFdLCBjYXJ0ZXNpYW5bMF0pLCBhc2luKGNhcnRlc2lhblsyXSldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FydGVzaWFuKHNwaGVyaWNhbCkge1xuICB2YXIgbGFtYmRhID0gc3BoZXJpY2FsWzBdLCBwaGkgPSBzcGhlcmljYWxbMV0sIGNvc1BoaSA9IGNvcyhwaGkpO1xuICByZXR1cm4gW2Nvc1BoaSAqIGNvcyhsYW1iZGEpLCBjb3NQaGkgKiBzaW4obGFtYmRhKSwgc2luKHBoaSldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FydGVzaWFuRG90KGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhcnRlc2lhbkNyb3NzKGEsIGIpIHtcbiAgcmV0dXJuIFthWzFdICogYlsyXSAtIGFbMl0gKiBiWzFdLCBhWzJdICogYlswXSAtIGFbMF0gKiBiWzJdLCBhWzBdICogYlsxXSAtIGFbMV0gKiBiWzBdXTtcbn1cblxuLy8gVE9ETyByZXR1cm4gYVxuZXhwb3J0IGZ1bmN0aW9uIGNhcnRlc2lhbkFkZEluUGxhY2UoYSwgYikge1xuICBhWzBdICs9IGJbMF0sIGFbMV0gKz0gYlsxXSwgYVsyXSArPSBiWzJdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FydGVzaWFuU2NhbGUodmVjdG9yLCBrKSB7XG4gIHJldHVybiBbdmVjdG9yWzBdICogaywgdmVjdG9yWzFdICogaywgdmVjdG9yWzJdICoga107XG59XG5cbi8vIFRPRE8gcmV0dXJuIGRcbmV4cG9ydCBmdW5jdGlvbiBjYXJ0ZXNpYW5Ob3JtYWxpemVJblBsYWNlKGQpIHtcbiAgdmFyIGwgPSBzcXJ0KGRbMF0gKiBkWzBdICsgZFsxXSAqIGRbMV0gKyBkWzJdICogZFsyXSk7XG4gIGRbMF0gLz0gbCwgZFsxXSAvPSBsLCBkWzJdIC89IGw7XG59XG4iLCJpbXBvcnQge2NhcnRlc2lhbiwgY2FydGVzaWFuTm9ybWFsaXplSW5QbGFjZSwgc3BoZXJpY2FsfSBmcm9tIFwiLi9jYXJ0ZXNpYW4uanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IHthY29zLCBjb3MsIGRlZ3JlZXMsIGVwc2lsb24sIHJhZGlhbnMsIHNpbiwgdGF1fSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5pbXBvcnQge3JvdGF0ZVJhZGlhbnN9IGZyb20gXCIuL3JvdGF0aW9uLmpzXCI7XG5cbi8vIEdlbmVyYXRlcyBhIGNpcmNsZSBjZW50ZXJlZCBhdCBbMMKwLCAwwrBdLCB3aXRoIGEgZ2l2ZW4gcmFkaXVzIGFuZCBwcmVjaXNpb24uXG5leHBvcnQgZnVuY3Rpb24gY2lyY2xlU3RyZWFtKHN0cmVhbSwgcmFkaXVzLCBkZWx0YSwgZGlyZWN0aW9uLCB0MCwgdDEpIHtcbiAgaWYgKCFkZWx0YSkgcmV0dXJuO1xuICB2YXIgY29zUmFkaXVzID0gY29zKHJhZGl1cyksXG4gICAgICBzaW5SYWRpdXMgPSBzaW4ocmFkaXVzKSxcbiAgICAgIHN0ZXAgPSBkaXJlY3Rpb24gKiBkZWx0YTtcbiAgaWYgKHQwID09IG51bGwpIHtcbiAgICB0MCA9IHJhZGl1cyArIGRpcmVjdGlvbiAqIHRhdTtcbiAgICB0MSA9IHJhZGl1cyAtIHN0ZXAgLyAyO1xuICB9IGVsc2Uge1xuICAgIHQwID0gY2lyY2xlUmFkaXVzKGNvc1JhZGl1cywgdDApO1xuICAgIHQxID0gY2lyY2xlUmFkaXVzKGNvc1JhZGl1cywgdDEpO1xuICAgIGlmIChkaXJlY3Rpb24gPiAwID8gdDAgPCB0MSA6IHQwID4gdDEpIHQwICs9IGRpcmVjdGlvbiAqIHRhdTtcbiAgfVxuICBmb3IgKHZhciBwb2ludCwgdCA9IHQwOyBkaXJlY3Rpb24gPiAwID8gdCA+IHQxIDogdCA8IHQxOyB0IC09IHN0ZXApIHtcbiAgICBwb2ludCA9IHNwaGVyaWNhbChbY29zUmFkaXVzLCAtc2luUmFkaXVzICogY29zKHQpLCAtc2luUmFkaXVzICogc2luKHQpXSk7XG4gICAgc3RyZWFtLnBvaW50KHBvaW50WzBdLCBwb2ludFsxXSk7XG4gIH1cbn1cblxuLy8gUmV0dXJucyB0aGUgc2lnbmVkIGFuZ2xlIG9mIGEgY2FydGVzaWFuIHBvaW50IHJlbGF0aXZlIHRvIFtjb3NSYWRpdXMsIDAsIDBdLlxuZnVuY3Rpb24gY2lyY2xlUmFkaXVzKGNvc1JhZGl1cywgcG9pbnQpIHtcbiAgcG9pbnQgPSBjYXJ0ZXNpYW4ocG9pbnQpLCBwb2ludFswXSAtPSBjb3NSYWRpdXM7XG4gIGNhcnRlc2lhbk5vcm1hbGl6ZUluUGxhY2UocG9pbnQpO1xuICB2YXIgcmFkaXVzID0gYWNvcygtcG9pbnRbMV0pO1xuICByZXR1cm4gKCgtcG9pbnRbMl0gPCAwID8gLXJhZGl1cyA6IHJhZGl1cykgKyB0YXUgLSBlcHNpbG9uKSAlIHRhdTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBjZW50ZXIgPSBjb25zdGFudChbMCwgMF0pLFxuICAgICAgcmFkaXVzID0gY29uc3RhbnQoOTApLFxuICAgICAgcHJlY2lzaW9uID0gY29uc3RhbnQoNiksXG4gICAgICByaW5nLFxuICAgICAgcm90YXRlLFxuICAgICAgc3RyZWFtID0ge3BvaW50OiBwb2ludH07XG5cbiAgZnVuY3Rpb24gcG9pbnQoeCwgeSkge1xuICAgIHJpbmcucHVzaCh4ID0gcm90YXRlKHgsIHkpKTtcbiAgICB4WzBdICo9IGRlZ3JlZXMsIHhbMV0gKj0gZGVncmVlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNpcmNsZSgpIHtcbiAgICB2YXIgYyA9IGNlbnRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICByID0gcmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKiByYWRpYW5zLFxuICAgICAgICBwID0gcHJlY2lzaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKiByYWRpYW5zO1xuICAgIHJpbmcgPSBbXTtcbiAgICByb3RhdGUgPSByb3RhdGVSYWRpYW5zKC1jWzBdICogcmFkaWFucywgLWNbMV0gKiByYWRpYW5zLCAwKS5pbnZlcnQ7XG4gICAgY2lyY2xlU3RyZWFtKHN0cmVhbSwgciwgcCwgMSk7XG4gICAgYyA9IHt0eXBlOiBcIlBvbHlnb25cIiwgY29vcmRpbmF0ZXM6IFtyaW5nXX07XG4gICAgcmluZyA9IHJvdGF0ZSA9IG51bGw7XG4gICAgcmV0dXJuIGM7XG4gIH1cblxuICBjaXJjbGUuY2VudGVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNlbnRlciA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoWytfWzBdLCArX1sxXV0pLCBjaXJjbGUpIDogY2VudGVyO1xuICB9O1xuXG4gIGNpcmNsZS5yYWRpdXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFkaXVzID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGNpcmNsZSkgOiByYWRpdXM7XG4gIH07XG5cbiAgY2lyY2xlLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwcmVjaXNpb24gPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgY2lyY2xlKSA6IHByZWNpc2lvbjtcbiAgfTtcblxuICByZXR1cm4gY2lyY2xlO1xufVxuIiwiaW1wb3J0IGNsaXAgZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCB7YWJzLCBhdGFuLCBjb3MsIGVwc2lsb24sIGhhbGZQaSwgcGksIHNpbn0gZnJvbSBcIi4uL21hdGguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xpcChcbiAgZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9LFxuICBjbGlwQW50aW1lcmlkaWFuTGluZSxcbiAgY2xpcEFudGltZXJpZGlhbkludGVycG9sYXRlLFxuICBbLXBpLCAtaGFsZlBpXVxuKTtcblxuLy8gVGFrZXMgYSBsaW5lIGFuZCBjdXRzIGludG8gdmlzaWJsZSBzZWdtZW50cy4gUmV0dXJuIHZhbHVlczogMCAtIHRoZXJlIHdlcmVcbi8vIGludGVyc2VjdGlvbnMgb3IgdGhlIGxpbmUgd2FzIGVtcHR5OyAxIC0gbm8gaW50ZXJzZWN0aW9uczsgMiAtIHRoZXJlIHdlcmVcbi8vIGludGVyc2VjdGlvbnMsIGFuZCB0aGUgZmlyc3QgYW5kIGxhc3Qgc2VnbWVudHMgc2hvdWxkIGJlIHJlam9pbmVkLlxuZnVuY3Rpb24gY2xpcEFudGltZXJpZGlhbkxpbmUoc3RyZWFtKSB7XG4gIHZhciBsYW1iZGEwID0gTmFOLFxuICAgICAgcGhpMCA9IE5hTixcbiAgICAgIHNpZ24wID0gTmFOLFxuICAgICAgY2xlYW47IC8vIG5vIGludGVyc2VjdGlvbnNcblxuICByZXR1cm4ge1xuICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICBjbGVhbiA9IDE7XG4gICAgfSxcbiAgICBwb2ludDogZnVuY3Rpb24obGFtYmRhMSwgcGhpMSkge1xuICAgICAgdmFyIHNpZ24xID0gbGFtYmRhMSA+IDAgPyBwaSA6IC1waSxcbiAgICAgICAgICBkZWx0YSA9IGFicyhsYW1iZGExIC0gbGFtYmRhMCk7XG4gICAgICBpZiAoYWJzKGRlbHRhIC0gcGkpIDwgZXBzaWxvbikgeyAvLyBsaW5lIGNyb3NzZXMgYSBwb2xlXG4gICAgICAgIHN0cmVhbS5wb2ludChsYW1iZGEwLCBwaGkwID0gKHBoaTAgKyBwaGkxKSAvIDIgPiAwID8gaGFsZlBpIDogLWhhbGZQaSk7XG4gICAgICAgIHN0cmVhbS5wb2ludChzaWduMCwgcGhpMCk7XG4gICAgICAgIHN0cmVhbS5saW5lRW5kKCk7XG4gICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgICAgc3RyZWFtLnBvaW50KHNpZ24xLCBwaGkwKTtcbiAgICAgICAgc3RyZWFtLnBvaW50KGxhbWJkYTEsIHBoaTApO1xuICAgICAgICBjbGVhbiA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHNpZ24wICE9PSBzaWduMSAmJiBkZWx0YSA+PSBwaSkgeyAvLyBsaW5lIGNyb3NzZXMgYW50aW1lcmlkaWFuXG4gICAgICAgIGlmIChhYnMobGFtYmRhMCAtIHNpZ24wKSA8IGVwc2lsb24pIGxhbWJkYTAgLT0gc2lnbjAgKiBlcHNpbG9uOyAvLyBoYW5kbGUgZGVnZW5lcmFjaWVzXG4gICAgICAgIGlmIChhYnMobGFtYmRhMSAtIHNpZ24xKSA8IGVwc2lsb24pIGxhbWJkYTEgLT0gc2lnbjEgKiBlcHNpbG9uO1xuICAgICAgICBwaGkwID0gY2xpcEFudGltZXJpZGlhbkludGVyc2VjdChsYW1iZGEwLCBwaGkwLCBsYW1iZGExLCBwaGkxKTtcbiAgICAgICAgc3RyZWFtLnBvaW50KHNpZ24wLCBwaGkwKTtcbiAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICBzdHJlYW0ucG9pbnQoc2lnbjEsIHBoaTApO1xuICAgICAgICBjbGVhbiA9IDA7XG4gICAgICB9XG4gICAgICBzdHJlYW0ucG9pbnQobGFtYmRhMCA9IGxhbWJkYTEsIHBoaTAgPSBwaGkxKTtcbiAgICAgIHNpZ24wID0gc2lnbjE7XG4gICAgfSxcbiAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICAgIHN0cmVhbS5saW5lRW5kKCk7XG4gICAgICBsYW1iZGEwID0gcGhpMCA9IE5hTjtcbiAgICB9LFxuICAgIGNsZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAyIC0gY2xlYW47IC8vIGlmIGludGVyc2VjdGlvbnMsIHJlam9pbiBmaXJzdCBhbmQgbGFzdCBzZWdtZW50c1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xpcEFudGltZXJpZGlhbkludGVyc2VjdChsYW1iZGEwLCBwaGkwLCBsYW1iZGExLCBwaGkxKSB7XG4gIHZhciBjb3NQaGkwLFxuICAgICAgY29zUGhpMSxcbiAgICAgIHNpbkxhbWJkYTBMYW1iZGExID0gc2luKGxhbWJkYTAgLSBsYW1iZGExKTtcbiAgcmV0dXJuIGFicyhzaW5MYW1iZGEwTGFtYmRhMSkgPiBlcHNpbG9uXG4gICAgICA/IGF0YW4oKHNpbihwaGkwKSAqIChjb3NQaGkxID0gY29zKHBoaTEpKSAqIHNpbihsYW1iZGExKVxuICAgICAgICAgIC0gc2luKHBoaTEpICogKGNvc1BoaTAgPSBjb3MocGhpMCkpICogc2luKGxhbWJkYTApKVxuICAgICAgICAgIC8gKGNvc1BoaTAgKiBjb3NQaGkxICogc2luTGFtYmRhMExhbWJkYTEpKVxuICAgICAgOiAocGhpMCArIHBoaTEpIC8gMjtcbn1cblxuZnVuY3Rpb24gY2xpcEFudGltZXJpZGlhbkludGVycG9sYXRlKGZyb20sIHRvLCBkaXJlY3Rpb24sIHN0cmVhbSkge1xuICB2YXIgcGhpO1xuICBpZiAoZnJvbSA9PSBudWxsKSB7XG4gICAgcGhpID0gZGlyZWN0aW9uICogaGFsZlBpO1xuICAgIHN0cmVhbS5wb2ludCgtcGksIHBoaSk7XG4gICAgc3RyZWFtLnBvaW50KDAsIHBoaSk7XG4gICAgc3RyZWFtLnBvaW50KHBpLCBwaGkpO1xuICAgIHN0cmVhbS5wb2ludChwaSwgMCk7XG4gICAgc3RyZWFtLnBvaW50KHBpLCAtcGhpKTtcbiAgICBzdHJlYW0ucG9pbnQoMCwgLXBoaSk7XG4gICAgc3RyZWFtLnBvaW50KC1waSwgLXBoaSk7XG4gICAgc3RyZWFtLnBvaW50KC1waSwgMCk7XG4gICAgc3RyZWFtLnBvaW50KC1waSwgcGhpKTtcbiAgfSBlbHNlIGlmIChhYnMoZnJvbVswXSAtIHRvWzBdKSA+IGVwc2lsb24pIHtcbiAgICB2YXIgbGFtYmRhID0gZnJvbVswXSA8IHRvWzBdID8gcGkgOiAtcGk7XG4gICAgcGhpID0gZGlyZWN0aW9uICogbGFtYmRhIC8gMjtcbiAgICBzdHJlYW0ucG9pbnQoLWxhbWJkYSwgcGhpKTtcbiAgICBzdHJlYW0ucG9pbnQoMCwgcGhpKTtcbiAgICBzdHJlYW0ucG9pbnQobGFtYmRhLCBwaGkpO1xuICB9IGVsc2Uge1xuICAgIHN0cmVhbS5wb2ludCh0b1swXSwgdG9bMV0pO1xuICB9XG59XG4iLCJpbXBvcnQgbm9vcCBmcm9tIFwiLi4vbm9vcC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGxpbmVzID0gW10sXG4gICAgICBsaW5lO1xuICByZXR1cm4ge1xuICAgIHBvaW50OiBmdW5jdGlvbih4LCB5LCBtKSB7XG4gICAgICBsaW5lLnB1c2goW3gsIHksIG1dKTtcbiAgICB9LFxuICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICBsaW5lcy5wdXNoKGxpbmUgPSBbXSk7XG4gICAgfSxcbiAgICBsaW5lRW5kOiBub29wLFxuICAgIHJlam9pbjogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAobGluZXMubGVuZ3RoID4gMSkgbGluZXMucHVzaChsaW5lcy5wb3AoKS5jb25jYXQobGluZXMuc2hpZnQoKSkpO1xuICAgIH0sXG4gICAgcmVzdWx0OiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZXN1bHQgPSBsaW5lcztcbiAgICAgIGxpbmVzID0gW107XG4gICAgICBsaW5lID0gbnVsbDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9O1xufVxuIiwiaW1wb3J0IHtjYXJ0ZXNpYW4sIGNhcnRlc2lhbkFkZEluUGxhY2UsIGNhcnRlc2lhbkNyb3NzLCBjYXJ0ZXNpYW5Eb3QsIGNhcnRlc2lhblNjYWxlLCBzcGhlcmljYWx9IGZyb20gXCIuLi9jYXJ0ZXNpYW4uanNcIjtcbmltcG9ydCB7Y2lyY2xlU3RyZWFtfSBmcm9tIFwiLi4vY2lyY2xlLmpzXCI7XG5pbXBvcnQge2FicywgY29zLCBlcHNpbG9uLCBwaSwgcmFkaWFucywgc3FydH0gZnJvbSBcIi4uL21hdGguanNcIjtcbmltcG9ydCBwb2ludEVxdWFsIGZyb20gXCIuLi9wb2ludEVxdWFsLmpzXCI7XG5pbXBvcnQgY2xpcCBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihyYWRpdXMpIHtcbiAgdmFyIGNyID0gY29zKHJhZGl1cyksXG4gICAgICBkZWx0YSA9IDYgKiByYWRpYW5zLFxuICAgICAgc21hbGxSYWRpdXMgPSBjciA+IDAsXG4gICAgICBub3RIZW1pc3BoZXJlID0gYWJzKGNyKSA+IGVwc2lsb247IC8vIFRPRE8gb3B0aW1pc2UgZm9yIHRoaXMgY29tbW9uIGNhc2VcblxuICBmdW5jdGlvbiBpbnRlcnBvbGF0ZShmcm9tLCB0bywgZGlyZWN0aW9uLCBzdHJlYW0pIHtcbiAgICBjaXJjbGVTdHJlYW0oc3RyZWFtLCByYWRpdXMsIGRlbHRhLCBkaXJlY3Rpb24sIGZyb20sIHRvKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHZpc2libGUobGFtYmRhLCBwaGkpIHtcbiAgICByZXR1cm4gY29zKGxhbWJkYSkgKiBjb3MocGhpKSA+IGNyO1xuICB9XG5cbiAgLy8gVGFrZXMgYSBsaW5lIGFuZCBjdXRzIGludG8gdmlzaWJsZSBzZWdtZW50cy4gUmV0dXJuIHZhbHVlcyB1c2VkIGZvciBwb2x5Z29uXG4gIC8vIGNsaXBwaW5nOiAwIC0gdGhlcmUgd2VyZSBpbnRlcnNlY3Rpb25zIG9yIHRoZSBsaW5lIHdhcyBlbXB0eTsgMSAtIG5vXG4gIC8vIGludGVyc2VjdGlvbnMgMiAtIHRoZXJlIHdlcmUgaW50ZXJzZWN0aW9ucywgYW5kIHRoZSBmaXJzdCBhbmQgbGFzdCBzZWdtZW50c1xuICAvLyBzaG91bGQgYmUgcmVqb2luZWQuXG4gIGZ1bmN0aW9uIGNsaXBMaW5lKHN0cmVhbSkge1xuICAgIHZhciBwb2ludDAsIC8vIHByZXZpb3VzIHBvaW50XG4gICAgICAgIGMwLCAvLyBjb2RlIGZvciBwcmV2aW91cyBwb2ludFxuICAgICAgICB2MCwgLy8gdmlzaWJpbGl0eSBvZiBwcmV2aW91cyBwb2ludFxuICAgICAgICB2MDAsIC8vIHZpc2liaWxpdHkgb2YgZmlyc3QgcG9pbnRcbiAgICAgICAgY2xlYW47IC8vIG5vIGludGVyc2VjdGlvbnNcbiAgICByZXR1cm4ge1xuICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdjAwID0gdjAgPSBmYWxzZTtcbiAgICAgICAgY2xlYW4gPSAxO1xuICAgICAgfSxcbiAgICAgIHBvaW50OiBmdW5jdGlvbihsYW1iZGEsIHBoaSkge1xuICAgICAgICB2YXIgcG9pbnQxID0gW2xhbWJkYSwgcGhpXSxcbiAgICAgICAgICAgIHBvaW50MixcbiAgICAgICAgICAgIHYgPSB2aXNpYmxlKGxhbWJkYSwgcGhpKSxcbiAgICAgICAgICAgIGMgPSBzbWFsbFJhZGl1c1xuICAgICAgICAgICAgICA/IHYgPyAwIDogY29kZShsYW1iZGEsIHBoaSlcbiAgICAgICAgICAgICAgOiB2ID8gY29kZShsYW1iZGEgKyAobGFtYmRhIDwgMCA/IHBpIDogLXBpKSwgcGhpKSA6IDA7XG4gICAgICAgIGlmICghcG9pbnQwICYmICh2MDAgPSB2MCA9IHYpKSBzdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICAgIGlmICh2ICE9PSB2MCkge1xuICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2ludDAsIHBvaW50MSk7XG4gICAgICAgICAgaWYgKCFwb2ludDIgfHwgcG9pbnRFcXVhbChwb2ludDAsIHBvaW50MikgfHwgcG9pbnRFcXVhbChwb2ludDEsIHBvaW50MikpXG4gICAgICAgICAgICBwb2ludDFbMl0gPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2ICE9PSB2MCkge1xuICAgICAgICAgIGNsZWFuID0gMDtcbiAgICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgLy8gb3V0c2lkZSBnb2luZyBpblxuICAgICAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICAgICAgcG9pbnQyID0gaW50ZXJzZWN0KHBvaW50MSwgcG9pbnQwKTtcbiAgICAgICAgICAgIHN0cmVhbS5wb2ludChwb2ludDJbMF0sIHBvaW50MlsxXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGluc2lkZSBnb2luZyBvdXRcbiAgICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2ludDAsIHBvaW50MSk7XG4gICAgICAgICAgICBzdHJlYW0ucG9pbnQocG9pbnQyWzBdLCBwb2ludDJbMV0sIDIpO1xuICAgICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9pbnQwID0gcG9pbnQyO1xuICAgICAgICB9IGVsc2UgaWYgKG5vdEhlbWlzcGhlcmUgJiYgcG9pbnQwICYmIHNtYWxsUmFkaXVzIF4gdikge1xuICAgICAgICAgIHZhciB0O1xuICAgICAgICAgIC8vIElmIHRoZSBjb2RlcyBmb3IgdHdvIHBvaW50cyBhcmUgZGlmZmVyZW50LCBvciBhcmUgYm90aCB6ZXJvLFxuICAgICAgICAgIC8vIGFuZCB0aGVyZSB0aGlzIHNlZ21lbnQgaW50ZXJzZWN0cyB3aXRoIHRoZSBzbWFsbCBjaXJjbGUuXG4gICAgICAgICAgaWYgKCEoYyAmIGMwKSAmJiAodCA9IGludGVyc2VjdChwb2ludDEsIHBvaW50MCwgdHJ1ZSkpKSB7XG4gICAgICAgICAgICBjbGVhbiA9IDA7XG4gICAgICAgICAgICBpZiAoc21hbGxSYWRpdXMpIHtcbiAgICAgICAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICAgICAgICBzdHJlYW0ucG9pbnQodFswXVswXSwgdFswXVsxXSk7XG4gICAgICAgICAgICAgIHN0cmVhbS5wb2ludCh0WzFdWzBdLCB0WzFdWzFdKTtcbiAgICAgICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0cmVhbS5wb2ludCh0WzFdWzBdLCB0WzFdWzFdKTtcbiAgICAgICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgICAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICAgICAgICBzdHJlYW0ucG9pbnQodFswXVswXSwgdFswXVsxXSwgMyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh2ICYmICghcG9pbnQwIHx8ICFwb2ludEVxdWFsKHBvaW50MCwgcG9pbnQxKSkpIHtcbiAgICAgICAgICBzdHJlYW0ucG9pbnQocG9pbnQxWzBdLCBwb2ludDFbMV0pO1xuICAgICAgICB9XG4gICAgICAgIHBvaW50MCA9IHBvaW50MSwgdjAgPSB2LCBjMCA9IGM7XG4gICAgICB9LFxuICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh2MCkgc3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgICAgcG9pbnQwID0gbnVsbDtcbiAgICAgIH0sXG4gICAgICAvLyBSZWpvaW4gZmlyc3QgYW5kIGxhc3Qgc2VnbWVudHMgaWYgdGhlcmUgd2VyZSBpbnRlcnNlY3Rpb25zIGFuZCB0aGUgZmlyc3RcbiAgICAgIC8vIGFuZCBsYXN0IHBvaW50cyB3ZXJlIHZpc2libGUuXG4gICAgICBjbGVhbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBjbGVhbiB8ICgodjAwICYmIHYwKSA8PCAxKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gSW50ZXJzZWN0cyB0aGUgZ3JlYXQgY2lyY2xlIGJldHdlZW4gYSBhbmQgYiB3aXRoIHRoZSBjbGlwIGNpcmNsZS5cbiAgZnVuY3Rpb24gaW50ZXJzZWN0KGEsIGIsIHR3bykge1xuICAgIHZhciBwYSA9IGNhcnRlc2lhbihhKSxcbiAgICAgICAgcGIgPSBjYXJ0ZXNpYW4oYik7XG5cbiAgICAvLyBXZSBoYXZlIHR3byBwbGFuZXMsIG4xLnAgPSBkMSBhbmQgbjIucCA9IGQyLlxuICAgIC8vIEZpbmQgaW50ZXJzZWN0aW9uIGxpbmUgcCh0KSA9IGMxIG4xICsgYzIgbjIgKyB0IChuMSDiqK8gbjIpLlxuICAgIHZhciBuMSA9IFsxLCAwLCAwXSwgLy8gbm9ybWFsXG4gICAgICAgIG4yID0gY2FydGVzaWFuQ3Jvc3MocGEsIHBiKSxcbiAgICAgICAgbjJuMiA9IGNhcnRlc2lhbkRvdChuMiwgbjIpLFxuICAgICAgICBuMW4yID0gbjJbMF0sIC8vIGNhcnRlc2lhbkRvdChuMSwgbjIpLFxuICAgICAgICBkZXRlcm1pbmFudCA9IG4ybjIgLSBuMW4yICogbjFuMjtcblxuICAgIC8vIFR3byBwb2xhciBwb2ludHMuXG4gICAgaWYgKCFkZXRlcm1pbmFudCkgcmV0dXJuICF0d28gJiYgYTtcblxuICAgIHZhciBjMSA9ICBjciAqIG4ybjIgLyBkZXRlcm1pbmFudCxcbiAgICAgICAgYzIgPSAtY3IgKiBuMW4yIC8gZGV0ZXJtaW5hbnQsXG4gICAgICAgIG4xeG4yID0gY2FydGVzaWFuQ3Jvc3MobjEsIG4yKSxcbiAgICAgICAgQSA9IGNhcnRlc2lhblNjYWxlKG4xLCBjMSksXG4gICAgICAgIEIgPSBjYXJ0ZXNpYW5TY2FsZShuMiwgYzIpO1xuICAgIGNhcnRlc2lhbkFkZEluUGxhY2UoQSwgQik7XG5cbiAgICAvLyBTb2x2ZSB8cCh0KXxeMiA9IDEuXG4gICAgdmFyIHUgPSBuMXhuMixcbiAgICAgICAgdyA9IGNhcnRlc2lhbkRvdChBLCB1KSxcbiAgICAgICAgdXUgPSBjYXJ0ZXNpYW5Eb3QodSwgdSksXG4gICAgICAgIHQyID0gdyAqIHcgLSB1dSAqIChjYXJ0ZXNpYW5Eb3QoQSwgQSkgLSAxKTtcblxuICAgIGlmICh0MiA8IDApIHJldHVybjtcblxuICAgIHZhciB0ID0gc3FydCh0MiksXG4gICAgICAgIHEgPSBjYXJ0ZXNpYW5TY2FsZSh1LCAoLXcgLSB0KSAvIHV1KTtcbiAgICBjYXJ0ZXNpYW5BZGRJblBsYWNlKHEsIEEpO1xuICAgIHEgPSBzcGhlcmljYWwocSk7XG5cbiAgICBpZiAoIXR3bykgcmV0dXJuIHE7XG5cbiAgICAvLyBUd28gaW50ZXJzZWN0aW9uIHBvaW50cy5cbiAgICB2YXIgbGFtYmRhMCA9IGFbMF0sXG4gICAgICAgIGxhbWJkYTEgPSBiWzBdLFxuICAgICAgICBwaGkwID0gYVsxXSxcbiAgICAgICAgcGhpMSA9IGJbMV0sXG4gICAgICAgIHo7XG5cbiAgICBpZiAobGFtYmRhMSA8IGxhbWJkYTApIHogPSBsYW1iZGEwLCBsYW1iZGEwID0gbGFtYmRhMSwgbGFtYmRhMSA9IHo7XG5cbiAgICB2YXIgZGVsdGEgPSBsYW1iZGExIC0gbGFtYmRhMCxcbiAgICAgICAgcG9sYXIgPSBhYnMoZGVsdGEgLSBwaSkgPCBlcHNpbG9uLFxuICAgICAgICBtZXJpZGlhbiA9IHBvbGFyIHx8IGRlbHRhIDwgZXBzaWxvbjtcblxuICAgIGlmICghcG9sYXIgJiYgcGhpMSA8IHBoaTApIHogPSBwaGkwLCBwaGkwID0gcGhpMSwgcGhpMSA9IHo7XG5cbiAgICAvLyBDaGVjayB0aGF0IHRoZSBmaXJzdCBwb2ludCBpcyBiZXR3ZWVuIGEgYW5kIGIuXG4gICAgaWYgKG1lcmlkaWFuXG4gICAgICAgID8gcG9sYXJcbiAgICAgICAgICA/IHBoaTAgKyBwaGkxID4gMCBeIHFbMV0gPCAoYWJzKHFbMF0gLSBsYW1iZGEwKSA8IGVwc2lsb24gPyBwaGkwIDogcGhpMSlcbiAgICAgICAgICA6IHBoaTAgPD0gcVsxXSAmJiBxWzFdIDw9IHBoaTFcbiAgICAgICAgOiBkZWx0YSA+IHBpIF4gKGxhbWJkYTAgPD0gcVswXSAmJiBxWzBdIDw9IGxhbWJkYTEpKSB7XG4gICAgICB2YXIgcTEgPSBjYXJ0ZXNpYW5TY2FsZSh1LCAoLXcgKyB0KSAvIHV1KTtcbiAgICAgIGNhcnRlc2lhbkFkZEluUGxhY2UocTEsIEEpO1xuICAgICAgcmV0dXJuIFtxLCBzcGhlcmljYWwocTEpXTtcbiAgICB9XG4gIH1cblxuICAvLyBHZW5lcmF0ZXMgYSA0LWJpdCB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSBsb2NhdGlvbiBvZiBhIHBvaW50IHJlbGF0aXZlIHRvXG4gIC8vIHRoZSBzbWFsbCBjaXJjbGUncyBib3VuZGluZyBib3guXG4gIGZ1bmN0aW9uIGNvZGUobGFtYmRhLCBwaGkpIHtcbiAgICB2YXIgciA9IHNtYWxsUmFkaXVzID8gcmFkaXVzIDogcGkgLSByYWRpdXMsXG4gICAgICAgIGNvZGUgPSAwO1xuICAgIGlmIChsYW1iZGEgPCAtcikgY29kZSB8PSAxOyAvLyBsZWZ0XG4gICAgZWxzZSBpZiAobGFtYmRhID4gcikgY29kZSB8PSAyOyAvLyByaWdodFxuICAgIGlmIChwaGkgPCAtcikgY29kZSB8PSA0OyAvLyBiZWxvd1xuICAgIGVsc2UgaWYgKHBoaSA+IHIpIGNvZGUgfD0gODsgLy8gYWJvdmVcbiAgICByZXR1cm4gY29kZTtcbiAgfVxuXG4gIHJldHVybiBjbGlwKHZpc2libGUsIGNsaXBMaW5lLCBpbnRlcnBvbGF0ZSwgc21hbGxSYWRpdXMgPyBbMCwgLXJhZGl1c10gOiBbLXBpLCByYWRpdXMgLSBwaV0pO1xufVxuIiwiaW1wb3J0IGNsaXBCdWZmZXIgZnJvbSBcIi4vYnVmZmVyLmpzXCI7XG5pbXBvcnQgY2xpcFJlam9pbiBmcm9tIFwiLi9yZWpvaW4uanNcIjtcbmltcG9ydCB7ZXBzaWxvbiwgaGFsZlBpfSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuaW1wb3J0IHBvbHlnb25Db250YWlucyBmcm9tIFwiLi4vcG9seWdvbkNvbnRhaW5zLmpzXCI7XG5pbXBvcnQge21lcmdlfSBmcm9tIFwiZDMtYXJyYXlcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocG9pbnRWaXNpYmxlLCBjbGlwTGluZSwgaW50ZXJwb2xhdGUsIHN0YXJ0KSB7XG4gIHJldHVybiBmdW5jdGlvbihzaW5rKSB7XG4gICAgdmFyIGxpbmUgPSBjbGlwTGluZShzaW5rKSxcbiAgICAgICAgcmluZ0J1ZmZlciA9IGNsaXBCdWZmZXIoKSxcbiAgICAgICAgcmluZ1NpbmsgPSBjbGlwTGluZShyaW5nQnVmZmVyKSxcbiAgICAgICAgcG9seWdvblN0YXJ0ZWQgPSBmYWxzZSxcbiAgICAgICAgcG9seWdvbixcbiAgICAgICAgc2VnbWVudHMsXG4gICAgICAgIHJpbmc7XG5cbiAgICB2YXIgY2xpcCA9IHtcbiAgICAgIHBvaW50OiBwb2ludCxcbiAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LFxuICAgICAgbGluZUVuZDogbGluZUVuZCxcbiAgICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGNsaXAucG9pbnQgPSBwb2ludFJpbmc7XG4gICAgICAgIGNsaXAubGluZVN0YXJ0ID0gcmluZ1N0YXJ0O1xuICAgICAgICBjbGlwLmxpbmVFbmQgPSByaW5nRW5kO1xuICAgICAgICBzZWdtZW50cyA9IFtdO1xuICAgICAgICBwb2x5Z29uID0gW107XG4gICAgICB9LFxuICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGNsaXAucG9pbnQgPSBwb2ludDtcbiAgICAgICAgY2xpcC5saW5lU3RhcnQgPSBsaW5lU3RhcnQ7XG4gICAgICAgIGNsaXAubGluZUVuZCA9IGxpbmVFbmQ7XG4gICAgICAgIHNlZ21lbnRzID0gbWVyZ2Uoc2VnbWVudHMpO1xuICAgICAgICB2YXIgc3RhcnRJbnNpZGUgPSBwb2x5Z29uQ29udGFpbnMocG9seWdvbiwgc3RhcnQpO1xuICAgICAgICBpZiAoc2VnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKCFwb2x5Z29uU3RhcnRlZCkgc2luay5wb2x5Z29uU3RhcnQoKSwgcG9seWdvblN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgIGNsaXBSZWpvaW4oc2VnbWVudHMsIGNvbXBhcmVJbnRlcnNlY3Rpb24sIHN0YXJ0SW5zaWRlLCBpbnRlcnBvbGF0ZSwgc2luayk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhcnRJbnNpZGUpIHtcbiAgICAgICAgICBpZiAoIXBvbHlnb25TdGFydGVkKSBzaW5rLnBvbHlnb25TdGFydCgpLCBwb2x5Z29uU3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgc2luay5saW5lU3RhcnQoKTtcbiAgICAgICAgICBpbnRlcnBvbGF0ZShudWxsLCBudWxsLCAxLCBzaW5rKTtcbiAgICAgICAgICBzaW5rLmxpbmVFbmQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9seWdvblN0YXJ0ZWQpIHNpbmsucG9seWdvbkVuZCgpLCBwb2x5Z29uU3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICBzZWdtZW50cyA9IHBvbHlnb24gPSBudWxsO1xuICAgICAgfSxcbiAgICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHNpbmsucG9seWdvblN0YXJ0KCk7XG4gICAgICAgIHNpbmsubGluZVN0YXJ0KCk7XG4gICAgICAgIGludGVycG9sYXRlKG51bGwsIG51bGwsIDEsIHNpbmspO1xuICAgICAgICBzaW5rLmxpbmVFbmQoKTtcbiAgICAgICAgc2luay5wb2x5Z29uRW5kKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHBvaW50KGxhbWJkYSwgcGhpKSB7XG4gICAgICBpZiAocG9pbnRWaXNpYmxlKGxhbWJkYSwgcGhpKSkgc2luay5wb2ludChsYW1iZGEsIHBoaSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9pbnRMaW5lKGxhbWJkYSwgcGhpKSB7XG4gICAgICBsaW5lLnBvaW50KGxhbWJkYSwgcGhpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaW5lU3RhcnQoKSB7XG4gICAgICBjbGlwLnBvaW50ID0gcG9pbnRMaW5lO1xuICAgICAgbGluZS5saW5lU3RhcnQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaW5lRW5kKCkge1xuICAgICAgY2xpcC5wb2ludCA9IHBvaW50O1xuICAgICAgbGluZS5saW5lRW5kKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9pbnRSaW5nKGxhbWJkYSwgcGhpKSB7XG4gICAgICByaW5nLnB1c2goW2xhbWJkYSwgcGhpXSk7XG4gICAgICByaW5nU2luay5wb2ludChsYW1iZGEsIHBoaSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmluZ1N0YXJ0KCkge1xuICAgICAgcmluZ1NpbmsubGluZVN0YXJ0KCk7XG4gICAgICByaW5nID0gW107XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmluZ0VuZCgpIHtcbiAgICAgIHBvaW50UmluZyhyaW5nWzBdWzBdLCByaW5nWzBdWzFdKTtcbiAgICAgIHJpbmdTaW5rLmxpbmVFbmQoKTtcblxuICAgICAgdmFyIGNsZWFuID0gcmluZ1NpbmsuY2xlYW4oKSxcbiAgICAgICAgICByaW5nU2VnbWVudHMgPSByaW5nQnVmZmVyLnJlc3VsdCgpLFxuICAgICAgICAgIGksIG4gPSByaW5nU2VnbWVudHMubGVuZ3RoLCBtLFxuICAgICAgICAgIHNlZ21lbnQsXG4gICAgICAgICAgcG9pbnQ7XG5cbiAgICAgIHJpbmcucG9wKCk7XG4gICAgICBwb2x5Z29uLnB1c2gocmluZyk7XG4gICAgICByaW5nID0gbnVsbDtcblxuICAgICAgaWYgKCFuKSByZXR1cm47XG5cbiAgICAgIC8vIE5vIGludGVyc2VjdGlvbnMuXG4gICAgICBpZiAoY2xlYW4gJiAxKSB7XG4gICAgICAgIHNlZ21lbnQgPSByaW5nU2VnbWVudHNbMF07XG4gICAgICAgIGlmICgobSA9IHNlZ21lbnQubGVuZ3RoIC0gMSkgPiAwKSB7XG4gICAgICAgICAgaWYgKCFwb2x5Z29uU3RhcnRlZCkgc2luay5wb2x5Z29uU3RhcnQoKSwgcG9seWdvblN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgIHNpbmsubGluZVN0YXJ0KCk7XG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgc2luay5wb2ludCgocG9pbnQgPSBzZWdtZW50W2ldKVswXSwgcG9pbnRbMV0pO1xuICAgICAgICAgIHNpbmsubGluZUVuZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUmVqb2luIGNvbm5lY3RlZCBzZWdtZW50cy5cbiAgICAgIC8vIFRPRE8gcmV1c2UgcmluZ0J1ZmZlci5yZWpvaW4oKT9cbiAgICAgIGlmIChuID4gMSAmJiBjbGVhbiAmIDIpIHJpbmdTZWdtZW50cy5wdXNoKHJpbmdTZWdtZW50cy5wb3AoKS5jb25jYXQocmluZ1NlZ21lbnRzLnNoaWZ0KCkpKTtcblxuICAgICAgc2VnbWVudHMucHVzaChyaW5nU2VnbWVudHMuZmlsdGVyKHZhbGlkU2VnbWVudCkpO1xuICAgIH1cblxuICAgIHJldHVybiBjbGlwO1xuICB9O1xufVxuXG5mdW5jdGlvbiB2YWxpZFNlZ21lbnQoc2VnbWVudCkge1xuICByZXR1cm4gc2VnbWVudC5sZW5ndGggPiAxO1xufVxuXG4vLyBJbnRlcnNlY3Rpb25zIGFyZSBzb3J0ZWQgYWxvbmcgdGhlIGNsaXAgZWRnZS4gRm9yIGJvdGggYW50aW1lcmlkaWFuIGN1dHRpbmdcbi8vIGFuZCBjaXJjbGUgY2xpcHBpbmcsIHRoZSBzYW1lIGNvbXBhcmlzb24gaXMgdXNlZC5cbmZ1bmN0aW9uIGNvbXBhcmVJbnRlcnNlY3Rpb24oYSwgYikge1xuICByZXR1cm4gKChhID0gYS54KVswXSA8IDAgPyBhWzFdIC0gaGFsZlBpIC0gZXBzaWxvbiA6IGhhbGZQaSAtIGFbMV0pXG4gICAgICAgLSAoKGIgPSBiLngpWzBdIDwgMCA/IGJbMV0gLSBoYWxmUGkgLSBlcHNpbG9uIDogaGFsZlBpIC0gYlsxXSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiLCB4MCwgeTAsIHgxLCB5MSkge1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYnggPSBiWzBdLFxuICAgICAgYnkgPSBiWzFdLFxuICAgICAgdDAgPSAwLFxuICAgICAgdDEgPSAxLFxuICAgICAgZHggPSBieCAtIGF4LFxuICAgICAgZHkgPSBieSAtIGF5LFxuICAgICAgcjtcblxuICByID0geDAgLSBheDtcbiAgaWYgKCFkeCAmJiByID4gMCkgcmV0dXJuO1xuICByIC89IGR4O1xuICBpZiAoZHggPCAwKSB7XG4gICAgaWYgKHIgPCB0MCkgcmV0dXJuO1xuICAgIGlmIChyIDwgdDEpIHQxID0gcjtcbiAgfSBlbHNlIGlmIChkeCA+IDApIHtcbiAgICBpZiAociA+IHQxKSByZXR1cm47XG4gICAgaWYgKHIgPiB0MCkgdDAgPSByO1xuICB9XG5cbiAgciA9IHgxIC0gYXg7XG4gIGlmICghZHggJiYgciA8IDApIHJldHVybjtcbiAgciAvPSBkeDtcbiAgaWYgKGR4IDwgMCkge1xuICAgIGlmIChyID4gdDEpIHJldHVybjtcbiAgICBpZiAociA+IHQwKSB0MCA9IHI7XG4gIH0gZWxzZSBpZiAoZHggPiAwKSB7XG4gICAgaWYgKHIgPCB0MCkgcmV0dXJuO1xuICAgIGlmIChyIDwgdDEpIHQxID0gcjtcbiAgfVxuXG4gIHIgPSB5MCAtIGF5O1xuICBpZiAoIWR5ICYmIHIgPiAwKSByZXR1cm47XG4gIHIgLz0gZHk7XG4gIGlmIChkeSA8IDApIHtcbiAgICBpZiAociA8IHQwKSByZXR1cm47XG4gICAgaWYgKHIgPCB0MSkgdDEgPSByO1xuICB9IGVsc2UgaWYgKGR5ID4gMCkge1xuICAgIGlmIChyID4gdDEpIHJldHVybjtcbiAgICBpZiAociA+IHQwKSB0MCA9IHI7XG4gIH1cblxuICByID0geTEgLSBheTtcbiAgaWYgKCFkeSAmJiByIDwgMCkgcmV0dXJuO1xuICByIC89IGR5O1xuICBpZiAoZHkgPCAwKSB7XG4gICAgaWYgKHIgPiB0MSkgcmV0dXJuO1xuICAgIGlmIChyID4gdDApIHQwID0gcjtcbiAgfSBlbHNlIGlmIChkeSA+IDApIHtcbiAgICBpZiAociA8IHQwKSByZXR1cm47XG4gICAgaWYgKHIgPCB0MSkgdDEgPSByO1xuICB9XG5cbiAgaWYgKHQwID4gMCkgYVswXSA9IGF4ICsgdDAgKiBkeCwgYVsxXSA9IGF5ICsgdDAgKiBkeTtcbiAgaWYgKHQxIDwgMSkgYlswXSA9IGF4ICsgdDEgKiBkeCwgYlsxXSA9IGF5ICsgdDEgKiBkeTtcbiAgcmV0dXJuIHRydWU7XG59XG4iLCJpbXBvcnQge2FicywgZXBzaWxvbn0gZnJvbSBcIi4uL21hdGguanNcIjtcbmltcG9ydCBjbGlwQnVmZmVyIGZyb20gXCIuL2J1ZmZlci5qc1wiO1xuaW1wb3J0IGNsaXBMaW5lIGZyb20gXCIuL2xpbmUuanNcIjtcbmltcG9ydCBjbGlwUmVqb2luIGZyb20gXCIuL3Jlam9pbi5qc1wiO1xuaW1wb3J0IHttZXJnZX0gZnJvbSBcImQzLWFycmF5XCI7XG5cbnZhciBjbGlwTWF4ID0gMWU5LCBjbGlwTWluID0gLWNsaXBNYXg7XG5cbi8vIFRPRE8gVXNlIGQzLXBvbHlnb27igJlzIHBvbHlnb25Db250YWlucyBoZXJlIGZvciB0aGUgcmluZyBjaGVjaz9cbi8vIFRPRE8gRWxpbWluYXRlIGR1cGxpY2F0ZSBidWZmZXJpbmcgaW4gY2xpcEJ1ZmZlciBhbmQgcG9seWdvbi5wdXNoP1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjbGlwUmVjdGFuZ2xlKHgwLCB5MCwgeDEsIHkxKSB7XG5cbiAgZnVuY3Rpb24gdmlzaWJsZSh4LCB5KSB7XG4gICAgcmV0dXJuIHgwIDw9IHggJiYgeCA8PSB4MSAmJiB5MCA8PSB5ICYmIHkgPD0geTE7XG4gIH1cblxuICBmdW5jdGlvbiBpbnRlcnBvbGF0ZShmcm9tLCB0bywgZGlyZWN0aW9uLCBzdHJlYW0pIHtcbiAgICB2YXIgYSA9IDAsIGExID0gMDtcbiAgICBpZiAoZnJvbSA9PSBudWxsXG4gICAgICAgIHx8IChhID0gY29ybmVyKGZyb20sIGRpcmVjdGlvbikpICE9PSAoYTEgPSBjb3JuZXIodG8sIGRpcmVjdGlvbikpXG4gICAgICAgIHx8IGNvbXBhcmVQb2ludChmcm9tLCB0bykgPCAwIF4gZGlyZWN0aW9uID4gMCkge1xuICAgICAgZG8gc3RyZWFtLnBvaW50KGEgPT09IDAgfHwgYSA9PT0gMyA/IHgwIDogeDEsIGEgPiAxID8geTEgOiB5MCk7XG4gICAgICB3aGlsZSAoKGEgPSAoYSArIGRpcmVjdGlvbiArIDQpICUgNCkgIT09IGExKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyZWFtLnBvaW50KHRvWzBdLCB0b1sxXSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY29ybmVyKHAsIGRpcmVjdGlvbikge1xuICAgIHJldHVybiBhYnMocFswXSAtIHgwKSA8IGVwc2lsb24gPyBkaXJlY3Rpb24gPiAwID8gMCA6IDNcbiAgICAgICAgOiBhYnMocFswXSAtIHgxKSA8IGVwc2lsb24gPyBkaXJlY3Rpb24gPiAwID8gMiA6IDFcbiAgICAgICAgOiBhYnMocFsxXSAtIHkwKSA8IGVwc2lsb24gPyBkaXJlY3Rpb24gPiAwID8gMSA6IDBcbiAgICAgICAgOiBkaXJlY3Rpb24gPiAwID8gMyA6IDI7IC8vIGFicyhwWzFdIC0geTEpIDwgZXBzaWxvblxuICB9XG5cbiAgZnVuY3Rpb24gY29tcGFyZUludGVyc2VjdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGNvbXBhcmVQb2ludChhLngsIGIueCk7XG4gIH1cblxuICBmdW5jdGlvbiBjb21wYXJlUG9pbnQoYSwgYikge1xuICAgIHZhciBjYSA9IGNvcm5lcihhLCAxKSxcbiAgICAgICAgY2IgPSBjb3JuZXIoYiwgMSk7XG4gICAgcmV0dXJuIGNhICE9PSBjYiA/IGNhIC0gY2JcbiAgICAgICAgOiBjYSA9PT0gMCA/IGJbMV0gLSBhWzFdXG4gICAgICAgIDogY2EgPT09IDEgPyBhWzBdIC0gYlswXVxuICAgICAgICA6IGNhID09PSAyID8gYVsxXSAtIGJbMV1cbiAgICAgICAgOiBiWzBdIC0gYVswXTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICB2YXIgYWN0aXZlU3RyZWFtID0gc3RyZWFtLFxuICAgICAgICBidWZmZXJTdHJlYW0gPSBjbGlwQnVmZmVyKCksXG4gICAgICAgIHNlZ21lbnRzLFxuICAgICAgICBwb2x5Z29uLFxuICAgICAgICByaW5nLFxuICAgICAgICB4X18sIHlfXywgdl9fLCAvLyBmaXJzdCBwb2ludFxuICAgICAgICB4XywgeV8sIHZfLCAvLyBwcmV2aW91cyBwb2ludFxuICAgICAgICBmaXJzdCxcbiAgICAgICAgY2xlYW47XG5cbiAgICB2YXIgY2xpcFN0cmVhbSA9IHtcbiAgICAgIHBvaW50OiBwb2ludCxcbiAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LFxuICAgICAgbGluZUVuZDogbGluZUVuZCxcbiAgICAgIHBvbHlnb25TdGFydDogcG9seWdvblN0YXJ0LFxuICAgICAgcG9seWdvbkVuZDogcG9seWdvbkVuZFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBwb2ludCh4LCB5KSB7XG4gICAgICBpZiAodmlzaWJsZSh4LCB5KSkgYWN0aXZlU3RyZWFtLnBvaW50KHgsIHkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBvbHlnb25JbnNpZGUoKSB7XG4gICAgICB2YXIgd2luZGluZyA9IDA7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gcG9seWdvbi5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgZm9yICh2YXIgcmluZyA9IHBvbHlnb25baV0sIGogPSAxLCBtID0gcmluZy5sZW5ndGgsIHBvaW50ID0gcmluZ1swXSwgYTAsIGExLCBiMCA9IHBvaW50WzBdLCBiMSA9IHBvaW50WzFdOyBqIDwgbTsgKytqKSB7XG4gICAgICAgICAgYTAgPSBiMCwgYTEgPSBiMSwgcG9pbnQgPSByaW5nW2pdLCBiMCA9IHBvaW50WzBdLCBiMSA9IHBvaW50WzFdO1xuICAgICAgICAgIGlmIChhMSA8PSB5MSkgeyBpZiAoYjEgPiB5MSAmJiAoYjAgLSBhMCkgKiAoeTEgLSBhMSkgPiAoYjEgLSBhMSkgKiAoeDAgLSBhMCkpICsrd2luZGluZzsgfVxuICAgICAgICAgIGVsc2UgeyBpZiAoYjEgPD0geTEgJiYgKGIwIC0gYTApICogKHkxIC0gYTEpIDwgKGIxIC0gYTEpICogKHgwIC0gYTApKSAtLXdpbmRpbmc7IH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gd2luZGluZztcbiAgICB9XG5cbiAgICAvLyBCdWZmZXIgZ2VvbWV0cnkgd2l0aGluIGEgcG9seWdvbiBhbmQgdGhlbiBjbGlwIGl0IGVuIG1hc3NlLlxuICAgIGZ1bmN0aW9uIHBvbHlnb25TdGFydCgpIHtcbiAgICAgIGFjdGl2ZVN0cmVhbSA9IGJ1ZmZlclN0cmVhbSwgc2VnbWVudHMgPSBbXSwgcG9seWdvbiA9IFtdLCBjbGVhbiA9IHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9seWdvbkVuZCgpIHtcbiAgICAgIHZhciBzdGFydEluc2lkZSA9IHBvbHlnb25JbnNpZGUoKSxcbiAgICAgICAgICBjbGVhbkluc2lkZSA9IGNsZWFuICYmIHN0YXJ0SW5zaWRlLFxuICAgICAgICAgIHZpc2libGUgPSAoc2VnbWVudHMgPSBtZXJnZShzZWdtZW50cykpLmxlbmd0aDtcbiAgICAgIGlmIChjbGVhbkluc2lkZSB8fCB2aXNpYmxlKSB7XG4gICAgICAgIHN0cmVhbS5wb2x5Z29uU3RhcnQoKTtcbiAgICAgICAgaWYgKGNsZWFuSW5zaWRlKSB7XG4gICAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICAgIGludGVycG9sYXRlKG51bGwsIG51bGwsIDEsIHN0cmVhbSk7XG4gICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlzaWJsZSkge1xuICAgICAgICAgIGNsaXBSZWpvaW4oc2VnbWVudHMsIGNvbXBhcmVJbnRlcnNlY3Rpb24sIHN0YXJ0SW5zaWRlLCBpbnRlcnBvbGF0ZSwgc3RyZWFtKTtcbiAgICAgICAgfVxuICAgICAgICBzdHJlYW0ucG9seWdvbkVuZCgpO1xuICAgICAgfVxuICAgICAgYWN0aXZlU3RyZWFtID0gc3RyZWFtLCBzZWdtZW50cyA9IHBvbHlnb24gPSByaW5nID0gbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaW5lU3RhcnQoKSB7XG4gICAgICBjbGlwU3RyZWFtLnBvaW50ID0gbGluZVBvaW50O1xuICAgICAgaWYgKHBvbHlnb24pIHBvbHlnb24ucHVzaChyaW5nID0gW10pO1xuICAgICAgZmlyc3QgPSB0cnVlO1xuICAgICAgdl8gPSBmYWxzZTtcbiAgICAgIHhfID0geV8gPSBOYU47XG4gICAgfVxuXG4gICAgLy8gVE9ETyByYXRoZXIgdGhhbiBzcGVjaWFsLWNhc2UgcG9seWdvbnMsIHNpbXBseSBoYW5kbGUgdGhlbSBzZXBhcmF0ZWx5LlxuICAgIC8vIElkZWFsbHksIGNvaW5jaWRlbnQgaW50ZXJzZWN0aW9uIHBvaW50cyBzaG91bGQgYmUgaml0dGVyZWQgdG8gYXZvaWRcbiAgICAvLyBjbGlwcGluZyBpc3N1ZXMuXG4gICAgZnVuY3Rpb24gbGluZUVuZCgpIHtcbiAgICAgIGlmIChzZWdtZW50cykge1xuICAgICAgICBsaW5lUG9pbnQoeF9fLCB5X18pO1xuICAgICAgICBpZiAodl9fICYmIHZfKSBidWZmZXJTdHJlYW0ucmVqb2luKCk7XG4gICAgICAgIHNlZ21lbnRzLnB1c2goYnVmZmVyU3RyZWFtLnJlc3VsdCgpKTtcbiAgICAgIH1cbiAgICAgIGNsaXBTdHJlYW0ucG9pbnQgPSBwb2ludDtcbiAgICAgIGlmICh2XykgYWN0aXZlU3RyZWFtLmxpbmVFbmQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaW5lUG9pbnQoeCwgeSkge1xuICAgICAgdmFyIHYgPSB2aXNpYmxlKHgsIHkpO1xuICAgICAgaWYgKHBvbHlnb24pIHJpbmcucHVzaChbeCwgeV0pO1xuICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgIHhfXyA9IHgsIHlfXyA9IHksIHZfXyA9IHY7XG4gICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgIGlmICh2KSB7XG4gICAgICAgICAgYWN0aXZlU3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICAgIGFjdGl2ZVN0cmVhbS5wb2ludCh4LCB5KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHYgJiYgdl8pIGFjdGl2ZVN0cmVhbS5wb2ludCh4LCB5KTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIGEgPSBbeF8gPSBNYXRoLm1heChjbGlwTWluLCBNYXRoLm1pbihjbGlwTWF4LCB4XykpLCB5XyA9IE1hdGgubWF4KGNsaXBNaW4sIE1hdGgubWluKGNsaXBNYXgsIHlfKSldLFxuICAgICAgICAgICAgICBiID0gW3ggPSBNYXRoLm1heChjbGlwTWluLCBNYXRoLm1pbihjbGlwTWF4LCB4KSksIHkgPSBNYXRoLm1heChjbGlwTWluLCBNYXRoLm1pbihjbGlwTWF4LCB5KSldO1xuICAgICAgICAgIGlmIChjbGlwTGluZShhLCBiLCB4MCwgeTAsIHgxLCB5MSkpIHtcbiAgICAgICAgICAgIGlmICghdl8pIHtcbiAgICAgICAgICAgICAgYWN0aXZlU3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICAgICAgICBhY3RpdmVTdHJlYW0ucG9pbnQoYVswXSwgYVsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhY3RpdmVTdHJlYW0ucG9pbnQoYlswXSwgYlsxXSk7XG4gICAgICAgICAgICBpZiAoIXYpIGFjdGl2ZVN0cmVhbS5saW5lRW5kKCk7XG4gICAgICAgICAgICBjbGVhbiA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSBpZiAodikge1xuICAgICAgICAgICAgYWN0aXZlU3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICAgICAgYWN0aXZlU3RyZWFtLnBvaW50KHgsIHkpO1xuICAgICAgICAgICAgY2xlYW4gPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHhfID0geCwgeV8gPSB5LCB2XyA9IHY7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsaXBTdHJlYW07XG4gIH07XG59XG4iLCJpbXBvcnQgcG9pbnRFcXVhbCBmcm9tIFwiLi4vcG9pbnRFcXVhbC5qc1wiO1xuaW1wb3J0IHtlcHNpbG9ufSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBJbnRlcnNlY3Rpb24ocG9pbnQsIHBvaW50cywgb3RoZXIsIGVudHJ5KSB7XG4gIHRoaXMueCA9IHBvaW50O1xuICB0aGlzLnogPSBwb2ludHM7XG4gIHRoaXMubyA9IG90aGVyOyAvLyBhbm90aGVyIGludGVyc2VjdGlvblxuICB0aGlzLmUgPSBlbnRyeTsgLy8gaXMgYW4gZW50cnk/XG4gIHRoaXMudiA9IGZhbHNlOyAvLyB2aXNpdGVkXG4gIHRoaXMubiA9IHRoaXMucCA9IG51bGw7IC8vIG5leHQgJiBwcmV2aW91c1xufVxuXG4vLyBBIGdlbmVyYWxpemVkIHBvbHlnb24gY2xpcHBpbmcgYWxnb3JpdGhtOiBnaXZlbiBhIHBvbHlnb24gdGhhdCBoYXMgYmVlbiBjdXRcbi8vIGludG8gaXRzIHZpc2libGUgbGluZSBzZWdtZW50cywgYW5kIHJlam9pbnMgdGhlIHNlZ21lbnRzIGJ5IGludGVycG9sYXRpbmdcbi8vIGFsb25nIHRoZSBjbGlwIGVkZ2UuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWdtZW50cywgY29tcGFyZUludGVyc2VjdGlvbiwgc3RhcnRJbnNpZGUsIGludGVycG9sYXRlLCBzdHJlYW0pIHtcbiAgdmFyIHN1YmplY3QgPSBbXSxcbiAgICAgIGNsaXAgPSBbXSxcbiAgICAgIGksXG4gICAgICBuO1xuXG4gIHNlZ21lbnRzLmZvckVhY2goZnVuY3Rpb24oc2VnbWVudCkge1xuICAgIGlmICgobiA9IHNlZ21lbnQubGVuZ3RoIC0gMSkgPD0gMCkgcmV0dXJuO1xuICAgIHZhciBuLCBwMCA9IHNlZ21lbnRbMF0sIHAxID0gc2VnbWVudFtuXSwgeDtcblxuICAgIGlmIChwb2ludEVxdWFsKHAwLCBwMSkpIHtcbiAgICAgIGlmICghcDBbMl0gJiYgIXAxWzJdKSB7XG4gICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgc3RyZWFtLnBvaW50KChwMCA9IHNlZ21lbnRbaV0pWzBdLCBwMFsxXSk7XG4gICAgICAgIHN0cmVhbS5saW5lRW5kKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGhhbmRsZSBkZWdlbmVyYXRlIGNhc2VzIGJ5IG1vdmluZyB0aGUgcG9pbnRcbiAgICAgIHAxWzBdICs9IDIgKiBlcHNpbG9uO1xuICAgIH1cblxuICAgIHN1YmplY3QucHVzaCh4ID0gbmV3IEludGVyc2VjdGlvbihwMCwgc2VnbWVudCwgbnVsbCwgdHJ1ZSkpO1xuICAgIGNsaXAucHVzaCh4Lm8gPSBuZXcgSW50ZXJzZWN0aW9uKHAwLCBudWxsLCB4LCBmYWxzZSkpO1xuICAgIHN1YmplY3QucHVzaCh4ID0gbmV3IEludGVyc2VjdGlvbihwMSwgc2VnbWVudCwgbnVsbCwgZmFsc2UpKTtcbiAgICBjbGlwLnB1c2goeC5vID0gbmV3IEludGVyc2VjdGlvbihwMSwgbnVsbCwgeCwgdHJ1ZSkpO1xuICB9KTtcblxuICBpZiAoIXN1YmplY3QubGVuZ3RoKSByZXR1cm47XG5cbiAgY2xpcC5zb3J0KGNvbXBhcmVJbnRlcnNlY3Rpb24pO1xuICBsaW5rKHN1YmplY3QpO1xuICBsaW5rKGNsaXApO1xuXG4gIGZvciAoaSA9IDAsIG4gPSBjbGlwLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgIGNsaXBbaV0uZSA9IHN0YXJ0SW5zaWRlID0gIXN0YXJ0SW5zaWRlO1xuICB9XG5cbiAgdmFyIHN0YXJ0ID0gc3ViamVjdFswXSxcbiAgICAgIHBvaW50cyxcbiAgICAgIHBvaW50O1xuXG4gIHdoaWxlICgxKSB7XG4gICAgLy8gRmluZCBmaXJzdCB1bnZpc2l0ZWQgaW50ZXJzZWN0aW9uLlxuICAgIHZhciBjdXJyZW50ID0gc3RhcnQsXG4gICAgICAgIGlzU3ViamVjdCA9IHRydWU7XG4gICAgd2hpbGUgKGN1cnJlbnQudikgaWYgKChjdXJyZW50ID0gY3VycmVudC5uKSA9PT0gc3RhcnQpIHJldHVybjtcbiAgICBwb2ludHMgPSBjdXJyZW50Lno7XG4gICAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICAgIGRvIHtcbiAgICAgIGN1cnJlbnQudiA9IGN1cnJlbnQuby52ID0gdHJ1ZTtcbiAgICAgIGlmIChjdXJyZW50LmUpIHtcbiAgICAgICAgaWYgKGlzU3ViamVjdCkge1xuICAgICAgICAgIGZvciAoaSA9IDAsIG4gPSBwb2ludHMubGVuZ3RoOyBpIDwgbjsgKytpKSBzdHJlYW0ucG9pbnQoKHBvaW50ID0gcG9pbnRzW2ldKVswXSwgcG9pbnRbMV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGludGVycG9sYXRlKGN1cnJlbnQueCwgY3VycmVudC5uLngsIDEsIHN0cmVhbSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc1N1YmplY3QpIHtcbiAgICAgICAgICBwb2ludHMgPSBjdXJyZW50LnAuejtcbiAgICAgICAgICBmb3IgKGkgPSBwb2ludHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHN0cmVhbS5wb2ludCgocG9pbnQgPSBwb2ludHNbaV0pWzBdLCBwb2ludFsxXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW50ZXJwb2xhdGUoY3VycmVudC54LCBjdXJyZW50LnAueCwgLTEsIHN0cmVhbSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucDtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm87XG4gICAgICBwb2ludHMgPSBjdXJyZW50Lno7XG4gICAgICBpc1N1YmplY3QgPSAhaXNTdWJqZWN0O1xuICAgIH0gd2hpbGUgKCFjdXJyZW50LnYpO1xuICAgIHN0cmVhbS5saW5lRW5kKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbGluayhhcnJheSkge1xuICBpZiAoIShuID0gYXJyYXkubGVuZ3RoKSkgcmV0dXJuO1xuICB2YXIgbixcbiAgICAgIGkgPSAwLFxuICAgICAgYSA9IGFycmF5WzBdLFxuICAgICAgYjtcbiAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICBhLm4gPSBiID0gYXJyYXlbaV07XG4gICAgYi5wID0gYTtcbiAgICBhID0gYjtcbiAgfVxuICBhLm4gPSBiID0gYXJyYXlbMF07XG4gIGIucCA9IGE7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG5cbiAgZnVuY3Rpb24gY29tcG9zZSh4LCB5KSB7XG4gICAgcmV0dXJuIHggPSBhKHgsIHkpLCBiKHhbMF0sIHhbMV0pO1xuICB9XG5cbiAgaWYgKGEuaW52ZXJ0ICYmIGIuaW52ZXJ0KSBjb21wb3NlLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4geCA9IGIuaW52ZXJ0KHgsIHkpLCB4ICYmIGEuaW52ZXJ0KHhbMF0sIHhbMV0pO1xuICB9O1xuXG4gIHJldHVybiBjb21wb3NlO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCB4ID0+IHg7XG4iLCJleHBvcnQgdmFyIGVwc2lsb24gPSAxZS02O1xuZXhwb3J0IHZhciBlcHNpbG9uMiA9IDFlLTEyO1xuZXhwb3J0IHZhciBwaSA9IE1hdGguUEk7XG5leHBvcnQgdmFyIGhhbGZQaSA9IHBpIC8gMjtcbmV4cG9ydCB2YXIgcXVhcnRlclBpID0gcGkgLyA0O1xuZXhwb3J0IHZhciB0YXUgPSBwaSAqIDI7XG5cbmV4cG9ydCB2YXIgZGVncmVlcyA9IDE4MCAvIHBpO1xuZXhwb3J0IHZhciByYWRpYW5zID0gcGkgLyAxODA7XG5cbmV4cG9ydCB2YXIgYWJzID0gTWF0aC5hYnM7XG5leHBvcnQgdmFyIGF0YW4gPSBNYXRoLmF0YW47XG5leHBvcnQgdmFyIGF0YW4yID0gTWF0aC5hdGFuMjtcbmV4cG9ydCB2YXIgY29zID0gTWF0aC5jb3M7XG5leHBvcnQgdmFyIGNlaWwgPSBNYXRoLmNlaWw7XG5leHBvcnQgdmFyIGV4cCA9IE1hdGguZXhwO1xuZXhwb3J0IHZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5leHBvcnQgdmFyIGh5cG90ID0gTWF0aC5oeXBvdDtcbmV4cG9ydCB2YXIgbG9nID0gTWF0aC5sb2c7XG5leHBvcnQgdmFyIHBvdyA9IE1hdGgucG93O1xuZXhwb3J0IHZhciBzaW4gPSBNYXRoLnNpbjtcbmV4cG9ydCB2YXIgc2lnbiA9IE1hdGguc2lnbiB8fCBmdW5jdGlvbih4KSB7IHJldHVybiB4ID4gMCA/IDEgOiB4IDwgMCA/IC0xIDogMDsgfTtcbmV4cG9ydCB2YXIgc3FydCA9IE1hdGguc3FydDtcbmV4cG9ydCB2YXIgdGFuID0gTWF0aC50YW47XG5cbmV4cG9ydCBmdW5jdGlvbiBhY29zKHgpIHtcbiAgcmV0dXJuIHggPiAxID8gMCA6IHggPCAtMSA/IHBpIDogTWF0aC5hY29zKHgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNpbih4KSB7XG4gIHJldHVybiB4ID4gMSA/IGhhbGZQaSA6IHggPCAtMSA/IC1oYWxmUGkgOiBNYXRoLmFzaW4oeCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXZlcnNpbih4KSB7XG4gIHJldHVybiAoeCA9IHNpbih4IC8gMikpICogeDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vb3AoKSB7fVxuIiwiaW1wb3J0IG5vb3AgZnJvbSBcIi4uL25vb3AuanNcIjtcblxudmFyIHgwID0gSW5maW5pdHksXG4gICAgeTAgPSB4MCxcbiAgICB4MSA9IC14MCxcbiAgICB5MSA9IHgxO1xuXG52YXIgYm91bmRzU3RyZWFtID0ge1xuICBwb2ludDogYm91bmRzUG9pbnQsXG4gIGxpbmVTdGFydDogbm9vcCxcbiAgbGluZUVuZDogbm9vcCxcbiAgcG9seWdvblN0YXJ0OiBub29wLFxuICBwb2x5Z29uRW5kOiBub29wLFxuICByZXN1bHQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBib3VuZHMgPSBbW3gwLCB5MF0sIFt4MSwgeTFdXTtcbiAgICB4MSA9IHkxID0gLSh5MCA9IHgwID0gSW5maW5pdHkpO1xuICAgIHJldHVybiBib3VuZHM7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGJvdW5kc1BvaW50KHgsIHkpIHtcbiAgaWYgKHggPCB4MCkgeDAgPSB4O1xuICBpZiAoeCA+IHgxKSB4MSA9IHg7XG4gIGlmICh5IDwgeTApIHkwID0geTtcbiAgaWYgKHkgPiB5MSkgeTEgPSB5O1xufVxuXG5leHBvcnQgZGVmYXVsdCBib3VuZHNTdHJlYW07XG4iLCJpbXBvcnQge2FicywgZXBzaWxvbn0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHJldHVybiBhYnMoYVswXSAtIGJbMF0pIDwgZXBzaWxvbiAmJiBhYnMoYVsxXSAtIGJbMV0pIDwgZXBzaWxvbjtcbn1cbiIsImltcG9ydCB7QWRkZXJ9IGZyb20gXCJkMy1hcnJheVwiO1xuaW1wb3J0IHtjYXJ0ZXNpYW4sIGNhcnRlc2lhbkNyb3NzLCBjYXJ0ZXNpYW5Ob3JtYWxpemVJblBsYWNlfSBmcm9tIFwiLi9jYXJ0ZXNpYW4uanNcIjtcbmltcG9ydCB7YWJzLCBhc2luLCBhdGFuMiwgY29zLCBlcHNpbG9uLCBlcHNpbG9uMiwgaGFsZlBpLCBwaSwgcXVhcnRlclBpLCBzaWduLCBzaW4sIHRhdX0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBsb25naXR1ZGUocG9pbnQpIHtcbiAgcmV0dXJuIGFicyhwb2ludFswXSkgPD0gcGkgPyBwb2ludFswXSA6IHNpZ24ocG9pbnRbMF0pICogKChhYnMocG9pbnRbMF0pICsgcGkpICUgdGF1IC0gcGkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihwb2x5Z29uLCBwb2ludCkge1xuICB2YXIgbGFtYmRhID0gbG9uZ2l0dWRlKHBvaW50KSxcbiAgICAgIHBoaSA9IHBvaW50WzFdLFxuICAgICAgc2luUGhpID0gc2luKHBoaSksXG4gICAgICBub3JtYWwgPSBbc2luKGxhbWJkYSksIC1jb3MobGFtYmRhKSwgMF0sXG4gICAgICBhbmdsZSA9IDAsXG4gICAgICB3aW5kaW5nID0gMDtcblxuICB2YXIgc3VtID0gbmV3IEFkZGVyKCk7XG5cbiAgaWYgKHNpblBoaSA9PT0gMSkgcGhpID0gaGFsZlBpICsgZXBzaWxvbjtcbiAgZWxzZSBpZiAoc2luUGhpID09PSAtMSkgcGhpID0gLWhhbGZQaSAtIGVwc2lsb247XG5cbiAgZm9yICh2YXIgaSA9IDAsIG4gPSBwb2x5Z29uLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgIGlmICghKG0gPSAocmluZyA9IHBvbHlnb25baV0pLmxlbmd0aCkpIGNvbnRpbnVlO1xuICAgIHZhciByaW5nLFxuICAgICAgICBtLFxuICAgICAgICBwb2ludDAgPSByaW5nW20gLSAxXSxcbiAgICAgICAgbGFtYmRhMCA9IGxvbmdpdHVkZShwb2ludDApLFxuICAgICAgICBwaGkwID0gcG9pbnQwWzFdIC8gMiArIHF1YXJ0ZXJQaSxcbiAgICAgICAgc2luUGhpMCA9IHNpbihwaGkwKSxcbiAgICAgICAgY29zUGhpMCA9IGNvcyhwaGkwKTtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbTsgKytqLCBsYW1iZGEwID0gbGFtYmRhMSwgc2luUGhpMCA9IHNpblBoaTEsIGNvc1BoaTAgPSBjb3NQaGkxLCBwb2ludDAgPSBwb2ludDEpIHtcbiAgICAgIHZhciBwb2ludDEgPSByaW5nW2pdLFxuICAgICAgICAgIGxhbWJkYTEgPSBsb25naXR1ZGUocG9pbnQxKSxcbiAgICAgICAgICBwaGkxID0gcG9pbnQxWzFdIC8gMiArIHF1YXJ0ZXJQaSxcbiAgICAgICAgICBzaW5QaGkxID0gc2luKHBoaTEpLFxuICAgICAgICAgIGNvc1BoaTEgPSBjb3MocGhpMSksXG4gICAgICAgICAgZGVsdGEgPSBsYW1iZGExIC0gbGFtYmRhMCxcbiAgICAgICAgICBzaWduID0gZGVsdGEgPj0gMCA/IDEgOiAtMSxcbiAgICAgICAgICBhYnNEZWx0YSA9IHNpZ24gKiBkZWx0YSxcbiAgICAgICAgICBhbnRpbWVyaWRpYW4gPSBhYnNEZWx0YSA+IHBpLFxuICAgICAgICAgIGsgPSBzaW5QaGkwICogc2luUGhpMTtcblxuICAgICAgc3VtLmFkZChhdGFuMihrICogc2lnbiAqIHNpbihhYnNEZWx0YSksIGNvc1BoaTAgKiBjb3NQaGkxICsgayAqIGNvcyhhYnNEZWx0YSkpKTtcbiAgICAgIGFuZ2xlICs9IGFudGltZXJpZGlhbiA/IGRlbHRhICsgc2lnbiAqIHRhdSA6IGRlbHRhO1xuXG4gICAgICAvLyBBcmUgdGhlIGxvbmdpdHVkZXMgZWl0aGVyIHNpZGUgb2YgdGhlIHBvaW504oCZcyBtZXJpZGlhbiAobGFtYmRhKSxcbiAgICAgIC8vIGFuZCBhcmUgdGhlIGxhdGl0dWRlcyBzbWFsbGVyIHRoYW4gdGhlIHBhcmFsbGVsIChwaGkpP1xuICAgICAgaWYgKGFudGltZXJpZGlhbiBeIGxhbWJkYTAgPj0gbGFtYmRhIF4gbGFtYmRhMSA+PSBsYW1iZGEpIHtcbiAgICAgICAgdmFyIGFyYyA9IGNhcnRlc2lhbkNyb3NzKGNhcnRlc2lhbihwb2ludDApLCBjYXJ0ZXNpYW4ocG9pbnQxKSk7XG4gICAgICAgIGNhcnRlc2lhbk5vcm1hbGl6ZUluUGxhY2UoYXJjKTtcbiAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IGNhcnRlc2lhbkNyb3NzKG5vcm1hbCwgYXJjKTtcbiAgICAgICAgY2FydGVzaWFuTm9ybWFsaXplSW5QbGFjZShpbnRlcnNlY3Rpb24pO1xuICAgICAgICB2YXIgcGhpQXJjID0gKGFudGltZXJpZGlhbiBeIGRlbHRhID49IDAgPyAtMSA6IDEpICogYXNpbihpbnRlcnNlY3Rpb25bMl0pO1xuICAgICAgICBpZiAocGhpID4gcGhpQXJjIHx8IHBoaSA9PT0gcGhpQXJjICYmIChhcmNbMF0gfHwgYXJjWzFdKSkge1xuICAgICAgICAgIHdpbmRpbmcgKz0gYW50aW1lcmlkaWFuIF4gZGVsdGEgPj0gMCA/IDEgOiAtMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEZpcnN0LCBkZXRlcm1pbmUgd2hldGhlciB0aGUgU291dGggcG9sZSBpcyBpbnNpZGUgb3Igb3V0c2lkZTpcbiAgLy9cbiAgLy8gSXQgaXMgaW5zaWRlIGlmOlxuICAvLyAqIHRoZSBwb2x5Z29uIHdpbmRzIGFyb3VuZCBpdCBpbiBhIGNsb2Nrd2lzZSBkaXJlY3Rpb24uXG4gIC8vICogdGhlIHBvbHlnb24gZG9lcyBub3QgKGN1bXVsYXRpdmVseSkgd2luZCBhcm91bmQgaXQsIGJ1dCBoYXMgYSBuZWdhdGl2ZVxuICAvLyAgIChjb3VudGVyLWNsb2Nrd2lzZSkgYXJlYS5cbiAgLy9cbiAgLy8gU2Vjb25kLCBjb3VudCB0aGUgKHNpZ25lZCkgbnVtYmVyIG9mIHRpbWVzIGEgc2VnbWVudCBjcm9zc2VzIGEgbGFtYmRhXG4gIC8vIGZyb20gdGhlIHBvaW50IHRvIHRoZSBTb3V0aCBwb2xlLiAgSWYgaXQgaXMgemVybywgdGhlbiB0aGUgcG9pbnQgaXMgdGhlXG4gIC8vIHNhbWUgc2lkZSBhcyB0aGUgU291dGggcG9sZS5cblxuICByZXR1cm4gKGFuZ2xlIDwgLWVwc2lsb24gfHwgYW5nbGUgPCBlcHNpbG9uICYmIHN1bSA8IC1lcHNpbG9uMikgXiAod2luZGluZyAmIDEpO1xufVxuIiwiaW1wb3J0IHthc2luLCBhdGFuMiwgY29zLCBzaW4sIHNxcnR9IGZyb20gXCIuLi9tYXRoLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBhemltdXRoYWxSYXcoc2NhbGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB2YXIgY3ggPSBjb3MoeCksXG4gICAgICAgIGN5ID0gY29zKHkpLFxuICAgICAgICBrID0gc2NhbGUoY3ggKiBjeSk7XG4gICAgICAgIGlmIChrID09PSBJbmZpbml0eSkgcmV0dXJuIFsyLCAwXTtcbiAgICByZXR1cm4gW1xuICAgICAgayAqIGN5ICogc2luKHgpLFxuICAgICAgayAqIHNpbih5KVxuICAgIF07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF6aW11dGhhbEludmVydChhbmdsZSkge1xuICByZXR1cm4gZnVuY3Rpb24oeCwgeSkge1xuICAgIHZhciB6ID0gc3FydCh4ICogeCArIHkgKiB5KSxcbiAgICAgICAgYyA9IGFuZ2xlKHopLFxuICAgICAgICBzYyA9IHNpbihjKSxcbiAgICAgICAgY2MgPSBjb3MoYyk7XG4gICAgcmV0dXJuIFtcbiAgICAgIGF0YW4yKHggKiBzYywgeiAqIGNjKSxcbiAgICAgIGFzaW4oeiAmJiB5ICogc2MgLyB6KVxuICAgIF07XG4gIH1cbn1cbiIsImltcG9ydCB7YXNpbiwgc3FydH0gZnJvbSBcIi4uL21hdGguanNcIjtcbmltcG9ydCB7YXppbXV0aGFsUmF3LCBhemltdXRoYWxJbnZlcnR9IGZyb20gXCIuL2F6aW11dGhhbC5qc1wiO1xuaW1wb3J0IHByb2plY3Rpb24gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IHZhciBhemltdXRoYWxFcXVhbEFyZWFSYXcgPSBhemltdXRoYWxSYXcoZnVuY3Rpb24oY3hjeSkge1xuICByZXR1cm4gc3FydCgyIC8gKDEgKyBjeGN5KSk7XG59KTtcblxuYXppbXV0aGFsRXF1YWxBcmVhUmF3LmludmVydCA9IGF6aW11dGhhbEludmVydChmdW5jdGlvbih6KSB7XG4gIHJldHVybiAyICogYXNpbih6IC8gMik7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBwcm9qZWN0aW9uKGF6aW11dGhhbEVxdWFsQXJlYVJhdylcbiAgICAgIC5zY2FsZSgxMjQuNzUpXG4gICAgICAuY2xpcEFuZ2xlKDE4MCAtIDFlLTMpO1xufVxuIiwiaW1wb3J0IHtkZWZhdWx0IGFzIGdlb1N0cmVhbX0gZnJvbSBcIi4uL3N0cmVhbS5qc1wiO1xuaW1wb3J0IGJvdW5kc1N0cmVhbSBmcm9tIFwiLi4vcGF0aC9ib3VuZHMuanNcIjtcblxuZnVuY3Rpb24gZml0KHByb2plY3Rpb24sIGZpdEJvdW5kcywgb2JqZWN0KSB7XG4gIHZhciBjbGlwID0gcHJvamVjdGlvbi5jbGlwRXh0ZW50ICYmIHByb2plY3Rpb24uY2xpcEV4dGVudCgpO1xuICBwcm9qZWN0aW9uLnNjYWxlKDE1MCkudHJhbnNsYXRlKFswLCAwXSk7XG4gIGlmIChjbGlwICE9IG51bGwpIHByb2plY3Rpb24uY2xpcEV4dGVudChudWxsKTtcbiAgZ2VvU3RyZWFtKG9iamVjdCwgcHJvamVjdGlvbi5zdHJlYW0oYm91bmRzU3RyZWFtKSk7XG4gIGZpdEJvdW5kcyhib3VuZHNTdHJlYW0ucmVzdWx0KCkpO1xuICBpZiAoY2xpcCAhPSBudWxsKSBwcm9qZWN0aW9uLmNsaXBFeHRlbnQoY2xpcCk7XG4gIHJldHVybiBwcm9qZWN0aW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml0RXh0ZW50KHByb2plY3Rpb24sIGV4dGVudCwgb2JqZWN0KSB7XG4gIHJldHVybiBmaXQocHJvamVjdGlvbiwgZnVuY3Rpb24oYikge1xuICAgIHZhciB3ID0gZXh0ZW50WzFdWzBdIC0gZXh0ZW50WzBdWzBdLFxuICAgICAgICBoID0gZXh0ZW50WzFdWzFdIC0gZXh0ZW50WzBdWzFdLFxuICAgICAgICBrID0gTWF0aC5taW4odyAvIChiWzFdWzBdIC0gYlswXVswXSksIGggLyAoYlsxXVsxXSAtIGJbMF1bMV0pKSxcbiAgICAgICAgeCA9ICtleHRlbnRbMF1bMF0gKyAodyAtIGsgKiAoYlsxXVswXSArIGJbMF1bMF0pKSAvIDIsXG4gICAgICAgIHkgPSArZXh0ZW50WzBdWzFdICsgKGggLSBrICogKGJbMV1bMV0gKyBiWzBdWzFdKSkgLyAyO1xuICAgIHByb2plY3Rpb24uc2NhbGUoMTUwICogaykudHJhbnNsYXRlKFt4LCB5XSk7XG4gIH0sIG9iamVjdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXRTaXplKHByb2plY3Rpb24sIHNpemUsIG9iamVjdCkge1xuICByZXR1cm4gZml0RXh0ZW50KHByb2plY3Rpb24sIFtbMCwgMF0sIHNpemVdLCBvYmplY3QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml0V2lkdGgocHJvamVjdGlvbiwgd2lkdGgsIG9iamVjdCkge1xuICByZXR1cm4gZml0KHByb2plY3Rpb24sIGZ1bmN0aW9uKGIpIHtcbiAgICB2YXIgdyA9ICt3aWR0aCxcbiAgICAgICAgayA9IHcgLyAoYlsxXVswXSAtIGJbMF1bMF0pLFxuICAgICAgICB4ID0gKHcgLSBrICogKGJbMV1bMF0gKyBiWzBdWzBdKSkgLyAyLFxuICAgICAgICB5ID0gLWsgKiBiWzBdWzFdO1xuICAgIHByb2plY3Rpb24uc2NhbGUoMTUwICogaykudHJhbnNsYXRlKFt4LCB5XSk7XG4gIH0sIG9iamVjdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXRIZWlnaHQocHJvamVjdGlvbiwgaGVpZ2h0LCBvYmplY3QpIHtcbiAgcmV0dXJuIGZpdChwcm9qZWN0aW9uLCBmdW5jdGlvbihiKSB7XG4gICAgdmFyIGggPSAraGVpZ2h0LFxuICAgICAgICBrID0gaCAvIChiWzFdWzFdIC0gYlswXVsxXSksXG4gICAgICAgIHggPSAtayAqIGJbMF1bMF0sXG4gICAgICAgIHkgPSAoaCAtIGsgKiAoYlsxXVsxXSArIGJbMF1bMV0pKSAvIDI7XG4gICAgcHJvamVjdGlvbi5zY2FsZSgxNTAgKiBrKS50cmFuc2xhdGUoW3gsIHldKTtcbiAgfSwgb2JqZWN0KTtcbn1cbiIsImltcG9ydCBjbGlwQW50aW1lcmlkaWFuIGZyb20gXCIuLi9jbGlwL2FudGltZXJpZGlhbi5qc1wiO1xuaW1wb3J0IGNsaXBDaXJjbGUgZnJvbSBcIi4uL2NsaXAvY2lyY2xlLmpzXCI7XG5pbXBvcnQgY2xpcFJlY3RhbmdsZSBmcm9tIFwiLi4vY2xpcC9yZWN0YW5nbGUuanNcIjtcbmltcG9ydCBjb21wb3NlIGZyb20gXCIuLi9jb21wb3NlLmpzXCI7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSBcIi4uL2lkZW50aXR5LmpzXCI7XG5pbXBvcnQge2NvcywgZGVncmVlcywgcmFkaWFucywgc2luLCBzcXJ0fSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuaW1wb3J0IHtyb3RhdGVSYWRpYW5zfSBmcm9tIFwiLi4vcm90YXRpb24uanNcIjtcbmltcG9ydCB7dHJhbnNmb3JtZXJ9IGZyb20gXCIuLi90cmFuc2Zvcm0uanNcIjtcbmltcG9ydCB7Zml0RXh0ZW50LCBmaXRTaXplLCBmaXRXaWR0aCwgZml0SGVpZ2h0fSBmcm9tIFwiLi9maXQuanNcIjtcbmltcG9ydCByZXNhbXBsZSBmcm9tIFwiLi9yZXNhbXBsZS5qc1wiO1xuXG52YXIgdHJhbnNmb3JtUmFkaWFucyA9IHRyYW5zZm9ybWVyKHtcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB0aGlzLnN0cmVhbS5wb2ludCh4ICogcmFkaWFucywgeSAqIHJhZGlhbnMpO1xuICB9XG59KTtcblxuZnVuY3Rpb24gdHJhbnNmb3JtUm90YXRlKHJvdGF0ZSkge1xuICByZXR1cm4gdHJhbnNmb3JtZXIoe1xuICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgICB2YXIgciA9IHJvdGF0ZSh4LCB5KTtcbiAgICAgIHJldHVybiB0aGlzLnN0cmVhbS5wb2ludChyWzBdLCByWzFdKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzY2FsZVRyYW5zbGF0ZShrLCBkeCwgZHksIHN4LCBzeSkge1xuICBmdW5jdGlvbiB0cmFuc2Zvcm0oeCwgeSkge1xuICAgIHggKj0gc3g7IHkgKj0gc3k7XG4gICAgcmV0dXJuIFtkeCArIGsgKiB4LCBkeSAtIGsgKiB5XTtcbiAgfVxuICB0cmFuc2Zvcm0uaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkge1xuICAgIHJldHVybiBbKHggLSBkeCkgLyBrICogc3gsIChkeSAtIHkpIC8gayAqIHN5XTtcbiAgfTtcbiAgcmV0dXJuIHRyYW5zZm9ybTtcbn1cblxuZnVuY3Rpb24gc2NhbGVUcmFuc2xhdGVSb3RhdGUoaywgZHgsIGR5LCBzeCwgc3ksIGFscGhhKSB7XG4gIGlmICghYWxwaGEpIHJldHVybiBzY2FsZVRyYW5zbGF0ZShrLCBkeCwgZHksIHN4LCBzeSk7XG4gIHZhciBjb3NBbHBoYSA9IGNvcyhhbHBoYSksXG4gICAgICBzaW5BbHBoYSA9IHNpbihhbHBoYSksXG4gICAgICBhID0gY29zQWxwaGEgKiBrLFxuICAgICAgYiA9IHNpbkFscGhhICogayxcbiAgICAgIGFpID0gY29zQWxwaGEgLyBrLFxuICAgICAgYmkgPSBzaW5BbHBoYSAvIGssXG4gICAgICBjaSA9IChzaW5BbHBoYSAqIGR5IC0gY29zQWxwaGEgKiBkeCkgLyBrLFxuICAgICAgZmkgPSAoc2luQWxwaGEgKiBkeCArIGNvc0FscGhhICogZHkpIC8gaztcbiAgZnVuY3Rpb24gdHJhbnNmb3JtKHgsIHkpIHtcbiAgICB4ICo9IHN4OyB5ICo9IHN5O1xuICAgIHJldHVybiBbYSAqIHggLSBiICogeSArIGR4LCBkeSAtIGIgKiB4IC0gYSAqIHldO1xuICB9XG4gIHRyYW5zZm9ybS5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7XG4gICAgcmV0dXJuIFtzeCAqIChhaSAqIHggLSBiaSAqIHkgKyBjaSksIHN5ICogKGZpIC0gYmkgKiB4IC0gYWkgKiB5KV07XG4gIH07XG4gIHJldHVybiB0cmFuc2Zvcm07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHByb2plY3Rpb24ocHJvamVjdCkge1xuICByZXR1cm4gcHJvamVjdGlvbk11dGF0b3IoZnVuY3Rpb24oKSB7IHJldHVybiBwcm9qZWN0OyB9KSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvamVjdGlvbk11dGF0b3IocHJvamVjdEF0KSB7XG4gIHZhciBwcm9qZWN0LFxuICAgICAgayA9IDE1MCwgLy8gc2NhbGVcbiAgICAgIHggPSA0ODAsIHkgPSAyNTAsIC8vIHRyYW5zbGF0ZVxuICAgICAgbGFtYmRhID0gMCwgcGhpID0gMCwgLy8gY2VudGVyXG4gICAgICBkZWx0YUxhbWJkYSA9IDAsIGRlbHRhUGhpID0gMCwgZGVsdGFHYW1tYSA9IDAsIHJvdGF0ZSwgLy8gcHJlLXJvdGF0ZVxuICAgICAgYWxwaGEgPSAwLCAvLyBwb3N0LXJvdGF0ZSBhbmdsZVxuICAgICAgc3ggPSAxLCAvLyByZWZsZWN0WFxuICAgICAgc3kgPSAxLCAvLyByZWZsZWN0WFxuICAgICAgdGhldGEgPSBudWxsLCBwcmVjbGlwID0gY2xpcEFudGltZXJpZGlhbiwgLy8gcHJlLWNsaXAgYW5nbGVcbiAgICAgIHgwID0gbnVsbCwgeTAsIHgxLCB5MSwgcG9zdGNsaXAgPSBpZGVudGl0eSwgLy8gcG9zdC1jbGlwIGV4dGVudFxuICAgICAgZGVsdGEyID0gMC41LCAvLyBwcmVjaXNpb25cbiAgICAgIHByb2plY3RSZXNhbXBsZSxcbiAgICAgIHByb2plY3RUcmFuc2Zvcm0sXG4gICAgICBwcm9qZWN0Um90YXRlVHJhbnNmb3JtLFxuICAgICAgY2FjaGUsXG4gICAgICBjYWNoZVN0cmVhbTtcblxuICBmdW5jdGlvbiBwcm9qZWN0aW9uKHBvaW50KSB7XG4gICAgcmV0dXJuIHByb2plY3RSb3RhdGVUcmFuc2Zvcm0ocG9pbnRbMF0gKiByYWRpYW5zLCBwb2ludFsxXSAqIHJhZGlhbnMpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW52ZXJ0KHBvaW50KSB7XG4gICAgcG9pbnQgPSBwcm9qZWN0Um90YXRlVHJhbnNmb3JtLmludmVydChwb2ludFswXSwgcG9pbnRbMV0pO1xuICAgIHJldHVybiBwb2ludCAmJiBbcG9pbnRbMF0gKiBkZWdyZWVzLCBwb2ludFsxXSAqIGRlZ3JlZXNdO1xuICB9XG5cbiAgcHJvamVjdGlvbi5zdHJlYW0gPSBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICByZXR1cm4gY2FjaGUgJiYgY2FjaGVTdHJlYW0gPT09IHN0cmVhbSA/IGNhY2hlIDogY2FjaGUgPSB0cmFuc2Zvcm1SYWRpYW5zKHRyYW5zZm9ybVJvdGF0ZShyb3RhdGUpKHByZWNsaXAocHJvamVjdFJlc2FtcGxlKHBvc3RjbGlwKGNhY2hlU3RyZWFtID0gc3RyZWFtKSkpKSk7XG4gIH07XG5cbiAgcHJvamVjdGlvbi5wcmVjbGlwID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHByZWNsaXAgPSBfLCB0aGV0YSA9IHVuZGVmaW5lZCwgcmVzZXQoKSkgOiBwcmVjbGlwO1xuICB9O1xuXG4gIHByb2plY3Rpb24ucG9zdGNsaXAgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9zdGNsaXAgPSBfLCB4MCA9IHkwID0geDEgPSB5MSA9IG51bGwsIHJlc2V0KCkpIDogcG9zdGNsaXA7XG4gIH07XG5cbiAgcHJvamVjdGlvbi5jbGlwQW5nbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocHJlY2xpcCA9ICtfID8gY2xpcENpcmNsZSh0aGV0YSA9IF8gKiByYWRpYW5zKSA6ICh0aGV0YSA9IG51bGwsIGNsaXBBbnRpbWVyaWRpYW4pLCByZXNldCgpKSA6IHRoZXRhICogZGVncmVlcztcbiAgfTtcblxuICBwcm9qZWN0aW9uLmNsaXBFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9zdGNsaXAgPSBfID09IG51bGwgPyAoeDAgPSB5MCA9IHgxID0geTEgPSBudWxsLCBpZGVudGl0eSkgOiBjbGlwUmVjdGFuZ2xlKHgwID0gK19bMF1bMF0sIHkwID0gK19bMF1bMV0sIHgxID0gK19bMV1bMF0sIHkxID0gK19bMV1bMV0pLCByZXNldCgpKSA6IHgwID09IG51bGwgPyBudWxsIDogW1t4MCwgeTBdLCBbeDEsIHkxXV07XG4gIH07XG5cbiAgcHJvamVjdGlvbi5zY2FsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChrID0gK18sIHJlY2VudGVyKCkpIDogaztcbiAgfTtcblxuICBwcm9qZWN0aW9uLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gK19bMF0sIHkgPSArX1sxXSwgcmVjZW50ZXIoKSkgOiBbeCwgeV07XG4gIH07XG5cbiAgcHJvamVjdGlvbi5jZW50ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobGFtYmRhID0gX1swXSAlIDM2MCAqIHJhZGlhbnMsIHBoaSA9IF9bMV0gJSAzNjAgKiByYWRpYW5zLCByZWNlbnRlcigpKSA6IFtsYW1iZGEgKiBkZWdyZWVzLCBwaGkgKiBkZWdyZWVzXTtcbiAgfTtcblxuICBwcm9qZWN0aW9uLnJvdGF0ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkZWx0YUxhbWJkYSA9IF9bMF0gJSAzNjAgKiByYWRpYW5zLCBkZWx0YVBoaSA9IF9bMV0gJSAzNjAgKiByYWRpYW5zLCBkZWx0YUdhbW1hID0gXy5sZW5ndGggPiAyID8gX1syXSAlIDM2MCAqIHJhZGlhbnMgOiAwLCByZWNlbnRlcigpKSA6IFtkZWx0YUxhbWJkYSAqIGRlZ3JlZXMsIGRlbHRhUGhpICogZGVncmVlcywgZGVsdGFHYW1tYSAqIGRlZ3JlZXNdO1xuICB9O1xuXG4gIHByb2plY3Rpb24uYW5nbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGEgPSBfICUgMzYwICogcmFkaWFucywgcmVjZW50ZXIoKSkgOiBhbHBoYSAqIGRlZ3JlZXM7XG4gIH07XG5cbiAgcHJvamVjdGlvbi5yZWZsZWN0WCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzeCA9IF8gPyAtMSA6IDEsIHJlY2VudGVyKCkpIDogc3ggPCAwO1xuICB9O1xuXG4gIHByb2plY3Rpb24ucmVmbGVjdFkgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3kgPSBfID8gLTEgOiAxLCByZWNlbnRlcigpKSA6IHN5IDwgMDtcbiAgfTtcblxuICBwcm9qZWN0aW9uLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwcm9qZWN0UmVzYW1wbGUgPSByZXNhbXBsZShwcm9qZWN0VHJhbnNmb3JtLCBkZWx0YTIgPSBfICogXyksIHJlc2V0KCkpIDogc3FydChkZWx0YTIpO1xuICB9O1xuXG4gIHByb2plY3Rpb24uZml0RXh0ZW50ID0gZnVuY3Rpb24oZXh0ZW50LCBvYmplY3QpIHtcbiAgICByZXR1cm4gZml0RXh0ZW50KHByb2plY3Rpb24sIGV4dGVudCwgb2JqZWN0KTtcbiAgfTtcblxuICBwcm9qZWN0aW9uLmZpdFNpemUgPSBmdW5jdGlvbihzaXplLCBvYmplY3QpIHtcbiAgICByZXR1cm4gZml0U2l6ZShwcm9qZWN0aW9uLCBzaXplLCBvYmplY3QpO1xuICB9O1xuXG4gIHByb2plY3Rpb24uZml0V2lkdGggPSBmdW5jdGlvbih3aWR0aCwgb2JqZWN0KSB7XG4gICAgcmV0dXJuIGZpdFdpZHRoKHByb2plY3Rpb24sIHdpZHRoLCBvYmplY3QpO1xuICB9O1xuXG4gIHByb2plY3Rpb24uZml0SGVpZ2h0ID0gZnVuY3Rpb24oaGVpZ2h0LCBvYmplY3QpIHtcbiAgICByZXR1cm4gZml0SGVpZ2h0KHByb2plY3Rpb24sIGhlaWdodCwgb2JqZWN0KTtcbiAgfTtcblxuICBmdW5jdGlvbiByZWNlbnRlcigpIHtcbiAgICB2YXIgY2VudGVyID0gc2NhbGVUcmFuc2xhdGVSb3RhdGUoaywgMCwgMCwgc3gsIHN5LCBhbHBoYSkuYXBwbHkobnVsbCwgcHJvamVjdChsYW1iZGEsIHBoaSkpLFxuICAgICAgICB0cmFuc2Zvcm0gPSBzY2FsZVRyYW5zbGF0ZVJvdGF0ZShrLCB4IC0gY2VudGVyWzBdLCB5IC0gY2VudGVyWzFdLCBzeCwgc3ksIGFscGhhKTtcbiAgICByb3RhdGUgPSByb3RhdGVSYWRpYW5zKGRlbHRhTGFtYmRhLCBkZWx0YVBoaSwgZGVsdGFHYW1tYSk7XG4gICAgcHJvamVjdFRyYW5zZm9ybSA9IGNvbXBvc2UocHJvamVjdCwgdHJhbnNmb3JtKTtcbiAgICBwcm9qZWN0Um90YXRlVHJhbnNmb3JtID0gY29tcG9zZShyb3RhdGUsIHByb2plY3RUcmFuc2Zvcm0pO1xuICAgIHByb2plY3RSZXNhbXBsZSA9IHJlc2FtcGxlKHByb2plY3RUcmFuc2Zvcm0sIGRlbHRhMik7XG4gICAgcmV0dXJuIHJlc2V0KCk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldCgpIHtcbiAgICBjYWNoZSA9IGNhY2hlU3RyZWFtID0gbnVsbDtcbiAgICByZXR1cm4gcHJvamVjdGlvbjtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBwcm9qZWN0ID0gcHJvamVjdEF0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgcHJvamVjdGlvbi5pbnZlcnQgPSBwcm9qZWN0LmludmVydCAmJiBpbnZlcnQ7XG4gICAgcmV0dXJuIHJlY2VudGVyKCk7XG4gIH07XG59XG4iLCJpbXBvcnQge2NhcnRlc2lhbn0gZnJvbSBcIi4uL2NhcnRlc2lhbi5qc1wiO1xuaW1wb3J0IHthYnMsIGFzaW4sIGF0YW4yLCBjb3MsIGVwc2lsb24sIHJhZGlhbnMsIHNxcnR9IGZyb20gXCIuLi9tYXRoLmpzXCI7XG5pbXBvcnQge3RyYW5zZm9ybWVyfSBmcm9tIFwiLi4vdHJhbnNmb3JtLmpzXCI7XG5cbnZhciBtYXhEZXB0aCA9IDE2LCAvLyBtYXhpbXVtIGRlcHRoIG9mIHN1YmRpdmlzaW9uXG4gICAgY29zTWluRGlzdGFuY2UgPSBjb3MoMzAgKiByYWRpYW5zKTsgLy8gY29zKG1pbmltdW0gYW5ndWxhciBkaXN0YW5jZSlcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocHJvamVjdCwgZGVsdGEyKSB7XG4gIHJldHVybiArZGVsdGEyID8gcmVzYW1wbGUocHJvamVjdCwgZGVsdGEyKSA6IHJlc2FtcGxlTm9uZShwcm9qZWN0KTtcbn1cblxuZnVuY3Rpb24gcmVzYW1wbGVOb25lKHByb2plY3QpIHtcbiAgcmV0dXJuIHRyYW5zZm9ybWVyKHtcbiAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgICAgeCA9IHByb2plY3QoeCwgeSk7XG4gICAgICB0aGlzLnN0cmVhbS5wb2ludCh4WzBdLCB4WzFdKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXNhbXBsZShwcm9qZWN0LCBkZWx0YTIpIHtcblxuICBmdW5jdGlvbiByZXNhbXBsZUxpbmVUbyh4MCwgeTAsIGxhbWJkYTAsIGEwLCBiMCwgYzAsIHgxLCB5MSwgbGFtYmRhMSwgYTEsIGIxLCBjMSwgZGVwdGgsIHN0cmVhbSkge1xuICAgIHZhciBkeCA9IHgxIC0geDAsXG4gICAgICAgIGR5ID0geTEgLSB5MCxcbiAgICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgICBpZiAoZDIgPiA0ICogZGVsdGEyICYmIGRlcHRoLS0pIHtcbiAgICAgIHZhciBhID0gYTAgKyBhMSxcbiAgICAgICAgICBiID0gYjAgKyBiMSxcbiAgICAgICAgICBjID0gYzAgKyBjMSxcbiAgICAgICAgICBtID0gc3FydChhICogYSArIGIgKiBiICsgYyAqIGMpLFxuICAgICAgICAgIHBoaTIgPSBhc2luKGMgLz0gbSksXG4gICAgICAgICAgbGFtYmRhMiA9IGFicyhhYnMoYykgLSAxKSA8IGVwc2lsb24gfHwgYWJzKGxhbWJkYTAgLSBsYW1iZGExKSA8IGVwc2lsb24gPyAobGFtYmRhMCArIGxhbWJkYTEpIC8gMiA6IGF0YW4yKGIsIGEpLFxuICAgICAgICAgIHAgPSBwcm9qZWN0KGxhbWJkYTIsIHBoaTIpLFxuICAgICAgICAgIHgyID0gcFswXSxcbiAgICAgICAgICB5MiA9IHBbMV0sXG4gICAgICAgICAgZHgyID0geDIgLSB4MCxcbiAgICAgICAgICBkeTIgPSB5MiAtIHkwLFxuICAgICAgICAgIGR6ID0gZHkgKiBkeDIgLSBkeCAqIGR5MjtcbiAgICAgIGlmIChkeiAqIGR6IC8gZDIgPiBkZWx0YTIgLy8gcGVycGVuZGljdWxhciBwcm9qZWN0ZWQgZGlzdGFuY2VcbiAgICAgICAgICB8fCBhYnMoKGR4ICogZHgyICsgZHkgKiBkeTIpIC8gZDIgLSAwLjUpID4gMC4zIC8vIG1pZHBvaW50IGNsb3NlIHRvIGFuIGVuZFxuICAgICAgICAgIHx8IGEwICogYTEgKyBiMCAqIGIxICsgYzAgKiBjMSA8IGNvc01pbkRpc3RhbmNlKSB7IC8vIGFuZ3VsYXIgZGlzdGFuY2VcbiAgICAgICAgcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCBsYW1iZGEwLCBhMCwgYjAsIGMwLCB4MiwgeTIsIGxhbWJkYTIsIGEgLz0gbSwgYiAvPSBtLCBjLCBkZXB0aCwgc3RyZWFtKTtcbiAgICAgICAgc3RyZWFtLnBvaW50KHgyLCB5Mik7XG4gICAgICAgIHJlc2FtcGxlTGluZVRvKHgyLCB5MiwgbGFtYmRhMiwgYSwgYiwgYywgeDEsIHkxLCBsYW1iZGExLCBhMSwgYjEsIGMxLCBkZXB0aCwgc3RyZWFtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgIHZhciBsYW1iZGEwMCwgeDAwLCB5MDAsIGEwMCwgYjAwLCBjMDAsIC8vIGZpcnN0IHBvaW50XG4gICAgICAgIGxhbWJkYTAsIHgwLCB5MCwgYTAsIGIwLCBjMDsgLy8gcHJldmlvdXMgcG9pbnRcblxuICAgIHZhciByZXNhbXBsZVN0cmVhbSA9IHtcbiAgICAgIHBvaW50OiBwb2ludCxcbiAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LFxuICAgICAgbGluZUVuZDogbGluZUVuZCxcbiAgICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7IHN0cmVhbS5wb2x5Z29uU3RhcnQoKTsgcmVzYW1wbGVTdHJlYW0ubGluZVN0YXJ0ID0gcmluZ1N0YXJ0OyB9LFxuICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7IHN0cmVhbS5wb2x5Z29uRW5kKCk7IHJlc2FtcGxlU3RyZWFtLmxpbmVTdGFydCA9IGxpbmVTdGFydDsgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBwb2ludCh4LCB5KSB7XG4gICAgICB4ID0gcHJvamVjdCh4LCB5KTtcbiAgICAgIHN0cmVhbS5wb2ludCh4WzBdLCB4WzFdKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaW5lU3RhcnQoKSB7XG4gICAgICB4MCA9IE5hTjtcbiAgICAgIHJlc2FtcGxlU3RyZWFtLnBvaW50ID0gbGluZVBvaW50O1xuICAgICAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpbmVQb2ludChsYW1iZGEsIHBoaSkge1xuICAgICAgdmFyIGMgPSBjYXJ0ZXNpYW4oW2xhbWJkYSwgcGhpXSksIHAgPSBwcm9qZWN0KGxhbWJkYSwgcGhpKTtcbiAgICAgIHJlc2FtcGxlTGluZVRvKHgwLCB5MCwgbGFtYmRhMCwgYTAsIGIwLCBjMCwgeDAgPSBwWzBdLCB5MCA9IHBbMV0sIGxhbWJkYTAgPSBsYW1iZGEsIGEwID0gY1swXSwgYjAgPSBjWzFdLCBjMCA9IGNbMl0sIG1heERlcHRoLCBzdHJlYW0pO1xuICAgICAgc3RyZWFtLnBvaW50KHgwLCB5MCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGluZUVuZCgpIHtcbiAgICAgIHJlc2FtcGxlU3RyZWFtLnBvaW50ID0gcG9pbnQ7XG4gICAgICBzdHJlYW0ubGluZUVuZCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJpbmdTdGFydCgpIHtcbiAgICAgIGxpbmVTdGFydCgpO1xuICAgICAgcmVzYW1wbGVTdHJlYW0ucG9pbnQgPSByaW5nUG9pbnQ7XG4gICAgICByZXNhbXBsZVN0cmVhbS5saW5lRW5kID0gcmluZ0VuZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByaW5nUG9pbnQobGFtYmRhLCBwaGkpIHtcbiAgICAgIGxpbmVQb2ludChsYW1iZGEwMCA9IGxhbWJkYSwgcGhpKSwgeDAwID0geDAsIHkwMCA9IHkwLCBhMDAgPSBhMCwgYjAwID0gYjAsIGMwMCA9IGMwO1xuICAgICAgcmVzYW1wbGVTdHJlYW0ucG9pbnQgPSBsaW5lUG9pbnQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmluZ0VuZCgpIHtcbiAgICAgIHJlc2FtcGxlTGluZVRvKHgwLCB5MCwgbGFtYmRhMCwgYTAsIGIwLCBjMCwgeDAwLCB5MDAsIGxhbWJkYTAwLCBhMDAsIGIwMCwgYzAwLCBtYXhEZXB0aCwgc3RyZWFtKTtcbiAgICAgIHJlc2FtcGxlU3RyZWFtLmxpbmVFbmQgPSBsaW5lRW5kO1xuICAgICAgbGluZUVuZCgpO1xuICAgIH1cblxuICAgIHJldHVybiByZXNhbXBsZVN0cmVhbTtcbiAgfTtcbn1cbiIsImltcG9ydCBjb21wb3NlIGZyb20gXCIuL2NvbXBvc2UuanNcIjtcbmltcG9ydCB7YWJzLCBhc2luLCBhdGFuMiwgY29zLCBkZWdyZWVzLCBwaSwgcmFkaWFucywgc2luLCB0YXV9IGZyb20gXCIuL21hdGguanNcIjtcblxuZnVuY3Rpb24gcm90YXRpb25JZGVudGl0eShsYW1iZGEsIHBoaSkge1xuICBpZiAoYWJzKGxhbWJkYSkgPiBwaSkgbGFtYmRhIC09IE1hdGgucm91bmQobGFtYmRhIC8gdGF1KSAqIHRhdTtcbiAgcmV0dXJuIFtsYW1iZGEsIHBoaV07XG59XG5cbnJvdGF0aW9uSWRlbnRpdHkuaW52ZXJ0ID0gcm90YXRpb25JZGVudGl0eTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVJhZGlhbnMoZGVsdGFMYW1iZGEsIGRlbHRhUGhpLCBkZWx0YUdhbW1hKSB7XG4gIHJldHVybiAoZGVsdGFMYW1iZGEgJT0gdGF1KSA/IChkZWx0YVBoaSB8fCBkZWx0YUdhbW1hID8gY29tcG9zZShyb3RhdGlvbkxhbWJkYShkZWx0YUxhbWJkYSksIHJvdGF0aW9uUGhpR2FtbWEoZGVsdGFQaGksIGRlbHRhR2FtbWEpKVxuICAgIDogcm90YXRpb25MYW1iZGEoZGVsdGFMYW1iZGEpKVxuICAgIDogKGRlbHRhUGhpIHx8IGRlbHRhR2FtbWEgPyByb3RhdGlvblBoaUdhbW1hKGRlbHRhUGhpLCBkZWx0YUdhbW1hKVxuICAgIDogcm90YXRpb25JZGVudGl0eSk7XG59XG5cbmZ1bmN0aW9uIGZvcndhcmRSb3RhdGlvbkxhbWJkYShkZWx0YUxhbWJkYSkge1xuICByZXR1cm4gZnVuY3Rpb24obGFtYmRhLCBwaGkpIHtcbiAgICBsYW1iZGEgKz0gZGVsdGFMYW1iZGE7XG4gICAgaWYgKGFicyhsYW1iZGEpID4gcGkpIGxhbWJkYSAtPSBNYXRoLnJvdW5kKGxhbWJkYSAvIHRhdSkgKiB0YXU7XG4gICAgcmV0dXJuIFtsYW1iZGEsIHBoaV07XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJvdGF0aW9uTGFtYmRhKGRlbHRhTGFtYmRhKSB7XG4gIHZhciByb3RhdGlvbiA9IGZvcndhcmRSb3RhdGlvbkxhbWJkYShkZWx0YUxhbWJkYSk7XG4gIHJvdGF0aW9uLmludmVydCA9IGZvcndhcmRSb3RhdGlvbkxhbWJkYSgtZGVsdGFMYW1iZGEpO1xuICByZXR1cm4gcm90YXRpb247XG59XG5cbmZ1bmN0aW9uIHJvdGF0aW9uUGhpR2FtbWEoZGVsdGFQaGksIGRlbHRhR2FtbWEpIHtcbiAgdmFyIGNvc0RlbHRhUGhpID0gY29zKGRlbHRhUGhpKSxcbiAgICAgIHNpbkRlbHRhUGhpID0gc2luKGRlbHRhUGhpKSxcbiAgICAgIGNvc0RlbHRhR2FtbWEgPSBjb3MoZGVsdGFHYW1tYSksXG4gICAgICBzaW5EZWx0YUdhbW1hID0gc2luKGRlbHRhR2FtbWEpO1xuXG4gIGZ1bmN0aW9uIHJvdGF0aW9uKGxhbWJkYSwgcGhpKSB7XG4gICAgdmFyIGNvc1BoaSA9IGNvcyhwaGkpLFxuICAgICAgICB4ID0gY29zKGxhbWJkYSkgKiBjb3NQaGksXG4gICAgICAgIHkgPSBzaW4obGFtYmRhKSAqIGNvc1BoaSxcbiAgICAgICAgeiA9IHNpbihwaGkpLFxuICAgICAgICBrID0geiAqIGNvc0RlbHRhUGhpICsgeCAqIHNpbkRlbHRhUGhpO1xuICAgIHJldHVybiBbXG4gICAgICBhdGFuMih5ICogY29zRGVsdGFHYW1tYSAtIGsgKiBzaW5EZWx0YUdhbW1hLCB4ICogY29zRGVsdGFQaGkgLSB6ICogc2luRGVsdGFQaGkpLFxuICAgICAgYXNpbihrICogY29zRGVsdGFHYW1tYSArIHkgKiBzaW5EZWx0YUdhbW1hKVxuICAgIF07XG4gIH1cblxuICByb3RhdGlvbi5pbnZlcnQgPSBmdW5jdGlvbihsYW1iZGEsIHBoaSkge1xuICAgIHZhciBjb3NQaGkgPSBjb3MocGhpKSxcbiAgICAgICAgeCA9IGNvcyhsYW1iZGEpICogY29zUGhpLFxuICAgICAgICB5ID0gc2luKGxhbWJkYSkgKiBjb3NQaGksXG4gICAgICAgIHogPSBzaW4ocGhpKSxcbiAgICAgICAgayA9IHogKiBjb3NEZWx0YUdhbW1hIC0geSAqIHNpbkRlbHRhR2FtbWE7XG4gICAgcmV0dXJuIFtcbiAgICAgIGF0YW4yKHkgKiBjb3NEZWx0YUdhbW1hICsgeiAqIHNpbkRlbHRhR2FtbWEsIHggKiBjb3NEZWx0YVBoaSArIGsgKiBzaW5EZWx0YVBoaSksXG4gICAgICBhc2luKGsgKiBjb3NEZWx0YVBoaSAtIHggKiBzaW5EZWx0YVBoaSlcbiAgICBdO1xuICB9O1xuXG4gIHJldHVybiByb3RhdGlvbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocm90YXRlKSB7XG4gIHJvdGF0ZSA9IHJvdGF0ZVJhZGlhbnMocm90YXRlWzBdICogcmFkaWFucywgcm90YXRlWzFdICogcmFkaWFucywgcm90YXRlLmxlbmd0aCA+IDIgPyByb3RhdGVbMl0gKiByYWRpYW5zIDogMCk7XG5cbiAgZnVuY3Rpb24gZm9yd2FyZChjb29yZGluYXRlcykge1xuICAgIGNvb3JkaW5hdGVzID0gcm90YXRlKGNvb3JkaW5hdGVzWzBdICogcmFkaWFucywgY29vcmRpbmF0ZXNbMV0gKiByYWRpYW5zKTtcbiAgICByZXR1cm4gY29vcmRpbmF0ZXNbMF0gKj0gZGVncmVlcywgY29vcmRpbmF0ZXNbMV0gKj0gZGVncmVlcywgY29vcmRpbmF0ZXM7XG4gIH1cblxuICBmb3J3YXJkLmludmVydCA9IGZ1bmN0aW9uKGNvb3JkaW5hdGVzKSB7XG4gICAgY29vcmRpbmF0ZXMgPSByb3RhdGUuaW52ZXJ0KGNvb3JkaW5hdGVzWzBdICogcmFkaWFucywgY29vcmRpbmF0ZXNbMV0gKiByYWRpYW5zKTtcbiAgICByZXR1cm4gY29vcmRpbmF0ZXNbMF0gKj0gZGVncmVlcywgY29vcmRpbmF0ZXNbMV0gKj0gZGVncmVlcywgY29vcmRpbmF0ZXM7XG4gIH07XG5cbiAgcmV0dXJuIGZvcndhcmQ7XG59XG4iLCJmdW5jdGlvbiBzdHJlYW1HZW9tZXRyeShnZW9tZXRyeSwgc3RyZWFtKSB7XG4gIGlmIChnZW9tZXRyeSAmJiBzdHJlYW1HZW9tZXRyeVR5cGUuaGFzT3duUHJvcGVydHkoZ2VvbWV0cnkudHlwZSkpIHtcbiAgICBzdHJlYW1HZW9tZXRyeVR5cGVbZ2VvbWV0cnkudHlwZV0oZ2VvbWV0cnksIHN0cmVhbSk7XG4gIH1cbn1cblxudmFyIHN0cmVhbU9iamVjdFR5cGUgPSB7XG4gIEZlYXR1cmU6IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7XG4gICAgc3RyZWFtR2VvbWV0cnkob2JqZWN0Lmdlb21ldHJ5LCBzdHJlYW0pO1xuICB9LFxuICBGZWF0dXJlQ29sbGVjdGlvbjogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHtcbiAgICB2YXIgZmVhdHVyZXMgPSBvYmplY3QuZmVhdHVyZXMsIGkgPSAtMSwgbiA9IGZlYXR1cmVzLmxlbmd0aDtcbiAgICB3aGlsZSAoKytpIDwgbikgc3RyZWFtR2VvbWV0cnkoZmVhdHVyZXNbaV0uZ2VvbWV0cnksIHN0cmVhbSk7XG4gIH1cbn07XG5cbnZhciBzdHJlYW1HZW9tZXRyeVR5cGUgPSB7XG4gIFNwaGVyZTogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHtcbiAgICBzdHJlYW0uc3BoZXJlKCk7XG4gIH0sXG4gIFBvaW50OiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkge1xuICAgIG9iamVjdCA9IG9iamVjdC5jb29yZGluYXRlcztcbiAgICBzdHJlYW0ucG9pbnQob2JqZWN0WzBdLCBvYmplY3RbMV0sIG9iamVjdFsyXSk7XG4gIH0sXG4gIE11bHRpUG9pbnQ6IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7XG4gICAgdmFyIGNvb3JkaW5hdGVzID0gb2JqZWN0LmNvb3JkaW5hdGVzLCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIG9iamVjdCA9IGNvb3JkaW5hdGVzW2ldLCBzdHJlYW0ucG9pbnQob2JqZWN0WzBdLCBvYmplY3RbMV0sIG9iamVjdFsyXSk7XG4gIH0sXG4gIExpbmVTdHJpbmc6IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7XG4gICAgc3RyZWFtTGluZShvYmplY3QuY29vcmRpbmF0ZXMsIHN0cmVhbSwgMCk7XG4gIH0sXG4gIE11bHRpTGluZVN0cmluZzogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHtcbiAgICB2YXIgY29vcmRpbmF0ZXMgPSBvYmplY3QuY29vcmRpbmF0ZXMsIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDtcbiAgICB3aGlsZSAoKytpIDwgbikgc3RyZWFtTGluZShjb29yZGluYXRlc1tpXSwgc3RyZWFtLCAwKTtcbiAgfSxcbiAgUG9seWdvbjogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHtcbiAgICBzdHJlYW1Qb2x5Z29uKG9iamVjdC5jb29yZGluYXRlcywgc3RyZWFtKTtcbiAgfSxcbiAgTXVsdGlQb2x5Z29uOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkge1xuICAgIHZhciBjb29yZGluYXRlcyA9IG9iamVjdC5jb29yZGluYXRlcywgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSBzdHJlYW1Qb2x5Z29uKGNvb3JkaW5hdGVzW2ldLCBzdHJlYW0pO1xuICB9LFxuICBHZW9tZXRyeUNvbGxlY3Rpb246IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7XG4gICAgdmFyIGdlb21ldHJpZXMgPSBvYmplY3QuZ2VvbWV0cmllcywgaSA9IC0xLCBuID0gZ2VvbWV0cmllcy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIHN0cmVhbUdlb21ldHJ5KGdlb21ldHJpZXNbaV0sIHN0cmVhbSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHN0cmVhbUxpbmUoY29vcmRpbmF0ZXMsIHN0cmVhbSwgY2xvc2VkKSB7XG4gIHZhciBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGggLSBjbG9zZWQsIGNvb3JkaW5hdGU7XG4gIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgd2hpbGUgKCsraSA8IG4pIGNvb3JkaW5hdGUgPSBjb29yZGluYXRlc1tpXSwgc3RyZWFtLnBvaW50KGNvb3JkaW5hdGVbMF0sIGNvb3JkaW5hdGVbMV0sIGNvb3JkaW5hdGVbMl0pO1xuICBzdHJlYW0ubGluZUVuZCgpO1xufVxuXG5mdW5jdGlvbiBzdHJlYW1Qb2x5Z29uKGNvb3JkaW5hdGVzLCBzdHJlYW0pIHtcbiAgdmFyIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDtcbiAgc3RyZWFtLnBvbHlnb25TdGFydCgpO1xuICB3aGlsZSAoKytpIDwgbikgc3RyZWFtTGluZShjb29yZGluYXRlc1tpXSwgc3RyZWFtLCAxKTtcbiAgc3RyZWFtLnBvbHlnb25FbmQoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHtcbiAgaWYgKG9iamVjdCAmJiBzdHJlYW1PYmplY3RUeXBlLmhhc093blByb3BlcnR5KG9iamVjdC50eXBlKSkge1xuICAgIHN0cmVhbU9iamVjdFR5cGVbb2JqZWN0LnR5cGVdKG9iamVjdCwgc3RyZWFtKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJlYW1HZW9tZXRyeShvYmplY3QsIHN0cmVhbSk7XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1ldGhvZHMpIHtcbiAgcmV0dXJuIHtcbiAgICBzdHJlYW06IHRyYW5zZm9ybWVyKG1ldGhvZHMpXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1lcihtZXRob2RzKSB7XG4gIHJldHVybiBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICB2YXIgcyA9IG5ldyBUcmFuc2Zvcm1TdHJlYW07XG4gICAgZm9yICh2YXIga2V5IGluIG1ldGhvZHMpIHNba2V5XSA9IG1ldGhvZHNba2V5XTtcbiAgICBzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICByZXR1cm4gcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtKCkge31cblxuVHJhbnNmb3JtU3RyZWFtLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zZm9ybVN0cmVhbSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsgdGhpcy5zdHJlYW0ucG9pbnQoeCwgeSk7IH0sXG4gIHNwaGVyZTogZnVuY3Rpb24oKSB7IHRoaXMuc3RyZWFtLnNwaGVyZSgpOyB9LFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgeyB0aGlzLnN0cmVhbS5saW5lU3RhcnQoKTsgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7IHRoaXMuc3RyZWFtLmxpbmVFbmQoKTsgfSxcbiAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsgdGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCk7IH0sXG4gIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgeyB0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCk7IH1cbn07XG4iLCJleHBvcnQgZnVuY3Rpb24gYmFzaXModDEsIHYwLCB2MSwgdjIsIHYzKSB7XG4gIHZhciB0MiA9IHQxICogdDEsIHQzID0gdDIgKiB0MTtcbiAgcmV0dXJuICgoMSAtIDMgKiB0MSArIDMgKiB0MiAtIHQzKSAqIHYwXG4gICAgICArICg0IC0gNiAqIHQyICsgMyAqIHQzKSAqIHYxXG4gICAgICArICgxICsgMyAqIHQxICsgMyAqIHQyIC0gMyAqIHQzKSAqIHYyXG4gICAgICArIHQzICogdjMpIC8gNjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzKSB7XG4gIHZhciBuID0gdmFsdWVzLmxlbmd0aCAtIDE7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSB0IDw9IDAgPyAodCA9IDApIDogdCA+PSAxID8gKHQgPSAxLCBuIC0gMSkgOiBNYXRoLmZsb29yKHQgKiBuKSxcbiAgICAgICAgdjEgPSB2YWx1ZXNbaV0sXG4gICAgICAgIHYyID0gdmFsdWVzW2kgKyAxXSxcbiAgICAgICAgdjAgPSBpID4gMCA/IHZhbHVlc1tpIC0gMV0gOiAyICogdjEgLSB2MixcbiAgICAgICAgdjMgPSBpIDwgbiAtIDEgPyB2YWx1ZXNbaSArIDJdIDogMiAqIHYyIC0gdjE7XG4gICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtiYXNpc30gZnJvbSBcIi4vYmFzaXMuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzKSB7XG4gIHZhciBuID0gdmFsdWVzLmxlbmd0aDtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IE1hdGguZmxvb3IoKCh0ICU9IDEpIDwgMCA/ICsrdCA6IHQpICogbiksXG4gICAgICAgIHYwID0gdmFsdWVzWyhpICsgbiAtIDEpICUgbl0sXG4gICAgICAgIHYxID0gdmFsdWVzW2kgJSBuXSxcbiAgICAgICAgdjIgPSB2YWx1ZXNbKGkgKyAxKSAlIG5dLFxuICAgICAgICB2MyA9IHZhbHVlc1soaSArIDIpICUgbl07XG4gICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpO1xuICB9O1xufVxuIiwiaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5cbmZ1bmN0aW9uIGxpbmVhcihhLCBkKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGEgKyB0ICogZDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZXhwb25lbnRpYWwoYSwgYiwgeSkge1xuICByZXR1cm4gYSA9IE1hdGgucG93KGEsIHkpLCBiID0gTWF0aC5wb3coYiwgeSkgLSBhLCB5ID0gMSAvIHksIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gTWF0aC5wb3coYSArIHQgKiBiLCB5KTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGh1ZShhLCBiKSB7XG4gIHZhciBkID0gYiAtIGE7XG4gIHJldHVybiBkID8gbGluZWFyKGEsIGQgPiAxODAgfHwgZCA8IC0xODAgPyBkIC0gMzYwICogTWF0aC5yb3VuZChkIC8gMzYwKSA6IGQpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnYW1tYSh5KSB7XG4gIHJldHVybiAoeSA9ICt5KSA9PT0gMSA/IG5vZ2FtbWEgOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGIgLSBhID8gZXhwb25lbnRpYWwoYSwgYiwgeSkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbm9nYW1tYShhLCBiKSB7XG4gIHZhciBkID0gYiAtIGE7XG4gIHJldHVybiBkID8gbGluZWFyKGEsIGQpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCB4ID0+ICgpID0+IHg7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHJldHVybiBhID0gK2EsIGIgPSArYiwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBhICogKDEgLSB0KSArIGIgKiB0O1xuICB9O1xufVxuIiwiaW1wb3J0IHtyZ2IgYXMgY29sb3JSZ2J9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IGJhc2lzIGZyb20gXCIuL2Jhc2lzLmpzXCI7XG5pbXBvcnQgYmFzaXNDbG9zZWQgZnJvbSBcIi4vYmFzaXNDbG9zZWQuanNcIjtcbmltcG9ydCBub2dhbW1hLCB7Z2FtbWF9IGZyb20gXCIuL2NvbG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiByZ2JHYW1tYSh5KSB7XG4gIHZhciBjb2xvciA9IGdhbW1hKHkpO1xuXG4gIGZ1bmN0aW9uIHJnYihzdGFydCwgZW5kKSB7XG4gICAgdmFyIHIgPSBjb2xvcigoc3RhcnQgPSBjb2xvclJnYihzdGFydCkpLnIsIChlbmQgPSBjb2xvclJnYihlbmQpKS5yKSxcbiAgICAgICAgZyA9IGNvbG9yKHN0YXJ0LmcsIGVuZC5nKSxcbiAgICAgICAgYiA9IGNvbG9yKHN0YXJ0LmIsIGVuZC5iKSxcbiAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICBzdGFydC5yID0gcih0KTtcbiAgICAgIHN0YXJ0LmcgPSBnKHQpO1xuICAgICAgc3RhcnQuYiA9IGIodCk7XG4gICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTtcbiAgICAgIHJldHVybiBzdGFydCArIFwiXCI7XG4gICAgfTtcbiAgfVxuXG4gIHJnYi5nYW1tYSA9IHJnYkdhbW1hO1xuXG4gIHJldHVybiByZ2I7XG59KSgxKTtcblxuZnVuY3Rpb24gcmdiU3BsaW5lKHNwbGluZSkge1xuICByZXR1cm4gZnVuY3Rpb24oY29sb3JzKSB7XG4gICAgdmFyIG4gPSBjb2xvcnMubGVuZ3RoLFxuICAgICAgICByID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBnID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBiID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBpLCBjb2xvcjtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBjb2xvciA9IGNvbG9yUmdiKGNvbG9yc1tpXSk7XG4gICAgICByW2ldID0gY29sb3IuciB8fCAwO1xuICAgICAgZ1tpXSA9IGNvbG9yLmcgfHwgMDtcbiAgICAgIGJbaV0gPSBjb2xvci5iIHx8IDA7XG4gICAgfVxuICAgIHIgPSBzcGxpbmUocik7XG4gICAgZyA9IHNwbGluZShnKTtcbiAgICBiID0gc3BsaW5lKGIpO1xuICAgIGNvbG9yLm9wYWNpdHkgPSAxO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICBjb2xvci5yID0gcih0KTtcbiAgICAgIGNvbG9yLmcgPSBnKHQpO1xuICAgICAgY29sb3IuYiA9IGIodCk7XG4gICAgICByZXR1cm4gY29sb3IgKyBcIlwiO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB2YXIgcmdiQmFzaXMgPSByZ2JTcGxpbmUoYmFzaXMpO1xuZXhwb3J0IHZhciByZ2JCYXNpc0Nsb3NlZCA9IHJnYlNwbGluZShiYXNpc0Nsb3NlZCk7XG4iLCJpbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlci5qc1wiO1xuXG52YXIgcmVBID0gL1stK10/KD86XFxkK1xcLj9cXGQqfFxcLj9cXGQrKSg/OltlRV1bLStdP1xcZCspPy9nLFxuICAgIHJlQiA9IG5ldyBSZWdFeHAocmVBLnNvdXJjZSwgXCJnXCIpO1xuXG5mdW5jdGlvbiB6ZXJvKGIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBiO1xuICB9O1xufVxuXG5mdW5jdGlvbiBvbmUoYikge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBiKHQpICsgXCJcIjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgYmkgPSByZUEubGFzdEluZGV4ID0gcmVCLmxhc3RJbmRleCA9IDAsIC8vIHNjYW4gaW5kZXggZm9yIG5leHQgbnVtYmVyIGluIGJcbiAgICAgIGFtLCAvLyBjdXJyZW50IG1hdGNoIGluIGFcbiAgICAgIGJtLCAvLyBjdXJyZW50IG1hdGNoIGluIGJcbiAgICAgIGJzLCAvLyBzdHJpbmcgcHJlY2VkaW5nIGN1cnJlbnQgbnVtYmVyIGluIGIsIGlmIGFueVxuICAgICAgaSA9IC0xLCAvLyBpbmRleCBpbiBzXG4gICAgICBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJwb2xhdG9yc1xuXG4gIC8vIENvZXJjZSBpbnB1dHMgdG8gc3RyaW5ncy5cbiAgYSA9IGEgKyBcIlwiLCBiID0gYiArIFwiXCI7XG5cbiAgLy8gSW50ZXJwb2xhdGUgcGFpcnMgb2YgbnVtYmVycyBpbiBhICYgYi5cbiAgd2hpbGUgKChhbSA9IHJlQS5leGVjKGEpKVxuICAgICAgJiYgKGJtID0gcmVCLmV4ZWMoYikpKSB7XG4gICAgaWYgKChicyA9IGJtLmluZGV4KSA+IGJpKSB7IC8vIGEgc3RyaW5nIHByZWNlZGVzIHRoZSBuZXh0IG51bWJlciBpbiBiXG4gICAgICBicyA9IGIuc2xpY2UoYmksIGJzKTtcbiAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZ1xuICAgICAgZWxzZSBzWysraV0gPSBicztcbiAgICB9XG4gICAgaWYgKChhbSA9IGFtWzBdKSA9PT0gKGJtID0gYm1bMF0pKSB7IC8vIG51bWJlcnMgaW4gYSAmIGIgbWF0Y2hcbiAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJtOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZ1xuICAgICAgZWxzZSBzWysraV0gPSBibTtcbiAgICB9IGVsc2UgeyAvLyBpbnRlcnBvbGF0ZSBub24tbWF0Y2hpbmcgbnVtYmVyc1xuICAgICAgc1srK2ldID0gbnVsbDtcbiAgICAgIHEucHVzaCh7aTogaSwgeDogbnVtYmVyKGFtLCBibSl9KTtcbiAgICB9XG4gICAgYmkgPSByZUIubGFzdEluZGV4O1xuICB9XG5cbiAgLy8gQWRkIHJlbWFpbnMgb2YgYi5cbiAgaWYgKGJpIDwgYi5sZW5ndGgpIHtcbiAgICBicyA9IGIuc2xpY2UoYmkpO1xuICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZ1xuICAgIGVsc2Ugc1srK2ldID0gYnM7XG4gIH1cblxuICAvLyBTcGVjaWFsIG9wdGltaXphdGlvbiBmb3Igb25seSBhIHNpbmdsZSBtYXRjaC5cbiAgLy8gT3RoZXJ3aXNlLCBpbnRlcnBvbGF0ZSBlYWNoIG9mIHRoZSBudW1iZXJzIGFuZCByZWpvaW4gdGhlIHN0cmluZy5cbiAgcmV0dXJuIHMubGVuZ3RoIDwgMiA/IChxWzBdXG4gICAgICA/IG9uZShxWzBdLngpXG4gICAgICA6IHplcm8oYikpXG4gICAgICA6IChiID0gcS5sZW5ndGgsIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbzsgaSA8IGI7ICsraSkgc1sobyA9IHFbaV0pLmldID0gby54KHQpO1xuICAgICAgICAgIHJldHVybiBzLmpvaW4oXCJcIik7XG4gICAgICAgIH0pO1xufVxuIiwidmFyIGRlZ3JlZXMgPSAxODAgLyBNYXRoLlBJO1xuXG5leHBvcnQgdmFyIGlkZW50aXR5ID0ge1xuICB0cmFuc2xhdGVYOiAwLFxuICB0cmFuc2xhdGVZOiAwLFxuICByb3RhdGU6IDAsXG4gIHNrZXdYOiAwLFxuICBzY2FsZVg6IDEsXG4gIHNjYWxlWTogMVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYiwgYywgZCwgZSwgZikge1xuICB2YXIgc2NhbGVYLCBzY2FsZVksIHNrZXdYO1xuICBpZiAoc2NhbGVYID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpKSBhIC89IHNjYWxlWCwgYiAvPSBzY2FsZVg7XG4gIGlmIChza2V3WCA9IGEgKiBjICsgYiAqIGQpIGMgLT0gYSAqIHNrZXdYLCBkIC09IGIgKiBza2V3WDtcbiAgaWYgKHNjYWxlWSA9IE1hdGguc3FydChjICogYyArIGQgKiBkKSkgYyAvPSBzY2FsZVksIGQgLz0gc2NhbGVZLCBza2V3WCAvPSBzY2FsZVk7XG4gIGlmIChhICogZCA8IGIgKiBjKSBhID0gLWEsIGIgPSAtYiwgc2tld1ggPSAtc2tld1gsIHNjYWxlWCA9IC1zY2FsZVg7XG4gIHJldHVybiB7XG4gICAgdHJhbnNsYXRlWDogZSxcbiAgICB0cmFuc2xhdGVZOiBmLFxuICAgIHJvdGF0ZTogTWF0aC5hdGFuMihiLCBhKSAqIGRlZ3JlZXMsXG4gICAgc2tld1g6IE1hdGguYXRhbihza2V3WCkgKiBkZWdyZWVzLFxuICAgIHNjYWxlWDogc2NhbGVYLFxuICAgIHNjYWxlWTogc2NhbGVZXG4gIH07XG59XG4iLCJpbXBvcnQgbnVtYmVyIGZyb20gXCIuLi9udW1iZXIuanNcIjtcbmltcG9ydCB7cGFyc2VDc3MsIHBhcnNlU3ZnfSBmcm9tIFwiLi9wYXJzZS5qc1wiO1xuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZSwgcHhDb21tYSwgcHhQYXJlbiwgZGVnUGFyZW4pIHtcblxuICBmdW5jdGlvbiBwb3Aocykge1xuICAgIHJldHVybiBzLmxlbmd0aCA/IHMucG9wKCkgKyBcIiBcIiA6IFwiXCI7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2xhdGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHtcbiAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5Yikge1xuICAgICAgdmFyIGkgPSBzLnB1c2goXCJ0cmFuc2xhdGUoXCIsIG51bGwsIHB4Q29tbWEsIG51bGwsIHB4UGFyZW4pO1xuICAgICAgcS5wdXNoKHtpOiBpIC0gNCwgeDogbnVtYmVyKHhhLCB4Yil9LCB7aTogaSAtIDIsIHg6IG51bWJlcih5YSwgeWIpfSk7XG4gICAgfSBlbHNlIGlmICh4YiB8fCB5Yikge1xuICAgICAgcy5wdXNoKFwidHJhbnNsYXRlKFwiICsgeGIgKyBweENvbW1hICsgeWIgKyBweFBhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByb3RhdGUoYSwgYiwgcywgcSkge1xuICAgIGlmIChhICE9PSBiKSB7XG4gICAgICBpZiAoYSAtIGIgPiAxODApIGIgKz0gMzYwOyBlbHNlIGlmIChiIC0gYSA+IDE4MCkgYSArPSAzNjA7IC8vIHNob3J0ZXN0IHBhdGhcbiAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArIFwicm90YXRlKFwiLCBudWxsLCBkZWdQYXJlbikgLSAyLCB4OiBudW1iZXIoYSwgYil9KTtcbiAgICB9IGVsc2UgaWYgKGIpIHtcbiAgICAgIHMucHVzaChwb3AocykgKyBcInJvdGF0ZShcIiArIGIgKyBkZWdQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2tld1goYSwgYiwgcywgcSkge1xuICAgIGlmIChhICE9PSBiKSB7XG4gICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyBcInNrZXdYKFwiLCBudWxsLCBkZWdQYXJlbikgLSAyLCB4OiBudW1iZXIoYSwgYil9KTtcbiAgICB9IGVsc2UgaWYgKGIpIHtcbiAgICAgIHMucHVzaChwb3AocykgKyBcInNrZXdYKFwiICsgYiArIGRlZ1BhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzY2FsZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkge1xuICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7XG4gICAgICB2YXIgaSA9IHMucHVzaChwb3AocykgKyBcInNjYWxlKFwiLCBudWxsLCBcIixcIiwgbnVsbCwgXCIpXCIpO1xuICAgICAgcS5wdXNoKHtpOiBpIC0gNCwgeDogbnVtYmVyKHhhLCB4Yil9LCB7aTogaSAtIDIsIHg6IG51bWJlcih5YSwgeWIpfSk7XG4gICAgfSBlbHNlIGlmICh4YiAhPT0gMSB8fCB5YiAhPT0gMSkge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwic2NhbGUoXCIgKyB4YiArIFwiLFwiICsgeWIgKyBcIilcIik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnNcbiAgICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJwb2xhdG9yc1xuICAgIGEgPSBwYXJzZShhKSwgYiA9IHBhcnNlKGIpO1xuICAgIHRyYW5zbGF0ZShhLnRyYW5zbGF0ZVgsIGEudHJhbnNsYXRlWSwgYi50cmFuc2xhdGVYLCBiLnRyYW5zbGF0ZVksIHMsIHEpO1xuICAgIHJvdGF0ZShhLnJvdGF0ZSwgYi5yb3RhdGUsIHMsIHEpO1xuICAgIHNrZXdYKGEuc2tld1gsIGIuc2tld1gsIHMsIHEpO1xuICAgIHNjYWxlKGEuc2NhbGVYLCBhLnNjYWxlWSwgYi5zY2FsZVgsIGIuc2NhbGVZLCBzLCBxKTtcbiAgICBhID0gYiA9IG51bGw7IC8vIGdjXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHZhciBpID0gLTEsIG4gPSBxLmxlbmd0aCwgbztcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7XG4gICAgICByZXR1cm4gcy5qb2luKFwiXCIpO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgPSBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZUNzcywgXCJweCwgXCIsIFwicHgpXCIsIFwiZGVnKVwiKTtcbmV4cG9ydCB2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmcgPSBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZVN2ZywgXCIsIFwiLCBcIilcIiwgXCIpXCIpO1xuIiwiaW1wb3J0IGRlY29tcG9zZSwge2lkZW50aXR5fSBmcm9tIFwiLi9kZWNvbXBvc2UuanNcIjtcblxudmFyIHN2Z05vZGU7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDc3ModmFsdWUpIHtcbiAgY29uc3QgbSA9IG5ldyAodHlwZW9mIERPTU1hdHJpeCA9PT0gXCJmdW5jdGlvblwiID8gRE9NTWF0cml4IDogV2ViS2l0Q1NTTWF0cml4KSh2YWx1ZSArIFwiXCIpO1xuICByZXR1cm4gbS5pc0lkZW50aXR5ID8gaWRlbnRpdHkgOiBkZWNvbXBvc2UobS5hLCBtLmIsIG0uYywgbS5kLCBtLmUsIG0uZik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVN2Zyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGlkZW50aXR5O1xuICBpZiAoIXN2Z05vZGUpIHN2Z05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIik7XG4gIHN2Z05vZGUuc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIHZhbHVlKTtcbiAgaWYgKCEodmFsdWUgPSBzdmdOb2RlLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpKSByZXR1cm4gaWRlbnRpdHk7XG4gIHZhbHVlID0gdmFsdWUubWF0cml4O1xuICByZXR1cm4gZGVjb21wb3NlKHZhbHVlLmEsIHZhbHVlLmIsIHZhbHVlLmMsIHZhbHVlLmQsIHZhbHVlLmUsIHZhbHVlLmYpO1xufVxuIiwidmFyIGVwc2lsb24yID0gMWUtMTI7XG5cbmZ1bmN0aW9uIGNvc2goeCkge1xuICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpICsgMSAvIHgpIC8gMjtcbn1cblxuZnVuY3Rpb24gc2luaCh4KSB7XG4gIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgLSAxIC8geCkgLyAyO1xufVxuXG5mdW5jdGlvbiB0YW5oKHgpIHtcbiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKDIgKiB4KSkgLSAxKSAvICh4ICsgMSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiB6b29tUmhvKHJobywgcmhvMiwgcmhvNCkge1xuXG4gIC8vIHAwID0gW3V4MCwgdXkwLCB3MF1cbiAgLy8gcDEgPSBbdXgxLCB1eTEsIHcxXVxuICBmdW5jdGlvbiB6b29tKHAwLCBwMSkge1xuICAgIHZhciB1eDAgPSBwMFswXSwgdXkwID0gcDBbMV0sIHcwID0gcDBbMl0sXG4gICAgICAgIHV4MSA9IHAxWzBdLCB1eTEgPSBwMVsxXSwgdzEgPSBwMVsyXSxcbiAgICAgICAgZHggPSB1eDEgLSB1eDAsXG4gICAgICAgIGR5ID0gdXkxIC0gdXkwLFxuICAgICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5LFxuICAgICAgICBpLFxuICAgICAgICBTO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlIGZvciB1MCDiiYUgdTEuXG4gICAgaWYgKGQyIDwgZXBzaWxvbjIpIHtcbiAgICAgIFMgPSBNYXRoLmxvZyh3MSAvIHcwKSAvIHJobztcbiAgICAgIGkgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgdXgwICsgdCAqIGR4LFxuICAgICAgICAgIHV5MCArIHQgKiBkeSxcbiAgICAgICAgICB3MCAqIE1hdGguZXhwKHJobyAqIHQgKiBTKVxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdlbmVyYWwgY2FzZS5cbiAgICBlbHNlIHtcbiAgICAgIHZhciBkMSA9IE1hdGguc3FydChkMiksXG4gICAgICAgICAgYjAgPSAodzEgKiB3MSAtIHcwICogdzAgKyByaG80ICogZDIpIC8gKDIgKiB3MCAqIHJobzIgKiBkMSksXG4gICAgICAgICAgYjEgPSAodzEgKiB3MSAtIHcwICogdzAgLSByaG80ICogZDIpIC8gKDIgKiB3MSAqIHJobzIgKiBkMSksXG4gICAgICAgICAgcjAgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjAgKiBiMCArIDEpIC0gYjApLFxuICAgICAgICAgIHIxID0gTWF0aC5sb2coTWF0aC5zcXJ0KGIxICogYjEgKyAxKSAtIGIxKTtcbiAgICAgIFMgPSAocjEgLSByMCkgLyByaG87XG4gICAgICBpID0gZnVuY3Rpb24odCkge1xuICAgICAgICB2YXIgcyA9IHQgKiBTLFxuICAgICAgICAgICAgY29zaHIwID0gY29zaChyMCksXG4gICAgICAgICAgICB1ID0gdzAgLyAocmhvMiAqIGQxKSAqIChjb3NocjAgKiB0YW5oKHJobyAqIHMgKyByMCkgLSBzaW5oKHIwKSk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgdXgwICsgdSAqIGR4LFxuICAgICAgICAgIHV5MCArIHUgKiBkeSxcbiAgICAgICAgICB3MCAqIGNvc2hyMCAvIGNvc2gocmhvICogcyArIHIwKVxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGkuZHVyYXRpb24gPSBTICogMTAwMCAqIHJobyAvIE1hdGguU1FSVDI7XG5cbiAgICByZXR1cm4gaTtcbiAgfVxuXG4gIHpvb20ucmhvID0gZnVuY3Rpb24oXykge1xuICAgIHZhciBfMSA9IE1hdGgubWF4KDFlLTMsICtfKSwgXzIgPSBfMSAqIF8xLCBfNCA9IF8yICogXzI7XG4gICAgcmV0dXJuIHpvb21SaG8oXzEsIF8yLCBfNCk7XG4gIH07XG5cbiAgcmV0dXJuIHpvb207XG59KShNYXRoLlNRUlQyLCAyLCA0KTtcbiIsImV4cG9ydCBkZWZhdWx0IE1hdGgucmFuZG9tO1xuIiwiaW1wb3J0IGRlZmF1bHRTb3VyY2UgZnJvbSBcIi4vZGVmYXVsdFNvdXJjZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gc291cmNlUmFuZG9tTm9ybWFsKHNvdXJjZSkge1xuICBmdW5jdGlvbiByYW5kb21Ob3JtYWwobXUsIHNpZ21hKSB7XG4gICAgdmFyIHgsIHI7XG4gICAgbXUgPSBtdSA9PSBudWxsID8gMCA6ICttdTtcbiAgICBzaWdtYSA9IHNpZ21hID09IG51bGwgPyAxIDogK3NpZ21hO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB5O1xuXG4gICAgICAvLyBJZiBhdmFpbGFibGUsIHVzZSB0aGUgc2Vjb25kIHByZXZpb3VzbHktZ2VuZXJhdGVkIHVuaWZvcm0gcmFuZG9tLlxuICAgICAgaWYgKHggIT0gbnVsbCkgeSA9IHgsIHggPSBudWxsO1xuXG4gICAgICAvLyBPdGhlcndpc2UsIGdlbmVyYXRlIGEgbmV3IHggYW5kIHkuXG4gICAgICBlbHNlIGRvIHtcbiAgICAgICAgeCA9IHNvdXJjZSgpICogMiAtIDE7XG4gICAgICAgIHkgPSBzb3VyY2UoKSAqIDIgLSAxO1xuICAgICAgICByID0geCAqIHggKyB5ICogeTtcbiAgICAgIH0gd2hpbGUgKCFyIHx8IHIgPiAxKTtcblxuICAgICAgcmV0dXJuIG11ICsgc2lnbWEgKiB5ICogTWF0aC5zcXJ0KC0yICogTWF0aC5sb2cocikgLyByKTtcbiAgICB9O1xuICB9XG5cbiAgcmFuZG9tTm9ybWFsLnNvdXJjZSA9IHNvdXJjZVJhbmRvbU5vcm1hbDtcblxuICByZXR1cm4gcmFuZG9tTm9ybWFsO1xufSkoZGVmYXVsdFNvdXJjZSk7XG4iLCIvLyBHaXZlbiBzb21ldGhpbmcgYXJyYXkgbGlrZSAob3IgbnVsbCksIHJldHVybnMgc29tZXRoaW5nIHRoYXQgaXMgc3RyaWN0bHkgYW5cbi8vIGFycmF5LiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgYXJyYXktbGlrZSBvYmplY3RzIHBhc3NlZCB0byBkMy5zZWxlY3RBbGxcbi8vIG9yIHNlbGVjdGlvbi5zZWxlY3RBbGwgYXJlIGNvbnZlcnRlZCBpbnRvIHByb3BlciBhcnJheXMgd2hlbiBjcmVhdGluZyBhXG4vLyBzZWxlY3Rpb247IHdlIGRvbuKAmXQgZXZlciB3YW50IHRvIGNyZWF0ZSBhIHNlbGVjdGlvbiBiYWNrZWQgYnkgYSBsaXZlXG4vLyBIVE1MQ29sbGVjdGlvbiBvciBOb2RlTGlzdC4gSG93ZXZlciwgbm90ZSB0aGF0IHNlbGVjdGlvbi5zZWxlY3RBbGwgd2lsbCB1c2UgYVxuLy8gc3RhdGljIE5vZGVMaXN0IGFzIGEgZ3JvdXAsIHNpbmNlIGl0IHNhZmVseSBkZXJpdmVkIGZyb20gcXVlcnlTZWxlY3RvckFsbC5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFycmF5KHgpIHtcbiAgcmV0dXJuIHggPT0gbnVsbCA/IFtdIDogQXJyYXkuaXNBcnJheSh4KSA/IHggOiBBcnJheS5mcm9tKHgpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCJpbXBvcnQgbmFtZXNwYWNlIGZyb20gXCIuL25hbWVzcGFjZS5qc1wiO1xuaW1wb3J0IHt4aHRtbH0gZnJvbSBcIi4vbmFtZXNwYWNlcy5qc1wiO1xuXG5mdW5jdGlvbiBjcmVhdG9ySW5oZXJpdChuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZG9jdW1lbnQgPSB0aGlzLm93bmVyRG9jdW1lbnQsXG4gICAgICAgIHVyaSA9IHRoaXMubmFtZXNwYWNlVVJJO1xuICAgIHJldHVybiB1cmkgPT09IHhodG1sICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IHhodG1sXG4gICAgICAgID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKVxuICAgICAgICA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1cmksIG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdG9yRml4ZWQoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuICByZXR1cm4gKGZ1bGxuYW1lLmxvY2FsXG4gICAgICA/IGNyZWF0b3JGaXhlZFxuICAgICAgOiBjcmVhdG9ySW5oZXJpdCkoZnVsbG5hbWUpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoZXMoc2VsZWN0b3IpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hpbGRNYXRjaGVyKHNlbGVjdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbihub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubWF0Y2hlcyhzZWxlY3Rvcik7XG4gIH07XG59XG5cbiIsImltcG9ydCBuYW1lc3BhY2VzIGZyb20gXCIuL25hbWVzcGFjZXMuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgcHJlZml4ID0gbmFtZSArPSBcIlwiLCBpID0gcHJlZml4LmluZGV4T2YoXCI6XCIpO1xuICBpZiAoaSA+PSAwICYmIChwcmVmaXggPSBuYW1lLnNsaWNlKDAsIGkpKSAhPT0gXCJ4bWxuc1wiKSBuYW1lID0gbmFtZS5zbGljZShpICsgMSk7XG4gIHJldHVybiBuYW1lc3BhY2VzLmhhc093blByb3BlcnR5KHByZWZpeCkgPyB7c3BhY2U6IG5hbWVzcGFjZXNbcHJlZml4XSwgbG9jYWw6IG5hbWV9IDogbmFtZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbn1cbiIsImV4cG9ydCB2YXIgeGh0bWwgPSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBzdmc6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgeGh0bWw6IHhodG1sLFxuICB4bGluazogXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsXG4gIHhtbDogXCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2VcIixcbiAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy9cIlxufTtcbiIsImltcG9ydCBzb3VyY2VFdmVudCBmcm9tIFwiLi9zb3VyY2VFdmVudC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCwgbm9kZSkge1xuICBldmVudCA9IHNvdXJjZUV2ZW50KGV2ZW50KTtcbiAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkgbm9kZSA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gIGlmIChub2RlKSB7XG4gICAgdmFyIHN2ZyA9IG5vZGUub3duZXJTVkdFbGVtZW50IHx8IG5vZGU7XG4gICAgaWYgKHN2Zy5jcmVhdGVTVkdQb2ludCkge1xuICAgICAgdmFyIHBvaW50ID0gc3ZnLmNyZWF0ZVNWR1BvaW50KCk7XG4gICAgICBwb2ludC54ID0gZXZlbnQuY2xpZW50WCwgcG9pbnQueSA9IGV2ZW50LmNsaWVudFk7XG4gICAgICBwb2ludCA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShub2RlLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7XG4gICAgICByZXR1cm4gW3BvaW50LngsIHBvaW50LnldO1xuICAgIH1cbiAgICBpZiAobm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHtcbiAgICAgIHZhciByZWN0ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHJldHVybiBbZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIG5vZGUuY2xpZW50TGVmdCwgZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wIC0gbm9kZS5jbGllbnRUb3BdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2V2ZW50LnBhZ2VYLCBldmVudC5wYWdlWV07XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbiwgcm9vdH0gZnJvbSBcIi4vc2VsZWN0aW9uL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCJcbiAgICAgID8gbmV3IFNlbGVjdGlvbihbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXV0sIFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKVxuICAgICAgOiBuZXcgU2VsZWN0aW9uKFtbc2VsZWN0b3JdXSwgcm9vdCk7XG59XG4iLCJpbXBvcnQgY3JlYXRvciBmcm9tIFwiLi4vY3JlYXRvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiID8gbmFtZSA6IGNyZWF0b3IobmFtZSk7XG4gIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IG5hbWVzcGFjZSBmcm9tIFwiLi4vbmFtZXNwYWNlLmpzXCI7XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmVOUyhmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnQobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdmFsdWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHYpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdik7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMubm9kZSgpO1xuICAgIHJldHVybiBmdWxsbmFtZS5sb2NhbFxuICAgICAgICA/IG5vZGUuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKVxuICAgICAgICA6IG5vZGUuZ2V0QXR0cmlidXRlKGZ1bGxuYW1lKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pXG4gICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50KSkpKGZ1bGxuYW1lLCB2YWx1ZSkpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50c1swXTtcbiAgYXJndW1lbnRzWzBdID0gdGhpcztcbiAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgcmV0dXJuIHRoaXM7XG59XG4iLCJmdW5jdGlvbiBjbGFzc0FycmF5KHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnRyaW0oKS5zcGxpdCgvXnxcXHMrLyk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzTGlzdChub2RlKSB7XG4gIHJldHVybiBub2RlLmNsYXNzTGlzdCB8fCBuZXcgQ2xhc3NMaXN0KG5vZGUpO1xufVxuXG5mdW5jdGlvbiBDbGFzc0xpc3Qobm9kZSkge1xuICB0aGlzLl9ub2RlID0gbm9kZTtcbiAgdGhpcy5fbmFtZXMgPSBjbGFzc0FycmF5KG5vZGUuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIik7XG59XG5cbkNsYXNzTGlzdC5wcm90b3R5cGUgPSB7XG4gIGFkZDogZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICBpZiAoaSA8IDApIHtcbiAgICAgIHRoaXMuX25hbWVzLnB1c2gobmFtZSk7XG4gICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHRoaXMuX25hbWVzLmpvaW4oXCIgXCIpKTtcbiAgICB9XG4gIH0sXG4gIHJlbW92ZTogZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICBpZiAoaSA+PSAwKSB7XG4gICAgICB0aGlzLl9uYW1lcy5zcGxpY2UoaSwgMSk7XG4gICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHRoaXMuX25hbWVzLmpvaW4oXCIgXCIpKTtcbiAgICB9XG4gIH0sXG4gIGNvbnRhaW5zOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSkgPj0gMDtcbiAgfVxufTtcblxuZnVuY3Rpb24gY2xhc3NlZEFkZChub2RlLCBuYW1lcykge1xuICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICB3aGlsZSAoKytpIDwgbikgbGlzdC5hZGQobmFtZXNbaV0pO1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkUmVtb3ZlKG5vZGUsIG5hbWVzKSB7XG4gIHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gIHdoaWxlICgrK2kgPCBuKSBsaXN0LnJlbW92ZShuYW1lc1tpXSk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRUcnVlKG5hbWVzKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBjbGFzc2VkQWRkKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZEZhbHNlKG5hbWVzKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBjbGFzc2VkUmVtb3ZlKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZEZ1bmN0aW9uKG5hbWVzLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgKHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgPyBjbGFzc2VkQWRkIDogY2xhc3NlZFJlbW92ZSkodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgbmFtZXMgPSBjbGFzc0FycmF5KG5hbWUgKyBcIlwiKTtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdCh0aGlzLm5vZGUoKSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFsaXN0LmNvbnRhaW5zKG5hbWVzW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gY2xhc3NlZEZ1bmN0aW9uIDogdmFsdWVcbiAgICAgID8gY2xhc3NlZFRydWVcbiAgICAgIDogY2xhc3NlZEZhbHNlKShuYW1lcywgdmFsdWUpKTtcbn1cbiIsImZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZVNoYWxsb3coKSB7XG4gIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKGZhbHNlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lRGVlcCgpIHtcbiAgdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUodHJ1ZSksIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGRlZXApIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGRlZXAgPyBzZWxlY3Rpb25fY2xvbmVEZWVwIDogc2VsZWN0aW9uX2Nsb25lU2hhbGxvdyk7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCB7RW50ZXJOb2RlfSBmcm9tIFwiLi9lbnRlci5qc1wiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuLi9jb25zdGFudC5qc1wiO1xuXG5mdW5jdGlvbiBiaW5kSW5kZXgocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSkge1xuICB2YXIgaSA9IDAsXG4gICAgICBub2RlLFxuICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG5cbiAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGZpdCBpbnRvIHVwZGF0ZS5cbiAgLy8gUHV0IGFueSBudWxsIG5vZGVzIGludG8gZW50ZXIuXG4gIC8vIFB1dCBhbnkgcmVtYWluaW5nIGRhdGEgaW50byBlbnRlci5cbiAgZm9yICg7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTtcbiAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZShwYXJlbnQsIGRhdGFbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBkb27igJl0IGZpdCBpbnRvIGV4aXQuXG4gIGZvciAoOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBiaW5kS2V5KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEsIGtleSkge1xuICB2YXIgaSxcbiAgICAgIG5vZGUsXG4gICAgICBub2RlQnlLZXlWYWx1ZSA9IG5ldyBNYXAsXG4gICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgIGtleVZhbHVlcyA9IG5ldyBBcnJheShncm91cExlbmd0aCksXG4gICAgICBrZXlWYWx1ZTtcblxuICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggbm9kZS5cbiAgLy8gSWYgbXVsdGlwbGUgbm9kZXMgaGF2ZSB0aGUgc2FtZSBrZXksIHRoZSBkdXBsaWNhdGVzIGFyZSBhZGRlZCB0byBleGl0LlxuICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIGtleVZhbHVlc1tpXSA9IGtleVZhbHVlID0ga2V5LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApICsgXCJcIjtcbiAgICAgIGlmIChub2RlQnlLZXlWYWx1ZS5oYXMoa2V5VmFsdWUpKSB7XG4gICAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZUJ5S2V5VmFsdWUuc2V0KGtleVZhbHVlLCBub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggZGF0dW0uXG4gIC8vIElmIHRoZXJlIGEgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXksIGpvaW4gYW5kIGFkZCBpdCB0byB1cGRhdGUuXG4gIC8vIElmIHRoZXJlIGlzIG5vdCAob3IgdGhlIGtleSBpcyBhIGR1cGxpY2F0ZSksIGFkZCBpdCB0byBlbnRlci5cbiAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW5ndGg7ICsraSkge1xuICAgIGtleVZhbHVlID0ga2V5LmNhbGwocGFyZW50LCBkYXRhW2ldLCBpLCBkYXRhKSArIFwiXCI7XG4gICAgaWYgKG5vZGUgPSBub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWUpKSB7XG4gICAgICB1cGRhdGVbaV0gPSBub2RlO1xuICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07XG4gICAgICBub2RlQnlLZXlWYWx1ZS5kZWxldGUoa2V5VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgYW55IHJlbWFpbmluZyBub2RlcyB0aGF0IHdlcmUgbm90IGJvdW5kIHRvIGRhdGEgdG8gZXhpdC5cbiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKG5vZGVCeUtleVZhbHVlLmdldChrZXlWYWx1ZXNbaV0pID09PSBub2RlKSkge1xuICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRhdHVtKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuX19kYXRhX187XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLCBkYXR1bSk7XG5cbiAgdmFyIGJpbmQgPSBrZXkgPyBiaW5kS2V5IDogYmluZEluZGV4LFxuICAgICAgcGFyZW50cyA9IHRoaXMuX3BhcmVudHMsXG4gICAgICBncm91cHMgPSB0aGlzLl9ncm91cHM7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB2YWx1ZSA9IGNvbnN0YW50KHZhbHVlKTtcblxuICBmb3IgKHZhciBtID0gZ3JvdXBzLmxlbmd0aCwgdXBkYXRlID0gbmV3IEFycmF5KG0pLCBlbnRlciA9IG5ldyBBcnJheShtKSwgZXhpdCA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICB2YXIgcGFyZW50ID0gcGFyZW50c1tqXSxcbiAgICAgICAgZ3JvdXAgPSBncm91cHNbal0sXG4gICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgICBkYXRhID0gYXJyYXlsaWtlKHZhbHVlLmNhbGwocGFyZW50LCBwYXJlbnQgJiYgcGFyZW50Ll9fZGF0YV9fLCBqLCBwYXJlbnRzKSksXG4gICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgICAgZW50ZXJHcm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLFxuICAgICAgICB1cGRhdGVHcm91cCA9IHVwZGF0ZVtqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSxcbiAgICAgICAgZXhpdEdyb3VwID0gZXhpdFtqXSA9IG5ldyBBcnJheShncm91cExlbmd0aCk7XG5cbiAgICBiaW5kKHBhcmVudCwgZ3JvdXAsIGVudGVyR3JvdXAsIHVwZGF0ZUdyb3VwLCBleGl0R3JvdXAsIGRhdGEsIGtleSk7XG5cbiAgICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0ZSBub2RlLCBzdWNoIHRoYXRcbiAgICAvLyBhcHBlbmRDaGlsZCBjYW4gaW5zZXJ0IHRoZSBtYXRlcmlhbGl6ZWQgZW50ZXIgbm9kZSBiZWZvcmUgdGhpcyBub2RlLFxuICAgIC8vIHJhdGhlciB0aGFuIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmVudCBub2RlLlxuICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAwLCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7XG4gICAgICBpZiAocHJldmlvdXMgPSBlbnRlckdyb3VwW2kwXSkge1xuICAgICAgICBpZiAoaTAgPj0gaTEpIGkxID0gaTAgKyAxO1xuICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0YUxlbmd0aCk7XG4gICAgICAgIHByZXZpb3VzLl9uZXh0ID0gbmV4dCB8fCBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24odXBkYXRlLCBwYXJlbnRzKTtcbiAgdXBkYXRlLl9lbnRlciA9IGVudGVyO1xuICB1cGRhdGUuX2V4aXQgPSBleGl0O1xuICByZXR1cm4gdXBkYXRlO1xufVxuXG4vLyBHaXZlbiBzb21lIGRhdGEsIHRoaXMgcmV0dXJucyBhbiBhcnJheS1saWtlIHZpZXcgb2YgaXQ6IGFuIG9iamVjdCB0aGF0XG4vLyBleHBvc2VzIGEgbGVuZ3RoIHByb3BlcnR5IGFuZCBhbGxvd3MgbnVtZXJpYyBpbmRleGluZy4gTm90ZSB0aGF0IHVubGlrZVxuLy8gc2VsZWN0QWxsLCB0aGlzIGlzbuKAmXQgd29ycmllZCBhYm91dCDigJxsaXZl4oCdIGNvbGxlY3Rpb25zIGJlY2F1c2UgdGhlIHJlc3VsdGluZ1xuLy8gYXJyYXkgd2lsbCBvbmx5IGJlIHVzZWQgYnJpZWZseSB3aGlsZSBkYXRhIGlzIGJlaW5nIGJvdW5kLiAoSXQgaXMgcG9zc2libGUgdG9cbi8vIGNhdXNlIHRoZSBkYXRhIHRvIGNoYW5nZSB3aGlsZSBpdGVyYXRpbmcgYnkgdXNpbmcgYSBrZXkgZnVuY3Rpb24sIGJ1dCBwbGVhc2Vcbi8vIGRvbuKAmXQ7IHdl4oCZZCByYXRoZXIgYXZvaWQgYSBncmF0dWl0b3VzIGNvcHkuKVxuZnVuY3Rpb24gYXJyYXlsaWtlKGRhdGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIFwibGVuZ3RoXCIgaW4gZGF0YVxuICAgID8gZGF0YSAvLyBBcnJheSwgVHlwZWRBcnJheSwgTm9kZUxpc3QsIGFycmF5LWxpa2VcbiAgICA6IEFycmF5LmZyb20oZGF0YSk7IC8vIE1hcCwgU2V0LCBpdGVyYWJsZSwgc3RyaW5nLCBvciBhbnl0aGluZyBlbHNlXG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLnByb3BlcnR5KFwiX19kYXRhX19cIiwgdmFsdWUpXG4gICAgICA6IHRoaXMubm9kZSgpLl9fZGF0YV9fO1xufVxuIiwiaW1wb3J0IGRlZmF1bHRWaWV3IGZyb20gXCIuLi93aW5kb3cuanNcIjtcblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChub2RlLCB0eXBlLCBwYXJhbXMpIHtcbiAgdmFyIHdpbmRvdyA9IGRlZmF1bHRWaWV3KG5vZGUpLFxuICAgICAgZXZlbnQgPSB3aW5kb3cuQ3VzdG9tRXZlbnQ7XG5cbiAgaWYgKHR5cGVvZiBldmVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZXZlbnQgPSBuZXcgZXZlbnQodHlwZSwgcGFyYW1zKTtcbiAgfSBlbHNlIHtcbiAgICBldmVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFdmVudChcIkV2ZW50XCIpO1xuICAgIGlmIChwYXJhbXMpIGV2ZW50LmluaXRFdmVudCh0eXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUpLCBldmVudC5kZXRhaWwgPSBwYXJhbXMuZGV0YWlsO1xuICAgIGVsc2UgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIGZhbHNlLCBmYWxzZSk7XG4gIH1cblxuICBub2RlLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaENvbnN0YW50KHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hGdW5jdGlvbih0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiBwYXJhbXMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBkaXNwYXRjaEZ1bmN0aW9uXG4gICAgICA6IGRpc3BhdGNoQ29uc3RhbnQpKHR5cGUsIHBhcmFtcykpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2spIHtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgY2FsbGJhY2suY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICF0aGlzLm5vZGUoKTtcbn1cbiIsImltcG9ydCBzcGFyc2UgZnJvbSBcIi4vc3BhcnNlLmpzXCI7XG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2VudGVyIHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBFbnRlck5vZGUocGFyZW50LCBkYXR1bSkge1xuICB0aGlzLm93bmVyRG9jdW1lbnQgPSBwYXJlbnQub3duZXJEb2N1bWVudDtcbiAgdGhpcy5uYW1lc3BhY2VVUkkgPSBwYXJlbnQubmFtZXNwYWNlVVJJO1xuICB0aGlzLl9uZXh0ID0gbnVsbDtcbiAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICB0aGlzLl9fZGF0YV9fID0gZGF0dW07XG59XG5cbkVudGVyTm9kZS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBFbnRlck5vZGUsXG4gIGFwcGVuZENoaWxkOiBmdW5jdGlvbihjaGlsZCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgdGhpcy5fbmV4dCk7IH0sXG4gIGluc2VydEJlZm9yZTogZnVuY3Rpb24oY2hpbGQsIG5leHQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIG5leHQpOyB9LFxuICBxdWVyeVNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOyB9LFxuICBxdWVyeVNlbGVjdG9yQWxsOiBmdW5jdGlvbihzZWxlY3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOyB9XG59O1xuIiwiaW1wb3J0IHNwYXJzZSBmcm9tIFwiLi9zcGFyc2UuanNcIjtcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZXhpdCB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgbWF0Y2hlciBmcm9tIFwiLi4vbWF0Y2hlci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICBpZiAodHlwZW9mIG1hdGNoICE9PSBcImZ1bmN0aW9uXCIpIG1hdGNoID0gbWF0Y2hlcihtYXRjaCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7XG4gICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImZ1bmN0aW9uIGh0bWxSZW1vdmUoKSB7XG4gIHRoaXMuaW5uZXJIVE1MID0gXCJcIjtcbn1cblxuZnVuY3Rpb24gaHRtbENvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmlubmVySFRNTCA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiBodG1sRnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLmlubmVySFRNTCA9IHYgPT0gbnVsbCA/IFwiXCIgOiB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbFxuICAgICAgICAgID8gaHRtbFJlbW92ZSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gaHRtbEZ1bmN0aW9uXG4gICAgICAgICAgOiBodG1sQ29uc3RhbnQpKHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKCkuaW5uZXJIVE1MO1xufVxuIiwiaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3QgZnJvbSBcIi4vc2VsZWN0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdEFsbCBmcm9tIFwiLi9zZWxlY3RBbGwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2VsZWN0Q2hpbGQgZnJvbSBcIi4vc2VsZWN0Q2hpbGQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2VsZWN0Q2hpbGRyZW4gZnJvbSBcIi4vc2VsZWN0Q2hpbGRyZW4uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZmlsdGVyIGZyb20gXCIuL2ZpbHRlci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9kYXRhIGZyb20gXCIuL2RhdGEuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZW50ZXIgZnJvbSBcIi4vZW50ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZXhpdCBmcm9tIFwiLi9leGl0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2pvaW4gZnJvbSBcIi4vam9pbi5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9tZXJnZSBmcm9tIFwiLi9tZXJnZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9vcmRlciBmcm9tIFwiLi9vcmRlci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zb3J0IGZyb20gXCIuL3NvcnQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2FsbCBmcm9tIFwiLi9jYWxsLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX25vZGVzIGZyb20gXCIuL25vZGVzLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX25vZGUgZnJvbSBcIi4vbm9kZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zaXplIGZyb20gXCIuL3NpemUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZW1wdHkgZnJvbSBcIi4vZW1wdHkuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZWFjaCBmcm9tIFwiLi9lYWNoLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2F0dHIgZnJvbSBcIi4vYXR0ci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zdHlsZSBmcm9tIFwiLi9zdHlsZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9wcm9wZXJ0eSBmcm9tIFwiLi9wcm9wZXJ0eS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9jbGFzc2VkIGZyb20gXCIuL2NsYXNzZWQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fdGV4dCBmcm9tIFwiLi90ZXh0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2h0bWwgZnJvbSBcIi4vaHRtbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9yYWlzZSBmcm9tIFwiLi9yYWlzZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9sb3dlciBmcm9tIFwiLi9sb3dlci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9hcHBlbmQgZnJvbSBcIi4vYXBwZW5kLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2luc2VydCBmcm9tIFwiLi9pbnNlcnQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcmVtb3ZlIGZyb20gXCIuL3JlbW92ZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9jbG9uZSBmcm9tIFwiLi9jbG9uZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9kYXR1bSBmcm9tIFwiLi9kYXR1bS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9vbiBmcm9tIFwiLi9vbi5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9kaXNwYXRjaCBmcm9tIFwiLi9kaXNwYXRjaC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9pdGVyYXRvciBmcm9tIFwiLi9pdGVyYXRvci5qc1wiO1xuXG5leHBvcnQgdmFyIHJvb3QgPSBbbnVsbF07XG5cbmV4cG9ydCBmdW5jdGlvbiBTZWxlY3Rpb24oZ3JvdXBzLCBwYXJlbnRzKSB7XG4gIHRoaXMuX2dyb3VwcyA9IGdyb3VwcztcbiAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSwgcm9vdCk7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdGlvbl9zZWxlY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzO1xufVxuXG5TZWxlY3Rpb24ucHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFNlbGVjdGlvbixcbiAgc2VsZWN0OiBzZWxlY3Rpb25fc2VsZWN0LFxuICBzZWxlY3RBbGw6IHNlbGVjdGlvbl9zZWxlY3RBbGwsXG4gIHNlbGVjdENoaWxkOiBzZWxlY3Rpb25fc2VsZWN0Q2hpbGQsXG4gIHNlbGVjdENoaWxkcmVuOiBzZWxlY3Rpb25fc2VsZWN0Q2hpbGRyZW4sXG4gIGZpbHRlcjogc2VsZWN0aW9uX2ZpbHRlcixcbiAgZGF0YTogc2VsZWN0aW9uX2RhdGEsXG4gIGVudGVyOiBzZWxlY3Rpb25fZW50ZXIsXG4gIGV4aXQ6IHNlbGVjdGlvbl9leGl0LFxuICBqb2luOiBzZWxlY3Rpb25fam9pbixcbiAgbWVyZ2U6IHNlbGVjdGlvbl9tZXJnZSxcbiAgc2VsZWN0aW9uOiBzZWxlY3Rpb25fc2VsZWN0aW9uLFxuICBvcmRlcjogc2VsZWN0aW9uX29yZGVyLFxuICBzb3J0OiBzZWxlY3Rpb25fc29ydCxcbiAgY2FsbDogc2VsZWN0aW9uX2NhbGwsXG4gIG5vZGVzOiBzZWxlY3Rpb25fbm9kZXMsXG4gIG5vZGU6IHNlbGVjdGlvbl9ub2RlLFxuICBzaXplOiBzZWxlY3Rpb25fc2l6ZSxcbiAgZW1wdHk6IHNlbGVjdGlvbl9lbXB0eSxcbiAgZWFjaDogc2VsZWN0aW9uX2VhY2gsXG4gIGF0dHI6IHNlbGVjdGlvbl9hdHRyLFxuICBzdHlsZTogc2VsZWN0aW9uX3N0eWxlLFxuICBwcm9wZXJ0eTogc2VsZWN0aW9uX3Byb3BlcnR5LFxuICBjbGFzc2VkOiBzZWxlY3Rpb25fY2xhc3NlZCxcbiAgdGV4dDogc2VsZWN0aW9uX3RleHQsXG4gIGh0bWw6IHNlbGVjdGlvbl9odG1sLFxuICByYWlzZTogc2VsZWN0aW9uX3JhaXNlLFxuICBsb3dlcjogc2VsZWN0aW9uX2xvd2VyLFxuICBhcHBlbmQ6IHNlbGVjdGlvbl9hcHBlbmQsXG4gIGluc2VydDogc2VsZWN0aW9uX2luc2VydCxcbiAgcmVtb3ZlOiBzZWxlY3Rpb25fcmVtb3ZlLFxuICBjbG9uZTogc2VsZWN0aW9uX2Nsb25lLFxuICBkYXR1bTogc2VsZWN0aW9uX2RhdHVtLFxuICBvbjogc2VsZWN0aW9uX29uLFxuICBkaXNwYXRjaDogc2VsZWN0aW9uX2Rpc3BhdGNoLFxuICBbU3ltYm9sLml0ZXJhdG9yXTogc2VsZWN0aW9uX2l0ZXJhdG9yXG59O1xuXG5leHBvcnQgZGVmYXVsdCBzZWxlY3Rpb247XG4iLCJpbXBvcnQgY3JlYXRvciBmcm9tIFwiLi4vY3JlYXRvci5qc1wiO1xuaW1wb3J0IHNlbGVjdG9yIGZyb20gXCIuLi9zZWxlY3Rvci5qc1wiO1xuXG5mdW5jdGlvbiBjb25zdGFudE51bGwoKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCBiZWZvcmUpIHtcbiAgdmFyIGNyZWF0ZSA9IHR5cGVvZiBuYW1lID09PSBcImZ1bmN0aW9uXCIgPyBuYW1lIDogY3JlYXRvcihuYW1lKSxcbiAgICAgIHNlbGVjdCA9IGJlZm9yZSA9PSBudWxsID8gY29uc3RhbnROdWxsIDogdHlwZW9mIGJlZm9yZSA9PT0gXCJmdW5jdGlvblwiID8gYmVmb3JlIDogc2VsZWN0b3IoYmVmb3JlKTtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmluc2VydEJlZm9yZShjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgbnVsbCk7XG4gIH0pO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24qKCkge1xuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgeWllbGQgbm9kZTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG9uZW50ZXIsIG9udXBkYXRlLCBvbmV4aXQpIHtcbiAgdmFyIGVudGVyID0gdGhpcy5lbnRlcigpLCB1cGRhdGUgPSB0aGlzLCBleGl0ID0gdGhpcy5leGl0KCk7XG4gIGlmICh0eXBlb2Ygb25lbnRlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZW50ZXIgPSBvbmVudGVyKGVudGVyKTtcbiAgICBpZiAoZW50ZXIpIGVudGVyID0gZW50ZXIuc2VsZWN0aW9uKCk7XG4gIH0gZWxzZSB7XG4gICAgZW50ZXIgPSBlbnRlci5hcHBlbmQob25lbnRlciArIFwiXCIpO1xuICB9XG4gIGlmIChvbnVwZGF0ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlID0gb251cGRhdGUodXBkYXRlKTtcbiAgICBpZiAodXBkYXRlKSB1cGRhdGUgPSB1cGRhdGUuc2VsZWN0aW9uKCk7XG4gIH1cbiAgaWYgKG9uZXhpdCA9PSBudWxsKSBleGl0LnJlbW92ZSgpOyBlbHNlIG9uZXhpdChleGl0KTtcbiAgcmV0dXJuIGVudGVyICYmIHVwZGF0ZSA/IGVudGVyLm1lcmdlKHVwZGF0ZSkub3JkZXIoKSA6IHVwZGF0ZTtcbn1cbiIsImZ1bmN0aW9uIGxvd2VyKCkge1xuICBpZiAodGhpcy5wcmV2aW91c1NpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcywgdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChsb3dlcik7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29udGV4dCkge1xuICB2YXIgc2VsZWN0aW9uID0gY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dDtcblxuICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkge1xuICAgICAgICBtZXJnZVtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBtMDsgKytqKSB7XG4gICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKG1lcmdlcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTtcbiAgICAgIGlmIChub2RlKSByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzKTtcbn1cbiIsImZ1bmN0aW9uIGNvbnRleHRMaXN0ZW5lcihsaXN0ZW5lcikge1xuICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50LCB0aGlzLl9fZGF0YV9fKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUeXBlbmFtZXModHlwZW5hbWVzKSB7XG4gIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxccysvKS5tYXAoZnVuY3Rpb24odCkge1xuICAgIHZhciBuYW1lID0gXCJcIiwgaSA9IHQuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb25SZW1vdmUodHlwZW5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBvbiA9IHRoaXMuX19vbjtcbiAgICBpZiAoIW9uKSByZXR1cm47XG4gICAgZm9yICh2YXIgaiA9IDAsIGkgPSAtMSwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikge1xuICAgICAgaWYgKG8gPSBvbltqXSwgKCF0eXBlbmFtZS50eXBlIHx8IG8udHlwZSA9PT0gdHlwZW5hbWUudHlwZSkgJiYgby5uYW1lID09PSB0eXBlbmFtZS5uYW1lKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8ub3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvblsrK2ldID0gbztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCsraSkgb24ubGVuZ3RoID0gaTtcbiAgICBlbHNlIGRlbGV0ZSB0aGlzLl9fb247XG4gIH07XG59XG5cbmZ1bmN0aW9uIG9uQWRkKHR5cGVuYW1lLCB2YWx1ZSwgb3B0aW9ucykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9uID0gdGhpcy5fX29uLCBvLCBsaXN0ZW5lciA9IGNvbnRleHRMaXN0ZW5lcih2YWx1ZSk7XG4gICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgICAgaWYgKChvID0gb25bal0pLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUgJiYgby5uYW1lID09PSB0eXBlbmFtZS5uYW1lKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8ub3B0aW9ucyk7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIgPSBsaXN0ZW5lciwgby5vcHRpb25zID0gb3B0aW9ucyk7XG4gICAgICAgIG8udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIodHlwZW5hbWUudHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICAgIG8gPSB7dHlwZTogdHlwZW5hbWUudHlwZSwgbmFtZTogdHlwZW5hbWUubmFtZSwgdmFsdWU6IHZhbHVlLCBsaXN0ZW5lcjogbGlzdGVuZXIsIG9wdGlvbnM6IG9wdGlvbnN9O1xuICAgIGlmICghb24pIHRoaXMuX19vbiA9IFtvXTtcbiAgICBlbHNlIG9uLnB1c2gobyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHR5cGVuYW1lLCB2YWx1ZSwgb3B0aW9ucykge1xuICB2YXIgdHlwZW5hbWVzID0gcGFyc2VUeXBlbmFtZXModHlwZW5hbWUgKyBcIlwiKSwgaSwgbiA9IHR5cGVuYW1lcy5sZW5ndGgsIHQ7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIG9uID0gdGhpcy5ub2RlKCkuX19vbjtcbiAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7XG4gICAgICBmb3IgKGkgPSAwLCBvID0gb25bal07IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKCh0ID0gdHlwZW5hbWVzW2ldKS50eXBlID09PSBvLnR5cGUgJiYgdC5uYW1lID09PSBvLm5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gby52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBvbiA9IHZhbHVlID8gb25BZGQgOiBvblJlbW92ZTtcbiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgdGhpcy5lYWNoKG9uKHR5cGVuYW1lc1tpXSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgcmV0dXJuIHRoaXM7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAtMSwgbSA9IGdyb3Vwcy5sZW5ndGg7ICsraiA8IG07KSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSBncm91cC5sZW5ndGggLSAxLCBuZXh0ID0gZ3JvdXBbaV0sIG5vZGU7IC0taSA+PSAwOykge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBpZiAobmV4dCAmJiBub2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5leHQpIF4gNCkgbmV4dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBuZXh0KTtcbiAgICAgICAgbmV4dCA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCJmdW5jdGlvbiBwcm9wZXJ0eVJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBkZWxldGUgdGhpc1tuYW1lXTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlDb25zdGFudChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpc1tuYW1lXSA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgZGVsZXRlIHRoaXNbbmFtZV07XG4gICAgZWxzZSB0aGlzW25hbWVdID0gdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxXG4gICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgICAgID8gcHJvcGVydHlSZW1vdmUgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gcHJvcGVydHlGdW5jdGlvblxuICAgICAgICAgIDogcHJvcGVydHlDb25zdGFudCkobmFtZSwgdmFsdWUpKVxuICAgICAgOiB0aGlzLm5vZGUoKVtuYW1lXTtcbn1cbiIsImZ1bmN0aW9uIHJhaXNlKCkge1xuICBpZiAodGhpcy5uZXh0U2libGluZykgdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChyYWlzZSk7XG59XG4iLCJmdW5jdGlvbiByZW1vdmUoKSB7XG4gIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gocmVtb3ZlKTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNlbGVjdG9yIGZyb20gXCIuLi9zZWxlY3Rvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkge1xuICAgICAgICBpZiAoXCJfX2RhdGFfX1wiIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fO1xuICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IGFycmF5IGZyb20gXCIuLi9hcnJheS5qc1wiO1xuaW1wb3J0IHNlbGVjdG9yQWxsIGZyb20gXCIuLi9zZWxlY3RvckFsbC5qc1wiO1xuXG5mdW5jdGlvbiBhcnJheUFsbChzZWxlY3QpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBhcnJheShzZWxlY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICBpZiAodHlwZW9mIHNlbGVjdCA9PT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBhcnJheUFsbChzZWxlY3QpO1xuICBlbHNlIHNlbGVjdCA9IHNlbGVjdG9yQWxsKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgc3ViZ3JvdXBzLnB1c2goc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKTtcbiAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgcGFyZW50cyk7XG59XG4iLCJpbXBvcnQge2NoaWxkTWF0Y2hlcn0gZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxudmFyIGZpbmQgPSBBcnJheS5wcm90b3R5cGUuZmluZDtcblxuZnVuY3Rpb24gY2hpbGRGaW5kKG1hdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZmluZC5jYWxsKHRoaXMuY2hpbGRyZW4sIG1hdGNoKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2hpbGRGaXJzdCgpIHtcbiAgcmV0dXJuIHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIHJldHVybiB0aGlzLnNlbGVjdChtYXRjaCA9PSBudWxsID8gY2hpbGRGaXJzdFxuICAgICAgOiBjaGlsZEZpbmQodHlwZW9mIG1hdGNoID09PSBcImZ1bmN0aW9uXCIgPyBtYXRjaCA6IGNoaWxkTWF0Y2hlcihtYXRjaCkpKTtcbn1cbiIsImltcG9ydCB7Y2hpbGRNYXRjaGVyfSBmcm9tIFwiLi4vbWF0Y2hlci5qc1wiO1xuXG52YXIgZmlsdGVyID0gQXJyYXkucHJvdG90eXBlLmZpbHRlcjtcblxuZnVuY3Rpb24gY2hpbGRyZW4oKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pO1xufVxuXG5mdW5jdGlvbiBjaGlsZHJlbkZpbHRlcihtYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZpbHRlci5jYWxsKHRoaXMuY2hpbGRyZW4sIG1hdGNoKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0QWxsKG1hdGNoID09IG51bGwgPyBjaGlsZHJlblxuICAgICAgOiBjaGlsZHJlbkZpbHRlcih0eXBlb2YgbWF0Y2ggPT09IFwiZnVuY3Rpb25cIiA/IG1hdGNoIDogY2hpbGRNYXRjaGVyKG1hdGNoKSkpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIGxldCBzaXplID0gMDtcbiAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMpICsrc2l6ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICByZXR1cm4gc2l6ZTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb21wYXJlKSB7XG4gIGlmICghY29tcGFyZSkgY29tcGFyZSA9IGFzY2VuZGluZztcblxuICBmdW5jdGlvbiBjb21wYXJlTm9kZShhLCBiKSB7XG4gICAgcmV0dXJuIGEgJiYgYiA/IGNvbXBhcmUoYS5fX2RhdGFfXywgYi5fX2RhdGFfXykgOiAhYSAtICFiO1xuICB9XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc29ydGdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc29ydGdyb3VwID0gc29ydGdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgc29ydGdyb3VwW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc29ydGdyb3VwLnNvcnQoY29tcGFyZU5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc29ydGdyb3VwcywgdGhpcy5fcGFyZW50cykub3JkZXIoKTtcbn1cblxuZnVuY3Rpb24gYXNjZW5kaW5nKGEsIGIpIHtcbiAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odXBkYXRlKSB7XG4gIHJldHVybiBuZXcgQXJyYXkodXBkYXRlLmxlbmd0aCk7XG59XG4iLCJpbXBvcnQgZGVmYXVsdFZpZXcgZnJvbSBcIi4uL3dpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBzdHlsZVJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUNvbnN0YW50KG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gICAgZWxzZSB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHYsIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMVxuICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgICAgICAgID8gc3R5bGVSZW1vdmUgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgPyBzdHlsZUZ1bmN0aW9uXG4gICAgICAgICAgICA6IHN0eWxlQ29uc3RhbnQpKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gXCJcIiA6IHByaW9yaXR5KSlcbiAgICAgIDogc3R5bGVWYWx1ZSh0aGlzLm5vZGUoKSwgbmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHlsZVZhbHVlKG5vZGUsIG5hbWUpIHtcbiAgcmV0dXJuIG5vZGUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKVxuICAgICAgfHwgZGVmYXVsdFZpZXcobm9kZSkuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpO1xufVxuIiwiZnVuY3Rpb24gdGV4dFJlbW92ZSgpIHtcbiAgdGhpcy50ZXh0Q29udGVudCA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIHRleHRDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdiA9PSBudWxsID8gXCJcIiA6IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyB0ZXh0UmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0ZXh0RnVuY3Rpb25cbiAgICAgICAgICA6IHRleHRDb25zdGFudCkodmFsdWUpKVxuICAgICAgOiB0aGlzLm5vZGUoKS50ZXh0Q29udGVudDtcbn1cbiIsImZ1bmN0aW9uIG5vbmUoKSB7fVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IG5vbmUgOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgfTtcbn1cbiIsImZ1bmN0aW9uIGVtcHR5KCkge1xuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gZW1wdHkgOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50KSB7XG4gIGxldCBzb3VyY2VFdmVudDtcbiAgd2hpbGUgKHNvdXJjZUV2ZW50ID0gZXZlbnQuc291cmNlRXZlbnQpIGV2ZW50ID0gc291cmNlRXZlbnQ7XG4gIHJldHVybiBldmVudDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUpIHtcbiAgcmV0dXJuIChub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSAvLyBub2RlIGlzIGEgTm9kZVxuICAgICAgfHwgKG5vZGUuZG9jdW1lbnQgJiYgbm9kZSkgLy8gbm9kZSBpcyBhIFdpbmRvd1xuICAgICAgfHwgbm9kZS5kZWZhdWx0VmlldzsgLy8gbm9kZSBpcyBhIERvY3VtZW50XG59XG4iLCJpbXBvcnQge1RpbWVyfSBmcm9tIFwiLi90aW1lci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgdmFyIHQgPSBuZXcgVGltZXI7XG4gIGRlbGF5ID0gZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXk7XG4gIHQucmVzdGFydChlbGFwc2VkID0+IHtcbiAgICB0LnN0b3AoKTtcbiAgICBjYWxsYmFjayhlbGFwc2VkICsgZGVsYXkpO1xuICB9LCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuIiwidmFyIGZyYW1lID0gMCwgLy8gaXMgYW4gYW5pbWF0aW9uIGZyYW1lIHBlbmRpbmc/XG4gICAgdGltZW91dCA9IDAsIC8vIGlzIGEgdGltZW91dCBwZW5kaW5nP1xuICAgIGludGVydmFsID0gMCwgLy8gYXJlIGFueSB0aW1lcnMgYWN0aXZlP1xuICAgIHBva2VEZWxheSA9IDEwMDAsIC8vIGhvdyBmcmVxdWVudGx5IHdlIGNoZWNrIGZvciBjbG9jayBza2V3XG4gICAgdGFza0hlYWQsXG4gICAgdGFza1RhaWwsXG4gICAgY2xvY2tMYXN0ID0gMCxcbiAgICBjbG9ja05vdyA9IDAsXG4gICAgY2xvY2tTa2V3ID0gMCxcbiAgICBjbG9jayA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gXCJvYmplY3RcIiAmJiBwZXJmb3JtYW5jZS5ub3cgPyBwZXJmb3JtYW5jZSA6IERhdGUsXG4gICAgc2V0RnJhbWUgPSB0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KSA6IGZ1bmN0aW9uKGYpIHsgc2V0VGltZW91dChmLCAxNyk7IH07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3coKSB7XG4gIHJldHVybiBjbG9ja05vdyB8fCAoc2V0RnJhbWUoY2xlYXJOb3cpLCBjbG9ja05vdyA9IGNsb2NrLm5vdygpICsgY2xvY2tTa2V3KTtcbn1cblxuZnVuY3Rpb24gY2xlYXJOb3coKSB7XG4gIGNsb2NrTm93ID0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFRpbWVyKCkge1xuICB0aGlzLl9jYWxsID1cbiAgdGhpcy5fdGltZSA9XG4gIHRoaXMuX25leHQgPSBudWxsO1xufVxuXG5UaW1lci5wcm90b3R5cGUgPSB0aW1lci5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBUaW1lcixcbiAgcmVzdGFydDogZnVuY3Rpb24oY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb25cIik7XG4gICAgdGltZSA9ICh0aW1lID09IG51bGwgPyBub3coKSA6ICt0aW1lKSArIChkZWxheSA9PSBudWxsID8gMCA6ICtkZWxheSk7XG4gICAgaWYgKCF0aGlzLl9uZXh0ICYmIHRhc2tUYWlsICE9PSB0aGlzKSB7XG4gICAgICBpZiAodGFza1RhaWwpIHRhc2tUYWlsLl9uZXh0ID0gdGhpcztcbiAgICAgIGVsc2UgdGFza0hlYWQgPSB0aGlzO1xuICAgICAgdGFza1RhaWwgPSB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9jYWxsID0gY2FsbGJhY2s7XG4gICAgdGhpcy5fdGltZSA9IHRpbWU7XG4gICAgc2xlZXAoKTtcbiAgfSxcbiAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2NhbGwpIHtcbiAgICAgIHRoaXMuX2NhbGwgPSBudWxsO1xuICAgICAgdGhpcy5fdGltZSA9IEluZmluaXR5O1xuICAgICAgc2xlZXAoKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB0aW1lcihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgdmFyIHQgPSBuZXcgVGltZXI7XG4gIHQucmVzdGFydChjYWxsYmFjaywgZGVsYXksIHRpbWUpO1xuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVyRmx1c2goKSB7XG4gIG5vdygpOyAvLyBHZXQgdGhlIGN1cnJlbnQgdGltZSwgaWYgbm90IGFscmVhZHkgc2V0LlxuICArK2ZyYW1lOyAvLyBQcmV0ZW5kIHdl4oCZdmUgc2V0IGFuIGFsYXJtLCBpZiB3ZSBoYXZlbuKAmXQgYWxyZWFkeS5cbiAgdmFyIHQgPSB0YXNrSGVhZCwgZTtcbiAgd2hpbGUgKHQpIHtcbiAgICBpZiAoKGUgPSBjbG9ja05vdyAtIHQuX3RpbWUpID49IDApIHQuX2NhbGwuY2FsbCh1bmRlZmluZWQsIGUpO1xuICAgIHQgPSB0Ll9uZXh0O1xuICB9XG4gIC0tZnJhbWU7XG59XG5cbmZ1bmN0aW9uIHdha2UoKSB7XG4gIGNsb2NrTm93ID0gKGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpKSArIGNsb2NrU2tldztcbiAgZnJhbWUgPSB0aW1lb3V0ID0gMDtcbiAgdHJ5IHtcbiAgICB0aW1lckZsdXNoKCk7XG4gIH0gZmluYWxseSB7XG4gICAgZnJhbWUgPSAwO1xuICAgIG5hcCgpO1xuICAgIGNsb2NrTm93ID0gMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb2tlKCkge1xuICB2YXIgbm93ID0gY2xvY2subm93KCksIGRlbGF5ID0gbm93IC0gY2xvY2tMYXN0O1xuICBpZiAoZGVsYXkgPiBwb2tlRGVsYXkpIGNsb2NrU2tldyAtPSBkZWxheSwgY2xvY2tMYXN0ID0gbm93O1xufVxuXG5mdW5jdGlvbiBuYXAoKSB7XG4gIHZhciB0MCwgdDEgPSB0YXNrSGVhZCwgdDIsIHRpbWUgPSBJbmZpbml0eTtcbiAgd2hpbGUgKHQxKSB7XG4gICAgaWYgKHQxLl9jYWxsKSB7XG4gICAgICBpZiAodGltZSA+IHQxLl90aW1lKSB0aW1lID0gdDEuX3RpbWU7XG4gICAgICB0MCA9IHQxLCB0MSA9IHQxLl9uZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0MiA9IHQxLl9uZXh0LCB0MS5fbmV4dCA9IG51bGw7XG4gICAgICB0MSA9IHQwID8gdDAuX25leHQgPSB0MiA6IHRhc2tIZWFkID0gdDI7XG4gICAgfVxuICB9XG4gIHRhc2tUYWlsID0gdDA7XG4gIHNsZWVwKHRpbWUpO1xufVxuXG5mdW5jdGlvbiBzbGVlcCh0aW1lKSB7XG4gIGlmIChmcmFtZSkgcmV0dXJuOyAvLyBTb29uZXN0IGFsYXJtIGFscmVhZHkgc2V0LCBvciB3aWxsIGJlLlxuICBpZiAodGltZW91dCkgdGltZW91dCA9IGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgdmFyIGRlbGF5ID0gdGltZSAtIGNsb2NrTm93OyAvLyBTdHJpY3RseSBsZXNzIHRoYW4gaWYgd2UgcmVjb21wdXRlZCBjbG9ja05vdy5cbiAgaWYgKGRlbGF5ID4gMjQpIHtcbiAgICBpZiAodGltZSA8IEluZmluaXR5KSB0aW1lb3V0ID0gc2V0VGltZW91dCh3YWtlLCB0aW1lIC0gY2xvY2subm93KCkgLSBjbG9ja1NrZXcpO1xuICAgIGlmIChpbnRlcnZhbCkgaW50ZXJ2YWwgPSBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWludGVydmFsKSBjbG9ja0xhc3QgPSBjbG9jay5ub3coKSwgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChwb2tlLCBwb2tlRGVsYXkpO1xuICAgIGZyYW1lID0gMSwgc2V0RnJhbWUod2FrZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vdHJhbnNpdGlvbi9pbmRleC5qc1wiO1xuaW1wb3J0IHtTQ0hFRFVMRUR9IGZyb20gXCIuL3RyYW5zaXRpb24vc2NoZWR1bGUuanNcIjtcblxudmFyIHJvb3QgPSBbbnVsbF07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIG5hbWUpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLFxuICAgICAgc2NoZWR1bGUsXG4gICAgICBpO1xuXG4gIGlmIChzY2hlZHVsZXMpIHtcbiAgICBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyBcIlwiO1xuICAgIGZvciAoaSBpbiBzY2hlZHVsZXMpIHtcbiAgICAgIGlmICgoc2NoZWR1bGUgPSBzY2hlZHVsZXNbaV0pLnN0YXRlID4gU0NIRURVTEVEICYmIHNjaGVkdWxlLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKFtbbm9kZV1dLCByb290LCBuYW1lLCAraSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCJpbXBvcnQgXCIuL3NlbGVjdGlvbi9pbmRleC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHRyYW5zaXRpb259IGZyb20gXCIuL3RyYW5zaXRpb24vaW5kZXguanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBhY3RpdmV9IGZyb20gXCIuL2FjdGl2ZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycnVwdH0gZnJvbSBcIi4vaW50ZXJydXB0LmpzXCI7XG4iLCJpbXBvcnQge1NUQVJUSU5HLCBFTkRJTkcsIEVOREVEfSBmcm9tIFwiLi90cmFuc2l0aW9uL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIG5hbWUpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLFxuICAgICAgc2NoZWR1bGUsXG4gICAgICBhY3RpdmUsXG4gICAgICBlbXB0eSA9IHRydWUsXG4gICAgICBpO1xuXG4gIGlmICghc2NoZWR1bGVzKSByZXR1cm47XG5cbiAgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcblxuICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7XG4gICAgaWYgKChzY2hlZHVsZSA9IHNjaGVkdWxlc1tpXSkubmFtZSAhPT0gbmFtZSkgeyBlbXB0eSA9IGZhbHNlOyBjb250aW51ZTsgfVxuICAgIGFjdGl2ZSA9IHNjaGVkdWxlLnN0YXRlID4gU1RBUlRJTkcgJiYgc2NoZWR1bGUuc3RhdGUgPCBFTkRJTkc7XG4gICAgc2NoZWR1bGUuc3RhdGUgPSBFTkRFRDtcbiAgICBzY2hlZHVsZS50aW1lci5zdG9wKCk7XG4gICAgc2NoZWR1bGUub24uY2FsbChhY3RpdmUgPyBcImludGVycnVwdFwiIDogXCJjYW5jZWxcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2NoZWR1bGUuaW5kZXgsIHNjaGVkdWxlLmdyb3VwKTtcbiAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICB9XG5cbiAgaWYgKGVtcHR5KSBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247XG59XG4iLCJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHNlbGVjdGlvbl9pbnRlcnJ1cHQgZnJvbSBcIi4vaW50ZXJydXB0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3RyYW5zaXRpb24gZnJvbSBcIi4vdHJhbnNpdGlvbi5qc1wiO1xuXG5zZWxlY3Rpb24ucHJvdG90eXBlLmludGVycnVwdCA9IHNlbGVjdGlvbl9pbnRlcnJ1cHQ7XG5zZWxlY3Rpb24ucHJvdG90eXBlLnRyYW5zaXRpb24gPSBzZWxlY3Rpb25fdHJhbnNpdGlvbjtcbiIsImltcG9ydCBpbnRlcnJ1cHQgZnJvbSBcIi4uL2ludGVycnVwdC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgaW50ZXJydXB0KHRoaXMsIG5hbWUpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7VHJhbnNpdGlvbiwgbmV3SWR9IGZyb20gXCIuLi90cmFuc2l0aW9uL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUgZnJvbSBcIi4uL3RyYW5zaXRpb24vc2NoZWR1bGUuanNcIjtcbmltcG9ydCB7ZWFzZUN1YmljSW5PdXR9IGZyb20gXCJkMy1lYXNlXCI7XG5pbXBvcnQge25vd30gZnJvbSBcImQzLXRpbWVyXCI7XG5cbnZhciBkZWZhdWx0VGltaW5nID0ge1xuICB0aW1lOiBudWxsLCAvLyBTZXQgb24gdXNlLlxuICBkZWxheTogMCxcbiAgZHVyYXRpb246IDI1MCxcbiAgZWFzZTogZWFzZUN1YmljSW5PdXRcbn07XG5cbmZ1bmN0aW9uIGluaGVyaXQobm9kZSwgaWQpIHtcbiAgdmFyIHRpbWluZztcbiAgd2hpbGUgKCEodGltaW5nID0gbm9kZS5fX3RyYW5zaXRpb24pIHx8ICEodGltaW5nID0gdGltaW5nW2lkXSkpIHtcbiAgICBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB0cmFuc2l0aW9uICR7aWR9IG5vdCBmb3VuZGApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGltaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBpZCxcbiAgICAgIHRpbWluZztcblxuICBpZiAobmFtZSBpbnN0YW5jZW9mIFRyYW5zaXRpb24pIHtcbiAgICBpZCA9IG5hbWUuX2lkLCBuYW1lID0gbmFtZS5fbmFtZTtcbiAgfSBlbHNlIHtcbiAgICBpZCA9IG5ld0lkKCksICh0aW1pbmcgPSBkZWZhdWx0VGltaW5nKS50aW1lID0gbm93KCksIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG4gIH1cblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzY2hlZHVsZShub2RlLCBuYW1lLCBpZCwgaSwgZ3JvdXAsIHRpbWluZyB8fCBpbmhlcml0KG5vZGUsIGlkKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwiaW1wb3J0IHtpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyBhcyBpbnRlcnBvbGF0ZVRyYW5zZm9ybX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge25hbWVzcGFjZX0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IGludGVycG9sYXRlIGZyb20gXCIuL2ludGVycG9sYXRlLmpzXCI7XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmVOUyhmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIixcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbihuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyhmdWxsbmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAsIHZhbHVlMSA9IHZhbHVlKHRoaXMpLCBzdHJpbmcxO1xuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSksIGkgPSBmdWxsbmFtZSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGludGVycG9sYXRlVHJhbnNmb3JtIDogaW50ZXJwb2xhdGU7XG4gIHJldHVybiB0aGlzLmF0dHJUd2VlbihuYW1lLCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbikoZnVsbG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgXCJhdHRyLlwiICsgbmFtZSwgdmFsdWUpKVxuICAgICAgOiB2YWx1ZSA9PSBudWxsID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkoZnVsbG5hbWUpXG4gICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50KShmdWxsbmFtZSwgaSwgdmFsdWUpKTtcbn1cbiIsImltcG9ydCB7bmFtZXNwYWNlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5cbmZ1bmN0aW9uIGF0dHJJbnRlcnBvbGF0ZShuYW1lLCBpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgaS5jYWxsKHRoaXMsIHQpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgaS5jYWxsKHRoaXMsIHQpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clR3ZWVuTlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5mdW5jdGlvbiBhdHRyVHdlZW4obmFtZSwgdmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGUobmFtZSwgaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBrZXkgPSBcImF0dHIuXCIgKyBuYW1lO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCAoZnVsbG5hbWUubG9jYWwgPyBhdHRyVHdlZW5OUyA6IGF0dHJUd2VlbikoZnVsbG5hbWUsIHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge2dldCwgaW5pdH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZGVsYXlGdW5jdGlvbihpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlbGF5Q29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24oKSB7XG4gICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gZGVsYXlGdW5jdGlvblxuICAgICAgICAgIDogZGVsYXlDb25zdGFudCkoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZGVsYXk7XG59XG4iLCJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBkdXJhdGlvbkZ1bmN0aW9uKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkdXJhdGlvbkNvbnN0YW50KGlkLCB2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZHVyYXRpb24gPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gZHVyYXRpb25GdW5jdGlvblxuICAgICAgICAgIDogZHVyYXRpb25Db25zdGFudCkoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZHVyYXRpb247XG59XG4iLCJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5lYXNlID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaChlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZWFzZTtcbn1cbiIsImltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBlYXNlVmFyeWluZyhpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodHlwZW9mIHYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gdGhpcy5lYWNoKGVhc2VWYXJ5aW5nKHRoaXMuX2lkLCB2YWx1ZSkpO1xufVxuIiwiaW1wb3J0IHtzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgb24wLCBvbjEsIHRoYXQgPSB0aGlzLCBpZCA9IHRoYXQuX2lkLCBzaXplID0gdGhhdC5zaXplKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgY2FuY2VsID0ge3ZhbHVlOiByZWplY3R9LFxuICAgICAgICBlbmQgPSB7dmFsdWU6IGZ1bmN0aW9uKCkgeyBpZiAoLS1zaXplID09PSAwKSByZXNvbHZlKCk7IH19O1xuXG4gICAgdGhhdC5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgICBvbiA9IHNjaGVkdWxlLm9uO1xuXG4gICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBhbmQgd2XigJlyZSBkb25lIVxuICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgICAgaWYgKG9uICE9PSBvbjApIHtcbiAgICAgICAgb24xID0gKG9uMCA9IG9uKS5jb3B5KCk7XG4gICAgICAgIG9uMS5fLmNhbmNlbC5wdXNoKGNhbmNlbCk7XG4gICAgICAgIG9uMS5fLmludGVycnVwdC5wdXNoKGNhbmNlbCk7XG4gICAgICAgIG9uMS5fLmVuZC5wdXNoKGVuZCk7XG4gICAgICB9XG5cbiAgICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIHNlbGVjdGlvbiB3YXMgZW1wdHksIHJlc29sdmUgZW5kIGltbWVkaWF0ZWx5XG4gICAgaWYgKHNpemUgPT09IDApIHJlc29sdmUoKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQge21hdGNoZXJ9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gXCJmdW5jdGlvblwiKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBtYXRjaC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkge1xuICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTtcbn1cbiIsImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9hdHRyIGZyb20gXCIuL2F0dHIuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2F0dHJUd2VlbiBmcm9tIFwiLi9hdHRyVHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2RlbGF5IGZyb20gXCIuL2RlbGF5LmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9kdXJhdGlvbiBmcm9tIFwiLi9kdXJhdGlvbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZWFzZSBmcm9tIFwiLi9lYXNlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lYXNlVmFyeWluZyBmcm9tIFwiLi9lYXNlVmFyeWluZy5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZmlsdGVyIGZyb20gXCIuL2ZpbHRlci5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fbWVyZ2UgZnJvbSBcIi4vbWVyZ2UuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX29uIGZyb20gXCIuL29uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9yZW1vdmUgZnJvbSBcIi4vcmVtb3ZlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zZWxlY3QgZnJvbSBcIi4vc2VsZWN0LmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zZWxlY3RBbGwgZnJvbSBcIi4vc2VsZWN0QWxsLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zZWxlY3Rpb24gZnJvbSBcIi4vc2VsZWN0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zdHlsZSBmcm9tIFwiLi9zdHlsZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc3R5bGVUd2VlbiBmcm9tIFwiLi9zdHlsZVR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90ZXh0IGZyb20gXCIuL3RleHQuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3RleHRUd2VlbiBmcm9tIFwiLi90ZXh0VHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3RyYW5zaXRpb24gZnJvbSBcIi4vdHJhbnNpdGlvbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdHdlZW4gZnJvbSBcIi4vdHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2VuZCBmcm9tIFwiLi9lbmQuanNcIjtcblxudmFyIGlkID0gMDtcblxuZXhwb3J0IGZ1bmN0aW9uIFRyYW5zaXRpb24oZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCkge1xuICB0aGlzLl9ncm91cHMgPSBncm91cHM7XG4gIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzO1xuICB0aGlzLl9uYW1lID0gbmFtZTtcbiAgdGhpcy5faWQgPSBpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNpdGlvbihuYW1lKSB7XG4gIHJldHVybiBzZWxlY3Rpb24oKS50cmFuc2l0aW9uKG5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV3SWQoKSB7XG4gIHJldHVybiArK2lkO1xufVxuXG52YXIgc2VsZWN0aW9uX3Byb3RvdHlwZSA9IHNlbGVjdGlvbi5wcm90b3R5cGU7XG5cblRyYW5zaXRpb24ucHJvdG90eXBlID0gdHJhbnNpdGlvbi5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBUcmFuc2l0aW9uLFxuICBzZWxlY3Q6IHRyYW5zaXRpb25fc2VsZWN0LFxuICBzZWxlY3RBbGw6IHRyYW5zaXRpb25fc2VsZWN0QWxsLFxuICBzZWxlY3RDaGlsZDogc2VsZWN0aW9uX3Byb3RvdHlwZS5zZWxlY3RDaGlsZCxcbiAgc2VsZWN0Q2hpbGRyZW46IHNlbGVjdGlvbl9wcm90b3R5cGUuc2VsZWN0Q2hpbGRyZW4sXG4gIGZpbHRlcjogdHJhbnNpdGlvbl9maWx0ZXIsXG4gIG1lcmdlOiB0cmFuc2l0aW9uX21lcmdlLFxuICBzZWxlY3Rpb246IHRyYW5zaXRpb25fc2VsZWN0aW9uLFxuICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uX3RyYW5zaXRpb24sXG4gIGNhbGw6IHNlbGVjdGlvbl9wcm90b3R5cGUuY2FsbCxcbiAgbm9kZXM6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZXMsXG4gIG5vZGU6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZSxcbiAgc2l6ZTogc2VsZWN0aW9uX3Byb3RvdHlwZS5zaXplLFxuICBlbXB0eTogc2VsZWN0aW9uX3Byb3RvdHlwZS5lbXB0eSxcbiAgZWFjaDogc2VsZWN0aW9uX3Byb3RvdHlwZS5lYWNoLFxuICBvbjogdHJhbnNpdGlvbl9vbixcbiAgYXR0cjogdHJhbnNpdGlvbl9hdHRyLFxuICBhdHRyVHdlZW46IHRyYW5zaXRpb25fYXR0clR3ZWVuLFxuICBzdHlsZTogdHJhbnNpdGlvbl9zdHlsZSxcbiAgc3R5bGVUd2VlbjogdHJhbnNpdGlvbl9zdHlsZVR3ZWVuLFxuICB0ZXh0OiB0cmFuc2l0aW9uX3RleHQsXG4gIHRleHRUd2VlbjogdHJhbnNpdGlvbl90ZXh0VHdlZW4sXG4gIHJlbW92ZTogdHJhbnNpdGlvbl9yZW1vdmUsXG4gIHR3ZWVuOiB0cmFuc2l0aW9uX3R3ZWVuLFxuICBkZWxheTogdHJhbnNpdGlvbl9kZWxheSxcbiAgZHVyYXRpb246IHRyYW5zaXRpb25fZHVyYXRpb24sXG4gIGVhc2U6IHRyYW5zaXRpb25fZWFzZSxcbiAgZWFzZVZhcnlpbmc6IHRyYW5zaXRpb25fZWFzZVZhcnlpbmcsXG4gIGVuZDogdHJhbnNpdGlvbl9lbmQsXG4gIFtTeW1ib2wuaXRlcmF0b3JdOiBzZWxlY3Rpb25fcHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl1cbn07XG4iLCJpbXBvcnQge2NvbG9yfSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCB7aW50ZXJwb2xhdGVOdW1iZXIsIGludGVycG9sYXRlUmdiLCBpbnRlcnBvbGF0ZVN0cmluZ30gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGM7XG4gIHJldHVybiAodHlwZW9mIGIgPT09IFwibnVtYmVyXCIgPyBpbnRlcnBvbGF0ZU51bWJlclxuICAgICAgOiBiIGluc3RhbmNlb2YgY29sb3IgPyBpbnRlcnBvbGF0ZVJnYlxuICAgICAgOiAoYyA9IGNvbG9yKGIpKSA/IChiID0gYywgaW50ZXJwb2xhdGVSZ2IpXG4gICAgICA6IGludGVycG9sYXRlU3RyaW5nKShhLCBiKTtcbn1cbiIsImltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHJhbnNpdGlvbikge1xuICBpZiAodHJhbnNpdGlvbi5faWQgIT09IHRoaXMuX2lkKSB0aHJvdyBuZXcgRXJyb3I7XG5cbiAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3VwcywgZ3JvdXBzMSA9IHRyYW5zaXRpb24uX2dyb3VwcywgbTAgPSBncm91cHMwLmxlbmd0aCwgbTEgPSBncm91cHMxLmxlbmd0aCwgbSA9IE1hdGgubWluKG0wLCBtMSksIG1lcmdlcyA9IG5ldyBBcnJheShtMCksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwgbiA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7XG4gICAgICAgIG1lcmdlW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKDsgaiA8IG0wOyArK2opIHtcbiAgICBtZXJnZXNbal0gPSBncm91cHMwW2pdO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKG1lcmdlcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpO1xufVxuIiwiaW1wb3J0IHtnZXQsIHNldCwgaW5pdH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gc3RhcnQobmFtZSkge1xuICByZXR1cm4gKG5hbWUgKyBcIlwiKS50cmltKCkuc3BsaXQoL158XFxzKy8pLmV2ZXJ5KGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IHQuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGkgPj0gMCkgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgcmV0dXJuICF0IHx8IHQgPT09IFwic3RhcnRcIjtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uRnVuY3Rpb24oaWQsIG5hbWUsIGxpc3RlbmVyKSB7XG4gIHZhciBvbjAsIG9uMSwgc2l0ID0gc3RhcnQobmFtZSkgPyBpbml0IDogc2V0O1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2l0KHRoaXMsIGlkKSxcbiAgICAgICAgb24gPSBzY2hlZHVsZS5vbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBhbmQgd2XigJlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAob24gIT09IG9uMCkgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihuYW1lLCBsaXN0ZW5lcik7XG5cbiAgICBzY2hlZHVsZS5vbiA9IG9uMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgbGlzdGVuZXIpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyXG4gICAgICA/IGdldCh0aGlzLm5vZGUoKSwgaWQpLm9uLm9uKG5hbWUpXG4gICAgICA6IHRoaXMuZWFjaChvbkZ1bmN0aW9uKGlkLCBuYW1lLCBsaXN0ZW5lcikpO1xufVxuIiwiZnVuY3Rpb24gcmVtb3ZlRnVuY3Rpb24oaWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gICAgZm9yICh2YXIgaSBpbiB0aGlzLl9fdHJhbnNpdGlvbikgaWYgKCtpICE9PSBpZCkgcmV0dXJuO1xuICAgIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLm9uKFwiZW5kLnJlbW92ZVwiLCByZW1vdmVGdW5jdGlvbih0aGlzLl9pZCkpO1xufVxuIiwiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge3RpbWVyLCB0aW1lb3V0fSBmcm9tIFwiZDMtdGltZXJcIjtcblxudmFyIGVtcHR5T24gPSBkaXNwYXRjaChcInN0YXJ0XCIsIFwiZW5kXCIsIFwiY2FuY2VsXCIsIFwiaW50ZXJydXB0XCIpO1xudmFyIGVtcHR5VHdlZW4gPSBbXTtcblxuZXhwb3J0IHZhciBDUkVBVEVEID0gMDtcbmV4cG9ydCB2YXIgU0NIRURVTEVEID0gMTtcbmV4cG9ydCB2YXIgU1RBUlRJTkcgPSAyO1xuZXhwb3J0IHZhciBTVEFSVEVEID0gMztcbmV4cG9ydCB2YXIgUlVOTklORyA9IDQ7XG5leHBvcnQgdmFyIEVORElORyA9IDU7XG5leHBvcnQgdmFyIEVOREVEID0gNjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgbmFtZSwgaWQsIGluZGV4LCBncm91cCwgdGltaW5nKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgaWYgKCFzY2hlZHVsZXMpIG5vZGUuX190cmFuc2l0aW9uID0ge307XG4gIGVsc2UgaWYgKGlkIGluIHNjaGVkdWxlcykgcmV0dXJuO1xuICBjcmVhdGUobm9kZSwgaWQsIHtcbiAgICBuYW1lOiBuYW1lLFxuICAgIGluZGV4OiBpbmRleCwgLy8gRm9yIGNvbnRleHQgZHVyaW5nIGNhbGxiYWNrLlxuICAgIGdyb3VwOiBncm91cCwgLy8gRm9yIGNvbnRleHQgZHVyaW5nIGNhbGxiYWNrLlxuICAgIG9uOiBlbXB0eU9uLFxuICAgIHR3ZWVuOiBlbXB0eVR3ZWVuLFxuICAgIHRpbWU6IHRpbWluZy50aW1lLFxuICAgIGRlbGF5OiB0aW1pbmcuZGVsYXksXG4gICAgZHVyYXRpb246IHRpbWluZy5kdXJhdGlvbixcbiAgICBlYXNlOiB0aW1pbmcuZWFzZSxcbiAgICB0aW1lcjogbnVsbCxcbiAgICBzdGF0ZTogQ1JFQVRFRFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gZ2V0KG5vZGUsIGlkKTtcbiAgaWYgKHNjaGVkdWxlLnN0YXRlID4gQ1JFQVRFRCkgdGhyb3cgbmV3IEVycm9yKFwidG9vIGxhdGU7IGFscmVhZHkgc2NoZWR1bGVkXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gZ2V0KG5vZGUsIGlkKTtcbiAgaWYgKHNjaGVkdWxlLnN0YXRlID4gU1RBUlRFRCkgdGhyb3cgbmV3IEVycm9yKFwidG9vIGxhdGU7IGFscmVhZHkgcnVubmluZ1wiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IG5vZGUuX190cmFuc2l0aW9uO1xuICBpZiAoIXNjaGVkdWxlIHx8ICEoc2NoZWR1bGUgPSBzY2hlZHVsZVtpZF0pKSB0aHJvdyBuZXcgRXJyb3IoXCJ0cmFuc2l0aW9uIG5vdCBmb3VuZFwiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGUobm9kZSwgaWQsIHNlbGYpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLFxuICAgICAgdHdlZW47XG5cbiAgLy8gSW5pdGlhbGl6ZSB0aGUgc2VsZiB0aW1lciB3aGVuIHRoZSB0cmFuc2l0aW9uIGlzIGNyZWF0ZWQuXG4gIC8vIE5vdGUgdGhlIGFjdHVhbCBkZWxheSBpcyBub3Qga25vd24gdW50aWwgdGhlIGZpcnN0IGNhbGxiYWNrIVxuICBzY2hlZHVsZXNbaWRdID0gc2VsZjtcbiAgc2VsZi50aW1lciA9IHRpbWVyKHNjaGVkdWxlLCAwLCBzZWxmLnRpbWUpO1xuXG4gIGZ1bmN0aW9uIHNjaGVkdWxlKGVsYXBzZWQpIHtcbiAgICBzZWxmLnN0YXRlID0gU0NIRURVTEVEO1xuICAgIHNlbGYudGltZXIucmVzdGFydChzdGFydCwgc2VsZi5kZWxheSwgc2VsZi50aW1lKTtcblxuICAgIC8vIElmIHRoZSBlbGFwc2VkIGRlbGF5IGlzIGxlc3MgdGhhbiBvdXIgZmlyc3Qgc2xlZXAsIHN0YXJ0IGltbWVkaWF0ZWx5LlxuICAgIGlmIChzZWxmLmRlbGF5IDw9IGVsYXBzZWQpIHN0YXJ0KGVsYXBzZWQgLSBzZWxmLmRlbGF5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGVsYXBzZWQpIHtcbiAgICB2YXIgaSwgaiwgbiwgbztcblxuICAgIC8vIElmIHRoZSBzdGF0ZSBpcyBub3QgU0NIRURVTEVELCB0aGVuIHdlIHByZXZpb3VzbHkgZXJyb3JlZCBvbiBzdGFydC5cbiAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gU0NIRURVTEVEKSByZXR1cm4gc3RvcCgpO1xuXG4gICAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgICAgbyA9IHNjaGVkdWxlc1tpXTtcbiAgICAgIGlmIChvLm5hbWUgIT09IHNlbGYubmFtZSkgY29udGludWU7XG5cbiAgICAgIC8vIFdoaWxlIHRoaXMgZWxlbWVudCBhbHJlYWR5IGhhcyBhIHN0YXJ0aW5nIHRyYW5zaXRpb24gZHVyaW5nIHRoaXMgZnJhbWUsXG4gICAgICAvLyBkZWZlciBzdGFydGluZyBhbiBpbnRlcnJ1cHRpbmcgdHJhbnNpdGlvbiB1bnRpbCB0aGF0IHRyYW5zaXRpb24gaGFzIGFcbiAgICAgIC8vIGNoYW5jZSB0byB0aWNrIChhbmQgcG9zc2libHkgZW5kKTsgc2VlIGQzL2QzLXRyYW5zaXRpb24jNTQhXG4gICAgICBpZiAoby5zdGF0ZSA9PT0gU1RBUlRFRCkgcmV0dXJuIHRpbWVvdXQoc3RhcnQpO1xuXG4gICAgICAvLyBJbnRlcnJ1cHQgdGhlIGFjdGl2ZSB0cmFuc2l0aW9uLCBpZiBhbnkuXG4gICAgICBpZiAoby5zdGF0ZSA9PT0gUlVOTklORykge1xuICAgICAgICBvLnN0YXRlID0gRU5ERUQ7XG4gICAgICAgIG8udGltZXIuc3RvcCgpO1xuICAgICAgICBvLm9uLmNhbGwoXCJpbnRlcnJ1cHRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgby5pbmRleCwgby5ncm91cCk7XG4gICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gICAgICB9XG5cbiAgICAgIC8vIENhbmNlbCBhbnkgcHJlLWVtcHRlZCB0cmFuc2l0aW9ucy5cbiAgICAgIGVsc2UgaWYgKCtpIDwgaWQpIHtcbiAgICAgICAgby5zdGF0ZSA9IEVOREVEO1xuICAgICAgICBvLnRpbWVyLnN0b3AoKTtcbiAgICAgICAgby5vbi5jYWxsKFwiY2FuY2VsXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApO1xuICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlZmVyIHRoZSBmaXJzdCB0aWNrIHRvIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZTsgc2VlIGQzL2QzIzE1NzYuXG4gICAgLy8gTm90ZSB0aGUgdHJhbnNpdGlvbiBtYXkgYmUgY2FuY2VsZWQgYWZ0ZXIgc3RhcnQgYW5kIGJlZm9yZSB0aGUgZmlyc3QgdGljayFcbiAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBzY2hlZHVsZWQgYmVmb3JlIHRoZSBzdGFydCBldmVudDsgc2VlIGQzL2QzLXRyYW5zaXRpb24jMTYhXG4gICAgLy8gQXNzdW1pbmcgdGhpcyBpcyBzdWNjZXNzZnVsLCBzdWJzZXF1ZW50IGNhbGxiYWNrcyBnbyBzdHJhaWdodCB0byB0aWNrLlxuICAgIHRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gU1RBUlRFRCkge1xuICAgICAgICBzZWxmLnN0YXRlID0gUlVOTklORztcbiAgICAgICAgc2VsZi50aW1lci5yZXN0YXJ0KHRpY2ssIHNlbGYuZGVsYXksIHNlbGYudGltZSk7XG4gICAgICAgIHRpY2soZWxhcHNlZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBEaXNwYXRjaCB0aGUgc3RhcnQgZXZlbnQuXG4gICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIHR3ZWVuIGFyZSBpbml0aWFsaXplZC5cbiAgICBzZWxmLnN0YXRlID0gU1RBUlRJTkc7XG4gICAgc2VsZi5vbi5jYWxsKFwic3RhcnRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7XG4gICAgaWYgKHNlbGYuc3RhdGUgIT09IFNUQVJUSU5HKSByZXR1cm47IC8vIGludGVycnVwdGVkXG4gICAgc2VsZi5zdGF0ZSA9IFNUQVJURUQ7XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSB0d2VlbiwgZGVsZXRpbmcgbnVsbCB0d2Vlbi5cbiAgICB0d2VlbiA9IG5ldyBBcnJheShuID0gc2VsZi50d2Vlbi5sZW5ndGgpO1xuICAgIGZvciAoaSA9IDAsIGogPSAtMTsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG8gPSBzZWxmLnR3ZWVuW2ldLnZhbHVlLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCkpIHtcbiAgICAgICAgdHdlZW5bKytqXSA9IG87XG4gICAgICB9XG4gICAgfVxuICAgIHR3ZWVuLmxlbmd0aCA9IGogKyAxO1xuICB9XG5cbiAgZnVuY3Rpb24gdGljayhlbGFwc2VkKSB7XG4gICAgdmFyIHQgPSBlbGFwc2VkIDwgc2VsZi5kdXJhdGlvbiA/IHNlbGYuZWFzZS5jYWxsKG51bGwsIGVsYXBzZWQgLyBzZWxmLmR1cmF0aW9uKSA6IChzZWxmLnRpbWVyLnJlc3RhcnQoc3RvcCksIHNlbGYuc3RhdGUgPSBFTkRJTkcsIDEpLFxuICAgICAgICBpID0gLTEsXG4gICAgICAgIG4gPSB0d2Vlbi5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgdHdlZW5baV0uY2FsbChub2RlLCB0KTtcbiAgICB9XG5cbiAgICAvLyBEaXNwYXRjaCB0aGUgZW5kIGV2ZW50LlxuICAgIGlmIChzZWxmLnN0YXRlID09PSBFTkRJTkcpIHtcbiAgICAgIHNlbGYub24uY2FsbChcImVuZFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTtcbiAgICAgIHN0b3AoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdG9wKCkge1xuICAgIHNlbGYuc3RhdGUgPSBFTkRFRDtcbiAgICBzZWxmLnRpbWVyLnN0b3AoKTtcbiAgICBkZWxldGUgc2NoZWR1bGVzW2lkXTtcbiAgICBmb3IgKHZhciBpIGluIHNjaGVkdWxlcykgcmV0dXJuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQge3NlbGVjdG9yfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUsIHtnZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsXG4gICAgICBpZCA9IHRoaXMuX2lkO1xuXG4gIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IHNlbGVjdG9yKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgc3Vibm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAoc3Vibm9kZSA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkpIHtcbiAgICAgICAgaWYgKFwiX19kYXRhX19cIiBpbiBub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXztcbiAgICAgICAgc3ViZ3JvdXBbaV0gPSBzdWJub2RlO1xuICAgICAgICBzY2hlZHVsZShzdWJncm91cFtpXSwgbmFtZSwgaWQsIGksIHN1Ymdyb3VwLCBnZXQobm9kZSwgaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCJpbXBvcnQge3NlbGVjdG9yQWxsfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUsIHtnZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsXG4gICAgICBpZCA9IHRoaXMuX2lkO1xuXG4gIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IHNlbGVjdG9yQWxsKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgZm9yICh2YXIgY2hpbGRyZW4gPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCksIGNoaWxkLCBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkKSwgayA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGsgPCBsOyArK2spIHtcbiAgICAgICAgICBpZiAoY2hpbGQgPSBjaGlsZHJlbltrXSkge1xuICAgICAgICAgICAgc2NoZWR1bGUoY2hpbGQsIG5hbWUsIGlkLCBrLCBjaGlsZHJlbiwgaW5oZXJpdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN1Ymdyb3Vwcy5wdXNoKGNoaWxkcmVuKTtcbiAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5cbnZhciBTZWxlY3Rpb24gPSBzZWxlY3Rpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImltcG9ydCB7aW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgYXMgaW50ZXJwb2xhdGVUcmFuc2Zvcm19IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtzdHlsZX0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5pbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgaW50ZXJwb2xhdGUgZnJvbSBcIi4vaW50ZXJwb2xhdGUuanNcIjtcblxuZnVuY3Rpb24gc3R5bGVOdWxsKG5hbWUsIGludGVycG9sYXRlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSBzdHlsZSh0aGlzLCBuYW1lKSxcbiAgICAgICAgc3RyaW5nMSA9ICh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpLCBzdHlsZSh0aGlzLCBuYW1lKSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHN0cmluZzEwID0gc3RyaW5nMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIixcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSBzdHlsZSh0aGlzLCBuYW1lKSxcbiAgICAgICAgdmFsdWUxID0gdmFsdWUodGhpcyksXG4gICAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiO1xuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgc3RyaW5nMSA9IHZhbHVlMSA9ICh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpLCBzdHlsZSh0aGlzLCBuYW1lKSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZU1heWJlUmVtb3ZlKGlkLCBuYW1lKSB7XG4gIHZhciBvbjAsIG9uMSwgbGlzdGVuZXIwLCBrZXkgPSBcInN0eWxlLlwiICsgbmFtZSwgZXZlbnQgPSBcImVuZC5cIiArIGtleSwgcmVtb3ZlO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgb24gPSBzY2hlZHVsZS5vbixcbiAgICAgICAgbGlzdGVuZXIgPSBzY2hlZHVsZS52YWx1ZVtrZXldID09IG51bGwgPyByZW1vdmUgfHwgKHJlbW92ZSA9IHN0eWxlUmVtb3ZlKG5hbWUpKSA6IHVuZGVmaW5lZDtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBhbmQgd2XigJlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAob24gIT09IG9uMCB8fCBsaXN0ZW5lcjAgIT09IGxpc3RlbmVyKSAob24xID0gKG9uMCA9IG9uKS5jb3B5KCkpLm9uKGV2ZW50LCBsaXN0ZW5lcjAgPSBsaXN0ZW5lcik7XG5cbiAgICBzY2hlZHVsZS5vbiA9IG9uMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciBpID0gKG5hbWUgKz0gXCJcIikgPT09IFwidHJhbnNmb3JtXCIgPyBpbnRlcnBvbGF0ZVRyYW5zZm9ybSA6IGludGVycG9sYXRlO1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IHRoaXNcbiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlTnVsbChuYW1lLCBpKSlcbiAgICAgIC5vbihcImVuZC5zdHlsZS5cIiArIG5hbWUsIHN0eWxlUmVtb3ZlKG5hbWUpKVxuICAgIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZUZ1bmN0aW9uKG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgXCJzdHlsZS5cIiArIG5hbWUsIHZhbHVlKSkpXG4gICAgICAuZWFjaChzdHlsZU1heWJlUmVtb3ZlKHRoaXMuX2lkLCBuYW1lKSlcbiAgICA6IHRoaXNcbiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlQ29uc3RhbnQobmFtZSwgaSwgdmFsdWUpLCBwcmlvcml0eSlcbiAgICAgIC5vbihcImVuZC5zdHlsZS5cIiArIG5hbWUsIG51bGwpO1xufVxuIiwiZnVuY3Rpb24gc3R5bGVJbnRlcnBvbGF0ZShuYW1lLCBpLCBwcmlvcml0eSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgaS5jYWxsKHRoaXMsIHQpLCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciB0LCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdCA9IChpMCA9IGkpICYmIHN0eWxlSW50ZXJwb2xhdGUobmFtZSwgaSwgcHJpb3JpdHkpO1xuICAgIHJldHVybiB0O1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIga2V5ID0gXCJzdHlsZS5cIiArIChuYW1lICs9IFwiXCIpO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/IFwiXCIgOiBwcmlvcml0eSkpO1xufVxuIiwiaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuXG5mdW5jdGlvbiB0ZXh0Q29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUxID0gdmFsdWUodGhpcyk7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlMSA9PSBudWxsID8gXCJcIiA6IHZhbHVlMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHRoaXMudHdlZW4oXCJ0ZXh0XCIsIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IHRleHRGdW5jdGlvbih0d2VlblZhbHVlKHRoaXMsIFwidGV4dFwiLCB2YWx1ZSkpXG4gICAgICA6IHRleHRDb25zdGFudCh2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIikpO1xufVxuIiwiZnVuY3Rpb24gdGV4dEludGVycG9sYXRlKGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gaS5jYWxsKHRoaXMsIHQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0VHdlZW4odmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiB0ZXh0SW50ZXJwb2xhdGUoaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBrZXkgPSBcInRleHRcIjtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIHRleHRUd2Vlbih2YWx1ZSkpO1xufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9uLCBuZXdJZH0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkMCA9IHRoaXMuX2lkLFxuICAgICAgaWQxID0gbmV3SWQoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICB2YXIgaW5oZXJpdCA9IGdldChub2RlLCBpZDApO1xuICAgICAgICBzY2hlZHVsZShub2RlLCBuYW1lLCBpZDEsIGksIGdyb3VwLCB7XG4gICAgICAgICAgdGltZTogaW5oZXJpdC50aW1lICsgaW5oZXJpdC5kZWxheSArIGluaGVyaXQuZHVyYXRpb24sXG4gICAgICAgICAgZGVsYXk6IDAsXG4gICAgICAgICAgZHVyYXRpb246IGluaGVyaXQuZHVyYXRpb24sXG4gICAgICAgICAgZWFzZTogaW5oZXJpdC5lYXNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkMSk7XG59XG4iLCJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiB0d2VlblJlbW92ZShpZCwgbmFtZSkge1xuICB2YXIgdHdlZW4wLCB0d2VlbjE7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2XigJlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkge1xuICAgICAgdHdlZW4xID0gdHdlZW4wID0gdHdlZW47XG4gICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgdHdlZW4xID0gdHdlZW4xLnNsaWNlKCk7XG4gICAgICAgICAgdHdlZW4xLnNwbGljZShpLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0d2VlbkZ1bmN0aW9uKGlkLCBuYW1lLCB2YWx1ZSkge1xuICB2YXIgdHdlZW4wLCB0d2VlbjE7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHtcbiAgICAgIHR3ZWVuMSA9ICh0d2VlbjAgPSB0d2Vlbikuc2xpY2UoKTtcbiAgICAgIGZvciAodmFyIHQgPSB7bmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlfSwgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIHR3ZWVuMVtpXSA9IHQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpID09PSBuKSB0d2VlbjEucHVzaCh0KTtcbiAgICB9XG5cbiAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgbmFtZSArPSBcIlwiO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciB0d2VlbiA9IGdldCh0aGlzLm5vZGUoKSwgaWQpLnR3ZWVuO1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4ubGVuZ3RoLCB0OyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKHQgPSB0d2VlbltpXSkubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICByZXR1cm4gdC52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsID8gdHdlZW5SZW1vdmUgOiB0d2VlbkZ1bmN0aW9uKShpZCwgbmFtZSwgdmFsdWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHR3ZWVuVmFsdWUodHJhbnNpdGlvbiwgbmFtZSwgdmFsdWUpIHtcbiAgdmFyIGlkID0gdHJhbnNpdGlvbi5faWQ7XG5cbiAgdHJhbnNpdGlvbi5lYWNoKGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCk7XG4gICAgKHNjaGVkdWxlLnZhbHVlIHx8IChzY2hlZHVsZS52YWx1ZSA9IHt9KSlbbmFtZV0gPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9KTtcblxuICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgIHJldHVybiBnZXQobm9kZSwgaWQpLnZhbHVlW25hbWVdO1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgeCA9PiAoKSA9PiB4O1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gWm9vbUV2ZW50KHR5cGUsIHtcbiAgc291cmNlRXZlbnQsXG4gIHRhcmdldCxcbiAgdHJhbnNmb3JtLFxuICBkaXNwYXRjaFxufSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgdHlwZToge3ZhbHVlOiB0eXBlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHNvdXJjZUV2ZW50OiB7dmFsdWU6IHNvdXJjZUV2ZW50LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHRhcmdldDoge3ZhbHVlOiB0YXJnZXQsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgdHJhbnNmb3JtOiB7dmFsdWU6IHRyYW5zZm9ybSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBfOiB7dmFsdWU6IGRpc3BhdGNofVxuICB9KTtcbn1cbiIsImV4cG9ydCB7ZGVmYXVsdCBhcyB6b29tfSBmcm9tIFwiLi96b29tLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgem9vbVRyYW5zZm9ybSwgaWRlbnRpdHkgYXMgem9vbUlkZW50aXR5LCBUcmFuc2Zvcm0gYXMgWm9vbVRyYW5zZm9ybX0gZnJvbSBcIi4vdHJhbnNmb3JtLmpzXCI7XG4iLCJleHBvcnQgZnVuY3Rpb24gbm9wcm9wYWdhdGlvbihldmVudCkge1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gVHJhbnNmb3JtKGssIHgsIHkpIHtcbiAgdGhpcy5rID0gaztcbiAgdGhpcy54ID0geDtcbiAgdGhpcy55ID0geTtcbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zZm9ybSxcbiAgc2NhbGU6IGZ1bmN0aW9uKGspIHtcbiAgICByZXR1cm4gayA9PT0gMSA/IHRoaXMgOiBuZXcgVHJhbnNmb3JtKHRoaXMuayAqIGssIHRoaXMueCwgdGhpcy55KTtcbiAgfSxcbiAgdHJhbnNsYXRlOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgcmV0dXJuIHggPT09IDAgJiB5ID09PSAwID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rLCB0aGlzLnggKyB0aGlzLmsgKiB4LCB0aGlzLnkgKyB0aGlzLmsgKiB5KTtcbiAgfSxcbiAgYXBwbHk6IGZ1bmN0aW9uKHBvaW50KSB7XG4gICAgcmV0dXJuIFtwb2ludFswXSAqIHRoaXMuayArIHRoaXMueCwgcG9pbnRbMV0gKiB0aGlzLmsgKyB0aGlzLnldO1xuICB9LFxuICBhcHBseVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geCAqIHRoaXMuayArIHRoaXMueDtcbiAgfSxcbiAgYXBwbHlZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIHkgKiB0aGlzLmsgKyB0aGlzLnk7XG4gIH0sXG4gIGludmVydDogZnVuY3Rpb24obG9jYXRpb24pIHtcbiAgICByZXR1cm4gWyhsb2NhdGlvblswXSAtIHRoaXMueCkgLyB0aGlzLmssIChsb2NhdGlvblsxXSAtIHRoaXMueSkgLyB0aGlzLmtdO1xuICB9LFxuICBpbnZlcnRYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuICh4IC0gdGhpcy54KSAvIHRoaXMuaztcbiAgfSxcbiAgaW52ZXJ0WTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiAoeSAtIHRoaXMueSkgLyB0aGlzLms7XG4gIH0sXG4gIHJlc2NhbGVYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHguY29weSgpLmRvbWFpbih4LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCwgdGhpcykubWFwKHguaW52ZXJ0LCB4KSk7XG4gIH0sXG4gIHJlc2NhbGVZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIHkuY29weSgpLmRvbWFpbih5LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WSwgdGhpcykubWFwKHkuaW52ZXJ0LCB5KSk7XG4gIH0sXG4gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJ0cmFuc2xhdGUoXCIgKyB0aGlzLnggKyBcIixcIiArIHRoaXMueSArIFwiKSBzY2FsZShcIiArIHRoaXMuayArIFwiKVwiO1xuICB9XG59O1xuXG5leHBvcnQgdmFyIGlkZW50aXR5ID0gbmV3IFRyYW5zZm9ybSgxLCAwLCAwKTtcblxudHJhbnNmb3JtLnByb3RvdHlwZSA9IFRyYW5zZm9ybS5wcm90b3R5cGU7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zZm9ybShub2RlKSB7XG4gIHdoaWxlICghbm9kZS5fX3pvb20pIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSByZXR1cm4gaWRlbnRpdHk7XG4gIHJldHVybiBub2RlLl9fem9vbTtcbn1cbiIsImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHtkcmFnRGlzYWJsZSwgZHJhZ0VuYWJsZX0gZnJvbSBcImQzLWRyYWdcIjtcbmltcG9ydCB7aW50ZXJwb2xhdGVab29tfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7c2VsZWN0LCBwb2ludGVyfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge2ludGVycnVwdH0gZnJvbSBcImQzLXRyYW5zaXRpb25cIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IFpvb21FdmVudCBmcm9tIFwiLi9ldmVudC5qc1wiO1xuaW1wb3J0IHtUcmFuc2Zvcm0sIGlkZW50aXR5fSBmcm9tIFwiLi90cmFuc2Zvcm0uanNcIjtcbmltcG9ydCBub2V2ZW50LCB7bm9wcm9wYWdhdGlvbn0gZnJvbSBcIi4vbm9ldmVudC5qc1wiO1xuXG4vLyBJZ25vcmUgcmlnaHQtY2xpY2ssIHNpbmNlIHRoYXQgc2hvdWxkIG9wZW4gdGhlIGNvbnRleHQgbWVudS5cbi8vIGV4Y2VwdCBmb3IgcGluY2gtdG8tem9vbSwgd2hpY2ggaXMgc2VudCBhcyBhIHdoZWVsK2N0cmxLZXkgZXZlbnRcbmZ1bmN0aW9uIGRlZmF1bHRGaWx0ZXIoZXZlbnQpIHtcbiAgcmV0dXJuICghZXZlbnQuY3RybEtleSB8fCBldmVudC50eXBlID09PSAnd2hlZWwnKSAmJiAhZXZlbnQuYnV0dG9uO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0RXh0ZW50KCkge1xuICB2YXIgZSA9IHRoaXM7XG4gIGlmIChlIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkge1xuICAgIGUgPSBlLm93bmVyU1ZHRWxlbWVudCB8fCBlO1xuICAgIGlmIChlLmhhc0F0dHJpYnV0ZShcInZpZXdCb3hcIikpIHtcbiAgICAgIGUgPSBlLnZpZXdCb3guYmFzZVZhbDtcbiAgICAgIHJldHVybiBbW2UueCwgZS55XSwgW2UueCArIGUud2lkdGgsIGUueSArIGUuaGVpZ2h0XV07XG4gICAgfVxuICAgIHJldHVybiBbWzAsIDBdLCBbZS53aWR0aC5iYXNlVmFsLnZhbHVlLCBlLmhlaWdodC5iYXNlVmFsLnZhbHVlXV07XG4gIH1cbiAgcmV0dXJuIFtbMCwgMF0sIFtlLmNsaWVudFdpZHRoLCBlLmNsaWVudEhlaWdodF1dO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0VHJhbnNmb3JtKCkge1xuICByZXR1cm4gdGhpcy5fX3pvb20gfHwgaWRlbnRpdHk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRXaGVlbERlbHRhKGV2ZW50KSB7XG4gIHJldHVybiAtZXZlbnQuZGVsdGFZICogKGV2ZW50LmRlbHRhTW9kZSA9PT0gMSA/IDAuMDUgOiBldmVudC5kZWx0YU1vZGUgPyAxIDogMC4wMDIpICogKGV2ZW50LmN0cmxLZXkgPyAxMCA6IDEpO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0VG91Y2hhYmxlKCkge1xuICByZXR1cm4gbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzIHx8IChcIm9udG91Y2hzdGFydFwiIGluIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q29uc3RyYWluKHRyYW5zZm9ybSwgZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpIHtcbiAgdmFyIGR4MCA9IHRyYW5zZm9ybS5pbnZlcnRYKGV4dGVudFswXVswXSkgLSB0cmFuc2xhdGVFeHRlbnRbMF1bMF0sXG4gICAgICBkeDEgPSB0cmFuc2Zvcm0uaW52ZXJ0WChleHRlbnRbMV1bMF0pIC0gdHJhbnNsYXRlRXh0ZW50WzFdWzBdLFxuICAgICAgZHkwID0gdHJhbnNmb3JtLmludmVydFkoZXh0ZW50WzBdWzFdKSAtIHRyYW5zbGF0ZUV4dGVudFswXVsxXSxcbiAgICAgIGR5MSA9IHRyYW5zZm9ybS5pbnZlcnRZKGV4dGVudFsxXVsxXSkgLSB0cmFuc2xhdGVFeHRlbnRbMV1bMV07XG4gIHJldHVybiB0cmFuc2Zvcm0udHJhbnNsYXRlKFxuICAgIGR4MSA+IGR4MCA/IChkeDAgKyBkeDEpIC8gMiA6IE1hdGgubWluKDAsIGR4MCkgfHwgTWF0aC5tYXgoMCwgZHgxKSxcbiAgICBkeTEgPiBkeTAgPyAoZHkwICsgZHkxKSAvIDIgOiBNYXRoLm1pbigwLCBkeTApIHx8IE1hdGgubWF4KDAsIGR5MSlcbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyLFxuICAgICAgZXh0ZW50ID0gZGVmYXVsdEV4dGVudCxcbiAgICAgIGNvbnN0cmFpbiA9IGRlZmF1bHRDb25zdHJhaW4sXG4gICAgICB3aGVlbERlbHRhID0gZGVmYXVsdFdoZWVsRGVsdGEsXG4gICAgICB0b3VjaGFibGUgPSBkZWZhdWx0VG91Y2hhYmxlLFxuICAgICAgc2NhbGVFeHRlbnQgPSBbMCwgSW5maW5pdHldLFxuICAgICAgdHJhbnNsYXRlRXh0ZW50ID0gW1stSW5maW5pdHksIC1JbmZpbml0eV0sIFtJbmZpbml0eSwgSW5maW5pdHldXSxcbiAgICAgIGR1cmF0aW9uID0gMjUwLFxuICAgICAgaW50ZXJwb2xhdGUgPSBpbnRlcnBvbGF0ZVpvb20sXG4gICAgICBsaXN0ZW5lcnMgPSBkaXNwYXRjaChcInN0YXJ0XCIsIFwiem9vbVwiLCBcImVuZFwiKSxcbiAgICAgIHRvdWNoc3RhcnRpbmcsXG4gICAgICB0b3VjaGZpcnN0LFxuICAgICAgdG91Y2hlbmRpbmcsXG4gICAgICB0b3VjaERlbGF5ID0gNTAwLFxuICAgICAgd2hlZWxEZWxheSA9IDE1MCxcbiAgICAgIGNsaWNrRGlzdGFuY2UyID0gMCxcbiAgICAgIHRhcERpc3RhbmNlID0gMTA7XG5cbiAgZnVuY3Rpb24gem9vbShzZWxlY3Rpb24pIHtcbiAgICBzZWxlY3Rpb25cbiAgICAgICAgLnByb3BlcnR5KFwiX196b29tXCIsIGRlZmF1bHRUcmFuc2Zvcm0pXG4gICAgICAgIC5vbihcIndoZWVsLnpvb21cIiwgd2hlZWxlZCwge3Bhc3NpdmU6IGZhbHNlfSlcbiAgICAgICAgLm9uKFwibW91c2Vkb3duLnpvb21cIiwgbW91c2Vkb3duZWQpXG4gICAgICAgIC5vbihcImRibGNsaWNrLnpvb21cIiwgZGJsY2xpY2tlZClcbiAgICAgIC5maWx0ZXIodG91Y2hhYmxlKVxuICAgICAgICAub24oXCJ0b3VjaHN0YXJ0Lnpvb21cIiwgdG91Y2hzdGFydGVkKVxuICAgICAgICAub24oXCJ0b3VjaG1vdmUuem9vbVwiLCB0b3VjaG1vdmVkKVxuICAgICAgICAub24oXCJ0b3VjaGVuZC56b29tIHRvdWNoY2FuY2VsLnpvb21cIiwgdG91Y2hlbmRlZClcbiAgICAgICAgLnN0eWxlKFwiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yXCIsIFwicmdiYSgwLDAsMCwwKVwiKTtcbiAgfVxuXG4gIHpvb20udHJhbnNmb3JtID0gZnVuY3Rpb24oY29sbGVjdGlvbiwgdHJhbnNmb3JtLCBwb2ludCwgZXZlbnQpIHtcbiAgICB2YXIgc2VsZWN0aW9uID0gY29sbGVjdGlvbi5zZWxlY3Rpb24gPyBjb2xsZWN0aW9uLnNlbGVjdGlvbigpIDogY29sbGVjdGlvbjtcbiAgICBzZWxlY3Rpb24ucHJvcGVydHkoXCJfX3pvb21cIiwgZGVmYXVsdFRyYW5zZm9ybSk7XG4gICAgaWYgKGNvbGxlY3Rpb24gIT09IHNlbGVjdGlvbikge1xuICAgICAgc2NoZWR1bGUoY29sbGVjdGlvbiwgdHJhbnNmb3JtLCBwb2ludCwgZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxlY3Rpb24uaW50ZXJydXB0KCkuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgICAgLmV2ZW50KGV2ZW50KVxuICAgICAgICAgIC5zdGFydCgpXG4gICAgICAgICAgLnpvb20obnVsbCwgdHlwZW9mIHRyYW5zZm9ybSA9PT0gXCJmdW5jdGlvblwiID8gdHJhbnNmb3JtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB0cmFuc2Zvcm0pXG4gICAgICAgICAgLmVuZCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHpvb20uc2NhbGVCeSA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgaywgcCwgZXZlbnQpIHtcbiAgICB6b29tLnNjYWxlVG8oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBrMCA9IHRoaXMuX196b29tLmssXG4gICAgICAgICAgazEgPSB0eXBlb2YgayA9PT0gXCJmdW5jdGlvblwiID8gay5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogaztcbiAgICAgIHJldHVybiBrMCAqIGsxO1xuICAgIH0sIHAsIGV2ZW50KTtcbiAgfTtcblxuICB6b29tLnNjYWxlVG8gPSBmdW5jdGlvbihzZWxlY3Rpb24sIGssIHAsIGV2ZW50KSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlID0gZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgICAgdDAgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgICBwMCA9IHAgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHAgPT09IFwiZnVuY3Rpb25cIiA/IHAuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHAsXG4gICAgICAgICAgcDEgPSB0MC5pbnZlcnQocDApLFxuICAgICAgICAgIGsxID0gdHlwZW9mIGsgPT09IFwiZnVuY3Rpb25cIiA/IGsuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGs7XG4gICAgICByZXR1cm4gY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0MCwgazEpLCBwMCwgcDEpLCBlLCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgIH0sIHAsIGV2ZW50KTtcbiAgfTtcblxuICB6b29tLnRyYW5zbGF0ZUJ5ID0gZnVuY3Rpb24oc2VsZWN0aW9uLCB4LCB5LCBldmVudCkge1xuICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gY29uc3RyYWluKHRoaXMuX196b29tLnRyYW5zbGF0ZShcbiAgICAgICAgdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHguYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHgsXG4gICAgICAgIHR5cGVvZiB5ID09PSBcImZ1bmN0aW9uXCIgPyB5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB5XG4gICAgICApLCBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICB9LCBudWxsLCBldmVudCk7XG4gIH07XG5cbiAgem9vbS50cmFuc2xhdGVUbyA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgeCwgeSwgcCwgZXZlbnQpIHtcbiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGUgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgICB0ID0gdGhpcy5fX3pvb20sXG4gICAgICAgICAgcDAgPSBwID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwID09PSBcImZ1bmN0aW9uXCIgPyBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBwO1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbihpZGVudGl0eS50cmFuc2xhdGUocDBbMF0sIHAwWzFdKS5zY2FsZSh0LmspLnRyYW5zbGF0ZShcbiAgICAgICAgdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IC14LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiAteCxcbiAgICAgICAgdHlwZW9mIHkgPT09IFwiZnVuY3Rpb25cIiA/IC15LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiAteVxuICAgICAgKSwgZSwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICB9LCBwLCBldmVudCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gc2NhbGUodHJhbnNmb3JtLCBrKSB7XG4gICAgayA9IE1hdGgubWF4KHNjYWxlRXh0ZW50WzBdLCBNYXRoLm1pbihzY2FsZUV4dGVudFsxXSwgaykpO1xuICAgIHJldHVybiBrID09PSB0cmFuc2Zvcm0uayA/IHRyYW5zZm9ybSA6IG5ldyBUcmFuc2Zvcm0oaywgdHJhbnNmb3JtLngsIHRyYW5zZm9ybS55KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zbGF0ZSh0cmFuc2Zvcm0sIHAwLCBwMSkge1xuICAgIHZhciB4ID0gcDBbMF0gLSBwMVswXSAqIHRyYW5zZm9ybS5rLCB5ID0gcDBbMV0gLSBwMVsxXSAqIHRyYW5zZm9ybS5rO1xuICAgIHJldHVybiB4ID09PSB0cmFuc2Zvcm0ueCAmJiB5ID09PSB0cmFuc2Zvcm0ueSA/IHRyYW5zZm9ybSA6IG5ldyBUcmFuc2Zvcm0odHJhbnNmb3JtLmssIHgsIHkpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2VudHJvaWQoZXh0ZW50KSB7XG4gICAgcmV0dXJuIFsoK2V4dGVudFswXVswXSArICtleHRlbnRbMV1bMF0pIC8gMiwgKCtleHRlbnRbMF1bMV0gKyArZXh0ZW50WzFdWzFdKSAvIDJdO1xuICB9XG5cbiAgZnVuY3Rpb24gc2NoZWR1bGUodHJhbnNpdGlvbiwgdHJhbnNmb3JtLCBwb2ludCwgZXZlbnQpIHtcbiAgICB0cmFuc2l0aW9uXG4gICAgICAgIC5vbihcInN0YXJ0Lnpvb21cIiwgZnVuY3Rpb24oKSB7IGdlc3R1cmUodGhpcywgYXJndW1lbnRzKS5ldmVudChldmVudCkuc3RhcnQoKTsgfSlcbiAgICAgICAgLm9uKFwiaW50ZXJydXB0Lnpvb20gZW5kLnpvb21cIiwgZnVuY3Rpb24oKSB7IGdlc3R1cmUodGhpcywgYXJndW1lbnRzKS5ldmVudChldmVudCkuZW5kKCk7IH0pXG4gICAgICAgIC50d2VlbihcInpvb21cIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgICAgICBnID0gZ2VzdHVyZSh0aGF0LCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgICAgICAgIGUgPSBleHRlbnQuYXBwbHkodGhhdCwgYXJncyksXG4gICAgICAgICAgICAgIHAgPSBwb2ludCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0eXBlb2YgcG9pbnQgPT09IFwiZnVuY3Rpb25cIiA/IHBvaW50LmFwcGx5KHRoYXQsIGFyZ3MpIDogcG9pbnQsXG4gICAgICAgICAgICAgIHcgPSBNYXRoLm1heChlWzFdWzBdIC0gZVswXVswXSwgZVsxXVsxXSAtIGVbMF1bMV0pLFxuICAgICAgICAgICAgICBhID0gdGhhdC5fX3pvb20sXG4gICAgICAgICAgICAgIGIgPSB0eXBlb2YgdHJhbnNmb3JtID09PSBcImZ1bmN0aW9uXCIgPyB0cmFuc2Zvcm0uYXBwbHkodGhhdCwgYXJncykgOiB0cmFuc2Zvcm0sXG4gICAgICAgICAgICAgIGkgPSBpbnRlcnBvbGF0ZShhLmludmVydChwKS5jb25jYXQodyAvIGEuayksIGIuaW52ZXJ0KHApLmNvbmNhdCh3IC8gYi5rKSk7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGlmICh0ID09PSAxKSB0ID0gYjsgLy8gQXZvaWQgcm91bmRpbmcgZXJyb3Igb24gZW5kLlxuICAgICAgICAgICAgZWxzZSB7IHZhciBsID0gaSh0KSwgayA9IHcgLyBsWzJdOyB0ID0gbmV3IFRyYW5zZm9ybShrLCBwWzBdIC0gbFswXSAqIGssIHBbMV0gLSBsWzFdICogayk7IH1cbiAgICAgICAgICAgIGcuem9vbShudWxsLCB0KTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlc3R1cmUodGhhdCwgYXJncywgY2xlYW4pIHtcbiAgICByZXR1cm4gKCFjbGVhbiAmJiB0aGF0Ll9fem9vbWluZykgfHwgbmV3IEdlc3R1cmUodGhhdCwgYXJncyk7XG4gIH1cblxuICBmdW5jdGlvbiBHZXN0dXJlKHRoYXQsIGFyZ3MpIHtcbiAgICB0aGlzLnRoYXQgPSB0aGF0O1xuICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgdGhpcy5hY3RpdmUgPSAwO1xuICAgIHRoaXMuc291cmNlRXZlbnQgPSBudWxsO1xuICAgIHRoaXMuZXh0ZW50ID0gZXh0ZW50LmFwcGx5KHRoYXQsIGFyZ3MpO1xuICAgIHRoaXMudGFwcyA9IDA7XG4gIH1cblxuICBHZXN0dXJlLnByb3RvdHlwZSA9IHtcbiAgICBldmVudDogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudCkgdGhpcy5zb3VyY2VFdmVudCA9IGV2ZW50O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBzdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoKyt0aGlzLmFjdGl2ZSA9PT0gMSkge1xuICAgICAgICB0aGlzLnRoYXQuX196b29taW5nID0gdGhpcztcbiAgICAgICAgdGhpcy5lbWl0KFwic3RhcnRcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIHpvb206IGZ1bmN0aW9uKGtleSwgdHJhbnNmb3JtKSB7XG4gICAgICBpZiAodGhpcy5tb3VzZSAmJiBrZXkgIT09IFwibW91c2VcIikgdGhpcy5tb3VzZVsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy5tb3VzZVswXSk7XG4gICAgICBpZiAodGhpcy50b3VjaDAgJiYga2V5ICE9PSBcInRvdWNoXCIpIHRoaXMudG91Y2gwWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLnRvdWNoMFswXSk7XG4gICAgICBpZiAodGhpcy50b3VjaDEgJiYga2V5ICE9PSBcInRvdWNoXCIpIHRoaXMudG91Y2gxWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLnRvdWNoMVswXSk7XG4gICAgICB0aGlzLnRoYXQuX196b29tID0gdHJhbnNmb3JtO1xuICAgICAgdGhpcy5lbWl0KFwiem9vbVwiKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgZW5kOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICgtLXRoaXMuYWN0aXZlID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnRoYXQuX196b29taW5nO1xuICAgICAgICB0aGlzLmVtaXQoXCJlbmRcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGVtaXQ6IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgIHZhciBkID0gc2VsZWN0KHRoaXMudGhhdCkuZGF0dW0oKTtcbiAgICAgIGxpc3RlbmVycy5jYWxsKFxuICAgICAgICB0eXBlLFxuICAgICAgICB0aGlzLnRoYXQsXG4gICAgICAgIG5ldyBab29tRXZlbnQodHlwZSwge1xuICAgICAgICAgIHNvdXJjZUV2ZW50OiB0aGlzLnNvdXJjZUV2ZW50LFxuICAgICAgICAgIHRhcmdldDogem9vbSxcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIHRyYW5zZm9ybTogdGhpcy50aGF0Ll9fem9vbSxcbiAgICAgICAgICBkaXNwYXRjaDogbGlzdGVuZXJzXG4gICAgICAgIH0pLFxuICAgICAgICBkXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiB3aGVlbGVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgIHQgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgayA9IE1hdGgubWF4KHNjYWxlRXh0ZW50WzBdLCBNYXRoLm1pbihzY2FsZUV4dGVudFsxXSwgdC5rICogTWF0aC5wb3coMiwgd2hlZWxEZWx0YS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSkpLFxuICAgICAgICBwID0gcG9pbnRlcihldmVudCk7XG5cbiAgICAvLyBJZiB0aGUgbW91c2UgaXMgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgYmVmb3JlLCByZXVzZSBpdC5cbiAgICAvLyBJZiB0aGVyZSB3ZXJlIHJlY2VudCB3aGVlbCBldmVudHMsIHJlc2V0IHRoZSB3aGVlbCBpZGxlIHRpbWVvdXQuXG4gICAgaWYgKGcud2hlZWwpIHtcbiAgICAgIGlmIChnLm1vdXNlWzBdWzBdICE9PSBwWzBdIHx8IGcubW91c2VbMF1bMV0gIT09IHBbMV0pIHtcbiAgICAgICAgZy5tb3VzZVsxXSA9IHQuaW52ZXJ0KGcubW91c2VbMF0gPSBwKTtcbiAgICAgIH1cbiAgICAgIGNsZWFyVGltZW91dChnLndoZWVsKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGlzIHdoZWVsIGV2ZW50IHdvbuKAmXQgdHJpZ2dlciBhIHRyYW5zZm9ybSBjaGFuZ2UsIGlnbm9yZSBpdC5cbiAgICBlbHNlIGlmICh0LmsgPT09IGspIHJldHVybjtcblxuICAgIC8vIE90aGVyd2lzZSwgY2FwdHVyZSB0aGUgbW91c2UgcG9pbnQgYW5kIGxvY2F0aW9uIGF0IHRoZSBzdGFydC5cbiAgICBlbHNlIHtcbiAgICAgIGcubW91c2UgPSBbcCwgdC5pbnZlcnQocCldO1xuICAgICAgaW50ZXJydXB0KHRoaXMpO1xuICAgICAgZy5zdGFydCgpO1xuICAgIH1cblxuICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIGcud2hlZWwgPSBzZXRUaW1lb3V0KHdoZWVsaWRsZWQsIHdoZWVsRGVsYXkpO1xuICAgIGcuem9vbShcIm1vdXNlXCIsIGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodCwgayksIGcubW91c2VbMF0sIGcubW91c2VbMV0pLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7XG5cbiAgICBmdW5jdGlvbiB3aGVlbGlkbGVkKCkge1xuICAgICAgZy53aGVlbCA9IG51bGw7XG4gICAgICBnLmVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdXNlZG93bmVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKHRvdWNoZW5kaW5nIHx8ICFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciBjdXJyZW50VGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCxcbiAgICAgICAgZyA9IGdlc3R1cmUodGhpcywgYXJncywgdHJ1ZSkuZXZlbnQoZXZlbnQpLFxuICAgICAgICB2ID0gc2VsZWN0KGV2ZW50LnZpZXcpLm9uKFwibW91c2Vtb3ZlLnpvb21cIiwgbW91c2Vtb3ZlZCwgdHJ1ZSkub24oXCJtb3VzZXVwLnpvb21cIiwgbW91c2V1cHBlZCwgdHJ1ZSksXG4gICAgICAgIHAgPSBwb2ludGVyKGV2ZW50LCBjdXJyZW50VGFyZ2V0KSxcbiAgICAgICAgeDAgPSBldmVudC5jbGllbnRYLFxuICAgICAgICB5MCA9IGV2ZW50LmNsaWVudFk7XG5cbiAgICBkcmFnRGlzYWJsZShldmVudC52aWV3KTtcbiAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICBnLm1vdXNlID0gW3AsIHRoaXMuX196b29tLmludmVydChwKV07XG4gICAgaW50ZXJydXB0KHRoaXMpO1xuICAgIGcuc3RhcnQoKTtcblxuICAgIGZ1bmN0aW9uIG1vdXNlbW92ZWQoZXZlbnQpIHtcbiAgICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgICAgaWYgKCFnLm1vdmVkKSB7XG4gICAgICAgIHZhciBkeCA9IGV2ZW50LmNsaWVudFggLSB4MCwgZHkgPSBldmVudC5jbGllbnRZIC0geTA7XG4gICAgICAgIGcubW92ZWQgPSBkeCAqIGR4ICsgZHkgKiBkeSA+IGNsaWNrRGlzdGFuY2UyO1xuICAgICAgfVxuICAgICAgZy5ldmVudChldmVudClcbiAgICAgICAuem9vbShcIm1vdXNlXCIsIGNvbnN0cmFpbih0cmFuc2xhdGUoZy50aGF0Ll9fem9vbSwgZy5tb3VzZVswXSA9IHBvaW50ZXIoZXZlbnQsIGN1cnJlbnRUYXJnZXQpLCBnLm1vdXNlWzFdKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vdXNldXBwZWQoZXZlbnQpIHtcbiAgICAgIHYub24oXCJtb3VzZW1vdmUuem9vbSBtb3VzZXVwLnpvb21cIiwgbnVsbCk7XG4gICAgICBkcmFnRW5hYmxlKGV2ZW50LnZpZXcsIGcubW92ZWQpO1xuICAgICAgbm9ldmVudChldmVudCk7XG4gICAgICBnLmV2ZW50KGV2ZW50KS5lbmQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkYmxjbGlja2VkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciB0MCA9IHRoaXMuX196b29tLFxuICAgICAgICBwMCA9IHBvaW50ZXIoZXZlbnQuY2hhbmdlZFRvdWNoZXMgPyBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSA6IGV2ZW50LCB0aGlzKSxcbiAgICAgICAgcDEgPSB0MC5pbnZlcnQocDApLFxuICAgICAgICBrMSA9IHQwLmsgKiAoZXZlbnQuc2hpZnRLZXkgPyAwLjUgOiAyKSxcbiAgICAgICAgdDEgPSBjb25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQwLCBrMSksIHAwLCBwMSksIGV4dGVudC5hcHBseSh0aGlzLCBhcmdzKSwgdHJhbnNsYXRlRXh0ZW50KTtcblxuICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIGlmIChkdXJhdGlvbiA+IDApIHNlbGVjdCh0aGlzKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oZHVyYXRpb24pLmNhbGwoc2NoZWR1bGUsIHQxLCBwMCwgZXZlbnQpO1xuICAgIGVsc2Ugc2VsZWN0KHRoaXMpLmNhbGwoem9vbS50cmFuc2Zvcm0sIHQxLCBwMCwgZXZlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hzdGFydGVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciB0b3VjaGVzID0gZXZlbnQudG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLFxuICAgICAgICBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzLCBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPT09IG4pLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgc3RhcnRlZCwgaSwgdCwgcDtcblxuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIHQgPSB0b3VjaGVzW2ldLCBwID0gcG9pbnRlcih0LCB0aGlzKTtcbiAgICAgIHAgPSBbcCwgdGhpcy5fX3pvb20uaW52ZXJ0KHApLCB0LmlkZW50aWZpZXJdO1xuICAgICAgaWYgKCFnLnRvdWNoMCkgZy50b3VjaDAgPSBwLCBzdGFydGVkID0gdHJ1ZSwgZy50YXBzID0gMSArICEhdG91Y2hzdGFydGluZztcbiAgICAgIGVsc2UgaWYgKCFnLnRvdWNoMSAmJiBnLnRvdWNoMFsyXSAhPT0gcFsyXSkgZy50b3VjaDEgPSBwLCBnLnRhcHMgPSAwO1xuICAgIH1cblxuICAgIGlmICh0b3VjaHN0YXJ0aW5nKSB0b3VjaHN0YXJ0aW5nID0gY2xlYXJUaW1lb3V0KHRvdWNoc3RhcnRpbmcpO1xuXG4gICAgaWYgKHN0YXJ0ZWQpIHtcbiAgICAgIGlmIChnLnRhcHMgPCAyKSB0b3VjaGZpcnN0ID0gcFswXSwgdG91Y2hzdGFydGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoc3RhcnRpbmcgPSBudWxsOyB9LCB0b3VjaERlbGF5KTtcbiAgICAgIGludGVycnVwdCh0aGlzKTtcbiAgICAgIGcuc3RhcnQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaG1vdmVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCF0aGlzLl9fem9vbWluZykgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCB0LCBwLCBsO1xuXG4gICAgbm9ldmVudChldmVudCk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV0sIHAgPSBwb2ludGVyKHQsIHRoaXMpO1xuICAgICAgaWYgKGcudG91Y2gwICYmIGcudG91Y2gwWzJdID09PSB0LmlkZW50aWZpZXIpIGcudG91Y2gwWzBdID0gcDtcbiAgICAgIGVsc2UgaWYgKGcudG91Y2gxICYmIGcudG91Y2gxWzJdID09PSB0LmlkZW50aWZpZXIpIGcudG91Y2gxWzBdID0gcDtcbiAgICB9XG4gICAgdCA9IGcudGhhdC5fX3pvb207XG4gICAgaWYgKGcudG91Y2gxKSB7XG4gICAgICB2YXIgcDAgPSBnLnRvdWNoMFswXSwgbDAgPSBnLnRvdWNoMFsxXSxcbiAgICAgICAgICBwMSA9IGcudG91Y2gxWzBdLCBsMSA9IGcudG91Y2gxWzFdLFxuICAgICAgICAgIGRwID0gKGRwID0gcDFbMF0gLSBwMFswXSkgKiBkcCArIChkcCA9IHAxWzFdIC0gcDBbMV0pICogZHAsXG4gICAgICAgICAgZGwgPSAoZGwgPSBsMVswXSAtIGwwWzBdKSAqIGRsICsgKGRsID0gbDFbMV0gLSBsMFsxXSkgKiBkbDtcbiAgICAgIHQgPSBzY2FsZSh0LCBNYXRoLnNxcnQoZHAgLyBkbCkpO1xuICAgICAgcCA9IFsocDBbMF0gKyBwMVswXSkgLyAyLCAocDBbMV0gKyBwMVsxXSkgLyAyXTtcbiAgICAgIGwgPSBbKGwwWzBdICsgbDFbMF0pIC8gMiwgKGwwWzFdICsgbDFbMV0pIC8gMl07XG4gICAgfVxuICAgIGVsc2UgaWYgKGcudG91Y2gwKSBwID0gZy50b3VjaDBbMF0sIGwgPSBnLnRvdWNoMFsxXTtcbiAgICBlbHNlIHJldHVybjtcblxuICAgIGcuem9vbShcInRvdWNoXCIsIGNvbnN0cmFpbih0cmFuc2xhdGUodCwgcCwgbCksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoZW5kZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuX196b29taW5nKSByZXR1cm47XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIHQ7XG5cbiAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICBpZiAodG91Y2hlbmRpbmcpIGNsZWFyVGltZW91dCh0b3VjaGVuZGluZyk7XG4gICAgdG91Y2hlbmRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaGVuZGluZyA9IG51bGw7IH0sIHRvdWNoRGVsYXkpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIHQgPSB0b3VjaGVzW2ldO1xuICAgICAgaWYgKGcudG91Y2gwICYmIGcudG91Y2gwWzJdID09PSB0LmlkZW50aWZpZXIpIGRlbGV0ZSBnLnRvdWNoMDtcbiAgICAgIGVsc2UgaWYgKGcudG91Y2gxICYmIGcudG91Y2gxWzJdID09PSB0LmlkZW50aWZpZXIpIGRlbGV0ZSBnLnRvdWNoMTtcbiAgICB9XG4gICAgaWYgKGcudG91Y2gxICYmICFnLnRvdWNoMCkgZy50b3VjaDAgPSBnLnRvdWNoMSwgZGVsZXRlIGcudG91Y2gxO1xuICAgIGlmIChnLnRvdWNoMCkgZy50b3VjaDBbMV0gPSB0aGlzLl9fem9vbS5pbnZlcnQoZy50b3VjaDBbMF0pO1xuICAgIGVsc2Uge1xuICAgICAgZy5lbmQoKTtcbiAgICAgIC8vIElmIHRoaXMgd2FzIGEgZGJsdGFwLCByZXJvdXRlIHRvIHRoZSAob3B0aW9uYWwpIGRibGNsaWNrLnpvb20gaGFuZGxlci5cbiAgICAgIGlmIChnLnRhcHMgPT09IDIpIHtcbiAgICAgICAgdCA9IHBvaW50ZXIodCwgdGhpcyk7XG4gICAgICAgIGlmIChNYXRoLmh5cG90KHRvdWNoZmlyc3RbMF0gLSB0WzBdLCB0b3VjaGZpcnN0WzFdIC0gdFsxXSkgPCB0YXBEaXN0YW5jZSkge1xuICAgICAgICAgIHZhciBwID0gc2VsZWN0KHRoaXMpLm9uKFwiZGJsY2xpY2suem9vbVwiKTtcbiAgICAgICAgICBpZiAocCkgcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgem9vbS53aGVlbERlbHRhID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHdoZWVsRGVsdGEgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgem9vbSkgOiB3aGVlbERlbHRhO1xuICB9O1xuXG4gIHpvb20uZmlsdGVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZpbHRlciA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgem9vbSkgOiBmaWx0ZXI7XG4gIH07XG5cbiAgem9vbS50b3VjaGFibGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodG91Y2hhYmxlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCB6b29tKSA6IHRvdWNoYWJsZTtcbiAgfTtcblxuICB6b29tLmV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChleHRlbnQgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KFtbK19bMF1bMF0sICtfWzBdWzFdXSwgWytfWzFdWzBdLCArX1sxXVsxXV1dKSwgem9vbSkgOiBleHRlbnQ7XG4gIH07XG5cbiAgem9vbS5zY2FsZUV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZUV4dGVudFswXSA9ICtfWzBdLCBzY2FsZUV4dGVudFsxXSA9ICtfWzFdLCB6b29tKSA6IFtzY2FsZUV4dGVudFswXSwgc2NhbGVFeHRlbnRbMV1dO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRyYW5zbGF0ZUV4dGVudFswXVswXSA9ICtfWzBdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMF0gPSArX1sxXVswXSwgdHJhbnNsYXRlRXh0ZW50WzBdWzFdID0gK19bMF1bMV0sIHRyYW5zbGF0ZUV4dGVudFsxXVsxXSA9ICtfWzFdWzFdLCB6b29tKSA6IFtbdHJhbnNsYXRlRXh0ZW50WzBdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMF1bMV1dLCBbdHJhbnNsYXRlRXh0ZW50WzFdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMV1dXTtcbiAgfTtcblxuICB6b29tLmNvbnN0cmFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb25zdHJhaW4gPSBfLCB6b29tKSA6IGNvbnN0cmFpbjtcbiAgfTtcblxuICB6b29tLmR1cmF0aW9uID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGR1cmF0aW9uID0gK18sIHpvb20pIDogZHVyYXRpb247XG4gIH07XG5cbiAgem9vbS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0ZSA9IF8sIHpvb20pIDogaW50ZXJwb2xhdGU7XG4gIH07XG5cbiAgem9vbS5vbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZSA9IGxpc3RlbmVycy5vbi5hcHBseShsaXN0ZW5lcnMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHZhbHVlID09PSBsaXN0ZW5lcnMgPyB6b29tIDogdmFsdWU7XG4gIH07XG5cbiAgem9vbS5jbGlja0Rpc3RhbmNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNsaWNrRGlzdGFuY2UyID0gKF8gPSArXykgKiBfLCB6b29tKSA6IE1hdGguc3FydChjbGlja0Rpc3RhbmNlMik7XG4gIH07XG5cbiAgem9vbS50YXBEaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0YXBEaXN0YW5jZSA9ICtfLCB6b29tKSA6IHRhcERpc3RhbmNlO1xuICB9O1xuXG4gIHJldHVybiB6b29tO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGFjY2Vzc29yKHgsIGZhbGxiYWNrKSB7XG4gIHJldHVybiB4ID09IG51bGwgPyBmYWxsYmFja1xuICAgIDogdHlwZW9mIHggPT09ICdmdW5jdGlvbicgPyB4XG4gICAgOiBkID0+IGRbeF07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYmluMWQoZGF0YSwgeCwgd2VpZ2h0LCBsbywgaGksIG4pIHtcbiAgY29uc3QgZ3JpZCA9IG5ldyBGbG9hdDY0QXJyYXkobik7XG4gIGNvbnN0IGRlbHRhID0gKG4gLSAxKSAvIChoaSAtIGxvKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBkID0gZGF0YVtpXTtcbiAgICBjb25zdCB4aSA9IHgoZCwgaSwgZGF0YSk7XG4gICAgY29uc3Qgd2kgPSB3ZWlnaHQoZCwgaSwgZGF0YSk7XG5cbiAgICAvLyBza2lwIE5hTiBhbmQgSW5maW5pdGUgdmFsdWVzXG4gICAgaWYgKCEoTnVtYmVyLmlzRmluaXRlKHhpKSAmJiBOdW1iZXIuaXNGaW5pdGUod2kpKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcCA9ICh4aSAtIGxvKSAqIGRlbHRhO1xuICAgIGNvbnN0IHUgPSBNYXRoLmZsb29yKHApO1xuICAgIGNvbnN0IHYgPSB1ICsgMTtcblxuICAgIGlmICgwIDw9IHUgJiYgdiA8IG4pIHtcbiAgICAgIGdyaWRbdV0gKz0gKHYgLSBwKSAqIHdpO1xuICAgICAgZ3JpZFt2XSArPSAocCAtIHUpICogd2k7XG4gICAgfSBlbHNlIGlmICh1ID09PSAtMSkge1xuICAgICAgZ3JpZFt2XSArPSAocCAtIHUpICogd2k7XG4gICAgfSBlbHNlIGlmICh2ID09PSBuKSB7XG4gICAgICBncmlkW3VdICs9ICh2IC0gcCkgKiB3aTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZ3JpZDtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBiaW4yZChkYXRhLCB4LCB5LCB3LCB4MCwgeDEsIHhuLCB5MCwgeTEsIHluKSB7XG4gIGNvbnN0IGdyaWQgPSBuZXcgRmxvYXQ2NEFycmF5KHhuICogeW4pO1xuICBjb25zdCB4ZGVsdGEgPSAoeG4gLSAxKSAvICh4MSAtIHgwKTtcbiAgY29uc3QgeWRlbHRhID0gKHluIC0gMSkgLyAoeTEgLSB5MCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgZCA9IGRhdGFbaV07XG4gICAgY29uc3QgeGkgPSB4KGQsIGksIGRhdGEpO1xuICAgIGNvbnN0IHlpID0geShkLCBpLCBkYXRhKTtcbiAgICBjb25zdCB3aSA9IHcoZCwgaSwgZGF0YSk7XG5cbiAgICAvLyBza2lwIE5hTiBhbmQgSW5maW5pdGUgdmFsdWVzXG4gICAgaWYgKCEoTnVtYmVyLmlzRmluaXRlKHhpKSAmJiBOdW1iZXIuaXNGaW5pdGUoeWkpICYmIE51bWJlci5pc0Zpbml0ZSh3aSkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCB4cCA9ICh4aSAtIHgwKSAqIHhkZWx0YTtcbiAgICBjb25zdCB4dSA9IE1hdGguZmxvb3IoeHApO1xuICAgIGNvbnN0IHh2ID0geHUgKyAxO1xuICAgIGNvbnN0IHlwID0gKHlpIC0geTApICogeWRlbHRhO1xuICAgIGNvbnN0IHl1ID0gTWF0aC5mbG9vcih5cCk7XG4gICAgY29uc3QgeXYgPSB5dSArIDE7XG5cbiAgICBpZiAoMCA8PSB4dSAmJiB4diA8IHhuKSB7XG4gICAgICBpZiAoMCA8PSB5dSAmJiB5diA8IHluKSB7XG4gICAgICAgIGdyaWRbeHUgKyB5dSAqIHhuXSArPSAoeHYgLSB4cCkgKiAoeXYgLSB5cCkgKiB3aTtcbiAgICAgICAgZ3JpZFt4dSArIHl2ICogeG5dICs9ICh4diAtIHhwKSAqICh5cCAtIHl1KSAqIHdpO1xuICAgICAgICBncmlkW3h2ICsgeXUgKiB4bl0gKz0gKHhwIC0geHUpICogKHl2IC0geXApICogd2k7XG4gICAgICAgIGdyaWRbeHYgKyB5diAqIHhuXSArPSAoeHAgLSB4dSkgKiAoeXAgLSB5dSkgKiB3aTtcbiAgICAgIH0gZWxzZSBpZiAoeXUgPT09IC0xKSB7XG4gICAgICAgIGdyaWRbeHUgKyB5diAqIHhuXSArPSAoeHYgLSB4cCkgKiAoeXAgLSB5dSkgKiB3aTtcbiAgICAgICAgZ3JpZFt4diArIHl2ICogeG5dICs9ICh4cCAtIHh1KSAqICh5cCAtIHl1KSAqIHdpO1xuICAgICAgfSBlbHNlIGlmICh5diA9PT0geW4pIHtcbiAgICAgICAgZ3JpZFt4diArIHl1ICogeG5dICs9ICh4cCAtIHh1KSAqICh5diAtIHlwKSAqIHdpO1xuICAgICAgICBncmlkW3h1ICsgeXUgKiB4bl0gKz0gKHh2IC0geHApICogKHl2IC0geXApICogd2k7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh4dSA9PT0gLTEpIHtcbiAgICAgIGlmICgwIDw9IHl1ICYmIHl2IDwgeW4pIHtcbiAgICAgICAgZ3JpZFt4diArIHl1ICogeG5dICs9ICh4cCAtIHh1KSAqICh5diAtIHlwKSAqIHdpO1xuICAgICAgICBncmlkW3h2ICsgeXYgKiB4bl0gKz0gKHhwIC0geHUpICogKHlwIC0geXUpICogd2k7XG4gICAgICB9IGVsc2UgaWYgKHl1ID09PSAtMSkge1xuICAgICAgICBncmlkW3h2ICsgeXYgKiB4bl0gKz0gKHhwIC0geHUpICogKHlwIC0geXUpICogd2k7XG4gICAgICB9IGVsc2UgaWYgKHl2ID09PSB5bikge1xuICAgICAgICBncmlkW3h2ICsgeXUgKiB4bl0gKz0gKHhwIC0geHUpICogKHl2IC0geXApICogd2k7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh4diA9PT0geG4pIHtcbiAgICAgIGlmICgwIDw9IHl1ICYmIHl2IDwgeW4pIHtcbiAgICAgICAgZ3JpZFt4dSArIHl1ICogeG5dICs9ICh4diAtIHhwKSAqICh5diAtIHlwKSAqIHdpO1xuICAgICAgICBncmlkW3h1ICsgeXYgKiB4bl0gKz0gKHh2IC0geHApICogKHlwIC0geXUpICogd2k7XG4gICAgICB9IGVsc2UgaWYgKHl1ID09PSAtMSkge1xuICAgICAgICBncmlkW3h1ICsgeXYgKiB4bl0gKz0gKHh2IC0geHApICogKHlwIC0geXUpICogd2k7XG4gICAgICB9IGVsc2UgaWYgKHl2ID09PSB5bikge1xuICAgICAgICBncmlkW3h1ICsgeXUgKiB4bl0gKz0gKHh2IC0geHApICogKHl2IC0geXApICogd2k7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdyaWQ7XG59XG4iLCJpbXBvcnQgeyBhY2Nlc3NvciB9IGZyb20gJy4vYWNjZXNzb3IuanMnO1xuaW1wb3J0IHsgYmluMWQgfSBmcm9tICcuL2JpbjFkLmpzJztcbmltcG9ydCB7IGRlcmljaGVDb25maWcsIGRlcmljaGVDb252MWQgfSBmcm9tICcuL2RlcmljaGUuanMnO1xuaW1wb3J0IHsgZXh0ZW50IGFzIGRlbnNpdHlFeHRlbnQgfSBmcm9tICcuL2V4dGVudC5qcyc7XG5pbXBvcnQgeyBucmQgfSBmcm9tICcuL25yZC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZW5zaXR5MWQoZGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHsgYWRqdXN0ID0gMSwgcGFkID0gMywgYmlucyA9IDUxMiB9ID0gb3B0aW9ucztcbiAgY29uc3QgeCA9IGFjY2Vzc29yKG9wdGlvbnMueCwgeCA9PiB4KTtcbiAgY29uc3QgdyA9IGFjY2Vzc29yKG9wdGlvbnMud2VpZ2h0LCAoKSA9PiAxIC8gZGF0YS5sZW5ndGgpO1xuXG4gIGxldCBiYW5kd2lkdGggPSBvcHRpb25zLmJhbmR3aWR0aCA/PyBhZGp1c3QgKiBucmQoZGF0YSwgeCk7XG5cbiAgY29uc3QgW2xvLCBoaV0gPSBvcHRpb25zLmV4dGVudCA/PyBkZW5zaXR5RXh0ZW50KGRhdGEsIHgsIHBhZCAqIGJhbmR3aWR0aCk7XG4gIGNvbnN0IGdyaWQgPSBiaW4xZChkYXRhLCB4LCB3LCBsbywgaGksIGJpbnMpO1xuICBjb25zdCBkZWx0YSA9IChoaSAtIGxvKSAvIChiaW5zIC0gMSk7XG4gIGNvbnN0IG5lZyA9IGdyaWQuc29tZSh2ID0+IHYgPCAwKTtcblxuICBsZXQgY29uZmlnID0gZGVyaWNoZUNvbmZpZyhiYW5kd2lkdGggLyBkZWx0YSwgbmVnKTtcbiAgbGV0IHJlc3VsdDtcblxuICBmdW5jdGlvbiogcG9pbnRzKHggPSAneCcsIHkgPSAneScpIHtcbiAgICBjb25zdCByZXN1bHQgPSBlc3RpbWF0b3IuZ3JpZCgpO1xuICAgIGNvbnN0IHNjYWxlID0gMSAvIGRlbHRhO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmluczsgKytpKSB7XG4gICAgICB5aWVsZCB7XG4gICAgICAgIFt4XTogbG8gKyBpICogZGVsdGEsXG4gICAgICAgIFt5XTogcmVzdWx0W2ldICogc2NhbGVcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXN0aW1hdG9yID0ge1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiBwb2ludHMsXG4gICAgcG9pbnRzLFxuICAgIGdyaWQ6ICgpID0+IHJlc3VsdCB8fCAocmVzdWx0ID0gZGVyaWNoZUNvbnYxZChjb25maWcsIGdyaWQsIGJpbnMpKSxcbiAgICBleHRlbnQ6ICgpID0+IFtsbywgaGldLFxuICAgIGJhbmR3aWR0aChfKSB7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICBpZiAoXyAhPT0gYmFuZHdpZHRoKSB7XG4gICAgICAgICAgYmFuZHdpZHRoID0gXztcbiAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgIGNvbmZpZyA9IGRlcmljaGVDb25maWcoYmFuZHdpZHRoIC8gZGVsdGEsIG5lZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVzdGltYXRvcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBiYW5kd2lkdGg7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBlc3RpbWF0b3I7XG59XG4iLCJpbXBvcnQgeyBhY2Nlc3NvciB9IGZyb20gJy4vYWNjZXNzb3IuanMnO1xuaW1wb3J0IHsgYmluMmQgfSBmcm9tICcuL2JpbjJkLmpzJztcbmltcG9ydCB7IGRlcmljaGVDb25maWcsIGRlcmljaGVDb252MmQgfSBmcm9tICcuL2RlcmljaGUuanMnO1xuaW1wb3J0IHsgZXh0ZW50IGFzIGRlbnNpdHlFeHRlbnQgfSBmcm9tICcuL2V4dGVudC5qcyc7XG5pbXBvcnQgeyBoZWF0bWFwIH0gZnJvbSAnLi9oZWF0bWFwLmpzJztcbmltcG9ydCB7IG5yZCB9IGZyb20gJy4vbnJkLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlbnNpdHkyZChkYXRhLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgeyBhZGp1c3QgPSAxLCBwYWQgPSAzLCBiaW5zID0gWzI1NiwgMjU2XSB9ID0gb3B0aW9ucztcbiAgY29uc3QgeCA9IGFjY2Vzc29yKG9wdGlvbnMueCwgZCA9PiBkWzBdKTtcbiAgY29uc3QgeSA9IGFjY2Vzc29yKG9wdGlvbnMueSwgZCA9PiBkWzFdKTtcbiAgY29uc3QgdyA9IGFjY2Vzc29yKG9wdGlvbnMud2VpZ2h0LCAoKSA9PiAxIC8gZGF0YS5sZW5ndGgpO1xuXG4gIGxldCBbXG4gICAgYndYID0gYWRqdXN0ICogbnJkKGRhdGEsIHgpLFxuICAgIGJ3WSA9IGFkanVzdCAqIG5yZChkYXRhLCB5KVxuICBdID0gbnVtYmVyMihvcHRpb25zLmJhbmR3aWR0aCk7XG5cbiAgY29uc3QgW1xuICAgIFt4MCwgeDFdID0gZGVuc2l0eUV4dGVudChkYXRhLCB4LCBwYWQgKiBid1gpLFxuICAgIFt5MCwgeTFdID0gZGVuc2l0eUV4dGVudChkYXRhLCB5LCBwYWQgKiBid1kpXG4gIF0gPSBudW1iZXIyXzIob3B0aW9ucy5leHRlbnQpO1xuXG4gIGNvbnN0IFtiaW5zWCwgYmluc1ldID0gbnVtYmVyMihiaW5zKTtcblxuICBjb25zdCBncmlkID0gYmluMmQoZGF0YSwgeCwgeSwgdywgeDAsIHgxLCBiaW5zWCwgeTAsIHkxLCBiaW5zWSk7XG4gIGNvbnN0IGRlbHRhWCA9ICh4MSAtIHgwKSAvIChiaW5zWCAtIDEpO1xuICBjb25zdCBkZWx0YVkgPSAoeTEgLSB5MCkgLyAoYmluc1kgLSAxKTtcbiAgY29uc3QgbmVnID0gZ3JpZC5zb21lKHYgPT4gdiA8IDApO1xuXG4gIGxldCBjb25maWdYID0gZGVyaWNoZUNvbmZpZyhid1ggLyBkZWx0YVgsIG5lZyk7XG4gIGxldCBjb25maWdZID0gZGVyaWNoZUNvbmZpZyhid1kgLyBkZWx0YVksIG5lZyk7XG4gIGxldCByZXN1bHQ7XG5cbiAgZnVuY3Rpb24qIHBvaW50cyh4ID0gJ3gnLCB5ID0gJ3knLCB6ID0gJ3onKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gZXN0aW1hdG9yLmdyaWQoKTtcbiAgICBjb25zdCBzY2FsZSA9IDEgLyAoZGVsdGFYICogZGVsdGFZKTtcbiAgICBmb3IgKGxldCBrID0gMCwgaiA9IDA7IGogPCBiaW5zWTsgKytqKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbnNYOyArK2ksICsraykge1xuICAgICAgICB5aWVsZCB7XG4gICAgICAgICAgW3hdOiB4MCArIGkgKiBkZWx0YVgsXG4gICAgICAgICAgW3ldOiB5MCArIGogKiBkZWx0YVksXG4gICAgICAgICAgW3pdOiByZXN1bHRba10gKiBzY2FsZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGVzdGltYXRvciA9IHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogcG9pbnRzLFxuICAgIHBvaW50cyxcbiAgICBncmlkOiAoKSA9PiByZXN1bHQgfHwgKHJlc3VsdCA9IGRlcmljaGVDb252MmQoY29uZmlnWCwgY29uZmlnWSwgZ3JpZCwgW2JpbnNYLCBiaW5zWV0pKSxcbiAgICBleHRlbnQ6ICgpID0+IFsgW3gwLCB4MV0sIFt5MCwgeTFdIF0sXG4gICAgaGVhdG1hcDogKHsgY29sb3IsIGNsYW1wLCBjYW52YXMsIG1heENvbG9ycyB9ID0ge30pID0+XG4gICAgICBoZWF0bWFwKGVzdGltYXRvci5ncmlkKCksIGJpbnNYLCBiaW5zWSwgY29sb3IsIGNsYW1wLCBjYW52YXMsIG1heENvbG9ycyksXG4gICAgYmFuZHdpZHRoKF8pIHtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IFtfMCwgXzFdID0gbnVtYmVyMihfKTtcbiAgICAgICAgaWYgKF8wICE9PSBid1gpIHtcbiAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgIGNvbmZpZ1ggPSBkZXJpY2hlQ29uZmlnKChid1ggPSBfMCkgLyBkZWx0YVgsIG5lZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF8xICE9PSBid1kpIHtcbiAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgIGNvbmZpZ1kgPSBkZXJpY2hlQ29uZmlnKChid1kgPSBfMSkgLyBkZWx0YVksIG5lZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVzdGltYXRvcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbYndYLCBid1ldO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gZXN0aW1hdG9yO1xufVxuXG5mdW5jdGlvbiBudW1iZXIyKF8pIHtcbiAgcmV0dXJuIF8gPT0gbnVsbCA/IFt1bmRlZmluZWQsIHVuZGVmaW5lZF1cbiAgICA6IHR5cGVvZiBfID09PSAnbnVtYmVyJyA/IFtfLCBfXVxuICAgIDogXztcbn1cblxuZnVuY3Rpb24gbnVtYmVyMl8yKF8pIHtcbiAgcmV0dXJuIF8gPT0gbnVsbCA/IFt1bmRlZmluZWQsIHVuZGVmaW5lZF1cbiAgICA6IHR5cGVvZiBfWzBdID09PSAnbnVtYmVyJyA/IFtfLCBfXVxuICAgIDogXztcbn1cbiIsIi8vIERlcmljaGUncyBhcHByb3hpbWF0aW9uIG9mIEdhdXNzaWFuIHNtb290aGluZ1xuLy8gQWRhcHRlZCBmcm9tIEdldHJldWVyJ3MgQyBpbXBsZW1lbnRhdGlvbiAoQlNEIGxpY2Vuc2UpXG4vLyBodHRwczovL3d3dy5pcG9sLmltL3B1Yi9hcnQvMjAxMy84Ny9nYXVzc2lhbl8yMDEzMTIxNS50Z3pcbi8vIGh0dHA6Ly9kZXYuaXBvbC5pbS9+Z2V0cmV1ZXIvY29kZS9kb2MvZ2F1c3NpYW5fMjAxMzEyMTVfZG9jL2dhdXNzaWFuX19jb252X19kZXJpY2hlXzhjLmh0bWxcblxuZXhwb3J0IGZ1bmN0aW9uIGRlcmljaGVDb25maWcoc2lnbWEsIG5lZ2F0aXZlID0gZmFsc2UpIHtcbiAgLy8gY29tcHV0ZSBjYXVzYWwgZmlsdGVyIGNvZWZmaWNpZW50c1xuICBjb25zdCBhID0gbmV3IEZsb2F0NjRBcnJheSg1KTtcbiAgY29uc3QgYmMgPSBuZXcgRmxvYXQ2NEFycmF5KDQpO1xuICBkZXJpY2hlQ2F1c2FsQ29lZmYoYSwgYmMsIHNpZ21hKTtcblxuICAvLyBudW1lcmF0b3IgY29lZmZpY2llbnRzIG9mIHRoZSBhbnRpY2F1c2FsIGZpbHRlclxuICBjb25zdCBiYSA9IEZsb2F0NjRBcnJheS5vZihcbiAgICAwLFxuICAgIGJjWzFdIC0gYVsxXSAqIGJjWzBdLFxuICAgIGJjWzJdIC0gYVsyXSAqIGJjWzBdLFxuICAgIGJjWzNdIC0gYVszXSAqIGJjWzBdLFxuICAgIC1hWzRdICogYmNbMF1cbiAgKTtcblxuICAvLyBpbXB1bHNlIHJlc3BvbnNlIHN1bXNcbiAgY29uc3QgYWNjdW1fZGVub20gPSAxLjAgKyBhWzFdICsgYVsyXSArIGFbM10gKyBhWzRdO1xuICBjb25zdCBzdW1fY2F1c2FsID0gKGJjWzBdICsgYmNbMV0gKyBiY1syXSArIGJjWzNdKSAvIGFjY3VtX2Rlbm9tO1xuICBjb25zdCBzdW1fYW50aWNhdXNhbCA9IChiYVsxXSArIGJhWzJdICsgYmFbM10gKyBiYVs0XSkgLyBhY2N1bV9kZW5vbTtcblxuICAvLyBjb2VmZmljaWVudHMgb2JqZWN0XG4gIHJldHVybiB7XG4gICAgc2lnbWEsXG4gICAgbmVnYXRpdmUsXG4gICAgYSxcbiAgICBiX2NhdXNhbDogYmMsXG4gICAgYl9hbnRpY2F1c2FsOiBiYSxcbiAgICBzdW1fY2F1c2FsLFxuICAgIHN1bV9hbnRpY2F1c2FsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlcmljaGVDYXVzYWxDb2VmZihhX291dCwgYl9vdXQsIHNpZ21hKSB7XG4gIGNvbnN0IEsgPSA0O1xuXG4gIGNvbnN0IGFscGhhID0gRmxvYXQ2NEFycmF5Lm9mKFxuICAgIDAuODQsIDEuODY3NSxcbiAgICAwLjg0LCAtMS44Njc1LFxuICAgIC0wLjM0MDE1LCAtMC4xMjk5LFxuICAgIC0wLjM0MDE1LCAwLjEyOTlcbiAgKTtcblxuICBjb25zdCB4MSA9IE1hdGguZXhwKC0xLjc4MyAvIHNpZ21hKTtcbiAgY29uc3QgeDIgPSBNYXRoLmV4cCgtMS43MjMgLyBzaWdtYSk7XG4gIGNvbnN0IHkxID0gMC42MzE4IC8gc2lnbWE7XG4gIGNvbnN0IHkyID0gMS45OTcgLyBzaWdtYTtcbiAgY29uc3QgYmV0YSA9IEZsb2F0NjRBcnJheS5vZihcbiAgICAteDEgKiBNYXRoLmNvcyggeTEpLCB4MSAqIE1hdGguc2luKCB5MSksXG4gICAgLXgxICogTWF0aC5jb3MoLXkxKSwgeDEgKiBNYXRoLnNpbigteTEpLFxuICAgIC14MiAqIE1hdGguY29zKCB5MiksIHgyICogTWF0aC5zaW4oIHkyKSxcbiAgICAteDIgKiBNYXRoLmNvcygteTIpLCB4MiAqIE1hdGguc2luKC15MilcbiAgKTtcblxuICBjb25zdCBkZW5vbSA9IHNpZ21hICogMi41MDY2MjgyNzQ2MzEwMDA3O1xuXG4gIC8vIGluaXRpYWxpemUgYi9hID0gYWxwaGFbMF0gLyAoMSArIGJldGFbMF0gel4tMSlcbiAgY29uc3QgYiA9IEZsb2F0NjRBcnJheS5vZihhbHBoYVswXSwgYWxwaGFbMV0sIDAsIDAsIDAsIDAsIDAsIDApO1xuICBjb25zdCBhID0gRmxvYXQ2NEFycmF5Lm9mKDEsIDAsIGJldGFbMF0sIGJldGFbMV0sIDAsIDAsIDAsIDAsIDAsIDApO1xuXG4gIGxldCBqLCBrO1xuXG4gIGZvciAoayA9IDI7IGsgPCA4OyBrICs9IDIpIHtcbiAgICAvLyBhZGQga3RoIHRlcm0sIGIvYSArPSBhbHBoYVtrXSAvICgxICsgYmV0YVtrXSB6Xi0xKVxuICAgIGJba10gICAgID0gYmV0YVtrXSAqIGJbayAtIDJdIC0gYmV0YVtrICsgMV0gKiBiW2sgLSAxXTtcbiAgICBiW2sgKyAxXSA9IGJldGFba10gKiBiW2sgLSAxXSArIGJldGFbayArIDFdICogYltrIC0gMl07XG4gICAgZm9yIChqID0gayAtIDI7IGogPiAwOyBqIC09IDIpIHtcbiAgICAgIGJbal0gICAgICs9IGJldGFba10gKiBiW2ogLSAyXSAtIGJldGFbayArIDFdICogYltqIC0gMV07XG4gICAgICBiW2ogKyAxXSArPSBiZXRhW2tdICogYltqIC0gMV0gKyBiZXRhW2sgKyAxXSAqIGJbaiAtIDJdO1xuICAgIH1cbiAgICBmb3IgKGogPSAwOyBqIDw9IGs7IGogKz0gMikge1xuICAgICAgYltqXSAgICAgKz0gYWxwaGFba10gKiBhW2pdICAgICAtIGFscGhhW2sgKyAxXSAqIGFbaiArIDFdO1xuICAgICAgYltqICsgMV0gKz0gYWxwaGFba10gKiBhW2ogKyAxXSArIGFscGhhW2sgKyAxXSAqIGFbal07XG4gICAgfVxuXG4gICAgYVtrICsgMl0gPSBiZXRhW2tdICogYVtrXSAgICAgLSBiZXRhW2sgKyAxXSAqIGFbayArIDFdO1xuICAgIGFbayArIDNdID0gYmV0YVtrXSAqIGFbayArIDFdICsgYmV0YVtrICsgMV0gKiBhW2tdO1xuICAgIGZvciAoaiA9IGs7IGogPiAwOyBqIC09IDIpIHtcbiAgICAgIGFbal0gICAgICs9IGJldGFba10gKiBhW2ogLSAyXSAtIGJldGFbayArIDFdICogYVtqIC0gMV07XG4gICAgICBhW2ogKyAxXSArPSBiZXRhW2tdICogYVtqIC0gMV0gKyBiZXRhW2sgKyAxXSAqIGFbaiAtIDJdO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoayA9IDA7IGsgPCBLOyArK2spIHtcbiAgICBqID0gayA8PCAxO1xuICAgIGJfb3V0W2tdID0gYltqXSAvIGRlbm9tO1xuICAgIGFfb3V0W2sgKyAxXSA9IGFbaiArIDJdO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXJpY2hlQ29udjJkKGN4LCBjeSwgZ3JpZCwgW254LCBueV0pIHtcbiAgLy8gYWxsb2NhdGUgYnVmZmVyc1xuICBjb25zdCB5YyA9IG5ldyBGbG9hdDY0QXJyYXkoTWF0aC5tYXgobngsIG55KSk7IC8vIGNhdXNhbFxuICBjb25zdCB5YSA9IG5ldyBGbG9hdDY0QXJyYXkoTWF0aC5tYXgobngsIG55KSk7IC8vIGFudGljYXVzYWxcbiAgY29uc3QgaCA9IG5ldyBGbG9hdDY0QXJyYXkoNSk7XG4gIGNvbnN0IGQgPSBuZXcgRmxvYXQ2NEFycmF5KGdyaWQubGVuZ3RoKTtcblxuICAvLyBjb252b2x2ZSByb3dzXG4gIGZvciAobGV0IHJvdyA9IDAsIHIwID0gMDsgcm93IDwgbnk7ICsrcm93LCByMCArPSBueCkge1xuICAgIGNvbnN0IGR4ID0gZC5zdWJhcnJheShyMCk7XG4gICAgZGVyaWNoZUNvbnYxZChjeCwgZ3JpZC5zdWJhcnJheShyMCksIG54LCAxLCB5YywgeWEsIGgsIGR4KTtcbiAgfVxuXG4gIC8vIGNvbnZvbHZlIGNvbHVtbnNcbiAgZm9yIChsZXQgYzAgPSAwOyBjMCA8IG54OyArK2MwKSB7XG4gICAgY29uc3QgZHkgPSBkLnN1YmFycmF5KGMwKTtcbiAgICBkZXJpY2hlQ29udjFkKGN5LCBkeSwgbnksIG54LCB5YywgeWEsIGgsIGR5KTtcbiAgfVxuXG4gIHJldHVybiBkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVyaWNoZUNvbnYxZChcbiAgYywgc3JjLCBOLFxuICBzdHJpZGUgPSAxLFxuICB5X2NhdXNhbCA9IG5ldyBGbG9hdDY0QXJyYXkoTiksXG4gIHlfYW50aWNhdXNhbCA9IG5ldyBGbG9hdDY0QXJyYXkoTiksXG4gIGggPSBuZXcgRmxvYXQ2NEFycmF5KDUpLFxuICBkID0geV9jYXVzYWwsXG4gIGluaXQgPSBkZXJpY2hlSW5pdFplcm9QYWRcbikge1xuICBjb25zdCBzdHJpZGVfMiA9IHN0cmlkZSAqIDI7XG4gIGNvbnN0IHN0cmlkZV8zID0gc3RyaWRlICogMztcbiAgY29uc3Qgc3RyaWRlXzQgPSBzdHJpZGUgKiA0O1xuICBjb25zdCBzdHJpZGVfTiA9IHN0cmlkZSAqIE47XG4gIGxldCBpLCBuO1xuXG4gIC8vIGluaXRpYWxpemUgY2F1c2FsIGZpbHRlciBvbiB0aGUgbGVmdCBib3VuZGFyeVxuICBpbml0KFxuICAgIHlfY2F1c2FsLCBzcmMsIE4sIHN0cmlkZSxcbiAgICBjLmJfY2F1c2FsLCAzLCBjLmEsIDQsIGMuc3VtX2NhdXNhbCwgaCwgYy5zaWdtYVxuICApO1xuXG4gIC8vIGZpbHRlciB0aGUgaW50ZXJpb3Igc2FtcGxlcyB1c2luZyBhIDR0aCBvcmRlciBmaWx0ZXIuIEltcGxlbWVudHM6XG4gIC8vIGZvciBuID0gSywgLi4uLCBOIC0gMSxcbiAgLy8gICB5XisobikgPSBcXHN1bV97az0wfV57Sy0xfSBiXitfayBzcmMobiAtIGspXG4gIC8vICAgICAgICAgIC0gXFxzdW1fe2s9MX1eSyBhX2sgeV4rKG4gLSBrKVxuICAvLyB2YXJpYWJsZSBpIHRyYWNrcyB0aGUgb2Zmc2V0IHRvIHRoZSBudGggc2FtcGxlIG9mIHNyYywgaXQgaXNcbiAgLy8gdXBkYXRlZCB0b2dldGhlciB3aXRoIG4gc3VjaCB0aGF0IGkgPSBzdHJpZGUgKiBuLlxuICBmb3IgKG4gPSA0LCBpID0gc3RyaWRlXzQ7IG4gPCBOOyArK24sIGkgKz0gc3RyaWRlKSB7XG4gICAgeV9jYXVzYWxbbl0gPSBjLmJfY2F1c2FsWzBdICogc3JjW2ldXG4gICAgICArIGMuYl9jYXVzYWxbMV0gKiBzcmNbaSAtIHN0cmlkZV1cbiAgICAgICsgYy5iX2NhdXNhbFsyXSAqIHNyY1tpIC0gc3RyaWRlXzJdXG4gICAgICArIGMuYl9jYXVzYWxbM10gKiBzcmNbaSAtIHN0cmlkZV8zXVxuICAgICAgLSBjLmFbMV0gKiB5X2NhdXNhbFtuIC0gMV1cbiAgICAgIC0gYy5hWzJdICogeV9jYXVzYWxbbiAtIDJdXG4gICAgICAtIGMuYVszXSAqIHlfY2F1c2FsW24gLSAzXVxuICAgICAgLSBjLmFbNF0gKiB5X2NhdXNhbFtuIC0gNF07XG4gIH1cblxuICAvLyBpbml0aWFsaXplIHRoZSBhbnRpY2F1c2FsIGZpbHRlciBvbiB0aGUgcmlnaHQgYm91bmRhcnlcbiAgaW5pdChcbiAgICB5X2FudGljYXVzYWwsIHNyYywgTiwgLXN0cmlkZSxcbiAgICBjLmJfYW50aWNhdXNhbCwgNCwgYy5hLCA0LCBjLnN1bV9hbnRpY2F1c2FsLCBoLCBjLnNpZ21hXG4gICk7XG5cbiAgLy8gc2ltaWxhciB0byB0aGUgY2F1c2FsIGZpbHRlciBhYm92ZSwgdGhlIGZvbGxvd2luZyBpbXBsZW1lbnRzOlxuICAvLyBmb3IgbiA9IEssIC4uLiwgTiAtIDEsXG4gIC8vICAgeV4tKG4pID0gXFxzdW1fe2s9MX1eSyBiXi1fayBzcmMoTiAtIG4gLSAxIC0gaylcbiAgLy8gICAgICAgICAgLSBcXHN1bV97az0xfV5LIGFfayB5Xi0obiAtIGspXG4gIC8vIHZhcmlhYmxlIGkgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaSA9IHN0cmlkZSAqIChOIC0gbiAtIDEpLlxuICBmb3IgKG4gPSA0LCBpID0gc3RyaWRlX04gLSBzdHJpZGUgKiA1OyBuIDwgTjsgKytuLCBpIC09IHN0cmlkZSkge1xuICAgIHlfYW50aWNhdXNhbFtuXSA9IGMuYl9hbnRpY2F1c2FsWzFdICogc3JjW2kgKyBzdHJpZGVdXG4gICAgICArIGMuYl9hbnRpY2F1c2FsWzJdICogc3JjW2kgKyBzdHJpZGVfMl1cbiAgICAgICsgYy5iX2FudGljYXVzYWxbM10gKiBzcmNbaSArIHN0cmlkZV8zXVxuICAgICAgKyBjLmJfYW50aWNhdXNhbFs0XSAqIHNyY1tpICsgc3RyaWRlXzRdXG4gICAgICAtIGMuYVsxXSAqIHlfYW50aWNhdXNhbFtuIC0gMV1cbiAgICAgIC0gYy5hWzJdICogeV9hbnRpY2F1c2FsW24gLSAyXVxuICAgICAgLSBjLmFbM10gKiB5X2FudGljYXVzYWxbbiAtIDNdXG4gICAgICAtIGMuYVs0XSAqIHlfYW50aWNhdXNhbFtuIC0gNF07XG4gIH1cblxuICAvLyBzdW0gdGhlIGNhdXNhbCBhbmQgYW50aWNhdXNhbCByZXNwb25zZXMgdG8gb2J0YWluIHRoZSBmaW5hbCByZXN1bHRcbiAgaWYgKGMubmVnYXRpdmUpIHtcbiAgICAvLyBkbyBub3QgdGhyZXNob2xkIGlmIHRoZSBpbnB1dCBncmlkIGluY2x1ZGVzIG5lZ2F0aXZlbHkgd2VpZ2h0ZWQgdmFsdWVzXG4gICAgZm9yIChuID0gMCwgaSA9IDA7IG4gPCBOOyArK24sIGkgKz0gc3RyaWRlKSB7XG4gICAgICBkW2ldID0geV9jYXVzYWxbbl0gKyB5X2FudGljYXVzYWxbTiAtIG4gLSAxXTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gdGhyZXNob2xkIHRvIHByZXZlbnQgc21hbGwgbmVnYXRpdmUgdmFsdWVzIGR1ZSB0byBmbG9hdGluZyBwb2ludCBlcnJvclxuICAgIGZvciAobiA9IDAsIGkgPSAwOyBuIDwgTjsgKytuLCBpICs9IHN0cmlkZSkge1xuICAgICAgZFtpXSA9IE1hdGgubWF4KDAsIHlfY2F1c2FsW25dICsgeV9hbnRpY2F1c2FsW04gLSBuIC0gMV0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVyaWNoZUluaXRaZXJvUGFkKGRlc3QsIHNyYywgTiwgc3RyaWRlLCBiLCBwLCBhLCBxLCBzdW0sIGgpIHtcbiAgY29uc3Qgc3RyaWRlX04gPSBNYXRoLmFicyhzdHJpZGUpICogTjtcbiAgY29uc3Qgb2ZmID0gc3RyaWRlIDwgMCA/IHN0cmlkZV9OICsgc3RyaWRlIDogMDtcbiAgbGV0IGksIG4sIG07XG5cbiAgLy8gY29tcHV0ZSB0aGUgZmlyc3QgcSB0YXBzIG9mIHRoZSBpbXB1bHNlIHJlc3BvbnNlLCBoXzAsIC4uLiwgaF97cS0xfVxuICBmb3IgKG4gPSAwOyBuIDwgcTsgKytuKSB7XG4gICAgaFtuXSA9IChuIDw9IHApID8gYltuXSA6IDA7XG4gICAgZm9yIChtID0gMTsgbSA8PSBxICYmIG0gPD0gbjsgKyttKSB7XG4gICAgICBoW25dIC09IGFbbV0gKiBoW24gLSBtXTtcbiAgICB9XG4gIH1cblxuICAvLyBjb21wdXRlIGRlc3RfbSA9IHN1bV97bj0xfV5tIGhfe20tbn0gc3JjX24sIG0gPSAwLCAuLi4sIHEtMVxuICAvLyBub3RlOiBxID09IDRcbiAgZm9yIChtID0gMDsgbSA8IHE7ICsrbSkge1xuICAgIGZvciAoZGVzdFttXSA9IDAsIG4gPSAxOyBuIDw9IG07ICsrbikge1xuICAgICAgaSA9IG9mZiArIHN0cmlkZSAqIG47XG4gICAgICBpZiAoaSA+PSAwICYmIGkgPCBzdHJpZGVfTikge1xuICAgICAgICBkZXN0W21dICs9IGhbbSAtIG5dICogc3JjW2ldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGRlc3RfbSA9IGRlc3RfbSArIGhfe24rbX0gc3JjX3stbn1cbiAgY29uc3QgY3VyID0gc3JjW29mZl07XG4gIGlmIChjdXIgPiAwKSB7XG4gICAgZm9yIChtID0gMDsgbSA8IHE7ICsrbSkge1xuICAgICAgZGVzdFttXSArPSBoW21dICogY3VyO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybjtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBleHRlbnQoZGF0YSwgeCwgcGFkID0gMCkge1xuICBjb25zdCBuID0gZGF0YS5sZW5ndGg7XG4gIGxldCBsbztcbiAgbGV0IGhpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgIGNvbnN0IHYgPSB4KGRhdGFbaV0sIGksIGRhdGEpO1xuICAgIGlmICh2ICE9IG51bGwpIHtcbiAgICAgIGlmIChsbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh2ID49IHYpIGxvID0gaGkgPSB2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHYgPCBsbykgbG8gPSB2O1xuICAgICAgICBpZiAodiA+IGhpKSBoaSA9IHY7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbbG8gLSBwYWQsIGhpICsgcGFkXTtcbn1cbiIsImltcG9ydCB7IHJnYiB9IGZyb20gJ2QzLWNvbG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIGhlYXRtYXAoXG4gIGdyaWQsXG4gIHcsXG4gIGgsXG4gIGNvbG9yID0gb3BhY2l0eU1hcCgwLCAwLCAwKSxcbiAgW2xvLCBoaV0gPSBbbWluKGdyaWQsIDApLCBtYXgoZ3JpZCwgMCldLFxuICBjYW52YXMgPSBjcmVhdGVDYW52YXModywgaCksXG4gIHBhbGV0dGVTaXplID0gMjU2XG4pIHtcbiAgY29uc3Qgbm9ybSA9IDEgLyAoaGkgLSBsbyk7XG4gIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICBjb25zdCBpbWcgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHcsIGgpO1xuICBjb25zdCBwaXggPSBpbWcuZGF0YTtcbiAgY29uc3Qgc2l6ZSA9IHBhbGV0dGVTaXplIC0gMTtcbiAgY29uc3QgcGFsZXR0ZSA9IGJ1aWxkUGFsZXR0ZShzaXplLCBjb2xvcik7XG5cbiAgZm9yIChsZXQgaiA9IDAsIGsgPSAwOyBqIDwgaDsgKytqKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIHJvdyA9IChoIC0gaiAtIDEpICogdzsgaSA8IHc7ICsraSwgayArPSA0KSB7XG4gICAgICBjb25zdCB2ID0gTWF0aC5taW4oMSwgTWF0aC5tYXgoZ3JpZFtpICsgcm93XSAtIGxvLCAwKSAqIG5vcm0pO1xuICAgICAgY29uc3QgYyA9IChzaXplICogdikgPDwgMjtcbiAgICAgIHBpeFtrICsgMF0gPSBwYWxldHRlW2MgKyAwXTtcbiAgICAgIHBpeFtrICsgMV0gPSBwYWxldHRlW2MgKyAxXTtcbiAgICAgIHBpeFtrICsgMl0gPSBwYWxldHRlW2MgKyAyXTtcbiAgICAgIHBpeFtrICsgM10gPSBwYWxldHRlW2MgKyAzXTtcbiAgICB9XG4gIH1cblxuICBjdHgucHV0SW1hZ2VEYXRhKGltZywgMCwgMCk7XG4gIHJldHVybiBjYW52YXM7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGFsZXR0ZShzaXplLCBpbnRlcnApIHtcbiAgY29uc3QgcCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSg0ICogKHNpemUgKyAxKSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IHNpemU7ICsraSkge1xuICAgIGNvbnN0IHYgPSBpbnRlcnAoaSAvIHNpemUpO1xuICAgIGNvbnN0IHtyLCBnLCBiLCBvcGFjaXR5ID0gMX0gPSB0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyByZ2IodikgOiB2O1xuICAgIGNvbnN0IGsgPSBpIDw8IDI7XG4gICAgcFtrICsgMF0gPSByO1xuICAgIHBbayArIDFdID0gZztcbiAgICBwW2sgKyAyXSA9IGI7XG4gICAgcFtrICsgM10gPSAoMjU1ICogb3BhY2l0eSkgfCAwO1xuICB9XG4gIHJldHVybiBwO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDYW52YXModywgaCkge1xuICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgIGNvbnN0IGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCB3KTtcbiAgICBjLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgaCk7XG4gICAgcmV0dXJuIGM7XG4gIH1cbiAgdGhyb3cgJ0NhbiBub3QgY3JlYXRlIGEgY2FudmFzIGluc3RhbmNlLCBwcm92aWRlIGEgY2FudmFzIGFzIGEgcGFyYW1ldGVyLic7XG59XG5cbmZ1bmN0aW9uIG1heChhcnJheSwgdikge1xuICBjb25zdCBuID0gYXJyYXkubGVuZ3RoO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgIGlmIChhcnJheVtpXSA+IHYpIHYgPSBhcnJheVtpXTtcbiAgfVxuICByZXR1cm4gdjtcbn1cblxuZnVuY3Rpb24gbWluKGFycmF5LCB2KSB7XG4gIGNvbnN0IG4gPSBhcnJheS5sZW5ndGg7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKGFycmF5W2ldIDwgdikgdiA9IGFycmF5W2ldO1xuICB9XG4gIHJldHVybiB2O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3BhY2l0eU1hcChyLCBnLCBiKSB7XG4gIHJldHVybiBvcGFjaXR5ID0+ICh7IHIsIGcsIGIsIG9wYWNpdHkgfSk7XG59XG4iLCJleHBvcnQgeyBkZW5zaXR5MWQgfSBmcm9tICcuL2RlbnNpdHkxZC5qcyc7XG5leHBvcnQgeyBkZW5zaXR5MmQgfSBmcm9tICcuL2RlbnNpdHkyZC5qcyc7XG5leHBvcnQgeyBucmQgfSBmcm9tICcuL25yZC5qcyc7XG5leHBvcnQgeyBvcGFjaXR5TWFwIH0gZnJvbSAnLi9oZWF0bWFwLmpzJztcbiIsIi8vIFNjb3R0LCBELiBXLiAoMTk5MikgTXVsdGl2YXJpYXRlIERlbnNpdHkgRXN0aW1hdGlvbjpcbi8vIFRoZW9yeSwgUHJhY3RpY2UsIGFuZCBWaXN1YWxpemF0aW9uLiBXaWxleS5cbmV4cG9ydCBmdW5jdGlvbiBucmQoZGF0YSwgeCkge1xuICBjb25zdCB2YWx1ZXMgPSBkYXRhLm1hcCh4KS5maWx0ZXIodiA9PiB2ICE9IG51bGwgJiYgdiA+PSB2KTtcbiAgdmFsdWVzLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgY29uc3Qgc2QgPSBzdGRldih2YWx1ZXMpO1xuICBjb25zdCBxMSA9IHF1YW50aWxlKHZhbHVlcywgMC4yNSk7XG4gIGNvbnN0IHEzID0gcXVhbnRpbGUodmFsdWVzLCAwLjc1KTtcblxuICBjb25zdCBuID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgICAgaCA9IChxMyAtIHExKSAvIDEuMzQsXG4gICAgICAgIHYgPSBNYXRoLm1pbihzZCwgaCkgfHwgc2QgfHwgTWF0aC5hYnMocTEpIHx8IDE7XG5cbiAgcmV0dXJuIDEuMDYgKiB2ICogTWF0aC5wb3cobiwgLTAuMik7XG59XG5cbmZ1bmN0aW9uIHN0ZGV2KHZhbHVlcykge1xuICBjb25zdCBuID0gdmFsdWVzLmxlbmd0aDtcbiAgbGV0IGNvdW50ID0gMDtcbiAgbGV0IGRlbHRhO1xuICBsZXQgbWVhbiA9IDA7XG4gIGxldCBzdW0gPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2ldO1xuICAgIGRlbHRhID0gdmFsdWUgLSBtZWFuO1xuICAgIG1lYW4gKz0gZGVsdGEgLyArK2NvdW50O1xuICAgIHN1bSArPSBkZWx0YSAqICh2YWx1ZSAtIG1lYW4pO1xuICB9XG4gIHJldHVybiBjb3VudCA+IDEgPyBNYXRoLnNxcnQoc3VtIC8gKGNvdW50IC0gMSkpIDogTmFOO1xufVxuXG5mdW5jdGlvbiBxdWFudGlsZSh2YWx1ZXMsIHApIHtcbiAgY29uc3QgbiA9IHZhbHVlcy5sZW5ndGg7XG5cbiAgaWYgKCFuKSByZXR1cm4gTmFOO1xuICBpZiAoKHAgPSArcCkgPD0gMCB8fCBuIDwgMikgcmV0dXJuIHZhbHVlc1swXTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuIHZhbHVlc1tuIC0gMV07XG5cbiAgY29uc3QgaSA9IChuIC0gMSkgKiBwO1xuICBjb25zdCBpMCA9IE1hdGguZmxvb3IoaSk7XG4gIGNvbnN0IHYwID0gdmFsdWVzW2kwXTtcbiAgcmV0dXJuIHYwICsgKHZhbHVlc1tpMCArIDFdIC0gdjApICogKGkgLSBpMCk7XG59XG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbi8vIGludGVybmFsIGltcG9ydHNcclxuaW1wb3J0IHsgR2VvQ2FudmFzIH0gZnJvbSAnLi9HZW9DYW52YXMuanMnXHJcbmltcG9ydCB7IExheWVyIH0gZnJvbSAnLi9MYXllci5qcydcclxuaW1wb3J0IHsgRGF0YXNldCB9IGZyb20gJy4vRGF0YXNldC5qcydcclxuaW1wb3J0IHsgVG9vbHRpcCB9IGZyb20gJy4vVG9vbHRpcC5qcydcclxuaW1wb3J0IHsgQ1NWR3JpZCB9IGZyb20gJy4vZGF0YXNldC9DU1ZHcmlkLmpzJ1xyXG4vL2ltcG9ydCB7IFBhcnF1ZXRHcmlkIH0gZnJvbSAnLi9kYXRhc2V0L1BhcnF1ZXRHcmlkJztcclxuaW1wb3J0IHsgVGlsZWRHcmlkIH0gZnJvbSAnLi9kYXRhc2V0L1RpbGVkR3JpZC5qcydcclxuaW1wb3J0IHsgQmFja2dyb3VuZExheWVyIH0gZnJvbSAnLi9CYWNrZ3JvdW5kTGF5ZXIuanMnXHJcbmltcG9ydCB7IEJhY2tncm91bmRMYXllcldNUyB9IGZyb20gJy4vQmFja2dyb3VuZExheWVyV01TLmpzJ1xyXG5pbXBvcnQgeyBMYWJlbExheWVyIH0gZnJvbSAnLi9MYWJlbExheWVyLmpzJ1xyXG5pbXBvcnQgeyBMaW5lTGF5ZXIgfSBmcm9tICcuL0xpbmVMYXllci5qcydcclxuaW1wb3J0IHsgbW9uaXRvciwgbW9uaXRvckR1cmF0aW9uIH0gZnJvbSAnLi91dGlscy9VdGlscy5qcydcclxuXHJcbi8vIGV4dGVybmFsIGltcG9ydHNcclxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xyXG5cclxuLyoqXHJcbiAqIEEgZ3JpZHZpeiBhcHBsaWNhdGlvbi5cclxuICpcclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEFwcCB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7SFRNTERpdkVsZW1lbnR9IGNvbnRhaW5lclxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoY29udGFpbmVyLCBvcHRzKSB7XHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGxheWVycy5cclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPExheWVyPn1cclxuICAgICAgICAgKiAqL1xyXG4gICAgICAgIHRoaXMubGF5ZXJzID0gW11cclxuXHJcbiAgICAgICAgLy9nZXQgY29udGFpbmVyIGVsZW1lbnRcclxuICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dyaWR2aXonKVxyXG4gICAgICAgIGlmICghY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Nhbm5vdCBmaW5kIGdyaWR2aXogY29udGFpbmVyIGVsZW1lbnQuJylcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3NldCBkaW1lbnNpb25zXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy53ID0gb3B0cy53IHx8IGNvbnRhaW5lci5vZmZzZXRXaWR0aFxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuaCA9IG9wdHMuaCB8fCBjb250YWluZXIub2Zmc2V0SGVpZ2h0XHJcblxyXG4gICAgICAgIC8vY3JlYXRlIGNhbnZhcyBlbGVtZW50IGlmIHVzZXIgZG9lc250IHNwZWNpZnkgb25lXHJcbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudH0gKi9cclxuICAgICAgICBsZXQgY2FudmFzID0gb3B0cy5jYW52YXMgfHwgbnVsbFxyXG4gICAgICAgIGlmICghY2FudmFzKSB7XHJcbiAgICAgICAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXHJcbiAgICAgICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJycgKyB0aGlzLncpXHJcbiAgICAgICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxyXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY2FudmFzKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqIE1ha2UgZ2VvIGNhbnZhc1xyXG4gICAgICAgICAqIEB0eXBlIHtHZW9DYW52YXN9XHJcbiAgICAgICAgICogQHByaXZhdGUgKi9cclxuICAgICAgICB0aGlzLmNnID0gbmV3IEdlb0NhbnZhcyhjYW52YXMsIHVuZGVmaW5lZCwgMSwgb3B0cylcclxuICAgICAgICB0aGlzLmNnLnJlZHJhdyA9IChzdHJvbmcgPSB0cnVlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJ1N0YXJ0IHJlZHJhdycpXHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCI/eD1cIiArIHRoaXMuY2cuZ2V0Q2VudGVyKCkueCArIFwiJnk9XCIgKyB0aGlzLmNnLmdldENlbnRlcigpLnkgKyBcIiZ6PVwiICsgdGhpcy5jZy5nZXRaZigpKVxyXG5cclxuICAgICAgICAgICAgLy9yZW1vdmUgbGVnZW5kIGVsZW1lbnRzXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZ2VuZCAmJiBzdHJvbmcpIHRoaXMubGVnZW5kLnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXHJcblxyXG4gICAgICAgICAgICAvL2NsZWFyXHJcbiAgICAgICAgICAgIHRoaXMuY2cuaW5pdENhbnZhc1RyYW5zZm9ybSgpXHJcbiAgICAgICAgICAgIHRoaXMuY2cuY2xlYXIodGhpcy5jZy5iYWNrZ3JvdW5kQ29sb3IpXHJcblxyXG4gICAgICAgICAgICBjb25zdCB6ZiA9IHRoaXMuZ2V0Wm9vbUZhY3RvcigpXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRXh0ZW50R2VvKClcclxuXHJcbiAgICAgICAgICAgIC8vZ28gdGhyb3VnaCB0aGUgYmFja2dyb3VuZCBsYXllcnNcclxuICAgICAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmJnTGF5ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIGxheWVyIGlzIHZpc2libGVcclxuICAgICAgICAgICAgICAgIGlmICghbGF5ZXIudmlzaWJsZSkgY29udGludWVcclxuICAgICAgICAgICAgICAgIGlmICh6ZiA+IGxheWVyLm1heFpvb20pIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICBpZiAoemYgPCBsYXllci5taW5ab29tKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgICAgIC8vZHJhdyBsYXllclxyXG4gICAgICAgICAgICAgICAgbGF5ZXIuZHJhdyh0aGlzLmNnKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2dvIHRocm91Z2ggdGhlIGxheWVyc1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIGxheWVyIGlzIHZpc2libGVcclxuICAgICAgICAgICAgICAgIGlmICghbGF5ZXIudmlzaWJsZSkgY29udGludWVcclxuICAgICAgICAgICAgICAgIGlmICh6ZiA+IGxheWVyLm1heFpvb20pIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICBpZiAoemYgPCBsYXllci5taW5ab29tKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgICAgIC8vZ2V0IGxheWVyIGRhdGFzZXQgY29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge2ltcG9ydCgnLi9EYXRhc2V0Q29tcG9uZW50JykuRGF0YXNldENvbXBvbmVudHx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkc2MgPSBsYXllci5nZXREYXRhc2V0Q29tcG9uZW50KHpmKVxyXG4gICAgICAgICAgICAgICAgaWYgKCFkc2MpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAgICAgLy9sYXVuY2ggZGF0YSBkb3dubG9hZCwgaWYgbmVjZXNzYXJ5XHJcbiAgICAgICAgICAgICAgICBpZiAoc3Ryb25nKVxyXG4gICAgICAgICAgICAgICAgICAgIGRzYy5nZXREYXRhKHRoaXMuY2cuZXh0R2VvLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2cucmVkcmF3KClcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgICAgIC8vdXBkYXRlIGRhdGFzZXQgdmlldyBjYWNoZVxyXG4gICAgICAgICAgICAgICAgaWYgKHN0cm9uZykgZHNjLnVwZGF0ZVZpZXdDYWNoZSh0aGlzLmNnLmV4dEdlbylcclxuXHJcbiAgICAgICAgICAgICAgICAvL2RyYXcgY2VsbHMsIHN0eWxlIGJ5IHN0eWxlXHJcbiAgICAgICAgICAgICAgICBpZiAoc3Ryb25nKVxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcyBvZiBsYXllci5zdHlsZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHpmID4gcy5tYXhab29tKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoemYgPCBzLm1pblpvb20pIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHMuZHJhdyhkc2MuZ2V0Vmlld0NhY2hlKCksIGRzYy5nZXRSZXNvbHV0aW9uKCksIHRoaXMuY2cpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vYWRkIGxlZ2VuZCBlbGVtZW50XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5sZWdlbmQgJiYgc3Ryb25nKVxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcyBvZiBsYXllci5zdHlsZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHpmID4gcy5tYXhab29tKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoemYgPCBzLm1pblpvb20pIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGcgb2Ygcy5sZWdlbmRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHMsIGxnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzLmxlZ2VuZC5hcHBlbmQobGcuZGl2KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zMS5ub2RlKCkuYXBwZW5kQ2hpbGQoczIubm9kZSgpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWdlbmQubm9kZSgpLmFwcGVuZChsZy5kaXYubm9kZSgpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2Nhc2UgZm9yIHN0eWxlcyBvZiBzdHlsZXMsIGxpa2Uga2VybmVsIHNtb290aGluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gZG8gYmV0dGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzWydzdHlsZXMnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzMiBvZiBzLnN0eWxlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6ZiA+IHMyLm1heFpvb20pIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHpmIDwgczIubWluWm9vbSkgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxnIG9mIHMyLmxlZ2VuZHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhzLCBsZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzLmxlZ2VuZC5hcHBlbmQobGcuZGl2KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3MxLm5vZGUoKS5hcHBlbmRDaGlsZChzMi5ub2RlKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVnZW5kLm5vZGUoKS5hcHBlbmQobGcuZGl2Lm5vZGUoKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vZHJhdyBib3VuZGFyeSBsYXllclxyXG4gICAgICAgICAgICAvL2lmIChzdHJvbmcpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3dCb3VuZGFyaWVzICYmIHRoaXMuYm91bmRhcnlMYXllcikgdGhpcy5ib3VuZGFyeUxheWVyLmRyYXcodGhpcy5jZylcclxuXHJcbiAgICAgICAgICAgIC8vZHJhdyBsYWJlbCBsYXllclxyXG4gICAgICAgICAgICAvL2lmIChzdHJvbmcpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3dMYWJlbHMgJiYgdGhpcy5sYWJlbExheWVyKSB0aGlzLmxhYmVsTGF5ZXIuZHJhdyh0aGlzLmNnKVxyXG5cclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlID0gbnVsbFxyXG5cclxuICAgICAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignRW5kIHJlZHJhdycpXHJcblxyXG4gICAgICAgICAgICAvLyBsaXN0ZW4gZm9yIHJlc2l6ZSBldmVudHMgb24gdGhlIEFwcCdzIGNvbnRhaW5lciBhbmQgaGFuZGxlIHRoZW1cclxuICAgICAgICAgICAgdGhpcy5kZWZpbmVSZXNpemVPYnNlcnZlcihjb250YWluZXIsIGNhbnZhcylcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiogQHR5cGUge0FycmF5LjxCYWNrZ3JvdW5kTGF5ZXJ8QmFja2dyb3VuZExheWVyV01TPn0gKi9cclxuICAgICAgICB0aGlzLmJnTGF5ZXJzID0gW11cclxuICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXHJcbiAgICAgICAgdGhpcy5zaG93QmdMYXllcnMgPSB0cnVlXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7TGFiZWxMYXllciB8IHVuZGVmaW5lZH0gKi9cclxuICAgICAgICB0aGlzLmxhYmVsTGF5ZXIgPSB1bmRlZmluZWRcclxuICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXHJcbiAgICAgICAgdGhpcy5zaG93TGFiZWxzID0gdHJ1ZVxyXG5cclxuICAgICAgICAvKiogQHR5cGUge0xpbmVMYXllciB8IHVuZGVmaW5lZH0gKi9cclxuICAgICAgICB0aGlzLmJvdW5kYXJ5TGF5ZXIgPSB1bmRlZmluZWRcclxuICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXHJcbiAgICAgICAgdGhpcy5zaG93Qm91bmRhcmllcyA9IHRydWVcclxuXHJcbiAgICAgICAgLy9sZWdlbmQgZGl2XHJcblxyXG4gICAgICAgIHRoaXMubGVnZW5kRGl2SWQgPSBvcHRzLmxlZ2VuZERpdklkIHx8ICdndml6TGVnZW5kJ1xyXG4gICAgICAgIHRoaXMubGVnZW5kID0gc2VsZWN0KCcjJyArIHRoaXMubGVnZW5kRGl2SWQpXHJcbiAgICAgICAgaWYgKHRoaXMubGVnZW5kLmVtcHR5KCkpIHtcclxuICAgICAgICAgICAgdGhpcy5sZWdlbmQgPSBzZWxlY3QoJ2JvZHknKVxyXG4gICAgICAgICAgICAgICAgLmFwcGVuZCgnZGl2JylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsIHRoaXMubGVnZW5kRGl2SWQpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnd2lkdGgnLCAnYXV0bycpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2hlaWdodCcsICdhdXRvJylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnYmFja2dyb3VuZCcsICcjRkZGRkZGQ0MnKVxyXG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJwYWRkaW5nXCIsIHRoaXMucGFkZGluZylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnYm9yZGVyJywgJzBweCcpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2JvcmRlci1yYWRpdXMnLCAnNXB4JylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnYm94LXNoYWRvdycsICczcHggM3B4IDNweCBncmV5LCAtM3B4IC0zcHggM3B4ICNkZGQnKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LWZhbWlseScsICdIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgndG9wJywgJzIwcHgnKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdyaWdodCcsICcyMHB4JylcclxuICAgICAgICAgICAgLy9oaWRlXHJcbiAgICAgICAgICAgIC8vLnN0eWxlKFwidmlzaWJpbGl0eVwiLCBcImhpZGRlblwiKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy90b29sdGlwXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge1Rvb2x0aXB9ICovXHJcbiAgICAgICAgdGhpcy50b29sdGlwID0gbmV3IFRvb2x0aXAob3B0cy50b29sdGlwKVxyXG5cclxuICAgICAgICAvKiogQHBhcmFtIHtNb3VzZUV2ZW50fSBlICovXHJcbiAgICAgICAgY29uc3QgZm9jdXNDZWxsID0gKGUpID0+IHtcclxuICAgICAgICAgICAgLy9jb21wdXRlIG1vdXNlIGdlbyBwb3NpdGlvblxyXG4gICAgICAgICAgICBjb25zdCBtb3VzZVBvc2l0aW9uR2VvID0ge1xyXG4gICAgICAgICAgICAgICAgeDogdGhpcy5jZy5waXhUb0dlb1goZS5vZmZzZXRYICsgdGhpcy50b29sdGlwLnhNb3VzZU9mZnNldCksXHJcbiAgICAgICAgICAgICAgICB5OiB0aGlzLmNnLnBpeFRvR2VvWShlLm9mZnNldFkgKyB0aGlzLnRvb2x0aXAueU1vdXNlT2Zmc2V0KSxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvKiogQHR5cGUge3tjZWxsOmltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCxodG1sOnN0cmluZyxyZXNvbHV0aW9uOm51bWJlcn0gfCB1bmRlZmluZWR9ICovXHJcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzID0gdGhpcy5nZXRDZWxsRm9jdXNJbmZvKG1vdXNlUG9zaXRpb25HZW8pXHJcblxyXG4gICAgICAgICAgICAvLyB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kIChlLmcuIGxlYWZsZXQpICdyZWQgcGFpbnRpbmcnIGZpeFxyXG4gICAgICAgICAgICBpZiAob3B0cy50cmFuc3BhcmVudEJhY2tncm91bmQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChmb2N1cykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5zZXRQb3NpdGlvbihlKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5zaG93KClcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuaHRtbChmb2N1cy5odG1sKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKHRoaXMuY2cuY2FudmFzLCAwLCAwKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jZy5pbml0Q2FudmFzVHJhbnNmb3JtKClcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZm9jdXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5zZXRQb3NpdGlvbihlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLnNob3coKVxyXG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLmh0bWwoZm9jdXMuaHRtbClcclxuXHJcbiAgICAgICAgICAgICAgICAvL3Nob3cgY2VsbCBwb3NpdGlvbiBhcyBhIHJlY3RhbmdsZVxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhbnZhc1NhdmUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJycgKyB0aGlzLncpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJycgKyB0aGlzLmgpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKHRoaXMuY2cuY2FudmFzLCAwLCAwKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNnLmN0eC5kcmF3SW1hZ2UodGhpcy5jYW52YXNTYXZlLCAwLCAwKVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vZHJhdyBpbWFnZSBzYXZlZCArIGRyYXcgcmVjdGFuZ2xlXHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWN0V1BpeCA9IHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXhcclxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXgoZm9jdXMucmVzb2x1dGlvbiwgdGhpcy5nZXRab29tRmFjdG9yKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgOiA0XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNnLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jZy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLnNlbGVjdGlvblJlY3RhbmdsZUNvbG9yXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNnLmN0eC5saW5lV2lkdGggPSByZWN0V1BpeFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jZy5jdHguYmVnaW5QYXRoKClcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNnLmN0eC5yZWN0KFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2cuZ2VvVG9QaXhYKGZvY3VzLmNlbGwueCkgLSByZWN0V1BpeCAvIDIsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZy5nZW9Ub1BpeFkoZm9jdXMuY2VsbC55KSArIHJlY3RXUGl4IC8gMixcclxuICAgICAgICAgICAgICAgICAgICBmb2N1cy5yZXNvbHV0aW9uIC8gdGhpcy5nZXRab29tRmFjdG9yKCkgKyByZWN0V1BpeCxcclxuICAgICAgICAgICAgICAgICAgICAtZm9jdXMucmVzb2x1dGlvbiAvIHRoaXMuZ2V0Wm9vbUZhY3RvcigpIC0gcmVjdFdQaXhcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIHRoaXMuY2cuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW52YXNTYXZlKSB0aGlzLmNnLmN0eC5kcmF3SW1hZ2UodGhpcy5jYW52YXNTYXZlLCAwLCAwKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICBmb2N1c0NlbGwoZSlcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICBmb2N1c0NlbGwoZSlcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy50b29sdGlwLmhpZGUoKVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIC8vIGFkZCBleHRyYSBsb2dpYyB0byBvblpvb21TdGFydEZ1blxyXG4gICAgICAgIHRoaXMuY2cub25ab29tU3RhcnRGdW4gPSAoZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAob3B0cy5vblpvb21TdGFydEZ1bikgb3B0cy5vblpvb21TdGFydEZ1bihlKVxyXG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2ZvciBtb3VzZSBvdmVyXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7SFRNTENhbnZhc0VsZW1lbnR8bnVsbH0gKi9cclxuICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSBudWxsXHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlQ29sb3IgPSBvcHRzLnNlbGVjdGlvblJlY3RhbmdsZUNvbG9yIHx8ICdyZWQnXHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVXaWR0aFBpeCA9IG9wdHMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXggfHwgKCgpID0+IDQpIC8vKHIsemYpID0+IHt9XHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgLy9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgZSA9PiB7IGNvbnNvbGUubG9nKGFyZ3VtZW50cykgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWFyZ2luUHhcclxuICAgICAqIEByZXR1cm5zIHtpbXBvcnQoJy4vRGF0YXNldCcpLkVudmVsb3BlfVxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICB1cGRhdGVFeHRlbnRHZW8obWFyZ2luUHggPSAyMCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNnLnVwZGF0ZUV4dGVudEdlbyhtYXJnaW5QeClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgY2VsbCBIVE1MIGluZm8gYXQgYSBnaXZlbiBnZW8gcG9zaXRpb24uXHJcbiAgICAgKiBUaGlzIGlzIHVzZWZ1bGwgZm9yIHVzZXIgaW50ZXJhY3Rpb25zLCB0byBzaG93IHRoaXMgaW5mbyB3aGVyZSB0aGUgdXNlciBjbGlja3MgZm9yIGV4YW1wbGUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHt7eDpudW1iZXIseTpudW1iZXJ9fSBwb3NHZW9cclxuICAgICAqIEByZXR1cm5zIHt7Y2VsbDppbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsaHRtbDpzdHJpbmcscmVzb2x1dGlvbjpudW1iZXJ9IHwgdW5kZWZpbmVkfVxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICovXHJcbiAgICBnZXRDZWxsRm9jdXNJbmZvKHBvc0dlbykge1xyXG4gICAgICAgIC8vZ28gdGhyb3VnaCB0aGUgbGF5ZXJzLCBzdGFydGluZyBmcm9tIHRvcFxyXG4gICAgICAgIGNvbnN0IHpmID0gdGhpcy5nZXRab29tRmFjdG9yKClcclxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5sYXllcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtMYXllcn0gKi9cclxuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmxheWVyc1tpXVxyXG4gICAgICAgICAgICBpZiAoIWxheWVyLnZpc2libGUpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGlmICghbGF5ZXIuY2VsbEluZm9IVE1MKSBjb250aW51ZVxyXG4gICAgICAgICAgICBpZiAobGF5ZXIuY2VsbEluZm9IVE1MID09PSAnbm9uZScpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGNvbnN0IGRzYyA9IGxheWVyLmdldERhdGFzZXRDb21wb25lbnQoemYpXHJcbiAgICAgICAgICAgIGlmICghZHNjKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy9nZXQgY2VsbCBhdCBtb3VzZSBwb3NpdGlvblxyXG4gICAgICAgICAgICAvKiogQHR5cGUge2ltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbHx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBkc2MuZ2V0Q2VsbEZyb21Qb3NpdGlvbihwb3NHZW8sIGRzYy5nZXRWaWV3Q2FjaGUoKSlcclxuICAgICAgICAgICAgaWYgKCFjZWxsKSByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBsYXllci5jZWxsSW5mb0hUTUwoY2VsbCwgZHNjLmdldFJlc29sdXRpb24oKSlcclxuICAgICAgICAgICAgaWYgKCFodG1sKSByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIHJldHVybiB7IGNlbGw6IGNlbGwsIGh0bWw6IGh0bWwsIHJlc29sdXRpb246IGRzYy5nZXRSZXNvbHV0aW9uKCkgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL2dldHRlcnMgYW5kIHNldHRlcnNcclxuXHJcbiAgICAvKiogQHJldHVybnMge3t4Om51bWJlcix5Om51bWJlcn19ICovXHJcbiAgICBnZXRHZW9DZW50ZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2cuZ2V0Q2VudGVyKClcclxuICAgIH1cclxuICAgIC8qKiBAcGFyYW0ge3t4Om51bWJlcix5Om51bWJlcn19IHZhbCBAcmV0dXJucyB7dGhpc30gKi9cclxuICAgIHNldEdlb0NlbnRlcih2YWwpIHtcclxuICAgICAgICB0aGlzLmNnLnNldENlbnRlcih2YWwpXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHJldHVybnMge251bWJlcn0gKi9cclxuICAgIGdldFpvb21GYWN0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2cuZ2V0WmYoKVxyXG4gICAgfVxyXG4gICAgLyoqIEBwYXJhbSB7bnVtYmVyfSB2YWwgQHJldHVybnMge3RoaXN9ICovXHJcbiAgICBzZXRab29tRmFjdG9yKHZhbCkge1xyXG4gICAgICAgIHRoaXMuY2cuc2V0WmYodmFsKVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEByZXR1cm5zIHtBcnJheS48bnVtYmVyPn0gKi9cclxuICAgIGdldFpvb21GYWN0b3JFeHRlbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2cuZ2V0WmZFeHRlbnQoKVxyXG4gICAgfVxyXG4gICAgLyoqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHZhbCBAcmV0dXJucyB7dGhpc30gKi9cclxuICAgIHNldFpvb21GYWN0b3JFeHRlbnQodmFsKSB7XHJcbiAgICAgICAgdGhpcy5jZy5zZXRaZkV4dGVudCh2YWwpXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cclxuICAgIGdldEJhY2tncm91bmRDb2xvcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jZy5iYWNrZ3JvdW5kQ29sb3JcclxuICAgIH1cclxuICAgIC8qKiBAcGFyYW0ge3N0cmluZ30gdmFsIEByZXR1cm5zIHt0aGlzfSAqL1xyXG4gICAgc2V0QmFja2dyb3VuZENvbG9yKHZhbCkge1xyXG4gICAgICAgIHRoaXMuY2cuYmFja2dyb3VuZENvbG9yID0gdmFsXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHJldHVybnMge0xpbmVMYXllciB8IHVuZGVmaW5lZH0gKi9cclxuICAgIGdldEJvdW5kYXJ5TGF5ZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYm91bmRhcnlMYXllclxyXG4gICAgfVxyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzIEByZXR1cm5zIHt0aGlzfSAqL1xyXG4gICAgc2V0Qm91bmRhcnlMYXllcihvcHRzKSB7XHJcbiAgICAgICAgdGhpcy5ib3VuZGFyeUxheWVyID0gbmV3IExpbmVMYXllcihvcHRzKVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEByZXR1cm5zIHtMYWJlbExheWVyIHwgdW5kZWZpbmVkfSAqL1xyXG4gICAgZ2V0TGFiZWxMYXllcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sYWJlbExheWVyXHJcbiAgICB9XHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgQHJldHVybnMge3RoaXN9ICovXHJcbiAgICBzZXRMYWJlbExheWVyKG9wdHMpIHtcclxuICAgICAgICB0aGlzLmxhYmVsTGF5ZXIgPSBuZXcgTGFiZWxMYXllcihvcHRzKVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEByZXR1cm5zIHt0aGlzfSAqL1xyXG4gICAgcmVkcmF3KCkge1xyXG4gICAgICAgIHRoaXMuY2cucmVkcmF3KClcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkIGEgbGF5ZXIgdG8gdGhlIGFwcC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0RhdGFzZXR9IGRhdGFzZXQgVGhlIGRhdGFzZXQgb2YgdGhlIGxheWVyXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4vU3R5bGUnKS5TdHlsZT59IHN0eWxlcyBUaGUgc3R5bGVzIG9mIHRoZSBsYXllclxyXG4gICAgICogQHBhcmFtIHt7dmlzaWJsZT86Ym9vbGVhbixtaW5ab29tPzpudW1iZXIsbWF4Wm9vbT86bnVtYmVyLHBpeE5iPzpudW1iZXIsY2VsbEluZm9IVE1MPzpmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwpOnN0cmluZ319IG9wdHMgVGhlIGxheWVyIG9wdGlvbnMuXHJcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cclxuICAgICAqL1xyXG4gICAgYWRkTGF5ZXJGcm9tRGF0YXNldChkYXRhc2V0LCBzdHlsZXMsIG9wdHMpIHtcclxuICAgICAgICBjb25zdCBsYXkgPSBuZXcgTGF5ZXIoZGF0YXNldCwgc3R5bGVzLCBvcHRzKVxyXG4gICAgICAgIHRoaXMubGF5ZXJzLnB1c2gobGF5KVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLy9kYXRhc2V0IGNyZWF0aW9uXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYWtlIGEgQ1NWIGdyaWQgZGF0YXNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiBUaGUgZGF0YXNldCByZXNvbHV0aW9uIGluIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICogQHBhcmFtIHtvYmplY3Q9fSBvcHRzIFRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBkYXRhc2V0LlxyXG4gICAgICogQHJldHVybnMge0RhdGFzZXR9XHJcbiAgICAgKi9cclxuICAgIG1ha2VDU1ZHcmlkRGF0YXNldCh1cmwsIHJlc29sdXRpb24sIG9wdHMpIHtcclxuICAgICAgICByZXR1cm4gbmV3IERhdGFzZXQoXHJcbiAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICAgIG5ldyBDU1ZHcmlkKHVybCwgcmVzb2x1dGlvbiwgb3B0cykuZ2V0RGF0YSh1bmRlZmluZWQsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNnLnJlZHJhdygpXHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgW10sXHJcbiAgICAgICAgICAgIG9wdHNcclxuICAgICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYWtlIGEgcGFycXVldCBncmlkIGRhdGFzZXQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIG9mIHRoZSBkYXRhc2V0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb24gVGhlIGRhdGFzZXQgcmVzb2x1dGlvbiBpbiBnZW9ncmFwaGljYWwgdW5pdC5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0cyBUaGUgcGFyYW1ldGVycyBvZiB0aGUgZGF0YXNldC5cclxuICAgICAqIEByZXR1cm5zIHtEYXRhc2V0fVxyXG4gICAgICovXHJcbiAgICAvKm1ha2VQYXJxdWV0R3JpZERhdGFzZXQodXJsLCByZXNvbHV0aW9uLCBvcHRzKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhc2V0KFtuZXcgUGFycXVldEdyaWQodXJsLCByZXNvbHV0aW9uLCBvcHRzKS5nZXREYXRhKHVuZGVmaW5lZCwgKCkgPT4geyB0aGlzLmNnLnJlZHJhdygpOyB9KV0sIFtdLCBvcHRzKVxyXG4gICAgfSovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYWtlIGEgdGlsZWQgZ3JpZCBkYXRhc2V0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcclxuICAgICAqIEBwYXJhbSB7e3ByZXByb2Nlc3M/OmZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbn19IG9wdHNcclxuICAgICAqIEByZXR1cm5zIHtEYXRhc2V0fVxyXG4gICAgICovXHJcbiAgICBtYWtlVGlsZWRHcmlkRGF0YXNldCh1cmwsIG9wdHMpIHtcclxuICAgICAgICByZXR1cm4gbmV3IERhdGFzZXQoXHJcbiAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICAgIG5ldyBUaWxlZEdyaWQodXJsLCB0aGlzLCBvcHRzKS5sb2FkSW5mbygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZy5yZWRyYXcoKVxyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIFtdLFxyXG4gICAgICAgICAgICBvcHRzXHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIC8vbXVsdGkgc2NhbGUgZGF0YXNldCBjcmVhdGlvblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFrZSBhIG11bHRpIHNjYWxlIHBhcnF1ZXQgZ3JpZCBkYXRhc2V0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHJlc29sdXRpb25zXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfSByZXNUb1VSTFxyXG4gICAgICogQHBhcmFtIHt7cHJlcHJvY2Vzcz86ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsKTpib29sZWFufX0gb3B0c1xyXG4gICAgICogQHJldHVybnMge0RhdGFzZXR9XHJcbiAgICAgKi9cclxuICAgIC8qbWFrZU11bHRpU2NhbGVQYXJxdWV0R3JpZERhdGFzZXQocmVzb2x1dGlvbnMsIHJlc1RvVVJMLCBvcHRzKSB7XHJcbiAgICAgICAgcmV0dXJuIERhdGFzZXQubWFrZShcclxuICAgICAgICAgICAgcmVzb2x1dGlvbnMsXHJcbiAgICAgICAgICAgIChyZXMpID0+IG5ldyBQYXJxdWV0R3JpZChyZXNUb1VSTChyZXMpLCByZXMsIG9wdHMpLmdldERhdGEodW5kZWZpbmVkLCAoKSA9PiB7IHRoaXMuY2cucmVkcmF3KCk7IH0pLFxyXG4gICAgICAgICAgICBvcHRzXHJcbiAgICAgICAgKVxyXG4gICAgfSovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYWtlIGEgbXVsdGkgc2NhbGUgQ1NWIGdyaWQgZGF0YXNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSByZXNvbHV0aW9uc1xyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihudW1iZXIpOnN0cmluZ30gcmVzVG9VUkxcclxuICAgICAqIEBwYXJhbSB7e3ByZXByb2Nlc3M/OmZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbn19IG9wdHNcclxuICAgICAqIEByZXR1cm5zIHtEYXRhc2V0fVxyXG4gICAgICovXHJcbiAgICBtYWtlTXVsdGlTY2FsZUNTVkdyaWREYXRhc2V0KHJlc29sdXRpb25zLCByZXNUb1VSTCwgb3B0cykge1xyXG4gICAgICAgIHJldHVybiBEYXRhc2V0Lm1ha2UoXHJcbiAgICAgICAgICAgIHJlc29sdXRpb25zLFxyXG4gICAgICAgICAgICAocmVzKSA9PlxyXG4gICAgICAgICAgICAgICAgbmV3IENTVkdyaWQocmVzVG9VUkwocmVzKSwgcmVzLCBvcHRzKS5nZXREYXRhKHVuZGVmaW5lZCwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2cucmVkcmF3KClcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBvcHRzXHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIC8vdGlsZWQgbXVsdGlzY2FsZVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFrZSBhIG11bHRpIHNjYWxlIHRpbGVkIGdyaWQgZGF0YXNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSByZXNvbHV0aW9uc1xyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihudW1iZXIpOnN0cmluZ30gcmVzVG9VUkxcclxuICAgICAqIEBwYXJhbSB7e3ByZXByb2Nlc3M/OmZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbn19IG9wdHNcclxuICAgICAqIEByZXR1cm5zIHtEYXRhc2V0fVxyXG4gICAgICovXHJcbiAgICBtYWtlTXVsdGlTY2FsZVRpbGVkR3JpZERhdGFzZXQocmVzb2x1dGlvbnMsIHJlc1RvVVJMLCBvcHRzKSB7XHJcbiAgICAgICAgcmV0dXJuIERhdGFzZXQubWFrZShcclxuICAgICAgICAgICAgcmVzb2x1dGlvbnMsXHJcbiAgICAgICAgICAgIChyZXMpID0+XHJcbiAgICAgICAgICAgICAgICBuZXcgVGlsZWRHcmlkKHJlc1RvVVJMKHJlcyksIHRoaXMsIG9wdHMpLmxvYWRJbmZvKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNnLnJlZHJhdygpXHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgb3B0c1xyXG4gICAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICAvLyBkaXJlY3QgbGF5ZXIgY3JlYXRpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIGxheWVyIGZyb20gYSBDU1YgZ3JpZCBkYXRhc2V0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCBvZiB0aGUgZGF0YXNldC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZSBkYXRhc2V0IHJlc29sdXRpb24gaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4vU3R5bGUnKS5TdHlsZT59IHN0eWxlcyBUaGUgc3R5bGVzLCBvcmRlcmVkIGluIGRyYXdpbmcgb3JkZXIuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdD19IG9wdHMgVGhlIHBhcmFtZXRlcnMgb2YgdGhlIGRhdGFzZXQgYW5kIGxheWVyLlxyXG4gICAgICogQHJldHVybnMge3RoaXN9XHJcbiAgICAgKi9cclxuICAgIGFkZENTVkdyaWRMYXllcih1cmwsIHJlc29sdXRpb24sIHN0eWxlcywgb3B0cykge1xyXG4gICAgICAgIGNvbnN0IGRzID0gdGhpcy5tYWtlQ1NWR3JpZERhdGFzZXQodXJsLCByZXNvbHV0aW9uLCBvcHRzKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZExheWVyRnJvbURhdGFzZXQoZHMsIHN0eWxlcywgb3B0cylcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIGxheWVyIGZyb20gYSBwYXJxdWV0IGdyaWQgZGF0YXNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiBUaGUgZGF0YXNldCByZXNvbHV0aW9uIGluIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KCcuL1N0eWxlJykuU3R5bGU+fSBzdHlsZXMgVGhlIHN0eWxlcywgb3JkZXJlZCBpbiBkcmF3aW5nIG9yZGVyLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3Q9fSBvcHRzIFRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBkYXRhc2V0IGFuZCBsYXllci5cclxuICAgICAqIEByZXR1cm5zIHt0aGlzfVxyXG4gICAgICovXHJcbiAgICAvKmFkZFBhcnF1ZXRHcmlkTGF5ZXIodXJsLCByZXNvbHV0aW9uLCBzdHlsZXMsIG9wdHMpIHtcclxuICAgICAgICBjb25zdCBkcyA9IHRoaXMubWFrZVBhcnF1ZXRHcmlkRGF0YXNldCh1cmwsIHJlc29sdXRpb24sIG9wdHMpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkTGF5ZXJGcm9tRGF0YXNldChkcywgc3R5bGVzLCBvcHRzKTtcclxuICAgIH0qL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydCgnLi9TdHlsZScpLlN0eWxlPn0gc3R5bGVzXHJcbiAgICAgKiBAcGFyYW0ge3t2aXNpYmxlPzpib29sZWFuLG1pblpvb20/Om51bWJlcixtYXhab29tPzpudW1iZXIscGl4TmI/Om51bWJlcixjZWxsSW5mb0hUTUw/OmZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6c3RyaW5nLCBwcmVwcm9jZXNzPzpmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwpOmJvb2xlYW59fSBvcHRzXHJcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cclxuICAgICAqL1xyXG4gICAgYWRkVGlsZWRHcmlkTGF5ZXIodXJsLCBzdHlsZXMsIG9wdHMpIHtcclxuICAgICAgICBjb25zdCBkcyA9IHRoaXMubWFrZVRpbGVkR3JpZERhdGFzZXQodXJsLCBvcHRzKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZExheWVyRnJvbURhdGFzZXQoZHMsIHN0eWxlcywgb3B0cylcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIGxheWVyIGZyb20gYSBDU1YgZ3JpZCBkYXRhc2V0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHJlc29sdXRpb25zXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfSByZXNUb1VSTFxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KCcuL1N0eWxlJykuU3R5bGU+fSBzdHlsZXMgVGhlIHN0eWxlcywgb3JkZXJlZCBpbiBkcmF3aW5nIG9yZGVyLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3Q9fSBvcHRzIFRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBkYXRhc2V0IGFuZCBsYXllci5cclxuICAgICAqIEByZXR1cm5zIHt0aGlzfVxyXG4gICAgICovXHJcbiAgICBhZGRNdWx0aVNjYWxlQ1NWR3JpZExheWVyKHJlc29sdXRpb25zLCByZXNUb1VSTCwgc3R5bGVzLCBvcHRzKSB7XHJcbiAgICAgICAgY29uc3QgZHMgPSB0aGlzLm1ha2VNdWx0aVNjYWxlQ1NWR3JpZERhdGFzZXQocmVzb2x1dGlvbnMsIHJlc1RvVVJMLCBvcHRzKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZExheWVyRnJvbURhdGFzZXQoZHMsIHN0eWxlcywgb3B0cylcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIGxheWVyIGZyb20gYSBwYXJxdWV0IGdyaWQgZGF0YXNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSByZXNvbHV0aW9uc1xyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihudW1iZXIpOnN0cmluZ30gcmVzVG9VUkxcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydCgnLi9TdHlsZScpLlN0eWxlPn0gc3R5bGVzIFRoZSBzdHlsZXMsIG9yZGVyZWQgaW4gZHJhd2luZyBvcmRlci5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0cyBUaGUgcGFyYW1ldGVycyBvZiB0aGUgZGF0YXNldCBhbmQgbGF5ZXIuXHJcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cclxuICAgICAqL1xyXG4gICAgLyphZGRNdWx0aVNjYWxlUGFycXVldEdyaWRMYXllcihyZXNvbHV0aW9ucywgcmVzVG9VUkwsIHN0eWxlcywgb3B0cykge1xyXG4gICAgICAgIGNvbnN0IGRzID0gdGhpcy5tYWtlTXVsdGlTY2FsZVBhcnF1ZXRHcmlkRGF0YXNldChyZXNvbHV0aW9ucywgcmVzVG9VUkwsIG9wdHMpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkTGF5ZXJGcm9tRGF0YXNldChkcywgc3R5bGVzLCBvcHRzKTtcclxuICAgIH0qL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gcmVzb2x1dGlvbnNcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9IHJlc1RvVVJMXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4vU3R5bGUnKS5TdHlsZT59IHN0eWxlc1xyXG4gICAgICogQHBhcmFtIHt7dmlzaWJsZT86Ym9vbGVhbixtaW5ab29tPzpudW1iZXIsbWF4Wm9vbT86bnVtYmVyLHBpeE5iPzpudW1iZXIsY2VsbEluZm9IVE1MPzpmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwpOnN0cmluZywgcHJlcHJvY2Vzcz86ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsKTpib29sZWFufX0gb3B0c1xyXG4gICAgICogQHJldHVybnMge3RoaXN9XHJcbiAgICAgKi9cclxuICAgIGFkZE11bHRpU2NhbGVUaWxlZEdyaWRMYXllcihyZXNvbHV0aW9ucywgcmVzVG9VUkwsIHN0eWxlcywgb3B0cykge1xyXG4gICAgICAgIGNvbnN0IGRzID0gdGhpcy5tYWtlTXVsdGlTY2FsZVRpbGVkR3JpZERhdGFzZXQocmVzb2x1dGlvbnMsIHJlc1RvVVJMLCBvcHRzKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZExheWVyRnJvbURhdGFzZXQoZHMsIHN0eWxlcywgb3B0cylcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIGJhY2tncm91bmQgbGF5ZXIgdG8gdGhlIGFwcC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICogQHJldHVybnMge3RoaXN9XHJcbiAgICAgKi9cclxuICAgIGFkZEJhY2tncm91bmRMYXllcihvcHRzKSB7XHJcbiAgICAgICAgdGhpcy5iZ0xheWVycy5wdXNoKG5ldyBCYWNrZ3JvdW5kTGF5ZXIob3B0cykpXHJcbiAgICAgICAgdGhpcy5yZWRyYXcoKVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYSBXTVMgYmFja2dyb3VuZCBsYXllciB0byB0aGUgYXBwLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cclxuICAgICAqL1xyXG4gICAgYWRkQmFja2dyb3VuZExheWVyV01TKG9wdHMpIHtcclxuICAgICAgICB0aGlzLmJnTGF5ZXJzLnB1c2gobmV3IEJhY2tncm91bmRMYXllcldNUyhvcHRzKSlcclxuICAgICAgICB0aGlzLnJlZHJhdygpXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWRcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cclxuICAgICAqL1xyXG4gICAgYWRkWm9vbVNsaWRlcihpZCwgb3B0cykge1xyXG4gICAgICAgIHRoaXMuY2cuYWRkWm9vbVNsaWRlcihpZCwgb3B0cylcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcmV0dXJucyB7dGhpc30gKi9cclxuICAgIHNldFZpZXdGcm9tVVJMKCkge1xyXG4gICAgICAgIHRoaXMuY2cuc2V0Vmlld0Zyb21VUkwoKVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWRkIGEgcmVzaXplIGV2ZW50IG9ic2VydmVyIHRvIHRoZSBBcHBzIGNvbnRhaW5lciBhbmQgdXBkYXRlIHRoZSBjYW52YXMgYWNjb3JkaW5nbHlcclxuICAgICAqIEBwYXJhbSB7SFRNTERpdkVsZW1lbnR9IGNvbnRhaW5lciBUaGUgQXBwJ3MgY29udGFpbmVyIGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhcyBUaGUgQXBwIGNhbnZhcyBlbGVtZW50XHJcbiAgICAgKiBAbWVtYmVyb2YgQXBwXHJcbiAgICAgKi9cclxuICAgIGRlZmluZVJlc2l6ZU9ic2VydmVyKGNvbnRhaW5lciwgY2FudmFzKSB7XHJcbiAgICAgICAgLy8gbGlzdGVuIHRvIHJlc2l6ZSBldmVudHNcclxuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xyXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgY2FudmFzIGhhcyBiZWVuIGJ1aWx0XHJcbiAgICAgICAgICAgIGlmIChjb250YWluZXIuY2xpZW50V2lkdGggPiAwICYmIGNvbnRhaW5lci5jbGllbnRIZWlnaHQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZG9udCBleGNlZWQgbG9vcCBsaW1pdCBmaXJzdFxyXG4gICAgICAgICAgICAgICAgLy8gc2VlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80OTM4NDEyMC9yZXNpemVvYnNlcnZlci1sb29wLWxpbWl0LWV4Y2VlZGVkXHJcbiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZW50cmllcykgfHwgIWVudHJpZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGFwcCBhbmQgY2FudmFzIHNpemVcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oICE9PSBjb250YWluZXIuY2xpZW50SGVpZ2h0IHx8IHRoaXMudyAhPT0gY29udGFpbmVyLmNsaWVudFdpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53ID0gY29udGFpbmVyLmNsaWVudFdpZHRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2cuaCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZy53ID0gY29udGFpbmVyLmNsaWVudFdpZHRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJycgKyB0aGlzLncpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZHJhdygpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyKVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuLyoqXHJcbiAqXHJcbiAqIEEgbWFwIGJhY2tncm91bmQgbGF5ZXIgaW4gXCJTbGlwcHkgbWFwXCIgWFlaIHN0YW5kYXJkLlxyXG4gKiBTZWUgaHR0cHM6Ly93aWtpLm9wZW5zdHJlZXRtYXAub3JnL3dpa2kvU2xpcHB5X21hcF90aWxlbmFtZXNcclxuICogaHR0cHM6Ly93d3cubWFwdGlsZXIuY29tL2dvb2dsZS1tYXBzLWNvb3JkaW5hdGVzLXRpbGUtYm91bmRzLXByb2plY3Rpb24vIzYvMjcuODgvNDQuNDhcclxuICogXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBCYWNrZ3JvdW5kTGF5ZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIEFuIGF0dHJpYnV0ZSB0byBzcGVjaWZ5IGlmIGEgbGF5ZXIgc2hvdWxkIGJlIGRyYXduIG9yIG5vdFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufSAqL1xyXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IG9wdHMudmlzaWJsZSA9PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZVxyXG5cclxuICAgICAgICAvKiogVGhlIG1pbmltdW0gem9vbSBmYWN0b3I6IEJlbG93IHRoaXMgbGV2ZWwsIHRoZSBsYXllciBpcyBub3Qgc2hvd24uXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLm1pblpvb20gPSBvcHRzLm1pblpvb20gfHwgMFxyXG5cclxuICAgICAgICAvKiogVGhlIG1heGltdW0gem9vbSBmYWN0b3I6IEFib3ZlIHRoaXMgbGV2ZWwsIHRoZSBsYXllciBpcyBub3Qgc2hvd24uXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLm1heFpvb20gPSBvcHRzLm1heFpvb20gfHwgSW5maW5pdHlcclxuXHJcbiAgICAgICAgLy9lbnN1cmUgYWNjZXB0YWJsZSB2YWx1ZXMgZm9yIHRoZSB6b29tIGxpbWl0cy5cclxuICAgICAgICBpZiAodGhpcy5taW5ab29tID49IHRoaXMubWF4Wm9vbSlcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHpvb20gbGltaXRzIGZvciBsYXllci4gWm9vbSBtaW4gc2hvdWxkIGJlIHNtYWxsZXIgdGhhbiB6b29tIG1heC4nKVxyXG5cclxuICAgICAgICAvKiogVGhlIGltYWdlIGNhY2hlLCBpbmRleGVkIGJ5IHoveS94ICovXHJcbiAgICAgICAgdGhpcy5jYWNoZSA9IHt9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy51cmwgPSBvcHRzLnVybFxyXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnVybEZ1biA9IG9wdHMudXJsRnVuIHx8ICgoeCwgeSwgeikgPT4gdGhpcy51cmwgKyB6ICsgJy8nICsgeCArICcvJyArIHkgKyAnLnBuZycpXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXHJcbiAgICAgICAgdGhpcy5yZXNvbHV0aW9ucyA9IG9wdHMucmVzb2x1dGlvbnNcclxuICAgICAgICBpZiAoIXRoaXMucmVzb2x1dGlvbnMgfHwgdGhpcy5yZXNvbHV0aW9ucy5sZW5ndGggPT0gMClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyByZXNvbHV0aW9ucyBwcm92aWRlZCBmb3IgYmFja2dyb3VuZCBsYXllcicpXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMubmJQaXggPSBvcHRzLm5iUGl4IHx8IDI1NlxyXG4gICAgICAgIC8qKiBDUlMgY29vcmRpbmF0ZXMgb2YgdG9wIGxlZnQgY29ybmVyXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxudW1iZXI+fSAqL1xyXG4gICAgICAgIHRoaXMub3JpZ2luID0gb3B0cy5vcmlnaW4gfHwgWzAsIDBdXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy56MCA9IG9wdHMuejAgfHwgMFxyXG5cclxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuZmlsdGVyQ29sb3IgPSBvcHRzLmZpbHRlckNvbG9yIC8vICh6ZikgPT4gXCIjZWVlN1wiXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgei94L3kgY2FjaGUgZGF0YS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlcclxuICAgICAqIEByZXR1cm5zIHtIVE1MSW1hZ2VFbGVtZW50fHN0cmluZ3x1bmRlZmluZWR9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBnZXQoeiwgeCwgeSkge1xyXG4gICAgICAgIGxldCBkID0gdGhpcy5jYWNoZVt6XVxyXG4gICAgICAgIGlmICghZCkgcmV0dXJuXHJcbiAgICAgICAgZCA9IGRbeF1cclxuICAgICAgICBpZiAoIWQpIHJldHVyblxyXG4gICAgICAgIHJldHVybiBkW3ldXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgei94L3kgY2FjaGUgZGF0YS5cclxuICAgICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudHxzdHJpbmd9IGltZ1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geVxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHB1dChpbWcsIHosIHgsIHkpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbel0pIHRoaXMuY2FjaGVbel0gPSB7fVxyXG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt6XVt4XSkgdGhpcy5jYWNoZVt6XVt4XSA9IHt9XHJcbiAgICAgICAgdGhpcy5jYWNoZVt6XVt4XVt5XSA9IGltZ1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgZHJhdyhjZykge1xyXG4gICAgICAgIGlmICghdGhpcy5yZXNvbHV0aW9ucyB8fCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHJlc29sdXRpb25zIHByb3ZpZGVkIGZvciBiYWNrZ3JvdW5kIGxheWVyJylcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxyXG4gICAgICAgIGNvbnN0IHgwID0gdGhpcy5vcmlnaW5bMF0sXHJcbiAgICAgICAgICAgIHkwID0gdGhpcy5vcmlnaW5bMV1cclxuXHJcbiAgICAgICAgLy9nZXQgem9vbSBsZXZlbCBhbmQgcmVzb2x1dGlvblxyXG4gICAgICAgIGxldCB6ID0gMFxyXG4gICAgICAgIGZvciAoeiA9IDA7IHogPCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aDsgeisrKSBpZiAodGhpcy5yZXNvbHV0aW9uc1t6XSA8IHpmKSBicmVha1xyXG4gICAgICAgIHogLT0gMVxyXG4gICAgICAgIHogPSBNYXRoLm1heCgwLCB6KVxyXG4gICAgICAgIHogPSBNYXRoLm1pbih6LCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aCAtIDEpXHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLnJlc29sdXRpb25zLmxlbmd0aCwgeilcclxuICAgICAgICBjb25zdCByZXMgPSB0aGlzLnJlc29sdXRpb25zW3pdXHJcblxyXG4gICAgICAgIHogKz0gdGhpcy56MFxyXG5cclxuICAgICAgICBjb25zdCBzaXplRyA9IHRoaXMubmJQaXggKiByZXNcclxuICAgICAgICBjb25zdCBzaXplID0gc2l6ZUcgLyB6ZlxyXG5cclxuICAgICAgICAvL2dldCB0aWxlIG51bWJlcnNcclxuICAgICAgICBjb25zdCB4R2VvVG9UTVMgPSAoeCkgPT4gTWF0aC5jZWlsKCh4IC0geDApIC8gc2l6ZUcpXHJcbiAgICAgICAgY29uc3QgeUdlb1RvVE1TID0gKHkpID0+IE1hdGguY2VpbCgtKHkgLSB5MCkgLyBzaXplRylcclxuICAgICAgICBjb25zdCB4TWluID0geEdlb1RvVE1TKGNnLmV4dEdlby54TWluKSAtIDFcclxuICAgICAgICBjb25zdCB4TWF4ID0geEdlb1RvVE1TKGNnLmV4dEdlby54TWF4KVxyXG4gICAgICAgIGNvbnN0IHlNYXggPSB5R2VvVG9UTVMoY2cuZXh0R2VvLnlNaW4pXHJcbiAgICAgICAgY29uc3QgeU1pbiA9IHlHZW9Ub1RNUyhjZy5leHRHZW8ueU1heCkgLSAxXHJcblxyXG4gICAgICAgIC8vVE9ETyA/XHJcbiAgICAgICAgLy9jZy5zZXRDYW52YXNUcmFuc2Zvcm0oKVxyXG5cclxuICAgICAgICAvL2hhbmRsZSBpbWFnZXNcclxuICAgICAgICBmb3IgKGxldCB4ID0geE1pbjsgeCA8IHhNYXg7IHgrKykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCB5ID0geU1pbjsgeSA8IHlNYXg7IHkrKykge1xyXG4gICAgICAgICAgICAgICAgLy9nZXQgaW1hZ2VcclxuICAgICAgICAgICAgICAgIGxldCBpbWcgPSB0aGlzLmdldCh6LCB4LCB5KVxyXG5cclxuICAgICAgICAgICAgICAgIC8vbG9hZCBpbWFnZVxyXG4gICAgICAgICAgICAgICAgaWYgKCFpbWcpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHV0KGltZywgeiwgeCwgeSlcclxuICAgICAgICAgICAgICAgICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5yZWRyYXcoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpbWcub25lcnJvciA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXQoJ2ZhaWxlZCcsIHosIHgsIHkpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGltZy5zcmMgPSB0aGlzLnVybEZ1bih4LCB5LCB6KVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcclxuICAgICAgICAgICAgICAgIGlmIChpbWcgPT09ICdmYWlsZWQnKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgaWYgKCEoaW1nIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhpbWcpXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChpbWcud2lkdGggPT0gMCB8fCBpbWcuaGVpZ2h0ID09IDApIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAgICAgLy9kcmF3IGltYWdlXHJcbiAgICAgICAgICAgICAgICBjb25zdCB4R2VvID0geDAgKyB4ICogc2l6ZUdcclxuICAgICAgICAgICAgICAgIGNvbnN0IHlHZW8gPSB5MCAtIHkgKiBzaXplR1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHguZHJhd0ltYWdlKGltZywgY2cuZ2VvVG9QaXhYKHhHZW8pLCBjZy5nZW9Ub1BpeFkoeUdlbyksIHNpemUsIHNpemUpXHJcbiAgICAgICAgICAgICAgICAgICAgLy9jZy5jdHguZHJhd0ltYWdlKGltZywgeEdlbywgeUdlbywgc2l6ZUcsIC1zaXplRylcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9hcHBseSBmaWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJDb2xvcikge1xyXG4gICAgICAgICAgICBjb25zdCBmYyA9IHRoaXMuZmlsdGVyQ29sb3IoemYpXHJcbiAgICAgICAgICAgIGlmIChmYyAmJiBmYyAhPSAnbm9uZScpIHtcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsU3R5bGUgPSBmY1xyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KDAsIDAsIGNnLncsIGNnLmgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG4vKipcclxuICpcclxuICogQSBtYXAgV01TIGJhY2tncm91bmQgbGF5ZXIuXHJcbiAqIFxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQmFja2dyb3VuZExheWVyV01TIHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBBbiBhdHRyaWJ1dGUgdG8gc3BlY2lmeSBpZiBhIGxheWVyIHNob3VsZCBiZSBkcmF3biBvciBub3RcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gKi9cclxuICAgICAgICB0aGlzLnZpc2libGUgPSBvcHRzLnZpc2libGUgPT0gZmFsc2UgPyBmYWxzZSA6IHRydWVcclxuXHJcbiAgICAgICAgLyoqIFRoZSBtaW5pbXVtIHpvb20gZmFjdG9yOiBCZWxvdyB0aGlzIGxldmVsLCB0aGUgbGF5ZXIgaXMgbm90IHNob3duLlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5taW5ab29tID0gb3B0cy5taW5ab29tIHx8IDBcclxuXHJcbiAgICAgICAgLyoqIFRoZSBtYXhpbXVtIHpvb20gZmFjdG9yOiBBYm92ZSB0aGlzIGxldmVsLCB0aGUgbGF5ZXIgaXMgbm90IHNob3duLlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5tYXhab29tID0gb3B0cy5tYXhab29tIHx8IEluZmluaXR5XHJcblxyXG4gICAgICAgIC8vZW5zdXJlIGFjY2VwdGFibGUgdmFsdWVzIGZvciB0aGUgem9vbSBsaW1pdHMuXHJcbiAgICAgICAgaWYgKHRoaXMubWluWm9vbSA+PSB0aGlzLm1heFpvb20pXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCB6b29tIGxpbWl0cyBmb3IgbGF5ZXIuIFpvb20gbWluIHNob3VsZCBiZSBzbWFsbGVyIHRoYW4gem9vbSBtYXguJylcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnVybCA9IG9wdHMudXJsXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5maWx0ZXJDb2xvciA9IG9wdHMuZmlsdGVyQ29sb3IgLy8gKHpmKSA9PiBcIiNlZWU3XCJcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MSW1hZ2VFbGVtZW50fHVuZGVmaW5lZH0gKi9cclxuICAgICAgICB0aGlzLmltZyA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMueE1pbiA9IHVuZGVmaW5lZDtcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgdGhpcy54TWF4ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICB0aGlzLnlNaW4gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMueU1heCA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ2hlY2sgaWYgdGhlIHZpZXcgaGFzIG1vdmVkIGFuZCBhIG5ldyBpbWFnZSBuZWVkcyB0byBiZSByZXRyaWV2ZWQuXHJcbiAgICAgKiBAcHJpdmF0ZSAqL1xyXG4gICAgaGFzTW92ZWQoZXh0R2VvKSB7XHJcbiAgICAgICAgaWYgKChleHRHZW8ueE1pbikgIT0gdGhpcy54TWluKSByZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGVsc2UgaWYgKChleHRHZW8ueE1heCkgIT0gdGhpcy54TWF4KSByZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGVsc2UgaWYgKChleHRHZW8ueU1pbikgIT0gdGhpcy55TWluKSByZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGVsc2UgaWYgKChleHRHZW8ueU1heCkgIT0gdGhpcy55TWF4KSByZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgZHJhdyhjZykge1xyXG5cclxuICAgICAgICAvL3VwZGF0ZSBtYXAgZXh0ZW50XHJcbiAgICAgICAgY2cudXBkYXRlRXh0ZW50R2VvKDApXHJcblxyXG4gICAgICAgIGlmICghdGhpcy5oYXNNb3ZlZChjZy5leHRHZW8pICYmIHRoaXMuaW1nKSB7XHJcbiAgICAgICAgICAgIC8vdGhlIG1hcCBkaWQgbm90IG1vdmUgYW5kIHRoZSBpbWFnZSB3YXMgYWxyZWFkeSBkb3dubG9hZGVkOiBkcmF3IHRoZSBpbWFnZVxyXG4gICAgICAgICAgICBjZy5jdHguZHJhd0ltYWdlKHRoaXMuaW1nLCAwLCAwLCBjZy53LCBjZy5oKVxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvL3RoZSBtYXAgbW92ZWQ6IHJldHJpZXZlIG5ldyBpbWFnZVxyXG5cclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgdGhpcy54TWluID0gY2cuZXh0R2VvLnhNaW5cclxuICAgICAgICAgICAgdGhpcy54TWF4ID0gY2cuZXh0R2VvLnhNYXhcclxuICAgICAgICAgICAgdGhpcy55TWluID0gY2cuZXh0R2VvLnlNaW5cclxuICAgICAgICAgICAgdGhpcy55TWF4ID0gY2cuZXh0R2VvLnlNYXhcclxuXHJcbiAgICAgICAgICAgIC8vYnVpbGQgV01TIFVSTFxyXG4gICAgICAgICAgICBjb25zdCB1cmwgPSBbXVxyXG4gICAgICAgICAgICB1cmwucHVzaCh0aGlzLnVybClcclxuICAgICAgICAgICAgdXJsLnB1c2goXCImd2lkdGg9XCIpXHJcbiAgICAgICAgICAgIHVybC5wdXNoKGNnLncpXHJcbiAgICAgICAgICAgIHVybC5wdXNoKFwiJmhlaWdodD1cIilcclxuICAgICAgICAgICAgdXJsLnB1c2goY2cuaClcclxuICAgICAgICAgICAgLy9iYm94OiB4bWluIHltaW4geG1heCB5bWF4XHJcbiAgICAgICAgICAgIHVybC5wdXNoKFwiJmJib3g9XCIpXHJcbiAgICAgICAgICAgIHVybC5wdXNoKGNnLmV4dEdlby54TWluKVxyXG4gICAgICAgICAgICB1cmwucHVzaChcIixcIilcclxuICAgICAgICAgICAgdXJsLnB1c2goY2cuZXh0R2VvLnlNaW4pXHJcbiAgICAgICAgICAgIHVybC5wdXNoKFwiLFwiKVxyXG4gICAgICAgICAgICB1cmwucHVzaChjZy5leHRHZW8ueE1heClcclxuICAgICAgICAgICAgdXJsLnB1c2goXCIsXCIpXHJcbiAgICAgICAgICAgIHVybC5wdXNoKGNnLmV4dEdlby55TWF4KVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdXJsUyA9IHVybC5qb2luKFwiXCIpXHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2codXJsUylcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbWcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW1nID0gbmV3IEltYWdlKClcclxuICAgICAgICAgICAgICAgIHRoaXMuaW1nLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjZy5yZWRyYXcoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbWcub25lcnJvciA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvL2Nhc2Ugd2hlbiBubyBpbWFnZVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkNvdWxkIG5vdCByZXRyaWV2ZSBXTVMgYmFja2dyb3VuZCBpbWFnZSBmcm9tXCIsIHVybFMpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vc2V0IFVSTCB0byBsYXVuY2ggdGhlIGRvd25sb2FkXHJcbiAgICAgICAgICAgIHRoaXMuaW1nLnNyYyA9IHVybFNcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vYXBwbHkgZmlsdGVyXHJcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyQ29sb3IpIHtcclxuICAgICAgICAgICAgY29uc3QgZmMgPSB0aGlzLmZpbHRlckNvbG9yKHpmKVxyXG4gICAgICAgICAgICBpZiAoZmMgJiYgZmMgIT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gZmNcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsUmVjdCgwLCAwLCBjZy53LCBjZy5oKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuLyoqXHJcbiAqIEEgZ3JpZCBjZWxsLlxyXG4gKiBAdHlwZWRlZiB7e3g6IG51bWJlciwgeTogbnVtYmVyfX0gQ2VsbCAqL1xyXG4vKipcclxuICogQW4gZW52ZWxvcGUuXHJcbiAqIEB0eXBlZGVmIHsge3hNaW46IG51bWJlciwgeE1heDogbnVtYmVyLCB5TWluOiBudW1iZXIsIHlNYXg6IG51bWJlcn0gfSBFbnZlbG9wZSAqL1xyXG5cclxuLyoqXHJcbiAqIEEgbXVsdGkgcmVzb2x1dGlvbiBkYXRhc2V0IG9mIGdyaWQgY2VsbHMuXHJcbiAqIEl0IGNvbnNpc3RzIG9mIGRpZmZlcmVudCB7QGxpbmsgRGF0YXNldENvbXBvbmVudH1zIGZvciBlYWNoIHJlc29sdXRpb24uXHJcbiAqXHJcbiAqIEBhYnN0cmFjdFxyXG4gKlxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGF0YXNldCB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4vRGF0YXNldENvbXBvbmVudFwiKS5EYXRhc2V0Q29tcG9uZW50Pn0gZGF0YXNldENvbXBvbmVudHMgVGhlIGRhdGFzZXQgY29tcG9uZW50c1xyXG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gcmVzb2x1dGlvbnMgVGhlIHJlc29sdXRpb25zIG9mIHRoZSBkYXRhc2V0IGNvbXBvbmVudHMsIGluIENSUyBnZW9ncmFwaGljYWwgdW5pdFxyXG4gICAgICogQHBhcmFtIHsge3ByZXByb2Nlc3M/OmZ1bmN0aW9uKENlbGwpOmJvb2xlYW59IH0gb3B0cyBPcHRpb25zLiBwcmVwcm9jZXNzOiBBIGZ1bmN0aW9uIHRvIGFwcGx5IG9uIGVhY2ggZGF0YXNldCBjZWxsIHRvIHByZXBhcmUgaXRzIHZhbHVlcy4gQ2FuIGJlIHVzZWQgYWxzbyB0byBzZWxlY3QgY2VsbHMgdG8ga2VlcC5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoZGF0YXNldENvbXBvbmVudHMsIHJlc29sdXRpb25zLCBvcHRzID0ge30pIHtcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogVGhlIGRhdGFzZXQgY29tcG9uZW50cy5cclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4vRGF0YXNldENvbXBvbmVudFwiKS5EYXRhc2V0Q29tcG9uZW50Pn0gKi9cclxuICAgICAgICB0aGlzLmRhdGFzZXRDb21wb25lbnRzID0gZGF0YXNldENvbXBvbmVudHNcclxuXHJcbiAgICAgICAgLyoqIFRoZSByZXNvbHV0aW9ucyBvZiB0aGUgZGF0YXNldCBjb21wb25lbnRzLCBpbiBDUlMgZ2VvZ3JhcGhpY2FsIHVuaXQuXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxudW1iZXI+fSAqL1xyXG4gICAgICAgIHRoaXMucmVzb2x1dGlvbnMgPSByZXNvbHV0aW9uc1xyXG5cclxuICAgICAgICAvL3RoZXJlIG11c3QgYmUgYXMgbWFueSBkYXRhc2V0IGNvbXBvbmVudHMgYXMgcmVzb2x1dGlvbnNcclxuICAgICAgICBpZiAodGhpcy5kYXRhc2V0Q29tcG9uZW50cy5sZW5ndGggPiAxICYmIHRoaXMuZGF0YXNldENvbXBvbmVudHMubGVuZ3RoICE9IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICAnVW5jb21wYXRpYmxlIG51bWJlciBvZiBkYXRhc2V0cyBhbmQgcmVzb2x1dGlvbnM6ICcgK1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNldENvbXBvbmVudHMubGVuZ3RoICtcclxuICAgICAgICAgICAgICAgICAgICAnICcgK1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoXHJcbiAgICAgICAgICAgIClcclxuXHJcbiAgICAgICAgLy9zZXQgZGF0YXNldCBwcmVwcm9jZXNzZXMgaWYgc3BlY2lmaWVkXHJcbiAgICAgICAgaWYgKG9wdHMucHJlcHJvY2VzcykgdGhpcy5zZXRQcmVwb2Nlc3NlcyhvcHRzLnByZXByb2Nlc3MpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgYSBwcmVwcm9jZXNzIGZ1bmN0aW9uIGZvciBhbGwgZGF0YXNldCBjb21wb25lbnRzLlxyXG4gICAgICogVGhpcyBpcyBhIGZ1bmN0aW9uIGFwcGxpZWQgb24gZWFjaCBjZWxsIGFmdGVyIGl0IGhhcyBiZWVuIGxvYWRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKENlbGwpOmJvb2xlYW59IHByZXByb2Nlc3NcclxuICAgICAqIEByZXR1cm5zIHt0aGlzfVxyXG4gICAgICovXHJcbiAgICBzZXRQcmVwb2Nlc3NlcyhwcmVwcm9jZXNzKSB7XHJcbiAgICAgICAgZm9yIChsZXQgZHMgb2YgdGhpcy5kYXRhc2V0Q29tcG9uZW50cykgZHMucHJlcHJvY2VzcyA9IHByZXByb2Nlc3NcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBmdW5jdGlvbiB0byBlYXNlIHRoZSBjcmVhdGlvbiBvZiBkYXRhc2V0cyBmcm9tIHRoZWlyIGNvbXBvbmVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gcmVzb2x1dGlvbnMgVGhlIHJlc29sdXRpb25zIG9mIHRoZSBkYXRhc2V0IGNvbXBvbmVudHMsIGluIENSUyBnZW9ncmFwaGljYWwgdW5pdFxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihudW1iZXIpOmltcG9ydChcIi4vRGF0YXNldENvbXBvbmVudFwiKS5EYXRhc2V0Q29tcG9uZW50fSByZXNUb0RhdGFzZXRDb21wb25lbnQgRnVuY3Rpb24gcmV0dXJuaW5nIGEgZGF0YXNldCBjb21wb25lbnQgZnJvbSBhIHJlc29sdXRpb25cclxuICAgICAqIEBwYXJhbSB7IHtwcmVwcm9jZXNzPzpmdW5jdGlvbihDZWxsKTpib29sZWFufSB9IG9wdHMgT3B0aW9ucy4gcHJlcHJvY2VzczogQSBmdW5jdGlvbiB0byBhcHBseSBvbiBlYWNoIGRhdGFzZXQgY2VsbCB0byBwcmVwYXJlIGl0cyB2YWx1ZXNcclxuICAgICAqIEByZXR1cm5zIHtEYXRhc2V0fVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgbWFrZShyZXNvbHV0aW9ucywgcmVzVG9EYXRhc2V0Q29tcG9uZW50LCBvcHRzKSB7XHJcbiAgICAgICAgLy9tYWtlIGRhdGFzZXQgY29tcG9uZW50c1xyXG4gICAgICAgIGNvbnN0IGRzYyA9IFtdXHJcbiAgICAgICAgZm9yIChjb25zdCByZXMgb2YgcmVzb2x1dGlvbnMpIGRzYy5wdXNoKHJlc1RvRGF0YXNldENvbXBvbmVudChyZXMpKVxyXG4gICAgICAgIC8vbWFrZSBkYXRhc2V0XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhc2V0KGRzYywgcmVzb2x1dGlvbnMsIG9wdHMpXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG4vKiogQHR5cGVkZWYge1wiQ1NWXCJ8XCJQQVJRVUVUXCJ9IEZvcm1hdCAqL1xyXG5cclxuLyoqXHJcbiAqIEEgZGF0YXNldCBjb21wb25lbnQsIG9mIGdyaWQgY2VsbHMuXHJcbiAqIEBhYnN0cmFjdFxyXG4gKlxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGF0YXNldENvbXBvbmVudCB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCBvZiB0aGUgZGF0YXNldC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZSBkYXRhc2V0IHJlc29sdXRpb24sIGluIHRoZSBDUlMgZ2VvZ3JhcGhpY2FsIHVuaXQuXHJcbiAgICAgKiBAcGFyYW0ge3twcmVwcm9jZXNzPzpmdW5jdGlvbihpbXBvcnQoXCIuL0RhdGFzZXRcIikuQ2VsbCk6Ym9vbGVhbn19IG9wdHNcclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3Rvcih1cmwsIHJlc29sdXRpb24sIG9wdHMgPSB7fSkge1xyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB1cmwgb2YgdGhlIGRhdGFzZXQuXHJcbiAgICAgICAgICogQHByb3RlY3RlZFxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy51cmwgPSB1cmxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRhdGFzZXQgcmVzb2x1dGlvbiBpbiBnZW9ncmFwaGljYWwgdW5pdC5cclxuICAgICAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnJlc29sdXRpb24gPSByZXNvbHV0aW9uXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcHJlcHJvY2VzcyB0byBydW4gb24gZWFjaCBjZWxsIGFmdGVyIGxvYWRpbmcuIEl0IGNhbiBiZSB1c2VkIHRvIGFwcGx5IHNvbWUgc3BlY2lmaWMgdHJlYXRtZW50IGJlZm9yZSBvciBjb21wdXRlIGEgbmV3IGNvbHVtbi4gQW5kIGFsc28gdG8gZGV0ZXJtaW5lIHdoaWNoIGNlbGxzIHRvIGtlZXAgYWZ0ZXIgbG9hZGluZy5cclxuICAgICAgICAgKiBAdHlwZSB7KGZ1bmN0aW9uKGltcG9ydChcIi4vRGF0YXNldFwiKS5DZWxsKTpib29sZWFuICl8IHVuZGVmaW5lZCB9ICovXHJcbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzID0gb3B0cy5wcmVwcm9jZXNzIHx8IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICAvKiogVGhlIGNlbGxzIHdpdGhpbiB0aGUgdmlld1xyXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4vRGF0YXNldFwiKS5DZWxsPn0gKi9cclxuICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlID0gW11cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlcXVlc3QgZGF0YSB3aXRoaW4gYSBnZW9ncmFwaGljIGVudmVsb3BlLlxyXG4gICAgICpcclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0RhdGFzZXRcIikuRW52ZWxvcGV8dW5kZWZpbmVkfSBleHRHZW9cclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTp2b2lkfSBjYWxsYmFja1xyXG4gICAgICogQHJldHVybnMge3RoaXN9XHJcbiAgICAgKi9cclxuICAgIGdldERhdGEoZXh0R2VvLCBjYWxsYmFjaykge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIGdldERhdGEgbm90IGltcGxlbWVudGVkLicpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWxsIHRoZSB2aWV3IGNhY2hlIHdpdGggYWxsIGNlbGxzIHdoaWNoIGFyZSB3aXRoaW4gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXHJcbiAgICAgKiBAYWJzdHJhY3RcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkVudmVsb3BlfSBleHRHZW8gVGhlIHZpZXcgZ2VvZ3JhcGhpY2FsIGVudmVsb3BlLlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVZpZXdDYWNoZShleHRHZW8pIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCB1cGRhdGVWaWV3Q2FjaGUgbm90IGltcGxlbWVudGVkLicpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYSBjZWxsIHVuZGVyIGEgZ2l2ZW4gcG9zaXRpb24sIGlmIGFueS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3t4Om51bWJlcix5Om51bWJlcn19IHBvc0dlb1xyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxscyBTb21lIGNlbGxzIGZyb20gdGhlIGRhdGFzZXQgKGEgc3Vic2V0IGlmIG5lY2Vzc2FyeSwgdXN1YWxseSB0aGUgdmlldyBjYWNoZSkuXHJcbiAgICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGx8dW5kZWZpbmVkfVxyXG4gICAgICovXHJcbiAgICBnZXRDZWxsRnJvbVBvc2l0aW9uKHBvc0dlbywgY2VsbHMpIHtcclxuICAgICAgICAvL2NvbXB1dGUgY2FuZGlkYXRlIGNlbGwgcG9zaXRpb25cclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICBjb25zdCByID0gdGhpcy5nZXRSZXNvbHV0aW9uKClcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICBjb25zdCBjZWxsWCA9IHIgKiBNYXRoLmZsb29yKHBvc0dlby54IC8gcilcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICBjb25zdCBjZWxsWSA9IHIgKiBNYXRoLmZsb29yKHBvc0dlby55IC8gcilcclxuXHJcbiAgICAgICAgLy9nZXQgY2VsbFxyXG4gICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiBjZWxscykge1xyXG4gICAgICAgICAgICBpZiAoY2VsbC54ICE9IGNlbGxYKSBjb250aW51ZVxyXG4gICAgICAgICAgICBpZiAoY2VsbC55ICE9IGNlbGxZKSBjb250aW51ZVxyXG4gICAgICAgICAgICByZXR1cm4gY2VsbFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICB9XHJcblxyXG4gICAgLy9nZXR0ZXJzIGFuZCBzZXR0ZXJzXHJcblxyXG4gICAgLyoqIEByZXR1cm5zIHtudW1iZXJ9ICovXHJcbiAgICBnZXRSZXNvbHV0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlc29sdXRpb25cclxuICAgIH1cclxuXHJcbiAgICAvKiogQHJldHVybnMge0FycmF5LjxpbXBvcnQoXCIuL0RhdGFzZXRcIikuQ2VsbD59ICovXHJcbiAgICBnZXRWaWV3Q2FjaGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2VsbHNWaWV3Q2FjaGVcclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbi8qKiBAdHlwZWRlZiB7IHt4TWluOiBudW1iZXIsIHhNYXg6IG51bWJlciwgeU1pbjogbnVtYmVyLCB5TWF4OiBudW1iZXJ9IH0gRW52ZWxvcGUgKi9cclxuXHJcbmltcG9ydCB7IHNlbGVjdCB9IGZyb20gJ2QzLXNlbGVjdGlvbidcclxuaW1wb3J0IHsgem9vbSwgem9vbUlkZW50aXR5IH0gZnJvbSAnZDMtem9vbSdcclxuXHJcbi8qKlxyXG4gKiBBIEhUTUwgY2FudmFzIGZvciBnZW8gZGF0YSBkaXNwbGF5LCBlbmhhbmNlZCB3aXRoIHpvb20gYW5kIHBhbiBjYXBhYmlsaXRpZXMuXHJcbiAqXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBHZW9DYW52YXMge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAY29uc3RydWN0b3JcclxuICAgICAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhc1xyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGNlbnRlciBHZW9ncmFwaGljYWwgY29vcmRpbmF0ZXMgb2YgdGhlIGNlbnRlclxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpmIFRoZSB6b29tIGZhY3RvciAocGl4ZWwgc2l6ZSwgaW4gZ3JvdW5kIG0pXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihjYW52YXMsIGNlbnRlciwgemYsIG9wdHMpIHtcclxuICAgICAgICB0aGlzLm9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7SFRNTENhbnZhc0VsZW1lbnR9ICovXHJcbiAgICAgICAgdGhpcy5jYW52YXMgPSBjYW52YXNcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy53ID0gdGhpcy5jYW52YXMub2Zmc2V0V2lkdGhcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmggPSB0aGlzLmNhbnZhcy5vZmZzZXRIZWlnaHRcclxuXHJcbiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLndcclxuICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmhcclxuXHJcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxyXG4gICAgICAgIGlmICghY3R4KSB0aHJvdyAnSW1wb3NzaWJsZSB0byBjcmVhdGUgY2FudmFzIDJEIGNvbnRleHQnXHJcbiAgICAgICAgLyoqQHR5cGUge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gKi9cclxuICAgICAgICB0aGlzLmN0eCA9IGN0eFxyXG5cclxuICAgICAgICAvLyBzZXQgZ2VvIGNvb3JkaW5hdGVzIG9mIHRoZSBjZW50ZXJcclxuICAgICAgICB0aGlzLmNlbnRlciA9IGNlbnRlciB8fCB7IHg6IHRoaXMudyAqIDAuNSwgeTogdGhpcy5oICogMC41IH1cclxuXHJcbiAgICAgICAgLy8gem9vbSBmYWN0b3I6IHBpeGVsIHNpemUsIGluIG0vcGl4XHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy56ZiA9IHpmXHJcblxyXG4gICAgICAgIC8qKiBCYWNrZ3JvdW5kIGNvbG9yLlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBvcHRzLmJhY2tncm91bmRDb2xvciB8fCAnd2hpdGUnXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24oKTp2b2lkfSAqL1xyXG4gICAgICAgIHRoaXMub25ab29tU3RhcnRGdW4gPSBvcHRzLm9uWm9vbVN0YXJ0RnVuXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24oKTp2b2lkfSAqL1xyXG4gICAgICAgIHRoaXMub25ab29tRW5kRnVuID0gb3B0cy5vblpvb21FbmRGdW5cclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbigpOnZvaWR9ICovXHJcbiAgICAgICAgdGhpcy5vblpvb21GdW4gPSBvcHRzLm9uWm9vbUZ1blxyXG5cclxuICAgICAgICAvL2N1cnJlbnQgZXh0ZW50XHJcbiAgICAgICAgLyoqIEB0eXBlIHtFbnZlbG9wZX0gKi9cclxuICAgICAgICB0aGlzLmV4dEdlbyA9IHsgeE1pbjogTmFOLCB4TWF4OiBOYU4sIHlNaW46IE5hTiwgeU1heDogTmFOIH1cclxuICAgICAgICB0aGlzLnVwZGF0ZUV4dGVudEdlbygpXHJcblxyXG4gICAgICAgIC8vcmVseSBvbiBkMyB6b29tIGZvciBwYW4vem9vbVxyXG4gICAgICAgIGlmICghb3B0cy5kaXNhYmxlWm9vbSkge1xyXG4gICAgICAgICAgICBsZXQgdFAgPSB6b29tSWRlbnRpdHlcclxuICAgICAgICAgICAgY29uc3QgeiA9IHpvb20oKVxyXG4gICAgICAgICAgICAgICAgLy90byBtYWtlIHRoZSB6b29taW5nIGEgYml0IGZhc3RlclxyXG4gICAgICAgICAgICAgICAgLndoZWVsRGVsdGEoKGUpID0+IC1lLmRlbHRhWSAqIChlLmRlbHRhTW9kZSA9PT0gMSA/IDAuMDcgOiBlLmRlbHRhTW9kZSA/IDEgOiAwLjAwNCkpXHJcbiAgICAgICAgICAgICAgICAub24oJ3pvb20nLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlLnRyYW5zZm9ybVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGYgPSB0UC5rIC8gdC5rXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGYgPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeCA9IHRQLnggLSB0LnhcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHkgPSB0UC55IC0gdC55XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFuKGR4ICogdGhpcy5nZXRaZigpLCAtZHkgKiB0aGlzLmdldFpmKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2UgPSBlLnNvdXJjZUV2ZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZSBpbnN0YW5jZW9mIFdoZWVsRXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vem9vbSBhdCB0aGUgbW91c2UgcG9zaXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuem9vbShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGl4VG9HZW9YKGUuc291cmNlRXZlbnQub2Zmc2V0WCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waXhUb0dlb1koZS5zb3VyY2VFdmVudC5vZmZzZXRZKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlIGluc3RhbmNlb2YgVG91Y2hFdmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb21wdXRlIGF2ZXJhZ2UgcG9zaXRpb24gb2YgdGhlIHRvdWNoZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eCA9IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkgPSAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0dCBvZiBzZS50YXJnZXRUb3VjaGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggKz0gdHQuY2xpZW50WFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5ICs9IHR0LmNsaWVudFlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC89IHNlLnRhcmdldFRvdWNoZXMubGVuZ3RoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAvPSBzZS50YXJnZXRUb3VjaGVzLmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy96b29tIGF0IHRoaXMgYXZlcmFnZSBwb3NpdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56b29tKGYsIHRoaXMucGl4VG9HZW9YKHR4KSwgdGhpcy5waXhUb0dlb1kodHkpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRQID0gdFxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vblpvb21GdW4pIHRoaXMub25ab29tRnVuKGUpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLm9uKCdzdGFydCcsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5jLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuYy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5jLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKHRoaXMuY2FudmFzLCAwLCAwKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keCA9IDBcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHkgPSAwXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmYgPSAxXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uWm9vbVN0YXJ0RnVuKSB0aGlzLm9uWm9vbVN0YXJ0RnVuKGUpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLm9uKCdlbmQnLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVkcmF3KHRydWUpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlID0geyBjOiBudWxsLCBkeDogMCwgZHk6IDAsIGY6IDEgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vblpvb21FbmRGdW4pIHRoaXMub25ab29tRW5kRnVuKGUpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB6KHNlbGVjdCh0aGlzLmNhbnZhcykpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vc2VsZWN0KHRoaXMuY2FudmFzKS5jYWxsKHopO1xyXG5cclxuICAgICAgICAvKiogWm9vbSBleHRlbnQsIHRvIGxpbWl0IHpvb20gaW4gYW5kIG91dFxyXG4gICAgICAgICAqICBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXHJcbiAgICAgICAgdGhpcy56ZkV4dGVudCA9IFswLCBJbmZpbml0eV1cclxuXHJcbiAgICAgICAgLyoqIENhbnZhcyBzdGF0ZSwgdG8gYmUgdXNlZCB0byBhdm9pZCB1bm5lY2Vzc2FyeSByZWRyYXdzIG9uIHpvb20vcGFuXHJcbiAgICAgICAgICogIEB0eXBlIHt7YzpIVE1MQ2FudmFzRWxlbWVudHxudWxsLGR4Om51bWJlcixkeTpudW1iZXIsZjpudW1iZXJ9fSAqL1xyXG4gICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IHsgYzogbnVsbCwgZHg6IDAsIGR5OiAwLCBmOiAxIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQHBhcmFtIHt7eDpudW1iZXIseTpudW1iZXJ9fSB2IEdlb2dyYXBoaWNhbCBjb29yZGluYXRlcyBvZiB0aGUgY2VudGVyICovXHJcbiAgICBzZXRDZW50ZXIodikge1xyXG4gICAgICAgIHRoaXMuY2VudGVyID0gdlxyXG4gICAgfVxyXG4gICAgLyoqIEByZXR1cm5zIHt7eDpudW1iZXIseTpudW1iZXJ9fSBHZW9ncmFwaGljYWwgY29vcmRpbmF0ZXMgb2YgdGhlIGNlbnRlciAqL1xyXG4gICAgZ2V0Q2VudGVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNlbnRlclxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0ge251bWJlcn0gdiBUaGUgem9vbSBmYWN0b3IgKHBpeGVsIHNpemUsIGluIGdyb3VuZCBtKSAqL1xyXG4gICAgc2V0WmYodikge1xyXG4gICAgICAgIHRoaXMuemYgPSB2XHJcbiAgICAgICAgaWYgKHRoaXMuc2xpZGVyKSB0aGlzLnNsaWRlci5hdHRyKCd2YWx1ZScsICt0aGlzLnpmKVxyXG4gICAgfVxyXG4gICAgLyoqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB6b29tIGZhY3RvciAocGl4ZWwgc2l6ZSwgaW4gZ3JvdW5kIG0pICovXHJcbiAgICBnZXRaZigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy56ZlxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSB2ICovXHJcbiAgICBzZXRaZkV4dGVudCh2KSB7XHJcbiAgICAgICAgdGhpcy56ZkV4dGVudCA9IHZcclxuICAgIH1cclxuICAgIC8qKiBAcmV0dXJucyB7QXJyYXkuPG51bWJlcj59ICovXHJcbiAgICBnZXRaZkV4dGVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy56ZkV4dGVudFxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBJbml0aWFsaXNlIGNhbnZhcyB0cmFuc2Zvcm0gd2l0aCBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbi4gKi9cclxuICAgIGluaXRDYW52YXNUcmFuc2Zvcm0oKSB7XHJcbiAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEluaXRpYWxpc2UgY2FudmFzIHRyYW5zZm9ybSB3aXRoIGdlbyB0byBzY3JlZW4gdHJhbnNmb3JtYXRpb24sIHNvIHRoYXQgZ2VvIG9iamVjdHMgY2FuIGJlIGRyYXduIGRpcmVjdGx5IGluIGdlbyBjb29yZGluYXRlcy4gKi9cclxuICAgIHNldENhbnZhc1RyYW5zZm9ybSgpIHtcclxuICAgICAgICBjb25zdCBrID0gMSAvIHRoaXMuZ2V0WmYoKVxyXG4gICAgICAgIGNvbnN0IHR4ID0gLXRoaXMuY2VudGVyLnggLyB0aGlzLmdldFpmKCkgKyB0aGlzLncgKiAwLjVcclxuICAgICAgICBjb25zdCB0eSA9IHRoaXMuY2VudGVyLnkgLyB0aGlzLmdldFpmKCkgKyB0aGlzLmggKiAwLjVcclxuICAgICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oaywgMCwgMCwgLWssIHR4LCB0eSlcclxuICAgIH1cclxuXHJcbiAgICAvKiogR2V0IHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdG8gd2ViR0wgc2NyZWVuIGNvb3JkaW5hdGVzLCB3aXRoaW4gWy0xLDFdKlstMSwxXSAqL1xyXG4gICAgZ2V0V2ViR0xUcmFuc2Zvcm0oKSB7XHJcbiAgICAgICAgY29uc3Qga3ggPSAyLjAgLyAodGhpcy53ICogdGhpcy5nZXRaZigpKVxyXG4gICAgICAgIGNvbnN0IGt5ID0gMi4wIC8gKHRoaXMuaCAqIHRoaXMuZ2V0WmYoKSlcclxuICAgICAgICByZXR1cm4gW2t4LCAwLjAsIDAuMCwgMC4wLCBreSwgMC4wLCAta3ggKiB0aGlzLmNlbnRlci54LCAta3kgKiB0aGlzLmNlbnRlci55LCAxLjBdXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRoZSBmdW5jdGlvbiBzcGVjaWZ5aW5nIGhvdyB0byBkcmF3IHRoZSBtYXAuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHN0cm9uZyAqL1xyXG4gICAgcmVkcmF3KHN0cm9uZyA9IHRydWUpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCByZWRyYXcgbm90IGltcGxlbWVudGVkLicpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhci4gVG8gYmUgdXNlZCBiZWZvcmUgYSByZWRyYXcgZm9yIGV4YW1wbGUuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sb3JcclxuICAgICAqL1xyXG4gICAgY2xlYXIoY29sb3IgPSAnd2hpdGUnKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0cy50cmFuc3BhcmVudEJhY2tncm91bmQpIHtcclxuICAgICAgICAgICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMudywgdGhpcy5oKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN0eCkgdGhpcy5jdHguZmlsbFN0eWxlID0gY29sb3JcclxuICAgICAgICAgICAgdGhpcy5jdHguZmlsbFJlY3QoMCwgMCwgdGhpcy53LCB0aGlzLmgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGR4R2VvXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZHlHZW9cclxuICAgICAqL1xyXG4gICAgcGFuKGR4R2VvID0gMCwgZHlHZW8gPSAwKSB7XHJcbiAgICAgICAgLy9UT0RPIGZvcmNlIGV4dGVuZCB0byByZW1haW5cclxuICAgICAgICB0aGlzLmNlbnRlci54ICs9IGR4R2VvXHJcbiAgICAgICAgdGhpcy5jZW50ZXIueSArPSBkeUdlb1xyXG4gICAgICAgIHRoaXMudXBkYXRlRXh0ZW50R2VvKClcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2FudmFzU2F2ZS5jKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keCAtPSBkeEdlbyAvIHRoaXMuZ2V0WmYoKVxyXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHkgKz0gZHlHZW8gLyB0aGlzLmdldFpmKClcclxuICAgICAgICAgICAgdGhpcy5jbGVhcih0aGlzLmJhY2tncm91bmRDb2xvcilcclxuICAgICAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKHRoaXMuY2FudmFzU2F2ZS5jLCB0aGlzLmNhbnZhc1NhdmUuZHgsIHRoaXMuY2FudmFzU2F2ZS5keSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBab29tLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGYgVGhlIHpvb20gZmFjdG9yLCB3aXRoaW4gXTAsIEluZmluaXR5XS4gMSBpcyBmb3Igbm8gY2hhbmdlLiA8MSB0byB6b29tLWluLCA+MSB0byB6b29tLW91dC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4R2VvIFRoZSB4IGdlbyBwb3NpdGlvbiBmaXhlZCBpbiB0aGUgc2NyZWVuLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlHZW8gVGhlIHkgZ2VvIHBvc2l0aW9uIGZpeGVkIGluIHRoZSBzY3JlZW4uXHJcbiAgICAgKi9cclxuICAgIHpvb20oZiA9IDEsIHhHZW8gPSB0aGlzLmNlbnRlci54LCB5R2VvID0gdGhpcy5jZW50ZXIueSkge1xyXG4gICAgICAgIC8vVE9ETyBmb3JjZSBnZW8gZXh0ZW5kIHRvIHJlbWFpblxyXG5cclxuICAgICAgICAvL3RyeWluZyB0byB6b29tIGluL291dCBiZXlvbmQgbGltaXRcclxuICAgICAgICBpZiAodGhpcy56ZkV4dGVudFswXSA9PSB0aGlzLmdldFpmKCkgJiYgZiA8PSAxKSByZXR1cm5cclxuICAgICAgICBpZiAodGhpcy56ZkV4dGVudFsxXSA9PSB0aGlzLmdldFpmKCkgJiYgZiA+PSAxKSByZXR1cm5cclxuXHJcbiAgICAgICAgLy9lbnN1cmUgem9vbSBleHRlbnQgcHJlc2VydmVkXHJcbiAgICAgICAgY29uc3QgbmV3WmYgPSBmICogdGhpcy5nZXRaZigpXHJcbiAgICAgICAgaWYgKG5ld1pmIDwgdGhpcy56ZkV4dGVudFswXSkgZiA9IHRoaXMuemZFeHRlbnRbMF0gLyB0aGlzLmdldFpmKClcclxuICAgICAgICBpZiAobmV3WmYgPiB0aGlzLnpmRXh0ZW50WzFdKSBmID0gdGhpcy56ZkV4dGVudFsxXSAvIHRoaXMuZ2V0WmYoKVxyXG5cclxuICAgICAgICB0aGlzLnNldFpmKGYgKiB0aGlzLmdldFpmKCkpXHJcbiAgICAgICAgY29uc3QgZHhHZW8gPSAoeEdlbyAtIHRoaXMuY2VudGVyLngpICogKDEgLSBmKVxyXG4gICAgICAgIHRoaXMuY2VudGVyLnggKz0gZHhHZW9cclxuICAgICAgICBjb25zdCBkeUdlbyA9ICh5R2VvIC0gdGhpcy5jZW50ZXIueSkgKiAoMSAtIGYpXHJcbiAgICAgICAgdGhpcy5jZW50ZXIueSArPSBkeUdlb1xyXG4gICAgICAgIHRoaXMudXBkYXRlRXh0ZW50R2VvKClcclxuXHJcbiAgICAgICAgLy9UT0RPXHJcbiAgICAgICAgLy90aGlzLnJlZHJhdyhmYWxzZSlcclxuICAgICAgICBpZiAodGhpcy5jYW52YXNTYXZlLmMpIHtcclxuICAgICAgICAgICAgdGhpcy5jbGVhcih0aGlzLmJhY2tncm91bmRDb2xvcilcclxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmYgLz0gZlxyXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHggPSB0aGlzLmdlb1RvUGl4WCh4R2VvKSAqICgxIC0gdGhpcy5jYW52YXNTYXZlLmYpXHJcbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keSA9IHRoaXMuZ2VvVG9QaXhZKHlHZW8pICogKDEgLSB0aGlzLmNhbnZhc1NhdmUuZilcclxuICAgICAgICAgICAgdGhpcy5jbGVhcih0aGlzLmJhY2tncm91bmRDb2xvcilcclxuICAgICAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmMsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHgsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHksXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZiAqIHRoaXMuY2FudmFzU2F2ZS5jLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmYgKiB0aGlzLmNhbnZhc1NhdmUuYy5oZWlnaHRcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXJnaW5QeFxyXG4gICAgICogQHJldHVybnMge0VudmVsb3BlfSBUaGUgZW52ZWxvcGUgb2YgdGhlIHZpZXcsIGluIGdlbyBjb29yZGluYXRlcy5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlRXh0ZW50R2VvKG1hcmdpblB4ID0gMjApIHtcclxuICAgICAgICB0aGlzLmV4dEdlbyA9IHtcclxuICAgICAgICAgICAgeE1pbjogdGhpcy5waXhUb0dlb1goLW1hcmdpblB4KSxcclxuICAgICAgICAgICAgeE1heDogdGhpcy5waXhUb0dlb1godGhpcy53ICsgbWFyZ2luUHgpLFxyXG4gICAgICAgICAgICB5TWluOiB0aGlzLnBpeFRvR2VvWSh0aGlzLmggKyBtYXJnaW5QeCksXHJcbiAgICAgICAgICAgIHlNYXg6IHRoaXMucGl4VG9HZW9ZKC1tYXJnaW5QeCksXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmV4dEdlb1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2sgaWYgdGhlIG9iamVjdCBoYXMgdG8gYmUgZHJhd25cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3t4Om51bWJlcix5Om51bWJlcn19IG9ialxyXG4gICAgICovXHJcbiAgICB0b0RyYXcob2JqKSB7XHJcbiAgICAgICAgaWYgKG9iai54IDwgdGhpcy5leHRHZW8ueE1pbikgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgaWYgKG9iai54ID4gdGhpcy5leHRHZW8ueE1heCkgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgaWYgKG9iai55IDwgdGhpcy5leHRHZW8ueU1pbikgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgaWYgKG9iai55ID4gdGhpcy5leHRHZW8ueU1heCkgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuXHJcbiAgICAvL2NvbnZlcnNpb24gZnVuY3Rpb25zXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4R2VvIEdlbyB4IGNvb3JkaW5hdGUsIGluIG0uXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBTY3JlZW4geCBjb29yZGluYXRlLCBpbiBwaXguXHJcbiAgICAgKi9cclxuICAgIGdlb1RvUGl4WCh4R2VvKSB7XHJcbiAgICAgICAgcmV0dXJuICh4R2VvIC0gdGhpcy5jZW50ZXIueCkgLyB0aGlzLmdldFpmKCkgKyB0aGlzLncgKiAwLjVcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlHZW8gR2VvIHkgY29vcmRpbmF0ZSwgaW4gbS5cclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFNjcmVlbiB5IGNvb3JkaW5hdGUsIGluIHBpeC5cclxuICAgICAqL1xyXG4gICAgZ2VvVG9QaXhZKHlHZW8pIHtcclxuICAgICAgICByZXR1cm4gLSh5R2VvIC0gdGhpcy5jZW50ZXIueSkgLyB0aGlzLmdldFpmKCkgKyB0aGlzLmggKiAwLjVcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggU2NyZWVuIHggY29vcmRpbmF0ZSwgaW4gcGl4LlxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gR2VvIHggY29vcmRpbmF0ZSwgaW4gbS5cclxuICAgICAqL1xyXG4gICAgcGl4VG9HZW9YKHgpIHtcclxuICAgICAgICByZXR1cm4gKHggLSB0aGlzLncgKiAwLjUpICogdGhpcy5nZXRaZigpICsgdGhpcy5jZW50ZXIueFxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSBTY3JlZW4geSBjb29yZGluYXRlLCBpbiBwaXguXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBHZW8geSBjb29yZGluYXRlLCBpbiBtLlxyXG4gICAgICovXHJcbiAgICBwaXhUb0dlb1koeSkge1xyXG4gICAgICAgIHJldHVybiAtKHkgLSB0aGlzLmggKiAwLjUpICogdGhpcy5nZXRaZigpICsgdGhpcy5jZW50ZXIueVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHZXQgeCx5LHogZWxlbWVudHMgZnJvbSBVUkwgYW5kIGFzc2lnbiB0aGVtIHRvIHRoZSB2aWV3IGNlbnRlciBhbmQgem9vbSBsZXZlbC4gKi9cclxuICAgIHNldFZpZXdGcm9tVVJMKCkge1xyXG4gICAgICAgIGNvbnN0IHggPSBHZW9DYW52YXMuZ2V0UGFyYW1ldGVyQnlOYW1lKCd4JyksXHJcbiAgICAgICAgICAgIHkgPSBHZW9DYW52YXMuZ2V0UGFyYW1ldGVyQnlOYW1lKCd5JyksXHJcbiAgICAgICAgICAgIHogPSBHZW9DYW52YXMuZ2V0UGFyYW1ldGVyQnlOYW1lKCd6JylcclxuICAgICAgICBjb25zdCBjID0gdGhpcy5nZXRDZW50ZXIoKVxyXG4gICAgICAgIGlmICh4ICE9IG51bGwgJiYgeCAhPSB1bmRlZmluZWQgJiYgIWlzTmFOKCt4KSkgYy54ID0gK3hcclxuICAgICAgICBpZiAoeSAhPSBudWxsICYmIHkgIT0gdW5kZWZpbmVkICYmICFpc05hTigreSkpIGMueSA9ICt5XHJcbiAgICAgICAgaWYgKHogIT0gbnVsbCAmJiB6ICE9IHVuZGVmaW5lZCAmJiAhaXNOYU4oK3opKSB0aGlzLnNldFpmKCt6KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZFxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcclxuICAgICAqIEByZXR1cm5zIHt0aGlzfVxyXG4gICAgICovXHJcbiAgICBhZGRab29tU2xpZGVyKGlkLCBvcHRzKSB7XHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuICAgICAgICBvcHRzLndpZHRoID0gb3B0cy53aWR0aCB8fCAnMzBweCdcclxuICAgICAgICBvcHRzLmhlaWdodCA9IG9wdHMuaGVpZ2h0IHx8ICczMDBweCdcclxuXHJcbiAgICAgICAgLy90aGUgZGl2IGVsZW1lbnRcclxuICAgICAgICBjb25zdCBkaXYgPSBzZWxlY3QoJyMnICsgaWQpXHJcbiAgICAgICAgaWYgKGRpdi5lbXB0eSgpKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGRpdiBlbGVtZW50IHRvIGJ1aWxkIHpvb20gc2xpZGVyLiBJZDogJyArIGlkKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGggPSB0aGlzXHJcbiAgICAgICAgLyoqICovXHJcbiAgICAgICAgdGhpcy5zbGlkZXIgPSBkaXZcclxuICAgICAgICAgICAgLmFwcGVuZCgnaW5wdXQnKVxyXG4gICAgICAgICAgICAuYXR0cigndHlwZScsICdyYW5nZScpXHJcbiAgICAgICAgICAgIC5hdHRyKCdtaW4nLCB0aGlzLmdldFpmRXh0ZW50KClbMF0pXHJcbiAgICAgICAgICAgIC5hdHRyKCdtYXgnLCB0aGlzLmdldFpmRXh0ZW50KClbMV0pXHJcbiAgICAgICAgICAgIC5hdHRyKCd2YWx1ZScsIHRoaXMuZ2V0WmYoKSlcclxuICAgICAgICAgICAgLm9uKCdpbnB1dCcsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMgfHwgIXRoaXMudmFsdWUpIHJldHVyblxyXG4gICAgICAgICAgICAgICAgY29uc3QgdiA9ICt0aGlzLnZhbHVlXHJcbiAgICAgICAgICAgICAgICBzZWxlY3QodGhpcykuYXR0cigndmFsdWUnLCB2KVxyXG4gICAgICAgICAgICAgICAgdGguc2V0WmYodilcclxuICAgICAgICAgICAgICAgIC8vcmVkcmF3XHJcbiAgICAgICAgICAgICAgICB0aC5yZWRyYXcoKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuc3R5bGUoJ3dpZHRoJywgb3B0cy53aWR0aClcclxuICAgICAgICAgICAgLnN0eWxlKCdoZWlnaHQnLCBvcHRzLmhlaWdodClcclxuICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMC43KVxyXG4gICAgICAgICAgICAub24oJ21vdXNlb3ZlcicsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3QodGhpcykuc3R5bGUoJ29wYWNpdHknLCAxKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAub24oJ21vdXNlb3V0JywgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdCh0aGlzKS5zdHlsZSgnb3BhY2l0eScsIDAuNylcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnN0eWxlKCctd2Via2l0LWFwcGVhcmFuY2UnLCAnc2xpZGVyLXZlcnRpY2FsJykgLy9mb3IgY2hyb21lXHJcbiAgICAgICAgICAgIC5zdHlsZSgnd3JpdGluZy1tb2RlJywgJ2J0LWxyJykgLy9mb3IgSUUvZWRnZVxyXG4gICAgICAgICAgICAuYXR0cignb3JpZW50JywgJ3ZlcnRpY2FsJykgLy9mb3IgZmlyZWZveFxyXG4gICAgICAgICAgICAuc3R5bGUoJ2JhY2tncm91bmQnLCAnbGlnaHRncmF5JylcclxuICAgICAgICAgICAgLnN0eWxlKCdvdXRsaW5lJywgJ25vbmUnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJy13ZWJraXQtdHJhbnNpdGlvbicsICcuMnMnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ3RyYW5zaXRpb24nLCAnb3BhY2l0eSAuMnMnKVxyXG5cclxuICAgICAgICAvL1RPRE9cclxuICAgICAgICAvKnNlbGVjdChcIi5zbGlkZXI6Oi13ZWJraXQtc2xpZGVyLXRodW1iXCIpXHJcbiAgICAgICAgICAgIC5zdHlsZShcIi13ZWJraXQtYXBwZWFyYW5jZVwiLCBcIm5vbmVcIilcclxuICAgICAgICAgICAgLnN0eWxlKFwiYXBwZWFyYW5jZVwiLCBcIm5vbmVcIilcclxuICAgICAgICAgICAgLnN0eWxlKFwid2lkdGhcIiwgXCIzMHB4XCIpXHJcbiAgICAgICAgICAgIC5zdHlsZShcImhlaWdodFwiLCBcIjQwcHhcIilcclxuICAgICAgICAgICAgLnN0eWxlKFwiYmFja2dyb3VuZFwiLCBcImJsYWNrXCIpXHJcbiAgICAgICAgICAgIC5zdHlsZShcImN1cnNvclwiLCBcInBvaW50ZXJcIikqL1xyXG5cclxuICAgICAgICAvKnNlbGVjdChcInNsaWRlcjo6LW1vei1yYW5nZS10aHVtYlwiKVxyXG4gICAgICAgICAgICAuc3R5bGUoXCItd2Via2l0LWFwcGVhcmFuY2VcIiwgXCJub25lXCIpXHJcbiAgICAgICAgICAgIC5zdHlsZShcIndpZHRoXCIsIFwiMzBweFwiKVxyXG4gICAgICAgICAgICAuc3R5bGUoXCJoZWlnaHRcIiwgXCI0MHB4XCIpXHJcbiAgICAgICAgICAgIC5zdHlsZShcImJhY2tncm91bmRcIiwgXCIjMDRBQTZEXCIpXHJcbiAgICAgICAgICAgIC5zdHlsZShcImN1cnNvclwiLCBcInBvaW50ZXJcIikqL1xyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICAgIC5zbGlkZXI6Om1zLXRodW1iLFxyXG4gICAgICAgIC5zbGlkZXI6Oi1tb3otcmFuZ2UtdGh1bWIge1xyXG4gICAgICAgIH0qL1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGEgVVJMIHBhcmFtZXRlciBieSBuYW1lLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH1cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGdldFBhcmFtZXRlckJ5TmFtZShuYW1lKSB7XHJcbiAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvW1xcW10vLCAnXFxcXFsnKS5yZXBsYWNlKC9bXFxdXS8sICdcXFxcXScpXHJcbiAgICAgICAgdmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cCgnW1xcXFw/Jl0nICsgbmFtZSArICc9KFteJiNdKiknKSxcclxuICAgICAgICAgICAgcmVzdWx0cyA9IHJlZ2V4LmV4ZWMobG9jYXRpb24uc2VhcmNoKVxyXG4gICAgICAgIHJldHVybiAhcmVzdWx0cyA/IG51bGwgOiBkZWNvZGVVUklDb21wb25lbnQocmVzdWx0c1sxXS5yZXBsYWNlKC9cXCsvZywgJyAnKSlcclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IGNzdiB9IGZyb20gJ2QzLWZldGNoJ1xyXG5cclxuLyoqIEEgbGFiZWwuIFRoZSBuYW1lIGlzIHRoZSB0ZXh0IHRvIHNob3cuICh4LHkpIGFyZSB0aGUgY29vcmRpbmF0ZXMgaW4gdGhlIHNhbWUgQ1JTIGFzIHRoZSBncmlkLlxyXG4gKiBAdHlwZWRlZiB7e25hbWU6IHN0cmluZywgeDpudW1iZXIsIHk6bnVtYmVyIH19IExhYmVsICovXHJcblxyXG4vKipcclxuICogQSAoZ2VuZXJpYykgbGF5ZXIgZm9yIHBsYWNlbmFtZSBsYWJlbHMsIHRvIGJlIHNob3duIG9uIHRvcCBvZiB0aGUgZ3JpZCBsYXllcnMuXHJcbiAqIFRoZSBpbnB1dCBpcyBhIENTViBmaWxlIHdpdGggdGhlIHBvc2l0aW9uICh4LCB5KSBvZiB0aGUgbGFiZWxzIGFuZCBuYW1lICsgc29tZSBvdGhlciBpbmZvIG9uIHRoZSBsYWJlbCBpbXBvcnRhbmNlLlxyXG4gKiBJZiB0aGUgbGFiZWwgZGF0YSBpcyBub3QgaW4gdGhlIGV4cGVjdGVkIGZvcm1hdCBvciBpbiB0aGUgc2FtZSBDUlMgYXMgdGhlIGdyaWQsIGl0IGNhbiBiZSBjb3JyZWN0ZWQgd2l0aCB0aGUgXCJwcmVwcm9jZXNzXCIgZnVuY3Rpb24uXHJcbiAqIFRoZSBzZWxlY3Rpb24gb2YgdGhlIGxhYmVsLCB0aGVpciBzdHlsZSAoZm9udCwgd2VpZ2h0LCBldGMuKSBhbmQgY29sb3IgY2FuIGJlIHNwZWNpZmllZCBkZXBlbmRpbmcgb24gdGhlaXIgaW1wb3J0YW5jZSBhbmQgdGhlIHpvb20gbGV2ZWwuXHJcbiAqXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBMYWJlbExheWVyIHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBVUkwgb2YgdGhlIGxhYmVsIGRhdGEsIGFzIENTViBmaWxlLlxyXG4gICAgICAgICAqIFRoZSBmaWxlIHNob3VsZCBjb250YWluIHRoZSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBsYWJlbCBzdWNoIGFzIHRoZSB0ZXh0LCB0aGUgcG9zaXRpb24gYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgZGlzcGxheSBvZiB0aGUgbGFiZWwgYWNjb3JkaW5nIHRvIHRoZSB6b29tIGxldmVsLlxyXG4gICAgICAgICAqIElmIG5lY2Vzc2FyeSwgdGhpcyBkYXRhIGNhbiBiZSByZWZvcm1hdGVkIHdpdGggdGhlICdwcmVwcm9jZXNzJyBwYXJhbWV0ZXIuXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmxcclxuXHJcbiAgICAgICAgLyoqIFNwZWNpZnkgaWYgYW5kIGhvdyBhIGxhYmVsIHNob3VsZCBiZSBkcmF3biwgZGVwZW5kaW5nIG9uIGl0cyBpbXBvcnRhbmNlIGFuZCB0aGUgem9vbSBsZXZlbC5cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCxudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnN0eWxlID0gb3B0cy5zdHlsZSB8fCAoKCkgPT4gJ2JvbGQgMWVtIEFyaWFsJylcclxuXHJcbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIGxhYmVsIGNvbG9yLCBkZXBlbmRpbmcgb24gaXRzIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKExhYmVsLG51bWJlcik6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8IChvcHRzLmRhcmsgPyAoKSA9PiAnI2RkZCcgOiAoKSA9PiAnIzIyMicpXHJcblxyXG4gICAgICAgIC8qKiBTcGVjaWZ5IHRoZSBsYWJlbCBoYWxvIGNvbG9yLCBkZXBlbmRpbmcgb24gaXRzIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKExhYmVsLG51bWJlcik6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuaGFsb0NvbG9yID0gb3B0cy5oYWxvQ29sb3IgfHwgKG9wdHMuZGFyayA/ICgpID0+ICcjMDAwMDAwQkInIDogKCkgPT4gJyNGRkZGRkZCQicpXHJcblxyXG4gICAgICAgIC8qKiBTcGVjaWZ5IHRoZSBsYWJlbCBoYWxvIHdpZHRoLCBkZXBlbmRpbmcgb24gaXRzIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKExhYmVsLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuaGFsb1dpZHRoID0gb3B0cy5oYWxvV2lkdGggfHwgKCgpID0+IDQpXHJcblxyXG4gICAgICAgIC8qKiBUaGUgYW5jaG9yIHdoZXJlIHRvIGRyYXcgdGhlIHRleHQsIGZyb20gbGFiZWwgcG9zaXRpb24uIFNlZSBIVE1MLWNhbnZhcyB0ZXh0QWxpZ24gcHJvcGVydHkuXHJcbiAgICAgICAgICogXCJsZWZ0XCIgfHwgXCJyaWdodFwiIHx8IFwiY2VudGVyXCIgfHwgXCJzdGFydFwiIHx8IFwiZW5kXCJcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtDYW52YXNUZXh0QWxpZ259ICovXHJcbiAgICAgICAgdGhpcy50ZXh0QWxpZ24gPSBvcHRzLnRleHRBbGlnbiB8fCAnc3RhcnQnXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxudW1iZXI+fSAqL1xyXG4gICAgICAgIHRoaXMub2Zmc2V0UGl4ID0gb3B0cy5vZmZzZXRQaXggfHwgWzUsIDVdXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcHJlcHJvY2VzcyB0byBydW4gb24gZWFjaCBsYWJlbCBhZnRlciBsb2FkaW5nLlxyXG4gICAgICAgICAqIEl0IGNhbiBiZSB1c2VkIHRvIGFwcGx5IHNvbWUgc3BlY2lmaWMgdHJlYXRtZW50IGJlZm9yZSwgZm9ybWF0IHRoZSBsYWJlbCBkYXRhLCBwcm9qZWN0IGNvb3JkaW5hdGVzLCBldGMuXHJcbiAgICAgICAgICogUmV0dXJuIGZhbHNlIGlmIHRoZSBsYWJlbCBzaG91bGQgbm90IGJlIGtlcHQuXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oTGFiZWwpOmJvb2xlYW59ICovXHJcbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzID0gb3B0cy5wcmVwcm9jZXNzXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxMYWJlbD4gfCB1bmRlZmluZWR9ICovXHJcbiAgICAgICAgdGhpcy5sYWJlbHMgPSB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdub3RMb2FkZWQnXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IHRoZSBsYWJlbCBsYXllci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2cgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZSBsYXllci5cclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICBkcmF3KGNnKSB7XHJcbiAgICAgICAgLy9sb2FkIGxhYmVscywgaWYgbm90IGRvbmUgeWV0LlxyXG4gICAgICAgIGlmICghdGhpcy5sYWJlbHMpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkKGNnLnJlZHJhdylcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3pvb20gZmFjdG9yXHJcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXHJcblxyXG4gICAgICAgIC8vdGV4dCBhbGlnblxyXG4gICAgICAgIGNnLmN0eC50ZXh0QWxpZ24gPSB0aGlzLnRleHRBbGlnbiB8fCAnc3RhcnQnXHJcblxyXG4gICAgICAgIC8vbGluZSBqb2luIGFuZCBjYXBcclxuICAgICAgICBjZy5jdHgubGluZUpvaW4gPSAnYmV2ZWwnIC8vfHwgXCJyb3VuZFwiIHx8IFwibWl0ZXJcIjtcclxuICAgICAgICBjZy5jdHgubGluZUNhcCA9ICdidXR0JyAvL3x8IFwicm91bmRcIiB8fCBcInNxdWFyZVwiO1xyXG5cclxuICAgICAgICAvL2RyYXcgaW4gcGl4IGNvb3JkaW5hdGVzXHJcbiAgICAgICAgY2cuaW5pdENhbnZhc1RyYW5zZm9ybSgpXHJcblxyXG4gICAgICAgIC8vZHJhdyBsYWJlbHMsIG9uZSBieSBvbmVcclxuICAgICAgICBmb3IgKGNvbnN0IGxiIG9mIHRoaXMubGFiZWxzKSB7XHJcbiAgICAgICAgICAgIC8vZ2V0IGxhYmVsIHN0eWxlXHJcbiAgICAgICAgICAgIGNvbnN0IHN0ID0gdGhpcy5zdHlsZShsYiwgemYpXHJcbiAgICAgICAgICAgIGlmICghc3QpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGNnLmN0eC5mb250ID0gc3RcclxuXHJcbiAgICAgICAgICAgIC8vY2hlY2sgbGFiZWwgd2l0aGluIHRoZSB2aWV3LCB0byBiZSBkcmF3blxyXG4gICAgICAgICAgICBpZiAoIWNnLnRvRHJhdyhsYikpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL3Bvc2l0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IHhQID0gY2cuZ2VvVG9QaXhYKGxiLngpICsgdGhpcy5vZmZzZXRQaXhbMF1cclxuICAgICAgICAgICAgY29uc3QgeVAgPSBjZy5nZW9Ub1BpeFkobGIueSkgLSB0aGlzLm9mZnNldFBpeFsxXVxyXG5cclxuICAgICAgICAgICAgLy9sYWJlbCBzdHJva2UsIGZvciB0aGUgaGFsb1xyXG4gICAgICAgICAgICBpZiAodGhpcy5oYWxvQ29sb3IgJiYgdGhpcy5oYWxvV2lkdGgpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGhjID0gdGhpcy5oYWxvQ29sb3IobGIsIHpmKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgaHcgPSB0aGlzLmhhbG9XaWR0aChsYiwgemYpXHJcbiAgICAgICAgICAgICAgICBpZiAoaGMgJiYgaHcgJiYgaHcgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZVN0eWxlID0gaGNcclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHgubGluZVdpZHRoID0gaHdcclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlVGV4dChsYi5uYW1lLCB4UCwgeVApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vbGFiZWwgZmlsbFxyXG4gICAgICAgICAgICBpZiAodGhpcy5jb2xvcikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvcihsYiwgemYpXHJcbiAgICAgICAgICAgICAgICBpZiAoY29sKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxTdHlsZSA9IGNvbFxyXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsVGV4dChsYi5uYW1lLCB4UCwgeVApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkIGRhdGEgZm9yIGxhYmVscywgZnJvbSBVUkwgdGhpcy51cmxcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTp2b2lkfSBjYWxsYmFja1xyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgYXN5bmMgbG9hZChjYWxsYmFjaykge1xyXG4gICAgICAgIGlmICghdGhpcy51cmwpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCBsb2FkaW5nIGxhYmVsczogTm8gVVJMIHNwZWNpZmllZC4gJyArIHRoaXMudXJsKVxyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9jaGVjayBpZiBkYXRhIGFscmVhZHkgbG9hZGVkXHJcbiAgICAgICAgaWYgKHRoaXMubG9hZGluZ1N0YXR1cyAhPSAnbm90TG9hZGVkJykgcmV0dXJuXHJcblxyXG4gICAgICAgIC8vbG9hZCBkYXRhXHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2xvYWRpbmcnXHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7IEFycmF5LjxMYWJlbD4gfSAqL1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgY3N2KHRoaXMudXJsKVxyXG5cclxuICAgICAgICAgICAgLy9wcmVwcm9jZXNzL2ZpbHRlclxyXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0aGlzLnByZXByb2Nlc3MoYylcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYiA9PSBmYWxzZSkgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhYmVscy5wdXNoKGMpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvL3N0b3JlIGxhYmVsc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBkYXRhXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkZWQnXHJcblxyXG4gICAgICAgICAgICAvL3JlZHJhd1xyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKClcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIGxvYWRpbmcgbGFiZWxzIGZyb20gJyArIHRoaXMudXJsKVxyXG4gICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdmYWlsZWQnXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuLyoqXHJcbiAqIEEgbGF5ZXIsIHdoaWNoIHNwZWNpZmllcyBhIGRhdGFzZXQgdG8gYmUgc2hvd24gd2l0aCBzcGVjaWZpZWQgc3R5bGVzLlxyXG4gKlxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTGF5ZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vRGF0YXNldFwiKS5EYXRhc2V0fSBkYXRhc2V0IFRoZSBtdWx0aSByZXNvbHV0aW9uIGRhdGFzZXQgdG8gc2hvdy5cclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4vU3R5bGVcIikuU3R5bGU+fSBzdHlsZXMgVGhlIHN0eWxlcywgb3JkZXJlZCBpbiBkcmF3aW5nIG9yZGVyLlxyXG4gICAgICogQHBhcmFtIHt7dmlzaWJsZT86Ym9vbGVhbixtaW5ab29tPzpudW1iZXIsbWF4Wm9vbT86bnVtYmVyLHBpeE5iPzpudW1iZXIsY2VsbEluZm9IVE1MPzpmdW5jdGlvbihpbXBvcnQoXCIuL0RhdGFzZXRcIikuQ2VsbCk6c3RyaW5nfX0gb3B0c1xyXG4gICAgICogICAgICBtaW5ab29tOiBUaGUgbWluaW11bSB6b29tIGxldmVsIHdoZW4gdG8gc2hvdyB0aGUgbGF5ZXIuIG1heFpvb206IFRoZSBtYXhpbXVtIHpvb20gbGV2ZWwgd2hlbiB0byBzaG93IHRoZSBsYXllclxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhc2V0LCBzdHlsZXMsIG9wdHMgPSB7fSkge1xyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkRhdGFzZXR9ICovXHJcbiAgICAgICAgdGhpcy5kYXRhc2V0ID0gZGF0YXNldFxyXG4gICAgICAgIC8qKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4vU3R5bGVcIikuU3R5bGU+fSAqL1xyXG4gICAgICAgIHRoaXMuc3R5bGVzID0gc3R5bGVzXHJcblxyXG4gICAgICAgIC8qKiBBbiBhdHRyaWJ1dGUgdG8gc3BlY2lmeSBpZiBhIGxheWVyIHNob3VsZCBiZSBkcmF3biBvciBub3RcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gKi9cclxuICAgICAgICB0aGlzLnZpc2libGUgPSBvcHRzLnZpc2libGUgPT0gZmFsc2UgPyBmYWxzZSA6IHRydWVcclxuXHJcbiAgICAgICAgLyoqIFRoZSBtaW5pbXVtIHpvb20gZmFjdG9yOiBCZWxvdyB0aGlzIGxldmVsLCB0aGUgbGF5ZXIgaXMgbm90IHNob3duLlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5taW5ab29tID0gb3B0cy5taW5ab29tIHx8IDBcclxuXHJcbiAgICAgICAgLyoqIFRoZSBtYXhpbXVtIHpvb20gZmFjdG9yOiBBYm92ZSB0aGlzIGxldmVsLCB0aGUgbGF5ZXIgaXMgbm90IHNob3duLlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5tYXhab29tID0gb3B0cy5tYXhab29tIHx8IEluZmluaXR5XHJcblxyXG4gICAgICAgIC8vZW5zdXJlIGFjY2VwdGFibGUgdmFsdWVzIGZvciB0aGUgem9vbSBsaW1pdHMuXHJcbiAgICAgICAgaWYgKHRoaXMubWluWm9vbSA+PSB0aGlzLm1heFpvb20pXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCB6b29tIGxpbWl0cyBmb3IgbGF5ZXIuIFpvb20gbWluIHNob3VsZCBiZSBzbWFsbGVyIHRoYW4gem9vbSBtYXguJylcclxuXHJcbiAgICAgICAgLyoqIFVuaXQ6IG51bWJlciBvZiBwaXhlbHNcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMucGl4TmIgPSBvcHRzLnBpeE5iIHx8IDNcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGZ1bmN0aW9uIHJldHVybmluZyBjZWxsIGluZm9ybWF0aW9uIGFzIEhUTUwuXHJcbiAgICAgICAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgdG9vbHRpcCBpbmZvcm1hdGlvbi5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGwsIG51bWJlcik6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY2VsbEluZm9IVE1MID0gb3B0cy5jZWxsSW5mb0hUTUwgfHwgTGF5ZXIuZGVmYXVsdENlbGxJbmZvSFRNTFxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSByZWxldmFudCBkYXRhc2V0IGNvbXBvbmVudCBmb3IgYSBzcGVjaWZpZWQgem9vbSBmYWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpmXHJcbiAgICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9EYXRhc2V0Q29tcG9uZW50XCIpLkRhdGFzZXRDb21wb25lbnR8dW5kZWZpbmVkfVxyXG4gICAgICogKi9cclxuICAgIGdldERhdGFzZXRDb21wb25lbnQoemYpIHtcclxuICAgICAgICBpZiAoemYgPCB0aGlzLm1pblpvb20gfHwgemYgPiB0aGlzLm1heFpvb20pIHJldHVyblxyXG5cclxuICAgICAgICAvL3NwZWNpYWwgY2FzZSB3aGl0aCBzaW5nbGUgY29tcG9uZW50IGRhdGFzZXRcclxuICAgICAgICBpZiAodGhpcy5kYXRhc2V0LmRhdGFzZXRDb21wb25lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gdGhpcy5kYXRhc2V0LmRhdGFzZXRDb21wb25lbnRzWzBdXHJcblxyXG4gICAgICAgIGNvbnN0IHJzID0gdGhpcy5kYXRhc2V0LnJlc29sdXRpb25zXHJcbiAgICAgICAgbGV0IGkgPSAwXHJcbiAgICAgICAgbGV0IHogPSByc1tpXSAvIHRoaXMucGl4TmJcclxuICAgICAgICB3aGlsZSAoeiA8IHpmICYmIGkgPCBycy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgaSsrXHJcbiAgICAgICAgICAgIHogPSByc1tpXSAvIHRoaXMucGl4TmJcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9pZiAoaSA9PSAwKSByZXR1cm4gdGhpcy5kYXRhc2V0LmRhdGFzZXRDb21wb25lbnRzWzBdO1xyXG4gICAgICAgIC8vcmV0dXJuIHRoaXMuZGF0YXNldC5kYXRhc2V0Q29tcG9uZW50c1tpIC0gMV07XHJcbiAgICAgICAgaWYgKGkgPT0gcnMubGVuZ3RoKSByZXR1cm4gdGhpcy5kYXRhc2V0LmRhdGFzZXRDb21wb25lbnRzW3JzLmxlbmd0aCAtIDFdXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YXNldC5kYXRhc2V0Q29tcG9uZW50c1tpXVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRlZmF1bHQgZnVuY3Rpb24gcmV0dXJuaW5nIGNlbGwgaW5mb3JtYXRpb24gYXMgSFRNTC5cclxuICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIHRvb2x0aXAgaW5mb3JtYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0RhdGFzZXRcIikuQ2VsbH0gY2VsbFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ31cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGRlZmF1bHRDZWxsSW5mb0hUTUwoY2VsbCkge1xyXG4gICAgICAgIGNvbnN0IGJ1ZiA9IFtdXHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY2VsbCkpIHtcclxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3gnKSBjb250aW51ZVxyXG4gICAgICAgICAgICBpZiAoa2V5ID09PSAneScpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGJ1Zi5wdXNoKCc8Yj4nLCBrZXksICc8L2I+JywgJyA6ICcsIGNlbGxba2V5XSwgJzxicj4nKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYnVmLmpvaW4oJycpXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXHJcblxyXG4vKipcclxuICogQSBsZWdlbmQgY29udGFpbmVyLlxyXG4gKlxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTGVnZW5kIHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdHNcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuaWQgPSBvcHRzLmlkXHJcblxyXG4gICAgICAgIC8vVE9ETyBzdG9wIHVzaW5nIGl0LiBVc2Ugc3R5bGUgbWV0aG9kIGJlbG93IGluc3RlYWQuXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSBAZGVwcmVjYXRlZCAqL1xyXG4gICAgICAgIHRoaXMudG9wID0gb3B0cy50b3BcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gQGRlcHJlY2F0ZWQgKi9cclxuICAgICAgICB0aGlzLmJvdHRvbSA9IG9wdHMuYm90dG9tXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9IEBkZXByZWNhdGVkICovXHJcbiAgICAgICAgdGhpcy5sZWZ0ID0gb3B0cy5sZWZ0XHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9IEBkZXByZWNhdGVkICovXHJcbiAgICAgICAgdGhpcy5yaWdodCA9IG9wdHMucmlnaHRcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cclxuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBvcHRzLmJhY2tncm91bmQgfHwgJ25vbmUnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXHJcbiAgICAgICAgdGhpcy5wYWRkaW5nID0gb3B0cy5wYWRkaW5nIHx8ICc1cHgnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXHJcbiAgICAgICAgdGhpcy5ib3JkZXIgPSBvcHRzLmJvcmRlciB8fCAnMHB4J1xyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xyXG4gICAgICAgIHRoaXNbJ2JvcmRlci1yYWRpdXMnXSA9IG9wdHNbJ2JvcmRlci1yYWRpdXMnXSB8fCAnbm9uZSdcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cclxuICAgICAgICB0aGlzWydib3gtc2hhZG93J10gPSBvcHRzWydib3gtc2hhZG93J10gfHwgJ25vbmUnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXHJcbiAgICAgICAgdGhpc1snZm9udC1mYW1pbHknXSA9IG9wdHNbJ2ZvbnQtZmFtaWx5J10gfHwgJ0hlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGhcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cclxuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0XHJcblxyXG4gICAgICAgIC8vdGhlIGRpdiBlbGVtZW50XHJcbiAgICAgICAgaWYgKHRoaXMuaWQpIHRoaXMuZGl2ID0gc2VsZWN0KCcjJyArIHRoaXMuaWQpXHJcblxyXG4gICAgICAgIGlmICghdGhpcy5kaXYgfHwgdGhpcy5kaXYuZW1wdHkoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmRpdiA9IHNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSlcclxuICAgICAgICAgICAgaWYgKHRoaXMuaWQpIHRoaXMuZGl2LmF0dHIoJ2lkJywgdGhpcy5pZClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vc2V0IHN0eWxlXHJcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ2JhY2tncm91bmQnLCB0aGlzLmJhY2tncm91bmQpXHJcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ3BhZGRpbmcnLCB0aGlzLnBhZGRpbmcpXHJcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ2JvcmRlcicsIHRoaXMuYm9yZGVyKVxyXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdib3JkZXItcmFkaXVzJywgdGhpc1snYm9yZGVyLXJhZGl1cyddKVxyXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdib3gtc2hhZG93JywgdGhpc1snYm94LXNoYWRvdyddKVxyXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdmb250LWZhbWlseScsIHRoaXNbJ2ZvbnQtZmFtaWx5J10pXHJcblxyXG4gICAgICAgIGlmICh0aGlzLndpZHRoKSB0aGlzLmRpdi5zdHlsZSgnd2lkdGgnLCB0aGlzLndpZHRoKVxyXG4gICAgICAgIGlmICh0aGlzLmhlaWdodCkgdGhpcy5kaXYuc3R5bGUoJ2hlaWdodCcsIHRoaXMuaGVpZ2h0KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwbHkgYSBzdHlsZSB0byB0aGUgbGVnZW5kIGRpdi5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdlxyXG4gICAgICogQHJldHVybnMge3RoaXN9XHJcbiAgICAgKi9cclxuICAgIHN0eWxlKGssIHYpIHtcclxuICAgICAgICB0aGlzLmRpdi5zdHlsZShrLCB2KVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xyXG4gICAgICogQGFic3RyYWN0XHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZShvcHRzKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignTGVnZW5kIHVwZGF0ZSBub3QgaW1wbGVtZW50ZWQgeWV0LicpXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBqc29uIH0gZnJvbSAnZDMtZmV0Y2gnXHJcblxyXG4vKipcclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIExpbmVMYXllciB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy51cmwgPSBvcHRzLnVybFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHByZXByb2Nlc3MgdG8gcnVuIG9uIGVhY2ggZmVhdHVyZSBhZnRlciBsb2FkaW5nLlxyXG4gICAgICAgICAqIEl0IGNhbiBiZSB1c2VkIHRvIGFwcGx5IHNvbWUgc3BlY2lmaWMgdHJlYXRtZW50IGJlZm9yZSwgZm9ybWF0IHRoZSBsYWJlbCBkYXRhLCBwcm9qZWN0IGNvb3JkaW5hdGVzLCBldGMuXHJcbiAgICAgICAgICogUmV0dXJuIGZhbHNlIGlmIHRoZSBsYWJlbCBzaG91bGQgbm90IGJlIGtlcHQuXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0KTpib29sZWFufSAqL1xyXG4gICAgICAgIHRoaXMucHJlcHJvY2VzcyA9IG9wdHMucHJlcHJvY2Vzc1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihvYmplY3QsbnVtYmVyKTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKChmLCB6ZikgPT4gJ2dyYXknKVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKGYsIHpmKSA9PiAyKVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOkFycmF5LjxudW1iZXI+fHVuZGVmaW5lZH0gKi9cclxuICAgICAgICB0aGlzLmxpbmVEYXNoID0gb3B0cy5saW5lRGFzaCB8fCAoKGYsIHpmKSA9PiB1bmRlZmluZWQpXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxvYmplY3Q+IHwgdW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMuZnMgPSB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdub3RMb2FkZWQnXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IHRoZSBsYXllci5cclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBjZyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2cpIHtcclxuICAgICAgICAvL2xvYWQgZGF0YSwgaWYgbm90IGRvbmUgeWV0LlxyXG4gICAgICAgIGlmICghdGhpcy5mcykge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWQoY2cucmVkcmF3KVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vVE9ETyBzb3J0IGxpbmVzIGJ5IHdpZHRoID9cclxuXHJcbiAgICAgICAgLy96b29tIGZhY3RvclxyXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxyXG5cclxuICAgICAgICAvL2RyYXcgaW4gZ2VvIGNvb3JkaW5hdGVzXHJcbiAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIHRoaXMuZnMpIHtcclxuICAgICAgICAgICAgY29uc3QgY3MgPSBmLmdlb21ldHJ5LmNvb3JkaW5hdGVzXHJcbiAgICAgICAgICAgIGlmIChjcy5sZW5ndGggPCAyKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy9zZXQgY29sb3JcclxuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvcihmLCB6ZilcclxuICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09ICdub25lJykgY29udGludWVcclxuICAgICAgICAgICAgY2cuY3R4LnN0cm9rZVN0eWxlID0gY29sXHJcblxyXG4gICAgICAgICAgICAvL3NldCBsaW5ld2lkdGhcclxuICAgICAgICAgICAgY29uc3Qgd1AgPSB0aGlzLndpZHRoKGYsIHpmKVxyXG4gICAgICAgICAgICBpZiAoIXdQIHx8IHdQIDwgMCkgY29udGludWVcclxuICAgICAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IHdQICogemZcclxuXHJcbiAgICAgICAgICAgIC8vc2V0IGxpbmUgZGFzaFxyXG4gICAgICAgICAgICBjb25zdCBsZFAgPSB0aGlzLmxpbmVEYXNoKGYsIHpmKVxyXG4gICAgICAgICAgICBpZiAobGRQKSBjZy5jdHguc2V0TGluZURhc2gobGRQKVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGxpbmVcclxuICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY3NbMF1bMF0sIGNzWzBdWzFdKVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNzLmxlbmd0aDsgaSsrKSBjZy5jdHgubGluZVRvKGNzW2ldWzBdLCBjc1tpXVsxXSlcclxuICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLy4uLlxyXG4gICAgICAgIGNnLmN0eC5zZXRMaW5lRGFzaChbXSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExvYWQgZGF0YSBmb3IgbGFiZWxzLCBmcm9tIFVSTCB0aGlzLnVybFxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbigpOnZvaWR9IGNhbGxiYWNrXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBhc3luYyBsb2FkKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVybCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIGxvYWRpbmcgYm91bmRhcmllczogTm8gVVJMIHNwZWNpZmllZC4gJyArIHRoaXMudXJsKVxyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9jaGVjayBpZiBkYXRhIGFscmVhZHkgbG9hZGVkXHJcbiAgICAgICAgaWYgKHRoaXMubG9hZGluZ1N0YXR1cyAhPSAnbm90TG9hZGVkJykgcmV0dXJuXHJcblxyXG4gICAgICAgIC8vbG9hZCBkYXRhXHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2xvYWRpbmcnXHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGFfID0gYXdhaXQganNvbih0aGlzLnVybClcclxuXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7IEFycmF5LjxvYmplY3Q+IH0gKi9cclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGRhdGFfLmZlYXR1cmVzXHJcblxyXG4gICAgICAgICAgICAvL3ByZXByb2Nlc3MvZmlsdGVyXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXByb2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZnMgPSBbXVxyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBiID0gdGhpcy5wcmVwcm9jZXNzKGMpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcy5wdXNoKGMpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvL3N0b3JlIGxhYmVsc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mcyA9IGRhdGFcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2xvYWRlZCdcclxuXHJcbiAgICAgICAgICAgIC8vcmVkcmF3XHJcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgbG9hZGluZyBib3VuZGFyaWVzIGZyb20gJyArIHRoaXMudXJsKVxyXG4gICAgICAgICAgICB0aGlzLmZzID0gW11cclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG4vKipcclxuICogU3RhdGlzdGljcyBvZiBhIHNldCBvZiB2YWx1ZXNcclxuICogQHR5cGVkZWYge3ttaW46bnVtYmVyLG1heDpudW1iZXJ9fSBTdGF0ICovXHJcblxyXG4vKiogQHR5cGVkZWYge1wic3F1YXJlXCJ8XCJjaXJjbGVcInxcImRpYW1vbmRcInxcImRvbnV0XCJ8XCJub25lXCJ9IFNoYXBlICovXHJcblxyXG4vKipcclxuICogQSBzdHlsZSwgdG8gc2hvdyBhIGdyaWQgZGF0YXNldC5cclxuICpcclxuICogQGFic3RyYWN0XHJcbiAqXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTdHlsZSB7XHJcbiAgICAvKipcclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICogQHBhcmFtIHt7ZmlsdGVyPzpmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwpOmJvb2xlYW4sb2Zmc2V0PzpmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9LG1pblpvb20/Om51bWJlcixtYXhab29tPzpudW1iZXJ9fSBvcHRzXHJcbiAgICAgKiAgICAgIG1pblpvb206IFRoZSBtaW5pbXVtIHpvb20gbGV2ZWwgd2hlbiB0byBzaG93IHRoZSBsYXllci4gbWF4Wm9vbTogVGhlIG1heGltdW0gem9vbSBsZXZlbCB3aGVuIHRvIHNob3cgdGhlIGxheWVyXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogQSBmaWx0ZXIgZnVuY3Rpb24gdG8gYXBwbHkgdG8gdGhlIGNlbGwgbGlzdCwgdG8gZmlsdGVyIG91dCBzb21lIGNlbGxzIG5vdCB0byBiZSBkcmF3biAoc3VjaCBhcyBmb3IgZXhhbXBsZSB0aGUgY2VsbHMgd2l0aCB2YWx1ZT0wKS5cclxuICAgICAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbn0gKi9cclxuICAgICAgICB0aGlzLmZpbHRlciA9IG9wdHMuZmlsdGVyIHx8ICgoKSA9PiB0cnVlKVxyXG5cclxuICAgICAgICAvKiogQW4gb2Zmc2V0LiBUaGlzIGlzIHRvIGFsdGVyIHRoZSBwb3NpdGlvbiBvZiBhbGwgc3ltYm9scyBpbiBhIGdpdmVuIGRpcmVjdGlvbi4gSW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXHJcbiAgICAgICAgICogQHByb3RlY3RlZFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9fSAqL1xyXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gb3B0cy5vZmZzZXQgfHwgKChjLCByLCB6ZikgPT4gKHsgZHg6IDAsIGR5OiAwIH0pKVxyXG5cclxuICAgICAgICAvKiogVGhlIG1pbmltdW0gem9vbSBmYWN0b3I6IEJlbG93IHRoaXMgbGV2ZWwsIHRoZSBsYXllciBpcyBub3Qgc2hvd24uXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiAqL1xyXG4gICAgICAgIHRoaXMubWluWm9vbSA9IG9wdHMubWluWm9vbSB8fCAwXHJcblxyXG4gICAgICAgIC8qKiBUaGUgbWF4aW11bSB6b29tIGZhY3RvcjogQWJvdmUgdGhpcyBsZXZlbCwgdGhlIGxheWVyIGlzIG5vdCBzaG93bi5cclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqICovXHJcbiAgICAgICAgdGhpcy5tYXhab29tID0gb3B0cy5tYXhab29tIHx8IEluZmluaXR5XHJcblxyXG4gICAgICAgIC8vZW5zdXJlIGFjY2VwdGFibGUgdmFsdWVzIGZvciB0aGUgem9vbSBsaW1pdHMuXHJcbiAgICAgICAgaWYgKHRoaXMubWluWm9vbSA+PSB0aGlzLm1heFpvb20pXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCB6b29tIGxpbWl0cyBmb3IgbGF5ZXIuIFpvb20gbWluIHNob3VsZCBiZSBzbWFsbGVyIHRoYW4gem9vbSBtYXguJylcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHB1YmxpY1xyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi9MZWdlbmRcIikuTGVnZW5kPn0gKi9cclxuICAgICAgICB0aGlzLmxlZ2VuZHMgPSBbXVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyBjZWxscy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGw+fSBjZWxscyBUaGUgY2VsbHMgdG8gZHJhdy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZWlyIHJlc29sdXRpb24gKGluIGdlb2dyYXBoaWMgdW5pdClcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBjZyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlbS5cclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCByZXNvbHV0aW9uLCBjZykge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIGRyYXcgbm90IGltcGxlbWVudGVkLicpXHJcbiAgICB9XHJcblxyXG4gICAgLy9nZXR0ZXJzIGFuZCBzZXR0ZXJzXHJcblxyXG4gICAgLyoqIEByZXR1cm5zIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9fSAqL1xyXG4gICAgZ2V0T2Zmc2V0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldFxyXG4gICAgfVxyXG4gICAgLyoqIEBwYXJhbSB7ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsLG51bWJlcixudW1iZXIpOntkeDpudW1iZXIsZHk6bnVtYmVyfX0gdmFsIEByZXR1cm5zIHt0aGlzfSAqL1xyXG4gICAgc2V0T2Zmc2V0KHZhbCkge1xyXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gdmFsXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKiogSGlkZSBhbGwgbGVnZW5kIGVsZW1lbnRzIG9mIHRoZSBzdHlsZSwgaWYgYW55XHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICogQHJldHVybnMge3RoaXN9ICovXHJcbiAgICB1cGRhdGVMZWdlbmRzKG9wdHMpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGxnIG9mIHRoaXMubGVnZW5kcykgbGcudXBkYXRlKG9wdHMpXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgc29tZSBzdGF0aXN0aWNzIG9uIGEgdmFsdWUgb2Ygc29tZSBjZWxscy5cclxuICAgICAqIFRoaXMgaXMgdXNlZCB0byBkZWZpbmUgaG93IHRvIGRyYXcgc3BlY2lmaWNhbGx5IHRoZSBjZWxscyB3aXRoaW4gdGhlIHZpZXcuXHJcbiAgICAgKiBUT0RPOiBjb21wdXRlIG1lZGlhbiA/XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsKTpudW1iZXJ9IHZhbEZ1blxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVaZXJvc1xyXG4gICAgICogQHJldHVybnMge1N0YXQgfCB1bmRlZmluZWR9XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBnZXRTdGF0aXN0aWNzKGNlbGxzLCB2YWxGdW4sIGlnbm9yZVplcm9zKSB7XHJcbiAgICAgICAgaWYgKCFjZWxscyB8fCBjZWxscy5sZW5ndGggPT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICAgIGxldCBtaW4gPSBJbmZpbml0eVxyXG4gICAgICAgIGxldCBtYXggPSAtSW5maW5pdHlcclxuICAgICAgICAvL2xldCBzdW0gPSAwXHJcbiAgICAgICAgLy9sZXQgbmIgPSAwXHJcbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHYgPSArdmFsRnVuKGNlbGwpXHJcbiAgICAgICAgICAgIGlmIChpZ25vcmVaZXJvcyAmJiAhdikgY29udGludWVcclxuICAgICAgICAgICAgaWYgKHYgPCBtaW4pIG1pbiA9IHZcclxuICAgICAgICAgICAgaWYgKHYgPiBtYXgpIG1heCA9IHZcclxuICAgICAgICAgICAgLy9zdW0gKz0gdlxyXG4gICAgICAgICAgICAvL25iKytcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgbWluOiBtaW4sIG1heDogbWF4IH1cclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IHNlbGVjdCB9IGZyb20gJ2QzLXNlbGVjdGlvbidcclxuLy9pbXBvcnQgeyB0cmFuc2l0aW9uIH0gZnJvbSBcImQzLXRyYW5zaXRpb25cIjtcclxuXHJcbi8qKlxyXG4gKiBBIGdlbmVyaWMgY2xhc3MgdG8gbWFrZSBhIHRvb2x0aXAuXHJcbiAqIEl0IGlzIGEgZGl2IGVsZW1lbnQsIHdoaWNoIGNhbiBiZSBtb3ZlZCB1bmRlciB0aGUgbW91c2UgcG9pbnRlciBhbmQgZmlsbGVkIHdpdGggc29tZSBpbmZvcm1hdGlvbiBpbiBodG1sLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRvb2x0aXAge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5kaXYgPSBvcHRzLmRpdiB8fCAndG9vbHRpcF9ldXJvc3RhdCdcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLm1heFdpZHRoID0gb3B0cy5tYXhXaWR0aCB8fCAnMjBlbSdcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmZvbnRTaXplID0gb3B0cy5mb250U2l6ZSB8fCAnMS4yZW0nXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gb3B0cy5iYWNrZ3JvdW5kIHx8ICd3aGl0ZSdcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnBhZGRpbmcgPSBvcHRzLnBhZGRpbmcgfHwgJzVweCdcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmJvcmRlciA9IG9wdHMuYm9yZGVyIHx8ICcwcHgnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpc1snYm9yZGVyLXJhZGl1cyddID0gb3B0c1snYm9yZGVyLXJhZGl1cyddIHx8ICc1cHgnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpc1snYm94LXNoYWRvdyddID0gb3B0c1snYm94LXNoYWRvdyddIHx8ICc1cHggNXB4IDVweCBncmV5J1xyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXNbJ2ZvbnQtZmFtaWx5J10gPSBvcHRzWydmb250LWZhbWlseSddIHx8ICdIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJ1xyXG5cclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnRyYW5zaXRpb25EdXJhdGlvbiA9IG9wdHMudHJhbnNpdGlvbkR1cmF0aW9uIHx8IDEwMFxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMueE9mZnNldCA9IG9wdHMueE9mZnNldCB8fCAzMFxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMueU9mZnNldCA9IG9wdHMueU9mZnNldCB8fCAyMFxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAvLyBlLmcuIHRvIHByZXZlbnQgbW91c2UgY3Vyc29yIGNvdmVyaW5nIGNlbGwgYmVpbmcgaGlnaGxpZ2h0ZWRcclxuICAgICAgICB0aGlzLnlNb3VzZU9mZnNldCA9IG9wdHMueU1vdXNlT2Zmc2V0IHx8IDBcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnhNb3VzZU9mZnNldCA9IG9wdHMueE1vdXNlT2Zmc2V0IHx8IDBcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7aW1wb3J0KFwiZDMtc2VsZWN0aW9uXCIpLlNlbGVjdGlvbn0gKi9cclxuICAgICAgICB0aGlzLnRvb2x0aXAgPSBzZWxlY3QoJyMnICsgdGhpcy5kaXYpXHJcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcC5lbXB0eSgpKSB0aGlzLnRvb2x0aXAgPSBzZWxlY3QoJ2JvZHknKS5hcHBlbmQoJ2RpdicpLmF0dHIoJ2lkJywgdGhpcy5kaXYpXHJcblxyXG4gICAgICAgIC8vaW5pdGlhbGlzZVxyXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnbWF4LXdpZHRoJywgdGhpcy5tYXhXaWR0aClcclxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ292ZXJmbG93JywgJ2hpZGRlbicpXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmZvbnRTaXplKVxyXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnYmFja2dyb3VuZCcsIHRoaXMuYmFja2dyb3VuZClcclxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ3BhZGRpbmcnLCB0aGlzLnBhZGRpbmcpXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdib3JkZXInLCB0aGlzLmJvcmRlcilcclxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2JvcmRlci1yYWRpdXMnLCB0aGlzWydib3JkZXItcmFkaXVzJ10pXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdib3gtc2hhZG93JywgdGhpc1snYm94LXNoYWRvdyddKVxyXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnZm9udC1mYW1pbHknLCB0aGlzWydmb250LWZhbWlseSddKVxyXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxyXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgncG9pbnRlci1ldmVudHMnLCAnbm9uZScpXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdvcGFjaXR5JywgJzAnKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBTaG93IHRoZSB0b29sdGlwICovXHJcbiAgICBzaG93KCkge1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICB0aGlzLnRvb2x0aXAudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRoaXMudHJhbnNpdGlvbkR1cmF0aW9uKS5zdHlsZSgnb3BhY2l0eScsIDEpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEhpZGUgdGhlIHRvb2x0aXAgKi9cclxuICAgIGhpZGUoKSB7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHRoaXMudG9vbHRpcC50cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy50cmFuc2l0aW9uRHVyYXRpb24pLnN0eWxlKCdvcGFjaXR5JywgMClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgY29udGVudCBvZiB0aGUgdG9vbHRpcC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXHJcbiAgICAgKi9cclxuICAgIGh0bWwoaHRtbCkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcC5odG1sKGh0bWwpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b29sdGlwIGF0IHRoZSBtb3VzZSBldmVudCBwb3NpdGlvbi5cclxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnRcclxuICAgICAqL1xyXG4gICAgc2V0UG9zaXRpb24oZXZlbnQpIHtcclxuICAgICAgICB0aGlzLnRvb2x0aXBcclxuICAgICAgICAgICAgLnN0eWxlKCdsZWZ0JywgZXZlbnQucGFnZVggKyB0aGlzLnhPZmZzZXQgKyAncHgnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ3RvcCcsIGV2ZW50LnBhZ2VZIC0gdGhpcy55T2Zmc2V0ICsgJ3B4JylcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG5cdG15Lm1vdXNlb3ZlciA9IGZ1bmN0aW9uIChldmVudCwgaHRtbCkge1xyXG5cdFx0aWYgKGh0bWwpIG15Lmh0bWwoaHRtbCk7XHJcblx0XHRteS5zZXRQb3NpdGlvbihldmVudCk7XHJcblx0XHRteS5zaG93KClcclxuXHRcdC8vdGhpcy5lbnN1cmVUb29sdGlwT25TY3JlZW4oKTtcclxuXHR9O1xyXG5cdFxyXG5cdG15Lm1vdXNlbW92ZSA9IGZ1bmN0aW9uIChldmVudCkge1xyXG5cdFx0bXkuc2V0UG9zaXRpb24oZXZlbnQpO1xyXG5cdFx0Ly90aGlzLmVuc3VyZVRvb2x0aXBPblNjcmVlbigpO1xyXG5cdH07XHJcblx0XHJcblx0bXkubW91c2VvdXQgPSBmdW5jdGlvbiAoKSB7XHJcblx0XHRteS5oaWRlKCk7XHJcblx0fTsqL1xyXG5cclxuICAgIHN0eWxlKGssIHYpIHtcclxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gdGhpcy50b29sdGlwLnN0eWxlKGspXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKGssIHYpXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBhdHRyKGssIHYpIHtcclxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gdGhpcy50b29sdGlwLmF0dHIoaylcclxuICAgICAgICB0aGlzLnRvb2x0aXAuYXR0cihrLCB2KVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZW5zdXJlVG9vbHRpcE9uU2NyZWVuXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUHJldmVudHMgdGhlIHRvb2x0aXAgZnJvbSBvdmVyZmxvd2luZyBvZmYgc2NyZWVuXHJcbiAgICAgKi9cclxuICAgIC8qbXkuZW5zdXJlVG9vbHRpcE9uU2NyZWVuID0gZnVuY3Rpb24gKCkge1xyXG5cdFx0Ly8gVE9ETzogcGFyZW50IG5lZWRzIHRvIGJlIHRoZSBhbGwtZW5jb21wYXNzaW5nIGNvbnRhaW5lciwgbm90IHRoZSBtYXAgU1ZHIGlkIG90aGVyd2lzZSBpdCBqdXN0IHVzZXMgdGhlIGxhc3QgU1ZHIHdoaWNoIHdpbGwgYmUgYW4gaW5zZXQgU1ZHLlxyXG5cdFx0bGV0IHBhcmVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbmZpZy5wYXJlbnRDb250YWluZXJJZCk7XHJcblx0XHRsZXQgYmJveCA9IHBhcmVudC5nZXRCQm94KCk7XHJcblx0XHRsZXQgcGFyZW50V2lkdGggPSBiYm94LndpZHRoO1xyXG5cdFx0bGV0IHBhcmVudEhlaWdodCA9IGJib3guaGVpZ2h0O1xyXG5cdFx0bGV0IG5vZGUgPSB0b29sdGlwLm5vZGUoKTtcclxuXHRcdC8vdG9vIGZhciByaWdodFxyXG5cdFx0aWYgKG5vZGUub2Zmc2V0TGVmdCA+IHBhcmVudFdpZHRoIC0gbm9kZS5jbGllbnRXaWR0aCkge1xyXG5cdFx0XHRub2RlLnN0eWxlLmxlZnQgPSBub2RlLm9mZnNldExlZnQgLSAobm9kZS5jbGllbnRXaWR0aCArIGNvbmZpZy54T2Zmc2V0ICogMikgKyBcInB4XCI7XHJcblx0XHJcblx0XHR9XHJcblx0XHQvL3RvbyBmYXIgZG93blxyXG5cdFx0aWYgKG5vZGUub2Zmc2V0VG9wICsgbm9kZS5jbGllbnRIZWlnaHQgPiBwYXJlbnRIZWlnaHQpIHtcclxuXHRcdFx0bm9kZS5zdHlsZS50b3AgPSBub2RlLm9mZnNldFRvcCAtIChub2RlLmNsaWVudEhlaWdodCArIGNvbmZpZy55T2Zmc2V0ICogMikgKyBcInB4XCI7XHJcblx0XHR9XHJcblx0XHJcblx0fSovXHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG4vKiogQHR5cGVkZWYge3sgZGltczogb2JqZWN0LCBjcnM6IHN0cmluZywgdGlsZVNpemVDZWxsOiBudW1iZXIsIG9yaWdpblBvaW50OiB7eDpudW1iZXIseTpudW1iZXJ9LCByZXNvbHV0aW9uR2VvOiBudW1iZXIsIHRpbGluZ0JvdW5kczppbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkVudmVsb3BlIH19IEdyaWRJbmZvICovXHJcblxyXG5pbXBvcnQgeyBjc3YgfSBmcm9tICdkMy1mZXRjaCdcclxuaW1wb3J0IHsgRGF0YXNldENvbXBvbmVudCB9IGZyb20gJy4uL0RhdGFzZXRDb21wb25lbnQuanMnXHJcblxyXG4vKipcclxuICogQSBkYXRhc2V0IGNvbXBvc2VkIG9mIGEgc2luZ2xlIENTViBmaWxlIChub3QgdGlsZWQpLlxyXG4gKlxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ1NWR3JpZCBleHRlbmRzIERhdGFzZXRDb21wb25lbnQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiBUaGUgZGF0YXNldCByZXNvbHV0aW9uIGluIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICogQHBhcmFtIHt7cHJlcHJvY2Vzcz86KGZ1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCk6Ym9vbGVhbil9fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHVybCwgcmVzb2x1dGlvbiwgb3B0cyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIodXJsLCByZXNvbHV0aW9uLCBvcHRzKVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gKi9cclxuICAgICAgICB0aGlzLmNlbGxzID0gW11cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAcHJpdmF0ZSAgKi9cclxuICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ25vdExvYWRlZCdcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlcXVlc3QgZGF0YSB3aXRoaW4gYSBnZW9ncmFwaGljIGVudmVsb3BlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZXx1bmRlZmluZWR9IGVcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTp2b2lkfSByZWRyYXdcclxuICAgICAqL1xyXG4gICAgZ2V0RGF0YShlLCByZWRyYXcpIHtcclxuICAgICAgICAvL2NoZWNrIGlmIGRhdGEgYWxyZWFkeSBsb2FkZWRcclxuICAgICAgICBpZiAodGhpcy5pbmZvTG9hZGluZ1N0YXR1cyAhPSAnbm90TG9hZGVkJykgcmV0dXJuIHRoaXNcclxuXHJcbiAgICAgICAgLy9sb2FkIGRhdGFcclxuICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2xvYWRpbmcnXHJcbiAgICAgICAgOyhhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgY3N2KHRoaXMudXJsKVxyXG5cclxuICAgICAgICAgICAgICAgIC8vY29udmVydCBjb29yZGluYXRlcyBpbiBudW1iZXJzXHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGMueCA9ICtjLnhcclxuICAgICAgICAgICAgICAgICAgICBjLnkgPSArYy55XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9wcmVwcm9jZXNzL2ZpbHRlclxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJlcHJvY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMgPSBbXVxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0aGlzLnByZXByb2Nlc3MoYylcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMucHVzaChjKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxscyA9IGRhdGFcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL1RPRE8gY2hlY2sgaWYgcmVkcmF3IGlzIG5lY2Vzc2FyeVxyXG4gICAgICAgICAgICAgICAgLy90aGF0IGlzIGlmIHRoZSBkYXRhc2V0IGJlbG9uZ3MgdG8gYSBsYXllciB3aGljaCBpcyB2aXNpYmxlIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWxcclxuXHJcbiAgICAgICAgICAgICAgICAvL2V4ZWN1dGUgdGhlIGNhbGxiYWNrLCB1c3VhbGx5IGEgZHJhdyBmdW5jdGlvblxyXG4gICAgICAgICAgICAgICAgaWYgKHJlZHJhdykgcmVkcmF3KClcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2xvYWRlZCdcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIC8vbWFyayBhcyBmYWlsZWRcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jZWxscyA9IFtdXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSgpXHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWxsIHRoZSB2aWV3IGNhY2hlIHdpdGggYWxsIGNlbGxzIHdoaWNoIGFyZSB3aXRoaW4gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkVudmVsb3BlfSBleHRHZW9cclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICB1cGRhdGVWaWV3Q2FjaGUoZXh0R2VvKSB7XHJcbiAgICAgICAgLy9kYXRhIG5vdCBsb2FkZWQgeWV0XHJcbiAgICAgICAgaWYgKCF0aGlzLmNlbGxzKSByZXR1cm5cclxuXHJcbiAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZSA9IFtdXHJcbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHRoaXMuY2VsbHMpIHtcclxuICAgICAgICAgICAgaWYgKCtjZWxsLnggKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueE1pbikgY29udGludWVcclxuICAgICAgICAgICAgaWYgKCtjZWxsLnggLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueE1heCkgY29udGludWVcclxuICAgICAgICAgICAgaWYgKCtjZWxsLnkgKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueU1pbikgY29udGludWVcclxuICAgICAgICAgICAgaWYgKCtjZWxsLnkgLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueU1heCkgY29udGludWVcclxuICAgICAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZS5wdXNoKGNlbGwpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuLyoqXHJcbiAqIEEgZ3JpZCB0aWxlLlxyXG4gKlxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgR3JpZFRpbGUge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxscyBUaGUgdGlsZSBjZWxscy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4VCBUaGUgWCBwb3NpdGlvbiBvZiB0aGUgdGlsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5VCBUaGUgWSBwb3NpdGlvbiBvZiB0aGUgdGlsZS5cclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9DU1ZHcmlkXCIpLkdyaWRJbmZvfSBncmlkSW5mbyBUaGUgZ3JpZCBpbmZvIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoY2VsbHMsIHhULCB5VCwgZ3JpZEluZm8pIHtcclxuICAgICAgICAvKiogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSAqL1xyXG4gICAgICAgIHRoaXMuY2VsbHMgPSBjZWxsc1xyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMueCA9IHhUXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy55ID0geVRcclxuXHJcbiAgICAgICAgY29uc3QgciA9IGdyaWRJbmZvLnJlc29sdXRpb25HZW9cclxuICAgICAgICBjb25zdCBzID0gZ3JpZEluZm8udGlsZVNpemVDZWxsXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZX0gKi9cclxuICAgICAgICB0aGlzLmV4dEdlbyA9IHtcclxuICAgICAgICAgICAgeE1pbjogZ3JpZEluZm8ub3JpZ2luUG9pbnQueCArIHIgKiBzICogdGhpcy54LFxyXG4gICAgICAgICAgICB4TWF4OiBncmlkSW5mby5vcmlnaW5Qb2ludC54ICsgciAqIHMgKiAodGhpcy54ICsgMSksXHJcbiAgICAgICAgICAgIHlNaW46IGdyaWRJbmZvLm9yaWdpblBvaW50LnkgKyByICogcyAqIHRoaXMueSxcclxuICAgICAgICAgICAgeU1heDogZ3JpZEluZm8ub3JpZ2luUG9pbnQueSArIHIgKiBzICogKHRoaXMueSArIDEpLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9jb252ZXJ0IGNlbGwgY29vcmRpbmF0ZXMgaW50byBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXNcclxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIHRoaXMuY2VsbHMpIHtcclxuICAgICAgICAgICAgY2VsbC54ID0gdGhpcy5leHRHZW8ueE1pbiArIGNlbGwueCAqIHJcclxuICAgICAgICAgICAgY2VsbC55ID0gdGhpcy5leHRHZW8ueU1pbiArIGNlbGwueSAqIHJcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG4vKiogQHR5cGVkZWYge3sgZGltczogb2JqZWN0LCBjcnM6IHN0cmluZywgdGlsZVNpemVDZWxsOiBudW1iZXIsIG9yaWdpblBvaW50OiB7eDpudW1iZXIseTpudW1iZXJ9LCByZXNvbHV0aW9uR2VvOiBudW1iZXIsIHRpbGluZ0JvdW5kczppbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkVudmVsb3BlLCBmb3JtYXQ6aW1wb3J0KFwiLi4vRGF0YXNldENvbXBvbmVudFwiKS5Gb3JtYXQgfX0gR3JpZEluZm8gKi9cclxuXHJcbi8vIGludGVybmFsXHJcbmltcG9ydCB7IEdyaWRUaWxlIH0gZnJvbSAnLi9HcmlkVGlsZS5qcydcclxuaW1wb3J0IHsgQXBwIH0gZnJvbSAnLi4vQXBwLmpzJ1xyXG5pbXBvcnQgeyBEYXRhc2V0Q29tcG9uZW50IH0gZnJvbSAnLi4vRGF0YXNldENvbXBvbmVudC5qcydcclxuaW1wb3J0IHsgbW9uaXRvciwgbW9uaXRvckR1cmF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvVXRpbHMuanMnXHJcblxyXG4vLyBleHRlcm5hbFxyXG5pbXBvcnQgeyBqc29uLCBjc3YgfSBmcm9tICdkMy1mZXRjaCdcclxuaW1wb3J0IHsgdGFibGVGcm9tSVBDIH0gZnJvbSAnYXBhY2hlLWFycm93J1xyXG5cclxuLyoqXHJcbiAqIEEgdGlsZWQgZGF0YXNldCwgY29tcG9zZWQgb2YgQ1NWIChvciBwYXJxdWV0KSB0aWxlcy5cclxuICpcclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRpbGVkR3JpZCBleHRlbmRzIERhdGFzZXRDb21wb25lbnQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXHJcbiAgICAgKiBAcGFyYW0ge0FwcH0gYXBwIFRoZSBhcHBsaWNhdGlvbi5cclxuICAgICAqIEBwYXJhbSB7e3ByZXByb2Nlc3M/OihmdW5jdGlvbihpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGwpOmJvb2xlYW4pLCByZWFkUGFycXVldEZ1bj86RnVuY3Rpb24gfX0gb3B0c1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3Rvcih1cmwsIGFwcCwgb3B0cyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIodXJsLCAwLCBvcHRzKVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgYXBwIGJlaW5nIHVzZWQuXHJcbiAgICAgICAgICogQHR5cGUge0FwcH1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFwcCA9IGFwcFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZ3JpZCBpbmZvIG9iamVjdCwgZnJvbSB0aGUgaW5mby5qc29uIGZpbGUuXHJcbiAgICAgICAgICogIEB0eXBlIHtHcmlkSW5mbyB8IHVuZGVmaW5lZH1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqICAqL1xyXG4gICAgICAgIHRoaXMuaW5mbyA9IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBwcml2YXRlICAqL1xyXG4gICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnbm90TG9hZGVkJ1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY2FjaGUgb2YgdGhlIGxvYWRlZCB0aWxlcy4gSXQgaXMgZG91YmxlIGluZGV4ZWQ6IGJ5IHhUIGFuZCB0aGVuIHlULlxyXG4gICAgICAgICAqIEV4YW1wbGU6IHRoaXMuY2FjaGVbeFRdW3lUXSByZXR1cm5zIHRoZSB0aWxlIGF0IFt4VF1beVRdIGxvY2F0aW9uLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cclxuICAgICAgICAgKiAqL1xyXG4gICAgICAgIHRoaXMuY2FjaGUgPSB7fVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAdHlwZSB7RnVuY3Rpb258dW5kZWZpbmVkfVxyXG4gICAgICAgICAqIEBwcml2YXRlICAqL1xyXG4gICAgICAgIHRoaXMucmVhZFBhcnF1ZXRGdW4gPSBvcHRzLnJlYWRQYXJxdWV0RnVuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkIHRoZSBpbmZvLmpzb24gZnJvbSB0aGUgdXJsLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTp2b2lkfSBjYWxsYmFja1xyXG4gICAgICogQHJldHVybnMgdGhpc1xyXG4gICAgICovXHJcbiAgICBsb2FkSW5mbyhjYWxsYmFjaykge1xyXG4gICAgICAgIGlmICghdGhpcy5pbmZvICYmIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPT09ICdub3RMb2FkZWQnKSB7XHJcbiAgICAgICAgICAgIDsoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQganNvbih0aGlzLnVybCArICdpbmZvLmpzb24nKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5mbyA9IGRhdGFcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc29sdXRpb24gPSBkYXRhLnJlc29sdXRpb25HZW9cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2xvYWRlZCdcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKClcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9tYXJrIGFzIGZhaWxlZFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSgpXHJcbiAgICAgICAgfSBlbHNlIGlmIChjYWxsYmFjayAmJiAodGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9PT0gJ2xvYWRlZCcgfHwgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9PT0gJ2ZhaWxlZCcpKVxyXG4gICAgICAgICAgICBjYWxsYmFjaygpXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgYSB0aWxpbmcgZW52ZWxvcGUgZnJvbSBhIGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cclxuICAgICAqIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRvIHVzZSB0byBrbm93IHdoaWNoIHRpbGVzIHRvIGRvd25sb2FkIGZvciBhIGdlb2dyYXBoaWNhbCB2aWV3LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZX0gZVxyXG4gICAgICogQHJldHVybnMge2ltcG9ydChcIi4uL0RhdGFzZXRcIikuRW52ZWxvcGV8dW5kZWZpbmVkfVxyXG4gICAgICovXHJcbiAgICBnZXRUaWxpbmdFbnZlbG9wZShlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmluZm8pIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkSW5mbygoKSA9PiB7fSlcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwbyA9IHRoaXMuaW5mby5vcmlnaW5Qb2ludCxcclxuICAgICAgICAgICAgciA9IHRoaXMuaW5mby5yZXNvbHV0aW9uR2VvLFxyXG4gICAgICAgICAgICBzID0gdGhpcy5pbmZvLnRpbGVTaXplQ2VsbFxyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB4TWluOiBNYXRoLmZsb29yKChlLnhNaW4gLSBwby54KSAvIChyICogcykpLFxyXG4gICAgICAgICAgICB4TWF4OiBNYXRoLmZsb29yKChlLnhNYXggLSBwby54KSAvIChyICogcykpLFxyXG4gICAgICAgICAgICB5TWluOiBNYXRoLmZsb29yKChlLnlNaW4gLSBwby55KSAvIChyICogcykpLFxyXG4gICAgICAgICAgICB5TWF4OiBNYXRoLmZsb29yKChlLnlNYXggLSBwby55KSAvIChyICogcykpLFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlcXVlc3QgZGF0YSB3aXRoaW4gYSBnZW9ncmFwaGljIGVudmVsb3BlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZX0gZXh0R2VvXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6dm9pZH0gcmVkcmF3RnVuXHJcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cclxuICAgICAqL1xyXG4gICAgZ2V0RGF0YShleHRHZW8sIHJlZHJhd0Z1bikge1xyXG4gICAgICAgIC8vVE9ETyBlbXB0eSBjYWNoZSB3aGVuIGl0IGdldHMgdG9vIGJpZyA/XHJcblxyXG4gICAgICAgIC8vY2hlY2sgaWYgaW5mbyBoYXMgYmVlbiBsb2FkZWRcclxuICAgICAgICBpZiAoIXRoaXMuaW5mbykgcmV0dXJuIHRoaXNcclxuXHJcbiAgICAgICAgLy90aWxlcyB3aXRoaW4gdGhlIHNjb3BlXHJcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkVudmVsb3BlfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICBjb25zdCB0YiA9IHRoaXMuZ2V0VGlsaW5nRW52ZWxvcGUoZXh0R2VvKVxyXG4gICAgICAgIGlmICghdGIpIHJldHVybiB0aGlzXHJcblxyXG4gICAgICAgIC8vZ3JpZCBib3VuZHNcclxuICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL0RhdGFzZXRcIikuRW52ZWxvcGV9ICovXHJcbiAgICAgICAgY29uc3QgZ2IgPSB0aGlzLmluZm8udGlsaW5nQm91bmRzXHJcblxyXG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IHRoaXMuaW5mby5mb3JtYXRcclxuXHJcbiAgICAgICAgZm9yIChsZXQgeFQgPSBNYXRoLm1heCh0Yi54TWluLCBnYi54TWluKTsgeFQgPD0gTWF0aC5taW4odGIueE1heCwgZ2IueE1heCk7IHhUKyspIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgeVQgPSBNYXRoLm1heCh0Yi55TWluLCBnYi55TWluKTsgeVQgPD0gTWF0aC5taW4odGIueU1heCwgZ2IueU1heCk7IHlUKyspIHtcclxuICAgICAgICAgICAgICAgIC8vcHJlcGFyZSBjYWNoZVxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3hUXSkgdGhpcy5jYWNoZVt4VF0gPSB7fVxyXG5cclxuICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgdGlsZSBleGlzdHMgaW4gdGhlIGNhY2hlXHJcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge0dyaWRUaWxlfSAqL1xyXG4gICAgICAgICAgICAgICAgbGV0IHRpbGUgPSB0aGlzLmNhY2hlW3hUXVt5VF1cclxuICAgICAgICAgICAgICAgIGlmICh0aWxlKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgICAgIC8vbWFyayB0aWxlIGFzIGxvYWRpbmdcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbeFRdW3lUXSA9ICdsb2FkaW5nJ1xyXG4gICAgICAgICAgICAgICAgOyhhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9yZXF1ZXN0IHRpbGVcclxuICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSAgKi9cclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2VsbHNcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3JtYXQgfHwgZm9ybWF0ID09PSAnQ1NWJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgY3N2KHRoaXMudXJsICsgeFQgKyAnLycgKyB5VCArICcuY3N2JylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcqKiogVGlsZWRHcmlkIHBhcnNlIHN0YXJ0JylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByZXByb2Nlc3MvZmlsdGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHMgPSBbXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0aGlzLnByZXByb2Nlc3MoYylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxzLnB1c2goYylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxzID0gZGF0YVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJ3ByZXByb2Nlc3MgLyBmaWx0ZXInKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ1BBUlFVRVQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmVhZFBhcnF1ZXRGdW4pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZWFkUGFycXVldCBmdW5jdGlvbiBuZWVkZWQgZm9yIHBhcnF1ZXQgZGF0YXNldCcpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKHRoaXMudXJsICsgeFQgKyAnLycgKyB5VCArICcucGFycXVldCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJxdWV0VWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGF3YWl0IHJlc3AuYXJyYXlCdWZmZXIoKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycm93VWludDhBcnJheSA9IHRoaXMucmVhZFBhcnF1ZXRGdW4ocGFycXVldFVpbnQ4QXJyYXkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGFibGVGcm9tSVBDKGFycm93VWludDhBcnJheSlcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxscyA9IFtdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IGNlbGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjID0gZS50b0pTT04oKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByZXByb2Nlc3MvZmlsdGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJlcHJvY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiID0gdGhpcy5wcmVwcm9jZXNzKGMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiID09IGZhbHNlKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxscy5wdXNoKGMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHMucHVzaChjKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcignVGlsZWQgZm9ybWF0IG5vdCBzdXBwb3J0ZWQ6ICcgKyBmb3JtYXQpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9tYXJrIGFzIGZhaWxlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3hUXVt5VF0gPSAnZmFpbGVkJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vc3RvcmUgdGlsZSBpbiBjYWNoZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbmZvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RpbGUgaW5mbyBpbmtub3duJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbGVfID0gbmV3IEdyaWRUaWxlKGNlbGxzLCB4VCwgeVQsIHRoaXMuaW5mbylcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3hUXVt5VF0gPSB0aWxlX1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCdzdG9yYWdlJylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy9pZiBubyByZWRyYXcgaXMgc3BlY2lmaWVkLCB0aGVuIGxlYXZlXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWRyYXdGdW4pIHJldHVyblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIHJlZHJhdyBpcyByZWFsbHkgbmVlZGVkLCB0aGF0IGlzIGlmOlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyAxLiB0aGUgZGF0YXNldCBiZWxvbmdzIHRvIGEgbGF5ZXIgd2hpY2ggaXMgdmlzaWJsZSBhdCB0aGUgY3VycmVudCB6b29tIGxldmVsXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZHJhdyA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgLy9nbyB0aHJvdWdoIHRoZSBsYXllcnNcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB6ZiA9IHRoaXMuYXBwLmdldFpvb21GYWN0b3IoKVxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGF5IG9mIHRoaXMuYXBwLmxheWVycykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxheS52aXNpYmxlKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF5LmdldERhdGFzZXRDb21wb25lbnQoemYpICE9IHRoaXMpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZm91bmQgb25lIGxheWVyLiBObyBuZWVkIHRvIHNlZWsgbW9yZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVkcmF3ID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCdjaGVjayByZWRyYXcgMScpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVkcmF3KSByZXR1cm5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gMi4gdGhlIHRpbGUgaXMgd2l0aGluIHRoZSB2aWV3LCB0aGF0IGlzIGl0cyBnZW8gZW52ZWxvcGUgaW50ZXJzZWN0cyB0aGUgdmlld2VyIGdlbyBlbnZlbG9wZS5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnYgPSB0aGlzLmFwcC51cGRhdGVFeHRlbnRHZW8oKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudlQgPSB0aWxlXy5leHRHZW9cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW52LnhNYXggPD0gZW52VC54TWluKSByZXR1cm5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW52LnhNaW4gPj0gZW52VC54TWF4KSByZXR1cm5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW52LnlNYXggPD0gZW52VC55TWluKSByZXR1cm5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW52LnlNaW4gPj0gZW52VC55TWF4KSByZXR1cm5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignY2hlY2sgcmVkcmF3IDInKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyoqKiBUaWxlZEdyaWQgcGFyc2UgZW5kJylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy9yZWRyYXdcclxuICAgICAgICAgICAgICAgICAgICByZWRyYXdGdW4oKVxyXG4gICAgICAgICAgICAgICAgfSkoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWxsIHRoZSB2aWV3IGNhY2hlIHdpdGggYWxsIGNlbGxzIHdoaWNoIGFyZSB3aXRoaW4gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXHJcbiAgICAgKiBAYWJzdHJhY3RcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZX0gZXh0R2VvXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgdXBkYXRlVmlld0NhY2hlKGV4dEdlbykge1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZSA9IFtdXHJcblxyXG4gICAgICAgIC8vY2hlY2sgaWYgaW5mbyBoYXMgYmVlbiBsb2FkZWRcclxuICAgICAgICBpZiAoIXRoaXMuaW5mbykgcmV0dXJuXHJcblxyXG4gICAgICAgIC8vdGlsZXMgd2l0aGluIHRoZSBzY29wZVxyXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZXx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgY29uc3QgdGIgPSB0aGlzLmdldFRpbGluZ0VudmVsb3BlKGV4dEdlbylcclxuICAgICAgICBpZiAoIXRiKSByZXR1cm5cclxuXHJcbiAgICAgICAgLy9ncmlkIGJvdW5kc1xyXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZX0gKi9cclxuICAgICAgICBjb25zdCBnYiA9IHRoaXMuaW5mby50aWxpbmdCb3VuZHNcclxuXHJcbiAgICAgICAgZm9yIChsZXQgeFQgPSBNYXRoLm1heCh0Yi54TWluLCBnYi54TWluKTsgeFQgPD0gTWF0aC5taW4odGIueE1heCwgZ2IueE1heCk7IHhUKyspIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3hUXSkgY29udGludWVcclxuICAgICAgICAgICAgZm9yIChsZXQgeVQgPSBNYXRoLm1heCh0Yi55TWluLCBnYi55TWluKTsgeVQgPD0gTWF0aC5taW4odGIueU1heCwgZ2IueU1heCk7IHlUKyspIHtcclxuICAgICAgICAgICAgICAgIC8vZ2V0IHRpbGVcclxuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7R3JpZFRpbGV9ICovXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5jYWNoZVt4VF1beVRdXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRpbGUgfHwgdHlwZW9mIHRpbGUgPT09ICdzdHJpbmcnKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgICAgIC8vZ2V0IGNlbGxzXHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuY2VsbHNWaWV3Q2FjaGUgPSB0aGlzLmNlbGxzVmlld0NhY2hlLmNvbmNhdCh0aWxlLmNlbGxzKVxyXG5cclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiB0aWxlLmNlbGxzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCtjZWxsLnggKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueE1pbikgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICBpZiAoK2NlbGwueCAtIHRoaXMucmVzb2x1dGlvbiA+IGV4dEdlby54TWF4KSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC55ICsgdGhpcy5yZXNvbHV0aW9uIDwgZXh0R2VvLnlNaW4pIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCtjZWxsLnkgLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueU1heCkgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlLnB1c2goY2VsbClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL0xlZ2VuZC5qcydcclxuXHJcbi8qKlxyXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBjb2xvciBjYXRlZ3Jvcmllcy5cclxuICpcclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIENvbG9yQ2F0ZWdvcnlMZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xyXG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvL2NvbC9jYXRlZ29yaWVzIGFycmF5LCBpbiBkaXNwbGF5IG9yZGVyXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPEFycmF5LjxzdHJpbmc+Pn0gKi9cclxuICAgICAgICB0aGlzLmNvbENhdCA9IG9wdHMuY29sQ2F0IHx8IFtbJ2dyYXknLCAnLSddXVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtpbXBvcnQoXCIuLi9TdHlsZVwiKS5TaGFwZX0gKi9cclxuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAnY2lyY2xlJ1xyXG4gICAgICAgIHRoaXMuZGltZW5zaW9uID0gb3B0cy5kaW1lbnNpb24gfHwgeyByOiA4IH1cclxuICAgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gb3B0cy5zdHJva2VDb2xvciB8fCAnZ3JheSdcclxuICAgICAgICB0aGlzLnN0cm9rZVdpZHRoID0gb3B0cy5zdHJva2VXaWR0aCB8fCAxXHJcblxyXG4gICAgICAgIHRoaXMudGl0bGUgPSBvcHRzLnRpdGxlXHJcbiAgICAgICAgdGhpcy50aXRsZUZvbnRTaXplID0gb3B0cy50aXRsZUZvbnRTaXplIHx8ICcwLjhlbSdcclxuICAgICAgICB0aGlzLnRpdGxlRm9udFdlaWdodCA9IG9wdHMudGl0bGVGb250V2VpZ2h0IHx8ICdib2xkJ1xyXG5cclxuICAgICAgICAvL2xhYmVsXHJcbiAgICAgICAgdGhpcy5sYWJlbEZvbnRTaXplID0gb3B0cy5sYWJlbEZvbnRTaXplIHx8ICcwLjhlbSdcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7eyBzdHlsZTogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3R5bGUsIHI6IG51bWJlciwgemY6IG51bWJlciwgc1NpemU6IGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXQsIHNDb2xvcjogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCB9fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZShvcHRzKSB7XHJcbiAgICAgICAgLy9jbGVhclxyXG4gICAgICAgIHRoaXMuZGl2LnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXHJcblxyXG4gICAgICAgIC8vYnVpbGRcclxuXHJcbiAgICAgICAgLy90aXRsZVxyXG4gICAgICAgIGlmICh0aGlzLnRpdGxlKVxyXG4gICAgICAgICAgICB0aGlzLmRpdlxyXG4gICAgICAgICAgICAgICAgLmFwcGVuZCgnZGl2JylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy50aXRsZUZvbnRTaXplKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsIHRoaXMudGl0bGVGb250V2VpZ2h0KVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdtYXJnaW4tYm90dG9tJywgJzdweCcpXHJcbiAgICAgICAgICAgICAgICAudGV4dCh0aGlzLnRpdGxlKVxyXG5cclxuICAgICAgICAvL2NhdGVnb3JpZXNcclxuICAgICAgICBjb25zdCBuYiA9IHRoaXMuY29sQ2F0Lmxlbmd0aFxyXG4gICAgICAgIGlmIChuYiA9PSAwKSByZXR1cm5cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhdCA9IHRoaXMuY29sQ2F0W2ldXHJcblxyXG4gICAgICAgICAgICAvL21ha2UgZGl2IGZvciBjYXRlZ29yeVxyXG4gICAgICAgICAgICBjb25zdCBkID0gdGhpcy5kaXYuYXBwZW5kKCdkaXYnKVxyXG4gICAgICAgICAgICAvL3RvIGVuYWJsZSB2ZXJ0aWNhbCBjZW50ZXJpbmdcclxuICAgICAgICAgICAgLy8uc3R5bGUoXCJwb3NpdGlvblwiLCBcInJlbGF0aXZlXCIpXHJcblxyXG4gICAgICAgICAgICBjb25zdCBzdyA9IHRoaXMuc3Ryb2tlV2lkdGhcclxuXHJcbiAgICAgICAgICAgIC8vZHJhdyBncmFwaGljIGVsZW1lbnQ6IGJveCAvIGNpcmNsZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5zaGFwZSA9PT0gJ3NxdWFyZScpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGggPSB0aGlzLmRpbWVuc2lvbi5oIHx8IDE1XHJcbiAgICAgICAgICAgICAgICBjb25zdCB3ID0gdGhpcy5kaW1lbnNpb24udyB8fCAyMFxyXG4gICAgICAgICAgICAgICAgZC5hcHBlbmQoJ2RpdicpXHJcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3N2ZycpXHJcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgdyArIDIgKiBzdylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaCArIDIgKiBzdylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgncmVjdCcpXHJcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCBzdylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cigneScsIHN3KVxyXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHcpXHJcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGgpXHJcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgY2F0WzBdKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5zdHJva2VDb2xvcilcclxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIHRoaXMuc3Ryb2tlV2lkdGgpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaGFwZSA9PT0gJ2NpcmNsZScpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLmRpbWVuc2lvbi5yIHx8IDhcclxuICAgICAgICAgICAgICAgIGNvbnN0IGggPSAyICogciArIDIgKiBzd1xyXG4gICAgICAgICAgICAgICAgZC5hcHBlbmQoJ2RpdicpXHJcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3N2ZycpXHJcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgaClcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnY2lyY2xlJylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignY3gnLCByICsgc3cpXHJcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2N5JywgciArIHN3KVxyXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdyJywgcilcclxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCBjYXRbMF0pXHJcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLnN0cm9rZUNvbG9yKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaGFwZTonICsgdGhpcy5zaGFwZSlcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy93cml0ZSBsYWJlbCB0ZXh0XHJcbiAgICAgICAgICAgIGQuYXBwZW5kKCdkaXYnKVxyXG4gICAgICAgICAgICAgICAgLy9zaG93IG9uIHJpZ2h0IG9mIGdyYXBoaWNcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxyXG5cclxuICAgICAgICAgICAgICAgIC8vY2VudGVyIHZlcnRpY2FsbHlcclxuICAgICAgICAgICAgICAgIC8vLnN0eWxlKFwicG9zaXRpb25cIiwgXCJhYnNvbHV0ZVwiKS5zdHlsZShcInRvcFwiLCBcIjBcIikuc3R5bGUoXCJib3R0b21cIiwgXCIwXCIpXHJcblxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdwYWRkaW5nLWxlZnQnLCAnNXB4JylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5sYWJlbEZvbnRTaXplKVxyXG4gICAgICAgICAgICAgICAgLnRleHQoY2F0WzFdKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbi8vaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xyXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9MZWdlbmQuanMnXHJcbi8vaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSBcImQzLWZvcm1hdFwiO1xyXG5cclxuLyoqXHJcbiAqIEEgbGVnZW5kIGVsZW1lbnQgZm9yIGRpc2NyZXRlIGNvbG9yIHN0eWxlLlxyXG4gKiBJbnNwaXJhdGlvbjogaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BkMy9jb2xvci1sZWdlbmRcclxuICpcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIENvbG9yRGlzY3JldGVMZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xyXG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogQHByaXZhdGUgQHR5cGUge0FycmF5LjxBcnJheS48c3RyaW5nPj59ICovXHJcbiAgICAgICAgdGhpcy5jb2xvcnMgPSBvcHRzLmNvbG9yc1xyXG4gICAgICAgIC8qKiBAcHJpdmF0ZSBAdHlwZSB7QXJyYXkuPEFycmF5LjxzdHJpbmc+Pn0gKi9cclxuICAgICAgICB0aGlzLmJyZWFrc1RleHQgPSBvcHRzLmJyZWFrc1RleHRcclxuXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgMzAwXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAxNVxyXG5cclxuICAgICAgICB0aGlzLnRpdGxlID0gb3B0cy50aXRsZVxyXG4gICAgICAgIHRoaXMudGl0bGVGb250U2l6ZSA9IG9wdHMudGl0bGVGb250U2l6ZSB8fCAnMC44ZW0nXHJcbiAgICAgICAgdGhpcy50aXRsZUZvbnRXZWlnaHQgPSBvcHRzLnRpdGxlRm9udFdlaWdodCB8fCAnYm9sZCdcclxuXHJcbiAgICAgICAgdGhpcy50aWNrU2l6ZSA9IG9wdHMudGlja1NpemUgfHwgM1xyXG5cclxuICAgICAgICAvL2xhYmVsXHJcbiAgICAgICAgdGhpcy5sYWJlbEZvbnRTaXplID0gb3B0cy5sYWJlbEZvbnRTaXplIHx8ICcwLjhlbSdcclxuICAgICAgICB0aGlzLmludmVydCA9IG9wdHMuaW52ZXJ0XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge3sgc3R5bGU6IGltcG9ydChcIi4uL1N0eWxlXCIpLlN0eWxlLCByOiBudW1iZXIsIHpmOiBudW1iZXIsIHNTaXplOiBpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0LCBzQ29sb3I6IGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXQgfX0gb3B0c1xyXG4gICAgICovXHJcbiAgICB1cGRhdGUob3B0cykge1xyXG4gICAgICAgIC8vY2xlYXJcclxuICAgICAgICB0aGlzLmRpdi5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxyXG5cclxuICAgICAgICAvL2J1aWxkXHJcblxyXG4gICAgICAgIC8vdGl0bGVcclxuICAgICAgICBpZiAodGhpcy50aXRsZSlcclxuICAgICAgICAgICAgdGhpcy5kaXZcclxuICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2RpdicpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMudGl0bGVGb250U2l6ZSlcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCB0aGlzLnRpdGxlRm9udFdlaWdodClcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnbWFyZ2luLWJvdHRvbScsICc3cHgnKVxyXG4gICAgICAgICAgICAgICAgLnRleHQodGhpcy50aXRsZSlcclxuXHJcbiAgICAgICAgLy9jbGFzc2VzXHJcbiAgICAgICAgY29uc3QgbmIgPSB0aGlzLmNvbG9ycy5sZW5ndGhcclxuICAgICAgICBpZiAobmIgPT0gMCkgcmV0dXJuXHJcbiAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkdGggLyBuYlxyXG5cclxuICAgICAgICAvL21ha2Ugc3ZnIGVsZW1lbnRcclxuICAgICAgICBjb25zdCBzdmcgPSB0aGlzLmRpdlxyXG4gICAgICAgICAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgICAgICAgICAuYXR0cignd2lkdGgnLCB0aGlzLndpZHRoKVxyXG4gICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgdGhpcy5oZWlnaHQgKyB0aGlzLnRpY2tTaXplICsgMiArIDEwKVxyXG5cclxuICAgICAgICAvL2RyYXcgZ3JhcGhpYyBlbGVtZW50c1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmI7IGkrKykge1xyXG4gICAgICAgICAgICBzdmcuYXBwZW5kKCdyZWN0JylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgaSAqIHcpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIDApXHJcbiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB3KVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHRoaXMuaGVpZ2h0KVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgdGhpcy5jb2xvcnNbaV0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3RpY2sgbGluZVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbmI7IGkrKykge1xyXG4gICAgICAgICAgICBzdmcuYXBwZW5kKCdsaW5lJylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MScsIHcgKiBpKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kxJywgMClcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MicsIHcgKiBpKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kyJywgdGhpcy5oZWlnaHQgKyB0aGlzLnRpY2tTaXplKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAnYmxhY2snKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9sYWJlbHNcclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG5iOyBpKyspIHtcclxuICAgICAgICAgICAgLy9wcmVwYXJlIGxhYmVsXHJcbiAgICAgICAgICAgIHN2Zy5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ3RpY2tsYWJlbF8nICsgaSlcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgdyAqIGkpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIHRoaXMuaGVpZ2h0ICsgdGhpcy50aWNrU2l6ZSArIDIpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMubGFiZWxGb250U2l6ZSlcclxuICAgICAgICAgICAgICAgIC8vLnN0eWxlKFwiZm9udC13ZWlnaHRcIiwgXCJib2xkXCIpXHJcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtZmFtaWx5XCIsIFwiQXJpYWxcIilcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCBpID09IDAgPyAnc3RhcnQnIDogaSA9PSB0aGlzLnRpY2tzIC0gMSA/ICdlbmQnIDogJ21pZGRsZScpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2FsaWdubWVudC1iYXNlbGluZScsICd0b3AnKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdkb21pbmFudC1iYXNlbGluZScsICdoYW5naW5nJylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgncG9pbnRlci1ldmVudHMnLCAnbm9uZScpXHJcbiAgICAgICAgICAgICAgICAudGV4dCh0aGlzLmJyZWFrc1RleHRbaSAtIDFdKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbi8vaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xyXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9MZWdlbmQuanMnXHJcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2QzLWZvcm1hdCdcclxuXHJcbi8qKlxyXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBjb250aW51b3VzIGNvbG9yIHN0eWxlLlxyXG4gKiBJbnNwaXJhdGlvbjogaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BkMy9jb2xvci1sZWdlbmRcclxuICpcclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIENvbG9yTGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcclxuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgdGhpcy5jb2xvclJhbXAgPSBvcHRzLmNvbG9yUmFtcFxyXG5cclxuICAgICAgICAvL2Z1bmN0aW9uICh0WzAsMV0sIHIsIHMpIC0+IHYgKGZvciBsYWJlbCB0ZXh0KVxyXG4gICAgICAgIHRoaXMuZnVuID0gb3B0cy5mdW5cclxuXHJcbiAgICAgICAgdGhpcy50aXRsZSA9IG9wdHMudGl0bGVcclxuICAgICAgICB0aGlzLnRpY2tTaXplID0gb3B0cy50aWNrU2l6ZSB8fCA2XHJcbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgMzAwXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAxNVxyXG4gICAgICAgIHRoaXMubWFyZ2luID0gb3B0cy5tYXJnaW4gfHwgNVxyXG4gICAgICAgIHRoaXMudGlja3MgPSBvcHRzLnRpY2tzIHx8IE1hdGguZmxvb3IodGhpcy53aWR0aCAvIDUwKVxyXG4gICAgICAgIHRoaXMudGlja0Zvcm1hdCA9IG9wdHMudGlja0Zvcm1hdCB8fCAnLC4wZidcclxuICAgICAgICB0aGlzLnRpY2tVbml0ID0gb3B0cy50aWNrVW5pdFxyXG5cclxuICAgICAgICB0aGlzLmZvbnRTaXplID0gb3B0cy5mb250U2l6ZSB8fCAnMC44ZW0nXHJcbiAgICAgICAgdGhpcy5pbnZlcnQgPSBvcHRzLmludmVydFxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHt7IHN0eWxlOiBpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdHlsZSwgcjogbnVtYmVyLCB6ZjogbnVtYmVyLCBzU2l6ZTogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCwgc0NvbG9yOiBpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0IH19IG9wdHNcclxuICAgICAqL1xyXG4gICAgdXBkYXRlKG9wdHMpIHtcclxuICAgICAgICAvL2NvdWxkIGhhcHBlbiB3aGVuIGRhdGEgaXMgc3RpbGwgbG9hZGluZ1xyXG4gICAgICAgIGlmICghb3B0cy5zQ29sb3IpIHJldHVyblxyXG5cclxuICAgICAgICAvL2NsZWFyXHJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcclxuXHJcbiAgICAgICAgY29uc3QgdGl0bGVIZWlnaHQgPSAxMlxyXG5cclxuICAgICAgICBjb25zdCBzdmdXID0gdGhpcy53aWR0aCArIDIgKiB0aGlzLm1hcmdpblxyXG4gICAgICAgIGNvbnN0IHN2Z0ggPSB0aGlzLmhlaWdodCArIDMgKiB0aGlzLm1hcmdpbiArIHRpdGxlSGVpZ2h0ICsgdGhpcy50aWNrU2l6ZSArIDEwXHJcbiAgICAgICAgY29uc3Qgc3ZnID0gdGhpcy5kaXYuYXBwZW5kKCdzdmcnKS5hdHRyKCd3aWR0aCcsIHN2Z1cpLmF0dHIoJ2hlaWdodCcsIHN2Z0gpXHJcbiAgICAgICAgLy8gIDxyZWN0IHdpZHRoPVwiMzAwXCIgaGVpZ2h0PVwiMTAwXCIgc3R5bGU9XCJmaWxsOnJnYigwLDAsMjU1KTtzdHJva2Utd2lkdGg6MztzdHJva2U6cmdiKDAsMCwwKVwiIC8+XHJcblxyXG4gICAgICAgIC8vdGl0bGVcclxuICAgICAgICBzdmcuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgICAgICAgLmF0dHIoJ3gnLCB0aGlzLm1hcmdpbilcclxuICAgICAgICAgICAgLmF0dHIoJ3knLCB0aGlzLm1hcmdpbilcclxuICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnMC44ZW0nKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJ2JvbGQnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ2FsaWdubWVudC1iYXNlbGluZScsICd0b3AnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ2RvbWluYW50LWJhc2VsaW5lJywgJ2hhbmdpbmcnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxyXG4gICAgICAgICAgICAudGV4dCh0aGlzLnRpdGxlKVxyXG5cclxuICAgICAgICBjb25zdCBnID0gc3ZnXHJcbiAgICAgICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgdGhpcy5tYXJnaW4gKyAnICcgKyAoMiAqIHRoaXMubWFyZ2luICsgdGl0bGVIZWlnaHQpICsgJyknKVxyXG5cclxuICAgICAgICAvL2RyYXcgY29sb3IgYmFyXHJcbiAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkdGgsXHJcbiAgICAgICAgICAgIGggPSB0aGlzLmhlaWdodFxyXG4gICAgICAgIGNvbnN0IHN0ZXAgPSA1XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3OyBpICs9IHN0ZXApIHtcclxuICAgICAgICAgICAgbGV0IHQgPSBpIC8gKHcgLSAxKVxyXG4gICAgICAgICAgICBpZiAodGhpcy5pbnZlcnQpIHQgPSAxIC0gdFxyXG4gICAgICAgICAgICBnLmFwcGVuZCgncmVjdCcpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsIGkpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIDApXHJcbiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCBzdGVwKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGgpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCB0aGlzLmNvbG9yUmFtcCh0KSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50aWNrczsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0ID0gaSAvICh0aGlzLnRpY2tzIC0gMSlcclxuXHJcbiAgICAgICAgICAgIC8vdGljayBsaW5lXHJcbiAgICAgICAgICAgIGcuYXBwZW5kKCdsaW5lJylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MScsIHcgKiB0KVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kxJywgMClcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MicsIHcgKiB0KVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kyJywgaCArIHRoaXMudGlja1NpemUpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICdibGFjaycpXHJcblxyXG4gICAgICAgICAgICAvL3ByZXBhcmUgdGljayBsYWJlbFxyXG4gICAgICAgICAgICBnLmFwcGVuZCgndGV4dCcpXHJcbiAgICAgICAgICAgICAgICAuYXR0cignaWQnLCAndGlja2xhYmVsXycgKyBpKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCB3ICogdClcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgaCArIHRoaXMudGlja1NpemUgKyAyKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmZvbnRTaXplKVxyXG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJmb250LXdlaWdodFwiLCBcImJvbGRcIilcclxuICAgICAgICAgICAgICAgIC8vLnN0eWxlKFwiZm9udC1mYW1pbHlcIiwgXCJBcmlhbFwiKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsIGkgPT0gMCA/ICdzdGFydCcgOiBpID09IHRoaXMudGlja3MgLSAxID8gJ2VuZCcgOiAnbWlkZGxlJylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnYWxpZ25tZW50LWJhc2VsaW5lJywgJ3RvcCcpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2RvbWluYW50LWJhc2VsaW5lJywgJ2hhbmdpbmcnKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdwb2ludGVyLWV2ZW50cycsICdub25lJylcclxuICAgICAgICAgICAgLy8udGV4dChcIi1cIilcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdXBkYXRlIHRpY2sgbGFiZWxzXHJcblxyXG4gICAgICAgIC8vbGFiZWwgdGV4dCBmb3JtYXRcclxuICAgICAgICBjb25zdCBmID0gdGhpcy50aWNrRm9ybWF0ICYmIHRoaXMudGlja0Zvcm1hdCAhPSAndGV4dCcgPyBmb3JtYXQodGhpcy50aWNrRm9ybWF0KSA6ICh2KSA9PiB2XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRpY2tzOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHQgPSBpIC8gKHRoaXMudGlja3MgLSAxKVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuZnVuKHQsIG9wdHMuciwgb3B0cy5zQ29sb3IpXHJcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSAodiA/IGYodikgOiAnMCcpICsgKHRoaXMudGlja1VuaXQgPyB0aGlzLnRpY2tVbml0IDogJycpXHJcblxyXG4gICAgICAgICAgICAvL3RpY2sgbGFiZWxcclxuICAgICAgICAgICAgdGhpcy5kaXYuc2VsZWN0KCcjJyArICd0aWNrbGFiZWxfJyArIGkpLnRleHQodGV4dClcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9MZWdlbmQuanMnXHJcblxyXG4vKipcclxuICogQSBsZWdlbmQgZWxlbWVudCBmb3Igc2VnbWVudCBvcmllbnRhdGlvbi5cclxuICpcclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNlZ21lbnRPcmllbnRhdGlvbkxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XHJcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8vdGl0bGVcclxuICAgICAgICB0aGlzLnRpdGxlID0gb3B0cy50aXRsZVxyXG4gICAgICAgIHRoaXMudGl0bGVGb250U2l6ZSA9IG9wdHMudGl0bGVGb250U2l6ZSB8fCAnMC44ZW0nXHJcbiAgICAgICAgdGhpcy50aXRsZUZvbnRXZWlnaHQgPSBvcHRzLnRpdGxlRm9udFdlaWdodCB8fCAnYm9sZCdcclxuXHJcbiAgICAgICAgLy9leGFnZXJhdGlvblxyXG4gICAgICAgIHRoaXMuZXhhZ2dlcmF0aW9uRmFjdG9yID0gb3B0cy5leGFnZ2VyYXRpb25GYWN0b3IgfHwgMC41XHJcblxyXG4gICAgICAgIC8vY29sb3JcclxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAnZ3JheSdcclxuICAgICAgICAvL29yaWVudGF0aW9uXHJcbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IG9wdHMub3JpZW50YXRpb24gfHwgMFxyXG4gICAgICAgIC8vd2lkdGhcclxuICAgICAgICB0aGlzLndpZHRoUGl4ID0gb3B0cy53aWR0aFBpeCB8fCAzXHJcblxyXG4gICAgICAgIC8vbGFiZWxcclxuICAgICAgICB0aGlzLmxhYmVsRm9udFNpemUgPSBvcHRzLmxhYmVsRm9udFNpemUgfHwgJzAuOGVtJ1xyXG4gICAgICAgIHRoaXMubGFiZWxVbml0VGV4dCA9IG9wdHMubGFiZWxVbml0VGV4dCB8fCAnJ1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHt7IHN0eWxlOiBpbXBvcnQoXCIuLi9zdHlsZS9TZWdtZW50U3R5bGVcIikuU2VnbWVudFN0eWxlLCByOiBudW1iZXIsIHpmOiBudW1iZXIsIHNDb2xvcjogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCwgc0xlbmd0aDogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCwgc1dpZHRoOiBpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0IH19IG9wdHNcclxuICAgICAqL1xyXG4gICAgdXBkYXRlKG9wdHMpIHtcclxuICAgICAgICAvL2NvdWxkIGhhcHBlbiB3aGVuIGRhdGEgaXMgc3RpbGwgbG9hZGluZ1xyXG4gICAgICAgIGlmICghb3B0cy5zV2lkdGgpIHJldHVyblxyXG5cclxuICAgICAgICAvL2NsZWFyXHJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcclxuXHJcbiAgICAgICAgY29uc3QgZCA9IHRoaXMuZGl2LmFwcGVuZCgnZGl2JylcclxuXHJcbiAgICAgICAgLy90aXRsZVxyXG4gICAgICAgIGlmICh0aGlzLnRpdGxlKSB7XHJcbiAgICAgICAgICAgIGQuYXBwZW5kKCdkaXYnKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3RpdGxlJylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy50aXRsZUZvbnRTaXplKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsIHRoaXMudGl0bGVGb250V2VpZ2h0KVxyXG4gICAgICAgICAgICAgICAgLnRleHQodGhpcy50aXRsZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vY29tcHV0ZSBzZWdtZW50IHdpZHRoIGFuZCBsZW5ndGgsIGluIHBpeFxyXG4gICAgICAgIGNvbnN0IHNXaWR0aCA9IHRoaXMud2lkdGhQaXhcclxuICAgICAgICBjb25zdCBzTGVuZ3RoID0gKDEgKiBvcHRzLnIpIC8gb3B0cy56ZlxyXG5cclxuICAgICAgICAvL2RyYXcgU1ZHIHNlZ21lbnRcclxuICAgICAgICBjb25zdCBzdmdTID0gTWF0aC5tYXgoc0xlbmd0aCwgc1dpZHRoKVxyXG4gICAgICAgIGNvbnN0IHN2ZyA9IGQuYXBwZW5kKCdzdmcnKS5hdHRyKCd3aWR0aCcsIHN2Z1MpLmF0dHIoJ2hlaWdodCcsIHN2Z1MpLnN0eWxlKCcnLCAnaW5saW5lLWJsb2NrJylcclxuXHJcbiAgICAgICAgY29uc3QgY29zID0gTWF0aC5jb3MoKC10aGlzLm9yaWVudGF0aW9uICogTWF0aC5QSSkgLyAxODApXHJcbiAgICAgICAgY29uc3Qgc2luID0gTWF0aC5zaW4oKC10aGlzLm9yaWVudGF0aW9uICogTWF0aC5QSSkgLyAxODApXHJcbiAgICAgICAgY29uc3QgZGMgPSBzdmdTICogMC41LFxyXG4gICAgICAgICAgICBsMiA9IHNMZW5ndGggKiAwLjVcclxuICAgICAgICBzdmcuYXBwZW5kKCdsaW5lJylcclxuICAgICAgICAgICAgLmF0dHIoJ3gxJywgZGMgLSBjb3MgKiBsMilcclxuICAgICAgICAgICAgLmF0dHIoJ3kxJywgZGMgLSBzaW4gKiBsMilcclxuICAgICAgICAgICAgLmF0dHIoJ3gyJywgZGMgKyBjb3MgKiBsMilcclxuICAgICAgICAgICAgLmF0dHIoJ3kyJywgZGMgKyBzaW4gKiBsMilcclxuICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLmNvbG9yKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIHNXaWR0aClcclxuXHJcbiAgICAgICAgLy90ZXh0IGxhYmVsXHJcbiAgICAgICAgZC5hcHBlbmQoJ2RpdicpXHJcbiAgICAgICAgICAgIC8vc2hvdyBvbiByaWdodCBvZiBzdmdcclxuICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXHJcbiAgICAgICAgICAgIC5zdHlsZSgncGFkZGluZy1sZWZ0JywgJzVweCcpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5sYWJlbEZvbnRTaXplKVxyXG4gICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtd2VpZ2h0XCIsIFwiYm9sZFwiKVxyXG4gICAgICAgICAgICAudGV4dCh0aGlzLmxhYmVsVW5pdFRleHQpXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9MZWdlbmQuanMnXHJcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2QzLWZvcm1hdCdcclxuXHJcbi8qKlxyXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBzZWdtZW50IHdpZHRoLlxyXG4gKlxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU2VnbWVudFdpZHRoTGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcclxuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLy90aXRsZVxyXG4gICAgICAgIHRoaXMudGl0bGUgPSBvcHRzLnRpdGxlXHJcbiAgICAgICAgdGhpcy50aXRsZUZvbnRTaXplID0gb3B0cy50aXRsZUZvbnRTaXplIHx8ICcwLjhlbSdcclxuICAgICAgICB0aGlzLnRpdGxlRm9udFdlaWdodCA9IG9wdHMudGl0bGVGb250V2VpZ2h0IHx8ICdib2xkJ1xyXG5cclxuICAgICAgICAvL2V4YWdlcmF0aW9uXHJcbiAgICAgICAgdGhpcy5leGFnZ2VyYXRpb25GYWN0b3IgPSBvcHRzLmV4YWdnZXJhdGlvbkZhY3RvciB8fCAwLjVcclxuXHJcbiAgICAgICAgLy9jb2xvclxyXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICdncmF5J1xyXG4gICAgICAgIC8vb3JpZW50YXRpb25cclxuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gb3B0cy5vcmllbnRhdGlvbiB8fCAwXHJcblxyXG4gICAgICAgIC8vbGFiZWxcclxuICAgICAgICB0aGlzLmxhYmVsRm9udFNpemUgPSBvcHRzLmxhYmVsRm9udFNpemUgfHwgJzAuOGVtJ1xyXG4gICAgICAgIHRoaXMubGFiZWxVbml0VGV4dCA9IG9wdHMubGFiZWxVbml0VGV4dCB8fCAnJ1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHt7IHN0eWxlOiBpbXBvcnQoXCIuLi9zdHlsZS9TZWdtZW50U3R5bGVcIikuU2VnbWVudFN0eWxlLCByOiBudW1iZXIsIHpmOiBudW1iZXIsIHNDb2xvcjogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCwgc0xlbmd0aDogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCwgc1dpZHRoOiBpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0IH19IG9wdHNcclxuICAgICAqL1xyXG4gICAgdXBkYXRlKG9wdHMpIHtcclxuICAgICAgICAvL2NvdWxkIGhhcHBlbiB3aGVuIGRhdGEgaXMgc3RpbGwgbG9hZGluZ1xyXG4gICAgICAgIGlmICghb3B0cy5zV2lkdGgpIHJldHVyblxyXG5cclxuICAgICAgICAvL2NsZWFyXHJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcclxuXHJcbiAgICAgICAgY29uc3QgZCA9IHRoaXMuZGl2LmFwcGVuZCgnZGl2JylcclxuXHJcbiAgICAgICAgLy90aXRsZVxyXG4gICAgICAgIGlmICh0aGlzLnRpdGxlKSB7XHJcbiAgICAgICAgICAgIGQuYXBwZW5kKCdkaXYnKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3RpdGxlJylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy50aXRsZUZvbnRTaXplKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsIHRoaXMudGl0bGVGb250V2VpZ2h0KVxyXG4gICAgICAgICAgICAgICAgLnRleHQodGhpcy50aXRsZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vZ2V0IG1heCB2YWx1ZVxyXG4gICAgICAgIGNvbnN0IHZhbHVlXyA9IG9wdHMuc1dpZHRoLm1heCAqIHRoaXMuZXhhZ2dlcmF0aW9uRmFjdG9yXHJcblxyXG4gICAgICAgIC8vdGFrZSAnbmljZScgdmFsdWUgKHBvd2VyIG9mIHRlbiwgb3IgbXVsdGlwbGUpXHJcbiAgICAgICAgbGV0IHBvdzEwID0gTWF0aC5sb2cxMCh2YWx1ZV8pXHJcbiAgICAgICAgcG93MTAgPSBNYXRoLmZsb29yKHBvdzEwKVxyXG4gICAgICAgIGxldCB2YWx1ZSA9IE1hdGgucG93KDEwLCBwb3cxMClcclxuICAgICAgICBpZiAodmFsdWUgKiA4IDw9IHZhbHVlXykgdmFsdWUgKj0gOFxyXG4gICAgICAgIGVsc2UgaWYgKHZhbHVlICogNiA8PSB2YWx1ZV8pIHZhbHVlICo9IDZcclxuICAgICAgICBlbHNlIGlmICh2YWx1ZSAqIDUgPD0gdmFsdWVfKSB2YWx1ZSAqPSA1XHJcbiAgICAgICAgZWxzZSBpZiAodmFsdWUgKiA0IDw9IHZhbHVlXykgdmFsdWUgKj0gNFxyXG4gICAgICAgIGVsc2UgaWYgKHZhbHVlICogMi41IDw9IHZhbHVlXykgdmFsdWUgKj0gMi41XHJcbiAgICAgICAgZWxzZSBpZiAodmFsdWUgKiAyIDw9IHZhbHVlXykgdmFsdWUgKj0gMlxyXG5cclxuICAgICAgICAvL2NvbXB1dGUgc2VnbWVudCB3aWR0aCBhbmQgbGVuZ3RoLCBpbiBwaXhcclxuICAgICAgICBjb25zdCBzV2lkdGggPSBvcHRzLnN0eWxlLndpZHRoKHZhbHVlLCBvcHRzLnIsIG9wdHMuc1dpZHRoLCBvcHRzLnpmKSAvIG9wdHMuemZcclxuICAgICAgICBjb25zdCBzTGVuZ3RoID0gKDEgKiBvcHRzLnIpIC8gb3B0cy56ZlxyXG5cclxuICAgICAgICAvL1RPRE8gdXNlIG9yaWVudGF0aW9uXHJcblxyXG4gICAgICAgIGNvbnN0IHN2ZyA9IGQuYXBwZW5kKCdzdmcnKS5hdHRyKCd3aWR0aCcsIHNMZW5ndGgpLmF0dHIoJ2hlaWdodCcsIHNXaWR0aCkuc3R5bGUoJycsICdpbmxpbmUtYmxvY2snKVxyXG5cclxuICAgICAgICAvLzxsaW5lIHgxPVwiMFwiIHkxPVwiMFwiIHgyPVwiMjAwXCIgeTI9XCIyMDBcIiBzdHlsZT1cInN0cm9rZTpyZ2IoMjU1LDAsMCk7c3Ryb2tlLXdpZHRoOjJcIiAvPlxyXG4gICAgICAgIHN2Zy5hcHBlbmQoJ2xpbmUnKVxyXG4gICAgICAgICAgICAuYXR0cigneDEnLCAwKVxyXG4gICAgICAgICAgICAuYXR0cigneTEnLCBzV2lkdGggLyAyKVxyXG4gICAgICAgICAgICAuYXR0cigneDInLCBzTGVuZ3RoKVxyXG4gICAgICAgICAgICAuYXR0cigneTInLCBzV2lkdGggLyAyKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuY29sb3IpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgc1dpZHRoKVxyXG5cclxuICAgICAgICBjb25zdCB2YWx1ZVQgPSBmb3JtYXQoJywuMnInKSh2YWx1ZSlcclxuICAgICAgICBkLmFwcGVuZCgnZGl2JylcclxuICAgICAgICAgICAgLy9zaG93IG9uIHJpZ2h0IG9mIGdyYXBoaWNcclxuICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXHJcbiAgICAgICAgICAgIC5zdHlsZSgncGFkZGluZy1sZWZ0JywgJzVweCcpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5sYWJlbEZvbnRTaXplKVxyXG4gICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtd2VpZ2h0XCIsIFwiYm9sZFwiKVxyXG4gICAgICAgICAgICAudGV4dCh2YWx1ZVQgKyAodGhpcy5sYWJlbFVuaXRUZXh0ID8gJyAnIDogJycpICsgdGhpcy5sYWJlbFVuaXRUZXh0KVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vTGVnZW5kLmpzJ1xyXG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkMy1mb3JtYXQnXHJcblxyXG4vKipcclxuICogQSBsZWdlbmQgZWxlbWVudCBmb3IgcHJvcG9ydGlvbmFsIHN5bWJvbHMuXHJcbiAqXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTaXplTGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcclxuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLy9leGFnZXJhdGlvblxyXG4gICAgICAgIHRoaXMuZXhhZ2dlcmF0aW9uRmFjdG9yID0gb3B0cy5leGFnZ2VyYXRpb25GYWN0b3IgfHwgMC44XHJcblxyXG4gICAgICAgIC8vaWYgdmFsdWUgaXMgdG8gYmUgZm9yY2VkXHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IG9wdHMudmFsdWUgfHwgdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIC8vdGl0bGVcclxuICAgICAgICB0aGlzLnRpdGxlID0gb3B0cy50aXRsZVxyXG4gICAgICAgIHRoaXMudGl0bGVGb250U2l6ZSA9IG9wdHMudGl0bGVGb250U2l6ZSB8fCAnMC44ZW0nXHJcbiAgICAgICAgdGhpcy50aXRsZUZvbnRXZWlnaHQgPSBvcHRzLnRpdGxlRm9udFdlaWdodCB8fCAnYm9sZCdcclxuXHJcbiAgICAgICAgLy9zeW1ib2xcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtpbXBvcnQoXCIuLi9TdHlsZVwiKS5TaGFwZX0gKi9cclxuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAnY2lyY2xlJ1xyXG4gICAgICAgIHRoaXMuZmlsbENvbG9yID0gb3B0cy5maWxsQ29sb3IgfHwgJ25vbmUnXHJcbiAgICAgICAgdGhpcy5zdHJva2VDb2xvciA9IG9wdHMuc3Ryb2tlQ29sb3IgfHwgJ2dyYXknXHJcbiAgICAgICAgdGhpcy5zdHJva2VXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGggfHwgMVxyXG5cclxuICAgICAgICAvL2xhYmVsXHJcbiAgICAgICAgdGhpcy5sYWJlbEZvbnRTaXplID0gb3B0cy5sYWJlbEZvbnRTaXplIHx8ICcwLjhlbSdcclxuICAgICAgICB0aGlzLmxhYmVsVW5pdFRleHQgPSBvcHRzLmxhYmVsVW5pdFRleHQgfHwgJydcclxuICAgICAgICB0aGlzLmxhYmVsRm9ybWF0ID0gb3B0cy5sYWJlbEZvcm1hdCB8fCAnLC4ycidcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvL3RoaXMuZGl2LnN0eWxlKFwidGV4dC1hbGlnblwiLCBcImNlbnRlclwiKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHt7IHN0eWxlOiBpbXBvcnQoXCIuLi9zdHlsZS9TaGFwZUNvbG9yU2l6ZVN0eWxlXCIpLlNoYXBlQ29sb3JTaXplU3R5bGUsIHI6IG51bWJlciwgemY6IG51bWJlciwgc1NpemU6IGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXQsIHNDb2xvcjogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCB9fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZShvcHRzKSB7XHJcbiAgICAgICAgLy9jb3VsZCBoYXBwZW4gd2hlbiBkYXRhIGlzIHN0aWxsIGxvYWRpbmdcclxuICAgICAgICBpZiAoIW9wdHMuc1NpemUpIHJldHVyblxyXG5cclxuICAgICAgICAvL2NsZWFyXHJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcclxuXHJcbiAgICAgICAgLy9nZXQgdmFsdWVcclxuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnZhbHVlXHJcbiAgICAgICAgaWYgKHZhbHVlID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvL2NvbXB1dGUgJ25pY2UgdmFsdWVcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IG1heCB2YWx1ZVxyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZV8gPSBvcHRzLnNTaXplLm1heCAqIHRoaXMuZXhhZ2dlcmF0aW9uRmFjdG9yXHJcblxyXG4gICAgICAgICAgICAvL3Rha2UgJ25pY2UnIHZhbHVlIChwb3dlciBvZiB0ZW4sIG9yIG11bHRpcGxlKVxyXG4gICAgICAgICAgICBsZXQgcG93MTAgPSBNYXRoLmxvZzEwKHZhbHVlXylcclxuICAgICAgICAgICAgcG93MTAgPSBNYXRoLmZsb29yKHBvdzEwKVxyXG4gICAgICAgICAgICB2YWx1ZSA9IE1hdGgucG93KDEwLCBwb3cxMClcclxuICAgICAgICAgICAgaWYgKHZhbHVlICogOCA8PSB2YWx1ZV8pIHZhbHVlICo9IDhcclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgKiA2IDw9IHZhbHVlXykgdmFsdWUgKj0gNlxyXG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSAqIDUgPD0gdmFsdWVfKSB2YWx1ZSAqPSA1XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlICogNCA8PSB2YWx1ZV8pIHZhbHVlICo9IDRcclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgKiAyLjUgPD0gdmFsdWVfKSB2YWx1ZSAqPSAyLjVcclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgKiAyIDw9IHZhbHVlXykgdmFsdWUgKj0gMlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuXHJcblxyXG4gICAgICAgIGNvbnN0IGQgPSB0aGlzLmRpdi5hcHBlbmQoJ2RpdicpXHJcbiAgICAgICAgLy90byBlbmFibGUgdmVydGljYWwgY2VudGVyaW5nXHJcbiAgICAgICAgLy8uc3R5bGUoXCJwb3NpdGlvblwiLCBcInJlbGF0aXZlXCIpXHJcblxyXG4gICAgICAgIC8vdGl0bGVcclxuICAgICAgICBpZiAodGhpcy50aXRsZSkge1xyXG4gICAgICAgICAgICBkLmFwcGVuZCgnZGl2JylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICd0aXRsZScpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMudGl0bGVGb250U2l6ZSlcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCB0aGlzLnRpdGxlRm9udFdlaWdodClcclxuICAgICAgICAgICAgICAgIC50ZXh0KHRoaXMudGl0bGUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2NvbXB1dGUgc2l6ZSBvZiBzeW1ib2wsIGluIHBpeFxyXG4gICAgICAgIGNvbnN0IHNpemUgPSBvcHRzLnN0eWxlLnNpemUodmFsdWUsIG9wdHMuciwgb3B0cy5zU2l6ZSwgb3B0cy56ZikgLyBvcHRzLnpmXHJcblxyXG4gICAgICAgIGNvbnN0IHN2ZyA9IGRcclxuICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcclxuICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgc2l6ZSArIHRoaXMuc3Ryb2tlV2lkdGggKyAyKVxyXG4gICAgICAgICAgICAuYXR0cignaGVpZ2h0Jywgc2l6ZSArIHRoaXMuc3Ryb2tlV2lkdGggKyAyKVxyXG4gICAgICAgICAgICAuc3R5bGUoJycsICdpbmxpbmUtYmxvY2snKVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zaGFwZSA9PT0gJ3NxdWFyZScpIHtcclxuICAgICAgICAgICAgc3ZnLmFwcGVuZCgncmVjdCcpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsIDApXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIDApXHJcbiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCBzaXplKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHNpemUpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCB0aGlzLmZpbGxDb2xvcilcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5zdHJva2VDb2xvcilcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcclxuICAgICAgICAgICAgLy9UT0RPIHRlc3RcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hhcGUgPT09ICdjaXJjbGUnKSB7XHJcbiAgICAgICAgICAgIC8vIDxjaXJjbGUgY3g9XCI1MFwiIGN5PVwiNTBcIiByPVwiNDBcIiBzdHJva2U9XCJibGFja1wiIHN0cm9rZS13aWR0aD1cIjNcIiBmaWxsPVwicmVkXCIgLz5cclxuICAgICAgICAgICAgY29uc3QgciA9IChzaXplICsgdGhpcy5zdHJva2VXaWR0aCkgKiAwLjVcclxuICAgICAgICAgICAgc3ZnLmFwcGVuZCgnY2lyY2xlJylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdjeCcsIHIgKyAxKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2N5JywgciArIDEpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigncicsIHIpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCB0aGlzLmZpbGxDb2xvcilcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5zdHJva2VDb2xvcilcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hhcGUgPT09ICdkb251dCcpIHtcclxuICAgICAgICAgICAgLy9UT0RPXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnZGlhbW9uZCcpIHtcclxuICAgICAgICAgICAgLy9UT0RPXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyB0aGlzLnNoYXBlKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdmFsdWVUID0gZm9ybWF0KHRoaXMubGFiZWxGb3JtYXQpKHZhbHVlKVxyXG4gICAgICAgIGQuYXBwZW5kKCdkaXYnKVxyXG4gICAgICAgICAgICAvL3Nob3cgb24gcmlnaHQgb2YgZ3JhcGhpY1xyXG4gICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnaW5saW5lJylcclxuXHJcbiAgICAgICAgICAgIC8vY2VudGVyIHZlcnRpY2FsbHlcclxuICAgICAgICAgICAgLy8uc3R5bGUoXCJwb3NpdGlvblwiLCBcImFic29sdXRlXCIpLnN0eWxlKFwidG9wXCIsIFwiMFwiKS5zdHlsZShcImJvdHRvbVwiLCBcIjBcIilcclxuXHJcbiAgICAgICAgICAgIC5zdHlsZSgncGFkZGluZy1sZWZ0JywgJzVweCcpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5sYWJlbEZvbnRTaXplKVxyXG4gICAgICAgICAgICAudGV4dCh2YWx1ZVQgKyAodGhpcy5sYWJlbFVuaXRUZXh0ID8gJyAnIDogJycpICsgdGhpcy5sYWJlbFVuaXRUZXh0KVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcclxuXHJcbi8qKiBAdHlwZWRlZiB7XCJmbGFnXCJ8XCJwaWVjaGFydFwifFwicmluZ1wifFwic2VnbWVudFwifFwicmFkYXJcInxcImFnZXB5cmFtaWRcInxcImhhbGZ0b25lXCJ9IENvbXBvc2l0aW9uVHlwZSAqL1xyXG5cclxuLyoqXHJcbiAqIEEgc3R5bGUgc2hvd2luZyB0aGUgY29tcG9zaXRpb24gb2YgYSB0b3RhbCBpbiBkaWZmZXJlbnQgY2F0ZWdvcmllcywgd2l0aCBkaWZmZXJlbnQgY29sb3IgaHVlcy5cclxuICogSXQgY29uc2lzdHMgb2YgYSBzeW1ib2wgd2l0aCBkaWZmZXJlbnQgcGFydHMsIHdob3NlIHNpemUgcmVmbGVjdCB0aGUgcHJvcG9ydGlvbiBvZiB0aGUgY29ycmVzcG9uZGluZyBjYXRlZ29yeS5cclxuICogRm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgc3ltYm9scywgQHNlZSBDb21wb3NpdGlvblR5cGVcclxuICogVGhlIHN5bWJvbCBjYW4gYmUgc2NhbGVkIGRlcGVuZGluZyBvbiB0aGUgY2VsbCBpbXBvcnRhbmNlLlxyXG4gKlxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ29tcG9zaXRpb25TdHlsZSBleHRlbmRzIFN0eWxlIHtcclxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRpY3Rpb25hcnkgKHN0cmluZyAtPiBjb2xvcikgd2hpY2ggZ2l2ZSB0aGUgY29sb3Igb2YgZWFjaCBjYXRlZ29yeS5cclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0eXBlIG9mIGRlY29tcG9zaXRpb24gc3ltYm9sIG9mIGEgY2VsbCwgQHNlZSBDb21wb3NpdGlvblR5cGVcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsKTpDb21wb3NpdGlvblR5cGV9ICovXHJcbiAgICAgICAgdGhpcy50eXBlID0gb3B0cy50eXBlXHJcblxyXG4gICAgICAgIC8qKiBUaGUgY29sdW1uIHdoZXJlIHRvIGdldCB0aGUgc2l6ZSB2YWx1ZXMuXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnNpemVDb2wgPSBvcHRzLnNpemVDb2xcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIGEgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgKCh2LCByLCBzLCB6ZikgPT4gcilcclxuXHJcbiAgICAgICAgLyoqIEZvciBzdHlsZSB0eXBlcyB3aXRoIHN0cmlwZXMgKGZsYWcsIHNlZ21lbnQpLCB0aGUgb3JpZW50YXRpb24gb2YgdGhlIHN0cmlwZXMgKDAgZm9yIGhvcml6b250YWwsIG90aGVyIGZvciB2ZXJ0aWNhbCkuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5zdHJpcGVzT3JpZW50YXRpb24gPSBvcHRzLnN0cmlwZXNPcmllbnRhdGlvbiB8fCAoKCkgPT4gMCkgLy8oYyxyLHpmKSA9PiAuLi5cclxuXHJcbiAgICAgICAgLyoqIFRoZSBmdW5jdGlvbiBzcGVjaWZ5aW5nIGFuIG9mZnNldCBhbmdsZSBmb3IgYSByYWRhciwgaGFsZnRvbmUgb3IgcGllIGNoYXJ0IHN0eWxlLlxyXG4gICAgICAgICAqIFRoZSBhbmdsZSBpcyBzcGVjaWZpZWQgaW4gZGVncmVlLiBUaGUgcm90YXRpb24gaXMgYW50aS1jbG9ja3dpc2UuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5vZmZzZXRBbmdsZSA9IG9wdHMub2Zmc2V0QW5nbGUgfHwgKCgpID0+IDApIC8vKGNlbGwscix6ZikgPT4gLi4uXHJcblxyXG4gICAgICAgIC8qKiBUaGUgZnVuY3Rpb24gc3BlY2lmeWluZyB0aGUgaGVpZ2h0IG9mIHRoZSBhZ2UgcHlyYW1pZCwgaW4gZ2VvIHVuaXQuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5hZ2VQeXJhbWlkSGVpZ2h0ID0gb3B0cy5hZ2VQeXJhbWlkSGVpZ2h0IHx8ICgoYywgciwgemYpID0+IHIpIC8vKGNlbGwscix6ZikgPT4gLi4uXHJcblxyXG4gICAgICAgIC8qKiBGb3IgcGllIGNoYXJ0LCB0aGlzIGlzIHBhcmFtZXRlciBmb3IgaW50ZXJuYWwgcmFkaXVzLCBzbyB0aGF0IHRoZSBwaWUgY2hhcnQgbG9va3MgbGlrZSBhIGRvbnV0LlxyXG4gICAgICAgICAqIDAgZm9yIG5vcm1hbCBwaWUgY2hhcnRzLCAwLjUgdG8gZW1wdHkgaGFsZiBvZiB0aGUgcmFkaXVzLlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5waWVDaGFydEludGVybmFsUmFkaXVzRmFjdG9yID0gb3B0cy5waWVDaGFydEludGVybmFsUmFkaXVzRmFjdG9yIHx8IDBcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgY2VsbHMgYXMgc3F1YXJlcyBkZXBlbmRpbmcgb24gdGhlaXIgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL3pvb20gZmFjdG9yXHJcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXHJcblxyXG4gICAgICAgIGxldCBzdGF0XHJcbiAgICAgICAgaWYgKHRoaXMuc2l6ZUNvbCkge1xyXG4gICAgICAgICAgICAvL2lmIHNpemUgaXMgdXNlZCwgc29ydCBjZWxscyBieSBzaXplIHNvIHRoYXQgdGhlIGJpZ2dlc3QgYXJlIGRyYXduIGZpcnN0XHJcbiAgICAgICAgICAgIGNlbGxzLnNvcnQoKGMxLCBjMikgPT4gYzJbdGhpcy5zaXplQ29sXSAtIGMxW3RoaXMuc2l6ZUNvbF0pXHJcbiAgICAgICAgICAgIC8vYW5kIGNvbXB1dGUgc3RhdGlzdGljc1xyXG4gICAgICAgICAgICBzdGF0ID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5zaXplQ29sXSwgdHJ1ZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vbmIgY2F0ZWdvcmllcyAtIHVzZWQgZm9yIHJhZGFyIGFuZCBhZ2VweXJhbWlkXHJcbiAgICAgICAgY29uc3QgbmJDYXQgPSBPYmplY3QuZW50cmllcyh0aGlzLmNvbG9yKS5sZW5ndGhcclxuXHJcbiAgICAgICAgLy9kcmF3IGluIGdlbyBjb29yZGluYXRlc1xyXG4gICAgICAgIGNnLnNldENhbnZhc1RyYW5zZm9ybSgpXHJcblxyXG4gICAgICAgIC8vZHJhdyBjYWxsc1xyXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgLy9zaXplXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICAgICAgbGV0IHNfID0gdGhpcy5zaXplIHx8ICgoKSA9PiByKVxyXG4gICAgICAgICAgICAvL3NpemUgLSBpbiBnZW9cclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgICAgIGNvbnN0IHNHID0gc18oY2VsbFt0aGlzLnNpemVDb2xdLCByLCBzdGF0LCB6ZilcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxyXG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByLCB6ZilcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IHN5bWJvbCB0eXBlXHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGVfID0gdGhpcy50eXBlID8gdGhpcy50eXBlKGNlbGwpIDogJ2ZsYWcnXHJcblxyXG4gICAgICAgICAgICAvL2NvbXB1dGUgY2VudGVyIHBvc2l0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IHhjID0gY2VsbC54ICsgb2Zmc2V0LmR4ICsgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcgPyAwIDogciAqIDAuNSlcclxuICAgICAgICAgICAgY29uc3QgeWMgPSBjZWxsLnkgKyBvZmZzZXQuZHkgKyAodHlwZV8gPT09ICdhZ2VweXJhbWlkJyA/IDAgOiByICogMC41KVxyXG5cclxuICAgICAgICAgICAgLy9jb21wdXRlIG9mZnNldCBhbmdsZSwgd2hlbiByZWxldmFudFxyXG4gICAgICAgICAgICBjb25zdCBvZmZBbmcgPSB0aGlzLm9mZnNldEFuZ2xlID8gKHRoaXMub2Zmc2V0QW5nbGUoY2VsbCwgciwgemYpICogTWF0aC5QSSkgLyAxODAgOiAwXHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZV8gPT09ICdhZ2VweXJhbWlkJyB8fCB0eXBlXyA9PT0gJ3JhZGFyJyB8fCB0eXBlXyA9PT0gJ2hhbGZ0b25lJykge1xyXG4gICAgICAgICAgICAgICAgLy9nZXQgY2VsbCBjYXRlZ29yeSBtYXggdmFsdWVcclxuICAgICAgICAgICAgICAgIGxldCBtYXhWYWwgPSAtSW5maW5pdHlcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmNvbG9yKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSArY2VsbFtrZXldXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgPiBtYXhWYWwpIG1heFZhbCA9IHZcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL2N1bXVsXHJcbiAgICAgICAgICAgICAgICBsZXQgY3VtdWwgPSAwXHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZV8gPT09ICdhZ2VweXJhbWlkJyAmJiB0aGlzLmFnZVB5cmFtaWRIZWlnaHQpXHJcbiAgICAgICAgICAgICAgICAgICAgY3VtdWwgPSAociAtIHRoaXMuYWdlUHlyYW1pZEhlaWdodChjZWxsLCByLCB6ZikpIC8gMlxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVfID09PSAncmFkYXInIHx8IHR5cGVfID09PSAnaGFsZnRvbmUnKSBjdW11bCA9IE1hdGguUEkgLyAyICsgb2ZmQW5nXHJcblxyXG4gICAgICAgICAgICAgICAgLy9jb21wdXRlIHRoZSBpbmNyZW1lbnQsIHdoaWNoIGlzIHRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgdGhlIGN1bXVsIGZvciBlYWNoIGNhdGVnb3J5XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmNyID1cclxuICAgICAgICAgICAgICAgICAgICB0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKHRoaXMuYWdlUHlyYW1pZEhlaWdodCA/IHRoaXMuYWdlUHlyYW1pZEhlaWdodChjZWxsLCByLCB6ZikgOiByKSAvIG5iQ2F0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdHlwZV8gPT09ICdyYWRhcicgfHwgdHlwZV8gPT09ICdoYWxmdG9uZSdcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyAoMiAqIE1hdGguUEkpIC8gbmJDYXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgIGlmIChpbmNyID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzeW1ib2wgdHlwZTonICsgdHlwZV8pXHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgW2NvbHVtbiwgY29sb3JdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY29sb3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9zZXQgY2F0ZWdvcnkgY29sb3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxTdHlsZSA9IGNvbG9yXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2dldCBjYXRlZ29yeSB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjZWxsW2NvbHVtbl1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29tcHV0ZSBjYXRlZ29yeSBsZW5ndGggLSBpbiBnZW9cclxuICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdHID0gKHNHICogdmFsKSAvIG1heFZhbFxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGJhclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFJlY3QoeGMgKyAociAtIHdHKSAvIDIsIHljICsgY3VtdWwsIHdHLCBpbmNyKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXh0IGhlaWdodFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdW11bCArPSBpbmNyXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ3JhZGFyJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3NldCBjYXRlZ29yeSBjb2xvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gY29sb3JcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IGNhdGVncm95IHZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNlbGxbY29sdW1uXVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb21wdXRlIGNhdGVnb3J5IHJhZGl1cyAtIGluIGdlb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zdCByRyA9IHRoaXMucmFkaXVzKHZhbCwgciwgc3RhdCwgY2VsbFN0YXQsIHpmKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByRyA9IChzRyAvIDIpICogTWF0aC5zcXJ0KHZhbCAvIG1heFZhbClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBhbmd1bGFyIHNlY3RvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyh4YywgeWMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5hcmMoeGMsIHljLCByRywgY3VtdWwgLSBpbmNyLCBjdW11bClcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyh4YywgeWMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbmV4dCBhbmd1bGFyIHNlY3RvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdW11bCArPSBpbmNyXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ2hhbGZ0b25lJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3NldCBjYXRlZ29yeSBjb2xvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gY29sb3JcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IGNhdGVncm95IHZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNlbGxbY29sdW1uXVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb21wdXRlIGNhdGVnb3J5IHJhZGl1cyAtIGluIGdlb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgckcgPSBzRyAqIDAuMzMzICogTWF0aC5zcXJ0KHZhbCAvIG1heFZhbClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBjaXJjbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5hcmMoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4YyArIHIgKiAwLjI1ICogTWF0aC5jb3MoY3VtdWwpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeWMgKyByICogMC4yNSAqIE1hdGguc2luKGN1bXVsKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJHLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBNYXRoLlBJXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGwoKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXh0IGFuZ3VsYXIgc2VjdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsICs9IGluY3JcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc3ltYm9sIHR5cGU6JyArIHR5cGVfKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vY29tcHV0ZSB0b3RhbFxyXG4gICAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMFxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY29sdW1uIG9mIE9iamVjdC5rZXlzKHRoaXMuY29sb3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9ICtjZWxsW2NvbHVtbl1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXYpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCF0b3RhbCB8fCBpc05hTih0b3RhbCkpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAgICAgLy9kcmF3IGRlY29tcG9zaXRpb24gc3ltYm9sXHJcbiAgICAgICAgICAgICAgICBsZXQgY3VtdWwgPSAwXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkID0gciAqICgxIC0gc0cgLyByKSAqIDAuNVxyXG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpID0gdGhpcy5zdHJpcGVzT3JpZW50YXRpb24oY2VsbCwgciwgemYpXHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgW2NvbHVtbiwgY29sb3JdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY29sb3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9nZXQgc2hhcmVcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZSA9IGNlbGxbY29sdW1uXSAvIHRvdGFsXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaGFyZSB8fCBpc05hTihzaGFyZSkpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vc2V0IGNvbG9yXHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxTdHlsZSA9IGNvbG9yXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vZHJhdyBzeW1ib2wgcGFydFxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlXyA9PT0gJ2ZsYWcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBmbGFnIHN0cmlwZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaG9yaXpvbnRhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIGQgKyBvZmZzZXQuZHgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC55ICsgZCArIGN1bXVsICogc0cgKyBvZmZzZXQuZHksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0csXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmUgKiBzR1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92ZXJ0aWNhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIGQgKyBjdW11bCAqIHNHICsgb2Zmc2V0LmR4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueSArIGQgKyBvZmZzZXQuZHksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmUgKiBzRyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzR1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ3BpZWNoYXJ0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgcGllIGNoYXJ0IGFuZ3VsYXIgc2VjdG9yXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgYW5nbGVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGExID0gY3VtdWwgKiAyICogTWF0aC5QSVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhMiA9IChjdW11bCArIHNoYXJlKSAqIDIgKiBNYXRoLlBJXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXdcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oeGMsIHljKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguYXJjKHhjLCB5Yywgc0cgKiAwLjUsIGExICsgb2ZmQW5nLCBhMiArIG9mZkFuZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGllQ2hhcnRJbnRlcm5hbFJhZGl1c0ZhY3RvcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5hcmMoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0cgKiAwLjUgKiB0aGlzLnBpZUNoYXJ0SW50ZXJuYWxSYWRpdXNGYWN0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTEgKyBvZmZBbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTIgKyBvZmZBbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguY2xvc2VQYXRoKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGwoKVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZV8gPT09ICdyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgcmluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmFyYyh4YywgeWMsIE1hdGguc3FydCgxIC0gY3VtdWwpICogc0cgKiAwLjUsIDAsIDIgKiBNYXRoLlBJKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguZmlsbCgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ3NlZ21lbnQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IHNlY3Rpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdHID0gKHNHICogc0cpIC8gclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaG9yaXpvbnRhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIG9mZnNldC5keCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnkgKyAociAtIHdHKSAvIDIgKyBjdW11bCAqIHdHICsgb2Zmc2V0LmR5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmUgKiB3R1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92ZXJ0aWNhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIGN1bXVsICogciArIG9mZnNldC5keCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnkgKyAociAtIHdHKSAvIDIgKyBvZmZzZXQuZHksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmUgKiByLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdHXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc3ltYm9sIHR5cGU6JyArIHR5cGVfKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY3VtdWwgKz0gc2hhcmVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByOiByLCB6ZjogemYsIHNTaXplOiBzdGF0IH0pXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTaWRlU3R5bGUgfSBmcm9tICcuL1NpZGVTdHlsZS5qcydcclxuXHJcbi8qKiBAdHlwZWRlZiB7e3g6bnVtYmVyLHk6bnVtYmVyLG9yOlwidlwifFwiaFwiLHZhbHVlOm51bWJlcn19IFNpZGUgKi9cclxuXHJcbi8qKlxyXG4gKlxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ29udG91clN0eWxlIGV4dGVuZHMgU2lkZVN0eWxlIHtcclxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgLy9vcHRzLmludGVydmFsID0gb3B0cy5pbnRlcnZhbCB8fCAxMDBcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cclxuICAgICAgICBvcHRzLmJyZWFrcyA9IG9wdHMuYnJlYWtzIHx8IFsxMDAsIDEwMDAsIDEwMDAwLCAxMDAwMDAsIDEwMDAwMDBdXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24oU2lkZSxudW1iZXIsbnVtYmVyKTpzdHJpbmd9ICovXHJcbiAgICAgICAgb3B0cy53aWR0aCA9IG9wdHMud2lkdGggfHwgKCgpID0+IDEpIC8vKHMsIHIsIHpmKSA9PiAuLi5cclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihTaWRlLG51bWJlcixudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICBvcHRzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJyNFN0E5MzUnKSAvLyhzLCByLCB6ZikgPT4gLi4uXHJcblxyXG4gICAgICAgIC8vb3ZlcnJpZGUgbWV0aG9kIGZvciBjb250b3VyIGRyYXdpbmdcclxuXHJcbiAgICAgICAgY29uc3QgZ2V0Q2xhc3MgPSBmdW5jdGlvbiAodikge1xyXG4gICAgICAgICAgICBpZiAodiA9PSB1bmRlZmluZWQpIHJldHVybiAwXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0cy5icmVha3MubGVuZ3RoOyBpKyspIGlmICh2IDwgb3B0cy5icmVha3NbaV0pIHJldHVybiBpXHJcbiAgICAgICAgICAgIHJldHVybiBvcHRzLmJyZWFrcy5sZW5ndGhcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudmFsdWUgPSAodjEsIHYyLCByLCBzLCB6ZikgPT4ge1xyXG4gICAgICAgICAgICAvL2lmICghdjEgfHwgIXYyKSByZXR1cm4gMFxyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMoZ2V0Q2xhc3ModjIpIC0gZ2V0Q2xhc3ModjEpKVxyXG5cclxuICAgICAgICAgICAgLy9jaGVjayBpZiB2MSAtIHYyIGNyb3NzIGEgY29udG91ciBsaW5lXHJcbiAgICAgICAgICAgIC8vY29uc3QgcjEgPSBNYXRoLmZsb29yKHYxIC8gb3B0cy5pbnRlcnZhbCk7XHJcbiAgICAgICAgICAgIC8vY29uc3QgcjIgPSBNYXRoLmZsb29yKHYyIC8gb3B0cy5pbnRlcnZhbCk7XHJcbiAgICAgICAgICAgIC8vcmV0dXJuIE1hdGguYWJzKHIyIC0gcjEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9zYW1lIGNvbG9yIGZvciBhbGxcclxuICAgICAgICB0aGlzLmNvbG9yID0gKHNpZGUsIHIsIHMsIHpmKSA9PiAoc2lkZS52YWx1ZSA/IG9wdHMuY29sb3Ioc2lkZSwgciwgemYpIDogdW5kZWZpbmVkKVxyXG5cclxuICAgICAgICAvL3dpZHRoOiBtdWx0aXBsZSBvZlxyXG4gICAgICAgIHRoaXMud2lkdGggPSAoc2lkZSwgciwgcywgemYpID0+IHNpZGUudmFsdWUgKiB6ZiAqIG9wdHMud2lkdGgoc2lkZSwgciwgemYpXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL1N0eWxlLmpzJ1xyXG5pbXBvcnQgeyByYW5kb21Ob3JtYWwgfSBmcm9tICdkMy1yYW5kb20nXHJcbmltcG9ydCB7IGNoZWNrV2ViR0xTdXBwb3J0LCBtYWtlV2ViR0xDYW52YXMgfSBmcm9tICcuLi91dGlscy93ZWJHTFV0aWxzLmpzJ1xyXG5pbXBvcnQgeyBXZWJHTFNxdWFyZUNvbG9yaW5nIH0gZnJvbSAnLi4vdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZy5qcydcclxuaW1wb3J0IHsgY29sb3IgfSBmcm9tICdkMy1jb2xvcidcclxuaW1wb3J0IHsgbW9uaXRvciwgbW9uaXRvckR1cmF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvVXRpbHMuanMnXHJcblxyXG4vKipcclxuICpcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIERvdERlbnNpdHlTdHlsZSBleHRlbmRzIFN0eWxlIHtcclxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciBkb3QgbnVtYmVyLlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5uYkNvbCA9IG9wdHMubmJDb2xcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBudW1iZXIgb2YgZG90cyBmb3IgYSBjZWxsIHZhbHVlLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXQsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5uYiA9IG9wdHMubmIgfHwgKCh2LCByLCBzLCB6ZikgPT4gKCgoMC4zICogciAqIHIpIC8gKHpmICogemYpKSAqIHYpIC8gcy5tYXgpXHJcblxyXG4gICAgICAgIC8qKiBUaGUgY29sb3Igb2YgdGhlIGRvdHMuIFNhbWUgY29sb3IgZm9yIGFsbCBkb3RzIHdpdGhpbiBhIGNlbGwuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCk6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI0ZGNTczMycpXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiB0aGUgZG90cywgaW4gZ2VvIHVuaXQuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmRvdFNpemUgPSBvcHRzLmRvdFNpemUgLy98fCAoKHIsIHpmKSA9PiAuLi5cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaWdtYSBvZiB0aGUgZGlzdHJpYnV0aW9uIGZyb20gdGhlIHJlc29sdXRpb24sIGluIGdlbyB1bml0LlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5zaWdtYSA9IG9wdHMuc2lnbWEgLy98fCAoKHIsemYpID0+IC4uLlxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyBjZWxscyBhcyB0ZXh0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gclxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBjZ1xyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCByLCBjZykge1xyXG4gICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyoqKiBEb3REZW5zaXR5U3R5bGUgZHJhdycpXHJcblxyXG4gICAgICAgIC8vZmlsdGVyXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcclxuXHJcbiAgICAgICAgLy96b29tIGZhY3RvclxyXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxyXG5cclxuICAgICAgICBsZXQgc3RhdFxyXG4gICAgICAgIGlmICh0aGlzLm5iQ29sKSBzdGF0ID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5uYkNvbF0sIHRydWUpXHJcbiAgICAgICAgaWYgKCFzdGF0KSByZXR1cm5cclxuXHJcbiAgICAgICAgLy9zaXplIG9mIHRoZSBkb3RzXHJcbiAgICAgICAgY29uc3Qgc0dlbyA9IHRoaXMuZG90U2l6ZSA/IHRoaXMuZG90U2l6ZShyLCB6ZikgOiAyICogemZcclxuXHJcbiAgICAgICAgLy9tYWtlIHJhbmRvbSBmdW5jdGlvblxyXG4gICAgICAgIGNvbnN0IHNpZyA9IHRoaXMuc2lnbWEgPyB0aGlzLnNpZ21hKHIsIHpmKSA6IHIgKiAwLjRcclxuICAgICAgICBjb25zdCByYW5kID0gcmFuZG9tTm9ybWFsKDAsIHNpZylcclxuXHJcbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignIHByZXBhcmF0aW9uJylcclxuXHJcbiAgICAgICAgaWYgKGNoZWNrV2ViR0xTdXBwb3J0KCkpIHtcclxuICAgICAgICAgICAgLy9jcmVhdGUgY2FudmFzIGFuZCB3ZWJnbCByZW5kZXJlclxyXG4gICAgICAgICAgICBjb25zdCBjdldHTCA9IG1ha2VXZWJHTENhbnZhcyhjZy53ICsgJycsIGNnLmggKyAnJylcclxuICAgICAgICAgICAgaWYgKCFjdldHTCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gd2ViR0wnKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vY3JlYXRlIHdlYkdMIHByb2dyYW1cclxuICAgICAgICAgICAgY29uc3QgcHJvZyA9IG5ldyBXZWJHTFNxdWFyZUNvbG9yaW5nKGN2V0dMLmdsLCBzR2VvIC8gemYpXHJcblxyXG4gICAgICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcgd2ViZ2wgY3JlYXRpb24nKVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcjIgPSByIC8gMlxyXG5cclxuICAgICAgICAgICAgbGV0IGNvbCwgb2Zmc2V0LCBuYiwgY3gsIGN5LCBjY1xyXG4gICAgICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgICAgICAvL2dldCBjb2xvclxyXG4gICAgICAgICAgICAgICAgY29sID0gdGhpcy5jb2xvcihjKVxyXG4gICAgICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XHJcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSB0aGlzLm9mZnNldChjLCByLCB6ZilcclxuXHJcbiAgICAgICAgICAgICAgICAvL251bWJlciBvZiBkb3RzXHJcbiAgICAgICAgICAgICAgICBuYiA9IHRoaXMubmIoY1t0aGlzLm5iQ29sXSwgciwgc3RhdCwgemYpXHJcblxyXG4gICAgICAgICAgICAgICAgLy9jZWxsIGNlbnRlclxyXG4gICAgICAgICAgICAgICAgY3ggPSBjLnggKyBvZmZzZXQuZHggKyByMlxyXG4gICAgICAgICAgICAgICAgY3kgPSBjLnkgKyBvZmZzZXQuZHkgKyByMlxyXG5cclxuICAgICAgICAgICAgICAgIC8vY29udmVydCBjb2xvclxyXG4gICAgICAgICAgICAgICAgY2MgPSBjb2xvcihjb2wpXHJcbiAgICAgICAgICAgICAgICBpZiAoIWNjKSByZXR1cm5cclxuXHJcbiAgICAgICAgICAgICAgICAvL3JhbmRvbSBwb2ludHNcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IG5iOyBpKyspXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZy5hZGRQb2ludERhdGEyKGN4ICsgcmFuZCgpLCBjeSArIHJhbmQoKSwgY2MuciwgY2MuZywgY2MuYiwgY2Mub3BhY2l0eSlcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignIGRhdGEgcHJlcGFyYXRpb24nKVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3XHJcbiAgICAgICAgICAgIHByb2cuZHJhdyhjZy5nZXRXZWJHTFRyYW5zZm9ybSgpKVxyXG5cclxuICAgICAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignIHdlYmdsIGRyYXdpbmcnKVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGluIGNhbnZhcyBnZW9cclxuICAgICAgICAgICAgY2cuaW5pdENhbnZhc1RyYW5zZm9ybSgpXHJcbiAgICAgICAgICAgIGNnLmN0eC5kcmF3SW1hZ2UoY3ZXR0wuY2FudmFzLCAwLCAwKVxyXG5cclxuICAgICAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignIGNhbnZhcyBkcmF3aW5nJylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvL2RyYXcgd2l0aCBIVE1MIGNhbnZhc1xyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGluIGdlbyBjb29yZGluYXRlc1xyXG4gICAgICAgICAgICBjZy5zZXRDYW52YXNUcmFuc2Zvcm0oKVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xyXG4gICAgICAgICAgICAgICAgLy9nZXQgY29sb3JcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IoYylcclxuICAgICAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgLy9zZXQgY29sb3JcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsU3R5bGUgPSBjb2xcclxuXHJcbiAgICAgICAgICAgICAgICAvL2dldCBvZmZzZXRcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGMsIHIsIHpmKVxyXG5cclxuICAgICAgICAgICAgICAgIC8vbnVtYmVyIG9mIGRvdHNcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5iID0gdGhpcy5uYihjW3RoaXMubmJDb2xdLCByLCBzdGF0LCB6ZilcclxuXHJcbiAgICAgICAgICAgICAgICAvL2RyYXcgcmFuZG9tIGRvdHNcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN4ID0gYy54ICsgb2Zmc2V0LmR4ICsgciAvIDIsXHJcbiAgICAgICAgICAgICAgICAgICAgY3kgPSBjLnkgKyBvZmZzZXQuZHkgKyByIC8gMlxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbmI7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsUmVjdChjeCArIHJhbmQoKSwgY3kgKyByYW5kKCksIHNHZW8sIHNHZW8pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcclxuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcjogciwgemY6IHpmIH0pXHJcblxyXG4gICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyoqKiBEb3REZW5zaXR5U3R5bGUgZW5kIGRyYXcnKVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcclxuXHJcbi8qKlxyXG4gKlxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgSm95UGxvdFN0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogVGhlIGNlbGwgY29sdW1uIHdoZXJlIHRvIGdldCB0aGUgdmFsdWUgdG8gcmVwcmVzZW50LlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5oZWlnaHRDb2wgPSBvcHRzLmhlaWdodENvbFxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGhlaWdodCBvZiBhIGNlbGwuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAoKHYpID0+IE1hdGguc3FydCh2KSlcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcix7bWluOm51bWJlciwgbWF4Om51bWJlcn0sbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMubGluZUNvbG9yID0gb3B0cy5saW5lQ29sb3IgfHwgKCh5LCB5cywgciwgemYpID0+ICcjQkJCJylcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLHttaW46bnVtYmVyLCBtYXg6bnVtYmVyfSxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5saW5lV2lkdGggPSBvcHRzLmxpbmVXaWR0aCB8fCAoKHksIHlzLCByLCB6ZikgPT4gemYpXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcix7bWluOm51bWJlciwgbWF4Om51bWJlcn0sbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuZmlsbENvbG9yID0gb3B0cy5maWxsQ29sb3IgfHwgKCh5LCB5cywgciwgemYpID0+ICcjYzA4YzU5NjgnKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyBjZWxscyBhcyBzcXVhcmVzIGRlcGVuZGluZyBvbiB0aGVpciB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2dcclxuICAgICAqICovXHJcbiAgICBkcmF3KGNlbGxzLCByLCBjZykge1xyXG4gICAgICAgIC8vZmlsdGVyXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcclxuXHJcbiAgICAgICAgY2cuY3R4LmxpbmVKb2luID0gJ3JvdW5kJ1xyXG5cclxuICAgICAgICAvL3pvb20gZmFjdG9yXHJcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXHJcblxyXG4gICAgICAgIC8vY29tcHV0ZSBzdGF0aXN0aWNzXHJcbiAgICAgICAgY29uc3Qgc3RhdCA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMuaGVpZ2h0Q29sXSwgdHJ1ZSlcclxuXHJcbiAgICAgICAgLy9pbmRleCBjZWxscyBieSB5IGFuZCB4XHJcbiAgICAgICAgLyoqICBAdHlwZSB7b2JqZWN0fSAqL1xyXG4gICAgICAgIGNvbnN0IGluZCA9IHt9XHJcbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgIGxldCByb3cgPSBpbmRbY2VsbC55XVxyXG4gICAgICAgICAgICBpZiAoIXJvdykge1xyXG4gICAgICAgICAgICAgICAgcm93ID0ge31cclxuICAgICAgICAgICAgICAgIGluZFtjZWxsLnldID0gcm93XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcm93W2NlbGwueF0gPSB0aGlzLmhlaWdodChjZWxsW3RoaXMuaGVpZ2h0Q29sXSwgciwgc3RhdCwgemYpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2NvbXB1dGUgZXh0ZW50XHJcbiAgICAgICAgY29uc3QgZSA9IGNnLmV4dEdlb1xyXG4gICAgICAgIGlmICghZSkgcmV0dXJuXHJcbiAgICAgICAgY29uc3QgeE1pbiA9IE1hdGguZmxvb3IoZS54TWluIC8gcikgKiByXHJcbiAgICAgICAgY29uc3QgeE1heCA9IE1hdGguZmxvb3IoZS54TWF4IC8gcikgKiByXHJcbiAgICAgICAgY29uc3QgeU1pbiA9IE1hdGguZmxvb3IoZS55TWluIC8gcikgKiByXHJcbiAgICAgICAgY29uc3QgeU1heCA9IE1hdGguZmxvb3IoZS55TWF4IC8gcikgKiByXHJcblxyXG4gICAgICAgIC8qKiAgQHR5cGUge3ttaW46bnVtYmVyLCBtYXg6bnVtYmVyfX0gKi9cclxuICAgICAgICBjb25zdCB5cyA9IHsgbWluOiB5TWluLCBtYXg6IHlNYXggfVxyXG5cclxuICAgICAgICAvL2RyYXcgaW4gZ2VvIGNvb3JkaW5hdGVzXHJcbiAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcclxuXHJcbiAgICAgICAgLy9kcmF3IGxpbmVzLCByb3cgYnkgcm93LCBzdGF0aW5nIGZyb20gdGhlIHRvcFxyXG4gICAgICAgIGZvciAobGV0IHkgPSB5TWF4OyB5ID49IHlNaW47IHkgLT0gcikge1xyXG4gICAgICAgICAgICAvL2dldCByb3dcclxuICAgICAgICAgICAgY29uc3Qgcm93ID0gaW5kW3ldXHJcblxyXG4gICAgICAgICAgICAvL25vIHJvd1xyXG4gICAgICAgICAgICBpZiAoIXJvdykgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vcGxhY2UgZmlyc3QgcG9pbnRcclxuICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oeE1pbiAtIHIgLyAyLCB5KVxyXG5cclxuICAgICAgICAgICAgLy9zdG9yZSB0aGUgcHJldmlvdXMgaGVpZ2h0XHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgbGV0IGhHX1xyXG5cclxuICAgICAgICAgICAgLy9nbyB0aHJvdWdoIHRoZSBsaW5lIGNlbGxzXHJcbiAgICAgICAgICAgIGZvciAobGV0IHggPSB4TWluOyB4IDw9IHhNYXg7IHggKz0gcikge1xyXG4gICAgICAgICAgICAgICAgLy9nZXQgY29sdW1uIHZhbHVlXHJcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICAgICAgICAgIGxldCBoRyA9IHJvd1t4XVxyXG4gICAgICAgICAgICAgICAgaWYgKCFoRykgaEcgPSAwXHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGhHIHx8IGhHXykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vZHJhdyBsaW5lIG9ubHkgd2hlbiBhdCBsZWFzdCBvbmUgb2YgYm90aCB2YWx1ZXMgaXMgbm9uLW51bGxcclxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gdGVzdCBiZXppZXJDdXJ2ZVRvXHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyh4ICsgciAvIDIsIHkgKyBoRylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9lbHNlIG1vdmUgdGhlIHBvaW50XHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyh4ICsgciAvIDIsIHkpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL3N0b3JlIHRoZSBwcmV2aW91cyB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgaEdfID0gaEdcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9sYXN0IHBvaW50XHJcbiAgICAgICAgICAgIGlmIChoR18pIGNnLmN0eC5saW5lVG8oeE1heCArIHIgLyAyLCB5KVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGZpbGxcclxuICAgICAgICAgICAgY29uc3QgZmMgPSB0aGlzLmZpbGxDb2xvcih5LCB5cywgciwgemYpXHJcbiAgICAgICAgICAgIGlmIChmYyAmJiBmYyAhPSAnbm9uZScpIHtcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsU3R5bGUgPSBmY1xyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGwoKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2RyYXcgbGluZVxyXG4gICAgICAgICAgICBjb25zdCBsYyA9IHRoaXMubGluZUNvbG9yKHksIHlzLCByLCB6ZilcclxuICAgICAgICAgICAgY29uc3QgbHcgPSB0aGlzLmxpbmVXaWR0aCh5LCB5cywgciwgemYpXHJcbiAgICAgICAgICAgIGlmIChsYyAmJiBsYyAhPSAnbm9uZScgJiYgbHcgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSBsY1xyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IGx3XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXHJcbmltcG9ydCB7IGRlbnNpdHkyZCB9IGZyb20gJ2Zhc3Qta2RlJ1xyXG5cclxuLyoqXHJcbiAqIEEgc3R5bGUgcmVwcmVzZW50aW5nIHRoZSBjZWxsIGFzIGEgc21vb3RoZWQgbGF5ZXIsIHRvIHNtb290aGluZyBsb2NhbCB2YXJpYXRpb25zIGFuZCBzaG93IG1haW4gdHJlbmRzIGFjcm9zcyBzcGFjZS5cclxuICpcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEtlcm5lbFNtb290aGluZ1N0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLy8gaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL2QvNWRkMWNiNWU0ZDIxYzAyMVxyXG4gICAgLy8gaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0B1d2RhdGEvZmFzdC1rZGVcclxuICAgIC8vIGh0dHBzOi8vb2JzZXJ2YWJsZWhxLmNvbS9kLzMxMjdiNmQ4OWFkYTk1OWZcclxuICAgIC8vVE9ETyBodHRwczovL29ic2VydmFibGVocS5jb20vQHNhaGlsY2hpbm95L2FyZWFsLWludGVycG9sYXRpb24taWlpID9cclxuXHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgdmFsdWUgdG8gY29uc2lkZXIgZm9yIGVhY2ggY2VsbC4gVGhpcyBpcyB0aGUgdmFsdWUgdG8gYmUgc21vb3RoZWQuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCk6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBvcHRzLnZhbHVlXHJcblxyXG4gICAgICAgIC8qKiBUaGUgc21vb3RoaW5nIHBhcmFtZXRlciwgaW4gZ2VvIHVuaXQuIFRoZSBsYXJnZXIsIHRoZSBtb3JlIHNtb290aGVkLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyKTpudW1iZXJ9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zaWdtYSA9IG9wdHMuc2lnbWEgLy8gKHIsIHpmKT0+Li4uXHJcblxyXG4gICAgICAgIC8qKiBBIGZhY3RvciB0byBhZGp1c3QgdGhlIHNtb290aGVkIGdyaWQgcmVzb2x1dGlvbi5cclxuICAgICAgICAgKiBXaGVuIHNldCB0byAxLCB0aGUgc21vb3RoZWQgZ3JpZCBpcyBleGFjdGx5IHRoZSBzY3JlZW4gcmVzb2x1dGlvbi5cclxuICAgICAgICAgKiBTZXQgdG8gMiB0byBkZWdyYWRlIHRoZSByZXNvbHV0aW9uIHRvIGEgZmFjdG9yIDIuXHJcbiAgICAgICAgICogVGhlIGhpZ2hlciwgdGhlIG1vcmUgcGl4ZWxpc2VkIGFuZCB0aGUgZmFzdGVyIHRvIGNvbXB1dGUuXHJcbiAgICAgICAgICogQHR5cGUgeyBudW1iZXIgfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZmFjdG9yID0gb3B0cy5mYWN0b3IgfHwgMlxyXG5cclxuICAgICAgICAvKiogQSBmaWx0ZXIgZnVuY3Rpb24gdG8gZmlsdGVyIHRoZSBzbW9vdGhlZCBjZWxscyBiYXNlZCBvbiB0aGVpciBzbW9vdGhlZCB2YWx1ZS5cclxuICAgICAgICAgKiAgUmV0dXJuIHRydWUgdG8ga2VlcCB0aGUgY2VsbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAgICAgICAqIEB0eXBlIHsgZnVuY3Rpb24obnVtYmVyKTpib29sZWFuIH1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZpbHRlclNtID0gb3B0cy5maWx0ZXJTbVxyXG5cclxuICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB3aGVyZSB0aGUgc21vb3RoZWQgdmFsdWUgaXMgc3RvcmVkIGluIHRoZSBvdXRwdXQgc21vb3RoZWQgZ3JpZC5cclxuICAgICAgICAgKiBAdHlwZSB7IHN0cmluZyB9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zQ29sID0gb3B0cy5zQ29sIHx8ICdrc212YWwnXHJcblxyXG4gICAgICAgIC8qKiBUaGUgc3R5bGVzIHRvIHJlcHJlc2VudCB0aGUgc21vb3RoZWQgZ3JpZC5cclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPFN0eWxlPn1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnN0eWxlcyA9IG9wdHMuc3R5bGVzIHx8IFtdXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IHRoZSBzbW9vdGhlZCBjZWxscyBkZXBlbmRpbmcgb24gdGhlIGxpc3Qgb2Ygc3R5bGVzIHNwZWNpZmllZC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2dcclxuICAgICAqL1xyXG4gICAgZHJhdyhjZWxscywgciwgY2cpIHtcclxuICAgICAgICAvL2ZpbHRlclxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXHJcblxyXG4gICAgICAgIGlmICghY2VsbHMgfHwgY2VsbHMubGVuZ3RoID09IDApIHJldHVyblxyXG5cclxuICAgICAgICAvL2dldCBzbW9vdGhpbmcgcGFyYW0gaW4gZ2VvIHVuaXRcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICBjb25zdCBzRyA9IHRoaXMuc2lnbWEociwgY2cuemYpXHJcblxyXG4gICAgICAgIC8vY29tcHV0ZSBzbW9vdGhlZCBncmlkIGRpbWVuc2lvbnNcclxuICAgICAgICBjb25zdCBuYlggPSBNYXRoLmNlaWwoY2cudyAvIHRoaXMuZmFjdG9yKVxyXG4gICAgICAgIGNvbnN0IG5iWSA9IE1hdGguY2VpbChjZy5oIC8gdGhpcy5mYWN0b3IpXHJcbiAgICAgICAgLy9jb21wdXRlIHNtb290aGVkIGdyaWQgZ2VvIGV4dGVudFxyXG4gICAgICAgIGNvbnN0IGVfID0gW1xyXG4gICAgICAgICAgICBbY2cucGl4VG9HZW9YKDApLCBjZy5waXhUb0dlb1gobmJYICogdGhpcy5mYWN0b3IpXSxcclxuICAgICAgICAgICAgW2NnLnBpeFRvR2VvWShuYlkgKiB0aGlzLmZhY3RvciksIGNnLnBpeFRvR2VvWSgwKV0sXHJcbiAgICAgICAgXVxyXG5cclxuICAgICAgICAvL2NvbXB1dGUgc21vb3RoZWQgZ3JpZFxyXG4gICAgICAgIGxldCBnID0gZGVuc2l0eTJkKGNlbGxzLCB7XHJcbiAgICAgICAgICAgIHg6IChjKSA9PiBjLnggKyByIC8gMixcclxuICAgICAgICAgICAgeTogKGMpID0+IGMueSArIHIgLyAyLFxyXG4gICAgICAgICAgICB3ZWlnaHQ6IChjKSA9PiB0aGlzLnZhbHVlKGMpLFxyXG4gICAgICAgICAgICBiaW5zOiBbbmJYLCBuYlldLFxyXG4gICAgICAgICAgICBiYW5kd2lkdGg6IHNHLFxyXG4gICAgICAgICAgICBleHRlbnQ6IGVfLFxyXG4gICAgICAgIH0pLmdyaWQoKVxyXG5cclxuICAgICAgICAvL2NvbXB1dGUgdGhlIHJlc29sdXRpb24gb2YgdGhlIHNtb290aGVkIGdyaWRcclxuICAgICAgICBjb25zdCByZXNTbW9vdGhlZCA9IChlX1swXVsxXSAtIGVfWzBdWzBdKSAvIG5iWFxyXG5cclxuICAgICAgICAvL21ha2Ugc21vb3RoZWQgY2VsbHNcclxuICAgICAgICBjZWxscyA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaW5kID0gMDsgaW5kIDwgZy5sZW5ndGg7IGluZCsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHYgPSBnW2luZF1cclxuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyU20gJiYgIXRoaXMuZmlsdGVyU20odikpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IE1hdGguZmxvb3IoaW5kIC8gbmJYKVxyXG4gICAgICAgICAgICBjb25zdCBjb2wgPSBpbmQgJSBuYlhcclxuICAgICAgICAgICAgY29uc3QgYyA9IHsgeDogZV9bMF1bMF0gKyBjb2wgKiByZXNTbW9vdGhlZCwgeTogZV9bMV1bMF0gKyByb3cgKiByZXNTbW9vdGhlZCB9XHJcbiAgICAgICAgICAgIGNbdGhpcy5zQ29sXSA9IHZcclxuICAgICAgICAgICAgY2VsbHMucHVzaChjKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9kcmF3IHNtb290aGVkIGNlbGxzIGZyb20gc3R5bGVzXHJcbiAgICAgICAgZm9yIChsZXQgcyBvZiB0aGlzLnN0eWxlcykgcy5kcmF3KGNlbGxzLCByZXNTbW9vdGhlZCwgY2cpXHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcclxuICAgICAgICAvL2ZvciAobGV0IHMgb2YgdGhpcy5zdHlsZXMpXHJcbiAgICAgICAgLy8gICAgcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHMsIHI6IHIsIHpmOiBjZy5nZXRaZigpIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgVGFuYWthU3R5bGUgfSBmcm9tICcuL1RhbmFrYVN0eWxlLmpzJ1xyXG5pbXBvcnQgeyBTdHJva2VTdHlsZSB9IGZyb20gJy4vU3Ryb2tlU3R5bGUuanMnXHJcbmltcG9ydCB7IFNxdWFyZUNvbG9yQ2F0V0dMU3R5bGUgfSBmcm9tICcuL1NxdWFyZUNvbG9yQ2F0V0dMU3R5bGUuanMnXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXHJcblxyXG4vKipcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIExlZ29TdHlsZSB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXkuPFN0eWxlPn1cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGdldChjb2wsIG9wdHMpIHtcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvL3RoZSBjb2xvcnNcclxuICAgICAgICAvL2h0dHA6Ly93d3cuamVubnlzY3JheW9uY29sbGVjdGlvbi5jb20vMjAyMS8wNi9hbGwtY3VycmVudC1sZWdvLWNvbG9ycy5odG1sXHJcbiAgICAgICAgLy9odHRwczovL2xlb25hd2ljei5naXRodWIuaW8vbGVnb2NvbG9ycy9yZWZlcmVuY2UvZmlndXJlcy9SRUFETUUtcGxvdC0xLnBuZ1xyXG4gICAgICAgIG9wdHMuY29sb3JzID0gb3B0cy5jb2xvcnMgfHwgW1xyXG4gICAgICAgICAgICAnIzAwODUyYicsIC8vZGFya2VyIGdyZWVuXHJcbiAgICAgICAgICAgICcjYWZkMjQ2JywgLy9saWdodCBncmVlblxyXG4gICAgICAgICAgICAnI2ZhYzgwYScsIC8vZGFyayB5ZWxsb3dcclxuICAgICAgICAgICAgJyNiYjgwNWEnLCAvL2Jyb3duXHJcbiAgICAgICAgICAgICcjZDY3OTIzJywgLy9tb3N0YXJkXHJcbiAgICAgICAgICAgICcjY2I0ZTI5JywgLy9yZWRpc2hcclxuICAgICAgICAgICAgJyNiNDAwMDAnLCAvL3JlZFxyXG4gICAgICAgICAgICAnIzcyMDAxMicsIC8vZGFyayByZWRcclxuICAgICAgICAgICAgLy9cInB1cnBsZVwiLFxyXG4gICAgICAgICAgICAvL1wiI2VlZVwiIC8vd2hpdGhlXHJcbiAgICAgICAgXVxyXG5cclxuICAgICAgICBvcHRzLmNvbERhcmsgPSBvcHRzLmNvbERhcmsgfHwgJyMzMzMnXHJcbiAgICAgICAgb3B0cy5jb2xCcmlnaHQgPSBvcHRzLmNvbEJyaWdodCB8fCAnI2FhYSdcclxuICAgICAgICBvcHRzLndpZHRoRmFjdG9yID0gb3B0cy53aWR0aEZhY3RvciB8fCAwLjEyXHJcblxyXG4gICAgICAgIC8vcmV1c2UgdGFuYWthIGFzIGJhc2lzXHJcbiAgICAgICAgY29uc3QgdHMgPSBUYW5ha2FTdHlsZS5nZXQoY29sLCBvcHRzKVxyXG4gICAgICAgIC8vc3R5bGUgdG8gc2hvdyBsaW1pdHMgYmV0d2VlbiBwaWVjZXNcclxuICAgICAgICBjb25zdCBzc3QgPSBuZXcgU3Ryb2tlU3R5bGUoe1xyXG4gICAgICAgICAgICBzdHJva2VDb2xvcjogKCkgPT4gJyM2NjYnLFxyXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogKHYsIHIsIHMsIHopID0+IDAuMiAqIHosXHJcbiAgICAgICAgICAgIGZpbHRlcjogb3B0cy5maWx0ZXIsXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgdHNbMF0sXHJcbiAgICAgICAgICAgIHNzdCxcclxuICAgICAgICAgICAgdHNbMV0sXHJcbiAgICAgICAgICAgIG5ldyBMZWdvVG9wU3R5bGUoeyBjb2xEYXJrOiBvcHRzLmNvbERhcmssIGNvbEJyaWdodDogb3B0cy5jb2xCcmlnaHQsIGZpbHRlcjogb3B0cy5maWx0ZXIgfSksXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpOnN0cmluZ30gY29sXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICogQHJldHVybnMge0FycmF5LjxTdHlsZT59XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBnZXRDYXQoY29sLCBvcHRzKSB7XHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgb3B0cy5jb2xEYXJrID0gb3B0cy5jb2xEYXJrIHx8ICcjMzMzJ1xyXG4gICAgICAgIG9wdHMuY29sQnJpZ2h0ID0gb3B0cy5jb2xCcmlnaHQgfHwgJyNhYWEnXHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgY29uc3QgcyA9IG5ldyBTcXVhcmVDb2xvckNhdFdHTFN0eWxlKHsgY29sb3JDb2w6IGNvbCwgY29sb3I6IG9wdHMuY29sb3IgfSlcclxuICAgICAgICAvL3N0eWxlIHRvIHNob3cgbGltaXRzIGJldHdlZW4gcGllY2VzXHJcbiAgICAgICAgY29uc3Qgc3N0ID0gbmV3IFN0cm9rZVN0eWxlKHsgc3Ryb2tlQ29sb3I6ICgpID0+ICcjNjY2Jywgc3Ryb2tlV2lkdGg6ICh2LCByLCBzLCB6KSA9PiAwLjIgKiB6IH0pXHJcblxyXG4gICAgICAgIHJldHVybiBbcywgc3N0LCBuZXcgTGVnb1RvcFN0eWxlKHsgY29sRGFyazogb3B0cy5jb2xEYXJrLCBjb2xCcmlnaHQ6IG9wdHMuY29sQnJpZ2h0IH0pXVxyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogQSBzdHlsZSB0byBkcmF3IHRvcCBjaXJjbGUgb2YgbGVnbyBicmlja3MuXHJcbiAqL1xyXG5jbGFzcyBMZWdvVG9wU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R8dW5kZWZpbmVkfSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG4gICAgICAgIHRoaXMuY29sRGFyayA9IG9wdHMuY29sRGFyayB8fCAnIzMzMydcclxuICAgICAgICB0aGlzLmNvbEJyaWdodCA9IG9wdHMuY29sQnJpZ2h0IHx8ICcjYWFhJ1xyXG4gICAgfVxyXG5cclxuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICBjZy5jdHgubGluZVdpZHRoID0gMC42ICogY2cuZ2V0WmYoKVxyXG5cclxuICAgICAgICAvL2RhcmsgcGFydFxyXG4gICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sRGFya1xyXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgIGNnLmN0eC5hcmMoYy54ICsgciAqIDAuNSwgYy55ICsgciAqIDAuNSwgciAqIDAuNTUgKiAwLjUsIE1hdGguUEkgLyA0LCAtTWF0aC5QSSAqICgzIC8gNCksIHRydWUpXHJcbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9icmlnaHQgcGFydFxyXG4gICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sQnJpZ2h0XHJcbiAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xyXG4gICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgY2cuY3R4LmFyYyhjLnggKyByICogMC41LCBjLnkgKyByICogMC41LCByICogMC41NSAqIDAuNSwgTWF0aC5QSSAvIDQsIC1NYXRoLlBJICogKDMgLyA0KSwgZmFsc2UpXHJcbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXHJcblxyXG4vKipcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1vc2FpY1N0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGNvbHVtbi9hdHRyaWJ1dGUgb2YgdGhlIHRhYnVsYXIgZGF0YSB3aGVyZSB0byByZXRyaWV2ZSB0aGUgdmFyaWFibGUgZm9yIGNvbG9yLlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvckNvbCA9IG9wdHMuY29sb3JDb2xcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCk6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI0VBNkJBQycpXHJcblxyXG4gICAgICAgIC8qKiBUaGUgbW9zYWljIGZhY3Rvciwgd2l0aGluIFswLDAuNV0uIFNldCB0byAwIGZvciBubyBtb3NhaWMgZWZmZWN0LiBTZXQgdG8gMC41IGZvciBzdHJvbmcgbW9zYWljIGVmZmVjdC5cclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMubW9zYWljRmFjdG9yID0gb3B0cy5tb3NhaWNGYWN0b3IgfHwgMC4xNVxyXG5cclxuICAgICAgICAvKiogVGhlIG1vc2FpYyBzaGFkb3cgZmFjdG9yLCB3aXRoaW4gWzAsMC41XS4gU2V0IHRvIDAgZm9yIG5vIG1vc2FpYyBzaGFkb3cuIFNldCB0byAwLjUgZm9yIHN0cm9uZyBtb3NhaWMgc2hhZG93LlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5zaGFkb3dGYWN0b3IgPSBvcHRzLnNoYWRvd0ZhY3RvciB8fCAwLjJcclxuXHJcbiAgICAgICAgLyoqIFRoZSBtb3NhaWMgc2hhZG93IGNvbG9yLlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5zaGFkb3dDb2xvciA9IG9wdHMuc2hhZG93Q29sb3IgfHwgJyM1NTUnXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIHJlc29sdXRpb24sIGNnKSB7XHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL3pvb20gZmFjdG9yXHJcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXHJcblxyXG4gICAgICAgIGxldCBzdGF0Q29sb3JcclxuICAgICAgICBpZiAodGhpcy5jb2xvckNvbCkge1xyXG4gICAgICAgICAgICAvL2NvbXB1dGUgY29sb3IgdmFyaWFibGUgc3RhdGlzdGljc1xyXG4gICAgICAgICAgICBzdGF0Q29sb3IgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLmNvbG9yQ29sXSwgdHJ1ZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vc2V0IHN0cm9rZSBzdHlsZSwgZm9yIHNoYWRvd1xyXG4gICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuc2hhZG93Q29sb3JcclxuICAgICAgICBjZy5jdHgubGluZVdpZHRoID0gdGhpcy5zaGFkb3dGYWN0b3IgKiByZXNvbHV0aW9uXHJcbiAgICAgICAgY2cuY3R4LmxpbmVKb2luID0gJ3JvdW5kJ1xyXG4gICAgICAgIGNnLmN0eC5saW5lQ2FwID0gJ2J1dHQnXHJcblxyXG4gICAgICAgIC8vZnVuY3Rpb24gdG8gY29tcHV0ZSBwb3NpdGlvbiBtb3NhaWMgZWZmZWN0XHJcbiAgICAgICAgY29uc3QgZCA9IHJlc29sdXRpb24gKiB0aGlzLm1vc2FpY0ZhY3RvclxyXG4gICAgICAgIGNvbnN0IG1vc2FpYyA9ICgpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgeDogTWF0aC5yYW5kb20oKSAqIGQsIHk6IE1hdGgucmFuZG9tKCkgKiBkIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vZHJhdyB3aXRoIEhUTUwgY2FudmFzIGluIGdlbyBjb29yZGluYXRlc1xyXG4gICAgICAgIGNnLnNldENhbnZhc1RyYW5zZm9ybSgpXHJcblxyXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgLy9zZXQgZmlsbCBjb2xvclxyXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsW3RoaXMuY29sb3JDb2xdLCByZXNvbHV0aW9uLCBzdGF0Q29sb3IpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxyXG4gICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gY29sXHJcblxyXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcclxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgcmVzb2x1dGlvbiwgemYpXHJcblxyXG4gICAgICAgICAgICAvL2NvbXB1dGUgcG9zaXRpb24gbW9zYWljIGVmZmVjdFxyXG4gICAgICAgICAgICBjb25zdCBsbCA9IG1vc2FpYygpLFxyXG4gICAgICAgICAgICAgICAgdWwgPSBtb3NhaWMoKSxcclxuICAgICAgICAgICAgICAgIGxyID0gbW9zYWljKCksXHJcbiAgICAgICAgICAgICAgICB1ciA9IG1vc2FpYygpXHJcblxyXG4gICAgICAgICAgICAvL3N0cm9rZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5zaGFkb3dGYWN0b3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgbGwueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgbGwueSlcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAtIGxyLngsIGNlbGwueSArIG9mZnNldC5keSArIGxyLnkpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGNlbGwueCArIG9mZnNldC5keCArIHJlc29sdXRpb24gLSB1ci54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyByZXNvbHV0aW9uIC0gdXIueSlcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2ZpbGxcclxuXHJcbiAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICBjZy5jdHgubW92ZVRvKGNlbGwueCArIG9mZnNldC5keCArIGxsLngsIGNlbGwueSArIG9mZnNldC5keSArIGxsLnkpXHJcbiAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAtIGxyLngsIGNlbGwueSArIG9mZnNldC5keSArIGxyLnkpXHJcbiAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAtIHVyLngsIGNlbGwueSArIG9mZnNldC5keSArIHJlc29sdXRpb24gLSB1ci55KVxyXG4gICAgICAgICAgICBjZy5jdHgubGluZVRvKGNlbGwueCArIG9mZnNldC5keCArIHVsLngsIGNlbGwueSArIG9mZnNldC5keSArIHJlc29sdXRpb24gLSB1bC55KVxyXG4gICAgICAgICAgICBjZy5jdHguZmlsbCgpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHI6IHJlc29sdXRpb24sIHpmOiB6Ziwgc0NvbG9yOiBzdGF0Q29sb3IgfSlcclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXHJcblxyXG4vKipcclxuICpcclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE5pbmphU3RhclN0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGNvbHVtbi9hdHRyaWJ1dGUgb2YgdGhlIHRhYnVsYXIgZGF0YSB3aGVyZSB0byByZXRyaWV2ZSB0aGUgdmFyaWFibGUgZm9yIGNvbG9yLlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvckNvbCA9IG9wdHMuY29sb3JDb2xcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJyNFQTZCQUMnKSAvLyh2LHIscyx6ZikgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciBzaXplLlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5zaXplQ29sID0gb3B0cy5zaXplQ29sXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiBhIGNlbGwsIHdpdGhpbiBbMCwxXTpcclxuICAgICAgICAgKiAgLSAwLCBub3RoaW5nIHNob3duXHJcbiAgICAgICAgICogIC0gMSwgZW50aXJlIHNxdWFyZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZVxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNoYXBlLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGwpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKCkgPT4gJ28nKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gclxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBjZ1xyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCByLCBjZykge1xyXG4gICAgICAgIC8vZmlsdGVyXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcclxuXHJcbiAgICAgICAgLy96b29tIGZhY3RvclxyXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxyXG5cclxuICAgICAgICBsZXQgc3RhdFNpemVcclxuICAgICAgICBpZiAodGhpcy5zaXplQ29sKSB7XHJcbiAgICAgICAgICAgIC8vaWYgc2l6ZSBpcyB1c2VkLCBzb3J0IGNlbGxzIGJ5IHNpemUgc28gdGhhdCB0aGUgYmlnZ2VzdCBhcmUgZHJhd24gZmlyc3RcclxuICAgICAgICAgICAgY2VsbHMuc29ydCgoYzEsIGMyKSA9PiBjMlt0aGlzLnNpemVDb2xdIC0gYzFbdGhpcy5zaXplQ29sXSlcclxuICAgICAgICAgICAgLy9hbmQgY29tcHV0ZSBzaXplIHZhcmlhYmxlIHN0YXRpc3RpY3NcclxuICAgICAgICAgICAgc3RhdFNpemUgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLnNpemVDb2xdLCB0cnVlKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHN0YXRDb2xvclxyXG4gICAgICAgIGlmICh0aGlzLmNvbG9yQ29sKSB7XHJcbiAgICAgICAgICAgIC8vY29tcHV0ZSBjb2xvciB2YXJpYWJsZSBzdGF0aXN0aWNzXHJcbiAgICAgICAgICAgIHN0YXRDb2xvciA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMuY29sb3JDb2xdLCB0cnVlKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9kcmF3IHdpdGggSFRNTCBjYW52YXNcclxuICAgICAgICAvL2luIGdlbyBjb29yZGluYXRlc1xyXG4gICAgICAgIGNnLnNldENhbnZhc1RyYW5zZm9ybSgpXHJcblxyXG4gICAgICAgIGNvbnN0IHIyID0gciAqIDAuNVxyXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgLy9jb2xvclxyXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsW3RoaXMuY29sb3JDb2xdLCByLCBzdGF0Q29sb3IsIHpmKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcclxuICAgICAgICAgICAgY2cuY3R4LmZpbGxTdHlsZSA9IGNvbFxyXG5cclxuICAgICAgICAgICAgLy9zaGFwZVxyXG4gICAgICAgICAgICBjb25zdCBzaGFwZSA9IHRoaXMuc2hhcGUgPyB0aGlzLnNoYXBlKGNlbGwpIDogJ28nXHJcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ25vbmUnKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy9zaXplXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICAgICAgbGV0IHNfID0gdGhpcy5zaXplIHx8ICgoKSA9PiAwLjUpXHJcbiAgICAgICAgICAgIC8vc2l6ZSAtIGluIGdlbyB1bml0XHJcbiAgICAgICAgICAgIGNvbnN0IHNHMiA9IHNfKGNlbGxbdGhpcy5zaXplQ29sXSwgciwgc3RhdFNpemUsIHpmKSAqIHIyXHJcblxyXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcclxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgciwgemYpXHJcblxyXG4gICAgICAgICAgICAvL2NlbnRlciBwb3NpdGlvblxyXG4gICAgICAgICAgICBjb25zdCBjeCA9IGNlbGwueCArIHIyXHJcbiAgICAgICAgICAgIGNvbnN0IGN5ID0gY2VsbC55ICsgcjJcclxuXHJcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ3AnKSB7XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY3gsIGN5ICsgcjIpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4ICsgc0cyLCBjeSArIHNHMilcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3ggKyByMiwgY3kpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4ICsgc0cyLCBjeSAtIHNHMilcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3gsIGN5IC0gcjIpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4IC0gc0cyLCBjeSAtIHNHMilcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3ggLSByMiwgY3kpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4IC0gc0cyLCBjeSArIHNHMilcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKClcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ28nKSB7XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY3gsIGN5ICsgc0cyKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCArIHIyLCBjeSArIHIyKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCArIHNHMiwgY3kpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4ICsgcjIsIGN5IC0gcjIpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4LCBjeSAtIHNHMilcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3ggLSByMiwgY3kgLSByMilcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3ggLSBzRzIsIGN5KVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCAtIHIyLCBjeSArIHIyKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGwoKVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyBzaGFwZSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByOiByLCB6ZjogemYsIHNTaXplOiBzdGF0U2l6ZSwgc0NvbG9yOiBzdGF0Q29sb3IgfSlcclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXHJcblxyXG4vKipcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFBpbGxhclN0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLy9UT0RPIG1ha2UgYSB3ZWJHTCB2ZXJzaW9uID9cclxuXHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0Q29sID0gb3B0cy5oZWlnaHRDb2xcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBoZWlnaHQgb2YgdGhlIGxpbmUgcmVwcmVzZW50aW5nIGEgY2VsbCwgaW4gZ2VvIHVuaXRcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0XHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3JDb2wgPSBvcHRzLmNvbG9yQ29sXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGxpbmUgcmVwcmVzZW50aW5nIGEgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCk6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI2MwOGM1OScpIC8vYmJcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy53aWR0aENvbCA9IG9wdHMud2lkdGhDb2xcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiB0aGUgbGluZSByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgodiwgcikgPT4gMC41ICogcilcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xyXG4gICAgICAgIHRoaXMuc2ltcGxlID0gb3B0cy5zaW1wbGUgIT0gdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMudmlld0hlaWdodEZhY3RvciA9IG9wdHMudmlld0hlaWdodEZhY3RvciB8fCAxLjVcclxuICAgICAgICAvLzAsMCBpcyB0aGUgY2VudGVyXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy52aWV3U1ggPSBvcHRzLnZpZXdTWCA9PSB1bmRlZmluZWQgPyAwIDogb3B0cy52aWV3U1hcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnZpZXdTWSA9IG9wdHMudmlld1NZID09IHVuZGVmaW5lZCA/IC0wLjUgOiBvcHRzLnZpZXdTWVxyXG5cclxuICAgICAgICAvL1RPRE8gcmVwbGFjZSB3aXRoIHN1biBsb2NhdGlvbiA/XHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5zaGFkb3dEaXJlY3Rpb24gPVxyXG4gICAgICAgICAgICBvcHRzLnNoYWRvd0RpcmVjdGlvbiA9PSB1bmRlZmluZWQgPyAoLTQwLjMgKiBNYXRoLlBJKSAvIDE4MC4wIDogb3B0cy5zaGFkb3dEaXJlY3Rpb25cclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnNoYWRvd0ZhY3RvciA9IG9wdHMuc2hhZG93RmFjdG9yIHx8IDAuM1xyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuc2hhZG93Q29sb3IgPSBvcHRzLnNoYWRvd0NvbG9yIHx8ICcjMDAwMDAwMzMnXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMub3V0bGluZUNvbCA9IG9wdHMub3V0bGluZUNvbCB8fCAnI0ZGRkZGRidcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLm91dGxpbmVXaWR0aFBpeCA9IG9wdHMub3V0bGluZVdpZHRoUGl4ID09IHVuZGVmaW5lZCA/IDAuNSA6IG9wdHMub3V0bGluZVdpZHRoUGl4XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHNlZ21lbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gclxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBjZ1xyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCByLCBjZykge1xyXG4gICAgICAgIC8vZmlsdGVyXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcclxuXHJcbiAgICAgICAgLy96b29tIGZhY3RvclxyXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxyXG5cclxuICAgICAgICBsZXQgc3RhdEhlaWdodFxyXG4gICAgICAgIGlmICh0aGlzLmhlaWdodENvbCkge1xyXG4gICAgICAgICAgICAvL2NvbXB1dGUgc2l6ZSB2YXJpYWJsZSBzdGF0aXN0aWNzXHJcbiAgICAgICAgICAgIHN0YXRIZWlnaHQgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLmhlaWdodENvbF0sIHRydWUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc3RhdENvbG9yXHJcbiAgICAgICAgaWYgKHRoaXMuY29sb3JDb2wpIHtcclxuICAgICAgICAgICAgLy9jb21wdXRlIGNvbG9yIHZhcmlhYmxlIHN0YXRpc3RpY3NcclxuICAgICAgICAgICAgc3RhdENvbG9yID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5jb2xvckNvbF0sIHRydWUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc3RhdFdpZHRoXHJcbiAgICAgICAgaWYgKHRoaXMud2lkdGhDb2wpIHtcclxuICAgICAgICAgICAgLy9hbmQgY29tcHV0ZSBzaXplIHZhcmlhYmxlIHN0YXRpc3RpY3NcclxuICAgICAgICAgICAgc3RhdFdpZHRoID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy53aWR0aENvbF0sIHRydWUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2dldCB2aWV3IGNlbnRlciBnZW8gcG9zaXRpb25cclxuICAgICAgICBjb25zdCBjdnggPSBjZy5nZXRDZW50ZXIoKS54ICsgdGhpcy52aWV3U1ggKiBjZy53ICogemZcclxuICAgICAgICBjb25zdCBjdnkgPSBjZy5nZXRDZW50ZXIoKS55ICsgdGhpcy52aWV3U1kgKiBjZy5oICogemZcclxuICAgICAgICAvL2dldCB2aWV3IGhlaWdodFxyXG4gICAgICAgIGNvbnN0IEggPSB0aGlzLnZpZXdIZWlnaHRGYWN0b3IgKiAoY2cudyArIGNnLmgpICogMC41ICogemZcclxuXHJcbiAgICAgICAgLy9zb3J0IGNlbGxzIGJ5IHkgYW5kIHhcclxuICAgICAgICAvL2NvbnN0IGRpc3RUb1ZpZXdDZW50ZXIgPSAoYykgPT4geyBjb25zdCBkeCA9IGN2eCAtIGMueCwgZHkgPSBjdnkgLSBjLnk7IHJldHVybiBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpIH1cclxuICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IDEwMDAwMDAwMCAqIChjMi55IC0gYzEueSkgKyBjMS54IC0gYzIueClcclxuXHJcbiAgICAgICAgY2cuY3R4LmxpbmVDYXAgPSB0aGlzLnNpbXBsZSA/ICdidXR0JyA6ICdyb3VuZCdcclxuXHJcbiAgICAgICAgLy9kcmF3IGluIGdlbyBjb29yZGluYXRlc1xyXG4gICAgICAgIGNnLnNldENhbnZhc1RyYW5zZm9ybSgpXHJcblxyXG4gICAgICAgIC8vZHJhdyBzaGFkb3dzXHJcbiAgICAgICAgY2cuY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5zaGFkb3dDb2xvclxyXG4gICAgICAgIGNnLmN0eC5maWxsU3R5bGUgPSB0aGlzLnNoYWRvd0NvbG9yXHJcbiAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xyXG4gICAgICAgICAgICAvL3dpZHRoXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChjW3RoaXMud2lkdGhDb2xdLCByLCBzdGF0V2lkdGgsIHpmKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIXdHIHx8IHdHIDwgMCkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vaGVpZ2h0XHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3QgaEcgPSB0aGlzLmhlaWdodCA/IHRoaXMuaGVpZ2h0KGNbdGhpcy5oZWlnaHRDb2xdLCByLCBzdGF0SGVpZ2h0LCB6ZikgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgaWYgKCFoRyB8fCBoRyA8IDApIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcclxuICAgICAgICAgICAgLy9UT0RPIHVzZSB0aGF0XHJcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGMsIHIsIHpmKVxyXG5cclxuICAgICAgICAgICAgLy9zZXQgd2lkdGhcclxuICAgICAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IHdHXHJcblxyXG4gICAgICAgICAgICAvL2NvbXB1dGUgY2VsbCBjZW50cmUgcG9zdGl0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IGN4ID0gYy54ICsgciAvIDJcclxuICAgICAgICAgICAgY29uc3QgY3kgPSBjLnkgKyByIC8gMlxyXG4gICAgICAgICAgICBjb25zdCBscyA9IGhHICogdGhpcy5zaGFkb3dGYWN0b3JcclxuXHJcbiAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50XHJcbiAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICBjZy5jdHgubW92ZVRvKGN4LCBjeSlcclxuICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCArIGxzICogTWF0aC5jb3ModGhpcy5zaGFkb3dEaXJlY3Rpb24pLCBjeSArIGxzICogTWF0aC5zaW4odGhpcy5zaGFkb3dEaXJlY3Rpb24pKVxyXG4gICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcclxuXHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNpbXBsZSkge1xyXG4gICAgICAgICAgICAgICAgLy9kcmF3IGJhc2UgY2lyY2xlXHJcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKCk7XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguYXJjKFxyXG4gICAgICAgICAgICAgICAgICAgIGN4LCBjeSxcclxuICAgICAgICAgICAgICAgICAgICB3RyAqIDAuNSxcclxuICAgICAgICAgICAgICAgICAgICAwLCAyICogTWF0aC5QSSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgLy9jZy5jdHguc3Ryb2tlKCk7XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguZmlsbCgpO1xyXG4gICAgICAgICAgICB9Ki9cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vZHJhdyBwaWxsYXJzXHJcbiAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xyXG4gICAgICAgICAgICAvL2NvbG9yXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoY1t0aGlzLmNvbG9yQ29sXSwgciwgc3RhdENvbG9yKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIWNvbCkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vd2lkdGhcclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgICAgICBjb25zdCB3RyA9IHRoaXMud2lkdGggPyB0aGlzLndpZHRoKGNbdGhpcy53aWR0aENvbF0sIHIsIHN0YXRXaWR0aCwgemYpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPCAwKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy9oZWlnaHRcclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgICAgICBjb25zdCBoRyA9IHRoaXMuaGVpZ2h0ID8gdGhpcy5oZWlnaHQoY1t0aGlzLmhlaWdodENvbF0sIHIsIHN0YXRIZWlnaHQsIHpmKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIWhHIHx8IGhHIDwgMCkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxyXG4gICAgICAgICAgICAvL1RPRE8gdXNlIHRoYXRcclxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoYywgciwgemYpXHJcblxyXG4gICAgICAgICAgICAvL2NvbXB1dGUgY2VsbCBjZW50cmUgcG9zdGl0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IGN4ID0gYy54ICsgciAvIDJcclxuICAgICAgICAgICAgY29uc3QgY3kgPSBjLnkgKyByIC8gMlxyXG5cclxuICAgICAgICAgICAgLy9jb21wdXRlIGFuZ2xlXHJcbiAgICAgICAgICAgIGNvbnN0IGR4ID0gY3ggLSBjdngsXHJcbiAgICAgICAgICAgICAgICBkeSA9IGN5IC0gY3Z5XHJcbiAgICAgICAgICAgIGNvbnN0IGEgPSBNYXRoLmF0YW4yKGR5LCBkeClcclxuICAgICAgICAgICAgY29uc3QgRCA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSlcclxuICAgICAgICAgICAgY29uc3QgZCA9IChEICogaEcpIC8gKEggLSBoRylcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNpbXBsZSkge1xyXG4gICAgICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnRcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IGNvbFxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IHdHXHJcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY3gsIGN5KVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCArIGQgKiBNYXRoLmNvcyhhKSwgY3kgKyBkICogTWF0aC5zaW4oYSkpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vZHJhdyBiYWNrZ3JvdW5kIHNlZ21lbnRcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMub3V0bGluZUNvbFxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IHdHICsgMiAqIHRoaXMub3V0bGluZVdpZHRoUGl4ICogemZcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhjeCwgY3kpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4ICsgZCAqIE1hdGguY29zKGEpLCBjeSArIGQgKiBNYXRoLnNpbihhKSlcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxyXG5cclxuICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lV2lkdGggPSB3R1xyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubW92ZVRvKGN4LCBjeSlcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3ggKyBkICogTWF0aC5jb3MoYSksIGN5ICsgZCAqIE1hdGguc2luKGEpKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXHJcblxyXG4gICAgICAgICAgICAgICAgLy9kcmF3IHRvcCBjaXJjbGVcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMub3V0bGluZUNvbFxyXG4gICAgICAgICAgICAgICAgLy9jZy5jdHguZmlsbFN0eWxlID0gXCIjYzA4YzU5XCJcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lV2lkdGggPSB0aGlzLm91dGxpbmVXaWR0aFBpeCAqIHpmXHJcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5hcmMoY3ggKyBkICogTWF0aC5jb3MoYSksIGN5ICsgZCAqIE1hdGguc2luKGEpLCB3RyAqIDAuNSwgMCwgMiAqIE1hdGguUEksIGZhbHNlKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgICAgICAgICAvL2NnLmN0eC5maWxsKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vaW4gY2FzZS4uLlxyXG4gICAgICAgIGNnLmN0eC5saW5lQ2FwID0gJ2J1dHQnXHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcclxuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcjogciwgemY6IHpmLCBzQ29sb3I6IHN0YXRDb2xvciB9KVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcclxuXHJcbi8qKlxyXG4gKiBBIHN0eWxlIHdoZXJlIGVhY2ggY2VsbCBpcyByZXByZXNlbnRlZCBieSBhIHNlZ21lbnQgd2hvc2UgbGVuZ3RoLCB3aWR0aCwgY29sb3IgYW5kIG9yaWVudGF0aW9uIGNhbiB2YXJ5IGFjY29yZGluZyB0byBzdGF0aXN0aWNhbCB2YWx1ZXMuXHJcbiAqXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTZWdtZW50U3R5bGUgZXh0ZW5kcyBTdHlsZSB7XHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgb3JpZW50YXRpb24gKGluIGRlZ3JlZXMpIG9mIHRoZSBzZWdtZW50IHJlcHJlc2VudGluZyBhIGNlbGwuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCk6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMub3JpZW50YXRpb24gPSBvcHRzLm9yaWVudGF0aW9uIHx8ICgoKSA9PiAwKVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3JDb2wgPSBvcHRzLmNvbG9yQ29sXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNlbGwgc2VnbWVudC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCk6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI0VBNkJBQycpXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5sZW5ndGhDb2wgPSBvcHRzLmxlbmd0aENvbFxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGxlbmd0aCBvZiB0aGUgc2VnbWVudCByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMubGVuZ3RoID0gb3B0cy5sZW5ndGhcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLndpZHRoQ29sID0gb3B0cy53aWR0aENvbFxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHdpZHRoIG9mIHRoZSBzZWdtZW50IHJlcHJlc2VudGluZyBhIGNlbGwsIGluIGdlbyB1bml0XHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGhcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgY2VsbHMgYXMgc2VnbWVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL3pvb20gZmFjdG9yXHJcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXHJcblxyXG4gICAgICAgIGxldCBzdGF0Q29sb3JcclxuICAgICAgICBpZiAodGhpcy5jb2xvckNvbCkge1xyXG4gICAgICAgICAgICAvL2NvbXB1dGUgY29sb3IgdmFyaWFibGUgc3RhdGlzdGljc1xyXG4gICAgICAgICAgICBzdGF0Q29sb3IgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLmNvbG9yQ29sXSwgdHJ1ZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzdGF0TGVuZ3RoXHJcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoQ29sKSB7XHJcbiAgICAgICAgICAgIC8vaWYgbGVuZ3RoIGlzIHVzZWQsIHNvcnQgY2VsbHMgYnkgbGVuZ3RoIHNvIHRoYXQgdGhlIGxvbmdlc3RzIGFyZSBkcmF3biBmaXJzdFxyXG4gICAgICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IGMyW3RoaXMubGVuZ3RoQ29sXSAtIGMxW3RoaXMubGVuZ3RoQ29sXSlcclxuICAgICAgICAgICAgLy9hbmQgY29tcHV0ZSBzaXplIHZhcmlhYmxlIHN0YXRpc3RpY3NcclxuICAgICAgICAgICAgc3RhdExlbmd0aCA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMubGVuZ3RoQ29sXSwgdHJ1ZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzdGF0V2lkdGhcclxuICAgICAgICBpZiAodGhpcy53aWR0aENvbCkge1xyXG4gICAgICAgICAgICAvL2FuZCBjb21wdXRlIHNpemUgdmFyaWFibGUgc3RhdGlzdGljc1xyXG4gICAgICAgICAgICBzdGF0V2lkdGggPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLndpZHRoQ29sXSwgdHJ1ZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgY2cuY3R4LmxpbmVDYXAgPSAnYnV0dCdcclxuXHJcbiAgICAgICAgLy9jb252ZXJzaW9uIGZhY3RvciBkZWdyZWUgLT4gcmFkaWFuXHJcbiAgICAgICAgY29uc3QgZiA9IE1hdGguUEkgLyAxODBcclxuXHJcbiAgICAgICAgLy9kcmF3IGluIGdlbyBjb29yZGluYXRlc1xyXG4gICAgICAgIGNnLnNldENhbnZhc1RyYW5zZm9ybSgpXHJcblxyXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgLy9jb2xvclxyXG4gICAgICAgICAgICAvKiogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9ICovXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNbdGhpcy5jb2xvckNvbF0sIHIsIHN0YXRDb2xvcikgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgaWYgKCFjb2wpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL3dpZHRoXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChjW3RoaXMud2lkdGhDb2xdLCByLCBzdGF0V2lkdGgsIHpmKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIXdHIHx8IHdHIDwgMCkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vbGVuZ3RoXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3QgbEcgPSB0aGlzLmxlbmd0aCA/IHRoaXMubGVuZ3RoKGNbdGhpcy5sZW5ndGhDb2xdLCByLCBzdGF0TGVuZ3RoLCB6ZikgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgaWYgKCFsRyB8fCBsRyA8IDApIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL29yaWVudGF0aW9uIChpbiByYWRpYW4pXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgICAgICBjb25zdCBvciA9IHRoaXMub3JpZW50YXRpb24oYykgKiBmXHJcbiAgICAgICAgICAgIGlmIChvciA9PT0gdW5kZWZpbmVkIHx8IGlzTmFOKG9yKSkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxyXG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjLCByLCB6ZilcclxuXHJcbiAgICAgICAgICAgIC8vc2V0IGNvbG9yIGFuZCB3aWR0aFxyXG4gICAgICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xcclxuICAgICAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IHdHXHJcblxyXG4gICAgICAgICAgICAvL2NvbXB1dGUgc2VnbWVudCBjZW50cmUgcG9zdGl0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IGN4ID0gYy54ICsgciAvIDIgKyBvZmZzZXQuZHhcclxuICAgICAgICAgICAgY29uc3QgY3kgPSBjLnkgKyByIC8gMiArIG9mZnNldC5keVxyXG5cclxuICAgICAgICAgICAgLy9jb21wdXRlIHNlZ21lbnQgZGlyZWN0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IGR4ID0gMC41ICogTWF0aC5jb3Mob3IpICogbEdcclxuICAgICAgICAgICAgY29uc3QgZHkgPSAwLjUgKiBNYXRoLnNpbihvcikgKiBsR1xyXG5cclxuICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnRcclxuICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY3ggLSBkeCwgY3kgLSBkeSlcclxuICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCArIGR4LCBjeSArIGR5KVxyXG4gICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZCwgaWYgYW55XHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHtcclxuICAgICAgICAgICAgc3R5bGU6IHRoaXMsXHJcbiAgICAgICAgICAgIHI6IHIsXHJcbiAgICAgICAgICAgIHpmOiB6ZixcclxuICAgICAgICAgICAgc0NvbG9yOiBzdGF0Q29sb3IsXHJcbiAgICAgICAgICAgIHNMZW5ndGg6IHN0YXRMZW5ndGgsXHJcbiAgICAgICAgICAgIHNXaWR0aDogc3RhdFdpZHRoLFxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL1N0eWxlLmpzJ1xyXG5cclxuLyoqXHJcbiAqIEEgdmVyeSBnZW5lcmljIHN0eWxlIHRoYXQgc2hvd3MgZ3JpZCBjZWxscyB3aXRoIHNwZWNpZmljIGNvbG9yLCBzaXplIGFuZCBzaGFwZS5cclxuICogSXQgY2FuIGJlIHVzZWQgdG8gc2hvdyB2YXJpYWJsZXMgYXMgY2VsbCBjb2xvcnMsIGNlbGwgc2l6ZSwgY2VsbCBzaGFwZSwgb3IgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSB0aHJlZSB2aXN1YWwgdmFyaWFibGVzLlxyXG4gKlxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU2hhcGVDb2xvclNpemVTdHlsZSBleHRlbmRzIFN0eWxlIHtcclxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciBjb2xvci5cclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3JDb2wgPSBvcHRzLmNvbG9yQ29sXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNlbGwuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+ICcjRUE2QkFDJykgLy8odixyLHMsemYpID0+IHt9XHJcblxyXG4gICAgICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uL2F0dHJpYnV0ZSBvZiB0aGUgdGFidWxhciBkYXRhIHdoZXJlIHRvIHJldHJpZXZlIHRoZSB2YXJpYWJsZSBmb3Igc2l6ZS5cclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuc2l6ZUNvbCA9IG9wdHMuc2l6ZUNvbFxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgYSBjZWxsIGluIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZVxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNoYXBlIG9mIGEgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsKTppbXBvcnQoXCIuLi9TdHlsZVwiKS5TaGFwZX0gKi9cclxuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKCkgPT4gJ3NxdWFyZScpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHNxdWFyZXMsIHdpdGggdmFyaW91cyBjb2xvcnMgYW5kIHNpemUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL3pvb20gZmFjdG9yXHJcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXHJcblxyXG4gICAgICAgIGxldCBzdGF0U2l6ZVxyXG4gICAgICAgIGlmICh0aGlzLnNpemVDb2wpIHtcclxuICAgICAgICAgICAgLy9pZiBzaXplIGlzIHVzZWQsIHNvcnQgY2VsbHMgYnkgc2l6ZSBzbyB0aGF0IHRoZSBiaWdnZXN0IGFyZSBkcmF3biBmaXJzdFxyXG4gICAgICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IGMyW3RoaXMuc2l6ZUNvbF0gLSBjMVt0aGlzLnNpemVDb2xdKVxyXG4gICAgICAgICAgICAvL2FuZCBjb21wdXRlIHNpemUgdmFyaWFibGUgc3RhdGlzdGljc1xyXG4gICAgICAgICAgICBzdGF0U2l6ZSA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMuc2l6ZUNvbF0sIHRydWUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc3RhdENvbG9yXHJcbiAgICAgICAgaWYgKHRoaXMuY29sb3JDb2wpIHtcclxuICAgICAgICAgICAgLy9jb21wdXRlIGNvbG9yIHZhcmlhYmxlIHN0YXRpc3RpY3NcclxuICAgICAgICAgICAgc3RhdENvbG9yID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5jb2xvckNvbF0sIHRydWUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2RyYXcgd2l0aCBIVE1MIGNhbnZhc1xyXG4gICAgICAgIC8vaW4gZ2VvIGNvb3JkaW5hdGVzXHJcbiAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcclxuXHJcbiAgICAgICAgY29uc3QgcjIgPSByICogMC41XHJcbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xyXG4gICAgICAgICAgICAvL2NvbG9yXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNlbGxbdGhpcy5jb2xvckNvbF0sIHIsIHN0YXRDb2xvciwgemYpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxyXG4gICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gY29sXHJcblxyXG4gICAgICAgICAgICAvL3NoYXBlXHJcbiAgICAgICAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5zaGFwZSA/IHRoaXMuc2hhcGUoY2VsbCkgOiAnc3F1YXJlJ1xyXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdub25lJykgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vc2l6ZVxyXG4gICAgICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgICAgIGxldCBzXyA9IHRoaXMuc2l6ZSB8fCAoKCkgPT4gcilcclxuICAgICAgICAgICAgLy9zaXplIC0gaW4gZ2VvIHVuaXRcclxuICAgICAgICAgICAgY29uc3Qgc0cgPSBzXyhjZWxsW3RoaXMuc2l6ZUNvbF0sIHIsIHN0YXRTaXplLCB6ZilcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxyXG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByLCB6ZilcclxuXHJcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ3NxdWFyZScpIHtcclxuICAgICAgICAgICAgICAgIC8vZHJhdyBzcXVhcmVcclxuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSByICogKDEgLSBzRyAvIHIpICogMC41XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFJlY3QoY2VsbC54ICsgZCArIG9mZnNldC5keCwgY2VsbC55ICsgZCArIG9mZnNldC5keSwgc0csIHNHKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnY2lyY2xlJykge1xyXG4gICAgICAgICAgICAgICAgLy9kcmF3IGNpcmNsZVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHguYXJjKGNlbGwueCArIHIyICsgb2Zmc2V0LmR4LCBjZWxsLnkgKyByMiArIG9mZnNldC5keSwgc0cgKiAwLjUsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSlcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKClcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ2RvbnV0Jykge1xyXG4gICAgICAgICAgICAgICAgLy9kcmF3IGRvbnV0XHJcbiAgICAgICAgICAgICAgICBjb25zdCB4YyA9IGNlbGwueCArIHIyICsgb2Zmc2V0LmR4LFxyXG4gICAgICAgICAgICAgICAgICAgIHljID0gY2VsbC55ICsgcjIgKyBvZmZzZXQuZHlcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyh4YywgeWMpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHguYXJjKHhjLCB5YywgcjIsIDAsIDIgKiBNYXRoLlBJKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmFyYyh4YywgeWMsICgxIC0gc0cgLyByKSAqIHIyLCAwLCAyICogTWF0aC5QSSwgdHJ1ZSlcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5jbG9zZVBhdGgoKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGwoKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnZGlhbW9uZCcpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHMyID0gc0cgKiAwLjVcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhjZWxsLnggKyByMiAtIHMyLCBjZWxsLnkgKyByMilcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY2VsbC54ICsgcjIsIGNlbGwueSArIHIyICsgczIpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGNlbGwueCArIHIyICsgczIsIGNlbGwueSArIHIyKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjZWxsLnggKyByMiwgY2VsbC55ICsgcjIgLSBzMilcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaGFwZTonICsgc2hhcGUpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcclxuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcjogciwgemY6IHpmLCBzU2l6ZTogc3RhdFNpemUsIHNDb2xvcjogc3RhdENvbG9yIH0pXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL1N0eWxlLmpzJ1xyXG5cclxuLyoqIEB0eXBlZGVmIHt7eDpudW1iZXIseTpudW1iZXIsb3I6XCJ2XCJ8XCJoXCIsdjE6c3RyaW5nfHVuZGVmaW5lZCx2MjpzdHJpbmd8dW5kZWZpbmVkfX0gU2lkZSAqL1xyXG5cclxuLyoqXHJcbiAqIEEgc3R5bGUgdG8gc2hvdyB0aGUgc2lkZXMgb2YgZ3JpZCBjZWxscyBiYXNlZCBvbiB0aGVpciBkaWZmZXJlbnQgY2F0ZWdvcmllcy5cclxuICpcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNpZGVDYXRTdHlsZSBleHRlbmRzIFN0eWxlIHtcclxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIGNhdGVnb3JpY2FsIHZhbHVlLlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2wgPSBvcHRzLmNvbFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGljdGlvbmFyeSAoc3RyaW5nIC0+IGNvbG9yKSB3aGljaCBnaXZlIHRoZSBjb2xvciBvZiBlYWNoIGNhdGVnb3J5LlxyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3JcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiBhIGNlbGwgc2lkZSBsaW5lLCBpbiBnZW8gdW5pdFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihTaWRlLG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKHNpZGUsIHIsIHopID0+IHIgKiAwLjIpXHJcblxyXG4gICAgICAgIC8qKiBBIGZpbGwgY29sb3IgZm9yIHRoZSBjZWxscy5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsKTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5maWxsQ29sb3IgPSBvcHRzLmZpbGxDb2xvclxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICBpZiAoIWNlbGxzIHx8IGNlbGxzLmxlbmd0aCA9PSAwKSByZXR1cm5cclxuXHJcbiAgICAgICAgLy96b29tIGZhY3RvclxyXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxyXG5cclxuICAgICAgICAvKiogIEB0eXBlIHtBcnJheS48U2lkZT59ICovXHJcbiAgICAgICAgY29uc3Qgc2lkZXMgPSBbXVxyXG5cclxuICAgICAgICAvL21ha2UgaG9yaXpvbnRhbCBzaWRlc1xyXG4gICAgICAgIC8vc29ydCBjZWxscyBieSB4IGFuZCB5XHJcbiAgICAgICAgY2VsbHMuc29ydCgoYzEsIGMyKSA9PiAoYzIueCA9PSBjMS54ID8gYzEueSAtIGMyLnkgOiBjMS54IC0gYzIueCkpXHJcbiAgICAgICAgbGV0IGMxID0gY2VsbHNbMF1cclxuICAgICAgICBsZXQgdjEgPSBjMVt0aGlzLmNvbF1cclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBjMiA9IGNlbGxzW2ldXHJcbiAgICAgICAgICAgIGxldCB2MiA9IGMyW3RoaXMuY29sXVxyXG5cclxuICAgICAgICAgICAgaWYgKGMxLnkgKyByID09IGMyLnkgJiYgYzEueCA9PSBjMi54KSB7XHJcbiAgICAgICAgICAgICAgICAvL2NlbGxzIGluIHNhbWUgY29sdW1uIGFuZCB0b3VjaCBhbG9uZyBob3Jpem9udGFsIHNpZGVcclxuICAgICAgICAgICAgICAgIC8vbWFrZSBzaGFyZWQgc2lkZVxyXG4gICAgICAgICAgICAgICAgaWYgKHYxICE9IHYyKSBzaWRlcy5wdXNoKHsgeDogYzEueCwgeTogYzIueSwgb3I6ICdoJywgdjE6IHYxLCB2MjogdjIgfSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vY2VsbHMgZG8gbm90IHRvdWNoIGFsb25nIGhvcml6b250YWwgc2lkZVxyXG4gICAgICAgICAgICAgICAgLy9tYWtlIHR3byBzaWRlczogdG9wIG9uZSBmb3IgYzEsIGJvdHRvbSBmb3IgYzJcclxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goeyB4OiBjMS54LCB5OiBjMS55ICsgciwgb3I6ICdoJywgdjE6IHYxLCB2MjogdW5kZWZpbmVkIH0pXHJcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHsgeDogYzIueCwgeTogYzIueSwgb3I6ICdoJywgdjE6IHVuZGVmaW5lZCwgdjI6IHYyIH0pXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGMxID0gYzJcclxuICAgICAgICAgICAgdjEgPSB2MlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9tYWtlIHZlcnRpY2FsIHNpZGVzXHJcbiAgICAgICAgLy9zb3J0IGNlbGxzIGJ5IHkgYW5kIHhcclxuICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IChjMi55ID09IGMxLnkgPyBjMS54IC0gYzIueCA6IGMxLnkgLSBjMi55KSlcclxuICAgICAgICBjMSA9IGNlbGxzWzBdXHJcbiAgICAgICAgdjEgPSBjMVt0aGlzLmNvbF1cclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBjMiA9IGNlbGxzW2ldXHJcbiAgICAgICAgICAgIGxldCB2MiA9IGMyW3RoaXMuY29sXVxyXG5cclxuICAgICAgICAgICAgaWYgKGMxLnggKyByID09IGMyLnggJiYgYzEueSA9PSBjMi55KSB7XHJcbiAgICAgICAgICAgICAgICAvL2NlbGxzIGluIHNhbWUgcm93IGFuZCB0b3VjaCBhbG9uZyB2ZXJ0aWNhbCBzaWRlXHJcbiAgICAgICAgICAgICAgICAvL21ha2Ugc2hhcmVkIHNpZGVcclxuICAgICAgICAgICAgICAgIGlmICh2MSAhPSB2Mikgc2lkZXMucHVzaCh7IHg6IGMxLnggKyByLCB5OiBjMS55LCBvcjogJ3YnLCB2MTogdjEsIHYyOiB2MiB9KVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9jZWxscyBkbyBub3QgdG91Y2ggYWxvbmcgdmVydGljYWwgc2lkZVxyXG4gICAgICAgICAgICAgICAgLy9tYWtlIHR3byBzaWRlczogcmlnaHQgb25lIGZvciBjMSwgbGVmdCBmb3IgYzJcclxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goeyB4OiBjMS54ICsgciwgeTogYzEueSwgb3I6ICd2JywgdjE6IHYxLCB2MjogdW5kZWZpbmVkIH0pXHJcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHsgeDogYzIueCwgeTogYzIueSwgb3I6ICd2JywgdjE6IHVuZGVmaW5lZCwgdjI6IHYyIH0pXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGMxID0gYzJcclxuICAgICAgICAgICAgdjEgPSB2MlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICBpZiAoc2lkZXMubGVuZ3RoID09IDApIHJldHVyblxyXG5cclxuICAgICAgICAvL2RyYXcgaW4gZ2VvIGNvb3JkaW5hdGVzXHJcbiAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcclxuXHJcbiAgICAgICAgLy9kcmF3IGNlbGxzLCBpZiBmaWxsQ29sb3Igc3BlY2lmaWVkXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsbENvbG9yKVxyXG4gICAgICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmYyA9IHRoaXMuZmlsbENvbG9yKGMpXHJcbiAgICAgICAgICAgICAgICBpZiAoIWZjIHx8IGZjID09ICdub25lJykgY29udGludWVcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsU3R5bGUgPSBmY1xyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KGMueCwgYy55LCByLCByKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vZHJhdyBzaWRlc1xyXG4gICAgICAgIGNnLmN0eC5saW5lQ2FwID0gJ2J1dHQnXHJcbiAgICAgICAgZm9yIChsZXQgcyBvZiBzaWRlcykge1xyXG4gICAgICAgICAgICAvL3dpZHRoXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChzLCByLCB6ZikgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8PSAwKSBjb250aW51ZVxyXG4gICAgICAgICAgICBjb25zdCB3MiA9IHdHICogMC41XHJcblxyXG4gICAgICAgICAgICAvL3NldCBjb2xvciBhbmQgd2lkdGhcclxuICAgICAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IHdHXHJcblxyXG4gICAgICAgICAgICAvL2RyYXcgc2VnbWVudCB3aXRoIGNvcnJlY3Qgb3JpZW50YXRpb25cclxuICAgICAgICAgICAgaWYgKHMub3IgPT09ICdoJykge1xyXG4gICAgICAgICAgICAgICAgLy90b3AgbGluZVxyXG4gICAgICAgICAgICAgICAgaWYgKHMudjIpIHtcclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbG9yW3MudjJdXHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhzLngsIHMueSArIHcyKVxyXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8ocy54ICsgciwgcy55ICsgdzIpXHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9ib3R0b20gbGluZVxyXG4gICAgICAgICAgICAgICAgaWYgKHMudjEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbG9yW3MudjFdXHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhzLngsIHMueSAtIHcyKVxyXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8ocy54ICsgciwgcy55IC0gdzIpXHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvL3JpZ2h0IGxpbmVcclxuICAgICAgICAgICAgICAgIGlmIChzLnYyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xvcltzLnYyXVxyXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8ocy54ICsgdzIsIHMueSlcclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKHMueCArIHcyLCBzLnkgKyByKVxyXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vbGVmdCBsaW5lXHJcbiAgICAgICAgICAgICAgICBpZiAocy52MSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sb3Jbcy52MV1cclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHgubW92ZVRvKHMueCAtIHcyLCBzLnkpXHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhzLnggLSB3Miwgcy55ICsgcilcclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByOiByLCB6ZjogemYgfSlcclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXHJcblxyXG4vKiogQHR5cGVkZWYge3t4Om51bWJlcix5Om51bWJlcixvcjpcInZcInxcImhcIix2YWx1ZTpudW1iZXJ9fSBTaWRlICovXHJcblxyXG4vKipcclxuICpcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNpZGVTdHlsZSBleHRlbmRzIFN0eWxlIHtcclxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciB0aGUgY2VsbCB2YWx1ZXMuXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnZhbHVlQ29sID0gb3B0cy52YWx1ZUNvbFxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHZhbHVlIG9mIGEgY2VsbCBzaWRlLiBUaGlzIHZhbHVlIGlzIGNvbXB1dGVkIGZyb20gdGhlIHR3byBhZGphY2VudCBjZWxsIHZhbHVlcy5cclxuICAgICAgICAgKiBGb3IgaG9yaXpvbnRhbCBzaWRlcywgdjEgaXMgdGhlIHZhbHVlIG9mIHRoZSBjZWxsIGJlbG93IGFuZCB2MiB0aGUgdmFsdWUgb2YgdGhlIGNlbGwgYWJvdmUuXHJcbiAgICAgICAgICogRm9yIHZlcnRpY2FsIHNpZGVzLCB2MSBpcyB0aGUgdmFsdWUgb2YgdGhlIGNlbGwgbGVmdCBhbmQgdjIgdGhlIHZhbHVlIG9mIHRoZSBjZWxsIHJpZ2h0LlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXJ8dW5kZWZpbmVkLG51bWJlcnx1bmRlZmluZWQsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBvcHRzLnZhbHVlIHx8ICgodjEsIHYyLCByLCBzLCB6ZikgPT4gMSlcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiBhIGNlbGwgc2lkZS5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oU2lkZSxudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+ICcjRUE2QkFDJylcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiBhIGNlbGwgc2lkZSwgaW4gZ2VvIHVuaXRcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oU2lkZSxudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChzaWRlLCByLCBzLCB6ZikgPT4gKHIgKiBzaWRlLnZhbHVlKSAvIDUpXHJcblxyXG4gICAgICAgIC8qKiBvcmllbnRhdGlvbi4gU2V0IHRvIDkwIHRvIHNob3cgc2lkZXMgYXMgc2xvcGUgbGluZXMgZm9yIGV4YW1wbGUuXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gb3B0cy5vcmllbnRhdGlvbiB8fCAwXHJcblxyXG4gICAgICAgIC8qKiBBIGZpbGwgY29sb3IgZm9yIHRoZSBjZWxscy5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsKTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5maWxsQ29sb3IgPSBvcHRzLmZpbGxDb2xvclxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL3pvb20gZmFjdG9yXHJcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXHJcblxyXG4gICAgICAgIC8vY29tcHV0ZSBzdGF0cyBvbiBjZWxsIHZhbHVlc1xyXG4gICAgICAgIGxldCBzdGF0VmFsdWVcclxuICAgICAgICBpZiAodGhpcy52YWx1ZUNvbCkge1xyXG4gICAgICAgICAgICAvL2NvbXB1dGUgY29sb3IgdmFyaWFibGUgc3RhdGlzdGljc1xyXG4gICAgICAgICAgICBzdGF0VmFsdWUgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLnZhbHVlQ29sXSwgdHJ1ZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKiAgQHR5cGUge0FycmF5LjxTaWRlPn0gKi9cclxuICAgICAgICBjb25zdCBzaWRlcyA9IFtdXHJcblxyXG4gICAgICAgIGNvbnN0IGVwc2lsb24gPSByICogMC4wMDFcclxuXHJcbiAgICAgICAgLy9tYWtlIGhvcml6b250YWwgc2lkZXNcclxuICAgICAgICAvL3NvcnQgY2VsbHMgYnkgeCBhbmQgeVxyXG4gICAgICAgIGNlbGxzLnNvcnQoKGMxLCBjMikgPT4gKGMyLnggPT0gYzEueCA/IGMxLnkgLSBjMi55IDogYzEueCAtIGMyLngpKVxyXG4gICAgICAgIGxldCBjMSA9IGNlbGxzWzBdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgYzIgPSBjZWxsc1tpXVxyXG5cclxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGMxLnkgKyByIC0gYzIueSkgPD0gZXBzaWxvbiAmJiBNYXRoLmFicyhjMS54IC0gYzIueCkgPD0gZXBzaWxvbilcclxuICAgICAgICAgICAgICAgIC8vY2VsbHMgaW4gc2FtZSBjb2x1bW4gYW5kIHRvdWNoIGFsb25nIGhvcml6b250YWwgc2lkZVxyXG4gICAgICAgICAgICAgICAgLy9tYWtlIHNoYXJlZCBzaWRlXHJcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICB4OiBjMS54LFxyXG4gICAgICAgICAgICAgICAgICAgIHk6IGMyLnksXHJcbiAgICAgICAgICAgICAgICAgICAgb3I6ICdoJyxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZShjMVt0aGlzLnZhbHVlQ29sXSwgYzJbdGhpcy52YWx1ZUNvbF0sIHIsIHN0YXRWYWx1ZSwgemYpLFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvL2NlbGxzIGRvIG5vdCB0b3VjaCBhbG9uZyBob3Jpem9udGFsIHNpZGVcclxuICAgICAgICAgICAgICAgIC8vbWFrZSB0d28gc2lkZXM6IHRvcCBvbmUgZm9yIGMxLCBib3R0b20gZm9yIGMyXHJcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICB4OiBjMS54LFxyXG4gICAgICAgICAgICAgICAgICAgIHk6IGMxLnkgKyByLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yOiAnaCcsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUoYzFbdGhpcy52YWx1ZUNvbF0sIHVuZGVmaW5lZCwgciwgc3RhdFZhbHVlLCB6ZiksXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgeDogYzIueCxcclxuICAgICAgICAgICAgICAgICAgICB5OiBjMi55LFxyXG4gICAgICAgICAgICAgICAgICAgIG9yOiAnaCcsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUodW5kZWZpbmVkLCBjMlt0aGlzLnZhbHVlQ29sXSwgciwgc3RhdFZhbHVlLCB6ZiksXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjMSA9IGMyXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL21ha2UgdmVydGljYWwgc2lkZXNcclxuICAgICAgICAvL3NvcnQgY2VsbHMgYnkgeSBhbmQgeFxyXG4gICAgICAgIGNlbGxzLnNvcnQoKGMxLCBjMikgPT4gKGMyLnkgPT0gYzEueSA/IGMxLnggLSBjMi54IDogYzEueSAtIGMyLnkpKVxyXG4gICAgICAgIGMxID0gY2VsbHNbMF1cclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBjMiA9IGNlbGxzW2ldXHJcblxyXG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoYzEueCArIHIgLSBjMi54KSA8PSBlcHNpbG9uICYmIE1hdGguYWJzKGMxLnkgLSBjMi55KSA8PSBlcHNpbG9uKVxyXG4gICAgICAgICAgICAgICAgLy9jZWxscyBpbiBzYW1lIHJvdyBhbmQgdG91Y2ggYWxvbmcgdmVydGljYWwgc2lkZVxyXG4gICAgICAgICAgICAgICAgLy9tYWtlIHNoYXJlZCBzaWRlXHJcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICB4OiBjMS54ICsgcixcclxuICAgICAgICAgICAgICAgICAgICB5OiBjMS55LFxyXG4gICAgICAgICAgICAgICAgICAgIG9yOiAndicsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUoYzFbdGhpcy52YWx1ZUNvbF0sIGMyW3RoaXMudmFsdWVDb2xdLCByLCBzdGF0VmFsdWUsIHpmKSxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9jZWxscyBkbyBub3QgdG91Y2ggYWxvbmcgdmVydGljYWwgc2lkZVxyXG4gICAgICAgICAgICAgICAgLy9tYWtlIHR3byBzaWRlczogcmlnaHQgb25lIGZvciBjMSwgbGVmdCBmb3IgYzJcclxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIHg6IGMxLnggKyByLFxyXG4gICAgICAgICAgICAgICAgICAgIHk6IGMxLnksXHJcbiAgICAgICAgICAgICAgICAgICAgb3I6ICd2JyxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZShjMVt0aGlzLnZhbHVlQ29sXSwgdW5kZWZpbmVkLCByLCBzdGF0VmFsdWUsIHpmKSxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICB4OiBjMi54LFxyXG4gICAgICAgICAgICAgICAgICAgIHk6IGMyLnksXHJcbiAgICAgICAgICAgICAgICAgICAgb3I6ICd2JyxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZSh1bmRlZmluZWQsIGMyW3RoaXMudmFsdWVDb2xdLCByLCBzdGF0VmFsdWUsIHpmKSxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGMxID0gYzJcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgaWYgKHNpZGVzLmxlbmd0aCA9PSAwKSByZXR1cm5cclxuXHJcbiAgICAgICAgLy9jb21wdXRlIHN0YXRzIG9uIHNpZGVzXHJcbiAgICAgICAgY29uc3Qgc3RhdFNpZGVzID0gU2lkZVN0eWxlLmdldFNpZGVTdGF0aXN0aWNzKHNpZGVzLCB0cnVlKVxyXG5cclxuICAgICAgICAvL2RyYXcgaW4gZ2VvIGNvb3JkaW5hdGVzXHJcbiAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcclxuXHJcbiAgICAgICAgLy9kcmF3IGNlbGxzLCBpZiBmaWxsQ29sb3Igc3BlY2lmaWVkXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsbENvbG9yKVxyXG4gICAgICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmYyA9IHRoaXMuZmlsbENvbG9yKGMpXHJcbiAgICAgICAgICAgICAgICBpZiAoIWZjIHx8IGZjID09ICdub25lJykgY29udGludWVcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsU3R5bGUgPSBmY1xyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KGMueCwgYy55LCByLCByKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vZHJhdyBzaWRlc1xyXG4gICAgICAgIGNnLmN0eC5saW5lQ2FwID0gJ2J1dHQnXHJcbiAgICAgICAgY29uc3QgcjIgPSByIC8gMlxyXG4gICAgICAgIGZvciAobGV0IHMgb2Ygc2lkZXMpIHtcclxuICAgICAgICAgICAgLy9jb2xvclxyXG4gICAgICAgICAgICAvKiogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9ICovXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKHMsIHIsIHN0YXRTaWRlcywgemYpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PSAnbm9uZScpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL3dpZHRoXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChzLCByLCBzdGF0U2lkZXMsIHpmKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIXdHIHx8IHdHIDw9IDApIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL3NldCBjb2xvciBhbmQgd2lkdGhcclxuICAgICAgICAgICAgY2cuY3R4LnN0cm9rZVN0eWxlID0gY29sXHJcbiAgICAgICAgICAgIGNnLmN0eC5saW5lV2lkdGggPSB3R1xyXG5cclxuICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnQgd2l0aCBjb3JyZWN0IG9yaWVudGF0aW9uXHJcbiAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcmllbnRhdGlvbiA9PSA5MCkge1xyXG4gICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhzLnggKyByMiwgcy55ICsgcjIpXHJcbiAgICAgICAgICAgICAgICBpZiAocy5vciA9PT0gJ2gnKSBjZy5jdHgubGluZVRvKHMueCArIHIyLCBzLnkgLSByMilcclxuICAgICAgICAgICAgICAgIGVsc2UgY2cuY3R4LmxpbmVUbyhzLnggLSByMiwgcy55ICsgcjIpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubW92ZVRvKHMueCwgcy55KVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhzLnggKyAocy5vciA9PT0gJ2gnID8gciA6IDApLCBzLnkgKyAocy5vciA9PT0gJ3YnID8gciA6IDApKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByOiByLCB6ZjogemYgfSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgc29tZSBzdGF0aXN0aWNzIG9uIGEgdmFsdWUgb2Ygc29tZSBzaWRlcy5cclxuICAgICAqIFRoaXMgaXMgdXNlZCB0byBkZWZpbmUgaG93IHRvIGRyYXcgc3BlY2lmaWNhbGx5IHRoZSBzaWRlcyB3aXRoaW4gdGhlIHZpZXcuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48U2lkZT59IHNpZGVzXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVplcm9zXHJcbiAgICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCB8IHVuZGVmaW5lZH1cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGdldFNpZGVTdGF0aXN0aWNzKHNpZGVzLCBpZ25vcmVaZXJvcykge1xyXG4gICAgICAgIGlmICghc2lkZXMgfHwgc2lkZXMubGVuZ3RoID09IDApIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgICBsZXQgbWluID0gSW5maW5pdHlcclxuICAgICAgICBsZXQgbWF4ID0gLUluZmluaXR5XHJcbiAgICAgICAgLy9sZXQgc3VtID0gMFxyXG4gICAgICAgIC8vbGV0IG5iID0gMFxyXG4gICAgICAgIGZvciAoY29uc3QgcyBvZiBzaWRlcykge1xyXG4gICAgICAgICAgICBjb25zdCB2ID0gcy52YWx1ZVxyXG4gICAgICAgICAgICBpZiAoaWdub3JlWmVyb3MgJiYgIXYpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGlmICh2IDwgbWluKSBtaW4gPSB2XHJcbiAgICAgICAgICAgIGlmICh2ID4gbWF4KSBtYXggPSB2XHJcbiAgICAgICAgICAgIC8vc3VtICs9IHZcclxuICAgICAgICAgICAgLy9uYisrXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IG1pbjogbWluLCBtYXg6IG1heCB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL1N0eWxlLmpzJ1xyXG5pbXBvcnQgeyBtYWtlV2ViR0xDYW52YXMgfSBmcm9tICcuLi91dGlscy93ZWJHTFV0aWxzLmpzJ1xyXG5pbXBvcnQgeyBXZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQgfSBmcm9tICcuLi91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQuanMnXHJcbmltcG9ydCB7IG1vbml0b3IsIG1vbml0b3JEdXJhdGlvbiB9IGZyb20gJy4uL3V0aWxzL1V0aWxzLmpzJ1xyXG5cclxuLyoqXHJcbiAqIFN0eWxlIGJhc2VkIG9uIHdlYkdMXHJcbiAqIFRvIHNob3cgY2VsbHMgYXMgY29sb3JlZCBzcXVhcmVzLCBmcm9tIGNhdGVnb3JpZXMuXHJcbiAqIEFsbHMgc3F1YXJlcyB3aXRoIHRoZSBzYW1lIHNpemVcclxuICpcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNxdWFyZUNvbG9yQ2F0V0dMU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIGNhdGVnb3J5IG9mIHRoZSBjZWxsLCBmb3IgY29sb3JpbmcuXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvbG9yQ29sID0gb3B0cy5jb2xvckNvbFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGljdGlvbmFyeSAoc3RyaW5nIC0+IGNvbG9yKSB3aGljaCBnaXZlIHRoZSBjb2xvciBvZiBlYWNoIGNhdGVnb3J5LlxyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9ICovXHJcbiAgICAgICAgb3B0cy5jb2xvciA9IG9wdHMuY29sb3IgfHwgdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7IEFycmF5LjxzdHJpbmc+IH0gQHByaXZhdGUgKi9cclxuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob3B0cy5jb2xvcilcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHsgb2JqZWN0IH0gQHByaXZhdGUgKi9cclxuICAgICAgICB0aGlzLmNhdFRvSSA9IHt9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB0aGlzLmNhdFRvSVtrZXlzW2ldXSA9IGkgKyAnJ1xyXG5cclxuICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48c3RyaW5nPiB9IEBwcml2YXRlICovXHJcbiAgICAgICAgdGhpcy5jb2xvcnMgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLmNvbG9ycy5wdXNoKG9wdHMuY29sb3JbJycgKyBrZXlzW2ldXSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIHRoZSBjZWxscywgaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuIEFsbCBjZWxscyBoYXZlIHRoZSBzYW1lIHNpemUuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgLy8gKHJlc29sdXRpb24sIHpmKSA9PiAuLi5cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7IFdlYkdMU3F1YXJlQ29sb3JpbmdDYXRBZHZhbmNlZCB9ICovXHJcbiAgICAgICAgdGhpcy53Z3AgPSBuZXcgV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkKHRoaXMuY29sb3JzKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XHJcbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignKioqIFNxdWFyZUNvbG9yQ2F0V0dMU3R5bGUgZHJhdycpXHJcblxyXG4gICAgICAgIC8vZmlsdGVyXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcclxuXHJcbiAgICAgICAgLy96b29tIGZhY3RvclxyXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxyXG5cclxuICAgICAgICAvL2FkZCB2ZXJ0aWNlIGFuZCBmcmFnbWVudCBkYXRhXHJcbiAgICAgICAgY29uc3QgcjIgPSByIC8gMlxyXG4gICAgICAgIGxldCBjLFxyXG4gICAgICAgICAgICBuYiA9IGNlbGxzLmxlbmd0aFxyXG4gICAgICAgIGNvbnN0IHZlcnRpY2VzQnVmZmVyID0gW11cclxuICAgICAgICBjb25zdCBpQnVmZmVyID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5iOyBpKyspIHtcclxuICAgICAgICAgICAgYyA9IGNlbGxzW2ldXHJcbiAgICAgICAgICAgIGNvbnN0IGNhdCA9IGNbdGhpcy5jb2xvckNvbF1cclxuICAgICAgICAgICAgaWYgKGNhdCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdVbmV4cGVjdGVkIGNhdGVnb3J5OiAnICsgY2F0KVxyXG4gICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICAgICAgY29uc3QgaV8gPSB0aGlzLmNhdFRvSVtjYXRdXHJcbiAgICAgICAgICAgIGlmIChpc05hTigraV8pKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVW5leHBlY3RlZCBjYXRlZ29yeSBpbmRleDogJyArIGNhdCArICcgJyArIGlfKVxyXG4gICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2ZXJ0aWNlc0J1ZmZlci5wdXNoKGMueCArIHIyLCBjLnkgKyByMilcclxuICAgICAgICAgICAgaUJ1ZmZlci5wdXNoKCtpXylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyAgIHdlYmdsIHByb2dyYW0gaW5wdXRzIHByZXBhcmF0aW9uJylcclxuXHJcbiAgICAgICAgLy9jcmVhdGUgY2FudmFzIGFuZCB3ZWJnbCByZW5kZXJlclxyXG4gICAgICAgIGNvbnN0IGN2V0dMID0gbWFrZVdlYkdMQ2FudmFzKGNnLncgKyAnJywgY2cuaCArICcnKVxyXG4gICAgICAgIGlmICghY3ZXR0wpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gd2ViR0wnKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignICAgd2ViIEdMIGNhbnZhcyBjcmVhdGlvbicpXHJcblxyXG4gICAgICAgIC8vZHJhd1xyXG4gICAgICAgIGNvbnN0IHNpemVHZW8gPSB0aGlzLnNpemUgPyB0aGlzLnNpemUociwgemYpIDogciArIDAuMiAqIHpmXHJcbiAgICAgICAgdGhpcy53Z3AuZHJhdyhjdldHTC5nbCwgdmVydGljZXNCdWZmZXIsIGlCdWZmZXIsIGNnLmdldFdlYkdMVHJhbnNmb3JtKCksIHNpemVHZW8gLyB6ZilcclxuXHJcbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignICAgd2ViZ2wgZHJhd2luZycpXHJcblxyXG4gICAgICAgIC8vZHJhdyBpbiBjYW52YXMgZ2VvXHJcbiAgICAgICAgY2cuaW5pdENhbnZhc1RyYW5zZm9ybSgpXHJcbiAgICAgICAgY2cuY3R4LmRyYXdJbWFnZShjdldHTC5jYW52YXMsIDAsIDApXHJcblxyXG4gICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyAgIGNhbnZhcyBkcmF3aW5nJylcclxuXHJcbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByOiByLCB6ZjogemYgfSlcclxuXHJcbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignKioqIFNxdWFyZUNvbG9yQ2F0V0dMU3R5bGUgZW5kIGRyYXcnKVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcclxuaW1wb3J0IHsgbWFrZVdlYkdMQ2FudmFzIH0gZnJvbSAnLi4vdXRpbHMvd2ViR0xVdGlscy5qcydcclxuaW1wb3J0IHsgV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkIH0gZnJvbSAnLi4vdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkLmpzJ1xyXG5pbXBvcnQgeyBtb25pdG9yLCBtb25pdG9yRHVyYXRpb24gfSBmcm9tICcuLi91dGlscy9VdGlscy5qcydcclxuXHJcbi8qKlxyXG4gKiBTdHlsZSBiYXNlZCBvbiB3ZWJHTFxyXG4gKiBUbyBzaG93IGNlbGxzIGFzIGNvbG9yZWQgc3F1YXJlcywgd2l0aCBjb21wdXRhdGlvbiBvZiB0aGUgY29sb3JzIG9uIEdQVSBzaWRlIChmYXN0ZXIgdGhhbiBKYXZhU2NyaXB0IHNpZGUpLlxyXG4gKiBBbGxzIHNxdWFyZXMgd2l0aCB0aGUgc2FtZSBzaXplXHJcbiAqXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTcXVhcmVDb2xvcldHTFN0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uL2F0dHJpYnV0ZSBvZiB0aGUgdGFidWxhciBkYXRhIHdoZXJlIHRvIHJldHJpZXZlIHRoZSB2YXJpYWJsZSBmb3IgY29sb3IuXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvbG9yQ29sID0gb3B0cy5jb2xvckNvbFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgdCB2YWx1ZSAod2l0aGluIFswLDFdKSBvZiB0aGUgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy50RnVuID0gb3B0cy50RnVuIHx8ICgodiwgciwgcykgPT4gdiAvIHMubWF4KVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEaXN0cmlidXRpb24gc3RyZXRjaGluZyBtZXRob2QuXHJcbiAgICAgICAgICogVGhlIHN0cmV0Y2hpbmcgaXMgcGVyZm9ybWVkIG9uIEdQVSBzaWRlIChmcmFnbWVudCBzaGFkZXIpLlxyXG4gICAgICAgICAqIEB0eXBlIHt7IGZ1bjpzdHJpbmcsIGFscGhhOm51bWJlciB9fSAqL1xyXG4gICAgICAgIHRoaXMuc3RyZXRjaGluZyA9IG9wdHMuc3RyZXRjaGluZ1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgc2FtcGxlIG9mIHRoZSBjb2xvciByYW1wLlxyXG4gICAgICAgICAqIFRoZSBjb2xvciBpcyBjb21wdXRlZCBvbiBHUFUgc2lkZSAoZnJhZ21lbnQgc2hhZGVyKSBiYXNlZCBvbiB0aG9zZSB2YWx1ZXMgKGxpbmVhciBpbnRlcnBvbGF0aW9uKS5cclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPHN0cmluZz59ICovXHJcbiAgICAgICAgdGhpcy5jb2xvcnMgPVxyXG4gICAgICAgICAgICBvcHRzLmNvbG9ycyB8fFxyXG4gICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgICAncmdiKDE1OCwgMSwgNjYpJyxcclxuICAgICAgICAgICAgICAgICdyZ2IoMjQ4LCAxNDIsIDgzKScsXHJcbiAgICAgICAgICAgICAgICAncmdiKDI1MSwgMjQ4LCAxNzYpJyxcclxuICAgICAgICAgICAgICAgICdyZ2IoMTM3LCAyMDcsIDE2NSknLFxyXG4gICAgICAgICAgICAgICAgJ3JnYig5NCwgNzksIDE2MiknLFxyXG4gICAgICAgICAgICBdLnJldmVyc2UoKVxyXG4gICAgICAgIGlmIChvcHRzLmNvbG9yKVxyXG4gICAgICAgICAgICB0aGlzLmNvbG9ycyA9IFtcclxuICAgICAgICAgICAgICAgIG9wdHMuY29sb3IoMCksXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuMiksXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuNCksXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuNiksXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuOCksXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDEpLFxyXG4gICAgICAgICAgICBdXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERlZmluZSB0aGUgb3BhY2l0eSBvZiB0aGUgc3R5bGUsIHdpdGhpbiBbMCwxXS5cclxuICAgICAgICAgKiBJZiB0aGlzIG9wYWNpdHkgaXMgZGVmaW5lZCwgdGhlIGluZGl2aWR1YWwgY29sb3Igb3BhY2l0eSB3aWxsIGJlIGlnbm9yZWQuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLm9wYWNpdHkgPSBvcHRzLm9wYWNpdHkgLy8gKHIsemYpID0+IC4uLlxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiB0aGUgY2VsbHMsIGluIGdlb2dyYXBoaWNhbCB1bml0LiBBbGwgY2VsbHMgaGF2ZSB0aGUgc2FtZSBzaXplLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIC8vIChyZXNvbHV0aW9uLCB6ZikgPT4gLi4uXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2dcclxuICAgICAqL1xyXG4gICAgZHJhdyhjZWxscywgciwgY2cpIHtcclxuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcqKiogU3F1YXJlQ29sb3JXR0xTdHlsZSBkcmF3JylcclxuXHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL3pvb20gZmFjdG9yXHJcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXHJcblxyXG4gICAgICAgIC8vY29tcHV0ZSBjb2xvciB2YXJpYWJsZSBzdGF0aXN0aWNzXHJcbiAgICAgICAgY29uc3Qgc3RhdENvbG9yID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5jb2xvckNvbF0sIHRydWUpXHJcbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignICAgY29sb3Igc3RhdHMgY29tcHV0YXRpb24nKVxyXG5cclxuICAgICAgICBpZiAoIXN0YXRDb2xvcikgcmV0dXJuXHJcblxyXG4gICAgICAgIC8vY3JlYXRlIGNhbnZhcyBhbmQgd2ViZ2wgcmVuZGVyZXJcclxuICAgICAgICAvL2ZvciBvcGFjaXR5IGNvbnRyb2wsIHNlZTogaHR0cHM6Ly93ZWJnbGZ1bmRhbWVudGFscy5vcmcvd2ViZ2wvbGVzc29ucy93ZWJnbC1hbmQtYWxwaGEuaHRtbFxyXG4gICAgICAgIGNvbnN0IGN2V0dMID0gbWFrZVdlYkdMQ2FudmFzKFxyXG4gICAgICAgICAgICBjZy53ICsgJycsXHJcbiAgICAgICAgICAgIGNnLmggKyAnJyxcclxuICAgICAgICAgICAgdGhpcy5vcGFjaXR5ICE9IHVuZGVmaW5lZCA/IHsgcHJlbXVsdGlwbGllZEFscGhhOiBmYWxzZSB9IDogdW5kZWZpbmVkXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmICghY3ZXR0wpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gd2ViR0wnKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignICAgd2ViIEdMIGNhbnZhcyBjcmVhdGlvbicpXHJcblxyXG4gICAgICAgIC8vYWRkIHZlcnRpY2UgYW5kIGZyYWdtZW50IGRhdGFcclxuICAgICAgICBjb25zdCByMiA9IHIgLyAyXHJcbiAgICAgICAgY29uc3QgdmVydGljZXNCdWZmZXIgPSBbXVxyXG4gICAgICAgIGNvbnN0IHRCdWZmZXIgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMudEZ1bihjW3RoaXMuY29sb3JDb2xdLCByLCBzdGF0Q29sb3IpXHJcbiAgICAgICAgICAgIGlmICh0ID09IG51bGwgfHwgdCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIHZlcnRpY2VzQnVmZmVyLnB1c2goYy54ICsgcjIsIGMueSArIHIyKVxyXG4gICAgICAgICAgICB0QnVmZmVyLnB1c2godCA+IDEgPyAxIDogdCA8IDAgPyAwIDogdClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyAgIHdlYmdsIGRyYXdpbmcgZGF0YSBwcmVwYXJhdGlvbicpXHJcblxyXG4gICAgICAgIC8vY29tcHV0ZSBwaXhlbCBzaXplXHJcbiAgICAgICAgY29uc3Qgc2l6ZUdlbyA9IHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZShyLCB6ZikgOiByICsgMC4yICogemZcclxuXHJcbiAgICAgICAgLy9jb21wdXRlIG9wYWNpdHlcclxuICAgICAgICBjb25zdCBvcCA9IHRoaXMub3BhY2l0eSA/IHRoaXMub3BhY2l0eShyLCB6ZikgOiB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICBjb25zdCB3Z3AgPSBuZXcgV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkKGN2V0dMLmdsLCB0aGlzLmNvbG9ycywgdGhpcy5zdHJldGNoaW5nLCBzaXplR2VvIC8gemYsIG9wKVxyXG5cclxuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcgICB3ZWJnbCBwcm9ncmFtIHByZXBhcmF0aW9uJylcclxuXHJcbiAgICAgICAgLy9kcmF3XHJcbiAgICAgICAgd2dwLmRyYXcodmVydGljZXNCdWZmZXIsIHRCdWZmZXIsIGNnLmdldFdlYkdMVHJhbnNmb3JtKCkpXHJcblxyXG4gICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyAgIHdlYmdsIGRyYXdpbmcnKVxyXG5cclxuICAgICAgICAvL2RyYXcgaW4gY2FudmFzIGdlb1xyXG4gICAgICAgIGNnLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxyXG4gICAgICAgIGNnLmN0eC5kcmF3SW1hZ2UoY3ZXR0wuY2FudmFzLCAwLCAwKVxyXG5cclxuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcgICBjYW52YXMgZHJhd2luZycpXHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcclxuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcjogciwgemY6IHpmLCBzQ29sb3I6IHN0YXRDb2xvciB9KVxyXG5cclxuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcqKiogU3F1YXJlQ29sb3JXR0xTdHlsZSBlbmQgZHJhdycpXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL1N0eWxlLmpzJ1xyXG5cclxuLyoqXHJcbiAqXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTdHJva2VTdHlsZSBleHRlbmRzIFN0eWxlIHtcclxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciBjb2xvci5cclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuc3Ryb2tlQ29sb3JDb2wgPSBvcHRzLnN0cm9rZUNvbG9yQ29sXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIHN0cm9rZS5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCk6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSBvcHRzLnN0cm9rZUNvbG9yIHx8ICgoKSA9PiAnIzY2NicpXHJcblxyXG4gICAgICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uL2F0dHJpYnV0ZSBvZiB0aGUgdGFidWxhciBkYXRhIHdoZXJlIHRvIHJldHJpZXZlIHRoZSB2YXJpYWJsZSBmb3Igc2l6ZS5cclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuc2l6ZUNvbCA9IG9wdHMuc2l6ZUNvbFxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgYSBjZWxsIGluIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZVxyXG5cclxuICAgICAgICAvKiogVGhlIHN0cm9rZSBsaW5lIHdpZHRoLCBpbiBwaXhlbHMuXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnN0cm9rZVdpZHRoQ29sID0gb3B0cy5zdHJva2VXaWR0aENvbFxyXG5cclxuICAgICAgICAvKiogVGhlIHN0cm9rZSBsaW5lIHdpZHRoIGluIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuc3Ryb2tlV2lkdGggPSBvcHRzLnN0cm9rZVdpZHRoIC8vICh2LHIscyx6KT0+Li4uXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2hhcGUgb2YgYSBjZWxsLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGwpOmltcG9ydChcIi4uL1N0eWxlXCIpLlNoYXBlfSAqL1xyXG4gICAgICAgIHRoaXMuc2hhcGUgPSBvcHRzLnNoYXBlIHx8ICgoKSA9PiAnc3F1YXJlJylcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgY2VsbHMgYXMgc3F1YXJlcywgd2l0aCB2YXJpb3VzIGNvbG9ycyBhbmQgc2l6ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2dcclxuICAgICAqL1xyXG4gICAgZHJhdyhjZWxscywgciwgY2cpIHtcclxuICAgICAgICAvL2ZpbHRlclxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXHJcblxyXG4gICAgICAgIC8vem9vbSBmYWN0b3JcclxuICAgICAgICBjb25zdCB6ZiA9IGNnLmdldFpmKClcclxuXHJcbiAgICAgICAgbGV0IHN0YXRDb2xvclxyXG4gICAgICAgIGlmICh0aGlzLnN0cm9rZUNvbG9yQ29sKSBzdGF0Q29sb3IgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLnN0cm9rZUNvbG9yQ29sXSwgdHJ1ZSlcclxuXHJcbiAgICAgICAgbGV0IHN0YXRTaXplXHJcbiAgICAgICAgaWYgKHRoaXMuc2l6ZUNvbCkgc3RhdFNpemUgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLnNpemVDb2xdLCB0cnVlKVxyXG5cclxuICAgICAgICBsZXQgc3RhdFdpZHRoXHJcbiAgICAgICAgaWYgKHRoaXMuc3Ryb2tlV2lkdGhDb2wpIHN0YXRXaWR0aCA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMuc3Ryb2tlV2lkdGhDb2xdLCB0cnVlKVxyXG5cclxuICAgICAgICAvL2RyYXcgd2l0aCBIVE1MIGNhbnZhc1xyXG4gICAgICAgIC8vaW4gZ2VvIGNvb3JkaW5hdGVzXHJcbiAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcclxuXHJcbiAgICAgICAgY29uc3QgcjIgPSByICogMC41XHJcbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xyXG4gICAgICAgICAgICAvL2NvbG9yXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuc3Ryb2tlQ29sb3JcclxuICAgICAgICAgICAgICAgID8gdGhpcy5zdHJva2VDb2xvcihjZWxsW3RoaXMuc3Ryb2tlQ29sb3JDb2xdLCByLCBzdGF0Q29sb3IpXHJcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcclxuICAgICAgICAgICAgY2cuY3R4LnN0cm9rZVN0eWxlID0gY29sXHJcblxyXG4gICAgICAgICAgICAvL3NpemVcclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgICAgICBsZXQgc18gPSB0aGlzLnNpemUgfHwgKCgpID0+IHIpXHJcbiAgICAgICAgICAgIC8vc2l6ZSAtIGluIGdlbyB1bml0XHJcbiAgICAgICAgICAgIGNvbnN0IHNHID0gc18oY2VsbFt0aGlzLnNpemVDb2xdLCByLCBzdGF0U2l6ZSwgemYpXHJcblxyXG4gICAgICAgICAgICAvL3dpZHRoXHJcbiAgICAgICAgICAgIGNvbnN0IHdpID0gdGhpcy5zdHJva2VXaWR0aFxyXG4gICAgICAgICAgICAgICAgPyB0aGlzLnN0cm9rZVdpZHRoKGNlbGxbdGhpcy5zdHJva2VXaWR0aENvbF0sIHIsIHN0YXRXaWR0aCwgemYpXHJcbiAgICAgICAgICAgICAgICA6IDEgKiB6ZlxyXG4gICAgICAgICAgICBpZiAoIXdpIHx8IHdpIDw9IDApIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGNnLmN0eC5saW5lV2lkdGggPSB3aVxyXG5cclxuICAgICAgICAgICAgLy9zaGFwZVxyXG4gICAgICAgICAgICBjb25zdCBzaGFwZSA9IHRoaXMuc2hhcGUgPyB0aGlzLnNoYXBlKGNlbGwpIDogJ3NxdWFyZSdcclxuICAgICAgICAgICAgaWYgKHNoYXBlID09PSAnbm9uZScpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcclxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgciwgemYpXHJcblxyXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdzcXVhcmUnKSB7XHJcbiAgICAgICAgICAgICAgICAvL2RyYXcgc3F1YXJlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkID0gciAqICgxIC0gc0cgLyByKSAqIDAuNVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgucmVjdChjZWxsLnggKyBkICsgb2Zmc2V0LmR4LCBjZWxsLnkgKyBkICsgb2Zmc2V0LmR5LCBzRywgc0cpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ2NpcmNsZScpIHtcclxuICAgICAgICAgICAgICAgIC8vZHJhdyBjaXJjbGVcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmFyYyhjZWxsLnggKyByMiArIG9mZnNldC5keCwgY2VsbC55ICsgcjIgKyBvZmZzZXQuZHksIHNHICogMC41LCAwLCAyICogTWF0aC5QSSwgZmFsc2UpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ2RpYW1vbmQnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzMiA9IHNHICogMC41XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY2VsbC54ICsgcjIgLSBzMiwgY2VsbC55ICsgcjIpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGNlbGwueCArIHIyLCBjZWxsLnkgKyByMiArIHMyKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjZWxsLnggKyByMiArIHMyLCBjZWxsLnkgKyByMilcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY2VsbC54ICsgcjIsIGNlbGwueSArIHIyIC0gczIpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGNlbGwueCArIHIyIC0gczIsIGNlbGwueSArIHIyKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdkb251dCcpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2hhcGU6JyArIHNoYXBlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgLy90aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcjogcmVzb2x1dGlvbiwgemY6IHpmLCBzU2l6ZTogc3RhdFNpemUsIHNDb2xvcjogc3RhdENvbG9yIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgU3F1YXJlQ29sb3JXR0xTdHlsZSB9IGZyb20gJy4vU3F1YXJlQ29sb3JXR0xTdHlsZS5qcydcclxuaW1wb3J0IHsgU2lkZVN0eWxlIH0gZnJvbSAnLi9TaWRlU3R5bGUuanMnXHJcblxyXG4vKipcclxuICpcclxuICogQHNlZSBodHRwczovL21hbmlmb2xkLm5ldC9kb2MvbWZkOS9leGFtcGxlX190YW5ha2FfY29udG91cnMuaHRtXHJcbiAqXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBUYW5ha2FTdHlsZSB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXkuPGltcG9ydChcIi4uL1N0eWxlXCIpLlN0eWxlPn1cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGdldChjb2wsIG9wdHMpIHtcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvL2dldCBjb2xvcnMgZnJvbSBkMyByYW1wcywgaWYgJ25iJyBpcyBzcGVjaWZpZWRcclxuICAgICAgICBpZiAob3B0cy5uYiAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKG9wdHMubmIgPCAyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjb2xvcnMgaW4gdGFuYWthICg8Mik6ICcgKyBvcHRzLm5iKVxyXG4gICAgICAgICAgICAgICAgb3B0cy5uYiA9IDJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIW9wdHMuY29sb3IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2NvbG9yIGZ1bmN0aW9uIG5vdCBkZWZpbmVkIGluIHRhbmFrYScpXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yID0gKCkgPT4gJ2dyYXknXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3B0cy5jb2xvcnMgPSBbXVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdHMubmI7IGkrKykgb3B0cy5jb2xvcnMucHVzaChvcHRzLmNvbG9yKGkgLyAob3B0cy5uYiAtIDEpKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjb2xvcnMuXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxzdHJpbmc+fSAqL1xyXG4gICAgICAgIG9wdHMuY29sb3JzID0gb3B0cy5jb2xvcnMgfHwgWycjYTliYjllJywgJyNjOWRjYWEnLCAnI2ZkZTg5ZicsICcjZjlhNTc5JywgJyNlYjQ0NGInXVxyXG4gICAgICAgIGNvbnN0IG5iID0gb3B0cy5jb2xvcnMubGVuZ3RoXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHRvIGNvbXB1dGUgJ3QnIGZyb20gdGhlIHZhbHVlIHZcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgb3B0cy50RnVuID0gb3B0cy50RnVuIHx8ICgodiwgciwgcykgPT4gKHYgLSBzLm1pbikgLyAocy5tYXggLSBzLm1pbikpXHJcblxyXG4gICAgICAgIC8vc2hhZG93IGNvbG9yc1xyXG4gICAgICAgIG9wdHMuY29sRGFyayA9IG9wdHMuY29sRGFyayB8fCAnIzExMSdcclxuICAgICAgICBvcHRzLmNvbEJyaWdodCA9IG9wdHMuY29sQnJpZ2h0IHx8ICcjZGRkJ1xyXG5cclxuICAgICAgICAvL3dpZHRoIG9mIHRoZSBzZWdtZW50IChzaGFyZSBvZiB0aGUgcmVzb2x1dGlvbilcclxuICAgICAgICBvcHRzLndpZHRoRmFjdG9yID0gb3B0cy53aWR0aEZhY3RvciB8fCAwLjA4XHJcblxyXG4gICAgICAgIC8vc2hhZGluZ1xyXG4gICAgICAgIG9wdHMubmV3U2hhZGluZyA9IG9wdHMubmV3U2hhZGluZ1xyXG4gICAgICAgIG9wdHMubmV3U2hhZGluZ1dpZHRoUGl4ID0gb3B0cy5uZXdTaGFkaW5nV2lkdGhQaXggfHwgMlxyXG4gICAgICAgIC8vdHJhbnNwYXJlbmN5IHZhbHVlLCB3aXRoaW4gWzAsMV1cclxuICAgICAgICBvcHRzLm5ld1NoYWRpbmdUciA9XHJcbiAgICAgICAgICAgIG9wdHMubmV3U2hhZGluZ1RyIHx8XHJcbiAgICAgICAgICAgICgoc2lkZVZhbHVlLCBzaWRlU3RhdCkgPT5cclxuICAgICAgICAgICAgICAgIE1hdGguYWJzKHNpZGVWYWx1ZSkgLyBNYXRoLm1heChNYXRoLmFicyhzaWRlU3RhdC5taW4pLCBNYXRoLmFicyhzaWRlU3RhdC5tYXgpKSlcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHQgQSBjZWxsIHQgdmFsdWUsIHdpdGhpbiBbMCwxXS5cclxuICAgICAgICAgKiBAcmV0dXJucyB0aGUgY2xhc3MgbnVtYmVyIGZvciB0aGUgdmFsdWVcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBnZXRDbGFzcyA9ICh0KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChpc05hTih0KSB8fCB0ID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5leHBlY3RlZCB0IHZhbHVlIDE6ICcgKyB0KVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIC05XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSBpZiAodCA8PSAoaSArIDEpIC8gbmIpIHJldHVybiBpXHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuZXhwZWN0ZWQgdCB2YWx1ZSAyOiAnICsgdClcclxuICAgICAgICAgICAgcmV0dXJuIC05XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb2xTdHlsZSA9IG5ldyBTcXVhcmVDb2xvcldHTFN0eWxlKHtcclxuICAgICAgICAgICAgY29sb3JDb2w6IGNvbCxcclxuICAgICAgICAgICAgY29sb3JzOiBvcHRzLmNvbG9ycyxcclxuICAgICAgICAgICAgdEZ1bjogKHYsIHIsIHMpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBvcHRzLnRGdW4odiwgciwgcylcclxuICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBnZXRDbGFzcyh0KVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGMgLyAobmIgLSAxKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAvL3N0cmV0Y2hpbmc6IHsgZnVuOiBcImV4cFJldlwiLCBhbHBoYTogLTcgfSxcclxuICAgICAgICAgICAgc2l6ZTogKHIsIHpmKSA9PiByICsgMC41ICogemYsIC8vdGhhdCBpcyB0byBlbnN1cmUgbm8gZ2FwIGJldHdlZW4gc2FtZSBjbGFzcyBjZWxscyBpcyB2aXNpYmxlXHJcbiAgICAgICAgICAgIGZpbHRlcjogb3B0cy5maWx0ZXIsXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICBpZiBubyB3ZWIgZ2w6ICAgIFxyXG4gICAgICAgICAgICBjb25zdCBjb2xTdHlsZSA9IG5ldyBTaGFwZUNvbG9yU2l6ZVN0eWxlKHtcclxuICAgICAgICAgICAgICAgIGNvbG9yQ29sOiBjb2wsXHJcbiAgICAgICAgICAgICAgICAvL3RoZSBjb2xvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBjbGFzc1xyXG4gICAgICAgICAgICAgICAgY29sb3I6ICh2LCByLCBzLCB6ZikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2ID09IDAgJiYgb3B0cy50RnVuICYmIGlzTmFOKG9wdHMudEZ1bih2LCByLCBzKSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0cy5jb2xvcnNbZ2V0Q2xhc3Mob3B0cy50RnVuID8gb3B0cy50RnVuKHYsIHIsIHMpIDogdildXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgc2hhcGU6ICgpID0+IFwic3F1YXJlXCIsXHJcbiAgICAgICAgICAgICAgICBzaXplOiAodiwgciwgcywgemYpID0+IHIgKyAwLjUgKiB6ZiwgLy90aGF0IGlzIHRvIGVuc3VyZSBubyBnYXAgYmV0d2VlbiBzYW1lIGNsYXNzIGNlbGxzIGlzIHZpc2libGVcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAqL1xyXG5cclxuICAgICAgICAvKiogVGhlIHNpZGUgc3R5bGUsIGZvciB0aGUgc2hhZG93IGVmZmVjdCAqL1xyXG4gICAgICAgIGNvbnN0IHNpZGVTdHlsZSA9IG5ldyBTaWRlU3R5bGUoe1xyXG4gICAgICAgICAgICB2YWx1ZUNvbDogY29sLFxyXG4gICAgICAgICAgICB2YWx1ZTogKHYxLCB2MiwgciwgcywgemYpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vY29tcHV0ZSB0aGUgbnVtYmVyIG9mIGNsYXNzZXMgb2YgZGlmZmVyZW5jZVxyXG4gICAgICAgICAgICAgICAgaWYgKHYxID09PSB1bmRlZmluZWQgJiYgdjIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDBcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gb3B0cy50RnVuKHYxLCByLCBzKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ID09IHVuZGVmaW5lZCB8fCBpc05hTih0KSkgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHZhbHVlOiAnICsgdjEgKyAnIC0gJyArIHQpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGdldENsYXNzKHQpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMgKyAxXHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHYxID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gb3B0cy50RnVuKHYyLCByLCBzKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ID09IHVuZGVmaW5lZCB8fCBpc05hTih0KSkgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHZhbHVlOiAnICsgdjIgKyAnIC0gJyArIHQpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGdldENsYXNzKHQpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1jIC0gMVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgdDEgPSBvcHRzLnRGdW4odjEsIHIsIHMpXHJcbiAgICAgICAgICAgICAgICBpZiAodDEgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKHQxKSkgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHZhbHVlOiAnICsgdjEgKyAnIC0gJyArIHQxKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgdDIgPSBvcHRzLnRGdW4odjIsIHIsIHMpXHJcbiAgICAgICAgICAgICAgICBpZiAodDIgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKHQyKSkgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHZhbHVlOiAnICsgdjIgKyAnIC0gJyArIHQyKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgYzEgPSBnZXRDbGFzcyh0MSlcclxuICAgICAgICAgICAgICAgIGNvbnN0IGMyID0gZ2V0Q2xhc3ModDIpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gLWMyICsgYzFcclxuICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgIGNvbG9yOiBvcHRzLm5ld1NoYWRpbmdcclxuICAgICAgICAgICAgICAgID8gLy9ibGFjayB3aXRoIHRyYW5zcGFyZW5jeSBkZXBlbmRpbmcgb24gZGlmZmVyZW5jZVxyXG4gICAgICAgICAgICAgICAgICAoc2lkZSwgciwgcywgeikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHIgPSBvcHRzLm5ld1NoYWRpbmdUcihzaWRlLnZhbHVlLCBzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChzaWRlLnZhbHVlID4gMCAmJiBzaWRlLm9yID09PSAnaCcpIHx8IChzaWRlLnZhbHVlIDwgMCAmJiBzaWRlLm9yID09PSAndicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmdiYSgyNTUsMjU1LDEwMCwnICsgdHIgKyAnKSdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdyZ2JhKDAsMCwwLCcgKyB0ciArICcpJ1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA6IC8vd2hpdGUgb3IgYmxhY2ssIGRlcGVuZGluZyBvbiBvcmllbnRhdGlvbiBhbmQgdmFsdWVcclxuICAgICAgICAgICAgICAgICAgKHNpZGUsIHIsIHMsIHopID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWRlLnZhbHVlID09PSAwKSByZXR1cm5cclxuICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIFwiZ3JheVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lkZS5vciA9PT0gJ3YnKSByZXR1cm4gc2lkZS52YWx1ZSA8IDAgPyBvcHRzLmNvbEJyaWdodCA6IG9wdHMuY29sRGFya1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpZGUudmFsdWUgPCAwID8gb3B0cy5jb2xEYXJrIDogb3B0cy5jb2xCcmlnaHRcclxuICAgICAgICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgIHdpZHRoOiBvcHRzLm5ld1NoYWRpbmdcclxuICAgICAgICAgICAgICAgID8gLy9maWxsIHNpemVcclxuICAgICAgICAgICAgICAgICAgKHNpZGUsIHIsIHMsIHopID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRzLm5ld1NoYWRpbmdXaWR0aFBpeCAqIHpcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgOiAvL3dpZHRoIGRlcGVuZHMgb24gdGhlIHZhbHVlLCB0aGF0IGlzIHRoZSBudW1iZXIgb2YgY2xhc3NlcyBvZiBkaWZmZXJlbmNlXHJcbiAgICAgICAgICAgICAgICAgIChzaWRlLCByLCBzLCB6KSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgb3B0cy53aWR0aEZhY3RvciAqIHIgKiBNYXRoLmFicyhzaWRlLnZhbHVlKSAqIChzaWRlLm9yID09PSAndicgPyAwLjUgOiAxKSxcclxuXHJcbiAgICAgICAgICAgIGZpbHRlcjogb3B0cy5maWx0ZXIsXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgcmV0dXJuIFtjb2xTdHlsZSwgc2lkZVN0eWxlXVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcclxuXHJcbi8qKlxyXG4gKlxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVGV4dFN0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGNvbHVtbi9hdHRyaWJ1dGUgb2YgdGhlIHRhYnVsYXIgZGF0YSB3aGVyZSB0byByZXRyaWV2ZSB0aGUgdmFyaWFibGUgZm9yIHRleHQuXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnRleHRDb2wgPSBvcHRzLnRleHRDb2xcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0ZXh0IG9mIGEgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCk6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMudGV4dCA9IG9wdHMudGV4dCB8fCAoKHYsIHIsIHMsIHopID0+ICdYJylcclxuXHJcbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciBjb2xvci5cclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3JDb2wgPSBvcHRzLmNvbG9yQ29sXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNlbGwuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJyNFQTZCQUMnKVxyXG5cclxuICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGNvbHVtbi9hdHRyaWJ1dGUgb2YgdGhlIHRhYnVsYXIgZGF0YSB3aGVyZSB0byByZXRyaWV2ZSB0aGUgdmFyaWFibGUgZm9yIGZvbnQgc2l6ZS5cclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuZm9udFNpemVDb2wgPSBvcHRzLmZvbnRTaXplQ29sXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgZm9udCBzaXplIG9mIGEgY2VsbCBpbiBnZW8gdW5pdC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmZvbnRTaXplID0gb3B0cy5mb250U2l6ZSB8fCAoKHYsIHIsIHMsIHopID0+IHIgKiAwLjgpXHJcblxyXG4gICAgICAgIC8qKiBUaGUgdGV4dCBmb250IGZhbWlseS5cclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuZm9udEZhbWlseSA9IG9wdHMuZm9udEZhbWlseSB8fCAnQXJpYWwnXHJcblxyXG4gICAgICAgIC8qKiBUaGUgdGV4dCBmb250IHdlaWdodC5cclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuZm9udFdlaWdodCA9IG9wdHMuZm9udFdlaWdodCB8fCAnYm9sZCdcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgY2VsbHMgYXMgdGV4dC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2dcclxuICAgICAqL1xyXG4gICAgZHJhdyhjZWxscywgciwgY2cpIHtcclxuICAgICAgICAvL2ZpbHRlclxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXHJcblxyXG4gICAgICAgIC8vem9vbSBmYWN0b3JcclxuICAgICAgICBjb25zdCB6ZiA9IGNnLmdldFpmKClcclxuXHJcbiAgICAgICAgbGV0IHN0YXRUZXh0XHJcbiAgICAgICAgaWYgKHRoaXMudGV4dENvbCkge1xyXG4gICAgICAgICAgICAvL2NvbXB1dGUgdGV4dCB2YXJpYWJsZSBzdGF0aXN0aWNzXHJcbiAgICAgICAgICAgIHN0YXRUZXh0ID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy50ZXh0Q29sXSwgdHJ1ZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzdGF0Q29sb3JcclxuICAgICAgICBpZiAodGhpcy5jb2xvckNvbCkge1xyXG4gICAgICAgICAgICAvL2NvbXB1dGUgY29sb3IgdmFyaWFibGUgc3RhdGlzdGljc1xyXG4gICAgICAgICAgICBzdGF0Q29sb3IgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLmNvbG9yQ29sXSwgdHJ1ZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzdGF0Rm9udFNpemVcclxuICAgICAgICBpZiAodGhpcy5mb250U2l6ZUNvbCkge1xyXG4gICAgICAgICAgICAvL2lmIHNpemUgaXMgdXNlZCwgc29ydCBjZWxscyBieSBzaXplIHNvIHRoYXQgdGhlIGJpZ2dlc3QgYXJlIGRyYXduIGZpcnN0XHJcbiAgICAgICAgICAgIGNlbGxzLnNvcnQoKGMxLCBjMikgPT4gYzJbdGhpcy5mb250U2l6ZUNvbF0gLSBjMVt0aGlzLmZvbnRTaXplQ29sXSlcclxuICAgICAgICAgICAgLy9hbmQgY29tcHV0ZSBzaXplIHZhcmlhYmxlIHN0YXRpc3RpY3NcclxuICAgICAgICAgICAgc3RhdEZvbnRTaXplID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5mb250U2l6ZUNvbF0sIHRydWUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2RyYXcgd2l0aCBIVE1MIGNhbnZhc1xyXG4gICAgICAgIC8vaW4gc2NyZWVuIGNvb3JkaW5hdGVzXHJcbiAgICAgICAgY2cuaW5pdENhbnZhc1RyYW5zZm9ybSgpXHJcblxyXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgLy9nZXQgY2VsbCB0ZXh0XHJcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnRleHQgPyB0aGlzLnRleHQoY2VsbFt0aGlzLnRleHRDb2xdLCByLCBzdGF0VGV4dCkgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgaWYgKHRleHQgPT0gdW5kZWZpbmVkIHx8IHRleHQgPT0gbnVsbCB8fCB0ZXh0ICsgJycgPT09ICcnKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy9jb2xvclxyXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsW3RoaXMuY29sb3JDb2xdLCByLCBzdGF0Q29sb3IpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghY29sKSBjb250aW51ZVxyXG4gICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gY29sXHJcblxyXG4gICAgICAgICAgICAvL2ZvbnQgc2l6ZVxyXG4gICAgICAgICAgICAvL3NpemUgLSBpbiBwaXhlbCB1bml0XHJcbiAgICAgICAgICAgIGNvbnN0IGZvbnRTaXplUGl4ID0gdGhpcy5mb250U2l6ZShjZWxsW3RoaXMuZm9udFNpemVDb2xdLCByLCBzdGF0Rm9udFNpemUsIHpmKSAvIHpmXHJcblxyXG4gICAgICAgICAgICAvL3NldCBmb250XHJcbiAgICAgICAgICAgIGNvbnN0IGZvbnRGYW1pbHkgPSB0aGlzLmZvbnRGYW1pbHkgfHwgJ0FyaWFsJ1xyXG4gICAgICAgICAgICBjb25zdCBmb250V2VpZ2h0ID0gdGhpcy5mb250V2VpZ2h0IHx8ICdib2xkJ1xyXG4gICAgICAgICAgICBjZy5jdHguZm9udCA9IGZvbnRXZWlnaHQgKyAnICcgKyBmb250U2l6ZVBpeCArICdweCAnICsgZm9udEZhbWlseVxyXG5cclxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XHJcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGNlbGwsIHIsIHpmKVxyXG5cclxuICAgICAgICAgICAgLy90ZXh0IHBvc2l0aW9uXHJcbiAgICAgICAgICAgIGNnLmN0eC50ZXh0QWxpZ24gPSAnY2VudGVyJ1xyXG4gICAgICAgICAgICBjb25zdCB0eCA9IGNnLmdlb1RvUGl4WChjZWxsLnggKyByICogMC41ICsgb2Zmc2V0LmR4KVxyXG4gICAgICAgICAgICBjb25zdCB0eSA9IGNnLmdlb1RvUGl4WShjZWxsLnkgKyByICogMC41ICsgb2Zmc2V0LmR5KSArIGZvbnRTaXplUGl4ICogMC4zIC8vaXQgc2hvdWxkIGJlIDAuNSBidXQgMC4zIHNlZW1zIHRvIHdvcmsgYmV0dGVyXHJcblxyXG4gICAgICAgICAgICAvL2RyYXcgdGhlIHRleHRcclxuICAgICAgICAgICAgY2cuY3R4LmZpbGxUZXh0KHRleHQsIHR4LCB0eSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcclxuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcjogciwgemY6IHpmLCBzQ29sb3I6IHN0YXRDb2xvciB9KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnVpbGQgYSBmdW5jdGlvbiBbMCwxXS0+c3RyaW5nIGZvciBjaGFyYWN0ZXJzIGxlZ2VuZFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGNoYXJzXHJcbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBnZXRDaGFyTGVnZW5kRnVuKGNoYXJzKSB7XHJcbiAgICAgICAgY29uc3QgbmIgPSBjaGFycy5sZW5ndGhcclxuICAgICAgICByZXR1cm4gKHQpID0+ICh0ID09IDAgPyAnJyA6IHQgPT0gMSA/IGNoYXJzW25iIC0gMV0gOiBjaGFyc1tNYXRoLmZsb29yKHQgKiBuYildKVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgY2xhc3MgaWQgZnJvbSBhIHZhbHVlIGFuZCBjbGFzcyBicmVhayB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHYgdGhlIHZhbHVlXHJcbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IGJyZWFrcyB0aGUgYnJlYWtzXHJcbiAqIEByZXR1cm5zIFRoZSBjbGFzcyBpZCwgZnJvbSAwIHRvIGJyZWFrcy5sZW5ndGhcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGFzcyh2LCBicmVha3MpIHtcclxuICAgIGlmICghYnJlYWtzKSByZXR1cm5cclxuICAgIGlmIChicmVha3MubGVuZ3RoID09IDApIHJldHVybiAwXHJcbiAgICBpZiAodiA8PSBicmVha3NbMF0pIHJldHVybiAwXHJcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGJyZWFrcy5sZW5ndGg7IGkrKykgaWYgKGJyZWFrc1tpIC0gMV0gPCB2ICYmIHYgPD0gYnJlYWtzW2ldKSByZXR1cm4gaVxyXG4gICAgcmV0dXJuIGJyZWFrcy5sZW5ndGhcclxufVxyXG5cclxuZXhwb3J0IGxldCBtb25pdG9yID0gZmFsc2VcclxuXHJcbmxldCBwcmV2aW91c0RhdGVcclxuZXhwb3J0IGZ1bmN0aW9uIG1vbml0b3JEdXJhdGlvbihtZXNzYWdlKSB7XHJcbiAgICBjb25zdCBub3dEYXRlID0gRGF0ZS5ub3coKVxyXG5cclxuICAgIC8vZmlyc3QgY2FsbFxyXG4gICAgaWYgKCFwcmV2aW91c0RhdGUpIHtcclxuICAgICAgICBwcmV2aW91c0RhdGUgPSBub3dEYXRlXHJcbiAgICAgICAgY29uc29sZS5sb2cocHJldmlvdXNEYXRlLCBtZXNzYWdlKVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGQgPSBub3dEYXRlIC0gcHJldmlvdXNEYXRlXHJcbiAgICBwcmV2aW91c0RhdGUgPSBub3dEYXRlXHJcbiAgICBjb25zb2xlLmxvZyhkLCBtZXNzYWdlKVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgaW5pdFNoYWRlclByb2dyYW0sIGNyZWF0ZVNoYWRlciB9IGZyb20gJy4vd2ViR0xVdGlscy5qcydcclxuaW1wb3J0IHsgY29sb3IgfSBmcm9tICdkMy1jb2xvcidcclxuXHJcbi8qKlxyXG4gKiBFdmVyeXRoaW5nIHRvIGVhc2lseSBkcmF3IGNvbG9yZWQgc3F1YXJlcyB3aXRoIHdlYkdMLlxyXG4gKiBBbGwgdGhlIHNhbWUgc2l6ZSwgYnV0IGRpZmZlcmVudCBmaWxsIGNvbG9yLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFdlYkdMU3F1YXJlQ29sb3Jpbmcge1xyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGdsLCBzaXplUGl4KSB7XHJcbiAgICAgICAgdGhpcy5nbCA9IGdsXHJcbiAgICAgICAgdGhpcy5zaXplUGl4ID0gc2l6ZVBpeCB8fCAxMC4wXHJcblxyXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IGluaXRTaGFkZXJQcm9ncmFtKFxyXG4gICAgICAgICAgICBnbCxcclxuICAgICAgICAgICAgY3JlYXRlU2hhZGVyKFxyXG4gICAgICAgICAgICAgICAgZ2wsXHJcbiAgICAgICAgICAgICAgICBnbC5WRVJURVhfU0hBREVSLFxyXG4gICAgICAgICAgICAgICAgYFxyXG4gICAgICAgICAgICBhdHRyaWJ1dGUgdmVjMiBwb3M7XHJcbiAgICAgICAgICAgIHVuaWZvcm0gZmxvYXQgc2l6ZVBpeDtcclxuICAgICAgICAgICAgdW5pZm9ybSBtYXQzIG1hdDtcclxuICAgICAgICAgICAgYXR0cmlidXRlIHZlYzQgY29sb3I7XHJcbiAgICAgICAgICAgIHZhcnlpbmcgdmVjNCB2Q29sb3I7XHJcbiAgICAgICAgICAgIHZvaWQgbWFpbigpIHtcclxuICAgICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQobWF0ICogdmVjMyhwb3MsIDEuMCksIDEuMCk7XHJcbiAgICAgICAgICAgICAgZ2xfUG9pbnRTaXplID0gc2l6ZVBpeDtcclxuICAgICAgICAgICAgICB2Q29sb3IgPSBjb2xvcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgYFxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBjcmVhdGVTaGFkZXIoXHJcbiAgICAgICAgICAgICAgICBnbCxcclxuICAgICAgICAgICAgICAgIGdsLkZSQUdNRU5UX1NIQURFUixcclxuICAgICAgICAgICAgICAgIGBcclxuICAgICAgICAgICAgcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XHJcbiAgICAgICAgICAgIHZhcnlpbmcgdmVjNCB2Q29sb3I7XHJcbiAgICAgICAgICAgIHZvaWQgbWFpbih2b2lkKSB7XHJcbiAgICAgICAgICAgICAgICB2ZWM0IHZDb2xvcl8gPSB2Q29sb3IgLyAyNTUuMDtcclxuICAgICAgICAgICAgICAgIHZDb2xvcl9bM10gPSAyNTUuMCAqIHZDb2xvcl9bM107XHJcbiAgICAgICAgICAgICAgICBnbF9GcmFnQ29sb3IgPSB2Q29sb3JfO1xyXG4gICAgICAgICAgICB9YFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGdsLnVzZVByb2dyYW0odGhpcy5wcm9ncmFtKVxyXG5cclxuICAgICAgICAvL2J1ZmZlciBkYXRhXHJcbiAgICAgICAgdGhpcy52ZXJ0aWNlc0J1ZmZlciA9IFtdXHJcbiAgICAgICAgdGhpcy5jb2xvcnNCdWZmZXIgPSBbXVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBBZGQgZGF0YSB0byB2ZXJ0aWNlcy9zaXplL2NvbG9yIGJ1ZmZlcnMgZm9yIGNvbG9yIHNxdWFyZXMgZHJhd2luZyAqL1xyXG4gICAgYWRkUG9pbnREYXRhKHhDLCB5QywgY29sKSB7XHJcbiAgICAgICAgLy9jb252ZXJ0IGNvbG9yXHJcbiAgICAgICAgY29uc3QgY2MgPSBjb2xvcihjb2wpXHJcbiAgICAgICAgLy9jb25zdCBjYyA9IHtyOjQ1LGc6ODcsYjo5OCxvcGFjaXR5OjAuOX1cclxuICAgICAgICBpZiAoIWNjKSByZXR1cm5cclxuXHJcbiAgICAgICAgLy92ZXJ0aWNlc1xyXG4gICAgICAgIHRoaXMudmVydGljZXNCdWZmZXIucHVzaCh4QywgeUMpXHJcbiAgICAgICAgLy9jb2xvclxyXG4gICAgICAgIHRoaXMuY29sb3JzQnVmZmVyLnB1c2goY2MuciwgY2MuZywgY2MuYiwgY2Mub3BhY2l0eSlcclxuICAgIH1cclxuXHJcbiAgICBhZGRQb2ludERhdGEyKHhDLCB5QywgciwgZywgYiwgb3BhY2l0eSkge1xyXG4gICAgICAgIC8vdmVydGljZXNcclxuICAgICAgICB0aGlzLnZlcnRpY2VzQnVmZmVyLnB1c2goeEMsIHlDKVxyXG4gICAgICAgIC8vY29sb3JcclxuICAgICAgICB0aGlzLmNvbG9yc0J1ZmZlci5wdXNoKHIsIGcsIGIsIG9wYWNpdHkpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqICAqL1xyXG4gICAgZHJhdyh0cmFuc2ZvTWF0KSB7XHJcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsXHJcblxyXG4gICAgICAgIC8vdmVydGljZSBkYXRhXHJcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGdsLmNyZWF0ZUJ1ZmZlcigpKVxyXG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KHRoaXMudmVydGljZXNCdWZmZXIpLCBnbC5TVEFUSUNfRFJBVylcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ3BvcycpXHJcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcclxuICAgICAgICAgICAgcG9zaXRpb24sXHJcbiAgICAgICAgICAgIDIsIC8vbnVtQ29tcG9uZW50c1xyXG4gICAgICAgICAgICBnbC5GTE9BVCwgLy90eXBlXHJcbiAgICAgICAgICAgIGZhbHNlLCAvL25vcm1hbGlzZVxyXG4gICAgICAgICAgICAwLCAvL3N0cmlkZVxyXG4gICAgICAgICAgICAwIC8vb2Zmc2V0XHJcbiAgICAgICAgKVxyXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKVxyXG5cclxuICAgICAgICAvL2NvbG9yIGRhdGFcclxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXHJcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodGhpcy5jb2xvcnNCdWZmZXIpLCBnbC5TVEFUSUNfRFJBVylcclxuICAgICAgICB2YXIgY29sb3IgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLnByb2dyYW0sICdjb2xvcicpXHJcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihjb2xvciwgNCwgZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKVxyXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGNvbG9yKVxyXG5cclxuICAgICAgICAvL3NpemVQaXhcclxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ3NpemVQaXgnKSwgMS4wICogdGhpcy5zaXplUGl4KVxyXG5cclxuICAgICAgICAvL3RyYW5zZm9ybWF0aW9uXHJcbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDNmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCAnbWF0JyksIGZhbHNlLCBuZXcgRmxvYXQzMkFycmF5KHRyYW5zZm9NYXQpKVxyXG5cclxuICAgICAgICAvLyBFbmFibGUgdGhlIGRlcHRoIHRlc3RcclxuICAgICAgICAvL2dsLmVuYWJsZShnbC5ERVBUSF9URVNUKTtcclxuICAgICAgICAvLyBDbGVhciB0aGUgY29sb3IgYnVmZmVyIGJpdFxyXG4gICAgICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpXHJcbiAgICAgICAgLy8gU2V0IHRoZSB2aWV3IHBvcnRcclxuICAgICAgICAvL2dsLnZpZXdwb3J0KDAsIDAsIGNnLncsIGNnLmgpO1xyXG5cclxuICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlBPSU5UUywgMCwgdGhpcy52ZXJ0aWNlc0J1ZmZlci5sZW5ndGggLyAyKVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgaW5pdFNoYWRlclByb2dyYW0sIGNyZWF0ZVNoYWRlciB9IGZyb20gJy4vd2ViR0xVdGlscy5qcydcclxuaW1wb3J0IHsgY29sb3IgfSBmcm9tICdkMy1jb2xvcidcclxuXHJcbi8qKlxyXG4gKiBFdmVyeXRoaW5nIHRvIGVhc2lseSBkcmF3IGNvbG9yZWQgc3F1YXJlcyB3aXRoIHdlYkdMLlxyXG4gKiBBbGwgdGhlIHNhbWUgc2l6ZSwgYnV0IGRpZmZlcmVudCBmaWxsIGNvbG9yLlxyXG4gKiBUaGUgY29sb3IgaW50ZXJwb2xhdGlvbiBpcyBjb21wdXRlZCBpbiB0aGUgZnJhZ21lbnQgc2hhZGVyIHByb2dyYW0sIGJ5IHRoZSBHUFUsIHRodXMgaXQgaXMgbGVzcyBmbGV4aWJsZSBidXQgZmFzdGVyLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFdlYkdMU3F1YXJlQ29sb3JpbmdBZHZhbmNlZCB7XHJcbiAgICAvL3NlZTpcclxuICAgIC8vaHR0cHM6Ly93ZWJnbGZ1bmRhbWVudGFscy5vcmcvd2ViZ2wvbGVzc29ucy9mci93ZWJnbC1zaGFkZXJzLWFuZC1nbHNsLmh0bWwjbGVzLXVuaWZvcm1zLWRhbnMtbGVzLXNoYWRlcnMtZGUtdmVydGV4XHJcbiAgICAvL2h0dHBzOi8vdGhlYm9va29mc2hhZGVycy5jb20vZ2xvc3NhcnkvP3NlYXJjaD1taXhcclxuICAgIC8vaHR0cHM6Ly90aGVib29rb2ZzaGFkZXJzLmNvbS8wNi9cclxuICAgIC8vaHR0cHM6Ly90aGVib29rb2ZzaGFkZXJzLmNvbS9nbG9zc2FyeS9cclxuXHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyp9IGdsXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxTdHJpbmc+fSBjb2xvcnNcclxuICAgICAqIEBwYXJhbSB7e2Z1bjpzdHJpbmcsYWxwaGE6bnVtYmVyfX0gc3RyZXRjaGluZ1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemVQaXhcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfHVuZGVmaW5lZH0gZ2xvYmFsT3BhY2l0eVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihnbCwgY29sb3JzLCBzdHJldGNoaW5nLCBzaXplUGl4ID0gMTAsIGdsb2JhbE9wYWNpdHkgPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAvKiogQHR5cGUge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gKi9cclxuICAgICAgICB0aGlzLmdsID0gZ2xcclxuICAgICAgICAvL2dsLnBpeGVsU3RvcmVpKGdsLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgdHJ1ZSk7XHJcbiAgICAgICAgLy9nbC5ibGVuZEZ1bmMoZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcclxuICAgICAgICAvL2dsLmJsZW5kRnVuYyhnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEpO1xyXG5cclxuICAgICAgICAvKiogQHR5cGUge1dlYkdMU2hhZGVyfSAqL1xyXG4gICAgICAgIGNvbnN0IHZTaGFkZXIgPSBjcmVhdGVTaGFkZXIoXHJcbiAgICAgICAgICAgIGdsLFxyXG4gICAgICAgICAgICBnbC5WRVJURVhfU0hBREVSLFxyXG4gICAgICAgICAgICBgXHJcbiAgICAgICAgYXR0cmlidXRlIHZlYzIgcG9zO1xyXG4gICAgICAgIHVuaWZvcm0gZmxvYXQgc2l6ZVBpeDtcclxuICAgICAgICB1bmlmb3JtIG1hdDMgbWF0O1xyXG5cclxuICAgICAgICBhdHRyaWJ1dGUgZmxvYXQgdDtcclxuICAgICAgICB2YXJ5aW5nIGZsb2F0IHZ0O1xyXG5cclxuICAgICAgICB2b2lkIG1haW4oKSB7XHJcbiAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQobWF0ICogdmVjMyhwb3MsIDEuMCksIDEuMCk7XHJcbiAgICAgICAgICBnbF9Qb2ludFNpemUgPSBzaXplUGl4O1xyXG4gICAgICAgICAgdnQgPSB0O1xyXG4gICAgICAgIH1cclxuICAgICAgYFxyXG4gICAgICAgIClcclxuXHJcbiAgICAgICAgLy9wcmVwYXJlIGZyYWdtZW50IHNoYWRlciBjb2RlXHJcbiAgICAgICAgLy9kZWNsYXJlIHRoZSB1bmlmb3JtIGFuZCBvdGhlciB2YXJpYWJsZXNcclxuICAgICAgICBsZXQgZnNoU3RyaW5nID1cclxuICAgICAgICAgICAgJycgK1xyXG4gICAgICAgICAgICAncHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxuJyArXHJcbiAgICAgICAgICAgICd2YXJ5aW5nIGZsb2F0IHZ0O1xcbicgK1xyXG4gICAgICAgICAgICAndW5pZm9ybSBmbG9hdCBhbHBoYTtcXG4nICtcclxuICAgICAgICAgICAgKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG91dCA9IFtdXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbG9ycy5sZW5ndGg7IGkrKykgb3V0LnB1c2goJ3VuaWZvcm0gdmVjNCBjJyArIGkgKyAnO1xcbicpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0LmpvaW4oJycpXHJcbiAgICAgICAgICAgIH0pKCkgK1xyXG4gICAgICAgICAgICAvL3N0YXJ0IHRoZSBtYWluIGZ1bmN0aW9uLCBhcHBseSB0aGUgc3RyZXRjaGluZyBvZiB0XHJcbiAgICAgICAgICAgICd2b2lkIG1haW4odm9pZCkge1xcbidcclxuXHJcbiAgICAgICAgaWYgKHN0cmV0Y2hpbmcpIHtcclxuICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdwb3cnKVxyXG4gICAgICAgICAgICAgICAgLy9zUG93ID0gKHQsIGFscGhhID0gMykgPT4gTWF0aC5wb3codCwgYWxwaGEpO1xyXG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gcG93KHZ0LCBhbHBoYSk7XFxuJ1xyXG4gICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmZ1biA9PSAncG93UmV2JylcclxuICAgICAgICAgICAgICAgIC8vc1Bvd1JldiA9ICh0LCBhbHBoYSA9IDMpID0+IDEgLSBNYXRoLnBvdygxIC0gdCwgMSAvIGFscGhhKTtcclxuICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IDEuMC1wb3coMS4wLXZ0LCAxLjAvYWxwaGEpO1xcbidcclxuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ2V4cCcpXHJcbiAgICAgICAgICAgICAgICAvL3NFeHAgPSAodCwgYWxwaGEgPSAzKSA9PiBhbHBoYSA9PSAwID8gdCA6IChNYXRoLmV4cCh0ICogYWxwaGEpIC0gMSkgLyAoTWF0aC5leHAoYWxwaGEpIC0gMSk7XHJcbiAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz1cclxuICAgICAgICAgICAgICAgICAgICBzdHJldGNoaW5nLmFscGhhID09IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgZmxvYXQgdCA9IHZ0O2BcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiAnICAgZmxvYXQgdCA9IChleHAodnQgKiBhbHBoYSkgLSAxLjApIC8gKGV4cChhbHBoYSkgLSAxLjApO1xcbidcclxuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ2V4cFJldicpXHJcbiAgICAgICAgICAgICAgICAvL3NFeHBSZXYgPSAodCwgYWxwaGEgPSAzKSA9PiBhbHBoYSA9PSAwID8gdCA6IDEgLSAoMSAvIGFscGhhKSAqIE1hdGgubG9nKE1hdGguZXhwKGFscGhhKSAqICgxIC0gdCkgKyB0KTtcclxuICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPVxyXG4gICAgICAgICAgICAgICAgICAgIHN0cmV0Y2hpbmcuYWxwaGEgPT0gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBmbG9hdCB0ID0gdnQ7YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICcgICBmbG9hdCB0ID0gMS4wIC0gKDEuMCAvIGFscGhhKSAqIGxvZyhleHAoYWxwaGEpICogKDEuMCAtIHZ0KSArIHZ0KTtcXG4nXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdjaXJjbGVMb3cnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RyZXRjaGluZy5hbHBoYSA9PSAwKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vaWYgKGFscGhhID09IDApIHJldHVybiB0O1xyXG4gICAgICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IHZ0O1xcbidcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmV0Y2hpbmcuYWxwaGEgPT0gMSlcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoYWxwaGEgPT0gMSkgcmV0dXJuIE1hdGguc3FydCgyICogdCAtIHQgKiB0KTtcclxuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSBzcXJ0KHZ0ICogKDIuMCAtIHZ0KSk7XFxuJ1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBhID0gYWxwaGEgLyAoMSAtIGFscGhhKTtcclxuICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBNYXRoLnNxcnQoMSAvIChhICogYSkgKyB0ICogKDIgLyBhICsgMiAtIHQpKSAtIDEgLyBhO1xyXG4gICAgICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnICAgZmxvYXQgYSA9IGFscGhhIC8gKDEuMCAtIGFscGhhKTtcXG4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJyAgIGZsb2F0IHQgPSBzcXJ0KDEuMCAvIChhICogYSkgKyB2dCAqICggMi4wL2EgKyAyLjAgLSB2dCApKSAtIDEuMCAvIGE7XFxuJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdjaXJjbGVIaWdoJykge1xyXG4gICAgICAgICAgICAgICAgLy8gMSAtIHNDaXJjbGVMb3coMSAtIHQsIGFscGhhKVxyXG4gICAgICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuYWxwaGEgPT0gMClcclxuICAgICAgICAgICAgICAgICAgICAvL2lmIChhbHBoYSA9PSAwKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSB2dDtcXG4nXHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmFscGhhID09IDEpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGFscGhhID09IDEpIHJldHVybiBNYXRoLnNxcnQoMiAqIHQgLSB0ICogdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gMS4wIC0gc3FydCgoMS4wIC0gdnQpICogKDEuMCArIHZ0KSk7XFxuJ1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBhID0gYWxwaGEgLyAoMSAtIGFscGhhKTtcclxuICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBNYXRoLnNxcnQoMSAvIChhICogYSkgKyAoMiAqIHQpIC8gYSArIDIgKiB0IC0gdCAqIHQpIC0gMSAvIGE7XHJcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICcgICBmbG9hdCBhID0gYWxwaGEgLyAoMS4wIC0gYWxwaGEpO1xcbicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnICAgZmxvYXQgdCA9IDEuMCAtIHNxcnQoMS4wIC8gKGEgKiBhKSArICgxLjAtdnQpICogKCAyLjAvYSArIDEuMCArIHZ0ICkpICsgMS4wIC8gYTtcXG4nXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmV4cGVjdGVkIHN0cmV0Y2hpbmcgZnVuY3Rpb24gY29kZTogJyArIHN0cmV0Y2hpbmcuZnVuKVxyXG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gdnQ7XFxuJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gdnQ7XFxuJ1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9jaG9vc2UgaW5pdGlhbCBhbmQgZmluYWwgY29sb3JzLCBhbmQgYWRqdXN0IHQgdmFsdWVcclxuICAgICAgICBpZiAoY29sb3JzLmxlbmd0aCA9PSAxKSBmc2hTdHJpbmcgKz0gJyAgIHZlYzQgY0k9YzA7XFxuICAgdmVjNCBjRj1jMDtcXG4nXHJcbiAgICAgICAgZWxzZSBpZiAoY29sb3JzLmxlbmd0aCA9PSAyKSBmc2hTdHJpbmcgKz0gJyAgIHZlYzQgY0k9YzA7XFxuICAgdmVjNCBjRj1jMTtcXG4nXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5iID0gY29sb3JzLmxlbmd0aCAtIDFcclxuICAgICAgICAgICAgY29uc3QgbmJzID0gbmIgKyAnLjAnXHJcbiAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgdmVjNCBjSTtcXG4nXHJcbiAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgdmVjNCBjRjtcXG4nXHJcbiAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgaWYodDwxLjAvJyArIG5icyArICcpIHsgY0k9YzA7IGNGPWMxOyB0PXQqJyArIG5icyArICc7IH1cXG4nXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAyOyBpIDwgbmI7IGkrKylcclxuICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPVxyXG4gICAgICAgICAgICAgICAgICAgICcgICBlbHNlIGlmKHQ8JyArXHJcbiAgICAgICAgICAgICAgICAgICAgaSArXHJcbiAgICAgICAgICAgICAgICAgICAgJy4wLycgK1xyXG4gICAgICAgICAgICAgICAgICAgIG5icyArXHJcbiAgICAgICAgICAgICAgICAgICAgJykgeyBjST1jJyArXHJcbiAgICAgICAgICAgICAgICAgICAgKGkgLSAxKSArXHJcbiAgICAgICAgICAgICAgICAgICAgJzsgY0Y9YycgK1xyXG4gICAgICAgICAgICAgICAgICAgIGkgK1xyXG4gICAgICAgICAgICAgICAgICAgICc7IHQ9JyArXHJcbiAgICAgICAgICAgICAgICAgICAgbmJzICtcclxuICAgICAgICAgICAgICAgICAgICAnKnQtJyArXHJcbiAgICAgICAgICAgICAgICAgICAgKGkgLSAxKSArXHJcbiAgICAgICAgICAgICAgICAgICAgJy4wOyB9XFxuJ1xyXG4gICAgICAgICAgICBmc2hTdHJpbmcgKz1cclxuICAgICAgICAgICAgICAgICcgICBlbHNlIHsgY0k9YycgKyAobmIgLSAxKSArICc7IGNGPWMnICsgbmIgKyAnOyB0PScgKyBuYnMgKyAnKnQtJyArIChuYiAtIDEpICsgJy4wOyB9XFxuJ1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9vbmUgc2luZ2xlIGNvbG9yXHJcbiAgICAgICAgaWYgKGNvbG9ycy5sZW5ndGggPT0gMSkgZnNoU3RyaW5nICs9ICcgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGMwWzBdLCBjMFsxXSwgYzBbMl0sIGMwWzNdKTt9XFxuJ1xyXG4gICAgICAgIC8vc2V0IGludGVycG9sYXRlZCBjb2xvciwgYmV0d2VlbiBpbml0aWFsIGFuZCBmaW5hbCBvbmVcclxuICAgICAgICBlbHNlIGZzaFN0cmluZyArPSAnICAgZ2xfRnJhZ0NvbG9yID0gbWl4KGNJLCBjRiwgdCk7fVxcbidcclxuXHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhmc2hTdHJpbmcpXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7V2ViR0xTaGFkZXJ9ICovXHJcbiAgICAgICAgY29uc3QgZlNoYWRlciA9IGNyZWF0ZVNoYWRlcihnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmc2hTdHJpbmcpXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7V2ViR0xQcm9ncmFtfSAqL1xyXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IGluaXRTaGFkZXJQcm9ncmFtKGdsLCB2U2hhZGVyLCBmU2hhZGVyKVxyXG4gICAgICAgIGdsLnVzZVByb2dyYW0odGhpcy5wcm9ncmFtKVxyXG5cclxuICAgICAgICAvL3NldCB1bmlmb3Jtc1xyXG5cclxuICAgICAgICAvL3NpemVQaXhcclxuICAgICAgICAvL1RPRE86IGJ1ZyBoZXJlLiBTZWVtcyB0byBiZSBsaW1pdGVkIHRvIHNvbWUgdGhyZXNob2xkIHZhbHVlIChhcm91bmQgMjUwKS5cclxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ3NpemVQaXgnKSwgMS4wICogc2l6ZVBpeClcclxuXHJcbiAgICAgICAgLy9zdHJldGNoaW5nIGFscGhhIGZhY3RvclxyXG4gICAgICAgIGdsLnVuaWZvcm0xZihnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCAnYWxwaGEnKSwgc3RyZXRjaGluZyA/IDEuMCAqIHN0cmV0Y2hpbmcuYWxwaGEgOiAwLjApXHJcblxyXG4gICAgICAgIC8vY29sb3JzXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgYyA9IGNvbG9yKGNvbG9yc1tpXSlcclxuXHJcbiAgICAgICAgICAgIGxldCBvcGFjaXR5ID0gYy5vcGFjaXR5XHJcbiAgICAgICAgICAgIGlmIChjLm9wYWNpdHkgPT0gMSAmJiBnbG9iYWxPcGFjaXR5ICE9IHVuZGVmaW5lZCkgb3BhY2l0eSA9IGdsb2JhbE9wYWNpdHlcclxuXHJcbiAgICAgICAgICAgIGdsLnVuaWZvcm00ZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ2MnICsgaSksIFtcclxuICAgICAgICAgICAgICAgICtjLnIgLyAyNTUuMCxcclxuICAgICAgICAgICAgICAgICtjLmcgLyAyNTUuMCxcclxuICAgICAgICAgICAgICAgICtjLmIgLyAyNTUuMCxcclxuICAgICAgICAgICAgICAgICtvcGFjaXR5LFxyXG4gICAgICAgICAgICBdKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogICovXHJcbiAgICBkcmF3KHZlcnRpY2VzQnVmZmVyLCB0QnVmZmVyLCB0cmFuc2ZvTWF0KSB7XHJcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsXHJcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHRoaXMucHJvZ3JhbVxyXG5cclxuICAgICAgICAvL3ZlcnRpY2UgZGF0YVxyXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcclxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlc0J1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ3BvcycpXHJcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcclxuICAgICAgICAgICAgcG9zaXRpb24sXHJcbiAgICAgICAgICAgIDIsIC8vbnVtQ29tcG9uZW50c1xyXG4gICAgICAgICAgICBnbC5GTE9BVCwgLy90eXBlXHJcbiAgICAgICAgICAgIGZhbHNlLCAvL25vcm1hbGlzZVxyXG4gICAgICAgICAgICAwLCAvL3N0cmlkZVxyXG4gICAgICAgICAgICAwIC8vb2Zmc2V0XHJcbiAgICAgICAgKVxyXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKVxyXG5cclxuICAgICAgICAvL3QgZGF0YVxyXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcclxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheSh0QnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXHJcbiAgICAgICAgY29uc3QgdCA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICd0JylcclxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHQsIDEsIGdsLkZMT0FULCBmYWxzZSwgMCwgMClcclxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0KVxyXG5cclxuICAgICAgICAvL3RyYW5zZm9ybWF0aW9uXHJcbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDNmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgJ21hdCcpLCBmYWxzZSwgbmV3IEZsb2F0MzJBcnJheSh0cmFuc2ZvTWF0KSlcclxuXHJcbiAgICAgICAgLy8gRW5hYmxlIHRoZSBkZXB0aCB0ZXN0XHJcbiAgICAgICAgLy9nbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XHJcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGNvbG9yIGJ1ZmZlciBiaXRcclxuICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKVxyXG4gICAgICAgIC8vIFNldCB0aGUgdmlldyBwb3J0XHJcbiAgICAgICAgLy9nbC52aWV3cG9ydCgwLCAwLCBjZy53LCBjZy5oKTtcclxuXHJcbiAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5QT0lOVFMsIDAsIHZlcnRpY2VzQnVmZmVyLmxlbmd0aCAvIDIpXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBpbml0U2hhZGVyUHJvZ3JhbSwgY3JlYXRlU2hhZGVyIH0gZnJvbSAnLi93ZWJHTFV0aWxzLmpzJ1xyXG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ2QzLWNvbG9yJ1xyXG5cclxuLyoqXHJcbiAqIEV2ZXJ5dGhpbmcgdG8gZWFzaWx5IGRyYXcgY29sb3JlZCBzcXVhcmVzIHdpdGggd2ViR0wuXHJcbiAqIEFsbCB0aGUgc2FtZSBzaXplLCBidXQgZGlmZmVyZW50IGZpbGwgY29sb3IuXHJcbiAqIENvbG9yIGJhc2VkIG9uIGNhdGVnb3JpZXMuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkIHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48c3RyaW5nPn0gY29sb3JzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbG9ycykge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn0gKi9cclxuICAgICAgICB0aGlzLmNvbG9ycyA9IGNvbG9yc1xyXG5cclxuICAgICAgICAvKiogVmVjdG9yIHNoYWRlciBwcm9ncmFtXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnZzaFN0cmluZyA9IGBcclxuICAgICAgICBhdHRyaWJ1dGUgdmVjMiBwb3M7XHJcbiAgICAgICAgdW5pZm9ybSBmbG9hdCBzaXplUGl4O1xyXG4gICAgICAgIHVuaWZvcm0gbWF0MyBtYXQ7XHJcblxyXG4gICAgICAgIGF0dHJpYnV0ZSBmbG9hdCBpO1xyXG4gICAgICAgIHZhcnlpbmcgZmxvYXQgdmk7XHJcblxyXG4gICAgICAgIHZvaWQgbWFpbigpIHtcclxuICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChtYXQgKiB2ZWMzKHBvcywgMS4wKSwgMS4wKTtcclxuICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IHNpemVQaXg7XHJcbiAgICAgICAgICB2aSA9IGk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGBcclxuXHJcbiAgICAgICAgLy9wcmVwYXJlIGZyYWdtZW50IHNoYWRlciBjb2RlXHJcbiAgICAgICAgLy9kZWNsYXJlIHRoZSB1bmlmb3JtIGFuZCBvdGhlciB2YXJpYWJsZXNcclxuICAgICAgICBjb25zdCBvdXQgPSBbXVxyXG4gICAgICAgIG91dC5wdXNoKCdwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcXG52YXJ5aW5nIGZsb2F0IHZpO1xcbicpXHJcbiAgICAgICAgLy9hZGQgY29sb3IgdW5pZm9ybXNcclxuICAgICAgICBvdXQucHVzaCgndW5pZm9ybSB2ZWM0JylcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbG9ycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoaSA+IDApIG91dC5wdXNoKCcsJylcclxuICAgICAgICAgICAgb3V0LnB1c2goJyBjJyArIGkpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIG91dC5wdXNoKCc7XFxuJylcclxuICAgICAgICAvL3N0YXJ0IHRoZSBtYWluIGZ1bmN0aW9uXHJcbiAgICAgICAgb3V0LnB1c2goJ3ZvaWQgbWFpbih2b2lkKSB7XFxuJylcclxuICAgICAgICAvL2Nob29zZSBjb2xvciBpXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGkgPiAwKSBvdXQucHVzaCgnZWxzZSAnKVxyXG4gICAgICAgICAgICBvdXQucHVzaCgnaWYodmk9PScpXHJcbiAgICAgICAgICAgIG91dC5wdXNoKGkpXHJcbiAgICAgICAgICAgIG91dC5wdXNoKCcuMCkgZ2xfRnJhZ0NvbG9yID0gdmVjNChjJylcclxuICAgICAgICAgICAgb3V0LnB1c2goaSlcclxuICAgICAgICAgICAgb3V0LnB1c2goJ1swXSwgYycpXHJcbiAgICAgICAgICAgIG91dC5wdXNoKGkpXHJcbiAgICAgICAgICAgIG91dC5wdXNoKCdbMV0sIGMnKVxyXG4gICAgICAgICAgICBvdXQucHVzaChpKVxyXG4gICAgICAgICAgICBvdXQucHVzaCgnWzJdLCBjJylcclxuICAgICAgICAgICAgb3V0LnB1c2goaSlcclxuICAgICAgICAgICAgb3V0LnB1c2goJ1szXSk7XFxuJylcclxuICAgICAgICB9XHJcbiAgICAgICAgb3V0LnB1c2goJ2Vsc2UgZ2xfRnJhZ0NvbG9yID0gdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApO1xcbn0nKVxyXG4gICAgICAgIC8qKiBGcmFnbWVudCBzaGFkZXIgcHJvZ3JhbVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5mc2hTdHJpbmcgPSBvdXQuam9pbignJylcclxuICAgIH1cclxuXHJcbiAgICAvKiogICovXHJcbiAgICBkcmF3KGdsLCB2ZXJ0aWNlc0J1ZmZlciwgaUJ1ZmZlciwgdHJhbnNmb01hdCwgc2l6ZVBpeCA9IDEwKSB7XHJcbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcn0gKi9cclxuICAgICAgICBjb25zdCB2U2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBnbC5WRVJURVhfU0hBREVSLCB0aGlzLnZzaFN0cmluZylcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcn0gKi9cclxuICAgICAgICBjb25zdCBmU2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIHRoaXMuZnNoU3RyaW5nKVxyXG5cclxuICAgICAgICAvKiogQHR5cGUge1dlYkdMUHJvZ3JhbX0gKi9cclxuICAgICAgICBjb25zdCBwcm9ncmFtID0gaW5pdFNoYWRlclByb2dyYW0oZ2wsIHZTaGFkZXIsIGZTaGFkZXIpXHJcbiAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKVxyXG5cclxuICAgICAgICAvL3NldCB1bmlmb3Jtc1xyXG5cclxuICAgICAgICAvL3NpemVQaXhcclxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdzaXplUGl4JyksIDEuMCAqIHNpemVQaXgpXHJcblxyXG4gICAgICAgIC8vY29sb3JzXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbG9ycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjID0gY29sb3IodGhpcy5jb2xvcnNbaV0pXHJcbiAgICAgICAgICAgIGdsLnVuaWZvcm00ZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdjJyArIGkpLCBbXHJcbiAgICAgICAgICAgICAgICArYy5yIC8gMjU1LjAsXHJcbiAgICAgICAgICAgICAgICArYy5nIC8gMjU1LjAsXHJcbiAgICAgICAgICAgICAgICArYy5iIC8gMjU1LjAsXHJcbiAgICAgICAgICAgICAgICArYy5vcGFjaXR5LFxyXG4gICAgICAgICAgICBdKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy92ZXJ0aWNlIGRhdGFcclxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXHJcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXNCdWZmZXIpLCBnbC5TVEFUSUNfRFJBVylcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICdwb3MnKVxyXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXHJcbiAgICAgICAgICAgIHBvc2l0aW9uLFxyXG4gICAgICAgICAgICAyLCAvL251bUNvbXBvbmVudHNcclxuICAgICAgICAgICAgZ2wuRkxPQVQsIC8vdHlwZVxyXG4gICAgICAgICAgICBmYWxzZSwgLy9ub3JtYWxpc2VcclxuICAgICAgICAgICAgMCwgLy9zdHJpZGVcclxuICAgICAgICAgICAgMCAvL29mZnNldFxyXG4gICAgICAgIClcclxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShwb3NpdGlvbilcclxuXHJcbiAgICAgICAgLy9pIGRhdGFcclxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXHJcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkoaUJ1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxyXG4gICAgICAgIGNvbnN0IGkgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnaScpXHJcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihpLCAxLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApXHJcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoaSlcclxuXHJcbiAgICAgICAgLy90cmFuc2Zvcm1hdGlvblxyXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdtYXQnKSwgZmFsc2UsIG5ldyBGbG9hdDMyQXJyYXkodHJhbnNmb01hdCkpXHJcblxyXG4gICAgICAgIC8vIEVuYWJsZSB0aGUgZGVwdGggdGVzdFxyXG4gICAgICAgIC8vZ2wuZW5hYmxlKGdsLkRFUFRIX1RFU1QpO1xyXG4gICAgICAgIC8vIENsZWFyIHRoZSBjb2xvciBidWZmZXIgYml0XHJcbiAgICAgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVClcclxuICAgICAgICAvLyBTZXQgdGhlIHZpZXcgcG9ydFxyXG4gICAgICAgIC8vZ2wudmlld3BvcnQoMCwgMCwgY2cudywgY2cuaCk7XHJcblxyXG4gICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuUE9JTlRTLCAwLCB2ZXJ0aWNlc0J1ZmZlci5sZW5ndGggLyAyKVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuLyoqXHJcbiAqIFNvbWUgZnVuY3Rpb24gWzAsMV0tPlswLDFdIHRvIHN0cmV0Y2ggcmFuZ2Ugb2YgdmFsdWVzLlxyXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ldXJvc3RhdC9ncmlkdml6L2Jsb2IvbWFzdGVyL2RvY3MvcmVmZXJlbmNlLm1kI3N0cmV0Y2hpbmdcclxuICogQHNlZSBodHRwczovL29ic2VydmFibGVocS5jb20vQGpnYWZmdXJpL3N0cmV0Y2hpbmdcclxuICovXHJcblxyXG4vKipcclxuICogRnVuY3Rpb24gWzAsMV0tPlswLDFdIHRvIHN0cmV0Y2ggcmFuZ2Ugb2YgdmFsdWVzLlxyXG4gKiBQb2x5bm9taWFsXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0IFRoZSB2YWx1ZSB0byBzdHJldGNoLCB3aXRoaW4gWzAsMV1cclxuICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIDE6IG5vIHN0cmV0Y2hpbmcuIDwxOiBzaG93IGxvdyB2YWx1ZXMuID4xOiBzaG93IGhpZ2ggdmFsdWVzLlxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgc3RyZXRjaGVkIHZhbHVlLCB3aXRoaW4gWzAsMV1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzUG93ID0gKHQsIGFscGhhID0gMykgPT4gTWF0aC5wb3codCwgYWxwaGEpXHJcblxyXG4vKipcclxuICogRnVuY3Rpb24gWzAsMV0tPlswLDFdIHRvIHN0cmV0Y2ggcmFuZ2Ugb2YgdmFsdWVzLlxyXG4gKiBQb2x5bm9taWFsIChyZXZlcnNlKVxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdCBUaGUgdmFsdWUgdG8gc3RyZXRjaCwgd2l0aGluIFswLDFdXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAxOiBubyBzdHJldGNoaW5nLiA8MTogc2hvdyBsb3cgdmFsdWVzLiA+MTogc2hvdyBoaWdoIHZhbHVlcy5cclxuICogQHJldHVybnMge251bWJlcn0gVGhlIHN0cmV0Y2hlZCB2YWx1ZSwgd2l0aGluIFswLDFdXHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc1Bvd1JldiA9ICh0LCBhbHBoYSA9IDMpID0+IDEgLSBNYXRoLnBvdygxIC0gdCwgMSAvIGFscGhhKVxyXG5cclxuLyoqXHJcbiAqIEZ1bmN0aW9uIFswLDFdLT5bMCwxXSB0byBzdHJldGNoIHJhbmdlIG9mIHZhbHVlcy5cclxuICogRXhwb25lbnRpYWxcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHQgVGhlIHZhbHVlIHRvIHN0cmV0Y2gsIHdpdGhpbiBbMCwxXVxyXG4gKiBAcGFyYW0ge251bWJlcn0gYWxwaGEgMDogbm8gc3RyZXRjaGluZy4gLUluZjogc2hvdyBsb3cgdmFsdWVzLiBJbmY6IHNob3cgaGlnaCB2YWx1ZXMuXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBzdHJldGNoZWQgdmFsdWUsIHdpdGhpbiBbMCwxXVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNFeHAgPSAodCwgYWxwaGEgPSAzKSA9PiAoYWxwaGEgPT0gMCA/IHQgOiAoTWF0aC5leHAodCAqIGFscGhhKSAtIDEpIC8gKE1hdGguZXhwKGFscGhhKSAtIDEpKVxyXG5cclxuLyoqXHJcbiAqIEZ1bmN0aW9uIFswLDFdLT5bMCwxXSB0byBzdHJldGNoIHJhbmdlIG9mIHZhbHVlcy5cclxuICogRXhwb25lbnRpYWwgKHJldmVyc2UpXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0IFRoZSB2YWx1ZSB0byBzdHJldGNoLCB3aXRoaW4gWzAsMV1cclxuICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIDA6IG5vIHN0cmV0Y2hpbmcuIC1JbmY6IHNob3cgbG93IHZhbHVlcy4gSW5mOiBzaG93IGhpZ2ggdmFsdWVzLlxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgc3RyZXRjaGVkIHZhbHVlLCB3aXRoaW4gWzAsMV1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzRXhwUmV2ID0gKHQsIGFscGhhID0gMykgPT5cclxuICAgIGFscGhhID09IDAgPyB0IDogMSAtICgxIC8gYWxwaGEpICogTWF0aC5sb2coTWF0aC5leHAoYWxwaGEpICogKDEgLSB0KSArIHQpXHJcblxyXG4vKipcclxuICogRnVuY3Rpb24gWzAsMV0tPlswLDFdIHRvIHN0cmV0Y2ggcmFuZ2Ugb2YgdmFsdWVzLlxyXG4gKiBDaXJjbGUsIHNob3cgbG93IHZhbHVlc1xyXG4gKiBOQjogc0NpcmNsZUhpZ2ggYW5kIHNDaXJjbGVMb3cgYXJlIGludmVyc2UgZnVuY3Rpb25zIG9mIGVhY2ggb3RoZXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0IFRoZSB2YWx1ZSB0byBzdHJldGNoLCB3aXRoaW4gWzAsMV1cclxuICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIDA6IG5vIHN0cmV0Y2hpbmcuIDE6IHBlcmZlY3QgY2lyY2xlIHNlY3Rpb25cclxuICogQHJldHVybnMge251bWJlcn0gVGhlIHN0cmV0Y2hlZCB2YWx1ZSwgd2l0aGluIFswLDFdXHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc0NpcmNsZUxvdyA9ICh0LCBhbHBoYSA9IDAuOCkgPT4ge1xyXG4gICAgaWYgKGFscGhhID09IDApIHJldHVybiB0XHJcbiAgICBpZiAoYWxwaGEgPT0gMSkgcmV0dXJuIE1hdGguc3FydCh0ICogKDIgLSB0KSlcclxuICAgIGNvbnN0IGEgPSBhbHBoYSAvICgxIC0gYWxwaGEpXHJcbiAgICByZXR1cm4gTWF0aC5zcXJ0KDEgLyAoYSAqIGEpICsgdCAqICgyIC8gYSArIDIgLSB0KSkgLSAxIC8gYVxyXG59XHJcblxyXG4vKipcclxuICogRnVuY3Rpb24gWzAsMV0tPlswLDFdIHRvIHN0cmV0Y2ggcmFuZ2Ugb2YgdmFsdWVzLlxyXG4gKiBDaXJjbGUsIHNob3cgaGlnaCB2YWx1ZXNcclxuICogTkI6IHNDaXJjbGVIaWdoIGFuZCBzQ2lyY2xlTG93IGFyZSBpbnZlcnNlIGZ1bmN0aW9ucyBvZiBlYWNoIG90aGVyLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdCBUaGUgdmFsdWUgdG8gc3RyZXRjaCwgd2l0aGluIFswLDFdXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAwOiBubyBzdHJldGNoaW5nLiAxOiBwZXJmZWN0IGNpcmNsZSBzZWN0aW9uXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBzdHJldGNoZWQgdmFsdWUsIHdpdGhpbiBbMCwxXVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNDaXJjbGVIaWdoID0gKHQsIGFscGhhID0gMC44KSA9PiAxIC0gc0NpcmNsZUxvdygxIC0gdCwgYWxwaGEpXHJcblxyXG4vKipcclxuICogSW52ZXJzZSBmdW5jdGlvbnNcclxuICovXHJcblxyXG4vKipcclxuICogSW52ZXJzZSBmdW5jdGlvbiBvZiBzRXhwXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYVxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNFeHBJbnZlcnNlID0gKHksIGFscGhhID0gMykgPT5cclxuICAgIGFscGhhID09IDAgPyB5IDogKDEgLyBhbHBoYSkgKiBNYXRoLmxvZygxIC0geSArIHkgKiBNYXRoLmV4cChhbHBoYSkpXHJcblxyXG4vKipcclxuICogSW52ZXJzZSBmdW5jdGlvbiBvZiBzRXhwUmV2XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYVxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNFeHBSZXZJbnZlcnNlID0gKHksIGFscGhhID0gMykgPT4gKE1hdGguZXhwKC1hbHBoYSAqIHkpIC0gMSkgLyAoTWF0aC5leHAoLWFscGhhKSAtIDEpXHJcblxyXG4vKipcclxuICogSW52ZXJzZSBmdW5jdGlvbiBvZiBzUG93XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYVxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuXHJcbmV4cG9ydCBjb25zdCBzUG93SW52ZXJzZSA9ICh5LCBhbHBoYSA9IDMpID0+IE1hdGgucG93KHksIDEgLyBhbHBoYSlcclxuXHJcbi8qKlxyXG4gKiBJbnZlcnNlIGZ1bmN0aW9uIG9mIHNQb3dSZXZcclxuICogQHBhcmFtIHtudW1iZXJ9IHlcclxuICogQHBhcmFtIHtudW1iZXJ9IGFscGhhXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc1Bvd1JldkludmVyc2UgPSAoeSwgYWxwaGEgPSAzKSA9PiAxIC0gTWF0aC5wb3coMSAtIHksIGFscGhhKVxyXG5cclxuLy90ZXN0IGNvZGVcclxuLypcclxuZm9yIChsZXQgaSA9IDA7IGkgPD0gMTsgaSArPSAwLjAwMSkge1xyXG4gIC8vY29uc3QgdiA9IGd2aXouc0V4cChndml6LnNFeHBJbnZlcnNlKGkpKTtcclxuICAvL2NvbnN0IHYgPSBndml6LnNFeHBJbnZlcnNlKGd2aXouc0V4cChpKSk7XHJcbiAgLy9jb25zdCB2ID0gZ3Zpei5zRXhwUmV2KGd2aXouc0V4cFJldkludmVyc2UoaSkpO1xyXG4gIC8vY29uc3QgdiA9IGd2aXouc0V4cFJldkludmVyc2UoZ3Zpei5zRXhwUmV2KGkpKTtcclxuICAvL2NvbnN0IHYgPSBndml6LnNQb3coZ3Zpei5zUG93SW52ZXJzZShpKSk7XHJcbiAgLy9jb25zdCB2ID0gZ3Zpei5zUG93SW52ZXJzZShndml6LnNQb3coaSkpO1xyXG4gIC8vY29uc3QgdiA9IGd2aXouc1Bvd1Jldihndml6LnNQb3dSZXZJbnZlcnNlKGkpKTtcclxuICAvL2NvbnN0IHYgPSBndml6LnNQb3dSZXZJbnZlcnNlKGd2aXouc1Bvd1JldihpKSk7XHJcbiAgLy9jb25zdCB2ID0gZ3Zpei5zQ2lyY2xlTG93KGd2aXouc0NpcmNsZUhpZ2goaSkpO1xyXG4gIC8vY29uc3QgdiA9IGd2aXouc0NpcmNsZUhpZ2goZ3Zpei5zQ2lyY2xlTG93KGkpKTtcclxuICBjb25zb2xlLmxvZyhpIC0gdilcclxufVxyXG4qL1xyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gd2lkdGhcclxuICogQHBhcmFtIHtzdHJpbmd9IGhlaWdodFxyXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gKiBAcmV0dXJucyB7e2NhbnZhczpIVE1MQ2FudmFzRWxlbWVudCwgZ2w6V2ViR0xSZW5kZXJpbmdDb250ZXh0fX1cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtYWtlV2ViR0xDYW52YXMod2lkdGgsIGhlaWdodCwgb3B0cykge1xyXG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcclxuICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgd2lkdGgpXHJcbiAgICBjYW52YXMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBoZWlnaHQpXHJcbiAgICBjb25zdCBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcsIG9wdHMpXHJcbiAgICBpZiAoIWdsKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gaW5pdGlhbGl6ZSBXZWJHTC4gWW91ciBicm93c2VyIG9yIG1hY2hpbmUgbWF5IG5vdCBzdXBwb3J0IGl0LicpXHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBjYW52YXM6IGNhbnZhcywgZ2w6IGdsIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEluaXRpYWxpemUgYSBzaGFkZXIgcHJvZ3JhbSwgc28gV2ViR0wga25vd3MgaG93IHRvIGRyYXcgb3VyIGRhdGFcclxuICpcclxuICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsXHJcbiAqIEBwYXJhbSAgey4uLldlYkdMU2hhZGVyfSBzaGFkZXJzXHJcbiAqIEByZXR1cm5zIHtXZWJHTFByb2dyYW19XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaW5pdFNoYWRlclByb2dyYW0oZ2wsIC4uLnNoYWRlcnMpIHtcclxuICAgIC8qKiBAdHlwZSB7V2ViR0xQcm9ncmFtfG51bGx9ICovXHJcbiAgICBjb25zdCBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpXHJcbiAgICBpZiAocHJvZ3JhbSA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgd2ViR0wgcHJvZ3JhbScpXHJcbiAgICBmb3IgKGNvbnN0IHNoYWRlciBvZiBzaGFkZXJzKSBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgc2hhZGVyKVxyXG4gICAgZ2wubGlua1Byb2dyYW0ocHJvZ3JhbSlcclxuICAgIGlmIChnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLkxJTktfU1RBVFVTKSkgcmV0dXJuIHByb2dyYW1cclxuICAgIHRocm93IG5ldyBFcnJvcihnbC5nZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKSB8fCAnQ2Fubm90IGNyZWF0ZSB3ZWJHTCBwcm9ncmFtICgyKScpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgc2hhZGVyIG9mIHRoZSBnaXZlbiB0eXBlLCB1cGxvYWRzIHRoZSBzb3VyY2UgYW5kIGNvbXBpbGVzIGl0LlxyXG4gKlxyXG4gKiBAcGFyYW0ge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2xcclxuICogQHBhcmFtIHtudW1iZXJ9IHR5cGVcclxuICogQHBhcmFtICB7Li4uc3RyaW5nfSBzb3VyY2VzXHJcbiAqIEByZXR1cm5zIHtXZWJHTFNoYWRlcn1cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTaGFkZXIoZ2wsIHR5cGUsIC4uLnNvdXJjZXMpIHtcclxuICAgIC8qKiBAdHlwZSB7V2ViR0xTaGFkZXJ8bnVsbH0gKi9cclxuICAgIGNvbnN0IHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcih0eXBlKVxyXG4gICAgaWYgKHNoYWRlciA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgd2ViR0wgc2hhZGVyJylcclxuICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIHNvdXJjZXMuam9pbignXFxuJykpXHJcbiAgICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcilcclxuICAgIGlmIChnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUykpIHJldHVybiBzaGFkZXJcclxuICAgIHRocm93IG5ldyBFcnJvcihnbC5nZXRTaGFkZXJJbmZvTG9nKHNoYWRlcikgfHwgJ0Nhbm5vdCBjcmVhdGUgd2ViR0wgc2hhZGVyICgyKScpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVjayBpZiB3ZWJHTCBpcyBzdXBwb3J0ZWRcclxuICpcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tXZWJHTFN1cHBvcnQoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXHJcbiAgICAgICAgcmV0dXJuICEhd2luZG93LldlYkdMUmVuZGVyaW5nQ29udGV4dCAmJlxyXG4gICAgICAgICAgICAoY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJykgfHwgY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcpKVxyXG4gICAgICAgICAgICA/IHRydWVcclxuICAgICAgICAgICAgOiBmYWxzZVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbn1cclxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbi8vIHRoZSBhcHBsaWNhdGlvblxyXG5leHBvcnQgeyBBcHAgfSBmcm9tICcuL0FwcC5qcydcclxuZXhwb3J0IHsgR2VvQ2FudmFzIH0gZnJvbSAnLi9HZW9DYW52YXMuanMnXHJcbmV4cG9ydCB7IFN0eWxlIH0gZnJvbSAnLi9TdHlsZS5qcydcclxuZXhwb3J0IHsgTGF5ZXIgfSBmcm9tICcuL0xheWVyLmpzJ1xyXG5leHBvcnQgeyBEYXRhc2V0IH0gZnJvbSAnLi9EYXRhc2V0LmpzJ1xyXG5leHBvcnQgeyBEYXRhc2V0Q29tcG9uZW50IH0gZnJvbSAnLi9EYXRhc2V0Q29tcG9uZW50LmpzJ1xyXG5cclxuLy8gZXhwb3J0IGRhdGFzZXQgdHlwZXNcclxuZXhwb3J0IHsgVGlsZWRHcmlkIH0gZnJvbSAnLi9kYXRhc2V0L1RpbGVkR3JpZC5qcydcclxuZXhwb3J0IHsgQ1NWR3JpZCB9IGZyb20gJy4vZGF0YXNldC9DU1ZHcmlkLmpzJ1xyXG4vL2V4cG9ydCB7IFBhcnF1ZXRHcmlkIH0gZnJvbSBcIi4vZGF0YXNldC9QYXJxdWV0R3JpZFwiXHJcbi8vZXhwb3J0IHsgR2VvVElGRiB9IGZyb20gXCIuL2RhdGFzZXQvR2VvVElGRlwiXHJcblxyXG4vLyBleHBvcnQgc3R5bGVzXHJcbmV4cG9ydCB7IFNoYXBlQ29sb3JTaXplU3R5bGUgfSBmcm9tICcuL3N0eWxlL1NoYXBlQ29sb3JTaXplU3R5bGUuanMnXHJcbmV4cG9ydCB7IFN0cm9rZVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TdHJva2VTdHlsZS5qcydcclxuZXhwb3J0IHsgSm95UGxvdFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9Kb3lQbG90U3R5bGUuanMnXHJcbmV4cG9ydCB7IENvbXBvc2l0aW9uU3R5bGUgfSBmcm9tICcuL3N0eWxlL0NvbXBvc2l0aW9uU3R5bGUuanMnXHJcbmV4cG9ydCB7IFNlZ21lbnRTdHlsZSB9IGZyb20gJy4vc3R5bGUvU2VnbWVudFN0eWxlLmpzJ1xyXG5leHBvcnQgeyBUZXh0U3R5bGUgfSBmcm9tICcuL3N0eWxlL1RleHRTdHlsZS5qcydcclxuZXhwb3J0IHsgS2VybmVsU21vb3RoaW5nU3R5bGUgfSBmcm9tICcuL3N0eWxlL0tlcm5lbFNtb290aGluZ1N0eWxlLmpzJ1xyXG4vL2V4cG9ydCB7IEtlcm5lbFNtb290aGluZ09sZFN0eWxlIH0gZnJvbSBcIi4vc3R5bGUvS2VybmVsU21vb3RoaW5nU3R5bGVcIlxyXG4vL2V4cG9ydCB7IEtlcm5lbFNtb290aGluZ1dHTFN0eWxlIH0gZnJvbSBcIi4vc3R5bGUvS2VybmVsU21vb3RoaW5nU3R5bGVcIlxyXG5leHBvcnQgeyBQaWxsYXJTdHlsZSB9IGZyb20gJy4vc3R5bGUvUGlsbGFyU3R5bGUuanMnXHJcbmV4cG9ydCB7IFNpZGVTdHlsZSB9IGZyb20gJy4vc3R5bGUvU2lkZVN0eWxlLmpzJ1xyXG5leHBvcnQgeyBDb250b3VyU3R5bGUgfSBmcm9tICcuL3N0eWxlL0NvbnRvdXJTdHlsZS5qcydcclxuZXhwb3J0IHsgU2lkZUNhdFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TaWRlQ2F0U3R5bGUuanMnXHJcbmV4cG9ydCB7IERvdERlbnNpdHlTdHlsZSB9IGZyb20gJy4vc3R5bGUvRG90RGVuc2l0eVN0eWxlLmpzJ1xyXG5leHBvcnQgeyBUYW5ha2FTdHlsZSB9IGZyb20gJy4vc3R5bGUvVGFuYWthU3R5bGUuanMnXHJcbmV4cG9ydCB7IExlZ29TdHlsZSB9IGZyb20gJy4vc3R5bGUvTGVnb1N0eWxlLmpzJ1xyXG5leHBvcnQgeyBTcXVhcmVDb2xvcldHTFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TcXVhcmVDb2xvcldHTFN0eWxlLmpzJ1xyXG5leHBvcnQgeyBTcXVhcmVDb2xvckNhdFdHTFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TcXVhcmVDb2xvckNhdFdHTFN0eWxlLmpzJ1xyXG5leHBvcnQgeyBNb3NhaWNTdHlsZSB9IGZyb20gJy4vc3R5bGUvTW9zYWljU3R5bGUuanMnXHJcbmV4cG9ydCB7IE5pbmphU3RhclN0eWxlIH0gZnJvbSAnLi9zdHlsZS9OaW5qYVN0YXJTdHlsZS5qcydcclxuXHJcbi8vIGV4cG9ydCBhZGRpdGlvbmFsIGxheWVyc1xyXG5leHBvcnQgeyBCYWNrZ3JvdW5kTGF5ZXIgfSBmcm9tICcuL0JhY2tncm91bmRMYXllci5qcydcclxuZXhwb3J0IHsgQmFja2dyb3VuZExheWVyV01TIH0gZnJvbSAnLi9CYWNrZ3JvdW5kTGF5ZXJXTVMuanMnXHJcbmV4cG9ydCB7IExhYmVsTGF5ZXIgfSBmcm9tICcuL0xhYmVsTGF5ZXIuanMnXHJcbmV4cG9ydCB7IExpbmVMYXllciBhcyBCb3VuZGFyeUxheWVyIH0gZnJvbSAnLi9MaW5lTGF5ZXIuanMnXHJcblxyXG4vLyBleHBvcnQgbGVnZW5kc1xyXG5leHBvcnQgeyBDb2xvckxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL0NvbG9yTGVnZW5kLmpzJ1xyXG5leHBvcnQgeyBDb2xvckRpc2NyZXRlTGVnZW5kIH0gZnJvbSAnLi9sZWdlbmQvQ29sb3JEaXNjcmV0ZUxlZ2VuZC5qcydcclxuZXhwb3J0IHsgQ29sb3JDYXRlZ29yeUxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL0NvbG9yQ2F0ZWdvcnlMZWdlbmQuanMnXHJcbmV4cG9ydCB7IFNpemVMZWdlbmQgfSBmcm9tICcuL2xlZ2VuZC9TaXplTGVnZW5kLmpzJ1xyXG5leHBvcnQgeyBTZWdtZW50V2lkdGhMZWdlbmQgfSBmcm9tICcuL2xlZ2VuZC9TZWdtZW50V2lkdGhMZWdlbmQuanMnXHJcbmV4cG9ydCB7IFNlZ21lbnRPcmllbnRhdGlvbkxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL1NlZ21lbnRPcmllbnRhdGlvbkxlZ2VuZC5qcydcclxuXHJcbi8vIGV4cG9ydCB7IGdvVG9TdHJhaWdodCwgem9vbVRvIH0gZnJvbSBcIi4vdXRpbHMvem9vbVV0aWxzXCJcclxuZXhwb3J0ICogZnJvbSAnLi91dGlscy9zdHJldGNoaW5nLmpzJ1xyXG5cclxuZXhwb3J0IHsgZ2V0Q2xhc3MgfSBmcm9tICcuL3V0aWxzL1V0aWxzLmpzJ1xyXG5cclxuaW1wb3J0IHsgR2VvQ2FudmFzIH0gZnJvbSAnLi9HZW9DYW52YXMuanMnXHJcbmltcG9ydCB7IGdlb0F6aW11dGhhbEVxdWFsQXJlYSB9IGZyb20gJ2QzLWdlbydcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGxhYmVsIGxheWVyIGZyb20gRXVyb3N0YXQsIGZvciBFVFJTODktTEFFQSBncmlkcy5cclxuICogRnJvbSBFdXJvbnltIGRhdGE6IGh0dHBzOi8vZ2l0aHViLmNvbS9ldXJvc3RhdC9ldXJvbnltXHJcbiAqXHJcbiAqIEByZXR1cm5zIHtvYmplY3R9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0RXVyb255bWVMYWJlbExheWVyID0gZnVuY3Rpb24gKGNjID0gJ0VVUicsIHJlcyA9IDUwLCBvcHRzKSB7XHJcbiAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG4gICAgY29uc3QgZXggPSBvcHRzLmV4IHx8IDEuMlxyXG4gICAgY29uc3QgZm9udEZhbWlseSA9IG9wdHMuZm9udEZhbWlseSB8fCAnQXJpYWwnXHJcbiAgICBjb25zdCBleFNpemUgPSBvcHRzLmV4U2l6ZSB8fCAxXHJcbiAgICBvcHRzLnN0eWxlID1cclxuICAgICAgICBvcHRzLnN0eWxlIHx8XHJcbiAgICAgICAgKChsYiwgemYpID0+IHtcclxuICAgICAgICAgICAgaWYgKGxiLnJzIDwgZXggKiB6ZikgcmV0dXJuXHJcbiAgICAgICAgICAgIGlmIChsYi5yMSA8IGV4ICogemYpIHJldHVybiBleFNpemUgKyAnZW0gJyArIGZvbnRGYW1pbHlcclxuICAgICAgICAgICAgcmV0dXJuIGV4U2l6ZSAqIDEuNSArICdlbSAnICsgZm9udEZhbWlseVxyXG4gICAgICAgIH0pXHJcbiAgICAvL0VUUlM4OS1MQUVBIHByb2plY3Rpb25cclxuICAgIG9wdHMucHJvaiA9XHJcbiAgICAgICAgb3B0cy5wcm9qIHx8XHJcbiAgICAgICAgZ2VvQXppbXV0aGFsRXF1YWxBcmVhKClcclxuICAgICAgICAgICAgLnJvdGF0ZShbLTEwLCAtNTJdKVxyXG4gICAgICAgICAgICAucmVmbGVjdFgoZmFsc2UpXHJcbiAgICAgICAgICAgIC5yZWZsZWN0WSh0cnVlKVxyXG4gICAgICAgICAgICAuc2NhbGUoNjM3ODEzNylcclxuICAgICAgICAgICAgLnRyYW5zbGF0ZShbNDMyMTAwMCwgMzIxMDAwMF0pXHJcbiAgICBvcHRzLnByZXByb2Nlc3MgPSAobGIpID0+IHtcclxuICAgICAgICAvL2V4Y2x1ZGUgY291bnRyaWVzXHJcbiAgICAgICAgLy9pZihvcHRzLmNjT3V0ICYmIGxiLmNjICYmIG9wdHMuY2NPdXQuaW5jbHVkZXMobGIuY2MpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKG9wdHMuY2NJbiAmJiBsYi5jYyAmJiAhKG9wdHMuY2NJbi5pbmRleE9mKGxiLmNjKSA+PSAwKSkgcmV0dXJuIGZhbHNlXHJcblxyXG4gICAgICAgIC8vcHJvamVjdCBmcm9tIGdlbyBjb29yZGluYXRlcyB0byBFVFJTODktTEFFQVxyXG4gICAgICAgIGNvbnN0IHAgPSBvcHRzLnByb2ooW2xiLmxvbiwgbGIubGF0XSlcclxuICAgICAgICBsYi54ID0gcFswXVxyXG4gICAgICAgIGxiLnkgPSBwWzFdXHJcbiAgICAgICAgZGVsZXRlIGxiLmxvblxyXG4gICAgICAgIGRlbGV0ZSBsYi5sYXRcclxuICAgIH1cclxuICAgIG9wdHMuYmFzZVVSTCA9IG9wdHMuYmFzZVVSTCB8fCAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2V1cm9zdGF0L2V1cm9ueW0vbWFpbi9wdWIvdjIvVVRGLydcclxuICAgIG9wdHMudXJsID0gb3B0cy5iYXNlVVJMICsgcmVzICsgJy8nICsgY2MgKyAnLmNzdidcclxuICAgIHJldHVybiBvcHRzXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdldEV1cm9zdGF0Qm91bmRhcmllc0xheWVyID0gZnVuY3Rpb24gKG9wdHMpIHtcclxuICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcbiAgICBjb25zdCBudXRzWWVhciA9IG9wdHMubnV0c1llYXIgfHwgJzIwMjEnXHJcbiAgICBjb25zdCBjcnMgPSBvcHRzLmNycyB8fCAnMzAzNSdcclxuICAgIGNvbnN0IHNjYWxlID0gb3B0cy5zY2FsZSB8fCAnMDNNJ1xyXG4gICAgY29uc3QgbnV0c0xldmVsID0gb3B0cy5udXRzTGV2ZWwgfHwgJzMnXHJcbiAgICBjb25zdCBjb2wgPSBvcHRzLmNvbCB8fCAnIzg4OCdcclxuICAgIGNvbnN0IGNvbEtvc292byA9IG9wdHMuY29sS29zb3ZvIHx8ICcjYmNiY2JjJ1xyXG4gICAgY29uc3Qgc2hvd090aCA9IG9wdHMuc2hvd090aCA9PSB1bmRlZmluZWQgPyB0cnVlIDogb3B0cy5zaG93T3RoXHJcblxyXG4gICAgb3B0cy5jb2xvciA9XHJcbiAgICAgICAgb3B0cy5jb2xvciB8fFxyXG4gICAgICAgICgoZiwgemYpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcCA9IGYucHJvcGVydGllc1xyXG4gICAgICAgICAgICBpZiAoIXNob3dPdGggLyomJiBwLmNvID09IFwiRlwiKi8gJiYgcC5ldSAhPSAnVCcgJiYgcC5jYyAhPSAnVCcgJiYgcC5lZnRhICE9ICdUJyAmJiBwLm90aCA9PT0gJ1QnKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIGlmIChwLmlkID49IDEwMDAwMCkgcmV0dXJuIGNvbEtvc292b1xyXG4gICAgICAgICAgICBpZiAocC5jbyA9PT0gJ1QnKSByZXR1cm4gY29sXHJcbiAgICAgICAgICAgIGlmICh6ZiA8IDQwMCkgcmV0dXJuIGNvbFxyXG4gICAgICAgICAgICBlbHNlIGlmICh6ZiA8IDEwMDApIHJldHVybiBwLmx2bCA+PSAzID8gJycgOiBjb2xcclxuICAgICAgICAgICAgZWxzZSBpZiAoemYgPCAyMDAwKSByZXR1cm4gcC5sdmwgPj0gMiA/ICcnIDogY29sXHJcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIHAubHZsID49IDEgPyAnJyA6IGNvbFxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgb3B0cy53aWR0aCA9XHJcbiAgICAgICAgb3B0cy53aWR0aCB8fFxyXG4gICAgICAgICgoZiwgemYpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcCA9IGYucHJvcGVydGllc1xyXG4gICAgICAgICAgICBpZiAocC5jbyA9PT0gJ1QnKSByZXR1cm4gMC41XHJcbiAgICAgICAgICAgIGlmICh6ZiA8IDQwMCkgcmV0dXJuIHAubHZsID09IDMgPyAyLjIgOiBwLmx2bCA9PSAyID8gMi4yIDogcC5sdmwgPT0gMSA/IDIuMiA6IDRcclxuICAgICAgICAgICAgZWxzZSBpZiAoemYgPCAxMDAwKSByZXR1cm4gcC5sdmwgPT0gMiA/IDEuOCA6IHAubHZsID09IDEgPyAxLjggOiAyLjVcclxuICAgICAgICAgICAgZWxzZSBpZiAoemYgPCAyMDAwKSByZXR1cm4gcC5sdmwgPT0gMSA/IDEuOCA6IDIuNVxyXG4gICAgICAgICAgICBlbHNlIHJldHVybiAxLjJcclxuICAgICAgICB9KVxyXG5cclxuICAgIG9wdHMubGluZURhc2ggPVxyXG4gICAgICAgIG9wdHMubGluZURhc2ggfHxcclxuICAgICAgICAoKGYsIHpmKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHAgPSBmLnByb3BlcnRpZXNcclxuICAgICAgICAgICAgaWYgKHAuY28gPT09ICdUJykgcmV0dXJuIFtdXHJcbiAgICAgICAgICAgIGlmICh6ZiA8IDQwMClcclxuICAgICAgICAgICAgICAgIHJldHVybiBwLmx2bCA9PSAzXHJcbiAgICAgICAgICAgICAgICAgICAgPyBbMiAqIHpmLCAyICogemZdXHJcbiAgICAgICAgICAgICAgICAgICAgOiBwLmx2bCA9PSAyXHJcbiAgICAgICAgICAgICAgICAgICAgPyBbNSAqIHpmLCAyICogemZdXHJcbiAgICAgICAgICAgICAgICAgICAgOiBwLmx2bCA9PSAxXHJcbiAgICAgICAgICAgICAgICAgICAgPyBbNSAqIHpmLCAyICogemZdXHJcbiAgICAgICAgICAgICAgICAgICAgOiBbMTAgKiB6ZiwgMyAqIHpmXVxyXG4gICAgICAgICAgICBlbHNlIGlmICh6ZiA8IDEwMDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcC5sdmwgPT0gMiA/IFs1ICogemYsIDIgKiB6Zl0gOiBwLmx2bCA9PSAxID8gWzUgKiB6ZiwgMiAqIHpmXSA6IFsxMCAqIHpmLCAzICogemZdXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHpmIDwgMjAwMCkgcmV0dXJuIHAubHZsID09IDEgPyBbNSAqIHpmLCAyICogemZdIDogWzEwICogemYsIDMgKiB6Zl1cclxuICAgICAgICAgICAgZWxzZSByZXR1cm4gWzEwICogemYsIDMgKiB6Zl1cclxuICAgICAgICB9KVxyXG5cclxuICAgIG9wdHMuYmFzZVVSTCA9IG9wdHMuYmFzZVVSTCB8fCAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2V1cm9zdGF0L051dHMyanNvbi9tYXN0ZXIvcHViL3YyLydcclxuICAgIG9wdHMudXJsID0gb3B0cy5iYXNlVVJMICsgbnV0c1llYXIgKyAnLycgKyBjcnMgKyAnLycgKyBzY2FsZSArICcvbnV0c2JuXycgKyBudXRzTGV2ZWwgKyAnLmpzb24nXHJcbiAgICByZXR1cm4gb3B0c1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0UGFyYW1ldGVyQnlOYW1lID0gR2VvQ2FudmFzLmdldFBhcmFtZXRlckJ5TmFtZVxyXG5cclxuLy8gc2V0IGRlZmF1bHQgZDMgbG9jYWxlXHJcbmltcG9ydCB7IGZvcm1hdERlZmF1bHRMb2NhbGUgfSBmcm9tICdkMy1mb3JtYXQnXHJcbmZvcm1hdERlZmF1bHRMb2NhbGUoe1xyXG4gICAgZGVjaW1hbDogJy4nLFxyXG4gICAgdGhvdXNhbmRzOiAnICcsXHJcbiAgICBncm91cGluZzogWzNdLFxyXG4gICAgY3VycmVuY3k6IFsnJywgJ+KCrCddLFxyXG59KVxyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHZpei5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTzs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHVCQUF1QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBZSxvQ0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVlO0FBQ2Y7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUjJDO0FBQ3dEO0FBQ3JFO0FBQ3ZCO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0Esa0JBQWtCLDZEQUFtQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsZUFBZTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3Qyw4QkFBOEI7QUFDdEU7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiw2REFBbUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0RBQVUsTUFBTTtBQUNsQyxpREFBaUQsa0RBQVU7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGVBQWU7QUFDdkMsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsK0JBQStCO0FBQzlDO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0EsdURBQXVELG9EQUFZO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLHlCQUF5QjtBQUN6RDtBQUNBO0FBQ0EsNkJBQTZCLG9EQUFZLEVBQUUsU0FBUyxLQUFLLG9EQUFZO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsMERBQWtCO0FBQ2hFO0FBQ0E7QUFDQSxxQ0FBcUMsa0RBQVU7QUFDL0MsZ0JBQWdCLDhEQUFzQjtBQUN0QywwQ0FBMEMsOERBQXNCO0FBQ2hFO0FBQ0Esb0JBQW9CLDhEQUFzQjtBQUMxQztBQUNBLHlCQUF5Qiw4REFBc0IsTUFBTSxRQUFRO0FBQzdEO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxrREFBVTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrREFBVTtBQUM1QixxREFBcUQ7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRSxpQkFBaUI7QUFDdkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsOENBQVc7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQywwQ0FBMEM7QUFDM0M7QUFDQSxVQUFVO0FBQ1Y7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLENBQUMsOEJBQThCO0FBQy9CO0FBQ0EsVUFBVTtBQUNWO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsOEJBQThCO0FBQy9CO0FBQ0EsVUFBVTtBQUNWO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxDQUFDLDRCQUE0QjtBQUM3QjtBQUNBLFVBQVU7QUFDVjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsNEJBQTRCO0FBQzdCO0FBQ0EsVUFBVTtBQUNWO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsb0NBQW9DO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsc0NBQXNDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLFFBQVE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLFFBQVE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbElBO0FBQzJDO0FBQ3BDO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsMkRBQThCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDM0NBO0FBQzJDO0FBQ3BDO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsMkRBQThCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7OztBQzNDQTtBQUMyQztBQUNDO0FBQ3JDO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsMkRBQThCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFLDBEQUFjO0FBQ2hGO0FBQ0E7QUFDQTtB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O0FBQ0EsdUNBQXVDLDJEQUE4QjtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDcENBO0FBQzJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QywyREFBOEI7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3BDQTtBQUMyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsMkRBQThCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwQ0E7QUFDMkM7QUFDcEM7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QywyREFBOEI7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7OztBQ2hDQTtBQUMyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFD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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUMsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0hBO0FBQzJDO0FBQ0w7QUFDTjtBQUNoQztBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLDJEQUE4QjtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyx5Q0FBRztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQywrQ0FBTTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyx5Q0FBRztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQywrQ0FBTTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsMkRBQThCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFLGdFQUFvQjtBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsZ0VBQW9CO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqRUE7QUFDMkM7QUFDQTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNPO0FBQ1A7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dkU7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGNBQWM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLGNBQWM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNBO0FBQ1A7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUN1QztBQUNFO0FBQ0Q7QUFDUztBQUNPO0FBQ0k7QUFDVTtBQUM5QjtBQUN4QztBQUNPLDhCQUE4QixpREFBTztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qix5REFBVztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLCtDQUFN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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0RBQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRWU7QUFDZjtBQUNBO0FBQ0E7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O0FBQ2dCO0FBQ0E7QUFDbEI7QUFDZ0I7QUFDWTtBQUMvRTtBQUNBLFlBQVksdUJBQXVCO0FBQ0U7QUFDckM7QUFDMkM7QUFDM0M7QUFDQSxDQUEwQztBQUNJO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFFBQVEsbURBQXFCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sMkJBQTJCLHVFQUE0QjtBQUM5RDtBQUNBO0FBQ0EsQ0FBK0M7QUFDL0Msc0RBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2d2aXovd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2ZzdW0uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbWVyZ2UuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9mbGF0YnVmZmVycy9tanMvYnVpbGRlci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2ZsYXRidWZmZXJzL21qcy9ieXRlLWJ1ZmZlci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2ZsYXRidWZmZXJzL21qcy9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9mbGF0YnVmZmVycy9tanMvZW5jb2RpbmcuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9mbGF0YnVmZmVycy9tanMvZmxhdGJ1ZmZlcnMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9mbGF0YnVmZmVycy9tanMvbG9uZy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2ZsYXRidWZmZXJzL21qcy91dGlscy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9idWlsZGVyLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9idWlsZGVyL2JpbmFyeS5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvYnVpbGRlci9ib29sLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9idWlsZGVyL2J1ZmZlci5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvYnVpbGRlci9kYXRlLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9idWlsZGVyL2RlY2ltYWwubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2J1aWxkZXIvZGljdGlvbmFyeS5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvYnVpbGRlci9maXhlZHNpemViaW5hcnkubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2J1aWxkZXIvZml4ZWRzaXplbGlzdC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvYnVpbGRlci9mbG9hdC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvYnVpbGRlci9pbnQubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2J1aWxkZXIvaW50ZXJ2YWwubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2J1aWxkZXIvbGlzdC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvYnVpbGRlci9tYXAubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2J1aWxkZXIvbnVsbC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvYnVpbGRlci9zdHJ1Y3QubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2J1aWxkZXIvdGltZS5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvYnVpbGRlci90aW1lc3RhbXAubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2J1aWxkZXIvdW5pb24ubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2J1aWxkZXIvdXRmOC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvYnVpbGRlci92YWxpZC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZGF0YS5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZW51bS5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmFjdG9yaWVzLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9iaW5hcnkubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL2Jsb2NrLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9ib2R5LWNvbXByZXNzaW9uLW1ldGhvZC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvYm9keS1jb21wcmVzc2lvbi5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvYm9vbC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvYnVmZmVyLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9jb21wcmVzc2lvbi10eXBlLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9kYXRlLXVuaXQubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL2RhdGUubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL2RlY2ltYWwubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL2RpY3Rpb25hcnktYmF0Y2gubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL2RpY3Rpb25hcnktZW5jb2RpbmcubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL2RpY3Rpb25hcnkta2luZC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvZHVyYXRpb24ubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL2VuZGlhbm5lc3MubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL2ZpZWxkLW5vZGUubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL2ZpZWxkLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9maXhlZC1zaXplLWJpbmFyeS5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvZml4ZWQtc2l6ZS1saXN0Lm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9mbG9hdGluZy1wb2ludC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvZm9vdGVyLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9pbnQubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL2ludGVydmFsLXVuaXQubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL2ludGVydmFsLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9rZXktdmFsdWUubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL2xhcmdlLWJpbmFyeS5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvbGFyZ2UtbGlzdC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvbGFyZ2UtdXRmOC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvbGlzdC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvbWFwLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9tZXNzYWdlLWhlYWRlci5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvbWVzc2FnZS5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvbWV0YWRhdGEtdmVyc2lvbi5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvbnVsbC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvcHJlY2lzaW9uLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi9yZWNvcmQtYmF0Y2gubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL3NjaGVtYS5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvc3BhcnNlLW1hdHJpeC1jb21wcmVzc2VkLWF4aXMubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL3NwYXJzZS1tYXRyaXgtaW5kZXgtYy1zLXgubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL3NwYXJzZS10ZW5zb3ItaW5kZXgtYy1vLW8ubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL3NwYXJzZS10ZW5zb3ItaW5kZXgtYy1zLWYubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL3NwYXJzZS10ZW5zb3ItaW5kZXgubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL3NwYXJzZS10ZW5zb3IubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL3N0cnVjdF8ubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL3RlbnNvci1kaW0ubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL3RlbnNvci5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvZmIvdGltZS11bml0Lm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi90aW1lLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi90aW1lc3RhbXAubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL3R5cGUubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL3VuaW9uLW1vZGUubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2ZiL3VuaW9uLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9mYi91dGY4Lm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9pby9hZGFwdGVycy5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvaW8vZmlsZS5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvaW8vaW50ZXJmYWNlcy5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvaW8vc3RyZWFtLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9pcGMvbWVzc2FnZS5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvaXBjL21ldGFkYXRhL2ZpbGUubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2lwYy9tZXRhZGF0YS9qc29uLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9pcGMvbWV0YWRhdGEvbWVzc2FnZS5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvaXBjL3JlYWRlci5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvaXBjL3NlcmlhbGl6YXRpb24ubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L2lwYy93cml0ZXIubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L3JlY29yZGJhdGNoLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9yb3cvbWFwLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9yb3cvc3RydWN0Lm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy9zY2hlbWEubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L3RhYmxlLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy90eXBlLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy91dGlsL2JpdC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvdXRpbC9ibi5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvdXRpbC9idWZmZXIubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L3V0aWwvY2h1bmsubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L3V0aWwvY29tcGF0Lm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy91dGlsL2ludC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvdXRpbC9tYXRoLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy91dGlsL3ByZXR0eS5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvdXRpbC9yZWNvcmRiYXRjaC5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvdXRpbC91dGY4Lm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy91dGlsL3ZlY3Rvci5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvdmVjdG9yLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy92aXNpdG9yLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy92aXNpdG9yL2J1aWxkZXJjdG9yLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy92aXNpdG9yL2J5dGVsZW5ndGgubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L3Zpc2l0b3IvZ2V0Lm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2FwYWNoZS1hcnJvdy92aXNpdG9yL2luZGV4b2YubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L3Zpc2l0b3IvaXRlcmF0b3IubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L3Zpc2l0b3IvanNvbnR5cGVhc3NlbWJsZXIubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L3Zpc2l0b3IvanNvbnZlY3RvcmFzc2VtYmxlci5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvdmlzaXRvci9zZXQubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L3Zpc2l0b3IvdHlwZWFzc2VtYmxlci5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvdmlzaXRvci90eXBlY29tcGFyYXRvci5tanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9hcGFjaGUtYXJyb3cvdmlzaXRvci92ZWN0b3Jhc3NlbWJsZXIubWpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvYXBhY2hlLWFycm93L3Zpc2l0b3IvdmVjdG9ybG9hZGVyLm1qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9jb2xvci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1kaXNwYXRjaC9zcmMvZGlzcGF0Y2guanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9ub2RyYWcuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9ub2V2ZW50LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZHN2L3NyYy9jc3YuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1kc3Yvc3JjL2Rzdi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWRzdi9zcmMvdHN2LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvY3ViaWMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mZXRjaC9zcmMvZHN2LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZmV0Y2gvc3JjL2pzb24uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mZXRjaC9zcmMvdGV4dC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZGVmYXVsdExvY2FsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZXhwb25lbnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdERlY2ltYWwuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdEdyb3VwLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXROdW1lcmFscy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0UHJlZml4QXV0by5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0Um91bmRlZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0U3BlY2lmaWVyLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRUcmltLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRUeXBlcy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvaWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2xvY2FsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvY2FydGVzaWFuLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9jaXJjbGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2NsaXAvYW50aW1lcmlkaWFuLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9jbGlwL2J1ZmZlci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvY2xpcC9jaXJjbGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2NsaXAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2NsaXAvbGluZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvY2xpcC9yZWN0YW5nbGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2NsaXAvcmVqb2luLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9jb21wb3NlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9jb25zdGFudC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvaWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL21hdGguanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL25vb3AuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3BhdGgvYm91bmRzLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wb2ludEVxdWFsLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wb2x5Z29uQ29udGFpbnMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3Byb2plY3Rpb24vYXppbXV0aGFsLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wcm9qZWN0aW9uL2F6aW11dGhhbEVxdWFsQXJlYS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvcHJvamVjdGlvbi9maXQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3Byb2plY3Rpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3Byb2plY3Rpb24vcmVzYW1wbGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3JvdGF0aW9uLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9zdHJlYW0uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9iYXNpcy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9iYXNpc0Nsb3NlZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9jb2xvci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9jb25zdGFudC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9udW1iZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvcmdiLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3N0cmluZy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy90cmFuc2Zvcm0vZGVjb21wb3NlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9pbmRleC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy90cmFuc2Zvcm0vcGFyc2UuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvem9vbS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXJhbmRvbS9zcmMvZGVmYXVsdFNvdXJjZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXJhbmRvbS9zcmMvbm9ybWFsLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9hcnJheS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NyZWF0b3IuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL21hdGNoZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL25hbWVzcGFjZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvbmFtZXNwYWNlcy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvcG9pbnRlci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vYXBwZW5kLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vYXR0ci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2NhbGwuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9jbGFzc2VkLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2xvbmUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9kYXRhLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGF0dW0uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9kaXNwYXRjaC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2VhY2guanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lbXB0eS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2VudGVyLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZXhpdC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2h0bWwuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2luc2VydC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2l0ZXJhdG9yLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vam9pbi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2xvd2VyLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbWVyZ2UuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9ub2RlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbm9kZXMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9vbi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL29yZGVyLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yYWlzZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3JlbW92ZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdEFsbC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdENoaWxkLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGRyZW4uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zaXplLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc29ydC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NwYXJzZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3N0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vdGV4dC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yQWxsLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zb3VyY2VFdmVudC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvd2luZG93LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtdGltZXIvc3JjL3RpbWVvdXQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvdGltZXIuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9hY3RpdmUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL2ludGVycnVwdC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3NlbGVjdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3NlbGVjdGlvbi9pbnRlcnJ1cHQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vdHJhbnNpdGlvbi5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vYXR0ci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vYXR0clR3ZWVuLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9kZWxheS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZHVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2Vhc2UuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2Vhc2VWYXJ5aW5nLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lbmQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2ludGVycG9sYXRlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9tZXJnZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vb24uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3JlbW92ZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2NoZWR1bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2VsZWN0QWxsLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zZWxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zdHlsZVR3ZWVuLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0VHdlZW4uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3RyYW5zaXRpb24uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3R3ZWVuLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9ldmVudC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL2luZGV4LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvbm9ldmVudC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3pvb20uanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9mYXN0LWtkZS9zcmMvYWNjZXNzb3IuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9mYXN0LWtkZS9zcmMvYmluMWQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9mYXN0LWtkZS9zcmMvYmluMmQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL25vZGVfbW9kdWxlcy9mYXN0LWtkZS9zcmMvZGVuc2l0eTFkLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZmFzdC1rZGUvc3JjL2RlbnNpdHkyZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2Zhc3Qta2RlL3NyYy9kZXJpY2hlLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZmFzdC1rZGUvc3JjL2V4dGVudC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vbm9kZV9tb2R1bGVzL2Zhc3Qta2RlL3NyYy9oZWF0bWFwLmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZmFzdC1rZGUvc3JjL2luZGV4LmpzIiwid2VicGFjazovL2d2aXovLi9ub2RlX21vZHVsZXMvZmFzdC1rZGUvc3JjL25yZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL0FwcC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL0JhY2tncm91bmRMYXllci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL0JhY2tncm91bmRMYXllcldNUy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL0RhdGFzZXQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9EYXRhc2V0Q29tcG9uZW50LmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvR2VvQ2FudmFzLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvTGFiZWxMYXllci5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL0xheWVyLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvTGVnZW5kLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvTGluZUxheWVyLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9Ub29sdGlwLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvZGF0YXNldC9DU1ZHcmlkLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvZGF0YXNldC9HcmlkVGlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL2RhdGFzZXQvVGlsZWRHcmlkLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvbGVnZW5kL0NvbG9yQ2F0ZWdvcnlMZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9sZWdlbmQvQ29sb3JEaXNjcmV0ZUxlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL2xlZ2VuZC9Db2xvckxlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL2xlZ2VuZC9TZWdtZW50T3JpZW50YXRpb25MZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9sZWdlbmQvU2VnbWVudFdpZHRoTGVnZW5kLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvbGVnZW5kL1NpemVMZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9Db21wb3NpdGlvblN0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvQ29udG91clN0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvRG90RGVuc2l0eVN0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvSm95UGxvdFN0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvS2VybmVsU21vb3RoaW5nU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9MZWdvU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9Nb3NhaWNTdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL05pbmphU3RhclN0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvUGlsbGFyU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9TZWdtZW50U3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9TaGFwZUNvbG9yU2l6ZVN0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvU2lkZUNhdFN0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvU2lkZVN0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvU3F1YXJlQ29sb3JDYXRXR0xTdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL1NxdWFyZUNvbG9yV0dMU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy9zdHlsZS9TdHJva2VTdHlsZS5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3N0eWxlL1RhbmFrYVN0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvc3R5bGUvVGV4dFN0eWxlLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvdXRpbHMvVXRpbHMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei8uL3NyYy91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkLmpzIiwid2VicGFjazovL2d2aXovLi9zcmMvdXRpbHMvc3RyZXRjaGluZy5qcyIsIndlYnBhY2s6Ly9ndml6Ly4vc3JjL3V0aWxzL3dlYkdMVXRpbHMuanMiLCJ3ZWJwYWNrOi8vZ3Zpei93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9ndml6L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9ndml6L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vZ3Zpei93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2d2aXovLi9zcmMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiZ3ZpelwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJndml6XCJdID0gZmFjdG9yeSgpO1xufSkoc2VsZiwgKCkgPT4ge1xucmV0dXJuICIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9weXRob24vY3B5dGhvbi9ibG9iL2E3NGVlYTIzOGY1YmFiYTE1Nzk3ZTJlOGI1NzBkMTUzYmM4NjkwYTcvTW9kdWxlcy9tYXRobW9kdWxlLmMjTDE0MjNcbmV4cG9ydCBjbGFzcyBBZGRlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3BhcnRpYWxzID0gbmV3IEZsb2F0NjRBcnJheSgzMik7XG4gICAgdGhpcy5fbiA9IDA7XG4gIH1cbiAgYWRkKHgpIHtcbiAgICBjb25zdCBwID0gdGhpcy5fcGFydGlhbHM7XG4gICAgbGV0IGkgPSAwO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5fbiAmJiBqIDwgMzI7IGorKykge1xuICAgICAgY29uc3QgeSA9IHBbal0sXG4gICAgICAgIGhpID0geCArIHksXG4gICAgICAgIGxvID0gTWF0aC5hYnMoeCkgPCBNYXRoLmFicyh5KSA/IHggLSAoaGkgLSB5KSA6IHkgLSAoaGkgLSB4KTtcbiAgICAgIGlmIChsbykgcFtpKytdID0gbG87XG4gICAgICB4ID0gaGk7XG4gICAgfVxuICAgIHBbaV0gPSB4O1xuICAgIHRoaXMuX24gPSBpICsgMTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB2YWx1ZU9mKCkge1xuICAgIGNvbnN0IHAgPSB0aGlzLl9wYXJ0aWFscztcbiAgICBsZXQgbiA9IHRoaXMuX24sIHgsIHksIGxvLCBoaSA9IDA7XG4gICAgaWYgKG4gPiAwKSB7XG4gICAgICBoaSA9IHBbLS1uXTtcbiAgICAgIHdoaWxlIChuID4gMCkge1xuICAgICAgICB4ID0gaGk7XG4gICAgICAgIHkgPSBwWy0tbl07XG4gICAgICAgIGhpID0geCArIHk7XG4gICAgICAgIGxvID0geSAtIChoaSAtIHgpO1xuICAgICAgICBpZiAobG8pIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKG4gPiAwICYmICgobG8gPCAwICYmIHBbbiAtIDFdIDwgMCkgfHwgKGxvID4gMCAmJiBwW24gLSAxXSA+IDApKSkge1xuICAgICAgICB5ID0gbG8gKiAyO1xuICAgICAgICB4ID0gaGkgKyB5O1xuICAgICAgICBpZiAoeSA9PSB4IC0gaGkpIGhpID0geDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcywgdmFsdWVvZikge1xuICBjb25zdCBhZGRlciA9IG5ldyBBZGRlcigpO1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgPSArdmFsdWUpIHtcbiAgICAgICAgYWRkZXIuYWRkKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgPSArdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkge1xuICAgICAgICBhZGRlci5hZGQodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gK2FkZGVyO1xufVxuIiwiZnVuY3Rpb24qIGZsYXR0ZW4oYXJyYXlzKSB7XG4gIGZvciAoY29uc3QgYXJyYXkgb2YgYXJyYXlzKSB7XG4gICAgeWllbGQqIGFycmF5O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlKGFycmF5cykge1xuICByZXR1cm4gQXJyYXkuZnJvbShmbGF0dGVuKGFycmF5cykpO1xufVxuIiwiaW1wb3J0IHsgQnl0ZUJ1ZmZlciB9IGZyb20gXCIuL2J5dGUtYnVmZmVyXCI7XHJcbmltcG9ydCB7IFNJWkVPRl9TSE9SVCwgU0laRV9QUkVGSVhfTEVOR1RILCBTSVpFT0ZfSU5ULCBGSUxFX0lERU5USUZJRVJfTEVOR1RIIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IExvbmcgfSBmcm9tIFwiLi9sb25nXCI7XHJcbmV4cG9ydCBjbGFzcyBCdWlsZGVyIHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgRmxhdEJ1ZmZlckJ1aWxkZXIuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdF9pbml0aWFsX3NpemUpIHtcclxuICAgICAgICAvKiogTWluaW11bSBhbGlnbm1lbnQgZW5jb3VudGVyZWQgc28gZmFyLiAqL1xyXG4gICAgICAgIHRoaXMubWluYWxpZ24gPSAxO1xyXG4gICAgICAgIC8qKiBUaGUgdnRhYmxlIGZvciB0aGUgY3VycmVudCB0YWJsZS4gKi9cclxuICAgICAgICB0aGlzLnZ0YWJsZSA9IG51bGw7XHJcbiAgICAgICAgLyoqIFRoZSBhbW91bnQgb2YgZmllbGRzIHdlJ3JlIGFjdHVhbGx5IHVzaW5nLiAqL1xyXG4gICAgICAgIHRoaXMudnRhYmxlX2luX3VzZSA9IDA7XHJcbiAgICAgICAgLyoqIFdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBzZXJpYWxpemluZyBhIHRhYmxlLiAqL1xyXG4gICAgICAgIHRoaXMuaXNOZXN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAvKiogU3RhcnRpbmcgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IHN0cnVjdC90YWJsZS4gKi9cclxuICAgICAgICB0aGlzLm9iamVjdF9zdGFydCA9IDA7XHJcbiAgICAgICAgLyoqIExpc3Qgb2Ygb2Zmc2V0cyBvZiBhbGwgdnRhYmxlcy4gKi9cclxuICAgICAgICB0aGlzLnZ0YWJsZXMgPSBbXTtcclxuICAgICAgICAvKiogRm9yIHRoZSBjdXJyZW50IHZlY3RvciBiZWluZyBidWlsdC4gKi9cclxuICAgICAgICB0aGlzLnZlY3Rvcl9udW1fZWxlbXMgPSAwO1xyXG4gICAgICAgIC8qKiBGYWxzZSBvbWl0cyBkZWZhdWx0IHZhbHVlcyBmcm9tIHRoZSBzZXJpYWxpemVkIGRhdGEgKi9cclxuICAgICAgICB0aGlzLmZvcmNlX2RlZmF1bHRzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zdHJpbmdfbWFwcyA9IG51bGw7XHJcbiAgICAgICAgbGV0IGluaXRpYWxfc2l6ZTtcclxuICAgICAgICBpZiAoIW9wdF9pbml0aWFsX3NpemUpIHtcclxuICAgICAgICAgICAgaW5pdGlhbF9zaXplID0gMTAyNDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGluaXRpYWxfc2l6ZSA9IG9wdF9pbml0aWFsX3NpemU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEB0eXBlIHtCeXRlQnVmZmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5iYiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoaW5pdGlhbF9zaXplKTtcclxuICAgICAgICB0aGlzLnNwYWNlID0gaW5pdGlhbF9zaXplO1xyXG4gICAgfVxyXG4gICAgY2xlYXIoKSB7XHJcbiAgICAgICAgdGhpcy5iYi5jbGVhcigpO1xyXG4gICAgICAgIHRoaXMuc3BhY2UgPSB0aGlzLmJiLmNhcGFjaXR5KCk7XHJcbiAgICAgICAgdGhpcy5taW5hbGlnbiA9IDE7XHJcbiAgICAgICAgdGhpcy52dGFibGUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMudnRhYmxlX2luX3VzZSA9IDA7XHJcbiAgICAgICAgdGhpcy5pc05lc3RlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMub2JqZWN0X3N0YXJ0ID0gMDtcclxuICAgICAgICB0aGlzLnZ0YWJsZXMgPSBbXTtcclxuICAgICAgICB0aGlzLnZlY3Rvcl9udW1fZWxlbXMgPSAwO1xyXG4gICAgICAgIHRoaXMuZm9yY2VfZGVmYXVsdHMgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnN0cmluZ19tYXBzID0gbnVsbDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSW4gb3JkZXIgdG8gc2F2ZSBzcGFjZSwgZmllbGRzIHRoYXQgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0IHZhbHVlXHJcbiAgICAgKiBkb24ndCBnZXQgc2VyaWFsaXplZCBpbnRvIHRoZSBidWZmZXIuIEZvcmNpbmcgZGVmYXVsdHMgcHJvdmlkZXMgYVxyXG4gICAgICogd2F5IHRvIG1hbnVhbGx5IGRpc2FibGUgdGhpcyBvcHRpbWl6YXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGZvcmNlRGVmYXVsdHMgdHJ1ZSBhbHdheXMgc2VyaWFsaXplcyBkZWZhdWx0IHZhbHVlc1xyXG4gICAgICovXHJcbiAgICBmb3JjZURlZmF1bHRzKGZvcmNlRGVmYXVsdHMpIHtcclxuICAgICAgICB0aGlzLmZvcmNlX2RlZmF1bHRzID0gZm9yY2VEZWZhdWx0cztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBCeXRlQnVmZmVyIHJlcHJlc2VudGluZyB0aGUgRmxhdEJ1ZmZlci4gT25seSBjYWxsIHRoaXMgYWZ0ZXIgeW91J3ZlXHJcbiAgICAgKiBjYWxsZWQgZmluaXNoKCkuIFRoZSBhY3R1YWwgZGF0YSBzdGFydHMgYXQgdGhlIEJ5dGVCdWZmZXIncyBjdXJyZW50IHBvc2l0aW9uLFxyXG4gICAgICogbm90IG5lY2Vzc2FyaWx5IGF0IDAuXHJcbiAgICAgKi9cclxuICAgIGRhdGFCdWZmZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmI7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBGbGF0QnVmZmVyLiBPbmx5IGNhbGwgdGhpcyBhZnRlciB5b3UndmVcclxuICAgICAqIGNhbGxlZCBmaW5pc2goKS5cclxuICAgICAqL1xyXG4gICAgYXNVaW50OEFycmF5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJiLmJ5dGVzKCkuc3ViYXJyYXkodGhpcy5iYi5wb3NpdGlvbigpLCB0aGlzLmJiLnBvc2l0aW9uKCkgKyB0aGlzLm9mZnNldCgpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUHJlcGFyZSB0byB3cml0ZSBhbiBlbGVtZW50IG9mIGBzaXplYCBhZnRlciBgYWRkaXRpb25hbF9ieXRlc2AgaGF2ZSBiZWVuXHJcbiAgICAgKiB3cml0dGVuLCBlLmcuIGlmIHlvdSB3cml0ZSBhIHN0cmluZywgeW91IG5lZWQgdG8gYWxpZ24gc3VjaCB0aGUgaW50IGxlbmd0aFxyXG4gICAgICogZmllbGQgaXMgYWxpZ25lZCB0byA0IGJ5dGVzLCBhbmQgdGhlIHN0cmluZyBkYXRhIGZvbGxvd3MgaXQgZGlyZWN0bHkuIElmIGFsbFxyXG4gICAgICogeW91IG5lZWQgdG8gZG8gaXMgYWxpZ25tZW50LCBgYWRkaXRpb25hbF9ieXRlc2Agd2lsbCBiZSAwLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBzaXplIFRoaXMgaXMgdGhlIG9mIHRoZSBuZXcgZWxlbWVudCB0byB3cml0ZVxyXG4gICAgICogQHBhcmFtIGFkZGl0aW9uYWxfYnl0ZXMgVGhlIHBhZGRpbmcgc2l6ZVxyXG4gICAgICovXHJcbiAgICBwcmVwKHNpemUsIGFkZGl0aW9uYWxfYnl0ZXMpIHtcclxuICAgICAgICAvLyBUcmFjayB0aGUgYmlnZ2VzdCB0aGluZyB3ZSd2ZSBldmVyIGFsaWduZWQgdG8uXHJcbiAgICAgICAgaWYgKHNpemUgPiB0aGlzLm1pbmFsaWduKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWluYWxpZ24gPSBzaXplO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBGaW5kIHRoZSBhbW91bnQgb2YgYWxpZ25tZW50IG5lZWRlZCBzdWNoIHRoYXQgYHNpemVgIGlzIHByb3Blcmx5XHJcbiAgICAgICAgLy8gYWxpZ25lZCBhZnRlciBgYWRkaXRpb25hbF9ieXRlc2BcclxuICAgICAgICBjb25zdCBhbGlnbl9zaXplID0gKCh+KHRoaXMuYmIuY2FwYWNpdHkoKSAtIHRoaXMuc3BhY2UgKyBhZGRpdGlvbmFsX2J5dGVzKSkgKyAxKSAmIChzaXplIC0gMSk7XHJcbiAgICAgICAgLy8gUmVhbGxvY2F0ZSB0aGUgYnVmZmVyIGlmIG5lZWRlZC5cclxuICAgICAgICB3aGlsZSAodGhpcy5zcGFjZSA8IGFsaWduX3NpemUgKyBzaXplICsgYWRkaXRpb25hbF9ieXRlcykge1xyXG4gICAgICAgICAgICBjb25zdCBvbGRfYnVmX3NpemUgPSB0aGlzLmJiLmNhcGFjaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuYmIgPSBCdWlsZGVyLmdyb3dCeXRlQnVmZmVyKHRoaXMuYmIpO1xyXG4gICAgICAgICAgICB0aGlzLnNwYWNlICs9IHRoaXMuYmIuY2FwYWNpdHkoKSAtIG9sZF9idWZfc2l6ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wYWQoYWxpZ25fc2l6ZSk7XHJcbiAgICB9XHJcbiAgICBwYWQoYnl0ZV9zaXplKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlX3NpemU7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLmJiLndyaXRlSW50OCgtLXRoaXMuc3BhY2UsIDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHdyaXRlSW50OCh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuYmIud3JpdGVJbnQ4KHRoaXMuc3BhY2UgLT0gMSwgdmFsdWUpO1xyXG4gICAgfVxyXG4gICAgd3JpdGVJbnQxNih2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuYmIud3JpdGVJbnQxNih0aGlzLnNwYWNlIC09IDIsIHZhbHVlKTtcclxuICAgIH1cclxuICAgIHdyaXRlSW50MzIodmFsdWUpIHtcclxuICAgICAgICB0aGlzLmJiLndyaXRlSW50MzIodGhpcy5zcGFjZSAtPSA0LCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICB3cml0ZUludDY0KHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5iYi53cml0ZUludDY0KHRoaXMuc3BhY2UgLT0gOCwgdmFsdWUpO1xyXG4gICAgfVxyXG4gICAgd3JpdGVGbG9hdDMyKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5iYi53cml0ZUZsb2F0MzIodGhpcy5zcGFjZSAtPSA0LCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICB3cml0ZUZsb2F0NjQodmFsdWUpIHtcclxuICAgICAgICB0aGlzLmJiLndyaXRlRmxvYXQ2NCh0aGlzLnNwYWNlIC09IDgsIHZhbHVlKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQWRkIGFuIGBpbnQ4YCB0byB0aGUgYnVmZmVyLCBwcm9wZXJseSBhbGlnbmVkLCBhbmQgZ3Jvd3MgdGhlIGJ1ZmZlciAoaWYgbmVjZXNzYXJ5KS5cclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgYGludDhgIHRvIGFkZCB0aGUgdGhlIGJ1ZmZlci5cclxuICAgICAqL1xyXG4gICAgYWRkSW50OCh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMucHJlcCgxLCAwKTtcclxuICAgICAgICB0aGlzLndyaXRlSW50OCh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhbiBgaW50MTZgIHRvIHRoZSBidWZmZXIsIHByb3Blcmx5IGFsaWduZWQsIGFuZCBncm93cyB0aGUgYnVmZmVyIChpZiBuZWNlc3NhcnkpLlxyXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSBgaW50MTZgIHRvIGFkZCB0aGUgdGhlIGJ1ZmZlci5cclxuICAgICAqL1xyXG4gICAgYWRkSW50MTYodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnByZXAoMiwgMCk7XHJcbiAgICAgICAgdGhpcy53cml0ZUludDE2KHZhbHVlKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQWRkIGFuIGBpbnQzMmAgdG8gdGhlIGJ1ZmZlciwgcHJvcGVybHkgYWxpZ25lZCwgYW5kIGdyb3dzIHRoZSBidWZmZXIgKGlmIG5lY2Vzc2FyeSkuXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGBpbnQzMmAgdG8gYWRkIHRoZSB0aGUgYnVmZmVyLlxyXG4gICAgICovXHJcbiAgICBhZGRJbnQzMih2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMucHJlcCg0LCAwKTtcclxuICAgICAgICB0aGlzLndyaXRlSW50MzIodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYW4gYGludDY0YCB0byB0aGUgYnVmZmVyLCBwcm9wZXJseSBhbGlnbmVkLCBhbmQgZ3Jvd3MgdGhlIGJ1ZmZlciAoaWYgbmVjZXNzYXJ5KS5cclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgYGludDY0YCB0byBhZGQgdGhlIHRoZSBidWZmZXIuXHJcbiAgICAgKi9cclxuICAgIGFkZEludDY0KHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5wcmVwKDgsIDApO1xyXG4gICAgICAgIHRoaXMud3JpdGVJbnQ2NCh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIGBmbG9hdDMyYCB0byB0aGUgYnVmZmVyLCBwcm9wZXJseSBhbGlnbmVkLCBhbmQgZ3Jvd3MgdGhlIGJ1ZmZlciAoaWYgbmVjZXNzYXJ5KS5cclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgYGZsb2F0MzJgIHRvIGFkZCB0aGUgdGhlIGJ1ZmZlci5cclxuICAgICAqL1xyXG4gICAgYWRkRmxvYXQzMih2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMucHJlcCg0LCAwKTtcclxuICAgICAgICB0aGlzLndyaXRlRmxvYXQzMih2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIGBmbG9hdDY0YCB0byB0aGUgYnVmZmVyLCBwcm9wZXJseSBhbGlnbmVkLCBhbmQgZ3Jvd3MgdGhlIGJ1ZmZlciAoaWYgbmVjZXNzYXJ5KS5cclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgYGZsb2F0NjRgIHRvIGFkZCB0aGUgdGhlIGJ1ZmZlci5cclxuICAgICAqL1xyXG4gICAgYWRkRmxvYXQ2NCh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMucHJlcCg4LCAwKTtcclxuICAgICAgICB0aGlzLndyaXRlRmxvYXQ2NCh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBhZGRGaWVsZEludDgodm9mZnNldCwgdmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xyXG4gICAgICAgIGlmICh0aGlzLmZvcmNlX2RlZmF1bHRzIHx8IHZhbHVlICE9IGRlZmF1bHRWYWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZEludDgodmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLnNsb3Qodm9mZnNldCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYWRkRmllbGRJbnQxNih2b2Zmc2V0LCB2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZm9yY2VfZGVmYXVsdHMgfHwgdmFsdWUgIT0gZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkSW50MTYodmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLnNsb3Qodm9mZnNldCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYWRkRmllbGRJbnQzMih2b2Zmc2V0LCB2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZm9yY2VfZGVmYXVsdHMgfHwgdmFsdWUgIT0gZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkSW50MzIodmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLnNsb3Qodm9mZnNldCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYWRkRmllbGRJbnQ2NCh2b2Zmc2V0LCB2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZm9yY2VfZGVmYXVsdHMgfHwgIXZhbHVlLmVxdWFscyhkZWZhdWx0VmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkSW50NjQodmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLnNsb3Qodm9mZnNldCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYWRkRmllbGRGbG9hdDMyKHZvZmZzZXQsIHZhbHVlLCBkZWZhdWx0VmFsdWUpIHtcclxuICAgICAgICBpZiAodGhpcy5mb3JjZV9kZWZhdWx0cyB8fCB2YWx1ZSAhPSBkZWZhdWx0VmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRGbG9hdDMyKHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5zbG90KHZvZmZzZXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFkZEZpZWxkRmxvYXQ2NCh2b2Zmc2V0LCB2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZm9yY2VfZGVmYXVsdHMgfHwgdmFsdWUgIT0gZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkRmxvYXQ2NCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2xvdCh2b2Zmc2V0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhZGRGaWVsZE9mZnNldCh2b2Zmc2V0LCB2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZm9yY2VfZGVmYXVsdHMgfHwgdmFsdWUgIT0gZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkT2Zmc2V0KHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5zbG90KHZvZmZzZXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU3RydWN0cyBhcmUgc3RvcmVkIGlubGluZSwgc28gbm90aGluZyBhZGRpdGlvbmFsIGlzIGJlaW5nIGFkZGVkLiBgZGAgaXMgYWx3YXlzIDAuXHJcbiAgICAgKi9cclxuICAgIGFkZEZpZWxkU3RydWN0KHZvZmZzZXQsIHZhbHVlLCBkZWZhdWx0VmFsdWUpIHtcclxuICAgICAgICBpZiAodmFsdWUgIT0gZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmVzdGVkKHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5zbG90KHZvZmZzZXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU3RydWN0dXJlcyBhcmUgYWx3YXlzIHN0b3JlZCBpbmxpbmUsIHRoZXkgbmVlZCB0byBiZSBjcmVhdGVkIHJpZ2h0XHJcbiAgICAgKiB3aGVyZSB0aGV5J3JlIHVzZWQuICBZb3UnbGwgZ2V0IHRoaXMgYXNzZXJ0aW9uIGZhaWx1cmUgaWYgeW91XHJcbiAgICAgKiBjcmVhdGVkIGl0IGVsc2V3aGVyZS5cclxuICAgICAqL1xyXG4gICAgbmVzdGVkKG9iaikge1xyXG4gICAgICAgIGlmIChvYmogIT0gdGhpcy5vZmZzZXQoKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZsYXRCdWZmZXJzOiBzdHJ1Y3QgbXVzdCBiZSBzZXJpYWxpemVkIGlubGluZS4nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFNob3VsZCBub3QgYmUgY3JlYXRpbmcgYW55IG90aGVyIG9iamVjdCwgc3RyaW5nIG9yIHZlY3RvclxyXG4gICAgICogd2hpbGUgYW4gb2JqZWN0IGlzIGJlaW5nIGNvbnN0cnVjdGVkXHJcbiAgICAgKi9cclxuICAgIG5vdE5lc3RlZCgpIHtcclxuICAgICAgICBpZiAodGhpcy5pc05lc3RlZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZsYXRCdWZmZXJzOiBvYmplY3Qgc2VyaWFsaXphdGlvbiBtdXN0IG5vdCBiZSBuZXN0ZWQuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGN1cnJlbnQgdnRhYmxlIGF0IGB2b2Zmc2V0YCB0byB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgYnVmZmVyLlxyXG4gICAgICovXHJcbiAgICBzbG90KHZvZmZzZXQpIHtcclxuICAgICAgICBpZiAodGhpcy52dGFibGUgIT09IG51bGwpXHJcbiAgICAgICAgICAgIHRoaXMudnRhYmxlW3ZvZmZzZXRdID0gdGhpcy5vZmZzZXQoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQHJldHVybnMgT2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci5cclxuICAgICAqL1xyXG4gICAgb2Zmc2V0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJiLmNhcGFjaXR5KCkgLSB0aGlzLnNwYWNlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBEb3VibGVzIHRoZSBzaXplIG9mIHRoZSBiYWNraW5nIEJ5dGVCdWZmZXIgYW5kIGNvcGllcyB0aGUgb2xkIGRhdGEgdG93YXJkc1xyXG4gICAgICogdGhlIGVuZCBvZiB0aGUgbmV3IGJ1ZmZlciAoc2luY2Ugd2UgYnVpbGQgdGhlIGJ1ZmZlciBiYWNrd2FyZHMpLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBiYiBUaGUgY3VycmVudCBidWZmZXIgd2l0aCB0aGUgZXhpc3RpbmcgZGF0YVxyXG4gICAgICogQHJldHVybnMgQSBuZXcgYnl0ZSBidWZmZXIgd2l0aCB0aGUgb2xkIGRhdGEgY29waWVkXHJcbiAgICAgKiB0byBpdC4gVGhlIGRhdGEgaXMgbG9jYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuXHJcbiAgICAgKlxyXG4gICAgICogdWludDhBcnJheS5zZXQoKSBmb3JtYWxseSB0YWtlcyB7QXJyYXk8bnVtYmVyPnxBcnJheUJ1ZmZlclZpZXd9LCBzbyB0byBwYXNzXHJcbiAgICAgKiBpdCBhIHVpbnQ4QXJyYXkgd2UgbmVlZCB0byBzdXBwcmVzcyB0aGUgdHlwZSBjaGVjazpcclxuICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlc31cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGdyb3dCeXRlQnVmZmVyKGJiKSB7XHJcbiAgICAgICAgY29uc3Qgb2xkX2J1Zl9zaXplID0gYmIuY2FwYWNpdHkoKTtcclxuICAgICAgICAvLyBFbnN1cmUgd2UgZG9uJ3QgZ3JvdyBiZXlvbmQgd2hhdCBmaXRzIGluIGFuIGludC5cclxuICAgICAgICBpZiAob2xkX2J1Zl9zaXplICYgMHhDMDAwMDAwMCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZsYXRCdWZmZXJzOiBjYW5ub3QgZ3JvdyBidWZmZXIgYmV5b25kIDIgZ2lnYWJ5dGVzLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXdfYnVmX3NpemUgPSBvbGRfYnVmX3NpemUgPDwgMTtcclxuICAgICAgICBjb25zdCBuYmIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKG5ld19idWZfc2l6ZSk7XHJcbiAgICAgICAgbmJiLnNldFBvc2l0aW9uKG5ld19idWZfc2l6ZSAtIG9sZF9idWZfc2l6ZSk7XHJcbiAgICAgICAgbmJiLmJ5dGVzKCkuc2V0KGJiLmJ5dGVzKCksIG5ld19idWZfc2l6ZSAtIG9sZF9idWZfc2l6ZSk7XHJcbiAgICAgICAgcmV0dXJuIG5iYjtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBvbiBvZmZzZXQsIHJlbGF0aXZlIHRvIHdoZXJlIGl0IHdpbGwgYmUgd3JpdHRlbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgdG8gYWRkLlxyXG4gICAgICovXHJcbiAgICBhZGRPZmZzZXQob2Zmc2V0KSB7XHJcbiAgICAgICAgdGhpcy5wcmVwKFNJWkVPRl9JTlQsIDApOyAvLyBFbnN1cmUgYWxpZ25tZW50IGlzIGFscmVhZHkgZG9uZS5cclxuICAgICAgICB0aGlzLndyaXRlSW50MzIodGhpcy5vZmZzZXQoKSAtIG9mZnNldCArIFNJWkVPRl9JTlQpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGFydCBlbmNvZGluZyBhIG5ldyBvYmplY3QgaW4gdGhlIGJ1ZmZlci4gIFVzZXJzIHdpbGwgbm90IHVzdWFsbHkgbmVlZCB0b1xyXG4gICAgICogY2FsbCB0aGlzIGRpcmVjdGx5LiBUaGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIgd2lsbCBnZW5lcmF0ZSBoZWxwZXIgbWV0aG9kc1xyXG4gICAgICogdGhhdCBjYWxsIHRoaXMgbWV0aG9kIGludGVybmFsbHkuXHJcbiAgICAgKi9cclxuICAgIHN0YXJ0T2JqZWN0KG51bWZpZWxkcykge1xyXG4gICAgICAgIHRoaXMubm90TmVzdGVkKCk7XHJcbiAgICAgICAgaWYgKHRoaXMudnRhYmxlID09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy52dGFibGUgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy52dGFibGVfaW5fdXNlID0gbnVtZmllbGRzO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtZmllbGRzOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy52dGFibGVbaV0gPSAwOyAvLyBUaGlzIHdpbGwgcHVzaCBhZGRpdGlvbmFsIGVsZW1lbnRzIGFzIG5lZWRlZFxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzTmVzdGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm9iamVjdF9zdGFydCA9IHRoaXMub2Zmc2V0KCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZpbmlzaCBvZmYgd3JpdGluZyB0aGUgb2JqZWN0IHRoYXQgaXMgdW5kZXIgY29uc3RydWN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFRoZSBvZmZzZXQgdG8gdGhlIG9iamVjdCBpbnNpZGUgYGRhdGFCdWZmZXJgXHJcbiAgICAgKi9cclxuICAgIGVuZE9iamVjdCgpIHtcclxuICAgICAgICBpZiAodGhpcy52dGFibGUgPT0gbnVsbCB8fCAhdGhpcy5pc05lc3RlZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZsYXRCdWZmZXJzOiBlbmRPYmplY3QgY2FsbGVkIHdpdGhvdXQgc3RhcnRPYmplY3QnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hZGRJbnQzMigwKTtcclxuICAgICAgICBjb25zdCB2dGFibGVsb2MgPSB0aGlzLm9mZnNldCgpO1xyXG4gICAgICAgIC8vIFRyaW0gdHJhaWxpbmcgemVyb2VzLlxyXG4gICAgICAgIGxldCBpID0gdGhpcy52dGFibGVfaW5fdXNlIC0gMTtcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHlcclxuICAgICAgICBmb3IgKDsgaSA+PSAwICYmIHRoaXMudnRhYmxlW2ldID09IDA7IGktLSkgeyB9XHJcbiAgICAgICAgY29uc3QgdHJpbW1lZF9zaXplID0gaSArIDE7XHJcbiAgICAgICAgLy8gV3JpdGUgb3V0IHRoZSBjdXJyZW50IHZ0YWJsZS5cclxuICAgICAgICBmb3IgKDsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgLy8gT2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgdGFibGUuXHJcbiAgICAgICAgICAgIHRoaXMuYWRkSW50MTYodGhpcy52dGFibGVbaV0gIT0gMCA/IHZ0YWJsZWxvYyAtIHRoaXMudnRhYmxlW2ldIDogMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN0YW5kYXJkX2ZpZWxkcyA9IDI7IC8vIFRoZSBmaWVsZHMgYmVsb3c6XHJcbiAgICAgICAgdGhpcy5hZGRJbnQxNih2dGFibGVsb2MgLSB0aGlzLm9iamVjdF9zdGFydCk7XHJcbiAgICAgICAgY29uc3QgbGVuID0gKHRyaW1tZWRfc2l6ZSArIHN0YW5kYXJkX2ZpZWxkcykgKiBTSVpFT0ZfU0hPUlQ7XHJcbiAgICAgICAgdGhpcy5hZGRJbnQxNihsZW4pO1xyXG4gICAgICAgIC8vIFNlYXJjaCBmb3IgYW4gZXhpc3RpbmcgdnRhYmxlIHRoYXQgbWF0Y2hlcyB0aGUgY3VycmVudCBvbmUuXHJcbiAgICAgICAgbGV0IGV4aXN0aW5nX3Z0YWJsZSA9IDA7XHJcbiAgICAgICAgY29uc3QgdnQxID0gdGhpcy5zcGFjZTtcclxuICAgICAgICBvdXRlcl9sb29wOiBmb3IgKGkgPSAwOyBpIDwgdGhpcy52dGFibGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZ0MiA9IHRoaXMuYmIuY2FwYWNpdHkoKSAtIHRoaXMudnRhYmxlc1tpXTtcclxuICAgICAgICAgICAgaWYgKGxlbiA9PSB0aGlzLmJiLnJlYWRJbnQxNih2dDIpKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gU0laRU9GX1NIT1JUOyBqIDwgbGVuOyBqICs9IFNJWkVPRl9TSE9SVCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJiLnJlYWRJbnQxNih2dDEgKyBqKSAhPSB0aGlzLmJiLnJlYWRJbnQxNih2dDIgKyBqKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcl9sb29wO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGV4aXN0aW5nX3Z0YWJsZSA9IHRoaXMudnRhYmxlc1tpXTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChleGlzdGluZ192dGFibGUpIHtcclxuICAgICAgICAgICAgLy8gRm91bmQgYSBtYXRjaDpcclxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBjdXJyZW50IHZ0YWJsZS5cclxuICAgICAgICAgICAgdGhpcy5zcGFjZSA9IHRoaXMuYmIuY2FwYWNpdHkoKSAtIHZ0YWJsZWxvYztcclxuICAgICAgICAgICAgLy8gUG9pbnQgdGFibGUgdG8gZXhpc3RpbmcgdnRhYmxlLlxyXG4gICAgICAgICAgICB0aGlzLmJiLndyaXRlSW50MzIodGhpcy5zcGFjZSwgZXhpc3RpbmdfdnRhYmxlIC0gdnRhYmxlbG9jKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIE5vIG1hdGNoOlxyXG4gICAgICAgICAgICAvLyBBZGQgdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IHZ0YWJsZSB0byB0aGUgbGlzdCBvZiB2dGFibGVzLlxyXG4gICAgICAgICAgICB0aGlzLnZ0YWJsZXMucHVzaCh0aGlzLm9mZnNldCgpKTtcclxuICAgICAgICAgICAgLy8gUG9pbnQgdGFibGUgdG8gY3VycmVudCB2dGFibGUuXHJcbiAgICAgICAgICAgIHRoaXMuYmIud3JpdGVJbnQzMih0aGlzLmJiLmNhcGFjaXR5KCkgLSB2dGFibGVsb2MsIHRoaXMub2Zmc2V0KCkgLSB2dGFibGVsb2MpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzTmVzdGVkID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHZ0YWJsZWxvYztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmluYWxpemUgYSBidWZmZXIsIHBvaXRpbmcgdG8gdGhlIGdpdmVuIGByb290X3RhYmxlYC5cclxuICAgICAqL1xyXG4gICAgZmluaXNoKHJvb3RfdGFibGUsIG9wdF9maWxlX2lkZW50aWZpZXIsIG9wdF9zaXplX3ByZWZpeCkge1xyXG4gICAgICAgIGNvbnN0IHNpemVfcHJlZml4ID0gb3B0X3NpemVfcHJlZml4ID8gU0laRV9QUkVGSVhfTEVOR1RIIDogMDtcclxuICAgICAgICBpZiAob3B0X2ZpbGVfaWRlbnRpZmllcikge1xyXG4gICAgICAgICAgICBjb25zdCBmaWxlX2lkZW50aWZpZXIgPSBvcHRfZmlsZV9pZGVudGlmaWVyO1xyXG4gICAgICAgICAgICB0aGlzLnByZXAodGhpcy5taW5hbGlnbiwgU0laRU9GX0lOVCArXHJcbiAgICAgICAgICAgICAgICBGSUxFX0lERU5USUZJRVJfTEVOR1RIICsgc2l6ZV9wcmVmaXgpO1xyXG4gICAgICAgICAgICBpZiAoZmlsZV9pZGVudGlmaWVyLmxlbmd0aCAhPSBGSUxFX0lERU5USUZJRVJfTEVOR1RIKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZsYXRCdWZmZXJzOiBmaWxlIGlkZW50aWZpZXIgbXVzdCBiZSBsZW5ndGggJyArXHJcbiAgICAgICAgICAgICAgICAgICAgRklMRV9JREVOVElGSUVSX0xFTkdUSCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IEZJTEVfSURFTlRJRklFUl9MRU5HVEggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZUludDgoZmlsZV9pZGVudGlmaWVyLmNoYXJDb2RlQXQoaSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucHJlcCh0aGlzLm1pbmFsaWduLCBTSVpFT0ZfSU5UICsgc2l6ZV9wcmVmaXgpO1xyXG4gICAgICAgIHRoaXMuYWRkT2Zmc2V0KHJvb3RfdGFibGUpO1xyXG4gICAgICAgIGlmIChzaXplX3ByZWZpeCkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZEludDMyKHRoaXMuYmIuY2FwYWNpdHkoKSAtIHRoaXMuc3BhY2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmJiLnNldFBvc2l0aW9uKHRoaXMuc3BhY2UpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5hbGl6ZSBhIHNpemUgcHJlZml4ZWQgYnVmZmVyLCBwb2ludGluZyB0byB0aGUgZ2l2ZW4gYHJvb3RfdGFibGVgLlxyXG4gICAgICovXHJcbiAgICBmaW5pc2hTaXplUHJlZml4ZWQocm9vdF90YWJsZSwgb3B0X2ZpbGVfaWRlbnRpZmllcikge1xyXG4gICAgICAgIHRoaXMuZmluaXNoKHJvb3RfdGFibGUsIG9wdF9maWxlX2lkZW50aWZpZXIsIHRydWUpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGNoZWNrcyBhIHJlcXVpcmVkIGZpZWxkIGhhcyBiZWVuIHNldCBpbiBhIGdpdmVuIHRhYmxlIHRoYXQgaGFzXHJcbiAgICAgKiBqdXN0IGJlZW4gY29uc3RydWN0ZWQuXHJcbiAgICAgKi9cclxuICAgIHJlcXVpcmVkRmllbGQodGFibGUsIGZpZWxkKSB7XHJcbiAgICAgICAgY29uc3QgdGFibGVfc3RhcnQgPSB0aGlzLmJiLmNhcGFjaXR5KCkgLSB0YWJsZTtcclxuICAgICAgICBjb25zdCB2dGFibGVfc3RhcnQgPSB0YWJsZV9zdGFydCAtIHRoaXMuYmIucmVhZEludDMyKHRhYmxlX3N0YXJ0KTtcclxuICAgICAgICBjb25zdCBvayA9IHRoaXMuYmIucmVhZEludDE2KHZ0YWJsZV9zdGFydCArIGZpZWxkKSAhPSAwO1xyXG4gICAgICAgIC8vIElmIHRoaXMgZmFpbHMsIHRoZSBjYWxsZXIgd2lsbCBzaG93IHdoYXQgZmllbGQgbmVlZHMgdG8gYmUgc2V0LlxyXG4gICAgICAgIGlmICghb2spIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbGF0QnVmZmVyczogZmllbGQgJyArIGZpZWxkICsgJyBtdXN0IGJlIHNldCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU3RhcnQgYSBuZXcgYXJyYXkvdmVjdG9yIG9mIG9iamVjdHMuICBVc2VycyB1c3VhbGx5IHdpbGwgbm90IGNhbGxcclxuICAgICAqIHRoaXMgZGlyZWN0bHkuIFRoZSBGbGF0QnVmZmVycyBjb21waWxlciB3aWxsIGNyZWF0ZSBhIHN0YXJ0L2VuZFxyXG4gICAgICogbWV0aG9kIGZvciB2ZWN0b3IgdHlwZXMgaW4gZ2VuZXJhdGVkIGNvZGUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGVsZW1fc2l6ZSBUaGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5XHJcbiAgICAgKiBAcGFyYW0gbnVtX2VsZW1zIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5XHJcbiAgICAgKiBAcGFyYW0gYWxpZ25tZW50IFRoZSBhbGlnbm1lbnQgb2YgdGhlIGFycmF5XHJcbiAgICAgKi9cclxuICAgIHN0YXJ0VmVjdG9yKGVsZW1fc2l6ZSwgbnVtX2VsZW1zLCBhbGlnbm1lbnQpIHtcclxuICAgICAgICB0aGlzLm5vdE5lc3RlZCgpO1xyXG4gICAgICAgIHRoaXMudmVjdG9yX251bV9lbGVtcyA9IG51bV9lbGVtcztcclxuICAgICAgICB0aGlzLnByZXAoU0laRU9GX0lOVCwgZWxlbV9zaXplICogbnVtX2VsZW1zKTtcclxuICAgICAgICB0aGlzLnByZXAoYWxpZ25tZW50LCBlbGVtX3NpemUgKiBudW1fZWxlbXMpOyAvLyBKdXN0IGluIGNhc2UgYWxpZ25tZW50ID4gaW50LlxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5pc2ggb2ZmIHRoZSBjcmVhdGlvbiBvZiBhbiBhcnJheSBhbmQgYWxsIGl0cyBlbGVtZW50cy4gVGhlIGFycmF5IG11c3QgYmVcclxuICAgICAqIGNyZWF0ZWQgd2l0aCBgc3RhcnRWZWN0b3JgLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFRoZSBvZmZzZXQgYXQgd2hpY2ggdGhlIG5ld2x5IGNyZWF0ZWQgYXJyYXlcclxuICAgICAqIHN0YXJ0cy5cclxuICAgICAqL1xyXG4gICAgZW5kVmVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMud3JpdGVJbnQzMih0aGlzLnZlY3Rvcl9udW1fZWxlbXMpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldCgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmNvZGUgdGhlIHN0cmluZyBgc2AgaW4gdGhlIGJ1ZmZlciB1c2luZyBVVEYtOC4gSWYgdGhlIHN0cmluZyBwYXNzZWQgaGFzXHJcbiAgICAgKiBhbHJlYWR5IGJlZW4gc2Vlbiwgd2UgcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIGFscmVhZHkgd3JpdHRlbiBzdHJpbmdcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gcyBUaGUgc3RyaW5nIHRvIGVuY29kZVxyXG4gICAgICogQHJldHVybiBUaGUgb2Zmc2V0IGluIHRoZSBidWZmZXIgd2hlcmUgdGhlIGVuY29kZWQgc3RyaW5nIHN0YXJ0c1xyXG4gICAgICovXHJcbiAgICBjcmVhdGVTaGFyZWRTdHJpbmcocykge1xyXG4gICAgICAgIGlmICghcykge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnN0cmluZ19tYXBzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RyaW5nX21hcHMgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnN0cmluZ19tYXBzLmhhcyhzKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmdfbWFwcy5nZXQocyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuY3JlYXRlU3RyaW5nKHMpO1xyXG4gICAgICAgIHRoaXMuc3RyaW5nX21hcHMuc2V0KHMsIG9mZnNldCk7XHJcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRW5jb2RlIHRoZSBzdHJpbmcgYHNgIGluIHRoZSBidWZmZXIgdXNpbmcgVVRGLTguIElmIGEgVWludDhBcnJheSBpcyBwYXNzZWRcclxuICAgICAqIGluc3RlYWQgb2YgYSBzdHJpbmcsIGl0IGlzIGFzc3VtZWQgdG8gY29udGFpbiB2YWxpZCBVVEYtOCBlbmNvZGVkIGRhdGEuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHMgVGhlIHN0cmluZyB0byBlbmNvZGVcclxuICAgICAqIEByZXR1cm4gVGhlIG9mZnNldCBpbiB0aGUgYnVmZmVyIHdoZXJlIHRoZSBlbmNvZGVkIHN0cmluZyBzdGFydHNcclxuICAgICAqL1xyXG4gICAgY3JlYXRlU3RyaW5nKHMpIHtcclxuICAgICAgICBpZiAoIXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB1dGY4O1xyXG4gICAgICAgIGlmIChzIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xyXG4gICAgICAgICAgICB1dGY4ID0gcztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHV0ZjggPSBbXTtcclxuICAgICAgICAgICAgbGV0IGkgPSAwO1xyXG4gICAgICAgICAgICB3aGlsZSAoaSA8IHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29kZVBvaW50O1xyXG4gICAgICAgICAgICAgICAgLy8gRGVjb2RlIFVURi0xNlxyXG4gICAgICAgICAgICAgICAgY29uc3QgYSA9IHMuY2hhckNvZGVBdChpKyspO1xyXG4gICAgICAgICAgICAgICAgaWYgKGEgPCAweEQ4MDAgfHwgYSA+PSAweERDMDApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2RlUG9pbnQgPSBhO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IHMuY2hhckNvZGVBdChpKyspO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvZGVQb2ludCA9IChhIDw8IDEwKSArIGIgKyAoMHgxMDAwMCAtICgweEQ4MDAgPDwgMTApIC0gMHhEQzAwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIEVuY29kZSBVVEYtOFxyXG4gICAgICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcclxuICAgICAgICAgICAgICAgICAgICB1dGY4LnB1c2goY29kZVBvaW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1dGY4LnB1c2goKChjb2RlUG9pbnQgPj4gNikgJiAweDFGKSB8IDB4QzApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0ZjgucHVzaCgoKGNvZGVQb2ludCA+PiAxMikgJiAweDBGKSB8IDB4RTApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRmOC5wdXNoKCgoY29kZVBvaW50ID4+IDE4KSAmIDB4MDcpIHwgMHhGMCwgKChjb2RlUG9pbnQgPj4gMTIpICYgMHgzRikgfCAweDgwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1dGY4LnB1c2goKChjb2RlUG9pbnQgPj4gNikgJiAweDNGKSB8IDB4ODApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB1dGY4LnB1c2goKGNvZGVQb2ludCAmIDB4M0YpIHwgMHg4MCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hZGRJbnQ4KDApO1xyXG4gICAgICAgIHRoaXMuc3RhcnRWZWN0b3IoMSwgdXRmOC5sZW5ndGgsIDEpO1xyXG4gICAgICAgIHRoaXMuYmIuc2V0UG9zaXRpb24odGhpcy5zcGFjZSAtPSB1dGY4Lmxlbmd0aCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG9mZnNldCA9IHRoaXMuc3BhY2UsIGJ5dGVzID0gdGhpcy5iYi5ieXRlcygpOyBpIDwgdXRmOC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBieXRlc1tvZmZzZXQrK10gPSB1dGY4W2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5lbmRWZWN0b3IoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gYXZvaWQgZ2VuZXJhdGVkIGNvZGUgZGVwZW5kaW5nIG9uIHRoaXMgZmlsZSBkaXJlY3RseS5cclxuICAgICAqL1xyXG4gICAgY3JlYXRlTG9uZyhsb3csIGhpZ2gpIHtcclxuICAgICAgICByZXR1cm4gTG9uZy5jcmVhdGUobG93LCBoaWdoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gcGFjayBhbiBvYmplY3RcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBvZmZzZXQgb2Ygb2JqXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZU9iamVjdE9mZnNldChvYmopIHtcclxuICAgICAgICBpZiAob2JqID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU3RyaW5nKG9iaik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gb2JqLnBhY2sodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGhlbHBlciBmdW5jdGlvbiB0byBwYWNrIGEgbGlzdCBvZiBvYmplY3RcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBsaXN0IG9mIG9mZnNldHMgb2YgZWFjaCBub24gbnVsbCBvYmplY3RcclxuICAgICAqL1xyXG4gICAgY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdChsaXN0KSB7XHJcbiAgICAgICAgY29uc3QgcmV0ID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IGxpc3RbaV07XHJcbiAgICAgICAgICAgIGlmICh2YWwgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldC5wdXNoKHRoaXMuY3JlYXRlT2JqZWN0T2Zmc2V0KHZhbCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbGF0QnVmZmVyczogQXJndW1lbnQgZm9yIGNyZWF0ZU9iamVjdE9mZnNldExpc3QgY2Fubm90IGNvbnRhaW4gbnVsbC4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgfVxyXG4gICAgY3JlYXRlU3RydWN0T2Zmc2V0TGlzdChsaXN0LCBzdGFydEZ1bmMpIHtcclxuICAgICAgICBzdGFydEZ1bmModGhpcywgbGlzdC5sZW5ndGgpO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlT2JqZWN0T2Zmc2V0TGlzdChsaXN0KTtcclxuICAgICAgICByZXR1cm4gdGhpcy5lbmRWZWN0b3IoKTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBGSUxFX0lERU5USUZJRVJfTEVOR1RILCBTSVpFT0ZfSU5UIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IExvbmcgfSBmcm9tIFwiLi9sb25nXCI7XHJcbmltcG9ydCB7IGludDMyLCBpc0xpdHRsZUVuZGlhbiwgZmxvYXQzMiwgZmxvYXQ2NCB9IGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCB7IEVuY29kaW5nIH0gZnJvbSBcIi4vZW5jb2RpbmdcIjtcclxuZXhwb3J0IGNsYXNzIEJ5dGVCdWZmZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYSBuZXcgQnl0ZUJ1ZmZlciB3aXRoIGEgZ2l2ZW4gYXJyYXkgb2YgYnl0ZXMgKGBVaW50OEFycmF5YClcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoYnl0ZXNfKSB7XHJcbiAgICAgICAgdGhpcy5ieXRlc18gPSBieXRlc187XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbl8gPSAwO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYW5kIGFsbG9jYXRlIGEgbmV3IEJ5dGVCdWZmZXIgd2l0aCBhIGdpdmVuIHNpemUuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBhbGxvY2F0ZShieXRlX3NpemUpIHtcclxuICAgICAgICByZXR1cm4gbmV3IEJ5dGVCdWZmZXIobmV3IFVpbnQ4QXJyYXkoYnl0ZV9zaXplKSk7XHJcbiAgICB9XHJcbiAgICBjbGVhcigpIHtcclxuICAgICAgICB0aGlzLnBvc2l0aW9uXyA9IDA7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgdW5kZXJseWluZyBgVWludDhBcnJheWAuXHJcbiAgICAgKi9cclxuICAgIGJ5dGVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJ5dGVzXztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBidWZmZXIncyBwb3NpdGlvbi5cclxuICAgICAqL1xyXG4gICAgcG9zaXRpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb25fO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGJ1ZmZlcidzIHBvc2l0aW9uLlxyXG4gICAgICovXHJcbiAgICBzZXRQb3NpdGlvbihwb3NpdGlvbikge1xyXG4gICAgICAgIHRoaXMucG9zaXRpb25fID0gcG9zaXRpb247XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgYnVmZmVyJ3MgY2FwYWNpdHkuXHJcbiAgICAgKi9cclxuICAgIGNhcGFjaXR5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJ5dGVzXy5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICByZWFkSW50OChvZmZzZXQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWFkVWludDgob2Zmc2V0KSA8PCAyNCA+PiAyNDtcclxuICAgIH1cclxuICAgIHJlYWRVaW50OChvZmZzZXQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ieXRlc19bb2Zmc2V0XTtcclxuICAgIH1cclxuICAgIHJlYWRJbnQxNihvZmZzZXQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWFkVWludDE2KG9mZnNldCkgPDwgMTYgPj4gMTY7XHJcbiAgICB9XHJcbiAgICByZWFkVWludDE2KG9mZnNldCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJ5dGVzX1tvZmZzZXRdIHwgdGhpcy5ieXRlc19bb2Zmc2V0ICsgMV0gPDwgODtcclxuICAgIH1cclxuICAgIHJlYWRJbnQzMihvZmZzZXQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ieXRlc19bb2Zmc2V0XSB8IHRoaXMuYnl0ZXNfW29mZnNldCArIDFdIDw8IDggfCB0aGlzLmJ5dGVzX1tvZmZzZXQgKyAyXSA8PCAxNiB8IHRoaXMuYnl0ZXNfW29mZnNldCArIDNdIDw8IDI0O1xyXG4gICAgfVxyXG4gICAgcmVhZFVpbnQzMihvZmZzZXQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWFkSW50MzIob2Zmc2V0KSA+Pj4gMDtcclxuICAgIH1cclxuICAgIHJlYWRJbnQ2NChvZmZzZXQpIHtcclxuICAgICAgICByZXR1cm4gbmV3IExvbmcodGhpcy5yZWFkSW50MzIob2Zmc2V0KSwgdGhpcy5yZWFkSW50MzIob2Zmc2V0ICsgNCkpO1xyXG4gICAgfVxyXG4gICAgcmVhZFVpbnQ2NChvZmZzZXQpIHtcclxuICAgICAgICByZXR1cm4gbmV3IExvbmcodGhpcy5yZWFkVWludDMyKG9mZnNldCksIHRoaXMucmVhZFVpbnQzMihvZmZzZXQgKyA0KSk7XHJcbiAgICB9XHJcbiAgICByZWFkRmxvYXQzMihvZmZzZXQpIHtcclxuICAgICAgICBpbnQzMlswXSA9IHRoaXMucmVhZEludDMyKG9mZnNldCk7XHJcbiAgICAgICAgcmV0dXJuIGZsb2F0MzJbMF07XHJcbiAgICB9XHJcbiAgICByZWFkRmxvYXQ2NChvZmZzZXQpIHtcclxuICAgICAgICBpbnQzMltpc0xpdHRsZUVuZGlhbiA/IDAgOiAxXSA9IHRoaXMucmVhZEludDMyKG9mZnNldCk7XHJcbiAgICAgICAgaW50MzJbaXNMaXR0bGVFbmRpYW4gPyAxIDogMF0gPSB0aGlzLnJlYWRJbnQzMihvZmZzZXQgKyA0KTtcclxuICAgICAgICByZXR1cm4gZmxvYXQ2NFswXTtcclxuICAgIH1cclxuICAgIHdyaXRlSW50OChvZmZzZXQsIHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5ieXRlc19bb2Zmc2V0XSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgd3JpdGVVaW50OChvZmZzZXQsIHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5ieXRlc19bb2Zmc2V0XSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgd3JpdGVJbnQxNihvZmZzZXQsIHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5ieXRlc19bb2Zmc2V0XSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuYnl0ZXNfW29mZnNldCArIDFdID0gdmFsdWUgPj4gODtcclxuICAgIH1cclxuICAgIHdyaXRlVWludDE2KG9mZnNldCwgdmFsdWUpIHtcclxuICAgICAgICB0aGlzLmJ5dGVzX1tvZmZzZXRdID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5ieXRlc19bb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+PiA4O1xyXG4gICAgfVxyXG4gICAgd3JpdGVJbnQzMihvZmZzZXQsIHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5ieXRlc19bb2Zmc2V0XSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuYnl0ZXNfW29mZnNldCArIDFdID0gdmFsdWUgPj4gODtcclxuICAgICAgICB0aGlzLmJ5dGVzX1tvZmZzZXQgKyAyXSA9IHZhbHVlID4+IDE2O1xyXG4gICAgICAgIHRoaXMuYnl0ZXNfW29mZnNldCArIDNdID0gdmFsdWUgPj4gMjQ7XHJcbiAgICB9XHJcbiAgICB3cml0ZVVpbnQzMihvZmZzZXQsIHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5ieXRlc19bb2Zmc2V0XSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuYnl0ZXNfW29mZnNldCArIDFdID0gdmFsdWUgPj4gODtcclxuICAgICAgICB0aGlzLmJ5dGVzX1tvZmZzZXQgKyAyXSA9IHZhbHVlID4+IDE2O1xyXG4gICAgICAgIHRoaXMuYnl0ZXNfW29mZnNldCArIDNdID0gdmFsdWUgPj4gMjQ7XHJcbiAgICB9XHJcbiAgICB3cml0ZUludDY0KG9mZnNldCwgdmFsdWUpIHtcclxuICAgICAgICB0aGlzLndyaXRlSW50MzIob2Zmc2V0LCB2YWx1ZS5sb3cpO1xyXG4gICAgICAgIHRoaXMud3JpdGVJbnQzMihvZmZzZXQgKyA0LCB2YWx1ZS5oaWdoKTtcclxuICAgIH1cclxuICAgIHdyaXRlVWludDY0KG9mZnNldCwgdmFsdWUpIHtcclxuICAgICAgICB0aGlzLndyaXRlVWludDMyKG9mZnNldCwgdmFsdWUubG93KTtcclxuICAgICAgICB0aGlzLndyaXRlVWludDMyKG9mZnNldCArIDQsIHZhbHVlLmhpZ2gpO1xyXG4gICAgfVxyXG4gICAgd3JpdGVGbG9hdDMyKG9mZnNldCwgdmFsdWUpIHtcclxuICAgICAgICBmbG9hdDMyWzBdID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy53cml0ZUludDMyKG9mZnNldCwgaW50MzJbMF0pO1xyXG4gICAgfVxyXG4gICAgd3JpdGVGbG9hdDY0KG9mZnNldCwgdmFsdWUpIHtcclxuICAgICAgICBmbG9hdDY0WzBdID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy53cml0ZUludDMyKG9mZnNldCwgaW50MzJbaXNMaXR0bGVFbmRpYW4gPyAwIDogMV0pO1xyXG4gICAgICAgIHRoaXMud3JpdGVJbnQzMihvZmZzZXQgKyA0LCBpbnQzMltpc0xpdHRsZUVuZGlhbiA/IDEgOiAwXSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgZmlsZSBpZGVudGlmaWVyLiAgIEJlaGF2aW9yIGlzIHVuZGVmaW5lZCBmb3IgRmxhdEJ1ZmZlcnMgd2hvc2VcclxuICAgICAqIHNjaGVtYSBkb2VzIG5vdCBpbmNsdWRlIGEgZmlsZV9pZGVudGlmaWVyIChsaWtlbHkgcG9pbnRzIGF0IHBhZGRpbmcgb3IgdGhlXHJcbiAgICAgKiBzdGFydCBvZiBhIHRoZSByb290IHZ0YWJsZSkuXHJcbiAgICAgKi9cclxuICAgIGdldEJ1ZmZlcklkZW50aWZpZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYnl0ZXNfLmxlbmd0aCA8IHRoaXMucG9zaXRpb25fICsgU0laRU9GX0lOVCArXHJcbiAgICAgICAgICAgIEZJTEVfSURFTlRJRklFUl9MRU5HVEgpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbGF0QnVmZmVyczogQnl0ZUJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbiBhbiBpZGVudGlmaWVyLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IEZJTEVfSURFTlRJRklFUl9MRU5HVEg7IGkrKykge1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLnJlYWRJbnQ4KHRoaXMucG9zaXRpb25fICsgU0laRU9GX0lOVCArIGkpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTG9vayB1cCBhIGZpZWxkIGluIHRoZSB2dGFibGUsIHJldHVybiBhbiBvZmZzZXQgaW50byB0aGUgb2JqZWN0LCBvciAwIGlmIHRoZVxyXG4gICAgICogZmllbGQgaXMgbm90IHByZXNlbnQuXHJcbiAgICAgKi9cclxuICAgIF9fb2Zmc2V0KGJiX3BvcywgdnRhYmxlX29mZnNldCkge1xyXG4gICAgICAgIGNvbnN0IHZ0YWJsZSA9IGJiX3BvcyAtIHRoaXMucmVhZEludDMyKGJiX3Bvcyk7XHJcbiAgICAgICAgcmV0dXJuIHZ0YWJsZV9vZmZzZXQgPCB0aGlzLnJlYWRJbnQxNih2dGFibGUpID8gdGhpcy5yZWFkSW50MTYodnRhYmxlICsgdnRhYmxlX29mZnNldCkgOiAwO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplIGFueSBUYWJsZS1kZXJpdmVkIHR5cGUgdG8gcG9pbnQgdG8gdGhlIHVuaW9uIGF0IHRoZSBnaXZlbiBvZmZzZXQuXHJcbiAgICAgKi9cclxuICAgIF9fdW5pb24odCwgb2Zmc2V0KSB7XHJcbiAgICAgICAgdC5iYl9wb3MgPSBvZmZzZXQgKyB0aGlzLnJlYWRJbnQzMihvZmZzZXQpO1xyXG4gICAgICAgIHQuYmIgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYSBKYXZhU2NyaXB0IHN0cmluZyBmcm9tIFVURi04IGRhdGEgc3RvcmVkIGluc2lkZSB0aGUgRmxhdEJ1ZmZlci5cclxuICAgICAqIFRoaXMgYWxsb2NhdGVzIGEgbmV3IHN0cmluZyBhbmQgY29udmVydHMgdG8gd2lkZSBjaGFycyB1cG9uIGVhY2ggYWNjZXNzLlxyXG4gICAgICpcclxuICAgICAqIFRvIGF2b2lkIHRoZSBjb252ZXJzaW9uIHRvIFVURi0xNiwgcGFzcyBFbmNvZGluZy5VVEY4X0JZVEVTIGFzXHJcbiAgICAgKiB0aGUgXCJvcHRpb25hbEVuY29kaW5nXCIgYXJndW1lbnQuIFRoaXMgaXMgdXNlZnVsIGZvciBhdm9pZGluZyBjb252ZXJzaW9uIHRvXHJcbiAgICAgKiBhbmQgZnJvbSBVVEYtMTYgd2hlbiB0aGUgZGF0YSB3aWxsIGp1c3QgYmUgcGFja2FnZWQgYmFjayB1cCBpbiBhbm90aGVyXHJcbiAgICAgKiBGbGF0QnVmZmVyIGxhdGVyIG9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBvZmZzZXRcclxuICAgICAqIEBwYXJhbSBvcHRfZW5jb2RpbmcgRGVmYXVsdHMgdG8gVVRGMTZfU1RSSU5HXHJcbiAgICAgKi9cclxuICAgIF9fc3RyaW5nKG9mZnNldCwgb3B0X2VuY29kaW5nKSB7XHJcbiAgICAgICAgb2Zmc2V0ICs9IHRoaXMucmVhZEludDMyKG9mZnNldCk7XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5yZWFkSW50MzIob2Zmc2V0KTtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XHJcbiAgICAgICAgbGV0IGkgPSAwO1xyXG4gICAgICAgIG9mZnNldCArPSBTSVpFT0ZfSU5UO1xyXG4gICAgICAgIGlmIChvcHRfZW5jb2RpbmcgPT09IEVuY29kaW5nLlVURjhfQllURVMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnl0ZXNfLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgd2hpbGUgKGkgPCBsZW5ndGgpIHtcclxuICAgICAgICAgICAgbGV0IGNvZGVQb2ludDtcclxuICAgICAgICAgICAgLy8gRGVjb2RlIFVURi04XHJcbiAgICAgICAgICAgIGNvbnN0IGEgPSB0aGlzLnJlYWRVaW50OChvZmZzZXQgKyBpKyspO1xyXG4gICAgICAgICAgICBpZiAoYSA8IDB4QzApIHtcclxuICAgICAgICAgICAgICAgIGNvZGVQb2ludCA9IGE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBiID0gdGhpcy5yZWFkVWludDgob2Zmc2V0ICsgaSsrKTtcclxuICAgICAgICAgICAgICAgIGlmIChhIDwgMHhFMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvZGVQb2ludCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICgoYSAmIDB4MUYpIDw8IDYpIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiICYgMHgzRik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjID0gdGhpcy5yZWFkVWludDgob2Zmc2V0ICsgaSsrKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYSA8IDB4RjApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZVBvaW50ID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYSAmIDB4MEYpIDw8IDEyKSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiICYgMHgzRikgPDwgNikgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjICYgMHgzRik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkID0gdGhpcy5yZWFkVWludDgob2Zmc2V0ICsgaSsrKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZVBvaW50ID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYSAmIDB4MDcpIDw8IDE4KSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiICYgMHgzRikgPDwgMTIpIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGMgJiAweDNGKSA8PCA2KSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGQgJiAweDNGKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gRW5jb2RlIFVURi0xNlxyXG4gICAgICAgICAgICBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZVBvaW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGNvZGVQb2ludCA+PiAxMCkgKyAweEQ4MDAsIChjb2RlUG9pbnQgJiAoKDEgPDwgMTApIC0gMSkpICsgMHhEQzAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGUgdW5pb25zIHRoYXQgY2FuIGNvbnRhaW4gc3RyaW5nIGFzIGl0cyBtZW1iZXIsIGlmIGEgVGFibGUtZGVyaXZlZCB0eXBlIHRoZW4gaW5pdGlhbGl6ZSBpdCxcclxuICAgICAqIGlmIGEgc3RyaW5nIHRoZW4gcmV0dXJuIGEgbmV3IG9uZVxyXG4gICAgICpcclxuICAgICAqIFdBUk5JTkc6IHN0cmluZ3MgYXJlIGltbXV0YWJsZSBpbiBKUyBzbyB3ZSBjYW4ndCBjaGFuZ2UgdGhlIHN0cmluZyB0aGF0IHRoZSB1c2VyIGdhdmUgdXMsIHRoaXNcclxuICAgICAqIG1ha2VzIHRoZSBiZWhhdmlvdXIgb2YgX191bmlvbl93aXRoX3N0cmluZyBkaWZmZXJlbnQgY29tcGFyZWQgdG8gX191bmlvblxyXG4gICAgICovXHJcbiAgICBfX3VuaW9uX3dpdGhfc3RyaW5nKG8sIG9mZnNldCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgbyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX19zdHJpbmcob2Zmc2V0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX191bmlvbihvLCBvZmZzZXQpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSB0aGUgcmVsYXRpdmUgb2Zmc2V0IHN0b3JlZCBhdCBcIm9mZnNldFwiXHJcbiAgICAgKi9cclxuICAgIF9faW5kaXJlY3Qob2Zmc2V0KSB7XHJcbiAgICAgICAgcmV0dXJuIG9mZnNldCArIHRoaXMucmVhZEludDMyKG9mZnNldCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgc3RhcnQgb2YgZGF0YSBvZiBhIHZlY3RvciB3aG9zZSBvZmZzZXQgaXMgc3RvcmVkIGF0IFwib2Zmc2V0XCIgaW4gdGhpcyBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIF9fdmVjdG9yKG9mZnNldCkge1xyXG4gICAgICAgIHJldHVybiBvZmZzZXQgKyB0aGlzLnJlYWRJbnQzMihvZmZzZXQpICsgU0laRU9GX0lOVDsgLy8gZGF0YSBzdGFydHMgYWZ0ZXIgdGhlIGxlbmd0aFxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGxlbmd0aCBvZiBhIHZlY3RvciB3aG9zZSBvZmZzZXQgaXMgc3RvcmVkIGF0IFwib2Zmc2V0XCIgaW4gdGhpcyBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIF9fdmVjdG9yX2xlbihvZmZzZXQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWFkSW50MzIob2Zmc2V0ICsgdGhpcy5yZWFkSW50MzIob2Zmc2V0KSk7XHJcbiAgICB9XHJcbiAgICBfX2hhc19pZGVudGlmaWVyKGlkZW50KSB7XHJcbiAgICAgICAgaWYgKGlkZW50Lmxlbmd0aCAhPSBGSUxFX0lERU5USUZJRVJfTEVOR1RIKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmxhdEJ1ZmZlcnM6IGZpbGUgaWRlbnRpZmllciBtdXN0IGJlIGxlbmd0aCAnICtcclxuICAgICAgICAgICAgICAgIEZJTEVfSURFTlRJRklFUl9MRU5HVEgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IEZJTEVfSURFTlRJRklFUl9MRU5HVEg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoaWRlbnQuY2hhckNvZGVBdChpKSAhPSB0aGlzLnJlYWRJbnQ4KHRoaXMucG9zaXRpb24oKSArIFNJWkVPRl9JTlQgKyBpKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGhlbHBlciBmdW5jdGlvbiB0byBhdm9pZCBnZW5lcmF0ZWQgY29kZSBkZXBlbmRpbmcgb24gdGhpcyBmaWxlIGRpcmVjdGx5LlxyXG4gICAgICovXHJcbiAgICBjcmVhdGVMb25nKGxvdywgaGlnaCkge1xyXG4gICAgICAgIHJldHVybiBMb25nLmNyZWF0ZShsb3csIGhpZ2gpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGhlbHBlciBmdW5jdGlvbiBmb3IgZ2VuZXJhdGluZyBsaXN0IGZvciBvYmogYXBpXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVNjYWxhckxpc3QobGlzdEFjY2Vzc29yLCBsaXN0TGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgcmV0ID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyArK2kpIHtcclxuICAgICAgICAgICAgaWYgKGxpc3RBY2Nlc3NvcihpKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0LnB1c2gobGlzdEFjY2Vzc29yKGkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGhlbHBlciBmdW5jdGlvbiBmb3IgZ2VuZXJhdGluZyBsaXN0IGZvciBvYmogYXBpXHJcbiAgICAgKiBAcGFyYW0gbGlzdEFjY2Vzc29yIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhbiBpbmRleCBhbmQgcmV0dXJuIGRhdGEgYXQgdGhhdCBpbmRleFxyXG4gICAgICogQHBhcmFtIGxpc3RMZW5ndGggbGlzdExlbmd0aFxyXG4gICAgICogQHBhcmFtIHJlcyByZXN1bHQgbGlzdFxyXG4gICAgICovXHJcbiAgICBjcmVhdGVPYmpMaXN0KGxpc3RBY2Nlc3NvciwgbGlzdExlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IHJldCA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IGxpc3RBY2Nlc3NvcihpKTtcclxuICAgICAgICAgICAgaWYgKHZhbCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0LnB1c2godmFsLnVucGFjaygpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgfVxyXG59XHJcbiIsImV4cG9ydCBjb25zdCBTSVpFT0ZfU0hPUlQgPSAyO1xyXG5leHBvcnQgY29uc3QgU0laRU9GX0lOVCA9IDQ7XHJcbmV4cG9ydCBjb25zdCBGSUxFX0lERU5USUZJRVJfTEVOR1RIID0gNDtcclxuZXhwb3J0IGNvbnN0IFNJWkVfUFJFRklYX0xFTkdUSCA9IDQ7XHJcbiIsImV4cG9ydCB2YXIgRW5jb2Rpbmc7XHJcbihmdW5jdGlvbiAoRW5jb2RpbmcpIHtcclxuICAgIEVuY29kaW5nW0VuY29kaW5nW1wiVVRGOF9CWVRFU1wiXSA9IDFdID0gXCJVVEY4X0JZVEVTXCI7XHJcbiAgICBFbmNvZGluZ1tFbmNvZGluZ1tcIlVURjE2X1NUUklOR1wiXSA9IDJdID0gXCJVVEYxNl9TVFJJTkdcIjtcclxufSkoRW5jb2RpbmcgfHwgKEVuY29kaW5nID0ge30pKTtcclxuIiwiZXhwb3J0IHsgU0laRU9GX1NIT1JUIH0gZnJvbSAnLi9jb25zdGFudHMnO1xyXG5leHBvcnQgeyBTSVpFT0ZfSU5UIH0gZnJvbSAnLi9jb25zdGFudHMnO1xyXG5leHBvcnQgeyBGSUxFX0lERU5USUZJRVJfTEVOR1RIIH0gZnJvbSAnLi9jb25zdGFudHMnO1xyXG5leHBvcnQgeyBTSVpFX1BSRUZJWF9MRU5HVEggfSBmcm9tICcuL2NvbnN0YW50cyc7XHJcbmV4cG9ydCB7IGludDMyLCBmbG9hdDMyLCBmbG9hdDY0LCBpc0xpdHRsZUVuZGlhbiB9IGZyb20gJy4vdXRpbHMnO1xyXG5leHBvcnQgeyBMb25nLCBjcmVhdGVMb25nIH0gZnJvbSAnLi9sb25nJztcclxuZXhwb3J0IHsgRW5jb2RpbmcgfSBmcm9tICcuL2VuY29kaW5nJztcclxuZXhwb3J0IHsgQnVpbGRlciB9IGZyb20gJy4vYnVpbGRlcic7XHJcbmV4cG9ydCB7IEJ5dGVCdWZmZXIgfSBmcm9tICcuL2J5dGUtYnVmZmVyJztcclxuIiwiZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxvbmcobG93LCBoaWdoKSB7XHJcbiAgICByZXR1cm4gTG9uZy5jcmVhdGUobG93LCBoaWdoKTtcclxufVxyXG5leHBvcnQgY2xhc3MgTG9uZyB7XHJcbiAgICBjb25zdHJ1Y3Rvcihsb3csIGhpZ2gpIHtcclxuICAgICAgICB0aGlzLmxvdyA9IGxvdyB8IDA7XHJcbiAgICAgICAgdGhpcy5oaWdoID0gaGlnaCB8IDA7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgY3JlYXRlKGxvdywgaGlnaCkge1xyXG4gICAgICAgIC8vIFNwZWNpYWwtY2FzZSB6ZXJvIHRvIGF2b2lkIEdDIG92ZXJoZWFkIGZvciBkZWZhdWx0IHZhbHVlc1xyXG4gICAgICAgIHJldHVybiBsb3cgPT0gMCAmJiBoaWdoID09IDAgPyBMb25nLlpFUk8gOiBuZXcgTG9uZyhsb3csIGhpZ2gpO1xyXG4gICAgfVxyXG4gICAgdG9GbG9hdDY0KCkge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5sb3cgPj4+IDApICsgdGhpcy5oaWdoICogMHgxMDAwMDAwMDA7XHJcbiAgICB9XHJcbiAgICBlcXVhbHMob3RoZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sb3cgPT0gb3RoZXIubG93ICYmIHRoaXMuaGlnaCA9PSBvdGhlci5oaWdoO1xyXG4gICAgfVxyXG59XHJcbkxvbmcuWkVSTyA9IG5ldyBMb25nKDAsIDApO1xyXG4iLCJleHBvcnQgY29uc3QgaW50MzIgPSBuZXcgSW50MzJBcnJheSgyKTtcclxuZXhwb3J0IGNvbnN0IGZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KGludDMyLmJ1ZmZlcik7XHJcbmV4cG9ydCBjb25zdCBmbG9hdDY0ID0gbmV3IEZsb2F0NjRBcnJheShpbnQzMi5idWZmZXIpO1xyXG5leHBvcnQgY29uc3QgaXNMaXR0bGVFbmRpYW4gPSBuZXcgVWludDE2QXJyYXkobmV3IFVpbnQ4QXJyYXkoWzEsIDBdKS5idWZmZXIpWzBdID09PSAxO1xyXG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXNEZWNvcmF0ZShjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xyXG4gICAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XHJcbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xyXG4gICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XHJcbiAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcclxuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XHJcbiAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIHZhciBjb250ZXh0ID0ge307XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XHJcbiAgICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcclxuICAgICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMucHVzaChfKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XHJcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy5wdXNoKF8pO1xyXG4gICAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xyXG4gICAgZG9uZSA9IHRydWU7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnModGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xyXG4gICAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcclxuICAgIH1cclxuICAgIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcHJvcEtleSh4KSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCIgPyB4IDogXCJcIi5jb25jYXQoeCk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZiwgbmFtZSwgcHJlZml4KSB7XHJcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XHJcbiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcclxuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XHJcbiAgICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcclxuICAgIH1cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IGZhbHNlIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xyXG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEluKHN0YXRlLCByZWNlaXZlcikge1xyXG4gICAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XHJcbiAgICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xyXG59XHJcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgVmVjdG9yIH0gZnJvbSAnLi92ZWN0b3IubWpzJztcbmltcG9ydCB7IG1ha2VEYXRhIH0gZnJvbSAnLi9kYXRhLm1qcyc7XG5pbXBvcnQgeyBNYXBSb3csIGtLZXlzIH0gZnJvbSAnLi9yb3cvbWFwLm1qcyc7XG5pbXBvcnQgeyBzdHJpZGVGb3JUeXBlLCB9IGZyb20gJy4vdHlwZS5tanMnO1xuaW1wb3J0IHsgY3JlYXRlSXNWYWxpZEZ1bmN0aW9uIH0gZnJvbSAnLi9idWlsZGVyL3ZhbGlkLm1qcyc7XG5pbXBvcnQgeyBCaXRtYXBCdWZmZXJCdWlsZGVyLCBEYXRhQnVmZmVyQnVpbGRlciwgT2Zmc2V0c0J1ZmZlckJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIvYnVmZmVyLm1qcyc7XG4vKipcbiAqIEFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHR5cGVzIHRoYXQgY29uc3RydWN0IEFycm93IFZlY3RvcnMgZnJvbSBhcmJpdHJhcnkgSmF2YVNjcmlwdCB2YWx1ZXMuXG4gKlxuICogQSBgQnVpbGRlcmAgaXMgcmVzcG9uc2libGUgZm9yIHdyaXRpbmcgYXJiaXRyYXJ5IEphdmFTY3JpcHQgdmFsdWVzXG4gKiB0byBBcnJheUJ1ZmZlcnMgYW5kL29yIGNoaWxkIEJ1aWxkZXJzIGFjY29yZGluZyB0byB0aGUgQXJyb3cgc3BlY2lmaWNhdGlvblxuICogZm9yIGVhY2ggRGF0YVR5cGUsIGNyZWF0aW5nIG9yIHJlc2l6aW5nIHRoZSB1bmRlcmx5aW5nIEFycmF5QnVmZmVycyBhcyBuZWNlc3NhcnkuXG4gKlxuICogVGhlIGBCdWlsZGVyYCBmb3IgZWFjaCBBcnJvdyBgRGF0YVR5cGVgIGhhbmRsZXMgY29udmVydGluZyBhbmQgYXBwZW5kaW5nXG4gKiB2YWx1ZXMgZm9yIGEgZ2l2ZW4gYERhdGFUeXBlYC4gVGhlIGhpZ2gtbGV2ZWwge0BsaW5rIG1ha2VCdWlsZGVyIGBtYWtlQnVpbGRlcigpYH0gY29udmVuaWVuY2VcbiAqIG1ldGhvZCBjcmVhdGVzIHRoZSBzcGVjaWZpYyBgQnVpbGRlcmAgc3ViY2xhc3MgZm9yIHRoZSBzdXBwbGllZCBgRGF0YVR5cGVgLlxuICpcbiAqIE9uY2UgY3JlYXRlZCwgYEJ1aWxkZXJgIGluc3RhbmNlcyBzdXBwb3J0IGJvdGggYXBwZW5kaW5nIHZhbHVlcyB0byB0aGUgZW5kXG4gKiBvZiB0aGUgYEJ1aWxkZXJgLCBhbmQgcmFuZG9tLWFjY2VzcyB3cml0ZXMgdG8gc3BlY2lmaWMgaW5kaWNlc1xuICogKGBCdWlsZGVyLnByb3RvdHlwZS5hcHBlbmQodmFsdWUpYCBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCBmb3JcbiAqIGBidWlsZGVyLnNldChidWlsZGVyLmxlbmd0aCwgdmFsdWUpYCkuIEFwcGVuZGluZyBvciBzZXR0aW5nIHZhbHVlcyBiZXlvbmQgdGhlXG4gKiBCdWlsZGVyJ3MgY3VycmVudCBsZW5ndGggbWF5IGNhdXNlIHRoZSBidWlsZGVyIHRvIGdyb3cgaXRzIHVuZGVybHlpbmcgYnVmZmVyc1xuICogb3IgY2hpbGQgQnVpbGRlcnMgKGlmIGFwcGxpY2FibGUpIHRvIGFjY29tbW9kYXRlIHRoZSBuZXcgdmFsdWVzLlxuICpcbiAqIEFmdGVyIGVub3VnaCB2YWx1ZXMgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gYSBgQnVpbGRlcmAsIGBCdWlsZGVyLnByb3RvdHlwZS5mbHVzaCgpYFxuICogd2lsbCBjb21taXQgdGhlIHZhbHVlcyB0byB0aGUgdW5kZXJseWluZyBBcnJheUJ1ZmZlcnMgKG9yIGNoaWxkIEJ1aWxkZXJzKS4gVGhlXG4gKiBpbnRlcm5hbCBCdWlsZGVyIHN0YXRlIHdpbGwgYmUgcmVzZXQsIGFuZCBhbiBpbnN0YW5jZSBvZiBgRGF0YTxUPmAgaXMgcmV0dXJuZWQuXG4gKiBBbHRlcm5hdGl2ZWx5LCBgQnVpbGRlci5wcm90b3R5cGUudG9WZWN0b3IoKWAgd2lsbCBmbHVzaCB0aGUgYEJ1aWxkZXJgIGFuZCByZXR1cm5cbiAqIGFuIGluc3RhbmNlIG9mIGBWZWN0b3I8VD5gIGluc3RlYWQuXG4gKlxuICogV2hlbiB0aGVyZSBhcmUgbm8gbW9yZSB2YWx1ZXMgdG8gd3JpdGUsIHVzZSBgQnVpbGRlci5wcm90b3R5cGUuZmluaXNoKClgIHRvXG4gKiBmaW5hbGl6ZSB0aGUgYEJ1aWxkZXJgLiBUaGlzIGRvZXMgbm90IHJlc2V0IHRoZSBpbnRlcm5hbCBzdGF0ZSwgc28gaXQgaXNcbiAqIG5lY2Vzc2FyeSB0byBjYWxsIGBCdWlsZGVyLnByb3RvdHlwZS5mbHVzaCgpYCBvciBgdG9WZWN0b3IoKWAgb25lIGxhc3QgdGltZVxuICogaWYgdGhlcmUgYXJlIHN0aWxsIHZhbHVlcyBxdWV1ZWQgdG8gYmUgZmx1c2hlZC5cbiAqXG4gKiBOb3RlOiBjYWxsaW5nIGBCdWlsZGVyLnByb3RvdHlwZS5maW5pc2goKWAgaXMgcmVxdWlyZWQgd2hlbiB1c2luZyBhIGBEaWN0aW9uYXJ5QnVpbGRlcmAsXG4gKiBiZWNhdXNlIHRoaXMgaXMgd2hlbiBpdCBmbHVzaGVzIHRoZSB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4gZW5xdWV1ZWQgaW4gaXRzIGludGVybmFsXG4gKiBkaWN0aW9uYXJ5J3MgYEJ1aWxkZXJgLCBhbmQgY3JlYXRlcyB0aGUgYGRpY3Rpb25hcnlWZWN0b3JgIGZvciB0aGUgYERpY3Rpb25hcnlgIGBEYXRhVHlwZWAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBCdWlsZGVyLCBVdGY4IH0gZnJvbSAnYXBhY2hlLWFycm93JztcbiAqXG4gKiBjb25zdCB1dGY4QnVpbGRlciA9IG1ha2VCdWlsZGVyKHtcbiAqICAgICB0eXBlOiBuZXcgVXRmOCgpLFxuICogICAgIG51bGxWYWx1ZXM6IFtudWxsLCAnbi9hJ11cbiAqIH0pO1xuICpcbiAqIHV0ZjhCdWlsZGVyXG4gKiAgICAgLmFwcGVuZCgnaGVsbG8nKVxuICogICAgIC5hcHBlbmQoJ24vYScpXG4gKiAgICAgLmFwcGVuZCgnd29ybGQnKVxuICogICAgIC5hcHBlbmQobnVsbCk7XG4gKlxuICogY29uc3QgdXRmOFZlY3RvciA9IHV0ZjhCdWlsZGVyLmZpbmlzaCgpLnRvVmVjdG9yKCk7XG4gKlxuICogY29uc29sZS5sb2codXRmOFZlY3Rvci50b0pTT04oKSk7XG4gKiAvLyA+IFtcImhlbGxvXCIsIG51bGwsIFwid29ybGRcIiwgbnVsbF1cbiAqIGBgYFxuICpcbiAqIEB0eXBlcGFyYW0gVCBUaGUgYERhdGFUeXBlYCBvZiB0aGlzIGBCdWlsZGVyYC5cbiAqIEB0eXBlcGFyYW0gVE51bGwgVGhlIHR5cGUocykgb2YgdmFsdWVzIHdoaWNoIHdpbGwgYmUgY29uc2lkZXJlZCBudWxsLXZhbHVlIHNlbnRpbmVscy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJ1aWxkZXIge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIGJ1aWxkZXIgd2l0aCB0aGUgZ2l2ZW4gQXJyb3cgRGF0YVR5cGUgd2l0aCBvcHRpb25hbCBudWxsIHZhbHVlcyxcbiAgICAgKiB3aGljaCB3aWxsIGJlIGludGVycHJldGVkIGFzIFwibnVsbFwiIHdoZW4gc2V0IG9yIGFwcGVuZGVkIHRvIHRoZSBgQnVpbGRlcmAuXG4gICAgICogQHBhcmFtIHt7IHR5cGU6IFQsIG51bGxWYWx1ZXM/OiBhbnlbXSB9fSBvcHRpb25zIEEgYEJ1aWxkZXJPcHRpb25zYCBvYmplY3QgdXNlZCB0byBjcmVhdGUgdGhpcyBgQnVpbGRlcmAuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoeyAndHlwZSc6IHR5cGUsICdudWxsVmFsdWVzJzogbnVsbHMgfSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIG51bWJlciBvZiB2YWx1ZXMgd3JpdHRlbiB0byB0aGUgYEJ1aWxkZXJgIHRoYXQgaGF2ZW4ndCBiZWVuIGZsdXNoZWQgeWV0LlxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYEJ1aWxkZXIucHJvdG90eXBlLmZpbmlzaCgpYCBoYXMgYmVlbiBjYWxsZWQgb24gdGhpcyBgQnVpbGRlcmAuXG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgICAgIHRoaXMubnVsbFZhbHVlcyA9IG51bGxzO1xuICAgICAgICB0aGlzLnN0cmlkZSA9IHN0cmlkZUZvclR5cGUodHlwZSk7XG4gICAgICAgIHRoaXMuX251bGxzID0gbmV3IEJpdG1hcEJ1ZmZlckJ1aWxkZXIoKTtcbiAgICAgICAgaWYgKG51bGxzICYmIG51bGxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2lzVmFsaWQgPSBjcmVhdGVJc1ZhbGlkRnVuY3Rpb24obnVsbHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBzdGF0aWMgdGhyb3VnaE5vZGUob3B0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwidGhyb3VnaE5vZGVcIiBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnRgKTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHN0YXRpYyB0aHJvdWdoRE9NKG9wdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcInRocm91Z2hET01cIiBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnRgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmx1c2ggdGhlIGBCdWlsZGVyYCBhbmQgcmV0dXJuIGEgYFZlY3RvcjxUPmAuXG4gICAgICogQHJldHVybnMge1ZlY3RvcjxUPn0gQSBgVmVjdG9yPFQ+YCBvZiB0aGUgZmx1c2hlZCB2YWx1ZXMuXG4gICAgICovXG4gICAgdG9WZWN0b3IoKSB7IHJldHVybiBuZXcgVmVjdG9yKFt0aGlzLmZsdXNoKCldKTsgfVxuICAgIGdldCBBcnJheVR5cGUoKSB7IHJldHVybiB0aGlzLnR5cGUuQXJyYXlUeXBlOyB9XG4gICAgZ2V0IG51bGxDb3VudCgpIHsgcmV0dXJuIHRoaXMuX251bGxzLm51bUludmFsaWQ7IH1cbiAgICBnZXQgbnVtQ2hpbGRyZW4oKSB7IHJldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRoZSBhZ2dyZWdhdGUgbGVuZ3RoIChpbiBieXRlcykgb2YgdGhlIHZhbHVlcyB0aGF0IGhhdmUgYmVlbiB3cml0dGVuLlxuICAgICAqL1xuICAgIGdldCBieXRlTGVuZ3RoKCkge1xuICAgICAgICBsZXQgc2l6ZSA9IDA7XG4gICAgICAgIGNvbnN0IHsgX29mZnNldHMsIF92YWx1ZXMsIF9udWxscywgX3R5cGVJZHMsIGNoaWxkcmVuIH0gPSB0aGlzO1xuICAgICAgICBfb2Zmc2V0cyAmJiAoc2l6ZSArPSBfb2Zmc2V0cy5ieXRlTGVuZ3RoKTtcbiAgICAgICAgX3ZhbHVlcyAmJiAoc2l6ZSArPSBfdmFsdWVzLmJ5dGVMZW5ndGgpO1xuICAgICAgICBfbnVsbHMgJiYgKHNpemUgKz0gX251bGxzLmJ5dGVMZW5ndGgpO1xuICAgICAgICBfdHlwZUlkcyAmJiAoc2l6ZSArPSBfdHlwZUlkcy5ieXRlTGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuLnJlZHVjZSgoc2l6ZSwgY2hpbGQpID0+IHNpemUgKyBjaGlsZC5ieXRlTGVuZ3RoLCBzaXplKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIGFnZ3JlZ2F0ZSBudW1iZXIgb2Ygcm93cyB0aGF0IGhhdmUgYmVlbiByZXNlcnZlZCB0byB3cml0ZSBuZXcgdmFsdWVzLlxuICAgICAqL1xuICAgIGdldCByZXNlcnZlZExlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bGxzLnJlc2VydmVkTGVuZ3RoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgYWdncmVnYXRlIGxlbmd0aCAoaW4gYnl0ZXMpIHRoYXQgaGFzIGJlZW4gcmVzZXJ2ZWQgdG8gd3JpdGUgbmV3IHZhbHVlcy5cbiAgICAgKi9cbiAgICBnZXQgcmVzZXJ2ZWRCeXRlTGVuZ3RoKCkge1xuICAgICAgICBsZXQgc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX29mZnNldHMgJiYgKHNpemUgKz0gdGhpcy5fb2Zmc2V0cy5yZXNlcnZlZEJ5dGVMZW5ndGgpO1xuICAgICAgICB0aGlzLl92YWx1ZXMgJiYgKHNpemUgKz0gdGhpcy5fdmFsdWVzLnJlc2VydmVkQnl0ZUxlbmd0aCk7XG4gICAgICAgIHRoaXMuX251bGxzICYmIChzaXplICs9IHRoaXMuX251bGxzLnJlc2VydmVkQnl0ZUxlbmd0aCk7XG4gICAgICAgIHRoaXMuX3R5cGVJZHMgJiYgKHNpemUgKz0gdGhpcy5fdHlwZUlkcy5yZXNlcnZlZEJ5dGVMZW5ndGgpO1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5yZWR1Y2UoKHNpemUsIGNoaWxkKSA9PiBzaXplICsgY2hpbGQucmVzZXJ2ZWRCeXRlTGVuZ3RoLCBzaXplKTtcbiAgICB9XG4gICAgZ2V0IHZhbHVlT2Zmc2V0cygpIHsgcmV0dXJuIHRoaXMuX29mZnNldHMgPyB0aGlzLl9vZmZzZXRzLmJ1ZmZlciA6IG51bGw7IH1cbiAgICBnZXQgdmFsdWVzKCkgeyByZXR1cm4gdGhpcy5fdmFsdWVzID8gdGhpcy5fdmFsdWVzLmJ1ZmZlciA6IG51bGw7IH1cbiAgICBnZXQgbnVsbEJpdG1hcCgpIHsgcmV0dXJuIHRoaXMuX251bGxzID8gdGhpcy5fbnVsbHMuYnVmZmVyIDogbnVsbDsgfVxuICAgIGdldCB0eXBlSWRzKCkgeyByZXR1cm4gdGhpcy5fdHlwZUlkcyA/IHRoaXMuX3R5cGVJZHMuYnVmZmVyIDogbnVsbDsgfVxuICAgIC8qKlxuICAgICAqIEFwcGVuZHMgYSB2YWx1ZSAob3IgbnVsbCkgdG8gdGhpcyBgQnVpbGRlcmAuXG4gICAgICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBidWlsZGVyLnNldChidWlsZGVyLmxlbmd0aCwgdmFsdWUpYC5cbiAgICAgKiBAcGFyYW0ge1RbJ1RWYWx1ZSddIHwgVE51bGwgfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXBwZW5kLlxuICAgICAqL1xuICAgIGFwcGVuZCh2YWx1ZSkgeyByZXR1cm4gdGhpcy5zZXQodGhpcy5sZW5ndGgsIHZhbHVlKTsgfVxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyB3aGV0aGVyIGEgdmFsdWUgaXMgdmFsaWQgKHRydWUpLCBvciBudWxsIChmYWxzZSlcbiAgICAgKiBAcGFyYW0ge1RbJ1RWYWx1ZSddIHwgVE51bGwgfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZSBhZ2FpbnN0IG51bGwgdGhlIHZhbHVlIHJlcHJlc2VudGF0aW9uc1xuICAgICAqL1xuICAgIGlzVmFsaWQodmFsdWUpIHsgcmV0dXJuIHRoaXMuX2lzVmFsaWQodmFsdWUpOyB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSB2YWx1ZSAob3IgbnVsbC12YWx1ZSBzZW50aW5lbCkgYXQgdGhlIHN1cHBsaWVkIGluZGV4LlxuICAgICAqIElmIHRoZSB2YWx1ZSBtYXRjaGVzIG9uZSBvZiB0aGUgbnVsbC12YWx1ZSByZXByZXNlbnRhdGlvbnMsIGEgMS1iaXQgaXNcbiAgICAgKiB3cml0dGVuIHRvIHRoZSBudWxsIGBCaXRtYXBCdWZmZXJCdWlsZGVyYC4gT3RoZXJ3aXNlLCBhIDAgaXMgd3JpdHRlbiB0b1xuICAgICAqIHRoZSBudWxsIGBCaXRtYXBCdWZmZXJCdWlsZGVyYCwgYW5kIHRoZSB2YWx1ZSBpcyBwYXNzZWQgdG9cbiAgICAgKiBgQnVpbGRlci5wcm90b3R5cGUuc2V0VmFsdWUoKWAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIHtUWydUVmFsdWUnXSB8IFROdWxsIH0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyaXRlIGF0IHRoZSBzdXBwbGllZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7dGhpc30gVGhlIHVwZGF0ZWQgYEJ1aWxkZXJgIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHNldChpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuc2V0VmFsaWQoaW5kZXgsIHRoaXMuaXNWYWxpZCh2YWx1ZSkpKSB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKGluZGV4LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgdmFsdWUgdG8gdGhlIHVuZGVybHlpbmcgYnVmZmVycyBhdCB0aGUgc3VwcGxpZWQgaW5kZXgsIGJ5cGFzc2luZ1xuICAgICAqIHRoZSBudWxsLXZhbHVlIGNoZWNrLiBUaGlzIGlzIGEgbG93LWxldmVsIG1ldGhvZCB0aGF0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gICAgICogQHBhcmFtIHtUWydUVmFsdWUnXSB8IFROdWxsIH0gdmFsdWVcbiAgICAgKi9cbiAgICBzZXRWYWx1ZShpbmRleCwgdmFsdWUpIHsgdGhpcy5fc2V0VmFsdWUodGhpcywgaW5kZXgsIHZhbHVlKTsgfVxuICAgIHNldFZhbGlkKGluZGV4LCB2YWxpZCkge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMuX251bGxzLnNldChpbmRleCwgK3ZhbGlkKS5sZW5ndGg7XG4gICAgICAgIHJldHVybiB2YWxpZDtcbiAgICB9XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGFkZENoaWxkKGNoaWxkLCBuYW1lID0gYCR7dGhpcy5udW1DaGlsZHJlbn1gKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGFwcGVuZCBjaGlsZHJlbiB0byBub24tbmVzdGVkIHR5cGUgXCIke3RoaXMudHlwZX1cImApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZSB0aGUgY2hpbGQgYEJ1aWxkZXJgIGF0IHRoZSBzdXBwbGllZCBgaW5kZXhgLCBvciBudWxsIGlmIG5vIGNoaWxkXG4gICAgICogZXhpc3RzIGF0IHRoYXQgaW5kZXguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgY2hpbGQgYEJ1aWxkZXJgIHRvIHJldHJpZXZlLlxuICAgICAqIEByZXR1cm5zIHtCdWlsZGVyIHwgbnVsbH0gVGhlIGNoaWxkIEJ1aWxkZXIgYXQgdGhlIHN1cHBsaWVkIGluZGV4IG9yIG51bGwuXG4gICAgICovXG4gICAgZ2V0Q2hpbGRBdChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbltpbmRleF0gfHwgbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tbWl0IGFsbCB0aGUgdmFsdWVzIHRoYXQgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gdGhlaXIgdW5kZXJseWluZ1xuICAgICAqIEFycmF5QnVmZmVycywgaW5jbHVkaW5nIGFueSBjaGlsZCBCdWlsZGVycyBpZiBhcHBsaWNhYmxlLCBhbmQgcmVzZXRcbiAgICAgKiB0aGUgaW50ZXJuYWwgYEJ1aWxkZXJgIHN0YXRlLlxuICAgICAqIEByZXR1cm5zIEEgYERhdGE8VD5gIG9mIHRoZSBidWZmZXJzIGFuZCBjaGlsZHJlbiByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyB3cml0dGVuLlxuICAgICAqL1xuICAgIGZsdXNoKCkge1xuICAgICAgICBsZXQgZGF0YTtcbiAgICAgICAgbGV0IHR5cGVJZHM7XG4gICAgICAgIGxldCBudWxsQml0bWFwO1xuICAgICAgICBsZXQgdmFsdWVPZmZzZXRzO1xuICAgICAgICBjb25zdCB7IHR5cGUsIGxlbmd0aCwgbnVsbENvdW50LCBfdHlwZUlkcywgX29mZnNldHMsIF92YWx1ZXMsIF9udWxscyB9ID0gdGhpcztcbiAgICAgICAgaWYgKHR5cGVJZHMgPSBfdHlwZUlkcyA9PT0gbnVsbCB8fCBfdHlwZUlkcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3R5cGVJZHMuZmx1c2gobGVuZ3RoKSkgeyAvLyBVbmlvbnNcbiAgICAgICAgICAgIC8vIERlbnNlVW5pb25zXG4gICAgICAgICAgICB2YWx1ZU9mZnNldHMgPSBfb2Zmc2V0cyA9PT0gbnVsbCB8fCBfb2Zmc2V0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29mZnNldHMuZmx1c2gobGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWx1ZU9mZnNldHMgPSBfb2Zmc2V0cyA9PT0gbnVsbCB8fCBfb2Zmc2V0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29mZnNldHMuZmx1c2gobGVuZ3RoKSkgeyAvLyBWYXJpYWJsZS13aWR0aCBwcmltaXRpdmVzIChCaW5hcnksIFV0ZjgpLCBhbmQgTGlzdHNcbiAgICAgICAgICAgIC8vIEJpbmFyeSwgVXRmOFxuICAgICAgICAgICAgZGF0YSA9IF92YWx1ZXMgPT09IG51bGwgfHwgX3ZhbHVlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3ZhbHVlcy5mbHVzaChfb2Zmc2V0cy5sYXN0KCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBGaXhlZC13aWR0aCBwcmltaXRpdmVzIChJbnQsIEZsb2F0LCBEZWNpbWFsLCBUaW1lLCBUaW1lc3RhbXAsIGFuZCBJbnRlcnZhbClcbiAgICAgICAgICAgIGRhdGEgPSBfdmFsdWVzID09PSBudWxsIHx8IF92YWx1ZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF92YWx1ZXMuZmx1c2gobGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobnVsbENvdW50ID4gMCkge1xuICAgICAgICAgICAgbnVsbEJpdG1hcCA9IF9udWxscyA9PT0gbnVsbCB8fCBfbnVsbHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9udWxscy5mbHVzaChsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiBjaGlsZC5mbHVzaCgpKTtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICByZXR1cm4gbWFrZURhdGEoe1xuICAgICAgICAgICAgdHlwZSwgbGVuZ3RoLCBudWxsQ291bnQsXG4gICAgICAgICAgICBjaGlsZHJlbiwgJ2NoaWxkJzogY2hpbGRyZW5bMF0sXG4gICAgICAgICAgICBkYXRhLCB0eXBlSWRzLCBudWxsQml0bWFwLCB2YWx1ZU9mZnNldHMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGaW5hbGl6ZSB0aGlzIGBCdWlsZGVyYCwgYW5kIGNoaWxkIGJ1aWxkZXJzIGlmIGFwcGxpY2FibGUuXG4gICAgICogQHJldHVybnMge3RoaXN9IFRoZSBmaW5hbGl6ZWQgYEJ1aWxkZXJgIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZpbmlzaCgpIHtcbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbilcbiAgICAgICAgICAgIGNoaWxkLmZpbmlzaCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXIgdGhpcyBCdWlsZGVyJ3MgaW50ZXJuYWwgc3RhdGUsIGluY2x1ZGluZyBjaGlsZCBCdWlsZGVycyBpZiBhcHBsaWNhYmxlLCBhbmQgcmVzZXQgdGhlIGxlbmd0aCB0byAwLlxuICAgICAqIEByZXR1cm5zIHt0aGlzfSBUaGUgY2xlYXJlZCBgQnVpbGRlcmAgaW5zdGFuY2UuXG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgICAgICAoX2EgPSB0aGlzLl9udWxscykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNsZWFyKCk7XG4gICAgICAgIChfYiA9IHRoaXMuX3ZhbHVlcykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNsZWFyKCk7XG4gICAgICAgIChfYyA9IHRoaXMuX29mZnNldHMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5jbGVhcigpO1xuICAgICAgICAoX2QgPSB0aGlzLl90eXBlSWRzKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuY2xlYXIoKTtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKVxuICAgICAgICAgICAgY2hpbGQuY2xlYXIoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuQnVpbGRlci5wcm90b3R5cGUubGVuZ3RoID0gMTtcbkJ1aWxkZXIucHJvdG90eXBlLnN0cmlkZSA9IDE7XG5CdWlsZGVyLnByb3RvdHlwZS5jaGlsZHJlbiA9IG51bGw7XG5CdWlsZGVyLnByb3RvdHlwZS5maW5pc2hlZCA9IGZhbHNlO1xuQnVpbGRlci5wcm90b3R5cGUubnVsbFZhbHVlcyA9IG51bGw7XG5CdWlsZGVyLnByb3RvdHlwZS5faXNWYWxpZCA9ICgpID0+IHRydWU7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEZpeGVkV2lkdGhCdWlsZGVyIGV4dGVuZHMgQnVpbGRlciB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy5fdmFsdWVzID0gbmV3IERhdGFCdWZmZXJCdWlsZGVyKG5ldyB0aGlzLkFycmF5VHlwZSgwKSwgdGhpcy5zdHJpZGUpO1xuICAgIH1cbiAgICBzZXRWYWx1ZShpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5fdmFsdWVzO1xuICAgICAgICB2YWx1ZXMucmVzZXJ2ZShpbmRleCAtIHZhbHVlcy5sZW5ndGggKyAxKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnNldFZhbHVlKGluZGV4LCB2YWx1ZSk7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBWYXJpYWJsZVdpZHRoQnVpbGRlciBleHRlbmRzIEJ1aWxkZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdMZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl9vZmZzZXRzID0gbmV3IE9mZnNldHNCdWZmZXJCdWlsZGVyKCk7XG4gICAgfVxuICAgIHNldFZhbHVlKGluZGV4LCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5fcGVuZGluZyB8fCAodGhpcy5fcGVuZGluZyA9IG5ldyBNYXAoKSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBwZW5kaW5nLmdldChpbmRleCk7XG4gICAgICAgIGN1cnJlbnQgJiYgKHRoaXMuX3BlbmRpbmdMZW5ndGggLT0gY3VycmVudC5sZW5ndGgpO1xuICAgICAgICB0aGlzLl9wZW5kaW5nTGVuZ3RoICs9ICh2YWx1ZSBpbnN0YW5jZW9mIE1hcFJvdykgPyB2YWx1ZVtrS2V5c10ubGVuZ3RoIDogdmFsdWUubGVuZ3RoO1xuICAgICAgICBwZW5kaW5nLnNldChpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgICBzZXRWYWxpZChpbmRleCwgaXNWYWxpZCkge1xuICAgICAgICBpZiAoIXN1cGVyLnNldFZhbGlkKGluZGV4LCBpc1ZhbGlkKSkge1xuICAgICAgICAgICAgKHRoaXMuX3BlbmRpbmcgfHwgKHRoaXMuX3BlbmRpbmcgPSBuZXcgTWFwKCkpKS5zZXQoaW5kZXgsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLl9wZW5kaW5nTGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5fcGVuZGluZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmNsZWFyKCk7XG4gICAgfVxuICAgIGZsdXNoKCkge1xuICAgICAgICB0aGlzLl9mbHVzaCgpO1xuICAgICAgICByZXR1cm4gc3VwZXIuZmx1c2goKTtcbiAgICB9XG4gICAgZmluaXNoKCkge1xuICAgICAgICB0aGlzLl9mbHVzaCgpO1xuICAgICAgICByZXR1cm4gc3VwZXIuZmluaXNoKCk7XG4gICAgfVxuICAgIF9mbHVzaCgpIHtcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMuX3BlbmRpbmc7XG4gICAgICAgIGNvbnN0IHBlbmRpbmdMZW5ndGggPSB0aGlzLl9wZW5kaW5nTGVuZ3RoO1xuICAgICAgICB0aGlzLl9wZW5kaW5nTGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5fcGVuZGluZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHBlbmRpbmcgJiYgcGVuZGluZy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fZmx1c2hQZW5kaW5nKHBlbmRpbmcsIHBlbmRpbmdMZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnVpbGRlci5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IHRvVWludDhBcnJheSB9IGZyb20gJy4uL3V0aWwvYnVmZmVyLm1qcyc7XG5pbXBvcnQgeyBCdWZmZXJCdWlsZGVyIH0gZnJvbSAnLi9idWZmZXIubWpzJztcbmltcG9ydCB7IFZhcmlhYmxlV2lkdGhCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBCaW5hcnlCdWlsZGVyIGV4dGVuZHMgVmFyaWFibGVXaWR0aEJ1aWxkZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IG5ldyBCdWZmZXJCdWlsZGVyKG5ldyBVaW50OEFycmF5KDApKTtcbiAgICB9XG4gICAgZ2V0IGJ5dGVMZW5ndGgoKSB7XG4gICAgICAgIGxldCBzaXplID0gdGhpcy5fcGVuZGluZ0xlbmd0aCArICh0aGlzLmxlbmd0aCAqIDQpO1xuICAgICAgICB0aGlzLl9vZmZzZXRzICYmIChzaXplICs9IHRoaXMuX29mZnNldHMuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyAmJiAoc2l6ZSArPSB0aGlzLl92YWx1ZXMuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHRoaXMuX251bGxzICYmIChzaXplICs9IHRoaXMuX251bGxzLmJ5dGVMZW5ndGgpO1xuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9XG4gICAgc2V0VmFsdWUoaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5zZXRWYWx1ZShpbmRleCwgdG9VaW50OEFycmF5KHZhbHVlKSk7XG4gICAgfVxuICAgIF9mbHVzaFBlbmRpbmcocGVuZGluZywgcGVuZGluZ0xlbmd0aCkge1xuICAgICAgICBjb25zdCBvZmZzZXRzID0gdGhpcy5fb2Zmc2V0cztcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuX3ZhbHVlcy5yZXNlcnZlKHBlbmRpbmdMZW5ndGgpLmJ1ZmZlcjtcbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgW2luZGV4LCB2YWx1ZV0gb2YgcGVuZGluZykge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXRzLnNldChpbmRleCwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZGF0YS5zZXQodmFsdWUsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0cy5zZXQoaW5kZXgsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmluYXJ5Lm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgQml0bWFwQnVmZmVyQnVpbGRlciB9IGZyb20gJy4vYnVmZmVyLm1qcyc7XG5pbXBvcnQgeyBCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBCb29sQnVpbGRlciBleHRlbmRzIEJ1aWxkZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IG5ldyBCaXRtYXBCdWZmZXJCdWlsZGVyKCk7XG4gICAgfVxuICAgIHNldFZhbHVlKGluZGV4LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLl92YWx1ZXMuc2V0KGluZGV4LCArdmFsdWUpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Ym9vbC5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IG1lbWNweSB9IGZyb20gJy4uL3V0aWwvYnVmZmVyLm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuY29uc3Qgcm91bmRMZW5ndGhVcFRvTmVhcmVzdDY0Qnl0ZXMgPSAobGVuLCBCUEUpID0+ICgoKChsZW4gKiBCUEUpICsgNjMpICYgfjYzKSB8fCA2NCkgLyBCUEU7XG4vKiogQGlnbm9yZSAqL1xuY29uc3Qgc2xpY2VPckV4dGVuZEFycmF5ID0gKGFyciwgbGVuID0gMCkgPT4gKGFyci5sZW5ndGggPj0gbGVuID8gYXJyLnN1YmFycmF5KDAsIGxlbikgOiBtZW1jcHkobmV3IGFyci5jb25zdHJ1Y3RvcihsZW4pLCBhcnIsIDApKTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgQnVmZmVyQnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IoYnVmZmVyLCBzdHJpZGUgPSAxKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgICAgICB0aGlzLnN0cmlkZSA9IHN0cmlkZTtcbiAgICAgICAgdGhpcy5CWVRFU19QRVJfRUxFTUVOVCA9IGJ1ZmZlci5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgdGhpcy5BcnJheVR5cGUgPSBidWZmZXIuY29uc3RydWN0b3I7XG4gICAgICAgIHRoaXMuX3Jlc2l6ZSh0aGlzLmxlbmd0aCA9IE1hdGgudHJ1bmMoYnVmZmVyLmxlbmd0aCAvIHN0cmlkZSkpO1xuICAgIH1cbiAgICBnZXQgYnl0ZUxlbmd0aCgpIHsgcmV0dXJuIE1hdGgudHJ1bmModGhpcy5sZW5ndGggKiB0aGlzLnN0cmlkZSAqIHRoaXMuQllURVNfUEVSX0VMRU1FTlQpOyB9XG4gICAgZ2V0IHJlc2VydmVkTGVuZ3RoKCkgeyByZXR1cm4gdGhpcy5idWZmZXIubGVuZ3RoIC8gdGhpcy5zdHJpZGU7IH1cbiAgICBnZXQgcmVzZXJ2ZWRCeXRlTGVuZ3RoKCkgeyByZXR1cm4gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aDsgfVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBzZXQoaW5kZXgsIHZhbHVlKSB7IHJldHVybiB0aGlzOyB9XG4gICAgYXBwZW5kKHZhbHVlKSB7IHJldHVybiB0aGlzLnNldCh0aGlzLmxlbmd0aCwgdmFsdWUpOyB9XG4gICAgcmVzZXJ2ZShleHRyYSkge1xuICAgICAgICBpZiAoZXh0cmEgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCArPSBleHRyYTtcbiAgICAgICAgICAgIGNvbnN0IHN0cmlkZSA9IHRoaXMuc3RyaWRlO1xuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5sZW5ndGggKiBzdHJpZGU7XG4gICAgICAgICAgICBjb25zdCByZXNlcnZlZCA9IHRoaXMuYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChsZW5ndGggPj0gcmVzZXJ2ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNpemUocmVzZXJ2ZWQgPT09IDBcbiAgICAgICAgICAgICAgICAgICAgPyByb3VuZExlbmd0aFVwVG9OZWFyZXN0NjRCeXRlcyhsZW5ndGggKiAxLCB0aGlzLkJZVEVTX1BFUl9FTEVNRU5UKVxuICAgICAgICAgICAgICAgICAgICA6IHJvdW5kTGVuZ3RoVXBUb05lYXJlc3Q2NEJ5dGVzKGxlbmd0aCAqIDIsIHRoaXMuQllURVNfUEVSX0VMRU1FTlQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZmx1c2gobGVuZ3RoID0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgbGVuZ3RoID0gcm91bmRMZW5ndGhVcFRvTmVhcmVzdDY0Qnl0ZXMobGVuZ3RoICogdGhpcy5zdHJpZGUsIHRoaXMuQllURVNfUEVSX0VMRU1FTlQpO1xuICAgICAgICBjb25zdCBhcnJheSA9IHNsaWNlT3JFeHRlbmRBcnJheSh0aGlzLmJ1ZmZlciwgbGVuZ3RoKTtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX3Jlc2l6ZSgwKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIF9yZXNpemUobmV3TGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlciA9IG1lbWNweShuZXcgdGhpcy5BcnJheVR5cGUobmV3TGVuZ3RoKSwgdGhpcy5idWZmZXIpO1xuICAgIH1cbn1cbkJ1ZmZlckJ1aWxkZXIucHJvdG90eXBlLm9mZnNldCA9IDA7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIERhdGFCdWZmZXJCdWlsZGVyIGV4dGVuZHMgQnVmZmVyQnVpbGRlciB7XG4gICAgbGFzdCgpIHsgcmV0dXJuIHRoaXMuZ2V0KHRoaXMubGVuZ3RoIC0gMSk7IH1cbiAgICBnZXQoaW5kZXgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyW2luZGV4XTsgfVxuICAgIHNldChpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5yZXNlcnZlKGluZGV4IC0gdGhpcy5sZW5ndGggKyAxKTtcbiAgICAgICAgdGhpcy5idWZmZXJbaW5kZXggKiB0aGlzLnN0cmlkZV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBCaXRtYXBCdWZmZXJCdWlsZGVyIGV4dGVuZHMgRGF0YUJ1ZmZlckJ1aWxkZXIge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEgPSBuZXcgVWludDhBcnJheSgwKSkge1xuICAgICAgICBzdXBlcihkYXRhLCAxIC8gOCk7XG4gICAgICAgIHRoaXMubnVtVmFsaWQgPSAwO1xuICAgIH1cbiAgICBnZXQgbnVtSW52YWxpZCgpIHsgcmV0dXJuIHRoaXMubGVuZ3RoIC0gdGhpcy5udW1WYWxpZDsgfVxuICAgIGdldChpZHgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyW2lkeCA+PiAzXSA+PiBpZHggJSA4ICYgMTsgfVxuICAgIHNldChpZHgsIHZhbCkge1xuICAgICAgICBjb25zdCB7IGJ1ZmZlciB9ID0gdGhpcy5yZXNlcnZlKGlkeCAtIHRoaXMubGVuZ3RoICsgMSk7XG4gICAgICAgIGNvbnN0IGJ5dGUgPSBpZHggPj4gMywgYml0ID0gaWR4ICUgOCwgY3VyID0gYnVmZmVyW2J5dGVdID4+IGJpdCAmIDE7XG4gICAgICAgIC8vIElmIGB2YWxgIGlzIHRydXRoeSBhbmQgdGhlIGN1cnJlbnQgYml0IGlzIDAsIGZsaXAgaXQgdG8gMSBhbmQgaW5jcmVtZW50IGBudW1WYWxpZGAuXG4gICAgICAgIC8vIElmIGB2YWxgIGlzIGZhbHNleSBhbmQgdGhlIGN1cnJlbnQgYml0IGlzIDEsIGZsaXAgaXQgdG8gMCBhbmQgZGVjcmVtZW50IGBudW1WYWxpZGAuXG4gICAgICAgIHZhbCA/IGN1ciA9PT0gMCAmJiAoKGJ1ZmZlcltieXRlXSB8PSAoMSA8PCBiaXQpKSwgKyt0aGlzLm51bVZhbGlkKVxuICAgICAgICAgICAgOiBjdXIgPT09IDEgJiYgKChidWZmZXJbYnl0ZV0gJj0gfigxIDw8IGJpdCkpLCAtLXRoaXMubnVtVmFsaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMubnVtVmFsaWQgPSAwO1xuICAgICAgICByZXR1cm4gc3VwZXIuY2xlYXIoKTtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIE9mZnNldHNCdWZmZXJCdWlsZGVyIGV4dGVuZHMgRGF0YUJ1ZmZlckJ1aWxkZXIge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEgPSBuZXcgSW50MzJBcnJheSgxKSkgeyBzdXBlcihkYXRhLCAxKTsgfVxuICAgIGFwcGVuZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXQodGhpcy5sZW5ndGggLSAxLCB2YWx1ZSk7XG4gICAgfVxuICAgIHNldChpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLnJlc2VydmUoaW5kZXggLSBvZmZzZXQgKyAxKS5idWZmZXI7XG4gICAgICAgIGlmIChvZmZzZXQgPCBpbmRleCsrKSB7XG4gICAgICAgICAgICBidWZmZXIuZmlsbChidWZmZXJbb2Zmc2V0XSwgb2Zmc2V0LCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyW2luZGV4XSA9IGJ1ZmZlcltpbmRleCAtIDFdICsgdmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBmbHVzaChsZW5ndGggPSB0aGlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNldChsZW5ndGggLSAxLCAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIuZmx1c2gobGVuZ3RoICsgMSk7XG4gICAgfVxufVxuLy8gLyoqIEBpZ25vcmUgKi9cbi8vIGV4cG9ydCBjbGFzcyBXaWRlQnVmZmVyQnVpbGRlcjxUIGV4dGVuZHMgVHlwZWRBcnJheSwgUiBleHRlbmRzIEJpZ0ludEFycmF5PiBleHRlbmRzIEJ1ZmZlckJ1aWxkZXI8VCwgRGF0YVZhbHVlPFQ+PiB7XG4vLyAgICAgcHVibGljIGJ1ZmZlcjY0ITogUjtcbi8vICAgICBwcm90ZWN0ZWQgX0FycmF5VHlwZTY0ITogQmlnSW50QXJyYXlDb25zdHJ1Y3RvcjxSPjtcbi8vICAgICBwdWJsaWMgZ2V0IEFycmF5VHlwZTY0KCkge1xuLy8gICAgICAgICByZXR1cm4gdGhpcy5fQXJyYXlUeXBlNjQgfHwgKHRoaXMuX0FycmF5VHlwZTY0ID0gPEJpZ0ludEFycmF5Q29uc3RydWN0b3I8Uj4+ICh0aGlzLmJ1ZmZlciBpbnN0YW5jZW9mIEludDMyQXJyYXkgPyBCaWdJbnQ2NEFycmF5IDogQmlnVWludDY0QXJyYXkpKTtcbi8vICAgICB9XG4vLyAgICAgcHVibGljIHNldChpbmRleDogbnVtYmVyLCB2YWx1ZTogRGF0YVZhbHVlPFQ+KSB7XG4vLyAgICAgICAgIHRoaXMucmVzZXJ2ZShpbmRleCAtIHRoaXMubGVuZ3RoICsgMSk7XG4vLyAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4vLyAgICAgICAgICAgICBjYXNlICdiaWdpbnQnOiB0aGlzLmJ1ZmZlcjY0W2luZGV4XSA9IHZhbHVlOyBicmVhaztcbi8vICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6IHRoaXMuYnVmZmVyW2luZGV4ICogdGhpcy5zdHJpZGVdID0gdmFsdWU7IGJyZWFrO1xuLy8gICAgICAgICAgICAgZGVmYXVsdDogdGhpcy5idWZmZXIuc2V0KHZhbHVlIGFzIFR5cGVkQXJyYXksIGluZGV4ICogdGhpcy5zdHJpZGUpO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIHJldHVybiB0aGlzO1xuLy8gICAgIH1cbi8vICAgICBwcm90ZWN0ZWQgX3Jlc2l6ZShuZXdMZW5ndGg6IG51bWJlcikge1xuLy8gICAgICAgICBjb25zdCBkYXRhID0gc3VwZXIuX3Jlc2l6ZShuZXdMZW5ndGgpO1xuLy8gICAgICAgICBjb25zdCBsZW5ndGggPSBkYXRhLmJ5dGVMZW5ndGggLyAodGhpcy5CWVRFU19QRVJfRUxFTUVOVCAqIHRoaXMuc3RyaWRlKTtcbi8vICAgICAgICAgaWYgKEJpZ0ludEF2YWlsYWJsZSkge1xuLy8gICAgICAgICAgICAgdGhpcy5idWZmZXI2NCA9IG5ldyB0aGlzLkFycmF5VHlwZTY0KGRhdGEuYnVmZmVyLCBkYXRhLmJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgcmV0dXJuIGRhdGE7XG4vLyAgICAgfVxuLy8gfVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1idWZmZXIubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBGaXhlZFdpZHRoQnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIubWpzJztcbmltcG9ydCB7IHNldERhdGUsIHNldERhdGVEYXksIHNldERhdGVNaWxsaXNlY29uZCB9IGZyb20gJy4uL3Zpc2l0b3Ivc2V0Lm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIERhdGVCdWlsZGVyIGV4dGVuZHMgRml4ZWRXaWR0aEJ1aWxkZXIge1xufVxuRGF0ZUJ1aWxkZXIucHJvdG90eXBlLl9zZXRWYWx1ZSA9IHNldERhdGU7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIERhdGVEYXlCdWlsZGVyIGV4dGVuZHMgRGF0ZUJ1aWxkZXIge1xufVxuRGF0ZURheUJ1aWxkZXIucHJvdG90eXBlLl9zZXRWYWx1ZSA9IHNldERhdGVEYXk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIERhdGVNaWxsaXNlY29uZEJ1aWxkZXIgZXh0ZW5kcyBEYXRlQnVpbGRlciB7XG59XG5EYXRlTWlsbGlzZWNvbmRCdWlsZGVyLnByb3RvdHlwZS5fc2V0VmFsdWUgPSBzZXREYXRlTWlsbGlzZWNvbmQ7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGUubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBGaXhlZFdpZHRoQnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIubWpzJztcbmltcG9ydCB7IHNldERlY2ltYWwgfSBmcm9tICcuLi92aXNpdG9yL3NldC5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBEZWNpbWFsQnVpbGRlciBleHRlbmRzIEZpeGVkV2lkdGhCdWlsZGVyIHtcbn1cbkRlY2ltYWxCdWlsZGVyLnByb3RvdHlwZS5fc2V0VmFsdWUgPSBzZXREZWNpbWFsO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWNpbWFsLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJy4uL3R5cGUubWpzJztcbmltcG9ydCB7IEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyLm1qcyc7XG5pbXBvcnQgeyBtYWtlQnVpbGRlciB9IGZyb20gJy4uL2ZhY3Rvcmllcy5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBEaWN0aW9uYXJ5QnVpbGRlciBleHRlbmRzIEJ1aWxkZXIge1xuICAgIGNvbnN0cnVjdG9yKHsgJ3R5cGUnOiB0eXBlLCAnbnVsbFZhbHVlcyc6IG51bGxzLCAnZGljdGlvbmFyeUhhc2hGdW5jdGlvbic6IGhhc2hGbiB9KSB7XG4gICAgICAgIHN1cGVyKHsgdHlwZTogbmV3IERpY3Rpb25hcnkodHlwZS5kaWN0aW9uYXJ5LCB0eXBlLmluZGljZXMsIHR5cGUuaWQsIHR5cGUuaXNPcmRlcmVkKSB9KTtcbiAgICAgICAgdGhpcy5fbnVsbHMgPSBudWxsO1xuICAgICAgICB0aGlzLl9kaWN0aW9uYXJ5T2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5fa2V5c1RvSW5kaWNlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuaW5kaWNlcyA9IG1ha2VCdWlsZGVyKHsgJ3R5cGUnOiB0aGlzLnR5cGUuaW5kaWNlcywgJ251bGxWYWx1ZXMnOiBudWxscyB9KTtcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5ID0gbWFrZUJ1aWxkZXIoeyAndHlwZSc6IHRoaXMudHlwZS5kaWN0aW9uYXJ5LCAnbnVsbFZhbHVlcyc6IG51bGwgfSk7XG4gICAgICAgIGlmICh0eXBlb2YgaGFzaEZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlVG9LZXkgPSBoYXNoRm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHZhbHVlcygpIHsgcmV0dXJuIHRoaXMuaW5kaWNlcy52YWx1ZXM7IH1cbiAgICBnZXQgbnVsbENvdW50KCkgeyByZXR1cm4gdGhpcy5pbmRpY2VzLm51bGxDb3VudDsgfVxuICAgIGdldCBudWxsQml0bWFwKCkgeyByZXR1cm4gdGhpcy5pbmRpY2VzLm51bGxCaXRtYXA7IH1cbiAgICBnZXQgYnl0ZUxlbmd0aCgpIHsgcmV0dXJuIHRoaXMuaW5kaWNlcy5ieXRlTGVuZ3RoICsgdGhpcy5kaWN0aW9uYXJ5LmJ5dGVMZW5ndGg7IH1cbiAgICBnZXQgcmVzZXJ2ZWRMZW5ndGgoKSB7IHJldHVybiB0aGlzLmluZGljZXMucmVzZXJ2ZWRMZW5ndGggKyB0aGlzLmRpY3Rpb25hcnkucmVzZXJ2ZWRMZW5ndGg7IH1cbiAgICBnZXQgcmVzZXJ2ZWRCeXRlTGVuZ3RoKCkgeyByZXR1cm4gdGhpcy5pbmRpY2VzLnJlc2VydmVkQnl0ZUxlbmd0aCArIHRoaXMuZGljdGlvbmFyeS5yZXNlcnZlZEJ5dGVMZW5ndGg7IH1cbiAgICBpc1ZhbGlkKHZhbHVlKSB7IHJldHVybiB0aGlzLmluZGljZXMuaXNWYWxpZCh2YWx1ZSk7IH1cbiAgICBzZXRWYWxpZChpbmRleCwgdmFsaWQpIHtcbiAgICAgICAgY29uc3QgaW5kaWNlcyA9IHRoaXMuaW5kaWNlcztcbiAgICAgICAgdmFsaWQgPSBpbmRpY2VzLnNldFZhbGlkKGluZGV4LCB2YWxpZCk7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gaW5kaWNlcy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB2YWxpZDtcbiAgICB9XG4gICAgc2V0VmFsdWUoaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGtleXNUb0luZGljZXMgPSB0aGlzLl9rZXlzVG9JbmRpY2VzO1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLnZhbHVlVG9LZXkodmFsdWUpO1xuICAgICAgICBsZXQgaWR4ID0ga2V5c1RvSW5kaWNlc1trZXldO1xuICAgICAgICBpZiAoaWR4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGtleXNUb0luZGljZXNba2V5XSA9IGlkeCA9IHRoaXMuX2RpY3Rpb25hcnlPZmZzZXQgKyB0aGlzLmRpY3Rpb25hcnkuYXBwZW5kKHZhbHVlKS5sZW5ndGggLSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmluZGljZXMuc2V0VmFsdWUoaW5kZXgsIGlkeCk7XG4gICAgfVxuICAgIGZsdXNoKCkge1xuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlO1xuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5fZGljdGlvbmFyeTtcbiAgICAgICAgY29uc3QgY3VyciA9IHRoaXMuZGljdGlvbmFyeS50b1ZlY3RvcigpO1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5pbmRpY2VzLmZsdXNoKCkuY2xvbmUodHlwZSk7XG4gICAgICAgIGRhdGEuZGljdGlvbmFyeSA9IHByZXYgPyBwcmV2LmNvbmNhdChjdXJyKSA6IGN1cnI7XG4gICAgICAgIHRoaXMuZmluaXNoZWQgfHwgKHRoaXMuX2RpY3Rpb25hcnlPZmZzZXQgKz0gY3Vyci5sZW5ndGgpO1xuICAgICAgICB0aGlzLl9kaWN0aW9uYXJ5ID0gZGF0YS5kaWN0aW9uYXJ5O1xuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBmaW5pc2goKSB7XG4gICAgICAgIHRoaXMuaW5kaWNlcy5maW5pc2goKTtcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5LmZpbmlzaCgpO1xuICAgICAgICB0aGlzLl9kaWN0aW9uYXJ5T2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5fa2V5c1RvSW5kaWNlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHJldHVybiBzdXBlci5maW5pc2goKTtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuaW5kaWNlcy5jbGVhcigpO1xuICAgICAgICB0aGlzLmRpY3Rpb25hcnkuY2xlYXIoKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmNsZWFyKCk7XG4gICAgfVxuICAgIHZhbHVlVG9LZXkodmFsKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/IHZhbCA6IGAke3ZhbH1gO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGljdGlvbmFyeS5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IEZpeGVkV2lkdGhCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci5tanMnO1xuaW1wb3J0IHsgc2V0Rml4ZWRTaXplQmluYXJ5IH0gZnJvbSAnLi4vdmlzaXRvci9zZXQubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgRml4ZWRTaXplQmluYXJ5QnVpbGRlciBleHRlbmRzIEZpeGVkV2lkdGhCdWlsZGVyIHtcbn1cbkZpeGVkU2l6ZUJpbmFyeUJ1aWxkZXIucHJvdG90eXBlLl9zZXRWYWx1ZSA9IHNldEZpeGVkU2l6ZUJpbmFyeTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zml4ZWRzaXplYmluYXJ5Lm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuLi9zY2hlbWEubWpzJztcbmltcG9ydCB7IEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyLm1qcyc7XG5pbXBvcnQgeyBGaXhlZFNpemVMaXN0IH0gZnJvbSAnLi4vdHlwZS5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBGaXhlZFNpemVMaXN0QnVpbGRlciBleHRlbmRzIEJ1aWxkZXIge1xuICAgIHNldFZhbHVlKGluZGV4LCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBbY2hpbGRdID0gdGhpcy5jaGlsZHJlbjtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBpbmRleCAqIHRoaXMuc3RyaWRlO1xuICAgICAgICBmb3IgKGxldCBpID0gLTEsIG4gPSB2YWx1ZS5sZW5ndGg7ICsraSA8IG47KSB7XG4gICAgICAgICAgICBjaGlsZC5zZXQoc3RhcnQgKyBpLCB2YWx1ZVtpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkQ2hpbGQoY2hpbGQsIG5hbWUgPSAnMCcpIHtcbiAgICAgICAgaWYgKHRoaXMubnVtQ2hpbGRyZW4gPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpeGVkU2l6ZUxpc3RCdWlsZGVyIGNhbiBvbmx5IGhhdmUgb25lIGNoaWxkLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoaWxkSW5kZXggPSB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgICB0aGlzLnR5cGUgPSBuZXcgRml4ZWRTaXplTGlzdCh0aGlzLnR5cGUubGlzdFNpemUsIG5ldyBGaWVsZChuYW1lLCBjaGlsZC50eXBlLCB0cnVlKSk7XG4gICAgICAgIHJldHVybiBjaGlsZEluZGV4O1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zml4ZWRzaXplbGlzdC5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IGZsb2F0NjRUb1VpbnQxNiB9IGZyb20gJy4uL3V0aWwvbWF0aC5tanMnO1xuaW1wb3J0IHsgRml4ZWRXaWR0aEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyLm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEZsb2F0QnVpbGRlciBleHRlbmRzIEZpeGVkV2lkdGhCdWlsZGVyIHtcbiAgICBzZXRWYWx1ZShpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fdmFsdWVzLnNldChpbmRleCwgdmFsdWUpO1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgRmxvYXQxNkJ1aWxkZXIgZXh0ZW5kcyBGbG9hdEJ1aWxkZXIge1xuICAgIHNldFZhbHVlKGluZGV4LCB2YWx1ZSkge1xuICAgICAgICAvLyBjb252ZXJ0IEpTIGZsb2F0NjQgdG8gYSB1aW50MTZcbiAgICAgICAgc3VwZXIuc2V0VmFsdWUoaW5kZXgsIGZsb2F0NjRUb1VpbnQxNih2YWx1ZSkpO1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgRmxvYXQzMkJ1aWxkZXIgZXh0ZW5kcyBGbG9hdEJ1aWxkZXIge1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBGbG9hdDY0QnVpbGRlciBleHRlbmRzIEZsb2F0QnVpbGRlciB7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZsb2F0Lm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgRml4ZWRXaWR0aEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyLm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEludEJ1aWxkZXIgZXh0ZW5kcyBGaXhlZFdpZHRoQnVpbGRlciB7XG4gICAgc2V0VmFsdWUoaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5zZXQoaW5kZXgsIHZhbHVlKTtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEludDhCdWlsZGVyIGV4dGVuZHMgSW50QnVpbGRlciB7XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEludDE2QnVpbGRlciBleHRlbmRzIEludEJ1aWxkZXIge1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBJbnQzMkJ1aWxkZXIgZXh0ZW5kcyBJbnRCdWlsZGVyIHtcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgSW50NjRCdWlsZGVyIGV4dGVuZHMgSW50QnVpbGRlciB7XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFVpbnQ4QnVpbGRlciBleHRlbmRzIEludEJ1aWxkZXIge1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBVaW50MTZCdWlsZGVyIGV4dGVuZHMgSW50QnVpbGRlciB7XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFVpbnQzMkJ1aWxkZXIgZXh0ZW5kcyBJbnRCdWlsZGVyIHtcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVWludDY0QnVpbGRlciBleHRlbmRzIEludEJ1aWxkZXIge1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnQubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBGaXhlZFdpZHRoQnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIubWpzJztcbmltcG9ydCB7IHNldEludGVydmFsVmFsdWUsIHNldEludGVydmFsRGF5VGltZSwgc2V0SW50ZXJ2YWxZZWFyTW9udGggfSBmcm9tICcuLi92aXNpdG9yL3NldC5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBJbnRlcnZhbEJ1aWxkZXIgZXh0ZW5kcyBGaXhlZFdpZHRoQnVpbGRlciB7XG59XG5JbnRlcnZhbEJ1aWxkZXIucHJvdG90eXBlLl9zZXRWYWx1ZSA9IHNldEludGVydmFsVmFsdWU7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEludGVydmFsRGF5VGltZUJ1aWxkZXIgZXh0ZW5kcyBJbnRlcnZhbEJ1aWxkZXIge1xufVxuSW50ZXJ2YWxEYXlUaW1lQnVpbGRlci5wcm90b3R5cGUuX3NldFZhbHVlID0gc2V0SW50ZXJ2YWxEYXlUaW1lO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBJbnRlcnZhbFllYXJNb250aEJ1aWxkZXIgZXh0ZW5kcyBJbnRlcnZhbEJ1aWxkZXIge1xufVxuSW50ZXJ2YWxZZWFyTW9udGhCdWlsZGVyLnByb3RvdHlwZS5fc2V0VmFsdWUgPSBzZXRJbnRlcnZhbFllYXJNb250aDtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW50ZXJ2YWwubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4uL3NjaGVtYS5tanMnO1xuaW1wb3J0IHsgTGlzdCB9IGZyb20gJy4uL3R5cGUubWpzJztcbmltcG9ydCB7IE9mZnNldHNCdWZmZXJCdWlsZGVyIH0gZnJvbSAnLi9idWZmZXIubWpzJztcbmltcG9ydCB7IFZhcmlhYmxlV2lkdGhCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBMaXN0QnVpbGRlciBleHRlbmRzIFZhcmlhYmxlV2lkdGhCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzLl9vZmZzZXRzID0gbmV3IE9mZnNldHNCdWZmZXJCdWlsZGVyKCk7XG4gICAgfVxuICAgIGFkZENoaWxkKGNoaWxkLCBuYW1lID0gJzAnKSB7XG4gICAgICAgIGlmICh0aGlzLm51bUNoaWxkcmVuID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdMaXN0QnVpbGRlciBjYW4gb25seSBoYXZlIG9uZSBjaGlsZC4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoaWxkcmVuW3RoaXMubnVtQ2hpbGRyZW5dID0gY2hpbGQ7XG4gICAgICAgIHRoaXMudHlwZSA9IG5ldyBMaXN0KG5ldyBGaWVsZChuYW1lLCBjaGlsZC50eXBlLCB0cnVlKSk7XG4gICAgICAgIHJldHVybiB0aGlzLm51bUNoaWxkcmVuIC0gMTtcbiAgICB9XG4gICAgX2ZsdXNoUGVuZGluZyhwZW5kaW5nKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldHMgPSB0aGlzLl9vZmZzZXRzO1xuICAgICAgICBjb25zdCBbY2hpbGRdID0gdGhpcy5jaGlsZHJlbjtcbiAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIHZhbHVlXSBvZiBwZW5kaW5nKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIG9mZnNldHMuc2V0KGluZGV4LCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBvZmZzZXRzLnNldChpbmRleCwgbikuYnVmZmVyW2luZGV4XTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gLTE7ICsraSA8IG47KSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnNldChzdGFydCArIGksIHZhbHVlW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxpc3QubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4uL3NjaGVtYS5tanMnO1xuaW1wb3J0IHsgTWFwXyB9IGZyb20gJy4uL3R5cGUubWpzJztcbmltcG9ydCB7IFZhcmlhYmxlV2lkdGhCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBNYXBCdWlsZGVyIGV4dGVuZHMgVmFyaWFibGVXaWR0aEJ1aWxkZXIge1xuICAgIHNldChpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnNldChpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgICBzZXRWYWx1ZShpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgY29uc3Qgcm93ID0gKHZhbHVlIGluc3RhbmNlb2YgTWFwID8gdmFsdWUgOiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKHZhbHVlKSkpO1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5fcGVuZGluZyB8fCAodGhpcy5fcGVuZGluZyA9IG5ldyBNYXAoKSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBwZW5kaW5nLmdldChpbmRleCk7XG4gICAgICAgIGN1cnJlbnQgJiYgKHRoaXMuX3BlbmRpbmdMZW5ndGggLT0gY3VycmVudC5zaXplKTtcbiAgICAgICAgdGhpcy5fcGVuZGluZ0xlbmd0aCArPSByb3cuc2l6ZTtcbiAgICAgICAgcGVuZGluZy5zZXQoaW5kZXgsIHJvdyk7XG4gICAgfVxuICAgIGFkZENoaWxkKGNoaWxkLCBuYW1lID0gYCR7dGhpcy5udW1DaGlsZHJlbn1gKSB7XG4gICAgICAgIGlmICh0aGlzLm51bUNoaWxkcmVuID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdMaXN0QnVpbGRlciBjYW4gb25seSBoYXZlIG9uZSBjaGlsZC4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoaWxkcmVuW3RoaXMubnVtQ2hpbGRyZW5dID0gY2hpbGQ7XG4gICAgICAgIHRoaXMudHlwZSA9IG5ldyBNYXBfKG5ldyBGaWVsZChuYW1lLCBjaGlsZC50eXBlLCB0cnVlKSwgdGhpcy50eXBlLmtleXNTb3J0ZWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5udW1DaGlsZHJlbiAtIDE7XG4gICAgfVxuICAgIF9mbHVzaFBlbmRpbmcocGVuZGluZykge1xuICAgICAgICBjb25zdCBvZmZzZXRzID0gdGhpcy5fb2Zmc2V0cztcbiAgICAgICAgY29uc3QgW2NoaWxkXSA9IHRoaXMuY2hpbGRyZW47XG4gICAgICAgIGZvciAoY29uc3QgW2luZGV4LCB2YWx1ZV0gb2YgcGVuZGluZykge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXRzLnNldChpbmRleCwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgeyBbaW5kZXhdOiBpZHgsIFtpbmRleCArIDFdOiBlbmQgfSA9IG9mZnNldHMuc2V0KGluZGV4LCB2YWx1ZS5zaXplKS5idWZmZXI7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgdmFsdWUuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnNldChpZHgsIHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICgrK2lkeCA+PSBlbmQpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hcC5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyLm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIE51bGxCdWlsZGVyIGV4dGVuZHMgQnVpbGRlciB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHNldFZhbHVlKGluZGV4LCB2YWx1ZSkgeyB9XG4gICAgc2V0VmFsaWQoaW5kZXgsIHZhbGlkKSB7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gTWF0aC5tYXgoaW5kZXggKyAxLCB0aGlzLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiB2YWxpZDtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW51bGwubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG4vKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLWFycmF5LWZvci1lYWNoICovXG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4uL3NjaGVtYS5tanMnO1xuaW1wb3J0IHsgQnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIubWpzJztcbmltcG9ydCB7IFN0cnVjdCB9IGZyb20gJy4uL3R5cGUubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgU3RydWN0QnVpbGRlciBleHRlbmRzIEJ1aWxkZXIge1xuICAgIHNldFZhbHVlKGluZGV4LCB2YWx1ZSkge1xuICAgICAgICBjb25zdCB7IGNoaWxkcmVuLCB0eXBlIH0gPSB0aGlzO1xuICAgICAgICBzd2l0Y2ggKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlLmNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICBjYXNlIHRydWU6IHJldHVybiB0eXBlLmNoaWxkcmVuLmZvckVhY2goKF8sIGkpID0+IGNoaWxkcmVuW2ldLnNldChpbmRleCwgdmFsdWVbaV0pKTtcbiAgICAgICAgICAgIGNhc2UgTWFwOiByZXR1cm4gdHlwZS5jaGlsZHJlbi5mb3JFYWNoKChmLCBpKSA9PiBjaGlsZHJlbltpXS5zZXQoaW5kZXgsIHZhbHVlLmdldChmLm5hbWUpKSk7XG4gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gdHlwZS5jaGlsZHJlbi5mb3JFYWNoKChmLCBpKSA9PiBjaGlsZHJlbltpXS5zZXQoaW5kZXgsIHZhbHVlW2YubmFtZV0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogQGluaGVyaXRkb2MgKi9cbiAgICBzZXRWYWxpZChpbmRleCwgdmFsaWQpIHtcbiAgICAgICAgaWYgKCFzdXBlci5zZXRWYWxpZChpbmRleCwgdmFsaWQpKSB7XG4gICAgICAgICAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiBjaGlsZC5zZXRWYWxpZChpbmRleCwgdmFsaWQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxuICAgIGFkZENoaWxkKGNoaWxkLCBuYW1lID0gYCR7dGhpcy5udW1DaGlsZHJlbn1gKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkSW5kZXggPSB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgICB0aGlzLnR5cGUgPSBuZXcgU3RydWN0KFsuLi50aGlzLnR5cGUuY2hpbGRyZW4sIG5ldyBGaWVsZChuYW1lLCBjaGlsZC50eXBlLCB0cnVlKV0pO1xuICAgICAgICByZXR1cm4gY2hpbGRJbmRleDtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cnVjdC5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IEZpeGVkV2lkdGhCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci5tanMnO1xuaW1wb3J0IHsgc2V0VGltZSwgc2V0VGltZVNlY29uZCwgc2V0VGltZU1pbGxpc2Vjb25kLCBzZXRUaW1lTWljcm9zZWNvbmQsIHNldFRpbWVOYW5vc2Vjb25kIH0gZnJvbSAnLi4vdmlzaXRvci9zZXQubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVGltZUJ1aWxkZXIgZXh0ZW5kcyBGaXhlZFdpZHRoQnVpbGRlciB7XG59XG5UaW1lQnVpbGRlci5wcm90b3R5cGUuX3NldFZhbHVlID0gc2V0VGltZTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVGltZVNlY29uZEJ1aWxkZXIgZXh0ZW5kcyBUaW1lQnVpbGRlciB7XG59XG5UaW1lU2Vjb25kQnVpbGRlci5wcm90b3R5cGUuX3NldFZhbHVlID0gc2V0VGltZVNlY29uZDtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVGltZU1pbGxpc2Vjb25kQnVpbGRlciBleHRlbmRzIFRpbWVCdWlsZGVyIHtcbn1cblRpbWVNaWxsaXNlY29uZEJ1aWxkZXIucHJvdG90eXBlLl9zZXRWYWx1ZSA9IHNldFRpbWVNaWxsaXNlY29uZDtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVGltZU1pY3Jvc2Vjb25kQnVpbGRlciBleHRlbmRzIFRpbWVCdWlsZGVyIHtcbn1cblRpbWVNaWNyb3NlY29uZEJ1aWxkZXIucHJvdG90eXBlLl9zZXRWYWx1ZSA9IHNldFRpbWVNaWNyb3NlY29uZDtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVGltZU5hbm9zZWNvbmRCdWlsZGVyIGV4dGVuZHMgVGltZUJ1aWxkZXIge1xufVxuVGltZU5hbm9zZWNvbmRCdWlsZGVyLnByb3RvdHlwZS5fc2V0VmFsdWUgPSBzZXRUaW1lTmFub3NlY29uZDtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGltZS5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IEZpeGVkV2lkdGhCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci5tanMnO1xuaW1wb3J0IHsgc2V0VGltZXN0YW1wLCBzZXRUaW1lc3RhbXBTZWNvbmQsIHNldFRpbWVzdGFtcE1pbGxpc2Vjb25kLCBzZXRUaW1lc3RhbXBNaWNyb3NlY29uZCwgc2V0VGltZXN0YW1wTmFub3NlY29uZCB9IGZyb20gJy4uL3Zpc2l0b3Ivc2V0Lm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFRpbWVzdGFtcEJ1aWxkZXIgZXh0ZW5kcyBGaXhlZFdpZHRoQnVpbGRlciB7XG59XG5UaW1lc3RhbXBCdWlsZGVyLnByb3RvdHlwZS5fc2V0VmFsdWUgPSBzZXRUaW1lc3RhbXA7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFRpbWVzdGFtcFNlY29uZEJ1aWxkZXIgZXh0ZW5kcyBUaW1lc3RhbXBCdWlsZGVyIHtcbn1cblRpbWVzdGFtcFNlY29uZEJ1aWxkZXIucHJvdG90eXBlLl9zZXRWYWx1ZSA9IHNldFRpbWVzdGFtcFNlY29uZDtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVGltZXN0YW1wTWlsbGlzZWNvbmRCdWlsZGVyIGV4dGVuZHMgVGltZXN0YW1wQnVpbGRlciB7XG59XG5UaW1lc3RhbXBNaWxsaXNlY29uZEJ1aWxkZXIucHJvdG90eXBlLl9zZXRWYWx1ZSA9IHNldFRpbWVzdGFtcE1pbGxpc2Vjb25kO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBUaW1lc3RhbXBNaWNyb3NlY29uZEJ1aWxkZXIgZXh0ZW5kcyBUaW1lc3RhbXBCdWlsZGVyIHtcbn1cblRpbWVzdGFtcE1pY3Jvc2Vjb25kQnVpbGRlci5wcm90b3R5cGUuX3NldFZhbHVlID0gc2V0VGltZXN0YW1wTWljcm9zZWNvbmQ7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFRpbWVzdGFtcE5hbm9zZWNvbmRCdWlsZGVyIGV4dGVuZHMgVGltZXN0YW1wQnVpbGRlciB7XG59XG5UaW1lc3RhbXBOYW5vc2Vjb25kQnVpbGRlci5wcm90b3R5cGUuX3NldFZhbHVlID0gc2V0VGltZXN0YW1wTmFub3NlY29uZDtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGltZXN0YW1wLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuLi9zY2hlbWEubWpzJztcbmltcG9ydCB7IERhdGFCdWZmZXJCdWlsZGVyIH0gZnJvbSAnLi9idWZmZXIubWpzJztcbmltcG9ydCB7IEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyLm1qcyc7XG5pbXBvcnQgeyBVbmlvbiB9IGZyb20gJy4uL3R5cGUubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVW5pb25CdWlsZGVyIGV4dGVuZHMgQnVpbGRlciB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fdHlwZUlkcyA9IG5ldyBEYXRhQnVmZmVyQnVpbGRlcihuZXcgSW50OEFycmF5KDApLCAxKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zWyd2YWx1ZVRvQ2hpbGRUeXBlSWQnXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fdmFsdWVUb0NoaWxkVHlwZUlkID0gb3B0aW9uc1sndmFsdWVUb0NoaWxkVHlwZUlkJ107XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHR5cGVJZFRvQ2hpbGRJbmRleCgpIHsgcmV0dXJuIHRoaXMudHlwZS50eXBlSWRUb0NoaWxkSW5kZXg7IH1cbiAgICBhcHBlbmQodmFsdWUsIGNoaWxkVHlwZUlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldCh0aGlzLmxlbmd0aCwgdmFsdWUsIGNoaWxkVHlwZUlkKTtcbiAgICB9XG4gICAgc2V0KGluZGV4LCB2YWx1ZSwgY2hpbGRUeXBlSWQpIHtcbiAgICAgICAgaWYgKGNoaWxkVHlwZUlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNoaWxkVHlwZUlkID0gdGhpcy5fdmFsdWVUb0NoaWxkVHlwZUlkKHRoaXMsIHZhbHVlLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2V0VmFsaWQoaW5kZXgsIHRoaXMuaXNWYWxpZCh2YWx1ZSkpKSB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKGluZGV4LCB2YWx1ZSwgY2hpbGRUeXBlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzZXRWYWx1ZShpbmRleCwgdmFsdWUsIGNoaWxkVHlwZUlkKSB7XG4gICAgICAgIHRoaXMuX3R5cGVJZHMuc2V0KGluZGV4LCBjaGlsZFR5cGVJZCk7XG4gICAgICAgIGNvbnN0IGNoaWxkSW5kZXggPSB0aGlzLnR5cGUudHlwZUlkVG9DaGlsZEluZGV4W2NoaWxkVHlwZUlkXTtcbiAgICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2NoaWxkSW5kZXhdO1xuICAgICAgICBjaGlsZCA9PT0gbnVsbCB8fCBjaGlsZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hpbGQuc2V0KGluZGV4LCB2YWx1ZSk7XG4gICAgfVxuICAgIGFkZENoaWxkKGNoaWxkLCBuYW1lID0gYCR7dGhpcy5jaGlsZHJlbi5sZW5ndGh9YCkge1xuICAgICAgICBjb25zdCBjaGlsZFR5cGVJZCA9IHRoaXMuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICAgIGNvbnN0IHsgdHlwZTogeyBjaGlsZHJlbiwgbW9kZSwgdHlwZUlkcyB9IH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBmaWVsZHMgPSBbLi4uY2hpbGRyZW4sIG5ldyBGaWVsZChuYW1lLCBjaGlsZC50eXBlKV07XG4gICAgICAgIHRoaXMudHlwZSA9IG5ldyBVbmlvbihtb2RlLCBbLi4udHlwZUlkcywgY2hpbGRUeXBlSWRdLCBmaWVsZHMpO1xuICAgICAgICByZXR1cm4gY2hpbGRUeXBlSWQ7XG4gICAgfVxuICAgIC8qKiBAaWdub3JlICovXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIF92YWx1ZVRvQ2hpbGRUeXBlSWQoYnVpbGRlciwgdmFsdWUsIG9mZnNldCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtYXAgVW5pb25CdWlsZGVyIHZhbHVlIHRvIGNoaWxkIHR5cGVJZC4gXFxcblBhc3MgdGhlIFxcYGNoaWxkVHlwZUlkXFxgIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdW5pb25CdWlsZGVyLmFwcGVuZCgpLCBcXFxub3Igc3VwcGx5IGEgXFxgdmFsdWVUb0NoaWxkVHlwZUlkXFxgIGZ1bmN0aW9uIGFzIHBhcnQgb2YgdGhlIFVuaW9uQnVpbGRlciBjb25zdHJ1Y3RvciBvcHRpb25zLmApO1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgU3BhcnNlVW5pb25CdWlsZGVyIGV4dGVuZHMgVW5pb25CdWlsZGVyIHtcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgRGVuc2VVbmlvbkJ1aWxkZXIgZXh0ZW5kcyBVbmlvbkJ1aWxkZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX29mZnNldHMgPSBuZXcgRGF0YUJ1ZmZlckJ1aWxkZXIobmV3IEludDMyQXJyYXkoMCkpO1xuICAgIH1cbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIHNldFZhbHVlKGluZGV4LCB2YWx1ZSwgY2hpbGRUeXBlSWQpIHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLl90eXBlSWRzLnNldChpbmRleCwgY2hpbGRUeXBlSWQpLmJ1ZmZlcltpbmRleF07XG4gICAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy5nZXRDaGlsZEF0KHRoaXMudHlwZS50eXBlSWRUb0NoaWxkSW5kZXhbaWRdKTtcbiAgICAgICAgY29uc3QgZGVuc2VJbmRleCA9IHRoaXMuX29mZnNldHMuc2V0KGluZGV4LCBjaGlsZC5sZW5ndGgpLmJ1ZmZlcltpbmRleF07XG4gICAgICAgIGNoaWxkID09PSBudWxsIHx8IGNoaWxkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGlsZC5zZXQoZGVuc2VJbmRleCwgdmFsdWUpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5pb24ubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBlbmNvZGVVdGY4IH0gZnJvbSAnLi4vdXRpbC91dGY4Lm1qcyc7XG5pbXBvcnQgeyBCaW5hcnlCdWlsZGVyIH0gZnJvbSAnLi9iaW5hcnkubWpzJztcbmltcG9ydCB7IEJ1ZmZlckJ1aWxkZXIgfSBmcm9tICcuL2J1ZmZlci5tanMnO1xuaW1wb3J0IHsgVmFyaWFibGVXaWR0aEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyLm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFV0ZjhCdWlsZGVyIGV4dGVuZHMgVmFyaWFibGVXaWR0aEJ1aWxkZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IG5ldyBCdWZmZXJCdWlsZGVyKG5ldyBVaW50OEFycmF5KDApKTtcbiAgICB9XG4gICAgZ2V0IGJ5dGVMZW5ndGgoKSB7XG4gICAgICAgIGxldCBzaXplID0gdGhpcy5fcGVuZGluZ0xlbmd0aCArICh0aGlzLmxlbmd0aCAqIDQpO1xuICAgICAgICB0aGlzLl9vZmZzZXRzICYmIChzaXplICs9IHRoaXMuX29mZnNldHMuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyAmJiAoc2l6ZSArPSB0aGlzLl92YWx1ZXMuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHRoaXMuX251bGxzICYmIChzaXplICs9IHRoaXMuX251bGxzLmJ5dGVMZW5ndGgpO1xuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9XG4gICAgc2V0VmFsdWUoaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5zZXRWYWx1ZShpbmRleCwgZW5jb2RlVXRmOCh2YWx1ZSkpO1xuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgX2ZsdXNoUGVuZGluZyhwZW5kaW5nLCBwZW5kaW5nTGVuZ3RoKSB7IH1cbn1cblV0ZjhCdWlsZGVyLnByb3RvdHlwZS5fZmx1c2hQZW5kaW5nID0gQmluYXJ5QnVpbGRlci5wcm90b3R5cGUuX2ZsdXNoUGVuZGluZztcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRmOC5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IHZhbHVlVG9TdHJpbmcgfSBmcm9tICcuLi91dGlsL3ByZXR0eS5tanMnO1xuaW1wb3J0IHsgQmlnSW50QXZhaWxhYmxlIH0gZnJvbSAnLi4vdXRpbC9jb21wYXQubWpzJztcbi8qKlxuICogRHluYW1pY2FsbHkgY29tcGlsZSB0aGUgbnVsbCB2YWx1ZXMgaW50byBhbiBgaXNWYWxpZCgpYCBmdW5jdGlvbiB3aG9zZVxuICogaW1wbGVtZW50YXRpb24gaXMgYSBzd2l0Y2ggc3RhdGVtZW50LiBNaWNyb2JlbmNobWFya3MgaW4gdjggaW5kaWNhdGVcbiAqIHRoaXMgYXBwcm9hY2ggaXMgMjUlIGZhc3RlciB0aGFuIHVzaW5nIGFuIEVTNiBNYXAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnNvbGUubG9nKGNyZWF0ZUlzVmFsaWRGdW5jdGlvbihbbnVsbCwgJ04vQScsIE5hTl0pKTtcbiAqIGBmdW5jdGlvbiAoeCkge1xuICogICAgIGlmICh4ICE9PSB4KSByZXR1cm4gZmFsc2U7XG4gKiAgICAgc3dpdGNoICh4KSB7XG4gKiAgICAgICAgIGNhc2UgbnVsbDpcbiAqICAgICAgICAgY2FzZSBcIk4vQVwiOlxuICogICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICogICAgIH1cbiAqICAgICByZXR1cm4gdHJ1ZTtcbiAqIH1gXG4gKlxuICogQGlnbm9yZVxuICogQHBhcmFtIG51bGxWYWx1ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUlzVmFsaWRGdW5jdGlvbihudWxsVmFsdWVzKSB7XG4gICAgaWYgKCFudWxsVmFsdWVzIHx8IG51bGxWYWx1ZXMubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gaXNWYWxpZCh2YWx1ZSkgeyByZXR1cm4gdHJ1ZTsgfTtcbiAgICB9XG4gICAgbGV0IGZuQm9keSA9ICcnO1xuICAgIGNvbnN0IG5vTmFOcyA9IG51bGxWYWx1ZXMuZmlsdGVyKCh4KSA9PiB4ID09PSB4KTtcbiAgICBpZiAobm9OYU5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm5Cb2R5ID0gYFxuICAgIHN3aXRjaCAoeCkgeyR7bm9OYU5zLm1hcCgoeCkgPT4gYFxuICAgICAgICBjYXNlICR7dmFsdWVUb0Nhc2UoeCl9OmApLmpvaW4oJycpfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1gO1xuICAgIH1cbiAgICAvLyBOYU4gZG9lc24ndCBlcXVhbCBhbnl0aGluZyBpbmNsdWRpbmcgaXRzZWxmLCBzbyBpdCBkb2Vzbid0IHdvcmsgYXMgYVxuICAgIC8vIHN3aXRjaCBjYXNlLiBJbnN0ZWFkIHdlIG11c3QgZXhwbGljaXRseSBjaGVjayBmb3IgTmFOIGJlZm9yZSB0aGUgc3dpdGNoLlxuICAgIGlmIChudWxsVmFsdWVzLmxlbmd0aCAhPT0gbm9OYU5zLmxlbmd0aCkge1xuICAgICAgICBmbkJvZHkgPSBgaWYgKHggIT09IHgpIHJldHVybiBmYWxzZTtcXG4ke2ZuQm9keX1gO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKGB4YCwgYCR7Zm5Cb2R5fVxcbnJldHVybiB0cnVlO2ApO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIHZhbHVlVG9DYXNlKHgpIHtcbiAgICBpZiAodHlwZW9mIHggIT09ICdiaWdpbnQnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZVRvU3RyaW5nKHgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChCaWdJbnRBdmFpbGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlVG9TdHJpbmcoeCl9bmA7XG4gICAgfVxuICAgIHJldHVybiBgXCIke3ZhbHVlVG9TdHJpbmcoeCl9XCJgO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD12YWxpZC5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IFZlY3RvciB9IGZyb20gJy4vdmVjdG9yLm1qcyc7XG5pbXBvcnQgeyBCdWZmZXJUeXBlLCBUeXBlIH0gZnJvbSAnLi9lbnVtLm1qcyc7XG5pbXBvcnQgeyBEYXRhVHlwZSwgc3RyaWRlRm9yVHlwZSB9IGZyb20gJy4vdHlwZS5tanMnO1xuaW1wb3J0IHsgcG9wY250X2JpdF9yYW5nZSwgdHJ1bmNhdGVCaXRtYXAgfSBmcm9tICcuL3V0aWwvYml0Lm1qcyc7XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3Qga1Vua25vd25OdWxsQ291bnQgPSAtMTtcbi8qKlxuICogRGF0YSBzdHJ1Y3R1cmUgdW5kZXJseWluZyB7QGxpbmsgVmVjdG9yfXMuIFVzZSB0aGUgY29udmVuaWVuY2UgbWV0aG9kIHtAbGluayBtYWtlRGF0YX0uXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhIHtcbiAgICBjb25zdHJ1Y3Rvcih0eXBlLCBvZmZzZXQsIGxlbmd0aCwgbnVsbENvdW50LCBidWZmZXJzLCBjaGlsZHJlbiA9IFtdLCBkaWN0aW9uYXJ5KSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5ID0gZGljdGlvbmFyeTtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBNYXRoLmZsb29yKE1hdGgubWF4KG9mZnNldCB8fCAwLCAwKSk7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gTWF0aC5mbG9vcihNYXRoLm1heChsZW5ndGggfHwgMCwgMCkpO1xuICAgICAgICB0aGlzLl9udWxsQ291bnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KG51bGxDb3VudCB8fCAwLCAtMSkpO1xuICAgICAgICBsZXQgYnVmZmVyO1xuICAgICAgICBpZiAoYnVmZmVycyBpbnN0YW5jZW9mIERhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuc3RyaWRlID0gYnVmZmVycy5zdHJpZGU7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcyA9IGJ1ZmZlcnMudmFsdWVzO1xuICAgICAgICAgICAgdGhpcy50eXBlSWRzID0gYnVmZmVycy50eXBlSWRzO1xuICAgICAgICAgICAgdGhpcy5udWxsQml0bWFwID0gYnVmZmVycy5udWxsQml0bWFwO1xuICAgICAgICAgICAgdGhpcy52YWx1ZU9mZnNldHMgPSBidWZmZXJzLnZhbHVlT2Zmc2V0cztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RyaWRlID0gc3RyaWRlRm9yVHlwZSh0eXBlKTtcbiAgICAgICAgICAgIGlmIChidWZmZXJzKSB7XG4gICAgICAgICAgICAgICAgKGJ1ZmZlciA9IGJ1ZmZlcnNbMF0pICYmICh0aGlzLnZhbHVlT2Zmc2V0cyA9IGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgKGJ1ZmZlciA9IGJ1ZmZlcnNbMV0pICYmICh0aGlzLnZhbHVlcyA9IGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgKGJ1ZmZlciA9IGJ1ZmZlcnNbMl0pICYmICh0aGlzLm51bGxCaXRtYXAgPSBidWZmZXIpO1xuICAgICAgICAgICAgICAgIChidWZmZXIgPSBidWZmZXJzWzNdKSAmJiAodGhpcy50eXBlSWRzID0gYnVmZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm51bGxhYmxlID0gdGhpcy5fbnVsbENvdW50ICE9PSAwICYmIHRoaXMubnVsbEJpdG1hcCAmJiB0aGlzLm51bGxCaXRtYXAuYnl0ZUxlbmd0aCA+IDA7XG4gICAgfVxuICAgIGdldCB0eXBlSWQoKSB7IHJldHVybiB0aGlzLnR5cGUudHlwZUlkOyB9XG4gICAgZ2V0IEFycmF5VHlwZSgpIHsgcmV0dXJuIHRoaXMudHlwZS5BcnJheVR5cGU7IH1cbiAgICBnZXQgYnVmZmVycygpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLnZhbHVlT2Zmc2V0cywgdGhpcy52YWx1ZXMsIHRoaXMubnVsbEJpdG1hcCwgdGhpcy50eXBlSWRzXTtcbiAgICB9XG4gICAgZ2V0IGJ5dGVMZW5ndGgoKSB7XG4gICAgICAgIGxldCBieXRlTGVuZ3RoID0gMDtcbiAgICAgICAgY29uc3QgeyB2YWx1ZU9mZnNldHMsIHZhbHVlcywgbnVsbEJpdG1hcCwgdHlwZUlkcyB9ID0gdGhpcztcbiAgICAgICAgdmFsdWVPZmZzZXRzICYmIChieXRlTGVuZ3RoICs9IHZhbHVlT2Zmc2V0cy5ieXRlTGVuZ3RoKTtcbiAgICAgICAgdmFsdWVzICYmIChieXRlTGVuZ3RoICs9IHZhbHVlcy5ieXRlTGVuZ3RoKTtcbiAgICAgICAgbnVsbEJpdG1hcCAmJiAoYnl0ZUxlbmd0aCArPSBudWxsQml0bWFwLmJ5dGVMZW5ndGgpO1xuICAgICAgICB0eXBlSWRzICYmIChieXRlTGVuZ3RoICs9IHR5cGVJZHMuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLnJlZHVjZSgoYnl0ZUxlbmd0aCwgY2hpbGQpID0+IGJ5dGVMZW5ndGggKyBjaGlsZC5ieXRlTGVuZ3RoLCBieXRlTGVuZ3RoKTtcbiAgICB9XG4gICAgZ2V0IG51bGxDb3VudCgpIHtcbiAgICAgICAgbGV0IG51bGxDb3VudCA9IHRoaXMuX251bGxDb3VudDtcbiAgICAgICAgbGV0IG51bGxCaXRtYXA7XG4gICAgICAgIGlmIChudWxsQ291bnQgPD0ga1Vua25vd25OdWxsQ291bnQgJiYgKG51bGxCaXRtYXAgPSB0aGlzLm51bGxCaXRtYXApKSB7XG4gICAgICAgICAgICB0aGlzLl9udWxsQ291bnQgPSBudWxsQ291bnQgPSB0aGlzLmxlbmd0aCAtIHBvcGNudF9iaXRfcmFuZ2UobnVsbEJpdG1hcCwgdGhpcy5vZmZzZXQsIHRoaXMub2Zmc2V0ICsgdGhpcy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsQ291bnQ7XG4gICAgfVxuICAgIGdldFZhbGlkKGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLm51bGxhYmxlICYmIHRoaXMubnVsbENvdW50ID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcG9zID0gdGhpcy5vZmZzZXQgKyBpbmRleDtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMubnVsbEJpdG1hcFtwb3MgPj4gM107XG4gICAgICAgICAgICByZXR1cm4gKHZhbCAmICgxIDw8IChwb3MgJSA4KSkpICE9PSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzZXRWYWxpZChpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgLy8gRG9uJ3QgaW50ZXJhY3Qgdy8gbnVsbEJpdG1hcCBpZiBub3QgbnVsbGFibGVcbiAgICAgICAgaWYgKCF0aGlzLm51bGxhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm8gbnVsbCBiaXRtYXAsIGluaXRpYWxpemUgb25lIG9uIHRoZSBmbHlcbiAgICAgICAgaWYgKCF0aGlzLm51bGxCaXRtYXAgfHwgdGhpcy5udWxsQml0bWFwLmJ5dGVMZW5ndGggPD0gKGluZGV4ID4+IDMpKSB7XG4gICAgICAgICAgICBjb25zdCB7IG51bGxCaXRtYXAgfSA9IHRoaXMuX2NoYW5nZUxlbmd0aEFuZEJhY2tmaWxsTnVsbEJpdG1hcCh0aGlzLmxlbmd0aCk7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHsgbnVsbEJpdG1hcCwgX251bGxDb3VudDogMCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IG51bGxCaXRtYXAsIG9mZnNldCB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgcG9zID0gKG9mZnNldCArIGluZGV4KSA+PiAzO1xuICAgICAgICBjb25zdCBiaXQgPSAob2Zmc2V0ICsgaW5kZXgpICUgODtcbiAgICAgICAgY29uc3QgdmFsID0gKG51bGxCaXRtYXBbcG9zXSA+PiBiaXQpICYgMTtcbiAgICAgICAgLy8gSWYgYHZhbGAgaXMgdHJ1dGh5IGFuZCB0aGUgY3VycmVudCBiaXQgaXMgMCwgZmxpcCBpdCB0byAxIGFuZCBpbmNyZW1lbnQgYF9udWxsQ291bnRgLlxuICAgICAgICAvLyBJZiBgdmFsYCBpcyBmYWxzZXkgYW5kIHRoZSBjdXJyZW50IGJpdCBpcyAxLCBmbGlwIGl0IHRvIDAgYW5kIGRlY3JlbWVudCBgX251bGxDb3VudGAuXG4gICAgICAgIHZhbHVlID8gdmFsID09PSAwICYmICgobnVsbEJpdG1hcFtwb3NdIHw9ICgxIDw8IGJpdCkpLCAodGhpcy5fbnVsbENvdW50ID0gdGhpcy5udWxsQ291bnQgKyAxKSlcbiAgICAgICAgICAgIDogdmFsID09PSAxICYmICgobnVsbEJpdG1hcFtwb3NdICY9IH4oMSA8PCBiaXQpKSwgKHRoaXMuX251bGxDb3VudCA9IHRoaXMubnVsbENvdW50IC0gMSkpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGNsb25lKHR5cGUgPSB0aGlzLnR5cGUsIG9mZnNldCA9IHRoaXMub2Zmc2V0LCBsZW5ndGggPSB0aGlzLmxlbmd0aCwgbnVsbENvdW50ID0gdGhpcy5fbnVsbENvdW50LCBidWZmZXJzID0gdGhpcywgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YSh0eXBlLCBvZmZzZXQsIGxlbmd0aCwgbnVsbENvdW50LCBidWZmZXJzLCBjaGlsZHJlbiwgdGhpcy5kaWN0aW9uYXJ5KTtcbiAgICB9XG4gICAgc2xpY2Uob2Zmc2V0LCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgeyBzdHJpZGUsIHR5cGVJZCwgY2hpbGRyZW4gfSA9IHRoaXM7XG4gICAgICAgIC8vICt0cnVlID09PSAxLCArZmFsc2UgPT09IDAsIHNvIHRoaXMgbWVhbnNcbiAgICAgICAgLy8gd2Uga2VlcCBudWxsQ291bnQgYXQgMCBpZiBpdCdzIGFscmVhZHkgMCxcbiAgICAgICAgLy8gb3RoZXJ3aXNlIHNldCB0byB0aGUgaW52YWxpZGF0ZWQgZmxhZyAtMVxuICAgICAgICBjb25zdCBudWxsQ291bnQgPSArKHRoaXMuX251bGxDb3VudCA9PT0gMCkgLSAxO1xuICAgICAgICBjb25zdCBjaGlsZFN0cmlkZSA9IHR5cGVJZCA9PT0gMTYgLyogRml4ZWRTaXplTGlzdCAqLyA/IHN0cmlkZSA6IDE7XG4gICAgICAgIGNvbnN0IGJ1ZmZlcnMgPSB0aGlzLl9zbGljZUJ1ZmZlcnMob2Zmc2V0LCBsZW5ndGgsIHN0cmlkZSwgdHlwZUlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUodGhpcy50eXBlLCB0aGlzLm9mZnNldCArIG9mZnNldCwgbGVuZ3RoLCBudWxsQ291bnQsIGJ1ZmZlcnMsIFxuICAgICAgICAvLyBEb24ndCBzbGljZSBjaGlsZHJlbiBpZiB3ZSBoYXZlIHZhbHVlIG9mZnNldHMgKHRoZSB2YXJpYWJsZS13aWR0aCB0eXBlcylcbiAgICAgICAgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCB8fCB0aGlzLnZhbHVlT2Zmc2V0cykgPyBjaGlsZHJlbiA6IHRoaXMuX3NsaWNlQ2hpbGRyZW4oY2hpbGRyZW4sIGNoaWxkU3RyaWRlICogb2Zmc2V0LCBjaGlsZFN0cmlkZSAqIGxlbmd0aCkpO1xuICAgIH1cbiAgICBfY2hhbmdlTGVuZ3RoQW5kQmFja2ZpbGxOdWxsQml0bWFwKG5ld0xlbmd0aCkge1xuICAgICAgICBpZiAodGhpcy50eXBlSWQgPT09IFR5cGUuTnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUodGhpcy50eXBlLCAwLCBuZXdMZW5ndGgsIDApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgbGVuZ3RoLCBudWxsQ291bnQgfSA9IHRoaXM7XG4gICAgICAgIC8vIHN0YXJ0IGluaXRpYWxpemVkIHdpdGggMHMgKG51bGxzKSwgdGhlbiBmaWxsIGZyb20gMCB0byBsZW5ndGggd2l0aCAxcyAobm90IG51bGwpXG4gICAgICAgIGNvbnN0IGJpdG1hcCA9IG5ldyBVaW50OEFycmF5KCgobmV3TGVuZ3RoICsgNjMpICYgfjYzKSA+PiAzKS5maWxsKDI1NSwgMCwgbGVuZ3RoID4+IDMpO1xuICAgICAgICAvLyBzZXQgYWxsIHRoZSBiaXRzIGluIHRoZSBsYXN0IGJ5dGUgKHVwIHRvIGJpdCBgbGVuZ3RoIC0gbGVuZ3RoICUgOGApIHRvIDEgKG5vdCBudWxsKVxuICAgICAgICBiaXRtYXBbbGVuZ3RoID4+IDNdID0gKDEgPDwgKGxlbmd0aCAtIChsZW5ndGggJiB+NykpKSAtIDE7XG4gICAgICAgIC8vIGlmIHdlIGhhdmUgYSBudWxsQml0bWFwLCB0cnVuY2F0ZSArIHNsaWNlIGFuZCBzZXQgaXQgb3ZlciB0aGUgcHJlLWZpbGxlZCAxc1xuICAgICAgICBpZiAobnVsbENvdW50ID4gMCkge1xuICAgICAgICAgICAgYml0bWFwLnNldCh0cnVuY2F0ZUJpdG1hcCh0aGlzLm9mZnNldCwgbGVuZ3RoLCB0aGlzLm51bGxCaXRtYXApLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBidWZmZXJzID0gdGhpcy5idWZmZXJzO1xuICAgICAgICBidWZmZXJzW0J1ZmZlclR5cGUuVkFMSURJVFldID0gYml0bWFwO1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSh0aGlzLnR5cGUsIDAsIG5ld0xlbmd0aCwgbnVsbENvdW50ICsgKG5ld0xlbmd0aCAtIGxlbmd0aCksIGJ1ZmZlcnMpO1xuICAgIH1cbiAgICBfc2xpY2VCdWZmZXJzKG9mZnNldCwgbGVuZ3RoLCBzdHJpZGUsIHR5cGVJZCkge1xuICAgICAgICBsZXQgYXJyO1xuICAgICAgICBjb25zdCB7IGJ1ZmZlcnMgfSA9IHRoaXM7XG4gICAgICAgIC8vIElmIHR5cGVJZHMgZXhpc3QsIHNsaWNlIHRoZSB0eXBlSWRzIGJ1ZmZlclxuICAgICAgICAoYXJyID0gYnVmZmVyc1tCdWZmZXJUeXBlLlRZUEVdKSAmJiAoYnVmZmVyc1tCdWZmZXJUeXBlLlRZUEVdID0gYXJyLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKSk7XG4gICAgICAgIC8vIElmIG9mZnNldHMgZXhpc3QsIG9ubHkgc2xpY2UgdGhlIG9mZnNldHMgYnVmZmVyXG4gICAgICAgIChhcnIgPSBidWZmZXJzW0J1ZmZlclR5cGUuT0ZGU0VUXSkgJiYgKGJ1ZmZlcnNbQnVmZmVyVHlwZS5PRkZTRVRdID0gYXJyLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoICsgMSkpIHx8XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UgaWYgbm8gb2Zmc2V0cywgc2xpY2UgdGhlIGRhdGEgYnVmZmVyLiBEb24ndCBzbGljZSB0aGUgZGF0YSB2ZWN0b3IgZm9yIEJvb2xlYW5zLCBzaW5jZSB0aGUgb2Zmc2V0IGdvZXMgYnkgYml0cyBub3QgYnl0ZXNcbiAgICAgICAgICAgIChhcnIgPSBidWZmZXJzW0J1ZmZlclR5cGUuREFUQV0pICYmIChidWZmZXJzW0J1ZmZlclR5cGUuREFUQV0gPSB0eXBlSWQgPT09IDYgPyBhcnIgOiBhcnIuc3ViYXJyYXkoc3RyaWRlICogb2Zmc2V0LCBzdHJpZGUgKiAob2Zmc2V0ICsgbGVuZ3RoKSkpO1xuICAgICAgICByZXR1cm4gYnVmZmVycztcbiAgICB9XG4gICAgX3NsaWNlQ2hpbGRyZW4oY2hpbGRyZW4sIG9mZnNldCwgbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBjaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiBjaGlsZC5zbGljZShvZmZzZXQsIGxlbmd0aCkpO1xuICAgIH1cbn1cbkRhdGEucHJvdG90eXBlLmNoaWxkcmVuID0gT2JqZWN0LmZyZWV6ZShbXSk7XG5pbXBvcnQgeyBWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yLm1qcyc7XG5pbXBvcnQgeyB0b0FycmF5QnVmZmVyVmlldywgdG9JbnQzMkFycmF5LCB0b1VpbnQ4QXJyYXkgfSBmcm9tICcuL3V0aWwvYnVmZmVyLm1qcyc7XG5jbGFzcyBNYWtlRGF0YVZpc2l0b3IgZXh0ZW5kcyBWaXNpdG9yIHtcbiAgICB2aXNpdChwcm9wcykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRWaXNpdEZuKHByb3BzWyd0eXBlJ10pLmNhbGwodGhpcywgcHJvcHMpO1xuICAgIH1cbiAgICB2aXNpdE51bGwocHJvcHMpIHtcbiAgICAgICAgY29uc3QgeyBbJ3R5cGUnXTogdHlwZSwgWydvZmZzZXQnXTogb2Zmc2V0ID0gMCwgWydsZW5ndGgnXTogbGVuZ3RoID0gMCwgfSA9IHByb3BzO1xuICAgICAgICByZXR1cm4gbmV3IERhdGEodHlwZSwgb2Zmc2V0LCBsZW5ndGgsIDApO1xuICAgIH1cbiAgICB2aXNpdEJvb2wocHJvcHMpIHtcbiAgICAgICAgY29uc3QgeyBbJ3R5cGUnXTogdHlwZSwgWydvZmZzZXQnXTogb2Zmc2V0ID0gMCB9ID0gcHJvcHM7XG4gICAgICAgIGNvbnN0IG51bGxCaXRtYXAgPSB0b1VpbnQ4QXJyYXkocHJvcHNbJ251bGxCaXRtYXAnXSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0b0FycmF5QnVmZmVyVmlldyh0eXBlLkFycmF5VHlwZSwgcHJvcHNbJ2RhdGEnXSk7XG4gICAgICAgIGNvbnN0IHsgWydsZW5ndGgnXTogbGVuZ3RoID0gZGF0YS5sZW5ndGggPj4gMywgWydudWxsQ291bnQnXTogbnVsbENvdW50ID0gcHJvcHNbJ251bGxCaXRtYXAnXSA/IC0xIDogMCwgfSA9IHByb3BzO1xuICAgICAgICByZXR1cm4gbmV3IERhdGEodHlwZSwgb2Zmc2V0LCBsZW5ndGgsIG51bGxDb3VudCwgW3VuZGVmaW5lZCwgZGF0YSwgbnVsbEJpdG1hcF0pO1xuICAgIH1cbiAgICB2aXNpdEludChwcm9wcykge1xuICAgICAgICBjb25zdCB7IFsndHlwZSddOiB0eXBlLCBbJ29mZnNldCddOiBvZmZzZXQgPSAwIH0gPSBwcm9wcztcbiAgICAgICAgY29uc3QgbnVsbEJpdG1hcCA9IHRvVWludDhBcnJheShwcm9wc1snbnVsbEJpdG1hcCddKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRvQXJyYXlCdWZmZXJWaWV3KHR5cGUuQXJyYXlUeXBlLCBwcm9wc1snZGF0YSddKTtcbiAgICAgICAgY29uc3QgeyBbJ2xlbmd0aCddOiBsZW5ndGggPSBkYXRhLmxlbmd0aCwgWydudWxsQ291bnQnXTogbnVsbENvdW50ID0gcHJvcHNbJ251bGxCaXRtYXAnXSA/IC0xIDogMCwgfSA9IHByb3BzO1xuICAgICAgICByZXR1cm4gbmV3IERhdGEodHlwZSwgb2Zmc2V0LCBsZW5ndGgsIG51bGxDb3VudCwgW3VuZGVmaW5lZCwgZGF0YSwgbnVsbEJpdG1hcF0pO1xuICAgIH1cbiAgICB2aXNpdEZsb2F0KHByb3BzKSB7XG4gICAgICAgIGNvbnN0IHsgWyd0eXBlJ106IHR5cGUsIFsnb2Zmc2V0J106IG9mZnNldCA9IDAgfSA9IHByb3BzO1xuICAgICAgICBjb25zdCBudWxsQml0bWFwID0gdG9VaW50OEFycmF5KHByb3BzWydudWxsQml0bWFwJ10pO1xuICAgICAgICBjb25zdCBkYXRhID0gdG9BcnJheUJ1ZmZlclZpZXcodHlwZS5BcnJheVR5cGUsIHByb3BzWydkYXRhJ10pO1xuICAgICAgICBjb25zdCB7IFsnbGVuZ3RoJ106IGxlbmd0aCA9IGRhdGEubGVuZ3RoLCBbJ251bGxDb3VudCddOiBudWxsQ291bnQgPSBwcm9wc1snbnVsbEJpdG1hcCddID8gLTEgOiAwLCB9ID0gcHJvcHM7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YSh0eXBlLCBvZmZzZXQsIGxlbmd0aCwgbnVsbENvdW50LCBbdW5kZWZpbmVkLCBkYXRhLCBudWxsQml0bWFwXSk7XG4gICAgfVxuICAgIHZpc2l0VXRmOChwcm9wcykge1xuICAgICAgICBjb25zdCB7IFsndHlwZSddOiB0eXBlLCBbJ29mZnNldCddOiBvZmZzZXQgPSAwIH0gPSBwcm9wcztcbiAgICAgICAgY29uc3QgZGF0YSA9IHRvVWludDhBcnJheShwcm9wc1snZGF0YSddKTtcbiAgICAgICAgY29uc3QgbnVsbEJpdG1hcCA9IHRvVWludDhBcnJheShwcm9wc1snbnVsbEJpdG1hcCddKTtcbiAgICAgICAgY29uc3QgdmFsdWVPZmZzZXRzID0gdG9JbnQzMkFycmF5KHByb3BzWyd2YWx1ZU9mZnNldHMnXSk7XG4gICAgICAgIGNvbnN0IHsgWydsZW5ndGgnXTogbGVuZ3RoID0gdmFsdWVPZmZzZXRzLmxlbmd0aCAtIDEsIFsnbnVsbENvdW50J106IG51bGxDb3VudCA9IHByb3BzWydudWxsQml0bWFwJ10gPyAtMSA6IDAgfSA9IHByb3BzO1xuICAgICAgICByZXR1cm4gbmV3IERhdGEodHlwZSwgb2Zmc2V0LCBsZW5ndGgsIG51bGxDb3VudCwgW3ZhbHVlT2Zmc2V0cywgZGF0YSwgbnVsbEJpdG1hcF0pO1xuICAgIH1cbiAgICB2aXNpdEJpbmFyeShwcm9wcykge1xuICAgICAgICBjb25zdCB7IFsndHlwZSddOiB0eXBlLCBbJ29mZnNldCddOiBvZmZzZXQgPSAwIH0gPSBwcm9wcztcbiAgICAgICAgY29uc3QgZGF0YSA9IHRvVWludDhBcnJheShwcm9wc1snZGF0YSddKTtcbiAgICAgICAgY29uc3QgbnVsbEJpdG1hcCA9IHRvVWludDhBcnJheShwcm9wc1snbnVsbEJpdG1hcCddKTtcbiAgICAgICAgY29uc3QgdmFsdWVPZmZzZXRzID0gdG9JbnQzMkFycmF5KHByb3BzWyd2YWx1ZU9mZnNldHMnXSk7XG4gICAgICAgIGNvbnN0IHsgWydsZW5ndGgnXTogbGVuZ3RoID0gdmFsdWVPZmZzZXRzLmxlbmd0aCAtIDEsIFsnbnVsbENvdW50J106IG51bGxDb3VudCA9IHByb3BzWydudWxsQml0bWFwJ10gPyAtMSA6IDAgfSA9IHByb3BzO1xuICAgICAgICByZXR1cm4gbmV3IERhdGEodHlwZSwgb2Zmc2V0LCBsZW5ndGgsIG51bGxDb3VudCwgW3ZhbHVlT2Zmc2V0cywgZGF0YSwgbnVsbEJpdG1hcF0pO1xuICAgIH1cbiAgICB2aXNpdEZpeGVkU2l6ZUJpbmFyeShwcm9wcykge1xuICAgICAgICBjb25zdCB7IFsndHlwZSddOiB0eXBlLCBbJ29mZnNldCddOiBvZmZzZXQgPSAwIH0gPSBwcm9wcztcbiAgICAgICAgY29uc3QgbnVsbEJpdG1hcCA9IHRvVWludDhBcnJheShwcm9wc1snbnVsbEJpdG1hcCddKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRvQXJyYXlCdWZmZXJWaWV3KHR5cGUuQXJyYXlUeXBlLCBwcm9wc1snZGF0YSddKTtcbiAgICAgICAgY29uc3QgeyBbJ2xlbmd0aCddOiBsZW5ndGggPSBkYXRhLmxlbmd0aCAvIHN0cmlkZUZvclR5cGUodHlwZSksIFsnbnVsbENvdW50J106IG51bGxDb3VudCA9IHByb3BzWydudWxsQml0bWFwJ10gPyAtMSA6IDAsIH0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhKHR5cGUsIG9mZnNldCwgbGVuZ3RoLCBudWxsQ291bnQsIFt1bmRlZmluZWQsIGRhdGEsIG51bGxCaXRtYXBdKTtcbiAgICB9XG4gICAgdmlzaXREYXRlKHByb3BzKSB7XG4gICAgICAgIGNvbnN0IHsgWyd0eXBlJ106IHR5cGUsIFsnb2Zmc2V0J106IG9mZnNldCA9IDAgfSA9IHByb3BzO1xuICAgICAgICBjb25zdCBudWxsQml0bWFwID0gdG9VaW50OEFycmF5KHByb3BzWydudWxsQml0bWFwJ10pO1xuICAgICAgICBjb25zdCBkYXRhID0gdG9BcnJheUJ1ZmZlclZpZXcodHlwZS5BcnJheVR5cGUsIHByb3BzWydkYXRhJ10pO1xuICAgICAgICBjb25zdCB7IFsnbGVuZ3RoJ106IGxlbmd0aCA9IGRhdGEubGVuZ3RoIC8gc3RyaWRlRm9yVHlwZSh0eXBlKSwgWydudWxsQ291bnQnXTogbnVsbENvdW50ID0gcHJvcHNbJ251bGxCaXRtYXAnXSA/IC0xIDogMCwgfSA9IHByb3BzO1xuICAgICAgICByZXR1cm4gbmV3IERhdGEodHlwZSwgb2Zmc2V0LCBsZW5ndGgsIG51bGxDb3VudCwgW3VuZGVmaW5lZCwgZGF0YSwgbnVsbEJpdG1hcF0pO1xuICAgIH1cbiAgICB2aXNpdFRpbWVzdGFtcChwcm9wcykge1xuICAgICAgICBjb25zdCB7IFsndHlwZSddOiB0eXBlLCBbJ29mZnNldCddOiBvZmZzZXQgPSAwIH0gPSBwcm9wcztcbiAgICAgICAgY29uc3QgbnVsbEJpdG1hcCA9IHRvVWludDhBcnJheShwcm9wc1snbnVsbEJpdG1hcCddKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRvQXJyYXlCdWZmZXJWaWV3KHR5cGUuQXJyYXlUeXBlLCBwcm9wc1snZGF0YSddKTtcbiAgICAgICAgY29uc3QgeyBbJ2xlbmd0aCddOiBsZW5ndGggPSBkYXRhLmxlbmd0aCAvIHN0cmlkZUZvclR5cGUodHlwZSksIFsnbnVsbENvdW50J106IG51bGxDb3VudCA9IHByb3BzWydudWxsQml0bWFwJ10gPyAtMSA6IDAsIH0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhKHR5cGUsIG9mZnNldCwgbGVuZ3RoLCBudWxsQ291bnQsIFt1bmRlZmluZWQsIGRhdGEsIG51bGxCaXRtYXBdKTtcbiAgICB9XG4gICAgdmlzaXRUaW1lKHByb3BzKSB7XG4gICAgICAgIGNvbnN0IHsgWyd0eXBlJ106IHR5cGUsIFsnb2Zmc2V0J106IG9mZnNldCA9IDAgfSA9IHByb3BzO1xuICAgICAgICBjb25zdCBudWxsQml0bWFwID0gdG9VaW50OEFycmF5KHByb3BzWydudWxsQml0bWFwJ10pO1xuICAgICAgICBjb25zdCBkYXRhID0gdG9BcnJheUJ1ZmZlclZpZXcodHlwZS5BcnJheVR5cGUsIHByb3BzWydkYXRhJ10pO1xuICAgICAgICBjb25zdCB7IFsnbGVuZ3RoJ106IGxlbmd0aCA9IGRhdGEubGVuZ3RoIC8gc3RyaWRlRm9yVHlwZSh0eXBlKSwgWydudWxsQ291bnQnXTogbnVsbENvdW50ID0gcHJvcHNbJ251bGxCaXRtYXAnXSA/IC0xIDogMCwgfSA9IHByb3BzO1xuICAgICAgICByZXR1cm4gbmV3IERhdGEodHlwZSwgb2Zmc2V0LCBsZW5ndGgsIG51bGxDb3VudCwgW3VuZGVmaW5lZCwgZGF0YSwgbnVsbEJpdG1hcF0pO1xuICAgIH1cbiAgICB2aXNpdERlY2ltYWwocHJvcHMpIHtcbiAgICAgICAgY29uc3QgeyBbJ3R5cGUnXTogdHlwZSwgWydvZmZzZXQnXTogb2Zmc2V0ID0gMCB9ID0gcHJvcHM7XG4gICAgICAgIGNvbnN0IG51bGxCaXRtYXAgPSB0b1VpbnQ4QXJyYXkocHJvcHNbJ251bGxCaXRtYXAnXSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0b0FycmF5QnVmZmVyVmlldyh0eXBlLkFycmF5VHlwZSwgcHJvcHNbJ2RhdGEnXSk7XG4gICAgICAgIGNvbnN0IHsgWydsZW5ndGgnXTogbGVuZ3RoID0gZGF0YS5sZW5ndGggLyBzdHJpZGVGb3JUeXBlKHR5cGUpLCBbJ251bGxDb3VudCddOiBudWxsQ291bnQgPSBwcm9wc1snbnVsbEJpdG1hcCddID8gLTEgOiAwLCB9ID0gcHJvcHM7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YSh0eXBlLCBvZmZzZXQsIGxlbmd0aCwgbnVsbENvdW50LCBbdW5kZWZpbmVkLCBkYXRhLCBudWxsQml0bWFwXSk7XG4gICAgfVxuICAgIHZpc2l0TGlzdChwcm9wcykge1xuICAgICAgICBjb25zdCB7IFsndHlwZSddOiB0eXBlLCBbJ29mZnNldCddOiBvZmZzZXQgPSAwLCBbJ2NoaWxkJ106IGNoaWxkIH0gPSBwcm9wcztcbiAgICAgICAgY29uc3QgbnVsbEJpdG1hcCA9IHRvVWludDhBcnJheShwcm9wc1snbnVsbEJpdG1hcCddKTtcbiAgICAgICAgY29uc3QgdmFsdWVPZmZzZXRzID0gdG9JbnQzMkFycmF5KHByb3BzWyd2YWx1ZU9mZnNldHMnXSk7XG4gICAgICAgIGNvbnN0IHsgWydsZW5ndGgnXTogbGVuZ3RoID0gdmFsdWVPZmZzZXRzLmxlbmd0aCAtIDEsIFsnbnVsbENvdW50J106IG51bGxDb3VudCA9IHByb3BzWydudWxsQml0bWFwJ10gPyAtMSA6IDAgfSA9IHByb3BzO1xuICAgICAgICByZXR1cm4gbmV3IERhdGEodHlwZSwgb2Zmc2V0LCBsZW5ndGgsIG51bGxDb3VudCwgW3ZhbHVlT2Zmc2V0cywgdW5kZWZpbmVkLCBudWxsQml0bWFwXSwgW2NoaWxkXSk7XG4gICAgfVxuICAgIHZpc2l0U3RydWN0KHByb3BzKSB7XG4gICAgICAgIGNvbnN0IHsgWyd0eXBlJ106IHR5cGUsIFsnb2Zmc2V0J106IG9mZnNldCA9IDAsIFsnY2hpbGRyZW4nXTogY2hpbGRyZW4gPSBbXSB9ID0gcHJvcHM7XG4gICAgICAgIGNvbnN0IG51bGxCaXRtYXAgPSB0b1VpbnQ4QXJyYXkocHJvcHNbJ251bGxCaXRtYXAnXSk7XG4gICAgICAgIGNvbnN0IHsgbGVuZ3RoID0gY2hpbGRyZW4ucmVkdWNlKChsZW4sIHsgbGVuZ3RoIH0pID0+IE1hdGgubWF4KGxlbiwgbGVuZ3RoKSwgMCksIG51bGxDb3VudCA9IHByb3BzWydudWxsQml0bWFwJ10gPyAtMSA6IDAgfSA9IHByb3BzO1xuICAgICAgICByZXR1cm4gbmV3IERhdGEodHlwZSwgb2Zmc2V0LCBsZW5ndGgsIG51bGxDb3VudCwgW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCBudWxsQml0bWFwXSwgY2hpbGRyZW4pO1xuICAgIH1cbiAgICB2aXNpdFVuaW9uKHByb3BzKSB7XG4gICAgICAgIGNvbnN0IHsgWyd0eXBlJ106IHR5cGUsIFsnb2Zmc2V0J106IG9mZnNldCA9IDAsIFsnY2hpbGRyZW4nXTogY2hpbGRyZW4gPSBbXSB9ID0gcHJvcHM7XG4gICAgICAgIGNvbnN0IG51bGxCaXRtYXAgPSB0b1VpbnQ4QXJyYXkocHJvcHNbJ251bGxCaXRtYXAnXSk7XG4gICAgICAgIGNvbnN0IHR5cGVJZHMgPSB0b0FycmF5QnVmZmVyVmlldyh0eXBlLkFycmF5VHlwZSwgcHJvcHNbJ3R5cGVJZHMnXSk7XG4gICAgICAgIGNvbnN0IHsgWydsZW5ndGgnXTogbGVuZ3RoID0gdHlwZUlkcy5sZW5ndGgsIFsnbnVsbENvdW50J106IG51bGxDb3VudCA9IHByb3BzWydudWxsQml0bWFwJ10gPyAtMSA6IDAsIH0gPSBwcm9wcztcbiAgICAgICAgaWYgKERhdGFUeXBlLmlzU3BhcnNlVW5pb24odHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YSh0eXBlLCBvZmZzZXQsIGxlbmd0aCwgbnVsbENvdW50LCBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIG51bGxCaXRtYXAsIHR5cGVJZHNdLCBjaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWVPZmZzZXRzID0gdG9JbnQzMkFycmF5KHByb3BzWyd2YWx1ZU9mZnNldHMnXSk7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YSh0eXBlLCBvZmZzZXQsIGxlbmd0aCwgbnVsbENvdW50LCBbdmFsdWVPZmZzZXRzLCB1bmRlZmluZWQsIG51bGxCaXRtYXAsIHR5cGVJZHNdLCBjaGlsZHJlbik7XG4gICAgfVxuICAgIHZpc2l0RGljdGlvbmFyeShwcm9wcykge1xuICAgICAgICBjb25zdCB7IFsndHlwZSddOiB0eXBlLCBbJ29mZnNldCddOiBvZmZzZXQgPSAwIH0gPSBwcm9wcztcbiAgICAgICAgY29uc3QgbnVsbEJpdG1hcCA9IHRvVWludDhBcnJheShwcm9wc1snbnVsbEJpdG1hcCddKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRvQXJyYXlCdWZmZXJWaWV3KHR5cGUuaW5kaWNlcy5BcnJheVR5cGUsIHByb3BzWydkYXRhJ10pO1xuICAgICAgICBjb25zdCB7IFsnZGljdGlvbmFyeSddOiBkaWN0aW9uYXJ5ID0gbmV3IFZlY3RvcihbbmV3IE1ha2VEYXRhVmlzaXRvcigpLnZpc2l0KHsgdHlwZTogdHlwZS5kaWN0aW9uYXJ5IH0pXSkgfSA9IHByb3BzO1xuICAgICAgICBjb25zdCB7IFsnbGVuZ3RoJ106IGxlbmd0aCA9IGRhdGEubGVuZ3RoLCBbJ251bGxDb3VudCddOiBudWxsQ291bnQgPSBwcm9wc1snbnVsbEJpdG1hcCddID8gLTEgOiAwIH0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhKHR5cGUsIG9mZnNldCwgbGVuZ3RoLCBudWxsQ291bnQsIFt1bmRlZmluZWQsIGRhdGEsIG51bGxCaXRtYXBdLCBbXSwgZGljdGlvbmFyeSk7XG4gICAgfVxuICAgIHZpc2l0SW50ZXJ2YWwocHJvcHMpIHtcbiAgICAgICAgY29uc3QgeyBbJ3R5cGUnXTogdHlwZSwgWydvZmZzZXQnXTogb2Zmc2V0ID0gMCB9ID0gcHJvcHM7XG4gICAgICAgIGNvbnN0IG51bGxCaXRtYXAgPSB0b1VpbnQ4QXJyYXkocHJvcHNbJ251bGxCaXRtYXAnXSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0b0FycmF5QnVmZmVyVmlldyh0eXBlLkFycmF5VHlwZSwgcHJvcHNbJ2RhdGEnXSk7XG4gICAgICAgIGNvbnN0IHsgWydsZW5ndGgnXTogbGVuZ3RoID0gZGF0YS5sZW5ndGggLyBzdHJpZGVGb3JUeXBlKHR5cGUpLCBbJ251bGxDb3VudCddOiBudWxsQ291bnQgPSBwcm9wc1snbnVsbEJpdG1hcCddID8gLTEgOiAwLCB9ID0gcHJvcHM7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YSh0eXBlLCBvZmZzZXQsIGxlbmd0aCwgbnVsbENvdW50LCBbdW5kZWZpbmVkLCBkYXRhLCBudWxsQml0bWFwXSk7XG4gICAgfVxuICAgIHZpc2l0Rml4ZWRTaXplTGlzdChwcm9wcykge1xuICAgICAgICBjb25zdCB7IFsndHlwZSddOiB0eXBlLCBbJ29mZnNldCddOiBvZmZzZXQgPSAwLCBbJ2NoaWxkJ106IGNoaWxkID0gbmV3IE1ha2VEYXRhVmlzaXRvcigpLnZpc2l0KHsgdHlwZTogdHlwZS52YWx1ZVR5cGUgfSkgfSA9IHByb3BzO1xuICAgICAgICBjb25zdCBudWxsQml0bWFwID0gdG9VaW50OEFycmF5KHByb3BzWydudWxsQml0bWFwJ10pO1xuICAgICAgICBjb25zdCB7IFsnbGVuZ3RoJ106IGxlbmd0aCA9IGNoaWxkLmxlbmd0aCAvIHN0cmlkZUZvclR5cGUodHlwZSksIFsnbnVsbENvdW50J106IG51bGxDb3VudCA9IHByb3BzWydudWxsQml0bWFwJ10gPyAtMSA6IDAgfSA9IHByb3BzO1xuICAgICAgICByZXR1cm4gbmV3IERhdGEodHlwZSwgb2Zmc2V0LCBsZW5ndGgsIG51bGxDb3VudCwgW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCBudWxsQml0bWFwXSwgW2NoaWxkXSk7XG4gICAgfVxuICAgIHZpc2l0TWFwKHByb3BzKSB7XG4gICAgICAgIGNvbnN0IHsgWyd0eXBlJ106IHR5cGUsIFsnb2Zmc2V0J106IG9mZnNldCA9IDAsIFsnY2hpbGQnXTogY2hpbGQgPSBuZXcgTWFrZURhdGFWaXNpdG9yKCkudmlzaXQoeyB0eXBlOiB0eXBlLmNoaWxkVHlwZSB9KSB9ID0gcHJvcHM7XG4gICAgICAgIGNvbnN0IG51bGxCaXRtYXAgPSB0b1VpbnQ4QXJyYXkocHJvcHNbJ251bGxCaXRtYXAnXSk7XG4gICAgICAgIGNvbnN0IHZhbHVlT2Zmc2V0cyA9IHRvSW50MzJBcnJheShwcm9wc1sndmFsdWVPZmZzZXRzJ10pO1xuICAgICAgICBjb25zdCB7IFsnbGVuZ3RoJ106IGxlbmd0aCA9IHZhbHVlT2Zmc2V0cy5sZW5ndGggLSAxLCBbJ251bGxDb3VudCddOiBudWxsQ291bnQgPSBwcm9wc1snbnVsbEJpdG1hcCddID8gLTEgOiAwLCB9ID0gcHJvcHM7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YSh0eXBlLCBvZmZzZXQsIGxlbmd0aCwgbnVsbENvdW50LCBbdmFsdWVPZmZzZXRzLCB1bmRlZmluZWQsIG51bGxCaXRtYXBdLCBbY2hpbGRdKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gbWFrZURhdGEocHJvcHMpIHtcbiAgICByZXR1cm4gbmV3IE1ha2VEYXRhVmlzaXRvcigpLnZpc2l0KHByb3BzKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YS5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbi8vLy9cbi8vXG4vLyBBIGZldyBlbnVtcyBjb3BpZWQgZnJvbSBgZmIvU2NoZW1hLnRzYCBhbmQgYGZiL01lc3NhZ2UudHNgIGJlY2F1c2UgV2VicGFja1xuLy8gdjQgZG9lc24ndCBzZWVtIHRvIGJlIGFibGUgdG8gdHJlZS1zaGFrZSB0aGUgcmVzdCBvZiB0aG9zZSBleHBvcnRzLlxuLy9cbi8vIFdlIHdpbGwgaGF2ZSB0byBrZWVwIHRoZXNlIGVudW1zIGluIHN5bmMgd2hlbiB3ZSByZS1nZW5lcmF0ZSB0aGUgZmxhdGJ1ZmZlcnNcbi8vIGNvZGUgZnJvbSB0aGUgc2hjaGVtYXMuIFNlZSBqcy9ERVZFTE9QLm1kIGZvciBpbmZvIG9uIGhvdyB0byBydW4gZmxhdGJ1ZmZlcnNcbi8vIGNvZGUgZ2VuZXJhdGlvbi5cbi8vXG4vLy8vXG4vKipcbiAqIExvZ2ljYWwgdHlwZXMsIHZlY3RvciBsYXlvdXRzLCBhbmQgc2NoZW1hc1xuICpcbiAqIEBlbnVtIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCB2YXIgTWV0YWRhdGFWZXJzaW9uO1xuKGZ1bmN0aW9uIChNZXRhZGF0YVZlcnNpb24pIHtcbiAgICAvKipcbiAgICAgKiAwLjEuMCAoT2N0b2JlciAyMDE2KS5cbiAgICAgKi9cbiAgICBNZXRhZGF0YVZlcnNpb25bTWV0YWRhdGFWZXJzaW9uW1wiVjFcIl0gPSAwXSA9IFwiVjFcIjtcbiAgICAvKipcbiAgICAgKiAwLjIuMCAoRmVicnVhcnkgMjAxNykuIE5vbi1iYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIFYxLlxuICAgICAqL1xuICAgIE1ldGFkYXRhVmVyc2lvbltNZXRhZGF0YVZlcnNpb25bXCJWMlwiXSA9IDFdID0gXCJWMlwiO1xuICAgIC8qKlxuICAgICAqIDAuMy4wIC0+IDAuNy4xIChNYXkgLSBEZWNlbWJlciAyMDE3KS4gTm9uLWJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggVjIuXG4gICAgICovXG4gICAgTWV0YWRhdGFWZXJzaW9uW01ldGFkYXRhVmVyc2lvbltcIlYzXCJdID0gMl0gPSBcIlYzXCI7XG4gICAgLyoqXG4gICAgICogPj0gMC44LjAgKERlY2VtYmVyIDIwMTcpLiBOb24tYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBWMy5cbiAgICAgKi9cbiAgICBNZXRhZGF0YVZlcnNpb25bTWV0YWRhdGFWZXJzaW9uW1wiVjRcIl0gPSAzXSA9IFwiVjRcIjtcbiAgICAvKipcbiAgICAgKiA+PSAxLjAuMCAoSnVseSAyMDIwLiBCYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIFY0IChWNSByZWFkZXJzIGNhbiByZWFkIFY0XG4gICAgICogbWV0YWRhdGEgYW5kIElQQyBtZXNzYWdlcykuIEltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gcHJvdmlkZSBhXG4gICAgICogVjQgY29tcGF0aWJpbGl0eSBtb2RlIHdpdGggVjUgZm9ybWF0IGNoYW5nZXMgZGlzYWJsZWQuXG4gICAgICpcbiAgICAgKiBJbmNvbXBhdGlibGUgY2hhbmdlcyBiZXR3ZWVuIFY0IGFuZCBWNTpcbiAgICAgKiAtIFVuaW9uIGJ1ZmZlciBsYXlvdXQgaGFzIGNoYW5nZWQuIEluIFY1LCBVbmlvbnMgZG9uJ3QgaGF2ZSBhIHZhbGlkaXR5XG4gICAgICogICBiaXRtYXAgYnVmZmVyLlxuICAgICAqL1xuICAgIE1ldGFkYXRhVmVyc2lvbltNZXRhZGF0YVZlcnNpb25bXCJWNVwiXSA9IDRdID0gXCJWNVwiO1xufSkoTWV0YWRhdGFWZXJzaW9uIHx8IChNZXRhZGF0YVZlcnNpb24gPSB7fSkpO1xuLyoqXG4gKiBAZW51bSB7bnVtYmVyfVxuICovXG5leHBvcnQgdmFyIFVuaW9uTW9kZTtcbihmdW5jdGlvbiAoVW5pb25Nb2RlKSB7XG4gICAgVW5pb25Nb2RlW1VuaW9uTW9kZVtcIlNwYXJzZVwiXSA9IDBdID0gXCJTcGFyc2VcIjtcbiAgICBVbmlvbk1vZGVbVW5pb25Nb2RlW1wiRGVuc2VcIl0gPSAxXSA9IFwiRGVuc2VcIjtcbn0pKFVuaW9uTW9kZSB8fCAoVW5pb25Nb2RlID0ge30pKTtcbi8qKlxuICogQGVudW0ge251bWJlcn1cbiAqL1xuZXhwb3J0IHZhciBQcmVjaXNpb247XG4oZnVuY3Rpb24gKFByZWNpc2lvbikge1xuICAgIFByZWNpc2lvbltQcmVjaXNpb25bXCJIQUxGXCJdID0gMF0gPSBcIkhBTEZcIjtcbiAgICBQcmVjaXNpb25bUHJlY2lzaW9uW1wiU0lOR0xFXCJdID0gMV0gPSBcIlNJTkdMRVwiO1xuICAgIFByZWNpc2lvbltQcmVjaXNpb25bXCJET1VCTEVcIl0gPSAyXSA9IFwiRE9VQkxFXCI7XG59KShQcmVjaXNpb24gfHwgKFByZWNpc2lvbiA9IHt9KSk7XG4vKipcbiAqIEBlbnVtIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCB2YXIgRGF0ZVVuaXQ7XG4oZnVuY3Rpb24gKERhdGVVbml0KSB7XG4gICAgRGF0ZVVuaXRbRGF0ZVVuaXRbXCJEQVlcIl0gPSAwXSA9IFwiREFZXCI7XG4gICAgRGF0ZVVuaXRbRGF0ZVVuaXRbXCJNSUxMSVNFQ09ORFwiXSA9IDFdID0gXCJNSUxMSVNFQ09ORFwiO1xufSkoRGF0ZVVuaXQgfHwgKERhdGVVbml0ID0ge30pKTtcbi8qKlxuICogQGVudW0ge251bWJlcn1cbiAqL1xuZXhwb3J0IHZhciBUaW1lVW5pdDtcbihmdW5jdGlvbiAoVGltZVVuaXQpIHtcbiAgICBUaW1lVW5pdFtUaW1lVW5pdFtcIlNFQ09ORFwiXSA9IDBdID0gXCJTRUNPTkRcIjtcbiAgICBUaW1lVW5pdFtUaW1lVW5pdFtcIk1JTExJU0VDT05EXCJdID0gMV0gPSBcIk1JTExJU0VDT05EXCI7XG4gICAgVGltZVVuaXRbVGltZVVuaXRbXCJNSUNST1NFQ09ORFwiXSA9IDJdID0gXCJNSUNST1NFQ09ORFwiO1xuICAgIFRpbWVVbml0W1RpbWVVbml0W1wiTkFOT1NFQ09ORFwiXSA9IDNdID0gXCJOQU5PU0VDT05EXCI7XG59KShUaW1lVW5pdCB8fCAoVGltZVVuaXQgPSB7fSkpO1xuLyoqXG4gKiBAZW51bSB7bnVtYmVyfVxuICovXG5leHBvcnQgdmFyIEludGVydmFsVW5pdDtcbihmdW5jdGlvbiAoSW50ZXJ2YWxVbml0KSB7XG4gICAgSW50ZXJ2YWxVbml0W0ludGVydmFsVW5pdFtcIllFQVJfTU9OVEhcIl0gPSAwXSA9IFwiWUVBUl9NT05USFwiO1xuICAgIEludGVydmFsVW5pdFtJbnRlcnZhbFVuaXRbXCJEQVlfVElNRVwiXSA9IDFdID0gXCJEQVlfVElNRVwiO1xuICAgIEludGVydmFsVW5pdFtJbnRlcnZhbFVuaXRbXCJNT05USF9EQVlfTkFOT1wiXSA9IDJdID0gXCJNT05USF9EQVlfTkFOT1wiO1xufSkoSW50ZXJ2YWxVbml0IHx8IChJbnRlcnZhbFVuaXQgPSB7fSkpO1xuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBUaGUgcm9vdCBNZXNzYWdlIHR5cGVcbiAqIFRoaXMgdW5pb24gZW5hYmxlcyB1cyB0byBlYXNpbHkgc2VuZCBkaWZmZXJlbnQgbWVzc2FnZSB0eXBlcyB3aXRob3V0XG4gKiByZWR1bmRhbnQgc3RvcmFnZSwgYW5kIGluIHRoZSBmdXR1cmUgd2UgY2FuIGVhc2lseSBhZGQgbmV3IG1lc3NhZ2UgdHlwZXMuXG4gKlxuICogQXJyb3cgaW1wbGVtZW50YXRpb25zIGRvIG5vdCBuZWVkIHRvIGltcGxlbWVudCBhbGwgb2YgdGhlIG1lc3NhZ2UgdHlwZXMsXG4gKiB3aGljaCBtYXkgaW5jbHVkZSBleHBlcmltZW50YWwgbWV0YWRhdGEgdHlwZXMuIEZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHksXG4gKiBpdCBpcyBiZXN0IHRvIHNlbmQgZGF0YSB1c2luZyBSZWNvcmRCYXRjaFxuICpcbiAqIEBlbnVtIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCB2YXIgTWVzc2FnZUhlYWRlcjtcbihmdW5jdGlvbiAoTWVzc2FnZUhlYWRlcikge1xuICAgIE1lc3NhZ2VIZWFkZXJbTWVzc2FnZUhlYWRlcltcIk5PTkVcIl0gPSAwXSA9IFwiTk9ORVwiO1xuICAgIE1lc3NhZ2VIZWFkZXJbTWVzc2FnZUhlYWRlcltcIlNjaGVtYVwiXSA9IDFdID0gXCJTY2hlbWFcIjtcbiAgICBNZXNzYWdlSGVhZGVyW01lc3NhZ2VIZWFkZXJbXCJEaWN0aW9uYXJ5QmF0Y2hcIl0gPSAyXSA9IFwiRGljdGlvbmFyeUJhdGNoXCI7XG4gICAgTWVzc2FnZUhlYWRlcltNZXNzYWdlSGVhZGVyW1wiUmVjb3JkQmF0Y2hcIl0gPSAzXSA9IFwiUmVjb3JkQmF0Y2hcIjtcbiAgICBNZXNzYWdlSGVhZGVyW01lc3NhZ2VIZWFkZXJbXCJUZW5zb3JcIl0gPSA0XSA9IFwiVGVuc29yXCI7XG4gICAgTWVzc2FnZUhlYWRlcltNZXNzYWdlSGVhZGVyW1wiU3BhcnNlVGVuc29yXCJdID0gNV0gPSBcIlNwYXJzZVRlbnNvclwiO1xufSkoTWVzc2FnZUhlYWRlciB8fCAoTWVzc2FnZUhlYWRlciA9IHt9KSk7XG4vKipcbiAqIE1haW4gZGF0YSB0eXBlIGVudW1lcmF0aW9uLlxuICpcbiAqIERhdGEgdHlwZXMgaW4gdGhpcyBsaWJyYXJ5IGFyZSBhbGwgKmxvZ2ljYWwqLiBUaGV5IGNhbiBiZSBleHByZXNzZWQgYXNcbiAqIGVpdGhlciBhIHByaW1pdGl2ZSBwaHlzaWNhbCB0eXBlIChieXRlcyBvciBiaXRzIG9mIHNvbWUgZml4ZWQgc2l6ZSksIGFcbiAqIG5lc3RlZCB0eXBlIGNvbnNpc3Rpbmcgb2Ygb3RoZXIgZGF0YSB0eXBlcywgb3IgYW5vdGhlciBkYXRhIHR5cGUgKGUuZy4gYVxuICogdGltZXN0YW1wIGVuY29kZWQgYXMgYW4gaW50NjQpLlxuICpcbiAqICoqTm90ZSoqOiBPbmx5IGVudW0gdmFsdWVzIDAtMTcgKE5PTkUgdGhyb3VnaCBNYXApIGFyZSB3cml0dGVuIHRvIGFuIEFycm93XG4gKiBJUEMgcGF5bG9hZC5cbiAqXG4gKiBUaGUgcmVzdCBvZiB0aGUgdmFsdWVzIGFyZSBzcGVjaWZpZWQgaGVyZSBzbyBUeXBlU2NyaXB0IGNhbiBuYXJyb3cgdGhlIHR5cGVcbiAqIHNpZ25hdHVyZXMgZnVydGhlciBiZXlvbmQgdGhlIGJhc2UgQXJyb3cgVHlwZXMuIFRoZSBBcnJvdyBEYXRhVHlwZXMgaW5jbHVkZVxuICogbWV0YWRhdGEgbGlrZSBgYml0V2lkdGhgIHRoYXQgaW1wYWN0IHRoZSB0eXBlIHNpZ25hdHVyZXMgb2YgdGhlIHZhbHVlcyB3ZVxuICogYWNjZXB0IGFuZCByZXR1cm4uXG4gKlxuICogRm9yIGV4YW1wbGUsIHRoZSBgSW50OFZlY3RvcmAgcmVhZHMgMS1ieXRlIG51bWJlcnMgZnJvbSBhbiBgSW50OEFycmF5YCwgYW5cbiAqIGBJbnQzMlZlY3RvcmAgcmVhZHMgYSA0LWJ5dGUgbnVtYmVyIGZyb20gYW4gYEludDMyQXJyYXlgLCBhbmQgYW4gYEludDY0VmVjdG9yYFxuICogcmVhZHMgYSBwYWlyIG9mIDQtYnl0ZSBsbywgaGkgMzItYml0IGludGVnZXJzIGFzIGEgemVyby1jb3B5IHNsaWNlIGZyb20gdGhlXG4gKiB1bmRlcmx5aW5nIGBJbnQzMkFycmF5YC5cbiAqXG4gKiBMaWJyYXJ5IGNvbnN1bWVycyBiZW5lZml0IGJ5IGtub3dpbmcgdGhlIG5hcnJvd2VzdCB0eXBlLCBzaW5jZSB3ZSBjYW4gZW5zdXJlXG4gKiB0aGUgdHlwZXMgYWNyb3NzIGFsbCBwdWJsaWMgbWV0aG9kcyBhcmUgcHJvcGFnYXRlZCwgYW5kIG5ldmVyIGJhaWwgdG8gYGFueWAuXG4gKiBUaGVzZSB2YWx1ZXMgYXJlIF9uZXZlcl8gdXNlZCBhdCBydW50aW1lLCBhbmQgdGhleSB3aWxsIF9uZXZlcl8gYmUgd3JpdHRlblxuICogdG8gdGhlIGZsYXRidWZmZXJzIG1ldGFkYXRhIG9mIHNlcmlhbGl6ZWQgQXJyb3cgSVBDIHBheWxvYWRzLlxuICovXG5leHBvcnQgdmFyIFR5cGU7XG4oZnVuY3Rpb24gKFR5cGUpIHtcbiAgICBUeXBlW1R5cGVbXCJOT05FXCJdID0gMF0gPSBcIk5PTkVcIjtcbiAgICBUeXBlW1R5cGVbXCJOdWxsXCJdID0gMV0gPSBcIk51bGxcIjtcbiAgICBUeXBlW1R5cGVbXCJJbnRcIl0gPSAyXSA9IFwiSW50XCI7XG4gICAgVHlwZVtUeXBlW1wiRmxvYXRcIl0gPSAzXSA9IFwiRmxvYXRcIjtcbiAgICBUeXBlW1R5cGVbXCJCaW5hcnlcIl0gPSA0XSA9IFwiQmluYXJ5XCI7XG4gICAgVHlwZVtUeXBlW1wiVXRmOFwiXSA9IDVdID0gXCJVdGY4XCI7XG4gICAgVHlwZVtUeXBlW1wiQm9vbFwiXSA9IDZdID0gXCJCb29sXCI7XG4gICAgVHlwZVtUeXBlW1wiRGVjaW1hbFwiXSA9IDddID0gXCJEZWNpbWFsXCI7XG4gICAgVHlwZVtUeXBlW1wiRGF0ZVwiXSA9IDhdID0gXCJEYXRlXCI7XG4gICAgVHlwZVtUeXBlW1wiVGltZVwiXSA9IDldID0gXCJUaW1lXCI7XG4gICAgVHlwZVtUeXBlW1wiVGltZXN0YW1wXCJdID0gMTBdID0gXCJUaW1lc3RhbXBcIjtcbiAgICBUeXBlW1R5cGVbXCJJbnRlcnZhbFwiXSA9IDExXSA9IFwiSW50ZXJ2YWxcIjtcbiAgICBUeXBlW1R5cGVbXCJMaXN0XCJdID0gMTJdID0gXCJMaXN0XCI7XG4gICAgVHlwZVtUeXBlW1wiU3RydWN0XCJdID0gMTNdID0gXCJTdHJ1Y3RcIjtcbiAgICBUeXBlW1R5cGVbXCJVbmlvblwiXSA9IDE0XSA9IFwiVW5pb25cIjtcbiAgICBUeXBlW1R5cGVbXCJGaXhlZFNpemVCaW5hcnlcIl0gPSAxNV0gPSBcIkZpeGVkU2l6ZUJpbmFyeVwiO1xuICAgIFR5cGVbVHlwZVtcIkZpeGVkU2l6ZUxpc3RcIl0gPSAxNl0gPSBcIkZpeGVkU2l6ZUxpc3RcIjtcbiAgICBUeXBlW1R5cGVbXCJNYXBcIl0gPSAxN10gPSBcIk1hcFwiO1xuICAgIFR5cGVbVHlwZVtcIkRpY3Rpb25hcnlcIl0gPSAtMV0gPSBcIkRpY3Rpb25hcnlcIjtcbiAgICBUeXBlW1R5cGVbXCJJbnQ4XCJdID0gLTJdID0gXCJJbnQ4XCI7XG4gICAgVHlwZVtUeXBlW1wiSW50MTZcIl0gPSAtM10gPSBcIkludDE2XCI7XG4gICAgVHlwZVtUeXBlW1wiSW50MzJcIl0gPSAtNF0gPSBcIkludDMyXCI7XG4gICAgVHlwZVtUeXBlW1wiSW50NjRcIl0gPSAtNV0gPSBcIkludDY0XCI7XG4gICAgVHlwZVtUeXBlW1wiVWludDhcIl0gPSAtNl0gPSBcIlVpbnQ4XCI7XG4gICAgVHlwZVtUeXBlW1wiVWludDE2XCJdID0gLTddID0gXCJVaW50MTZcIjtcbiAgICBUeXBlW1R5cGVbXCJVaW50MzJcIl0gPSAtOF0gPSBcIlVpbnQzMlwiO1xuICAgIFR5cGVbVHlwZVtcIlVpbnQ2NFwiXSA9IC05XSA9IFwiVWludDY0XCI7XG4gICAgVHlwZVtUeXBlW1wiRmxvYXQxNlwiXSA9IC0xMF0gPSBcIkZsb2F0MTZcIjtcbiAgICBUeXBlW1R5cGVbXCJGbG9hdDMyXCJdID0gLTExXSA9IFwiRmxvYXQzMlwiO1xuICAgIFR5cGVbVHlwZVtcIkZsb2F0NjRcIl0gPSAtMTJdID0gXCJGbG9hdDY0XCI7XG4gICAgVHlwZVtUeXBlW1wiRGF0ZURheVwiXSA9IC0xM10gPSBcIkRhdGVEYXlcIjtcbiAgICBUeXBlW1R5cGVbXCJEYXRlTWlsbGlzZWNvbmRcIl0gPSAtMTRdID0gXCJEYXRlTWlsbGlzZWNvbmRcIjtcbiAgICBUeXBlW1R5cGVbXCJUaW1lc3RhbXBTZWNvbmRcIl0gPSAtMTVdID0gXCJUaW1lc3RhbXBTZWNvbmRcIjtcbiAgICBUeXBlW1R5cGVbXCJUaW1lc3RhbXBNaWxsaXNlY29uZFwiXSA9IC0xNl0gPSBcIlRpbWVzdGFtcE1pbGxpc2Vjb25kXCI7XG4gICAgVHlwZVtUeXBlW1wiVGltZXN0YW1wTWljcm9zZWNvbmRcIl0gPSAtMTddID0gXCJUaW1lc3RhbXBNaWNyb3NlY29uZFwiO1xuICAgIFR5cGVbVHlwZVtcIlRpbWVzdGFtcE5hbm9zZWNvbmRcIl0gPSAtMThdID0gXCJUaW1lc3RhbXBOYW5vc2Vjb25kXCI7XG4gICAgVHlwZVtUeXBlW1wiVGltZVNlY29uZFwiXSA9IC0xOV0gPSBcIlRpbWVTZWNvbmRcIjtcbiAgICBUeXBlW1R5cGVbXCJUaW1lTWlsbGlzZWNvbmRcIl0gPSAtMjBdID0gXCJUaW1lTWlsbGlzZWNvbmRcIjtcbiAgICBUeXBlW1R5cGVbXCJUaW1lTWljcm9zZWNvbmRcIl0gPSAtMjFdID0gXCJUaW1lTWljcm9zZWNvbmRcIjtcbiAgICBUeXBlW1R5cGVbXCJUaW1lTmFub3NlY29uZFwiXSA9IC0yMl0gPSBcIlRpbWVOYW5vc2Vjb25kXCI7XG4gICAgVHlwZVtUeXBlW1wiRGVuc2VVbmlvblwiXSA9IC0yM10gPSBcIkRlbnNlVW5pb25cIjtcbiAgICBUeXBlW1R5cGVbXCJTcGFyc2VVbmlvblwiXSA9IC0yNF0gPSBcIlNwYXJzZVVuaW9uXCI7XG4gICAgVHlwZVtUeXBlW1wiSW50ZXJ2YWxEYXlUaW1lXCJdID0gLTI1XSA9IFwiSW50ZXJ2YWxEYXlUaW1lXCI7XG4gICAgVHlwZVtUeXBlW1wiSW50ZXJ2YWxZZWFyTW9udGhcIl0gPSAtMjZdID0gXCJJbnRlcnZhbFllYXJNb250aFwiO1xufSkoVHlwZSB8fCAoVHlwZSA9IHt9KSk7XG5leHBvcnQgdmFyIEJ1ZmZlclR5cGU7XG4oZnVuY3Rpb24gKEJ1ZmZlclR5cGUpIHtcbiAgICAvKipcbiAgICAgKiB1c2VkIGluIExpc3QgdHlwZSwgRGVuc2UgVW5pb24gYW5kIHZhcmlhYmxlIGxlbmd0aCBwcmltaXRpdmUgdHlwZXMgKFN0cmluZywgQmluYXJ5KVxuICAgICAqL1xuICAgIEJ1ZmZlclR5cGVbQnVmZmVyVHlwZVtcIk9GRlNFVFwiXSA9IDBdID0gXCJPRkZTRVRcIjtcbiAgICAvKipcbiAgICAgKiBhY3R1YWwgZGF0YSwgZWl0aGVyIHdpeGVkIHdpZHRoIHByaW1pdGl2ZSB0eXBlcyBpbiBzbG90cyBvciB2YXJpYWJsZSB3aWR0aCBkZWxpbWl0ZWQgYnkgYW4gT0ZGU0VUIHZlY3RvclxuICAgICAqL1xuICAgIEJ1ZmZlclR5cGVbQnVmZmVyVHlwZVtcIkRBVEFcIl0gPSAxXSA9IFwiREFUQVwiO1xuICAgIC8qKlxuICAgICAqIEJpdCB2ZWN0b3IgaW5kaWNhdGluZyBpZiBlYWNoIHZhbHVlIGlzIG51bGxcbiAgICAgKi9cbiAgICBCdWZmZXJUeXBlW0J1ZmZlclR5cGVbXCJWQUxJRElUWVwiXSA9IDJdID0gXCJWQUxJRElUWVwiO1xuICAgIC8qKlxuICAgICAqIFR5cGUgdmVjdG9yIHVzZWQgaW4gVW5pb24gdHlwZVxuICAgICAqL1xuICAgIEJ1ZmZlclR5cGVbQnVmZmVyVHlwZVtcIlRZUEVcIl0gPSAzXSA9IFwiVFlQRVwiO1xufSkoQnVmZmVyVHlwZSB8fCAoQnVmZmVyVHlwZSA9IHt9KSk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVudW0ubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBfX2FzeW5jR2VuZXJhdG9yLCBfX2FzeW5jVmFsdWVzLCBfX2F3YWl0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBGaWVsZCwgU2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEubWpzJztcbmltcG9ydCAqIGFzIGR0eXBlcyBmcm9tICcuL3R5cGUubWpzJztcbmltcG9ydCB7IERhdGEgfSBmcm9tICcuL2RhdGEubWpzJztcbmltcG9ydCB7IFZlY3RvciwgbWFrZVZlY3RvciB9IGZyb20gJy4vdmVjdG9yLm1qcyc7XG5pbXBvcnQgeyBpbnN0YW5jZSBhcyBnZXRCdWlsZGVyQ29uc3RydWN0b3IgfSBmcm9tICcuL3Zpc2l0b3IvYnVpbGRlcmN0b3IubWpzJztcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSAnLi90YWJsZS5tanMnO1xuaW1wb3J0IHsgUmVjb3JkQmF0Y2ggfSBmcm9tICcuL3JlY29yZGJhdGNoLm1qcyc7XG5pbXBvcnQgeyBjb21wYXJlVHlwZXMgfSBmcm9tICcuL3Zpc2l0b3IvdHlwZWNvbXBhcmF0b3IubWpzJztcbmV4cG9ydCBmdW5jdGlvbiBtYWtlQnVpbGRlcihvcHRpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IG9wdGlvbnMudHlwZTtcbiAgICBjb25zdCBidWlsZGVyID0gbmV3IChnZXRCdWlsZGVyQ29uc3RydWN0b3IuZ2V0VmlzaXRGbih0eXBlKSgpKShvcHRpb25zKTtcbiAgICBpZiAodHlwZS5jaGlsZHJlbiAmJiB0eXBlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBvcHRpb25zWydjaGlsZHJlbiddIHx8IFtdO1xuICAgICAgICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IHsgJ251bGxWYWx1ZXMnOiBvcHRpb25zWydudWxsVmFsdWVzJ10gfTtcbiAgICAgICAgY29uc3QgZ2V0Q2hpbGRPcHRpb25zID0gQXJyYXkuaXNBcnJheShjaGlsZHJlbilcbiAgICAgICAgICAgID8gKChfLCBpKSA9PiBjaGlsZHJlbltpXSB8fCBkZWZhdWx0T3B0aW9ucylcbiAgICAgICAgICAgIDogKCh7IG5hbWUgfSkgPT4gY2hpbGRyZW5bbmFtZV0gfHwgZGVmYXVsdE9wdGlvbnMpO1xuICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgZmllbGRdIG9mIHR5cGUuY2hpbGRyZW4uZW50cmllcygpKSB7XG4gICAgICAgICAgICBjb25zdCB7IHR5cGUgfSA9IGZpZWxkO1xuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IGdldENoaWxkT3B0aW9ucyhmaWVsZCwgaW5kZXgpO1xuICAgICAgICAgICAgYnVpbGRlci5jaGlsZHJlbi5wdXNoKG1ha2VCdWlsZGVyKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0cyksIHsgdHlwZSB9KSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBidWlsZGVyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHZlY3RvckZyb21BcnJheShpbml0LCB0eXBlKSB7XG4gICAgaWYgKGluaXQgaW5zdGFuY2VvZiBEYXRhIHx8IGluaXQgaW5zdGFuY2VvZiBWZWN0b3IgfHwgaW5pdC50eXBlIGluc3RhbmNlb2YgZHR5cGVzLkRhdGFUeXBlIHx8IEFycmF5QnVmZmVyLmlzVmlldyhpbml0KSkge1xuICAgICAgICByZXR1cm4gbWFrZVZlY3Rvcihpbml0KTtcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgdHlwZTogdHlwZSAhPT0gbnVsbCAmJiB0eXBlICE9PSB2b2lkIDAgPyB0eXBlIDogaW5mZXJUeXBlKGluaXQpLCBudWxsVmFsdWVzOiBbbnVsbF0gfTtcbiAgICBjb25zdCBjaHVua3MgPSBbLi4uYnVpbGRlclRocm91Z2hJdGVyYWJsZShvcHRpb25zKShpbml0KV07XG4gICAgY29uc3QgdmVjdG9yID0gY2h1bmtzLmxlbmd0aCA9PT0gMSA/IGNodW5rc1swXSA6IGNodW5rcy5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpKTtcbiAgICBpZiAoZHR5cGVzLkRhdGFUeXBlLmlzRGljdGlvbmFyeSh2ZWN0b3IudHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIHZlY3Rvci5tZW1vaXplKCk7XG4gICAgfVxuICAgIHJldHVybiB2ZWN0b3I7XG59XG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgVGFibGV9IGZyb20gYW4gYXJyYXkgb2Ygb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0gYXJyYXkgQSB0YWJsZSBvZiBvYmplY3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFibGVGcm9tSlNPTihhcnJheSkge1xuICAgIGNvbnN0IHZlY3RvciA9IHZlY3RvckZyb21BcnJheShhcnJheSk7XG4gICAgY29uc3QgYmF0Y2ggPSBuZXcgUmVjb3JkQmF0Y2gobmV3IFNjaGVtYSh2ZWN0b3IudHlwZS5jaGlsZHJlbiksIHZlY3Rvci5kYXRhWzBdKTtcbiAgICByZXR1cm4gbmV3IFRhYmxlKGJhdGNoKTtcbn1cbmZ1bmN0aW9uIGluZmVyVHlwZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBkdHlwZXMuTnVsbDtcbiAgICB9XG4gICAgbGV0IG51bGxzQ291bnQgPSAwO1xuICAgIGxldCBhcnJheXNDb3VudCA9IDA7XG4gICAgbGV0IG9iamVjdHNDb3VudCA9IDA7XG4gICAgbGV0IG51bWJlcnNDb3VudCA9IDA7XG4gICAgbGV0IHN0cmluZ3NDb3VudCA9IDA7XG4gICAgbGV0IGJpZ2ludHNDb3VudCA9IDA7XG4gICAgbGV0IGJvb2xlYW5zQ291bnQgPSAwO1xuICAgIGxldCBkYXRlc0NvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IHZhbCBvZiB2YWx1ZSkge1xuICAgICAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgICAgICAgICsrbnVsbHNDb3VudDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbCkge1xuICAgICAgICAgICAgY2FzZSAnYmlnaW50JzpcbiAgICAgICAgICAgICAgICArK2JpZ2ludHNDb3VudDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgICAgICsrYm9vbGVhbnNDb3VudDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICAgICAgKytudW1iZXJzQ291bnQ7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgICsrc3RyaW5nc0NvdW50O1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICsrYXJyYXlzQ291bnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBEYXRlXScpIHtcbiAgICAgICAgICAgICAgICAgICAgKytkYXRlc0NvdW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgKytvYmplY3RzQ291bnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1VuYWJsZSB0byBpbmZlciBWZWN0b3IgdHlwZSBmcm9tIGlucHV0IHZhbHVlcywgZXhwbGljaXQgdHlwZSBkZWNsYXJhdGlvbiBleHBlY3RlZCcpO1xuICAgIH1cbiAgICBpZiAobnVtYmVyc0NvdW50ICsgbnVsbHNDb3VudCA9PT0gdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBuZXcgZHR5cGVzLkZsb2F0NjQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKHN0cmluZ3NDb3VudCArIG51bGxzQ291bnQgPT09IHZhbHVlLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IGR0eXBlcy5EaWN0aW9uYXJ5KG5ldyBkdHlwZXMuVXRmOCwgbmV3IGR0eXBlcy5JbnQzMik7XG4gICAgfVxuICAgIGVsc2UgaWYgKGJpZ2ludHNDb3VudCArIG51bGxzQ291bnQgPT09IHZhbHVlLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IGR0eXBlcy5JbnQ2NDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYm9vbGVhbnNDb3VudCArIG51bGxzQ291bnQgPT09IHZhbHVlLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IGR0eXBlcy5Cb29sO1xuICAgIH1cbiAgICBlbHNlIGlmIChkYXRlc0NvdW50ICsgbnVsbHNDb3VudCA9PT0gdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBuZXcgZHR5cGVzLkRhdGVNaWxsaXNlY29uZDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXJyYXlzQ291bnQgKyBudWxsc0NvdW50ID09PSB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgYXJyYXkgPSB2YWx1ZTtcbiAgICAgICAgY29uc3QgY2hpbGRUeXBlID0gaW5mZXJUeXBlKGFycmF5W2FycmF5LmZpbmRJbmRleCgoYXJ5KSA9PiBhcnkgIT0gbnVsbCldKTtcbiAgICAgICAgaWYgKGFycmF5LmV2ZXJ5KChhcnkpID0+IGFyeSA9PSBudWxsIHx8IGNvbXBhcmVUeXBlcyhjaGlsZFR5cGUsIGluZmVyVHlwZShhcnkpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgZHR5cGVzLkxpc3QobmV3IEZpZWxkKCcnLCBjaGlsZFR5cGUsIHRydWUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChvYmplY3RzQ291bnQgKyBudWxsc0NvdW50ID09PSB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZmllbGRzID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocm93KSkge1xuICAgICAgICAgICAgICAgIGlmICghZmllbGRzLmhhcyhrZXkpICYmIHJvd1trZXldICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSB0eXBlIGluZmVycmVkIGZvciB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgYSBmb3VuZCBrZXlcbiAgICAgICAgICAgICAgICAgICAgZmllbGRzLnNldChrZXksIG5ldyBGaWVsZChrZXksIGluZmVyVHlwZShbcm93W2tleV1dKSwgdHJ1ZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IGR0eXBlcy5TdHJ1Y3QoWy4uLmZpZWxkcy52YWx1ZXMoKV0pO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmFibGUgdG8gaW5mZXIgVmVjdG9yIHR5cGUgZnJvbSBpbnB1dCB2YWx1ZXMsIGV4cGxpY2l0IHR5cGUgZGVjbGFyYXRpb24gZXhwZWN0ZWQnKTtcbn1cbi8qKlxuICogVHJhbnNmb3JtIGEgc3luY2hyb25vdXMgYEl0ZXJhYmxlYCBvZiBhcmJpdHJhcnkgSmF2YVNjcmlwdCB2YWx1ZXMgaW50byBhXG4gKiBzZXF1ZW5jZSBvZiBBcnJvdyBWZWN0b3I8VD4gZm9sbG93aW5nIHRoZSBjaHVua2luZyBzZW1hbnRpY3MgZGVmaW5lZCBpblxuICogdGhlIHN1cHBsaWVkIGBvcHRpb25zYCBhcmd1bWVudC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYW4gYEl0ZXJhYmxlYCBvZiB2YWx1ZXMgdG9cbiAqIHRyYW5zZm9ybS4gV2hlbiBjYWxsZWQsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBJdGVyYXRvciBvZiBgVmVjdG9yPFQ+YC5cbiAqXG4gKiBUaGUgcmVzdWx0aW5nIGBJdGVyYXRvcjxWZWN0b3I8VD4+YCB5aWVsZHMgVmVjdG9ycyBiYXNlZCBvbiB0aGVcbiAqIGBxdWV1ZWluZ1N0cmF0ZWd5YCBhbmQgYGhpZ2hXYXRlck1hcmtgIHNwZWNpZmllZCBpbiB0aGUgYG9wdGlvbnNgIGFyZ3VtZW50LlxuICpcbiAqICogSWYgYHF1ZXVlaW5nU3RyYXRlZ3lgIGlzIGBcImNvdW50XCJgIChvciBvbWl0dGVkKSwgVGhlIGBJdGVyYXRvcjxWZWN0b3I8VD4+YFxuICogICB3aWxsIGZsdXNoIHRoZSB1bmRlcmx5aW5nIGBCdWlsZGVyYCAoYW5kIHlpZWxkIGEgbmV3IGBWZWN0b3I8VD5gKSBvbmNlIHRoZVxuICogICBCdWlsZGVyJ3MgYGxlbmd0aGAgcmVhY2hlcyBvciBleGNlZWRzIHRoZSBzdXBwbGllZCBgaGlnaFdhdGVyTWFya2AuXG4gKiAqIElmIGBxdWV1ZWluZ1N0cmF0ZWd5YCBpcyBgXCJieXRlc1wiYCwgdGhlIGBJdGVyYXRvcjxWZWN0b3I8VD4+YCB3aWxsIGZsdXNoXG4gKiAgIHRoZSB1bmRlcmx5aW5nIGBCdWlsZGVyYCAoYW5kIHlpZWxkIGEgbmV3IGBWZWN0b3I8VD5gKSBvbmNlIGl0cyBgYnl0ZUxlbmd0aGBcbiAqICAgcmVhY2hlcyBvciBleGNlZWRzIHRoZSBzdXBwbGllZCBgaGlnaFdhdGVyTWFya2AuXG4gKlxuICogQHBhcmFtIHtJdGVyYWJsZUJ1aWxkZXJPcHRpb25zPFQsIFROdWxsPn0gb3B0aW9ucyBBbiBvYmplY3Qgb2YgcHJvcGVydGllcyB3aGljaCBkZXRlcm1pbmUgdGhlIGBCdWlsZGVyYCB0byBjcmVhdGUgYW5kIHRoZSBjaHVua2luZyBzZW1hbnRpY3MgdG8gdXNlLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB3aGljaCBhY2NlcHRzIGEgSmF2YVNjcmlwdCBgSXRlcmFibGVgIG9mIHZhbHVlcyB0b1xuICogICAgICAgICAgd3JpdGUsIGFuZCByZXR1cm5zIGFuIGBJdGVyYXRvcmAgdGhhdCB5aWVsZHMgVmVjdG9ycyBhY2NvcmRpbmdcbiAqICAgICAgICAgIHRvIHRoZSBjaHVua2luZyBzZW1hbnRpY3MgZGVmaW5lZCBpbiB0aGUgYG9wdGlvbnNgIGFyZ3VtZW50LlxuICogQG5vY29sbGFwc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkZXJUaHJvdWdoSXRlcmFibGUob3B0aW9ucykge1xuICAgIGNvbnN0IHsgWydxdWV1ZWluZ1N0cmF0ZWd5J106IHF1ZXVlaW5nU3RyYXRlZ3kgPSAnY291bnQnIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHsgWydoaWdoV2F0ZXJNYXJrJ106IGhpZ2hXYXRlck1hcmsgPSBxdWV1ZWluZ1N0cmF0ZWd5ICE9PSAnYnl0ZXMnID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogTWF0aC5wb3coMiwgMTQpIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHNpemVQcm9wZXJ0eSA9IHF1ZXVlaW5nU3RyYXRlZ3kgIT09ICdieXRlcycgPyAnbGVuZ3RoJyA6ICdieXRlTGVuZ3RoJztcbiAgICByZXR1cm4gZnVuY3Rpb24qIChzb3VyY2UpIHtcbiAgICAgICAgbGV0IG51bUNodW5rcyA9IDA7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBtYWtlQnVpbGRlcihvcHRpb25zKTtcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChidWlsZGVyLmFwcGVuZCh2YWx1ZSlbc2l6ZVByb3BlcnR5XSA+PSBoaWdoV2F0ZXJNYXJrKSB7XG4gICAgICAgICAgICAgICAgKytudW1DaHVua3MgJiYgKHlpZWxkIGJ1aWxkZXIudG9WZWN0b3IoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1aWxkZXIuZmluaXNoKCkubGVuZ3RoID4gMCB8fCBudW1DaHVua3MgPT09IDApIHtcbiAgICAgICAgICAgIHlpZWxkIGJ1aWxkZXIudG9WZWN0b3IoKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4vKipcbiAqIFRyYW5zZm9ybSBhbiBgQXN5bmNJdGVyYWJsZWAgb2YgYXJiaXRyYXJ5IEphdmFTY3JpcHQgdmFsdWVzIGludG8gYVxuICogc2VxdWVuY2Ugb2YgQXJyb3cgVmVjdG9yPFQ+IGZvbGxvd2luZyB0aGUgY2h1bmtpbmcgc2VtYW50aWNzIGRlZmluZWQgaW5cbiAqIHRoZSBzdXBwbGllZCBgb3B0aW9uc2AgYXJndW1lbnQuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFuIGBBc3luY0l0ZXJhYmxlYCBvZiB2YWx1ZXMgdG9cbiAqIHRyYW5zZm9ybS4gV2hlbiBjYWxsZWQsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBBc3luY0l0ZXJhdG9yIG9mIGBWZWN0b3I8VD5gLlxuICpcbiAqIFRoZSByZXN1bHRpbmcgYEFzeW5jSXRlcmF0b3I8VmVjdG9yPFQ+PmAgeWllbGRzIFZlY3RvcnMgYmFzZWQgb24gdGhlXG4gKiBgcXVldWVpbmdTdHJhdGVneWAgYW5kIGBoaWdoV2F0ZXJNYXJrYCBzcGVjaWZpZWQgaW4gdGhlIGBvcHRpb25zYCBhcmd1bWVudC5cbiAqXG4gKiAqIElmIGBxdWV1ZWluZ1N0cmF0ZWd5YCBpcyBgXCJjb3VudFwiYCAob3Igb21pdHRlZCksIFRoZSBgQXN5bmNJdGVyYXRvcjxWZWN0b3I8VD4+YFxuICogICB3aWxsIGZsdXNoIHRoZSB1bmRlcmx5aW5nIGBCdWlsZGVyYCAoYW5kIHlpZWxkIGEgbmV3IGBWZWN0b3I8VD5gKSBvbmNlIHRoZVxuICogICBCdWlsZGVyJ3MgYGxlbmd0aGAgcmVhY2hlcyBvciBleGNlZWRzIHRoZSBzdXBwbGllZCBgaGlnaFdhdGVyTWFya2AuXG4gKiAqIElmIGBxdWV1ZWluZ1N0cmF0ZWd5YCBpcyBgXCJieXRlc1wiYCwgdGhlIGBBc3luY0l0ZXJhdG9yPFZlY3RvcjxUPj5gIHdpbGwgZmx1c2hcbiAqICAgdGhlIHVuZGVybHlpbmcgYEJ1aWxkZXJgIChhbmQgeWllbGQgYSBuZXcgYFZlY3RvcjxUPmApIG9uY2UgaXRzIGBieXRlTGVuZ3RoYFxuICogICByZWFjaGVzIG9yIGV4Y2VlZHMgdGhlIHN1cHBsaWVkIGBoaWdoV2F0ZXJNYXJrYC5cbiAqXG4gKiBAcGFyYW0ge0l0ZXJhYmxlQnVpbGRlck9wdGlvbnM8VCwgVE51bGw+fSBvcHRpb25zIEFuIG9iamVjdCBvZiBwcm9wZXJ0aWVzIHdoaWNoIGRldGVybWluZSB0aGUgYEJ1aWxkZXJgIHRvIGNyZWF0ZSBhbmQgdGhlIGNodW5raW5nIHNlbWFudGljcyB0byB1c2UuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHdoaWNoIGFjY2VwdHMgYSBKYXZhU2NyaXB0IGBBc3luY0l0ZXJhYmxlYCBvZiB2YWx1ZXNcbiAqICAgICAgICAgIHRvIHdyaXRlLCBhbmQgcmV0dXJucyBhbiBgQXN5bmNJdGVyYXRvcmAgdGhhdCB5aWVsZHMgVmVjdG9yc1xuICogICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBjaHVua2luZyBzZW1hbnRpY3MgZGVmaW5lZCBpbiB0aGUgYG9wdGlvbnNgXG4gKiAgICAgICAgICBhcmd1bWVudC5cbiAqIEBub2NvbGxhcHNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZGVyVGhyb3VnaEFzeW5jSXRlcmFibGUob3B0aW9ucykge1xuICAgIGNvbnN0IHsgWydxdWV1ZWluZ1N0cmF0ZWd5J106IHF1ZXVlaW5nU3RyYXRlZ3kgPSAnY291bnQnIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHsgWydoaWdoV2F0ZXJNYXJrJ106IGhpZ2hXYXRlck1hcmsgPSBxdWV1ZWluZ1N0cmF0ZWd5ICE9PSAnYnl0ZXMnID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogTWF0aC5wb3coMiwgMTQpIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHNpemVQcm9wZXJ0eSA9IHF1ZXVlaW5nU3RyYXRlZ3kgIT09ICdieXRlcycgPyAnbGVuZ3RoJyA6ICdieXRlTGVuZ3RoJztcbiAgICByZXR1cm4gZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgICAgIGxldCBudW1DaHVua3MgPSAwO1xuICAgICAgICAgICAgY29uc3QgYnVpbGRlciA9IG1ha2VCdWlsZGVyKG9wdGlvbnMpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBzb3VyY2VfMSA9IF9fYXN5bmNWYWx1ZXMoc291cmNlKSwgc291cmNlXzFfMTsgc291cmNlXzFfMSA9IHlpZWxkIF9fYXdhaXQoc291cmNlXzEubmV4dCgpKSwgIXNvdXJjZV8xXzEuZG9uZTspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBzb3VyY2VfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnVpbGRlci5hcHBlbmQodmFsdWUpW3NpemVQcm9wZXJ0eV0gPj0gaGlnaFdhdGVyTWFyaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgKytudW1DaHVua3MgJiYgKHlpZWxkIHlpZWxkIF9fYXdhaXQoYnVpbGRlci50b1ZlY3RvcigpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZV8xXzEgJiYgIXNvdXJjZV8xXzEuZG9uZSAmJiAoX2EgPSBzb3VyY2VfMS5yZXR1cm4pKSB5aWVsZCBfX2F3YWl0KF9hLmNhbGwoc291cmNlXzEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJ1aWxkZXIuZmluaXNoKCkubGVuZ3RoID4gMCB8fCBudW1DaHVua3MgPT09IDApIHtcbiAgICAgICAgICAgICAgICB5aWVsZCB5aWVsZCBfX2F3YWl0KGJ1aWxkZXIudG9WZWN0b3IoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZhY3Rvcmllcy5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJztcbi8qKlxuICogT3BhcXVlIGJpbmFyeSBkYXRhXG4gKi9cbmV4cG9ydCBjbGFzcyBCaW5hcnkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzQmluYXJ5KGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IEJpbmFyeSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzQmluYXJ5KGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBCaW5hcnkoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0QmluYXJ5KGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCgwKTtcbiAgICB9XG4gICAgc3RhdGljIGVuZEJpbmFyeShidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVCaW5hcnkoYnVpbGRlcikge1xuICAgICAgICBCaW5hcnkuc3RhcnRCaW5hcnkoYnVpbGRlcik7XG4gICAgICAgIHJldHVybiBCaW5hcnkuZW5kQmluYXJ5KGJ1aWxkZXIpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmluYXJ5Lm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuZXhwb3J0IGNsYXNzIEJsb2NrIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5kZXggdG8gdGhlIHN0YXJ0IG9mIHRoZSBSZWNvcmRCbG9jayAobm90ZSB0aGlzIGlzIHBhc3QgdGhlIE1lc3NhZ2UgaGVhZGVyKVxuICAgICAqL1xuICAgIG9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGVuZ3RoIG9mIHRoZSBtZXRhZGF0YVxuICAgICAqL1xuICAgIG1ldGFEYXRhTGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyA4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGVuZ3RoIG9mIHRoZSBkYXRhICh0aGlzIGlzIGFsaWduZWQgc28gdGhlcmUgY2FuIGJlIGEgZ2FwIGJldHdlZW4gdGhpcyBhbmRcbiAgICAgKiB0aGUgbWV0YWRhdGEpLlxuICAgICAqL1xuICAgIGJvZHlMZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcyArIDE2KTtcbiAgICB9XG4gICAgc3RhdGljIHNpemVPZigpIHtcbiAgICAgICAgcmV0dXJuIDI0O1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlQmxvY2soYnVpbGRlciwgb2Zmc2V0LCBtZXRhRGF0YUxlbmd0aCwgYm9keUxlbmd0aCkge1xuICAgICAgICBidWlsZGVyLnByZXAoOCwgMjQpO1xuICAgICAgICBidWlsZGVyLndyaXRlSW50NjQoYm9keUxlbmd0aCk7XG4gICAgICAgIGJ1aWxkZXIucGFkKDQpO1xuICAgICAgICBidWlsZGVyLndyaXRlSW50MzIobWV0YURhdGFMZW5ndGgpO1xuICAgICAgICBidWlsZGVyLndyaXRlSW50NjQob2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIub2Zmc2V0KCk7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1ibG9jay5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbi8qKlxuICogUHJvdmlkZWQgZm9yIGZvcndhcmQgY29tcGF0aWJpbGl0eSBpbiBjYXNlIHdlIG5lZWQgdG8gc3VwcG9ydCBkaWZmZXJlbnRcbiAqIHN0cmF0ZWdpZXMgZm9yIGNvbXByZXNzaW5nIHRoZSBJUEMgbWVzc2FnZSBib2R5IChsaWtlIHdob2xlLWJvZHlcbiAqIGNvbXByZXNzaW9uIHJhdGhlciB0aGFuIGJ1ZmZlci1sZXZlbCkgaW4gdGhlIGZ1dHVyZVxuICovXG5leHBvcnQgdmFyIEJvZHlDb21wcmVzc2lvbk1ldGhvZDtcbihmdW5jdGlvbiAoQm9keUNvbXByZXNzaW9uTWV0aG9kKSB7XG4gICAgLyoqXG4gICAgICogRWFjaCBjb25zdGl0dWVudCBidWZmZXIgaXMgZmlyc3QgY29tcHJlc3NlZCB3aXRoIHRoZSBpbmRpY2F0ZWRcbiAgICAgKiBjb21wcmVzc29yLCBhbmQgdGhlbiB3cml0dGVuIHdpdGggdGhlIHVuY29tcHJlc3NlZCBsZW5ndGggaW4gdGhlIGZpcnN0IDhcbiAgICAgKiBieXRlcyBhcyBhIDY0LWJpdCBsaXR0bGUtZW5kaWFuIHNpZ25lZCBpbnRlZ2VyIGZvbGxvd2VkIGJ5IHRoZSBjb21wcmVzc2VkXG4gICAgICogYnVmZmVyIGJ5dGVzIChhbmQgdGhlbiBwYWRkaW5nIGFzIHJlcXVpcmVkIGJ5IHRoZSBwcm90b2NvbCkuIFRoZVxuICAgICAqIHVuY29tcHJlc3NlZCBsZW5ndGggbWF5IGJlIHNldCB0byAtMSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBkYXRhIHRoYXRcbiAgICAgKiBmb2xsb3dzIGlzIG5vdCBjb21wcmVzc2VkLCB3aGljaCBjYW4gYmUgdXNlZnVsIGZvciBjYXNlcyB3aGVyZVxuICAgICAqIGNvbXByZXNzaW9uIGRvZXMgbm90IHlpZWxkIGFwcHJlY2lhYmxlIHNhdmluZ3MuXG4gICAgICovXG4gICAgQm9keUNvbXByZXNzaW9uTWV0aG9kW0JvZHlDb21wcmVzc2lvbk1ldGhvZFtcIkJVRkZFUlwiXSA9IDBdID0gXCJCVUZGRVJcIjtcbn0pKEJvZHlDb21wcmVzc2lvbk1ldGhvZCB8fCAoQm9keUNvbXByZXNzaW9uTWV0aG9kID0ge30pKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Ym9keS1jb21wcmVzc2lvbi1tZXRob2QubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5pbXBvcnQgeyBCb2R5Q29tcHJlc3Npb25NZXRob2QgfSBmcm9tICcuL2JvZHktY29tcHJlc3Npb24tbWV0aG9kLm1qcyc7XG5pbXBvcnQgeyBDb21wcmVzc2lvblR5cGUgfSBmcm9tICcuL2NvbXByZXNzaW9uLXR5cGUubWpzJztcbi8qKlxuICogT3B0aW9uYWwgY29tcHJlc3Npb24gZm9yIHRoZSBtZW1vcnkgYnVmZmVycyBjb25zdGl0dXRpbmcgSVBDIG1lc3NhZ2VcbiAqIGJvZGllcy4gSW50ZW5kZWQgZm9yIHVzZSB3aXRoIFJlY29yZEJhdGNoIGJ1dCBjb3VsZCBiZSB1c2VkIGZvciBvdGhlclxuICogbWVzc2FnZSB0eXBlc1xuICovXG5leHBvcnQgY2xhc3MgQm9keUNvbXByZXNzaW9uIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc0JvZHlDb21wcmVzc2lvbihiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBCb2R5Q29tcHJlc3Npb24oKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0JvZHlDb21wcmVzc2lvbihiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgQm9keUNvbXByZXNzaW9uKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbXByZXNzb3IgbGlicmFyeS5cbiAgICAgKiBGb3IgTFo0X0ZSQU1FLCBlYWNoIGNvbXByZXNzZWQgYnVmZmVyIG11c3QgY29uc2lzdCBvZiBhIHNpbmdsZSBmcmFtZS5cbiAgICAgKi9cbiAgICBjb2RlYygpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IENvbXByZXNzaW9uVHlwZS5MWjRfRlJBTUU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGUgd2F5IHRoZSByZWNvcmQgYmF0Y2ggYm9keSB3YXMgY29tcHJlc3NlZFxuICAgICAqL1xuICAgIG1ldGhvZCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IEJvZHlDb21wcmVzc2lvbk1ldGhvZC5CVUZGRVI7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydEJvZHlDb21wcmVzc2lvbihidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMik7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRDb2RlYyhidWlsZGVyLCBjb2RlYykge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50OCgwLCBjb2RlYywgQ29tcHJlc3Npb25UeXBlLkxaNF9GUkFNRSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRNZXRob2QoYnVpbGRlciwgbWV0aG9kKSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDEsIG1ldGhvZCwgQm9keUNvbXByZXNzaW9uTWV0aG9kLkJVRkZFUik7XG4gICAgfVxuICAgIHN0YXRpYyBlbmRCb2R5Q29tcHJlc3Npb24oYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlQm9keUNvbXByZXNzaW9uKGJ1aWxkZXIsIGNvZGVjLCBtZXRob2QpIHtcbiAgICAgICAgQm9keUNvbXByZXNzaW9uLnN0YXJ0Qm9keUNvbXByZXNzaW9uKGJ1aWxkZXIpO1xuICAgICAgICBCb2R5Q29tcHJlc3Npb24uYWRkQ29kZWMoYnVpbGRlciwgY29kZWMpO1xuICAgICAgICBCb2R5Q29tcHJlc3Npb24uYWRkTWV0aG9kKGJ1aWxkZXIsIG1ldGhvZCk7XG4gICAgICAgIHJldHVybiBCb2R5Q29tcHJlc3Npb24uZW5kQm9keUNvbXByZXNzaW9uKGJ1aWxkZXIpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Ym9keS1jb21wcmVzc2lvbi5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJztcbmV4cG9ydCBjbGFzcyBCb29sIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc0Jvb2woYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgQm9vbCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzQm9vbChiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgQm9vbCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRCb29sKGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCgwKTtcbiAgICB9XG4gICAgc3RhdGljIGVuZEJvb2woYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlQm9vbChidWlsZGVyKSB7XG4gICAgICAgIEJvb2wuc3RhcnRCb29sKGJ1aWxkZXIpO1xuICAgICAgICByZXR1cm4gQm9vbC5lbmRCb29sKGJ1aWxkZXIpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Ym9vbC5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQSBCdWZmZXIgcmVwcmVzZW50cyBhIHNpbmdsZSBjb250aWd1b3VzIG1lbW9yeSBzZWdtZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBCdWZmZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgcmVsYXRpdmUgb2Zmc2V0IGludG8gdGhlIHNoYXJlZCBtZW1vcnkgcGFnZSB3aGVyZSB0aGUgYnl0ZXMgZm9yIHRoaXNcbiAgICAgKiBidWZmZXIgc3RhcnRzXG4gICAgICovXG4gICAgb2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYWJzb2x1dGUgbGVuZ3RoIChpbiBieXRlcykgb2YgdGhlIG1lbW9yeSBidWZmZXIuIFRoZSBtZW1vcnkgaXMgZm91bmRcbiAgICAgKiBmcm9tIG9mZnNldCAoaW5jbHVzaXZlKSB0byBvZmZzZXQgKyBsZW5ndGggKG5vbi1pbmNsdXNpdmUpLiBXaGVuIGJ1aWxkaW5nXG4gICAgICogbWVzc2FnZXMgdXNpbmcgdGhlIGVuY2Fwc3VsYXRlZCBJUEMgbWVzc2FnZSwgcGFkZGluZyBieXRlcyBtYXkgYmUgd3JpdHRlblxuICAgICAqIGFmdGVyIGEgYnVmZmVyLCBidXQgc3VjaCBwYWRkaW5nIGJ5dGVzIGRvIG5vdCBuZWVkIHRvIGJlIGFjY291bnRlZCBmb3IgaW5cbiAgICAgKiB0aGUgc2l6ZSBoZXJlLlxuICAgICAqL1xuICAgIGxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zICsgOCk7XG4gICAgfVxuICAgIHN0YXRpYyBzaXplT2YoKSB7XG4gICAgICAgIHJldHVybiAxNjtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUJ1ZmZlcihidWlsZGVyLCBvZmZzZXQsIGxlbmd0aCkge1xuICAgICAgICBidWlsZGVyLnByZXAoOCwgMTYpO1xuICAgICAgICBidWlsZGVyLndyaXRlSW50NjQobGVuZ3RoKTtcbiAgICAgICAgYnVpbGRlci53cml0ZUludDY0KG9mZnNldCk7XG4gICAgICAgIHJldHVybiBidWlsZGVyLm9mZnNldCgpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnVmZmVyLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuZXhwb3J0IHZhciBDb21wcmVzc2lvblR5cGU7XG4oZnVuY3Rpb24gKENvbXByZXNzaW9uVHlwZSkge1xuICAgIENvbXByZXNzaW9uVHlwZVtDb21wcmVzc2lvblR5cGVbXCJMWjRfRlJBTUVcIl0gPSAwXSA9IFwiTFo0X0ZSQU1FXCI7XG4gICAgQ29tcHJlc3Npb25UeXBlW0NvbXByZXNzaW9uVHlwZVtcIlpTVERcIl0gPSAxXSA9IFwiWlNURFwiO1xufSkoQ29tcHJlc3Npb25UeXBlIHx8IChDb21wcmVzc2lvblR5cGUgPSB7fSkpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21wcmVzc2lvbi10eXBlLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuZXhwb3J0IHZhciBEYXRlVW5pdDtcbihmdW5jdGlvbiAoRGF0ZVVuaXQpIHtcbiAgICBEYXRlVW5pdFtEYXRlVW5pdFtcIkRBWVwiXSA9IDBdID0gXCJEQVlcIjtcbiAgICBEYXRlVW5pdFtEYXRlVW5pdFtcIk1JTExJU0VDT05EXCJdID0gMV0gPSBcIk1JTExJU0VDT05EXCI7XG59KShEYXRlVW5pdCB8fCAoRGF0ZVVuaXQgPSB7fSkpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRlLXVuaXQubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5pbXBvcnQgeyBEYXRlVW5pdCB9IGZyb20gJy4vZGF0ZS11bml0Lm1qcyc7XG4vKipcbiAqIERhdGUgaXMgZWl0aGVyIGEgMzItYml0IG9yIDY0LWJpdCBzaWduZWQgaW50ZWdlciB0eXBlIHJlcHJlc2VudGluZyBhblxuICogZWxhcHNlZCB0aW1lIHNpbmNlIFVOSVggZXBvY2ggKDE5NzAtMDEtMDEpLCBzdG9yZWQgaW4gZWl0aGVyIG9mIHR3byB1bml0czpcbiAqXG4gKiAqIE1pbGxpc2Vjb25kcyAoNjQgYml0cykgaW5kaWNhdGluZyBVTklYIHRpbWUgZWxhcHNlZCBzaW5jZSB0aGUgZXBvY2ggKG5vXG4gKiAgIGxlYXAgc2Vjb25kcyksIHdoZXJlIHRoZSB2YWx1ZXMgYXJlIGV2ZW5seSBkaXZpc2libGUgYnkgODY0MDAwMDBcbiAqICogRGF5cyAoMzIgYml0cykgc2luY2UgdGhlIFVOSVggZXBvY2hcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzRGF0ZShiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBEYXRlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNEYXRlKGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBEYXRlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHVuaXQoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogRGF0ZVVuaXQuTUlMTElTRUNPTkQ7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydERhdGUoYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDEpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkVW5pdChidWlsZGVyLCB1bml0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQxNigwLCB1bml0LCBEYXRlVW5pdC5NSUxMSVNFQ09ORCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmREYXRlKGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZURhdGUoYnVpbGRlciwgdW5pdCkge1xuICAgICAgICBEYXRlLnN0YXJ0RGF0ZShidWlsZGVyKTtcbiAgICAgICAgRGF0ZS5hZGRVbml0KGJ1aWxkZXIsIHVuaXQpO1xuICAgICAgICByZXR1cm4gRGF0ZS5lbmREYXRlKGJ1aWxkZXIpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0ZS5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJztcbi8qKlxuICogRXhhY3QgZGVjaW1hbCB2YWx1ZSByZXByZXNlbnRlZCBhcyBhbiBpbnRlZ2VyIHZhbHVlIGluIHR3bydzXG4gKiBjb21wbGVtZW50LiBDdXJyZW50bHkgb25seSAxMjgtYml0ICgxNi1ieXRlKSBhbmQgMjU2LWJpdCAoMzItYnl0ZSkgaW50ZWdlcnNcbiAqIGFyZSB1c2VkLiBUaGUgcmVwcmVzZW50YXRpb24gdXNlcyB0aGUgZW5kaWFubmVzcyBpbmRpY2F0ZWRcbiAqIGluIHRoZSBTY2hlbWEuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNpbWFsIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc0RlY2ltYWwoYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRGVjaW1hbCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRGVjaW1hbChiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRGVjaW1hbCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUb3RhbCBudW1iZXIgb2YgZGVjaW1hbCBkaWdpdHNcbiAgICAgKi9cbiAgICBwcmVjaXNpb24oKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBcIi5cIlxuICAgICAqL1xuICAgIHNjYWxlKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBiaXRzIHBlciB2YWx1ZS4gVGhlIG9ubHkgYWNjZXB0ZWQgd2lkdGhzIGFyZSAxMjggYW5kIDI1Ni5cbiAgICAgKiBXZSB1c2UgYml0V2lkdGggZm9yIGNvbnNpc3RlbmN5IHdpdGggSW50OjpiaXRXaWR0aC5cbiAgICAgKi9cbiAgICBiaXRXaWR0aCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAxMjg7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydERlY2ltYWwoYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDMpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkUHJlY2lzaW9uKGJ1aWxkZXIsIHByZWNpc2lvbikge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMCwgcHJlY2lzaW9uLCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZFNjYWxlKGJ1aWxkZXIsIHNjYWxlKSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMigxLCBzY2FsZSwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRCaXRXaWR0aChidWlsZGVyLCBiaXRXaWR0aCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMiwgYml0V2lkdGgsIDEyOCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmREZWNpbWFsKGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZURlY2ltYWwoYnVpbGRlciwgcHJlY2lzaW9uLCBzY2FsZSwgYml0V2lkdGgpIHtcbiAgICAgICAgRGVjaW1hbC5zdGFydERlY2ltYWwoYnVpbGRlcik7XG4gICAgICAgIERlY2ltYWwuYWRkUHJlY2lzaW9uKGJ1aWxkZXIsIHByZWNpc2lvbik7XG4gICAgICAgIERlY2ltYWwuYWRkU2NhbGUoYnVpbGRlciwgc2NhbGUpO1xuICAgICAgICBEZWNpbWFsLmFkZEJpdFdpZHRoKGJ1aWxkZXIsIGJpdFdpZHRoKTtcbiAgICAgICAgcmV0dXJuIERlY2ltYWwuZW5kRGVjaW1hbChidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlY2ltYWwubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5pbXBvcnQgeyBSZWNvcmRCYXRjaCB9IGZyb20gJy4vcmVjb3JkLWJhdGNoLm1qcyc7XG4vKipcbiAqIEZvciBzZW5kaW5nIGRpY3Rpb25hcnkgZW5jb2RpbmcgaW5mb3JtYXRpb24uIEFueSBGaWVsZCBjYW4gYmVcbiAqIGRpY3Rpb25hcnktZW5jb2RlZCwgYnV0IGluIHRoaXMgY2FzZSBub25lIG9mIGl0cyBjaGlsZHJlbiBtYXkgYmVcbiAqIGRpY3Rpb25hcnktZW5jb2RlZC5cbiAqIFRoZXJlIGlzIG9uZSB2ZWN0b3IgLyBjb2x1bW4gcGVyIGRpY3Rpb25hcnksIGJ1dCB0aGF0IHZlY3RvciAvIGNvbHVtblxuICogbWF5IGJlIHNwcmVhZCBhY3Jvc3MgbXVsdGlwbGUgZGljdGlvbmFyeSBiYXRjaGVzIGJ5IHVzaW5nIHRoZSBpc0RlbHRhXG4gKiBmbGFnXG4gKi9cbmV4cG9ydCBjbGFzcyBEaWN0aW9uYXJ5QmF0Y2gge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzRGljdGlvbmFyeUJhdGNoKGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IERpY3Rpb25hcnlCYXRjaCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRGljdGlvbmFyeUJhdGNoKGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBEaWN0aW9uYXJ5QmF0Y2goKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgaWQoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogdGhpcy5iYi5jcmVhdGVMb25nKDAsIDApO1xuICAgIH1cbiAgICBkYXRhKG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IFJlY29yZEJhdGNoKCkpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiKSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIGlzRGVsdGEgaXMgdHJ1ZSB0aGUgdmFsdWVzIGluIHRoZSBkaWN0aW9uYXJ5IGFyZSB0byBiZSBhcHBlbmRlZCB0byBhXG4gICAgICogZGljdGlvbmFyeSB3aXRoIHRoZSBpbmRpY2F0ZWQgaWQuIElmIGlzRGVsdGEgaXMgZmFsc2UgdGhpcyBkaWN0aW9uYXJ5XG4gICAgICogc2hvdWxkIHJlcGxhY2UgdGhlIGV4aXN0aW5nIGRpY3Rpb25hcnkuXG4gICAgICovXG4gICAgaXNEZWx0YSgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAhIXRoaXMuYmIucmVhZEludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogZmFsc2U7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydERpY3Rpb25hcnlCYXRjaChidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMyk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRJZChidWlsZGVyLCBpZCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50NjQoMCwgaWQsIGJ1aWxkZXIuY3JlYXRlTG9uZygwLCAwKSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGREYXRhKGJ1aWxkZXIsIGRhdGFPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxLCBkYXRhT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZElzRGVsdGEoYnVpbGRlciwgaXNEZWx0YSkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50OCgyLCAraXNEZWx0YSwgK2ZhbHNlKTtcbiAgICB9XG4gICAgc3RhdGljIGVuZERpY3Rpb25hcnlCYXRjaChidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWN0aW9uYXJ5LWJhdGNoLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuaW1wb3J0IHsgRGljdGlvbmFyeUtpbmQgfSBmcm9tICcuL2RpY3Rpb25hcnkta2luZC5tanMnO1xuaW1wb3J0IHsgSW50IH0gZnJvbSAnLi9pbnQubWpzJztcbmV4cG9ydCBjbGFzcyBEaWN0aW9uYXJ5RW5jb2Rpbmcge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzRGljdGlvbmFyeUVuY29kaW5nKGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IERpY3Rpb25hcnlFbmNvZGluZygpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRGljdGlvbmFyeUVuY29kaW5nKGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBEaWN0aW9uYXJ5RW5jb2RpbmcoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGtub3duIGRpY3Rpb25hcnkgaWQgaW4gdGhlIGFwcGxpY2F0aW9uIHdoZXJlIHRoaXMgZGF0YSBpcyB1c2VkLiBJblxuICAgICAqIHRoZSBmaWxlIG9yIHN0cmVhbWluZyBmb3JtYXRzLCB0aGUgZGljdGlvbmFyeSBpZHMgYXJlIGZvdW5kIGluIHRoZVxuICAgICAqIERpY3Rpb25hcnlCYXRjaCBtZXNzYWdlc1xuICAgICAqL1xuICAgIGlkKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IHRoaXMuYmIuY3JlYXRlTG9uZygwLCAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGRpY3Rpb25hcnkgaW5kaWNlcyBhcmUgY29uc3RyYWluZWQgdG8gYmUgbm9uLW5lZ2F0aXZlIGludGVnZXJzLiBJZlxuICAgICAqIHRoaXMgZmllbGQgaXMgbnVsbCwgdGhlIGluZGljZXMgbXVzdCBiZSBzaWduZWQgaW50MzIuIFRvIG1heGltaXplXG4gICAgICogY3Jvc3MtbGFuZ3VhZ2UgY29tcGF0aWJpbGl0eSBhbmQgcGVyZm9ybWFuY2UsIGltcGxlbWVudGF0aW9ucyBhcmVcbiAgICAgKiByZWNvbW1lbmRlZCB0byBwcmVmZXIgc2lnbmVkIGludGVnZXIgdHlwZXMgb3ZlciB1bnNpZ25lZCBpbnRlZ2VyIHR5cGVzXG4gICAgICogYW5kIHRvIGF2b2lkIHVpbnQ2NCBpbmRpY2VzIHVubGVzcyB0aGV5IGFyZSByZXF1aXJlZCBieSBhbiBhcHBsaWNhdGlvbi5cbiAgICAgKi9cbiAgICBpbmRleFR5cGUob2JqKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgSW50KCkpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiKSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIGRpY3Rpb25hcmllcyBhcmUgbm90IG9yZGVyZWQsIG9yIHRoZSBvcmRlciBkb2VzIG5vdCBoYXZlXG4gICAgICogc2VtYW50aWMgbWVhbmluZy4gSW4gc29tZSBzdGF0aXN0aWNhbCwgYXBwbGljYXRpb25zLCBkaWN0aW9uYXJ5LWVuY29kaW5nXG4gICAgICogaXMgdXNlZCB0byByZXByZXNlbnQgb3JkZXJlZCBjYXRlZ29yaWNhbCBkYXRhLCBhbmQgd2UgcHJvdmlkZSBhIHdheSB0b1xuICAgICAqIHByZXNlcnZlIHRoYXQgbWV0YWRhdGEgaGVyZVxuICAgICAqL1xuICAgIGlzT3JkZXJlZCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAhIXRoaXMuYmIucmVhZEludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogZmFsc2U7XG4gICAgfVxuICAgIGRpY3Rpb25hcnlLaW5kKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBEaWN0aW9uYXJ5S2luZC5EZW5zZUFycmF5O1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnREaWN0aW9uYXJ5RW5jb2RpbmcoYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDQpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkSWQoYnVpbGRlciwgaWQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDY0KDAsIGlkLCBidWlsZGVyLmNyZWF0ZUxvbmcoMCwgMCkpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkSW5kZXhUeXBlKGJ1aWxkZXIsIGluZGV4VHlwZU9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDEsIGluZGV4VHlwZU9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRJc09yZGVyZWQoYnVpbGRlciwgaXNPcmRlcmVkKSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDIsICtpc09yZGVyZWQsICtmYWxzZSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGREaWN0aW9uYXJ5S2luZChidWlsZGVyLCBkaWN0aW9uYXJ5S2luZCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MTYoMywgZGljdGlvbmFyeUtpbmQsIERpY3Rpb25hcnlLaW5kLkRlbnNlQXJyYXkpO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kRGljdGlvbmFyeUVuY29kaW5nKGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpY3Rpb25hcnktZW5jb2RpbmcubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIERpY3Rpb25hcnkgZW5jb2RpbmcgbWV0YWRhdGFcbiAqIE1haW50YWluZWQgZm9yIGZvcndhcmRzIGNvbXBhdGliaWxpdHksIGluIHRoZSBmdXR1cmVcbiAqIERpY3Rpb25hcmllcyBtaWdodCBiZSBleHBsaWNpdCBtYXBzIGJldHdlZW4gaW50ZWdlcnMgYW5kIHZhbHVlc1xuICogYWxsb3dpbmcgZm9yIG5vbi1jb250aWd1b3VzIGluZGV4IHZhbHVlc1xuICovXG5leHBvcnQgdmFyIERpY3Rpb25hcnlLaW5kO1xuKGZ1bmN0aW9uIChEaWN0aW9uYXJ5S2luZCkge1xuICAgIERpY3Rpb25hcnlLaW5kW0RpY3Rpb25hcnlLaW5kW1wiRGVuc2VBcnJheVwiXSA9IDBdID0gXCJEZW5zZUFycmF5XCI7XG59KShEaWN0aW9uYXJ5S2luZCB8fCAoRGljdGlvbmFyeUtpbmQgPSB7fSkpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWN0aW9uYXJ5LWtpbmQubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5pbXBvcnQgeyBUaW1lVW5pdCB9IGZyb20gJy4vdGltZS11bml0Lm1qcyc7XG5leHBvcnQgY2xhc3MgRHVyYXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzRHVyYXRpb24oYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRHVyYXRpb24oKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0R1cmF0aW9uKGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBEdXJhdGlvbigpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICB1bml0KCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IFRpbWVVbml0Lk1JTExJU0VDT05EO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnREdXJhdGlvbihidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRVbml0KGJ1aWxkZXIsIHVuaXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDE2KDAsIHVuaXQsIFRpbWVVbml0Lk1JTExJU0VDT05EKTtcbiAgICB9XG4gICAgc3RhdGljIGVuZER1cmF0aW9uKGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUR1cmF0aW9uKGJ1aWxkZXIsIHVuaXQpIHtcbiAgICAgICAgRHVyYXRpb24uc3RhcnREdXJhdGlvbihidWlsZGVyKTtcbiAgICAgICAgRHVyYXRpb24uYWRkVW5pdChidWlsZGVyLCB1bml0KTtcbiAgICAgICAgcmV0dXJuIER1cmF0aW9uLmVuZER1cmF0aW9uKGJ1aWxkZXIpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZHVyYXRpb24ubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEVuZGlhbm5lc3Mgb2YgdGhlIHBsYXRmb3JtIHByb2R1Y2luZyB0aGUgZGF0YVxuICovXG5leHBvcnQgdmFyIEVuZGlhbm5lc3M7XG4oZnVuY3Rpb24gKEVuZGlhbm5lc3MpIHtcbiAgICBFbmRpYW5uZXNzW0VuZGlhbm5lc3NbXCJMaXR0bGVcIl0gPSAwXSA9IFwiTGl0dGxlXCI7XG4gICAgRW5kaWFubmVzc1tFbmRpYW5uZXNzW1wiQmlnXCJdID0gMV0gPSBcIkJpZ1wiO1xufSkoRW5kaWFubmVzcyB8fCAoRW5kaWFubmVzcyA9IHt9KSk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVuZGlhbm5lc3MubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIERhdGEgc3RydWN0dXJlcyBmb3IgZGVzY3JpYmluZyBhIHRhYmxlIHJvdyBiYXRjaCAoYSBjb2xsZWN0aW9uIG9mXG4gKiBlcXVhbC1sZW5ndGggQXJyb3cgYXJyYXlzKVxuICogTWV0YWRhdGEgYWJvdXQgYSBmaWVsZCBhdCBzb21lIGxldmVsIG9mIGEgbmVzdGVkIHR5cGUgdHJlZSAoYnV0IG5vdFxuICogaXRzIGNoaWxkcmVuKS5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgYSBMaXN0PEludDE2PiB3aXRoIHZhbHVlcyBgW1sxLCAyLCAzXSwgbnVsbCwgWzRdLCBbNSwgNl0sIG51bGxdYFxuICogd291bGQgaGF2ZSB7bGVuZ3RoOiA1LCBudWxsX2NvdW50OiAyfSBmb3IgaXRzIExpc3Qgbm9kZSwgYW5kIHtsZW5ndGg6IDYsXG4gKiBudWxsX2NvdW50OiAwfSBmb3IgaXRzIEludDE2IG5vZGUsIGFzIHNlcGFyYXRlIEZpZWxkTm9kZSBzdHJ1Y3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWVsZE5vZGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHZhbHVlIHNsb3RzIGluIHRoZSBBcnJvdyBhcnJheSBhdCB0aGlzIGxldmVsIG9mIGEgbmVzdGVkXG4gICAgICogdHJlZVxuICAgICAqL1xuICAgIGxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBvYnNlcnZlZCBudWxscy4gRmllbGRzIHdpdGggbnVsbF9jb3VudCA9PSAwIG1heSBjaG9vc2Ugbm90XG4gICAgICogdG8gd3JpdGUgdGhlaXIgcGh5c2ljYWwgdmFsaWRpdHkgYml0bWFwIG91dCBhcyBhIG1hdGVyaWFsaXplZCBidWZmZXIsXG4gICAgICogaW5zdGVhZCBzZXR0aW5nIHRoZSBsZW5ndGggb2YgdGhlIGJpdG1hcCBidWZmZXIgdG8gMC5cbiAgICAgKi9cbiAgICBudWxsQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcyArIDgpO1xuICAgIH1cbiAgICBzdGF0aWMgc2l6ZU9mKCkge1xuICAgICAgICByZXR1cm4gMTY7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVGaWVsZE5vZGUoYnVpbGRlciwgbGVuZ3RoLCBudWxsX2NvdW50KSB7XG4gICAgICAgIGJ1aWxkZXIucHJlcCg4LCAxNik7XG4gICAgICAgIGJ1aWxkZXIud3JpdGVJbnQ2NChudWxsX2NvdW50KTtcbiAgICAgICAgYnVpbGRlci53cml0ZUludDY0KGxlbmd0aCk7XG4gICAgICAgIHJldHVybiBidWlsZGVyLm9mZnNldCgpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmllbGQtbm9kZS5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJztcbmltcG9ydCB7IERpY3Rpb25hcnlFbmNvZGluZyB9IGZyb20gJy4vZGljdGlvbmFyeS1lbmNvZGluZy5tanMnO1xuaW1wb3J0IHsgS2V5VmFsdWUgfSBmcm9tICcuL2tleS12YWx1ZS5tanMnO1xuaW1wb3J0IHsgVHlwZSB9IGZyb20gJy4vdHlwZS5tanMnO1xuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBBIGZpZWxkIHJlcHJlc2VudHMgYSBuYW1lZCBjb2x1bW4gaW4gYSByZWNvcmQgLyByb3cgYmF0Y2ggb3IgY2hpbGQgb2YgYVxuICogbmVzdGVkIHR5cGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWVsZCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNGaWVsZChiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBGaWVsZCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRmllbGQoYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IEZpZWxkKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIG5hbWUob3B0aW9uYWxFbmNvZGluZykge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhpcyBmaWVsZCBjYW4gY29udGFpbiBudWxscy4gU2hvdWxkIGJlIHRydWUgaW4gZ2VuZXJhbC5cbiAgICAgKi9cbiAgICBudWxsYWJsZSgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAhIXRoaXMuYmIucmVhZEludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogZmFsc2U7XG4gICAgfVxuICAgIHR5cGVUeXBlKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZFVpbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IFR5cGUuTk9ORTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgdHlwZSBvZiB0aGUgZGVjb2RlZCB2YWx1ZSBpZiB0aGUgZmllbGQgaXMgZGljdGlvbmFyeSBlbmNvZGVkLlxuICAgICAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0eXBlKG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdW5pb24ob2JqLCB0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcmVzZW50IG9ubHkgaWYgdGhlIGZpZWxkIGlzIGRpY3Rpb25hcnkgZW5jb2RlZC5cbiAgICAgKi9cbiAgICBkaWN0aW9uYXJ5KG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBEaWN0aW9uYXJ5RW5jb2RpbmcoKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIpIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogY2hpbGRyZW4gYXBwbHkgb25seSB0byBuZXN0ZWQgZGF0YSB0eXBlcyBsaWtlIFN0cnVjdCwgTGlzdCBhbmQgVW5pb24uIEZvclxuICAgICAqIHByaW1pdGl2ZSB0eXBlcyBjaGlsZHJlbiB3aWxsIGhhdmUgbGVuZ3RoIDAuXG4gICAgICovXG4gICAgY2hpbGRyZW4oaW5kZXgsIG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBGaWVsZCgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICBjaGlsZHJlbkxlbmd0aCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXNlci1kZWZpbmVkIG1ldGFkYXRhXG4gICAgICovXG4gICAgY3VzdG9tTWV0YWRhdGEoaW5kZXgsIG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxNik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBLZXlWYWx1ZSgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICBjdXN0b21NZXRhZGF0YUxlbmd0aCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTYpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0RmllbGQoYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDcpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkTmFtZShidWlsZGVyLCBuYW1lT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMCwgbmFtZU9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGROdWxsYWJsZShidWlsZGVyLCBudWxsYWJsZSkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50OCgxLCArbnVsbGFibGUsICtmYWxzZSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRUeXBlVHlwZShidWlsZGVyLCB0eXBlVHlwZSkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50OCgyLCB0eXBlVHlwZSwgVHlwZS5OT05FKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZFR5cGUoYnVpbGRlciwgdHlwZU9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDMsIHR5cGVPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkRGljdGlvbmFyeShidWlsZGVyLCBkaWN0aW9uYXJ5T2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNCwgZGljdGlvbmFyeU9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRDaGlsZHJlbihidWlsZGVyLCBjaGlsZHJlbk9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDUsIGNoaWxkcmVuT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUNoaWxkcmVuVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7XG4gICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0Q2hpbGRyZW5WZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRDdXN0b21NZXRhZGF0YShidWlsZGVyLCBjdXN0b21NZXRhZGF0YU9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDYsIGN1c3RvbU1ldGFkYXRhT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUN1c3RvbU1ldGFkYXRhVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7XG4gICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0Q3VzdG9tTWV0YWRhdGFWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmRGaWVsZChidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWVsZC5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJztcbmV4cG9ydCBjbGFzcyBGaXhlZFNpemVCaW5hcnkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzRml4ZWRTaXplQmluYXJ5KGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IEZpeGVkU2l6ZUJpbmFyeSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRml4ZWRTaXplQmluYXJ5KGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBGaXhlZFNpemVCaW5hcnkoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGJ5dGVzIHBlciB2YWx1ZVxuICAgICAqL1xuICAgIGJ5dGVXaWR0aCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRGaXhlZFNpemVCaW5hcnkoYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDEpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkQnl0ZVdpZHRoKGJ1aWxkZXIsIGJ5dGVXaWR0aCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMCwgYnl0ZVdpZHRoLCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGVuZEZpeGVkU2l6ZUJpbmFyeShidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVGaXhlZFNpemVCaW5hcnkoYnVpbGRlciwgYnl0ZVdpZHRoKSB7XG4gICAgICAgIEZpeGVkU2l6ZUJpbmFyeS5zdGFydEZpeGVkU2l6ZUJpbmFyeShidWlsZGVyKTtcbiAgICAgICAgRml4ZWRTaXplQmluYXJ5LmFkZEJ5dGVXaWR0aChidWlsZGVyLCBieXRlV2lkdGgpO1xuICAgICAgICByZXR1cm4gRml4ZWRTaXplQmluYXJ5LmVuZEZpeGVkU2l6ZUJpbmFyeShidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpeGVkLXNpemUtYmluYXJ5Lm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuZXhwb3J0IGNsYXNzIEZpeGVkU2l6ZUxpc3Qge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzRml4ZWRTaXplTGlzdChiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBGaXhlZFNpemVMaXN0KCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNGaXhlZFNpemVMaXN0KGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBGaXhlZFNpemVMaXN0KCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBsaXN0IGl0ZW1zIHBlciB2YWx1ZVxuICAgICAqL1xuICAgIGxpc3RTaXplKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydEZpeGVkU2l6ZUxpc3QoYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDEpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkTGlzdFNpemUoYnVpbGRlciwgbGlzdFNpemUpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDMyKDAsIGxpc3RTaXplLCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGVuZEZpeGVkU2l6ZUxpc3QoYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlRml4ZWRTaXplTGlzdChidWlsZGVyLCBsaXN0U2l6ZSkge1xuICAgICAgICBGaXhlZFNpemVMaXN0LnN0YXJ0Rml4ZWRTaXplTGlzdChidWlsZGVyKTtcbiAgICAgICAgRml4ZWRTaXplTGlzdC5hZGRMaXN0U2l6ZShidWlsZGVyLCBsaXN0U2l6ZSk7XG4gICAgICAgIHJldHVybiBGaXhlZFNpemVMaXN0LmVuZEZpeGVkU2l6ZUxpc3QoYnVpbGRlcik7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1maXhlZC1zaXplLWxpc3QubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5pbXBvcnQgeyBQcmVjaXNpb24gfSBmcm9tICcuL3ByZWNpc2lvbi5tanMnO1xuZXhwb3J0IGNsYXNzIEZsb2F0aW5nUG9pbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzRmxvYXRpbmdQb2ludChiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBGbG9hdGluZ1BvaW50KCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNGbG9hdGluZ1BvaW50KGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBGbG9hdGluZ1BvaW50KCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHByZWNpc2lvbigpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBQcmVjaXNpb24uSEFMRjtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0RmxvYXRpbmdQb2ludChidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRQcmVjaXNpb24oYnVpbGRlciwgcHJlY2lzaW9uKSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQxNigwLCBwcmVjaXNpb24sIFByZWNpc2lvbi5IQUxGKTtcbiAgICB9XG4gICAgc3RhdGljIGVuZEZsb2F0aW5nUG9pbnQoYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlRmxvYXRpbmdQb2ludChidWlsZGVyLCBwcmVjaXNpb24pIHtcbiAgICAgICAgRmxvYXRpbmdQb2ludC5zdGFydEZsb2F0aW5nUG9pbnQoYnVpbGRlcik7XG4gICAgICAgIEZsb2F0aW5nUG9pbnQuYWRkUHJlY2lzaW9uKGJ1aWxkZXIsIHByZWNpc2lvbik7XG4gICAgICAgIHJldHVybiBGbG9hdGluZ1BvaW50LmVuZEZsb2F0aW5nUG9pbnQoYnVpbGRlcik7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1mbG9hdGluZy1wb2ludC5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJztcbmltcG9ydCB7IEJsb2NrIH0gZnJvbSAnLi9ibG9jay5tanMnO1xuaW1wb3J0IHsgS2V5VmFsdWUgfSBmcm9tICcuL2tleS12YWx1ZS5tanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFWZXJzaW9uIH0gZnJvbSAnLi9tZXRhZGF0YS12ZXJzaW9uLm1qcyc7XG5pbXBvcnQgeyBTY2hlbWEgfSBmcm9tICcuL3NjaGVtYS5tanMnO1xuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBBcnJvdyBGaWxlIG1ldGFkYXRhXG4gKlxuICovXG5leHBvcnQgY2xhc3MgRm9vdGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc0Zvb3RlcihiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBGb290ZXIoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0Zvb3RlcihiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgRm9vdGVyKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHZlcnNpb24oKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogTWV0YWRhdGFWZXJzaW9uLlYxO1xuICAgIH1cbiAgICBzY2hlbWEob2JqKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgU2NoZW1hKCkpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiKSA6IG51bGw7XG4gICAgfVxuICAgIGRpY3Rpb25hcmllcyhpbmRleCwgb2JqKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgQmxvY2soKSkuX19pbml0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiAyNCwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICBkaWN0aW9uYXJpZXNMZW5ndGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDtcbiAgICB9XG4gICAgcmVjb3JkQmF0Y2hlcyhpbmRleCwgb2JqKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEJsb2NrKCkpLl9faW5pdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogMjQsIHRoaXMuYmIpIDogbnVsbDtcbiAgICB9XG4gICAgcmVjb3JkQmF0Y2hlc0xlbmd0aCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXNlci1kZWZpbmVkIG1ldGFkYXRhXG4gICAgICovXG4gICAgY3VzdG9tTWV0YWRhdGEoaW5kZXgsIG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBLZXlWYWx1ZSgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICBjdXN0b21NZXRhZGF0YUxlbmd0aCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0Rm9vdGVyKGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCg1KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZFZlcnNpb24oYnVpbGRlciwgdmVyc2lvbikge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MTYoMCwgdmVyc2lvbiwgTWV0YWRhdGFWZXJzaW9uLlYxKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZFNjaGVtYShidWlsZGVyLCBzY2hlbWFPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxLCBzY2hlbWFPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkRGljdGlvbmFyaWVzKGJ1aWxkZXIsIGRpY3Rpb25hcmllc09mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDIsIGRpY3Rpb25hcmllc09mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydERpY3Rpb25hcmllc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykge1xuICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDI0LCBudW1FbGVtcywgOCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRSZWNvcmRCYXRjaGVzKGJ1aWxkZXIsIHJlY29yZEJhdGNoZXNPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzLCByZWNvcmRCYXRjaGVzT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0UmVjb3JkQmF0Y2hlc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykge1xuICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDI0LCBudW1FbGVtcywgOCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRDdXN0b21NZXRhZGF0YShidWlsZGVyLCBjdXN0b21NZXRhZGF0YU9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDQsIGN1c3RvbU1ldGFkYXRhT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUN1c3RvbU1ldGFkYXRhVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7XG4gICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0Q3VzdG9tTWV0YWRhdGFWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmRGb290ZXIoYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgZmluaXNoRm9vdGVyQnVmZmVyKGJ1aWxkZXIsIG9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmZpbmlzaChvZmZzZXQpO1xuICAgIH1cbiAgICBzdGF0aWMgZmluaXNoU2l6ZVByZWZpeGVkRm9vdGVyQnVmZmVyKGJ1aWxkZXIsIG9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmZpbmlzaChvZmZzZXQsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb290ZXIubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5leHBvcnQgY2xhc3MgSW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc0ludChiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBJbnQoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0ludChiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgSW50KCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIGJpdFdpZHRoKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7XG4gICAgfVxuICAgIGlzU2lnbmVkKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/ICEhdGhpcy5iYi5yZWFkSW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBmYWxzZTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0SW50KGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCgyKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZEJpdFdpZHRoKGJ1aWxkZXIsIGJpdFdpZHRoKSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQzMigwLCBiaXRXaWR0aCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRJc1NpZ25lZChidWlsZGVyLCBpc1NpZ25lZCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50OCgxLCAraXNTaWduZWQsICtmYWxzZSk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmRJbnQoYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlSW50KGJ1aWxkZXIsIGJpdFdpZHRoLCBpc1NpZ25lZCkge1xuICAgICAgICBJbnQuc3RhcnRJbnQoYnVpbGRlcik7XG4gICAgICAgIEludC5hZGRCaXRXaWR0aChidWlsZGVyLCBiaXRXaWR0aCk7XG4gICAgICAgIEludC5hZGRJc1NpZ25lZChidWlsZGVyLCBpc1NpZ25lZCk7XG4gICAgICAgIHJldHVybiBJbnQuZW5kSW50KGJ1aWxkZXIpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW50Lm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuZXhwb3J0IHZhciBJbnRlcnZhbFVuaXQ7XG4oZnVuY3Rpb24gKEludGVydmFsVW5pdCkge1xuICAgIEludGVydmFsVW5pdFtJbnRlcnZhbFVuaXRbXCJZRUFSX01PTlRIXCJdID0gMF0gPSBcIllFQVJfTU9OVEhcIjtcbiAgICBJbnRlcnZhbFVuaXRbSW50ZXJ2YWxVbml0W1wiREFZX1RJTUVcIl0gPSAxXSA9IFwiREFZX1RJTUVcIjtcbiAgICBJbnRlcnZhbFVuaXRbSW50ZXJ2YWxVbml0W1wiTU9OVEhfREFZX05BTk9cIl0gPSAyXSA9IFwiTU9OVEhfREFZX05BTk9cIjtcbn0pKEludGVydmFsVW5pdCB8fCAoSW50ZXJ2YWxVbml0ID0ge30pKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW50ZXJ2YWwtdW5pdC5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJztcbmltcG9ydCB7IEludGVydmFsVW5pdCB9IGZyb20gJy4vaW50ZXJ2YWwtdW5pdC5tanMnO1xuZXhwb3J0IGNsYXNzIEludGVydmFsIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc0ludGVydmFsKGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IEludGVydmFsKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNJbnRlcnZhbChiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgSW50ZXJ2YWwoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgdW5pdCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBJbnRlcnZhbFVuaXQuWUVBUl9NT05USDtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0SW50ZXJ2YWwoYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDEpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkVW5pdChidWlsZGVyLCB1bml0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQxNigwLCB1bml0LCBJbnRlcnZhbFVuaXQuWUVBUl9NT05USCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmRJbnRlcnZhbChidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVJbnRlcnZhbChidWlsZGVyLCB1bml0KSB7XG4gICAgICAgIEludGVydmFsLnN0YXJ0SW50ZXJ2YWwoYnVpbGRlcik7XG4gICAgICAgIEludGVydmFsLmFkZFVuaXQoYnVpbGRlciwgdW5pdCk7XG4gICAgICAgIHJldHVybiBJbnRlcnZhbC5lbmRJbnRlcnZhbChidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWludGVydmFsLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiB1c2VyIGRlZmluZWQga2V5IHZhbHVlIHBhaXJzIHRvIGFkZCBjdXN0b20gbWV0YWRhdGEgdG8gYXJyb3dcbiAqIGtleSBuYW1lc3BhY2luZyBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHVzZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEtleVZhbHVlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc0tleVZhbHVlKGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IEtleVZhbHVlKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNLZXlWYWx1ZShiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgS2V5VmFsdWUoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAga2V5KG9wdGlvbmFsRW5jb2RpbmcpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7XG4gICAgfVxuICAgIHZhbHVlKG9wdGlvbmFsRW5jb2RpbmcpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zICsgb2Zmc2V0LCBvcHRpb25hbEVuY29kaW5nKSA6IG51bGw7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydEtleVZhbHVlKGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCgyKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZEtleShidWlsZGVyLCBrZXlPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgwLCBrZXlPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkVmFsdWUoYnVpbGRlciwgdmFsdWVPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxLCB2YWx1ZU9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmRLZXlWYWx1ZShidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVLZXlWYWx1ZShidWlsZGVyLCBrZXlPZmZzZXQsIHZhbHVlT2Zmc2V0KSB7XG4gICAgICAgIEtleVZhbHVlLnN0YXJ0S2V5VmFsdWUoYnVpbGRlcik7XG4gICAgICAgIEtleVZhbHVlLmFkZEtleShidWlsZGVyLCBrZXlPZmZzZXQpO1xuICAgICAgICBLZXlWYWx1ZS5hZGRWYWx1ZShidWlsZGVyLCB2YWx1ZU9mZnNldCk7XG4gICAgICAgIHJldHVybiBLZXlWYWx1ZS5lbmRLZXlWYWx1ZShidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWtleS12YWx1ZS5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJztcbi8qKlxuICogU2FtZSBhcyBCaW5hcnksIGJ1dCB3aXRoIDY0LWJpdCBvZmZzZXRzLCBhbGxvd2luZyB0byByZXByZXNlbnRcbiAqIGV4dHJlbWVseSBsYXJnZSBkYXRhIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIExhcmdlQmluYXJ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc0xhcmdlQmluYXJ5KGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IExhcmdlQmluYXJ5KCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNMYXJnZUJpbmFyeShiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgTGFyZ2VCaW5hcnkoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0TGFyZ2VCaW5hcnkoYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDApO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kTGFyZ2VCaW5hcnkoYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlTGFyZ2VCaW5hcnkoYnVpbGRlcikge1xuICAgICAgICBMYXJnZUJpbmFyeS5zdGFydExhcmdlQmluYXJ5KGJ1aWxkZXIpO1xuICAgICAgICByZXR1cm4gTGFyZ2VCaW5hcnkuZW5kTGFyZ2VCaW5hcnkoYnVpbGRlcik7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYXJnZS1iaW5hcnkubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG4vKipcbiAqIFNhbWUgYXMgTGlzdCwgYnV0IHdpdGggNjQtYml0IG9mZnNldHMsIGFsbG93aW5nIHRvIHJlcHJlc2VudFxuICogZXh0cmVtZWx5IGxhcmdlIGRhdGEgdmFsdWVzLlxuICovXG5leHBvcnQgY2xhc3MgTGFyZ2VMaXN0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc0xhcmdlTGlzdChiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBMYXJnZUxpc3QoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0xhcmdlTGlzdChiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgTGFyZ2VMaXN0KCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydExhcmdlTGlzdChidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmRMYXJnZUxpc3QoYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlTGFyZ2VMaXN0KGJ1aWxkZXIpIHtcbiAgICAgICAgTGFyZ2VMaXN0LnN0YXJ0TGFyZ2VMaXN0KGJ1aWxkZXIpO1xuICAgICAgICByZXR1cm4gTGFyZ2VMaXN0LmVuZExhcmdlTGlzdChidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxhcmdlLWxpc3QubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG4vKipcbiAqIFNhbWUgYXMgVXRmOCwgYnV0IHdpdGggNjQtYml0IG9mZnNldHMsIGFsbG93aW5nIHRvIHJlcHJlc2VudFxuICogZXh0cmVtZWx5IGxhcmdlIGRhdGEgdmFsdWVzLlxuICovXG5leHBvcnQgY2xhc3MgTGFyZ2VVdGY4IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc0xhcmdlVXRmOChiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBMYXJnZVV0ZjgoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0xhcmdlVXRmOChiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgTGFyZ2VVdGY4KCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydExhcmdlVXRmOChidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmRMYXJnZVV0ZjgoYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlTGFyZ2VVdGY4KGJ1aWxkZXIpIHtcbiAgICAgICAgTGFyZ2VVdGY4LnN0YXJ0TGFyZ2VVdGY4KGJ1aWxkZXIpO1xuICAgICAgICByZXR1cm4gTGFyZ2VVdGY4LmVuZExhcmdlVXRmOChidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxhcmdlLXV0ZjgubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5leHBvcnQgY2xhc3MgTGlzdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNMaXN0KGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IExpc3QoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0xpc3QoYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IExpc3QoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0TGlzdChidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmRMaXN0KGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUxpc3QoYnVpbGRlcikge1xuICAgICAgICBMaXN0LnN0YXJ0TGlzdChidWlsZGVyKTtcbiAgICAgICAgcmV0dXJuIExpc3QuZW5kTGlzdChidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxpc3QubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG4vKipcbiAqIEEgTWFwIGlzIGEgbG9naWNhbCBuZXN0ZWQgdHlwZSB0aGF0IGlzIHJlcHJlc2VudGVkIGFzXG4gKlxuICogTGlzdDxlbnRyaWVzOiBTdHJ1Y3Q8a2V5OiBLLCB2YWx1ZTogVj4+XG4gKlxuICogSW4gdGhpcyBsYXlvdXQsIHRoZSBrZXlzIGFuZCB2YWx1ZXMgYXJlIGVhY2ggcmVzcGVjdGl2ZWx5IGNvbnRpZ3VvdXMuIFdlIGRvXG4gKiBub3QgY29uc3RyYWluIHRoZSBrZXkgYW5kIHZhbHVlIHR5cGVzLCBzbyB0aGUgYXBwbGljYXRpb24gaXMgcmVzcG9uc2libGVcbiAqIGZvciBlbnN1cmluZyB0aGF0IHRoZSBrZXlzIGFyZSBoYXNoYWJsZSBhbmQgdW5pcXVlLiBXaGV0aGVyIHRoZSBrZXlzIGFyZSBzb3J0ZWRcbiAqIG1heSBiZSBzZXQgaW4gdGhlIG1ldGFkYXRhIGZvciB0aGlzIGZpZWxkLlxuICpcbiAqIEluIGEgZmllbGQgd2l0aCBNYXAgdHlwZSwgdGhlIGZpZWxkIGhhcyBhIGNoaWxkIFN0cnVjdCBmaWVsZCwgd2hpY2ggdGhlblxuICogaGFzIHR3byBjaGlsZHJlbjoga2V5IHR5cGUgYW5kIHRoZSBzZWNvbmQgdGhlIHZhbHVlIHR5cGUuIFRoZSBuYW1lcyBvZiB0aGVcbiAqIGNoaWxkIGZpZWxkcyBtYXkgYmUgcmVzcGVjdGl2ZWx5IFwiZW50cmllc1wiLCBcImtleVwiLCBhbmQgXCJ2YWx1ZVwiLCBidXQgdGhpcyBpc1xuICogbm90IGVuZm9yY2VkLlxuICpcbiAqIE1hcFxuICogYGBgdGV4dFxuICogICAtIGNoaWxkWzBdIGVudHJpZXM6IFN0cnVjdFxuICogICAgIC0gY2hpbGRbMF0ga2V5OiBLXG4gKiAgICAgLSBjaGlsZFsxXSB2YWx1ZTogVlxuICogYGBgXG4gKiBOZWl0aGVyIHRoZSBcImVudHJpZXNcIiBmaWVsZCBub3IgdGhlIFwia2V5XCIgZmllbGQgbWF5IGJlIG51bGxhYmxlLlxuICpcbiAqIFRoZSBtZXRhZGF0YSBpcyBzdHJ1Y3R1cmVkIHNvIHRoYXQgQXJyb3cgc3lzdGVtcyB3aXRob3V0IHNwZWNpYWwgaGFuZGxpbmdcbiAqIGZvciBNYXAgY2FuIG1ha2UgTWFwIGFuIGFsaWFzIGZvciBMaXN0LiBUaGUgXCJsYXlvdXRcIiBhdHRyaWJ1dGUgZm9yIHRoZSBNYXBcbiAqIGZpZWxkIG11c3QgaGF2ZSB0aGUgc2FtZSBjb250ZW50cyBhcyBhIExpc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXAge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzTWFwKGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IE1hcCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzTWFwKGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBNYXAoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRvIHRydWUgaWYgdGhlIGtleXMgd2l0aGluIGVhY2ggdmFsdWUgYXJlIHNvcnRlZFxuICAgICAqL1xuICAgIGtleXNTb3J0ZWQoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gISF0aGlzLmJiLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IGZhbHNlO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRNYXAoYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDEpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkS2V5c1NvcnRlZChidWlsZGVyLCBrZXlzU29ydGVkKSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDAsICtrZXlzU29ydGVkLCArZmFsc2UpO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kTWFwKGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZU1hcChidWlsZGVyLCBrZXlzU29ydGVkKSB7XG4gICAgICAgIE1hcC5zdGFydE1hcChidWlsZGVyKTtcbiAgICAgICAgTWFwLmFkZEtleXNTb3J0ZWQoYnVpbGRlciwga2V5c1NvcnRlZCk7XG4gICAgICAgIHJldHVybiBNYXAuZW5kTWFwKGJ1aWxkZXIpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWFwLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0IHsgRGljdGlvbmFyeUJhdGNoIH0gZnJvbSAnLi9kaWN0aW9uYXJ5LWJhdGNoLm1qcyc7XG5pbXBvcnQgeyBSZWNvcmRCYXRjaCB9IGZyb20gJy4vcmVjb3JkLWJhdGNoLm1qcyc7XG5pbXBvcnQgeyBTY2hlbWEgfSBmcm9tICcuL3NjaGVtYS5tanMnO1xuaW1wb3J0IHsgU3BhcnNlVGVuc29yIH0gZnJvbSAnLi9zcGFyc2UtdGVuc29yLm1qcyc7XG5pbXBvcnQgeyBUZW5zb3IgfSBmcm9tICcuL3RlbnNvci5tanMnO1xuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBUaGUgcm9vdCBNZXNzYWdlIHR5cGVcbiAqIFRoaXMgdW5pb24gZW5hYmxlcyB1cyB0byBlYXNpbHkgc2VuZCBkaWZmZXJlbnQgbWVzc2FnZSB0eXBlcyB3aXRob3V0XG4gKiByZWR1bmRhbnQgc3RvcmFnZSwgYW5kIGluIHRoZSBmdXR1cmUgd2UgY2FuIGVhc2lseSBhZGQgbmV3IG1lc3NhZ2UgdHlwZXMuXG4gKlxuICogQXJyb3cgaW1wbGVtZW50YXRpb25zIGRvIG5vdCBuZWVkIHRvIGltcGxlbWVudCBhbGwgb2YgdGhlIG1lc3NhZ2UgdHlwZXMsXG4gKiB3aGljaCBtYXkgaW5jbHVkZSBleHBlcmltZW50YWwgbWV0YWRhdGEgdHlwZXMuIEZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHksXG4gKiBpdCBpcyBiZXN0IHRvIHNlbmQgZGF0YSB1c2luZyBSZWNvcmRCYXRjaFxuICovXG5leHBvcnQgdmFyIE1lc3NhZ2VIZWFkZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VIZWFkZXIpIHtcbiAgICBNZXNzYWdlSGVhZGVyW01lc3NhZ2VIZWFkZXJbXCJOT05FXCJdID0gMF0gPSBcIk5PTkVcIjtcbiAgICBNZXNzYWdlSGVhZGVyW01lc3NhZ2VIZWFkZXJbXCJTY2hlbWFcIl0gPSAxXSA9IFwiU2NoZW1hXCI7XG4gICAgTWVzc2FnZUhlYWRlcltNZXNzYWdlSGVhZGVyW1wiRGljdGlvbmFyeUJhdGNoXCJdID0gMl0gPSBcIkRpY3Rpb25hcnlCYXRjaFwiO1xuICAgIE1lc3NhZ2VIZWFkZXJbTWVzc2FnZUhlYWRlcltcIlJlY29yZEJhdGNoXCJdID0gM10gPSBcIlJlY29yZEJhdGNoXCI7XG4gICAgTWVzc2FnZUhlYWRlcltNZXNzYWdlSGVhZGVyW1wiVGVuc29yXCJdID0gNF0gPSBcIlRlbnNvclwiO1xuICAgIE1lc3NhZ2VIZWFkZXJbTWVzc2FnZUhlYWRlcltcIlNwYXJzZVRlbnNvclwiXSA9IDVdID0gXCJTcGFyc2VUZW5zb3JcIjtcbn0pKE1lc3NhZ2VIZWFkZXIgfHwgKE1lc3NhZ2VIZWFkZXIgPSB7fSkpO1xuZXhwb3J0IGZ1bmN0aW9uIHVuaW9uVG9NZXNzYWdlSGVhZGVyKHR5cGUsIGFjY2Vzc29yKSB7XG4gICAgc3dpdGNoIChNZXNzYWdlSGVhZGVyW3R5cGVdKSB7XG4gICAgICAgIGNhc2UgJ05PTkUnOiByZXR1cm4gbnVsbDtcbiAgICAgICAgY2FzZSAnU2NoZW1hJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBTY2hlbWEoKSk7XG4gICAgICAgIGNhc2UgJ0RpY3Rpb25hcnlCYXRjaCc6IHJldHVybiBhY2Nlc3NvcihuZXcgRGljdGlvbmFyeUJhdGNoKCkpO1xuICAgICAgICBjYXNlICdSZWNvcmRCYXRjaCc6IHJldHVybiBhY2Nlc3NvcihuZXcgUmVjb3JkQmF0Y2goKSk7XG4gICAgICAgIGNhc2UgJ1RlbnNvcic6IHJldHVybiBhY2Nlc3NvcihuZXcgVGVuc29yKCkpO1xuICAgICAgICBjYXNlICdTcGFyc2VUZW5zb3InOiByZXR1cm4gYWNjZXNzb3IobmV3IFNwYXJzZVRlbnNvcigpKTtcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHVuaW9uTGlzdFRvTWVzc2FnZUhlYWRlcih0eXBlLCBhY2Nlc3NvciwgaW5kZXgpIHtcbiAgICBzd2l0Y2ggKE1lc3NhZ2VIZWFkZXJbdHlwZV0pIHtcbiAgICAgICAgY2FzZSAnTk9ORSc6IHJldHVybiBudWxsO1xuICAgICAgICBjYXNlICdTY2hlbWEnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBTY2hlbWEoKSk7XG4gICAgICAgIGNhc2UgJ0RpY3Rpb25hcnlCYXRjaCc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IERpY3Rpb25hcnlCYXRjaCgpKTtcbiAgICAgICAgY2FzZSAnUmVjb3JkQmF0Y2gnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBSZWNvcmRCYXRjaCgpKTtcbiAgICAgICAgY2FzZSAnVGVuc29yJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgVGVuc29yKCkpO1xuICAgICAgICBjYXNlICdTcGFyc2VUZW5zb3InOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBTcGFyc2VUZW5zb3IoKSk7XG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVzc2FnZS1oZWFkZXIubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5pbXBvcnQgeyBLZXlWYWx1ZSB9IGZyb20gJy4va2V5LXZhbHVlLm1qcyc7XG5pbXBvcnQgeyBNZXNzYWdlSGVhZGVyIH0gZnJvbSAnLi9tZXNzYWdlLWhlYWRlci5tanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFWZXJzaW9uIH0gZnJvbSAnLi9tZXRhZGF0YS12ZXJzaW9uLm1qcyc7XG5leHBvcnQgY2xhc3MgTWVzc2FnZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNNZXNzYWdlKGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IE1lc3NhZ2UoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc01lc3NhZ2UoYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IE1lc3NhZ2UoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgdmVyc2lvbigpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBNZXRhZGF0YVZlcnNpb24uVjE7XG4gICAgfVxuICAgIGhlYWRlclR5cGUoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkVWludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogTWVzc2FnZUhlYWRlci5OT05FO1xuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaGVhZGVyKG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX191bmlvbihvYmosIHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IG51bGw7XG4gICAgfVxuICAgIGJvZHlMZW5ndGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IHRoaXMuYmIuY3JlYXRlTG9uZygwLCAwKTtcbiAgICB9XG4gICAgY3VzdG9tTWV0YWRhdGEoaW5kZXgsIG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBLZXlWYWx1ZSgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICBjdXN0b21NZXRhZGF0YUxlbmd0aCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0TWVzc2FnZShidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoNSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRWZXJzaW9uKGJ1aWxkZXIsIHZlcnNpb24pIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDE2KDAsIHZlcnNpb24sIE1ldGFkYXRhVmVyc2lvbi5WMSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRIZWFkZXJUeXBlKGJ1aWxkZXIsIGhlYWRlclR5cGUpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDgoMSwgaGVhZGVyVHlwZSwgTWVzc2FnZUhlYWRlci5OT05FKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZEhlYWRlcihidWlsZGVyLCBoZWFkZXJPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgyLCBoZWFkZXJPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkQm9keUxlbmd0aChidWlsZGVyLCBib2R5TGVuZ3RoKSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ2NCgzLCBib2R5TGVuZ3RoLCBidWlsZGVyLmNyZWF0ZUxvbmcoMCwgMCkpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkQ3VzdG9tTWV0YWRhdGEoYnVpbGRlciwgY3VzdG9tTWV0YWRhdGFPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCg0LCBjdXN0b21NZXRhZGF0YU9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVDdXN0b21NZXRhZGF0YVZlY3RvcihidWlsZGVyLCBkYXRhKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpO1xuICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydEN1c3RvbU1ldGFkYXRhVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kTWVzc2FnZShidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICAgIHN0YXRpYyBmaW5pc2hNZXNzYWdlQnVmZmVyKGJ1aWxkZXIsIG9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmZpbmlzaChvZmZzZXQpO1xuICAgIH1cbiAgICBzdGF0aWMgZmluaXNoU2l6ZVByZWZpeGVkTWVzc2FnZUJ1ZmZlcihidWlsZGVyLCBvZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5maW5pc2gob2Zmc2V0LCB1bmRlZmluZWQsIHRydWUpO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlTWVzc2FnZShidWlsZGVyLCB2ZXJzaW9uLCBoZWFkZXJUeXBlLCBoZWFkZXJPZmZzZXQsIGJvZHlMZW5ndGgsIGN1c3RvbU1ldGFkYXRhT2Zmc2V0KSB7XG4gICAgICAgIE1lc3NhZ2Uuc3RhcnRNZXNzYWdlKGJ1aWxkZXIpO1xuICAgICAgICBNZXNzYWdlLmFkZFZlcnNpb24oYnVpbGRlciwgdmVyc2lvbik7XG4gICAgICAgIE1lc3NhZ2UuYWRkSGVhZGVyVHlwZShidWlsZGVyLCBoZWFkZXJUeXBlKTtcbiAgICAgICAgTWVzc2FnZS5hZGRIZWFkZXIoYnVpbGRlciwgaGVhZGVyT2Zmc2V0KTtcbiAgICAgICAgTWVzc2FnZS5hZGRCb2R5TGVuZ3RoKGJ1aWxkZXIsIGJvZHlMZW5ndGgpO1xuICAgICAgICBNZXNzYWdlLmFkZEN1c3RvbU1ldGFkYXRhKGJ1aWxkZXIsIGN1c3RvbU1ldGFkYXRhT2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIE1lc3NhZ2UuZW5kTWVzc2FnZShidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lc3NhZ2UubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG4vKipcbiAqIExvZ2ljYWwgdHlwZXMsIHZlY3RvciBsYXlvdXRzLCBhbmQgc2NoZW1hc1xuICogRm9ybWF0IFZlcnNpb24gSGlzdG9yeS5cbiAqIFZlcnNpb24gMS4wIC0gRm9yd2FyZCBhbmQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZ3VhcmFudGVlZC5cbiAqIFZlcnNpb24gMS4xIC0gQWRkIERlY2ltYWwyNTYgKE5vIGZvcm1hdCByZWxlYXNlKS5cbiAqIFZlcnNpb24gMS4yIChQZW5kaW5nKS0gQWRkIEludGVydmFsIE1PTlRIX0RBWV9OQU5PXG4gKi9cbmV4cG9ydCB2YXIgTWV0YWRhdGFWZXJzaW9uO1xuKGZ1bmN0aW9uIChNZXRhZGF0YVZlcnNpb24pIHtcbiAgICAvKipcbiAgICAgKiAwLjEuMCAoT2N0b2JlciAyMDE2KS5cbiAgICAgKi9cbiAgICBNZXRhZGF0YVZlcnNpb25bTWV0YWRhdGFWZXJzaW9uW1wiVjFcIl0gPSAwXSA9IFwiVjFcIjtcbiAgICAvKipcbiAgICAgKiAwLjIuMCAoRmVicnVhcnkgMjAxNykuIE5vbi1iYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIFYxLlxuICAgICAqL1xuICAgIE1ldGFkYXRhVmVyc2lvbltNZXRhZGF0YVZlcnNpb25bXCJWMlwiXSA9IDFdID0gXCJWMlwiO1xuICAgIC8qKlxuICAgICAqIDAuMy4wIC0+IDAuNy4xIChNYXkgLSBEZWNlbWJlciAyMDE3KS4gTm9uLWJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggVjIuXG4gICAgICovXG4gICAgTWV0YWRhdGFWZXJzaW9uW01ldGFkYXRhVmVyc2lvbltcIlYzXCJdID0gMl0gPSBcIlYzXCI7XG4gICAgLyoqXG4gICAgICogPj0gMC44LjAgKERlY2VtYmVyIDIwMTcpLiBOb24tYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBWMy5cbiAgICAgKi9cbiAgICBNZXRhZGF0YVZlcnNpb25bTWV0YWRhdGFWZXJzaW9uW1wiVjRcIl0gPSAzXSA9IFwiVjRcIjtcbiAgICAvKipcbiAgICAgKiA+PSAxLjAuMCAoSnVseSAyMDIwLiBCYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIFY0IChWNSByZWFkZXJzIGNhbiByZWFkIFY0XG4gICAgICogbWV0YWRhdGEgYW5kIElQQyBtZXNzYWdlcykuIEltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gcHJvdmlkZSBhXG4gICAgICogVjQgY29tcGF0aWJpbGl0eSBtb2RlIHdpdGggVjUgZm9ybWF0IGNoYW5nZXMgZGlzYWJsZWQuXG4gICAgICpcbiAgICAgKiBJbmNvbXBhdGlibGUgY2hhbmdlcyBiZXR3ZWVuIFY0IGFuZCBWNTpcbiAgICAgKiAtIFVuaW9uIGJ1ZmZlciBsYXlvdXQgaGFzIGNoYW5nZWQuIEluIFY1LCBVbmlvbnMgZG9uJ3QgaGF2ZSBhIHZhbGlkaXR5XG4gICAgICogICBiaXRtYXAgYnVmZmVyLlxuICAgICAqL1xuICAgIE1ldGFkYXRhVmVyc2lvbltNZXRhZGF0YVZlcnNpb25bXCJWNVwiXSA9IDRdID0gXCJWNVwiO1xufSkoTWV0YWRhdGFWZXJzaW9uIHx8IChNZXRhZGF0YVZlcnNpb24gPSB7fSkpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXRhZGF0YS12ZXJzaW9uLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuLyoqXG4gKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBmbGF0YnVmZmVyIGluIHRoZSBUeXBlIHVuaW9uIGJlbG93XG4gKi9cbmV4cG9ydCBjbGFzcyBOdWxsIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc051bGwoYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgTnVsbCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzTnVsbChiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgTnVsbCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnROdWxsKGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCgwKTtcbiAgICB9XG4gICAgc3RhdGljIGVuZE51bGwoYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlTnVsbChidWlsZGVyKSB7XG4gICAgICAgIE51bGwuc3RhcnROdWxsKGJ1aWxkZXIpO1xuICAgICAgICByZXR1cm4gTnVsbC5lbmROdWxsKGJ1aWxkZXIpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bnVsbC5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmV4cG9ydCB2YXIgUHJlY2lzaW9uO1xuKGZ1bmN0aW9uIChQcmVjaXNpb24pIHtcbiAgICBQcmVjaXNpb25bUHJlY2lzaW9uW1wiSEFMRlwiXSA9IDBdID0gXCJIQUxGXCI7XG4gICAgUHJlY2lzaW9uW1ByZWNpc2lvbltcIlNJTkdMRVwiXSA9IDFdID0gXCJTSU5HTEVcIjtcbiAgICBQcmVjaXNpb25bUHJlY2lzaW9uW1wiRE9VQkxFXCJdID0gMl0gPSBcIkRPVUJMRVwiO1xufSkoUHJlY2lzaW9uIHx8IChQcmVjaXNpb24gPSB7fSkpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcmVjaXNpb24ubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5pbXBvcnQgeyBCb2R5Q29tcHJlc3Npb24gfSBmcm9tICcuL2JvZHktY29tcHJlc3Npb24ubWpzJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJy4vYnVmZmVyLm1qcyc7XG5pbXBvcnQgeyBGaWVsZE5vZGUgfSBmcm9tICcuL2ZpZWxkLW5vZGUubWpzJztcbi8qKlxuICogQSBkYXRhIGhlYWRlciBkZXNjcmliaW5nIHRoZSBzaGFyZWQgbWVtb3J5IGxheW91dCBvZiBhIFwicmVjb3JkXCIgb3IgXCJyb3dcIlxuICogYmF0Y2guIFNvbWUgc3lzdGVtcyBjYWxsIHRoaXMgYSBcInJvdyBiYXRjaFwiIGludGVybmFsbHkgYW5kIG90aGVycyBhIFwicmVjb3JkXG4gKiBiYXRjaFwiLlxuICovXG5leHBvcnQgY2xhc3MgUmVjb3JkQmF0Y2gge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzUmVjb3JkQmF0Y2goYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgUmVjb3JkQmF0Y2goKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1JlY29yZEJhdGNoKGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBSZWNvcmRCYXRjaCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBudW1iZXIgb2YgcmVjb3JkcyAvIHJvd3MuIFRoZSBhcnJheXMgaW4gdGhlIGJhdGNoIHNob3VsZCBhbGwgaGF2ZSB0aGlzXG4gICAgICogbGVuZ3RoXG4gICAgICovXG4gICAgbGVuZ3RoKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IHRoaXMuYmIuY3JlYXRlTG9uZygwLCAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTm9kZXMgY29ycmVzcG9uZCB0byB0aGUgcHJlLW9yZGVyZWQgZmxhdHRlbmVkIGxvZ2ljYWwgc2NoZW1hXG4gICAgICovXG4gICAgbm9kZXMoaW5kZXgsIG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEZpZWxkTm9kZSgpKS5fX2luaXQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDE2LCB0aGlzLmJiKSA6IG51bGw7XG4gICAgfVxuICAgIG5vZGVzTGVuZ3RoKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEJ1ZmZlcnMgY29ycmVzcG9uZCB0byB0aGUgcHJlLW9yZGVyZWQgZmxhdHRlbmVkIGJ1ZmZlciB0cmVlXG4gICAgICpcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGJ1ZmZlcnMgYXBwZW5kZWQgdG8gdGhpcyBsaXN0IGRlcGVuZHMgb24gdGhlIHNjaGVtYS4gRm9yXG4gICAgICogZXhhbXBsZSwgbW9zdCBwcmltaXRpdmUgYXJyYXlzIHdpbGwgaGF2ZSAyIGJ1ZmZlcnMsIDEgZm9yIHRoZSB2YWxpZGl0eVxuICAgICAqIGJpdG1hcCBhbmQgMSBmb3IgdGhlIHZhbHVlcy4gRm9yIHN0cnVjdCBhcnJheXMsIHRoZXJlIHdpbGwgb25seSBiZSBhXG4gICAgICogc2luZ2xlIGJ1ZmZlciBmb3IgdGhlIHZhbGlkaXR5IChudWxscykgYml0bWFwXG4gICAgICovXG4gICAgYnVmZmVycyhpbmRleCwgb2JqKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgQnVmZmVyKCkpLl9faW5pdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogMTYsIHRoaXMuYmIpIDogbnVsbDtcbiAgICB9XG4gICAgYnVmZmVyc0xlbmd0aCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCBjb21wcmVzc2lvbiBvZiB0aGUgbWVzc2FnZSBib2R5XG4gICAgICovXG4gICAgY29tcHJlc3Npb24ob2JqKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEJvZHlDb21wcmVzc2lvbigpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRSZWNvcmRCYXRjaChidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoNCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRMZW5ndGgoYnVpbGRlciwgbGVuZ3RoKSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ2NCgwLCBsZW5ndGgsIGJ1aWxkZXIuY3JlYXRlTG9uZygwLCAwKSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGROb2RlcyhidWlsZGVyLCBub2Rlc09mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDEsIG5vZGVzT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0Tm9kZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydFZlY3RvcigxNiwgbnVtRWxlbXMsIDgpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkQnVmZmVycyhidWlsZGVyLCBidWZmZXJzT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMiwgYnVmZmVyc09mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydEJ1ZmZlcnNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydFZlY3RvcigxNiwgbnVtRWxlbXMsIDgpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkQ29tcHJlc3Npb24oYnVpbGRlciwgY29tcHJlc3Npb25PZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzLCBjb21wcmVzc2lvbk9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmRSZWNvcmRCYXRjaChidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWNvcmQtYmF0Y2gubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5pbXBvcnQgeyBFbmRpYW5uZXNzIH0gZnJvbSAnLi9lbmRpYW5uZXNzLm1qcyc7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4vZmllbGQubWpzJztcbmltcG9ydCB7IEtleVZhbHVlIH0gZnJvbSAnLi9rZXktdmFsdWUubWpzJztcbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQSBTY2hlbWEgZGVzY3JpYmVzIHRoZSBjb2x1bW5zIGluIGEgcm93IGJhdGNoXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlbWEge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzU2NoZW1hKGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFNjaGVtYSgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzU2NoZW1hKGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBTY2hlbWEoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogZW5kaWFubmVzcyBvZiB0aGUgYnVmZmVyXG4gICAgICogaXQgaXMgTGl0dGxlIEVuZGlhbiBieSBkZWZhdWx0XG4gICAgICogaWYgZW5kaWFubmVzcyBkb2Vzbid0IG1hdGNoIHRoZSB1bmRlcmx5aW5nIHN5c3RlbSB0aGVuIHRoZSB2ZWN0b3JzIG5lZWQgdG8gYmUgY29udmVydGVkXG4gICAgICovXG4gICAgZW5kaWFubmVzcygpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBFbmRpYW5uZXNzLkxpdHRsZTtcbiAgICB9XG4gICAgZmllbGRzKGluZGV4LCBvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBGaWVsZCgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICBmaWVsZHNMZW5ndGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDtcbiAgICB9XG4gICAgY3VzdG9tTWV0YWRhdGEoaW5kZXgsIG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEtleVZhbHVlKCkpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDQpLCB0aGlzLmJiKSA6IG51bGw7XG4gICAgfVxuICAgIGN1c3RvbU1ldGFkYXRhTGVuZ3RoKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZlYXR1cmVzIHVzZWQgaW4gdGhlIHN0cmVhbS9maWxlLlxuICAgICAqL1xuICAgIGZlYXR1cmVzKGluZGV4KSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDY0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA4KSA6IHRoaXMuYmIuY3JlYXRlTG9uZygwLCAwKTtcbiAgICB9XG4gICAgZmVhdHVyZXNMZW5ndGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydFNjaGVtYShidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoNCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRFbmRpYW5uZXNzKGJ1aWxkZXIsIGVuZGlhbm5lc3MpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDE2KDAsIGVuZGlhbm5lc3MsIEVuZGlhbm5lc3MuTGl0dGxlKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZEZpZWxkcyhidWlsZGVyLCBmaWVsZHNPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxLCBmaWVsZHNPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlRmllbGRzVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7XG4gICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0RmllbGRzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkQ3VzdG9tTWV0YWRhdGEoYnVpbGRlciwgY3VzdG9tTWV0YWRhdGFPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgyLCBjdXN0b21NZXRhZGF0YU9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVDdXN0b21NZXRhZGF0YVZlY3RvcihidWlsZGVyLCBkYXRhKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpO1xuICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgYnVpbGRlci5hZGRPZmZzZXQoZGF0YVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydEN1c3RvbU1ldGFkYXRhVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkRmVhdHVyZXMoYnVpbGRlciwgZmVhdHVyZXNPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgzLCBmZWF0dXJlc09mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVGZWF0dXJlc1ZlY3RvcihidWlsZGVyLCBkYXRhKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoOCwgZGF0YS5sZW5ndGgsIDgpO1xuICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgYnVpbGRlci5hZGRJbnQ2NChkYXRhW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0RmVhdHVyZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmRTY2hlbWEoYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgZmluaXNoU2NoZW1hQnVmZmVyKGJ1aWxkZXIsIG9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmZpbmlzaChvZmZzZXQpO1xuICAgIH1cbiAgICBzdGF0aWMgZmluaXNoU2l6ZVByZWZpeGVkU2NoZW1hQnVmZmVyKGJ1aWxkZXIsIG9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmZpbmlzaChvZmZzZXQsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVTY2hlbWEoYnVpbGRlciwgZW5kaWFubmVzcywgZmllbGRzT2Zmc2V0LCBjdXN0b21NZXRhZGF0YU9mZnNldCwgZmVhdHVyZXNPZmZzZXQpIHtcbiAgICAgICAgU2NoZW1hLnN0YXJ0U2NoZW1hKGJ1aWxkZXIpO1xuICAgICAgICBTY2hlbWEuYWRkRW5kaWFubmVzcyhidWlsZGVyLCBlbmRpYW5uZXNzKTtcbiAgICAgICAgU2NoZW1hLmFkZEZpZWxkcyhidWlsZGVyLCBmaWVsZHNPZmZzZXQpO1xuICAgICAgICBTY2hlbWEuYWRkQ3VzdG9tTWV0YWRhdGEoYnVpbGRlciwgY3VzdG9tTWV0YWRhdGFPZmZzZXQpO1xuICAgICAgICBTY2hlbWEuYWRkRmVhdHVyZXMoYnVpbGRlciwgZmVhdHVyZXNPZmZzZXQpO1xuICAgICAgICByZXR1cm4gU2NoZW1hLmVuZFNjaGVtYShidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNjaGVtYS5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmV4cG9ydCB2YXIgU3BhcnNlTWF0cml4Q29tcHJlc3NlZEF4aXM7XG4oZnVuY3Rpb24gKFNwYXJzZU1hdHJpeENvbXByZXNzZWRBeGlzKSB7XG4gICAgU3BhcnNlTWF0cml4Q29tcHJlc3NlZEF4aXNbU3BhcnNlTWF0cml4Q29tcHJlc3NlZEF4aXNbXCJSb3dcIl0gPSAwXSA9IFwiUm93XCI7XG4gICAgU3BhcnNlTWF0cml4Q29tcHJlc3NlZEF4aXNbU3BhcnNlTWF0cml4Q29tcHJlc3NlZEF4aXNbXCJDb2x1bW5cIl0gPSAxXSA9IFwiQ29sdW1uXCI7XG59KShTcGFyc2VNYXRyaXhDb21wcmVzc2VkQXhpcyB8fCAoU3BhcnNlTWF0cml4Q29tcHJlc3NlZEF4aXMgPSB7fSkpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcGFyc2UtbWF0cml4LWNvbXByZXNzZWQtYXhpcy5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJy4vYnVmZmVyLm1qcyc7XG5pbXBvcnQgeyBJbnQgfSBmcm9tICcuL2ludC5tanMnO1xuaW1wb3J0IHsgU3BhcnNlTWF0cml4Q29tcHJlc3NlZEF4aXMgfSBmcm9tICcuL3NwYXJzZS1tYXRyaXgtY29tcHJlc3NlZC1heGlzLm1qcyc7XG4vKipcbiAqIENvbXByZXNzZWQgU3BhcnNlIGZvcm1hdCwgdGhhdCBpcyBtYXRyaXgtc3BlY2lmaWMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTcGFyc2VNYXRyaXhJbmRleENTWCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNTcGFyc2VNYXRyaXhJbmRleENTWChiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBTcGFyc2VNYXRyaXhJbmRleENTWCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzU3BhcnNlTWF0cml4SW5kZXhDU1goYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFNwYXJzZU1hdHJpeEluZGV4Q1NYKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoaWNoIGF4aXMsIHJvdyBvciBjb2x1bW4sIGlzIGNvbXByZXNzZWRcbiAgICAgKi9cbiAgICBjb21wcmVzc2VkQXhpcygpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBTcGFyc2VNYXRyaXhDb21wcmVzc2VkQXhpcy5Sb3c7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHZhbHVlcyBpbiBpbmRwdHJCdWZmZXJcbiAgICAgKi9cbiAgICBpbmRwdHJUeXBlKG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEludCgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBpbmRwdHJCdWZmZXIgc3RvcmVzIHRoZSBsb2NhdGlvbiBhbmQgc2l6ZSBvZiBpbmRwdHIgYXJyYXkgdGhhdFxuICAgICAqIHJlcHJlc2VudHMgdGhlIHJhbmdlIG9mIHRoZSByb3dzLlxuICAgICAqIFRoZSBpLXRoIHJvdyBzcGFucyBmcm9tIGBpbmRwdHJbaV1gIHRvIGBpbmRwdHJbaSsxXWAgaW4gdGhlIGRhdGEuXG4gICAgICogVGhlIGxlbmd0aCBvZiB0aGlzIGFycmF5IGlzIDEgKyAodGhlIG51bWJlciBvZiByb3dzKSwgYW5kIHRoZSB0eXBlXG4gICAgICogb2YgaW5kZXggdmFsdWUgaXMgbG9uZy5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlLCBsZXQgWCBiZSB0aGUgZm9sbG93aW5nIDZ4NCBtYXRyaXg6XG4gICAgICogYGBgdGV4dFxuICAgICAqICAgWCA6PSBbWzAsIDEsIDIsIDBdLFxuICAgICAqICAgICAgICAgWzAsIDAsIDMsIDBdLFxuICAgICAqICAgICAgICAgWzAsIDQsIDAsIDVdLFxuICAgICAqICAgICAgICAgWzAsIDAsIDAsIDBdLFxuICAgICAqICAgICAgICAgWzYsIDAsIDcsIDhdLFxuICAgICAqICAgICAgICAgWzAsIDksIDAsIDBdXS5cbiAgICAgKiBgYGBcbiAgICAgKiBUaGUgYXJyYXkgb2Ygbm9uLXplcm8gdmFsdWVzIGluIFggaXM6XG4gICAgICogYGBgdGV4dFxuICAgICAqICAgdmFsdWVzKFgpID0gWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldLlxuICAgICAqIGBgYFxuICAgICAqIEFuZCB0aGUgaW5kcHRyIG9mIFggaXM6XG4gICAgICogYGBgdGV4dFxuICAgICAqICAgaW5kcHRyKFgpID0gWzAsIDIsIDMsIDUsIDUsIDgsIDEwXS5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBpbmRwdHJCdWZmZXIob2JqKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgQnVmZmVyKCkpLl9faW5pdCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB2YWx1ZXMgaW4gaW5kaWNlc0J1ZmZlclxuICAgICAqL1xuICAgIGluZGljZXNUeXBlKG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBJbnQoKSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIpIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogaW5kaWNlc0J1ZmZlciBzdG9yZXMgdGhlIGxvY2F0aW9uIGFuZCBzaXplIG9mIHRoZSBhcnJheSB0aGF0XG4gICAgICogY29udGFpbnMgdGhlIGNvbHVtbiBpbmRpY2VzIG9mIHRoZSBjb3JyZXNwb25kaW5nIG5vbi16ZXJvIHZhbHVlcy5cbiAgICAgKiBUaGUgdHlwZSBvZiBpbmRleCB2YWx1ZSBpcyBsb25nLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGUsIHRoZSBpbmRpY2VzIG9mIHRoZSBhYm92ZSBYIGlzOlxuICAgICAqIGBgYHRleHRcbiAgICAgKiAgIGluZGljZXMoWCkgPSBbMSwgMiwgMiwgMSwgMywgMCwgMiwgMywgMV0uXG4gICAgICogYGBgXG4gICAgICogTm90ZSB0aGF0IHRoZSBpbmRpY2VzIGFyZSBzb3J0ZWQgaW4gbGV4aWNvZ3JhcGhpY2FsIG9yZGVyIGZvciBlYWNoIHJvdy5cbiAgICAgKi9cbiAgICBpbmRpY2VzQnVmZmVyKG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyAob2JqIHx8IG5ldyBCdWZmZXIoKSkuX19pbml0KHRoaXMuYmJfcG9zICsgb2Zmc2V0LCB0aGlzLmJiKSA6IG51bGw7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydFNwYXJzZU1hdHJpeEluZGV4Q1NYKGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCg1KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZENvbXByZXNzZWRBeGlzKGJ1aWxkZXIsIGNvbXByZXNzZWRBeGlzKSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQxNigwLCBjb21wcmVzc2VkQXhpcywgU3BhcnNlTWF0cml4Q29tcHJlc3NlZEF4aXMuUm93KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZEluZHB0clR5cGUoYnVpbGRlciwgaW5kcHRyVHlwZU9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDEsIGluZHB0clR5cGVPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkSW5kcHRyQnVmZmVyKGJ1aWxkZXIsIGluZHB0ckJ1ZmZlck9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkU3RydWN0KDIsIGluZHB0ckJ1ZmZlck9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRJbmRpY2VzVHlwZShidWlsZGVyLCBpbmRpY2VzVHlwZU9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDMsIGluZGljZXNUeXBlT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZEluZGljZXNCdWZmZXIoYnVpbGRlciwgaW5kaWNlc0J1ZmZlck9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkU3RydWN0KDQsIGluZGljZXNCdWZmZXJPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kU3BhcnNlTWF0cml4SW5kZXhDU1goYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA2KTsgLy8gaW5kcHRyVHlwZVxuICAgICAgICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA4KTsgLy8gaW5kcHRyQnVmZmVyXG4gICAgICAgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDEwKTsgLy8gaW5kaWNlc1R5cGVcbiAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgMTIpOyAvLyBpbmRpY2VzQnVmZmVyXG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcGFyc2UtbWF0cml4LWluZGV4LWMtcy14Lm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnLi9idWZmZXIubWpzJztcbmltcG9ydCB7IEludCB9IGZyb20gJy4vaW50Lm1qcyc7XG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEVYUEVSSU1FTlRBTDogRGF0YSBzdHJ1Y3R1cmVzIGZvciBzcGFyc2UgdGVuc29yc1xuICogQ29vcmRpbmF0ZSAoQ09PKSBmb3JtYXQgb2Ygc3BhcnNlIHRlbnNvciBpbmRleC5cbiAqXG4gKiBDT08ncyBpbmRleCBsaXN0IGFyZSByZXByZXNlbnRlZCBhcyBhIE54TSBtYXRyaXgsXG4gKiB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gdmFsdWVzLFxuICogYW5kIE0gaXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIG9mIGEgc3BhcnNlIHRlbnNvci5cbiAqXG4gKiBpbmRpY2VzQnVmZmVyIHN0b3JlcyB0aGUgbG9jYXRpb24gYW5kIHNpemUgb2YgdGhlIGRhdGEgb2YgdGhpcyBpbmRpY2VzXG4gKiBtYXRyaXguICBUaGUgdmFsdWUgdHlwZSBhbmQgdGhlIHN0cmlkZSBvZiB0aGUgaW5kaWNlcyBtYXRyaXggaXNcbiAqIHNwZWNpZmllZCBpbiBpbmRpY2VzVHlwZSBhbmQgaW5kaWNlc1N0cmlkZXMgZmllbGRzLlxuICpcbiAqIEZvciBleGFtcGxlLCBsZXQgWCBiZSBhIDJ4M3g0eDUgdGVuc29yLCBhbmQgaXQgaGFzIHRoZSBmb2xsb3dpbmdcbiAqIDYgbm9uLXplcm8gdmFsdWVzOlxuICogYGBgdGV4dFxuICogICBYWzAsIDEsIDIsIDBdIDo9IDFcbiAqICAgWFsxLCAxLCAyLCAzXSA6PSAyXG4gKiAgIFhbMCwgMiwgMSwgMF0gOj0gM1xuICogICBYWzAsIDEsIDMsIDBdIDo9IDRcbiAqICAgWFswLCAxLCAyLCAxXSA6PSA1XG4gKiAgIFhbMSwgMiwgMCwgNF0gOj0gNlxuICogYGBgXG4gKiBJbiBDT08gZm9ybWF0LCB0aGUgaW5kZXggbWF0cml4IG9mIFggaXMgdGhlIGZvbGxvd2luZyA0eDYgbWF0cml4OlxuICogYGBgdGV4dFxuICogICBbWzAsIDAsIDAsIDAsIDEsIDFdLFxuICogICAgWzEsIDEsIDEsIDIsIDEsIDJdLFxuICogICAgWzIsIDIsIDMsIDEsIDIsIDBdLFxuICogICAgWzAsIDEsIDAsIDAsIDMsIDRdXVxuICogYGBgXG4gKiBXaGVuIGlzQ2Fub25pY2FsIGlzIHRydWUsIHRoZSBpbmRpY2VzIGlzIHNvcnRlZCBpbiBsZXhpY29ncmFwaGljYWwgb3JkZXJcbiAqIChyb3ctbWFqb3Igb3JkZXIpLCBhbmQgaXQgZG9lcyBub3QgaGF2ZSBkdXBsaWNhdGVkIGVudHJpZXMuICBPdGhlcndpc2UsXG4gKiB0aGUgaW5kaWNlcyBtYXkgbm90IGJlIHNvcnRlZCwgb3IgbWF5IGhhdmUgZHVwbGljYXRlZCBlbnRyaWVzLlxuICovXG5leHBvcnQgY2xhc3MgU3BhcnNlVGVuc29ySW5kZXhDT08ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzU3BhcnNlVGVuc29ySW5kZXhDT08oYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgU3BhcnNlVGVuc29ySW5kZXhDT08oKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1NwYXJzZVRlbnNvckluZGV4Q09PKGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBTcGFyc2VUZW5zb3JJbmRleENPTygpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB2YWx1ZXMgaW4gaW5kaWNlc0J1ZmZlclxuICAgICAqL1xuICAgIGluZGljZXNUeXBlKG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEludCgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOb24tbmVnYXRpdmUgYnl0ZSBvZmZzZXRzIHRvIGFkdmFuY2Ugb25lIHZhbHVlIGNlbGwgYWxvbmcgZWFjaCBkaW1lbnNpb25cbiAgICAgKiBJZiBvbWl0dGVkLCBkZWZhdWx0IHRvIHJvdy1tYWpvciBvcmRlciAoQy1saWtlKS5cbiAgICAgKi9cbiAgICBpbmRpY2VzU3RyaWRlcyhpbmRleCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDY0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA4KSA6IHRoaXMuYmIuY3JlYXRlTG9uZygwLCAwKTtcbiAgICB9XG4gICAgaW5kaWNlc1N0cmlkZXNMZW5ndGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGxvY2F0aW9uIGFuZCBzaXplIG9mIHRoZSBpbmRpY2VzIG1hdHJpeCdzIGRhdGFcbiAgICAgKi9cbiAgICBpbmRpY2VzQnVmZmVyKG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEJ1ZmZlcigpKS5fX2luaXQodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHRoaXMuYmIpIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBmbGFnIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGluZGljZXMgbWF0cml4IGlzIHNvcnRlZCBpblxuICAgICAqIHJvdy1tYWpvciBvcmRlciwgYW5kIGRvZXMgbm90IGhhdmUgZHVwbGljYXRlZCBlbnRyaWVzLlxuICAgICAqIFRoaXMgc29ydCBvcmRlciBpcyB0aGUgc2FtZSBhcyBvZiBUZW5zb3JmbG93J3MgU3BhcnNlVGVuc29yLFxuICAgICAqIGJ1dCBpdCBpcyBpbnZlcnNlIG9yZGVyIG9mIFNjaVB5J3MgY2Fub25pY2FsIGNvb19tYXRyaXhcbiAgICAgKiAoU2NpUHkgZW1wbG95cyBjb2x1bW4tbWFqb3Igb3JkZXIgZm9yIGl0cyBjb29fbWF0cml4KS5cbiAgICAgKi9cbiAgICBpc0Nhbm9uaWNhbCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gISF0aGlzLmJiLnJlYWRJbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IGZhbHNlO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRTcGFyc2VUZW5zb3JJbmRleENPTyhidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoNCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRJbmRpY2VzVHlwZShidWlsZGVyLCBpbmRpY2VzVHlwZU9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDAsIGluZGljZXNUeXBlT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZEluZGljZXNTdHJpZGVzKGJ1aWxkZXIsIGluZGljZXNTdHJpZGVzT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgaW5kaWNlc1N0cmlkZXNPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlSW5kaWNlc1N0cmlkZXNWZWN0b3IoYnVpbGRlciwgZGF0YSkge1xuICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDgsIGRhdGEubGVuZ3RoLCA4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGJ1aWxkZXIuYWRkSW50NjQoZGF0YVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZW5kVmVjdG9yKCk7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydEluZGljZXNTdHJpZGVzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkSW5kaWNlc0J1ZmZlcihidWlsZGVyLCBpbmRpY2VzQnVmZmVyT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRTdHJ1Y3QoMiwgaW5kaWNlc0J1ZmZlck9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRJc0Nhbm9uaWNhbChidWlsZGVyLCBpc0Nhbm9uaWNhbCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50OCgzLCAraXNDYW5vbmljYWwsICtmYWxzZSk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmRTcGFyc2VUZW5zb3JJbmRleENPTyhidWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJ1aWxkZXIuZW5kT2JqZWN0KCk7XG4gICAgICAgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDQpOyAvLyBpbmRpY2VzVHlwZVxuICAgICAgICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA4KTsgLy8gaW5kaWNlc0J1ZmZlclxuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3BhcnNlLXRlbnNvci1pbmRleC1jLW8tby5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJy4vYnVmZmVyLm1qcyc7XG5pbXBvcnQgeyBJbnQgfSBmcm9tICcuL2ludC5tanMnO1xuLyoqXG4gKiBDb21wcmVzc2VkIFNwYXJzZSBGaWJlciAoQ1NGKSBzcGFyc2UgdGVuc29yIGluZGV4LlxuICovXG5leHBvcnQgY2xhc3MgU3BhcnNlVGVuc29ySW5kZXhDU0Yge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzU3BhcnNlVGVuc29ySW5kZXhDU0YoYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgU3BhcnNlVGVuc29ySW5kZXhDU0YoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1NwYXJzZVRlbnNvckluZGV4Q1NGKGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBTcGFyc2VUZW5zb3JJbmRleENTRigpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDU0YgaXMgYSBnZW5lcmFsaXphdGlvbiBvZiBjb21wcmVzc2VkIHNwYXJzZSByb3cgKENTUikgaW5kZXguXG4gICAgICogU2VlIFtzbWl0aDIwMTdrbmxdKGh0dHA6Ly9zaGFkZW4uaW8vcHViLWZpbGVzL3NtaXRoMjAxN2tubC5wZGYpXG4gICAgICpcbiAgICAgKiBDU0YgaW5kZXggcmVjdXJzaXZlbHkgY29tcHJlc3NlcyBlYWNoIGRpbWVuc2lvbiBvZiBhIHRlbnNvciBpbnRvIGEgc2V0XG4gICAgICogb2YgcHJlZml4IHRyZWVzLiBFYWNoIHBhdGggZnJvbSBhIHJvb3QgdG8gbGVhZiBmb3JtcyBvbmUgdGVuc29yXG4gICAgICogbm9uLXplcm8gaW5kZXguIENTRiBpcyBpbXBsZW1lbnRlZCB3aXRoIHR3byBhcnJheXMgb2YgYnVmZmVycyBhbmQgb25lXG4gICAgICogYXJyYXlzIG9mIGludGVnZXJzLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGUsIGxldCBYIGJlIGEgMngzeDR4NSB0ZW5zb3IgYW5kIGxldCBpdCBoYXZlIHRoZSBmb2xsb3dpbmdcbiAgICAgKiA4IG5vbi16ZXJvIHZhbHVlczpcbiAgICAgKiBgYGB0ZXh0XG4gICAgICogICBYWzAsIDAsIDAsIDFdIDo9IDFcbiAgICAgKiAgIFhbMCwgMCwgMCwgMl0gOj0gMlxuICAgICAqICAgWFswLCAxLCAwLCAwXSA6PSAzXG4gICAgICogICBYWzAsIDEsIDAsIDJdIDo9IDRcbiAgICAgKiAgIFhbMCwgMSwgMSwgMF0gOj0gNVxuICAgICAqICAgWFsxLCAxLCAxLCAwXSA6PSA2XG4gICAgICogICBYWzEsIDEsIDEsIDFdIDo9IDdcbiAgICAgKiAgIFhbMSwgMSwgMSwgMl0gOj0gOFxuICAgICAqIGBgYFxuICAgICAqIEFzIGEgcHJlZml4IHRyZWUgdGhpcyB3b3VsZCBiZSByZXByZXNlbnRlZCBhczpcbiAgICAgKiBgYGB0ZXh0XG4gICAgICogICAgICAgICAwICAgICAgICAgIDFcbiAgICAgKiAgICAgICAgLyBcXCAgICAgICAgIHxcbiAgICAgKiAgICAgICAwICAgMSAgICAgICAgMVxuICAgICAqICAgICAgLyAgIC8gXFwgICAgICAgfFxuICAgICAqICAgICAwICAgMCAgIDEgICAgICAxXG4gICAgICogICAgL3wgIC98ICAgfCAgICAvfCB8XG4gICAgICogICAxIDIgMCAyICAgMCAgIDAgMSAyXG4gICAgICogYGBgXG4gICAgICogVGhlIHR5cGUgb2YgdmFsdWVzIGluIGluZHB0ckJ1ZmZlcnNcbiAgICAgKi9cbiAgICBpbmRwdHJUeXBlKG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEludCgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBpbmRwdHJCdWZmZXJzIHN0b3JlcyB0aGUgc3BhcnNpdHkgc3RydWN0dXJlLlxuICAgICAqIEVhY2ggdHdvIGNvbnNlY3V0aXZlIGRpbWVuc2lvbnMgaW4gYSB0ZW5zb3IgY29ycmVzcG9uZCB0byBhIGJ1ZmZlciBpblxuICAgICAqIGluZHB0ckJ1ZmZlcnMuIEEgcGFpciBvZiBjb25zZWN1dGl2ZSB2YWx1ZXMgYXQgYGluZHB0ckJ1ZmZlcnNbZGltXVtpXWBcbiAgICAgKiBhbmQgYGluZHB0ckJ1ZmZlcnNbZGltXVtpICsgMV1gIHNpZ25pZnkgYSByYW5nZSBvZiBub2RlcyBpblxuICAgICAqIGBpbmRpY2VzQnVmZmVyc1tkaW0gKyAxXWAgd2hvIGFyZSBjaGlsZHJlbiBvZiBgaW5kaWNlc0J1ZmZlcnNbZGltXVtpXWAgbm9kZS5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlLCB0aGUgaW5kcHRyQnVmZmVycyBmb3IgdGhlIGFib3ZlIFggaXM6XG4gICAgICogYGBgdGV4dFxuICAgICAqICAgaW5kcHRyQnVmZmVyKFgpID0gW1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICBbMCwgMiwgM10sXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgIFswLCAxLCAzLCA0XSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgWzAsIDIsIDQsIDUsIDhdXG4gICAgICogICAgICAgICAgICAgICAgICAgICBdLlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGluZHB0ckJ1ZmZlcnMoaW5kZXgsIG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEJ1ZmZlcigpKS5fX2luaXQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCkgKyBpbmRleCAqIDE2LCB0aGlzLmJiKSA6IG51bGw7XG4gICAgfVxuICAgIGluZHB0ckJ1ZmZlcnNMZW5ndGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdmFsdWVzIGluIGluZGljZXNCdWZmZXJzXG4gICAgICovXG4gICAgaW5kaWNlc1R5cGUob2JqKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgSW50KCkpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiKSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGluZGljZXNCdWZmZXJzIHN0b3JlcyB2YWx1ZXMgb2Ygbm9kZXMuXG4gICAgICogRWFjaCB0ZW5zb3IgZGltZW5zaW9uIGNvcnJlc3BvbmRzIHRvIGEgYnVmZmVyIGluIGluZGljZXNCdWZmZXJzLlxuICAgICAqIEZvciBleGFtcGxlLCB0aGUgaW5kaWNlc0J1ZmZlcnMgZm9yIHRoZSBhYm92ZSBYIGlzOlxuICAgICAqIGBgYHRleHRcbiAgICAgKiAgIGluZGljZXNCdWZmZXIoWCkgPSBbXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBbMCwgMV0sXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBbMCwgMSwgMV0sXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBbMCwgMCwgMSwgMV0sXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBbMSwgMiwgMCwgMiwgMCwgMCwgMSwgMl1cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBdLlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGluZGljZXNCdWZmZXJzKGluZGV4LCBvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgQnVmZmVyKCkpLl9faW5pdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogMTYsIHRoaXMuYmIpIDogbnVsbDtcbiAgICB9XG4gICAgaW5kaWNlc0J1ZmZlcnNMZW5ndGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGF4aXNPcmRlciBzdG9yZXMgdGhlIHNlcXVlbmNlIGluIHdoaWNoIGRpbWVuc2lvbnMgd2VyZSB0cmF2ZXJzZWQgdG9cbiAgICAgKiBwcm9kdWNlIHRoZSBwcmVmaXggdHJlZS5cbiAgICAgKiBGb3IgZXhhbXBsZSwgdGhlIGF4aXNPcmRlciBmb3IgdGhlIGFib3ZlIFggaXM6XG4gICAgICogYGBgdGV4dFxuICAgICAqICAgYXhpc09yZGVyKFgpID0gWzAsIDEsIDIsIDNdLlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGF4aXNPcmRlcihpbmRleCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSArIGluZGV4ICogNCkgOiAwO1xuICAgIH1cbiAgICBheGlzT3JkZXJMZW5ndGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IDA7XG4gICAgfVxuICAgIGF4aXNPcmRlckFycmF5KCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCAxMik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyBuZXcgSW50MzJBcnJheSh0aGlzLmJiLmJ5dGVzKCkuYnVmZmVyLCB0aGlzLmJiLmJ5dGVzKCkuYnl0ZU9mZnNldCArIHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpLCB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkpIDogbnVsbDtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0U3BhcnNlVGVuc29ySW5kZXhDU0YoYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDUpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkSW5kcHRyVHlwZShidWlsZGVyLCBpbmRwdHJUeXBlT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMCwgaW5kcHRyVHlwZU9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRJbmRwdHJCdWZmZXJzKGJ1aWxkZXIsIGluZHB0ckJ1ZmZlcnNPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxLCBpbmRwdHJCdWZmZXJzT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0SW5kcHRyQnVmZmVyc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykge1xuICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDE2LCBudW1FbGVtcywgOCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRJbmRpY2VzVHlwZShidWlsZGVyLCBpbmRpY2VzVHlwZU9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDIsIGluZGljZXNUeXBlT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZEluZGljZXNCdWZmZXJzKGJ1aWxkZXIsIGluZGljZXNCdWZmZXJzT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMywgaW5kaWNlc0J1ZmZlcnNPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRJbmRpY2VzQnVmZmVyc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykge1xuICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDE2LCBudW1FbGVtcywgOCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRBeGlzT3JkZXIoYnVpbGRlciwgYXhpc09yZGVyT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoNCwgYXhpc09yZGVyT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUF4aXNPcmRlclZlY3RvcihidWlsZGVyLCBkYXRhKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgZGF0YS5sZW5ndGgsIDQpO1xuICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgYnVpbGRlci5hZGRJbnQzMihkYXRhW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0QXhpc09yZGVyVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kU3BhcnNlVGVuc29ySW5kZXhDU0YoYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA0KTsgLy8gaW5kcHRyVHlwZVxuICAgICAgICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA2KTsgLy8gaW5kcHRyQnVmZmVyc1xuICAgICAgICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCA4KTsgLy8gaW5kaWNlc1R5cGVcbiAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgMTApOyAvLyBpbmRpY2VzQnVmZmVyc1xuICAgICAgICBidWlsZGVyLnJlcXVpcmVkRmllbGQob2Zmc2V0LCAxMik7IC8vIGF4aXNPcmRlclxuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3BhcnNlLXRlbnNvci1pbmRleC1jLXMtZi5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmltcG9ydCB7IFNwYXJzZU1hdHJpeEluZGV4Q1NYIH0gZnJvbSAnLi9zcGFyc2UtbWF0cml4LWluZGV4LWMtcy14Lm1qcyc7XG5pbXBvcnQgeyBTcGFyc2VUZW5zb3JJbmRleENPTyB9IGZyb20gJy4vc3BhcnNlLXRlbnNvci1pbmRleC1jLW8tby5tanMnO1xuaW1wb3J0IHsgU3BhcnNlVGVuc29ySW5kZXhDU0YgfSBmcm9tICcuL3NwYXJzZS10ZW5zb3ItaW5kZXgtYy1zLWYubWpzJztcbmV4cG9ydCB2YXIgU3BhcnNlVGVuc29ySW5kZXg7XG4oZnVuY3Rpb24gKFNwYXJzZVRlbnNvckluZGV4KSB7XG4gICAgU3BhcnNlVGVuc29ySW5kZXhbU3BhcnNlVGVuc29ySW5kZXhbXCJOT05FXCJdID0gMF0gPSBcIk5PTkVcIjtcbiAgICBTcGFyc2VUZW5zb3JJbmRleFtTcGFyc2VUZW5zb3JJbmRleFtcIlNwYXJzZVRlbnNvckluZGV4Q09PXCJdID0gMV0gPSBcIlNwYXJzZVRlbnNvckluZGV4Q09PXCI7XG4gICAgU3BhcnNlVGVuc29ySW5kZXhbU3BhcnNlVGVuc29ySW5kZXhbXCJTcGFyc2VNYXRyaXhJbmRleENTWFwiXSA9IDJdID0gXCJTcGFyc2VNYXRyaXhJbmRleENTWFwiO1xuICAgIFNwYXJzZVRlbnNvckluZGV4W1NwYXJzZVRlbnNvckluZGV4W1wiU3BhcnNlVGVuc29ySW5kZXhDU0ZcIl0gPSAzXSA9IFwiU3BhcnNlVGVuc29ySW5kZXhDU0ZcIjtcbn0pKFNwYXJzZVRlbnNvckluZGV4IHx8IChTcGFyc2VUZW5zb3JJbmRleCA9IHt9KSk7XG5leHBvcnQgZnVuY3Rpb24gdW5pb25Ub1NwYXJzZVRlbnNvckluZGV4KHR5cGUsIGFjY2Vzc29yKSB7XG4gICAgc3dpdGNoIChTcGFyc2VUZW5zb3JJbmRleFt0eXBlXSkge1xuICAgICAgICBjYXNlICdOT05FJzogcmV0dXJuIG51bGw7XG4gICAgICAgIGNhc2UgJ1NwYXJzZVRlbnNvckluZGV4Q09PJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBTcGFyc2VUZW5zb3JJbmRleENPTygpKTtcbiAgICAgICAgY2FzZSAnU3BhcnNlTWF0cml4SW5kZXhDU1gnOiByZXR1cm4gYWNjZXNzb3IobmV3IFNwYXJzZU1hdHJpeEluZGV4Q1NYKCkpO1xuICAgICAgICBjYXNlICdTcGFyc2VUZW5zb3JJbmRleENTRic6IHJldHVybiBhY2Nlc3NvcihuZXcgU3BhcnNlVGVuc29ySW5kZXhDU0YoKSk7XG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB1bmlvbkxpc3RUb1NwYXJzZVRlbnNvckluZGV4KHR5cGUsIGFjY2Vzc29yLCBpbmRleCkge1xuICAgIHN3aXRjaCAoU3BhcnNlVGVuc29ySW5kZXhbdHlwZV0pIHtcbiAgICAgICAgY2FzZSAnTk9ORSc6IHJldHVybiBudWxsO1xuICAgICAgICBjYXNlICdTcGFyc2VUZW5zb3JJbmRleENPTyc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IFNwYXJzZVRlbnNvckluZGV4Q09PKCkpO1xuICAgICAgICBjYXNlICdTcGFyc2VNYXRyaXhJbmRleENTWCc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IFNwYXJzZU1hdHJpeEluZGV4Q1NYKCkpO1xuICAgICAgICBjYXNlICdTcGFyc2VUZW5zb3JJbmRleENTRic6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IFNwYXJzZVRlbnNvckluZGV4Q1NGKCkpO1xuICAgICAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNwYXJzZS10ZW5zb3ItaW5kZXgubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICcuL2J1ZmZlci5tanMnO1xuaW1wb3J0IHsgU3BhcnNlVGVuc29ySW5kZXggfSBmcm9tICcuL3NwYXJzZS10ZW5zb3ItaW5kZXgubWpzJztcbmltcG9ydCB7IFRlbnNvckRpbSB9IGZyb20gJy4vdGVuc29yLWRpbS5tanMnO1xuaW1wb3J0IHsgVHlwZSB9IGZyb20gJy4vdHlwZS5tanMnO1xuZXhwb3J0IGNsYXNzIFNwYXJzZVRlbnNvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNTcGFyc2VUZW5zb3IoYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgU3BhcnNlVGVuc29yKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNTcGFyc2VUZW5zb3IoYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFNwYXJzZVRlbnNvcigpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICB0eXBlVHlwZSgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRVaW50OCh0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBUeXBlLk5PTkU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGRhdGEgY29udGFpbmVkIGluIGEgdmFsdWUgY2VsbC5cbiAgICAgKiBDdXJyZW50bHkgb25seSBmaXhlZC13aWR0aCB2YWx1ZSB0eXBlcyBhcmUgc3VwcG9ydGVkLFxuICAgICAqIG5vIHN0cmluZ3Mgb3IgbmVzdGVkIHR5cGVzLlxuICAgICAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0eXBlKG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX191bmlvbihvYmosIHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBkaW1lbnNpb25zIG9mIHRoZSB0ZW5zb3IsIG9wdGlvbmFsbHkgbmFtZWQuXG4gICAgICovXG4gICAgc2hhcGUoaW5kZXgsIG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IFRlbnNvckRpbSgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICBzaGFwZUxlbmd0aCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi16ZXJvIHZhbHVlcyBpbiBhIHNwYXJzZSB0ZW5zb3IuXG4gICAgICovXG4gICAgbm9uWmVyb0xlbmd0aCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogdGhpcy5iYi5jcmVhdGVMb25nKDAsIDApO1xuICAgIH1cbiAgICBzcGFyc2VJbmRleFR5cGUoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEyKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZFVpbnQ4KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IFNwYXJzZVRlbnNvckluZGV4Lk5PTkU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwYXJzZSB0ZW5zb3IgaW5kZXhcbiAgICAgKi9cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgc3BhcnNlSW5kZXgob2JqKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX191bmlvbihvYmosIHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBsb2NhdGlvbiBhbmQgc2l6ZSBvZiB0aGUgdGVuc29yJ3MgZGF0YVxuICAgICAqL1xuICAgIGRhdGEob2JqKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDE2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IEJ1ZmZlcigpKS5fX2luaXQodGhpcy5iYl9wb3MgKyBvZmZzZXQsIHRoaXMuYmIpIDogbnVsbDtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0U3BhcnNlVGVuc29yKGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCg3KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZFR5cGVUeXBlKGJ1aWxkZXIsIHR5cGVUeXBlKSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDAsIHR5cGVUeXBlLCBUeXBlLk5PTkUpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkVHlwZShidWlsZGVyLCB0eXBlT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgdHlwZU9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRTaGFwZShidWlsZGVyLCBzaGFwZU9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDIsIHNoYXBlT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZVNoYXBlVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7XG4gICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBidWlsZGVyLmFkZE9mZnNldChkYXRhW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0U2hhcGVWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGROb25aZXJvTGVuZ3RoKGJ1aWxkZXIsIG5vblplcm9MZW5ndGgpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDY0KDMsIG5vblplcm9MZW5ndGgsIGJ1aWxkZXIuY3JlYXRlTG9uZygwLCAwKSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRTcGFyc2VJbmRleFR5cGUoYnVpbGRlciwgc3BhcnNlSW5kZXhUeXBlKSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ4KDQsIHNwYXJzZUluZGV4VHlwZSwgU3BhcnNlVGVuc29ySW5kZXguTk9ORSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRTcGFyc2VJbmRleChidWlsZGVyLCBzcGFyc2VJbmRleE9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDUsIHNwYXJzZUluZGV4T2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZERhdGEoYnVpbGRlciwgZGF0YU9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkU3RydWN0KDYsIGRhdGFPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kU3BhcnNlVGVuc29yKGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNik7IC8vIHR5cGVcbiAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgOCk7IC8vIHNoYXBlXG4gICAgICAgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDE0KTsgLy8gc3BhcnNlSW5kZXhcbiAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgMTYpOyAvLyBkYXRhXG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICAgIHN0YXRpYyBmaW5pc2hTcGFyc2VUZW5zb3JCdWZmZXIoYnVpbGRlciwgb2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuZmluaXNoKG9mZnNldCk7XG4gICAgfVxuICAgIHN0YXRpYyBmaW5pc2hTaXplUHJlZml4ZWRTcGFyc2VUZW5zb3JCdWZmZXIoYnVpbGRlciwgb2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuZmluaXNoKG9mZnNldCwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNwYXJzZS10ZW5zb3IubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG4vKipcbiAqIEEgU3RydWN0XyBpbiB0aGUgZmxhdGJ1ZmZlciBtZXRhZGF0YSBpcyB0aGUgc2FtZSBhcyBhbiBBcnJvdyBTdHJ1Y3RcbiAqIChhY2NvcmRpbmcgdG8gdGhlIHBoeXNpY2FsIG1lbW9yeSBsYXlvdXQpLiBXZSB1c2VkIFN0cnVjdF8gaGVyZSBhc1xuICogU3RydWN0IGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBGbGF0YnVmZmVyc1xuICovXG5leHBvcnQgY2xhc3MgU3RydWN0XyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNTdHJ1Y3RfKGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFN0cnVjdF8oKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1N0cnVjdF8oYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFN0cnVjdF8oKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0U3RydWN0XyhidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmRTdHJ1Y3RfKGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZVN0cnVjdF8oYnVpbGRlcikge1xuICAgICAgICBTdHJ1Y3RfLnN0YXJ0U3RydWN0XyhidWlsZGVyKTtcbiAgICAgICAgcmV0dXJuIFN0cnVjdF8uZW5kU3RydWN0XyhidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cnVjdF8ubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIERhdGEgc3RydWN0dXJlcyBmb3IgZGVuc2UgdGVuc29yc1xuICogU2hhcGUgZGF0YSBmb3IgYSBzaW5nbGUgYXhpcyBpbiBhIHRlbnNvclxuICovXG5leHBvcnQgY2xhc3MgVGVuc29yRGltIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc1RlbnNvckRpbShiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBUZW5zb3JEaW0oKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1RlbnNvckRpbShiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgVGVuc29yRGltKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExlbmd0aCBvZiBkaW1lbnNpb25cbiAgICAgKi9cbiAgICBzaXplKCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IHRoaXMuYmIuY3JlYXRlTG9uZygwLCAwKTtcbiAgICB9XG4gICAgbmFtZShvcHRpb25hbEVuY29kaW5nKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3BvcyArIG9mZnNldCwgb3B0aW9uYWxFbmNvZGluZykgOiBudWxsO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRUZW5zb3JEaW0oYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDIpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkU2l6ZShidWlsZGVyLCBzaXplKSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQ2NCgwLCBzaXplLCBidWlsZGVyLmNyZWF0ZUxvbmcoMCwgMCkpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkTmFtZShidWlsZGVyLCBuYW1lT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgbmFtZU9mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbmRUZW5zb3JEaW0oYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlVGVuc29yRGltKGJ1aWxkZXIsIHNpemUsIG5hbWVPZmZzZXQpIHtcbiAgICAgICAgVGVuc29yRGltLnN0YXJ0VGVuc29yRGltKGJ1aWxkZXIpO1xuICAgICAgICBUZW5zb3JEaW0uYWRkU2l6ZShidWlsZGVyLCBzaXplKTtcbiAgICAgICAgVGVuc29yRGltLmFkZE5hbWUoYnVpbGRlciwgbmFtZU9mZnNldCk7XG4gICAgICAgIHJldHVybiBUZW5zb3JEaW0uZW5kVGVuc29yRGltKGJ1aWxkZXIpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGVuc29yLWRpbS5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJy4vYnVmZmVyLm1qcyc7XG5pbXBvcnQgeyBUZW5zb3JEaW0gfSBmcm9tICcuL3RlbnNvci1kaW0ubWpzJztcbmltcG9ydCB7IFR5cGUgfSBmcm9tICcuL3R5cGUubWpzJztcbmV4cG9ydCBjbGFzcyBUZW5zb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSAwO1xuICAgIH1cbiAgICBfX2luaXQoaSwgYmIpIHtcbiAgICAgICAgdGhpcy5iYl9wb3MgPSBpO1xuICAgICAgICB0aGlzLmJiID0gYmI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Um9vdEFzVGVuc29yKGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFRlbnNvcigpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzVGVuc29yKGJiLCBvYmopIHtcbiAgICAgICAgYmIuc2V0UG9zaXRpb24oYmIucG9zaXRpb24oKSArIGZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCk7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBUZW5zb3IoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgdHlwZVR5cGUoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkVWludDgodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogVHlwZS5OT05FO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBkYXRhIGNvbnRhaW5lZCBpbiBhIHZhbHVlIGNlbGwuIEN1cnJlbnRseSBvbmx5IGZpeGVkLXdpZHRoXG4gICAgICogdmFsdWUgdHlwZXMgYXJlIHN1cHBvcnRlZCwgbm8gc3RyaW5ncyBvciBuZXN0ZWQgdHlwZXNcbiAgICAgKi9cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdHlwZShvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNik7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdW5pb24ob2JqLCB0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZGltZW5zaW9ucyBvZiB0aGUgdGVuc29yLCBvcHRpb25hbGx5IG5hbWVkXG4gICAgICovXG4gICAgc2hhcGUoaW5kZXgsIG9iaikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA4KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IChvYmogfHwgbmV3IFRlbnNvckRpbSgpKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICBzaGFwZUxlbmd0aCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgOCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOb24tbmVnYXRpdmUgYnl0ZSBvZmZzZXRzIHRvIGFkdmFuY2Ugb25lIHZhbHVlIGNlbGwgYWxvbmcgZWFjaCBkaW1lbnNpb25cbiAgICAgKiBJZiBvbWl0dGVkLCBkZWZhdWx0IHRvIHJvdy1tYWpvciBvcmRlciAoQy1saWtlKS5cbiAgICAgKi9cbiAgICBzdHJpZGVzKGluZGV4KSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDEwKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDY0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA4KSA6IHRoaXMuYmIuY3JlYXRlTG9uZygwLCAwKTtcbiAgICB9XG4gICAgc3RyaWRlc0xlbmd0aCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTApO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGxvY2F0aW9uIGFuZCBzaXplIG9mIHRoZSB0ZW5zb3IncyBkYXRhXG4gICAgICovXG4gICAgZGF0YShvYmopIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgMTIpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gKG9iaiB8fCBuZXcgQnVmZmVyKCkpLl9faW5pdCh0aGlzLmJiX3BvcyArIG9mZnNldCwgdGhpcy5iYikgOiBudWxsO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRUZW5zb3IoYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDUpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkVHlwZVR5cGUoYnVpbGRlciwgdHlwZVR5cGUpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDgoMCwgdHlwZVR5cGUsIFR5cGUuTk9ORSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRUeXBlKGJ1aWxkZXIsIHR5cGVPZmZzZXQpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZE9mZnNldCgxLCB0eXBlT2Zmc2V0LCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZFNoYXBlKGJ1aWxkZXIsIHNoYXBlT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMiwgc2hhcGVPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlU2hhcGVWZWN0b3IoYnVpbGRlciwgZGF0YSkge1xuICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIGRhdGEubGVuZ3RoLCA0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGJ1aWxkZXIuYWRkT2Zmc2V0KGRhdGFbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRTaGFwZVZlY3RvcihidWlsZGVyLCBudW1FbGVtcykge1xuICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZFN0cmlkZXMoYnVpbGRlciwgc3RyaWRlc09mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkT2Zmc2V0KDMsIHN0cmlkZXNPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlU3RyaWRlc1ZlY3RvcihidWlsZGVyLCBkYXRhKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoOCwgZGF0YS5sZW5ndGgsIDgpO1xuICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgYnVpbGRlci5hZGRJbnQ2NChkYXRhW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5lbmRWZWN0b3IoKTtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0U3RyaWRlc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykge1xuICAgICAgICBidWlsZGVyLnN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA4KTtcbiAgICB9XG4gICAgc3RhdGljIGFkZERhdGEoYnVpbGRlciwgZGF0YU9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkU3RydWN0KDQsIGRhdGFPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kVGVuc29yKGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgNik7IC8vIHR5cGVcbiAgICAgICAgYnVpbGRlci5yZXF1aXJlZEZpZWxkKG9mZnNldCwgOCk7IC8vIHNoYXBlXG4gICAgICAgIGJ1aWxkZXIucmVxdWlyZWRGaWVsZChvZmZzZXQsIDEyKTsgLy8gZGF0YVxuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgZmluaXNoVGVuc29yQnVmZmVyKGJ1aWxkZXIsIG9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmZpbmlzaChvZmZzZXQpO1xuICAgIH1cbiAgICBzdGF0aWMgZmluaXNoU2l6ZVByZWZpeGVkVGVuc29yQnVmZmVyKGJ1aWxkZXIsIG9mZnNldCkge1xuICAgICAgICBidWlsZGVyLmZpbmlzaChvZmZzZXQsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZW5zb3IubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5leHBvcnQgdmFyIFRpbWVVbml0O1xuKGZ1bmN0aW9uIChUaW1lVW5pdCkge1xuICAgIFRpbWVVbml0W1RpbWVVbml0W1wiU0VDT05EXCJdID0gMF0gPSBcIlNFQ09ORFwiO1xuICAgIFRpbWVVbml0W1RpbWVVbml0W1wiTUlMTElTRUNPTkRcIl0gPSAxXSA9IFwiTUlMTElTRUNPTkRcIjtcbiAgICBUaW1lVW5pdFtUaW1lVW5pdFtcIk1JQ1JPU0VDT05EXCJdID0gMl0gPSBcIk1JQ1JPU0VDT05EXCI7XG4gICAgVGltZVVuaXRbVGltZVVuaXRbXCJOQU5PU0VDT05EXCJdID0gM10gPSBcIk5BTk9TRUNPTkRcIjtcbn0pKFRpbWVVbml0IHx8IChUaW1lVW5pdCA9IHt9KSk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRpbWUtdW5pdC5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJztcbmltcG9ydCB7IFRpbWVVbml0IH0gZnJvbSAnLi90aW1lLXVuaXQubWpzJztcbi8qKlxuICogVGltZSBpcyBlaXRoZXIgYSAzMi1iaXQgb3IgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIHR5cGUgcmVwcmVzZW50aW5nIGFuXG4gKiBlbGFwc2VkIHRpbWUgc2luY2UgbWlkbmlnaHQsIHN0b3JlZCBpbiBlaXRoZXIgb2YgZm91ciB1bml0czogc2Vjb25kcyxcbiAqIG1pbGxpc2Vjb25kcywgbWljcm9zZWNvbmRzIG9yIG5hbm9zZWNvbmRzLlxuICpcbiAqIFRoZSBpbnRlZ2VyIGBiaXRXaWR0aGAgZGVwZW5kcyBvbiB0aGUgYHVuaXRgIGFuZCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuICogKiBTRUNPTkQgYW5kIE1JTExJU0VDT05EOiAzMiBiaXRzXG4gKiAqIE1JQ1JPU0VDT05EIGFuZCBOQU5PU0VDT05EOiA2NCBiaXRzXG4gKlxuICogVGhlIGFsbG93ZWQgdmFsdWVzIGFyZSBiZXR3ZWVuIDAgKGluY2x1c2l2ZSkgYW5kIDg2NDAwICg9MjQqNjAqNjApIHNlY29uZHNcbiAqIChleGNsdXNpdmUpLCBhZGp1c3RlZCBmb3IgdGhlIHRpbWUgdW5pdCAoZm9yIGV4YW1wbGUsIHVwIHRvIDg2NDAwMDAwXG4gKiBleGNsdXNpdmUgZm9yIHRoZSBNSUxMSVNFQ09ORCB1bml0KS5cbiAqIFRoaXMgZGVmaW5pdGlvbiBkb2Vzbid0IGFsbG93IGZvciBsZWFwIHNlY29uZHMuIFRpbWUgdmFsdWVzIGZyb21cbiAqIG1lYXN1cmVtZW50cyB3aXRoIGxlYXAgc2Vjb25kcyB3aWxsIG5lZWQgdG8gYmUgY29ycmVjdGVkIHdoZW4gaW5nZXN0aW5nXG4gKiBpbnRvIEFycm93IChmb3IgZXhhbXBsZSBieSByZXBsYWNpbmcgdGhlIHZhbHVlIDg2NDAwIHdpdGggODYzOTkpLlxuICovXG5leHBvcnQgY2xhc3MgVGltZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNUaW1lKGJiLCBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFRpbWUoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1RpbWUoYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFRpbWUoKSkuX19pbml0KGJiLnJlYWRJbnQzMihiYi5wb3NpdGlvbigpKSArIGJiLnBvc2l0aW9uKCksIGJiKTtcbiAgICB9XG4gICAgdW5pdCgpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywgNCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPyB0aGlzLmJiLnJlYWRJbnQxNih0aGlzLmJiX3BvcyArIG9mZnNldCkgOiBUaW1lVW5pdC5NSUxMSVNFQ09ORDtcbiAgICB9XG4gICAgYml0V2lkdGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMzI7XG4gICAgfVxuICAgIHN0YXRpYyBzdGFydFRpbWUoYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLnN0YXJ0T2JqZWN0KDIpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkVW5pdChidWlsZGVyLCB1bml0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRJbnQxNigwLCB1bml0LCBUaW1lVW5pdC5NSUxMSVNFQ09ORCk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRCaXRXaWR0aChidWlsZGVyLCBiaXRXaWR0aCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MzIoMSwgYml0V2lkdGgsIDMyKTtcbiAgICB9XG4gICAgc3RhdGljIGVuZFRpbWUoYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlVGltZShidWlsZGVyLCB1bml0LCBiaXRXaWR0aCkge1xuICAgICAgICBUaW1lLnN0YXJ0VGltZShidWlsZGVyKTtcbiAgICAgICAgVGltZS5hZGRVbml0KGJ1aWxkZXIsIHVuaXQpO1xuICAgICAgICBUaW1lLmFkZEJpdFdpZHRoKGJ1aWxkZXIsIGJpdFdpZHRoKTtcbiAgICAgICAgcmV0dXJuIFRpbWUuZW5kVGltZShidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRpbWUubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5pbXBvcnQgeyBUaW1lVW5pdCB9IGZyb20gJy4vdGltZS11bml0Lm1qcyc7XG4vKipcbiAqIFRpbWVzdGFtcCBpcyBhIDY0LWJpdCBzaWduZWQgaW50ZWdlciByZXByZXNlbnRpbmcgYW4gZWxhcHNlZCB0aW1lIHNpbmNlIGFcbiAqIGZpeGVkIGVwb2NoLCBzdG9yZWQgaW4gZWl0aGVyIG9mIGZvdXIgdW5pdHM6IHNlY29uZHMsIG1pbGxpc2Vjb25kcyxcbiAqIG1pY3Jvc2Vjb25kcyBvciBuYW5vc2Vjb25kcywgYW5kIGlzIG9wdGlvbmFsbHkgYW5ub3RhdGVkIHdpdGggYSB0aW1lem9uZS5cbiAqXG4gKiBUaW1lc3RhbXAgdmFsdWVzIGRvIG5vdCBpbmNsdWRlIGFueSBsZWFwIHNlY29uZHMgKGluIG90aGVyIHdvcmRzLCBhbGxcbiAqIGRheXMgYXJlIGNvbnNpZGVyZWQgODY0MDAgc2Vjb25kcyBsb25nKS5cbiAqXG4gKiBUaW1lc3RhbXBzIHdpdGggYSBub24tZW1wdHkgdGltZXpvbmVcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIElmIGEgVGltZXN0YW1wIGNvbHVtbiBoYXMgYSBub24tZW1wdHkgdGltZXpvbmUgdmFsdWUsIGl0cyBlcG9jaCBpc1xuICogMTk3MC0wMS0wMSAwMDowMDowMCAoSmFudWFyeSAxc3QgMTk3MCwgbWlkbmlnaHQpIGluIHRoZSAqVVRDKiB0aW1lem9uZVxuICogKHRoZSBVbml4IGVwb2NoKSwgcmVnYXJkbGVzcyBvZiB0aGUgVGltZXN0YW1wJ3Mgb3duIHRpbWV6b25lLlxuICpcbiAqIFRoZXJlZm9yZSwgdGltZXN0YW1wIHZhbHVlcyB3aXRoIGEgbm9uLWVtcHR5IHRpbWV6b25lIGNvcnJlc3BvbmQgdG9cbiAqIHBoeXNpY2FsIHBvaW50cyBpbiB0aW1lIHRvZ2V0aGVyIHdpdGggc29tZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0XG4gKiBob3cgdGhlIGRhdGEgd2FzIG9idGFpbmVkIGFuZC9vciBob3cgdG8gZGlzcGxheSBpdCAodGhlIHRpbWV6b25lKS5cbiAqXG4gKiAgIEZvciBleGFtcGxlLCB0aGUgdGltZXN0YW1wIHZhbHVlIDAgd2l0aCB0aGUgdGltZXpvbmUgc3RyaW5nIFwiRXVyb3BlL1BhcmlzXCJcbiAqICAgY29ycmVzcG9uZHMgdG8gXCJKYW51YXJ5IDFzdCAxOTcwLCAwMGgwMFwiIGluIHRoZSBVVEMgdGltZXpvbmUsIGJ1dCB0aGVcbiAqICAgYXBwbGljYXRpb24gbWF5IHByZWZlciB0byBkaXNwbGF5IGl0IGFzIFwiSmFudWFyeSAxc3QgMTk3MCwgMDFoMDBcIiBpblxuICogICB0aGUgRXVyb3BlL1BhcmlzIHRpbWV6b25lICh3aGljaCBpcyB0aGUgc2FtZSBwaHlzaWNhbCBwb2ludCBpbiB0aW1lKS5cbiAqXG4gKiBPbmUgY29uc2VxdWVuY2UgaXMgdGhhdCB0aW1lc3RhbXAgdmFsdWVzIHdpdGggYSBub24tZW1wdHkgdGltZXpvbmVcbiAqIGNhbiBiZSBjb21wYXJlZCBhbmQgb3JkZXJlZCBkaXJlY3RseSwgc2luY2UgdGhleSBhbGwgc2hhcmUgdGhlIHNhbWVcbiAqIHdlbGwta25vd24gcG9pbnQgb2YgcmVmZXJlbmNlICh0aGUgVW5peCBlcG9jaCkuXG4gKlxuICogVGltZXN0YW1wcyB3aXRoIGFuIHVuc2V0IC8gZW1wdHkgdGltZXpvbmVcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogSWYgYSBUaW1lc3RhbXAgY29sdW1uIGhhcyBubyB0aW1lem9uZSB2YWx1ZSwgaXRzIGVwb2NoIGlzXG4gKiAxOTcwLTAxLTAxIDAwOjAwOjAwIChKYW51YXJ5IDFzdCAxOTcwLCBtaWRuaWdodCkgaW4gYW4gKnVua25vd24qIHRpbWV6b25lLlxuICpcbiAqIFRoZXJlZm9yZSwgdGltZXN0YW1wIHZhbHVlcyB3aXRob3V0IGEgdGltZXpvbmUgY2Fubm90IGJlIG1lYW5pbmdmdWxseVxuICogaW50ZXJwcmV0ZWQgYXMgcGh5c2ljYWwgcG9pbnRzIGluIHRpbWUsIGJ1dCBvbmx5IGFzIGNhbGVuZGFyIC8gY2xvY2tcbiAqIGluZGljYXRpb25zIChcIndhbGwgY2xvY2sgdGltZVwiKSBpbiBhbiB1bnNwZWNpZmllZCB0aW1lem9uZS5cbiAqXG4gKiAgIEZvciBleGFtcGxlLCB0aGUgdGltZXN0YW1wIHZhbHVlIDAgd2l0aCBhbiBlbXB0eSB0aW1lem9uZSBzdHJpbmdcbiAqICAgY29ycmVzcG9uZHMgdG8gXCJKYW51YXJ5IDFzdCAxOTcwLCAwMGgwMFwiIGluIGFuIHVua25vd24gdGltZXpvbmU6IHRoZXJlXG4gKiAgIGlzIG5vdCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gaW50ZXJwcmV0IGl0IGFzIGEgd2VsbC1kZWZpbmVkIHBoeXNpY2FsXG4gKiAgIHBvaW50IGluIHRpbWUuXG4gKlxuICogT25lIGNvbnNlcXVlbmNlIGlzIHRoYXQgdGltZXN0YW1wIHZhbHVlcyB3aXRob3V0IGEgdGltZXpvbmUgY2Fubm90XG4gKiBiZSByZWxpYWJseSBjb21wYXJlZCBvciBvcmRlcmVkLCBzaW5jZSB0aGV5IG1heSBoYXZlIGRpZmZlcmVudCBwb2ludHMgb2ZcbiAqIHJlZmVyZW5jZS4gIEluIHBhcnRpY3VsYXIsIGl0IGlzICpub3QqIHBvc3NpYmxlIHRvIGludGVycHJldCBhbiB1bnNldFxuICogb3IgZW1wdHkgdGltZXpvbmUgYXMgdGhlIHNhbWUgYXMgXCJVVENcIi5cbiAqXG4gKiBDb252ZXJzaW9uIGJldHdlZW4gdGltZXpvbmVzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogSWYgYSBUaW1lc3RhbXAgY29sdW1uIGhhcyBhIG5vbi1lbXB0eSB0aW1lem9uZSwgY2hhbmdpbmcgdGhlIHRpbWV6b25lXG4gKiB0byBhIGRpZmZlcmVudCBub24tZW1wdHkgdmFsdWUgaXMgYSBtZXRhZGF0YS1vbmx5IG9wZXJhdGlvbjpcbiAqIHRoZSB0aW1lc3RhbXAgdmFsdWVzIG5lZWQgbm90IGNoYW5nZSBhcyB0aGVpciBwb2ludCBvZiByZWZlcmVuY2UgcmVtYWluc1xuICogdGhlIHNhbWUgKHRoZSBVbml4IGVwb2NoKS5cbiAqXG4gKiBIb3dldmVyLCBpZiBhIFRpbWVzdGFtcCBjb2x1bW4gaGFzIG5vIHRpbWV6b25lIHZhbHVlLCBjaGFuZ2luZyBpdCB0byBhXG4gKiBub24tZW1wdHkgdmFsdWUgcmVxdWlyZXMgdG8gdGhpbmsgYWJvdXQgdGhlIGRlc2lyZWQgc2VtYW50aWNzLlxuICogT25lIHBvc3NpYmlsaXR5IGlzIHRvIGFzc3VtZSB0aGF0IHRoZSBvcmlnaW5hbCB0aW1lc3RhbXAgdmFsdWVzIGFyZVxuICogcmVsYXRpdmUgdG8gdGhlIGVwb2NoIG9mIHRoZSB0aW1lem9uZSBiZWluZyBzZXQ7IHRpbWVzdGFtcCB2YWx1ZXMgc2hvdWxkXG4gKiB0aGVuIGFkanVzdGVkIHRvIHRoZSBVbml4IGVwb2NoIChmb3IgZXhhbXBsZSwgY2hhbmdpbmcgdGhlIHRpbWV6b25lIGZyb21cbiAqIGVtcHR5IHRvIFwiRXVyb3BlL1BhcmlzXCIgd291bGQgcmVxdWlyZSBjb252ZXJ0aW5nIHRoZSB0aW1lc3RhbXAgdmFsdWVzXG4gKiBmcm9tIFwiRXVyb3BlL1BhcmlzXCIgdG8gXCJVVENcIiwgd2hpY2ggc2VlbXMgY291bnRlci1pbnR1aXRpdmUgYnV0IGlzXG4gKiBuZXZlcnRoZWxlc3MgY29ycmVjdCkuXG4gKlxuICogR3VpZGVsaW5lcyBmb3IgZW5jb2RpbmcgZGF0YSBmcm9tIGV4dGVybmFsIGxpYnJhcmllc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIERhdGUgJiB0aW1lIGxpYnJhcmllcyBvZnRlbiBoYXZlIG11bHRpcGxlIGRpZmZlcmVudCBkYXRhIHR5cGVzIGZvciB0ZW1wb3JhbFxuICogZGF0YS4gSW4gb3JkZXIgdG8gZWFzZSBpbnRlcm9wZXJhYmlsaXR5IGJldHdlZW4gZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyB0aGVcbiAqIEFycm93IHByb2plY3QgaGFzIHNvbWUgcmVjb21tZW5kYXRpb25zIGZvciBlbmNvZGluZyB0aGVzZSB0eXBlcyBpbnRvIGEgVGltZXN0YW1wXG4gKiBjb2x1bW4uXG4gKlxuICogQW4gXCJpbnN0YW50XCIgcmVwcmVzZW50cyBhIHBoeXNpY2FsIHBvaW50IGluIHRpbWUgdGhhdCBoYXMgbm8gcmVsZXZhbnQgdGltZXpvbmVcbiAqIChmb3IgZXhhbXBsZSwgYXN0cm9ub21pY2FsIGRhdGEpLiBUbyBlbmNvZGUgYW4gaW5zdGFudCwgdXNlIGEgVGltZXN0YW1wIHdpdGhcbiAqIHRoZSB0aW1lem9uZSBzdHJpbmcgc2V0IHRvIFwiVVRDXCIsIGFuZCBtYWtlIHN1cmUgdGhlIFRpbWVzdGFtcCB2YWx1ZXNcbiAqIGFyZSByZWxhdGl2ZSB0byB0aGUgVVRDIGVwb2NoIChKYW51YXJ5IDFzdCAxOTcwLCBtaWRuaWdodCkuXG4gKlxuICogQSBcInpvbmVkIGRhdGUtdGltZVwiIHJlcHJlc2VudHMgYSBwaHlzaWNhbCBwb2ludCBpbiB0aW1lIGFubm90YXRlZCB3aXRoIGFuXG4gKiBpbmZvcm1hdGl2ZSB0aW1lem9uZSAoZm9yIGV4YW1wbGUsIHRoZSB0aW1lem9uZSBpbiB3aGljaCB0aGUgZGF0YSB3YXNcbiAqIHJlY29yZGVkKS4gIFRvIGVuY29kZSBhIHpvbmVkIGRhdGUtdGltZSwgdXNlIGEgVGltZXN0YW1wIHdpdGggdGhlIHRpbWV6b25lXG4gKiBzdHJpbmcgc2V0IHRvIHRoZSBuYW1lIG9mIHRoZSB0aW1lem9uZSwgYW5kIG1ha2Ugc3VyZSB0aGUgVGltZXN0YW1wIHZhbHVlc1xuICogYXJlIHJlbGF0aXZlIHRvIHRoZSBVVEMgZXBvY2ggKEphbnVhcnkgMXN0IDE5NzAsIG1pZG5pZ2h0KS5cbiAqXG4gKiAgKFRoZXJlIGlzIHNvbWUgYW1iaWd1aXR5IGJldHdlZW4gYW4gaW5zdGFudCBhbmQgYSB6b25lZCBkYXRlLXRpbWUgd2l0aCB0aGVcbiAqICAgVVRDIHRpbWV6b25lLiAgQm90aCBvZiB0aGVzZSBhcmUgc3RvcmVkIHRoZSBzYW1lIGluIEFycm93LiAgVHlwaWNhbGx5LFxuICogICB0aGlzIGRpc3RpbmN0aW9uIGRvZXMgbm90IG1hdHRlci4gIElmIGl0IGRvZXMsIHRoZW4gYW4gYXBwbGljYXRpb24gc2hvdWxkXG4gKiAgIHVzZSBjdXN0b20gbWV0YWRhdGEgb3IgYW4gZXh0ZW5zaW9uIHR5cGUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgdHdvIGNhc2VzLilcbiAqXG4gKiBBbiBcIm9mZnNldCBkYXRlLXRpbWVcIiByZXByZXNlbnRzIGEgcGh5c2ljYWwgcG9pbnQgaW4gdGltZSBjb21iaW5lZCB3aXRoIGFuXG4gKiBleHBsaWNpdCBvZmZzZXQgZnJvbSBVVEMuICBUbyBlbmNvZGUgYW4gb2Zmc2V0IGRhdGUtdGltZSwgdXNlIGEgVGltZXN0YW1wXG4gKiB3aXRoIHRoZSB0aW1lem9uZSBzdHJpbmcgc2V0IHRvIHRoZSBudW1lcmljIHRpbWV6b25lIG9mZnNldCBzdHJpbmdcbiAqIChlLmcuIFwiKzAzOjAwXCIpLCBhbmQgbWFrZSBzdXJlIHRoZSBUaW1lc3RhbXAgdmFsdWVzIGFyZSByZWxhdGl2ZSB0b1xuICogdGhlIFVUQyBlcG9jaCAoSmFudWFyeSAxc3QgMTk3MCwgbWlkbmlnaHQpLlxuICpcbiAqIEEgXCJuYWl2ZSBkYXRlLXRpbWVcIiAoYWxzbyBjYWxsZWQgXCJsb2NhbCBkYXRlLXRpbWVcIiBpbiBzb21lIGxpYnJhcmllcylcbiAqIHJlcHJlc2VudHMgYSB3YWxsIGNsb2NrIHRpbWUgY29tYmluZWQgd2l0aCBhIGNhbGVuZGFyIGRhdGUsIGJ1dCB3aXRoXG4gKiBubyBpbmRpY2F0aW9uIG9mIGhvdyB0byBtYXAgdGhpcyBpbmZvcm1hdGlvbiB0byBhIHBoeXNpY2FsIHBvaW50IGluIHRpbWUuXG4gKiBOYWl2ZSBkYXRlLXRpbWVzIG11c3QgYmUgaGFuZGxlZCB3aXRoIGNhcmUgYmVjYXVzZSBvZiB0aGlzIG1pc3NpbmdcbiAqIGluZm9ybWF0aW9uLCBhbmQgYWxzbyBiZWNhdXNlIGRheWxpZ2h0IHNhdmluZyB0aW1lIChEU1QpIG1heSBtYWtlXG4gKiBzb21lIHZhbHVlcyBhbWJpZ3VvdXMgb3Igbm9uLWV4aXN0ZW50LiBBIG5haXZlIGRhdGUtdGltZSBtYXkgYmVcbiAqIHN0b3JlZCBhcyBhIHN0cnVjdCB3aXRoIERhdGUgYW5kIFRpbWUgZmllbGRzLiBIb3dldmVyLCBpdCBtYXkgYWxzbyBiZVxuICogZW5jb2RlZCBpbnRvIGEgVGltZXN0YW1wIGNvbHVtbiB3aXRoIGFuIGVtcHR5IHRpbWV6b25lLiBUaGUgdGltZXN0YW1wXG4gKiB2YWx1ZXMgc2hvdWxkIGJlIGNvbXB1dGVkIFwiYXMgaWZcIiB0aGUgdGltZXpvbmUgb2YgdGhlIGRhdGUtdGltZSB2YWx1ZXNcbiAqIHdhcyBVVEM7IGZvciBleGFtcGxlLCB0aGUgbmFpdmUgZGF0ZS10aW1lIFwiSmFudWFyeSAxc3QgMTk3MCwgMDBoMDBcIiB3b3VsZFxuICogYmUgZW5jb2RlZCBhcyB0aW1lc3RhbXAgdmFsdWUgMC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRpbWVzdGFtcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNUaW1lc3RhbXAoYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgVGltZXN0YW1wKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNUaW1lc3RhbXAoYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFRpbWVzdGFtcCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICB1bml0KCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDE2KHRoaXMuYmJfcG9zICsgb2Zmc2V0KSA6IFRpbWVVbml0LlNFQ09ORDtcbiAgICB9XG4gICAgdGltZXpvbmUob3B0aW9uYWxFbmNvZGluZykge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MgKyBvZmZzZXQsIG9wdGlvbmFsRW5jb2RpbmcpIDogbnVsbDtcbiAgICB9XG4gICAgc3RhdGljIHN0YXJ0VGltZXN0YW1wKGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCgyKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZFVuaXQoYnVpbGRlciwgdW5pdCkge1xuICAgICAgICBidWlsZGVyLmFkZEZpZWxkSW50MTYoMCwgdW5pdCwgVGltZVVuaXQuU0VDT05EKTtcbiAgICB9XG4gICAgc3RhdGljIGFkZFRpbWV6b25lKGJ1aWxkZXIsIHRpbWV6b25lT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgdGltZXpvbmVPZmZzZXQsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kVGltZXN0YW1wKGJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYnVpbGRlci5lbmRPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZVRpbWVzdGFtcChidWlsZGVyLCB1bml0LCB0aW1lem9uZU9mZnNldCkge1xuICAgICAgICBUaW1lc3RhbXAuc3RhcnRUaW1lc3RhbXAoYnVpbGRlcik7XG4gICAgICAgIFRpbWVzdGFtcC5hZGRVbml0KGJ1aWxkZXIsIHVuaXQpO1xuICAgICAgICBUaW1lc3RhbXAuYWRkVGltZXpvbmUoYnVpbGRlciwgdGltZXpvbmVPZmZzZXQpO1xuICAgICAgICByZXR1cm4gVGltZXN0YW1wLmVuZFRpbWVzdGFtcChidWlsZGVyKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRpbWVzdGFtcC5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmltcG9ydCB7IEJpbmFyeSB9IGZyb20gJy4vYmluYXJ5Lm1qcyc7XG5pbXBvcnQgeyBCb29sIH0gZnJvbSAnLi9ib29sLm1qcyc7XG5pbXBvcnQgeyBEYXRlIH0gZnJvbSAnLi9kYXRlLm1qcyc7XG5pbXBvcnQgeyBEZWNpbWFsIH0gZnJvbSAnLi9kZWNpbWFsLm1qcyc7XG5pbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gJy4vZHVyYXRpb24ubWpzJztcbmltcG9ydCB7IEZpeGVkU2l6ZUJpbmFyeSB9IGZyb20gJy4vZml4ZWQtc2l6ZS1iaW5hcnkubWpzJztcbmltcG9ydCB7IEZpeGVkU2l6ZUxpc3QgfSBmcm9tICcuL2ZpeGVkLXNpemUtbGlzdC5tanMnO1xuaW1wb3J0IHsgRmxvYXRpbmdQb2ludCB9IGZyb20gJy4vZmxvYXRpbmctcG9pbnQubWpzJztcbmltcG9ydCB7IEludCB9IGZyb20gJy4vaW50Lm1qcyc7XG5pbXBvcnQgeyBJbnRlcnZhbCB9IGZyb20gJy4vaW50ZXJ2YWwubWpzJztcbmltcG9ydCB7IExhcmdlQmluYXJ5IH0gZnJvbSAnLi9sYXJnZS1iaW5hcnkubWpzJztcbmltcG9ydCB7IExhcmdlTGlzdCB9IGZyb20gJy4vbGFyZ2UtbGlzdC5tanMnO1xuaW1wb3J0IHsgTGFyZ2VVdGY4IH0gZnJvbSAnLi9sYXJnZS11dGY4Lm1qcyc7XG5pbXBvcnQgeyBMaXN0IH0gZnJvbSAnLi9saXN0Lm1qcyc7XG5pbXBvcnQgeyBNYXAgfSBmcm9tICcuL21hcC5tanMnO1xuaW1wb3J0IHsgTnVsbCB9IGZyb20gJy4vbnVsbC5tanMnO1xuaW1wb3J0IHsgU3RydWN0XyB9IGZyb20gJy4vc3RydWN0Xy5tanMnO1xuaW1wb3J0IHsgVGltZSB9IGZyb20gJy4vdGltZS5tanMnO1xuaW1wb3J0IHsgVGltZXN0YW1wIH0gZnJvbSAnLi90aW1lc3RhbXAubWpzJztcbmltcG9ydCB7IFVuaW9uIH0gZnJvbSAnLi91bmlvbi5tanMnO1xuaW1wb3J0IHsgVXRmOCB9IGZyb20gJy4vdXRmOC5tanMnO1xuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBUb3AtbGV2ZWwgVHlwZSB2YWx1ZSwgZW5hYmxpbmcgZXh0ZW5zaWJsZSB0eXBlLXNwZWNpZmljIG1ldGFkYXRhLiBXZSBjYW5cbiAqIGFkZCBuZXcgbG9naWNhbCB0eXBlcyB0byBUeXBlIHdpdGhvdXQgYnJlYWtpbmcgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAqL1xuZXhwb3J0IHZhciBUeXBlO1xuKGZ1bmN0aW9uIChUeXBlKSB7XG4gICAgVHlwZVtUeXBlW1wiTk9ORVwiXSA9IDBdID0gXCJOT05FXCI7XG4gICAgVHlwZVtUeXBlW1wiTnVsbFwiXSA9IDFdID0gXCJOdWxsXCI7XG4gICAgVHlwZVtUeXBlW1wiSW50XCJdID0gMl0gPSBcIkludFwiO1xuICAgIFR5cGVbVHlwZVtcIkZsb2F0aW5nUG9pbnRcIl0gPSAzXSA9IFwiRmxvYXRpbmdQb2ludFwiO1xuICAgIFR5cGVbVHlwZVtcIkJpbmFyeVwiXSA9IDRdID0gXCJCaW5hcnlcIjtcbiAgICBUeXBlW1R5cGVbXCJVdGY4XCJdID0gNV0gPSBcIlV0ZjhcIjtcbiAgICBUeXBlW1R5cGVbXCJCb29sXCJdID0gNl0gPSBcIkJvb2xcIjtcbiAgICBUeXBlW1R5cGVbXCJEZWNpbWFsXCJdID0gN10gPSBcIkRlY2ltYWxcIjtcbiAgICBUeXBlW1R5cGVbXCJEYXRlXCJdID0gOF0gPSBcIkRhdGVcIjtcbiAgICBUeXBlW1R5cGVbXCJUaW1lXCJdID0gOV0gPSBcIlRpbWVcIjtcbiAgICBUeXBlW1R5cGVbXCJUaW1lc3RhbXBcIl0gPSAxMF0gPSBcIlRpbWVzdGFtcFwiO1xuICAgIFR5cGVbVHlwZVtcIkludGVydmFsXCJdID0gMTFdID0gXCJJbnRlcnZhbFwiO1xuICAgIFR5cGVbVHlwZVtcIkxpc3RcIl0gPSAxMl0gPSBcIkxpc3RcIjtcbiAgICBUeXBlW1R5cGVbXCJTdHJ1Y3RfXCJdID0gMTNdID0gXCJTdHJ1Y3RfXCI7XG4gICAgVHlwZVtUeXBlW1wiVW5pb25cIl0gPSAxNF0gPSBcIlVuaW9uXCI7XG4gICAgVHlwZVtUeXBlW1wiRml4ZWRTaXplQmluYXJ5XCJdID0gMTVdID0gXCJGaXhlZFNpemVCaW5hcnlcIjtcbiAgICBUeXBlW1R5cGVbXCJGaXhlZFNpemVMaXN0XCJdID0gMTZdID0gXCJGaXhlZFNpemVMaXN0XCI7XG4gICAgVHlwZVtUeXBlW1wiTWFwXCJdID0gMTddID0gXCJNYXBcIjtcbiAgICBUeXBlW1R5cGVbXCJEdXJhdGlvblwiXSA9IDE4XSA9IFwiRHVyYXRpb25cIjtcbiAgICBUeXBlW1R5cGVbXCJMYXJnZUJpbmFyeVwiXSA9IDE5XSA9IFwiTGFyZ2VCaW5hcnlcIjtcbiAgICBUeXBlW1R5cGVbXCJMYXJnZVV0ZjhcIl0gPSAyMF0gPSBcIkxhcmdlVXRmOFwiO1xuICAgIFR5cGVbVHlwZVtcIkxhcmdlTGlzdFwiXSA9IDIxXSA9IFwiTGFyZ2VMaXN0XCI7XG59KShUeXBlIHx8IChUeXBlID0ge30pKTtcbmV4cG9ydCBmdW5jdGlvbiB1bmlvblRvVHlwZSh0eXBlLCBhY2Nlc3Nvcikge1xuICAgIHN3aXRjaCAoVHlwZVt0eXBlXSkge1xuICAgICAgICBjYXNlICdOT05FJzogcmV0dXJuIG51bGw7XG4gICAgICAgIGNhc2UgJ051bGwnOiByZXR1cm4gYWNjZXNzb3IobmV3IE51bGwoKSk7XG4gICAgICAgIGNhc2UgJ0ludCc6IHJldHVybiBhY2Nlc3NvcihuZXcgSW50KCkpO1xuICAgICAgICBjYXNlICdGbG9hdGluZ1BvaW50JzogcmV0dXJuIGFjY2Vzc29yKG5ldyBGbG9hdGluZ1BvaW50KCkpO1xuICAgICAgICBjYXNlICdCaW5hcnknOiByZXR1cm4gYWNjZXNzb3IobmV3IEJpbmFyeSgpKTtcbiAgICAgICAgY2FzZSAnVXRmOCc6IHJldHVybiBhY2Nlc3NvcihuZXcgVXRmOCgpKTtcbiAgICAgICAgY2FzZSAnQm9vbCc6IHJldHVybiBhY2Nlc3NvcihuZXcgQm9vbCgpKTtcbiAgICAgICAgY2FzZSAnRGVjaW1hbCc6IHJldHVybiBhY2Nlc3NvcihuZXcgRGVjaW1hbCgpKTtcbiAgICAgICAgY2FzZSAnRGF0ZSc6IHJldHVybiBhY2Nlc3NvcihuZXcgRGF0ZSgpKTtcbiAgICAgICAgY2FzZSAnVGltZSc6IHJldHVybiBhY2Nlc3NvcihuZXcgVGltZSgpKTtcbiAgICAgICAgY2FzZSAnVGltZXN0YW1wJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBUaW1lc3RhbXAoKSk7XG4gICAgICAgIGNhc2UgJ0ludGVydmFsJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBJbnRlcnZhbCgpKTtcbiAgICAgICAgY2FzZSAnTGlzdCc6IHJldHVybiBhY2Nlc3NvcihuZXcgTGlzdCgpKTtcbiAgICAgICAgY2FzZSAnU3RydWN0Xyc6IHJldHVybiBhY2Nlc3NvcihuZXcgU3RydWN0XygpKTtcbiAgICAgICAgY2FzZSAnVW5pb24nOiByZXR1cm4gYWNjZXNzb3IobmV3IFVuaW9uKCkpO1xuICAgICAgICBjYXNlICdGaXhlZFNpemVCaW5hcnknOiByZXR1cm4gYWNjZXNzb3IobmV3IEZpeGVkU2l6ZUJpbmFyeSgpKTtcbiAgICAgICAgY2FzZSAnRml4ZWRTaXplTGlzdCc6IHJldHVybiBhY2Nlc3NvcihuZXcgRml4ZWRTaXplTGlzdCgpKTtcbiAgICAgICAgY2FzZSAnTWFwJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBNYXAoKSk7XG4gICAgICAgIGNhc2UgJ0R1cmF0aW9uJzogcmV0dXJuIGFjY2Vzc29yKG5ldyBEdXJhdGlvbigpKTtcbiAgICAgICAgY2FzZSAnTGFyZ2VCaW5hcnknOiByZXR1cm4gYWNjZXNzb3IobmV3IExhcmdlQmluYXJ5KCkpO1xuICAgICAgICBjYXNlICdMYXJnZVV0ZjgnOiByZXR1cm4gYWNjZXNzb3IobmV3IExhcmdlVXRmOCgpKTtcbiAgICAgICAgY2FzZSAnTGFyZ2VMaXN0JzogcmV0dXJuIGFjY2Vzc29yKG5ldyBMYXJnZUxpc3QoKSk7XG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB1bmlvbkxpc3RUb1R5cGUodHlwZSwgYWNjZXNzb3IsIGluZGV4KSB7XG4gICAgc3dpdGNoIChUeXBlW3R5cGVdKSB7XG4gICAgICAgIGNhc2UgJ05PTkUnOiByZXR1cm4gbnVsbDtcbiAgICAgICAgY2FzZSAnTnVsbCc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IE51bGwoKSk7XG4gICAgICAgIGNhc2UgJ0ludCc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IEludCgpKTtcbiAgICAgICAgY2FzZSAnRmxvYXRpbmdQb2ludCc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IEZsb2F0aW5nUG9pbnQoKSk7XG4gICAgICAgIGNhc2UgJ0JpbmFyeSc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IEJpbmFyeSgpKTtcbiAgICAgICAgY2FzZSAnVXRmOCc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IFV0ZjgoKSk7XG4gICAgICAgIGNhc2UgJ0Jvb2wnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBCb29sKCkpO1xuICAgICAgICBjYXNlICdEZWNpbWFsJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgRGVjaW1hbCgpKTtcbiAgICAgICAgY2FzZSAnRGF0ZSc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IERhdGUoKSk7XG4gICAgICAgIGNhc2UgJ1RpbWUnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBUaW1lKCkpO1xuICAgICAgICBjYXNlICdUaW1lc3RhbXAnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBUaW1lc3RhbXAoKSk7XG4gICAgICAgIGNhc2UgJ0ludGVydmFsJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgSW50ZXJ2YWwoKSk7XG4gICAgICAgIGNhc2UgJ0xpc3QnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBMaXN0KCkpO1xuICAgICAgICBjYXNlICdTdHJ1Y3RfJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgU3RydWN0XygpKTtcbiAgICAgICAgY2FzZSAnVW5pb24nOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBVbmlvbigpKTtcbiAgICAgICAgY2FzZSAnRml4ZWRTaXplQmluYXJ5JzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgRml4ZWRTaXplQmluYXJ5KCkpO1xuICAgICAgICBjYXNlICdGaXhlZFNpemVMaXN0JzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgRml4ZWRTaXplTGlzdCgpKTtcbiAgICAgICAgY2FzZSAnTWFwJzogcmV0dXJuIGFjY2Vzc29yKGluZGV4LCBuZXcgTWFwKCkpO1xuICAgICAgICBjYXNlICdEdXJhdGlvbic6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IER1cmF0aW9uKCkpO1xuICAgICAgICBjYXNlICdMYXJnZUJpbmFyeSc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IExhcmdlQmluYXJ5KCkpO1xuICAgICAgICBjYXNlICdMYXJnZVV0ZjgnOiByZXR1cm4gYWNjZXNzb3IoaW5kZXgsIG5ldyBMYXJnZVV0ZjgoKSk7XG4gICAgICAgIGNhc2UgJ0xhcmdlTGlzdCc6IHJldHVybiBhY2Nlc3NvcihpbmRleCwgbmV3IExhcmdlTGlzdCgpKTtcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlLm1qcy5tYXBcbiIsIi8vIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeVxuZXhwb3J0IHZhciBVbmlvbk1vZGU7XG4oZnVuY3Rpb24gKFVuaW9uTW9kZSkge1xuICAgIFVuaW9uTW9kZVtVbmlvbk1vZGVbXCJTcGFyc2VcIl0gPSAwXSA9IFwiU3BhcnNlXCI7XG4gICAgVW5pb25Nb2RlW1VuaW9uTW9kZVtcIkRlbnNlXCJdID0gMV0gPSBcIkRlbnNlXCI7XG59KShVbmlvbk1vZGUgfHwgKFVuaW9uTW9kZSA9IHt9KSk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuaW9uLW1vZGUubWpzLm1hcFxuIiwiLy8gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5XG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5pbXBvcnQgeyBVbmlvbk1vZGUgfSBmcm9tICcuL3VuaW9uLW1vZGUubWpzJztcbi8qKlxuICogQSB1bmlvbiBpcyBhIGNvbXBsZXggdHlwZSB3aXRoIGNoaWxkcmVuIGluIEZpZWxkXG4gKiBCeSBkZWZhdWx0IGlkcyBpbiB0aGUgdHlwZSB2ZWN0b3IgcmVmZXIgdG8gdGhlIG9mZnNldHMgaW4gdGhlIGNoaWxkcmVuXG4gKiBvcHRpb25hbGx5IHR5cGVJZHMgcHJvdmlkZXMgYW4gaW5kaXJlY3Rpb24gYmV0d2VlbiB0aGUgY2hpbGQgb2Zmc2V0IGFuZCB0aGUgdHlwZSBpZFxuICogZm9yIGVhY2ggY2hpbGQgYHR5cGVJZHNbb2Zmc2V0XWAgaXMgdGhlIGlkIHVzZWQgaW4gdGhlIHR5cGUgdmVjdG9yXG4gKi9cbmV4cG9ydCBjbGFzcyBVbmlvbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmJiX3BvcyA9IDA7XG4gICAgfVxuICAgIF9faW5pdChpLCBiYikge1xuICAgICAgICB0aGlzLmJiX3BvcyA9IGk7XG4gICAgICAgIHRoaXMuYmIgPSBiYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSb290QXNVbmlvbihiYiwgb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIHx8IG5ldyBVbmlvbigpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzVW5pb24oYmIsIG9iaikge1xuICAgICAgICBiYi5zZXRQb3NpdGlvbihiYi5wb3NpdGlvbigpICsgZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKTtcbiAgICAgICAgcmV0dXJuIChvYmogfHwgbmV3IFVuaW9uKCkpLl9faW5pdChiYi5yZWFkSW50MzIoYmIucG9zaXRpb24oKSkgKyBiYi5wb3NpdGlvbigpLCBiYik7XG4gICAgfVxuICAgIG1vZGUoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5yZWFkSW50MTYodGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogVW5pb25Nb2RlLlNwYXJzZTtcbiAgICB9XG4gICAgdHlwZUlkcyhpbmRleCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IHRoaXMuYmIucmVhZEludDMyKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MgKyBvZmZzZXQpICsgaW5kZXggKiA0KSA6IDA7XG4gICAgfVxuICAgIHR5cGVJZHNMZW5ndGgoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsIDYpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID8gdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MgKyBvZmZzZXQpIDogMDtcbiAgICB9XG4gICAgdHlwZUlkc0FycmF5KCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLCA2KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA/IG5ldyBJbnQzMkFycmF5KHRoaXMuYmIuYnl0ZXMoKS5idWZmZXIsIHRoaXMuYmIuYnl0ZXMoKS5ieXRlT2Zmc2V0ICsgdGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcyArIG9mZnNldCksIHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zICsgb2Zmc2V0KSkgOiBudWxsO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRVbmlvbihidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRPYmplY3QoMik7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRNb2RlKGJ1aWxkZXIsIG1vZGUpIHtcbiAgICAgICAgYnVpbGRlci5hZGRGaWVsZEludDE2KDAsIG1vZGUsIFVuaW9uTW9kZS5TcGFyc2UpO1xuICAgIH1cbiAgICBzdGF0aWMgYWRkVHlwZUlkcyhidWlsZGVyLCB0eXBlSWRzT2Zmc2V0KSB7XG4gICAgICAgIGJ1aWxkZXIuYWRkRmllbGRPZmZzZXQoMSwgdHlwZUlkc09mZnNldCwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVUeXBlSWRzVmVjdG9yKGJ1aWxkZXIsIGRhdGEpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydFZlY3Rvcig0LCBkYXRhLmxlbmd0aCwgNCk7XG4gICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBidWlsZGVyLmFkZEludDMyKGRhdGFbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLmVuZFZlY3RvcigpO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRUeXBlSWRzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKSB7XG4gICAgICAgIGJ1aWxkZXIuc3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpO1xuICAgIH1cbiAgICBzdGF0aWMgZW5kVW5pb24oYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlVW5pb24oYnVpbGRlciwgbW9kZSwgdHlwZUlkc09mZnNldCkge1xuICAgICAgICBVbmlvbi5zdGFydFVuaW9uKGJ1aWxkZXIpO1xuICAgICAgICBVbmlvbi5hZGRNb2RlKGJ1aWxkZXIsIG1vZGUpO1xuICAgICAgICBVbmlvbi5hZGRUeXBlSWRzKGJ1aWxkZXIsIHR5cGVJZHNPZmZzZXQpO1xuICAgICAgICByZXR1cm4gVW5pb24uZW5kVW5pb24oYnVpbGRlcik7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD11bmlvbi5tanMubWFwXG4iLCIvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnlcbmltcG9ydCAqIGFzIGZsYXRidWZmZXJzIGZyb20gJ2ZsYXRidWZmZXJzJztcbi8qKlxuICogVW5pY29kZSB3aXRoIFVURi04IGVuY29kaW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBVdGY4IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gMDtcbiAgICB9XG4gICAgX19pbml0KGksIGJiKSB7XG4gICAgICAgIHRoaXMuYmJfcG9zID0gaTtcbiAgICAgICAgdGhpcy5iYiA9IGJiO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGdldFJvb3RBc1V0ZjgoYmIsIG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgVXRmOCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzVXRmOChiYiwgb2JqKSB7XG4gICAgICAgIGJiLnNldFBvc2l0aW9uKGJiLnBvc2l0aW9uKCkgKyBmbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gKG9iaiB8fCBuZXcgVXRmOCgpKS5fX2luaXQoYmIucmVhZEludDMyKGJiLnBvc2l0aW9uKCkpICsgYmIucG9zaXRpb24oKSwgYmIpO1xuICAgIH1cbiAgICBzdGF0aWMgc3RhcnRVdGY4KGJ1aWxkZXIpIHtcbiAgICAgICAgYnVpbGRlci5zdGFydE9iamVjdCgwKTtcbiAgICB9XG4gICAgc3RhdGljIGVuZFV0ZjgoYnVpbGRlcikge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWlsZGVyLmVuZE9iamVjdCgpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlVXRmOChidWlsZGVyKSB7XG4gICAgICAgIFV0Zjguc3RhcnRVdGY4KGJ1aWxkZXIpO1xuICAgICAgICByZXR1cm4gVXRmOC5lbmRVdGY4KGJ1aWxkZXIpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRmOC5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IF9fYXN5bmNHZW5lcmF0b3IsIF9fYXdhaXQsIF9fYXdhaXRlciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgdG9VaW50OEFycmF5LCBqb2luVWludDhBcnJheXMsIHRvVWludDhBcnJheUl0ZXJhdG9yLCB0b1VpbnQ4QXJyYXlBc3luY0l0ZXJhdG9yIH0gZnJvbSAnLi4vdXRpbC9idWZmZXIubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgZnJvbUl0ZXJhYmxlKHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gcHVtcChmcm9tSXRlcmFibGUoc291cmNlKSk7XG4gICAgfSxcbiAgICBmcm9tQXN5bmNJdGVyYWJsZShzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHB1bXAoZnJvbUFzeW5jSXRlcmFibGUoc291cmNlKSk7XG4gICAgfSxcbiAgICBmcm9tRE9NU3RyZWFtKHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gcHVtcChmcm9tRE9NU3RyZWFtKHNvdXJjZSkpO1xuICAgIH0sXG4gICAgZnJvbU5vZGVTdHJlYW0oc3RyZWFtKSB7XG4gICAgICAgIHJldHVybiBwdW1wKGZyb21Ob2RlU3RyZWFtKHN0cmVhbSkpO1xuICAgIH0sXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRvRE9NU3RyZWFtKHNvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwidG9ET01TdHJlYW1cIiBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnRgKTtcbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0b05vZGVTdHJlYW0oc291cmNlLCBvcHRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJ0b05vZGVTdHJlYW1cIiBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnRgKTtcbiAgICB9LFxufTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBwdW1wID0gKGl0ZXJhdG9yKSA9PiB7IGl0ZXJhdG9yLm5leHQoKTsgcmV0dXJuIGl0ZXJhdG9yOyB9O1xuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uKiBmcm9tSXRlcmFibGUoc291cmNlKSB7XG4gICAgbGV0IGRvbmUsIHRocmV3ID0gZmFsc2U7XG4gICAgbGV0IGJ1ZmZlcnMgPSBbXSwgYnVmZmVyO1xuICAgIGxldCBjbWQsIHNpemUsIGJ1ZmZlckxlbmd0aCA9IDA7XG4gICAgZnVuY3Rpb24gYnl0ZVJhbmdlKCkge1xuICAgICAgICBpZiAoY21kID09PSAncGVlaycpIHtcbiAgICAgICAgICAgIHJldHVybiBqb2luVWludDhBcnJheXMoYnVmZmVycywgc2l6ZSlbMF07XG4gICAgICAgIH1cbiAgICAgICAgW2J1ZmZlciwgYnVmZmVycywgYnVmZmVyTGVuZ3RoXSA9IGpvaW5VaW50OEFycmF5cyhidWZmZXJzLCBzaXplKTtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9XG4gICAgLy8gWWllbGQgc28gdGhlIGNhbGxlciBjYW4gaW5qZWN0IHRoZSByZWFkIGNvbW1hbmQgYmVmb3JlIGNyZWF0aW5nIHRoZSBzb3VyY2UgSXRlcmF0b3JcbiAgICAoeyBjbWQsIHNpemUgfSA9IHlpZWxkIG51bGwpO1xuICAgIC8vIGluaXRpYWxpemUgdGhlIGl0ZXJhdG9yXG4gICAgY29uc3QgaXQgPSB0b1VpbnQ4QXJyYXlJdGVyYXRvcihzb3VyY2UpW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICB0cnkge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICAvLyByZWFkIHRoZSBuZXh0IHZhbHVlXG4gICAgICAgICAgICAoeyBkb25lLCB2YWx1ZTogYnVmZmVyIH0gPSBOdW1iZXIuaXNOYU4oc2l6ZSAtIGJ1ZmZlckxlbmd0aCkgP1xuICAgICAgICAgICAgICAgIGl0Lm5leHQoKSA6IGl0Lm5leHQoc2l6ZSAtIGJ1ZmZlckxlbmd0aCkpO1xuICAgICAgICAgICAgLy8gaWYgY2h1bmsgaXMgbm90IG51bGwgb3IgZW1wdHksIHB1c2ggaXQgb250byB0aGUgcXVldWVcbiAgICAgICAgICAgIGlmICghZG9uZSAmJiBidWZmZXIuYnl0ZUxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBidWZmZXJzLnB1c2goYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBidWZmZXJMZW5ndGggKz0gYnVmZmVyLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGVub3VnaCBieXRlcyBpbiBvdXIgYnVmZmVyLCB5aWVsZCBjaHVua3MgdW50aWwgd2UgZG9uJ3RcbiAgICAgICAgICAgIGlmIChkb25lIHx8IHNpemUgPD0gYnVmZmVyTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICAoeyBjbWQsIHNpemUgfSA9IHlpZWxkIGJ5dGVSYW5nZSgpKTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChzaXplIDwgYnVmZmVyTGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoIWRvbmUpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICAodGhyZXcgPSB0cnVlKSAmJiAodHlwZW9mIGl0LnRocm93ID09PSAnZnVuY3Rpb24nKSAmJiAoaXQudGhyb3coZSkpO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgKHRocmV3ID09PSBmYWxzZSkgJiYgKHR5cGVvZiBpdC5yZXR1cm4gPT09ICdmdW5jdGlvbicpICYmIChpdC5yZXR1cm4obnVsbCkpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBmcm9tQXN5bmNJdGVyYWJsZShzb3VyY2UpIHtcbiAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBmcm9tQXN5bmNJdGVyYWJsZV8xKCkge1xuICAgICAgICBsZXQgZG9uZSwgdGhyZXcgPSBmYWxzZTtcbiAgICAgICAgbGV0IGJ1ZmZlcnMgPSBbXSwgYnVmZmVyO1xuICAgICAgICBsZXQgY21kLCBzaXplLCBidWZmZXJMZW5ndGggPSAwO1xuICAgICAgICBmdW5jdGlvbiBieXRlUmFuZ2UoKSB7XG4gICAgICAgICAgICBpZiAoY21kID09PSAncGVlaycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gam9pblVpbnQ4QXJyYXlzKGJ1ZmZlcnMsIHNpemUpWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgW2J1ZmZlciwgYnVmZmVycywgYnVmZmVyTGVuZ3RoXSA9IGpvaW5VaW50OEFycmF5cyhidWZmZXJzLCBzaXplKTtcbiAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gWWllbGQgc28gdGhlIGNhbGxlciBjYW4gaW5qZWN0IHRoZSByZWFkIGNvbW1hbmQgYmVmb3JlIGNyZWF0aW5nIHRoZSBzb3VyY2UgQXN5bmNJdGVyYXRvclxuICAgICAgICAoeyBjbWQsIHNpemUgfSA9ICh5aWVsZCB5aWVsZCBfX2F3YWl0KG51bGwpKSk7XG4gICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGl0ZXJhdG9yXG4gICAgICAgIGNvbnN0IGl0ID0gdG9VaW50OEFycmF5QXN5bmNJdGVyYXRvcihzb3VyY2UpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIC8vIHJlYWQgdGhlIG5leHQgdmFsdWVcbiAgICAgICAgICAgICAgICAoeyBkb25lLCB2YWx1ZTogYnVmZmVyIH0gPSBOdW1iZXIuaXNOYU4oc2l6ZSAtIGJ1ZmZlckxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgPyB5aWVsZCBfX2F3YWl0KGl0Lm5leHQoKSlcbiAgICAgICAgICAgICAgICAgICAgOiB5aWVsZCBfX2F3YWl0KGl0Lm5leHQoc2l6ZSAtIGJ1ZmZlckxlbmd0aCkpKTtcbiAgICAgICAgICAgICAgICAvLyBpZiBjaHVuayBpcyBub3QgbnVsbCBvciBlbXB0eSwgcHVzaCBpdCBvbnRvIHRoZSBxdWV1ZVxuICAgICAgICAgICAgICAgIGlmICghZG9uZSAmJiBidWZmZXIuYnl0ZUxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVycy5wdXNoKGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlckxlbmd0aCArPSBidWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBlbm91Z2ggYnl0ZXMgaW4gb3VyIGJ1ZmZlciwgeWllbGQgY2h1bmtzIHVudGlsIHdlIGRvbid0XG4gICAgICAgICAgICAgICAgaWYgKGRvbmUgfHwgc2l6ZSA8PSBidWZmZXJMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgKHsgY21kLCBzaXplIH0gPSB5aWVsZCB5aWVsZCBfX2F3YWl0KGJ5dGVSYW5nZSgpKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHNpemUgPCBidWZmZXJMZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKCFkb25lKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgKHRocmV3ID0gdHJ1ZSkgJiYgKHR5cGVvZiBpdC50aHJvdyA9PT0gJ2Z1bmN0aW9uJykgJiYgKHlpZWxkIF9fYXdhaXQoaXQudGhyb3coZSkpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICh0aHJldyA9PT0gZmFsc2UpICYmICh0eXBlb2YgaXQucmV0dXJuID09PSAnZnVuY3Rpb24nKSAmJiAoeWllbGQgX19hd2FpdChpdC5yZXR1cm4obmV3IFVpbnQ4QXJyYXkoMCkpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHlpZWxkIF9fYXdhaXQobnVsbCk7XG4gICAgfSk7XG59XG4vLyBBbGwgdGhpcyBtYW51YWwgVWludDhBcnJheSBjaHVuayBtYW5hZ2VtZW50IGNhbiBiZSBhdm9pZGVkIGlmL3doZW4gZW5naW5lc1xuLy8gYWRkIHN1cHBvcnQgZm9yIEFycmF5QnVmZmVyLnRyYW5zZmVyKCkgb3IgQXJyYXlCdWZmZXIucHJvdG90eXBlLnJlYWxsb2MoKTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kb21lbmljL3Byb3Bvc2FsLWFycmF5YnVmZmVyLXRyYW5zZmVyXG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZnJvbURPTVN0cmVhbShzb3VyY2UpIHtcbiAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBmcm9tRE9NU3RyZWFtXzEoKSB7XG4gICAgICAgIGxldCBkb25lID0gZmFsc2UsIHRocmV3ID0gZmFsc2U7XG4gICAgICAgIGxldCBidWZmZXJzID0gW10sIGJ1ZmZlcjtcbiAgICAgICAgbGV0IGNtZCwgc2l6ZSwgYnVmZmVyTGVuZ3RoID0gMDtcbiAgICAgICAgZnVuY3Rpb24gYnl0ZVJhbmdlKCkge1xuICAgICAgICAgICAgaWYgKGNtZCA9PT0gJ3BlZWsnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGpvaW5VaW50OEFycmF5cyhidWZmZXJzLCBzaXplKVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFtidWZmZXIsIGJ1ZmZlcnMsIGJ1ZmZlckxlbmd0aF0gPSBqb2luVWludDhBcnJheXMoYnVmZmVycywgc2l6ZSk7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIC8vIFlpZWxkIHNvIHRoZSBjYWxsZXIgY2FuIGluamVjdCB0aGUgcmVhZCBjb21tYW5kIGJlZm9yZSB3ZSBlc3RhYmxpc2ggdGhlIFJlYWRhYmxlU3RyZWFtIGxvY2tcbiAgICAgICAgKHsgY21kLCBzaXplIH0gPSB5aWVsZCB5aWVsZCBfX2F3YWl0KG51bGwpKTtcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgcmVhZGVyIGFuZCBsb2NrIHRoZSBzdHJlYW1cbiAgICAgICAgY29uc3QgaXQgPSBuZXcgQWRhcHRpdmVCeXRlUmVhZGVyKHNvdXJjZSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgLy8gcmVhZCB0aGUgbmV4dCB2YWx1ZVxuICAgICAgICAgICAgICAgICh7IGRvbmUsIHZhbHVlOiBidWZmZXIgfSA9IE51bWJlci5pc05hTihzaXplIC0gYnVmZmVyTGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICA/IHlpZWxkIF9fYXdhaXQoaXRbJ3JlYWQnXSgpKVxuICAgICAgICAgICAgICAgICAgICA6IHlpZWxkIF9fYXdhaXQoaXRbJ3JlYWQnXShzaXplIC0gYnVmZmVyTGVuZ3RoKSkpO1xuICAgICAgICAgICAgICAgIC8vIGlmIGNodW5rIGlzIG5vdCBudWxsIG9yIGVtcHR5LCBwdXNoIGl0IG9udG8gdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgaWYgKCFkb25lICYmIGJ1ZmZlci5ieXRlTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBidWZmZXJzLnB1c2godG9VaW50OEFycmF5KGJ1ZmZlcikpO1xuICAgICAgICAgICAgICAgICAgICBidWZmZXJMZW5ndGggKz0gYnVmZmVyLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgZW5vdWdoIGJ5dGVzIGluIG91ciBidWZmZXIsIHlpZWxkIGNodW5rcyB1bnRpbCB3ZSBkb24ndFxuICAgICAgICAgICAgICAgIGlmIChkb25lIHx8IHNpemUgPD0gYnVmZmVyTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICh7IGNtZCwgc2l6ZSB9ID0geWllbGQgeWllbGQgX19hd2FpdChieXRlUmFuZ2UoKSkpO1xuICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChzaXplIDwgYnVmZmVyTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlICghZG9uZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICh0aHJldyA9IHRydWUpICYmICh5aWVsZCBfX2F3YWl0KGl0WydjYW5jZWwnXShlKSkpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgKHRocmV3ID09PSBmYWxzZSkgPyAoeWllbGQgX19hd2FpdChpdFsnY2FuY2VsJ10oKSkpXG4gICAgICAgICAgICAgICAgOiBzb3VyY2VbJ2xvY2tlZCddICYmIGl0LnJlbGVhc2VMb2NrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHlpZWxkIF9fYXdhaXQobnVsbCk7XG4gICAgfSk7XG59XG4vKiogQGlnbm9yZSAqL1xuY2xhc3MgQWRhcHRpdmVCeXRlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIHRoaXMucmVhZGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWFkZXIgPSB0aGlzLnNvdXJjZVsnZ2V0UmVhZGVyJ10oKTtcbiAgICAgICAgLy8gV2UgaGF2ZSB0byBjYXRjaCBhbmQgc3dhbGxvdyBlcnJvcnMgaGVyZSB0byBhdm9pZCB1bmNhdWdodCBwcm9taXNlIHJlamVjdGlvbiBleGNlcHRpb25zXG4gICAgICAgIC8vIHRoYXQgc2VlbSB0byBiZSByYWlzZWQgd2hlbiB3ZSBjYWxsIGByZWxlYXNlTG9jaygpYCBvbiB0aGlzIHJlYWRlci4gSSdtIHN0aWxsIG15c3RpZmllZFxuICAgICAgICAvLyBhYm91dCB3aHkgdGhlc2UgZXJyb3JzIGFyZSByYWlzZWQsIGJ1dCBJJ20gc3VyZSB0aGVyZSdzIHNvbWUgaW1wb3J0YW50IHNwZWMgcmVhc29uIHRoYXRcbiAgICAgICAgLy8gSSBoYXZlbid0IGNvbnNpZGVyZWQuIEkgaGF0ZSB0byBlbXBsb3kgc3VjaCBhbiBhbnRpLXBhdHRlcm4gaGVyZSwgYnV0IGl0IHNlZW1zIGxpa2UgdGhlXG4gICAgICAgIC8vIG9ubHkgc29sdXRpb24gaW4gdGhpcyBjYXNlIDovXG4gICAgICAgIHRoaXMucmVhZGVyWydjbG9zZWQnXS5jYXRjaCgoKSA9PiB7IH0pO1xuICAgIH1cbiAgICBnZXQgY2xvc2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkZXIgPyB0aGlzLnJlYWRlclsnY2xvc2VkJ10uY2F0Y2goKCkgPT4geyB9KSA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZWxlYXNlTG9jaygpIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZGVyKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWRlci5yZWxlYXNlTG9jaygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVhZGVyID0gbnVsbDtcbiAgICB9XG4gICAgY2FuY2VsKHJlYXNvbikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgeyByZWFkZXIsIHNvdXJjZSB9ID0gdGhpcztcbiAgICAgICAgICAgIHJlYWRlciAmJiAoeWllbGQgcmVhZGVyWydjYW5jZWwnXShyZWFzb24pLmNhdGNoKCgpID0+IHsgfSkpO1xuICAgICAgICAgICAgc291cmNlICYmIChzb3VyY2VbJ2xvY2tlZCddICYmIHRoaXMucmVsZWFzZUxvY2soKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWFkKHNpemUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmIChzaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdGhpcy5yZWFkZXIgPT0gbnVsbCwgdmFsdWU6IG5ldyBVaW50OEFycmF5KDApIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCB0aGlzLnJlYWRlci5yZWFkKCk7XG4gICAgICAgICAgICAhcmVzdWx0LmRvbmUgJiYgKHJlc3VsdC52YWx1ZSA9IHRvVWludDhBcnJheShyZXN1bHQpKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5jb25zdCBvbkV2ZW50ID0gKHN0cmVhbSwgZXZlbnQpID0+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gKF8pID0+IHJlc29sdmUoW2V2ZW50LCBfXSk7XG4gICAgbGV0IHJlc29sdmU7XG4gICAgcmV0dXJuIFtldmVudCwgaGFuZGxlciwgbmV3IFByb21pc2UoKHIpID0+IChyZXNvbHZlID0gcikgJiYgc3RyZWFtWydvbmNlJ10oZXZlbnQsIGhhbmRsZXIpKV07XG59O1xuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGZyb21Ob2RlU3RyZWFtKHN0cmVhbSkge1xuICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIGZyb21Ob2RlU3RyZWFtXzEoKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50cyA9IFtdO1xuICAgICAgICBsZXQgZXZlbnQgPSAnZXJyb3InO1xuICAgICAgICBsZXQgZG9uZSA9IGZhbHNlLCBlcnIgPSBudWxsO1xuICAgICAgICBsZXQgY21kLCBzaXplLCBidWZmZXJMZW5ndGggPSAwO1xuICAgICAgICBsZXQgYnVmZmVycyA9IFtdLCBidWZmZXI7XG4gICAgICAgIGZ1bmN0aW9uIGJ5dGVSYW5nZSgpIHtcbiAgICAgICAgICAgIGlmIChjbWQgPT09ICdwZWVrJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBqb2luVWludDhBcnJheXMoYnVmZmVycywgc2l6ZSlbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBbYnVmZmVyLCBidWZmZXJzLCBidWZmZXJMZW5ndGhdID0gam9pblVpbnQ4QXJyYXlzKGJ1ZmZlcnMsIHNpemUpO1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBZaWVsZCBzbyB0aGUgY2FsbGVyIGNhbiBpbmplY3QgdGhlIHJlYWQgY29tbWFuZCBiZWZvcmUgd2VcbiAgICAgICAgLy8gYWRkIHRoZSBsaXN0ZW5lciBmb3IgdGhlIHNvdXJjZSBzdHJlYW0ncyAncmVhZGFibGUnIGV2ZW50LlxuICAgICAgICAoeyBjbWQsIHNpemUgfSA9IHlpZWxkIHlpZWxkIF9fYXdhaXQobnVsbCkpO1xuICAgICAgICAvLyBpZ25vcmUgc3RkaW4gaWYgaXQncyBhIFRUWVxuICAgICAgICBpZiAoc3RyZWFtWydpc1RUWSddKSB7XG4gICAgICAgICAgICB5aWVsZCB5aWVsZCBfX2F3YWl0KG5ldyBVaW50OEFycmF5KDApKTtcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCBfX2F3YWl0KG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBzdHJlYW0gZXZlbnQgaGFuZGxlcnNcbiAgICAgICAgICAgIGV2ZW50c1swXSA9IG9uRXZlbnQoc3RyZWFtLCAnZW5kJyk7XG4gICAgICAgICAgICBldmVudHNbMV0gPSBvbkV2ZW50KHN0cmVhbSwgJ2Vycm9yJyk7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgZXZlbnRzWzJdID0gb25FdmVudChzdHJlYW0sICdyZWFkYWJsZScpO1xuICAgICAgICAgICAgICAgIC8vIHdhaXQgb24gdGhlIGZpcnN0IG1lc3NhZ2UgZXZlbnQgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICAgICAgW2V2ZW50LCBlcnJdID0geWllbGQgX19hd2FpdChQcm9taXNlLnJhY2UoZXZlbnRzLm1hcCgoeCkgPT4geFsyXSkpKTtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc3RyZWFtIGVtaXR0ZWQgYW4gRXJyb3IsIHJldGhyb3cgaXRcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghKGRvbmUgPSBldmVudCA9PT0gJ2VuZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzaXplIGlzIE5hTiwgcmVxdWVzdCB0byByZWFkIGV2ZXJ5dGhpbmcgaW4gdGhlIHN0cmVhbSdzIGludGVybmFsIGJ1ZmZlclxuICAgICAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShzaXplIC0gYnVmZmVyTGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gdG9VaW50OEFycmF5KHN0cmVhbVsncmVhZCddKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gdG9VaW50OEFycmF5KHN0cmVhbVsncmVhZCddKHNpemUgLSBidWZmZXJMZW5ndGgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBieXRlTGVuZ3RoIGlzIDAsIHRoZW4gdGhlIHJlcXVlc3RlZCBhbW91bnQgaXMgbW9yZSB0aGFuIHRoZSBzdHJlYW0gaGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBpdHMgaW50ZXJuYWwgYnVmZmVyLiBJbiB0aGlzIGNhc2UgdGhlIHN0cmVhbSBuZWVkcyBhIFwia2lja1wiIHRvIHRlbGwgaXQgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIGVtaXR0aW5nIHJlYWRhYmxlIGV2ZW50cywgc28gcmVxdWVzdCB0byByZWFkIGV2ZXJ5dGhpbmcgdGhlIHN0cmVhbVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFzIGluIGl0cyBpbnRlcm5hbCBidWZmZXIgcmlnaHQgbm93LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci5ieXRlTGVuZ3RoIDwgKHNpemUgLSBidWZmZXJMZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gdG9VaW50OEFycmF5KHN0cmVhbVsncmVhZCddKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIGNodW5rIGlzIG5vdCBudWxsIG9yIGVtcHR5LCBwdXNoIGl0IG9udG8gdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXIuYnl0ZUxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnMucHVzaChidWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTGVuZ3RoICs9IGJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgZW5vdWdoIGJ5dGVzIGluIG91ciBidWZmZXIsIHlpZWxkIGNodW5rcyB1bnRpbCB3ZSBkb24ndFxuICAgICAgICAgICAgICAgIGlmIChkb25lIHx8IHNpemUgPD0gYnVmZmVyTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICh7IGNtZCwgc2l6ZSB9ID0geWllbGQgeWllbGQgX19hd2FpdChieXRlUmFuZ2UoKSkpO1xuICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChzaXplIDwgYnVmZmVyTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlICghZG9uZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB5aWVsZCBfX2F3YWl0KGNsZWFudXAoZXZlbnRzLCBldmVudCA9PT0gJ2Vycm9yJyA/IGVyciA6IG51bGwpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geWllbGQgX19hd2FpdChudWxsKTtcbiAgICAgICAgZnVuY3Rpb24gY2xlYW51cChldmVudHMsIGVycikge1xuICAgICAgICAgICAgYnVmZmVyID0gYnVmZmVycyA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2V2dCwgZm5dIG9mIGV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW1bJ29mZiddKGV2dCwgZm4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTb21lIHN0cmVhbSBpbXBsZW1lbnRhdGlvbnMgZG9uJ3QgY2FsbCB0aGUgZGVzdHJveSBjYWxsYmFjayxcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBpdCdzIHJlYWxseSBhIG5vZGUtaW50ZXJuYWwgQVBJLiBKdXN0IGNhbGxpbmcgYGRlc3Ryb3lgXG4gICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgc2hvdWxkIGJlIGVub3VnaCB0byBjb25mb3JtIHRvIHRoZSBSZWFkYWJsZVN0cmVhbSBjb250cmFjdFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0cm95ID0gc3RyZWFtWydkZXN0cm95J107XG4gICAgICAgICAgICAgICAgICAgIGRlc3Ryb3kgJiYgZGVzdHJveS5jYWxsKHN0cmVhbSwgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBlcnIgPSBlIHx8IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIGVyciAhPSBudWxsID8gcmVqZWN0KGVycikgOiByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWRhcHRlcnMubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBfX2F3YWl0ZXIgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEJ5dGVTdHJlYW0sIEFzeW5jQnl0ZVN0cmVhbSB9IGZyb20gJy4vc3RyZWFtLm1qcyc7XG5pbXBvcnQgeyB0b1VpbnQ4QXJyYXkgfSBmcm9tICcuLi91dGlsL2J1ZmZlci5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBSYW5kb21BY2Nlc3NGaWxlIGV4dGVuZHMgQnl0ZVN0cmVhbSB7XG4gICAgY29uc3RydWN0b3IoYnVmZmVyLCBieXRlTGVuZ3RoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSAwO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IHRvVWludDhBcnJheShidWZmZXIpO1xuICAgICAgICB0aGlzLnNpemUgPSB0eXBlb2YgYnl0ZUxlbmd0aCA9PT0gJ3VuZGVmaW5lZCcgPyB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoIDogYnl0ZUxlbmd0aDtcbiAgICB9XG4gICAgcmVhZEludDMyKHBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHsgYnVmZmVyLCBieXRlT2Zmc2V0IH0gPSB0aGlzLnJlYWRBdChwb3NpdGlvbiwgNCk7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YVZpZXcoYnVmZmVyLCBieXRlT2Zmc2V0KS5nZXRJbnQzMigwLCB0cnVlKTtcbiAgICB9XG4gICAgc2Vlayhwb3NpdGlvbikge1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gTWF0aC5taW4ocG9zaXRpb24sIHRoaXMuc2l6ZSk7XG4gICAgICAgIHJldHVybiBwb3NpdGlvbiA8IHRoaXMuc2l6ZTtcbiAgICB9XG4gICAgcmVhZChuQnl0ZXMpIHtcbiAgICAgICAgY29uc3QgeyBidWZmZXIsIHNpemUsIHBvc2l0aW9uIH0gPSB0aGlzO1xuICAgICAgICBpZiAoYnVmZmVyICYmIHBvc2l0aW9uIDwgc2l6ZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBuQnl0ZXMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgbkJ5dGVzID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IE1hdGgubWluKHNpemUsIHBvc2l0aW9uICsgTWF0aC5taW4oc2l6ZSAtIHBvc2l0aW9uLCBuQnl0ZXMpKTtcbiAgICAgICAgICAgIHJldHVybiBidWZmZXIuc3ViYXJyYXkocG9zaXRpb24sIHRoaXMucG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZWFkQXQocG9zaXRpb24sIG5CeXRlcykge1xuICAgICAgICBjb25zdCBidWYgPSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4odGhpcy5zaXplLCBwb3NpdGlvbiArIG5CeXRlcyk7XG4gICAgICAgIHJldHVybiBidWYgPyBidWYuc3ViYXJyYXkocG9zaXRpb24sIGVuZCkgOiBuZXcgVWludDhBcnJheShuQnl0ZXMpO1xuICAgIH1cbiAgICBjbG9zZSgpIHsgdGhpcy5idWZmZXIgJiYgKHRoaXMuYnVmZmVyID0gbnVsbCk7IH1cbiAgICB0aHJvdyh2YWx1ZSkgeyB0aGlzLmNsb3NlKCk7IHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlIH07IH1cbiAgICByZXR1cm4odmFsdWUpIHsgdGhpcy5jbG9zZSgpOyByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZSB9OyB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEFzeW5jUmFuZG9tQWNjZXNzRmlsZSBleHRlbmRzIEFzeW5jQnl0ZVN0cmVhbSB7XG4gICAgY29uc3RydWN0b3IoZmlsZSwgYnl0ZUxlbmd0aCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gMDtcbiAgICAgICAgdGhpcy5faGFuZGxlID0gZmlsZTtcbiAgICAgICAgaWYgKHR5cGVvZiBieXRlTGVuZ3RoID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5zaXplID0gYnl0ZUxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmcgPSAoKCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2l6ZSA9ICh5aWVsZCBmaWxlLnN0YXQoKSkuc2l6ZTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fcGVuZGluZztcbiAgICAgICAgICAgIH0pKSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlYWRJbnQzMihwb3NpdGlvbikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgeyBidWZmZXIsIGJ5dGVPZmZzZXQgfSA9IHlpZWxkIHRoaXMucmVhZEF0KHBvc2l0aW9uLCA0KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YVZpZXcoYnVmZmVyLCBieXRlT2Zmc2V0KS5nZXRJbnQzMigwLCB0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNlZWsocG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmcgJiYgKHlpZWxkIHRoaXMuX3BlbmRpbmcpO1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IE1hdGgubWluKHBvc2l0aW9uLCB0aGlzLnNpemUpO1xuICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uIDwgdGhpcy5zaXplO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVhZChuQnl0ZXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmcgJiYgKHlpZWxkIHRoaXMuX3BlbmRpbmcpO1xuICAgICAgICAgICAgY29uc3QgeyBfaGFuZGxlOiBmaWxlLCBzaXplLCBwb3NpdGlvbiB9ID0gdGhpcztcbiAgICAgICAgICAgIGlmIChmaWxlICYmIHBvc2l0aW9uIDwgc2l6ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbkJ5dGVzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICBuQnl0ZXMgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwb3MgPSBwb3NpdGlvbiwgb2Zmc2V0ID0gMCwgYnl0ZXNSZWFkID0gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihzaXplLCBwb3MgKyBNYXRoLm1pbihzaXplIC0gcG9zLCBuQnl0ZXMpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheShNYXRoLm1heCgwLCAodGhpcy5wb3NpdGlvbiA9IGVuZCkgLSBwb3MpKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoKHBvcyArPSBieXRlc1JlYWQpIDwgZW5kICYmIChvZmZzZXQgKz0gYnl0ZXNSZWFkKSA8IGJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICh7IGJ5dGVzUmVhZCB9ID0geWllbGQgZmlsZS5yZWFkKGJ1ZmZlciwgb2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aCAtIG9mZnNldCwgcG9zKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlYWRBdChwb3NpdGlvbiwgbkJ5dGVzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nICYmICh5aWVsZCB0aGlzLl9wZW5kaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IHsgX2hhbmRsZTogZmlsZSwgc2l6ZSB9ID0gdGhpcztcbiAgICAgICAgICAgIGlmIChmaWxlICYmIChwb3NpdGlvbiArIG5CeXRlcykgPCBzaXplKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4oc2l6ZSwgcG9zaXRpb24gKyBuQnl0ZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGVuZCAtIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHlpZWxkIGZpbGUucmVhZChidWZmZXIsIDAsIG5CeXRlcywgcG9zaXRpb24pKS5idWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobkJ5dGVzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsb3NlKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgeyBjb25zdCBmID0gdGhpcy5faGFuZGxlOyB0aGlzLl9oYW5kbGUgPSBudWxsOyBmICYmICh5aWVsZCBmLmNsb3NlKCkpOyB9KTtcbiAgICB9XG4gICAgdGhyb3codmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsgeWllbGQgdGhpcy5jbG9zZSgpOyByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZSB9OyB9KTtcbiAgICB9XG4gICAgcmV0dXJuKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7IHlpZWxkIHRoaXMuY2xvc2UoKTsgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWUgfTsgfSk7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWxlLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgX19hd2FpdGVyIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgc3RyZWFtQWRhcHRlcnMgZnJvbSAnLi9hZGFwdGVycy5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBJVEVSQVRPUl9ET05FID0gT2JqZWN0LmZyZWV6ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB2b2lkICgwKSB9KTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgQXJyb3dKU09OIHtcbiAgICBjb25zdHJ1Y3RvcihfanNvbikge1xuICAgICAgICB0aGlzLl9qc29uID0gX2pzb247XG4gICAgfVxuICAgIGdldCBzY2hlbWEoKSB7IHJldHVybiB0aGlzLl9qc29uWydzY2hlbWEnXTsgfVxuICAgIGdldCBiYXRjaGVzKCkgeyByZXR1cm4gKHRoaXMuX2pzb25bJ2JhdGNoZXMnXSB8fCBbXSk7IH1cbiAgICBnZXQgZGljdGlvbmFyaWVzKCkgeyByZXR1cm4gKHRoaXMuX2pzb25bJ2RpY3Rpb25hcmllcyddIHx8IFtdKTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBSZWFkYWJsZUludGVyb3Age1xuICAgIHRlZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldERPTVN0cmVhbSgpLnRlZSgpO1xuICAgIH1cbiAgICBwaXBlKHdyaXRhYmxlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXROb2RlU3RyZWFtKCkucGlwZSh3cml0YWJsZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHBpcGVUbyh3cml0YWJsZSwgb3B0aW9ucykgeyByZXR1cm4gdGhpcy5fZ2V0RE9NU3RyZWFtKCkucGlwZVRvKHdyaXRhYmxlLCBvcHRpb25zKTsgfVxuICAgIHBpcGVUaHJvdWdoKGR1cGxleCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RE9NU3RyZWFtKCkucGlwZVRocm91Z2goZHVwbGV4LCBvcHRpb25zKTtcbiAgICB9XG4gICAgX2dldERPTVN0cmVhbSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX0RPTVN0cmVhbSB8fCAodGhpcy5fRE9NU3RyZWFtID0gdGhpcy50b0RPTVN0cmVhbSgpKTtcbiAgICB9XG4gICAgX2dldE5vZGVTdHJlYW0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ub2RlU3RyZWFtIHx8ICh0aGlzLl9ub2RlU3RyZWFtID0gdGhpcy50b05vZGVTdHJlYW0oKSk7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBBc3luY1F1ZXVlIGV4dGVuZHMgUmVhZGFibGVJbnRlcm9wIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fdmFsdWVzID0gW107XG4gICAgICAgIHRoaXMucmVzb2x2ZXJzID0gW107XG4gICAgICAgIHRoaXMuX2Nsb3NlZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocikgPT4gdGhpcy5fY2xvc2VkUHJvbWlzZVJlc29sdmUgPSByKTtcbiAgICB9XG4gICAgZ2V0IGNsb3NlZCgpIHsgcmV0dXJuIHRoaXMuX2Nsb3NlZFByb21pc2U7IH1cbiAgICBjYW5jZWwocmVhc29uKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7IHlpZWxkIHRoaXMucmV0dXJuKHJlYXNvbik7IH0pO1xuICAgIH1cbiAgICB3cml0ZSh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5fZW5zdXJlT3BlbigpKSB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVycy5sZW5ndGggPD0gMFxuICAgICAgICAgICAgICAgID8gKHRoaXMuX3ZhbHVlcy5wdXNoKHZhbHVlKSlcbiAgICAgICAgICAgICAgICA6ICh0aGlzLnJlc29sdmVycy5zaGlmdCgpLnJlc29sdmUoeyBkb25lOiBmYWxzZSwgdmFsdWUgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFib3J0KHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLl9jbG9zZWRQcm9taXNlUmVzb2x2ZSkge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlcnMubGVuZ3RoIDw9IDBcbiAgICAgICAgICAgICAgICA/ICh0aGlzLl9lcnJvciA9IHsgZXJyb3I6IHZhbHVlIH0pXG4gICAgICAgICAgICAgICAgOiAodGhpcy5yZXNvbHZlcnMuc2hpZnQoKS5yZWplY3QoeyBkb25lOiB0cnVlLCB2YWx1ZSB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2xvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jbG9zZWRQcm9taXNlUmVzb2x2ZSkge1xuICAgICAgICAgICAgY29uc3QgeyByZXNvbHZlcnMgfSA9IHRoaXM7XG4gICAgICAgICAgICB3aGlsZSAocmVzb2x2ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlcnMuc2hpZnQoKS5yZXNvbHZlKElURVJBVE9SX0RPTkUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fY2xvc2VkUHJvbWlzZVJlc29sdmUoKTtcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlZFByb21pc2VSZXNvbHZlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7IHJldHVybiB0aGlzOyB9XG4gICAgdG9ET01TdHJlYW0ob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gc3RyZWFtQWRhcHRlcnMudG9ET01TdHJlYW0oKHRoaXMuX2Nsb3NlZFByb21pc2VSZXNvbHZlIHx8IHRoaXMuX2Vycm9yKVxuICAgICAgICAgICAgPyB0aGlzXG4gICAgICAgICAgICA6IHRoaXMuX3ZhbHVlcywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHRvTm9kZVN0cmVhbShvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBzdHJlYW1BZGFwdGVycy50b05vZGVTdHJlYW0oKHRoaXMuX2Nsb3NlZFByb21pc2VSZXNvbHZlIHx8IHRoaXMuX2Vycm9yKVxuICAgICAgICAgICAgPyB0aGlzXG4gICAgICAgICAgICA6IHRoaXMuX3ZhbHVlcywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHRocm93KF8pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsgeWllbGQgdGhpcy5hYm9ydChfKTsgcmV0dXJuIElURVJBVE9SX0RPTkU7IH0pO1xuICAgIH1cbiAgICByZXR1cm4oXykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgeyB5aWVsZCB0aGlzLmNsb3NlKCk7IHJldHVybiBJVEVSQVRPUl9ET05FOyB9KTtcbiAgICB9XG4gICAgcmVhZChzaXplKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7IHJldHVybiAoeWllbGQgdGhpcy5uZXh0KHNpemUsICdyZWFkJykpLnZhbHVlOyB9KTtcbiAgICB9XG4gICAgcGVlayhzaXplKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7IHJldHVybiAoeWllbGQgdGhpcy5uZXh0KHNpemUsICdwZWVrJykpLnZhbHVlOyB9KTtcbiAgICB9XG4gICAgbmV4dCguLi5fYXJncykge1xuICAgICAgICBpZiAodGhpcy5fdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyBkb25lOiBmYWxzZSwgdmFsdWU6IHRoaXMuX3ZhbHVlcy5zaGlmdCgpIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX2Vycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoeyBkb25lOiB0cnVlLCB2YWx1ZTogdGhpcy5fZXJyb3IuZXJyb3IgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX2Nsb3NlZFByb21pc2VSZXNvbHZlKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKElURVJBVE9SX0RPTkUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVycy5wdXNoKHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2Vuc3VyZU9wZW4oKSB7XG4gICAgICAgIGlmICh0aGlzLl9jbG9zZWRQcm9taXNlUmVzb2x2ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBc3luY1F1ZXVlIGlzIGNsb3NlZGApO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW50ZXJmYWNlcy5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IF9fYXN5bmNWYWx1ZXMsIF9fYXdhaXRlciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHN0cmVhbUFkYXB0ZXJzIGZyb20gJy4vYWRhcHRlcnMubWpzJztcbmltcG9ydCB7IGRlY29kZVV0ZjggfSBmcm9tICcuLi91dGlsL3V0ZjgubWpzJztcbmltcG9ydCB7IElURVJBVE9SX0RPTkUsIEFzeW5jUXVldWUgfSBmcm9tICcuL2ludGVyZmFjZXMubWpzJztcbmltcG9ydCB7IHRvVWludDhBcnJheSwgam9pblVpbnQ4QXJyYXlzIH0gZnJvbSAnLi4vdXRpbC9idWZmZXIubWpzJztcbmltcG9ydCB7IGlzUHJvbWlzZSwgaXNGZXRjaFJlc3BvbnNlLCBpc0l0ZXJhYmxlLCBpc0FzeW5jSXRlcmFibGUsIGlzUmVhZGFibGVET01TdHJlYW0sIGlzUmVhZGFibGVOb2RlU3RyZWFtIH0gZnJvbSAnLi4vdXRpbC9jb21wYXQubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgQXN5bmNCeXRlUXVldWUgZXh0ZW5kcyBBc3luY1F1ZXVlIHtcbiAgICB3cml0ZSh2YWx1ZSkge1xuICAgICAgICBpZiAoKHZhbHVlID0gdG9VaW50OEFycmF5KHZhbHVlKSkuYnl0ZUxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBzdXBlci53cml0ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9TdHJpbmcoc3luYyA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBzeW5jXG4gICAgICAgICAgICA/IGRlY29kZVV0ZjgodGhpcy50b1VpbnQ4QXJyYXkodHJ1ZSkpXG4gICAgICAgICAgICA6IHRoaXMudG9VaW50OEFycmF5KGZhbHNlKS50aGVuKGRlY29kZVV0ZjgpO1xuICAgIH1cbiAgICB0b1VpbnQ4QXJyYXkoc3luYyA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBzeW5jID8gam9pblVpbnQ4QXJyYXlzKHRoaXMuX3ZhbHVlcylbMF0gOiAoKCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgICAgICBjb25zdCBidWZmZXJzID0gW107XG4gICAgICAgICAgICBsZXQgYnl0ZUxlbmd0aCA9IDA7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9iID0gX19hc3luY1ZhbHVlcyh0aGlzKSwgX2M7IF9jID0geWllbGQgX2IubmV4dCgpLCAhX2MuZG9uZTspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVycy5wdXNoKGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgYnl0ZUxlbmd0aCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgeWllbGQgX2EuY2FsbChfYik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBqb2luVWludDhBcnJheXMoYnVmZmVycywgYnl0ZUxlbmd0aClbMF07XG4gICAgICAgIH0pKSgpO1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgQnl0ZVN0cmVhbSB7XG4gICAgY29uc3RydWN0b3Ioc291cmNlKSB7XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlID0gbmV3IEJ5dGVTdHJlYW1Tb3VyY2Uoc3RyZWFtQWRhcHRlcnMuZnJvbUl0ZXJhYmxlKHNvdXJjZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIG5leHQodmFsdWUpIHsgcmV0dXJuIHRoaXMuc291cmNlLm5leHQodmFsdWUpOyB9XG4gICAgdGhyb3codmFsdWUpIHsgcmV0dXJuIHRoaXMuc291cmNlLnRocm93KHZhbHVlKTsgfVxuICAgIHJldHVybih2YWx1ZSkgeyByZXR1cm4gdGhpcy5zb3VyY2UucmV0dXJuKHZhbHVlKTsgfVxuICAgIHBlZWsoc2l6ZSkgeyByZXR1cm4gdGhpcy5zb3VyY2UucGVlayhzaXplKTsgfVxuICAgIHJlYWQoc2l6ZSkgeyByZXR1cm4gdGhpcy5zb3VyY2UucmVhZChzaXplKTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBBc3luY0J5dGVTdHJlYW0ge1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSkge1xuICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgQXN5bmNCeXRlU3RyZWFtKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZS5zb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgQXN5bmNCeXRlUXVldWUpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlID0gbmV3IEFzeW5jQnl0ZVN0cmVhbVNvdXJjZShzdHJlYW1BZGFwdGVycy5mcm9tQXN5bmNJdGVyYWJsZShzb3VyY2UpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1JlYWRhYmxlTm9kZVN0cmVhbShzb3VyY2UpKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IG5ldyBBc3luY0J5dGVTdHJlYW1Tb3VyY2Uoc3RyZWFtQWRhcHRlcnMuZnJvbU5vZGVTdHJlYW0oc291cmNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNSZWFkYWJsZURPTVN0cmVhbShzb3VyY2UpKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IG5ldyBBc3luY0J5dGVTdHJlYW1Tb3VyY2Uoc3RyZWFtQWRhcHRlcnMuZnJvbURPTVN0cmVhbShzb3VyY2UpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0ZldGNoUmVzcG9uc2Uoc291cmNlKSkge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBuZXcgQXN5bmNCeXRlU3RyZWFtU291cmNlKHN0cmVhbUFkYXB0ZXJzLmZyb21ET01TdHJlYW0oc291cmNlLmJvZHkpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0l0ZXJhYmxlKHNvdXJjZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlID0gbmV3IEFzeW5jQnl0ZVN0cmVhbVNvdXJjZShzdHJlYW1BZGFwdGVycy5mcm9tSXRlcmFibGUoc291cmNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQcm9taXNlKHNvdXJjZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlID0gbmV3IEFzeW5jQnl0ZVN0cmVhbVNvdXJjZShzdHJlYW1BZGFwdGVycy5mcm9tQXN5bmNJdGVyYWJsZShzb3VyY2UpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0FzeW5jSXRlcmFibGUoc291cmNlKSkge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBuZXcgQXN5bmNCeXRlU3RyZWFtU291cmNlKHN0cmVhbUFkYXB0ZXJzLmZyb21Bc3luY0l0ZXJhYmxlKHNvdXJjZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7IHJldHVybiB0aGlzOyB9XG4gICAgbmV4dCh2YWx1ZSkgeyByZXR1cm4gdGhpcy5zb3VyY2UubmV4dCh2YWx1ZSk7IH1cbiAgICB0aHJvdyh2YWx1ZSkgeyByZXR1cm4gdGhpcy5zb3VyY2UudGhyb3codmFsdWUpOyB9XG4gICAgcmV0dXJuKHZhbHVlKSB7IHJldHVybiB0aGlzLnNvdXJjZS5yZXR1cm4odmFsdWUpOyB9XG4gICAgZ2V0IGNsb3NlZCgpIHsgcmV0dXJuIHRoaXMuc291cmNlLmNsb3NlZDsgfVxuICAgIGNhbmNlbChyZWFzb24pIHsgcmV0dXJuIHRoaXMuc291cmNlLmNhbmNlbChyZWFzb24pOyB9XG4gICAgcGVlayhzaXplKSB7IHJldHVybiB0aGlzLnNvdXJjZS5wZWVrKHNpemUpOyB9XG4gICAgcmVhZChzaXplKSB7IHJldHVybiB0aGlzLnNvdXJjZS5yZWFkKHNpemUpOyB9XG59XG4vKiogQGlnbm9yZSAqL1xuY2xhc3MgQnl0ZVN0cmVhbVNvdXJjZSB7XG4gICAgY29uc3RydWN0b3Ioc291cmNlKSB7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIH1cbiAgICBjYW5jZWwocmVhc29uKSB7IHRoaXMucmV0dXJuKHJlYXNvbik7IH1cbiAgICBwZWVrKHNpemUpIHsgcmV0dXJuIHRoaXMubmV4dChzaXplLCAncGVlaycpLnZhbHVlOyB9XG4gICAgcmVhZChzaXplKSB7IHJldHVybiB0aGlzLm5leHQoc2l6ZSwgJ3JlYWQnKS52YWx1ZTsgfVxuICAgIG5leHQoc2l6ZSwgY21kID0gJ3JlYWQnKSB7IHJldHVybiB0aGlzLnNvdXJjZS5uZXh0KHsgY21kLCBzaXplIH0pOyB9XG4gICAgdGhyb3codmFsdWUpIHsgcmV0dXJuIE9iamVjdC5jcmVhdGUoKHRoaXMuc291cmNlLnRocm93ICYmIHRoaXMuc291cmNlLnRocm93KHZhbHVlKSkgfHwgSVRFUkFUT1JfRE9ORSk7IH1cbiAgICByZXR1cm4odmFsdWUpIHsgcmV0dXJuIE9iamVjdC5jcmVhdGUoKHRoaXMuc291cmNlLnJldHVybiAmJiB0aGlzLnNvdXJjZS5yZXR1cm4odmFsdWUpKSB8fCBJVEVSQVRPUl9ET05FKTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmNsYXNzIEFzeW5jQnl0ZVN0cmVhbVNvdXJjZSB7XG4gICAgY29uc3RydWN0b3Ioc291cmNlKSB7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLl9jbG9zZWRQcm9taXNlID0gbmV3IFByb21pc2UoKHIpID0+IHRoaXMuX2Nsb3NlZFByb21pc2VSZXNvbHZlID0gcik7XG4gICAgfVxuICAgIGNhbmNlbChyZWFzb24pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsgeWllbGQgdGhpcy5yZXR1cm4ocmVhc29uKTsgfSk7XG4gICAgfVxuICAgIGdldCBjbG9zZWQoKSB7IHJldHVybiB0aGlzLl9jbG9zZWRQcm9taXNlOyB9XG4gICAgcmVhZChzaXplKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7IHJldHVybiAoeWllbGQgdGhpcy5uZXh0KHNpemUsICdyZWFkJykpLnZhbHVlOyB9KTtcbiAgICB9XG4gICAgcGVlayhzaXplKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7IHJldHVybiAoeWllbGQgdGhpcy5uZXh0KHNpemUsICdwZWVrJykpLnZhbHVlOyB9KTtcbiAgICB9XG4gICAgbmV4dChzaXplLCBjbWQgPSAncmVhZCcpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsgcmV0dXJuICh5aWVsZCB0aGlzLnNvdXJjZS5uZXh0KHsgY21kLCBzaXplIH0pKTsgfSk7XG4gICAgfVxuICAgIHRocm93KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSAodGhpcy5zb3VyY2UudGhyb3cgJiYgKHlpZWxkIHRoaXMuc291cmNlLnRocm93KHZhbHVlKSkpIHx8IElURVJBVE9SX0RPTkU7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZWRQcm9taXNlUmVzb2x2ZSAmJiB0aGlzLl9jbG9zZWRQcm9taXNlUmVzb2x2ZSgpO1xuICAgICAgICAgICAgdGhpcy5fY2xvc2VkUHJvbWlzZVJlc29sdmUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShyZXN1bHQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSAodGhpcy5zb3VyY2UucmV0dXJuICYmICh5aWVsZCB0aGlzLnNvdXJjZS5yZXR1cm4odmFsdWUpKSkgfHwgSVRFUkFUT1JfRE9ORTtcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlZFByb21pc2VSZXNvbHZlICYmIHRoaXMuX2Nsb3NlZFByb21pc2VSZXNvbHZlKCk7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZWRQcm9taXNlUmVzb2x2ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHJlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyZWFtLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgX19hd2FpdGVyIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBNZXNzYWdlSGVhZGVyIH0gZnJvbSAnLi4vZW51bS5tanMnO1xuaW1wb3J0IHsgQnl0ZUJ1ZmZlciB9IGZyb20gJ2ZsYXRidWZmZXJzJztcbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICcuL21ldGFkYXRhL21lc3NhZ2UubWpzJztcbmltcG9ydCB7IGlzRmlsZUhhbmRsZSB9IGZyb20gJy4uL3V0aWwvY29tcGF0Lm1qcyc7XG5pbXBvcnQgeyBBc3luY1JhbmRvbUFjY2Vzc0ZpbGUgfSBmcm9tICcuLi9pby9maWxlLm1qcyc7XG5pbXBvcnQgeyB0b1VpbnQ4QXJyYXkgfSBmcm9tICcuLi91dGlsL2J1ZmZlci5tanMnO1xuaW1wb3J0IHsgQnl0ZVN0cmVhbSwgQXN5bmNCeXRlU3RyZWFtIH0gZnJvbSAnLi4vaW8vc3RyZWFtLm1qcyc7XG5pbXBvcnQgeyBBcnJvd0pTT04sIElURVJBVE9SX0RPTkUgfSBmcm9tICcuLi9pby9pbnRlcmZhY2VzLm1qcyc7XG4vKiogQGlnbm9yZSAqLyBjb25zdCBpbnZhbGlkTWVzc2FnZVR5cGUgPSAodHlwZSkgPT4gYEV4cGVjdGVkICR7TWVzc2FnZUhlYWRlclt0eXBlXX0gTWVzc2FnZSBpbiBzdHJlYW0sIGJ1dCB3YXMgbnVsbCBvciBsZW5ndGggMC5gO1xuLyoqIEBpZ25vcmUgKi8gY29uc3QgbnVsbE1lc3NhZ2UgPSAodHlwZSkgPT4gYEhlYWRlciBwb2ludGVyIG9mIGZsYXRidWZmZXItZW5jb2RlZCAke01lc3NhZ2VIZWFkZXJbdHlwZV19IE1lc3NhZ2UgaXMgbnVsbCBvciBsZW5ndGggMC5gO1xuLyoqIEBpZ25vcmUgKi8gY29uc3QgaW52YWxpZE1lc3NhZ2VNZXRhZGF0YSA9IChleHBlY3RlZCwgYWN0dWFsKSA9PiBgRXhwZWN0ZWQgdG8gcmVhZCAke2V4cGVjdGVkfSBtZXRhZGF0YSBieXRlcywgYnV0IG9ubHkgcmVhZCAke2FjdHVhbH0uYDtcbi8qKiBAaWdub3JlICovIGNvbnN0IGludmFsaWRNZXNzYWdlQm9keUxlbmd0aCA9IChleHBlY3RlZCwgYWN0dWFsKSA9PiBgRXhwZWN0ZWQgdG8gcmVhZCAke2V4cGVjdGVkfSBieXRlcyBmb3IgbWVzc2FnZSBib2R5LCBidXQgb25seSByZWFkICR7YWN0dWFsfS5gO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2UgaW5zdGFuY2VvZiBCeXRlU3RyZWFtID8gc291cmNlIDogbmV3IEJ5dGVTdHJlYW0oc291cmNlKTtcbiAgICB9XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7IHJldHVybiB0aGlzOyB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgbGV0IHI7XG4gICAgICAgIGlmICgociA9IHRoaXMucmVhZE1ldGFkYXRhTGVuZ3RoKCkpLmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBJVEVSQVRPUl9ET05FO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFSUk9XLTYzMTM6IElmIHRoZSBmaXJzdCA0IGJ5dGVzIGFyZSBjb250aW51YXRpb24gaW5kaWNhdG9yICgtMSksIHJlYWRcbiAgICAgICAgLy8gdGhlIG5leHQgNCBmb3IgdGhlIDMyLWJpdCBtZXRhZGF0YSBsZW5ndGguIE90aGVyd2lzZSwgYXNzdW1lIHRoaXMgaXMgYVxuICAgICAgICAvLyBwcmUtdjAuMTUgbWVzc2FnZSwgd2hlcmUgdGhlIGZpcnN0IDQgYnl0ZXMgYXJlIHRoZSBtZXRhZGF0YSBsZW5ndGguXG4gICAgICAgIGlmICgoci52YWx1ZSA9PT0gLTEpICYmXG4gICAgICAgICAgICAociA9IHRoaXMucmVhZE1ldGFkYXRhTGVuZ3RoKCkpLmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBJVEVSQVRPUl9ET05FO1xuICAgICAgICB9XG4gICAgICAgIGlmICgociA9IHRoaXMucmVhZE1ldGFkYXRhKHIudmFsdWUpKS5kb25lKSB7XG4gICAgICAgICAgICByZXR1cm4gSVRFUkFUT1JfRE9ORTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcjtcbiAgICB9XG4gICAgdGhyb3codmFsdWUpIHsgcmV0dXJuIHRoaXMuc291cmNlLnRocm93KHZhbHVlKTsgfVxuICAgIHJldHVybih2YWx1ZSkgeyByZXR1cm4gdGhpcy5zb3VyY2UucmV0dXJuKHZhbHVlKTsgfVxuICAgIHJlYWRNZXNzYWdlKHR5cGUpIHtcbiAgICAgICAgbGV0IHI7XG4gICAgICAgIGlmICgociA9IHRoaXMubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHR5cGUgIT0gbnVsbCkgJiYgci52YWx1ZS5oZWFkZXJUeXBlICE9PSB0eXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW52YWxpZE1lc3NhZ2VUeXBlKHR5cGUpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gci52YWx1ZTtcbiAgICB9XG4gICAgcmVhZE1lc3NhZ2VCb2R5KGJvZHlMZW5ndGgpIHtcbiAgICAgICAgaWYgKGJvZHlMZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZiA9IHRvVWludDhBcnJheSh0aGlzLnNvdXJjZS5yZWFkKGJvZHlMZW5ndGgpKTtcbiAgICAgICAgaWYgKGJ1Zi5ieXRlTGVuZ3RoIDwgYm9keUxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGludmFsaWRNZXNzYWdlQm9keUxlbmd0aChib2R5TGVuZ3RoLCBidWYuYnl0ZUxlbmd0aCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDEuIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gZnMuUmVhZFN0cmVhbSdzIGludGVybmFsIEJ1ZmZlciBwb29saW5nLCBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvMjQ4MTdcbiAgICAgICAgLy8gMi4gV29yayBhcm91bmQgaHR0cHM6Ly9naXRodWIuY29tL3doYXR3Zy9zdHJlYW1zL2Jsb2IvMGViZTRiMDQyZTQ2N2Q5ODc2ZDgwYWUwNDVkZTM4NDMwOTJhZDc5Ny9yZWZlcmVuY2UtaW1wbGVtZW50YXRpb24vbGliL2hlbHBlcnMuanMjTDEyNlxuICAgICAgICByZXR1cm4gLyogMS4gKi8gKGJ1Zi5ieXRlT2Zmc2V0ICUgOCA9PT0gMCkgJiZcbiAgICAgICAgICAgIC8qIDIuICovIChidWYuYnl0ZU9mZnNldCArIGJ1Zi5ieXRlTGVuZ3RoKSA8PSBidWYuYnVmZmVyLmJ5dGVMZW5ndGggPyBidWYgOiBidWYuc2xpY2UoKTtcbiAgICB9XG4gICAgcmVhZFNjaGVtYSh0aHJvd0lmTnVsbCA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBNZXNzYWdlSGVhZGVyLlNjaGVtYTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMucmVhZE1lc3NhZ2UodHlwZSk7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IG1lc3NhZ2UgPT09IG51bGwgfHwgbWVzc2FnZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWVzc2FnZS5oZWFkZXIoKTtcbiAgICAgICAgaWYgKHRocm93SWZOdWxsICYmICFzY2hlbWEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihudWxsTWVzc2FnZSh0eXBlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNjaGVtYTtcbiAgICB9XG4gICAgcmVhZE1ldGFkYXRhTGVuZ3RoKCkge1xuICAgICAgICBjb25zdCBidWYgPSB0aGlzLnNvdXJjZS5yZWFkKFBBRERJTkcpO1xuICAgICAgICBjb25zdCBiYiA9IGJ1ZiAmJiBuZXcgQnl0ZUJ1ZmZlcihidWYpO1xuICAgICAgICBjb25zdCBsZW4gPSAoYmIgPT09IG51bGwgfHwgYmIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJiLnJlYWRJbnQzMigwKSkgfHwgMDtcbiAgICAgICAgcmV0dXJuIHsgZG9uZTogbGVuID09PSAwLCB2YWx1ZTogbGVuIH07XG4gICAgfVxuICAgIHJlYWRNZXRhZGF0YShtZXRhZGF0YUxlbmd0aCkge1xuICAgICAgICBjb25zdCBidWYgPSB0aGlzLnNvdXJjZS5yZWFkKG1ldGFkYXRhTGVuZ3RoKTtcbiAgICAgICAgaWYgKCFidWYpIHtcbiAgICAgICAgICAgIHJldHVybiBJVEVSQVRPUl9ET05FO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidWYuYnl0ZUxlbmd0aCA8IG1ldGFkYXRhTGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW52YWxpZE1lc3NhZ2VNZXRhZGF0YShtZXRhZGF0YUxlbmd0aCwgYnVmLmJ5dGVMZW5ndGgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IE1lc3NhZ2UuZGVjb2RlKGJ1ZikgfTtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEFzeW5jTWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3Ioc291cmNlLCBieXRlTGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlIGluc3RhbmNlb2YgQXN5bmNCeXRlU3RyZWFtID8gc291cmNlXG4gICAgICAgICAgICA6IGlzRmlsZUhhbmRsZShzb3VyY2UpXG4gICAgICAgICAgICAgICAgPyBuZXcgQXN5bmNSYW5kb21BY2Nlc3NGaWxlKHNvdXJjZSwgYnl0ZUxlbmd0aClcbiAgICAgICAgICAgICAgICA6IG5ldyBBc3luY0J5dGVTdHJlYW0oc291cmNlKTtcbiAgICB9XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICBuZXh0KCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgbGV0IHI7XG4gICAgICAgICAgICBpZiAoKHIgPSB5aWVsZCB0aGlzLnJlYWRNZXRhZGF0YUxlbmd0aCgpKS5kb25lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIElURVJBVE9SX0RPTkU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBUlJPVy02MzEzOiBJZiB0aGUgZmlyc3QgNCBieXRlcyBhcmUgY29udGludWF0aW9uIGluZGljYXRvciAoLTEpLCByZWFkXG4gICAgICAgICAgICAvLyB0aGUgbmV4dCA0IGZvciB0aGUgMzItYml0IG1ldGFkYXRhIGxlbmd0aC4gT3RoZXJ3aXNlLCBhc3N1bWUgdGhpcyBpcyBhXG4gICAgICAgICAgICAvLyBwcmUtdjAuMTUgbWVzc2FnZSwgd2hlcmUgdGhlIGZpcnN0IDQgYnl0ZXMgYXJlIHRoZSBtZXRhZGF0YSBsZW5ndGguXG4gICAgICAgICAgICBpZiAoKHIudmFsdWUgPT09IC0xKSAmJlxuICAgICAgICAgICAgICAgIChyID0geWllbGQgdGhpcy5yZWFkTWV0YWRhdGFMZW5ndGgoKSkuZG9uZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBJVEVSQVRPUl9ET05FO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChyID0geWllbGQgdGhpcy5yZWFkTWV0YWRhdGEoci52YWx1ZSkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSVRFUkFUT1JfRE9ORTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgdGhyb3codmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsgcmV0dXJuIHlpZWxkIHRoaXMuc291cmNlLnRocm93KHZhbHVlKTsgfSk7XG4gICAgfVxuICAgIHJldHVybih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgeyByZXR1cm4geWllbGQgdGhpcy5zb3VyY2UucmV0dXJuKHZhbHVlKTsgfSk7XG4gICAgfVxuICAgIHJlYWRNZXNzYWdlKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGxldCByO1xuICAgICAgICAgICAgaWYgKChyID0geWllbGQgdGhpcy5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodHlwZSAhPSBudWxsKSAmJiByLnZhbHVlLmhlYWRlclR5cGUgIT09IHR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW52YWxpZE1lc3NhZ2VUeXBlKHR5cGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByLnZhbHVlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVhZE1lc3NhZ2VCb2R5KGJvZHlMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmIChib2R5TGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBidWYgPSB0b1VpbnQ4QXJyYXkoeWllbGQgdGhpcy5zb3VyY2UucmVhZChib2R5TGVuZ3RoKSk7XG4gICAgICAgICAgICBpZiAoYnVmLmJ5dGVMZW5ndGggPCBib2R5TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGludmFsaWRNZXNzYWdlQm9keUxlbmd0aChib2R5TGVuZ3RoLCBidWYuYnl0ZUxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMS4gV29yayBhcm91bmQgYnVncyBpbiBmcy5SZWFkU3RyZWFtJ3MgaW50ZXJuYWwgQnVmZmVyIHBvb2xpbmcsIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8yNDgxN1xuICAgICAgICAgICAgLy8gMi4gV29yayBhcm91bmQgaHR0cHM6Ly9naXRodWIuY29tL3doYXR3Zy9zdHJlYW1zL2Jsb2IvMGViZTRiMDQyZTQ2N2Q5ODc2ZDgwYWUwNDVkZTM4NDMwOTJhZDc5Ny9yZWZlcmVuY2UtaW1wbGVtZW50YXRpb24vbGliL2hlbHBlcnMuanMjTDEyNlxuICAgICAgICAgICAgcmV0dXJuIC8qIDEuICovIChidWYuYnl0ZU9mZnNldCAlIDggPT09IDApICYmXG4gICAgICAgICAgICAgICAgLyogMi4gKi8gKGJ1Zi5ieXRlT2Zmc2V0ICsgYnVmLmJ5dGVMZW5ndGgpIDw9IGJ1Zi5idWZmZXIuYnl0ZUxlbmd0aCA/IGJ1ZiA6IGJ1Zi5zbGljZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVhZFNjaGVtYSh0aHJvd0lmTnVsbCA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gTWVzc2FnZUhlYWRlci5TY2hlbWE7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0geWllbGQgdGhpcy5yZWFkTWVzc2FnZSh0eXBlKTtcbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IG1lc3NhZ2UgPT09IG51bGwgfHwgbWVzc2FnZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWVzc2FnZS5oZWFkZXIoKTtcbiAgICAgICAgICAgIGlmICh0aHJvd0lmTnVsbCAmJiAhc2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG51bGxNZXNzYWdlKHR5cGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzY2hlbWE7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWFkTWV0YWRhdGFMZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBidWYgPSB5aWVsZCB0aGlzLnNvdXJjZS5yZWFkKFBBRERJTkcpO1xuICAgICAgICAgICAgY29uc3QgYmIgPSBidWYgJiYgbmV3IEJ5dGVCdWZmZXIoYnVmKTtcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IChiYiA9PT0gbnVsbCB8fCBiYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogYmIucmVhZEludDMyKDApKSB8fCAwO1xuICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogbGVuID09PSAwLCB2YWx1ZTogbGVuIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWFkTWV0YWRhdGEobWV0YWRhdGFMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZiA9IHlpZWxkIHRoaXMuc291cmNlLnJlYWQobWV0YWRhdGFMZW5ndGgpO1xuICAgICAgICAgICAgaWYgKCFidWYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSVRFUkFUT1JfRE9ORTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChidWYuYnl0ZUxlbmd0aCA8IG1ldGFkYXRhTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGludmFsaWRNZXNzYWdlTWV0YWRhdGEobWV0YWRhdGFMZW5ndGgsIGJ1Zi5ieXRlTGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IE1lc3NhZ2UuZGVjb2RlKGJ1ZikgfTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBKU09OTWVzc2FnZVJlYWRlciBleHRlbmRzIE1lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSkge1xuICAgICAgICBzdXBlcihuZXcgVWludDhBcnJheSgwKSk7XG4gICAgICAgIHRoaXMuX3NjaGVtYSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9ib2R5ID0gW107XG4gICAgICAgIHRoaXMuX2JhdGNoSW5kZXggPSAwO1xuICAgICAgICB0aGlzLl9kaWN0aW9uYXJ5SW5kZXggPSAwO1xuICAgICAgICB0aGlzLl9qc29uID0gc291cmNlIGluc3RhbmNlb2YgQXJyb3dKU09OID8gc291cmNlIDogbmV3IEFycm93SlNPTihzb3VyY2UpO1xuICAgIH1cbiAgICBuZXh0KCkge1xuICAgICAgICBjb25zdCB7IF9qc29uIH0gPSB0aGlzO1xuICAgICAgICBpZiAoIXRoaXMuX3NjaGVtYSkge1xuICAgICAgICAgICAgdGhpcy5fc2NoZW1hID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBNZXNzYWdlLmZyb21KU09OKF9qc29uLnNjaGVtYSwgTWVzc2FnZUhlYWRlci5TY2hlbWEpO1xuICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBtZXNzYWdlIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2RpY3Rpb25hcnlJbmRleCA8IF9qc29uLmRpY3Rpb25hcmllcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhdGNoID0gX2pzb24uZGljdGlvbmFyaWVzW3RoaXMuX2RpY3Rpb25hcnlJbmRleCsrXTtcbiAgICAgICAgICAgIHRoaXMuX2JvZHkgPSBiYXRjaFsnZGF0YSddWydjb2x1bW5zJ107XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gTWVzc2FnZS5mcm9tSlNPTihiYXRjaCwgTWVzc2FnZUhlYWRlci5EaWN0aW9uYXJ5QmF0Y2gpO1xuICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBtZXNzYWdlIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2JhdGNoSW5kZXggPCBfanNvbi5iYXRjaGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgYmF0Y2ggPSBfanNvbi5iYXRjaGVzW3RoaXMuX2JhdGNoSW5kZXgrK107XG4gICAgICAgICAgICB0aGlzLl9ib2R5ID0gYmF0Y2hbJ2NvbHVtbnMnXTtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBNZXNzYWdlLmZyb21KU09OKGJhdGNoLCBNZXNzYWdlSGVhZGVyLlJlY29yZEJhdGNoKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogbWVzc2FnZSB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2JvZHkgPSBbXTtcbiAgICAgICAgcmV0dXJuIElURVJBVE9SX0RPTkU7XG4gICAgfVxuICAgIHJlYWRNZXNzYWdlQm9keShfYm9keUxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmxhdHRlbkRhdGFTb3VyY2VzKHRoaXMuX2JvZHkpO1xuICAgICAgICBmdW5jdGlvbiBmbGF0dGVuRGF0YVNvdXJjZXMoeHMpIHtcbiAgICAgICAgICAgIHJldHVybiAoeHMgfHwgW10pLnJlZHVjZSgoYnVmZmVycywgY29sdW1uKSA9PiBbXG4gICAgICAgICAgICAgICAgLi4uYnVmZmVycyxcbiAgICAgICAgICAgICAgICAuLi4oY29sdW1uWydWQUxJRElUWSddICYmIFtjb2x1bW5bJ1ZBTElESVRZJ11dIHx8IFtdKSxcbiAgICAgICAgICAgICAgICAuLi4oY29sdW1uWydUWVBFJ10gJiYgW2NvbHVtblsnVFlQRSddXSB8fCBbXSksXG4gICAgICAgICAgICAgICAgLi4uKGNvbHVtblsnT0ZGU0VUJ10gJiYgW2NvbHVtblsnT0ZGU0VUJ11dIHx8IFtdKSxcbiAgICAgICAgICAgICAgICAuLi4oY29sdW1uWydEQVRBJ10gJiYgW2NvbHVtblsnREFUQSddXSB8fCBbXSksXG4gICAgICAgICAgICAgICAgLi4uZmxhdHRlbkRhdGFTb3VyY2VzKGNvbHVtblsnY2hpbGRyZW4nXSlcbiAgICAgICAgICAgIF0sIFtdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWFkTWVzc2FnZSh0eXBlKSB7XG4gICAgICAgIGxldCByO1xuICAgICAgICBpZiAoKHIgPSB0aGlzLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0eXBlICE9IG51bGwpICYmIHIudmFsdWUuaGVhZGVyVHlwZSAhPT0gdHlwZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGludmFsaWRNZXNzYWdlVHlwZSh0eXBlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHIudmFsdWU7XG4gICAgfVxuICAgIHJlYWRTY2hlbWEoKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBNZXNzYWdlSGVhZGVyLlNjaGVtYTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMucmVhZE1lc3NhZ2UodHlwZSk7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IG1lc3NhZ2UgPT09IG51bGwgfHwgbWVzc2FnZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWVzc2FnZS5oZWFkZXIoKTtcbiAgICAgICAgaWYgKCFtZXNzYWdlIHx8ICFzY2hlbWEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihudWxsTWVzc2FnZSh0eXBlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNjaGVtYTtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IFBBRERJTkcgPSA0O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBNQUdJQ19TVFIgPSAnQVJST1cxJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgTUFHSUMgPSBuZXcgVWludDhBcnJheShNQUdJQ19TVFIubGVuZ3RoKTtcbmZvciAobGV0IGkgPSAwOyBpIDwgTUFHSUNfU1RSLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgTUFHSUNbaV0gPSBNQUdJQ19TVFIuY29kZVBvaW50QXQoaSk7XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRm9yTWFnaWNBcnJvd1N0cmluZyhidWZmZXIsIGluZGV4ID0gMCkge1xuICAgIGZvciAobGV0IGkgPSAtMSwgbiA9IE1BR0lDLmxlbmd0aDsgKytpIDwgbjspIHtcbiAgICAgICAgaWYgKE1BR0lDW2ldICE9PSBidWZmZXJbaW5kZXggKyBpXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBtYWdpY0xlbmd0aCA9IE1BR0lDLmxlbmd0aDtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgbWFnaWNBbmRQYWRkaW5nID0gbWFnaWNMZW5ndGggKyBQQURESU5HO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBtYWdpY1gyQW5kUGFkZGluZyA9IG1hZ2ljTGVuZ3RoICogMiArIFBBRERJTkc7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lc3NhZ2UubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24gKi9cbmltcG9ydCB7IEJsb2NrIGFzIF9CbG9jayB9IGZyb20gJy4uLy4uL2ZiL2Jsb2NrLm1qcyc7XG5pbXBvcnQgeyBGb290ZXIgYXMgX0Zvb3RlciB9IGZyb20gJy4uLy4uL2ZiL2Zvb3Rlci5tanMnO1xuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xudmFyIExvbmcgPSBmbGF0YnVmZmVycy5Mb25nO1xudmFyIEJ1aWxkZXIgPSBmbGF0YnVmZmVycy5CdWlsZGVyO1xudmFyIEJ5dGVCdWZmZXIgPSBmbGF0YnVmZmVycy5CeXRlQnVmZmVyO1xuaW1wb3J0IHsgU2NoZW1hIH0gZnJvbSAnLi4vLi4vc2NoZW1hLm1qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YVZlcnNpb24gfSBmcm9tICcuLi8uLi9lbnVtLm1qcyc7XG5pbXBvcnQgeyB0b1VpbnQ4QXJyYXkgfSBmcm9tICcuLi8uLi91dGlsL2J1ZmZlci5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmNsYXNzIEZvb3Rlcl8ge1xuICAgIGNvbnN0cnVjdG9yKHNjaGVtYSwgdmVyc2lvbiA9IE1ldGFkYXRhVmVyc2lvbi5WNCwgcmVjb3JkQmF0Y2hlcywgZGljdGlvbmFyeUJhdGNoZXMpIHtcbiAgICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHJlY29yZEJhdGNoZXMgJiYgKHRoaXMuX3JlY29yZEJhdGNoZXMgPSByZWNvcmRCYXRjaGVzKTtcbiAgICAgICAgZGljdGlvbmFyeUJhdGNoZXMgJiYgKHRoaXMuX2RpY3Rpb25hcnlCYXRjaGVzID0gZGljdGlvbmFyeUJhdGNoZXMpO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZGVjb2RlKGJ1Zikge1xuICAgICAgICBidWYgPSBuZXcgQnl0ZUJ1ZmZlcih0b1VpbnQ4QXJyYXkoYnVmKSk7XG4gICAgICAgIGNvbnN0IGZvb3RlciA9IF9Gb290ZXIuZ2V0Um9vdEFzRm9vdGVyKGJ1Zik7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IFNjaGVtYS5kZWNvZGUoZm9vdGVyLnNjaGVtYSgpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBPZmZIZWFwRm9vdGVyKHNjaGVtYSwgZm9vdGVyKTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGVuY29kZShmb290ZXIpIHtcbiAgICAgICAgY29uc3QgYiA9IG5ldyBCdWlsZGVyKCk7XG4gICAgICAgIGNvbnN0IHNjaGVtYU9mZnNldCA9IFNjaGVtYS5lbmNvZGUoYiwgZm9vdGVyLnNjaGVtYSk7XG4gICAgICAgIF9Gb290ZXIuc3RhcnRSZWNvcmRCYXRjaGVzVmVjdG9yKGIsIGZvb3Rlci5udW1SZWNvcmRCYXRjaGVzKTtcbiAgICAgICAgZm9yIChjb25zdCByYiBvZiBbLi4uZm9vdGVyLnJlY29yZEJhdGNoZXMoKV0uc2xpY2UoKS5yZXZlcnNlKCkpIHtcbiAgICAgICAgICAgIEZpbGVCbG9jay5lbmNvZGUoYiwgcmIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlY29yZEJhdGNoZXNPZmZzZXQgPSBiLmVuZFZlY3RvcigpO1xuICAgICAgICBfRm9vdGVyLnN0YXJ0RGljdGlvbmFyaWVzVmVjdG9yKGIsIGZvb3Rlci5udW1EaWN0aW9uYXJpZXMpO1xuICAgICAgICBmb3IgKGNvbnN0IGRiIG9mIFsuLi5mb290ZXIuZGljdGlvbmFyeUJhdGNoZXMoKV0uc2xpY2UoKS5yZXZlcnNlKCkpIHtcbiAgICAgICAgICAgIEZpbGVCbG9jay5lbmNvZGUoYiwgZGIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpY3Rpb25hcnlCYXRjaGVzT2Zmc2V0ID0gYi5lbmRWZWN0b3IoKTtcbiAgICAgICAgX0Zvb3Rlci5zdGFydEZvb3RlcihiKTtcbiAgICAgICAgX0Zvb3Rlci5hZGRTY2hlbWEoYiwgc2NoZW1hT2Zmc2V0KTtcbiAgICAgICAgX0Zvb3Rlci5hZGRWZXJzaW9uKGIsIE1ldGFkYXRhVmVyc2lvbi5WNCk7XG4gICAgICAgIF9Gb290ZXIuYWRkUmVjb3JkQmF0Y2hlcyhiLCByZWNvcmRCYXRjaGVzT2Zmc2V0KTtcbiAgICAgICAgX0Zvb3Rlci5hZGREaWN0aW9uYXJpZXMoYiwgZGljdGlvbmFyeUJhdGNoZXNPZmZzZXQpO1xuICAgICAgICBfRm9vdGVyLmZpbmlzaEZvb3RlckJ1ZmZlcihiLCBfRm9vdGVyLmVuZEZvb3RlcihiKSk7XG4gICAgICAgIHJldHVybiBiLmFzVWludDhBcnJheSgpO1xuICAgIH1cbiAgICBnZXQgbnVtUmVjb3JkQmF0Y2hlcygpIHsgcmV0dXJuIHRoaXMuX3JlY29yZEJhdGNoZXMubGVuZ3RoOyB9XG4gICAgZ2V0IG51bURpY3Rpb25hcmllcygpIHsgcmV0dXJuIHRoaXMuX2RpY3Rpb25hcnlCYXRjaGVzLmxlbmd0aDsgfVxuICAgICpyZWNvcmRCYXRjaGVzKCkge1xuICAgICAgICBmb3IgKGxldCBibG9jaywgaSA9IC0xLCBuID0gdGhpcy5udW1SZWNvcmRCYXRjaGVzOyArK2kgPCBuOykge1xuICAgICAgICAgICAgaWYgKGJsb2NrID0gdGhpcy5nZXRSZWNvcmRCYXRjaChpKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGJsb2NrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgICpkaWN0aW9uYXJ5QmF0Y2hlcygpIHtcbiAgICAgICAgZm9yIChsZXQgYmxvY2ssIGkgPSAtMSwgbiA9IHRoaXMubnVtRGljdGlvbmFyaWVzOyArK2kgPCBuOykge1xuICAgICAgICAgICAgaWYgKGJsb2NrID0gdGhpcy5nZXREaWN0aW9uYXJ5QmF0Y2goaSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBibG9jaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRSZWNvcmRCYXRjaChpbmRleCkge1xuICAgICAgICByZXR1cm4gaW5kZXggPj0gMFxuICAgICAgICAgICAgJiYgaW5kZXggPCB0aGlzLm51bVJlY29yZEJhdGNoZXNcbiAgICAgICAgICAgICYmIHRoaXMuX3JlY29yZEJhdGNoZXNbaW5kZXhdIHx8IG51bGw7XG4gICAgfVxuICAgIGdldERpY3Rpb25hcnlCYXRjaChpbmRleCkge1xuICAgICAgICByZXR1cm4gaW5kZXggPj0gMFxuICAgICAgICAgICAgJiYgaW5kZXggPCB0aGlzLm51bURpY3Rpb25hcmllc1xuICAgICAgICAgICAgJiYgdGhpcy5fZGljdGlvbmFyeUJhdGNoZXNbaW5kZXhdIHx8IG51bGw7XG4gICAgfVxufVxuZXhwb3J0IHsgRm9vdGVyXyBhcyBGb290ZXIgfTtcbi8qKiBAaWdub3JlICovXG5jbGFzcyBPZmZIZWFwRm9vdGVyIGV4dGVuZHMgRm9vdGVyXyB7XG4gICAgY29uc3RydWN0b3Ioc2NoZW1hLCBfZm9vdGVyKSB7XG4gICAgICAgIHN1cGVyKHNjaGVtYSwgX2Zvb3Rlci52ZXJzaW9uKCkpO1xuICAgICAgICB0aGlzLl9mb290ZXIgPSBfZm9vdGVyO1xuICAgIH1cbiAgICBnZXQgbnVtUmVjb3JkQmF0Y2hlcygpIHsgcmV0dXJuIHRoaXMuX2Zvb3Rlci5yZWNvcmRCYXRjaGVzTGVuZ3RoKCk7IH1cbiAgICBnZXQgbnVtRGljdGlvbmFyaWVzKCkgeyByZXR1cm4gdGhpcy5fZm9vdGVyLmRpY3Rpb25hcmllc0xlbmd0aCgpOyB9XG4gICAgZ2V0UmVjb3JkQmF0Y2goaW5kZXgpIHtcbiAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLm51bVJlY29yZEJhdGNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVCbG9jayA9IHRoaXMuX2Zvb3Rlci5yZWNvcmRCYXRjaGVzKGluZGV4KTtcbiAgICAgICAgICAgIGlmIChmaWxlQmxvY2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRmlsZUJsb2NrLmRlY29kZShmaWxlQmxvY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBnZXREaWN0aW9uYXJ5QmF0Y2goaW5kZXgpIHtcbiAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLm51bURpY3Rpb25hcmllcykge1xuICAgICAgICAgICAgY29uc3QgZmlsZUJsb2NrID0gdGhpcy5fZm9vdGVyLmRpY3Rpb25hcmllcyhpbmRleCk7XG4gICAgICAgICAgICBpZiAoZmlsZUJsb2NrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZpbGVCbG9jay5kZWNvZGUoZmlsZUJsb2NrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEZpbGVCbG9jayB7XG4gICAgY29uc3RydWN0b3IobWV0YURhdGFMZW5ndGgsIGJvZHlMZW5ndGgsIG9mZnNldCkge1xuICAgICAgICB0aGlzLm1ldGFEYXRhTGVuZ3RoID0gbWV0YURhdGFMZW5ndGg7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gdHlwZW9mIG9mZnNldCA9PT0gJ251bWJlcicgPyBvZmZzZXQgOiBvZmZzZXQubG93O1xuICAgICAgICB0aGlzLmJvZHlMZW5ndGggPSB0eXBlb2YgYm9keUxlbmd0aCA9PT0gJ251bWJlcicgPyBib2R5TGVuZ3RoIDogYm9keUxlbmd0aC5sb3c7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBkZWNvZGUoYmxvY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGaWxlQmxvY2soYmxvY2subWV0YURhdGFMZW5ndGgoKSwgYmxvY2suYm9keUxlbmd0aCgpLCBibG9jay5vZmZzZXQoKSk7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBlbmNvZGUoYiwgZmlsZUJsb2NrKSB7XG4gICAgICAgIGNvbnN0IHsgbWV0YURhdGFMZW5ndGggfSA9IGZpbGVCbG9jaztcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gbmV3IExvbmcoZmlsZUJsb2NrLm9mZnNldCwgMCk7XG4gICAgICAgIGNvbnN0IGJvZHlMZW5ndGggPSBuZXcgTG9uZyhmaWxlQmxvY2suYm9keUxlbmd0aCwgMCk7XG4gICAgICAgIHJldHVybiBfQmxvY2suY3JlYXRlQmxvY2soYiwgb2Zmc2V0LCBtZXRhRGF0YUxlbmd0aCwgYm9keUxlbmd0aCk7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWxlLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuLyogZXNsaW50LWRpc2FibGUgYnJhY2Utc3R5bGUgKi9cbmltcG9ydCB7IFNjaGVtYSwgRmllbGQgfSBmcm9tICcuLi8uLi9zY2hlbWEubWpzJztcbmltcG9ydCB7IERpY3Rpb25hcnksIFV0ZjgsIEJpbmFyeSwgRGVjaW1hbCwgRml4ZWRTaXplQmluYXJ5LCBMaXN0LCBGaXhlZFNpemVMaXN0LCBNYXBfLCBTdHJ1Y3QsIFVuaW9uLCBCb29sLCBOdWxsLCBJbnQsIEZsb2F0LCBEYXRlXywgVGltZSwgSW50ZXJ2YWwsIFRpbWVzdGFtcCwgSW50MzIsIH0gZnJvbSAnLi4vLi4vdHlwZS5tanMnO1xuaW1wb3J0IHsgRGljdGlvbmFyeUJhdGNoLCBSZWNvcmRCYXRjaCwgRmllbGROb2RlLCBCdWZmZXJSZWdpb24gfSBmcm9tICcuL21lc3NhZ2UubWpzJztcbmltcG9ydCB7IFRpbWVVbml0LCBQcmVjaXNpb24sIEludGVydmFsVW5pdCwgVW5pb25Nb2RlLCBEYXRlVW5pdCB9IGZyb20gJy4uLy4uL2VudW0ubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgZnVuY3Rpb24gc2NoZW1hRnJvbUpTT04oX3NjaGVtYSwgZGljdGlvbmFyaWVzID0gbmV3IE1hcCgpKSB7XG4gICAgcmV0dXJuIG5ldyBTY2hlbWEoc2NoZW1hRmllbGRzRnJvbUpTT04oX3NjaGVtYSwgZGljdGlvbmFyaWVzKSwgY3VzdG9tTWV0YWRhdGFGcm9tSlNPTihfc2NoZW1hWydjdXN0b21NZXRhZGF0YSddKSwgZGljdGlvbmFyaWVzKTtcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQmF0Y2hGcm9tSlNPTihiKSB7XG4gICAgcmV0dXJuIG5ldyBSZWNvcmRCYXRjaChiWydjb3VudCddLCBmaWVsZE5vZGVzRnJvbUpTT04oYlsnY29sdW1ucyddKSwgYnVmZmVyc0Zyb21KU09OKGJbJ2NvbHVtbnMnXSkpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWN0aW9uYXJ5QmF0Y2hGcm9tSlNPTihiKSB7XG4gICAgcmV0dXJuIG5ldyBEaWN0aW9uYXJ5QmF0Y2gocmVjb3JkQmF0Y2hGcm9tSlNPTihiWydkYXRhJ10pLCBiWydpZCddLCBiWydpc0RlbHRhJ10pO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIHNjaGVtYUZpZWxkc0Zyb21KU09OKF9zY2hlbWEsIGRpY3Rpb25hcmllcykge1xuICAgIHJldHVybiAoX3NjaGVtYVsnZmllbGRzJ10gfHwgW10pLmZpbHRlcihCb29sZWFuKS5tYXAoKGYpID0+IEZpZWxkLmZyb21KU09OKGYsIGRpY3Rpb25hcmllcykpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGZpZWxkQ2hpbGRyZW5Gcm9tSlNPTihfZmllbGQsIGRpY3Rpb25hcmllcykge1xuICAgIHJldHVybiAoX2ZpZWxkWydjaGlsZHJlbiddIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikubWFwKChmKSA9PiBGaWVsZC5mcm9tSlNPTihmLCBkaWN0aW9uYXJpZXMpKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBmaWVsZE5vZGVzRnJvbUpTT04oeHMpIHtcbiAgICByZXR1cm4gKHhzIHx8IFtdKS5yZWR1Y2UoKGZpZWxkTm9kZXMsIGNvbHVtbikgPT4gW1xuICAgICAgICAuLi5maWVsZE5vZGVzLFxuICAgICAgICBuZXcgRmllbGROb2RlKGNvbHVtblsnY291bnQnXSwgbnVsbENvdW50RnJvbUpTT04oY29sdW1uWydWQUxJRElUWSddKSksXG4gICAgICAgIC4uLmZpZWxkTm9kZXNGcm9tSlNPTihjb2x1bW5bJ2NoaWxkcmVuJ10pXG4gICAgXSwgW10pO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGJ1ZmZlcnNGcm9tSlNPTih4cywgYnVmZmVycyA9IFtdKSB7XG4gICAgZm9yIChsZXQgaSA9IC0xLCBuID0gKHhzIHx8IFtdKS5sZW5ndGg7ICsraSA8IG47KSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHhzW2ldO1xuICAgICAgICBjb2x1bW5bJ1ZBTElESVRZJ10gJiYgYnVmZmVycy5wdXNoKG5ldyBCdWZmZXJSZWdpb24oYnVmZmVycy5sZW5ndGgsIGNvbHVtblsnVkFMSURJVFknXS5sZW5ndGgpKTtcbiAgICAgICAgY29sdW1uWydUWVBFJ10gJiYgYnVmZmVycy5wdXNoKG5ldyBCdWZmZXJSZWdpb24oYnVmZmVycy5sZW5ndGgsIGNvbHVtblsnVFlQRSddLmxlbmd0aCkpO1xuICAgICAgICBjb2x1bW5bJ09GRlNFVCddICYmIGJ1ZmZlcnMucHVzaChuZXcgQnVmZmVyUmVnaW9uKGJ1ZmZlcnMubGVuZ3RoLCBjb2x1bW5bJ09GRlNFVCddLmxlbmd0aCkpO1xuICAgICAgICBjb2x1bW5bJ0RBVEEnXSAmJiBidWZmZXJzLnB1c2gobmV3IEJ1ZmZlclJlZ2lvbihidWZmZXJzLmxlbmd0aCwgY29sdW1uWydEQVRBJ10ubGVuZ3RoKSk7XG4gICAgICAgIGJ1ZmZlcnMgPSBidWZmZXJzRnJvbUpTT04oY29sdW1uWydjaGlsZHJlbiddLCBidWZmZXJzKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZmZlcnM7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gbnVsbENvdW50RnJvbUpTT04odmFsaWRpdHkpIHtcbiAgICByZXR1cm4gKHZhbGlkaXR5IHx8IFtdKS5yZWR1Y2UoKHN1bSwgdmFsKSA9PiBzdW0gKyArKHZhbCA9PT0gMCksIDApO1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWVsZEZyb21KU09OKF9maWVsZCwgZGljdGlvbmFyaWVzKSB7XG4gICAgbGV0IGlkO1xuICAgIGxldCBrZXlzO1xuICAgIGxldCBmaWVsZDtcbiAgICBsZXQgZGljdE1ldGE7XG4gICAgbGV0IHR5cGU7XG4gICAgbGV0IGRpY3RUeXBlO1xuICAgIC8vIElmIG5vIGRpY3Rpb25hcnkgZW5jb2RpbmdcbiAgICBpZiAoIWRpY3Rpb25hcmllcyB8fCAhKGRpY3RNZXRhID0gX2ZpZWxkWydkaWN0aW9uYXJ5J10pKSB7XG4gICAgICAgIHR5cGUgPSB0eXBlRnJvbUpTT04oX2ZpZWxkLCBmaWVsZENoaWxkcmVuRnJvbUpTT04oX2ZpZWxkLCBkaWN0aW9uYXJpZXMpKTtcbiAgICAgICAgZmllbGQgPSBuZXcgRmllbGQoX2ZpZWxkWyduYW1lJ10sIHR5cGUsIF9maWVsZFsnbnVsbGFibGUnXSwgY3VzdG9tTWV0YWRhdGFGcm9tSlNPTihfZmllbGRbJ2N1c3RvbU1ldGFkYXRhJ10pKTtcbiAgICB9XG4gICAgLy8gSWYgZGljdGlvbmFyeSBlbmNvZGVkIGFuZCB0aGUgZmlyc3QgdGltZSB3ZSd2ZSBzZWVuIHRoaXMgZGljdGlvbmFyeSBpZCwgZGVjb2RlXG4gICAgLy8gdGhlIGRhdGEgdHlwZSBhbmQgY2hpbGQgZmllbGRzLCB0aGVuIHdyYXAgaW4gYSBEaWN0aW9uYXJ5IHR5cGUgYW5kIGluc2VydCB0aGVcbiAgICAvLyBkYXRhIHR5cGUgaW50byB0aGUgZGljdGlvbmFyeSB0eXBlcyBtYXAuXG4gICAgZWxzZSBpZiAoIWRpY3Rpb25hcmllcy5oYXMoaWQgPSBkaWN0TWV0YVsnaWQnXSkpIHtcbiAgICAgICAgLy8gYSBkaWN0aW9uYXJ5IGluZGV4IGRlZmF1bHRzIHRvIHNpZ25lZCAzMiBiaXQgaW50IGlmIHVuc3BlY2lmaWVkXG4gICAgICAgIGtleXMgPSAoa2V5cyA9IGRpY3RNZXRhWydpbmRleFR5cGUnXSkgPyBpbmRleFR5cGVGcm9tSlNPTihrZXlzKSA6IG5ldyBJbnQzMigpO1xuICAgICAgICBkaWN0aW9uYXJpZXMuc2V0KGlkLCB0eXBlID0gdHlwZUZyb21KU09OKF9maWVsZCwgZmllbGRDaGlsZHJlbkZyb21KU09OKF9maWVsZCwgZGljdGlvbmFyaWVzKSkpO1xuICAgICAgICBkaWN0VHlwZSA9IG5ldyBEaWN0aW9uYXJ5KHR5cGUsIGtleXMsIGlkLCBkaWN0TWV0YVsnaXNPcmRlcmVkJ10pO1xuICAgICAgICBmaWVsZCA9IG5ldyBGaWVsZChfZmllbGRbJ25hbWUnXSwgZGljdFR5cGUsIF9maWVsZFsnbnVsbGFibGUnXSwgY3VzdG9tTWV0YWRhdGFGcm9tSlNPTihfZmllbGRbJ2N1c3RvbU1ldGFkYXRhJ10pKTtcbiAgICB9XG4gICAgLy8gSWYgZGljdGlvbmFyeSBlbmNvZGVkLCBhbmQgaGF2ZSBhbHJlYWR5IHNlZW4gdGhpcyBkaWN0aW9uYXJ5IElkIGluIHRoZSBzY2hlbWEsIHRoZW4gcmV1c2UgdGhlXG4gICAgLy8gZGF0YSB0eXBlIGFuZCB3cmFwIGluIGEgbmV3IERpY3Rpb25hcnkgdHlwZSBhbmQgZmllbGQuXG4gICAgZWxzZSB7XG4gICAgICAgIC8vIGEgZGljdGlvbmFyeSBpbmRleCBkZWZhdWx0cyB0byBzaWduZWQgMzIgYml0IGludCBpZiB1bnNwZWNpZmllZFxuICAgICAgICBrZXlzID0gKGtleXMgPSBkaWN0TWV0YVsnaW5kZXhUeXBlJ10pID8gaW5kZXhUeXBlRnJvbUpTT04oa2V5cykgOiBuZXcgSW50MzIoKTtcbiAgICAgICAgZGljdFR5cGUgPSBuZXcgRGljdGlvbmFyeShkaWN0aW9uYXJpZXMuZ2V0KGlkKSwga2V5cywgaWQsIGRpY3RNZXRhWydpc09yZGVyZWQnXSk7XG4gICAgICAgIGZpZWxkID0gbmV3IEZpZWxkKF9maWVsZFsnbmFtZSddLCBkaWN0VHlwZSwgX2ZpZWxkWydudWxsYWJsZSddLCBjdXN0b21NZXRhZGF0YUZyb21KU09OKF9maWVsZFsnY3VzdG9tTWV0YWRhdGEnXSkpO1xuICAgIH1cbiAgICByZXR1cm4gZmllbGQgfHwgbnVsbDtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBjdXN0b21NZXRhZGF0YUZyb21KU09OKF9tZXRhZGF0YSkge1xuICAgIHJldHVybiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKF9tZXRhZGF0YSB8fCB7fSkpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGluZGV4VHlwZUZyb21KU09OKF90eXBlKSB7XG4gICAgcmV0dXJuIG5ldyBJbnQoX3R5cGVbJ2lzU2lnbmVkJ10sIF90eXBlWydiaXRXaWR0aCddKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiB0eXBlRnJvbUpTT04oZiwgY2hpbGRyZW4pIHtcbiAgICBjb25zdCB0eXBlSWQgPSBmWyd0eXBlJ11bJ25hbWUnXTtcbiAgICBzd2l0Y2ggKHR5cGVJZCkge1xuICAgICAgICBjYXNlICdOT05FJzogcmV0dXJuIG5ldyBOdWxsKCk7XG4gICAgICAgIGNhc2UgJ251bGwnOiByZXR1cm4gbmV3IE51bGwoKTtcbiAgICAgICAgY2FzZSAnYmluYXJ5JzogcmV0dXJuIG5ldyBCaW5hcnkoKTtcbiAgICAgICAgY2FzZSAndXRmOCc6IHJldHVybiBuZXcgVXRmOCgpO1xuICAgICAgICBjYXNlICdib29sJzogcmV0dXJuIG5ldyBCb29sKCk7XG4gICAgICAgIGNhc2UgJ2xpc3QnOiByZXR1cm4gbmV3IExpc3QoKGNoaWxkcmVuIHx8IFtdKVswXSk7XG4gICAgICAgIGNhc2UgJ3N0cnVjdCc6IHJldHVybiBuZXcgU3RydWN0KGNoaWxkcmVuIHx8IFtdKTtcbiAgICAgICAgY2FzZSAnc3RydWN0Xyc6IHJldHVybiBuZXcgU3RydWN0KGNoaWxkcmVuIHx8IFtdKTtcbiAgICB9XG4gICAgc3dpdGNoICh0eXBlSWQpIHtcbiAgICAgICAgY2FzZSAnaW50Jzoge1xuICAgICAgICAgICAgY29uc3QgdCA9IGZbJ3R5cGUnXTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSW50KHRbJ2lzU2lnbmVkJ10sIHRbJ2JpdFdpZHRoJ10pO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Zsb2F0aW5ncG9pbnQnOiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZlsndHlwZSddO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdChQcmVjaXNpb25bdFsncHJlY2lzaW9uJ11dKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWNpbWFsJzoge1xuICAgICAgICAgICAgY29uc3QgdCA9IGZbJ3R5cGUnXTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGVjaW1hbCh0WydzY2FsZSddLCB0WydwcmVjaXNpb24nXSwgdFsnYml0V2lkdGgnXSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZGF0ZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBmWyd0eXBlJ107XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGVfKERhdGVVbml0W3RbJ3VuaXQnXV0pO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RpbWUnOiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZlsndHlwZSddO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lKFRpbWVVbml0W3RbJ3VuaXQnXV0sIHRbJ2JpdFdpZHRoJ10pO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RpbWVzdGFtcCc6IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBmWyd0eXBlJ107XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVzdGFtcChUaW1lVW5pdFt0Wyd1bml0J11dLCB0Wyd0aW1lem9uZSddKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdpbnRlcnZhbCc6IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBmWyd0eXBlJ107XG4gICAgICAgICAgICByZXR1cm4gbmV3IEludGVydmFsKEludGVydmFsVW5pdFt0Wyd1bml0J11dKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd1bmlvbic6IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBmWyd0eXBlJ107XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVuaW9uKFVuaW9uTW9kZVt0Wydtb2RlJ11dLCAodFsndHlwZUlkcyddIHx8IFtdKSwgY2hpbGRyZW4gfHwgW10pO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2ZpeGVkc2l6ZWJpbmFyeSc6IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBmWyd0eXBlJ107XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZpeGVkU2l6ZUJpbmFyeSh0WydieXRlV2lkdGgnXSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZml4ZWRzaXplbGlzdCc6IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBmWyd0eXBlJ107XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZpeGVkU2l6ZUxpc3QodFsnbGlzdFNpemUnXSwgKGNoaWxkcmVuIHx8IFtdKVswXSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbWFwJzoge1xuICAgICAgICAgICAgY29uc3QgdCA9IGZbJ3R5cGUnXTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTWFwXygoY2hpbGRyZW4gfHwgW10pWzBdLCB0WydrZXlzU29ydGVkJ10pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIHR5cGU6IFwiJHt0eXBlSWR9XCJgKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9anNvbi5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbi8qIGVzbGludC1kaXNhYmxlIGJyYWNlLXN0eWxlICovXG5pbXBvcnQgKiBhcyBmbGF0YnVmZmVycyBmcm9tICdmbGF0YnVmZmVycyc7XG5pbXBvcnQgeyBTY2hlbWEgYXMgX1NjaGVtYSB9IGZyb20gJy4uLy4uL2ZiL3NjaGVtYS5tanMnO1xuaW1wb3J0IHsgSW50IGFzIF9JbnQgfSBmcm9tICcuLi8uLi9mYi9pbnQubWpzJztcbmltcG9ydCB7IFJlY29yZEJhdGNoIGFzIF9SZWNvcmRCYXRjaCB9IGZyb20gJy4uLy4uL2ZiL3JlY29yZC1iYXRjaC5tanMnO1xuaW1wb3J0IHsgRGljdGlvbmFyeUJhdGNoIGFzIF9EaWN0aW9uYXJ5QmF0Y2ggfSBmcm9tICcuLi8uLi9mYi9kaWN0aW9uYXJ5LWJhdGNoLm1qcyc7XG5pbXBvcnQgeyBCdWZmZXIgYXMgX0J1ZmZlciB9IGZyb20gJy4uLy4uL2ZiL2J1ZmZlci5tanMnO1xuaW1wb3J0IHsgRmllbGQgYXMgX0ZpZWxkIH0gZnJvbSAnLi4vLi4vZmIvZmllbGQubWpzJztcbmltcG9ydCB7IEZpZWxkTm9kZSBhcyBfRmllbGROb2RlIH0gZnJvbSAnLi4vLi4vZmIvZmllbGQtbm9kZS5tanMnO1xuaW1wb3J0IHsgVHlwZSB9IGZyb20gJy4uLy4uL2ZiL3R5cGUubWpzJztcbmltcG9ydCB7IEtleVZhbHVlIGFzIF9LZXlWYWx1ZSB9IGZyb20gJy4uLy4uL2ZiL2tleS12YWx1ZS5tanMnO1xuaW1wb3J0IHsgRW5kaWFubmVzcyBhcyBfRW5kaWFubmVzcyB9IGZyb20gJy4uLy4uL2ZiL2VuZGlhbm5lc3MubWpzJztcbmltcG9ydCB7IEZsb2F0aW5nUG9pbnQgYXMgX0Zsb2F0aW5nUG9pbnQgfSBmcm9tICcuLi8uLi9mYi9mbG9hdGluZy1wb2ludC5tanMnO1xuaW1wb3J0IHsgRGVjaW1hbCBhcyBfRGVjaW1hbCB9IGZyb20gJy4uLy4uL2ZiL2RlY2ltYWwubWpzJztcbmltcG9ydCB7IERhdGUgYXMgX0RhdGUgfSBmcm9tICcuLi8uLi9mYi9kYXRlLm1qcyc7XG5pbXBvcnQgeyBUaW1lIGFzIF9UaW1lIH0gZnJvbSAnLi4vLi4vZmIvdGltZS5tanMnO1xuaW1wb3J0IHsgVGltZXN0YW1wIGFzIF9UaW1lc3RhbXAgfSBmcm9tICcuLi8uLi9mYi90aW1lc3RhbXAubWpzJztcbmltcG9ydCB7IEludGVydmFsIGFzIF9JbnRlcnZhbCB9IGZyb20gJy4uLy4uL2ZiL2ludGVydmFsLm1qcyc7XG5pbXBvcnQgeyBVbmlvbiBhcyBfVW5pb24gfSBmcm9tICcuLi8uLi9mYi91bmlvbi5tanMnO1xuaW1wb3J0IHsgRml4ZWRTaXplQmluYXJ5IGFzIF9GaXhlZFNpemVCaW5hcnkgfSBmcm9tICcuLi8uLi9mYi9maXhlZC1zaXplLWJpbmFyeS5tanMnO1xuaW1wb3J0IHsgRml4ZWRTaXplTGlzdCBhcyBfRml4ZWRTaXplTGlzdCB9IGZyb20gJy4uLy4uL2ZiL2ZpeGVkLXNpemUtbGlzdC5tanMnO1xuaW1wb3J0IHsgTWFwIGFzIF9NYXAgfSBmcm9tICcuLi8uLi9mYi9tYXAubWpzJztcbmltcG9ydCB7IE1lc3NhZ2UgYXMgX01lc3NhZ2UgfSBmcm9tICcuLi8uLi9mYi9tZXNzYWdlLm1qcyc7XG5pbXBvcnQgeyBTY2hlbWEsIEZpZWxkIH0gZnJvbSAnLi4vLi4vc2NoZW1hLm1qcyc7XG5pbXBvcnQgeyB0b1VpbnQ4QXJyYXkgfSBmcm9tICcuLi8uLi91dGlsL2J1ZmZlci5tanMnO1xuaW1wb3J0IHsgTWVzc2FnZUhlYWRlciwgTWV0YWRhdGFWZXJzaW9uIH0gZnJvbSAnLi4vLi4vZW51bS5tanMnO1xuaW1wb3J0IHsgaW5zdGFuY2UgYXMgdHlwZUFzc2VtYmxlciB9IGZyb20gJy4uLy4uL3Zpc2l0b3IvdHlwZWFzc2VtYmxlci5tanMnO1xuaW1wb3J0IHsgZmllbGRGcm9tSlNPTiwgc2NoZW1hRnJvbUpTT04sIHJlY29yZEJhdGNoRnJvbUpTT04sIGRpY3Rpb25hcnlCYXRjaEZyb21KU09OIH0gZnJvbSAnLi9qc29uLm1qcyc7XG52YXIgTG9uZyA9IGZsYXRidWZmZXJzLkxvbmc7XG52YXIgQnVpbGRlciA9IGZsYXRidWZmZXJzLkJ1aWxkZXI7XG52YXIgQnl0ZUJ1ZmZlciA9IGZsYXRidWZmZXJzLkJ5dGVCdWZmZXI7XG5pbXBvcnQgeyBEYXRhVHlwZSwgRGljdGlvbmFyeSwgVXRmOCwgQmluYXJ5LCBEZWNpbWFsLCBGaXhlZFNpemVCaW5hcnksIExpc3QsIEZpeGVkU2l6ZUxpc3QsIE1hcF8sIFN0cnVjdCwgVW5pb24sIEJvb2wsIE51bGwsIEludCwgRmxvYXQsIERhdGVfLCBUaW1lLCBJbnRlcnZhbCwgVGltZXN0YW1wLCBJbnQzMiwgfSBmcm9tICcuLi8uLi90eXBlLm1qcyc7XG4vKipcbiAqIEBpZ25vcmVcbiAqIEBwcml2YXRlXG4gKiovXG5leHBvcnQgY2xhc3MgTWVzc2FnZSB7XG4gICAgY29uc3RydWN0b3IoYm9keUxlbmd0aCwgdmVyc2lvbiwgaGVhZGVyVHlwZSwgaGVhZGVyKSB7XG4gICAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLl9oZWFkZXJUeXBlID0gaGVhZGVyVHlwZTtcbiAgICAgICAgdGhpcy5ib2R5ID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgICAgIGhlYWRlciAmJiAodGhpcy5fY3JlYXRlSGVhZGVyID0gKCkgPT4gaGVhZGVyKTtcbiAgICAgICAgdGhpcy5fYm9keUxlbmd0aCA9IHR5cGVvZiBib2R5TGVuZ3RoID09PSAnbnVtYmVyJyA/IGJvZHlMZW5ndGggOiBib2R5TGVuZ3RoLmxvdztcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGZyb21KU09OKG1zZywgaGVhZGVyVHlwZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoMCwgTWV0YWRhdGFWZXJzaW9uLlY0LCBoZWFkZXJUeXBlKTtcbiAgICAgICAgbWVzc2FnZS5fY3JlYXRlSGVhZGVyID0gbWVzc2FnZUhlYWRlckZyb21KU09OKG1zZywgaGVhZGVyVHlwZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZGVjb2RlKGJ1Zikge1xuICAgICAgICBidWYgPSBuZXcgQnl0ZUJ1ZmZlcih0b1VpbnQ4QXJyYXkoYnVmKSk7XG4gICAgICAgIGNvbnN0IF9tZXNzYWdlID0gX01lc3NhZ2UuZ2V0Um9vdEFzTWVzc2FnZShidWYpO1xuICAgICAgICBjb25zdCBib2R5TGVuZ3RoID0gX21lc3NhZ2UuYm9keUxlbmd0aCgpO1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gX21lc3NhZ2UudmVyc2lvbigpO1xuICAgICAgICBjb25zdCBoZWFkZXJUeXBlID0gX21lc3NhZ2UuaGVhZGVyVHlwZSgpO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoYm9keUxlbmd0aCwgdmVyc2lvbiwgaGVhZGVyVHlwZSk7XG4gICAgICAgIG1lc3NhZ2UuX2NyZWF0ZUhlYWRlciA9IGRlY29kZU1lc3NhZ2VIZWFkZXIoX21lc3NhZ2UsIGhlYWRlclR5cGUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGVuY29kZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGIgPSBuZXcgQnVpbGRlcigpO1xuICAgICAgICBsZXQgaGVhZGVyT2Zmc2V0ID0gLTE7XG4gICAgICAgIGlmIChtZXNzYWdlLmlzU2NoZW1hKCkpIHtcbiAgICAgICAgICAgIGhlYWRlck9mZnNldCA9IFNjaGVtYS5lbmNvZGUoYiwgbWVzc2FnZS5oZWFkZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWVzc2FnZS5pc1JlY29yZEJhdGNoKCkpIHtcbiAgICAgICAgICAgIGhlYWRlck9mZnNldCA9IFJlY29yZEJhdGNoLmVuY29kZShiLCBtZXNzYWdlLmhlYWRlcigpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlLmlzRGljdGlvbmFyeUJhdGNoKCkpIHtcbiAgICAgICAgICAgIGhlYWRlck9mZnNldCA9IERpY3Rpb25hcnlCYXRjaC5lbmNvZGUoYiwgbWVzc2FnZS5oZWFkZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgX01lc3NhZ2Uuc3RhcnRNZXNzYWdlKGIpO1xuICAgICAgICBfTWVzc2FnZS5hZGRWZXJzaW9uKGIsIE1ldGFkYXRhVmVyc2lvbi5WNCk7XG4gICAgICAgIF9NZXNzYWdlLmFkZEhlYWRlcihiLCBoZWFkZXJPZmZzZXQpO1xuICAgICAgICBfTWVzc2FnZS5hZGRIZWFkZXJUeXBlKGIsIG1lc3NhZ2UuaGVhZGVyVHlwZSk7XG4gICAgICAgIF9NZXNzYWdlLmFkZEJvZHlMZW5ndGgoYiwgbmV3IExvbmcobWVzc2FnZS5ib2R5TGVuZ3RoLCAwKSk7XG4gICAgICAgIF9NZXNzYWdlLmZpbmlzaE1lc3NhZ2VCdWZmZXIoYiwgX01lc3NhZ2UuZW5kTWVzc2FnZShiKSk7XG4gICAgICAgIHJldHVybiBiLmFzVWludDhBcnJheSgpO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbShoZWFkZXIsIGJvZHlMZW5ndGggPSAwKSB7XG4gICAgICAgIGlmIChoZWFkZXIgaW5zdGFuY2VvZiBTY2hlbWEpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZSgwLCBNZXRhZGF0YVZlcnNpb24uVjQsIE1lc3NhZ2VIZWFkZXIuU2NoZW1hLCBoZWFkZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWFkZXIgaW5zdGFuY2VvZiBSZWNvcmRCYXRjaCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlKGJvZHlMZW5ndGgsIE1ldGFkYXRhVmVyc2lvbi5WNCwgTWVzc2FnZUhlYWRlci5SZWNvcmRCYXRjaCwgaGVhZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVhZGVyIGluc3RhbmNlb2YgRGljdGlvbmFyeUJhdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2UoYm9keUxlbmd0aCwgTWV0YWRhdGFWZXJzaW9uLlY0LCBNZXNzYWdlSGVhZGVyLkRpY3Rpb25hcnlCYXRjaCwgaGVhZGVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBNZXNzYWdlIGhlYWRlcjogJHtoZWFkZXJ9YCk7XG4gICAgfVxuICAgIGdldCB0eXBlKCkgeyByZXR1cm4gdGhpcy5oZWFkZXJUeXBlOyB9XG4gICAgZ2V0IHZlcnNpb24oKSB7IHJldHVybiB0aGlzLl92ZXJzaW9uOyB9XG4gICAgZ2V0IGhlYWRlclR5cGUoKSB7IHJldHVybiB0aGlzLl9oZWFkZXJUeXBlOyB9XG4gICAgZ2V0IGJvZHlMZW5ndGgoKSB7IHJldHVybiB0aGlzLl9ib2R5TGVuZ3RoOyB9XG4gICAgaGVhZGVyKCkgeyByZXR1cm4gdGhpcy5fY3JlYXRlSGVhZGVyKCk7IH1cbiAgICBpc1NjaGVtYSgpIHsgcmV0dXJuIHRoaXMuaGVhZGVyVHlwZSA9PT0gTWVzc2FnZUhlYWRlci5TY2hlbWE7IH1cbiAgICBpc1JlY29yZEJhdGNoKCkgeyByZXR1cm4gdGhpcy5oZWFkZXJUeXBlID09PSBNZXNzYWdlSGVhZGVyLlJlY29yZEJhdGNoOyB9XG4gICAgaXNEaWN0aW9uYXJ5QmF0Y2goKSB7IHJldHVybiB0aGlzLmhlYWRlclR5cGUgPT09IE1lc3NhZ2VIZWFkZXIuRGljdGlvbmFyeUJhdGNoOyB9XG59XG4vKipcbiAqIEBpZ25vcmVcbiAqIEBwcml2YXRlXG4gKiovXG5leHBvcnQgY2xhc3MgUmVjb3JkQmF0Y2gge1xuICAgIGNvbnN0cnVjdG9yKGxlbmd0aCwgbm9kZXMsIGJ1ZmZlcnMpIHtcbiAgICAgICAgdGhpcy5fbm9kZXMgPSBub2RlcztcbiAgICAgICAgdGhpcy5fYnVmZmVycyA9IGJ1ZmZlcnM7XG4gICAgICAgIHRoaXMuX2xlbmd0aCA9IHR5cGVvZiBsZW5ndGggPT09ICdudW1iZXInID8gbGVuZ3RoIDogbGVuZ3RoLmxvdztcbiAgICB9XG4gICAgZ2V0IG5vZGVzKCkgeyByZXR1cm4gdGhpcy5fbm9kZXM7IH1cbiAgICBnZXQgbGVuZ3RoKCkgeyByZXR1cm4gdGhpcy5fbGVuZ3RoOyB9XG4gICAgZ2V0IGJ1ZmZlcnMoKSB7IHJldHVybiB0aGlzLl9idWZmZXJzOyB9XG59XG4vKipcbiAqIEBpZ25vcmVcbiAqIEBwcml2YXRlXG4gKiovXG5leHBvcnQgY2xhc3MgRGljdGlvbmFyeUJhdGNoIHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCBpZCwgaXNEZWx0YSA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLl9pc0RlbHRhID0gaXNEZWx0YTtcbiAgICAgICAgdGhpcy5faWQgPSB0eXBlb2YgaWQgPT09ICdudW1iZXInID8gaWQgOiBpZC5sb3c7XG4gICAgfVxuICAgIGdldCBpZCgpIHsgcmV0dXJuIHRoaXMuX2lkOyB9XG4gICAgZ2V0IGRhdGEoKSB7IHJldHVybiB0aGlzLl9kYXRhOyB9XG4gICAgZ2V0IGlzRGVsdGEoKSB7IHJldHVybiB0aGlzLl9pc0RlbHRhOyB9XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMuZGF0YS5sZW5ndGg7IH1cbiAgICBnZXQgbm9kZXMoKSB7IHJldHVybiB0aGlzLmRhdGEubm9kZXM7IH1cbiAgICBnZXQgYnVmZmVycygpIHsgcmV0dXJuIHRoaXMuZGF0YS5idWZmZXJzOyB9XG59XG4vKipcbiAqIEBpZ25vcmVcbiAqIEBwcml2YXRlXG4gKiovXG5leHBvcnQgY2xhc3MgQnVmZmVyUmVnaW9uIHtcbiAgICBjb25zdHJ1Y3RvcihvZmZzZXQsIGxlbmd0aCkge1xuICAgICAgICB0aGlzLm9mZnNldCA9IHR5cGVvZiBvZmZzZXQgPT09ICdudW1iZXInID8gb2Zmc2V0IDogb2Zmc2V0LmxvdztcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0eXBlb2YgbGVuZ3RoID09PSAnbnVtYmVyJyA/IGxlbmd0aCA6IGxlbmd0aC5sb3c7XG4gICAgfVxufVxuLyoqXG4gKiBAaWdub3JlXG4gKiBAcHJpdmF0ZVxuICoqL1xuZXhwb3J0IGNsYXNzIEZpZWxkTm9kZSB7XG4gICAgY29uc3RydWN0b3IobGVuZ3RoLCBudWxsQ291bnQpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0eXBlb2YgbGVuZ3RoID09PSAnbnVtYmVyJyA/IGxlbmd0aCA6IGxlbmd0aC5sb3c7XG4gICAgICAgIHRoaXMubnVsbENvdW50ID0gdHlwZW9mIG51bGxDb3VudCA9PT0gJ251bWJlcicgPyBudWxsQ291bnQgOiBudWxsQ291bnQubG93O1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBtZXNzYWdlSGVhZGVyRnJvbUpTT04obWVzc2FnZSwgdHlwZSkge1xuICAgIHJldHVybiAoKCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgTWVzc2FnZUhlYWRlci5TY2hlbWE6IHJldHVybiBTY2hlbWEuZnJvbUpTT04obWVzc2FnZSk7XG4gICAgICAgICAgICBjYXNlIE1lc3NhZ2VIZWFkZXIuUmVjb3JkQmF0Y2g6IHJldHVybiBSZWNvcmRCYXRjaC5mcm9tSlNPTihtZXNzYWdlKTtcbiAgICAgICAgICAgIGNhc2UgTWVzc2FnZUhlYWRlci5EaWN0aW9uYXJ5QmF0Y2g6IHJldHVybiBEaWN0aW9uYXJ5QmF0Y2guZnJvbUpTT04obWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgTWVzc2FnZSB0eXBlOiB7IG5hbWU6ICR7TWVzc2FnZUhlYWRlclt0eXBlXX0sIHR5cGU6ICR7dHlwZX0gfWApO1xuICAgIH0pO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGRlY29kZU1lc3NhZ2VIZWFkZXIobWVzc2FnZSwgdHlwZSkge1xuICAgIHJldHVybiAoKCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgTWVzc2FnZUhlYWRlci5TY2hlbWE6IHJldHVybiBTY2hlbWEuZGVjb2RlKG1lc3NhZ2UuaGVhZGVyKG5ldyBfU2NoZW1hKCkpKTtcbiAgICAgICAgICAgIGNhc2UgTWVzc2FnZUhlYWRlci5SZWNvcmRCYXRjaDogcmV0dXJuIFJlY29yZEJhdGNoLmRlY29kZShtZXNzYWdlLmhlYWRlcihuZXcgX1JlY29yZEJhdGNoKCkpLCBtZXNzYWdlLnZlcnNpb24oKSk7XG4gICAgICAgICAgICBjYXNlIE1lc3NhZ2VIZWFkZXIuRGljdGlvbmFyeUJhdGNoOiByZXR1cm4gRGljdGlvbmFyeUJhdGNoLmRlY29kZShtZXNzYWdlLmhlYWRlcihuZXcgX0RpY3Rpb25hcnlCYXRjaCgpKSwgbWVzc2FnZS52ZXJzaW9uKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIE1lc3NhZ2UgdHlwZTogeyBuYW1lOiAke01lc3NhZ2VIZWFkZXJbdHlwZV19LCB0eXBlOiAke3R5cGV9IH1gKTtcbiAgICB9KTtcbn1cbkZpZWxkWydlbmNvZGUnXSA9IGVuY29kZUZpZWxkO1xuRmllbGRbJ2RlY29kZSddID0gZGVjb2RlRmllbGQ7XG5GaWVsZFsnZnJvbUpTT04nXSA9IGZpZWxkRnJvbUpTT047XG5TY2hlbWFbJ2VuY29kZSddID0gZW5jb2RlU2NoZW1hO1xuU2NoZW1hWydkZWNvZGUnXSA9IGRlY29kZVNjaGVtYTtcblNjaGVtYVsnZnJvbUpTT04nXSA9IHNjaGVtYUZyb21KU09OO1xuUmVjb3JkQmF0Y2hbJ2VuY29kZSddID0gZW5jb2RlUmVjb3JkQmF0Y2g7XG5SZWNvcmRCYXRjaFsnZGVjb2RlJ10gPSBkZWNvZGVSZWNvcmRCYXRjaDtcblJlY29yZEJhdGNoWydmcm9tSlNPTiddID0gcmVjb3JkQmF0Y2hGcm9tSlNPTjtcbkRpY3Rpb25hcnlCYXRjaFsnZW5jb2RlJ10gPSBlbmNvZGVEaWN0aW9uYXJ5QmF0Y2g7XG5EaWN0aW9uYXJ5QmF0Y2hbJ2RlY29kZSddID0gZGVjb2RlRGljdGlvbmFyeUJhdGNoO1xuRGljdGlvbmFyeUJhdGNoWydmcm9tSlNPTiddID0gZGljdGlvbmFyeUJhdGNoRnJvbUpTT047XG5GaWVsZE5vZGVbJ2VuY29kZSddID0gZW5jb2RlRmllbGROb2RlO1xuRmllbGROb2RlWydkZWNvZGUnXSA9IGRlY29kZUZpZWxkTm9kZTtcbkJ1ZmZlclJlZ2lvblsnZW5jb2RlJ10gPSBlbmNvZGVCdWZmZXJSZWdpb247XG5CdWZmZXJSZWdpb25bJ2RlY29kZSddID0gZGVjb2RlQnVmZmVyUmVnaW9uO1xuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGRlY29kZVNjaGVtYShfc2NoZW1hLCBkaWN0aW9uYXJpZXMgPSBuZXcgTWFwKCkpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBkZWNvZGVTY2hlbWFGaWVsZHMoX3NjaGVtYSwgZGljdGlvbmFyaWVzKTtcbiAgICByZXR1cm4gbmV3IFNjaGVtYShmaWVsZHMsIGRlY29kZUN1c3RvbU1ldGFkYXRhKF9zY2hlbWEpLCBkaWN0aW9uYXJpZXMpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGRlY29kZVJlY29yZEJhdGNoKGJhdGNoLCB2ZXJzaW9uID0gTWV0YWRhdGFWZXJzaW9uLlY0KSB7XG4gICAgaWYgKGJhdGNoLmNvbXByZXNzaW9uKCkgIT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWNvcmQgYmF0Y2ggY29tcHJlc3Npb24gbm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUmVjb3JkQmF0Y2goYmF0Y2gubGVuZ3RoKCksIGRlY29kZUZpZWxkTm9kZXMoYmF0Y2gpLCBkZWNvZGVCdWZmZXJzKGJhdGNoLCB2ZXJzaW9uKSk7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZGVjb2RlRGljdGlvbmFyeUJhdGNoKGJhdGNoLCB2ZXJzaW9uID0gTWV0YWRhdGFWZXJzaW9uLlY0KSB7XG4gICAgcmV0dXJuIG5ldyBEaWN0aW9uYXJ5QmF0Y2goUmVjb3JkQmF0Y2guZGVjb2RlKGJhdGNoLmRhdGEoKSwgdmVyc2lvbiksIGJhdGNoLmlkKCksIGJhdGNoLmlzRGVsdGEoKSk7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZGVjb2RlQnVmZmVyUmVnaW9uKGIpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlclJlZ2lvbihiLm9mZnNldCgpLCBiLmxlbmd0aCgpKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBkZWNvZGVGaWVsZE5vZGUoZikge1xuICAgIHJldHVybiBuZXcgRmllbGROb2RlKGYubGVuZ3RoKCksIGYubnVsbENvdW50KCkpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGRlY29kZUZpZWxkTm9kZXMoYmF0Y2gpIHtcbiAgICBjb25zdCBub2RlcyA9IFtdO1xuICAgIGZvciAobGV0IGYsIGkgPSAtMSwgaiA9IC0xLCBuID0gYmF0Y2gubm9kZXNMZW5ndGgoKTsgKytpIDwgbjspIHtcbiAgICAgICAgaWYgKGYgPSBiYXRjaC5ub2RlcyhpKSkge1xuICAgICAgICAgICAgbm9kZXNbKytqXSA9IEZpZWxkTm9kZS5kZWNvZGUoZik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGVzO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGRlY29kZUJ1ZmZlcnMoYmF0Y2gsIHZlcnNpb24pIHtcbiAgICBjb25zdCBidWZmZXJSZWdpb25zID0gW107XG4gICAgZm9yIChsZXQgYiwgaSA9IC0xLCBqID0gLTEsIG4gPSBiYXRjaC5idWZmZXJzTGVuZ3RoKCk7ICsraSA8IG47KSB7XG4gICAgICAgIGlmIChiID0gYmF0Y2guYnVmZmVycyhpKSkge1xuICAgICAgICAgICAgLy8gSWYgdGhpcyBBcnJvdyBidWZmZXIgd2FzIHdyaXR0ZW4gYmVmb3JlIHZlcnNpb24gNCxcbiAgICAgICAgICAgIC8vIGFkdmFuY2UgdGhlIGJ1ZmZlcidzIGJiX3BvcyA4IGJ5dGVzIHRvIHNraXAgcGFzdFxuICAgICAgICAgICAgLy8gdGhlIG5vdy1yZW1vdmVkIHBhZ2VfaWQgZmllbGRcbiAgICAgICAgICAgIGlmICh2ZXJzaW9uIDwgTWV0YWRhdGFWZXJzaW9uLlY0KSB7XG4gICAgICAgICAgICAgICAgYi5iYl9wb3MgKz0gKDggKiAoaSArIDEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlclJlZ2lvbnNbKytqXSA9IEJ1ZmZlclJlZ2lvbi5kZWNvZGUoYik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ1ZmZlclJlZ2lvbnM7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZGVjb2RlU2NoZW1hRmllbGRzKHNjaGVtYSwgZGljdGlvbmFyaWVzKSB7XG4gICAgY29uc3QgZmllbGRzID0gW107XG4gICAgZm9yIChsZXQgZiwgaSA9IC0xLCBqID0gLTEsIG4gPSBzY2hlbWEuZmllbGRzTGVuZ3RoKCk7ICsraSA8IG47KSB7XG4gICAgICAgIGlmIChmID0gc2NoZW1hLmZpZWxkcyhpKSkge1xuICAgICAgICAgICAgZmllbGRzWysral0gPSBGaWVsZC5kZWNvZGUoZiwgZGljdGlvbmFyaWVzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmllbGRzO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGRlY29kZUZpZWxkQ2hpbGRyZW4oZmllbGQsIGRpY3Rpb25hcmllcykge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gW107XG4gICAgZm9yIChsZXQgZiwgaSA9IC0xLCBqID0gLTEsIG4gPSBmaWVsZC5jaGlsZHJlbkxlbmd0aCgpOyArK2kgPCBuOykge1xuICAgICAgICBpZiAoZiA9IGZpZWxkLmNoaWxkcmVuKGkpKSB7XG4gICAgICAgICAgICBjaGlsZHJlblsrK2pdID0gRmllbGQuZGVjb2RlKGYsIGRpY3Rpb25hcmllcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGRlY29kZUZpZWxkKGYsIGRpY3Rpb25hcmllcykge1xuICAgIGxldCBpZDtcbiAgICBsZXQgZmllbGQ7XG4gICAgbGV0IHR5cGU7XG4gICAgbGV0IGtleXM7XG4gICAgbGV0IGRpY3RUeXBlO1xuICAgIGxldCBkaWN0TWV0YTtcbiAgICAvLyBJZiBubyBkaWN0aW9uYXJ5IGVuY29kaW5nXG4gICAgaWYgKCFkaWN0aW9uYXJpZXMgfHwgIShkaWN0TWV0YSA9IGYuZGljdGlvbmFyeSgpKSkge1xuICAgICAgICB0eXBlID0gZGVjb2RlRmllbGRUeXBlKGYsIGRlY29kZUZpZWxkQ2hpbGRyZW4oZiwgZGljdGlvbmFyaWVzKSk7XG4gICAgICAgIGZpZWxkID0gbmV3IEZpZWxkKGYubmFtZSgpLCB0eXBlLCBmLm51bGxhYmxlKCksIGRlY29kZUN1c3RvbU1ldGFkYXRhKGYpKTtcbiAgICB9XG4gICAgLy8gSWYgZGljdGlvbmFyeSBlbmNvZGVkIGFuZCB0aGUgZmlyc3QgdGltZSB3ZSd2ZSBzZWVuIHRoaXMgZGljdGlvbmFyeSBpZCwgZGVjb2RlXG4gICAgLy8gdGhlIGRhdGEgdHlwZSBhbmQgY2hpbGQgZmllbGRzLCB0aGVuIHdyYXAgaW4gYSBEaWN0aW9uYXJ5IHR5cGUgYW5kIGluc2VydCB0aGVcbiAgICAvLyBkYXRhIHR5cGUgaW50byB0aGUgZGljdGlvbmFyeSB0eXBlcyBtYXAuXG4gICAgZWxzZSBpZiAoIWRpY3Rpb25hcmllcy5oYXMoaWQgPSBkaWN0TWV0YS5pZCgpLmxvdykpIHtcbiAgICAgICAgLy8gYSBkaWN0aW9uYXJ5IGluZGV4IGRlZmF1bHRzIHRvIHNpZ25lZCAzMiBiaXQgaW50IGlmIHVuc3BlY2lmaWVkXG4gICAgICAgIGtleXMgPSAoa2V5cyA9IGRpY3RNZXRhLmluZGV4VHlwZSgpKSA/IGRlY29kZUluZGV4VHlwZShrZXlzKSA6IG5ldyBJbnQzMigpO1xuICAgICAgICBkaWN0aW9uYXJpZXMuc2V0KGlkLCB0eXBlID0gZGVjb2RlRmllbGRUeXBlKGYsIGRlY29kZUZpZWxkQ2hpbGRyZW4oZiwgZGljdGlvbmFyaWVzKSkpO1xuICAgICAgICBkaWN0VHlwZSA9IG5ldyBEaWN0aW9uYXJ5KHR5cGUsIGtleXMsIGlkLCBkaWN0TWV0YS5pc09yZGVyZWQoKSk7XG4gICAgICAgIGZpZWxkID0gbmV3IEZpZWxkKGYubmFtZSgpLCBkaWN0VHlwZSwgZi5udWxsYWJsZSgpLCBkZWNvZGVDdXN0b21NZXRhZGF0YShmKSk7XG4gICAgfVxuICAgIC8vIElmIGRpY3Rpb25hcnkgZW5jb2RlZCwgYW5kIGhhdmUgYWxyZWFkeSBzZWVuIHRoaXMgZGljdGlvbmFyeSBJZCBpbiB0aGUgc2NoZW1hLCB0aGVuIHJldXNlIHRoZVxuICAgIC8vIGRhdGEgdHlwZSBhbmQgd3JhcCBpbiBhIG5ldyBEaWN0aW9uYXJ5IHR5cGUgYW5kIGZpZWxkLlxuICAgIGVsc2Uge1xuICAgICAgICAvLyBhIGRpY3Rpb25hcnkgaW5kZXggZGVmYXVsdHMgdG8gc2lnbmVkIDMyIGJpdCBpbnQgaWYgdW5zcGVjaWZpZWRcbiAgICAgICAga2V5cyA9IChrZXlzID0gZGljdE1ldGEuaW5kZXhUeXBlKCkpID8gZGVjb2RlSW5kZXhUeXBlKGtleXMpIDogbmV3IEludDMyKCk7XG4gICAgICAgIGRpY3RUeXBlID0gbmV3IERpY3Rpb25hcnkoZGljdGlvbmFyaWVzLmdldChpZCksIGtleXMsIGlkLCBkaWN0TWV0YS5pc09yZGVyZWQoKSk7XG4gICAgICAgIGZpZWxkID0gbmV3IEZpZWxkKGYubmFtZSgpLCBkaWN0VHlwZSwgZi5udWxsYWJsZSgpLCBkZWNvZGVDdXN0b21NZXRhZGF0YShmKSk7XG4gICAgfVxuICAgIHJldHVybiBmaWVsZCB8fCBudWxsO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGRlY29kZUN1c3RvbU1ldGFkYXRhKHBhcmVudCkge1xuICAgIGNvbnN0IGRhdGEgPSBuZXcgTWFwKCk7XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICBmb3IgKGxldCBlbnRyeSwga2V5LCBpID0gLTEsIG4gPSBNYXRoLnRydW5jKHBhcmVudC5jdXN0b21NZXRhZGF0YUxlbmd0aCgpKTsgKytpIDwgbjspIHtcbiAgICAgICAgICAgIGlmICgoZW50cnkgPSBwYXJlbnQuY3VzdG9tTWV0YWRhdGEoaSkpICYmIChrZXkgPSBlbnRyeS5rZXkoKSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRhdGEuc2V0KGtleSwgZW50cnkudmFsdWUoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZGVjb2RlSW5kZXhUeXBlKF90eXBlKSB7XG4gICAgcmV0dXJuIG5ldyBJbnQoX3R5cGUuaXNTaWduZWQoKSwgX3R5cGUuYml0V2lkdGgoKSk7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZGVjb2RlRmllbGRUeXBlKGYsIGNoaWxkcmVuKSB7XG4gICAgY29uc3QgdHlwZUlkID0gZi50eXBlVHlwZSgpO1xuICAgIHN3aXRjaCAodHlwZUlkKSB7XG4gICAgICAgIGNhc2UgVHlwZVsnTk9ORSddOiByZXR1cm4gbmV3IE51bGwoKTtcbiAgICAgICAgY2FzZSBUeXBlWydOdWxsJ106IHJldHVybiBuZXcgTnVsbCgpO1xuICAgICAgICBjYXNlIFR5cGVbJ0JpbmFyeSddOiByZXR1cm4gbmV3IEJpbmFyeSgpO1xuICAgICAgICBjYXNlIFR5cGVbJ1V0ZjgnXTogcmV0dXJuIG5ldyBVdGY4KCk7XG4gICAgICAgIGNhc2UgVHlwZVsnQm9vbCddOiByZXR1cm4gbmV3IEJvb2woKTtcbiAgICAgICAgY2FzZSBUeXBlWydMaXN0J106IHJldHVybiBuZXcgTGlzdCgoY2hpbGRyZW4gfHwgW10pWzBdKTtcbiAgICAgICAgY2FzZSBUeXBlWydTdHJ1Y3RfJ106IHJldHVybiBuZXcgU3RydWN0KGNoaWxkcmVuIHx8IFtdKTtcbiAgICB9XG4gICAgc3dpdGNoICh0eXBlSWQpIHtcbiAgICAgICAgY2FzZSBUeXBlWydJbnQnXToge1xuICAgICAgICAgICAgY29uc3QgdCA9IGYudHlwZShuZXcgX0ludCgpKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSW50KHQuaXNTaWduZWQoKSwgdC5iaXRXaWR0aCgpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFR5cGVbJ0Zsb2F0aW5nUG9pbnQnXToge1xuICAgICAgICAgICAgY29uc3QgdCA9IGYudHlwZShuZXcgX0Zsb2F0aW5nUG9pbnQoKSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0KHQucHJlY2lzaW9uKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgVHlwZVsnRGVjaW1hbCddOiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZi50eXBlKG5ldyBfRGVjaW1hbCgpKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGVjaW1hbCh0LnNjYWxlKCksIHQucHJlY2lzaW9uKCksIHQuYml0V2lkdGgoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBUeXBlWydEYXRlJ106IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBmLnR5cGUobmV3IF9EYXRlKCkpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlXyh0LnVuaXQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBUeXBlWydUaW1lJ106IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBmLnR5cGUobmV3IF9UaW1lKCkpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lKHQudW5pdCgpLCB0LmJpdFdpZHRoKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgVHlwZVsnVGltZXN0YW1wJ106IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBmLnR5cGUobmV3IF9UaW1lc3RhbXAoKSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVzdGFtcCh0LnVuaXQoKSwgdC50aW1lem9uZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFR5cGVbJ0ludGVydmFsJ106IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBmLnR5cGUobmV3IF9JbnRlcnZhbCgpKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZXJ2YWwodC51bml0KCkpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgVHlwZVsnVW5pb24nXToge1xuICAgICAgICAgICAgY29uc3QgdCA9IGYudHlwZShuZXcgX1VuaW9uKCkpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBVbmlvbih0Lm1vZGUoKSwgdC50eXBlSWRzQXJyYXkoKSB8fCBbXSwgY2hpbGRyZW4gfHwgW10pO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgVHlwZVsnRml4ZWRTaXplQmluYXJ5J106IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBmLnR5cGUobmV3IF9GaXhlZFNpemVCaW5hcnkoKSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZpeGVkU2l6ZUJpbmFyeSh0LmJ5dGVXaWR0aCgpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFR5cGVbJ0ZpeGVkU2l6ZUxpc3QnXToge1xuICAgICAgICAgICAgY29uc3QgdCA9IGYudHlwZShuZXcgX0ZpeGVkU2l6ZUxpc3QoKSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZpeGVkU2l6ZUxpc3QodC5saXN0U2l6ZSgpLCAoY2hpbGRyZW4gfHwgW10pWzBdKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFR5cGVbJ01hcCddOiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZi50eXBlKG5ldyBfTWFwKCkpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXBfKChjaGlsZHJlbiB8fCBbXSlbMF0sIHQua2V5c1NvcnRlZCgpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCB0eXBlOiBcIiR7VHlwZVt0eXBlSWRdfVwiICgke3R5cGVJZH0pYCk7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZW5jb2RlU2NoZW1hKGIsIHNjaGVtYSkge1xuICAgIGNvbnN0IGZpZWxkT2Zmc2V0cyA9IHNjaGVtYS5maWVsZHMubWFwKChmKSA9PiBGaWVsZC5lbmNvZGUoYiwgZikpO1xuICAgIF9TY2hlbWEuc3RhcnRGaWVsZHNWZWN0b3IoYiwgZmllbGRPZmZzZXRzLmxlbmd0aCk7XG4gICAgY29uc3QgZmllbGRzVmVjdG9yT2Zmc2V0ID0gX1NjaGVtYS5jcmVhdGVGaWVsZHNWZWN0b3IoYiwgZmllbGRPZmZzZXRzKTtcbiAgICBjb25zdCBtZXRhZGF0YU9mZnNldCA9ICEoc2NoZW1hLm1ldGFkYXRhICYmIHNjaGVtYS5tZXRhZGF0YS5zaXplID4gMCkgPyAtMSA6XG4gICAgICAgIF9TY2hlbWEuY3JlYXRlQ3VzdG9tTWV0YWRhdGFWZWN0b3IoYiwgWy4uLnNjaGVtYS5tZXRhZGF0YV0ubWFwKChbaywgdl0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGIuY3JlYXRlU3RyaW5nKGAke2t9YCk7XG4gICAgICAgICAgICBjb25zdCB2YWwgPSBiLmNyZWF0ZVN0cmluZyhgJHt2fWApO1xuICAgICAgICAgICAgX0tleVZhbHVlLnN0YXJ0S2V5VmFsdWUoYik7XG4gICAgICAgICAgICBfS2V5VmFsdWUuYWRkS2V5KGIsIGtleSk7XG4gICAgICAgICAgICBfS2V5VmFsdWUuYWRkVmFsdWUoYiwgdmFsKTtcbiAgICAgICAgICAgIHJldHVybiBfS2V5VmFsdWUuZW5kS2V5VmFsdWUoYik7XG4gICAgICAgIH0pKTtcbiAgICBfU2NoZW1hLnN0YXJ0U2NoZW1hKGIpO1xuICAgIF9TY2hlbWEuYWRkRmllbGRzKGIsIGZpZWxkc1ZlY3Rvck9mZnNldCk7XG4gICAgX1NjaGVtYS5hZGRFbmRpYW5uZXNzKGIsIHBsYXRmb3JtSXNMaXR0bGVFbmRpYW4gPyBfRW5kaWFubmVzcy5MaXR0bGUgOiBfRW5kaWFubmVzcy5CaWcpO1xuICAgIGlmIChtZXRhZGF0YU9mZnNldCAhPT0gLTEpIHtcbiAgICAgICAgX1NjaGVtYS5hZGRDdXN0b21NZXRhZGF0YShiLCBtZXRhZGF0YU9mZnNldCk7XG4gICAgfVxuICAgIHJldHVybiBfU2NoZW1hLmVuZFNjaGVtYShiKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBlbmNvZGVGaWVsZChiLCBmaWVsZCkge1xuICAgIGxldCBuYW1lT2Zmc2V0ID0gLTE7XG4gICAgbGV0IHR5cGVPZmZzZXQgPSAtMTtcbiAgICBsZXQgZGljdGlvbmFyeU9mZnNldCA9IC0xO1xuICAgIGNvbnN0IHR5cGUgPSBmaWVsZC50eXBlO1xuICAgIGxldCB0eXBlSWQgPSBmaWVsZC50eXBlSWQ7XG4gICAgaWYgKCFEYXRhVHlwZS5pc0RpY3Rpb25hcnkodHlwZSkpIHtcbiAgICAgICAgdHlwZU9mZnNldCA9IHR5cGVBc3NlbWJsZXIudmlzaXQodHlwZSwgYik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0eXBlSWQgPSB0eXBlLmRpY3Rpb25hcnkudHlwZUlkO1xuICAgICAgICBkaWN0aW9uYXJ5T2Zmc2V0ID0gdHlwZUFzc2VtYmxlci52aXNpdCh0eXBlLCBiKTtcbiAgICAgICAgdHlwZU9mZnNldCA9IHR5cGVBc3NlbWJsZXIudmlzaXQodHlwZS5kaWN0aW9uYXJ5LCBiKTtcbiAgICB9XG4gICAgY29uc3QgY2hpbGRPZmZzZXRzID0gKHR5cGUuY2hpbGRyZW4gfHwgW10pLm1hcCgoZikgPT4gRmllbGQuZW5jb2RlKGIsIGYpKTtcbiAgICBjb25zdCBjaGlsZHJlblZlY3Rvck9mZnNldCA9IF9GaWVsZC5jcmVhdGVDaGlsZHJlblZlY3RvcihiLCBjaGlsZE9mZnNldHMpO1xuICAgIGNvbnN0IG1ldGFkYXRhT2Zmc2V0ID0gIShmaWVsZC5tZXRhZGF0YSAmJiBmaWVsZC5tZXRhZGF0YS5zaXplID4gMCkgPyAtMSA6XG4gICAgICAgIF9GaWVsZC5jcmVhdGVDdXN0b21NZXRhZGF0YVZlY3RvcihiLCBbLi4uZmllbGQubWV0YWRhdGFdLm1hcCgoW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBiLmNyZWF0ZVN0cmluZyhgJHtrfWApO1xuICAgICAgICAgICAgY29uc3QgdmFsID0gYi5jcmVhdGVTdHJpbmcoYCR7dn1gKTtcbiAgICAgICAgICAgIF9LZXlWYWx1ZS5zdGFydEtleVZhbHVlKGIpO1xuICAgICAgICAgICAgX0tleVZhbHVlLmFkZEtleShiLCBrZXkpO1xuICAgICAgICAgICAgX0tleVZhbHVlLmFkZFZhbHVlKGIsIHZhbCk7XG4gICAgICAgICAgICByZXR1cm4gX0tleVZhbHVlLmVuZEtleVZhbHVlKGIpO1xuICAgICAgICB9KSk7XG4gICAgaWYgKGZpZWxkLm5hbWUpIHtcbiAgICAgICAgbmFtZU9mZnNldCA9IGIuY3JlYXRlU3RyaW5nKGZpZWxkLm5hbWUpO1xuICAgIH1cbiAgICBfRmllbGQuc3RhcnRGaWVsZChiKTtcbiAgICBfRmllbGQuYWRkVHlwZShiLCB0eXBlT2Zmc2V0KTtcbiAgICBfRmllbGQuYWRkVHlwZVR5cGUoYiwgdHlwZUlkKTtcbiAgICBfRmllbGQuYWRkQ2hpbGRyZW4oYiwgY2hpbGRyZW5WZWN0b3JPZmZzZXQpO1xuICAgIF9GaWVsZC5hZGROdWxsYWJsZShiLCAhIWZpZWxkLm51bGxhYmxlKTtcbiAgICBpZiAobmFtZU9mZnNldCAhPT0gLTEpIHtcbiAgICAgICAgX0ZpZWxkLmFkZE5hbWUoYiwgbmFtZU9mZnNldCk7XG4gICAgfVxuICAgIGlmIChkaWN0aW9uYXJ5T2Zmc2V0ICE9PSAtMSkge1xuICAgICAgICBfRmllbGQuYWRkRGljdGlvbmFyeShiLCBkaWN0aW9uYXJ5T2Zmc2V0KTtcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhT2Zmc2V0ICE9PSAtMSkge1xuICAgICAgICBfRmllbGQuYWRkQ3VzdG9tTWV0YWRhdGEoYiwgbWV0YWRhdGFPZmZzZXQpO1xuICAgIH1cbiAgICByZXR1cm4gX0ZpZWxkLmVuZEZpZWxkKGIpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGVuY29kZVJlY29yZEJhdGNoKGIsIHJlY29yZEJhdGNoKSB7XG4gICAgY29uc3Qgbm9kZXMgPSByZWNvcmRCYXRjaC5ub2RlcyB8fCBbXTtcbiAgICBjb25zdCBidWZmZXJzID0gcmVjb3JkQmF0Y2guYnVmZmVycyB8fCBbXTtcbiAgICBfUmVjb3JkQmF0Y2guc3RhcnROb2Rlc1ZlY3RvcihiLCBub2Rlcy5sZW5ndGgpO1xuICAgIGZvciAoY29uc3QgbiBvZiBub2Rlcy5zbGljZSgpLnJldmVyc2UoKSlcbiAgICAgICAgRmllbGROb2RlLmVuY29kZShiLCBuKTtcbiAgICBjb25zdCBub2Rlc1ZlY3Rvck9mZnNldCA9IGIuZW5kVmVjdG9yKCk7XG4gICAgX1JlY29yZEJhdGNoLnN0YXJ0QnVmZmVyc1ZlY3RvcihiLCBidWZmZXJzLmxlbmd0aCk7XG4gICAgZm9yIChjb25zdCBiXyBvZiBidWZmZXJzLnNsaWNlKCkucmV2ZXJzZSgpKVxuICAgICAgICBCdWZmZXJSZWdpb24uZW5jb2RlKGIsIGJfKTtcbiAgICBjb25zdCBidWZmZXJzVmVjdG9yT2Zmc2V0ID0gYi5lbmRWZWN0b3IoKTtcbiAgICBfUmVjb3JkQmF0Y2guc3RhcnRSZWNvcmRCYXRjaChiKTtcbiAgICBfUmVjb3JkQmF0Y2guYWRkTGVuZ3RoKGIsIG5ldyBMb25nKHJlY29yZEJhdGNoLmxlbmd0aCwgMCkpO1xuICAgIF9SZWNvcmRCYXRjaC5hZGROb2RlcyhiLCBub2Rlc1ZlY3Rvck9mZnNldCk7XG4gICAgX1JlY29yZEJhdGNoLmFkZEJ1ZmZlcnMoYiwgYnVmZmVyc1ZlY3Rvck9mZnNldCk7XG4gICAgcmV0dXJuIF9SZWNvcmRCYXRjaC5lbmRSZWNvcmRCYXRjaChiKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBlbmNvZGVEaWN0aW9uYXJ5QmF0Y2goYiwgZGljdGlvbmFyeUJhdGNoKSB7XG4gICAgY29uc3QgZGF0YU9mZnNldCA9IFJlY29yZEJhdGNoLmVuY29kZShiLCBkaWN0aW9uYXJ5QmF0Y2guZGF0YSk7XG4gICAgX0RpY3Rpb25hcnlCYXRjaC5zdGFydERpY3Rpb25hcnlCYXRjaChiKTtcbiAgICBfRGljdGlvbmFyeUJhdGNoLmFkZElkKGIsIG5ldyBMb25nKGRpY3Rpb25hcnlCYXRjaC5pZCwgMCkpO1xuICAgIF9EaWN0aW9uYXJ5QmF0Y2guYWRkSXNEZWx0YShiLCBkaWN0aW9uYXJ5QmF0Y2guaXNEZWx0YSk7XG4gICAgX0RpY3Rpb25hcnlCYXRjaC5hZGREYXRhKGIsIGRhdGFPZmZzZXQpO1xuICAgIHJldHVybiBfRGljdGlvbmFyeUJhdGNoLmVuZERpY3Rpb25hcnlCYXRjaChiKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBlbmNvZGVGaWVsZE5vZGUoYiwgbm9kZSkge1xuICAgIHJldHVybiBfRmllbGROb2RlLmNyZWF0ZUZpZWxkTm9kZShiLCBuZXcgTG9uZyhub2RlLmxlbmd0aCwgMCksIG5ldyBMb25nKG5vZGUubnVsbENvdW50LCAwKSk7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZW5jb2RlQnVmZmVyUmVnaW9uKGIsIG5vZGUpIHtcbiAgICByZXR1cm4gX0J1ZmZlci5jcmVhdGVCdWZmZXIoYiwgbmV3IExvbmcobm9kZS5vZmZzZXQsIDApLCBuZXcgTG9uZyhub2RlLmxlbmd0aCwgMCkpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IHBsYXRmb3JtSXNMaXR0bGVFbmRpYW4gPSAoKCkgPT4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcigyKTtcbiAgICBuZXcgRGF0YVZpZXcoYnVmZmVyKS5zZXRJbnQxNigwLCAyNTYsIHRydWUgLyogbGl0dGxlRW5kaWFuICovKTtcbiAgICAvLyBJbnQxNkFycmF5IHVzZXMgdGhlIHBsYXRmb3JtJ3MgZW5kaWFubmVzcy5cbiAgICByZXR1cm4gbmV3IEludDE2QXJyYXkoYnVmZmVyKVswXSA9PT0gMjU2O1xufSkoKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVzc2FnZS5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IF9fYXN5bmNEZWxlZ2F0b3IsIF9fYXN5bmNHZW5lcmF0b3IsIF9fYXN5bmNWYWx1ZXMsIF9fYXdhaXQsIF9fYXdhaXRlciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgbWFrZURhdGEgfSBmcm9tICcuLi9kYXRhLm1qcyc7XG5pbXBvcnQgeyBWZWN0b3IgfSBmcm9tICcuLi92ZWN0b3IubWpzJztcbmltcG9ydCB7IFN0cnVjdCB9IGZyb20gJy4uL3R5cGUubWpzJztcbmltcG9ydCB7IE1lc3NhZ2VIZWFkZXIgfSBmcm9tICcuLi9lbnVtLm1qcyc7XG5pbXBvcnQgeyBGb290ZXIgfSBmcm9tICcuL21ldGFkYXRhL2ZpbGUubWpzJztcbmltcG9ydCBzdHJlYW1BZGFwdGVycyBmcm9tICcuLi9pby9hZGFwdGVycy5tanMnO1xuaW1wb3J0IHsgQnl0ZVN0cmVhbSwgQXN5bmNCeXRlU3RyZWFtIH0gZnJvbSAnLi4vaW8vc3RyZWFtLm1qcyc7XG5pbXBvcnQgeyBSYW5kb21BY2Nlc3NGaWxlLCBBc3luY1JhbmRvbUFjY2Vzc0ZpbGUgfSBmcm9tICcuLi9pby9maWxlLm1qcyc7XG5pbXBvcnQgeyBWZWN0b3JMb2FkZXIsIEpTT05WZWN0b3JMb2FkZXIgfSBmcm9tICcuLi92aXNpdG9yL3ZlY3RvcmxvYWRlci5tanMnO1xuaW1wb3J0IHsgUmVjb3JkQmF0Y2gsIF9JbnRlcm5hbEVtcHR5UGxhY2Vob2xkZXJSZWNvcmRCYXRjaCB9IGZyb20gJy4uL3JlY29yZGJhdGNoLm1qcyc7XG5pbXBvcnQgeyBJVEVSQVRPUl9ET05FLCBSZWFkYWJsZUludGVyb3AsIH0gZnJvbSAnLi4vaW8vaW50ZXJmYWNlcy5tanMnO1xuaW1wb3J0IHsgTWVzc2FnZVJlYWRlciwgQXN5bmNNZXNzYWdlUmVhZGVyLCBKU09OTWVzc2FnZVJlYWRlciwgY2hlY2tGb3JNYWdpY0Fycm93U3RyaW5nLCBtYWdpY0xlbmd0aCwgbWFnaWNBbmRQYWRkaW5nLCBtYWdpY1gyQW5kUGFkZGluZyB9IGZyb20gJy4vbWVzc2FnZS5tanMnO1xuaW1wb3J0IHsgaXNQcm9taXNlLCBpc0l0ZXJhYmxlLCBpc0FzeW5jSXRlcmFibGUsIGlzSXRlcmF0b3JSZXN1bHQsIGlzQXJyb3dKU09OLCBpc0ZpbGVIYW5kbGUsIGlzRmV0Y2hSZXNwb25zZSwgaXNSZWFkYWJsZURPTVN0cmVhbSwgaXNSZWFkYWJsZU5vZGVTdHJlYW0gfSBmcm9tICcuLi91dGlsL2NvbXBhdC5tanMnO1xuZXhwb3J0IGNsYXNzIFJlY29yZEJhdGNoUmVhZGVyIGV4dGVuZHMgUmVhZGFibGVJbnRlcm9wIHtcbiAgICBjb25zdHJ1Y3RvcihpbXBsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX2ltcGwgPSBpbXBsO1xuICAgIH1cbiAgICBnZXQgY2xvc2VkKCkgeyByZXR1cm4gdGhpcy5faW1wbC5jbG9zZWQ7IH1cbiAgICBnZXQgc2NoZW1hKCkgeyByZXR1cm4gdGhpcy5faW1wbC5zY2hlbWE7IH1cbiAgICBnZXQgYXV0b0Rlc3Ryb3koKSB7IHJldHVybiB0aGlzLl9pbXBsLmF1dG9EZXN0cm95OyB9XG4gICAgZ2V0IGRpY3Rpb25hcmllcygpIHsgcmV0dXJuIHRoaXMuX2ltcGwuZGljdGlvbmFyaWVzOyB9XG4gICAgZ2V0IG51bURpY3Rpb25hcmllcygpIHsgcmV0dXJuIHRoaXMuX2ltcGwubnVtRGljdGlvbmFyaWVzOyB9XG4gICAgZ2V0IG51bVJlY29yZEJhdGNoZXMoKSB7IHJldHVybiB0aGlzLl9pbXBsLm51bVJlY29yZEJhdGNoZXM7IH1cbiAgICBnZXQgZm9vdGVyKCkgeyByZXR1cm4gdGhpcy5faW1wbC5pc0ZpbGUoKSA/IHRoaXMuX2ltcGwuZm9vdGVyIDogbnVsbDsgfVxuICAgIGlzU3luYygpIHsgcmV0dXJuIHRoaXMuX2ltcGwuaXNTeW5jKCk7IH1cbiAgICBpc0FzeW5jKCkgeyByZXR1cm4gdGhpcy5faW1wbC5pc0FzeW5jKCk7IH1cbiAgICBpc0ZpbGUoKSB7IHJldHVybiB0aGlzLl9pbXBsLmlzRmlsZSgpOyB9XG4gICAgaXNTdHJlYW0oKSB7IHJldHVybiB0aGlzLl9pbXBsLmlzU3RyZWFtKCk7IH1cbiAgICBuZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW1wbC5uZXh0KCk7XG4gICAgfVxuICAgIHRocm93KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbXBsLnRocm93KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbXBsLnJldHVybih2YWx1ZSk7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ltcGwuY2FuY2VsKCk7XG4gICAgfVxuICAgIHJlc2V0KHNjaGVtYSkge1xuICAgICAgICB0aGlzLl9pbXBsLnJlc2V0KHNjaGVtYSk7XG4gICAgICAgIHRoaXMuX0RPTVN0cmVhbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fbm9kZVN0cmVhbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG9wZW4ob3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcGVuaW5nID0gdGhpcy5faW1wbC5vcGVuKG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gaXNQcm9taXNlKG9wZW5pbmcpID8gb3BlbmluZy50aGVuKCgpID0+IHRoaXMpIDogdGhpcztcbiAgICB9XG4gICAgcmVhZFJlY29yZEJhdGNoKGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbXBsLmlzRmlsZSgpID8gdGhpcy5faW1wbC5yZWFkUmVjb3JkQmF0Y2goaW5kZXgpIDogbnVsbDtcbiAgICB9XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbXBsW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICB9XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ltcGxbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG4gICAgfVxuICAgIHRvRE9NU3RyZWFtKCkge1xuICAgICAgICByZXR1cm4gc3RyZWFtQWRhcHRlcnMudG9ET01TdHJlYW0oKHRoaXMuaXNTeW5jKClcbiAgICAgICAgICAgID8geyBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4gdGhpcyB9XG4gICAgICAgICAgICA6IHsgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gdGhpcyB9KSk7XG4gICAgfVxuICAgIHRvTm9kZVN0cmVhbSgpIHtcbiAgICAgICAgcmV0dXJuIHN0cmVhbUFkYXB0ZXJzLnRvTm9kZVN0cmVhbSgodGhpcy5pc1N5bmMoKVxuICAgICAgICAgICAgPyB7IFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB0aGlzIH1cbiAgICAgICAgICAgIDogeyBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiB0aGlzIH0pLCB7IG9iamVjdE1vZGU6IHRydWUgfSk7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBzdGF0aWMgdGhyb3VnaE5vZGUob3B0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwidGhyb3VnaE5vZGVcIiBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnRgKTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIHRocm91Z2hET00oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdyaXRhYmxlU3RyYXRlZ3ksIFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZWFkYWJsZVN0cmF0ZWd5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJ0aHJvdWdoRE9NXCIgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50YCk7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBmcm9tKHNvdXJjZSkge1xuICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgUmVjb3JkQmF0Y2hSZWFkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNBcnJvd0pTT04oc291cmNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZyb21BcnJvd0pTT04oc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0ZpbGVIYW5kbGUoc291cmNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZyb21GaWxlSGFuZGxlKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQcm9taXNlKHNvdXJjZSkpIHtcbiAgICAgICAgICAgIHJldHVybiAoKCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgeyByZXR1cm4geWllbGQgUmVjb3JkQmF0Y2hSZWFkZXIuZnJvbSh5aWVsZCBzb3VyY2UpOyB9KSkoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0ZldGNoUmVzcG9uc2Uoc291cmNlKSB8fCBpc1JlYWRhYmxlRE9NU3RyZWFtKHNvdXJjZSkgfHwgaXNSZWFkYWJsZU5vZGVTdHJlYW0oc291cmNlKSB8fCBpc0FzeW5jSXRlcmFibGUoc291cmNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZyb21Bc3luY0J5dGVTdHJlYW0obmV3IEFzeW5jQnl0ZVN0cmVhbShzb3VyY2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnJvbUJ5dGVTdHJlYW0obmV3IEJ5dGVTdHJlYW0oc291cmNlKSk7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyByZWFkQWxsKHNvdXJjZSkge1xuICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgUmVjb3JkQmF0Y2hSZWFkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2UuaXNTeW5jKCkgPyByZWFkQWxsU3luYyhzb3VyY2UpIDogcmVhZEFsbEFzeW5jKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNBcnJvd0pTT04oc291cmNlKSB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcoc291cmNlKSB8fCBpc0l0ZXJhYmxlKHNvdXJjZSkgfHwgaXNJdGVyYXRvclJlc3VsdChzb3VyY2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVhZEFsbFN5bmMoc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVhZEFsbEFzeW5jKHNvdXJjZSk7XG4gICAgfVxufVxuLy9cbi8vIFNpbmNlIFRTIGlzIGEgc3RydWN0dXJhbCB0eXBlIHN5c3RlbSwgd2UgZGVmaW5lIHRoZSBmb2xsb3dpbmcgc3ViY2xhc3Mgc3R1YnNcbi8vIHNvIHRoYXQgY29uY3JldGUgdHlwZXMgZXhpc3QgdG8gYXNzb2NpYXRlIHdpdGggd2l0aCB0aGUgaW50ZXJmYWNlcyBiZWxvdy5cbi8vXG4vLyBUaGUgaW1wbGVtZW50YXRpb24gZm9yIGVhY2ggUmVjb3JkQmF0Y2hSZWFkZXIgaXMgaGlkZGVuIGF3YXkgaW4gdGhlIHNldCBvZlxuLy8gYFJlY29yZEJhdGNoUmVhZGVySW1wbGAgY2xhc3NlcyBpbiB0aGUgc2Vjb25kIGhhbGYgb2YgdGhpcyBmaWxlLiBUaGlzIGFsbG93c1xuLy8gdXMgdG8gZXhwb3J0IGEgc2luZ2xlIFJlY29yZEJhdGNoUmVhZGVyIGNsYXNzLCBhbmQgc3dhcCBvdXQgdGhlIGltcGwgYmFzZWRcbi8vIG9uIHRoZSBpbyBwcmltaXRpdmVzIG9yIHVuZGVybHlpbmcgYXJyb3cgKEpTT04sIGZpbGUsIG9yIHN0cmVhbSkgYXQgcnVudGltZS5cbi8vXG4vLyBBc3luYy9hd2FpdCBtYWtlcyBvdXIgam9iIGEgYml0IGhhcmRlciwgc2luY2UgaXQgZm9yY2VzIGV2ZXJ5dGhpbmcgdG8gYmVcbi8vIGVpdGhlciBmdWxseSBzeW5jIG9yIGZ1bGx5IGFzeW5jLiBUaGlzIGlzIHdoeSB0aGUgbG9naWMgZm9yIHRoZSByZWFkZXIgaW1wbHNcbi8vIGhhcyBiZWVuIGR1cGxpY2F0ZWQgaW50byBib3RoIHN5bmMgYW5kIGFzeW5jIHZhcmlhbnRzLiBTaW5jZSB0aGUgUkJSXG4vLyBkZWxlZ2F0ZXMgdG8gaXRzIGltcGwsIGFuIFJCUiB3aXRoIGFuIEFzeW5jUmVjb3JkQmF0Y2hGaWxlUmVhZGVySW1wbCBmb3Jcbi8vIGV4YW1wbGUgd2lsbCByZXR1cm4gYXN5bmMvYXdhaXQtZnJpZW5kbHkgUHJvbWlzZXMsIGJ1dCBvbmUgd2l0aCBhIChzeW5jKVxuLy8gUmVjb3JkQmF0Y2hTdHJlYW1SZWFkZXJJbXBsIHdpbGwgYWx3YXlzIHJldHVybiB2YWx1ZXMuIE5vdGhpbmcgc2hvdWxkIGJlXG4vLyBkaWZmZXJlbnQgYWJvdXQgdGhlaXIgbG9naWMsIGFzaWRlIGZyb20gdGhlIGFzeW5jIGhhbmRsaW5nLiBUaGlzIGlzIGFsc28gd2h5XG4vLyB0aGlzIGNvZGUgbG9va3MgaGlnaGx5IHN0cnVjdHVyZWQsIGFzIGl0IHNob3VsZCBiZSBuZWFybHkgaWRlbnRpY2FsIGFuZCBlYXN5XG4vLyB0byBmb2xsb3cuXG4vL1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBSZWNvcmRCYXRjaFN0cmVhbVJlYWRlciBleHRlbmRzIFJlY29yZEJhdGNoUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihfaW1wbCkge1xuICAgICAgICBzdXBlcihfaW1wbCk7XG4gICAgICAgIHRoaXMuX2ltcGwgPSBfaW1wbDtcbiAgICB9XG4gICAgcmVhZEFsbCgpIHsgcmV0dXJuIFsuLi50aGlzXTsgfVxuICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkgeyByZXR1cm4gdGhpcy5faW1wbFtTeW1ib2wuaXRlcmF0b3JdKCk7IH1cbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkgeyByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBfYSgpIHsgeWllbGQgX19hd2FpdCh5aWVsZCogX19hc3luY0RlbGVnYXRvcihfX2FzeW5jVmFsdWVzKHRoaXNbU3ltYm9sLml0ZXJhdG9yXSgpKSkpOyB9KTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBBc3luY1JlY29yZEJhdGNoU3RyZWFtUmVhZGVyIGV4dGVuZHMgUmVjb3JkQmF0Y2hSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKF9pbXBsKSB7XG4gICAgICAgIHN1cGVyKF9pbXBsKTtcbiAgICAgICAgdGhpcy5faW1wbCA9IF9pbXBsO1xuICAgIH1cbiAgICByZWFkQWxsKCkge1xuICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhdGNoZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX2FzeW5jVmFsdWVzKHRoaXMpLCBfYzsgX2MgPSB5aWVsZCBfYi5uZXh0KCksICFfYy5kb25lOykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXRjaCA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBiYXRjaGVzLnB1c2goYmF0Y2gpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgeWllbGQgX2EuY2FsbChfYik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBiYXRjaGVzO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7IHRocm93IG5ldyBFcnJvcihgQXN5bmNSZWNvcmRCYXRjaFN0cmVhbVJlYWRlciBpcyBub3QgSXRlcmFibGVgKTsgfVxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7IHJldHVybiB0aGlzLl9pbXBsW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOyB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFJlY29yZEJhdGNoRmlsZVJlYWRlciBleHRlbmRzIFJlY29yZEJhdGNoU3RyZWFtUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihfaW1wbCkge1xuICAgICAgICBzdXBlcihfaW1wbCk7XG4gICAgICAgIHRoaXMuX2ltcGwgPSBfaW1wbDtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEFzeW5jUmVjb3JkQmF0Y2hGaWxlUmVhZGVyIGV4dGVuZHMgQXN5bmNSZWNvcmRCYXRjaFN0cmVhbVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IoX2ltcGwpIHtcbiAgICAgICAgc3VwZXIoX2ltcGwpO1xuICAgICAgICB0aGlzLl9pbXBsID0gX2ltcGw7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmNsYXNzIFJlY29yZEJhdGNoUmVhZGVySW1wbCB7XG4gICAgY29uc3RydWN0b3IoZGljdGlvbmFyaWVzID0gbmV3IE1hcCgpKSB7XG4gICAgICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYXV0b0Rlc3Ryb3kgPSB0cnVlO1xuICAgICAgICB0aGlzLl9kaWN0aW9uYXJ5SW5kZXggPSAwO1xuICAgICAgICB0aGlzLl9yZWNvcmRCYXRjaEluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJpZXMgPSBkaWN0aW9uYXJpZXM7XG4gICAgfVxuICAgIGdldCBudW1EaWN0aW9uYXJpZXMoKSB7IHJldHVybiB0aGlzLl9kaWN0aW9uYXJ5SW5kZXg7IH1cbiAgICBnZXQgbnVtUmVjb3JkQmF0Y2hlcygpIHsgcmV0dXJuIHRoaXMuX3JlY29yZEJhdGNoSW5kZXg7IH1cbiAgICBpc1N5bmMoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlzQXN5bmMoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlzRmlsZSgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaXNTdHJlYW0oKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHJlc2V0KHNjaGVtYSkge1xuICAgICAgICB0aGlzLl9kaWN0aW9uYXJ5SW5kZXggPSAwO1xuICAgICAgICB0aGlzLl9yZWNvcmRCYXRjaEluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgICAgIHRoaXMuZGljdGlvbmFyaWVzID0gbmV3IE1hcCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgX2xvYWRSZWNvcmRCYXRjaChoZWFkZXIsIGJvZHkpIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLl9sb2FkVmVjdG9ycyhoZWFkZXIsIGJvZHksIHRoaXMuc2NoZW1hLmZpZWxkcyk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBtYWtlRGF0YSh7IHR5cGU6IG5ldyBTdHJ1Y3QodGhpcy5zY2hlbWEuZmllbGRzKSwgbGVuZ3RoOiBoZWFkZXIubGVuZ3RoLCBjaGlsZHJlbiB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWNvcmRCYXRjaCh0aGlzLnNjaGVtYSwgZGF0YSk7XG4gICAgfVxuICAgIF9sb2FkRGljdGlvbmFyeUJhdGNoKGhlYWRlciwgYm9keSkge1xuICAgICAgICBjb25zdCB7IGlkLCBpc0RlbHRhIH0gPSBoZWFkZXI7XG4gICAgICAgIGNvbnN0IHsgZGljdGlvbmFyaWVzLCBzY2hlbWEgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGRpY3Rpb25hcnkgPSBkaWN0aW9uYXJpZXMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGlzRGVsdGEgfHwgIWRpY3Rpb25hcnkpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBzY2hlbWEuZGljdGlvbmFyaWVzLmdldChpZCk7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5fbG9hZFZlY3RvcnMoaGVhZGVyLmRhdGEsIGJvZHksIFt0eXBlXSk7XG4gICAgICAgICAgICByZXR1cm4gKGRpY3Rpb25hcnkgJiYgaXNEZWx0YSA/IGRpY3Rpb25hcnkuY29uY2F0KG5ldyBWZWN0b3IoZGF0YSkpIDpcbiAgICAgICAgICAgICAgICBuZXcgVmVjdG9yKGRhdGEpKS5tZW1vaXplKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRpY3Rpb25hcnkubWVtb2l6ZSgpO1xuICAgIH1cbiAgICBfbG9hZFZlY3RvcnMoaGVhZGVyLCBib2R5LCB0eXBlcykge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvckxvYWRlcihib2R5LCBoZWFkZXIubm9kZXMsIGhlYWRlci5idWZmZXJzLCB0aGlzLmRpY3Rpb25hcmllcykudmlzaXRNYW55KHR5cGVzKTtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuY2xhc3MgUmVjb3JkQmF0Y2hTdHJlYW1SZWFkZXJJbXBsIGV4dGVuZHMgUmVjb3JkQmF0Y2hSZWFkZXJJbXBsIHtcbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIGRpY3Rpb25hcmllcykge1xuICAgICAgICBzdXBlcihkaWN0aW9uYXJpZXMpO1xuICAgICAgICB0aGlzLl9yZWFkZXIgPSAhaXNBcnJvd0pTT04oc291cmNlKVxuICAgICAgICAgICAgPyBuZXcgTWVzc2FnZVJlYWRlcih0aGlzLl9oYW5kbGUgPSBzb3VyY2UpXG4gICAgICAgICAgICA6IG5ldyBKU09OTWVzc2FnZVJlYWRlcih0aGlzLl9oYW5kbGUgPSBzb3VyY2UpO1xuICAgIH1cbiAgICBpc1N5bmMoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaXNTdHJlYW0oKSB7IHJldHVybiB0cnVlOyB9XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBjYW5jZWwoKSB7XG4gICAgICAgIGlmICghdGhpcy5jbG9zZWQgJiYgKHRoaXMuY2xvc2VkID0gdHJ1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKS5fcmVhZGVyLnJldHVybigpO1xuICAgICAgICAgICAgdGhpcy5fcmVhZGVyID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyaWVzID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvcGVuKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5hdXRvRGVzdHJveSA9IHNob3VsZEF1dG9EZXN0cm95KHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKCEodGhpcy5zY2hlbWEgfHwgKHRoaXMuc2NoZW1hID0gdGhpcy5fcmVhZGVyLnJlYWRTY2hlbWEoKSkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhyb3codmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCAmJiB0aGlzLmF1dG9EZXN0cm95ICYmICh0aGlzLmNsb3NlZCA9IHRydWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNldCgpLl9yZWFkZXIudGhyb3codmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBJVEVSQVRPUl9ET05FO1xuICAgIH1cbiAgICByZXR1cm4odmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCAmJiB0aGlzLmF1dG9EZXN0cm95ICYmICh0aGlzLmNsb3NlZCA9IHRydWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNldCgpLl9yZWFkZXIucmV0dXJuKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSVRFUkFUT1JfRE9ORTtcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gSVRFUkFUT1JfRE9ORTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWVzc2FnZTtcbiAgICAgICAgY29uc3QgeyBfcmVhZGVyOiByZWFkZXIgfSA9IHRoaXM7XG4gICAgICAgIHdoaWxlIChtZXNzYWdlID0gdGhpcy5fcmVhZE5leHRNZXNzYWdlQW5kVmFsaWRhdGUoKSkge1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaXNTY2hlbWEoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXQobWVzc2FnZS5oZWFkZXIoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtZXNzYWdlLmlzUmVjb3JkQmF0Y2goKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlY29yZEJhdGNoSW5kZXgrKztcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXIgPSBtZXNzYWdlLmhlYWRlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHJlYWRlci5yZWFkTWVzc2FnZUJvZHkobWVzc2FnZS5ib2R5TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRCYXRjaCA9IHRoaXMuX2xvYWRSZWNvcmRCYXRjaChoZWFkZXIsIGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiByZWNvcmRCYXRjaCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWVzc2FnZS5pc0RpY3Rpb25hcnlCYXRjaCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGljdGlvbmFyeUluZGV4Kys7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gbWVzc2FnZS5oZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSByZWFkZXIucmVhZE1lc3NhZ2VCb2R5KG1lc3NhZ2UuYm9keUxlbmd0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yID0gdGhpcy5fbG9hZERpY3Rpb25hcnlCYXRjaChoZWFkZXIsIGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJpZXMuc2V0KGhlYWRlci5pZCwgdmVjdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zY2hlbWEgJiYgdGhpcy5fcmVjb3JkQmF0Y2hJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fcmVjb3JkQmF0Y2hJbmRleCsrO1xuICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBuZXcgX0ludGVybmFsRW1wdHlQbGFjZWhvbGRlclJlY29yZEJhdGNoKHRoaXMuc2NoZW1hKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJldHVybigpO1xuICAgIH1cbiAgICBfcmVhZE5leHRNZXNzYWdlQW5kVmFsaWRhdGUodHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGVyLnJlYWRNZXNzYWdlKHR5cGUpO1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5jbGFzcyBBc3luY1JlY29yZEJhdGNoU3RyZWFtUmVhZGVySW1wbCBleHRlbmRzIFJlY29yZEJhdGNoUmVhZGVySW1wbCB7XG4gICAgY29uc3RydWN0b3Ioc291cmNlLCBkaWN0aW9uYXJpZXMpIHtcbiAgICAgICAgc3VwZXIoZGljdGlvbmFyaWVzKTtcbiAgICAgICAgdGhpcy5fcmVhZGVyID0gbmV3IEFzeW5jTWVzc2FnZVJlYWRlcih0aGlzLl9oYW5kbGUgPSBzb3VyY2UpO1xuICAgIH1cbiAgICBpc0FzeW5jKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGlzU3RyZWFtKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBjYW5jZWwoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2xvc2VkICYmICh0aGlzLmNsb3NlZCA9IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgdGhpcy5yZXNldCgpLl9yZWFkZXIucmV0dXJuKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVhZGVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmRpY3Rpb25hcmllcyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvcGVuKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dG9EZXN0cm95ID0gc2hvdWxkQXV0b0Rlc3Ryb3kodGhpcywgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgaWYgKCEodGhpcy5zY2hlbWEgfHwgKHRoaXMuc2NoZW1hID0gKHlpZWxkIHRoaXMuX3JlYWRlci5yZWFkU2NoZW1hKCkpKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgdGhpcy5jYW5jZWwoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRocm93KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2xvc2VkICYmIHRoaXMuYXV0b0Rlc3Ryb3kgJiYgKHRoaXMuY2xvc2VkID0gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQgdGhpcy5yZXNldCgpLl9yZWFkZXIudGhyb3codmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIElURVJBVE9SX0RPTkU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jbG9zZWQgJiYgdGhpcy5hdXRvRGVzdHJveSAmJiAodGhpcy5jbG9zZWQgPSB0cnVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCB0aGlzLnJlc2V0KCkuX3JlYWRlci5yZXR1cm4odmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIElURVJBVE9SX0RPTkU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBuZXh0KCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIElURVJBVE9SX0RPTkU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbWVzc2FnZTtcbiAgICAgICAgICAgIGNvbnN0IHsgX3JlYWRlcjogcmVhZGVyIH0gPSB0aGlzO1xuICAgICAgICAgICAgd2hpbGUgKG1lc3NhZ2UgPSB5aWVsZCB0aGlzLl9yZWFkTmV4dE1lc3NhZ2VBbmRWYWxpZGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaXNTY2hlbWEoKSkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLnJlc2V0KG1lc3NhZ2UuaGVhZGVyKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtZXNzYWdlLmlzUmVjb3JkQmF0Y2goKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWNvcmRCYXRjaEluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IG1lc3NhZ2UuaGVhZGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHlpZWxkIHJlYWRlci5yZWFkTWVzc2FnZUJvZHkobWVzc2FnZS5ib2R5TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkQmF0Y2ggPSB0aGlzLl9sb2FkUmVjb3JkQmF0Y2goaGVhZGVyLCBidWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IHJlY29yZEJhdGNoIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuaXNEaWN0aW9uYXJ5QmF0Y2goKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaWN0aW9uYXJ5SW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gbWVzc2FnZS5oZWFkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0geWllbGQgcmVhZGVyLnJlYWRNZXNzYWdlQm9keShtZXNzYWdlLmJvZHlMZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3IgPSB0aGlzLl9sb2FkRGljdGlvbmFyeUJhdGNoKGhlYWRlciwgYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJpZXMuc2V0KGhlYWRlci5pZCwgdmVjdG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zY2hlbWEgJiYgdGhpcy5fcmVjb3JkQmF0Y2hJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlY29yZEJhdGNoSW5kZXgrKztcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG5ldyBfSW50ZXJuYWxFbXB0eVBsYWNlaG9sZGVyUmVjb3JkQmF0Y2godGhpcy5zY2hlbWEpIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geWllbGQgdGhpcy5yZXR1cm4oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9yZWFkTmV4dE1lc3NhZ2VBbmRWYWxpZGF0ZSh0eXBlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4geWllbGQgdGhpcy5fcmVhZGVyLnJlYWRNZXNzYWdlKHR5cGUpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuY2xhc3MgUmVjb3JkQmF0Y2hGaWxlUmVhZGVySW1wbCBleHRlbmRzIFJlY29yZEJhdGNoU3RyZWFtUmVhZGVySW1wbCB7XG4gICAgY29uc3RydWN0b3Ioc291cmNlLCBkaWN0aW9uYXJpZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlIGluc3RhbmNlb2YgUmFuZG9tQWNjZXNzRmlsZSA/IHNvdXJjZSA6IG5ldyBSYW5kb21BY2Nlc3NGaWxlKHNvdXJjZSksIGRpY3Rpb25hcmllcyk7XG4gICAgfVxuICAgIGdldCBmb290ZXIoKSB7IHJldHVybiB0aGlzLl9mb290ZXI7IH1cbiAgICBnZXQgbnVtRGljdGlvbmFyaWVzKCkgeyByZXR1cm4gdGhpcy5fZm9vdGVyID8gdGhpcy5fZm9vdGVyLm51bURpY3Rpb25hcmllcyA6IDA7IH1cbiAgICBnZXQgbnVtUmVjb3JkQmF0Y2hlcygpIHsgcmV0dXJuIHRoaXMuX2Zvb3RlciA/IHRoaXMuX2Zvb3Rlci5udW1SZWNvcmRCYXRjaGVzIDogMDsgfVxuICAgIGlzU3luYygpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBpc0ZpbGUoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgb3BlbihvcHRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy5jbG9zZWQgJiYgIXRoaXMuX2Zvb3Rlcikge1xuICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSAodGhpcy5fZm9vdGVyID0gdGhpcy5fcmVhZEZvb3RlcigpKS5zY2hlbWE7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJsb2NrIG9mIHRoaXMuX2Zvb3Rlci5kaWN0aW9uYXJ5QmF0Y2hlcygpKSB7XG4gICAgICAgICAgICAgICAgYmxvY2sgJiYgdGhpcy5fcmVhZERpY3Rpb25hcnlCYXRjaCh0aGlzLl9kaWN0aW9uYXJ5SW5kZXgrKyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLm9wZW4ob3B0aW9ucyk7XG4gICAgfVxuICAgIHJlYWRSZWNvcmRCYXRjaChpbmRleCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9mb290ZXIpIHtcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJsb2NrID0gKF9hID0gdGhpcy5fZm9vdGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0UmVjb3JkQmF0Y2goaW5kZXgpO1xuICAgICAgICBpZiAoYmxvY2sgJiYgdGhpcy5faGFuZGxlLnNlZWsoYmxvY2sub2Zmc2V0KSkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuX3JlYWRlci5yZWFkTWVzc2FnZShNZXNzYWdlSGVhZGVyLlJlY29yZEJhdGNoKTtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lc3NhZ2UuaXNSZWNvcmRCYXRjaCgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gbWVzc2FnZS5oZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLl9yZWFkZXIucmVhZE1lc3NhZ2VCb2R5KG1lc3NhZ2UuYm9keUxlbmd0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkQmF0Y2ggPSB0aGlzLl9sb2FkUmVjb3JkQmF0Y2goaGVhZGVyLCBidWZmZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZWNvcmRCYXRjaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgX3JlYWREaWN0aW9uYXJ5QmF0Y2goaW5kZXgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBibG9jayA9IChfYSA9IHRoaXMuX2Zvb3RlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdldERpY3Rpb25hcnlCYXRjaChpbmRleCk7XG4gICAgICAgIGlmIChibG9jayAmJiB0aGlzLl9oYW5kbGUuc2VlayhibG9jay5vZmZzZXQpKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5fcmVhZGVyLnJlYWRNZXNzYWdlKE1lc3NhZ2VIZWFkZXIuRGljdGlvbmFyeUJhdGNoKTtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lc3NhZ2UuaXNEaWN0aW9uYXJ5QmF0Y2goKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IG1lc3NhZ2UuaGVhZGVyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5fcmVhZGVyLnJlYWRNZXNzYWdlQm9keShtZXNzYWdlLmJvZHlMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvciA9IHRoaXMuX2xvYWREaWN0aW9uYXJ5QmF0Y2goaGVhZGVyLCBidWZmZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyaWVzLnNldChoZWFkZXIuaWQsIHZlY3Rvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgX3JlYWRGb290ZXIoKSB7XG4gICAgICAgIGNvbnN0IHsgX2hhbmRsZSB9ID0gdGhpcztcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gX2hhbmRsZS5zaXplIC0gbWFnaWNBbmRQYWRkaW5nO1xuICAgICAgICBjb25zdCBsZW5ndGggPSBfaGFuZGxlLnJlYWRJbnQzMihvZmZzZXQpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSBfaGFuZGxlLnJlYWRBdChvZmZzZXQgLSBsZW5ndGgsIGxlbmd0aCk7XG4gICAgICAgIHJldHVybiBGb290ZXIuZGVjb2RlKGJ1ZmZlcik7XG4gICAgfVxuICAgIF9yZWFkTmV4dE1lc3NhZ2VBbmRWYWxpZGF0ZSh0eXBlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLl9mb290ZXIpIHtcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9mb290ZXIgJiYgdGhpcy5fcmVjb3JkQmF0Y2hJbmRleCA8IHRoaXMubnVtUmVjb3JkQmF0Y2hlcykge1xuICAgICAgICAgICAgY29uc3QgYmxvY2sgPSAoX2EgPSB0aGlzLl9mb290ZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRSZWNvcmRCYXRjaCh0aGlzLl9yZWNvcmRCYXRjaEluZGV4KTtcbiAgICAgICAgICAgIGlmIChibG9jayAmJiB0aGlzLl9oYW5kbGUuc2VlayhibG9jay5vZmZzZXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRlci5yZWFkTWVzc2FnZSh0eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuY2xhc3MgQXN5bmNSZWNvcmRCYXRjaEZpbGVSZWFkZXJJbXBsIGV4dGVuZHMgQXN5bmNSZWNvcmRCYXRjaFN0cmVhbVJlYWRlckltcGwge1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgLi4ucmVzdCkge1xuICAgICAgICBjb25zdCBieXRlTGVuZ3RoID0gdHlwZW9mIHJlc3RbMF0gIT09ICdudW1iZXInID8gcmVzdC5zaGlmdCgpIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBkaWN0aW9uYXJpZXMgPSByZXN0WzBdIGluc3RhbmNlb2YgTWFwID8gcmVzdC5zaGlmdCgpIDogdW5kZWZpbmVkO1xuICAgICAgICBzdXBlcihzb3VyY2UgaW5zdGFuY2VvZiBBc3luY1JhbmRvbUFjY2Vzc0ZpbGUgPyBzb3VyY2UgOiBuZXcgQXN5bmNSYW5kb21BY2Nlc3NGaWxlKHNvdXJjZSwgYnl0ZUxlbmd0aCksIGRpY3Rpb25hcmllcyk7XG4gICAgfVxuICAgIGdldCBmb290ZXIoKSB7IHJldHVybiB0aGlzLl9mb290ZXI7IH1cbiAgICBnZXQgbnVtRGljdGlvbmFyaWVzKCkgeyByZXR1cm4gdGhpcy5fZm9vdGVyID8gdGhpcy5fZm9vdGVyLm51bURpY3Rpb25hcmllcyA6IDA7IH1cbiAgICBnZXQgbnVtUmVjb3JkQmF0Y2hlcygpIHsgcmV0dXJuIHRoaXMuX2Zvb3RlciA/IHRoaXMuX2Zvb3Rlci5udW1SZWNvcmRCYXRjaGVzIDogMDsgfVxuICAgIGlzRmlsZSgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBpc0FzeW5jKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIG9wZW4ob3B0aW9ucykge1xuICAgICAgICBjb25zdCBfc3VwZXIgPSBPYmplY3QuY3JlYXRlKG51bGwsIHtcbiAgICAgICAgICAgIG9wZW46IHsgZ2V0OiAoKSA9PiBzdXBlci5vcGVuIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2xvc2VkICYmICF0aGlzLl9mb290ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYSA9ICh0aGlzLl9mb290ZXIgPSB5aWVsZCB0aGlzLl9yZWFkRm9vdGVyKCkpLnNjaGVtYTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGJsb2NrIG9mIHRoaXMuX2Zvb3Rlci5kaWN0aW9uYXJ5QmF0Y2hlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrICYmICh5aWVsZCB0aGlzLl9yZWFkRGljdGlvbmFyeUJhdGNoKHRoaXMuX2RpY3Rpb25hcnlJbmRleCsrKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIF9zdXBlci5vcGVuLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWFkUmVjb3JkQmF0Y2goaW5kZXgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2Zvb3Rlcikge1xuICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMub3BlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYmxvY2sgPSAoX2EgPSB0aGlzLl9mb290ZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRSZWNvcmRCYXRjaChpbmRleCk7XG4gICAgICAgICAgICBpZiAoYmxvY2sgJiYgKHlpZWxkIHRoaXMuX2hhbmRsZS5zZWVrKGJsb2NrLm9mZnNldCkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHlpZWxkIHRoaXMuX3JlYWRlci5yZWFkTWVzc2FnZShNZXNzYWdlSGVhZGVyLlJlY29yZEJhdGNoKTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSA9PT0gbnVsbCB8fCBtZXNzYWdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXNzYWdlLmlzUmVjb3JkQmF0Y2goKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXIgPSBtZXNzYWdlLmhlYWRlcigpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSB5aWVsZCB0aGlzLl9yZWFkZXIucmVhZE1lc3NhZ2VCb2R5KG1lc3NhZ2UuYm9keUxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZEJhdGNoID0gdGhpcy5fbG9hZFJlY29yZEJhdGNoKGhlYWRlciwgYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZEJhdGNoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3JlYWREaWN0aW9uYXJ5QmF0Y2goaW5kZXgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgYmxvY2sgPSAoX2EgPSB0aGlzLl9mb290ZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXREaWN0aW9uYXJ5QmF0Y2goaW5kZXgpO1xuICAgICAgICAgICAgaWYgKGJsb2NrICYmICh5aWVsZCB0aGlzLl9oYW5kbGUuc2VlayhibG9jay5vZmZzZXQpKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB5aWVsZCB0aGlzLl9yZWFkZXIucmVhZE1lc3NhZ2UoTWVzc2FnZUhlYWRlci5EaWN0aW9uYXJ5QmF0Y2gpO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lc3NhZ2UuaXNEaWN0aW9uYXJ5QmF0Y2goKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXIgPSBtZXNzYWdlLmhlYWRlcigpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSB5aWVsZCB0aGlzLl9yZWFkZXIucmVhZE1lc3NhZ2VCb2R5KG1lc3NhZ2UuYm9keUxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvciA9IHRoaXMuX2xvYWREaWN0aW9uYXJ5QmF0Y2goaGVhZGVyLCBidWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpY3Rpb25hcmllcy5zZXQoaGVhZGVyLmlkLCB2ZWN0b3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9yZWFkRm9vdGVyKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgeyBfaGFuZGxlIH0gPSB0aGlzO1xuICAgICAgICAgICAgX2hhbmRsZS5fcGVuZGluZyAmJiAoeWllbGQgX2hhbmRsZS5fcGVuZGluZyk7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBfaGFuZGxlLnNpemUgLSBtYWdpY0FuZFBhZGRpbmc7XG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSB5aWVsZCBfaGFuZGxlLnJlYWRJbnQzMihvZmZzZXQpO1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0geWllbGQgX2hhbmRsZS5yZWFkQXQob2Zmc2V0IC0gbGVuZ3RoLCBsZW5ndGgpO1xuICAgICAgICAgICAgcmV0dXJuIEZvb3Rlci5kZWNvZGUoYnVmZmVyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9yZWFkTmV4dE1lc3NhZ2VBbmRWYWxpZGF0ZSh0eXBlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2Zvb3Rlcikge1xuICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMub3BlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2Zvb3RlciAmJiB0aGlzLl9yZWNvcmRCYXRjaEluZGV4IDwgdGhpcy5udW1SZWNvcmRCYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmxvY2sgPSB0aGlzLl9mb290ZXIuZ2V0UmVjb3JkQmF0Y2godGhpcy5fcmVjb3JkQmF0Y2hJbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrICYmICh5aWVsZCB0aGlzLl9oYW5kbGUuc2VlayhibG9jay5vZmZzZXQpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geWllbGQgdGhpcy5fcmVhZGVyLnJlYWRNZXNzYWdlKHR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuY2xhc3MgUmVjb3JkQmF0Y2hKU09OUmVhZGVySW1wbCBleHRlbmRzIFJlY29yZEJhdGNoU3RyZWFtUmVhZGVySW1wbCB7XG4gICAgY29uc3RydWN0b3Ioc291cmNlLCBkaWN0aW9uYXJpZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBkaWN0aW9uYXJpZXMpO1xuICAgIH1cbiAgICBfbG9hZFZlY3RvcnMoaGVhZGVyLCBib2R5LCB0eXBlcykge1xuICAgICAgICByZXR1cm4gbmV3IEpTT05WZWN0b3JMb2FkZXIoYm9keSwgaGVhZGVyLm5vZGVzLCBoZWFkZXIuYnVmZmVycywgdGhpcy5kaWN0aW9uYXJpZXMpLnZpc2l0TWFueSh0eXBlcyk7XG4gICAgfVxufVxuLy9cbi8vIERlZmluZSBzb21lIGhlbHBlciBmdW5jdGlvbnMgYW5kIHN0YXRpYyBpbXBsZW1lbnRhdGlvbnMgZG93biBoZXJlLiBUaGVyZSdzXG4vLyBhIGJpdCBvZiBicmFuY2hpbmcgaW4gdGhlIHN0YXRpYyBtZXRob2RzIHRoYXQgY2FuIGxlYWQgdG8gdGhlIHNhbWUgcm91dGluZXNcbi8vIGJlaW5nIGV4ZWN1dGVkLCBzbyB3ZSd2ZSBicm9rZW4gdGhvc2Ugb3V0IGhlcmUgZm9yIHJlYWRhYmlsaXR5LlxuLy9cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBzaG91bGRBdXRvRGVzdHJveShzZWxmLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgJiYgKHR5cGVvZiBvcHRpb25zWydhdXRvRGVzdHJveSddID09PSAnYm9vbGVhbicpID8gb3B0aW9uc1snYXV0b0Rlc3Ryb3knXSA6IHNlbGZbJ2F1dG9EZXN0cm95J107XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24qIHJlYWRBbGxTeW5jKHNvdXJjZSkge1xuICAgIGNvbnN0IHJlYWRlciA9IFJlY29yZEJhdGNoUmVhZGVyLmZyb20oc291cmNlKTtcbiAgICB0cnkge1xuICAgICAgICBpZiAoIXJlYWRlci5vcGVuKHsgYXV0b0Rlc3Ryb3k6IGZhbHNlIH0pLmNsb3NlZCkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHlpZWxkIHJlYWRlcjtcbiAgICAgICAgICAgIH0gd2hpbGUgKCEocmVhZGVyLnJlc2V0KCkub3BlbigpKS5jbG9zZWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICByZWFkZXIuY2FuY2VsKCk7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIHJlYWRBbGxBc3luYyhzb3VyY2UpIHtcbiAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiByZWFkQWxsQXN5bmNfMSgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0geWllbGQgX19hd2FpdChSZWNvcmRCYXRjaFJlYWRlci5mcm9tKHNvdXJjZSkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCEoeWllbGQgX19hd2FpdChyZWFkZXIub3Blbih7IGF1dG9EZXN0cm95OiBmYWxzZSB9KSkpLmNsb3NlZCkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgeWllbGQgX19hd2FpdChyZWFkZXIpO1xuICAgICAgICAgICAgICAgIH0gd2hpbGUgKCEoeWllbGQgX19hd2FpdChyZWFkZXIucmVzZXQoKS5vcGVuKCkpKS5jbG9zZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgeWllbGQgX19hd2FpdChyZWFkZXIuY2FuY2VsKCkpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZnJvbUFycm93SlNPTihzb3VyY2UpIHtcbiAgICByZXR1cm4gbmV3IFJlY29yZEJhdGNoU3RyZWFtUmVhZGVyKG5ldyBSZWNvcmRCYXRjaEpTT05SZWFkZXJJbXBsKHNvdXJjZSkpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGZyb21CeXRlU3RyZWFtKHNvdXJjZSkge1xuICAgIGNvbnN0IGJ5dGVzID0gc291cmNlLnBlZWsoKG1hZ2ljTGVuZ3RoICsgNykgJiB+Nyk7XG4gICAgcmV0dXJuIGJ5dGVzICYmIGJ5dGVzLmJ5dGVMZW5ndGggPj0gNCA/ICFjaGVja0Zvck1hZ2ljQXJyb3dTdHJpbmcoYnl0ZXMpXG4gICAgICAgID8gbmV3IFJlY29yZEJhdGNoU3RyZWFtUmVhZGVyKG5ldyBSZWNvcmRCYXRjaFN0cmVhbVJlYWRlckltcGwoc291cmNlKSlcbiAgICAgICAgOiBuZXcgUmVjb3JkQmF0Y2hGaWxlUmVhZGVyKG5ldyBSZWNvcmRCYXRjaEZpbGVSZWFkZXJJbXBsKHNvdXJjZS5yZWFkKCkpKVxuICAgICAgICA6IG5ldyBSZWNvcmRCYXRjaFN0cmVhbVJlYWRlcihuZXcgUmVjb3JkQmF0Y2hTdHJlYW1SZWFkZXJJbXBsKGZ1bmN0aW9uKiAoKSB7IH0oKSkpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGZyb21Bc3luY0J5dGVTdHJlYW0oc291cmNlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYnl0ZXMgPSB5aWVsZCBzb3VyY2UucGVlaygobWFnaWNMZW5ndGggKyA3KSAmIH43KTtcbiAgICAgICAgcmV0dXJuIGJ5dGVzICYmIGJ5dGVzLmJ5dGVMZW5ndGggPj0gNCA/ICFjaGVja0Zvck1hZ2ljQXJyb3dTdHJpbmcoYnl0ZXMpXG4gICAgICAgICAgICA/IG5ldyBBc3luY1JlY29yZEJhdGNoU3RyZWFtUmVhZGVyKG5ldyBBc3luY1JlY29yZEJhdGNoU3RyZWFtUmVhZGVySW1wbChzb3VyY2UpKVxuICAgICAgICAgICAgOiBuZXcgUmVjb3JkQmF0Y2hGaWxlUmVhZGVyKG5ldyBSZWNvcmRCYXRjaEZpbGVSZWFkZXJJbXBsKHlpZWxkIHNvdXJjZS5yZWFkKCkpKVxuICAgICAgICAgICAgOiBuZXcgQXN5bmNSZWNvcmRCYXRjaFN0cmVhbVJlYWRlcihuZXcgQXN5bmNSZWNvcmRCYXRjaFN0cmVhbVJlYWRlckltcGwoZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiAoKSB7IH0pOyB9KCkpKTtcbiAgICB9KTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBmcm9tRmlsZUhhbmRsZShzb3VyY2UpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCB7IHNpemUgfSA9IHlpZWxkIHNvdXJjZS5zdGF0KCk7XG4gICAgICAgIGNvbnN0IGZpbGUgPSBuZXcgQXN5bmNSYW5kb21BY2Nlc3NGaWxlKHNvdXJjZSwgc2l6ZSk7XG4gICAgICAgIGlmIChzaXplID49IG1hZ2ljWDJBbmRQYWRkaW5nICYmIGNoZWNrRm9yTWFnaWNBcnJvd1N0cmluZyh5aWVsZCBmaWxlLnJlYWRBdCgwLCAobWFnaWNMZW5ndGggKyA3KSAmIH43KSkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQXN5bmNSZWNvcmRCYXRjaEZpbGVSZWFkZXIobmV3IEFzeW5jUmVjb3JkQmF0Y2hGaWxlUmVhZGVySW1wbChmaWxlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBBc3luY1JlY29yZEJhdGNoU3RyZWFtUmVhZGVyKG5ldyBBc3luY1JlY29yZEJhdGNoU3RyZWFtUmVhZGVySW1wbChmaWxlKSk7XG4gICAgfSk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlYWRlci5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IFRhYmxlIH0gZnJvbSAnLi4vdGFibGUubWpzJztcbmltcG9ydCB7IGlzUHJvbWlzZSB9IGZyb20gJy4uL3V0aWwvY29tcGF0Lm1qcyc7XG5pbXBvcnQgeyBSZWNvcmRCYXRjaFJlYWRlciB9IGZyb20gJy4vcmVhZGVyLm1qcyc7XG5pbXBvcnQgeyBSZWNvcmRCYXRjaEZpbGVXcml0ZXIsIFJlY29yZEJhdGNoU3RyZWFtV3JpdGVyIH0gZnJvbSAnLi93cml0ZXIubWpzJztcbmV4cG9ydCBmdW5jdGlvbiB0YWJsZUZyb21JUEMoaW5wdXQpIHtcbiAgICBjb25zdCByZWFkZXIgPSBSZWNvcmRCYXRjaFJlYWRlci5mcm9tKGlucHV0KTtcbiAgICBpZiAoaXNQcm9taXNlKHJlYWRlcikpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRlci50aGVuKChyZWFkZXIpID0+IHRhYmxlRnJvbUlQQyhyZWFkZXIpKTtcbiAgICB9XG4gICAgaWYgKHJlYWRlci5pc0FzeW5jKCkpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkQWxsKCkudGhlbigoeHMpID0+IG5ldyBUYWJsZSh4cykpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRhYmxlKHJlYWRlci5yZWFkQWxsKCkpO1xufVxuLyoqXG4gKiBTZXJpYWxpemUgYSB7QGxpbmsgVGFibGV9IHRvIHRoZSBJUEMgZm9ybWF0LiBUaGlzIGZ1bmN0aW9uIGlzIGEgY29udmVuaWVuY2VcbiAqIHdyYXBwZXIgZm9yIHtAbGluayBSZWNvcmRCYXRjaFN0cmVhbVdyaXRlcn0gYW5kIHtAbGluayBSZWNvcmRCYXRjaEZpbGVXcml0ZXJ9LlxuICogT3Bwb3NpdGUgb2Yge0BsaW5rIHRhYmxlRnJvbUlQQ30uXG4gKlxuICogQHBhcmFtIHRhYmxlIFRoZSBUYWJsZSB0byBzZXJpYWxpemUuXG4gKiBAcGFyYW0gdHlwZSBXaGV0aGVyIHRvIHNlcmlhbGl6ZSB0aGUgVGFibGUgYXMgYSBmaWxlIG9yIGEgc3RyZWFtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFibGVUb0lQQyh0YWJsZSwgdHlwZSA9ICdzdHJlYW0nKSB7XG4gICAgcmV0dXJuICh0eXBlID09PSAnc3RyZWFtJyA/IFJlY29yZEJhdGNoU3RyZWFtV3JpdGVyIDogUmVjb3JkQmF0Y2hGaWxlV3JpdGVyKVxuICAgICAgICAud3JpdGVBbGwodGFibGUpXG4gICAgICAgIC50b1VpbnQ4QXJyYXkodHJ1ZSk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlcmlhbGl6YXRpb24ubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBfX2FzeW5jVmFsdWVzLCBfX2F3YWl0ZXIgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSAnLi4vdGFibGUubWpzJztcbmltcG9ydCB7IE1BR0lDIH0gZnJvbSAnLi9tZXNzYWdlLm1qcyc7XG5pbXBvcnQgeyBWZWN0b3IgfSBmcm9tICcuLi92ZWN0b3IubWpzJztcbmltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vdHlwZS5tanMnO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJy4vbWV0YWRhdGEvbWVzc2FnZS5tanMnO1xuaW1wb3J0ICogYXMgbWV0YWRhdGEgZnJvbSAnLi9tZXRhZGF0YS9tZXNzYWdlLm1qcyc7XG5pbXBvcnQgeyBGaWxlQmxvY2ssIEZvb3RlciB9IGZyb20gJy4vbWV0YWRhdGEvZmlsZS5tanMnO1xuaW1wb3J0IHsgTWVzc2FnZUhlYWRlciwgTWV0YWRhdGFWZXJzaW9uIH0gZnJvbSAnLi4vZW51bS5tanMnO1xuaW1wb3J0IHsgY29tcGFyZVNjaGVtYXMgfSBmcm9tICcuLi92aXNpdG9yL3R5cGVjb21wYXJhdG9yLm1qcyc7XG5pbXBvcnQgeyBBc3luY0J5dGVRdWV1ZSB9IGZyb20gJy4uL2lvL3N0cmVhbS5tanMnO1xuaW1wb3J0IHsgVmVjdG9yQXNzZW1ibGVyIH0gZnJvbSAnLi4vdmlzaXRvci92ZWN0b3Jhc3NlbWJsZXIubWpzJztcbmltcG9ydCB7IEpTT05UeXBlQXNzZW1ibGVyIH0gZnJvbSAnLi4vdmlzaXRvci9qc29udHlwZWFzc2VtYmxlci5tanMnO1xuaW1wb3J0IHsgSlNPTlZlY3RvckFzc2VtYmxlciB9IGZyb20gJy4uL3Zpc2l0b3IvanNvbnZlY3RvcmFzc2VtYmxlci5tanMnO1xuaW1wb3J0IHsgdG9VaW50OEFycmF5IH0gZnJvbSAnLi4vdXRpbC9idWZmZXIubWpzJztcbmltcG9ydCB7IFJlY29yZEJhdGNoLCBfSW50ZXJuYWxFbXB0eVBsYWNlaG9sZGVyUmVjb3JkQmF0Y2ggfSBmcm9tICcuLi9yZWNvcmRiYXRjaC5tanMnO1xuaW1wb3J0IHsgUmVhZGFibGVJbnRlcm9wIH0gZnJvbSAnLi4vaW8vaW50ZXJmYWNlcy5tanMnO1xuaW1wb3J0IHsgaXNQcm9taXNlLCBpc0FzeW5jSXRlcmFibGUsIGlzV3JpdGFibGVET01TdHJlYW0sIGlzV3JpdGFibGVOb2RlU3RyZWFtLCBpc0l0ZXJhYmxlLCBpc09iamVjdCB9IGZyb20gJy4uL3V0aWwvY29tcGF0Lm1qcyc7XG5leHBvcnQgY2xhc3MgUmVjb3JkQmF0Y2hXcml0ZXIgZXh0ZW5kcyBSZWFkYWJsZUludGVyb3Age1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fcG9zaXRpb24gPSAwO1xuICAgICAgICB0aGlzLl9zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5fc2luayA9IG5ldyBBc3luY0J5dGVRdWV1ZSgpO1xuICAgICAgICB0aGlzLl9zY2hlbWEgPSBudWxsO1xuICAgICAgICB0aGlzLl9kaWN0aW9uYXJ5QmxvY2tzID0gW107XG4gICAgICAgIHRoaXMuX3JlY29yZEJhdGNoQmxvY2tzID0gW107XG4gICAgICAgIHRoaXMuX2RpY3Rpb25hcnlEZWx0YU9mZnNldHMgPSBuZXcgTWFwKCk7XG4gICAgICAgIGlzT2JqZWN0KG9wdGlvbnMpIHx8IChvcHRpb25zID0geyBhdXRvRGVzdHJveTogdHJ1ZSwgd3JpdGVMZWdhY3lJcGNGb3JtYXQ6IGZhbHNlIH0pO1xuICAgICAgICB0aGlzLl9hdXRvRGVzdHJveSA9ICh0eXBlb2Ygb3B0aW9ucy5hdXRvRGVzdHJveSA9PT0gJ2Jvb2xlYW4nKSA/IG9wdGlvbnMuYXV0b0Rlc3Ryb3kgOiB0cnVlO1xuICAgICAgICB0aGlzLl93cml0ZUxlZ2FjeUlwY0Zvcm1hdCA9ICh0eXBlb2Ygb3B0aW9ucy53cml0ZUxlZ2FjeUlwY0Zvcm1hdCA9PT0gJ2Jvb2xlYW4nKSA/IG9wdGlvbnMud3JpdGVMZWdhY3lJcGNGb3JtYXQgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHN0YXRpYyB0aHJvdWdoTm9kZShvcHRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJ0aHJvdWdoTm9kZVwiIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudGApO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgdGhyb3VnaERPTShcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd3JpdGFibGVTdHJhdGVneSwgXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJlYWRhYmxlU3RyYXRlZ3kpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcInRocm91Z2hET01cIiBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnRgKTtcbiAgICB9XG4gICAgdG9TdHJpbmcoc3luYyA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaW5rLnRvU3RyaW5nKHN5bmMpO1xuICAgIH1cbiAgICB0b1VpbnQ4QXJyYXkoc3luYyA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaW5rLnRvVWludDhBcnJheShzeW5jKTtcbiAgICB9XG4gICAgd3JpdGVBbGwoaW5wdXQpIHtcbiAgICAgICAgaWYgKGlzUHJvbWlzZShpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC50aGVuKCh4KSA9PiB0aGlzLndyaXRlQWxsKHgpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0FzeW5jSXRlcmFibGUoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gd3JpdGVBbGxBc3luYyh0aGlzLCBpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlQWxsKHRoaXMsIGlucHV0KTtcbiAgICB9XG4gICAgZ2V0IGNsb3NlZCgpIHsgcmV0dXJuIHRoaXMuX3NpbmsuY2xvc2VkOyB9XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHsgcmV0dXJuIHRoaXMuX3NpbmtbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7IH1cbiAgICB0b0RPTVN0cmVhbShvcHRpb25zKSB7IHJldHVybiB0aGlzLl9zaW5rLnRvRE9NU3RyZWFtKG9wdGlvbnMpOyB9XG4gICAgdG9Ob2RlU3RyZWFtKG9wdGlvbnMpIHsgcmV0dXJuIHRoaXMuX3NpbmsudG9Ob2RlU3RyZWFtKG9wdGlvbnMpOyB9XG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2V0KCkuX3NpbmsuY2xvc2UoKTtcbiAgICB9XG4gICAgYWJvcnQocmVhc29uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2V0KCkuX3NpbmsuYWJvcnQocmVhc29uKTtcbiAgICB9XG4gICAgZmluaXNoKCkge1xuICAgICAgICB0aGlzLl9hdXRvRGVzdHJveSA/IHRoaXMuY2xvc2UoKSA6IHRoaXMucmVzZXQodGhpcy5fc2luaywgdGhpcy5fc2NoZW1hKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJlc2V0KHNpbmsgPSB0aGlzLl9zaW5rLCBzY2hlbWEgPSBudWxsKSB7XG4gICAgICAgIGlmICgoc2luayA9PT0gdGhpcy5fc2luaykgfHwgKHNpbmsgaW5zdGFuY2VvZiBBc3luY0J5dGVRdWV1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3NpbmsgPSBzaW5rO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc2luayA9IG5ldyBBc3luY0J5dGVRdWV1ZSgpO1xuICAgICAgICAgICAgaWYgKHNpbmsgJiYgaXNXcml0YWJsZURPTVN0cmVhbShzaW5rKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9ET01TdHJlYW0oeyB0eXBlOiAnYnl0ZXMnIH0pLnBpcGVUbyhzaW5rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNpbmsgJiYgaXNXcml0YWJsZU5vZGVTdHJlYW0oc2luaykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvTm9kZVN0cmVhbSh7IG9iamVjdE1vZGU6IGZhbHNlIH0pLnBpcGUoc2luayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3N0YXJ0ZWQgJiYgdGhpcy5fc2NoZW1hKSB7XG4gICAgICAgICAgICB0aGlzLl93cml0ZUZvb3Rlcih0aGlzLl9zY2hlbWEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZGljdGlvbmFyeUJsb2NrcyA9IFtdO1xuICAgICAgICB0aGlzLl9yZWNvcmRCYXRjaEJsb2NrcyA9IFtdO1xuICAgICAgICB0aGlzLl9kaWN0aW9uYXJ5RGVsdGFPZmZzZXRzID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAoIXNjaGVtYSB8fCAhKGNvbXBhcmVTY2hlbWFzKHNjaGVtYSwgdGhpcy5fc2NoZW1hKSkpIHtcbiAgICAgICAgICAgIGlmIChzY2hlbWEgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLl9zY2hlbWEgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dyaXRlU2NoZW1hKHNjaGVtYSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHdyaXRlKHBheWxvYWQpIHtcbiAgICAgICAgbGV0IHNjaGVtYSA9IG51bGw7XG4gICAgICAgIGlmICghdGhpcy5fc2luaykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNvcmRCYXRjaFdyaXRlciBpcyBjbG9zZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXlsb2FkID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaCgpICYmIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXlsb2FkIGluc3RhbmNlb2YgVGFibGUgJiYgIShzY2hlbWEgPSBwYXlsb2FkLnNjaGVtYSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaCgpICYmIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXlsb2FkIGluc3RhbmNlb2YgUmVjb3JkQmF0Y2ggJiYgIShzY2hlbWEgPSBwYXlsb2FkLnNjaGVtYSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaCgpICYmIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NoZW1hICYmICFjb21wYXJlU2NoZW1hcyhzY2hlbWEsIHRoaXMuX3NjaGVtYSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGFydGVkICYmIHRoaXMuX2F1dG9EZXN0cm95KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVzZXQodGhpcy5fc2luaywgc2NoZW1hKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF5bG9hZCBpbnN0YW5jZW9mIFJlY29yZEJhdGNoKSB7XG4gICAgICAgICAgICBpZiAoIShwYXlsb2FkIGluc3RhbmNlb2YgX0ludGVybmFsRW1wdHlQbGFjZWhvbGRlclJlY29yZEJhdGNoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dyaXRlUmVjb3JkQmF0Y2gocGF5bG9hZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGF5bG9hZCBpbnN0YW5jZW9mIFRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlQWxsKHBheWxvYWQuYmF0Y2hlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNJdGVyYWJsZShwYXlsb2FkKSkge1xuICAgICAgICAgICAgdGhpcy53cml0ZUFsbChwYXlsb2FkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfd3JpdGVNZXNzYWdlKG1lc3NhZ2UsIGFsaWdubWVudCA9IDgpIHtcbiAgICAgICAgY29uc3QgYSA9IGFsaWdubWVudCAtIDE7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IE1lc3NhZ2UuZW5jb2RlKG1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBmbGF0YnVmZmVyU2l6ZSA9IGJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgICAgICBjb25zdCBwcmVmaXhTaXplID0gIXRoaXMuX3dyaXRlTGVnYWN5SXBjRm9ybWF0ID8gOCA6IDQ7XG4gICAgICAgIGNvbnN0IGFsaWduZWRTaXplID0gKGZsYXRidWZmZXJTaXplICsgcHJlZml4U2l6ZSArIGEpICYgfmE7XG4gICAgICAgIGNvbnN0IG5QYWRkaW5nQnl0ZXMgPSBhbGlnbmVkU2l6ZSAtIGZsYXRidWZmZXJTaXplIC0gcHJlZml4U2l6ZTtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaGVhZGVyVHlwZSA9PT0gTWVzc2FnZUhlYWRlci5SZWNvcmRCYXRjaCkge1xuICAgICAgICAgICAgdGhpcy5fcmVjb3JkQmF0Y2hCbG9ja3MucHVzaChuZXcgRmlsZUJsb2NrKGFsaWduZWRTaXplLCBtZXNzYWdlLmJvZHlMZW5ndGgsIHRoaXMuX3Bvc2l0aW9uKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWVzc2FnZS5oZWFkZXJUeXBlID09PSBNZXNzYWdlSGVhZGVyLkRpY3Rpb25hcnlCYXRjaCkge1xuICAgICAgICAgICAgdGhpcy5fZGljdGlvbmFyeUJsb2Nrcy5wdXNoKG5ldyBGaWxlQmxvY2soYWxpZ25lZFNpemUsIG1lc3NhZ2UuYm9keUxlbmd0aCwgdGhpcy5fcG9zaXRpb24pKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBub3QgaW4gbGVnYWN5IHByZS0wLjE1LjAgbW9kZSwgd3JpdGUgdGhlIHN0cmVhbSBjb250aW51YXRpb24gaW5kaWNhdG9yXG4gICAgICAgIGlmICghdGhpcy5fd3JpdGVMZWdhY3lJcGNGb3JtYXQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dyaXRlKEludDMyQXJyYXkub2YoLTEpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXcml0ZSB0aGUgZmxhdGJ1ZmZlciBzaXplIHByZWZpeCBpbmNsdWRpbmcgcGFkZGluZ1xuICAgICAgICB0aGlzLl93cml0ZShJbnQzMkFycmF5Lm9mKGFsaWduZWRTaXplIC0gcHJlZml4U2l6ZSkpO1xuICAgICAgICAvLyBXcml0ZSB0aGUgZmxhdGJ1ZmZlclxuICAgICAgICBpZiAoZmxhdGJ1ZmZlclNpemUgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl93cml0ZShidWZmZXIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdyaXRlIGFueSBwYWRkaW5nXG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZVBhZGRpbmcoblBhZGRpbmdCeXRlcyk7XG4gICAgfVxuICAgIF93cml0ZShjaHVuaykge1xuICAgICAgICBpZiAodGhpcy5fc3RhcnRlZCkge1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gdG9VaW50OEFycmF5KGNodW5rKTtcbiAgICAgICAgICAgIGlmIChidWZmZXIgJiYgYnVmZmVyLmJ5dGVMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2luay53cml0ZShidWZmZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uICs9IGJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBfd3JpdGVTY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU1lc3NhZ2UoTWVzc2FnZS5mcm9tKHNjaGVtYSkpO1xuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgX3dyaXRlRm9vdGVyKHNjaGVtYSkge1xuICAgICAgICAvLyBlb3MgYnl0ZXNcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTGVnYWN5SXBjRm9ybWF0XG4gICAgICAgICAgICA/IHRoaXMuX3dyaXRlKEludDMyQXJyYXkub2YoMCkpXG4gICAgICAgICAgICA6IHRoaXMuX3dyaXRlKEludDMyQXJyYXkub2YoLTEsIDApKTtcbiAgICB9XG4gICAgX3dyaXRlTWFnaWMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZShNQUdJQyk7XG4gICAgfVxuICAgIF93cml0ZVBhZGRpbmcobkJ5dGVzKSB7XG4gICAgICAgIHJldHVybiBuQnl0ZXMgPiAwID8gdGhpcy5fd3JpdGUobmV3IFVpbnQ4QXJyYXkobkJ5dGVzKSkgOiB0aGlzO1xuICAgIH1cbiAgICBfd3JpdGVSZWNvcmRCYXRjaChiYXRjaCkge1xuICAgICAgICBjb25zdCB7IGJ5dGVMZW5ndGgsIG5vZGVzLCBidWZmZXJSZWdpb25zLCBidWZmZXJzIH0gPSBWZWN0b3JBc3NlbWJsZXIuYXNzZW1ibGUoYmF0Y2gpO1xuICAgICAgICBjb25zdCByZWNvcmRCYXRjaCA9IG5ldyBtZXRhZGF0YS5SZWNvcmRCYXRjaChiYXRjaC5udW1Sb3dzLCBub2RlcywgYnVmZmVyUmVnaW9ucyk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBNZXNzYWdlLmZyb20ocmVjb3JkQmF0Y2gsIGJ5dGVMZW5ndGgpO1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICAgICAgLl93cml0ZURpY3Rpb25hcmllcyhiYXRjaClcbiAgICAgICAgICAgIC5fd3JpdGVNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICAgICAgICAuX3dyaXRlQm9keUJ1ZmZlcnMoYnVmZmVycyk7XG4gICAgfVxuICAgIF93cml0ZURpY3Rpb25hcnlCYXRjaChkaWN0aW9uYXJ5LCBpZCwgaXNEZWx0YSA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2RpY3Rpb25hcnlEZWx0YU9mZnNldHMuc2V0KGlkLCBkaWN0aW9uYXJ5Lmxlbmd0aCArICh0aGlzLl9kaWN0aW9uYXJ5RGVsdGFPZmZzZXRzLmdldChpZCkgfHwgMCkpO1xuICAgICAgICBjb25zdCB7IGJ5dGVMZW5ndGgsIG5vZGVzLCBidWZmZXJSZWdpb25zLCBidWZmZXJzIH0gPSBWZWN0b3JBc3NlbWJsZXIuYXNzZW1ibGUobmV3IFZlY3RvcihbZGljdGlvbmFyeV0pKTtcbiAgICAgICAgY29uc3QgcmVjb3JkQmF0Y2ggPSBuZXcgbWV0YWRhdGEuUmVjb3JkQmF0Y2goZGljdGlvbmFyeS5sZW5ndGgsIG5vZGVzLCBidWZmZXJSZWdpb25zKTtcbiAgICAgICAgY29uc3QgZGljdGlvbmFyeUJhdGNoID0gbmV3IG1ldGFkYXRhLkRpY3Rpb25hcnlCYXRjaChyZWNvcmRCYXRjaCwgaWQsIGlzRGVsdGEpO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gTWVzc2FnZS5mcm9tKGRpY3Rpb25hcnlCYXRjaCwgYnl0ZUxlbmd0aCk7XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgICAuX3dyaXRlTWVzc2FnZShtZXNzYWdlKVxuICAgICAgICAgICAgLl93cml0ZUJvZHlCdWZmZXJzKGJ1ZmZlcnMpO1xuICAgIH1cbiAgICBfd3JpdGVCb2R5QnVmZmVycyhidWZmZXJzKSB7XG4gICAgICAgIGxldCBidWZmZXI7XG4gICAgICAgIGxldCBzaXplLCBwYWRkaW5nO1xuICAgICAgICBmb3IgKGxldCBpID0gLTEsIG4gPSBidWZmZXJzLmxlbmd0aDsgKytpIDwgbjspIHtcbiAgICAgICAgICAgIGlmICgoYnVmZmVyID0gYnVmZmVyc1tpXSkgJiYgKHNpemUgPSBidWZmZXIuYnl0ZUxlbmd0aCkgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd3JpdGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoKHBhZGRpbmcgPSAoKHNpemUgKyA3KSAmIH43KSAtIHNpemUpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl93cml0ZVBhZGRpbmcocGFkZGluZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBfd3JpdGVEaWN0aW9uYXJpZXMoYmF0Y2gpIHtcbiAgICAgICAgZm9yIChsZXQgW2lkLCBkaWN0aW9uYXJ5XSBvZiBiYXRjaC5kaWN0aW9uYXJpZXMpIHtcbiAgICAgICAgICAgIGxldCBvZmZzZXQgPSB0aGlzLl9kaWN0aW9uYXJ5RGVsdGFPZmZzZXRzLmdldChpZCkgfHwgMDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT09IDAgfHwgKGRpY3Rpb25hcnkgPSBkaWN0aW9uYXJ5ID09PSBudWxsIHx8IGRpY3Rpb25hcnkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRpY3Rpb25hcnkuc2xpY2Uob2Zmc2V0KSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGF0YSBvZiBkaWN0aW9uYXJ5LmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fd3JpdGVEaWN0aW9uYXJ5QmF0Y2goZGF0YSwgaWQsIG9mZnNldCA+IDApO1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgUmVjb3JkQmF0Y2hTdHJlYW1Xcml0ZXIgZXh0ZW5kcyBSZWNvcmRCYXRjaFdyaXRlciB7XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIHdyaXRlQWxsKGlucHV0LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBSZWNvcmRCYXRjaFN0cmVhbVdyaXRlcihvcHRpb25zKTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZShpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC50aGVuKCh4KSA9PiB3cml0ZXIud3JpdGVBbGwoeCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQXN5bmNJdGVyYWJsZShpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiB3cml0ZUFsbEFzeW5jKHdyaXRlciwgaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZUFsbCh3cml0ZXIsIGlucHV0KTtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFJlY29yZEJhdGNoRmlsZVdyaXRlciBleHRlbmRzIFJlY29yZEJhdGNoV3JpdGVyIHtcbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgd3JpdGVBbGwoaW5wdXQpIHtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IFJlY29yZEJhdGNoRmlsZVdyaXRlcigpO1xuICAgICAgICBpZiAoaXNQcm9taXNlKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0LnRoZW4oKHgpID0+IHdyaXRlci53cml0ZUFsbCh4KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNBc3luY0l0ZXJhYmxlKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHdyaXRlQWxsQXN5bmMod3JpdGVyLCBpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlQWxsKHdyaXRlciwgaW5wdXQpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fYXV0b0Rlc3Ryb3kgPSB0cnVlO1xuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgX3dyaXRlU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVNYWdpYygpLl93cml0ZVBhZGRpbmcoMik7XG4gICAgfVxuICAgIF93cml0ZUZvb3RlcihzY2hlbWEpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gRm9vdGVyLmVuY29kZShuZXcgRm9vdGVyKHNjaGVtYSwgTWV0YWRhdGFWZXJzaW9uLlY0LCB0aGlzLl9yZWNvcmRCYXRjaEJsb2NrcywgdGhpcy5fZGljdGlvbmFyeUJsb2NrcykpO1xuICAgICAgICByZXR1cm4gc3VwZXJcbiAgICAgICAgICAgIC5fd3JpdGVGb290ZXIoc2NoZW1hKSAvLyBFT1MgYnl0ZXMgZm9yIHNlcXVlbnRpYWwgcmVhZGVyc1xuICAgICAgICAgICAgLl93cml0ZShidWZmZXIpIC8vIFdyaXRlIHRoZSBmbGF0YnVmZmVyXG4gICAgICAgICAgICAuX3dyaXRlKEludDMyQXJyYXkub2YoYnVmZmVyLmJ5dGVMZW5ndGgpKSAvLyB0aGVuIHRoZSBmb290ZXIgc2l6ZSBzdWZmaXhcbiAgICAgICAgICAgIC5fd3JpdGVNYWdpYygpOyAvLyB0aGVuIHRoZSBtYWdpYyBzdWZmaXhcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFJlY29yZEJhdGNoSlNPTldyaXRlciBleHRlbmRzIFJlY29yZEJhdGNoV3JpdGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fYXV0b0Rlc3Ryb3kgPSB0cnVlO1xuICAgICAgICB0aGlzLl9yZWNvcmRCYXRjaGVzID0gW107XG4gICAgICAgIHRoaXMuX2RpY3Rpb25hcmllcyA9IFtdO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgd3JpdGVBbGwoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWNvcmRCYXRjaEpTT05Xcml0ZXIoKS53cml0ZUFsbChpbnB1dCk7XG4gICAgfVxuICAgIF93cml0ZU1lc3NhZ2UoKSB7IHJldHVybiB0aGlzOyB9XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIF93cml0ZUZvb3RlcihzY2hlbWEpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICBfd3JpdGVTY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZShge1xcbiAgXCJzY2hlbWFcIjogJHtKU09OLnN0cmluZ2lmeSh7IGZpZWxkczogc2NoZW1hLmZpZWxkcy5tYXAoZmllbGQgPT4gZmllbGRUb0pTT04oZmllbGQpKSB9LCBudWxsLCAyKX1gKTtcbiAgICB9XG4gICAgX3dyaXRlRGljdGlvbmFyaWVzKGJhdGNoKSB7XG4gICAgICAgIGlmIChiYXRjaC5kaWN0aW9uYXJpZXMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2RpY3Rpb25hcmllcy5wdXNoKGJhdGNoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgX3dyaXRlRGljdGlvbmFyeUJhdGNoKGRpY3Rpb25hcnksIGlkLCBpc0RlbHRhID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5fZGljdGlvbmFyeURlbHRhT2Zmc2V0cy5zZXQoaWQsIGRpY3Rpb25hcnkubGVuZ3RoICsgKHRoaXMuX2RpY3Rpb25hcnlEZWx0YU9mZnNldHMuZ2V0KGlkKSB8fCAwKSk7XG4gICAgICAgIHRoaXMuX3dyaXRlKHRoaXMuX2RpY3Rpb25hcnlCbG9ja3MubGVuZ3RoID09PSAwID8gYCAgICBgIDogYCxcXG4gICAgYCk7XG4gICAgICAgIHRoaXMuX3dyaXRlKGAke2RpY3Rpb25hcnlCYXRjaFRvSlNPTihkaWN0aW9uYXJ5LCBpZCwgaXNEZWx0YSl9YCk7XG4gICAgICAgIHRoaXMuX2RpY3Rpb25hcnlCbG9ja3MucHVzaChuZXcgRmlsZUJsb2NrKDAsIDAsIDApKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIF93cml0ZVJlY29yZEJhdGNoKGJhdGNoKSB7XG4gICAgICAgIHRoaXMuX3dyaXRlRGljdGlvbmFyaWVzKGJhdGNoKTtcbiAgICAgICAgdGhpcy5fcmVjb3JkQmF0Y2hlcy5wdXNoKGJhdGNoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5fZGljdGlvbmFyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3dyaXRlKGAsXFxuICBcImRpY3Rpb25hcmllc1wiOiBbXFxuYCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIHRoaXMuX2RpY3Rpb25hcmllcykge1xuICAgICAgICAgICAgICAgIHN1cGVyLl93cml0ZURpY3Rpb25hcmllcyhiYXRjaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl93cml0ZShgXFxuICBdYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3JlY29yZEJhdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IC0xLCBuID0gdGhpcy5fcmVjb3JkQmF0Y2hlcy5sZW5ndGg7ICsraSA8IG47KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd3JpdGUoaSA9PT0gMCA/IGAsXFxuICBcImJhdGNoZXNcIjogW1xcbiAgICBgIDogYCxcXG4gICAgYCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fd3JpdGUoYCR7cmVjb3JkQmF0Y2hUb0pTT04odGhpcy5fcmVjb3JkQmF0Y2hlc1tpXSl9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVjb3JkQmF0Y2hCbG9ja3MucHVzaChuZXcgRmlsZUJsb2NrKDAsIDAsIDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3dyaXRlKGBcXG4gIF1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc2NoZW1hKSB7XG4gICAgICAgICAgICB0aGlzLl93cml0ZShgXFxufWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RpY3Rpb25hcmllcyA9IFtdO1xuICAgICAgICB0aGlzLl9yZWNvcmRCYXRjaGVzID0gW107XG4gICAgICAgIHJldHVybiBzdXBlci5jbG9zZSgpO1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiB3cml0ZUFsbCh3cml0ZXIsIGlucHV0KSB7XG4gICAgbGV0IGNodW5rcyA9IGlucHV0O1xuICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFRhYmxlKSB7XG4gICAgICAgIGNodW5rcyA9IGlucHV0LmJhdGNoZXM7XG4gICAgICAgIHdyaXRlci5yZXNldCh1bmRlZmluZWQsIGlucHV0LnNjaGVtYSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgY2h1bmtzKSB7XG4gICAgICAgIHdyaXRlci53cml0ZShiYXRjaCk7XG4gICAgfVxuICAgIHJldHVybiB3cml0ZXIuZmluaXNoKCk7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gd3JpdGVBbGxBc3luYyh3cml0ZXIsIGJhdGNoZXMpIHtcbiAgICB2YXIgYmF0Y2hlc18xLCBiYXRjaGVzXzFfMTtcbiAgICB2YXIgZV8xLCBfYTtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChiYXRjaGVzXzEgPSBfX2FzeW5jVmFsdWVzKGJhdGNoZXMpOyBiYXRjaGVzXzFfMSA9IHlpZWxkIGJhdGNoZXNfMS5uZXh0KCksICFiYXRjaGVzXzFfMS5kb25lOykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhdGNoID0gYmF0Y2hlc18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGJhdGNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGJhdGNoZXNfMV8xICYmICFiYXRjaGVzXzFfMS5kb25lICYmIChfYSA9IGJhdGNoZXNfMS5yZXR1cm4pKSB5aWVsZCBfYS5jYWxsKGJhdGNoZXNfMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRlci5maW5pc2goKTtcbiAgICB9KTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBmaWVsZFRvSlNPTih7IG5hbWUsIHR5cGUsIG51bGxhYmxlIH0pIHtcbiAgICBjb25zdCBhc3NlbWJsZXIgPSBuZXcgSlNPTlR5cGVBc3NlbWJsZXIoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICAnbmFtZSc6IG5hbWUsICdudWxsYWJsZSc6IG51bGxhYmxlLFxuICAgICAgICAndHlwZSc6IGFzc2VtYmxlci52aXNpdCh0eXBlKSxcbiAgICAgICAgJ2NoaWxkcmVuJzogKHR5cGUuY2hpbGRyZW4gfHwgW10pLm1hcCgoZmllbGQpID0+IGZpZWxkVG9KU09OKGZpZWxkKSksXG4gICAgICAgICdkaWN0aW9uYXJ5JzogIURhdGFUeXBlLmlzRGljdGlvbmFyeSh0eXBlKSA/IHVuZGVmaW5lZCA6IHtcbiAgICAgICAgICAgICdpZCc6IHR5cGUuaWQsXG4gICAgICAgICAgICAnaXNPcmRlcmVkJzogdHlwZS5pc09yZGVyZWQsXG4gICAgICAgICAgICAnaW5kZXhUeXBlJzogYXNzZW1ibGVyLnZpc2l0KHR5cGUuaW5kaWNlcylcbiAgICAgICAgfVxuICAgIH07XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZGljdGlvbmFyeUJhdGNoVG9KU09OKGRpY3Rpb25hcnksIGlkLCBpc0RlbHRhID0gZmFsc2UpIHtcbiAgICBjb25zdCBbY29sdW1uc10gPSBKU09OVmVjdG9yQXNzZW1ibGVyLmFzc2VtYmxlKG5ldyBSZWNvcmRCYXRjaCh7IFtpZF06IGRpY3Rpb25hcnkgfSkpO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICdpZCc6IGlkLFxuICAgICAgICAnaXNEZWx0YSc6IGlzRGVsdGEsXG4gICAgICAgICdkYXRhJzoge1xuICAgICAgICAgICAgJ2NvdW50JzogZGljdGlvbmFyeS5sZW5ndGgsXG4gICAgICAgICAgICAnY29sdW1ucyc6IGNvbHVtbnNcbiAgICAgICAgfVxuICAgIH0sIG51bGwsIDIpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIHJlY29yZEJhdGNoVG9KU09OKHJlY29yZHMpIHtcbiAgICBjb25zdCBbY29sdW1uc10gPSBKU09OVmVjdG9yQXNzZW1ibGVyLmFzc2VtYmxlKHJlY29yZHMpO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICdjb3VudCc6IHJlY29yZHMubnVtUm93cyxcbiAgICAgICAgJ2NvbHVtbnMnOiBjb2x1bW5zXG4gICAgfSwgbnVsbCwgMik7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdyaXRlci5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbnZhciBfYTtcbmltcG9ydCB7IERhdGEsIG1ha2VEYXRhIH0gZnJvbSAnLi9kYXRhLm1qcyc7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gJy4vdGFibGUubWpzJztcbmltcG9ydCB7IFZlY3RvciB9IGZyb20gJy4vdmVjdG9yLm1qcyc7XG5pbXBvcnQgeyBTY2hlbWEsIEZpZWxkIH0gZnJvbSAnLi9zY2hlbWEubWpzJztcbmltcG9ydCB7IERhdGFUeXBlLCBTdHJ1Y3QsIE51bGwgfSBmcm9tICcuL3R5cGUubWpzJztcbmltcG9ydCB7IGluc3RhbmNlIGFzIGdldFZpc2l0b3IgfSBmcm9tICcuL3Zpc2l0b3IvZ2V0Lm1qcyc7XG5pbXBvcnQgeyBpbnN0YW5jZSBhcyBzZXRWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yL3NldC5tanMnO1xuaW1wb3J0IHsgaW5zdGFuY2UgYXMgaW5kZXhPZlZpc2l0b3IgfSBmcm9tICcuL3Zpc2l0b3IvaW5kZXhvZi5tanMnO1xuaW1wb3J0IHsgaW5zdGFuY2UgYXMgaXRlcmF0b3JWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yL2l0ZXJhdG9yLm1qcyc7XG5pbXBvcnQgeyBpbnN0YW5jZSBhcyBieXRlTGVuZ3RoVmlzaXRvciB9IGZyb20gJy4vdmlzaXRvci9ieXRlbGVuZ3RoLm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFJlY29yZEJhdGNoIHtcbiAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMjoge1xuICAgICAgICAgICAgICAgIFt0aGlzLnNjaGVtYV0gPSBhcmdzO1xuICAgICAgICAgICAgICAgIGlmICghKHRoaXMuc2NoZW1hIGluc3RhbmNlb2YgU2NoZW1hKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWNvcmRCYXRjaCBjb25zdHJ1Y3RvciBleHBlY3RzIGEgW1NjaGVtYSwgRGF0YV0gcGFpci4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgWyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gbWFrZURhdGEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbENvdW50OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogbmV3IFN0cnVjdCh0aGlzLnNjaGVtYS5maWVsZHMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IHRoaXMuc2NoZW1hLmZpZWxkcy5tYXAoKGYpID0+IG1ha2VEYXRhKHsgdHlwZTogZi50eXBlLCBudWxsQ291bnQ6IDAgfSkpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgXSA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgaWYgKCEodGhpcy5kYXRhIGluc3RhbmNlb2YgRGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVjb3JkQmF0Y2ggY29uc3RydWN0b3IgZXhwZWN0cyBhIFtTY2hlbWEsIERhdGFdIHBhaXIuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFt0aGlzLnNjaGVtYSwgdGhpcy5kYXRhXSA9IGVuc3VyZVNhbWVMZW5ndGhEYXRhKHRoaXMuc2NoZW1hLCB0aGlzLmRhdGEuY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW29ial0gPSBhcmdzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZmllbGRzLCBjaGlsZHJlbiwgbGVuZ3RoIH0gPSBPYmplY3Qua2V5cyhvYmopLnJlZHVjZSgobWVtbywgbmFtZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBtZW1vLmNoaWxkcmVuW2ldID0gb2JqW25hbWVdO1xuICAgICAgICAgICAgICAgICAgICBtZW1vLmxlbmd0aCA9IE1hdGgubWF4KG1lbW8ubGVuZ3RoLCBvYmpbbmFtZV0ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgbWVtby5maWVsZHNbaV0gPSBGaWVsZC5uZXcoeyBuYW1lLCB0eXBlOiBvYmpbbmFtZV0udHlwZSwgbnVsbGFibGU6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZW1vO1xuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiAwLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZHM6IG5ldyBBcnJheSgpLFxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogbmV3IEFycmF5KCksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gbmV3IFNjaGVtYShmaWVsZHMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBtYWtlRGF0YSh7IHR5cGU6IG5ldyBTdHJ1Y3QoZmllbGRzKSwgbGVuZ3RoLCBjaGlsZHJlbiwgbnVsbENvdW50OiAwIH0pO1xuICAgICAgICAgICAgICAgIFt0aGlzLnNjaGVtYSwgdGhpcy5kYXRhXSA9IGVuc3VyZVNhbWVMZW5ndGhEYXRhKHNjaGVtYSwgZGF0YS5jaGlsZHJlbiwgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlY29yZEJhdGNoIGNvbnN0cnVjdG9yIGV4cGVjdHMgYW4gT2JqZWN0IG1hcHBpbmcgbmFtZXMgdG8gY2hpbGQgRGF0YSwgb3IgYSBbU2NoZW1hLCBEYXRhXSBwYWlyLicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBkaWN0aW9uYXJpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaWN0aW9uYXJpZXMgfHwgKHRoaXMuX2RpY3Rpb25hcmllcyA9IGNvbGxlY3REaWN0aW9uYXJpZXModGhpcy5zY2hlbWEuZmllbGRzLCB0aGlzLmRhdGEuY2hpbGRyZW4pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoaXMgUmVjb3JkQmF0Y2guXG4gICAgICovXG4gICAgZ2V0IG51bUNvbHMoKSB7IHJldHVybiB0aGlzLnNjaGVtYS5maWVsZHMubGVuZ3RoOyB9XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiByb3dzIGluIHRoaXMgUmVjb3JkQmF0Y2guXG4gICAgICovXG4gICAgZ2V0IG51bVJvd3MoKSB7IHJldHVybiB0aGlzLmRhdGEubGVuZ3RoOyB9XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBudWxsIHJvd3MgaW4gdGhpcyBSZWNvcmRCYXRjaC5cbiAgICAgKi9cbiAgICBnZXQgbnVsbENvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLm51bGxDb3VudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2sgd2hldGhlciBhbiBlbGVtZW50IGlzIG51bGwuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0byByZWFkIHRoZSB2YWxpZGl0eSBiaXRtYXAuXG4gICAgICovXG4gICAgaXNWYWxpZChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmdldFZhbGlkKGluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGEgcm93IGJ5IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmVhZC5cbiAgICAgKi9cbiAgICBnZXQoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGdldFZpc2l0b3IudmlzaXQodGhpcy5kYXRhLCBpbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBhIHJvdyBieSBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqL1xuICAgIHNldChpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHNldFZpc2l0b3IudmlzaXQodGhpcy5kYXRhLCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYSByb3cgaW4gYW4gUmVjb3JkQmF0Y2guXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIHJvdyB0byBsb2NhdGUgaW4gdGhlIFJlY29yZEJhdGNoLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIGluZGV4IGF0IHdoaWNoIHRvIGJlZ2luIHRoZSBzZWFyY2guIElmIG9mZnNldCBpcyBvbWl0dGVkLCB0aGUgc2VhcmNoIHN0YXJ0cyBhdCBpbmRleCAwLlxuICAgICAqL1xuICAgIGluZGV4T2YoZWxlbWVudCwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBpbmRleE9mVmlzaXRvci52aXNpdCh0aGlzLmRhdGEsIGVsZW1lbnQsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIGEgcm93IGJ5IGluZGV4LlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgcm93IGluZGV4IGZvciB3aGljaCB0byBjb21wdXRlIHRoZSBieXRlTGVuZ3RoLlxuICAgICAqL1xuICAgIGdldEJ5dGVMZW5ndGgoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGJ5dGVMZW5ndGhWaXNpdG9yLnZpc2l0KHRoaXMuZGF0YSwgaW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJdGVyYXRvciBmb3Igcm93cyBpbiB0aGlzIFJlY29yZEJhdGNoLlxuICAgICAqL1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JWaXNpdG9yLnZpc2l0KG5ldyBWZWN0b3IoW3RoaXMuZGF0YV0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgSmF2YVNjcmlwdCBBcnJheSBvZiB0aGUgUmVjb3JkQmF0Y2ggcm93cy5cbiAgICAgKiBAcmV0dXJucyBBbiBBcnJheSBvZiBSZWNvcmRCYXRjaCByb3dzLlxuICAgICAqL1xuICAgIHRvQXJyYXkoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpc107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbWJpbmVzIHR3byBvciBtb3JlIFJlY29yZEJhdGNoIG9mIHRoZSBzYW1lIHNjaGVtYS5cbiAgICAgKiBAcGFyYW0gb3RoZXJzIEFkZGl0aW9uYWwgUmVjb3JkQmF0Y2ggdG8gYWRkIHRvIHRoZSBlbmQgb2YgdGhpcyBSZWNvcmRCYXRjaC5cbiAgICAgKi9cbiAgICBjb25jYXQoLi4ub3RoZXJzKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGUodGhpcy5zY2hlbWEsIFt0aGlzLCAuLi5vdGhlcnNdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgemVyby1jb3B5IHN1Yi1zZWN0aW9uIG9mIHRoaXMgUmVjb3JkQmF0Y2guXG4gICAgICogQHBhcmFtIHN0YXJ0IFRoZSBiZWdpbm5pbmcgb2YgdGhlIHNwZWNpZmllZCBwb3J0aW9uIG9mIHRoZSBSZWNvcmRCYXRjaC5cbiAgICAgKiBAcGFyYW0gZW5kIFRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZCBwb3J0aW9uIG9mIHRoZSBSZWNvcmRCYXRjaC4gVGhpcyBpcyBleGNsdXNpdmUgb2YgdGhlIGVsZW1lbnQgYXQgdGhlIGluZGV4ICdlbmQnLlxuICAgICAqL1xuICAgIHNsaWNlKGJlZ2luLCBlbmQpIHtcbiAgICAgICAgY29uc3QgW3NsaWNlXSA9IG5ldyBWZWN0b3IoW3RoaXMuZGF0YV0pLnNsaWNlKGJlZ2luLCBlbmQpLmRhdGE7XG4gICAgICAgIHJldHVybiBuZXcgUmVjb3JkQmF0Y2godGhpcy5zY2hlbWEsIHNsaWNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNoaWxkIFZlY3RvciBieSBuYW1lLCBvciBudWxsIGlmIHRoaXMgVmVjdG9yIGhhcyBubyBjaGlsZCB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjaGlsZCB0byByZXRyaWV2ZS5cbiAgICAgKi9cbiAgICBnZXRDaGlsZChuYW1lKSB7XG4gICAgICAgIHZhciBfYjtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hpbGRBdCgoX2IgPSB0aGlzLnNjaGVtYS5maWVsZHMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kSW5kZXgoKGYpID0+IGYubmFtZSA9PT0gbmFtZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY2hpbGQgVmVjdG9yIGJ5IGluZGV4LCBvciBudWxsIGlmIHRoaXMgVmVjdG9yIGhhcyBubyBjaGlsZCBhdCB0aGUgc3VwcGxpZWQgaW5kZXguXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gcmV0cmlldmUuXG4gICAgICovXG4gICAgZ2V0Q2hpbGRBdChpbmRleCkge1xuICAgICAgICBpZiAoaW5kZXggPiAtMSAmJiBpbmRleCA8IHRoaXMuc2NoZW1hLmZpZWxkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yKFt0aGlzLmRhdGEuY2hpbGRyZW5baW5kZXhdXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgYSBjaGlsZCBWZWN0b3IgYnkgbmFtZS5cbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY2hpbGQgdG8gb3ZlcndyaXRlLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IFJlY29yZEJhdGNoIHdpdGggdGhlIG5ldyBjaGlsZCBmb3IgdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqL1xuICAgIHNldENoaWxkKG5hbWUsIGNoaWxkKSB7XG4gICAgICAgIHZhciBfYjtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0Q2hpbGRBdCgoX2IgPSB0aGlzLnNjaGVtYS5maWVsZHMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kSW5kZXgoKGYpID0+IGYubmFtZSA9PT0gbmFtZSksIGNoaWxkKTtcbiAgICB9XG4gICAgc2V0Q2hpbGRBdChpbmRleCwgY2hpbGQpIHtcbiAgICAgICAgbGV0IHNjaGVtYSA9IHRoaXMuc2NoZW1hO1xuICAgICAgICBsZXQgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEgJiYgaW5kZXggPCB0aGlzLm51bUNvbHMpIHtcbiAgICAgICAgICAgIGlmICghY2hpbGQpIHtcbiAgICAgICAgICAgICAgICBjaGlsZCA9IG5ldyBWZWN0b3IoW21ha2VEYXRhKHsgdHlwZTogbmV3IE51bGwsIGxlbmd0aDogdGhpcy5udW1Sb3dzIH0pXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWVsZHMgPSBzY2hlbWEuZmllbGRzLnNsaWNlKCk7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGRhdGEuY2hpbGRyZW4uc2xpY2UoKTtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZmllbGRzW2luZGV4XS5jbG9uZSh7IHR5cGU6IGNoaWxkLnR5cGUgfSk7XG4gICAgICAgICAgICBbZmllbGRzW2luZGV4XSwgY2hpbGRyZW5baW5kZXhdXSA9IFtmaWVsZCwgY2hpbGQuZGF0YVswXV07XG4gICAgICAgICAgICBzY2hlbWEgPSBuZXcgU2NoZW1hKGZpZWxkcywgbmV3IE1hcCh0aGlzLnNjaGVtYS5tZXRhZGF0YSkpO1xuICAgICAgICAgICAgZGF0YSA9IG1ha2VEYXRhKHsgdHlwZTogbmV3IFN0cnVjdChmaWVsZHMpLCBjaGlsZHJlbiB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlY29yZEJhdGNoKHNjaGVtYSwgZGF0YSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIG5ldyBSZWNvcmRCYXRjaCBjb250YWluaW5nIG9ubHkgc3BlY2lmaWVkIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29sdW1uTmFtZXMgTmFtZXMgb2YgY29sdW1ucyB0byBrZWVwLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IFJlY29yZEJhdGNoIG9mIGNvbHVtbnMgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBuYW1lcy5cbiAgICAgKi9cbiAgICBzZWxlY3QoY29sdW1uTmFtZXMpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5zY2hlbWEuc2VsZWN0KGNvbHVtbk5hbWVzKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IG5ldyBTdHJ1Y3Qoc2NoZW1hLmZpZWxkcyk7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBjb2x1bW5OYW1lcykge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNjaGVtYS5maWVsZHMuZmluZEluZGV4KChmKSA9PiBmLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICAgICAgaWYgKH5pbmRleCkge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuW2luZGV4XSA9IHRoaXMuZGF0YS5jaGlsZHJlbltpbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZWNvcmRCYXRjaChzY2hlbWEsIG1ha2VEYXRhKHsgdHlwZSwgbGVuZ3RoOiB0aGlzLm51bVJvd3MsIGNoaWxkcmVuIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgbmV3IFJlY29yZEJhdGNoIGNvbnRhaW5pbmcgb25seSBjb2x1bW5zIGF0IHRoZSBzcGVjaWZpZWQgaW5kaWNlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb2x1bW5JbmRpY2VzIEluZGljZXMgb2YgY29sdW1ucyB0byBrZWVwLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IFJlY29yZEJhdGNoIG9mIGNvbHVtbnMgbWF0Y2hpbmcgYXQgdGhlIHNwZWNpZmllZCBpbmRpY2VzLlxuICAgICAqL1xuICAgIHNlbGVjdEF0KGNvbHVtbkluZGljZXMpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5zY2hlbWEuc2VsZWN0QXQoY29sdW1uSW5kaWNlcyk7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY29sdW1uSW5kaWNlcy5tYXAoKGkpID0+IHRoaXMuZGF0YS5jaGlsZHJlbltpXSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICBjb25zdCBzdWJzZXQgPSBtYWtlRGF0YSh7IHR5cGU6IG5ldyBTdHJ1Y3Qoc2NoZW1hLmZpZWxkcyksIGxlbmd0aDogdGhpcy5udW1Sb3dzLCBjaGlsZHJlbiB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWNvcmRCYXRjaChzY2hlbWEsIHN1YnNldCk7XG4gICAgfVxufVxuX2EgPSBTeW1ib2wudG9TdHJpbmdUYWc7XG4vLyBJbml0aWFsaXplIHRoaXMgc3RhdGljIHByb3BlcnR5IHZpYSBhbiBJSUZFIHNvIGJ1bmRsZXJzIGRvbid0IHRyZWUtc2hha2Vcbi8vIG91dCB0aGlzIGxvZ2ljLCBidXQgYWxzbyBzbyB3ZSdyZSBzdGlsbCBjb21wbGlhbnQgd2l0aCBgXCJzaWRlRWZmZWN0c1wiOiBmYWxzZWBcblJlY29yZEJhdGNoW19hXSA9ICgocHJvdG8pID0+IHtcbiAgICBwcm90by5fbnVsbENvdW50ID0gLTE7XG4gICAgcHJvdG9bU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZV0gPSB0cnVlO1xuICAgIHJldHVybiAnUmVjb3JkQmF0Y2gnO1xufSkoUmVjb3JkQmF0Y2gucHJvdG90eXBlKTtcbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBlbnN1cmVTYW1lTGVuZ3RoRGF0YShzY2hlbWEsIGNodW5rcywgbWF4TGVuZ3RoID0gY2h1bmtzLnJlZHVjZSgobWF4LCBjb2wpID0+IE1hdGgubWF4KG1heCwgY29sLmxlbmd0aCksIDApKSB7XG4gICAgdmFyIF9iO1xuICAgIGNvbnN0IGZpZWxkcyA9IFsuLi5zY2hlbWEuZmllbGRzXTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IFsuLi5jaHVua3NdO1xuICAgIGNvbnN0IG51bGxCaXRtYXBTaXplID0gKChtYXhMZW5ndGggKyA2MykgJiB+NjMpID4+IDM7XG4gICAgZm9yIChjb25zdCBbaWR4LCBmaWVsZF0gb2Ygc2NoZW1hLmZpZWxkcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSBjaHVua3NbaWR4XTtcbiAgICAgICAgaWYgKCFjaHVuayB8fCBjaHVuay5sZW5ndGggIT09IG1heExlbmd0aCkge1xuICAgICAgICAgICAgZmllbGRzW2lkeF0gPSBmaWVsZC5jbG9uZSh7IG51bGxhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgICAgY2hpbGRyZW5baWR4XSA9IChfYiA9IGNodW5rID09PSBudWxsIHx8IGNodW5rID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaHVuay5fY2hhbmdlTGVuZ3RoQW5kQmFja2ZpbGxOdWxsQml0bWFwKG1heExlbmd0aCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IG1ha2VEYXRhKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBmaWVsZC50eXBlLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogbWF4TGVuZ3RoLFxuICAgICAgICAgICAgICAgIG51bGxDb3VudDogbWF4TGVuZ3RoLFxuICAgICAgICAgICAgICAgIG51bGxCaXRtYXA6IG5ldyBVaW50OEFycmF5KG51bGxCaXRtYXBTaXplKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgICAgc2NoZW1hLmFzc2lnbihmaWVsZHMpLFxuICAgICAgICBtYWtlRGF0YSh7IHR5cGU6IG5ldyBTdHJ1Y3QoZmllbGRzKSwgbGVuZ3RoOiBtYXhMZW5ndGgsIGNoaWxkcmVuIH0pXG4gICAgXTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBjb2xsZWN0RGljdGlvbmFyaWVzKGZpZWxkcywgY2hpbGRyZW4sIGRpY3Rpb25hcmllcyA9IG5ldyBNYXAoKSkge1xuICAgIGZvciAobGV0IGkgPSAtMSwgbiA9IGZpZWxkcy5sZW5ndGg7ICsraSA8IG47KSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZmllbGRzW2ldO1xuICAgICAgICBjb25zdCB0eXBlID0gZmllbGQudHlwZTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGNoaWxkcmVuW2ldO1xuICAgICAgICBpZiAoRGF0YVR5cGUuaXNEaWN0aW9uYXJ5KHR5cGUpKSB7XG4gICAgICAgICAgICBpZiAoIWRpY3Rpb25hcmllcy5oYXModHlwZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5kaWN0aW9uYXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRpY3Rpb25hcmllcy5zZXQodHlwZS5pZCwgZGF0YS5kaWN0aW9uYXJ5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkaWN0aW9uYXJpZXMuZ2V0KHR5cGUuaWQpICE9PSBkYXRhLmRpY3Rpb25hcnkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUgU2NoZW1hIGNvbnRhaW5pbmcgdHdvIGRpZmZlcmVudCBkaWN0aW9uYXJpZXMgd2l0aCB0aGUgc2FtZSBJZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlLmNoaWxkcmVuICYmIHR5cGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29sbGVjdERpY3Rpb25hcmllcyh0eXBlLmNoaWxkcmVuLCBkYXRhLmNoaWxkcmVuLCBkaWN0aW9uYXJpZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaWN0aW9uYXJpZXM7XG59XG4vKipcbiAqIEFuIGludGVybmFsIGNsYXNzIHVzZWQgYnkgdGhlIGBSZWNvcmRCYXRjaFJlYWRlcmAgYW5kIGBSZWNvcmRCYXRjaFdyaXRlcmBcbiAqIGltcGxlbWVudGF0aW9ucyB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBzdHJlYW0gd2l0aCB2YWxpZCB6ZXJvLWxlbmd0aFxuICogUmVjb3JkQmF0Y2hlcywgYW5kIGEgc3RyZWFtIHdpdGggYSBTY2hlbWEgbWVzc2FnZSwgYnV0IG5vIFJlY29yZEJhdGNoZXMuXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvYXJyb3cvcHVsbC80MzczXG4gKiBAaWdub3JlXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgX0ludGVybmFsRW1wdHlQbGFjZWhvbGRlclJlY29yZEJhdGNoIGV4dGVuZHMgUmVjb3JkQmF0Y2gge1xuICAgIGNvbnN0cnVjdG9yKHNjaGVtYSkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHNjaGVtYS5maWVsZHMubWFwKChmKSA9PiBtYWtlRGF0YSh7IHR5cGU6IGYudHlwZSB9KSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBtYWtlRGF0YSh7IHR5cGU6IG5ldyBTdHJ1Y3Qoc2NoZW1hLmZpZWxkcyksIG51bGxDb3VudDogMCwgY2hpbGRyZW4gfSk7XG4gICAgICAgIHN1cGVyKHNjaGVtYSwgZGF0YSk7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWNvcmRiYXRjaC5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IFZlY3RvciB9IGZyb20gJy4uL3ZlY3Rvci5tanMnO1xuaW1wb3J0IHsgdmFsdWVUb1N0cmluZyB9IGZyb20gJy4uL3V0aWwvcHJldHR5Lm1qcyc7XG5pbXBvcnQgeyBpbnN0YW5jZSBhcyBnZXRWaXNpdG9yIH0gZnJvbSAnLi4vdmlzaXRvci9nZXQubWpzJztcbmltcG9ydCB7IGluc3RhbmNlIGFzIHNldFZpc2l0b3IgfSBmcm9tICcuLi92aXNpdG9yL3NldC5tanMnO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IGtLZXlzID0gU3ltYm9sLmZvcigna2V5cycpO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IGtWYWxzID0gU3ltYm9sLmZvcigndmFscycpO1xuZXhwb3J0IGNsYXNzIE1hcFJvdyB7XG4gICAgY29uc3RydWN0b3Ioc2xpY2UpIHtcbiAgICAgICAgdGhpc1trS2V5c10gPSBuZXcgVmVjdG9yKFtzbGljZS5jaGlsZHJlblswXV0pLm1lbW9pemUoKTtcbiAgICAgICAgdGhpc1trVmFsc10gPSBzbGljZS5jaGlsZHJlblsxXTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCBuZXcgTWFwUm93UHJveHlIYW5kbGVyKCkpO1xuICAgIH1cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXBSb3dJdGVyYXRvcih0aGlzW2tLZXlzXSwgdGhpc1trVmFsc10pO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHsgcmV0dXJuIHRoaXNba0tleXNdLmxlbmd0aDsgfVxuICAgIHRvQXJyYXkoKSB7IHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMudG9KU09OKCkpOyB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBjb25zdCBrZXlzID0gdGhpc1trS2V5c107XG4gICAgICAgIGNvbnN0IHZhbHMgPSB0aGlzW2tWYWxzXTtcbiAgICAgICAgY29uc3QganNvbiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gLTEsIG4gPSBrZXlzLmxlbmd0aDsgKytpIDwgbjspIHtcbiAgICAgICAgICAgIGpzb25ba2V5cy5nZXQoaSldID0gZ2V0VmlzaXRvci52aXNpdCh2YWxzLCBpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgeyR7Wy4uLnRoaXNdLm1hcCgoW2tleSwgdmFsXSkgPT4gYCR7dmFsdWVUb1N0cmluZyhrZXkpfTogJHt2YWx1ZVRvU3RyaW5nKHZhbCl9YCkuam9pbignLCAnKX19YDtcbiAgICB9XG4gICAgW1N5bWJvbC5mb3IoJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJyldKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICAgIH1cbn1cbmNsYXNzIE1hcFJvd0l0ZXJhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihrZXlzLCB2YWxzKSB7XG4gICAgICAgIHRoaXMua2V5cyA9IGtleXM7XG4gICAgICAgIHRoaXMudmFscyA9IHZhbHM7XG4gICAgICAgIHRoaXMua2V5SW5kZXggPSAwO1xuICAgICAgICB0aGlzLm51bUtleXMgPSBrZXlzLmxlbmd0aDtcbiAgICB9XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7IHJldHVybiB0aGlzOyB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMua2V5SW5kZXg7XG4gICAgICAgIGlmIChpID09PSB0aGlzLm51bUtleXMpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBudWxsIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5rZXlJbmRleCsrO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogW1xuICAgICAgICAgICAgICAgIHRoaXMua2V5cy5nZXQoaSksXG4gICAgICAgICAgICAgICAgZ2V0VmlzaXRvci52aXNpdCh0aGlzLnZhbHMsIGkpLFxuICAgICAgICAgICAgXVxuICAgICAgICB9O1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5jbGFzcyBNYXBSb3dQcm94eUhhbmRsZXIge1xuICAgIGlzRXh0ZW5zaWJsZSgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgZGVsZXRlUHJvcGVydHkoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHByZXZlbnRFeHRlbnNpb25zKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIG93bktleXMocm93KSB7XG4gICAgICAgIHJldHVybiByb3dba0tleXNdLnRvQXJyYXkoKS5tYXAoU3RyaW5nKTtcbiAgICB9XG4gICAgaGFzKHJvdywga2V5KSB7XG4gICAgICAgIHJldHVybiByb3dba0tleXNdLmluY2x1ZGVzKGtleSk7XG4gICAgfVxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihyb3csIGtleSkge1xuICAgICAgICBjb25zdCBpZHggPSByb3dba0tleXNdLmluZGV4T2Yoa2V5KTtcbiAgICAgICAgaWYgKGlkeCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHdyaXRhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGdldChyb3csIGtleSkge1xuICAgICAgICAvLyBMb29rIHVwIGtleSBpbiByb3cgZmlyc3RcbiAgICAgICAgaWYgKFJlZmxlY3QuaGFzKHJvdywga2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHJvd1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlkeCA9IHJvd1trS2V5c10uaW5kZXhPZihrZXkpO1xuICAgICAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgdmFsID0gZ2V0VmlzaXRvci52aXNpdChSZWZsZWN0LmdldChyb3csIGtWYWxzKSwgaWR4KTtcbiAgICAgICAgICAgIC8vIENhY2hlIGtleS92YWwgbG9va3Vwc1xuICAgICAgICAgICAgUmVmbGVjdC5zZXQocm93LCBrZXksIHZhbCk7XG4gICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldChyb3csIGtleSwgdmFsKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHJvd1trS2V5c10uaW5kZXhPZihrZXkpO1xuICAgICAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgICAgICAgc2V0VmlzaXRvci52aXNpdChSZWZsZWN0LmdldChyb3csIGtWYWxzKSwgaWR4LCB2YWwpO1xuICAgICAgICAgICAgLy8gQ2FjaGUga2V5L3ZhbCBsb29rdXBzXG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5zZXQocm93LCBrZXksIHZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoUmVmbGVjdC5oYXMocm93LCBrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5zZXQocm93LCBrZXksIHZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE1hcFJvdy5wcm90b3R5cGUsIHtcbiAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogeyBlbnVtZXJhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgdmFsdWU6ICdSb3cnIH0sXG4gICAgW2tLZXlzXTogeyB3cml0YWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIHZhbHVlOiBudWxsIH0sXG4gICAgW2tWYWxzXTogeyB3cml0YWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIHZhbHVlOiBudWxsIH0sXG59KTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWFwLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgdmFsdWVUb1N0cmluZyB9IGZyb20gJy4uL3V0aWwvcHJldHR5Lm1qcyc7XG5pbXBvcnQgeyBpbnN0YW5jZSBhcyBnZXRWaXNpdG9yIH0gZnJvbSAnLi4vdmlzaXRvci9nZXQubWpzJztcbmltcG9ydCB7IGluc3RhbmNlIGFzIHNldFZpc2l0b3IgfSBmcm9tICcuLi92aXNpdG9yL3NldC5tanMnO1xuLyoqIEBpZ25vcmUgKi8gY29uc3Qga1BhcmVudCA9IFN5bWJvbC5mb3IoJ3BhcmVudCcpO1xuLyoqIEBpZ25vcmUgKi8gY29uc3Qga1Jvd0luZGV4ID0gU3ltYm9sLmZvcigncm93SW5kZXgnKTtcbmV4cG9ydCBjbGFzcyBTdHJ1Y3RSb3cge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgcm93SW5kZXgpIHtcbiAgICAgICAgdGhpc1trUGFyZW50XSA9IHBhcmVudDtcbiAgICAgICAgdGhpc1trUm93SW5kZXhdID0gcm93SW5kZXg7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkodGhpcywgbmV3IFN0cnVjdFJvd1Byb3h5SGFuZGxlcigpKTtcbiAgICB9XG4gICAgdG9BcnJheSgpIHsgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy50b0pTT04oKSk7IH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzW2tSb3dJbmRleF07XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXNba1BhcmVudF07XG4gICAgICAgIGNvbnN0IGtleXMgPSBwYXJlbnQudHlwZS5jaGlsZHJlbjtcbiAgICAgICAgY29uc3QganNvbiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBqID0gLTEsIG4gPSBrZXlzLmxlbmd0aDsgKytqIDwgbjspIHtcbiAgICAgICAgICAgIGpzb25ba2V5c1tqXS5uYW1lXSA9IGdldFZpc2l0b3IudmlzaXQocGFyZW50LmNoaWxkcmVuW2pdLCBpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgeyR7Wy4uLnRoaXNdLm1hcCgoW2tleSwgdmFsXSkgPT4gYCR7dmFsdWVUb1N0cmluZyhrZXkpfTogJHt2YWx1ZVRvU3RyaW5nKHZhbCl9YCkuam9pbignLCAnKX19YDtcbiAgICB9XG4gICAgW1N5bWJvbC5mb3IoJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJyldKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICAgIH1cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3RSb3dJdGVyYXRvcih0aGlzW2tQYXJlbnRdLCB0aGlzW2tSb3dJbmRleF0pO1xuICAgIH1cbn1cbmNsYXNzIFN0cnVjdFJvd0l0ZXJhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCByb3dJbmRleCkge1xuICAgICAgICB0aGlzLmNoaWxkSW5kZXggPSAwO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gZGF0YS5jaGlsZHJlbjtcbiAgICAgICAgdGhpcy5yb3dJbmRleCA9IHJvd0luZGV4O1xuICAgICAgICB0aGlzLmNoaWxkRmllbGRzID0gZGF0YS50eXBlLmNoaWxkcmVuO1xuICAgICAgICB0aGlzLm51bUNoaWxkcmVuID0gdGhpcy5jaGlsZEZpZWxkcy5sZW5ndGg7XG4gICAgfVxuICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmNoaWxkSW5kZXg7XG4gICAgICAgIGlmIChpIDwgdGhpcy5udW1DaGlsZHJlbikge1xuICAgICAgICAgICAgdGhpcy5jaGlsZEluZGV4ID0gaSArIDE7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRGaWVsZHNbaV0ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZ2V0VmlzaXRvci52aXNpdCh0aGlzLmNoaWxkcmVuW2ldLCB0aGlzLnJvd0luZGV4KVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGwgfTtcbiAgICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhTdHJ1Y3RSb3cucHJvdG90eXBlLCB7XG4gICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgZW51bWVyYWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIHZhbHVlOiAnUm93JyB9LFxuICAgIFtrUGFyZW50XTogeyB3cml0YWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2UsIHZhbHVlOiBudWxsIH0sXG4gICAgW2tSb3dJbmRleF06IHsgd3JpdGFibGU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlLCB2YWx1ZTogLTEgfSxcbn0pO1xuY2xhc3MgU3RydWN0Um93UHJveHlIYW5kbGVyIHtcbiAgICBpc0V4dGVuc2libGUoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGRlbGV0ZVByb3BlcnR5KCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBwcmV2ZW50RXh0ZW5zaW9ucygpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBvd25LZXlzKHJvdykge1xuICAgICAgICByZXR1cm4gcm93W2tQYXJlbnRdLnR5cGUuY2hpbGRyZW4ubWFwKChmKSA9PiBmLm5hbWUpO1xuICAgIH1cbiAgICBoYXMocm93LCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIHJvd1trUGFyZW50XS50eXBlLmNoaWxkcmVuLmZpbmRJbmRleCgoZikgPT4gZi5uYW1lID09PSBrZXkpICE9PSAtMTtcbiAgICB9XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHJvdywga2V5KSB7XG4gICAgICAgIGlmIChyb3dba1BhcmVudF0udHlwZS5jaGlsZHJlbi5maW5kSW5kZXgoKGYpID0+IGYubmFtZSA9PT0ga2V5KSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHdyaXRhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGdldChyb3csIGtleSkge1xuICAgICAgICAvLyBMb29rIHVwIGtleSBpbiByb3cgZmlyc3RcbiAgICAgICAgaWYgKFJlZmxlY3QuaGFzKHJvdywga2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHJvd1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlkeCA9IHJvd1trUGFyZW50XS50eXBlLmNoaWxkcmVuLmZpbmRJbmRleCgoZikgPT4gZi5uYW1lID09PSBrZXkpO1xuICAgICAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgdmFsID0gZ2V0VmlzaXRvci52aXNpdChyb3dba1BhcmVudF0uY2hpbGRyZW5baWR4XSwgcm93W2tSb3dJbmRleF0pO1xuICAgICAgICAgICAgLy8gQ2FjaGUga2V5L3ZhbCBsb29rdXBzXG4gICAgICAgICAgICBSZWZsZWN0LnNldChyb3csIGtleSwgdmFsKTtcbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0KHJvdywga2V5LCB2YWwpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gcm93W2tQYXJlbnRdLnR5cGUuY2hpbGRyZW4uZmluZEluZGV4KChmKSA9PiBmLm5hbWUgPT09IGtleSk7XG4gICAgICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICAgICAgICBzZXRWaXNpdG9yLnZpc2l0KHJvd1trUGFyZW50XS5jaGlsZHJlbltpZHhdLCByb3dba1Jvd0luZGV4XSwgdmFsKTtcbiAgICAgICAgICAgIC8vIENhY2hlIGtleS92YWwgbG9va3Vwc1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHJvdywga2V5LCB2YWwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFJlZmxlY3QuaGFzKHJvdywga2V5KSB8fCB0eXBlb2Yga2V5ID09PSAnc3ltYm9sJykge1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHJvdywga2V5LCB2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cnVjdC5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi90eXBlLm1qcyc7XG5leHBvcnQgY2xhc3MgU2NoZW1hIHtcbiAgICBjb25zdHJ1Y3RvcihmaWVsZHMgPSBbXSwgbWV0YWRhdGEsIGRpY3Rpb25hcmllcykge1xuICAgICAgICB0aGlzLmZpZWxkcyA9IChmaWVsZHMgfHwgW10pO1xuICAgICAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGEgfHwgbmV3IE1hcCgpO1xuICAgICAgICBpZiAoIWRpY3Rpb25hcmllcykge1xuICAgICAgICAgICAgZGljdGlvbmFyaWVzID0gZ2VuZXJhdGVEaWN0aW9uYXJ5TWFwKGZpZWxkcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaWN0aW9uYXJpZXMgPSBkaWN0aW9uYXJpZXM7XG4gICAgfVxuICAgIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHsgcmV0dXJuICdTY2hlbWEnOyB9XG4gICAgZ2V0IG5hbWVzKCkgeyByZXR1cm4gdGhpcy5maWVsZHMubWFwKChmKSA9PiBmLm5hbWUpOyB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgU2NoZW1hPHsgJHt0aGlzLmZpZWxkcy5tYXAoKGYsIGkpID0+IGAke2l9OiAke2Z9YCkuam9pbignLCAnKX0gfT5gO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgU2NoZW1hIGNvbnRhaW5pbmcgb25seSBzcGVjaWZpZWQgZmllbGRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpZWxkTmFtZXMgTmFtZXMgb2YgZmllbGRzIHRvIGtlZXAuXG4gICAgICogQHJldHVybnMgQSBuZXcgU2NoZW1hIG9mIGZpZWxkcyBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIG5hbWVzLlxuICAgICAqL1xuICAgIHNlbGVjdChmaWVsZE5hbWVzKSB7XG4gICAgICAgIGNvbnN0IG5hbWVzID0gbmV3IFNldChmaWVsZE5hbWVzKTtcbiAgICAgICAgY29uc3QgZmllbGRzID0gdGhpcy5maWVsZHMuZmlsdGVyKChmKSA9PiBuYW1lcy5oYXMoZi5uYW1lKSk7XG4gICAgICAgIHJldHVybiBuZXcgU2NoZW1hKGZpZWxkcywgdGhpcy5tZXRhZGF0YSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIG5ldyBTY2hlbWEgY29udGFpbmluZyBvbmx5IGZpZWxkcyBhdCB0aGUgc3BlY2lmaWVkIGluZGljZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmllbGRJbmRpY2VzIEluZGljZXMgb2YgZmllbGRzIHRvIGtlZXAuXG4gICAgICogQHJldHVybnMgQSBuZXcgU2NoZW1hIG9mIGZpZWxkcyBhdCB0aGUgc3BlY2lmaWVkIGluZGljZXMuXG4gICAgICovXG4gICAgc2VsZWN0QXQoZmllbGRJbmRpY2VzKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IGZpZWxkSW5kaWNlcy5tYXAoKGkpID0+IHRoaXMuZmllbGRzW2ldKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIHJldHVybiBuZXcgU2NoZW1hKGZpZWxkcywgdGhpcy5tZXRhZGF0YSk7XG4gICAgfVxuICAgIGFzc2lnbiguLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IG90aGVyID0gKGFyZ3NbMF0gaW5zdGFuY2VvZiBTY2hlbWFcbiAgICAgICAgICAgID8gYXJnc1swXVxuICAgICAgICAgICAgOiBBcnJheS5pc0FycmF5KGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgPyBuZXcgU2NoZW1hKGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgOiBuZXcgU2NoZW1hKGFyZ3MpKTtcbiAgICAgICAgY29uc3QgY3VyRmllbGRzID0gWy4uLnRoaXMuZmllbGRzXTtcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBtZXJnZU1hcHMobWVyZ2VNYXBzKG5ldyBNYXAoKSwgdGhpcy5tZXRhZGF0YSksIG90aGVyLm1ldGFkYXRhKTtcbiAgICAgICAgY29uc3QgbmV3RmllbGRzID0gb3RoZXIuZmllbGRzLmZpbHRlcigoZjIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBjdXJGaWVsZHMuZmluZEluZGV4KChmKSA9PiBmLm5hbWUgPT09IGYyLm5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIH5pID8gKGN1ckZpZWxkc1tpXSA9IGYyLmNsb25lKHtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogbWVyZ2VNYXBzKG1lcmdlTWFwcyhuZXcgTWFwKCksIGN1ckZpZWxkc1tpXS5tZXRhZGF0YSksIGYyLm1ldGFkYXRhKVxuICAgICAgICAgICAgfSkpICYmIGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5ld0RpY3Rpb25hcmllcyA9IGdlbmVyYXRlRGljdGlvbmFyeU1hcChuZXdGaWVsZHMsIG5ldyBNYXAoKSk7XG4gICAgICAgIHJldHVybiBuZXcgU2NoZW1hKFsuLi5jdXJGaWVsZHMsIC4uLm5ld0ZpZWxkc10sIG1ldGFkYXRhLCBuZXcgTWFwKFsuLi50aGlzLmRpY3Rpb25hcmllcywgLi4ubmV3RGljdGlvbmFyaWVzXSkpO1xuICAgIH1cbn1cbi8vIEFkZCB0aGVzZSBoZXJlIHNvIHRoZXkncmUgcGlja2VkIHVwIGJ5IHRoZSBleHRlcm5zIGNyZWF0b3Jcbi8vIGluIHRoZSBidWlsZCwgYW5kIGNsb3N1cmUtY29tcGlsZXIgZG9lc24ndCBtaW5pZnkgdGhlbSBhd2F5XG5TY2hlbWEucHJvdG90eXBlLmZpZWxkcyA9IG51bGw7XG5TY2hlbWEucHJvdG90eXBlLm1ldGFkYXRhID0gbnVsbDtcblNjaGVtYS5wcm90b3R5cGUuZGljdGlvbmFyaWVzID0gbnVsbDtcbmV4cG9ydCBjbGFzcyBGaWVsZCB7XG4gICAgY29uc3RydWN0b3IobmFtZSwgdHlwZSwgbnVsbGFibGUgPSBmYWxzZSwgbWV0YWRhdGEpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5udWxsYWJsZSA9IG51bGxhYmxlO1xuICAgICAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGEgfHwgbmV3IE1hcCgpO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgbmV3KC4uLmFyZ3MpIHtcbiAgICAgICAgbGV0IFtuYW1lLCB0eXBlLCBudWxsYWJsZSwgbWV0YWRhdGFdID0gYXJncztcbiAgICAgICAgaWYgKGFyZ3NbMF0gJiYgdHlwZW9mIGFyZ3NbMF0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAoeyBuYW1lIH0gPSBhcmdzWzBdKTtcbiAgICAgICAgICAgICh0eXBlID09PSB1bmRlZmluZWQpICYmICh0eXBlID0gYXJnc1swXS50eXBlKTtcbiAgICAgICAgICAgIChudWxsYWJsZSA9PT0gdW5kZWZpbmVkKSAmJiAobnVsbGFibGUgPSBhcmdzWzBdLm51bGxhYmxlKTtcbiAgICAgICAgICAgIChtZXRhZGF0YSA9PT0gdW5kZWZpbmVkKSAmJiAobWV0YWRhdGEgPSBhcmdzWzBdLm1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZpZWxkKGAke25hbWV9YCwgdHlwZSwgbnVsbGFibGUsIG1ldGFkYXRhKTtcbiAgICB9XG4gICAgZ2V0IHR5cGVJZCgpIHsgcmV0dXJuIHRoaXMudHlwZS50eXBlSWQ7IH1cbiAgICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7IHJldHVybiAnRmllbGQnOyB9XG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiBgJHt0aGlzLm5hbWV9OiAke3RoaXMudHlwZX1gOyB9XG4gICAgY2xvbmUoLi4uYXJncykge1xuICAgICAgICBsZXQgW25hbWUsIHR5cGUsIG51bGxhYmxlLCBtZXRhZGF0YV0gPSBhcmdzO1xuICAgICAgICAoIWFyZ3NbMF0gfHwgdHlwZW9mIGFyZ3NbMF0gIT09ICdvYmplY3QnKVxuICAgICAgICAgICAgPyAoW25hbWUgPSB0aGlzLm5hbWUsIHR5cGUgPSB0aGlzLnR5cGUsIG51bGxhYmxlID0gdGhpcy5udWxsYWJsZSwgbWV0YWRhdGEgPSB0aGlzLm1ldGFkYXRhXSA9IGFyZ3MpXG4gICAgICAgICAgICA6ICh7IG5hbWUgPSB0aGlzLm5hbWUsIHR5cGUgPSB0aGlzLnR5cGUsIG51bGxhYmxlID0gdGhpcy5udWxsYWJsZSwgbWV0YWRhdGEgPSB0aGlzLm1ldGFkYXRhIH0gPSBhcmdzWzBdKTtcbiAgICAgICAgcmV0dXJuIEZpZWxkLm5ldyhuYW1lLCB0eXBlLCBudWxsYWJsZSwgbWV0YWRhdGEpO1xuICAgIH1cbn1cbi8vIEFkZCB0aGVzZSBoZXJlIHNvIHRoZXkncmUgcGlja2VkIHVwIGJ5IHRoZSBleHRlcm5zIGNyZWF0b3Jcbi8vIGluIHRoZSBidWlsZCwgYW5kIGNsb3N1cmUtY29tcGlsZXIgZG9lc24ndCBtaW5pZnkgdGhlbSBhd2F5XG5GaWVsZC5wcm90b3R5cGUudHlwZSA9IG51bGw7XG5GaWVsZC5wcm90b3R5cGUubmFtZSA9IG51bGw7XG5GaWVsZC5wcm90b3R5cGUubnVsbGFibGUgPSBudWxsO1xuRmllbGQucHJvdG90eXBlLm1ldGFkYXRhID0gbnVsbDtcbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBtZXJnZU1hcHMobTEsIG0yKSB7XG4gICAgcmV0dXJuIG5ldyBNYXAoWy4uLihtMSB8fCBuZXcgTWFwKCkpLCAuLi4obTIgfHwgbmV3IE1hcCgpKV0pO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGdlbmVyYXRlRGljdGlvbmFyeU1hcChmaWVsZHMsIGRpY3Rpb25hcmllcyA9IG5ldyBNYXAoKSkge1xuICAgIGZvciAobGV0IGkgPSAtMSwgbiA9IGZpZWxkcy5sZW5ndGg7ICsraSA8IG47KSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZmllbGRzW2ldO1xuICAgICAgICBjb25zdCB0eXBlID0gZmllbGQudHlwZTtcbiAgICAgICAgaWYgKERhdGFUeXBlLmlzRGljdGlvbmFyeSh0eXBlKSkge1xuICAgICAgICAgICAgaWYgKCFkaWN0aW9uYXJpZXMuaGFzKHR5cGUuaWQpKSB7XG4gICAgICAgICAgICAgICAgZGljdGlvbmFyaWVzLnNldCh0eXBlLmlkLCB0eXBlLmRpY3Rpb25hcnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZGljdGlvbmFyaWVzLmdldCh0eXBlLmlkKSAhPT0gdHlwZS5kaWN0aW9uYXJ5KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY3JlYXRlIFNjaGVtYSBjb250YWluaW5nIHR3byBkaWZmZXJlbnQgZGljdGlvbmFyaWVzIHdpdGggdGhlIHNhbWUgSWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZS5jaGlsZHJlbiAmJiB0eXBlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGdlbmVyYXRlRGljdGlvbmFyeU1hcCh0eXBlLmNoaWxkcmVuLCBkaWN0aW9uYXJpZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaWN0aW9uYXJpZXM7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNjaGVtYS5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbnZhciBfYTtcbmltcG9ydCB7IFR5cGUgfSBmcm9tICcuL2VudW0ubWpzJztcbmltcG9ydCB7IERhdGEsIG1ha2VEYXRhIH0gZnJvbSAnLi9kYXRhLm1qcyc7XG5pbXBvcnQgeyB2ZWN0b3JGcm9tQXJyYXkgfSBmcm9tICcuL2ZhY3Rvcmllcy5tanMnO1xuaW1wb3J0IHsgbWFrZVZlY3RvciwgVmVjdG9yIH0gZnJvbSAnLi92ZWN0b3IubWpzJztcbmltcG9ydCB7IEZpZWxkLCBTY2hlbWEgfSBmcm9tICcuL3NjaGVtYS5tanMnO1xuaW1wb3J0IHsgTnVsbCwgU3RydWN0IH0gZnJvbSAnLi90eXBlLm1qcyc7XG5pbXBvcnQgeyBjb21wYXJlU2NoZW1hcyB9IGZyb20gJy4vdmlzaXRvci90eXBlY29tcGFyYXRvci5tanMnO1xuaW1wb3J0IHsgZGlzdHJpYnV0ZVZlY3RvcnNJbnRvUmVjb3JkQmF0Y2hlcyB9IGZyb20gJy4vdXRpbC9yZWNvcmRiYXRjaC5tanMnO1xuaW1wb3J0IHsgaXNDaHVua2VkVmFsaWQsIGNvbXB1dGVDaHVua09mZnNldHMsIGNvbXB1dGVDaHVua051bGxDb3VudHMsIHdyYXBDaHVua2VkQ2FsbDEsIHdyYXBDaHVua2VkQ2FsbDIsIHdyYXBDaHVua2VkSW5kZXhPZiwgc2xpY2VDaHVua3MsIH0gZnJvbSAnLi91dGlsL2NodW5rLm1qcyc7XG5pbXBvcnQgeyBpbnN0YW5jZSBhcyBnZXRWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yL2dldC5tanMnO1xuaW1wb3J0IHsgaW5zdGFuY2UgYXMgc2V0VmlzaXRvciB9IGZyb20gJy4vdmlzaXRvci9zZXQubWpzJztcbmltcG9ydCB7IGluc3RhbmNlIGFzIGluZGV4T2ZWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yL2luZGV4b2YubWpzJztcbmltcG9ydCB7IGluc3RhbmNlIGFzIGl0ZXJhdG9yVmlzaXRvciB9IGZyb20gJy4vdmlzaXRvci9pdGVyYXRvci5tanMnO1xuaW1wb3J0IHsgaW5zdGFuY2UgYXMgYnl0ZUxlbmd0aFZpc2l0b3IgfSBmcm9tICcuL3Zpc2l0b3IvYnl0ZWxlbmd0aC5tanMnO1xuaW1wb3J0IHsgY2xhbXBSYW5nZSB9IGZyb20gJy4vdXRpbC92ZWN0b3IubWpzJztcbmltcG9ydCB7IFJlY29yZEJhdGNoIH0gZnJvbSAnLi9yZWNvcmRiYXRjaC5tanMnO1xuLyoqXG4gKiBUYWJsZXMgYXJlIGNvbGxlY3Rpb25zIG9mIHtAbGluayBWZWN0b3J9cyBhbmQgaGF2ZSBhIHtAbGluayBTY2hlbWF9LiBVc2UgdGhlIGNvbnZlbmllbmNlIG1ldGhvZHMge0BsaW5rIG1ha2VUYWJsZX1cbiAqIG9yIHtAbGluayB0YWJsZUZyb21BcnJheXN9IHRvIGNyZWF0ZSBhIHRhYmxlIGluIEphdmFTY3JpcHQuIFRvIGNyZWF0ZSBhIHRhYmxlIGZyb20gdGhlIElQQyBmb3JtYXQsIHVzZVxuICoge0BsaW5rIHRhYmxlRnJvbUlQQ30uXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWJsZSB7XG4gICAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgICAgICB2YXIgX2IsIF9jO1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYmF0Y2hlcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSBuZXcgU2NoZW1hKFtdKTtcbiAgICAgICAgICAgIHRoaXMuX29mZnNldHMgPSBbMF07XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2NoZW1hO1xuICAgICAgICBsZXQgb2Zmc2V0cztcbiAgICAgICAgaWYgKGFyZ3NbMF0gaW5zdGFuY2VvZiBTY2hlbWEpIHtcbiAgICAgICAgICAgIHNjaGVtYSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJnc1thcmdzLmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgVWludDMyQXJyYXkpIHtcbiAgICAgICAgICAgIG9mZnNldHMgPSBhcmdzLnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVud3JhcCA9ICh4KSA9PiB7XG4gICAgICAgICAgICBpZiAoeCkge1xuICAgICAgICAgICAgICAgIGlmICh4IGluc3RhbmNlb2YgUmVjb3JkQmF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt4XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoeCBpbnN0YW5jZW9mIFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4LmJhdGNoZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHggaW5zdGFuY2VvZiBEYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4LnR5cGUgaW5zdGFuY2VvZiBTdHJ1Y3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbbmV3IFJlY29yZEJhdGNoKG5ldyBTY2hlbWEoeC50eXBlLmNoaWxkcmVuKSwgeCldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHguZmxhdE1hcCh2ID0+IHVud3JhcCh2KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB4W1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsuLi54XS5mbGF0TWFwKHYgPT4gdW53cmFwKHYpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHggPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh4KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjcyA9IGtleXMubWFwKChrKSA9PiBuZXcgVmVjdG9yKFt4W2tdXSkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWEgPSBuZXcgU2NoZW1hKGtleXMubWFwKChrLCBpKSA9PiBuZXcgRmllbGQoU3RyaW5nKGspLCB2ZWNzW2ldLnR5cGUpKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFssIGJhdGNoZXNdID0gZGlzdHJpYnV0ZVZlY3RvcnNJbnRvUmVjb3JkQmF0Y2hlcyhzY2hlbWEsIHZlY3MpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmF0Y2hlcy5sZW5ndGggPT09IDAgPyBbbmV3IFJlY29yZEJhdGNoKHgpXSA6IGJhdGNoZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBiYXRjaGVzID0gYXJncy5mbGF0TWFwKHYgPT4gdW53cmFwKHYpKTtcbiAgICAgICAgc2NoZW1hID0gKF9jID0gc2NoZW1hICE9PSBudWxsICYmIHNjaGVtYSAhPT0gdm9pZCAwID8gc2NoZW1hIDogKF9iID0gYmF0Y2hlc1swXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnNjaGVtYSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogbmV3IFNjaGVtYShbXSk7XG4gICAgICAgIGlmICghKHNjaGVtYSBpbnN0YW5jZW9mIFNjaGVtYSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RhYmxlIGNvbnN0cnVjdG9yIGV4cGVjdHMgYSBbU2NoZW1hLCBSZWNvcmRCYXRjaFtdXSBwYWlyLicpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgYmF0Y2hlcykge1xuICAgICAgICAgICAgaWYgKCEoYmF0Y2ggaW5zdGFuY2VvZiBSZWNvcmRCYXRjaCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUYWJsZSBjb25zdHJ1Y3RvciBleHBlY3RzIGEgW1NjaGVtYSwgUmVjb3JkQmF0Y2hbXV0gcGFpci4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY29tcGFyZVNjaGVtYXMoc2NoZW1hLCBiYXRjaC5zY2hlbWEpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGFibGUgYW5kIGlubmVyIFJlY29yZEJhdGNoIHNjaGVtYXMgbXVzdCBiZSBlcXVpdmFsZW50LicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICB0aGlzLmJhdGNoZXMgPSBiYXRjaGVzO1xuICAgICAgICB0aGlzLl9vZmZzZXRzID0gb2Zmc2V0cyAhPT0gbnVsbCAmJiBvZmZzZXRzICE9PSB2b2lkIDAgPyBvZmZzZXRzIDogY29tcHV0ZUNodW5rT2Zmc2V0cyh0aGlzLmRhdGEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY29udGlndW91cyB7QGxpbmsgUmVjb3JkQmF0Y2ggYFJlY29yZEJhdGNoYH0gY2h1bmtzIG9mIHRoZSBUYWJsZSByb3dzLlxuICAgICAqL1xuICAgIGdldCBkYXRhKCkgeyByZXR1cm4gdGhpcy5iYXRjaGVzLm1hcCgoeyBkYXRhIH0pID0+IGRhdGEpOyB9XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoaXMgVGFibGUuXG4gICAgICovXG4gICAgZ2V0IG51bUNvbHMoKSB7IHJldHVybiB0aGlzLnNjaGVtYS5maWVsZHMubGVuZ3RoOyB9XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiByb3dzIGluIHRoaXMgVGFibGUuXG4gICAgICovXG4gICAgZ2V0IG51bVJvd3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEucmVkdWNlKChudW1Sb3dzLCBkYXRhKSA9PiBudW1Sb3dzICsgZGF0YS5sZW5ndGgsIDApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG51bGwgcm93cyBpbiB0aGlzIFRhYmxlLlxuICAgICAqL1xuICAgIGdldCBudWxsQ291bnQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9udWxsQ291bnQgPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLl9udWxsQ291bnQgPSBjb21wdXRlQ2h1bmtOdWxsQ291bnRzKHRoaXMuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX251bGxDb3VudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2sgd2hldGhlciBhbiBlbGVtZW50IGlzIG51bGwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGF0IHdoaWNoIHRvIHJlYWQgdGhlIHZhbGlkaXR5IGJpdG1hcC5cbiAgICAgKi9cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaXNWYWxpZChpbmRleCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAvKipcbiAgICAgKiBHZXQgYW4gZWxlbWVudCB2YWx1ZSBieSBwb3NpdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmVhZC5cbiAgICAgKi9cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgZ2V0KGluZGV4KSB7IHJldHVybiBudWxsOyB9XG4gICAgLyoqXG4gICAgICogU2V0IGFuIGVsZW1lbnQgdmFsdWUgYnkgcG9zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBzZXQoaW5kZXgsIHZhbHVlKSB7IHJldHVybjsgfVxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhIHZhbHVlIGluIGFuIFZlY3Rvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSB2YWx1ZSB0byBsb2NhdGUgaW4gdGhlIFZlY3Rvci5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBpbmRleCBhdCB3aGljaCB0byBiZWdpbiB0aGUgc2VhcmNoLiBJZiBvZmZzZXQgaXMgb21pdHRlZCwgdGhlIHNlYXJjaCBzdGFydHMgYXQgaW5kZXggMC5cbiAgICAgKi9cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaW5kZXhPZihlbGVtZW50LCBvZmZzZXQpIHsgcmV0dXJuIC0xOyB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIGVsZW1lbnQgYnkgaW5kZXguXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0byBnZXQgdGhlIGJ5dGVMZW5ndGguXG4gICAgICovXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGdldEJ5dGVMZW5ndGgoaW5kZXgpIHsgcmV0dXJuIDA7IH1cbiAgICAvKipcbiAgICAgKiBJdGVyYXRvciBmb3Igcm93cyBpbiB0aGlzIFRhYmxlLlxuICAgICAqL1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICBpZiAodGhpcy5iYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVyYXRvclZpc2l0b3IudmlzaXQobmV3IFZlY3Rvcih0aGlzLmRhdGEpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKG5ldyBBcnJheSgwKSlbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBKYXZhU2NyaXB0IEFycmF5IG9mIHRoZSBUYWJsZSByb3dzLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQW4gQXJyYXkgb2YgVGFibGUgcm93cy5cbiAgICAgKi9cbiAgICB0b0FycmF5KCkge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXNdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBUYWJsZSByb3dzLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFRhYmxlIHJvd3MuXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgW1xcbiAgJHt0aGlzLnRvQXJyYXkoKS5qb2luKCcsXFxuICAnKX1cXG5dYDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tYmluZXMgdHdvIG9yIG1vcmUgVGFibGVzIG9mIHRoZSBzYW1lIHNjaGVtYS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvdGhlcnMgQWRkaXRpb25hbCBUYWJsZXMgdG8gYWRkIHRvIHRoZSBlbmQgb2YgdGhpcyBUYWJsZXMuXG4gICAgICovXG4gICAgY29uY2F0KC4uLm90aGVycykge1xuICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLnNjaGVtYTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YS5jb25jYXQob3RoZXJzLmZsYXRNYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSk7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGUoc2NoZW1hLCBkYXRhLm1hcCgoZGF0YSkgPT4gbmV3IFJlY29yZEJhdGNoKHNjaGVtYSwgZGF0YSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgemVyby1jb3B5IHN1Yi1zZWN0aW9uIG9mIHRoaXMgVGFibGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYmVnaW4gVGhlIGJlZ2lubmluZyBvZiB0aGUgc3BlY2lmaWVkIHBvcnRpb24gb2YgdGhlIFRhYmxlLlxuICAgICAqIEBwYXJhbSBlbmQgVGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIHBvcnRpb24gb2YgdGhlIFRhYmxlLiBUaGlzIGlzIGV4Y2x1c2l2ZSBvZiB0aGUgZWxlbWVudCBhdCB0aGUgaW5kZXggJ2VuZCcuXG4gICAgICovXG4gICAgc2xpY2UoYmVnaW4sIGVuZCkge1xuICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLnNjaGVtYTtcbiAgICAgICAgW2JlZ2luLCBlbmRdID0gY2xhbXBSYW5nZSh7IGxlbmd0aDogdGhpcy5udW1Sb3dzIH0sIGJlZ2luLCBlbmQpO1xuICAgICAgICBjb25zdCBkYXRhID0gc2xpY2VDaHVua3ModGhpcy5kYXRhLCB0aGlzLl9vZmZzZXRzLCBiZWdpbiwgZW5kKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZShzY2hlbWEsIGRhdGEubWFwKChjaHVuaykgPT4gbmV3IFJlY29yZEJhdGNoKHNjaGVtYSwgY2h1bmspKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjaGlsZCBWZWN0b3IgYnkgbmFtZSwgb3IgbnVsbCBpZiB0aGlzIFZlY3RvciBoYXMgbm8gY2hpbGQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjaGlsZCB0byByZXRyaWV2ZS5cbiAgICAgKi9cbiAgICBnZXRDaGlsZChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENoaWxkQXQodGhpcy5zY2hlbWEuZmllbGRzLmZpbmRJbmRleCgoZikgPT4gZi5uYW1lID09PSBuYW1lKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjaGlsZCBWZWN0b3IgYnkgaW5kZXgsIG9yIG51bGwgaWYgdGhpcyBWZWN0b3IgaGFzIG5vIGNoaWxkIGF0IHRoZSBzdXBwbGllZCBpbmRleC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIHJldHJpZXZlLlxuICAgICAqL1xuICAgIGdldENoaWxkQXQoaW5kZXgpIHtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEgJiYgaW5kZXggPCB0aGlzLnNjaGVtYS5maWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhLm1hcCgoZGF0YSkgPT4gZGF0YS5jaGlsZHJlbltpbmRleF0pO1xuICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB0eXBlIH0gPSB0aGlzLnNjaGVtYS5maWVsZHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVtcHR5ID0gbWFrZURhdGEoeyB0eXBlLCBsZW5ndGg6IDAsIG51bGxDb3VudDogMCB9KTtcbiAgICAgICAgICAgICAgICBkYXRhLnB1c2goZW1wdHkuX2NoYW5nZUxlbmd0aEFuZEJhY2tmaWxsTnVsbEJpdG1hcCh0aGlzLm51bVJvd3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgY2hpbGQgVmVjdG9yIGJ5IG5hbWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY2hpbGQgdG8gb3ZlcndyaXRlLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IFRhYmxlIHdpdGggdGhlIHN1cHBsaWVkIGNoaWxkIGZvciB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gICAgICovXG4gICAgc2V0Q2hpbGQobmFtZSwgY2hpbGQpIHtcbiAgICAgICAgdmFyIF9iO1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRDaGlsZEF0KChfYiA9IHRoaXMuc2NoZW1hLmZpZWxkcykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmZpbmRJbmRleCgoZikgPT4gZi5uYW1lID09PSBuYW1lKSwgY2hpbGQpO1xuICAgIH1cbiAgICBzZXRDaGlsZEF0KGluZGV4LCBjaGlsZCkge1xuICAgICAgICBsZXQgc2NoZW1hID0gdGhpcy5zY2hlbWE7XG4gICAgICAgIGxldCBiYXRjaGVzID0gWy4uLnRoaXMuYmF0Y2hlc107XG4gICAgICAgIGlmIChpbmRleCA+IC0xICYmIGluZGV4IDwgdGhpcy5udW1Db2xzKSB7XG4gICAgICAgICAgICBpZiAoIWNoaWxkKSB7XG4gICAgICAgICAgICAgICAgY2hpbGQgPSBuZXcgVmVjdG9yKFttYWtlRGF0YSh7IHR5cGU6IG5ldyBOdWxsLCBsZW5ndGg6IHRoaXMubnVtUm93cyB9KV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmllbGRzID0gc2NoZW1hLmZpZWxkcy5zbGljZSgpO1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBmaWVsZHNbaW5kZXhdLmNsb25lKHsgdHlwZTogY2hpbGQudHlwZSB9KTtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5zY2hlbWEuZmllbGRzLm1hcCgoXywgaSkgPT4gdGhpcy5nZXRDaGlsZEF0KGkpKTtcbiAgICAgICAgICAgIFtmaWVsZHNbaW5kZXhdLCBjaGlsZHJlbltpbmRleF1dID0gW2ZpZWxkLCBjaGlsZF07XG4gICAgICAgICAgICBbc2NoZW1hLCBiYXRjaGVzXSA9IGRpc3RyaWJ1dGVWZWN0b3JzSW50b1JlY29yZEJhdGNoZXMoc2NoZW1hLCBjaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZShzY2hlbWEsIGJhdGNoZXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgVGFibGUgY29udGFpbmluZyBvbmx5IHNwZWNpZmllZCBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbHVtbk5hbWVzIE5hbWVzIG9mIGNvbHVtbnMgdG8ga2VlcC5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBUYWJsZSBvZiBjb2x1bW5zIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgbmFtZXMuXG4gICAgICovXG4gICAgc2VsZWN0KGNvbHVtbk5hbWVzKSB7XG4gICAgICAgIGNvbnN0IG5hbWVUb0luZGV4ID0gdGhpcy5zY2hlbWEuZmllbGRzLnJlZHVjZSgobSwgZiwgaSkgPT4gbS5zZXQoZi5uYW1lLCBpKSwgbmV3IE1hcCgpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0QXQoY29sdW1uTmFtZXMubWFwKChjb2x1bW5OYW1lKSA9PiBuYW1lVG9JbmRleC5nZXQoY29sdW1uTmFtZSkpLmZpbHRlcigoeCkgPT4geCA+IC0xKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIG5ldyBUYWJsZSBjb250YWluaW5nIG9ubHkgY29sdW1ucyBhdCB0aGUgc3BlY2lmaWVkIGluZGljZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29sdW1uSW5kaWNlcyBJbmRpY2VzIG9mIGNvbHVtbnMgdG8ga2VlcC5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBUYWJsZSBvZiBjb2x1bW5zIGF0IHRoZSBzcGVjaWZpZWQgaW5kaWNlcy5cbiAgICAgKi9cbiAgICBzZWxlY3RBdChjb2x1bW5JbmRpY2VzKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuc2NoZW1hLnNlbGVjdEF0KGNvbHVtbkluZGljZXMpO1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5iYXRjaGVzLm1hcCgoYmF0Y2gpID0+IGJhdGNoLnNlbGVjdEF0KGNvbHVtbkluZGljZXMpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZShzY2hlbWEsIGRhdGEpO1xuICAgIH1cbiAgICBhc3NpZ24ob3RoZXIpIHtcbiAgICAgICAgY29uc3QgZmllbGRzID0gdGhpcy5zY2hlbWEuZmllbGRzO1xuICAgICAgICBjb25zdCBbaW5kaWNlcywgb2xkVG9OZXddID0gb3RoZXIuc2NoZW1hLmZpZWxkcy5yZWR1Y2UoKG1lbW8sIGYyLCBuZXdJZHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtpbmRpY2VzLCBvbGRUb05ld10gPSBtZW1vO1xuICAgICAgICAgICAgY29uc3QgaSA9IGZpZWxkcy5maW5kSW5kZXgoKGYpID0+IGYubmFtZSA9PT0gZjIubmFtZSk7XG4gICAgICAgICAgICB+aSA/IChvbGRUb05ld1tpXSA9IG5ld0lkeCkgOiBpbmRpY2VzLnB1c2gobmV3SWR4KTtcbiAgICAgICAgICAgIHJldHVybiBtZW1vO1xuICAgICAgICB9LCBbW10sIFtdXSk7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuc2NoZW1hLmFzc2lnbihvdGhlci5zY2hlbWEpO1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gW1xuICAgICAgICAgICAgLi4uZmllbGRzLm1hcCgoXywgaSkgPT4gW2ksIG9sZFRvTmV3W2ldXSkubWFwKChbaSwgal0pID0+IChqID09PSB1bmRlZmluZWQgPyB0aGlzLmdldENoaWxkQXQoaSkgOiBvdGhlci5nZXRDaGlsZEF0KGopKSksXG4gICAgICAgICAgICAuLi5pbmRpY2VzLm1hcCgoaSkgPT4gb3RoZXIuZ2V0Q2hpbGRBdChpKSlcbiAgICAgICAgXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGUoLi4uZGlzdHJpYnV0ZVZlY3RvcnNJbnRvUmVjb3JkQmF0Y2hlcyhzY2hlbWEsIGNvbHVtbnMpKTtcbiAgICB9XG59XG5fYSA9IFN5bWJvbC50b1N0cmluZ1RhZztcbi8vIEluaXRpYWxpemUgdGhpcyBzdGF0aWMgcHJvcGVydHkgdmlhIGFuIElJRkUgc28gYnVuZGxlcnMgZG9uJ3QgdHJlZS1zaGFrZVxuLy8gb3V0IHRoaXMgbG9naWMsIGJ1dCBhbHNvIHNvIHdlJ3JlIHN0aWxsIGNvbXBsaWFudCB3aXRoIGBcInNpZGVFZmZlY3RzXCI6IGZhbHNlYFxuVGFibGVbX2FdID0gKChwcm90bykgPT4ge1xuICAgIHByb3RvLnNjaGVtYSA9IG51bGw7XG4gICAgcHJvdG8uYmF0Y2hlcyA9IFtdO1xuICAgIHByb3RvLl9vZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KFswXSk7XG4gICAgcHJvdG8uX251bGxDb3VudCA9IC0xO1xuICAgIHByb3RvW1N5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGVdID0gdHJ1ZTtcbiAgICBwcm90b1snaXNWYWxpZCddID0gd3JhcENodW5rZWRDYWxsMShpc0NodW5rZWRWYWxpZCk7XG4gICAgcHJvdG9bJ2dldCddID0gd3JhcENodW5rZWRDYWxsMShnZXRWaXNpdG9yLmdldFZpc2l0Rm4oVHlwZS5TdHJ1Y3QpKTtcbiAgICBwcm90b1snc2V0J10gPSB3cmFwQ2h1bmtlZENhbGwyKHNldFZpc2l0b3IuZ2V0VmlzaXRGbihUeXBlLlN0cnVjdCkpO1xuICAgIHByb3RvWydpbmRleE9mJ10gPSB3cmFwQ2h1bmtlZEluZGV4T2YoaW5kZXhPZlZpc2l0b3IuZ2V0VmlzaXRGbihUeXBlLlN0cnVjdCkpO1xuICAgIHByb3RvWydnZXRCeXRlTGVuZ3RoJ10gPSB3cmFwQ2h1bmtlZENhbGwxKGJ5dGVMZW5ndGhWaXNpdG9yLmdldFZpc2l0Rm4oVHlwZS5TdHJ1Y3QpKTtcbiAgICByZXR1cm4gJ1RhYmxlJztcbn0pKFRhYmxlLnByb3RvdHlwZSk7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVGFibGUgZnJvbSBhbiBvYmplY3Qgb2YgdHlwZWQgYXJyYXlzLlxuICpcbiogIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgdGFibGUgPSBtYWtlVGFibGUoe1xuICogICBhOiBuZXcgSW50OEFycmF5KFsxLCAyLCAzXSksXG4gKiB9KVxuICogYGBgXG4gKlxuICogQHBhcmFtIGlucHV0IElucHV0IGFuIG9iamVjdCBvZiB0eXBlZCBhcnJheXMuXG4gKiBAcmV0dXJucyBBIG5ldyBUYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VUYWJsZShpbnB1dCkge1xuICAgIGNvbnN0IHZlY3MgPSB7fTtcbiAgICBjb25zdCBpbnB1dHMgPSBPYmplY3QuZW50cmllcyhpbnB1dCk7XG4gICAgZm9yIChjb25zdCBba2V5LCBjb2xdIG9mIGlucHV0cykge1xuICAgICAgICB2ZWNzW2tleV0gPSBtYWtlVmVjdG9yKGNvbCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGFibGUodmVjcyk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVGFibGUgZnJvbSBhbiBvYmplY3Qgb2YgdHlwZWQgYXJyYXlzIG9yIEphdmFTY3JpcHQgYXJyYXlzLlxuICpcbiAqICBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHRhYmxlID0gdGFibGVGcm9tQXJyYXlzKHtcbiAqICAgYTogWzEsIDIsIDNdLFxuICogICBiOiBuZXcgSW50OEFycmF5KFsxLCAyLCAzXSksXG4gKiB9KVxuICogYGBgXG4gKlxuICogQHBhcmFtIGlucHV0IElucHV0IGFuIG9iamVjdCBvZiB0eXBlZCBhcnJheXMgb3IgSmF2YVNjcmlwdCBhcnJheXMuXG4gKiBAcmV0dXJucyBBIG5ldyBUYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhYmxlRnJvbUFycmF5cyhpbnB1dCkge1xuICAgIGNvbnN0IHZlY3MgPSB7fTtcbiAgICBjb25zdCBpbnB1dHMgPSBPYmplY3QuZW50cmllcyhpbnB1dCk7XG4gICAgZm9yIChjb25zdCBba2V5LCBjb2xdIG9mIGlucHV0cykge1xuICAgICAgICB2ZWNzW2tleV0gPSB2ZWN0b3JGcm9tQXJyYXkoY29sKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUYWJsZSh2ZWNzKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFibGUubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG52YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2ssIF9sLCBfbSwgX28sIF9wLCBfcSwgX3IsIF9zLCBfdCwgX3U7XG5pbXBvcnQgeyBUeXBlLCBQcmVjaXNpb24sIFVuaW9uTW9kZSwgRGF0ZVVuaXQsIFRpbWVVbml0LCBJbnRlcnZhbFVuaXQgfSBmcm9tICcuL2VudW0ubWpzJztcbi8qKlxuICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY2xhc3NlcyB0aGF0IGVuY2Fwc3VsYXRlIG1ldGFkYXRhIGFib3V0IGVhY2ggb2ZcbiAqIHRoZSBsb2dpY2FsIHR5cGVzIHRoYXQgQXJyb3cgY2FuIHJlcHJlc2VudC5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFUeXBlIHtcbiAgICAvKiogQG5vY29sbGFwc2UgKi8gc3RhdGljIGlzTnVsbCh4KSB7IHJldHVybiAoeCA9PT0gbnVsbCB8fCB4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB4LnR5cGVJZCkgPT09IFR5cGUuTnVsbDsgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBzdGF0aWMgaXNJbnQoeCkgeyByZXR1cm4gKHggPT09IG51bGwgfHwgeCA9PT0gdm9pZCAwID8gdm9pZCAwIDogeC50eXBlSWQpID09PSBUeXBlLkludDsgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBzdGF0aWMgaXNGbG9hdCh4KSB7IHJldHVybiAoeCA9PT0gbnVsbCB8fCB4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB4LnR5cGVJZCkgPT09IFR5cGUuRmxvYXQ7IH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi8gc3RhdGljIGlzQmluYXJ5KHgpIHsgcmV0dXJuICh4ID09PSBudWxsIHx8IHggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHgudHlwZUlkKSA9PT0gVHlwZS5CaW5hcnk7IH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi8gc3RhdGljIGlzVXRmOCh4KSB7IHJldHVybiAoeCA9PT0gbnVsbCB8fCB4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB4LnR5cGVJZCkgPT09IFR5cGUuVXRmODsgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBzdGF0aWMgaXNCb29sKHgpIHsgcmV0dXJuICh4ID09PSBudWxsIHx8IHggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHgudHlwZUlkKSA9PT0gVHlwZS5Cb29sOyB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovIHN0YXRpYyBpc0RlY2ltYWwoeCkgeyByZXR1cm4gKHggPT09IG51bGwgfHwgeCA9PT0gdm9pZCAwID8gdm9pZCAwIDogeC50eXBlSWQpID09PSBUeXBlLkRlY2ltYWw7IH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi8gc3RhdGljIGlzRGF0ZSh4KSB7IHJldHVybiAoeCA9PT0gbnVsbCB8fCB4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB4LnR5cGVJZCkgPT09IFR5cGUuRGF0ZTsgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBzdGF0aWMgaXNUaW1lKHgpIHsgcmV0dXJuICh4ID09PSBudWxsIHx8IHggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHgudHlwZUlkKSA9PT0gVHlwZS5UaW1lOyB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovIHN0YXRpYyBpc1RpbWVzdGFtcCh4KSB7IHJldHVybiAoeCA9PT0gbnVsbCB8fCB4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB4LnR5cGVJZCkgPT09IFR5cGUuVGltZXN0YW1wOyB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovIHN0YXRpYyBpc0ludGVydmFsKHgpIHsgcmV0dXJuICh4ID09PSBudWxsIHx8IHggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHgudHlwZUlkKSA9PT0gVHlwZS5JbnRlcnZhbDsgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBzdGF0aWMgaXNMaXN0KHgpIHsgcmV0dXJuICh4ID09PSBudWxsIHx8IHggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHgudHlwZUlkKSA9PT0gVHlwZS5MaXN0OyB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovIHN0YXRpYyBpc1N0cnVjdCh4KSB7IHJldHVybiAoeCA9PT0gbnVsbCB8fCB4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB4LnR5cGVJZCkgPT09IFR5cGUuU3RydWN0OyB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovIHN0YXRpYyBpc1VuaW9uKHgpIHsgcmV0dXJuICh4ID09PSBudWxsIHx8IHggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHgudHlwZUlkKSA9PT0gVHlwZS5VbmlvbjsgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBzdGF0aWMgaXNGaXhlZFNpemVCaW5hcnkoeCkgeyByZXR1cm4gKHggPT09IG51bGwgfHwgeCA9PT0gdm9pZCAwID8gdm9pZCAwIDogeC50eXBlSWQpID09PSBUeXBlLkZpeGVkU2l6ZUJpbmFyeTsgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBzdGF0aWMgaXNGaXhlZFNpemVMaXN0KHgpIHsgcmV0dXJuICh4ID09PSBudWxsIHx8IHggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHgudHlwZUlkKSA9PT0gVHlwZS5GaXhlZFNpemVMaXN0OyB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovIHN0YXRpYyBpc01hcCh4KSB7IHJldHVybiAoeCA9PT0gbnVsbCB8fCB4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB4LnR5cGVJZCkgPT09IFR5cGUuTWFwOyB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovIHN0YXRpYyBpc0RpY3Rpb25hcnkoeCkgeyByZXR1cm4gKHggPT09IG51bGwgfHwgeCA9PT0gdm9pZCAwID8gdm9pZCAwIDogeC50eXBlSWQpID09PSBUeXBlLkRpY3Rpb25hcnk7IH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi8gc3RhdGljIGlzRGVuc2VVbmlvbih4KSB7IHJldHVybiBEYXRhVHlwZS5pc1VuaW9uKHgpICYmIHgubW9kZSA9PT0gVW5pb25Nb2RlLkRlbnNlOyB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovIHN0YXRpYyBpc1NwYXJzZVVuaW9uKHgpIHsgcmV0dXJuIERhdGFUeXBlLmlzVW5pb24oeCkgJiYgeC5tb2RlID09PSBVbmlvbk1vZGUuU3BhcnNlOyB9XG4gICAgZ2V0IHR5cGVJZCgpIHsgcmV0dXJuIFR5cGUuTk9ORTsgfVxufVxuX2EgPSBTeW1ib2wudG9TdHJpbmdUYWc7XG5EYXRhVHlwZVtfYV0gPSAoKHByb3RvKSA9PiB7XG4gICAgcHJvdG8uY2hpbGRyZW4gPSBudWxsO1xuICAgIHByb3RvLkFycmF5VHlwZSA9IEFycmF5O1xuICAgIHJldHVybiBwcm90b1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ0RhdGFUeXBlJztcbn0pKERhdGFUeXBlLnByb3RvdHlwZSk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIE51bGwgZXh0ZW5kcyBEYXRhVHlwZSB7XG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiBgTnVsbGA7IH1cbiAgICBnZXQgdHlwZUlkKCkgeyByZXR1cm4gVHlwZS5OdWxsOyB9XG59XG5fYiA9IFN5bWJvbC50b1N0cmluZ1RhZztcbk51bGxbX2JdID0gKChwcm90bykgPT4gcHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdOdWxsJykoTnVsbC5wcm90b3R5cGUpO1xuLyoqIEBpZ25vcmUgKi9cbmNsYXNzIEludF8gZXh0ZW5kcyBEYXRhVHlwZSB7XG4gICAgY29uc3RydWN0b3IoaXNTaWduZWQsIGJpdFdpZHRoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaXNTaWduZWQgPSBpc1NpZ25lZDtcbiAgICAgICAgdGhpcy5iaXRXaWR0aCA9IGJpdFdpZHRoO1xuICAgIH1cbiAgICBnZXQgdHlwZUlkKCkgeyByZXR1cm4gVHlwZS5JbnQ7IH1cbiAgICBnZXQgQXJyYXlUeXBlKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuYml0V2lkdGgpIHtcbiAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIHRoaXMuaXNTaWduZWQgPyBJbnQ4QXJyYXkgOiBVaW50OEFycmF5O1xuICAgICAgICAgICAgY2FzZSAxNjogcmV0dXJuIHRoaXMuaXNTaWduZWQgPyBJbnQxNkFycmF5IDogVWludDE2QXJyYXk7XG4gICAgICAgICAgICBjYXNlIDMyOiByZXR1cm4gdGhpcy5pc1NpZ25lZCA/IEludDMyQXJyYXkgOiBVaW50MzJBcnJheTtcbiAgICAgICAgICAgIGNhc2UgNjQ6IHJldHVybiB0aGlzLmlzU2lnbmVkID8gQmlnSW50NjRBcnJheSA6IEJpZ1VpbnQ2NEFycmF5O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkICR7dGhpc1tTeW1ib2wudG9TdHJpbmdUYWddfSB0eXBlYCk7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gYCR7dGhpcy5pc1NpZ25lZCA/IGBJYCA6IGBVaWB9bnQke3RoaXMuYml0V2lkdGh9YDsgfVxufVxuX2MgPSBTeW1ib2wudG9TdHJpbmdUYWc7XG5JbnRfW19jXSA9ICgocHJvdG8pID0+IHtcbiAgICBwcm90by5pc1NpZ25lZCA9IG51bGw7XG4gICAgcHJvdG8uYml0V2lkdGggPSBudWxsO1xuICAgIHJldHVybiBwcm90b1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ0ludCc7XG59KShJbnRfLnByb3RvdHlwZSk7XG5leHBvcnQgeyBJbnRfIGFzIEludCB9O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBJbnQ4IGV4dGVuZHMgSW50XyB7XG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKHRydWUsIDgpOyB9XG4gICAgZ2V0IEFycmF5VHlwZSgpIHsgcmV0dXJuIEludDhBcnJheTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBJbnQxNiBleHRlbmRzIEludF8ge1xuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcih0cnVlLCAxNik7IH1cbiAgICBnZXQgQXJyYXlUeXBlKCkgeyByZXR1cm4gSW50MTZBcnJheTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBJbnQzMiBleHRlbmRzIEludF8ge1xuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcih0cnVlLCAzMik7IH1cbiAgICBnZXQgQXJyYXlUeXBlKCkgeyByZXR1cm4gSW50MzJBcnJheTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBJbnQ2NCBleHRlbmRzIEludF8ge1xuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcih0cnVlLCA2NCk7IH1cbiAgICBnZXQgQXJyYXlUeXBlKCkgeyByZXR1cm4gQmlnSW50NjRBcnJheTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBVaW50OCBleHRlbmRzIEludF8ge1xuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcihmYWxzZSwgOCk7IH1cbiAgICBnZXQgQXJyYXlUeXBlKCkgeyByZXR1cm4gVWludDhBcnJheTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBVaW50MTYgZXh0ZW5kcyBJbnRfIHtcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoZmFsc2UsIDE2KTsgfVxuICAgIGdldCBBcnJheVR5cGUoKSB7IHJldHVybiBVaW50MTZBcnJheTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBVaW50MzIgZXh0ZW5kcyBJbnRfIHtcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoZmFsc2UsIDMyKTsgfVxuICAgIGdldCBBcnJheVR5cGUoKSB7IHJldHVybiBVaW50MzJBcnJheTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBVaW50NjQgZXh0ZW5kcyBJbnRfIHtcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoZmFsc2UsIDY0KTsgfVxuICAgIGdldCBBcnJheVR5cGUoKSB7IHJldHVybiBCaWdVaW50NjRBcnJheTsgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEludDgucHJvdG90eXBlLCAnQXJyYXlUeXBlJywgeyB2YWx1ZTogSW50OEFycmF5IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEludDE2LnByb3RvdHlwZSwgJ0FycmF5VHlwZScsIHsgdmFsdWU6IEludDE2QXJyYXkgfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoSW50MzIucHJvdG90eXBlLCAnQXJyYXlUeXBlJywgeyB2YWx1ZTogSW50MzJBcnJheSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShJbnQ2NC5wcm90b3R5cGUsICdBcnJheVR5cGUnLCB7IHZhbHVlOiBCaWdJbnQ2NEFycmF5IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFVpbnQ4LnByb3RvdHlwZSwgJ0FycmF5VHlwZScsIHsgdmFsdWU6IFVpbnQ4QXJyYXkgfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVWludDE2LnByb3RvdHlwZSwgJ0FycmF5VHlwZScsIHsgdmFsdWU6IFVpbnQxNkFycmF5IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFVpbnQzMi5wcm90b3R5cGUsICdBcnJheVR5cGUnLCB7IHZhbHVlOiBVaW50MzJBcnJheSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShVaW50NjQucHJvdG90eXBlLCAnQXJyYXlUeXBlJywgeyB2YWx1ZTogQmlnVWludDY0QXJyYXkgfSk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEZsb2F0IGV4dGVuZHMgRGF0YVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKHByZWNpc2lvbikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnByZWNpc2lvbiA9IHByZWNpc2lvbjtcbiAgICB9XG4gICAgZ2V0IHR5cGVJZCgpIHsgcmV0dXJuIFR5cGUuRmxvYXQ7IH1cbiAgICBnZXQgQXJyYXlUeXBlKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMucHJlY2lzaW9uKSB7XG4gICAgICAgICAgICBjYXNlIFByZWNpc2lvbi5IQUxGOiByZXR1cm4gVWludDE2QXJyYXk7XG4gICAgICAgICAgICBjYXNlIFByZWNpc2lvbi5TSU5HTEU6IHJldHVybiBGbG9hdDMyQXJyYXk7XG4gICAgICAgICAgICBjYXNlIFByZWNpc2lvbi5ET1VCTEU6IHJldHVybiBGbG9hdDY0QXJyYXk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCAke3RoaXNbU3ltYm9sLnRvU3RyaW5nVGFnXX0gdHlwZWApO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIGBGbG9hdCR7KHRoaXMucHJlY2lzaW9uIDw8IDUpIHx8IDE2fWA7IH1cbn1cbl9kID0gU3ltYm9sLnRvU3RyaW5nVGFnO1xuRmxvYXRbX2RdID0gKChwcm90bykgPT4ge1xuICAgIHByb3RvLnByZWNpc2lvbiA9IG51bGw7XG4gICAgcmV0dXJuIHByb3RvW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnRmxvYXQnO1xufSkoRmxvYXQucHJvdG90eXBlKTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgRmxvYXQxNiBleHRlbmRzIEZsb2F0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoUHJlY2lzaW9uLkhBTEYpOyB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEZsb2F0MzIgZXh0ZW5kcyBGbG9hdCB7XG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKFByZWNpc2lvbi5TSU5HTEUpOyB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEZsb2F0NjQgZXh0ZW5kcyBGbG9hdCB7XG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKFByZWNpc2lvbi5ET1VCTEUpOyB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRmxvYXQxNi5wcm90b3R5cGUsICdBcnJheVR5cGUnLCB7IHZhbHVlOiBVaW50MTZBcnJheSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShGbG9hdDMyLnByb3RvdHlwZSwgJ0FycmF5VHlwZScsIHsgdmFsdWU6IEZsb2F0MzJBcnJheSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShGbG9hdDY0LnByb3RvdHlwZSwgJ0FycmF5VHlwZScsIHsgdmFsdWU6IEZsb2F0NjRBcnJheSB9KTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgQmluYXJ5IGV4dGVuZHMgRGF0YVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbiAgICBnZXQgdHlwZUlkKCkgeyByZXR1cm4gVHlwZS5CaW5hcnk7IH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIGBCaW5hcnlgOyB9XG59XG5fZSA9IFN5bWJvbC50b1N0cmluZ1RhZztcbkJpbmFyeVtfZV0gPSAoKHByb3RvKSA9PiB7XG4gICAgcHJvdG8uQXJyYXlUeXBlID0gVWludDhBcnJheTtcbiAgICByZXR1cm4gcHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdCaW5hcnknO1xufSkoQmluYXJ5LnByb3RvdHlwZSk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFV0ZjggZXh0ZW5kcyBEYXRhVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgIGdldCB0eXBlSWQoKSB7IHJldHVybiBUeXBlLlV0Zjg7IH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIGBVdGY4YDsgfVxufVxuX2YgPSBTeW1ib2wudG9TdHJpbmdUYWc7XG5VdGY4W19mXSA9ICgocHJvdG8pID0+IHtcbiAgICBwcm90by5BcnJheVR5cGUgPSBVaW50OEFycmF5O1xuICAgIHJldHVybiBwcm90b1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ1V0ZjgnO1xufSkoVXRmOC5wcm90b3R5cGUpO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBCb29sIGV4dGVuZHMgRGF0YVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbiAgICBnZXQgdHlwZUlkKCkgeyByZXR1cm4gVHlwZS5Cb29sOyB9XG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiBgQm9vbGA7IH1cbn1cbl9nID0gU3ltYm9sLnRvU3RyaW5nVGFnO1xuQm9vbFtfZ10gPSAoKHByb3RvKSA9PiB7XG4gICAgcHJvdG8uQXJyYXlUeXBlID0gVWludDhBcnJheTtcbiAgICByZXR1cm4gcHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdCb29sJztcbn0pKEJvb2wucHJvdG90eXBlKTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgRGVjaW1hbCBleHRlbmRzIERhdGFUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihzY2FsZSwgcHJlY2lzaW9uLCBiaXRXaWR0aCA9IDEyOCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNjYWxlID0gc2NhbGU7XG4gICAgICAgIHRoaXMucHJlY2lzaW9uID0gcHJlY2lzaW9uO1xuICAgICAgICB0aGlzLmJpdFdpZHRoID0gYml0V2lkdGg7XG4gICAgfVxuICAgIGdldCB0eXBlSWQoKSB7IHJldHVybiBUeXBlLkRlY2ltYWw7IH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIGBEZWNpbWFsWyR7dGhpcy5wcmVjaXNpb259ZSR7dGhpcy5zY2FsZSA+IDAgPyBgK2AgOiBgYH0ke3RoaXMuc2NhbGV9XWA7IH1cbn1cbl9oID0gU3ltYm9sLnRvU3RyaW5nVGFnO1xuRGVjaW1hbFtfaF0gPSAoKHByb3RvKSA9PiB7XG4gICAgcHJvdG8uc2NhbGUgPSBudWxsO1xuICAgIHByb3RvLnByZWNpc2lvbiA9IG51bGw7XG4gICAgcHJvdG8uQXJyYXlUeXBlID0gVWludDMyQXJyYXk7XG4gICAgcmV0dXJuIHByb3RvW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnRGVjaW1hbCc7XG59KShEZWNpbWFsLnByb3RvdHlwZSk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIERhdGVfIGV4dGVuZHMgRGF0YVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKHVuaXQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy51bml0ID0gdW5pdDtcbiAgICB9XG4gICAgZ2V0IHR5cGVJZCgpIHsgcmV0dXJuIFR5cGUuRGF0ZTsgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gYERhdGUkeyh0aGlzLnVuaXQgKyAxKSAqIDMyfTwke0RhdGVVbml0W3RoaXMudW5pdF19PmA7IH1cbn1cbl9qID0gU3ltYm9sLnRvU3RyaW5nVGFnO1xuRGF0ZV9bX2pdID0gKChwcm90bykgPT4ge1xuICAgIHByb3RvLnVuaXQgPSBudWxsO1xuICAgIHByb3RvLkFycmF5VHlwZSA9IEludDMyQXJyYXk7XG4gICAgcmV0dXJuIHByb3RvW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnRGF0ZSc7XG59KShEYXRlXy5wcm90b3R5cGUpO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBEYXRlRGF5IGV4dGVuZHMgRGF0ZV8ge1xuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcihEYXRlVW5pdC5EQVkpOyB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIERhdGVNaWxsaXNlY29uZCBleHRlbmRzIERhdGVfIHtcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoRGF0ZVVuaXQuTUlMTElTRUNPTkQpOyB9XG59XG4vKiogQGlnbm9yZSAqL1xuY2xhc3MgVGltZV8gZXh0ZW5kcyBEYXRhVHlwZSB7XG4gICAgY29uc3RydWN0b3IodW5pdCwgYml0V2lkdGgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy51bml0ID0gdW5pdDtcbiAgICAgICAgdGhpcy5iaXRXaWR0aCA9IGJpdFdpZHRoO1xuICAgIH1cbiAgICBnZXQgdHlwZUlkKCkgeyByZXR1cm4gVHlwZS5UaW1lOyB9XG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiBgVGltZSR7dGhpcy5iaXRXaWR0aH08JHtUaW1lVW5pdFt0aGlzLnVuaXRdfT5gOyB9XG4gICAgZ2V0IEFycmF5VHlwZSgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmJpdFdpZHRoKSB7XG4gICAgICAgICAgICBjYXNlIDMyOiByZXR1cm4gSW50MzJBcnJheTtcbiAgICAgICAgICAgIGNhc2UgNjQ6IHJldHVybiBCaWdJbnQ2NEFycmF5O1xuICAgICAgICB9XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgJHt0aGlzW1N5bWJvbC50b1N0cmluZ1RhZ119IHR5cGVgKTtcbiAgICB9XG59XG5fayA9IFN5bWJvbC50b1N0cmluZ1RhZztcblRpbWVfW19rXSA9ICgocHJvdG8pID0+IHtcbiAgICBwcm90by51bml0ID0gbnVsbDtcbiAgICBwcm90by5iaXRXaWR0aCA9IG51bGw7XG4gICAgcmV0dXJuIHByb3RvW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnVGltZSc7XG59KShUaW1lXy5wcm90b3R5cGUpO1xuZXhwb3J0IHsgVGltZV8gYXMgVGltZSB9O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBUaW1lU2Vjb25kIGV4dGVuZHMgVGltZV8ge1xuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcihUaW1lVW5pdC5TRUNPTkQsIDMyKTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBUaW1lTWlsbGlzZWNvbmQgZXh0ZW5kcyBUaW1lXyB7XG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKFRpbWVVbml0Lk1JTExJU0VDT05ELCAzMik7IH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVGltZU1pY3Jvc2Vjb25kIGV4dGVuZHMgVGltZV8ge1xuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcihUaW1lVW5pdC5NSUNST1NFQ09ORCwgNjQpOyB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFRpbWVOYW5vc2Vjb25kIGV4dGVuZHMgVGltZV8ge1xuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcihUaW1lVW5pdC5OQU5PU0VDT05ELCA2NCk7IH1cbn1cbi8qKiBAaWdub3JlICovXG5jbGFzcyBUaW1lc3RhbXBfIGV4dGVuZHMgRGF0YVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKHVuaXQsIHRpbWV6b25lKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudW5pdCA9IHVuaXQ7XG4gICAgICAgIHRoaXMudGltZXpvbmUgPSB0aW1lem9uZTtcbiAgICB9XG4gICAgZ2V0IHR5cGVJZCgpIHsgcmV0dXJuIFR5cGUuVGltZXN0YW1wOyB9XG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiBgVGltZXN0YW1wPCR7VGltZVVuaXRbdGhpcy51bml0XX0ke3RoaXMudGltZXpvbmUgPyBgLCAke3RoaXMudGltZXpvbmV9YCA6IGBgfT5gOyB9XG59XG5fbCA9IFN5bWJvbC50b1N0cmluZ1RhZztcblRpbWVzdGFtcF9bX2xdID0gKChwcm90bykgPT4ge1xuICAgIHByb3RvLnVuaXQgPSBudWxsO1xuICAgIHByb3RvLnRpbWV6b25lID0gbnVsbDtcbiAgICBwcm90by5BcnJheVR5cGUgPSBJbnQzMkFycmF5O1xuICAgIHJldHVybiBwcm90b1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ1RpbWVzdGFtcCc7XG59KShUaW1lc3RhbXBfLnByb3RvdHlwZSk7XG5leHBvcnQgeyBUaW1lc3RhbXBfIGFzIFRpbWVzdGFtcCB9O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBUaW1lc3RhbXBTZWNvbmQgZXh0ZW5kcyBUaW1lc3RhbXBfIHtcbiAgICBjb25zdHJ1Y3Rvcih0aW1lem9uZSkgeyBzdXBlcihUaW1lVW5pdC5TRUNPTkQsIHRpbWV6b25lKTsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBUaW1lc3RhbXBNaWxsaXNlY29uZCBleHRlbmRzIFRpbWVzdGFtcF8ge1xuICAgIGNvbnN0cnVjdG9yKHRpbWV6b25lKSB7IHN1cGVyKFRpbWVVbml0Lk1JTExJU0VDT05ELCB0aW1lem9uZSk7IH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgVGltZXN0YW1wTWljcm9zZWNvbmQgZXh0ZW5kcyBUaW1lc3RhbXBfIHtcbiAgICBjb25zdHJ1Y3Rvcih0aW1lem9uZSkgeyBzdXBlcihUaW1lVW5pdC5NSUNST1NFQ09ORCwgdGltZXpvbmUpOyB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFRpbWVzdGFtcE5hbm9zZWNvbmQgZXh0ZW5kcyBUaW1lc3RhbXBfIHtcbiAgICBjb25zdHJ1Y3Rvcih0aW1lem9uZSkgeyBzdXBlcihUaW1lVW5pdC5OQU5PU0VDT05ELCB0aW1lem9uZSk7IH1cbn1cbi8qKiBAaWdub3JlICovXG5jbGFzcyBJbnRlcnZhbF8gZXh0ZW5kcyBEYXRhVHlwZSB7XG4gICAgY29uc3RydWN0b3IodW5pdCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnVuaXQgPSB1bml0O1xuICAgIH1cbiAgICBnZXQgdHlwZUlkKCkgeyByZXR1cm4gVHlwZS5JbnRlcnZhbDsgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gYEludGVydmFsPCR7SW50ZXJ2YWxVbml0W3RoaXMudW5pdF19PmA7IH1cbn1cbl9tID0gU3ltYm9sLnRvU3RyaW5nVGFnO1xuSW50ZXJ2YWxfW19tXSA9ICgocHJvdG8pID0+IHtcbiAgICBwcm90by51bml0ID0gbnVsbDtcbiAgICBwcm90by5BcnJheVR5cGUgPSBJbnQzMkFycmF5O1xuICAgIHJldHVybiBwcm90b1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ0ludGVydmFsJztcbn0pKEludGVydmFsXy5wcm90b3R5cGUpO1xuZXhwb3J0IHsgSW50ZXJ2YWxfIGFzIEludGVydmFsIH07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEludGVydmFsRGF5VGltZSBleHRlbmRzIEludGVydmFsXyB7XG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKEludGVydmFsVW5pdC5EQVlfVElNRSk7IH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgSW50ZXJ2YWxZZWFyTW9udGggZXh0ZW5kcyBJbnRlcnZhbF8ge1xuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcihJbnRlcnZhbFVuaXQuWUVBUl9NT05USCk7IH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgTGlzdCBleHRlbmRzIERhdGFUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihjaGlsZCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW2NoaWxkXTtcbiAgICB9XG4gICAgZ2V0IHR5cGVJZCgpIHsgcmV0dXJuIFR5cGUuTGlzdDsgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gYExpc3Q8JHt0aGlzLnZhbHVlVHlwZX0+YDsgfVxuICAgIGdldCB2YWx1ZVR5cGUoKSB7IHJldHVybiB0aGlzLmNoaWxkcmVuWzBdLnR5cGU7IH1cbiAgICBnZXQgdmFsdWVGaWVsZCgpIHsgcmV0dXJuIHRoaXMuY2hpbGRyZW5bMF07IH1cbiAgICBnZXQgQXJyYXlUeXBlKCkgeyByZXR1cm4gdGhpcy52YWx1ZVR5cGUuQXJyYXlUeXBlOyB9XG59XG5fbyA9IFN5bWJvbC50b1N0cmluZ1RhZztcbkxpc3RbX29dID0gKChwcm90bykgPT4ge1xuICAgIHByb3RvLmNoaWxkcmVuID0gbnVsbDtcbiAgICByZXR1cm4gcHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdMaXN0Jztcbn0pKExpc3QucHJvdG90eXBlKTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgU3RydWN0IGV4dGVuZHMgRGF0YVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKGNoaWxkcmVuKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICB9XG4gICAgZ2V0IHR5cGVJZCgpIHsgcmV0dXJuIFR5cGUuU3RydWN0OyB9XG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiBgU3RydWN0PHske3RoaXMuY2hpbGRyZW4ubWFwKChmKSA9PiBgJHtmLm5hbWV9OiR7Zi50eXBlfWApLmpvaW4oYCwgYCl9fT5gOyB9XG59XG5fcCA9IFN5bWJvbC50b1N0cmluZ1RhZztcblN0cnVjdFtfcF0gPSAoKHByb3RvKSA9PiB7XG4gICAgcHJvdG8uY2hpbGRyZW4gPSBudWxsO1xuICAgIHJldHVybiBwcm90b1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ1N0cnVjdCc7XG59KShTdHJ1Y3QucHJvdG90eXBlKTtcbi8qKiBAaWdub3JlICovXG5jbGFzcyBVbmlvbl8gZXh0ZW5kcyBEYXRhVHlwZSB7XG4gICAgY29uc3RydWN0b3IobW9kZSwgdHlwZUlkcywgY2hpbGRyZW4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB0aGlzLnR5cGVJZHMgPSB0eXBlSWRzID0gSW50MzJBcnJheS5mcm9tKHR5cGVJZHMpO1xuICAgICAgICB0aGlzLnR5cGVJZFRvQ2hpbGRJbmRleCA9IHR5cGVJZHMucmVkdWNlKCh0eXBlSWRUb0NoaWxkSW5kZXgsIHR5cGVJZCwgaWR4KSA9PiAodHlwZUlkVG9DaGlsZEluZGV4W3R5cGVJZF0gPSBpZHgpICYmIHR5cGVJZFRvQ2hpbGRJbmRleCB8fCB0eXBlSWRUb0NoaWxkSW5kZXgsIE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICAgIH1cbiAgICBnZXQgdHlwZUlkKCkgeyByZXR1cm4gVHlwZS5VbmlvbjsgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYCR7dGhpc1tTeW1ib2wudG9TdHJpbmdUYWddfTwke3RoaXMuY2hpbGRyZW4ubWFwKCh4KSA9PiBgJHt4LnR5cGV9YCkuam9pbihgIHwgYCl9PmA7XG4gICAgfVxufVxuX3EgPSBTeW1ib2wudG9TdHJpbmdUYWc7XG5Vbmlvbl9bX3FdID0gKChwcm90bykgPT4ge1xuICAgIHByb3RvLm1vZGUgPSBudWxsO1xuICAgIHByb3RvLnR5cGVJZHMgPSBudWxsO1xuICAgIHByb3RvLmNoaWxkcmVuID0gbnVsbDtcbiAgICBwcm90by50eXBlSWRUb0NoaWxkSW5kZXggPSBudWxsO1xuICAgIHByb3RvLkFycmF5VHlwZSA9IEludDhBcnJheTtcbiAgICByZXR1cm4gcHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdVbmlvbic7XG59KShVbmlvbl8ucHJvdG90eXBlKTtcbmV4cG9ydCB7IFVuaW9uXyBhcyBVbmlvbiB9O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBEZW5zZVVuaW9uIGV4dGVuZHMgVW5pb25fIHtcbiAgICBjb25zdHJ1Y3Rvcih0eXBlSWRzLCBjaGlsZHJlbikge1xuICAgICAgICBzdXBlcihVbmlvbk1vZGUuRGVuc2UsIHR5cGVJZHMsIGNoaWxkcmVuKTtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFNwYXJzZVVuaW9uIGV4dGVuZHMgVW5pb25fIHtcbiAgICBjb25zdHJ1Y3Rvcih0eXBlSWRzLCBjaGlsZHJlbikge1xuICAgICAgICBzdXBlcihVbmlvbk1vZGUuU3BhcnNlLCB0eXBlSWRzLCBjaGlsZHJlbik7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBGaXhlZFNpemVCaW5hcnkgZXh0ZW5kcyBEYXRhVHlwZSB7XG4gICAgY29uc3RydWN0b3IoYnl0ZVdpZHRoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYnl0ZVdpZHRoID0gYnl0ZVdpZHRoO1xuICAgIH1cbiAgICBnZXQgdHlwZUlkKCkgeyByZXR1cm4gVHlwZS5GaXhlZFNpemVCaW5hcnk7IH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIGBGaXhlZFNpemVCaW5hcnlbJHt0aGlzLmJ5dGVXaWR0aH1dYDsgfVxufVxuX3IgPSBTeW1ib2wudG9TdHJpbmdUYWc7XG5GaXhlZFNpemVCaW5hcnlbX3JdID0gKChwcm90bykgPT4ge1xuICAgIHByb3RvLmJ5dGVXaWR0aCA9IG51bGw7XG4gICAgcHJvdG8uQXJyYXlUeXBlID0gVWludDhBcnJheTtcbiAgICByZXR1cm4gcHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdGaXhlZFNpemVCaW5hcnknO1xufSkoRml4ZWRTaXplQmluYXJ5LnByb3RvdHlwZSk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEZpeGVkU2l6ZUxpc3QgZXh0ZW5kcyBEYXRhVHlwZSB7XG4gICAgY29uc3RydWN0b3IobGlzdFNpemUsIGNoaWxkKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubGlzdFNpemUgPSBsaXN0U2l6ZTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtjaGlsZF07XG4gICAgfVxuICAgIGdldCB0eXBlSWQoKSB7IHJldHVybiBUeXBlLkZpeGVkU2l6ZUxpc3Q7IH1cbiAgICBnZXQgdmFsdWVUeXBlKCkgeyByZXR1cm4gdGhpcy5jaGlsZHJlblswXS50eXBlOyB9XG4gICAgZ2V0IHZhbHVlRmllbGQoKSB7IHJldHVybiB0aGlzLmNoaWxkcmVuWzBdOyB9XG4gICAgZ2V0IEFycmF5VHlwZSgpIHsgcmV0dXJuIHRoaXMudmFsdWVUeXBlLkFycmF5VHlwZTsgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gYEZpeGVkU2l6ZUxpc3RbJHt0aGlzLmxpc3RTaXplfV08JHt0aGlzLnZhbHVlVHlwZX0+YDsgfVxufVxuX3MgPSBTeW1ib2wudG9TdHJpbmdUYWc7XG5GaXhlZFNpemVMaXN0W19zXSA9ICgocHJvdG8pID0+IHtcbiAgICBwcm90by5jaGlsZHJlbiA9IG51bGw7XG4gICAgcHJvdG8ubGlzdFNpemUgPSBudWxsO1xuICAgIHJldHVybiBwcm90b1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ0ZpeGVkU2l6ZUxpc3QnO1xufSkoRml4ZWRTaXplTGlzdC5wcm90b3R5cGUpO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBNYXBfIGV4dGVuZHMgRGF0YVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKGNoaWxkLCBrZXlzU29ydGVkID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtjaGlsZF07XG4gICAgICAgIHRoaXMua2V5c1NvcnRlZCA9IGtleXNTb3J0ZWQ7XG4gICAgfVxuICAgIGdldCB0eXBlSWQoKSB7IHJldHVybiBUeXBlLk1hcDsgfVxuICAgIGdldCBrZXlUeXBlKCkgeyByZXR1cm4gdGhpcy5jaGlsZHJlblswXS50eXBlLmNoaWxkcmVuWzBdLnR5cGU7IH1cbiAgICBnZXQgdmFsdWVUeXBlKCkgeyByZXR1cm4gdGhpcy5jaGlsZHJlblswXS50eXBlLmNoaWxkcmVuWzFdLnR5cGU7IH1cbiAgICBnZXQgY2hpbGRUeXBlKCkgeyByZXR1cm4gdGhpcy5jaGlsZHJlblswXS50eXBlOyB9XG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiBgTWFwPHske3RoaXMuY2hpbGRyZW5bMF0udHlwZS5jaGlsZHJlbi5tYXAoKGYpID0+IGAke2YubmFtZX06JHtmLnR5cGV9YCkuam9pbihgLCBgKX19PmA7IH1cbn1cbl90ID0gU3ltYm9sLnRvU3RyaW5nVGFnO1xuTWFwX1tfdF0gPSAoKHByb3RvKSA9PiB7XG4gICAgcHJvdG8uY2hpbGRyZW4gPSBudWxsO1xuICAgIHByb3RvLmtleXNTb3J0ZWQgPSBudWxsO1xuICAgIHJldHVybiBwcm90b1tTeW1ib2wudG9TdHJpbmdUYWddID0gJ01hcF8nO1xufSkoTWFwXy5wcm90b3R5cGUpO1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldElkID0gKChhdG9taWNEaWN0aW9uYXJ5SWQpID0+ICgpID0+ICsrYXRvbWljRGljdGlvbmFyeUlkKSgtMSk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIERpY3Rpb25hcnkgZXh0ZW5kcyBEYXRhVHlwZSB7XG4gICAgY29uc3RydWN0b3IoZGljdGlvbmFyeSwgaW5kaWNlcywgaWQsIGlzT3JkZXJlZCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmluZGljZXMgPSBpbmRpY2VzO1xuICAgICAgICB0aGlzLmRpY3Rpb25hcnkgPSBkaWN0aW9uYXJ5O1xuICAgICAgICB0aGlzLmlzT3JkZXJlZCA9IGlzT3JkZXJlZCB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5pZCA9IGlkID09IG51bGwgPyBnZXRJZCgpIDogKHR5cGVvZiBpZCA9PT0gJ251bWJlcicgPyBpZCA6IGlkLmxvdyk7XG4gICAgfVxuICAgIGdldCB0eXBlSWQoKSB7IHJldHVybiBUeXBlLkRpY3Rpb25hcnk7IH1cbiAgICBnZXQgY2hpbGRyZW4oKSB7IHJldHVybiB0aGlzLmRpY3Rpb25hcnkuY2hpbGRyZW47IH1cbiAgICBnZXQgdmFsdWVUeXBlKCkgeyByZXR1cm4gdGhpcy5kaWN0aW9uYXJ5OyB9XG4gICAgZ2V0IEFycmF5VHlwZSgpIHsgcmV0dXJuIHRoaXMuZGljdGlvbmFyeS5BcnJheVR5cGU7IH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIGBEaWN0aW9uYXJ5PCR7dGhpcy5pbmRpY2VzfSwgJHt0aGlzLmRpY3Rpb25hcnl9PmA7IH1cbn1cbl91ID0gU3ltYm9sLnRvU3RyaW5nVGFnO1xuRGljdGlvbmFyeVtfdV0gPSAoKHByb3RvKSA9PiB7XG4gICAgcHJvdG8uaWQgPSBudWxsO1xuICAgIHByb3RvLmluZGljZXMgPSBudWxsO1xuICAgIHByb3RvLmlzT3JkZXJlZCA9IG51bGw7XG4gICAgcHJvdG8uZGljdGlvbmFyeSA9IG51bGw7XG4gICAgcmV0dXJuIHByb3RvW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnRGljdGlvbmFyeSc7XG59KShEaWN0aW9uYXJ5LnByb3RvdHlwZSk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmlkZUZvclR5cGUodHlwZSkge1xuICAgIGNvbnN0IHQgPSB0eXBlO1xuICAgIHN3aXRjaCAodHlwZS50eXBlSWQpIHtcbiAgICAgICAgY2FzZSBUeXBlLkRlY2ltYWw6IHJldHVybiB0eXBlLmJpdFdpZHRoIC8gMzI7XG4gICAgICAgIGNhc2UgVHlwZS5UaW1lc3RhbXA6IHJldHVybiAyO1xuICAgICAgICBjYXNlIFR5cGUuRGF0ZTogcmV0dXJuIDEgKyB0LnVuaXQ7XG4gICAgICAgIGNhc2UgVHlwZS5JbnRlcnZhbDogcmV0dXJuIDEgKyB0LnVuaXQ7XG4gICAgICAgIC8vIGNhc2UgVHlwZS5JbnQ6IHJldHVybiAxICsgKygodCBhcyBJbnRfKS5iaXRXaWR0aCA+IDMyKTtcbiAgICAgICAgLy8gY2FzZSBUeXBlLlRpbWU6IHJldHVybiAxICsgKygodCBhcyBUaW1lXykuYml0V2lkdGggPiAzMik7XG4gICAgICAgIGNhc2UgVHlwZS5GaXhlZFNpemVMaXN0OiByZXR1cm4gdC5saXN0U2l6ZTtcbiAgICAgICAgY2FzZSBUeXBlLkZpeGVkU2l6ZUJpbmFyeTogcmV0dXJuIHQuYnl0ZVdpZHRoO1xuICAgICAgICBkZWZhdWx0OiByZXR1cm4gMTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGUubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJvb2woX2RhdGEsIF9pbmRleCwgYnl0ZSwgYml0KSB7XG4gICAgcmV0dXJuIChieXRlICYgMSA8PCBiaXQpICE9PSAwO1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCaXQoX2RhdGEsIF9pbmRleCwgYnl0ZSwgYml0KSB7XG4gICAgcmV0dXJuIChieXRlICYgMSA8PCBiaXQpID4+IGJpdDtcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgZnVuY3Rpb24gc2V0Qm9vbChieXRlcywgaW5kZXgsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID9cbiAgICAgICAgISEoYnl0ZXNbaW5kZXggPj4gM10gfD0gKDEgPDwgKGluZGV4ICUgOCkpKSB8fCB0cnVlIDpcbiAgICAgICAgIShieXRlc1tpbmRleCA+PiAzXSAmPSB+KDEgPDwgKGluZGV4ICUgOCkpKSAmJiBmYWxzZTtcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgZnVuY3Rpb24gdHJ1bmNhdGVCaXRtYXAob2Zmc2V0LCBsZW5ndGgsIGJpdG1hcCkge1xuICAgIGNvbnN0IGFsaWduZWRTaXplID0gKGJpdG1hcC5ieXRlTGVuZ3RoICsgNykgJiB+NztcbiAgICBpZiAob2Zmc2V0ID4gMCB8fCBiaXRtYXAuYnl0ZUxlbmd0aCA8IGFsaWduZWRTaXplKSB7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYWxpZ25lZFNpemUpO1xuICAgICAgICAvLyBJZiB0aGUgb2Zmc2V0IGlzIGEgbXVsdGlwbGUgb2YgOCBiaXRzLCBpdCdzIHNhZmUgdG8gc2xpY2UgdGhlIGJpdG1hcFxuICAgICAgICBieXRlcy5zZXQob2Zmc2V0ICUgOCA9PT0gMCA/IGJpdG1hcC5zdWJhcnJheShvZmZzZXQgPj4gMykgOlxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGl0ZXJhdGUgZWFjaCBiaXQgZnJvbSB0aGUgb2Zmc2V0IGFuZCByZXR1cm4gYSBuZXcgb25lXG4gICAgICAgICAgICBwYWNrQm9vbHMobmV3IEJpdEl0ZXJhdG9yKGJpdG1hcCwgb2Zmc2V0LCBsZW5ndGgsIG51bGwsIGdldEJvb2wpKS5zdWJhcnJheSgwLCBhbGlnbmVkU2l6ZSkpO1xuICAgICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfVxuICAgIHJldHVybiBiaXRtYXA7XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhY2tCb29scyh2YWx1ZXMpIHtcbiAgICBjb25zdCB4cyA9IFtdO1xuICAgIGxldCBpID0gMCwgYml0ID0gMCwgYnl0ZSA9IDA7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgdmFsdWUgJiYgKGJ5dGUgfD0gMSA8PCBiaXQpO1xuICAgICAgICBpZiAoKytiaXQgPT09IDgpIHtcbiAgICAgICAgICAgIHhzW2krK10gPSBieXRlO1xuICAgICAgICAgICAgYnl0ZSA9IGJpdCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGkgPT09IDAgfHwgYml0ID4gMCkge1xuICAgICAgICB4c1tpKytdID0gYnl0ZTtcbiAgICB9XG4gICAgY29uc3QgYiA9IG5ldyBVaW50OEFycmF5KCh4cy5sZW5ndGggKyA3KSAmIH43KTtcbiAgICBiLnNldCh4cyk7XG4gICAgcmV0dXJuIGI7XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEJpdEl0ZXJhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihieXRlcywgYmVnaW4sIGxlbmd0aCwgY29udGV4dCwgZ2V0KSB7XG4gICAgICAgIHRoaXMuYnl0ZXMgPSBieXRlcztcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuZ2V0ID0gZ2V0O1xuICAgICAgICB0aGlzLmJpdCA9IGJlZ2luICUgODtcbiAgICAgICAgdGhpcy5ieXRlSW5kZXggPSBiZWdpbiA+PiAzO1xuICAgICAgICB0aGlzLmJ5dGUgPSBieXRlc1t0aGlzLmJ5dGVJbmRleCsrXTtcbiAgICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIGlmICh0aGlzLmluZGV4IDwgdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJpdCA9PT0gOCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYml0ID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLmJ5dGUgPSB0aGlzLmJ5dGVzW3RoaXMuYnl0ZUluZGV4KytdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5nZXQodGhpcy5jb250ZXh0LCB0aGlzLmluZGV4KyssIHRoaXMuYnl0ZSwgdGhpcy5iaXQrKylcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGwgfTtcbiAgICB9XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbi8qKlxuICogQ29tcHV0ZSB0aGUgcG9wdWxhdGlvbiBjb3VudCAodGhlIG51bWJlciBvZiBiaXRzIHNldCB0byAxKSBmb3IgYSByYW5nZSBvZiBiaXRzIGluIGEgVWludDhBcnJheS5cbiAqIEBwYXJhbSB2ZWN0b3IgVGhlIFVpbnQ4QXJyYXkgb2YgYml0cyBmb3Igd2hpY2ggdG8gY29tcHV0ZSB0aGUgcG9wdWxhdGlvbiBjb3VudC5cbiAqIEBwYXJhbSBsaHMgVGhlIHJhbmdlJ3MgbGVmdC1oYW5kIHNpZGUgKG9yIHN0YXJ0KSBiaXRcbiAqIEBwYXJhbSByaHMgVGhlIHJhbmdlJ3MgcmlnaHQtaGFuZCBzaWRlIChvciBlbmQpIGJpdFxuICovXG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvcGNudF9iaXRfcmFuZ2UoZGF0YSwgbGhzLCByaHMpIHtcbiAgICBpZiAocmhzIC0gbGhzIDw9IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIC8vIElmIHRoZSBiaXQgcmFuZ2UgaXMgbGVzcyB0aGFuIG9uZSBieXRlLCBzdW0gdGhlIDEgYml0cyBpbiB0aGUgYml0IHJhbmdlXG4gICAgaWYgKHJocyAtIGxocyA8IDgpIHtcbiAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgYml0IG9mIG5ldyBCaXRJdGVyYXRvcihkYXRhLCBsaHMsIHJocyAtIGxocywgZGF0YSwgZ2V0Qml0KSkge1xuICAgICAgICAgICAgc3VtICs9IGJpdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VtO1xuICAgIH1cbiAgICAvLyBHZXQgdGhlIG5leHQgbG93ZXN0IG11bHRpcGxlIG9mIDggZnJvbSB0aGUgcmlnaHQgaGFuZCBzaWRlXG4gICAgY29uc3QgcmhzSW5zaWRlID0gcmhzID4+IDMgPDwgMztcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBtdWx0aXBsZSBvZiA4IGZyb20gdGhlIGxlZnQgaGFuZCBzaWRlXG4gICAgY29uc3QgbGhzSW5zaWRlID0gbGhzICsgKGxocyAlIDggPT09IDAgPyAwIDogOCAtIGxocyAlIDgpO1xuICAgIHJldHVybiAoXG4gICAgLy8gR2V0IHRoZSBwb3BjbnQgb2YgYml0cyBiZXR3ZWVuIHRoZSBsZWZ0IGhhbmQgc2lkZSwgYW5kIHRoZSBuZXh0IGhpZ2hlc3QgbXVsdGlwbGUgb2YgOFxuICAgIHBvcGNudF9iaXRfcmFuZ2UoZGF0YSwgbGhzLCBsaHNJbnNpZGUpICtcbiAgICAgICAgLy8gR2V0IHRoZSBwb3BjbnQgb2YgYml0cyBiZXR3ZWVuIHRoZSByaWdodCBoYW5kIHNpZGUsIGFuZCB0aGUgbmV4dCBsb3dlc3QgbXVsdGlwbGUgb2YgOFxuICAgICAgICBwb3BjbnRfYml0X3JhbmdlKGRhdGEsIHJoc0luc2lkZSwgcmhzKSArXG4gICAgICAgIC8vIEdldCB0aGUgcG9wY250IG9mIGFsbCBiaXRzIGJldHdlZW4gdGhlIGxlZnQgYW5kIHJpZ2h0IGhhbmQgc2lkZXMnIG11bHRpcGxlcyBvZiA4XG4gICAgICAgIHBvcGNudF9hcnJheShkYXRhLCBsaHNJbnNpZGUgPj4gMywgKHJoc0luc2lkZSAtIGxoc0luc2lkZSkgPj4gMykpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3BjbnRfYXJyYXkoYXJyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKSB7XG4gICAgbGV0IGNudCA9IDAsIHBvcyA9IE1hdGgudHJ1bmMoYnl0ZU9mZnNldCk7XG4gICAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyhhcnIuYnVmZmVyLCBhcnIuYnl0ZU9mZnNldCwgYXJyLmJ5dGVMZW5ndGgpO1xuICAgIGNvbnN0IGxlbiA9IGJ5dGVMZW5ndGggPT09IHZvaWQgMCA/IGFyci5ieXRlTGVuZ3RoIDogcG9zICsgYnl0ZUxlbmd0aDtcbiAgICB3aGlsZSAobGVuIC0gcG9zID49IDQpIHtcbiAgICAgICAgY250ICs9IHBvcGNudF91aW50MzIodmlldy5nZXRVaW50MzIocG9zKSk7XG4gICAgICAgIHBvcyArPSA0O1xuICAgIH1cbiAgICB3aGlsZSAobGVuIC0gcG9zID49IDIpIHtcbiAgICAgICAgY250ICs9IHBvcGNudF91aW50MzIodmlldy5nZXRVaW50MTYocG9zKSk7XG4gICAgICAgIHBvcyArPSAyO1xuICAgIH1cbiAgICB3aGlsZSAobGVuIC0gcG9zID49IDEpIHtcbiAgICAgICAgY250ICs9IHBvcGNudF91aW50MzIodmlldy5nZXRVaW50OChwb3MpKTtcbiAgICAgICAgcG9zICs9IDE7XG4gICAgfVxuICAgIHJldHVybiBjbnQ7XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvcGNudF91aW50MzIodWludDMyKSB7XG4gICAgbGV0IGkgPSBNYXRoLnRydW5jKHVpbnQzMik7XG4gICAgaSA9IGkgLSAoKGkgPj4+IDEpICYgMHg1NTU1NTU1NSk7XG4gICAgaSA9IChpICYgMHgzMzMzMzMzMykgKyAoKGkgPj4+IDIpICYgMHgzMzMzMzMzMyk7XG4gICAgcmV0dXJuICgoKGkgKyAoaSA+Pj4gNCkpICYgMHgwRjBGMEYwRikgKiAweDAxMDEwMTAxKSA+Pj4gMjQ7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJpdC5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IHRvQXJyYXlCdWZmZXJWaWV3IH0gZnJvbSAnLi9idWZmZXIubWpzJztcbmltcG9ydCB7IEJpZ0ludEF2YWlsYWJsZSwgQmlnSW50NjRBcnJheSwgQmlnVWludDY0QXJyYXkgfSBmcm9tICcuL2NvbXBhdC5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBpc0Fycm93QmlnTnVtU3ltYm9sID0gU3ltYm9sLmZvcignaXNBcnJvd0JpZ051bScpO1xuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIEJpZ051bSh4LCAuLi54cykge1xuICAgIGlmICh4cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZih0b0FycmF5QnVmZmVyVmlldyh0aGlzWydUeXBlZEFycmF5J10sIHgpLCB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YobmV3IHRoaXNbJ1R5cGVkQXJyYXknXSh4LCAuLi54cyksIHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlKTtcbn1cbkJpZ051bS5wcm90b3R5cGVbaXNBcnJvd0JpZ051bVN5bWJvbF0gPSB0cnVlO1xuQmlnTnVtLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBgXCIke2JpZ251bVRvU3RyaW5nKHRoaXMpfVwiYDsgfTtcbkJpZ051bS5wcm90b3R5cGUudmFsdWVPZiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGJpZ251bVRvTnVtYmVyKHRoaXMpOyB9O1xuQmlnTnVtLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGJpZ251bVRvU3RyaW5nKHRoaXMpOyB9O1xuQmlnTnVtLnByb3RvdHlwZVtTeW1ib2wudG9QcmltaXRpdmVdID0gZnVuY3Rpb24gKGhpbnQgPSAnZGVmYXVsdCcpIHtcbiAgICBzd2l0Y2ggKGhpbnQpIHtcbiAgICAgICAgY2FzZSAnbnVtYmVyJzogcmV0dXJuIGJpZ251bVRvTnVtYmVyKHRoaXMpO1xuICAgICAgICBjYXNlICdzdHJpbmcnOiByZXR1cm4gYmlnbnVtVG9TdHJpbmcodGhpcyk7XG4gICAgICAgIGNhc2UgJ2RlZmF1bHQnOiByZXR1cm4gYmlnbnVtVG9CaWdJbnQodGhpcyk7XG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gYmlnbnVtVG9TdHJpbmcodGhpcyk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIFNpZ25lZEJpZ051bSguLi5hcmdzKSB7IHJldHVybiBCaWdOdW0uYXBwbHkodGhpcywgYXJncyk7IH1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBVbnNpZ25lZEJpZ051bSguLi5hcmdzKSB7IHJldHVybiBCaWdOdW0uYXBwbHkodGhpcywgYXJncyk7IH1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBEZWNpbWFsQmlnTnVtKC4uLmFyZ3MpIHsgcmV0dXJuIEJpZ051bS5hcHBseSh0aGlzLCBhcmdzKTsgfVxuT2JqZWN0LnNldFByb3RvdHlwZU9mKFNpZ25lZEJpZ051bS5wcm90b3R5cGUsIE9iamVjdC5jcmVhdGUoSW50MzJBcnJheS5wcm90b3R5cGUpKTtcbk9iamVjdC5zZXRQcm90b3R5cGVPZihVbnNpZ25lZEJpZ051bS5wcm90b3R5cGUsIE9iamVjdC5jcmVhdGUoVWludDMyQXJyYXkucHJvdG90eXBlKSk7XG5PYmplY3Quc2V0UHJvdG90eXBlT2YoRGVjaW1hbEJpZ051bS5wcm90b3R5cGUsIE9iamVjdC5jcmVhdGUoVWludDMyQXJyYXkucHJvdG90eXBlKSk7XG5PYmplY3QuYXNzaWduKFNpZ25lZEJpZ051bS5wcm90b3R5cGUsIEJpZ051bS5wcm90b3R5cGUsIHsgJ2NvbnN0cnVjdG9yJzogU2lnbmVkQmlnTnVtLCAnc2lnbmVkJzogdHJ1ZSwgJ1R5cGVkQXJyYXknOiBJbnQzMkFycmF5LCAnQmlnSW50QXJyYXknOiBCaWdJbnQ2NEFycmF5IH0pO1xuT2JqZWN0LmFzc2lnbihVbnNpZ25lZEJpZ051bS5wcm90b3R5cGUsIEJpZ051bS5wcm90b3R5cGUsIHsgJ2NvbnN0cnVjdG9yJzogVW5zaWduZWRCaWdOdW0sICdzaWduZWQnOiBmYWxzZSwgJ1R5cGVkQXJyYXknOiBVaW50MzJBcnJheSwgJ0JpZ0ludEFycmF5JzogQmlnVWludDY0QXJyYXkgfSk7XG5PYmplY3QuYXNzaWduKERlY2ltYWxCaWdOdW0ucHJvdG90eXBlLCBCaWdOdW0ucHJvdG90eXBlLCB7ICdjb25zdHJ1Y3Rvcic6IERlY2ltYWxCaWdOdW0sICdzaWduZWQnOiB0cnVlLCAnVHlwZWRBcnJheSc6IFVpbnQzMkFycmF5LCAnQmlnSW50QXJyYXknOiBCaWdVaW50NjRBcnJheSB9KTtcbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBiaWdudW1Ub051bWJlcihibikge1xuICAgIGNvbnN0IHsgYnVmZmVyLCBieXRlT2Zmc2V0LCBsZW5ndGgsICdzaWduZWQnOiBzaWduZWQgfSA9IGJuO1xuICAgIGNvbnN0IHdvcmRzID0gbmV3IEJpZ1VpbnQ2NEFycmF5KGJ1ZmZlciwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgICBjb25zdCBuZWdhdGl2ZSA9IHNpZ25lZCAmJiB3b3Jkc1t3b3Jkcy5sZW5ndGggLSAxXSAmIChCaWdJbnQoMSkgPDwgQmlnSW50KDYzKSk7XG4gICAgbGV0IG51bWJlciA9IG5lZ2F0aXZlID8gQmlnSW50KDEpIDogQmlnSW50KDApO1xuICAgIGxldCBpID0gQmlnSW50KDApO1xuICAgIGlmICghbmVnYXRpdmUpIHtcbiAgICAgICAgZm9yIChjb25zdCB3b3JkIG9mIHdvcmRzKSB7XG4gICAgICAgICAgICBudW1iZXIgKz0gd29yZCAqIChCaWdJbnQoMSkgPDwgKEJpZ0ludCgzMikgKiBpKyspKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCB3b3JkIG9mIHdvcmRzKSB7XG4gICAgICAgICAgICBudW1iZXIgKz0gfndvcmQgKiAoQmlnSW50KDEpIDw8IChCaWdJbnQoMzIpICogaSsrKSk7XG4gICAgICAgIH1cbiAgICAgICAgbnVtYmVyICo9IEJpZ0ludCgtMSk7XG4gICAgfVxuICAgIHJldHVybiBudW1iZXI7XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGxldCBiaWdudW1Ub1N0cmluZztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgbGV0IGJpZ251bVRvQmlnSW50O1xuaWYgKCFCaWdJbnRBdmFpbGFibGUpIHtcbiAgICBiaWdudW1Ub1N0cmluZyA9IGRlY2ltYWxUb1N0cmluZztcbiAgICBiaWdudW1Ub0JpZ0ludCA9IGJpZ251bVRvU3RyaW5nO1xufVxuZWxzZSB7XG4gICAgYmlnbnVtVG9CaWdJbnQgPSAoKGEpID0+IGEuYnl0ZUxlbmd0aCA9PT0gOCA/IG5ldyBhWydCaWdJbnRBcnJheSddKGEuYnVmZmVyLCBhLmJ5dGVPZmZzZXQsIDEpWzBdIDogZGVjaW1hbFRvU3RyaW5nKGEpKTtcbiAgICBiaWdudW1Ub1N0cmluZyA9ICgoYSkgPT4gYS5ieXRlTGVuZ3RoID09PSA4ID8gYCR7bmV3IGFbJ0JpZ0ludEFycmF5J10oYS5idWZmZXIsIGEuYnl0ZU9mZnNldCwgMSlbMF19YCA6IGRlY2ltYWxUb1N0cmluZyhhKSk7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZGVjaW1hbFRvU3RyaW5nKGEpIHtcbiAgICBsZXQgZGlnaXRzID0gJyc7XG4gICAgY29uc3QgYmFzZTY0ID0gbmV3IFVpbnQzMkFycmF5KDIpO1xuICAgIGxldCBiYXNlMzIgPSBuZXcgVWludDE2QXJyYXkoYS5idWZmZXIsIGEuYnl0ZU9mZnNldCwgYS5ieXRlTGVuZ3RoIC8gMik7XG4gICAgY29uc3QgY2hlY2tzID0gbmV3IFVpbnQzMkFycmF5KChiYXNlMzIgPSBuZXcgVWludDE2QXJyYXkoYmFzZTMyKS5yZXZlcnNlKCkpLmJ1ZmZlcik7XG4gICAgbGV0IGkgPSAtMTtcbiAgICBjb25zdCBuID0gYmFzZTMyLmxlbmd0aCAtIDE7XG4gICAgZG8ge1xuICAgICAgICBmb3IgKGJhc2U2NFswXSA9IGJhc2UzMltpID0gMF07IGkgPCBuOykge1xuICAgICAgICAgICAgYmFzZTMyW2krK10gPSBiYXNlNjRbMV0gPSBiYXNlNjRbMF0gLyAxMDtcbiAgICAgICAgICAgIGJhc2U2NFswXSA9ICgoYmFzZTY0WzBdIC0gYmFzZTY0WzFdICogMTApIDw8IDE2KSArIGJhc2UzMltpXTtcbiAgICAgICAgfVxuICAgICAgICBiYXNlMzJbaV0gPSBiYXNlNjRbMV0gPSBiYXNlNjRbMF0gLyAxMDtcbiAgICAgICAgYmFzZTY0WzBdID0gYmFzZTY0WzBdIC0gYmFzZTY0WzFdICogMTA7XG4gICAgICAgIGRpZ2l0cyA9IGAke2Jhc2U2NFswXX0ke2RpZ2l0c31gO1xuICAgIH0gd2hpbGUgKGNoZWNrc1swXSB8fCBjaGVja3NbMV0gfHwgY2hlY2tzWzJdIHx8IGNoZWNrc1szXSk7XG4gICAgcmV0dXJuIGRpZ2l0cyAhPT0gbnVsbCAmJiBkaWdpdHMgIT09IHZvaWQgMCA/IGRpZ2l0cyA6IGAwYDtcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgQk4ge1xuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBuZXcobnVtLCBpc1NpZ25lZCkge1xuICAgICAgICBzd2l0Y2ggKGlzU2lnbmVkKSB7XG4gICAgICAgICAgICBjYXNlIHRydWU6IHJldHVybiBuZXcgU2lnbmVkQmlnTnVtKG51bSk7XG4gICAgICAgICAgICBjYXNlIGZhbHNlOiByZXR1cm4gbmV3IFVuc2lnbmVkQmlnTnVtKG51bSk7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChudW0uY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIGNhc2UgSW50OEFycmF5OlxuICAgICAgICAgICAgY2FzZSBJbnQxNkFycmF5OlxuICAgICAgICAgICAgY2FzZSBJbnQzMkFycmF5OlxuICAgICAgICAgICAgY2FzZSBCaWdJbnQ2NEFycmF5OlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2lnbmVkQmlnTnVtKG51bSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG51bS5ieXRlTGVuZ3RoID09PSAxNikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWNpbWFsQmlnTnVtKG51bSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbnNpZ25lZEJpZ051bShudW0pO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgc2lnbmVkKG51bSkge1xuICAgICAgICByZXR1cm4gbmV3IFNpZ25lZEJpZ051bShudW0pO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgdW5zaWduZWQobnVtKSB7XG4gICAgICAgIHJldHVybiBuZXcgVW5zaWduZWRCaWdOdW0obnVtKTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGRlY2ltYWwobnVtKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVjaW1hbEJpZ051bShudW0pO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihudW0sIGlzU2lnbmVkKSB7XG4gICAgICAgIHJldHVybiBCTi5uZXcobnVtLCBpc1NpZ25lZCk7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1ibi5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IF9fYXN5bmNEZWxlZ2F0b3IsIF9fYXN5bmNHZW5lcmF0b3IsIF9fYXN5bmNWYWx1ZXMsIF9fYXdhaXQgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGVuY29kZVV0ZjggfSBmcm9tICcuLi91dGlsL3V0ZjgubWpzJztcbmltcG9ydCB7IGlzUHJvbWlzZSwgaXNJdGVyYWJsZSwgaXNBc3luY0l0ZXJhYmxlLCBpc0l0ZXJhdG9yUmVzdWx0LCBpc0ZsYXRidWZmZXJzQnl0ZUJ1ZmZlciwgQmlnSW50NjRBcnJheSwgQmlnVWludDY0QXJyYXkgfSBmcm9tICcuL2NvbXBhdC5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IFNoYXJlZEFycmF5QnVmID0gKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgPyBTaGFyZWRBcnJheUJ1ZmZlciA6IEFycmF5QnVmZmVyKTtcbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBjb2xsYXBzZUNvbnRpZ3VvdXNCeXRlUmFuZ2VzKGNodW5rcykge1xuICAgIGNvbnN0IHJlc3VsdCA9IGNodW5rc1swXSA/IFtjaHVua3NbMF1dIDogW107XG4gICAgbGV0IHhPZmZzZXQsIHlPZmZzZXQsIHhMZW4sIHlMZW47XG4gICAgZm9yIChsZXQgeCwgeSwgaSA9IDAsIGogPSAwLCBuID0gY2h1bmtzLmxlbmd0aDsgKytpIDwgbjspIHtcbiAgICAgICAgeCA9IHJlc3VsdFtqXTtcbiAgICAgICAgeSA9IGNodW5rc1tpXTtcbiAgICAgICAgLy8gY29udGludWUgaWYgeCBhbmQgeSBkb24ndCBzaGFyZSB0aGUgc2FtZSB1bmRlcmx5aW5nIEFycmF5QnVmZmVyLCBvciBpZiB4IGlzbid0IGJlZm9yZSB5XG4gICAgICAgIGlmICgheCB8fCAheSB8fCB4LmJ1ZmZlciAhPT0geS5idWZmZXIgfHwgeS5ieXRlT2Zmc2V0IDwgeC5ieXRlT2Zmc2V0KSB7XG4gICAgICAgICAgICB5ICYmIChyZXN1bHRbKytqXSA9IHkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgKHsgYnl0ZU9mZnNldDogeE9mZnNldCwgYnl0ZUxlbmd0aDogeExlbiB9ID0geCk7XG4gICAgICAgICh7IGJ5dGVPZmZzZXQ6IHlPZmZzZXQsIGJ5dGVMZW5ndGg6IHlMZW4gfSA9IHkpO1xuICAgICAgICAvLyBjb250aW51ZSBpZiB0aGUgYnl0ZSByYW5nZXMgb2YgeCBhbmQgeSBhcmVuJ3QgY29udGlndW91c1xuICAgICAgICBpZiAoKHhPZmZzZXQgKyB4TGVuKSA8IHlPZmZzZXQgfHwgKHlPZmZzZXQgKyB5TGVuKSA8IHhPZmZzZXQpIHtcbiAgICAgICAgICAgIHkgJiYgKHJlc3VsdFsrK2pdID0geSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbal0gPSBuZXcgVWludDhBcnJheSh4LmJ1ZmZlciwgeE9mZnNldCwgeU9mZnNldCAtIHhPZmZzZXQgKyB5TGVuKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgZnVuY3Rpb24gbWVtY3B5KHRhcmdldCwgc291cmNlLCB0YXJnZXRCeXRlT2Zmc2V0ID0gMCwgc291cmNlQnl0ZUxlbmd0aCA9IHNvdXJjZS5ieXRlTGVuZ3RoKSB7XG4gICAgY29uc3QgdGFyZ2V0Qnl0ZUxlbmd0aCA9IHRhcmdldC5ieXRlTGVuZ3RoO1xuICAgIGNvbnN0IGRzdCA9IG5ldyBVaW50OEFycmF5KHRhcmdldC5idWZmZXIsIHRhcmdldC5ieXRlT2Zmc2V0LCB0YXJnZXRCeXRlTGVuZ3RoKTtcbiAgICBjb25zdCBzcmMgPSBuZXcgVWludDhBcnJheShzb3VyY2UuYnVmZmVyLCBzb3VyY2UuYnl0ZU9mZnNldCwgTWF0aC5taW4oc291cmNlQnl0ZUxlbmd0aCwgdGFyZ2V0Qnl0ZUxlbmd0aCkpO1xuICAgIGRzdC5zZXQoc3JjLCB0YXJnZXRCeXRlT2Zmc2V0KTtcbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiBqb2luVWludDhBcnJheXMoY2h1bmtzLCBzaXplKSB7XG4gICAgLy8gY29sbGFwc2UgY2h1bmtzIHRoYXQgc2hhcmUgdGhlIHNhbWUgdW5kZXJseWluZyBBcnJheUJ1ZmZlciBhbmQgd2hvc2UgYnl0ZSByYW5nZXMgb3ZlcmxhcCxcbiAgICAvLyB0byBhdm9pZCB1bm5lY2Vzc2FyaWx5IGNvcHlpbmcgdGhlIGJ5dGVzIHRvIGRvIHRoaXMgYnVmZmVyIGpvaW4uIFRoaXMgaXMgYSBjb21tb24gY2FzZSBkdXJpbmdcbiAgICAvLyBzdHJlYW1pbmcsIHdoZXJlIHdlIG1heSBiZSByZWFkaW5nIHBhcnRpYWwgYnl0ZSByYW5nZXMgb3V0IG9mIHRoZSBzYW1lIHVuZGVybHlpbmcgQXJyYXlCdWZmZXJcbiAgICBjb25zdCByZXN1bHQgPSBjb2xsYXBzZUNvbnRpZ3VvdXNCeXRlUmFuZ2VzKGNodW5rcyk7XG4gICAgY29uc3QgYnl0ZUxlbmd0aCA9IHJlc3VsdC5yZWR1Y2UoKHgsIGIpID0+IHggKyBiLmJ5dGVMZW5ndGgsIDApO1xuICAgIGxldCBzb3VyY2UsIHNsaWNlZCwgYnVmZmVyO1xuICAgIGxldCBvZmZzZXQgPSAwLCBpbmRleCA9IC0xO1xuICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWluKHNpemUgfHwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBieXRlTGVuZ3RoKTtcbiAgICBmb3IgKGNvbnN0IG4gPSByZXN1bHQubGVuZ3RoOyArK2luZGV4IDwgbjspIHtcbiAgICAgICAgc291cmNlID0gcmVzdWx0W2luZGV4XTtcbiAgICAgICAgc2xpY2VkID0gc291cmNlLnN1YmFycmF5KDAsIE1hdGgubWluKHNvdXJjZS5sZW5ndGgsIGxlbmd0aCAtIG9mZnNldCkpO1xuICAgICAgICBpZiAobGVuZ3RoIDw9IChvZmZzZXQgKyBzbGljZWQubGVuZ3RoKSkge1xuICAgICAgICAgICAgaWYgKHNsaWNlZC5sZW5ndGggPCBzb3VyY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IHNvdXJjZS5zdWJhcnJheShzbGljZWQubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNsaWNlZC5sZW5ndGggPT09IHNvdXJjZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnVmZmVyID8gbWVtY3B5KGJ1ZmZlciwgc2xpY2VkLCBvZmZzZXQpIDogKGJ1ZmZlciA9IHNsaWNlZCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBtZW1jcHkoYnVmZmVyIHx8IChidWZmZXIgPSBuZXcgVWludDhBcnJheShsZW5ndGgpKSwgc2xpY2VkLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gc2xpY2VkLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIFtidWZmZXIgfHwgbmV3IFVpbnQ4QXJyYXkoMCksIHJlc3VsdC5zbGljZShpbmRleCksIGJ5dGVMZW5ndGggLSAoYnVmZmVyID8gYnVmZmVyLmJ5dGVMZW5ndGggOiAwKV07XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQXJyYXlCdWZmZXJWaWV3KEFycmF5QnVmZmVyVmlld0N0b3IsIGlucHV0KSB7XG4gICAgbGV0IHZhbHVlID0gaXNJdGVyYXRvclJlc3VsdChpbnB1dCkgPyBpbnB1dC52YWx1ZSA6IGlucHV0O1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyVmlld0N0b3IpIHtcbiAgICAgICAgaWYgKEFycmF5QnVmZmVyVmlld0N0b3IgPT09IFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgIC8vIE5vZGUncyBgQnVmZmVyYCBjbGFzcyBwYXNzZXMgdGhlIGBpbnN0YW5jZW9mIFVpbnQ4QXJyYXlgIGNoZWNrLCBidXQgd2UgbmVlZFxuICAgICAgICAgICAgLy8gYSByZWFsIFVpbnQ4QXJyYXksIHNpbmNlIEJ1ZmZlciNzbGljZSBpc24ndCB0aGUgc2FtZSBhcyBVaW50OEFycmF5I3NsaWNlIDovXG4gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5QnVmZmVyVmlld0N0b3IodmFsdWUuYnVmZmVyLCB2YWx1ZS5ieXRlT2Zmc2V0LCB2YWx1ZS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBcnJheUJ1ZmZlclZpZXdDdG9yKDApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YWx1ZSA9IGVuY29kZVV0ZjgodmFsdWUpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gbmV3IEFycmF5QnVmZmVyVmlld0N0b3IodmFsdWUpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1Zikge1xuICAgICAgICByZXR1cm4gbmV3IEFycmF5QnVmZmVyVmlld0N0b3IodmFsdWUpO1xuICAgIH1cbiAgICBpZiAoaXNGbGF0YnVmZmVyc0J5dGVCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0b0FycmF5QnVmZmVyVmlldyhBcnJheUJ1ZmZlclZpZXdDdG9yLCB2YWx1ZS5ieXRlcygpKTtcbiAgICB9XG4gICAgcmV0dXJuICFBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpID8gQXJyYXlCdWZmZXJWaWV3Q3Rvci5mcm9tKHZhbHVlKSA6ICh2YWx1ZS5ieXRlTGVuZ3RoIDw9IDAgPyBuZXcgQXJyYXlCdWZmZXJWaWV3Q3RvcigwKVxuICAgICAgICA6IG5ldyBBcnJheUJ1ZmZlclZpZXdDdG9yKHZhbHVlLmJ1ZmZlciwgdmFsdWUuYnl0ZU9mZnNldCwgdmFsdWUuYnl0ZUxlbmd0aCAvIEFycmF5QnVmZmVyVmlld0N0b3IuQllURVNfUEVSX0VMRU1FTlQpKTtcbn1cbi8qKiBAaWdub3JlICovIGV4cG9ydCBjb25zdCB0b0ludDhBcnJheSA9IChpbnB1dCkgPT4gdG9BcnJheUJ1ZmZlclZpZXcoSW50OEFycmF5LCBpbnB1dCk7XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9JbnQxNkFycmF5ID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlldyhJbnQxNkFycmF5LCBpbnB1dCk7XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9JbnQzMkFycmF5ID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlldyhJbnQzMkFycmF5LCBpbnB1dCk7XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9CaWdJbnQ2NEFycmF5ID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlldyhCaWdJbnQ2NEFycmF5LCBpbnB1dCk7XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9VaW50OEFycmF5ID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlldyhVaW50OEFycmF5LCBpbnB1dCk7XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9VaW50MTZBcnJheSA9IChpbnB1dCkgPT4gdG9BcnJheUJ1ZmZlclZpZXcoVWludDE2QXJyYXksIGlucHV0KTtcbi8qKiBAaWdub3JlICovIGV4cG9ydCBjb25zdCB0b1VpbnQzMkFycmF5ID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlldyhVaW50MzJBcnJheSwgaW5wdXQpO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IHRvQmlnVWludDY0QXJyYXkgPSAoaW5wdXQpID0+IHRvQXJyYXlCdWZmZXJWaWV3KEJpZ1VpbnQ2NEFycmF5LCBpbnB1dCk7XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9GbG9hdDMyQXJyYXkgPSAoaW5wdXQpID0+IHRvQXJyYXlCdWZmZXJWaWV3KEZsb2F0MzJBcnJheSwgaW5wdXQpO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IHRvRmxvYXQ2NEFycmF5ID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlldyhGbG9hdDY0QXJyYXksIGlucHV0KTtcbi8qKiBAaWdub3JlICovIGV4cG9ydCBjb25zdCB0b1VpbnQ4Q2xhbXBlZEFycmF5ID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlldyhVaW50OENsYW1wZWRBcnJheSwgaW5wdXQpO1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IHB1bXAgPSAoaXRlcmF0b3IpID0+IHsgaXRlcmF0b3IubmV4dCgpOyByZXR1cm4gaXRlcmF0b3I7IH07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uKiB0b0FycmF5QnVmZmVyVmlld0l0ZXJhdG9yKEFycmF5Q3Rvciwgc291cmNlKSB7XG4gICAgY29uc3Qgd3JhcCA9IGZ1bmN0aW9uKiAoeCkgeyB5aWVsZCB4OyB9O1xuICAgIGNvbnN0IGJ1ZmZlcnMgPSAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycpID8gd3JhcChzb3VyY2UpXG4gICAgICAgIDogKEFycmF5QnVmZmVyLmlzVmlldyhzb3VyY2UpKSA/IHdyYXAoc291cmNlKVxuICAgICAgICAgICAgOiAoc291cmNlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpID8gd3JhcChzb3VyY2UpXG4gICAgICAgICAgICAgICAgOiAoc291cmNlIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWYpID8gd3JhcChzb3VyY2UpXG4gICAgICAgICAgICAgICAgICAgIDogIWlzSXRlcmFibGUoc291cmNlKSA/IHdyYXAoc291cmNlKSA6IHNvdXJjZTtcbiAgICB5aWVsZCogcHVtcCgoZnVuY3Rpb24qIChpdCkge1xuICAgICAgICBsZXQgciA9IG51bGw7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHIgPSBpdC5uZXh0KHlpZWxkIHRvQXJyYXlCdWZmZXJWaWV3KEFycmF5Q3RvciwgcikpO1xuICAgICAgICB9IHdoaWxlICghci5kb25lKTtcbiAgICB9KShidWZmZXJzW1N5bWJvbC5pdGVyYXRvcl0oKSkpO1xuICAgIHJldHVybiBuZXcgQXJyYXlDdG9yKCk7XG59XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9JbnQ4QXJyYXlJdGVyYXRvciA9IChpbnB1dCkgPT4gdG9BcnJheUJ1ZmZlclZpZXdJdGVyYXRvcihJbnQ4QXJyYXksIGlucHV0KTtcbi8qKiBAaWdub3JlICovIGV4cG9ydCBjb25zdCB0b0ludDE2QXJyYXlJdGVyYXRvciA9IChpbnB1dCkgPT4gdG9BcnJheUJ1ZmZlclZpZXdJdGVyYXRvcihJbnQxNkFycmF5LCBpbnB1dCk7XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9JbnQzMkFycmF5SXRlcmF0b3IgPSAoaW5wdXQpID0+IHRvQXJyYXlCdWZmZXJWaWV3SXRlcmF0b3IoSW50MzJBcnJheSwgaW5wdXQpO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IHRvVWludDhBcnJheUl0ZXJhdG9yID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlld0l0ZXJhdG9yKFVpbnQ4QXJyYXksIGlucHV0KTtcbi8qKiBAaWdub3JlICovIGV4cG9ydCBjb25zdCB0b1VpbnQxNkFycmF5SXRlcmF0b3IgPSAoaW5wdXQpID0+IHRvQXJyYXlCdWZmZXJWaWV3SXRlcmF0b3IoVWludDE2QXJyYXksIGlucHV0KTtcbi8qKiBAaWdub3JlICovIGV4cG9ydCBjb25zdCB0b1VpbnQzMkFycmF5SXRlcmF0b3IgPSAoaW5wdXQpID0+IHRvQXJyYXlCdWZmZXJWaWV3SXRlcmF0b3IoVWludDMyQXJyYXksIGlucHV0KTtcbi8qKiBAaWdub3JlICovIGV4cG9ydCBjb25zdCB0b0Zsb2F0MzJBcnJheUl0ZXJhdG9yID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlld0l0ZXJhdG9yKEZsb2F0MzJBcnJheSwgaW5wdXQpO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IHRvRmxvYXQ2NEFycmF5SXRlcmF0b3IgPSAoaW5wdXQpID0+IHRvQXJyYXlCdWZmZXJWaWV3SXRlcmF0b3IoRmxvYXQ2NEFycmF5LCBpbnB1dCk7XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9VaW50OENsYW1wZWRBcnJheUl0ZXJhdG9yID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlld0l0ZXJhdG9yKFVpbnQ4Q2xhbXBlZEFycmF5LCBpbnB1dCk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQXJyYXlCdWZmZXJWaWV3QXN5bmNJdGVyYXRvcihBcnJheUN0b3IsIHNvdXJjZSkge1xuICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIHRvQXJyYXlCdWZmZXJWaWV3QXN5bmNJdGVyYXRvcl8xKCkge1xuICAgICAgICAvLyBpZiBhIFByb21pc2UsIHVud3JhcCB0aGUgUHJvbWlzZSBhbmQgaXRlcmF0ZSB0aGUgcmVzb2x2ZWQgdmFsdWVcbiAgICAgICAgaWYgKGlzUHJvbWlzZShzb3VyY2UpKSB7XG4gICAgICAgICAgICByZXR1cm4geWllbGQgX19hd2FpdCh5aWVsZCBfX2F3YWl0KHlpZWxkKiBfX2FzeW5jRGVsZWdhdG9yKF9fYXN5bmNWYWx1ZXModG9BcnJheUJ1ZmZlclZpZXdBc3luY0l0ZXJhdG9yKEFycmF5Q3RvciwgeWllbGQgX19hd2FpdChzb3VyY2UpKSkpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd3JhcCA9IGZ1bmN0aW9uICh4KSB7IHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qICgpIHsgeWllbGQgeWllbGQgX19hd2FpdCh5aWVsZCBfX2F3YWl0KHgpKTsgfSk7IH07XG4gICAgICAgIGNvbnN0IGVtaXQgPSBmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgX19hd2FpdCh5aWVsZCogX19hc3luY0RlbGVnYXRvcihfX2FzeW5jVmFsdWVzKHB1bXAoKGZ1bmN0aW9uKiAoaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHIgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgICAgICByID0gaXQubmV4dCh5aWVsZCByID09PSBudWxsIHx8IHIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHIudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICghci5kb25lKTtcbiAgICAgICAgICAgICAgICB9KShzb3VyY2VbU3ltYm9sLml0ZXJhdG9yXSgpKSkpKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYnVmZmVycyA9ICh0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJykgPyB3cmFwKHNvdXJjZSkgLy8gaWYgc3RyaW5nLCB3cmFwIGluIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvclxuICAgICAgICAgICAgOiAoQXJyYXlCdWZmZXIuaXNWaWV3KHNvdXJjZSkpID8gd3JhcChzb3VyY2UpIC8vIGlmIFR5cGVkQXJyYXksIHdyYXAgaW4gYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yXG4gICAgICAgICAgICAgICAgOiAoc291cmNlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpID8gd3JhcChzb3VyY2UpIC8vIGlmIEFycmF5QnVmZmVyLCB3cmFwIGluIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvclxuICAgICAgICAgICAgICAgICAgICA6IChzb3VyY2UgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZikgPyB3cmFwKHNvdXJjZSkgLy8gaWYgU2hhcmVkQXJyYXlCdWZmZXIsIHdyYXAgaW4gYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGlzSXRlcmFibGUoc291cmNlKSA/IGVtaXQoc291cmNlKSAvLyBJZiBJdGVyYWJsZSwgd3JhcCBpbiBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgYW5kIGNvbXBvc2UgdGhlIGBuZXh0YCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICFpc0FzeW5jSXRlcmFibGUoc291cmNlKSA/IHdyYXAoc291cmNlKSAvLyBJZiBub3QgYW4gQXN5bmNJdGVyYWJsZSwgdHJlYXQgYXMgYSBzZW50aW5lbCBhbmQgd3JhcCBpbiBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzb3VyY2U7IC8vIG90aGVyd2lzZSBpZiBBc3luY0l0ZXJhYmxlLCB1c2UgaXRcbiAgICAgICAgeWllbGQgX19hd2FpdCgvLyBvdGhlcndpc2UgaWYgQXN5bmNJdGVyYWJsZSwgdXNlIGl0XG4gICAgICAgIHlpZWxkKiBfX2FzeW5jRGVsZWdhdG9yKF9fYXN5bmNWYWx1ZXMocHVtcCgoZnVuY3Rpb24gKGl0KSB7XG4gICAgICAgICAgICByZXR1cm4gX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHIgPSBudWxsO1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgciA9IHlpZWxkIF9fYXdhaXQoaXQubmV4dCh5aWVsZCB5aWVsZCBfX2F3YWl0KHRvQXJyYXlCdWZmZXJWaWV3KEFycmF5Q3RvciwgcikpKSk7XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAoIXIuZG9uZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkoYnVmZmVyc1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSkpKSkpO1xuICAgICAgICByZXR1cm4geWllbGQgX19hd2FpdChuZXcgQXJyYXlDdG9yKCkpO1xuICAgIH0pO1xufVxuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IHRvSW50OEFycmF5QXN5bmNJdGVyYXRvciA9IChpbnB1dCkgPT4gdG9BcnJheUJ1ZmZlclZpZXdBc3luY0l0ZXJhdG9yKEludDhBcnJheSwgaW5wdXQpO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IHRvSW50MTZBcnJheUFzeW5jSXRlcmF0b3IgPSAoaW5wdXQpID0+IHRvQXJyYXlCdWZmZXJWaWV3QXN5bmNJdGVyYXRvcihJbnQxNkFycmF5LCBpbnB1dCk7XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9JbnQzMkFycmF5QXN5bmNJdGVyYXRvciA9IChpbnB1dCkgPT4gdG9BcnJheUJ1ZmZlclZpZXdBc3luY0l0ZXJhdG9yKEludDMyQXJyYXksIGlucHV0KTtcbi8qKiBAaWdub3JlICovIGV4cG9ydCBjb25zdCB0b1VpbnQ4QXJyYXlBc3luY0l0ZXJhdG9yID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlld0FzeW5jSXRlcmF0b3IoVWludDhBcnJheSwgaW5wdXQpO1xuLyoqIEBpZ25vcmUgKi8gZXhwb3J0IGNvbnN0IHRvVWludDE2QXJyYXlBc3luY0l0ZXJhdG9yID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlld0FzeW5jSXRlcmF0b3IoVWludDE2QXJyYXksIGlucHV0KTtcbi8qKiBAaWdub3JlICovIGV4cG9ydCBjb25zdCB0b1VpbnQzMkFycmF5QXN5bmNJdGVyYXRvciA9IChpbnB1dCkgPT4gdG9BcnJheUJ1ZmZlclZpZXdBc3luY0l0ZXJhdG9yKFVpbnQzMkFycmF5LCBpbnB1dCk7XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9GbG9hdDMyQXJyYXlBc3luY0l0ZXJhdG9yID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlld0FzeW5jSXRlcmF0b3IoRmxvYXQzMkFycmF5LCBpbnB1dCk7XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9GbG9hdDY0QXJyYXlBc3luY0l0ZXJhdG9yID0gKGlucHV0KSA9PiB0b0FycmF5QnVmZmVyVmlld0FzeW5jSXRlcmF0b3IoRmxvYXQ2NEFycmF5LCBpbnB1dCk7XG4vKiogQGlnbm9yZSAqLyBleHBvcnQgY29uc3QgdG9VaW50OENsYW1wZWRBcnJheUFzeW5jSXRlcmF0b3IgPSAoaW5wdXQpID0+IHRvQXJyYXlCdWZmZXJWaWV3QXN5bmNJdGVyYXRvcihVaW50OENsYW1wZWRBcnJheSwgaW5wdXQpO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiByZWJhc2VWYWx1ZU9mZnNldHMob2Zmc2V0LCBsZW5ndGgsIHZhbHVlT2Zmc2V0cykge1xuICAgIC8vIElmIHdlIGhhdmUgYSBub24temVybyBvZmZzZXQsIGNyZWF0ZSBhIG5ldyBvZmZzZXRzIGFycmF5IHdpdGggdGhlIHZhbHVlc1xuICAgIC8vIHNoaWZ0ZWQgYnkgdGhlIHN0YXJ0IG9mZnNldCwgc3VjaCB0aGF0IHRoZSBuZXcgc3RhcnQgb2Zmc2V0IGlzIDBcbiAgICBpZiAob2Zmc2V0ICE9PSAwKSB7XG4gICAgICAgIHZhbHVlT2Zmc2V0cyA9IHZhbHVlT2Zmc2V0cy5zbGljZSgwLCBsZW5ndGggKyAxKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IC0xOyArK2kgPD0gbGVuZ3RoOykge1xuICAgICAgICAgICAgdmFsdWVPZmZzZXRzW2ldICs9IG9mZnNldDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWVPZmZzZXRzO1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlQXJyYXlMaWtlKGEsIGIpIHtcbiAgICBsZXQgaSA9IDA7XG4gICAgY29uc3QgbiA9IGEubGVuZ3RoO1xuICAgIGlmIChuICE9PSBiLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuID4gMCkge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoKytpIDwgbik7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1idWZmZXIubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIENodW5rZWRJdGVyYXRvciB7XG4gICAgY29uc3RydWN0b3IobnVtQ2h1bmtzID0gMCwgZ2V0Q2h1bmtJdGVyYXRvcikge1xuICAgICAgICB0aGlzLm51bUNodW5rcyA9IG51bUNodW5rcztcbiAgICAgICAgdGhpcy5nZXRDaHVua0l0ZXJhdG9yID0gZ2V0Q2h1bmtJdGVyYXRvcjtcbiAgICAgICAgdGhpcy5jaHVua0luZGV4ID0gMDtcbiAgICAgICAgdGhpcy5jaHVua0l0ZXJhdG9yID0gdGhpcy5nZXRDaHVua0l0ZXJhdG9yKDApO1xuICAgIH1cbiAgICBuZXh0KCkge1xuICAgICAgICB3aGlsZSAodGhpcy5jaHVua0luZGV4IDwgdGhpcy5udW1DaHVua3MpIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmNodW5rSXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgaWYgKCFuZXh0LmRvbmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgrK3RoaXMuY2h1bmtJbmRleCA8IHRoaXMubnVtQ2h1bmtzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaHVua0l0ZXJhdG9yID0gdGhpcy5nZXRDaHVua0l0ZXJhdG9yKHRoaXMuY2h1bmtJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGwgfTtcbiAgICB9XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUNodW5rTnVsbENvdW50cyhjaHVua3MpIHtcbiAgICByZXR1cm4gY2h1bmtzLnJlZHVjZSgobnVsbENvdW50LCBjaHVuaykgPT4gbnVsbENvdW50ICsgY2h1bmsubnVsbENvdW50LCAwKTtcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUNodW5rT2Zmc2V0cyhjaHVua3MpIHtcbiAgICByZXR1cm4gY2h1bmtzLnJlZHVjZSgob2Zmc2V0cywgY2h1bmssIGluZGV4KSA9PiB7XG4gICAgICAgIG9mZnNldHNbaW5kZXggKyAxXSA9IG9mZnNldHNbaW5kZXhdICsgY2h1bmsubGVuZ3RoO1xuICAgICAgICByZXR1cm4gb2Zmc2V0cztcbiAgICB9LCBuZXcgVWludDMyQXJyYXkoY2h1bmtzLmxlbmd0aCArIDEpKTtcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgZnVuY3Rpb24gc2xpY2VDaHVua3MoY2h1bmtzLCBvZmZzZXRzLCBiZWdpbiwgZW5kKSB7XG4gICAgY29uc3Qgc2xpY2VzID0gW107XG4gICAgZm9yIChsZXQgaSA9IC0xLCBuID0gY2h1bmtzLmxlbmd0aDsgKytpIDwgbjspIHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSBjaHVua3NbaV07XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IG9mZnNldHNbaV07XG4gICAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBjaHVuaztcbiAgICAgICAgLy8gU3RvcCBpZiB0aGUgY2hpbGQgaXMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBzbGljZSBib3VuZGFyeVxuICAgICAgICBpZiAob2Zmc2V0ID49IGVuZCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXhjbHVkZSBjaGlsZHJlbiB0byB0aGUgbGVmdCBvZiBvZiB0aGUgc2xpY2UgYm91bmRhcnlcbiAgICAgICAgaWYgKGJlZ2luID49IG9mZnNldCArIGxlbmd0aCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW5jbHVkZSBlbnRpcmUgY2hpbGQgaWYgYmV0d2VlbiBib3RoIGxlZnQgYW5kIHJpZ2h0IGJvdW5kYXJpZXNcbiAgICAgICAgaWYgKG9mZnNldCA+PSBiZWdpbiAmJiAob2Zmc2V0ICsgbGVuZ3RoKSA8PSBlbmQpIHtcbiAgICAgICAgICAgIHNsaWNlcy5wdXNoKGNodW5rKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEluY2x1ZGUgdGhlIGNoaWxkIHNsaWNlIHRoYXQgb3ZlcmxhcHMgb25lIG9mIHRoZSBzbGljZSBib3VuZGFyaWVzXG4gICAgICAgIGNvbnN0IGZyb20gPSBNYXRoLm1heCgwLCBiZWdpbiAtIG9mZnNldCk7XG4gICAgICAgIGNvbnN0IHRvID0gTWF0aC5taW4oZW5kIC0gb2Zmc2V0LCBsZW5ndGgpO1xuICAgICAgICBzbGljZXMucHVzaChjaHVuay5zbGljZShmcm9tLCB0byAtIGZyb20pKTtcbiAgICB9XG4gICAgaWYgKHNsaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc2xpY2VzLnB1c2goY2h1bmtzWzBdLnNsaWNlKDAsIDApKTtcbiAgICB9XG4gICAgcmV0dXJuIHNsaWNlcztcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgZnVuY3Rpb24gYmluYXJ5U2VhcmNoKGNodW5rcywgb2Zmc2V0cywgaWR4LCBmbikge1xuICAgIGxldCBsaHMgPSAwLCBtaWQgPSAwLCByaHMgPSBvZmZzZXRzLmxlbmd0aCAtIDE7XG4gICAgZG8ge1xuICAgICAgICBpZiAobGhzID49IHJocyAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybiAoaWR4IDwgb2Zmc2V0c1tyaHNdKSA/IGZuKGNodW5rcywgbGhzLCBpZHggLSBvZmZzZXRzW2xoc10pIDogbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBtaWQgPSBsaHMgKyAoTWF0aC50cnVuYygocmhzIC0gbGhzKSAqIC41KSk7XG4gICAgICAgIGlkeCA8IG9mZnNldHNbbWlkXSA/IChyaHMgPSBtaWQpIDogKGxocyA9IG1pZCk7XG4gICAgfSB3aGlsZSAobGhzIDwgcmhzKTtcbn1cbi8qKiBAaWdub3JlICovXG5leHBvcnQgZnVuY3Rpb24gaXNDaHVua2VkVmFsaWQoZGF0YSwgaW5kZXgpIHtcbiAgICByZXR1cm4gZGF0YS5nZXRWYWxpZChpbmRleCk7XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBDaHVua2VkQ2FsbDEoZm4pIHtcbiAgICBmdW5jdGlvbiBjaHVua2VkRm4oY2h1bmtzLCBpLCBqKSB7IHJldHVybiBmbihjaHVua3NbaV0sIGopOyB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuICAgICAgICByZXR1cm4gYmluYXJ5U2VhcmNoKGRhdGEsIHRoaXMuX29mZnNldHMsIGluZGV4LCBjaHVua2VkRm4pO1xuICAgIH07XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBDaHVua2VkQ2FsbDIoZm4pIHtcbiAgICBsZXQgXzI7XG4gICAgZnVuY3Rpb24gY2h1bmtlZEZuKGNodW5rcywgaSwgaikgeyByZXR1cm4gZm4oY2h1bmtzW2ldLCBqLCBfMik7IH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKGluZGV4LCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuICAgICAgICBfMiA9IHZhbHVlO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBiaW5hcnlTZWFyY2goZGF0YSwgdGhpcy5fb2Zmc2V0cywgaW5kZXgsIGNodW5rZWRGbik7XG4gICAgICAgIF8yID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBDaHVua2VkSW5kZXhPZihpbmRleE9mKSB7XG4gICAgbGV0IF8xO1xuICAgIGZ1bmN0aW9uIGNodW5rZWRJbmRleE9mKGRhdGEsIGNodW5rSW5kZXgsIGZyb21JbmRleCkge1xuICAgICAgICBsZXQgYmVnaW4gPSBmcm9tSW5kZXgsIGluZGV4ID0gMCwgdG90YWwgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gY2h1bmtJbmRleCAtIDEsIG4gPSBkYXRhLmxlbmd0aDsgKytpIDwgbjspIHtcbiAgICAgICAgICAgIGNvbnN0IGNodW5rID0gZGF0YVtpXTtcbiAgICAgICAgICAgIGlmICh+KGluZGV4ID0gaW5kZXhPZihjaHVuaywgXzEsIGJlZ2luKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG90YWwgKyBpbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJlZ2luID0gMDtcbiAgICAgICAgICAgIHRvdGFsICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoZWxlbWVudCwgb2Zmc2V0KSB7XG4gICAgICAgIF8xID0gZWxlbWVudDtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdHlwZW9mIG9mZnNldCAhPT0gJ251bWJlcidcbiAgICAgICAgICAgID8gY2h1bmtlZEluZGV4T2YoZGF0YSwgMCwgMClcbiAgICAgICAgICAgIDogYmluYXJ5U2VhcmNoKGRhdGEsIHRoaXMuX29mZnNldHMsIG9mZnNldCwgY2h1bmtlZEluZGV4T2YpO1xuICAgICAgICBfMSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaHVuay5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbi8qKiBAaWdub3JlICovXG5jb25zdCBbQmlnSW50Q3RvciwgQmlnSW50QXZhaWxhYmxlXSA9ICgoKSA9PiB7XG4gICAgY29uc3QgQmlnSW50VW5hdmFpbGFibGVFcnJvciA9ICgpID0+IHsgdGhyb3cgbmV3IEVycm9yKCdCaWdJbnQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50Jyk7IH07XG4gICAgZnVuY3Rpb24gQmlnSW50VW5hdmFpbGFibGUoKSB7IHRocm93IEJpZ0ludFVuYXZhaWxhYmxlRXJyb3IoKTsgfVxuICAgIEJpZ0ludFVuYXZhaWxhYmxlLmFzSW50TiA9ICgpID0+IHsgdGhyb3cgQmlnSW50VW5hdmFpbGFibGVFcnJvcigpOyB9O1xuICAgIEJpZ0ludFVuYXZhaWxhYmxlLmFzVWludE4gPSAoKSA9PiB7IHRocm93IEJpZ0ludFVuYXZhaWxhYmxlRXJyb3IoKTsgfTtcbiAgICByZXR1cm4gdHlwZW9mIEJpZ0ludCAhPT0gJ3VuZGVmaW5lZCcgPyBbQmlnSW50LCB0cnVlXSA6IFtCaWdJbnRVbmF2YWlsYWJsZSwgZmFsc2VdO1xufSkoKTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBbQmlnSW50NjRBcnJheUN0b3IsIEJpZ0ludDY0QXJyYXlBdmFpbGFibGVdID0gKCgpID0+IHtcbiAgICBjb25zdCBCaWdJbnQ2NEFycmF5VW5hdmFpbGFibGVFcnJvciA9ICgpID0+IHsgdGhyb3cgbmV3IEVycm9yKCdCaWdJbnQ2NEFycmF5IGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudCcpOyB9O1xuICAgIGNsYXNzIEJpZ0ludDY0QXJyYXlVbmF2YWlsYWJsZSB7XG4gICAgICAgIHN0YXRpYyBnZXQgQllURVNfUEVSX0VMRU1FTlQoKSB7IHJldHVybiA4OyB9XG4gICAgICAgIHN0YXRpYyBvZigpIHsgdGhyb3cgQmlnSW50NjRBcnJheVVuYXZhaWxhYmxlRXJyb3IoKTsgfVxuICAgICAgICBzdGF0aWMgZnJvbSgpIHsgdGhyb3cgQmlnSW50NjRBcnJheVVuYXZhaWxhYmxlRXJyb3IoKTsgfVxuICAgICAgICBjb25zdHJ1Y3RvcigpIHsgdGhyb3cgQmlnSW50NjRBcnJheVVuYXZhaWxhYmxlRXJyb3IoKTsgfVxuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIEJpZ0ludDY0QXJyYXkgIT09ICd1bmRlZmluZWQnID8gW0JpZ0ludDY0QXJyYXksIHRydWVdIDogW0JpZ0ludDY0QXJyYXlVbmF2YWlsYWJsZSwgZmFsc2VdO1xufSkoKTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBbQmlnVWludDY0QXJyYXlDdG9yLCBCaWdVaW50NjRBcnJheUF2YWlsYWJsZV0gPSAoKCkgPT4ge1xuICAgIGNvbnN0IEJpZ1VpbnQ2NEFycmF5VW5hdmFpbGFibGVFcnJvciA9ICgpID0+IHsgdGhyb3cgbmV3IEVycm9yKCdCaWdVaW50NjRBcnJheSBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQnKTsgfTtcbiAgICBjbGFzcyBCaWdVaW50NjRBcnJheVVuYXZhaWxhYmxlIHtcbiAgICAgICAgc3RhdGljIGdldCBCWVRFU19QRVJfRUxFTUVOVCgpIHsgcmV0dXJuIDg7IH1cbiAgICAgICAgc3RhdGljIG9mKCkgeyB0aHJvdyBCaWdVaW50NjRBcnJheVVuYXZhaWxhYmxlRXJyb3IoKTsgfVxuICAgICAgICBzdGF0aWMgZnJvbSgpIHsgdGhyb3cgQmlnVWludDY0QXJyYXlVbmF2YWlsYWJsZUVycm9yKCk7IH1cbiAgICAgICAgY29uc3RydWN0b3IoKSB7IHRocm93IEJpZ1VpbnQ2NEFycmF5VW5hdmFpbGFibGVFcnJvcigpOyB9XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgQmlnVWludDY0QXJyYXkgIT09ICd1bmRlZmluZWQnID8gW0JpZ1VpbnQ2NEFycmF5LCB0cnVlXSA6IFtCaWdVaW50NjRBcnJheVVuYXZhaWxhYmxlLCBmYWxzZV07XG59KSgpO1xuZXhwb3J0IHsgQmlnSW50Q3RvciBhcyBCaWdJbnQsIEJpZ0ludEF2YWlsYWJsZSB9O1xuZXhwb3J0IHsgQmlnSW50NjRBcnJheUN0b3IgYXMgQmlnSW50NjRBcnJheSwgQmlnSW50NjRBcnJheUF2YWlsYWJsZSB9O1xuZXhwb3J0IHsgQmlnVWludDY0QXJyYXlDdG9yIGFzIEJpZ1VpbnQ2NEFycmF5LCBCaWdVaW50NjRBcnJheUF2YWlsYWJsZSB9O1xuLyoqIEBpZ25vcmUgKi8gY29uc3QgaXNOdW1iZXIgPSAoeCkgPT4gdHlwZW9mIHggPT09ICdudW1iZXInO1xuLyoqIEBpZ25vcmUgKi8gY29uc3QgaXNCb29sZWFuID0gKHgpID0+IHR5cGVvZiB4ID09PSAnYm9vbGVhbic7XG4vKiogQGlnbm9yZSAqLyBjb25zdCBpc0Z1bmN0aW9uID0gKHgpID0+IHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nO1xuLyoqIEBpZ25vcmUgKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG5leHBvcnQgY29uc3QgaXNPYmplY3QgPSAoeCkgPT4geCAhPSBudWxsICYmIE9iamVjdCh4KSA9PT0geDtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgaXNQcm9taXNlID0gKHgpID0+IHtcbiAgICByZXR1cm4gaXNPYmplY3QoeCkgJiYgaXNGdW5jdGlvbih4LnRoZW4pO1xufTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgaXNPYnNlcnZhYmxlID0gKHgpID0+IHtcbiAgICByZXR1cm4gaXNPYmplY3QoeCkgJiYgaXNGdW5jdGlvbih4LnN1YnNjcmliZSk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBpc0l0ZXJhYmxlID0gKHgpID0+IHtcbiAgICByZXR1cm4gaXNPYmplY3QoeCkgJiYgaXNGdW5jdGlvbih4W1N5bWJvbC5pdGVyYXRvcl0pO1xufTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgaXNBc3luY0l0ZXJhYmxlID0gKHgpID0+IHtcbiAgICByZXR1cm4gaXNPYmplY3QoeCkgJiYgaXNGdW5jdGlvbih4W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBpc0Fycm93SlNPTiA9ICh4KSA9PiB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHgpICYmIGlzT2JqZWN0KHhbJ3NjaGVtYSddKTtcbn07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IGlzQXJyYXlMaWtlID0gKHgpID0+IHtcbiAgICByZXR1cm4gaXNPYmplY3QoeCkgJiYgaXNOdW1iZXIoeFsnbGVuZ3RoJ10pO1xufTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgaXNJdGVyYXRvclJlc3VsdCA9ICh4KSA9PiB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHgpICYmICgnZG9uZScgaW4geCkgJiYgKCd2YWx1ZScgaW4geCk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBpc1VuZGVybHlpbmdTaW5rID0gKHgpID0+IHtcbiAgICByZXR1cm4gaXNPYmplY3QoeCkgJiZcbiAgICAgICAgaXNGdW5jdGlvbih4WydhYm9ydCddKSAmJlxuICAgICAgICBpc0Z1bmN0aW9uKHhbJ2Nsb3NlJ10pICYmXG4gICAgICAgIGlzRnVuY3Rpb24oeFsnc3RhcnQnXSkgJiZcbiAgICAgICAgaXNGdW5jdGlvbih4Wyd3cml0ZSddKTtcbn07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IGlzRmlsZUhhbmRsZSA9ICh4KSA9PiB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHgpICYmIGlzRnVuY3Rpb24oeFsnc3RhdCddKSAmJiBpc051bWJlcih4WydmZCddKTtcbn07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IGlzRlNSZWFkU3RyZWFtID0gKHgpID0+IHtcbiAgICByZXR1cm4gaXNSZWFkYWJsZU5vZGVTdHJlYW0oeCkgJiYgaXNOdW1iZXIoeFsnYnl0ZXNSZWFkJ10pO1xufTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgaXNGZXRjaFJlc3BvbnNlID0gKHgpID0+IHtcbiAgICByZXR1cm4gaXNPYmplY3QoeCkgJiYgaXNSZWFkYWJsZURPTVN0cmVhbSh4Wydib2R5J10pO1xufTtcbmNvbnN0IGlzUmVhZGFibGVJbnRlcm9wID0gKHgpID0+ICgnX2dldERPTVN0cmVhbScgaW4geCAmJiAnX2dldE5vZGVTdHJlYW0nIGluIHgpO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBpc1dyaXRhYmxlRE9NU3RyZWFtID0gKHgpID0+IHtcbiAgICByZXR1cm4gaXNPYmplY3QoeCkgJiZcbiAgICAgICAgaXNGdW5jdGlvbih4WydhYm9ydCddKSAmJlxuICAgICAgICBpc0Z1bmN0aW9uKHhbJ2dldFdyaXRlciddKSAmJlxuICAgICAgICAhaXNSZWFkYWJsZUludGVyb3AoeCk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBpc1JlYWRhYmxlRE9NU3RyZWFtID0gKHgpID0+IHtcbiAgICByZXR1cm4gaXNPYmplY3QoeCkgJiZcbiAgICAgICAgaXNGdW5jdGlvbih4WydjYW5jZWwnXSkgJiZcbiAgICAgICAgaXNGdW5jdGlvbih4WydnZXRSZWFkZXInXSkgJiZcbiAgICAgICAgIWlzUmVhZGFibGVJbnRlcm9wKHgpO1xufTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgaXNXcml0YWJsZU5vZGVTdHJlYW0gPSAoeCkgPT4ge1xuICAgIHJldHVybiBpc09iamVjdCh4KSAmJlxuICAgICAgICBpc0Z1bmN0aW9uKHhbJ2VuZCddKSAmJlxuICAgICAgICBpc0Z1bmN0aW9uKHhbJ3dyaXRlJ10pICYmXG4gICAgICAgIGlzQm9vbGVhbih4Wyd3cml0YWJsZSddKSAmJlxuICAgICAgICAhaXNSZWFkYWJsZUludGVyb3AoeCk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBpc1JlYWRhYmxlTm9kZVN0cmVhbSA9ICh4KSA9PiB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHgpICYmXG4gICAgICAgIGlzRnVuY3Rpb24oeFsncmVhZCddKSAmJlxuICAgICAgICBpc0Z1bmN0aW9uKHhbJ3BpcGUnXSkgJiZcbiAgICAgICAgaXNCb29sZWFuKHhbJ3JlYWRhYmxlJ10pICYmXG4gICAgICAgICFpc1JlYWRhYmxlSW50ZXJvcCh4KTtcbn07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IGlzRmxhdGJ1ZmZlcnNCeXRlQnVmZmVyID0gKHgpID0+IHtcbiAgICByZXR1cm4gaXNPYmplY3QoeCkgJiZcbiAgICAgICAgaXNGdW5jdGlvbih4WydjbGVhciddKSAmJlxuICAgICAgICBpc0Z1bmN0aW9uKHhbJ2J5dGVzJ10pICYmXG4gICAgICAgIGlzRnVuY3Rpb24oeFsncG9zaXRpb24nXSkgJiZcbiAgICAgICAgaXNGdW5jdGlvbih4WydzZXRQb3NpdGlvbiddKSAmJlxuICAgICAgICBpc0Z1bmN0aW9uKHhbJ2NhcGFjaXR5J10pICYmXG4gICAgICAgIGlzRnVuY3Rpb24oeFsnZ2V0QnVmZmVySWRlbnRpZmllciddKSAmJlxuICAgICAgICBpc0Z1bmN0aW9uKHhbJ2NyZWF0ZUxvbmcnXSk7XG59O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21wYXQubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG4vKiogQGlnbm9yZSAqL1xuY29uc3QgY2FycnlCaXQxNiA9IDEgPDwgMTY7XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gaW50QXNIZXgodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPCAwKSB7XG4gICAgICAgIHZhbHVlID0gMHhGRkZGRkZGRiArIHZhbHVlICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIGAweCR7dmFsdWUudG9TdHJpbmcoMTYpfWA7XG59XG4vKiogQGlnbm9yZSAqL1xuY29uc3Qga0ludDMyRGVjaW1hbERpZ2l0cyA9IDg7XG4vKiogQGlnbm9yZSAqL1xuY29uc3Qga1Bvd2Vyc09mVGVuID0gW1xuICAgIDEsXG4gICAgMTAsXG4gICAgMTAwLFxuICAgIDEwMDAsXG4gICAgMTAwMDAsXG4gICAgMTAwMDAwLFxuICAgIDEwMDAwMDAsXG4gICAgMTAwMDAwMDAsXG4gICAgMTAwMDAwMDAwXG5dO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBCYXNlSW50NjQge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICB9XG4gICAgaGlnaCgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyWzFdOyB9XG4gICAgbG93KCkgeyByZXR1cm4gdGhpcy5idWZmZXJbMF07IH1cbiAgICBfdGltZXMob3RoZXIpIHtcbiAgICAgICAgLy8gQnJlYWsgdGhlIGxlZnQgYW5kIHJpZ2h0IG51bWJlcnMgaW50byAxNiBiaXQgY2h1bmtzXG4gICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIG11bHRpcGx5IHRoZW0gd2l0aG91dCBvdmVyZmxvdy5cbiAgICAgICAgY29uc3QgTCA9IG5ldyBVaW50MzJBcnJheShbXG4gICAgICAgICAgICB0aGlzLmJ1ZmZlclsxXSA+Pj4gMTYsXG4gICAgICAgICAgICB0aGlzLmJ1ZmZlclsxXSAmIDB4RkZGRixcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyWzBdID4+PiAxNixcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyWzBdICYgMHhGRkZGXG4gICAgICAgIF0pO1xuICAgICAgICBjb25zdCBSID0gbmV3IFVpbnQzMkFycmF5KFtcbiAgICAgICAgICAgIG90aGVyLmJ1ZmZlclsxXSA+Pj4gMTYsXG4gICAgICAgICAgICBvdGhlci5idWZmZXJbMV0gJiAweEZGRkYsXG4gICAgICAgICAgICBvdGhlci5idWZmZXJbMF0gPj4+IDE2LFxuICAgICAgICAgICAgb3RoZXIuYnVmZmVyWzBdICYgMHhGRkZGXG4gICAgICAgIF0pO1xuICAgICAgICBsZXQgcHJvZHVjdCA9IExbM10gKiBSWzNdO1xuICAgICAgICB0aGlzLmJ1ZmZlclswXSA9IHByb2R1Y3QgJiAweEZGRkY7XG4gICAgICAgIGxldCBzdW0gPSBwcm9kdWN0ID4+PiAxNjtcbiAgICAgICAgcHJvZHVjdCA9IExbMl0gKiBSWzNdO1xuICAgICAgICBzdW0gKz0gcHJvZHVjdDtcbiAgICAgICAgcHJvZHVjdCA9IChMWzNdICogUlsyXSkgPj4+IDA7XG4gICAgICAgIHN1bSArPSBwcm9kdWN0O1xuICAgICAgICB0aGlzLmJ1ZmZlclswXSArPSBzdW0gPDwgMTY7XG4gICAgICAgIHRoaXMuYnVmZmVyWzFdID0gKHN1bSA+Pj4gMCA8IHByb2R1Y3QgPyBjYXJyeUJpdDE2IDogMCk7XG4gICAgICAgIHRoaXMuYnVmZmVyWzFdICs9IHN1bSA+Pj4gMTY7XG4gICAgICAgIHRoaXMuYnVmZmVyWzFdICs9IExbMV0gKiBSWzNdICsgTFsyXSAqIFJbMl0gKyBMWzNdICogUlsxXTtcbiAgICAgICAgdGhpcy5idWZmZXJbMV0gKz0gKExbMF0gKiBSWzNdICsgTFsxXSAqIFJbMl0gKyBMWzJdICogUlsxXSArIExbM10gKiBSWzBdKSA8PCAxNjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIF9wbHVzKG90aGVyKSB7XG4gICAgICAgIGNvbnN0IHN1bSA9ICh0aGlzLmJ1ZmZlclswXSArIG90aGVyLmJ1ZmZlclswXSkgPj4+IDA7XG4gICAgICAgIHRoaXMuYnVmZmVyWzFdICs9IG90aGVyLmJ1ZmZlclsxXTtcbiAgICAgICAgaWYgKHN1bSA8ICh0aGlzLmJ1ZmZlclswXSA+Pj4gMCkpIHtcbiAgICAgICAgICAgICsrdGhpcy5idWZmZXJbMV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWZmZXJbMF0gPSBzdW07XG4gICAgfVxuICAgIGxlc3NUaGFuKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlclsxXSA8IG90aGVyLmJ1ZmZlclsxXSB8fFxuICAgICAgICAgICAgKHRoaXMuYnVmZmVyWzFdID09PSBvdGhlci5idWZmZXJbMV0gJiYgdGhpcy5idWZmZXJbMF0gPCBvdGhlci5idWZmZXJbMF0pO1xuICAgIH1cbiAgICBlcXVhbHMob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyWzFdID09PSBvdGhlci5idWZmZXJbMV0gJiYgdGhpcy5idWZmZXJbMF0gPT0gb3RoZXIuYnVmZmVyWzBdO1xuICAgIH1cbiAgICBncmVhdGVyVGhhbihvdGhlcikge1xuICAgICAgICByZXR1cm4gb3RoZXIubGVzc1RoYW4odGhpcyk7XG4gICAgfVxuICAgIGhleCgpIHtcbiAgICAgICAgcmV0dXJuIGAke2ludEFzSGV4KHRoaXMuYnVmZmVyWzFdKX0gJHtpbnRBc0hleCh0aGlzLmJ1ZmZlclswXSl9YDtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFVpbnQ2NCBleHRlbmRzIEJhc2VJbnQ2NCB7XG4gICAgdGltZXMob3RoZXIpIHtcbiAgICAgICAgdGhpcy5fdGltZXMob3RoZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcGx1cyhvdGhlcikge1xuICAgICAgICB0aGlzLl9wbHVzKG90aGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBmcm9tKHZhbCwgb3V0X2J1ZmZlciA9IG5ldyBVaW50MzJBcnJheSgyKSkge1xuICAgICAgICByZXR1cm4gVWludDY0LmZyb21TdHJpbmcodHlwZW9mICh2YWwpID09PSAnc3RyaW5nJyA/IHZhbCA6IHZhbC50b1N0cmluZygpLCBvdXRfYnVmZmVyKTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGZyb21OdW1iZXIobnVtLCBvdXRfYnVmZmVyID0gbmV3IFVpbnQzMkFycmF5KDIpKSB7XG4gICAgICAgIC8vIEFsd2F5cyBwYXJzZSBudW1iZXJzIGFzIHN0cmluZ3MgLSBwdWxsaW5nIG91dCBoaWdoIGFuZCBsb3cgYml0c1xuICAgICAgICAvLyBkaXJlY3RseSBzZWVtcyB0byBsb3NlIHByZWNpc2lvbiBzb21ldGltZXNcbiAgICAgICAgLy8gRm9yIGV4YW1wbGU6XG4gICAgICAgIC8vICAgICA+IC00NjEzMDM0MTU2NDAwMjEyMDAwID4+PiAwXG4gICAgICAgIC8vICAgICA3MjE3ODI3ODRcbiAgICAgICAgLy8gVGhlIGNvcnJlY3QgbG93ZXIgMzItYml0cyBhcmUgNzIxNzgyNzUyXG4gICAgICAgIHJldHVybiBVaW50NjQuZnJvbVN0cmluZyhudW0udG9TdHJpbmcoKSwgb3V0X2J1ZmZlcik7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBmcm9tU3RyaW5nKHN0ciwgb3V0X2J1ZmZlciA9IG5ldyBVaW50MzJBcnJheSgyKSkge1xuICAgICAgICBjb25zdCBsZW5ndGggPSBzdHIubGVuZ3RoO1xuICAgICAgICBjb25zdCBvdXQgPSBuZXcgVWludDY0KG91dF9idWZmZXIpO1xuICAgICAgICBmb3IgKGxldCBwb3NuID0gMDsgcG9zbiA8IGxlbmd0aDspIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0ga0ludDMyRGVjaW1hbERpZ2l0cyA8IGxlbmd0aCAtIHBvc24gP1xuICAgICAgICAgICAgICAgIGtJbnQzMkRlY2ltYWxEaWdpdHMgOiBsZW5ndGggLSBwb3NuO1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBuZXcgVWludDY0KG5ldyBVaW50MzJBcnJheShbTnVtYmVyLnBhcnNlSW50KHN0ci5zbGljZShwb3NuLCBwb3NuICsgZ3JvdXApLCAxMCksIDBdKSk7XG4gICAgICAgICAgICBjb25zdCBtdWx0aXBsZSA9IG5ldyBVaW50NjQobmV3IFVpbnQzMkFycmF5KFtrUG93ZXJzT2ZUZW5bZ3JvdXBdLCAwXSkpO1xuICAgICAgICAgICAgb3V0LnRpbWVzKG11bHRpcGxlKTtcbiAgICAgICAgICAgIG91dC5wbHVzKGNodW5rKTtcbiAgICAgICAgICAgIHBvc24gKz0gZ3JvdXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGNvbnZlcnRBcnJheSh2YWx1ZXMpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50MzJBcnJheSh2YWx1ZXMubGVuZ3RoICogMik7XG4gICAgICAgIGZvciAobGV0IGkgPSAtMSwgbiA9IHZhbHVlcy5sZW5ndGg7ICsraSA8IG47KSB7XG4gICAgICAgICAgICBVaW50NjQuZnJvbSh2YWx1ZXNbaV0sIG5ldyBVaW50MzJBcnJheShkYXRhLmJ1ZmZlciwgZGF0YS5ieXRlT2Zmc2V0ICsgMiAqIGkgKiA0LCAyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBtdWx0aXBseShsZWZ0LCByaWdodCkge1xuICAgICAgICBjb25zdCBydHJuID0gbmV3IFVpbnQ2NChuZXcgVWludDMyQXJyYXkobGVmdC5idWZmZXIpKTtcbiAgICAgICAgcmV0dXJuIHJ0cm4udGltZXMocmlnaHQpO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgYWRkKGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIGNvbnN0IHJ0cm4gPSBuZXcgVWludDY0KG5ldyBVaW50MzJBcnJheShsZWZ0LmJ1ZmZlcikpO1xuICAgICAgICByZXR1cm4gcnRybi5wbHVzKHJpZ2h0KTtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEludDY0IGV4dGVuZHMgQmFzZUludDY0IHtcbiAgICBuZWdhdGUoKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyWzBdID0gfnRoaXMuYnVmZmVyWzBdICsgMTtcbiAgICAgICAgdGhpcy5idWZmZXJbMV0gPSB+dGhpcy5idWZmZXJbMV07XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlclswXSA9PSAwKSB7XG4gICAgICAgICAgICArK3RoaXMuYnVmZmVyWzFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aW1lcyhvdGhlcikge1xuICAgICAgICB0aGlzLl90aW1lcyhvdGhlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBwbHVzKG90aGVyKSB7XG4gICAgICAgIHRoaXMuX3BsdXMob3RoZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgbGVzc1RoYW4ob3RoZXIpIHtcbiAgICAgICAgLy8gZm9yY2UgaGlnaCBieXRlcyB0byBiZSBzaWduZWRcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLW1hdGgtdHJ1bmNcbiAgICAgICAgY29uc3QgdGhpc19oaWdoID0gdGhpcy5idWZmZXJbMV0gPDwgMDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLW1hdGgtdHJ1bmNcbiAgICAgICAgY29uc3Qgb3RoZXJfaGlnaCA9IG90aGVyLmJ1ZmZlclsxXSA8PCAwO1xuICAgICAgICByZXR1cm4gdGhpc19oaWdoIDwgb3RoZXJfaGlnaCB8fFxuICAgICAgICAgICAgKHRoaXNfaGlnaCA9PT0gb3RoZXJfaGlnaCAmJiB0aGlzLmJ1ZmZlclswXSA8IG90aGVyLmJ1ZmZlclswXSk7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBmcm9tKHZhbCwgb3V0X2J1ZmZlciA9IG5ldyBVaW50MzJBcnJheSgyKSkge1xuICAgICAgICByZXR1cm4gSW50NjQuZnJvbVN0cmluZyh0eXBlb2YgKHZhbCkgPT09ICdzdHJpbmcnID8gdmFsIDogdmFsLnRvU3RyaW5nKCksIG91dF9idWZmZXIpO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbU51bWJlcihudW0sIG91dF9idWZmZXIgPSBuZXcgVWludDMyQXJyYXkoMikpIHtcbiAgICAgICAgLy8gQWx3YXlzIHBhcnNlIG51bWJlcnMgYXMgc3RyaW5ncyAtIHB1bGxpbmcgb3V0IGhpZ2ggYW5kIGxvdyBiaXRzXG4gICAgICAgIC8vIGRpcmVjdGx5IHNlZW1zIHRvIGxvc2UgcHJlY2lzaW9uIHNvbWV0aW1lc1xuICAgICAgICAvLyBGb3IgZXhhbXBsZTpcbiAgICAgICAgLy8gICAgID4gLTQ2MTMwMzQxNTY0MDAyMTIwMDAgPj4+IDBcbiAgICAgICAgLy8gICAgIDcyMTc4Mjc4NFxuICAgICAgICAvLyBUaGUgY29ycmVjdCBsb3dlciAzMi1iaXRzIGFyZSA3MjE3ODI3NTJcbiAgICAgICAgcmV0dXJuIEludDY0LmZyb21TdHJpbmcobnVtLnRvU3RyaW5nKCksIG91dF9idWZmZXIpO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgZnJvbVN0cmluZyhzdHIsIG91dF9idWZmZXIgPSBuZXcgVWludDMyQXJyYXkoMikpIHtcbiAgICAgICAgLy8gVE9ETzogQXNzZXJ0IHRoYXQgb3V0X2J1ZmZlciBpcyAwIGFuZCBsZW5ndGggPSAyXG4gICAgICAgIGNvbnN0IG5lZ2F0ZSA9IHN0ci5zdGFydHNXaXRoKCctJyk7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHN0ci5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG91dCA9IG5ldyBJbnQ2NChvdXRfYnVmZmVyKTtcbiAgICAgICAgZm9yIChsZXQgcG9zbiA9IG5lZ2F0ZSA/IDEgOiAwOyBwb3NuIDwgbGVuZ3RoOykge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBrSW50MzJEZWNpbWFsRGlnaXRzIDwgbGVuZ3RoIC0gcG9zbiA/XG4gICAgICAgICAgICAgICAga0ludDMyRGVjaW1hbERpZ2l0cyA6IGxlbmd0aCAtIHBvc247XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IG5ldyBJbnQ2NChuZXcgVWludDMyQXJyYXkoW051bWJlci5wYXJzZUludChzdHIuc2xpY2UocG9zbiwgcG9zbiArIGdyb3VwKSwgMTApLCAwXSkpO1xuICAgICAgICAgICAgY29uc3QgbXVsdGlwbGUgPSBuZXcgSW50NjQobmV3IFVpbnQzMkFycmF5KFtrUG93ZXJzT2ZUZW5bZ3JvdXBdLCAwXSkpO1xuICAgICAgICAgICAgb3V0LnRpbWVzKG11bHRpcGxlKTtcbiAgICAgICAgICAgIG91dC5wbHVzKGNodW5rKTtcbiAgICAgICAgICAgIHBvc24gKz0gZ3JvdXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5lZ2F0ZSA/IG91dC5uZWdhdGUoKSA6IG91dDtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGNvbnZlcnRBcnJheSh2YWx1ZXMpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50MzJBcnJheSh2YWx1ZXMubGVuZ3RoICogMik7XG4gICAgICAgIGZvciAobGV0IGkgPSAtMSwgbiA9IHZhbHVlcy5sZW5ndGg7ICsraSA8IG47KSB7XG4gICAgICAgICAgICBJbnQ2NC5mcm9tKHZhbHVlc1tpXSwgbmV3IFVpbnQzMkFycmF5KGRhdGEuYnVmZmVyLCBkYXRhLmJ5dGVPZmZzZXQgKyAyICogaSAqIDQsIDIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIG11bHRpcGx5KGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIGNvbnN0IHJ0cm4gPSBuZXcgSW50NjQobmV3IFVpbnQzMkFycmF5KGxlZnQuYnVmZmVyKSk7XG4gICAgICAgIHJldHVybiBydHJuLnRpbWVzKHJpZ2h0KTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGFkZChsZWZ0LCByaWdodCkge1xuICAgICAgICBjb25zdCBydHJuID0gbmV3IEludDY0KG5ldyBVaW50MzJBcnJheShsZWZ0LmJ1ZmZlcikpO1xuICAgICAgICByZXR1cm4gcnRybi5wbHVzKHJpZ2h0KTtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEludDEyOCB7XG4gICAgY29uc3RydWN0b3IoYnVmZmVyKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgICAgICAvLyBidWZmZXJbM10gTVNCIChoaWdoKVxuICAgICAgICAvLyBidWZmZXJbMl1cbiAgICAgICAgLy8gYnVmZmVyWzFdXG4gICAgICAgIC8vIGJ1ZmZlclswXSBMU0IgKGxvdylcbiAgICB9XG4gICAgaGlnaCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnQ2NChuZXcgVWludDMyQXJyYXkodGhpcy5idWZmZXIuYnVmZmVyLCB0aGlzLmJ1ZmZlci5ieXRlT2Zmc2V0ICsgOCwgMikpO1xuICAgIH1cbiAgICBsb3coKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW50NjQobmV3IFVpbnQzMkFycmF5KHRoaXMuYnVmZmVyLmJ1ZmZlciwgdGhpcy5idWZmZXIuYnl0ZU9mZnNldCwgMikpO1xuICAgIH1cbiAgICBuZWdhdGUoKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyWzBdID0gfnRoaXMuYnVmZmVyWzBdICsgMTtcbiAgICAgICAgdGhpcy5idWZmZXJbMV0gPSB+dGhpcy5idWZmZXJbMV07XG4gICAgICAgIHRoaXMuYnVmZmVyWzJdID0gfnRoaXMuYnVmZmVyWzJdO1xuICAgICAgICB0aGlzLmJ1ZmZlclszXSA9IH50aGlzLmJ1ZmZlclszXTtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyWzBdID09IDApIHtcbiAgICAgICAgICAgICsrdGhpcy5idWZmZXJbMV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyWzFdID09IDApIHtcbiAgICAgICAgICAgICsrdGhpcy5idWZmZXJbMl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyWzJdID09IDApIHtcbiAgICAgICAgICAgICsrdGhpcy5idWZmZXJbM107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRpbWVzKG90aGVyKSB7XG4gICAgICAgIC8vIEJyZWFrIHRoZSBsZWZ0IGFuZCByaWdodCBudW1iZXJzIGludG8gMzIgYml0IGNodW5rc1xuICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiBtdWx0aXBseSB0aGVtIHdpdGhvdXQgb3ZlcmZsb3cuXG4gICAgICAgIGNvbnN0IEwwID0gbmV3IFVpbnQ2NChuZXcgVWludDMyQXJyYXkoW3RoaXMuYnVmZmVyWzNdLCAwXSkpO1xuICAgICAgICBjb25zdCBMMSA9IG5ldyBVaW50NjQobmV3IFVpbnQzMkFycmF5KFt0aGlzLmJ1ZmZlclsyXSwgMF0pKTtcbiAgICAgICAgY29uc3QgTDIgPSBuZXcgVWludDY0KG5ldyBVaW50MzJBcnJheShbdGhpcy5idWZmZXJbMV0sIDBdKSk7XG4gICAgICAgIGNvbnN0IEwzID0gbmV3IFVpbnQ2NChuZXcgVWludDMyQXJyYXkoW3RoaXMuYnVmZmVyWzBdLCAwXSkpO1xuICAgICAgICBjb25zdCBSMCA9IG5ldyBVaW50NjQobmV3IFVpbnQzMkFycmF5KFtvdGhlci5idWZmZXJbM10sIDBdKSk7XG4gICAgICAgIGNvbnN0IFIxID0gbmV3IFVpbnQ2NChuZXcgVWludDMyQXJyYXkoW290aGVyLmJ1ZmZlclsyXSwgMF0pKTtcbiAgICAgICAgY29uc3QgUjIgPSBuZXcgVWludDY0KG5ldyBVaW50MzJBcnJheShbb3RoZXIuYnVmZmVyWzFdLCAwXSkpO1xuICAgICAgICBjb25zdCBSMyA9IG5ldyBVaW50NjQobmV3IFVpbnQzMkFycmF5KFtvdGhlci5idWZmZXJbMF0sIDBdKSk7XG4gICAgICAgIGxldCBwcm9kdWN0ID0gVWludDY0Lm11bHRpcGx5KEwzLCBSMyk7XG4gICAgICAgIHRoaXMuYnVmZmVyWzBdID0gcHJvZHVjdC5sb3coKTtcbiAgICAgICAgY29uc3Qgc3VtID0gbmV3IFVpbnQ2NChuZXcgVWludDMyQXJyYXkoW3Byb2R1Y3QuaGlnaCgpLCAwXSkpO1xuICAgICAgICBwcm9kdWN0ID0gVWludDY0Lm11bHRpcGx5KEwyLCBSMyk7XG4gICAgICAgIHN1bS5wbHVzKHByb2R1Y3QpO1xuICAgICAgICBwcm9kdWN0ID0gVWludDY0Lm11bHRpcGx5KEwzLCBSMik7XG4gICAgICAgIHN1bS5wbHVzKHByb2R1Y3QpO1xuICAgICAgICB0aGlzLmJ1ZmZlclsxXSA9IHN1bS5sb3coKTtcbiAgICAgICAgdGhpcy5idWZmZXJbM10gPSAoc3VtLmxlc3NUaGFuKHByb2R1Y3QpID8gMSA6IDApO1xuICAgICAgICB0aGlzLmJ1ZmZlclsyXSA9IHN1bS5oaWdoKCk7XG4gICAgICAgIGNvbnN0IGhpZ2ggPSBuZXcgVWludDY0KG5ldyBVaW50MzJBcnJheSh0aGlzLmJ1ZmZlci5idWZmZXIsIHRoaXMuYnVmZmVyLmJ5dGVPZmZzZXQgKyA4LCAyKSk7XG4gICAgICAgIGhpZ2gucGx1cyhVaW50NjQubXVsdGlwbHkoTDEsIFIzKSlcbiAgICAgICAgICAgIC5wbHVzKFVpbnQ2NC5tdWx0aXBseShMMiwgUjIpKVxuICAgICAgICAgICAgLnBsdXMoVWludDY0Lm11bHRpcGx5KEwzLCBSMSkpO1xuICAgICAgICB0aGlzLmJ1ZmZlclszXSArPSBVaW50NjQubXVsdGlwbHkoTDAsIFIzKVxuICAgICAgICAgICAgLnBsdXMoVWludDY0Lm11bHRpcGx5KEwxLCBSMikpXG4gICAgICAgICAgICAucGx1cyhVaW50NjQubXVsdGlwbHkoTDIsIFIxKSlcbiAgICAgICAgICAgIC5wbHVzKFVpbnQ2NC5tdWx0aXBseShMMywgUjApKS5sb3coKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHBsdXMob3RoZXIpIHtcbiAgICAgICAgY29uc3Qgc3VtcyA9IG5ldyBVaW50MzJBcnJheSg0KTtcbiAgICAgICAgc3Vtc1szXSA9ICh0aGlzLmJ1ZmZlclszXSArIG90aGVyLmJ1ZmZlclszXSkgPj4+IDA7XG4gICAgICAgIHN1bXNbMl0gPSAodGhpcy5idWZmZXJbMl0gKyBvdGhlci5idWZmZXJbMl0pID4+PiAwO1xuICAgICAgICBzdW1zWzFdID0gKHRoaXMuYnVmZmVyWzFdICsgb3RoZXIuYnVmZmVyWzFdKSA+Pj4gMDtcbiAgICAgICAgc3Vtc1swXSA9ICh0aGlzLmJ1ZmZlclswXSArIG90aGVyLmJ1ZmZlclswXSkgPj4+IDA7XG4gICAgICAgIGlmIChzdW1zWzBdIDwgKHRoaXMuYnVmZmVyWzBdID4+PiAwKSkge1xuICAgICAgICAgICAgKytzdW1zWzFdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdW1zWzFdIDwgKHRoaXMuYnVmZmVyWzFdID4+PiAwKSkge1xuICAgICAgICAgICAgKytzdW1zWzJdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdW1zWzJdIDwgKHRoaXMuYnVmZmVyWzJdID4+PiAwKSkge1xuICAgICAgICAgICAgKytzdW1zWzNdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmZmVyWzNdID0gc3Vtc1szXTtcbiAgICAgICAgdGhpcy5idWZmZXJbMl0gPSBzdW1zWzJdO1xuICAgICAgICB0aGlzLmJ1ZmZlclsxXSA9IHN1bXNbMV07XG4gICAgICAgIHRoaXMuYnVmZmVyWzBdID0gc3Vtc1swXTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGhleCgpIHtcbiAgICAgICAgcmV0dXJuIGAke2ludEFzSGV4KHRoaXMuYnVmZmVyWzNdKX0gJHtpbnRBc0hleCh0aGlzLmJ1ZmZlclsyXSl9ICR7aW50QXNIZXgodGhpcy5idWZmZXJbMV0pfSAke2ludEFzSGV4KHRoaXMuYnVmZmVyWzBdKX1gO1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgbXVsdGlwbHkobGVmdCwgcmlnaHQpIHtcbiAgICAgICAgY29uc3QgcnRybiA9IG5ldyBJbnQxMjgobmV3IFVpbnQzMkFycmF5KGxlZnQuYnVmZmVyKSk7XG4gICAgICAgIHJldHVybiBydHJuLnRpbWVzKHJpZ2h0KTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGFkZChsZWZ0LCByaWdodCkge1xuICAgICAgICBjb25zdCBydHJuID0gbmV3IEludDEyOChuZXcgVWludDMyQXJyYXkobGVmdC5idWZmZXIpKTtcbiAgICAgICAgcmV0dXJuIHJ0cm4ucGx1cyhyaWdodCk7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBmcm9tKHZhbCwgb3V0X2J1ZmZlciA9IG5ldyBVaW50MzJBcnJheSg0KSkge1xuICAgICAgICByZXR1cm4gSW50MTI4LmZyb21TdHJpbmcodHlwZW9mICh2YWwpID09PSAnc3RyaW5nJyA/IHZhbCA6IHZhbC50b1N0cmluZygpLCBvdXRfYnVmZmVyKTtcbiAgICB9XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGZyb21OdW1iZXIobnVtLCBvdXRfYnVmZmVyID0gbmV3IFVpbnQzMkFycmF5KDQpKSB7XG4gICAgICAgIC8vIEFsd2F5cyBwYXJzZSBudW1iZXJzIGFzIHN0cmluZ3MgLSBwdWxsaW5nIG91dCBoaWdoIGFuZCBsb3cgYml0c1xuICAgICAgICAvLyBkaXJlY3RseSBzZWVtcyB0byBsb3NlIHByZWNpc2lvbiBzb21ldGltZXNcbiAgICAgICAgLy8gRm9yIGV4YW1wbGU6XG4gICAgICAgIC8vICAgICA+IC00NjEzMDM0MTU2NDAwMjEyMDAwID4+PiAwXG4gICAgICAgIC8vICAgICA3MjE3ODI3ODRcbiAgICAgICAgLy8gVGhlIGNvcnJlY3QgbG93ZXIgMzItYml0cyBhcmUgNzIxNzgyNzUyXG4gICAgICAgIHJldHVybiBJbnQxMjguZnJvbVN0cmluZyhudW0udG9TdHJpbmcoKSwgb3V0X2J1ZmZlcik7XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBmcm9tU3RyaW5nKHN0ciwgb3V0X2J1ZmZlciA9IG5ldyBVaW50MzJBcnJheSg0KSkge1xuICAgICAgICAvLyBUT0RPOiBBc3NlcnQgdGhhdCBvdXRfYnVmZmVyIGlzIDAgYW5kIGxlbmd0aCA9IDRcbiAgICAgICAgY29uc3QgbmVnYXRlID0gc3RyLnN0YXJ0c1dpdGgoJy0nKTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gc3RyLmxlbmd0aDtcbiAgICAgICAgY29uc3Qgb3V0ID0gbmV3IEludDEyOChvdXRfYnVmZmVyKTtcbiAgICAgICAgZm9yIChsZXQgcG9zbiA9IG5lZ2F0ZSA/IDEgOiAwOyBwb3NuIDwgbGVuZ3RoOykge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBrSW50MzJEZWNpbWFsRGlnaXRzIDwgbGVuZ3RoIC0gcG9zbiA/XG4gICAgICAgICAgICAgICAga0ludDMyRGVjaW1hbERpZ2l0cyA6IGxlbmd0aCAtIHBvc247XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IG5ldyBJbnQxMjgobmV3IFVpbnQzMkFycmF5KFtOdW1iZXIucGFyc2VJbnQoc3RyLnNsaWNlKHBvc24sIHBvc24gKyBncm91cCksIDEwKSwgMCwgMCwgMF0pKTtcbiAgICAgICAgICAgIGNvbnN0IG11bHRpcGxlID0gbmV3IEludDEyOChuZXcgVWludDMyQXJyYXkoW2tQb3dlcnNPZlRlbltncm91cF0sIDAsIDAsIDBdKSk7XG4gICAgICAgICAgICBvdXQudGltZXMobXVsdGlwbGUpO1xuICAgICAgICAgICAgb3V0LnBsdXMoY2h1bmspO1xuICAgICAgICAgICAgcG9zbiArPSBncm91cDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmVnYXRlID8gb3V0Lm5lZ2F0ZSgpIDogb3V0O1xuICAgIH1cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgY29udmVydEFycmF5KHZhbHVlcykge1xuICAgICAgICAvLyBUT0RPOiBEaXN0aW5ndWlzaCBiZXR3ZWVuIHN0cmluZyBhbmQgbnVtYmVyIGF0IGNvbXBpbGUtdGltZVxuICAgICAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQzMkFycmF5KHZhbHVlcy5sZW5ndGggKiA0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IC0xLCBuID0gdmFsdWVzLmxlbmd0aDsgKytpIDwgbjspIHtcbiAgICAgICAgICAgIEludDEyOC5mcm9tKHZhbHVlc1tpXSwgbmV3IFVpbnQzMkFycmF5KGRhdGEuYnVmZmVyLCBkYXRhLmJ5dGVPZmZzZXQgKyA0ICogNCAqIGksIDQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWludC5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmNvbnN0IGY2NCA9IG5ldyBGbG9hdDY0QXJyYXkoMSk7XG5jb25zdCB1MzIgPSBuZXcgVWludDMyQXJyYXkoZjY0LmJ1ZmZlcik7XG4vKipcbiAqIENvbnZlcnQgdWludDE2IChsb2dpY2FsbHkgYSBmbG9hdDE2KSB0byBhIEpTIGZsb2F0NjQuIEluc3BpcmVkIGJ5IG51bXB5J3MgYG5weV9oYWxmX3RvX2RvdWJsZWA6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vbnVtcHkvbnVtcHkvYmxvYi81YTU5ODcyOTFkYzk1Mzc2YmIwOThiZThkOGU1MzkxZTg5ZTc3YTJjL251bXB5L2NvcmUvc3JjL25weW1hdGgvaGFsZmZsb2F0LmMjTDI5XG4gKiBAcGFyYW0gaCB7bnVtYmVyfSB0aGUgdWludDE2IHRvIGNvbnZlcnRcbiAqIEBwcml2YXRlXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aW50MTZUb0Zsb2F0NjQoaCkge1xuICAgIGNvbnN0IGV4cG8gPSAoaCAmIDB4N0MwMCkgPj4gMTA7XG4gICAgY29uc3Qgc2lnZiA9IChoICYgMHgwM0ZGKSAvIDEwMjQ7XG4gICAgY29uc3Qgc2lnbiA9IE1hdGgucG93KCgtMSksICgoaCAmIDB4ODAwMCkgPj4gMTUpKTtcbiAgICBzd2l0Y2ggKGV4cG8pIHtcbiAgICAgICAgY2FzZSAweDFGOiByZXR1cm4gc2lnbiAqIChzaWdmID8gTnVtYmVyLk5hTiA6IDEgLyAwKTtcbiAgICAgICAgY2FzZSAweDAwOiByZXR1cm4gc2lnbiAqIChzaWdmID8gNi4xMDM1MTU2MjVlLTUgKiBzaWdmIDogMCk7XG4gICAgfVxuICAgIHJldHVybiBzaWduICogKE1hdGgucG93KDIsIChleHBvIC0gMTUpKSkgKiAoMSArIHNpZ2YpO1xufVxuLyoqXG4gKiBDb252ZXJ0IGEgZmxvYXQ2NCB0byB1aW50MTYgKGFzc3VtaW5nIHRoZSBmbG9hdDY0IGlzIGxvZ2ljYWxseSBhIGZsb2F0MTYpLiBJbnNwaXJlZCBieSBudW1weSdzIGBucHlfZG91YmxlX3RvX2hhbGZgOlxuICogaHR0cHM6Ly9naXRodWIuY29tL251bXB5L251bXB5L2Jsb2IvNWE1OTg3MjkxZGM5NTM3NmJiMDk4YmU4ZDhlNTM5MWU4OWU3N2EyYy9udW1weS9jb3JlL3NyYy9ucHltYXRoL2hhbGZmbG9hdC5jI0w0M1xuICogQHBhcmFtIGQge251bWJlcn0gVGhlIGZsb2F0NjQgdG8gY29udmVydFxuICogQHByaXZhdGVcbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsb2F0NjRUb1VpbnQxNihkKSB7XG4gICAgaWYgKGQgIT09IGQpIHtcbiAgICAgICAgcmV0dXJuIDB4N0UwMDtcbiAgICB9IC8vIE5hTlxuICAgIGY2NFswXSA9IGQ7XG4gICAgLy8gTWFnaWMgbnVtYmVyczpcbiAgICAvLyAweDgwMDAwMDAwID0gMTAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgLS0gbWFza3MgdGhlIDMybmQgYml0XG4gICAgLy8gMHg3ZmYwMDAwMCA9IDAxMTExMTExIDExMTEwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIC0tIG1hc2tzIHRoZSAyMXN0LTMxc3QgYml0c1xuICAgIC8vIDB4MDAwZmZmZmYgPSAwMDAwMDAwMCAwMDAwMTExMSAxMTExMTExMSAxMTExMTExMSAtLSBtYXNrcyB0aGUgMXN0LTIwdGggYml0XG4gICAgY29uc3Qgc2lnbiA9ICh1MzJbMV0gJiAweDgwMDAwMDAwKSA+PiAxNiAmIDB4RkZGRjtcbiAgICBsZXQgZXhwbyA9ICh1MzJbMV0gJiAweDdGRjAwMDAwKSwgc2lnZiA9IDB4MDAwMDtcbiAgICBpZiAoZXhwbyA+PSAweDQwRjAwMDAwKSB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIGV4cG9uZW50IG92ZXJmbG93ZWQsIHRoZSBmbG9hdDE2IGlzIGVpdGhlciBOYU4gb3IgSW5maW5pdHkuXG4gICAgICAgIC8vIFJ1bGVzIHRvIHByb3BhZ2F0ZSB0aGUgc2lnbiBiaXQ6IG1hbnRpc3NhID4gMCA/IE5hTiA6ICsvLUluZmluaXR5XG4gICAgICAgIC8vXG4gICAgICAgIC8vIE1hZ2ljIG51bWJlcnM6XG4gICAgICAgIC8vIDB4NDBGMDAwMDAgPSAwMTAwMDAwMCAxMTExMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAtLSA2LWJpdCBleHBvbmVudCBvdmVyZmxvd1xuICAgICAgICAvLyAweDdDMDAwMDAwID0gMDExMTExMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgLS0gbWFza3MgdGhlIDI3dGgtMzFzdCBiaXRzXG4gICAgICAgIC8vXG4gICAgICAgIC8vIHJldHVybnM6XG4gICAgICAgIC8vIHFOYU4sIGFrYSAzMjI1NiBkZWNpbWFsLCAweDdFMDAgaGV4LCBvciAwMTExMTExMCAwMDAwMDAwMCBiaW5hcnlcbiAgICAgICAgLy8gc05hTiwgYWthIDMyMDAwIGRlY2ltYWwsIDB4N0QwMCBoZXgsIG9yIDAxMTExMTAxIDAwMDAwMDAwIGJpbmFyeVxuICAgICAgICAvLyAraW5mLCBha2EgMzE3NDQgZGVjaW1hbCwgMHg3QzAwIGhleCwgb3IgMDExMTExMDAgMDAwMDAwMDAgYmluYXJ5XG4gICAgICAgIC8vIC1pbmYsIGFrYSA2NDUxMiBkZWNpbWFsLCAweEZDMDAgaGV4LCBvciAxMTExMTEwMCAwMDAwMDAwMCBiaW5hcnlcbiAgICAgICAgLy9cbiAgICAgICAgLy8gSWYgbWFudGlzc2EgaXMgZ3JlYXRlciB0aGFuIDIzIGJpdHMsIHNldCB0byArSW5maW5pdHkgbGlrZSBudW1weVxuICAgICAgICBpZiAodTMyWzBdID4gMCkge1xuICAgICAgICAgICAgZXhwbyA9IDB4N0MwMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGV4cG8gPSAoZXhwbyAmIDB4N0MwMDAwMDApID4+IDE2O1xuICAgICAgICAgICAgc2lnZiA9ICh1MzJbMV0gJiAweDAwMEZGRkZGKSA+PiAxMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChleHBvIDw9IDB4M0YwMDAwMDApIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gSWYgZXhwb25lbnQgdW5kZXJmbG93ZWQsIHRoZSBmbG9hdCBpcyBlaXRoZXIgc2lnbmVkIHplcm8gb3Igc3Vibm9ybWFsLlxuICAgICAgICAvL1xuICAgICAgICAvLyBNYWdpYyBudW1iZXJzOlxuICAgICAgICAvLyAweDNGMDAwMDAwID0gMDAxMTExMTEgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgLS0gNi1iaXQgZXhwb25lbnQgdW5kZXJmbG93XG4gICAgICAgIC8vXG4gICAgICAgIHNpZ2YgPSAweDEwMDAwMCArICh1MzJbMV0gJiAweDAwMEZGRkZGKTtcbiAgICAgICAgc2lnZiA9IDB4MTAwMDAwICsgKHNpZ2YgPDwgKChleHBvID4+IDIwKSAtIDk5OCkpID4+IDIxO1xuICAgICAgICBleHBvID0gMDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vIE5vIG92ZXJmbG93IG9yIHVuZGVyZmxvdywgcmViYXNlIHRoZSBleHBvbmVudCBhbmQgcm91bmQgdGhlIG1hbnRpc3NhXG4gICAgICAgIC8vIE1hZ2ljIG51bWJlcnM6XG4gICAgICAgIC8vIDB4MjAwID0gMDAwMDAwMTAgMDAwMDAwMDAgLS0gbWFza3Mgb2ZmIHRoZSAxMHRoIGJpdFxuICAgICAgICAvL1xuICAgICAgICAvLyBFbnN1cmUgdGhlIGZpcnN0IG1hbnRpc3NhIGJpdCAodGhlIDEwdGggb25lKSBpcyAxIGFuZCByb3VuZFxuICAgICAgICBleHBvID0gKGV4cG8gLSAweDNGMDAwMDAwKSA+PiAxMDtcbiAgICAgICAgc2lnZiA9ICgodTMyWzFdICYgMHgwMDBGRkZGRikgKyAweDIwMCkgPj4gMTA7XG4gICAgfVxuICAgIHJldHVybiBzaWduIHwgZXhwbyB8IHNpZ2YgJiAweEZGRkY7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hdGgubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG4vKiogQGlnbm9yZSAqLyBjb25zdCB1bmRmID0gdm9pZCAoMCk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlVG9TdHJpbmcoeCkge1xuICAgIGlmICh4ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIGlmICh4ID09PSB1bmRmKSB7XG4gICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICB9XG4gICAgc3dpdGNoICh0eXBlb2YgeCkge1xuICAgICAgICBjYXNlICdudW1iZXInOiByZXR1cm4gYCR7eH1gO1xuICAgICAgICBjYXNlICdiaWdpbnQnOiByZXR1cm4gYCR7eH1gO1xuICAgICAgICBjYXNlICdzdHJpbmcnOiByZXR1cm4gYFwiJHt4fVwiYDtcbiAgICB9XG4gICAgLy8gSWYgW1N5bWJvbC50b1ByaW1pdGl2ZV0gaXMgaW1wbGVtZW50ZWQgKGxpa2UgaW4gQk4pXG4gICAgLy8gdXNlIGl0IGluc3RlYWQgb2YgSlNPTi5zdHJpbmdpZnkoKS4gVGhpcyBlbnN1cmVzIHdlXG4gICAgLy8gcHJpbnQgQmlnSW50cywgRGVjaW1hbHMsIGFuZCBCaW5hcnkgaW4gdGhlaXIgbmF0aXZlXG4gICAgLy8gcmVwcmVzZW50YXRpb25cbiAgICBpZiAodHlwZW9mIHhbU3ltYm9sLnRvUHJpbWl0aXZlXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4geFtTeW1ib2wudG9QcmltaXRpdmVdKCdzdHJpbmcnKTtcbiAgICB9XG4gICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh4KSkge1xuICAgICAgICBpZiAoeCBpbnN0YW5jZW9mIEJpZ0ludDY0QXJyYXkgfHwgeCBpbnN0YW5jZW9mIEJpZ1VpbnQ2NEFycmF5KSB7XG4gICAgICAgICAgICByZXR1cm4gYFske1suLi54XS5tYXAoeCA9PiB2YWx1ZVRvU3RyaW5nKHgpKX1dYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYFske3h9XWA7XG4gICAgfVxuICAgIHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoeCkgPyBgWyR7eH1dYCA6IEpTT04uc3RyaW5naWZ5KHgsIChfLCB5KSA9PiB0eXBlb2YgeSA9PT0gJ2JpZ2ludCcgPyBgJHt5fWAgOiB5KTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJldHR5Lm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgbWFrZURhdGEgfSBmcm9tICcuLi9kYXRhLm1qcyc7XG5pbXBvcnQgeyBTdHJ1Y3QgfSBmcm9tICcuLi90eXBlLm1qcyc7XG5pbXBvcnQgeyBSZWNvcmRCYXRjaCB9IGZyb20gJy4uL3JlY29yZGJhdGNoLm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3RyaWJ1dGVWZWN0b3JzSW50b1JlY29yZEJhdGNoZXMoc2NoZW1hLCB2ZWNzKSB7XG4gICAgcmV0dXJuIHVuaWZvcm1seURpc3RyaWJ1dGVDaHVua3NBY3Jvc3NSZWNvcmRCYXRjaGVzKHNjaGVtYSwgdmVjcy5tYXAoKHYpID0+IHYuZGF0YS5jb25jYXQoKSkpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIHVuaWZvcm1seURpc3RyaWJ1dGVDaHVua3NBY3Jvc3NSZWNvcmRCYXRjaGVzKHNjaGVtYSwgY29scykge1xuICAgIGNvbnN0IGZpZWxkcyA9IFsuLi5zY2hlbWEuZmllbGRzXTtcbiAgICBjb25zdCBiYXRjaGVzID0gW107XG4gICAgY29uc3QgbWVtbyA9IHsgbnVtQmF0Y2hlczogY29scy5yZWR1Y2UoKG4sIGMpID0+IE1hdGgubWF4KG4sIGMubGVuZ3RoKSwgMCkgfTtcbiAgICBsZXQgbnVtQmF0Y2hlcyA9IDAsIGJhdGNoTGVuZ3RoID0gMDtcbiAgICBsZXQgaSA9IC0xO1xuICAgIGNvbnN0IG51bUNvbHVtbnMgPSBjb2xzLmxlbmd0aDtcbiAgICBsZXQgY2hpbGQsIGNoaWxkcmVuID0gW107XG4gICAgd2hpbGUgKG1lbW8ubnVtQmF0Y2hlcy0tID4gMCkge1xuICAgICAgICBmb3IgKGJhdGNoTGVuZ3RoID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBpID0gLTE7ICsraSA8IG51bUNvbHVtbnM7KSB7XG4gICAgICAgICAgICBjaGlsZHJlbltpXSA9IGNoaWxkID0gY29sc1tpXS5zaGlmdCgpO1xuICAgICAgICAgICAgYmF0Y2hMZW5ndGggPSBNYXRoLm1pbihiYXRjaExlbmd0aCwgY2hpbGQgPyBjaGlsZC5sZW5ndGggOiBiYXRjaExlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShiYXRjaExlbmd0aCkpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gZGlzdHJpYnV0ZUNoaWxkcmVuKGZpZWxkcywgYmF0Y2hMZW5ndGgsIGNoaWxkcmVuLCBjb2xzLCBtZW1vKTtcbiAgICAgICAgICAgIGlmIChiYXRjaExlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBiYXRjaGVzW251bUJhdGNoZXMrK10gPSBtYWtlRGF0YSh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IG5ldyBTdHJ1Y3QoZmllbGRzKSxcbiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBiYXRjaExlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgbnVsbENvdW50OiAwLFxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW4uc2xpY2UoKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICAgIHNjaGVtYSA9IHNjaGVtYS5hc3NpZ24oZmllbGRzKSxcbiAgICAgICAgYmF0Y2hlcy5tYXAoKGRhdGEpID0+IG5ldyBSZWNvcmRCYXRjaChzY2hlbWEsIGRhdGEpKVxuICAgIF07XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZGlzdHJpYnV0ZUNoaWxkcmVuKGZpZWxkcywgYmF0Y2hMZW5ndGgsIGNoaWxkcmVuLCBjb2x1bW5zLCBtZW1vKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IG51bGxCaXRtYXBTaXplID0gKChiYXRjaExlbmd0aCArIDYzKSAmIH42MykgPj4gMztcbiAgICBmb3IgKGxldCBpID0gLTEsIG4gPSBjb2x1bW5zLmxlbmd0aDsgKytpIDwgbjspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gY2hpbGQgPT09IG51bGwgfHwgY2hpbGQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoaWxkLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbmd0aCA+PSBiYXRjaExlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGxlbmd0aCA9PT0gYmF0Y2hMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbltpXSA9IGNoaWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW5baV0gPSBjaGlsZC5zbGljZSgwLCBiYXRjaExlbmd0aCk7XG4gICAgICAgICAgICAgICAgbWVtby5udW1CYXRjaGVzID0gTWF0aC5tYXgobWVtby5udW1CYXRjaGVzLCBjb2x1bW5zW2ldLnVuc2hpZnQoY2hpbGQuc2xpY2UoYmF0Y2hMZW5ndGgsIGxlbmd0aCAtIGJhdGNoTGVuZ3RoKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBmaWVsZHNbaV07XG4gICAgICAgICAgICBmaWVsZHNbaV0gPSBmaWVsZC5jbG9uZSh7IG51bGxhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgICAgY2hpbGRyZW5baV0gPSAoX2EgPSBjaGlsZCA9PT0gbnVsbCB8fCBjaGlsZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hpbGQuX2NoYW5nZUxlbmd0aEFuZEJhY2tmaWxsTnVsbEJpdG1hcChiYXRjaExlbmd0aCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG1ha2VEYXRhKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBmaWVsZC50eXBlLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogYmF0Y2hMZW5ndGgsXG4gICAgICAgICAgICAgICAgbnVsbENvdW50OiBiYXRjaExlbmd0aCxcbiAgICAgICAgICAgICAgICBudWxsQml0bWFwOiBuZXcgVWludDhBcnJheShudWxsQml0bWFwU2l6ZSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaGlsZHJlbjtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVjb3JkYmF0Y2gubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5jb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcpO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBkZWNvZGVVdGY4ID0gKGJ1ZmZlcikgPT4gZGVjb2Rlci5kZWNvZGUoYnVmZmVyKTtcbmNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3QgZW5jb2RlVXRmOCA9ICh2YWx1ZSkgPT4gZW5jb2Rlci5lbmNvZGUodmFsdWUpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGY4Lm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgVmVjdG9yIH0gZnJvbSAnLi4vdmVjdG9yLm1qcyc7XG5pbXBvcnQgeyBNYXBSb3cgfSBmcm9tICcuLi9yb3cvbWFwLm1qcyc7XG5pbXBvcnQgeyBTdHJ1Y3RSb3cgfSBmcm9tICcuLi9yb3cvc3RydWN0Lm1qcyc7XG5pbXBvcnQgeyBjb21wYXJlQXJyYXlMaWtlIH0gZnJvbSAnLi4vdXRpbC9idWZmZXIubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgZnVuY3Rpb24gY2xhbXBJbmRleChzb3VyY2UsIGluZGV4LCB0aGVuKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcbiAgICBjb25zdCBhZGp1c3QgPSBpbmRleCA+IC0xID8gaW5kZXggOiAobGVuZ3RoICsgKGluZGV4ICUgbGVuZ3RoKSk7XG4gICAgcmV0dXJuIHRoZW4gPyB0aGVuKHNvdXJjZSwgYWRqdXN0KSA6IGFkanVzdDtcbn1cbi8qKiBAaWdub3JlICovXG5sZXQgdG1wO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcFJhbmdlKHNvdXJjZSwgYmVnaW4sIGVuZCwgdGhlbikge1xuICAgIC8vIEFkanVzdCBhcmdzIHNpbWlsYXIgdG8gQXJyYXkucHJvdG90eXBlLnNsaWNlLiBOb3JtYWxpemUgYmVnaW4vZW5kIHRvXG4gICAgLy8gY2xhbXAgYmV0d2VlbiAwIGFuZCBsZW5ndGgsIGFuZCB3cmFwIGFyb3VuZCBvbiBuZWdhdGl2ZSBpbmRpY2VzLCBlLmcuXG4gICAgLy8gc2xpY2UoLTEsIDUpIG9yIHNsaWNlKDUsIC0xKVxuICAgIGNvbnN0IHsgbGVuZ3RoOiBsZW4gPSAwIH0gPSBzb3VyY2U7XG4gICAgbGV0IGxocyA9IHR5cGVvZiBiZWdpbiAhPT0gJ251bWJlcicgPyAwIDogYmVnaW47XG4gICAgbGV0IHJocyA9IHR5cGVvZiBlbmQgIT09ICdudW1iZXInID8gbGVuIDogZW5kO1xuICAgIC8vIHdyYXAgYXJvdW5kIG9uIG5lZ2F0aXZlIHN0YXJ0L2VuZCBwb3NpdGlvbnNcbiAgICAobGhzIDwgMCkgJiYgKGxocyA9ICgobGhzICUgbGVuKSArIGxlbikgJSBsZW4pO1xuICAgIChyaHMgPCAwKSAmJiAocmhzID0gKChyaHMgJSBsZW4pICsgbGVuKSAlIGxlbik7XG4gICAgLy8gZW5zdXJlIGxocyA8PSByaHNcbiAgICAocmhzIDwgbGhzKSAmJiAodG1wID0gbGhzLCBsaHMgPSByaHMsIHJocyA9IHRtcCk7XG4gICAgLy8gZW5zdXJlIHJocyA8PSBsZW5ndGhcbiAgICAocmhzID4gbGVuKSAmJiAocmhzID0gbGVuKTtcbiAgICByZXR1cm4gdGhlbiA/IHRoZW4oc291cmNlLCBsaHMsIHJocykgOiBbbGhzLCByaHNdO1xufVxuY29uc3QgaXNOYU5GYXN0ID0gKHZhbHVlKSA9PiB2YWx1ZSAhPT0gdmFsdWU7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRDb21wYXJhdG9yKHNlYXJjaCkge1xuICAgIGNvbnN0IHR5cGVvZlNlYXJjaCA9IHR5cGVvZiBzZWFyY2g7XG4gICAgLy8gQ29tcGFyZSBwcmltaXRpdmVzXG4gICAgaWYgKHR5cGVvZlNlYXJjaCAhPT0gJ29iamVjdCcgfHwgc2VhcmNoID09PSBudWxsKSB7XG4gICAgICAgIC8vIENvbXBhcmUgTmFOXG4gICAgICAgIGlmIChpc05hTkZhc3Qoc2VhcmNoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzTmFORmFzdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHZhbHVlKSA9PiB2YWx1ZSA9PT0gc2VhcmNoO1xuICAgIH1cbiAgICAvLyBDb21wYXJlIERhdGVzXG4gICAgaWYgKHNlYXJjaCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgY29uc3QgdmFsdWVPZlNlYXJjaCA9IHNlYXJjaC52YWx1ZU9mKCk7XG4gICAgICAgIHJldHVybiAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/ICh2YWx1ZS52YWx1ZU9mKCkgPT09IHZhbHVlT2ZTZWFyY2gpIDogZmFsc2U7XG4gICAgfVxuICAgIC8vIENvbXBhcmUgVHlwZWRBcnJheXNcbiAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHNlYXJjaCkpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSkgPT4gdmFsdWUgPyBjb21wYXJlQXJyYXlMaWtlKHNlYXJjaCwgdmFsdWUpIDogZmFsc2U7XG4gICAgfVxuICAgIC8vIENvbXBhcmUgTWFwcyBhbmQgUm93c1xuICAgIGlmIChzZWFyY2ggaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZU1hcENvbXBhcmF0b3Ioc2VhcmNoKTtcbiAgICB9XG4gICAgLy8gQ29tcGFyZSBBcnJheS1saWtlc1xuICAgIGlmIChBcnJheS5pc0FycmF5KHNlYXJjaCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFycmF5TGlrZUNvbXBhcmF0b3Ioc2VhcmNoKTtcbiAgICB9XG4gICAgLy8gQ29tcGFyZSBWZWN0b3JzXG4gICAgaWYgKHNlYXJjaCBpbnN0YW5jZW9mIFZlY3Rvcikge1xuICAgICAgICByZXR1cm4gY3JlYXRlVmVjdG9yQ29tcGFyYXRvcihzZWFyY2gpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlT2JqZWN0Q29tcGFyYXRvcihzZWFyY2gsIHRydWUpO1xuICAgIC8vIENvbXBhcmUgbm9uLWVtcHR5IE9iamVjdHNcbiAgICAvLyByZXR1cm4gY3JlYXRlT2JqZWN0Q29tcGFyYXRvcihzZWFyY2gsIHNlYXJjaCBpbnN0YW5jZW9mIFByb3h5KTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBjcmVhdGVBcnJheUxpa2VDb21wYXJhdG9yKGxocykge1xuICAgIGNvbnN0IGNvbXBhcmF0b3JzID0gW107XG4gICAgZm9yIChsZXQgaSA9IC0xLCBuID0gbGhzLmxlbmd0aDsgKytpIDwgbjspIHtcbiAgICAgICAgY29tcGFyYXRvcnNbaV0gPSBjcmVhdGVFbGVtZW50Q29tcGFyYXRvcihsaHNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlU3ViRWxlbWVudHNDb21wYXJhdG9yKGNvbXBhcmF0b3JzKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBjcmVhdGVNYXBDb21wYXJhdG9yKGxocykge1xuICAgIGxldCBpID0gLTE7XG4gICAgY29uc3QgY29tcGFyYXRvcnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHYgb2YgbGhzLnZhbHVlcygpKVxuICAgICAgICBjb21wYXJhdG9yc1srK2ldID0gY3JlYXRlRWxlbWVudENvbXBhcmF0b3Iodik7XG4gICAgcmV0dXJuIGNyZWF0ZVN1YkVsZW1lbnRzQ29tcGFyYXRvcihjb21wYXJhdG9ycyk7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gY3JlYXRlVmVjdG9yQ29tcGFyYXRvcihsaHMpIHtcbiAgICBjb25zdCBjb21wYXJhdG9ycyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAtMSwgbiA9IGxocy5sZW5ndGg7ICsraSA8IG47KSB7XG4gICAgICAgIGNvbXBhcmF0b3JzW2ldID0gY3JlYXRlRWxlbWVudENvbXBhcmF0b3IobGhzLmdldChpKSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVTdWJFbGVtZW50c0NvbXBhcmF0b3IoY29tcGFyYXRvcnMpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGNyZWF0ZU9iamVjdENvbXBhcmF0b3IobGhzLCBhbGxvd0VtcHR5ID0gZmFsc2UpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMobGhzKTtcbiAgICAvLyBPbmx5IGNvbXBhcmUgbm9uLWVtcHR5IE9iamVjdHNcbiAgICBpZiAoIWFsbG93RW1wdHkgJiYga2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuICgpID0+IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjb21wYXJhdG9ycyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAtMSwgbiA9IGtleXMubGVuZ3RoOyArK2kgPCBuOykge1xuICAgICAgICBjb21wYXJhdG9yc1tpXSA9IGNyZWF0ZUVsZW1lbnRDb21wYXJhdG9yKGxoc1trZXlzW2ldXSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVTdWJFbGVtZW50c0NvbXBhcmF0b3IoY29tcGFyYXRvcnMsIGtleXMpO1xufVxuZnVuY3Rpb24gY3JlYXRlU3ViRWxlbWVudHNDb21wYXJhdG9yKGNvbXBhcmF0b3JzLCBrZXlzKSB7XG4gICAgcmV0dXJuIChyaHMpID0+IHtcbiAgICAgICAgaWYgKCFyaHMgfHwgdHlwZW9mIHJocyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHJocy5jb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgY2FzZSBBcnJheTogcmV0dXJuIGNvbXBhcmVBcnJheShjb21wYXJhdG9ycywgcmhzKTtcbiAgICAgICAgICAgIGNhc2UgTWFwOlxuICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlT2JqZWN0KGNvbXBhcmF0b3JzLCByaHMsIHJocy5rZXlzKCkpO1xuICAgICAgICAgICAgY2FzZSBNYXBSb3c6XG4gICAgICAgICAgICBjYXNlIFN0cnVjdFJvdzpcbiAgICAgICAgICAgIGNhc2UgT2JqZWN0OlxuICAgICAgICAgICAgY2FzZSB1bmRlZmluZWQ6IC8vIHN1cHBvcnQgYE9iamVjdC5jcmVhdGUobnVsbClgIG9iamVjdHNcbiAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZU9iamVjdChjb21wYXJhdG9ycywgcmhzLCBrZXlzIHx8IE9iamVjdC5rZXlzKHJocykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByaHMgaW5zdGFuY2VvZiBWZWN0b3IgPyBjb21wYXJlVmVjdG9yKGNvbXBhcmF0b3JzLCByaHMpIDogZmFsc2U7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVBcnJheShjb21wYXJhdG9ycywgYXJyKSB7XG4gICAgY29uc3QgbiA9IGNvbXBhcmF0b3JzLmxlbmd0aDtcbiAgICBpZiAoYXJyLmxlbmd0aCAhPT0gbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAtMTsgKytpIDwgbjspIHtcbiAgICAgICAgaWYgKCEoY29tcGFyYXRvcnNbaV0oYXJyW2ldKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVWZWN0b3IoY29tcGFyYXRvcnMsIHZlYykge1xuICAgIGNvbnN0IG4gPSBjb21wYXJhdG9ycy5sZW5ndGg7XG4gICAgaWYgKHZlYy5sZW5ndGggIT09IG4pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gLTE7ICsraSA8IG47KSB7XG4gICAgICAgIGlmICghKGNvbXBhcmF0b3JzW2ldKHZlYy5nZXQoaSkpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gY29tcGFyZU9iamVjdChjb21wYXJhdG9ycywgb2JqLCBrZXlzKSB7XG4gICAgY29uc3QgbEtleUl0ciA9IGtleXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgIGNvbnN0IHJLZXlJdHIgPSBvYmogaW5zdGFuY2VvZiBNYXAgPyBvYmoua2V5cygpIDogT2JqZWN0LmtleXMob2JqKVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgY29uc3QgclZhbEl0ciA9IG9iaiBpbnN0YW5jZW9mIE1hcCA/IG9iai52YWx1ZXMoKSA6IE9iamVjdC52YWx1ZXMob2JqKVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGNvbnN0IG4gPSBjb21wYXJhdG9ycy5sZW5ndGg7XG4gICAgbGV0IHJWYWwgPSByVmFsSXRyLm5leHQoKTtcbiAgICBsZXQgbEtleSA9IGxLZXlJdHIubmV4dCgpO1xuICAgIGxldCByS2V5ID0gcktleUl0ci5uZXh0KCk7XG4gICAgZm9yICg7IGkgPCBuICYmICFsS2V5LmRvbmUgJiYgIXJLZXkuZG9uZSAmJiAhclZhbC5kb25lOyArK2ksIGxLZXkgPSBsS2V5SXRyLm5leHQoKSwgcktleSA9IHJLZXlJdHIubmV4dCgpLCByVmFsID0gclZhbEl0ci5uZXh0KCkpIHtcbiAgICAgICAgaWYgKGxLZXkudmFsdWUgIT09IHJLZXkudmFsdWUgfHwgIWNvbXBhcmF0b3JzW2ldKHJWYWwudmFsdWUpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaSA9PT0gbiAmJiBsS2V5LmRvbmUgJiYgcktleS5kb25lICYmIHJWYWwuZG9uZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbEtleUl0ci5yZXR1cm4gJiYgbEtleUl0ci5yZXR1cm4oKTtcbiAgICByS2V5SXRyLnJldHVybiAmJiByS2V5SXRyLnJldHVybigpO1xuICAgIHJWYWxJdHIucmV0dXJuICYmIHJWYWxJdHIucmV0dXJuKCk7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD12ZWN0b3IubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG52YXIgX2E7XG5pbXBvcnQgeyBUeXBlIH0gZnJvbSAnLi9lbnVtLm1qcyc7XG5pbXBvcnQgeyBjbGFtcFJhbmdlIH0gZnJvbSAnLi91dGlsL3ZlY3Rvci5tanMnO1xuaW1wb3J0IHsgRGF0YVR5cGUsIHN0cmlkZUZvclR5cGUgfSBmcm9tICcuL3R5cGUubWpzJztcbmltcG9ydCB7IERhdGEsIG1ha2VEYXRhIH0gZnJvbSAnLi9kYXRhLm1qcyc7XG5pbXBvcnQgeyBpc0NodW5rZWRWYWxpZCwgY29tcHV0ZUNodW5rT2Zmc2V0cywgY29tcHV0ZUNodW5rTnVsbENvdW50cywgc2xpY2VDaHVua3MsIHdyYXBDaHVua2VkQ2FsbDEsIHdyYXBDaHVua2VkQ2FsbDIsIHdyYXBDaHVua2VkSW5kZXhPZiwgfSBmcm9tICcuL3V0aWwvY2h1bmsubWpzJztcbmltcG9ydCB7IGluc3RhbmNlIGFzIGdldFZpc2l0b3IgfSBmcm9tICcuL3Zpc2l0b3IvZ2V0Lm1qcyc7XG5pbXBvcnQgeyBpbnN0YW5jZSBhcyBzZXRWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yL3NldC5tanMnO1xuaW1wb3J0IHsgaW5zdGFuY2UgYXMgaW5kZXhPZlZpc2l0b3IgfSBmcm9tICcuL3Zpc2l0b3IvaW5kZXhvZi5tanMnO1xuaW1wb3J0IHsgaW5zdGFuY2UgYXMgaXRlcmF0b3JWaXNpdG9yIH0gZnJvbSAnLi92aXNpdG9yL2l0ZXJhdG9yLm1qcyc7XG5pbXBvcnQgeyBpbnN0YW5jZSBhcyBieXRlTGVuZ3RoVmlzaXRvciB9IGZyb20gJy4vdmlzaXRvci9ieXRlbGVuZ3RoLm1qcyc7XG5jb25zdCB2aXNpdG9yc0J5VHlwZUlkID0ge307XG5jb25zdCB2ZWN0b3JQcm90b3R5cGVzQnlUeXBlSWQgPSB7fTtcbi8qKlxuICogQXJyYXktbGlrZSBkYXRhIHN0cnVjdHVyZS4gVXNlIHRoZSBjb252ZW5pZW5jZSBtZXRob2Qge0BsaW5rIG1ha2VWZWN0b3J9IGFuZCB7QGxpbmsgdmVjdG9yRnJvbUFycmF5fSB0byBjcmVhdGUgdmVjdG9ycy5cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvciB7XG4gICAgY29uc3RydWN0b3IoaW5wdXQpIHtcbiAgICAgICAgdmFyIF9iLCBfYywgX2Q7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBpbnB1dFswXSBpbnN0YW5jZW9mIFZlY3RvclxuICAgICAgICAgICAgPyBpbnB1dC5mbGF0TWFwKHggPT4geC5kYXRhKVxuICAgICAgICAgICAgOiBpbnB1dDtcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwIHx8IGRhdGEuc29tZSgoeCkgPT4gISh4IGluc3RhbmNlb2YgRGF0YSkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdWZWN0b3IgY29uc3RydWN0b3IgZXhwZWN0cyBhbiBBcnJheSBvZiBEYXRhIGluc3RhbmNlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0eXBlID0gKF9iID0gZGF0YVswXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnR5cGU7XG4gICAgICAgIHN3aXRjaCAoZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICB0aGlzLl9vZmZzZXRzID0gWzBdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB1bmNodW5rZWQgdmVjdG9yc1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZ2V0LCBzZXQsIGluZGV4T2YsIGJ5dGVMZW5ndGggfSA9IHZpc2l0b3JzQnlUeXBlSWRbdHlwZS50eXBlSWRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVuY2h1bmtlZERhdGEgPSBkYXRhWzBdO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNWYWxpZCA9IChpbmRleCkgPT4gaXNDaHVua2VkVmFsaWQodW5jaHVua2VkRGF0YSwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0ID0gKGluZGV4KSA9PiBnZXQodW5jaHVua2VkRGF0YSwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0ID0gKGluZGV4LCB2YWx1ZSkgPT4gc2V0KHVuY2h1bmtlZERhdGEsIGluZGV4LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleE9mID0gKGluZGV4KSA9PiBpbmRleE9mKHVuY2h1bmtlZERhdGEsIGluZGV4KTtcbiAgICAgICAgICAgICAgICB0aGlzLmdldEJ5dGVMZW5ndGggPSAoaW5kZXgpID0+IGJ5dGVMZW5ndGgodW5jaHVua2VkRGF0YSwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX29mZnNldHMgPSBbMCwgdW5jaHVua2VkRGF0YS5sZW5ndGhdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgdmVjdG9yUHJvdG90eXBlc0J5VHlwZUlkW3R5cGUudHlwZUlkXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb2Zmc2V0cyA9IGNvbXB1dGVDaHVua09mZnNldHMoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5zdHJpZGUgPSBzdHJpZGVGb3JUeXBlKHR5cGUpO1xuICAgICAgICB0aGlzLm51bUNoaWxkcmVuID0gKF9kID0gKF9jID0gdHlwZS5jaGlsZHJlbikgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmxlbmd0aCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLl9vZmZzZXRzW3RoaXMuX29mZnNldHMubGVuZ3RoIC0gMV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBhZ2dyZWdhdGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoaXMgVmVjdG9yJ3MgYnVmZmVycyBhbmQvb3IgY2hpbGQgVmVjdG9ycy5cbiAgICAgKi9cbiAgICBnZXQgYnl0ZUxlbmd0aCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2J5dGVMZW5ndGggPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLl9ieXRlTGVuZ3RoID0gdGhpcy5kYXRhLnJlZHVjZSgoYnl0ZUxlbmd0aCwgZGF0YSkgPT4gYnl0ZUxlbmd0aCArIGRhdGEuYnl0ZUxlbmd0aCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2J5dGVMZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbnVsbCBlbGVtZW50cyBpbiB0aGlzIFZlY3Rvci5cbiAgICAgKi9cbiAgICBnZXQgbnVsbENvdW50KCkge1xuICAgICAgICBpZiAodGhpcy5fbnVsbENvdW50ID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5fbnVsbENvdW50ID0gY29tcHV0ZUNodW5rTnVsbENvdW50cyh0aGlzLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9udWxsQ291bnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBBcnJheSBvciBUeXBlZEFyYXkgY29uc3RydWN0b3IgdXNlZCBmb3IgdGhlIEpTIHJlcHJlc2VudGF0aW9uXG4gICAgICogIG9mIHRoZSBlbGVtZW50J3MgdmFsdWVzIGluIHtAbGluayBWZWN0b3IucHJvdG90eXBlLnRvQXJyYXkgYHRvQXJyYXkoKWB9LlxuICAgICAqL1xuICAgIGdldCBBcnJheVR5cGUoKSB7IHJldHVybiB0aGlzLnR5cGUuQXJyYXlUeXBlOyB9XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgdGhhdCBzaG91bGQgYmUgcHJpbnRlZCB3aGVuIHRoZSBWZWN0b3IgaXMgbG9nZ2VkIGluIGEgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLlZlY3Rvck5hbWV9PCR7dGhpcy50eXBlW1N5bWJvbC50b1N0cmluZ1RhZ119PmA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgVmVjdG9yLlxuICAgICAqL1xuICAgIGdldCBWZWN0b3JOYW1lKCkgeyByZXR1cm4gYCR7VHlwZVt0aGlzLnR5cGUudHlwZUlkXX1WZWN0b3JgOyB9XG4gICAgLyoqXG4gICAgICogQ2hlY2sgd2hldGhlciBhbiBlbGVtZW50IGlzIG51bGwuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0byByZWFkIHRoZSB2YWxpZGl0eSBiaXRtYXAuXG4gICAgICovXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlzVmFsaWQoaW5kZXgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLyoqXG4gICAgICogR2V0IGFuIGVsZW1lbnQgdmFsdWUgYnkgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZWFkLlxuICAgICAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBnZXQoaW5kZXgpIHsgcmV0dXJuIG51bGw7IH1cbiAgICAvKipcbiAgICAgKiBTZXQgYW4gZWxlbWVudCB2YWx1ZSBieSBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBzZXQoaW5kZXgsIHZhbHVlKSB7IHJldHVybjsgfVxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhIHZhbHVlIGluIGFuIFZlY3Rvci5cbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgdmFsdWUgdG8gbG9jYXRlIGluIHRoZSBWZWN0b3IuXG4gICAgICogQHBhcmFtIG9mZnNldCBUaGUgaW5kZXggYXQgd2hpY2ggdG8gYmVnaW4gdGhlIHNlYXJjaC4gSWYgb2Zmc2V0IGlzIG9taXR0ZWQsIHRoZSBzZWFyY2ggc3RhcnRzIGF0IGluZGV4IDAuXG4gICAgICovXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGluZGV4T2YoZWxlbWVudCwgb2Zmc2V0KSB7IHJldHVybiAtMTsgfVxuICAgIGluY2x1ZGVzKGVsZW1lbnQsIG9mZnNldCkgeyByZXR1cm4gdGhpcy5pbmRleE9mKGVsZW1lbnQsIG9mZnNldCkgPiAwOyB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIGVsZW1lbnQgYnkgaW5kZXguXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0byBnZXQgdGhlIGJ5dGVMZW5ndGguXG4gICAgICovXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGdldEJ5dGVMZW5ndGgoaW5kZXgpIHsgcmV0dXJuIDA7IH1cbiAgICAvKipcbiAgICAgKiBJdGVyYXRvciBmb3IgdGhlIFZlY3RvcidzIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JWaXNpdG9yLnZpc2l0KHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21iaW5lcyB0d28gb3IgbW9yZSBWZWN0b3JzIG9mIHRoZSBzYW1lIHR5cGUuXG4gICAgICogQHBhcmFtIG90aGVycyBBZGRpdGlvbmFsIFZlY3RvcnMgdG8gYWRkIHRvIHRoZSBlbmQgb2YgdGhpcyBWZWN0b3IuXG4gICAgICovXG4gICAgY29uY2F0KC4uLm90aGVycykge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3Rvcih0aGlzLmRhdGEuY29uY2F0KG90aGVycy5mbGF0TWFwKCh4KSA9PiB4LmRhdGEpLmZsYXQoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSB6ZXJvLWNvcHkgc3ViLXNlY3Rpb24gb2YgdGhpcyBWZWN0b3IuXG4gICAgICogQHBhcmFtIHN0YXJ0IFRoZSBiZWdpbm5pbmcgb2YgdGhlIHNwZWNpZmllZCBwb3J0aW9uIG9mIHRoZSBWZWN0b3IuXG4gICAgICogQHBhcmFtIGVuZCBUaGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgcG9ydGlvbiBvZiB0aGUgVmVjdG9yLiBUaGlzIGlzIGV4Y2x1c2l2ZSBvZiB0aGUgZWxlbWVudCBhdCB0aGUgaW5kZXggJ2VuZCcuXG4gICAgICovXG4gICAgc2xpY2UoYmVnaW4sIGVuZCkge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcihjbGFtcFJhbmdlKHRoaXMsIGJlZ2luLCBlbmQsICh7IGRhdGEsIF9vZmZzZXRzIH0sIGJlZ2luLCBlbmQpID0+IHNsaWNlQ2h1bmtzKGRhdGEsIF9vZmZzZXRzLCBiZWdpbiwgZW5kKSkpO1xuICAgIH1cbiAgICB0b0pTT04oKSB7IHJldHVybiBbLi4udGhpc107IH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBKYXZhU2NyaXB0IEFycmF5IG9yIFR5cGVkQXJyYXkgb2YgdGhlIFZlY3RvcidzIGVsZW1lbnRzLlxuICAgICAqXG4gICAgICogQG5vdGUgSWYgdGhpcyBWZWN0b3IgY29udGFpbnMgYSBzaW5nbGUgRGF0YSBjaHVuayBhbmQgdGhlIFZlY3RvcidzIHR5cGUgaXMgYVxuICAgICAqICBwcmltaXRpdmUgbnVtZXJpYyB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZSBKYXZhU2NyaXB0IFR5cGVkQXJyYXlzLCB0aGlzXG4gICAgICogIG1ldGhvZCByZXR1cm5zIGEgemVyby1jb3B5IHNsaWNlIG9mIHRoZSB1bmRlcmx5aW5nIFR5cGVkQXJyYXkgdmFsdWVzLiBJZiB0aGVyZSdzXG4gICAgICogIG1vcmUgdGhhbiBvbmUgY2h1bmssIHRoZSByZXN1bHRpbmcgVHlwZWRBcnJheSB3aWxsIGJlIGEgY29weSBvZiB0aGUgZGF0YSBmcm9tIGVhY2hcbiAgICAgKiAgY2h1bmsncyB1bmRlcmx5aW5nIFR5cGVkQXJyYXkgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQW4gQXJyYXkgb3IgVHlwZWRBcnJheSBvZiB0aGUgVmVjdG9yJ3MgZWxlbWVudHMsIGJhc2VkIG9uIHRoZSBWZWN0b3IncyBEYXRhVHlwZS5cbiAgICAgKi9cbiAgICB0b0FycmF5KCkge1xuICAgICAgICBjb25zdCB7IHR5cGUsIGRhdGEsIGxlbmd0aCwgc3RyaWRlLCBBcnJheVR5cGUgfSA9IHRoaXM7XG4gICAgICAgIC8vIEZhc3QgY2FzZSwgcmV0dXJuIHN1YmFycmF5IGlmIHBvc3NpYmxlXG4gICAgICAgIHN3aXRjaCAodHlwZS50eXBlSWQpIHtcbiAgICAgICAgICAgIGNhc2UgVHlwZS5JbnQ6XG4gICAgICAgICAgICBjYXNlIFR5cGUuRmxvYXQ6XG4gICAgICAgICAgICBjYXNlIFR5cGUuRGVjaW1hbDpcbiAgICAgICAgICAgIGNhc2UgVHlwZS5UaW1lOlxuICAgICAgICAgICAgY2FzZSBUeXBlLlRpbWVzdGFtcDpcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBBcnJheVR5cGUoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gZGF0YVswXS52YWx1ZXMuc3ViYXJyYXkoMCwgbGVuZ3RoICogc3RyaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGRhdGEucmVkdWNlKChtZW1vLCB7IHZhbHVlcyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZW1vLmFycmF5LnNldCh2YWx1ZXMsIG1lbW8ub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW8ub2Zmc2V0ICs9IHZhbHVlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVtbztcbiAgICAgICAgICAgICAgICAgICAgfSwgeyBhcnJheTogbmV3IEFycmF5VHlwZShsZW5ndGggKiBzdHJpZGUpLCBvZmZzZXQ6IDAgfSkuYXJyYXk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSBpZiBub3QgcHJpbWl0aXZlLCBzbG93IGNvcHlcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgVmVjdG9yLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFZlY3Rvci5cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGBbJHtbLi4udGhpc10uam9pbignLCcpfV1gO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY2hpbGQgVmVjdG9yIGJ5IG5hbWUsIG9yIG51bGwgaWYgdGhpcyBWZWN0b3IgaGFzIG5vIGNoaWxkIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNoaWxkIHRvIHJldHJpZXZlLlxuICAgICAqL1xuICAgIGdldENoaWxkKG5hbWUpIHtcbiAgICAgICAgdmFyIF9iO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRDaGlsZEF0KChfYiA9IHRoaXMudHlwZS5jaGlsZHJlbikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmZpbmRJbmRleCgoZikgPT4gZi5uYW1lID09PSBuYW1lKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjaGlsZCBWZWN0b3IgYnkgaW5kZXgsIG9yIG51bGwgaWYgdGhpcyBWZWN0b3IgaGFzIG5vIGNoaWxkIGF0IHRoZSBzdXBwbGllZCBpbmRleC5cbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byByZXRyaWV2ZS5cbiAgICAgKi9cbiAgICBnZXRDaGlsZEF0KGluZGV4KSB7XG4gICAgICAgIGlmIChpbmRleCA+IC0xICYmIGluZGV4IDwgdGhpcy5udW1DaGlsZHJlbikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IodGhpcy5kYXRhLm1hcCgoeyBjaGlsZHJlbiB9KSA9PiBjaGlsZHJlbltpbmRleF0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZ2V0IGlzTWVtb2l6ZWQoKSB7XG4gICAgICAgIGlmIChEYXRhVHlwZS5pc0RpY3Rpb25hcnkodGhpcy50eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVswXS5kaWN0aW9uYXJ5LmlzTWVtb2l6ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIG1lbW9pemF0aW9uIHRvIHRoZSBWZWN0b3IncyB7QGxpbmsgZ2V0fSBtZXRob2QuIEZvciBkaWN0aW9uYXJ5XG4gICAgICogdmVjdG9ycywgdGhpcyBtZXRob2QgcmV0dXJuIGEgdmVjdG9yIHRoYXQgbWVtb2l6ZXMgb25seSB0aGUgZGljdGlvbmFyeVxuICAgICAqIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIE1lbW9pemF0aW9uIGlzIHZlcnkgdXNlZnVsIHdoZW4gZGVjb2RpbmcgYSB2YWx1ZSBpcyBleHBlbnNpdmUgc3VjaCBhc1xuICAgICAqIFVmdDguIFRoZSBtZW1vaXphdGlvbiBjcmVhdGVzIGEgY2FjaGUgb2YgdGhlIHNpemUgb2YgdGhlIFZlY3RvciBhbmRcbiAgICAgKiB0aGVyZm9yZSBpbmNyZWFzZXMgbWVtb3J5IHVzYWdlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBuZXcgdmVjdG9yIHRoYXQgbWVtb2l6ZXMgY2FsbHMgdG8ge0BsaW5rIGdldH0uXG4gICAgICovXG4gICAgbWVtb2l6ZSgpIHtcbiAgICAgICAgaWYgKERhdGFUeXBlLmlzRGljdGlvbmFyeSh0aGlzLnR5cGUpKSB7XG4gICAgICAgICAgICBjb25zdCBkaWN0aW9uYXJ5ID0gbmV3IE1lbW9pemVkVmVjdG9yKHRoaXMuZGF0YVswXS5kaWN0aW9uYXJ5KTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGEgPSB0aGlzLmRhdGEubWFwKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xvbmVkID0gZGF0YS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIGNsb25lZC5kaWN0aW9uYXJ5ID0gZGljdGlvbmFyeTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xvbmVkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFZlY3RvcihuZXdEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE1lbW9pemVkVmVjdG9yKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgdmVjdG9yIHdpdGhvdXQgbWVtb2l6YXRpb24gb2YgdGhlIHtAbGluayBnZXR9IG1ldGhvZC4gSWYgdGhpc1xuICAgICAqIHZlY3RvciBpcyBub3QgbWVtb2l6ZWQsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhpcyB2ZWN0b3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIGEgdmVjdG9yIHdpdGhvdXQgbWVtb2l6YXRpb24uXG4gICAgICovXG4gICAgdW5tZW1vaXplKCkge1xuICAgICAgICBpZiAoRGF0YVR5cGUuaXNEaWN0aW9uYXJ5KHRoaXMudHlwZSkgJiYgdGhpcy5pc01lbW9pemVkKSB7XG4gICAgICAgICAgICBjb25zdCBkaWN0aW9uYXJ5ID0gdGhpcy5kYXRhWzBdLmRpY3Rpb25hcnkudW5tZW1vaXplKCk7XG4gICAgICAgICAgICBjb25zdCBuZXdEYXRhID0gdGhpcy5kYXRhLm1hcCgoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0RhdGEgPSBkYXRhLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgbmV3RGF0YS5kaWN0aW9uYXJ5ID0gZGljdGlvbmFyeTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3RGF0YTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IobmV3RGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuX2EgPSBTeW1ib2wudG9TdHJpbmdUYWc7XG4vLyBJbml0aWFsaXplIHRoaXMgc3RhdGljIHByb3BlcnR5IHZpYSBhbiBJSUZFIHNvIGJ1bmRsZXJzIGRvbid0IHRyZWUtc2hha2Vcbi8vIG91dCB0aGlzIGxvZ2ljLCBidXQgYWxzbyBzbyB3ZSdyZSBzdGlsbCBjb21wbGlhbnQgd2l0aCBgXCJzaWRlRWZmZWN0c1wiOiBmYWxzZWBcblZlY3RvcltfYV0gPSAoKHByb3RvKSA9PiB7XG4gICAgcHJvdG8udHlwZSA9IERhdGFUeXBlLnByb3RvdHlwZTtcbiAgICBwcm90by5kYXRhID0gW107XG4gICAgcHJvdG8ubGVuZ3RoID0gMDtcbiAgICBwcm90by5zdHJpZGUgPSAxO1xuICAgIHByb3RvLm51bUNoaWxkcmVuID0gMDtcbiAgICBwcm90by5fbnVsbENvdW50ID0gLTE7XG4gICAgcHJvdG8uX2J5dGVMZW5ndGggPSAtMTtcbiAgICBwcm90by5fb2Zmc2V0cyA9IG5ldyBVaW50MzJBcnJheShbMF0pO1xuICAgIHByb3RvW1N5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGVdID0gdHJ1ZTtcbiAgICBjb25zdCB0eXBlSWRzID0gT2JqZWN0LmtleXMoVHlwZSlcbiAgICAgICAgLm1hcCgoVCkgPT4gVHlwZVtUXSlcbiAgICAgICAgLmZpbHRlcigoVCkgPT4gdHlwZW9mIFQgPT09ICdudW1iZXInICYmIFQgIT09IFR5cGUuTk9ORSk7XG4gICAgZm9yIChjb25zdCB0eXBlSWQgb2YgdHlwZUlkcykge1xuICAgICAgICBjb25zdCBnZXQgPSBnZXRWaXNpdG9yLmdldFZpc2l0Rm5CeVR5cGVJZCh0eXBlSWQpO1xuICAgICAgICBjb25zdCBzZXQgPSBzZXRWaXNpdG9yLmdldFZpc2l0Rm5CeVR5cGVJZCh0eXBlSWQpO1xuICAgICAgICBjb25zdCBpbmRleE9mID0gaW5kZXhPZlZpc2l0b3IuZ2V0VmlzaXRGbkJ5VHlwZUlkKHR5cGVJZCk7XG4gICAgICAgIGNvbnN0IGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoVmlzaXRvci5nZXRWaXNpdEZuQnlUeXBlSWQodHlwZUlkKTtcbiAgICAgICAgdmlzaXRvcnNCeVR5cGVJZFt0eXBlSWRdID0geyBnZXQsIHNldCwgaW5kZXhPZiwgYnl0ZUxlbmd0aCB9O1xuICAgICAgICB2ZWN0b3JQcm90b3R5cGVzQnlUeXBlSWRbdHlwZUlkXSA9IE9iamVjdC5jcmVhdGUocHJvdG8sIHtcbiAgICAgICAgICAgIFsnaXNWYWxpZCddOiB7IHZhbHVlOiB3cmFwQ2h1bmtlZENhbGwxKGlzQ2h1bmtlZFZhbGlkKSB9LFxuICAgICAgICAgICAgWydnZXQnXTogeyB2YWx1ZTogd3JhcENodW5rZWRDYWxsMShnZXRWaXNpdG9yLmdldFZpc2l0Rm5CeVR5cGVJZCh0eXBlSWQpKSB9LFxuICAgICAgICAgICAgWydzZXQnXTogeyB2YWx1ZTogd3JhcENodW5rZWRDYWxsMihzZXRWaXNpdG9yLmdldFZpc2l0Rm5CeVR5cGVJZCh0eXBlSWQpKSB9LFxuICAgICAgICAgICAgWydpbmRleE9mJ106IHsgdmFsdWU6IHdyYXBDaHVua2VkSW5kZXhPZihpbmRleE9mVmlzaXRvci5nZXRWaXNpdEZuQnlUeXBlSWQodHlwZUlkKSkgfSxcbiAgICAgICAgICAgIFsnZ2V0Qnl0ZUxlbmd0aCddOiB7IHZhbHVlOiB3cmFwQ2h1bmtlZENhbGwxKGJ5dGVMZW5ndGhWaXNpdG9yLmdldFZpc2l0Rm5CeVR5cGVJZCh0eXBlSWQpKSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuICdWZWN0b3InO1xufSkoVmVjdG9yLnByb3RvdHlwZSk7XG5jbGFzcyBNZW1vaXplZFZlY3RvciBleHRlbmRzIFZlY3RvciB7XG4gICAgY29uc3RydWN0b3IodmVjdG9yKSB7XG4gICAgICAgIHN1cGVyKHZlY3Rvci5kYXRhKTtcbiAgICAgICAgY29uc3QgZ2V0ID0gdGhpcy5nZXQ7XG4gICAgICAgIGNvbnN0IHNldCA9IHRoaXMuc2V0O1xuICAgICAgICBjb25zdCBzbGljZSA9IHRoaXMuc2xpY2U7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdnZXQnLCB7XG4gICAgICAgICAgICB2YWx1ZShpbmRleCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlZFZhbHVlID0gY2FjaGVbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChjYWNoZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXQuY2FsbCh0aGlzLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgY2FjaGVbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdzZXQnLCB7XG4gICAgICAgICAgICB2YWx1ZShpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzZXQuY2FsbCh0aGlzLCBpbmRleCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGNhY2hlW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdzbGljZScsIHtcbiAgICAgICAgICAgIHZhbHVlOiAoYmVnaW4sIGVuZCkgPT4gbmV3IE1lbW9pemVkVmVjdG9yKHNsaWNlLmNhbGwodGhpcywgYmVnaW4sIGVuZCkpXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2lzTWVtb2l6ZWQnLCB7IHZhbHVlOiB0cnVlIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3VubWVtb2l6ZScsIHtcbiAgICAgICAgICAgIHZhbHVlOiAoKSA9PiBuZXcgVmVjdG9yKHRoaXMuZGF0YSlcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbWVtb2l6ZScsIHtcbiAgICAgICAgICAgIHZhbHVlOiAoKSA9PiB0aGlzXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmltcG9ydCAqIGFzIGR0eXBlcyBmcm9tICcuL3R5cGUubWpzJztcbmV4cG9ydCBmdW5jdGlvbiBtYWtlVmVjdG9yKGluaXQpIHtcbiAgICBpZiAoaW5pdCkge1xuICAgICAgICBpZiAoaW5pdCBpbnN0YW5jZW9mIERhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yKFtpbml0XSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluaXQgaW5zdGFuY2VvZiBWZWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yKGluaXQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluaXQudHlwZSBpbnN0YW5jZW9mIERhdGFUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFZlY3RvcihbbWFrZURhdGEoaW5pdCldKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpbml0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IoaW5pdC5mbGF0TWFwKHYgPT4gdW53cmFwSW5wdXRzKHYpKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhpbml0KSkge1xuICAgICAgICAgICAgaWYgKGluaXQgaW5zdGFuY2VvZiBEYXRhVmlldykge1xuICAgICAgICAgICAgICAgIGluaXQgPSBuZXcgVWludDhBcnJheShpbml0LmJ1ZmZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IHsgb2Zmc2V0OiAwLCBsZW5ndGg6IGluaXQubGVuZ3RoLCBudWxsQ291bnQ6IDAsIGRhdGE6IGluaXQgfTtcbiAgICAgICAgICAgIGlmIChpbml0IGluc3RhbmNlb2YgSW50OEFycmF5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IoW21ha2VEYXRhKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMpLCB7IHR5cGU6IG5ldyBkdHlwZXMuSW50OCB9KSldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbml0IGluc3RhbmNlb2YgSW50MTZBcnJheSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yKFttYWtlRGF0YShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByb3BzKSwgeyB0eXBlOiBuZXcgZHR5cGVzLkludDE2IH0pKV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGluaXQgaW5zdGFuY2VvZiBJbnQzMkFycmF5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IoW21ha2VEYXRhKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMpLCB7IHR5cGU6IG5ldyBkdHlwZXMuSW50MzIgfSkpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5pdCBpbnN0YW5jZW9mIEJpZ0ludDY0QXJyYXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFZlY3RvcihbbWFrZURhdGEoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcm9wcyksIHsgdHlwZTogbmV3IGR0eXBlcy5JbnQ2NCB9KSldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbml0IGluc3RhbmNlb2YgVWludDhBcnJheSB8fCBpbml0IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFZlY3RvcihbbWFrZURhdGEoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcm9wcyksIHsgdHlwZTogbmV3IGR0eXBlcy5VaW50OCB9KSldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbml0IGluc3RhbmNlb2YgVWludDE2QXJyYXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFZlY3RvcihbbWFrZURhdGEoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcm9wcyksIHsgdHlwZTogbmV3IGR0eXBlcy5VaW50MTYgfSkpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5pdCBpbnN0YW5jZW9mIFVpbnQzMkFycmF5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IoW21ha2VEYXRhKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMpLCB7IHR5cGU6IG5ldyBkdHlwZXMuVWludDMyIH0pKV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGluaXQgaW5zdGFuY2VvZiBCaWdVaW50NjRBcnJheSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yKFttYWtlRGF0YShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByb3BzKSwgeyB0eXBlOiBuZXcgZHR5cGVzLlVpbnQ2NCB9KSldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbml0IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IoW21ha2VEYXRhKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMpLCB7IHR5cGU6IG5ldyBkdHlwZXMuRmxvYXQzMiB9KSldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbml0IGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IoW21ha2VEYXRhKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMpLCB7IHR5cGU6IG5ldyBkdHlwZXMuRmxvYXQ2NCB9KSldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5yZWNvZ25pemVkIGlucHV0Jyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnJlY29nbml6ZWQgaW5wdXQnKTtcbn1cbmZ1bmN0aW9uIHVud3JhcElucHV0cyh4KSB7XG4gICAgcmV0dXJuIHggaW5zdGFuY2VvZiBEYXRhID8gW3hdIDogKHggaW5zdGFuY2VvZiBWZWN0b3IgPyB4LmRhdGEgOiBtYWtlVmVjdG9yKHgpLmRhdGEpO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD12ZWN0b3IubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBUeXBlLCBQcmVjaXNpb24sIERhdGVVbml0LCBUaW1lVW5pdCwgSW50ZXJ2YWxVbml0LCBVbmlvbk1vZGUgfSBmcm9tICcuL2VudW0ubWpzJztcbmltcG9ydCB7IERhdGFUeXBlLCB9IGZyb20gJy4vdHlwZS5tanMnO1xuZXhwb3J0IGNsYXNzIFZpc2l0b3Ige1xuICAgIHZpc2l0TWFueShub2RlcywgLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbm9kZXMubWFwKChub2RlLCBpKSA9PiB0aGlzLnZpc2l0KG5vZGUsIC4uLmFyZ3MubWFwKCh4KSA9PiB4W2ldKSkpO1xuICAgIH1cbiAgICB2aXNpdCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFZpc2l0Rm4oYXJnc1swXSwgZmFsc2UpLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgICBnZXRWaXNpdEZuKG5vZGUsIHRocm93SWZOb3RGb3VuZCA9IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIGdldFZpc2l0Rm4odGhpcywgbm9kZSwgdGhyb3dJZk5vdEZvdW5kKTtcbiAgICB9XG4gICAgZ2V0VmlzaXRGbkJ5VHlwZUlkKHR5cGVJZCwgdGhyb3dJZk5vdEZvdW5kID0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gZ2V0VmlzaXRGbkJ5VHlwZUlkKHRoaXMsIHR5cGVJZCwgdGhyb3dJZk5vdEZvdW5kKTtcbiAgICB9XG4gICAgdmlzaXROdWxsKF9ub2RlLCAuLi5fYXJncykgeyByZXR1cm4gbnVsbDsgfVxuICAgIHZpc2l0Qm9vbChfbm9kZSwgLi4uX2FyZ3MpIHsgcmV0dXJuIG51bGw7IH1cbiAgICB2aXNpdEludChfbm9kZSwgLi4uX2FyZ3MpIHsgcmV0dXJuIG51bGw7IH1cbiAgICB2aXNpdEZsb2F0KF9ub2RlLCAuLi5fYXJncykgeyByZXR1cm4gbnVsbDsgfVxuICAgIHZpc2l0VXRmOChfbm9kZSwgLi4uX2FyZ3MpIHsgcmV0dXJuIG51bGw7IH1cbiAgICB2aXNpdEJpbmFyeShfbm9kZSwgLi4uX2FyZ3MpIHsgcmV0dXJuIG51bGw7IH1cbiAgICB2aXNpdEZpeGVkU2l6ZUJpbmFyeShfbm9kZSwgLi4uX2FyZ3MpIHsgcmV0dXJuIG51bGw7IH1cbiAgICB2aXNpdERhdGUoX25vZGUsIC4uLl9hcmdzKSB7IHJldHVybiBudWxsOyB9XG4gICAgdmlzaXRUaW1lc3RhbXAoX25vZGUsIC4uLl9hcmdzKSB7IHJldHVybiBudWxsOyB9XG4gICAgdmlzaXRUaW1lKF9ub2RlLCAuLi5fYXJncykgeyByZXR1cm4gbnVsbDsgfVxuICAgIHZpc2l0RGVjaW1hbChfbm9kZSwgLi4uX2FyZ3MpIHsgcmV0dXJuIG51bGw7IH1cbiAgICB2aXNpdExpc3QoX25vZGUsIC4uLl9hcmdzKSB7IHJldHVybiBudWxsOyB9XG4gICAgdmlzaXRTdHJ1Y3QoX25vZGUsIC4uLl9hcmdzKSB7IHJldHVybiBudWxsOyB9XG4gICAgdmlzaXRVbmlvbihfbm9kZSwgLi4uX2FyZ3MpIHsgcmV0dXJuIG51bGw7IH1cbiAgICB2aXNpdERpY3Rpb25hcnkoX25vZGUsIC4uLl9hcmdzKSB7IHJldHVybiBudWxsOyB9XG4gICAgdmlzaXRJbnRlcnZhbChfbm9kZSwgLi4uX2FyZ3MpIHsgcmV0dXJuIG51bGw7IH1cbiAgICB2aXNpdEZpeGVkU2l6ZUxpc3QoX25vZGUsIC4uLl9hcmdzKSB7IHJldHVybiBudWxsOyB9XG4gICAgdmlzaXRNYXAoX25vZGUsIC4uLl9hcmdzKSB7IHJldHVybiBudWxsOyB9XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gZ2V0VmlzaXRGbih2aXNpdG9yLCBub2RlLCB0aHJvd0lmTm90Rm91bmQgPSB0cnVlKSB7XG4gICAgaWYgKHR5cGVvZiBub2RlID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gZ2V0VmlzaXRGbkJ5VHlwZUlkKHZpc2l0b3IsIG5vZGUsIHRocm93SWZOb3RGb3VuZCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygbm9kZSA9PT0gJ3N0cmluZycgJiYgKG5vZGUgaW4gVHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGdldFZpc2l0Rm5CeVR5cGVJZCh2aXNpdG9yLCBUeXBlW25vZGVdLCB0aHJvd0lmTm90Rm91bmQpO1xuICAgIH1cbiAgICBpZiAobm9kZSAmJiAobm9kZSBpbnN0YW5jZW9mIERhdGFUeXBlKSkge1xuICAgICAgICByZXR1cm4gZ2V0VmlzaXRGbkJ5VHlwZUlkKHZpc2l0b3IsIGluZmVyRFR5cGUobm9kZSksIHRocm93SWZOb3RGb3VuZCk7XG4gICAgfVxuICAgIGlmICgobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBub2RlLnR5cGUpICYmIChub2RlLnR5cGUgaW5zdGFuY2VvZiBEYXRhVHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGdldFZpc2l0Rm5CeVR5cGVJZCh2aXNpdG9yLCBpbmZlckRUeXBlKG5vZGUudHlwZSksIHRocm93SWZOb3RGb3VuZCk7XG4gICAgfVxuICAgIHJldHVybiBnZXRWaXNpdEZuQnlUeXBlSWQodmlzaXRvciwgVHlwZS5OT05FLCB0aHJvd0lmTm90Rm91bmQpO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGdldFZpc2l0Rm5CeVR5cGVJZCh2aXNpdG9yLCBkdHlwZSwgdGhyb3dJZk5vdEZvdW5kID0gdHJ1ZSkge1xuICAgIGxldCBmbiA9IG51bGw7XG4gICAgc3dpdGNoIChkdHlwZSkge1xuICAgICAgICBjYXNlIFR5cGUuTnVsbDpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdE51bGw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLkJvb2w6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRCb29sO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5JbnQ6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRJbnQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLkludDg6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRJbnQ4IHx8IHZpc2l0b3IudmlzaXRJbnQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLkludDE2OlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0SW50MTYgfHwgdmlzaXRvci52aXNpdEludDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuSW50MzI6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRJbnQzMiB8fCB2aXNpdG9yLnZpc2l0SW50O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5JbnQ2NDpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdEludDY0IHx8IHZpc2l0b3IudmlzaXRJbnQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLlVpbnQ4OlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0VWludDggfHwgdmlzaXRvci52aXNpdEludDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuVWludDE2OlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0VWludDE2IHx8IHZpc2l0b3IudmlzaXRJbnQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLlVpbnQzMjpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdFVpbnQzMiB8fCB2aXNpdG9yLnZpc2l0SW50O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5VaW50NjQ6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRVaW50NjQgfHwgdmlzaXRvci52aXNpdEludDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuRmxvYXQ6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRGbG9hdDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuRmxvYXQxNjpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdEZsb2F0MTYgfHwgdmlzaXRvci52aXNpdEZsb2F0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5GbG9hdDMyOlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0RmxvYXQzMiB8fCB2aXNpdG9yLnZpc2l0RmxvYXQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLkZsb2F0NjQ6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRGbG9hdDY0IHx8IHZpc2l0b3IudmlzaXRGbG9hdDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuVXRmODpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdFV0Zjg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLkJpbmFyeTpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdEJpbmFyeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuRml4ZWRTaXplQmluYXJ5OlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0Rml4ZWRTaXplQmluYXJ5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5EYXRlOlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0RGF0ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuRGF0ZURheTpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdERhdGVEYXkgfHwgdmlzaXRvci52aXNpdERhdGU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLkRhdGVNaWxsaXNlY29uZDpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdERhdGVNaWxsaXNlY29uZCB8fCB2aXNpdG9yLnZpc2l0RGF0ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuVGltZXN0YW1wOlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0VGltZXN0YW1wO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5UaW1lc3RhbXBTZWNvbmQ6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRUaW1lc3RhbXBTZWNvbmQgfHwgdmlzaXRvci52aXNpdFRpbWVzdGFtcDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuVGltZXN0YW1wTWlsbGlzZWNvbmQ6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRUaW1lc3RhbXBNaWxsaXNlY29uZCB8fCB2aXNpdG9yLnZpc2l0VGltZXN0YW1wO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5UaW1lc3RhbXBNaWNyb3NlY29uZDpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdFRpbWVzdGFtcE1pY3Jvc2Vjb25kIHx8IHZpc2l0b3IudmlzaXRUaW1lc3RhbXA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLlRpbWVzdGFtcE5hbm9zZWNvbmQ6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRUaW1lc3RhbXBOYW5vc2Vjb25kIHx8IHZpc2l0b3IudmlzaXRUaW1lc3RhbXA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLlRpbWU6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRUaW1lO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5UaW1lU2Vjb25kOlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0VGltZVNlY29uZCB8fCB2aXNpdG9yLnZpc2l0VGltZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuVGltZU1pbGxpc2Vjb25kOlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0VGltZU1pbGxpc2Vjb25kIHx8IHZpc2l0b3IudmlzaXRUaW1lO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5UaW1lTWljcm9zZWNvbmQ6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRUaW1lTWljcm9zZWNvbmQgfHwgdmlzaXRvci52aXNpdFRpbWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLlRpbWVOYW5vc2Vjb25kOlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0VGltZU5hbm9zZWNvbmQgfHwgdmlzaXRvci52aXNpdFRpbWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLkRlY2ltYWw6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXREZWNpbWFsO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5MaXN0OlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0TGlzdDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuU3RydWN0OlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0U3RydWN0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5VbmlvbjpcbiAgICAgICAgICAgIGZuID0gdmlzaXRvci52aXNpdFVuaW9uO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5EZW5zZVVuaW9uOlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0RGVuc2VVbmlvbiB8fCB2aXNpdG9yLnZpc2l0VW5pb247XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLlNwYXJzZVVuaW9uOlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0U3BhcnNlVW5pb24gfHwgdmlzaXRvci52aXNpdFVuaW9uO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5EaWN0aW9uYXJ5OlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0RGljdGlvbmFyeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuSW50ZXJ2YWw6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRJbnRlcnZhbDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuSW50ZXJ2YWxEYXlUaW1lOlxuICAgICAgICAgICAgZm4gPSB2aXNpdG9yLnZpc2l0SW50ZXJ2YWxEYXlUaW1lIHx8IHZpc2l0b3IudmlzaXRJbnRlcnZhbDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFR5cGUuSW50ZXJ2YWxZZWFyTW9udGg6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRJbnRlcnZhbFllYXJNb250aCB8fCB2aXNpdG9yLnZpc2l0SW50ZXJ2YWw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUeXBlLkZpeGVkU2l6ZUxpc3Q6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRGaXhlZFNpemVMaXN0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHlwZS5NYXA6XG4gICAgICAgICAgICBmbiA9IHZpc2l0b3IudmlzaXRNYXA7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgcmV0dXJuIGZuO1xuICAgIGlmICghdGhyb3dJZk5vdEZvdW5kKVxuICAgICAgICByZXR1cm4gKCkgPT4gbnVsbDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCB0eXBlICcke1R5cGVbZHR5cGVdfSdgKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBpbmZlckRUeXBlKHR5cGUpIHtcbiAgICBzd2l0Y2ggKHR5cGUudHlwZUlkKSB7XG4gICAgICAgIGNhc2UgVHlwZS5OdWxsOiByZXR1cm4gVHlwZS5OdWxsO1xuICAgICAgICBjYXNlIFR5cGUuSW50OiB7XG4gICAgICAgICAgICBjb25zdCB7IGJpdFdpZHRoLCBpc1NpZ25lZCB9ID0gdHlwZTtcbiAgICAgICAgICAgIHN3aXRjaCAoYml0V2lkdGgpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBpc1NpZ25lZCA/IFR5cGUuSW50OCA6IFR5cGUuVWludDg7XG4gICAgICAgICAgICAgICAgY2FzZSAxNjogcmV0dXJuIGlzU2lnbmVkID8gVHlwZS5JbnQxNiA6IFR5cGUuVWludDE2O1xuICAgICAgICAgICAgICAgIGNhc2UgMzI6IHJldHVybiBpc1NpZ25lZCA/IFR5cGUuSW50MzIgOiBUeXBlLlVpbnQzMjtcbiAgICAgICAgICAgICAgICBjYXNlIDY0OiByZXR1cm4gaXNTaWduZWQgPyBUeXBlLkludDY0IDogVHlwZS5VaW50NjQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICByZXR1cm4gVHlwZS5JbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBUeXBlLkZsb2F0OlxuICAgICAgICAgICAgc3dpdGNoICh0eXBlLnByZWNpc2lvbikge1xuICAgICAgICAgICAgICAgIGNhc2UgUHJlY2lzaW9uLkhBTEY6IHJldHVybiBUeXBlLkZsb2F0MTY7XG4gICAgICAgICAgICAgICAgY2FzZSBQcmVjaXNpb24uU0lOR0xFOiByZXR1cm4gVHlwZS5GbG9hdDMyO1xuICAgICAgICAgICAgICAgIGNhc2UgUHJlY2lzaW9uLkRPVUJMRTogcmV0dXJuIFR5cGUuRmxvYXQ2NDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHJldHVybiBUeXBlLkZsb2F0O1xuICAgICAgICBjYXNlIFR5cGUuQmluYXJ5OiByZXR1cm4gVHlwZS5CaW5hcnk7XG4gICAgICAgIGNhc2UgVHlwZS5VdGY4OiByZXR1cm4gVHlwZS5VdGY4O1xuICAgICAgICBjYXNlIFR5cGUuQm9vbDogcmV0dXJuIFR5cGUuQm9vbDtcbiAgICAgICAgY2FzZSBUeXBlLkRlY2ltYWw6IHJldHVybiBUeXBlLkRlY2ltYWw7XG4gICAgICAgIGNhc2UgVHlwZS5UaW1lOlxuICAgICAgICAgICAgc3dpdGNoICh0eXBlLnVuaXQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFRpbWVVbml0LlNFQ09ORDogcmV0dXJuIFR5cGUuVGltZVNlY29uZDtcbiAgICAgICAgICAgICAgICBjYXNlIFRpbWVVbml0Lk1JTExJU0VDT05EOiByZXR1cm4gVHlwZS5UaW1lTWlsbGlzZWNvbmQ7XG4gICAgICAgICAgICAgICAgY2FzZSBUaW1lVW5pdC5NSUNST1NFQ09ORDogcmV0dXJuIFR5cGUuVGltZU1pY3Jvc2Vjb25kO1xuICAgICAgICAgICAgICAgIGNhc2UgVGltZVVuaXQuTkFOT1NFQ09ORDogcmV0dXJuIFR5cGUuVGltZU5hbm9zZWNvbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICByZXR1cm4gVHlwZS5UaW1lO1xuICAgICAgICBjYXNlIFR5cGUuVGltZXN0YW1wOlxuICAgICAgICAgICAgc3dpdGNoICh0eXBlLnVuaXQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFRpbWVVbml0LlNFQ09ORDogcmV0dXJuIFR5cGUuVGltZXN0YW1wU2Vjb25kO1xuICAgICAgICAgICAgICAgIGNhc2UgVGltZVVuaXQuTUlMTElTRUNPTkQ6IHJldHVybiBUeXBlLlRpbWVzdGFtcE1pbGxpc2Vjb25kO1xuICAgICAgICAgICAgICAgIGNhc2UgVGltZVVuaXQuTUlDUk9TRUNPTkQ6IHJldHVybiBUeXBlLlRpbWVzdGFtcE1pY3Jvc2Vjb25kO1xuICAgICAgICAgICAgICAgIGNhc2UgVGltZVVuaXQuTkFOT1NFQ09ORDogcmV0dXJuIFR5cGUuVGltZXN0YW1wTmFub3NlY29uZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHJldHVybiBUeXBlLlRpbWVzdGFtcDtcbiAgICAgICAgY2FzZSBUeXBlLkRhdGU6XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUudW5pdCkge1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0ZVVuaXQuREFZOiByZXR1cm4gVHlwZS5EYXRlRGF5O1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0ZVVuaXQuTUlMTElTRUNPTkQ6IHJldHVybiBUeXBlLkRhdGVNaWxsaXNlY29uZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHJldHVybiBUeXBlLkRhdGU7XG4gICAgICAgIGNhc2UgVHlwZS5JbnRlcnZhbDpcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZS51bml0KSB7XG4gICAgICAgICAgICAgICAgY2FzZSBJbnRlcnZhbFVuaXQuREFZX1RJTUU6IHJldHVybiBUeXBlLkludGVydmFsRGF5VGltZTtcbiAgICAgICAgICAgICAgICBjYXNlIEludGVydmFsVW5pdC5ZRUFSX01PTlRIOiByZXR1cm4gVHlwZS5JbnRlcnZhbFllYXJNb250aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHJldHVybiBUeXBlLkludGVydmFsO1xuICAgICAgICBjYXNlIFR5cGUuTWFwOiByZXR1cm4gVHlwZS5NYXA7XG4gICAgICAgIGNhc2UgVHlwZS5MaXN0OiByZXR1cm4gVHlwZS5MaXN0O1xuICAgICAgICBjYXNlIFR5cGUuU3RydWN0OiByZXR1cm4gVHlwZS5TdHJ1Y3Q7XG4gICAgICAgIGNhc2UgVHlwZS5VbmlvbjpcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZS5tb2RlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBVbmlvbk1vZGUuRGVuc2U6IHJldHVybiBUeXBlLkRlbnNlVW5pb247XG4gICAgICAgICAgICAgICAgY2FzZSBVbmlvbk1vZGUuU3BhcnNlOiByZXR1cm4gVHlwZS5TcGFyc2VVbmlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHJldHVybiBUeXBlLlVuaW9uO1xuICAgICAgICBjYXNlIFR5cGUuRml4ZWRTaXplQmluYXJ5OiByZXR1cm4gVHlwZS5GaXhlZFNpemVCaW5hcnk7XG4gICAgICAgIGNhc2UgVHlwZS5GaXhlZFNpemVMaXN0OiByZXR1cm4gVHlwZS5GaXhlZFNpemVMaXN0O1xuICAgICAgICBjYXNlIFR5cGUuRGljdGlvbmFyeTogcmV0dXJuIFR5cGUuRGljdGlvbmFyeTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgdHlwZSAnJHtUeXBlW3R5cGUudHlwZUlkXX0nYCk7XG59XG4vLyBBZGQgdGhlc2UgaGVyZSBzbyB0aGV5J3JlIHBpY2tlZCB1cCBieSB0aGUgZXh0ZXJucyBjcmVhdG9yXG4vLyBpbiB0aGUgYnVpbGQsIGFuZCBjbG9zdXJlLWNvbXBpbGVyIGRvZXNuJ3QgbWluaWZ5IHRoZW0gYXdheVxuVmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnQ4ID0gbnVsbDtcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50MTYgPSBudWxsO1xuVmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnQzMiA9IG51bGw7XG5WaXNpdG9yLnByb3RvdHlwZS52aXNpdEludDY0ID0gbnVsbDtcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0VWludDggPSBudWxsO1xuVmlzaXRvci5wcm90b3R5cGUudmlzaXRVaW50MTYgPSBudWxsO1xuVmlzaXRvci5wcm90b3R5cGUudmlzaXRVaW50MzIgPSBudWxsO1xuVmlzaXRvci5wcm90b3R5cGUudmlzaXRVaW50NjQgPSBudWxsO1xuVmlzaXRvci5wcm90b3R5cGUudmlzaXRGbG9hdDE2ID0gbnVsbDtcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0RmxvYXQzMiA9IG51bGw7XG5WaXNpdG9yLnByb3RvdHlwZS52aXNpdEZsb2F0NjQgPSBudWxsO1xuVmlzaXRvci5wcm90b3R5cGUudmlzaXREYXRlRGF5ID0gbnVsbDtcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGF0ZU1pbGxpc2Vjb25kID0gbnVsbDtcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wU2Vjb25kID0gbnVsbDtcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wTWlsbGlzZWNvbmQgPSBudWxsO1xuVmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBNaWNyb3NlY29uZCA9IG51bGw7XG5WaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcE5hbm9zZWNvbmQgPSBudWxsO1xuVmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lU2Vjb25kID0gbnVsbDtcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZU1pbGxpc2Vjb25kID0gbnVsbDtcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZU1pY3Jvc2Vjb25kID0gbnVsbDtcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZU5hbm9zZWNvbmQgPSBudWxsO1xuVmlzaXRvci5wcm90b3R5cGUudmlzaXREZW5zZVVuaW9uID0gbnVsbDtcblZpc2l0b3IucHJvdG90eXBlLnZpc2l0U3BhcnNlVW5pb24gPSBudWxsO1xuVmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnRlcnZhbERheVRpbWUgPSBudWxsO1xuVmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnRlcnZhbFllYXJNb250aCA9IG51bGw7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZpc2l0b3IubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBWaXNpdG9yIH0gZnJvbSAnLi4vdmlzaXRvci5tanMnO1xuaW1wb3J0IHsgQmluYXJ5QnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIvYmluYXJ5Lm1qcyc7XG5pbXBvcnQgeyBCb29sQnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIvYm9vbC5tanMnO1xuaW1wb3J0IHsgRGF0ZUJ1aWxkZXIsIERhdGVEYXlCdWlsZGVyLCBEYXRlTWlsbGlzZWNvbmRCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci9kYXRlLm1qcyc7XG5pbXBvcnQgeyBEZWNpbWFsQnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIvZGVjaW1hbC5tanMnO1xuaW1wb3J0IHsgRGljdGlvbmFyeUJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyL2RpY3Rpb25hcnkubWpzJztcbmltcG9ydCB7IEZpeGVkU2l6ZUJpbmFyeUJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyL2ZpeGVkc2l6ZWJpbmFyeS5tanMnO1xuaW1wb3J0IHsgRml4ZWRTaXplTGlzdEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyL2ZpeGVkc2l6ZWxpc3QubWpzJztcbmltcG9ydCB7IEZsb2F0QnVpbGRlciwgRmxvYXQxNkJ1aWxkZXIsIEZsb2F0MzJCdWlsZGVyLCBGbG9hdDY0QnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIvZmxvYXQubWpzJztcbmltcG9ydCB7IEludGVydmFsQnVpbGRlciwgSW50ZXJ2YWxEYXlUaW1lQnVpbGRlciwgSW50ZXJ2YWxZZWFyTW9udGhCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci9pbnRlcnZhbC5tanMnO1xuaW1wb3J0IHsgSW50QnVpbGRlciwgSW50OEJ1aWxkZXIsIEludDE2QnVpbGRlciwgSW50MzJCdWlsZGVyLCBJbnQ2NEJ1aWxkZXIsIFVpbnQ4QnVpbGRlciwgVWludDE2QnVpbGRlciwgVWludDMyQnVpbGRlciwgVWludDY0QnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIvaW50Lm1qcyc7XG5pbXBvcnQgeyBMaXN0QnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIvbGlzdC5tanMnO1xuaW1wb3J0IHsgTWFwQnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIvbWFwLm1qcyc7XG5pbXBvcnQgeyBOdWxsQnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIvbnVsbC5tanMnO1xuaW1wb3J0IHsgU3RydWN0QnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIvc3RydWN0Lm1qcyc7XG5pbXBvcnQgeyBUaW1lc3RhbXBCdWlsZGVyLCBUaW1lc3RhbXBTZWNvbmRCdWlsZGVyLCBUaW1lc3RhbXBNaWxsaXNlY29uZEJ1aWxkZXIsIFRpbWVzdGFtcE1pY3Jvc2Vjb25kQnVpbGRlciwgVGltZXN0YW1wTmFub3NlY29uZEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyL3RpbWVzdGFtcC5tanMnO1xuaW1wb3J0IHsgVGltZUJ1aWxkZXIsIFRpbWVTZWNvbmRCdWlsZGVyLCBUaW1lTWlsbGlzZWNvbmRCdWlsZGVyLCBUaW1lTWljcm9zZWNvbmRCdWlsZGVyLCBUaW1lTmFub3NlY29uZEJ1aWxkZXIgfSBmcm9tICcuLi9idWlsZGVyL3RpbWUubWpzJztcbmltcG9ydCB7IFVuaW9uQnVpbGRlciwgRGVuc2VVbmlvbkJ1aWxkZXIsIFNwYXJzZVVuaW9uQnVpbGRlciB9IGZyb20gJy4uL2J1aWxkZXIvdW5pb24ubWpzJztcbmltcG9ydCB7IFV0ZjhCdWlsZGVyIH0gZnJvbSAnLi4vYnVpbGRlci91dGY4Lm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEdldEJ1aWxkZXJDdG9yIGV4dGVuZHMgVmlzaXRvciB7XG4gICAgdmlzaXROdWxsKCkgeyByZXR1cm4gTnVsbEJ1aWxkZXI7IH1cbiAgICB2aXNpdEJvb2woKSB7IHJldHVybiBCb29sQnVpbGRlcjsgfVxuICAgIHZpc2l0SW50KCkgeyByZXR1cm4gSW50QnVpbGRlcjsgfVxuICAgIHZpc2l0SW50OCgpIHsgcmV0dXJuIEludDhCdWlsZGVyOyB9XG4gICAgdmlzaXRJbnQxNigpIHsgcmV0dXJuIEludDE2QnVpbGRlcjsgfVxuICAgIHZpc2l0SW50MzIoKSB7IHJldHVybiBJbnQzMkJ1aWxkZXI7IH1cbiAgICB2aXNpdEludDY0KCkgeyByZXR1cm4gSW50NjRCdWlsZGVyOyB9XG4gICAgdmlzaXRVaW50OCgpIHsgcmV0dXJuIFVpbnQ4QnVpbGRlcjsgfVxuICAgIHZpc2l0VWludDE2KCkgeyByZXR1cm4gVWludDE2QnVpbGRlcjsgfVxuICAgIHZpc2l0VWludDMyKCkgeyByZXR1cm4gVWludDMyQnVpbGRlcjsgfVxuICAgIHZpc2l0VWludDY0KCkgeyByZXR1cm4gVWludDY0QnVpbGRlcjsgfVxuICAgIHZpc2l0RmxvYXQoKSB7IHJldHVybiBGbG9hdEJ1aWxkZXI7IH1cbiAgICB2aXNpdEZsb2F0MTYoKSB7IHJldHVybiBGbG9hdDE2QnVpbGRlcjsgfVxuICAgIHZpc2l0RmxvYXQzMigpIHsgcmV0dXJuIEZsb2F0MzJCdWlsZGVyOyB9XG4gICAgdmlzaXRGbG9hdDY0KCkgeyByZXR1cm4gRmxvYXQ2NEJ1aWxkZXI7IH1cbiAgICB2aXNpdFV0ZjgoKSB7IHJldHVybiBVdGY4QnVpbGRlcjsgfVxuICAgIHZpc2l0QmluYXJ5KCkgeyByZXR1cm4gQmluYXJ5QnVpbGRlcjsgfVxuICAgIHZpc2l0Rml4ZWRTaXplQmluYXJ5KCkgeyByZXR1cm4gRml4ZWRTaXplQmluYXJ5QnVpbGRlcjsgfVxuICAgIHZpc2l0RGF0ZSgpIHsgcmV0dXJuIERhdGVCdWlsZGVyOyB9XG4gICAgdmlzaXREYXRlRGF5KCkgeyByZXR1cm4gRGF0ZURheUJ1aWxkZXI7IH1cbiAgICB2aXNpdERhdGVNaWxsaXNlY29uZCgpIHsgcmV0dXJuIERhdGVNaWxsaXNlY29uZEJ1aWxkZXI7IH1cbiAgICB2aXNpdFRpbWVzdGFtcCgpIHsgcmV0dXJuIFRpbWVzdGFtcEJ1aWxkZXI7IH1cbiAgICB2aXNpdFRpbWVzdGFtcFNlY29uZCgpIHsgcmV0dXJuIFRpbWVzdGFtcFNlY29uZEJ1aWxkZXI7IH1cbiAgICB2aXNpdFRpbWVzdGFtcE1pbGxpc2Vjb25kKCkgeyByZXR1cm4gVGltZXN0YW1wTWlsbGlzZWNvbmRCdWlsZGVyOyB9XG4gICAgdmlzaXRUaW1lc3RhbXBNaWNyb3NlY29uZCgpIHsgcmV0dXJuIFRpbWVzdGFtcE1pY3Jvc2Vjb25kQnVpbGRlcjsgfVxuICAgIHZpc2l0VGltZXN0YW1wTmFub3NlY29uZCgpIHsgcmV0dXJuIFRpbWVzdGFtcE5hbm9zZWNvbmRCdWlsZGVyOyB9XG4gICAgdmlzaXRUaW1lKCkgeyByZXR1cm4gVGltZUJ1aWxkZXI7IH1cbiAgICB2aXNpdFRpbWVTZWNvbmQoKSB7IHJldHVybiBUaW1lU2Vjb25kQnVpbGRlcjsgfVxuICAgIHZpc2l0VGltZU1pbGxpc2Vjb25kKCkgeyByZXR1cm4gVGltZU1pbGxpc2Vjb25kQnVpbGRlcjsgfVxuICAgIHZpc2l0VGltZU1pY3Jvc2Vjb25kKCkgeyByZXR1cm4gVGltZU1pY3Jvc2Vjb25kQnVpbGRlcjsgfVxuICAgIHZpc2l0VGltZU5hbm9zZWNvbmQoKSB7IHJldHVybiBUaW1lTmFub3NlY29uZEJ1aWxkZXI7IH1cbiAgICB2aXNpdERlY2ltYWwoKSB7IHJldHVybiBEZWNpbWFsQnVpbGRlcjsgfVxuICAgIHZpc2l0TGlzdCgpIHsgcmV0dXJuIExpc3RCdWlsZGVyOyB9XG4gICAgdmlzaXRTdHJ1Y3QoKSB7IHJldHVybiBTdHJ1Y3RCdWlsZGVyOyB9XG4gICAgdmlzaXRVbmlvbigpIHsgcmV0dXJuIFVuaW9uQnVpbGRlcjsgfVxuICAgIHZpc2l0RGVuc2VVbmlvbigpIHsgcmV0dXJuIERlbnNlVW5pb25CdWlsZGVyOyB9XG4gICAgdmlzaXRTcGFyc2VVbmlvbigpIHsgcmV0dXJuIFNwYXJzZVVuaW9uQnVpbGRlcjsgfVxuICAgIHZpc2l0RGljdGlvbmFyeSgpIHsgcmV0dXJuIERpY3Rpb25hcnlCdWlsZGVyOyB9XG4gICAgdmlzaXRJbnRlcnZhbCgpIHsgcmV0dXJuIEludGVydmFsQnVpbGRlcjsgfVxuICAgIHZpc2l0SW50ZXJ2YWxEYXlUaW1lKCkgeyByZXR1cm4gSW50ZXJ2YWxEYXlUaW1lQnVpbGRlcjsgfVxuICAgIHZpc2l0SW50ZXJ2YWxZZWFyTW9udGgoKSB7IHJldHVybiBJbnRlcnZhbFllYXJNb250aEJ1aWxkZXI7IH1cbiAgICB2aXNpdEZpeGVkU2l6ZUxpc3QoKSB7IHJldHVybiBGaXhlZFNpemVMaXN0QnVpbGRlcjsgfVxuICAgIHZpc2l0TWFwKCkgeyByZXR1cm4gTWFwQnVpbGRlcjsgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBpbnN0YW5jZSA9IG5ldyBHZXRCdWlsZGVyQ3RvcigpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1idWlsZGVyY3Rvci5tanMubWFwXG4iLCIvKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZSAqL1xuaW1wb3J0IHsgVmlzaXRvciB9IGZyb20gJy4uL3Zpc2l0b3IubWpzJztcbmltcG9ydCB7IFRpbWVVbml0LCBVbmlvbk1vZGUgfSBmcm9tICcuLi9lbnVtLm1qcyc7XG4vKiogQGlnbm9yZSAqLyBjb25zdCBzdW0gPSAoeCwgeSkgPT4geCArIHk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEdldEJ5dGVMZW5ndGhWaXNpdG9yIGV4dGVuZHMgVmlzaXRvciB7XG4gICAgdmlzaXROdWxsKF9fX18sIF8pIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHZpc2l0SW50KGRhdGEsIF8pIHtcbiAgICAgICAgcmV0dXJuIGRhdGEudHlwZS5iaXRXaWR0aCAvIDg7XG4gICAgfVxuICAgIHZpc2l0RmxvYXQoZGF0YSwgXykge1xuICAgICAgICByZXR1cm4gZGF0YS50eXBlLkFycmF5VHlwZS5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICB9XG4gICAgdmlzaXRCb29sKF9fX18sIF8pIHtcbiAgICAgICAgcmV0dXJuIDEgLyA4O1xuICAgIH1cbiAgICB2aXNpdERlY2ltYWwoZGF0YSwgXykge1xuICAgICAgICByZXR1cm4gZGF0YS50eXBlLmJpdFdpZHRoIC8gODtcbiAgICB9XG4gICAgdmlzaXREYXRlKGRhdGEsIF8pIHtcbiAgICAgICAgcmV0dXJuIChkYXRhLnR5cGUudW5pdCArIDEpICogNDtcbiAgICB9XG4gICAgdmlzaXRUaW1lKGRhdGEsIF8pIHtcbiAgICAgICAgcmV0dXJuIGRhdGEudHlwZS5iaXRXaWR0aCAvIDg7XG4gICAgfVxuICAgIHZpc2l0VGltZXN0YW1wKGRhdGEsIF8pIHtcbiAgICAgICAgcmV0dXJuIGRhdGEudHlwZS51bml0ID09PSBUaW1lVW5pdC5TRUNPTkQgPyA0IDogODtcbiAgICB9XG4gICAgdmlzaXRJbnRlcnZhbChkYXRhLCBfKSB7XG4gICAgICAgIHJldHVybiAoZGF0YS50eXBlLnVuaXQgKyAxKSAqIDQ7XG4gICAgfVxuICAgIHZpc2l0U3RydWN0KGRhdGEsIGkpIHtcbiAgICAgICAgcmV0dXJuIGRhdGEuY2hpbGRyZW4ucmVkdWNlKCh0b3RhbCwgY2hpbGQpID0+IHRvdGFsICsgaW5zdGFuY2UudmlzaXQoY2hpbGQsIGkpLCAwKTtcbiAgICB9XG4gICAgdmlzaXRGaXhlZFNpemVCaW5hcnkoZGF0YSwgXykge1xuICAgICAgICByZXR1cm4gZGF0YS50eXBlLmJ5dGVXaWR0aDtcbiAgICB9XG4gICAgdmlzaXRNYXAoZGF0YSwgaSkge1xuICAgICAgICAvLyA0ICsgNCBmb3IgdGhlIGluZGljZXNcbiAgICAgICAgcmV0dXJuIDggKyBkYXRhLmNoaWxkcmVuLnJlZHVjZSgodG90YWwsIGNoaWxkKSA9PiB0b3RhbCArIGluc3RhbmNlLnZpc2l0KGNoaWxkLCBpKSwgMCk7XG4gICAgfVxuICAgIHZpc2l0RGljdGlvbmFyeShkYXRhLCBpKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChkYXRhLnR5cGUuaW5kaWNlcy5iaXRXaWR0aCAvIDgpICsgKCgoX2EgPSBkYXRhLmRpY3Rpb25hcnkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRCeXRlTGVuZ3RoKGRhdGEudmFsdWVzW2ldKSkgfHwgMCk7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldFV0ZjhCeXRlTGVuZ3RoID0gKHsgdmFsdWVPZmZzZXRzIH0sIGluZGV4KSA9PiB7XG4gICAgLy8gNCArIDQgZm9yIHRoZSBpbmRpY2VzLCBgZW5kIC0gc3RhcnRgIGZvciB0aGUgZGF0YSBieXRlc1xuICAgIHJldHVybiA4ICsgKHZhbHVlT2Zmc2V0c1tpbmRleCArIDFdIC0gdmFsdWVPZmZzZXRzW2luZGV4XSk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldEJpbmFyeUJ5dGVMZW5ndGggPSAoeyB2YWx1ZU9mZnNldHMgfSwgaW5kZXgpID0+IHtcbiAgICAvLyA0ICsgNCBmb3IgdGhlIGluZGljZXMsIGBlbmQgLSBzdGFydGAgZm9yIHRoZSBkYXRhIGJ5dGVzXG4gICAgcmV0dXJuIDggKyAodmFsdWVPZmZzZXRzW2luZGV4ICsgMV0gLSB2YWx1ZU9mZnNldHNbaW5kZXhdKTtcbn07XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0TGlzdEJ5dGVMZW5ndGggPSAoeyB2YWx1ZU9mZnNldHMsIHN0cmlkZSwgY2hpbGRyZW4gfSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuWzBdO1xuICAgIGNvbnN0IHsgW2luZGV4ICogc3RyaWRlXTogc3RhcnQgfSA9IHZhbHVlT2Zmc2V0cztcbiAgICBjb25zdCB7IFtpbmRleCAqIHN0cmlkZSArIDFdOiBlbmQgfSA9IHZhbHVlT2Zmc2V0cztcbiAgICBjb25zdCB2aXNpdCA9IGluc3RhbmNlLmdldFZpc2l0Rm4oY2hpbGQudHlwZSk7XG4gICAgY29uc3Qgc2xpY2UgPSBjaGlsZC5zbGljZShzdGFydCwgZW5kIC0gc3RhcnQpO1xuICAgIGxldCBzaXplID0gODsgLy8gNCArIDQgZm9yIHRoZSBpbmRpY2VzXG4gICAgZm9yIChsZXQgaWR4ID0gLTEsIGxlbiA9IGVuZCAtIHN0YXJ0OyArK2lkeCA8IGxlbjspIHtcbiAgICAgICAgc2l6ZSArPSB2aXNpdChzbGljZSwgaWR4KTtcbiAgICB9XG4gICAgcmV0dXJuIHNpemU7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldEZpeGVkU2l6ZUxpc3RCeXRlTGVuZ3RoID0gKHsgc3RyaWRlLCBjaGlsZHJlbiB9LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5bMF07XG4gICAgY29uc3Qgc2xpY2UgPSBjaGlsZC5zbGljZShpbmRleCAqIHN0cmlkZSwgc3RyaWRlKTtcbiAgICBjb25zdCB2aXNpdCA9IGluc3RhbmNlLmdldFZpc2l0Rm4oY2hpbGQudHlwZSk7XG4gICAgbGV0IHNpemUgPSAwO1xuICAgIGZvciAobGV0IGlkeCA9IC0xLCBsZW4gPSBzbGljZS5sZW5ndGg7ICsraWR4IDwgbGVuOykge1xuICAgICAgICBzaXplICs9IHZpc2l0KHNsaWNlLCBpZHgpO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbn07XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldFVuaW9uQnl0ZUxlbmd0aCA9IChkYXRhLCBpbmRleCkgPT4ge1xuICAgIHJldHVybiBkYXRhLnR5cGUubW9kZSA9PT0gVW5pb25Nb2RlLkRlbnNlID9cbiAgICAgICAgZ2V0RGVuc2VVbmlvbkJ5dGVMZW5ndGgoZGF0YSwgaW5kZXgpIDpcbiAgICAgICAgZ2V0U3BhcnNlVW5pb25CeXRlTGVuZ3RoKGRhdGEsIGluZGV4KTtcbn07XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0RGVuc2VVbmlvbkJ5dGVMZW5ndGggPSAoeyB0eXBlLCBjaGlsZHJlbiwgdHlwZUlkcywgdmFsdWVPZmZzZXRzIH0sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgY2hpbGRJbmRleCA9IHR5cGUudHlwZUlkVG9DaGlsZEluZGV4W3R5cGVJZHNbaW5kZXhdXTtcbiAgICAvLyA0IGZvciB0aGUgdHlwZUlkLCA0IGZvciB0aGUgdmFsdWVPZmZzZXRzLCB0aGVuIHRoZSBjaGlsZCBhdCB0aGUgb2Zmc2V0XG4gICAgcmV0dXJuIDggKyBpbnN0YW5jZS52aXNpdChjaGlsZHJlbltjaGlsZEluZGV4XSwgdmFsdWVPZmZzZXRzW2luZGV4XSk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldFNwYXJzZVVuaW9uQnl0ZUxlbmd0aCA9ICh7IGNoaWxkcmVuIH0sIGluZGV4KSA9PiB7XG4gICAgLy8gNCBmb3IgdGhlIHR5cGVJZCwgdGhlbiBvbmNlIGVhY2ggZm9yIHRoZSBjaGlsZHJlbiBhdCB0aGlzIGluZGV4XG4gICAgcmV0dXJuIDQgKyBpbnN0YW5jZS52aXNpdE1hbnkoY2hpbGRyZW4sIGNoaWxkcmVuLm1hcCgoKSA9PiBpbmRleCkpLnJlZHVjZShzdW0sIDApO1xufTtcbkdldEJ5dGVMZW5ndGhWaXNpdG9yLnByb3RvdHlwZS52aXNpdFV0ZjggPSBnZXRVdGY4Qnl0ZUxlbmd0aDtcbkdldEJ5dGVMZW5ndGhWaXNpdG9yLnByb3RvdHlwZS52aXNpdEJpbmFyeSA9IGdldEJpbmFyeUJ5dGVMZW5ndGg7XG5HZXRCeXRlTGVuZ3RoVmlzaXRvci5wcm90b3R5cGUudmlzaXRMaXN0ID0gZ2V0TGlzdEJ5dGVMZW5ndGg7XG5HZXRCeXRlTGVuZ3RoVmlzaXRvci5wcm90b3R5cGUudmlzaXRGaXhlZFNpemVMaXN0ID0gZ2V0Rml4ZWRTaXplTGlzdEJ5dGVMZW5ndGg7XG5HZXRCeXRlTGVuZ3RoVmlzaXRvci5wcm90b3R5cGUudmlzaXRVbmlvbiA9IGdldFVuaW9uQnl0ZUxlbmd0aDtcbkdldEJ5dGVMZW5ndGhWaXNpdG9yLnByb3RvdHlwZS52aXNpdERlbnNlVW5pb24gPSBnZXREZW5zZVVuaW9uQnl0ZUxlbmd0aDtcbkdldEJ5dGVMZW5ndGhWaXNpdG9yLnByb3RvdHlwZS52aXNpdFNwYXJzZVVuaW9uID0gZ2V0U3BhcnNlVW5pb25CeXRlTGVuZ3RoO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBpbnN0YW5jZSA9IG5ldyBHZXRCeXRlTGVuZ3RoVmlzaXRvcigpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1ieXRlbGVuZ3RoLm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgQk4gfSBmcm9tICcuLi91dGlsL2JuLm1qcyc7XG5pbXBvcnQgeyBWZWN0b3IgfSBmcm9tICcuLi92ZWN0b3IubWpzJztcbmltcG9ydCB7IFZpc2l0b3IgfSBmcm9tICcuLi92aXNpdG9yLm1qcyc7XG5pbXBvcnQgeyBNYXBSb3cgfSBmcm9tICcuLi9yb3cvbWFwLm1qcyc7XG5pbXBvcnQgeyBTdHJ1Y3RSb3cgfSBmcm9tICcuLi9yb3cvc3RydWN0Lm1qcyc7XG5pbXBvcnQgeyBkZWNvZGVVdGY4IH0gZnJvbSAnLi4vdXRpbC91dGY4Lm1qcyc7XG5pbXBvcnQgeyB1aW50MTZUb0Zsb2F0NjQgfSBmcm9tICcuLi91dGlsL21hdGgubWpzJztcbmltcG9ydCB7IFVuaW9uTW9kZSwgUHJlY2lzaW9uLCBEYXRlVW5pdCwgVGltZVVuaXQsIEludGVydmFsVW5pdCB9IGZyb20gJy4uL2VudW0ubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgR2V0VmlzaXRvciBleHRlbmRzIFZpc2l0b3Ige1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIHdyYXBHZXQoZm4pIHtcbiAgICByZXR1cm4gKGRhdGEsIF8xKSA9PiBkYXRhLmdldFZhbGlkKF8xKSA/IGZuKGRhdGEsIF8xKSA6IG51bGw7XG59XG4vKiogQGlnbm9yZSAqLyBjb25zdCBlcG9jaERheXNUb01zID0gKGRhdGEsIGluZGV4KSA9PiA4NjQwMDAwMCAqIGRhdGFbaW5kZXhdO1xuLyoqIEBpZ25vcmUgKi8gY29uc3QgZXBvY2hNaWxsaXNlY29uZHNMb25nVG9NcyA9IChkYXRhLCBpbmRleCkgPT4gNDI5NDk2NzI5NiAqIChkYXRhW2luZGV4ICsgMV0pICsgKGRhdGFbaW5kZXhdID4+PiAwKTtcbi8qKiBAaWdub3JlICovIGNvbnN0IGVwb2NoTWljcm9zZWNvbmRzTG9uZ1RvTXMgPSAoZGF0YSwgaW5kZXgpID0+IDQyOTQ5NjcyOTYgKiAoZGF0YVtpbmRleCArIDFdIC8gMTAwMCkgKyAoKGRhdGFbaW5kZXhdID4+PiAwKSAvIDEwMDApO1xuLyoqIEBpZ25vcmUgKi8gY29uc3QgZXBvY2hOYW5vc2Vjb25kc0xvbmdUb01zID0gKGRhdGEsIGluZGV4KSA9PiA0Mjk0OTY3Mjk2ICogKGRhdGFbaW5kZXggKyAxXSAvIDEwMDAwMDApICsgKChkYXRhW2luZGV4XSA+Pj4gMCkgLyAxMDAwMDAwKTtcbi8qKiBAaWdub3JlICovIGNvbnN0IGVwb2NoTWlsbGlzZWNvbmRzVG9EYXRlID0gKGVwb2NoTXMpID0+IG5ldyBEYXRlKGVwb2NoTXMpO1xuLyoqIEBpZ25vcmUgKi8gY29uc3QgZXBvY2hEYXlzVG9EYXRlID0gKGRhdGEsIGluZGV4KSA9PiBlcG9jaE1pbGxpc2Vjb25kc1RvRGF0ZShlcG9jaERheXNUb01zKGRhdGEsIGluZGV4KSk7XG4vKiogQGlnbm9yZSAqLyBjb25zdCBlcG9jaE1pbGxpc2Vjb25kc0xvbmdUb0RhdGUgPSAoZGF0YSwgaW5kZXgpID0+IGVwb2NoTWlsbGlzZWNvbmRzVG9EYXRlKGVwb2NoTWlsbGlzZWNvbmRzTG9uZ1RvTXMoZGF0YSwgaW5kZXgpKTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXROdWxsID0gKF9kYXRhLCBfaW5kZXgpID0+IG51bGw7XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0VmFyaWFibGVXaWR0aEJ5dGVzID0gKHZhbHVlcywgdmFsdWVPZmZzZXRzLCBpbmRleCkgPT4ge1xuICAgIGlmIChpbmRleCArIDEgPj0gdmFsdWVPZmZzZXRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgeCA9IHZhbHVlT2Zmc2V0c1tpbmRleF07XG4gICAgY29uc3QgeSA9IHZhbHVlT2Zmc2V0c1tpbmRleCArIDFdO1xuICAgIHJldHVybiB2YWx1ZXMuc3ViYXJyYXkoeCwgeSk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldEJvb2wgPSAoeyBvZmZzZXQsIHZhbHVlcyB9LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGlkeCA9IG9mZnNldCArIGluZGV4O1xuICAgIGNvbnN0IGJ5dGUgPSB2YWx1ZXNbaWR4ID4+IDNdO1xuICAgIHJldHVybiAoYnl0ZSAmIDEgPDwgKGlkeCAlIDgpKSAhPT0gMDtcbn07XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0RGF0ZURheSA9ICh7IHZhbHVlcyB9LCBpbmRleCkgPT4gZXBvY2hEYXlzVG9EYXRlKHZhbHVlcywgaW5kZXgpO1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldERhdGVNaWxsaXNlY29uZCA9ICh7IHZhbHVlcyB9LCBpbmRleCkgPT4gZXBvY2hNaWxsaXNlY29uZHNMb25nVG9EYXRlKHZhbHVlcywgaW5kZXggKiAyKTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXROdW1lcmljID0gKHsgc3RyaWRlLCB2YWx1ZXMgfSwgaW5kZXgpID0+IHZhbHVlc1tzdHJpZGUgKiBpbmRleF07XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0RmxvYXQxNiA9ICh7IHN0cmlkZSwgdmFsdWVzIH0sIGluZGV4KSA9PiB1aW50MTZUb0Zsb2F0NjQodmFsdWVzW3N0cmlkZSAqIGluZGV4XSk7XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0QmlnSW50cyA9ICh7IHZhbHVlcyB9LCBpbmRleCkgPT4gdmFsdWVzW2luZGV4XTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXRGaXhlZFNpemVCaW5hcnkgPSAoeyBzdHJpZGUsIHZhbHVlcyB9LCBpbmRleCkgPT4gdmFsdWVzLnN1YmFycmF5KHN0cmlkZSAqIGluZGV4LCBzdHJpZGUgKiAoaW5kZXggKyAxKSk7XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0QmluYXJ5ID0gKHsgdmFsdWVzLCB2YWx1ZU9mZnNldHMgfSwgaW5kZXgpID0+IGdldFZhcmlhYmxlV2lkdGhCeXRlcyh2YWx1ZXMsIHZhbHVlT2Zmc2V0cywgaW5kZXgpO1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldFV0ZjggPSAoeyB2YWx1ZXMsIHZhbHVlT2Zmc2V0cyB9LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gZ2V0VmFyaWFibGVXaWR0aEJ5dGVzKHZhbHVlcywgdmFsdWVPZmZzZXRzLCBpbmRleCk7XG4gICAgcmV0dXJuIGJ5dGVzICE9PSBudWxsID8gZGVjb2RlVXRmOChieXRlcykgOiBudWxsO1xufTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0SW50ID0gKHsgdmFsdWVzIH0sIGluZGV4KSA9PiB2YWx1ZXNbaW5kZXhdO1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXRGbG9hdCA9ICh7IHR5cGUsIHZhbHVlcyB9LCBpbmRleCkgPT4gKHR5cGUucHJlY2lzaW9uICE9PSBQcmVjaXNpb24uSEFMRiA/IHZhbHVlc1tpbmRleF0gOiB1aW50MTZUb0Zsb2F0NjQodmFsdWVzW2luZGV4XSkpO1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXREYXRlID0gKGRhdGEsIGluZGV4KSA9PiAoZGF0YS50eXBlLnVuaXQgPT09IERhdGVVbml0LkRBWVxuICAgID8gZ2V0RGF0ZURheShkYXRhLCBpbmRleClcbiAgICA6IGdldERhdGVNaWxsaXNlY29uZChkYXRhLCBpbmRleCkpO1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldFRpbWVzdGFtcFNlY29uZCA9ICh7IHZhbHVlcyB9LCBpbmRleCkgPT4gMTAwMCAqIGVwb2NoTWlsbGlzZWNvbmRzTG9uZ1RvTXModmFsdWVzLCBpbmRleCAqIDIpO1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldFRpbWVzdGFtcE1pbGxpc2Vjb25kID0gKHsgdmFsdWVzIH0sIGluZGV4KSA9PiBlcG9jaE1pbGxpc2Vjb25kc0xvbmdUb01zKHZhbHVlcywgaW5kZXggKiAyKTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXRUaW1lc3RhbXBNaWNyb3NlY29uZCA9ICh7IHZhbHVlcyB9LCBpbmRleCkgPT4gZXBvY2hNaWNyb3NlY29uZHNMb25nVG9Ncyh2YWx1ZXMsIGluZGV4ICogMik7XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0VGltZXN0YW1wTmFub3NlY29uZCA9ICh7IHZhbHVlcyB9LCBpbmRleCkgPT4gZXBvY2hOYW5vc2Vjb25kc0xvbmdUb01zKHZhbHVlcywgaW5kZXggKiAyKTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0VGltZXN0YW1wID0gKGRhdGEsIGluZGV4KSA9PiB7XG4gICAgc3dpdGNoIChkYXRhLnR5cGUudW5pdCkge1xuICAgICAgICBjYXNlIFRpbWVVbml0LlNFQ09ORDogcmV0dXJuIGdldFRpbWVzdGFtcFNlY29uZChkYXRhLCBpbmRleCk7XG4gICAgICAgIGNhc2UgVGltZVVuaXQuTUlMTElTRUNPTkQ6IHJldHVybiBnZXRUaW1lc3RhbXBNaWxsaXNlY29uZChkYXRhLCBpbmRleCk7XG4gICAgICAgIGNhc2UgVGltZVVuaXQuTUlDUk9TRUNPTkQ6IHJldHVybiBnZXRUaW1lc3RhbXBNaWNyb3NlY29uZChkYXRhLCBpbmRleCk7XG4gICAgICAgIGNhc2UgVGltZVVuaXQuTkFOT1NFQ09ORDogcmV0dXJuIGdldFRpbWVzdGFtcE5hbm9zZWNvbmQoZGF0YSwgaW5kZXgpO1xuICAgIH1cbn07XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0VGltZVNlY29uZCA9ICh7IHZhbHVlcyB9LCBpbmRleCkgPT4gdmFsdWVzW2luZGV4XTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXRUaW1lTWlsbGlzZWNvbmQgPSAoeyB2YWx1ZXMgfSwgaW5kZXgpID0+IHZhbHVlc1tpbmRleF07XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0VGltZU1pY3Jvc2Vjb25kID0gKHsgdmFsdWVzIH0sIGluZGV4KSA9PiB2YWx1ZXNbaW5kZXhdO1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldFRpbWVOYW5vc2Vjb25kID0gKHsgdmFsdWVzIH0sIGluZGV4KSA9PiB2YWx1ZXNbaW5kZXhdO1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXRUaW1lID0gKGRhdGEsIGluZGV4KSA9PiB7XG4gICAgc3dpdGNoIChkYXRhLnR5cGUudW5pdCkge1xuICAgICAgICBjYXNlIFRpbWVVbml0LlNFQ09ORDogcmV0dXJuIGdldFRpbWVTZWNvbmQoZGF0YSwgaW5kZXgpO1xuICAgICAgICBjYXNlIFRpbWVVbml0Lk1JTExJU0VDT05EOiByZXR1cm4gZ2V0VGltZU1pbGxpc2Vjb25kKGRhdGEsIGluZGV4KTtcbiAgICAgICAgY2FzZSBUaW1lVW5pdC5NSUNST1NFQ09ORDogcmV0dXJuIGdldFRpbWVNaWNyb3NlY29uZChkYXRhLCBpbmRleCk7XG4gICAgICAgIGNhc2UgVGltZVVuaXQuTkFOT1NFQ09ORDogcmV0dXJuIGdldFRpbWVOYW5vc2Vjb25kKGRhdGEsIGluZGV4KTtcbiAgICB9XG59O1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldERlY2ltYWwgPSAoeyB2YWx1ZXMsIHN0cmlkZSB9LCBpbmRleCkgPT4gQk4uZGVjaW1hbCh2YWx1ZXMuc3ViYXJyYXkoc3RyaWRlICogaW5kZXgsIHN0cmlkZSAqIChpbmRleCArIDEpKSk7XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0TGlzdCA9IChkYXRhLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHsgdmFsdWVPZmZzZXRzLCBzdHJpZGUsIGNoaWxkcmVuIH0gPSBkYXRhO1xuICAgIGNvbnN0IHsgW2luZGV4ICogc3RyaWRlXTogYmVnaW4sIFtpbmRleCAqIHN0cmlkZSArIDFdOiBlbmQgfSA9IHZhbHVlT2Zmc2V0cztcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuWzBdO1xuICAgIGNvbnN0IHNsaWNlID0gY2hpbGQuc2xpY2UoYmVnaW4sIGVuZCAtIGJlZ2luKTtcbiAgICByZXR1cm4gbmV3IFZlY3Rvcihbc2xpY2VdKTtcbn07XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0TWFwID0gKGRhdGEsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgeyB2YWx1ZU9mZnNldHMsIGNoaWxkcmVuIH0gPSBkYXRhO1xuICAgIGNvbnN0IHsgW2luZGV4XTogYmVnaW4sIFtpbmRleCArIDFdOiBlbmQgfSA9IHZhbHVlT2Zmc2V0cztcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuWzBdO1xuICAgIHJldHVybiBuZXcgTWFwUm93KGNoaWxkLnNsaWNlKGJlZ2luLCBlbmQgLSBiZWdpbikpO1xufTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXRTdHJ1Y3QgPSAoZGF0YSwgaW5kZXgpID0+IHtcbiAgICByZXR1cm4gbmV3IFN0cnVjdFJvdyhkYXRhLCBpbmRleCk7XG59O1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXRVbmlvbiA9IChkYXRhLCBpbmRleCkgPT4ge1xuICAgIHJldHVybiBkYXRhLnR5cGUubW9kZSA9PT0gVW5pb25Nb2RlLkRlbnNlID9cbiAgICAgICAgZ2V0RGVuc2VVbmlvbihkYXRhLCBpbmRleCkgOlxuICAgICAgICBnZXRTcGFyc2VVbmlvbihkYXRhLCBpbmRleCk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldERlbnNlVW5pb24gPSAoZGF0YSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBjaGlsZEluZGV4ID0gZGF0YS50eXBlLnR5cGVJZFRvQ2hpbGRJbmRleFtkYXRhLnR5cGVJZHNbaW5kZXhdXTtcbiAgICBjb25zdCBjaGlsZCA9IGRhdGEuY2hpbGRyZW5bY2hpbGRJbmRleF07XG4gICAgcmV0dXJuIGluc3RhbmNlLnZpc2l0KGNoaWxkLCBkYXRhLnZhbHVlT2Zmc2V0c1tpbmRleF0pO1xufTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXRTcGFyc2VVbmlvbiA9IChkYXRhLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkSW5kZXggPSBkYXRhLnR5cGUudHlwZUlkVG9DaGlsZEluZGV4W2RhdGEudHlwZUlkc1tpbmRleF1dO1xuICAgIGNvbnN0IGNoaWxkID0gZGF0YS5jaGlsZHJlbltjaGlsZEluZGV4XTtcbiAgICByZXR1cm4gaW5zdGFuY2UudmlzaXQoY2hpbGQsIGluZGV4KTtcbn07XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0RGljdGlvbmFyeSA9IChkYXRhLCBpbmRleCkgPT4ge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gKF9hID0gZGF0YS5kaWN0aW9uYXJ5KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0KGRhdGEudmFsdWVzW2luZGV4XSk7XG59O1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbi8qKiBAaWdub3JlICovXG5jb25zdCBnZXRJbnRlcnZhbCA9IChkYXRhLCBpbmRleCkgPT4gKGRhdGEudHlwZS51bml0ID09PSBJbnRlcnZhbFVuaXQuREFZX1RJTUUpXG4gICAgPyBnZXRJbnRlcnZhbERheVRpbWUoZGF0YSwgaW5kZXgpXG4gICAgOiBnZXRJbnRlcnZhbFllYXJNb250aChkYXRhLCBpbmRleCk7XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0SW50ZXJ2YWxEYXlUaW1lID0gKHsgdmFsdWVzIH0sIGluZGV4KSA9PiB2YWx1ZXMuc3ViYXJyYXkoMiAqIGluZGV4LCAyICogKGluZGV4ICsgMSkpO1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IGdldEludGVydmFsWWVhck1vbnRoID0gKHsgdmFsdWVzIH0sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgaW50ZXJ2YWwgPSB2YWx1ZXNbaW5kZXhdO1xuICAgIGNvbnN0IGludDMycyA9IG5ldyBJbnQzMkFycmF5KDIpO1xuICAgIGludDMyc1swXSA9IE1hdGgudHJ1bmMoaW50ZXJ2YWwgLyAxMik7IC8qIHllYXJzICovXG4gICAgaW50MzJzWzFdID0gTWF0aC50cnVuYyhpbnRlcnZhbCAlIDEyKTsgLyogbW9udGhzICovXG4gICAgcmV0dXJuIGludDMycztcbn07XG4vKiogQGlnbm9yZSAqL1xuY29uc3QgZ2V0Rml4ZWRTaXplTGlzdCA9IChkYXRhLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHsgc3RyaWRlLCBjaGlsZHJlbiB9ID0gZGF0YTtcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuWzBdO1xuICAgIGNvbnN0IHNsaWNlID0gY2hpbGQuc2xpY2UoaW5kZXggKiBzdHJpZGUsIHN0cmlkZSk7XG4gICAgcmV0dXJuIG5ldyBWZWN0b3IoW3NsaWNlXSk7XG59O1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXROdWxsID0gd3JhcEdldChnZXROdWxsKTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0Qm9vbCA9IHdyYXBHZXQoZ2V0Qm9vbCk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludCA9IHdyYXBHZXQoZ2V0SW50KTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50OCA9IHdyYXBHZXQoZ2V0TnVtZXJpYyk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludDE2ID0gd3JhcEdldChnZXROdW1lcmljKTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50MzIgPSB3cmFwR2V0KGdldE51bWVyaWMpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnQ2NCA9IHdyYXBHZXQoZ2V0QmlnSW50cyk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFVpbnQ4ID0gd3JhcEdldChnZXROdW1lcmljKTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VWludDE2ID0gd3JhcEdldChnZXROdW1lcmljKTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VWludDMyID0gd3JhcEdldChnZXROdW1lcmljKTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VWludDY0ID0gd3JhcEdldChnZXRCaWdJbnRzKTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0RmxvYXQgPSB3cmFwR2V0KGdldEZsb2F0KTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0RmxvYXQxNiA9IHdyYXBHZXQoZ2V0RmxvYXQxNik7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdEZsb2F0MzIgPSB3cmFwR2V0KGdldE51bWVyaWMpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRGbG9hdDY0ID0gd3JhcEdldChnZXROdW1lcmljKTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VXRmOCA9IHdyYXBHZXQoZ2V0VXRmOCk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdEJpbmFyeSA9IHdyYXBHZXQoZ2V0QmluYXJ5KTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0Rml4ZWRTaXplQmluYXJ5ID0gd3JhcEdldChnZXRGaXhlZFNpemVCaW5hcnkpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXREYXRlID0gd3JhcEdldChnZXREYXRlKTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGF0ZURheSA9IHdyYXBHZXQoZ2V0RGF0ZURheSk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdERhdGVNaWxsaXNlY29uZCA9IHdyYXBHZXQoZ2V0RGF0ZU1pbGxpc2Vjb25kKTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wID0gd3JhcEdldChnZXRUaW1lc3RhbXApO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBTZWNvbmQgPSB3cmFwR2V0KGdldFRpbWVzdGFtcFNlY29uZCk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcE1pbGxpc2Vjb25kID0gd3JhcEdldChnZXRUaW1lc3RhbXBNaWxsaXNlY29uZCk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcE1pY3Jvc2Vjb25kID0gd3JhcEdldChnZXRUaW1lc3RhbXBNaWNyb3NlY29uZCk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcE5hbm9zZWNvbmQgPSB3cmFwR2V0KGdldFRpbWVzdGFtcE5hbm9zZWNvbmQpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lID0gd3JhcEdldChnZXRUaW1lKTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZVNlY29uZCA9IHdyYXBHZXQoZ2V0VGltZVNlY29uZCk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVNaWxsaXNlY29uZCA9IHdyYXBHZXQoZ2V0VGltZU1pbGxpc2Vjb25kKTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZU1pY3Jvc2Vjb25kID0gd3JhcEdldChnZXRUaW1lTWljcm9zZWNvbmQpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lTmFub3NlY29uZCA9IHdyYXBHZXQoZ2V0VGltZU5hbm9zZWNvbmQpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXREZWNpbWFsID0gd3JhcEdldChnZXREZWNpbWFsKTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0TGlzdCA9IHdyYXBHZXQoZ2V0TGlzdCk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFN0cnVjdCA9IHdyYXBHZXQoZ2V0U3RydWN0KTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VW5pb24gPSB3cmFwR2V0KGdldFVuaW9uKTtcbkdldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVuc2VVbmlvbiA9IHdyYXBHZXQoZ2V0RGVuc2VVbmlvbik7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFNwYXJzZVVuaW9uID0gd3JhcEdldChnZXRTcGFyc2VVbmlvbik7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdERpY3Rpb25hcnkgPSB3cmFwR2V0KGdldERpY3Rpb25hcnkpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnRlcnZhbCA9IHdyYXBHZXQoZ2V0SW50ZXJ2YWwpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnRlcnZhbERheVRpbWUgPSB3cmFwR2V0KGdldEludGVydmFsRGF5VGltZSk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludGVydmFsWWVhck1vbnRoID0gd3JhcEdldChnZXRJbnRlcnZhbFllYXJNb250aCk7XG5HZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdEZpeGVkU2l6ZUxpc3QgPSB3cmFwR2V0KGdldEZpeGVkU2l6ZUxpc3QpO1xuR2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRNYXAgPSB3cmFwR2V0KGdldE1hcCk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IGluc3RhbmNlID0gbmV3IEdldFZpc2l0b3IoKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0Lm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0IHsgVmlzaXRvciB9IGZyb20gJy4uL3Zpc2l0b3IubWpzJztcbmltcG9ydCB7IGluc3RhbmNlIGFzIGdldFZpc2l0b3IgfSBmcm9tICcuL2dldC5tanMnO1xuaW1wb3J0IHsgZ2V0Qm9vbCwgQml0SXRlcmF0b3IgfSBmcm9tICcuLi91dGlsL2JpdC5tanMnO1xuaW1wb3J0IHsgY3JlYXRlRWxlbWVudENvbXBhcmF0b3IgfSBmcm9tICcuLi91dGlsL3ZlY3Rvci5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBJbmRleE9mVmlzaXRvciBleHRlbmRzIFZpc2l0b3Ige1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIG51bGxJbmRleE9mKGRhdGEsIHNlYXJjaEVsZW1lbnQpIHtcbiAgICAvLyBpZiB5b3UncmUgbG9va2luZyBmb3IgbnVsbHMgYW5kIHRoZSB2ZWN0b3IgaXNuJ3QgZW1wdHksIHdlJ3ZlIGdvdCAnZW0hXG4gICAgcmV0dXJuIHNlYXJjaEVsZW1lbnQgPT09IG51bGwgJiYgZGF0YS5sZW5ndGggPiAwID8gMCA6IC0xO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGluZGV4T2ZOdWxsKGRhdGEsIGZyb21JbmRleCkge1xuICAgIGNvbnN0IHsgbnVsbEJpdG1hcCB9ID0gZGF0YTtcbiAgICBpZiAoIW51bGxCaXRtYXAgfHwgZGF0YS5udWxsQ291bnQgPD0gMCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGxldCBpID0gMDtcbiAgICBmb3IgKGNvbnN0IGlzVmFsaWQgb2YgbmV3IEJpdEl0ZXJhdG9yKG51bGxCaXRtYXAsIGRhdGEub2Zmc2V0ICsgKGZyb21JbmRleCB8fCAwKSwgZGF0YS5sZW5ndGgsIG51bGxCaXRtYXAsIGdldEJvb2wpKSB7XG4gICAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgKytpO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gaW5kZXhPZlZhbHVlKGRhdGEsIHNlYXJjaEVsZW1lbnQsIGZyb21JbmRleCkge1xuICAgIGlmIChzZWFyY2hFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBpZiAoc2VhcmNoRWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gaW5kZXhPZk51bGwoZGF0YSwgZnJvbUluZGV4KTtcbiAgICB9XG4gICAgY29uc3QgZ2V0ID0gZ2V0VmlzaXRvci5nZXRWaXNpdEZuKGRhdGEpO1xuICAgIGNvbnN0IGNvbXBhcmUgPSBjcmVhdGVFbGVtZW50Q29tcGFyYXRvcihzZWFyY2hFbGVtZW50KTtcbiAgICBmb3IgKGxldCBpID0gKGZyb21JbmRleCB8fCAwKSAtIDEsIG4gPSBkYXRhLmxlbmd0aDsgKytpIDwgbjspIHtcbiAgICAgICAgaWYgKGNvbXBhcmUoZ2V0KGRhdGEsIGkpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGluZGV4T2ZVbmlvbihkYXRhLCBzZWFyY2hFbGVtZW50LCBmcm9tSW5kZXgpIHtcbiAgICAvLyBVbmlvbnMgYXJlIHNwZWNpYWwgLS0gdGhleSBkbyBoYXZlIGEgbnVsbEJpdG1hcCwgYnV0IHNvIGNhbiB0aGVpciBjaGlsZHJlbi5cbiAgICAvLyBJZiB0aGUgc2VhcmNoRWxlbWVudCBpcyBudWxsLCB3ZSBkb24ndCBrbm93IHdoZXRoZXIgaXQgY2FtZSBmcm9tIHRoZSBVbmlvbidzXG4gICAgLy8gYml0bWFwIG9yIG9uZSBvZiBpdHMgY2hpbGRyZW5zJy4gU28gd2UgZG9uJ3QgaW50ZXJyb2dhdGUgdGhlIFVuaW9uJ3MgYml0bWFwLFxuICAgIC8vIHNpbmNlIHRoYXQgd2lsbCByZXBvcnQgdGhlIHdyb25nIGluZGV4IGlmIGEgY2hpbGQgaGFzIGEgbnVsbCBiZWZvcmUgdGhlIFVuaW9uLlxuICAgIGNvbnN0IGdldCA9IGdldFZpc2l0b3IuZ2V0VmlzaXRGbihkYXRhKTtcbiAgICBjb25zdCBjb21wYXJlID0gY3JlYXRlRWxlbWVudENvbXBhcmF0b3Ioc2VhcmNoRWxlbWVudCk7XG4gICAgZm9yIChsZXQgaSA9IChmcm9tSW5kZXggfHwgMCkgLSAxLCBuID0gZGF0YS5sZW5ndGg7ICsraSA8IG47KSB7XG4gICAgICAgIGlmIChjb21wYXJlKGdldChkYXRhLCBpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdE51bGwgPSBudWxsSW5kZXhPZjtcbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdEJvb2wgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnQgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnQ4ID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50MTYgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnQzMiA9IGluZGV4T2ZWYWx1ZTtcbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludDY0ID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0VWludDggPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRVaW50MTYgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRVaW50MzIgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRVaW50NjQgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRGbG9hdCA9IGluZGV4T2ZWYWx1ZTtcbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdEZsb2F0MTYgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRGbG9hdDMyID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0RmxvYXQ2NCA9IGluZGV4T2ZWYWx1ZTtcbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdFV0ZjggPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRCaW5hcnkgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRGaXhlZFNpemVCaW5hcnkgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXREYXRlID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGF0ZURheSA9IGluZGV4T2ZWYWx1ZTtcbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdERhdGVNaWxsaXNlY29uZCA9IGluZGV4T2ZWYWx1ZTtcbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcCA9IGluZGV4T2ZWYWx1ZTtcbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcFNlY29uZCA9IGluZGV4T2ZWYWx1ZTtcbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcE1pbGxpc2Vjb25kID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wTWljcm9zZWNvbmQgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBOYW5vc2Vjb25kID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZSA9IGluZGV4T2ZWYWx1ZTtcbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVTZWNvbmQgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lTWlsbGlzZWNvbmQgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lTWljcm9zZWNvbmQgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lTmFub3NlY29uZCA9IGluZGV4T2ZWYWx1ZTtcbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdERlY2ltYWwgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRMaXN0ID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0U3RydWN0ID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0VW5pb24gPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXREZW5zZVVuaW9uID0gaW5kZXhPZlVuaW9uO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0U3BhcnNlVW5pb24gPSBpbmRleE9mVW5pb247XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXREaWN0aW9uYXJ5ID0gaW5kZXhPZlZhbHVlO1xuSW5kZXhPZlZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50ZXJ2YWwgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnRlcnZhbERheVRpbWUgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnRlcnZhbFllYXJNb250aCA9IGluZGV4T2ZWYWx1ZTtcbkluZGV4T2ZWaXNpdG9yLnByb3RvdHlwZS52aXNpdEZpeGVkU2l6ZUxpc3QgPSBpbmRleE9mVmFsdWU7XG5JbmRleE9mVmlzaXRvci5wcm90b3R5cGUudmlzaXRNYXAgPSBpbmRleE9mVmFsdWU7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IGluc3RhbmNlID0gbmV3IEluZGV4T2ZWaXNpdG9yKCk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4b2YubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBWaXNpdG9yIH0gZnJvbSAnLi4vdmlzaXRvci5tanMnO1xuaW1wb3J0IHsgVHlwZSwgUHJlY2lzaW9uIH0gZnJvbSAnLi4vZW51bS5tanMnO1xuaW1wb3J0IHsgRmxvYXQsIEludCwgVGltZSwgfSBmcm9tICcuLi90eXBlLm1qcyc7XG5pbXBvcnQgeyBDaHVua2VkSXRlcmF0b3IgfSBmcm9tICcuLi91dGlsL2NodW5rLm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEl0ZXJhdG9yVmlzaXRvciBleHRlbmRzIFZpc2l0b3Ige1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIHZlY3Rvckl0ZXJhdG9yKHZlY3Rvcikge1xuICAgIGNvbnN0IHsgdHlwZSB9ID0gdmVjdG9yO1xuICAgIC8vIEZhc3QgY2FzZSwgZGVmZXIgdG8gbmF0aXZlIGl0ZXJhdG9ycyBpZiBwb3NzaWJsZVxuICAgIGlmICh2ZWN0b3IubnVsbENvdW50ID09PSAwICYmIHZlY3Rvci5zdHJpZGUgPT09IDEgJiYgKCh0eXBlLnR5cGVJZCA9PT0gVHlwZS5UaW1lc3RhbXApIHx8XG4gICAgICAgICh0eXBlIGluc3RhbmNlb2YgSW50ICYmIHR5cGUuYml0V2lkdGggIT09IDY0KSB8fFxuICAgICAgICAodHlwZSBpbnN0YW5jZW9mIFRpbWUgJiYgdHlwZS5iaXRXaWR0aCAhPT0gNjQpIHx8XG4gICAgICAgICh0eXBlIGluc3RhbmNlb2YgRmxvYXQgJiYgdHlwZS5wcmVjaXNpb24gIT09IFByZWNpc2lvbi5IQUxGKSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaHVua2VkSXRlcmF0b3IodmVjdG9yLmRhdGEubGVuZ3RoLCAoY2h1bmtJbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHZlY3Rvci5kYXRhW2NodW5rSW5kZXhdO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGEudmFsdWVzLnN1YmFycmF5KDAsIGRhdGEubGVuZ3RoKVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBPdGhlcndpc2UsIGl0ZXJhdGUgbWFudWFsbHlcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICByZXR1cm4gbmV3IENodW5rZWRJdGVyYXRvcih2ZWN0b3IuZGF0YS5sZW5ndGgsIChjaHVua0luZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB2ZWN0b3IuZGF0YVtjaHVua0luZGV4XTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGlubmVyID0gdmVjdG9yLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTtcbiAgICAgICAgb2Zmc2V0ICs9IGxlbmd0aDtcbiAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3JJdGVyYXRvcihpbm5lcik7XG4gICAgfSk7XG59XG4vKiogQGlnbm9yZSAqL1xuY2xhc3MgVmVjdG9ySXRlcmF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKHZlY3Rvcikge1xuICAgICAgICB0aGlzLnZlY3RvciA9IHZlY3RvcjtcbiAgICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIGlmICh0aGlzLmluZGV4IDwgdGhpcy52ZWN0b3IubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnZlY3Rvci5nZXQodGhpcy5pbmRleCsrKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogbnVsbCB9O1xuICAgIH1cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdE51bGwgPSB2ZWN0b3JJdGVyYXRvcjtcbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXRCb29sID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50ID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50OCA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludDE2ID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50MzIgPSB2ZWN0b3JJdGVyYXRvcjtcbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnQ2NCA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdFVpbnQ4ID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VWludDE2ID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VWludDMyID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VWludDY0ID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RmxvYXQgPSB2ZWN0b3JJdGVyYXRvcjtcbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXRGbG9hdDE2ID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RmxvYXQzMiA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdEZsb2F0NjQgPSB2ZWN0b3JJdGVyYXRvcjtcbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXRVdGY4ID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0QmluYXJ5ID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0Rml4ZWRTaXplQmluYXJ5ID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGF0ZSA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdERhdGVEYXkgPSB2ZWN0b3JJdGVyYXRvcjtcbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXREYXRlTWlsbGlzZWNvbmQgPSB2ZWN0b3JJdGVyYXRvcjtcbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXAgPSB2ZWN0b3JJdGVyYXRvcjtcbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBTZWNvbmQgPSB2ZWN0b3JJdGVyYXRvcjtcbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBNaWxsaXNlY29uZCA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcE1pY3Jvc2Vjb25kID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wTmFub3NlY29uZCA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWUgPSB2ZWN0b3JJdGVyYXRvcjtcbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lU2Vjb25kID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZU1pbGxpc2Vjb25kID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZU1pY3Jvc2Vjb25kID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZU5hbm9zZWNvbmQgPSB2ZWN0b3JJdGVyYXRvcjtcbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXREZWNpbWFsID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0TGlzdCA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdFN0cnVjdCA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdFVuaW9uID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVuc2VVbmlvbiA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdFNwYXJzZVVuaW9uID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGljdGlvbmFyeSA9IHZlY3Rvckl0ZXJhdG9yO1xuSXRlcmF0b3JWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludGVydmFsID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50ZXJ2YWxEYXlUaW1lID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50ZXJ2YWxZZWFyTW9udGggPSB2ZWN0b3JJdGVyYXRvcjtcbkl0ZXJhdG9yVmlzaXRvci5wcm90b3R5cGUudmlzaXRGaXhlZFNpemVMaXN0ID0gdmVjdG9ySXRlcmF0b3I7XG5JdGVyYXRvclZpc2l0b3IucHJvdG90eXBlLnZpc2l0TWFwID0gdmVjdG9ySXRlcmF0b3I7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IGluc3RhbmNlID0gbmV3IEl0ZXJhdG9yVmlzaXRvcigpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pdGVyYXRvci5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IFZpc2l0b3IgfSBmcm9tICcuLi92aXNpdG9yLm1qcyc7XG5pbXBvcnQgeyBUeXBlIGFzIEFycm93VHlwZSB9IGZyb20gJy4uL2ZiL3R5cGUubWpzJztcbmltcG9ydCB7IFByZWNpc2lvbiwgRGF0ZVVuaXQsIFRpbWVVbml0LCBJbnRlcnZhbFVuaXQsIFVuaW9uTW9kZSB9IGZyb20gJy4uL2VudW0ubWpzJztcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY2xhc3MgSlNPTlR5cGVBc3NlbWJsZXIgZXh0ZW5kcyBWaXNpdG9yIHtcbiAgICB2aXNpdChub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlID09IG51bGwgPyB1bmRlZmluZWQgOiBzdXBlci52aXNpdChub2RlKTtcbiAgICB9XG4gICAgdmlzaXROdWxsKHsgdHlwZUlkIH0pIHtcbiAgICAgICAgcmV0dXJuIHsgJ25hbWUnOiBBcnJvd1R5cGVbdHlwZUlkXS50b0xvd2VyQ2FzZSgpIH07XG4gICAgfVxuICAgIHZpc2l0SW50KHsgdHlwZUlkLCBiaXRXaWR0aCwgaXNTaWduZWQgfSkge1xuICAgICAgICByZXR1cm4geyAnbmFtZSc6IEFycm93VHlwZVt0eXBlSWRdLnRvTG93ZXJDYXNlKCksICdiaXRXaWR0aCc6IGJpdFdpZHRoLCAnaXNTaWduZWQnOiBpc1NpZ25lZCB9O1xuICAgIH1cbiAgICB2aXNpdEZsb2F0KHsgdHlwZUlkLCBwcmVjaXNpb24gfSkge1xuICAgICAgICByZXR1cm4geyAnbmFtZSc6IEFycm93VHlwZVt0eXBlSWRdLnRvTG93ZXJDYXNlKCksICdwcmVjaXNpb24nOiBQcmVjaXNpb25bcHJlY2lzaW9uXSB9O1xuICAgIH1cbiAgICB2aXNpdEJpbmFyeSh7IHR5cGVJZCB9KSB7XG4gICAgICAgIHJldHVybiB7ICduYW1lJzogQXJyb3dUeXBlW3R5cGVJZF0udG9Mb3dlckNhc2UoKSB9O1xuICAgIH1cbiAgICB2aXNpdEJvb2woeyB0eXBlSWQgfSkge1xuICAgICAgICByZXR1cm4geyAnbmFtZSc6IEFycm93VHlwZVt0eXBlSWRdLnRvTG93ZXJDYXNlKCkgfTtcbiAgICB9XG4gICAgdmlzaXRVdGY4KHsgdHlwZUlkIH0pIHtcbiAgICAgICAgcmV0dXJuIHsgJ25hbWUnOiBBcnJvd1R5cGVbdHlwZUlkXS50b0xvd2VyQ2FzZSgpIH07XG4gICAgfVxuICAgIHZpc2l0RGVjaW1hbCh7IHR5cGVJZCwgc2NhbGUsIHByZWNpc2lvbiwgYml0V2lkdGggfSkge1xuICAgICAgICByZXR1cm4geyAnbmFtZSc6IEFycm93VHlwZVt0eXBlSWRdLnRvTG93ZXJDYXNlKCksICdzY2FsZSc6IHNjYWxlLCAncHJlY2lzaW9uJzogcHJlY2lzaW9uLCAnYml0V2lkdGgnOiBiaXRXaWR0aCB9O1xuICAgIH1cbiAgICB2aXNpdERhdGUoeyB0eXBlSWQsIHVuaXQgfSkge1xuICAgICAgICByZXR1cm4geyAnbmFtZSc6IEFycm93VHlwZVt0eXBlSWRdLnRvTG93ZXJDYXNlKCksICd1bml0JzogRGF0ZVVuaXRbdW5pdF0gfTtcbiAgICB9XG4gICAgdmlzaXRUaW1lKHsgdHlwZUlkLCB1bml0LCBiaXRXaWR0aCB9KSB7XG4gICAgICAgIHJldHVybiB7ICduYW1lJzogQXJyb3dUeXBlW3R5cGVJZF0udG9Mb3dlckNhc2UoKSwgJ3VuaXQnOiBUaW1lVW5pdFt1bml0XSwgYml0V2lkdGggfTtcbiAgICB9XG4gICAgdmlzaXRUaW1lc3RhbXAoeyB0eXBlSWQsIHRpbWV6b25lLCB1bml0IH0pIHtcbiAgICAgICAgcmV0dXJuIHsgJ25hbWUnOiBBcnJvd1R5cGVbdHlwZUlkXS50b0xvd2VyQ2FzZSgpLCAndW5pdCc6IFRpbWVVbml0W3VuaXRdLCB0aW1lem9uZSB9O1xuICAgIH1cbiAgICB2aXNpdEludGVydmFsKHsgdHlwZUlkLCB1bml0IH0pIHtcbiAgICAgICAgcmV0dXJuIHsgJ25hbWUnOiBBcnJvd1R5cGVbdHlwZUlkXS50b0xvd2VyQ2FzZSgpLCAndW5pdCc6IEludGVydmFsVW5pdFt1bml0XSB9O1xuICAgIH1cbiAgICB2aXNpdExpc3QoeyB0eXBlSWQgfSkge1xuICAgICAgICByZXR1cm4geyAnbmFtZSc6IEFycm93VHlwZVt0eXBlSWRdLnRvTG93ZXJDYXNlKCkgfTtcbiAgICB9XG4gICAgdmlzaXRTdHJ1Y3QoeyB0eXBlSWQgfSkge1xuICAgICAgICByZXR1cm4geyAnbmFtZSc6IEFycm93VHlwZVt0eXBlSWRdLnRvTG93ZXJDYXNlKCkgfTtcbiAgICB9XG4gICAgdmlzaXRVbmlvbih7IHR5cGVJZCwgbW9kZSwgdHlwZUlkcyB9KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnbmFtZSc6IEFycm93VHlwZVt0eXBlSWRdLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAnbW9kZSc6IFVuaW9uTW9kZVttb2RlXSxcbiAgICAgICAgICAgICd0eXBlSWRzJzogWy4uLnR5cGVJZHNdXG4gICAgICAgIH07XG4gICAgfVxuICAgIHZpc2l0RGljdGlvbmFyeShub2RlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0KG5vZGUuZGljdGlvbmFyeSk7XG4gICAgfVxuICAgIHZpc2l0Rml4ZWRTaXplQmluYXJ5KHsgdHlwZUlkLCBieXRlV2lkdGggfSkge1xuICAgICAgICByZXR1cm4geyAnbmFtZSc6IEFycm93VHlwZVt0eXBlSWRdLnRvTG93ZXJDYXNlKCksICdieXRlV2lkdGgnOiBieXRlV2lkdGggfTtcbiAgICB9XG4gICAgdmlzaXRGaXhlZFNpemVMaXN0KHsgdHlwZUlkLCBsaXN0U2l6ZSB9KSB7XG4gICAgICAgIHJldHVybiB7ICduYW1lJzogQXJyb3dUeXBlW3R5cGVJZF0udG9Mb3dlckNhc2UoKSwgJ2xpc3RTaXplJzogbGlzdFNpemUgfTtcbiAgICB9XG4gICAgdmlzaXRNYXAoeyB0eXBlSWQsIGtleXNTb3J0ZWQgfSkge1xuICAgICAgICByZXR1cm4geyAnbmFtZSc6IEFycm93VHlwZVt0eXBlSWRdLnRvTG93ZXJDYXNlKCksICdrZXlzU29ydGVkJzoga2V5c1NvcnRlZCB9O1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9anNvbnR5cGVhc3NlbWJsZXIubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBCTiB9IGZyb20gJy4uL3V0aWwvYm4ubWpzJztcbmltcG9ydCB7IFZlY3RvciB9IGZyb20gJy4uL3ZlY3Rvci5tanMnO1xuaW1wb3J0IHsgVmlzaXRvciB9IGZyb20gJy4uL3Zpc2l0b3IubWpzJztcbmltcG9ydCB7IEJ1ZmZlclR5cGUgfSBmcm9tICcuLi9lbnVtLm1qcyc7XG5pbXBvcnQgeyBVbmlvbk1vZGUsIERhdGVVbml0LCBUaW1lVW5pdCB9IGZyb20gJy4uL2VudW0ubWpzJztcbmltcG9ydCB7IEJpdEl0ZXJhdG9yLCBnZXRCaXQsIGdldEJvb2wgfSBmcm9tICcuLi91dGlsL2JpdC5tanMnO1xuaW1wb3J0IHsgRGF0YVR5cGUsIH0gZnJvbSAnLi4vdHlwZS5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBKU09OVmVjdG9yQXNzZW1ibGVyIGV4dGVuZHMgVmlzaXRvciB7XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGFzc2VtYmxlKC4uLmJhdGNoZXMpIHtcbiAgICAgICAgY29uc3QgYXNzZW1sYmVyID0gbmV3IEpTT05WZWN0b3JBc3NlbWJsZXIoKTtcbiAgICAgICAgcmV0dXJuIGJhdGNoZXMubWFwKCh7IHNjaGVtYSwgZGF0YSB9KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXNzZW1sYmVyLnZpc2l0TWFueShzY2hlbWEuZmllbGRzLCBkYXRhLmNoaWxkcmVuKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHZpc2l0KHsgbmFtZSB9LCBkYXRhKSB7XG4gICAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBkYXRhO1xuICAgICAgICBjb25zdCB7IG9mZnNldCwgbnVsbENvdW50LCBudWxsQml0bWFwIH0gPSBkYXRhO1xuICAgICAgICBjb25zdCB0eXBlID0gRGF0YVR5cGUuaXNEaWN0aW9uYXJ5KGRhdGEudHlwZSkgPyBkYXRhLnR5cGUuaW5kaWNlcyA6IGRhdGEudHlwZTtcbiAgICAgICAgY29uc3QgYnVmZmVycyA9IE9iamVjdC5hc3NpZ24oW10sIGRhdGEuYnVmZmVycywgeyBbQnVmZmVyVHlwZS5WQUxJRElUWV06IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyAnbmFtZSc6IG5hbWUsICdjb3VudCc6IGxlbmd0aCwgJ1ZBTElESVRZJzogRGF0YVR5cGUuaXNOdWxsKHR5cGUpID8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgOiBudWxsQ291bnQgPD0gMCA/IEFycmF5LmZyb20oeyBsZW5ndGggfSwgKCkgPT4gMSlcbiAgICAgICAgICAgICAgICAgICAgOiBbLi4ubmV3IEJpdEl0ZXJhdG9yKG51bGxCaXRtYXAsIG9mZnNldCwgbGVuZ3RoLCBudWxsLCBnZXRCaXQpXSB9LCBzdXBlci52aXNpdChkYXRhLmNsb25lKHR5cGUsIG9mZnNldCwgbGVuZ3RoLCAwLCBidWZmZXJzKSkpO1xuICAgIH1cbiAgICB2aXNpdE51bGwoKSB7IHJldHVybiB7fTsgfVxuICAgIHZpc2l0Qm9vbCh7IHZhbHVlcywgb2Zmc2V0LCBsZW5ndGggfSkge1xuICAgICAgICByZXR1cm4geyAnREFUQSc6IFsuLi5uZXcgQml0SXRlcmF0b3IodmFsdWVzLCBvZmZzZXQsIGxlbmd0aCwgbnVsbCwgZ2V0Qm9vbCldIH07XG4gICAgfVxuICAgIHZpc2l0SW50KGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdEQVRBJzogZGF0YS50eXBlLmJpdFdpZHRoIDwgNjRcbiAgICAgICAgICAgICAgICA/IFsuLi5kYXRhLnZhbHVlc11cbiAgICAgICAgICAgICAgICA6IFsuLi5iaWdOdW1zVG9TdHJpbmdzKGRhdGEudmFsdWVzLCAyKV1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgdmlzaXRGbG9hdChkYXRhKSB7XG4gICAgICAgIHJldHVybiB7ICdEQVRBJzogWy4uLmRhdGEudmFsdWVzXSB9O1xuICAgIH1cbiAgICB2aXNpdFV0ZjgoZGF0YSkge1xuICAgICAgICByZXR1cm4geyAnREFUQSc6IFsuLi5uZXcgVmVjdG9yKFtkYXRhXSldLCAnT0ZGU0VUJzogWy4uLmRhdGEudmFsdWVPZmZzZXRzXSB9O1xuICAgIH1cbiAgICB2aXNpdEJpbmFyeShkYXRhKSB7XG4gICAgICAgIHJldHVybiB7ICdEQVRBJzogWy4uLmJpbmFyeVRvU3RyaW5nKG5ldyBWZWN0b3IoW2RhdGFdKSldLCBPRkZTRVQ6IFsuLi5kYXRhLnZhbHVlT2Zmc2V0c10gfTtcbiAgICB9XG4gICAgdmlzaXRGaXhlZFNpemVCaW5hcnkoZGF0YSkge1xuICAgICAgICByZXR1cm4geyAnREFUQSc6IFsuLi5iaW5hcnlUb1N0cmluZyhuZXcgVmVjdG9yKFtkYXRhXSkpXSB9O1xuICAgIH1cbiAgICB2aXNpdERhdGUoZGF0YSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ0RBVEEnOiBkYXRhLnR5cGUudW5pdCA9PT0gRGF0ZVVuaXQuREFZXG4gICAgICAgICAgICAgICAgPyBbLi4uZGF0YS52YWx1ZXNdXG4gICAgICAgICAgICAgICAgOiBbLi4uYmlnTnVtc1RvU3RyaW5ncyhkYXRhLnZhbHVlcywgMildXG4gICAgICAgIH07XG4gICAgfVxuICAgIHZpc2l0VGltZXN0YW1wKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHsgJ0RBVEEnOiBbLi4uYmlnTnVtc1RvU3RyaW5ncyhkYXRhLnZhbHVlcywgMildIH07XG4gICAgfVxuICAgIHZpc2l0VGltZShkYXRhKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnREFUQSc6IGRhdGEudHlwZS51bml0IDwgVGltZVVuaXQuTUlDUk9TRUNPTkRcbiAgICAgICAgICAgICAgICA/IFsuLi5kYXRhLnZhbHVlc11cbiAgICAgICAgICAgICAgICA6IFsuLi5iaWdOdW1zVG9TdHJpbmdzKGRhdGEudmFsdWVzLCAyKV1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgdmlzaXREZWNpbWFsKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHsgJ0RBVEEnOiBbLi4uYmlnTnVtc1RvU3RyaW5ncyhkYXRhLnZhbHVlcywgNCldIH07XG4gICAgfVxuICAgIHZpc2l0TGlzdChkYXRhKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnT0ZGU0VUJzogWy4uLmRhdGEudmFsdWVPZmZzZXRzXSxcbiAgICAgICAgICAgICdjaGlsZHJlbic6IHRoaXMudmlzaXRNYW55KGRhdGEudHlwZS5jaGlsZHJlbiwgZGF0YS5jaGlsZHJlbilcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdmlzaXRTdHJ1Y3QoZGF0YSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2NoaWxkcmVuJzogdGhpcy52aXNpdE1hbnkoZGF0YS50eXBlLmNoaWxkcmVuLCBkYXRhLmNoaWxkcmVuKVxuICAgICAgICB9O1xuICAgIH1cbiAgICB2aXNpdFVuaW9uKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdUWVBFJzogWy4uLmRhdGEudHlwZUlkc10sXG4gICAgICAgICAgICAnT0ZGU0VUJzogZGF0YS50eXBlLm1vZGUgPT09IFVuaW9uTW9kZS5EZW5zZSA/IFsuLi5kYXRhLnZhbHVlT2Zmc2V0c10gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAnY2hpbGRyZW4nOiB0aGlzLnZpc2l0TWFueShkYXRhLnR5cGUuY2hpbGRyZW4sIGRhdGEuY2hpbGRyZW4pXG4gICAgICAgIH07XG4gICAgfVxuICAgIHZpc2l0SW50ZXJ2YWwoZGF0YSkge1xuICAgICAgICByZXR1cm4geyAnREFUQSc6IFsuLi5kYXRhLnZhbHVlc10gfTtcbiAgICB9XG4gICAgdmlzaXRGaXhlZFNpemVMaXN0KGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdjaGlsZHJlbic6IHRoaXMudmlzaXRNYW55KGRhdGEudHlwZS5jaGlsZHJlbiwgZGF0YS5jaGlsZHJlbilcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdmlzaXRNYXAoZGF0YSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ09GRlNFVCc6IFsuLi5kYXRhLnZhbHVlT2Zmc2V0c10sXG4gICAgICAgICAgICAnY2hpbGRyZW4nOiB0aGlzLnZpc2l0TWFueShkYXRhLnR5cGUuY2hpbGRyZW4sIGRhdGEuY2hpbGRyZW4pXG4gICAgICAgIH07XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uKiBiaW5hcnlUb1N0cmluZyh2ZWN0b3IpIHtcbiAgICBmb3IgKGNvbnN0IG9jdGV0cyBvZiB2ZWN0b3IpIHtcbiAgICAgICAgeWllbGQgb2N0ZXRzLnJlZHVjZSgoc3RyLCBieXRlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYCR7c3RyfSR7KCcwJyArIChieXRlICYgMHhGRikudG9TdHJpbmcoMTYpKS5zbGljZSgtMil9YDtcbiAgICAgICAgfSwgJycpLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uKiBiaWdOdW1zVG9TdHJpbmdzKHZhbHVlcywgc3RyaWRlKSB7XG4gICAgY29uc3QgdTMycyA9IG5ldyBVaW50MzJBcnJheSh2YWx1ZXMuYnVmZmVyKTtcbiAgICBmb3IgKGxldCBpID0gLTEsIG4gPSB1MzJzLmxlbmd0aCAvIHN0cmlkZTsgKytpIDwgbjspIHtcbiAgICAgICAgeWllbGQgYCR7Qk4ubmV3KHUzMnMuc3ViYXJyYXkoKGkgKyAwKSAqIHN0cmlkZSwgKGkgKyAxKSAqIHN0cmlkZSksIGZhbHNlKX1gO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9anNvbnZlY3RvcmFzc2VtYmxlci5tanMubWFwXG4iLCIvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbi8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4vLyBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Vcbi8vIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4vLyBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4vLyB1bmRlciB0aGUgTGljZW5zZS5cbmltcG9ydCB7IFZlY3RvciB9IGZyb20gJy4uL3ZlY3Rvci5tanMnO1xuaW1wb3J0IHsgVmlzaXRvciB9IGZyb20gJy4uL3Zpc2l0b3IubWpzJztcbmltcG9ydCB7IGVuY29kZVV0ZjggfSBmcm9tICcuLi91dGlsL3V0ZjgubWpzJztcbmltcG9ydCB7IGZsb2F0NjRUb1VpbnQxNiB9IGZyb20gJy4uL3V0aWwvbWF0aC5tanMnO1xuaW1wb3J0IHsgVW5pb25Nb2RlLCBQcmVjaXNpb24sIERhdGVVbml0LCBUaW1lVW5pdCwgSW50ZXJ2YWxVbml0IH0gZnJvbSAnLi4vZW51bS5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBTZXRWaXNpdG9yIGV4dGVuZHMgVmlzaXRvciB7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gd3JhcFNldChmbikge1xuICAgIHJldHVybiAoZGF0YSwgXzEsIF8yKSA9PiB7XG4gICAgICAgIGlmIChkYXRhLnNldFZhbGlkKF8xLCBfMiAhPSBudWxsKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZuKGRhdGEsIF8xLCBfMik7XG4gICAgICAgIH1cbiAgICB9O1xufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBzZXRFcG9jaE1zVG9EYXlzID0gKGRhdGEsIGluZGV4LCBlcG9jaE1zKSA9PiB7IGRhdGFbaW5kZXhdID0gTWF0aC50cnVuYyhlcG9jaE1zIC8gODY0MDAwMDApOyB9O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBzZXRFcG9jaE1zVG9NaWxsaXNlY29uZHNMb25nID0gKGRhdGEsIGluZGV4LCBlcG9jaE1zKSA9PiB7XG4gICAgZGF0YVtpbmRleF0gPSBNYXRoLnRydW5jKGVwb2NoTXMgJSA0Mjk0OTY3Mjk2KTtcbiAgICBkYXRhW2luZGV4ICsgMV0gPSBNYXRoLnRydW5jKGVwb2NoTXMgLyA0Mjk0OTY3Mjk2KTtcbn07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IHNldEVwb2NoTXNUb01pY3Jvc2Vjb25kc0xvbmcgPSAoZGF0YSwgaW5kZXgsIGVwb2NoTXMpID0+IHtcbiAgICBkYXRhW2luZGV4XSA9IE1hdGgudHJ1bmMoKGVwb2NoTXMgKiAxMDAwKSAlIDQyOTQ5NjcyOTYpO1xuICAgIGRhdGFbaW5kZXggKyAxXSA9IE1hdGgudHJ1bmMoKGVwb2NoTXMgKiAxMDAwKSAvIDQyOTQ5NjcyOTYpO1xufTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3Qgc2V0RXBvY2hNc1RvTmFub3NlY29uZHNMb25nID0gKGRhdGEsIGluZGV4LCBlcG9jaE1zKSA9PiB7XG4gICAgZGF0YVtpbmRleF0gPSBNYXRoLnRydW5jKChlcG9jaE1zICogMTAwMDAwMCkgJSA0Mjk0OTY3Mjk2KTtcbiAgICBkYXRhW2luZGV4ICsgMV0gPSBNYXRoLnRydW5jKChlcG9jaE1zICogMTAwMDAwMCkgLyA0Mjk0OTY3Mjk2KTtcbn07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IHNldFZhcmlhYmxlV2lkdGhCeXRlcyA9ICh2YWx1ZXMsIHZhbHVlT2Zmc2V0cywgaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgaWYgKGluZGV4ICsgMSA8IHZhbHVlT2Zmc2V0cy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgeyBbaW5kZXhdOiB4LCBbaW5kZXggKyAxXTogeSB9ID0gdmFsdWVPZmZzZXRzO1xuICAgICAgICB2YWx1ZXMuc2V0KHZhbHVlLnN1YmFycmF5KDAsIHkgLSB4KSwgeCk7XG4gICAgfVxufTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBzZXRCb29sID0gKHsgb2Zmc2V0LCB2YWx1ZXMgfSwgaW5kZXgsIHZhbCkgPT4ge1xuICAgIGNvbnN0IGlkeCA9IG9mZnNldCArIGluZGV4O1xuICAgIHZhbCA/ICh2YWx1ZXNbaWR4ID4+IDNdIHw9ICgxIDw8IChpZHggJSA4KSkpIC8vIHRydWVcbiAgICAgICAgOiAodmFsdWVzW2lkeCA+PiAzXSAmPSB+KDEgPDwgKGlkeCAlIDgpKSk7IC8vIGZhbHNlXG59O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBzZXRJbnQgPSAoeyB2YWx1ZXMgfSwgaW5kZXgsIHZhbHVlKSA9PiB7IHZhbHVlc1tpbmRleF0gPSB2YWx1ZTsgfTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3Qgc2V0RmxvYXQgPSAoeyB2YWx1ZXMgfSwgaW5kZXgsIHZhbHVlKSA9PiB7IHZhbHVlc1tpbmRleF0gPSB2YWx1ZTsgfTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3Qgc2V0RmxvYXQxNiA9ICh7IHZhbHVlcyB9LCBpbmRleCwgdmFsdWUpID0+IHsgdmFsdWVzW2luZGV4XSA9IGZsb2F0NjRUb1VpbnQxNih2YWx1ZSk7IH07XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBzZXRBbnlGbG9hdCA9IChkYXRhLCBpbmRleCwgdmFsdWUpID0+IHtcbiAgICBzd2l0Y2ggKGRhdGEudHlwZS5wcmVjaXNpb24pIHtcbiAgICAgICAgY2FzZSBQcmVjaXNpb24uSEFMRjpcbiAgICAgICAgICAgIHJldHVybiBzZXRGbG9hdDE2KGRhdGEsIGluZGV4LCB2YWx1ZSk7XG4gICAgICAgIGNhc2UgUHJlY2lzaW9uLlNJTkdMRTpcbiAgICAgICAgY2FzZSBQcmVjaXNpb24uRE9VQkxFOlxuICAgICAgICAgICAgcmV0dXJuIHNldEZsb2F0KGRhdGEsIGluZGV4LCB2YWx1ZSk7XG4gICAgfVxufTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3Qgc2V0RGF0ZURheSA9ICh7IHZhbHVlcyB9LCBpbmRleCwgdmFsdWUpID0+IHsgc2V0RXBvY2hNc1RvRGF5cyh2YWx1ZXMsIGluZGV4LCB2YWx1ZS52YWx1ZU9mKCkpOyB9O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBzZXREYXRlTWlsbGlzZWNvbmQgPSAoeyB2YWx1ZXMgfSwgaW5kZXgsIHZhbHVlKSA9PiB7IHNldEVwb2NoTXNUb01pbGxpc2Vjb25kc0xvbmcodmFsdWVzLCBpbmRleCAqIDIsIHZhbHVlLnZhbHVlT2YoKSk7IH07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IHNldEZpeGVkU2l6ZUJpbmFyeSA9ICh7IHN0cmlkZSwgdmFsdWVzIH0sIGluZGV4LCB2YWx1ZSkgPT4geyB2YWx1ZXMuc2V0KHZhbHVlLnN1YmFycmF5KDAsIHN0cmlkZSksIHN0cmlkZSAqIGluZGV4KTsgfTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBzZXRCaW5hcnkgPSAoeyB2YWx1ZXMsIHZhbHVlT2Zmc2V0cyB9LCBpbmRleCwgdmFsdWUpID0+IHNldFZhcmlhYmxlV2lkdGhCeXRlcyh2YWx1ZXMsIHZhbHVlT2Zmc2V0cywgaW5kZXgsIHZhbHVlKTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBzZXRVdGY4ID0gKHsgdmFsdWVzLCB2YWx1ZU9mZnNldHMgfSwgaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgc2V0VmFyaWFibGVXaWR0aEJ5dGVzKHZhbHVlcywgdmFsdWVPZmZzZXRzLCBpbmRleCwgZW5jb2RlVXRmOCh2YWx1ZSkpO1xufTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5leHBvcnQgY29uc3Qgc2V0RGF0ZSA9IChkYXRhLCBpbmRleCwgdmFsdWUpID0+IHtcbiAgICBkYXRhLnR5cGUudW5pdCA9PT0gRGF0ZVVuaXQuREFZXG4gICAgICAgID8gc2V0RGF0ZURheShkYXRhLCBpbmRleCwgdmFsdWUpXG4gICAgICAgIDogc2V0RGF0ZU1pbGxpc2Vjb25kKGRhdGEsIGluZGV4LCB2YWx1ZSk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBzZXRUaW1lc3RhbXBTZWNvbmQgPSAoeyB2YWx1ZXMgfSwgaW5kZXgsIHZhbHVlKSA9PiBzZXRFcG9jaE1zVG9NaWxsaXNlY29uZHNMb25nKHZhbHVlcywgaW5kZXggKiAyLCB2YWx1ZSAvIDEwMDApO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBzZXRUaW1lc3RhbXBNaWxsaXNlY29uZCA9ICh7IHZhbHVlcyB9LCBpbmRleCwgdmFsdWUpID0+IHNldEVwb2NoTXNUb01pbGxpc2Vjb25kc0xvbmcodmFsdWVzLCBpbmRleCAqIDIsIHZhbHVlKTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3Qgc2V0VGltZXN0YW1wTWljcm9zZWNvbmQgPSAoeyB2YWx1ZXMgfSwgaW5kZXgsIHZhbHVlKSA9PiBzZXRFcG9jaE1zVG9NaWNyb3NlY29uZHNMb25nKHZhbHVlcywgaW5kZXggKiAyLCB2YWx1ZSk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IHNldFRpbWVzdGFtcE5hbm9zZWNvbmQgPSAoeyB2YWx1ZXMgfSwgaW5kZXgsIHZhbHVlKSA9PiBzZXRFcG9jaE1zVG9OYW5vc2Vjb25kc0xvbmcodmFsdWVzLCBpbmRleCAqIDIsIHZhbHVlKTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IHNldFRpbWVzdGFtcCA9IChkYXRhLCBpbmRleCwgdmFsdWUpID0+IHtcbiAgICBzd2l0Y2ggKGRhdGEudHlwZS51bml0KSB7XG4gICAgICAgIGNhc2UgVGltZVVuaXQuU0VDT05EOiByZXR1cm4gc2V0VGltZXN0YW1wU2Vjb25kKGRhdGEsIGluZGV4LCB2YWx1ZSk7XG4gICAgICAgIGNhc2UgVGltZVVuaXQuTUlMTElTRUNPTkQ6IHJldHVybiBzZXRUaW1lc3RhbXBNaWxsaXNlY29uZChkYXRhLCBpbmRleCwgdmFsdWUpO1xuICAgICAgICBjYXNlIFRpbWVVbml0Lk1JQ1JPU0VDT05EOiByZXR1cm4gc2V0VGltZXN0YW1wTWljcm9zZWNvbmQoZGF0YSwgaW5kZXgsIHZhbHVlKTtcbiAgICAgICAgY2FzZSBUaW1lVW5pdC5OQU5PU0VDT05EOiByZXR1cm4gc2V0VGltZXN0YW1wTmFub3NlY29uZChkYXRhLCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbn07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IHNldFRpbWVTZWNvbmQgPSAoeyB2YWx1ZXMgfSwgaW5kZXgsIHZhbHVlKSA9PiB7IHZhbHVlc1tpbmRleF0gPSB2YWx1ZTsgfTtcbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3Qgc2V0VGltZU1pbGxpc2Vjb25kID0gKHsgdmFsdWVzIH0sIGluZGV4LCB2YWx1ZSkgPT4geyB2YWx1ZXNbaW5kZXhdID0gdmFsdWU7IH07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IHNldFRpbWVNaWNyb3NlY29uZCA9ICh7IHZhbHVlcyB9LCBpbmRleCwgdmFsdWUpID0+IHsgdmFsdWVzW2luZGV4XSA9IHZhbHVlOyB9O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBzZXRUaW1lTmFub3NlY29uZCA9ICh7IHZhbHVlcyB9LCBpbmRleCwgdmFsdWUpID0+IHsgdmFsdWVzW2luZGV4XSA9IHZhbHVlOyB9O1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3Qgc2V0VGltZSA9IChkYXRhLCBpbmRleCwgdmFsdWUpID0+IHtcbiAgICBzd2l0Y2ggKGRhdGEudHlwZS51bml0KSB7XG4gICAgICAgIGNhc2UgVGltZVVuaXQuU0VDT05EOiByZXR1cm4gc2V0VGltZVNlY29uZChkYXRhLCBpbmRleCwgdmFsdWUpO1xuICAgICAgICBjYXNlIFRpbWVVbml0Lk1JTExJU0VDT05EOiByZXR1cm4gc2V0VGltZU1pbGxpc2Vjb25kKGRhdGEsIGluZGV4LCB2YWx1ZSk7XG4gICAgICAgIGNhc2UgVGltZVVuaXQuTUlDUk9TRUNPTkQ6IHJldHVybiBzZXRUaW1lTWljcm9zZWNvbmQoZGF0YSwgaW5kZXgsIHZhbHVlKTtcbiAgICAgICAgY2FzZSBUaW1lVW5pdC5OQU5PU0VDT05EOiByZXR1cm4gc2V0VGltZU5hbm9zZWNvbmQoZGF0YSwgaW5kZXgsIHZhbHVlKTtcbiAgICB9XG59O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBzZXREZWNpbWFsID0gKHsgdmFsdWVzLCBzdHJpZGUgfSwgaW5kZXgsIHZhbHVlKSA9PiB7IHZhbHVlcy5zZXQodmFsdWUuc3ViYXJyYXkoMCwgc3RyaWRlKSwgc3RyaWRlICogaW5kZXgpOyB9O1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IHNldExpc3QgPSAoZGF0YSwgaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgY29uc3QgdmFsdWVzID0gZGF0YS5jaGlsZHJlblswXTtcbiAgICBjb25zdCB2YWx1ZU9mZnNldHMgPSBkYXRhLnZhbHVlT2Zmc2V0cztcbiAgICBjb25zdCBzZXQgPSBpbnN0YW5jZS5nZXRWaXNpdEZuKHZhbHVlcyk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGZvciAobGV0IGlkeCA9IC0xLCBpdHIgPSB2YWx1ZU9mZnNldHNbaW5kZXhdLCBlbmQgPSB2YWx1ZU9mZnNldHNbaW5kZXggKyAxXTsgaXRyIDwgZW5kOykge1xuICAgICAgICAgICAgc2V0KHZhbHVlcywgaXRyKyssIHZhbHVlWysraWR4XSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGlkeCA9IC0xLCBpdHIgPSB2YWx1ZU9mZnNldHNbaW5kZXhdLCBlbmQgPSB2YWx1ZU9mZnNldHNbaW5kZXggKyAxXTsgaXRyIDwgZW5kOykge1xuICAgICAgICAgICAgc2V0KHZhbHVlcywgaXRyKyssIHZhbHVlLmdldCgrK2lkeCkpO1xuICAgICAgICB9XG4gICAgfVxufTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBzZXRNYXAgPSAoZGF0YSwgaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgY29uc3QgdmFsdWVzID0gZGF0YS5jaGlsZHJlblswXTtcbiAgICBjb25zdCB7IHZhbHVlT2Zmc2V0cyB9ID0gZGF0YTtcbiAgICBjb25zdCBzZXQgPSBpbnN0YW5jZS5nZXRWaXNpdEZuKHZhbHVlcyk7XG4gICAgbGV0IHsgW2luZGV4XTogaWR4LCBbaW5kZXggKyAxXTogZW5kIH0gPSB2YWx1ZU9mZnNldHM7XG4gICAgY29uc3QgZW50cmllcyA9IHZhbHVlIGluc3RhbmNlb2YgTWFwID8gdmFsdWUuZW50cmllcygpIDogT2JqZWN0LmVudHJpZXModmFsdWUpO1xuICAgIGZvciAoY29uc3QgdmFsIG9mIGVudHJpZXMpIHtcbiAgICAgICAgc2V0KHZhbHVlcywgaWR4LCB2YWwpO1xuICAgICAgICBpZiAoKytpZHggPj0gZW5kKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufTtcbi8qKiBAaWdub3JlICovIGNvbnN0IF9zZXRTdHJ1Y3RBcnJheVZhbHVlID0gKG8sIHYpID0+IChzZXQsIGMsIF8sIGkpID0+IGMgJiYgc2V0KGMsIG8sIHZbaV0pO1xuLyoqIEBpZ25vcmUgKi8gY29uc3QgX3NldFN0cnVjdFZlY3RvclZhbHVlID0gKG8sIHYpID0+IChzZXQsIGMsIF8sIGkpID0+IGMgJiYgc2V0KGMsIG8sIHYuZ2V0KGkpKTtcbi8qKiBAaWdub3JlICovIGNvbnN0IF9zZXRTdHJ1Y3RNYXBWYWx1ZSA9IChvLCB2KSA9PiAoc2V0LCBjLCBmLCBfKSA9PiBjICYmIHNldChjLCBvLCB2LmdldChmLm5hbWUpKTtcbi8qKiBAaWdub3JlICovIGNvbnN0IF9zZXRTdHJ1Y3RPYmplY3RWYWx1ZSA9IChvLCB2KSA9PiAoc2V0LCBjLCBmLCBfKSA9PiBjICYmIHNldChjLCBvLCB2W2YubmFtZV0pO1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IHNldFN0cnVjdCA9IChkYXRhLCBpbmRleCwgdmFsdWUpID0+IHtcbiAgICBjb25zdCBjaGlsZFNldHRlcnMgPSBkYXRhLnR5cGUuY2hpbGRyZW4ubWFwKChmKSA9PiBpbnN0YW5jZS5nZXRWaXNpdEZuKGYudHlwZSkpO1xuICAgIGNvbnN0IHNldCA9IHZhbHVlIGluc3RhbmNlb2YgTWFwID8gX3NldFN0cnVjdE1hcFZhbHVlKGluZGV4LCB2YWx1ZSkgOlxuICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIFZlY3RvciA/IF9zZXRTdHJ1Y3RWZWN0b3JWYWx1ZShpbmRleCwgdmFsdWUpIDpcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpID8gX3NldFN0cnVjdEFycmF5VmFsdWUoaW5kZXgsIHZhbHVlKSA6XG4gICAgICAgICAgICAgICAgX3NldFN0cnVjdE9iamVjdFZhbHVlKGluZGV4LCB2YWx1ZSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tYXJyYXktZm9yLWVhY2hcbiAgICBkYXRhLnR5cGUuY2hpbGRyZW4uZm9yRWFjaCgoZiwgaSkgPT4gc2V0KGNoaWxkU2V0dGVyc1tpXSwgZGF0YS5jaGlsZHJlbltpXSwgZiwgaSkpO1xufTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiogQGlnbm9yZSAqL1xuY29uc3Qgc2V0VW5pb24gPSAoZGF0YSwgaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgZGF0YS50eXBlLm1vZGUgPT09IFVuaW9uTW9kZS5EZW5zZSA/XG4gICAgICAgIHNldERlbnNlVW5pb24oZGF0YSwgaW5kZXgsIHZhbHVlKSA6XG4gICAgICAgIHNldFNwYXJzZVVuaW9uKGRhdGEsIGluZGV4LCB2YWx1ZSk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IHNldERlbnNlVW5pb24gPSAoZGF0YSwgaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgY29uc3QgY2hpbGRJbmRleCA9IGRhdGEudHlwZS50eXBlSWRUb0NoaWxkSW5kZXhbZGF0YS50eXBlSWRzW2luZGV4XV07XG4gICAgY29uc3QgY2hpbGQgPSBkYXRhLmNoaWxkcmVuW2NoaWxkSW5kZXhdO1xuICAgIGluc3RhbmNlLnZpc2l0KGNoaWxkLCBkYXRhLnZhbHVlT2Zmc2V0c1tpbmRleF0sIHZhbHVlKTtcbn07XG4vKiogQGlnbm9yZSAqL1xuY29uc3Qgc2V0U3BhcnNlVW5pb24gPSAoZGF0YSwgaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgY29uc3QgY2hpbGRJbmRleCA9IGRhdGEudHlwZS50eXBlSWRUb0NoaWxkSW5kZXhbZGF0YS50eXBlSWRzW2luZGV4XV07XG4gICAgY29uc3QgY2hpbGQgPSBkYXRhLmNoaWxkcmVuW2NoaWxkSW5kZXhdO1xuICAgIGluc3RhbmNlLnZpc2l0KGNoaWxkLCBpbmRleCwgdmFsdWUpO1xufTtcbi8qKiBAaWdub3JlICovXG5jb25zdCBzZXREaWN0aW9uYXJ5ID0gKGRhdGEsIGluZGV4LCB2YWx1ZSkgPT4ge1xuICAgIHZhciBfYTtcbiAgICAoX2EgPSBkYXRhLmRpY3Rpb25hcnkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZXQoZGF0YS52YWx1ZXNbaW5kZXhdLCB2YWx1ZSk7XG59O1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbi8qKiBAaWdub3JlICovXG5leHBvcnQgY29uc3Qgc2V0SW50ZXJ2YWxWYWx1ZSA9IChkYXRhLCBpbmRleCwgdmFsdWUpID0+IHtcbiAgICAoZGF0YS50eXBlLnVuaXQgPT09IEludGVydmFsVW5pdC5EQVlfVElNRSlcbiAgICAgICAgPyBzZXRJbnRlcnZhbERheVRpbWUoZGF0YSwgaW5kZXgsIHZhbHVlKVxuICAgICAgICA6IHNldEludGVydmFsWWVhck1vbnRoKGRhdGEsIGluZGV4LCB2YWx1ZSk7XG59O1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBzZXRJbnRlcnZhbERheVRpbWUgPSAoeyB2YWx1ZXMgfSwgaW5kZXgsIHZhbHVlKSA9PiB7IHZhbHVlcy5zZXQodmFsdWUuc3ViYXJyYXkoMCwgMiksIDIgKiBpbmRleCk7IH07XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IHNldEludGVydmFsWWVhck1vbnRoID0gKHsgdmFsdWVzIH0sIGluZGV4LCB2YWx1ZSkgPT4geyB2YWx1ZXNbaW5kZXhdID0gKHZhbHVlWzBdICogMTIpICsgKHZhbHVlWzFdICUgMTIpOyB9O1xuLyoqIEBpZ25vcmUgKi9cbmNvbnN0IHNldEZpeGVkU2l6ZUxpc3QgPSAoZGF0YSwgaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgY29uc3QgeyBzdHJpZGUgfSA9IGRhdGE7XG4gICAgY29uc3QgY2hpbGQgPSBkYXRhLmNoaWxkcmVuWzBdO1xuICAgIGNvbnN0IHNldCA9IGluc3RhbmNlLmdldFZpc2l0Rm4oY2hpbGQpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBmb3IgKGxldCBpZHggPSAtMSwgb2Zmc2V0ID0gaW5kZXggKiBzdHJpZGU7ICsraWR4IDwgc3RyaWRlOykge1xuICAgICAgICAgICAgc2V0KGNoaWxkLCBvZmZzZXQgKyBpZHgsIHZhbHVlW2lkeF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpZHggPSAtMSwgb2Zmc2V0ID0gaW5kZXggKiBzdHJpZGU7ICsraWR4IDwgc3RyaWRlOykge1xuICAgICAgICAgICAgc2V0KGNoaWxkLCBvZmZzZXQgKyBpZHgsIHZhbHVlLmdldChpZHgpKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdEJvb2wgPSB3cmFwU2V0KHNldEJvb2wpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnQgPSB3cmFwU2V0KHNldEludCk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludDggPSB3cmFwU2V0KHNldEludCk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludDE2ID0gd3JhcFNldChzZXRJbnQpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnQzMiA9IHdyYXBTZXQoc2V0SW50KTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50NjQgPSB3cmFwU2V0KHNldEludCk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFVpbnQ4ID0gd3JhcFNldChzZXRJbnQpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRVaW50MTYgPSB3cmFwU2V0KHNldEludCk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFVpbnQzMiA9IHdyYXBTZXQoc2V0SW50KTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VWludDY0ID0gd3JhcFNldChzZXRJbnQpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRGbG9hdCA9IHdyYXBTZXQoc2V0QW55RmxvYXQpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRGbG9hdDE2ID0gd3JhcFNldChzZXRGbG9hdDE2KTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0RmxvYXQzMiA9IHdyYXBTZXQoc2V0RmxvYXQpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRGbG9hdDY0ID0gd3JhcFNldChzZXRGbG9hdCk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFV0ZjggPSB3cmFwU2V0KHNldFV0ZjgpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRCaW5hcnkgPSB3cmFwU2V0KHNldEJpbmFyeSk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdEZpeGVkU2l6ZUJpbmFyeSA9IHdyYXBTZXQoc2V0Rml4ZWRTaXplQmluYXJ5KTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGF0ZSA9IHdyYXBTZXQoc2V0RGF0ZSk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdERhdGVEYXkgPSB3cmFwU2V0KHNldERhdGVEYXkpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXREYXRlTWlsbGlzZWNvbmQgPSB3cmFwU2V0KHNldERhdGVNaWxsaXNlY29uZCk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcCA9IHdyYXBTZXQoc2V0VGltZXN0YW1wKTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wU2Vjb25kID0gd3JhcFNldChzZXRUaW1lc3RhbXBTZWNvbmQpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBNaWxsaXNlY29uZCA9IHdyYXBTZXQoc2V0VGltZXN0YW1wTWlsbGlzZWNvbmQpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBNaWNyb3NlY29uZCA9IHdyYXBTZXQoc2V0VGltZXN0YW1wTWljcm9zZWNvbmQpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBOYW5vc2Vjb25kID0gd3JhcFNldChzZXRUaW1lc3RhbXBOYW5vc2Vjb25kKTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZSA9IHdyYXBTZXQoc2V0VGltZSk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVTZWNvbmQgPSB3cmFwU2V0KHNldFRpbWVTZWNvbmQpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRUaW1lTWlsbGlzZWNvbmQgPSB3cmFwU2V0KHNldFRpbWVNaWxsaXNlY29uZCk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRpbWVNaWNyb3NlY29uZCA9IHdyYXBTZXQoc2V0VGltZU1pY3Jvc2Vjb25kKTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGltZU5hbm9zZWNvbmQgPSB3cmFwU2V0KHNldFRpbWVOYW5vc2Vjb25kKTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVjaW1hbCA9IHdyYXBTZXQoc2V0RGVjaW1hbCk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdExpc3QgPSB3cmFwU2V0KHNldExpc3QpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRTdHJ1Y3QgPSB3cmFwU2V0KHNldFN0cnVjdCk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdFVuaW9uID0gd3JhcFNldChzZXRVbmlvbik7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdERlbnNlVW5pb24gPSB3cmFwU2V0KHNldERlbnNlVW5pb24pO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRTcGFyc2VVbmlvbiA9IHdyYXBTZXQoc2V0U3BhcnNlVW5pb24pO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXREaWN0aW9uYXJ5ID0gd3JhcFNldChzZXREaWN0aW9uYXJ5KTtcblNldFZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50ZXJ2YWwgPSB3cmFwU2V0KHNldEludGVydmFsVmFsdWUpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnRlcnZhbERheVRpbWUgPSB3cmFwU2V0KHNldEludGVydmFsRGF5VGltZSk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludGVydmFsWWVhck1vbnRoID0gd3JhcFNldChzZXRJbnRlcnZhbFllYXJNb250aCk7XG5TZXRWaXNpdG9yLnByb3RvdHlwZS52aXNpdEZpeGVkU2l6ZUxpc3QgPSB3cmFwU2V0KHNldEZpeGVkU2l6ZUxpc3QpO1xuU2V0VmlzaXRvci5wcm90b3R5cGUudmlzaXRNYXAgPSB3cmFwU2V0KHNldE1hcCk7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IGluc3RhbmNlID0gbmV3IFNldFZpc2l0b3IoKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2V0Lm1qcy5tYXBcbiIsIi8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbi8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbi8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbi8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbi8vIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4vL1xuLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbi8vIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbi8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbi8vIHVuZGVyIHRoZSBMaWNlbnNlLlxuaW1wb3J0ICogYXMgZmxhdGJ1ZmZlcnMgZnJvbSAnZmxhdGJ1ZmZlcnMnO1xudmFyIExvbmcgPSBmbGF0YnVmZmVycy5Mb25nO1xuaW1wb3J0IHsgVmlzaXRvciB9IGZyb20gJy4uL3Zpc2l0b3IubWpzJztcbmltcG9ydCB7IE51bGwgfSBmcm9tICcuLi9mYi9udWxsLm1qcyc7XG5pbXBvcnQgeyBJbnQgfSBmcm9tICcuLi9mYi9pbnQubWpzJztcbmltcG9ydCB7IEZsb2F0aW5nUG9pbnQgfSBmcm9tICcuLi9mYi9mbG9hdGluZy1wb2ludC5tanMnO1xuaW1wb3J0IHsgQmluYXJ5IH0gZnJvbSAnLi4vZmIvYmluYXJ5Lm1qcyc7XG5pbXBvcnQgeyBCb29sIH0gZnJvbSAnLi4vZmIvYm9vbC5tanMnO1xuaW1wb3J0IHsgVXRmOCB9IGZyb20gJy4uL2ZiL3V0ZjgubWpzJztcbmltcG9ydCB7IERlY2ltYWwgfSBmcm9tICcuLi9mYi9kZWNpbWFsLm1qcyc7XG5pbXBvcnQgeyBEYXRlIH0gZnJvbSAnLi4vZmIvZGF0ZS5tanMnO1xuaW1wb3J0IHsgVGltZSB9IGZyb20gJy4uL2ZiL3RpbWUubWpzJztcbmltcG9ydCB7IFRpbWVzdGFtcCB9IGZyb20gJy4uL2ZiL3RpbWVzdGFtcC5tanMnO1xuaW1wb3J0IHsgSW50ZXJ2YWwgfSBmcm9tICcuLi9mYi9pbnRlcnZhbC5tanMnO1xuaW1wb3J0IHsgTGlzdCB9IGZyb20gJy4uL2ZiL2xpc3QubWpzJztcbmltcG9ydCB7IFN0cnVjdF8gYXMgU3RydWN0IH0gZnJvbSAnLi4vZmIvc3RydWN0Xy5tanMnO1xuaW1wb3J0IHsgVW5pb24gfSBmcm9tICcuLi9mYi91bmlvbi5tanMnO1xuaW1wb3J0IHsgRGljdGlvbmFyeUVuY29kaW5nIH0gZnJvbSAnLi4vZmIvZGljdGlvbmFyeS1lbmNvZGluZy5tanMnO1xuaW1wb3J0IHsgRml4ZWRTaXplQmluYXJ5IH0gZnJvbSAnLi4vZmIvZml4ZWQtc2l6ZS1iaW5hcnkubWpzJztcbmltcG9ydCB7IEZpeGVkU2l6ZUxpc3QgfSBmcm9tICcuLi9mYi9maXhlZC1zaXplLWxpc3QubWpzJztcbmltcG9ydCB7IE1hcCBhcyBNYXBfIH0gZnJvbSAnLi4vZmIvbWFwLm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFR5cGVBc3NlbWJsZXIgZXh0ZW5kcyBWaXNpdG9yIHtcbiAgICB2aXNpdChub2RlLCBidWlsZGVyKSB7XG4gICAgICAgIHJldHVybiAobm9kZSA9PSBudWxsIHx8IGJ1aWxkZXIgPT0gbnVsbCkgPyB1bmRlZmluZWQgOiBzdXBlci52aXNpdChub2RlLCBidWlsZGVyKTtcbiAgICB9XG4gICAgdmlzaXROdWxsKF9ub2RlLCBiKSB7XG4gICAgICAgIE51bGwuc3RhcnROdWxsKGIpO1xuICAgICAgICByZXR1cm4gTnVsbC5lbmROdWxsKGIpO1xuICAgIH1cbiAgICB2aXNpdEludChub2RlLCBiKSB7XG4gICAgICAgIEludC5zdGFydEludChiKTtcbiAgICAgICAgSW50LmFkZEJpdFdpZHRoKGIsIG5vZGUuYml0V2lkdGgpO1xuICAgICAgICBJbnQuYWRkSXNTaWduZWQoYiwgbm9kZS5pc1NpZ25lZCk7XG4gICAgICAgIHJldHVybiBJbnQuZW5kSW50KGIpO1xuICAgIH1cbiAgICB2aXNpdEZsb2F0KG5vZGUsIGIpIHtcbiAgICAgICAgRmxvYXRpbmdQb2ludC5zdGFydEZsb2F0aW5nUG9pbnQoYik7XG4gICAgICAgIEZsb2F0aW5nUG9pbnQuYWRkUHJlY2lzaW9uKGIsIG5vZGUucHJlY2lzaW9uKTtcbiAgICAgICAgcmV0dXJuIEZsb2F0aW5nUG9pbnQuZW5kRmxvYXRpbmdQb2ludChiKTtcbiAgICB9XG4gICAgdmlzaXRCaW5hcnkoX25vZGUsIGIpIHtcbiAgICAgICAgQmluYXJ5LnN0YXJ0QmluYXJ5KGIpO1xuICAgICAgICByZXR1cm4gQmluYXJ5LmVuZEJpbmFyeShiKTtcbiAgICB9XG4gICAgdmlzaXRCb29sKF9ub2RlLCBiKSB7XG4gICAgICAgIEJvb2wuc3RhcnRCb29sKGIpO1xuICAgICAgICByZXR1cm4gQm9vbC5lbmRCb29sKGIpO1xuICAgIH1cbiAgICB2aXNpdFV0ZjgoX25vZGUsIGIpIHtcbiAgICAgICAgVXRmOC5zdGFydFV0ZjgoYik7XG4gICAgICAgIHJldHVybiBVdGY4LmVuZFV0ZjgoYik7XG4gICAgfVxuICAgIHZpc2l0RGVjaW1hbChub2RlLCBiKSB7XG4gICAgICAgIERlY2ltYWwuc3RhcnREZWNpbWFsKGIpO1xuICAgICAgICBEZWNpbWFsLmFkZFNjYWxlKGIsIG5vZGUuc2NhbGUpO1xuICAgICAgICBEZWNpbWFsLmFkZFByZWNpc2lvbihiLCBub2RlLnByZWNpc2lvbik7XG4gICAgICAgIERlY2ltYWwuYWRkQml0V2lkdGgoYiwgbm9kZS5iaXRXaWR0aCk7XG4gICAgICAgIHJldHVybiBEZWNpbWFsLmVuZERlY2ltYWwoYik7XG4gICAgfVxuICAgIHZpc2l0RGF0ZShub2RlLCBiKSB7XG4gICAgICAgIERhdGUuc3RhcnREYXRlKGIpO1xuICAgICAgICBEYXRlLmFkZFVuaXQoYiwgbm9kZS51bml0KTtcbiAgICAgICAgcmV0dXJuIERhdGUuZW5kRGF0ZShiKTtcbiAgICB9XG4gICAgdmlzaXRUaW1lKG5vZGUsIGIpIHtcbiAgICAgICAgVGltZS5zdGFydFRpbWUoYik7XG4gICAgICAgIFRpbWUuYWRkVW5pdChiLCBub2RlLnVuaXQpO1xuICAgICAgICBUaW1lLmFkZEJpdFdpZHRoKGIsIG5vZGUuYml0V2lkdGgpO1xuICAgICAgICByZXR1cm4gVGltZS5lbmRUaW1lKGIpO1xuICAgIH1cbiAgICB2aXNpdFRpbWVzdGFtcChub2RlLCBiKSB7XG4gICAgICAgIGNvbnN0IHRpbWV6b25lID0gKG5vZGUudGltZXpvbmUgJiYgYi5jcmVhdGVTdHJpbmcobm9kZS50aW1lem9uZSkpIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgVGltZXN0YW1wLnN0YXJ0VGltZXN0YW1wKGIpO1xuICAgICAgICBUaW1lc3RhbXAuYWRkVW5pdChiLCBub2RlLnVuaXQpO1xuICAgICAgICBpZiAodGltZXpvbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgVGltZXN0YW1wLmFkZFRpbWV6b25lKGIsIHRpbWV6b25lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVGltZXN0YW1wLmVuZFRpbWVzdGFtcChiKTtcbiAgICB9XG4gICAgdmlzaXRJbnRlcnZhbChub2RlLCBiKSB7XG4gICAgICAgIEludGVydmFsLnN0YXJ0SW50ZXJ2YWwoYik7XG4gICAgICAgIEludGVydmFsLmFkZFVuaXQoYiwgbm9kZS51bml0KTtcbiAgICAgICAgcmV0dXJuIEludGVydmFsLmVuZEludGVydmFsKGIpO1xuICAgIH1cbiAgICB2aXNpdExpc3QoX25vZGUsIGIpIHtcbiAgICAgICAgTGlzdC5zdGFydExpc3QoYik7XG4gICAgICAgIHJldHVybiBMaXN0LmVuZExpc3QoYik7XG4gICAgfVxuICAgIHZpc2l0U3RydWN0KF9ub2RlLCBiKSB7XG4gICAgICAgIFN0cnVjdC5zdGFydFN0cnVjdF8oYik7XG4gICAgICAgIHJldHVybiBTdHJ1Y3QuZW5kU3RydWN0XyhiKTtcbiAgICB9XG4gICAgdmlzaXRVbmlvbihub2RlLCBiKSB7XG4gICAgICAgIFVuaW9uLnN0YXJ0VHlwZUlkc1ZlY3RvcihiLCBub2RlLnR5cGVJZHMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgdHlwZUlkcyA9IFVuaW9uLmNyZWF0ZVR5cGVJZHNWZWN0b3IoYiwgbm9kZS50eXBlSWRzKTtcbiAgICAgICAgVW5pb24uc3RhcnRVbmlvbihiKTtcbiAgICAgICAgVW5pb24uYWRkTW9kZShiLCBub2RlLm1vZGUpO1xuICAgICAgICBVbmlvbi5hZGRUeXBlSWRzKGIsIHR5cGVJZHMpO1xuICAgICAgICByZXR1cm4gVW5pb24uZW5kVW5pb24oYik7XG4gICAgfVxuICAgIHZpc2l0RGljdGlvbmFyeShub2RlLCBiKSB7XG4gICAgICAgIGNvbnN0IGluZGV4VHlwZSA9IHRoaXMudmlzaXQobm9kZS5pbmRpY2VzLCBiKTtcbiAgICAgICAgRGljdGlvbmFyeUVuY29kaW5nLnN0YXJ0RGljdGlvbmFyeUVuY29kaW5nKGIpO1xuICAgICAgICBEaWN0aW9uYXJ5RW5jb2RpbmcuYWRkSWQoYiwgbmV3IExvbmcobm9kZS5pZCwgMCkpO1xuICAgICAgICBEaWN0aW9uYXJ5RW5jb2RpbmcuYWRkSXNPcmRlcmVkKGIsIG5vZGUuaXNPcmRlcmVkKTtcbiAgICAgICAgaWYgKGluZGV4VHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBEaWN0aW9uYXJ5RW5jb2RpbmcuYWRkSW5kZXhUeXBlKGIsIGluZGV4VHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIERpY3Rpb25hcnlFbmNvZGluZy5lbmREaWN0aW9uYXJ5RW5jb2RpbmcoYik7XG4gICAgfVxuICAgIHZpc2l0Rml4ZWRTaXplQmluYXJ5KG5vZGUsIGIpIHtcbiAgICAgICAgRml4ZWRTaXplQmluYXJ5LnN0YXJ0Rml4ZWRTaXplQmluYXJ5KGIpO1xuICAgICAgICBGaXhlZFNpemVCaW5hcnkuYWRkQnl0ZVdpZHRoKGIsIG5vZGUuYnl0ZVdpZHRoKTtcbiAgICAgICAgcmV0dXJuIEZpeGVkU2l6ZUJpbmFyeS5lbmRGaXhlZFNpemVCaW5hcnkoYik7XG4gICAgfVxuICAgIHZpc2l0Rml4ZWRTaXplTGlzdChub2RlLCBiKSB7XG4gICAgICAgIEZpeGVkU2l6ZUxpc3Quc3RhcnRGaXhlZFNpemVMaXN0KGIpO1xuICAgICAgICBGaXhlZFNpemVMaXN0LmFkZExpc3RTaXplKGIsIG5vZGUubGlzdFNpemUpO1xuICAgICAgICByZXR1cm4gRml4ZWRTaXplTGlzdC5lbmRGaXhlZFNpemVMaXN0KGIpO1xuICAgIH1cbiAgICB2aXNpdE1hcChub2RlLCBiKSB7XG4gICAgICAgIE1hcF8uc3RhcnRNYXAoYik7XG4gICAgICAgIE1hcF8uYWRkS2V5c1NvcnRlZChiLCBub2RlLmtleXNTb3J0ZWQpO1xuICAgICAgICByZXR1cm4gTWFwXy5lbmRNYXAoYik7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjb25zdCBpbnN0YW5jZSA9IG5ldyBUeXBlQXNzZW1ibGVyKCk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVhc3NlbWJsZXIubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBWaXNpdG9yIH0gZnJvbSAnLi4vdmlzaXRvci5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBUeXBlQ29tcGFyYXRvciBleHRlbmRzIFZpc2l0b3Ige1xuICAgIGNvbXBhcmVTY2hlbWFzKHNjaGVtYSwgb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIChzY2hlbWEgPT09IG90aGVyKSB8fCAob3RoZXIgaW5zdGFuY2VvZiBzY2hlbWEuY29uc3RydWN0b3IgJiZcbiAgICAgICAgICAgIHRoaXMuY29tcGFyZU1hbnlGaWVsZHMoc2NoZW1hLmZpZWxkcywgb3RoZXIuZmllbGRzKSk7XG4gICAgfVxuICAgIGNvbXBhcmVNYW55RmllbGRzKGZpZWxkcywgb3RoZXJzKSB7XG4gICAgICAgIHJldHVybiAoZmllbGRzID09PSBvdGhlcnMpIHx8IChBcnJheS5pc0FycmF5KGZpZWxkcykgJiZcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkob3RoZXJzKSAmJlxuICAgICAgICAgICAgZmllbGRzLmxlbmd0aCA9PT0gb3RoZXJzLmxlbmd0aCAmJlxuICAgICAgICAgICAgZmllbGRzLmV2ZXJ5KChmLCBpKSA9PiB0aGlzLmNvbXBhcmVGaWVsZHMoZiwgb3RoZXJzW2ldKSkpO1xuICAgIH1cbiAgICBjb21wYXJlRmllbGRzKGZpZWxkLCBvdGhlcikge1xuICAgICAgICByZXR1cm4gKGZpZWxkID09PSBvdGhlcikgfHwgKG90aGVyIGluc3RhbmNlb2YgZmllbGQuY29uc3RydWN0b3IgJiZcbiAgICAgICAgICAgIGZpZWxkLm5hbWUgPT09IG90aGVyLm5hbWUgJiZcbiAgICAgICAgICAgIGZpZWxkLm51bGxhYmxlID09PSBvdGhlci5udWxsYWJsZSAmJlxuICAgICAgICAgICAgdGhpcy52aXNpdChmaWVsZC50eXBlLCBvdGhlci50eXBlKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcGFyZUNvbnN0cnVjdG9yKHR5cGUsIG90aGVyKSB7XG4gICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgdHlwZS5jb25zdHJ1Y3Rvcjtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVBbnkodHlwZSwgb3RoZXIpIHtcbiAgICByZXR1cm4gKHR5cGUgPT09IG90aGVyKSB8fCBjb21wYXJlQ29uc3RydWN0b3IodHlwZSwgb3RoZXIpO1xufVxuZnVuY3Rpb24gY29tcGFyZUludCh0eXBlLCBvdGhlcikge1xuICAgIHJldHVybiAodHlwZSA9PT0gb3RoZXIpIHx8IChjb21wYXJlQ29uc3RydWN0b3IodHlwZSwgb3RoZXIpICYmXG4gICAgICAgIHR5cGUuYml0V2lkdGggPT09IG90aGVyLmJpdFdpZHRoICYmXG4gICAgICAgIHR5cGUuaXNTaWduZWQgPT09IG90aGVyLmlzU2lnbmVkKTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVGbG9hdCh0eXBlLCBvdGhlcikge1xuICAgIHJldHVybiAodHlwZSA9PT0gb3RoZXIpIHx8IChjb21wYXJlQ29uc3RydWN0b3IodHlwZSwgb3RoZXIpICYmXG4gICAgICAgIHR5cGUucHJlY2lzaW9uID09PSBvdGhlci5wcmVjaXNpb24pO1xufVxuZnVuY3Rpb24gY29tcGFyZUZpeGVkU2l6ZUJpbmFyeSh0eXBlLCBvdGhlcikge1xuICAgIHJldHVybiAodHlwZSA9PT0gb3RoZXIpIHx8IChjb21wYXJlQ29uc3RydWN0b3IodHlwZSwgb3RoZXIpICYmXG4gICAgICAgIHR5cGUuYnl0ZVdpZHRoID09PSBvdGhlci5ieXRlV2lkdGgpO1xufVxuZnVuY3Rpb24gY29tcGFyZURhdGUodHlwZSwgb3RoZXIpIHtcbiAgICByZXR1cm4gKHR5cGUgPT09IG90aGVyKSB8fCAoY29tcGFyZUNvbnN0cnVjdG9yKHR5cGUsIG90aGVyKSAmJlxuICAgICAgICB0eXBlLnVuaXQgPT09IG90aGVyLnVuaXQpO1xufVxuZnVuY3Rpb24gY29tcGFyZVRpbWVzdGFtcCh0eXBlLCBvdGhlcikge1xuICAgIHJldHVybiAodHlwZSA9PT0gb3RoZXIpIHx8IChjb21wYXJlQ29uc3RydWN0b3IodHlwZSwgb3RoZXIpICYmXG4gICAgICAgIHR5cGUudW5pdCA9PT0gb3RoZXIudW5pdCAmJlxuICAgICAgICB0eXBlLnRpbWV6b25lID09PSBvdGhlci50aW1lem9uZSk7XG59XG5mdW5jdGlvbiBjb21wYXJlVGltZSh0eXBlLCBvdGhlcikge1xuICAgIHJldHVybiAodHlwZSA9PT0gb3RoZXIpIHx8IChjb21wYXJlQ29uc3RydWN0b3IodHlwZSwgb3RoZXIpICYmXG4gICAgICAgIHR5cGUudW5pdCA9PT0gb3RoZXIudW5pdCAmJlxuICAgICAgICB0eXBlLmJpdFdpZHRoID09PSBvdGhlci5iaXRXaWR0aCk7XG59XG5mdW5jdGlvbiBjb21wYXJlTGlzdCh0eXBlLCBvdGhlcikge1xuICAgIHJldHVybiAodHlwZSA9PT0gb3RoZXIpIHx8IChjb21wYXJlQ29uc3RydWN0b3IodHlwZSwgb3RoZXIpICYmXG4gICAgICAgIHR5cGUuY2hpbGRyZW4ubGVuZ3RoID09PSBvdGhlci5jaGlsZHJlbi5sZW5ndGggJiZcbiAgICAgICAgaW5zdGFuY2UuY29tcGFyZU1hbnlGaWVsZHModHlwZS5jaGlsZHJlbiwgb3RoZXIuY2hpbGRyZW4pKTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVTdHJ1Y3QodHlwZSwgb3RoZXIpIHtcbiAgICByZXR1cm4gKHR5cGUgPT09IG90aGVyKSB8fCAoY29tcGFyZUNvbnN0cnVjdG9yKHR5cGUsIG90aGVyKSAmJlxuICAgICAgICB0eXBlLmNoaWxkcmVuLmxlbmd0aCA9PT0gb3RoZXIuY2hpbGRyZW4ubGVuZ3RoICYmXG4gICAgICAgIGluc3RhbmNlLmNvbXBhcmVNYW55RmllbGRzKHR5cGUuY2hpbGRyZW4sIG90aGVyLmNoaWxkcmVuKSk7XG59XG5mdW5jdGlvbiBjb21wYXJlVW5pb24odHlwZSwgb3RoZXIpIHtcbiAgICByZXR1cm4gKHR5cGUgPT09IG90aGVyKSB8fCAoY29tcGFyZUNvbnN0cnVjdG9yKHR5cGUsIG90aGVyKSAmJlxuICAgICAgICB0eXBlLm1vZGUgPT09IG90aGVyLm1vZGUgJiZcbiAgICAgICAgdHlwZS50eXBlSWRzLmV2ZXJ5KCh4LCBpKSA9PiB4ID09PSBvdGhlci50eXBlSWRzW2ldKSAmJlxuICAgICAgICBpbnN0YW5jZS5jb21wYXJlTWFueUZpZWxkcyh0eXBlLmNoaWxkcmVuLCBvdGhlci5jaGlsZHJlbikpO1xufVxuZnVuY3Rpb24gY29tcGFyZURpY3Rpb25hcnkodHlwZSwgb3RoZXIpIHtcbiAgICByZXR1cm4gKHR5cGUgPT09IG90aGVyKSB8fCAoY29tcGFyZUNvbnN0cnVjdG9yKHR5cGUsIG90aGVyKSAmJlxuICAgICAgICB0eXBlLmlkID09PSBvdGhlci5pZCAmJlxuICAgICAgICB0eXBlLmlzT3JkZXJlZCA9PT0gb3RoZXIuaXNPcmRlcmVkICYmXG4gICAgICAgIGluc3RhbmNlLnZpc2l0KHR5cGUuaW5kaWNlcywgb3RoZXIuaW5kaWNlcykgJiZcbiAgICAgICAgaW5zdGFuY2UudmlzaXQodHlwZS5kaWN0aW9uYXJ5LCBvdGhlci5kaWN0aW9uYXJ5KSk7XG59XG5mdW5jdGlvbiBjb21wYXJlSW50ZXJ2YWwodHlwZSwgb3RoZXIpIHtcbiAgICByZXR1cm4gKHR5cGUgPT09IG90aGVyKSB8fCAoY29tcGFyZUNvbnN0cnVjdG9yKHR5cGUsIG90aGVyKSAmJlxuICAgICAgICB0eXBlLnVuaXQgPT09IG90aGVyLnVuaXQpO1xufVxuZnVuY3Rpb24gY29tcGFyZUZpeGVkU2l6ZUxpc3QodHlwZSwgb3RoZXIpIHtcbiAgICByZXR1cm4gKHR5cGUgPT09IG90aGVyKSB8fCAoY29tcGFyZUNvbnN0cnVjdG9yKHR5cGUsIG90aGVyKSAmJlxuICAgICAgICB0eXBlLmxpc3RTaXplID09PSBvdGhlci5saXN0U2l6ZSAmJlxuICAgICAgICB0eXBlLmNoaWxkcmVuLmxlbmd0aCA9PT0gb3RoZXIuY2hpbGRyZW4ubGVuZ3RoICYmXG4gICAgICAgIGluc3RhbmNlLmNvbXBhcmVNYW55RmllbGRzKHR5cGUuY2hpbGRyZW4sIG90aGVyLmNoaWxkcmVuKSk7XG59XG5mdW5jdGlvbiBjb21wYXJlTWFwKHR5cGUsIG90aGVyKSB7XG4gICAgcmV0dXJuICh0eXBlID09PSBvdGhlcikgfHwgKGNvbXBhcmVDb25zdHJ1Y3Rvcih0eXBlLCBvdGhlcikgJiZcbiAgICAgICAgdHlwZS5rZXlzU29ydGVkID09PSBvdGhlci5rZXlzU29ydGVkICYmXG4gICAgICAgIHR5cGUuY2hpbGRyZW4ubGVuZ3RoID09PSBvdGhlci5jaGlsZHJlbi5sZW5ndGggJiZcbiAgICAgICAgaW5zdGFuY2UuY29tcGFyZU1hbnlGaWVsZHModHlwZS5jaGlsZHJlbiwgb3RoZXIuY2hpbGRyZW4pKTtcbn1cblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdE51bGwgPSBjb21wYXJlQW55O1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0Qm9vbCA9IGNvbXBhcmVBbnk7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRJbnQgPSBjb21wYXJlSW50O1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0SW50OCA9IGNvbXBhcmVJbnQ7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRJbnQxNiA9IGNvbXBhcmVJbnQ7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRJbnQzMiA9IGNvbXBhcmVJbnQ7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRJbnQ2NCA9IGNvbXBhcmVJbnQ7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRVaW50OCA9IGNvbXBhcmVJbnQ7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRVaW50MTYgPSBjb21wYXJlSW50O1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0VWludDMyID0gY29tcGFyZUludDtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdFVpbnQ2NCA9IGNvbXBhcmVJbnQ7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRGbG9hdCA9IGNvbXBhcmVGbG9hdDtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdEZsb2F0MTYgPSBjb21wYXJlRmxvYXQ7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRGbG9hdDMyID0gY29tcGFyZUZsb2F0O1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0RmxvYXQ2NCA9IGNvbXBhcmVGbG9hdDtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdFV0ZjggPSBjb21wYXJlQW55O1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0QmluYXJ5ID0gY29tcGFyZUFueTtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdEZpeGVkU2l6ZUJpbmFyeSA9IGNvbXBhcmVGaXhlZFNpemVCaW5hcnk7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXREYXRlID0gY29tcGFyZURhdGU7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXREYXRlRGF5ID0gY29tcGFyZURhdGU7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXREYXRlTWlsbGlzZWNvbmQgPSBjb21wYXJlRGF0ZTtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdFRpbWVzdGFtcCA9IGNvbXBhcmVUaW1lc3RhbXA7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXBTZWNvbmQgPSBjb21wYXJlVGltZXN0YW1wO1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wTWlsbGlzZWNvbmQgPSBjb21wYXJlVGltZXN0YW1wO1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wTWljcm9zZWNvbmQgPSBjb21wYXJlVGltZXN0YW1wO1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0VGltZXN0YW1wTmFub3NlY29uZCA9IGNvbXBhcmVUaW1lc3RhbXA7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRUaW1lID0gY29tcGFyZVRpbWU7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRUaW1lU2Vjb25kID0gY29tcGFyZVRpbWU7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRUaW1lTWlsbGlzZWNvbmQgPSBjb21wYXJlVGltZTtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdFRpbWVNaWNyb3NlY29uZCA9IGNvbXBhcmVUaW1lO1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0VGltZU5hbm9zZWNvbmQgPSBjb21wYXJlVGltZTtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdERlY2ltYWwgPSBjb21wYXJlQW55O1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0TGlzdCA9IGNvbXBhcmVMaXN0O1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0U3RydWN0ID0gY29tcGFyZVN0cnVjdDtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdFVuaW9uID0gY29tcGFyZVVuaW9uO1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0RGVuc2VVbmlvbiA9IGNvbXBhcmVVbmlvbjtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdFNwYXJzZVVuaW9uID0gY29tcGFyZVVuaW9uO1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0RGljdGlvbmFyeSA9IGNvbXBhcmVEaWN0aW9uYXJ5O1xuVHlwZUNvbXBhcmF0b3IucHJvdG90eXBlLnZpc2l0SW50ZXJ2YWwgPSBjb21wYXJlSW50ZXJ2YWw7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRJbnRlcnZhbERheVRpbWUgPSBjb21wYXJlSW50ZXJ2YWw7XG5UeXBlQ29tcGFyYXRvci5wcm90b3R5cGUudmlzaXRJbnRlcnZhbFllYXJNb250aCA9IGNvbXBhcmVJbnRlcnZhbDtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdEZpeGVkU2l6ZUxpc3QgPSBjb21wYXJlRml4ZWRTaXplTGlzdDtcblR5cGVDb21wYXJhdG9yLnByb3RvdHlwZS52aXNpdE1hcCA9IGNvbXBhcmVNYXA7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNvbnN0IGluc3RhbmNlID0gbmV3IFR5cGVDb21wYXJhdG9yKCk7XG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZVNjaGVtYXMoc2NoZW1hLCBvdGhlcikge1xuICAgIHJldHVybiBpbnN0YW5jZS5jb21wYXJlU2NoZW1hcyhzY2hlbWEsIG90aGVyKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlRmllbGRzKGZpZWxkLCBvdGhlcikge1xuICAgIHJldHVybiBpbnN0YW5jZS5jb21wYXJlRmllbGRzKGZpZWxkLCBvdGhlcik7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZVR5cGVzKHR5cGUsIG90aGVyKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLnZpc2l0KHR5cGUsIG90aGVyKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZWNvbXBhcmF0b3IubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBWZWN0b3IgfSBmcm9tICcuLi92ZWN0b3IubWpzJztcbmltcG9ydCB7IFZpc2l0b3IgfSBmcm9tICcuLi92aXNpdG9yLm1qcyc7XG5pbXBvcnQgeyBVbmlvbk1vZGUgfSBmcm9tICcuLi9lbnVtLm1qcyc7XG5pbXBvcnQgeyBSZWNvcmRCYXRjaCB9IGZyb20gJy4uL3JlY29yZGJhdGNoLm1qcyc7XG5pbXBvcnQgeyByZWJhc2VWYWx1ZU9mZnNldHMgfSBmcm9tICcuLi91dGlsL2J1ZmZlci5tanMnO1xuaW1wb3J0IHsgcGFja0Jvb2xzLCB0cnVuY2F0ZUJpdG1hcCB9IGZyb20gJy4uL3V0aWwvYml0Lm1qcyc7XG5pbXBvcnQgeyBCdWZmZXJSZWdpb24sIEZpZWxkTm9kZSB9IGZyb20gJy4uL2lwYy9tZXRhZGF0YS9tZXNzYWdlLm1qcyc7XG5pbXBvcnQgeyBEYXRhVHlwZSwgfSBmcm9tICcuLi90eXBlLm1qcyc7XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvckFzc2VtYmxlciBleHRlbmRzIFZpc2l0b3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9ieXRlTGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5fbm9kZXMgPSBbXTtcbiAgICAgICAgdGhpcy5fYnVmZmVycyA9IFtdO1xuICAgICAgICB0aGlzLl9idWZmZXJSZWdpb25zID0gW107XG4gICAgfVxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBhc3NlbWJsZSguLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IHVud3JhcCA9IChub2RlcykgPT4gbm9kZXMuZmxhdE1hcCgobm9kZSkgPT4gQXJyYXkuaXNBcnJheShub2RlKSA/IHVud3JhcChub2RlKSA6XG4gICAgICAgICAgICAobm9kZSBpbnN0YW5jZW9mIFJlY29yZEJhdGNoKSA/IG5vZGUuZGF0YS5jaGlsZHJlbiA6IG5vZGUuZGF0YSk7XG4gICAgICAgIGNvbnN0IGFzc2VtYmxlciA9IG5ldyBWZWN0b3JBc3NlbWJsZXIoKTtcbiAgICAgICAgYXNzZW1ibGVyLnZpc2l0TWFueSh1bndyYXAoYXJncykpO1xuICAgICAgICByZXR1cm4gYXNzZW1ibGVyO1xuICAgIH1cbiAgICB2aXNpdChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgVmVjdG9yKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0TWFueShkYXRhLmRhdGEpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0eXBlIH0gPSBkYXRhO1xuICAgICAgICBpZiAoIURhdGFUeXBlLmlzRGljdGlvbmFyeSh0eXBlKSkge1xuICAgICAgICAgICAgY29uc3QgeyBsZW5ndGgsIG51bGxDb3VudCB9ID0gZGF0YTtcbiAgICAgICAgICAgIGlmIChsZW5ndGggPiAyMTQ3NDgzNjQ3KSB7XG4gICAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQ2Fubm90IHdyaXRlIGFycmF5cyBsYXJnZXIgdGhhbiAyXjMxIC0gMSBpbiBsZW5ndGgnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghRGF0YVR5cGUuaXNOdWxsKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgYWRkQnVmZmVyLmNhbGwodGhpcywgbnVsbENvdW50IDw9IDBcbiAgICAgICAgICAgICAgICAgICAgPyBuZXcgVWludDhBcnJheSgwKSAvLyBwbGFjZWhvbGRlciB2YWxpZGl0eSBidWZmZXJcbiAgICAgICAgICAgICAgICAgICAgOiB0cnVuY2F0ZUJpdG1hcChkYXRhLm9mZnNldCwgbGVuZ3RoLCBkYXRhLm51bGxCaXRtYXApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChuZXcgRmllbGROb2RlKGxlbmd0aCwgbnVsbENvdW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLnZpc2l0KGRhdGEpO1xuICAgIH1cbiAgICB2aXNpdE51bGwoX251bGwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHZpc2l0RGljdGlvbmFyeShkYXRhKSB7XG4gICAgICAgIC8vIEFzc2VtYmxlIHRoZSBpbmRpY2VzIGhlcmUsIERpY3Rpb25hcnkgYXNzZW1ibGVkIHNlcGFyYXRlbHkuXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0KGRhdGEuY2xvbmUoZGF0YS50eXBlLmluZGljZXMpKTtcbiAgICB9XG4gICAgZ2V0IG5vZGVzKCkgeyByZXR1cm4gdGhpcy5fbm9kZXM7IH1cbiAgICBnZXQgYnVmZmVycygpIHsgcmV0dXJuIHRoaXMuX2J1ZmZlcnM7IH1cbiAgICBnZXQgYnl0ZUxlbmd0aCgpIHsgcmV0dXJuIHRoaXMuX2J5dGVMZW5ndGg7IH1cbiAgICBnZXQgYnVmZmVyUmVnaW9ucygpIHsgcmV0dXJuIHRoaXMuX2J1ZmZlclJlZ2lvbnM7IH1cbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBhZGRCdWZmZXIodmFsdWVzKSB7XG4gICAgY29uc3QgYnl0ZUxlbmd0aCA9ICh2YWx1ZXMuYnl0ZUxlbmd0aCArIDcpICYgfjc7IC8vIFJvdW5kIHVwIHRvIGEgbXVsdGlwbGUgb2YgOFxuICAgIHRoaXMuYnVmZmVycy5wdXNoKHZhbHVlcyk7XG4gICAgdGhpcy5idWZmZXJSZWdpb25zLnB1c2gobmV3IEJ1ZmZlclJlZ2lvbih0aGlzLl9ieXRlTGVuZ3RoLCBieXRlTGVuZ3RoKSk7XG4gICAgdGhpcy5fYnl0ZUxlbmd0aCArPSBieXRlTGVuZ3RoO1xuICAgIHJldHVybiB0aGlzO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGFzc2VtYmxlVW5pb24oZGF0YSkge1xuICAgIGNvbnN0IHsgdHlwZSwgbGVuZ3RoLCB0eXBlSWRzLCB2YWx1ZU9mZnNldHMgfSA9IGRhdGE7XG4gICAgLy8gQWxsIFVuaW9uIFZlY3RvcnMgaGF2ZSBhIHR5cGVJZHMgYnVmZmVyXG4gICAgYWRkQnVmZmVyLmNhbGwodGhpcywgdHlwZUlkcyk7XG4gICAgLy8gSWYgdGhpcyBpcyBhIFNwYXJzZSBVbmlvbiwgdHJlYXQgaXQgbGlrZSBhbGwgb3RoZXIgTmVzdGVkIHR5cGVzXG4gICAgaWYgKHR5cGUubW9kZSA9PT0gVW5pb25Nb2RlLlNwYXJzZSkge1xuICAgICAgICByZXR1cm4gYXNzZW1ibGVOZXN0ZWRWZWN0b3IuY2FsbCh0aGlzLCBkYXRhKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZS5tb2RlID09PSBVbmlvbk1vZGUuRGVuc2UpIHtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIERlbnNlIFVuaW9uLCBhZGQgdGhlIHZhbHVlT2Zmc2V0cyBidWZmZXIgYW5kIHBvdGVudGlhbGx5IHNsaWNlIHRoZSBjaGlsZHJlblxuICAgICAgICBpZiAoZGF0YS5vZmZzZXQgPD0gMCkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIFZlY3RvciBoYXNuJ3QgYmVlbiBzbGljZWQsIHdyaXRlIHRoZSBleGlzdGluZyB2YWx1ZU9mZnNldHNcbiAgICAgICAgICAgIGFkZEJ1ZmZlci5jYWxsKHRoaXMsIHZhbHVlT2Zmc2V0cyk7XG4gICAgICAgICAgICAvLyBXZSBjYW4gdHJlYXQgdGhpcyBsaWtlIGFsbCBvdGhlciBOZXN0ZWQgdHlwZXNcbiAgICAgICAgICAgIHJldHVybiBhc3NlbWJsZU5lc3RlZFZlY3Rvci5jYWxsKHRoaXMsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQSBzbGljZWQgRGVuc2UgVW5pb24gaXMgYW4gdW5wbGVhc2FudCBjYXNlLiBCZWNhdXNlIHRoZSBvZmZzZXRzIGFyZSBkaWZmZXJlbnQgZm9yXG4gICAgICAgICAgICAvLyBlYWNoIGNoaWxkIHZlY3Rvciwgd2UgbmVlZCB0byBcInJlYmFzZVwiIHRoZSB2YWx1ZU9mZnNldHMgZm9yIGVhY2ggY2hpbGRcbiAgICAgICAgICAgIC8vIFVuaW9uIHR5cGVJZHMgYXJlIG5vdCBuZWNlc3NhcnkgMC1pbmRleGVkXG4gICAgICAgICAgICBjb25zdCBtYXhDaGlsZFR5cGVJZCA9IHR5cGVJZHMucmVkdWNlKCh4LCB5KSA9PiBNYXRoLm1heCh4LCB5KSwgdHlwZUlkc1swXSk7XG4gICAgICAgICAgICBjb25zdCBjaGlsZExlbmd0aHMgPSBuZXcgSW50MzJBcnJheShtYXhDaGlsZFR5cGVJZCArIDEpO1xuICAgICAgICAgICAgLy8gU2V0IGFsbCB0byAtMSB0byBpbmRpY2F0ZSB0aGF0IHdlIGhhdmVuJ3Qgb2JzZXJ2ZWQgYSBmaXJzdCBvY2N1cnJlbmNlIG9mIGEgcGFydGljdWxhciBjaGlsZCB5ZXRcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkT2Zmc2V0cyA9IG5ldyBJbnQzMkFycmF5KG1heENoaWxkVHlwZUlkICsgMSkuZmlsbCgtMSk7XG4gICAgICAgICAgICBjb25zdCBzaGlmdGVkT2Zmc2V0cyA9IG5ldyBJbnQzMkFycmF5KGxlbmd0aCk7XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgbm9uLXplcm8gb2Zmc2V0LCB0aGVuIHRoZSB2YWx1ZSBvZmZzZXRzIGRvIG5vdCBzdGFydCBhdFxuICAgICAgICAgICAgLy8gemVyby4gV2UgbXVzdCBhKSBjcmVhdGUgYSBuZXcgb2Zmc2V0cyBhcnJheSB3aXRoIHNoaWZ0ZWQgb2Zmc2V0cyBhbmRcbiAgICAgICAgICAgIC8vIGIpIHNsaWNlIHRoZSB2YWx1ZXMgYXJyYXkgYWNjb3JkaW5nbHlcbiAgICAgICAgICAgIGNvbnN0IHVuc2hpZnRlZE9mZnNldHMgPSByZWJhc2VWYWx1ZU9mZnNldHMoLXZhbHVlT2Zmc2V0c1swXSwgbGVuZ3RoLCB2YWx1ZU9mZnNldHMpO1xuICAgICAgICAgICAgZm9yIChsZXQgdHlwZUlkLCBzaGlmdCwgaW5kZXggPSAtMTsgKytpbmRleCA8IGxlbmd0aDspIHtcbiAgICAgICAgICAgICAgICBpZiAoKHNoaWZ0ID0gY2hpbGRPZmZzZXRzW3R5cGVJZCA9IHR5cGVJZHNbaW5kZXhdXSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gY2hpbGRPZmZzZXRzW3R5cGVJZF0gPSB1bnNoaWZ0ZWRPZmZzZXRzW3R5cGVJZF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNoaWZ0ZWRPZmZzZXRzW2luZGV4XSA9IHVuc2hpZnRlZE9mZnNldHNbaW5kZXhdIC0gc2hpZnQ7XG4gICAgICAgICAgICAgICAgKytjaGlsZExlbmd0aHNbdHlwZUlkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZEJ1ZmZlci5jYWxsKHRoaXMsIHNoaWZ0ZWRPZmZzZXRzKTtcbiAgICAgICAgICAgIC8vIFNsaWNlIGFuZCB2aXNpdCBjaGlsZHJlbiBhY2NvcmRpbmdseVxuICAgICAgICAgICAgZm9yIChsZXQgY2hpbGQsIGNoaWxkSW5kZXggPSAtMSwgbnVtQ2hpbGRyZW4gPSB0eXBlLmNoaWxkcmVuLmxlbmd0aDsgKytjaGlsZEluZGV4IDwgbnVtQ2hpbGRyZW47KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkID0gZGF0YS5jaGlsZHJlbltjaGlsZEluZGV4XSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlSWQgPSB0eXBlLnR5cGVJZHNbY2hpbGRJbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTGVuZ3RoID0gTWF0aC5taW4obGVuZ3RoLCBjaGlsZExlbmd0aHNbdHlwZUlkXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlzaXQoY2hpbGQuc2xpY2UoY2hpbGRPZmZzZXRzW3R5cGVJZF0sIGNoaWxkTGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGFzc2VtYmxlQm9vbFZlY3RvcihkYXRhKSB7XG4gICAgLy8gQm9vbCB2ZWN0b3IgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgRmxhdFZlY3RvciwgYXMgaXRzIGRhdGEgYnVmZmVyIG5lZWRzIHRvIHN0YXkgcGFja2VkXG4gICAgbGV0IHZhbHVlcztcbiAgICBpZiAoZGF0YS5udWxsQ291bnQgPj0gZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgLy8gSWYgYWxsIHZhbHVlcyBhcmUgbnVsbCwganVzdCBpbnNlcnQgYSBwbGFjZWhvbGRlciBlbXB0eSBkYXRhIGJ1ZmZlciAoZmFzdGVzdCBwYXRoKVxuICAgICAgICByZXR1cm4gYWRkQnVmZmVyLmNhbGwodGhpcywgbmV3IFVpbnQ4QXJyYXkoMCkpO1xuICAgIH1cbiAgICBlbHNlIGlmICgodmFsdWVzID0gZGF0YS52YWx1ZXMpIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICAvLyBJZiB2YWx1ZXMgaXMgYWxyZWFkeSBhIFVpbnQ4QXJyYXksIHNsaWNlIHRoZSBiaXRtYXAgKGZhc3QgcGF0aClcbiAgICAgICAgcmV0dXJuIGFkZEJ1ZmZlci5jYWxsKHRoaXMsIHRydW5jYXRlQml0bWFwKGRhdGEub2Zmc2V0LCBkYXRhLmxlbmd0aCwgdmFsdWVzKSk7XG4gICAgfVxuICAgIC8vIE90aGVyd2lzZSBpZiB0aGUgdW5kZXJseWluZyBkYXRhICppc24ndCogYSBVaW50OEFycmF5LCBlbnVtZXJhdGUgdGhlXG4gICAgLy8gdmFsdWVzIGFzIGJvb2xzIGFuZCByZS1wYWNrIHRoZW0gaW50byBhIFVpbnQ4QXJyYXkuIFRoaXMgY29kZSBpc24ndFxuICAgIC8vIHJlYWNoYWJsZSB1bmxlc3MgeW91J3JlIHRyeWluZyB0byBtYW5pcHVsYXRlIHRoZSBEYXRhIGludGVybmFscyxcbiAgICAvLyB3ZSdyZSBvbmx5IGRvaW5nIHRoaXMgZm9yIHNhZmV0eS5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiBhZGRCdWZmZXIuY2FsbCh0aGlzLCBwYWNrQm9vbHMoZGF0YS52YWx1ZXMpKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBhc3NlbWJsZUZsYXRWZWN0b3IoZGF0YSkge1xuICAgIHJldHVybiBhZGRCdWZmZXIuY2FsbCh0aGlzLCBkYXRhLnZhbHVlcy5zdWJhcnJheSgwLCBkYXRhLmxlbmd0aCAqIGRhdGEuc3RyaWRlKSk7XG59XG4vKiogQGlnbm9yZSAqL1xuZnVuY3Rpb24gYXNzZW1ibGVGbGF0TGlzdFZlY3RvcihkYXRhKSB7XG4gICAgY29uc3QgeyBsZW5ndGgsIHZhbHVlcywgdmFsdWVPZmZzZXRzIH0gPSBkYXRhO1xuICAgIGNvbnN0IGZpcnN0T2Zmc2V0ID0gdmFsdWVPZmZzZXRzWzBdO1xuICAgIGNvbnN0IGxhc3RPZmZzZXQgPSB2YWx1ZU9mZnNldHNbbGVuZ3RoXTtcbiAgICBjb25zdCBieXRlTGVuZ3RoID0gTWF0aC5taW4obGFzdE9mZnNldCAtIGZpcnN0T2Zmc2V0LCB2YWx1ZXMuYnl0ZUxlbmd0aCAtIGZpcnN0T2Zmc2V0KTtcbiAgICAvLyBQdXNoIGluIHRoZSBvcmRlciBGbGF0TGlzdCB0eXBlcyByZWFkIHRoZWlyIGJ1ZmZlcnNcbiAgICBhZGRCdWZmZXIuY2FsbCh0aGlzLCByZWJhc2VWYWx1ZU9mZnNldHMoLXZhbHVlT2Zmc2V0c1swXSwgbGVuZ3RoLCB2YWx1ZU9mZnNldHMpKTsgLy8gdmFsdWVPZmZzZXRzIGJ1ZmZlciBmaXJzdFxuICAgIGFkZEJ1ZmZlci5jYWxsKHRoaXMsIHZhbHVlcy5zdWJhcnJheShmaXJzdE9mZnNldCwgZmlyc3RPZmZzZXQgKyBieXRlTGVuZ3RoKSk7IC8vIHNsaWNlZCB2YWx1ZXMgYnVmZmVyIHNlY29uZFxuICAgIHJldHVybiB0aGlzO1xufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGFzc2VtYmxlTGlzdFZlY3RvcihkYXRhKSB7XG4gICAgY29uc3QgeyBsZW5ndGgsIHZhbHVlT2Zmc2V0cyB9ID0gZGF0YTtcbiAgICAvLyBJZiB3ZSBoYXZlIHZhbHVlT2Zmc2V0cyAoTWFwVmVjdG9yLCBMaXN0VmVjdG9yKSwgcHVzaCB0aGF0IGJ1ZmZlciBmaXJzdFxuICAgIGlmICh2YWx1ZU9mZnNldHMpIHtcbiAgICAgICAgYWRkQnVmZmVyLmNhbGwodGhpcywgcmViYXNlVmFsdWVPZmZzZXRzKHZhbHVlT2Zmc2V0c1swXSwgbGVuZ3RoLCB2YWx1ZU9mZnNldHMpKTtcbiAgICB9XG4gICAgLy8gVGhlbiBpbnNlcnQgdGhlIExpc3QncyB2YWx1ZXMgY2hpbGRcbiAgICByZXR1cm4gdGhpcy52aXNpdChkYXRhLmNoaWxkcmVuWzBdKTtcbn1cbi8qKiBAaWdub3JlICovXG5mdW5jdGlvbiBhc3NlbWJsZU5lc3RlZFZlY3RvcihkYXRhKSB7XG4gICAgcmV0dXJuIHRoaXMudmlzaXRNYW55KGRhdGEudHlwZS5jaGlsZHJlbi5tYXAoKF8sIGkpID0+IGRhdGEuY2hpbGRyZW5baV0pLmZpbHRlcihCb29sZWFuKSlbMF07XG59XG5WZWN0b3JBc3NlbWJsZXIucHJvdG90eXBlLnZpc2l0Qm9vbCA9IGFzc2VtYmxlQm9vbFZlY3RvcjtcblZlY3RvckFzc2VtYmxlci5wcm90b3R5cGUudmlzaXRJbnQgPSBhc3NlbWJsZUZsYXRWZWN0b3I7XG5WZWN0b3JBc3NlbWJsZXIucHJvdG90eXBlLnZpc2l0RmxvYXQgPSBhc3NlbWJsZUZsYXRWZWN0b3I7XG5WZWN0b3JBc3NlbWJsZXIucHJvdG90eXBlLnZpc2l0VXRmOCA9IGFzc2VtYmxlRmxhdExpc3RWZWN0b3I7XG5WZWN0b3JBc3NlbWJsZXIucHJvdG90eXBlLnZpc2l0QmluYXJ5ID0gYXNzZW1ibGVGbGF0TGlzdFZlY3RvcjtcblZlY3RvckFzc2VtYmxlci5wcm90b3R5cGUudmlzaXRGaXhlZFNpemVCaW5hcnkgPSBhc3NlbWJsZUZsYXRWZWN0b3I7XG5WZWN0b3JBc3NlbWJsZXIucHJvdG90eXBlLnZpc2l0RGF0ZSA9IGFzc2VtYmxlRmxhdFZlY3RvcjtcblZlY3RvckFzc2VtYmxlci5wcm90b3R5cGUudmlzaXRUaW1lc3RhbXAgPSBhc3NlbWJsZUZsYXRWZWN0b3I7XG5WZWN0b3JBc3NlbWJsZXIucHJvdG90eXBlLnZpc2l0VGltZSA9IGFzc2VtYmxlRmxhdFZlY3RvcjtcblZlY3RvckFzc2VtYmxlci5wcm90b3R5cGUudmlzaXREZWNpbWFsID0gYXNzZW1ibGVGbGF0VmVjdG9yO1xuVmVjdG9yQXNzZW1ibGVyLnByb3RvdHlwZS52aXNpdExpc3QgPSBhc3NlbWJsZUxpc3RWZWN0b3I7XG5WZWN0b3JBc3NlbWJsZXIucHJvdG90eXBlLnZpc2l0U3RydWN0ID0gYXNzZW1ibGVOZXN0ZWRWZWN0b3I7XG5WZWN0b3JBc3NlbWJsZXIucHJvdG90eXBlLnZpc2l0VW5pb24gPSBhc3NlbWJsZVVuaW9uO1xuVmVjdG9yQXNzZW1ibGVyLnByb3RvdHlwZS52aXNpdEludGVydmFsID0gYXNzZW1ibGVGbGF0VmVjdG9yO1xuVmVjdG9yQXNzZW1ibGVyLnByb3RvdHlwZS52aXNpdEZpeGVkU2l6ZUxpc3QgPSBhc3NlbWJsZUxpc3RWZWN0b3I7XG5WZWN0b3JBc3NlbWJsZXIucHJvdG90eXBlLnZpc2l0TWFwID0gYXNzZW1ibGVMaXN0VmVjdG9yO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD12ZWN0b3Jhc3NlbWJsZXIubWpzLm1hcFxuIiwiLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuLy8gXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4vLyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbi8vXG4vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuLy8gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbi8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuLy8gdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBtYWtlRGF0YSB9IGZyb20gJy4uL2RhdGEubWpzJztcbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi4vc2NoZW1hLm1qcyc7XG5pbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uL3R5cGUubWpzJztcbmltcG9ydCB7IFZpc2l0b3IgfSBmcm9tICcuLi92aXNpdG9yLm1qcyc7XG5pbXBvcnQgeyBwYWNrQm9vbHMgfSBmcm9tICcuLi91dGlsL2JpdC5tanMnO1xuaW1wb3J0IHsgZW5jb2RlVXRmOCB9IGZyb20gJy4uL3V0aWwvdXRmOC5tanMnO1xuaW1wb3J0IHsgSW50NjQsIEludDEyOCB9IGZyb20gJy4uL3V0aWwvaW50Lm1qcyc7XG5pbXBvcnQgeyBVbmlvbk1vZGUsIERhdGVVbml0IH0gZnJvbSAnLi4vZW51bS5tanMnO1xuaW1wb3J0IHsgdG9BcnJheUJ1ZmZlclZpZXcgfSBmcm9tICcuLi91dGlsL2J1ZmZlci5tanMnO1xuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBjbGFzcyBWZWN0b3JMb2FkZXIgZXh0ZW5kcyBWaXNpdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihieXRlcywgbm9kZXMsIGJ1ZmZlcnMsIGRpY3Rpb25hcmllcykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm5vZGVzSW5kZXggPSAtMTtcbiAgICAgICAgdGhpcy5idWZmZXJzSW5kZXggPSAtMTtcbiAgICAgICAgdGhpcy5ieXRlcyA9IGJ5dGVzO1xuICAgICAgICB0aGlzLm5vZGVzID0gbm9kZXM7XG4gICAgICAgIHRoaXMuYnVmZmVycyA9IGJ1ZmZlcnM7XG4gICAgICAgIHRoaXMuZGljdGlvbmFyaWVzID0gZGljdGlvbmFyaWVzO1xuICAgIH1cbiAgICB2aXNpdChub2RlKSB7XG4gICAgICAgIHJldHVybiBzdXBlci52aXNpdChub2RlIGluc3RhbmNlb2YgRmllbGQgPyBub2RlLnR5cGUgOiBub2RlKTtcbiAgICB9XG4gICAgdmlzaXROdWxsKHR5cGUsIHsgbGVuZ3RoIH0gPSB0aGlzLm5leHRGaWVsZE5vZGUoKSkge1xuICAgICAgICByZXR1cm4gbWFrZURhdGEoeyB0eXBlLCBsZW5ndGggfSk7XG4gICAgfVxuICAgIHZpc2l0Qm9vbCh0eXBlLCB7IGxlbmd0aCwgbnVsbENvdW50IH0gPSB0aGlzLm5leHRGaWVsZE5vZGUoKSkge1xuICAgICAgICByZXR1cm4gbWFrZURhdGEoeyB0eXBlLCBsZW5ndGgsIG51bGxDb3VudCwgbnVsbEJpdG1hcDogdGhpcy5yZWFkTnVsbEJpdG1hcCh0eXBlLCBudWxsQ291bnQpLCBkYXRhOiB0aGlzLnJlYWREYXRhKHR5cGUpIH0pO1xuICAgIH1cbiAgICB2aXNpdEludCh0eXBlLCB7IGxlbmd0aCwgbnVsbENvdW50IH0gPSB0aGlzLm5leHRGaWVsZE5vZGUoKSkge1xuICAgICAgICByZXR1cm4gbWFrZURhdGEoeyB0eXBlLCBsZW5ndGgsIG51bGxDb3VudCwgbnVsbEJpdG1hcDogdGhpcy5yZWFkTnVsbEJpdG1hcCh0eXBlLCBudWxsQ291bnQpLCBkYXRhOiB0aGlzLnJlYWREYXRhKHR5cGUpIH0pO1xuICAgIH1cbiAgICB2aXNpdEZsb2F0KHR5cGUsIHsgbGVuZ3RoLCBudWxsQ291bnQgfSA9IHRoaXMubmV4dEZpZWxkTm9kZSgpKSB7XG4gICAgICAgIHJldHVybiBtYWtlRGF0YSh7IHR5cGUsIGxlbmd0aCwgbnVsbENvdW50LCBudWxsQml0bWFwOiB0aGlzLnJlYWROdWxsQml0bWFwKHR5cGUsIG51bGxDb3VudCksIGRhdGE6IHRoaXMucmVhZERhdGEodHlwZSkgfSk7XG4gICAgfVxuICAgIHZpc2l0VXRmOCh0eXBlLCB7IGxlbmd0aCwgbnVsbENvdW50IH0gPSB0aGlzLm5leHRGaWVsZE5vZGUoKSkge1xuICAgICAgICByZXR1cm4gbWFrZURhdGEoeyB0eXBlLCBsZW5ndGgsIG51bGxDb3VudCwgbnVsbEJpdG1hcDogdGhpcy5yZWFkTnVsbEJpdG1hcCh0eXBlLCBudWxsQ291bnQpLCB2YWx1ZU9mZnNldHM6IHRoaXMucmVhZE9mZnNldHModHlwZSksIGRhdGE6IHRoaXMucmVhZERhdGEodHlwZSkgfSk7XG4gICAgfVxuICAgIHZpc2l0QmluYXJ5KHR5cGUsIHsgbGVuZ3RoLCBudWxsQ291bnQgfSA9IHRoaXMubmV4dEZpZWxkTm9kZSgpKSB7XG4gICAgICAgIHJldHVybiBtYWtlRGF0YSh7IHR5cGUsIGxlbmd0aCwgbnVsbENvdW50LCBudWxsQml0bWFwOiB0aGlzLnJlYWROdWxsQml0bWFwKHR5cGUsIG51bGxDb3VudCksIHZhbHVlT2Zmc2V0czogdGhpcy5yZWFkT2Zmc2V0cyh0eXBlKSwgZGF0YTogdGhpcy5yZWFkRGF0YSh0eXBlKSB9KTtcbiAgICB9XG4gICAgdmlzaXRGaXhlZFNpemVCaW5hcnkodHlwZSwgeyBsZW5ndGgsIG51bGxDb3VudCB9ID0gdGhpcy5uZXh0RmllbGROb2RlKCkpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VEYXRhKHsgdHlwZSwgbGVuZ3RoLCBudWxsQ291bnQsIG51bGxCaXRtYXA6IHRoaXMucmVhZE51bGxCaXRtYXAodHlwZSwgbnVsbENvdW50KSwgZGF0YTogdGhpcy5yZWFkRGF0YSh0eXBlKSB9KTtcbiAgICB9XG4gICAgdmlzaXREYXRlKHR5cGUsIHsgbGVuZ3RoLCBudWxsQ291bnQgfSA9IHRoaXMubmV4dEZpZWxkTm9kZSgpKSB7XG4gICAgICAgIHJldHVybiBtYWtlRGF0YSh7IHR5cGUsIGxlbmd0aCwgbnVsbENvdW50LCBudWxsQml0bWFwOiB0aGlzLnJlYWROdWxsQml0bWFwKHR5cGUsIG51bGxDb3VudCksIGRhdGE6IHRoaXMucmVhZERhdGEodHlwZSkgfSk7XG4gICAgfVxuICAgIHZpc2l0VGltZXN0YW1wKHR5cGUsIHsgbGVuZ3RoLCBudWxsQ291bnQgfSA9IHRoaXMubmV4dEZpZWxkTm9kZSgpKSB7XG4gICAgICAgIHJldHVybiBtYWtlRGF0YSh7IHR5cGUsIGxlbmd0aCwgbnVsbENvdW50LCBudWxsQml0bWFwOiB0aGlzLnJlYWROdWxsQml0bWFwKHR5cGUsIG51bGxDb3VudCksIGRhdGE6IHRoaXMucmVhZERhdGEodHlwZSkgfSk7XG4gICAgfVxuICAgIHZpc2l0VGltZSh0eXBlLCB7IGxlbmd0aCwgbnVsbENvdW50IH0gPSB0aGlzLm5leHRGaWVsZE5vZGUoKSkge1xuICAgICAgICByZXR1cm4gbWFrZURhdGEoeyB0eXBlLCBsZW5ndGgsIG51bGxDb3VudCwgbnVsbEJpdG1hcDogdGhpcy5yZWFkTnVsbEJpdG1hcCh0eXBlLCBudWxsQ291bnQpLCBkYXRhOiB0aGlzLnJlYWREYXRhKHR5cGUpIH0pO1xuICAgIH1cbiAgICB2aXNpdERlY2ltYWwodHlwZSwgeyBsZW5ndGgsIG51bGxDb3VudCB9ID0gdGhpcy5uZXh0RmllbGROb2RlKCkpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VEYXRhKHsgdHlwZSwgbGVuZ3RoLCBudWxsQ291bnQsIG51bGxCaXRtYXA6IHRoaXMucmVhZE51bGxCaXRtYXAodHlwZSwgbnVsbENvdW50KSwgZGF0YTogdGhpcy5yZWFkRGF0YSh0eXBlKSB9KTtcbiAgICB9XG4gICAgdmlzaXRMaXN0KHR5cGUsIHsgbGVuZ3RoLCBudWxsQ291bnQgfSA9IHRoaXMubmV4dEZpZWxkTm9kZSgpKSB7XG4gICAgICAgIHJldHVybiBtYWtlRGF0YSh7IHR5cGUsIGxlbmd0aCwgbnVsbENvdW50LCBudWxsQml0bWFwOiB0aGlzLnJlYWROdWxsQml0bWFwKHR5cGUsIG51bGxDb3VudCksIHZhbHVlT2Zmc2V0czogdGhpcy5yZWFkT2Zmc2V0cyh0eXBlKSwgJ2NoaWxkJzogdGhpcy52aXNpdCh0eXBlLmNoaWxkcmVuWzBdKSB9KTtcbiAgICB9XG4gICAgdmlzaXRTdHJ1Y3QodHlwZSwgeyBsZW5ndGgsIG51bGxDb3VudCB9ID0gdGhpcy5uZXh0RmllbGROb2RlKCkpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VEYXRhKHsgdHlwZSwgbGVuZ3RoLCBudWxsQ291bnQsIG51bGxCaXRtYXA6IHRoaXMucmVhZE51bGxCaXRtYXAodHlwZSwgbnVsbENvdW50KSwgY2hpbGRyZW46IHRoaXMudmlzaXRNYW55KHR5cGUuY2hpbGRyZW4pIH0pO1xuICAgIH1cbiAgICB2aXNpdFVuaW9uKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGUubW9kZSA9PT0gVW5pb25Nb2RlLlNwYXJzZSA/IHRoaXMudmlzaXRTcGFyc2VVbmlvbih0eXBlKSA6IHRoaXMudmlzaXREZW5zZVVuaW9uKHR5cGUpO1xuICAgIH1cbiAgICB2aXNpdERlbnNlVW5pb24odHlwZSwgeyBsZW5ndGgsIG51bGxDb3VudCB9ID0gdGhpcy5uZXh0RmllbGROb2RlKCkpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VEYXRhKHsgdHlwZSwgbGVuZ3RoLCBudWxsQ291bnQsIG51bGxCaXRtYXA6IHRoaXMucmVhZE51bGxCaXRtYXAodHlwZSwgbnVsbENvdW50KSwgdHlwZUlkczogdGhpcy5yZWFkVHlwZUlkcyh0eXBlKSwgdmFsdWVPZmZzZXRzOiB0aGlzLnJlYWRPZmZzZXRzKHR5cGUpLCBjaGlsZHJlbjogdGhpcy52aXNpdE1hbnkodHlwZS5jaGlsZHJlbikgfSk7XG4gICAgfVxuICAgIHZpc2l0U3BhcnNlVW5pb24odHlwZSwgeyBsZW5ndGgsIG51bGxDb3VudCB9ID0gdGhpcy5uZXh0RmllbGROb2RlKCkpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VEYXRhKHsgdHlwZSwgbGVuZ3RoLCBudWxsQ291bnQsIG51bGxCaXRtYXA6IHRoaXMucmVhZE51bGxCaXRtYXAodHlwZSwgbnVsbENvdW50KSwgdHlwZUlkczogdGhpcy5yZWFkVHlwZUlkcyh0eXBlKSwgY2hpbGRyZW46IHRoaXMudmlzaXRNYW55KHR5cGUuY2hpbGRyZW4pIH0pO1xuICAgIH1cbiAgICB2aXNpdERpY3Rpb25hcnkodHlwZSwgeyBsZW5ndGgsIG51bGxDb3VudCB9ID0gdGhpcy5uZXh0RmllbGROb2RlKCkpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VEYXRhKHsgdHlwZSwgbGVuZ3RoLCBudWxsQ291bnQsIG51bGxCaXRtYXA6IHRoaXMucmVhZE51bGxCaXRtYXAodHlwZSwgbnVsbENvdW50KSwgZGF0YTogdGhpcy5yZWFkRGF0YSh0eXBlLmluZGljZXMpLCBkaWN0aW9uYXJ5OiB0aGlzLnJlYWREaWN0aW9uYXJ5KHR5cGUpIH0pO1xuICAgIH1cbiAgICB2aXNpdEludGVydmFsKHR5cGUsIHsgbGVuZ3RoLCBudWxsQ291bnQgfSA9IHRoaXMubmV4dEZpZWxkTm9kZSgpKSB7XG4gICAgICAgIHJldHVybiBtYWtlRGF0YSh7IHR5cGUsIGxlbmd0aCwgbnVsbENvdW50LCBudWxsQml0bWFwOiB0aGlzLnJlYWROdWxsQml0bWFwKHR5cGUsIG51bGxDb3VudCksIGRhdGE6IHRoaXMucmVhZERhdGEodHlwZSkgfSk7XG4gICAgfVxuICAgIHZpc2l0Rml4ZWRTaXplTGlzdCh0eXBlLCB7IGxlbmd0aCwgbnVsbENvdW50IH0gPSB0aGlzLm5leHRGaWVsZE5vZGUoKSkge1xuICAgICAgICByZXR1cm4gbWFrZURhdGEoeyB0eXBlLCBsZW5ndGgsIG51bGxDb3VudCwgbnVsbEJpdG1hcDogdGhpcy5yZWFkTnVsbEJpdG1hcCh0eXBlLCBudWxsQ291bnQpLCAnY2hpbGQnOiB0aGlzLnZpc2l0KHR5cGUuY2hpbGRyZW5bMF0pIH0pO1xuICAgIH1cbiAgICB2aXNpdE1hcCh0eXBlLCB7IGxlbmd0aCwgbnVsbENvdW50IH0gPSB0aGlzLm5leHRGaWVsZE5vZGUoKSkge1xuICAgICAgICByZXR1cm4gbWFrZURhdGEoeyB0eXBlLCBsZW5ndGgsIG51bGxDb3VudCwgbnVsbEJpdG1hcDogdGhpcy5yZWFkTnVsbEJpdG1hcCh0eXBlLCBudWxsQ291bnQpLCB2YWx1ZU9mZnNldHM6IHRoaXMucmVhZE9mZnNldHModHlwZSksICdjaGlsZCc6IHRoaXMudmlzaXQodHlwZS5jaGlsZHJlblswXSkgfSk7XG4gICAgfVxuICAgIG5leHRGaWVsZE5vZGUoKSB7IHJldHVybiB0aGlzLm5vZGVzWysrdGhpcy5ub2Rlc0luZGV4XTsgfVxuICAgIG5leHRCdWZmZXJSYW5nZSgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyc1srK3RoaXMuYnVmZmVyc0luZGV4XTsgfVxuICAgIHJlYWROdWxsQml0bWFwKHR5cGUsIG51bGxDb3VudCwgYnVmZmVyID0gdGhpcy5uZXh0QnVmZmVyUmFuZ2UoKSkge1xuICAgICAgICByZXR1cm4gbnVsbENvdW50ID4gMCAmJiB0aGlzLnJlYWREYXRhKHR5cGUsIGJ1ZmZlcikgfHwgbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgfVxuICAgIHJlYWRPZmZzZXRzKHR5cGUsIGJ1ZmZlcikgeyByZXR1cm4gdGhpcy5yZWFkRGF0YSh0eXBlLCBidWZmZXIpOyB9XG4gICAgcmVhZFR5cGVJZHModHlwZSwgYnVmZmVyKSB7IHJldHVybiB0aGlzLnJlYWREYXRhKHR5cGUsIGJ1ZmZlcik7IH1cbiAgICByZWFkRGF0YShfdHlwZSwgeyBsZW5ndGgsIG9mZnNldCB9ID0gdGhpcy5uZXh0QnVmZmVyUmFuZ2UoKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5ieXRlcy5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7XG4gICAgfVxuICAgIHJlYWREaWN0aW9uYXJ5KHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdGlvbmFyaWVzLmdldCh0eXBlLmlkKTtcbiAgICB9XG59XG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGNsYXNzIEpTT05WZWN0b3JMb2FkZXIgZXh0ZW5kcyBWZWN0b3JMb2FkZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZXMsIG5vZGVzLCBidWZmZXJzLCBkaWN0aW9uYXJpZXMpIHtcbiAgICAgICAgc3VwZXIobmV3IFVpbnQ4QXJyYXkoMCksIG5vZGVzLCBidWZmZXJzLCBkaWN0aW9uYXJpZXMpO1xuICAgICAgICB0aGlzLnNvdXJjZXMgPSBzb3VyY2VzO1xuICAgIH1cbiAgICByZWFkTnVsbEJpdG1hcChfdHlwZSwgbnVsbENvdW50LCB7IG9mZnNldCB9ID0gdGhpcy5uZXh0QnVmZmVyUmFuZ2UoKSkge1xuICAgICAgICByZXR1cm4gbnVsbENvdW50IDw9IDAgPyBuZXcgVWludDhBcnJheSgwKSA6IHBhY2tCb29scyh0aGlzLnNvdXJjZXNbb2Zmc2V0XSk7XG4gICAgfVxuICAgIHJlYWRPZmZzZXRzKF90eXBlLCB7IG9mZnNldCB9ID0gdGhpcy5uZXh0QnVmZmVyUmFuZ2UoKSkge1xuICAgICAgICByZXR1cm4gdG9BcnJheUJ1ZmZlclZpZXcoVWludDhBcnJheSwgdG9BcnJheUJ1ZmZlclZpZXcoSW50MzJBcnJheSwgdGhpcy5zb3VyY2VzW29mZnNldF0pKTtcbiAgICB9XG4gICAgcmVhZFR5cGVJZHModHlwZSwgeyBvZmZzZXQgfSA9IHRoaXMubmV4dEJ1ZmZlclJhbmdlKCkpIHtcbiAgICAgICAgcmV0dXJuIHRvQXJyYXlCdWZmZXJWaWV3KFVpbnQ4QXJyYXksIHRvQXJyYXlCdWZmZXJWaWV3KHR5cGUuQXJyYXlUeXBlLCB0aGlzLnNvdXJjZXNbb2Zmc2V0XSkpO1xuICAgIH1cbiAgICByZWFkRGF0YSh0eXBlLCB7IG9mZnNldCB9ID0gdGhpcy5uZXh0QnVmZmVyUmFuZ2UoKSkge1xuICAgICAgICBjb25zdCB7IHNvdXJjZXMgfSA9IHRoaXM7XG4gICAgICAgIGlmIChEYXRhVHlwZS5pc1RpbWVzdGFtcCh0eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRvQXJyYXlCdWZmZXJWaWV3KFVpbnQ4QXJyYXksIEludDY0LmNvbnZlcnRBcnJheShzb3VyY2VzW29mZnNldF0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoRGF0YVR5cGUuaXNJbnQodHlwZSkgfHwgRGF0YVR5cGUuaXNUaW1lKHR5cGUpKSAmJiB0eXBlLmJpdFdpZHRoID09PSA2NCkge1xuICAgICAgICAgICAgcmV0dXJuIHRvQXJyYXlCdWZmZXJWaWV3KFVpbnQ4QXJyYXksIEludDY0LmNvbnZlcnRBcnJheShzb3VyY2VzW29mZnNldF0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChEYXRhVHlwZS5pc0RhdGUodHlwZSkgJiYgdHlwZS51bml0ID09PSBEYXRlVW5pdC5NSUxMSVNFQ09ORCkge1xuICAgICAgICAgICAgcmV0dXJuIHRvQXJyYXlCdWZmZXJWaWV3KFVpbnQ4QXJyYXksIEludDY0LmNvbnZlcnRBcnJheShzb3VyY2VzW29mZnNldF0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChEYXRhVHlwZS5pc0RlY2ltYWwodHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0b0FycmF5QnVmZmVyVmlldyhVaW50OEFycmF5LCBJbnQxMjguY29udmVydEFycmF5KHNvdXJjZXNbb2Zmc2V0XSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKERhdGFUeXBlLmlzQmluYXJ5KHR5cGUpIHx8IERhdGFUeXBlLmlzRml4ZWRTaXplQmluYXJ5KHR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gYmluYXJ5RGF0YUZyb21KU09OKHNvdXJjZXNbb2Zmc2V0XSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoRGF0YVR5cGUuaXNCb29sKHR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFja0Jvb2xzKHNvdXJjZXNbb2Zmc2V0XSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoRGF0YVR5cGUuaXNVdGY4KHR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlVXRmOChzb3VyY2VzW29mZnNldF0uam9pbignJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b0FycmF5QnVmZmVyVmlldyhVaW50OEFycmF5LCB0b0FycmF5QnVmZmVyVmlldyh0eXBlLkFycmF5VHlwZSwgc291cmNlc1tvZmZzZXRdLm1hcCgoeCkgPT4gK3gpKSk7XG4gICAgfVxufVxuLyoqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIGJpbmFyeURhdGFGcm9tSlNPTih2YWx1ZXMpIHtcbiAgICAvLyBcIkRBVEFcIjogW1wiNDlCQzdENUI2QzQ3RDJcIixcIjNGNUZCNkQ5MzIyMDI2XCJdXG4gICAgLy8gVGhlcmUgYXJlIGRlZmluaXRlbHkgbW9yZSBlZmZpY2llbnQgd2F5cyB0byBkbyB0aGlzLi4uIGJ1dCBpdCBnZXRzIHRoZVxuICAgIC8vIGpvYiBkb25lLlxuICAgIGNvbnN0IGpvaW5lZCA9IHZhbHVlcy5qb2luKCcnKTtcbiAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoam9pbmVkLmxlbmd0aCAvIDIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgam9pbmVkLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIGRhdGFbaSA+PiAxXSA9IE51bWJlci5wYXJzZUludChqb2luZWQuc2xpY2UoaSwgaSArIDIpLCAxNik7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD12ZWN0b3Jsb2FkZXIubWpzLm1hcFxuIiwiaW1wb3J0IGRlZmluZSwge2V4dGVuZH0gZnJvbSBcIi4vZGVmaW5lLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBDb2xvcigpIHt9XG5cbmV4cG9ydCB2YXIgZGFya2VyID0gMC43O1xuZXhwb3J0IHZhciBicmlnaHRlciA9IDEgLyBkYXJrZXI7XG5cbnZhciByZUkgPSBcIlxcXFxzKihbKy1dP1xcXFxkKylcXFxccypcIixcbiAgICByZU4gPSBcIlxcXFxzKihbKy1dPyg/OlxcXFxkKlxcXFwuKT9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPylcXFxccypcIixcbiAgICByZVAgPSBcIlxcXFxzKihbKy1dPyg/OlxcXFxkKlxcXFwuKT9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPyklXFxcXHMqXCIsXG4gICAgcmVIZXggPSAvXiMoWzAtOWEtZl17Myw4fSkkLyxcbiAgICByZVJnYkludGVnZXIgPSBuZXcgUmVnRXhwKGBecmdiXFxcXCgke3JlSX0sJHtyZUl9LCR7cmVJfVxcXFwpJGApLFxuICAgIHJlUmdiUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5yZ2JcXFxcKCR7cmVQfSwke3JlUH0sJHtyZVB9XFxcXCkkYCksXG4gICAgcmVSZ2JhSW50ZWdlciA9IG5ldyBSZWdFeHAoYF5yZ2JhXFxcXCgke3JlSX0sJHtyZUl9LCR7cmVJfSwke3JlTn1cXFxcKSRgKSxcbiAgICByZVJnYmFQZXJjZW50ID0gbmV3IFJlZ0V4cChgXnJnYmFcXFxcKCR7cmVQfSwke3JlUH0sJHtyZVB9LCR7cmVOfVxcXFwpJGApLFxuICAgIHJlSHNsUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xcXFxcKCR7cmVOfSwke3JlUH0sJHtyZVB9XFxcXCkkYCksXG4gICAgcmVIc2xhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xhXFxcXCgke3JlTn0sJHtyZVB9LCR7cmVQfSwke3JlTn1cXFxcKSRgKTtcblxudmFyIG5hbWVkID0ge1xuICBhbGljZWJsdWU6IDB4ZjBmOGZmLFxuICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LFxuICBhcXVhOiAweDAwZmZmZixcbiAgYXF1YW1hcmluZTogMHg3ZmZmZDQsXG4gIGF6dXJlOiAweGYwZmZmZixcbiAgYmVpZ2U6IDB4ZjVmNWRjLFxuICBiaXNxdWU6IDB4ZmZlNGM0LFxuICBibGFjazogMHgwMDAwMDAsXG4gIGJsYW5jaGVkYWxtb25kOiAweGZmZWJjZCxcbiAgYmx1ZTogMHgwMDAwZmYsXG4gIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLFxuICBicm93bjogMHhhNTJhMmEsXG4gIGJ1cmx5d29vZDogMHhkZWI4ODcsXG4gIGNhZGV0Ymx1ZTogMHg1ZjllYTAsXG4gIGNoYXJ0cmV1c2U6IDB4N2ZmZjAwLFxuICBjaG9jb2xhdGU6IDB4ZDI2OTFlLFxuICBjb3JhbDogMHhmZjdmNTAsXG4gIGNvcm5mbG93ZXJibHVlOiAweDY0OTVlZCxcbiAgY29ybnNpbGs6IDB4ZmZmOGRjLFxuICBjcmltc29uOiAweGRjMTQzYyxcbiAgY3lhbjogMHgwMGZmZmYsXG4gIGRhcmtibHVlOiAweDAwMDA4YixcbiAgZGFya2N5YW46IDB4MDA4YjhiLFxuICBkYXJrZ29sZGVucm9kOiAweGI4ODYwYixcbiAgZGFya2dyYXk6IDB4YTlhOWE5LFxuICBkYXJrZ3JlZW46IDB4MDA2NDAwLFxuICBkYXJrZ3JleTogMHhhOWE5YTksXG4gIGRhcmtraGFraTogMHhiZGI3NmIsXG4gIGRhcmttYWdlbnRhOiAweDhiMDA4YixcbiAgZGFya29saXZlZ3JlZW46IDB4NTU2YjJmLFxuICBkYXJrb3JhbmdlOiAweGZmOGMwMCxcbiAgZGFya29yY2hpZDogMHg5OTMyY2MsXG4gIGRhcmtyZWQ6IDB4OGIwMDAwLFxuICBkYXJrc2FsbW9uOiAweGU5OTY3YSxcbiAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZixcbiAgZGFya3NsYXRlYmx1ZTogMHg0ODNkOGIsXG4gIGRhcmtzbGF0ZWdyYXk6IDB4MmY0ZjRmLFxuICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZixcbiAgZGFya3R1cnF1b2lzZTogMHgwMGNlZDEsXG4gIGRhcmt2aW9sZXQ6IDB4OTQwMGQzLFxuICBkZWVwcGluazogMHhmZjE0OTMsXG4gIGRlZXBza3libHVlOiAweDAwYmZmZixcbiAgZGltZ3JheTogMHg2OTY5NjksXG4gIGRpbWdyZXk6IDB4Njk2OTY5LFxuICBkb2RnZXJibHVlOiAweDFlOTBmZixcbiAgZmlyZWJyaWNrOiAweGIyMjIyMixcbiAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLFxuICBmb3Jlc3RncmVlbjogMHgyMjhiMjIsXG4gIGZ1Y2hzaWE6IDB4ZmYwMGZmLFxuICBnYWluc2Jvcm86IDB4ZGNkY2RjLFxuICBnaG9zdHdoaXRlOiAweGY4ZjhmZixcbiAgZ29sZDogMHhmZmQ3MDAsXG4gIGdvbGRlbnJvZDogMHhkYWE1MjAsXG4gIGdyYXk6IDB4ODA4MDgwLFxuICBncmVlbjogMHgwMDgwMDAsXG4gIGdyZWVueWVsbG93OiAweGFkZmYyZixcbiAgZ3JleTogMHg4MDgwODAsXG4gIGhvbmV5ZGV3OiAweGYwZmZmMCxcbiAgaG90cGluazogMHhmZjY5YjQsXG4gIGluZGlhbnJlZDogMHhjZDVjNWMsXG4gIGluZGlnbzogMHg0YjAwODIsXG4gIGl2b3J5OiAweGZmZmZmMCxcbiAga2hha2k6IDB4ZjBlNjhjLFxuICBsYXZlbmRlcjogMHhlNmU2ZmEsXG4gIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LFxuICBsYXduZ3JlZW46IDB4N2NmYzAwLFxuICBsZW1vbmNoaWZmb246IDB4ZmZmYWNkLFxuICBsaWdodGJsdWU6IDB4YWRkOGU2LFxuICBsaWdodGNvcmFsOiAweGYwODA4MCxcbiAgbGlnaHRjeWFuOiAweGUwZmZmZixcbiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLFxuICBsaWdodGdyYXk6IDB4ZDNkM2QzLFxuICBsaWdodGdyZWVuOiAweDkwZWU5MCxcbiAgbGlnaHRncmV5OiAweGQzZDNkMyxcbiAgbGlnaHRwaW5rOiAweGZmYjZjMSxcbiAgbGlnaHRzYWxtb246IDB4ZmZhMDdhLFxuICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSxcbiAgbGlnaHRza3libHVlOiAweDg3Y2VmYSxcbiAgbGlnaHRzbGF0ZWdyYXk6IDB4Nzc4ODk5LFxuICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksXG4gIGxpZ2h0c3RlZWxibHVlOiAweGIwYzRkZSxcbiAgbGlnaHR5ZWxsb3c6IDB4ZmZmZmUwLFxuICBsaW1lOiAweDAwZmYwMCxcbiAgbGltZWdyZWVuOiAweDMyY2QzMixcbiAgbGluZW46IDB4ZmFmMGU2LFxuICBtYWdlbnRhOiAweGZmMDBmZixcbiAgbWFyb29uOiAweDgwMDAwMCxcbiAgbWVkaXVtYXF1YW1hcmluZTogMHg2NmNkYWEsXG4gIG1lZGl1bWJsdWU6IDB4MDAwMGNkLFxuICBtZWRpdW1vcmNoaWQ6IDB4YmE1NWQzLFxuICBtZWRpdW1wdXJwbGU6IDB4OTM3MGRiLFxuICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsXG4gIG1lZGl1bXNsYXRlYmx1ZTogMHg3YjY4ZWUsXG4gIG1lZGl1bXNwcmluZ2dyZWVuOiAweDAwZmE5YSxcbiAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYyxcbiAgbWVkaXVtdmlvbGV0cmVkOiAweGM3MTU4NSxcbiAgbWlkbmlnaHRibHVlOiAweDE5MTk3MCxcbiAgbWludGNyZWFtOiAweGY1ZmZmYSxcbiAgbWlzdHlyb3NlOiAweGZmZTRlMSxcbiAgbW9jY2FzaW46IDB4ZmZlNGI1LFxuICBuYXZham93aGl0ZTogMHhmZmRlYWQsXG4gIG5hdnk6IDB4MDAwMDgwLFxuICBvbGRsYWNlOiAweGZkZjVlNixcbiAgb2xpdmU6IDB4ODA4MDAwLFxuICBvbGl2ZWRyYWI6IDB4NmI4ZTIzLFxuICBvcmFuZ2U6IDB4ZmZhNTAwLFxuICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLFxuICBvcmNoaWQ6IDB4ZGE3MGQ2LFxuICBwYWxlZ29sZGVucm9kOiAweGVlZThhYSxcbiAgcGFsZWdyZWVuOiAweDk4ZmI5OCxcbiAgcGFsZXR1cnF1b2lzZTogMHhhZmVlZWUsXG4gIHBhbGV2aW9sZXRyZWQ6IDB4ZGI3MDkzLFxuICBwYXBheWF3aGlwOiAweGZmZWZkNSxcbiAgcGVhY2hwdWZmOiAweGZmZGFiOSxcbiAgcGVydTogMHhjZDg1M2YsXG4gIHBpbms6IDB4ZmZjMGNiLFxuICBwbHVtOiAweGRkYTBkZCxcbiAgcG93ZGVyYmx1ZTogMHhiMGUwZTYsXG4gIHB1cnBsZTogMHg4MDAwODAsXG4gIHJlYmVjY2FwdXJwbGU6IDB4NjYzMzk5LFxuICByZWQ6IDB4ZmYwMDAwLFxuICByb3N5YnJvd246IDB4YmM4ZjhmLFxuICByb3lhbGJsdWU6IDB4NDE2OWUxLFxuICBzYWRkbGVicm93bjogMHg4YjQ1MTMsXG4gIHNhbG1vbjogMHhmYTgwNzIsXG4gIHNhbmR5YnJvd246IDB4ZjRhNDYwLFxuICBzZWFncmVlbjogMHgyZThiNTcsXG4gIHNlYXNoZWxsOiAweGZmZjVlZSxcbiAgc2llbm5hOiAweGEwNTIyZCxcbiAgc2lsdmVyOiAweGMwYzBjMCxcbiAgc2t5Ymx1ZTogMHg4N2NlZWIsXG4gIHNsYXRlYmx1ZTogMHg2YTVhY2QsXG4gIHNsYXRlZ3JheTogMHg3MDgwOTAsXG4gIHNsYXRlZ3JleTogMHg3MDgwOTAsXG4gIHNub3c6IDB4ZmZmYWZhLFxuICBzcHJpbmdncmVlbjogMHgwMGZmN2YsXG4gIHN0ZWVsYmx1ZTogMHg0NjgyYjQsXG4gIHRhbjogMHhkMmI0OGMsXG4gIHRlYWw6IDB4MDA4MDgwLFxuICB0aGlzdGxlOiAweGQ4YmZkOCxcbiAgdG9tYXRvOiAweGZmNjM0NyxcbiAgdHVycXVvaXNlOiAweDQwZTBkMCxcbiAgdmlvbGV0OiAweGVlODJlZSxcbiAgd2hlYXQ6IDB4ZjVkZWIzLFxuICB3aGl0ZTogMHhmZmZmZmYsXG4gIHdoaXRlc21va2U6IDB4ZjVmNWY1LFxuICB5ZWxsb3c6IDB4ZmZmZjAwLFxuICB5ZWxsb3dncmVlbjogMHg5YWNkMzJcbn07XG5cbmRlZmluZShDb2xvciwgY29sb3IsIHtcbiAgY29weShjaGFubmVscykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLCB0aGlzLCBjaGFubmVscyk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7XG4gIH0sXG4gIGhleDogY29sb3JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IGNvbG9yX2Zvcm1hdEhleCxcbiAgZm9ybWF0SGV4ODogY29sb3JfZm9ybWF0SGV4OCxcbiAgZm9ybWF0SHNsOiBjb2xvcl9mb3JtYXRIc2wsXG4gIGZvcm1hdFJnYjogY29sb3JfZm9ybWF0UmdiLFxuICB0b1N0cmluZzogY29sb3JfZm9ybWF0UmdiXG59KTtcblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4KCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4OCgpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4OCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRIc2woKSB7XG4gIHJldHVybiBoc2xDb252ZXJ0KHRoaXMpLmZvcm1hdEhzbCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRSZ2IoKSB7XG4gIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb2xvcihmb3JtYXQpIHtcbiAgdmFyIG0sIGw7XG4gIGZvcm1hdCA9IChmb3JtYXQgKyBcIlwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIChtID0gcmVIZXguZXhlYyhmb3JtYXQpKSA/IChsID0gbVsxXS5sZW5ndGgsIG0gPSBwYXJzZUludChtWzFdLCAxNiksIGwgPT09IDYgPyByZ2JuKG0pIC8vICNmZjAwMDBcbiAgICAgIDogbCA9PT0gMyA/IG5ldyBSZ2IoKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSwgMSkgLy8gI2YwMFxuICAgICAgOiBsID09PSA4ID8gcmdiYShtID4+IDI0ICYgMHhmZiwgbSA+PiAxNiAmIDB4ZmYsIG0gPj4gOCAmIDB4ZmYsIChtICYgMHhmZikgLyAweGZmKSAvLyAjZmYwMDAwMDBcbiAgICAgIDogbCA9PT0gNCA/IHJnYmEoKG0gPj4gMTIgJiAweGYpIHwgKG0gPj4gOCAmIDB4ZjApLCAobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSkgLyAweGZmKSAvLyAjZjAwMFxuICAgICAgOiBudWxsKSAvLyBpbnZhbGlkIGhleFxuICAgICAgOiAobSA9IHJlUmdiSW50ZWdlci5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdLCBtWzJdLCBtWzNdLCAxKSAvLyByZ2IoMjU1LCAwLCAwKVxuICAgICAgOiAobSA9IHJlUmdiUGVyY2VudC5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCAxKSAvLyByZ2IoMTAwJSwgMCUsIDAlKVxuICAgICAgOiAobSA9IHJlUmdiYUludGVnZXIuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSwgbVsyXSwgbVszXSwgbVs0XSkgLy8gcmdiYSgyNTUsIDAsIDAsIDEpXG4gICAgICA6IChtID0gcmVSZ2JhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCBtWzRdKSAvLyByZ2IoMTAwJSwgMCUsIDAlLCAxKVxuICAgICAgOiAobSA9IHJlSHNsUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCAxKSAvLyBoc2woMTIwLCA1MCUsIDUwJSlcbiAgICAgIDogKG0gPSByZUhzbGFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIG1bNF0pIC8vIGhzbGEoMTIwLCA1MCUsIDUwJSwgMSlcbiAgICAgIDogbmFtZWQuaGFzT3duUHJvcGVydHkoZm9ybWF0KSA/IHJnYm4obmFtZWRbZm9ybWF0XSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIDogZm9ybWF0ID09PSBcInRyYW5zcGFyZW50XCIgPyBuZXcgUmdiKE5hTiwgTmFOLCBOYU4sIDApXG4gICAgICA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJnYm4obikge1xuICByZXR1cm4gbmV3IFJnYihuID4+IDE2ICYgMHhmZiwgbiA+PiA4ICYgMHhmZiwgbiAmIDB4ZmYsIDEpO1xufVxuXG5mdW5jdGlvbiByZ2JhKHIsIGcsIGIsIGEpIHtcbiAgaWYgKGEgPD0gMCkgciA9IGcgPSBiID0gTmFOO1xuICByZXR1cm4gbmV3IFJnYihyLCBnLCBiLCBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYkNvbnZlcnQobykge1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBSZ2I7XG4gIG8gPSBvLnJnYigpO1xuICByZXR1cm4gbmV3IFJnYihvLnIsIG8uZywgby5iLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiKHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByZ2JDb252ZXJ0KHIpIDogbmV3IFJnYihyLCBnLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZ2IociwgZywgYiwgb3BhY2l0eSkge1xuICB0aGlzLnIgPSArcjtcbiAgdGhpcy5nID0gK2c7XG4gIHRoaXMuYiA9ICtiO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKFJnYiwgcmdiLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY2xhbXAoKSB7XG4gICAgcmV0dXJuIG5ldyBSZ2IoY2xhbXBpKHRoaXMuciksIGNsYW1waSh0aGlzLmcpLCBjbGFtcGkodGhpcy5iKSwgY2xhbXBhKHRoaXMub3BhY2l0eSkpO1xuICB9LFxuICBkaXNwbGF5YWJsZSgpIHtcbiAgICByZXR1cm4gKC0wLjUgPD0gdGhpcy5yICYmIHRoaXMuciA8IDI1NS41KVxuICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmcgJiYgdGhpcy5nIDwgMjU1LjUpXG4gICAgICAgICYmICgtMC41IDw9IHRoaXMuYiAmJiB0aGlzLmIgPCAyNTUuNSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTtcbiAgfSxcbiAgaGV4OiByZ2JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IHJnYl9mb3JtYXRIZXgsXG4gIGZvcm1hdEhleDg6IHJnYl9mb3JtYXRIZXg4LFxuICBmb3JtYXRSZ2I6IHJnYl9mb3JtYXRSZ2IsXG4gIHRvU3RyaW5nOiByZ2JfZm9ybWF0UmdiXG59KSk7XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgoKSB7XG4gIHJldHVybiBgIyR7aGV4KHRoaXMucil9JHtoZXgodGhpcy5nKX0ke2hleCh0aGlzLmIpfWA7XG59XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXg4KCkge1xuICByZXR1cm4gYCMke2hleCh0aGlzLnIpfSR7aGV4KHRoaXMuZyl9JHtoZXgodGhpcy5iKX0ke2hleCgoaXNOYU4odGhpcy5vcGFjaXR5KSA/IDEgOiB0aGlzLm9wYWNpdHkpICogMjU1KX1gO1xufVxuXG5mdW5jdGlvbiByZ2JfZm9ybWF0UmdiKCkge1xuICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7XG4gIHJldHVybiBgJHthID09PSAxID8gXCJyZ2IoXCIgOiBcInJnYmEoXCJ9JHtjbGFtcGkodGhpcy5yKX0sICR7Y2xhbXBpKHRoaXMuZyl9LCAke2NsYW1waSh0aGlzLmIpfSR7YSA9PT0gMSA/IFwiKVwiIDogYCwgJHthfSlgfWA7XG59XG5cbmZ1bmN0aW9uIGNsYW1wYShvcGFjaXR5KSB7XG4gIHJldHVybiBpc05hTihvcGFjaXR5KSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBvcGFjaXR5KSk7XG59XG5cbmZ1bmN0aW9uIGNsYW1waSh2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7XG59XG5cbmZ1bmN0aW9uIGhleCh2YWx1ZSkge1xuICB2YWx1ZSA9IGNsYW1waSh2YWx1ZSk7XG4gIHJldHVybiAodmFsdWUgPCAxNiA/IFwiMFwiIDogXCJcIikgKyB2YWx1ZS50b1N0cmluZygxNik7XG59XG5cbmZ1bmN0aW9uIGhzbGEoaCwgcywgbCwgYSkge1xuICBpZiAoYSA8PSAwKSBoID0gcyA9IGwgPSBOYU47XG4gIGVsc2UgaWYgKGwgPD0gMCB8fCBsID49IDEpIGggPSBzID0gTmFOO1xuICBlbHNlIGlmIChzIDw9IDApIGggPSBOYU47XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHNsQ29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbmV3IEhzbChvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpO1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBIc2w7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbztcbiAgbyA9IG8ucmdiKCk7XG4gIHZhciByID0gby5yIC8gMjU1LFxuICAgICAgZyA9IG8uZyAvIDI1NSxcbiAgICAgIGIgPSBvLmIgLyAyNTUsXG4gICAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKSxcbiAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLFxuICAgICAgaCA9IE5hTixcbiAgICAgIHMgPSBtYXggLSBtaW4sXG4gICAgICBsID0gKG1heCArIG1pbikgLyAyO1xuICBpZiAocykge1xuICAgIGlmIChyID09PSBtYXgpIGggPSAoZyAtIGIpIC8gcyArIChnIDwgYikgKiA2O1xuICAgIGVsc2UgaWYgKGcgPT09IG1heCkgaCA9IChiIC0gcikgLyBzICsgMjtcbiAgICBlbHNlIGggPSAociAtIGcpIC8gcyArIDQ7XG4gICAgcyAvPSBsIDwgMC41ID8gbWF4ICsgbWluIDogMiAtIG1heCAtIG1pbjtcbiAgICBoICo9IDYwO1xuICB9IGVsc2Uge1xuICAgIHMgPSBsID4gMCAmJiBsIDwgMSA/IDAgOiBoO1xuICB9XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQoaCkgOiBuZXcgSHNsKGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZnVuY3Rpb24gSHNsKGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgdGhpcy5oID0gK2g7XG4gIHRoaXMucyA9ICtzO1xuICB0aGlzLmwgPSArbDtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShIc2wsIGhzbCwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICB2YXIgaCA9IHRoaXMuaCAlIDM2MCArICh0aGlzLmggPCAwKSAqIDM2MCxcbiAgICAgICAgcyA9IGlzTmFOKGgpIHx8IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zLFxuICAgICAgICBsID0gdGhpcy5sLFxuICAgICAgICBtMiA9IGwgKyAobCA8IDAuNSA/IGwgOiAxIC0gbCkgKiBzLFxuICAgICAgICBtMSA9IDIgKiBsIC0gbTI7XG4gICAgcmV0dXJuIG5ldyBSZ2IoXG4gICAgICBoc2wycmdiKGggPj0gMjQwID8gaCAtIDI0MCA6IGggKyAxMjAsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGgsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGggPCAxMjAgPyBoICsgMjQwIDogaCAtIDEyMCwgbTEsIG0yKSxcbiAgICAgIHRoaXMub3BhY2l0eVxuICAgICk7XG4gIH0sXG4gIGNsYW1wKCkge1xuICAgIHJldHVybiBuZXcgSHNsKGNsYW1waCh0aGlzLmgpLCBjbGFtcHQodGhpcy5zKSwgY2xhbXB0KHRoaXMubCksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTtcbiAgfSxcbiAgZGlzcGxheWFibGUoKSB7XG4gICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKVxuICAgICAgICAmJiAoMCA8PSB0aGlzLmwgJiYgdGhpcy5sIDw9IDEpXG4gICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7XG4gIH0sXG4gIGZvcm1hdEhzbCgpIHtcbiAgICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7XG4gICAgcmV0dXJuIGAke2EgPT09IDEgPyBcImhzbChcIiA6IFwiaHNsYShcIn0ke2NsYW1waCh0aGlzLmgpfSwgJHtjbGFtcHQodGhpcy5zKSAqIDEwMH0lLCAke2NsYW1wdCh0aGlzLmwpICogMTAwfSUke2EgPT09IDEgPyBcIilcIiA6IGAsICR7YX0pYH1gO1xuICB9XG59KSk7XG5cbmZ1bmN0aW9uIGNsYW1waCh2YWx1ZSkge1xuICB2YWx1ZSA9ICh2YWx1ZSB8fCAwKSAlIDM2MDtcbiAgcmV0dXJuIHZhbHVlIDwgMCA/IHZhbHVlICsgMzYwIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNsYW1wdCh2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdmFsdWUgfHwgMCkpO1xufVxuXG4vKiBGcm9tIEZ2RCAxMy4zNywgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCAzICovXG5mdW5jdGlvbiBoc2wycmdiKGgsIG0xLCBtMikge1xuICByZXR1cm4gKGggPCA2MCA/IG0xICsgKG0yIC0gbTEpICogaCAvIDYwXG4gICAgICA6IGggPCAxODAgPyBtMlxuICAgICAgOiBoIDwgMjQwID8gbTEgKyAobTIgLSBtMSkgKiAoMjQwIC0gaCkgLyA2MFxuICAgICAgOiBtMSkgKiAyNTU7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb25zdHJ1Y3RvciwgZmFjdG9yeSwgcHJvdG90eXBlKSB7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGZhY3RvcnkucHJvdG90eXBlID0gcHJvdG90eXBlO1xuICBwcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3Rvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZChwYXJlbnQsIGRlZmluaXRpb24pIHtcbiAgdmFyIHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50LnByb3RvdHlwZSk7XG4gIGZvciAodmFyIGtleSBpbiBkZWZpbml0aW9uKSBwcm90b3R5cGVba2V5XSA9IGRlZmluaXRpb25ba2V5XTtcbiAgcmV0dXJuIHByb3RvdHlwZTtcbn1cbiIsInZhciBub29wID0ge3ZhbHVlOiAoKSA9PiB7fX07XG5cbmZ1bmN0aW9uIGRpc3BhdGNoKCkge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF8gPSB7fSwgdDsgaSA8IG47ICsraSkge1xuICAgIGlmICghKHQgPSBhcmd1bWVudHNbaV0gKyBcIlwiKSB8fCAodCBpbiBfKSB8fCAvW1xccy5dLy50ZXN0KHQpKSB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIHR5cGU6IFwiICsgdCk7XG4gICAgX1t0XSA9IFtdO1xuICB9XG4gIHJldHVybiBuZXcgRGlzcGF0Y2goXyk7XG59XG5cbmZ1bmN0aW9uIERpc3BhdGNoKF8pIHtcbiAgdGhpcy5fID0gXztcbn1cblxuZnVuY3Rpb24gcGFyc2VUeXBlbmFtZXModHlwZW5hbWVzLCB0eXBlcykge1xuICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgbmFtZSA9IFwiXCIsIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgaWYgKHQgJiYgIXR5cGVzLmhhc093blByb3BlcnR5KHQpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdCk7XG4gICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTtcbiAgfSk7XG59XG5cbkRpc3BhdGNoLnByb3RvdHlwZSA9IGRpc3BhdGNoLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IERpc3BhdGNoLFxuICBvbjogZnVuY3Rpb24odHlwZW5hbWUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIF8gPSB0aGlzLl8sXG4gICAgICAgIFQgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArIFwiXCIsIF8pLFxuICAgICAgICB0LFxuICAgICAgICBpID0gLTEsXG4gICAgICAgIG4gPSBULmxlbmd0aDtcblxuICAgIC8vIElmIG5vIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgY2FsbGJhY2sgb2YgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgJiYgKHQgPSBnZXQoX1t0XSwgdHlwZW5hbWUubmFtZSkpKSByZXR1cm4gdDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBhIHR5cGUgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBjYWxsYmFjayBmb3IgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuXG4gICAgLy8gT3RoZXJ3aXNlLCBpZiBhIG51bGwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmVtb3ZlIGNhbGxiYWNrcyBvZiB0aGUgZ2l2ZW4gbmFtZS5cbiAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCAmJiB0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBjYWxsYmFjazogXCIgKyBjYWxsYmFjayk7XG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIGlmICh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgX1t0XSA9IHNldChfW3RdLCB0eXBlbmFtZS5uYW1lLCBjYWxsYmFjayk7XG4gICAgICBlbHNlIGlmIChjYWxsYmFjayA9PSBudWxsKSBmb3IgKHQgaW4gXykgX1t0XSA9IHNldChfW3RdLCB0eXBlbmFtZS5uYW1lLCBudWxsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY29weTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNvcHkgPSB7fSwgXyA9IHRoaXMuXztcbiAgICBmb3IgKHZhciB0IGluIF8pIGNvcHlbdF0gPSBfW3RdLnNsaWNlKCk7XG4gICAgcmV0dXJuIG5ldyBEaXNwYXRjaChjb3B5KTtcbiAgfSxcbiAgY2FsbDogZnVuY3Rpb24odHlwZSwgdGhhdCkge1xuICAgIGlmICgobiA9IGFyZ3VtZW50cy5sZW5ndGggLSAyKSA+IDApIGZvciAodmFyIGFyZ3MgPSBuZXcgQXJyYXkobiksIGkgPSAwLCBuLCB0OyBpIDwgbjsgKytpKSBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICBpZiAoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHR5cGUpO1xuICAgIGZvciAodCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfSxcbiAgYXBwbHk6IGZ1bmN0aW9uKHR5cGUsIHRoYXQsIGFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHR5cGUpO1xuICAgIGZvciAodmFyIHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGdldCh0eXBlLCBuYW1lKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGgsIGM7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAoKGMgPSB0eXBlW2ldKS5uYW1lID09PSBuYW1lKSB7XG4gICAgICByZXR1cm4gYy52YWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0KHR5cGUsIG5hbWUsIGNhbGxiYWNrKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAodHlwZVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICB0eXBlW2ldID0gbm9vcCwgdHlwZSA9IHR5cGUuc2xpY2UoMCwgaSkuY29uY2F0KHR5cGUuc2xpY2UoaSArIDEpKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgdHlwZS5wdXNoKHtuYW1lOiBuYW1lLCB2YWx1ZTogY2FsbGJhY2t9KTtcbiAgcmV0dXJuIHR5cGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRpc3BhdGNoO1xuIiwiaW1wb3J0IHtzZWxlY3R9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCBub2V2ZW50LCB7bm9ucGFzc2l2ZWNhcHR1cmV9IGZyb20gXCIuL25vZXZlbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmlldykge1xuICB2YXIgcm9vdCA9IHZpZXcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgc2VsZWN0aW9uID0gc2VsZWN0KHZpZXcpLm9uKFwiZHJhZ3N0YXJ0LmRyYWdcIiwgbm9ldmVudCwgbm9ucGFzc2l2ZWNhcHR1cmUpO1xuICBpZiAoXCJvbnNlbGVjdHN0YXJ0XCIgaW4gcm9vdCkge1xuICAgIHNlbGVjdGlvbi5vbihcInNlbGVjdHN0YXJ0LmRyYWdcIiwgbm9ldmVudCwgbm9ucGFzc2l2ZWNhcHR1cmUpO1xuICB9IGVsc2Uge1xuICAgIHJvb3QuX19ub3NlbGVjdCA9IHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdDtcbiAgICByb290LnN0eWxlLk1velVzZXJTZWxlY3QgPSBcIm5vbmVcIjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24geWVzZHJhZyh2aWV3LCBub2NsaWNrKSB7XG4gIHZhciByb290ID0gdmlldy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICBzZWxlY3Rpb24gPSBzZWxlY3Qodmlldykub24oXCJkcmFnc3RhcnQuZHJhZ1wiLCBudWxsKTtcbiAgaWYgKG5vY2xpY2spIHtcbiAgICBzZWxlY3Rpb24ub24oXCJjbGljay5kcmFnXCIsIG5vZXZlbnQsIG5vbnBhc3NpdmVjYXB0dXJlKTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBzZWxlY3Rpb24ub24oXCJjbGljay5kcmFnXCIsIG51bGwpOyB9LCAwKTtcbiAgfVxuICBpZiAoXCJvbnNlbGVjdHN0YXJ0XCIgaW4gcm9vdCkge1xuICAgIHNlbGVjdGlvbi5vbihcInNlbGVjdHN0YXJ0LmRyYWdcIiwgbnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gcm9vdC5fX25vc2VsZWN0O1xuICAgIGRlbGV0ZSByb290Ll9fbm9zZWxlY3Q7XG4gIH1cbn1cbiIsIi8vIFRoZXNlIGFyZSB0eXBpY2FsbHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIG5vZXZlbnQgdG8gZW5zdXJlIHRoYXQgd2UgY2FuXG4vLyBwcmV2ZW50RGVmYXVsdCBvbiB0aGUgZXZlbnQuXG5leHBvcnQgY29uc3Qgbm9ucGFzc2l2ZSA9IHtwYXNzaXZlOiBmYWxzZX07XG5leHBvcnQgY29uc3Qgbm9ucGFzc2l2ZWNhcHR1cmUgPSB7Y2FwdHVyZTogdHJ1ZSwgcGFzc2l2ZTogZmFsc2V9O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9wcm9wYWdhdGlvbihldmVudCkge1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG4iLCJpbXBvcnQgZHN2IGZyb20gXCIuL2Rzdi5qc1wiO1xuXG52YXIgY3N2ID0gZHN2KFwiLFwiKTtcblxuZXhwb3J0IHZhciBjc3ZQYXJzZSA9IGNzdi5wYXJzZTtcbmV4cG9ydCB2YXIgY3N2UGFyc2VSb3dzID0gY3N2LnBhcnNlUm93cztcbmV4cG9ydCB2YXIgY3N2Rm9ybWF0ID0gY3N2LmZvcm1hdDtcbmV4cG9ydCB2YXIgY3N2Rm9ybWF0Qm9keSA9IGNzdi5mb3JtYXRCb2R5O1xuZXhwb3J0IHZhciBjc3ZGb3JtYXRSb3dzID0gY3N2LmZvcm1hdFJvd3M7XG5leHBvcnQgdmFyIGNzdkZvcm1hdFJvdyA9IGNzdi5mb3JtYXRSb3c7XG5leHBvcnQgdmFyIGNzdkZvcm1hdFZhbHVlID0gY3N2LmZvcm1hdFZhbHVlO1xuIiwidmFyIEVPTCA9IHt9LFxuICAgIEVPRiA9IHt9LFxuICAgIFFVT1RFID0gMzQsXG4gICAgTkVXTElORSA9IDEwLFxuICAgIFJFVFVSTiA9IDEzO1xuXG5mdW5jdGlvbiBvYmplY3RDb252ZXJ0ZXIoY29sdW1ucykge1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uKFwiZFwiLCBcInJldHVybiB7XCIgKyBjb2x1bW5zLm1hcChmdW5jdGlvbihuYW1lLCBpKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG5hbWUpICsgXCI6IGRbXCIgKyBpICsgXCJdIHx8IFxcXCJcXFwiXCI7XG4gIH0pLmpvaW4oXCIsXCIpICsgXCJ9XCIpO1xufVxuXG5mdW5jdGlvbiBjdXN0b21Db252ZXJ0ZXIoY29sdW1ucywgZikge1xuICB2YXIgb2JqZWN0ID0gb2JqZWN0Q29udmVydGVyKGNvbHVtbnMpO1xuICByZXR1cm4gZnVuY3Rpb24ocm93LCBpKSB7XG4gICAgcmV0dXJuIGYob2JqZWN0KHJvdyksIGksIGNvbHVtbnMpO1xuICB9O1xufVxuXG4vLyBDb21wdXRlIHVuaXF1ZSBjb2x1bW5zIGluIG9yZGVyIG9mIGRpc2NvdmVyeS5cbmZ1bmN0aW9uIGluZmVyQ29sdW1ucyhyb3dzKSB7XG4gIHZhciBjb2x1bW5TZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgY29sdW1ucyA9IFtdO1xuXG4gIHJvd3MuZm9yRWFjaChmdW5jdGlvbihyb3cpIHtcbiAgICBmb3IgKHZhciBjb2x1bW4gaW4gcm93KSB7XG4gICAgICBpZiAoIShjb2x1bW4gaW4gY29sdW1uU2V0KSkge1xuICAgICAgICBjb2x1bW5zLnB1c2goY29sdW1uU2V0W2NvbHVtbl0gPSBjb2x1bW4pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGNvbHVtbnM7XG59XG5cbmZ1bmN0aW9uIHBhZCh2YWx1ZSwgd2lkdGgpIHtcbiAgdmFyIHMgPSB2YWx1ZSArIFwiXCIsIGxlbmd0aCA9IHMubGVuZ3RoO1xuICByZXR1cm4gbGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKDApICsgcyA6IHM7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFllYXIoeWVhcikge1xuICByZXR1cm4geWVhciA8IDAgPyBcIi1cIiArIHBhZCgteWVhciwgNilcbiAgICA6IHllYXIgPiA5OTk5ID8gXCIrXCIgKyBwYWQoeWVhciwgNilcbiAgICA6IHBhZCh5ZWFyLCA0KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlKSB7XG4gIHZhciBob3VycyA9IGRhdGUuZ2V0VVRDSG91cnMoKSxcbiAgICAgIG1pbnV0ZXMgPSBkYXRlLmdldFVUQ01pbnV0ZXMoKSxcbiAgICAgIHNlY29uZHMgPSBkYXRlLmdldFVUQ1NlY29uZHMoKSxcbiAgICAgIG1pbGxpc2Vjb25kcyA9IGRhdGUuZ2V0VVRDTWlsbGlzZWNvbmRzKCk7XG4gIHJldHVybiBpc05hTihkYXRlKSA/IFwiSW52YWxpZCBEYXRlXCJcbiAgICAgIDogZm9ybWF0WWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCksIDQpICsgXCItXCIgKyBwYWQoZGF0ZS5nZXRVVENNb250aCgpICsgMSwgMikgKyBcIi1cIiArIHBhZChkYXRlLmdldFVUQ0RhdGUoKSwgMilcbiAgICAgICsgKG1pbGxpc2Vjb25kcyA/IFwiVFwiICsgcGFkKGhvdXJzLCAyKSArIFwiOlwiICsgcGFkKG1pbnV0ZXMsIDIpICsgXCI6XCIgKyBwYWQoc2Vjb25kcywgMikgKyBcIi5cIiArIHBhZChtaWxsaXNlY29uZHMsIDMpICsgXCJaXCJcbiAgICAgIDogc2Vjb25kcyA/IFwiVFwiICsgcGFkKGhvdXJzLCAyKSArIFwiOlwiICsgcGFkKG1pbnV0ZXMsIDIpICsgXCI6XCIgKyBwYWQoc2Vjb25kcywgMikgKyBcIlpcIlxuICAgICAgOiBtaW51dGVzIHx8IGhvdXJzID8gXCJUXCIgKyBwYWQoaG91cnMsIDIpICsgXCI6XCIgKyBwYWQobWludXRlcywgMikgKyBcIlpcIlxuICAgICAgOiBcIlwiKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZGVsaW1pdGVyKSB7XG4gIHZhciByZUZvcm1hdCA9IG5ldyBSZWdFeHAoXCJbXFxcIlwiICsgZGVsaW1pdGVyICsgXCJcXG5cXHJdXCIpLFxuICAgICAgREVMSU1JVEVSID0gZGVsaW1pdGVyLmNoYXJDb2RlQXQoMCk7XG5cbiAgZnVuY3Rpb24gcGFyc2UodGV4dCwgZikge1xuICAgIHZhciBjb252ZXJ0LCBjb2x1bW5zLCByb3dzID0gcGFyc2VSb3dzKHRleHQsIGZ1bmN0aW9uKHJvdywgaSkge1xuICAgICAgaWYgKGNvbnZlcnQpIHJldHVybiBjb252ZXJ0KHJvdywgaSAtIDEpO1xuICAgICAgY29sdW1ucyA9IHJvdywgY29udmVydCA9IGYgPyBjdXN0b21Db252ZXJ0ZXIocm93LCBmKSA6IG9iamVjdENvbnZlcnRlcihyb3cpO1xuICAgIH0pO1xuICAgIHJvd3MuY29sdW1ucyA9IGNvbHVtbnMgfHwgW107XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVJvd3ModGV4dCwgZikge1xuICAgIHZhciByb3dzID0gW10sIC8vIG91dHB1dCByb3dzXG4gICAgICAgIE4gPSB0ZXh0Lmxlbmd0aCxcbiAgICAgICAgSSA9IDAsIC8vIGN1cnJlbnQgY2hhcmFjdGVyIGluZGV4XG4gICAgICAgIG4gPSAwLCAvLyBjdXJyZW50IGxpbmUgbnVtYmVyXG4gICAgICAgIHQsIC8vIGN1cnJlbnQgdG9rZW5cbiAgICAgICAgZW9mID0gTiA8PSAwLCAvLyBjdXJyZW50IHRva2VuIGZvbGxvd2VkIGJ5IEVPRj9cbiAgICAgICAgZW9sID0gZmFsc2U7IC8vIGN1cnJlbnQgdG9rZW4gZm9sbG93ZWQgYnkgRU9MP1xuXG4gICAgLy8gU3RyaXAgdGhlIHRyYWlsaW5nIG5ld2xpbmUuXG4gICAgaWYgKHRleHQuY2hhckNvZGVBdChOIC0gMSkgPT09IE5FV0xJTkUpIC0tTjtcbiAgICBpZiAodGV4dC5jaGFyQ29kZUF0KE4gLSAxKSA9PT0gUkVUVVJOKSAtLU47XG5cbiAgICBmdW5jdGlvbiB0b2tlbigpIHtcbiAgICAgIGlmIChlb2YpIHJldHVybiBFT0Y7XG4gICAgICBpZiAoZW9sKSByZXR1cm4gZW9sID0gZmFsc2UsIEVPTDtcblxuICAgICAgLy8gVW5lc2NhcGUgcXVvdGVzLlxuICAgICAgdmFyIGksIGogPSBJLCBjO1xuICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChqKSA9PT0gUVVPVEUpIHtcbiAgICAgICAgd2hpbGUgKEkrKyA8IE4gJiYgdGV4dC5jaGFyQ29kZUF0KEkpICE9PSBRVU9URSB8fCB0ZXh0LmNoYXJDb2RlQXQoKytJKSA9PT0gUVVPVEUpO1xuICAgICAgICBpZiAoKGkgPSBJKSA+PSBOKSBlb2YgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmICgoYyA9IHRleHQuY2hhckNvZGVBdChJKyspKSA9PT0gTkVXTElORSkgZW9sID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoYyA9PT0gUkVUVVJOKSB7IGVvbCA9IHRydWU7IGlmICh0ZXh0LmNoYXJDb2RlQXQoSSkgPT09IE5FV0xJTkUpICsrSTsgfVxuICAgICAgICByZXR1cm4gdGV4dC5zbGljZShqICsgMSwgaSAtIDEpLnJlcGxhY2UoL1wiXCIvZywgXCJcXFwiXCIpO1xuICAgICAgfVxuXG4gICAgICAvLyBGaW5kIG5leHQgZGVsaW1pdGVyIG9yIG5ld2xpbmUuXG4gICAgICB3aGlsZSAoSSA8IE4pIHtcbiAgICAgICAgaWYgKChjID0gdGV4dC5jaGFyQ29kZUF0KGkgPSBJKyspKSA9PT0gTkVXTElORSkgZW9sID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoYyA9PT0gUkVUVVJOKSB7IGVvbCA9IHRydWU7IGlmICh0ZXh0LmNoYXJDb2RlQXQoSSkgPT09IE5FV0xJTkUpICsrSTsgfVxuICAgICAgICBlbHNlIGlmIChjICE9PSBERUxJTUlURVIpIGNvbnRpbnVlO1xuICAgICAgICByZXR1cm4gdGV4dC5zbGljZShqLCBpKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuIGxhc3QgdG9rZW4gYmVmb3JlIEVPRi5cbiAgICAgIHJldHVybiBlb2YgPSB0cnVlLCB0ZXh0LnNsaWNlKGosIE4pO1xuICAgIH1cblxuICAgIHdoaWxlICgodCA9IHRva2VuKCkpICE9PSBFT0YpIHtcbiAgICAgIHZhciByb3cgPSBbXTtcbiAgICAgIHdoaWxlICh0ICE9PSBFT0wgJiYgdCAhPT0gRU9GKSByb3cucHVzaCh0KSwgdCA9IHRva2VuKCk7XG4gICAgICBpZiAoZiAmJiAocm93ID0gZihyb3csIG4rKykpID09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgcm93cy5wdXNoKHJvdyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICBmdW5jdGlvbiBwcmVmb3JtYXRCb2R5KHJvd3MsIGNvbHVtbnMpIHtcbiAgICByZXR1cm4gcm93cy5tYXAoZnVuY3Rpb24ocm93KSB7XG4gICAgICByZXR1cm4gY29sdW1ucy5tYXAoZnVuY3Rpb24oY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXRWYWx1ZShyb3dbY29sdW1uXSk7XG4gICAgICB9KS5qb2luKGRlbGltaXRlcik7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXQocm93cywgY29sdW1ucykge1xuICAgIGlmIChjb2x1bW5zID09IG51bGwpIGNvbHVtbnMgPSBpbmZlckNvbHVtbnMocm93cyk7XG4gICAgcmV0dXJuIFtjb2x1bW5zLm1hcChmb3JtYXRWYWx1ZSkuam9pbihkZWxpbWl0ZXIpXS5jb25jYXQocHJlZm9ybWF0Qm9keShyb3dzLCBjb2x1bW5zKSkuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdEJvZHkocm93cywgY29sdW1ucykge1xuICAgIGlmIChjb2x1bW5zID09IG51bGwpIGNvbHVtbnMgPSBpbmZlckNvbHVtbnMocm93cyk7XG4gICAgcmV0dXJuIHByZWZvcm1hdEJvZHkocm93cywgY29sdW1ucykuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFJvd3Mocm93cykge1xuICAgIHJldHVybiByb3dzLm1hcChmb3JtYXRSb3cpLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRSb3cocm93KSB7XG4gICAgcmV0dXJuIHJvdy5tYXAoZm9ybWF0VmFsdWUpLmpvaW4oZGVsaW1pdGVyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBcIlwiXG4gICAgICAgIDogdmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gZm9ybWF0RGF0ZSh2YWx1ZSlcbiAgICAgICAgOiByZUZvcm1hdC50ZXN0KHZhbHVlICs9IFwiXCIpID8gXCJcXFwiXCIgKyB2YWx1ZS5yZXBsYWNlKC9cIi9nLCBcIlxcXCJcXFwiXCIpICsgXCJcXFwiXCJcbiAgICAgICAgOiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGFyc2U6IHBhcnNlLFxuICAgIHBhcnNlUm93czogcGFyc2VSb3dzLFxuICAgIGZvcm1hdDogZm9ybWF0LFxuICAgIGZvcm1hdEJvZHk6IGZvcm1hdEJvZHksXG4gICAgZm9ybWF0Um93czogZm9ybWF0Um93cyxcbiAgICBmb3JtYXRSb3c6IGZvcm1hdFJvdyxcbiAgICBmb3JtYXRWYWx1ZTogZm9ybWF0VmFsdWVcbiAgfTtcbn1cbiIsImltcG9ydCBkc3YgZnJvbSBcIi4vZHN2LmpzXCI7XG5cbnZhciB0c3YgPSBkc3YoXCJcXHRcIik7XG5cbmV4cG9ydCB2YXIgdHN2UGFyc2UgPSB0c3YucGFyc2U7XG5leHBvcnQgdmFyIHRzdlBhcnNlUm93cyA9IHRzdi5wYXJzZVJvd3M7XG5leHBvcnQgdmFyIHRzdkZvcm1hdCA9IHRzdi5mb3JtYXQ7XG5leHBvcnQgdmFyIHRzdkZvcm1hdEJvZHkgPSB0c3YuZm9ybWF0Qm9keTtcbmV4cG9ydCB2YXIgdHN2Rm9ybWF0Um93cyA9IHRzdi5mb3JtYXRSb3dzO1xuZXhwb3J0IHZhciB0c3ZGb3JtYXRSb3cgPSB0c3YuZm9ybWF0Um93O1xuZXhwb3J0IHZhciB0c3ZGb3JtYXRWYWx1ZSA9IHRzdi5mb3JtYXRWYWx1ZTtcbiIsImV4cG9ydCBmdW5jdGlvbiBjdWJpY0luKHQpIHtcbiAgcmV0dXJuIHQgKiB0ICogdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljT3V0KHQpIHtcbiAgcmV0dXJuIC0tdCAqIHQgKiB0ICsgMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW5PdXQodCkge1xuICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyB0ICogdCAqIHQgOiAodCAtPSAyKSAqIHQgKiB0ICsgMikgLyAyO1xufVxuIiwiaW1wb3J0IHtjc3ZQYXJzZSwgZHN2Rm9ybWF0LCB0c3ZQYXJzZX0gZnJvbSBcImQzLWRzdlwiO1xuaW1wb3J0IHRleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuXG5mdW5jdGlvbiBkc3ZQYXJzZShwYXJzZSkge1xuICByZXR1cm4gZnVuY3Rpb24oaW5wdXQsIGluaXQsIHJvdykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBpbml0ID09PSBcImZ1bmN0aW9uXCIpIHJvdyA9IGluaXQsIGluaXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRleHQoaW5wdXQsIGluaXQpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiBwYXJzZShyZXNwb25zZSwgcm93KTtcbiAgICB9KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZHN2KGRlbGltaXRlciwgaW5wdXQsIGluaXQsIHJvdykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2YgaW5pdCA9PT0gXCJmdW5jdGlvblwiKSByb3cgPSBpbml0LCBpbml0ID0gdW5kZWZpbmVkO1xuICB2YXIgZm9ybWF0ID0gZHN2Rm9ybWF0KGRlbGltaXRlcik7XG4gIHJldHVybiB0ZXh0KGlucHV0LCBpbml0KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIGZvcm1hdC5wYXJzZShyZXNwb25zZSwgcm93KTtcbiAgfSk7XG59XG5cbmV4cG9ydCB2YXIgY3N2ID0gZHN2UGFyc2UoY3N2UGFyc2UpO1xuZXhwb3J0IHZhciB0c3YgPSBkc3ZQYXJzZSh0c3ZQYXJzZSk7XG4iLCJmdW5jdGlvbiByZXNwb25zZUpzb24ocmVzcG9uc2UpIHtcbiAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1cyArIFwiIFwiICsgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwNCB8fCByZXNwb25zZS5zdGF0dXMgPT09IDIwNSkgcmV0dXJuO1xuICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnB1dCwgaW5pdCkge1xuICByZXR1cm4gZmV0Y2goaW5wdXQsIGluaXQpLnRoZW4ocmVzcG9uc2VKc29uKTtcbn1cbiIsImZ1bmN0aW9uIHJlc3BvbnNlVGV4dChyZXNwb25zZSkge1xuICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzICsgXCIgXCIgKyByZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5wdXQsIGluaXQpIHtcbiAgcmV0dXJuIGZldGNoKGlucHV0LCBpbml0KS50aGVuKHJlc3BvbnNlVGV4dCk7XG59XG4iLCJpbXBvcnQgZm9ybWF0TG9jYWxlIGZyb20gXCIuL2xvY2FsZS5qc1wiO1xuXG52YXIgbG9jYWxlO1xuZXhwb3J0IHZhciBmb3JtYXQ7XG5leHBvcnQgdmFyIGZvcm1hdFByZWZpeDtcblxuZGVmYXVsdExvY2FsZSh7XG4gIHRob3VzYW5kczogXCIsXCIsXG4gIGdyb3VwaW5nOiBbM10sXG4gIGN1cnJlbmN5OiBbXCIkXCIsIFwiXCJdXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVmYXVsdExvY2FsZShkZWZpbml0aW9uKSB7XG4gIGxvY2FsZSA9IGZvcm1hdExvY2FsZShkZWZpbml0aW9uKTtcbiAgZm9ybWF0ID0gbG9jYWxlLmZvcm1hdDtcbiAgZm9ybWF0UHJlZml4ID0gbG9jYWxlLmZvcm1hdFByZWZpeDtcbiAgcmV0dXJuIGxvY2FsZTtcbn1cbiIsImltcG9ydCB7Zm9ybWF0RGVjaW1hbFBhcnRzfSBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHggPSBmb3JtYXREZWNpbWFsUGFydHMoTWF0aC5hYnMoeCkpLCB4ID8geFsxXSA6IE5hTjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIE1hdGguYWJzKHggPSBNYXRoLnJvdW5kKHgpKSA+PSAxZTIxXG4gICAgICA/IHgudG9Mb2NhbGVTdHJpbmcoXCJlblwiKS5yZXBsYWNlKC8sL2csIFwiXCIpXG4gICAgICA6IHgudG9TdHJpbmcoMTApO1xufVxuXG4vLyBDb21wdXRlcyB0aGUgZGVjaW1hbCBjb2VmZmljaWVudCBhbmQgZXhwb25lbnQgb2YgdGhlIHNwZWNpZmllZCBudW1iZXIgeCB3aXRoXG4vLyBzaWduaWZpY2FudCBkaWdpdHMgcCwgd2hlcmUgeCBpcyBwb3NpdGl2ZSBhbmQgcCBpcyBpbiBbMSwgMjFdIG9yIHVuZGVmaW5lZC5cbi8vIEZvciBleGFtcGxlLCBmb3JtYXREZWNpbWFsUGFydHMoMS4yMykgcmV0dXJucyBbXCIxMjNcIiwgMF0uXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGVjaW1hbFBhcnRzKHgsIHApIHtcbiAgaWYgKChpID0gKHggPSBwID8geC50b0V4cG9uZW50aWFsKHAgLSAxKSA6IHgudG9FeHBvbmVudGlhbCgpKS5pbmRleE9mKFwiZVwiKSkgPCAwKSByZXR1cm4gbnVsbDsgLy8gTmFOLCDCsUluZmluaXR5XG4gIHZhciBpLCBjb2VmZmljaWVudCA9IHguc2xpY2UoMCwgaSk7XG5cbiAgLy8gVGhlIHN0cmluZyByZXR1cm5lZCBieSB0b0V4cG9uZW50aWFsIGVpdGhlciBoYXMgdGhlIGZvcm0gXFxkXFwuXFxkK2VbLStdXFxkK1xuICAvLyAoZS5nLiwgMS4yZSszKSBvciB0aGUgZm9ybSBcXGRlWy0rXVxcZCsgKGUuZy4sIDFlKzMpLlxuICByZXR1cm4gW1xuICAgIGNvZWZmaWNpZW50Lmxlbmd0aCA+IDEgPyBjb2VmZmljaWVudFswXSArIGNvZWZmaWNpZW50LnNsaWNlKDIpIDogY29lZmZpY2llbnQsXG4gICAgK3guc2xpY2UoaSArIDEpXG4gIF07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihncm91cGluZywgdGhvdXNhbmRzKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgd2lkdGgpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmxlbmd0aCxcbiAgICAgICAgdCA9IFtdLFxuICAgICAgICBqID0gMCxcbiAgICAgICAgZyA9IGdyb3VwaW5nWzBdLFxuICAgICAgICBsZW5ndGggPSAwO1xuXG4gICAgd2hpbGUgKGkgPiAwICYmIGcgPiAwKSB7XG4gICAgICBpZiAobGVuZ3RoICsgZyArIDEgPiB3aWR0aCkgZyA9IE1hdGgubWF4KDEsIHdpZHRoIC0gbGVuZ3RoKTtcbiAgICAgIHQucHVzaCh2YWx1ZS5zdWJzdHJpbmcoaSAtPSBnLCBpICsgZykpO1xuICAgICAgaWYgKChsZW5ndGggKz0gZyArIDEpID4gd2lkdGgpIGJyZWFrO1xuICAgICAgZyA9IGdyb3VwaW5nW2ogPSAoaiArIDEpICUgZ3JvdXBpbmcubGVuZ3RoXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdC5yZXZlcnNlKCkuam9pbih0aG91c2FuZHMpO1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obnVtZXJhbHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1swLTldL2csIGZ1bmN0aW9uKGkpIHtcbiAgICAgIHJldHVybiBudW1lcmFsc1sraV07XG4gICAgfSk7XG4gIH07XG59XG4iLCJpbXBvcnQge2Zvcm1hdERlY2ltYWxQYXJ0c30gZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgdmFyIHByZWZpeEV4cG9uZW50O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCBwKSB7XG4gIHZhciBkID0gZm9ybWF0RGVjaW1hbFBhcnRzKHgsIHApO1xuICBpZiAoIWQpIHJldHVybiB4ICsgXCJcIjtcbiAgdmFyIGNvZWZmaWNpZW50ID0gZFswXSxcbiAgICAgIGV4cG9uZW50ID0gZFsxXSxcbiAgICAgIGkgPSBleHBvbmVudCAtIChwcmVmaXhFeHBvbmVudCA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50IC8gMykpKSAqIDMpICsgMSxcbiAgICAgIG4gPSBjb2VmZmljaWVudC5sZW5ndGg7XG4gIHJldHVybiBpID09PSBuID8gY29lZmZpY2llbnRcbiAgICAgIDogaSA+IG4gPyBjb2VmZmljaWVudCArIG5ldyBBcnJheShpIC0gbiArIDEpLmpvaW4oXCIwXCIpXG4gICAgICA6IGkgPiAwID8gY29lZmZpY2llbnQuc2xpY2UoMCwgaSkgKyBcIi5cIiArIGNvZWZmaWNpZW50LnNsaWNlKGkpXG4gICAgICA6IFwiMC5cIiArIG5ldyBBcnJheSgxIC0gaSkuam9pbihcIjBcIikgKyBmb3JtYXREZWNpbWFsUGFydHMoeCwgTWF0aC5tYXgoMCwgcCArIGkgLSAxKSlbMF07IC8vIGxlc3MgdGhhbiAxeSFcbn1cbiIsImltcG9ydCB7Zm9ybWF0RGVjaW1hbFBhcnRzfSBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHApIHtcbiAgdmFyIGQgPSBmb3JtYXREZWNpbWFsUGFydHMoeCwgcCk7XG4gIGlmICghZCkgcmV0dXJuIHggKyBcIlwiO1xuICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLFxuICAgICAgZXhwb25lbnQgPSBkWzFdO1xuICByZXR1cm4gZXhwb25lbnQgPCAwID8gXCIwLlwiICsgbmV3IEFycmF5KC1leHBvbmVudCkuam9pbihcIjBcIikgKyBjb2VmZmljaWVudFxuICAgICAgOiBjb2VmZmljaWVudC5sZW5ndGggPiBleHBvbmVudCArIDEgPyBjb2VmZmljaWVudC5zbGljZSgwLCBleHBvbmVudCArIDEpICsgXCIuXCIgKyBjb2VmZmljaWVudC5zbGljZShleHBvbmVudCArIDEpXG4gICAgICA6IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGV4cG9uZW50IC0gY29lZmZpY2llbnQubGVuZ3RoICsgMikuam9pbihcIjBcIik7XG59XG4iLCIvLyBbW2ZpbGxdYWxpZ25dW3NpZ25dW3N5bWJvbF1bMF1bd2lkdGhdWyxdWy5wcmVjaXNpb25dW35dW3R5cGVdXG52YXIgcmUgPSAvXig/OiguKT8oWzw+PV5dKSk/KFsrXFwtKCBdKT8oWyQjXSk/KDApPyhcXGQrKT8oLCk/KFxcLlxcZCspPyh+KT8oW2EteiVdKT8kL2k7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpIHtcbiAgaWYgKCEobWF0Y2ggPSByZS5leGVjKHNwZWNpZmllcikpKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGZvcm1hdDogXCIgKyBzcGVjaWZpZXIpO1xuICB2YXIgbWF0Y2g7XG4gIHJldHVybiBuZXcgRm9ybWF0U3BlY2lmaWVyKHtcbiAgICBmaWxsOiBtYXRjaFsxXSxcbiAgICBhbGlnbjogbWF0Y2hbMl0sXG4gICAgc2lnbjogbWF0Y2hbM10sXG4gICAgc3ltYm9sOiBtYXRjaFs0XSxcbiAgICB6ZXJvOiBtYXRjaFs1XSxcbiAgICB3aWR0aDogbWF0Y2hbNl0sXG4gICAgY29tbWE6IG1hdGNoWzddLFxuICAgIHByZWNpc2lvbjogbWF0Y2hbOF0gJiYgbWF0Y2hbOF0uc2xpY2UoMSksXG4gICAgdHJpbTogbWF0Y2hbOV0sXG4gICAgdHlwZTogbWF0Y2hbMTBdXG4gIH0pO1xufVxuXG5mb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlID0gRm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZTsgLy8gaW5zdGFuY2VvZlxuXG5leHBvcnQgZnVuY3Rpb24gRm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcikge1xuICB0aGlzLmZpbGwgPSBzcGVjaWZpZXIuZmlsbCA9PT0gdW5kZWZpbmVkID8gXCIgXCIgOiBzcGVjaWZpZXIuZmlsbCArIFwiXCI7XG4gIHRoaXMuYWxpZ24gPSBzcGVjaWZpZXIuYWxpZ24gPT09IHVuZGVmaW5lZCA/IFwiPlwiIDogc3BlY2lmaWVyLmFsaWduICsgXCJcIjtcbiAgdGhpcy5zaWduID0gc3BlY2lmaWVyLnNpZ24gPT09IHVuZGVmaW5lZCA/IFwiLVwiIDogc3BlY2lmaWVyLnNpZ24gKyBcIlwiO1xuICB0aGlzLnN5bWJvbCA9IHNwZWNpZmllci5zeW1ib2wgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBzcGVjaWZpZXIuc3ltYm9sICsgXCJcIjtcbiAgdGhpcy56ZXJvID0gISFzcGVjaWZpZXIuemVybztcbiAgdGhpcy53aWR0aCA9IHNwZWNpZmllci53aWR0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogK3NwZWNpZmllci53aWR0aDtcbiAgdGhpcy5jb21tYSA9ICEhc3BlY2lmaWVyLmNvbW1hO1xuICB0aGlzLnByZWNpc2lvbiA9IHNwZWNpZmllci5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICtzcGVjaWZpZXIucHJlY2lzaW9uO1xuICB0aGlzLnRyaW0gPSAhIXNwZWNpZmllci50cmltO1xuICB0aGlzLnR5cGUgPSBzcGVjaWZpZXIudHlwZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHNwZWNpZmllci50eXBlICsgXCJcIjtcbn1cblxuRm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5maWxsXG4gICAgICArIHRoaXMuYWxpZ25cbiAgICAgICsgdGhpcy5zaWduXG4gICAgICArIHRoaXMuc3ltYm9sXG4gICAgICArICh0aGlzLnplcm8gPyBcIjBcIiA6IFwiXCIpXG4gICAgICArICh0aGlzLndpZHRoID09PSB1bmRlZmluZWQgPyBcIlwiIDogTWF0aC5tYXgoMSwgdGhpcy53aWR0aCB8IDApKVxuICAgICAgKyAodGhpcy5jb21tYSA/IFwiLFwiIDogXCJcIilcbiAgICAgICsgKHRoaXMucHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyBcIlwiIDogXCIuXCIgKyBNYXRoLm1heCgwLCB0aGlzLnByZWNpc2lvbiB8IDApKVxuICAgICAgKyAodGhpcy50cmltID8gXCJ+XCIgOiBcIlwiKVxuICAgICAgKyB0aGlzLnR5cGU7XG59O1xuIiwiLy8gVHJpbXMgaW5zaWduaWZpY2FudCB6ZXJvcywgZS5nLiwgcmVwbGFjZXMgMS4yMDAwayB3aXRoIDEuMmsuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzKSB7XG4gIG91dDogZm9yICh2YXIgbiA9IHMubGVuZ3RoLCBpID0gMSwgaTAgPSAtMSwgaTE7IGkgPCBuOyArK2kpIHtcbiAgICBzd2l0Y2ggKHNbaV0pIHtcbiAgICAgIGNhc2UgXCIuXCI6IGkwID0gaTEgPSBpOyBicmVhaztcbiAgICAgIGNhc2UgXCIwXCI6IGlmIChpMCA9PT0gMCkgaTAgPSBpOyBpMSA9IGk7IGJyZWFrO1xuICAgICAgZGVmYXVsdDogaWYgKCErc1tpXSkgYnJlYWsgb3V0OyBpZiAoaTAgPiAwKSBpMCA9IDA7IGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaTAgPiAwID8gcy5zbGljZSgwLCBpMCkgKyBzLnNsaWNlKGkxICsgMSkgOiBzO1xufVxuIiwiaW1wb3J0IGZvcm1hdERlY2ltYWwgZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuaW1wb3J0IGZvcm1hdFByZWZpeEF1dG8gZnJvbSBcIi4vZm9ybWF0UHJlZml4QXV0by5qc1wiO1xuaW1wb3J0IGZvcm1hdFJvdW5kZWQgZnJvbSBcIi4vZm9ybWF0Um91bmRlZC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIFwiJVwiOiAoeCwgcCkgPT4gKHggKiAxMDApLnRvRml4ZWQocCksXG4gIFwiYlwiOiAoeCkgPT4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygyKSxcbiAgXCJjXCI6ICh4KSA9PiB4ICsgXCJcIixcbiAgXCJkXCI6IGZvcm1hdERlY2ltYWwsXG4gIFwiZVwiOiAoeCwgcCkgPT4geC50b0V4cG9uZW50aWFsKHApLFxuICBcImZcIjogKHgsIHApID0+IHgudG9GaXhlZChwKSxcbiAgXCJnXCI6ICh4LCBwKSA9PiB4LnRvUHJlY2lzaW9uKHApLFxuICBcIm9cIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoOCksXG4gIFwicFwiOiAoeCwgcCkgPT4gZm9ybWF0Um91bmRlZCh4ICogMTAwLCBwKSxcbiAgXCJyXCI6IGZvcm1hdFJvdW5kZWQsXG4gIFwic1wiOiBmb3JtYXRQcmVmaXhBdXRvLFxuICBcIlhcIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCksXG4gIFwieFwiOiAoeCkgPT4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygxNilcbn07XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4O1xufVxuIiwiaW1wb3J0IGV4cG9uZW50IGZyb20gXCIuL2V4cG9uZW50LmpzXCI7XG5pbXBvcnQgZm9ybWF0R3JvdXAgZnJvbSBcIi4vZm9ybWF0R3JvdXAuanNcIjtcbmltcG9ydCBmb3JtYXROdW1lcmFscyBmcm9tIFwiLi9mb3JtYXROdW1lcmFscy5qc1wiO1xuaW1wb3J0IGZvcm1hdFNwZWNpZmllciBmcm9tIFwiLi9mb3JtYXRTcGVjaWZpZXIuanNcIjtcbmltcG9ydCBmb3JtYXRUcmltIGZyb20gXCIuL2Zvcm1hdFRyaW0uanNcIjtcbmltcG9ydCBmb3JtYXRUeXBlcyBmcm9tIFwiLi9mb3JtYXRUeXBlcy5qc1wiO1xuaW1wb3J0IHtwcmVmaXhFeHBvbmVudH0gZnJvbSBcIi4vZm9ybWF0UHJlZml4QXV0by5qc1wiO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gXCIuL2lkZW50aXR5LmpzXCI7XG5cbnZhciBtYXAgPSBBcnJheS5wcm90b3R5cGUubWFwLFxuICAgIHByZWZpeGVzID0gW1wieVwiLFwielwiLFwiYVwiLFwiZlwiLFwicFwiLFwiblwiLFwiwrVcIixcIm1cIixcIlwiLFwia1wiLFwiTVwiLFwiR1wiLFwiVFwiLFwiUFwiLFwiRVwiLFwiWlwiLFwiWVwiXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obG9jYWxlKSB7XG4gIHZhciBncm91cCA9IGxvY2FsZS5ncm91cGluZyA9PT0gdW5kZWZpbmVkIHx8IGxvY2FsZS50aG91c2FuZHMgPT09IHVuZGVmaW5lZCA/IGlkZW50aXR5IDogZm9ybWF0R3JvdXAobWFwLmNhbGwobG9jYWxlLmdyb3VwaW5nLCBOdW1iZXIpLCBsb2NhbGUudGhvdXNhbmRzICsgXCJcIiksXG4gICAgICBjdXJyZW5jeVByZWZpeCA9IGxvY2FsZS5jdXJyZW5jeSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGxvY2FsZS5jdXJyZW5jeVswXSArIFwiXCIsXG4gICAgICBjdXJyZW5jeVN1ZmZpeCA9IGxvY2FsZS5jdXJyZW5jeSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGxvY2FsZS5jdXJyZW5jeVsxXSArIFwiXCIsXG4gICAgICBkZWNpbWFsID0gbG9jYWxlLmRlY2ltYWwgPT09IHVuZGVmaW5lZCA/IFwiLlwiIDogbG9jYWxlLmRlY2ltYWwgKyBcIlwiLFxuICAgICAgbnVtZXJhbHMgPSBsb2NhbGUubnVtZXJhbHMgPT09IHVuZGVmaW5lZCA/IGlkZW50aXR5IDogZm9ybWF0TnVtZXJhbHMobWFwLmNhbGwobG9jYWxlLm51bWVyYWxzLCBTdHJpbmcpKSxcbiAgICAgIHBlcmNlbnQgPSBsb2NhbGUucGVyY2VudCA9PT0gdW5kZWZpbmVkID8gXCIlXCIgOiBsb2NhbGUucGVyY2VudCArIFwiXCIsXG4gICAgICBtaW51cyA9IGxvY2FsZS5taW51cyA9PT0gdW5kZWZpbmVkID8gXCLiiJJcIiA6IGxvY2FsZS5taW51cyArIFwiXCIsXG4gICAgICBuYW4gPSBsb2NhbGUubmFuID09PSB1bmRlZmluZWQgPyBcIk5hTlwiIDogbG9jYWxlLm5hbiArIFwiXCI7XG5cbiAgZnVuY3Rpb24gbmV3Rm9ybWF0KHNwZWNpZmllcikge1xuICAgIHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpO1xuXG4gICAgdmFyIGZpbGwgPSBzcGVjaWZpZXIuZmlsbCxcbiAgICAgICAgYWxpZ24gPSBzcGVjaWZpZXIuYWxpZ24sXG4gICAgICAgIHNpZ24gPSBzcGVjaWZpZXIuc2lnbixcbiAgICAgICAgc3ltYm9sID0gc3BlY2lmaWVyLnN5bWJvbCxcbiAgICAgICAgemVybyA9IHNwZWNpZmllci56ZXJvLFxuICAgICAgICB3aWR0aCA9IHNwZWNpZmllci53aWR0aCxcbiAgICAgICAgY29tbWEgPSBzcGVjaWZpZXIuY29tbWEsXG4gICAgICAgIHByZWNpc2lvbiA9IHNwZWNpZmllci5wcmVjaXNpb24sXG4gICAgICAgIHRyaW0gPSBzcGVjaWZpZXIudHJpbSxcbiAgICAgICAgdHlwZSA9IHNwZWNpZmllci50eXBlO1xuXG4gICAgLy8gVGhlIFwiblwiIHR5cGUgaXMgYW4gYWxpYXMgZm9yIFwiLGdcIi5cbiAgICBpZiAodHlwZSA9PT0gXCJuXCIpIGNvbW1hID0gdHJ1ZSwgdHlwZSA9IFwiZ1wiO1xuXG4gICAgLy8gVGhlIFwiXCIgdHlwZSwgYW5kIGFueSBpbnZhbGlkIHR5cGUsIGlzIGFuIGFsaWFzIGZvciBcIi4xMn5nXCIuXG4gICAgZWxzZSBpZiAoIWZvcm1hdFR5cGVzW3R5cGVdKSBwcmVjaXNpb24gPT09IHVuZGVmaW5lZCAmJiAocHJlY2lzaW9uID0gMTIpLCB0cmltID0gdHJ1ZSwgdHlwZSA9IFwiZ1wiO1xuXG4gICAgLy8gSWYgemVybyBmaWxsIGlzIHNwZWNpZmllZCwgcGFkZGluZyBnb2VzIGFmdGVyIHNpZ24gYW5kIGJlZm9yZSBkaWdpdHMuXG4gICAgaWYgKHplcm8gfHwgKGZpbGwgPT09IFwiMFwiICYmIGFsaWduID09PSBcIj1cIikpIHplcm8gPSB0cnVlLCBmaWxsID0gXCIwXCIsIGFsaWduID0gXCI9XCI7XG5cbiAgICAvLyBDb21wdXRlIHRoZSBwcmVmaXggYW5kIHN1ZmZpeC5cbiAgICAvLyBGb3IgU0ktcHJlZml4LCB0aGUgc3VmZml4IGlzIGxhemlseSBjb21wdXRlZC5cbiAgICB2YXIgcHJlZml4ID0gc3ltYm9sID09PSBcIiRcIiA/IGN1cnJlbmN5UHJlZml4IDogc3ltYm9sID09PSBcIiNcIiAmJiAvW2JveFhdLy50ZXN0KHR5cGUpID8gXCIwXCIgKyB0eXBlLnRvTG93ZXJDYXNlKCkgOiBcIlwiLFxuICAgICAgICBzdWZmaXggPSBzeW1ib2wgPT09IFwiJFwiID8gY3VycmVuY3lTdWZmaXggOiAvWyVwXS8udGVzdCh0eXBlKSA/IHBlcmNlbnQgOiBcIlwiO1xuXG4gICAgLy8gV2hhdCBmb3JtYXQgZnVuY3Rpb24gc2hvdWxkIHdlIHVzZT9cbiAgICAvLyBJcyB0aGlzIGFuIGludGVnZXIgdHlwZT9cbiAgICAvLyBDYW4gdGhpcyB0eXBlIGdlbmVyYXRlIGV4cG9uZW50aWFsIG5vdGF0aW9uP1xuICAgIHZhciBmb3JtYXRUeXBlID0gZm9ybWF0VHlwZXNbdHlwZV0sXG4gICAgICAgIG1heWJlU3VmZml4ID0gL1tkZWZncHJzJV0vLnRlc3QodHlwZSk7XG5cbiAgICAvLyBTZXQgdGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlmIG5vdCBzcGVjaWZpZWQsXG4gICAgLy8gb3IgY2xhbXAgdGhlIHNwZWNpZmllZCBwcmVjaXNpb24gdG8gdGhlIHN1cHBvcnRlZCByYW5nZS5cbiAgICAvLyBGb3Igc2lnbmlmaWNhbnQgcHJlY2lzaW9uLCBpdCBtdXN0IGJlIGluIFsxLCAyMV0uXG4gICAgLy8gRm9yIGZpeGVkIHByZWNpc2lvbiwgaXQgbXVzdCBiZSBpbiBbMCwgMjBdLlxuICAgIHByZWNpc2lvbiA9IHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gNlxuICAgICAgICA6IC9bZ3Byc10vLnRlc3QodHlwZSkgPyBNYXRoLm1heCgxLCBNYXRoLm1pbigyMSwgcHJlY2lzaW9uKSlcbiAgICAgICAgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigyMCwgcHJlY2lzaW9uKSk7XG5cbiAgICBmdW5jdGlvbiBmb3JtYXQodmFsdWUpIHtcbiAgICAgIHZhciB2YWx1ZVByZWZpeCA9IHByZWZpeCxcbiAgICAgICAgICB2YWx1ZVN1ZmZpeCA9IHN1ZmZpeCxcbiAgICAgICAgICBpLCBuLCBjO1xuXG4gICAgICBpZiAodHlwZSA9PT0gXCJjXCIpIHtcbiAgICAgICAgdmFsdWVTdWZmaXggPSBmb3JtYXRUeXBlKHZhbHVlKSArIHZhbHVlU3VmZml4O1xuICAgICAgICB2YWx1ZSA9IFwiXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9ICt2YWx1ZTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIHNpZ24uIC0wIGlzIG5vdCBsZXNzIHRoYW4gMCwgYnV0IDEgLyAtMCBpcyFcbiAgICAgICAgdmFyIHZhbHVlTmVnYXRpdmUgPSB2YWx1ZSA8IDAgfHwgMSAvIHZhbHVlIDwgMDtcblxuICAgICAgICAvLyBQZXJmb3JtIHRoZSBpbml0aWFsIGZvcm1hdHRpbmcuXG4gICAgICAgIHZhbHVlID0gaXNOYU4odmFsdWUpID8gbmFuIDogZm9ybWF0VHlwZShNYXRoLmFicyh2YWx1ZSksIHByZWNpc2lvbik7XG5cbiAgICAgICAgLy8gVHJpbSBpbnNpZ25pZmljYW50IHplcm9zLlxuICAgICAgICBpZiAodHJpbSkgdmFsdWUgPSBmb3JtYXRUcmltKHZhbHVlKTtcblxuICAgICAgICAvLyBJZiBhIG5lZ2F0aXZlIHZhbHVlIHJvdW5kcyB0byB6ZXJvIGFmdGVyIGZvcm1hdHRpbmcsIGFuZCBubyBleHBsaWNpdCBwb3NpdGl2ZSBzaWduIGlzIHJlcXVlc3RlZCwgaGlkZSB0aGUgc2lnbi5cbiAgICAgICAgaWYgKHZhbHVlTmVnYXRpdmUgJiYgK3ZhbHVlID09PSAwICYmIHNpZ24gIT09IFwiK1wiKSB2YWx1ZU5lZ2F0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgcHJlZml4IGFuZCBzdWZmaXguXG4gICAgICAgIHZhbHVlUHJlZml4ID0gKHZhbHVlTmVnYXRpdmUgPyAoc2lnbiA9PT0gXCIoXCIgPyBzaWduIDogbWludXMpIDogc2lnbiA9PT0gXCItXCIgfHwgc2lnbiA9PT0gXCIoXCIgPyBcIlwiIDogc2lnbikgKyB2YWx1ZVByZWZpeDtcbiAgICAgICAgdmFsdWVTdWZmaXggPSAodHlwZSA9PT0gXCJzXCIgPyBwcmVmaXhlc1s4ICsgcHJlZml4RXhwb25lbnQgLyAzXSA6IFwiXCIpICsgdmFsdWVTdWZmaXggKyAodmFsdWVOZWdhdGl2ZSAmJiBzaWduID09PSBcIihcIiA/IFwiKVwiIDogXCJcIik7XG5cbiAgICAgICAgLy8gQnJlYWsgdGhlIGZvcm1hdHRlZCB2YWx1ZSBpbnRvIHRoZSBpbnRlZ2VyIOKAnHZhbHVl4oCdIHBhcnQgdGhhdCBjYW4gYmVcbiAgICAgICAgLy8gZ3JvdXBlZCwgYW5kIGZyYWN0aW9uYWwgb3IgZXhwb25lbnRpYWwg4oCcc3VmZml44oCdIHBhcnQgdGhhdCBpcyBub3QuXG4gICAgICAgIGlmIChtYXliZVN1ZmZpeCkge1xuICAgICAgICAgIGkgPSAtMSwgbiA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICAgICAgaWYgKGMgPSB2YWx1ZS5jaGFyQ29kZUF0KGkpLCA0OCA+IGMgfHwgYyA+IDU3KSB7XG4gICAgICAgICAgICAgIHZhbHVlU3VmZml4ID0gKGMgPT09IDQ2ID8gZGVjaW1hbCArIHZhbHVlLnNsaWNlKGkgKyAxKSA6IHZhbHVlLnNsaWNlKGkpKSArIHZhbHVlU3VmZml4O1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzIG5vdCBcIjBcIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBiZWZvcmUgcGFkZGluZy5cbiAgICAgIGlmIChjb21tYSAmJiAhemVybykgdmFsdWUgPSBncm91cCh2YWx1ZSwgSW5maW5pdHkpO1xuXG4gICAgICAvLyBDb21wdXRlIHRoZSBwYWRkaW5nLlxuICAgICAgdmFyIGxlbmd0aCA9IHZhbHVlUHJlZml4Lmxlbmd0aCArIHZhbHVlLmxlbmd0aCArIHZhbHVlU3VmZml4Lmxlbmd0aCxcbiAgICAgICAgICBwYWRkaW5nID0gbGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKGZpbGwpIDogXCJcIjtcblxuICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzIFwiMFwiLCBncm91cGluZyBpcyBhcHBsaWVkIGFmdGVyIHBhZGRpbmcuXG4gICAgICBpZiAoY29tbWEgJiYgemVybykgdmFsdWUgPSBncm91cChwYWRkaW5nICsgdmFsdWUsIHBhZGRpbmcubGVuZ3RoID8gd2lkdGggLSB2YWx1ZVN1ZmZpeC5sZW5ndGggOiBJbmZpbml0eSksIHBhZGRpbmcgPSBcIlwiO1xuXG4gICAgICAvLyBSZWNvbnN0cnVjdCB0aGUgZmluYWwgb3V0cHV0IGJhc2VkIG9uIHRoZSBkZXNpcmVkIGFsaWdubWVudC5cbiAgICAgIHN3aXRjaCAoYWxpZ24pIHtcbiAgICAgICAgY2FzZSBcIjxcIjogdmFsdWUgPSB2YWx1ZVByZWZpeCArIHZhbHVlICsgdmFsdWVTdWZmaXggKyBwYWRkaW5nOyBicmVhaztcbiAgICAgICAgY2FzZSBcIj1cIjogdmFsdWUgPSB2YWx1ZVByZWZpeCArIHBhZGRpbmcgKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhaztcbiAgICAgICAgY2FzZSBcIl5cIjogdmFsdWUgPSBwYWRkaW5nLnNsaWNlKDAsIGxlbmd0aCA9IHBhZGRpbmcubGVuZ3RoID4+IDEpICsgdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZy5zbGljZShsZW5ndGgpOyBicmVhaztcbiAgICAgICAgZGVmYXVsdDogdmFsdWUgPSBwYWRkaW5nICsgdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhaztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bWVyYWxzKHZhbHVlKTtcbiAgICB9XG5cbiAgICBmb3JtYXQudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzcGVjaWZpZXIgKyBcIlwiO1xuICAgIH07XG5cbiAgICByZXR1cm4gZm9ybWF0O1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0UHJlZml4KHNwZWNpZmllciwgdmFsdWUpIHtcbiAgICB2YXIgZiA9IG5ld0Zvcm1hdCgoc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllciksIHNwZWNpZmllci50eXBlID0gXCJmXCIsIHNwZWNpZmllcikpLFxuICAgICAgICBlID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQodmFsdWUpIC8gMykpKSAqIDMsXG4gICAgICAgIGsgPSBNYXRoLnBvdygxMCwgLWUpLFxuICAgICAgICBwcmVmaXggPSBwcmVmaXhlc1s4ICsgZSAvIDNdO1xuICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGYoayAqIHZhbHVlKSArIHByZWZpeDtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmb3JtYXQ6IG5ld0Zvcm1hdCxcbiAgICBmb3JtYXRQcmVmaXg6IGZvcm1hdFByZWZpeFxuICB9O1xufVxuIiwiaW1wb3J0IHthc2luLCBhdGFuMiwgY29zLCBzaW4sIHNxcnR9IGZyb20gXCIuL21hdGguanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNwaGVyaWNhbChjYXJ0ZXNpYW4pIHtcbiAgcmV0dXJuIFthdGFuMihjYXJ0ZXNpYW5bMV0sIGNhcnRlc2lhblswXSksIGFzaW4oY2FydGVzaWFuWzJdKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYXJ0ZXNpYW4oc3BoZXJpY2FsKSB7XG4gIHZhciBsYW1iZGEgPSBzcGhlcmljYWxbMF0sIHBoaSA9IHNwaGVyaWNhbFsxXSwgY29zUGhpID0gY29zKHBoaSk7XG4gIHJldHVybiBbY29zUGhpICogY29zKGxhbWJkYSksIGNvc1BoaSAqIHNpbihsYW1iZGEpLCBzaW4ocGhpKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYXJ0ZXNpYW5Eb3QoYSwgYikge1xuICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FydGVzaWFuQ3Jvc3MoYSwgYikge1xuICByZXR1cm4gW2FbMV0gKiBiWzJdIC0gYVsyXSAqIGJbMV0sIGFbMl0gKiBiWzBdIC0gYVswXSAqIGJbMl0sIGFbMF0gKiBiWzFdIC0gYVsxXSAqIGJbMF1dO1xufVxuXG4vLyBUT0RPIHJldHVybiBhXG5leHBvcnQgZnVuY3Rpb24gY2FydGVzaWFuQWRkSW5QbGFjZShhLCBiKSB7XG4gIGFbMF0gKz0gYlswXSwgYVsxXSArPSBiWzFdLCBhWzJdICs9IGJbMl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYXJ0ZXNpYW5TY2FsZSh2ZWN0b3IsIGspIHtcbiAgcmV0dXJuIFt2ZWN0b3JbMF0gKiBrLCB2ZWN0b3JbMV0gKiBrLCB2ZWN0b3JbMl0gKiBrXTtcbn1cblxuLy8gVE9ETyByZXR1cm4gZFxuZXhwb3J0IGZ1bmN0aW9uIGNhcnRlc2lhbk5vcm1hbGl6ZUluUGxhY2UoZCkge1xuICB2YXIgbCA9IHNxcnQoZFswXSAqIGRbMF0gKyBkWzFdICogZFsxXSArIGRbMl0gKiBkWzJdKTtcbiAgZFswXSAvPSBsLCBkWzFdIC89IGwsIGRbMl0gLz0gbDtcbn1cbiIsImltcG9ydCB7Y2FydGVzaWFuLCBjYXJ0ZXNpYW5Ob3JtYWxpemVJblBsYWNlLCBzcGhlcmljYWx9IGZyb20gXCIuL2NhcnRlc2lhbi5qc1wiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQge2Fjb3MsIGNvcywgZGVncmVlcywgZXBzaWxvbiwgcmFkaWFucywgc2luLCB0YXV9IGZyb20gXCIuL21hdGguanNcIjtcbmltcG9ydCB7cm90YXRlUmFkaWFuc30gZnJvbSBcIi4vcm90YXRpb24uanNcIjtcblxuLy8gR2VuZXJhdGVzIGEgY2lyY2xlIGNlbnRlcmVkIGF0IFswwrAsIDDCsF0sIHdpdGggYSBnaXZlbiByYWRpdXMgYW5kIHByZWNpc2lvbi5cbmV4cG9ydCBmdW5jdGlvbiBjaXJjbGVTdHJlYW0oc3RyZWFtLCByYWRpdXMsIGRlbHRhLCBkaXJlY3Rpb24sIHQwLCB0MSkge1xuICBpZiAoIWRlbHRhKSByZXR1cm47XG4gIHZhciBjb3NSYWRpdXMgPSBjb3MocmFkaXVzKSxcbiAgICAgIHNpblJhZGl1cyA9IHNpbihyYWRpdXMpLFxuICAgICAgc3RlcCA9IGRpcmVjdGlvbiAqIGRlbHRhO1xuICBpZiAodDAgPT0gbnVsbCkge1xuICAgIHQwID0gcmFkaXVzICsgZGlyZWN0aW9uICogdGF1O1xuICAgIHQxID0gcmFkaXVzIC0gc3RlcCAvIDI7XG4gIH0gZWxzZSB7XG4gICAgdDAgPSBjaXJjbGVSYWRpdXMoY29zUmFkaXVzLCB0MCk7XG4gICAgdDEgPSBjaXJjbGVSYWRpdXMoY29zUmFkaXVzLCB0MSk7XG4gICAgaWYgKGRpcmVjdGlvbiA+IDAgPyB0MCA8IHQxIDogdDAgPiB0MSkgdDAgKz0gZGlyZWN0aW9uICogdGF1O1xuICB9XG4gIGZvciAodmFyIHBvaW50LCB0ID0gdDA7IGRpcmVjdGlvbiA+IDAgPyB0ID4gdDEgOiB0IDwgdDE7IHQgLT0gc3RlcCkge1xuICAgIHBvaW50ID0gc3BoZXJpY2FsKFtjb3NSYWRpdXMsIC1zaW5SYWRpdXMgKiBjb3ModCksIC1zaW5SYWRpdXMgKiBzaW4odCldKTtcbiAgICBzdHJlYW0ucG9pbnQocG9pbnRbMF0sIHBvaW50WzFdKTtcbiAgfVxufVxuXG4vLyBSZXR1cm5zIHRoZSBzaWduZWQgYW5nbGUgb2YgYSBjYXJ0ZXNpYW4gcG9pbnQgcmVsYXRpdmUgdG8gW2Nvc1JhZGl1cywgMCwgMF0uXG5mdW5jdGlvbiBjaXJjbGVSYWRpdXMoY29zUmFkaXVzLCBwb2ludCkge1xuICBwb2ludCA9IGNhcnRlc2lhbihwb2ludCksIHBvaW50WzBdIC09IGNvc1JhZGl1cztcbiAgY2FydGVzaWFuTm9ybWFsaXplSW5QbGFjZShwb2ludCk7XG4gIHZhciByYWRpdXMgPSBhY29zKC1wb2ludFsxXSk7XG4gIHJldHVybiAoKC1wb2ludFsyXSA8IDAgPyAtcmFkaXVzIDogcmFkaXVzKSArIHRhdSAtIGVwc2lsb24pICUgdGF1O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGNlbnRlciA9IGNvbnN0YW50KFswLCAwXSksXG4gICAgICByYWRpdXMgPSBjb25zdGFudCg5MCksXG4gICAgICBwcmVjaXNpb24gPSBjb25zdGFudCg2KSxcbiAgICAgIHJpbmcsXG4gICAgICByb3RhdGUsXG4gICAgICBzdHJlYW0gPSB7cG9pbnQ6IHBvaW50fTtcblxuICBmdW5jdGlvbiBwb2ludCh4LCB5KSB7XG4gICAgcmluZy5wdXNoKHggPSByb3RhdGUoeCwgeSkpO1xuICAgIHhbMF0gKj0gZGVncmVlcywgeFsxXSAqPSBkZWdyZWVzO1xuICB9XG5cbiAgZnVuY3Rpb24gY2lyY2xlKCkge1xuICAgIHZhciBjID0gY2VudGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgIHIgPSByYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSAqIHJhZGlhbnMsXG4gICAgICAgIHAgPSBwcmVjaXNpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKSAqIHJhZGlhbnM7XG4gICAgcmluZyA9IFtdO1xuICAgIHJvdGF0ZSA9IHJvdGF0ZVJhZGlhbnMoLWNbMF0gKiByYWRpYW5zLCAtY1sxXSAqIHJhZGlhbnMsIDApLmludmVydDtcbiAgICBjaXJjbGVTdHJlYW0oc3RyZWFtLCByLCBwLCAxKTtcbiAgICBjID0ge3R5cGU6IFwiUG9seWdvblwiLCBjb29yZGluYXRlczogW3JpbmddfTtcbiAgICByaW5nID0gcm90YXRlID0gbnVsbDtcbiAgICByZXR1cm4gYztcbiAgfVxuXG4gIGNpcmNsZS5jZW50ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2VudGVyID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChbK19bMF0sICtfWzFdXSksIGNpcmNsZSkgOiBjZW50ZXI7XG4gIH07XG5cbiAgY2lyY2xlLnJhZGl1cyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYWRpdXMgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgY2lyY2xlKSA6IHJhZGl1cztcbiAgfTtcblxuICBjaXJjbGUucHJlY2lzaW9uID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHByZWNpc2lvbiA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBjaXJjbGUpIDogcHJlY2lzaW9uO1xuICB9O1xuXG4gIHJldHVybiBjaXJjbGU7XG59XG4iLCJpbXBvcnQgY2xpcCBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHthYnMsIGF0YW4sIGNvcywgZXBzaWxvbiwgaGFsZlBpLCBwaSwgc2lufSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGlwKFxuICBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0sXG4gIGNsaXBBbnRpbWVyaWRpYW5MaW5lLFxuICBjbGlwQW50aW1lcmlkaWFuSW50ZXJwb2xhdGUsXG4gIFstcGksIC1oYWxmUGldXG4pO1xuXG4vLyBUYWtlcyBhIGxpbmUgYW5kIGN1dHMgaW50byB2aXNpYmxlIHNlZ21lbnRzLiBSZXR1cm4gdmFsdWVzOiAwIC0gdGhlcmUgd2VyZVxuLy8gaW50ZXJzZWN0aW9ucyBvciB0aGUgbGluZSB3YXMgZW1wdHk7IDEgLSBubyBpbnRlcnNlY3Rpb25zOyAyIC0gdGhlcmUgd2VyZVxuLy8gaW50ZXJzZWN0aW9ucywgYW5kIHRoZSBmaXJzdCBhbmQgbGFzdCBzZWdtZW50cyBzaG91bGQgYmUgcmVqb2luZWQuXG5mdW5jdGlvbiBjbGlwQW50aW1lcmlkaWFuTGluZShzdHJlYW0pIHtcbiAgdmFyIGxhbWJkYTAgPSBOYU4sXG4gICAgICBwaGkwID0gTmFOLFxuICAgICAgc2lnbjAgPSBOYU4sXG4gICAgICBjbGVhbjsgLy8gbm8gaW50ZXJzZWN0aW9uc1xuXG4gIHJldHVybiB7XG4gICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgIGNsZWFuID0gMTtcbiAgICB9LFxuICAgIHBvaW50OiBmdW5jdGlvbihsYW1iZGExLCBwaGkxKSB7XG4gICAgICB2YXIgc2lnbjEgPSBsYW1iZGExID4gMCA/IHBpIDogLXBpLFxuICAgICAgICAgIGRlbHRhID0gYWJzKGxhbWJkYTEgLSBsYW1iZGEwKTtcbiAgICAgIGlmIChhYnMoZGVsdGEgLSBwaSkgPCBlcHNpbG9uKSB7IC8vIGxpbmUgY3Jvc3NlcyBhIHBvbGVcbiAgICAgICAgc3RyZWFtLnBvaW50KGxhbWJkYTAsIHBoaTAgPSAocGhpMCArIHBoaTEpIC8gMiA+IDAgPyBoYWxmUGkgOiAtaGFsZlBpKTtcbiAgICAgICAgc3RyZWFtLnBvaW50KHNpZ24wLCBwaGkwKTtcbiAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICBzdHJlYW0ucG9pbnQoc2lnbjEsIHBoaTApO1xuICAgICAgICBzdHJlYW0ucG9pbnQobGFtYmRhMSwgcGhpMCk7XG4gICAgICAgIGNsZWFuID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoc2lnbjAgIT09IHNpZ24xICYmIGRlbHRhID49IHBpKSB7IC8vIGxpbmUgY3Jvc3NlcyBhbnRpbWVyaWRpYW5cbiAgICAgICAgaWYgKGFicyhsYW1iZGEwIC0gc2lnbjApIDwgZXBzaWxvbikgbGFtYmRhMCAtPSBzaWduMCAqIGVwc2lsb247IC8vIGhhbmRsZSBkZWdlbmVyYWNpZXNcbiAgICAgICAgaWYgKGFicyhsYW1iZGExIC0gc2lnbjEpIDwgZXBzaWxvbikgbGFtYmRhMSAtPSBzaWduMSAqIGVwc2lsb247XG4gICAgICAgIHBoaTAgPSBjbGlwQW50aW1lcmlkaWFuSW50ZXJzZWN0KGxhbWJkYTAsIHBoaTAsIGxhbWJkYTEsIHBoaTEpO1xuICAgICAgICBzdHJlYW0ucG9pbnQoc2lnbjAsIHBoaTApO1xuICAgICAgICBzdHJlYW0ubGluZUVuZCgpO1xuICAgICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICAgIHN0cmVhbS5wb2ludChzaWduMSwgcGhpMCk7XG4gICAgICAgIGNsZWFuID0gMDtcbiAgICAgIH1cbiAgICAgIHN0cmVhbS5wb2ludChsYW1iZGEwID0gbGFtYmRhMSwgcGhpMCA9IHBoaTEpO1xuICAgICAgc2lnbjAgPSBzaWduMTtcbiAgICB9LFxuICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgc3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgIGxhbWJkYTAgPSBwaGkwID0gTmFOO1xuICAgIH0sXG4gICAgY2xlYW46IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIDIgLSBjbGVhbjsgLy8gaWYgaW50ZXJzZWN0aW9ucywgcmVqb2luIGZpcnN0IGFuZCBsYXN0IHNlZ21lbnRzXG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjbGlwQW50aW1lcmlkaWFuSW50ZXJzZWN0KGxhbWJkYTAsIHBoaTAsIGxhbWJkYTEsIHBoaTEpIHtcbiAgdmFyIGNvc1BoaTAsXG4gICAgICBjb3NQaGkxLFxuICAgICAgc2luTGFtYmRhMExhbWJkYTEgPSBzaW4obGFtYmRhMCAtIGxhbWJkYTEpO1xuICByZXR1cm4gYWJzKHNpbkxhbWJkYTBMYW1iZGExKSA+IGVwc2lsb25cbiAgICAgID8gYXRhbigoc2luKHBoaTApICogKGNvc1BoaTEgPSBjb3MocGhpMSkpICogc2luKGxhbWJkYTEpXG4gICAgICAgICAgLSBzaW4ocGhpMSkgKiAoY29zUGhpMCA9IGNvcyhwaGkwKSkgKiBzaW4obGFtYmRhMCkpXG4gICAgICAgICAgLyAoY29zUGhpMCAqIGNvc1BoaTEgKiBzaW5MYW1iZGEwTGFtYmRhMSkpXG4gICAgICA6IChwaGkwICsgcGhpMSkgLyAyO1xufVxuXG5mdW5jdGlvbiBjbGlwQW50aW1lcmlkaWFuSW50ZXJwb2xhdGUoZnJvbSwgdG8sIGRpcmVjdGlvbiwgc3RyZWFtKSB7XG4gIHZhciBwaGk7XG4gIGlmIChmcm9tID09IG51bGwpIHtcbiAgICBwaGkgPSBkaXJlY3Rpb24gKiBoYWxmUGk7XG4gICAgc3RyZWFtLnBvaW50KC1waSwgcGhpKTtcbiAgICBzdHJlYW0ucG9pbnQoMCwgcGhpKTtcbiAgICBzdHJlYW0ucG9pbnQocGksIHBoaSk7XG4gICAgc3RyZWFtLnBvaW50KHBpLCAwKTtcbiAgICBzdHJlYW0ucG9pbnQocGksIC1waGkpO1xuICAgIHN0cmVhbS5wb2ludCgwLCAtcGhpKTtcbiAgICBzdHJlYW0ucG9pbnQoLXBpLCAtcGhpKTtcbiAgICBzdHJlYW0ucG9pbnQoLXBpLCAwKTtcbiAgICBzdHJlYW0ucG9pbnQoLXBpLCBwaGkpO1xuICB9IGVsc2UgaWYgKGFicyhmcm9tWzBdIC0gdG9bMF0pID4gZXBzaWxvbikge1xuICAgIHZhciBsYW1iZGEgPSBmcm9tWzBdIDwgdG9bMF0gPyBwaSA6IC1waTtcbiAgICBwaGkgPSBkaXJlY3Rpb24gKiBsYW1iZGEgLyAyO1xuICAgIHN0cmVhbS5wb2ludCgtbGFtYmRhLCBwaGkpO1xuICAgIHN0cmVhbS5wb2ludCgwLCBwaGkpO1xuICAgIHN0cmVhbS5wb2ludChsYW1iZGEsIHBoaSk7XG4gIH0gZWxzZSB7XG4gICAgc3RyZWFtLnBvaW50KHRvWzBdLCB0b1sxXSk7XG4gIH1cbn1cbiIsImltcG9ydCBub29wIGZyb20gXCIuLi9ub29wLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgbGluZXMgPSBbXSxcbiAgICAgIGxpbmU7XG4gIHJldHVybiB7XG4gICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHksIG0pIHtcbiAgICAgIGxpbmUucHVzaChbeCwgeSwgbV0pO1xuICAgIH0sXG4gICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgIGxpbmVzLnB1c2gobGluZSA9IFtdKTtcbiAgICB9LFxuICAgIGxpbmVFbmQ6IG5vb3AsXG4gICAgcmVqb2luOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChsaW5lcy5sZW5ndGggPiAxKSBsaW5lcy5wdXNoKGxpbmVzLnBvcCgpLmNvbmNhdChsaW5lcy5zaGlmdCgpKSk7XG4gICAgfSxcbiAgICByZXN1bHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGxpbmVzO1xuICAgICAgbGluZXMgPSBbXTtcbiAgICAgIGxpbmUgPSBudWxsO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH07XG59XG4iLCJpbXBvcnQge2NhcnRlc2lhbiwgY2FydGVzaWFuQWRkSW5QbGFjZSwgY2FydGVzaWFuQ3Jvc3MsIGNhcnRlc2lhbkRvdCwgY2FydGVzaWFuU2NhbGUsIHNwaGVyaWNhbH0gZnJvbSBcIi4uL2NhcnRlc2lhbi5qc1wiO1xuaW1wb3J0IHtjaXJjbGVTdHJlYW19IGZyb20gXCIuLi9jaXJjbGUuanNcIjtcbmltcG9ydCB7YWJzLCBjb3MsIGVwc2lsb24sIHBpLCByYWRpYW5zLCBzcXJ0fSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuaW1wb3J0IHBvaW50RXF1YWwgZnJvbSBcIi4uL3BvaW50RXF1YWwuanNcIjtcbmltcG9ydCBjbGlwIGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHJhZGl1cykge1xuICB2YXIgY3IgPSBjb3MocmFkaXVzKSxcbiAgICAgIGRlbHRhID0gNiAqIHJhZGlhbnMsXG4gICAgICBzbWFsbFJhZGl1cyA9IGNyID4gMCxcbiAgICAgIG5vdEhlbWlzcGhlcmUgPSBhYnMoY3IpID4gZXBzaWxvbjsgLy8gVE9ETyBvcHRpbWlzZSBmb3IgdGhpcyBjb21tb24gY2FzZVxuXG4gIGZ1bmN0aW9uIGludGVycG9sYXRlKGZyb20sIHRvLCBkaXJlY3Rpb24sIHN0cmVhbSkge1xuICAgIGNpcmNsZVN0cmVhbShzdHJlYW0sIHJhZGl1cywgZGVsdGEsIGRpcmVjdGlvbiwgZnJvbSwgdG8pO1xuICB9XG5cbiAgZnVuY3Rpb24gdmlzaWJsZShsYW1iZGEsIHBoaSkge1xuICAgIHJldHVybiBjb3MobGFtYmRhKSAqIGNvcyhwaGkpID4gY3I7XG4gIH1cblxuICAvLyBUYWtlcyBhIGxpbmUgYW5kIGN1dHMgaW50byB2aXNpYmxlIHNlZ21lbnRzLiBSZXR1cm4gdmFsdWVzIHVzZWQgZm9yIHBvbHlnb25cbiAgLy8gY2xpcHBpbmc6IDAgLSB0aGVyZSB3ZXJlIGludGVyc2VjdGlvbnMgb3IgdGhlIGxpbmUgd2FzIGVtcHR5OyAxIC0gbm9cbiAgLy8gaW50ZXJzZWN0aW9ucyAyIC0gdGhlcmUgd2VyZSBpbnRlcnNlY3Rpb25zLCBhbmQgdGhlIGZpcnN0IGFuZCBsYXN0IHNlZ21lbnRzXG4gIC8vIHNob3VsZCBiZSByZWpvaW5lZC5cbiAgZnVuY3Rpb24gY2xpcExpbmUoc3RyZWFtKSB7XG4gICAgdmFyIHBvaW50MCwgLy8gcHJldmlvdXMgcG9pbnRcbiAgICAgICAgYzAsIC8vIGNvZGUgZm9yIHByZXZpb3VzIHBvaW50XG4gICAgICAgIHYwLCAvLyB2aXNpYmlsaXR5IG9mIHByZXZpb3VzIHBvaW50XG4gICAgICAgIHYwMCwgLy8gdmlzaWJpbGl0eSBvZiBmaXJzdCBwb2ludFxuICAgICAgICBjbGVhbjsgLy8gbm8gaW50ZXJzZWN0aW9uc1xuICAgIHJldHVybiB7XG4gICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2MDAgPSB2MCA9IGZhbHNlO1xuICAgICAgICBjbGVhbiA9IDE7XG4gICAgICB9LFxuICAgICAgcG9pbnQ6IGZ1bmN0aW9uKGxhbWJkYSwgcGhpKSB7XG4gICAgICAgIHZhciBwb2ludDEgPSBbbGFtYmRhLCBwaGldLFxuICAgICAgICAgICAgcG9pbnQyLFxuICAgICAgICAgICAgdiA9IHZpc2libGUobGFtYmRhLCBwaGkpLFxuICAgICAgICAgICAgYyA9IHNtYWxsUmFkaXVzXG4gICAgICAgICAgICAgID8gdiA/IDAgOiBjb2RlKGxhbWJkYSwgcGhpKVxuICAgICAgICAgICAgICA6IHYgPyBjb2RlKGxhbWJkYSArIChsYW1iZGEgPCAwID8gcGkgOiAtcGkpLCBwaGkpIDogMDtcbiAgICAgICAgaWYgKCFwb2ludDAgJiYgKHYwMCA9IHYwID0gdikpIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgICAgaWYgKHYgIT09IHYwKSB7XG4gICAgICAgICAgcG9pbnQyID0gaW50ZXJzZWN0KHBvaW50MCwgcG9pbnQxKTtcbiAgICAgICAgICBpZiAoIXBvaW50MiB8fCBwb2ludEVxdWFsKHBvaW50MCwgcG9pbnQyKSB8fCBwb2ludEVxdWFsKHBvaW50MSwgcG9pbnQyKSlcbiAgICAgICAgICAgIHBvaW50MVsyXSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHYgIT09IHYwKSB7XG4gICAgICAgICAgY2xlYW4gPSAwO1xuICAgICAgICAgIGlmICh2KSB7XG4gICAgICAgICAgICAvLyBvdXRzaWRlIGdvaW5nIGluXG4gICAgICAgICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICAgICAgICBwb2ludDIgPSBpbnRlcnNlY3QocG9pbnQxLCBwb2ludDApO1xuICAgICAgICAgICAgc3RyZWFtLnBvaW50KHBvaW50MlswXSwgcG9pbnQyWzFdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaW5zaWRlIGdvaW5nIG91dFxuICAgICAgICAgICAgcG9pbnQyID0gaW50ZXJzZWN0KHBvaW50MCwgcG9pbnQxKTtcbiAgICAgICAgICAgIHN0cmVhbS5wb2ludChwb2ludDJbMF0sIHBvaW50MlsxXSwgMik7XG4gICAgICAgICAgICBzdHJlYW0ubGluZUVuZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwb2ludDAgPSBwb2ludDI7XG4gICAgICAgIH0gZWxzZSBpZiAobm90SGVtaXNwaGVyZSAmJiBwb2ludDAgJiYgc21hbGxSYWRpdXMgXiB2KSB7XG4gICAgICAgICAgdmFyIHQ7XG4gICAgICAgICAgLy8gSWYgdGhlIGNvZGVzIGZvciB0d28gcG9pbnRzIGFyZSBkaWZmZXJlbnQsIG9yIGFyZSBib3RoIHplcm8sXG4gICAgICAgICAgLy8gYW5kIHRoZXJlIHRoaXMgc2VnbWVudCBpbnRlcnNlY3RzIHdpdGggdGhlIHNtYWxsIGNpcmNsZS5cbiAgICAgICAgICBpZiAoIShjICYgYzApICYmICh0ID0gaW50ZXJzZWN0KHBvaW50MSwgcG9pbnQwLCB0cnVlKSkpIHtcbiAgICAgICAgICAgIGNsZWFuID0gMDtcbiAgICAgICAgICAgIGlmIChzbWFsbFJhZGl1cykge1xuICAgICAgICAgICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICAgICAgICAgIHN0cmVhbS5wb2ludCh0WzBdWzBdLCB0WzBdWzFdKTtcbiAgICAgICAgICAgICAgc3RyZWFtLnBvaW50KHRbMV1bMF0sIHRbMV1bMV0pO1xuICAgICAgICAgICAgICBzdHJlYW0ubGluZUVuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RyZWFtLnBvaW50KHRbMV1bMF0sIHRbMV1bMV0pO1xuICAgICAgICAgICAgICBzdHJlYW0ubGluZUVuZCgpO1xuICAgICAgICAgICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICAgICAgICAgIHN0cmVhbS5wb2ludCh0WzBdWzBdLCB0WzBdWzFdLCAzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHYgJiYgKCFwb2ludDAgfHwgIXBvaW50RXF1YWwocG9pbnQwLCBwb2ludDEpKSkge1xuICAgICAgICAgIHN0cmVhbS5wb2ludChwb2ludDFbMF0sIHBvaW50MVsxXSk7XG4gICAgICAgIH1cbiAgICAgICAgcG9pbnQwID0gcG9pbnQxLCB2MCA9IHYsIGMwID0gYztcbiAgICAgIH0sXG4gICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHYwKSBzdHJlYW0ubGluZUVuZCgpO1xuICAgICAgICBwb2ludDAgPSBudWxsO1xuICAgICAgfSxcbiAgICAgIC8vIFJlam9pbiBmaXJzdCBhbmQgbGFzdCBzZWdtZW50cyBpZiB0aGVyZSB3ZXJlIGludGVyc2VjdGlvbnMgYW5kIHRoZSBmaXJzdFxuICAgICAgLy8gYW5kIGxhc3QgcG9pbnRzIHdlcmUgdmlzaWJsZS5cbiAgICAgIGNsZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGNsZWFuIHwgKCh2MDAgJiYgdjApIDw8IDEpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBJbnRlcnNlY3RzIHRoZSBncmVhdCBjaXJjbGUgYmV0d2VlbiBhIGFuZCBiIHdpdGggdGhlIGNsaXAgY2lyY2xlLlxuICBmdW5jdGlvbiBpbnRlcnNlY3QoYSwgYiwgdHdvKSB7XG4gICAgdmFyIHBhID0gY2FydGVzaWFuKGEpLFxuICAgICAgICBwYiA9IGNhcnRlc2lhbihiKTtcblxuICAgIC8vIFdlIGhhdmUgdHdvIHBsYW5lcywgbjEucCA9IGQxIGFuZCBuMi5wID0gZDIuXG4gICAgLy8gRmluZCBpbnRlcnNlY3Rpb24gbGluZSBwKHQpID0gYzEgbjEgKyBjMiBuMiArIHQgKG4xIOKoryBuMikuXG4gICAgdmFyIG4xID0gWzEsIDAsIDBdLCAvLyBub3JtYWxcbiAgICAgICAgbjIgPSBjYXJ0ZXNpYW5Dcm9zcyhwYSwgcGIpLFxuICAgICAgICBuMm4yID0gY2FydGVzaWFuRG90KG4yLCBuMiksXG4gICAgICAgIG4xbjIgPSBuMlswXSwgLy8gY2FydGVzaWFuRG90KG4xLCBuMiksXG4gICAgICAgIGRldGVybWluYW50ID0gbjJuMiAtIG4xbjIgKiBuMW4yO1xuXG4gICAgLy8gVHdvIHBvbGFyIHBvaW50cy5cbiAgICBpZiAoIWRldGVybWluYW50KSByZXR1cm4gIXR3byAmJiBhO1xuXG4gICAgdmFyIGMxID0gIGNyICogbjJuMiAvIGRldGVybWluYW50LFxuICAgICAgICBjMiA9IC1jciAqIG4xbjIgLyBkZXRlcm1pbmFudCxcbiAgICAgICAgbjF4bjIgPSBjYXJ0ZXNpYW5Dcm9zcyhuMSwgbjIpLFxuICAgICAgICBBID0gY2FydGVzaWFuU2NhbGUobjEsIGMxKSxcbiAgICAgICAgQiA9IGNhcnRlc2lhblNjYWxlKG4yLCBjMik7XG4gICAgY2FydGVzaWFuQWRkSW5QbGFjZShBLCBCKTtcblxuICAgIC8vIFNvbHZlIHxwKHQpfF4yID0gMS5cbiAgICB2YXIgdSA9IG4xeG4yLFxuICAgICAgICB3ID0gY2FydGVzaWFuRG90KEEsIHUpLFxuICAgICAgICB1dSA9IGNhcnRlc2lhbkRvdCh1LCB1KSxcbiAgICAgICAgdDIgPSB3ICogdyAtIHV1ICogKGNhcnRlc2lhbkRvdChBLCBBKSAtIDEpO1xuXG4gICAgaWYgKHQyIDwgMCkgcmV0dXJuO1xuXG4gICAgdmFyIHQgPSBzcXJ0KHQyKSxcbiAgICAgICAgcSA9IGNhcnRlc2lhblNjYWxlKHUsICgtdyAtIHQpIC8gdXUpO1xuICAgIGNhcnRlc2lhbkFkZEluUGxhY2UocSwgQSk7XG4gICAgcSA9IHNwaGVyaWNhbChxKTtcblxuICAgIGlmICghdHdvKSByZXR1cm4gcTtcblxuICAgIC8vIFR3byBpbnRlcnNlY3Rpb24gcG9pbnRzLlxuICAgIHZhciBsYW1iZGEwID0gYVswXSxcbiAgICAgICAgbGFtYmRhMSA9IGJbMF0sXG4gICAgICAgIHBoaTAgPSBhWzFdLFxuICAgICAgICBwaGkxID0gYlsxXSxcbiAgICAgICAgejtcblxuICAgIGlmIChsYW1iZGExIDwgbGFtYmRhMCkgeiA9IGxhbWJkYTAsIGxhbWJkYTAgPSBsYW1iZGExLCBsYW1iZGExID0gejtcblxuICAgIHZhciBkZWx0YSA9IGxhbWJkYTEgLSBsYW1iZGEwLFxuICAgICAgICBwb2xhciA9IGFicyhkZWx0YSAtIHBpKSA8IGVwc2lsb24sXG4gICAgICAgIG1lcmlkaWFuID0gcG9sYXIgfHwgZGVsdGEgPCBlcHNpbG9uO1xuXG4gICAgaWYgKCFwb2xhciAmJiBwaGkxIDwgcGhpMCkgeiA9IHBoaTAsIHBoaTAgPSBwaGkxLCBwaGkxID0gejtcblxuICAgIC8vIENoZWNrIHRoYXQgdGhlIGZpcnN0IHBvaW50IGlzIGJldHdlZW4gYSBhbmQgYi5cbiAgICBpZiAobWVyaWRpYW5cbiAgICAgICAgPyBwb2xhclxuICAgICAgICAgID8gcGhpMCArIHBoaTEgPiAwIF4gcVsxXSA8IChhYnMocVswXSAtIGxhbWJkYTApIDwgZXBzaWxvbiA/IHBoaTAgOiBwaGkxKVxuICAgICAgICAgIDogcGhpMCA8PSBxWzFdICYmIHFbMV0gPD0gcGhpMVxuICAgICAgICA6IGRlbHRhID4gcGkgXiAobGFtYmRhMCA8PSBxWzBdICYmIHFbMF0gPD0gbGFtYmRhMSkpIHtcbiAgICAgIHZhciBxMSA9IGNhcnRlc2lhblNjYWxlKHUsICgtdyArIHQpIC8gdXUpO1xuICAgICAgY2FydGVzaWFuQWRkSW5QbGFjZShxMSwgQSk7XG4gICAgICByZXR1cm4gW3EsIHNwaGVyaWNhbChxMSldO1xuICAgIH1cbiAgfVxuXG4gIC8vIEdlbmVyYXRlcyBhIDQtYml0IHZlY3RvciByZXByZXNlbnRpbmcgdGhlIGxvY2F0aW9uIG9mIGEgcG9pbnQgcmVsYXRpdmUgdG9cbiAgLy8gdGhlIHNtYWxsIGNpcmNsZSdzIGJvdW5kaW5nIGJveC5cbiAgZnVuY3Rpb24gY29kZShsYW1iZGEsIHBoaSkge1xuICAgIHZhciByID0gc21hbGxSYWRpdXMgPyByYWRpdXMgOiBwaSAtIHJhZGl1cyxcbiAgICAgICAgY29kZSA9IDA7XG4gICAgaWYgKGxhbWJkYSA8IC1yKSBjb2RlIHw9IDE7IC8vIGxlZnRcbiAgICBlbHNlIGlmIChsYW1iZGEgPiByKSBjb2RlIHw9IDI7IC8vIHJpZ2h0XG4gICAgaWYgKHBoaSA8IC1yKSBjb2RlIHw9IDQ7IC8vIGJlbG93XG4gICAgZWxzZSBpZiAocGhpID4gcikgY29kZSB8PSA4OyAvLyBhYm92ZVxuICAgIHJldHVybiBjb2RlO1xuICB9XG5cbiAgcmV0dXJuIGNsaXAodmlzaWJsZSwgY2xpcExpbmUsIGludGVycG9sYXRlLCBzbWFsbFJhZGl1cyA/IFswLCAtcmFkaXVzXSA6IFstcGksIHJhZGl1cyAtIHBpXSk7XG59XG4iLCJpbXBvcnQgY2xpcEJ1ZmZlciBmcm9tIFwiLi9idWZmZXIuanNcIjtcbmltcG9ydCBjbGlwUmVqb2luIGZyb20gXCIuL3Jlam9pbi5qc1wiO1xuaW1wb3J0IHtlcHNpbG9uLCBoYWxmUGl9IGZyb20gXCIuLi9tYXRoLmpzXCI7XG5pbXBvcnQgcG9seWdvbkNvbnRhaW5zIGZyb20gXCIuLi9wb2x5Z29uQ29udGFpbnMuanNcIjtcbmltcG9ydCB7bWVyZ2V9IGZyb20gXCJkMy1hcnJheVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihwb2ludFZpc2libGUsIGNsaXBMaW5lLCBpbnRlcnBvbGF0ZSwgc3RhcnQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHNpbmspIHtcbiAgICB2YXIgbGluZSA9IGNsaXBMaW5lKHNpbmspLFxuICAgICAgICByaW5nQnVmZmVyID0gY2xpcEJ1ZmZlcigpLFxuICAgICAgICByaW5nU2luayA9IGNsaXBMaW5lKHJpbmdCdWZmZXIpLFxuICAgICAgICBwb2x5Z29uU3RhcnRlZCA9IGZhbHNlLFxuICAgICAgICBwb2x5Z29uLFxuICAgICAgICBzZWdtZW50cyxcbiAgICAgICAgcmluZztcblxuICAgIHZhciBjbGlwID0ge1xuICAgICAgcG9pbnQ6IHBvaW50LFxuICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsXG4gICAgICBsaW5lRW5kOiBsaW5lRW5kLFxuICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgY2xpcC5wb2ludCA9IHBvaW50UmluZztcbiAgICAgICAgY2xpcC5saW5lU3RhcnQgPSByaW5nU3RhcnQ7XG4gICAgICAgIGNsaXAubGluZUVuZCA9IHJpbmdFbmQ7XG4gICAgICAgIHNlZ21lbnRzID0gW107XG4gICAgICAgIHBvbHlnb24gPSBbXTtcbiAgICAgIH0sXG4gICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHtcbiAgICAgICAgY2xpcC5wb2ludCA9IHBvaW50O1xuICAgICAgICBjbGlwLmxpbmVTdGFydCA9IGxpbmVTdGFydDtcbiAgICAgICAgY2xpcC5saW5lRW5kID0gbGluZUVuZDtcbiAgICAgICAgc2VnbWVudHMgPSBtZXJnZShzZWdtZW50cyk7XG4gICAgICAgIHZhciBzdGFydEluc2lkZSA9IHBvbHlnb25Db250YWlucyhwb2x5Z29uLCBzdGFydCk7XG4gICAgICAgIGlmIChzZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAoIXBvbHlnb25TdGFydGVkKSBzaW5rLnBvbHlnb25TdGFydCgpLCBwb2x5Z29uU3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgY2xpcFJlam9pbihzZWdtZW50cywgY29tcGFyZUludGVyc2VjdGlvbiwgc3RhcnRJbnNpZGUsIGludGVycG9sYXRlLCBzaW5rKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGFydEluc2lkZSkge1xuICAgICAgICAgIGlmICghcG9seWdvblN0YXJ0ZWQpIHNpbmsucG9seWdvblN0YXJ0KCksIHBvbHlnb25TdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICBzaW5rLmxpbmVTdGFydCgpO1xuICAgICAgICAgIGludGVycG9sYXRlKG51bGwsIG51bGwsIDEsIHNpbmspO1xuICAgICAgICAgIHNpbmsubGluZUVuZCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb2x5Z29uU3RhcnRlZCkgc2luay5wb2x5Z29uRW5kKCksIHBvbHlnb25TdGFydGVkID0gZmFsc2U7XG4gICAgICAgIHNlZ21lbnRzID0gcG9seWdvbiA9IG51bGw7XG4gICAgICB9LFxuICAgICAgc3BoZXJlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgc2luay5wb2x5Z29uU3RhcnQoKTtcbiAgICAgICAgc2luay5saW5lU3RhcnQoKTtcbiAgICAgICAgaW50ZXJwb2xhdGUobnVsbCwgbnVsbCwgMSwgc2luayk7XG4gICAgICAgIHNpbmsubGluZUVuZCgpO1xuICAgICAgICBzaW5rLnBvbHlnb25FbmQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcG9pbnQobGFtYmRhLCBwaGkpIHtcbiAgICAgIGlmIChwb2ludFZpc2libGUobGFtYmRhLCBwaGkpKSBzaW5rLnBvaW50KGxhbWJkYSwgcGhpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwb2ludExpbmUobGFtYmRhLCBwaGkpIHtcbiAgICAgIGxpbmUucG9pbnQobGFtYmRhLCBwaGkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpbmVTdGFydCgpIHtcbiAgICAgIGNsaXAucG9pbnQgPSBwb2ludExpbmU7XG4gICAgICBsaW5lLmxpbmVTdGFydCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpbmVFbmQoKSB7XG4gICAgICBjbGlwLnBvaW50ID0gcG9pbnQ7XG4gICAgICBsaW5lLmxpbmVFbmQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwb2ludFJpbmcobGFtYmRhLCBwaGkpIHtcbiAgICAgIHJpbmcucHVzaChbbGFtYmRhLCBwaGldKTtcbiAgICAgIHJpbmdTaW5rLnBvaW50KGxhbWJkYSwgcGhpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByaW5nU3RhcnQoKSB7XG4gICAgICByaW5nU2luay5saW5lU3RhcnQoKTtcbiAgICAgIHJpbmcgPSBbXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByaW5nRW5kKCkge1xuICAgICAgcG9pbnRSaW5nKHJpbmdbMF1bMF0sIHJpbmdbMF1bMV0pO1xuICAgICAgcmluZ1NpbmsubGluZUVuZCgpO1xuXG4gICAgICB2YXIgY2xlYW4gPSByaW5nU2luay5jbGVhbigpLFxuICAgICAgICAgIHJpbmdTZWdtZW50cyA9IHJpbmdCdWZmZXIucmVzdWx0KCksXG4gICAgICAgICAgaSwgbiA9IHJpbmdTZWdtZW50cy5sZW5ndGgsIG0sXG4gICAgICAgICAgc2VnbWVudCxcbiAgICAgICAgICBwb2ludDtcblxuICAgICAgcmluZy5wb3AoKTtcbiAgICAgIHBvbHlnb24ucHVzaChyaW5nKTtcbiAgICAgIHJpbmcgPSBudWxsO1xuXG4gICAgICBpZiAoIW4pIHJldHVybjtcblxuICAgICAgLy8gTm8gaW50ZXJzZWN0aW9ucy5cbiAgICAgIGlmIChjbGVhbiAmIDEpIHtcbiAgICAgICAgc2VnbWVudCA9IHJpbmdTZWdtZW50c1swXTtcbiAgICAgICAgaWYgKChtID0gc2VnbWVudC5sZW5ndGggLSAxKSA+IDApIHtcbiAgICAgICAgICBpZiAoIXBvbHlnb25TdGFydGVkKSBzaW5rLnBvbHlnb25TdGFydCgpLCBwb2x5Z29uU3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgc2luay5saW5lU3RhcnQoKTtcbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSBzaW5rLnBvaW50KChwb2ludCA9IHNlZ21lbnRbaV0pWzBdLCBwb2ludFsxXSk7XG4gICAgICAgICAgc2luay5saW5lRW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWpvaW4gY29ubmVjdGVkIHNlZ21lbnRzLlxuICAgICAgLy8gVE9ETyByZXVzZSByaW5nQnVmZmVyLnJlam9pbigpP1xuICAgICAgaWYgKG4gPiAxICYmIGNsZWFuICYgMikgcmluZ1NlZ21lbnRzLnB1c2gocmluZ1NlZ21lbnRzLnBvcCgpLmNvbmNhdChyaW5nU2VnbWVudHMuc2hpZnQoKSkpO1xuXG4gICAgICBzZWdtZW50cy5wdXNoKHJpbmdTZWdtZW50cy5maWx0ZXIodmFsaWRTZWdtZW50KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsaXA7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHZhbGlkU2VnbWVudChzZWdtZW50KSB7XG4gIHJldHVybiBzZWdtZW50Lmxlbmd0aCA+IDE7XG59XG5cbi8vIEludGVyc2VjdGlvbnMgYXJlIHNvcnRlZCBhbG9uZyB0aGUgY2xpcCBlZGdlLiBGb3IgYm90aCBhbnRpbWVyaWRpYW4gY3V0dGluZ1xuLy8gYW5kIGNpcmNsZSBjbGlwcGluZywgdGhlIHNhbWUgY29tcGFyaXNvbiBpcyB1c2VkLlxuZnVuY3Rpb24gY29tcGFyZUludGVyc2VjdGlvbihhLCBiKSB7XG4gIHJldHVybiAoKGEgPSBhLngpWzBdIDwgMCA/IGFbMV0gLSBoYWxmUGkgLSBlcHNpbG9uIDogaGFsZlBpIC0gYVsxXSlcbiAgICAgICAtICgoYiA9IGIueClbMF0gPCAwID8gYlsxXSAtIGhhbGZQaSAtIGVwc2lsb24gOiBoYWxmUGkgLSBiWzFdKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIsIHgwLCB5MCwgeDEsIHkxKSB7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBieCA9IGJbMF0sXG4gICAgICBieSA9IGJbMV0sXG4gICAgICB0MCA9IDAsXG4gICAgICB0MSA9IDEsXG4gICAgICBkeCA9IGJ4IC0gYXgsXG4gICAgICBkeSA9IGJ5IC0gYXksXG4gICAgICByO1xuXG4gIHIgPSB4MCAtIGF4O1xuICBpZiAoIWR4ICYmIHIgPiAwKSByZXR1cm47XG4gIHIgLz0gZHg7XG4gIGlmIChkeCA8IDApIHtcbiAgICBpZiAociA8IHQwKSByZXR1cm47XG4gICAgaWYgKHIgPCB0MSkgdDEgPSByO1xuICB9IGVsc2UgaWYgKGR4ID4gMCkge1xuICAgIGlmIChyID4gdDEpIHJldHVybjtcbiAgICBpZiAociA+IHQwKSB0MCA9IHI7XG4gIH1cblxuICByID0geDEgLSBheDtcbiAgaWYgKCFkeCAmJiByIDwgMCkgcmV0dXJuO1xuICByIC89IGR4O1xuICBpZiAoZHggPCAwKSB7XG4gICAgaWYgKHIgPiB0MSkgcmV0dXJuO1xuICAgIGlmIChyID4gdDApIHQwID0gcjtcbiAgfSBlbHNlIGlmIChkeCA+IDApIHtcbiAgICBpZiAociA8IHQwKSByZXR1cm47XG4gICAgaWYgKHIgPCB0MSkgdDEgPSByO1xuICB9XG5cbiAgciA9IHkwIC0gYXk7XG4gIGlmICghZHkgJiYgciA+IDApIHJldHVybjtcbiAgciAvPSBkeTtcbiAgaWYgKGR5IDwgMCkge1xuICAgIGlmIChyIDwgdDApIHJldHVybjtcbiAgICBpZiAociA8IHQxKSB0MSA9IHI7XG4gIH0gZWxzZSBpZiAoZHkgPiAwKSB7XG4gICAgaWYgKHIgPiB0MSkgcmV0dXJuO1xuICAgIGlmIChyID4gdDApIHQwID0gcjtcbiAgfVxuXG4gIHIgPSB5MSAtIGF5O1xuICBpZiAoIWR5ICYmIHIgPCAwKSByZXR1cm47XG4gIHIgLz0gZHk7XG4gIGlmIChkeSA8IDApIHtcbiAgICBpZiAociA+IHQxKSByZXR1cm47XG4gICAgaWYgKHIgPiB0MCkgdDAgPSByO1xuICB9IGVsc2UgaWYgKGR5ID4gMCkge1xuICAgIGlmIChyIDwgdDApIHJldHVybjtcbiAgICBpZiAociA8IHQxKSB0MSA9IHI7XG4gIH1cblxuICBpZiAodDAgPiAwKSBhWzBdID0gYXggKyB0MCAqIGR4LCBhWzFdID0gYXkgKyB0MCAqIGR5O1xuICBpZiAodDEgPCAxKSBiWzBdID0gYXggKyB0MSAqIGR4LCBiWzFdID0gYXkgKyB0MSAqIGR5O1xuICByZXR1cm4gdHJ1ZTtcbn1cbiIsImltcG9ydCB7YWJzLCBlcHNpbG9ufSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuaW1wb3J0IGNsaXBCdWZmZXIgZnJvbSBcIi4vYnVmZmVyLmpzXCI7XG5pbXBvcnQgY2xpcExpbmUgZnJvbSBcIi4vbGluZS5qc1wiO1xuaW1wb3J0IGNsaXBSZWpvaW4gZnJvbSBcIi4vcmVqb2luLmpzXCI7XG5pbXBvcnQge21lcmdlfSBmcm9tIFwiZDMtYXJyYXlcIjtcblxudmFyIGNsaXBNYXggPSAxZTksIGNsaXBNaW4gPSAtY2xpcE1heDtcblxuLy8gVE9ETyBVc2UgZDMtcG9seWdvbuKAmXMgcG9seWdvbkNvbnRhaW5zIGhlcmUgZm9yIHRoZSByaW5nIGNoZWNrP1xuLy8gVE9ETyBFbGltaW5hdGUgZHVwbGljYXRlIGJ1ZmZlcmluZyBpbiBjbGlwQnVmZmVyIGFuZCBwb2x5Z29uLnB1c2g/XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNsaXBSZWN0YW5nbGUoeDAsIHkwLCB4MSwgeTEpIHtcblxuICBmdW5jdGlvbiB2aXNpYmxlKHgsIHkpIHtcbiAgICByZXR1cm4geDAgPD0geCAmJiB4IDw9IHgxICYmIHkwIDw9IHkgJiYgeSA8PSB5MTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGludGVycG9sYXRlKGZyb20sIHRvLCBkaXJlY3Rpb24sIHN0cmVhbSkge1xuICAgIHZhciBhID0gMCwgYTEgPSAwO1xuICAgIGlmIChmcm9tID09IG51bGxcbiAgICAgICAgfHwgKGEgPSBjb3JuZXIoZnJvbSwgZGlyZWN0aW9uKSkgIT09IChhMSA9IGNvcm5lcih0bywgZGlyZWN0aW9uKSlcbiAgICAgICAgfHwgY29tcGFyZVBvaW50KGZyb20sIHRvKSA8IDAgXiBkaXJlY3Rpb24gPiAwKSB7XG4gICAgICBkbyBzdHJlYW0ucG9pbnQoYSA9PT0gMCB8fCBhID09PSAzID8geDAgOiB4MSwgYSA+IDEgPyB5MSA6IHkwKTtcbiAgICAgIHdoaWxlICgoYSA9IChhICsgZGlyZWN0aW9uICsgNCkgJSA0KSAhPT0gYTEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHJlYW0ucG9pbnQodG9bMF0sIHRvWzFdKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjb3JuZXIocCwgZGlyZWN0aW9uKSB7XG4gICAgcmV0dXJuIGFicyhwWzBdIC0geDApIDwgZXBzaWxvbiA/IGRpcmVjdGlvbiA+IDAgPyAwIDogM1xuICAgICAgICA6IGFicyhwWzBdIC0geDEpIDwgZXBzaWxvbiA/IGRpcmVjdGlvbiA+IDAgPyAyIDogMVxuICAgICAgICA6IGFicyhwWzFdIC0geTApIDwgZXBzaWxvbiA/IGRpcmVjdGlvbiA+IDAgPyAxIDogMFxuICAgICAgICA6IGRpcmVjdGlvbiA+IDAgPyAzIDogMjsgLy8gYWJzKHBbMV0gLSB5MSkgPCBlcHNpbG9uXG4gIH1cblxuICBmdW5jdGlvbiBjb21wYXJlSW50ZXJzZWN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gY29tcGFyZVBvaW50KGEueCwgYi54KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBhcmVQb2ludChhLCBiKSB7XG4gICAgdmFyIGNhID0gY29ybmVyKGEsIDEpLFxuICAgICAgICBjYiA9IGNvcm5lcihiLCAxKTtcbiAgICByZXR1cm4gY2EgIT09IGNiID8gY2EgLSBjYlxuICAgICAgICA6IGNhID09PSAwID8gYlsxXSAtIGFbMV1cbiAgICAgICAgOiBjYSA9PT0gMSA/IGFbMF0gLSBiWzBdXG4gICAgICAgIDogY2EgPT09IDIgPyBhWzFdIC0gYlsxXVxuICAgICAgICA6IGJbMF0gLSBhWzBdO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgIHZhciBhY3RpdmVTdHJlYW0gPSBzdHJlYW0sXG4gICAgICAgIGJ1ZmZlclN0cmVhbSA9IGNsaXBCdWZmZXIoKSxcbiAgICAgICAgc2VnbWVudHMsXG4gICAgICAgIHBvbHlnb24sXG4gICAgICAgIHJpbmcsXG4gICAgICAgIHhfXywgeV9fLCB2X18sIC8vIGZpcnN0IHBvaW50XG4gICAgICAgIHhfLCB5Xywgdl8sIC8vIHByZXZpb3VzIHBvaW50XG4gICAgICAgIGZpcnN0LFxuICAgICAgICBjbGVhbjtcblxuICAgIHZhciBjbGlwU3RyZWFtID0ge1xuICAgICAgcG9pbnQ6IHBvaW50LFxuICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsXG4gICAgICBsaW5lRW5kOiBsaW5lRW5kLFxuICAgICAgcG9seWdvblN0YXJ0OiBwb2x5Z29uU3RhcnQsXG4gICAgICBwb2x5Z29uRW5kOiBwb2x5Z29uRW5kXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHBvaW50KHgsIHkpIHtcbiAgICAgIGlmICh2aXNpYmxlKHgsIHkpKSBhY3RpdmVTdHJlYW0ucG9pbnQoeCwgeSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9seWdvbkluc2lkZSgpIHtcbiAgICAgIHZhciB3aW5kaW5nID0gMDtcblxuICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBwb2x5Z29uLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBmb3IgKHZhciByaW5nID0gcG9seWdvbltpXSwgaiA9IDEsIG0gPSByaW5nLmxlbmd0aCwgcG9pbnQgPSByaW5nWzBdLCBhMCwgYTEsIGIwID0gcG9pbnRbMF0sIGIxID0gcG9pbnRbMV07IGogPCBtOyArK2opIHtcbiAgICAgICAgICBhMCA9IGIwLCBhMSA9IGIxLCBwb2ludCA9IHJpbmdbal0sIGIwID0gcG9pbnRbMF0sIGIxID0gcG9pbnRbMV07XG4gICAgICAgICAgaWYgKGExIDw9IHkxKSB7IGlmIChiMSA+IHkxICYmIChiMCAtIGEwKSAqICh5MSAtIGExKSA+IChiMSAtIGExKSAqICh4MCAtIGEwKSkgKyt3aW5kaW5nOyB9XG4gICAgICAgICAgZWxzZSB7IGlmIChiMSA8PSB5MSAmJiAoYjAgLSBhMCkgKiAoeTEgLSBhMSkgPCAoYjEgLSBhMSkgKiAoeDAgLSBhMCkpIC0td2luZGluZzsgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB3aW5kaW5nO1xuICAgIH1cblxuICAgIC8vIEJ1ZmZlciBnZW9tZXRyeSB3aXRoaW4gYSBwb2x5Z29uIGFuZCB0aGVuIGNsaXAgaXQgZW4gbWFzc2UuXG4gICAgZnVuY3Rpb24gcG9seWdvblN0YXJ0KCkge1xuICAgICAgYWN0aXZlU3RyZWFtID0gYnVmZmVyU3RyZWFtLCBzZWdtZW50cyA9IFtdLCBwb2x5Z29uID0gW10sIGNsZWFuID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwb2x5Z29uRW5kKCkge1xuICAgICAgdmFyIHN0YXJ0SW5zaWRlID0gcG9seWdvbkluc2lkZSgpLFxuICAgICAgICAgIGNsZWFuSW5zaWRlID0gY2xlYW4gJiYgc3RhcnRJbnNpZGUsXG4gICAgICAgICAgdmlzaWJsZSA9IChzZWdtZW50cyA9IG1lcmdlKHNlZ21lbnRzKSkubGVuZ3RoO1xuICAgICAgaWYgKGNsZWFuSW5zaWRlIHx8IHZpc2libGUpIHtcbiAgICAgICAgc3RyZWFtLnBvbHlnb25TdGFydCgpO1xuICAgICAgICBpZiAoY2xlYW5JbnNpZGUpIHtcbiAgICAgICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICAgICAgaW50ZXJwb2xhdGUobnVsbCwgbnVsbCwgMSwgc3RyZWFtKTtcbiAgICAgICAgICBzdHJlYW0ubGluZUVuZCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICAgICAgY2xpcFJlam9pbihzZWdtZW50cywgY29tcGFyZUludGVyc2VjdGlvbiwgc3RhcnRJbnNpZGUsIGludGVycG9sYXRlLCBzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICAgIHN0cmVhbS5wb2x5Z29uRW5kKCk7XG4gICAgICB9XG4gICAgICBhY3RpdmVTdHJlYW0gPSBzdHJlYW0sIHNlZ21lbnRzID0gcG9seWdvbiA9IHJpbmcgPSBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpbmVTdGFydCgpIHtcbiAgICAgIGNsaXBTdHJlYW0ucG9pbnQgPSBsaW5lUG9pbnQ7XG4gICAgICBpZiAocG9seWdvbikgcG9seWdvbi5wdXNoKHJpbmcgPSBbXSk7XG4gICAgICBmaXJzdCA9IHRydWU7XG4gICAgICB2XyA9IGZhbHNlO1xuICAgICAgeF8gPSB5XyA9IE5hTjtcbiAgICB9XG5cbiAgICAvLyBUT0RPIHJhdGhlciB0aGFuIHNwZWNpYWwtY2FzZSBwb2x5Z29ucywgc2ltcGx5IGhhbmRsZSB0aGVtIHNlcGFyYXRlbHkuXG4gICAgLy8gSWRlYWxseSwgY29pbmNpZGVudCBpbnRlcnNlY3Rpb24gcG9pbnRzIHNob3VsZCBiZSBqaXR0ZXJlZCB0byBhdm9pZFxuICAgIC8vIGNsaXBwaW5nIGlzc3Vlcy5cbiAgICBmdW5jdGlvbiBsaW5lRW5kKCkge1xuICAgICAgaWYgKHNlZ21lbnRzKSB7XG4gICAgICAgIGxpbmVQb2ludCh4X18sIHlfXyk7XG4gICAgICAgIGlmICh2X18gJiYgdl8pIGJ1ZmZlclN0cmVhbS5yZWpvaW4oKTtcbiAgICAgICAgc2VnbWVudHMucHVzaChidWZmZXJTdHJlYW0ucmVzdWx0KCkpO1xuICAgICAgfVxuICAgICAgY2xpcFN0cmVhbS5wb2ludCA9IHBvaW50O1xuICAgICAgaWYgKHZfKSBhY3RpdmVTdHJlYW0ubGluZUVuZCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpbmVQb2ludCh4LCB5KSB7XG4gICAgICB2YXIgdiA9IHZpc2libGUoeCwgeSk7XG4gICAgICBpZiAocG9seWdvbikgcmluZy5wdXNoKFt4LCB5XSk7XG4gICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgeF9fID0geCwgeV9fID0geSwgdl9fID0gdjtcbiAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICBhY3RpdmVTdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICAgICAgYWN0aXZlU3RyZWFtLnBvaW50KHgsIHkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodiAmJiB2XykgYWN0aXZlU3RyZWFtLnBvaW50KHgsIHkpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB2YXIgYSA9IFt4XyA9IE1hdGgubWF4KGNsaXBNaW4sIE1hdGgubWluKGNsaXBNYXgsIHhfKSksIHlfID0gTWF0aC5tYXgoY2xpcE1pbiwgTWF0aC5taW4oY2xpcE1heCwgeV8pKV0sXG4gICAgICAgICAgICAgIGIgPSBbeCA9IE1hdGgubWF4KGNsaXBNaW4sIE1hdGgubWluKGNsaXBNYXgsIHgpKSwgeSA9IE1hdGgubWF4KGNsaXBNaW4sIE1hdGgubWluKGNsaXBNYXgsIHkpKV07XG4gICAgICAgICAgaWYgKGNsaXBMaW5lKGEsIGIsIHgwLCB5MCwgeDEsIHkxKSkge1xuICAgICAgICAgICAgaWYgKCF2Xykge1xuICAgICAgICAgICAgICBhY3RpdmVTdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICAgICAgICAgIGFjdGl2ZVN0cmVhbS5wb2ludChhWzBdLCBhWzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjdGl2ZVN0cmVhbS5wb2ludChiWzBdLCBiWzFdKTtcbiAgICAgICAgICAgIGlmICghdikgYWN0aXZlU3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgICAgICAgIGNsZWFuID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIGlmICh2KSB7XG4gICAgICAgICAgICBhY3RpdmVTdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICAgICAgICBhY3RpdmVTdHJlYW0ucG9pbnQoeCwgeSk7XG4gICAgICAgICAgICBjbGVhbiA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgeF8gPSB4LCB5XyA9IHksIHZfID0gdjtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xpcFN0cmVhbTtcbiAgfTtcbn1cbiIsImltcG9ydCBwb2ludEVxdWFsIGZyb20gXCIuLi9wb2ludEVxdWFsLmpzXCI7XG5pbXBvcnQge2Vwc2lsb259IGZyb20gXCIuLi9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIEludGVyc2VjdGlvbihwb2ludCwgcG9pbnRzLCBvdGhlciwgZW50cnkpIHtcbiAgdGhpcy54ID0gcG9pbnQ7XG4gIHRoaXMueiA9IHBvaW50cztcbiAgdGhpcy5vID0gb3RoZXI7IC8vIGFub3RoZXIgaW50ZXJzZWN0aW9uXG4gIHRoaXMuZSA9IGVudHJ5OyAvLyBpcyBhbiBlbnRyeT9cbiAgdGhpcy52ID0gZmFsc2U7IC8vIHZpc2l0ZWRcbiAgdGhpcy5uID0gdGhpcy5wID0gbnVsbDsgLy8gbmV4dCAmIHByZXZpb3VzXG59XG5cbi8vIEEgZ2VuZXJhbGl6ZWQgcG9seWdvbiBjbGlwcGluZyBhbGdvcml0aG06IGdpdmVuIGEgcG9seWdvbiB0aGF0IGhhcyBiZWVuIGN1dFxuLy8gaW50byBpdHMgdmlzaWJsZSBsaW5lIHNlZ21lbnRzLCBhbmQgcmVqb2lucyB0aGUgc2VnbWVudHMgYnkgaW50ZXJwb2xhdGluZ1xuLy8gYWxvbmcgdGhlIGNsaXAgZWRnZS5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlZ21lbnRzLCBjb21wYXJlSW50ZXJzZWN0aW9uLCBzdGFydEluc2lkZSwgaW50ZXJwb2xhdGUsIHN0cmVhbSkge1xuICB2YXIgc3ViamVjdCA9IFtdLFxuICAgICAgY2xpcCA9IFtdLFxuICAgICAgaSxcbiAgICAgIG47XG5cbiAgc2VnbWVudHMuZm9yRWFjaChmdW5jdGlvbihzZWdtZW50KSB7XG4gICAgaWYgKChuID0gc2VnbWVudC5sZW5ndGggLSAxKSA8PSAwKSByZXR1cm47XG4gICAgdmFyIG4sIHAwID0gc2VnbWVudFswXSwgcDEgPSBzZWdtZW50W25dLCB4O1xuXG4gICAgaWYgKHBvaW50RXF1YWwocDAsIHAxKSkge1xuICAgICAgaWYgKCFwMFsyXSAmJiAhcDFbMl0pIHtcbiAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBzdHJlYW0ucG9pbnQoKHAwID0gc2VnbWVudFtpXSlbMF0sIHAwWzFdKTtcbiAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gaGFuZGxlIGRlZ2VuZXJhdGUgY2FzZXMgYnkgbW92aW5nIHRoZSBwb2ludFxuICAgICAgcDFbMF0gKz0gMiAqIGVwc2lsb247XG4gICAgfVxuXG4gICAgc3ViamVjdC5wdXNoKHggPSBuZXcgSW50ZXJzZWN0aW9uKHAwLCBzZWdtZW50LCBudWxsLCB0cnVlKSk7XG4gICAgY2xpcC5wdXNoKHgubyA9IG5ldyBJbnRlcnNlY3Rpb24ocDAsIG51bGwsIHgsIGZhbHNlKSk7XG4gICAgc3ViamVjdC5wdXNoKHggPSBuZXcgSW50ZXJzZWN0aW9uKHAxLCBzZWdtZW50LCBudWxsLCBmYWxzZSkpO1xuICAgIGNsaXAucHVzaCh4Lm8gPSBuZXcgSW50ZXJzZWN0aW9uKHAxLCBudWxsLCB4LCB0cnVlKSk7XG4gIH0pO1xuXG4gIGlmICghc3ViamVjdC5sZW5ndGgpIHJldHVybjtcblxuICBjbGlwLnNvcnQoY29tcGFyZUludGVyc2VjdGlvbik7XG4gIGxpbmsoc3ViamVjdCk7XG4gIGxpbmsoY2xpcCk7XG5cbiAgZm9yIChpID0gMCwgbiA9IGNsaXAubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgY2xpcFtpXS5lID0gc3RhcnRJbnNpZGUgPSAhc3RhcnRJbnNpZGU7XG4gIH1cblxuICB2YXIgc3RhcnQgPSBzdWJqZWN0WzBdLFxuICAgICAgcG9pbnRzLFxuICAgICAgcG9pbnQ7XG5cbiAgd2hpbGUgKDEpIHtcbiAgICAvLyBGaW5kIGZpcnN0IHVudmlzaXRlZCBpbnRlcnNlY3Rpb24uXG4gICAgdmFyIGN1cnJlbnQgPSBzdGFydCxcbiAgICAgICAgaXNTdWJqZWN0ID0gdHJ1ZTtcbiAgICB3aGlsZSAoY3VycmVudC52KSBpZiAoKGN1cnJlbnQgPSBjdXJyZW50Lm4pID09PSBzdGFydCkgcmV0dXJuO1xuICAgIHBvaW50cyA9IGN1cnJlbnQuejtcbiAgICBzdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgZG8ge1xuICAgICAgY3VycmVudC52ID0gY3VycmVudC5vLnYgPSB0cnVlO1xuICAgICAgaWYgKGN1cnJlbnQuZSkge1xuICAgICAgICBpZiAoaXNTdWJqZWN0KSB7XG4gICAgICAgICAgZm9yIChpID0gMCwgbiA9IHBvaW50cy5sZW5ndGg7IGkgPCBuOyArK2kpIHN0cmVhbS5wb2ludCgocG9pbnQgPSBwb2ludHNbaV0pWzBdLCBwb2ludFsxXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW50ZXJwb2xhdGUoY3VycmVudC54LCBjdXJyZW50Lm4ueCwgMSwgc3RyZWFtKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzU3ViamVjdCkge1xuICAgICAgICAgIHBvaW50cyA9IGN1cnJlbnQucC56O1xuICAgICAgICAgIGZvciAoaSA9IHBvaW50cy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgc3RyZWFtLnBvaW50KChwb2ludCA9IHBvaW50c1tpXSlbMF0sIHBvaW50WzFdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbnRlcnBvbGF0ZShjdXJyZW50LngsIGN1cnJlbnQucC54LCAtMSwgc3RyZWFtKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wO1xuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnQubztcbiAgICAgIHBvaW50cyA9IGN1cnJlbnQuejtcbiAgICAgIGlzU3ViamVjdCA9ICFpc1N1YmplY3Q7XG4gICAgfSB3aGlsZSAoIWN1cnJlbnQudik7XG4gICAgc3RyZWFtLmxpbmVFbmQoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsaW5rKGFycmF5KSB7XG4gIGlmICghKG4gPSBhcnJheS5sZW5ndGgpKSByZXR1cm47XG4gIHZhciBuLFxuICAgICAgaSA9IDAsXG4gICAgICBhID0gYXJyYXlbMF0sXG4gICAgICBiO1xuICB3aGlsZSAoKytpIDwgbikge1xuICAgIGEubiA9IGIgPSBhcnJheVtpXTtcbiAgICBiLnAgPSBhO1xuICAgIGEgPSBiO1xuICB9XG4gIGEubiA9IGIgPSBhcnJheVswXTtcbiAgYi5wID0gYTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcblxuICBmdW5jdGlvbiBjb21wb3NlKHgsIHkpIHtcbiAgICByZXR1cm4geCA9IGEoeCwgeSksIGIoeFswXSwgeFsxXSk7XG4gIH1cblxuICBpZiAoYS5pbnZlcnQgJiYgYi5pbnZlcnQpIGNvbXBvc2UuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkge1xuICAgIHJldHVybiB4ID0gYi5pbnZlcnQoeCwgeSksIHggJiYgYS5pbnZlcnQoeFswXSwgeFsxXSk7XG4gIH07XG5cbiAgcmV0dXJuIGNvbXBvc2U7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IHggPT4geDtcbiIsImV4cG9ydCB2YXIgZXBzaWxvbiA9IDFlLTY7XG5leHBvcnQgdmFyIGVwc2lsb24yID0gMWUtMTI7XG5leHBvcnQgdmFyIHBpID0gTWF0aC5QSTtcbmV4cG9ydCB2YXIgaGFsZlBpID0gcGkgLyAyO1xuZXhwb3J0IHZhciBxdWFydGVyUGkgPSBwaSAvIDQ7XG5leHBvcnQgdmFyIHRhdSA9IHBpICogMjtcblxuZXhwb3J0IHZhciBkZWdyZWVzID0gMTgwIC8gcGk7XG5leHBvcnQgdmFyIHJhZGlhbnMgPSBwaSAvIDE4MDtcblxuZXhwb3J0IHZhciBhYnMgPSBNYXRoLmFicztcbmV4cG9ydCB2YXIgYXRhbiA9IE1hdGguYXRhbjtcbmV4cG9ydCB2YXIgYXRhbjIgPSBNYXRoLmF0YW4yO1xuZXhwb3J0IHZhciBjb3MgPSBNYXRoLmNvcztcbmV4cG9ydCB2YXIgY2VpbCA9IE1hdGguY2VpbDtcbmV4cG9ydCB2YXIgZXhwID0gTWF0aC5leHA7XG5leHBvcnQgdmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbmV4cG9ydCB2YXIgaHlwb3QgPSBNYXRoLmh5cG90O1xuZXhwb3J0IHZhciBsb2cgPSBNYXRoLmxvZztcbmV4cG9ydCB2YXIgcG93ID0gTWF0aC5wb3c7XG5leHBvcnQgdmFyIHNpbiA9IE1hdGguc2luO1xuZXhwb3J0IHZhciBzaWduID0gTWF0aC5zaWduIHx8IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHggPiAwID8gMSA6IHggPCAwID8gLTEgOiAwOyB9O1xuZXhwb3J0IHZhciBzcXJ0ID0gTWF0aC5zcXJ0O1xuZXhwb3J0IHZhciB0YW4gPSBNYXRoLnRhbjtcblxuZXhwb3J0IGZ1bmN0aW9uIGFjb3MoeCkge1xuICByZXR1cm4geCA+IDEgPyAwIDogeCA8IC0xID8gcGkgOiBNYXRoLmFjb3MoeCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc2luKHgpIHtcbiAgcmV0dXJuIHggPiAxID8gaGFsZlBpIDogeCA8IC0xID8gLWhhbGZQaSA6IE1hdGguYXNpbih4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhdmVyc2luKHgpIHtcbiAgcmV0dXJuICh4ID0gc2luKHggLyAyKSkgKiB4O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbm9vcCgpIHt9XG4iLCJpbXBvcnQgbm9vcCBmcm9tIFwiLi4vbm9vcC5qc1wiO1xuXG52YXIgeDAgPSBJbmZpbml0eSxcbiAgICB5MCA9IHgwLFxuICAgIHgxID0gLXgwLFxuICAgIHkxID0geDE7XG5cbnZhciBib3VuZHNTdHJlYW0gPSB7XG4gIHBvaW50OiBib3VuZHNQb2ludCxcbiAgbGluZVN0YXJ0OiBub29wLFxuICBsaW5lRW5kOiBub29wLFxuICBwb2x5Z29uU3RhcnQ6IG5vb3AsXG4gIHBvbHlnb25FbmQ6IG5vb3AsXG4gIHJlc3VsdDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGJvdW5kcyA9IFtbeDAsIHkwXSwgW3gxLCB5MV1dO1xuICAgIHgxID0geTEgPSAtKHkwID0geDAgPSBJbmZpbml0eSk7XG4gICAgcmV0dXJuIGJvdW5kcztcbiAgfVxufTtcblxuZnVuY3Rpb24gYm91bmRzUG9pbnQoeCwgeSkge1xuICBpZiAoeCA8IHgwKSB4MCA9IHg7XG4gIGlmICh4ID4geDEpIHgxID0geDtcbiAgaWYgKHkgPCB5MCkgeTAgPSB5O1xuICBpZiAoeSA+IHkxKSB5MSA9IHk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJvdW5kc1N0cmVhbTtcbiIsImltcG9ydCB7YWJzLCBlcHNpbG9ufSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGFicyhhWzBdIC0gYlswXSkgPCBlcHNpbG9uICYmIGFicyhhWzFdIC0gYlsxXSkgPCBlcHNpbG9uO1xufVxuIiwiaW1wb3J0IHtBZGRlcn0gZnJvbSBcImQzLWFycmF5XCI7XG5pbXBvcnQge2NhcnRlc2lhbiwgY2FydGVzaWFuQ3Jvc3MsIGNhcnRlc2lhbk5vcm1hbGl6ZUluUGxhY2V9IGZyb20gXCIuL2NhcnRlc2lhbi5qc1wiO1xuaW1wb3J0IHthYnMsIGFzaW4sIGF0YW4yLCBjb3MsIGVwc2lsb24sIGVwc2lsb24yLCBoYWxmUGksIHBpLCBxdWFydGVyUGksIHNpZ24sIHNpbiwgdGF1fSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIGxvbmdpdHVkZShwb2ludCkge1xuICByZXR1cm4gYWJzKHBvaW50WzBdKSA8PSBwaSA/IHBvaW50WzBdIDogc2lnbihwb2ludFswXSkgKiAoKGFicyhwb2ludFswXSkgKyBwaSkgJSB0YXUgLSBwaSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHBvbHlnb24sIHBvaW50KSB7XG4gIHZhciBsYW1iZGEgPSBsb25naXR1ZGUocG9pbnQpLFxuICAgICAgcGhpID0gcG9pbnRbMV0sXG4gICAgICBzaW5QaGkgPSBzaW4ocGhpKSxcbiAgICAgIG5vcm1hbCA9IFtzaW4obGFtYmRhKSwgLWNvcyhsYW1iZGEpLCAwXSxcbiAgICAgIGFuZ2xlID0gMCxcbiAgICAgIHdpbmRpbmcgPSAwO1xuXG4gIHZhciBzdW0gPSBuZXcgQWRkZXIoKTtcblxuICBpZiAoc2luUGhpID09PSAxKSBwaGkgPSBoYWxmUGkgKyBlcHNpbG9uO1xuICBlbHNlIGlmIChzaW5QaGkgPT09IC0xKSBwaGkgPSAtaGFsZlBpIC0gZXBzaWxvbjtcblxuICBmb3IgKHZhciBpID0gMCwgbiA9IHBvbHlnb24ubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKCEobSA9IChyaW5nID0gcG9seWdvbltpXSkubGVuZ3RoKSkgY29udGludWU7XG4gICAgdmFyIHJpbmcsXG4gICAgICAgIG0sXG4gICAgICAgIHBvaW50MCA9IHJpbmdbbSAtIDFdLFxuICAgICAgICBsYW1iZGEwID0gbG9uZ2l0dWRlKHBvaW50MCksXG4gICAgICAgIHBoaTAgPSBwb2ludDBbMV0gLyAyICsgcXVhcnRlclBpLFxuICAgICAgICBzaW5QaGkwID0gc2luKHBoaTApLFxuICAgICAgICBjb3NQaGkwID0gY29zKHBoaTApO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBtOyArK2osIGxhbWJkYTAgPSBsYW1iZGExLCBzaW5QaGkwID0gc2luUGhpMSwgY29zUGhpMCA9IGNvc1BoaTEsIHBvaW50MCA9IHBvaW50MSkge1xuICAgICAgdmFyIHBvaW50MSA9IHJpbmdbal0sXG4gICAgICAgICAgbGFtYmRhMSA9IGxvbmdpdHVkZShwb2ludDEpLFxuICAgICAgICAgIHBoaTEgPSBwb2ludDFbMV0gLyAyICsgcXVhcnRlclBpLFxuICAgICAgICAgIHNpblBoaTEgPSBzaW4ocGhpMSksXG4gICAgICAgICAgY29zUGhpMSA9IGNvcyhwaGkxKSxcbiAgICAgICAgICBkZWx0YSA9IGxhbWJkYTEgLSBsYW1iZGEwLFxuICAgICAgICAgIHNpZ24gPSBkZWx0YSA+PSAwID8gMSA6IC0xLFxuICAgICAgICAgIGFic0RlbHRhID0gc2lnbiAqIGRlbHRhLFxuICAgICAgICAgIGFudGltZXJpZGlhbiA9IGFic0RlbHRhID4gcGksXG4gICAgICAgICAgayA9IHNpblBoaTAgKiBzaW5QaGkxO1xuXG4gICAgICBzdW0uYWRkKGF0YW4yKGsgKiBzaWduICogc2luKGFic0RlbHRhKSwgY29zUGhpMCAqIGNvc1BoaTEgKyBrICogY29zKGFic0RlbHRhKSkpO1xuICAgICAgYW5nbGUgKz0gYW50aW1lcmlkaWFuID8gZGVsdGEgKyBzaWduICogdGF1IDogZGVsdGE7XG5cbiAgICAgIC8vIEFyZSB0aGUgbG9uZ2l0dWRlcyBlaXRoZXIgc2lkZSBvZiB0aGUgcG9pbnTigJlzIG1lcmlkaWFuIChsYW1iZGEpLFxuICAgICAgLy8gYW5kIGFyZSB0aGUgbGF0aXR1ZGVzIHNtYWxsZXIgdGhhbiB0aGUgcGFyYWxsZWwgKHBoaSk/XG4gICAgICBpZiAoYW50aW1lcmlkaWFuIF4gbGFtYmRhMCA+PSBsYW1iZGEgXiBsYW1iZGExID49IGxhbWJkYSkge1xuICAgICAgICB2YXIgYXJjID0gY2FydGVzaWFuQ3Jvc3MoY2FydGVzaWFuKHBvaW50MCksIGNhcnRlc2lhbihwb2ludDEpKTtcbiAgICAgICAgY2FydGVzaWFuTm9ybWFsaXplSW5QbGFjZShhcmMpO1xuICAgICAgICB2YXIgaW50ZXJzZWN0aW9uID0gY2FydGVzaWFuQ3Jvc3Mobm9ybWFsLCBhcmMpO1xuICAgICAgICBjYXJ0ZXNpYW5Ob3JtYWxpemVJblBsYWNlKGludGVyc2VjdGlvbik7XG4gICAgICAgIHZhciBwaGlBcmMgPSAoYW50aW1lcmlkaWFuIF4gZGVsdGEgPj0gMCA/IC0xIDogMSkgKiBhc2luKGludGVyc2VjdGlvblsyXSk7XG4gICAgICAgIGlmIChwaGkgPiBwaGlBcmMgfHwgcGhpID09PSBwaGlBcmMgJiYgKGFyY1swXSB8fCBhcmNbMV0pKSB7XG4gICAgICAgICAgd2luZGluZyArPSBhbnRpbWVyaWRpYW4gXiBkZWx0YSA+PSAwID8gMSA6IC0xO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRmlyc3QsIGRldGVybWluZSB3aGV0aGVyIHRoZSBTb3V0aCBwb2xlIGlzIGluc2lkZSBvciBvdXRzaWRlOlxuICAvL1xuICAvLyBJdCBpcyBpbnNpZGUgaWY6XG4gIC8vICogdGhlIHBvbHlnb24gd2luZHMgYXJvdW5kIGl0IGluIGEgY2xvY2t3aXNlIGRpcmVjdGlvbi5cbiAgLy8gKiB0aGUgcG9seWdvbiBkb2VzIG5vdCAoY3VtdWxhdGl2ZWx5KSB3aW5kIGFyb3VuZCBpdCwgYnV0IGhhcyBhIG5lZ2F0aXZlXG4gIC8vICAgKGNvdW50ZXItY2xvY2t3aXNlKSBhcmVhLlxuICAvL1xuICAvLyBTZWNvbmQsIGNvdW50IHRoZSAoc2lnbmVkKSBudW1iZXIgb2YgdGltZXMgYSBzZWdtZW50IGNyb3NzZXMgYSBsYW1iZGFcbiAgLy8gZnJvbSB0aGUgcG9pbnQgdG8gdGhlIFNvdXRoIHBvbGUuICBJZiBpdCBpcyB6ZXJvLCB0aGVuIHRoZSBwb2ludCBpcyB0aGVcbiAgLy8gc2FtZSBzaWRlIGFzIHRoZSBTb3V0aCBwb2xlLlxuXG4gIHJldHVybiAoYW5nbGUgPCAtZXBzaWxvbiB8fCBhbmdsZSA8IGVwc2lsb24gJiYgc3VtIDwgLWVwc2lsb24yKSBeICh3aW5kaW5nICYgMSk7XG59XG4iLCJpbXBvcnQge2FzaW4sIGF0YW4yLCBjb3MsIHNpbiwgc3FydH0gZnJvbSBcIi4uL21hdGguanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGF6aW11dGhhbFJhdyhzY2FsZSkge1xuICByZXR1cm4gZnVuY3Rpb24oeCwgeSkge1xuICAgIHZhciBjeCA9IGNvcyh4KSxcbiAgICAgICAgY3kgPSBjb3MoeSksXG4gICAgICAgIGsgPSBzY2FsZShjeCAqIGN5KTtcbiAgICAgICAgaWYgKGsgPT09IEluZmluaXR5KSByZXR1cm4gWzIsIDBdO1xuICAgIHJldHVybiBbXG4gICAgICBrICogY3kgKiBzaW4oeCksXG4gICAgICBrICogc2luKHkpXG4gICAgXTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXppbXV0aGFsSW52ZXJ0KGFuZ2xlKSB7XG4gIHJldHVybiBmdW5jdGlvbih4LCB5KSB7XG4gICAgdmFyIHogPSBzcXJ0KHggKiB4ICsgeSAqIHkpLFxuICAgICAgICBjID0gYW5nbGUoeiksXG4gICAgICAgIHNjID0gc2luKGMpLFxuICAgICAgICBjYyA9IGNvcyhjKTtcbiAgICByZXR1cm4gW1xuICAgICAgYXRhbjIoeCAqIHNjLCB6ICogY2MpLFxuICAgICAgYXNpbih6ICYmIHkgKiBzYyAvIHopXG4gICAgXTtcbiAgfVxufVxuIiwiaW1wb3J0IHthc2luLCBzcXJ0fSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuaW1wb3J0IHthemltdXRoYWxSYXcsIGF6aW11dGhhbEludmVydH0gZnJvbSBcIi4vYXppbXV0aGFsLmpzXCI7XG5pbXBvcnQgcHJvamVjdGlvbiBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgdmFyIGF6aW11dGhhbEVxdWFsQXJlYVJhdyA9IGF6aW11dGhhbFJhdyhmdW5jdGlvbihjeGN5KSB7XG4gIHJldHVybiBzcXJ0KDIgLyAoMSArIGN4Y3kpKTtcbn0pO1xuXG5hemltdXRoYWxFcXVhbEFyZWFSYXcuaW52ZXJ0ID0gYXppbXV0aGFsSW52ZXJ0KGZ1bmN0aW9uKHopIHtcbiAgcmV0dXJuIDIgKiBhc2luKHogLyAyKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHByb2plY3Rpb24oYXppbXV0aGFsRXF1YWxBcmVhUmF3KVxuICAgICAgLnNjYWxlKDEyNC43NSlcbiAgICAgIC5jbGlwQW5nbGUoMTgwIC0gMWUtMyk7XG59XG4iLCJpbXBvcnQge2RlZmF1bHQgYXMgZ2VvU3RyZWFtfSBmcm9tIFwiLi4vc3RyZWFtLmpzXCI7XG5pbXBvcnQgYm91bmRzU3RyZWFtIGZyb20gXCIuLi9wYXRoL2JvdW5kcy5qc1wiO1xuXG5mdW5jdGlvbiBmaXQocHJvamVjdGlvbiwgZml0Qm91bmRzLCBvYmplY3QpIHtcbiAgdmFyIGNsaXAgPSBwcm9qZWN0aW9uLmNsaXBFeHRlbnQgJiYgcHJvamVjdGlvbi5jbGlwRXh0ZW50KCk7XG4gIHByb2plY3Rpb24uc2NhbGUoMTUwKS50cmFuc2xhdGUoWzAsIDBdKTtcbiAgaWYgKGNsaXAgIT0gbnVsbCkgcHJvamVjdGlvbi5jbGlwRXh0ZW50KG51bGwpO1xuICBnZW9TdHJlYW0ob2JqZWN0LCBwcm9qZWN0aW9uLnN0cmVhbShib3VuZHNTdHJlYW0pKTtcbiAgZml0Qm91bmRzKGJvdW5kc1N0cmVhbS5yZXN1bHQoKSk7XG4gIGlmIChjbGlwICE9IG51bGwpIHByb2plY3Rpb24uY2xpcEV4dGVudChjbGlwKTtcbiAgcmV0dXJuIHByb2plY3Rpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXRFeHRlbnQocHJvamVjdGlvbiwgZXh0ZW50LCBvYmplY3QpIHtcbiAgcmV0dXJuIGZpdChwcm9qZWN0aW9uLCBmdW5jdGlvbihiKSB7XG4gICAgdmFyIHcgPSBleHRlbnRbMV1bMF0gLSBleHRlbnRbMF1bMF0sXG4gICAgICAgIGggPSBleHRlbnRbMV1bMV0gLSBleHRlbnRbMF1bMV0sXG4gICAgICAgIGsgPSBNYXRoLm1pbih3IC8gKGJbMV1bMF0gLSBiWzBdWzBdKSwgaCAvIChiWzFdWzFdIC0gYlswXVsxXSkpLFxuICAgICAgICB4ID0gK2V4dGVudFswXVswXSArICh3IC0gayAqIChiWzFdWzBdICsgYlswXVswXSkpIC8gMixcbiAgICAgICAgeSA9ICtleHRlbnRbMF1bMV0gKyAoaCAtIGsgKiAoYlsxXVsxXSArIGJbMF1bMV0pKSAvIDI7XG4gICAgcHJvamVjdGlvbi5zY2FsZSgxNTAgKiBrKS50cmFuc2xhdGUoW3gsIHldKTtcbiAgfSwgb2JqZWN0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpdFNpemUocHJvamVjdGlvbiwgc2l6ZSwgb2JqZWN0KSB7XG4gIHJldHVybiBmaXRFeHRlbnQocHJvamVjdGlvbiwgW1swLCAwXSwgc2l6ZV0sIG9iamVjdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXRXaWR0aChwcm9qZWN0aW9uLCB3aWR0aCwgb2JqZWN0KSB7XG4gIHJldHVybiBmaXQocHJvamVjdGlvbiwgZnVuY3Rpb24oYikge1xuICAgIHZhciB3ID0gK3dpZHRoLFxuICAgICAgICBrID0gdyAvIChiWzFdWzBdIC0gYlswXVswXSksXG4gICAgICAgIHggPSAodyAtIGsgKiAoYlsxXVswXSArIGJbMF1bMF0pKSAvIDIsXG4gICAgICAgIHkgPSAtayAqIGJbMF1bMV07XG4gICAgcHJvamVjdGlvbi5zY2FsZSgxNTAgKiBrKS50cmFuc2xhdGUoW3gsIHldKTtcbiAgfSwgb2JqZWN0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpdEhlaWdodChwcm9qZWN0aW9uLCBoZWlnaHQsIG9iamVjdCkge1xuICByZXR1cm4gZml0KHByb2plY3Rpb24sIGZ1bmN0aW9uKGIpIHtcbiAgICB2YXIgaCA9ICtoZWlnaHQsXG4gICAgICAgIGsgPSBoIC8gKGJbMV1bMV0gLSBiWzBdWzFdKSxcbiAgICAgICAgeCA9IC1rICogYlswXVswXSxcbiAgICAgICAgeSA9IChoIC0gayAqIChiWzFdWzFdICsgYlswXVsxXSkpIC8gMjtcbiAgICBwcm9qZWN0aW9uLnNjYWxlKDE1MCAqIGspLnRyYW5zbGF0ZShbeCwgeV0pO1xuICB9LCBvYmplY3QpO1xufVxuIiwiaW1wb3J0IGNsaXBBbnRpbWVyaWRpYW4gZnJvbSBcIi4uL2NsaXAvYW50aW1lcmlkaWFuLmpzXCI7XG5pbXBvcnQgY2xpcENpcmNsZSBmcm9tIFwiLi4vY2xpcC9jaXJjbGUuanNcIjtcbmltcG9ydCBjbGlwUmVjdGFuZ2xlIGZyb20gXCIuLi9jbGlwL3JlY3RhbmdsZS5qc1wiO1xuaW1wb3J0IGNvbXBvc2UgZnJvbSBcIi4uL2NvbXBvc2UuanNcIjtcbmltcG9ydCBpZGVudGl0eSBmcm9tIFwiLi4vaWRlbnRpdHkuanNcIjtcbmltcG9ydCB7Y29zLCBkZWdyZWVzLCByYWRpYW5zLCBzaW4sIHNxcnR9IGZyb20gXCIuLi9tYXRoLmpzXCI7XG5pbXBvcnQge3JvdGF0ZVJhZGlhbnN9IGZyb20gXCIuLi9yb3RhdGlvbi5qc1wiO1xuaW1wb3J0IHt0cmFuc2Zvcm1lcn0gZnJvbSBcIi4uL3RyYW5zZm9ybS5qc1wiO1xuaW1wb3J0IHtmaXRFeHRlbnQsIGZpdFNpemUsIGZpdFdpZHRoLCBmaXRIZWlnaHR9IGZyb20gXCIuL2ZpdC5qc1wiO1xuaW1wb3J0IHJlc2FtcGxlIGZyb20gXCIuL3Jlc2FtcGxlLmpzXCI7XG5cbnZhciB0cmFuc2Zvcm1SYWRpYW5zID0gdHJhbnNmb3JtZXIoe1xuICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgIHRoaXMuc3RyZWFtLnBvaW50KHggKiByYWRpYW5zLCB5ICogcmFkaWFucyk7XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Sb3RhdGUocm90YXRlKSB7XG4gIHJldHVybiB0cmFuc2Zvcm1lcih7XG4gICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgIHZhciByID0gcm90YXRlKHgsIHkpO1xuICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtLnBvaW50KHJbMF0sIHJbMV0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNjYWxlVHJhbnNsYXRlKGssIGR4LCBkeSwgc3gsIHN5KSB7XG4gIGZ1bmN0aW9uIHRyYW5zZm9ybSh4LCB5KSB7XG4gICAgeCAqPSBzeDsgeSAqPSBzeTtcbiAgICByZXR1cm4gW2R4ICsgayAqIHgsIGR5IC0gayAqIHldO1xuICB9XG4gIHRyYW5zZm9ybS5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7XG4gICAgcmV0dXJuIFsoeCAtIGR4KSAvIGsgKiBzeCwgKGR5IC0geSkgLyBrICogc3ldO1xuICB9O1xuICByZXR1cm4gdHJhbnNmb3JtO1xufVxuXG5mdW5jdGlvbiBzY2FsZVRyYW5zbGF0ZVJvdGF0ZShrLCBkeCwgZHksIHN4LCBzeSwgYWxwaGEpIHtcbiAgaWYgKCFhbHBoYSkgcmV0dXJuIHNjYWxlVHJhbnNsYXRlKGssIGR4LCBkeSwgc3gsIHN5KTtcbiAgdmFyIGNvc0FscGhhID0gY29zKGFscGhhKSxcbiAgICAgIHNpbkFscGhhID0gc2luKGFscGhhKSxcbiAgICAgIGEgPSBjb3NBbHBoYSAqIGssXG4gICAgICBiID0gc2luQWxwaGEgKiBrLFxuICAgICAgYWkgPSBjb3NBbHBoYSAvIGssXG4gICAgICBiaSA9IHNpbkFscGhhIC8gayxcbiAgICAgIGNpID0gKHNpbkFscGhhICogZHkgLSBjb3NBbHBoYSAqIGR4KSAvIGssXG4gICAgICBmaSA9IChzaW5BbHBoYSAqIGR4ICsgY29zQWxwaGEgKiBkeSkgLyBrO1xuICBmdW5jdGlvbiB0cmFuc2Zvcm0oeCwgeSkge1xuICAgIHggKj0gc3g7IHkgKj0gc3k7XG4gICAgcmV0dXJuIFthICogeCAtIGIgKiB5ICsgZHgsIGR5IC0gYiAqIHggLSBhICogeV07XG4gIH1cbiAgdHJhbnNmb3JtLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4gW3N4ICogKGFpICogeCAtIGJpICogeSArIGNpKSwgc3kgKiAoZmkgLSBiaSAqIHggLSBhaSAqIHkpXTtcbiAgfTtcbiAgcmV0dXJuIHRyYW5zZm9ybTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcHJvamVjdGlvbihwcm9qZWN0KSB7XG4gIHJldHVybiBwcm9qZWN0aW9uTXV0YXRvcihmdW5jdGlvbigpIHsgcmV0dXJuIHByb2plY3Q7IH0pKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9qZWN0aW9uTXV0YXRvcihwcm9qZWN0QXQpIHtcbiAgdmFyIHByb2plY3QsXG4gICAgICBrID0gMTUwLCAvLyBzY2FsZVxuICAgICAgeCA9IDQ4MCwgeSA9IDI1MCwgLy8gdHJhbnNsYXRlXG4gICAgICBsYW1iZGEgPSAwLCBwaGkgPSAwLCAvLyBjZW50ZXJcbiAgICAgIGRlbHRhTGFtYmRhID0gMCwgZGVsdGFQaGkgPSAwLCBkZWx0YUdhbW1hID0gMCwgcm90YXRlLCAvLyBwcmUtcm90YXRlXG4gICAgICBhbHBoYSA9IDAsIC8vIHBvc3Qtcm90YXRlIGFuZ2xlXG4gICAgICBzeCA9IDEsIC8vIHJlZmxlY3RYXG4gICAgICBzeSA9IDEsIC8vIHJlZmxlY3RYXG4gICAgICB0aGV0YSA9IG51bGwsIHByZWNsaXAgPSBjbGlwQW50aW1lcmlkaWFuLCAvLyBwcmUtY2xpcCBhbmdsZVxuICAgICAgeDAgPSBudWxsLCB5MCwgeDEsIHkxLCBwb3N0Y2xpcCA9IGlkZW50aXR5LCAvLyBwb3N0LWNsaXAgZXh0ZW50XG4gICAgICBkZWx0YTIgPSAwLjUsIC8vIHByZWNpc2lvblxuICAgICAgcHJvamVjdFJlc2FtcGxlLFxuICAgICAgcHJvamVjdFRyYW5zZm9ybSxcbiAgICAgIHByb2plY3RSb3RhdGVUcmFuc2Zvcm0sXG4gICAgICBjYWNoZSxcbiAgICAgIGNhY2hlU3RyZWFtO1xuXG4gIGZ1bmN0aW9uIHByb2plY3Rpb24ocG9pbnQpIHtcbiAgICByZXR1cm4gcHJvamVjdFJvdGF0ZVRyYW5zZm9ybShwb2ludFswXSAqIHJhZGlhbnMsIHBvaW50WzFdICogcmFkaWFucyk7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZlcnQocG9pbnQpIHtcbiAgICBwb2ludCA9IHByb2plY3RSb3RhdGVUcmFuc2Zvcm0uaW52ZXJ0KHBvaW50WzBdLCBwb2ludFsxXSk7XG4gICAgcmV0dXJuIHBvaW50ICYmIFtwb2ludFswXSAqIGRlZ3JlZXMsIHBvaW50WzFdICogZGVncmVlc107XG4gIH1cblxuICBwcm9qZWN0aW9uLnN0cmVhbSA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgIHJldHVybiBjYWNoZSAmJiBjYWNoZVN0cmVhbSA9PT0gc3RyZWFtID8gY2FjaGUgOiBjYWNoZSA9IHRyYW5zZm9ybVJhZGlhbnModHJhbnNmb3JtUm90YXRlKHJvdGF0ZSkocHJlY2xpcChwcm9qZWN0UmVzYW1wbGUocG9zdGNsaXAoY2FjaGVTdHJlYW0gPSBzdHJlYW0pKSkpKTtcbiAgfTtcblxuICBwcm9qZWN0aW9uLnByZWNsaXAgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocHJlY2xpcCA9IF8sIHRoZXRhID0gdW5kZWZpbmVkLCByZXNldCgpKSA6IHByZWNsaXA7XG4gIH07XG5cbiAgcHJvamVjdGlvbi5wb3N0Y2xpcCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwb3N0Y2xpcCA9IF8sIHgwID0geTAgPSB4MSA9IHkxID0gbnVsbCwgcmVzZXQoKSkgOiBwb3N0Y2xpcDtcbiAgfTtcblxuICBwcm9qZWN0aW9uLmNsaXBBbmdsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwcmVjbGlwID0gK18gPyBjbGlwQ2lyY2xlKHRoZXRhID0gXyAqIHJhZGlhbnMpIDogKHRoZXRhID0gbnVsbCwgY2xpcEFudGltZXJpZGlhbiksIHJlc2V0KCkpIDogdGhldGEgKiBkZWdyZWVzO1xuICB9O1xuXG4gIHByb2plY3Rpb24uY2xpcEV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwb3N0Y2xpcCA9IF8gPT0gbnVsbCA/ICh4MCA9IHkwID0geDEgPSB5MSA9IG51bGwsIGlkZW50aXR5KSA6IGNsaXBSZWN0YW5nbGUoeDAgPSArX1swXVswXSwgeTAgPSArX1swXVsxXSwgeDEgPSArX1sxXVswXSwgeTEgPSArX1sxXVsxXSksIHJlc2V0KCkpIDogeDAgPT0gbnVsbCA/IG51bGwgOiBbW3gwLCB5MF0sIFt4MSwgeTFdXTtcbiAgfTtcblxuICBwcm9qZWN0aW9uLnNjYWxlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGsgPSArXywgcmVjZW50ZXIoKSkgOiBrO1xuICB9O1xuXG4gIHByb2plY3Rpb24udHJhbnNsYXRlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSArX1swXSwgeSA9ICtfWzFdLCByZWNlbnRlcigpKSA6IFt4LCB5XTtcbiAgfTtcblxuICBwcm9qZWN0aW9uLmNlbnRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChsYW1iZGEgPSBfWzBdICUgMzYwICogcmFkaWFucywgcGhpID0gX1sxXSAlIDM2MCAqIHJhZGlhbnMsIHJlY2VudGVyKCkpIDogW2xhbWJkYSAqIGRlZ3JlZXMsIHBoaSAqIGRlZ3JlZXNdO1xuICB9O1xuXG4gIHByb2plY3Rpb24ucm90YXRlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRlbHRhTGFtYmRhID0gX1swXSAlIDM2MCAqIHJhZGlhbnMsIGRlbHRhUGhpID0gX1sxXSAlIDM2MCAqIHJhZGlhbnMsIGRlbHRhR2FtbWEgPSBfLmxlbmd0aCA+IDIgPyBfWzJdICUgMzYwICogcmFkaWFucyA6IDAsIHJlY2VudGVyKCkpIDogW2RlbHRhTGFtYmRhICogZGVncmVlcywgZGVsdGFQaGkgKiBkZWdyZWVzLCBkZWx0YUdhbW1hICogZGVncmVlc107XG4gIH07XG5cbiAgcHJvamVjdGlvbi5hbmdsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbHBoYSA9IF8gJSAzNjAgKiByYWRpYW5zLCByZWNlbnRlcigpKSA6IGFscGhhICogZGVncmVlcztcbiAgfTtcblxuICBwcm9qZWN0aW9uLnJlZmxlY3RYID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN4ID0gXyA/IC0xIDogMSwgcmVjZW50ZXIoKSkgOiBzeCA8IDA7XG4gIH07XG5cbiAgcHJvamVjdGlvbi5yZWZsZWN0WSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzeSA9IF8gPyAtMSA6IDEsIHJlY2VudGVyKCkpIDogc3kgPCAwO1xuICB9O1xuXG4gIHByb2plY3Rpb24ucHJlY2lzaW9uID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHByb2plY3RSZXNhbXBsZSA9IHJlc2FtcGxlKHByb2plY3RUcmFuc2Zvcm0sIGRlbHRhMiA9IF8gKiBfKSwgcmVzZXQoKSkgOiBzcXJ0KGRlbHRhMik7XG4gIH07XG5cbiAgcHJvamVjdGlvbi5maXRFeHRlbnQgPSBmdW5jdGlvbihleHRlbnQsIG9iamVjdCkge1xuICAgIHJldHVybiBmaXRFeHRlbnQocHJvamVjdGlvbiwgZXh0ZW50LCBvYmplY3QpO1xuICB9O1xuXG4gIHByb2plY3Rpb24uZml0U2l6ZSA9IGZ1bmN0aW9uKHNpemUsIG9iamVjdCkge1xuICAgIHJldHVybiBmaXRTaXplKHByb2plY3Rpb24sIHNpemUsIG9iamVjdCk7XG4gIH07XG5cbiAgcHJvamVjdGlvbi5maXRXaWR0aCA9IGZ1bmN0aW9uKHdpZHRoLCBvYmplY3QpIHtcbiAgICByZXR1cm4gZml0V2lkdGgocHJvamVjdGlvbiwgd2lkdGgsIG9iamVjdCk7XG4gIH07XG5cbiAgcHJvamVjdGlvbi5maXRIZWlnaHQgPSBmdW5jdGlvbihoZWlnaHQsIG9iamVjdCkge1xuICAgIHJldHVybiBmaXRIZWlnaHQocHJvamVjdGlvbiwgaGVpZ2h0LCBvYmplY3QpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHJlY2VudGVyKCkge1xuICAgIHZhciBjZW50ZXIgPSBzY2FsZVRyYW5zbGF0ZVJvdGF0ZShrLCAwLCAwLCBzeCwgc3ksIGFscGhhKS5hcHBseShudWxsLCBwcm9qZWN0KGxhbWJkYSwgcGhpKSksXG4gICAgICAgIHRyYW5zZm9ybSA9IHNjYWxlVHJhbnNsYXRlUm90YXRlKGssIHggLSBjZW50ZXJbMF0sIHkgLSBjZW50ZXJbMV0sIHN4LCBzeSwgYWxwaGEpO1xuICAgIHJvdGF0ZSA9IHJvdGF0ZVJhZGlhbnMoZGVsdGFMYW1iZGEsIGRlbHRhUGhpLCBkZWx0YUdhbW1hKTtcbiAgICBwcm9qZWN0VHJhbnNmb3JtID0gY29tcG9zZShwcm9qZWN0LCB0cmFuc2Zvcm0pO1xuICAgIHByb2plY3RSb3RhdGVUcmFuc2Zvcm0gPSBjb21wb3NlKHJvdGF0ZSwgcHJvamVjdFRyYW5zZm9ybSk7XG4gICAgcHJvamVjdFJlc2FtcGxlID0gcmVzYW1wbGUocHJvamVjdFRyYW5zZm9ybSwgZGVsdGEyKTtcbiAgICByZXR1cm4gcmVzZXQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgIGNhY2hlID0gY2FjaGVTdHJlYW0gPSBudWxsO1xuICAgIHJldHVybiBwcm9qZWN0aW9uO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHByb2plY3QgPSBwcm9qZWN0QXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBwcm9qZWN0aW9uLmludmVydCA9IHByb2plY3QuaW52ZXJ0ICYmIGludmVydDtcbiAgICByZXR1cm4gcmVjZW50ZXIoKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7Y2FydGVzaWFufSBmcm9tIFwiLi4vY2FydGVzaWFuLmpzXCI7XG5pbXBvcnQge2FicywgYXNpbiwgYXRhbjIsIGNvcywgZXBzaWxvbiwgcmFkaWFucywgc3FydH0gZnJvbSBcIi4uL21hdGguanNcIjtcbmltcG9ydCB7dHJhbnNmb3JtZXJ9IGZyb20gXCIuLi90cmFuc2Zvcm0uanNcIjtcblxudmFyIG1heERlcHRoID0gMTYsIC8vIG1heGltdW0gZGVwdGggb2Ygc3ViZGl2aXNpb25cbiAgICBjb3NNaW5EaXN0YW5jZSA9IGNvcygzMCAqIHJhZGlhbnMpOyAvLyBjb3MobWluaW11bSBhbmd1bGFyIGRpc3RhbmNlKVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihwcm9qZWN0LCBkZWx0YTIpIHtcbiAgcmV0dXJuICtkZWx0YTIgPyByZXNhbXBsZShwcm9qZWN0LCBkZWx0YTIpIDogcmVzYW1wbGVOb25lKHByb2plY3QpO1xufVxuXG5mdW5jdGlvbiByZXNhbXBsZU5vbmUocHJvamVjdCkge1xuICByZXR1cm4gdHJhbnNmb3JtZXIoe1xuICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgICB4ID0gcHJvamVjdCh4LCB5KTtcbiAgICAgIHRoaXMuc3RyZWFtLnBvaW50KHhbMF0sIHhbMV0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlc2FtcGxlKHByb2plY3QsIGRlbHRhMikge1xuXG4gIGZ1bmN0aW9uIHJlc2FtcGxlTGluZVRvKHgwLCB5MCwgbGFtYmRhMCwgYTAsIGIwLCBjMCwgeDEsIHkxLCBsYW1iZGExLCBhMSwgYjEsIGMxLCBkZXB0aCwgc3RyZWFtKSB7XG4gICAgdmFyIGR4ID0geDEgLSB4MCxcbiAgICAgICAgZHkgPSB5MSAtIHkwLFxuICAgICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5O1xuICAgIGlmIChkMiA+IDQgKiBkZWx0YTIgJiYgZGVwdGgtLSkge1xuICAgICAgdmFyIGEgPSBhMCArIGExLFxuICAgICAgICAgIGIgPSBiMCArIGIxLFxuICAgICAgICAgIGMgPSBjMCArIGMxLFxuICAgICAgICAgIG0gPSBzcXJ0KGEgKiBhICsgYiAqIGIgKyBjICogYyksXG4gICAgICAgICAgcGhpMiA9IGFzaW4oYyAvPSBtKSxcbiAgICAgICAgICBsYW1iZGEyID0gYWJzKGFicyhjKSAtIDEpIDwgZXBzaWxvbiB8fCBhYnMobGFtYmRhMCAtIGxhbWJkYTEpIDwgZXBzaWxvbiA/IChsYW1iZGEwICsgbGFtYmRhMSkgLyAyIDogYXRhbjIoYiwgYSksXG4gICAgICAgICAgcCA9IHByb2plY3QobGFtYmRhMiwgcGhpMiksXG4gICAgICAgICAgeDIgPSBwWzBdLFxuICAgICAgICAgIHkyID0gcFsxXSxcbiAgICAgICAgICBkeDIgPSB4MiAtIHgwLFxuICAgICAgICAgIGR5MiA9IHkyIC0geTAsXG4gICAgICAgICAgZHogPSBkeSAqIGR4MiAtIGR4ICogZHkyO1xuICAgICAgaWYgKGR6ICogZHogLyBkMiA+IGRlbHRhMiAvLyBwZXJwZW5kaWN1bGFyIHByb2plY3RlZCBkaXN0YW5jZVxuICAgICAgICAgIHx8IGFicygoZHggKiBkeDIgKyBkeSAqIGR5MikgLyBkMiAtIDAuNSkgPiAwLjMgLy8gbWlkcG9pbnQgY2xvc2UgdG8gYW4gZW5kXG4gICAgICAgICAgfHwgYTAgKiBhMSArIGIwICogYjEgKyBjMCAqIGMxIDwgY29zTWluRGlzdGFuY2UpIHsgLy8gYW5ndWxhciBkaXN0YW5jZVxuICAgICAgICByZXNhbXBsZUxpbmVUbyh4MCwgeTAsIGxhbWJkYTAsIGEwLCBiMCwgYzAsIHgyLCB5MiwgbGFtYmRhMiwgYSAvPSBtLCBiIC89IG0sIGMsIGRlcHRoLCBzdHJlYW0pO1xuICAgICAgICBzdHJlYW0ucG9pbnQoeDIsIHkyKTtcbiAgICAgICAgcmVzYW1wbGVMaW5lVG8oeDIsIHkyLCBsYW1iZGEyLCBhLCBiLCBjLCB4MSwgeTEsIGxhbWJkYTEsIGExLCBiMSwgYzEsIGRlcHRoLCBzdHJlYW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgdmFyIGxhbWJkYTAwLCB4MDAsIHkwMCwgYTAwLCBiMDAsIGMwMCwgLy8gZmlyc3QgcG9pbnRcbiAgICAgICAgbGFtYmRhMCwgeDAsIHkwLCBhMCwgYjAsIGMwOyAvLyBwcmV2aW91cyBwb2ludFxuXG4gICAgdmFyIHJlc2FtcGxlU3RyZWFtID0ge1xuICAgICAgcG9pbnQ6IHBvaW50LFxuICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsXG4gICAgICBsaW5lRW5kOiBsaW5lRW5kLFxuICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsgc3RyZWFtLnBvbHlnb25TdGFydCgpOyByZXNhbXBsZVN0cmVhbS5saW5lU3RhcnQgPSByaW5nU3RhcnQ7IH0sXG4gICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsgc3RyZWFtLnBvbHlnb25FbmQoKTsgcmVzYW1wbGVTdHJlYW0ubGluZVN0YXJ0ID0gbGluZVN0YXJ0OyB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHBvaW50KHgsIHkpIHtcbiAgICAgIHggPSBwcm9qZWN0KHgsIHkpO1xuICAgICAgc3RyZWFtLnBvaW50KHhbMF0sIHhbMV0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpbmVTdGFydCgpIHtcbiAgICAgIHgwID0gTmFOO1xuICAgICAgcmVzYW1wbGVTdHJlYW0ucG9pbnQgPSBsaW5lUG9pbnQ7XG4gICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGluZVBvaW50KGxhbWJkYSwgcGhpKSB7XG4gICAgICB2YXIgYyA9IGNhcnRlc2lhbihbbGFtYmRhLCBwaGldKSwgcCA9IHByb2plY3QobGFtYmRhLCBwaGkpO1xuICAgICAgcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCBsYW1iZGEwLCBhMCwgYjAsIGMwLCB4MCA9IHBbMF0sIHkwID0gcFsxXSwgbGFtYmRhMCA9IGxhbWJkYSwgYTAgPSBjWzBdLCBiMCA9IGNbMV0sIGMwID0gY1syXSwgbWF4RGVwdGgsIHN0cmVhbSk7XG4gICAgICBzdHJlYW0ucG9pbnQoeDAsIHkwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaW5lRW5kKCkge1xuICAgICAgcmVzYW1wbGVTdHJlYW0ucG9pbnQgPSBwb2ludDtcbiAgICAgIHN0cmVhbS5saW5lRW5kKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmluZ1N0YXJ0KCkge1xuICAgICAgbGluZVN0YXJ0KCk7XG4gICAgICByZXNhbXBsZVN0cmVhbS5wb2ludCA9IHJpbmdQb2ludDtcbiAgICAgIHJlc2FtcGxlU3RyZWFtLmxpbmVFbmQgPSByaW5nRW5kO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJpbmdQb2ludChsYW1iZGEsIHBoaSkge1xuICAgICAgbGluZVBvaW50KGxhbWJkYTAwID0gbGFtYmRhLCBwaGkpLCB4MDAgPSB4MCwgeTAwID0geTAsIGEwMCA9IGEwLCBiMDAgPSBiMCwgYzAwID0gYzA7XG4gICAgICByZXNhbXBsZVN0cmVhbS5wb2ludCA9IGxpbmVQb2ludDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByaW5nRW5kKCkge1xuICAgICAgcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCBsYW1iZGEwLCBhMCwgYjAsIGMwLCB4MDAsIHkwMCwgbGFtYmRhMDAsIGEwMCwgYjAwLCBjMDAsIG1heERlcHRoLCBzdHJlYW0pO1xuICAgICAgcmVzYW1wbGVTdHJlYW0ubGluZUVuZCA9IGxpbmVFbmQ7XG4gICAgICBsaW5lRW5kKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc2FtcGxlU3RyZWFtO1xuICB9O1xufVxuIiwiaW1wb3J0IGNvbXBvc2UgZnJvbSBcIi4vY29tcG9zZS5qc1wiO1xuaW1wb3J0IHthYnMsIGFzaW4sIGF0YW4yLCBjb3MsIGRlZ3JlZXMsIHBpLCByYWRpYW5zLCBzaW4sIHRhdX0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiByb3RhdGlvbklkZW50aXR5KGxhbWJkYSwgcGhpKSB7XG4gIGlmIChhYnMobGFtYmRhKSA+IHBpKSBsYW1iZGEgLT0gTWF0aC5yb3VuZChsYW1iZGEgLyB0YXUpICogdGF1O1xuICByZXR1cm4gW2xhbWJkYSwgcGhpXTtcbn1cblxucm90YXRpb25JZGVudGl0eS5pbnZlcnQgPSByb3RhdGlvbklkZW50aXR5O1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlUmFkaWFucyhkZWx0YUxhbWJkYSwgZGVsdGFQaGksIGRlbHRhR2FtbWEpIHtcbiAgcmV0dXJuIChkZWx0YUxhbWJkYSAlPSB0YXUpID8gKGRlbHRhUGhpIHx8IGRlbHRhR2FtbWEgPyBjb21wb3NlKHJvdGF0aW9uTGFtYmRhKGRlbHRhTGFtYmRhKSwgcm90YXRpb25QaGlHYW1tYShkZWx0YVBoaSwgZGVsdGFHYW1tYSkpXG4gICAgOiByb3RhdGlvbkxhbWJkYShkZWx0YUxhbWJkYSkpXG4gICAgOiAoZGVsdGFQaGkgfHwgZGVsdGFHYW1tYSA/IHJvdGF0aW9uUGhpR2FtbWEoZGVsdGFQaGksIGRlbHRhR2FtbWEpXG4gICAgOiByb3RhdGlvbklkZW50aXR5KTtcbn1cblxuZnVuY3Rpb24gZm9yd2FyZFJvdGF0aW9uTGFtYmRhKGRlbHRhTGFtYmRhKSB7XG4gIHJldHVybiBmdW5jdGlvbihsYW1iZGEsIHBoaSkge1xuICAgIGxhbWJkYSArPSBkZWx0YUxhbWJkYTtcbiAgICBpZiAoYWJzKGxhbWJkYSkgPiBwaSkgbGFtYmRhIC09IE1hdGgucm91bmQobGFtYmRhIC8gdGF1KSAqIHRhdTtcbiAgICByZXR1cm4gW2xhbWJkYSwgcGhpXTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcm90YXRpb25MYW1iZGEoZGVsdGFMYW1iZGEpIHtcbiAgdmFyIHJvdGF0aW9uID0gZm9yd2FyZFJvdGF0aW9uTGFtYmRhKGRlbHRhTGFtYmRhKTtcbiAgcm90YXRpb24uaW52ZXJ0ID0gZm9yd2FyZFJvdGF0aW9uTGFtYmRhKC1kZWx0YUxhbWJkYSk7XG4gIHJldHVybiByb3RhdGlvbjtcbn1cblxuZnVuY3Rpb24gcm90YXRpb25QaGlHYW1tYShkZWx0YVBoaSwgZGVsdGFHYW1tYSkge1xuICB2YXIgY29zRGVsdGFQaGkgPSBjb3MoZGVsdGFQaGkpLFxuICAgICAgc2luRGVsdGFQaGkgPSBzaW4oZGVsdGFQaGkpLFxuICAgICAgY29zRGVsdGFHYW1tYSA9IGNvcyhkZWx0YUdhbW1hKSxcbiAgICAgIHNpbkRlbHRhR2FtbWEgPSBzaW4oZGVsdGFHYW1tYSk7XG5cbiAgZnVuY3Rpb24gcm90YXRpb24obGFtYmRhLCBwaGkpIHtcbiAgICB2YXIgY29zUGhpID0gY29zKHBoaSksXG4gICAgICAgIHggPSBjb3MobGFtYmRhKSAqIGNvc1BoaSxcbiAgICAgICAgeSA9IHNpbihsYW1iZGEpICogY29zUGhpLFxuICAgICAgICB6ID0gc2luKHBoaSksXG4gICAgICAgIGsgPSB6ICogY29zRGVsdGFQaGkgKyB4ICogc2luRGVsdGFQaGk7XG4gICAgcmV0dXJuIFtcbiAgICAgIGF0YW4yKHkgKiBjb3NEZWx0YUdhbW1hIC0gayAqIHNpbkRlbHRhR2FtbWEsIHggKiBjb3NEZWx0YVBoaSAtIHogKiBzaW5EZWx0YVBoaSksXG4gICAgICBhc2luKGsgKiBjb3NEZWx0YUdhbW1hICsgeSAqIHNpbkRlbHRhR2FtbWEpXG4gICAgXTtcbiAgfVxuXG4gIHJvdGF0aW9uLmludmVydCA9IGZ1bmN0aW9uKGxhbWJkYSwgcGhpKSB7XG4gICAgdmFyIGNvc1BoaSA9IGNvcyhwaGkpLFxuICAgICAgICB4ID0gY29zKGxhbWJkYSkgKiBjb3NQaGksXG4gICAgICAgIHkgPSBzaW4obGFtYmRhKSAqIGNvc1BoaSxcbiAgICAgICAgeiA9IHNpbihwaGkpLFxuICAgICAgICBrID0geiAqIGNvc0RlbHRhR2FtbWEgLSB5ICogc2luRGVsdGFHYW1tYTtcbiAgICByZXR1cm4gW1xuICAgICAgYXRhbjIoeSAqIGNvc0RlbHRhR2FtbWEgKyB6ICogc2luRGVsdGFHYW1tYSwgeCAqIGNvc0RlbHRhUGhpICsgayAqIHNpbkRlbHRhUGhpKSxcbiAgICAgIGFzaW4oayAqIGNvc0RlbHRhUGhpIC0geCAqIHNpbkRlbHRhUGhpKVxuICAgIF07XG4gIH07XG5cbiAgcmV0dXJuIHJvdGF0aW9uO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihyb3RhdGUpIHtcbiAgcm90YXRlID0gcm90YXRlUmFkaWFucyhyb3RhdGVbMF0gKiByYWRpYW5zLCByb3RhdGVbMV0gKiByYWRpYW5zLCByb3RhdGUubGVuZ3RoID4gMiA/IHJvdGF0ZVsyXSAqIHJhZGlhbnMgOiAwKTtcblxuICBmdW5jdGlvbiBmb3J3YXJkKGNvb3JkaW5hdGVzKSB7XG4gICAgY29vcmRpbmF0ZXMgPSByb3RhdGUoY29vcmRpbmF0ZXNbMF0gKiByYWRpYW5zLCBjb29yZGluYXRlc1sxXSAqIHJhZGlhbnMpO1xuICAgIHJldHVybiBjb29yZGluYXRlc1swXSAqPSBkZWdyZWVzLCBjb29yZGluYXRlc1sxXSAqPSBkZWdyZWVzLCBjb29yZGluYXRlcztcbiAgfVxuXG4gIGZvcndhcmQuaW52ZXJ0ID0gZnVuY3Rpb24oY29vcmRpbmF0ZXMpIHtcbiAgICBjb29yZGluYXRlcyA9IHJvdGF0ZS5pbnZlcnQoY29vcmRpbmF0ZXNbMF0gKiByYWRpYW5zLCBjb29yZGluYXRlc1sxXSAqIHJhZGlhbnMpO1xuICAgIHJldHVybiBjb29yZGluYXRlc1swXSAqPSBkZWdyZWVzLCBjb29yZGluYXRlc1sxXSAqPSBkZWdyZWVzLCBjb29yZGluYXRlcztcbiAgfTtcblxuICByZXR1cm4gZm9yd2FyZDtcbn1cbiIsImZ1bmN0aW9uIHN0cmVhbUdlb21ldHJ5KGdlb21ldHJ5LCBzdHJlYW0pIHtcbiAgaWYgKGdlb21ldHJ5ICYmIHN0cmVhbUdlb21ldHJ5VHlwZS5oYXNPd25Qcm9wZXJ0eShnZW9tZXRyeS50eXBlKSkge1xuICAgIHN0cmVhbUdlb21ldHJ5VHlwZVtnZW9tZXRyeS50eXBlXShnZW9tZXRyeSwgc3RyZWFtKTtcbiAgfVxufVxuXG52YXIgc3RyZWFtT2JqZWN0VHlwZSA9IHtcbiAgRmVhdHVyZTogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHtcbiAgICBzdHJlYW1HZW9tZXRyeShvYmplY3QuZ2VvbWV0cnksIHN0cmVhbSk7XG4gIH0sXG4gIEZlYXR1cmVDb2xsZWN0aW9uOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkge1xuICAgIHZhciBmZWF0dXJlcyA9IG9iamVjdC5mZWF0dXJlcywgaSA9IC0xLCBuID0gZmVhdHVyZXMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSBzdHJlYW1HZW9tZXRyeShmZWF0dXJlc1tpXS5nZW9tZXRyeSwgc3RyZWFtKTtcbiAgfVxufTtcblxudmFyIHN0cmVhbUdlb21ldHJ5VHlwZSA9IHtcbiAgU3BoZXJlOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkge1xuICAgIHN0cmVhbS5zcGhlcmUoKTtcbiAgfSxcbiAgUG9pbnQ6IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7XG4gICAgb2JqZWN0ID0gb2JqZWN0LmNvb3JkaW5hdGVzO1xuICAgIHN0cmVhbS5wb2ludChvYmplY3RbMF0sIG9iamVjdFsxXSwgb2JqZWN0WzJdKTtcbiAgfSxcbiAgTXVsdGlQb2ludDogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHtcbiAgICB2YXIgY29vcmRpbmF0ZXMgPSBvYmplY3QuY29vcmRpbmF0ZXMsIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDtcbiAgICB3aGlsZSAoKytpIDwgbikgb2JqZWN0ID0gY29vcmRpbmF0ZXNbaV0sIHN0cmVhbS5wb2ludChvYmplY3RbMF0sIG9iamVjdFsxXSwgb2JqZWN0WzJdKTtcbiAgfSxcbiAgTGluZVN0cmluZzogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHtcbiAgICBzdHJlYW1MaW5lKG9iamVjdC5jb29yZGluYXRlcywgc3RyZWFtLCAwKTtcbiAgfSxcbiAgTXVsdGlMaW5lU3RyaW5nOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkge1xuICAgIHZhciBjb29yZGluYXRlcyA9IG9iamVjdC5jb29yZGluYXRlcywgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSBzdHJlYW1MaW5lKGNvb3JkaW5hdGVzW2ldLCBzdHJlYW0sIDApO1xuICB9LFxuICBQb2x5Z29uOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkge1xuICAgIHN0cmVhbVBvbHlnb24ob2JqZWN0LmNvb3JkaW5hdGVzLCBzdHJlYW0pO1xuICB9LFxuICBNdWx0aVBvbHlnb246IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7XG4gICAgdmFyIGNvb3JkaW5hdGVzID0gb2JqZWN0LmNvb3JkaW5hdGVzLCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIHN0cmVhbVBvbHlnb24oY29vcmRpbmF0ZXNbaV0sIHN0cmVhbSk7XG4gIH0sXG4gIEdlb21ldHJ5Q29sbGVjdGlvbjogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHtcbiAgICB2YXIgZ2VvbWV0cmllcyA9IG9iamVjdC5nZW9tZXRyaWVzLCBpID0gLTEsIG4gPSBnZW9tZXRyaWVzLmxlbmd0aDtcbiAgICB3aGlsZSAoKytpIDwgbikgc3RyZWFtR2VvbWV0cnkoZ2VvbWV0cmllc1tpXSwgc3RyZWFtKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gc3RyZWFtTGluZShjb29yZGluYXRlcywgc3RyZWFtLCBjbG9zZWQpIHtcbiAgdmFyIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aCAtIGNsb3NlZCwgY29vcmRpbmF0ZTtcbiAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICB3aGlsZSAoKytpIDwgbikgY29vcmRpbmF0ZSA9IGNvb3JkaW5hdGVzW2ldLCBzdHJlYW0ucG9pbnQoY29vcmRpbmF0ZVswXSwgY29vcmRpbmF0ZVsxXSwgY29vcmRpbmF0ZVsyXSk7XG4gIHN0cmVhbS5saW5lRW5kKCk7XG59XG5cbmZ1bmN0aW9uIHN0cmVhbVBvbHlnb24oY29vcmRpbmF0ZXMsIHN0cmVhbSkge1xuICB2YXIgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoO1xuICBzdHJlYW0ucG9seWdvblN0YXJ0KCk7XG4gIHdoaWxlICgrK2kgPCBuKSBzdHJlYW1MaW5lKGNvb3JkaW5hdGVzW2ldLCBzdHJlYW0sIDEpO1xuICBzdHJlYW0ucG9seWdvbkVuZCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkge1xuICBpZiAob2JqZWN0ICYmIHN0cmVhbU9iamVjdFR5cGUuaGFzT3duUHJvcGVydHkob2JqZWN0LnR5cGUpKSB7XG4gICAgc3RyZWFtT2JqZWN0VHlwZVtvYmplY3QudHlwZV0ob2JqZWN0LCBzdHJlYW0pO1xuICB9IGVsc2Uge1xuICAgIHN0cmVhbUdlb21ldHJ5KG9iamVjdCwgc3RyZWFtKTtcbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWV0aG9kcykge1xuICByZXR1cm4ge1xuICAgIHN0cmVhbTogdHJhbnNmb3JtZXIobWV0aG9kcylcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybWVyKG1ldGhvZHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgIHZhciBzID0gbmV3IFRyYW5zZm9ybVN0cmVhbTtcbiAgICBmb3IgKHZhciBrZXkgaW4gbWV0aG9kcykgc1trZXldID0gbWV0aG9kc1trZXldO1xuICAgIHMuc3RyZWFtID0gc3RyZWFtO1xuICAgIHJldHVybiBzO1xuICB9O1xufVxuXG5mdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW0oKSB7fVxuXG5UcmFuc2Zvcm1TdHJlYW0ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtU3RyZWFtLFxuICBwb2ludDogZnVuY3Rpb24oeCwgeSkgeyB0aGlzLnN0cmVhbS5wb2ludCh4LCB5KTsgfSxcbiAgc3BoZXJlOiBmdW5jdGlvbigpIHsgdGhpcy5zdHJlYW0uc3BoZXJlKCk7IH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7IHRoaXMuc3RyZWFtLmxpbmVTdGFydCgpOyB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHsgdGhpcy5zdHJlYW0ubGluZUVuZCgpOyB9LFxuICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgeyB0aGlzLnN0cmVhbS5wb2x5Z29uU3RhcnQoKTsgfSxcbiAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7IHRoaXMuc3RyZWFtLnBvbHlnb25FbmQoKTsgfVxufTtcbiIsImV4cG9ydCBmdW5jdGlvbiBiYXNpcyh0MSwgdjAsIHYxLCB2MiwgdjMpIHtcbiAgdmFyIHQyID0gdDEgKiB0MSwgdDMgPSB0MiAqIHQxO1xuICByZXR1cm4gKCgxIC0gMyAqIHQxICsgMyAqIHQyIC0gdDMpICogdjBcbiAgICAgICsgKDQgLSA2ICogdDIgKyAzICogdDMpICogdjFcbiAgICAgICsgKDEgKyAzICogdDEgKyAzICogdDIgLSAzICogdDMpICogdjJcbiAgICAgICsgdDMgKiB2MykgLyA2O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoIC0gMTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IHQgPD0gMCA/ICh0ID0gMCkgOiB0ID49IDEgPyAodCA9IDEsIG4gLSAxKSA6IE1hdGguZmxvb3IodCAqIG4pLFxuICAgICAgICB2MSA9IHZhbHVlc1tpXSxcbiAgICAgICAgdjIgPSB2YWx1ZXNbaSArIDFdLFxuICAgICAgICB2MCA9IGkgPiAwID8gdmFsdWVzW2kgLSAxXSA6IDIgKiB2MSAtIHYyLFxuICAgICAgICB2MyA9IGkgPCBuIC0gMSA/IHZhbHVlc1tpICsgMl0gOiAyICogdjIgLSB2MTtcbiAgICByZXR1cm4gYmFzaXMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2Myk7XG4gIH07XG59XG4iLCJpbXBvcnQge2Jhc2lzfSBmcm9tIFwiLi9iYXNpcy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gTWF0aC5mbG9vcigoKHQgJT0gMSkgPCAwID8gKyt0IDogdCkgKiBuKSxcbiAgICAgICAgdjAgPSB2YWx1ZXNbKGkgKyBuIC0gMSkgJSBuXSxcbiAgICAgICAgdjEgPSB2YWx1ZXNbaSAlIG5dLFxuICAgICAgICB2MiA9IHZhbHVlc1soaSArIDEpICUgbl0sXG4gICAgICAgIHYzID0gdmFsdWVzWyhpICsgMikgJSBuXTtcbiAgICByZXR1cm4gYmFzaXMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2Myk7XG4gIH07XG59XG4iLCJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcblxuZnVuY3Rpb24gbGluZWFyKGEsIGQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSArIHQgKiBkO1xuICB9O1xufVxuXG5mdW5jdGlvbiBleHBvbmVudGlhbChhLCBiLCB5KSB7XG4gIHJldHVybiBhID0gTWF0aC5wb3coYSwgeSksIGIgPSBNYXRoLnBvdyhiLCB5KSAtIGEsIHkgPSAxIC8geSwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHVlKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCA+IDE4MCB8fCBkIDwgLTE4MCA/IGQgLSAzNjAgKiBNYXRoLnJvdW5kKGQgLyAzNjApIDogZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdhbW1hKHkpIHtcbiAgcmV0dXJuICh5ID0gK3kpID09PSAxID8gbm9nYW1tYSA6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYiAtIGEgPyBleHBvbmVudGlhbChhLCBiLCB5KSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBub2dhbW1hKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IHggPT4gKCkgPT4geDtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGEgKiAoMSAtIHQpICsgYiAqIHQ7XG4gIH07XG59XG4iLCJpbXBvcnQge3JnYiBhcyBjb2xvclJnYn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQgYmFzaXMgZnJvbSBcIi4vYmFzaXMuanNcIjtcbmltcG9ydCBiYXNpc0Nsb3NlZCBmcm9tIFwiLi9iYXNpc0Nsb3NlZC5qc1wiO1xuaW1wb3J0IG5vZ2FtbWEsIHtnYW1tYX0gZnJvbSBcIi4vY29sb3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHJnYkdhbW1hKHkpIHtcbiAgdmFyIGNvbG9yID0gZ2FtbWEoeSk7XG5cbiAgZnVuY3Rpb24gcmdiKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgciA9IGNvbG9yKChzdGFydCA9IGNvbG9yUmdiKHN0YXJ0KSkuciwgKGVuZCA9IGNvbG9yUmdiKGVuZCkpLnIpLFxuICAgICAgICBnID0gY29sb3Ioc3RhcnQuZywgZW5kLmcpLFxuICAgICAgICBiID0gY29sb3Ioc3RhcnQuYiwgZW5kLmIpLFxuICAgICAgICBvcGFjaXR5ID0gbm9nYW1tYShzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHN0YXJ0LnIgPSByKHQpO1xuICAgICAgc3RhcnQuZyA9IGcodCk7XG4gICAgICBzdGFydC5iID0gYih0KTtcbiAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpO1xuICAgICAgcmV0dXJuIHN0YXJ0ICsgXCJcIjtcbiAgICB9O1xuICB9XG5cbiAgcmdiLmdhbW1hID0gcmdiR2FtbWE7XG5cbiAgcmV0dXJuIHJnYjtcbn0pKDEpO1xuXG5mdW5jdGlvbiByZ2JTcGxpbmUoc3BsaW5lKSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xvcnMpIHtcbiAgICB2YXIgbiA9IGNvbG9ycy5sZW5ndGgsXG4gICAgICAgIHIgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGcgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGIgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGksIGNvbG9yO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGNvbG9yID0gY29sb3JSZ2IoY29sb3JzW2ldKTtcbiAgICAgIHJbaV0gPSBjb2xvci5yIHx8IDA7XG4gICAgICBnW2ldID0gY29sb3IuZyB8fCAwO1xuICAgICAgYltpXSA9IGNvbG9yLmIgfHwgMDtcbiAgICB9XG4gICAgciA9IHNwbGluZShyKTtcbiAgICBnID0gc3BsaW5lKGcpO1xuICAgIGIgPSBzcGxpbmUoYik7XG4gICAgY29sb3Iub3BhY2l0eSA9IDE7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIGNvbG9yLnIgPSByKHQpO1xuICAgICAgY29sb3IuZyA9IGcodCk7XG4gICAgICBjb2xvci5iID0gYih0KTtcbiAgICAgIHJldHVybiBjb2xvciArIFwiXCI7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHZhciByZ2JCYXNpcyA9IHJnYlNwbGluZShiYXNpcyk7XG5leHBvcnQgdmFyIHJnYkJhc2lzQ2xvc2VkID0gcmdiU3BsaW5lKGJhc2lzQ2xvc2VkKTtcbiIsImltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5cbnZhciByZUEgPSAvWy0rXT8oPzpcXGQrXFwuP1xcZCp8XFwuP1xcZCspKD86W2VFXVstK10/XFxkKyk/L2csXG4gICAgcmVCID0gbmV3IFJlZ0V4cChyZUEuc291cmNlLCBcImdcIik7XG5cbmZ1bmN0aW9uIHplcm8oYikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGI7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG9uZShiKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGIodCkgKyBcIlwiO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBiaSA9IHJlQS5sYXN0SW5kZXggPSByZUIubGFzdEluZGV4ID0gMCwgLy8gc2NhbiBpbmRleCBmb3IgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYW0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYVxuICAgICAgYm0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYlxuICAgICAgYnMsIC8vIHN0cmluZyBwcmVjZWRpbmcgY3VycmVudCBudW1iZXIgaW4gYiwgaWYgYW55XG4gICAgICBpID0gLTEsIC8vIGluZGV4IGluIHNcbiAgICAgIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG5cbiAgLy8gQ29lcmNlIGlucHV0cyB0byBzdHJpbmdzLlxuICBhID0gYSArIFwiXCIsIGIgPSBiICsgXCJcIjtcblxuICAvLyBJbnRlcnBvbGF0ZSBwYWlycyBvZiBudW1iZXJzIGluIGEgJiBiLlxuICB3aGlsZSAoKGFtID0gcmVBLmV4ZWMoYSkpXG4gICAgICAmJiAoYm0gPSByZUIuZXhlYyhiKSkpIHtcbiAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsgLy8gYSBzdHJpbmcgcHJlY2VkZXMgdGhlIG5leHQgbnVtYmVyIGluIGJcbiAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpO1xuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJzO1xuICAgIH1cbiAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHsgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaFxuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYm07IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJtO1xuICAgIH0gZWxzZSB7IC8vIGludGVycG9sYXRlIG5vbi1tYXRjaGluZyBudW1iZXJzXG4gICAgICBzWysraV0gPSBudWxsO1xuICAgICAgcS5wdXNoKHtpOiBpLCB4OiBudW1iZXIoYW0sIGJtKX0pO1xuICAgIH1cbiAgICBiaSA9IHJlQi5sYXN0SW5kZXg7XG4gIH1cblxuICAvLyBBZGQgcmVtYWlucyBvZiBiLlxuICBpZiAoYmkgPCBiLmxlbmd0aCkge1xuICAgIGJzID0gYi5zbGljZShiaSk7XG4gICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgZWxzZSBzWysraV0gPSBicztcbiAgfVxuXG4gIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNoLlxuICAvLyBPdGhlcndpc2UsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIG51bWJlcnMgYW5kIHJlam9pbiB0aGUgc3RyaW5nLlxuICByZXR1cm4gcy5sZW5ndGggPCAyID8gKHFbMF1cbiAgICAgID8gb25lKHFbMF0ueClcbiAgICAgIDogemVybyhiKSlcbiAgICAgIDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvOyBpIDwgYjsgKytpKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7XG4gICAgICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICAgICAgfSk7XG59XG4iLCJ2YXIgZGVncmVlcyA9IDE4MCAvIE1hdGguUEk7XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSB7XG4gIHRyYW5zbGF0ZVg6IDAsXG4gIHRyYW5zbGF0ZVk6IDAsXG4gIHJvdGF0ZTogMCxcbiAgc2tld1g6IDAsXG4gIHNjYWxlWDogMSxcbiAgc2NhbGVZOiAxXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHZhciBzY2FsZVgsIHNjYWxlWSwgc2tld1g7XG4gIGlmIChzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpIGEgLz0gc2NhbGVYLCBiIC89IHNjYWxlWDtcbiAgaWYgKHNrZXdYID0gYSAqIGMgKyBiICogZCkgYyAtPSBhICogc2tld1gsIGQgLT0gYiAqIHNrZXdYO1xuICBpZiAoc2NhbGVZID0gTWF0aC5zcXJ0KGMgKiBjICsgZCAqIGQpKSBjIC89IHNjYWxlWSwgZCAvPSBzY2FsZVksIHNrZXdYIC89IHNjYWxlWTtcbiAgaWYgKGEgKiBkIDwgYiAqIGMpIGEgPSAtYSwgYiA9IC1iLCBza2V3WCA9IC1za2V3WCwgc2NhbGVYID0gLXNjYWxlWDtcbiAgcmV0dXJuIHtcbiAgICB0cmFuc2xhdGVYOiBlLFxuICAgIHRyYW5zbGF0ZVk6IGYsXG4gICAgcm90YXRlOiBNYXRoLmF0YW4yKGIsIGEpICogZGVncmVlcyxcbiAgICBza2V3WDogTWF0aC5hdGFuKHNrZXdYKSAqIGRlZ3JlZXMsXG4gICAgc2NhbGVYOiBzY2FsZVgsXG4gICAgc2NhbGVZOiBzY2FsZVlcbiAgfTtcbn1cbiIsImltcG9ydCBudW1iZXIgZnJvbSBcIi4uL251bWJlci5qc1wiO1xuaW1wb3J0IHtwYXJzZUNzcywgcGFyc2VTdmd9IGZyb20gXCIuL3BhcnNlLmpzXCI7XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlLCBweENvbW1hLCBweFBhcmVuLCBkZWdQYXJlbikge1xuXG4gIGZ1bmN0aW9uIHBvcChzKSB7XG4gICAgcmV0dXJuIHMubGVuZ3RoID8gcy5wb3AoKSArIFwiIFwiIDogXCJcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zbGF0ZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkge1xuICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7XG4gICAgICB2YXIgaSA9IHMucHVzaChcInRyYW5zbGF0ZShcIiwgbnVsbCwgcHhDb21tYSwgbnVsbCwgcHhQYXJlbik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiIHx8IHliKSB7XG4gICAgICBzLnB1c2goXCJ0cmFuc2xhdGUoXCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJvdGF0ZShhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7IGVsc2UgaWYgKGIgLSBhID4gMTgwKSBhICs9IDM2MDsgLy8gc2hvcnRlc3QgcGF0aFxuICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgXCJyb3RhdGUoXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwicm90YXRlKFwiICsgYiArIGRlZ1BhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBza2V3WChhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIgKyBiICsgZGVnUGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNjYWxlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7XG4gICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHtcbiAgICAgIHZhciBpID0gcy5wdXNoKHBvcChzKSArIFwic2NhbGUoXCIsIG51bGwsIFwiLFwiLCBudWxsLCBcIilcIik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiICE9PSAxIHx8IHliICE9PSAxKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJzY2FsZShcIiArIHhiICsgXCIsXCIgKyB5YiArIFwiKVwiKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG4gICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7XG4gICAgdHJhbnNsYXRlKGEudHJhbnNsYXRlWCwgYS50cmFuc2xhdGVZLCBiLnRyYW5zbGF0ZVgsIGIudHJhbnNsYXRlWSwgcywgcSk7XG4gICAgcm90YXRlKGEucm90YXRlLCBiLnJvdGF0ZSwgcywgcSk7XG4gICAgc2tld1goYS5za2V3WCwgYi5za2V3WCwgcywgcSk7XG4gICAgc2NhbGUoYS5zY2FsZVgsIGEuc2NhbGVZLCBiLnNjYWxlWCwgYi5zY2FsZVksIHMsIHEpO1xuICAgIGEgPSBiID0gbnVsbDsgLy8gZ2NcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgdmFyIGkgPSAtMSwgbiA9IHEubGVuZ3RoLCBvO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgIHJldHVybiBzLmpvaW4oXCJcIik7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlQ3NzLCBcInB4LCBcIiwgXCJweClcIiwgXCJkZWcpXCIpO1xuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlU3ZnLCBcIiwgXCIsIFwiKVwiLCBcIilcIik7XG4iLCJpbXBvcnQgZGVjb21wb3NlLCB7aWRlbnRpdHl9IGZyb20gXCIuL2RlY29tcG9zZS5qc1wiO1xuXG52YXIgc3ZnTm9kZTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNzcyh2YWx1ZSkge1xuICBjb25zdCBtID0gbmV3ICh0eXBlb2YgRE9NTWF0cml4ID09PSBcImZ1bmN0aW9uXCIgPyBET01NYXRyaXggOiBXZWJLaXRDU1NNYXRyaXgpKHZhbHVlICsgXCJcIik7XG4gIHJldHVybiBtLmlzSWRlbnRpdHkgPyBpZGVudGl0eSA6IGRlY29tcG9zZShtLmEsIG0uYiwgbS5jLCBtLmQsIG0uZSwgbS5mKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3ZnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gaWRlbnRpdHk7XG4gIGlmICghc3ZnTm9kZSkgc3ZnTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZ1wiKTtcbiAgc3ZnTm9kZS5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgdmFsdWUpO1xuICBpZiAoISh2YWx1ZSA9IHN2Z05vZGUudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKSkpIHJldHVybiBpZGVudGl0eTtcbiAgdmFsdWUgPSB2YWx1ZS5tYXRyaXg7XG4gIHJldHVybiBkZWNvbXBvc2UodmFsdWUuYSwgdmFsdWUuYiwgdmFsdWUuYywgdmFsdWUuZCwgdmFsdWUuZSwgdmFsdWUuZik7XG59XG4iLCJ2YXIgZXBzaWxvbjIgPSAxZS0xMjtcblxuZnVuY3Rpb24gY29zaCh4KSB7XG4gIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgKyAxIC8geCkgLyAyO1xufVxuXG5mdW5jdGlvbiBzaW5oKHgpIHtcbiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSAtIDEgLyB4KSAvIDI7XG59XG5cbmZ1bmN0aW9uIHRhbmgoeCkge1xuICByZXR1cm4gKCh4ID0gTWF0aC5leHAoMiAqIHgpKSAtIDEpIC8gKHggKyAxKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHpvb21SaG8ocmhvLCByaG8yLCByaG80KSB7XG5cbiAgLy8gcDAgPSBbdXgwLCB1eTAsIHcwXVxuICAvLyBwMSA9IFt1eDEsIHV5MSwgdzFdXG4gIGZ1bmN0aW9uIHpvb20ocDAsIHAxKSB7XG4gICAgdmFyIHV4MCA9IHAwWzBdLCB1eTAgPSBwMFsxXSwgdzAgPSBwMFsyXSxcbiAgICAgICAgdXgxID0gcDFbMF0sIHV5MSA9IHAxWzFdLCB3MSA9IHAxWzJdLFxuICAgICAgICBkeCA9IHV4MSAtIHV4MCxcbiAgICAgICAgZHkgPSB1eTEgLSB1eTAsXG4gICAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHksXG4gICAgICAgIGksXG4gICAgICAgIFM7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHUwIOKJhSB1MS5cbiAgICBpZiAoZDIgPCBlcHNpbG9uMikge1xuICAgICAgUyA9IE1hdGgubG9nKHcxIC8gdzApIC8gcmhvO1xuICAgICAgaSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB1eDAgKyB0ICogZHgsXG4gICAgICAgICAgdXkwICsgdCAqIGR5LFxuICAgICAgICAgIHcwICogTWF0aC5leHAocmhvICogdCAqIFMpXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhbCBjYXNlLlxuICAgIGVsc2Uge1xuICAgICAgdmFyIGQxID0gTWF0aC5zcXJ0KGQyKSxcbiAgICAgICAgICBiMCA9ICh3MSAqIHcxIC0gdzAgKiB3MCArIHJobzQgKiBkMikgLyAoMiAqIHcwICogcmhvMiAqIGQxKSxcbiAgICAgICAgICBiMSA9ICh3MSAqIHcxIC0gdzAgKiB3MCAtIHJobzQgKiBkMikgLyAoMiAqIHcxICogcmhvMiAqIGQxKSxcbiAgICAgICAgICByMCA9IE1hdGgubG9nKE1hdGguc3FydChiMCAqIGIwICsgMSkgLSBiMCksXG4gICAgICAgICAgcjEgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjEgKiBiMSArIDEpIC0gYjEpO1xuICAgICAgUyA9IChyMSAtIHIwKSAvIHJobztcbiAgICAgIGkgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIHZhciBzID0gdCAqIFMsXG4gICAgICAgICAgICBjb3NocjAgPSBjb3NoKHIwKSxcbiAgICAgICAgICAgIHUgPSB3MCAvIChyaG8yICogZDEpICogKGNvc2hyMCAqIHRhbmgocmhvICogcyArIHIwKSAtIHNpbmgocjApKTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB1eDAgKyB1ICogZHgsXG4gICAgICAgICAgdXkwICsgdSAqIGR5LFxuICAgICAgICAgIHcwICogY29zaHIwIC8gY29zaChyaG8gKiBzICsgcjApXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaS5kdXJhdGlvbiA9IFMgKiAxMDAwICogcmhvIC8gTWF0aC5TUVJUMjtcblxuICAgIHJldHVybiBpO1xuICB9XG5cbiAgem9vbS5yaG8gPSBmdW5jdGlvbihfKSB7XG4gICAgdmFyIF8xID0gTWF0aC5tYXgoMWUtMywgK18pLCBfMiA9IF8xICogXzEsIF80ID0gXzIgKiBfMjtcbiAgICByZXR1cm4gem9vbVJobyhfMSwgXzIsIF80KTtcbiAgfTtcblxuICByZXR1cm4gem9vbTtcbn0pKE1hdGguU1FSVDIsIDIsIDQpO1xuIiwiZXhwb3J0IGRlZmF1bHQgTWF0aC5yYW5kb207XG4iLCJpbXBvcnQgZGVmYXVsdFNvdXJjZSBmcm9tIFwiLi9kZWZhdWx0U291cmNlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiBzb3VyY2VSYW5kb21Ob3JtYWwoc291cmNlKSB7XG4gIGZ1bmN0aW9uIHJhbmRvbU5vcm1hbChtdSwgc2lnbWEpIHtcbiAgICB2YXIgeCwgcjtcbiAgICBtdSA9IG11ID09IG51bGwgPyAwIDogK211O1xuICAgIHNpZ21hID0gc2lnbWEgPT0gbnVsbCA/IDEgOiArc2lnbWE7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHk7XG5cbiAgICAgIC8vIElmIGF2YWlsYWJsZSwgdXNlIHRoZSBzZWNvbmQgcHJldmlvdXNseS1nZW5lcmF0ZWQgdW5pZm9ybSByYW5kb20uXG4gICAgICBpZiAoeCAhPSBudWxsKSB5ID0geCwgeCA9IG51bGw7XG5cbiAgICAgIC8vIE90aGVyd2lzZSwgZ2VuZXJhdGUgYSBuZXcgeCBhbmQgeS5cbiAgICAgIGVsc2UgZG8ge1xuICAgICAgICB4ID0gc291cmNlKCkgKiAyIC0gMTtcbiAgICAgICAgeSA9IHNvdXJjZSgpICogMiAtIDE7XG4gICAgICAgIHIgPSB4ICogeCArIHkgKiB5O1xuICAgICAgfSB3aGlsZSAoIXIgfHwgciA+IDEpO1xuXG4gICAgICByZXR1cm4gbXUgKyBzaWdtYSAqIHkgKiBNYXRoLnNxcnQoLTIgKiBNYXRoLmxvZyhyKSAvIHIpO1xuICAgIH07XG4gIH1cblxuICByYW5kb21Ob3JtYWwuc291cmNlID0gc291cmNlUmFuZG9tTm9ybWFsO1xuXG4gIHJldHVybiByYW5kb21Ob3JtYWw7XG59KShkZWZhdWx0U291cmNlKTtcbiIsIi8vIEdpdmVuIHNvbWV0aGluZyBhcnJheSBsaWtlIChvciBudWxsKSwgcmV0dXJucyBzb21ldGhpbmcgdGhhdCBpcyBzdHJpY3RseSBhblxuLy8gYXJyYXkuIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCBhcnJheS1saWtlIG9iamVjdHMgcGFzc2VkIHRvIGQzLnNlbGVjdEFsbFxuLy8gb3Igc2VsZWN0aW9uLnNlbGVjdEFsbCBhcmUgY29udmVydGVkIGludG8gcHJvcGVyIGFycmF5cyB3aGVuIGNyZWF0aW5nIGFcbi8vIHNlbGVjdGlvbjsgd2UgZG9u4oCZdCBldmVyIHdhbnQgdG8gY3JlYXRlIGEgc2VsZWN0aW9uIGJhY2tlZCBieSBhIGxpdmVcbi8vIEhUTUxDb2xsZWN0aW9uIG9yIE5vZGVMaXN0LiBIb3dldmVyLCBub3RlIHRoYXQgc2VsZWN0aW9uLnNlbGVjdEFsbCB3aWxsIHVzZSBhXG4vLyBzdGF0aWMgTm9kZUxpc3QgYXMgYSBncm91cCwgc2luY2UgaXQgc2FmZWx5IGRlcml2ZWQgZnJvbSBxdWVyeVNlbGVjdG9yQWxsLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXJyYXkoeCkge1xuICByZXR1cm4geCA9PSBudWxsID8gW10gOiBBcnJheS5pc0FycmF5KHgpID8geCA6IEFycmF5LmZyb20oeCk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4vbmFtZXNwYWNlLmpzXCI7XG5pbXBvcnQge3hodG1sfSBmcm9tIFwiLi9uYW1lc3BhY2VzLmpzXCI7XG5cbmZ1bmN0aW9uIGNyZWF0b3JJbmhlcml0KG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBkb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCxcbiAgICAgICAgdXJpID0gdGhpcy5uYW1lc3BhY2VVUkk7XG4gICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWxcbiAgICAgICAgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpXG4gICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgbmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0b3JGaXhlZChmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG4gIHJldHVybiAoZnVsbG5hbWUubG9jYWxcbiAgICAgID8gY3JlYXRvckZpeGVkXG4gICAgICA6IGNyZWF0b3JJbmhlcml0KShmdWxsbmFtZSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhzZWxlY3Rvcik7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGlsZE1hdGNoZXIoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuIiwiaW1wb3J0IG5hbWVzcGFjZXMgZnJvbSBcIi4vbmFtZXNwYWNlcy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBwcmVmaXggPSBuYW1lICs9IFwiXCIsIGkgPSBwcmVmaXguaW5kZXhPZihcIjpcIik7XG4gIGlmIChpID49IDAgJiYgKHByZWZpeCA9IG5hbWUuc2xpY2UoMCwgaSkpICE9PSBcInhtbG5zXCIpIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKTtcbiAgcmV0dXJuIG5hbWVzcGFjZXMuaGFzT3duUHJvcGVydHkocHJlZml4KSA/IHtzcGFjZTogbmFtZXNwYWNlc1twcmVmaXhdLCBsb2NhbDogbmFtZX0gOiBuYW1lOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xufVxuIiwiZXhwb3J0IHZhciB4aHRtbCA9IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHN2ZzogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICB4aHRtbDogeGh0bWwsXG4gIHhsaW5rOiBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIixcbiAgeG1sOiBcImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZVwiLFxuICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zL1wiXG59O1xuIiwiaW1wb3J0IHNvdXJjZUV2ZW50IGZyb20gXCIuL3NvdXJjZUV2ZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50LCBub2RlKSB7XG4gIGV2ZW50ID0gc291cmNlRXZlbnQoZXZlbnQpO1xuICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSBub2RlID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgaWYgKG5vZGUpIHtcbiAgICB2YXIgc3ZnID0gbm9kZS5vd25lclNWR0VsZW1lbnQgfHwgbm9kZTtcbiAgICBpZiAoc3ZnLmNyZWF0ZVNWR1BvaW50KSB7XG4gICAgICB2YXIgcG9pbnQgPSBzdmcuY3JlYXRlU1ZHUG9pbnQoKTtcbiAgICAgIHBvaW50LnggPSBldmVudC5jbGllbnRYLCBwb2ludC55ID0gZXZlbnQuY2xpZW50WTtcbiAgICAgIHBvaW50ID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG5vZGUuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTtcbiAgICAgIHJldHVybiBbcG9pbnQueCwgcG9pbnQueV07XG4gICAgfVxuICAgIGlmIChub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xuICAgICAgdmFyIHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIFtldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gbm9kZS5jbGllbnRMZWZ0LCBldmVudC5jbGllbnRZIC0gcmVjdC50b3AgLSBub2RlLmNsaWVudFRvcF07XG4gICAgfVxuICB9XG4gIHJldHVybiBbZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZXTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9uLCByb290fSBmcm9tIFwiLi9zZWxlY3Rpb24vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcildXSwgW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pXG4gICAgICA6IG5ldyBTZWxlY3Rpb24oW1tzZWxlY3Rvcl1dLCByb290KTtcbn1cbiIsImltcG9ydCBjcmVhdG9yIGZyb20gXCIuLi9jcmVhdG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGNyZWF0ZSA9IHR5cGVvZiBuYW1lID09PSBcImZ1bmN0aW9uXCIgPyBuYW1lIDogY3JlYXRvcihuYW1lKTtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmFwcGVuZENoaWxkKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgbmFtZXNwYWNlIGZyb20gXCIuLi9uYW1lc3BhY2UuanNcIjtcblxuZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnROUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdik7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7XG4gICAgcmV0dXJuIGZ1bGxuYW1lLmxvY2FsXG4gICAgICAgID8gbm9kZS5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpXG4gICAgICAgIDogbm9kZS5nZXRBdHRyaWJ1dGUoZnVsbG5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbilcbiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKSkoZnVsbG5hbWUsIHZhbHVlKSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGNhbGxiYWNrID0gYXJndW1lbnRzWzBdO1xuICBhcmd1bWVudHNbMF0gPSB0aGlzO1xuICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICByZXR1cm4gdGhpcztcbn1cbiIsImZ1bmN0aW9uIGNsYXNzQXJyYXkoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcudHJpbSgpLnNwbGl0KC9efFxccysvKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NMaXN0KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0IHx8IG5ldyBDbGFzc0xpc3Qobm9kZSk7XG59XG5cbmZ1bmN0aW9uIENsYXNzTGlzdChub2RlKSB7XG4gIHRoaXMuX25vZGUgPSBub2RlO1xuICB0aGlzLl9uYW1lcyA9IGNsYXNzQXJyYXkobm9kZS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSB8fCBcIlwiKTtcbn1cblxuQ2xhc3NMaXN0LnByb3RvdHlwZSA9IHtcbiAgYWRkOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgIGlmIChpIDwgMCkge1xuICAgICAgdGhpcy5fbmFtZXMucHVzaChuYW1lKTtcbiAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy5fbmFtZXMuam9pbihcIiBcIikpO1xuICAgIH1cbiAgfSxcbiAgcmVtb3ZlOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIHRoaXMuX25hbWVzLnNwbGljZShpLCAxKTtcbiAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy5fbmFtZXMuam9pbihcIiBcIikpO1xuICAgIH1cbiAgfSxcbiAgY29udGFpbnM6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKSA+PSAwO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjbGFzc2VkQWRkKG5vZGUsIG5hbWVzKSB7XG4gIHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gIHdoaWxlICgrK2kgPCBuKSBsaXN0LmFkZChuYW1lc1tpXSk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRSZW1vdmUobm9kZSwgbmFtZXMpIHtcbiAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKCsraSA8IG4pIGxpc3QucmVtb3ZlKG5hbWVzW2ldKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZFRydWUobmFtZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGNsYXNzZWRBZGQodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkRmFsc2UobmFtZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGNsYXNzZWRSZW1vdmUodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkRnVuY3Rpb24obmFtZXMsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAodmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA/IGNsYXNzZWRBZGQgOiBjbGFzc2VkUmVtb3ZlKSh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBuYW1lcyA9IGNsYXNzQXJyYXkobmFtZSArIFwiXCIpO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBsaXN0ID0gY2xhc3NMaXN0KHRoaXMubm9kZSgpKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBjbGFzc2VkRnVuY3Rpb24gOiB2YWx1ZVxuICAgICAgPyBjbGFzc2VkVHJ1ZVxuICAgICAgOiBjbGFzc2VkRmFsc2UpKG5hbWVzLCB2YWx1ZSkpO1xufVxuIiwiZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lU2hhbGxvdygpIHtcbiAgdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUoZmFsc2UpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5nKSA6IGNsb25lO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVEZWVwKCkge1xuICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZSh0cnVlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZGVlcCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZGVlcCA/IHNlbGVjdGlvbl9jbG9uZURlZXAgOiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93KTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHtFbnRlck5vZGV9IGZyb20gXCIuL2VudGVyLmpzXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4uL2NvbnN0YW50LmpzXCI7XG5cbmZ1bmN0aW9uIGJpbmRJbmRleChwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhKSB7XG4gIHZhciBpID0gMCxcbiAgICAgIG5vZGUsXG4gICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcblxuICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZml0IGludG8gdXBkYXRlLlxuICAvLyBQdXQgYW55IG51bGwgbm9kZXMgaW50byBlbnRlci5cbiAgLy8gUHV0IGFueSByZW1haW5pbmcgZGF0YSBpbnRvIGVudGVyLlxuICBmb3IgKDsgaSA8IGRhdGFMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldO1xuICAgICAgdXBkYXRlW2ldID0gbm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGRvbuKAmXQgZml0IGludG8gZXhpdC5cbiAgZm9yICg7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJpbmRLZXkocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSwga2V5KSB7XG4gIHZhciBpLFxuICAgICAgbm9kZSxcbiAgICAgIG5vZGVCeUtleVZhbHVlID0gbmV3IE1hcCxcbiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLFxuICAgICAga2V5VmFsdWVzID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKSxcbiAgICAgIGtleVZhbHVlO1xuXG4gIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBub2RlLlxuICAvLyBJZiBtdWx0aXBsZSBub2RlcyBoYXZlIHRoZSBzYW1lIGtleSwgdGhlIGR1cGxpY2F0ZXMgYXJlIGFkZGVkIHRvIGV4aXQuXG4gIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAga2V5VmFsdWVzW2ldID0ga2V5VmFsdWUgPSBrZXkuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkgKyBcIlwiO1xuICAgICAgaWYgKG5vZGVCeUtleVZhbHVlLmhhcyhrZXlWYWx1ZSkpIHtcbiAgICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlQnlLZXlWYWx1ZS5zZXQoa2V5VmFsdWUsIG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBkYXR1bS5cbiAgLy8gSWYgdGhlcmUgYSBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGtleSwgam9pbiBhbmQgYWRkIGl0IHRvIHVwZGF0ZS5cbiAgLy8gSWYgdGhlcmUgaXMgbm90IChvciB0aGUga2V5IGlzIGEgZHVwbGljYXRlKSwgYWRkIGl0IHRvIGVudGVyLlxuICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7XG4gICAga2V5VmFsdWUgPSBrZXkuY2FsbChwYXJlbnQsIGRhdGFbaV0sIGksIGRhdGEpICsgXCJcIjtcbiAgICBpZiAobm9kZSA9IG5vZGVCeUtleVZhbHVlLmdldChrZXlWYWx1ZSkpIHtcbiAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7XG4gICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTtcbiAgICAgIG5vZGVCeUtleVZhbHVlLmRlbGV0ZShrZXlWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZShwYXJlbnQsIGRhdGFbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCBhbnkgcmVtYWluaW5nIG5vZGVzIHRoYXQgd2VyZSBub3QgYm91bmQgdG8gZGF0YSB0byBleGl0LlxuICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAobm9kZUJ5S2V5VmFsdWUuZ2V0KGtleVZhbHVlc1tpXSkgPT09IG5vZGUpKSB7XG4gICAgICBleGl0W2ldID0gbm9kZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGF0dW0obm9kZSkge1xuICByZXR1cm4gbm9kZS5fX2RhdGFfXztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBBcnJheS5mcm9tKHRoaXMsIGRhdHVtKTtcblxuICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkgOiBiaW5kSW5kZXgsXG4gICAgICBwYXJlbnRzID0gdGhpcy5fcGFyZW50cyxcbiAgICAgIGdyb3VwcyA9IHRoaXMuX2dyb3VwcztcblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHZhbHVlID0gY29uc3RhbnQodmFsdWUpO1xuXG4gIGZvciAodmFyIG0gPSBncm91cHMubGVuZ3RoLCB1cGRhdGUgPSBuZXcgQXJyYXkobSksIGVudGVyID0gbmV3IEFycmF5KG0pLCBleGl0ID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW2pdLFxuICAgICAgICBncm91cCA9IGdyb3Vwc1tqXSxcbiAgICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICAgIGRhdGEgPSBhcnJheWxpa2UodmFsdWUuY2FsbChwYXJlbnQsIHBhcmVudCAmJiBwYXJlbnQuX19kYXRhX18sIGosIHBhcmVudHMpKSxcbiAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLFxuICAgICAgICBlbnRlckdyb3VwID0gZW50ZXJbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksXG4gICAgICAgIHVwZGF0ZUdyb3VwID0gdXBkYXRlW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLFxuICAgICAgICBleGl0R3JvdXAgPSBleGl0W2pdID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKTtcblxuICAgIGJpbmQocGFyZW50LCBncm91cCwgZW50ZXJHcm91cCwgdXBkYXRlR3JvdXAsIGV4aXRHcm91cCwgZGF0YSwga2V5KTtcblxuICAgIC8vIE5vdyBjb25uZWN0IHRoZSBlbnRlciBub2RlcyB0byB0aGVpciBmb2xsb3dpbmcgdXBkYXRlIG5vZGUsIHN1Y2ggdGhhdFxuICAgIC8vIGFwcGVuZENoaWxkIGNhbiBpbnNlcnQgdGhlIG1hdGVyaWFsaXplZCBlbnRlciBub2RlIGJlZm9yZSB0aGlzIG5vZGUsXG4gICAgLy8gcmF0aGVyIHRoYW4gYXQgdGhlIGVuZCBvZiB0aGUgcGFyZW50IG5vZGUuXG4gICAgZm9yICh2YXIgaTAgPSAwLCBpMSA9IDAsIHByZXZpb3VzLCBuZXh0OyBpMCA8IGRhdGFMZW5ndGg7ICsraTApIHtcbiAgICAgIGlmIChwcmV2aW91cyA9IGVudGVyR3JvdXBbaTBdKSB7XG4gICAgICAgIGlmIChpMCA+PSBpMSkgaTEgPSBpMCArIDE7XG4gICAgICAgIHdoaWxlICghKG5leHQgPSB1cGRhdGVHcm91cFtpMV0pICYmICsraTEgPCBkYXRhTGVuZ3RoKTtcbiAgICAgICAgcHJldmlvdXMuX25leHQgPSBuZXh0IHx8IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlID0gbmV3IFNlbGVjdGlvbih1cGRhdGUsIHBhcmVudHMpO1xuICB1cGRhdGUuX2VudGVyID0gZW50ZXI7XG4gIHVwZGF0ZS5fZXhpdCA9IGV4aXQ7XG4gIHJldHVybiB1cGRhdGU7XG59XG5cbi8vIEdpdmVuIHNvbWUgZGF0YSwgdGhpcyByZXR1cm5zIGFuIGFycmF5LWxpa2UgdmlldyBvZiBpdDogYW4gb2JqZWN0IHRoYXRcbi8vIGV4cG9zZXMgYSBsZW5ndGggcHJvcGVydHkgYW5kIGFsbG93cyBudW1lcmljIGluZGV4aW5nLiBOb3RlIHRoYXQgdW5saWtlXG4vLyBzZWxlY3RBbGwsIHRoaXMgaXNu4oCZdCB3b3JyaWVkIGFib3V0IOKAnGxpdmXigJ0gY29sbGVjdGlvbnMgYmVjYXVzZSB0aGUgcmVzdWx0aW5nXG4vLyBhcnJheSB3aWxsIG9ubHkgYmUgdXNlZCBicmllZmx5IHdoaWxlIGRhdGEgaXMgYmVpbmcgYm91bmQuIChJdCBpcyBwb3NzaWJsZSB0b1xuLy8gY2F1c2UgdGhlIGRhdGEgdG8gY2hhbmdlIHdoaWxlIGl0ZXJhdGluZyBieSB1c2luZyBhIGtleSBmdW5jdGlvbiwgYnV0IHBsZWFzZVxuLy8gZG9u4oCZdDsgd2XigJlkIHJhdGhlciBhdm9pZCBhIGdyYXR1aXRvdXMgY29weS4pXG5mdW5jdGlvbiBhcnJheWxpa2UoZGF0YSkge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgXCJsZW5ndGhcIiBpbiBkYXRhXG4gICAgPyBkYXRhIC8vIEFycmF5LCBUeXBlZEFycmF5LCBOb2RlTGlzdCwgYXJyYXktbGlrZVxuICAgIDogQXJyYXkuZnJvbShkYXRhKTsgLy8gTWFwLCBTZXQsIGl0ZXJhYmxlLCBzdHJpbmcsIG9yIGFueXRoaW5nIGVsc2Vcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMucHJvcGVydHkoXCJfX2RhdGFfX1wiLCB2YWx1ZSlcbiAgICAgIDogdGhpcy5ub2RlKCkuX19kYXRhX187XG59XG4iLCJpbXBvcnQgZGVmYXVsdFZpZXcgZnJvbSBcIi4uL3dpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KG5vZGUsIHR5cGUsIHBhcmFtcykge1xuICB2YXIgd2luZG93ID0gZGVmYXVsdFZpZXcobm9kZSksXG4gICAgICBldmVudCA9IHdpbmRvdy5DdXN0b21FdmVudDtcblxuICBpZiAodHlwZW9mIGV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBldmVudCA9IG5ldyBldmVudCh0eXBlLCBwYXJhbXMpO1xuICB9IGVsc2Uge1xuICAgIGV2ZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIik7XG4gICAgaWYgKHBhcmFtcykgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSksIGV2ZW50LmRldGFpbCA9IHBhcmFtcy5kZXRhaWw7XG4gICAgZWxzZSBldmVudC5pbml0RXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgfVxuXG4gIG5vZGUuZGlzcGF0Y2hFdmVudChldmVudCk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoQ29uc3RhbnQodHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEZ1bmN0aW9uKHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHBhcmFtcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGRpc3BhdGNoRnVuY3Rpb25cbiAgICAgIDogZGlzcGF0Y2hDb25zdGFudCkodHlwZSwgcGFyYW1zKSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaykge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSBjYWxsYmFjay5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gIXRoaXMubm9kZSgpO1xufVxuIiwiaW1wb3J0IHNwYXJzZSBmcm9tIFwiLi9zcGFyc2UuanNcIjtcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZW50ZXIgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEVudGVyTm9kZShwYXJlbnQsIGRhdHVtKSB7XG4gIHRoaXMub3duZXJEb2N1bWVudCA9IHBhcmVudC5vd25lckRvY3VtZW50O1xuICB0aGlzLm5hbWVzcGFjZVVSSSA9IHBhcmVudC5uYW1lc3BhY2VVUkk7XG4gIHRoaXMuX25leHQgPSBudWxsO1xuICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gIHRoaXMuX19kYXRhX18gPSBkYXR1bTtcbn1cblxuRW50ZXJOb2RlLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEVudGVyTm9kZSxcbiAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKGNoaWxkKSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCB0aGlzLl9uZXh0KTsgfSxcbiAgaW5zZXJ0QmVmb3JlOiBmdW5jdGlvbihjaGlsZCwgbmV4dCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbmV4dCk7IH0sXG4gIHF1ZXJ5U2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7IH0sXG4gIHF1ZXJ5U2VsZWN0b3JBbGw6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7IH1cbn07XG4iLCJpbXBvcnQgc3BhcnNlIGZyb20gXCIuL3NwYXJzZS5qc1wiO1xuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9leGl0IHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBtYXRjaGVyIGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIGlmICh0eXBlb2YgbWF0Y2ggIT09IFwiZnVuY3Rpb25cIikgbWF0Y2ggPSBtYXRjaGVyKG1hdGNoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHtcbiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiZnVuY3Rpb24gaHRtbFJlbW92ZSgpIHtcbiAgdGhpcy5pbm5lckhUTUwgPSBcIlwiO1xufVxuXG5mdW5jdGlvbiBodG1sQ29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaW5uZXJIVE1MID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGh0bWxGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuaW5uZXJIVE1MID0gdiA9PSBudWxsID8gXCJcIiA6IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyBodG1sUmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBodG1sRnVuY3Rpb25cbiAgICAgICAgICA6IGh0bWxDb25zdGFudCkodmFsdWUpKVxuICAgICAgOiB0aGlzLm5vZGUoKS5pbm5lckhUTUw7XG59XG4iLCJpbXBvcnQgc2VsZWN0aW9uX3NlbGVjdCBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2VsZWN0QWxsIGZyb20gXCIuL3NlbGVjdEFsbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RDaGlsZCBmcm9tIFwiLi9zZWxlY3RDaGlsZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbiBmcm9tIFwiLi9zZWxlY3RDaGlsZHJlbi5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9maWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2RhdGEgZnJvbSBcIi4vZGF0YS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lbnRlciBmcm9tIFwiLi9lbnRlci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9leGl0IGZyb20gXCIuL2V4aXQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fam9pbiBmcm9tIFwiLi9qb2luLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX21lcmdlIGZyb20gXCIuL21lcmdlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX29yZGVyIGZyb20gXCIuL29yZGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NvcnQgZnJvbSBcIi4vc29ydC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9jYWxsIGZyb20gXCIuL2NhbGwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbm9kZXMgZnJvbSBcIi4vbm9kZXMuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbm9kZSBmcm9tIFwiLi9ub2RlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NpemUgZnJvbSBcIi4vc2l6ZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lbXB0eSBmcm9tIFwiLi9lbXB0eS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lYWNoIGZyb20gXCIuL2VhY2guanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fYXR0ciBmcm9tIFwiLi9hdHRyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3N0eWxlIGZyb20gXCIuL3N0eWxlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3Byb3BlcnR5IGZyb20gXCIuL3Byb3BlcnR5LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2NsYXNzZWQgZnJvbSBcIi4vY2xhc3NlZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl90ZXh0IGZyb20gXCIuL3RleHQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faHRtbCBmcm9tIFwiLi9odG1sLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3JhaXNlIGZyb20gXCIuL3JhaXNlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2xvd2VyIGZyb20gXCIuL2xvd2VyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2FwcGVuZCBmcm9tIFwiLi9hcHBlbmQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faW5zZXJ0IGZyb20gXCIuL2luc2VydC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9yZW1vdmUgZnJvbSBcIi4vcmVtb3ZlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2Nsb25lIGZyb20gXCIuL2Nsb25lLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2RhdHVtIGZyb20gXCIuL2RhdHVtLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX29uIGZyb20gXCIuL29uLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2Rpc3BhdGNoIGZyb20gXCIuL2Rpc3BhdGNoLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2l0ZXJhdG9yIGZyb20gXCIuL2l0ZXJhdG9yLmpzXCI7XG5cbmV4cG9ydCB2YXIgcm9vdCA9IFtudWxsXTtcblxuZXhwb3J0IGZ1bmN0aW9uIFNlbGVjdGlvbihncm91cHMsIHBhcmVudHMpIHtcbiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzO1xuICB0aGlzLl9wYXJlbnRzID0gcGFyZW50cztcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbihbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLCByb290KTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uX3NlbGVjdGlvbigpIHtcbiAgcmV0dXJuIHRoaXM7XG59XG5cblNlbGVjdGlvbi5wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogU2VsZWN0aW9uLFxuICBzZWxlY3Q6IHNlbGVjdGlvbl9zZWxlY3QsXG4gIHNlbGVjdEFsbDogc2VsZWN0aW9uX3NlbGVjdEFsbCxcbiAgc2VsZWN0Q2hpbGQ6IHNlbGVjdGlvbl9zZWxlY3RDaGlsZCxcbiAgc2VsZWN0Q2hpbGRyZW46IHNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbixcbiAgZmlsdGVyOiBzZWxlY3Rpb25fZmlsdGVyLFxuICBkYXRhOiBzZWxlY3Rpb25fZGF0YSxcbiAgZW50ZXI6IHNlbGVjdGlvbl9lbnRlcixcbiAgZXhpdDogc2VsZWN0aW9uX2V4aXQsXG4gIGpvaW46IHNlbGVjdGlvbl9qb2luLFxuICBtZXJnZTogc2VsZWN0aW9uX21lcmdlLFxuICBzZWxlY3Rpb246IHNlbGVjdGlvbl9zZWxlY3Rpb24sXG4gIG9yZGVyOiBzZWxlY3Rpb25fb3JkZXIsXG4gIHNvcnQ6IHNlbGVjdGlvbl9zb3J0LFxuICBjYWxsOiBzZWxlY3Rpb25fY2FsbCxcbiAgbm9kZXM6IHNlbGVjdGlvbl9ub2RlcyxcbiAgbm9kZTogc2VsZWN0aW9uX25vZGUsXG4gIHNpemU6IHNlbGVjdGlvbl9zaXplLFxuICBlbXB0eTogc2VsZWN0aW9uX2VtcHR5LFxuICBlYWNoOiBzZWxlY3Rpb25fZWFjaCxcbiAgYXR0cjogc2VsZWN0aW9uX2F0dHIsXG4gIHN0eWxlOiBzZWxlY3Rpb25fc3R5bGUsXG4gIHByb3BlcnR5OiBzZWxlY3Rpb25fcHJvcGVydHksXG4gIGNsYXNzZWQ6IHNlbGVjdGlvbl9jbGFzc2VkLFxuICB0ZXh0OiBzZWxlY3Rpb25fdGV4dCxcbiAgaHRtbDogc2VsZWN0aW9uX2h0bWwsXG4gIHJhaXNlOiBzZWxlY3Rpb25fcmFpc2UsXG4gIGxvd2VyOiBzZWxlY3Rpb25fbG93ZXIsXG4gIGFwcGVuZDogc2VsZWN0aW9uX2FwcGVuZCxcbiAgaW5zZXJ0OiBzZWxlY3Rpb25faW5zZXJ0LFxuICByZW1vdmU6IHNlbGVjdGlvbl9yZW1vdmUsXG4gIGNsb25lOiBzZWxlY3Rpb25fY2xvbmUsXG4gIGRhdHVtOiBzZWxlY3Rpb25fZGF0dW0sXG4gIG9uOiBzZWxlY3Rpb25fb24sXG4gIGRpc3BhdGNoOiBzZWxlY3Rpb25fZGlzcGF0Y2gsXG4gIFtTeW1ib2wuaXRlcmF0b3JdOiBzZWxlY3Rpb25faXRlcmF0b3Jcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHNlbGVjdGlvbjtcbiIsImltcG9ydCBjcmVhdG9yIGZyb20gXCIuLi9jcmVhdG9yLmpzXCI7XG5pbXBvcnQgc2VsZWN0b3IgZnJvbSBcIi4uL3NlbGVjdG9yLmpzXCI7XG5cbmZ1bmN0aW9uIGNvbnN0YW50TnVsbCgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIGJlZm9yZSkge1xuICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpLFxuICAgICAgc2VsZWN0ID0gYmVmb3JlID09IG51bGwgPyBjb25zdGFudE51bGwgOiB0eXBlb2YgYmVmb3JlID09PSBcImZ1bmN0aW9uXCIgPyBiZWZvcmUgOiBzZWxlY3RvcihiZWZvcmUpO1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBzZWxlY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCBudWxsKTtcbiAgfSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiooKSB7XG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB5aWVsZCBub2RlO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob25lbnRlciwgb251cGRhdGUsIG9uZXhpdCkge1xuICB2YXIgZW50ZXIgPSB0aGlzLmVudGVyKCksIHVwZGF0ZSA9IHRoaXMsIGV4aXQgPSB0aGlzLmV4aXQoKTtcbiAgaWYgKHR5cGVvZiBvbmVudGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBlbnRlciA9IG9uZW50ZXIoZW50ZXIpO1xuICAgIGlmIChlbnRlcikgZW50ZXIgPSBlbnRlci5zZWxlY3Rpb24oKTtcbiAgfSBlbHNlIHtcbiAgICBlbnRlciA9IGVudGVyLmFwcGVuZChvbmVudGVyICsgXCJcIik7XG4gIH1cbiAgaWYgKG9udXBkYXRlICE9IG51bGwpIHtcbiAgICB1cGRhdGUgPSBvbnVwZGF0ZSh1cGRhdGUpO1xuICAgIGlmICh1cGRhdGUpIHVwZGF0ZSA9IHVwZGF0ZS5zZWxlY3Rpb24oKTtcbiAgfVxuICBpZiAob25leGl0ID09IG51bGwpIGV4aXQucmVtb3ZlKCk7IGVsc2Ugb25leGl0KGV4aXQpO1xuICByZXR1cm4gZW50ZXIgJiYgdXBkYXRlID8gZW50ZXIubWVyZ2UodXBkYXRlKS5vcmRlcigpIDogdXBkYXRlO1xufVxuIiwiZnVuY3Rpb24gbG93ZXIoKSB7XG4gIGlmICh0aGlzLnByZXZpb3VzU2libGluZykgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLCB0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKGxvd2VyKTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb250ZXh0KSB7XG4gIHZhciBzZWxlY3Rpb24gPSBjb250ZXh0LnNlbGVjdGlvbiA/IGNvbnRleHQuc2VsZWN0aW9uKCkgOiBjb250ZXh0O1xuXG4gIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSBzZWxlY3Rpb24uX2dyb3VwcywgbTAgPSBncm91cHMwLmxlbmd0aCwgbTEgPSBncm91cHMxLmxlbmd0aCwgbSA9IE1hdGgubWluKG0wLCBtMSksIG1lcmdlcyA9IG5ldyBBcnJheShtMCksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwgbiA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7XG4gICAgICAgIG1lcmdlW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKDsgaiA8IG0wOyArK2opIHtcbiAgICBtZXJnZXNbal0gPSBncm91cHMwW2pdO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24obWVyZ2VzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICB2YXIgbm9kZSA9IGdyb3VwW2ldO1xuICAgICAgaWYgKG5vZGUpIHJldHVybiBub2RlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHRoaXMpO1xufVxuIiwiZnVuY3Rpb24gY29udGV4dExpc3RlbmVyKGxpc3RlbmVyKSB7XG4gIHJldHVybiBmdW5jdGlvbihldmVudCkge1xuICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQsIHRoaXMuX19kYXRhX18pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMpIHtcbiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XFxzKy8pLm1hcChmdW5jdGlvbih0KSB7XG4gICAgdmFyIG5hbWUgPSBcIlwiLCBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvblJlbW92ZSh0eXBlbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9uID0gdGhpcy5fX29uO1xuICAgIGlmICghb24pIHJldHVybjtcbiAgICBmb3IgKHZhciBqID0gMCwgaSA9IC0xLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7XG4gICAgICBpZiAobyA9IG9uW2pdLCAoIXR5cGVuYW1lLnR5cGUgfHwgby50eXBlID09PSB0eXBlbmFtZS50eXBlKSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5vcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uWysraV0gPSBvO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoKytpKSBvbi5sZW5ndGggPSBpO1xuICAgIGVsc2UgZGVsZXRlIHRoaXMuX19vbjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25BZGQodHlwZW5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb24sIG8sIGxpc3RlbmVyID0gY29udGV4dExpc3RlbmVyKHZhbHVlKTtcbiAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgICBpZiAoKG8gPSBvbltqXSkudHlwZSA9PT0gdHlwZW5hbWUudHlwZSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciA9IGxpc3RlbmVyLCBvLm9wdGlvbnMgPSBvcHRpb25zKTtcbiAgICAgICAgby52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0eXBlbmFtZS50eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgbyA9IHt0eXBlOiB0eXBlbmFtZS50eXBlLCBuYW1lOiB0eXBlbmFtZS5uYW1lLCB2YWx1ZTogdmFsdWUsIGxpc3RlbmVyOiBsaXN0ZW5lciwgb3B0aW9uczogb3B0aW9uc307XG4gICAgaWYgKCFvbikgdGhpcy5fX29uID0gW29dO1xuICAgIGVsc2Ugb24ucHVzaChvKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHlwZW5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciB0eXBlbmFtZXMgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArIFwiXCIpLCBpLCBuID0gdHlwZW5hbWVzLmxlbmd0aCwgdDtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgb24gPSB0aGlzLm5vZGUoKS5fX29uO1xuICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHtcbiAgICAgIGZvciAoaSA9IDAsIG8gPSBvbltqXTsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAoKHQgPSB0eXBlbmFtZXNbaV0pLnR5cGUgPT09IG8udHlwZSAmJiB0Lm5hbWUgPT09IG8ubmFtZSkge1xuICAgICAgICAgIHJldHVybiBvLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIG9uID0gdmFsdWUgPyBvbkFkZCA6IG9uUmVtb3ZlO1xuICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB0aGlzLmVhY2gob24odHlwZW5hbWVzW2ldLCB2YWx1ZSwgb3B0aW9ucykpO1xuICByZXR1cm4gdGhpcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IC0xLCBtID0gZ3JvdXBzLmxlbmd0aDsgKytqIDwgbTspIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IGdyb3VwLmxlbmd0aCAtIDEsIG5leHQgPSBncm91cFtpXSwgbm9kZTsgLS1pID49IDA7KSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIGlmIChuZXh0ICYmIG5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obmV4dCkgXiA0KSBuZXh0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHQpO1xuICAgICAgICBuZXh0ID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cbiIsImZ1bmN0aW9uIHByb3BlcnR5UmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGRlbGV0ZSB0aGlzW25hbWVdO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUNvbnN0YW50KG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzW25hbWVdID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5RnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSBkZWxldGUgdGhpc1tuYW1lXTtcbiAgICBlbHNlIHRoaXNbbmFtZV0gPSB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDFcbiAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyBwcm9wZXJ0eVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBwcm9wZXJ0eUZ1bmN0aW9uXG4gICAgICAgICAgOiBwcm9wZXJ0eUNvbnN0YW50KShuYW1lLCB2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpW25hbWVdO1xufVxuIiwiZnVuY3Rpb24gcmFpc2UoKSB7XG4gIGlmICh0aGlzLm5leHRTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKHJhaXNlKTtcbn1cbiIsImZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChyZW1vdmUpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2VsZWN0b3IgZnJvbSBcIi4uL3NlbGVjdG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7XG4gICAgICAgIGlmIChcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgYXJyYXkgZnJvbSBcIi4uL2FycmF5LmpzXCI7XG5pbXBvcnQgc2VsZWN0b3JBbGwgZnJvbSBcIi4uL3NlbGVjdG9yQWxsLmpzXCI7XG5cbmZ1bmN0aW9uIGFycmF5QWxsKHNlbGVjdCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGFycmF5KHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIGlmICh0eXBlb2Ygc2VsZWN0ID09PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IGFycmF5QWxsKHNlbGVjdCk7XG4gIGVsc2Ugc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzdWJncm91cHMucHVzaChzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCBwYXJlbnRzKTtcbn1cbiIsImltcG9ydCB7Y2hpbGRNYXRjaGVyfSBmcm9tIFwiLi4vbWF0Y2hlci5qc1wiO1xuXG52YXIgZmluZCA9IEFycmF5LnByb3RvdHlwZS5maW5kO1xuXG5mdW5jdGlvbiBjaGlsZEZpbmQobWF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmaW5kLmNhbGwodGhpcy5jaGlsZHJlbiwgbWF0Y2gpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjaGlsZEZpcnN0KCkge1xuICByZXR1cm4gdGhpcy5maXJzdEVsZW1lbnRDaGlsZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KG1hdGNoID09IG51bGwgPyBjaGlsZEZpcnN0XG4gICAgICA6IGNoaWxkRmluZCh0eXBlb2YgbWF0Y2ggPT09IFwiZnVuY3Rpb25cIiA/IG1hdGNoIDogY2hpbGRNYXRjaGVyKG1hdGNoKSkpO1xufVxuIiwiaW1wb3J0IHtjaGlsZE1hdGNoZXJ9IGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbnZhciBmaWx0ZXIgPSBBcnJheS5wcm90b3R5cGUuZmlsdGVyO1xuXG5mdW5jdGlvbiBjaGlsZHJlbigpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5jaGlsZHJlbik7XG59XG5cbmZ1bmN0aW9uIGNoaWxkcmVuRmlsdGVyKG1hdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZmlsdGVyLmNhbGwodGhpcy5jaGlsZHJlbiwgbWF0Y2gpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3RBbGwobWF0Y2ggPT0gbnVsbCA/IGNoaWxkcmVuXG4gICAgICA6IGNoaWxkcmVuRmlsdGVyKHR5cGVvZiBtYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgbGV0IHNpemUgPSAwO1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcykgKytzaXplOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHJldHVybiBzaXplO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbXBhcmUpIHtcbiAgaWYgKCFjb21wYXJlKSBjb21wYXJlID0gYXNjZW5kaW5nO1xuXG4gIGZ1bmN0aW9uIGNvbXBhcmVOb2RlKGEsIGIpIHtcbiAgICByZXR1cm4gYSAmJiBiID8gY29tcGFyZShhLl9fZGF0YV9fLCBiLl9fZGF0YV9fKSA6ICFhIC0gIWI7XG4gIH1cblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzb3J0Z3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzb3J0Z3JvdXAgPSBzb3J0Z3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzb3J0Z3JvdXBbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgICBzb3J0Z3JvdXAuc29ydChjb21wYXJlTm9kZSk7XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzb3J0Z3JvdXBzLCB0aGlzLl9wYXJlbnRzKS5vcmRlcigpO1xufVxuXG5mdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikge1xuICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih1cGRhdGUpIHtcbiAgcmV0dXJuIG5ldyBBcnJheSh1cGRhdGUubGVuZ3RoKTtcbn1cbiIsImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIHN0eWxlUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgICBlbHNlIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdiwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxXG4gICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgICAgICAgPyBzdHlsZVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICA/IHN0eWxlRnVuY3Rpb25cbiAgICAgICAgICAgIDogc3R5bGVDb25zdGFudCkobmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyBcIlwiIDogcHJpb3JpdHkpKVxuICAgICAgOiBzdHlsZVZhbHVlKHRoaXMubm9kZSgpLCBuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0eWxlVmFsdWUobm9kZSwgbmFtZSkge1xuICByZXR1cm4gbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpXG4gICAgICB8fCBkZWZhdWx0Vmlldyhub2RlKS5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSk7XG59XG4iLCJmdW5jdGlvbiB0ZXh0UmVtb3ZlKCkge1xuICB0aGlzLnRleHRDb250ZW50ID0gXCJcIjtcbn1cblxuZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IHRleHRSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHRleHRGdW5jdGlvblxuICAgICAgICAgIDogdGV4dENvbnN0YW50KSh2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpLnRleHRDb250ZW50O1xufVxuIiwiZnVuY3Rpb24gbm9uZSgpIHt9XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gbm9uZSA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICB9O1xufVxuIiwiZnVuY3Rpb24gZW1wdHkoKSB7XG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBlbXB0eSA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQpIHtcbiAgbGV0IHNvdXJjZUV2ZW50O1xuICB3aGlsZSAoc291cmNlRXZlbnQgPSBldmVudC5zb3VyY2VFdmVudCkgZXZlbnQgPSBzb3VyY2VFdmVudDtcbiAgcmV0dXJuIGV2ZW50O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSkge1xuICByZXR1cm4gKG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpIC8vIG5vZGUgaXMgYSBOb2RlXG4gICAgICB8fCAobm9kZS5kb2N1bWVudCAmJiBub2RlKSAvLyBub2RlIGlzIGEgV2luZG93XG4gICAgICB8fCBub2RlLmRlZmF1bHRWaWV3OyAvLyBub2RlIGlzIGEgRG9jdW1lbnRcbn1cbiIsImltcG9ydCB7VGltZXJ9IGZyb20gXCIuL3RpbWVyLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgZGVsYXkgPSBkZWxheSA9PSBudWxsID8gMCA6ICtkZWxheTtcbiAgdC5yZXN0YXJ0KGVsYXBzZWQgPT4ge1xuICAgIHQuc3RvcCgpO1xuICAgIGNhbGxiYWNrKGVsYXBzZWQgKyBkZWxheSk7XG4gIH0sIGRlbGF5LCB0aW1lKTtcbiAgcmV0dXJuIHQ7XG59XG4iLCJ2YXIgZnJhbWUgPSAwLCAvLyBpcyBhbiBhbmltYXRpb24gZnJhbWUgcGVuZGluZz9cbiAgICB0aW1lb3V0ID0gMCwgLy8gaXMgYSB0aW1lb3V0IHBlbmRpbmc/XG4gICAgaW50ZXJ2YWwgPSAwLCAvLyBhcmUgYW55IHRpbWVycyBhY3RpdmU/XG4gICAgcG9rZURlbGF5ID0gMTAwMCwgLy8gaG93IGZyZXF1ZW50bHkgd2UgY2hlY2sgZm9yIGNsb2NrIHNrZXdcbiAgICB0YXNrSGVhZCxcbiAgICB0YXNrVGFpbCxcbiAgICBjbG9ja0xhc3QgPSAwLFxuICAgIGNsb2NrTm93ID0gMCxcbiAgICBjbG9ja1NrZXcgPSAwLFxuICAgIGNsb2NrID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSBcIm9iamVjdFwiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZSxcbiAgICBzZXRGcmFtZSA9IHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogZnVuY3Rpb24oZikgeyBzZXRUaW1lb3V0KGYsIDE3KTsgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpO1xufVxuXG5mdW5jdGlvbiBjbGVhck5vdygpIHtcbiAgY2xvY2tOb3cgPSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVGltZXIoKSB7XG4gIHRoaXMuX2NhbGwgPVxuICB0aGlzLl90aW1lID1cbiAgdGhpcy5fbmV4dCA9IG51bGw7XG59XG5cblRpbWVyLnByb3RvdHlwZSA9IHRpbWVyLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRpbWVyLFxuICByZXN0YXJ0OiBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgICB0aW1lID0gKHRpbWUgPT0gbnVsbCA/IG5vdygpIDogK3RpbWUpICsgKGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5KTtcbiAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwgIT09IHRoaXMpIHtcbiAgICAgIGlmICh0YXNrVGFpbCkgdGFza1RhaWwuX25leHQgPSB0aGlzO1xuICAgICAgZWxzZSB0YXNrSGVhZCA9IHRoaXM7XG4gICAgICB0YXNrVGFpbCA9IHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2NhbGwgPSBjYWxsYmFjaztcbiAgICB0aGlzLl90aW1lID0gdGltZTtcbiAgICBzbGVlcCgpO1xuICB9LFxuICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fY2FsbCkge1xuICAgICAgdGhpcy5fY2FsbCA9IG51bGw7XG4gICAgICB0aGlzLl90aW1lID0gSW5maW5pdHk7XG4gICAgICBzbGVlcCgpO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGltZXJGbHVzaCgpIHtcbiAgbm93KCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lLCBpZiBub3QgYWxyZWFkeSBzZXQuXG4gICsrZnJhbWU7IC8vIFByZXRlbmQgd2XigJl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVu4oCZdCBhbHJlYWR5LlxuICB2YXIgdCA9IHRhc2tIZWFkLCBlO1xuICB3aGlsZSAodCkge1xuICAgIGlmICgoZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKHVuZGVmaW5lZCwgZSk7XG4gICAgdCA9IHQuX25leHQ7XG4gIH1cbiAgLS1mcmFtZTtcbn1cblxuZnVuY3Rpb24gd2FrZSgpIHtcbiAgY2xvY2tOb3cgPSAoY2xvY2tMYXN0ID0gY2xvY2subm93KCkpICsgY2xvY2tTa2V3O1xuICBmcmFtZSA9IHRpbWVvdXQgPSAwO1xuICB0cnkge1xuICAgIHRpbWVyRmx1c2goKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcmFtZSA9IDA7XG4gICAgbmFwKCk7XG4gICAgY2xvY2tOb3cgPSAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBva2UoKSB7XG4gIHZhciBub3cgPSBjbG9jay5ub3coKSwgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7XG4gIGlmIChkZWxheSA+IHBva2VEZWxheSkgY2xvY2tTa2V3IC09IGRlbGF5LCBjbG9ja0xhc3QgPSBub3c7XG59XG5cbmZ1bmN0aW9uIG5hcCgpIHtcbiAgdmFyIHQwLCB0MSA9IHRhc2tIZWFkLCB0MiwgdGltZSA9IEluZmluaXR5O1xuICB3aGlsZSAodDEpIHtcbiAgICBpZiAodDEuX2NhbGwpIHtcbiAgICAgIGlmICh0aW1lID4gdDEuX3RpbWUpIHRpbWUgPSB0MS5fdGltZTtcbiAgICAgIHQwID0gdDEsIHQxID0gdDEuX25leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHQyID0gdDEuX25leHQsIHQxLl9uZXh0ID0gbnVsbDtcbiAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjtcbiAgICB9XG4gIH1cbiAgdGFza1RhaWwgPSB0MDtcbiAgc2xlZXAodGltZSk7XG59XG5cbmZ1bmN0aW9uIHNsZWVwKHRpbWUpIHtcbiAgaWYgKGZyYW1lKSByZXR1cm47IC8vIFNvb25lc3QgYWxhcm0gYWxyZWFkeSBzZXQsIG9yIHdpbGwgYmUuXG4gIGlmICh0aW1lb3V0KSB0aW1lb3V0ID0gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB2YXIgZGVsYXkgPSB0aW1lIC0gY2xvY2tOb3c7IC8vIFN0cmljdGx5IGxlc3MgdGhhbiBpZiB3ZSByZWNvbXB1dGVkIGNsb2NrTm93LlxuICBpZiAoZGVsYXkgPiAyNCkge1xuICAgIGlmICh0aW1lIDwgSW5maW5pdHkpIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHdha2UsIHRpbWUgLSBjbG9jay5ub3coKSAtIGNsb2NrU2tldyk7XG4gICAgaWYgKGludGVydmFsKSBpbnRlcnZhbCA9IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICB9IGVsc2Uge1xuICAgIGlmICghaW50ZXJ2YWwpIGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpLCBpbnRlcnZhbCA9IHNldEludGVydmFsKHBva2UsIHBva2VEZWxheSk7XG4gICAgZnJhbWUgPSAxLCBzZXRGcmFtZSh3YWtlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi90cmFuc2l0aW9uL2luZGV4LmpzXCI7XG5pbXBvcnQge1NDSEVEVUxFRH0gZnJvbSBcIi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuXG52YXIgcm9vdCA9IFtudWxsXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgbmFtZSkge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sXG4gICAgICBzY2hlZHVsZSxcbiAgICAgIGk7XG5cbiAgaWYgKHNjaGVkdWxlcykge1xuICAgIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG4gICAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgICAgaWYgKChzY2hlZHVsZSA9IHNjaGVkdWxlc1tpXSkuc3RhdGUgPiBTQ0hFRFVMRUQgJiYgc2NoZWR1bGUubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24oW1tub2RlXV0sIHJvb3QsIG5hbWUsICtpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsImltcG9ydCBcIi4vc2VsZWN0aW9uL2luZGV4LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgdHJhbnNpdGlvbn0gZnJvbSBcIi4vdHJhbnNpdGlvbi9pbmRleC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGFjdGl2ZX0gZnJvbSBcIi4vYWN0aXZlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJydXB0fSBmcm9tIFwiLi9pbnRlcnJ1cHQuanNcIjtcbiIsImltcG9ydCB7U1RBUlRJTkcsIEVORElORywgRU5ERUR9IGZyb20gXCIuL3RyYW5zaXRpb24vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgbmFtZSkge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sXG4gICAgICBzY2hlZHVsZSxcbiAgICAgIGFjdGl2ZSxcbiAgICAgIGVtcHR5ID0gdHJ1ZSxcbiAgICAgIGk7XG5cbiAgaWYgKCFzY2hlZHVsZXMpIHJldHVybjtcblxuICBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyBcIlwiO1xuXG4gIGZvciAoaSBpbiBzY2hlZHVsZXMpIHtcbiAgICBpZiAoKHNjaGVkdWxlID0gc2NoZWR1bGVzW2ldKS5uYW1lICE9PSBuYW1lKSB7IGVtcHR5ID0gZmFsc2U7IGNvbnRpbnVlOyB9XG4gICAgYWN0aXZlID0gc2NoZWR1bGUuc3RhdGUgPiBTVEFSVElORyAmJiBzY2hlZHVsZS5zdGF0ZSA8IEVORElORztcbiAgICBzY2hlZHVsZS5zdGF0ZSA9IEVOREVEO1xuICAgIHNjaGVkdWxlLnRpbWVyLnN0b3AoKTtcbiAgICBzY2hlZHVsZS5vbi5jYWxsKGFjdGl2ZSA/IFwiaW50ZXJydXB0XCIgOiBcImNhbmNlbFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzY2hlZHVsZS5pbmRleCwgc2NoZWR1bGUuZ3JvdXApO1xuICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gIH1cblxuICBpZiAoZW1wdHkpIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjtcbn1cbiIsImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ludGVycnVwdCBmcm9tIFwiLi9pbnRlcnJ1cHQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uLmpzXCI7XG5cbnNlbGVjdGlvbi5wcm90b3R5cGUuaW50ZXJydXB0ID0gc2VsZWN0aW9uX2ludGVycnVwdDtcbnNlbGVjdGlvbi5wcm90b3R5cGUudHJhbnNpdGlvbiA9IHNlbGVjdGlvbl90cmFuc2l0aW9uO1xuIiwiaW1wb3J0IGludGVycnVwdCBmcm9tIFwiLi4vaW50ZXJydXB0LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcbiAgICBpbnRlcnJ1cHQodGhpcywgbmFtZSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9uLCBuZXdJZH0gZnJvbSBcIi4uL3RyYW5zaXRpb24vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSBmcm9tIFwiLi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuaW1wb3J0IHtlYXNlQ3ViaWNJbk91dH0gZnJvbSBcImQzLWVhc2VcIjtcbmltcG9ydCB7bm93fSBmcm9tIFwiZDMtdGltZXJcIjtcblxudmFyIGRlZmF1bHRUaW1pbmcgPSB7XG4gIHRpbWU6IG51bGwsIC8vIFNldCBvbiB1c2UuXG4gIGRlbGF5OiAwLFxuICBkdXJhdGlvbjogMjUwLFxuICBlYXNlOiBlYXNlQ3ViaWNJbk91dFxufTtcblxuZnVuY3Rpb24gaW5oZXJpdChub2RlLCBpZCkge1xuICB2YXIgdGltaW5nO1xuICB3aGlsZSAoISh0aW1pbmcgPSBub2RlLl9fdHJhbnNpdGlvbikgfHwgISh0aW1pbmcgPSB0aW1pbmdbaWRdKSkge1xuICAgIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHRyYW5zaXRpb24gJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aW1pbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGlkLFxuICAgICAgdGltaW5nO1xuXG4gIGlmIChuYW1lIGluc3RhbmNlb2YgVHJhbnNpdGlvbikge1xuICAgIGlkID0gbmFtZS5faWQsIG5hbWUgPSBuYW1lLl9uYW1lO1xuICB9IGVsc2Uge1xuICAgIGlkID0gbmV3SWQoKSwgKHRpbWluZyA9IGRlZmF1bHRUaW1pbmcpLnRpbWUgPSBub3coKSwgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkLCBpLCBncm91cCwgdGltaW5nIHx8IGluaGVyaXQobm9kZSwgaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCJpbXBvcnQge2ludGVycG9sYXRlVHJhbnNmb3JtU3ZnIGFzIGludGVycG9sYXRlVHJhbnNmb3JtfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7bmFtZXNwYWNlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgaW50ZXJwb2xhdGUgZnJvbSBcIi4vaW50ZXJwb2xhdGUuanNcIjtcblxuZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwgc3RyaW5nMTtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKSwgaSA9IGZ1bGxuYW1lID09PSBcInRyYW5zZm9ybVwiID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm0gOiBpbnRlcnBvbGF0ZTtcbiAgcmV0dXJuIHRoaXMuYXR0clR3ZWVuKG5hbWUsIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKShmdWxsbmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCBcImF0dHIuXCIgKyBuYW1lLCB2YWx1ZSkpXG4gICAgICA6IHZhbHVlID09IG51bGwgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKShmdWxsbmFtZSlcbiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKGZ1bGxuYW1lLCBpLCB2YWx1ZSkpO1xufVxuIiwiaW1wb3J0IHtuYW1lc3BhY2V9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxuZnVuY3Rpb24gYXR0ckludGVycG9sYXRlKG5hbWUsIGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCBpLmNhbGwodGhpcywgdCkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCBpLmNhbGwodGhpcywgdCkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyVHdlZW5OUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmZ1bmN0aW9uIGF0dHJUd2VlbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIGF0dHJJbnRlcnBvbGF0ZShuYW1lLCBpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGtleSA9IFwiYXR0ci5cIiArIG5hbWU7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIChmdWxsbmFtZS5sb2NhbCA/IGF0dHJUd2Vlbk5TIDogYXR0clR3ZWVuKShmdWxsbmFtZSwgdmFsdWUpKTtcbn1cbiIsImltcG9ydCB7Z2V0LCBpbml0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBkZWxheUZ1bmN0aW9uKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVsYXlDb25zdGFudChpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHtcbiAgICBpbml0KHRoaXMsIGlkKS5kZWxheSA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBkZWxheUZ1bmN0aW9uXG4gICAgICAgICAgOiBkZWxheUNvbnN0YW50KShpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5kZWxheTtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGR1cmF0aW9uRnVuY3Rpb24oaWQsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGR1cmF0aW9uQ29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBkdXJhdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgOiBkdXJhdGlvbkNvbnN0YW50KShpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5kdXJhdGlvbjtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGVhc2VDb25zdGFudChpZCwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmVhc2UgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKGVhc2VDb25zdGFudChpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5lYXNlO1xufVxuIiwiaW1wb3J0IHtzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGVhc2VWYXJ5aW5nKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh0eXBlb2YgdiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gICAgc2V0KHRoaXMsIGlkKS5lYXNlID0gdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLmVhY2goZWFzZVZhcnlpbmcodGhpcy5faWQsIHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBvbjAsIG9uMSwgdGhhdCA9IHRoaXMsIGlkID0gdGhhdC5faWQsIHNpemUgPSB0aGF0LnNpemUoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciBjYW5jZWwgPSB7dmFsdWU6IHJlamVjdH0sXG4gICAgICAgIGVuZCA9IHt2YWx1ZTogZnVuY3Rpb24oKSB7IGlmICgtLXNpemUgPT09IDApIHJlc29sdmUoKTsgfX07XG5cbiAgICB0aGF0LmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICAgIG9uID0gc2NoZWR1bGUub247XG5cbiAgICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgICBpZiAob24gIT09IG9uMCkge1xuICAgICAgICBvbjEgPSAob24wID0gb24pLmNvcHkoKTtcbiAgICAgICAgb24xLl8uY2FuY2VsLnB1c2goY2FuY2VsKTtcbiAgICAgICAgb24xLl8uaW50ZXJydXB0LnB1c2goY2FuY2VsKTtcbiAgICAgICAgb24xLl8uZW5kLnB1c2goZW5kKTtcbiAgICAgIH1cblxuICAgICAgc2NoZWR1bGUub24gPSBvbjE7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgc2VsZWN0aW9uIHdhcyBlbXB0eSwgcmVzb2x2ZSBlbmQgaW1tZWRpYXRlbHlcbiAgICBpZiAoc2l6ZSA9PT0gMCkgcmVzb2x2ZSgpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7bWF0Y2hlcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICBpZiAodHlwZW9mIG1hdGNoICE9PSBcImZ1bmN0aW9uXCIpIG1hdGNoID0gbWF0Y2hlcihtYXRjaCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7XG4gICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB0cmFuc2l0aW9uX2F0dHIgZnJvbSBcIi4vYXR0ci5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fYXR0clR3ZWVuIGZyb20gXCIuL2F0dHJUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZGVsYXkgZnJvbSBcIi4vZGVsYXkuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2R1cmF0aW9uIGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lYXNlIGZyb20gXCIuL2Vhc2UuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nIGZyb20gXCIuL2Vhc2VWYXJ5aW5nLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9maWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9tZXJnZSBmcm9tIFwiLi9tZXJnZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fb24gZnJvbSBcIi4vb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3JlbW92ZSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdCBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdEFsbCBmcm9tIFwiLi9zZWxlY3RBbGwuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdGlvbiBmcm9tIFwiLi9zZWxlY3Rpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3N0eWxlIGZyb20gXCIuL3N0eWxlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zdHlsZVR3ZWVuIGZyb20gXCIuL3N0eWxlVHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3RleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdGV4dFR3ZWVuIGZyb20gXCIuL3RleHRUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90d2VlbiBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZW5kIGZyb20gXCIuL2VuZC5qc1wiO1xuXG52YXIgaWQgPSAwO1xuXG5leHBvcnQgZnVuY3Rpb24gVHJhbnNpdGlvbihncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKSB7XG4gIHRoaXMuX2dyb3VwcyA9IGdyb3VwcztcbiAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7XG4gIHRoaXMuX25hbWUgPSBuYW1lO1xuICB0aGlzLl9pZCA9IGlkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2l0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHNlbGVjdGlvbigpLnRyYW5zaXRpb24obmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdJZCgpIHtcbiAgcmV0dXJuICsraWQ7XG59XG5cbnZhciBzZWxlY3Rpb25fcHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZTtcblxuVHJhbnNpdGlvbi5wcm90b3R5cGUgPSB0cmFuc2l0aW9uLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zaXRpb24sXG4gIHNlbGVjdDogdHJhbnNpdGlvbl9zZWxlY3QsXG4gIHNlbGVjdEFsbDogdHJhbnNpdGlvbl9zZWxlY3RBbGwsXG4gIHNlbGVjdENoaWxkOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNlbGVjdENoaWxkLFxuICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3Byb3RvdHlwZS5zZWxlY3RDaGlsZHJlbixcbiAgZmlsdGVyOiB0cmFuc2l0aW9uX2ZpbHRlcixcbiAgbWVyZ2U6IHRyYW5zaXRpb25fbWVyZ2UsXG4gIHNlbGVjdGlvbjogdHJhbnNpdGlvbl9zZWxlY3Rpb24sXG4gIHRyYW5zaXRpb246IHRyYW5zaXRpb25fdHJhbnNpdGlvbixcbiAgY2FsbDogc2VsZWN0aW9uX3Byb3RvdHlwZS5jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlcyxcbiAgbm9kZTogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlLFxuICBzaXplOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fcHJvdG90eXBlLmVtcHR5LFxuICBlYWNoOiBzZWxlY3Rpb25fcHJvdG90eXBlLmVhY2gsXG4gIG9uOiB0cmFuc2l0aW9uX29uLFxuICBhdHRyOiB0cmFuc2l0aW9uX2F0dHIsXG4gIGF0dHJUd2VlbjogdHJhbnNpdGlvbl9hdHRyVHdlZW4sXG4gIHN0eWxlOiB0cmFuc2l0aW9uX3N0eWxlLFxuICBzdHlsZVR3ZWVuOiB0cmFuc2l0aW9uX3N0eWxlVHdlZW4sXG4gIHRleHQ6IHRyYW5zaXRpb25fdGV4dCxcbiAgdGV4dFR3ZWVuOiB0cmFuc2l0aW9uX3RleHRUd2VlbixcbiAgcmVtb3ZlOiB0cmFuc2l0aW9uX3JlbW92ZSxcbiAgdHdlZW46IHRyYW5zaXRpb25fdHdlZW4sXG4gIGRlbGF5OiB0cmFuc2l0aW9uX2RlbGF5LFxuICBkdXJhdGlvbjogdHJhbnNpdGlvbl9kdXJhdGlvbixcbiAgZWFzZTogdHJhbnNpdGlvbl9lYXNlLFxuICBlYXNlVmFyeWluZzogdHJhbnNpdGlvbl9lYXNlVmFyeWluZyxcbiAgZW5kOiB0cmFuc2l0aW9uX2VuZCxcbiAgW1N5bWJvbC5pdGVyYXRvcl06IHNlbGVjdGlvbl9wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXVxufTtcbiIsImltcG9ydCB7Y29sb3J9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZU51bWJlciwgaW50ZXJwb2xhdGVSZ2IsIGludGVycG9sYXRlU3RyaW5nfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgYztcbiAgcmV0dXJuICh0eXBlb2YgYiA9PT0gXCJudW1iZXJcIiA/IGludGVycG9sYXRlTnVtYmVyXG4gICAgICA6IGIgaW5zdGFuY2VvZiBjb2xvciA/IGludGVycG9sYXRlUmdiXG4gICAgICA6IChjID0gY29sb3IoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYilcbiAgICAgIDogaW50ZXJwb2xhdGVTdHJpbmcpKGEsIGIpO1xufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0cmFuc2l0aW9uKSB7XG4gIGlmICh0cmFuc2l0aW9uLl9pZCAhPT0gdGhpcy5faWQpIHRocm93IG5ldyBFcnJvcjtcblxuICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gdHJhbnNpdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHtcbiAgICAgICAgbWVyZ2VbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBqIDwgbTA7ICsraikge1xuICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24obWVyZ2VzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7XG59XG4iLCJpbXBvcnQge2dldCwgc2V0LCBpbml0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBzdGFydChuYW1lKSB7XG4gIHJldHVybiAobmFtZSArIFwiXCIpLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykuZXZlcnkoZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICByZXR1cm4gIXQgfHwgdCA9PT0gXCJzdGFydFwiO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpIHtcbiAgdmFyIG9uMCwgb24xLCBzaXQgPSBzdGFydChuYW1lKSA/IGluaXQgOiBzZXQ7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzaXQodGhpcywgaWQpLFxuICAgICAgICBvbiA9IHNjaGVkdWxlLm9uO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmIChvbiAhPT0gb24wKSAob24xID0gKG9uMCA9IG9uKS5jb3B5KCkpLm9uKG5hbWUsIGxpc3RlbmVyKTtcblxuICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCBsaXN0ZW5lcikge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDJcbiAgICAgID8gZ2V0KHRoaXMubm9kZSgpLCBpZCkub24ub24obmFtZSlcbiAgICAgIDogdGhpcy5lYWNoKG9uRnVuY3Rpb24oaWQsIG5hbWUsIGxpc3RlbmVyKSk7XG59XG4iLCJmdW5jdGlvbiByZW1vdmVGdW5jdGlvbihpZCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgICBmb3IgKHZhciBpIGluIHRoaXMuX190cmFuc2l0aW9uKSBpZiAoK2kgIT09IGlkKSByZXR1cm47XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMub24oXCJlbmQucmVtb3ZlXCIsIHJlbW92ZUZ1bmN0aW9uKHRoaXMuX2lkKSk7XG59XG4iLCJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7dGltZXIsIHRpbWVvdXR9IGZyb20gXCJkMy10aW1lclwiO1xuXG52YXIgZW1wdHlPbiA9IGRpc3BhdGNoKFwic3RhcnRcIiwgXCJlbmRcIiwgXCJjYW5jZWxcIiwgXCJpbnRlcnJ1cHRcIik7XG52YXIgZW1wdHlUd2VlbiA9IFtdO1xuXG5leHBvcnQgdmFyIENSRUFURUQgPSAwO1xuZXhwb3J0IHZhciBTQ0hFRFVMRUQgPSAxO1xuZXhwb3J0IHZhciBTVEFSVElORyA9IDI7XG5leHBvcnQgdmFyIFNUQVJURUQgPSAzO1xuZXhwb3J0IHZhciBSVU5OSU5HID0gNDtcbmV4cG9ydCB2YXIgRU5ESU5HID0gNTtcbmV4cG9ydCB2YXIgRU5ERUQgPSA2O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lLCBpZCwgaW5kZXgsIGdyb3VwLCB0aW1pbmcpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uO1xuICBpZiAoIXNjaGVkdWxlcykgbm9kZS5fX3RyYW5zaXRpb24gPSB7fTtcbiAgZWxzZSBpZiAoaWQgaW4gc2NoZWR1bGVzKSByZXR1cm47XG4gIGNyZWF0ZShub2RlLCBpZCwge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgaW5kZXg6IGluZGV4LCAvLyBGb3IgY29udGV4dCBkdXJpbmcgY2FsbGJhY2suXG4gICAgZ3JvdXA6IGdyb3VwLCAvLyBGb3IgY29udGV4dCBkdXJpbmcgY2FsbGJhY2suXG4gICAgb246IGVtcHR5T24sXG4gICAgdHdlZW46IGVtcHR5VHdlZW4sXG4gICAgdGltZTogdGltaW5nLnRpbWUsXG4gICAgZGVsYXk6IHRpbWluZy5kZWxheSxcbiAgICBkdXJhdGlvbjogdGltaW5nLmR1cmF0aW9uLFxuICAgIGVhc2U6IHRpbWluZy5lYXNlLFxuICAgIHRpbWVyOiBudWxsLFxuICAgIHN0YXRlOiBDUkVBVEVEXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBnZXQobm9kZSwgaWQpO1xuICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBDUkVBVEVEKSB0aHJvdyBuZXcgRXJyb3IoXCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWRcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBnZXQobm9kZSwgaWQpO1xuICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBTVEFSVEVEKSB0aHJvdyBuZXcgRXJyb3IoXCJ0b28gbGF0ZTsgYWxyZWFkeSBydW5uaW5nXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gbm9kZS5fX3RyYW5zaXRpb247XG4gIGlmICghc2NoZWR1bGUgfHwgIShzY2hlZHVsZSA9IHNjaGVkdWxlW2lkXSkpIHRocm93IG5ldyBFcnJvcihcInRyYW5zaXRpb24gbm90IGZvdW5kXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZShub2RlLCBpZCwgc2VsZikge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sXG4gICAgICB0d2VlbjtcblxuICAvLyBJbml0aWFsaXplIHRoZSBzZWxmIHRpbWVyIHdoZW4gdGhlIHRyYW5zaXRpb24gaXMgY3JlYXRlZC5cbiAgLy8gTm90ZSB0aGUgYWN0dWFsIGRlbGF5IGlzIG5vdCBrbm93biB1bnRpbCB0aGUgZmlyc3QgY2FsbGJhY2shXG4gIHNjaGVkdWxlc1tpZF0gPSBzZWxmO1xuICBzZWxmLnRpbWVyID0gdGltZXIoc2NoZWR1bGUsIDAsIHNlbGYudGltZSk7XG5cbiAgZnVuY3Rpb24gc2NoZWR1bGUoZWxhcHNlZCkge1xuICAgIHNlbGYuc3RhdGUgPSBTQ0hFRFVMRUQ7XG4gICAgc2VsZi50aW1lci5yZXN0YXJ0KHN0YXJ0LCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpO1xuXG4gICAgLy8gSWYgdGhlIGVsYXBzZWQgZGVsYXkgaXMgbGVzcyB0aGFuIG91ciBmaXJzdCBzbGVlcCwgc3RhcnQgaW1tZWRpYXRlbHkuXG4gICAgaWYgKHNlbGYuZGVsYXkgPD0gZWxhcHNlZCkgc3RhcnQoZWxhcHNlZCAtIHNlbGYuZGVsYXkpO1xuICB9XG5cbiAgZnVuY3Rpb24gc3RhcnQoZWxhcHNlZCkge1xuICAgIHZhciBpLCBqLCBuLCBvO1xuXG4gICAgLy8gSWYgdGhlIHN0YXRlIGlzIG5vdCBTQ0hFRFVMRUQsIHRoZW4gd2UgcHJldmlvdXNseSBlcnJvcmVkIG9uIHN0YXJ0LlxuICAgIGlmIChzZWxmLnN0YXRlICE9PSBTQ0hFRFVMRUQpIHJldHVybiBzdG9wKCk7XG5cbiAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7XG4gICAgICBvID0gc2NoZWR1bGVzW2ldO1xuICAgICAgaWYgKG8ubmFtZSAhPT0gc2VsZi5uYW1lKSBjb250aW51ZTtcblxuICAgICAgLy8gV2hpbGUgdGhpcyBlbGVtZW50IGFscmVhZHkgaGFzIGEgc3RhcnRpbmcgdHJhbnNpdGlvbiBkdXJpbmcgdGhpcyBmcmFtZSxcbiAgICAgIC8vIGRlZmVyIHN0YXJ0aW5nIGFuIGludGVycnVwdGluZyB0cmFuc2l0aW9uIHVudGlsIHRoYXQgdHJhbnNpdGlvbiBoYXMgYVxuICAgICAgLy8gY2hhbmNlIHRvIHRpY2sgKGFuZCBwb3NzaWJseSBlbmQpOyBzZWUgZDMvZDMtdHJhbnNpdGlvbiM1NCFcbiAgICAgIGlmIChvLnN0YXRlID09PSBTVEFSVEVEKSByZXR1cm4gdGltZW91dChzdGFydCk7XG5cbiAgICAgIC8vIEludGVycnVwdCB0aGUgYWN0aXZlIHRyYW5zaXRpb24sIGlmIGFueS5cbiAgICAgIGlmIChvLnN0YXRlID09PSBSVU5OSU5HKSB7XG4gICAgICAgIG8uc3RhdGUgPSBFTkRFRDtcbiAgICAgICAgby50aW1lci5zdG9wKCk7XG4gICAgICAgIG8ub24uY2FsbChcImludGVycnVwdFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTtcbiAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FuY2VsIGFueSBwcmUtZW1wdGVkIHRyYW5zaXRpb25zLlxuICAgICAgZWxzZSBpZiAoK2kgPCBpZCkge1xuICAgICAgICBvLnN0YXRlID0gRU5ERUQ7XG4gICAgICAgIG8udGltZXIuc3RvcCgpO1xuICAgICAgICBvLm9uLmNhbGwoXCJjYW5jZWxcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgby5pbmRleCwgby5ncm91cCk7XG4gICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVmZXIgdGhlIGZpcnN0IHRpY2sgdG8gZW5kIG9mIHRoZSBjdXJyZW50IGZyYW1lOyBzZWUgZDMvZDMjMTU3Ni5cbiAgICAvLyBOb3RlIHRoZSB0cmFuc2l0aW9uIG1heSBiZSBjYW5jZWxlZCBhZnRlciBzdGFydCBhbmQgYmVmb3JlIHRoZSBmaXJzdCB0aWNrIVxuICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIHNjaGVkdWxlZCBiZWZvcmUgdGhlIHN0YXJ0IGV2ZW50OyBzZWUgZDMvZDMtdHJhbnNpdGlvbiMxNiFcbiAgICAvLyBBc3N1bWluZyB0aGlzIGlzIHN1Y2Nlc3NmdWwsIHN1YnNlcXVlbnQgY2FsbGJhY2tzIGdvIHN0cmFpZ2h0IHRvIHRpY2suXG4gICAgdGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChzZWxmLnN0YXRlID09PSBTVEFSVEVEKSB7XG4gICAgICAgIHNlbGYuc3RhdGUgPSBSVU5OSU5HO1xuICAgICAgICBzZWxmLnRpbWVyLnJlc3RhcnQodGljaywgc2VsZi5kZWxheSwgc2VsZi50aW1lKTtcbiAgICAgICAgdGljayhlbGFwc2VkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIERpc3BhdGNoIHRoZSBzdGFydCBldmVudC5cbiAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgdHdlZW4gYXJlIGluaXRpYWxpemVkLlxuICAgIHNlbGYuc3RhdGUgPSBTVEFSVElORztcbiAgICBzZWxmLm9uLmNhbGwoXCJzdGFydFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTtcbiAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gU1RBUlRJTkcpIHJldHVybjsgLy8gaW50ZXJydXB0ZWRcbiAgICBzZWxmLnN0YXRlID0gU1RBUlRFRDtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIHR3ZWVuLCBkZWxldGluZyBudWxsIHR3ZWVuLlxuICAgIHR3ZWVuID0gbmV3IEFycmF5KG4gPSBzZWxmLnR3ZWVuLmxlbmd0aCk7XG4gICAgZm9yIChpID0gMCwgaiA9IC0xOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobyA9IHNlbGYudHdlZW5baV0udmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKSkge1xuICAgICAgICB0d2VlblsrK2pdID0gbztcbiAgICAgIH1cbiAgICB9XG4gICAgdHdlZW4ubGVuZ3RoID0gaiArIDE7XG4gIH1cblxuICBmdW5jdGlvbiB0aWNrKGVsYXBzZWQpIHtcbiAgICB2YXIgdCA9IGVsYXBzZWQgPCBzZWxmLmR1cmF0aW9uID8gc2VsZi5lYXNlLmNhbGwobnVsbCwgZWxhcHNlZCAvIHNlbGYuZHVyYXRpb24pIDogKHNlbGYudGltZXIucmVzdGFydChzdG9wKSwgc2VsZi5zdGF0ZSA9IEVORElORywgMSksXG4gICAgICAgIGkgPSAtMSxcbiAgICAgICAgbiA9IHR3ZWVuLmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICB0d2VlbltpXS5jYWxsKG5vZGUsIHQpO1xuICAgIH1cblxuICAgIC8vIERpc3BhdGNoIHRoZSBlbmQgZXZlbnQuXG4gICAgaWYgKHNlbGYuc3RhdGUgPT09IEVORElORykge1xuICAgICAgc2VsZi5vbi5jYWxsKFwiZW5kXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApO1xuICAgICAgc3RvcCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgc2VsZi5zdGF0ZSA9IEVOREVEO1xuICAgIHNlbGYudGltZXIuc3RvcCgpO1xuICAgIGRlbGV0ZSBzY2hlZHVsZXNbaWRdO1xuICAgIGZvciAodmFyIGkgaW4gc2NoZWR1bGVzKSByZXR1cm47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7c2VsZWN0b3J9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkge1xuICAgICAgICBpZiAoXCJfX2RhdGFfX1wiIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fO1xuICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7XG4gICAgICAgIHNjaGVkdWxlKHN1Ymdyb3VwW2ldLCBuYW1lLCBpZCwgaSwgc3ViZ3JvdXAsIGdldChub2RlLCBpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsImltcG9ydCB7c2VsZWN0b3JBbGx9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBmb3IgKHZhciBjaGlsZHJlbiA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSwgY2hpbGQsIGluaGVyaXQgPSBnZXQobm9kZSwgaWQpLCBrID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgayA8IGw7ICsraykge1xuICAgICAgICAgIGlmIChjaGlsZCA9IGNoaWxkcmVuW2tdKSB7XG4gICAgICAgICAgICBzY2hlZHVsZShjaGlsZCwgbmFtZSwgaWQsIGssIGNoaWxkcmVuLCBpbmhlcml0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3ViZ3JvdXBzLnB1c2goY2hpbGRyZW4pO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxudmFyIFNlbGVjdGlvbiA9IHNlbGVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9ncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiaW1wb3J0IHtpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyBhcyBpbnRlcnBvbGF0ZVRyYW5zZm9ybX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3N0eWxlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcbmltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcbmltcG9ydCBpbnRlcnBvbGF0ZSBmcm9tIFwiLi9pbnRlcnBvbGF0ZS5qc1wiO1xuXG5mdW5jdGlvbiBzdHlsZU51bGwobmFtZSwgaW50ZXJwb2xhdGUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICBzdHJpbmcxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlKHRoaXMsIG5hbWUpKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgc3RyaW5nMTAgPSBzdHJpbmcxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSBzdHlsZSh0aGlzLCBuYW1lKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVGdW5jdGlvbihuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSxcbiAgICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSBzdHJpbmcxID0gdmFsdWUxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlKHRoaXMsIG5hbWUpKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlTWF5YmVSZW1vdmUoaWQsIG5hbWUpIHtcbiAgdmFyIG9uMCwgb24xLCBsaXN0ZW5lcjAsIGtleSA9IFwic3R5bGUuXCIgKyBuYW1lLCBldmVudCA9IFwiZW5kLlwiICsga2V5LCByZW1vdmU7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICBvbiA9IHNjaGVkdWxlLm9uLFxuICAgICAgICBsaXN0ZW5lciA9IHNjaGVkdWxlLnZhbHVlW2tleV0gPT0gbnVsbCA/IHJlbW92ZSB8fCAocmVtb3ZlID0gc3R5bGVSZW1vdmUobmFtZSkpIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmIChvbiAhPT0gb24wIHx8IGxpc3RlbmVyMCAhPT0gbGlzdGVuZXIpIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24oZXZlbnQsIGxpc3RlbmVyMCA9IGxpc3RlbmVyKTtcblxuICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIGkgPSAobmFtZSArPSBcIlwiKSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGludGVycG9sYXRlVHJhbnNmb3JtIDogaW50ZXJwb2xhdGU7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVOdWxsKG5hbWUsIGkpKVxuICAgICAgLm9uKFwiZW5kLnN0eWxlLlwiICsgbmFtZSwgc3R5bGVSZW1vdmUobmFtZSkpXG4gICAgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHRoaXNcbiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlRnVuY3Rpb24obmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCBcInN0eWxlLlwiICsgbmFtZSwgdmFsdWUpKSlcbiAgICAgIC5lYWNoKHN0eWxlTWF5YmVSZW1vdmUodGhpcy5faWQsIG5hbWUpKVxuICAgIDogdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVDb25zdGFudChuYW1lLCBpLCB2YWx1ZSksIHByaW9yaXR5KVxuICAgICAgLm9uKFwiZW5kLnN0eWxlLlwiICsgbmFtZSwgbnVsbCk7XG59XG4iLCJmdW5jdGlvbiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBpLmNhbGwodGhpcywgdCksIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIHQsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0ID0gKGkwID0gaSkgJiYgc3R5bGVJbnRlcnBvbGF0ZShuYW1lLCBpLCBwcmlvcml0eSk7XG4gICAgcmV0dXJuIHQ7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciBrZXkgPSBcInN0eWxlLlwiICsgKG5hbWUgKz0gXCJcIik7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gXCJcIiA6IHByaW9yaXR5KSk7XG59XG4iLCJpbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5cbmZ1bmN0aW9uIHRleHRDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZTEgPSB2YWx1ZSh0aGlzKTtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWUxID09IG51bGwgPyBcIlwiIDogdmFsdWUxO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdGhpcy50d2VlbihcInRleHRcIiwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gdGV4dEZ1bmN0aW9uKHR3ZWVuVmFsdWUodGhpcywgXCJ0ZXh0XCIsIHZhbHVlKSlcbiAgICAgIDogdGV4dENvbnN0YW50KHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKyBcIlwiKSk7XG59XG4iLCJmdW5jdGlvbiB0ZXh0SW50ZXJwb2xhdGUoaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSBpLmNhbGwodGhpcywgdCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRUd2Vlbih2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIHRleHRJbnRlcnBvbGF0ZShpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGtleSA9IFwidGV4dFwiO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgdGV4dFR3ZWVuKHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb24sIG5ld0lkfSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQwID0gdGhpcy5faWQsXG4gICAgICBpZDEgPSBuZXdJZCgpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHZhciBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkMCk7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkMSwgaSwgZ3JvdXAsIHtcbiAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBkZWxheTogMCxcbiAgICAgICAgICBkdXJhdGlvbjogaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQxKTtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIHR3ZWVuUmVtb3ZlKGlkLCBuYW1lKSB7XG4gIHZhciB0d2VlbjAsIHR3ZWVuMTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7XG4gICAgICB0d2VlbjEgPSB0d2VlbjAgPSB0d2VlbjtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICB0d2VlbjEgPSB0d2VlbjEuc2xpY2UoKTtcbiAgICAgICAgICB0d2VlbjEuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHR3ZWVuRnVuY3Rpb24oaWQsIG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0d2VlbjAsIHR3ZWVuMTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2XigJlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkge1xuICAgICAgdHdlZW4xID0gKHR3ZWVuMCA9IHR3ZWVuKS5zbGljZSgpO1xuICAgICAgZm9yICh2YXIgdCA9IHtuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWV9LCBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgdHdlZW4xW2ldID0gdDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkgPT09IG4pIHR3ZWVuMS5wdXNoKHQpO1xuICAgIH1cblxuICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICBuYW1lICs9IFwiXCI7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIHR3ZWVuID0gZ2V0KHRoaXMubm9kZSgpLCBpZCkudHdlZW47XG4gICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2Vlbi5sZW5ndGgsIHQ7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgodCA9IHR3ZWVuW2ldKS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiB0LnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyB0d2VlblJlbW92ZSA6IHR3ZWVuRnVuY3Rpb24pKGlkLCBuYW1lLCB2YWx1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHdlZW5WYWx1ZSh0cmFuc2l0aW9uLCBuYW1lLCB2YWx1ZSkge1xuICB2YXIgaWQgPSB0cmFuc2l0aW9uLl9pZDtcblxuICB0cmFuc2l0aW9uLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKTtcbiAgICAoc2NoZWR1bGUudmFsdWUgfHwgKHNjaGVkdWxlLnZhbHVlID0ge30pKVtuYW1lXSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbihub2RlKSB7XG4gICAgcmV0dXJuIGdldChub2RlLCBpZCkudmFsdWVbbmFtZV07XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCB4ID0+ICgpID0+IHg7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBab29tRXZlbnQodHlwZSwge1xuICBzb3VyY2VFdmVudCxcbiAgdGFyZ2V0LFxuICB0cmFuc2Zvcm0sXG4gIGRpc3BhdGNoXG59KSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICB0eXBlOiB7dmFsdWU6IHR5cGUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgc291cmNlRXZlbnQ6IHt2YWx1ZTogc291cmNlRXZlbnQsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgdGFyZ2V0OiB7dmFsdWU6IHRhcmdldCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB0cmFuc2Zvcm06IHt2YWx1ZTogdHJhbnNmb3JtLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIF86IHt2YWx1ZTogZGlzcGF0Y2h9XG4gIH0pO1xufVxuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIHpvb219IGZyb20gXCIuL3pvb20uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB6b29tVHJhbnNmb3JtLCBpZGVudGl0eSBhcyB6b29tSWRlbnRpdHksIFRyYW5zZm9ybSBhcyBab29tVHJhbnNmb3JtfSBmcm9tIFwiLi90cmFuc2Zvcm0uanNcIjtcbiIsImV4cG9ydCBmdW5jdGlvbiBub3Byb3BhZ2F0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBUcmFuc2Zvcm0oaywgeCwgeSkge1xuICB0aGlzLmsgPSBrO1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtLFxuICBzY2FsZTogZnVuY3Rpb24oaykge1xuICAgIHJldHVybiBrID09PSAxID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rICogaywgdGhpcy54LCB0aGlzLnkpO1xuICB9LFxuICB0cmFuc2xhdGU6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4geCA9PT0gMCAmIHkgPT09IDAgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24ocG9pbnQpIHtcbiAgICByZXR1cm4gW3BvaW50WzBdICogdGhpcy5rICsgdGhpcy54LCBwb2ludFsxXSAqIHRoaXMuayArIHRoaXMueV07XG4gIH0sXG4gIGFwcGx5WDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB4ICogdGhpcy5rICsgdGhpcy54O1xuICB9LFxuICBhcHBseVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTtcbiAgfSxcbiAgaW52ZXJ0OiBmdW5jdGlvbihsb2NhdGlvbikge1xuICAgIHJldHVybiBbKGxvY2F0aW9uWzBdIC0gdGhpcy54KSAvIHRoaXMuaywgKGxvY2F0aW9uWzFdIC0gdGhpcy55KSAvIHRoaXMua107XG4gIH0sXG4gIGludmVydFg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gKHggLSB0aGlzLngpIC8gdGhpcy5rO1xuICB9LFxuICBpbnZlcnRZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuaztcbiAgfSxcbiAgcmVzY2FsZVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geC5jb3B5KCkuZG9tYWluKHgucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLCB0aGlzKS5tYXAoeC5pbnZlcnQsIHgpKTtcbiAgfSxcbiAgcmVzY2FsZVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geS5jb3B5KCkuZG9tYWluKHkucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLCB0aGlzKS5tYXAoeS5pbnZlcnQsIHkpKTtcbiAgfSxcbiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcInRyYW5zbGF0ZShcIiArIHRoaXMueCArIFwiLFwiICsgdGhpcy55ICsgXCIpIHNjYWxlKFwiICsgdGhpcy5rICsgXCIpXCI7XG4gIH1cbn07XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSBuZXcgVHJhbnNmb3JtKDEsIDAsIDApO1xuXG50cmFuc2Zvcm0ucHJvdG90eXBlID0gVHJhbnNmb3JtLnByb3RvdHlwZTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUpIHtcbiAgd2hpbGUgKCFub2RlLl9fem9vbSkgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHJldHVybiBpZGVudGl0eTtcbiAgcmV0dXJuIG5vZGUuX196b29tO1xufVxuIiwiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge2RyYWdEaXNhYmxlLCBkcmFnRW5hYmxlfSBmcm9tIFwiZDMtZHJhZ1wiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZVpvb219IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtzZWxlY3QsIHBvaW50ZXJ9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7aW50ZXJydXB0fSBmcm9tIFwiZDMtdHJhbnNpdGlvblwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgWm9vbUV2ZW50IGZyb20gXCIuL2V2ZW50LmpzXCI7XG5pbXBvcnQge1RyYW5zZm9ybSwgaWRlbnRpdHl9IGZyb20gXCIuL3RyYW5zZm9ybS5qc1wiO1xuaW1wb3J0IG5vZXZlbnQsIHtub3Byb3BhZ2F0aW9ufSBmcm9tIFwiLi9ub2V2ZW50LmpzXCI7XG5cbi8vIElnbm9yZSByaWdodC1jbGljaywgc2luY2UgdGhhdCBzaG91bGQgb3BlbiB0aGUgY29udGV4dCBtZW51LlxuLy8gZXhjZXB0IGZvciBwaW5jaC10by16b29tLCB3aGljaCBpcyBzZW50IGFzIGEgd2hlZWwrY3RybEtleSBldmVudFxuZnVuY3Rpb24gZGVmYXVsdEZpbHRlcihldmVudCkge1xuICByZXR1cm4gKCFldmVudC5jdHJsS2V5IHx8IGV2ZW50LnR5cGUgPT09ICd3aGVlbCcpICYmICFldmVudC5idXR0b247XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRFeHRlbnQoKSB7XG4gIHZhciBlID0gdGhpcztcbiAgaWYgKGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSB7XG4gICAgZSA9IGUub3duZXJTVkdFbGVtZW50IHx8IGU7XG4gICAgaWYgKGUuaGFzQXR0cmlidXRlKFwidmlld0JveFwiKSkge1xuICAgICAgZSA9IGUudmlld0JveC5iYXNlVmFsO1xuICAgICAgcmV0dXJuIFtbZS54LCBlLnldLCBbZS54ICsgZS53aWR0aCwgZS55ICsgZS5oZWlnaHRdXTtcbiAgICB9XG4gICAgcmV0dXJuIFtbMCwgMF0sIFtlLndpZHRoLmJhc2VWYWwudmFsdWUsIGUuaGVpZ2h0LmJhc2VWYWwudmFsdWVdXTtcbiAgfVxuICByZXR1cm4gW1swLCAwXSwgW2UuY2xpZW50V2lkdGgsIGUuY2xpZW50SGVpZ2h0XV07XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRUcmFuc2Zvcm0oKSB7XG4gIHJldHVybiB0aGlzLl9fem9vbSB8fCBpZGVudGl0eTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFdoZWVsRGVsdGEoZXZlbnQpIHtcbiAgcmV0dXJuIC1ldmVudC5kZWx0YVkgKiAoZXZlbnQuZGVsdGFNb2RlID09PSAxID8gMC4wNSA6IGV2ZW50LmRlbHRhTW9kZSA/IDEgOiAwLjAwMikgKiAoZXZlbnQuY3RybEtleSA/IDEwIDogMSk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRUb3VjaGFibGUoKSB7XG4gIHJldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgfHwgKFwib250b3VjaHN0YXJ0XCIgaW4gdGhpcyk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDb25zdHJhaW4odHJhbnNmb3JtLCBleHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkge1xuICB2YXIgZHgwID0gdHJhbnNmb3JtLmludmVydFgoZXh0ZW50WzBdWzBdKSAtIHRyYW5zbGF0ZUV4dGVudFswXVswXSxcbiAgICAgIGR4MSA9IHRyYW5zZm9ybS5pbnZlcnRYKGV4dGVudFsxXVswXSkgLSB0cmFuc2xhdGVFeHRlbnRbMV1bMF0sXG4gICAgICBkeTAgPSB0cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMF1bMV0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzFdLFxuICAgICAgZHkxID0gdHJhbnNmb3JtLmludmVydFkoZXh0ZW50WzFdWzFdKSAtIHRyYW5zbGF0ZUV4dGVudFsxXVsxXTtcbiAgcmV0dXJuIHRyYW5zZm9ybS50cmFuc2xhdGUoXG4gICAgZHgxID4gZHgwID8gKGR4MCArIGR4MSkgLyAyIDogTWF0aC5taW4oMCwgZHgwKSB8fCBNYXRoLm1heCgwLCBkeDEpLFxuICAgIGR5MSA+IGR5MCA/IChkeTAgKyBkeTEpIC8gMiA6IE1hdGgubWluKDAsIGR5MCkgfHwgTWF0aC5tYXgoMCwgZHkxKVxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGZpbHRlciA9IGRlZmF1bHRGaWx0ZXIsXG4gICAgICBleHRlbnQgPSBkZWZhdWx0RXh0ZW50LFxuICAgICAgY29uc3RyYWluID0gZGVmYXVsdENvbnN0cmFpbixcbiAgICAgIHdoZWVsRGVsdGEgPSBkZWZhdWx0V2hlZWxEZWx0YSxcbiAgICAgIHRvdWNoYWJsZSA9IGRlZmF1bHRUb3VjaGFibGUsXG4gICAgICBzY2FsZUV4dGVudCA9IFswLCBJbmZpbml0eV0sXG4gICAgICB0cmFuc2xhdGVFeHRlbnQgPSBbWy1JbmZpbml0eSwgLUluZmluaXR5XSwgW0luZmluaXR5LCBJbmZpbml0eV1dLFxuICAgICAgZHVyYXRpb24gPSAyNTAsXG4gICAgICBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlWm9vbSxcbiAgICAgIGxpc3RlbmVycyA9IGRpc3BhdGNoKFwic3RhcnRcIiwgXCJ6b29tXCIsIFwiZW5kXCIpLFxuICAgICAgdG91Y2hzdGFydGluZyxcbiAgICAgIHRvdWNoZmlyc3QsXG4gICAgICB0b3VjaGVuZGluZyxcbiAgICAgIHRvdWNoRGVsYXkgPSA1MDAsXG4gICAgICB3aGVlbERlbGF5ID0gMTUwLFxuICAgICAgY2xpY2tEaXN0YW5jZTIgPSAwLFxuICAgICAgdGFwRGlzdGFuY2UgPSAxMDtcblxuICBmdW5jdGlvbiB6b29tKHNlbGVjdGlvbikge1xuICAgIHNlbGVjdGlvblxuICAgICAgICAucHJvcGVydHkoXCJfX3pvb21cIiwgZGVmYXVsdFRyYW5zZm9ybSlcbiAgICAgICAgLm9uKFwid2hlZWwuem9vbVwiLCB3aGVlbGVkLCB7cGFzc2l2ZTogZmFsc2V9KVxuICAgICAgICAub24oXCJtb3VzZWRvd24uem9vbVwiLCBtb3VzZWRvd25lZClcbiAgICAgICAgLm9uKFwiZGJsY2xpY2suem9vbVwiLCBkYmxjbGlja2VkKVxuICAgICAgLmZpbHRlcih0b3VjaGFibGUpXG4gICAgICAgIC5vbihcInRvdWNoc3RhcnQuem9vbVwiLCB0b3VjaHN0YXJ0ZWQpXG4gICAgICAgIC5vbihcInRvdWNobW92ZS56b29tXCIsIHRvdWNobW92ZWQpXG4gICAgICAgIC5vbihcInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbVwiLCB0b3VjaGVuZGVkKVxuICAgICAgICAuc3R5bGUoXCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3JcIiwgXCJyZ2JhKDAsMCwwLDApXCIpO1xuICB9XG5cbiAgem9vbS50cmFuc2Zvcm0gPSBmdW5jdGlvbihjb2xsZWN0aW9uLCB0cmFuc2Zvcm0sIHBvaW50LCBldmVudCkge1xuICAgIHZhciBzZWxlY3Rpb24gPSBjb2xsZWN0aW9uLnNlbGVjdGlvbiA/IGNvbGxlY3Rpb24uc2VsZWN0aW9uKCkgOiBjb2xsZWN0aW9uO1xuICAgIHNlbGVjdGlvbi5wcm9wZXJ0eShcIl9fem9vbVwiLCBkZWZhdWx0VHJhbnNmb3JtKTtcbiAgICBpZiAoY29sbGVjdGlvbiAhPT0gc2VsZWN0aW9uKSB7XG4gICAgICBzY2hlZHVsZShjb2xsZWN0aW9uLCB0cmFuc2Zvcm0sIHBvaW50LCBldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdGlvbi5pbnRlcnJ1cHQoKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgICAuZXZlbnQoZXZlbnQpXG4gICAgICAgICAgLnN0YXJ0KClcbiAgICAgICAgICAuem9vbShudWxsLCB0eXBlb2YgdHJhbnNmb3JtID09PSBcImZ1bmN0aW9uXCIgPyB0cmFuc2Zvcm0uYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHRyYW5zZm9ybSlcbiAgICAgICAgICAuZW5kKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgem9vbS5zY2FsZUJ5ID0gZnVuY3Rpb24oc2VsZWN0aW9uLCBrLCBwLCBldmVudCkge1xuICAgIHpvb20uc2NhbGVUbyhzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGswID0gdGhpcy5fX3pvb20uayxcbiAgICAgICAgICBrMSA9IHR5cGVvZiBrID09PSBcImZ1bmN0aW9uXCIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrO1xuICAgICAgcmV0dXJuIGswICogazE7XG4gICAgfSwgcCwgZXZlbnQpO1xuICB9O1xuXG4gIHpvb20uc2NhbGVUbyA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgaywgcCwgZXZlbnQpIHtcbiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGUgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgICB0MCA9IHRoaXMuX196b29tLFxuICAgICAgICAgIHAwID0gcCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0eXBlb2YgcCA9PT0gXCJmdW5jdGlvblwiID8gcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogcCxcbiAgICAgICAgICBwMSA9IHQwLmludmVydChwMCksXG4gICAgICAgICAgazEgPSB0eXBlb2YgayA9PT0gXCJmdW5jdGlvblwiID8gay5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogaztcbiAgICAgIHJldHVybiBjb25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQwLCBrMSksIHAwLCBwMSksIGUsIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSwgcCwgZXZlbnQpO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlQnkgPSBmdW5jdGlvbihzZWxlY3Rpb24sIHgsIHksIGV2ZW50KSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBjb25zdHJhaW4odGhpcy5fX3pvb20udHJhbnNsYXRlKFxuICAgICAgICB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogeCxcbiAgICAgICAgdHlwZW9mIHkgPT09IFwiZnVuY3Rpb25cIiA/IHkuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHlcbiAgICAgICksIGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgIH0sIG51bGwsIGV2ZW50KTtcbiAgfTtcblxuICB6b29tLnRyYW5zbGF0ZVRvID0gZnVuY3Rpb24oc2VsZWN0aW9uLCB4LCB5LCBwLCBldmVudCkge1xuICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZSA9IGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICAgIHQgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgICBwMCA9IHAgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHAgPT09IFwiZnVuY3Rpb25cIiA/IHAuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHA7XG4gICAgICByZXR1cm4gY29uc3RyYWluKGlkZW50aXR5LnRyYW5zbGF0ZShwMFswXSwgcDBbMV0pLnNjYWxlKHQuaykudHJhbnNsYXRlKFxuICAgICAgICB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8gLXguYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IC14LFxuICAgICAgICB0eXBlb2YgeSA9PT0gXCJmdW5jdGlvblwiID8gLXkuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IC15XG4gICAgICApLCBlLCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgIH0sIHAsIGV2ZW50KTtcbiAgfTtcblxuICBmdW5jdGlvbiBzY2FsZSh0cmFuc2Zvcm0sIGspIHtcbiAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCBrKSk7XG4gICAgcmV0dXJuIGsgPT09IHRyYW5zZm9ybS5rID8gdHJhbnNmb3JtIDogbmV3IFRyYW5zZm9ybShrLCB0cmFuc2Zvcm0ueCwgdHJhbnNmb3JtLnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlKHRyYW5zZm9ybSwgcDAsIHAxKSB7XG4gICAgdmFyIHggPSBwMFswXSAtIHAxWzBdICogdHJhbnNmb3JtLmssIHkgPSBwMFsxXSAtIHAxWzFdICogdHJhbnNmb3JtLms7XG4gICAgcmV0dXJuIHggPT09IHRyYW5zZm9ybS54ICYmIHkgPT09IHRyYW5zZm9ybS55ID8gdHJhbnNmb3JtIDogbmV3IFRyYW5zZm9ybSh0cmFuc2Zvcm0uaywgeCwgeSk7XG4gIH1cblxuICBmdW5jdGlvbiBjZW50cm9pZChleHRlbnQpIHtcbiAgICByZXR1cm4gWygrZXh0ZW50WzBdWzBdICsgK2V4dGVudFsxXVswXSkgLyAyLCAoK2V4dGVudFswXVsxXSArICtleHRlbnRbMV1bMV0pIC8gMl07XG4gIH1cblxuICBmdW5jdGlvbiBzY2hlZHVsZSh0cmFuc2l0aW9uLCB0cmFuc2Zvcm0sIHBvaW50LCBldmVudCkge1xuICAgIHRyYW5zaXRpb25cbiAgICAgICAgLm9uKFwic3RhcnQuem9vbVwiLCBmdW5jdGlvbigpIHsgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLmV2ZW50KGV2ZW50KS5zdGFydCgpOyB9KVxuICAgICAgICAub24oXCJpbnRlcnJ1cHQuem9vbSBlbmQuem9vbVwiLCBmdW5jdGlvbigpIHsgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLmV2ZW50KGV2ZW50KS5lbmQoKTsgfSlcbiAgICAgICAgLnR3ZWVuKFwiem9vbVwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgIGcgPSBnZXN0dXJlKHRoYXQsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgICAgICAgZSA9IGV4dGVudC5hcHBseSh0aGF0LCBhcmdzKSxcbiAgICAgICAgICAgICAgcCA9IHBvaW50ID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwb2ludCA9PT0gXCJmdW5jdGlvblwiID8gcG9pbnQuYXBwbHkodGhhdCwgYXJncykgOiBwb2ludCxcbiAgICAgICAgICAgICAgdyA9IE1hdGgubWF4KGVbMV1bMF0gLSBlWzBdWzBdLCBlWzFdWzFdIC0gZVswXVsxXSksXG4gICAgICAgICAgICAgIGEgPSB0aGF0Ll9fem9vbSxcbiAgICAgICAgICAgICAgYiA9IHR5cGVvZiB0cmFuc2Zvcm0gPT09IFwiZnVuY3Rpb25cIiA/IHRyYW5zZm9ybS5hcHBseSh0aGF0LCBhcmdzKSA6IHRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgaSA9IGludGVycG9sYXRlKGEuaW52ZXJ0KHApLmNvbmNhdCh3IC8gYS5rKSwgYi5pbnZlcnQocCkuY29uY2F0KHcgLyBiLmspKTtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgaWYgKHQgPT09IDEpIHQgPSBiOyAvLyBBdm9pZCByb3VuZGluZyBlcnJvciBvbiBlbmQuXG4gICAgICAgICAgICBlbHNlIHsgdmFyIGwgPSBpKHQpLCBrID0gdyAvIGxbMl07IHQgPSBuZXcgVHJhbnNmb3JtKGssIHBbMF0gLSBsWzBdICogaywgcFsxXSAtIGxbMV0gKiBrKTsgfVxuICAgICAgICAgICAgZy56b29tKG51bGwsIHQpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2VzdHVyZSh0aGF0LCBhcmdzLCBjbGVhbikge1xuICAgIHJldHVybiAoIWNsZWFuICYmIHRoYXQuX196b29taW5nKSB8fCBuZXcgR2VzdHVyZSh0aGF0LCBhcmdzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIEdlc3R1cmUodGhhdCwgYXJncykge1xuICAgIHRoaXMudGhhdCA9IHRoYXQ7XG4gICAgdGhpcy5hcmdzID0gYXJncztcbiAgICB0aGlzLmFjdGl2ZSA9IDA7XG4gICAgdGhpcy5zb3VyY2VFdmVudCA9IG51bGw7XG4gICAgdGhpcy5leHRlbnQgPSBleHRlbnQuYXBwbHkodGhhdCwgYXJncyk7XG4gICAgdGhpcy50YXBzID0gMDtcbiAgfVxuXG4gIEdlc3R1cmUucHJvdG90eXBlID0ge1xuICAgIGV2ZW50OiBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKGV2ZW50KSB0aGlzLnNvdXJjZUV2ZW50ID0gZXZlbnQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIHN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICgrK3RoaXMuYWN0aXZlID09PSAxKSB7XG4gICAgICAgIHRoaXMudGhhdC5fX3pvb21pbmcgPSB0aGlzO1xuICAgICAgICB0aGlzLmVtaXQoXCJzdGFydFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgem9vbTogZnVuY3Rpb24oa2V5LCB0cmFuc2Zvcm0pIHtcbiAgICAgIGlmICh0aGlzLm1vdXNlICYmIGtleSAhPT0gXCJtb3VzZVwiKSB0aGlzLm1vdXNlWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLm1vdXNlWzBdKTtcbiAgICAgIGlmICh0aGlzLnRvdWNoMCAmJiBrZXkgIT09IFwidG91Y2hcIikgdGhpcy50b3VjaDBbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMudG91Y2gwWzBdKTtcbiAgICAgIGlmICh0aGlzLnRvdWNoMSAmJiBrZXkgIT09IFwidG91Y2hcIikgdGhpcy50b3VjaDFbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMudG91Y2gxWzBdKTtcbiAgICAgIHRoaXMudGhhdC5fX3pvb20gPSB0cmFuc2Zvcm07XG4gICAgICB0aGlzLmVtaXQoXCJ6b29tXCIpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKC0tdGhpcy5hY3RpdmUgPT09IDApIHtcbiAgICAgICAgZGVsZXRlIHRoaXMudGhhdC5fX3pvb21pbmc7XG4gICAgICAgIHRoaXMuZW1pdChcImVuZFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgZW1pdDogZnVuY3Rpb24odHlwZSkge1xuICAgICAgdmFyIGQgPSBzZWxlY3QodGhpcy50aGF0KS5kYXR1bSgpO1xuICAgICAgbGlzdGVuZXJzLmNhbGwoXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHRoaXMudGhhdCxcbiAgICAgICAgbmV3IFpvb21FdmVudCh0eXBlLCB7XG4gICAgICAgICAgc291cmNlRXZlbnQ6IHRoaXMuc291cmNlRXZlbnQsXG4gICAgICAgICAgdGFyZ2V0OiB6b29tLFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgdHJhbnNmb3JtOiB0aGlzLnRoYXQuX196b29tLFxuICAgICAgICAgIGRpc3BhdGNoOiBsaXN0ZW5lcnNcbiAgICAgICAgfSksXG4gICAgICAgIGRcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIHdoZWVsZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdCA9IHRoaXMuX196b29tLFxuICAgICAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCB0LmsgKiBNYXRoLnBvdygyLCB3aGVlbERlbHRhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpKSksXG4gICAgICAgIHAgPSBwb2ludGVyKGV2ZW50KTtcblxuICAgIC8vIElmIHRoZSBtb3VzZSBpcyBpbiB0aGUgc2FtZSBsb2NhdGlvbiBhcyBiZWZvcmUsIHJldXNlIGl0LlxuICAgIC8vIElmIHRoZXJlIHdlcmUgcmVjZW50IHdoZWVsIGV2ZW50cywgcmVzZXQgdGhlIHdoZWVsIGlkbGUgdGltZW91dC5cbiAgICBpZiAoZy53aGVlbCkge1xuICAgICAgaWYgKGcubW91c2VbMF1bMF0gIT09IHBbMF0gfHwgZy5tb3VzZVswXVsxXSAhPT0gcFsxXSkge1xuICAgICAgICBnLm1vdXNlWzFdID0gdC5pbnZlcnQoZy5tb3VzZVswXSA9IHApO1xuICAgICAgfVxuICAgICAgY2xlYXJUaW1lb3V0KGcud2hlZWwpO1xuICAgIH1cblxuICAgIC8vIElmIHRoaXMgd2hlZWwgZXZlbnQgd29u4oCZdCB0cmlnZ2VyIGEgdHJhbnNmb3JtIGNoYW5nZSwgaWdub3JlIGl0LlxuICAgIGVsc2UgaWYgKHQuayA9PT0gaykgcmV0dXJuO1xuXG4gICAgLy8gT3RoZXJ3aXNlLCBjYXB0dXJlIHRoZSBtb3VzZSBwb2ludCBhbmQgbG9jYXRpb24gYXQgdGhlIHN0YXJ0LlxuICAgIGVsc2Uge1xuICAgICAgZy5tb3VzZSA9IFtwLCB0LmludmVydChwKV07XG4gICAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgICBnLnN0YXJ0KCk7XG4gICAgfVxuXG4gICAgbm9ldmVudChldmVudCk7XG4gICAgZy53aGVlbCA9IHNldFRpbWVvdXQod2hlZWxpZGxlZCwgd2hlZWxEZWxheSk7XG4gICAgZy56b29tKFwibW91c2VcIiwgY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0LCBrKSwgZy5tb3VzZVswXSwgZy5tb3VzZVsxXSksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcblxuICAgIGZ1bmN0aW9uIHdoZWVsaWRsZWQoKSB7XG4gICAgICBnLndoZWVsID0gbnVsbDtcbiAgICAgIGcuZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbW91c2Vkb3duZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAodG91Y2hlbmRpbmcgfHwgIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0LFxuICAgICAgICBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzLCB0cnVlKS5ldmVudChldmVudCksXG4gICAgICAgIHYgPSBzZWxlY3QoZXZlbnQudmlldykub24oXCJtb3VzZW1vdmUuem9vbVwiLCBtb3VzZW1vdmVkLCB0cnVlKS5vbihcIm1vdXNldXAuem9vbVwiLCBtb3VzZXVwcGVkLCB0cnVlKSxcbiAgICAgICAgcCA9IHBvaW50ZXIoZXZlbnQsIGN1cnJlbnRUYXJnZXQpLFxuICAgICAgICB4MCA9IGV2ZW50LmNsaWVudFgsXG4gICAgICAgIHkwID0gZXZlbnQuY2xpZW50WTtcblxuICAgIGRyYWdEaXNhYmxlKGV2ZW50LnZpZXcpO1xuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIGcubW91c2UgPSBbcCwgdGhpcy5fX3pvb20uaW52ZXJ0KHApXTtcbiAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgZy5zdGFydCgpO1xuXG4gICAgZnVuY3Rpb24gbW91c2Vtb3ZlZChldmVudCkge1xuICAgICAgbm9ldmVudChldmVudCk7XG4gICAgICBpZiAoIWcubW92ZWQpIHtcbiAgICAgICAgdmFyIGR4ID0gZXZlbnQuY2xpZW50WCAtIHgwLCBkeSA9IGV2ZW50LmNsaWVudFkgLSB5MDtcbiAgICAgICAgZy5tb3ZlZCA9IGR4ICogZHggKyBkeSAqIGR5ID4gY2xpY2tEaXN0YW5jZTI7XG4gICAgICB9XG4gICAgICBnLmV2ZW50KGV2ZW50KVxuICAgICAgIC56b29tKFwibW91c2VcIiwgY29uc3RyYWluKHRyYW5zbGF0ZShnLnRoYXQuX196b29tLCBnLm1vdXNlWzBdID0gcG9pbnRlcihldmVudCwgY3VycmVudFRhcmdldCksIGcubW91c2VbMV0pLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW91c2V1cHBlZChldmVudCkge1xuICAgICAgdi5vbihcIm1vdXNlbW92ZS56b29tIG1vdXNldXAuem9vbVwiLCBudWxsKTtcbiAgICAgIGRyYWdFbmFibGUoZXZlbnQudmlldywgZy5tb3ZlZCk7XG4gICAgICBub2V2ZW50KGV2ZW50KTtcbiAgICAgIGcuZXZlbnQoZXZlbnQpLmVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRibGNsaWNrZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIHQwID0gdGhpcy5fX3pvb20sXG4gICAgICAgIHAwID0gcG9pbnRlcihldmVudC5jaGFuZ2VkVG91Y2hlcyA/IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdIDogZXZlbnQsIHRoaXMpLFxuICAgICAgICBwMSA9IHQwLmludmVydChwMCksXG4gICAgICAgIGsxID0gdDAuayAqIChldmVudC5zaGlmdEtleSA/IDAuNSA6IDIpLFxuICAgICAgICB0MSA9IGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodDAsIGsxKSwgcDAsIHAxKSwgZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3MpLCB0cmFuc2xhdGVFeHRlbnQpO1xuXG4gICAgbm9ldmVudChldmVudCk7XG4gICAgaWYgKGR1cmF0aW9uID4gMCkgc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihkdXJhdGlvbikuY2FsbChzY2hlZHVsZSwgdDEsIHAwLCBldmVudCk7XG4gICAgZWxzZSBzZWxlY3QodGhpcykuY2FsbCh6b29tLnRyYW5zZm9ybSwgdDEsIHAwLCBldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaHN0YXJ0ZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIHRvdWNoZXMgPSBldmVudC50b3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsXG4gICAgICAgIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MsIGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA9PT0gbikuZXZlbnQoZXZlbnQpLFxuICAgICAgICBzdGFydGVkLCBpLCB0LCBwO1xuXG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV0sIHAgPSBwb2ludGVyKHQsIHRoaXMpO1xuICAgICAgcCA9IFtwLCB0aGlzLl9fem9vbS5pbnZlcnQocCksIHQuaWRlbnRpZmllcl07XG4gICAgICBpZiAoIWcudG91Y2gwKSBnLnRvdWNoMCA9IHAsIHN0YXJ0ZWQgPSB0cnVlLCBnLnRhcHMgPSAxICsgISF0b3VjaHN0YXJ0aW5nO1xuICAgICAgZWxzZSBpZiAoIWcudG91Y2gxICYmIGcudG91Y2gwWzJdICE9PSBwWzJdKSBnLnRvdWNoMSA9IHAsIGcudGFwcyA9IDA7XG4gICAgfVxuXG4gICAgaWYgKHRvdWNoc3RhcnRpbmcpIHRvdWNoc3RhcnRpbmcgPSBjbGVhclRpbWVvdXQodG91Y2hzdGFydGluZyk7XG5cbiAgICBpZiAoc3RhcnRlZCkge1xuICAgICAgaWYgKGcudGFwcyA8IDIpIHRvdWNoZmlyc3QgPSBwWzBdLCB0b3VjaHN0YXJ0aW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hzdGFydGluZyA9IG51bGw7IH0sIHRvdWNoRGVsYXkpO1xuICAgICAgaW50ZXJydXB0KHRoaXMpO1xuICAgICAgZy5zdGFydCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNobW92ZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuX196b29taW5nKSByZXR1cm47XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIHQsIHAsIGw7XG5cbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXSwgcCA9IHBvaW50ZXIodCwgdGhpcyk7XG4gICAgICBpZiAoZy50b3VjaDAgJiYgZy50b3VjaDBbMl0gPT09IHQuaWRlbnRpZmllcikgZy50b3VjaDBbMF0gPSBwO1xuICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFbMl0gPT09IHQuaWRlbnRpZmllcikgZy50b3VjaDFbMF0gPSBwO1xuICAgIH1cbiAgICB0ID0gZy50aGF0Ll9fem9vbTtcbiAgICBpZiAoZy50b3VjaDEpIHtcbiAgICAgIHZhciBwMCA9IGcudG91Y2gwWzBdLCBsMCA9IGcudG91Y2gwWzFdLFxuICAgICAgICAgIHAxID0gZy50b3VjaDFbMF0sIGwxID0gZy50b3VjaDFbMV0sXG4gICAgICAgICAgZHAgPSAoZHAgPSBwMVswXSAtIHAwWzBdKSAqIGRwICsgKGRwID0gcDFbMV0gLSBwMFsxXSkgKiBkcCxcbiAgICAgICAgICBkbCA9IChkbCA9IGwxWzBdIC0gbDBbMF0pICogZGwgKyAoZGwgPSBsMVsxXSAtIGwwWzFdKSAqIGRsO1xuICAgICAgdCA9IHNjYWxlKHQsIE1hdGguc3FydChkcCAvIGRsKSk7XG4gICAgICBwID0gWyhwMFswXSArIHAxWzBdKSAvIDIsIChwMFsxXSArIHAxWzFdKSAvIDJdO1xuICAgICAgbCA9IFsobDBbMF0gKyBsMVswXSkgLyAyLCAobDBbMV0gKyBsMVsxXSkgLyAyXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZy50b3VjaDApIHAgPSBnLnRvdWNoMFswXSwgbCA9IGcudG91Y2gwWzFdO1xuICAgIGVsc2UgcmV0dXJuO1xuXG4gICAgZy56b29tKFwidG91Y2hcIiwgY29uc3RyYWluKHRyYW5zbGF0ZSh0LCBwLCBsKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hlbmRlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghdGhpcy5fX3pvb21pbmcpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgdDtcblxuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIGlmICh0b3VjaGVuZGluZykgY2xlYXJUaW1lb3V0KHRvdWNoZW5kaW5nKTtcbiAgICB0b3VjaGVuZGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoZW5kaW5nID0gbnVsbDsgfSwgdG91Y2hEZWxheSk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV07XG4gICAgICBpZiAoZy50b3VjaDAgJiYgZy50b3VjaDBbMl0gPT09IHQuaWRlbnRpZmllcikgZGVsZXRlIGcudG91Y2gwO1xuICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFbMl0gPT09IHQuaWRlbnRpZmllcikgZGVsZXRlIGcudG91Y2gxO1xuICAgIH1cbiAgICBpZiAoZy50b3VjaDEgJiYgIWcudG91Y2gwKSBnLnRvdWNoMCA9IGcudG91Y2gxLCBkZWxldGUgZy50b3VjaDE7XG4gICAgaWYgKGcudG91Y2gwKSBnLnRvdWNoMFsxXSA9IHRoaXMuX196b29tLmludmVydChnLnRvdWNoMFswXSk7XG4gICAgZWxzZSB7XG4gICAgICBnLmVuZCgpO1xuICAgICAgLy8gSWYgdGhpcyB3YXMgYSBkYmx0YXAsIHJlcm91dGUgdG8gdGhlIChvcHRpb25hbCkgZGJsY2xpY2suem9vbSBoYW5kbGVyLlxuICAgICAgaWYgKGcudGFwcyA9PT0gMikge1xuICAgICAgICB0ID0gcG9pbnRlcih0LCB0aGlzKTtcbiAgICAgICAgaWYgKE1hdGguaHlwb3QodG91Y2hmaXJzdFswXSAtIHRbMF0sIHRvdWNoZmlyc3RbMV0gLSB0WzFdKSA8IHRhcERpc3RhbmNlKSB7XG4gICAgICAgICAgdmFyIHAgPSBzZWxlY3QodGhpcykub24oXCJkYmxjbGljay56b29tXCIpO1xuICAgICAgICAgIGlmIChwKSBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB6b29tLndoZWVsRGVsdGEgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAod2hlZWxEZWx0YSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCB6b29tKSA6IHdoZWVsRGVsdGE7XG4gIH07XG5cbiAgem9vbS5maWx0ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZmlsdGVyID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCB6b29tKSA6IGZpbHRlcjtcbiAgfTtcblxuICB6b29tLnRvdWNoYWJsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b3VjaGFibGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIHpvb20pIDogdG91Y2hhYmxlO1xuICB9O1xuXG4gIHpvb20uZXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4dGVudCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoW1srX1swXVswXSwgK19bMF1bMV1dLCBbK19bMV1bMF0sICtfWzFdWzFdXV0pLCB6b29tKSA6IGV4dGVudDtcbiAgfTtcblxuICB6b29tLnNjYWxlRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlRXh0ZW50WzBdID0gK19bMF0sIHNjYWxlRXh0ZW50WzFdID0gK19bMV0sIHpvb20pIDogW3NjYWxlRXh0ZW50WzBdLCBzY2FsZUV4dGVudFsxXV07XG4gIH07XG5cbiAgem9vbS50cmFuc2xhdGVFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNsYXRlRXh0ZW50WzBdWzBdID0gK19bMF1bMF0sIHRyYW5zbGF0ZUV4dGVudFsxXVswXSA9ICtfWzFdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMF1bMV0gPSArX1swXVsxXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzFdID0gK19bMV1bMV0sIHpvb20pIDogW1t0cmFuc2xhdGVFeHRlbnRbMF1bMF0sIHRyYW5zbGF0ZUV4dGVudFswXVsxXV0sIFt0cmFuc2xhdGVFeHRlbnRbMV1bMF0sIHRyYW5zbGF0ZUV4dGVudFsxXVsxXV1dO1xuICB9O1xuXG4gIHpvb20uY29uc3RyYWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbnN0cmFpbiA9IF8sIHpvb20pIDogY29uc3RyYWluO1xuICB9O1xuXG4gIHpvb20uZHVyYXRpb24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHVyYXRpb24gPSArXywgem9vbSkgOiBkdXJhdGlvbjtcbiAgfTtcblxuICB6b29tLmludGVycG9sYXRlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGludGVycG9sYXRlID0gXywgem9vbSkgOiBpbnRlcnBvbGF0ZTtcbiAgfTtcblxuICB6b29tLm9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlID0gbGlzdGVuZXJzLm9uLmFwcGx5KGxpc3RlbmVycywgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gdmFsdWUgPT09IGxpc3RlbmVycyA/IHpvb20gOiB2YWx1ZTtcbiAgfTtcblxuICB6b29tLmNsaWNrRGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xpY2tEaXN0YW5jZTIgPSAoXyA9ICtfKSAqIF8sIHpvb20pIDogTWF0aC5zcXJ0KGNsaWNrRGlzdGFuY2UyKTtcbiAgfTtcblxuICB6b29tLnRhcERpc3RhbmNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRhcERpc3RhbmNlID0gK18sIHpvb20pIDogdGFwRGlzdGFuY2U7XG4gIH07XG5cbiAgcmV0dXJuIHpvb207XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYWNjZXNzb3IoeCwgZmFsbGJhY2spIHtcbiAgcmV0dXJuIHggPT0gbnVsbCA/IGZhbGxiYWNrXG4gICAgOiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJyA/IHhcbiAgICA6IGQgPT4gZFt4XTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBiaW4xZChkYXRhLCB4LCB3ZWlnaHQsIGxvLCBoaSwgbikge1xuICBjb25zdCBncmlkID0gbmV3IEZsb2F0NjRBcnJheShuKTtcbiAgY29uc3QgZGVsdGEgPSAobiAtIDEpIC8gKGhpIC0gbG8pO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGQgPSBkYXRhW2ldO1xuICAgIGNvbnN0IHhpID0geChkLCBpLCBkYXRhKTtcbiAgICBjb25zdCB3aSA9IHdlaWdodChkLCBpLCBkYXRhKTtcblxuICAgIC8vIHNraXAgTmFOIGFuZCBJbmZpbml0ZSB2YWx1ZXNcbiAgICBpZiAoIShOdW1iZXIuaXNGaW5pdGUoeGkpICYmIE51bWJlci5pc0Zpbml0ZSh3aSkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwID0gKHhpIC0gbG8pICogZGVsdGE7XG4gICAgY29uc3QgdSA9IE1hdGguZmxvb3IocCk7XG4gICAgY29uc3QgdiA9IHUgKyAxO1xuXG4gICAgaWYgKDAgPD0gdSAmJiB2IDwgbikge1xuICAgICAgZ3JpZFt1XSArPSAodiAtIHApICogd2k7XG4gICAgICBncmlkW3ZdICs9IChwIC0gdSkgKiB3aTtcbiAgICB9IGVsc2UgaWYgKHUgPT09IC0xKSB7XG4gICAgICBncmlkW3ZdICs9IChwIC0gdSkgKiB3aTtcbiAgICB9IGVsc2UgaWYgKHYgPT09IG4pIHtcbiAgICAgIGdyaWRbdV0gKz0gKHYgLSBwKSAqIHdpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBncmlkO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJpbjJkKGRhdGEsIHgsIHksIHcsIHgwLCB4MSwgeG4sIHkwLCB5MSwgeW4pIHtcbiAgY29uc3QgZ3JpZCA9IG5ldyBGbG9hdDY0QXJyYXkoeG4gKiB5bik7XG4gIGNvbnN0IHhkZWx0YSA9ICh4biAtIDEpIC8gKHgxIC0geDApO1xuICBjb25zdCB5ZGVsdGEgPSAoeW4gLSAxKSAvICh5MSAtIHkwKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBkID0gZGF0YVtpXTtcbiAgICBjb25zdCB4aSA9IHgoZCwgaSwgZGF0YSk7XG4gICAgY29uc3QgeWkgPSB5KGQsIGksIGRhdGEpO1xuICAgIGNvbnN0IHdpID0gdyhkLCBpLCBkYXRhKTtcblxuICAgIC8vIHNraXAgTmFOIGFuZCBJbmZpbml0ZSB2YWx1ZXNcbiAgICBpZiAoIShOdW1iZXIuaXNGaW5pdGUoeGkpICYmIE51bWJlci5pc0Zpbml0ZSh5aSkgJiYgTnVtYmVyLmlzRmluaXRlKHdpKSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHhwID0gKHhpIC0geDApICogeGRlbHRhO1xuICAgIGNvbnN0IHh1ID0gTWF0aC5mbG9vcih4cCk7XG4gICAgY29uc3QgeHYgPSB4dSArIDE7XG4gICAgY29uc3QgeXAgPSAoeWkgLSB5MCkgKiB5ZGVsdGE7XG4gICAgY29uc3QgeXUgPSBNYXRoLmZsb29yKHlwKTtcbiAgICBjb25zdCB5diA9IHl1ICsgMTtcblxuICAgIGlmICgwIDw9IHh1ICYmIHh2IDwgeG4pIHtcbiAgICAgIGlmICgwIDw9IHl1ICYmIHl2IDwgeW4pIHtcbiAgICAgICAgZ3JpZFt4dSArIHl1ICogeG5dICs9ICh4diAtIHhwKSAqICh5diAtIHlwKSAqIHdpO1xuICAgICAgICBncmlkW3h1ICsgeXYgKiB4bl0gKz0gKHh2IC0geHApICogKHlwIC0geXUpICogd2k7XG4gICAgICAgIGdyaWRbeHYgKyB5dSAqIHhuXSArPSAoeHAgLSB4dSkgKiAoeXYgLSB5cCkgKiB3aTtcbiAgICAgICAgZ3JpZFt4diArIHl2ICogeG5dICs9ICh4cCAtIHh1KSAqICh5cCAtIHl1KSAqIHdpO1xuICAgICAgfSBlbHNlIGlmICh5dSA9PT0gLTEpIHtcbiAgICAgICAgZ3JpZFt4dSArIHl2ICogeG5dICs9ICh4diAtIHhwKSAqICh5cCAtIHl1KSAqIHdpO1xuICAgICAgICBncmlkW3h2ICsgeXYgKiB4bl0gKz0gKHhwIC0geHUpICogKHlwIC0geXUpICogd2k7XG4gICAgICB9IGVsc2UgaWYgKHl2ID09PSB5bikge1xuICAgICAgICBncmlkW3h2ICsgeXUgKiB4bl0gKz0gKHhwIC0geHUpICogKHl2IC0geXApICogd2k7XG4gICAgICAgIGdyaWRbeHUgKyB5dSAqIHhuXSArPSAoeHYgLSB4cCkgKiAoeXYgLSB5cCkgKiB3aTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHh1ID09PSAtMSkge1xuICAgICAgaWYgKDAgPD0geXUgJiYgeXYgPCB5bikge1xuICAgICAgICBncmlkW3h2ICsgeXUgKiB4bl0gKz0gKHhwIC0geHUpICogKHl2IC0geXApICogd2k7XG4gICAgICAgIGdyaWRbeHYgKyB5diAqIHhuXSArPSAoeHAgLSB4dSkgKiAoeXAgLSB5dSkgKiB3aTtcbiAgICAgIH0gZWxzZSBpZiAoeXUgPT09IC0xKSB7XG4gICAgICAgIGdyaWRbeHYgKyB5diAqIHhuXSArPSAoeHAgLSB4dSkgKiAoeXAgLSB5dSkgKiB3aTtcbiAgICAgIH0gZWxzZSBpZiAoeXYgPT09IHluKSB7XG4gICAgICAgIGdyaWRbeHYgKyB5dSAqIHhuXSArPSAoeHAgLSB4dSkgKiAoeXYgLSB5cCkgKiB3aTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHh2ID09PSB4bikge1xuICAgICAgaWYgKDAgPD0geXUgJiYgeXYgPCB5bikge1xuICAgICAgICBncmlkW3h1ICsgeXUgKiB4bl0gKz0gKHh2IC0geHApICogKHl2IC0geXApICogd2k7XG4gICAgICAgIGdyaWRbeHUgKyB5diAqIHhuXSArPSAoeHYgLSB4cCkgKiAoeXAgLSB5dSkgKiB3aTtcbiAgICAgIH0gZWxzZSBpZiAoeXUgPT09IC0xKSB7XG4gICAgICAgIGdyaWRbeHUgKyB5diAqIHhuXSArPSAoeHYgLSB4cCkgKiAoeXAgLSB5dSkgKiB3aTtcbiAgICAgIH0gZWxzZSBpZiAoeXYgPT09IHluKSB7XG4gICAgICAgIGdyaWRbeHUgKyB5dSAqIHhuXSArPSAoeHYgLSB4cCkgKiAoeXYgLSB5cCkgKiB3aTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZ3JpZDtcbn1cbiIsImltcG9ydCB7IGFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3Nvci5qcyc7XG5pbXBvcnQgeyBiaW4xZCB9IGZyb20gJy4vYmluMWQuanMnO1xuaW1wb3J0IHsgZGVyaWNoZUNvbmZpZywgZGVyaWNoZUNvbnYxZCB9IGZyb20gJy4vZGVyaWNoZS5qcyc7XG5pbXBvcnQgeyBleHRlbnQgYXMgZGVuc2l0eUV4dGVudCB9IGZyb20gJy4vZXh0ZW50LmpzJztcbmltcG9ydCB7IG5yZCB9IGZyb20gJy4vbnJkLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlbnNpdHkxZChkYXRhLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgeyBhZGp1c3QgPSAxLCBwYWQgPSAzLCBiaW5zID0gNTEyIH0gPSBvcHRpb25zO1xuICBjb25zdCB4ID0gYWNjZXNzb3Iob3B0aW9ucy54LCB4ID0+IHgpO1xuICBjb25zdCB3ID0gYWNjZXNzb3Iob3B0aW9ucy53ZWlnaHQsICgpID0+IDEgLyBkYXRhLmxlbmd0aCk7XG5cbiAgbGV0IGJhbmR3aWR0aCA9IG9wdGlvbnMuYmFuZHdpZHRoID8/IGFkanVzdCAqIG5yZChkYXRhLCB4KTtcblxuICBjb25zdCBbbG8sIGhpXSA9IG9wdGlvbnMuZXh0ZW50ID8/IGRlbnNpdHlFeHRlbnQoZGF0YSwgeCwgcGFkICogYmFuZHdpZHRoKTtcbiAgY29uc3QgZ3JpZCA9IGJpbjFkKGRhdGEsIHgsIHcsIGxvLCBoaSwgYmlucyk7XG4gIGNvbnN0IGRlbHRhID0gKGhpIC0gbG8pIC8gKGJpbnMgLSAxKTtcbiAgY29uc3QgbmVnID0gZ3JpZC5zb21lKHYgPT4gdiA8IDApO1xuXG4gIGxldCBjb25maWcgPSBkZXJpY2hlQ29uZmlnKGJhbmR3aWR0aCAvIGRlbHRhLCBuZWcpO1xuICBsZXQgcmVzdWx0O1xuXG4gIGZ1bmN0aW9uKiBwb2ludHMoeCA9ICd4JywgeSA9ICd5Jykge1xuICAgIGNvbnN0IHJlc3VsdCA9IGVzdGltYXRvci5ncmlkKCk7XG4gICAgY29uc3Qgc2NhbGUgPSAxIC8gZGVsdGE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaW5zOyArK2kpIHtcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgW3hdOiBsbyArIGkgKiBkZWx0YSxcbiAgICAgICAgW3ldOiByZXN1bHRbaV0gKiBzY2FsZVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBlc3RpbWF0b3IgPSB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06IHBvaW50cyxcbiAgICBwb2ludHMsXG4gICAgZ3JpZDogKCkgPT4gcmVzdWx0IHx8IChyZXN1bHQgPSBkZXJpY2hlQ29udjFkKGNvbmZpZywgZ3JpZCwgYmlucykpLFxuICAgIGV4dGVudDogKCkgPT4gW2xvLCBoaV0sXG4gICAgYmFuZHdpZHRoKF8pIHtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIGlmIChfICE9PSBiYW5kd2lkdGgpIHtcbiAgICAgICAgICBiYW5kd2lkdGggPSBfO1xuICAgICAgICAgIHJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgY29uZmlnID0gZGVyaWNoZUNvbmZpZyhiYW5kd2lkdGggLyBkZWx0YSwgbmVnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXN0aW1hdG9yO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGJhbmR3aWR0aDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGVzdGltYXRvcjtcbn1cbiIsImltcG9ydCB7IGFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3Nvci5qcyc7XG5pbXBvcnQgeyBiaW4yZCB9IGZyb20gJy4vYmluMmQuanMnO1xuaW1wb3J0IHsgZGVyaWNoZUNvbmZpZywgZGVyaWNoZUNvbnYyZCB9IGZyb20gJy4vZGVyaWNoZS5qcyc7XG5pbXBvcnQgeyBleHRlbnQgYXMgZGVuc2l0eUV4dGVudCB9IGZyb20gJy4vZXh0ZW50LmpzJztcbmltcG9ydCB7IGhlYXRtYXAgfSBmcm9tICcuL2hlYXRtYXAuanMnO1xuaW1wb3J0IHsgbnJkIH0gZnJvbSAnLi9ucmQuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVuc2l0eTJkKGRhdGEsIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7IGFkanVzdCA9IDEsIHBhZCA9IDMsIGJpbnMgPSBbMjU2LCAyNTZdIH0gPSBvcHRpb25zO1xuICBjb25zdCB4ID0gYWNjZXNzb3Iob3B0aW9ucy54LCBkID0+IGRbMF0pO1xuICBjb25zdCB5ID0gYWNjZXNzb3Iob3B0aW9ucy55LCBkID0+IGRbMV0pO1xuICBjb25zdCB3ID0gYWNjZXNzb3Iob3B0aW9ucy53ZWlnaHQsICgpID0+IDEgLyBkYXRhLmxlbmd0aCk7XG5cbiAgbGV0IFtcbiAgICBid1ggPSBhZGp1c3QgKiBucmQoZGF0YSwgeCksXG4gICAgYndZID0gYWRqdXN0ICogbnJkKGRhdGEsIHkpXG4gIF0gPSBudW1iZXIyKG9wdGlvbnMuYmFuZHdpZHRoKTtcblxuICBjb25zdCBbXG4gICAgW3gwLCB4MV0gPSBkZW5zaXR5RXh0ZW50KGRhdGEsIHgsIHBhZCAqIGJ3WCksXG4gICAgW3kwLCB5MV0gPSBkZW5zaXR5RXh0ZW50KGRhdGEsIHksIHBhZCAqIGJ3WSlcbiAgXSA9IG51bWJlcjJfMihvcHRpb25zLmV4dGVudCk7XG5cbiAgY29uc3QgW2JpbnNYLCBiaW5zWV0gPSBudW1iZXIyKGJpbnMpO1xuXG4gIGNvbnN0IGdyaWQgPSBiaW4yZChkYXRhLCB4LCB5LCB3LCB4MCwgeDEsIGJpbnNYLCB5MCwgeTEsIGJpbnNZKTtcbiAgY29uc3QgZGVsdGFYID0gKHgxIC0geDApIC8gKGJpbnNYIC0gMSk7XG4gIGNvbnN0IGRlbHRhWSA9ICh5MSAtIHkwKSAvIChiaW5zWSAtIDEpO1xuICBjb25zdCBuZWcgPSBncmlkLnNvbWUodiA9PiB2IDwgMCk7XG5cbiAgbGV0IGNvbmZpZ1ggPSBkZXJpY2hlQ29uZmlnKGJ3WCAvIGRlbHRhWCwgbmVnKTtcbiAgbGV0IGNvbmZpZ1kgPSBkZXJpY2hlQ29uZmlnKGJ3WSAvIGRlbHRhWSwgbmVnKTtcbiAgbGV0IHJlc3VsdDtcblxuICBmdW5jdGlvbiogcG9pbnRzKHggPSAneCcsIHkgPSAneScsIHogPSAneicpIHtcbiAgICBjb25zdCByZXN1bHQgPSBlc3RpbWF0b3IuZ3JpZCgpO1xuICAgIGNvbnN0IHNjYWxlID0gMSAvIChkZWx0YVggKiBkZWx0YVkpO1xuICAgIGZvciAobGV0IGsgPSAwLCBqID0gMDsgaiA8IGJpbnNZOyArK2opIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmluc1g7ICsraSwgKytrKSB7XG4gICAgICAgIHlpZWxkIHtcbiAgICAgICAgICBbeF06IHgwICsgaSAqIGRlbHRhWCxcbiAgICAgICAgICBbeV06IHkwICsgaiAqIGRlbHRhWSxcbiAgICAgICAgICBbel06IHJlc3VsdFtrXSAqIHNjYWxlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXN0aW1hdG9yID0ge1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiBwb2ludHMsXG4gICAgcG9pbnRzLFxuICAgIGdyaWQ6ICgpID0+IHJlc3VsdCB8fCAocmVzdWx0ID0gZGVyaWNoZUNvbnYyZChjb25maWdYLCBjb25maWdZLCBncmlkLCBbYmluc1gsIGJpbnNZXSkpLFxuICAgIGV4dGVudDogKCkgPT4gWyBbeDAsIHgxXSwgW3kwLCB5MV0gXSxcbiAgICBoZWF0bWFwOiAoeyBjb2xvciwgY2xhbXAsIGNhbnZhcywgbWF4Q29sb3JzIH0gPSB7fSkgPT5cbiAgICAgIGhlYXRtYXAoZXN0aW1hdG9yLmdyaWQoKSwgYmluc1gsIGJpbnNZLCBjb2xvciwgY2xhbXAsIGNhbnZhcywgbWF4Q29sb3JzKSxcbiAgICBiYW5kd2lkdGgoXykge1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgW18wLCBfMV0gPSBudW1iZXIyKF8pO1xuICAgICAgICBpZiAoXzAgIT09IGJ3WCkge1xuICAgICAgICAgIHJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgY29uZmlnWCA9IGRlcmljaGVDb25maWcoKGJ3WCA9IF8wKSAvIGRlbHRhWCwgbmVnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXzEgIT09IGJ3WSkge1xuICAgICAgICAgIHJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgY29uZmlnWSA9IGRlcmljaGVDb25maWcoKGJ3WSA9IF8xKSAvIGRlbHRhWSwgbmVnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXN0aW1hdG9yO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtid1gsIGJ3WV07XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBlc3RpbWF0b3I7XG59XG5cbmZ1bmN0aW9uIG51bWJlcjIoXykge1xuICByZXR1cm4gXyA9PSBudWxsID8gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXVxuICAgIDogdHlwZW9mIF8gPT09ICdudW1iZXInID8gW18sIF9dXG4gICAgOiBfO1xufVxuXG5mdW5jdGlvbiBudW1iZXIyXzIoXykge1xuICByZXR1cm4gXyA9PSBudWxsID8gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXVxuICAgIDogdHlwZW9mIF9bMF0gPT09ICdudW1iZXInID8gW18sIF9dXG4gICAgOiBfO1xufVxuIiwiLy8gRGVyaWNoZSdzIGFwcHJveGltYXRpb24gb2YgR2F1c3NpYW4gc21vb3RoaW5nXG4vLyBBZGFwdGVkIGZyb20gR2V0cmV1ZXIncyBDIGltcGxlbWVudGF0aW9uIChCU0QgbGljZW5zZSlcbi8vIGh0dHBzOi8vd3d3Lmlwb2wuaW0vcHViL2FydC8yMDEzLzg3L2dhdXNzaWFuXzIwMTMxMjE1LnRnelxuLy8gaHR0cDovL2Rldi5pcG9sLmltL35nZXRyZXVlci9jb2RlL2RvYy9nYXVzc2lhbl8yMDEzMTIxNV9kb2MvZ2F1c3NpYW5fX2NvbnZfX2RlcmljaGVfOGMuaHRtbFxuXG5leHBvcnQgZnVuY3Rpb24gZGVyaWNoZUNvbmZpZyhzaWdtYSwgbmVnYXRpdmUgPSBmYWxzZSkge1xuICAvLyBjb21wdXRlIGNhdXNhbCBmaWx0ZXIgY29lZmZpY2llbnRzXG4gIGNvbnN0IGEgPSBuZXcgRmxvYXQ2NEFycmF5KDUpO1xuICBjb25zdCBiYyA9IG5ldyBGbG9hdDY0QXJyYXkoNCk7XG4gIGRlcmljaGVDYXVzYWxDb2VmZihhLCBiYywgc2lnbWEpO1xuXG4gIC8vIG51bWVyYXRvciBjb2VmZmljaWVudHMgb2YgdGhlIGFudGljYXVzYWwgZmlsdGVyXG4gIGNvbnN0IGJhID0gRmxvYXQ2NEFycmF5Lm9mKFxuICAgIDAsXG4gICAgYmNbMV0gLSBhWzFdICogYmNbMF0sXG4gICAgYmNbMl0gLSBhWzJdICogYmNbMF0sXG4gICAgYmNbM10gLSBhWzNdICogYmNbMF0sXG4gICAgLWFbNF0gKiBiY1swXVxuICApO1xuXG4gIC8vIGltcHVsc2UgcmVzcG9uc2Ugc3Vtc1xuICBjb25zdCBhY2N1bV9kZW5vbSA9IDEuMCArIGFbMV0gKyBhWzJdICsgYVszXSArIGFbNF07XG4gIGNvbnN0IHN1bV9jYXVzYWwgPSAoYmNbMF0gKyBiY1sxXSArIGJjWzJdICsgYmNbM10pIC8gYWNjdW1fZGVub207XG4gIGNvbnN0IHN1bV9hbnRpY2F1c2FsID0gKGJhWzFdICsgYmFbMl0gKyBiYVszXSArIGJhWzRdKSAvIGFjY3VtX2Rlbm9tO1xuXG4gIC8vIGNvZWZmaWNpZW50cyBvYmplY3RcbiAgcmV0dXJuIHtcbiAgICBzaWdtYSxcbiAgICBuZWdhdGl2ZSxcbiAgICBhLFxuICAgIGJfY2F1c2FsOiBiYyxcbiAgICBiX2FudGljYXVzYWw6IGJhLFxuICAgIHN1bV9jYXVzYWwsXG4gICAgc3VtX2FudGljYXVzYWxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVyaWNoZUNhdXNhbENvZWZmKGFfb3V0LCBiX291dCwgc2lnbWEpIHtcbiAgY29uc3QgSyA9IDQ7XG5cbiAgY29uc3QgYWxwaGEgPSBGbG9hdDY0QXJyYXkub2YoXG4gICAgMC44NCwgMS44Njc1LFxuICAgIDAuODQsIC0xLjg2NzUsXG4gICAgLTAuMzQwMTUsIC0wLjEyOTksXG4gICAgLTAuMzQwMTUsIDAuMTI5OVxuICApO1xuXG4gIGNvbnN0IHgxID0gTWF0aC5leHAoLTEuNzgzIC8gc2lnbWEpO1xuICBjb25zdCB4MiA9IE1hdGguZXhwKC0xLjcyMyAvIHNpZ21hKTtcbiAgY29uc3QgeTEgPSAwLjYzMTggLyBzaWdtYTtcbiAgY29uc3QgeTIgPSAxLjk5NyAvIHNpZ21hO1xuICBjb25zdCBiZXRhID0gRmxvYXQ2NEFycmF5Lm9mKFxuICAgIC14MSAqIE1hdGguY29zKCB5MSksIHgxICogTWF0aC5zaW4oIHkxKSxcbiAgICAteDEgKiBNYXRoLmNvcygteTEpLCB4MSAqIE1hdGguc2luKC15MSksXG4gICAgLXgyICogTWF0aC5jb3MoIHkyKSwgeDIgKiBNYXRoLnNpbiggeTIpLFxuICAgIC14MiAqIE1hdGguY29zKC15MiksIHgyICogTWF0aC5zaW4oLXkyKVxuICApO1xuXG4gIGNvbnN0IGRlbm9tID0gc2lnbWEgKiAyLjUwNjYyODI3NDYzMTAwMDc7XG5cbiAgLy8gaW5pdGlhbGl6ZSBiL2EgPSBhbHBoYVswXSAvICgxICsgYmV0YVswXSB6Xi0xKVxuICBjb25zdCBiID0gRmxvYXQ2NEFycmF5Lm9mKGFscGhhWzBdLCBhbHBoYVsxXSwgMCwgMCwgMCwgMCwgMCwgMCk7XG4gIGNvbnN0IGEgPSBGbG9hdDY0QXJyYXkub2YoMSwgMCwgYmV0YVswXSwgYmV0YVsxXSwgMCwgMCwgMCwgMCwgMCwgMCk7XG5cbiAgbGV0IGosIGs7XG5cbiAgZm9yIChrID0gMjsgayA8IDg7IGsgKz0gMikge1xuICAgIC8vIGFkZCBrdGggdGVybSwgYi9hICs9IGFscGhhW2tdIC8gKDEgKyBiZXRhW2tdIHpeLTEpXG4gICAgYltrXSAgICAgPSBiZXRhW2tdICogYltrIC0gMl0gLSBiZXRhW2sgKyAxXSAqIGJbayAtIDFdO1xuICAgIGJbayArIDFdID0gYmV0YVtrXSAqIGJbayAtIDFdICsgYmV0YVtrICsgMV0gKiBiW2sgLSAyXTtcbiAgICBmb3IgKGogPSBrIC0gMjsgaiA+IDA7IGogLT0gMikge1xuICAgICAgYltqXSAgICAgKz0gYmV0YVtrXSAqIGJbaiAtIDJdIC0gYmV0YVtrICsgMV0gKiBiW2ogLSAxXTtcbiAgICAgIGJbaiArIDFdICs9IGJldGFba10gKiBiW2ogLSAxXSArIGJldGFbayArIDFdICogYltqIC0gMl07XG4gICAgfVxuICAgIGZvciAoaiA9IDA7IGogPD0gazsgaiArPSAyKSB7XG4gICAgICBiW2pdICAgICArPSBhbHBoYVtrXSAqIGFbal0gICAgIC0gYWxwaGFbayArIDFdICogYVtqICsgMV07XG4gICAgICBiW2ogKyAxXSArPSBhbHBoYVtrXSAqIGFbaiArIDFdICsgYWxwaGFbayArIDFdICogYVtqXTtcbiAgICB9XG5cbiAgICBhW2sgKyAyXSA9IGJldGFba10gKiBhW2tdICAgICAtIGJldGFbayArIDFdICogYVtrICsgMV07XG4gICAgYVtrICsgM10gPSBiZXRhW2tdICogYVtrICsgMV0gKyBiZXRhW2sgKyAxXSAqIGFba107XG4gICAgZm9yIChqID0gazsgaiA+IDA7IGogLT0gMikge1xuICAgICAgYVtqXSAgICAgKz0gYmV0YVtrXSAqIGFbaiAtIDJdIC0gYmV0YVtrICsgMV0gKiBhW2ogLSAxXTtcbiAgICAgIGFbaiArIDFdICs9IGJldGFba10gKiBhW2ogLSAxXSArIGJldGFbayArIDFdICogYVtqIC0gMl07XG4gICAgfVxuICB9XG5cbiAgZm9yIChrID0gMDsgayA8IEs7ICsraykge1xuICAgIGogPSBrIDw8IDE7XG4gICAgYl9vdXRba10gPSBiW2pdIC8gZGVub207XG4gICAgYV9vdXRbayArIDFdID0gYVtqICsgMl07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlcmljaGVDb252MmQoY3gsIGN5LCBncmlkLCBbbngsIG55XSkge1xuICAvLyBhbGxvY2F0ZSBidWZmZXJzXG4gIGNvbnN0IHljID0gbmV3IEZsb2F0NjRBcnJheShNYXRoLm1heChueCwgbnkpKTsgLy8gY2F1c2FsXG4gIGNvbnN0IHlhID0gbmV3IEZsb2F0NjRBcnJheShNYXRoLm1heChueCwgbnkpKTsgLy8gYW50aWNhdXNhbFxuICBjb25zdCBoID0gbmV3IEZsb2F0NjRBcnJheSg1KTtcbiAgY29uc3QgZCA9IG5ldyBGbG9hdDY0QXJyYXkoZ3JpZC5sZW5ndGgpO1xuXG4gIC8vIGNvbnZvbHZlIHJvd3NcbiAgZm9yIChsZXQgcm93ID0gMCwgcjAgPSAwOyByb3cgPCBueTsgKytyb3csIHIwICs9IG54KSB7XG4gICAgY29uc3QgZHggPSBkLnN1YmFycmF5KHIwKTtcbiAgICBkZXJpY2hlQ29udjFkKGN4LCBncmlkLnN1YmFycmF5KHIwKSwgbngsIDEsIHljLCB5YSwgaCwgZHgpO1xuICB9XG5cbiAgLy8gY29udm9sdmUgY29sdW1uc1xuICBmb3IgKGxldCBjMCA9IDA7IGMwIDwgbng7ICsrYzApIHtcbiAgICBjb25zdCBkeSA9IGQuc3ViYXJyYXkoYzApO1xuICAgIGRlcmljaGVDb252MWQoY3ksIGR5LCBueSwgbngsIHljLCB5YSwgaCwgZHkpO1xuICB9XG5cbiAgcmV0dXJuIGQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXJpY2hlQ29udjFkKFxuICBjLCBzcmMsIE4sXG4gIHN0cmlkZSA9IDEsXG4gIHlfY2F1c2FsID0gbmV3IEZsb2F0NjRBcnJheShOKSxcbiAgeV9hbnRpY2F1c2FsID0gbmV3IEZsb2F0NjRBcnJheShOKSxcbiAgaCA9IG5ldyBGbG9hdDY0QXJyYXkoNSksXG4gIGQgPSB5X2NhdXNhbCxcbiAgaW5pdCA9IGRlcmljaGVJbml0WmVyb1BhZFxuKSB7XG4gIGNvbnN0IHN0cmlkZV8yID0gc3RyaWRlICogMjtcbiAgY29uc3Qgc3RyaWRlXzMgPSBzdHJpZGUgKiAzO1xuICBjb25zdCBzdHJpZGVfNCA9IHN0cmlkZSAqIDQ7XG4gIGNvbnN0IHN0cmlkZV9OID0gc3RyaWRlICogTjtcbiAgbGV0IGksIG47XG5cbiAgLy8gaW5pdGlhbGl6ZSBjYXVzYWwgZmlsdGVyIG9uIHRoZSBsZWZ0IGJvdW5kYXJ5XG4gIGluaXQoXG4gICAgeV9jYXVzYWwsIHNyYywgTiwgc3RyaWRlLFxuICAgIGMuYl9jYXVzYWwsIDMsIGMuYSwgNCwgYy5zdW1fY2F1c2FsLCBoLCBjLnNpZ21hXG4gICk7XG5cbiAgLy8gZmlsdGVyIHRoZSBpbnRlcmlvciBzYW1wbGVzIHVzaW5nIGEgNHRoIG9yZGVyIGZpbHRlci4gSW1wbGVtZW50czpcbiAgLy8gZm9yIG4gPSBLLCAuLi4sIE4gLSAxLFxuICAvLyAgIHleKyhuKSA9IFxcc3VtX3trPTB9XntLLTF9IGJeK19rIHNyYyhuIC0gaylcbiAgLy8gICAgICAgICAgLSBcXHN1bV97az0xfV5LIGFfayB5XisobiAtIGspXG4gIC8vIHZhcmlhYmxlIGkgdHJhY2tzIHRoZSBvZmZzZXQgdG8gdGhlIG50aCBzYW1wbGUgb2Ygc3JjLCBpdCBpc1xuICAvLyB1cGRhdGVkIHRvZ2V0aGVyIHdpdGggbiBzdWNoIHRoYXQgaSA9IHN0cmlkZSAqIG4uXG4gIGZvciAobiA9IDQsIGkgPSBzdHJpZGVfNDsgbiA8IE47ICsrbiwgaSArPSBzdHJpZGUpIHtcbiAgICB5X2NhdXNhbFtuXSA9IGMuYl9jYXVzYWxbMF0gKiBzcmNbaV1cbiAgICAgICsgYy5iX2NhdXNhbFsxXSAqIHNyY1tpIC0gc3RyaWRlXVxuICAgICAgKyBjLmJfY2F1c2FsWzJdICogc3JjW2kgLSBzdHJpZGVfMl1cbiAgICAgICsgYy5iX2NhdXNhbFszXSAqIHNyY1tpIC0gc3RyaWRlXzNdXG4gICAgICAtIGMuYVsxXSAqIHlfY2F1c2FsW24gLSAxXVxuICAgICAgLSBjLmFbMl0gKiB5X2NhdXNhbFtuIC0gMl1cbiAgICAgIC0gYy5hWzNdICogeV9jYXVzYWxbbiAtIDNdXG4gICAgICAtIGMuYVs0XSAqIHlfY2F1c2FsW24gLSA0XTtcbiAgfVxuXG4gIC8vIGluaXRpYWxpemUgdGhlIGFudGljYXVzYWwgZmlsdGVyIG9uIHRoZSByaWdodCBib3VuZGFyeVxuICBpbml0KFxuICAgIHlfYW50aWNhdXNhbCwgc3JjLCBOLCAtc3RyaWRlLFxuICAgIGMuYl9hbnRpY2F1c2FsLCA0LCBjLmEsIDQsIGMuc3VtX2FudGljYXVzYWwsIGgsIGMuc2lnbWFcbiAgKTtcblxuICAvLyBzaW1pbGFyIHRvIHRoZSBjYXVzYWwgZmlsdGVyIGFib3ZlLCB0aGUgZm9sbG93aW5nIGltcGxlbWVudHM6XG4gIC8vIGZvciBuID0gSywgLi4uLCBOIC0gMSxcbiAgLy8gICB5Xi0obikgPSBcXHN1bV97az0xfV5LIGJeLV9rIHNyYyhOIC0gbiAtIDEgLSBrKVxuICAvLyAgICAgICAgICAtIFxcc3VtX3trPTF9XksgYV9rIHleLShuIC0gaylcbiAgLy8gdmFyaWFibGUgaSBpcyB1cGRhdGVkIHN1Y2ggdGhhdCBpID0gc3RyaWRlICogKE4gLSBuIC0gMSkuXG4gIGZvciAobiA9IDQsIGkgPSBzdHJpZGVfTiAtIHN0cmlkZSAqIDU7IG4gPCBOOyArK24sIGkgLT0gc3RyaWRlKSB7XG4gICAgeV9hbnRpY2F1c2FsW25dID0gYy5iX2FudGljYXVzYWxbMV0gKiBzcmNbaSArIHN0cmlkZV1cbiAgICAgICsgYy5iX2FudGljYXVzYWxbMl0gKiBzcmNbaSArIHN0cmlkZV8yXVxuICAgICAgKyBjLmJfYW50aWNhdXNhbFszXSAqIHNyY1tpICsgc3RyaWRlXzNdXG4gICAgICArIGMuYl9hbnRpY2F1c2FsWzRdICogc3JjW2kgKyBzdHJpZGVfNF1cbiAgICAgIC0gYy5hWzFdICogeV9hbnRpY2F1c2FsW24gLSAxXVxuICAgICAgLSBjLmFbMl0gKiB5X2FudGljYXVzYWxbbiAtIDJdXG4gICAgICAtIGMuYVszXSAqIHlfYW50aWNhdXNhbFtuIC0gM11cbiAgICAgIC0gYy5hWzRdICogeV9hbnRpY2F1c2FsW24gLSA0XTtcbiAgfVxuXG4gIC8vIHN1bSB0aGUgY2F1c2FsIGFuZCBhbnRpY2F1c2FsIHJlc3BvbnNlcyB0byBvYnRhaW4gdGhlIGZpbmFsIHJlc3VsdFxuICBpZiAoYy5uZWdhdGl2ZSkge1xuICAgIC8vIGRvIG5vdCB0aHJlc2hvbGQgaWYgdGhlIGlucHV0IGdyaWQgaW5jbHVkZXMgbmVnYXRpdmVseSB3ZWlnaHRlZCB2YWx1ZXNcbiAgICBmb3IgKG4gPSAwLCBpID0gMDsgbiA8IE47ICsrbiwgaSArPSBzdHJpZGUpIHtcbiAgICAgIGRbaV0gPSB5X2NhdXNhbFtuXSArIHlfYW50aWNhdXNhbFtOIC0gbiAtIDFdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyB0aHJlc2hvbGQgdG8gcHJldmVudCBzbWFsbCBuZWdhdGl2ZSB2YWx1ZXMgZHVlIHRvIGZsb2F0aW5nIHBvaW50IGVycm9yXG4gICAgZm9yIChuID0gMCwgaSA9IDA7IG4gPCBOOyArK24sIGkgKz0gc3RyaWRlKSB7XG4gICAgICBkW2ldID0gTWF0aC5tYXgoMCwgeV9jYXVzYWxbbl0gKyB5X2FudGljYXVzYWxbTiAtIG4gLSAxXSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXJpY2hlSW5pdFplcm9QYWQoZGVzdCwgc3JjLCBOLCBzdHJpZGUsIGIsIHAsIGEsIHEsIHN1bSwgaCkge1xuICBjb25zdCBzdHJpZGVfTiA9IE1hdGguYWJzKHN0cmlkZSkgKiBOO1xuICBjb25zdCBvZmYgPSBzdHJpZGUgPCAwID8gc3RyaWRlX04gKyBzdHJpZGUgOiAwO1xuICBsZXQgaSwgbiwgbTtcblxuICAvLyBjb21wdXRlIHRoZSBmaXJzdCBxIHRhcHMgb2YgdGhlIGltcHVsc2UgcmVzcG9uc2UsIGhfMCwgLi4uLCBoX3txLTF9XG4gIGZvciAobiA9IDA7IG4gPCBxOyArK24pIHtcbiAgICBoW25dID0gKG4gPD0gcCkgPyBiW25dIDogMDtcbiAgICBmb3IgKG0gPSAxOyBtIDw9IHEgJiYgbSA8PSBuOyArK20pIHtcbiAgICAgIGhbbl0gLT0gYVttXSAqIGhbbiAtIG1dO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNvbXB1dGUgZGVzdF9tID0gc3VtX3tuPTF9Xm0gaF97bS1ufSBzcmNfbiwgbSA9IDAsIC4uLiwgcS0xXG4gIC8vIG5vdGU6IHEgPT0gNFxuICBmb3IgKG0gPSAwOyBtIDwgcTsgKyttKSB7XG4gICAgZm9yIChkZXN0W21dID0gMCwgbiA9IDE7IG4gPD0gbTsgKytuKSB7XG4gICAgICBpID0gb2ZmICsgc3RyaWRlICogbjtcbiAgICAgIGlmIChpID49IDAgJiYgaSA8IHN0cmlkZV9OKSB7XG4gICAgICAgIGRlc3RbbV0gKz0gaFttIC0gbl0gKiBzcmNbaV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZGVzdF9tID0gZGVzdF9tICsgaF97bittfSBzcmNfey1ufVxuICBjb25zdCBjdXIgPSBzcmNbb2ZmXTtcbiAgaWYgKGN1ciA+IDApIHtcbiAgICBmb3IgKG0gPSAwOyBtIDwgcTsgKyttKSB7XG4gICAgICBkZXN0W21dICs9IGhbbV0gKiBjdXI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGV4dGVudChkYXRhLCB4LCBwYWQgPSAwKSB7XG4gIGNvbnN0IG4gPSBkYXRhLmxlbmd0aDtcbiAgbGV0IGxvO1xuICBsZXQgaGk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgY29uc3QgdiA9IHgoZGF0YVtpXSwgaSwgZGF0YSk7XG4gICAgaWYgKHYgIT0gbnVsbCkge1xuICAgICAgaWYgKGxvID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHYgPj0gdikgbG8gPSBoaSA9IHY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodiA8IGxvKSBsbyA9IHY7XG4gICAgICAgIGlmICh2ID4gaGkpIGhpID0gdjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtsbyAtIHBhZCwgaGkgKyBwYWRdO1xufVxuIiwiaW1wb3J0IHsgcmdiIH0gZnJvbSAnZDMtY29sb3InO1xuXG5leHBvcnQgZnVuY3Rpb24gaGVhdG1hcChcbiAgZ3JpZCxcbiAgdyxcbiAgaCxcbiAgY29sb3IgPSBvcGFjaXR5TWFwKDAsIDAsIDApLFxuICBbbG8sIGhpXSA9IFttaW4oZ3JpZCwgMCksIG1heChncmlkLCAwKV0sXG4gIGNhbnZhcyA9IGNyZWF0ZUNhbnZhcyh3LCBoKSxcbiAgcGFsZXR0ZVNpemUgPSAyNTZcbikge1xuICBjb25zdCBub3JtID0gMSAvIChoaSAtIGxvKTtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gIGNvbnN0IGltZyA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdywgaCk7XG4gIGNvbnN0IHBpeCA9IGltZy5kYXRhO1xuICBjb25zdCBzaXplID0gcGFsZXR0ZVNpemUgLSAxO1xuICBjb25zdCBwYWxldHRlID0gYnVpbGRQYWxldHRlKHNpemUsIGNvbG9yKTtcblxuICBmb3IgKGxldCBqID0gMCwgayA9IDA7IGogPCBoOyArK2opIHtcbiAgICBmb3IgKGxldCBpID0gMCwgcm93ID0gKGggLSBqIC0gMSkgKiB3OyBpIDwgdzsgKytpLCBrICs9IDQpIHtcbiAgICAgIGNvbnN0IHYgPSBNYXRoLm1pbigxLCBNYXRoLm1heChncmlkW2kgKyByb3ddIC0gbG8sIDApICogbm9ybSk7XG4gICAgICBjb25zdCBjID0gKHNpemUgKiB2KSA8PCAyO1xuICAgICAgcGl4W2sgKyAwXSA9IHBhbGV0dGVbYyArIDBdO1xuICAgICAgcGl4W2sgKyAxXSA9IHBhbGV0dGVbYyArIDFdO1xuICAgICAgcGl4W2sgKyAyXSA9IHBhbGV0dGVbYyArIDJdO1xuICAgICAgcGl4W2sgKyAzXSA9IHBhbGV0dGVbYyArIDNdO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5wdXRJbWFnZURhdGEoaW1nLCAwLCAwKTtcbiAgcmV0dXJuIGNhbnZhcztcbn1cblxuZnVuY3Rpb24gYnVpbGRQYWxldHRlKHNpemUsIGludGVycCkge1xuICBjb25zdCBwID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDQgKiAoc2l6ZSArIDEpKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gc2l6ZTsgKytpKSB7XG4gICAgY29uc3QgdiA9IGludGVycChpIC8gc2l6ZSk7XG4gICAgY29uc3Qge3IsIGcsIGIsIG9wYWNpdHkgPSAxfSA9IHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IHJnYih2KSA6IHY7XG4gICAgY29uc3QgayA9IGkgPDwgMjtcbiAgICBwW2sgKyAwXSA9IHI7XG4gICAgcFtrICsgMV0gPSBnO1xuICAgIHBbayArIDJdID0gYjtcbiAgICBwW2sgKyAzXSA9ICgyNTUgKiBvcGFjaXR5KSB8IDA7XG4gIH1cbiAgcmV0dXJuIHA7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNhbnZhcyh3LCBoKSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgY29uc3QgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGMuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHcpO1xuICAgIGMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBoKTtcbiAgICByZXR1cm4gYztcbiAgfVxuICB0aHJvdyAnQ2FuIG5vdCBjcmVhdGUgYSBjYW52YXMgaW5zdGFuY2UsIHByb3ZpZGUgYSBjYW52YXMgYXMgYSBwYXJhbWV0ZXIuJztcbn1cblxuZnVuY3Rpb24gbWF4KGFycmF5LCB2KSB7XG4gIGNvbnN0IG4gPSBhcnJheS5sZW5ndGg7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKGFycmF5W2ldID4gdikgdiA9IGFycmF5W2ldO1xuICB9XG4gIHJldHVybiB2O1xufVxuXG5mdW5jdGlvbiBtaW4oYXJyYXksIHYpIHtcbiAgY29uc3QgbiA9IGFycmF5Lmxlbmd0aDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAoYXJyYXlbaV0gPCB2KSB2ID0gYXJyYXlbaV07XG4gIH1cbiAgcmV0dXJuIHY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvcGFjaXR5TWFwKHIsIGcsIGIpIHtcbiAgcmV0dXJuIG9wYWNpdHkgPT4gKHsgciwgZywgYiwgb3BhY2l0eSB9KTtcbn1cbiIsImV4cG9ydCB7IGRlbnNpdHkxZCB9IGZyb20gJy4vZGVuc2l0eTFkLmpzJztcbmV4cG9ydCB7IGRlbnNpdHkyZCB9IGZyb20gJy4vZGVuc2l0eTJkLmpzJztcbmV4cG9ydCB7IG5yZCB9IGZyb20gJy4vbnJkLmpzJztcbmV4cG9ydCB7IG9wYWNpdHlNYXAgfSBmcm9tICcuL2hlYXRtYXAuanMnO1xuIiwiLy8gU2NvdHQsIEQuIFcuICgxOTkyKSBNdWx0aXZhcmlhdGUgRGVuc2l0eSBFc3RpbWF0aW9uOlxuLy8gVGhlb3J5LCBQcmFjdGljZSwgYW5kIFZpc3VhbGl6YXRpb24uIFdpbGV5LlxuZXhwb3J0IGZ1bmN0aW9uIG5yZChkYXRhLCB4KSB7XG4gIGNvbnN0IHZhbHVlcyA9IGRhdGEubWFwKHgpLmZpbHRlcih2ID0+IHYgIT0gbnVsbCAmJiB2ID49IHYpO1xuICB2YWx1ZXMuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICBjb25zdCBzZCA9IHN0ZGV2KHZhbHVlcyk7XG4gIGNvbnN0IHExID0gcXVhbnRpbGUodmFsdWVzLCAwLjI1KTtcbiAgY29uc3QgcTMgPSBxdWFudGlsZSh2YWx1ZXMsIDAuNzUpO1xuXG4gIGNvbnN0IG4gPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgICBoID0gKHEzIC0gcTEpIC8gMS4zNCxcbiAgICAgICAgdiA9IE1hdGgubWluKHNkLCBoKSB8fCBzZCB8fCBNYXRoLmFicyhxMSkgfHwgMTtcblxuICByZXR1cm4gMS4wNiAqIHYgKiBNYXRoLnBvdyhuLCAtMC4yKTtcbn1cblxuZnVuY3Rpb24gc3RkZXYodmFsdWVzKSB7XG4gIGNvbnN0IG4gPSB2YWx1ZXMubGVuZ3RoO1xuICBsZXQgY291bnQgPSAwO1xuICBsZXQgZGVsdGE7XG4gIGxldCBtZWFuID0gMDtcbiAgbGV0IHN1bSA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbaV07XG4gICAgZGVsdGEgPSB2YWx1ZSAtIG1lYW47XG4gICAgbWVhbiArPSBkZWx0YSAvICsrY291bnQ7XG4gICAgc3VtICs9IGRlbHRhICogKHZhbHVlIC0gbWVhbik7XG4gIH1cbiAgcmV0dXJuIGNvdW50ID4gMSA/IE1hdGguc3FydChzdW0gLyAoY291bnQgLSAxKSkgOiBOYU47XG59XG5cbmZ1bmN0aW9uIHF1YW50aWxlKHZhbHVlcywgcCkge1xuICBjb25zdCBuID0gdmFsdWVzLmxlbmd0aDtcblxuICBpZiAoIW4pIHJldHVybiBOYU47XG4gIGlmICgocCA9ICtwKSA8PSAwIHx8IG4gPCAyKSByZXR1cm4gdmFsdWVzWzBdO1xuICBpZiAocCA+PSAxKSByZXR1cm4gdmFsdWVzW24gLSAxXTtcblxuICBjb25zdCBpID0gKG4gLSAxKSAqIHA7XG4gIGNvbnN0IGkwID0gTWF0aC5mbG9vcihpKTtcbiAgY29uc3QgdjAgPSB2YWx1ZXNbaTBdO1xuICByZXR1cm4gdjAgKyAodmFsdWVzW2kwICsgMV0gLSB2MCkgKiAoaSAtIGkwKTtcbn1cbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuLy8gaW50ZXJuYWwgaW1wb3J0c1xyXG5pbXBvcnQgeyBHZW9DYW52YXMgfSBmcm9tICcuL0dlb0NhbnZhcy5qcydcclxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuL0xheWVyLmpzJ1xyXG5pbXBvcnQgeyBEYXRhc2V0IH0gZnJvbSAnLi9EYXRhc2V0LmpzJ1xyXG5pbXBvcnQgeyBUb29sdGlwIH0gZnJvbSAnLi9Ub29sdGlwLmpzJ1xyXG5pbXBvcnQgeyBDU1ZHcmlkIH0gZnJvbSAnLi9kYXRhc2V0L0NTVkdyaWQuanMnXHJcbi8vaW1wb3J0IHsgUGFycXVldEdyaWQgfSBmcm9tICcuL2RhdGFzZXQvUGFycXVldEdyaWQnO1xyXG5pbXBvcnQgeyBUaWxlZEdyaWQgfSBmcm9tICcuL2RhdGFzZXQvVGlsZWRHcmlkLmpzJ1xyXG5pbXBvcnQgeyBCYWNrZ3JvdW5kTGF5ZXIgfSBmcm9tICcuL0JhY2tncm91bmRMYXllci5qcydcclxuaW1wb3J0IHsgQmFja2dyb3VuZExheWVyV01TIH0gZnJvbSAnLi9CYWNrZ3JvdW5kTGF5ZXJXTVMuanMnXHJcbmltcG9ydCB7IExhYmVsTGF5ZXIgfSBmcm9tICcuL0xhYmVsTGF5ZXIuanMnXHJcbmltcG9ydCB7IExpbmVMYXllciB9IGZyb20gJy4vTGluZUxheWVyLmpzJ1xyXG5pbXBvcnQgeyBtb25pdG9yLCBtb25pdG9yRHVyYXRpb24gfSBmcm9tICcuL3V0aWxzL1V0aWxzLmpzJ1xyXG5cclxuLy8gZXh0ZXJuYWwgaW1wb3J0c1xyXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXHJcblxyXG4vKipcclxuICogQSBncmlkdml6IGFwcGxpY2F0aW9uLlxyXG4gKlxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQXBwIHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudH0gY29udGFpbmVyXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3Rvcihjb250YWluZXIsIG9wdHMpIHtcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbGF5ZXJzLlxyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48TGF5ZXI+fVxyXG4gICAgICAgICAqICovXHJcbiAgICAgICAgdGhpcy5sYXllcnMgPSBbXVxyXG5cclxuICAgICAgICAvL2dldCBjb250YWluZXIgZWxlbWVudFxyXG4gICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lciB8fCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ3JpZHZpeicpXHJcbiAgICAgICAgaWYgKCFjb250YWluZXIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IGZpbmQgZ3JpZHZpeiBjb250YWluZXIgZWxlbWVudC4nKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vc2V0IGRpbWVuc2lvbnNcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLncgPSBvcHRzLncgfHwgY29udGFpbmVyLm9mZnNldFdpZHRoXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5oID0gb3B0cy5oIHx8IGNvbnRhaW5lci5vZmZzZXRIZWlnaHRcclxuXHJcbiAgICAgICAgLy9jcmVhdGUgY2FudmFzIGVsZW1lbnQgaWYgdXNlciBkb2VzbnQgc3BlY2lmeSBvbmVcclxuICAgICAgICAvKiogQHR5cGUge0hUTUxDYW52YXNFbGVtZW50fSAqL1xyXG4gICAgICAgIGxldCBjYW52YXMgPSBvcHRzLmNhbnZhcyB8fCBudWxsXHJcbiAgICAgICAgaWYgKCFjYW52YXMpIHtcclxuICAgICAgICAgICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcclxuICAgICAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcclxuICAgICAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJycgKyB0aGlzLmgpXHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChjYW52YXMpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiogTWFrZSBnZW8gY2FudmFzXHJcbiAgICAgICAgICogQHR5cGUge0dlb0NhbnZhc31cclxuICAgICAgICAgKiBAcHJpdmF0ZSAqL1xyXG4gICAgICAgIHRoaXMuY2cgPSBuZXcgR2VvQ2FudmFzKGNhbnZhcywgdW5kZWZpbmVkLCAxLCBvcHRzKVxyXG4gICAgICAgIHRoaXMuY2cucmVkcmF3ID0gKHN0cm9uZyA9IHRydWUpID0+IHtcclxuICAgICAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignU3RhcnQgcmVkcmF3JylcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIj94PVwiICsgdGhpcy5jZy5nZXRDZW50ZXIoKS54ICsgXCImeT1cIiArIHRoaXMuY2cuZ2V0Q2VudGVyKCkueSArIFwiJno9XCIgKyB0aGlzLmNnLmdldFpmKCkpXHJcblxyXG4gICAgICAgICAgICAvL3JlbW92ZSBsZWdlbmQgZWxlbWVudHNcclxuICAgICAgICAgICAgaWYgKHRoaXMubGVnZW5kICYmIHN0cm9uZykgdGhpcy5sZWdlbmQuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcclxuXHJcbiAgICAgICAgICAgIC8vY2xlYXJcclxuICAgICAgICAgICAgdGhpcy5jZy5pbml0Q2FudmFzVHJhbnNmb3JtKClcclxuICAgICAgICAgICAgdGhpcy5jZy5jbGVhcih0aGlzLmNnLmJhY2tncm91bmRDb2xvcilcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHpmID0gdGhpcy5nZXRab29tRmFjdG9yKClcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVFeHRlbnRHZW8oKVxyXG5cclxuICAgICAgICAgICAgLy9nbyB0aHJvdWdoIHRoZSBiYWNrZ3JvdW5kIGxheWVyc1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuYmdMYXllcnMpIHtcclxuICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgbGF5ZXIgaXMgdmlzaWJsZVxyXG4gICAgICAgICAgICAgICAgaWYgKCFsYXllci52aXNpYmxlKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgaWYgKHpmID4gbGF5ZXIubWF4Wm9vbSkgY29udGludWVcclxuICAgICAgICAgICAgICAgIGlmICh6ZiA8IGxheWVyLm1pblpvb20pIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAgICAgLy9kcmF3IGxheWVyXHJcbiAgICAgICAgICAgICAgICBsYXllci5kcmF3KHRoaXMuY2cpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vZ28gdGhyb3VnaCB0aGUgbGF5ZXJzXHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcclxuICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgbGF5ZXIgaXMgdmlzaWJsZVxyXG4gICAgICAgICAgICAgICAgaWYgKCFsYXllci52aXNpYmxlKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgaWYgKHpmID4gbGF5ZXIubWF4Wm9vbSkgY29udGludWVcclxuICAgICAgICAgICAgICAgIGlmICh6ZiA8IGxheWVyLm1pblpvb20pIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAgICAgLy9nZXQgbGF5ZXIgZGF0YXNldCBjb21wb25lbnRcclxuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KCcuL0RhdGFzZXRDb21wb25lbnQnKS5EYXRhc2V0Q29tcG9uZW50fHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgICAgIGNvbnN0IGRzYyA9IGxheWVyLmdldERhdGFzZXRDb21wb25lbnQoemYpXHJcbiAgICAgICAgICAgICAgICBpZiAoIWRzYykgY29udGludWVcclxuXHJcbiAgICAgICAgICAgICAgICAvL2xhdW5jaCBkYXRhIGRvd25sb2FkLCBpZiBuZWNlc3NhcnlcclxuICAgICAgICAgICAgICAgIGlmIChzdHJvbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgZHNjLmdldERhdGEodGhpcy5jZy5leHRHZW8sICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZy5yZWRyYXcoKVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAgICAgLy91cGRhdGUgZGF0YXNldCB2aWV3IGNhY2hlXHJcbiAgICAgICAgICAgICAgICBpZiAoc3Ryb25nKSBkc2MudXBkYXRlVmlld0NhY2hlKHRoaXMuY2cuZXh0R2VvKVxyXG5cclxuICAgICAgICAgICAgICAgIC8vZHJhdyBjZWxscywgc3R5bGUgYnkgc3R5bGVcclxuICAgICAgICAgICAgICAgIGlmIChzdHJvbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzIG9mIGxheWVyLnN0eWxlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoemYgPiBzLm1heFpvb20pIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6ZiA8IHMubWluWm9vbSkgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgcy5kcmF3KGRzYy5nZXRWaWV3Q2FjaGUoKSwgZHNjLmdldFJlc29sdXRpb24oKSwgdGhpcy5jZylcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9hZGQgbGVnZW5kIGVsZW1lbnRcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmxlZ2VuZCAmJiBzdHJvbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzIG9mIGxheWVyLnN0eWxlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoemYgPiBzLm1heFpvb20pIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6ZiA8IHMubWluWm9vbSkgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBsZyBvZiBzLmxlZ2VuZHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2cocywgbGcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMubGVnZW5kLmFwcGVuZChsZy5kaXYpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3MxLm5vZGUoKS5hcHBlbmRDaGlsZChzMi5ub2RlKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxlZ2VuZC5ub2RlKCkuYXBwZW5kKGxnLmRpdi5ub2RlKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY2FzZSBmb3Igc3R5bGVzIG9mIHN0eWxlcywgbGlrZSBrZXJuZWwgc21vb3RoaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyBkbyBiZXR0ZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNbJ3N0eWxlcyddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHMyIG9mIHMuc3R5bGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHpmID4gczIubWF4Wm9vbSkgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoemYgPCBzMi5taW5ab29tKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGcgb2YgczIubGVnZW5kcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHMsIGxnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMubGVnZW5kLmFwcGVuZChsZy5kaXYpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vczEubm9kZSgpLmFwcGVuZENoaWxkKHMyLm5vZGUoKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWdlbmQubm9kZSgpLmFwcGVuZChsZy5kaXYubm9kZSgpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGJvdW5kYXJ5IGxheWVyXHJcbiAgICAgICAgICAgIC8vaWYgKHN0cm9uZylcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0JvdW5kYXJpZXMgJiYgdGhpcy5ib3VuZGFyeUxheWVyKSB0aGlzLmJvdW5kYXJ5TGF5ZXIuZHJhdyh0aGlzLmNnKVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGxhYmVsIGxheWVyXHJcbiAgICAgICAgICAgIC8vaWYgKHN0cm9uZylcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0xhYmVscyAmJiB0aGlzLmxhYmVsTGF5ZXIpIHRoaXMubGFiZWxMYXllci5kcmF3KHRoaXMuY2cpXHJcblxyXG4gICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSBudWxsXHJcblxyXG4gICAgICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCdFbmQgcmVkcmF3JylcclxuXHJcbiAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgcmVzaXplIGV2ZW50cyBvbiB0aGUgQXBwJ3MgY29udGFpbmVyIGFuZCBoYW5kbGUgdGhlbVxyXG4gICAgICAgICAgICB0aGlzLmRlZmluZVJlc2l6ZU9ic2VydmVyKGNvbnRhaW5lciwgY2FudmFzKVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7QXJyYXkuPEJhY2tncm91bmRMYXllcnxCYWNrZ3JvdW5kTGF5ZXJXTVM+fSAqL1xyXG4gICAgICAgIHRoaXMuYmdMYXllcnMgPSBbXVxyXG4gICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cclxuICAgICAgICB0aGlzLnNob3dCZ0xheWVycyA9IHRydWVcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtMYWJlbExheWVyIHwgdW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMubGFiZWxMYXllciA9IHVuZGVmaW5lZFxyXG4gICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cclxuICAgICAgICB0aGlzLnNob3dMYWJlbHMgPSB0cnVlXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7TGluZUxheWVyIHwgdW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMuYm91bmRhcnlMYXllciA9IHVuZGVmaW5lZFxyXG4gICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cclxuICAgICAgICB0aGlzLnNob3dCb3VuZGFyaWVzID0gdHJ1ZVxyXG5cclxuICAgICAgICAvL2xlZ2VuZCBkaXZcclxuXHJcbiAgICAgICAgdGhpcy5sZWdlbmREaXZJZCA9IG9wdHMubGVnZW5kRGl2SWQgfHwgJ2d2aXpMZWdlbmQnXHJcbiAgICAgICAgdGhpcy5sZWdlbmQgPSBzZWxlY3QoJyMnICsgdGhpcy5sZWdlbmREaXZJZClcclxuICAgICAgICBpZiAodGhpcy5sZWdlbmQuZW1wdHkoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmxlZ2VuZCA9IHNlbGVjdCgnIycgKyBjb250YWluZXIuaWQpXHJcbiAgICAgICAgICAgICAgICAuYXBwZW5kKCdkaXYnKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgdGhpcy5sZWdlbmREaXZJZClcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCd3aWR0aCcsICdhdXRvJylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnaGVpZ2h0JywgJ2F1dG8nKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdiYWNrZ3JvdW5kJywgJyNGRkZGRkZDQycpXHJcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcInBhZGRpbmdcIiwgdGhpcy5wYWRkaW5nKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdib3JkZXInLCAnMHB4JylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnYm9yZGVyLXJhZGl1cycsICc1cHgnKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdib3gtc2hhZG93JywgJzNweCAzcHggM3B4IGdyZXksIC0zcHggLTNweCAzcHggI2RkZCcpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtZmFtaWx5JywgJ0hlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYnKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCd0b3AnLCAnMjBweCcpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3JpZ2h0JywgJzIwcHgnKVxyXG4gICAgICAgICAgICAvL2hpZGVcclxuICAgICAgICAgICAgLy8uc3R5bGUoXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3Rvb2x0aXBcclxuXHJcbiAgICAgICAgLy8gc2V0IEFwcCBjb250YWluZXIgYXMgZGVmYXVsdCBwYXJlbnQgZWxlbWVudCBmb3IgdG9vbHRpcFxyXG4gICAgICAgIGlmICghb3B0cy50b29sdGlwKSBvcHRzLnRvb2x0aXAgPSB7fVxyXG4gICAgICAgIGlmICghb3B0cy50b29sdGlwLnBhcmVudEVsZW1lbnQpIG9wdHMudG9vbHRpcC5wYXJlbnRFbGVtZW50ID0gY29udGFpbmVyXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge1Rvb2x0aXB9ICovXHJcbiAgICAgICAgdGhpcy50b29sdGlwID0gbmV3IFRvb2x0aXAob3B0cy50b29sdGlwKVxyXG5cclxuICAgICAgICAvKiogQHBhcmFtIHtNb3VzZUV2ZW50fSBlICovXHJcbiAgICAgICAgY29uc3QgZm9jdXNDZWxsID0gKGUpID0+IHtcclxuICAgICAgICAgICAgLy9jb21wdXRlIG1vdXNlIGdlbyBwb3NpdGlvblxyXG4gICAgICAgICAgICBjb25zdCBtb3VzZVBvc2l0aW9uR2VvID0ge1xyXG4gICAgICAgICAgICAgICAgeDogdGhpcy5jZy5waXhUb0dlb1goZS5vZmZzZXRYICsgdGhpcy50b29sdGlwLnhNb3VzZU9mZnNldCksXHJcbiAgICAgICAgICAgICAgICB5OiB0aGlzLmNnLnBpeFRvR2VvWShlLm9mZnNldFkgKyB0aGlzLnRvb2x0aXAueU1vdXNlT2Zmc2V0KSxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvKiogQHR5cGUge3tjZWxsOmltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCxodG1sOnN0cmluZyxyZXNvbHV0aW9uOm51bWJlcn0gfCB1bmRlZmluZWR9ICovXHJcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzID0gdGhpcy5nZXRDZWxsRm9jdXNJbmZvKG1vdXNlUG9zaXRpb25HZW8pXHJcblxyXG4gICAgICAgICAgICAvLyB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kIChlLmcuIGxlYWZsZXQpICdyZWQgcGFpbnRpbmcnIGZpeFxyXG4gICAgICAgICAgICBpZiAob3B0cy50cmFuc3BhcmVudEJhY2tncm91bmQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChmb2N1cykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5zZXRQb3NpdGlvbihlKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5zaG93KClcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuaHRtbChmb2N1cy5odG1sKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKHRoaXMuY2cuY2FudmFzLCAwLCAwKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jZy5pbml0Q2FudmFzVHJhbnNmb3JtKClcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZm9jdXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5zZXRQb3NpdGlvbihlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLnNob3coKVxyXG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLmh0bWwoZm9jdXMuaHRtbClcclxuXHJcbiAgICAgICAgICAgICAgICAvL3Nob3cgY2VsbCBwb3NpdGlvbiBhcyBhIHJlY3RhbmdsZVxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhbnZhc1NhdmUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJycgKyB0aGlzLncpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJycgKyB0aGlzLmgpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKHRoaXMuY2cuY2FudmFzLCAwLCAwKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNnLmN0eC5kcmF3SW1hZ2UodGhpcy5jYW52YXNTYXZlLCAwLCAwKVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vZHJhdyBpbWFnZSBzYXZlZCArIGRyYXcgcmVjdGFuZ2xlXHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWN0V1BpeCA9IHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXhcclxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXgoZm9jdXMucmVzb2x1dGlvbiwgdGhpcy5nZXRab29tRmFjdG9yKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgOiA0XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNnLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jZy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLnNlbGVjdGlvblJlY3RhbmdsZUNvbG9yXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNnLmN0eC5saW5lV2lkdGggPSByZWN0V1BpeFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jZy5jdHguYmVnaW5QYXRoKClcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNnLmN0eC5yZWN0KFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2cuZ2VvVG9QaXhYKGZvY3VzLmNlbGwueCkgLSByZWN0V1BpeCAvIDIsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZy5nZW9Ub1BpeFkoZm9jdXMuY2VsbC55KSArIHJlY3RXUGl4IC8gMixcclxuICAgICAgICAgICAgICAgICAgICBmb2N1cy5yZXNvbHV0aW9uIC8gdGhpcy5nZXRab29tRmFjdG9yKCkgKyByZWN0V1BpeCxcclxuICAgICAgICAgICAgICAgICAgICAtZm9jdXMucmVzb2x1dGlvbiAvIHRoaXMuZ2V0Wm9vbUZhY3RvcigpIC0gcmVjdFdQaXhcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIHRoaXMuY2cuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW52YXNTYXZlKSB0aGlzLmNnLmN0eC5kcmF3SW1hZ2UodGhpcy5jYW52YXNTYXZlLCAwLCAwKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICBmb2N1c0NlbGwoZSlcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICBmb2N1c0NlbGwoZSlcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy50b29sdGlwLmhpZGUoKVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIC8vIGFkZCBleHRyYSBsb2dpYyB0byBvblpvb21TdGFydEZ1blxyXG4gICAgICAgIHRoaXMuY2cub25ab29tU3RhcnRGdW4gPSAoZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAob3B0cy5vblpvb21TdGFydEZ1bikgb3B0cy5vblpvb21TdGFydEZ1bihlKVxyXG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2ZvciBtb3VzZSBvdmVyXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7SFRNTENhbnZhc0VsZW1lbnR8bnVsbH0gKi9cclxuICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSBudWxsXHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlQ29sb3IgPSBvcHRzLnNlbGVjdGlvblJlY3RhbmdsZUNvbG9yIHx8ICdyZWQnXHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVXaWR0aFBpeCA9IG9wdHMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXggfHwgKCgpID0+IDQpIC8vKHIsemYpID0+IHt9XHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgLy9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgZSA9PiB7IGNvbnNvbGUubG9nKGFyZ3VtZW50cykgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWFyZ2luUHhcclxuICAgICAqIEByZXR1cm5zIHtpbXBvcnQoJy4vRGF0YXNldCcpLkVudmVsb3BlfVxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICB1cGRhdGVFeHRlbnRHZW8obWFyZ2luUHggPSAyMCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNnLnVwZGF0ZUV4dGVudEdlbyhtYXJnaW5QeClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgY2VsbCBIVE1MIGluZm8gYXQgYSBnaXZlbiBnZW8gcG9zaXRpb24uXHJcbiAgICAgKiBUaGlzIGlzIHVzZWZ1bGwgZm9yIHVzZXIgaW50ZXJhY3Rpb25zLCB0byBzaG93IHRoaXMgaW5mbyB3aGVyZSB0aGUgdXNlciBjbGlja3MgZm9yIGV4YW1wbGUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHt7eDpudW1iZXIseTpudW1iZXJ9fSBwb3NHZW9cclxuICAgICAqIEByZXR1cm5zIHt7Y2VsbDppbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsaHRtbDpzdHJpbmcscmVzb2x1dGlvbjpudW1iZXJ9IHwgdW5kZWZpbmVkfVxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICovXHJcbiAgICBnZXRDZWxsRm9jdXNJbmZvKHBvc0dlbykge1xyXG4gICAgICAgIC8vZ28gdGhyb3VnaCB0aGUgbGF5ZXJzLCBzdGFydGluZyBmcm9tIHRvcFxyXG4gICAgICAgIGNvbnN0IHpmID0gdGhpcy5nZXRab29tRmFjdG9yKClcclxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5sYXllcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtMYXllcn0gKi9cclxuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmxheWVyc1tpXVxyXG4gICAgICAgICAgICBpZiAoIWxheWVyLnZpc2libGUpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGlmICghbGF5ZXIuY2VsbEluZm9IVE1MKSBjb250aW51ZVxyXG4gICAgICAgICAgICBpZiAobGF5ZXIuY2VsbEluZm9IVE1MID09PSAnbm9uZScpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGNvbnN0IGRzYyA9IGxheWVyLmdldERhdGFzZXRDb21wb25lbnQoemYpXHJcbiAgICAgICAgICAgIGlmICghZHNjKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy9nZXQgY2VsbCBhdCBtb3VzZSBwb3NpdGlvblxyXG4gICAgICAgICAgICAvKiogQHR5cGUge2ltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbHx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBkc2MuZ2V0Q2VsbEZyb21Qb3NpdGlvbihwb3NHZW8sIGRzYy5nZXRWaWV3Q2FjaGUoKSlcclxuICAgICAgICAgICAgaWYgKCFjZWxsKSByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBsYXllci5jZWxsSW5mb0hUTUwoY2VsbCwgZHNjLmdldFJlc29sdXRpb24oKSlcclxuICAgICAgICAgICAgaWYgKCFodG1sKSByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIHJldHVybiB7IGNlbGw6IGNlbGwsIGh0bWw6IGh0bWwsIHJlc29sdXRpb246IGRzYy5nZXRSZXNvbHV0aW9uKCkgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL2dldHRlcnMgYW5kIHNldHRlcnNcclxuXHJcbiAgICAvKiogQHJldHVybnMge3t4Om51bWJlcix5Om51bWJlcn19ICovXHJcbiAgICBnZXRHZW9DZW50ZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2cuZ2V0Q2VudGVyKClcclxuICAgIH1cclxuICAgIC8qKiBAcGFyYW0ge3t4Om51bWJlcix5Om51bWJlcn19IHZhbCBAcmV0dXJucyB7dGhpc30gKi9cclxuICAgIHNldEdlb0NlbnRlcih2YWwpIHtcclxuICAgICAgICB0aGlzLmNnLnNldENlbnRlcih2YWwpXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHJldHVybnMge251bWJlcn0gKi9cclxuICAgIGdldFpvb21GYWN0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2cuZ2V0WmYoKVxyXG4gICAgfVxyXG4gICAgLyoqIEBwYXJhbSB7bnVtYmVyfSB2YWwgQHJldHVybnMge3RoaXN9ICovXHJcbiAgICBzZXRab29tRmFjdG9yKHZhbCkge1xyXG4gICAgICAgIHRoaXMuY2cuc2V0WmYodmFsKVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEByZXR1cm5zIHtBcnJheS48bnVtYmVyPn0gKi9cclxuICAgIGdldFpvb21GYWN0b3JFeHRlbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2cuZ2V0WmZFeHRlbnQoKVxyXG4gICAgfVxyXG4gICAgLyoqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHZhbCBAcmV0dXJucyB7dGhpc30gKi9cclxuICAgIHNldFpvb21GYWN0b3JFeHRlbnQodmFsKSB7XHJcbiAgICAgICAgdGhpcy5jZy5zZXRaZkV4dGVudCh2YWwpXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cclxuICAgIGdldEJhY2tncm91bmRDb2xvcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jZy5iYWNrZ3JvdW5kQ29sb3JcclxuICAgIH1cclxuICAgIC8qKiBAcGFyYW0ge3N0cmluZ30gdmFsIEByZXR1cm5zIHt0aGlzfSAqL1xyXG4gICAgc2V0QmFja2dyb3VuZENvbG9yKHZhbCkge1xyXG4gICAgICAgIHRoaXMuY2cuYmFja2dyb3VuZENvbG9yID0gdmFsXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHJldHVybnMge0xpbmVMYXllciB8IHVuZGVmaW5lZH0gKi9cclxuICAgIGdldEJvdW5kYXJ5TGF5ZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYm91bmRhcnlMYXllclxyXG4gICAgfVxyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzIEByZXR1cm5zIHt0aGlzfSAqL1xyXG4gICAgc2V0Qm91bmRhcnlMYXllcihvcHRzKSB7XHJcbiAgICAgICAgdGhpcy5ib3VuZGFyeUxheWVyID0gbmV3IExpbmVMYXllcihvcHRzKVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEByZXR1cm5zIHtMYWJlbExheWVyIHwgdW5kZWZpbmVkfSAqL1xyXG4gICAgZ2V0TGFiZWxMYXllcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sYWJlbExheWVyXHJcbiAgICB9XHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgQHJldHVybnMge3RoaXN9ICovXHJcbiAgICBzZXRMYWJlbExheWVyKG9wdHMpIHtcclxuICAgICAgICB0aGlzLmxhYmVsTGF5ZXIgPSBuZXcgTGFiZWxMYXllcihvcHRzKVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEByZXR1cm5zIHt0aGlzfSAqL1xyXG4gICAgcmVkcmF3KCkge1xyXG4gICAgICAgIHRoaXMuY2cucmVkcmF3KClcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkIGEgbGF5ZXIgdG8gdGhlIGFwcC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0RhdGFzZXR9IGRhdGFzZXQgVGhlIGRhdGFzZXQgb2YgdGhlIGxheWVyXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4vU3R5bGUnKS5TdHlsZT59IHN0eWxlcyBUaGUgc3R5bGVzIG9mIHRoZSBsYXllclxyXG4gICAgICogQHBhcmFtIHt7dmlzaWJsZT86Ym9vbGVhbixtaW5ab29tPzpudW1iZXIsbWF4Wm9vbT86bnVtYmVyLHBpeE5iPzpudW1iZXIsY2VsbEluZm9IVE1MPzpmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwpOnN0cmluZ319IG9wdHMgVGhlIGxheWVyIG9wdGlvbnMuXHJcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cclxuICAgICAqL1xyXG4gICAgYWRkTGF5ZXJGcm9tRGF0YXNldChkYXRhc2V0LCBzdHlsZXMsIG9wdHMpIHtcclxuICAgICAgICBjb25zdCBsYXkgPSBuZXcgTGF5ZXIoZGF0YXNldCwgc3R5bGVzLCBvcHRzKVxyXG4gICAgICAgIHRoaXMubGF5ZXJzLnB1c2gobGF5KVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLy9kYXRhc2V0IGNyZWF0aW9uXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYWtlIGEgQ1NWIGdyaWQgZGF0YXNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiBUaGUgZGF0YXNldCByZXNvbHV0aW9uIGluIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICogQHBhcmFtIHtvYmplY3Q9fSBvcHRzIFRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBkYXRhc2V0LlxyXG4gICAgICogQHJldHVybnMge0RhdGFzZXR9XHJcbiAgICAgKi9cclxuICAgIG1ha2VDU1ZHcmlkRGF0YXNldCh1cmwsIHJlc29sdXRpb24sIG9wdHMpIHtcclxuICAgICAgICByZXR1cm4gbmV3IERhdGFzZXQoXHJcbiAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICAgIG5ldyBDU1ZHcmlkKHVybCwgcmVzb2x1dGlvbiwgb3B0cykuZ2V0RGF0YSh1bmRlZmluZWQsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNnLnJlZHJhdygpXHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgW10sXHJcbiAgICAgICAgICAgIG9wdHNcclxuICAgICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYWtlIGEgcGFycXVldCBncmlkIGRhdGFzZXQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIG9mIHRoZSBkYXRhc2V0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb24gVGhlIGRhdGFzZXQgcmVzb2x1dGlvbiBpbiBnZW9ncmFwaGljYWwgdW5pdC5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0cyBUaGUgcGFyYW1ldGVycyBvZiB0aGUgZGF0YXNldC5cclxuICAgICAqIEByZXR1cm5zIHtEYXRhc2V0fVxyXG4gICAgICovXHJcbiAgICAvKm1ha2VQYXJxdWV0R3JpZERhdGFzZXQodXJsLCByZXNvbHV0aW9uLCBvcHRzKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhc2V0KFtuZXcgUGFycXVldEdyaWQodXJsLCByZXNvbHV0aW9uLCBvcHRzKS5nZXREYXRhKHVuZGVmaW5lZCwgKCkgPT4geyB0aGlzLmNnLnJlZHJhdygpOyB9KV0sIFtdLCBvcHRzKVxyXG4gICAgfSovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYWtlIGEgdGlsZWQgZ3JpZCBkYXRhc2V0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcclxuICAgICAqIEBwYXJhbSB7e3ByZXByb2Nlc3M/OmZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbn19IG9wdHNcclxuICAgICAqIEByZXR1cm5zIHtEYXRhc2V0fVxyXG4gICAgICovXHJcbiAgICBtYWtlVGlsZWRHcmlkRGF0YXNldCh1cmwsIG9wdHMpIHtcclxuICAgICAgICByZXR1cm4gbmV3IERhdGFzZXQoXHJcbiAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICAgIG5ldyBUaWxlZEdyaWQodXJsLCB0aGlzLCBvcHRzKS5sb2FkSW5mbygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZy5yZWRyYXcoKVxyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIFtdLFxyXG4gICAgICAgICAgICBvcHRzXHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIC8vbXVsdGkgc2NhbGUgZGF0YXNldCBjcmVhdGlvblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFrZSBhIG11bHRpIHNjYWxlIHBhcnF1ZXQgZ3JpZCBkYXRhc2V0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHJlc29sdXRpb25zXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfSByZXNUb1VSTFxyXG4gICAgICogQHBhcmFtIHt7cHJlcHJvY2Vzcz86ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsKTpib29sZWFufX0gb3B0c1xyXG4gICAgICogQHJldHVybnMge0RhdGFzZXR9XHJcbiAgICAgKi9cclxuICAgIC8qbWFrZU11bHRpU2NhbGVQYXJxdWV0R3JpZERhdGFzZXQocmVzb2x1dGlvbnMsIHJlc1RvVVJMLCBvcHRzKSB7XHJcbiAgICAgICAgcmV0dXJuIERhdGFzZXQubWFrZShcclxuICAgICAgICAgICAgcmVzb2x1dGlvbnMsXHJcbiAgICAgICAgICAgIChyZXMpID0+IG5ldyBQYXJxdWV0R3JpZChyZXNUb1VSTChyZXMpLCByZXMsIG9wdHMpLmdldERhdGEodW5kZWZpbmVkLCAoKSA9PiB7IHRoaXMuY2cucmVkcmF3KCk7IH0pLFxyXG4gICAgICAgICAgICBvcHRzXHJcbiAgICAgICAgKVxyXG4gICAgfSovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYWtlIGEgbXVsdGkgc2NhbGUgQ1NWIGdyaWQgZGF0YXNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSByZXNvbHV0aW9uc1xyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihudW1iZXIpOnN0cmluZ30gcmVzVG9VUkxcclxuICAgICAqIEBwYXJhbSB7e3ByZXByb2Nlc3M/OmZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbn19IG9wdHNcclxuICAgICAqIEByZXR1cm5zIHtEYXRhc2V0fVxyXG4gICAgICovXHJcbiAgICBtYWtlTXVsdGlTY2FsZUNTVkdyaWREYXRhc2V0KHJlc29sdXRpb25zLCByZXNUb1VSTCwgb3B0cykge1xyXG4gICAgICAgIHJldHVybiBEYXRhc2V0Lm1ha2UoXHJcbiAgICAgICAgICAgIHJlc29sdXRpb25zLFxyXG4gICAgICAgICAgICAocmVzKSA9PlxyXG4gICAgICAgICAgICAgICAgbmV3IENTVkdyaWQocmVzVG9VUkwocmVzKSwgcmVzLCBvcHRzKS5nZXREYXRhKHVuZGVmaW5lZCwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2cucmVkcmF3KClcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBvcHRzXHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIC8vdGlsZWQgbXVsdGlzY2FsZVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFrZSBhIG11bHRpIHNjYWxlIHRpbGVkIGdyaWQgZGF0YXNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSByZXNvbHV0aW9uc1xyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihudW1iZXIpOnN0cmluZ30gcmVzVG9VUkxcclxuICAgICAqIEBwYXJhbSB7e3ByZXByb2Nlc3M/OmZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbn19IG9wdHNcclxuICAgICAqIEByZXR1cm5zIHtEYXRhc2V0fVxyXG4gICAgICovXHJcbiAgICBtYWtlTXVsdGlTY2FsZVRpbGVkR3JpZERhdGFzZXQocmVzb2x1dGlvbnMsIHJlc1RvVVJMLCBvcHRzKSB7XHJcbiAgICAgICAgcmV0dXJuIERhdGFzZXQubWFrZShcclxuICAgICAgICAgICAgcmVzb2x1dGlvbnMsXHJcbiAgICAgICAgICAgIChyZXMpID0+XHJcbiAgICAgICAgICAgICAgICBuZXcgVGlsZWRHcmlkKHJlc1RvVVJMKHJlcyksIHRoaXMsIG9wdHMpLmxvYWRJbmZvKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNnLnJlZHJhdygpXHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgb3B0c1xyXG4gICAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICAvLyBkaXJlY3QgbGF5ZXIgY3JlYXRpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIGxheWVyIGZyb20gYSBDU1YgZ3JpZCBkYXRhc2V0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCBvZiB0aGUgZGF0YXNldC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZSBkYXRhc2V0IHJlc29sdXRpb24gaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4vU3R5bGUnKS5TdHlsZT59IHN0eWxlcyBUaGUgc3R5bGVzLCBvcmRlcmVkIGluIGRyYXdpbmcgb3JkZXIuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdD19IG9wdHMgVGhlIHBhcmFtZXRlcnMgb2YgdGhlIGRhdGFzZXQgYW5kIGxheWVyLlxyXG4gICAgICogQHJldHVybnMge3RoaXN9XHJcbiAgICAgKi9cclxuICAgIGFkZENTVkdyaWRMYXllcih1cmwsIHJlc29sdXRpb24sIHN0eWxlcywgb3B0cykge1xyXG4gICAgICAgIGNvbnN0IGRzID0gdGhpcy5tYWtlQ1NWR3JpZERhdGFzZXQodXJsLCByZXNvbHV0aW9uLCBvcHRzKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZExheWVyRnJvbURhdGFzZXQoZHMsIHN0eWxlcywgb3B0cylcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIGxheWVyIGZyb20gYSBwYXJxdWV0IGdyaWQgZGF0YXNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiBUaGUgZGF0YXNldCByZXNvbHV0aW9uIGluIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KCcuL1N0eWxlJykuU3R5bGU+fSBzdHlsZXMgVGhlIHN0eWxlcywgb3JkZXJlZCBpbiBkcmF3aW5nIG9yZGVyLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3Q9fSBvcHRzIFRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBkYXRhc2V0IGFuZCBsYXllci5cclxuICAgICAqIEByZXR1cm5zIHt0aGlzfVxyXG4gICAgICovXHJcbiAgICAvKmFkZFBhcnF1ZXRHcmlkTGF5ZXIodXJsLCByZXNvbHV0aW9uLCBzdHlsZXMsIG9wdHMpIHtcclxuICAgICAgICBjb25zdCBkcyA9IHRoaXMubWFrZVBhcnF1ZXRHcmlkRGF0YXNldCh1cmwsIHJlc29sdXRpb24sIG9wdHMpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkTGF5ZXJGcm9tRGF0YXNldChkcywgc3R5bGVzLCBvcHRzKTtcclxuICAgIH0qL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydCgnLi9TdHlsZScpLlN0eWxlPn0gc3R5bGVzXHJcbiAgICAgKiBAcGFyYW0ge3t2aXNpYmxlPzpib29sZWFuLG1pblpvb20/Om51bWJlcixtYXhab29tPzpudW1iZXIscGl4TmI/Om51bWJlcixjZWxsSW5mb0hUTUw/OmZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6c3RyaW5nLCBwcmVwcm9jZXNzPzpmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwpOmJvb2xlYW59fSBvcHRzXHJcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cclxuICAgICAqL1xyXG4gICAgYWRkVGlsZWRHcmlkTGF5ZXIodXJsLCBzdHlsZXMsIG9wdHMpIHtcclxuICAgICAgICBjb25zdCBkcyA9IHRoaXMubWFrZVRpbGVkR3JpZERhdGFzZXQodXJsLCBvcHRzKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZExheWVyRnJvbURhdGFzZXQoZHMsIHN0eWxlcywgb3B0cylcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIGxheWVyIGZyb20gYSBDU1YgZ3JpZCBkYXRhc2V0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHJlc29sdXRpb25zXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfSByZXNUb1VSTFxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KCcuL1N0eWxlJykuU3R5bGU+fSBzdHlsZXMgVGhlIHN0eWxlcywgb3JkZXJlZCBpbiBkcmF3aW5nIG9yZGVyLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3Q9fSBvcHRzIFRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBkYXRhc2V0IGFuZCBsYXllci5cclxuICAgICAqIEByZXR1cm5zIHt0aGlzfVxyXG4gICAgICovXHJcbiAgICBhZGRNdWx0aVNjYWxlQ1NWR3JpZExheWVyKHJlc29sdXRpb25zLCByZXNUb1VSTCwgc3R5bGVzLCBvcHRzKSB7XHJcbiAgICAgICAgY29uc3QgZHMgPSB0aGlzLm1ha2VNdWx0aVNjYWxlQ1NWR3JpZERhdGFzZXQocmVzb2x1dGlvbnMsIHJlc1RvVVJMLCBvcHRzKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZExheWVyRnJvbURhdGFzZXQoZHMsIHN0eWxlcywgb3B0cylcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIGxheWVyIGZyb20gYSBwYXJxdWV0IGdyaWQgZGF0YXNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSByZXNvbHV0aW9uc1xyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihudW1iZXIpOnN0cmluZ30gcmVzVG9VUkxcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydCgnLi9TdHlsZScpLlN0eWxlPn0gc3R5bGVzIFRoZSBzdHlsZXMsIG9yZGVyZWQgaW4gZHJhd2luZyBvcmRlci5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0cyBUaGUgcGFyYW1ldGVycyBvZiB0aGUgZGF0YXNldCBhbmQgbGF5ZXIuXHJcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cclxuICAgICAqL1xyXG4gICAgLyphZGRNdWx0aVNjYWxlUGFycXVldEdyaWRMYXllcihyZXNvbHV0aW9ucywgcmVzVG9VUkwsIHN0eWxlcywgb3B0cykge1xyXG4gICAgICAgIGNvbnN0IGRzID0gdGhpcy5tYWtlTXVsdGlTY2FsZVBhcnF1ZXRHcmlkRGF0YXNldChyZXNvbHV0aW9ucywgcmVzVG9VUkwsIG9wdHMpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkTGF5ZXJGcm9tRGF0YXNldChkcywgc3R5bGVzLCBvcHRzKTtcclxuICAgIH0qL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gcmVzb2x1dGlvbnNcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9IHJlc1RvVVJMXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4vU3R5bGUnKS5TdHlsZT59IHN0eWxlc1xyXG4gICAgICogQHBhcmFtIHt7dmlzaWJsZT86Ym9vbGVhbixtaW5ab29tPzpudW1iZXIsbWF4Wm9vbT86bnVtYmVyLHBpeE5iPzpudW1iZXIsY2VsbEluZm9IVE1MPzpmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwpOnN0cmluZywgcHJlcHJvY2Vzcz86ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsKTpib29sZWFufX0gb3B0c1xyXG4gICAgICogQHJldHVybnMge3RoaXN9XHJcbiAgICAgKi9cclxuICAgIGFkZE11bHRpU2NhbGVUaWxlZEdyaWRMYXllcihyZXNvbHV0aW9ucywgcmVzVG9VUkwsIHN0eWxlcywgb3B0cykge1xyXG4gICAgICAgIGNvbnN0IGRzID0gdGhpcy5tYWtlTXVsdGlTY2FsZVRpbGVkR3JpZERhdGFzZXQocmVzb2x1dGlvbnMsIHJlc1RvVVJMLCBvcHRzKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZExheWVyRnJvbURhdGFzZXQoZHMsIHN0eWxlcywgb3B0cylcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIGJhY2tncm91bmQgbGF5ZXIgdG8gdGhlIGFwcC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICogQHJldHVybnMge3RoaXN9XHJcbiAgICAgKi9cclxuICAgIGFkZEJhY2tncm91bmRMYXllcihvcHRzKSB7XHJcbiAgICAgICAgdGhpcy5iZ0xheWVycy5wdXNoKG5ldyBCYWNrZ3JvdW5kTGF5ZXIob3B0cykpXHJcbiAgICAgICAgdGhpcy5yZWRyYXcoKVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYSBXTVMgYmFja2dyb3VuZCBsYXllciB0byB0aGUgYXBwLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cclxuICAgICAqL1xyXG4gICAgYWRkQmFja2dyb3VuZExheWVyV01TKG9wdHMpIHtcclxuICAgICAgICB0aGlzLmJnTGF5ZXJzLnB1c2gobmV3IEJhY2tncm91bmRMYXllcldNUyhvcHRzKSlcclxuICAgICAgICB0aGlzLnJlZHJhdygpXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWRcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cclxuICAgICAqL1xyXG4gICAgYWRkWm9vbVNsaWRlcihpZCwgb3B0cykge1xyXG4gICAgICAgIHRoaXMuY2cuYWRkWm9vbVNsaWRlcihpZCwgb3B0cylcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcmV0dXJucyB7dGhpc30gKi9cclxuICAgIHNldFZpZXdGcm9tVVJMKCkge1xyXG4gICAgICAgIHRoaXMuY2cuc2V0Vmlld0Zyb21VUkwoKVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWRkIGEgcmVzaXplIGV2ZW50IG9ic2VydmVyIHRvIHRoZSBBcHBzIGNvbnRhaW5lciBhbmQgdXBkYXRlIHRoZSBjYW52YXMgYWNjb3JkaW5nbHlcclxuICAgICAqIEBwYXJhbSB7SFRNTERpdkVsZW1lbnR9IGNvbnRhaW5lciBUaGUgQXBwJ3MgY29udGFpbmVyIGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhcyBUaGUgQXBwIGNhbnZhcyBlbGVtZW50XHJcbiAgICAgKiBAbWVtYmVyb2YgQXBwXHJcbiAgICAgKi9cclxuICAgIGRlZmluZVJlc2l6ZU9ic2VydmVyKGNvbnRhaW5lciwgY2FudmFzKSB7XHJcbiAgICAgICAgLy8gbGlzdGVuIHRvIHJlc2l6ZSBldmVudHNcclxuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xyXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgY2FudmFzIGhhcyBiZWVuIGJ1aWx0XHJcbiAgICAgICAgICAgIGlmIChjb250YWluZXIuY2xpZW50V2lkdGggPiAwICYmIGNvbnRhaW5lci5jbGllbnRIZWlnaHQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZG9udCBleGNlZWQgbG9vcCBsaW1pdCBmaXJzdFxyXG4gICAgICAgICAgICAgICAgLy8gc2VlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80OTM4NDEyMC9yZXNpemVvYnNlcnZlci1sb29wLWxpbWl0LWV4Y2VlZGVkXHJcbiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZW50cmllcykgfHwgIWVudHJpZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGFwcCBhbmQgY2FudmFzIHNpemVcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oICE9PSBjb250YWluZXIuY2xpZW50SGVpZ2h0IHx8IHRoaXMudyAhPT0gY29udGFpbmVyLmNsaWVudFdpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53ID0gY29udGFpbmVyLmNsaWVudFdpZHRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2cuaCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZy53ID0gY29udGFpbmVyLmNsaWVudFdpZHRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJycgKyB0aGlzLncpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZHJhdygpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyKVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuLyoqXHJcbiAqXHJcbiAqIEEgbWFwIGJhY2tncm91bmQgbGF5ZXIgaW4gXCJTbGlwcHkgbWFwXCIgWFlaIHN0YW5kYXJkLlxyXG4gKiBTZWUgaHR0cHM6Ly93aWtpLm9wZW5zdHJlZXRtYXAub3JnL3dpa2kvU2xpcHB5X21hcF90aWxlbmFtZXNcclxuICogaHR0cHM6Ly93d3cubWFwdGlsZXIuY29tL2dvb2dsZS1tYXBzLWNvb3JkaW5hdGVzLXRpbGUtYm91bmRzLXByb2plY3Rpb24vIzYvMjcuODgvNDQuNDhcclxuICogXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBCYWNrZ3JvdW5kTGF5ZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIEFuIGF0dHJpYnV0ZSB0byBzcGVjaWZ5IGlmIGEgbGF5ZXIgc2hvdWxkIGJlIGRyYXduIG9yIG5vdFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufSAqL1xyXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IG9wdHMudmlzaWJsZSA9PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZVxyXG5cclxuICAgICAgICAvKiogVGhlIG1pbmltdW0gem9vbSBmYWN0b3I6IEJlbG93IHRoaXMgbGV2ZWwsIHRoZSBsYXllciBpcyBub3Qgc2hvd24uXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLm1pblpvb20gPSBvcHRzLm1pblpvb20gfHwgMFxyXG5cclxuICAgICAgICAvKiogVGhlIG1heGltdW0gem9vbSBmYWN0b3I6IEFib3ZlIHRoaXMgbGV2ZWwsIHRoZSBsYXllciBpcyBub3Qgc2hvd24uXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLm1heFpvb20gPSBvcHRzLm1heFpvb20gfHwgSW5maW5pdHlcclxuXHJcbiAgICAgICAgLy9lbnN1cmUgYWNjZXB0YWJsZSB2YWx1ZXMgZm9yIHRoZSB6b29tIGxpbWl0cy5cclxuICAgICAgICBpZiAodGhpcy5taW5ab29tID49IHRoaXMubWF4Wm9vbSlcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHpvb20gbGltaXRzIGZvciBsYXllci4gWm9vbSBtaW4gc2hvdWxkIGJlIHNtYWxsZXIgdGhhbiB6b29tIG1heC4nKVxyXG5cclxuICAgICAgICAvKiogVGhlIGltYWdlIGNhY2hlLCBpbmRleGVkIGJ5IHoveS94ICovXHJcbiAgICAgICAgdGhpcy5jYWNoZSA9IHt9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy51cmwgPSBvcHRzLnVybFxyXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnVybEZ1biA9IG9wdHMudXJsRnVuIHx8ICgoeCwgeSwgeikgPT4gdGhpcy51cmwgKyB6ICsgJy8nICsgeCArICcvJyArIHkgKyAnLnBuZycpXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXHJcbiAgICAgICAgdGhpcy5yZXNvbHV0aW9ucyA9IG9wdHMucmVzb2x1dGlvbnNcclxuICAgICAgICBpZiAoIXRoaXMucmVzb2x1dGlvbnMgfHwgdGhpcy5yZXNvbHV0aW9ucy5sZW5ndGggPT0gMClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyByZXNvbHV0aW9ucyBwcm92aWRlZCBmb3IgYmFja2dyb3VuZCBsYXllcicpXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMubmJQaXggPSBvcHRzLm5iUGl4IHx8IDI1NlxyXG4gICAgICAgIC8qKiBDUlMgY29vcmRpbmF0ZXMgb2YgdG9wIGxlZnQgY29ybmVyXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxudW1iZXI+fSAqL1xyXG4gICAgICAgIHRoaXMub3JpZ2luID0gb3B0cy5vcmlnaW4gfHwgWzAsIDBdXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy56MCA9IG9wdHMuejAgfHwgMFxyXG5cclxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuZmlsdGVyQ29sb3IgPSBvcHRzLmZpbHRlckNvbG9yIC8vICh6ZikgPT4gXCIjZWVlN1wiXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgei94L3kgY2FjaGUgZGF0YS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlcclxuICAgICAqIEByZXR1cm5zIHtIVE1MSW1hZ2VFbGVtZW50fHN0cmluZ3x1bmRlZmluZWR9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBnZXQoeiwgeCwgeSkge1xyXG4gICAgICAgIGxldCBkID0gdGhpcy5jYWNoZVt6XVxyXG4gICAgICAgIGlmICghZCkgcmV0dXJuXHJcbiAgICAgICAgZCA9IGRbeF1cclxuICAgICAgICBpZiAoIWQpIHJldHVyblxyXG4gICAgICAgIHJldHVybiBkW3ldXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgei94L3kgY2FjaGUgZGF0YS5cclxuICAgICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudHxzdHJpbmd9IGltZ1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geVxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHB1dChpbWcsIHosIHgsIHkpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbel0pIHRoaXMuY2FjaGVbel0gPSB7fVxyXG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt6XVt4XSkgdGhpcy5jYWNoZVt6XVt4XSA9IHt9XHJcbiAgICAgICAgdGhpcy5jYWNoZVt6XVt4XVt5XSA9IGltZ1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgZHJhdyhjZykge1xyXG4gICAgICAgIGlmICghdGhpcy5yZXNvbHV0aW9ucyB8fCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHJlc29sdXRpb25zIHByb3ZpZGVkIGZvciBiYWNrZ3JvdW5kIGxheWVyJylcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxyXG4gICAgICAgIGNvbnN0IHgwID0gdGhpcy5vcmlnaW5bMF0sXHJcbiAgICAgICAgICAgIHkwID0gdGhpcy5vcmlnaW5bMV1cclxuXHJcbiAgICAgICAgLy9nZXQgem9vbSBsZXZlbCBhbmQgcmVzb2x1dGlvblxyXG4gICAgICAgIGxldCB6ID0gMFxyXG4gICAgICAgIGZvciAoeiA9IDA7IHogPCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aDsgeisrKSBpZiAodGhpcy5yZXNvbHV0aW9uc1t6XSA8IHpmKSBicmVha1xyXG4gICAgICAgIHogLT0gMVxyXG4gICAgICAgIHogPSBNYXRoLm1heCgwLCB6KVxyXG4gICAgICAgIHogPSBNYXRoLm1pbih6LCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aCAtIDEpXHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLnJlc29sdXRpb25zLmxlbmd0aCwgeilcclxuICAgICAgICBjb25zdCByZXMgPSB0aGlzLnJlc29sdXRpb25zW3pdXHJcblxyXG4gICAgICAgIHogKz0gdGhpcy56MFxyXG5cclxuICAgICAgICBjb25zdCBzaXplRyA9IHRoaXMubmJQaXggKiByZXNcclxuICAgICAgICBjb25zdCBzaXplID0gc2l6ZUcgLyB6ZlxyXG5cclxuICAgICAgICAvL2dldCB0aWxlIG51bWJlcnNcclxuICAgICAgICBjb25zdCB4R2VvVG9UTVMgPSAoeCkgPT4gTWF0aC5jZWlsKCh4IC0geDApIC8gc2l6ZUcpXHJcbiAgICAgICAgY29uc3QgeUdlb1RvVE1TID0gKHkpID0+IE1hdGguY2VpbCgtKHkgLSB5MCkgLyBzaXplRylcclxuICAgICAgICBjb25zdCB4TWluID0geEdlb1RvVE1TKGNnLmV4dEdlby54TWluKSAtIDFcclxuICAgICAgICBjb25zdCB4TWF4ID0geEdlb1RvVE1TKGNnLmV4dEdlby54TWF4KVxyXG4gICAgICAgIGNvbnN0IHlNYXggPSB5R2VvVG9UTVMoY2cuZXh0R2VvLnlNaW4pXHJcbiAgICAgICAgY29uc3QgeU1pbiA9IHlHZW9Ub1RNUyhjZy5leHRHZW8ueU1heCkgLSAxXHJcblxyXG4gICAgICAgIC8vVE9ETyA/XHJcbiAgICAgICAgLy9jZy5zZXRDYW52YXNUcmFuc2Zvcm0oKVxyXG5cclxuICAgICAgICAvL2hhbmRsZSBpbWFnZXNcclxuICAgICAgICBmb3IgKGxldCB4ID0geE1pbjsgeCA8IHhNYXg7IHgrKykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCB5ID0geU1pbjsgeSA8IHlNYXg7IHkrKykge1xyXG4gICAgICAgICAgICAgICAgLy9nZXQgaW1hZ2VcclxuICAgICAgICAgICAgICAgIGxldCBpbWcgPSB0aGlzLmdldCh6LCB4LCB5KVxyXG5cclxuICAgICAgICAgICAgICAgIC8vbG9hZCBpbWFnZVxyXG4gICAgICAgICAgICAgICAgaWYgKCFpbWcpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHV0KGltZywgeiwgeCwgeSlcclxuICAgICAgICAgICAgICAgICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5yZWRyYXcoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpbWcub25lcnJvciA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXQoJ2ZhaWxlZCcsIHosIHgsIHkpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGltZy5zcmMgPSB0aGlzLnVybEZ1bih4LCB5LCB6KVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcclxuICAgICAgICAgICAgICAgIGlmIChpbWcgPT09ICdmYWlsZWQnKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgaWYgKCEoaW1nIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhpbWcpXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChpbWcud2lkdGggPT0gMCB8fCBpbWcuaGVpZ2h0ID09IDApIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAgICAgLy9kcmF3IGltYWdlXHJcbiAgICAgICAgICAgICAgICBjb25zdCB4R2VvID0geDAgKyB4ICogc2l6ZUdcclxuICAgICAgICAgICAgICAgIGNvbnN0IHlHZW8gPSB5MCAtIHkgKiBzaXplR1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHguZHJhd0ltYWdlKGltZywgY2cuZ2VvVG9QaXhYKHhHZW8pLCBjZy5nZW9Ub1BpeFkoeUdlbyksIHNpemUsIHNpemUpXHJcbiAgICAgICAgICAgICAgICAgICAgLy9jZy5jdHguZHJhd0ltYWdlKGltZywgeEdlbywgeUdlbywgc2l6ZUcsIC1zaXplRylcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9hcHBseSBmaWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJDb2xvcikge1xyXG4gICAgICAgICAgICBjb25zdCBmYyA9IHRoaXMuZmlsdGVyQ29sb3IoemYpXHJcbiAgICAgICAgICAgIGlmIChmYyAmJiBmYyAhPSAnbm9uZScpIHtcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsU3R5bGUgPSBmY1xyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KDAsIDAsIGNnLncsIGNnLmgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG4vKipcclxuICpcclxuICogQSBtYXAgV01TIGJhY2tncm91bmQgbGF5ZXIuXHJcbiAqIFxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQmFja2dyb3VuZExheWVyV01TIHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBBbiBhdHRyaWJ1dGUgdG8gc3BlY2lmeSBpZiBhIGxheWVyIHNob3VsZCBiZSBkcmF3biBvciBub3RcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gKi9cclxuICAgICAgICB0aGlzLnZpc2libGUgPSBvcHRzLnZpc2libGUgPT0gZmFsc2UgPyBmYWxzZSA6IHRydWVcclxuXHJcbiAgICAgICAgLyoqIFRoZSBtaW5pbXVtIHpvb20gZmFjdG9yOiBCZWxvdyB0aGlzIGxldmVsLCB0aGUgbGF5ZXIgaXMgbm90IHNob3duLlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5taW5ab29tID0gb3B0cy5taW5ab29tIHx8IDBcclxuXHJcbiAgICAgICAgLyoqIFRoZSBtYXhpbXVtIHpvb20gZmFjdG9yOiBBYm92ZSB0aGlzIGxldmVsLCB0aGUgbGF5ZXIgaXMgbm90IHNob3duLlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5tYXhab29tID0gb3B0cy5tYXhab29tIHx8IEluZmluaXR5XHJcblxyXG4gICAgICAgIC8vZW5zdXJlIGFjY2VwdGFibGUgdmFsdWVzIGZvciB0aGUgem9vbSBsaW1pdHMuXHJcbiAgICAgICAgaWYgKHRoaXMubWluWm9vbSA+PSB0aGlzLm1heFpvb20pXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCB6b29tIGxpbWl0cyBmb3IgbGF5ZXIuIFpvb20gbWluIHNob3VsZCBiZSBzbWFsbGVyIHRoYW4gem9vbSBtYXguJylcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnVybCA9IG9wdHMudXJsXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5maWx0ZXJDb2xvciA9IG9wdHMuZmlsdGVyQ29sb3IgLy8gKHpmKSA9PiBcIiNlZWU3XCJcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MSW1hZ2VFbGVtZW50fHVuZGVmaW5lZH0gKi9cclxuICAgICAgICB0aGlzLmltZyA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMueE1pbiA9IHVuZGVmaW5lZDtcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgdGhpcy54TWF4ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICB0aGlzLnlNaW4gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMueU1heCA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ2hlY2sgaWYgdGhlIHZpZXcgaGFzIG1vdmVkIGFuZCBhIG5ldyBpbWFnZSBuZWVkcyB0byBiZSByZXRyaWV2ZWQuXHJcbiAgICAgKiBAcHJpdmF0ZSAqL1xyXG4gICAgaGFzTW92ZWQoZXh0R2VvKSB7XHJcbiAgICAgICAgaWYgKChleHRHZW8ueE1pbikgIT0gdGhpcy54TWluKSByZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGVsc2UgaWYgKChleHRHZW8ueE1heCkgIT0gdGhpcy54TWF4KSByZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGVsc2UgaWYgKChleHRHZW8ueU1pbikgIT0gdGhpcy55TWluKSByZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGVsc2UgaWYgKChleHRHZW8ueU1heCkgIT0gdGhpcy55TWF4KSByZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgZHJhdyhjZykge1xyXG5cclxuICAgICAgICAvL3VwZGF0ZSBtYXAgZXh0ZW50XHJcbiAgICAgICAgY2cudXBkYXRlRXh0ZW50R2VvKDApXHJcblxyXG4gICAgICAgIGlmICghdGhpcy5oYXNNb3ZlZChjZy5leHRHZW8pICYmIHRoaXMuaW1nKSB7XHJcbiAgICAgICAgICAgIC8vdGhlIG1hcCBkaWQgbm90IG1vdmUgYW5kIHRoZSBpbWFnZSB3YXMgYWxyZWFkeSBkb3dubG9hZGVkOiBkcmF3IHRoZSBpbWFnZVxyXG4gICAgICAgICAgICBjZy5jdHguZHJhd0ltYWdlKHRoaXMuaW1nLCAwLCAwLCBjZy53LCBjZy5oKVxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvL3RoZSBtYXAgbW92ZWQ6IHJldHJpZXZlIG5ldyBpbWFnZVxyXG5cclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgdGhpcy54TWluID0gY2cuZXh0R2VvLnhNaW5cclxuICAgICAgICAgICAgdGhpcy54TWF4ID0gY2cuZXh0R2VvLnhNYXhcclxuICAgICAgICAgICAgdGhpcy55TWluID0gY2cuZXh0R2VvLnlNaW5cclxuICAgICAgICAgICAgdGhpcy55TWF4ID0gY2cuZXh0R2VvLnlNYXhcclxuXHJcbiAgICAgICAgICAgIC8vYnVpbGQgV01TIFVSTFxyXG4gICAgICAgICAgICBjb25zdCB1cmwgPSBbXVxyXG4gICAgICAgICAgICB1cmwucHVzaCh0aGlzLnVybClcclxuICAgICAgICAgICAgdXJsLnB1c2goXCImd2lkdGg9XCIpXHJcbiAgICAgICAgICAgIHVybC5wdXNoKGNnLncpXHJcbiAgICAgICAgICAgIHVybC5wdXNoKFwiJmhlaWdodD1cIilcclxuICAgICAgICAgICAgdXJsLnB1c2goY2cuaClcclxuICAgICAgICAgICAgLy9iYm94OiB4bWluIHltaW4geG1heCB5bWF4XHJcbiAgICAgICAgICAgIHVybC5wdXNoKFwiJmJib3g9XCIpXHJcbiAgICAgICAgICAgIHVybC5wdXNoKGNnLmV4dEdlby54TWluKVxyXG4gICAgICAgICAgICB1cmwucHVzaChcIixcIilcclxuICAgICAgICAgICAgdXJsLnB1c2goY2cuZXh0R2VvLnlNaW4pXHJcbiAgICAgICAgICAgIHVybC5wdXNoKFwiLFwiKVxyXG4gICAgICAgICAgICB1cmwucHVzaChjZy5leHRHZW8ueE1heClcclxuICAgICAgICAgICAgdXJsLnB1c2goXCIsXCIpXHJcbiAgICAgICAgICAgIHVybC5wdXNoKGNnLmV4dEdlby55TWF4KVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdXJsUyA9IHVybC5qb2luKFwiXCIpXHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2codXJsUylcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbWcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW1nID0gbmV3IEltYWdlKClcclxuICAgICAgICAgICAgICAgIHRoaXMuaW1nLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjZy5yZWRyYXcoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbWcub25lcnJvciA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvL2Nhc2Ugd2hlbiBubyBpbWFnZVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkNvdWxkIG5vdCByZXRyaWV2ZSBXTVMgYmFja2dyb3VuZCBpbWFnZSBmcm9tXCIsIHVybFMpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vc2V0IFVSTCB0byBsYXVuY2ggdGhlIGRvd25sb2FkXHJcbiAgICAgICAgICAgIHRoaXMuaW1nLnNyYyA9IHVybFNcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vYXBwbHkgZmlsdGVyXHJcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyQ29sb3IpIHtcclxuICAgICAgICAgICAgY29uc3QgZmMgPSB0aGlzLmZpbHRlckNvbG9yKHpmKVxyXG4gICAgICAgICAgICBpZiAoZmMgJiYgZmMgIT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gZmNcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsUmVjdCgwLCAwLCBjZy53LCBjZy5oKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuLyoqXHJcbiAqIEEgZ3JpZCBjZWxsLlxyXG4gKiBAdHlwZWRlZiB7e3g6IG51bWJlciwgeTogbnVtYmVyfX0gQ2VsbCAqL1xyXG4vKipcclxuICogQW4gZW52ZWxvcGUuXHJcbiAqIEB0eXBlZGVmIHsge3hNaW46IG51bWJlciwgeE1heDogbnVtYmVyLCB5TWluOiBudW1iZXIsIHlNYXg6IG51bWJlcn0gfSBFbnZlbG9wZSAqL1xyXG5cclxuLyoqXHJcbiAqIEEgbXVsdGkgcmVzb2x1dGlvbiBkYXRhc2V0IG9mIGdyaWQgY2VsbHMuXHJcbiAqIEl0IGNvbnNpc3RzIG9mIGRpZmZlcmVudCB7QGxpbmsgRGF0YXNldENvbXBvbmVudH1zIGZvciBlYWNoIHJlc29sdXRpb24uXHJcbiAqXHJcbiAqIEBhYnN0cmFjdFxyXG4gKlxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGF0YXNldCB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4vRGF0YXNldENvbXBvbmVudFwiKS5EYXRhc2V0Q29tcG9uZW50Pn0gZGF0YXNldENvbXBvbmVudHMgVGhlIGRhdGFzZXQgY29tcG9uZW50c1xyXG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gcmVzb2x1dGlvbnMgVGhlIHJlc29sdXRpb25zIG9mIHRoZSBkYXRhc2V0IGNvbXBvbmVudHMsIGluIENSUyBnZW9ncmFwaGljYWwgdW5pdFxyXG4gICAgICogQHBhcmFtIHsge3ByZXByb2Nlc3M/OmZ1bmN0aW9uKENlbGwpOmJvb2xlYW59IH0gb3B0cyBPcHRpb25zLiBwcmVwcm9jZXNzOiBBIGZ1bmN0aW9uIHRvIGFwcGx5IG9uIGVhY2ggZGF0YXNldCBjZWxsIHRvIHByZXBhcmUgaXRzIHZhbHVlcy4gQ2FuIGJlIHVzZWQgYWxzbyB0byBzZWxlY3QgY2VsbHMgdG8ga2VlcC5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoZGF0YXNldENvbXBvbmVudHMsIHJlc29sdXRpb25zLCBvcHRzID0ge30pIHtcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogVGhlIGRhdGFzZXQgY29tcG9uZW50cy5cclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4vRGF0YXNldENvbXBvbmVudFwiKS5EYXRhc2V0Q29tcG9uZW50Pn0gKi9cclxuICAgICAgICB0aGlzLmRhdGFzZXRDb21wb25lbnRzID0gZGF0YXNldENvbXBvbmVudHNcclxuXHJcbiAgICAgICAgLyoqIFRoZSByZXNvbHV0aW9ucyBvZiB0aGUgZGF0YXNldCBjb21wb25lbnRzLCBpbiBDUlMgZ2VvZ3JhcGhpY2FsIHVuaXQuXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxudW1iZXI+fSAqL1xyXG4gICAgICAgIHRoaXMucmVzb2x1dGlvbnMgPSByZXNvbHV0aW9uc1xyXG5cclxuICAgICAgICAvL3RoZXJlIG11c3QgYmUgYXMgbWFueSBkYXRhc2V0IGNvbXBvbmVudHMgYXMgcmVzb2x1dGlvbnNcclxuICAgICAgICBpZiAodGhpcy5kYXRhc2V0Q29tcG9uZW50cy5sZW5ndGggPiAxICYmIHRoaXMuZGF0YXNldENvbXBvbmVudHMubGVuZ3RoICE9IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICAnVW5jb21wYXRpYmxlIG51bWJlciBvZiBkYXRhc2V0cyBhbmQgcmVzb2x1dGlvbnM6ICcgK1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNldENvbXBvbmVudHMubGVuZ3RoICtcclxuICAgICAgICAgICAgICAgICAgICAnICcgK1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoXHJcbiAgICAgICAgICAgIClcclxuXHJcbiAgICAgICAgLy9zZXQgZGF0YXNldCBwcmVwcm9jZXNzZXMgaWYgc3BlY2lmaWVkXHJcbiAgICAgICAgaWYgKG9wdHMucHJlcHJvY2VzcykgdGhpcy5zZXRQcmVwb2Nlc3NlcyhvcHRzLnByZXByb2Nlc3MpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgYSBwcmVwcm9jZXNzIGZ1bmN0aW9uIGZvciBhbGwgZGF0YXNldCBjb21wb25lbnRzLlxyXG4gICAgICogVGhpcyBpcyBhIGZ1bmN0aW9uIGFwcGxpZWQgb24gZWFjaCBjZWxsIGFmdGVyIGl0IGhhcyBiZWVuIGxvYWRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKENlbGwpOmJvb2xlYW59IHByZXByb2Nlc3NcclxuICAgICAqIEByZXR1cm5zIHt0aGlzfVxyXG4gICAgICovXHJcbiAgICBzZXRQcmVwb2Nlc3NlcyhwcmVwcm9jZXNzKSB7XHJcbiAgICAgICAgZm9yIChsZXQgZHMgb2YgdGhpcy5kYXRhc2V0Q29tcG9uZW50cykgZHMucHJlcHJvY2VzcyA9IHByZXByb2Nlc3NcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBmdW5jdGlvbiB0byBlYXNlIHRoZSBjcmVhdGlvbiBvZiBkYXRhc2V0cyBmcm9tIHRoZWlyIGNvbXBvbmVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gcmVzb2x1dGlvbnMgVGhlIHJlc29sdXRpb25zIG9mIHRoZSBkYXRhc2V0IGNvbXBvbmVudHMsIGluIENSUyBnZW9ncmFwaGljYWwgdW5pdFxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihudW1iZXIpOmltcG9ydChcIi4vRGF0YXNldENvbXBvbmVudFwiKS5EYXRhc2V0Q29tcG9uZW50fSByZXNUb0RhdGFzZXRDb21wb25lbnQgRnVuY3Rpb24gcmV0dXJuaW5nIGEgZGF0YXNldCBjb21wb25lbnQgZnJvbSBhIHJlc29sdXRpb25cclxuICAgICAqIEBwYXJhbSB7IHtwcmVwcm9jZXNzPzpmdW5jdGlvbihDZWxsKTpib29sZWFufSB9IG9wdHMgT3B0aW9ucy4gcHJlcHJvY2VzczogQSBmdW5jdGlvbiB0byBhcHBseSBvbiBlYWNoIGRhdGFzZXQgY2VsbCB0byBwcmVwYXJlIGl0cyB2YWx1ZXNcclxuICAgICAqIEByZXR1cm5zIHtEYXRhc2V0fVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgbWFrZShyZXNvbHV0aW9ucywgcmVzVG9EYXRhc2V0Q29tcG9uZW50LCBvcHRzKSB7XHJcbiAgICAgICAgLy9tYWtlIGRhdGFzZXQgY29tcG9uZW50c1xyXG4gICAgICAgIGNvbnN0IGRzYyA9IFtdXHJcbiAgICAgICAgZm9yIChjb25zdCByZXMgb2YgcmVzb2x1dGlvbnMpIGRzYy5wdXNoKHJlc1RvRGF0YXNldENvbXBvbmVudChyZXMpKVxyXG4gICAgICAgIC8vbWFrZSBkYXRhc2V0XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhc2V0KGRzYywgcmVzb2x1dGlvbnMsIG9wdHMpXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG4vKiogQHR5cGVkZWYge1wiQ1NWXCJ8XCJQQVJRVUVUXCJ9IEZvcm1hdCAqL1xyXG5cclxuLyoqXHJcbiAqIEEgZGF0YXNldCBjb21wb25lbnQsIG9mIGdyaWQgY2VsbHMuXHJcbiAqIEBhYnN0cmFjdFxyXG4gKlxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGF0YXNldENvbXBvbmVudCB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCBvZiB0aGUgZGF0YXNldC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZSBkYXRhc2V0IHJlc29sdXRpb24sIGluIHRoZSBDUlMgZ2VvZ3JhcGhpY2FsIHVuaXQuXHJcbiAgICAgKiBAcGFyYW0ge3twcmVwcm9jZXNzPzpmdW5jdGlvbihpbXBvcnQoXCIuL0RhdGFzZXRcIikuQ2VsbCk6Ym9vbGVhbn19IG9wdHNcclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3Rvcih1cmwsIHJlc29sdXRpb24sIG9wdHMgPSB7fSkge1xyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB1cmwgb2YgdGhlIGRhdGFzZXQuXHJcbiAgICAgICAgICogQHByb3RlY3RlZFxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy51cmwgPSB1cmxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRhdGFzZXQgcmVzb2x1dGlvbiBpbiBnZW9ncmFwaGljYWwgdW5pdC5cclxuICAgICAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnJlc29sdXRpb24gPSByZXNvbHV0aW9uXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcHJlcHJvY2VzcyB0byBydW4gb24gZWFjaCBjZWxsIGFmdGVyIGxvYWRpbmcuIEl0IGNhbiBiZSB1c2VkIHRvIGFwcGx5IHNvbWUgc3BlY2lmaWMgdHJlYXRtZW50IGJlZm9yZSBvciBjb21wdXRlIGEgbmV3IGNvbHVtbi4gQW5kIGFsc28gdG8gZGV0ZXJtaW5lIHdoaWNoIGNlbGxzIHRvIGtlZXAgYWZ0ZXIgbG9hZGluZy5cclxuICAgICAgICAgKiBAdHlwZSB7KGZ1bmN0aW9uKGltcG9ydChcIi4vRGF0YXNldFwiKS5DZWxsKTpib29sZWFuICl8IHVuZGVmaW5lZCB9ICovXHJcbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzID0gb3B0cy5wcmVwcm9jZXNzIHx8IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICAvKiogVGhlIGNlbGxzIHdpdGhpbiB0aGUgdmlld1xyXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4vRGF0YXNldFwiKS5DZWxsPn0gKi9cclxuICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlID0gW11cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlcXVlc3QgZGF0YSB3aXRoaW4gYSBnZW9ncmFwaGljIGVudmVsb3BlLlxyXG4gICAgICpcclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0RhdGFzZXRcIikuRW52ZWxvcGV8dW5kZWZpbmVkfSBleHRHZW9cclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTp2b2lkfSBjYWxsYmFja1xyXG4gICAgICogQHJldHVybnMge3RoaXN9XHJcbiAgICAgKi9cclxuICAgIGdldERhdGEoZXh0R2VvLCBjYWxsYmFjaykge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIGdldERhdGEgbm90IGltcGxlbWVudGVkLicpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWxsIHRoZSB2aWV3IGNhY2hlIHdpdGggYWxsIGNlbGxzIHdoaWNoIGFyZSB3aXRoaW4gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXHJcbiAgICAgKiBAYWJzdHJhY3RcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkVudmVsb3BlfSBleHRHZW8gVGhlIHZpZXcgZ2VvZ3JhcGhpY2FsIGVudmVsb3BlLlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVZpZXdDYWNoZShleHRHZW8pIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCB1cGRhdGVWaWV3Q2FjaGUgbm90IGltcGxlbWVudGVkLicpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYSBjZWxsIHVuZGVyIGEgZ2l2ZW4gcG9zaXRpb24sIGlmIGFueS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3t4Om51bWJlcix5Om51bWJlcn19IHBvc0dlb1xyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxscyBTb21lIGNlbGxzIGZyb20gdGhlIGRhdGFzZXQgKGEgc3Vic2V0IGlmIG5lY2Vzc2FyeSwgdXN1YWxseSB0aGUgdmlldyBjYWNoZSkuXHJcbiAgICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGx8dW5kZWZpbmVkfVxyXG4gICAgICovXHJcbiAgICBnZXRDZWxsRnJvbVBvc2l0aW9uKHBvc0dlbywgY2VsbHMpIHtcclxuICAgICAgICAvL2NvbXB1dGUgY2FuZGlkYXRlIGNlbGwgcG9zaXRpb25cclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICBjb25zdCByID0gdGhpcy5nZXRSZXNvbHV0aW9uKClcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICBjb25zdCBjZWxsWCA9IHIgKiBNYXRoLmZsb29yKHBvc0dlby54IC8gcilcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICBjb25zdCBjZWxsWSA9IHIgKiBNYXRoLmZsb29yKHBvc0dlby55IC8gcilcclxuXHJcbiAgICAgICAgLy9nZXQgY2VsbFxyXG4gICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiBjZWxscykge1xyXG4gICAgICAgICAgICBpZiAoY2VsbC54ICE9IGNlbGxYKSBjb250aW51ZVxyXG4gICAgICAgICAgICBpZiAoY2VsbC55ICE9IGNlbGxZKSBjb250aW51ZVxyXG4gICAgICAgICAgICByZXR1cm4gY2VsbFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICB9XHJcblxyXG4gICAgLy9nZXR0ZXJzIGFuZCBzZXR0ZXJzXHJcblxyXG4gICAgLyoqIEByZXR1cm5zIHtudW1iZXJ9ICovXHJcbiAgICBnZXRSZXNvbHV0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlc29sdXRpb25cclxuICAgIH1cclxuXHJcbiAgICAvKiogQHJldHVybnMge0FycmF5LjxpbXBvcnQoXCIuL0RhdGFzZXRcIikuQ2VsbD59ICovXHJcbiAgICBnZXRWaWV3Q2FjaGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2VsbHNWaWV3Q2FjaGVcclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbi8qKiBAdHlwZWRlZiB7IHt4TWluOiBudW1iZXIsIHhNYXg6IG51bWJlciwgeU1pbjogbnVtYmVyLCB5TWF4OiBudW1iZXJ9IH0gRW52ZWxvcGUgKi9cclxuXHJcbmltcG9ydCB7IHNlbGVjdCB9IGZyb20gJ2QzLXNlbGVjdGlvbidcclxuaW1wb3J0IHsgem9vbSwgem9vbUlkZW50aXR5IH0gZnJvbSAnZDMtem9vbSdcclxuXHJcbi8qKlxyXG4gKiBBIEhUTUwgY2FudmFzIGZvciBnZW8gZGF0YSBkaXNwbGF5LCBlbmhhbmNlZCB3aXRoIHpvb20gYW5kIHBhbiBjYXBhYmlsaXRpZXMuXHJcbiAqXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBHZW9DYW52YXMge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAY29uc3RydWN0b3JcclxuICAgICAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhc1xyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGNlbnRlciBHZW9ncmFwaGljYWwgY29vcmRpbmF0ZXMgb2YgdGhlIGNlbnRlclxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpmIFRoZSB6b29tIGZhY3RvciAocGl4ZWwgc2l6ZSwgaW4gZ3JvdW5kIG0pXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihjYW52YXMsIGNlbnRlciwgemYsIG9wdHMpIHtcclxuICAgICAgICB0aGlzLm9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7SFRNTENhbnZhc0VsZW1lbnR9ICovXHJcbiAgICAgICAgdGhpcy5jYW52YXMgPSBjYW52YXNcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy53ID0gdGhpcy5jYW52YXMub2Zmc2V0V2lkdGhcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmggPSB0aGlzLmNhbnZhcy5vZmZzZXRIZWlnaHRcclxuXHJcbiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLndcclxuICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmhcclxuXHJcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxyXG4gICAgICAgIGlmICghY3R4KSB0aHJvdyAnSW1wb3NzaWJsZSB0byBjcmVhdGUgY2FudmFzIDJEIGNvbnRleHQnXHJcbiAgICAgICAgLyoqQHR5cGUge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gKi9cclxuICAgICAgICB0aGlzLmN0eCA9IGN0eFxyXG5cclxuICAgICAgICAvLyBzZXQgZ2VvIGNvb3JkaW5hdGVzIG9mIHRoZSBjZW50ZXJcclxuICAgICAgICB0aGlzLmNlbnRlciA9IGNlbnRlciB8fCB7IHg6IHRoaXMudyAqIDAuNSwgeTogdGhpcy5oICogMC41IH1cclxuXHJcbiAgICAgICAgLy8gem9vbSBmYWN0b3I6IHBpeGVsIHNpemUsIGluIG0vcGl4XHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy56ZiA9IHpmXHJcblxyXG4gICAgICAgIC8qKiBCYWNrZ3JvdW5kIGNvbG9yLlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBvcHRzLmJhY2tncm91bmRDb2xvciB8fCAnd2hpdGUnXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24oKTp2b2lkfSAqL1xyXG4gICAgICAgIHRoaXMub25ab29tU3RhcnRGdW4gPSBvcHRzLm9uWm9vbVN0YXJ0RnVuXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24oKTp2b2lkfSAqL1xyXG4gICAgICAgIHRoaXMub25ab29tRW5kRnVuID0gb3B0cy5vblpvb21FbmRGdW5cclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbigpOnZvaWR9ICovXHJcbiAgICAgICAgdGhpcy5vblpvb21GdW4gPSBvcHRzLm9uWm9vbUZ1blxyXG5cclxuICAgICAgICAvL2N1cnJlbnQgZXh0ZW50XHJcbiAgICAgICAgLyoqIEB0eXBlIHtFbnZlbG9wZX0gKi9cclxuICAgICAgICB0aGlzLmV4dEdlbyA9IHsgeE1pbjogTmFOLCB4TWF4OiBOYU4sIHlNaW46IE5hTiwgeU1heDogTmFOIH1cclxuICAgICAgICB0aGlzLnVwZGF0ZUV4dGVudEdlbygpXHJcblxyXG4gICAgICAgIC8vcmVseSBvbiBkMyB6b29tIGZvciBwYW4vem9vbVxyXG4gICAgICAgIGlmICghb3B0cy5kaXNhYmxlWm9vbSkge1xyXG4gICAgICAgICAgICBsZXQgdFAgPSB6b29tSWRlbnRpdHlcclxuICAgICAgICAgICAgY29uc3QgeiA9IHpvb20oKVxyXG4gICAgICAgICAgICAgICAgLy90byBtYWtlIHRoZSB6b29taW5nIGEgYml0IGZhc3RlclxyXG4gICAgICAgICAgICAgICAgLndoZWVsRGVsdGEoKGUpID0+IC1lLmRlbHRhWSAqIChlLmRlbHRhTW9kZSA9PT0gMSA/IDAuMDcgOiBlLmRlbHRhTW9kZSA/IDEgOiAwLjAwNCkpXHJcbiAgICAgICAgICAgICAgICAub24oJ3pvb20nLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlLnRyYW5zZm9ybVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGYgPSB0UC5rIC8gdC5rXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGYgPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeCA9IHRQLnggLSB0LnhcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHkgPSB0UC55IC0gdC55XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFuKGR4ICogdGhpcy5nZXRaZigpLCAtZHkgKiB0aGlzLmdldFpmKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2UgPSBlLnNvdXJjZUV2ZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZSBpbnN0YW5jZW9mIFdoZWVsRXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vem9vbSBhdCB0aGUgbW91c2UgcG9zaXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuem9vbShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGl4VG9HZW9YKGUuc291cmNlRXZlbnQub2Zmc2V0WCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waXhUb0dlb1koZS5zb3VyY2VFdmVudC5vZmZzZXRZKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlIGluc3RhbmNlb2YgVG91Y2hFdmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb21wdXRlIGF2ZXJhZ2UgcG9zaXRpb24gb2YgdGhlIHRvdWNoZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eCA9IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHkgPSAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0dCBvZiBzZS50YXJnZXRUb3VjaGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggKz0gdHQuY2xpZW50WFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5ICs9IHR0LmNsaWVudFlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4IC89IHNlLnRhcmdldFRvdWNoZXMubGVuZ3RoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eSAvPSBzZS50YXJnZXRUb3VjaGVzLmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy96b29tIGF0IHRoaXMgYXZlcmFnZSBwb3NpdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56b29tKGYsIHRoaXMucGl4VG9HZW9YKHR4KSwgdGhpcy5waXhUb0dlb1kodHkpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRQID0gdFxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vblpvb21GdW4pIHRoaXMub25ab29tRnVuKGUpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLm9uKCdzdGFydCcsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5jLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuYy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5jLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKHRoaXMuY2FudmFzLCAwLCAwKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keCA9IDBcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHkgPSAwXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmYgPSAxXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uWm9vbVN0YXJ0RnVuKSB0aGlzLm9uWm9vbVN0YXJ0RnVuKGUpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLm9uKCdlbmQnLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVkcmF3KHRydWUpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlID0geyBjOiBudWxsLCBkeDogMCwgZHk6IDAsIGY6IDEgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vblpvb21FbmRGdW4pIHRoaXMub25ab29tRW5kRnVuKGUpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB6KHNlbGVjdCh0aGlzLmNhbnZhcykpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vc2VsZWN0KHRoaXMuY2FudmFzKS5jYWxsKHopO1xyXG5cclxuICAgICAgICAvKiogWm9vbSBleHRlbnQsIHRvIGxpbWl0IHpvb20gaW4gYW5kIG91dFxyXG4gICAgICAgICAqICBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXHJcbiAgICAgICAgdGhpcy56ZkV4dGVudCA9IFswLCBJbmZpbml0eV1cclxuXHJcbiAgICAgICAgLyoqIENhbnZhcyBzdGF0ZSwgdG8gYmUgdXNlZCB0byBhdm9pZCB1bm5lY2Vzc2FyeSByZWRyYXdzIG9uIHpvb20vcGFuXHJcbiAgICAgICAgICogIEB0eXBlIHt7YzpIVE1MQ2FudmFzRWxlbWVudHxudWxsLGR4Om51bWJlcixkeTpudW1iZXIsZjpudW1iZXJ9fSAqL1xyXG4gICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IHsgYzogbnVsbCwgZHg6IDAsIGR5OiAwLCBmOiAxIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQHBhcmFtIHt7eDpudW1iZXIseTpudW1iZXJ9fSB2IEdlb2dyYXBoaWNhbCBjb29yZGluYXRlcyBvZiB0aGUgY2VudGVyICovXHJcbiAgICBzZXRDZW50ZXIodikge1xyXG4gICAgICAgIHRoaXMuY2VudGVyID0gdlxyXG4gICAgfVxyXG4gICAgLyoqIEByZXR1cm5zIHt7eDpudW1iZXIseTpudW1iZXJ9fSBHZW9ncmFwaGljYWwgY29vcmRpbmF0ZXMgb2YgdGhlIGNlbnRlciAqL1xyXG4gICAgZ2V0Q2VudGVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNlbnRlclxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0ge251bWJlcn0gdiBUaGUgem9vbSBmYWN0b3IgKHBpeGVsIHNpemUsIGluIGdyb3VuZCBtKSAqL1xyXG4gICAgc2V0WmYodikge1xyXG4gICAgICAgIHRoaXMuemYgPSB2XHJcbiAgICAgICAgaWYgKHRoaXMuc2xpZGVyKSB0aGlzLnNsaWRlci5hdHRyKCd2YWx1ZScsICt0aGlzLnpmKVxyXG4gICAgfVxyXG4gICAgLyoqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB6b29tIGZhY3RvciAocGl4ZWwgc2l6ZSwgaW4gZ3JvdW5kIG0pICovXHJcbiAgICBnZXRaZigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy56ZlxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSB2ICovXHJcbiAgICBzZXRaZkV4dGVudCh2KSB7XHJcbiAgICAgICAgdGhpcy56ZkV4dGVudCA9IHZcclxuICAgIH1cclxuICAgIC8qKiBAcmV0dXJucyB7QXJyYXkuPG51bWJlcj59ICovXHJcbiAgICBnZXRaZkV4dGVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy56ZkV4dGVudFxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBJbml0aWFsaXNlIGNhbnZhcyB0cmFuc2Zvcm0gd2l0aCBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbi4gKi9cclxuICAgIGluaXRDYW52YXNUcmFuc2Zvcm0oKSB7XHJcbiAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEluaXRpYWxpc2UgY2FudmFzIHRyYW5zZm9ybSB3aXRoIGdlbyB0byBzY3JlZW4gdHJhbnNmb3JtYXRpb24sIHNvIHRoYXQgZ2VvIG9iamVjdHMgY2FuIGJlIGRyYXduIGRpcmVjdGx5IGluIGdlbyBjb29yZGluYXRlcy4gKi9cclxuICAgIHNldENhbnZhc1RyYW5zZm9ybSgpIHtcclxuICAgICAgICBjb25zdCBrID0gMSAvIHRoaXMuZ2V0WmYoKVxyXG4gICAgICAgIGNvbnN0IHR4ID0gLXRoaXMuY2VudGVyLnggLyB0aGlzLmdldFpmKCkgKyB0aGlzLncgKiAwLjVcclxuICAgICAgICBjb25zdCB0eSA9IHRoaXMuY2VudGVyLnkgLyB0aGlzLmdldFpmKCkgKyB0aGlzLmggKiAwLjVcclxuICAgICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oaywgMCwgMCwgLWssIHR4LCB0eSlcclxuICAgIH1cclxuXHJcbiAgICAvKiogR2V0IHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdG8gd2ViR0wgc2NyZWVuIGNvb3JkaW5hdGVzLCB3aXRoaW4gWy0xLDFdKlstMSwxXSAqL1xyXG4gICAgZ2V0V2ViR0xUcmFuc2Zvcm0oKSB7XHJcbiAgICAgICAgY29uc3Qga3ggPSAyLjAgLyAodGhpcy53ICogdGhpcy5nZXRaZigpKVxyXG4gICAgICAgIGNvbnN0IGt5ID0gMi4wIC8gKHRoaXMuaCAqIHRoaXMuZ2V0WmYoKSlcclxuICAgICAgICByZXR1cm4gW2t4LCAwLjAsIDAuMCwgMC4wLCBreSwgMC4wLCAta3ggKiB0aGlzLmNlbnRlci54LCAta3kgKiB0aGlzLmNlbnRlci55LCAxLjBdXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRoZSBmdW5jdGlvbiBzcGVjaWZ5aW5nIGhvdyB0byBkcmF3IHRoZSBtYXAuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHN0cm9uZyAqL1xyXG4gICAgcmVkcmF3KHN0cm9uZyA9IHRydWUpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCByZWRyYXcgbm90IGltcGxlbWVudGVkLicpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhci4gVG8gYmUgdXNlZCBiZWZvcmUgYSByZWRyYXcgZm9yIGV4YW1wbGUuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sb3JcclxuICAgICAqL1xyXG4gICAgY2xlYXIoY29sb3IgPSAnd2hpdGUnKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0cy50cmFuc3BhcmVudEJhY2tncm91bmQpIHtcclxuICAgICAgICAgICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMudywgdGhpcy5oKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN0eCkgdGhpcy5jdHguZmlsbFN0eWxlID0gY29sb3JcclxuICAgICAgICAgICAgdGhpcy5jdHguZmlsbFJlY3QoMCwgMCwgdGhpcy53LCB0aGlzLmgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGR4R2VvXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZHlHZW9cclxuICAgICAqL1xyXG4gICAgcGFuKGR4R2VvID0gMCwgZHlHZW8gPSAwKSB7XHJcbiAgICAgICAgLy9UT0RPIGZvcmNlIGV4dGVuZCB0byByZW1haW5cclxuICAgICAgICB0aGlzLmNlbnRlci54ICs9IGR4R2VvXHJcbiAgICAgICAgdGhpcy5jZW50ZXIueSArPSBkeUdlb1xyXG4gICAgICAgIHRoaXMudXBkYXRlRXh0ZW50R2VvKClcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2FudmFzU2F2ZS5jKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keCAtPSBkeEdlbyAvIHRoaXMuZ2V0WmYoKVxyXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHkgKz0gZHlHZW8gLyB0aGlzLmdldFpmKClcclxuICAgICAgICAgICAgdGhpcy5jbGVhcih0aGlzLmJhY2tncm91bmRDb2xvcilcclxuICAgICAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKHRoaXMuY2FudmFzU2F2ZS5jLCB0aGlzLmNhbnZhc1NhdmUuZHgsIHRoaXMuY2FudmFzU2F2ZS5keSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBab29tLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGYgVGhlIHpvb20gZmFjdG9yLCB3aXRoaW4gXTAsIEluZmluaXR5XS4gMSBpcyBmb3Igbm8gY2hhbmdlLiA8MSB0byB6b29tLWluLCA+MSB0byB6b29tLW91dC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4R2VvIFRoZSB4IGdlbyBwb3NpdGlvbiBmaXhlZCBpbiB0aGUgc2NyZWVuLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlHZW8gVGhlIHkgZ2VvIHBvc2l0aW9uIGZpeGVkIGluIHRoZSBzY3JlZW4uXHJcbiAgICAgKi9cclxuICAgIHpvb20oZiA9IDEsIHhHZW8gPSB0aGlzLmNlbnRlci54LCB5R2VvID0gdGhpcy5jZW50ZXIueSkge1xyXG4gICAgICAgIC8vVE9ETyBmb3JjZSBnZW8gZXh0ZW5kIHRvIHJlbWFpblxyXG5cclxuICAgICAgICAvL3RyeWluZyB0byB6b29tIGluL291dCBiZXlvbmQgbGltaXRcclxuICAgICAgICBpZiAodGhpcy56ZkV4dGVudFswXSA9PSB0aGlzLmdldFpmKCkgJiYgZiA8PSAxKSByZXR1cm5cclxuICAgICAgICBpZiAodGhpcy56ZkV4dGVudFsxXSA9PSB0aGlzLmdldFpmKCkgJiYgZiA+PSAxKSByZXR1cm5cclxuXHJcbiAgICAgICAgLy9lbnN1cmUgem9vbSBleHRlbnQgcHJlc2VydmVkXHJcbiAgICAgICAgY29uc3QgbmV3WmYgPSBmICogdGhpcy5nZXRaZigpXHJcbiAgICAgICAgaWYgKG5ld1pmIDwgdGhpcy56ZkV4dGVudFswXSkgZiA9IHRoaXMuemZFeHRlbnRbMF0gLyB0aGlzLmdldFpmKClcclxuICAgICAgICBpZiAobmV3WmYgPiB0aGlzLnpmRXh0ZW50WzFdKSBmID0gdGhpcy56ZkV4dGVudFsxXSAvIHRoaXMuZ2V0WmYoKVxyXG5cclxuICAgICAgICB0aGlzLnNldFpmKGYgKiB0aGlzLmdldFpmKCkpXHJcbiAgICAgICAgY29uc3QgZHhHZW8gPSAoeEdlbyAtIHRoaXMuY2VudGVyLngpICogKDEgLSBmKVxyXG4gICAgICAgIHRoaXMuY2VudGVyLnggKz0gZHhHZW9cclxuICAgICAgICBjb25zdCBkeUdlbyA9ICh5R2VvIC0gdGhpcy5jZW50ZXIueSkgKiAoMSAtIGYpXHJcbiAgICAgICAgdGhpcy5jZW50ZXIueSArPSBkeUdlb1xyXG4gICAgICAgIHRoaXMudXBkYXRlRXh0ZW50R2VvKClcclxuXHJcbiAgICAgICAgLy9UT0RPXHJcbiAgICAgICAgLy90aGlzLnJlZHJhdyhmYWxzZSlcclxuICAgICAgICBpZiAodGhpcy5jYW52YXNTYXZlLmMpIHtcclxuICAgICAgICAgICAgdGhpcy5jbGVhcih0aGlzLmJhY2tncm91bmRDb2xvcilcclxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmYgLz0gZlxyXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHggPSB0aGlzLmdlb1RvUGl4WCh4R2VvKSAqICgxIC0gdGhpcy5jYW52YXNTYXZlLmYpXHJcbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keSA9IHRoaXMuZ2VvVG9QaXhZKHlHZW8pICogKDEgLSB0aGlzLmNhbnZhc1NhdmUuZilcclxuICAgICAgICAgICAgdGhpcy5jbGVhcih0aGlzLmJhY2tncm91bmRDb2xvcilcclxuICAgICAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmMsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHgsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHksXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZiAqIHRoaXMuY2FudmFzU2F2ZS5jLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmYgKiB0aGlzLmNhbnZhc1NhdmUuYy5oZWlnaHRcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXJnaW5QeFxyXG4gICAgICogQHJldHVybnMge0VudmVsb3BlfSBUaGUgZW52ZWxvcGUgb2YgdGhlIHZpZXcsIGluIGdlbyBjb29yZGluYXRlcy5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlRXh0ZW50R2VvKG1hcmdpblB4ID0gMjApIHtcclxuICAgICAgICB0aGlzLmV4dEdlbyA9IHtcclxuICAgICAgICAgICAgeE1pbjogdGhpcy5waXhUb0dlb1goLW1hcmdpblB4KSxcclxuICAgICAgICAgICAgeE1heDogdGhpcy5waXhUb0dlb1godGhpcy53ICsgbWFyZ2luUHgpLFxyXG4gICAgICAgICAgICB5TWluOiB0aGlzLnBpeFRvR2VvWSh0aGlzLmggKyBtYXJnaW5QeCksXHJcbiAgICAgICAgICAgIHlNYXg6IHRoaXMucGl4VG9HZW9ZKC1tYXJnaW5QeCksXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmV4dEdlb1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2sgaWYgdGhlIG9iamVjdCBoYXMgdG8gYmUgZHJhd25cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3t4Om51bWJlcix5Om51bWJlcn19IG9ialxyXG4gICAgICovXHJcbiAgICB0b0RyYXcob2JqKSB7XHJcbiAgICAgICAgaWYgKG9iai54IDwgdGhpcy5leHRHZW8ueE1pbikgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgaWYgKG9iai54ID4gdGhpcy5leHRHZW8ueE1heCkgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgaWYgKG9iai55IDwgdGhpcy5leHRHZW8ueU1pbikgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgaWYgKG9iai55ID4gdGhpcy5leHRHZW8ueU1heCkgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuXHJcbiAgICAvL2NvbnZlcnNpb24gZnVuY3Rpb25zXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4R2VvIEdlbyB4IGNvb3JkaW5hdGUsIGluIG0uXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBTY3JlZW4geCBjb29yZGluYXRlLCBpbiBwaXguXHJcbiAgICAgKi9cclxuICAgIGdlb1RvUGl4WCh4R2VvKSB7XHJcbiAgICAgICAgcmV0dXJuICh4R2VvIC0gdGhpcy5jZW50ZXIueCkgLyB0aGlzLmdldFpmKCkgKyB0aGlzLncgKiAwLjVcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlHZW8gR2VvIHkgY29vcmRpbmF0ZSwgaW4gbS5cclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFNjcmVlbiB5IGNvb3JkaW5hdGUsIGluIHBpeC5cclxuICAgICAqL1xyXG4gICAgZ2VvVG9QaXhZKHlHZW8pIHtcclxuICAgICAgICByZXR1cm4gLSh5R2VvIC0gdGhpcy5jZW50ZXIueSkgLyB0aGlzLmdldFpmKCkgKyB0aGlzLmggKiAwLjVcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggU2NyZWVuIHggY29vcmRpbmF0ZSwgaW4gcGl4LlxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gR2VvIHggY29vcmRpbmF0ZSwgaW4gbS5cclxuICAgICAqL1xyXG4gICAgcGl4VG9HZW9YKHgpIHtcclxuICAgICAgICByZXR1cm4gKHggLSB0aGlzLncgKiAwLjUpICogdGhpcy5nZXRaZigpICsgdGhpcy5jZW50ZXIueFxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSBTY3JlZW4geSBjb29yZGluYXRlLCBpbiBwaXguXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBHZW8geSBjb29yZGluYXRlLCBpbiBtLlxyXG4gICAgICovXHJcbiAgICBwaXhUb0dlb1koeSkge1xyXG4gICAgICAgIHJldHVybiAtKHkgLSB0aGlzLmggKiAwLjUpICogdGhpcy5nZXRaZigpICsgdGhpcy5jZW50ZXIueVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHZXQgeCx5LHogZWxlbWVudHMgZnJvbSBVUkwgYW5kIGFzc2lnbiB0aGVtIHRvIHRoZSB2aWV3IGNlbnRlciBhbmQgem9vbSBsZXZlbC4gKi9cclxuICAgIHNldFZpZXdGcm9tVVJMKCkge1xyXG4gICAgICAgIGNvbnN0IHggPSBHZW9DYW52YXMuZ2V0UGFyYW1ldGVyQnlOYW1lKCd4JyksXHJcbiAgICAgICAgICAgIHkgPSBHZW9DYW52YXMuZ2V0UGFyYW1ldGVyQnlOYW1lKCd5JyksXHJcbiAgICAgICAgICAgIHogPSBHZW9DYW52YXMuZ2V0UGFyYW1ldGVyQnlOYW1lKCd6JylcclxuICAgICAgICBjb25zdCBjID0gdGhpcy5nZXRDZW50ZXIoKVxyXG4gICAgICAgIGlmICh4ICE9IG51bGwgJiYgeCAhPSB1bmRlZmluZWQgJiYgIWlzTmFOKCt4KSkgYy54ID0gK3hcclxuICAgICAgICBpZiAoeSAhPSBudWxsICYmIHkgIT0gdW5kZWZpbmVkICYmICFpc05hTigreSkpIGMueSA9ICt5XHJcbiAgICAgICAgaWYgKHogIT0gbnVsbCAmJiB6ICE9IHVuZGVmaW5lZCAmJiAhaXNOYU4oK3opKSB0aGlzLnNldFpmKCt6KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZFxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcclxuICAgICAqIEByZXR1cm5zIHt0aGlzfVxyXG4gICAgICovXHJcbiAgICBhZGRab29tU2xpZGVyKGlkLCBvcHRzKSB7XHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuICAgICAgICBvcHRzLndpZHRoID0gb3B0cy53aWR0aCB8fCAnMzBweCdcclxuICAgICAgICBvcHRzLmhlaWdodCA9IG9wdHMuaGVpZ2h0IHx8ICczMDBweCdcclxuXHJcbiAgICAgICAgLy90aGUgZGl2IGVsZW1lbnRcclxuICAgICAgICBjb25zdCBkaXYgPSBzZWxlY3QoJyMnICsgaWQpXHJcbiAgICAgICAgaWYgKGRpdi5lbXB0eSgpKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGRpdiBlbGVtZW50IHRvIGJ1aWxkIHpvb20gc2xpZGVyLiBJZDogJyArIGlkKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGggPSB0aGlzXHJcbiAgICAgICAgLyoqICovXHJcbiAgICAgICAgdGhpcy5zbGlkZXIgPSBkaXZcclxuICAgICAgICAgICAgLmFwcGVuZCgnaW5wdXQnKVxyXG4gICAgICAgICAgICAuYXR0cigndHlwZScsICdyYW5nZScpXHJcbiAgICAgICAgICAgIC5hdHRyKCdtaW4nLCB0aGlzLmdldFpmRXh0ZW50KClbMF0pXHJcbiAgICAgICAgICAgIC5hdHRyKCdtYXgnLCB0aGlzLmdldFpmRXh0ZW50KClbMV0pXHJcbiAgICAgICAgICAgIC5hdHRyKCd2YWx1ZScsIHRoaXMuZ2V0WmYoKSlcclxuICAgICAgICAgICAgLm9uKCdpbnB1dCcsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMgfHwgIXRoaXMudmFsdWUpIHJldHVyblxyXG4gICAgICAgICAgICAgICAgY29uc3QgdiA9ICt0aGlzLnZhbHVlXHJcbiAgICAgICAgICAgICAgICBzZWxlY3QodGhpcykuYXR0cigndmFsdWUnLCB2KVxyXG4gICAgICAgICAgICAgICAgdGguc2V0WmYodilcclxuICAgICAgICAgICAgICAgIC8vcmVkcmF3XHJcbiAgICAgICAgICAgICAgICB0aC5yZWRyYXcoKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuc3R5bGUoJ3dpZHRoJywgb3B0cy53aWR0aClcclxuICAgICAgICAgICAgLnN0eWxlKCdoZWlnaHQnLCBvcHRzLmhlaWdodClcclxuICAgICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMC43KVxyXG4gICAgICAgICAgICAub24oJ21vdXNlb3ZlcicsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3QodGhpcykuc3R5bGUoJ29wYWNpdHknLCAxKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAub24oJ21vdXNlb3V0JywgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdCh0aGlzKS5zdHlsZSgnb3BhY2l0eScsIDAuNylcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnN0eWxlKCctd2Via2l0LWFwcGVhcmFuY2UnLCAnc2xpZGVyLXZlcnRpY2FsJykgLy9mb3IgY2hyb21lXHJcbiAgICAgICAgICAgIC5zdHlsZSgnd3JpdGluZy1tb2RlJywgJ2J0LWxyJykgLy9mb3IgSUUvZWRnZVxyXG4gICAgICAgICAgICAuYXR0cignb3JpZW50JywgJ3ZlcnRpY2FsJykgLy9mb3IgZmlyZWZveFxyXG4gICAgICAgICAgICAuc3R5bGUoJ2JhY2tncm91bmQnLCAnbGlnaHRncmF5JylcclxuICAgICAgICAgICAgLnN0eWxlKCdvdXRsaW5lJywgJ25vbmUnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJy13ZWJraXQtdHJhbnNpdGlvbicsICcuMnMnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ3RyYW5zaXRpb24nLCAnb3BhY2l0eSAuMnMnKVxyXG5cclxuICAgICAgICAvL1RPRE9cclxuICAgICAgICAvKnNlbGVjdChcIi5zbGlkZXI6Oi13ZWJraXQtc2xpZGVyLXRodW1iXCIpXHJcbiAgICAgICAgICAgIC5zdHlsZShcIi13ZWJraXQtYXBwZWFyYW5jZVwiLCBcIm5vbmVcIilcclxuICAgICAgICAgICAgLnN0eWxlKFwiYXBwZWFyYW5jZVwiLCBcIm5vbmVcIilcclxuICAgICAgICAgICAgLnN0eWxlKFwid2lkdGhcIiwgXCIzMHB4XCIpXHJcbiAgICAgICAgICAgIC5zdHlsZShcImhlaWdodFwiLCBcIjQwcHhcIilcclxuICAgICAgICAgICAgLnN0eWxlKFwiYmFja2dyb3VuZFwiLCBcImJsYWNrXCIpXHJcbiAgICAgICAgICAgIC5zdHlsZShcImN1cnNvclwiLCBcInBvaW50ZXJcIikqL1xyXG5cclxuICAgICAgICAvKnNlbGVjdChcInNsaWRlcjo6LW1vei1yYW5nZS10aHVtYlwiKVxyXG4gICAgICAgICAgICAuc3R5bGUoXCItd2Via2l0LWFwcGVhcmFuY2VcIiwgXCJub25lXCIpXHJcbiAgICAgICAgICAgIC5zdHlsZShcIndpZHRoXCIsIFwiMzBweFwiKVxyXG4gICAgICAgICAgICAuc3R5bGUoXCJoZWlnaHRcIiwgXCI0MHB4XCIpXHJcbiAgICAgICAgICAgIC5zdHlsZShcImJhY2tncm91bmRcIiwgXCIjMDRBQTZEXCIpXHJcbiAgICAgICAgICAgIC5zdHlsZShcImN1cnNvclwiLCBcInBvaW50ZXJcIikqL1xyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICAgIC5zbGlkZXI6Om1zLXRodW1iLFxyXG4gICAgICAgIC5zbGlkZXI6Oi1tb3otcmFuZ2UtdGh1bWIge1xyXG4gICAgICAgIH0qL1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGEgVVJMIHBhcmFtZXRlciBieSBuYW1lLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH1cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGdldFBhcmFtZXRlckJ5TmFtZShuYW1lKSB7XHJcbiAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvW1xcW10vLCAnXFxcXFsnKS5yZXBsYWNlKC9bXFxdXS8sICdcXFxcXScpXHJcbiAgICAgICAgdmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cCgnW1xcXFw/Jl0nICsgbmFtZSArICc9KFteJiNdKiknKSxcclxuICAgICAgICAgICAgcmVzdWx0cyA9IHJlZ2V4LmV4ZWMobG9jYXRpb24uc2VhcmNoKVxyXG4gICAgICAgIHJldHVybiAhcmVzdWx0cyA/IG51bGwgOiBkZWNvZGVVUklDb21wb25lbnQocmVzdWx0c1sxXS5yZXBsYWNlKC9cXCsvZywgJyAnKSlcclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IGNzdiB9IGZyb20gJ2QzLWZldGNoJ1xyXG5cclxuLyoqIEEgbGFiZWwuIFRoZSBuYW1lIGlzIHRoZSB0ZXh0IHRvIHNob3cuICh4LHkpIGFyZSB0aGUgY29vcmRpbmF0ZXMgaW4gdGhlIHNhbWUgQ1JTIGFzIHRoZSBncmlkLlxyXG4gKiBAdHlwZWRlZiB7e25hbWU6IHN0cmluZywgeDpudW1iZXIsIHk6bnVtYmVyIH19IExhYmVsICovXHJcblxyXG4vKipcclxuICogQSAoZ2VuZXJpYykgbGF5ZXIgZm9yIHBsYWNlbmFtZSBsYWJlbHMsIHRvIGJlIHNob3duIG9uIHRvcCBvZiB0aGUgZ3JpZCBsYXllcnMuXHJcbiAqIFRoZSBpbnB1dCBpcyBhIENTViBmaWxlIHdpdGggdGhlIHBvc2l0aW9uICh4LCB5KSBvZiB0aGUgbGFiZWxzIGFuZCBuYW1lICsgc29tZSBvdGhlciBpbmZvIG9uIHRoZSBsYWJlbCBpbXBvcnRhbmNlLlxyXG4gKiBJZiB0aGUgbGFiZWwgZGF0YSBpcyBub3QgaW4gdGhlIGV4cGVjdGVkIGZvcm1hdCBvciBpbiB0aGUgc2FtZSBDUlMgYXMgdGhlIGdyaWQsIGl0IGNhbiBiZSBjb3JyZWN0ZWQgd2l0aCB0aGUgXCJwcmVwcm9jZXNzXCIgZnVuY3Rpb24uXHJcbiAqIFRoZSBzZWxlY3Rpb24gb2YgdGhlIGxhYmVsLCB0aGVpciBzdHlsZSAoZm9udCwgd2VpZ2h0LCBldGMuKSBhbmQgY29sb3IgY2FuIGJlIHNwZWNpZmllZCBkZXBlbmRpbmcgb24gdGhlaXIgaW1wb3J0YW5jZSBhbmQgdGhlIHpvb20gbGV2ZWwuXHJcbiAqXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBMYWJlbExheWVyIHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBVUkwgb2YgdGhlIGxhYmVsIGRhdGEsIGFzIENTViBmaWxlLlxyXG4gICAgICAgICAqIFRoZSBmaWxlIHNob3VsZCBjb250YWluIHRoZSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBsYWJlbCBzdWNoIGFzIHRoZSB0ZXh0LCB0aGUgcG9zaXRpb24gYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgZGlzcGxheSBvZiB0aGUgbGFiZWwgYWNjb3JkaW5nIHRvIHRoZSB6b29tIGxldmVsLlxyXG4gICAgICAgICAqIElmIG5lY2Vzc2FyeSwgdGhpcyBkYXRhIGNhbiBiZSByZWZvcm1hdGVkIHdpdGggdGhlICdwcmVwcm9jZXNzJyBwYXJhbWV0ZXIuXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmxcclxuXHJcbiAgICAgICAgLyoqIFNwZWNpZnkgaWYgYW5kIGhvdyBhIGxhYmVsIHNob3VsZCBiZSBkcmF3biwgZGVwZW5kaW5nIG9uIGl0cyBpbXBvcnRhbmNlIGFuZCB0aGUgem9vbSBsZXZlbC5cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCxudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnN0eWxlID0gb3B0cy5zdHlsZSB8fCAoKCkgPT4gJ2JvbGQgMWVtIEFyaWFsJylcclxuXHJcbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIGxhYmVsIGNvbG9yLCBkZXBlbmRpbmcgb24gaXRzIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKExhYmVsLG51bWJlcik6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8IChvcHRzLmRhcmsgPyAoKSA9PiAnI2RkZCcgOiAoKSA9PiAnIzIyMicpXHJcblxyXG4gICAgICAgIC8qKiBTcGVjaWZ5IHRoZSBsYWJlbCBoYWxvIGNvbG9yLCBkZXBlbmRpbmcgb24gaXRzIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKExhYmVsLG51bWJlcik6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuaGFsb0NvbG9yID0gb3B0cy5oYWxvQ29sb3IgfHwgKG9wdHMuZGFyayA/ICgpID0+ICcjMDAwMDAwQkInIDogKCkgPT4gJyNGRkZGRkZCQicpXHJcblxyXG4gICAgICAgIC8qKiBTcGVjaWZ5IHRoZSBsYWJlbCBoYWxvIHdpZHRoLCBkZXBlbmRpbmcgb24gaXRzIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKExhYmVsLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuaGFsb1dpZHRoID0gb3B0cy5oYWxvV2lkdGggfHwgKCgpID0+IDQpXHJcblxyXG4gICAgICAgIC8qKiBUaGUgYW5jaG9yIHdoZXJlIHRvIGRyYXcgdGhlIHRleHQsIGZyb20gbGFiZWwgcG9zaXRpb24uIFNlZSBIVE1MLWNhbnZhcyB0ZXh0QWxpZ24gcHJvcGVydHkuXHJcbiAgICAgICAgICogXCJsZWZ0XCIgfHwgXCJyaWdodFwiIHx8IFwiY2VudGVyXCIgfHwgXCJzdGFydFwiIHx8IFwiZW5kXCJcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtDYW52YXNUZXh0QWxpZ259ICovXHJcbiAgICAgICAgdGhpcy50ZXh0QWxpZ24gPSBvcHRzLnRleHRBbGlnbiB8fCAnc3RhcnQnXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxudW1iZXI+fSAqL1xyXG4gICAgICAgIHRoaXMub2Zmc2V0UGl4ID0gb3B0cy5vZmZzZXRQaXggfHwgWzUsIDVdXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcHJlcHJvY2VzcyB0byBydW4gb24gZWFjaCBsYWJlbCBhZnRlciBsb2FkaW5nLlxyXG4gICAgICAgICAqIEl0IGNhbiBiZSB1c2VkIHRvIGFwcGx5IHNvbWUgc3BlY2lmaWMgdHJlYXRtZW50IGJlZm9yZSwgZm9ybWF0IHRoZSBsYWJlbCBkYXRhLCBwcm9qZWN0IGNvb3JkaW5hdGVzLCBldGMuXHJcbiAgICAgICAgICogUmV0dXJuIGZhbHNlIGlmIHRoZSBsYWJlbCBzaG91bGQgbm90IGJlIGtlcHQuXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oTGFiZWwpOmJvb2xlYW59ICovXHJcbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzID0gb3B0cy5wcmVwcm9jZXNzXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxMYWJlbD4gfCB1bmRlZmluZWR9ICovXHJcbiAgICAgICAgdGhpcy5sYWJlbHMgPSB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdub3RMb2FkZWQnXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IHRoZSBsYWJlbCBsYXllci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2cgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZSBsYXllci5cclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICBkcmF3KGNnKSB7XHJcbiAgICAgICAgLy9sb2FkIGxhYmVscywgaWYgbm90IGRvbmUgeWV0LlxyXG4gICAgICAgIGlmICghdGhpcy5sYWJlbHMpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkKGNnLnJlZHJhdylcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3pvb20gZmFjdG9yXHJcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXHJcblxyXG4gICAgICAgIC8vdGV4dCBhbGlnblxyXG4gICAgICAgIGNnLmN0eC50ZXh0QWxpZ24gPSB0aGlzLnRleHRBbGlnbiB8fCAnc3RhcnQnXHJcblxyXG4gICAgICAgIC8vbGluZSBqb2luIGFuZCBjYXBcclxuICAgICAgICBjZy5jdHgubGluZUpvaW4gPSAnYmV2ZWwnIC8vfHwgXCJyb3VuZFwiIHx8IFwibWl0ZXJcIjtcclxuICAgICAgICBjZy5jdHgubGluZUNhcCA9ICdidXR0JyAvL3x8IFwicm91bmRcIiB8fCBcInNxdWFyZVwiO1xyXG5cclxuICAgICAgICAvL2RyYXcgaW4gcGl4IGNvb3JkaW5hdGVzXHJcbiAgICAgICAgY2cuaW5pdENhbnZhc1RyYW5zZm9ybSgpXHJcblxyXG4gICAgICAgIC8vZHJhdyBsYWJlbHMsIG9uZSBieSBvbmVcclxuICAgICAgICBmb3IgKGNvbnN0IGxiIG9mIHRoaXMubGFiZWxzKSB7XHJcbiAgICAgICAgICAgIC8vZ2V0IGxhYmVsIHN0eWxlXHJcbiAgICAgICAgICAgIGNvbnN0IHN0ID0gdGhpcy5zdHlsZShsYiwgemYpXHJcbiAgICAgICAgICAgIGlmICghc3QpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGNnLmN0eC5mb250ID0gc3RcclxuXHJcbiAgICAgICAgICAgIC8vY2hlY2sgbGFiZWwgd2l0aGluIHRoZSB2aWV3LCB0byBiZSBkcmF3blxyXG4gICAgICAgICAgICBpZiAoIWNnLnRvRHJhdyhsYikpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL3Bvc2l0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IHhQID0gY2cuZ2VvVG9QaXhYKGxiLngpICsgdGhpcy5vZmZzZXRQaXhbMF1cclxuICAgICAgICAgICAgY29uc3QgeVAgPSBjZy5nZW9Ub1BpeFkobGIueSkgLSB0aGlzLm9mZnNldFBpeFsxXVxyXG5cclxuICAgICAgICAgICAgLy9sYWJlbCBzdHJva2UsIGZvciB0aGUgaGFsb1xyXG4gICAgICAgICAgICBpZiAodGhpcy5oYWxvQ29sb3IgJiYgdGhpcy5oYWxvV2lkdGgpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGhjID0gdGhpcy5oYWxvQ29sb3IobGIsIHpmKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgaHcgPSB0aGlzLmhhbG9XaWR0aChsYiwgemYpXHJcbiAgICAgICAgICAgICAgICBpZiAoaGMgJiYgaHcgJiYgaHcgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZVN0eWxlID0gaGNcclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHgubGluZVdpZHRoID0gaHdcclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlVGV4dChsYi5uYW1lLCB4UCwgeVApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vbGFiZWwgZmlsbFxyXG4gICAgICAgICAgICBpZiAodGhpcy5jb2xvcikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvcihsYiwgemYpXHJcbiAgICAgICAgICAgICAgICBpZiAoY29sKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxTdHlsZSA9IGNvbFxyXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsVGV4dChsYi5uYW1lLCB4UCwgeVApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkIGRhdGEgZm9yIGxhYmVscywgZnJvbSBVUkwgdGhpcy51cmxcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTp2b2lkfSBjYWxsYmFja1xyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgYXN5bmMgbG9hZChjYWxsYmFjaykge1xyXG4gICAgICAgIGlmICghdGhpcy51cmwpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCBsb2FkaW5nIGxhYmVsczogTm8gVVJMIHNwZWNpZmllZC4gJyArIHRoaXMudXJsKVxyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9jaGVjayBpZiBkYXRhIGFscmVhZHkgbG9hZGVkXHJcbiAgICAgICAgaWYgKHRoaXMubG9hZGluZ1N0YXR1cyAhPSAnbm90TG9hZGVkJykgcmV0dXJuXHJcblxyXG4gICAgICAgIC8vbG9hZCBkYXRhXHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2xvYWRpbmcnXHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7IEFycmF5LjxMYWJlbD4gfSAqL1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgY3N2KHRoaXMudXJsKVxyXG5cclxuICAgICAgICAgICAgLy9wcmVwcm9jZXNzL2ZpbHRlclxyXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0aGlzLnByZXByb2Nlc3MoYylcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYiA9PSBmYWxzZSkgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhYmVscy5wdXNoKGMpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvL3N0b3JlIGxhYmVsc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBkYXRhXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkZWQnXHJcblxyXG4gICAgICAgICAgICAvL3JlZHJhd1xyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKClcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIGxvYWRpbmcgbGFiZWxzIGZyb20gJyArIHRoaXMudXJsKVxyXG4gICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdmYWlsZWQnXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuLyoqXHJcbiAqIEEgbGF5ZXIsIHdoaWNoIHNwZWNpZmllcyBhIGRhdGFzZXQgdG8gYmUgc2hvd24gd2l0aCBzcGVjaWZpZWQgc3R5bGVzLlxyXG4gKlxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTGF5ZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vRGF0YXNldFwiKS5EYXRhc2V0fSBkYXRhc2V0IFRoZSBtdWx0aSByZXNvbHV0aW9uIGRhdGFzZXQgdG8gc2hvdy5cclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4vU3R5bGVcIikuU3R5bGU+fSBzdHlsZXMgVGhlIHN0eWxlcywgb3JkZXJlZCBpbiBkcmF3aW5nIG9yZGVyLlxyXG4gICAgICogQHBhcmFtIHt7dmlzaWJsZT86Ym9vbGVhbixtaW5ab29tPzpudW1iZXIsbWF4Wm9vbT86bnVtYmVyLHBpeE5iPzpudW1iZXIsY2VsbEluZm9IVE1MPzpmdW5jdGlvbihpbXBvcnQoXCIuL0RhdGFzZXRcIikuQ2VsbCk6c3RyaW5nfX0gb3B0c1xyXG4gICAgICogICAgICBtaW5ab29tOiBUaGUgbWluaW11bSB6b29tIGxldmVsIHdoZW4gdG8gc2hvdyB0aGUgbGF5ZXIuIG1heFpvb206IFRoZSBtYXhpbXVtIHpvb20gbGV2ZWwgd2hlbiB0byBzaG93IHRoZSBsYXllclxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhc2V0LCBzdHlsZXMsIG9wdHMgPSB7fSkge1xyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkRhdGFzZXR9ICovXHJcbiAgICAgICAgdGhpcy5kYXRhc2V0ID0gZGF0YXNldFxyXG4gICAgICAgIC8qKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4vU3R5bGVcIikuU3R5bGU+fSAqL1xyXG4gICAgICAgIHRoaXMuc3R5bGVzID0gc3R5bGVzXHJcblxyXG4gICAgICAgIC8qKiBBbiBhdHRyaWJ1dGUgdG8gc3BlY2lmeSBpZiBhIGxheWVyIHNob3VsZCBiZSBkcmF3biBvciBub3RcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gKi9cclxuICAgICAgICB0aGlzLnZpc2libGUgPSBvcHRzLnZpc2libGUgPT0gZmFsc2UgPyBmYWxzZSA6IHRydWVcclxuXHJcbiAgICAgICAgLyoqIFRoZSBtaW5pbXVtIHpvb20gZmFjdG9yOiBCZWxvdyB0aGlzIGxldmVsLCB0aGUgbGF5ZXIgaXMgbm90IHNob3duLlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5taW5ab29tID0gb3B0cy5taW5ab29tIHx8IDBcclxuXHJcbiAgICAgICAgLyoqIFRoZSBtYXhpbXVtIHpvb20gZmFjdG9yOiBBYm92ZSB0aGlzIGxldmVsLCB0aGUgbGF5ZXIgaXMgbm90IHNob3duLlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5tYXhab29tID0gb3B0cy5tYXhab29tIHx8IEluZmluaXR5XHJcblxyXG4gICAgICAgIC8vZW5zdXJlIGFjY2VwdGFibGUgdmFsdWVzIGZvciB0aGUgem9vbSBsaW1pdHMuXHJcbiAgICAgICAgaWYgKHRoaXMubWluWm9vbSA+PSB0aGlzLm1heFpvb20pXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCB6b29tIGxpbWl0cyBmb3IgbGF5ZXIuIFpvb20gbWluIHNob3VsZCBiZSBzbWFsbGVyIHRoYW4gem9vbSBtYXguJylcclxuXHJcbiAgICAgICAgLyoqIFVuaXQ6IG51bWJlciBvZiBwaXhlbHNcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMucGl4TmIgPSBvcHRzLnBpeE5iIHx8IDNcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGZ1bmN0aW9uIHJldHVybmluZyBjZWxsIGluZm9ybWF0aW9uIGFzIEhUTUwuXHJcbiAgICAgICAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgdG9vbHRpcCBpbmZvcm1hdGlvbi5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGwsIG51bWJlcik6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY2VsbEluZm9IVE1MID0gb3B0cy5jZWxsSW5mb0hUTUwgfHwgTGF5ZXIuZGVmYXVsdENlbGxJbmZvSFRNTFxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIHRoZSByZWxldmFudCBkYXRhc2V0IGNvbXBvbmVudCBmb3IgYSBzcGVjaWZpZWQgem9vbSBmYWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpmXHJcbiAgICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9EYXRhc2V0Q29tcG9uZW50XCIpLkRhdGFzZXRDb21wb25lbnR8dW5kZWZpbmVkfVxyXG4gICAgICogKi9cclxuICAgIGdldERhdGFzZXRDb21wb25lbnQoemYpIHtcclxuICAgICAgICBpZiAoemYgPCB0aGlzLm1pblpvb20gfHwgemYgPiB0aGlzLm1heFpvb20pIHJldHVyblxyXG5cclxuICAgICAgICAvL3NwZWNpYWwgY2FzZSB3aGl0aCBzaW5nbGUgY29tcG9uZW50IGRhdGFzZXRcclxuICAgICAgICBpZiAodGhpcy5kYXRhc2V0LmRhdGFzZXRDb21wb25lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gdGhpcy5kYXRhc2V0LmRhdGFzZXRDb21wb25lbnRzWzBdXHJcblxyXG4gICAgICAgIGNvbnN0IHJzID0gdGhpcy5kYXRhc2V0LnJlc29sdXRpb25zXHJcbiAgICAgICAgbGV0IGkgPSAwXHJcbiAgICAgICAgbGV0IHogPSByc1tpXSAvIHRoaXMucGl4TmJcclxuICAgICAgICB3aGlsZSAoeiA8IHpmICYmIGkgPCBycy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgaSsrXHJcbiAgICAgICAgICAgIHogPSByc1tpXSAvIHRoaXMucGl4TmJcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9pZiAoaSA9PSAwKSByZXR1cm4gdGhpcy5kYXRhc2V0LmRhdGFzZXRDb21wb25lbnRzWzBdO1xyXG4gICAgICAgIC8vcmV0dXJuIHRoaXMuZGF0YXNldC5kYXRhc2V0Q29tcG9uZW50c1tpIC0gMV07XHJcbiAgICAgICAgaWYgKGkgPT0gcnMubGVuZ3RoKSByZXR1cm4gdGhpcy5kYXRhc2V0LmRhdGFzZXRDb21wb25lbnRzW3JzLmxlbmd0aCAtIDFdXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YXNldC5kYXRhc2V0Q29tcG9uZW50c1tpXVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRlZmF1bHQgZnVuY3Rpb24gcmV0dXJuaW5nIGNlbGwgaW5mb3JtYXRpb24gYXMgSFRNTC5cclxuICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIHRvb2x0aXAgaW5mb3JtYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0RhdGFzZXRcIikuQ2VsbH0gY2VsbFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ31cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGRlZmF1bHRDZWxsSW5mb0hUTUwoY2VsbCkge1xyXG4gICAgICAgIGNvbnN0IGJ1ZiA9IFtdXHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY2VsbCkpIHtcclxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3gnKSBjb250aW51ZVxyXG4gICAgICAgICAgICBpZiAoa2V5ID09PSAneScpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGJ1Zi5wdXNoKCc8Yj4nLCBrZXksICc8L2I+JywgJyA6ICcsIGNlbGxba2V5XSwgJzxicj4nKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYnVmLmpvaW4oJycpXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXHJcblxyXG4vKipcclxuICogQSBsZWdlbmQgY29udGFpbmVyLlxyXG4gKlxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTGVnZW5kIHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdHNcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuaWQgPSBvcHRzLmlkXHJcblxyXG4gICAgICAgIC8vVE9ETyBzdG9wIHVzaW5nIGl0LiBVc2Ugc3R5bGUgbWV0aG9kIGJlbG93IGluc3RlYWQuXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSBAZGVwcmVjYXRlZCAqL1xyXG4gICAgICAgIHRoaXMudG9wID0gb3B0cy50b3BcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gQGRlcHJlY2F0ZWQgKi9cclxuICAgICAgICB0aGlzLmJvdHRvbSA9IG9wdHMuYm90dG9tXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9IEBkZXByZWNhdGVkICovXHJcbiAgICAgICAgdGhpcy5sZWZ0ID0gb3B0cy5sZWZ0XHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9IEBkZXByZWNhdGVkICovXHJcbiAgICAgICAgdGhpcy5yaWdodCA9IG9wdHMucmlnaHRcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cclxuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBvcHRzLmJhY2tncm91bmQgfHwgJ25vbmUnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXHJcbiAgICAgICAgdGhpcy5wYWRkaW5nID0gb3B0cy5wYWRkaW5nIHx8ICc1cHgnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXHJcbiAgICAgICAgdGhpcy5ib3JkZXIgPSBvcHRzLmJvcmRlciB8fCAnMHB4J1xyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xyXG4gICAgICAgIHRoaXNbJ2JvcmRlci1yYWRpdXMnXSA9IG9wdHNbJ2JvcmRlci1yYWRpdXMnXSB8fCAnbm9uZSdcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cclxuICAgICAgICB0aGlzWydib3gtc2hhZG93J10gPSBvcHRzWydib3gtc2hhZG93J10gfHwgJ25vbmUnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXHJcbiAgICAgICAgdGhpc1snZm9udC1mYW1pbHknXSA9IG9wdHNbJ2ZvbnQtZmFtaWx5J10gfHwgJ0hlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGhcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cclxuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0XHJcblxyXG4gICAgICAgIC8vdGhlIGRpdiBlbGVtZW50XHJcbiAgICAgICAgaWYgKHRoaXMuaWQpIHRoaXMuZGl2ID0gc2VsZWN0KCcjJyArIHRoaXMuaWQpXHJcblxyXG4gICAgICAgIGlmICghdGhpcy5kaXYgfHwgdGhpcy5kaXYuZW1wdHkoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmRpdiA9IHNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSlcclxuICAgICAgICAgICAgaWYgKHRoaXMuaWQpIHRoaXMuZGl2LmF0dHIoJ2lkJywgdGhpcy5pZClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vc2V0IHN0eWxlXHJcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ2JhY2tncm91bmQnLCB0aGlzLmJhY2tncm91bmQpXHJcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ3BhZGRpbmcnLCB0aGlzLnBhZGRpbmcpXHJcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ2JvcmRlcicsIHRoaXMuYm9yZGVyKVxyXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdib3JkZXItcmFkaXVzJywgdGhpc1snYm9yZGVyLXJhZGl1cyddKVxyXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdib3gtc2hhZG93JywgdGhpc1snYm94LXNoYWRvdyddKVxyXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdmb250LWZhbWlseScsIHRoaXNbJ2ZvbnQtZmFtaWx5J10pXHJcblxyXG4gICAgICAgIGlmICh0aGlzLndpZHRoKSB0aGlzLmRpdi5zdHlsZSgnd2lkdGgnLCB0aGlzLndpZHRoKVxyXG4gICAgICAgIGlmICh0aGlzLmhlaWdodCkgdGhpcy5kaXYuc3R5bGUoJ2hlaWdodCcsIHRoaXMuaGVpZ2h0KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwbHkgYSBzdHlsZSB0byB0aGUgbGVnZW5kIGRpdi5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdlxyXG4gICAgICogQHJldHVybnMge3RoaXN9XHJcbiAgICAgKi9cclxuICAgIHN0eWxlKGssIHYpIHtcclxuICAgICAgICB0aGlzLmRpdi5zdHlsZShrLCB2KVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xyXG4gICAgICogQGFic3RyYWN0XHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZShvcHRzKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignTGVnZW5kIHVwZGF0ZSBub3QgaW1wbGVtZW50ZWQgeWV0LicpXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBqc29uIH0gZnJvbSAnZDMtZmV0Y2gnXHJcblxyXG4vKipcclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIExpbmVMYXllciB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy51cmwgPSBvcHRzLnVybFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHByZXByb2Nlc3MgdG8gcnVuIG9uIGVhY2ggZmVhdHVyZSBhZnRlciBsb2FkaW5nLlxyXG4gICAgICAgICAqIEl0IGNhbiBiZSB1c2VkIHRvIGFwcGx5IHNvbWUgc3BlY2lmaWMgdHJlYXRtZW50IGJlZm9yZSwgZm9ybWF0IHRoZSBsYWJlbCBkYXRhLCBwcm9qZWN0IGNvb3JkaW5hdGVzLCBldGMuXHJcbiAgICAgICAgICogUmV0dXJuIGZhbHNlIGlmIHRoZSBsYWJlbCBzaG91bGQgbm90IGJlIGtlcHQuXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0KTpib29sZWFufSAqL1xyXG4gICAgICAgIHRoaXMucHJlcHJvY2VzcyA9IG9wdHMucHJlcHJvY2Vzc1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihvYmplY3QsbnVtYmVyKTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKChmLCB6ZikgPT4gJ2dyYXknKVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKGYsIHpmKSA9PiAyKVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOkFycmF5LjxudW1iZXI+fHVuZGVmaW5lZH0gKi9cclxuICAgICAgICB0aGlzLmxpbmVEYXNoID0gb3B0cy5saW5lRGFzaCB8fCAoKGYsIHpmKSA9PiB1bmRlZmluZWQpXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxvYmplY3Q+IHwgdW5kZWZpbmVkfSAqL1xyXG4gICAgICAgIHRoaXMuZnMgPSB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdub3RMb2FkZWQnXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IHRoZSBsYXllci5cclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBjZyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2cpIHtcclxuICAgICAgICAvL2xvYWQgZGF0YSwgaWYgbm90IGRvbmUgeWV0LlxyXG4gICAgICAgIGlmICghdGhpcy5mcykge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWQoY2cucmVkcmF3KVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vVE9ETyBzb3J0IGxpbmVzIGJ5IHdpZHRoID9cclxuXHJcbiAgICAgICAgLy96b29tIGZhY3RvclxyXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxyXG5cclxuICAgICAgICAvL2RyYXcgaW4gZ2VvIGNvb3JkaW5hdGVzXHJcbiAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIHRoaXMuZnMpIHtcclxuICAgICAgICAgICAgY29uc3QgY3MgPSBmLmdlb21ldHJ5LmNvb3JkaW5hdGVzXHJcbiAgICAgICAgICAgIGlmIChjcy5sZW5ndGggPCAyKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy9zZXQgY29sb3JcclxuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvcihmLCB6ZilcclxuICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09ICdub25lJykgY29udGludWVcclxuICAgICAgICAgICAgY2cuY3R4LnN0cm9rZVN0eWxlID0gY29sXHJcblxyXG4gICAgICAgICAgICAvL3NldCBsaW5ld2lkdGhcclxuICAgICAgICAgICAgY29uc3Qgd1AgPSB0aGlzLndpZHRoKGYsIHpmKVxyXG4gICAgICAgICAgICBpZiAoIXdQIHx8IHdQIDwgMCkgY29udGludWVcclxuICAgICAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IHdQICogemZcclxuXHJcbiAgICAgICAgICAgIC8vc2V0IGxpbmUgZGFzaFxyXG4gICAgICAgICAgICBjb25zdCBsZFAgPSB0aGlzLmxpbmVEYXNoKGYsIHpmKVxyXG4gICAgICAgICAgICBpZiAobGRQKSBjZy5jdHguc2V0TGluZURhc2gobGRQKVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGxpbmVcclxuICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY3NbMF1bMF0sIGNzWzBdWzFdKVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNzLmxlbmd0aDsgaSsrKSBjZy5jdHgubGluZVRvKGNzW2ldWzBdLCBjc1tpXVsxXSlcclxuICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLy4uLlxyXG4gICAgICAgIGNnLmN0eC5zZXRMaW5lRGFzaChbXSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExvYWQgZGF0YSBmb3IgbGFiZWxzLCBmcm9tIFVSTCB0aGlzLnVybFxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbigpOnZvaWR9IGNhbGxiYWNrXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBhc3luYyBsb2FkKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVybCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIGxvYWRpbmcgYm91bmRhcmllczogTm8gVVJMIHNwZWNpZmllZC4gJyArIHRoaXMudXJsKVxyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9jaGVjayBpZiBkYXRhIGFscmVhZHkgbG9hZGVkXHJcbiAgICAgICAgaWYgKHRoaXMubG9hZGluZ1N0YXR1cyAhPSAnbm90TG9hZGVkJykgcmV0dXJuXHJcblxyXG4gICAgICAgIC8vbG9hZCBkYXRhXHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2xvYWRpbmcnXHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGFfID0gYXdhaXQganNvbih0aGlzLnVybClcclxuXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7IEFycmF5LjxvYmplY3Q+IH0gKi9cclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGRhdGFfLmZlYXR1cmVzXHJcblxyXG4gICAgICAgICAgICAvL3ByZXByb2Nlc3MvZmlsdGVyXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXByb2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZnMgPSBbXVxyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBiID0gdGhpcy5wcmVwcm9jZXNzKGMpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcy5wdXNoKGMpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvL3N0b3JlIGxhYmVsc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mcyA9IGRhdGFcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2xvYWRlZCdcclxuXHJcbiAgICAgICAgICAgIC8vcmVkcmF3XHJcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgbG9hZGluZyBib3VuZGFyaWVzIGZyb20gJyArIHRoaXMudXJsKVxyXG4gICAgICAgICAgICB0aGlzLmZzID0gW11cclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG4vKipcclxuICogU3RhdGlzdGljcyBvZiBhIHNldCBvZiB2YWx1ZXNcclxuICogQHR5cGVkZWYge3ttaW46bnVtYmVyLG1heDpudW1iZXJ9fSBTdGF0ICovXHJcblxyXG4vKiogQHR5cGVkZWYge1wic3F1YXJlXCJ8XCJjaXJjbGVcInxcImRpYW1vbmRcInxcImRvbnV0XCJ8XCJub25lXCJ9IFNoYXBlICovXHJcblxyXG4vKipcclxuICogQSBzdHlsZSwgdG8gc2hvdyBhIGdyaWQgZGF0YXNldC5cclxuICpcclxuICogQGFic3RyYWN0XHJcbiAqXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTdHlsZSB7XHJcbiAgICAvKipcclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICogQHBhcmFtIHt7ZmlsdGVyPzpmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwpOmJvb2xlYW4sb2Zmc2V0PzpmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9LG1pblpvb20/Om51bWJlcixtYXhab29tPzpudW1iZXJ9fSBvcHRzXHJcbiAgICAgKiAgICAgIG1pblpvb206IFRoZSBtaW5pbXVtIHpvb20gbGV2ZWwgd2hlbiB0byBzaG93IHRoZSBsYXllci4gbWF4Wm9vbTogVGhlIG1heGltdW0gem9vbSBsZXZlbCB3aGVuIHRvIHNob3cgdGhlIGxheWVyXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogQSBmaWx0ZXIgZnVuY3Rpb24gdG8gYXBwbHkgdG8gdGhlIGNlbGwgbGlzdCwgdG8gZmlsdGVyIG91dCBzb21lIGNlbGxzIG5vdCB0byBiZSBkcmF3biAoc3VjaCBhcyBmb3IgZXhhbXBsZSB0aGUgY2VsbHMgd2l0aCB2YWx1ZT0wKS5cclxuICAgICAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbn0gKi9cclxuICAgICAgICB0aGlzLmZpbHRlciA9IG9wdHMuZmlsdGVyIHx8ICgoKSA9PiB0cnVlKVxyXG5cclxuICAgICAgICAvKiogQW4gb2Zmc2V0LiBUaGlzIGlzIHRvIGFsdGVyIHRoZSBwb3NpdGlvbiBvZiBhbGwgc3ltYm9scyBpbiBhIGdpdmVuIGRpcmVjdGlvbi4gSW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXHJcbiAgICAgICAgICogQHByb3RlY3RlZFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9fSAqL1xyXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gb3B0cy5vZmZzZXQgfHwgKChjLCByLCB6ZikgPT4gKHsgZHg6IDAsIGR5OiAwIH0pKVxyXG5cclxuICAgICAgICAvKiogVGhlIG1pbmltdW0gem9vbSBmYWN0b3I6IEJlbG93IHRoaXMgbGV2ZWwsIHRoZSBsYXllciBpcyBub3Qgc2hvd24uXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiAqL1xyXG4gICAgICAgIHRoaXMubWluWm9vbSA9IG9wdHMubWluWm9vbSB8fCAwXHJcblxyXG4gICAgICAgIC8qKiBUaGUgbWF4aW11bSB6b29tIGZhY3RvcjogQWJvdmUgdGhpcyBsZXZlbCwgdGhlIGxheWVyIGlzIG5vdCBzaG93bi5cclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqICovXHJcbiAgICAgICAgdGhpcy5tYXhab29tID0gb3B0cy5tYXhab29tIHx8IEluZmluaXR5XHJcblxyXG4gICAgICAgIC8vZW5zdXJlIGFjY2VwdGFibGUgdmFsdWVzIGZvciB0aGUgem9vbSBsaW1pdHMuXHJcbiAgICAgICAgaWYgKHRoaXMubWluWm9vbSA+PSB0aGlzLm1heFpvb20pXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCB6b29tIGxpbWl0cyBmb3IgbGF5ZXIuIFpvb20gbWluIHNob3VsZCBiZSBzbWFsbGVyIHRoYW4gem9vbSBtYXguJylcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHB1YmxpY1xyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi9MZWdlbmRcIikuTGVnZW5kPn0gKi9cclxuICAgICAgICB0aGlzLmxlZ2VuZHMgPSBbXVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyBjZWxscy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGw+fSBjZWxscyBUaGUgY2VsbHMgdG8gZHJhdy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZWlyIHJlc29sdXRpb24gKGluIGdlb2dyYXBoaWMgdW5pdClcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBjZyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlbS5cclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCByZXNvbHV0aW9uLCBjZykge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIGRyYXcgbm90IGltcGxlbWVudGVkLicpXHJcbiAgICB9XHJcblxyXG4gICAgLy9nZXR0ZXJzIGFuZCBzZXR0ZXJzXHJcblxyXG4gICAgLyoqIEByZXR1cm5zIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9fSAqL1xyXG4gICAgZ2V0T2Zmc2V0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldFxyXG4gICAgfVxyXG4gICAgLyoqIEBwYXJhbSB7ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsLG51bWJlcixudW1iZXIpOntkeDpudW1iZXIsZHk6bnVtYmVyfX0gdmFsIEByZXR1cm5zIHt0aGlzfSAqL1xyXG4gICAgc2V0T2Zmc2V0KHZhbCkge1xyXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gdmFsXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKiogSGlkZSBhbGwgbGVnZW5kIGVsZW1lbnRzIG9mIHRoZSBzdHlsZSwgaWYgYW55XHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICogQHJldHVybnMge3RoaXN9ICovXHJcbiAgICB1cGRhdGVMZWdlbmRzKG9wdHMpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGxnIG9mIHRoaXMubGVnZW5kcykgbGcudXBkYXRlKG9wdHMpXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgc29tZSBzdGF0aXN0aWNzIG9uIGEgdmFsdWUgb2Ygc29tZSBjZWxscy5cclxuICAgICAqIFRoaXMgaXMgdXNlZCB0byBkZWZpbmUgaG93IHRvIGRyYXcgc3BlY2lmaWNhbGx5IHRoZSBjZWxscyB3aXRoaW4gdGhlIHZpZXcuXHJcbiAgICAgKiBUT0RPOiBjb21wdXRlIG1lZGlhbiA/XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsKTpudW1iZXJ9IHZhbEZ1blxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVaZXJvc1xyXG4gICAgICogQHJldHVybnMge1N0YXQgfCB1bmRlZmluZWR9XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBnZXRTdGF0aXN0aWNzKGNlbGxzLCB2YWxGdW4sIGlnbm9yZVplcm9zKSB7XHJcbiAgICAgICAgaWYgKCFjZWxscyB8fCBjZWxscy5sZW5ndGggPT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICAgIGxldCBtaW4gPSBJbmZpbml0eVxyXG4gICAgICAgIGxldCBtYXggPSAtSW5maW5pdHlcclxuICAgICAgICAvL2xldCBzdW0gPSAwXHJcbiAgICAgICAgLy9sZXQgbmIgPSAwXHJcbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHYgPSArdmFsRnVuKGNlbGwpXHJcbiAgICAgICAgICAgIGlmIChpZ25vcmVaZXJvcyAmJiAhdikgY29udGludWVcclxuICAgICAgICAgICAgaWYgKHYgPCBtaW4pIG1pbiA9IHZcclxuICAgICAgICAgICAgaWYgKHYgPiBtYXgpIG1heCA9IHZcclxuICAgICAgICAgICAgLy9zdW0gKz0gdlxyXG4gICAgICAgICAgICAvL25iKytcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgbWluOiBtaW4sIG1heDogbWF4IH1cclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IHNlbGVjdCB9IGZyb20gJ2QzLXNlbGVjdGlvbidcclxuLy9pbXBvcnQgeyB0cmFuc2l0aW9uIH0gZnJvbSBcImQzLXRyYW5zaXRpb25cIjtcclxuXHJcbi8qKlxyXG4gKiBBIGdlbmVyaWMgY2xhc3MgdG8gbWFrZSBhIHRvb2x0aXAuXHJcbiAqIEl0IGlzIGEgZGl2IGVsZW1lbnQsIHdoaWNoIGNhbiBiZSBtb3ZlZCB1bmRlciB0aGUgbW91c2UgcG9pbnRlciBhbmQgZmlsbGVkIHdpdGggc29tZSBpbmZvcm1hdGlvbiBpbiBodG1sLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRvb2x0aXAge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5kaXYgPSBvcHRzLmRpdiB8fCAndG9vbHRpcF9ldXJvc3RhdCdcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLm1heFdpZHRoID0gb3B0cy5tYXhXaWR0aCB8fCAnMjBlbSdcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmZvbnRTaXplID0gb3B0cy5mb250U2l6ZSB8fCAnMS4yZW0nXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gb3B0cy5iYWNrZ3JvdW5kIHx8ICd3aGl0ZSdcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnBhZGRpbmcgPSBvcHRzLnBhZGRpbmcgfHwgJzVweCdcclxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmJvcmRlciA9IG9wdHMuYm9yZGVyIHx8ICcwcHgnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpc1snYm9yZGVyLXJhZGl1cyddID0gb3B0c1snYm9yZGVyLXJhZGl1cyddIHx8ICc1cHgnXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpc1snYm94LXNoYWRvdyddID0gb3B0c1snYm94LXNoYWRvdyddIHx8ICc1cHggNXB4IDVweCBncmV5J1xyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXNbJ2ZvbnQtZmFtaWx5J10gPSBvcHRzWydmb250LWZhbWlseSddIHx8ICdIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJ1xyXG5cclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnRyYW5zaXRpb25EdXJhdGlvbiA9IG9wdHMudHJhbnNpdGlvbkR1cmF0aW9uIHx8IDEwMFxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMueE9mZnNldCA9IG9wdHMueE9mZnNldCB8fCAzMFxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMueU9mZnNldCA9IG9wdHMueU9mZnNldCB8fCAyMFxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAvLyBlLmcuIHRvIHByZXZlbnQgbW91c2UgY3Vyc29yIGNvdmVyaW5nIGNlbGwgYmVpbmcgaGlnaGxpZ2h0ZWRcclxuICAgICAgICB0aGlzLnlNb3VzZU9mZnNldCA9IG9wdHMueU1vdXNlT2Zmc2V0IHx8IDBcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnhNb3VzZU9mZnNldCA9IG9wdHMueE1vdXNlT2Zmc2V0IHx8IDBcclxuICAgICAgICAvKiogQHR5cGUge0hUTUxFbGVtZW50fSAqL1xyXG4gICAgICAgIHRoaXMucGFyZW50RWxlbWVudCA9IG9wdHMucGFyZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge2ltcG9ydChcImQzLXNlbGVjdGlvblwiKS5TZWxlY3Rpb259ICovXHJcbiAgICAgICAgdGhpcy50b29sdGlwID0gc2VsZWN0KCcjJyArIHRoaXMuZGl2KVxyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXAuZW1wdHkoKSlcclxuICAgICAgICAgICAgdGhpcy50b29sdGlwID0gc2VsZWN0KCcjJyArIHRoaXMucGFyZW50RWxlbWVudC5pZClcclxuICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2RpdicpXHJcbiAgICAgICAgICAgICAgICAuYXR0cignaWQnLCB0aGlzLmRpdilcclxuXHJcbiAgICAgICAgLy9pbml0aWFsaXNlXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdtYXgtd2lkdGgnLCB0aGlzLm1heFdpZHRoKVxyXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnb3ZlcmZsb3cnLCAnaGlkZGVuJylcclxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMuZm9udFNpemUpXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdiYWNrZ3JvdW5kJywgdGhpcy5iYWNrZ3JvdW5kKVxyXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgncGFkZGluZycsIHRoaXMucGFkZGluZylcclxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2JvcmRlcicsIHRoaXMuYm9yZGVyKVxyXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnYm9yZGVyLXJhZGl1cycsIHRoaXNbJ2JvcmRlci1yYWRpdXMnXSlcclxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2JveC1zaGFkb3cnLCB0aGlzWydib3gtc2hhZG93J10pXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdmb250LWZhbWlseScsIHRoaXNbJ2ZvbnQtZmFtaWx5J10pXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdwb2ludGVyLWV2ZW50cycsICdub25lJylcclxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ29wYWNpdHknLCAnMCcpXHJcblxyXG4gICAgICAgIC8vIGFyaWEtbGFiZWxzICh0aGFua3MgdG8gd2FobGF0bGFzKVxyXG4gICAgICAgIHRoaXMudG9vbHRpcC5hdHRyKCdyb2xlJywgJ3Rvb2x0aXAnKS5hdHRyKCdhcmlhLWxpdmUnLCAncG9saXRlJylcclxuICAgIH1cclxuXHJcbiAgICAvKiogU2hvdyB0aGUgdG9vbHRpcCAqL1xyXG4gICAgc2hvdygpIHtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgdGhpcy50b29sdGlwLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLnRyYW5zaXRpb25EdXJhdGlvbikuc3R5bGUoJ29wYWNpdHknLCAxKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBIaWRlIHRoZSB0b29sdGlwICovXHJcbiAgICBoaWRlKCkge1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICB0aGlzLnRvb2x0aXAudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRoaXMudHJhbnNpdGlvbkR1cmF0aW9uKS5zdHlsZSgnb3BhY2l0eScsIDApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGNvbnRlbnQgb2YgdGhlIHRvb2x0aXAuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxyXG4gICAgICovXHJcbiAgICBodG1sKGh0bWwpIHtcclxuICAgICAgICB0aGlzLnRvb2x0aXAuaHRtbChodG1sKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9vbHRpcCBhdCB0aGUgbW91c2UgZXZlbnQgcG9zaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50XHJcbiAgICAgKi9cclxuICAgIHNldFBvc2l0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy50b29sdGlwXHJcbiAgICAgICAgICAgIC5zdHlsZSgnbGVmdCcsIGV2ZW50LnBhZ2VYICsgdGhpcy54T2Zmc2V0ICsgJ3B4JylcclxuICAgICAgICAgICAgLnN0eWxlKCd0b3AnLCBldmVudC5wYWdlWSAtIHRoaXMueU9mZnNldCArICdweCcpXHJcblxyXG4gICAgICAgIHRoaXMuZW5zdXJlVG9vbHRpcEluc2lkZUNvbnRhaW5lcihldmVudClcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG5cdG15Lm1vdXNlb3ZlciA9IGZ1bmN0aW9uIChldmVudCwgaHRtbCkge1xyXG5cdFx0aWYgKGh0bWwpIG15Lmh0bWwoaHRtbCk7XHJcblx0XHRteS5zZXRQb3NpdGlvbihldmVudCk7XHJcblx0XHRteS5zaG93KClcclxuXHRcdC8vdGhpcy5lbnN1cmVUb29sdGlwSW5zaWRlQ29udGFpbmVyKCk7XHJcblx0fTtcclxuXHRcclxuXHRteS5tb3VzZW1vdmUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuXHRcdG15LnNldFBvc2l0aW9uKGV2ZW50KTtcclxuXHRcdC8vdGhpcy5lbnN1cmVUb29sdGlwSW5zaWRlQ29udGFpbmVyKCk7XHJcblx0fTtcclxuXHRcclxuXHRteS5tb3VzZW91dCA9IGZ1bmN0aW9uICgpIHtcclxuXHRcdG15LmhpZGUoKTtcclxuXHR9OyovXHJcblxyXG4gICAgc3R5bGUoaywgdikge1xyXG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHJldHVybiB0aGlzLnRvb2x0aXAuc3R5bGUoaylcclxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoaywgdilcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIGF0dHIoaywgdikge1xyXG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHJldHVybiB0aGlzLnRvb2x0aXAuYXR0cihrKVxyXG4gICAgICAgIHRoaXMudG9vbHRpcC5hdHRyKGssIHYpXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBlbnN1cmVUb29sdGlwSW5zaWRlQ29udGFpbmVyXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUHJldmVudHMgdGhlIHRvb2x0aXAgZnJvbSBvdmVyZmxvd2luZyBvdXQgb2YgdGhlIEFwcCBjb250YWluZXIgKGVuc3VyZXMgdGhhdCB0aGUgdG9vbHRpcCBpcyBpbnNpZGUgdGhlIGdyaWR2aXogY29udGFpbmVyKVxyXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudFxyXG4gICAgICovXHJcbiAgICBlbnN1cmVUb29sdGlwSW5zaWRlQ29udGFpbmVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLnRvb2x0aXAubm9kZSgpXHJcbiAgICAgICAgbGV0IHJlY3QgPSB0aGlzLnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcclxuICAgICAgICBsZXQgcGFyZW50V2lkdGggPSByZWN0LndpZHRoXHJcbiAgICAgICAgbGV0IHBhcmVudEhlaWdodCA9IHJlY3QuaGVpZ2h0XHJcblxyXG4gICAgICAgIC8vdG9vIGZhciByaWdodFxyXG4gICAgICAgIGlmIChub2RlLm9mZnNldExlZnQgPiByZWN0LmxlZnQgKyBwYXJlbnRXaWR0aCAtIG5vZGUuY2xpZW50V2lkdGgpIHtcclxuICAgICAgICAgICAgbGV0IGxlZnQgPSBldmVudC54IC0gbm9kZS5jbGllbnRXaWR0aCAtIHRoaXMueE9mZnNldFxyXG4gICAgICAgICAgICBub2RlLnN0eWxlLmxlZnQgPSBsZWZ0ICsgJ3B4J1xyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiBtb3VzZSBjb3ZlcnMgdG9vbHRpcFxyXG4gICAgICAgICAgICBpZiAobm9kZS5vZmZzZXRMZWZ0ICsgbm9kZS5jbGllbnRXaWR0aCA+IGV2ZW50LngpIHtcclxuICAgICAgICAgICAgICAgIC8vbW92ZSB0b29sdGlwIGxlZnQgc28gaXQgZG9lc250IGNvdmVyIG1vdXNlXHJcbiAgICAgICAgICAgICAgICBsZXQgbGVmdDIgPSBldmVudC54IC0gKG5vZGUuY2xpZW50V2lkdGggKyB0aGlzLnhPZmZzZXQpXHJcbiAgICAgICAgICAgICAgICBub2RlLnN0eWxlLmxlZnQgPSBsZWZ0MiArICdweCdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy90b28gZmFyIGRvd25cclxuICAgICAgICBpZiAobm9kZS5vZmZzZXRUb3AgKyBub2RlLmNsaWVudEhlaWdodCA+IHJlY3QudG9wICsgcGFyZW50SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIG5vZGUuc3R5bGUudG9wID0gbm9kZS5vZmZzZXRUb3AgLSBub2RlLmNsaWVudEhlaWdodCArICdweCdcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG4vKiogQHR5cGVkZWYge3sgZGltczogb2JqZWN0LCBjcnM6IHN0cmluZywgdGlsZVNpemVDZWxsOiBudW1iZXIsIG9yaWdpblBvaW50OiB7eDpudW1iZXIseTpudW1iZXJ9LCByZXNvbHV0aW9uR2VvOiBudW1iZXIsIHRpbGluZ0JvdW5kczppbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkVudmVsb3BlIH19IEdyaWRJbmZvICovXHJcblxyXG5pbXBvcnQgeyBjc3YgfSBmcm9tICdkMy1mZXRjaCdcclxuaW1wb3J0IHsgRGF0YXNldENvbXBvbmVudCB9IGZyb20gJy4uL0RhdGFzZXRDb21wb25lbnQuanMnXHJcblxyXG4vKipcclxuICogQSBkYXRhc2V0IGNvbXBvc2VkIG9mIGEgc2luZ2xlIENTViBmaWxlIChub3QgdGlsZWQpLlxyXG4gKlxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ1NWR3JpZCBleHRlbmRzIERhdGFzZXRDb21wb25lbnQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiBUaGUgZGF0YXNldCByZXNvbHV0aW9uIGluIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICogQHBhcmFtIHt7cHJlcHJvY2Vzcz86KGZ1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCk6Ym9vbGVhbil9fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHVybCwgcmVzb2x1dGlvbiwgb3B0cyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIodXJsLCByZXNvbHV0aW9uLCBvcHRzKVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gKi9cclxuICAgICAgICB0aGlzLmNlbGxzID0gW11cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAcHJpdmF0ZSAgKi9cclxuICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ25vdExvYWRlZCdcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlcXVlc3QgZGF0YSB3aXRoaW4gYSBnZW9ncmFwaGljIGVudmVsb3BlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZXx1bmRlZmluZWR9IGVcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTp2b2lkfSByZWRyYXdcclxuICAgICAqL1xyXG4gICAgZ2V0RGF0YShlLCByZWRyYXcpIHtcclxuICAgICAgICAvL2NoZWNrIGlmIGRhdGEgYWxyZWFkeSBsb2FkZWRcclxuICAgICAgICBpZiAodGhpcy5pbmZvTG9hZGluZ1N0YXR1cyAhPSAnbm90TG9hZGVkJykgcmV0dXJuIHRoaXNcclxuXHJcbiAgICAgICAgLy9sb2FkIGRhdGFcclxuICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2xvYWRpbmcnXHJcbiAgICAgICAgOyhhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgY3N2KHRoaXMudXJsKVxyXG5cclxuICAgICAgICAgICAgICAgIC8vY29udmVydCBjb29yZGluYXRlcyBpbiBudW1iZXJzXHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGMueCA9ICtjLnhcclxuICAgICAgICAgICAgICAgICAgICBjLnkgPSArYy55XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9wcmVwcm9jZXNzL2ZpbHRlclxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJlcHJvY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMgPSBbXVxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0aGlzLnByZXByb2Nlc3MoYylcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMucHVzaChjKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxscyA9IGRhdGFcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL1RPRE8gY2hlY2sgaWYgcmVkcmF3IGlzIG5lY2Vzc2FyeVxyXG4gICAgICAgICAgICAgICAgLy90aGF0IGlzIGlmIHRoZSBkYXRhc2V0IGJlbG9uZ3MgdG8gYSBsYXllciB3aGljaCBpcyB2aXNpYmxlIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWxcclxuXHJcbiAgICAgICAgICAgICAgICAvL2V4ZWN1dGUgdGhlIGNhbGxiYWNrLCB1c3VhbGx5IGEgZHJhdyBmdW5jdGlvblxyXG4gICAgICAgICAgICAgICAgaWYgKHJlZHJhdykgcmVkcmF3KClcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2xvYWRlZCdcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIC8vbWFyayBhcyBmYWlsZWRcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jZWxscyA9IFtdXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSgpXHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWxsIHRoZSB2aWV3IGNhY2hlIHdpdGggYWxsIGNlbGxzIHdoaWNoIGFyZSB3aXRoaW4gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkVudmVsb3BlfSBleHRHZW9cclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICB1cGRhdGVWaWV3Q2FjaGUoZXh0R2VvKSB7XHJcbiAgICAgICAgLy9kYXRhIG5vdCBsb2FkZWQgeWV0XHJcbiAgICAgICAgaWYgKCF0aGlzLmNlbGxzKSByZXR1cm5cclxuXHJcbiAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZSA9IFtdXHJcbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHRoaXMuY2VsbHMpIHtcclxuICAgICAgICAgICAgaWYgKCtjZWxsLnggKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueE1pbikgY29udGludWVcclxuICAgICAgICAgICAgaWYgKCtjZWxsLnggLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueE1heCkgY29udGludWVcclxuICAgICAgICAgICAgaWYgKCtjZWxsLnkgKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueU1pbikgY29udGludWVcclxuICAgICAgICAgICAgaWYgKCtjZWxsLnkgLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueU1heCkgY29udGludWVcclxuICAgICAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZS5wdXNoKGNlbGwpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuLyoqXHJcbiAqIEEgZ3JpZCB0aWxlLlxyXG4gKlxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgR3JpZFRpbGUge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxscyBUaGUgdGlsZSBjZWxscy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4VCBUaGUgWCBwb3NpdGlvbiBvZiB0aGUgdGlsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5VCBUaGUgWSBwb3NpdGlvbiBvZiB0aGUgdGlsZS5cclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9DU1ZHcmlkXCIpLkdyaWRJbmZvfSBncmlkSW5mbyBUaGUgZ3JpZCBpbmZvIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoY2VsbHMsIHhULCB5VCwgZ3JpZEluZm8pIHtcclxuICAgICAgICAvKiogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSAqL1xyXG4gICAgICAgIHRoaXMuY2VsbHMgPSBjZWxsc1xyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMueCA9IHhUXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy55ID0geVRcclxuXHJcbiAgICAgICAgY29uc3QgciA9IGdyaWRJbmZvLnJlc29sdXRpb25HZW9cclxuICAgICAgICBjb25zdCBzID0gZ3JpZEluZm8udGlsZVNpemVDZWxsXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZX0gKi9cclxuICAgICAgICB0aGlzLmV4dEdlbyA9IHtcclxuICAgICAgICAgICAgeE1pbjogZ3JpZEluZm8ub3JpZ2luUG9pbnQueCArIHIgKiBzICogdGhpcy54LFxyXG4gICAgICAgICAgICB4TWF4OiBncmlkSW5mby5vcmlnaW5Qb2ludC54ICsgciAqIHMgKiAodGhpcy54ICsgMSksXHJcbiAgICAgICAgICAgIHlNaW46IGdyaWRJbmZvLm9yaWdpblBvaW50LnkgKyByICogcyAqIHRoaXMueSxcclxuICAgICAgICAgICAgeU1heDogZ3JpZEluZm8ub3JpZ2luUG9pbnQueSArIHIgKiBzICogKHRoaXMueSArIDEpLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9jb252ZXJ0IGNlbGwgY29vcmRpbmF0ZXMgaW50byBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXNcclxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIHRoaXMuY2VsbHMpIHtcclxuICAgICAgICAgICAgY2VsbC54ID0gdGhpcy5leHRHZW8ueE1pbiArIGNlbGwueCAqIHJcclxuICAgICAgICAgICAgY2VsbC55ID0gdGhpcy5leHRHZW8ueU1pbiArIGNlbGwueSAqIHJcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG4vKiogQHR5cGVkZWYge3sgZGltczogb2JqZWN0LCBjcnM6IHN0cmluZywgdGlsZVNpemVDZWxsOiBudW1iZXIsIG9yaWdpblBvaW50OiB7eDpudW1iZXIseTpudW1iZXJ9LCByZXNvbHV0aW9uR2VvOiBudW1iZXIsIHRpbGluZ0JvdW5kczppbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkVudmVsb3BlLCBmb3JtYXQ6aW1wb3J0KFwiLi4vRGF0YXNldENvbXBvbmVudFwiKS5Gb3JtYXQgfX0gR3JpZEluZm8gKi9cclxuXHJcbi8vIGludGVybmFsXHJcbmltcG9ydCB7IEdyaWRUaWxlIH0gZnJvbSAnLi9HcmlkVGlsZS5qcydcclxuaW1wb3J0IHsgQXBwIH0gZnJvbSAnLi4vQXBwLmpzJ1xyXG5pbXBvcnQgeyBEYXRhc2V0Q29tcG9uZW50IH0gZnJvbSAnLi4vRGF0YXNldENvbXBvbmVudC5qcydcclxuaW1wb3J0IHsgbW9uaXRvciwgbW9uaXRvckR1cmF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvVXRpbHMuanMnXHJcblxyXG4vLyBleHRlcm5hbFxyXG5pbXBvcnQgeyBqc29uLCBjc3YgfSBmcm9tICdkMy1mZXRjaCdcclxuaW1wb3J0IHsgdGFibGVGcm9tSVBDIH0gZnJvbSAnYXBhY2hlLWFycm93J1xyXG5cclxuLyoqXHJcbiAqIEEgdGlsZWQgZGF0YXNldCwgY29tcG9zZWQgb2YgQ1NWIChvciBwYXJxdWV0KSB0aWxlcy5cclxuICpcclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRpbGVkR3JpZCBleHRlbmRzIERhdGFzZXRDb21wb25lbnQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXHJcbiAgICAgKiBAcGFyYW0ge0FwcH0gYXBwIFRoZSBhcHBsaWNhdGlvbi5cclxuICAgICAqIEBwYXJhbSB7e3ByZXByb2Nlc3M/OihmdW5jdGlvbihpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGwpOmJvb2xlYW4pLCByZWFkUGFycXVldEZ1bj86RnVuY3Rpb24gfX0gb3B0c1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3Rvcih1cmwsIGFwcCwgb3B0cyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIodXJsLCAwLCBvcHRzKVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgYXBwIGJlaW5nIHVzZWQuXHJcbiAgICAgICAgICogQHR5cGUge0FwcH1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFwcCA9IGFwcFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZ3JpZCBpbmZvIG9iamVjdCwgZnJvbSB0aGUgaW5mby5qc29uIGZpbGUuXHJcbiAgICAgICAgICogIEB0eXBlIHtHcmlkSW5mbyB8IHVuZGVmaW5lZH1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqICAqL1xyXG4gICAgICAgIHRoaXMuaW5mbyA9IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBwcml2YXRlICAqL1xyXG4gICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnbm90TG9hZGVkJ1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY2FjaGUgb2YgdGhlIGxvYWRlZCB0aWxlcy4gSXQgaXMgZG91YmxlIGluZGV4ZWQ6IGJ5IHhUIGFuZCB0aGVuIHlULlxyXG4gICAgICAgICAqIEV4YW1wbGU6IHRoaXMuY2FjaGVbeFRdW3lUXSByZXR1cm5zIHRoZSB0aWxlIGF0IFt4VF1beVRdIGxvY2F0aW9uLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cclxuICAgICAgICAgKiAqL1xyXG4gICAgICAgIHRoaXMuY2FjaGUgPSB7fVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAdHlwZSB7RnVuY3Rpb258dW5kZWZpbmVkfVxyXG4gICAgICAgICAqIEBwcml2YXRlICAqL1xyXG4gICAgICAgIHRoaXMucmVhZFBhcnF1ZXRGdW4gPSBvcHRzLnJlYWRQYXJxdWV0RnVuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkIHRoZSBpbmZvLmpzb24gZnJvbSB0aGUgdXJsLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTp2b2lkfSBjYWxsYmFja1xyXG4gICAgICogQHJldHVybnMgdGhpc1xyXG4gICAgICovXHJcbiAgICBsb2FkSW5mbyhjYWxsYmFjaykge1xyXG4gICAgICAgIGlmICghdGhpcy5pbmZvICYmIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPT09ICdub3RMb2FkZWQnKSB7XHJcbiAgICAgICAgICAgIDsoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQganNvbih0aGlzLnVybCArICdpbmZvLmpzb24nKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5mbyA9IGRhdGFcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc29sdXRpb24gPSBkYXRhLnJlc29sdXRpb25HZW9cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2xvYWRlZCdcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKClcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9tYXJrIGFzIGZhaWxlZFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSgpXHJcbiAgICAgICAgfSBlbHNlIGlmIChjYWxsYmFjayAmJiAodGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9PT0gJ2xvYWRlZCcgfHwgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9PT0gJ2ZhaWxlZCcpKVxyXG4gICAgICAgICAgICBjYWxsYmFjaygpXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgYSB0aWxpbmcgZW52ZWxvcGUgZnJvbSBhIGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cclxuICAgICAqIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRvIHVzZSB0byBrbm93IHdoaWNoIHRpbGVzIHRvIGRvd25sb2FkIGZvciBhIGdlb2dyYXBoaWNhbCB2aWV3LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZX0gZVxyXG4gICAgICogQHJldHVybnMge2ltcG9ydChcIi4uL0RhdGFzZXRcIikuRW52ZWxvcGV8dW5kZWZpbmVkfVxyXG4gICAgICovXHJcbiAgICBnZXRUaWxpbmdFbnZlbG9wZShlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmluZm8pIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkSW5mbygoKSA9PiB7fSlcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwbyA9IHRoaXMuaW5mby5vcmlnaW5Qb2ludCxcclxuICAgICAgICAgICAgciA9IHRoaXMuaW5mby5yZXNvbHV0aW9uR2VvLFxyXG4gICAgICAgICAgICBzID0gdGhpcy5pbmZvLnRpbGVTaXplQ2VsbFxyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB4TWluOiBNYXRoLmZsb29yKChlLnhNaW4gLSBwby54KSAvIChyICogcykpLFxyXG4gICAgICAgICAgICB4TWF4OiBNYXRoLmZsb29yKChlLnhNYXggLSBwby54KSAvIChyICogcykpLFxyXG4gICAgICAgICAgICB5TWluOiBNYXRoLmZsb29yKChlLnlNaW4gLSBwby55KSAvIChyICogcykpLFxyXG4gICAgICAgICAgICB5TWF4OiBNYXRoLmZsb29yKChlLnlNYXggLSBwby55KSAvIChyICogcykpLFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlcXVlc3QgZGF0YSB3aXRoaW4gYSBnZW9ncmFwaGljIGVudmVsb3BlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZX0gZXh0R2VvXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6dm9pZH0gcmVkcmF3RnVuXHJcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cclxuICAgICAqL1xyXG4gICAgZ2V0RGF0YShleHRHZW8sIHJlZHJhd0Z1bikge1xyXG4gICAgICAgIC8vVE9ETyBlbXB0eSBjYWNoZSB3aGVuIGl0IGdldHMgdG9vIGJpZyA/XHJcblxyXG4gICAgICAgIC8vY2hlY2sgaWYgaW5mbyBoYXMgYmVlbiBsb2FkZWRcclxuICAgICAgICBpZiAoIXRoaXMuaW5mbykgcmV0dXJuIHRoaXNcclxuXHJcbiAgICAgICAgLy90aWxlcyB3aXRoaW4gdGhlIHNjb3BlXHJcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkVudmVsb3BlfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICBjb25zdCB0YiA9IHRoaXMuZ2V0VGlsaW5nRW52ZWxvcGUoZXh0R2VvKVxyXG4gICAgICAgIGlmICghdGIpIHJldHVybiB0aGlzXHJcblxyXG4gICAgICAgIC8vZ3JpZCBib3VuZHNcclxuICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL0RhdGFzZXRcIikuRW52ZWxvcGV9ICovXHJcbiAgICAgICAgY29uc3QgZ2IgPSB0aGlzLmluZm8udGlsaW5nQm91bmRzXHJcblxyXG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IHRoaXMuaW5mby5mb3JtYXRcclxuXHJcbiAgICAgICAgZm9yIChsZXQgeFQgPSBNYXRoLm1heCh0Yi54TWluLCBnYi54TWluKTsgeFQgPD0gTWF0aC5taW4odGIueE1heCwgZ2IueE1heCk7IHhUKyspIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgeVQgPSBNYXRoLm1heCh0Yi55TWluLCBnYi55TWluKTsgeVQgPD0gTWF0aC5taW4odGIueU1heCwgZ2IueU1heCk7IHlUKyspIHtcclxuICAgICAgICAgICAgICAgIC8vcHJlcGFyZSBjYWNoZVxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3hUXSkgdGhpcy5jYWNoZVt4VF0gPSB7fVxyXG5cclxuICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgdGlsZSBleGlzdHMgaW4gdGhlIGNhY2hlXHJcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge0dyaWRUaWxlfSAqL1xyXG4gICAgICAgICAgICAgICAgbGV0IHRpbGUgPSB0aGlzLmNhY2hlW3hUXVt5VF1cclxuICAgICAgICAgICAgICAgIGlmICh0aWxlKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgICAgIC8vbWFyayB0aWxlIGFzIGxvYWRpbmdcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbeFRdW3lUXSA9ICdsb2FkaW5nJ1xyXG4gICAgICAgICAgICAgICAgOyhhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9yZXF1ZXN0IHRpbGVcclxuICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSAgKi9cclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2VsbHNcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3JtYXQgfHwgZm9ybWF0ID09PSAnQ1NWJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgY3N2KHRoaXMudXJsICsgeFQgKyAnLycgKyB5VCArICcuY3N2JylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcqKiogVGlsZWRHcmlkIHBhcnNlIHN0YXJ0JylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByZXByb2Nlc3MvZmlsdGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHMgPSBbXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0aGlzLnByZXByb2Nlc3MoYylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxzLnB1c2goYylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxzID0gZGF0YVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJ3ByZXByb2Nlc3MgLyBmaWx0ZXInKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ1BBUlFVRVQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmVhZFBhcnF1ZXRGdW4pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZWFkUGFycXVldCBmdW5jdGlvbiBuZWVkZWQgZm9yIHBhcnF1ZXQgZGF0YXNldCcpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKHRoaXMudXJsICsgeFQgKyAnLycgKyB5VCArICcucGFycXVldCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJxdWV0VWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGF3YWl0IHJlc3AuYXJyYXlCdWZmZXIoKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycm93VWludDhBcnJheSA9IHRoaXMucmVhZFBhcnF1ZXRGdW4ocGFycXVldFVpbnQ4QXJyYXkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGFibGVGcm9tSVBDKGFycm93VWludDhBcnJheSlcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxscyA9IFtdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IGNlbGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjID0gZS50b0pTT04oKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByZXByb2Nlc3MvZmlsdGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJlcHJvY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiID0gdGhpcy5wcmVwcm9jZXNzKGMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiID09IGZhbHNlKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxscy5wdXNoKGMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHMucHVzaChjKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcignVGlsZWQgZm9ybWF0IG5vdCBzdXBwb3J0ZWQ6ICcgKyBmb3JtYXQpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9tYXJrIGFzIGZhaWxlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3hUXVt5VF0gPSAnZmFpbGVkJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vc3RvcmUgdGlsZSBpbiBjYWNoZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbmZvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RpbGUgaW5mbyBpbmtub3duJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbGVfID0gbmV3IEdyaWRUaWxlKGNlbGxzLCB4VCwgeVQsIHRoaXMuaW5mbylcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3hUXVt5VF0gPSB0aWxlX1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCdzdG9yYWdlJylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy9pZiBubyByZWRyYXcgaXMgc3BlY2lmaWVkLCB0aGVuIGxlYXZlXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWRyYXdGdW4pIHJldHVyblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIHJlZHJhdyBpcyByZWFsbHkgbmVlZGVkLCB0aGF0IGlzIGlmOlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyAxLiB0aGUgZGF0YXNldCBiZWxvbmdzIHRvIGEgbGF5ZXIgd2hpY2ggaXMgdmlzaWJsZSBhdCB0aGUgY3VycmVudCB6b29tIGxldmVsXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZHJhdyA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgLy9nbyB0aHJvdWdoIHRoZSBsYXllcnNcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB6ZiA9IHRoaXMuYXBwLmdldFpvb21GYWN0b3IoKVxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGF5IG9mIHRoaXMuYXBwLmxheWVycykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxheS52aXNpYmxlKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF5LmdldERhdGFzZXRDb21wb25lbnQoemYpICE9IHRoaXMpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZm91bmQgb25lIGxheWVyLiBObyBuZWVkIHRvIHNlZWsgbW9yZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVkcmF3ID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCdjaGVjayByZWRyYXcgMScpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVkcmF3KSByZXR1cm5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gMi4gdGhlIHRpbGUgaXMgd2l0aGluIHRoZSB2aWV3LCB0aGF0IGlzIGl0cyBnZW8gZW52ZWxvcGUgaW50ZXJzZWN0cyB0aGUgdmlld2VyIGdlbyBlbnZlbG9wZS5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnYgPSB0aGlzLmFwcC51cGRhdGVFeHRlbnRHZW8oKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudlQgPSB0aWxlXy5leHRHZW9cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW52LnhNYXggPD0gZW52VC54TWluKSByZXR1cm5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW52LnhNaW4gPj0gZW52VC54TWF4KSByZXR1cm5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW52LnlNYXggPD0gZW52VC55TWluKSByZXR1cm5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW52LnlNaW4gPj0gZW52VC55TWF4KSByZXR1cm5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignY2hlY2sgcmVkcmF3IDInKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyoqKiBUaWxlZEdyaWQgcGFyc2UgZW5kJylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy9yZWRyYXdcclxuICAgICAgICAgICAgICAgICAgICByZWRyYXdGdW4oKVxyXG4gICAgICAgICAgICAgICAgfSkoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWxsIHRoZSB2aWV3IGNhY2hlIHdpdGggYWxsIGNlbGxzIHdoaWNoIGFyZSB3aXRoaW4gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXHJcbiAgICAgKiBAYWJzdHJhY3RcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZX0gZXh0R2VvXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgdXBkYXRlVmlld0NhY2hlKGV4dEdlbykge1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZSA9IFtdXHJcblxyXG4gICAgICAgIC8vY2hlY2sgaWYgaW5mbyBoYXMgYmVlbiBsb2FkZWRcclxuICAgICAgICBpZiAoIXRoaXMuaW5mbykgcmV0dXJuXHJcblxyXG4gICAgICAgIC8vdGlsZXMgd2l0aGluIHRoZSBzY29wZVxyXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZXx1bmRlZmluZWR9ICovXHJcbiAgICAgICAgY29uc3QgdGIgPSB0aGlzLmdldFRpbGluZ0VudmVsb3BlKGV4dEdlbylcclxuICAgICAgICBpZiAoIXRiKSByZXR1cm5cclxuXHJcbiAgICAgICAgLy9ncmlkIGJvdW5kc1xyXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5FbnZlbG9wZX0gKi9cclxuICAgICAgICBjb25zdCBnYiA9IHRoaXMuaW5mby50aWxpbmdCb3VuZHNcclxuXHJcbiAgICAgICAgZm9yIChsZXQgeFQgPSBNYXRoLm1heCh0Yi54TWluLCBnYi54TWluKTsgeFQgPD0gTWF0aC5taW4odGIueE1heCwgZ2IueE1heCk7IHhUKyspIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3hUXSkgY29udGludWVcclxuICAgICAgICAgICAgZm9yIChsZXQgeVQgPSBNYXRoLm1heCh0Yi55TWluLCBnYi55TWluKTsgeVQgPD0gTWF0aC5taW4odGIueU1heCwgZ2IueU1heCk7IHlUKyspIHtcclxuICAgICAgICAgICAgICAgIC8vZ2V0IHRpbGVcclxuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7R3JpZFRpbGV9ICovXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5jYWNoZVt4VF1beVRdXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRpbGUgfHwgdHlwZW9mIHRpbGUgPT09ICdzdHJpbmcnKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgICAgIC8vZ2V0IGNlbGxzXHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuY2VsbHNWaWV3Q2FjaGUgPSB0aGlzLmNlbGxzVmlld0NhY2hlLmNvbmNhdCh0aWxlLmNlbGxzKVxyXG5cclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiB0aWxlLmNlbGxzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCtjZWxsLnggKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueE1pbikgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICBpZiAoK2NlbGwueCAtIHRoaXMucmVzb2x1dGlvbiA+IGV4dEdlby54TWF4KSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC55ICsgdGhpcy5yZXNvbHV0aW9uIDwgZXh0R2VvLnlNaW4pIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCtjZWxsLnkgLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueU1heCkgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlLnB1c2goY2VsbClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL0xlZ2VuZC5qcydcclxuXHJcbi8qKlxyXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBjb2xvciBjYXRlZ3Jvcmllcy5cclxuICpcclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIENvbG9yQ2F0ZWdvcnlMZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xyXG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvL2NvbC9jYXRlZ29yaWVzIGFycmF5LCBpbiBkaXNwbGF5IG9yZGVyXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPEFycmF5LjxzdHJpbmc+Pn0gKi9cclxuICAgICAgICB0aGlzLmNvbENhdCA9IG9wdHMuY29sQ2F0IHx8IFtbJ2dyYXknLCAnLSddXVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtpbXBvcnQoXCIuLi9TdHlsZVwiKS5TaGFwZX0gKi9cclxuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAnY2lyY2xlJ1xyXG4gICAgICAgIHRoaXMuZGltZW5zaW9uID0gb3B0cy5kaW1lbnNpb24gfHwgeyByOiA4IH1cclxuICAgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gb3B0cy5zdHJva2VDb2xvciB8fCAnZ3JheSdcclxuICAgICAgICB0aGlzLnN0cm9rZVdpZHRoID0gb3B0cy5zdHJva2VXaWR0aCB8fCAxXHJcblxyXG4gICAgICAgIHRoaXMudGl0bGUgPSBvcHRzLnRpdGxlXHJcbiAgICAgICAgdGhpcy50aXRsZUZvbnRTaXplID0gb3B0cy50aXRsZUZvbnRTaXplIHx8ICcwLjhlbSdcclxuICAgICAgICB0aGlzLnRpdGxlRm9udFdlaWdodCA9IG9wdHMudGl0bGVGb250V2VpZ2h0IHx8ICdib2xkJ1xyXG5cclxuICAgICAgICAvL2xhYmVsXHJcbiAgICAgICAgdGhpcy5sYWJlbEZvbnRTaXplID0gb3B0cy5sYWJlbEZvbnRTaXplIHx8ICcwLjhlbSdcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7eyBzdHlsZTogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3R5bGUsIHI6IG51bWJlciwgemY6IG51bWJlciwgc1NpemU6IGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXQsIHNDb2xvcjogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCB9fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZShvcHRzKSB7XHJcbiAgICAgICAgLy9jbGVhclxyXG4gICAgICAgIHRoaXMuZGl2LnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXHJcblxyXG4gICAgICAgIC8vYnVpbGRcclxuXHJcbiAgICAgICAgLy90aXRsZVxyXG4gICAgICAgIGlmICh0aGlzLnRpdGxlKVxyXG4gICAgICAgICAgICB0aGlzLmRpdlxyXG4gICAgICAgICAgICAgICAgLmFwcGVuZCgnZGl2JylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy50aXRsZUZvbnRTaXplKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsIHRoaXMudGl0bGVGb250V2VpZ2h0KVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdtYXJnaW4tYm90dG9tJywgJzdweCcpXHJcbiAgICAgICAgICAgICAgICAudGV4dCh0aGlzLnRpdGxlKVxyXG5cclxuICAgICAgICAvL2NhdGVnb3JpZXNcclxuICAgICAgICBjb25zdCBuYiA9IHRoaXMuY29sQ2F0Lmxlbmd0aFxyXG4gICAgICAgIGlmIChuYiA9PSAwKSByZXR1cm5cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhdCA9IHRoaXMuY29sQ2F0W2ldXHJcblxyXG4gICAgICAgICAgICAvL21ha2UgZGl2IGZvciBjYXRlZ29yeVxyXG4gICAgICAgICAgICBjb25zdCBkID0gdGhpcy5kaXYuYXBwZW5kKCdkaXYnKVxyXG4gICAgICAgICAgICAvL3RvIGVuYWJsZSB2ZXJ0aWNhbCBjZW50ZXJpbmdcclxuICAgICAgICAgICAgLy8uc3R5bGUoXCJwb3NpdGlvblwiLCBcInJlbGF0aXZlXCIpXHJcblxyXG4gICAgICAgICAgICBjb25zdCBzdyA9IHRoaXMuc3Ryb2tlV2lkdGhcclxuXHJcbiAgICAgICAgICAgIC8vZHJhdyBncmFwaGljIGVsZW1lbnQ6IGJveCAvIGNpcmNsZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5zaGFwZSA9PT0gJ3NxdWFyZScpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGggPSB0aGlzLmRpbWVuc2lvbi5oIHx8IDE1XHJcbiAgICAgICAgICAgICAgICBjb25zdCB3ID0gdGhpcy5kaW1lbnNpb24udyB8fCAyMFxyXG4gICAgICAgICAgICAgICAgZC5hcHBlbmQoJ2RpdicpXHJcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3N2ZycpXHJcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgdyArIDIgKiBzdylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaCArIDIgKiBzdylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgncmVjdCcpXHJcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCBzdylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cigneScsIHN3KVxyXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHcpXHJcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGgpXHJcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgY2F0WzBdKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5zdHJva2VDb2xvcilcclxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIHRoaXMuc3Ryb2tlV2lkdGgpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaGFwZSA9PT0gJ2NpcmNsZScpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLmRpbWVuc2lvbi5yIHx8IDhcclxuICAgICAgICAgICAgICAgIGNvbnN0IGggPSAyICogciArIDIgKiBzd1xyXG4gICAgICAgICAgICAgICAgZC5hcHBlbmQoJ2RpdicpXHJcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3N2ZycpXHJcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgaClcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnY2lyY2xlJylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignY3gnLCByICsgc3cpXHJcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2N5JywgciArIHN3KVxyXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdyJywgcilcclxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCBjYXRbMF0pXHJcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLnN0cm9rZUNvbG9yKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaGFwZTonICsgdGhpcy5zaGFwZSlcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy93cml0ZSBsYWJlbCB0ZXh0XHJcbiAgICAgICAgICAgIGQuYXBwZW5kKCdkaXYnKVxyXG4gICAgICAgICAgICAgICAgLy9zaG93IG9uIHJpZ2h0IG9mIGdyYXBoaWNcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdpbmxpbmUnKVxyXG5cclxuICAgICAgICAgICAgICAgIC8vY2VudGVyIHZlcnRpY2FsbHlcclxuICAgICAgICAgICAgICAgIC8vLnN0eWxlKFwicG9zaXRpb25cIiwgXCJhYnNvbHV0ZVwiKS5zdHlsZShcInRvcFwiLCBcIjBcIikuc3R5bGUoXCJib3R0b21cIiwgXCIwXCIpXHJcblxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdwYWRkaW5nLWxlZnQnLCAnNXB4JylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5sYWJlbEZvbnRTaXplKVxyXG4gICAgICAgICAgICAgICAgLnRleHQoY2F0WzFdKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbi8vaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xyXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9MZWdlbmQuanMnXHJcbi8vaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSBcImQzLWZvcm1hdFwiO1xyXG5cclxuLyoqXHJcbiAqIEEgbGVnZW5kIGVsZW1lbnQgZm9yIGRpc2NyZXRlIGNvbG9yIHN0eWxlLlxyXG4gKiBJbnNwaXJhdGlvbjogaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BkMy9jb2xvci1sZWdlbmRcclxuICpcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIENvbG9yRGlzY3JldGVMZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xyXG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogQHByaXZhdGUgQHR5cGUge0FycmF5LjxBcnJheS48c3RyaW5nPj59ICovXHJcbiAgICAgICAgdGhpcy5jb2xvcnMgPSBvcHRzLmNvbG9yc1xyXG4gICAgICAgIC8qKiBAcHJpdmF0ZSBAdHlwZSB7QXJyYXkuPEFycmF5LjxzdHJpbmc+Pn0gKi9cclxuICAgICAgICB0aGlzLmJyZWFrc1RleHQgPSBvcHRzLmJyZWFrc1RleHRcclxuXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgMzAwXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAxNVxyXG5cclxuICAgICAgICB0aGlzLnRpdGxlID0gb3B0cy50aXRsZVxyXG4gICAgICAgIHRoaXMudGl0bGVGb250U2l6ZSA9IG9wdHMudGl0bGVGb250U2l6ZSB8fCAnMC44ZW0nXHJcbiAgICAgICAgdGhpcy50aXRsZUZvbnRXZWlnaHQgPSBvcHRzLnRpdGxlRm9udFdlaWdodCB8fCAnYm9sZCdcclxuXHJcbiAgICAgICAgdGhpcy50aWNrU2l6ZSA9IG9wdHMudGlja1NpemUgfHwgM1xyXG5cclxuICAgICAgICAvL2xhYmVsXHJcbiAgICAgICAgdGhpcy5sYWJlbEZvbnRTaXplID0gb3B0cy5sYWJlbEZvbnRTaXplIHx8ICcwLjhlbSdcclxuICAgICAgICB0aGlzLmludmVydCA9IG9wdHMuaW52ZXJ0XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge3sgc3R5bGU6IGltcG9ydChcIi4uL1N0eWxlXCIpLlN0eWxlLCByOiBudW1iZXIsIHpmOiBudW1iZXIsIHNTaXplOiBpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0LCBzQ29sb3I6IGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXQgfX0gb3B0c1xyXG4gICAgICovXHJcbiAgICB1cGRhdGUob3B0cykge1xyXG4gICAgICAgIC8vY2xlYXJcclxuICAgICAgICB0aGlzLmRpdi5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxyXG5cclxuICAgICAgICAvL2J1aWxkXHJcblxyXG4gICAgICAgIC8vdGl0bGVcclxuICAgICAgICBpZiAodGhpcy50aXRsZSlcclxuICAgICAgICAgICAgdGhpcy5kaXZcclxuICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2RpdicpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMudGl0bGVGb250U2l6ZSlcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCB0aGlzLnRpdGxlRm9udFdlaWdodClcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnbWFyZ2luLWJvdHRvbScsICc3cHgnKVxyXG4gICAgICAgICAgICAgICAgLnRleHQodGhpcy50aXRsZSlcclxuXHJcbiAgICAgICAgLy9jbGFzc2VzXHJcbiAgICAgICAgY29uc3QgbmIgPSB0aGlzLmNvbG9ycy5sZW5ndGhcclxuICAgICAgICBpZiAobmIgPT0gMCkgcmV0dXJuXHJcbiAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkdGggLyBuYlxyXG5cclxuICAgICAgICAvL21ha2Ugc3ZnIGVsZW1lbnRcclxuICAgICAgICBjb25zdCBzdmcgPSB0aGlzLmRpdlxyXG4gICAgICAgICAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgICAgICAgICAuYXR0cignd2lkdGgnLCB0aGlzLndpZHRoKVxyXG4gICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgdGhpcy5oZWlnaHQgKyB0aGlzLnRpY2tTaXplICsgMiArIDEwKVxyXG5cclxuICAgICAgICAvL2RyYXcgZ3JhcGhpYyBlbGVtZW50c1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmI7IGkrKykge1xyXG4gICAgICAgICAgICBzdmcuYXBwZW5kKCdyZWN0JylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgaSAqIHcpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIDApXHJcbiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB3KVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHRoaXMuaGVpZ2h0KVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgdGhpcy5jb2xvcnNbaV0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3RpY2sgbGluZVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbmI7IGkrKykge1xyXG4gICAgICAgICAgICBzdmcuYXBwZW5kKCdsaW5lJylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MScsIHcgKiBpKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kxJywgMClcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MicsIHcgKiBpKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kyJywgdGhpcy5oZWlnaHQgKyB0aGlzLnRpY2tTaXplKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAnYmxhY2snKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9sYWJlbHNcclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG5iOyBpKyspIHtcclxuICAgICAgICAgICAgLy9wcmVwYXJlIGxhYmVsXHJcbiAgICAgICAgICAgIHN2Zy5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ3RpY2tsYWJlbF8nICsgaSlcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgdyAqIGkpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIHRoaXMuaGVpZ2h0ICsgdGhpcy50aWNrU2l6ZSArIDIpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMubGFiZWxGb250U2l6ZSlcclxuICAgICAgICAgICAgICAgIC8vLnN0eWxlKFwiZm9udC13ZWlnaHRcIiwgXCJib2xkXCIpXHJcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtZmFtaWx5XCIsIFwiQXJpYWxcIilcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCBpID09IDAgPyAnc3RhcnQnIDogaSA9PSB0aGlzLnRpY2tzIC0gMSA/ICdlbmQnIDogJ21pZGRsZScpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2FsaWdubWVudC1iYXNlbGluZScsICd0b3AnKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdkb21pbmFudC1iYXNlbGluZScsICdoYW5naW5nJylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgncG9pbnRlci1ldmVudHMnLCAnbm9uZScpXHJcbiAgICAgICAgICAgICAgICAudGV4dCh0aGlzLmJyZWFrc1RleHRbaSAtIDFdKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbi8vaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xyXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9MZWdlbmQuanMnXHJcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2QzLWZvcm1hdCdcclxuXHJcbi8qKlxyXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBjb250aW51b3VzIGNvbG9yIHN0eWxlLlxyXG4gKiBJbnNwaXJhdGlvbjogaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BkMy9jb2xvci1sZWdlbmRcclxuICpcclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIENvbG9yTGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcclxuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgdGhpcy5jb2xvclJhbXAgPSBvcHRzLmNvbG9yUmFtcFxyXG5cclxuICAgICAgICAvL2Z1bmN0aW9uICh0WzAsMV0sIHIsIHMpIC0+IHYgKGZvciBsYWJlbCB0ZXh0KVxyXG4gICAgICAgIHRoaXMuZnVuID0gb3B0cy5mdW5cclxuXHJcbiAgICAgICAgdGhpcy50aXRsZSA9IG9wdHMudGl0bGVcclxuICAgICAgICB0aGlzLnRpY2tTaXplID0gb3B0cy50aWNrU2l6ZSB8fCA2XHJcbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgMzAwXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAxNVxyXG4gICAgICAgIHRoaXMubWFyZ2luID0gb3B0cy5tYXJnaW4gfHwgNVxyXG4gICAgICAgIHRoaXMudGlja3MgPSBvcHRzLnRpY2tzIHx8IE1hdGguZmxvb3IodGhpcy53aWR0aCAvIDUwKVxyXG4gICAgICAgIHRoaXMudGlja0Zvcm1hdCA9IG9wdHMudGlja0Zvcm1hdCB8fCAnLC4wZidcclxuICAgICAgICB0aGlzLnRpY2tVbml0ID0gb3B0cy50aWNrVW5pdFxyXG5cclxuICAgICAgICB0aGlzLmZvbnRTaXplID0gb3B0cy5mb250U2l6ZSB8fCAnMC44ZW0nXHJcbiAgICAgICAgdGhpcy5pbnZlcnQgPSBvcHRzLmludmVydFxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHt7IHN0eWxlOiBpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdHlsZSwgcjogbnVtYmVyLCB6ZjogbnVtYmVyLCBzU2l6ZTogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCwgc0NvbG9yOiBpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0IH19IG9wdHNcclxuICAgICAqL1xyXG4gICAgdXBkYXRlKG9wdHMpIHtcclxuICAgICAgICAvL2NvdWxkIGhhcHBlbiB3aGVuIGRhdGEgaXMgc3RpbGwgbG9hZGluZ1xyXG4gICAgICAgIGlmICghb3B0cy5zQ29sb3IpIHJldHVyblxyXG5cclxuICAgICAgICAvL2NsZWFyXHJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcclxuXHJcbiAgICAgICAgY29uc3QgdGl0bGVIZWlnaHQgPSAxMlxyXG5cclxuICAgICAgICBjb25zdCBzdmdXID0gdGhpcy53aWR0aCArIDIgKiB0aGlzLm1hcmdpblxyXG4gICAgICAgIGNvbnN0IHN2Z0ggPSB0aGlzLmhlaWdodCArIDMgKiB0aGlzLm1hcmdpbiArIHRpdGxlSGVpZ2h0ICsgdGhpcy50aWNrU2l6ZSArIDEwXHJcbiAgICAgICAgY29uc3Qgc3ZnID0gdGhpcy5kaXYuYXBwZW5kKCdzdmcnKS5hdHRyKCd3aWR0aCcsIHN2Z1cpLmF0dHIoJ2hlaWdodCcsIHN2Z0gpXHJcbiAgICAgICAgLy8gIDxyZWN0IHdpZHRoPVwiMzAwXCIgaGVpZ2h0PVwiMTAwXCIgc3R5bGU9XCJmaWxsOnJnYigwLDAsMjU1KTtzdHJva2Utd2lkdGg6MztzdHJva2U6cmdiKDAsMCwwKVwiIC8+XHJcblxyXG4gICAgICAgIC8vdGl0bGVcclxuICAgICAgICBzdmcuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgICAgICAgLmF0dHIoJ3gnLCB0aGlzLm1hcmdpbilcclxuICAgICAgICAgICAgLmF0dHIoJ3knLCB0aGlzLm1hcmdpbilcclxuICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnMC44ZW0nKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJ2JvbGQnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ2FsaWdubWVudC1iYXNlbGluZScsICd0b3AnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ2RvbWluYW50LWJhc2VsaW5lJywgJ2hhbmdpbmcnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxyXG4gICAgICAgICAgICAudGV4dCh0aGlzLnRpdGxlKVxyXG5cclxuICAgICAgICBjb25zdCBnID0gc3ZnXHJcbiAgICAgICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgdGhpcy5tYXJnaW4gKyAnICcgKyAoMiAqIHRoaXMubWFyZ2luICsgdGl0bGVIZWlnaHQpICsgJyknKVxyXG5cclxuICAgICAgICAvL2RyYXcgY29sb3IgYmFyXHJcbiAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkdGgsXHJcbiAgICAgICAgICAgIGggPSB0aGlzLmhlaWdodFxyXG4gICAgICAgIGNvbnN0IHN0ZXAgPSA1XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3OyBpICs9IHN0ZXApIHtcclxuICAgICAgICAgICAgbGV0IHQgPSBpIC8gKHcgLSAxKVxyXG4gICAgICAgICAgICBpZiAodGhpcy5pbnZlcnQpIHQgPSAxIC0gdFxyXG4gICAgICAgICAgICBnLmFwcGVuZCgncmVjdCcpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsIGkpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIDApXHJcbiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCBzdGVwKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGgpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCB0aGlzLmNvbG9yUmFtcCh0KSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50aWNrczsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0ID0gaSAvICh0aGlzLnRpY2tzIC0gMSlcclxuXHJcbiAgICAgICAgICAgIC8vdGljayBsaW5lXHJcbiAgICAgICAgICAgIGcuYXBwZW5kKCdsaW5lJylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MScsIHcgKiB0KVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kxJywgMClcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MicsIHcgKiB0KVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kyJywgaCArIHRoaXMudGlja1NpemUpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICdibGFjaycpXHJcblxyXG4gICAgICAgICAgICAvL3ByZXBhcmUgdGljayBsYWJlbFxyXG4gICAgICAgICAgICBnLmFwcGVuZCgndGV4dCcpXHJcbiAgICAgICAgICAgICAgICAuYXR0cignaWQnLCAndGlja2xhYmVsXycgKyBpKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCB3ICogdClcclxuICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgaCArIHRoaXMudGlja1NpemUgKyAyKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmZvbnRTaXplKVxyXG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJmb250LXdlaWdodFwiLCBcImJvbGRcIilcclxuICAgICAgICAgICAgICAgIC8vLnN0eWxlKFwiZm9udC1mYW1pbHlcIiwgXCJBcmlhbFwiKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsIGkgPT0gMCA/ICdzdGFydCcgOiBpID09IHRoaXMudGlja3MgLSAxID8gJ2VuZCcgOiAnbWlkZGxlJylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnYWxpZ25tZW50LWJhc2VsaW5lJywgJ3RvcCcpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2RvbWluYW50LWJhc2VsaW5lJywgJ2hhbmdpbmcnKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdwb2ludGVyLWV2ZW50cycsICdub25lJylcclxuICAgICAgICAgICAgLy8udGV4dChcIi1cIilcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdXBkYXRlIHRpY2sgbGFiZWxzXHJcblxyXG4gICAgICAgIC8vbGFiZWwgdGV4dCBmb3JtYXRcclxuICAgICAgICBjb25zdCBmID0gdGhpcy50aWNrRm9ybWF0ICYmIHRoaXMudGlja0Zvcm1hdCAhPSAndGV4dCcgPyBmb3JtYXQodGhpcy50aWNrRm9ybWF0KSA6ICh2KSA9PiB2XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRpY2tzOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHQgPSBpIC8gKHRoaXMudGlja3MgLSAxKVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuZnVuKHQsIG9wdHMuciwgb3B0cy5zQ29sb3IpXHJcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSAodiA/IGYodikgOiAnMCcpICsgKHRoaXMudGlja1VuaXQgPyB0aGlzLnRpY2tVbml0IDogJycpXHJcblxyXG4gICAgICAgICAgICAvL3RpY2sgbGFiZWxcclxuICAgICAgICAgICAgdGhpcy5kaXYuc2VsZWN0KCcjJyArICd0aWNrbGFiZWxfJyArIGkpLnRleHQodGV4dClcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9MZWdlbmQuanMnXHJcblxyXG4vKipcclxuICogQSBsZWdlbmQgZWxlbWVudCBmb3Igc2VnbWVudCBvcmllbnRhdGlvbi5cclxuICpcclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNlZ21lbnRPcmllbnRhdGlvbkxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XHJcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8vdGl0bGVcclxuICAgICAgICB0aGlzLnRpdGxlID0gb3B0cy50aXRsZVxyXG4gICAgICAgIHRoaXMudGl0bGVGb250U2l6ZSA9IG9wdHMudGl0bGVGb250U2l6ZSB8fCAnMC44ZW0nXHJcbiAgICAgICAgdGhpcy50aXRsZUZvbnRXZWlnaHQgPSBvcHRzLnRpdGxlRm9udFdlaWdodCB8fCAnYm9sZCdcclxuXHJcbiAgICAgICAgLy9leGFnZXJhdGlvblxyXG4gICAgICAgIHRoaXMuZXhhZ2dlcmF0aW9uRmFjdG9yID0gb3B0cy5leGFnZ2VyYXRpb25GYWN0b3IgfHwgMC41XHJcblxyXG4gICAgICAgIC8vY29sb3JcclxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAnZ3JheSdcclxuICAgICAgICAvL29yaWVudGF0aW9uXHJcbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IG9wdHMub3JpZW50YXRpb24gfHwgMFxyXG4gICAgICAgIC8vd2lkdGhcclxuICAgICAgICB0aGlzLndpZHRoUGl4ID0gb3B0cy53aWR0aFBpeCB8fCAzXHJcblxyXG4gICAgICAgIC8vbGFiZWxcclxuICAgICAgICB0aGlzLmxhYmVsRm9udFNpemUgPSBvcHRzLmxhYmVsRm9udFNpemUgfHwgJzAuOGVtJ1xyXG4gICAgICAgIHRoaXMubGFiZWxVbml0VGV4dCA9IG9wdHMubGFiZWxVbml0VGV4dCB8fCAnJ1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHt7IHN0eWxlOiBpbXBvcnQoXCIuLi9zdHlsZS9TZWdtZW50U3R5bGVcIikuU2VnbWVudFN0eWxlLCByOiBudW1iZXIsIHpmOiBudW1iZXIsIHNDb2xvcjogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCwgc0xlbmd0aDogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCwgc1dpZHRoOiBpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0IH19IG9wdHNcclxuICAgICAqL1xyXG4gICAgdXBkYXRlKG9wdHMpIHtcclxuICAgICAgICAvL2NvdWxkIGhhcHBlbiB3aGVuIGRhdGEgaXMgc3RpbGwgbG9hZGluZ1xyXG4gICAgICAgIGlmICghb3B0cy5zV2lkdGgpIHJldHVyblxyXG5cclxuICAgICAgICAvL2NsZWFyXHJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcclxuXHJcbiAgICAgICAgY29uc3QgZCA9IHRoaXMuZGl2LmFwcGVuZCgnZGl2JylcclxuXHJcbiAgICAgICAgLy90aXRsZVxyXG4gICAgICAgIGlmICh0aGlzLnRpdGxlKSB7XHJcbiAgICAgICAgICAgIGQuYXBwZW5kKCdkaXYnKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3RpdGxlJylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy50aXRsZUZvbnRTaXplKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsIHRoaXMudGl0bGVGb250V2VpZ2h0KVxyXG4gICAgICAgICAgICAgICAgLnRleHQodGhpcy50aXRsZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vY29tcHV0ZSBzZWdtZW50IHdpZHRoIGFuZCBsZW5ndGgsIGluIHBpeFxyXG4gICAgICAgIGNvbnN0IHNXaWR0aCA9IHRoaXMud2lkdGhQaXhcclxuICAgICAgICBjb25zdCBzTGVuZ3RoID0gKDEgKiBvcHRzLnIpIC8gb3B0cy56ZlxyXG5cclxuICAgICAgICAvL2RyYXcgU1ZHIHNlZ21lbnRcclxuICAgICAgICBjb25zdCBzdmdTID0gTWF0aC5tYXgoc0xlbmd0aCwgc1dpZHRoKVxyXG4gICAgICAgIGNvbnN0IHN2ZyA9IGQuYXBwZW5kKCdzdmcnKS5hdHRyKCd3aWR0aCcsIHN2Z1MpLmF0dHIoJ2hlaWdodCcsIHN2Z1MpLnN0eWxlKCcnLCAnaW5saW5lLWJsb2NrJylcclxuXHJcbiAgICAgICAgY29uc3QgY29zID0gTWF0aC5jb3MoKC10aGlzLm9yaWVudGF0aW9uICogTWF0aC5QSSkgLyAxODApXHJcbiAgICAgICAgY29uc3Qgc2luID0gTWF0aC5zaW4oKC10aGlzLm9yaWVudGF0aW9uICogTWF0aC5QSSkgLyAxODApXHJcbiAgICAgICAgY29uc3QgZGMgPSBzdmdTICogMC41LFxyXG4gICAgICAgICAgICBsMiA9IHNMZW5ndGggKiAwLjVcclxuICAgICAgICBzdmcuYXBwZW5kKCdsaW5lJylcclxuICAgICAgICAgICAgLmF0dHIoJ3gxJywgZGMgLSBjb3MgKiBsMilcclxuICAgICAgICAgICAgLmF0dHIoJ3kxJywgZGMgLSBzaW4gKiBsMilcclxuICAgICAgICAgICAgLmF0dHIoJ3gyJywgZGMgKyBjb3MgKiBsMilcclxuICAgICAgICAgICAgLmF0dHIoJ3kyJywgZGMgKyBzaW4gKiBsMilcclxuICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLmNvbG9yKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIHNXaWR0aClcclxuXHJcbiAgICAgICAgLy90ZXh0IGxhYmVsXHJcbiAgICAgICAgZC5hcHBlbmQoJ2RpdicpXHJcbiAgICAgICAgICAgIC8vc2hvdyBvbiByaWdodCBvZiBzdmdcclxuICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXHJcbiAgICAgICAgICAgIC5zdHlsZSgncGFkZGluZy1sZWZ0JywgJzVweCcpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5sYWJlbEZvbnRTaXplKVxyXG4gICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtd2VpZ2h0XCIsIFwiYm9sZFwiKVxyXG4gICAgICAgICAgICAudGV4dCh0aGlzLmxhYmVsVW5pdFRleHQpXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9MZWdlbmQuanMnXHJcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2QzLWZvcm1hdCdcclxuXHJcbi8qKlxyXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBzZWdtZW50IHdpZHRoLlxyXG4gKlxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU2VnbWVudFdpZHRoTGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcclxuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLy90aXRsZVxyXG4gICAgICAgIHRoaXMudGl0bGUgPSBvcHRzLnRpdGxlXHJcbiAgICAgICAgdGhpcy50aXRsZUZvbnRTaXplID0gb3B0cy50aXRsZUZvbnRTaXplIHx8ICcwLjhlbSdcclxuICAgICAgICB0aGlzLnRpdGxlRm9udFdlaWdodCA9IG9wdHMudGl0bGVGb250V2VpZ2h0IHx8ICdib2xkJ1xyXG5cclxuICAgICAgICAvL2V4YWdlcmF0aW9uXHJcbiAgICAgICAgdGhpcy5leGFnZ2VyYXRpb25GYWN0b3IgPSBvcHRzLmV4YWdnZXJhdGlvbkZhY3RvciB8fCAwLjVcclxuXHJcbiAgICAgICAgLy9jb2xvclxyXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICdncmF5J1xyXG4gICAgICAgIC8vb3JpZW50YXRpb25cclxuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gb3B0cy5vcmllbnRhdGlvbiB8fCAwXHJcblxyXG4gICAgICAgIC8vbGFiZWxcclxuICAgICAgICB0aGlzLmxhYmVsRm9udFNpemUgPSBvcHRzLmxhYmVsRm9udFNpemUgfHwgJzAuOGVtJ1xyXG4gICAgICAgIHRoaXMubGFiZWxVbml0VGV4dCA9IG9wdHMubGFiZWxVbml0VGV4dCB8fCAnJ1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHt7IHN0eWxlOiBpbXBvcnQoXCIuLi9zdHlsZS9TZWdtZW50U3R5bGVcIikuU2VnbWVudFN0eWxlLCByOiBudW1iZXIsIHpmOiBudW1iZXIsIHNDb2xvcjogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCwgc0xlbmd0aDogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCwgc1dpZHRoOiBpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0IH19IG9wdHNcclxuICAgICAqL1xyXG4gICAgdXBkYXRlKG9wdHMpIHtcclxuICAgICAgICAvL2NvdWxkIGhhcHBlbiB3aGVuIGRhdGEgaXMgc3RpbGwgbG9hZGluZ1xyXG4gICAgICAgIGlmICghb3B0cy5zV2lkdGgpIHJldHVyblxyXG5cclxuICAgICAgICAvL2NsZWFyXHJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcclxuXHJcbiAgICAgICAgY29uc3QgZCA9IHRoaXMuZGl2LmFwcGVuZCgnZGl2JylcclxuXHJcbiAgICAgICAgLy90aXRsZVxyXG4gICAgICAgIGlmICh0aGlzLnRpdGxlKSB7XHJcbiAgICAgICAgICAgIGQuYXBwZW5kKCdkaXYnKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3RpdGxlJylcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy50aXRsZUZvbnRTaXplKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsIHRoaXMudGl0bGVGb250V2VpZ2h0KVxyXG4gICAgICAgICAgICAgICAgLnRleHQodGhpcy50aXRsZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vZ2V0IG1heCB2YWx1ZVxyXG4gICAgICAgIGNvbnN0IHZhbHVlXyA9IG9wdHMuc1dpZHRoLm1heCAqIHRoaXMuZXhhZ2dlcmF0aW9uRmFjdG9yXHJcblxyXG4gICAgICAgIC8vdGFrZSAnbmljZScgdmFsdWUgKHBvd2VyIG9mIHRlbiwgb3IgbXVsdGlwbGUpXHJcbiAgICAgICAgbGV0IHBvdzEwID0gTWF0aC5sb2cxMCh2YWx1ZV8pXHJcbiAgICAgICAgcG93MTAgPSBNYXRoLmZsb29yKHBvdzEwKVxyXG4gICAgICAgIGxldCB2YWx1ZSA9IE1hdGgucG93KDEwLCBwb3cxMClcclxuICAgICAgICBpZiAodmFsdWUgKiA4IDw9IHZhbHVlXykgdmFsdWUgKj0gOFxyXG4gICAgICAgIGVsc2UgaWYgKHZhbHVlICogNiA8PSB2YWx1ZV8pIHZhbHVlICo9IDZcclxuICAgICAgICBlbHNlIGlmICh2YWx1ZSAqIDUgPD0gdmFsdWVfKSB2YWx1ZSAqPSA1XHJcbiAgICAgICAgZWxzZSBpZiAodmFsdWUgKiA0IDw9IHZhbHVlXykgdmFsdWUgKj0gNFxyXG4gICAgICAgIGVsc2UgaWYgKHZhbHVlICogMi41IDw9IHZhbHVlXykgdmFsdWUgKj0gMi41XHJcbiAgICAgICAgZWxzZSBpZiAodmFsdWUgKiAyIDw9IHZhbHVlXykgdmFsdWUgKj0gMlxyXG5cclxuICAgICAgICAvL2NvbXB1dGUgc2VnbWVudCB3aWR0aCBhbmQgbGVuZ3RoLCBpbiBwaXhcclxuICAgICAgICBjb25zdCBzV2lkdGggPSBvcHRzLnN0eWxlLndpZHRoKHZhbHVlLCBvcHRzLnIsIG9wdHMuc1dpZHRoLCBvcHRzLnpmKSAvIG9wdHMuemZcclxuICAgICAgICBjb25zdCBzTGVuZ3RoID0gKDEgKiBvcHRzLnIpIC8gb3B0cy56ZlxyXG5cclxuICAgICAgICAvL1RPRE8gdXNlIG9yaWVudGF0aW9uXHJcblxyXG4gICAgICAgIGNvbnN0IHN2ZyA9IGQuYXBwZW5kKCdzdmcnKS5hdHRyKCd3aWR0aCcsIHNMZW5ndGgpLmF0dHIoJ2hlaWdodCcsIHNXaWR0aCkuc3R5bGUoJycsICdpbmxpbmUtYmxvY2snKVxyXG5cclxuICAgICAgICAvLzxsaW5lIHgxPVwiMFwiIHkxPVwiMFwiIHgyPVwiMjAwXCIgeTI9XCIyMDBcIiBzdHlsZT1cInN0cm9rZTpyZ2IoMjU1LDAsMCk7c3Ryb2tlLXdpZHRoOjJcIiAvPlxyXG4gICAgICAgIHN2Zy5hcHBlbmQoJ2xpbmUnKVxyXG4gICAgICAgICAgICAuYXR0cigneDEnLCAwKVxyXG4gICAgICAgICAgICAuYXR0cigneTEnLCBzV2lkdGggLyAyKVxyXG4gICAgICAgICAgICAuYXR0cigneDInLCBzTGVuZ3RoKVxyXG4gICAgICAgICAgICAuYXR0cigneTInLCBzV2lkdGggLyAyKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuY29sb3IpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgc1dpZHRoKVxyXG5cclxuICAgICAgICBjb25zdCB2YWx1ZVQgPSBmb3JtYXQoJywuMnInKSh2YWx1ZSlcclxuICAgICAgICBkLmFwcGVuZCgnZGl2JylcclxuICAgICAgICAgICAgLy9zaG93IG9uIHJpZ2h0IG9mIGdyYXBoaWNcclxuICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXHJcbiAgICAgICAgICAgIC5zdHlsZSgncGFkZGluZy1sZWZ0JywgJzVweCcpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5sYWJlbEZvbnRTaXplKVxyXG4gICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtd2VpZ2h0XCIsIFwiYm9sZFwiKVxyXG4gICAgICAgICAgICAudGV4dCh2YWx1ZVQgKyAodGhpcy5sYWJlbFVuaXRUZXh0ID8gJyAnIDogJycpICsgdGhpcy5sYWJlbFVuaXRUZXh0KVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vTGVnZW5kLmpzJ1xyXG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkMy1mb3JtYXQnXHJcblxyXG4vKipcclxuICogQSBsZWdlbmQgZWxlbWVudCBmb3IgcHJvcG9ydGlvbmFsIHN5bWJvbHMuXHJcbiAqXHJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTaXplTGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcclxuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLy9leGFnZXJhdGlvblxyXG4gICAgICAgIHRoaXMuZXhhZ2dlcmF0aW9uRmFjdG9yID0gb3B0cy5leGFnZ2VyYXRpb25GYWN0b3IgfHwgMC44XHJcblxyXG4gICAgICAgIC8vaWYgdmFsdWUgaXMgdG8gYmUgZm9yY2VkXHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IG9wdHMudmFsdWUgfHwgdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIC8vdGl0bGVcclxuICAgICAgICB0aGlzLnRpdGxlID0gb3B0cy50aXRsZVxyXG4gICAgICAgIHRoaXMudGl0bGVGb250U2l6ZSA9IG9wdHMudGl0bGVGb250U2l6ZSB8fCAnMC44ZW0nXHJcbiAgICAgICAgdGhpcy50aXRsZUZvbnRXZWlnaHQgPSBvcHRzLnRpdGxlRm9udFdlaWdodCB8fCAnYm9sZCdcclxuXHJcbiAgICAgICAgLy9zeW1ib2xcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtpbXBvcnQoXCIuLi9TdHlsZVwiKS5TaGFwZX0gKi9cclxuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAnY2lyY2xlJ1xyXG4gICAgICAgIHRoaXMuZmlsbENvbG9yID0gb3B0cy5maWxsQ29sb3IgfHwgJ25vbmUnXHJcbiAgICAgICAgdGhpcy5zdHJva2VDb2xvciA9IG9wdHMuc3Ryb2tlQ29sb3IgfHwgJ2dyYXknXHJcbiAgICAgICAgdGhpcy5zdHJva2VXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGggfHwgMVxyXG5cclxuICAgICAgICAvL2xhYmVsXHJcbiAgICAgICAgdGhpcy5sYWJlbEZvbnRTaXplID0gb3B0cy5sYWJlbEZvbnRTaXplIHx8ICcwLjhlbSdcclxuICAgICAgICB0aGlzLmxhYmVsVW5pdFRleHQgPSBvcHRzLmxhYmVsVW5pdFRleHQgfHwgJydcclxuICAgICAgICB0aGlzLmxhYmVsRm9ybWF0ID0gb3B0cy5sYWJlbEZvcm1hdCB8fCAnLC4ycidcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvL3RoaXMuZGl2LnN0eWxlKFwidGV4dC1hbGlnblwiLCBcImNlbnRlclwiKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHt7IHN0eWxlOiBpbXBvcnQoXCIuLi9zdHlsZS9TaGFwZUNvbG9yU2l6ZVN0eWxlXCIpLlNoYXBlQ29sb3JTaXplU3R5bGUsIHI6IG51bWJlciwgemY6IG51bWJlciwgc1NpemU6IGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXQsIHNDb2xvcjogaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCB9fSBvcHRzXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZShvcHRzKSB7XHJcbiAgICAgICAgLy9jb3VsZCBoYXBwZW4gd2hlbiBkYXRhIGlzIHN0aWxsIGxvYWRpbmdcclxuICAgICAgICBpZiAoIW9wdHMuc1NpemUpIHJldHVyblxyXG5cclxuICAgICAgICAvL2NsZWFyXHJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcclxuXHJcbiAgICAgICAgLy9nZXQgdmFsdWVcclxuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnZhbHVlXHJcbiAgICAgICAgaWYgKHZhbHVlID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvL2NvbXB1dGUgJ25pY2UgdmFsdWVcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IG1heCB2YWx1ZVxyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZV8gPSBvcHRzLnNTaXplLm1heCAqIHRoaXMuZXhhZ2dlcmF0aW9uRmFjdG9yXHJcblxyXG4gICAgICAgICAgICAvL3Rha2UgJ25pY2UnIHZhbHVlIChwb3dlciBvZiB0ZW4sIG9yIG11bHRpcGxlKVxyXG4gICAgICAgICAgICBsZXQgcG93MTAgPSBNYXRoLmxvZzEwKHZhbHVlXylcclxuICAgICAgICAgICAgcG93MTAgPSBNYXRoLmZsb29yKHBvdzEwKVxyXG4gICAgICAgICAgICB2YWx1ZSA9IE1hdGgucG93KDEwLCBwb3cxMClcclxuICAgICAgICAgICAgaWYgKHZhbHVlICogOCA8PSB2YWx1ZV8pIHZhbHVlICo9IDhcclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgKiA2IDw9IHZhbHVlXykgdmFsdWUgKj0gNlxyXG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSAqIDUgPD0gdmFsdWVfKSB2YWx1ZSAqPSA1XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlICogNCA8PSB2YWx1ZV8pIHZhbHVlICo9IDRcclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgKiAyLjUgPD0gdmFsdWVfKSB2YWx1ZSAqPSAyLjVcclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgKiAyIDw9IHZhbHVlXykgdmFsdWUgKj0gMlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuXHJcblxyXG4gICAgICAgIGNvbnN0IGQgPSB0aGlzLmRpdi5hcHBlbmQoJ2RpdicpXHJcbiAgICAgICAgLy90byBlbmFibGUgdmVydGljYWwgY2VudGVyaW5nXHJcbiAgICAgICAgLy8uc3R5bGUoXCJwb3NpdGlvblwiLCBcInJlbGF0aXZlXCIpXHJcblxyXG4gICAgICAgIC8vdGl0bGVcclxuICAgICAgICBpZiAodGhpcy50aXRsZSkge1xyXG4gICAgICAgICAgICBkLmFwcGVuZCgnZGl2JylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICd0aXRsZScpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMudGl0bGVGb250U2l6ZSlcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCB0aGlzLnRpdGxlRm9udFdlaWdodClcclxuICAgICAgICAgICAgICAgIC50ZXh0KHRoaXMudGl0bGUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2NvbXB1dGUgc2l6ZSBvZiBzeW1ib2wsIGluIHBpeFxyXG4gICAgICAgIGNvbnN0IHNpemUgPSBvcHRzLnN0eWxlLnNpemUodmFsdWUsIG9wdHMuciwgb3B0cy5zU2l6ZSwgb3B0cy56ZikgLyBvcHRzLnpmXHJcblxyXG4gICAgICAgIGNvbnN0IHN2ZyA9IGRcclxuICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcclxuICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgc2l6ZSArIHRoaXMuc3Ryb2tlV2lkdGggKyAyKVxyXG4gICAgICAgICAgICAuYXR0cignaGVpZ2h0Jywgc2l6ZSArIHRoaXMuc3Ryb2tlV2lkdGggKyAyKVxyXG4gICAgICAgICAgICAuc3R5bGUoJycsICdpbmxpbmUtYmxvY2snKVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zaGFwZSA9PT0gJ3NxdWFyZScpIHtcclxuICAgICAgICAgICAgc3ZnLmFwcGVuZCgncmVjdCcpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsIDApXHJcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIDApXHJcbiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCBzaXplKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHNpemUpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCB0aGlzLmZpbGxDb2xvcilcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5zdHJva2VDb2xvcilcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcclxuICAgICAgICAgICAgLy9UT0RPIHRlc3RcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hhcGUgPT09ICdjaXJjbGUnKSB7XHJcbiAgICAgICAgICAgIC8vIDxjaXJjbGUgY3g9XCI1MFwiIGN5PVwiNTBcIiByPVwiNDBcIiBzdHJva2U9XCJibGFja1wiIHN0cm9rZS13aWR0aD1cIjNcIiBmaWxsPVwicmVkXCIgLz5cclxuICAgICAgICAgICAgY29uc3QgciA9IChzaXplICsgdGhpcy5zdHJva2VXaWR0aCkgKiAwLjVcclxuICAgICAgICAgICAgc3ZnLmFwcGVuZCgnY2lyY2xlJylcclxuICAgICAgICAgICAgICAgIC5hdHRyKCdjeCcsIHIgKyAxKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2N5JywgciArIDEpXHJcbiAgICAgICAgICAgICAgICAuYXR0cigncicsIHIpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCB0aGlzLmZpbGxDb2xvcilcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5zdHJva2VDb2xvcilcclxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hhcGUgPT09ICdkb251dCcpIHtcclxuICAgICAgICAgICAgLy9UT0RPXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnZGlhbW9uZCcpIHtcclxuICAgICAgICAgICAgLy9UT0RPXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyB0aGlzLnNoYXBlKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdmFsdWVUID0gZm9ybWF0KHRoaXMubGFiZWxGb3JtYXQpKHZhbHVlKVxyXG4gICAgICAgIGQuYXBwZW5kKCdkaXYnKVxyXG4gICAgICAgICAgICAvL3Nob3cgb24gcmlnaHQgb2YgZ3JhcGhpY1xyXG4gICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnaW5saW5lJylcclxuXHJcbiAgICAgICAgICAgIC8vY2VudGVyIHZlcnRpY2FsbHlcclxuICAgICAgICAgICAgLy8uc3R5bGUoXCJwb3NpdGlvblwiLCBcImFic29sdXRlXCIpLnN0eWxlKFwidG9wXCIsIFwiMFwiKS5zdHlsZShcImJvdHRvbVwiLCBcIjBcIilcclxuXHJcbiAgICAgICAgICAgIC5zdHlsZSgncGFkZGluZy1sZWZ0JywgJzVweCcpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5sYWJlbEZvbnRTaXplKVxyXG4gICAgICAgICAgICAudGV4dCh2YWx1ZVQgKyAodGhpcy5sYWJlbFVuaXRUZXh0ID8gJyAnIDogJycpICsgdGhpcy5sYWJlbFVuaXRUZXh0KVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcclxuXHJcbi8qKiBAdHlwZWRlZiB7XCJmbGFnXCJ8XCJwaWVjaGFydFwifFwicmluZ1wifFwic2VnbWVudFwifFwicmFkYXJcInxcImFnZXB5cmFtaWRcInxcImhhbGZ0b25lXCJ9IENvbXBvc2l0aW9uVHlwZSAqL1xyXG5cclxuLyoqXHJcbiAqIEEgc3R5bGUgc2hvd2luZyB0aGUgY29tcG9zaXRpb24gb2YgYSB0b3RhbCBpbiBkaWZmZXJlbnQgY2F0ZWdvcmllcywgd2l0aCBkaWZmZXJlbnQgY29sb3IgaHVlcy5cclxuICogSXQgY29uc2lzdHMgb2YgYSBzeW1ib2wgd2l0aCBkaWZmZXJlbnQgcGFydHMsIHdob3NlIHNpemUgcmVmbGVjdCB0aGUgcHJvcG9ydGlvbiBvZiB0aGUgY29ycmVzcG9uZGluZyBjYXRlZ29yeS5cclxuICogRm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgc3ltYm9scywgQHNlZSBDb21wb3NpdGlvblR5cGVcclxuICogVGhlIHN5bWJvbCBjYW4gYmUgc2NhbGVkIGRlcGVuZGluZyBvbiB0aGUgY2VsbCBpbXBvcnRhbmNlLlxyXG4gKlxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ29tcG9zaXRpb25TdHlsZSBleHRlbmRzIFN0eWxlIHtcclxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRpY3Rpb25hcnkgKHN0cmluZyAtPiBjb2xvcikgd2hpY2ggZ2l2ZSB0aGUgY29sb3Igb2YgZWFjaCBjYXRlZ29yeS5cclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0eXBlIG9mIGRlY29tcG9zaXRpb24gc3ltYm9sIG9mIGEgY2VsbCwgQHNlZSBDb21wb3NpdGlvblR5cGVcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsKTpDb21wb3NpdGlvblR5cGV9ICovXHJcbiAgICAgICAgdGhpcy50eXBlID0gb3B0cy50eXBlXHJcblxyXG4gICAgICAgIC8qKiBUaGUgY29sdW1uIHdoZXJlIHRvIGdldCB0aGUgc2l6ZSB2YWx1ZXMuXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnNpemVDb2wgPSBvcHRzLnNpemVDb2xcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIGEgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgKCh2LCByLCBzLCB6ZikgPT4gcilcclxuXHJcbiAgICAgICAgLyoqIEZvciBzdHlsZSB0eXBlcyB3aXRoIHN0cmlwZXMgKGZsYWcsIHNlZ21lbnQpLCB0aGUgb3JpZW50YXRpb24gb2YgdGhlIHN0cmlwZXMgKDAgZm9yIGhvcml6b250YWwsIG90aGVyIGZvciB2ZXJ0aWNhbCkuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5zdHJpcGVzT3JpZW50YXRpb24gPSBvcHRzLnN0cmlwZXNPcmllbnRhdGlvbiB8fCAoKCkgPT4gMCkgLy8oYyxyLHpmKSA9PiAuLi5cclxuXHJcbiAgICAgICAgLyoqIFRoZSBmdW5jdGlvbiBzcGVjaWZ5aW5nIGFuIG9mZnNldCBhbmdsZSBmb3IgYSByYWRhciwgaGFsZnRvbmUgb3IgcGllIGNoYXJ0IHN0eWxlLlxyXG4gICAgICAgICAqIFRoZSBhbmdsZSBpcyBzcGVjaWZpZWQgaW4gZGVncmVlLiBUaGUgcm90YXRpb24gaXMgYW50aS1jbG9ja3dpc2UuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5vZmZzZXRBbmdsZSA9IG9wdHMub2Zmc2V0QW5nbGUgfHwgKCgpID0+IDApIC8vKGNlbGwscix6ZikgPT4gLi4uXHJcblxyXG4gICAgICAgIC8qKiBUaGUgZnVuY3Rpb24gc3BlY2lmeWluZyB0aGUgaGVpZ2h0IG9mIHRoZSBhZ2UgcHlyYW1pZCwgaW4gZ2VvIHVuaXQuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5hZ2VQeXJhbWlkSGVpZ2h0ID0gb3B0cy5hZ2VQeXJhbWlkSGVpZ2h0IHx8ICgoYywgciwgemYpID0+IHIpIC8vKGNlbGwscix6ZikgPT4gLi4uXHJcblxyXG4gICAgICAgIC8qKiBGb3IgcGllIGNoYXJ0LCB0aGlzIGlzIHBhcmFtZXRlciBmb3IgaW50ZXJuYWwgcmFkaXVzLCBzbyB0aGF0IHRoZSBwaWUgY2hhcnQgbG9va3MgbGlrZSBhIGRvbnV0LlxyXG4gICAgICAgICAqIDAgZm9yIG5vcm1hbCBwaWUgY2hhcnRzLCAwLjUgdG8gZW1wdHkgaGFsZiBvZiB0aGUgcmFkaXVzLlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5waWVDaGFydEludGVybmFsUmFkaXVzRmFjdG9yID0gb3B0cy5waWVDaGFydEludGVybmFsUmFkaXVzRmFjdG9yIHx8IDBcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgY2VsbHMgYXMgc3F1YXJlcyBkZXBlbmRpbmcgb24gdGhlaXIgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL3pvb20gZmFjdG9yXHJcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXHJcblxyXG4gICAgICAgIGxldCBzdGF0XHJcbiAgICAgICAgaWYgKHRoaXMuc2l6ZUNvbCkge1xyXG4gICAgICAgICAgICAvL2lmIHNpemUgaXMgdXNlZCwgc29ydCBjZWxscyBieSBzaXplIHNvIHRoYXQgdGhlIGJpZ2dlc3QgYXJlIGRyYXduIGZpcnN0XHJcbiAgICAgICAgICAgIGNlbGxzLnNvcnQoKGMxLCBjMikgPT4gYzJbdGhpcy5zaXplQ29sXSAtIGMxW3RoaXMuc2l6ZUNvbF0pXHJcbiAgICAgICAgICAgIC8vYW5kIGNvbXB1dGUgc3RhdGlzdGljc1xyXG4gICAgICAgICAgICBzdGF0ID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5zaXplQ29sXSwgdHJ1ZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vbmIgY2F0ZWdvcmllcyAtIHVzZWQgZm9yIHJhZGFyIGFuZCBhZ2VweXJhbWlkXHJcbiAgICAgICAgY29uc3QgbmJDYXQgPSBPYmplY3QuZW50cmllcyh0aGlzLmNvbG9yKS5sZW5ndGhcclxuXHJcbiAgICAgICAgLy9kcmF3IGluIGdlbyBjb29yZGluYXRlc1xyXG4gICAgICAgIGNnLnNldENhbnZhc1RyYW5zZm9ybSgpXHJcblxyXG4gICAgICAgIC8vZHJhdyBjYWxsc1xyXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgLy9zaXplXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICAgICAgbGV0IHNfID0gdGhpcy5zaXplIHx8ICgoKSA9PiByKVxyXG4gICAgICAgICAgICAvL3NpemUgLSBpbiBnZW9cclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgICAgIGNvbnN0IHNHID0gc18oY2VsbFt0aGlzLnNpemVDb2xdLCByLCBzdGF0LCB6ZilcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxyXG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByLCB6ZilcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IHN5bWJvbCB0eXBlXHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGVfID0gdGhpcy50eXBlID8gdGhpcy50eXBlKGNlbGwpIDogJ2ZsYWcnXHJcblxyXG4gICAgICAgICAgICAvL2NvbXB1dGUgY2VudGVyIHBvc2l0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IHhjID0gY2VsbC54ICsgb2Zmc2V0LmR4ICsgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcgPyAwIDogciAqIDAuNSlcclxuICAgICAgICAgICAgY29uc3QgeWMgPSBjZWxsLnkgKyBvZmZzZXQuZHkgKyAodHlwZV8gPT09ICdhZ2VweXJhbWlkJyA/IDAgOiByICogMC41KVxyXG5cclxuICAgICAgICAgICAgLy9jb21wdXRlIG9mZnNldCBhbmdsZSwgd2hlbiByZWxldmFudFxyXG4gICAgICAgICAgICBjb25zdCBvZmZBbmcgPSB0aGlzLm9mZnNldEFuZ2xlID8gKHRoaXMub2Zmc2V0QW5nbGUoY2VsbCwgciwgemYpICogTWF0aC5QSSkgLyAxODAgOiAwXHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZV8gPT09ICdhZ2VweXJhbWlkJyB8fCB0eXBlXyA9PT0gJ3JhZGFyJyB8fCB0eXBlXyA9PT0gJ2hhbGZ0b25lJykge1xyXG4gICAgICAgICAgICAgICAgLy9nZXQgY2VsbCBjYXRlZ29yeSBtYXggdmFsdWVcclxuICAgICAgICAgICAgICAgIGxldCBtYXhWYWwgPSAtSW5maW5pdHlcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmNvbG9yKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSArY2VsbFtrZXldXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgPiBtYXhWYWwpIG1heFZhbCA9IHZcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL2N1bXVsXHJcbiAgICAgICAgICAgICAgICBsZXQgY3VtdWwgPSAwXHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZV8gPT09ICdhZ2VweXJhbWlkJyAmJiB0aGlzLmFnZVB5cmFtaWRIZWlnaHQpXHJcbiAgICAgICAgICAgICAgICAgICAgY3VtdWwgPSAociAtIHRoaXMuYWdlUHlyYW1pZEhlaWdodChjZWxsLCByLCB6ZikpIC8gMlxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVfID09PSAncmFkYXInIHx8IHR5cGVfID09PSAnaGFsZnRvbmUnKSBjdW11bCA9IE1hdGguUEkgLyAyICsgb2ZmQW5nXHJcblxyXG4gICAgICAgICAgICAgICAgLy9jb21wdXRlIHRoZSBpbmNyZW1lbnQsIHdoaWNoIGlzIHRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgdGhlIGN1bXVsIGZvciBlYWNoIGNhdGVnb3J5XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmNyID1cclxuICAgICAgICAgICAgICAgICAgICB0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKHRoaXMuYWdlUHlyYW1pZEhlaWdodCA/IHRoaXMuYWdlUHlyYW1pZEhlaWdodChjZWxsLCByLCB6ZikgOiByKSAvIG5iQ2F0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdHlwZV8gPT09ICdyYWRhcicgfHwgdHlwZV8gPT09ICdoYWxmdG9uZSdcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyAoMiAqIE1hdGguUEkpIC8gbmJDYXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgIGlmIChpbmNyID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzeW1ib2wgdHlwZTonICsgdHlwZV8pXHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgW2NvbHVtbiwgY29sb3JdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY29sb3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9zZXQgY2F0ZWdvcnkgY29sb3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxTdHlsZSA9IGNvbG9yXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2dldCBjYXRlZ29yeSB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjZWxsW2NvbHVtbl1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29tcHV0ZSBjYXRlZ29yeSBsZW5ndGggLSBpbiBnZW9cclxuICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdHID0gKHNHICogdmFsKSAvIG1heFZhbFxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGJhclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFJlY3QoeGMgKyAociAtIHdHKSAvIDIsIHljICsgY3VtdWwsIHdHLCBpbmNyKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXh0IGhlaWdodFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdW11bCArPSBpbmNyXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ3JhZGFyJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3NldCBjYXRlZ29yeSBjb2xvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gY29sb3JcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IGNhdGVncm95IHZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNlbGxbY29sdW1uXVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb21wdXRlIGNhdGVnb3J5IHJhZGl1cyAtIGluIGdlb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zdCByRyA9IHRoaXMucmFkaXVzKHZhbCwgciwgc3RhdCwgY2VsbFN0YXQsIHpmKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByRyA9IChzRyAvIDIpICogTWF0aC5zcXJ0KHZhbCAvIG1heFZhbClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBhbmd1bGFyIHNlY3RvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyh4YywgeWMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5hcmMoeGMsIHljLCByRywgY3VtdWwgLSBpbmNyLCBjdW11bClcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyh4YywgeWMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbmV4dCBhbmd1bGFyIHNlY3RvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdW11bCArPSBpbmNyXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ2hhbGZ0b25lJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3NldCBjYXRlZ29yeSBjb2xvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gY29sb3JcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IGNhdGVncm95IHZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNlbGxbY29sdW1uXVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb21wdXRlIGNhdGVnb3J5IHJhZGl1cyAtIGluIGdlb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgckcgPSBzRyAqIDAuMzMzICogTWF0aC5zcXJ0KHZhbCAvIG1heFZhbClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBjaXJjbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5hcmMoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4YyArIHIgKiAwLjI1ICogTWF0aC5jb3MoY3VtdWwpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeWMgKyByICogMC4yNSAqIE1hdGguc2luKGN1bXVsKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJHLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBNYXRoLlBJXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGwoKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXh0IGFuZ3VsYXIgc2VjdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsICs9IGluY3JcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc3ltYm9sIHR5cGU6JyArIHR5cGVfKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vY29tcHV0ZSB0b3RhbFxyXG4gICAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMFxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY29sdW1uIG9mIE9iamVjdC5rZXlzKHRoaXMuY29sb3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9ICtjZWxsW2NvbHVtbl1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXYpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCF0b3RhbCB8fCBpc05hTih0b3RhbCkpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAgICAgLy9kcmF3IGRlY29tcG9zaXRpb24gc3ltYm9sXHJcbiAgICAgICAgICAgICAgICBsZXQgY3VtdWwgPSAwXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkID0gciAqICgxIC0gc0cgLyByKSAqIDAuNVxyXG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpID0gdGhpcy5zdHJpcGVzT3JpZW50YXRpb24oY2VsbCwgciwgemYpXHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgW2NvbHVtbiwgY29sb3JdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY29sb3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9nZXQgc2hhcmVcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZSA9IGNlbGxbY29sdW1uXSAvIHRvdGFsXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaGFyZSB8fCBpc05hTihzaGFyZSkpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vc2V0IGNvbG9yXHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxTdHlsZSA9IGNvbG9yXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vZHJhdyBzeW1ib2wgcGFydFxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlXyA9PT0gJ2ZsYWcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBmbGFnIHN0cmlwZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaG9yaXpvbnRhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIGQgKyBvZmZzZXQuZHgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC55ICsgZCArIGN1bXVsICogc0cgKyBvZmZzZXQuZHksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0csXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmUgKiBzR1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92ZXJ0aWNhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIGQgKyBjdW11bCAqIHNHICsgb2Zmc2V0LmR4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueSArIGQgKyBvZmZzZXQuZHksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmUgKiBzRyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzR1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ3BpZWNoYXJ0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgcGllIGNoYXJ0IGFuZ3VsYXIgc2VjdG9yXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgYW5nbGVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGExID0gY3VtdWwgKiAyICogTWF0aC5QSVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhMiA9IChjdW11bCArIHNoYXJlKSAqIDIgKiBNYXRoLlBJXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXdcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oeGMsIHljKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguYXJjKHhjLCB5Yywgc0cgKiAwLjUsIGExICsgb2ZmQW5nLCBhMiArIG9mZkFuZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGllQ2hhcnRJbnRlcm5hbFJhZGl1c0ZhY3RvcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNnLmN0eC5hcmMoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0cgKiAwLjUgKiB0aGlzLnBpZUNoYXJ0SW50ZXJuYWxSYWRpdXNGYWN0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTEgKyBvZmZBbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTIgKyBvZmZBbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguY2xvc2VQYXRoKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGwoKVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZV8gPT09ICdyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgcmluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmFyYyh4YywgeWMsIE1hdGguc3FydCgxIC0gY3VtdWwpICogc0cgKiAwLjUsIDAsIDIgKiBNYXRoLlBJKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZy5jdHguZmlsbCgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ3NlZ21lbnQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IHNlY3Rpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdHID0gKHNHICogc0cpIC8gclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaG9yaXpvbnRhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIG9mZnNldC5keCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnkgKyAociAtIHdHKSAvIDIgKyBjdW11bCAqIHdHICsgb2Zmc2V0LmR5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmUgKiB3R1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92ZXJ0aWNhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIGN1bXVsICogciArIG9mZnNldC5keCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnkgKyAociAtIHdHKSAvIDIgKyBvZmZzZXQuZHksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmUgKiByLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdHXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc3ltYm9sIHR5cGU6JyArIHR5cGVfKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY3VtdWwgKz0gc2hhcmVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByOiByLCB6ZjogemYsIHNTaXplOiBzdGF0IH0pXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTaWRlU3R5bGUgfSBmcm9tICcuL1NpZGVTdHlsZS5qcydcclxuXHJcbi8qKiBAdHlwZWRlZiB7e3g6bnVtYmVyLHk6bnVtYmVyLG9yOlwidlwifFwiaFwiLHZhbHVlOm51bWJlcn19IFNpZGUgKi9cclxuXHJcbi8qKlxyXG4gKlxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ29udG91clN0eWxlIGV4dGVuZHMgU2lkZVN0eWxlIHtcclxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgLy9vcHRzLmludGVydmFsID0gb3B0cy5pbnRlcnZhbCB8fCAxMDBcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cclxuICAgICAgICBvcHRzLmJyZWFrcyA9IG9wdHMuYnJlYWtzIHx8IFsxMDAsIDEwMDAsIDEwMDAwLCAxMDAwMDAsIDEwMDAwMDBdXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24oU2lkZSxudW1iZXIsbnVtYmVyKTpzdHJpbmd9ICovXHJcbiAgICAgICAgb3B0cy53aWR0aCA9IG9wdHMud2lkdGggfHwgKCgpID0+IDEpIC8vKHMsIHIsIHpmKSA9PiAuLi5cclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihTaWRlLG51bWJlcixudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICBvcHRzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJyNFN0E5MzUnKSAvLyhzLCByLCB6ZikgPT4gLi4uXHJcblxyXG4gICAgICAgIC8vb3ZlcnJpZGUgbWV0aG9kIGZvciBjb250b3VyIGRyYXdpbmdcclxuXHJcbiAgICAgICAgY29uc3QgZ2V0Q2xhc3MgPSBmdW5jdGlvbiAodikge1xyXG4gICAgICAgICAgICBpZiAodiA9PSB1bmRlZmluZWQpIHJldHVybiAwXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0cy5icmVha3MubGVuZ3RoOyBpKyspIGlmICh2IDwgb3B0cy5icmVha3NbaV0pIHJldHVybiBpXHJcbiAgICAgICAgICAgIHJldHVybiBvcHRzLmJyZWFrcy5sZW5ndGhcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudmFsdWUgPSAodjEsIHYyLCByLCBzLCB6ZikgPT4ge1xyXG4gICAgICAgICAgICAvL2lmICghdjEgfHwgIXYyKSByZXR1cm4gMFxyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMoZ2V0Q2xhc3ModjIpIC0gZ2V0Q2xhc3ModjEpKVxyXG5cclxuICAgICAgICAgICAgLy9jaGVjayBpZiB2MSAtIHYyIGNyb3NzIGEgY29udG91ciBsaW5lXHJcbiAgICAgICAgICAgIC8vY29uc3QgcjEgPSBNYXRoLmZsb29yKHYxIC8gb3B0cy5pbnRlcnZhbCk7XHJcbiAgICAgICAgICAgIC8vY29uc3QgcjIgPSBNYXRoLmZsb29yKHYyIC8gb3B0cy5pbnRlcnZhbCk7XHJcbiAgICAgICAgICAgIC8vcmV0dXJuIE1hdGguYWJzKHIyIC0gcjEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9zYW1lIGNvbG9yIGZvciBhbGxcclxuICAgICAgICB0aGlzLmNvbG9yID0gKHNpZGUsIHIsIHMsIHpmKSA9PiAoc2lkZS52YWx1ZSA/IG9wdHMuY29sb3Ioc2lkZSwgciwgemYpIDogdW5kZWZpbmVkKVxyXG5cclxuICAgICAgICAvL3dpZHRoOiBtdWx0aXBsZSBvZlxyXG4gICAgICAgIHRoaXMud2lkdGggPSAoc2lkZSwgciwgcywgemYpID0+IHNpZGUudmFsdWUgKiB6ZiAqIG9wdHMud2lkdGgoc2lkZSwgciwgemYpXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL1N0eWxlLmpzJ1xyXG5pbXBvcnQgeyByYW5kb21Ob3JtYWwgfSBmcm9tICdkMy1yYW5kb20nXHJcbmltcG9ydCB7IGNoZWNrV2ViR0xTdXBwb3J0LCBtYWtlV2ViR0xDYW52YXMgfSBmcm9tICcuLi91dGlscy93ZWJHTFV0aWxzLmpzJ1xyXG5pbXBvcnQgeyBXZWJHTFNxdWFyZUNvbG9yaW5nIH0gZnJvbSAnLi4vdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZy5qcydcclxuaW1wb3J0IHsgY29sb3IgfSBmcm9tICdkMy1jb2xvcidcclxuaW1wb3J0IHsgbW9uaXRvciwgbW9uaXRvckR1cmF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvVXRpbHMuanMnXHJcblxyXG4vKipcclxuICpcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIERvdERlbnNpdHlTdHlsZSBleHRlbmRzIFN0eWxlIHtcclxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciBkb3QgbnVtYmVyLlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5uYkNvbCA9IG9wdHMubmJDb2xcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBudW1iZXIgb2YgZG90cyBmb3IgYSBjZWxsIHZhbHVlLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXQsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5uYiA9IG9wdHMubmIgfHwgKCh2LCByLCBzLCB6ZikgPT4gKCgoMC4zICogciAqIHIpIC8gKHpmICogemYpKSAqIHYpIC8gcy5tYXgpXHJcblxyXG4gICAgICAgIC8qKiBUaGUgY29sb3Igb2YgdGhlIGRvdHMuIFNhbWUgY29sb3IgZm9yIGFsbCBkb3RzIHdpdGhpbiBhIGNlbGwuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCk6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI0ZGNTczMycpXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiB0aGUgZG90cywgaW4gZ2VvIHVuaXQuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmRvdFNpemUgPSBvcHRzLmRvdFNpemUgLy98fCAoKHIsIHpmKSA9PiAuLi5cclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaWdtYSBvZiB0aGUgZGlzdHJpYnV0aW9uIGZyb20gdGhlIHJlc29sdXRpb24sIGluIGdlbyB1bml0LlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5zaWdtYSA9IG9wdHMuc2lnbWEgLy98fCAoKHIsemYpID0+IC4uLlxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyBjZWxscyBhcyB0ZXh0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gclxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBjZ1xyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCByLCBjZykge1xyXG4gICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyoqKiBEb3REZW5zaXR5U3R5bGUgZHJhdycpXHJcblxyXG4gICAgICAgIC8vZmlsdGVyXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcclxuXHJcbiAgICAgICAgLy96b29tIGZhY3RvclxyXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxyXG5cclxuICAgICAgICBsZXQgc3RhdFxyXG4gICAgICAgIGlmICh0aGlzLm5iQ29sKSBzdGF0ID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5uYkNvbF0sIHRydWUpXHJcbiAgICAgICAgaWYgKCFzdGF0KSByZXR1cm5cclxuXHJcbiAgICAgICAgLy9zaXplIG9mIHRoZSBkb3RzXHJcbiAgICAgICAgY29uc3Qgc0dlbyA9IHRoaXMuZG90U2l6ZSA/IHRoaXMuZG90U2l6ZShyLCB6ZikgOiAyICogemZcclxuXHJcbiAgICAgICAgLy9tYWtlIHJhbmRvbSBmdW5jdGlvblxyXG4gICAgICAgIGNvbnN0IHNpZyA9IHRoaXMuc2lnbWEgPyB0aGlzLnNpZ21hKHIsIHpmKSA6IHIgKiAwLjRcclxuICAgICAgICBjb25zdCByYW5kID0gcmFuZG9tTm9ybWFsKDAsIHNpZylcclxuXHJcbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignIHByZXBhcmF0aW9uJylcclxuXHJcbiAgICAgICAgaWYgKGNoZWNrV2ViR0xTdXBwb3J0KCkpIHtcclxuICAgICAgICAgICAgLy9jcmVhdGUgY2FudmFzIGFuZCB3ZWJnbCByZW5kZXJlclxyXG4gICAgICAgICAgICBjb25zdCBjdldHTCA9IG1ha2VXZWJHTENhbnZhcyhjZy53ICsgJycsIGNnLmggKyAnJylcclxuICAgICAgICAgICAgaWYgKCFjdldHTCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gd2ViR0wnKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vY3JlYXRlIHdlYkdMIHByb2dyYW1cclxuICAgICAgICAgICAgY29uc3QgcHJvZyA9IG5ldyBXZWJHTFNxdWFyZUNvbG9yaW5nKGN2V0dMLmdsLCBzR2VvIC8gemYpXHJcblxyXG4gICAgICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcgd2ViZ2wgY3JlYXRpb24nKVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcjIgPSByIC8gMlxyXG5cclxuICAgICAgICAgICAgbGV0IGNvbCwgb2Zmc2V0LCBuYiwgY3gsIGN5LCBjY1xyXG4gICAgICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgICAgICAvL2dldCBjb2xvclxyXG4gICAgICAgICAgICAgICAgY29sID0gdGhpcy5jb2xvcihjKVxyXG4gICAgICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XHJcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSB0aGlzLm9mZnNldChjLCByLCB6ZilcclxuXHJcbiAgICAgICAgICAgICAgICAvL251bWJlciBvZiBkb3RzXHJcbiAgICAgICAgICAgICAgICBuYiA9IHRoaXMubmIoY1t0aGlzLm5iQ29sXSwgciwgc3RhdCwgemYpXHJcblxyXG4gICAgICAgICAgICAgICAgLy9jZWxsIGNlbnRlclxyXG4gICAgICAgICAgICAgICAgY3ggPSBjLnggKyBvZmZzZXQuZHggKyByMlxyXG4gICAgICAgICAgICAgICAgY3kgPSBjLnkgKyBvZmZzZXQuZHkgKyByMlxyXG5cclxuICAgICAgICAgICAgICAgIC8vY29udmVydCBjb2xvclxyXG4gICAgICAgICAgICAgICAgY2MgPSBjb2xvcihjb2wpXHJcbiAgICAgICAgICAgICAgICBpZiAoIWNjKSByZXR1cm5cclxuXHJcbiAgICAgICAgICAgICAgICAvL3JhbmRvbSBwb2ludHNcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IG5iOyBpKyspXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZy5hZGRQb2ludERhdGEyKGN4ICsgcmFuZCgpLCBjeSArIHJhbmQoKSwgY2MuciwgY2MuZywgY2MuYiwgY2Mub3BhY2l0eSlcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignIGRhdGEgcHJlcGFyYXRpb24nKVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3XHJcbiAgICAgICAgICAgIHByb2cuZHJhdyhjZy5nZXRXZWJHTFRyYW5zZm9ybSgpKVxyXG5cclxuICAgICAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignIHdlYmdsIGRyYXdpbmcnKVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGluIGNhbnZhcyBnZW9cclxuICAgICAgICAgICAgY2cuaW5pdENhbnZhc1RyYW5zZm9ybSgpXHJcbiAgICAgICAgICAgIGNnLmN0eC5kcmF3SW1hZ2UoY3ZXR0wuY2FudmFzLCAwLCAwKVxyXG5cclxuICAgICAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignIGNhbnZhcyBkcmF3aW5nJylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvL2RyYXcgd2l0aCBIVE1MIGNhbnZhc1xyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGluIGdlbyBjb29yZGluYXRlc1xyXG4gICAgICAgICAgICBjZy5zZXRDYW52YXNUcmFuc2Zvcm0oKVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xyXG4gICAgICAgICAgICAgICAgLy9nZXQgY29sb3JcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IoYylcclxuICAgICAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgLy9zZXQgY29sb3JcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsU3R5bGUgPSBjb2xcclxuXHJcbiAgICAgICAgICAgICAgICAvL2dldCBvZmZzZXRcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGMsIHIsIHpmKVxyXG5cclxuICAgICAgICAgICAgICAgIC8vbnVtYmVyIG9mIGRvdHNcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5iID0gdGhpcy5uYihjW3RoaXMubmJDb2xdLCByLCBzdGF0LCB6ZilcclxuXHJcbiAgICAgICAgICAgICAgICAvL2RyYXcgcmFuZG9tIGRvdHNcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN4ID0gYy54ICsgb2Zmc2V0LmR4ICsgciAvIDIsXHJcbiAgICAgICAgICAgICAgICAgICAgY3kgPSBjLnkgKyBvZmZzZXQuZHkgKyByIC8gMlxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbmI7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsUmVjdChjeCArIHJhbmQoKSwgY3kgKyByYW5kKCksIHNHZW8sIHNHZW8pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcclxuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcjogciwgemY6IHpmIH0pXHJcblxyXG4gICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyoqKiBEb3REZW5zaXR5U3R5bGUgZW5kIGRyYXcnKVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcclxuXHJcbi8qKlxyXG4gKlxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgSm95UGxvdFN0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogVGhlIGNlbGwgY29sdW1uIHdoZXJlIHRvIGdldCB0aGUgdmFsdWUgdG8gcmVwcmVzZW50LlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5oZWlnaHRDb2wgPSBvcHRzLmhlaWdodENvbFxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGhlaWdodCBvZiBhIGNlbGwuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAoKHYpID0+IE1hdGguc3FydCh2KSlcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcix7bWluOm51bWJlciwgbWF4Om51bWJlcn0sbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMubGluZUNvbG9yID0gb3B0cy5saW5lQ29sb3IgfHwgKCh5LCB5cywgciwgemYpID0+ICcjQkJCJylcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLHttaW46bnVtYmVyLCBtYXg6bnVtYmVyfSxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5saW5lV2lkdGggPSBvcHRzLmxpbmVXaWR0aCB8fCAoKHksIHlzLCByLCB6ZikgPT4gemYpXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcix7bWluOm51bWJlciwgbWF4Om51bWJlcn0sbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuZmlsbENvbG9yID0gb3B0cy5maWxsQ29sb3IgfHwgKCh5LCB5cywgciwgemYpID0+ICcjYzA4YzU5NjgnKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyBjZWxscyBhcyBzcXVhcmVzIGRlcGVuZGluZyBvbiB0aGVpciB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2dcclxuICAgICAqICovXHJcbiAgICBkcmF3KGNlbGxzLCByLCBjZykge1xyXG4gICAgICAgIC8vZmlsdGVyXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcclxuXHJcbiAgICAgICAgY2cuY3R4LmxpbmVKb2luID0gJ3JvdW5kJ1xyXG5cclxuICAgICAgICAvL3pvb20gZmFjdG9yXHJcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXHJcblxyXG4gICAgICAgIC8vY29tcHV0ZSBzdGF0aXN0aWNzXHJcbiAgICAgICAgY29uc3Qgc3RhdCA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMuaGVpZ2h0Q29sXSwgdHJ1ZSlcclxuXHJcbiAgICAgICAgLy9pbmRleCBjZWxscyBieSB5IGFuZCB4XHJcbiAgICAgICAgLyoqICBAdHlwZSB7b2JqZWN0fSAqL1xyXG4gICAgICAgIGNvbnN0IGluZCA9IHt9XHJcbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgIGxldCByb3cgPSBpbmRbY2VsbC55XVxyXG4gICAgICAgICAgICBpZiAoIXJvdykge1xyXG4gICAgICAgICAgICAgICAgcm93ID0ge31cclxuICAgICAgICAgICAgICAgIGluZFtjZWxsLnldID0gcm93XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcm93W2NlbGwueF0gPSB0aGlzLmhlaWdodChjZWxsW3RoaXMuaGVpZ2h0Q29sXSwgciwgc3RhdCwgemYpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2NvbXB1dGUgZXh0ZW50XHJcbiAgICAgICAgY29uc3QgZSA9IGNnLmV4dEdlb1xyXG4gICAgICAgIGlmICghZSkgcmV0dXJuXHJcbiAgICAgICAgY29uc3QgeE1pbiA9IE1hdGguZmxvb3IoZS54TWluIC8gcikgKiByXHJcbiAgICAgICAgY29uc3QgeE1heCA9IE1hdGguZmxvb3IoZS54TWF4IC8gcikgKiByXHJcbiAgICAgICAgY29uc3QgeU1pbiA9IE1hdGguZmxvb3IoZS55TWluIC8gcikgKiByXHJcbiAgICAgICAgY29uc3QgeU1heCA9IE1hdGguZmxvb3IoZS55TWF4IC8gcikgKiByXHJcblxyXG4gICAgICAgIC8qKiAgQHR5cGUge3ttaW46bnVtYmVyLCBtYXg6bnVtYmVyfX0gKi9cclxuICAgICAgICBjb25zdCB5cyA9IHsgbWluOiB5TWluLCBtYXg6IHlNYXggfVxyXG5cclxuICAgICAgICAvL2RyYXcgaW4gZ2VvIGNvb3JkaW5hdGVzXHJcbiAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcclxuXHJcbiAgICAgICAgLy9kcmF3IGxpbmVzLCByb3cgYnkgcm93LCBzdGF0aW5nIGZyb20gdGhlIHRvcFxyXG4gICAgICAgIGZvciAobGV0IHkgPSB5TWF4OyB5ID49IHlNaW47IHkgLT0gcikge1xyXG4gICAgICAgICAgICAvL2dldCByb3dcclxuICAgICAgICAgICAgY29uc3Qgcm93ID0gaW5kW3ldXHJcblxyXG4gICAgICAgICAgICAvL25vIHJvd1xyXG4gICAgICAgICAgICBpZiAoIXJvdykgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vcGxhY2UgZmlyc3QgcG9pbnRcclxuICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oeE1pbiAtIHIgLyAyLCB5KVxyXG5cclxuICAgICAgICAgICAgLy9zdG9yZSB0aGUgcHJldmlvdXMgaGVpZ2h0XHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgbGV0IGhHX1xyXG5cclxuICAgICAgICAgICAgLy9nbyB0aHJvdWdoIHRoZSBsaW5lIGNlbGxzXHJcbiAgICAgICAgICAgIGZvciAobGV0IHggPSB4TWluOyB4IDw9IHhNYXg7IHggKz0gcikge1xyXG4gICAgICAgICAgICAgICAgLy9nZXQgY29sdW1uIHZhbHVlXHJcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICAgICAgICAgIGxldCBoRyA9IHJvd1t4XVxyXG4gICAgICAgICAgICAgICAgaWYgKCFoRykgaEcgPSAwXHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGhHIHx8IGhHXykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vZHJhdyBsaW5lIG9ubHkgd2hlbiBhdCBsZWFzdCBvbmUgb2YgYm90aCB2YWx1ZXMgaXMgbm9uLW51bGxcclxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gdGVzdCBiZXppZXJDdXJ2ZVRvXHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyh4ICsgciAvIDIsIHkgKyBoRylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9lbHNlIG1vdmUgdGhlIHBvaW50XHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyh4ICsgciAvIDIsIHkpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL3N0b3JlIHRoZSBwcmV2aW91cyB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgaEdfID0gaEdcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9sYXN0IHBvaW50XHJcbiAgICAgICAgICAgIGlmIChoR18pIGNnLmN0eC5saW5lVG8oeE1heCArIHIgLyAyLCB5KVxyXG5cclxuICAgICAgICAgICAgLy9kcmF3IGZpbGxcclxuICAgICAgICAgICAgY29uc3QgZmMgPSB0aGlzLmZpbGxDb2xvcih5LCB5cywgciwgemYpXHJcbiAgICAgICAgICAgIGlmIChmYyAmJiBmYyAhPSAnbm9uZScpIHtcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsU3R5bGUgPSBmY1xyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGwoKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2RyYXcgbGluZVxyXG4gICAgICAgICAgICBjb25zdCBsYyA9IHRoaXMubGluZUNvbG9yKHksIHlzLCByLCB6ZilcclxuICAgICAgICAgICAgY29uc3QgbHcgPSB0aGlzLmxpbmVXaWR0aCh5LCB5cywgciwgemYpXHJcbiAgICAgICAgICAgIGlmIChsYyAmJiBsYyAhPSAnbm9uZScgJiYgbHcgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSBsY1xyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IGx3XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXHJcbmltcG9ydCB7IGRlbnNpdHkyZCB9IGZyb20gJ2Zhc3Qta2RlJ1xyXG5cclxuLyoqXHJcbiAqIEEgc3R5bGUgcmVwcmVzZW50aW5nIHRoZSBjZWxsIGFzIGEgc21vb3RoZWQgbGF5ZXIsIHRvIHNtb290aGluZyBsb2NhbCB2YXJpYXRpb25zIGFuZCBzaG93IG1haW4gdHJlbmRzIGFjcm9zcyBzcGFjZS5cclxuICpcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEtlcm5lbFNtb290aGluZ1N0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLy8gaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL2QvNWRkMWNiNWU0ZDIxYzAyMVxyXG4gICAgLy8gaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0B1d2RhdGEvZmFzdC1rZGVcclxuICAgIC8vIGh0dHBzOi8vb2JzZXJ2YWJsZWhxLmNvbS9kLzMxMjdiNmQ4OWFkYTk1OWZcclxuICAgIC8vVE9ETyBodHRwczovL29ic2VydmFibGVocS5jb20vQHNhaGlsY2hpbm95L2FyZWFsLWludGVycG9sYXRpb24taWlpID9cclxuXHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgdmFsdWUgdG8gY29uc2lkZXIgZm9yIGVhY2ggY2VsbC4gVGhpcyBpcyB0aGUgdmFsdWUgdG8gYmUgc21vb3RoZWQuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCk6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBvcHRzLnZhbHVlXHJcblxyXG4gICAgICAgIC8qKiBUaGUgc21vb3RoaW5nIHBhcmFtZXRlciwgaW4gZ2VvIHVuaXQuIFRoZSBsYXJnZXIsIHRoZSBtb3JlIHNtb290aGVkLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyKTpudW1iZXJ9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zaWdtYSA9IG9wdHMuc2lnbWEgLy8gKHIsIHpmKT0+Li4uXHJcblxyXG4gICAgICAgIC8qKiBBIGZhY3RvciB0byBhZGp1c3QgdGhlIHNtb290aGVkIGdyaWQgcmVzb2x1dGlvbi5cclxuICAgICAgICAgKiBXaGVuIHNldCB0byAxLCB0aGUgc21vb3RoZWQgZ3JpZCBpcyBleGFjdGx5IHRoZSBzY3JlZW4gcmVzb2x1dGlvbi5cclxuICAgICAgICAgKiBTZXQgdG8gMiB0byBkZWdyYWRlIHRoZSByZXNvbHV0aW9uIHRvIGEgZmFjdG9yIDIuXHJcbiAgICAgICAgICogVGhlIGhpZ2hlciwgdGhlIG1vcmUgcGl4ZWxpc2VkIGFuZCB0aGUgZmFzdGVyIHRvIGNvbXB1dGUuXHJcbiAgICAgICAgICogQHR5cGUgeyBudW1iZXIgfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZmFjdG9yID0gb3B0cy5mYWN0b3IgfHwgMlxyXG5cclxuICAgICAgICAvKiogQSBmaWx0ZXIgZnVuY3Rpb24gdG8gZmlsdGVyIHRoZSBzbW9vdGhlZCBjZWxscyBiYXNlZCBvbiB0aGVpciBzbW9vdGhlZCB2YWx1ZS5cclxuICAgICAgICAgKiAgUmV0dXJuIHRydWUgdG8ga2VlcCB0aGUgY2VsbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAgICAgICAqIEB0eXBlIHsgZnVuY3Rpb24obnVtYmVyKTpib29sZWFuIH1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZpbHRlclNtID0gb3B0cy5maWx0ZXJTbVxyXG5cclxuICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB3aGVyZSB0aGUgc21vb3RoZWQgdmFsdWUgaXMgc3RvcmVkIGluIHRoZSBvdXRwdXQgc21vb3RoZWQgZ3JpZC5cclxuICAgICAgICAgKiBAdHlwZSB7IHN0cmluZyB9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zQ29sID0gb3B0cy5zQ29sIHx8ICdrc212YWwnXHJcblxyXG4gICAgICAgIC8qKiBUaGUgc3R5bGVzIHRvIHJlcHJlc2VudCB0aGUgc21vb3RoZWQgZ3JpZC5cclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPFN0eWxlPn1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnN0eWxlcyA9IG9wdHMuc3R5bGVzIHx8IFtdXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IHRoZSBzbW9vdGhlZCBjZWxscyBkZXBlbmRpbmcgb24gdGhlIGxpc3Qgb2Ygc3R5bGVzIHNwZWNpZmllZC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2dcclxuICAgICAqL1xyXG4gICAgZHJhdyhjZWxscywgciwgY2cpIHtcclxuICAgICAgICAvL2ZpbHRlclxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXHJcblxyXG4gICAgICAgIGlmICghY2VsbHMgfHwgY2VsbHMubGVuZ3RoID09IDApIHJldHVyblxyXG5cclxuICAgICAgICAvL2dldCBzbW9vdGhpbmcgcGFyYW0gaW4gZ2VvIHVuaXRcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICBjb25zdCBzRyA9IHRoaXMuc2lnbWEociwgY2cuemYpXHJcblxyXG4gICAgICAgIC8vY29tcHV0ZSBzbW9vdGhlZCBncmlkIGRpbWVuc2lvbnNcclxuICAgICAgICBjb25zdCBuYlggPSBNYXRoLmNlaWwoY2cudyAvIHRoaXMuZmFjdG9yKVxyXG4gICAgICAgIGNvbnN0IG5iWSA9IE1hdGguY2VpbChjZy5oIC8gdGhpcy5mYWN0b3IpXHJcbiAgICAgICAgLy9jb21wdXRlIHNtb290aGVkIGdyaWQgZ2VvIGV4dGVudFxyXG4gICAgICAgIGNvbnN0IGVfID0gW1xyXG4gICAgICAgICAgICBbY2cucGl4VG9HZW9YKDApLCBjZy5waXhUb0dlb1gobmJYICogdGhpcy5mYWN0b3IpXSxcclxuICAgICAgICAgICAgW2NnLnBpeFRvR2VvWShuYlkgKiB0aGlzLmZhY3RvciksIGNnLnBpeFRvR2VvWSgwKV0sXHJcbiAgICAgICAgXVxyXG5cclxuICAgICAgICAvL2NvbXB1dGUgc21vb3RoZWQgZ3JpZFxyXG4gICAgICAgIGxldCBnID0gZGVuc2l0eTJkKGNlbGxzLCB7XHJcbiAgICAgICAgICAgIHg6IChjKSA9PiBjLnggKyByIC8gMixcclxuICAgICAgICAgICAgeTogKGMpID0+IGMueSArIHIgLyAyLFxyXG4gICAgICAgICAgICB3ZWlnaHQ6IChjKSA9PiB0aGlzLnZhbHVlKGMpLFxyXG4gICAgICAgICAgICBiaW5zOiBbbmJYLCBuYlldLFxyXG4gICAgICAgICAgICBiYW5kd2lkdGg6IHNHLFxyXG4gICAgICAgICAgICBleHRlbnQ6IGVfLFxyXG4gICAgICAgIH0pLmdyaWQoKVxyXG5cclxuICAgICAgICAvL2NvbXB1dGUgdGhlIHJlc29sdXRpb24gb2YgdGhlIHNtb290aGVkIGdyaWRcclxuICAgICAgICBjb25zdCByZXNTbW9vdGhlZCA9IChlX1swXVsxXSAtIGVfWzBdWzBdKSAvIG5iWFxyXG5cclxuICAgICAgICAvL21ha2Ugc21vb3RoZWQgY2VsbHNcclxuICAgICAgICBjZWxscyA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaW5kID0gMDsgaW5kIDwgZy5sZW5ndGg7IGluZCsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHYgPSBnW2luZF1cclxuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyU20gJiYgIXRoaXMuZmlsdGVyU20odikpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IE1hdGguZmxvb3IoaW5kIC8gbmJYKVxyXG4gICAgICAgICAgICBjb25zdCBjb2wgPSBpbmQgJSBuYlhcclxuICAgICAgICAgICAgY29uc3QgYyA9IHsgeDogZV9bMF1bMF0gKyBjb2wgKiByZXNTbW9vdGhlZCwgeTogZV9bMV1bMF0gKyByb3cgKiByZXNTbW9vdGhlZCB9XHJcbiAgICAgICAgICAgIGNbdGhpcy5zQ29sXSA9IHZcclxuICAgICAgICAgICAgY2VsbHMucHVzaChjKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9kcmF3IHNtb290aGVkIGNlbGxzIGZyb20gc3R5bGVzXHJcbiAgICAgICAgZm9yIChsZXQgcyBvZiB0aGlzLnN0eWxlcykgcy5kcmF3KGNlbGxzLCByZXNTbW9vdGhlZCwgY2cpXHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcclxuICAgICAgICAvL2ZvciAobGV0IHMgb2YgdGhpcy5zdHlsZXMpXHJcbiAgICAgICAgLy8gICAgcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHMsIHI6IHIsIHpmOiBjZy5nZXRaZigpIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgVGFuYWthU3R5bGUgfSBmcm9tICcuL1RhbmFrYVN0eWxlLmpzJ1xyXG5pbXBvcnQgeyBTdHJva2VTdHlsZSB9IGZyb20gJy4vU3Ryb2tlU3R5bGUuanMnXHJcbmltcG9ydCB7IFNxdWFyZUNvbG9yQ2F0V0dMU3R5bGUgfSBmcm9tICcuL1NxdWFyZUNvbG9yQ2F0V0dMU3R5bGUuanMnXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXHJcblxyXG4vKipcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIExlZ29TdHlsZSB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXkuPFN0eWxlPn1cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGdldChjb2wsIG9wdHMpIHtcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvL3RoZSBjb2xvcnNcclxuICAgICAgICAvL2h0dHA6Ly93d3cuamVubnlzY3JheW9uY29sbGVjdGlvbi5jb20vMjAyMS8wNi9hbGwtY3VycmVudC1sZWdvLWNvbG9ycy5odG1sXHJcbiAgICAgICAgLy9odHRwczovL2xlb25hd2ljei5naXRodWIuaW8vbGVnb2NvbG9ycy9yZWZlcmVuY2UvZmlndXJlcy9SRUFETUUtcGxvdC0xLnBuZ1xyXG4gICAgICAgIG9wdHMuY29sb3JzID0gb3B0cy5jb2xvcnMgfHwgW1xyXG4gICAgICAgICAgICAnIzAwODUyYicsIC8vZGFya2VyIGdyZWVuXHJcbiAgICAgICAgICAgICcjYWZkMjQ2JywgLy9saWdodCBncmVlblxyXG4gICAgICAgICAgICAnI2ZhYzgwYScsIC8vZGFyayB5ZWxsb3dcclxuICAgICAgICAgICAgJyNiYjgwNWEnLCAvL2Jyb3duXHJcbiAgICAgICAgICAgICcjZDY3OTIzJywgLy9tb3N0YXJkXHJcbiAgICAgICAgICAgICcjY2I0ZTI5JywgLy9yZWRpc2hcclxuICAgICAgICAgICAgJyNiNDAwMDAnLCAvL3JlZFxyXG4gICAgICAgICAgICAnIzcyMDAxMicsIC8vZGFyayByZWRcclxuICAgICAgICAgICAgLy9cInB1cnBsZVwiLFxyXG4gICAgICAgICAgICAvL1wiI2VlZVwiIC8vd2hpdGhlXHJcbiAgICAgICAgXVxyXG5cclxuICAgICAgICBvcHRzLmNvbERhcmsgPSBvcHRzLmNvbERhcmsgfHwgJyMzMzMnXHJcbiAgICAgICAgb3B0cy5jb2xCcmlnaHQgPSBvcHRzLmNvbEJyaWdodCB8fCAnI2FhYSdcclxuICAgICAgICBvcHRzLndpZHRoRmFjdG9yID0gb3B0cy53aWR0aEZhY3RvciB8fCAwLjEyXHJcblxyXG4gICAgICAgIC8vcmV1c2UgdGFuYWthIGFzIGJhc2lzXHJcbiAgICAgICAgY29uc3QgdHMgPSBUYW5ha2FTdHlsZS5nZXQoY29sLCBvcHRzKVxyXG4gICAgICAgIC8vc3R5bGUgdG8gc2hvdyBsaW1pdHMgYmV0d2VlbiBwaWVjZXNcclxuICAgICAgICBjb25zdCBzc3QgPSBuZXcgU3Ryb2tlU3R5bGUoe1xyXG4gICAgICAgICAgICBzdHJva2VDb2xvcjogKCkgPT4gJyM2NjYnLFxyXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogKHYsIHIsIHMsIHopID0+IDAuMiAqIHosXHJcbiAgICAgICAgICAgIGZpbHRlcjogb3B0cy5maWx0ZXIsXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgdHNbMF0sXHJcbiAgICAgICAgICAgIHNzdCxcclxuICAgICAgICAgICAgdHNbMV0sXHJcbiAgICAgICAgICAgIG5ldyBMZWdvVG9wU3R5bGUoeyBjb2xEYXJrOiBvcHRzLmNvbERhcmssIGNvbEJyaWdodDogb3B0cy5jb2xCcmlnaHQsIGZpbHRlcjogb3B0cy5maWx0ZXIgfSksXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpOnN0cmluZ30gY29sXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gICAgICogQHJldHVybnMge0FycmF5LjxTdHlsZT59XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBnZXRDYXQoY29sLCBvcHRzKSB7XHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgb3B0cy5jb2xEYXJrID0gb3B0cy5jb2xEYXJrIHx8ICcjMzMzJ1xyXG4gICAgICAgIG9wdHMuY29sQnJpZ2h0ID0gb3B0cy5jb2xCcmlnaHQgfHwgJyNhYWEnXHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgY29uc3QgcyA9IG5ldyBTcXVhcmVDb2xvckNhdFdHTFN0eWxlKHsgY29sb3JDb2w6IGNvbCwgY29sb3I6IG9wdHMuY29sb3IgfSlcclxuICAgICAgICAvL3N0eWxlIHRvIHNob3cgbGltaXRzIGJldHdlZW4gcGllY2VzXHJcbiAgICAgICAgY29uc3Qgc3N0ID0gbmV3IFN0cm9rZVN0eWxlKHsgc3Ryb2tlQ29sb3I6ICgpID0+ICcjNjY2Jywgc3Ryb2tlV2lkdGg6ICh2LCByLCBzLCB6KSA9PiAwLjIgKiB6IH0pXHJcblxyXG4gICAgICAgIHJldHVybiBbcywgc3N0LCBuZXcgTGVnb1RvcFN0eWxlKHsgY29sRGFyazogb3B0cy5jb2xEYXJrLCBjb2xCcmlnaHQ6IG9wdHMuY29sQnJpZ2h0IH0pXVxyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogQSBzdHlsZSB0byBkcmF3IHRvcCBjaXJjbGUgb2YgbGVnbyBicmlja3MuXHJcbiAqL1xyXG5jbGFzcyBMZWdvVG9wU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R8dW5kZWZpbmVkfSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG4gICAgICAgIHRoaXMuY29sRGFyayA9IG9wdHMuY29sRGFyayB8fCAnIzMzMydcclxuICAgICAgICB0aGlzLmNvbEJyaWdodCA9IG9wdHMuY29sQnJpZ2h0IHx8ICcjYWFhJ1xyXG4gICAgfVxyXG5cclxuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICBjZy5jdHgubGluZVdpZHRoID0gMC42ICogY2cuZ2V0WmYoKVxyXG5cclxuICAgICAgICAvL2RhcmsgcGFydFxyXG4gICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sRGFya1xyXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgIGNnLmN0eC5hcmMoYy54ICsgciAqIDAuNSwgYy55ICsgciAqIDAuNSwgciAqIDAuNTUgKiAwLjUsIE1hdGguUEkgLyA0LCAtTWF0aC5QSSAqICgzIC8gNCksIHRydWUpXHJcbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9icmlnaHQgcGFydFxyXG4gICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sQnJpZ2h0XHJcbiAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xyXG4gICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgY2cuY3R4LmFyYyhjLnggKyByICogMC41LCBjLnkgKyByICogMC41LCByICogMC41NSAqIDAuNSwgTWF0aC5QSSAvIDQsIC1NYXRoLlBJICogKDMgLyA0KSwgZmFsc2UpXHJcbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXHJcblxyXG4vKipcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1vc2FpY1N0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGNvbHVtbi9hdHRyaWJ1dGUgb2YgdGhlIHRhYnVsYXIgZGF0YSB3aGVyZSB0byByZXRyaWV2ZSB0aGUgdmFyaWFibGUgZm9yIGNvbG9yLlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvckNvbCA9IG9wdHMuY29sb3JDb2xcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCk6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI0VBNkJBQycpXHJcblxyXG4gICAgICAgIC8qKiBUaGUgbW9zYWljIGZhY3Rvciwgd2l0aGluIFswLDAuNV0uIFNldCB0byAwIGZvciBubyBtb3NhaWMgZWZmZWN0LiBTZXQgdG8gMC41IGZvciBzdHJvbmcgbW9zYWljIGVmZmVjdC5cclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMubW9zYWljRmFjdG9yID0gb3B0cy5tb3NhaWNGYWN0b3IgfHwgMC4xNVxyXG5cclxuICAgICAgICAvKiogVGhlIG1vc2FpYyBzaGFkb3cgZmFjdG9yLCB3aXRoaW4gWzAsMC41XS4gU2V0IHRvIDAgZm9yIG5vIG1vc2FpYyBzaGFkb3cuIFNldCB0byAwLjUgZm9yIHN0cm9uZyBtb3NhaWMgc2hhZG93LlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5zaGFkb3dGYWN0b3IgPSBvcHRzLnNoYWRvd0ZhY3RvciB8fCAwLjJcclxuXHJcbiAgICAgICAgLyoqIFRoZSBtb3NhaWMgc2hhZG93IGNvbG9yLlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5zaGFkb3dDb2xvciA9IG9wdHMuc2hhZG93Q29sb3IgfHwgJyM1NTUnXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIHJlc29sdXRpb24sIGNnKSB7XHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL3pvb20gZmFjdG9yXHJcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXHJcblxyXG4gICAgICAgIGxldCBzdGF0Q29sb3JcclxuICAgICAgICBpZiAodGhpcy5jb2xvckNvbCkge1xyXG4gICAgICAgICAgICAvL2NvbXB1dGUgY29sb3IgdmFyaWFibGUgc3RhdGlzdGljc1xyXG4gICAgICAgICAgICBzdGF0Q29sb3IgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLmNvbG9yQ29sXSwgdHJ1ZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vc2V0IHN0cm9rZSBzdHlsZSwgZm9yIHNoYWRvd1xyXG4gICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuc2hhZG93Q29sb3JcclxuICAgICAgICBjZy5jdHgubGluZVdpZHRoID0gdGhpcy5zaGFkb3dGYWN0b3IgKiByZXNvbHV0aW9uXHJcbiAgICAgICAgY2cuY3R4LmxpbmVKb2luID0gJ3JvdW5kJ1xyXG4gICAgICAgIGNnLmN0eC5saW5lQ2FwID0gJ2J1dHQnXHJcblxyXG4gICAgICAgIC8vZnVuY3Rpb24gdG8gY29tcHV0ZSBwb3NpdGlvbiBtb3NhaWMgZWZmZWN0XHJcbiAgICAgICAgY29uc3QgZCA9IHJlc29sdXRpb24gKiB0aGlzLm1vc2FpY0ZhY3RvclxyXG4gICAgICAgIGNvbnN0IG1vc2FpYyA9ICgpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgeDogTWF0aC5yYW5kb20oKSAqIGQsIHk6IE1hdGgucmFuZG9tKCkgKiBkIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vZHJhdyB3aXRoIEhUTUwgY2FudmFzIGluIGdlbyBjb29yZGluYXRlc1xyXG4gICAgICAgIGNnLnNldENhbnZhc1RyYW5zZm9ybSgpXHJcblxyXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgLy9zZXQgZmlsbCBjb2xvclxyXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsW3RoaXMuY29sb3JDb2xdLCByZXNvbHV0aW9uLCBzdGF0Q29sb3IpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxyXG4gICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gY29sXHJcblxyXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcclxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgcmVzb2x1dGlvbiwgemYpXHJcblxyXG4gICAgICAgICAgICAvL2NvbXB1dGUgcG9zaXRpb24gbW9zYWljIGVmZmVjdFxyXG4gICAgICAgICAgICBjb25zdCBsbCA9IG1vc2FpYygpLFxyXG4gICAgICAgICAgICAgICAgdWwgPSBtb3NhaWMoKSxcclxuICAgICAgICAgICAgICAgIGxyID0gbW9zYWljKCksXHJcbiAgICAgICAgICAgICAgICB1ciA9IG1vc2FpYygpXHJcblxyXG4gICAgICAgICAgICAvL3N0cm9rZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5zaGFkb3dGYWN0b3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgbGwueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgbGwueSlcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAtIGxyLngsIGNlbGwueSArIG9mZnNldC5keSArIGxyLnkpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGNlbGwueCArIG9mZnNldC5keCArIHJlc29sdXRpb24gLSB1ci54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyByZXNvbHV0aW9uIC0gdXIueSlcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2ZpbGxcclxuXHJcbiAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICBjZy5jdHgubW92ZVRvKGNlbGwueCArIG9mZnNldC5keCArIGxsLngsIGNlbGwueSArIG9mZnNldC5keSArIGxsLnkpXHJcbiAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAtIGxyLngsIGNlbGwueSArIG9mZnNldC5keSArIGxyLnkpXHJcbiAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAtIHVyLngsIGNlbGwueSArIG9mZnNldC5keSArIHJlc29sdXRpb24gLSB1ci55KVxyXG4gICAgICAgICAgICBjZy5jdHgubGluZVRvKGNlbGwueCArIG9mZnNldC5keCArIHVsLngsIGNlbGwueSArIG9mZnNldC5keSArIHJlc29sdXRpb24gLSB1bC55KVxyXG4gICAgICAgICAgICBjZy5jdHguZmlsbCgpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHI6IHJlc29sdXRpb24sIHpmOiB6Ziwgc0NvbG9yOiBzdGF0Q29sb3IgfSlcclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXHJcblxyXG4vKipcclxuICpcclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE5pbmphU3RhclN0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGNvbHVtbi9hdHRyaWJ1dGUgb2YgdGhlIHRhYnVsYXIgZGF0YSB3aGVyZSB0byByZXRyaWV2ZSB0aGUgdmFyaWFibGUgZm9yIGNvbG9yLlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvckNvbCA9IG9wdHMuY29sb3JDb2xcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJyNFQTZCQUMnKSAvLyh2LHIscyx6ZikgPT4ge31cclxuXHJcbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciBzaXplLlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5zaXplQ29sID0gb3B0cy5zaXplQ29sXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiBhIGNlbGwsIHdpdGhpbiBbMCwxXTpcclxuICAgICAgICAgKiAgLSAwLCBub3RoaW5nIHNob3duXHJcbiAgICAgICAgICogIC0gMSwgZW50aXJlIHNxdWFyZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZVxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNoYXBlLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGwpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKCkgPT4gJ28nKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gclxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBjZ1xyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCByLCBjZykge1xyXG4gICAgICAgIC8vZmlsdGVyXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcclxuXHJcbiAgICAgICAgLy96b29tIGZhY3RvclxyXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxyXG5cclxuICAgICAgICBsZXQgc3RhdFNpemVcclxuICAgICAgICBpZiAodGhpcy5zaXplQ29sKSB7XHJcbiAgICAgICAgICAgIC8vaWYgc2l6ZSBpcyB1c2VkLCBzb3J0IGNlbGxzIGJ5IHNpemUgc28gdGhhdCB0aGUgYmlnZ2VzdCBhcmUgZHJhd24gZmlyc3RcclxuICAgICAgICAgICAgY2VsbHMuc29ydCgoYzEsIGMyKSA9PiBjMlt0aGlzLnNpemVDb2xdIC0gYzFbdGhpcy5zaXplQ29sXSlcclxuICAgICAgICAgICAgLy9hbmQgY29tcHV0ZSBzaXplIHZhcmlhYmxlIHN0YXRpc3RpY3NcclxuICAgICAgICAgICAgc3RhdFNpemUgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLnNpemVDb2xdLCB0cnVlKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHN0YXRDb2xvclxyXG4gICAgICAgIGlmICh0aGlzLmNvbG9yQ29sKSB7XHJcbiAgICAgICAgICAgIC8vY29tcHV0ZSBjb2xvciB2YXJpYWJsZSBzdGF0aXN0aWNzXHJcbiAgICAgICAgICAgIHN0YXRDb2xvciA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMuY29sb3JDb2xdLCB0cnVlKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9kcmF3IHdpdGggSFRNTCBjYW52YXNcclxuICAgICAgICAvL2luIGdlbyBjb29yZGluYXRlc1xyXG4gICAgICAgIGNnLnNldENhbnZhc1RyYW5zZm9ybSgpXHJcblxyXG4gICAgICAgIGNvbnN0IHIyID0gciAqIDAuNVxyXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgLy9jb2xvclxyXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsW3RoaXMuY29sb3JDb2xdLCByLCBzdGF0Q29sb3IsIHpmKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcclxuICAgICAgICAgICAgY2cuY3R4LmZpbGxTdHlsZSA9IGNvbFxyXG5cclxuICAgICAgICAgICAgLy9zaGFwZVxyXG4gICAgICAgICAgICBjb25zdCBzaGFwZSA9IHRoaXMuc2hhcGUgPyB0aGlzLnNoYXBlKGNlbGwpIDogJ28nXHJcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ25vbmUnKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy9zaXplXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICAgICAgbGV0IHNfID0gdGhpcy5zaXplIHx8ICgoKSA9PiAwLjUpXHJcbiAgICAgICAgICAgIC8vc2l6ZSAtIGluIGdlbyB1bml0XHJcbiAgICAgICAgICAgIGNvbnN0IHNHMiA9IHNfKGNlbGxbdGhpcy5zaXplQ29sXSwgciwgc3RhdFNpemUsIHpmKSAqIHIyXHJcblxyXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcclxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgciwgemYpXHJcblxyXG4gICAgICAgICAgICAvL2NlbnRlciBwb3NpdGlvblxyXG4gICAgICAgICAgICBjb25zdCBjeCA9IGNlbGwueCArIHIyXHJcbiAgICAgICAgICAgIGNvbnN0IGN5ID0gY2VsbC55ICsgcjJcclxuXHJcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ3AnKSB7XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY3gsIGN5ICsgcjIpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4ICsgc0cyLCBjeSArIHNHMilcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3ggKyByMiwgY3kpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4ICsgc0cyLCBjeSAtIHNHMilcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3gsIGN5IC0gcjIpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4IC0gc0cyLCBjeSAtIHNHMilcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3ggLSByMiwgY3kpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4IC0gc0cyLCBjeSArIHNHMilcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKClcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ28nKSB7XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY3gsIGN5ICsgc0cyKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCArIHIyLCBjeSArIHIyKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCArIHNHMiwgY3kpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4ICsgcjIsIGN5IC0gcjIpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4LCBjeSAtIHNHMilcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3ggLSByMiwgY3kgLSByMilcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3ggLSBzRzIsIGN5KVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCAtIHIyLCBjeSArIHIyKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGwoKVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyBzaGFwZSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByOiByLCB6ZjogemYsIHNTaXplOiBzdGF0U2l6ZSwgc0NvbG9yOiBzdGF0Q29sb3IgfSlcclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXHJcblxyXG4vKipcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFBpbGxhclN0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLy9UT0RPIG1ha2UgYSB3ZWJHTCB2ZXJzaW9uID9cclxuXHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0Q29sID0gb3B0cy5oZWlnaHRDb2xcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBoZWlnaHQgb2YgdGhlIGxpbmUgcmVwcmVzZW50aW5nIGEgY2VsbCwgaW4gZ2VvIHVuaXRcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0XHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3JDb2wgPSBvcHRzLmNvbG9yQ29sXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGxpbmUgcmVwcmVzZW50aW5nIGEgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCk6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI2MwOGM1OScpIC8vYmJcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy53aWR0aENvbCA9IG9wdHMud2lkdGhDb2xcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiB0aGUgbGluZSByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgodiwgcikgPT4gMC41ICogcilcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xyXG4gICAgICAgIHRoaXMuc2ltcGxlID0gb3B0cy5zaW1wbGUgIT0gdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMudmlld0hlaWdodEZhY3RvciA9IG9wdHMudmlld0hlaWdodEZhY3RvciB8fCAxLjVcclxuICAgICAgICAvLzAsMCBpcyB0aGUgY2VudGVyXHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy52aWV3U1ggPSBvcHRzLnZpZXdTWCA9PSB1bmRlZmluZWQgPyAwIDogb3B0cy52aWV3U1hcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnZpZXdTWSA9IG9wdHMudmlld1NZID09IHVuZGVmaW5lZCA/IC0wLjUgOiBvcHRzLnZpZXdTWVxyXG5cclxuICAgICAgICAvL1RPRE8gcmVwbGFjZSB3aXRoIHN1biBsb2NhdGlvbiA/XHJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5zaGFkb3dEaXJlY3Rpb24gPVxyXG4gICAgICAgICAgICBvcHRzLnNoYWRvd0RpcmVjdGlvbiA9PSB1bmRlZmluZWQgPyAoLTQwLjMgKiBNYXRoLlBJKSAvIDE4MC4wIDogb3B0cy5zaGFkb3dEaXJlY3Rpb25cclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnNoYWRvd0ZhY3RvciA9IG9wdHMuc2hhZG93RmFjdG9yIHx8IDAuM1xyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuc2hhZG93Q29sb3IgPSBvcHRzLnNoYWRvd0NvbG9yIHx8ICcjMDAwMDAwMzMnXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMub3V0bGluZUNvbCA9IG9wdHMub3V0bGluZUNvbCB8fCAnI0ZGRkZGRidcclxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLm91dGxpbmVXaWR0aFBpeCA9IG9wdHMub3V0bGluZVdpZHRoUGl4ID09IHVuZGVmaW5lZCA/IDAuNSA6IG9wdHMub3V0bGluZVdpZHRoUGl4XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHNlZ21lbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gclxyXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBjZ1xyXG4gICAgICovXHJcbiAgICBkcmF3KGNlbGxzLCByLCBjZykge1xyXG4gICAgICAgIC8vZmlsdGVyXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcclxuXHJcbiAgICAgICAgLy96b29tIGZhY3RvclxyXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxyXG5cclxuICAgICAgICBsZXQgc3RhdEhlaWdodFxyXG4gICAgICAgIGlmICh0aGlzLmhlaWdodENvbCkge1xyXG4gICAgICAgICAgICAvL2NvbXB1dGUgc2l6ZSB2YXJpYWJsZSBzdGF0aXN0aWNzXHJcbiAgICAgICAgICAgIHN0YXRIZWlnaHQgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLmhlaWdodENvbF0sIHRydWUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc3RhdENvbG9yXHJcbiAgICAgICAgaWYgKHRoaXMuY29sb3JDb2wpIHtcclxuICAgICAgICAgICAgLy9jb21wdXRlIGNvbG9yIHZhcmlhYmxlIHN0YXRpc3RpY3NcclxuICAgICAgICAgICAgc3RhdENvbG9yID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5jb2xvckNvbF0sIHRydWUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc3RhdFdpZHRoXHJcbiAgICAgICAgaWYgKHRoaXMud2lkdGhDb2wpIHtcclxuICAgICAgICAgICAgLy9hbmQgY29tcHV0ZSBzaXplIHZhcmlhYmxlIHN0YXRpc3RpY3NcclxuICAgICAgICAgICAgc3RhdFdpZHRoID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy53aWR0aENvbF0sIHRydWUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2dldCB2aWV3IGNlbnRlciBnZW8gcG9zaXRpb25cclxuICAgICAgICBjb25zdCBjdnggPSBjZy5nZXRDZW50ZXIoKS54ICsgdGhpcy52aWV3U1ggKiBjZy53ICogemZcclxuICAgICAgICBjb25zdCBjdnkgPSBjZy5nZXRDZW50ZXIoKS55ICsgdGhpcy52aWV3U1kgKiBjZy5oICogemZcclxuICAgICAgICAvL2dldCB2aWV3IGhlaWdodFxyXG4gICAgICAgIGNvbnN0IEggPSB0aGlzLnZpZXdIZWlnaHRGYWN0b3IgKiAoY2cudyArIGNnLmgpICogMC41ICogemZcclxuXHJcbiAgICAgICAgLy9zb3J0IGNlbGxzIGJ5IHkgYW5kIHhcclxuICAgICAgICAvL2NvbnN0IGRpc3RUb1ZpZXdDZW50ZXIgPSAoYykgPT4geyBjb25zdCBkeCA9IGN2eCAtIGMueCwgZHkgPSBjdnkgLSBjLnk7IHJldHVybiBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpIH1cclxuICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IDEwMDAwMDAwMCAqIChjMi55IC0gYzEueSkgKyBjMS54IC0gYzIueClcclxuXHJcbiAgICAgICAgY2cuY3R4LmxpbmVDYXAgPSB0aGlzLnNpbXBsZSA/ICdidXR0JyA6ICdyb3VuZCdcclxuXHJcbiAgICAgICAgLy9kcmF3IGluIGdlbyBjb29yZGluYXRlc1xyXG4gICAgICAgIGNnLnNldENhbnZhc1RyYW5zZm9ybSgpXHJcblxyXG4gICAgICAgIC8vZHJhdyBzaGFkb3dzXHJcbiAgICAgICAgY2cuY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5zaGFkb3dDb2xvclxyXG4gICAgICAgIGNnLmN0eC5maWxsU3R5bGUgPSB0aGlzLnNoYWRvd0NvbG9yXHJcbiAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xyXG4gICAgICAgICAgICAvL3dpZHRoXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChjW3RoaXMud2lkdGhDb2xdLCByLCBzdGF0V2lkdGgsIHpmKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIXdHIHx8IHdHIDwgMCkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vaGVpZ2h0XHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3QgaEcgPSB0aGlzLmhlaWdodCA/IHRoaXMuaGVpZ2h0KGNbdGhpcy5oZWlnaHRDb2xdLCByLCBzdGF0SGVpZ2h0LCB6ZikgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgaWYgKCFoRyB8fCBoRyA8IDApIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcclxuICAgICAgICAgICAgLy9UT0RPIHVzZSB0aGF0XHJcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGMsIHIsIHpmKVxyXG5cclxuICAgICAgICAgICAgLy9zZXQgd2lkdGhcclxuICAgICAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IHdHXHJcblxyXG4gICAgICAgICAgICAvL2NvbXB1dGUgY2VsbCBjZW50cmUgcG9zdGl0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IGN4ID0gYy54ICsgciAvIDJcclxuICAgICAgICAgICAgY29uc3QgY3kgPSBjLnkgKyByIC8gMlxyXG4gICAgICAgICAgICBjb25zdCBscyA9IGhHICogdGhpcy5zaGFkb3dGYWN0b3JcclxuXHJcbiAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50XHJcbiAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICBjZy5jdHgubW92ZVRvKGN4LCBjeSlcclxuICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCArIGxzICogTWF0aC5jb3ModGhpcy5zaGFkb3dEaXJlY3Rpb24pLCBjeSArIGxzICogTWF0aC5zaW4odGhpcy5zaGFkb3dEaXJlY3Rpb24pKVxyXG4gICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcclxuXHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNpbXBsZSkge1xyXG4gICAgICAgICAgICAgICAgLy9kcmF3IGJhc2UgY2lyY2xlXHJcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKCk7XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguYXJjKFxyXG4gICAgICAgICAgICAgICAgICAgIGN4LCBjeSxcclxuICAgICAgICAgICAgICAgICAgICB3RyAqIDAuNSxcclxuICAgICAgICAgICAgICAgICAgICAwLCAyICogTWF0aC5QSSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgLy9jZy5jdHguc3Ryb2tlKCk7XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguZmlsbCgpO1xyXG4gICAgICAgICAgICB9Ki9cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vZHJhdyBwaWxsYXJzXHJcbiAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xyXG4gICAgICAgICAgICAvL2NvbG9yXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoY1t0aGlzLmNvbG9yQ29sXSwgciwgc3RhdENvbG9yKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIWNvbCkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vd2lkdGhcclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgICAgICBjb25zdCB3RyA9IHRoaXMud2lkdGggPyB0aGlzLndpZHRoKGNbdGhpcy53aWR0aENvbF0sIHIsIHN0YXRXaWR0aCwgemYpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPCAwKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy9oZWlnaHRcclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xyXG4gICAgICAgICAgICBjb25zdCBoRyA9IHRoaXMuaGVpZ2h0ID8gdGhpcy5oZWlnaHQoY1t0aGlzLmhlaWdodENvbF0sIHIsIHN0YXRIZWlnaHQsIHpmKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIWhHIHx8IGhHIDwgMCkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxyXG4gICAgICAgICAgICAvL1RPRE8gdXNlIHRoYXRcclxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoYywgciwgemYpXHJcblxyXG4gICAgICAgICAgICAvL2NvbXB1dGUgY2VsbCBjZW50cmUgcG9zdGl0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IGN4ID0gYy54ICsgciAvIDJcclxuICAgICAgICAgICAgY29uc3QgY3kgPSBjLnkgKyByIC8gMlxyXG5cclxuICAgICAgICAgICAgLy9jb21wdXRlIGFuZ2xlXHJcbiAgICAgICAgICAgIGNvbnN0IGR4ID0gY3ggLSBjdngsXHJcbiAgICAgICAgICAgICAgICBkeSA9IGN5IC0gY3Z5XHJcbiAgICAgICAgICAgIGNvbnN0IGEgPSBNYXRoLmF0YW4yKGR5LCBkeClcclxuICAgICAgICAgICAgY29uc3QgRCA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSlcclxuICAgICAgICAgICAgY29uc3QgZCA9IChEICogaEcpIC8gKEggLSBoRylcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNpbXBsZSkge1xyXG4gICAgICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnRcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IGNvbFxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IHdHXHJcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY3gsIGN5KVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCArIGQgKiBNYXRoLmNvcyhhKSwgY3kgKyBkICogTWF0aC5zaW4oYSkpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vZHJhdyBiYWNrZ3JvdW5kIHNlZ21lbnRcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMub3V0bGluZUNvbFxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IHdHICsgMiAqIHRoaXMub3V0bGluZVdpZHRoUGl4ICogemZcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhjeCwgY3kpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGN4ICsgZCAqIE1hdGguY29zKGEpLCBjeSArIGQgKiBNYXRoLnNpbihhKSlcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxyXG5cclxuICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lV2lkdGggPSB3R1xyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubW92ZVRvKGN4LCBjeSlcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY3ggKyBkICogTWF0aC5jb3MoYSksIGN5ICsgZCAqIE1hdGguc2luKGEpKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXHJcblxyXG4gICAgICAgICAgICAgICAgLy9kcmF3IHRvcCBjaXJjbGVcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMub3V0bGluZUNvbFxyXG4gICAgICAgICAgICAgICAgLy9jZy5jdHguZmlsbFN0eWxlID0gXCIjYzA4YzU5XCJcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lV2lkdGggPSB0aGlzLm91dGxpbmVXaWR0aFBpeCAqIHpmXHJcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5hcmMoY3ggKyBkICogTWF0aC5jb3MoYSksIGN5ICsgZCAqIE1hdGguc2luKGEpLCB3RyAqIDAuNSwgMCwgMiAqIE1hdGguUEksIGZhbHNlKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgICAgICAgICAvL2NnLmN0eC5maWxsKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vaW4gY2FzZS4uLlxyXG4gICAgICAgIGNnLmN0eC5saW5lQ2FwID0gJ2J1dHQnXHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcclxuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcjogciwgemY6IHpmLCBzQ29sb3I6IHN0YXRDb2xvciB9KVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcclxuXHJcbi8qKlxyXG4gKiBBIHN0eWxlIHdoZXJlIGVhY2ggY2VsbCBpcyByZXByZXNlbnRlZCBieSBhIHNlZ21lbnQgd2hvc2UgbGVuZ3RoLCB3aWR0aCwgY29sb3IgYW5kIG9yaWVudGF0aW9uIGNhbiB2YXJ5IGFjY29yZGluZyB0byBzdGF0aXN0aWNhbCB2YWx1ZXMuXHJcbiAqXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTZWdtZW50U3R5bGUgZXh0ZW5kcyBTdHlsZSB7XHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgb3JpZW50YXRpb24gKGluIGRlZ3JlZXMpIG9mIHRoZSBzZWdtZW50IHJlcHJlc2VudGluZyBhIGNlbGwuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL0RhdGFzZXRcIikuQ2VsbCk6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMub3JpZW50YXRpb24gPSBvcHRzLm9yaWVudGF0aW9uIHx8ICgoKSA9PiAwKVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3JDb2wgPSBvcHRzLmNvbG9yQ29sXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNlbGwgc2VnbWVudC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCk6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI0VBNkJBQycpXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5sZW5ndGhDb2wgPSBvcHRzLmxlbmd0aENvbFxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGxlbmd0aCBvZiB0aGUgc2VnbWVudCByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMubGVuZ3RoID0gb3B0cy5sZW5ndGhcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLndpZHRoQ29sID0gb3B0cy53aWR0aENvbFxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHdpZHRoIG9mIHRoZSBzZWdtZW50IHJlcHJlc2VudGluZyBhIGNlbGwsIGluIGdlbyB1bml0XHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGhcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgY2VsbHMgYXMgc2VnbWVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL3pvb20gZmFjdG9yXHJcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXHJcblxyXG4gICAgICAgIGxldCBzdGF0Q29sb3JcclxuICAgICAgICBpZiAodGhpcy5jb2xvckNvbCkge1xyXG4gICAgICAgICAgICAvL2NvbXB1dGUgY29sb3IgdmFyaWFibGUgc3RhdGlzdGljc1xyXG4gICAgICAgICAgICBzdGF0Q29sb3IgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLmNvbG9yQ29sXSwgdHJ1ZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzdGF0TGVuZ3RoXHJcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoQ29sKSB7XHJcbiAgICAgICAgICAgIC8vaWYgbGVuZ3RoIGlzIHVzZWQsIHNvcnQgY2VsbHMgYnkgbGVuZ3RoIHNvIHRoYXQgdGhlIGxvbmdlc3RzIGFyZSBkcmF3biBmaXJzdFxyXG4gICAgICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IGMyW3RoaXMubGVuZ3RoQ29sXSAtIGMxW3RoaXMubGVuZ3RoQ29sXSlcclxuICAgICAgICAgICAgLy9hbmQgY29tcHV0ZSBzaXplIHZhcmlhYmxlIHN0YXRpc3RpY3NcclxuICAgICAgICAgICAgc3RhdExlbmd0aCA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMubGVuZ3RoQ29sXSwgdHJ1ZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzdGF0V2lkdGhcclxuICAgICAgICBpZiAodGhpcy53aWR0aENvbCkge1xyXG4gICAgICAgICAgICAvL2FuZCBjb21wdXRlIHNpemUgdmFyaWFibGUgc3RhdGlzdGljc1xyXG4gICAgICAgICAgICBzdGF0V2lkdGggPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLndpZHRoQ29sXSwgdHJ1ZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgY2cuY3R4LmxpbmVDYXAgPSAnYnV0dCdcclxuXHJcbiAgICAgICAgLy9jb252ZXJzaW9uIGZhY3RvciBkZWdyZWUgLT4gcmFkaWFuXHJcbiAgICAgICAgY29uc3QgZiA9IE1hdGguUEkgLyAxODBcclxuXHJcbiAgICAgICAgLy9kcmF3IGluIGdlbyBjb29yZGluYXRlc1xyXG4gICAgICAgIGNnLnNldENhbnZhc1RyYW5zZm9ybSgpXHJcblxyXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgLy9jb2xvclxyXG4gICAgICAgICAgICAvKiogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9ICovXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNbdGhpcy5jb2xvckNvbF0sIHIsIHN0YXRDb2xvcikgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgaWYgKCFjb2wpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL3dpZHRoXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChjW3RoaXMud2lkdGhDb2xdLCByLCBzdGF0V2lkdGgsIHpmKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIXdHIHx8IHdHIDwgMCkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vbGVuZ3RoXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3QgbEcgPSB0aGlzLmxlbmd0aCA/IHRoaXMubGVuZ3RoKGNbdGhpcy5sZW5ndGhDb2xdLCByLCBzdGF0TGVuZ3RoLCB6ZikgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgaWYgKCFsRyB8fCBsRyA8IDApIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL29yaWVudGF0aW9uIChpbiByYWRpYW4pXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG4gICAgICAgICAgICBjb25zdCBvciA9IHRoaXMub3JpZW50YXRpb24oYykgKiBmXHJcbiAgICAgICAgICAgIGlmIChvciA9PT0gdW5kZWZpbmVkIHx8IGlzTmFOKG9yKSkgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxyXG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjLCByLCB6ZilcclxuXHJcbiAgICAgICAgICAgIC8vc2V0IGNvbG9yIGFuZCB3aWR0aFxyXG4gICAgICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xcclxuICAgICAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IHdHXHJcblxyXG4gICAgICAgICAgICAvL2NvbXB1dGUgc2VnbWVudCBjZW50cmUgcG9zdGl0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IGN4ID0gYy54ICsgciAvIDIgKyBvZmZzZXQuZHhcclxuICAgICAgICAgICAgY29uc3QgY3kgPSBjLnkgKyByIC8gMiArIG9mZnNldC5keVxyXG5cclxuICAgICAgICAgICAgLy9jb21wdXRlIHNlZ21lbnQgZGlyZWN0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IGR4ID0gMC41ICogTWF0aC5jb3Mob3IpICogbEdcclxuICAgICAgICAgICAgY29uc3QgZHkgPSAwLjUgKiBNYXRoLnNpbihvcikgKiBsR1xyXG5cclxuICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnRcclxuICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY3ggLSBkeCwgY3kgLSBkeSlcclxuICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjeCArIGR4LCBjeSArIGR5KVxyXG4gICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZCwgaWYgYW55XHJcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHtcclxuICAgICAgICAgICAgc3R5bGU6IHRoaXMsXHJcbiAgICAgICAgICAgIHI6IHIsXHJcbiAgICAgICAgICAgIHpmOiB6ZixcclxuICAgICAgICAgICAgc0NvbG9yOiBzdGF0Q29sb3IsXHJcbiAgICAgICAgICAgIHNMZW5ndGg6IHN0YXRMZW5ndGgsXHJcbiAgICAgICAgICAgIHNXaWR0aDogc3RhdFdpZHRoLFxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL1N0eWxlLmpzJ1xyXG5cclxuLyoqXHJcbiAqIEEgdmVyeSBnZW5lcmljIHN0eWxlIHRoYXQgc2hvd3MgZ3JpZCBjZWxscyB3aXRoIHNwZWNpZmljIGNvbG9yLCBzaXplIGFuZCBzaGFwZS5cclxuICogSXQgY2FuIGJlIHVzZWQgdG8gc2hvdyB2YXJpYWJsZXMgYXMgY2VsbCBjb2xvcnMsIGNlbGwgc2l6ZSwgY2VsbCBzaGFwZSwgb3IgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSB0aHJlZSB2aXN1YWwgdmFyaWFibGVzLlxyXG4gKlxyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU2hhcGVDb2xvclNpemVTdHlsZSBleHRlbmRzIFN0eWxlIHtcclxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciBjb2xvci5cclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3JDb2wgPSBvcHRzLmNvbG9yQ29sXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNlbGwuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+ICcjRUE2QkFDJykgLy8odixyLHMsemYpID0+IHt9XHJcblxyXG4gICAgICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uL2F0dHJpYnV0ZSBvZiB0aGUgdGFidWxhciBkYXRhIHdoZXJlIHRvIHJldHJpZXZlIHRoZSB2YXJpYWJsZSBmb3Igc2l6ZS5cclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuc2l6ZUNvbCA9IG9wdHMuc2l6ZUNvbFxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgYSBjZWxsIGluIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZVxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNoYXBlIG9mIGEgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsKTppbXBvcnQoXCIuLi9TdHlsZVwiKS5TaGFwZX0gKi9cclxuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKCkgPT4gJ3NxdWFyZScpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHNxdWFyZXMsIHdpdGggdmFyaW91cyBjb2xvcnMgYW5kIHNpemUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL3pvb20gZmFjdG9yXHJcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXHJcblxyXG4gICAgICAgIGxldCBzdGF0U2l6ZVxyXG4gICAgICAgIGlmICh0aGlzLnNpemVDb2wpIHtcclxuICAgICAgICAgICAgLy9pZiBzaXplIGlzIHVzZWQsIHNvcnQgY2VsbHMgYnkgc2l6ZSBzbyB0aGF0IHRoZSBiaWdnZXN0IGFyZSBkcmF3biBmaXJzdFxyXG4gICAgICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IGMyW3RoaXMuc2l6ZUNvbF0gLSBjMVt0aGlzLnNpemVDb2xdKVxyXG4gICAgICAgICAgICAvL2FuZCBjb21wdXRlIHNpemUgdmFyaWFibGUgc3RhdGlzdGljc1xyXG4gICAgICAgICAgICBzdGF0U2l6ZSA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMuc2l6ZUNvbF0sIHRydWUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc3RhdENvbG9yXHJcbiAgICAgICAgaWYgKHRoaXMuY29sb3JDb2wpIHtcclxuICAgICAgICAgICAgLy9jb21wdXRlIGNvbG9yIHZhcmlhYmxlIHN0YXRpc3RpY3NcclxuICAgICAgICAgICAgc3RhdENvbG9yID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5jb2xvckNvbF0sIHRydWUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2RyYXcgd2l0aCBIVE1MIGNhbnZhc1xyXG4gICAgICAgIC8vaW4gZ2VvIGNvb3JkaW5hdGVzXHJcbiAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcclxuXHJcbiAgICAgICAgY29uc3QgcjIgPSByICogMC41XHJcbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xyXG4gICAgICAgICAgICAvL2NvbG9yXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNlbGxbdGhpcy5jb2xvckNvbF0sIHIsIHN0YXRDb2xvciwgemYpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxyXG4gICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gY29sXHJcblxyXG4gICAgICAgICAgICAvL3NoYXBlXHJcbiAgICAgICAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5zaGFwZSA/IHRoaXMuc2hhcGUoY2VsbCkgOiAnc3F1YXJlJ1xyXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdub25lJykgY29udGludWVcclxuXHJcbiAgICAgICAgICAgIC8vc2l6ZVxyXG4gICAgICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgICAgIGxldCBzXyA9IHRoaXMuc2l6ZSB8fCAoKCkgPT4gcilcclxuICAgICAgICAgICAgLy9zaXplIC0gaW4gZ2VvIHVuaXRcclxuICAgICAgICAgICAgY29uc3Qgc0cgPSBzXyhjZWxsW3RoaXMuc2l6ZUNvbF0sIHIsIHN0YXRTaXplLCB6ZilcclxuXHJcbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxyXG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByLCB6ZilcclxuXHJcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ3NxdWFyZScpIHtcclxuICAgICAgICAgICAgICAgIC8vZHJhdyBzcXVhcmVcclxuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSByICogKDEgLSBzRyAvIHIpICogMC41XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguZmlsbFJlY3QoY2VsbC54ICsgZCArIG9mZnNldC5keCwgY2VsbC55ICsgZCArIG9mZnNldC5keSwgc0csIHNHKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnY2lyY2xlJykge1xyXG4gICAgICAgICAgICAgICAgLy9kcmF3IGNpcmNsZVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHguYXJjKGNlbGwueCArIHIyICsgb2Zmc2V0LmR4LCBjZWxsLnkgKyByMiArIG9mZnNldC5keSwgc0cgKiAwLjUsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSlcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKClcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ2RvbnV0Jykge1xyXG4gICAgICAgICAgICAgICAgLy9kcmF3IGRvbnV0XHJcbiAgICAgICAgICAgICAgICBjb25zdCB4YyA9IGNlbGwueCArIHIyICsgb2Zmc2V0LmR4LFxyXG4gICAgICAgICAgICAgICAgICAgIHljID0gY2VsbC55ICsgcjIgKyBvZmZzZXQuZHlcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyh4YywgeWMpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHguYXJjKHhjLCB5YywgcjIsIDAsIDIgKiBNYXRoLlBJKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmFyYyh4YywgeWMsICgxIC0gc0cgLyByKSAqIHIyLCAwLCAyICogTWF0aC5QSSwgdHJ1ZSlcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5jbG9zZVBhdGgoKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGwoKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnZGlhbW9uZCcpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHMyID0gc0cgKiAwLjVcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhjZWxsLnggKyByMiAtIHMyLCBjZWxsLnkgKyByMilcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY2VsbC54ICsgcjIsIGNlbGwueSArIHIyICsgczIpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGNlbGwueCArIHIyICsgczIsIGNlbGwueSArIHIyKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjZWxsLnggKyByMiwgY2VsbC55ICsgcjIgLSBzMilcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsKClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaGFwZTonICsgc2hhcGUpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcclxuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcjogciwgemY6IHpmLCBzU2l6ZTogc3RhdFNpemUsIHNDb2xvcjogc3RhdENvbG9yIH0pXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL1N0eWxlLmpzJ1xyXG5cclxuLyoqIEB0eXBlZGVmIHt7eDpudW1iZXIseTpudW1iZXIsb3I6XCJ2XCJ8XCJoXCIsdjE6c3RyaW5nfHVuZGVmaW5lZCx2MjpzdHJpbmd8dW5kZWZpbmVkfX0gU2lkZSAqL1xyXG5cclxuLyoqXHJcbiAqIEEgc3R5bGUgdG8gc2hvdyB0aGUgc2lkZXMgb2YgZ3JpZCBjZWxscyBiYXNlZCBvbiB0aGVpciBkaWZmZXJlbnQgY2F0ZWdvcmllcy5cclxuICpcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNpZGVDYXRTdHlsZSBleHRlbmRzIFN0eWxlIHtcclxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIGNhdGVnb3JpY2FsIHZhbHVlLlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2wgPSBvcHRzLmNvbFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGljdGlvbmFyeSAoc3RyaW5nIC0+IGNvbG9yKSB3aGljaCBnaXZlIHRoZSBjb2xvciBvZiBlYWNoIGNhdGVnb3J5LlxyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3JcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiBhIGNlbGwgc2lkZSBsaW5lLCBpbiBnZW8gdW5pdFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihTaWRlLG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKHNpZGUsIHIsIHopID0+IHIgKiAwLjIpXHJcblxyXG4gICAgICAgIC8qKiBBIGZpbGwgY29sb3IgZm9yIHRoZSBjZWxscy5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsKTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5maWxsQ29sb3IgPSBvcHRzLmZpbGxDb2xvclxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICBpZiAoIWNlbGxzIHx8IGNlbGxzLmxlbmd0aCA9PSAwKSByZXR1cm5cclxuXHJcbiAgICAgICAgLy96b29tIGZhY3RvclxyXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxyXG5cclxuICAgICAgICAvKiogIEB0eXBlIHtBcnJheS48U2lkZT59ICovXHJcbiAgICAgICAgY29uc3Qgc2lkZXMgPSBbXVxyXG5cclxuICAgICAgICAvL21ha2UgaG9yaXpvbnRhbCBzaWRlc1xyXG4gICAgICAgIC8vc29ydCBjZWxscyBieSB4IGFuZCB5XHJcbiAgICAgICAgY2VsbHMuc29ydCgoYzEsIGMyKSA9PiAoYzIueCA9PSBjMS54ID8gYzEueSAtIGMyLnkgOiBjMS54IC0gYzIueCkpXHJcbiAgICAgICAgbGV0IGMxID0gY2VsbHNbMF1cclxuICAgICAgICBsZXQgdjEgPSBjMVt0aGlzLmNvbF1cclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBjMiA9IGNlbGxzW2ldXHJcbiAgICAgICAgICAgIGxldCB2MiA9IGMyW3RoaXMuY29sXVxyXG5cclxuICAgICAgICAgICAgaWYgKGMxLnkgKyByID09IGMyLnkgJiYgYzEueCA9PSBjMi54KSB7XHJcbiAgICAgICAgICAgICAgICAvL2NlbGxzIGluIHNhbWUgY29sdW1uIGFuZCB0b3VjaCBhbG9uZyBob3Jpem9udGFsIHNpZGVcclxuICAgICAgICAgICAgICAgIC8vbWFrZSBzaGFyZWQgc2lkZVxyXG4gICAgICAgICAgICAgICAgaWYgKHYxICE9IHYyKSBzaWRlcy5wdXNoKHsgeDogYzEueCwgeTogYzIueSwgb3I6ICdoJywgdjE6IHYxLCB2MjogdjIgfSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vY2VsbHMgZG8gbm90IHRvdWNoIGFsb25nIGhvcml6b250YWwgc2lkZVxyXG4gICAgICAgICAgICAgICAgLy9tYWtlIHR3byBzaWRlczogdG9wIG9uZSBmb3IgYzEsIGJvdHRvbSBmb3IgYzJcclxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goeyB4OiBjMS54LCB5OiBjMS55ICsgciwgb3I6ICdoJywgdjE6IHYxLCB2MjogdW5kZWZpbmVkIH0pXHJcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHsgeDogYzIueCwgeTogYzIueSwgb3I6ICdoJywgdjE6IHVuZGVmaW5lZCwgdjI6IHYyIH0pXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGMxID0gYzJcclxuICAgICAgICAgICAgdjEgPSB2MlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9tYWtlIHZlcnRpY2FsIHNpZGVzXHJcbiAgICAgICAgLy9zb3J0IGNlbGxzIGJ5IHkgYW5kIHhcclxuICAgICAgICBjZWxscy5zb3J0KChjMSwgYzIpID0+IChjMi55ID09IGMxLnkgPyBjMS54IC0gYzIueCA6IGMxLnkgLSBjMi55KSlcclxuICAgICAgICBjMSA9IGNlbGxzWzBdXHJcbiAgICAgICAgdjEgPSBjMVt0aGlzLmNvbF1cclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBjMiA9IGNlbGxzW2ldXHJcbiAgICAgICAgICAgIGxldCB2MiA9IGMyW3RoaXMuY29sXVxyXG5cclxuICAgICAgICAgICAgaWYgKGMxLnggKyByID09IGMyLnggJiYgYzEueSA9PSBjMi55KSB7XHJcbiAgICAgICAgICAgICAgICAvL2NlbGxzIGluIHNhbWUgcm93IGFuZCB0b3VjaCBhbG9uZyB2ZXJ0aWNhbCBzaWRlXHJcbiAgICAgICAgICAgICAgICAvL21ha2Ugc2hhcmVkIHNpZGVcclxuICAgICAgICAgICAgICAgIGlmICh2MSAhPSB2Mikgc2lkZXMucHVzaCh7IHg6IGMxLnggKyByLCB5OiBjMS55LCBvcjogJ3YnLCB2MTogdjEsIHYyOiB2MiB9KVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9jZWxscyBkbyBub3QgdG91Y2ggYWxvbmcgdmVydGljYWwgc2lkZVxyXG4gICAgICAgICAgICAgICAgLy9tYWtlIHR3byBzaWRlczogcmlnaHQgb25lIGZvciBjMSwgbGVmdCBmb3IgYzJcclxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goeyB4OiBjMS54ICsgciwgeTogYzEueSwgb3I6ICd2JywgdjE6IHYxLCB2MjogdW5kZWZpbmVkIH0pXHJcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHsgeDogYzIueCwgeTogYzIueSwgb3I6ICd2JywgdjE6IHVuZGVmaW5lZCwgdjI6IHYyIH0pXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGMxID0gYzJcclxuICAgICAgICAgICAgdjEgPSB2MlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICBpZiAoc2lkZXMubGVuZ3RoID09IDApIHJldHVyblxyXG5cclxuICAgICAgICAvL2RyYXcgaW4gZ2VvIGNvb3JkaW5hdGVzXHJcbiAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcclxuXHJcbiAgICAgICAgLy9kcmF3IGNlbGxzLCBpZiBmaWxsQ29sb3Igc3BlY2lmaWVkXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsbENvbG9yKVxyXG4gICAgICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmYyA9IHRoaXMuZmlsbENvbG9yKGMpXHJcbiAgICAgICAgICAgICAgICBpZiAoIWZjIHx8IGZjID09ICdub25lJykgY29udGludWVcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsU3R5bGUgPSBmY1xyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KGMueCwgYy55LCByLCByKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vZHJhdyBzaWRlc1xyXG4gICAgICAgIGNnLmN0eC5saW5lQ2FwID0gJ2J1dHQnXHJcbiAgICAgICAgZm9yIChsZXQgcyBvZiBzaWRlcykge1xyXG4gICAgICAgICAgICAvL3dpZHRoXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChzLCByLCB6ZikgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8PSAwKSBjb250aW51ZVxyXG4gICAgICAgICAgICBjb25zdCB3MiA9IHdHICogMC41XHJcblxyXG4gICAgICAgICAgICAvL3NldCBjb2xvciBhbmQgd2lkdGhcclxuICAgICAgICAgICAgY2cuY3R4LmxpbmVXaWR0aCA9IHdHXHJcblxyXG4gICAgICAgICAgICAvL2RyYXcgc2VnbWVudCB3aXRoIGNvcnJlY3Qgb3JpZW50YXRpb25cclxuICAgICAgICAgICAgaWYgKHMub3IgPT09ICdoJykge1xyXG4gICAgICAgICAgICAgICAgLy90b3AgbGluZVxyXG4gICAgICAgICAgICAgICAgaWYgKHMudjIpIHtcclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbG9yW3MudjJdXHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhzLngsIHMueSArIHcyKVxyXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8ocy54ICsgciwgcy55ICsgdzIpXHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9ib3R0b20gbGluZVxyXG4gICAgICAgICAgICAgICAgaWYgKHMudjEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbG9yW3MudjFdXHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhzLngsIHMueSAtIHcyKVxyXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8ocy54ICsgciwgcy55IC0gdzIpXHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvL3JpZ2h0IGxpbmVcclxuICAgICAgICAgICAgICAgIGlmIChzLnYyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xvcltzLnYyXVxyXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8ocy54ICsgdzIsIHMueSlcclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKHMueCArIHcyLCBzLnkgKyByKVxyXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vbGVmdCBsaW5lXHJcbiAgICAgICAgICAgICAgICBpZiAocy52MSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sb3Jbcy52MV1cclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHgubW92ZVRvKHMueCAtIHcyLCBzLnkpXHJcbiAgICAgICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhzLnggLSB3Miwgcy55ICsgcilcclxuICAgICAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByOiByLCB6ZjogemYgfSlcclxuICAgIH1cclxufVxyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vU3R5bGUuanMnXHJcblxyXG4vKiogQHR5cGVkZWYge3t4Om51bWJlcix5Om51bWJlcixvcjpcInZcInxcImhcIix2YWx1ZTpudW1iZXJ9fSBTaWRlICovXHJcblxyXG4vKipcclxuICpcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNpZGVTdHlsZSBleHRlbmRzIFN0eWxlIHtcclxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciB0aGUgY2VsbCB2YWx1ZXMuXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnZhbHVlQ29sID0gb3B0cy52YWx1ZUNvbFxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHZhbHVlIG9mIGEgY2VsbCBzaWRlLiBUaGlzIHZhbHVlIGlzIGNvbXB1dGVkIGZyb20gdGhlIHR3byBhZGphY2VudCBjZWxsIHZhbHVlcy5cclxuICAgICAgICAgKiBGb3IgaG9yaXpvbnRhbCBzaWRlcywgdjEgaXMgdGhlIHZhbHVlIG9mIHRoZSBjZWxsIGJlbG93IGFuZCB2MiB0aGUgdmFsdWUgb2YgdGhlIGNlbGwgYWJvdmUuXHJcbiAgICAgICAgICogRm9yIHZlcnRpY2FsIHNpZGVzLCB2MSBpcyB0aGUgdmFsdWUgb2YgdGhlIGNlbGwgbGVmdCBhbmQgdjIgdGhlIHZhbHVlIG9mIHRoZSBjZWxsIHJpZ2h0LlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXJ8dW5kZWZpbmVkLG51bWJlcnx1bmRlZmluZWQsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBvcHRzLnZhbHVlIHx8ICgodjEsIHYyLCByLCBzLCB6ZikgPT4gMSlcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiBhIGNlbGwgc2lkZS5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oU2lkZSxudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+ICcjRUE2QkFDJylcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiBhIGNlbGwgc2lkZSwgaW4gZ2VvIHVuaXRcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oU2lkZSxudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChzaWRlLCByLCBzLCB6ZikgPT4gKHIgKiBzaWRlLnZhbHVlKSAvIDUpXHJcblxyXG4gICAgICAgIC8qKiBvcmllbnRhdGlvbi4gU2V0IHRvIDkwIHRvIHNob3cgc2lkZXMgYXMgc2xvcGUgbGluZXMgZm9yIGV4YW1wbGUuXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gb3B0cy5vcmllbnRhdGlvbiB8fCAwXHJcblxyXG4gICAgICAgIC8qKiBBIGZpbGwgY29sb3IgZm9yIHRoZSBjZWxscy5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsKTpzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5maWxsQ29sb3IgPSBvcHRzLmZpbGxDb2xvclxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL3pvb20gZmFjdG9yXHJcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXHJcblxyXG4gICAgICAgIC8vY29tcHV0ZSBzdGF0cyBvbiBjZWxsIHZhbHVlc1xyXG4gICAgICAgIGxldCBzdGF0VmFsdWVcclxuICAgICAgICBpZiAodGhpcy52YWx1ZUNvbCkge1xyXG4gICAgICAgICAgICAvL2NvbXB1dGUgY29sb3IgdmFyaWFibGUgc3RhdGlzdGljc1xyXG4gICAgICAgICAgICBzdGF0VmFsdWUgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLnZhbHVlQ29sXSwgdHJ1ZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKiAgQHR5cGUge0FycmF5LjxTaWRlPn0gKi9cclxuICAgICAgICBjb25zdCBzaWRlcyA9IFtdXHJcblxyXG4gICAgICAgIGNvbnN0IGVwc2lsb24gPSByICogMC4wMDFcclxuXHJcbiAgICAgICAgLy9tYWtlIGhvcml6b250YWwgc2lkZXNcclxuICAgICAgICAvL3NvcnQgY2VsbHMgYnkgeCBhbmQgeVxyXG4gICAgICAgIGNlbGxzLnNvcnQoKGMxLCBjMikgPT4gKGMyLnggPT0gYzEueCA/IGMxLnkgLSBjMi55IDogYzEueCAtIGMyLngpKVxyXG4gICAgICAgIGxldCBjMSA9IGNlbGxzWzBdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgYzIgPSBjZWxsc1tpXVxyXG5cclxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGMxLnkgKyByIC0gYzIueSkgPD0gZXBzaWxvbiAmJiBNYXRoLmFicyhjMS54IC0gYzIueCkgPD0gZXBzaWxvbilcclxuICAgICAgICAgICAgICAgIC8vY2VsbHMgaW4gc2FtZSBjb2x1bW4gYW5kIHRvdWNoIGFsb25nIGhvcml6b250YWwgc2lkZVxyXG4gICAgICAgICAgICAgICAgLy9tYWtlIHNoYXJlZCBzaWRlXHJcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICB4OiBjMS54LFxyXG4gICAgICAgICAgICAgICAgICAgIHk6IGMyLnksXHJcbiAgICAgICAgICAgICAgICAgICAgb3I6ICdoJyxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZShjMVt0aGlzLnZhbHVlQ29sXSwgYzJbdGhpcy52YWx1ZUNvbF0sIHIsIHN0YXRWYWx1ZSwgemYpLFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvL2NlbGxzIGRvIG5vdCB0b3VjaCBhbG9uZyBob3Jpem9udGFsIHNpZGVcclxuICAgICAgICAgICAgICAgIC8vbWFrZSB0d28gc2lkZXM6IHRvcCBvbmUgZm9yIGMxLCBib3R0b20gZm9yIGMyXHJcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICB4OiBjMS54LFxyXG4gICAgICAgICAgICAgICAgICAgIHk6IGMxLnkgKyByLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yOiAnaCcsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUoYzFbdGhpcy52YWx1ZUNvbF0sIHVuZGVmaW5lZCwgciwgc3RhdFZhbHVlLCB6ZiksXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgeDogYzIueCxcclxuICAgICAgICAgICAgICAgICAgICB5OiBjMi55LFxyXG4gICAgICAgICAgICAgICAgICAgIG9yOiAnaCcsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUodW5kZWZpbmVkLCBjMlt0aGlzLnZhbHVlQ29sXSwgciwgc3RhdFZhbHVlLCB6ZiksXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjMSA9IGMyXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL21ha2UgdmVydGljYWwgc2lkZXNcclxuICAgICAgICAvL3NvcnQgY2VsbHMgYnkgeSBhbmQgeFxyXG4gICAgICAgIGNlbGxzLnNvcnQoKGMxLCBjMikgPT4gKGMyLnkgPT0gYzEueSA/IGMxLnggLSBjMi54IDogYzEueSAtIGMyLnkpKVxyXG4gICAgICAgIGMxID0gY2VsbHNbMF1cclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBjMiA9IGNlbGxzW2ldXHJcblxyXG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoYzEueCArIHIgLSBjMi54KSA8PSBlcHNpbG9uICYmIE1hdGguYWJzKGMxLnkgLSBjMi55KSA8PSBlcHNpbG9uKVxyXG4gICAgICAgICAgICAgICAgLy9jZWxscyBpbiBzYW1lIHJvdyBhbmQgdG91Y2ggYWxvbmcgdmVydGljYWwgc2lkZVxyXG4gICAgICAgICAgICAgICAgLy9tYWtlIHNoYXJlZCBzaWRlXHJcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICB4OiBjMS54ICsgcixcclxuICAgICAgICAgICAgICAgICAgICB5OiBjMS55LFxyXG4gICAgICAgICAgICAgICAgICAgIG9yOiAndicsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUoYzFbdGhpcy52YWx1ZUNvbF0sIGMyW3RoaXMudmFsdWVDb2xdLCByLCBzdGF0VmFsdWUsIHpmKSxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9jZWxscyBkbyBub3QgdG91Y2ggYWxvbmcgdmVydGljYWwgc2lkZVxyXG4gICAgICAgICAgICAgICAgLy9tYWtlIHR3byBzaWRlczogcmlnaHQgb25lIGZvciBjMSwgbGVmdCBmb3IgYzJcclxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIHg6IGMxLnggKyByLFxyXG4gICAgICAgICAgICAgICAgICAgIHk6IGMxLnksXHJcbiAgICAgICAgICAgICAgICAgICAgb3I6ICd2JyxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZShjMVt0aGlzLnZhbHVlQ29sXSwgdW5kZWZpbmVkLCByLCBzdGF0VmFsdWUsIHpmKSxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICB4OiBjMi54LFxyXG4gICAgICAgICAgICAgICAgICAgIHk6IGMyLnksXHJcbiAgICAgICAgICAgICAgICAgICAgb3I6ICd2JyxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZSh1bmRlZmluZWQsIGMyW3RoaXMudmFsdWVDb2xdLCByLCBzdGF0VmFsdWUsIHpmKSxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGMxID0gYzJcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgaWYgKHNpZGVzLmxlbmd0aCA9PSAwKSByZXR1cm5cclxuXHJcbiAgICAgICAgLy9jb21wdXRlIHN0YXRzIG9uIHNpZGVzXHJcbiAgICAgICAgY29uc3Qgc3RhdFNpZGVzID0gU2lkZVN0eWxlLmdldFNpZGVTdGF0aXN0aWNzKHNpZGVzLCB0cnVlKVxyXG5cclxuICAgICAgICAvL2RyYXcgaW4gZ2VvIGNvb3JkaW5hdGVzXHJcbiAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcclxuXHJcbiAgICAgICAgLy9kcmF3IGNlbGxzLCBpZiBmaWxsQ29sb3Igc3BlY2lmaWVkXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsbENvbG9yKVxyXG4gICAgICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmYyA9IHRoaXMuZmlsbENvbG9yKGMpXHJcbiAgICAgICAgICAgICAgICBpZiAoIWZjIHx8IGZjID09ICdub25lJykgY29udGludWVcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5maWxsU3R5bGUgPSBmY1xyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGxSZWN0KGMueCwgYy55LCByLCByKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vZHJhdyBzaWRlc1xyXG4gICAgICAgIGNnLmN0eC5saW5lQ2FwID0gJ2J1dHQnXHJcbiAgICAgICAgY29uc3QgcjIgPSByIC8gMlxyXG4gICAgICAgIGZvciAobGV0IHMgb2Ygc2lkZXMpIHtcclxuICAgICAgICAgICAgLy9jb2xvclxyXG4gICAgICAgICAgICAvKiogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9ICovXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKHMsIHIsIHN0YXRTaWRlcywgemYpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PSAnbm9uZScpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL3dpZHRoXHJcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cclxuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChzLCByLCBzdGF0U2lkZXMsIHpmKSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIXdHIHx8IHdHIDw9IDApIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL3NldCBjb2xvciBhbmQgd2lkdGhcclxuICAgICAgICAgICAgY2cuY3R4LnN0cm9rZVN0eWxlID0gY29sXHJcbiAgICAgICAgICAgIGNnLmN0eC5saW5lV2lkdGggPSB3R1xyXG5cclxuICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnQgd2l0aCBjb3JyZWN0IG9yaWVudGF0aW9uXHJcbiAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcmllbnRhdGlvbiA9PSA5MCkge1xyXG4gICAgICAgICAgICAgICAgY2cuY3R4Lm1vdmVUbyhzLnggKyByMiwgcy55ICsgcjIpXHJcbiAgICAgICAgICAgICAgICBpZiAocy5vciA9PT0gJ2gnKSBjZy5jdHgubGluZVRvKHMueCArIHIyLCBzLnkgLSByMilcclxuICAgICAgICAgICAgICAgIGVsc2UgY2cuY3R4LmxpbmVUbyhzLnggLSByMiwgcy55ICsgcjIpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubW92ZVRvKHMueCwgcy55KVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhzLnggKyAocy5vciA9PT0gJ2gnID8gciA6IDApLCBzLnkgKyAocy5vciA9PT0gJ3YnID8gciA6IDApKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByOiByLCB6ZjogemYgfSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgc29tZSBzdGF0aXN0aWNzIG9uIGEgdmFsdWUgb2Ygc29tZSBzaWRlcy5cclxuICAgICAqIFRoaXMgaXMgdXNlZCB0byBkZWZpbmUgaG93IHRvIGRyYXcgc3BlY2lmaWNhbGx5IHRoZSBzaWRlcyB3aXRoaW4gdGhlIHZpZXcuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48U2lkZT59IHNpZGVzXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVplcm9zXHJcbiAgICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdCB8IHVuZGVmaW5lZH1cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGdldFNpZGVTdGF0aXN0aWNzKHNpZGVzLCBpZ25vcmVaZXJvcykge1xyXG4gICAgICAgIGlmICghc2lkZXMgfHwgc2lkZXMubGVuZ3RoID09IDApIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgICBsZXQgbWluID0gSW5maW5pdHlcclxuICAgICAgICBsZXQgbWF4ID0gLUluZmluaXR5XHJcbiAgICAgICAgLy9sZXQgc3VtID0gMFxyXG4gICAgICAgIC8vbGV0IG5iID0gMFxyXG4gICAgICAgIGZvciAoY29uc3QgcyBvZiBzaWRlcykge1xyXG4gICAgICAgICAgICBjb25zdCB2ID0gcy52YWx1ZVxyXG4gICAgICAgICAgICBpZiAoaWdub3JlWmVyb3MgJiYgIXYpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGlmICh2IDwgbWluKSBtaW4gPSB2XHJcbiAgICAgICAgICAgIGlmICh2ID4gbWF4KSBtYXggPSB2XHJcbiAgICAgICAgICAgIC8vc3VtICs9IHZcclxuICAgICAgICAgICAgLy9uYisrXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IG1pbjogbWluLCBtYXg6IG1heCB9XHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL1N0eWxlLmpzJ1xyXG5pbXBvcnQgeyBtYWtlV2ViR0xDYW52YXMgfSBmcm9tICcuLi91dGlscy93ZWJHTFV0aWxzLmpzJ1xyXG5pbXBvcnQgeyBXZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQgfSBmcm9tICcuLi91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQuanMnXHJcbmltcG9ydCB7IG1vbml0b3IsIG1vbml0b3JEdXJhdGlvbiB9IGZyb20gJy4uL3V0aWxzL1V0aWxzLmpzJ1xyXG5cclxuLyoqXHJcbiAqIFN0eWxlIGJhc2VkIG9uIHdlYkdMXHJcbiAqIFRvIHNob3cgY2VsbHMgYXMgY29sb3JlZCBzcXVhcmVzLCBmcm9tIGNhdGVnb3JpZXMuXHJcbiAqIEFsbHMgc3F1YXJlcyB3aXRoIHRoZSBzYW1lIHNpemVcclxuICpcclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNxdWFyZUNvbG9yQ2F0V0dMU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XHJcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKVxyXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIGNhdGVnb3J5IG9mIHRoZSBjZWxsLCBmb3IgY29sb3JpbmcuXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvbG9yQ29sID0gb3B0cy5jb2xvckNvbFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGljdGlvbmFyeSAoc3RyaW5nIC0+IGNvbG9yKSB3aGljaCBnaXZlIHRoZSBjb2xvciBvZiBlYWNoIGNhdGVnb3J5LlxyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9ICovXHJcbiAgICAgICAgb3B0cy5jb2xvciA9IG9wdHMuY29sb3IgfHwgdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7IEFycmF5LjxzdHJpbmc+IH0gQHByaXZhdGUgKi9cclxuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob3B0cy5jb2xvcilcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHsgb2JqZWN0IH0gQHByaXZhdGUgKi9cclxuICAgICAgICB0aGlzLmNhdFRvSSA9IHt9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB0aGlzLmNhdFRvSVtrZXlzW2ldXSA9IGkgKyAnJ1xyXG5cclxuICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48c3RyaW5nPiB9IEBwcml2YXRlICovXHJcbiAgICAgICAgdGhpcy5jb2xvcnMgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLmNvbG9ycy5wdXNoKG9wdHMuY29sb3JbJycgKyBrZXlzW2ldXSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIHRoZSBjZWxscywgaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuIEFsbCBjZWxscyBoYXZlIHRoZSBzYW1lIHNpemUuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgLy8gKHJlc29sdXRpb24sIHpmKSA9PiAuLi5cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7IFdlYkdMU3F1YXJlQ29sb3JpbmdDYXRBZHZhbmNlZCB9ICovXHJcbiAgICAgICAgdGhpcy53Z3AgPSBuZXcgV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkKHRoaXMuY29sb3JzKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByXHJcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGNnXHJcbiAgICAgKi9cclxuICAgIGRyYXcoY2VsbHMsIHIsIGNnKSB7XHJcbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignKioqIFNxdWFyZUNvbG9yQ2F0V0dMU3R5bGUgZHJhdycpXHJcblxyXG4gICAgICAgIC8vZmlsdGVyXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcclxuXHJcbiAgICAgICAgLy96b29tIGZhY3RvclxyXG4gICAgICAgIGNvbnN0IHpmID0gY2cuZ2V0WmYoKVxyXG5cclxuICAgICAgICAvL2FkZCB2ZXJ0aWNlIGFuZCBmcmFnbWVudCBkYXRhXHJcbiAgICAgICAgY29uc3QgcjIgPSByIC8gMlxyXG4gICAgICAgIGxldCBjLFxyXG4gICAgICAgICAgICBuYiA9IGNlbGxzLmxlbmd0aFxyXG4gICAgICAgIGNvbnN0IHZlcnRpY2VzQnVmZmVyID0gW11cclxuICAgICAgICBjb25zdCBpQnVmZmVyID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5iOyBpKyspIHtcclxuICAgICAgICAgICAgYyA9IGNlbGxzW2ldXHJcbiAgICAgICAgICAgIGNvbnN0IGNhdCA9IGNbdGhpcy5jb2xvckNvbF1cclxuICAgICAgICAgICAgaWYgKGNhdCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdVbmV4cGVjdGVkIGNhdGVnb3J5OiAnICsgY2F0KVxyXG4gICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cclxuICAgICAgICAgICAgY29uc3QgaV8gPSB0aGlzLmNhdFRvSVtjYXRdXHJcbiAgICAgICAgICAgIGlmIChpc05hTigraV8pKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVW5leHBlY3RlZCBjYXRlZ29yeSBpbmRleDogJyArIGNhdCArICcgJyArIGlfKVxyXG4gICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2ZXJ0aWNlc0J1ZmZlci5wdXNoKGMueCArIHIyLCBjLnkgKyByMilcclxuICAgICAgICAgICAgaUJ1ZmZlci5wdXNoKCtpXylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyAgIHdlYmdsIHByb2dyYW0gaW5wdXRzIHByZXBhcmF0aW9uJylcclxuXHJcbiAgICAgICAgLy9jcmVhdGUgY2FudmFzIGFuZCB3ZWJnbCByZW5kZXJlclxyXG4gICAgICAgIGNvbnN0IGN2V0dMID0gbWFrZVdlYkdMQ2FudmFzKGNnLncgKyAnJywgY2cuaCArICcnKVxyXG4gICAgICAgIGlmICghY3ZXR0wpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gd2ViR0wnKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignICAgd2ViIEdMIGNhbnZhcyBjcmVhdGlvbicpXHJcblxyXG4gICAgICAgIC8vZHJhd1xyXG4gICAgICAgIGNvbnN0IHNpemVHZW8gPSB0aGlzLnNpemUgPyB0aGlzLnNpemUociwgemYpIDogciArIDAuMiAqIHpmXHJcbiAgICAgICAgdGhpcy53Z3AuZHJhdyhjdldHTC5nbCwgdmVydGljZXNCdWZmZXIsIGlCdWZmZXIsIGNnLmdldFdlYkdMVHJhbnNmb3JtKCksIHNpemVHZW8gLyB6ZilcclxuXHJcbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignICAgd2ViZ2wgZHJhd2luZycpXHJcblxyXG4gICAgICAgIC8vZHJhdyBpbiBjYW52YXMgZ2VvXHJcbiAgICAgICAgY2cuaW5pdENhbnZhc1RyYW5zZm9ybSgpXHJcbiAgICAgICAgY2cuY3R4LmRyYXdJbWFnZShjdldHTC5jYW52YXMsIDAsIDApXHJcblxyXG4gICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyAgIGNhbnZhcyBkcmF3aW5nJylcclxuXHJcbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByOiByLCB6ZjogemYgfSlcclxuXHJcbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignKioqIFNxdWFyZUNvbG9yQ2F0V0dMU3R5bGUgZW5kIGRyYXcnKVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcclxuaW1wb3J0IHsgbWFrZVdlYkdMQ2FudmFzIH0gZnJvbSAnLi4vdXRpbHMvd2ViR0xVdGlscy5qcydcclxuaW1wb3J0IHsgV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkIH0gZnJvbSAnLi4vdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkLmpzJ1xyXG5pbXBvcnQgeyBtb25pdG9yLCBtb25pdG9yRHVyYXRpb24gfSBmcm9tICcuLi91dGlscy9VdGlscy5qcydcclxuXHJcbi8qKlxyXG4gKiBTdHlsZSBiYXNlZCBvbiB3ZWJHTFxyXG4gKiBUbyBzaG93IGNlbGxzIGFzIGNvbG9yZWQgc3F1YXJlcywgd2l0aCBjb21wdXRhdGlvbiBvZiB0aGUgY29sb3JzIG9uIEdQVSBzaWRlIChmYXN0ZXIgdGhhbiBKYXZhU2NyaXB0IHNpZGUpLlxyXG4gKiBBbGxzIHNxdWFyZXMgd2l0aCB0aGUgc2FtZSBzaXplXHJcbiAqXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTcXVhcmVDb2xvcldHTFN0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uL2F0dHJpYnV0ZSBvZiB0aGUgdGFidWxhciBkYXRhIHdoZXJlIHRvIHJldHJpZXZlIHRoZSB2YXJpYWJsZSBmb3IgY29sb3IuXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvbG9yQ29sID0gb3B0cy5jb2xvckNvbFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgdCB2YWx1ZSAod2l0aGluIFswLDFdKSBvZiB0aGUgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy50RnVuID0gb3B0cy50RnVuIHx8ICgodiwgciwgcykgPT4gdiAvIHMubWF4KVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEaXN0cmlidXRpb24gc3RyZXRjaGluZyBtZXRob2QuXHJcbiAgICAgICAgICogVGhlIHN0cmV0Y2hpbmcgaXMgcGVyZm9ybWVkIG9uIEdQVSBzaWRlIChmcmFnbWVudCBzaGFkZXIpLlxyXG4gICAgICAgICAqIEB0eXBlIHt7IGZ1bjpzdHJpbmcsIGFscGhhOm51bWJlciB9fSAqL1xyXG4gICAgICAgIHRoaXMuc3RyZXRjaGluZyA9IG9wdHMuc3RyZXRjaGluZ1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgc2FtcGxlIG9mIHRoZSBjb2xvciByYW1wLlxyXG4gICAgICAgICAqIFRoZSBjb2xvciBpcyBjb21wdXRlZCBvbiBHUFUgc2lkZSAoZnJhZ21lbnQgc2hhZGVyKSBiYXNlZCBvbiB0aG9zZSB2YWx1ZXMgKGxpbmVhciBpbnRlcnBvbGF0aW9uKS5cclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPHN0cmluZz59ICovXHJcbiAgICAgICAgdGhpcy5jb2xvcnMgPVxyXG4gICAgICAgICAgICBvcHRzLmNvbG9ycyB8fFxyXG4gICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgICAncmdiKDE1OCwgMSwgNjYpJyxcclxuICAgICAgICAgICAgICAgICdyZ2IoMjQ4LCAxNDIsIDgzKScsXHJcbiAgICAgICAgICAgICAgICAncmdiKDI1MSwgMjQ4LCAxNzYpJyxcclxuICAgICAgICAgICAgICAgICdyZ2IoMTM3LCAyMDcsIDE2NSknLFxyXG4gICAgICAgICAgICAgICAgJ3JnYig5NCwgNzksIDE2MiknLFxyXG4gICAgICAgICAgICBdLnJldmVyc2UoKVxyXG4gICAgICAgIGlmIChvcHRzLmNvbG9yKVxyXG4gICAgICAgICAgICB0aGlzLmNvbG9ycyA9IFtcclxuICAgICAgICAgICAgICAgIG9wdHMuY29sb3IoMCksXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuMiksXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuNCksXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuNiksXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuOCksXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDEpLFxyXG4gICAgICAgICAgICBdXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERlZmluZSB0aGUgb3BhY2l0eSBvZiB0aGUgc3R5bGUsIHdpdGhpbiBbMCwxXS5cclxuICAgICAgICAgKiBJZiB0aGlzIG9wYWNpdHkgaXMgZGVmaW5lZCwgdGhlIGluZGl2aWR1YWwgY29sb3Igb3BhY2l0eSB3aWxsIGJlIGlnbm9yZWQuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLm9wYWNpdHkgPSBvcHRzLm9wYWNpdHkgLy8gKHIsemYpID0+IC4uLlxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiB0aGUgY2VsbHMsIGluIGdlb2dyYXBoaWNhbCB1bml0LiBBbGwgY2VsbHMgaGF2ZSB0aGUgc2FtZSBzaXplLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXHJcbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIC8vIChyZXNvbHV0aW9uLCB6ZikgPT4gLi4uXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2dcclxuICAgICAqL1xyXG4gICAgZHJhdyhjZWxscywgciwgY2cpIHtcclxuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcqKiogU3F1YXJlQ29sb3JXR0xTdHlsZSBkcmF3JylcclxuXHJcbiAgICAgICAgLy9maWx0ZXJcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxyXG5cclxuICAgICAgICAvL3pvb20gZmFjdG9yXHJcbiAgICAgICAgY29uc3QgemYgPSBjZy5nZXRaZigpXHJcblxyXG4gICAgICAgIC8vY29tcHV0ZSBjb2xvciB2YXJpYWJsZSBzdGF0aXN0aWNzXHJcbiAgICAgICAgY29uc3Qgc3RhdENvbG9yID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5jb2xvckNvbF0sIHRydWUpXHJcbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignICAgY29sb3Igc3RhdHMgY29tcHV0YXRpb24nKVxyXG5cclxuICAgICAgICBpZiAoIXN0YXRDb2xvcikgcmV0dXJuXHJcblxyXG4gICAgICAgIC8vY3JlYXRlIGNhbnZhcyBhbmQgd2ViZ2wgcmVuZGVyZXJcclxuICAgICAgICAvL2ZvciBvcGFjaXR5IGNvbnRyb2wsIHNlZTogaHR0cHM6Ly93ZWJnbGZ1bmRhbWVudGFscy5vcmcvd2ViZ2wvbGVzc29ucy93ZWJnbC1hbmQtYWxwaGEuaHRtbFxyXG4gICAgICAgIGNvbnN0IGN2V0dMID0gbWFrZVdlYkdMQ2FudmFzKFxyXG4gICAgICAgICAgICBjZy53ICsgJycsXHJcbiAgICAgICAgICAgIGNnLmggKyAnJyxcclxuICAgICAgICAgICAgdGhpcy5vcGFjaXR5ICE9IHVuZGVmaW5lZCA/IHsgcHJlbXVsdGlwbGllZEFscGhhOiBmYWxzZSB9IDogdW5kZWZpbmVkXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmICghY3ZXR0wpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gd2ViR0wnKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1vbml0b3IpIG1vbml0b3JEdXJhdGlvbignICAgd2ViIEdMIGNhbnZhcyBjcmVhdGlvbicpXHJcblxyXG4gICAgICAgIC8vYWRkIHZlcnRpY2UgYW5kIGZyYWdtZW50IGRhdGFcclxuICAgICAgICBjb25zdCByMiA9IHIgLyAyXHJcbiAgICAgICAgY29uc3QgdmVydGljZXNCdWZmZXIgPSBbXVxyXG4gICAgICAgIGNvbnN0IHRCdWZmZXIgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMudEZ1bihjW3RoaXMuY29sb3JDb2xdLCByLCBzdGF0Q29sb3IpXHJcbiAgICAgICAgICAgIGlmICh0ID09IG51bGwgfHwgdCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIHZlcnRpY2VzQnVmZmVyLnB1c2goYy54ICsgcjIsIGMueSArIHIyKVxyXG4gICAgICAgICAgICB0QnVmZmVyLnB1c2godCA+IDEgPyAxIDogdCA8IDAgPyAwIDogdClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyAgIHdlYmdsIGRyYXdpbmcgZGF0YSBwcmVwYXJhdGlvbicpXHJcblxyXG4gICAgICAgIC8vY29tcHV0ZSBwaXhlbCBzaXplXHJcbiAgICAgICAgY29uc3Qgc2l6ZUdlbyA9IHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZShyLCB6ZikgOiByICsgMC4yICogemZcclxuXHJcbiAgICAgICAgLy9jb21wdXRlIG9wYWNpdHlcclxuICAgICAgICBjb25zdCBvcCA9IHRoaXMub3BhY2l0eSA/IHRoaXMub3BhY2l0eShyLCB6ZikgOiB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICBjb25zdCB3Z3AgPSBuZXcgV2ViR0xTcXVhcmVDb2xvcmluZ0FkdmFuY2VkKGN2V0dMLmdsLCB0aGlzLmNvbG9ycywgdGhpcy5zdHJldGNoaW5nLCBzaXplR2VvIC8gemYsIG9wKVxyXG5cclxuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcgICB3ZWJnbCBwcm9ncmFtIHByZXBhcmF0aW9uJylcclxuXHJcbiAgICAgICAgLy9kcmF3XHJcbiAgICAgICAgd2dwLmRyYXcodmVydGljZXNCdWZmZXIsIHRCdWZmZXIsIGNnLmdldFdlYkdMVHJhbnNmb3JtKCkpXHJcblxyXG4gICAgICAgIGlmIChtb25pdG9yKSBtb25pdG9yRHVyYXRpb24oJyAgIHdlYmdsIGRyYXdpbmcnKVxyXG5cclxuICAgICAgICAvL2RyYXcgaW4gY2FudmFzIGdlb1xyXG4gICAgICAgIGNnLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxyXG4gICAgICAgIGNnLmN0eC5kcmF3SW1hZ2UoY3ZXR0wuY2FudmFzLCAwLCAwKVxyXG5cclxuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcgICBjYW52YXMgZHJhd2luZycpXHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcclxuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcjogciwgemY6IHpmLCBzQ29sb3I6IHN0YXRDb2xvciB9KVxyXG5cclxuICAgICAgICBpZiAobW9uaXRvcikgbW9uaXRvckR1cmF0aW9uKCcqKiogU3F1YXJlQ29sb3JXR0xTdHlsZSBlbmQgZHJhdycpXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL1N0eWxlLmpzJ1xyXG5cclxuLyoqXHJcbiAqXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTdHJva2VTdHlsZSBleHRlbmRzIFN0eWxlIHtcclxuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpXHJcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cclxuXHJcbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciBjb2xvci5cclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuc3Ryb2tlQ29sb3JDb2wgPSBvcHRzLnN0cm9rZUNvbG9yQ29sXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIHN0cm9rZS5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCk6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSBvcHRzLnN0cm9rZUNvbG9yIHx8ICgoKSA9PiAnIzY2NicpXHJcblxyXG4gICAgICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uL2F0dHJpYnV0ZSBvZiB0aGUgdGFidWxhciBkYXRhIHdoZXJlIHRvIHJldHJpZXZlIHRoZSB2YXJpYWJsZSBmb3Igc2l6ZS5cclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuc2l6ZUNvbCA9IG9wdHMuc2l6ZUNvbFxyXG5cclxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgYSBjZWxsIGluIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZVxyXG5cclxuICAgICAgICAvKiogVGhlIHN0cm9rZSBsaW5lIHdpZHRoLCBpbiBwaXhlbHMuXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnN0cm9rZVdpZHRoQ29sID0gb3B0cy5zdHJva2VXaWR0aENvbFxyXG5cclxuICAgICAgICAvKiogVGhlIHN0cm9rZSBsaW5lIHdpZHRoIGluIGdlb2dyYXBoaWNhbCB1bml0LlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgIHRoaXMuc3Ryb2tlV2lkdGggPSBvcHRzLnN0cm9rZVdpZHRoIC8vICh2LHIscyx6KT0+Li4uXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2hhcGUgb2YgYSBjZWxsLlxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGwpOmltcG9ydChcIi4uL1N0eWxlXCIpLlNoYXBlfSAqL1xyXG4gICAgICAgIHRoaXMuc2hhcGUgPSBvcHRzLnNoYXBlIHx8ICgoKSA9PiAnc3F1YXJlJylcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgY2VsbHMgYXMgc3F1YXJlcywgd2l0aCB2YXJpb3VzIGNvbG9ycyBhbmQgc2l6ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2dcclxuICAgICAqL1xyXG4gICAgZHJhdyhjZWxscywgciwgY2cpIHtcclxuICAgICAgICAvL2ZpbHRlclxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXHJcblxyXG4gICAgICAgIC8vem9vbSBmYWN0b3JcclxuICAgICAgICBjb25zdCB6ZiA9IGNnLmdldFpmKClcclxuXHJcbiAgICAgICAgbGV0IHN0YXRDb2xvclxyXG4gICAgICAgIGlmICh0aGlzLnN0cm9rZUNvbG9yQ29sKSBzdGF0Q29sb3IgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLnN0cm9rZUNvbG9yQ29sXSwgdHJ1ZSlcclxuXHJcbiAgICAgICAgbGV0IHN0YXRTaXplXHJcbiAgICAgICAgaWYgKHRoaXMuc2l6ZUNvbCkgc3RhdFNpemUgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLnNpemVDb2xdLCB0cnVlKVxyXG5cclxuICAgICAgICBsZXQgc3RhdFdpZHRoXHJcbiAgICAgICAgaWYgKHRoaXMuc3Ryb2tlV2lkdGhDb2wpIHN0YXRXaWR0aCA9IFN0eWxlLmdldFN0YXRpc3RpY3MoY2VsbHMsIChjKSA9PiBjW3RoaXMuc3Ryb2tlV2lkdGhDb2xdLCB0cnVlKVxyXG5cclxuICAgICAgICAvL2RyYXcgd2l0aCBIVE1MIGNhbnZhc1xyXG4gICAgICAgIC8vaW4gZ2VvIGNvb3JkaW5hdGVzXHJcbiAgICAgICAgY2cuc2V0Q2FudmFzVHJhbnNmb3JtKClcclxuXHJcbiAgICAgICAgY29uc3QgcjIgPSByICogMC41XHJcbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xyXG4gICAgICAgICAgICAvL2NvbG9yXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuc3Ryb2tlQ29sb3JcclxuICAgICAgICAgICAgICAgID8gdGhpcy5zdHJva2VDb2xvcihjZWxsW3RoaXMuc3Ryb2tlQ29sb3JDb2xdLCByLCBzdGF0Q29sb3IpXHJcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcclxuICAgICAgICAgICAgY2cuY3R4LnN0cm9rZVN0eWxlID0gY29sXHJcblxyXG4gICAgICAgICAgICAvL3NpemVcclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLGltcG9ydChcIi4uL1N0eWxlXCIpLlN0YXR8dW5kZWZpbmVkLG51bWJlcik6bnVtYmVyfSAqL1xyXG4gICAgICAgICAgICBsZXQgc18gPSB0aGlzLnNpemUgfHwgKCgpID0+IHIpXHJcbiAgICAgICAgICAgIC8vc2l6ZSAtIGluIGdlbyB1bml0XHJcbiAgICAgICAgICAgIGNvbnN0IHNHID0gc18oY2VsbFt0aGlzLnNpemVDb2xdLCByLCBzdGF0U2l6ZSwgemYpXHJcblxyXG4gICAgICAgICAgICAvL3dpZHRoXHJcbiAgICAgICAgICAgIGNvbnN0IHdpID0gdGhpcy5zdHJva2VXaWR0aFxyXG4gICAgICAgICAgICAgICAgPyB0aGlzLnN0cm9rZVdpZHRoKGNlbGxbdGhpcy5zdHJva2VXaWR0aENvbF0sIHIsIHN0YXRXaWR0aCwgemYpXHJcbiAgICAgICAgICAgICAgICA6IDEgKiB6ZlxyXG4gICAgICAgICAgICBpZiAoIXdpIHx8IHdpIDw9IDApIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIGNnLmN0eC5saW5lV2lkdGggPSB3aVxyXG5cclxuICAgICAgICAgICAgLy9zaGFwZVxyXG4gICAgICAgICAgICBjb25zdCBzaGFwZSA9IHRoaXMuc2hhcGUgPyB0aGlzLnNoYXBlKGNlbGwpIDogJ3NxdWFyZSdcclxuICAgICAgICAgICAgaWYgKHNoYXBlID09PSAnbm9uZScpIGNvbnRpbnVlXHJcblxyXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcclxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgciwgemYpXHJcblxyXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdzcXVhcmUnKSB7XHJcbiAgICAgICAgICAgICAgICAvL2RyYXcgc3F1YXJlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkID0gciAqICgxIC0gc0cgLyByKSAqIDAuNVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgucmVjdChjZWxsLnggKyBkICsgb2Zmc2V0LmR4LCBjZWxsLnkgKyBkICsgb2Zmc2V0LmR5LCBzRywgc0cpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ2NpcmNsZScpIHtcclxuICAgICAgICAgICAgICAgIC8vZHJhdyBjaXJjbGVcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmFyYyhjZWxsLnggKyByMiArIG9mZnNldC5keCwgY2VsbC55ICsgcjIgKyBvZmZzZXQuZHksIHNHICogMC41LCAwLCAyICogTWF0aC5QSSwgZmFsc2UpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHguc3Ryb2tlKClcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ2RpYW1vbmQnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzMiA9IHNHICogMC41XHJcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKClcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oY2VsbC54ICsgcjIgLSBzMiwgY2VsbC55ICsgcjIpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGNlbGwueCArIHIyLCBjZWxsLnkgKyByMiArIHMyKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LmxpbmVUbyhjZWxsLnggKyByMiArIHMyLCBjZWxsLnkgKyByMilcclxuICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oY2VsbC54ICsgcjIsIGNlbGwueSArIHIyIC0gczIpXHJcbiAgICAgICAgICAgICAgICBjZy5jdHgubGluZVRvKGNlbGwueCArIHIyIC0gczIsIGNlbGwueSArIHIyKVxyXG4gICAgICAgICAgICAgICAgY2cuY3R4LnN0cm9rZSgpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdkb251dCcpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2hhcGU6JyArIHNoYXBlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXHJcbiAgICAgICAgLy90aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcjogcmVzb2x1dGlvbiwgemY6IHpmLCBzU2l6ZTogc3RhdFNpemUsIHNDb2xvcjogc3RhdENvbG9yIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgU3F1YXJlQ29sb3JXR0xTdHlsZSB9IGZyb20gJy4vU3F1YXJlQ29sb3JXR0xTdHlsZS5qcydcclxuaW1wb3J0IHsgU2lkZVN0eWxlIH0gZnJvbSAnLi9TaWRlU3R5bGUuanMnXHJcblxyXG4vKipcclxuICpcclxuICogQHNlZSBodHRwczovL21hbmlmb2xkLm5ldC9kb2MvbWZkOS9leGFtcGxlX190YW5ha2FfY29udG91cnMuaHRtXHJcbiAqXHJcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcclxuICovXHJcbmV4cG9ydCBjbGFzcyBUYW5ha2FTdHlsZSB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXkuPGltcG9ydChcIi4uL1N0eWxlXCIpLlN0eWxlPn1cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGdldChjb2wsIG9wdHMpIHtcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvL2dldCBjb2xvcnMgZnJvbSBkMyByYW1wcywgaWYgJ25iJyBpcyBzcGVjaWZpZWRcclxuICAgICAgICBpZiAob3B0cy5uYiAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKG9wdHMubmIgPCAyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjb2xvcnMgaW4gdGFuYWthICg8Mik6ICcgKyBvcHRzLm5iKVxyXG4gICAgICAgICAgICAgICAgb3B0cy5uYiA9IDJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIW9wdHMuY29sb3IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2NvbG9yIGZ1bmN0aW9uIG5vdCBkZWZpbmVkIGluIHRhbmFrYScpXHJcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yID0gKCkgPT4gJ2dyYXknXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3B0cy5jb2xvcnMgPSBbXVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdHMubmI7IGkrKykgb3B0cy5jb2xvcnMucHVzaChvcHRzLmNvbG9yKGkgLyAob3B0cy5uYiAtIDEpKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjb2xvcnMuXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxzdHJpbmc+fSAqL1xyXG4gICAgICAgIG9wdHMuY29sb3JzID0gb3B0cy5jb2xvcnMgfHwgWycjYTliYjllJywgJyNjOWRjYWEnLCAnI2ZkZTg5ZicsICcjZjlhNTc5JywgJyNlYjQ0NGInXVxyXG4gICAgICAgIGNvbnN0IG5iID0gb3B0cy5jb2xvcnMubGVuZ3RoXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHRvIGNvbXB1dGUgJ3QnIGZyb20gdGhlIHZhbHVlIHZcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0KTpudW1iZXJ9ICovXHJcbiAgICAgICAgb3B0cy50RnVuID0gb3B0cy50RnVuIHx8ICgodiwgciwgcykgPT4gKHYgLSBzLm1pbikgLyAocy5tYXggLSBzLm1pbikpXHJcblxyXG4gICAgICAgIC8vc2hhZG93IGNvbG9yc1xyXG4gICAgICAgIG9wdHMuY29sRGFyayA9IG9wdHMuY29sRGFyayB8fCAnIzExMSdcclxuICAgICAgICBvcHRzLmNvbEJyaWdodCA9IG9wdHMuY29sQnJpZ2h0IHx8ICcjZGRkJ1xyXG5cclxuICAgICAgICAvL3dpZHRoIG9mIHRoZSBzZWdtZW50IChzaGFyZSBvZiB0aGUgcmVzb2x1dGlvbilcclxuICAgICAgICBvcHRzLndpZHRoRmFjdG9yID0gb3B0cy53aWR0aEZhY3RvciB8fCAwLjA4XHJcblxyXG4gICAgICAgIC8vc2hhZGluZ1xyXG4gICAgICAgIG9wdHMubmV3U2hhZGluZyA9IG9wdHMubmV3U2hhZGluZ1xyXG4gICAgICAgIG9wdHMubmV3U2hhZGluZ1dpZHRoUGl4ID0gb3B0cy5uZXdTaGFkaW5nV2lkdGhQaXggfHwgMlxyXG4gICAgICAgIC8vdHJhbnNwYXJlbmN5IHZhbHVlLCB3aXRoaW4gWzAsMV1cclxuICAgICAgICBvcHRzLm5ld1NoYWRpbmdUciA9XHJcbiAgICAgICAgICAgIG9wdHMubmV3U2hhZGluZ1RyIHx8XHJcbiAgICAgICAgICAgICgoc2lkZVZhbHVlLCBzaWRlU3RhdCkgPT5cclxuICAgICAgICAgICAgICAgIE1hdGguYWJzKHNpZGVWYWx1ZSkgLyBNYXRoLm1heChNYXRoLmFicyhzaWRlU3RhdC5taW4pLCBNYXRoLmFicyhzaWRlU3RhdC5tYXgpKSlcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHQgQSBjZWxsIHQgdmFsdWUsIHdpdGhpbiBbMCwxXS5cclxuICAgICAgICAgKiBAcmV0dXJucyB0aGUgY2xhc3MgbnVtYmVyIGZvciB0aGUgdmFsdWVcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBnZXRDbGFzcyA9ICh0KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChpc05hTih0KSB8fCB0ID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5leHBlY3RlZCB0IHZhbHVlIDE6ICcgKyB0KVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIC05XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSBpZiAodCA8PSAoaSArIDEpIC8gbmIpIHJldHVybiBpXHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuZXhwZWN0ZWQgdCB2YWx1ZSAyOiAnICsgdClcclxuICAgICAgICAgICAgcmV0dXJuIC05XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb2xTdHlsZSA9IG5ldyBTcXVhcmVDb2xvcldHTFN0eWxlKHtcclxuICAgICAgICAgICAgY29sb3JDb2w6IGNvbCxcclxuICAgICAgICAgICAgY29sb3JzOiBvcHRzLmNvbG9ycyxcclxuICAgICAgICAgICAgdEZ1bjogKHYsIHIsIHMpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBvcHRzLnRGdW4odiwgciwgcylcclxuICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBnZXRDbGFzcyh0KVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGMgLyAobmIgLSAxKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAvL3N0cmV0Y2hpbmc6IHsgZnVuOiBcImV4cFJldlwiLCBhbHBoYTogLTcgfSxcclxuICAgICAgICAgICAgc2l6ZTogKHIsIHpmKSA9PiByICsgMC41ICogemYsIC8vdGhhdCBpcyB0byBlbnN1cmUgbm8gZ2FwIGJldHdlZW4gc2FtZSBjbGFzcyBjZWxscyBpcyB2aXNpYmxlXHJcbiAgICAgICAgICAgIGZpbHRlcjogb3B0cy5maWx0ZXIsXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICBpZiBubyB3ZWIgZ2w6ICAgIFxyXG4gICAgICAgICAgICBjb25zdCBjb2xTdHlsZSA9IG5ldyBTaGFwZUNvbG9yU2l6ZVN0eWxlKHtcclxuICAgICAgICAgICAgICAgIGNvbG9yQ29sOiBjb2wsXHJcbiAgICAgICAgICAgICAgICAvL3RoZSBjb2xvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBjbGFzc1xyXG4gICAgICAgICAgICAgICAgY29sb3I6ICh2LCByLCBzLCB6ZikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2ID09IDAgJiYgb3B0cy50RnVuICYmIGlzTmFOKG9wdHMudEZ1bih2LCByLCBzKSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0cy5jb2xvcnNbZ2V0Q2xhc3Mob3B0cy50RnVuID8gb3B0cy50RnVuKHYsIHIsIHMpIDogdildXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgc2hhcGU6ICgpID0+IFwic3F1YXJlXCIsXHJcbiAgICAgICAgICAgICAgICBzaXplOiAodiwgciwgcywgemYpID0+IHIgKyAwLjUgKiB6ZiwgLy90aGF0IGlzIHRvIGVuc3VyZSBubyBnYXAgYmV0d2VlbiBzYW1lIGNsYXNzIGNlbGxzIGlzIHZpc2libGVcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAqL1xyXG5cclxuICAgICAgICAvKiogVGhlIHNpZGUgc3R5bGUsIGZvciB0aGUgc2hhZG93IGVmZmVjdCAqL1xyXG4gICAgICAgIGNvbnN0IHNpZGVTdHlsZSA9IG5ldyBTaWRlU3R5bGUoe1xyXG4gICAgICAgICAgICB2YWx1ZUNvbDogY29sLFxyXG4gICAgICAgICAgICB2YWx1ZTogKHYxLCB2MiwgciwgcywgemYpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vY29tcHV0ZSB0aGUgbnVtYmVyIG9mIGNsYXNzZXMgb2YgZGlmZmVyZW5jZVxyXG4gICAgICAgICAgICAgICAgaWYgKHYxID09PSB1bmRlZmluZWQgJiYgdjIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDBcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gb3B0cy50RnVuKHYxLCByLCBzKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ID09IHVuZGVmaW5lZCB8fCBpc05hTih0KSkgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHZhbHVlOiAnICsgdjEgKyAnIC0gJyArIHQpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGdldENsYXNzKHQpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMgKyAxXHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHYxID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gb3B0cy50RnVuKHYyLCByLCBzKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ID09IHVuZGVmaW5lZCB8fCBpc05hTih0KSkgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHZhbHVlOiAnICsgdjIgKyAnIC0gJyArIHQpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGdldENsYXNzKHQpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1jIC0gMVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgdDEgPSBvcHRzLnRGdW4odjEsIHIsIHMpXHJcbiAgICAgICAgICAgICAgICBpZiAodDEgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKHQxKSkgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHZhbHVlOiAnICsgdjEgKyAnIC0gJyArIHQxKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgdDIgPSBvcHRzLnRGdW4odjIsIHIsIHMpXHJcbiAgICAgICAgICAgICAgICBpZiAodDIgPT0gdW5kZWZpbmVkIHx8IGlzTmFOKHQyKSkgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHZhbHVlOiAnICsgdjIgKyAnIC0gJyArIHQyKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgYzEgPSBnZXRDbGFzcyh0MSlcclxuICAgICAgICAgICAgICAgIGNvbnN0IGMyID0gZ2V0Q2xhc3ModDIpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gLWMyICsgYzFcclxuICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgIGNvbG9yOiBvcHRzLm5ld1NoYWRpbmdcclxuICAgICAgICAgICAgICAgID8gLy9ibGFjayB3aXRoIHRyYW5zcGFyZW5jeSBkZXBlbmRpbmcgb24gZGlmZmVyZW5jZVxyXG4gICAgICAgICAgICAgICAgICAoc2lkZSwgciwgcywgeikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHIgPSBvcHRzLm5ld1NoYWRpbmdUcihzaWRlLnZhbHVlLCBzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChzaWRlLnZhbHVlID4gMCAmJiBzaWRlLm9yID09PSAnaCcpIHx8IChzaWRlLnZhbHVlIDwgMCAmJiBzaWRlLm9yID09PSAndicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmdiYSgyNTUsMjU1LDEwMCwnICsgdHIgKyAnKSdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdyZ2JhKDAsMCwwLCcgKyB0ciArICcpJ1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA6IC8vd2hpdGUgb3IgYmxhY2ssIGRlcGVuZGluZyBvbiBvcmllbnRhdGlvbiBhbmQgdmFsdWVcclxuICAgICAgICAgICAgICAgICAgKHNpZGUsIHIsIHMsIHopID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWRlLnZhbHVlID09PSAwKSByZXR1cm5cclxuICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIFwiZ3JheVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lkZS5vciA9PT0gJ3YnKSByZXR1cm4gc2lkZS52YWx1ZSA8IDAgPyBvcHRzLmNvbEJyaWdodCA6IG9wdHMuY29sRGFya1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpZGUudmFsdWUgPCAwID8gb3B0cy5jb2xEYXJrIDogb3B0cy5jb2xCcmlnaHRcclxuICAgICAgICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgIHdpZHRoOiBvcHRzLm5ld1NoYWRpbmdcclxuICAgICAgICAgICAgICAgID8gLy9maWxsIHNpemVcclxuICAgICAgICAgICAgICAgICAgKHNpZGUsIHIsIHMsIHopID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRzLm5ld1NoYWRpbmdXaWR0aFBpeCAqIHpcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgOiAvL3dpZHRoIGRlcGVuZHMgb24gdGhlIHZhbHVlLCB0aGF0IGlzIHRoZSBudW1iZXIgb2YgY2xhc3NlcyBvZiBkaWZmZXJlbmNlXHJcbiAgICAgICAgICAgICAgICAgIChzaWRlLCByLCBzLCB6KSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgb3B0cy53aWR0aEZhY3RvciAqIHIgKiBNYXRoLmFicyhzaWRlLnZhbHVlKSAqIChzaWRlLm9yID09PSAndicgPyAwLjUgOiAxKSxcclxuXHJcbiAgICAgICAgICAgIGZpbHRlcjogb3B0cy5maWx0ZXIsXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgcmV0dXJuIFtjb2xTdHlsZSwgc2lkZVN0eWxlXVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9TdHlsZS5qcydcclxuXHJcbi8qKlxyXG4gKlxyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVGV4dFN0eWxlIGV4dGVuZHMgU3R5bGUge1xyXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cylcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG5cclxuICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGNvbHVtbi9hdHRyaWJ1dGUgb2YgdGhlIHRhYnVsYXIgZGF0YSB3aGVyZSB0byByZXRyaWV2ZSB0aGUgdmFyaWFibGUgZm9yIHRleHQuXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnRleHRDb2wgPSBvcHRzLnRleHRDb2xcclxuXHJcbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0ZXh0IG9mIGEgY2VsbC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCk6c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMudGV4dCA9IG9wdHMudGV4dCB8fCAoKHYsIHIsIHMsIHopID0+ICdYJylcclxuXHJcbiAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4vYXR0cmlidXRlIG9mIHRoZSB0YWJ1bGFyIGRhdGEgd2hlcmUgdG8gcmV0cmlldmUgdGhlIHZhcmlhYmxlIGZvciBjb2xvci5cclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuY29sb3JDb2wgPSBvcHRzLmNvbG9yQ29sXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNlbGwuXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsaW1wb3J0KFwiLi4vU3R5bGVcIikuU3RhdHx1bmRlZmluZWQpOnN0cmluZ30gKi9cclxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJyNFQTZCQUMnKVxyXG5cclxuICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGNvbHVtbi9hdHRyaWJ1dGUgb2YgdGhlIHRhYnVsYXIgZGF0YSB3aGVyZSB0byByZXRyaWV2ZSB0aGUgdmFyaWFibGUgZm9yIGZvbnQgc2l6ZS5cclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuZm9udFNpemVDb2wgPSBvcHRzLmZvbnRTaXplQ29sXHJcblxyXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgZm9udCBzaXplIG9mIGEgY2VsbCBpbiBnZW8gdW5pdC5cclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcixpbXBvcnQoXCIuLi9TdHlsZVwiKS5TdGF0fHVuZGVmaW5lZCxudW1iZXIpOm51bWJlcn0gKi9cclxuICAgICAgICB0aGlzLmZvbnRTaXplID0gb3B0cy5mb250U2l6ZSB8fCAoKHYsIHIsIHMsIHopID0+IHIgKiAwLjgpXHJcblxyXG4gICAgICAgIC8qKiBUaGUgdGV4dCBmb250IGZhbWlseS5cclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuZm9udEZhbWlseSA9IG9wdHMuZm9udEZhbWlseSB8fCAnQXJpYWwnXHJcblxyXG4gICAgICAgIC8qKiBUaGUgdGV4dCBmb250IHdlaWdodC5cclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xyXG4gICAgICAgIHRoaXMuZm9udFdlaWdodCA9IG9wdHMuZm9udFdlaWdodCB8fCAnYm9sZCdcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgY2VsbHMgYXMgdGV4dC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJcclxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gY2dcclxuICAgICAqL1xyXG4gICAgZHJhdyhjZWxscywgciwgY2cpIHtcclxuICAgICAgICAvL2ZpbHRlclxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXHJcblxyXG4gICAgICAgIC8vem9vbSBmYWN0b3JcclxuICAgICAgICBjb25zdCB6ZiA9IGNnLmdldFpmKClcclxuXHJcbiAgICAgICAgbGV0IHN0YXRUZXh0XHJcbiAgICAgICAgaWYgKHRoaXMudGV4dENvbCkge1xyXG4gICAgICAgICAgICAvL2NvbXB1dGUgdGV4dCB2YXJpYWJsZSBzdGF0aXN0aWNzXHJcbiAgICAgICAgICAgIHN0YXRUZXh0ID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy50ZXh0Q29sXSwgdHJ1ZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzdGF0Q29sb3JcclxuICAgICAgICBpZiAodGhpcy5jb2xvckNvbCkge1xyXG4gICAgICAgICAgICAvL2NvbXB1dGUgY29sb3IgdmFyaWFibGUgc3RhdGlzdGljc1xyXG4gICAgICAgICAgICBzdGF0Q29sb3IgPSBTdHlsZS5nZXRTdGF0aXN0aWNzKGNlbGxzLCAoYykgPT4gY1t0aGlzLmNvbG9yQ29sXSwgdHJ1ZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzdGF0Rm9udFNpemVcclxuICAgICAgICBpZiAodGhpcy5mb250U2l6ZUNvbCkge1xyXG4gICAgICAgICAgICAvL2lmIHNpemUgaXMgdXNlZCwgc29ydCBjZWxscyBieSBzaXplIHNvIHRoYXQgdGhlIGJpZ2dlc3QgYXJlIGRyYXduIGZpcnN0XHJcbiAgICAgICAgICAgIGNlbGxzLnNvcnQoKGMxLCBjMikgPT4gYzJbdGhpcy5mb250U2l6ZUNvbF0gLSBjMVt0aGlzLmZvbnRTaXplQ29sXSlcclxuICAgICAgICAgICAgLy9hbmQgY29tcHV0ZSBzaXplIHZhcmlhYmxlIHN0YXRpc3RpY3NcclxuICAgICAgICAgICAgc3RhdEZvbnRTaXplID0gU3R5bGUuZ2V0U3RhdGlzdGljcyhjZWxscywgKGMpID0+IGNbdGhpcy5mb250U2l6ZUNvbF0sIHRydWUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2RyYXcgd2l0aCBIVE1MIGNhbnZhc1xyXG4gICAgICAgIC8vaW4gc2NyZWVuIGNvb3JkaW5hdGVzXHJcbiAgICAgICAgY2cuaW5pdENhbnZhc1RyYW5zZm9ybSgpXHJcblxyXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcclxuICAgICAgICAgICAgLy9nZXQgY2VsbCB0ZXh0XHJcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnRleHQgPyB0aGlzLnRleHQoY2VsbFt0aGlzLnRleHRDb2xdLCByLCBzdGF0VGV4dCkgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgaWYgKHRleHQgPT0gdW5kZWZpbmVkIHx8IHRleHQgPT0gbnVsbCB8fCB0ZXh0ICsgJycgPT09ICcnKSBjb250aW51ZVxyXG5cclxuICAgICAgICAgICAgLy9jb2xvclxyXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsW3RoaXMuY29sb3JDb2xdLCByLCBzdGF0Q29sb3IpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIGlmICghY29sKSBjb250aW51ZVxyXG4gICAgICAgICAgICBjZy5jdHguZmlsbFN0eWxlID0gY29sXHJcblxyXG4gICAgICAgICAgICAvL2ZvbnQgc2l6ZVxyXG4gICAgICAgICAgICAvL3NpemUgLSBpbiBwaXhlbCB1bml0XHJcbiAgICAgICAgICAgIGNvbnN0IGZvbnRTaXplUGl4ID0gdGhpcy5mb250U2l6ZShjZWxsW3RoaXMuZm9udFNpemVDb2xdLCByLCBzdGF0Rm9udFNpemUsIHpmKSAvIHpmXHJcblxyXG4gICAgICAgICAgICAvL3NldCBmb250XHJcbiAgICAgICAgICAgIGNvbnN0IGZvbnRGYW1pbHkgPSB0aGlzLmZvbnRGYW1pbHkgfHwgJ0FyaWFsJ1xyXG4gICAgICAgICAgICBjb25zdCBmb250V2VpZ2h0ID0gdGhpcy5mb250V2VpZ2h0IHx8ICdib2xkJ1xyXG4gICAgICAgICAgICBjZy5jdHguZm9udCA9IGZvbnRXZWlnaHQgKyAnICcgKyBmb250U2l6ZVBpeCArICdweCAnICsgZm9udEZhbWlseVxyXG5cclxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XHJcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGNlbGwsIHIsIHpmKVxyXG5cclxuICAgICAgICAgICAgLy90ZXh0IHBvc2l0aW9uXHJcbiAgICAgICAgICAgIGNnLmN0eC50ZXh0QWxpZ24gPSAnY2VudGVyJ1xyXG4gICAgICAgICAgICBjb25zdCB0eCA9IGNnLmdlb1RvUGl4WChjZWxsLnggKyByICogMC41ICsgb2Zmc2V0LmR4KVxyXG4gICAgICAgICAgICBjb25zdCB0eSA9IGNnLmdlb1RvUGl4WShjZWxsLnkgKyByICogMC41ICsgb2Zmc2V0LmR5KSArIGZvbnRTaXplUGl4ICogMC4zIC8vaXQgc2hvdWxkIGJlIDAuNSBidXQgMC4zIHNlZW1zIHRvIHdvcmsgYmV0dGVyXHJcblxyXG4gICAgICAgICAgICAvL2RyYXcgdGhlIHRleHRcclxuICAgICAgICAgICAgY2cuY3R4LmZpbGxUZXh0KHRleHQsIHR4LCB0eSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcclxuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcjogciwgemY6IHpmLCBzQ29sb3I6IHN0YXRDb2xvciB9KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnVpbGQgYSBmdW5jdGlvbiBbMCwxXS0+c3RyaW5nIGZvciBjaGFyYWN0ZXJzIGxlZ2VuZFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGNoYXJzXHJcbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBnZXRDaGFyTGVnZW5kRnVuKGNoYXJzKSB7XHJcbiAgICAgICAgY29uc3QgbmIgPSBjaGFycy5sZW5ndGhcclxuICAgICAgICByZXR1cm4gKHQpID0+ICh0ID09IDAgPyAnJyA6IHQgPT0gMSA/IGNoYXJzW25iIC0gMV0gOiBjaGFyc1tNYXRoLmZsb29yKHQgKiBuYildKVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgY2xhc3MgaWQgZnJvbSBhIHZhbHVlIGFuZCBjbGFzcyBicmVhayB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHYgdGhlIHZhbHVlXHJcbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IGJyZWFrcyB0aGUgYnJlYWtzXHJcbiAqIEByZXR1cm5zIFRoZSBjbGFzcyBpZCwgZnJvbSAwIHRvIGJyZWFrcy5sZW5ndGhcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGFzcyh2LCBicmVha3MpIHtcclxuICAgIGlmICghYnJlYWtzKSByZXR1cm5cclxuICAgIGlmIChicmVha3MubGVuZ3RoID09IDApIHJldHVybiAwXHJcbiAgICBpZiAodiA8PSBicmVha3NbMF0pIHJldHVybiAwXHJcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGJyZWFrcy5sZW5ndGg7IGkrKykgaWYgKGJyZWFrc1tpIC0gMV0gPCB2ICYmIHYgPD0gYnJlYWtzW2ldKSByZXR1cm4gaVxyXG4gICAgcmV0dXJuIGJyZWFrcy5sZW5ndGhcclxufVxyXG5cclxuZXhwb3J0IGxldCBtb25pdG9yID0gZmFsc2VcclxuXHJcbmxldCBwcmV2aW91c0RhdGVcclxuZXhwb3J0IGZ1bmN0aW9uIG1vbml0b3JEdXJhdGlvbihtZXNzYWdlKSB7XHJcbiAgICBjb25zdCBub3dEYXRlID0gRGF0ZS5ub3coKVxyXG5cclxuICAgIC8vZmlyc3QgY2FsbFxyXG4gICAgaWYgKCFwcmV2aW91c0RhdGUpIHtcclxuICAgICAgICBwcmV2aW91c0RhdGUgPSBub3dEYXRlXHJcbiAgICAgICAgY29uc29sZS5sb2cocHJldmlvdXNEYXRlLCBtZXNzYWdlKVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGQgPSBub3dEYXRlIC0gcHJldmlvdXNEYXRlXHJcbiAgICBwcmV2aW91c0RhdGUgPSBub3dEYXRlXHJcbiAgICBjb25zb2xlLmxvZyhkLCBtZXNzYWdlKVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgaW5pdFNoYWRlclByb2dyYW0sIGNyZWF0ZVNoYWRlciB9IGZyb20gJy4vd2ViR0xVdGlscy5qcydcclxuaW1wb3J0IHsgY29sb3IgfSBmcm9tICdkMy1jb2xvcidcclxuXHJcbi8qKlxyXG4gKiBFdmVyeXRoaW5nIHRvIGVhc2lseSBkcmF3IGNvbG9yZWQgc3F1YXJlcyB3aXRoIHdlYkdMLlxyXG4gKiBBbGwgdGhlIHNhbWUgc2l6ZSwgYnV0IGRpZmZlcmVudCBmaWxsIGNvbG9yLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFdlYkdMU3F1YXJlQ29sb3Jpbmcge1xyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGdsLCBzaXplUGl4KSB7XHJcbiAgICAgICAgdGhpcy5nbCA9IGdsXHJcbiAgICAgICAgdGhpcy5zaXplUGl4ID0gc2l6ZVBpeCB8fCAxMC4wXHJcblxyXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IGluaXRTaGFkZXJQcm9ncmFtKFxyXG4gICAgICAgICAgICBnbCxcclxuICAgICAgICAgICAgY3JlYXRlU2hhZGVyKFxyXG4gICAgICAgICAgICAgICAgZ2wsXHJcbiAgICAgICAgICAgICAgICBnbC5WRVJURVhfU0hBREVSLFxyXG4gICAgICAgICAgICAgICAgYFxyXG4gICAgICAgICAgICBhdHRyaWJ1dGUgdmVjMiBwb3M7XHJcbiAgICAgICAgICAgIHVuaWZvcm0gZmxvYXQgc2l6ZVBpeDtcclxuICAgICAgICAgICAgdW5pZm9ybSBtYXQzIG1hdDtcclxuICAgICAgICAgICAgYXR0cmlidXRlIHZlYzQgY29sb3I7XHJcbiAgICAgICAgICAgIHZhcnlpbmcgdmVjNCB2Q29sb3I7XHJcbiAgICAgICAgICAgIHZvaWQgbWFpbigpIHtcclxuICAgICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQobWF0ICogdmVjMyhwb3MsIDEuMCksIDEuMCk7XHJcbiAgICAgICAgICAgICAgZ2xfUG9pbnRTaXplID0gc2l6ZVBpeDtcclxuICAgICAgICAgICAgICB2Q29sb3IgPSBjb2xvcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgYFxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBjcmVhdGVTaGFkZXIoXHJcbiAgICAgICAgICAgICAgICBnbCxcclxuICAgICAgICAgICAgICAgIGdsLkZSQUdNRU5UX1NIQURFUixcclxuICAgICAgICAgICAgICAgIGBcclxuICAgICAgICAgICAgcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XHJcbiAgICAgICAgICAgIHZhcnlpbmcgdmVjNCB2Q29sb3I7XHJcbiAgICAgICAgICAgIHZvaWQgbWFpbih2b2lkKSB7XHJcbiAgICAgICAgICAgICAgICB2ZWM0IHZDb2xvcl8gPSB2Q29sb3IgLyAyNTUuMDtcclxuICAgICAgICAgICAgICAgIHZDb2xvcl9bM10gPSAyNTUuMCAqIHZDb2xvcl9bM107XHJcbiAgICAgICAgICAgICAgICBnbF9GcmFnQ29sb3IgPSB2Q29sb3JfO1xyXG4gICAgICAgICAgICB9YFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGdsLnVzZVByb2dyYW0odGhpcy5wcm9ncmFtKVxyXG5cclxuICAgICAgICAvL2J1ZmZlciBkYXRhXHJcbiAgICAgICAgdGhpcy52ZXJ0aWNlc0J1ZmZlciA9IFtdXHJcbiAgICAgICAgdGhpcy5jb2xvcnNCdWZmZXIgPSBbXVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBBZGQgZGF0YSB0byB2ZXJ0aWNlcy9zaXplL2NvbG9yIGJ1ZmZlcnMgZm9yIGNvbG9yIHNxdWFyZXMgZHJhd2luZyAqL1xyXG4gICAgYWRkUG9pbnREYXRhKHhDLCB5QywgY29sKSB7XHJcbiAgICAgICAgLy9jb252ZXJ0IGNvbG9yXHJcbiAgICAgICAgY29uc3QgY2MgPSBjb2xvcihjb2wpXHJcbiAgICAgICAgLy9jb25zdCBjYyA9IHtyOjQ1LGc6ODcsYjo5OCxvcGFjaXR5OjAuOX1cclxuICAgICAgICBpZiAoIWNjKSByZXR1cm5cclxuXHJcbiAgICAgICAgLy92ZXJ0aWNlc1xyXG4gICAgICAgIHRoaXMudmVydGljZXNCdWZmZXIucHVzaCh4QywgeUMpXHJcbiAgICAgICAgLy9jb2xvclxyXG4gICAgICAgIHRoaXMuY29sb3JzQnVmZmVyLnB1c2goY2MuciwgY2MuZywgY2MuYiwgY2Mub3BhY2l0eSlcclxuICAgIH1cclxuXHJcbiAgICBhZGRQb2ludERhdGEyKHhDLCB5QywgciwgZywgYiwgb3BhY2l0eSkge1xyXG4gICAgICAgIC8vdmVydGljZXNcclxuICAgICAgICB0aGlzLnZlcnRpY2VzQnVmZmVyLnB1c2goeEMsIHlDKVxyXG4gICAgICAgIC8vY29sb3JcclxuICAgICAgICB0aGlzLmNvbG9yc0J1ZmZlci5wdXNoKHIsIGcsIGIsIG9wYWNpdHkpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqICAqL1xyXG4gICAgZHJhdyh0cmFuc2ZvTWF0KSB7XHJcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsXHJcblxyXG4gICAgICAgIC8vdmVydGljZSBkYXRhXHJcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGdsLmNyZWF0ZUJ1ZmZlcigpKVxyXG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KHRoaXMudmVydGljZXNCdWZmZXIpLCBnbC5TVEFUSUNfRFJBVylcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ3BvcycpXHJcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcclxuICAgICAgICAgICAgcG9zaXRpb24sXHJcbiAgICAgICAgICAgIDIsIC8vbnVtQ29tcG9uZW50c1xyXG4gICAgICAgICAgICBnbC5GTE9BVCwgLy90eXBlXHJcbiAgICAgICAgICAgIGZhbHNlLCAvL25vcm1hbGlzZVxyXG4gICAgICAgICAgICAwLCAvL3N0cmlkZVxyXG4gICAgICAgICAgICAwIC8vb2Zmc2V0XHJcbiAgICAgICAgKVxyXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKVxyXG5cclxuICAgICAgICAvL2NvbG9yIGRhdGFcclxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXHJcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodGhpcy5jb2xvcnNCdWZmZXIpLCBnbC5TVEFUSUNfRFJBVylcclxuICAgICAgICB2YXIgY29sb3IgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLnByb2dyYW0sICdjb2xvcicpXHJcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihjb2xvciwgNCwgZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKVxyXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGNvbG9yKVxyXG5cclxuICAgICAgICAvL3NpemVQaXhcclxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ3NpemVQaXgnKSwgMS4wICogdGhpcy5zaXplUGl4KVxyXG5cclxuICAgICAgICAvL3RyYW5zZm9ybWF0aW9uXHJcbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDNmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCAnbWF0JyksIGZhbHNlLCBuZXcgRmxvYXQzMkFycmF5KHRyYW5zZm9NYXQpKVxyXG5cclxuICAgICAgICAvLyBFbmFibGUgdGhlIGRlcHRoIHRlc3RcclxuICAgICAgICAvL2dsLmVuYWJsZShnbC5ERVBUSF9URVNUKTtcclxuICAgICAgICAvLyBDbGVhciB0aGUgY29sb3IgYnVmZmVyIGJpdFxyXG4gICAgICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpXHJcbiAgICAgICAgLy8gU2V0IHRoZSB2aWV3IHBvcnRcclxuICAgICAgICAvL2dsLnZpZXdwb3J0KDAsIDAsIGNnLncsIGNnLmgpO1xyXG5cclxuICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlBPSU5UUywgMCwgdGhpcy52ZXJ0aWNlc0J1ZmZlci5sZW5ndGggLyAyKVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuaW1wb3J0IHsgaW5pdFNoYWRlclByb2dyYW0sIGNyZWF0ZVNoYWRlciB9IGZyb20gJy4vd2ViR0xVdGlscy5qcydcclxuaW1wb3J0IHsgY29sb3IgfSBmcm9tICdkMy1jb2xvcidcclxuXHJcbi8qKlxyXG4gKiBFdmVyeXRoaW5nIHRvIGVhc2lseSBkcmF3IGNvbG9yZWQgc3F1YXJlcyB3aXRoIHdlYkdMLlxyXG4gKiBBbGwgdGhlIHNhbWUgc2l6ZSwgYnV0IGRpZmZlcmVudCBmaWxsIGNvbG9yLlxyXG4gKiBUaGUgY29sb3IgaW50ZXJwb2xhdGlvbiBpcyBjb21wdXRlZCBpbiB0aGUgZnJhZ21lbnQgc2hhZGVyIHByb2dyYW0sIGJ5IHRoZSBHUFUsIHRodXMgaXQgaXMgbGVzcyBmbGV4aWJsZSBidXQgZmFzdGVyLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFdlYkdMU3F1YXJlQ29sb3JpbmdBZHZhbmNlZCB7XHJcbiAgICAvL3NlZTpcclxuICAgIC8vaHR0cHM6Ly93ZWJnbGZ1bmRhbWVudGFscy5vcmcvd2ViZ2wvbGVzc29ucy9mci93ZWJnbC1zaGFkZXJzLWFuZC1nbHNsLmh0bWwjbGVzLXVuaWZvcm1zLWRhbnMtbGVzLXNoYWRlcnMtZGUtdmVydGV4XHJcbiAgICAvL2h0dHBzOi8vdGhlYm9va29mc2hhZGVycy5jb20vZ2xvc3NhcnkvP3NlYXJjaD1taXhcclxuICAgIC8vaHR0cHM6Ly90aGVib29rb2ZzaGFkZXJzLmNvbS8wNi9cclxuICAgIC8vaHR0cHM6Ly90aGVib29rb2ZzaGFkZXJzLmNvbS9nbG9zc2FyeS9cclxuXHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyp9IGdsXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxTdHJpbmc+fSBjb2xvcnNcclxuICAgICAqIEBwYXJhbSB7e2Z1bjpzdHJpbmcsYWxwaGE6bnVtYmVyfX0gc3RyZXRjaGluZ1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemVQaXhcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfHVuZGVmaW5lZH0gZ2xvYmFsT3BhY2l0eVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihnbCwgY29sb3JzLCBzdHJldGNoaW5nLCBzaXplUGl4ID0gMTAsIGdsb2JhbE9wYWNpdHkgPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAvKiogQHR5cGUge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gKi9cclxuICAgICAgICB0aGlzLmdsID0gZ2xcclxuICAgICAgICAvL2dsLnBpeGVsU3RvcmVpKGdsLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgdHJ1ZSk7XHJcbiAgICAgICAgLy9nbC5ibGVuZEZ1bmMoZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcclxuICAgICAgICAvL2dsLmJsZW5kRnVuYyhnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEpO1xyXG5cclxuICAgICAgICAvKiogQHR5cGUge1dlYkdMU2hhZGVyfSAqL1xyXG4gICAgICAgIGNvbnN0IHZTaGFkZXIgPSBjcmVhdGVTaGFkZXIoXHJcbiAgICAgICAgICAgIGdsLFxyXG4gICAgICAgICAgICBnbC5WRVJURVhfU0hBREVSLFxyXG4gICAgICAgICAgICBgXHJcbiAgICAgICAgYXR0cmlidXRlIHZlYzIgcG9zO1xyXG4gICAgICAgIHVuaWZvcm0gZmxvYXQgc2l6ZVBpeDtcclxuICAgICAgICB1bmlmb3JtIG1hdDMgbWF0O1xyXG5cclxuICAgICAgICBhdHRyaWJ1dGUgZmxvYXQgdDtcclxuICAgICAgICB2YXJ5aW5nIGZsb2F0IHZ0O1xyXG5cclxuICAgICAgICB2b2lkIG1haW4oKSB7XHJcbiAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQobWF0ICogdmVjMyhwb3MsIDEuMCksIDEuMCk7XHJcbiAgICAgICAgICBnbF9Qb2ludFNpemUgPSBzaXplUGl4O1xyXG4gICAgICAgICAgdnQgPSB0O1xyXG4gICAgICAgIH1cclxuICAgICAgYFxyXG4gICAgICAgIClcclxuXHJcbiAgICAgICAgLy9wcmVwYXJlIGZyYWdtZW50IHNoYWRlciBjb2RlXHJcbiAgICAgICAgLy9kZWNsYXJlIHRoZSB1bmlmb3JtIGFuZCBvdGhlciB2YXJpYWJsZXNcclxuICAgICAgICBsZXQgZnNoU3RyaW5nID1cclxuICAgICAgICAgICAgJycgK1xyXG4gICAgICAgICAgICAncHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxuJyArXHJcbiAgICAgICAgICAgICd2YXJ5aW5nIGZsb2F0IHZ0O1xcbicgK1xyXG4gICAgICAgICAgICAndW5pZm9ybSBmbG9hdCBhbHBoYTtcXG4nICtcclxuICAgICAgICAgICAgKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG91dCA9IFtdXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbG9ycy5sZW5ndGg7IGkrKykgb3V0LnB1c2goJ3VuaWZvcm0gdmVjNCBjJyArIGkgKyAnO1xcbicpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0LmpvaW4oJycpXHJcbiAgICAgICAgICAgIH0pKCkgK1xyXG4gICAgICAgICAgICAvL3N0YXJ0IHRoZSBtYWluIGZ1bmN0aW9uLCBhcHBseSB0aGUgc3RyZXRjaGluZyBvZiB0XHJcbiAgICAgICAgICAgICd2b2lkIG1haW4odm9pZCkge1xcbidcclxuXHJcbiAgICAgICAgaWYgKHN0cmV0Y2hpbmcpIHtcclxuICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdwb3cnKVxyXG4gICAgICAgICAgICAgICAgLy9zUG93ID0gKHQsIGFscGhhID0gMykgPT4gTWF0aC5wb3codCwgYWxwaGEpO1xyXG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gcG93KHZ0LCBhbHBoYSk7XFxuJ1xyXG4gICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmZ1biA9PSAncG93UmV2JylcclxuICAgICAgICAgICAgICAgIC8vc1Bvd1JldiA9ICh0LCBhbHBoYSA9IDMpID0+IDEgLSBNYXRoLnBvdygxIC0gdCwgMSAvIGFscGhhKTtcclxuICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IDEuMC1wb3coMS4wLXZ0LCAxLjAvYWxwaGEpO1xcbidcclxuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ2V4cCcpXHJcbiAgICAgICAgICAgICAgICAvL3NFeHAgPSAodCwgYWxwaGEgPSAzKSA9PiBhbHBoYSA9PSAwID8gdCA6IChNYXRoLmV4cCh0ICogYWxwaGEpIC0gMSkgLyAoTWF0aC5leHAoYWxwaGEpIC0gMSk7XHJcbiAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz1cclxuICAgICAgICAgICAgICAgICAgICBzdHJldGNoaW5nLmFscGhhID09IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgZmxvYXQgdCA9IHZ0O2BcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiAnICAgZmxvYXQgdCA9IChleHAodnQgKiBhbHBoYSkgLSAxLjApIC8gKGV4cChhbHBoYSkgLSAxLjApO1xcbidcclxuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ2V4cFJldicpXHJcbiAgICAgICAgICAgICAgICAvL3NFeHBSZXYgPSAodCwgYWxwaGEgPSAzKSA9PiBhbHBoYSA9PSAwID8gdCA6IDEgLSAoMSAvIGFscGhhKSAqIE1hdGgubG9nKE1hdGguZXhwKGFscGhhKSAqICgxIC0gdCkgKyB0KTtcclxuICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPVxyXG4gICAgICAgICAgICAgICAgICAgIHN0cmV0Y2hpbmcuYWxwaGEgPT0gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBmbG9hdCB0ID0gdnQ7YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICcgICBmbG9hdCB0ID0gMS4wIC0gKDEuMCAvIGFscGhhKSAqIGxvZyhleHAoYWxwaGEpICogKDEuMCAtIHZ0KSArIHZ0KTtcXG4nXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdjaXJjbGVMb3cnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RyZXRjaGluZy5hbHBoYSA9PSAwKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vaWYgKGFscGhhID09IDApIHJldHVybiB0O1xyXG4gICAgICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IHZ0O1xcbidcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmV0Y2hpbmcuYWxwaGEgPT0gMSlcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoYWxwaGEgPT0gMSkgcmV0dXJuIE1hdGguc3FydCgyICogdCAtIHQgKiB0KTtcclxuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSBzcXJ0KHZ0ICogKDIuMCAtIHZ0KSk7XFxuJ1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBhID0gYWxwaGEgLyAoMSAtIGFscGhhKTtcclxuICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBNYXRoLnNxcnQoMSAvIChhICogYSkgKyB0ICogKDIgLyBhICsgMiAtIHQpKSAtIDEgLyBhO1xyXG4gICAgICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnICAgZmxvYXQgYSA9IGFscGhhIC8gKDEuMCAtIGFscGhhKTtcXG4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJyAgIGZsb2F0IHQgPSBzcXJ0KDEuMCAvIChhICogYSkgKyB2dCAqICggMi4wL2EgKyAyLjAgLSB2dCApKSAtIDEuMCAvIGE7XFxuJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdjaXJjbGVIaWdoJykge1xyXG4gICAgICAgICAgICAgICAgLy8gMSAtIHNDaXJjbGVMb3coMSAtIHQsIGFscGhhKVxyXG4gICAgICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuYWxwaGEgPT0gMClcclxuICAgICAgICAgICAgICAgICAgICAvL2lmIChhbHBoYSA9PSAwKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSB2dDtcXG4nXHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmFscGhhID09IDEpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGFscGhhID09IDEpIHJldHVybiBNYXRoLnNxcnQoMiAqIHQgLSB0ICogdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gMS4wIC0gc3FydCgoMS4wIC0gdnQpICogKDEuMCArIHZ0KSk7XFxuJ1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBhID0gYWxwaGEgLyAoMSAtIGFscGhhKTtcclxuICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBNYXRoLnNxcnQoMSAvIChhICogYSkgKyAoMiAqIHQpIC8gYSArIDIgKiB0IC0gdCAqIHQpIC0gMSAvIGE7XHJcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICcgICBmbG9hdCBhID0gYWxwaGEgLyAoMS4wIC0gYWxwaGEpO1xcbicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnICAgZmxvYXQgdCA9IDEuMCAtIHNxcnQoMS4wIC8gKGEgKiBhKSArICgxLjAtdnQpICogKCAyLjAvYSArIDEuMCArIHZ0ICkpICsgMS4wIC8gYTtcXG4nXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmV4cGVjdGVkIHN0cmV0Y2hpbmcgZnVuY3Rpb24gY29kZTogJyArIHN0cmV0Y2hpbmcuZnVuKVxyXG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gdnQ7XFxuJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gdnQ7XFxuJ1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9jaG9vc2UgaW5pdGlhbCBhbmQgZmluYWwgY29sb3JzLCBhbmQgYWRqdXN0IHQgdmFsdWVcclxuICAgICAgICBpZiAoY29sb3JzLmxlbmd0aCA9PSAxKSBmc2hTdHJpbmcgKz0gJyAgIHZlYzQgY0k9YzA7XFxuICAgdmVjNCBjRj1jMDtcXG4nXHJcbiAgICAgICAgZWxzZSBpZiAoY29sb3JzLmxlbmd0aCA9PSAyKSBmc2hTdHJpbmcgKz0gJyAgIHZlYzQgY0k9YzA7XFxuICAgdmVjNCBjRj1jMTtcXG4nXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5iID0gY29sb3JzLmxlbmd0aCAtIDFcclxuICAgICAgICAgICAgY29uc3QgbmJzID0gbmIgKyAnLjAnXHJcbiAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgdmVjNCBjSTtcXG4nXHJcbiAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgdmVjNCBjRjtcXG4nXHJcbiAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgaWYodDwxLjAvJyArIG5icyArICcpIHsgY0k9YzA7IGNGPWMxOyB0PXQqJyArIG5icyArICc7IH1cXG4nXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAyOyBpIDwgbmI7IGkrKylcclxuICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPVxyXG4gICAgICAgICAgICAgICAgICAgICcgICBlbHNlIGlmKHQ8JyArXHJcbiAgICAgICAgICAgICAgICAgICAgaSArXHJcbiAgICAgICAgICAgICAgICAgICAgJy4wLycgK1xyXG4gICAgICAgICAgICAgICAgICAgIG5icyArXHJcbiAgICAgICAgICAgICAgICAgICAgJykgeyBjST1jJyArXHJcbiAgICAgICAgICAgICAgICAgICAgKGkgLSAxKSArXHJcbiAgICAgICAgICAgICAgICAgICAgJzsgY0Y9YycgK1xyXG4gICAgICAgICAgICAgICAgICAgIGkgK1xyXG4gICAgICAgICAgICAgICAgICAgICc7IHQ9JyArXHJcbiAgICAgICAgICAgICAgICAgICAgbmJzICtcclxuICAgICAgICAgICAgICAgICAgICAnKnQtJyArXHJcbiAgICAgICAgICAgICAgICAgICAgKGkgLSAxKSArXHJcbiAgICAgICAgICAgICAgICAgICAgJy4wOyB9XFxuJ1xyXG4gICAgICAgICAgICBmc2hTdHJpbmcgKz1cclxuICAgICAgICAgICAgICAgICcgICBlbHNlIHsgY0k9YycgKyAobmIgLSAxKSArICc7IGNGPWMnICsgbmIgKyAnOyB0PScgKyBuYnMgKyAnKnQtJyArIChuYiAtIDEpICsgJy4wOyB9XFxuJ1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9vbmUgc2luZ2xlIGNvbG9yXHJcbiAgICAgICAgaWYgKGNvbG9ycy5sZW5ndGggPT0gMSkgZnNoU3RyaW5nICs9ICcgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGMwWzBdLCBjMFsxXSwgYzBbMl0sIGMwWzNdKTt9XFxuJ1xyXG4gICAgICAgIC8vc2V0IGludGVycG9sYXRlZCBjb2xvciwgYmV0d2VlbiBpbml0aWFsIGFuZCBmaW5hbCBvbmVcclxuICAgICAgICBlbHNlIGZzaFN0cmluZyArPSAnICAgZ2xfRnJhZ0NvbG9yID0gbWl4KGNJLCBjRiwgdCk7fVxcbidcclxuXHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhmc2hTdHJpbmcpXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7V2ViR0xTaGFkZXJ9ICovXHJcbiAgICAgICAgY29uc3QgZlNoYWRlciA9IGNyZWF0ZVNoYWRlcihnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmc2hTdHJpbmcpXHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7V2ViR0xQcm9ncmFtfSAqL1xyXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IGluaXRTaGFkZXJQcm9ncmFtKGdsLCB2U2hhZGVyLCBmU2hhZGVyKVxyXG4gICAgICAgIGdsLnVzZVByb2dyYW0odGhpcy5wcm9ncmFtKVxyXG5cclxuICAgICAgICAvL3NldCB1bmlmb3Jtc1xyXG5cclxuICAgICAgICAvL3NpemVQaXhcclxuICAgICAgICAvL1RPRE86IGJ1ZyBoZXJlLiBTZWVtcyB0byBiZSBsaW1pdGVkIHRvIHNvbWUgdGhyZXNob2xkIHZhbHVlIChhcm91bmQgMjUwKS5cclxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ3NpemVQaXgnKSwgMS4wICogc2l6ZVBpeClcclxuXHJcbiAgICAgICAgLy9zdHJldGNoaW5nIGFscGhhIGZhY3RvclxyXG4gICAgICAgIGdsLnVuaWZvcm0xZihnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCAnYWxwaGEnKSwgc3RyZXRjaGluZyA/IDEuMCAqIHN0cmV0Y2hpbmcuYWxwaGEgOiAwLjApXHJcblxyXG4gICAgICAgIC8vY29sb3JzXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgYyA9IGNvbG9yKGNvbG9yc1tpXSlcclxuXHJcbiAgICAgICAgICAgIGxldCBvcGFjaXR5ID0gYy5vcGFjaXR5XHJcbiAgICAgICAgICAgIGlmIChjLm9wYWNpdHkgPT0gMSAmJiBnbG9iYWxPcGFjaXR5ICE9IHVuZGVmaW5lZCkgb3BhY2l0eSA9IGdsb2JhbE9wYWNpdHlcclxuXHJcbiAgICAgICAgICAgIGdsLnVuaWZvcm00ZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ2MnICsgaSksIFtcclxuICAgICAgICAgICAgICAgICtjLnIgLyAyNTUuMCxcclxuICAgICAgICAgICAgICAgICtjLmcgLyAyNTUuMCxcclxuICAgICAgICAgICAgICAgICtjLmIgLyAyNTUuMCxcclxuICAgICAgICAgICAgICAgICtvcGFjaXR5LFxyXG4gICAgICAgICAgICBdKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogICovXHJcbiAgICBkcmF3KHZlcnRpY2VzQnVmZmVyLCB0QnVmZmVyLCB0cmFuc2ZvTWF0KSB7XHJcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsXHJcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHRoaXMucHJvZ3JhbVxyXG5cclxuICAgICAgICAvL3ZlcnRpY2UgZGF0YVxyXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcclxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlc0J1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ3BvcycpXHJcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcclxuICAgICAgICAgICAgcG9zaXRpb24sXHJcbiAgICAgICAgICAgIDIsIC8vbnVtQ29tcG9uZW50c1xyXG4gICAgICAgICAgICBnbC5GTE9BVCwgLy90eXBlXHJcbiAgICAgICAgICAgIGZhbHNlLCAvL25vcm1hbGlzZVxyXG4gICAgICAgICAgICAwLCAvL3N0cmlkZVxyXG4gICAgICAgICAgICAwIC8vb2Zmc2V0XHJcbiAgICAgICAgKVxyXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKVxyXG5cclxuICAgICAgICAvL3QgZGF0YVxyXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcclxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheSh0QnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXHJcbiAgICAgICAgY29uc3QgdCA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICd0JylcclxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHQsIDEsIGdsLkZMT0FULCBmYWxzZSwgMCwgMClcclxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0KVxyXG5cclxuICAgICAgICAvL3RyYW5zZm9ybWF0aW9uXHJcbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDNmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgJ21hdCcpLCBmYWxzZSwgbmV3IEZsb2F0MzJBcnJheSh0cmFuc2ZvTWF0KSlcclxuXHJcbiAgICAgICAgLy8gRW5hYmxlIHRoZSBkZXB0aCB0ZXN0XHJcbiAgICAgICAgLy9nbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XHJcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGNvbG9yIGJ1ZmZlciBiaXRcclxuICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKVxyXG4gICAgICAgIC8vIFNldCB0aGUgdmlldyBwb3J0XHJcbiAgICAgICAgLy9nbC52aWV3cG9ydCgwLCAwLCBjZy53LCBjZy5oKTtcclxuXHJcbiAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5QT0lOVFMsIDAsIHZlcnRpY2VzQnVmZmVyLmxlbmd0aCAvIDIpXHJcbiAgICB9XHJcbn1cclxuIiwiLy9AdHMtY2hlY2tcclxuJ3VzZSBzdHJpY3QnXHJcblxyXG5pbXBvcnQgeyBpbml0U2hhZGVyUHJvZ3JhbSwgY3JlYXRlU2hhZGVyIH0gZnJvbSAnLi93ZWJHTFV0aWxzLmpzJ1xyXG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ2QzLWNvbG9yJ1xyXG5cclxuLyoqXHJcbiAqIEV2ZXJ5dGhpbmcgdG8gZWFzaWx5IGRyYXcgY29sb3JlZCBzcXVhcmVzIHdpdGggd2ViR0wuXHJcbiAqIEFsbCB0aGUgc2FtZSBzaXplLCBidXQgZGlmZmVyZW50IGZpbGwgY29sb3IuXHJcbiAqIENvbG9yIGJhc2VkIG9uIGNhdGVnb3JpZXMuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkIHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48c3RyaW5nPn0gY29sb3JzXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbG9ycykge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn0gKi9cclxuICAgICAgICB0aGlzLmNvbG9ycyA9IGNvbG9yc1xyXG5cclxuICAgICAgICAvKiogVmVjdG9yIHNoYWRlciBwcm9ncmFtXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cclxuICAgICAgICB0aGlzLnZzaFN0cmluZyA9IGBcclxuICAgICAgICBhdHRyaWJ1dGUgdmVjMiBwb3M7XHJcbiAgICAgICAgdW5pZm9ybSBmbG9hdCBzaXplUGl4O1xyXG4gICAgICAgIHVuaWZvcm0gbWF0MyBtYXQ7XHJcblxyXG4gICAgICAgIGF0dHJpYnV0ZSBmbG9hdCBpO1xyXG4gICAgICAgIHZhcnlpbmcgZmxvYXQgdmk7XHJcblxyXG4gICAgICAgIHZvaWQgbWFpbigpIHtcclxuICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChtYXQgKiB2ZWMzKHBvcywgMS4wKSwgMS4wKTtcclxuICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IHNpemVQaXg7XHJcbiAgICAgICAgICB2aSA9IGk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGBcclxuXHJcbiAgICAgICAgLy9wcmVwYXJlIGZyYWdtZW50IHNoYWRlciBjb2RlXHJcbiAgICAgICAgLy9kZWNsYXJlIHRoZSB1bmlmb3JtIGFuZCBvdGhlciB2YXJpYWJsZXNcclxuICAgICAgICBjb25zdCBvdXQgPSBbXVxyXG4gICAgICAgIG91dC5wdXNoKCdwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcXG52YXJ5aW5nIGZsb2F0IHZpO1xcbicpXHJcbiAgICAgICAgLy9hZGQgY29sb3IgdW5pZm9ybXNcclxuICAgICAgICBvdXQucHVzaCgndW5pZm9ybSB2ZWM0JylcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbG9ycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoaSA+IDApIG91dC5wdXNoKCcsJylcclxuICAgICAgICAgICAgb3V0LnB1c2goJyBjJyArIGkpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIG91dC5wdXNoKCc7XFxuJylcclxuICAgICAgICAvL3N0YXJ0IHRoZSBtYWluIGZ1bmN0aW9uXHJcbiAgICAgICAgb3V0LnB1c2goJ3ZvaWQgbWFpbih2b2lkKSB7XFxuJylcclxuICAgICAgICAvL2Nob29zZSBjb2xvciBpXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGkgPiAwKSBvdXQucHVzaCgnZWxzZSAnKVxyXG4gICAgICAgICAgICBvdXQucHVzaCgnaWYodmk9PScpXHJcbiAgICAgICAgICAgIG91dC5wdXNoKGkpXHJcbiAgICAgICAgICAgIG91dC5wdXNoKCcuMCkgZ2xfRnJhZ0NvbG9yID0gdmVjNChjJylcclxuICAgICAgICAgICAgb3V0LnB1c2goaSlcclxuICAgICAgICAgICAgb3V0LnB1c2goJ1swXSwgYycpXHJcbiAgICAgICAgICAgIG91dC5wdXNoKGkpXHJcbiAgICAgICAgICAgIG91dC5wdXNoKCdbMV0sIGMnKVxyXG4gICAgICAgICAgICBvdXQucHVzaChpKVxyXG4gICAgICAgICAgICBvdXQucHVzaCgnWzJdLCBjJylcclxuICAgICAgICAgICAgb3V0LnB1c2goaSlcclxuICAgICAgICAgICAgb3V0LnB1c2goJ1szXSk7XFxuJylcclxuICAgICAgICB9XHJcbiAgICAgICAgb3V0LnB1c2goJ2Vsc2UgZ2xfRnJhZ0NvbG9yID0gdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApO1xcbn0nKVxyXG4gICAgICAgIC8qKiBGcmFnbWVudCBzaGFkZXIgcHJvZ3JhbVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXHJcbiAgICAgICAgdGhpcy5mc2hTdHJpbmcgPSBvdXQuam9pbignJylcclxuICAgIH1cclxuXHJcbiAgICAvKiogICovXHJcbiAgICBkcmF3KGdsLCB2ZXJ0aWNlc0J1ZmZlciwgaUJ1ZmZlciwgdHJhbnNmb01hdCwgc2l6ZVBpeCA9IDEwKSB7XHJcbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcn0gKi9cclxuICAgICAgICBjb25zdCB2U2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBnbC5WRVJURVhfU0hBREVSLCB0aGlzLnZzaFN0cmluZylcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcn0gKi9cclxuICAgICAgICBjb25zdCBmU2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIHRoaXMuZnNoU3RyaW5nKVxyXG5cclxuICAgICAgICAvKiogQHR5cGUge1dlYkdMUHJvZ3JhbX0gKi9cclxuICAgICAgICBjb25zdCBwcm9ncmFtID0gaW5pdFNoYWRlclByb2dyYW0oZ2wsIHZTaGFkZXIsIGZTaGFkZXIpXHJcbiAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKVxyXG5cclxuICAgICAgICAvL3NldCB1bmlmb3Jtc1xyXG5cclxuICAgICAgICAvL3NpemVQaXhcclxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdzaXplUGl4JyksIDEuMCAqIHNpemVQaXgpXHJcblxyXG4gICAgICAgIC8vY29sb3JzXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbG9ycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjID0gY29sb3IodGhpcy5jb2xvcnNbaV0pXHJcbiAgICAgICAgICAgIGdsLnVuaWZvcm00ZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdjJyArIGkpLCBbXHJcbiAgICAgICAgICAgICAgICArYy5yIC8gMjU1LjAsXHJcbiAgICAgICAgICAgICAgICArYy5nIC8gMjU1LjAsXHJcbiAgICAgICAgICAgICAgICArYy5iIC8gMjU1LjAsXHJcbiAgICAgICAgICAgICAgICArYy5vcGFjaXR5LFxyXG4gICAgICAgICAgICBdKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy92ZXJ0aWNlIGRhdGFcclxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXHJcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXNCdWZmZXIpLCBnbC5TVEFUSUNfRFJBVylcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICdwb3MnKVxyXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXHJcbiAgICAgICAgICAgIHBvc2l0aW9uLFxyXG4gICAgICAgICAgICAyLCAvL251bUNvbXBvbmVudHNcclxuICAgICAgICAgICAgZ2wuRkxPQVQsIC8vdHlwZVxyXG4gICAgICAgICAgICBmYWxzZSwgLy9ub3JtYWxpc2VcclxuICAgICAgICAgICAgMCwgLy9zdHJpZGVcclxuICAgICAgICAgICAgMCAvL29mZnNldFxyXG4gICAgICAgIClcclxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShwb3NpdGlvbilcclxuXHJcbiAgICAgICAgLy9pIGRhdGFcclxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXHJcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkoaUJ1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxyXG4gICAgICAgIGNvbnN0IGkgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAnaScpXHJcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihpLCAxLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApXHJcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoaSlcclxuXHJcbiAgICAgICAgLy90cmFuc2Zvcm1hdGlvblxyXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdtYXQnKSwgZmFsc2UsIG5ldyBGbG9hdDMyQXJyYXkodHJhbnNmb01hdCkpXHJcblxyXG4gICAgICAgIC8vIEVuYWJsZSB0aGUgZGVwdGggdGVzdFxyXG4gICAgICAgIC8vZ2wuZW5hYmxlKGdsLkRFUFRIX1RFU1QpO1xyXG4gICAgICAgIC8vIENsZWFyIHRoZSBjb2xvciBidWZmZXIgYml0XHJcbiAgICAgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVClcclxuICAgICAgICAvLyBTZXQgdGhlIHZpZXcgcG9ydFxyXG4gICAgICAgIC8vZ2wudmlld3BvcnQoMCwgMCwgY2cudywgY2cuaCk7XHJcblxyXG4gICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuUE9JTlRTLCAwLCB2ZXJ0aWNlc0J1ZmZlci5sZW5ndGggLyAyKVxyXG4gICAgfVxyXG59XHJcbiIsIi8vQHRzLWNoZWNrXHJcbid1c2Ugc3RyaWN0J1xyXG5cclxuLyoqXHJcbiAqIFNvbWUgZnVuY3Rpb24gWzAsMV0tPlswLDFdIHRvIHN0cmV0Y2ggcmFuZ2Ugb2YgdmFsdWVzLlxyXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ldXJvc3RhdC9ncmlkdml6L2Jsb2IvbWFzdGVyL2RvY3MvcmVmZXJlbmNlLm1kI3N0cmV0Y2hpbmdcclxuICogQHNlZSBodHRwczovL29ic2VydmFibGVocS5jb20vQGpnYWZmdXJpL3N0cmV0Y2hpbmdcclxuICovXHJcblxyXG4vKipcclxuICogRnVuY3Rpb24gWzAsMV0tPlswLDFdIHRvIHN0cmV0Y2ggcmFuZ2Ugb2YgdmFsdWVzLlxyXG4gKiBQb2x5bm9taWFsXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0IFRoZSB2YWx1ZSB0byBzdHJldGNoLCB3aXRoaW4gWzAsMV1cclxuICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIDE6IG5vIHN0cmV0Y2hpbmcuIDwxOiBzaG93IGxvdyB2YWx1ZXMuID4xOiBzaG93IGhpZ2ggdmFsdWVzLlxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgc3RyZXRjaGVkIHZhbHVlLCB3aXRoaW4gWzAsMV1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzUG93ID0gKHQsIGFscGhhID0gMykgPT4gTWF0aC5wb3codCwgYWxwaGEpXHJcblxyXG4vKipcclxuICogRnVuY3Rpb24gWzAsMV0tPlswLDFdIHRvIHN0cmV0Y2ggcmFuZ2Ugb2YgdmFsdWVzLlxyXG4gKiBQb2x5bm9taWFsIChyZXZlcnNlKVxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdCBUaGUgdmFsdWUgdG8gc3RyZXRjaCwgd2l0aGluIFswLDFdXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAxOiBubyBzdHJldGNoaW5nLiA8MTogc2hvdyBsb3cgdmFsdWVzLiA+MTogc2hvdyBoaWdoIHZhbHVlcy5cclxuICogQHJldHVybnMge251bWJlcn0gVGhlIHN0cmV0Y2hlZCB2YWx1ZSwgd2l0aGluIFswLDFdXHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc1Bvd1JldiA9ICh0LCBhbHBoYSA9IDMpID0+IDEgLSBNYXRoLnBvdygxIC0gdCwgMSAvIGFscGhhKVxyXG5cclxuLyoqXHJcbiAqIEZ1bmN0aW9uIFswLDFdLT5bMCwxXSB0byBzdHJldGNoIHJhbmdlIG9mIHZhbHVlcy5cclxuICogRXhwb25lbnRpYWxcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHQgVGhlIHZhbHVlIHRvIHN0cmV0Y2gsIHdpdGhpbiBbMCwxXVxyXG4gKiBAcGFyYW0ge251bWJlcn0gYWxwaGEgMDogbm8gc3RyZXRjaGluZy4gLUluZjogc2hvdyBsb3cgdmFsdWVzLiBJbmY6IHNob3cgaGlnaCB2YWx1ZXMuXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBzdHJldGNoZWQgdmFsdWUsIHdpdGhpbiBbMCwxXVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNFeHAgPSAodCwgYWxwaGEgPSAzKSA9PiAoYWxwaGEgPT0gMCA/IHQgOiAoTWF0aC5leHAodCAqIGFscGhhKSAtIDEpIC8gKE1hdGguZXhwKGFscGhhKSAtIDEpKVxyXG5cclxuLyoqXHJcbiAqIEZ1bmN0aW9uIFswLDFdLT5bMCwxXSB0byBzdHJldGNoIHJhbmdlIG9mIHZhbHVlcy5cclxuICogRXhwb25lbnRpYWwgKHJldmVyc2UpXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0IFRoZSB2YWx1ZSB0byBzdHJldGNoLCB3aXRoaW4gWzAsMV1cclxuICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIDA6IG5vIHN0cmV0Y2hpbmcuIC1JbmY6IHNob3cgbG93IHZhbHVlcy4gSW5mOiBzaG93IGhpZ2ggdmFsdWVzLlxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgc3RyZXRjaGVkIHZhbHVlLCB3aXRoaW4gWzAsMV1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzRXhwUmV2ID0gKHQsIGFscGhhID0gMykgPT5cclxuICAgIGFscGhhID09IDAgPyB0IDogMSAtICgxIC8gYWxwaGEpICogTWF0aC5sb2coTWF0aC5leHAoYWxwaGEpICogKDEgLSB0KSArIHQpXHJcblxyXG4vKipcclxuICogRnVuY3Rpb24gWzAsMV0tPlswLDFdIHRvIHN0cmV0Y2ggcmFuZ2Ugb2YgdmFsdWVzLlxyXG4gKiBDaXJjbGUsIHNob3cgbG93IHZhbHVlc1xyXG4gKiBOQjogc0NpcmNsZUhpZ2ggYW5kIHNDaXJjbGVMb3cgYXJlIGludmVyc2UgZnVuY3Rpb25zIG9mIGVhY2ggb3RoZXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0IFRoZSB2YWx1ZSB0byBzdHJldGNoLCB3aXRoaW4gWzAsMV1cclxuICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIDA6IG5vIHN0cmV0Y2hpbmcuIDE6IHBlcmZlY3QgY2lyY2xlIHNlY3Rpb25cclxuICogQHJldHVybnMge251bWJlcn0gVGhlIHN0cmV0Y2hlZCB2YWx1ZSwgd2l0aGluIFswLDFdXHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc0NpcmNsZUxvdyA9ICh0LCBhbHBoYSA9IDAuOCkgPT4ge1xyXG4gICAgaWYgKGFscGhhID09IDApIHJldHVybiB0XHJcbiAgICBpZiAoYWxwaGEgPT0gMSkgcmV0dXJuIE1hdGguc3FydCh0ICogKDIgLSB0KSlcclxuICAgIGNvbnN0IGEgPSBhbHBoYSAvICgxIC0gYWxwaGEpXHJcbiAgICByZXR1cm4gTWF0aC5zcXJ0KDEgLyAoYSAqIGEpICsgdCAqICgyIC8gYSArIDIgLSB0KSkgLSAxIC8gYVxyXG59XHJcblxyXG4vKipcclxuICogRnVuY3Rpb24gWzAsMV0tPlswLDFdIHRvIHN0cmV0Y2ggcmFuZ2Ugb2YgdmFsdWVzLlxyXG4gKiBDaXJjbGUsIHNob3cgaGlnaCB2YWx1ZXNcclxuICogTkI6IHNDaXJjbGVIaWdoIGFuZCBzQ2lyY2xlTG93IGFyZSBpbnZlcnNlIGZ1bmN0aW9ucyBvZiBlYWNoIG90aGVyLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdCBUaGUgdmFsdWUgdG8gc3RyZXRjaCwgd2l0aGluIFswLDFdXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAwOiBubyBzdHJldGNoaW5nLiAxOiBwZXJmZWN0IGNpcmNsZSBzZWN0aW9uXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBzdHJldGNoZWQgdmFsdWUsIHdpdGhpbiBbMCwxXVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNDaXJjbGVIaWdoID0gKHQsIGFscGhhID0gMC44KSA9PiAxIC0gc0NpcmNsZUxvdygxIC0gdCwgYWxwaGEpXHJcblxyXG4vKipcclxuICogSW52ZXJzZSBmdW5jdGlvbnNcclxuICovXHJcblxyXG4vKipcclxuICogSW52ZXJzZSBmdW5jdGlvbiBvZiBzRXhwXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYVxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNFeHBJbnZlcnNlID0gKHksIGFscGhhID0gMykgPT5cclxuICAgIGFscGhhID09IDAgPyB5IDogKDEgLyBhbHBoYSkgKiBNYXRoLmxvZygxIC0geSArIHkgKiBNYXRoLmV4cChhbHBoYSkpXHJcblxyXG4vKipcclxuICogSW52ZXJzZSBmdW5jdGlvbiBvZiBzRXhwUmV2XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYVxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNFeHBSZXZJbnZlcnNlID0gKHksIGFscGhhID0gMykgPT4gKE1hdGguZXhwKC1hbHBoYSAqIHkpIC0gMSkgLyAoTWF0aC5leHAoLWFscGhhKSAtIDEpXHJcblxyXG4vKipcclxuICogSW52ZXJzZSBmdW5jdGlvbiBvZiBzUG93XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYVxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuXHJcbmV4cG9ydCBjb25zdCBzUG93SW52ZXJzZSA9ICh5LCBhbHBoYSA9IDMpID0+IE1hdGgucG93KHksIDEgLyBhbHBoYSlcclxuXHJcbi8qKlxyXG4gKiBJbnZlcnNlIGZ1bmN0aW9uIG9mIHNQb3dSZXZcclxuICogQHBhcmFtIHtudW1iZXJ9IHlcclxuICogQHBhcmFtIHtudW1iZXJ9IGFscGhhXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc1Bvd1JldkludmVyc2UgPSAoeSwgYWxwaGEgPSAzKSA9PiAxIC0gTWF0aC5wb3coMSAtIHksIGFscGhhKVxyXG5cclxuLy90ZXN0IGNvZGVcclxuLypcclxuZm9yIChsZXQgaSA9IDA7IGkgPD0gMTsgaSArPSAwLjAwMSkge1xyXG4gIC8vY29uc3QgdiA9IGd2aXouc0V4cChndml6LnNFeHBJbnZlcnNlKGkpKTtcclxuICAvL2NvbnN0IHYgPSBndml6LnNFeHBJbnZlcnNlKGd2aXouc0V4cChpKSk7XHJcbiAgLy9jb25zdCB2ID0gZ3Zpei5zRXhwUmV2KGd2aXouc0V4cFJldkludmVyc2UoaSkpO1xyXG4gIC8vY29uc3QgdiA9IGd2aXouc0V4cFJldkludmVyc2UoZ3Zpei5zRXhwUmV2KGkpKTtcclxuICAvL2NvbnN0IHYgPSBndml6LnNQb3coZ3Zpei5zUG93SW52ZXJzZShpKSk7XHJcbiAgLy9jb25zdCB2ID0gZ3Zpei5zUG93SW52ZXJzZShndml6LnNQb3coaSkpO1xyXG4gIC8vY29uc3QgdiA9IGd2aXouc1Bvd1Jldihndml6LnNQb3dSZXZJbnZlcnNlKGkpKTtcclxuICAvL2NvbnN0IHYgPSBndml6LnNQb3dSZXZJbnZlcnNlKGd2aXouc1Bvd1JldihpKSk7XHJcbiAgLy9jb25zdCB2ID0gZ3Zpei5zQ2lyY2xlTG93KGd2aXouc0NpcmNsZUhpZ2goaSkpO1xyXG4gIC8vY29uc3QgdiA9IGd2aXouc0NpcmNsZUhpZ2goZ3Zpei5zQ2lyY2xlTG93KGkpKTtcclxuICBjb25zb2xlLmxvZyhpIC0gdilcclxufVxyXG4qL1xyXG4iLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gd2lkdGhcclxuICogQHBhcmFtIHtzdHJpbmd9IGhlaWdodFxyXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xyXG4gKiBAcmV0dXJucyB7e2NhbnZhczpIVE1MQ2FudmFzRWxlbWVudCwgZ2w6V2ViR0xSZW5kZXJpbmdDb250ZXh0fX1cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtYWtlV2ViR0xDYW52YXMod2lkdGgsIGhlaWdodCwgb3B0cykge1xyXG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcclxuICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgd2lkdGgpXHJcbiAgICBjYW52YXMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBoZWlnaHQpXHJcbiAgICBjb25zdCBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcsIG9wdHMpXHJcbiAgICBpZiAoIWdsKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gaW5pdGlhbGl6ZSBXZWJHTC4gWW91ciBicm93c2VyIG9yIG1hY2hpbmUgbWF5IG5vdCBzdXBwb3J0IGl0LicpXHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBjYW52YXM6IGNhbnZhcywgZ2w6IGdsIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEluaXRpYWxpemUgYSBzaGFkZXIgcHJvZ3JhbSwgc28gV2ViR0wga25vd3MgaG93IHRvIGRyYXcgb3VyIGRhdGFcclxuICpcclxuICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsXHJcbiAqIEBwYXJhbSAgey4uLldlYkdMU2hhZGVyfSBzaGFkZXJzXHJcbiAqIEByZXR1cm5zIHtXZWJHTFByb2dyYW19XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaW5pdFNoYWRlclByb2dyYW0oZ2wsIC4uLnNoYWRlcnMpIHtcclxuICAgIC8qKiBAdHlwZSB7V2ViR0xQcm9ncmFtfG51bGx9ICovXHJcbiAgICBjb25zdCBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpXHJcbiAgICBpZiAocHJvZ3JhbSA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgd2ViR0wgcHJvZ3JhbScpXHJcbiAgICBmb3IgKGNvbnN0IHNoYWRlciBvZiBzaGFkZXJzKSBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgc2hhZGVyKVxyXG4gICAgZ2wubGlua1Byb2dyYW0ocHJvZ3JhbSlcclxuICAgIGlmIChnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLkxJTktfU1RBVFVTKSkgcmV0dXJuIHByb2dyYW1cclxuICAgIHRocm93IG5ldyBFcnJvcihnbC5nZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKSB8fCAnQ2Fubm90IGNyZWF0ZSB3ZWJHTCBwcm9ncmFtICgyKScpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgc2hhZGVyIG9mIHRoZSBnaXZlbiB0eXBlLCB1cGxvYWRzIHRoZSBzb3VyY2UgYW5kIGNvbXBpbGVzIGl0LlxyXG4gKlxyXG4gKiBAcGFyYW0ge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2xcclxuICogQHBhcmFtIHtudW1iZXJ9IHR5cGVcclxuICogQHBhcmFtICB7Li4uc3RyaW5nfSBzb3VyY2VzXHJcbiAqIEByZXR1cm5zIHtXZWJHTFNoYWRlcn1cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTaGFkZXIoZ2wsIHR5cGUsIC4uLnNvdXJjZXMpIHtcclxuICAgIC8qKiBAdHlwZSB7V2ViR0xTaGFkZXJ8bnVsbH0gKi9cclxuICAgIGNvbnN0IHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcih0eXBlKVxyXG4gICAgaWYgKHNoYWRlciA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgd2ViR0wgc2hhZGVyJylcclxuICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIHNvdXJjZXMuam9pbignXFxuJykpXHJcbiAgICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcilcclxuICAgIGlmIChnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUykpIHJldHVybiBzaGFkZXJcclxuICAgIHRocm93IG5ldyBFcnJvcihnbC5nZXRTaGFkZXJJbmZvTG9nKHNoYWRlcikgfHwgJ0Nhbm5vdCBjcmVhdGUgd2ViR0wgc2hhZGVyICgyKScpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVjayBpZiB3ZWJHTCBpcyBzdXBwb3J0ZWRcclxuICpcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tXZWJHTFN1cHBvcnQoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXHJcbiAgICAgICAgcmV0dXJuICEhd2luZG93LldlYkdMUmVuZGVyaW5nQ29udGV4dCAmJlxyXG4gICAgICAgICAgICAoY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJykgfHwgY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcpKVxyXG4gICAgICAgICAgICA/IHRydWVcclxuICAgICAgICAgICAgOiBmYWxzZVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbn1cclxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvL0B0cy1jaGVja1xyXG4ndXNlIHN0cmljdCdcclxuXHJcbi8vIHRoZSBhcHBsaWNhdGlvblxyXG5leHBvcnQgeyBBcHAgfSBmcm9tICcuL0FwcC5qcydcclxuZXhwb3J0IHsgR2VvQ2FudmFzIH0gZnJvbSAnLi9HZW9DYW52YXMuanMnXHJcbmV4cG9ydCB7IFN0eWxlIH0gZnJvbSAnLi9TdHlsZS5qcydcclxuZXhwb3J0IHsgTGF5ZXIgfSBmcm9tICcuL0xheWVyLmpzJ1xyXG5leHBvcnQgeyBEYXRhc2V0IH0gZnJvbSAnLi9EYXRhc2V0LmpzJ1xyXG5leHBvcnQgeyBEYXRhc2V0Q29tcG9uZW50IH0gZnJvbSAnLi9EYXRhc2V0Q29tcG9uZW50LmpzJ1xyXG5cclxuLy8gZXhwb3J0IGRhdGFzZXQgdHlwZXNcclxuZXhwb3J0IHsgVGlsZWRHcmlkIH0gZnJvbSAnLi9kYXRhc2V0L1RpbGVkR3JpZC5qcydcclxuZXhwb3J0IHsgQ1NWR3JpZCB9IGZyb20gJy4vZGF0YXNldC9DU1ZHcmlkLmpzJ1xyXG4vL2V4cG9ydCB7IFBhcnF1ZXRHcmlkIH0gZnJvbSBcIi4vZGF0YXNldC9QYXJxdWV0R3JpZFwiXHJcbi8vZXhwb3J0IHsgR2VvVElGRiB9IGZyb20gXCIuL2RhdGFzZXQvR2VvVElGRlwiXHJcblxyXG4vLyBleHBvcnQgc3R5bGVzXHJcbmV4cG9ydCB7IFNoYXBlQ29sb3JTaXplU3R5bGUgfSBmcm9tICcuL3N0eWxlL1NoYXBlQ29sb3JTaXplU3R5bGUuanMnXHJcbmV4cG9ydCB7IFN0cm9rZVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TdHJva2VTdHlsZS5qcydcclxuZXhwb3J0IHsgSm95UGxvdFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9Kb3lQbG90U3R5bGUuanMnXHJcbmV4cG9ydCB7IENvbXBvc2l0aW9uU3R5bGUgfSBmcm9tICcuL3N0eWxlL0NvbXBvc2l0aW9uU3R5bGUuanMnXHJcbmV4cG9ydCB7IFNlZ21lbnRTdHlsZSB9IGZyb20gJy4vc3R5bGUvU2VnbWVudFN0eWxlLmpzJ1xyXG5leHBvcnQgeyBUZXh0U3R5bGUgfSBmcm9tICcuL3N0eWxlL1RleHRTdHlsZS5qcydcclxuZXhwb3J0IHsgS2VybmVsU21vb3RoaW5nU3R5bGUgfSBmcm9tICcuL3N0eWxlL0tlcm5lbFNtb290aGluZ1N0eWxlLmpzJ1xyXG4vL2V4cG9ydCB7IEtlcm5lbFNtb290aGluZ09sZFN0eWxlIH0gZnJvbSBcIi4vc3R5bGUvS2VybmVsU21vb3RoaW5nU3R5bGVcIlxyXG4vL2V4cG9ydCB7IEtlcm5lbFNtb290aGluZ1dHTFN0eWxlIH0gZnJvbSBcIi4vc3R5bGUvS2VybmVsU21vb3RoaW5nU3R5bGVcIlxyXG5leHBvcnQgeyBQaWxsYXJTdHlsZSB9IGZyb20gJy4vc3R5bGUvUGlsbGFyU3R5bGUuanMnXHJcbmV4cG9ydCB7IFNpZGVTdHlsZSB9IGZyb20gJy4vc3R5bGUvU2lkZVN0eWxlLmpzJ1xyXG5leHBvcnQgeyBDb250b3VyU3R5bGUgfSBmcm9tICcuL3N0eWxlL0NvbnRvdXJTdHlsZS5qcydcclxuZXhwb3J0IHsgU2lkZUNhdFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TaWRlQ2F0U3R5bGUuanMnXHJcbmV4cG9ydCB7IERvdERlbnNpdHlTdHlsZSB9IGZyb20gJy4vc3R5bGUvRG90RGVuc2l0eVN0eWxlLmpzJ1xyXG5leHBvcnQgeyBUYW5ha2FTdHlsZSB9IGZyb20gJy4vc3R5bGUvVGFuYWthU3R5bGUuanMnXHJcbmV4cG9ydCB7IExlZ29TdHlsZSB9IGZyb20gJy4vc3R5bGUvTGVnb1N0eWxlLmpzJ1xyXG5leHBvcnQgeyBTcXVhcmVDb2xvcldHTFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TcXVhcmVDb2xvcldHTFN0eWxlLmpzJ1xyXG5leHBvcnQgeyBTcXVhcmVDb2xvckNhdFdHTFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TcXVhcmVDb2xvckNhdFdHTFN0eWxlLmpzJ1xyXG5leHBvcnQgeyBNb3NhaWNTdHlsZSB9IGZyb20gJy4vc3R5bGUvTW9zYWljU3R5bGUuanMnXHJcbmV4cG9ydCB7IE5pbmphU3RhclN0eWxlIH0gZnJvbSAnLi9zdHlsZS9OaW5qYVN0YXJTdHlsZS5qcydcclxuXHJcbi8vIGV4cG9ydCBhZGRpdGlvbmFsIGxheWVyc1xyXG5leHBvcnQgeyBCYWNrZ3JvdW5kTGF5ZXIgfSBmcm9tICcuL0JhY2tncm91bmRMYXllci5qcydcclxuZXhwb3J0IHsgQmFja2dyb3VuZExheWVyV01TIH0gZnJvbSAnLi9CYWNrZ3JvdW5kTGF5ZXJXTVMuanMnXHJcbmV4cG9ydCB7IExhYmVsTGF5ZXIgfSBmcm9tICcuL0xhYmVsTGF5ZXIuanMnXHJcbmV4cG9ydCB7IExpbmVMYXllciBhcyBCb3VuZGFyeUxheWVyIH0gZnJvbSAnLi9MaW5lTGF5ZXIuanMnXHJcblxyXG4vLyBleHBvcnQgbGVnZW5kc1xyXG5leHBvcnQgeyBDb2xvckxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL0NvbG9yTGVnZW5kLmpzJ1xyXG5leHBvcnQgeyBDb2xvckRpc2NyZXRlTGVnZW5kIH0gZnJvbSAnLi9sZWdlbmQvQ29sb3JEaXNjcmV0ZUxlZ2VuZC5qcydcclxuZXhwb3J0IHsgQ29sb3JDYXRlZ29yeUxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL0NvbG9yQ2F0ZWdvcnlMZWdlbmQuanMnXHJcbmV4cG9ydCB7IFNpemVMZWdlbmQgfSBmcm9tICcuL2xlZ2VuZC9TaXplTGVnZW5kLmpzJ1xyXG5leHBvcnQgeyBTZWdtZW50V2lkdGhMZWdlbmQgfSBmcm9tICcuL2xlZ2VuZC9TZWdtZW50V2lkdGhMZWdlbmQuanMnXHJcbmV4cG9ydCB7IFNlZ21lbnRPcmllbnRhdGlvbkxlZ2VuZCB9IGZyb20gJy4vbGVnZW5kL1NlZ21lbnRPcmllbnRhdGlvbkxlZ2VuZC5qcydcclxuXHJcbi8vIGV4cG9ydCB7IGdvVG9TdHJhaWdodCwgem9vbVRvIH0gZnJvbSBcIi4vdXRpbHMvem9vbVV0aWxzXCJcclxuZXhwb3J0ICogZnJvbSAnLi91dGlscy9zdHJldGNoaW5nLmpzJ1xyXG5cclxuZXhwb3J0IHsgZ2V0Q2xhc3MgfSBmcm9tICcuL3V0aWxzL1V0aWxzLmpzJ1xyXG5cclxuaW1wb3J0IHsgR2VvQ2FudmFzIH0gZnJvbSAnLi9HZW9DYW52YXMuanMnXHJcbmltcG9ydCB7IGdlb0F6aW11dGhhbEVxdWFsQXJlYSB9IGZyb20gJ2QzLWdlbydcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGxhYmVsIGxheWVyIGZyb20gRXVyb3N0YXQsIGZvciBFVFJTODktTEFFQSBncmlkcy5cclxuICogRnJvbSBFdXJvbnltIGRhdGE6IGh0dHBzOi8vZ2l0aHViLmNvbS9ldXJvc3RhdC9ldXJvbnltXHJcbiAqXHJcbiAqIEByZXR1cm5zIHtvYmplY3R9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0RXVyb255bWVMYWJlbExheWVyID0gZnVuY3Rpb24gKGNjID0gJ0VVUicsIHJlcyA9IDUwLCBvcHRzKSB7XHJcbiAgICBvcHRzID0gb3B0cyB8fCB7fVxyXG4gICAgY29uc3QgZXggPSBvcHRzLmV4IHx8IDEuMlxyXG4gICAgY29uc3QgZm9udEZhbWlseSA9IG9wdHMuZm9udEZhbWlseSB8fCAnQXJpYWwnXHJcbiAgICBjb25zdCBleFNpemUgPSBvcHRzLmV4U2l6ZSB8fCAxXHJcbiAgICBvcHRzLnN0eWxlID1cclxuICAgICAgICBvcHRzLnN0eWxlIHx8XHJcbiAgICAgICAgKChsYiwgemYpID0+IHtcclxuICAgICAgICAgICAgaWYgKGxiLnJzIDwgZXggKiB6ZikgcmV0dXJuXHJcbiAgICAgICAgICAgIGlmIChsYi5yMSA8IGV4ICogemYpIHJldHVybiBleFNpemUgKyAnZW0gJyArIGZvbnRGYW1pbHlcclxuICAgICAgICAgICAgcmV0dXJuIGV4U2l6ZSAqIDEuNSArICdlbSAnICsgZm9udEZhbWlseVxyXG4gICAgICAgIH0pXHJcbiAgICAvL0VUUlM4OS1MQUVBIHByb2plY3Rpb25cclxuICAgIG9wdHMucHJvaiA9XHJcbiAgICAgICAgb3B0cy5wcm9qIHx8XHJcbiAgICAgICAgZ2VvQXppbXV0aGFsRXF1YWxBcmVhKClcclxuICAgICAgICAgICAgLnJvdGF0ZShbLTEwLCAtNTJdKVxyXG4gICAgICAgICAgICAucmVmbGVjdFgoZmFsc2UpXHJcbiAgICAgICAgICAgIC5yZWZsZWN0WSh0cnVlKVxyXG4gICAgICAgICAgICAuc2NhbGUoNjM3ODEzNylcclxuICAgICAgICAgICAgLnRyYW5zbGF0ZShbNDMyMTAwMCwgMzIxMDAwMF0pXHJcbiAgICBvcHRzLnByZXByb2Nlc3MgPSAobGIpID0+IHtcclxuICAgICAgICAvL2V4Y2x1ZGUgY291bnRyaWVzXHJcbiAgICAgICAgLy9pZihvcHRzLmNjT3V0ICYmIGxiLmNjICYmIG9wdHMuY2NPdXQuaW5jbHVkZXMobGIuY2MpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKG9wdHMuY2NJbiAmJiBsYi5jYyAmJiAhKG9wdHMuY2NJbi5pbmRleE9mKGxiLmNjKSA+PSAwKSkgcmV0dXJuIGZhbHNlXHJcblxyXG4gICAgICAgIC8vcHJvamVjdCBmcm9tIGdlbyBjb29yZGluYXRlcyB0byBFVFJTODktTEFFQVxyXG4gICAgICAgIGNvbnN0IHAgPSBvcHRzLnByb2ooW2xiLmxvbiwgbGIubGF0XSlcclxuICAgICAgICBsYi54ID0gcFswXVxyXG4gICAgICAgIGxiLnkgPSBwWzFdXHJcbiAgICAgICAgZGVsZXRlIGxiLmxvblxyXG4gICAgICAgIGRlbGV0ZSBsYi5sYXRcclxuICAgIH1cclxuICAgIG9wdHMuYmFzZVVSTCA9IG9wdHMuYmFzZVVSTCB8fCAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2V1cm9zdGF0L2V1cm9ueW0vbWFpbi9wdWIvdjIvVVRGLydcclxuICAgIG9wdHMudXJsID0gb3B0cy5iYXNlVVJMICsgcmVzICsgJy8nICsgY2MgKyAnLmNzdidcclxuICAgIHJldHVybiBvcHRzXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdldEV1cm9zdGF0Qm91bmRhcmllc0xheWVyID0gZnVuY3Rpb24gKG9wdHMpIHtcclxuICAgIG9wdHMgPSBvcHRzIHx8IHt9XHJcbiAgICBjb25zdCBudXRzWWVhciA9IG9wdHMubnV0c1llYXIgfHwgJzIwMjEnXHJcbiAgICBjb25zdCBjcnMgPSBvcHRzLmNycyB8fCAnMzAzNSdcclxuICAgIGNvbnN0IHNjYWxlID0gb3B0cy5zY2FsZSB8fCAnMDNNJ1xyXG4gICAgY29uc3QgbnV0c0xldmVsID0gb3B0cy5udXRzTGV2ZWwgfHwgJzMnXHJcbiAgICBjb25zdCBjb2wgPSBvcHRzLmNvbCB8fCAnIzg4OCdcclxuICAgIGNvbnN0IGNvbEtvc292byA9IG9wdHMuY29sS29zb3ZvIHx8ICcjYmNiY2JjJ1xyXG4gICAgY29uc3Qgc2hvd090aCA9IG9wdHMuc2hvd090aCA9PSB1bmRlZmluZWQgPyB0cnVlIDogb3B0cy5zaG93T3RoXHJcblxyXG4gICAgb3B0cy5jb2xvciA9XHJcbiAgICAgICAgb3B0cy5jb2xvciB8fFxyXG4gICAgICAgICgoZiwgemYpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcCA9IGYucHJvcGVydGllc1xyXG4gICAgICAgICAgICBpZiAoIXNob3dPdGggLyomJiBwLmNvID09IFwiRlwiKi8gJiYgcC5ldSAhPSAnVCcgJiYgcC5jYyAhPSAnVCcgJiYgcC5lZnRhICE9ICdUJyAmJiBwLm90aCA9PT0gJ1QnKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIGlmIChwLmlkID49IDEwMDAwMCkgcmV0dXJuIGNvbEtvc292b1xyXG4gICAgICAgICAgICBpZiAocC5jbyA9PT0gJ1QnKSByZXR1cm4gY29sXHJcbiAgICAgICAgICAgIGlmICh6ZiA8IDQwMCkgcmV0dXJuIGNvbFxyXG4gICAgICAgICAgICBlbHNlIGlmICh6ZiA8IDEwMDApIHJldHVybiBwLmx2bCA+PSAzID8gJycgOiBjb2xcclxuICAgICAgICAgICAgZWxzZSBpZiAoemYgPCAyMDAwKSByZXR1cm4gcC5sdmwgPj0gMiA/ICcnIDogY29sXHJcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIHAubHZsID49IDEgPyAnJyA6IGNvbFxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgb3B0cy53aWR0aCA9XHJcbiAgICAgICAgb3B0cy53aWR0aCB8fFxyXG4gICAgICAgICgoZiwgemYpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcCA9IGYucHJvcGVydGllc1xyXG4gICAgICAgICAgICBpZiAocC5jbyA9PT0gJ1QnKSByZXR1cm4gMC41XHJcbiAgICAgICAgICAgIGlmICh6ZiA8IDQwMCkgcmV0dXJuIHAubHZsID09IDMgPyAyLjIgOiBwLmx2bCA9PSAyID8gMi4yIDogcC5sdmwgPT0gMSA/IDIuMiA6IDRcclxuICAgICAgICAgICAgZWxzZSBpZiAoemYgPCAxMDAwKSByZXR1cm4gcC5sdmwgPT0gMiA/IDEuOCA6IHAubHZsID09IDEgPyAxLjggOiAyLjVcclxuICAgICAgICAgICAgZWxzZSBpZiAoemYgPCAyMDAwKSByZXR1cm4gcC5sdmwgPT0gMSA/IDEuOCA6IDIuNVxyXG4gICAgICAgICAgICBlbHNlIHJldHVybiAxLjJcclxuICAgICAgICB9KVxyXG5cclxuICAgIG9wdHMubGluZURhc2ggPVxyXG4gICAgICAgIG9wdHMubGluZURhc2ggfHxcclxuICAgICAgICAoKGYsIHpmKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHAgPSBmLnByb3BlcnRpZXNcclxuICAgICAgICAgICAgaWYgKHAuY28gPT09ICdUJykgcmV0dXJuIFtdXHJcbiAgICAgICAgICAgIGlmICh6ZiA8IDQwMClcclxuICAgICAgICAgICAgICAgIHJldHVybiBwLmx2bCA9PSAzXHJcbiAgICAgICAgICAgICAgICAgICAgPyBbMiAqIHpmLCAyICogemZdXHJcbiAgICAgICAgICAgICAgICAgICAgOiBwLmx2bCA9PSAyXHJcbiAgICAgICAgICAgICAgICAgICAgPyBbNSAqIHpmLCAyICogemZdXHJcbiAgICAgICAgICAgICAgICAgICAgOiBwLmx2bCA9PSAxXHJcbiAgICAgICAgICAgICAgICAgICAgPyBbNSAqIHpmLCAyICogemZdXHJcbiAgICAgICAgICAgICAgICAgICAgOiBbMTAgKiB6ZiwgMyAqIHpmXVxyXG4gICAgICAgICAgICBlbHNlIGlmICh6ZiA8IDEwMDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcC5sdmwgPT0gMiA/IFs1ICogemYsIDIgKiB6Zl0gOiBwLmx2bCA9PSAxID8gWzUgKiB6ZiwgMiAqIHpmXSA6IFsxMCAqIHpmLCAzICogemZdXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHpmIDwgMjAwMCkgcmV0dXJuIHAubHZsID09IDEgPyBbNSAqIHpmLCAyICogemZdIDogWzEwICogemYsIDMgKiB6Zl1cclxuICAgICAgICAgICAgZWxzZSByZXR1cm4gWzEwICogemYsIDMgKiB6Zl1cclxuICAgICAgICB9KVxyXG5cclxuICAgIG9wdHMuYmFzZVVSTCA9IG9wdHMuYmFzZVVSTCB8fCAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2V1cm9zdGF0L051dHMyanNvbi9tYXN0ZXIvcHViL3YyLydcclxuICAgIG9wdHMudXJsID0gb3B0cy5iYXNlVVJMICsgbnV0c1llYXIgKyAnLycgKyBjcnMgKyAnLycgKyBzY2FsZSArICcvbnV0c2JuXycgKyBudXRzTGV2ZWwgKyAnLmpzb24nXHJcbiAgICByZXR1cm4gb3B0c1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0UGFyYW1ldGVyQnlOYW1lID0gR2VvQ2FudmFzLmdldFBhcmFtZXRlckJ5TmFtZVxyXG5cclxuLy8gc2V0IGRlZmF1bHQgZDMgbG9jYWxlXHJcbmltcG9ydCB7IGZvcm1hdERlZmF1bHRMb2NhbGUgfSBmcm9tICdkMy1mb3JtYXQnXHJcbmZvcm1hdERlZmF1bHRMb2NhbGUoe1xyXG4gICAgZGVjaW1hbDogJy4nLFxyXG4gICAgdGhvdXNhbmRzOiAnICcsXHJcbiAgICBncm91cGluZzogWzNdLFxyXG4gICAgY3VycmVuY3k6IFsnJywgJ+KCrCddLFxyXG59KVxyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/dist/gridviz.min.js b/dist/gridviz.min.js index 0aee6e7b7..85880ae67 100644 --- a/dist/gridviz.min.js +++ b/dist/gridviz.min.js @@ -1,2 +1,2 @@ /*! For license information please see gridviz.min.js.LICENSE.txt */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.gviz=e():t.gviz=e()}(self,(()=>(()=>{"use strict";var t={d:(e,n)=>{for(var r in n)t.o(n,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:n[r]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};function n(){}function r(t){return null==t?n:function(){return this.querySelector(t)}}function i(){return[]}function o(t){return null==t?i:function(){return this.querySelectorAll(t)}}function s(t){return function(){return this.matches(t)}}function a(t){return function(e){return e.matches(t)}}t.r(e),t.d(e,{App:()=>Yl,BackgroundLayer:()=>Ol,BackgroundLayerWMS:()=>Al,BoundaryLayer:()=>Ul,CSVGrid:()=>xr,ColorCategoryLegend:()=>np,ColorDiscreteLegend:()=>Kd,ColorLegend:()=>Yd,CompositionStyle:()=>Of,ContourStyle:()=>bh,Dataset:()=>Zn,DatasetComponent:()=>dr,DotDensityStyle:()=>Dh,GeoCanvas:()=>Rn,JoyPlotStyle:()=>vf,KernelSmoothingStyle:()=>Qf,LabelLayer:()=>Bl,Layer:()=>Vn,LegoStyle:()=>hd,MosaicStyle:()=>gd,NinjaStarStyle:()=>Id,PillarStyle:()=>sh,SegmentOrientationLegend:()=>bp,SegmentStyle:()=>Pf,SegmentWidthLegend:()=>hp,ShapeColorSizeStyle:()=>rf,SideCatStyle:()=>Sh,SideStyle:()=>dh,SizeLegend:()=>ap,SquareColorCatWGLStyle:()=>rd,SquareColorWGLStyle:()=>Yh,StrokeStyle:()=>lf,Style:()=>Kl,TanakaStyle:()=>qh,TextStyle:()=>Lf,TiledGrid:()=>_l,getClass:()=>Ur,getEuronymeLabelLayer:()=>Wy,getEurostatBoundariesLayer:()=>$y,getParameterByName:()=>Gy,sCircleHigh:()=>Sp,sCircleLow:()=>xp,sExp:()=>wp,sExpInverse:()=>Op,sExpRev:()=>_p,sExpRevInverse:()=>Ip,sPow:()=>mp,sPowInverse:()=>Tp,sPowRev:()=>gp,sPowRevInverse:()=>Ap});var u=Array.prototype.find;function c(){return this.firstElementChild}var l=Array.prototype.filter;function f(){return Array.from(this.children)}function h(t){return new Array(t.length)}function d(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}function p(t,e,n,r,i,o){for(var s,a=0,u=e.length,c=o.length;ae?1:t>=e?0:NaN}d.prototype={constructor:d,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,e){return this._parent.insertBefore(t,e)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};var g="http://www.w3.org/1999/xhtml";const w={svg:"http://www.w3.org/2000/svg",xhtml:g,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function _(t){var e=t+="",n=e.indexOf(":");return n>=0&&"xmlns"!==(e=t.slice(0,n))&&(t=t.slice(n+1)),w.hasOwnProperty(e)?{space:w[e],local:t}:t}function x(t){return function(){this.removeAttribute(t)}}function S(t){return function(){this.removeAttributeNS(t.space,t.local)}}function O(t,e){return function(){this.setAttribute(t,e)}}function I(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function T(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttribute(t):this.setAttribute(t,n)}}function A(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,n)}}function M(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function C(t){return function(){this.style.removeProperty(t)}}function P(t,e,n){return function(){this.style.setProperty(t,e,n)}}function E(t,e,n){return function(){var r=e.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,n)}}function j(t,e){return t.style.getPropertyValue(e)||M(t).getComputedStyle(t,null).getPropertyValue(e)}function k(t){return function(){delete this[t]}}function B(t,e){return function(){this[t]=e}}function F(t,e){return function(){var n=e.apply(this,arguments);null==n?delete this[t]:this[t]=n}}function L(t){return t.trim().split(/^|\s+/)}function D(t){return t.classList||new N(t)}function N(t){this._node=t,this._names=L(t.getAttribute("class")||"")}function R(t,e){for(var n=D(t),r=-1,i=e.length;++r=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var lt=[null];function ft(t,e){this._groups=t,this._parents=e}function ht(){return new ft([[document.documentElement]],lt)}ft.prototype=ht.prototype={constructor:ft,select:function(t){"function"!=typeof t&&(t=r(t));for(var e=this._groups,n=e.length,i=new Array(n),o=0;o=I&&(I=O+1);!(S=_[I])&&++I=0;)(r=i[o])&&(s&&4^r.compareDocumentPosition(s)&&s.parentNode.insertBefore(r,s),s=r);return this},sort:function(t){function e(e,n){return e&&n?t(e.__data__,n.__data__):!e-!n}t||(t=m);for(var n=this._groups,r=n.length,i=new Array(r),o=0;o1?this.each((null==e?C:"function"==typeof e?E:P)(t,e,null==n?"":n)):j(this.node(),t)},property:function(t,e){return arguments.length>1?this.each((null==e?k:"function"==typeof e?F:B)(t,e)):this.node()[t]},classed:function(t,e){var n=L(t+"");if(arguments.length<2){for(var r=D(this.node()),i=-1,o=n.length;++i=0&&(e=t.slice(n+1),t=t.slice(0,n)),{type:t,name:e}}))}(t+""),s=o.length;if(!(arguments.length<2)){for(a=e?st:ot,r=0;r{}};function vt(){for(var t,e=0,n=arguments.length,r={};e=0&&(e=t.slice(n+1),t=t.slice(0,n)),t&&!r.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:e}}))),s=-1,a=o.length;if(!(arguments.length<2)){if(null!=e&&"function"!=typeof e)throw new Error("invalid callback: "+e);for(;++s0)for(var n,r,i=new Array(n),o=0;o=0&&e._call.call(void 0,t),e=e._next;--Mt}()}finally{Mt=0,function(){for(var t,e,n=Tt,r=1/0;n;)n._call?(r>n._time&&(r=n._time),t=n,n=n._next):(e=n._next,n._next=null,n=t?t._next=e:Tt=e);At=t,Wt(r)}(),kt=0}}function Vt(){var t=Ft.now(),e=t-jt;e>Et&&(Bt-=e,jt=t)}function Wt(t){Mt||(Ct&&(Ct=clearTimeout(Ct)),t-kt>24?(t<1/0&&(Ct=setTimeout(Ut,t-Ft.now()-Bt)),Pt&&(Pt=clearInterval(Pt))):(Pt||(jt=Ft.now(),Pt=setInterval(Vt,Et)),Mt=1,Lt(Ut)))}function $t(t,e,n){var r=new Rt;return e=null==e?0:+e,r.restart((n=>{r.stop(),t(n+e)}),e,n),r}Rt.prototype=zt.prototype={constructor:Rt,restart:function(t,e,n){if("function"!=typeof t)throw new TypeError("callback is not a function");n=(null==n?Dt():+n)+(null==e?0:+e),this._next||At===this||(At?At._next=this:Tt=this,At=this),this._call=t,this._time=n,Wt()},stop:function(){this._call&&(this._call=null,this._time=1/0,Wt())}};var Gt=wt("start","end","cancel","interrupt"),Yt=[],Zt=0,Ht=2,qt=3,Xt=5,Kt=6;function Jt(t,e,n,r,i,o){var s=t.__transition;if(s){if(n in s)return}else t.__transition={};!function(t,e,n){var r,i=t.__transition;function o(u){var c,l,f,h;if(1!==n.state)return a();for(c in i)if((h=i[c]).name===n.name){if(h.state===qt)return $t(o);4===h.state?(h.state=Kt,h.timer.stop(),h.on.call("interrupt",t,t.__data__,h.index,h.group),delete i[c]):+cZt)throw new Error("too late; already scheduled");return n}function te(t,e){var n=ee(t,e);if(n.state>qt)throw new Error("too late; already running");return n}function ee(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}function ne(t,e){var n,r,i,o=t.__transition,s=!0;if(o){for(i in e=null==e?null:e+"",o)(n=o[i]).name===e?(r=n.state>Ht&&n.state180?e+=360:e-t>180&&(t+=360),o.push({i:n.push(i(n)+"rotate(",null,r)-2,x:re(t,e)})):e&&n.push(i(n)+"rotate("+e+r)}(o.rotate,s.rotate,a,u),function(t,e,n,o){t!==e?o.push({i:n.push(i(n)+"skewX(",null,r)-2,x:re(t,e)}):e&&n.push(i(n)+"skewX("+e+r)}(o.skewX,s.skewX,a,u),function(t,e,n,r,o,s){if(t!==n||e!==r){var a=o.push(i(o)+"scale(",null,",",null,")");s.push({i:a-4,x:re(t,n)},{i:a-2,x:re(e,r)})}else 1===n&&1===r||o.push(i(o)+"scale("+n+","+r+")")}(o.scaleX,o.scaleY,s.scaleX,s.scaleY,a,u),o=s=null,function(t){for(var e,n=-1,r=u.length;++n>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===n?Be(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===n?Be(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=Se.exec(t))?new Le(e[1],e[2],e[3],1):(e=Oe.exec(t))?new Le(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=Ie.exec(t))?Be(e[1],e[2],e[3],e[4]):(e=Te.exec(t))?Be(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=Ae.exec(t))?Ve(e[1],e[2]/100,e[3]/100,1):(e=Me.exec(t))?Ve(e[1],e[2]/100,e[3]/100,e[4]):Ce.hasOwnProperty(t)?ke(Ce[t]):"transparent"===t?new Le(NaN,NaN,NaN,0):null}function ke(t){return new Le(t>>16&255,t>>8&255,255&t,1)}function Be(t,e,n,r){return r<=0&&(t=e=n=NaN),new Le(t,e,n,r)}function Fe(t,e,n,r){return 1===arguments.length?((i=t)instanceof ve||(i=je(i)),i?new Le((i=i.rgb()).r,i.g,i.b,i.opacity):new Le):new Le(t,e,n,null==r?1:r);var i}function Le(t,e,n,r){this.r=+t,this.g=+e,this.b=+n,this.opacity=+r}function De(){return`#${Ue(this.r)}${Ue(this.g)}${Ue(this.b)}`}function Ne(){const t=Re(this.opacity);return`${1===t?"rgb(":"rgba("}${ze(this.r)}, ${ze(this.g)}, ${ze(this.b)}${1===t?")":`, ${t})`}`}function Re(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function ze(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function Ue(t){return((t=ze(t))<16?"0":"")+t.toString(16)}function Ve(t,e,n,r){return r<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new $e(t,e,n,r)}function We(t){if(t instanceof $e)return new $e(t.h,t.s,t.l,t.opacity);if(t instanceof ve||(t=je(t)),!t)return new $e;if(t instanceof $e)return t;var e=(t=t.rgb()).r/255,n=t.g/255,r=t.b/255,i=Math.min(e,n,r),o=Math.max(e,n,r),s=NaN,a=o-i,u=(o+i)/2;return a?(s=e===o?(n-r)/a+6*(n0&&u<1?0:s,new $e(s,a,u,t.opacity)}function $e(t,e,n,r){this.h=+t,this.s=+e,this.l=+n,this.opacity=+r}function Ge(t){return(t=(t||0)%360)<0?t+360:t}function Ye(t){return Math.max(0,Math.min(1,t||0))}function Ze(t,e,n){return 255*(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)}function He(t,e,n,r,i){var o=t*t,s=o*t;return((1-3*t+3*o-s)*e+(4-6*o+3*s)*n+(1+3*t+3*o-3*s)*r+s*i)/6}pe(ve,je,{copy(t){return Object.assign(new this.constructor,this,t)},displayable(){return this.rgb().displayable()},hex:Pe,formatHex:Pe,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return We(this).formatHsl()},formatRgb:Ee,toString:Ee}),pe(Le,Fe,ye(ve,{brighter(t){return t=null==t?me:Math.pow(me,t),new Le(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=null==t?be:Math.pow(be,t),new Le(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new Le(ze(this.r),ze(this.g),ze(this.b),Re(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:De,formatHex:De,formatHex8:function(){return`#${Ue(this.r)}${Ue(this.g)}${Ue(this.b)}${Ue(255*(isNaN(this.opacity)?1:this.opacity))}`},formatRgb:Ne,toString:Ne})),pe($e,(function(t,e,n,r){return 1===arguments.length?We(t):new $e(t,e,n,null==r?1:r)}),ye(ve,{brighter(t){return t=null==t?me:Math.pow(me,t),new $e(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=null==t?be:Math.pow(be,t),new $e(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*e,i=2*n-r;return new Le(Ze(t>=240?t-240:t+120,i,r),Ze(t,i,r),Ze(t<120?t+240:t-120,i,r),this.opacity)},clamp(){return new $e(Ge(this.h),Ye(this.s),Ye(this.l),Re(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const t=Re(this.opacity);return`${1===t?"hsl(":"hsla("}${Ge(this.h)}, ${100*Ye(this.s)}%, ${100*Ye(this.l)}%${1===t?")":`, ${t})`}`}}));const qe=t=>()=>t;function Xe(t,e){var n=e-t;return n?function(t,e){return function(n){return t+n*e}}(t,n):qe(isNaN(t)?e:t)}const Ke=function t(e){var n=function(t){return 1==(t=+t)?Xe:function(e,n){return n-e?function(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(r){return Math.pow(t+r*e,n)}}(e,n,t):qe(isNaN(e)?n:e)}}(e);function r(t,e){var r=n((t=Fe(t)).r,(e=Fe(e)).r),i=n(t.g,e.g),o=n(t.b,e.b),s=Xe(t.opacity,e.opacity);return function(e){return t.r=r(e),t.g=i(e),t.b=o(e),t.opacity=s(e),t+""}}return r.gamma=t,r}(1);function Je(t){return function(e){var n,r,i=e.length,o=new Array(i),s=new Array(i),a=new Array(i);for(n=0;n=1?(n=1,e-1):Math.floor(n*e),i=t[r],o=t[r+1],s=r>0?t[r-1]:2*i-o,a=ro&&(i=e.slice(o,i),a[s]?a[s]+=i:a[++s]=i),(n=n[0])===(r=r[0])?a[s]?a[s]+=r:a[++s]=r:(a[++s]=null,u.push({i:s,x:re(n,r)})),o=tn.lastIndex;return o=0&&(t=t.slice(0,e)),!t||"start"===t}))}(e)?Qt:te;return function(){var s=o(this,t),a=s.on;a!==r&&(i=(r=a).copy()).on(e,n),s.on=i}}(n,t,e))},attr:function(t,e){var n=_(t),r="transform"===n?le:nn;return this.attrTween(t,"function"==typeof e?(n.local?cn:un)(n,r,de(this,"attr."+t,e)):null==e?(n.local?on:rn)(n):(n.local?an:sn)(n,r,e))},attrTween:function(t,e){var n="attr."+t;if(arguments.length<2)return(n=this.tween(n))&&n._value;if(null==e)return this.tween(n,null);if("function"!=typeof e)throw new Error;var r=_(t);return this.tween(n,(r.local?ln:fn)(r,e))},style:function(t,e,n){var r="transform"==(t+="")?ce:nn;return null==e?this.styleTween(t,function(t,e){var n,r,i;return function(){var o=j(this,t),s=(this.style.removeProperty(t),j(this,t));return o===s?null:o===n&&s===r?i:i=e(n=o,r=s)}}(t,r)).on("end.style."+t,bn(t)):"function"==typeof e?this.styleTween(t,function(t,e,n){var r,i,o;return function(){var s=j(this,t),a=n(this),u=a+"";return null==a&&(this.style.removeProperty(t),u=a=j(this,t)),s===u?null:s===r&&u===i?o:(i=u,o=e(r=s,a))}}(t,r,de(this,"style."+t,e))).each(function(t,e){var n,r,i,o,s="style."+e,a="end."+s;return function(){var u=te(this,t),c=u.on,l=null==u.value[s]?o||(o=bn(e)):void 0;c===n&&i===l||(r=(n=c).copy()).on(a,i=l),u.on=r}}(this._id,t)):this.styleTween(t,function(t,e,n){var r,i,o=n+"";return function(){var s=j(this,t);return s===o?null:s===r?i:i=e(r=s,n)}}(t,r,e),n).on("end.style."+t,null)},styleTween:function(t,e,n){var r="style."+(t+="");if(arguments.length<2)return(r=this.tween(r))&&r._value;if(null==e)return this.tween(r,null);if("function"!=typeof e)throw new Error;return this.tween(r,function(t,e,n){var r,i;function o(){var o=e.apply(this,arguments);return o!==i&&(r=(i=o)&&function(t,e,n){return function(r){this.style.setProperty(t,e.call(this,r),n)}}(t,o,n)),r}return o._value=e,o}(t,e,null==n?"":n))},text:function(t){return this.tween("text","function"==typeof t?function(t){return function(){var e=t(this);this.textContent=null==e?"":e}}(de(this,"text",t)):function(t){return function(){this.textContent=t}}(null==t?"":t+""))},textTween:function(t){var e="text";if(arguments.length<1)return(e=this.tween(e))&&e._value;if(null==t)return this.tween(e,null);if("function"!=typeof t)throw new Error;return this.tween(e,function(t){var e,n;function r(){var r=t.apply(this,arguments);return r!==n&&(e=(n=r)&&function(t){return function(e){this.textContent=t.call(this,e)}}(r)),e}return r._value=t,r}(t))},remove:function(){return this.on("end.remove",function(t){return function(){var e=this.parentNode;for(var n in this.__transition)if(+n!==t)return;e&&e.removeChild(this)}}(this._id))},tween:function(t,e){var n=this._id;if(t+="",arguments.length<2){for(var r,i=ee(this.node(),n).tween,o=0,s=i.length;o()=>t;function In(t,{sourceEvent:e,target:n,transform:r,dispatch:i}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},transform:{value:r,enumerable:!0,configurable:!0},_:{value:i}})}function Tn(t,e,n){this.k=t,this.x=e,this.y=n}Tn.prototype={constructor:Tn,scale:function(t){return 1===t?this:new Tn(this.k*t,this.x,this.y)},translate:function(t,e){return 0===t&0===e?this:new Tn(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var An=new Tn(1,0,0);function Mn(t){t.stopImmediatePropagation()}function Cn(t){t.preventDefault(),t.stopImmediatePropagation()}function Pn(t){return!(t.ctrlKey&&"wheel"!==t.type||t.button)}function En(){var t=this;return t instanceof SVGElement?(t=t.ownerSVGElement||t).hasAttribute("viewBox")?[[(t=t.viewBox.baseVal).x,t.y],[t.x+t.width,t.y+t.height]]:[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]:[[0,0],[t.clientWidth,t.clientHeight]]}function jn(){return this.__zoom||An}function kn(t){return-t.deltaY*(1===t.deltaMode?.05:t.deltaMode?1:.002)*(t.ctrlKey?10:1)}function Bn(){return navigator.maxTouchPoints||"ontouchstart"in this}function Fn(t,e,n){var r=t.invertX(e[0][0])-n[0][0],i=t.invertX(e[1][0])-n[1][0],o=t.invertY(e[0][1])-n[0][1],s=t.invertY(e[1][1])-n[1][1];return t.translate(i>r?(r+i)/2:Math.min(0,r)||Math.max(0,i),s>o?(o+s)/2:Math.min(0,o)||Math.max(0,s))}function Ln(t){return Ln="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ln(t)}function Dn(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);ny}s.event(t).zoom("mouse",o(g(s.that.__zoom,s.mouse[0]=It(t,i),s.mouse[1]),s.extent,c))}),!0).on("mouseup.zoom",(function(t){a.on("mousemove.zoom mouseup.zoom",null),function(t,e){var n=t.document.documentElement,r=pt(t).on("dragstart.drag",null);e&&(r.on("click.drag",xt,_t),setTimeout((function(){r.on("click.drag",null)}),0)),"onselectstart"in n?r.on("selectstart.drag",null):(n.style.MozUserSelect=n.__noselect,delete n.__noselect)}(t.view,s.moved),Cn(t),s.event(t).end()}),!0),u=It(t,i),l=t.clientX,f=t.clientY;!function(t){var e=t.document.documentElement,n=pt(t).on("dragstart.drag",xt,_t);"onselectstart"in e?n.on("selectstart.drag",xt,_t):(e.__noselect=e.style.MozUserSelect,e.style.MozUserSelect="none")}(t.view),Mn(t),s.mouse=[u,this.__zoom.invert(u)],ne(this),s.start()}}function T(t,...e){if(r.apply(this,arguments)){var n=this.__zoom,s=It(t.changedTouches?t.changedTouches[0]:t,this),a=n.invert(s),u=n.k*(t.shiftKey?.5:2),f=o(g(m(n,u),s,a),i.apply(this,e),c);Cn(t),l>0?pt(this).transition().duration(l).call(_,f,s,t):pt(this).call(b.transform,f,s,t)}}function A(n,...i){if(r.apply(this,arguments)){var o,s,a,u,c=n.touches,l=c.length,f=x(this,i,n.changedTouches.length===l).event(n);for(Mn(n),s=0;s=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(s.targetTouches);try{for(f.s();!(u=f.n()).done;){var h=u.value;c+=h.clientX,l+=h.clientY}}catch(t){f.e(t)}finally{f.f()}c/=s.targetTouches.length,l/=s.targetTouches.length,o.zoom(n,o.pixToGeoX(c),o.pixToGeoY(l))}}a=e,o.onZoomFun&&o.onZoomFun(t)})).on("start",(function(t){o.canvasSave.c=document.createElement("canvas"),o.canvasSave.c.setAttribute("width",""+o.w),o.canvasSave.c.setAttribute("height",""+o.h),o.canvasSave.c.getContext("2d").drawImage(o.canvas,0,0),o.canvasSave.dx=0,o.canvasSave.dy=0,o.canvasSave.f=1,o.onZoomStartFun&&o.onZoomStartFun(t)})).on("end",(function(t){o.redraw(!0),o.canvasSave={c:null,dx:0,dy:0,f:1},o.onZoomEndFun&&o.onZoomEndFun(t)}))(pt(this.canvas))}this.zfExtent=[0,1/0],this.canvasSave={c:null,dx:0,dy:0,f:1}}var e,n,r;return e=t,n=[{key:"setCenter",value:function(t){this.center=t}},{key:"getCenter",value:function(){return this.center}},{key:"setZf",value:function(t){this.zf=t,this.slider&&this.slider.attr("value",+this.zf)}},{key:"getZf",value:function(){return this.zf}},{key:"setZfExtent",value:function(t){this.zfExtent=t}},{key:"getZfExtent",value:function(){return this.zfExtent}},{key:"initCanvasTransform",value:function(){this.ctx.setTransform(1,0,0,1,0,0)}},{key:"setCanvasTransform",value:function(){var t=1/this.getZf(),e=-this.center.x/this.getZf()+.5*this.w,n=this.center.y/this.getZf()+.5*this.h;this.ctx.setTransform(t,0,0,-t,e,n)}},{key:"getWebGLTransform",value:function(){var t=2/(this.w*this.getZf()),e=2/(this.h*this.getZf());return[t,0,0,0,e,0,-t*this.center.x,-e*this.center.y,1]}},{key:"redraw",value:function(){throw new Error("Method redraw not implemented.")}},{key:"clear",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"white";this.opts.transparentBackground?this.ctx.clearRect(0,0,this.w,this.h):(this.ctx&&(this.ctx.fillStyle=t),this.ctx.fillRect(0,0,this.w,this.h))}},{key:"pan",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.center.x+=t,this.center.y+=e,this.updateExtentGeo(),this.canvasSave.c&&(this.canvasSave.dx-=t/this.getZf(),this.canvasSave.dy+=e/this.getZf(),this.clear(this.backgroundColor),this.ctx.drawImage(this.canvasSave.c,this.canvasSave.dx,this.canvasSave.dy))}},{key:"zoom",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.center.x,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.center.y;if(!(this.zfExtent[0]==this.getZf()&&t<=1||this.zfExtent[1]==this.getZf()&&t>=1)){var r=t*this.getZf();rthis.zfExtent[1]&&(t=this.zfExtent[1]/this.getZf()),this.setZf(t*this.getZf());var i=(e-this.center.x)*(1-t);this.center.x+=i;var o=(n-this.center.y)*(1-t);this.center.y+=o,this.updateExtentGeo(),this.canvasSave.c&&(this.clear(this.backgroundColor),this.canvasSave.f/=t,this.canvasSave.dx=this.geoToPixX(e)*(1-this.canvasSave.f),this.canvasSave.dy=this.geoToPixY(n)*(1-this.canvasSave.f),this.clear(this.backgroundColor),this.ctx.drawImage(this.canvasSave.c,this.canvasSave.dx,this.canvasSave.dy,this.canvasSave.f*this.canvasSave.c.width,this.canvasSave.f*this.canvasSave.c.height))}}},{key:"updateExtentGeo",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:20;return this.extGeo={xMin:this.pixToGeoX(-t),xMax:this.pixToGeoX(this.w+t),yMin:this.pixToGeoY(this.h+t),yMax:this.pixToGeoY(-t)},this.extGeo}},{key:"toDraw",value:function(t){return!(t.xthis.extGeo.xMax||t.ythis.extGeo.yMax)}},{key:"geoToPixX",value:function(t){return(t-this.center.x)/this.getZf()+.5*this.w}},{key:"geoToPixY",value:function(t){return-(t-this.center.y)/this.getZf()+.5*this.h}},{key:"pixToGeoX",value:function(t){return(t-.5*this.w)*this.getZf()+this.center.x}},{key:"pixToGeoY",value:function(t){return-(t-.5*this.h)*this.getZf()+this.center.y}},{key:"setViewFromURL",value:function(){var e=t.getParameterByName("x"),n=t.getParameterByName("y"),r=t.getParameterByName("z"),i=this.getCenter();null==e||null==e||isNaN(+e)||(i.x=+e),null==n||null==n||isNaN(+n)||(i.y=+n),null==r||null==r||isNaN(+r)||this.setZf(+r)}},{key:"addZoomSlider",value:function(t,e){(e=e||{}).width=e.width||"30px",e.height=e.height||"300px";var n=pt("#"+t);if(n.empty())return console.error("Could not find div element to build zoom slider. Id: "+t),this;var r=this;return this.slider=n.append("input").attr("type","range").attr("min",this.getZfExtent()[0]).attr("max",this.getZfExtent()[1]).attr("value",this.getZf()).on("input",(function(t){if(this&&this.value){var e=+this.value;pt(this).attr("value",e),r.setZf(e),r.redraw()}})).style("width",e.width).style("height",e.height).style("opacity",.7).on("mouseover",(function(t){pt(this).style("opacity",1)})).on("mouseout",(function(t){pt(this).style("opacity",.7)})).style("-webkit-appearance","slider-vertical").style("writing-mode","bt-lr").attr("orient","vertical").style("background","lightgray").style("outline","none").style("-webkit-transition",".2s").style("transition","opacity .2s"),this}}],r=[{key:"getParameterByName",value:function(t){t=t.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var e=new RegExp("[\\?&]"+t+"=([^&#]*)").exec(location.search);return e?decodeURIComponent(e[1].replace(/\+/g," ")):null}}],n&&Nn(e.prototype,n),r&&Nn(e,r),Object.defineProperty(e,"prototype",{writable:!1}),t}();function zn(t){return zn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},zn(t)}function Un(t,e){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:{};if(function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),r=r||{},this.dataset=e,this.styles=n,this.visible=0!=r.visible,this.minZoom=r.minZoom||0,this.maxZoom=r.maxZoom||1/0,this.minZoom>=this.maxZoom)throw new Error("Unexpected zoom limits for layer. Zoom min should be smaller than zoom max.");this.pixNb=r.pixNb||3,this.cellInfoHTML=r.cellInfoHTML||t.defaultCellInfoHTML}var e,n,r;return e=t,r=[{key:"defaultCellInfoHTML",value:function(t){for(var e=[],n=0,r=Object.keys(t);n",i,""," : ",t[i],"
")}return e.join("")}}],(n=[{key:"getDatasetComponent",value:function(t){if(!(tthis.maxZoom)){if(1==this.dataset.datasetComponents.length)return this.dataset.datasetComponents[0];for(var e=this.dataset.resolutions,n=0,r=e[n]/this.pixNb;r=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function Gn(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n2&&void 0!==arguments[2]?arguments[2]:{};if(function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),r=r||{},this.datasetComponents=e,this.resolutions=n,this.datasetComponents.length>1&&this.datasetComponents.length!=this.resolutions.length)throw new Error("Uncompatible number of datasets and resolutions: "+this.datasetComponents.length+" "+this.resolutions.length);r.preprocess&&this.setPrepocesses(r.preprocess)}var e,n,r;return e=t,r=[{key:"make",value:function(e,n,r){var i,o=[],s=$n(e);try{for(s.s();!(i=s.n()).done;){var a=i.value;o.push(n(a))}}catch(t){s.e(t)}finally{s.f()}return new t(o,e,r)}}],(n=[{key:"setPrepocesses",value:function(t){var e,n=$n(this.datasetComponents);try{for(n.s();!(e=n.n()).done;)e.value.preprocess=t}catch(t){n.e(t)}finally{n.f()}return this}}])&&Yn(e.prototype,n),r&&Yn(e,r),Object.defineProperty(e,"prototype",{writable:!1}),t}();function Hn(t){return Hn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Hn(t)}function qn(t,e){for(var n=0;n=o?u=!0:10===(r=t.charCodeAt(s++))?c=!0:13===r&&(c=!0,10===t.charCodeAt(s)&&++s),t.slice(i+1,e-1).replace(/""/g,'"')}for(;s9999?"+"+er(r,6):er(r,4))+"-"+er(n.getUTCMonth()+1,2)+"-"+er(n.getUTCDate(),2)+(a?"T"+er(i,2)+":"+er(o,2)+":"+er(s,2)+"."+er(a,3)+"Z":s?"T"+er(i,2)+":"+er(o,2)+":"+er(s,2)+"Z":o||i?"T"+er(i,2)+":"+er(o,2)+"Z":"")):e.test(t+="")?'"'+t.replace(/"/g,'""')+'"':t;var n,r,i,o,s,a}return{parse:function(t,e){var n,i,o=r(t,(function(t,r){if(n)return n(t,r-1);i=t,n=e?function(t,e){var n=Qn(t);return function(r,i){return e(n(r),i,t)}}(t,e):Qn(t)}));return o.columns=i||[],o},parseRows:r,format:function(e,n){return null==n&&(n=tr(e)),[n.map(s).join(t)].concat(i(e,n)).join("\n")},formatBody:function(t,e){return null==e&&(e=tr(t)),i(t,e).join("\n")},formatRows:function(t){return t.map(o).join("\n")},formatRow:o,formatValue:s}}var rr=nr(","),ir=rr.parse,or=(rr.parseRows,rr.format,rr.formatBody,rr.formatRows,rr.formatRow,rr.formatValue,nr("\t")),sr=or.parse;function ar(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);return t.text()}function ur(t){return function(e,n,r){return 2===arguments.length&&"function"==typeof n&&(r=n,n=void 0),function(t,e){return fetch(t,e).then(ar)}(e,n).then((function(e){return t(e,r)}))}}or.parseRows,or.format,or.formatBody,or.formatRows,or.formatRow,or.formatValue;var cr=ur(ir);function lr(t){return lr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},lr(t)}function fr(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n2&&void 0!==arguments[2]?arguments[2]:{};!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),r=r||{},this.url=e,this.resolution=n,this.preprocess=r.preprocess||void 0,this.cellsViewCache=[]}var e,n;return e=t,(n=[{key:"getData",value:function(t,e){throw new Error("Method getData not implemented.")}},{key:"updateViewCache",value:function(t){throw new Error("Method updateViewCache not implemented.")}},{key:"getCellFromPosition",value:function(t,e){var n,r=this.getResolution(),i=r*Math.floor(t.x/r),o=r*Math.floor(t.y/r),s=function(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return fr(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?fr(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,i=function(){};return{s:i,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(e);try{for(s.s();!(n=s.n()).done;){var a=n.value;if(a.x==i&&a.y==o)return a}}catch(t){s.e(t)}finally{s.f()}}},{key:"getResolution",value:function(){return this.resolution}},{key:"getViewCache",value:function(){return this.cellsViewCache}}])&&hr(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();function pr(t){return pr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},pr(t)}function yr(){yr=function(){return t};var t={},e=Object.prototype,n=e.hasOwnProperty,r=Object.defineProperty||function(t,e,n){t[e]=n.value},i="function"==typeof Symbol?Symbol:{},o=i.iterator||"@@iterator",s=i.asyncIterator||"@@asyncIterator",a=i.toStringTag||"@@toStringTag";function u(t,e,n){return Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{u({},"")}catch(t){u=function(t,e,n){return t[e]=n}}function c(t,e,n,i){var o=e&&e.prototype instanceof h?e:h,s=Object.create(o.prototype),a=new I(i||[]);return r(s,"_invoke",{value:_(t,n,a)}),s}function l(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(t){return{type:"throw",arg:t}}}t.wrap=c;var f={};function h(){}function d(){}function p(){}var y={};u(y,o,(function(){return this}));var v=Object.getPrototypeOf,b=v&&v(v(T([])));b&&b!==e&&n.call(b,o)&&(y=b);var m=p.prototype=h.prototype=Object.create(y);function g(t){["next","throw","return"].forEach((function(e){u(t,e,(function(t){return this._invoke(e,t)}))}))}function w(t,e){function i(r,o,s,a){var u=l(t[r],t,o);if("throw"!==u.type){var c=u.arg,f=c.value;return f&&"object"==pr(f)&&n.call(f,"__await")?e.resolve(f.__await).then((function(t){i("next",t,s,a)}),(function(t){i("throw",t,s,a)})):e.resolve(f).then((function(t){c.value=t,s(c)}),(function(t){return i("throw",t,s,a)}))}a(u.arg)}var o;r(this,"_invoke",{value:function(t,n){function r(){return new e((function(e,r){i(t,n,e,r)}))}return o=o?o.then(r,r):r()}})}function _(t,e,n){var r="suspendedStart";return function(i,o){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===i)throw o;return{value:void 0,done:!0}}for(n.method=i,n.arg=o;;){var s=n.delegate;if(s){var a=x(s,n);if(a){if(a===f)continue;return a}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var u=l(t,e,n);if("normal"===u.type){if(r=n.done?"completed":"suspendedYield",u.arg===f)continue;return{value:u.arg,done:n.done}}"throw"===u.type&&(r="completed",n.method="throw",n.arg=u.arg)}}}function x(t,e){var n=e.method,r=t.iterator[n];if(void 0===r)return e.delegate=null,"throw"===n&&t.iterator.return&&(e.method="return",e.arg=void 0,x(t,e),"throw"===e.method)||"return"!==n&&(e.method="throw",e.arg=new TypeError("The iterator does not provide a '"+n+"' method")),f;var i=l(r,t.iterator,e.arg);if("throw"===i.type)return e.method="throw",e.arg=i.arg,e.delegate=null,f;var o=i.arg;return o?o.done?(e[t.resultName]=o.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=void 0),e.delegate=null,f):o:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,f)}function S(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function O(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function I(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(S,this),this.reset(!0)}function T(t){if(t){var e=t[o];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var r=-1,i=function e(){for(;++r=0;--i){var o=this.tryEntries[i],s=o.completion;if("root"===o.tryLoc)return r("end");if(o.tryLoc<=this.prev){var a=n.call(o,"catchLoc"),u=n.call(o,"finallyLoc");if(a&&u){if(this.prev=0;--r){var i=this.tryEntries[r];if(i.tryLoc<=this.prev&&n.call(i,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),O(n),f}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var i=r.arg;O(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:T(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=void 0),f}},t}function vr(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return br(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?br(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,i=function(){};return{s:i,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function br(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n2&&void 0!==arguments[2]?arguments[2]:{};return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),(n=o.call(this,t,e,r)).cells=[],n.infoLoadingStatus="notLoaded",n}return e=s,n=[{key:"getData",value:function(t,e){var n,r=this;return"notLoaded"!=this.infoLoadingStatus||(this.infoLoadingStatus="loading",(n=yr().mark((function t(){var n,i,o,s,a,u,c;return yr().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,cr(r.url);case 3:n=t.sent,i=vr(n);try{for(i.s();!(o=i.n()).done;)(s=o.value).x=+s.x,s.y=+s.y}catch(t){i.e(t)}finally{i.f()}if(!r.preprocess){t.next=29;break}r.cells=[],a=vr(n),t.prev=9,a.s();case 11:if((u=a.n()).done){t.next=19;break}if(c=u.value,0!=r.preprocess(c)){t.next=16;break}return t.abrupt("continue",17);case 16:r.cells.push(c);case 17:t.next=11;break;case 19:t.next=24;break;case 21:t.prev=21,t.t0=t.catch(9),a.e(t.t0);case 24:return t.prev=24,a.f(),t.finish(24);case 27:t.next=30;break;case 29:r.cells=n;case 30:e&&e(),r.infoLoadingStatus="loaded",t.next=38;break;case 34:t.prev=34,t.t1=t.catch(0),r.infoLoadingStatus="failed",r.cells=[];case 38:case"end":return t.stop()}}),t,null,[[0,34],[9,21,24,27]])})),function(){var t=this,e=arguments;return new Promise((function(r,i){var o=n.apply(t,e);function s(t){mr(o,r,i,s,a,"next",t)}function a(t){mr(o,r,i,s,a,"throw",t)}s(void 0)}))})()),this}},{key:"updateViewCache",value:function(t){if(this.cells){this.cellsViewCache=[];var e,n=vr(this.cells);try{for(n.s();!(e=n.n()).done;){var r=e.value;+r.x+this.resolutiont.xMax||+r.y+this.resolutiont.yMax||this.cellsViewCache.push(r)}}catch(t){n.e(t)}finally{n.f()}}}}],n&&gr(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),s}(dr);function Sr(t){return Sr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Sr(t)}function Or(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(this.cells);try{for(u.s();!(a=u.n()).done;){var c=a.value;c.x=this.extGeo.xMin+c.x*o,c.y=this.extGeo.yMin+c.y*o}}catch(t){u.e(t)}finally{u.f()}}));function Ur(t,e){if(e){if(0==e.length)return 0;if(t<=e[0])return 0;for(var n=1;n$r(t)))}]`:`[${t}]`:ArrayBuffer.isView(t)?`[${t}]`:JSON.stringify(t,((t,e)=>"bigint"==typeof e?`${e}`:e))}function Gr(t,e,n,r){return new(n||(n=Promise))((function(i,o){function s(t){try{u(r.next(t))}catch(t){o(t)}}function a(t){try{u(r.throw(t))}catch(t){o(t)}}function u(t){var e;t.done?i(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,a)}u((r=r.apply(t,e||[])).next())}))}function Yr(t){return this instanceof Yr?(this.v=t,this):new Yr(t)}function Zr(t,e,n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var r,i=n.apply(t,e||[]),o=[];return r={},s("next"),s("throw"),s("return"),r[Symbol.asyncIterator]=function(){return this},r;function s(t){i[t]&&(r[t]=function(e){return new Promise((function(n,r){o.push([t,e,n,r])>1||a(t,e)}))})}function a(t,e){try{(n=i[t](e)).value instanceof Yr?Promise.resolve(n.value.v).then(u,c):l(o[0][2],n)}catch(t){l(o[0][3],t)}var n}function u(t){a("next",t)}function c(t){a("throw",t)}function l(t,e){t(e),o.shift(),o.length&&a(o[0][0],o[0][1])}}function Hr(t){var e,n;return e={},r("next"),r("throw",(function(t){throw t})),r("return"),e[Symbol.iterator]=function(){return this},e;function r(r,i){e[r]=t[r]?function(e){return(n=!n)?{value:Yr(t[r](e)),done:!1}:i?i(e):e}:i}}function qr(t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var e,n=t[Symbol.asyncIterator];return n?n.call(t):(t=function(t){var e="function"==typeof Symbol&&Symbol.iterator,n=e&&t[e],r=0;if(n)return n.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}(t),e={},r("next"),r("throw"),r("return"),e[Symbol.asyncIterator]=function(){return this},e);function r(n){e[n]=t[n]&&function(e){return new Promise((function(r,i){!function(t,e,n,r){Promise.resolve(r).then((function(e){t({value:e,done:n})}),e)}(r,i,(e=t[n](e)).done,e.value)}))}}}!function(t){t[t.V1=0]="V1",t[t.V2=1]="V2",t[t.V3=2]="V3",t[t.V4=3]="V4",t[t.V5=4]="V5"}(Ar||(Ar={})),(Rr=Mr||(Mr={}))[Rr.Sparse=0]="Sparse",Rr[Rr.Dense=1]="Dense",function(t){t[t.HALF=0]="HALF",t[t.SINGLE=1]="SINGLE",t[t.DOUBLE=2]="DOUBLE"}(Cr||(Cr={})),(Nr=Pr||(Pr={}))[Nr.DAY=0]="DAY",Nr[Nr.MILLISECOND=1]="MILLISECOND",(Dr=Er||(Er={}))[Dr.SECOND=0]="SECOND",Dr[Dr.MILLISECOND=1]="MILLISECOND",Dr[Dr.MICROSECOND=2]="MICROSECOND",Dr[Dr.NANOSECOND=3]="NANOSECOND",(Lr=jr||(jr={}))[Lr.YEAR_MONTH=0]="YEAR_MONTH",Lr[Lr.DAY_TIME=1]="DAY_TIME",Lr[Lr.MONTH_DAY_NANO=2]="MONTH_DAY_NANO",function(t){t[t.NONE=0]="NONE",t[t.Schema=1]="Schema",t[t.DictionaryBatch=2]="DictionaryBatch",t[t.RecordBatch=3]="RecordBatch",t[t.Tensor=4]="Tensor",t[t.SparseTensor=5]="SparseTensor"}(kr||(kr={})),function(t){t[t.NONE=0]="NONE",t[t.Null=1]="Null",t[t.Int=2]="Int",t[t.Float=3]="Float",t[t.Binary=4]="Binary",t[t.Utf8=5]="Utf8",t[t.Bool=6]="Bool",t[t.Decimal=7]="Decimal",t[t.Date=8]="Date",t[t.Time=9]="Time",t[t.Timestamp=10]="Timestamp",t[t.Interval=11]="Interval",t[t.List=12]="List",t[t.Struct=13]="Struct",t[t.Union=14]="Union",t[t.FixedSizeBinary=15]="FixedSizeBinary",t[t.FixedSizeList=16]="FixedSizeList",t[t.Map=17]="Map",t[t.Dictionary=-1]="Dictionary",t[t.Int8=-2]="Int8",t[t.Int16=-3]="Int16",t[t.Int32=-4]="Int32",t[t.Int64=-5]="Int64",t[t.Uint8=-6]="Uint8",t[t.Uint16=-7]="Uint16",t[t.Uint32=-8]="Uint32",t[t.Uint64=-9]="Uint64",t[t.Float16=-10]="Float16",t[t.Float32=-11]="Float32",t[t.Float64=-12]="Float64",t[t.DateDay=-13]="DateDay",t[t.DateMillisecond=-14]="DateMillisecond",t[t.TimestampSecond=-15]="TimestampSecond",t[t.TimestampMillisecond=-16]="TimestampMillisecond",t[t.TimestampMicrosecond=-17]="TimestampMicrosecond",t[t.TimestampNanosecond=-18]="TimestampNanosecond",t[t.TimeSecond=-19]="TimeSecond",t[t.TimeMillisecond=-20]="TimeMillisecond",t[t.TimeMicrosecond=-21]="TimeMicrosecond",t[t.TimeNanosecond=-22]="TimeNanosecond",t[t.DenseUnion=-23]="DenseUnion",t[t.SparseUnion=-24]="SparseUnion",t[t.IntervalDayTime=-25]="IntervalDayTime",t[t.IntervalYearMonth=-26]="IntervalYearMonth"}(Br||(Br={})),function(t){t[t.OFFSET=0]="OFFSET",t[t.DATA=1]="DATA",t[t.VALIDITY=2]="VALIDITY",t[t.TYPE=3]="TYPE"}(Fr||(Fr={})),Object.create,Object.create;const Xr=new TextDecoder("utf-8"),Kr=t=>Xr.decode(t),Jr=new TextEncoder,Qr=t=>Jr.encode(t),[ti,ei]=(()=>{const t=()=>{throw new Error("BigInt is not available in this environment")};function e(){throw t()}return e.asIntN=()=>{throw t()},e.asUintN=()=>{throw t()},"undefined"!=typeof BigInt?[BigInt,!0]:[e,!1]})(),[ni,ri]=(()=>{const t=()=>{throw new Error("BigInt64Array is not available in this environment")};return"undefined"!=typeof BigInt64Array?[BigInt64Array,!0]:[class{static get BYTES_PER_ELEMENT(){return 8}static of(){throw t()}static from(){throw t()}constructor(){throw t()}},!1]})(),[ii,oi]=(()=>{const t=()=>{throw new Error("BigUint64Array is not available in this environment")};return"undefined"!=typeof BigUint64Array?[BigUint64Array,!0]:[class{static get BYTES_PER_ELEMENT(){return 8}static of(){throw t()}static from(){throw t()}constructor(){throw t()}},!1]})(),si=t=>"function"==typeof t,ai=t=>null!=t&&Object(t)===t,ui=t=>ai(t)&&si(t.then),ci=t=>ai(t)&&si(t[Symbol.iterator]),li=t=>ai(t)&&si(t[Symbol.asyncIterator]),fi=t=>ai(t)&&ai(t.schema),hi=t=>ai(t)&&"done"in t&&"value"in t,di=t=>ai(t)&&si(t.stat)&&(t=>"number"==typeof t)(t.fd),pi=t=>ai(t)&&vi(t.body),yi=t=>"_getDOMStream"in t&&"_getNodeStream"in t,vi=t=>ai(t)&&si(t.cancel)&&si(t.getReader)&&!yi(t),bi=t=>ai(t)&&si(t.read)&&si(t.pipe)&&(t=>"boolean"==typeof t)(t.readable)&&!yi(t),mi=t=>ai(t)&&si(t.clear)&&si(t.bytes)&&si(t.position)&&si(t.setPosition)&&si(t.capacity)&&si(t.getBufferIdentifier)&&si(t.createLong),gi="undefined"!=typeof SharedArrayBuffer?SharedArrayBuffer:ArrayBuffer;function wi(t,e,n=0,r=e.byteLength){const i=t.byteLength,o=new Uint8Array(t.buffer,t.byteOffset,i),s=new Uint8Array(e.buffer,e.byteOffset,Math.min(r,i));return o.set(s,n),t}function _i(t,e){const n=function(t){const e=t[0]?[t[0]]:[];let n,r,i,o;for(let s,a,u=0,c=0,l=t.length;++ut+e.byteLength),0);let i,o,s,a=0,u=-1;const c=Math.min(e||Number.POSITIVE_INFINITY,r);for(const t=n.length;++uxi(Int32Array,t),Oi=t=>xi(Uint8Array,t),Ii=t=>(t.next(),t);function Ti(t,e){return Zr(this,arguments,(function*(){if(ui(e))return yield Yr(yield Yr(yield*Hr(qr(Ti(t,yield Yr(e))))));const n=function(t){return Zr(this,arguments,(function*(){yield yield Yr(yield Yr(t))}))},r="string"==typeof e||ArrayBuffer.isView(e)||e instanceof ArrayBuffer||e instanceof gi?n(e):ci(e)?function(t){return Zr(this,arguments,(function*(){yield Yr(yield*Hr(qr(Ii(function*(t){let e=null;do{e=t.next(yield null==e?void 0:e.value)}while(!e.done)}(t[Symbol.iterator]())))))}))}(e):li(e)?e:n(e);return yield Yr(yield*Hr(qr(Ii(function(e){return Zr(this,arguments,(function*(){let n=null;do{n=yield Yr(e.next(yield yield Yr(xi(t,n))))}while(!n.done)}))}(r[Symbol.asyncIterator]()))))),yield Yr(new t)}))}const Ai=Symbol.for("isArrowBigNum");function Mi(t,...e){return 0===e.length?Object.setPrototypeOf(xi(this.TypedArray,t),this.constructor.prototype):Object.setPrototypeOf(new this.TypedArray(t,...e),this.constructor.prototype)}function Ci(...t){return Mi.apply(this,t)}function Pi(...t){return Mi.apply(this,t)}function Ei(...t){return Mi.apply(this,t)}function ji(t){const{buffer:e,byteOffset:n,length:r,signed:i}=t,o=new ii(e,n,r),s=i&&o[o.length-1]&BigInt(1)<8===t.byteLength?new t.BigIntArray(t.buffer,t.byteOffset,1)[0]:Fi(t),ki=t=>8===t.byteLength?`${new t.BigIntArray(t.buffer,t.byteOffset,1)[0]}`:Fi(t)):(ki=Fi,Bi=ki);class Li{static new(t,e){switch(e){case!0:return new Ci(t);case!1:return new Pi(t)}switch(t.constructor){case Int8Array:case Int16Array:case Int32Array:case ni:return new Ci(t)}return 16===t.byteLength?new Ei(t):new Pi(t)}static signed(t){return new Ci(t)}static unsigned(t){return new Pi(t)}static decimal(t){return new Ei(t)}constructor(t,e){return Li.new(t,e)}}var Di,Ni,Ri,zi,Ui,Vi,Wi,$i,Gi,Yi,Zi,Hi,qi,Xi,Ki,Ji,Qi,to,eo,no;class ro{static isNull(t){return(null==t?void 0:t.typeId)===Br.Null}static isInt(t){return(null==t?void 0:t.typeId)===Br.Int}static isFloat(t){return(null==t?void 0:t.typeId)===Br.Float}static isBinary(t){return(null==t?void 0:t.typeId)===Br.Binary}static isUtf8(t){return(null==t?void 0:t.typeId)===Br.Utf8}static isBool(t){return(null==t?void 0:t.typeId)===Br.Bool}static isDecimal(t){return(null==t?void 0:t.typeId)===Br.Decimal}static isDate(t){return(null==t?void 0:t.typeId)===Br.Date}static isTime(t){return(null==t?void 0:t.typeId)===Br.Time}static isTimestamp(t){return(null==t?void 0:t.typeId)===Br.Timestamp}static isInterval(t){return(null==t?void 0:t.typeId)===Br.Interval}static isList(t){return(null==t?void 0:t.typeId)===Br.List}static isStruct(t){return(null==t?void 0:t.typeId)===Br.Struct}static isUnion(t){return(null==t?void 0:t.typeId)===Br.Union}static isFixedSizeBinary(t){return(null==t?void 0:t.typeId)===Br.FixedSizeBinary}static isFixedSizeList(t){return(null==t?void 0:t.typeId)===Br.FixedSizeList}static isMap(t){return(null==t?void 0:t.typeId)===Br.Map}static isDictionary(t){return(null==t?void 0:t.typeId)===Br.Dictionary}static isDenseUnion(t){return ro.isUnion(t)&&t.mode===Mr.Dense}static isSparseUnion(t){return ro.isUnion(t)&&t.mode===Mr.Sparse}get typeId(){return Br.NONE}}Di=Symbol.toStringTag,ro[Di]=((no=ro.prototype).children=null,no.ArrayType=Array,no[Symbol.toStringTag]="DataType");class io extends ro{toString(){return"Null"}get typeId(){return Br.Null}}Ni=Symbol.toStringTag,io[Ni]=(t=>t[Symbol.toStringTag]="Null")(io.prototype);class oo extends ro{constructor(t,e){super(),this.isSigned=t,this.bitWidth=e}get typeId(){return Br.Int}get ArrayType(){switch(this.bitWidth){case 8:return this.isSigned?Int8Array:Uint8Array;case 16:return this.isSigned?Int16Array:Uint16Array;case 32:return this.isSigned?Int32Array:Uint32Array;case 64:return this.isSigned?BigInt64Array:BigUint64Array}throw new Error(`Unrecognized ${this[Symbol.toStringTag]} type`)}toString(){return`${this.isSigned?"I":"Ui"}nt${this.bitWidth}`}}Ri=Symbol.toStringTag,oo[Ri]=(t=>(t.isSigned=null,t.bitWidth=null,t[Symbol.toStringTag]="Int"))(oo.prototype);class so extends oo{constructor(){super(!0,32)}get ArrayType(){return Int32Array}}Object.defineProperty(class extends oo{constructor(){super(!0,8)}get ArrayType(){return Int8Array}}.prototype,"ArrayType",{value:Int8Array}),Object.defineProperty(class extends oo{constructor(){super(!0,16)}get ArrayType(){return Int16Array}}.prototype,"ArrayType",{value:Int16Array}),Object.defineProperty(so.prototype,"ArrayType",{value:Int32Array}),Object.defineProperty(class extends oo{constructor(){super(!0,64)}get ArrayType(){return BigInt64Array}}.prototype,"ArrayType",{value:BigInt64Array}),Object.defineProperty(class extends oo{constructor(){super(!1,8)}get ArrayType(){return Uint8Array}}.prototype,"ArrayType",{value:Uint8Array}),Object.defineProperty(class extends oo{constructor(){super(!1,16)}get ArrayType(){return Uint16Array}}.prototype,"ArrayType",{value:Uint16Array}),Object.defineProperty(class extends oo{constructor(){super(!1,32)}get ArrayType(){return Uint32Array}}.prototype,"ArrayType",{value:Uint32Array}),Object.defineProperty(class extends oo{constructor(){super(!1,64)}get ArrayType(){return BigUint64Array}}.prototype,"ArrayType",{value:BigUint64Array});class ao extends ro{constructor(t){super(),this.precision=t}get typeId(){return Br.Float}get ArrayType(){switch(this.precision){case Cr.HALF:return Uint16Array;case Cr.SINGLE:return Float32Array;case Cr.DOUBLE:return Float64Array}throw new Error(`Unrecognized ${this[Symbol.toStringTag]} type`)}toString(){return`Float${this.precision<<5||16}`}}zi=Symbol.toStringTag,ao[zi]=(t=>(t.precision=null,t[Symbol.toStringTag]="Float"))(ao.prototype),Object.defineProperty(class extends ao{constructor(){super(Cr.HALF)}}.prototype,"ArrayType",{value:Uint16Array}),Object.defineProperty(class extends ao{constructor(){super(Cr.SINGLE)}}.prototype,"ArrayType",{value:Float32Array}),Object.defineProperty(class extends ao{constructor(){super(Cr.DOUBLE)}}.prototype,"ArrayType",{value:Float64Array});class uo extends ro{constructor(){super()}get typeId(){return Br.Binary}toString(){return"Binary"}}Ui=Symbol.toStringTag,uo[Ui]=(t=>(t.ArrayType=Uint8Array,t[Symbol.toStringTag]="Binary"))(uo.prototype);class co extends ro{constructor(){super()}get typeId(){return Br.Utf8}toString(){return"Utf8"}}Vi=Symbol.toStringTag,co[Vi]=(t=>(t.ArrayType=Uint8Array,t[Symbol.toStringTag]="Utf8"))(co.prototype);class lo extends ro{constructor(){super()}get typeId(){return Br.Bool}toString(){return"Bool"}}Wi=Symbol.toStringTag,lo[Wi]=(t=>(t.ArrayType=Uint8Array,t[Symbol.toStringTag]="Bool"))(lo.prototype);class fo extends ro{constructor(t,e,n=128){super(),this.scale=t,this.precision=e,this.bitWidth=n}get typeId(){return Br.Decimal}toString(){return`Decimal[${this.precision}e${this.scale>0?"+":""}${this.scale}]`}}$i=Symbol.toStringTag,fo[$i]=(t=>(t.scale=null,t.precision=null,t.ArrayType=Uint32Array,t[Symbol.toStringTag]="Decimal"))(fo.prototype);class ho extends ro{constructor(t){super(),this.unit=t}get typeId(){return Br.Date}toString(){return`Date${32*(this.unit+1)}<${Pr[this.unit]}>`}}Gi=Symbol.toStringTag,ho[Gi]=(t=>(t.unit=null,t.ArrayType=Int32Array,t[Symbol.toStringTag]="Date"))(ho.prototype);class po extends ro{constructor(t,e){super(),this.unit=t,this.bitWidth=e}get typeId(){return Br.Time}toString(){return`Time${this.bitWidth}<${Er[this.unit]}>`}get ArrayType(){switch(this.bitWidth){case 32:return Int32Array;case 64:return BigInt64Array}throw new Error(`Unrecognized ${this[Symbol.toStringTag]} type`)}}Yi=Symbol.toStringTag,po[Yi]=(t=>(t.unit=null,t.bitWidth=null,t[Symbol.toStringTag]="Time"))(po.prototype);class yo extends ro{constructor(t,e){super(),this.unit=t,this.timezone=e}get typeId(){return Br.Timestamp}toString(){return`Timestamp<${Er[this.unit]}${this.timezone?`, ${this.timezone}`:""}>`}}Zi=Symbol.toStringTag,yo[Zi]=(t=>(t.unit=null,t.timezone=null,t.ArrayType=Int32Array,t[Symbol.toStringTag]="Timestamp"))(yo.prototype);class vo extends ro{constructor(t){super(),this.unit=t}get typeId(){return Br.Interval}toString(){return`Interval<${jr[this.unit]}>`}}Hi=Symbol.toStringTag,vo[Hi]=(t=>(t.unit=null,t.ArrayType=Int32Array,t[Symbol.toStringTag]="Interval"))(vo.prototype);class bo extends ro{constructor(t){super(),this.children=[t]}get typeId(){return Br.List}toString(){return`List<${this.valueType}>`}get valueType(){return this.children[0].type}get valueField(){return this.children[0]}get ArrayType(){return this.valueType.ArrayType}}qi=Symbol.toStringTag,bo[qi]=(t=>(t.children=null,t[Symbol.toStringTag]="List"))(bo.prototype);class mo extends ro{constructor(t){super(),this.children=t}get typeId(){return Br.Struct}toString(){return`Struct<{${this.children.map((t=>`${t.name}:${t.type}`)).join(", ")}}>`}}Xi=Symbol.toStringTag,mo[Xi]=(t=>(t.children=null,t[Symbol.toStringTag]="Struct"))(mo.prototype);class go extends ro{constructor(t,e,n){super(),this.mode=t,this.children=n,this.typeIds=e=Int32Array.from(e),this.typeIdToChildIndex=e.reduce(((t,e,n)=>(t[e]=n)&&t||t),Object.create(null))}get typeId(){return Br.Union}toString(){return`${this[Symbol.toStringTag]}<${this.children.map((t=>`${t.type}`)).join(" | ")}>`}}Ki=Symbol.toStringTag,go[Ki]=(t=>(t.mode=null,t.typeIds=null,t.children=null,t.typeIdToChildIndex=null,t.ArrayType=Int8Array,t[Symbol.toStringTag]="Union"))(go.prototype);class wo extends ro{constructor(t){super(),this.byteWidth=t}get typeId(){return Br.FixedSizeBinary}toString(){return`FixedSizeBinary[${this.byteWidth}]`}}Ji=Symbol.toStringTag,wo[Ji]=(t=>(t.byteWidth=null,t.ArrayType=Uint8Array,t[Symbol.toStringTag]="FixedSizeBinary"))(wo.prototype);class _o extends ro{constructor(t,e){super(),this.listSize=t,this.children=[e]}get typeId(){return Br.FixedSizeList}get valueType(){return this.children[0].type}get valueField(){return this.children[0]}get ArrayType(){return this.valueType.ArrayType}toString(){return`FixedSizeList[${this.listSize}]<${this.valueType}>`}}Qi=Symbol.toStringTag,_o[Qi]=(t=>(t.children=null,t.listSize=null,t[Symbol.toStringTag]="FixedSizeList"))(_o.prototype);class xo extends ro{constructor(t,e=!1){super(),this.children=[t],this.keysSorted=e}get typeId(){return Br.Map}get keyType(){return this.children[0].type.children[0].type}get valueType(){return this.children[0].type.children[1].type}get childType(){return this.children[0].type}toString(){return`Map<{${this.children[0].type.children.map((t=>`${t.name}:${t.type}`)).join(", ")}}>`}}to=Symbol.toStringTag,xo[to]=(t=>(t.children=null,t.keysSorted=null,t[Symbol.toStringTag]="Map_"))(xo.prototype);const So=(Oo=-1,()=>++Oo);var Oo;class Io extends ro{constructor(t,e,n,r){super(),this.indices=e,this.dictionary=t,this.isOrdered=r||!1,this.id=null==n?So():"number"==typeof n?n:n.low}get typeId(){return Br.Dictionary}get children(){return this.dictionary.children}get valueType(){return this.dictionary}get ArrayType(){return this.dictionary.ArrayType}toString(){return`Dictionary<${this.indices}, ${this.dictionary}>`}}function To(t){const e=t;switch(t.typeId){case Br.Decimal:return t.bitWidth/32;case Br.Timestamp:return 2;case Br.Date:case Br.Interval:return 1+e.unit;case Br.FixedSizeList:return e.listSize;case Br.FixedSizeBinary:return e.byteWidth;default:return 1}}eo=Symbol.toStringTag,Io[eo]=(t=>(t.id=null,t.indices=null,t.isOrdered=null,t.dictionary=null,t[Symbol.toStringTag]="Dictionary"))(Io.prototype);class Ao{visitMany(t,...e){return t.map(((t,n)=>this.visit(t,...e.map((t=>t[n])))))}visit(...t){return this.getVisitFn(t[0],!1).apply(this,t)}getVisitFn(t,e=!0){return function(t,e,n=!0){return"number"==typeof e?Mo(t,e,n):"string"==typeof e&&e in Br?Mo(t,Br[e],n):e&&e instanceof ro?Mo(t,Co(e),n):(null==e?void 0:e.type)&&e.type instanceof ro?Mo(t,Co(e.type),n):Mo(t,Br.NONE,n)}(this,t,e)}getVisitFnByTypeId(t,e=!0){return Mo(this,t,e)}visitNull(t,...e){return null}visitBool(t,...e){return null}visitInt(t,...e){return null}visitFloat(t,...e){return null}visitUtf8(t,...e){return null}visitBinary(t,...e){return null}visitFixedSizeBinary(t,...e){return null}visitDate(t,...e){return null}visitTimestamp(t,...e){return null}visitTime(t,...e){return null}visitDecimal(t,...e){return null}visitList(t,...e){return null}visitStruct(t,...e){return null}visitUnion(t,...e){return null}visitDictionary(t,...e){return null}visitInterval(t,...e){return null}visitFixedSizeList(t,...e){return null}visitMap(t,...e){return null}}function Mo(t,e,n=!0){let r=null;switch(e){case Br.Null:r=t.visitNull;break;case Br.Bool:r=t.visitBool;break;case Br.Int:r=t.visitInt;break;case Br.Int8:r=t.visitInt8||t.visitInt;break;case Br.Int16:r=t.visitInt16||t.visitInt;break;case Br.Int32:r=t.visitInt32||t.visitInt;break;case Br.Int64:r=t.visitInt64||t.visitInt;break;case Br.Uint8:r=t.visitUint8||t.visitInt;break;case Br.Uint16:r=t.visitUint16||t.visitInt;break;case Br.Uint32:r=t.visitUint32||t.visitInt;break;case Br.Uint64:r=t.visitUint64||t.visitInt;break;case Br.Float:r=t.visitFloat;break;case Br.Float16:r=t.visitFloat16||t.visitFloat;break;case Br.Float32:r=t.visitFloat32||t.visitFloat;break;case Br.Float64:r=t.visitFloat64||t.visitFloat;break;case Br.Utf8:r=t.visitUtf8;break;case Br.Binary:r=t.visitBinary;break;case Br.FixedSizeBinary:r=t.visitFixedSizeBinary;break;case Br.Date:r=t.visitDate;break;case Br.DateDay:r=t.visitDateDay||t.visitDate;break;case Br.DateMillisecond:r=t.visitDateMillisecond||t.visitDate;break;case Br.Timestamp:r=t.visitTimestamp;break;case Br.TimestampSecond:r=t.visitTimestampSecond||t.visitTimestamp;break;case Br.TimestampMillisecond:r=t.visitTimestampMillisecond||t.visitTimestamp;break;case Br.TimestampMicrosecond:r=t.visitTimestampMicrosecond||t.visitTimestamp;break;case Br.TimestampNanosecond:r=t.visitTimestampNanosecond||t.visitTimestamp;break;case Br.Time:r=t.visitTime;break;case Br.TimeSecond:r=t.visitTimeSecond||t.visitTime;break;case Br.TimeMillisecond:r=t.visitTimeMillisecond||t.visitTime;break;case Br.TimeMicrosecond:r=t.visitTimeMicrosecond||t.visitTime;break;case Br.TimeNanosecond:r=t.visitTimeNanosecond||t.visitTime;break;case Br.Decimal:r=t.visitDecimal;break;case Br.List:r=t.visitList;break;case Br.Struct:r=t.visitStruct;break;case Br.Union:r=t.visitUnion;break;case Br.DenseUnion:r=t.visitDenseUnion||t.visitUnion;break;case Br.SparseUnion:r=t.visitSparseUnion||t.visitUnion;break;case Br.Dictionary:r=t.visitDictionary;break;case Br.Interval:r=t.visitInterval;break;case Br.IntervalDayTime:r=t.visitIntervalDayTime||t.visitInterval;break;case Br.IntervalYearMonth:r=t.visitIntervalYearMonth||t.visitInterval;break;case Br.FixedSizeList:r=t.visitFixedSizeList;break;case Br.Map:r=t.visitMap}if("function"==typeof r)return r;if(!n)return()=>null;throw new Error(`Unrecognized type '${Br[e]}'`)}function Co(t){switch(t.typeId){case Br.Null:return Br.Null;case Br.Int:{const{bitWidth:e,isSigned:n}=t;switch(e){case 8:return n?Br.Int8:Br.Uint8;case 16:return n?Br.Int16:Br.Uint16;case 32:return n?Br.Int32:Br.Uint32;case 64:return n?Br.Int64:Br.Uint64}return Br.Int}case Br.Float:switch(t.precision){case Cr.HALF:return Br.Float16;case Cr.SINGLE:return Br.Float32;case Cr.DOUBLE:return Br.Float64}return Br.Float;case Br.Binary:return Br.Binary;case Br.Utf8:return Br.Utf8;case Br.Bool:return Br.Bool;case Br.Decimal:return Br.Decimal;case Br.Time:switch(t.unit){case Er.SECOND:return Br.TimeSecond;case Er.MILLISECOND:return Br.TimeMillisecond;case Er.MICROSECOND:return Br.TimeMicrosecond;case Er.NANOSECOND:return Br.TimeNanosecond}return Br.Time;case Br.Timestamp:switch(t.unit){case Er.SECOND:return Br.TimestampSecond;case Er.MILLISECOND:return Br.TimestampMillisecond;case Er.MICROSECOND:return Br.TimestampMicrosecond;case Er.NANOSECOND:return Br.TimestampNanosecond}return Br.Timestamp;case Br.Date:switch(t.unit){case Pr.DAY:return Br.DateDay;case Pr.MILLISECOND:return Br.DateMillisecond}return Br.Date;case Br.Interval:switch(t.unit){case jr.DAY_TIME:return Br.IntervalDayTime;case jr.YEAR_MONTH:return Br.IntervalYearMonth}return Br.Interval;case Br.Map:return Br.Map;case Br.List:return Br.List;case Br.Struct:return Br.Struct;case Br.Union:switch(t.mode){case Mr.Dense:return Br.DenseUnion;case Mr.Sparse:return Br.SparseUnion}return Br.Union;case Br.FixedSizeBinary:return Br.FixedSizeBinary;case Br.FixedSizeList:return Br.FixedSizeList;case Br.Dictionary:return Br.Dictionary}throw new Error(`Unrecognized type '${Br[t.typeId]}'`)}Ao.prototype.visitInt8=null,Ao.prototype.visitInt16=null,Ao.prototype.visitInt32=null,Ao.prototype.visitInt64=null,Ao.prototype.visitUint8=null,Ao.prototype.visitUint16=null,Ao.prototype.visitUint32=null,Ao.prototype.visitUint64=null,Ao.prototype.visitFloat16=null,Ao.prototype.visitFloat32=null,Ao.prototype.visitFloat64=null,Ao.prototype.visitDateDay=null,Ao.prototype.visitDateMillisecond=null,Ao.prototype.visitTimestampSecond=null,Ao.prototype.visitTimestampMillisecond=null,Ao.prototype.visitTimestampMicrosecond=null,Ao.prototype.visitTimestampNanosecond=null,Ao.prototype.visitTimeSecond=null,Ao.prototype.visitTimeMillisecond=null,Ao.prototype.visitTimeMicrosecond=null,Ao.prototype.visitTimeNanosecond=null,Ao.prototype.visitDenseUnion=null,Ao.prototype.visitSparseUnion=null,Ao.prototype.visitIntervalDayTime=null,Ao.prototype.visitIntervalYearMonth=null;const Po=new Float64Array(1),Eo=new Uint32Array(Po.buffer);function jo(t){const e=(31744&t)>>10,n=(1023&t)/1024,r=Math.pow(-1,(32768&t)>>15);switch(e){case 31:return r*(n?Number.NaN:1/0);case 0:return r*(n?6103515625e-14*n:0)}return r*Math.pow(2,e-15)*(1+n)}class ko extends Ao{}function Bo(t){return(e,n,r)=>{if(e.setValid(n,null!=r))return t(e,n,r)}}const Fo=(t,e,n)=>{t[e]=Math.trunc(n%4294967296),t[e+1]=Math.trunc(n/4294967296)},Lo=(t,e,n,r)=>{if(n+1{t[e]=n},No=({values:t},e,n)=>{t[e]=n},Ro=({values:t},e,n)=>{t[e]=function(t){if(t!=t)return 32256;Po[0]=t;const e=(2147483648&Eo[1])>>16&65535;let n=2146435072&Eo[1],r=0;return n>=1089470464?Eo[0]>0?n=31744:(n=(2080374784&n)>>16,r=(1048575&Eo[1])>>10):n<=1056964608?(r=1048576+(1048575&Eo[1]),r=1048576+(r<<(n>>20)-998)>>21,n=0):(n=n-1056964608>>10,r=512+(1048575&Eo[1])>>10),e|n|65535&r}(n)},zo=({values:t},e,n)=>{((t,e,n)=>{t[e]=Math.trunc(n/864e5)})(t,e,n.valueOf())},Uo=({values:t},e,n)=>{Fo(t,2*e,n.valueOf())},Vo=({values:t},e,n)=>Fo(t,2*e,n/1e3),Wo=({values:t},e,n)=>Fo(t,2*e,n),$o=({values:t},e,n)=>((t,e,n)=>{t[e]=Math.trunc(1e3*n%4294967296),t[e+1]=Math.trunc(1e3*n/4294967296)})(t,2*e,n),Go=({values:t},e,n)=>((t,e,n)=>{t[e]=Math.trunc(1e6*n%4294967296),t[e+1]=Math.trunc(1e6*n/4294967296)})(t,2*e,n),Yo=({values:t},e,n)=>{t[e]=n},Zo=({values:t},e,n)=>{t[e]=n},Ho=({values:t},e,n)=>{t[e]=n},qo=({values:t},e,n)=>{t[e]=n},Xo=(t,e,n)=>{const r=t.type.typeIdToChildIndex[t.typeIds[e]],i=t.children[r];ts.visit(i,t.valueOffsets[e],n)},Ko=(t,e,n)=>{const r=t.type.typeIdToChildIndex[t.typeIds[e]],i=t.children[r];ts.visit(i,e,n)},Jo=({values:t},e,n)=>{t.set(n.subarray(0,2),2*e)},Qo=({values:t},e,n)=>{t[e]=12*n[0]+n[1]%12};ko.prototype.visitBool=Bo((({offset:t,values:e},n,r)=>{const i=t+n;r?e[i>>3]|=1<>3]&=~(1<{switch(t.type.precision){case Cr.HALF:return Ro(t,e,n);case Cr.SINGLE:case Cr.DOUBLE:return No(t,e,n)}})),ko.prototype.visitFloat16=Bo(Ro),ko.prototype.visitFloat32=Bo(No),ko.prototype.visitFloat64=Bo(No),ko.prototype.visitUtf8=Bo((({values:t,valueOffsets:e},n,r)=>{Lo(t,e,n,Qr(r))})),ko.prototype.visitBinary=Bo((({values:t,valueOffsets:e},n,r)=>Lo(t,e,n,r))),ko.prototype.visitFixedSizeBinary=Bo((({stride:t,values:e},n,r)=>{e.set(r.subarray(0,t),t*n)})),ko.prototype.visitDate=Bo(((t,e,n)=>{t.type.unit===Pr.DAY?zo(t,e,n):Uo(t,e,n)})),ko.prototype.visitDateDay=Bo(zo),ko.prototype.visitDateMillisecond=Bo(Uo),ko.prototype.visitTimestamp=Bo(((t,e,n)=>{switch(t.type.unit){case Er.SECOND:return Vo(t,e,n);case Er.MILLISECOND:return Wo(t,e,n);case Er.MICROSECOND:return $o(t,e,n);case Er.NANOSECOND:return Go(t,e,n)}})),ko.prototype.visitTimestampSecond=Bo(Vo),ko.prototype.visitTimestampMillisecond=Bo(Wo),ko.prototype.visitTimestampMicrosecond=Bo($o),ko.prototype.visitTimestampNanosecond=Bo(Go),ko.prototype.visitTime=Bo(((t,e,n)=>{switch(t.type.unit){case Er.SECOND:return Yo(t,e,n);case Er.MILLISECOND:return Zo(t,e,n);case Er.MICROSECOND:return Ho(t,e,n);case Er.NANOSECOND:return qo(t,e,n)}})),ko.prototype.visitTimeSecond=Bo(Yo),ko.prototype.visitTimeMillisecond=Bo(Zo),ko.prototype.visitTimeMicrosecond=Bo(Ho),ko.prototype.visitTimeNanosecond=Bo(qo),ko.prototype.visitDecimal=Bo((({values:t,stride:e},n,r)=>{t.set(r.subarray(0,e),e*n)})),ko.prototype.visitList=Bo(((t,e,n)=>{const r=t.children[0],i=t.valueOffsets,o=ts.getVisitFn(r);if(Array.isArray(n))for(let t=-1,s=i[e],a=i[e+1];s{const r=t.type.children.map((t=>ts.getVisitFn(t.type))),i=n instanceof Map?(o=e,s=n,(t,e,n,r)=>e&&t(e,o,s.get(n.name))):n instanceof va?((t,e)=>(n,r,i,o)=>r&&n(r,t,e.get(o)))(e,n):Array.isArray(n)?((t,e)=>(n,r,i,o)=>r&&n(r,t,e[o]))(e,n):((t,e)=>(n,r,i,o)=>r&&n(r,t,e[i.name]))(e,n);var o,s;t.type.children.forEach(((e,n)=>i(r[n],t.children[n],e,n)))})),ko.prototype.visitUnion=Bo(((t,e,n)=>{t.type.mode===Mr.Dense?Xo(t,e,n):Ko(t,e,n)})),ko.prototype.visitDenseUnion=Bo(Xo),ko.prototype.visitSparseUnion=Bo(Ko),ko.prototype.visitDictionary=Bo(((t,e,n)=>{var r;null===(r=t.dictionary)||void 0===r||r.set(t.values[e],n)})),ko.prototype.visitInterval=Bo(((t,e,n)=>{t.type.unit===jr.DAY_TIME?Jo(t,e,n):Qo(t,e,n)})),ko.prototype.visitIntervalDayTime=Bo(Jo),ko.prototype.visitIntervalYearMonth=Bo(Qo),ko.prototype.visitFixedSizeList=Bo(((t,e,n)=>{const{stride:r}=t,i=t.children[0],o=ts.getVisitFn(i);if(Array.isArray(n))for(let t=-1,s=e*r;++t{const r=t.children[0],{valueOffsets:i}=t,o=ts.getVisitFn(r);let{[e]:s,[e+1]:a}=i;const u=n instanceof Map?n.entries():Object.entries(n);for(const t of u)if(o(r,s,t),++s>=a)break}));const ts=new ko,es=Symbol.for("parent"),ns=Symbol.for("rowIndex");class rs{constructor(t,e){return this[es]=t,this[ns]=e,new Proxy(this,new os)}toArray(){return Object.values(this.toJSON())}toJSON(){const t=this[ns],e=this[es],n=e.type.children,r={};for(let i=-1,o=n.length;++i`${$r(t)}: ${$r(e)}`)).join(", ")}}`}[Symbol.for("nodejs.util.inspect.custom")](){return this.toString()}[Symbol.iterator](){return new is(this[es],this[ns])}}class is{constructor(t,e){this.childIndex=0,this.children=t.children,this.rowIndex=e,this.childFields=t.type.children,this.numChildren=this.childFields.length}[Symbol.iterator](){return this}next(){const t=this.childIndex;return tt.name))}has(t,e){return-1!==t[es].type.children.findIndex((t=>t.name===e))}getOwnPropertyDescriptor(t,e){if(-1!==t[es].type.children.findIndex((t=>t.name===e)))return{writable:!0,enumerable:!0,configurable:!0}}get(t,e){if(Reflect.has(t,e))return t[e];const n=t[es].type.children.findIndex((t=>t.name===e));if(-1!==n){const r=As.visit(t[es].children[n],t[ns]);return Reflect.set(t,e,r),r}}set(t,e,n){const r=t[es].type.children.findIndex((t=>t.name===e));return-1!==r?(ts.visit(t[es].children[r],t[ns],n),Reflect.set(t,e,n)):!(!Reflect.has(t,e)&&"symbol"!=typeof e)&&Reflect.set(t,e,n)}}class ss extends Ao{}function as(t){return(e,n)=>e.getValid(n)?t(e,n):null}const us=(t,e)=>4294967296*t[e+1]+(t[e]>>>0),cs=t=>new Date(t),ls=(t,e,n)=>{if(n+1>=e.length)return null;const r=e[n],i=e[n+1];return t.subarray(r,i)},fs=({values:t},e)=>((t,e)=>cs(((t,e)=>864e5*t[e])(t,e)))(t,e),hs=({values:t},e)=>((t,e)=>cs(us(t,e)))(t,2*e),ds=({stride:t,values:e},n)=>e[t*n],ps=({values:t},e)=>t[e],ys=({values:t},e)=>1e3*us(t,2*e),vs=({values:t},e)=>us(t,2*e),bs=({values:t},e)=>((t,e)=>t[e+1]/1e3*4294967296+(t[e]>>>0)/1e3)(t,2*e),ms=({values:t},e)=>((t,e)=>t[e+1]/1e6*4294967296+(t[e]>>>0)/1e6)(t,2*e),gs=({values:t},e)=>t[e],ws=({values:t},e)=>t[e],_s=({values:t},e)=>t[e],xs=({values:t},e)=>t[e],Ss=(t,e)=>{const n=t.type.typeIdToChildIndex[t.typeIds[e]],r=t.children[n];return As.visit(r,t.valueOffsets[e])},Os=(t,e)=>{const n=t.type.typeIdToChildIndex[t.typeIds[e]],r=t.children[n];return As.visit(r,e)},Is=({values:t},e)=>t.subarray(2*e,2*(e+1)),Ts=({values:t},e)=>{const n=t[e],r=new Int32Array(2);return r[0]=Math.trunc(n/12),r[1]=Math.trunc(n%12),r};ss.prototype.visitNull=as(((t,e)=>null)),ss.prototype.visitBool=as((({offset:t,values:e},n)=>{const r=t+n;return 0!=(e[r>>3]&1<t[e])),ss.prototype.visitInt8=as(ds),ss.prototype.visitInt16=as(ds),ss.prototype.visitInt32=as(ds),ss.prototype.visitInt64=as(ps),ss.prototype.visitUint8=as(ds),ss.prototype.visitUint16=as(ds),ss.prototype.visitUint32=as(ds),ss.prototype.visitUint64=as(ps),ss.prototype.visitFloat=as((({type:t,values:e},n)=>t.precision!==Cr.HALF?e[n]:jo(e[n]))),ss.prototype.visitFloat16=as((({stride:t,values:e},n)=>jo(e[t*n]))),ss.prototype.visitFloat32=as(ds),ss.prototype.visitFloat64=as(ds),ss.prototype.visitUtf8=as((({values:t,valueOffsets:e},n)=>{const r=ls(t,e,n);return null!==r?Kr(r):null})),ss.prototype.visitBinary=as((({values:t,valueOffsets:e},n)=>ls(t,e,n))),ss.prototype.visitFixedSizeBinary=as((({stride:t,values:e},n)=>e.subarray(t*n,t*(n+1)))),ss.prototype.visitDate=as(((t,e)=>t.type.unit===Pr.DAY?fs(t,e):hs(t,e))),ss.prototype.visitDateDay=as(fs),ss.prototype.visitDateMillisecond=as(hs),ss.prototype.visitTimestamp=as(((t,e)=>{switch(t.type.unit){case Er.SECOND:return ys(t,e);case Er.MILLISECOND:return vs(t,e);case Er.MICROSECOND:return bs(t,e);case Er.NANOSECOND:return ms(t,e)}})),ss.prototype.visitTimestampSecond=as(ys),ss.prototype.visitTimestampMillisecond=as(vs),ss.prototype.visitTimestampMicrosecond=as(bs),ss.prototype.visitTimestampNanosecond=as(ms),ss.prototype.visitTime=as(((t,e)=>{switch(t.type.unit){case Er.SECOND:return gs(t,e);case Er.MILLISECOND:return ws(t,e);case Er.MICROSECOND:return _s(t,e);case Er.NANOSECOND:return xs(t,e)}})),ss.prototype.visitTimeSecond=as(gs),ss.prototype.visitTimeMillisecond=as(ws),ss.prototype.visitTimeMicrosecond=as(_s),ss.prototype.visitTimeNanosecond=as(xs),ss.prototype.visitDecimal=as((({values:t,stride:e},n)=>Li.decimal(t.subarray(e*n,e*(n+1))))),ss.prototype.visitList=as(((t,e)=>{const{valueOffsets:n,stride:r,children:i}=t,{[e*r]:o,[e*r+1]:s}=n,a=i[0].slice(o,s-o);return new va([a])})),ss.prototype.visitStruct=as(((t,e)=>new rs(t,e))),ss.prototype.visitUnion=as(((t,e)=>t.type.mode===Mr.Dense?Ss(t,e):Os(t,e))),ss.prototype.visitDenseUnion=as(Ss),ss.prototype.visitSparseUnion=as(Os),ss.prototype.visitDictionary=as(((t,e)=>{var n;return null===(n=t.dictionary)||void 0===n?void 0:n.get(t.values[e])})),ss.prototype.visitInterval=as(((t,e)=>t.type.unit===jr.DAY_TIME?Is(t,e):Ts(t,e))),ss.prototype.visitIntervalDayTime=as(Is),ss.prototype.visitIntervalYearMonth=as(Ts),ss.prototype.visitFixedSizeList=as(((t,e)=>{const{stride:n,children:r}=t,i=r[0].slice(e*n,n);return new va([i])})),ss.prototype.visitMap=as(((t,e)=>{const{valueOffsets:n,children:r}=t,{[e]:i,[e+1]:o}=n,s=r[0];return new Ps(s.slice(i,o-i))}));const As=new ss,Ms=Symbol.for("keys"),Cs=Symbol.for("vals");class Ps{constructor(t){return this[Ms]=new va([t.children[0]]).memoize(),this[Cs]=t.children[1],new Proxy(this,new js)}[Symbol.iterator](){return new Es(this[Ms],this[Cs])}get size(){return this[Ms].length}toArray(){return Object.values(this.toJSON())}toJSON(){const t=this[Ms],e=this[Cs],n={};for(let r=-1,i=t.length;++r`${$r(t)}: ${$r(e)}`)).join(", ")}}`}[Symbol.for("nodejs.util.inspect.custom")](){return this.toString()}}class Es{constructor(t,e){this.keys=t,this.vals=e,this.keyIndex=0,this.numKeys=t.length}[Symbol.iterator](){return this}next(){const t=this.keyIndex;return t===this.numKeys?{done:!0,value:null}:(this.keyIndex++,{done:!1,value:[this.keys.get(t),As.visit(this.vals,t)]})}}class js{isExtensible(){return!1}deleteProperty(){return!1}preventExtensions(){return!0}ownKeys(t){return t[Ms].toArray().map(String)}has(t,e){return t[Ms].includes(e)}getOwnPropertyDescriptor(t,e){if(-1!==t[Ms].indexOf(e))return{writable:!0,enumerable:!0,configurable:!0}}get(t,e){if(Reflect.has(t,e))return t[e];const n=t[Ms].indexOf(e);if(-1!==n){const r=As.visit(Reflect.get(t,Cs),n);return Reflect.set(t,e,r),r}}set(t,e,n){const r=t[Ms].indexOf(e);return-1!==r?(ts.visit(Reflect.get(t,Cs),r,n),Reflect.set(t,e,n)):!!Reflect.has(t,e)&&Reflect.set(t,e,n)}}let ks;function Bs(t,e,n,r){const{length:i=0}=t;let o="number"!=typeof e?0:e,s="number"!=typeof n?i:n;return o<0&&(o=(o%i+i)%i),s<0&&(s=(s%i+i)%i),si&&(s=i),r?r(t,o,s):[o,s]}Object.defineProperties(Ps.prototype,{[Symbol.toStringTag]:{enumerable:!1,configurable:!1,value:"Row"},[Ms]:{writable:!0,enumerable:!1,configurable:!1,value:null},[Cs]:{writable:!0,enumerable:!1,configurable:!1,value:null}});const Fs=t=>t!=t;function Ls(t){if("object"!=typeof t||null===t)return Fs(t)?Fs:e=>e===t;if(t instanceof Date){const e=t.valueOf();return t=>t instanceof Date&&t.valueOf()===e}return ArrayBuffer.isView(t)?e=>!!e&&function(t,e){let n=0;const r=t.length;if(r!==e.length)return!1;if(r>0)do{if(t[n]!==e[n])return!1}while(++n!1;const r=[];for(let e=-1,i=n.length;++e{if(!n||"object"!=typeof n)return!1;switch(n.constructor){case Array:return function(t,e){const n=t.length;if(e.length!==n)return!1;for(let r=-1;++rt+e.nullCount),0)}function Us(t){return t.reduce(((t,e,n)=>(t[n+1]=t[n]+e.length,t)),new Uint32Array(t.length+1))}function Vs(t,e,n,r){const i=[];for(let o=-1,s=t.length;++o=r)break;if(n>=a+u)continue;if(a>=n&&a+u<=r){i.push(s);continue}const c=Math.max(0,n-a),l=Math.min(r-a,u);i.push(s.slice(c,l-c))}return 0===i.length&&i.push(t[0].slice(0,0)),i}function Ws(t,e,n,r){let i=0,o=0,s=e.length-1;do{if(i>=s-1)return n>r}function Xs(t){const e=[];let n=0,r=0,i=0;for(const o of t)o&&(i|=1<0)&&(e[n++]=i);const o=new Uint8Array(e.length+7&-8);return o.set(e),o}class Ks{constructor(t,e,n,r,i){this.bytes=t,this.length=n,this.context=r,this.get=i,this.bit=e%8,this.byteIndex=e>>3,this.byte=t[this.byteIndex++],this.index=0}next(){return this.index>3<<3,i=e+(e%8==0?0:8-e%8);return Js(t,e,i)+Js(t,r,n)+function(t,e,n){let r=0,i=Math.trunc(e);const o=new DataView(t.buffer,t.byteOffset,t.byteLength),s=void 0===n?t.byteLength:i+n;for(;s-i>=4;)r+=Qs(o.getUint32(i)),i+=4;for(;s-i>=2;)r+=Qs(o.getUint16(i)),i+=2;for(;s-i>=1;)r+=Qs(o.getUint8(i)),i+=1;return r}(t,i>>3,r-i>>3)}function Qs(t){let e=Math.trunc(t);return e-=e>>>1&1431655765,e=(858993459&e)+(e>>>2&858993459),16843009*(e+(e>>>4)&252645135)>>>24}class ta extends Ao{}function ea(t,e,n){if(void 0===e)return-1;if(null===e)return function(t,e){const{nullBitmap:n}=t;if(!n||t.nullCount<=0)return-1;let r=0;for(const i of new Ks(n,t.offset+(e||0),t.length,n,Hs)){if(!i)return r;++r}return-1}(t,n);const r=As.getVisitFn(t),i=Ls(e);for(let e=(n||0)-1,o=t.length;++e0?0:-1},ta.prototype.visitBool=ea,ta.prototype.visitInt=ea,ta.prototype.visitInt8=ea,ta.prototype.visitInt16=ea,ta.prototype.visitInt32=ea,ta.prototype.visitInt64=ea,ta.prototype.visitUint8=ea,ta.prototype.visitUint16=ea,ta.prototype.visitUint32=ea,ta.prototype.visitUint64=ea,ta.prototype.visitFloat=ea,ta.prototype.visitFloat16=ea,ta.prototype.visitFloat32=ea,ta.prototype.visitFloat64=ea,ta.prototype.visitUtf8=ea,ta.prototype.visitBinary=ea,ta.prototype.visitFixedSizeBinary=ea,ta.prototype.visitDate=ea,ta.prototype.visitDateDay=ea,ta.prototype.visitDateMillisecond=ea,ta.prototype.visitTimestamp=ea,ta.prototype.visitTimestampSecond=ea,ta.prototype.visitTimestampMillisecond=ea,ta.prototype.visitTimestampMicrosecond=ea,ta.prototype.visitTimestampNanosecond=ea,ta.prototype.visitTime=ea,ta.prototype.visitTimeSecond=ea,ta.prototype.visitTimeMillisecond=ea,ta.prototype.visitTimeMicrosecond=ea,ta.prototype.visitTimeNanosecond=ea,ta.prototype.visitDecimal=ea,ta.prototype.visitList=ea,ta.prototype.visitStruct=ea,ta.prototype.visitUnion=ea,ta.prototype.visitDenseUnion=na,ta.prototype.visitSparseUnion=na,ta.prototype.visitDictionary=ea,ta.prototype.visitInterval=ea,ta.prototype.visitIntervalDayTime=ea,ta.prototype.visitIntervalYearMonth=ea,ta.prototype.visitFixedSizeList=ea,ta.prototype.visitMap=ea;const ra=new ta;class ia extends Ao{}function oa(t){const{type:e}=t;if(0===t.nullCount&&1===t.stride&&(e.typeId===Br.Timestamp||e instanceof oo&&64!==e.bitWidth||e instanceof po&&64!==e.bitWidth||e instanceof ao&&e.precision!==Cr.HALF))return new Rs(t.data.length,(e=>{const n=t.data[e];return n.values.subarray(0,n.length)[Symbol.iterator]()}));let n=0;return new Rs(t.data.length,(e=>{const r=t.data[e].length,i=t.slice(n,n+r);return n+=r,new sa(i)}))}class sa{constructor(t){this.vector=t,this.index=0}next(){return this.indext+e;class ca extends Ao{visitNull(t,e){return 0}visitInt(t,e){return t.type.bitWidth/8}visitFloat(t,e){return t.type.ArrayType.BYTES_PER_ELEMENT}visitBool(t,e){return 1/8}visitDecimal(t,e){return t.type.bitWidth/8}visitDate(t,e){return 4*(t.type.unit+1)}visitTime(t,e){return t.type.bitWidth/8}visitTimestamp(t,e){return t.type.unit===Er.SECOND?4:8}visitInterval(t,e){return 4*(t.type.unit+1)}visitStruct(t,e){return t.children.reduce(((t,n)=>t+ha.visit(n,e)),0)}visitFixedSizeBinary(t,e){return t.type.byteWidth}visitMap(t,e){return 8+t.children.reduce(((t,n)=>t+ha.visit(n,e)),0)}visitDictionary(t,e){var n;return t.type.indices.bitWidth/8+((null===(n=t.dictionary)||void 0===n?void 0:n.getByteLength(t.values[e]))||0)}}const la=({type:t,children:e,typeIds:n,valueOffsets:r},i)=>{const o=t.typeIdToChildIndex[n[i]];return 8+ha.visit(e[o],r[i])},fa=({children:t},e)=>4+ha.visitMany(t,t.map((()=>e))).reduce(ua,0);ca.prototype.visitUtf8=({valueOffsets:t},e)=>t[e+1]-t[e]+8,ca.prototype.visitBinary=({valueOffsets:t},e)=>t[e+1]-t[e]+8,ca.prototype.visitList=({valueOffsets:t,stride:e,children:n},r)=>{const i=n[0],{[r*e]:o}=t,{[r*e+1]:s}=t,a=ha.getVisitFn(i.type),u=i.slice(o,s-o);let c=8;for(let t=-1,e=s-o;++t{const r=e[0],i=r.slice(n*t,t),o=ha.getVisitFn(r.type);let s=0;for(let t=-1,e=i.length;++tt.type.mode===Mr.Dense?la(t,e):fa(t,e),ca.prototype.visitDenseUnion=la,ca.prototype.visitSparseUnion=fa;const ha=new ca;var da;const pa={},ya={};class va{constructor(t){var e,n,r;const i=t[0]instanceof va?t.flatMap((t=>t.data)):t;if(0===i.length||i.some((t=>!(t instanceof ma))))throw new TypeError("Vector constructor expects an Array of Data instances.");const o=null===(e=i[0])||void 0===e?void 0:e.type;switch(i.length){case 0:this._offsets=[0];break;case 1:{const{get:t,set:e,indexOf:n,byteLength:r}=pa[o.typeId],s=i[0];this.isValid=t=>$s(s,t),this.get=e=>t(s,e),this.set=(t,n)=>e(s,t,n),this.indexOf=t=>n(s,t),this.getByteLength=t=>r(s,t),this._offsets=[0,s.length];break}default:Object.setPrototypeOf(this,ya[o.typeId]),this._offsets=Us(i)}this.data=i,this.type=o,this.stride=To(o),this.numChildren=null!==(r=null===(n=o.children)||void 0===n?void 0:n.length)&&void 0!==r?r:0,this.length=this._offsets[this._offsets.length-1]}get byteLength(){return-1===this._byteLength&&(this._byteLength=this.data.reduce(((t,e)=>t+e.byteLength),0)),this._byteLength}get nullCount(){return-1===this._nullCount&&(this._nullCount=zs(this.data)),this._nullCount}get ArrayType(){return this.type.ArrayType}get[Symbol.toStringTag](){return`${this.VectorName}<${this.type[Symbol.toStringTag]}>`}get VectorName(){return`${Br[this.type.typeId]}Vector`}isValid(t){return!1}get(t){return null}set(t,e){}indexOf(t,e){return-1}includes(t,e){return this.indexOf(t,e)>0}getByteLength(t){return 0}[Symbol.iterator](){return aa.visit(this)}concat(...t){return new va(this.data.concat(t.flatMap((t=>t.data)).flat(Number.POSITIVE_INFINITY)))}slice(t,e){return new va(Bs(this,t,e,(({data:t,_offsets:e},n,r)=>Vs(t,e,n,r))))}toJSON(){return[...this]}toArray(){const{type:t,data:e,length:n,stride:r,ArrayType:i}=this;switch(t.typeId){case Br.Int:case Br.Float:case Br.Decimal:case Br.Time:case Br.Timestamp:switch(e.length){case 0:return new i;case 1:return e[0].values.subarray(0,n*r);default:return e.reduce(((t,{values:e})=>(t.array.set(e,t.offset),t.offset+=e.length,t)),{array:new i(n*r),offset:0}).array}}return[...this]}toString(){return`[${[...this].join(",")}]`}getChild(t){var e;return this.getChildAt(null===(e=this.type.children)||void 0===e?void 0:e.findIndex((e=>e.name===t)))}getChildAt(t){return t>-1&&te[t]))):null}get isMemoized(){return!!ro.isDictionary(this.type)&&this.data[0].dictionary.isMemoized}memoize(){if(ro.isDictionary(this.type)){const t=new ba(this.data[0].dictionary),e=this.data.map((e=>{const n=e.clone();return n.dictionary=t,n}));return new va(e)}return new ba(this)}unmemoize(){if(ro.isDictionary(this.type)&&this.isMemoized){const t=this.data[0].dictionary.unmemoize(),e=this.data.map((e=>{const n=e.clone();return n.dictionary=t,n}));return new va(e)}return this}}da=Symbol.toStringTag,va[da]=(t=>{t.type=ro.prototype,t.data=[],t.length=0,t.stride=1,t.numChildren=0,t._nullCount=-1,t._byteLength=-1,t._offsets=new Uint32Array([0]),t[Symbol.isConcatSpreadable]=!0;const e=Object.keys(Br).map((t=>Br[t])).filter((t=>"number"==typeof t&&t!==Br.NONE));for(const n of e){const e=As.getVisitFnByTypeId(n),r=ts.getVisitFnByTypeId(n),i=ra.getVisitFnByTypeId(n),o=ha.getVisitFnByTypeId(n);pa[n]={get:e,set:r,indexOf:i,byteLength:o},ya[n]=Object.create(t,{isValid:{value:Gs($s)},get:{value:Gs(As.getVisitFnByTypeId(n))},set:{value:Ys(ts.getVisitFnByTypeId(n))},indexOf:{value:Zs(ra.getVisitFnByTypeId(n))},getByteLength:{value:Gs(ha.getVisitFnByTypeId(n))}})}return"Vector"})(va.prototype);class ba extends va{constructor(t){super(t.data);const e=this.get,n=this.set,r=this.slice,i=new Array(this.length);Object.defineProperty(this,"get",{value(t){const n=i[t];if(void 0!==n)return n;const r=e.call(this,t);return i[t]=r,r}}),Object.defineProperty(this,"set",{value(t,e){n.call(this,t,e),i[t]=e}}),Object.defineProperty(this,"slice",{value:(t,e)=>new ba(r.call(this,t,e))}),Object.defineProperty(this,"isMemoized",{value:!0}),Object.defineProperty(this,"unmemoize",{value:()=>new va(this.data)}),Object.defineProperty(this,"memoize",{value:()=>this})}}class ma{constructor(t,e,n,r,i,o=[],s){let a;this.type=t,this.children=o,this.dictionary=s,this.offset=Math.floor(Math.max(e||0,0)),this.length=Math.floor(Math.max(n||0,0)),this._nullCount=Math.floor(Math.max(r||0,-1)),i instanceof ma?(this.stride=i.stride,this.values=i.values,this.typeIds=i.typeIds,this.nullBitmap=i.nullBitmap,this.valueOffsets=i.valueOffsets):(this.stride=To(t),i&&((a=i[0])&&(this.valueOffsets=a),(a=i[1])&&(this.values=a),(a=i[2])&&(this.nullBitmap=a),(a=i[3])&&(this.typeIds=a))),this.nullable=0!==this._nullCount&&this.nullBitmap&&this.nullBitmap.byteLength>0}get typeId(){return this.type.typeId}get ArrayType(){return this.type.ArrayType}get buffers(){return[this.valueOffsets,this.values,this.nullBitmap,this.typeIds]}get byteLength(){let t=0;const{valueOffsets:e,values:n,nullBitmap:r,typeIds:i}=this;return e&&(t+=e.byteLength),n&&(t+=n.byteLength),r&&(t+=r.byteLength),i&&(t+=i.byteLength),this.children.reduce(((t,e)=>t+e.byteLength),t)}get nullCount(){let t,e=this._nullCount;return e<=-1&&(t=this.nullBitmap)&&(this._nullCount=e=this.length-Js(t,this.offset,this.offset+this.length)),e}getValid(t){if(this.nullable&&this.nullCount>0){const e=this.offset+t;return 0!=(this.nullBitmap[e>>3]&1<>3){const{nullBitmap:t}=this._changeLengthAndBackfillNullBitmap(this.length);Object.assign(this,{nullBitmap:t,_nullCount:0})}const{nullBitmap:n,offset:r}=this,i=r+t>>3,o=(r+t)%8,s=n[i]>>o&1;return e?0===s&&(n[i]|=1<>3).fill(255,0,e>>3);r[e>>3]=(1<0&&r.set(function(t,e,n){const r=n.byteLength+7&-8;if(t>0||n.byteLength>3):Xs(new Ks(n,t,e,null,Hs)).subarray(0,r)),i}return n}(this.offset,e,this.nullBitmap),0);const i=this.buffers;return i[Fr.VALIDITY]=r,this.clone(this.type,0,t,n+(t-e),i)}_sliceBuffers(t,e,n,r){let i;const{buffers:o}=this;return(i=o[Fr.TYPE])&&(o[Fr.TYPE]=i.subarray(t,t+e)),(i=o[Fr.OFFSET])&&(o[Fr.OFFSET]=i.subarray(t,t+e+1))||(i=o[Fr.DATA])&&(o[Fr.DATA]=6===r?i:i.subarray(n*t,n*(t+e))),o}_sliceChildren(t,e,n){return t.map((t=>t.slice(e,n)))}}ma.prototype.children=Object.freeze([]);class ga extends Ao{visit(t){return this.getVisitFn(t.type).call(this,t)}visitNull(t){const{type:e,offset:n=0,length:r=0}=t;return new ma(e,n,r,0)}visitBool(t){const{type:e,offset:n=0}=t,r=Oi(t.nullBitmap),i=xi(e.ArrayType,t.data),{length:o=i.length>>3,nullCount:s=(t.nullBitmap?-1:0)}=t;return new ma(e,n,o,s,[void 0,i,r])}visitInt(t){const{type:e,offset:n=0}=t,r=Oi(t.nullBitmap),i=xi(e.ArrayType,t.data),{length:o=i.length,nullCount:s=(t.nullBitmap?-1:0)}=t;return new ma(e,n,o,s,[void 0,i,r])}visitFloat(t){const{type:e,offset:n=0}=t,r=Oi(t.nullBitmap),i=xi(e.ArrayType,t.data),{length:o=i.length,nullCount:s=(t.nullBitmap?-1:0)}=t;return new ma(e,n,o,s,[void 0,i,r])}visitUtf8(t){const{type:e,offset:n=0}=t,r=Oi(t.data),i=Oi(t.nullBitmap),o=Si(t.valueOffsets),{length:s=o.length-1,nullCount:a=(t.nullBitmap?-1:0)}=t;return new ma(e,n,s,a,[o,r,i])}visitBinary(t){const{type:e,offset:n=0}=t,r=Oi(t.data),i=Oi(t.nullBitmap),o=Si(t.valueOffsets),{length:s=o.length-1,nullCount:a=(t.nullBitmap?-1:0)}=t;return new ma(e,n,s,a,[o,r,i])}visitFixedSizeBinary(t){const{type:e,offset:n=0}=t,r=Oi(t.nullBitmap),i=xi(e.ArrayType,t.data),{length:o=i.length/To(e),nullCount:s=(t.nullBitmap?-1:0)}=t;return new ma(e,n,o,s,[void 0,i,r])}visitDate(t){const{type:e,offset:n=0}=t,r=Oi(t.nullBitmap),i=xi(e.ArrayType,t.data),{length:o=i.length/To(e),nullCount:s=(t.nullBitmap?-1:0)}=t;return new ma(e,n,o,s,[void 0,i,r])}visitTimestamp(t){const{type:e,offset:n=0}=t,r=Oi(t.nullBitmap),i=xi(e.ArrayType,t.data),{length:o=i.length/To(e),nullCount:s=(t.nullBitmap?-1:0)}=t;return new ma(e,n,o,s,[void 0,i,r])}visitTime(t){const{type:e,offset:n=0}=t,r=Oi(t.nullBitmap),i=xi(e.ArrayType,t.data),{length:o=i.length/To(e),nullCount:s=(t.nullBitmap?-1:0)}=t;return new ma(e,n,o,s,[void 0,i,r])}visitDecimal(t){const{type:e,offset:n=0}=t,r=Oi(t.nullBitmap),i=xi(e.ArrayType,t.data),{length:o=i.length/To(e),nullCount:s=(t.nullBitmap?-1:0)}=t;return new ma(e,n,o,s,[void 0,i,r])}visitList(t){const{type:e,offset:n=0,child:r}=t,i=Oi(t.nullBitmap),o=Si(t.valueOffsets),{length:s=o.length-1,nullCount:a=(t.nullBitmap?-1:0)}=t;return new ma(e,n,s,a,[o,void 0,i],[r])}visitStruct(t){const{type:e,offset:n=0,children:r=[]}=t,i=Oi(t.nullBitmap),{length:o=r.reduce(((t,{length:e})=>Math.max(t,e)),0),nullCount:s=(t.nullBitmap?-1:0)}=t;return new ma(e,n,o,s,[void 0,void 0,i],r)}visitUnion(t){const{type:e,offset:n=0,children:r=[]}=t,i=Oi(t.nullBitmap),o=xi(e.ArrayType,t.typeIds),{length:s=o.length,nullCount:a=(t.nullBitmap?-1:0)}=t;if(ro.isSparseUnion(e))return new ma(e,n,s,a,[void 0,void 0,i,o],r);const u=Si(t.valueOffsets);return new ma(e,n,s,a,[u,void 0,i,o],r)}visitDictionary(t){const{type:e,offset:n=0}=t,r=Oi(t.nullBitmap),i=xi(e.indices.ArrayType,t.data),{dictionary:o=new va([(new ga).visit({type:e.dictionary})])}=t,{length:s=i.length,nullCount:a=(t.nullBitmap?-1:0)}=t;return new ma(e,n,s,a,[void 0,i,r],[],o)}visitInterval(t){const{type:e,offset:n=0}=t,r=Oi(t.nullBitmap),i=xi(e.ArrayType,t.data),{length:o=i.length/To(e),nullCount:s=(t.nullBitmap?-1:0)}=t;return new ma(e,n,o,s,[void 0,i,r])}visitFixedSizeList(t){const{type:e,offset:n=0,child:r=(new ga).visit({type:e.valueType})}=t,i=Oi(t.nullBitmap),{length:o=r.length/To(e),nullCount:s=(t.nullBitmap?-1:0)}=t;return new ma(e,n,o,s,[void 0,void 0,i],[r])}visitMap(t){const{type:e,offset:n=0,child:r=(new ga).visit({type:e.childType})}=t,i=Oi(t.nullBitmap),o=Si(t.valueOffsets),{length:s=o.length-1,nullCount:a=(t.nullBitmap?-1:0)}=t;return new ma(e,n,s,a,[o,void 0,i],[r])}}function wa(t){return(new ga).visit(t)}class _a{constructor(t=[],e,n){this.fields=t||[],this.metadata=e||new Map,n||(n=Oa(t)),this.dictionaries=n}get[Symbol.toStringTag](){return"Schema"}get names(){return this.fields.map((t=>t.name))}toString(){return`Schema<{ ${this.fields.map(((t,e)=>`${e}: ${t}`)).join(", ")} }>`}select(t){const e=new Set(t),n=this.fields.filter((t=>e.has(t.name)));return new _a(n,this.metadata)}selectAt(t){const e=t.map((t=>this.fields[t])).filter(Boolean);return new _a(e,this.metadata)}assign(...t){const e=t[0]instanceof _a?t[0]:Array.isArray(t[0])?new _a(t[0]):new _a(t),n=[...this.fields],r=Sa(Sa(new Map,this.metadata),e.metadata),i=e.fields.filter((t=>{const e=n.findIndex((e=>e.name===t.name));return!~e||(n[e]=t.clone({metadata:Sa(Sa(new Map,n[e].metadata),t.metadata)}))&&!1})),o=Oa(i,new Map);return new _a([...n,...i],r,new Map([...this.dictionaries,...o]))}}_a.prototype.fields=null,_a.prototype.metadata=null,_a.prototype.dictionaries=null;class xa{constructor(t,e,n=!1,r){this.name=t,this.type=e,this.nullable=n,this.metadata=r||new Map}static new(...t){let[e,n,r,i]=t;return t[0]&&"object"==typeof t[0]&&(({name:e}=t[0]),void 0===n&&(n=t[0].type),void 0===r&&(r=t[0].nullable),void 0===i&&(i=t[0].metadata)),new xa(`${e}`,n,r,i)}get typeId(){return this.type.typeId}get[Symbol.toStringTag](){return"Field"}toString(){return`${this.name}: ${this.type}`}clone(...t){let[e,n,r,i]=t;return t[0]&&"object"==typeof t[0]?({name:e=this.name,type:n=this.type,nullable:r=this.nullable,metadata:i=this.metadata}=t[0]):[e=this.name,n=this.type,r=this.nullable,i=this.metadata]=t,xa.new(e,n,r,i)}}function Sa(t,e){return new Map([...t||new Map,...e||new Map])}function Oa(t,e=new Map){for(let n=-1,r=t.length;++n0&&Oa(r.children,e)}return e}xa.prototype.type=null,xa.prototype.name=null,xa.prototype.nullable=null,xa.prototype.metadata=null;class Ia extends Ao{compareSchemas(t,e){return t===e||e instanceof t.constructor&&this.compareManyFields(t.fields,e.fields)}compareManyFields(t,e){return t===e||Array.isArray(t)&&Array.isArray(e)&&t.length===e.length&&t.every(((t,n)=>this.compareFields(t,e[n])))}compareFields(t,e){return t===e||e instanceof t.constructor&&t.name===e.name&&t.nullable===e.nullable&&this.visit(t.type,e.type)}}function Ta(t,e){return e instanceof t.constructor}function Aa(t,e){return t===e||Ta(t,e)}function Ma(t,e){return t===e||Ta(t,e)&&t.bitWidth===e.bitWidth&&t.isSigned===e.isSigned}function Ca(t,e){return t===e||Ta(t,e)&&t.precision===e.precision}function Pa(t,e){return t===e||Ta(t,e)&&t.unit===e.unit}function Ea(t,e){return t===e||Ta(t,e)&&t.unit===e.unit&&t.timezone===e.timezone}function ja(t,e){return t===e||Ta(t,e)&&t.unit===e.unit&&t.bitWidth===e.bitWidth}function ka(t,e){return t===e||Ta(t,e)&&t.mode===e.mode&&t.typeIds.every(((t,n)=>t===e.typeIds[n]))&&Fa.compareManyFields(t.children,e.children)}function Ba(t,e){return t===e||Ta(t,e)&&t.unit===e.unit}Ia.prototype.visitNull=Aa,Ia.prototype.visitBool=Aa,Ia.prototype.visitInt=Ma,Ia.prototype.visitInt8=Ma,Ia.prototype.visitInt16=Ma,Ia.prototype.visitInt32=Ma,Ia.prototype.visitInt64=Ma,Ia.prototype.visitUint8=Ma,Ia.prototype.visitUint16=Ma,Ia.prototype.visitUint32=Ma,Ia.prototype.visitUint64=Ma,Ia.prototype.visitFloat=Ca,Ia.prototype.visitFloat16=Ca,Ia.prototype.visitFloat32=Ca,Ia.prototype.visitFloat64=Ca,Ia.prototype.visitUtf8=Aa,Ia.prototype.visitBinary=Aa,Ia.prototype.visitFixedSizeBinary=function(t,e){return t===e||Ta(t,e)&&t.byteWidth===e.byteWidth},Ia.prototype.visitDate=Pa,Ia.prototype.visitDateDay=Pa,Ia.prototype.visitDateMillisecond=Pa,Ia.prototype.visitTimestamp=Ea,Ia.prototype.visitTimestampSecond=Ea,Ia.prototype.visitTimestampMillisecond=Ea,Ia.prototype.visitTimestampMicrosecond=Ea,Ia.prototype.visitTimestampNanosecond=Ea,Ia.prototype.visitTime=ja,Ia.prototype.visitTimeSecond=ja,Ia.prototype.visitTimeMillisecond=ja,Ia.prototype.visitTimeMicrosecond=ja,Ia.prototype.visitTimeNanosecond=ja,Ia.prototype.visitDecimal=Aa,Ia.prototype.visitList=function(t,e){return t===e||Ta(t,e)&&t.children.length===e.children.length&&Fa.compareManyFields(t.children,e.children)},Ia.prototype.visitStruct=function(t,e){return t===e||Ta(t,e)&&t.children.length===e.children.length&&Fa.compareManyFields(t.children,e.children)},Ia.prototype.visitUnion=ka,Ia.prototype.visitDenseUnion=ka,Ia.prototype.visitSparseUnion=ka,Ia.prototype.visitDictionary=function(t,e){return t===e||Ta(t,e)&&t.id===e.id&&t.isOrdered===e.isOrdered&&Fa.visit(t.indices,e.indices)&&Fa.visit(t.dictionary,e.dictionary)},Ia.prototype.visitInterval=Ba,Ia.prototype.visitIntervalDayTime=Ba,Ia.prototype.visitIntervalYearMonth=Ba,Ia.prototype.visitFixedSizeList=function(t,e){return t===e||Ta(t,e)&&t.listSize===e.listSize&&t.children.length===e.children.length&&Fa.compareManyFields(t.children,e.children)},Ia.prototype.visitMap=function(t,e){return t===e||Ta(t,e)&&t.keysSorted===e.keysSorted&&t.children.length===e.children.length&&Fa.compareManyFields(t.children,e.children)};const Fa=new Ia;function La(t,e){return Fa.compareSchemas(t,e)}var Da,Na;class Ra{constructor(...t){switch(t.length){case 2:if([this.schema]=t,!(this.schema instanceof _a))throw new TypeError("RecordBatch constructor expects a [Schema, Data] pair.");if([,this.data=wa({nullCount:0,type:new mo(this.schema.fields),children:this.schema.fields.map((t=>wa({type:t.type,nullCount:0})))})]=t,!(this.data instanceof ma))throw new TypeError("RecordBatch constructor expects a [Schema, Data] pair.");[this.schema,this.data]=za(this.schema,this.data.children);break;case 1:{const[e]=t,{fields:n,children:r,length:i}=Object.keys(e).reduce(((t,n,r)=>(t.children[r]=e[n],t.length=Math.max(t.length,e[n].length),t.fields[r]=xa.new({name:n,type:e[n].type,nullable:!0}),t)),{length:0,fields:new Array,children:new Array}),o=new _a(n),s=wa({type:new mo(n),length:i,children:r,nullCount:0});[this.schema,this.data]=za(o,s.children,i);break}default:throw new TypeError("RecordBatch constructor expects an Object mapping names to child Data, or a [Schema, Data] pair.")}}get dictionaries(){return this._dictionaries||(this._dictionaries=Ua(this.schema.fields,this.data.children))}get numCols(){return this.schema.fields.length}get numRows(){return this.data.length}get nullCount(){return this.data.nullCount}isValid(t){return this.data.getValid(t)}get(t){return As.visit(this.data,t)}set(t,e){return ts.visit(this.data,t,e)}indexOf(t,e){return ra.visit(this.data,t,e)}getByteLength(t){return ha.visit(this.data,t)}[Symbol.iterator](){return aa.visit(new va([this.data]))}toArray(){return[...this]}concat(...t){return new Ga(this.schema,[this,...t])}slice(t,e){const[n]=new va([this.data]).slice(t,e).data;return new Ra(this.schema,n)}getChild(t){var e;return this.getChildAt(null===(e=this.schema.fields)||void 0===e?void 0:e.findIndex((e=>e.name===t)))}getChildAt(t){return t>-1&&te.name===t)),e)}setChildAt(t,e){let n=this.schema,r=this.data;if(t>-1&&tt.name===e));~t&&(r[t]=this.data.children[t])}return new Ra(e,wa({type:n,length:this.numRows,children:r}))}selectAt(t){const e=this.schema.selectAt(t),n=t.map((t=>this.data.children[t])).filter(Boolean),r=wa({type:new mo(e.fields),length:this.numRows,children:n});return new Ra(e,r)}}function za(t,e,n=e.reduce(((t,e)=>Math.max(t,e.length)),0)){var r;const i=[...t.fields],o=[...e],s=(n+63&-64)>>3;for(const[a,u]of t.fields.entries()){const t=e[a];t&&t.length===n||(i[a]=u.clone({nullable:!0}),o[a]=null!==(r=null==t?void 0:t._changeLengthAndBackfillNullBitmap(n))&&void 0!==r?r:wa({type:u.type,length:n,nullCount:n,nullBitmap:new Uint8Array(s)}))}return[t.assign(i),wa({type:new mo(i),length:n,children:o})]}function Ua(t,e,n=new Map){for(let r=-1,i=t.length;++r0&&Ua(i.children,o.children,n)}return n}Da=Symbol.toStringTag,Ra[Da]=(t=>(t._nullCount=-1,t[Symbol.isConcatSpreadable]=!0,"RecordBatch"))(Ra.prototype);class Va extends Ra{constructor(t){const e=t.fields.map((t=>wa({type:t.type})));super(t,wa({type:new mo(t.fields),nullCount:0,children:e}))}}function Wa(t,e){return function(t,e){const n=[...t.fields],r=[],i={numBatches:e.reduce(((t,e)=>Math.max(t,e.length)),0)};let o=0,s=0,a=-1;const u=e.length;let c,l=[];for(;i.numBatches-- >0;){for(s=Number.POSITIVE_INFINITY,a=-1;++a0&&(r[o++]=wa({type:new mo(n),length:s,nullCount:0,children:l.slice()})))}return[t=t.assign(n),r.map((e=>new Ra(t,e)))]}(t,e.map((t=>t.data.concat())))}function $a(t,e,n,r,i){var o;const s=(e+63&-64)>>3;for(let a=-1,u=r.length;++a=e)c===e?n[a]=u:(n[a]=u.slice(0,e),i.numBatches=Math.max(i.numBatches,r[a].unshift(u.slice(e,c-e))));else{const r=t[a];t[a]=r.clone({nullable:!0}),n[a]=null!==(o=null==u?void 0:u._changeLengthAndBackfillNullBitmap(e))&&void 0!==o?o:wa({type:r.type,length:e,nullCount:e,nullBitmap:new Uint8Array(s)})}}return n}class Ga{constructor(...t){var e,n;if(0===t.length)return this.batches=[],this.schema=new _a([]),this._offsets=[0],this;let r,i;t[0]instanceof _a&&(r=t.shift()),t[t.length-1]instanceof Uint32Array&&(i=t.pop());const o=t=>{if(t){if(t instanceof Ra)return[t];if(t instanceof Ga)return t.batches;if(t instanceof ma){if(t.type instanceof mo)return[new Ra(new _a(t.type.children),t)]}else{if(Array.isArray(t))return t.flatMap((t=>o(t)));if("function"==typeof t[Symbol.iterator])return[...t].flatMap((t=>o(t)));if("object"==typeof t){const e=Object.keys(t),n=e.map((e=>new va([t[e]]))),r=new _a(e.map(((t,e)=>new xa(String(t),n[e].type)))),[,i]=Wa(r,n);return 0===i.length?[new Ra(t)]:i}}}return[]},s=t.flatMap((t=>o(t)));if(r=null!==(n=null!=r?r:null===(e=s[0])||void 0===e?void 0:e.schema)&&void 0!==n?n:new _a([]),!(r instanceof _a))throw new TypeError("Table constructor expects a [Schema, RecordBatch[]] pair.");for(const t of s){if(!(t instanceof Ra))throw new TypeError("Table constructor expects a [Schema, RecordBatch[]] pair.");if(!La(r,t.schema))throw new TypeError("Table and inner RecordBatch schemas must be equivalent.")}this.schema=r,this.batches=s,this._offsets=null!=i?i:Us(this.data)}get data(){return this.batches.map((({data:t})=>t))}get numCols(){return this.schema.fields.length}get numRows(){return this.data.reduce(((t,e)=>t+e.length),0)}get nullCount(){return-1===this._nullCount&&(this._nullCount=zs(this.data)),this._nullCount}isValid(t){return!1}get(t){return null}set(t,e){}indexOf(t,e){return-1}getByteLength(t){return 0}[Symbol.iterator](){return this.batches.length>0?aa.visit(new va(this.data)):new Array(0)[Symbol.iterator]()}toArray(){return[...this]}toString(){return`[\n ${this.toArray().join(",\n ")}\n]`}concat(...t){const e=this.schema,n=this.data.concat(t.flatMap((({data:t})=>t)));return new Ga(e,n.map((t=>new Ra(e,t))))}slice(t,e){const n=this.schema;[t,e]=Bs({length:this.numRows},t,e);const r=Vs(this.data,this._offsets,t,e);return new Ga(n,r.map((t=>new Ra(n,t))))}getChild(t){return this.getChildAt(this.schema.fields.findIndex((e=>e.name===t)))}getChildAt(t){if(t>-1&&te.children[t]));if(0===e.length){const{type:n}=this.schema.fields[t],r=wa({type:n,length:0,nullCount:0});e.push(r._changeLengthAndBackfillNullBitmap(this.numRows))}return new va(e)}return null}setChild(t,e){var n;return this.setChildAt(null===(n=this.schema.fields)||void 0===n?void 0:n.findIndex((e=>e.name===t)),e)}setChildAt(t,e){let n=this.schema,r=[...this.batches];if(t>-1&&tthis.getChildAt(e)));[i[t],s[t]]=[o,e],[n,r]=Wa(n,s)}return new Ga(n,r)}select(t){const e=this.schema.fields.reduce(((t,e,n)=>t.set(e.name,n)),new Map);return this.selectAt(t.map((t=>e.get(t))).filter((t=>t>-1)))}selectAt(t){const e=this.schema.selectAt(t),n=this.batches.map((e=>e.selectAt(t)));return new Ga(e,n)}assign(t){const e=this.schema.fields,[n,r]=t.schema.fields.reduce(((t,n,r)=>{const[i,o]=t,s=e.findIndex((t=>t.name===n.name));return~s?o[s]=r:i.push(r),t}),[[],[]]),i=this.schema.assign(t.schema),o=[...e.map(((t,e)=>[e,r[e]])).map((([e,n])=>void 0===n?this.getChildAt(e):t.getChildAt(n))),...n.map((e=>t.getChildAt(e)))].filter(Boolean);return new Ga(...Wa(i,o))}}Na=Symbol.toStringTag,Ga[Na]=(t=>(t.schema=null,t.batches=[],t._offsets=new Uint32Array([0]),t._nullCount=-1,t[Symbol.isConcatSpreadable]=!0,t.isValid=Gs($s),t.get=Gs(As.getVisitFn(Br.Struct)),t.set=Ys(ts.getVisitFn(Br.Struct)),t.indexOf=Zs(ra.getVisitFn(Br.Struct)),t.getByteLength=Gs(ha.getVisitFn(Br.Struct)),"Table"))(Ga.prototype);class Ya{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}offset(){return this.bb.readInt64(this.bb_pos)}metaDataLength(){return this.bb.readInt32(this.bb_pos+8)}bodyLength(){return this.bb.readInt64(this.bb_pos+16)}static sizeOf(){return 24}static createBlock(t,e,n,r){return t.prep(8,24),t.writeInt64(r),t.pad(4),t.writeInt32(n),t.writeInt64(e),t.offset()}}const Za=new Int32Array(2),Ha=new Float32Array(Za.buffer),qa=new Float64Array(Za.buffer),Xa=1===new Uint16Array(new Uint8Array([1,0]).buffer)[0];class Ka{constructor(t,e){this.low=0|t,this.high=0|e}static create(t,e){return 0==t&&0==e?Ka.ZERO:new Ka(t,e)}toFloat64(){return(this.low>>>0)+4294967296*this.high}equals(t){return this.low==t.low&&this.high==t.high}}var Ja,Qa,tu,eu,nu;Ka.ZERO=new Ka(0,0),function(t){t[t.UTF8_BYTES=1]="UTF8_BYTES",t[t.UTF16_STRING=2]="UTF16_STRING"}(Ja||(Ja={}));class ru{constructor(t){this.bytes_=t,this.position_=0}static allocate(t){return new ru(new Uint8Array(t))}clear(){this.position_=0}bytes(){return this.bytes_}position(){return this.position_}setPosition(t){this.position_=t}capacity(){return this.bytes_.length}readInt8(t){return this.readUint8(t)<<24>>24}readUint8(t){return this.bytes_[t]}readInt16(t){return this.readUint16(t)<<16>>16}readUint16(t){return this.bytes_[t]|this.bytes_[t+1]<<8}readInt32(t){return this.bytes_[t]|this.bytes_[t+1]<<8|this.bytes_[t+2]<<16|this.bytes_[t+3]<<24}readUint32(t){return this.readInt32(t)>>>0}readInt64(t){return new Ka(this.readInt32(t),this.readInt32(t+4))}readUint64(t){return new Ka(this.readUint32(t),this.readUint32(t+4))}readFloat32(t){return Za[0]=this.readInt32(t),Ha[0]}readFloat64(t){return Za[Xa?0:1]=this.readInt32(t),Za[Xa?1:0]=this.readInt32(t+4),qa[0]}writeInt8(t,e){this.bytes_[t]=e}writeUint8(t,e){this.bytes_[t]=e}writeInt16(t,e){this.bytes_[t]=e,this.bytes_[t+1]=e>>8}writeUint16(t,e){this.bytes_[t]=e,this.bytes_[t+1]=e>>8}writeInt32(t,e){this.bytes_[t]=e,this.bytes_[t+1]=e>>8,this.bytes_[t+2]=e>>16,this.bytes_[t+3]=e>>24}writeUint32(t,e){this.bytes_[t]=e,this.bytes_[t+1]=e>>8,this.bytes_[t+2]=e>>16,this.bytes_[t+3]=e>>24}writeInt64(t,e){this.writeInt32(t,e.low),this.writeInt32(t+4,e.high)}writeUint64(t,e){this.writeUint32(t,e.low),this.writeUint32(t+4,e.high)}writeFloat32(t,e){Ha[0]=e,this.writeInt32(t,Za[0])}writeFloat64(t,e){qa[0]=e,this.writeInt32(t,Za[Xa?0:1]),this.writeInt32(t+4,Za[Xa?1:0])}getBufferIdentifier(){if(this.bytes_.length>10),56320+(1023&e)))}return r}__union_with_string(t,e){return"string"==typeof t?this.__string(e):this.__union(t,e)}__indirect(t){return t+this.readInt32(t)}__vector(t){return t+this.readInt32(t)+4}__vector_len(t){return this.readInt32(t+this.readInt32(t))}__has_identifier(t){if(4!=t.length)throw new Error("FlatBuffers: file identifier must be length 4");for(let e=0;e<4;e++)if(t.charCodeAt(e)!=this.readInt8(this.position()+4+e))return!1;return!0}createLong(t,e){return Ka.create(t,e)}createScalarList(t,e){const n=[];for(let r=0;rthis.minalign&&(this.minalign=t);const n=1+~(this.bb.capacity()-this.space+e)&t-1;for(;this.space=0&&0==this.vtable[e];e--);const n=e+1;for(;e>=0;e--)this.addInt16(0!=this.vtable[e]?t-this.vtable[e]:0);this.addInt16(t-this.object_start);const r=2*(n+2);this.addInt16(r);let i=0;const o=this.space;t:for(e=0;e=0;e--)this.writeInt8(t.charCodeAt(e))}this.prep(this.minalign,4+r),this.addOffset(t),r&&this.addInt32(this.bb.capacity()-this.space),this.bb.setPosition(this.space)}finishSizePrefixed(t,e){this.finish(t,e,!0)}requiredField(t,e){const n=this.bb.capacity()-t,r=n-this.bb.readInt32(n);if(0==this.bb.readInt16(r+e))throw new Error("FlatBuffers: field "+e+" must be set")}startVector(t,e,n){this.notNested(),this.vector_num_elems=e,this.prep(4,t*e),this.prep(n,t*e)}endVector(){return this.writeInt32(this.vector_num_elems),this.offset()}createSharedString(t){if(!t)return 0;if(this.string_maps||(this.string_maps=new Map),this.string_maps.has(t))return this.string_maps.get(t);const e=this.createString(t);return this.string_maps.set(t,e),e}createString(t){if(!t)return 0;let e;if(t instanceof Uint8Array)e=t;else{e=[];let n=0;for(;n=56320?i:(i<<10)+t.charCodeAt(n++)+-56613888,r<128?e.push(r):(r<2048?e.push(r>>6&31|192):(r<65536?e.push(r>>12&15|224):e.push(r>>18&7|240,r>>12&63|128),e.push(r>>6&63|128)),e.push(63&r|128))}}this.addInt8(0),this.startVector(1,e.length,1),this.bb.setPosition(this.space-=e.length);for(let t=0,n=this.space,r=this.bb.bytes();t=0;n--)t.addOffset(e[n]);return t.endVector()}static startChildrenVector(t,e){t.startVector(4,e,4)}static addCustomMetadata(t,e){t.addFieldOffset(6,e,0)}static createCustomMetadataVector(t,e){t.startVector(4,e.length,4);for(let n=e.length-1;n>=0;n--)t.addOffset(e[n]);return t.endVector()}static startCustomMetadataVector(t,e){t.startVector(4,e,4)}static endField(t){return t.endObject()}}class cu{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsSchema(t,e){return(e||new cu).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsSchema(t,e){return t.setPosition(t.position()+4),(e||new cu).__init(t.readInt32(t.position())+t.position(),t)}endianness(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt16(this.bb_pos+t):tu.Little}fields(t,e){const n=this.bb.__offset(this.bb_pos,6);return n?(e||new uu).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+n)+4*t),this.bb):null}fieldsLength(){const t=this.bb.__offset(this.bb_pos,6);return t?this.bb.__vector_len(this.bb_pos+t):0}customMetadata(t,e){const n=this.bb.__offset(this.bb_pos,8);return n?(e||new ou).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+n)+4*t),this.bb):null}customMetadataLength(){const t=this.bb.__offset(this.bb_pos,8);return t?this.bb.__vector_len(this.bb_pos+t):0}features(t){const e=this.bb.__offset(this.bb_pos,10);return e?this.bb.readInt64(this.bb.__vector(this.bb_pos+e)+8*t):this.bb.createLong(0,0)}featuresLength(){const t=this.bb.__offset(this.bb_pos,10);return t?this.bb.__vector_len(this.bb_pos+t):0}static startSchema(t){t.startObject(4)}static addEndianness(t,e){t.addFieldInt16(0,e,tu.Little)}static addFields(t,e){t.addFieldOffset(1,e,0)}static createFieldsVector(t,e){t.startVector(4,e.length,4);for(let n=e.length-1;n>=0;n--)t.addOffset(e[n]);return t.endVector()}static startFieldsVector(t,e){t.startVector(4,e,4)}static addCustomMetadata(t,e){t.addFieldOffset(2,e,0)}static createCustomMetadataVector(t,e){t.startVector(4,e.length,4);for(let n=e.length-1;n>=0;n--)t.addOffset(e[n]);return t.endVector()}static startCustomMetadataVector(t,e){t.startVector(4,e,4)}static addFeatures(t,e){t.addFieldOffset(3,e,0)}static createFeaturesVector(t,e){t.startVector(8,e.length,8);for(let n=e.length-1;n>=0;n--)t.addInt64(e[n]);return t.endVector()}static startFeaturesVector(t,e){t.startVector(8,e,8)}static endSchema(t){return t.endObject()}static finishSchemaBuffer(t,e){t.finish(e)}static finishSizePrefixedSchemaBuffer(t,e){t.finish(e,void 0,!0)}static createSchema(t,e,n,r,i){return cu.startSchema(t),cu.addEndianness(t,e),cu.addFields(t,n),cu.addCustomMetadata(t,r),cu.addFeatures(t,i),cu.endSchema(t)}}class lu{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsFooter(t,e){return(e||new lu).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsFooter(t,e){return t.setPosition(t.position()+4),(e||new lu).__init(t.readInt32(t.position())+t.position(),t)}version(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt16(this.bb_pos+t):Qa.V1}schema(t){const e=this.bb.__offset(this.bb_pos,6);return e?(t||new cu).__init(this.bb.__indirect(this.bb_pos+e),this.bb):null}dictionaries(t,e){const n=this.bb.__offset(this.bb_pos,8);return n?(e||new Ya).__init(this.bb.__vector(this.bb_pos+n)+24*t,this.bb):null}dictionariesLength(){const t=this.bb.__offset(this.bb_pos,8);return t?this.bb.__vector_len(this.bb_pos+t):0}recordBatches(t,e){const n=this.bb.__offset(this.bb_pos,10);return n?(e||new Ya).__init(this.bb.__vector(this.bb_pos+n)+24*t,this.bb):null}recordBatchesLength(){const t=this.bb.__offset(this.bb_pos,10);return t?this.bb.__vector_len(this.bb_pos+t):0}customMetadata(t,e){const n=this.bb.__offset(this.bb_pos,12);return n?(e||new ou).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+n)+4*t),this.bb):null}customMetadataLength(){const t=this.bb.__offset(this.bb_pos,12);return t?this.bb.__vector_len(this.bb_pos+t):0}static startFooter(t){t.startObject(5)}static addVersion(t,e){t.addFieldInt16(0,e,Qa.V1)}static addSchema(t,e){t.addFieldOffset(1,e,0)}static addDictionaries(t,e){t.addFieldOffset(2,e,0)}static startDictionariesVector(t,e){t.startVector(24,e,8)}static addRecordBatches(t,e){t.addFieldOffset(3,e,0)}static startRecordBatchesVector(t,e){t.startVector(24,e,8)}static addCustomMetadata(t,e){t.addFieldOffset(4,e,0)}static createCustomMetadataVector(t,e){t.startVector(4,e.length,4);for(let n=e.length-1;n>=0;n--)t.addOffset(e[n]);return t.endVector()}static startCustomMetadataVector(t,e){t.startVector(4,e,4)}static endFooter(t){return t.endObject()}static finishFooterBuffer(t,e){t.finish(e)}static finishSizePrefixedFooterBuffer(t,e){t.finish(e,void 0,!0)}}var fu=Ka,hu=iu,du=ru;class pu{constructor(t,e=Ar.V4,n,r){this.schema=t,this.version=e,n&&(this._recordBatches=n),r&&(this._dictionaryBatches=r)}static decode(t){t=new du(Oi(t));const e=lu.getRootAsFooter(t),n=_a.decode(e.schema());return new yu(n,e)}static encode(t){const e=new hu,n=_a.encode(e,t.schema);lu.startRecordBatchesVector(e,t.numRecordBatches);for(const n of[...t.recordBatches()].slice().reverse())vu.encode(e,n);const r=e.endVector();lu.startDictionariesVector(e,t.numDictionaries);for(const n of[...t.dictionaryBatches()].slice().reverse())vu.encode(e,n);const i=e.endVector();return lu.startFooter(e),lu.addSchema(e,n),lu.addVersion(e,Ar.V4),lu.addRecordBatches(e,r),lu.addDictionaries(e,i),lu.finishFooterBuffer(e,lu.endFooter(e)),e.asUint8Array()}get numRecordBatches(){return this._recordBatches.length}get numDictionaries(){return this._dictionaryBatches.length}*recordBatches(){for(let t,e=-1,n=this.numRecordBatches;++e=0&&t=0&&t=0&&t=0&&tmu(function*(t){let e,n,r,i,o=!1,s=[],a=0;({cmd:r,size:i}=yield null);const u=(c=t,function*(t,e){const n=function*(t){yield t},r="string"==typeof e||ArrayBuffer.isView(e)||e instanceof ArrayBuffer||e instanceof gi?n(e):ci(e)?e:n(e);return yield*Ii(function*(e){let n=null;do{n=e.next(yield xi(t,n))}while(!n.done)}(r[Symbol.iterator]())),new t}(Uint8Array,c))[Symbol.iterator]();var c;try{do{if(({done:e,value:n}=Number.isNaN(i-a)?u.next():u.next(i-a)),!e&&n.byteLength>0&&(s.push(n),a+=n.byteLength),e||i<=a)do{({cmd:r,size:i}=yield"peek"===r?_i(s,i)[0]:([n,s,a]=_i(s,i),n))}while(imu(function(t){return Zr(this,arguments,(function*(){let e,n,r,i,o=!1,s=[],a=0;({cmd:r,size:i}=yield yield Yr(null));const u=(c=t,Ti(Uint8Array,c))[Symbol.asyncIterator]();var c;try{do{if(({done:e,value:n}=Number.isNaN(i-a)?yield Yr(u.next()):yield Yr(u.next(i-a))),!e&&n.byteLength>0&&(s.push(n),a+=n.byteLength),e||i<=a)do{({cmd:r,size:i}=yield yield Yr("peek"===r?_i(s,i)[0]:([n,s,a]=_i(s,i),n)))}while(imu(function(t){return Zr(this,arguments,(function*(){let e,n,r,i=!1,o=!1,s=[],a=0;({cmd:n,size:r}=yield yield Yr(null));const u=new gu(t);try{do{if(({done:i,value:e}=Number.isNaN(r-a)?yield Yr(u.read()):yield Yr(u.read(r-a))),!i&&e.byteLength>0&&(s.push(Oi(e)),a+=e.byteLength),i||r<=a)do{({cmd:n,size:r}=yield yield Yr("peek"===n?_i(s,r)[0]:([e,s,a]=_i(s,r),e)))}while(rmu(function(t){return Zr(this,arguments,(function*(){const e=[];let n,r,i,o="error",s=!1,a=null,u=0,c=[];if(({cmd:n,size:r}=yield yield Yr(null)),t.isTTY)return yield yield Yr(new Uint8Array(0)),yield Yr(null);try{e[0]=wu(t,"end"),e[1]=wu(t,"error");do{if(e[2]=wu(t,"readable"),[o,a]=yield Yr(Promise.race(e.map((t=>t[2])))),"error"===o)break;if((s="end"===o)||(Number.isFinite(r-u)?(i=Oi(t.read(r-u)),i.byteLength0&&(c.push(i),u+=i.byteLength)),s||r<=u)do{({cmd:n,size:r}=yield yield Yr("peek"===n?_i(c,r)[0]:([i,c,u]=_i(c,r),i)))}while(r{for(const[n,r]of e)t.off(n,r);try{const e=t.destroy;e&&e.call(t,n),n=void 0}catch(t){n=t||n}finally{null!=n?i(n):r()}}))}(e,"error"===o?a:null))}return yield Yr(null)}))}(t)),toDOMStream(t,e){throw new Error('"toDOMStream" not available in this environment')},toNodeStream(t,e){throw new Error('"toNodeStream" not available in this environment')}},mu=t=>(t.next(),t);class gu{constructor(t){this.source=t,this.reader=null,this.reader=this.source.getReader(),this.reader.closed.catch((()=>{}))}get closed(){return this.reader?this.reader.closed.catch((()=>{})):Promise.resolve()}releaseLock(){this.reader&&this.reader.releaseLock(),this.reader=null}cancel(t){return Gr(this,void 0,void 0,(function*(){const{reader:e,source:n}=this;e&&(yield e.cancel(t).catch((()=>{}))),n&&n.locked&&this.releaseLock()}))}read(t){return Gr(this,void 0,void 0,(function*(){if(0===t)return{done:null==this.reader,value:new Uint8Array(0)};const e=yield this.reader.read();return!e.done&&(e.value=Oi(e)),e}))}}const wu=(t,e)=>{const n=t=>r([e,t]);let r;return[e,n,new Promise((i=>(r=i)&&t.once(e,n)))]},_u=Object.freeze({done:!0,value:void 0});class xu{constructor(t){this._json=t}get schema(){return this._json.schema}get batches(){return this._json.batches||[]}get dictionaries(){return this._json.dictionaries||[]}}class Su{tee(){return this._getDOMStream().tee()}pipe(t,e){return this._getNodeStream().pipe(t,e)}pipeTo(t,e){return this._getDOMStream().pipeTo(t,e)}pipeThrough(t,e){return this._getDOMStream().pipeThrough(t,e)}_getDOMStream(){return this._DOMStream||(this._DOMStream=this.toDOMStream())}_getNodeStream(){return this._nodeStream||(this._nodeStream=this.toNodeStream())}}class Ou extends Su{constructor(){super(),this._values=[],this.resolvers=[],this._closedPromise=new Promise((t=>this._closedPromiseResolve=t))}get closed(){return this._closedPromise}cancel(t){return Gr(this,void 0,void 0,(function*(){yield this.return(t)}))}write(t){this._ensureOpen()&&(this.resolvers.length<=0?this._values.push(t):this.resolvers.shift().resolve({done:!1,value:t}))}abort(t){this._closedPromiseResolve&&(this.resolvers.length<=0?this._error={error:t}:this.resolvers.shift().reject({done:!0,value:t}))}close(){if(this._closedPromiseResolve){const{resolvers:t}=this;for(;t.length>0;)t.shift().resolve(_u);this._closedPromiseResolve(),this._closedPromiseResolve=void 0}}[Symbol.asyncIterator](){return this}toDOMStream(t){return bu.toDOMStream(this._closedPromiseResolve||this._error?this:this._values,t)}toNodeStream(t){return bu.toNodeStream(this._closedPromiseResolve||this._error?this:this._values,t)}throw(t){return Gr(this,void 0,void 0,(function*(){return yield this.abort(t),_u}))}return(t){return Gr(this,void 0,void 0,(function*(){return yield this.close(),_u}))}read(t){return Gr(this,void 0,void 0,(function*(){return(yield this.next(t,"read")).value}))}peek(t){return Gr(this,void 0,void 0,(function*(){return(yield this.next(t,"peek")).value}))}next(...t){return this._values.length>0?Promise.resolve({done:!1,value:this._values.shift()}):this._error?Promise.reject({done:!0,value:this._error.error}):this._closedPromiseResolve?new Promise(((t,e)=>{this.resolvers.push({resolve:t,reject:e})})):Promise.resolve(_u)}_ensureOpen(){if(this._closedPromiseResolve)return!0;throw new Error("AsyncQueue is closed")}}class Iu extends Ou{write(t){if((t=Oi(t)).byteLength>0)return super.write(t)}toString(t=!1){return t?Kr(this.toUint8Array(!0)):this.toUint8Array(!1).then(Kr)}toUint8Array(t=!1){return t?_i(this._values)[0]:(()=>Gr(this,void 0,void 0,(function*(){var t,e;const n=[];let r=0;try{for(var i,o=qr(this);!(i=yield o.next()).done;){const t=i.value;n.push(t),r+=t.byteLength}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=o.return)&&(yield e.call(o))}finally{if(t)throw t.error}}return _i(n,r)[0]})))()}}class Tu{constructor(t){t&&(this.source=new Mu(bu.fromIterable(t)))}[Symbol.iterator](){return this}next(t){return this.source.next(t)}throw(t){return this.source.throw(t)}return(t){return this.source.return(t)}peek(t){return this.source.peek(t)}read(t){return this.source.read(t)}}class Au{constructor(t){t instanceof Au?this.source=t.source:t instanceof Iu?this.source=new Cu(bu.fromAsyncIterable(t)):bi(t)?this.source=new Cu(bu.fromNodeStream(t)):vi(t)?this.source=new Cu(bu.fromDOMStream(t)):pi(t)?this.source=new Cu(bu.fromDOMStream(t.body)):ci(t)?this.source=new Cu(bu.fromIterable(t)):(ui(t)||li(t))&&(this.source=new Cu(bu.fromAsyncIterable(t)))}[Symbol.asyncIterator](){return this}next(t){return this.source.next(t)}throw(t){return this.source.throw(t)}return(t){return this.source.return(t)}get closed(){return this.source.closed}cancel(t){return this.source.cancel(t)}peek(t){return this.source.peek(t)}read(t){return this.source.read(t)}}class Mu{constructor(t){this.source=t}cancel(t){this.return(t)}peek(t){return this.next(t,"peek").value}read(t){return this.next(t,"read").value}next(t,e="read"){return this.source.next({cmd:e,size:t})}throw(t){return Object.create(this.source.throw&&this.source.throw(t)||_u)}return(t){return Object.create(this.source.return&&this.source.return(t)||_u)}}class Cu{constructor(t){this.source=t,this._closedPromise=new Promise((t=>this._closedPromiseResolve=t))}cancel(t){return Gr(this,void 0,void 0,(function*(){yield this.return(t)}))}get closed(){return this._closedPromise}read(t){return Gr(this,void 0,void 0,(function*(){return(yield this.next(t,"read")).value}))}peek(t){return Gr(this,void 0,void 0,(function*(){return(yield this.next(t,"peek")).value}))}next(t,e="read"){return Gr(this,void 0,void 0,(function*(){return yield this.source.next({cmd:e,size:t})}))}throw(t){return Gr(this,void 0,void 0,(function*(){const e=this.source.throw&&(yield this.source.throw(t))||_u;return this._closedPromiseResolve&&this._closedPromiseResolve(),this._closedPromiseResolve=void 0,Object.create(e)}))}return(t){return Gr(this,void 0,void 0,(function*(){const e=this.source.return&&(yield this.source.return(t))||_u;return this._closedPromiseResolve&&this._closedPromiseResolve(),this._closedPromiseResolve=void 0,Object.create(e)}))}}class Pu extends Tu{constructor(t,e){super(),this.position=0,this.buffer=Oi(t),this.size=void 0===e?this.buffer.byteLength:e}readInt32(t){const{buffer:e,byteOffset:n}=this.readAt(t,4);return new DataView(e,n).getInt32(0,!0)}seek(t){return this.position=Math.min(t,this.size),tGr(this,void 0,void 0,(function*(){this.size=(yield t.stat()).size,delete this._pending})))()}readInt32(t){return Gr(this,void 0,void 0,(function*(){const{buffer:e,byteOffset:n}=yield this.readAt(t,4);return new DataView(e,n).getInt32(0,!0)}))}seek(t){return Gr(this,void 0,void 0,(function*(){return this._pending&&(yield this._pending),this.position=Math.min(t,this.size),t>>16,65535&this.buffer[1],this.buffer[0]>>>16,65535&this.buffer[0]]),n=new Uint32Array([t.buffer[1]>>>16,65535&t.buffer[1],t.buffer[0]>>>16,65535&t.buffer[0]]);let r=e[3]*n[3];this.buffer[0]=65535&r;let i=r>>>16;return r=e[2]*n[3],i+=r,r=e[3]*n[2]>>>0,i+=r,this.buffer[0]+=i<<16,this.buffer[1]=i>>>0>>16,this.buffer[1]+=e[1]*n[3]+e[2]*n[2]+e[3]*n[1],this.buffer[1]+=e[0]*n[3]+e[1]*n[2]+e[2]*n[1]+e[3]*n[0]<<16,this}_plus(t){const e=this.buffer[0]+t.buffer[0]>>>0;this.buffer[1]+=t.buffer[1],e>>0&&++this.buffer[1],this.buffer[0]=e}lessThan(t){return this.buffer[1]>>0,e[2]=this.buffer[2]+t.buffer[2]>>>0,e[1]=this.buffer[1]+t.buffer[1]>>>0,e[0]=this.buffer[0]+t.buffer[0]>>>0,e[0]>>0&&++e[1],e[1]>>0&&++e[2],e[2]>>0&&++e[3],this.buffer[3]=e[3],this.buffer[2]=e[2],this.buffer[1]=e[1],this.buffer[0]=e[0],this}hex(){return`${ju(this.buffer[3])} ${ju(this.buffer[2])} ${ju(this.buffer[1])} ${ju(this.buffer[0])}`}static multiply(t,e){return new Du(new Uint32Array(t.buffer)).times(e)}static add(t,e){return new Du(new Uint32Array(t.buffer)).plus(e)}static from(t,e=new Uint32Array(4)){return Du.fromString("string"==typeof t?t:t.toString(),e)}static fromNumber(t,e=new Uint32Array(4)){return Du.fromString(t.toString(),e)}static fromString(t,e=new Uint32Array(4)){const n=t.startsWith("-"),r=t.length,i=new Du(e);for(let e=n?1:0;e0&&this.readData(t,n)||new Uint8Array(0)}readOffsets(t,e){return this.readData(t,e)}readTypeIds(t,e){return this.readData(t,e)}readData(t,{length:e,offset:n}=this.nextBufferRange()){return this.bytes.subarray(n,n+e)}readDictionary(t){return this.dictionaries.get(t.id)}}class Ru extends Nu{constructor(t,e,n,r){super(new Uint8Array(0),e,n,r),this.sources=t}readNullBitmap(t,e,{offset:n}=this.nextBufferRange()){return e<=0?new Uint8Array(0):Xs(this.sources[n])}readOffsets(t,{offset:e}=this.nextBufferRange()){return xi(Uint8Array,xi(Int32Array,this.sources[e]))}readTypeIds(t,{offset:e}=this.nextBufferRange()){return xi(Uint8Array,xi(t.ArrayType,this.sources[e]))}readData(t,{offset:e}=this.nextBufferRange()){const{sources:n}=this;return ro.isTimestamp(t)||(ro.isInt(t)||ro.isTime(t))&&64===t.bitWidth||ro.isDate(t)&&t.unit===Pr.MILLISECOND?xi(Uint8Array,Lu.convertArray(n[e])):ro.isDecimal(t)?xi(Uint8Array,Du.convertArray(n[e])):ro.isBinary(t)||ro.isFixedSizeBinary(t)?function(t){const e=t.join(""),n=new Uint8Array(e.length/2);for(let t=0;t>1]=Number.parseInt(e.slice(t,t+2),16);return n}(n[e]):ro.isBool(t)?Xs(n[e]):ro.isUtf8(t)?Qr(n[e].join("")):xi(Uint8Array,xi(t.ArrayType,n[e].map((t=>+t))))}}var zu,Uu,Vu,Wu,$u,Gu,Yu,Zu;!function(t){t[t.BUFFER=0]="BUFFER"}(zu||(zu={})),function(t){t[t.LZ4_FRAME=0]="LZ4_FRAME",t[t.ZSTD=1]="ZSTD"}(Uu||(Uu={}));class Hu{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsBodyCompression(t,e){return(e||new Hu).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsBodyCompression(t,e){return t.setPosition(t.position()+4),(e||new Hu).__init(t.readInt32(t.position())+t.position(),t)}codec(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt8(this.bb_pos+t):Uu.LZ4_FRAME}method(){const t=this.bb.__offset(this.bb_pos,6);return t?this.bb.readInt8(this.bb_pos+t):zu.BUFFER}static startBodyCompression(t){t.startObject(2)}static addCodec(t,e){t.addFieldInt8(0,e,Uu.LZ4_FRAME)}static addMethod(t,e){t.addFieldInt8(1,e,zu.BUFFER)}static endBodyCompression(t){return t.endObject()}static createBodyCompression(t,e,n){return Hu.startBodyCompression(t),Hu.addCodec(t,e),Hu.addMethod(t,n),Hu.endBodyCompression(t)}}class qu{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}offset(){return this.bb.readInt64(this.bb_pos)}length(){return this.bb.readInt64(this.bb_pos+8)}static sizeOf(){return 16}static createBuffer(t,e,n){return t.prep(8,16),t.writeInt64(n),t.writeInt64(e),t.offset()}}class Xu{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}length(){return this.bb.readInt64(this.bb_pos)}nullCount(){return this.bb.readInt64(this.bb_pos+8)}static sizeOf(){return 16}static createFieldNode(t,e,n){return t.prep(8,16),t.writeInt64(n),t.writeInt64(e),t.offset()}}class Ku{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsRecordBatch(t,e){return(e||new Ku).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsRecordBatch(t,e){return t.setPosition(t.position()+4),(e||new Ku).__init(t.readInt32(t.position())+t.position(),t)}length(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt64(this.bb_pos+t):this.bb.createLong(0,0)}nodes(t,e){const n=this.bb.__offset(this.bb_pos,6);return n?(e||new Xu).__init(this.bb.__vector(this.bb_pos+n)+16*t,this.bb):null}nodesLength(){const t=this.bb.__offset(this.bb_pos,6);return t?this.bb.__vector_len(this.bb_pos+t):0}buffers(t,e){const n=this.bb.__offset(this.bb_pos,8);return n?(e||new qu).__init(this.bb.__vector(this.bb_pos+n)+16*t,this.bb):null}buffersLength(){const t=this.bb.__offset(this.bb_pos,8);return t?this.bb.__vector_len(this.bb_pos+t):0}compression(t){const e=this.bb.__offset(this.bb_pos,10);return e?(t||new Hu).__init(this.bb.__indirect(this.bb_pos+e),this.bb):null}static startRecordBatch(t){t.startObject(4)}static addLength(t,e){t.addFieldInt64(0,e,t.createLong(0,0))}static addNodes(t,e){t.addFieldOffset(1,e,0)}static startNodesVector(t,e){t.startVector(16,e,8)}static addBuffers(t,e){t.addFieldOffset(2,e,0)}static startBuffersVector(t,e){t.startVector(16,e,8)}static addCompression(t,e){t.addFieldOffset(3,e,0)}static endRecordBatch(t){return t.endObject()}}class Ju{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsDictionaryBatch(t,e){return(e||new Ju).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsDictionaryBatch(t,e){return t.setPosition(t.position()+4),(e||new Ju).__init(t.readInt32(t.position())+t.position(),t)}id(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt64(this.bb_pos+t):this.bb.createLong(0,0)}data(t){const e=this.bb.__offset(this.bb_pos,6);return e?(t||new Ku).__init(this.bb.__indirect(this.bb_pos+e),this.bb):null}isDelta(){const t=this.bb.__offset(this.bb_pos,8);return!!t&&!!this.bb.readInt8(this.bb_pos+t)}static startDictionaryBatch(t){t.startObject(3)}static addId(t,e){t.addFieldInt64(0,e,t.createLong(0,0))}static addData(t,e){t.addFieldOffset(1,e,0)}static addIsDelta(t,e){t.addFieldInt8(2,+e,0)}static endDictionaryBatch(t){return t.endObject()}}!function(t){t[t.HALF=0]="HALF",t[t.SINGLE=1]="SINGLE",t[t.DOUBLE=2]="DOUBLE"}(Vu||(Vu={}));class Qu{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsFloatingPoint(t,e){return(e||new Qu).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsFloatingPoint(t,e){return t.setPosition(t.position()+4),(e||new Qu).__init(t.readInt32(t.position())+t.position(),t)}precision(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt16(this.bb_pos+t):Vu.HALF}static startFloatingPoint(t){t.startObject(1)}static addPrecision(t,e){t.addFieldInt16(0,e,Vu.HALF)}static endFloatingPoint(t){return t.endObject()}static createFloatingPoint(t,e){return Qu.startFloatingPoint(t),Qu.addPrecision(t,e),Qu.endFloatingPoint(t)}}class tc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsDecimal(t,e){return(e||new tc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsDecimal(t,e){return t.setPosition(t.position()+4),(e||new tc).__init(t.readInt32(t.position())+t.position(),t)}precision(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt32(this.bb_pos+t):0}scale(){const t=this.bb.__offset(this.bb_pos,6);return t?this.bb.readInt32(this.bb_pos+t):0}bitWidth(){const t=this.bb.__offset(this.bb_pos,8);return t?this.bb.readInt32(this.bb_pos+t):128}static startDecimal(t){t.startObject(3)}static addPrecision(t,e){t.addFieldInt32(0,e,0)}static addScale(t,e){t.addFieldInt32(1,e,0)}static addBitWidth(t,e){t.addFieldInt32(2,e,128)}static endDecimal(t){return t.endObject()}static createDecimal(t,e,n,r){return tc.startDecimal(t),tc.addPrecision(t,e),tc.addScale(t,n),tc.addBitWidth(t,r),tc.endDecimal(t)}}!function(t){t[t.DAY=0]="DAY",t[t.MILLISECOND=1]="MILLISECOND"}(Wu||(Wu={}));class ec{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsDate(t,e){return(e||new ec).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsDate(t,e){return t.setPosition(t.position()+4),(e||new ec).__init(t.readInt32(t.position())+t.position(),t)}unit(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt16(this.bb_pos+t):Wu.MILLISECOND}static startDate(t){t.startObject(1)}static addUnit(t,e){t.addFieldInt16(0,e,Wu.MILLISECOND)}static endDate(t){return t.endObject()}static createDate(t,e){return ec.startDate(t),ec.addUnit(t,e),ec.endDate(t)}}!function(t){t[t.SECOND=0]="SECOND",t[t.MILLISECOND=1]="MILLISECOND",t[t.MICROSECOND=2]="MICROSECOND",t[t.NANOSECOND=3]="NANOSECOND"}($u||($u={}));class nc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsTime(t,e){return(e||new nc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsTime(t,e){return t.setPosition(t.position()+4),(e||new nc).__init(t.readInt32(t.position())+t.position(),t)}unit(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt16(this.bb_pos+t):$u.MILLISECOND}bitWidth(){const t=this.bb.__offset(this.bb_pos,6);return t?this.bb.readInt32(this.bb_pos+t):32}static startTime(t){t.startObject(2)}static addUnit(t,e){t.addFieldInt16(0,e,$u.MILLISECOND)}static addBitWidth(t,e){t.addFieldInt32(1,e,32)}static endTime(t){return t.endObject()}static createTime(t,e,n){return nc.startTime(t),nc.addUnit(t,e),nc.addBitWidth(t,n),nc.endTime(t)}}class rc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsTimestamp(t,e){return(e||new rc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsTimestamp(t,e){return t.setPosition(t.position()+4),(e||new rc).__init(t.readInt32(t.position())+t.position(),t)}unit(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt16(this.bb_pos+t):$u.SECOND}timezone(t){const e=this.bb.__offset(this.bb_pos,6);return e?this.bb.__string(this.bb_pos+e,t):null}static startTimestamp(t){t.startObject(2)}static addUnit(t,e){t.addFieldInt16(0,e,$u.SECOND)}static addTimezone(t,e){t.addFieldOffset(1,e,0)}static endTimestamp(t){return t.endObject()}static createTimestamp(t,e,n){return rc.startTimestamp(t),rc.addUnit(t,e),rc.addTimezone(t,n),rc.endTimestamp(t)}}!function(t){t[t.YEAR_MONTH=0]="YEAR_MONTH",t[t.DAY_TIME=1]="DAY_TIME",t[t.MONTH_DAY_NANO=2]="MONTH_DAY_NANO"}(Gu||(Gu={}));class ic{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsInterval(t,e){return(e||new ic).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsInterval(t,e){return t.setPosition(t.position()+4),(e||new ic).__init(t.readInt32(t.position())+t.position(),t)}unit(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt16(this.bb_pos+t):Gu.YEAR_MONTH}static startInterval(t){t.startObject(1)}static addUnit(t,e){t.addFieldInt16(0,e,Gu.YEAR_MONTH)}static endInterval(t){return t.endObject()}static createInterval(t,e){return ic.startInterval(t),ic.addUnit(t,e),ic.endInterval(t)}}!function(t){t[t.Sparse=0]="Sparse",t[t.Dense=1]="Dense"}(Yu||(Yu={}));class oc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsUnion(t,e){return(e||new oc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsUnion(t,e){return t.setPosition(t.position()+4),(e||new oc).__init(t.readInt32(t.position())+t.position(),t)}mode(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt16(this.bb_pos+t):Yu.Sparse}typeIds(t){const e=this.bb.__offset(this.bb_pos,6);return e?this.bb.readInt32(this.bb.__vector(this.bb_pos+e)+4*t):0}typeIdsLength(){const t=this.bb.__offset(this.bb_pos,6);return t?this.bb.__vector_len(this.bb_pos+t):0}typeIdsArray(){const t=this.bb.__offset(this.bb_pos,6);return t?new Int32Array(this.bb.bytes().buffer,this.bb.bytes().byteOffset+this.bb.__vector(this.bb_pos+t),this.bb.__vector_len(this.bb_pos+t)):null}static startUnion(t){t.startObject(2)}static addMode(t,e){t.addFieldInt16(0,e,Yu.Sparse)}static addTypeIds(t,e){t.addFieldOffset(1,e,0)}static createTypeIdsVector(t,e){t.startVector(4,e.length,4);for(let n=e.length-1;n>=0;n--)t.addInt32(e[n]);return t.endVector()}static startTypeIdsVector(t,e){t.startVector(4,e,4)}static endUnion(t){return t.endObject()}static createUnion(t,e,n){return oc.startUnion(t),oc.addMode(t,e),oc.addTypeIds(t,n),oc.endUnion(t)}}class sc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsFixedSizeBinary(t,e){return(e||new sc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsFixedSizeBinary(t,e){return t.setPosition(t.position()+4),(e||new sc).__init(t.readInt32(t.position())+t.position(),t)}byteWidth(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt32(this.bb_pos+t):0}static startFixedSizeBinary(t){t.startObject(1)}static addByteWidth(t,e){t.addFieldInt32(0,e,0)}static endFixedSizeBinary(t){return t.endObject()}static createFixedSizeBinary(t,e){return sc.startFixedSizeBinary(t),sc.addByteWidth(t,e),sc.endFixedSizeBinary(t)}}class ac{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsFixedSizeList(t,e){return(e||new ac).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsFixedSizeList(t,e){return t.setPosition(t.position()+4),(e||new ac).__init(t.readInt32(t.position())+t.position(),t)}listSize(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt32(this.bb_pos+t):0}static startFixedSizeList(t){t.startObject(1)}static addListSize(t,e){t.addFieldInt32(0,e,0)}static endFixedSizeList(t){return t.endObject()}static createFixedSizeList(t,e){return ac.startFixedSizeList(t),ac.addListSize(t,e),ac.endFixedSizeList(t)}}class uc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsMap(t,e){return(e||new uc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsMap(t,e){return t.setPosition(t.position()+4),(e||new uc).__init(t.readInt32(t.position())+t.position(),t)}keysSorted(){const t=this.bb.__offset(this.bb_pos,4);return!!t&&!!this.bb.readInt8(this.bb_pos+t)}static startMap(t){t.startObject(1)}static addKeysSorted(t,e){t.addFieldInt8(0,+e,0)}static endMap(t){return t.endObject()}static createMap(t,e){return uc.startMap(t),uc.addKeysSorted(t,e),uc.endMap(t)}}!function(t){t[t.NONE=0]="NONE",t[t.Schema=1]="Schema",t[t.DictionaryBatch=2]="DictionaryBatch",t[t.RecordBatch=3]="RecordBatch",t[t.Tensor=4]="Tensor",t[t.SparseTensor=5]="SparseTensor"}(Zu||(Zu={}));class cc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsMessage(t,e){return(e||new cc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsMessage(t,e){return t.setPosition(t.position()+4),(e||new cc).__init(t.readInt32(t.position())+t.position(),t)}version(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt16(this.bb_pos+t):Qa.V1}headerType(){const t=this.bb.__offset(this.bb_pos,6);return t?this.bb.readUint8(this.bb_pos+t):Zu.NONE}header(t){const e=this.bb.__offset(this.bb_pos,8);return e?this.bb.__union(t,this.bb_pos+e):null}bodyLength(){const t=this.bb.__offset(this.bb_pos,10);return t?this.bb.readInt64(this.bb_pos+t):this.bb.createLong(0,0)}customMetadata(t,e){const n=this.bb.__offset(this.bb_pos,12);return n?(e||new ou).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+n)+4*t),this.bb):null}customMetadataLength(){const t=this.bb.__offset(this.bb_pos,12);return t?this.bb.__vector_len(this.bb_pos+t):0}static startMessage(t){t.startObject(5)}static addVersion(t,e){t.addFieldInt16(0,e,Qa.V1)}static addHeaderType(t,e){t.addFieldInt8(1,e,Zu.NONE)}static addHeader(t,e){t.addFieldOffset(2,e,0)}static addBodyLength(t,e){t.addFieldInt64(3,e,t.createLong(0,0))}static addCustomMetadata(t,e){t.addFieldOffset(4,e,0)}static createCustomMetadataVector(t,e){t.startVector(4,e.length,4);for(let n=e.length-1;n>=0;n--)t.addOffset(e[n]);return t.endVector()}static startCustomMetadataVector(t,e){t.startVector(4,e,4)}static endMessage(t){return t.endObject()}static finishMessageBuffer(t,e){t.finish(e)}static finishSizePrefixedMessageBuffer(t,e){t.finish(e,void 0,!0)}static createMessage(t,e,n,r,i,o){return cc.startMessage(t),cc.addVersion(t,e),cc.addHeaderType(t,n),cc.addHeader(t,r),cc.addBodyLength(t,i),cc.addCustomMetadata(t,o),cc.endMessage(t)}}class lc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsNull(t,e){return(e||new lc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsNull(t,e){return t.setPosition(t.position()+4),(e||new lc).__init(t.readInt32(t.position())+t.position(),t)}static startNull(t){t.startObject(0)}static endNull(t){return t.endObject()}static createNull(t){return lc.startNull(t),lc.endNull(t)}}class fc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsBinary(t,e){return(e||new fc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsBinary(t,e){return t.setPosition(t.position()+4),(e||new fc).__init(t.readInt32(t.position())+t.position(),t)}static startBinary(t){t.startObject(0)}static endBinary(t){return t.endObject()}static createBinary(t){return fc.startBinary(t),fc.endBinary(t)}}class hc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsBool(t,e){return(e||new hc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsBool(t,e){return t.setPosition(t.position()+4),(e||new hc).__init(t.readInt32(t.position())+t.position(),t)}static startBool(t){t.startObject(0)}static endBool(t){return t.endObject()}static createBool(t){return hc.startBool(t),hc.endBool(t)}}class dc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsUtf8(t,e){return(e||new dc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsUtf8(t,e){return t.setPosition(t.position()+4),(e||new dc).__init(t.readInt32(t.position())+t.position(),t)}static startUtf8(t){t.startObject(0)}static endUtf8(t){return t.endObject()}static createUtf8(t){return dc.startUtf8(t),dc.endUtf8(t)}}class pc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsList(t,e){return(e||new pc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsList(t,e){return t.setPosition(t.position()+4),(e||new pc).__init(t.readInt32(t.position())+t.position(),t)}static startList(t){t.startObject(0)}static endList(t){return t.endObject()}static createList(t){return pc.startList(t),pc.endList(t)}}class yc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsStruct_(t,e){return(e||new yc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsStruct_(t,e){return t.setPosition(t.position()+4),(e||new yc).__init(t.readInt32(t.position())+t.position(),t)}static startStruct_(t){t.startObject(0)}static endStruct_(t){return t.endObject()}static createStruct_(t){return yc.startStruct_(t),yc.endStruct_(t)}}var vc=Ka;const bc=new class extends Ao{visit(t,e){return null==t||null==e?void 0:super.visit(t,e)}visitNull(t,e){return lc.startNull(e),lc.endNull(e)}visitInt(t,e){return su.startInt(e),su.addBitWidth(e,t.bitWidth),su.addIsSigned(e,t.isSigned),su.endInt(e)}visitFloat(t,e){return Qu.startFloatingPoint(e),Qu.addPrecision(e,t.precision),Qu.endFloatingPoint(e)}visitBinary(t,e){return fc.startBinary(e),fc.endBinary(e)}visitBool(t,e){return hc.startBool(e),hc.endBool(e)}visitUtf8(t,e){return dc.startUtf8(e),dc.endUtf8(e)}visitDecimal(t,e){return tc.startDecimal(e),tc.addScale(e,t.scale),tc.addPrecision(e,t.precision),tc.addBitWidth(e,t.bitWidth),tc.endDecimal(e)}visitDate(t,e){return ec.startDate(e),ec.addUnit(e,t.unit),ec.endDate(e)}visitTime(t,e){return nc.startTime(e),nc.addUnit(e,t.unit),nc.addBitWidth(e,t.bitWidth),nc.endTime(e)}visitTimestamp(t,e){const n=t.timezone&&e.createString(t.timezone)||void 0;return rc.startTimestamp(e),rc.addUnit(e,t.unit),void 0!==n&&rc.addTimezone(e,n),rc.endTimestamp(e)}visitInterval(t,e){return ic.startInterval(e),ic.addUnit(e,t.unit),ic.endInterval(e)}visitList(t,e){return pc.startList(e),pc.endList(e)}visitStruct(t,e){return yc.startStruct_(e),yc.endStruct_(e)}visitUnion(t,e){oc.startTypeIdsVector(e,t.typeIds.length);const n=oc.createTypeIdsVector(e,t.typeIds);return oc.startUnion(e),oc.addMode(e,t.mode),oc.addTypeIds(e,n),oc.endUnion(e)}visitDictionary(t,e){const n=this.visit(t.indices,e);return au.startDictionaryEncoding(e),au.addId(e,new vc(t.id,0)),au.addIsOrdered(e,t.isOrdered),void 0!==n&&au.addIndexType(e,n),au.endDictionaryEncoding(e)}visitFixedSizeBinary(t,e){return sc.startFixedSizeBinary(e),sc.addByteWidth(e,t.byteWidth),sc.endFixedSizeBinary(e)}visitFixedSizeList(t,e){return ac.startFixedSizeList(e),ac.addListSize(e,t.listSize),ac.endFixedSizeList(e)}visitMap(t,e){return uc.startMap(e),uc.addKeysSorted(e,t.keysSorted),uc.endMap(e)}};function mc(t){return new Cc(t.count,wc(t.columns),_c(t.columns))}function gc(t,e){return(t.children||[]).filter(Boolean).map((t=>xa.fromJSON(t,e)))}function wc(t){return(t||[]).reduce(((t,e)=>{return[...t,new jc(e.count,(n=e.VALIDITY,(n||[]).reduce(((t,e)=>t+ +(0===e)),0))),...wc(e.children)];var n}),[])}function _c(t,e=[]){for(let n=-1,r=(t||[]).length;++nr),this._bodyLength="number"==typeof t?t:t.low}static fromJSON(t,e){const n=new Mc(0,Ar.V4,e);return n._createHeader=function(t,e){return()=>{switch(e){case kr.Schema:return _a.fromJSON(t);case kr.RecordBatch:return Cc.fromJSON(t);case kr.DictionaryBatch:return Pc.fromJSON(t)}throw new Error(`Unrecognized Message type: { name: ${kr[e]}, type: ${e} }`)}}(t,e),n}static decode(t){t=new Ac(Oi(t));const e=cc.getRootAsMessage(t),n=e.bodyLength(),r=e.version(),i=e.headerType(),o=new Mc(n,r,i);return o._createHeader=function(t,e){return()=>{switch(e){case kr.Schema:return _a.decode(t.header(new cu));case kr.RecordBatch:return Cc.decode(t.header(new Ku),t.version());case kr.DictionaryBatch:return Pc.decode(t.header(new Ju),t.version())}throw new Error(`Unrecognized Message type: { name: ${kr[e]}, type: ${e} }`)}}(e,i),o}static encode(t){const e=new Tc;let n=-1;return t.isSchema()?n=_a.encode(e,t.header()):t.isRecordBatch()?n=Cc.encode(e,t.header()):t.isDictionaryBatch()&&(n=Pc.encode(e,t.header())),cc.startMessage(e),cc.addVersion(e,Ar.V4),cc.addHeader(e,n),cc.addHeaderType(e,t.headerType),cc.addBodyLength(e,new Ic(t.bodyLength,0)),cc.finishMessageBuffer(e,cc.endMessage(e)),e.asUint8Array()}static from(t,e=0){if(t instanceof _a)return new Mc(0,Ar.V4,kr.Schema,t);if(t instanceof Cc)return new Mc(e,Ar.V4,kr.RecordBatch,t);if(t instanceof Pc)return new Mc(e,Ar.V4,kr.DictionaryBatch,t);throw new Error(`Unrecognized Message header: ${t}`)}get type(){return this.headerType}get version(){return this._version}get headerType(){return this._headerType}get bodyLength(){return this._bodyLength}header(){return this._createHeader()}isSchema(){return this.headerType===kr.Schema}isRecordBatch(){return this.headerType===kr.RecordBatch}isDictionaryBatch(){return this.headerType===kr.DictionaryBatch}}class Cc{constructor(t,e,n){this._nodes=e,this._buffers=n,this._length="number"==typeof t?t:t.low}get nodes(){return this._nodes}get length(){return this._length}get buffers(){return this._buffers}}class Pc{constructor(t,e,n=!1){this._data=t,this._isDelta=n,this._id="number"==typeof e?e:e.low}get id(){return this._id}get data(){return this._data}get isDelta(){return this._isDelta}get length(){return this.data.length}get nodes(){return this.data.nodes}get buffers(){return this.data.buffers}}class Ec{constructor(t,e){this.offset="number"==typeof t?t:t.low,this.length="number"==typeof e?e:e.low}}class jc{constructor(t,e){this.length="number"==typeof t?t:t.low,this.nullCount="number"==typeof e?e:e.low}}function kc(t,e){const n=[];for(let r,i=-1,o=-1,s=t.childrenLength();++ixa.encode(t,e))),u=uu.createChildrenVector(t,a),c=e.metadata&&e.metadata.size>0?uu.createCustomMetadataVector(t,[...e.metadata].map((([e,n])=>{const r=t.createString(`${e}`),i=t.createString(`${n}`);return ou.startKeyValue(t),ou.addKey(t,r),ou.addValue(t,i),ou.endKeyValue(t)}))):-1;return e.name&&(n=t.createString(e.name)),uu.startField(t),uu.addType(t,r),uu.addTypeType(t,s),uu.addChildren(t,u),uu.addNullable(t,!!e.nullable),-1!==n&&uu.addName(t,n),-1!==i&&uu.addDictionary(t,i),-1!==c&&uu.addCustomMetadata(t,c),uu.endField(t)},xa.decode=function(t,e){let n,r,i,o,s,a;return e&&(a=t.dictionary())?e.has(n=a.id().low)?(o=(o=a.indexType())?Fc(o):new so,s=new Io(e.get(n),o,n,a.isOrdered()),r=new xa(t.name(),s,t.nullable(),Bc(t))):(o=(o=a.indexType())?Fc(o):new so,e.set(n,i=Lc(t,kc(t,e))),s=new Io(i,o,n,a.isOrdered()),r=new xa(t.name(),s,t.nullable(),Bc(t))):(i=Lc(t,kc(t,e)),r=new xa(t.name(),i,t.nullable(),Bc(t))),r||null},xa.fromJSON=function(t,e){let n,r,i,o,s,a;return e&&(o=t.dictionary)?e.has(n=o.id)?(r=(r=o.indexType)?Sc(r):new so,a=new Io(e.get(n),r,n,o.isOrdered),i=new xa(t.name,a,t.nullable,xc(t.customMetadata))):(r=(r=o.indexType)?Sc(r):new so,e.set(n,s=Oc(t,gc(t,e))),a=new Io(s,r,n,o.isOrdered),i=new xa(t.name,a,t.nullable,xc(t.customMetadata))):(s=Oc(t,gc(t,e)),i=new xa(t.name,s,t.nullable,xc(t.customMetadata))),i||null},_a.encode=function(t,e){const n=e.fields.map((e=>xa.encode(t,e)));cu.startFieldsVector(t,n.length);const r=cu.createFieldsVector(t,n),i=e.metadata&&e.metadata.size>0?cu.createCustomMetadataVector(t,[...e.metadata].map((([e,n])=>{const r=t.createString(`${e}`),i=t.createString(`${n}`);return ou.startKeyValue(t),ou.addKey(t,r),ou.addValue(t,i),ou.endKeyValue(t)}))):-1;return cu.startSchema(t),cu.addFields(t,r),cu.addEndianness(t,Dc?tu.Little:tu.Big),-1!==i&&cu.addCustomMetadata(t,i),cu.endSchema(t)},_a.decode=function(t,e=new Map){const n=function(t,e){const n=[];for(let r,i=-1,o=-1,s=t.fieldsLength();++ixa.fromJSON(t,e)))}(t,e),xc(t.customMetadata),e)},Cc.encode=function(t,e){const n=e.nodes||[],r=e.buffers||[];Ku.startNodesVector(t,n.length);for(const e of n.slice().reverse())jc.encode(t,e);const i=t.endVector();Ku.startBuffersVector(t,r.length);for(const e of r.slice().reverse())Ec.encode(t,e);const o=t.endVector();return Ku.startRecordBatch(t),Ku.addLength(t,new Ic(e.length,0)),Ku.addNodes(t,i),Ku.addBuffers(t,o),Ku.endRecordBatch(t)},Cc.decode=function(t,e=Ar.V4){if(null!==t.compression())throw new Error("Record batch compression not implemented");return new Cc(t.length(),function(t){const e=[];for(let n,r=-1,i=-1,o=t.nodesLength();++r{const t=new ArrayBuffer(2);return new DataView(t).setInt16(0,256,!0),256===new Int16Array(t)[0]})(),Nc=t=>`Expected ${kr[t]} Message in stream, but was null or length 0.`,Rc=t=>`Header pointer of flatbuffer-encoded ${kr[t]} Message is null or length 0.`,zc=(t,e)=>`Expected to read ${t} metadata bytes, but only read ${e}.`,Uc=(t,e)=>`Expected to read ${t} bytes for message body, but only read ${e}.`;class Vc{constructor(t){this.source=t instanceof Tu?t:new Tu(t)}[Symbol.iterator](){return this}next(){let t;return(t=this.readMetadataLength()).done||-1===t.value&&(t=this.readMetadataLength()).done||(t=this.readMetadata(t.value)).done?_u:t}throw(t){return this.source.throw(t)}return(t){return this.source.return(t)}readMessage(t){let e;if((e=this.next()).done)return null;if(null!=t&&e.value.headerType!==t)throw new Error(Nc(t));return e.value}readMessageBody(t){if(t<=0)return new Uint8Array(0);const e=Oi(this.source.read(t));if(e.byteLength[...e,...n.VALIDITY&&[n.VALIDITY]||[],...n.TYPE&&[n.TYPE]||[],...n.OFFSET&&[n.OFFSET]||[],...n.DATA&&[n.DATA]||[],...t(n.children)]),[])}(this._body)}readMessage(t){let e;if((e=this.next()).done)return null;if(null!=t&&e.value.headerType!==t)throw new Error(Nc(t));return e.value}readSchema(){const t=kr.Schema,e=this.readMessage(t),n=null==e?void 0:e.header();if(!e||!n)throw new Error(Rc(t));return n}}const Gc=4,Yc=new Uint8Array(6);for(let t=0;t<6;t+=1)Yc[t]="ARROW1".codePointAt(t);function Zc(t,e=0){for(let n=-1,r=Yc.length;++nthis)):this}readRecordBatch(t){return this._impl.isFile()?this._impl.readRecordBatch(t):null}[Symbol.iterator](){return this._impl[Symbol.iterator]()}[Symbol.asyncIterator](){return this._impl[Symbol.asyncIterator]()}toDOMStream(){return bu.toDOMStream(this.isSync()?{[Symbol.iterator]:()=>this}:{[Symbol.asyncIterator]:()=>this})}toNodeStream(){return bu.toNodeStream(this.isSync()?{[Symbol.iterator]:()=>this}:{[Symbol.asyncIterator]:()=>this},{objectMode:!0})}static throughNode(t){throw new Error('"throughNode" not available in this environment')}static throughDOM(t,e){throw new Error('"throughDOM" not available in this environment')}static from(t){return t instanceof Kc?t:fi(t)?function(t){return new Jc(new al(t))}(t):di(t)?function(t){return Gr(this,void 0,void 0,(function*(){const{size:e}=yield t.stat(),n=new Eu(t,e);return e>=Xc&&Zc(yield n.readAt(0,Hc+7&-8))?new el(new sl(n)):new Qc(new il(n))}))}(t):ui(t)?(()=>Gr(this,void 0,void 0,(function*(){return yield Kc.from(yield t)})))():pi(t)||vi(t)||bi(t)||li(t)?function(t){return Gr(this,void 0,void 0,(function*(){const e=yield t.peek(Hc+7&-8);return e&&e.byteLength>=4?Zc(e)?new tl(new ol(yield t.read())):new Qc(new il(t)):new Qc(new il(function(){return Zr(this,arguments,(function*(){}))}()))}))}(new Au(t)):function(t){const e=t.peek(Hc+7&-8);return e&&e.byteLength>=4?Zc(e)?new tl(new ol(t.read())):new Jc(new rl(t)):new Jc(new rl(function*(){}()))}(new Tu(t))}static readAll(t){return t instanceof Kc?t.isSync()?cl(t):ll(t):fi(t)||ArrayBuffer.isView(t)||ci(t)||hi(t)?cl(t):ll(t)}}class Jc extends Kc{constructor(t){super(t),this._impl=t}readAll(){return[...this]}[Symbol.iterator](){return this._impl[Symbol.iterator]()}[Symbol.asyncIterator](){return Zr(this,arguments,(function*(){yield Yr(yield*Hr(qr(this[Symbol.iterator]())))}))}}class Qc extends Kc{constructor(t){super(t),this._impl=t}readAll(){var t,e;return Gr(this,void 0,void 0,(function*(){const n=new Array;try{for(var r,i=qr(this);!(r=yield i.next()).done;){const t=r.value;n.push(t)}}catch(e){t={error:e}}finally{try{r&&!r.done&&(e=i.return)&&(yield e.call(i))}finally{if(t)throw t.error}}return n}))}[Symbol.iterator](){throw new Error("AsyncRecordBatchStreamReader is not Iterable")}[Symbol.asyncIterator](){return this._impl[Symbol.asyncIterator]()}}class tl extends Jc{constructor(t){super(t),this._impl=t}}class el extends Qc{constructor(t){super(t),this._impl=t}}class nl{constructor(t=new Map){this.closed=!1,this.autoDestroy=!0,this._dictionaryIndex=0,this._recordBatchIndex=0,this.dictionaries=t}get numDictionaries(){return this._dictionaryIndex}get numRecordBatches(){return this._recordBatchIndex}isSync(){return!1}isAsync(){return!1}isFile(){return!1}isStream(){return!1}reset(t){return this._dictionaryIndex=0,this._recordBatchIndex=0,this.schema=t,this.dictionaries=new Map,this}_loadRecordBatch(t,e){const n=this._loadVectors(t,e,this.schema.fields),r=wa({type:new mo(this.schema.fields),length:t.length,children:n});return new Ra(this.schema,r)}_loadDictionaryBatch(t,e){const{id:n,isDelta:r}=t,{dictionaries:i,schema:o}=this,s=i.get(n);if(r||!s){const i=o.dictionaries.get(n),a=this._loadVectors(t.data,e,[i]);return(s&&r?s.concat(new va(a)):new va(a)).memoize()}return s.memoize()}_loadVectors(t,e,n){return new Nu(e,t.nodes,t.buffers,this.dictionaries).visitMany(n)}}class rl extends nl{constructor(t,e){super(e),this._reader=fi(t)?new $c(this._handle=t):new Vc(this._handle=t)}isSync(){return!0}isStream(){return!0}[Symbol.iterator](){return this}cancel(){!this.closed&&(this.closed=!0)&&(this.reset()._reader.return(),this._reader=null,this.dictionaries=null)}open(t){return this.closed||(this.autoDestroy=ul(this,t),this.schema||(this.schema=this._reader.readSchema())||this.cancel()),this}throw(t){return!this.closed&&this.autoDestroy&&(this.closed=!0)?this.reset()._reader.throw(t):_u}return(t){return!this.closed&&this.autoDestroy&&(this.closed=!0)?this.reset()._reader.return(t):_u}next(){if(this.closed)return _u;let t;const{_reader:e}=this;for(;t=this._readNextMessageAndValidate();)if(t.isSchema())this.reset(t.header());else{if(t.isRecordBatch()){this._recordBatchIndex++;const n=t.header(),r=e.readMessageBody(t.bodyLength);return{done:!1,value:this._loadRecordBatch(n,r)}}if(t.isDictionaryBatch()){this._dictionaryIndex++;const n=t.header(),r=e.readMessageBody(t.bodyLength),i=this._loadDictionaryBatch(n,r);this.dictionaries.set(n.id,i)}}return this.schema&&0===this._recordBatchIndex?(this._recordBatchIndex++,{done:!1,value:new Va(this.schema)}):this.return()}_readNextMessageAndValidate(t){return this._reader.readMessage(t)}}class il extends nl{constructor(t,e){super(e),this._reader=new Wc(this._handle=t)}isAsync(){return!0}isStream(){return!0}[Symbol.asyncIterator](){return this}cancel(){return Gr(this,void 0,void 0,(function*(){!this.closed&&(this.closed=!0)&&(yield this.reset()._reader.return(),this._reader=null,this.dictionaries=null)}))}open(t){return Gr(this,void 0,void 0,(function*(){return this.closed||(this.autoDestroy=ul(this,t),this.schema||(this.schema=yield this._reader.readSchema())||(yield this.cancel())),this}))}throw(t){return Gr(this,void 0,void 0,(function*(){return!this.closed&&this.autoDestroy&&(this.closed=!0)?yield this.reset()._reader.throw(t):_u}))}return(t){return Gr(this,void 0,void 0,(function*(){return!this.closed&&this.autoDestroy&&(this.closed=!0)?yield this.reset()._reader.return(t):_u}))}next(){return Gr(this,void 0,void 0,(function*(){if(this.closed)return _u;let t;const{_reader:e}=this;for(;t=yield this._readNextMessageAndValidate();)if(t.isSchema())yield this.reset(t.header());else{if(t.isRecordBatch()){this._recordBatchIndex++;const n=t.header(),r=yield e.readMessageBody(t.bodyLength);return{done:!1,value:this._loadRecordBatch(n,r)}}if(t.isDictionaryBatch()){this._dictionaryIndex++;const n=t.header(),r=yield e.readMessageBody(t.bodyLength),i=this._loadDictionaryBatch(n,r);this.dictionaries.set(n.id,i)}}return this.schema&&0===this._recordBatchIndex?(this._recordBatchIndex++,{done:!1,value:new Va(this.schema)}):yield this.return()}))}_readNextMessageAndValidate(t){return Gr(this,void 0,void 0,(function*(){return yield this._reader.readMessage(t)}))}}class ol extends rl{constructor(t,e){super(t instanceof Pu?t:new Pu(t),e)}get footer(){return this._footer}get numDictionaries(){return this._footer?this._footer.numDictionaries:0}get numRecordBatches(){return this._footer?this._footer.numRecordBatches:0}isSync(){return!0}isFile(){return!0}open(t){if(!this.closed&&!this._footer){this.schema=(this._footer=this._readFooter()).schema;for(const t of this._footer.dictionaryBatches())t&&this._readDictionaryBatch(this._dictionaryIndex++)}return super.open(t)}readRecordBatch(t){var e;if(this.closed)return null;this._footer||this.open();const n=null===(e=this._footer)||void 0===e?void 0:e.getRecordBatch(t);if(n&&this._handle.seek(n.offset)){const t=this._reader.readMessage(kr.RecordBatch);if(null==t?void 0:t.isRecordBatch()){const e=t.header(),n=this._reader.readMessageBody(t.bodyLength);return this._loadRecordBatch(e,n)}}return null}_readDictionaryBatch(t){var e;const n=null===(e=this._footer)||void 0===e?void 0:e.getDictionaryBatch(t);if(n&&this._handle.seek(n.offset)){const t=this._reader.readMessage(kr.DictionaryBatch);if(null==t?void 0:t.isDictionaryBatch()){const e=t.header(),n=this._reader.readMessageBody(t.bodyLength),r=this._loadDictionaryBatch(e,n);this.dictionaries.set(e.id,r)}}}_readFooter(){const{_handle:t}=this,e=t.size-qc,n=t.readInt32(e),r=t.readAt(e-n,n);return pu.decode(r)}_readNextMessageAndValidate(t){var e;if(this._footer||this.open(),this._footer&&this._recordBatchIndexsuper.open}});return Gr(this,void 0,void 0,(function*(){if(!this.closed&&!this._footer){this.schema=(this._footer=yield this._readFooter()).schema;for(const t of this._footer.dictionaryBatches())t&&(yield this._readDictionaryBatch(this._dictionaryIndex++))}return yield e.open.call(this,t)}))}readRecordBatch(t){var e;return Gr(this,void 0,void 0,(function*(){if(this.closed)return null;this._footer||(yield this.open());const n=null===(e=this._footer)||void 0===e?void 0:e.getRecordBatch(t);if(n&&(yield this._handle.seek(n.offset))){const t=yield this._reader.readMessage(kr.RecordBatch);if(null==t?void 0:t.isRecordBatch()){const e=t.header(),n=yield this._reader.readMessageBody(t.bodyLength);return this._loadRecordBatch(e,n)}}return null}))}_readDictionaryBatch(t){var e;return Gr(this,void 0,void 0,(function*(){const n=null===(e=this._footer)||void 0===e?void 0:e.getDictionaryBatch(t);if(n&&(yield this._handle.seek(n.offset))){const t=yield this._reader.readMessage(kr.DictionaryBatch);if(null==t?void 0:t.isDictionaryBatch()){const e=t.header(),n=yield this._reader.readMessageBody(t.bodyLength),r=this._loadDictionaryBatch(e,n);this.dictionaries.set(e.id,r)}}}))}_readFooter(){return Gr(this,void 0,void 0,(function*(){const{_handle:t}=this;t._pending&&(yield t._pending);const e=t.size-qc,n=yield t.readInt32(e),r=yield t.readAt(e-n,n);return pu.decode(r)}))}_readNextMessageAndValidate(t){return Gr(this,void 0,void 0,(function*(){if(this._footer||(yield this.open()),this._footer&&this._recordBatchIndexfl(t))):e.isAsync()?e.readAll().then((t=>new Ga(t))):new Ga(e.readAll())}function hl(t){return hl="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},hl(t)}function dl(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return pl(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?pl(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,i=function(){};return{s:i,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function pl(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=0;--i){var o=this.tryEntries[i],s=o.completion;if("root"===o.tryLoc)return r("end");if(o.tryLoc<=this.prev){var a=n.call(o,"catchLoc"),u=n.call(o,"finallyLoc");if(a&&u){if(this.prev=0;--r){var i=this.tryEntries[r];if(i.tryLoc<=this.prev&&n.call(i,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),O(n),f}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var i=r.arg;O(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:T(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=void 0),f}},t}function vl(t,e,n,r,i,o,s){try{var a=t[o](s),u=a.value}catch(t){return void n(t)}a.done?e(u):Promise.resolve(u).then(r,i)}function bl(t){return function(){var e=this,n=arguments;return new Promise((function(r,i){var o=t.apply(e,n);function s(t){vl(o,r,i,s,a,"next",t)}function a(t){vl(o,r,i,s,a,"throw",t)}s(void 0)}))}}function ml(t,e){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:{};return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),(n=o.call(this,t,0,r)).app=e,n.info=void 0,n.infoLoadingStatus="notLoaded",n.cache={},n.readParquetFun=r.readParquetFun,n}return e=s,n=[{key:"loadInfo",value:function(t){var e=this;return this.info||"notLoaded"!==this.infoLoadingStatus?!t||"loaded"!==this.infoLoadingStatus&&"failed"!==this.infoLoadingStatus||t():bl(yl().mark((function n(){var r;return yl().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.prev=0,n.next=3,Wr(e.url+"info.json");case 3:r=n.sent,e.info=r,e.resolution=r.resolutionGeo,e.infoLoadingStatus="loaded",t&&t(),n.next=13;break;case 10:n.prev=10,n.t0=n.catch(0),e.infoLoadingStatus="failed";case 13:case"end":return n.stop()}}),n,null,[[0,10]])})))(),this}},{key:"getTilingEnvelope",value:function(t){if(this.info){var e=this.info.originPoint,n=this.info.resolutionGeo,r=this.info.tileSizeCell;return{xMin:Math.floor((t.xMin-e.x)/(n*r)),xMax:Math.floor((t.xMax-e.x)/(n*r)),yMin:Math.floor((t.yMin-e.y)/(n*r)),yMax:Math.floor((t.yMax-e.y)/(n*r))}}this.loadInfo((function(){}))}},{key:"getData",value:function(t,e){var n=this;if(!this.info)return this;var r=this.getTilingEnvelope(t);if(!r)return this;for(var i=this.info.tilingBounds,o=this.info.format,s=function(t){for(var s=function(r){if(n.cache[t]||(n.cache[t]={}),n.cache[t][r])return"continue";n.cache[t][r]="loading",bl(yl().mark((function i(){var s,a,u,c,l,f,h,d,p,y,v,b,m,g,w,_,x,S,O,I,T;return yl().wrap((function(i){for(;;)switch(i.prev=i.next){case 0:if(i.prev=0,o&&"CSV"!==o){i.next=33;break}return i.next=4,cr(n.url+t+"/"+r+".csv");case 4:if(a=i.sent,!n.preprocess){i.next=29;break}s=[],u=dl(a),i.prev=9,u.s();case 11:if((c=u.n()).done){i.next=19;break}if(l=c.value,0!=n.preprocess(l)){i.next=16;break}return i.abrupt("continue",17);case 16:s.push(l);case 17:i.next=11;break;case 19:i.next=24;break;case 21:i.prev=21,i.t0=i.catch(9),u.e(i.t0);case 24:return i.prev=24,u.f(),i.finish(24);case 27:i.next=30;break;case 29:s=a;case 30:i.next=74;break;case 33:if("PARQUET"!==o){i.next=73;break}if(n.readParquetFun){i.next=36;break}throw new Error("readParquet function needed for parquet dataset");case 36:return i.next=38,fetch(n.url+t+"/"+r+".parquet");case 38:return f=i.sent,i.t1=Uint8Array,i.next=42,f.arrayBuffer();case 42:i.t2=i.sent,h=new i.t1(i.t2),d=n.readParquetFun(h),p=fl(d),s=[],y=dl(p),i.prev=48,y.s();case 50:if((v=y.n()).done){i.next=63;break}if(b=v.value,m=b.toJSON(),!n.preprocess){i.next=60;break}if(0!=n.preprocess(m)){i.next=57;break}return i.abrupt("continue",61);case 57:s.push(m),i.next=61;break;case 60:s.push(m);case 61:i.next=50;break;case 63:i.next=68;break;case 65:i.prev=65,i.t3=i.catch(48),y.e(i.t3);case 68:return i.prev=68,y.f(),i.finish(68);case 71:i.next=74;break;case 73:throw new Error("Tiled format not supported: "+o);case 74:i.next=80;break;case 76:return i.prev=76,i.t4=i.catch(0),n.cache[t][r]="failed",i.abrupt("return");case 80:if(n.info){i.next=83;break}return console.error("Tile info inknown"),i.abrupt("return");case 83:if(g=new zr(s,t,r,n.info),n.cache[t][r]=g,e){i.next=88;break}return i.abrupt("return");case 88:w=!1,_=n.app.getZoomFactor(),x=dl(n.app.layers),i.prev=91,x.s();case 93:if((S=x.n()).done){i.next=103;break}if((O=S.value).visible){i.next=97;break}return i.abrupt("continue",101);case 97:if(O.getDatasetComponent(_)==n){i.next=99;break}return i.abrupt("continue",101);case 99:return w=!0,i.abrupt("break",103);case 101:i.next=93;break;case 103:i.next=108;break;case 105:i.prev=105,i.t5=i.catch(91),x.e(i.t5);case 108:return i.prev=108,x.f(),i.finish(108);case 111:if(w){i.next=114;break}return i.abrupt("return");case 114:if(I=n.app.updateExtentGeo(),T=g.extGeo,!(I.xMax<=T.xMin)){i.next=118;break}return i.abrupt("return");case 118:if(!(I.xMin>=T.xMax)){i.next=120;break}return i.abrupt("return");case 120:if(!(I.yMax<=T.yMin)){i.next=122;break}return i.abrupt("return");case 122:if(!(I.yMin>=T.yMax)){i.next=124;break}return i.abrupt("return");case 124:e();case 127:case"end":return i.stop()}}),i,null,[[0,76],[9,21,24,27],[48,65,68,71],[91,105,108,111]])})))()},a=Math.max(r.yMin,i.yMin);a<=Math.min(r.yMax,i.yMax);a++)s(a)},a=Math.max(r.xMin,i.xMin);a<=Math.min(r.xMax,i.xMax);a++)s(a);return this}},{key:"updateViewCache",value:function(t){if(this.cellsViewCache=[],this.info){var e=this.getTilingEnvelope(t);if(e)for(var n=this.info.tilingBounds,r=Math.max(e.xMin,n.xMin);r<=Math.min(e.xMax,n.xMax);r++)if(this.cache[r])for(var i=Math.max(e.yMin,n.yMin);i<=Math.min(e.yMax,n.yMax);i++){var o=this.cache[r][i];if(o&&"string"!=typeof o){var s,a=dl(o.cells);try{for(a.s();!(s=a.n()).done;){var u=s.value;+u.x+this.resolutiont.xMax||+u.y+this.resolutiont.yMax||this.cellsViewCache.push(u)}}catch(t){a.e(t)}finally{a.f()}}}}}}],n&&ml(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),s}(dr);function xl(t){return xl="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},xl(t)}function Sl(t,e){for(var n=0;n=this.maxZoom)throw new Error("Unexpected zoom limits for layer. Zoom min should be smaller than zoom max.");if(this.cache={},this.url=e.url,this.urlFun=e.urlFun||function(t,e,r){return n.url+r+"/"+t+"/"+e+".png"},this.resolutions=e.resolutions,!this.resolutions||0==this.resolutions.length)throw new Error("No resolutions provided for background layer");this.nbPix=e.nbPix||256,this.origin=e.origin||[0,0],this.z0=e.z0||0,this.filterColor=e.filterColor}var e,n;return e=t,n=[{key:"get",value:function(t,e,n){var r=this.cache[t];if(r&&(r=r[e]))return r[n]}},{key:"put",value:function(t,e,n,r){this.cache[e]||(this.cache[e]={}),this.cache[e][n]||(this.cache[e][n]={}),this.cache[e][n][r]=t}},{key:"draw",value:function(t){var e=this;if(this.resolutions&&0!=this.resolutions.length){var n=t.getZf(),r=this.origin[0],i=this.origin[1],o=0;for(o=0;o=this.maxZoom)throw new Error("Unexpected zoom limits for layer. Zoom min should be smaller than zoom max.");this.url=e.url,this.filterColor=e.filterColor,this.img=void 0,this.xMin=void 0,this.xMax=void 0,this.yMin=void 0,this.yMax=void 0}var e,n;return e=t,(n=[{key:"hasMoved",value:function(t){return t.xMin!=this.xMin||t.xMax!=this.xMax||t.yMin!=this.yMin||t.yMax!=this.yMax}},{key:"draw",value:function(t){if(t.updateExtentGeo(0),!this.hasMoved(t.extGeo)&&this.img)t.ctx.drawImage(this.img,0,0,t.w,t.h);else{this.xMin=t.extGeo.xMin,this.xMax=t.extGeo.xMax,this.yMin=t.extGeo.yMin,this.yMax=t.extGeo.yMax;var e=[];e.push(this.url),e.push("&width="),e.push(t.w),e.push("&height="),e.push(t.h),e.push("&bbox="),e.push(t.extGeo.xMin),e.push(","),e.push(t.extGeo.yMin),e.push(","),e.push(t.extGeo.xMax),e.push(","),e.push(t.extGeo.yMax);var n=e.join("");this.img||(this.img=new Image,this.img.onload=function(){t.redraw()},this.img.onerror=function(){console.warn("Could not retrieve WMS background image from",n)}),this.img.src=n}var r=t.getZf();if(this.filterColor){var i=this.filterColor(r);i&&"none"!=i&&(t.ctx.fillStyle=i,t.ctx.fillRect(0,0,t.w,t.h))}}}])&&Tl(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();function Ml(t){return Ml="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ml(t)}function Cl(){Cl=function(){return t};var t={},e=Object.prototype,n=e.hasOwnProperty,r=Object.defineProperty||function(t,e,n){t[e]=n.value},i="function"==typeof Symbol?Symbol:{},o=i.iterator||"@@iterator",s=i.asyncIterator||"@@asyncIterator",a=i.toStringTag||"@@toStringTag";function u(t,e,n){return Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{u({},"")}catch(t){u=function(t,e,n){return t[e]=n}}function c(t,e,n,i){var o=e&&e.prototype instanceof h?e:h,s=Object.create(o.prototype),a=new I(i||[]);return r(s,"_invoke",{value:_(t,n,a)}),s}function l(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(t){return{type:"throw",arg:t}}}t.wrap=c;var f={};function h(){}function d(){}function p(){}var y={};u(y,o,(function(){return this}));var v=Object.getPrototypeOf,b=v&&v(v(T([])));b&&b!==e&&n.call(b,o)&&(y=b);var m=p.prototype=h.prototype=Object.create(y);function g(t){["next","throw","return"].forEach((function(e){u(t,e,(function(t){return this._invoke(e,t)}))}))}function w(t,e){function i(r,o,s,a){var u=l(t[r],t,o);if("throw"!==u.type){var c=u.arg,f=c.value;return f&&"object"==Ml(f)&&n.call(f,"__await")?e.resolve(f.__await).then((function(t){i("next",t,s,a)}),(function(t){i("throw",t,s,a)})):e.resolve(f).then((function(t){c.value=t,s(c)}),(function(t){return i("throw",t,s,a)}))}a(u.arg)}var o;r(this,"_invoke",{value:function(t,n){function r(){return new e((function(e,r){i(t,n,e,r)}))}return o=o?o.then(r,r):r()}})}function _(t,e,n){var r="suspendedStart";return function(i,o){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===i)throw o;return{value:void 0,done:!0}}for(n.method=i,n.arg=o;;){var s=n.delegate;if(s){var a=x(s,n);if(a){if(a===f)continue;return a}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var u=l(t,e,n);if("normal"===u.type){if(r=n.done?"completed":"suspendedYield",u.arg===f)continue;return{value:u.arg,done:n.done}}"throw"===u.type&&(r="completed",n.method="throw",n.arg=u.arg)}}}function x(t,e){var n=e.method,r=t.iterator[n];if(void 0===r)return e.delegate=null,"throw"===n&&t.iterator.return&&(e.method="return",e.arg=void 0,x(t,e),"throw"===e.method)||"return"!==n&&(e.method="throw",e.arg=new TypeError("The iterator does not provide a '"+n+"' method")),f;var i=l(r,t.iterator,e.arg);if("throw"===i.type)return e.method="throw",e.arg=i.arg,e.delegate=null,f;var o=i.arg;return o?o.done?(e[t.resultName]=o.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=void 0),e.delegate=null,f):o:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,f)}function S(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function O(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function I(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(S,this),this.reset(!0)}function T(t){if(t){var e=t[o];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var r=-1,i=function e(){for(;++r=0;--i){var o=this.tryEntries[i],s=o.completion;if("root"===o.tryLoc)return r("end");if(o.tryLoc<=this.prev){var a=n.call(o,"catchLoc"),u=n.call(o,"finallyLoc");if(a&&u){if(this.prev=0;--r){var i=this.tryEntries[r];if(i.tryLoc<=this.prev&&n.call(i,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),O(n),f}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var i=r.arg;O(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:T(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=void 0),f}},t}function Pl(t,e,n,r,i,o,s){try{var a=t[o](s),u=a.value}catch(t){return void n(t)}a.done?e(u):Promise.resolve(u).then(r,i)}function El(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return jl(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?jl(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,i=function(){};return{s:i,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function jl(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n0&&(t.ctx.strokeStyle=u,t.ctx.lineWidth=c,t.ctx.strokeText(i.name,s,a))}if(this.color){var l=this.color(i,e);l&&(t.ctx.fillStyle=l,t.ctx.fillText(i.name,s,a))}}}}catch(t){r.e(t)}finally{r.f()}}else this.load(t.redraw)}},{key:"load",value:(r=Cl().mark((function t(e){var n,r,i,o;return Cl().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this.url){t.next=5;break}return console.log("Failed loading labels: No URL specified. "+this.url),this.loadingStatus="failed",this.labels=[],t.abrupt("return");case 5:if("notLoaded"==this.loadingStatus){t.next=7;break}return t.abrupt("return");case 7:return this.loadingStatus="loading",t.prev=8,t.next=11,cr(this.url);case 11:if(n=t.sent,!this.preprocess){t.next=35;break}this.labels=[],r=El(n),t.prev=15,r.s();case 17:if((i=r.n()).done){t.next=25;break}if(o=i.value,0!=this.preprocess(o)){t.next=22;break}return t.abrupt("continue",23);case 22:this.labels.push(o);case 23:t.next=17;break;case 25:t.next=30;break;case 27:t.prev=27,t.t0=t.catch(15),r.e(t.t0);case 30:return t.prev=30,r.f(),t.finish(30);case 33:t.next=36;break;case 35:this.labels=n;case 36:this.loadingStatus="loaded",e&&e(),t.next=45;break;case 40:t.prev=40,t.t1=t.catch(8),console.log("Failed loading labels from "+this.url),this.labels=[],this.loadingStatus="failed";case 45:case"end":return t.stop()}}),t,this,[[8,40],[15,27,30,33]])})),i=function(){var t=this,e=arguments;return new Promise((function(n,i){var o=r.apply(t,e);function s(t){Pl(o,n,i,s,a,"next",t)}function a(t){Pl(o,n,i,s,a,"throw",t)}s(void 0)}))},function(t){return i.apply(this,arguments)})}],n&&kl(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();function Fl(t){return Fl="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Fl(t)}function Ll(){Ll=function(){return t};var t={},e=Object.prototype,n=e.hasOwnProperty,r=Object.defineProperty||function(t,e,n){t[e]=n.value},i="function"==typeof Symbol?Symbol:{},o=i.iterator||"@@iterator",s=i.asyncIterator||"@@asyncIterator",a=i.toStringTag||"@@toStringTag";function u(t,e,n){return Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{u({},"")}catch(t){u=function(t,e,n){return t[e]=n}}function c(t,e,n,i){var o=e&&e.prototype instanceof h?e:h,s=Object.create(o.prototype),a=new I(i||[]);return r(s,"_invoke",{value:_(t,n,a)}),s}function l(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(t){return{type:"throw",arg:t}}}t.wrap=c;var f={};function h(){}function d(){}function p(){}var y={};u(y,o,(function(){return this}));var v=Object.getPrototypeOf,b=v&&v(v(T([])));b&&b!==e&&n.call(b,o)&&(y=b);var m=p.prototype=h.prototype=Object.create(y);function g(t){["next","throw","return"].forEach((function(e){u(t,e,(function(t){return this._invoke(e,t)}))}))}function w(t,e){function i(r,o,s,a){var u=l(t[r],t,o);if("throw"!==u.type){var c=u.arg,f=c.value;return f&&"object"==Fl(f)&&n.call(f,"__await")?e.resolve(f.__await).then((function(t){i("next",t,s,a)}),(function(t){i("throw",t,s,a)})):e.resolve(f).then((function(t){c.value=t,s(c)}),(function(t){return i("throw",t,s,a)}))}a(u.arg)}var o;r(this,"_invoke",{value:function(t,n){function r(){return new e((function(e,r){i(t,n,e,r)}))}return o=o?o.then(r,r):r()}})}function _(t,e,n){var r="suspendedStart";return function(i,o){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===i)throw o;return{value:void 0,done:!0}}for(n.method=i,n.arg=o;;){var s=n.delegate;if(s){var a=x(s,n);if(a){if(a===f)continue;return a}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var u=l(t,e,n);if("normal"===u.type){if(r=n.done?"completed":"suspendedYield",u.arg===f)continue;return{value:u.arg,done:n.done}}"throw"===u.type&&(r="completed",n.method="throw",n.arg=u.arg)}}}function x(t,e){var n=e.method,r=t.iterator[n];if(void 0===r)return e.delegate=null,"throw"===n&&t.iterator.return&&(e.method="return",e.arg=void 0,x(t,e),"throw"===e.method)||"return"!==n&&(e.method="throw",e.arg=new TypeError("The iterator does not provide a '"+n+"' method")),f;var i=l(r,t.iterator,e.arg);if("throw"===i.type)return e.method="throw",e.arg=i.arg,e.delegate=null,f;var o=i.arg;return o?o.done?(e[t.resultName]=o.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=void 0),e.delegate=null,f):o:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,f)}function S(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function O(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function I(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(S,this),this.reset(!0)}function T(t){if(t){var e=t[o];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var r=-1,i=function e(){for(;++r=0;--i){var o=this.tryEntries[i],s=o.completion;if("root"===o.tryLoc)return r("end");if(o.tryLoc<=this.prev){var a=n.call(o,"catchLoc"),u=n.call(o,"finallyLoc");if(a&&u){if(this.prev=0;--r){var i=this.tryEntries[r];if(i.tryLoc<=this.prev&&n.call(i,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),O(n),f}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var i=r.arg;O(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:T(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=void 0),f}},t}function Dl(t,e,n,r,i,o,s){try{var a=t[o](s),u=a.value}catch(t){return void n(t)}a.done?e(u):Promise.resolve(u).then(r,i)}function Nl(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return Rl(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Rl(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,i=function(){};return{s:i,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function Rl(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function $l(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n0&&void 0!==arguments[0])||arguments[0];r.legend&&t&&r.legend.selectAll("*").remove(),r.cg.initCanvasTransform(),r.cg.clear(r.cg.backgroundColor);var n=r.getZoomFactor();r.updateExtentGeo();var o,s=Wl(r.bgLayers);try{for(s.s();!(o=s.n()).done;){var a=o.value;a.visible&&(n>a.maxZoom||nl.maxZoom||np.maxZoom||nb.maxZoom||nS.maxZoom||n0&&void 0!==arguments[0]?arguments[0]:20;return this.cg.updateExtentGeo(t)}},{key:"getCellFocusInfo",value:function(t){for(var e=this.getZoomFactor(),n=this.layers.length-1;n>=0;n--){var r=this.layers[n];if(r.visible&&r.cellInfoHTML&&"none"!==r.cellInfoHTML){var i=r.getDatasetComponent(e);if(i){var o=i.getCellFromPosition(t,i.getViewCache());if(!o)return;var s=r.cellInfoHTML(o,i.getResolution());if(!s)return;return{cell:o,html:s,resolution:i.getResolution()}}}}}},{key:"getGeoCenter",value:function(){return this.cg.getCenter()}},{key:"setGeoCenter",value:function(t){return this.cg.setCenter(t),this}},{key:"getZoomFactor",value:function(){return this.cg.getZf()}},{key:"setZoomFactor",value:function(t){return this.cg.setZf(t),this}},{key:"getZoomFactorExtent",value:function(){return this.cg.getZfExtent()}},{key:"setZoomFactorExtent",value:function(t){return this.cg.setZfExtent(t),this}},{key:"getBackgroundColor",value:function(){return this.cg.backgroundColor}},{key:"setBackgroundColor",value:function(t){return this.cg.backgroundColor=t,this}},{key:"getBoundaryLayer",value:function(){return this.boundaryLayer}},{key:"setBoundaryLayer",value:function(t){return this.boundaryLayer=new Ul(t),this}},{key:"getLabelLayer",value:function(){return this.labelLayer}},{key:"setLabelLayer",value:function(t){return this.labelLayer=new Bl(t),this}},{key:"redraw",value:function(){return this.cg.redraw(),this}},{key:"addLayerFromDataset",value:function(t,e,n){var r=new Vn(t,e,n);return this.layers.push(r),this}},{key:"makeCSVGridDataset",value:function(t,e,n){var r=this;return new Zn([new xr(t,e,n).getData(void 0,(function(){r.cg.redraw()}))],[],n)}},{key:"makeTiledGridDataset",value:function(t,e){var n=this;return new Zn([new _l(t,this,e).loadInfo((function(){n.cg.redraw()}))],[],e)}},{key:"makeMultiScaleCSVGridDataset",value:function(t,e,n){var r=this;return Zn.make(t,(function(t){return new xr(e(t),t,n).getData(void 0,(function(){r.cg.redraw()}))}),n)}},{key:"makeMultiScaleTiledGridDataset",value:function(t,e,n){var r=this;return Zn.make(t,(function(t){return new _l(e(t),r,n).loadInfo((function(){r.cg.redraw()}))}),n)}},{key:"addCSVGridLayer",value:function(t,e,n,r){var i=this.makeCSVGridDataset(t,e,r);return this.addLayerFromDataset(i,n,r)}},{key:"addTiledGridLayer",value:function(t,e,n){var r=this.makeTiledGridDataset(t,n);return this.addLayerFromDataset(r,e,n)}},{key:"addMultiScaleCSVGridLayer",value:function(t,e,n,r){var i=this.makeMultiScaleCSVGridDataset(t,e,r);return this.addLayerFromDataset(i,n,r)}},{key:"addMultiScaleTiledGridLayer",value:function(t,e,n,r){var i=this.makeMultiScaleTiledGridDataset(t,e,r);return this.addLayerFromDataset(i,n,r)}},{key:"addBackgroundLayer",value:function(t){return this.bgLayers.push(new Ol(t)),this.redraw(),this}},{key:"addBackgroundLayerWMS",value:function(t){return this.bgLayers.push(new Al(t)),this.redraw(),this}},{key:"addZoomSlider",value:function(t,e){return this.cg.addZoomSlider(t,e),this}},{key:"setViewFromURL",value:function(){return this.cg.setViewFromURL(),this}},{key:"defineResizeObserver",value:function(t,e){var n=this;new ResizeObserver((function(r){t.clientWidth>0&&t.clientHeight>0&&window.requestAnimationFrame((function(){Array.isArray(r)&&r.length&&(n.h===t.clientHeight&&n.w===t.clientWidth||(n.h=t.clientHeight,n.w=t.clientWidth,n.cg.h=t.clientHeight,n.cg.w=t.clientWidth,e.setAttribute("width",""+n.w),e.setAttribute("height",""+n.h),n.redraw()))}))})).observe(t)}}],n&&Gl(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();function Zl(t){return Zl="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Zl(t)}function Hl(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return ql(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?ql(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,i=function(){};return{s:i,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function ql(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=this.maxZoom)throw new Error("Unexpected zoom limits for layer. Zoom min should be smaller than zoom max.");this.legends=[]}var e,n,r;return e=t,r=[{key:"getStatistics",value:function(t,e,n){if(t&&0!=t.length){var r,i=1/0,o=-1/0,s=Hl(t);try{for(s.s();!(r=s.n()).done;){var a=+e(r.value);n&&!a||(ao&&(o=a))}}catch(t){s.e(t)}finally{s.f()}return{min:i,max:o}}}}],(n=[{key:"draw",value:function(t,e,n){throw new Error("Method draw not implemented.")}},{key:"getOffset",value:function(){return this.offset}},{key:"setOffset",value:function(t){return this.offset=t,this}},{key:"updateLegends",value:function(t){var e,n=Hl(this.legends);try{for(n.s();!(e=n.n()).done;)e.value.update(t)}catch(t){n.e(t)}finally{n.f()}return this}}])&&Xl(e.prototype,n),r&&Xl(e,r),Object.defineProperty(e,"prototype",{writable:!1}),t}();function Jl(t){return Jl="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Jl(t)}function Ql(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(t);try{for(c.s();!(a=c.n()).done;){var l=a.value,f=this.color?this.color(l[this.colorCol],e,o,s):void 0;if(f&&"none"!==f){n.ctx.fillStyle=f;var h=this.shape?this.shape(l):"square";if("none"!==h){var d=(this.size||function(){return e})(l[this.sizeCol],e,i,s),p=this.offset(l,e,s);if("square"===h){var y=e*(1-d/e)*.5;n.ctx.fillRect(l.x+y+p.dx,l.y+y+p.dy,d,d)}else if("circle"===h)n.ctx.beginPath(),n.ctx.arc(l.x+u+p.dx,l.y+u+p.dy,.5*d,0,2*Math.PI,!1),n.ctx.fill();else if("donut"===h){var v=l.x+u+p.dx,b=l.y+u+p.dy;n.ctx.beginPath(),n.ctx.moveTo(v,b),n.ctx.arc(v,b,u,0,2*Math.PI),n.ctx.arc(v,b,(1-d/e)*u,0,2*Math.PI,!0),n.ctx.closePath(),n.ctx.fill()}else{if("diamond"!==h)throw new Error("Unexpected shape:"+h);var m=.5*d;n.ctx.beginPath(),n.ctx.moveTo(l.x+u-m,l.y+u),n.ctx.lineTo(l.x+u,l.y+u+m),n.ctx.lineTo(l.x+u+m,l.y+u),n.ctx.lineTo(l.x+u,l.y+u-m),n.ctx.fill()}}}}}catch(t){c.e(t)}finally{c.f()}this.updateLegends({style:this,r:e,zf:s,sSize:i,sColor:o})}}])&&tf(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),s}(Kl);function of(t){return of="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},of(t)}function sf(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(t);try{for(l.s();!(u=l.n()).done;){var f=u.value,h=this.strokeColor?this.strokeColor(f[this.strokeColorCol],e,i):void 0;if(h&&"none"!==h){n.ctx.strokeStyle=h;var d=(this.size||function(){return e})(f[this.sizeCol],e,o,a),p=this.strokeWidth?this.strokeWidth(f[this.strokeWidthCol],e,s,a):1*a;if(p&&!(p<=0)){n.ctx.lineWidth=p;var y=this.shape?this.shape(f):"square";if("none"!==y){var v=this.offset(f,e,a);if("square"===y){var b=e*(1-d/e)*.5;n.ctx.beginPath(),n.ctx.rect(f.x+b+v.dx,f.y+b+v.dy,d,d),n.ctx.stroke()}else if("circle"===y)n.ctx.beginPath(),n.ctx.arc(f.x+c+v.dx,f.y+c+v.dy,.5*d,0,2*Math.PI,!1),n.ctx.stroke();else if("diamond"===y){var m=.5*d;n.ctx.beginPath(),n.ctx.moveTo(f.x+c-m,f.y+c),n.ctx.lineTo(f.x+c,f.y+c+m),n.ctx.lineTo(f.x+c+m,f.y+c),n.ctx.lineTo(f.x+c,f.y+c-m),n.ctx.lineTo(f.x+c-m,f.y+c),n.ctx.stroke()}else{if("donut"!==y)throw new Error("Unexpected shape:"+y);console.error("Not implemented")}}}}}}catch(t){l.e(t)}finally{l.f()}}}])&&af(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),s}(Kl);function ff(t){return ff="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},ff(t)}function hf(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(t);try{for(u.s();!(i=u.n()).done;){var c=i.value,l=a[c.y];l||(l={},a[c.y]=l),l[c.x]=this.height(c[this.heightCol],e,s,o)}}catch(t){u.e(t)}finally{u.f()}var f=n.extGeo;if(f){var h=Math.floor(f.xMin/e)*e,d=Math.floor(f.xMax/e)*e,p=Math.floor(f.yMin/e)*e,y=Math.floor(f.yMax/e)*e,v={min:p,max:y};n.setCanvasTransform();for(var b=y;b>=p;b-=e){var m=a[b];if(m){n.ctx.beginPath(),n.ctx.moveTo(h-e/2,b);for(var g=void 0,w=h;w<=d;w+=e){var _=m[w];_||(_=0),_||g?n.ctx.lineTo(w+e/2,b+_):n.ctx.moveTo(w+e/2,b),g=_}g&&n.ctx.lineTo(d+e/2,b);var x=this.fillColor(b,v,e,o);x&&"none"!=x&&(n.ctx.fillStyle=x,n.ctx.fill());var S=this.lineColor(b,v,e,o),O=this.lineWidth(b,v,e,o);S&&"none"!=S&&O>0&&(n.ctx.strokeStyle=S,n.ctx.lineWidth=O,n.ctx.stroke())}}}}}])&&df(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),s}(Kl);function bf(t){return bf="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},bf(t)}function mf(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var r,i,o,s,a=[],u=!0,c=!1;try{if(o=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=o.call(n)).done)&&(a.push(r.value),a.length!==e);u=!0);}catch(t){c=!0,i=t}finally{try{if(!u&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(c)throw i}}return a}}(t,e)||gf(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function gf(t,e){if(t){if("string"==typeof t)return wf(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?wf(t,e):void 0}}function wf(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(t);try{for(u.s();!(a=u.n()).done;){var c=a.value,l=(this.size||function(){return e})(c[this.sizeCol],e,i,o),f=this.offset(c,e,o),h=this.type?this.type(c):"flag",d=c.x+f.dx+("agepyramid"===h?0:.5*e),p=c.y+f.dy+("agepyramid"===h?0:.5*e),y=this.offsetAngle?this.offsetAngle(c,e,o)*Math.PI/180:0;if("agepyramid"===h||"radar"===h||"halftone"===h){for(var v=-1/0,b=0,m=Object.keys(this.color);bv&&(v=g)}var w=0;"agepyramid"===h&&this.agePyramidHeight&&(w=(e-this.agePyramidHeight(c,e,o))/2),"radar"!==h&&"halftone"!==h||(w=Math.PI/2+y);var _="agepyramid"===h?(this.agePyramidHeight?this.agePyramidHeight(c,e,o):e)/s:"radar"===h||"halftone"===h?2*Math.PI/s:void 0;if(void 0===_)throw new Error("Unexpected symbol type:"+h);for(var x=0,S=Object.entries(this.color);xt.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(t);try{for(l.s();!(c=l.n()).done;){var f=c.value,h=this.color?this.color(f[this.colorCol],e,i):void 0;if(h){var d=this.width?this.width(f[this.widthCol],e,s,a):void 0;if(d&&!(d<0)){var p=this.length?this.length(f[this.lengthCol],e,o,a):void 0;if(p&&!(p<0)){var y=this.orientation(f)*u;if(void 0!==y&&!isNaN(y)){var v=this.offset(f,e,a);n.ctx.strokeStyle=h,n.ctx.lineWidth=d;var b=f.x+e/2+v.dx,m=f.y+e/2+v.dy,g=.5*Math.cos(y)*p,w=.5*Math.sin(y)*p;n.ctx.beginPath(),n.ctx.moveTo(b-g,m-w),n.ctx.lineTo(b+g,m+w),n.ctx.stroke()}}}}}}catch(t){l.e(t)}finally{l.f()}this.updateLegends({style:this,r:e,zf:a,sColor:i,sLength:o,sWidth:s})}}])&&Af(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),s}(Kl);function Ef(t){return Ef="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ef(t)}function jf(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(t);try{for(c.s();!(u=c.n()).done;){var l=u.value,f=this.text?this.text(l[this.textCol],e,i):void 0;if(null!=f&&null!=f&&f+""!=""){var h=this.color?this.color(l[this.colorCol],e,o):void 0;if(h){n.ctx.fillStyle=h;var d=this.fontSize(l[this.fontSizeCol],e,s,a)/a,p=this.fontFamily||"Arial",y=this.fontWeight||"bold";n.ctx.font=y+" "+d+"px "+p;var v=this.offset(l,e,a);n.ctx.textAlign="center";var b=n.geoToPixX(l.x+.5*e+v.dx),m=n.geoToPixY(l.y+.5*e+v.dy)+.3*d;n.ctx.fillText(f,b,m)}}}}catch(t){c.e(t)}finally{c.f()}this.updateLegends({style:this,r:e,zf:a,sColor:o})}}])&&kf(e.prototype,n),r&&kf(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}(Kl);function Df(t,e){return null==t?e:"function"==typeof t?t:e=>e[t]}function Nf(t,e=!1){const n=new Float64Array(5),r=new Float64Array(4);!function(t,e,n){const r=Float64Array.of(.84,1.8675,.84,-1.8675,-.34015,-.1299,-.34015,.1299),i=Math.exp(-1.783/n),o=Math.exp(-1.723/n),s=.6318/n,a=1.997/n,u=Float64Array.of(-i*Math.cos(s),i*Math.sin(s),-i*Math.cos(-s),i*Math.sin(-s),-o*Math.cos(a),o*Math.sin(a),-o*Math.cos(-a),o*Math.sin(-a)),c=2.5066282746310007*n,l=Float64Array.of(r[0],r[1],0,0,0,0,0,0),f=Float64Array.of(1,0,u[0],u[1],0,0,0,0,0,0);let h,d;for(d=2;d<8;d+=2){for(l[d]=u[d]*l[d-2]-u[d+1]*l[d-1],l[d+1]=u[d]*l[d-1]+u[d+1]*l[d-2],h=d-2;h>0;h-=2)l[h]+=u[d]*l[h-2]-u[d+1]*l[h-1],l[h+1]+=u[d]*l[h-1]+u[d+1]*l[h-2];for(h=0;h<=d;h+=2)l[h]+=r[d]*f[h]-r[d+1]*f[h+1],l[h+1]+=r[d]*f[h+1]+r[d+1]*f[h];for(f[d+2]=u[d]*f[d]-u[d+1]*f[d+1],f[d+3]=u[d]*f[d+1]+u[d+1]*f[d],h=d;h>0;h-=2)f[h]+=u[d]*f[h-2]-u[d+1]*f[h-1],f[h+1]+=u[d]*f[h-1]+u[d+1]*f[h-2]}for(d=0;d<4;++d)h=d<<1,e[d]=l[h]/c,t[d+1]=f[h+2]}(n,r,t);const i=Float64Array.of(0,r[1]-n[1]*r[0],r[2]-n[2]*r[0],r[3]-n[3]*r[0],-n[4]*r[0]),o=1+n[1]+n[2]+n[3]+n[4];return{sigma:t,negative:e,a:n,b_causal:r,b_anticausal:i,sum_causal:(r[0]+r[1]+r[2]+r[3])/o,sum_anticausal:(i[1]+i[2]+i[3]+i[4])/o}}function Rf(t,e,n,r=1,i=new Float64Array(n),o=new Float64Array(n),s=new Float64Array(5),a=i,u=zf){const c=2*r,l=3*r,f=4*r,h=r*n;let d,p;for(u(i,e,n,r,t.b_causal,3,t.a,4,t.sum_causal,s,t.sigma),p=4,d=f;p=0&&h0)for(p=0;p=r&&(i=o=r):(ro&&(o=r)))}return[i-n,o+n]}function Vf(t,e){const n=t.length;for(let r=0;re&&(e=t[r]);return e}function Wf(t,e){const n=t.length;for(let r=0;rnull!=t&&t>=t));n.sort(((t,e)=>t-e));const r=function(t){const e=t.length;let n,r=0,i=0,o=0;for(let s=0;s1?Math.sqrt(o/(r-1)):NaN}(n),i=Gf(n,.25),o=Gf(n,.75),s=n.length,a=(o-i)/1.34;return 1.06*(Math.min(r,a)||r||Math.abs(i)||1)*Math.pow(s,-.2)}function Gf(t,e){const n=t.length;if(!n)return NaN;if((e=+e)<=0||n<2)return t[0];if(e>=1)return t[n-1];const r=(n-1)*e,i=Math.floor(r),o=t[i];return o+(t[i+1]-o)*(r-i)}function Yf(t,e={}){const{adjust:n=1,pad:r=3,bins:i=[256,256]}=e,o=Df(e.x,(t=>t[0])),s=Df(e.y,(t=>t[1])),a=Df(e.weight,(()=>1/t.length));let[u=n*$f(t,o),c=n*$f(t,s)]=Zf(e.bandwidth);const[[l,f]=Uf(t,o,r*u),[h,d]=Uf(t,s,r*c)]=null==(p=e.extent)?[void 0,void 0]:"number"==typeof p[0]?[p,p]:p;var p;const[y,v]=Zf(i),b=function(t,e,n,r,i,o,s,a,u,c){const l=new Float64Array(s*c),f=(s-1)/(o-i),h=(c-1)/(u-a);for(let o=0;ot<0));let _,x=Nf(u/m,w),S=Nf(c/g,w);function*O(t="x",e="y",n="z"){const r=I.grid(),i=1/(m*g);for(let o=0,s=0;s_||(_=function(t,e,n,[r,i]){const o=new Float64Array(Math.max(r,i)),s=new Float64Array(Math.max(r,i)),a=new Float64Array(5),u=new Float64Array(n.length);for(let e=0,c=0;e[[l,f],[h,d]],heatmap:({color:t,clamp:e,canvas:n,maxColors:r}={})=>function(t,e,n,r=(t=>({r:0,g:0,b:0,opacity:t})),[i,o]=[Wf(t,0),Vf(t,0)],s=function(t,e){if("undefined"!=typeof document){const n=document.createElement("canvas");return n.setAttribute("width",t),n.setAttribute("height",e),n}throw"Can not create a canvas instance, provide a canvas as a parameter."}(e,n),a=256){const u=1/(o-i),c=s.getContext("2d"),l=c.getImageData(0,0,e,n),f=l.data,h=a-1,d=function(t,e){const n=new Uint8ClampedArray(4*(t+1));for(let r=0;r<=t;++r){const i=e(r/t),{r:o,g:s,b:a,opacity:u=1}="string"==typeof i?Fe(i):i,c=r<<2;n[c+0]=o,n[c+1]=s,n[c+2]=a,n[c+3]=255*u|0}return n}(h,r);for(let r=0,o=0;rt.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(this.styles);try{for(v.s();!(y=v.n()).done;)y.value.draw(t,c,n)}catch(t){v.e(t)}finally{v.f()}}}}])&&Xf(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),s}(Kl);function th(t){return th="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},th(t)}function eh(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return nh(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?nh(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,i=function(){};return{s:i,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function nh(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function ch(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);ni&&(i=s))}}catch(t){o.e(t)}finally{o.f()}return{min:r,max:i}}}}],n&&lh(e.prototype,n),r&&lh(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}(Kl);function ph(t){return ph="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},ph(t)}function yh(t,e){return yh=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},yh(t,e)}function vh(t){return vh=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},vh(t)}var bh=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&yh(t,e)}(o,t);var e,n,r,i=(n=o,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=vh(n);if(r){var i=vh(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return function(t,e){if(e&&("object"===ph(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(this,t)});function o(t){var e;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,o),e=i.call(this,t),(t=t||{}).breaks=t.breaks||[100,1e3,1e4,1e5,1e6],t.width=t.width||function(){return 1},t.color=t.color||function(){return"#E7A935"};var n=function(e){if(null==e)return 0;for(var n=0;nt.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(t);try{for(p.s();!(d=p.n()).done;){var y=d.value,v=this.fillColor(y);v&&"none"!=v&&(n.ctx.fillStyle=v,n.ctx.fillRect(y.x,y.y,e,e))}}catch(t){p.e(t)}finally{p.f()}}n.ctx.lineCap="butt";for(var b=0,m=i;b1);return t+n*o*Math.sqrt(-2*Math.log(i)/i)}}return n.source=t,n}(Math.random);function Ih(t,e,n){var r=document.createElement("canvas");r.setAttribute("width",t),r.setAttribute("height",e);var i=r.getContext("webgl",n);if(!i)throw new Error("Unable to initialize WebGL. Your browser or machine may not support it.");return{canvas:r,gl:i}}function Th(t){var e=t.createProgram();if(null==e)throw new Error("Cannot create webGL program");for(var n=arguments.length,r=new Array(n>1?n-1:0),i=1;i2?r-2:0),o=2;o=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function kh(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n3&&void 0!==arguments[3]?arguments[3]:10,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.gl=e;var s=Ah(e,e.VERTEX_SHADER,"\n attribute vec2 pos;\n uniform float sizePix;\n uniform mat3 mat;\n\n attribute float t;\n varying float vt;\n\n void main() {\n gl_Position = vec4(mat * vec3(pos, 1.0), 1.0);\n gl_PointSize = sizePix;\n vt = t;\n }\n "),a="precision mediump float;\nvarying float vt;\nuniform float alpha;\n"+function(){for(var t=[],e=0;et.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(t);try{for(f.s();!(a=f.n()).done;){var h=a.value,d=this.tFun(h[this.colorCol],e,o);null!=d&&null!=d&&(c.push(h.x+u,h.y+u),l.push(d>1?1:d<0?0:d))}}catch(t){f.e(t)}finally{f.f()}var p=this.size?this.size(e,i):e+.2*i,y=this.opacity?this.opacity(e,i):void 0;new zh(s.gl,this.colors,this.stretching,p/i,y).draw(c,l,n.getWebGLTransform()),n.initCanvasTransform(),n.ctx.drawImage(s.canvas,0,0),this.updateLegends({style:this,r:e,zf:i,sColor:o})}else console.error("No webGL")}}}])&&Wh(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),s}(Kl);function Zh(t){return Zh="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Zh(t)}function Hh(t,e){for(var n=0;n0&&"h"===t.or||t.value<0&&"v"===t.or?"rgba(255,255,100,"+o+")":"rgba(0,0,0,"+o+")"}:function(t,n,r,i){if(0!==t.value)return"v"===t.or?t.value<0?e.colBright:e.colDark:t.value<0?e.colDark:e.colBright},width:e.newShading?function(t,n,r,i){return e.newShadingWidthPix*i}:function(t,n,r,i){return e.widthFactor*n*Math.abs(t.value)*("v"===t.or?.5:1)},filter:e.filter});return[o,s]}}],null&&Hh(e.prototype,null),n&&Hh(e,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();function Xh(t){return Xh="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Xh(t)}function Kh(t,e){for(var n=0;n0&&n.push(","),n.push(" c"+r);n.push(";\n"),n.push("void main(void) {\n");for(var i=0;i0&&n.push("else "),n.push("if(vi=="),n.push(i),n.push(".0) gl_FragColor = vec4(c"),n.push(i),n.push("[0], c"),n.push(i),n.push("[1], c"),n.push(i),n.push("[2], c"),n.push(i),n.push("[3]);\n");n.push("else gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\n}"),this.fshString=n.join("")}var e,n;return e=t,n=[{key:"draw",value:function(t,e,n,r){var i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:10,o=Th(t,Ah(t,t.VERTEX_SHADER,this.vshString),Ah(t,t.FRAGMENT_SHADER,this.fshString));t.useProgram(o),t.uniform1f(t.getUniformLocation(o,"sizePix"),1*i);for(var s=0;s=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function sd(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);nt.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(t);try{for(c.s();!(u=c.n()).done;){var l=u.value,f=this.color?this.color(l[this.colorCol],e,i):void 0;if(f&&"none"!==f){n.ctx.fillStyle=f;var h=this.offset(l,e,o),d=a(),p=a(),y=a(),v=a();this.shadowFactor>0&&(n.ctx.beginPath(),n.ctx.moveTo(l.x+h.dx+d.x,l.y+h.dy+d.y),n.ctx.lineTo(l.x+h.dx+e-y.x,l.y+h.dy+y.y),n.ctx.lineTo(l.x+h.dx+e-v.x,l.y+h.dy+e-v.y),n.ctx.stroke()),n.ctx.beginPath(),n.ctx.moveTo(l.x+h.dx+d.x,l.y+h.dy+d.y),n.ctx.lineTo(l.x+h.dx+e-y.x,l.y+h.dy+y.y),n.ctx.lineTo(l.x+h.dx+e-v.x,l.y+h.dy+e-v.y),n.ctx.lineTo(l.x+h.dx+p.x,l.y+h.dy+e-p.y),n.ctx.fill()}}}catch(t){c.e(t)}finally{c.f()}this.updateLegends({style:this,r:e,zf:o,sColor:i})}}])&&vd(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),s}(Kl);function wd(t){return wd="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},wd(t)}function _d(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(t);try{for(c.s();!(a=c.n()).done;){var l=a.value,f=this.color?this.color(l[this.colorCol],e,o,s):void 0;if(f&&"none"!==f){n.ctx.fillStyle=f;var h=this.shape?this.shape(l):"o";if("none"!==h){var d=(this.size||function(){return.5})(l[this.sizeCol],e,i,s)*u,p=(this.offset(l,e,s),l.x+u),y=l.y+u;if("p"===h)n.ctx.beginPath(),n.ctx.moveTo(p,y+u),n.ctx.lineTo(p+d,y+d),n.ctx.lineTo(p+u,y),n.ctx.lineTo(p+d,y-d),n.ctx.lineTo(p,y-u),n.ctx.lineTo(p-d,y-d),n.ctx.lineTo(p-u,y),n.ctx.lineTo(p-d,y+d),n.ctx.fill();else{if("o"!==h)throw new Error("Unexpected shape:"+h);n.ctx.beginPath(),n.ctx.moveTo(p,y+d),n.ctx.lineTo(p+u,y+u),n.ctx.lineTo(p+d,y),n.ctx.lineTo(p+u,y-u),n.ctx.lineTo(p,y-d),n.ctx.lineTo(p-u,y-u),n.ctx.lineTo(p-d,y),n.ctx.lineTo(p-u,y+u),n.ctx.fill()}}}}}catch(t){c.e(t)}finally{c.f()}this.updateLegends({style:this,r:e,zf:s,sSize:i,sColor:o})}}])&&xd(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),s}(Kl);function Td(t){return Td="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Td(t)}function Ad(t,e){for(var n=0;n1?r[0]+r.slice(2):r,+t.slice(n+1)]}var Pd,Ed=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function jd(t){if(!(e=Ed.exec(t)))throw new Error("invalid format: "+t);var e;return new kd({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function kd(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function Bd(t,e){var n=Cd(t,e);if(!n)return t+"";var r=n[0],i=n[1];return i<0?"0."+new Array(-i).join("0")+r:r.length>i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")}jd.prototype=kd.prototype,kd.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};const Fd={"%":(t,e)=>(100*t).toFixed(e),b:t=>Math.round(t).toString(2),c:t=>t+"",d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)},e:(t,e)=>t.toExponential(e),f:(t,e)=>t.toFixed(e),g:(t,e)=>t.toPrecision(e),o:t=>Math.round(t).toString(8),p:(t,e)=>Bd(100*t,e),r:Bd,s:function(t,e){var n=Cd(t,e);if(!n)return t+"";var r=n[0],i=n[1],o=i-(Pd=3*Math.max(-8,Math.min(8,Math.floor(i/3))))+1,s=r.length;return o===s?r:o>s?r+new Array(o-s+1).join("0"):o>0?r.slice(0,o)+"."+r.slice(o):"0."+new Array(1-o).join("0")+Cd(t,Math.max(0,e+o-1))[0]},X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)};function Ld(t){return t}var Dd,Nd,Rd=Array.prototype.map,zd=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function Ud(t){return Dd=function(t){var e,n,r=void 0===t.grouping||void 0===t.thousands?Ld:(e=Rd.call(t.grouping,Number),n=t.thousands+"",function(t,r){for(var i=t.length,o=[],s=0,a=e[0],u=0;i>0&&a>0&&(u+a+1>r&&(a=Math.max(1,r-u)),o.push(t.substring(i-=a,i+a)),!((u+=a+1)>r));)a=e[s=(s+1)%e.length];return o.reverse().join(n)}),i=void 0===t.currency?"":t.currency[0]+"",o=void 0===t.currency?"":t.currency[1]+"",s=void 0===t.decimal?".":t.decimal+"",a=void 0===t.numerals?Ld:function(t){return function(e){return e.replace(/[0-9]/g,(function(e){return t[+e]}))}}(Rd.call(t.numerals,String)),u=void 0===t.percent?"%":t.percent+"",c=void 0===t.minus?"−":t.minus+"",l=void 0===t.nan?"NaN":t.nan+"";function f(t){var e=(t=jd(t)).fill,n=t.align,f=t.sign,h=t.symbol,d=t.zero,p=t.width,y=t.comma,v=t.precision,b=t.trim,m=t.type;"n"===m?(y=!0,m="g"):Fd[m]||(void 0===v&&(v=12),b=!0,m="g"),(d||"0"===e&&"="===n)&&(d=!0,e="0",n="=");var g="$"===h?i:"#"===h&&/[boxX]/.test(m)?"0"+m.toLowerCase():"",w="$"===h?o:/[%p]/.test(m)?u:"",_=Fd[m],x=/[defgprs%]/.test(m);function S(t){var i,o,u,h=g,S=w;if("c"===m)S=_(t)+S,t="";else{var O=(t=+t)<0||1/t<0;if(t=isNaN(t)?l:_(Math.abs(t),v),b&&(t=function(t){t:for(var e,n=t.length,r=1,i=-1;r0&&(i=0)}return i>0?t.slice(0,i)+t.slice(e+1):t}(t)),O&&0==+t&&"+"!==f&&(O=!1),h=(O?"("===f?f:c:"-"===f||"("===f?"":f)+h,S=("s"===m?zd[8+Pd/3]:"")+S+(O&&"("===f?")":""),x)for(i=-1,o=t.length;++i(u=t.charCodeAt(i))||u>57){S=(46===u?s+t.slice(i+1):t.slice(i))+S,t=t.slice(0,i);break}}y&&!d&&(t=r(t,1/0));var I=h.length+t.length+S.length,T=I>1)+h+t+S+T.slice(I);break;default:t=T+h+t+S}return a(t)}return v=void 0===v?6:/[gprs]/.test(m)?Math.max(1,Math.min(21,v)):Math.max(0,Math.min(20,v)),S.toString=function(){return t+""},S}return{format:f,formatPrefix:function(t,e){var n,r=f(((t=jd(t)).type="f",t)),i=3*Math.max(-8,Math.min(8,Math.floor((n=e,((n=Cd(Math.abs(n)))?n[1]:NaN)/3)))),o=Math.pow(10,-i),s=zd[8+i/3];return function(t){return r(o*t)+s}}}}(t),Nd=Dd.format,Dd.formatPrefix,Dd}function Vd(t){return Vd="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Vd(t)}function Wd(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:3;return Math.pow(t,e)},gp=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3;return 1-Math.pow(1-t,1/e)},wp=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3;return 0==e?t:(Math.exp(t*e)-1)/(Math.exp(e)-1)},_p=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3;return 0==e?t:1-1/e*Math.log(Math.exp(e)*(1-t)+t)},xp=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.8;if(0==e)return t;if(1==e)return Math.sqrt(t*(2-t));var n=e/(1-e);return Math.sqrt(1/(n*n)+t*(2/n+2-t))-1/n},Sp=function(t){return 1-xp(1-t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:.8)},Op=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3;return 0==e?t:1/e*Math.log(1-t+t*Math.exp(e))},Ip=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3;return(Math.exp(-e*t)-1)/(Math.exp(-e)-1)},Tp=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3;return Math.pow(t,1/e)},Ap=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3;return 1-Math.pow(1-t,e)},Mp=1e-6,Cp=1e-12,Pp=Math.PI,Ep=Pp/2,jp=Pp/4,kp=2*Pp,Bp=180/Pp,Fp=Pp/180,Lp=Math.abs,Dp=Math.atan,Np=Math.atan2,Rp=Math.cos,zp=(Math.ceil,Math.exp,Math.floor,Math.hypot,Math.log,Math.pow,Math.sin),Up=Math.sign||function(t){return t>0?1:t<0?-1:0},Vp=Math.sqrt;function Wp(t){return t>1?Ep:t<-1?-Ep:Math.asin(t)}function $p(){}function Gp(){var t,e=[];return{point:function(e,n,r){t.push([e,n,r])},lineStart:function(){e.push(t=[])},lineEnd:$p,rejoin:function(){e.length>1&&e.push(e.pop().concat(e.shift()))},result:function(){var n=e;return e=[],t=null,n}}}function Yp(t,e){return Lp(t[0]-e[0])=0;--o)i.point((l=c[o])[0],l[1]);else r(h.x,h.p.x,-1,i);h=h.p}c=(h=h.o).z,d=!d}while(!h.v);i.lineEnd()}}}function qp(t){if(e=t.length){for(var e,n,r=0,i=t[0];++r0){for(o=t[--i];i>0&&(e=o,n=t[--i],o=e+n,r=n-(o-e),!r););i>0&&(r<0&&t[i-1]<0||r>0&&t[i-1]>0)&&(n=2*r,e=o+n,n==e-o&&(o=e))}return o}}function Kp(t){return[Np(t[1],t[0]),Wp(t[2])]}function Jp(t){var e=t[0],n=t[1],r=Rp(n);return[r*Rp(e),r*zp(e),zp(n)]}function Qp(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function ty(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function ey(t,e){t[0]+=e[0],t[1]+=e[1],t[2]+=e[2]}function ny(t,e){return[t[0]*e,t[1]*e,t[2]*e]}function ry(t){var e=Vp(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=e,t[1]/=e,t[2]/=e}function iy(t){return Lp(t[0])<=Pp?t[0]:Up(t[0])*((Lp(t[0])+Pp)%kp-Pp)}function oy(t){return Array.from(function*(t){for(const e of t)yield*e}(t))}function sy(t,e,n,r){return function(i){var o,s,a,u=e(i),c=Gp(),l=e(c),f=!1,h={point:d,lineStart:y,lineEnd:v,polygonStart:function(){h.point=b,h.lineStart=m,h.lineEnd=g,s=[],o=[]},polygonEnd:function(){h.point=d,h.lineStart=y,h.lineEnd=v,s=oy(s);var t=function(t,e){var n=iy(e),r=e[1],i=zp(r),o=[zp(n),-Rp(n),0],s=0,a=0,u=new Xp;1===i?r=Ep+Mp:-1===i&&(r=-Ep-Mp);for(var c=0,l=t.length;c=0?1:-1,T=I*O,A=T>Pp,M=v*x;if(u.add(Np(M*I*zp(T),b*S+M*Rp(T))),s+=A?O+I*kp:O,A^p>=n^w>=n){var C=ty(Jp(d),Jp(g));ry(C);var P=ty(o,C);ry(P);var E=(A^O>=0?-1:1)*Wp(P[2]);(r>E||r===E&&(C[0]||C[1]))&&(a+=A^O>=0?1:-1)}}return(s<-Mp||s0){for(f||(i.polygonStart(),f=!0),i.lineStart(),t=0;t1&&2&u&&h.push(h.pop().concat(h.shift())),s.push(h.filter(ay))}return h}}function ay(t){return t.length>1}function uy(t,e){return((t=t.x)[0]<0?t[1]-Ep-Mp:Ep-t[1])-((e=e.x)[0]<0?e[1]-Ep-Mp:Ep-e[1])}const cy=sy((function(){return!0}),(function(t){var e,n=NaN,r=NaN,i=NaN;return{lineStart:function(){t.lineStart(),e=1},point:function(o,s){var a=o>0?Pp:-Pp,u=Lp(o-n);Lp(u-Pp)0?Ep:-Ep),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(a,r),t.point(o,r),e=0):i!==a&&u>=Pp&&(Lp(n-i)Mp?Dp((zp(e)*(o=Rp(r))*zp(n)-zp(r)*(i=Rp(e))*zp(t))/(i*o*s)):(e+r)/2}(n,r,o,s),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(a,r),e=0),t.point(n=o,r=s),i=a},lineEnd:function(){t.lineEnd(),n=r=NaN},clean:function(){return 2-e}}}),(function(t,e,n,r){var i;if(null==t)i=n*Ep,r.point(-Pp,i),r.point(0,i),r.point(Pp,i),r.point(Pp,0),r.point(Pp,-i),r.point(0,-i),r.point(-Pp,-i),r.point(-Pp,0),r.point(-Pp,i);else if(Lp(t[0]-e[0])>Mp){var o=t[0]1?0:n<-1?Pp:Math.acos(n);return((-e[2]<0?-r:r)+kp-Mp)%kp}var fy=1e9,hy=-fy;function dy(t,e){function n(n,r){return n=t(n,r),e(n[0],n[1])}return t.invert&&e.invert&&(n.invert=function(n,r){return(n=e.invert(n,r))&&t.invert(n[0],n[1])}),n}const py=t=>t;function yy(t,e){return Lp(t)>Pp&&(t-=Math.round(t/kp)*kp),[t,e]}function vy(t){return function(e,n){return Lp(e+=t)>Pp&&(e-=Math.round(e/kp)*kp),[e,n]}}function by(t){var e=vy(t);return e.invert=vy(-t),e}function my(t,e){var n=Rp(t),r=zp(t),i=Rp(e),o=zp(e);function s(t,e){var s=Rp(e),a=Rp(t)*s,u=zp(t)*s,c=zp(e),l=c*n+a*r;return[Np(u*i-l*o,a*n-c*r),Wp(l*i+u*o)]}return s.invert=function(t,e){var s=Rp(e),a=Rp(t)*s,u=zp(t)*s,c=zp(e),l=c*i-u*o;return[Np(u*i+c*o,a*n+l*r),Wp(l*n-a*r)]},s}function gy(t){return function(e){var n=new wy;for(var r in t)n[r]=t[r];return n.stream=e,n}}function wy(){}function _y(t,e){t&&Sy.hasOwnProperty(t.type)&&Sy[t.type](t,e)}yy.invert=yy,wy.prototype={constructor:wy,point:function(t,e){this.stream.point(t,e)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}};var xy={Feature:function(t,e){_y(t.geometry,e)},FeatureCollection:function(t,e){for(var n=t.features,r=-1,i=n.length;++rMy&&(My=t),eCy&&(Cy=e)},lineStart:$p,lineEnd:$p,polygonStart:$p,polygonEnd:$p,result:function(){var t=[[Ty,Ay],[My,Cy]];return My=Cy=-(Ay=Ty=1/0),t}};const Ey=Py;function jy(t,e,n){var r=t.clipExtent&&t.clipExtent();return t.scale(150).translate([0,0]),null!=r&&t.clipExtent(null),function(t,e){t&&xy.hasOwnProperty(t.type)?xy[t.type](t,e):_y(t,e)}(n,t.stream(Ey)),e(Ey.result()),null!=r&&t.clipExtent(r),t}function ky(t,e,n){return jy(t,(function(n){var r=e[1][0]-e[0][0],i=e[1][1]-e[0][1],o=Math.min(r/(n[1][0]-n[0][0]),i/(n[1][1]-n[0][1])),s=+e[0][0]+(r-o*(n[1][0]+n[0][0]))/2,a=+e[0][1]+(i-o*(n[1][1]+n[0][1]))/2;t.scale(150*o).translate([s,a])}),n)}var By=16,Fy=Rp(30*Fp);function Ly(t,e){return+e?function(t,e){function n(r,i,o,s,a,u,c,l,f,h,d,p,y,v){var b=c-r,m=l-i,g=b*b+m*m;if(g>4*e&&y--){var w=s+h,_=a+d,x=u+p,S=Vp(w*w+_*_+x*x),O=Wp(x/=S),I=Lp(Lp(x)-1)e||Lp((b*C+m*P)/g-.5)>.3||s*h+a*d+u*p0,i=Lp(e)>Mp;function o(t,n){return Rp(t)*Rp(n)>e}function s(t,n,r){var i=[1,0,0],o=ty(Jp(t),Jp(n)),s=Qp(o,o),a=o[0],u=s-a*a;if(!u)return!r&&t;var c=e*s/u,l=-e*a/u,f=ty(i,o),h=ny(i,c);ey(h,ny(o,l));var d=f,p=Qp(h,d),y=Qp(d,d),v=p*p-y*(Qp(h,h)-1);if(!(v<0)){var b=Vp(v),m=ny(d,(-p-b)/y);if(ey(m,h),m=Kp(m),!r)return m;var g,w=t[0],_=n[0],x=t[1],S=n[1];_0^m[1]<(Lp(m[0]-w)Pp^(w<=m[0]&&m[0]<=_)){var T=ny(d,(-p+b)/y);return ey(T,h),[m,Kp(T)]}}}function a(e,n){var i=r?t:Pp-t,o=0;return e<-i?o|=1:e>i&&(o|=2),n<-i?o|=4:n>i&&(o|=8),o}return sy(o,(function(t){var e,n,u,c,l;return{lineStart:function(){c=u=!1,l=1},point:function(f,h){var d,p=[f,h],y=o(f,h),v=r?y?0:a(f,h):y?a(f+(f<0?Pp:-Pp),h):0;if(!e&&(c=u=y)&&t.lineStart(),y!==u&&(!(d=s(e,p))||Yp(e,d)||Yp(p,d))&&(p[2]=1),y!==u)l=0,y?(t.lineStart(),d=s(p,e),t.point(d[0],d[1])):(d=s(e,p),t.point(d[0],d[1],2),t.lineEnd()),e=d;else if(i&&e&&r^y){var b;v&n||!(b=s(p,e,!0))||(l=0,r?(t.lineStart(),t.point(b[0][0],b[0][1]),t.point(b[1][0],b[1][1]),t.lineEnd()):(t.point(b[1][0],b[1][1]),t.lineEnd(),t.lineStart(),t.point(b[0][0],b[0][1],3)))}!y||e&&Yp(e,p)||t.point(p[0],p[1]),e=p,u=y,n=v},lineEnd:function(){u&&t.lineEnd(),e=null},clean:function(){return l|(c&&u)<<1}}}),(function(e,r,i,o){!function(t,e,n,r,i,o){if(n){var s=Rp(e),a=zp(e),u=r*n;null==i?(i=e+r*kp,o=e-u/2):(i=ly(s,i),o=ly(s,o),(r>0?io)&&(i+=r*kp));for(var c,l=i;r>0?l>o:l0)do{c.point(0===l||3===l?t:n,l>1?r:e)}while((l=(l+a+4)%4)!==f);else c.point(o[0],o[1])}function s(r,i){return Lp(r[0]-t)0?0:3:Lp(r[0]-n)0?2:1:Lp(r[1]-e)0?1:0:i>0?3:2}function a(t,e){return u(t.x,e.x)}function u(t,e){var n=s(t,1),r=s(e,1);return n!==r?n-r:0===n?e[1]-t[1]:1===n?t[0]-e[0]:2===n?t[1]-e[1]:e[0]-t[0]}return function(s){var u,c,l,f,h,d,p,y,v,b,m,g=s,w=Gp(),_={point:x,lineStart:function(){_.point=S,c&&c.push(l=[]),b=!0,v=!1,p=y=NaN},lineEnd:function(){u&&(S(f,h),d&&v&&w.rejoin(),u.push(w.result())),_.point=x,v&&g.lineEnd()},polygonStart:function(){g=w,u=[],c=[],m=!0},polygonEnd:function(){var e=function(){for(var e=0,n=0,i=c.length;nr&&(h-o)*(r-s)>(d-s)*(t-o)&&++e:d<=r&&(h-o)*(r-s)<(d-s)*(t-o)&&--e;return e}(),n=m&&e,i=(u=oy(u)).length;(n||i)&&(s.polygonStart(),n&&(s.lineStart(),o(null,null,1,s),s.lineEnd()),i&&Hp(u,a,e,o,s),s.polygonEnd()),g=s,u=c=l=null}};function x(t,e){i(t,e)&&g.point(t,e)}function S(o,s){var a=i(o,s);if(c&&l.push([o,s]),b)f=o,h=s,d=a,b=!1,a&&(g.lineStart(),g.point(o,s));else if(a&&v)g.point(o,s);else{var u=[p=Math.max(hy,Math.min(fy,p)),y=Math.max(hy,Math.min(fy,y))],w=[o=Math.max(hy,Math.min(fy,o)),s=Math.max(hy,Math.min(fy,s))];!function(t,e,n,r,i,o){var s,a=t[0],u=t[1],c=0,l=1,f=e[0]-a,h=e[1]-u;if(s=n-a,f||!(s>0)){if(s/=f,f<0){if(s0){if(s>l)return;s>c&&(c=s)}if(s=i-a,f||!(s<0)){if(s/=f,f<0){if(s>l)return;s>c&&(c=s)}else if(f>0){if(s0)){if(s/=h,h<0){if(s0){if(s>l)return;s>c&&(c=s)}if(s=o-u,h||!(s<0)){if(s/=h,h<0){if(s>l)return;s>c&&(c=s)}else if(h>0){if(s0&&(t[0]=a+c*f,t[1]=u+c*h),l<1&&(e[0]=a+l*f,e[1]=u+l*h),!0}}}}}(u,w,t,e,n,r)?a&&(g.lineStart(),g.point(o,s),m=!1):(v||(g.lineStart(),g.point(u[0],u[1])),g.point(w[0],w[1]),a||g.lineEnd(),m=!1)}p=o,y=s,v=a}return _}}(O=+t[0][0],r=+t[0][1],i=+t[1][0],o=+t[1][1]),P()):null==O?null:[[O,r],[i,o]]},A.scale=function(t){return arguments.length?(f=+t,C()):f},A.translate=function(t){return arguments.length?(h=+t[0],d=+t[1],C()):[h,d]},A.center=function(t){return arguments.length?(p=t[0]%360*Fp,y=t[1]%360*Fp,C()):[p*Bp,y*Bp]},A.rotate=function(t){return arguments.length?(v=t[0]%360*Fp,b=t[1]%360*Fp,m=t.length>2?t[2]%360*Fp:0,C()):[v*Bp,b*Bp,m*Bp]},A.angle=function(t){return arguments.length?(g=t%360*Fp,C()):g*Bp},A.reflectX=function(t){return arguments.length?(w=t?-1:1,C()):w<0},A.reflectY=function(t){return arguments.length?(_=t?-1:1,C()):_<0},A.precision=function(t){return arguments.length?(s=Ly(a,T=t*t),P()):Vp(T)},A.fitExtent=function(t,e){return ky(A,t,e)},A.fitSize=function(t,e){return function(t,e,n){return ky(t,[[0,0],e],n)}(A,t,e)},A.fitWidth=function(t,e){return function(t,e,n){return jy(t,(function(n){var r=+e,i=r/(n[1][0]-n[0][0]),o=(r-i*(n[1][0]+n[0][0]))/2,s=-i*n[0][1];t.scale(150*i).translate([o,s])}),n)}(A,t,e)},A.fitHeight=function(t,e){return function(t,e,n){return jy(t,(function(n){var r=+e,i=r/(n[1][1]-n[0][1]),o=-i*n[0][0],s=(r-i*(n[1][1]+n[0][1]))/2;t.scale(150*i).translate([o,s])}),n)}(A,t,e)},function(){return e=t.apply(this,arguments),A.invert=e.invert&&M,C()}}((function(){return t}))()}var zy,Uy,Vy=(zy=function(t){return Vp(2/(1+t))},function(t,e){var n=Rp(t),r=Rp(e),i=zy(n*r);return i===1/0?[2,0]:[i*r*zp(t),i*zp(e)]});Vy.invert=(Uy=function(t){return 2*Wp(t/2)},function(t,e){var n=Vp(t*t+e*e),r=Uy(n),i=zp(r),o=Rp(r);return[Np(t*i,n*o),Wp(n&&e*i/n)]});var Wy=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"EUR",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:50,n=arguments.length>2?arguments[2]:void 0,r=(n=n||{}).ex||1.2,i=n.fontFamily||"Arial",o=n.exSize||1;return n.style=n.style||function(t,e){if(!(t.rs=0))return!1;var e=n.proj([t.lon,t.lat]);t.x=e[0],t.y=e[1],delete t.lon,delete t.lat},n.baseURL=n.baseURL||"https://raw.githubusercontent.com/eurostat/euronym/main/pub/v2/UTF/",n.url=n.baseURL+e+"/"+t+".csv",n},$y=function(t){var e=(t=t||{}).nutsYear||"2021",n=t.crs||"3035",r=t.scale||"03M",i=t.nutsLevel||"3",o=t.col||"#888",s=t.colKosovo||"#bcbcbc",a=null==t.showOth||t.showOth;return t.color=t.color||function(t,e){var n=t.properties;if(a||"T"==n.eu||"T"==n.cc||"T"==n.efta||"T"!==n.oth)return n.id>=1e5?s:"T"===n.co||e<400?o:e<1e3?n.lvl>=3?"":o:e<2e3?n.lvl>=2?"":o:n.lvl>=1?"":o},t.width=t.width||function(t,e){var n=t.properties;return"T"===n.co?.5:e<400?3==n.lvl||2==n.lvl||1==n.lvl?2.2:4:e<1e3?2==n.lvl||1==n.lvl?1.8:2.5:e<2e3?1==n.lvl?1.8:2.5:1.2},t.lineDash=t.lineDash||function(t,e){var n=t.properties;return"T"===n.co?[]:e<400?3==n.lvl?[2*e,2*e]:2==n.lvl||1==n.lvl?[5*e,2*e]:[10*e,3*e]:e<1e3?2==n.lvl||1==n.lvl?[5*e,2*e]:[10*e,3*e]:e<2e3&&1==n.lvl?[5*e,2*e]:[10*e,3*e]},t.baseURL=t.baseURL||"https://raw.githubusercontent.com/eurostat/Nuts2json/master/pub/v2/",t.url=t.baseURL+e+"/"+n+"/"+r+"/nutsbn_"+i+".json",t},Gy=Rn.getParameterByName;return Ud({decimal:".",thousands:" ",grouping:[3],currency:["","€"]}),e})())); \ No newline at end of file +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.gviz=e():t.gviz=e()}(self,(()=>(()=>{"use strict";var t={d:(e,n)=>{for(var r in n)t.o(n,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:n[r]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};function n(){}function r(t){return null==t?n:function(){return this.querySelector(t)}}function i(){return[]}function o(t){return null==t?i:function(){return this.querySelectorAll(t)}}function s(t){return function(){return this.matches(t)}}function a(t){return function(e){return e.matches(t)}}t.r(e),t.d(e,{App:()=>Zl,BackgroundLayer:()=>Il,BackgroundLayerWMS:()=>Ml,BoundaryLayer:()=>Vl,CSVGrid:()=>Sr,ColorCategoryLegend:()=>rp,ColorDiscreteLegend:()=>Jd,ColorLegend:()=>Zd,CompositionStyle:()=>If,ContourStyle:()=>mh,Dataset:()=>Zn,DatasetComponent:()=>pr,DotDensityStyle:()=>Nh,GeoCanvas:()=>Rn,JoyPlotStyle:()=>bf,KernelSmoothingStyle:()=>th,LabelLayer:()=>Fl,Layer:()=>Vn,LegoStyle:()=>dd,MosaicStyle:()=>wd,NinjaStarStyle:()=>Td,PillarStyle:()=>ah,SegmentOrientationLegend:()=>mp,SegmentStyle:()=>Pf,SegmentWidthLegend:()=>dp,ShapeColorSizeStyle:()=>of,SideCatStyle:()=>Oh,SideStyle:()=>ph,SizeLegend:()=>up,SquareColorCatWGLStyle:()=>id,SquareColorWGLStyle:()=>Zh,StrokeStyle:()=>ff,Style:()=>Jl,TanakaStyle:()=>Xh,TextStyle:()=>Df,TiledGrid:()=>xl,getClass:()=>Vr,getEuronymeLabelLayer:()=>$y,getEurostatBoundariesLayer:()=>Gy,getParameterByName:()=>Yy,sCircleHigh:()=>Op,sCircleLow:()=>Sp,sExp:()=>_p,sExpInverse:()=>Ip,sExpRev:()=>xp,sExpRevInverse:()=>Tp,sPow:()=>gp,sPowInverse:()=>Ap,sPowRev:()=>wp,sPowRevInverse:()=>Mp});var u=Array.prototype.find;function c(){return this.firstElementChild}var l=Array.prototype.filter;function f(){return Array.from(this.children)}function h(t){return new Array(t.length)}function d(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}function p(t,e,n,r,i,o){for(var s,a=0,u=e.length,c=o.length;ae?1:t>=e?0:NaN}d.prototype={constructor:d,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,e){return this._parent.insertBefore(t,e)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};var g="http://www.w3.org/1999/xhtml";const w={svg:"http://www.w3.org/2000/svg",xhtml:g,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function _(t){var e=t+="",n=e.indexOf(":");return n>=0&&"xmlns"!==(e=t.slice(0,n))&&(t=t.slice(n+1)),w.hasOwnProperty(e)?{space:w[e],local:t}:t}function x(t){return function(){this.removeAttribute(t)}}function S(t){return function(){this.removeAttributeNS(t.space,t.local)}}function O(t,e){return function(){this.setAttribute(t,e)}}function I(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function T(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttribute(t):this.setAttribute(t,n)}}function A(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,n)}}function M(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function E(t){return function(){this.style.removeProperty(t)}}function C(t,e,n){return function(){this.style.setProperty(t,e,n)}}function P(t,e,n){return function(){var r=e.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,n)}}function j(t,e){return t.style.getPropertyValue(e)||M(t).getComputedStyle(t,null).getPropertyValue(e)}function k(t){return function(){delete this[t]}}function B(t,e){return function(){this[t]=e}}function F(t,e){return function(){var n=e.apply(this,arguments);null==n?delete this[t]:this[t]=n}}function L(t){return t.trim().split(/^|\s+/)}function D(t){return t.classList||new N(t)}function N(t){this._node=t,this._names=L(t.getAttribute("class")||"")}function R(t,e){for(var n=D(t),r=-1,i=e.length;++r=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var lt=[null];function ft(t,e){this._groups=t,this._parents=e}function ht(){return new ft([[document.documentElement]],lt)}ft.prototype=ht.prototype={constructor:ft,select:function(t){"function"!=typeof t&&(t=r(t));for(var e=this._groups,n=e.length,i=new Array(n),o=0;o=I&&(I=O+1);!(S=_[I])&&++I=0;)(r=i[o])&&(s&&4^r.compareDocumentPosition(s)&&s.parentNode.insertBefore(r,s),s=r);return this},sort:function(t){function e(e,n){return e&&n?t(e.__data__,n.__data__):!e-!n}t||(t=m);for(var n=this._groups,r=n.length,i=new Array(r),o=0;o1?this.each((null==e?E:"function"==typeof e?P:C)(t,e,null==n?"":n)):j(this.node(),t)},property:function(t,e){return arguments.length>1?this.each((null==e?k:"function"==typeof e?F:B)(t,e)):this.node()[t]},classed:function(t,e){var n=L(t+"");if(arguments.length<2){for(var r=D(this.node()),i=-1,o=n.length;++i=0&&(e=t.slice(n+1),t=t.slice(0,n)),{type:t,name:e}}))}(t+""),s=o.length;if(!(arguments.length<2)){for(a=e?st:ot,r=0;r{}};function vt(){for(var t,e=0,n=arguments.length,r={};e=0&&(e=t.slice(n+1),t=t.slice(0,n)),t&&!r.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:e}}))),s=-1,a=o.length;if(!(arguments.length<2)){if(null!=e&&"function"!=typeof e)throw new Error("invalid callback: "+e);for(;++s0)for(var n,r,i=new Array(n),o=0;o=0&&e._call.call(void 0,t),e=e._next;--Mt}()}finally{Mt=0,function(){for(var t,e,n=Tt,r=1/0;n;)n._call?(r>n._time&&(r=n._time),t=n,n=n._next):(e=n._next,n._next=null,n=t?t._next=e:Tt=e);At=t,Wt(r)}(),kt=0}}function Vt(){var t=Ft.now(),e=t-jt;e>Pt&&(Bt-=e,jt=t)}function Wt(t){Mt||(Et&&(Et=clearTimeout(Et)),t-kt>24?(t<1/0&&(Et=setTimeout(Ut,t-Ft.now()-Bt)),Ct&&(Ct=clearInterval(Ct))):(Ct||(jt=Ft.now(),Ct=setInterval(Vt,Pt)),Mt=1,Lt(Ut)))}function $t(t,e,n){var r=new Rt;return e=null==e?0:+e,r.restart((n=>{r.stop(),t(n+e)}),e,n),r}Rt.prototype=zt.prototype={constructor:Rt,restart:function(t,e,n){if("function"!=typeof t)throw new TypeError("callback is not a function");n=(null==n?Dt():+n)+(null==e?0:+e),this._next||At===this||(At?At._next=this:Tt=this,At=this),this._call=t,this._time=n,Wt()},stop:function(){this._call&&(this._call=null,this._time=1/0,Wt())}};var Gt=wt("start","end","cancel","interrupt"),Yt=[],Zt=0,Ht=2,qt=3,Xt=5,Kt=6;function Jt(t,e,n,r,i,o){var s=t.__transition;if(s){if(n in s)return}else t.__transition={};!function(t,e,n){var r,i=t.__transition;function o(u){var c,l,f,h;if(1!==n.state)return a();for(c in i)if((h=i[c]).name===n.name){if(h.state===qt)return $t(o);4===h.state?(h.state=Kt,h.timer.stop(),h.on.call("interrupt",t,t.__data__,h.index,h.group),delete i[c]):+cZt)throw new Error("too late; already scheduled");return n}function te(t,e){var n=ee(t,e);if(n.state>qt)throw new Error("too late; already running");return n}function ee(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}function ne(t,e){var n,r,i,o=t.__transition,s=!0;if(o){for(i in e=null==e?null:e+"",o)(n=o[i]).name===e?(r=n.state>Ht&&n.state180?e+=360:e-t>180&&(t+=360),o.push({i:n.push(i(n)+"rotate(",null,r)-2,x:re(t,e)})):e&&n.push(i(n)+"rotate("+e+r)}(o.rotate,s.rotate,a,u),function(t,e,n,o){t!==e?o.push({i:n.push(i(n)+"skewX(",null,r)-2,x:re(t,e)}):e&&n.push(i(n)+"skewX("+e+r)}(o.skewX,s.skewX,a,u),function(t,e,n,r,o,s){if(t!==n||e!==r){var a=o.push(i(o)+"scale(",null,",",null,")");s.push({i:a-4,x:re(t,n)},{i:a-2,x:re(e,r)})}else 1===n&&1===r||o.push(i(o)+"scale("+n+","+r+")")}(o.scaleX,o.scaleY,s.scaleX,s.scaleY,a,u),o=s=null,function(t){for(var e,n=-1,r=u.length;++n>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===n?Be(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===n?Be(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=Se.exec(t))?new Le(e[1],e[2],e[3],1):(e=Oe.exec(t))?new Le(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=Ie.exec(t))?Be(e[1],e[2],e[3],e[4]):(e=Te.exec(t))?Be(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=Ae.exec(t))?Ve(e[1],e[2]/100,e[3]/100,1):(e=Me.exec(t))?Ve(e[1],e[2]/100,e[3]/100,e[4]):Ee.hasOwnProperty(t)?ke(Ee[t]):"transparent"===t?new Le(NaN,NaN,NaN,0):null}function ke(t){return new Le(t>>16&255,t>>8&255,255&t,1)}function Be(t,e,n,r){return r<=0&&(t=e=n=NaN),new Le(t,e,n,r)}function Fe(t,e,n,r){return 1===arguments.length?((i=t)instanceof ve||(i=je(i)),i?new Le((i=i.rgb()).r,i.g,i.b,i.opacity):new Le):new Le(t,e,n,null==r?1:r);var i}function Le(t,e,n,r){this.r=+t,this.g=+e,this.b=+n,this.opacity=+r}function De(){return`#${Ue(this.r)}${Ue(this.g)}${Ue(this.b)}`}function Ne(){const t=Re(this.opacity);return`${1===t?"rgb(":"rgba("}${ze(this.r)}, ${ze(this.g)}, ${ze(this.b)}${1===t?")":`, ${t})`}`}function Re(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function ze(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function Ue(t){return((t=ze(t))<16?"0":"")+t.toString(16)}function Ve(t,e,n,r){return r<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new $e(t,e,n,r)}function We(t){if(t instanceof $e)return new $e(t.h,t.s,t.l,t.opacity);if(t instanceof ve||(t=je(t)),!t)return new $e;if(t instanceof $e)return t;var e=(t=t.rgb()).r/255,n=t.g/255,r=t.b/255,i=Math.min(e,n,r),o=Math.max(e,n,r),s=NaN,a=o-i,u=(o+i)/2;return a?(s=e===o?(n-r)/a+6*(n0&&u<1?0:s,new $e(s,a,u,t.opacity)}function $e(t,e,n,r){this.h=+t,this.s=+e,this.l=+n,this.opacity=+r}function Ge(t){return(t=(t||0)%360)<0?t+360:t}function Ye(t){return Math.max(0,Math.min(1,t||0))}function Ze(t,e,n){return 255*(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)}function He(t,e,n,r,i){var o=t*t,s=o*t;return((1-3*t+3*o-s)*e+(4-6*o+3*s)*n+(1+3*t+3*o-3*s)*r+s*i)/6}pe(ve,je,{copy(t){return Object.assign(new this.constructor,this,t)},displayable(){return this.rgb().displayable()},hex:Ce,formatHex:Ce,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return We(this).formatHsl()},formatRgb:Pe,toString:Pe}),pe(Le,Fe,ye(ve,{brighter(t){return t=null==t?me:Math.pow(me,t),new Le(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=null==t?be:Math.pow(be,t),new Le(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new Le(ze(this.r),ze(this.g),ze(this.b),Re(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:De,formatHex:De,formatHex8:function(){return`#${Ue(this.r)}${Ue(this.g)}${Ue(this.b)}${Ue(255*(isNaN(this.opacity)?1:this.opacity))}`},formatRgb:Ne,toString:Ne})),pe($e,(function(t,e,n,r){return 1===arguments.length?We(t):new $e(t,e,n,null==r?1:r)}),ye(ve,{brighter(t){return t=null==t?me:Math.pow(me,t),new $e(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=null==t?be:Math.pow(be,t),new $e(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*e,i=2*n-r;return new Le(Ze(t>=240?t-240:t+120,i,r),Ze(t,i,r),Ze(t<120?t+240:t-120,i,r),this.opacity)},clamp(){return new $e(Ge(this.h),Ye(this.s),Ye(this.l),Re(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const t=Re(this.opacity);return`${1===t?"hsl(":"hsla("}${Ge(this.h)}, ${100*Ye(this.s)}%, ${100*Ye(this.l)}%${1===t?")":`, ${t})`}`}}));const qe=t=>()=>t;function Xe(t,e){var n=e-t;return n?function(t,e){return function(n){return t+n*e}}(t,n):qe(isNaN(t)?e:t)}const Ke=function t(e){var n=function(t){return 1==(t=+t)?Xe:function(e,n){return n-e?function(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(r){return Math.pow(t+r*e,n)}}(e,n,t):qe(isNaN(e)?n:e)}}(e);function r(t,e){var r=n((t=Fe(t)).r,(e=Fe(e)).r),i=n(t.g,e.g),o=n(t.b,e.b),s=Xe(t.opacity,e.opacity);return function(e){return t.r=r(e),t.g=i(e),t.b=o(e),t.opacity=s(e),t+""}}return r.gamma=t,r}(1);function Je(t){return function(e){var n,r,i=e.length,o=new Array(i),s=new Array(i),a=new Array(i);for(n=0;n=1?(n=1,e-1):Math.floor(n*e),i=t[r],o=t[r+1],s=r>0?t[r-1]:2*i-o,a=ro&&(i=e.slice(o,i),a[s]?a[s]+=i:a[++s]=i),(n=n[0])===(r=r[0])?a[s]?a[s]+=r:a[++s]=r:(a[++s]=null,u.push({i:s,x:re(n,r)})),o=tn.lastIndex;return o=0&&(t=t.slice(0,e)),!t||"start"===t}))}(e)?Qt:te;return function(){var s=o(this,t),a=s.on;a!==r&&(i=(r=a).copy()).on(e,n),s.on=i}}(n,t,e))},attr:function(t,e){var n=_(t),r="transform"===n?le:nn;return this.attrTween(t,"function"==typeof e?(n.local?cn:un)(n,r,de(this,"attr."+t,e)):null==e?(n.local?on:rn)(n):(n.local?an:sn)(n,r,e))},attrTween:function(t,e){var n="attr."+t;if(arguments.length<2)return(n=this.tween(n))&&n._value;if(null==e)return this.tween(n,null);if("function"!=typeof e)throw new Error;var r=_(t);return this.tween(n,(r.local?ln:fn)(r,e))},style:function(t,e,n){var r="transform"==(t+="")?ce:nn;return null==e?this.styleTween(t,function(t,e){var n,r,i;return function(){var o=j(this,t),s=(this.style.removeProperty(t),j(this,t));return o===s?null:o===n&&s===r?i:i=e(n=o,r=s)}}(t,r)).on("end.style."+t,bn(t)):"function"==typeof e?this.styleTween(t,function(t,e,n){var r,i,o;return function(){var s=j(this,t),a=n(this),u=a+"";return null==a&&(this.style.removeProperty(t),u=a=j(this,t)),s===u?null:s===r&&u===i?o:(i=u,o=e(r=s,a))}}(t,r,de(this,"style."+t,e))).each(function(t,e){var n,r,i,o,s="style."+e,a="end."+s;return function(){var u=te(this,t),c=u.on,l=null==u.value[s]?o||(o=bn(e)):void 0;c===n&&i===l||(r=(n=c).copy()).on(a,i=l),u.on=r}}(this._id,t)):this.styleTween(t,function(t,e,n){var r,i,o=n+"";return function(){var s=j(this,t);return s===o?null:s===r?i:i=e(r=s,n)}}(t,r,e),n).on("end.style."+t,null)},styleTween:function(t,e,n){var r="style."+(t+="");if(arguments.length<2)return(r=this.tween(r))&&r._value;if(null==e)return this.tween(r,null);if("function"!=typeof e)throw new Error;return this.tween(r,function(t,e,n){var r,i;function o(){var o=e.apply(this,arguments);return o!==i&&(r=(i=o)&&function(t,e,n){return function(r){this.style.setProperty(t,e.call(this,r),n)}}(t,o,n)),r}return o._value=e,o}(t,e,null==n?"":n))},text:function(t){return this.tween("text","function"==typeof t?function(t){return function(){var e=t(this);this.textContent=null==e?"":e}}(de(this,"text",t)):function(t){return function(){this.textContent=t}}(null==t?"":t+""))},textTween:function(t){var e="text";if(arguments.length<1)return(e=this.tween(e))&&e._value;if(null==t)return this.tween(e,null);if("function"!=typeof t)throw new Error;return this.tween(e,function(t){var e,n;function r(){var r=t.apply(this,arguments);return r!==n&&(e=(n=r)&&function(t){return function(e){this.textContent=t.call(this,e)}}(r)),e}return r._value=t,r}(t))},remove:function(){return this.on("end.remove",function(t){return function(){var e=this.parentNode;for(var n in this.__transition)if(+n!==t)return;e&&e.removeChild(this)}}(this._id))},tween:function(t,e){var n=this._id;if(t+="",arguments.length<2){for(var r,i=ee(this.node(),n).tween,o=0,s=i.length;o()=>t;function In(t,{sourceEvent:e,target:n,transform:r,dispatch:i}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},transform:{value:r,enumerable:!0,configurable:!0},_:{value:i}})}function Tn(t,e,n){this.k=t,this.x=e,this.y=n}Tn.prototype={constructor:Tn,scale:function(t){return 1===t?this:new Tn(this.k*t,this.x,this.y)},translate:function(t,e){return 0===t&0===e?this:new Tn(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var An=new Tn(1,0,0);function Mn(t){t.stopImmediatePropagation()}function En(t){t.preventDefault(),t.stopImmediatePropagation()}function Cn(t){return!(t.ctrlKey&&"wheel"!==t.type||t.button)}function Pn(){var t=this;return t instanceof SVGElement?(t=t.ownerSVGElement||t).hasAttribute("viewBox")?[[(t=t.viewBox.baseVal).x,t.y],[t.x+t.width,t.y+t.height]]:[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]:[[0,0],[t.clientWidth,t.clientHeight]]}function jn(){return this.__zoom||An}function kn(t){return-t.deltaY*(1===t.deltaMode?.05:t.deltaMode?1:.002)*(t.ctrlKey?10:1)}function Bn(){return navigator.maxTouchPoints||"ontouchstart"in this}function Fn(t,e,n){var r=t.invertX(e[0][0])-n[0][0],i=t.invertX(e[1][0])-n[1][0],o=t.invertY(e[0][1])-n[0][1],s=t.invertY(e[1][1])-n[1][1];return t.translate(i>r?(r+i)/2:Math.min(0,r)||Math.max(0,i),s>o?(o+s)/2:Math.min(0,o)||Math.max(0,s))}function Ln(t){return Ln="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ln(t)}function Dn(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);ny}s.event(t).zoom("mouse",o(g(s.that.__zoom,s.mouse[0]=It(t,i),s.mouse[1]),s.extent,c))}),!0).on("mouseup.zoom",(function(t){a.on("mousemove.zoom mouseup.zoom",null),function(t,e){var n=t.document.documentElement,r=pt(t).on("dragstart.drag",null);e&&(r.on("click.drag",xt,_t),setTimeout((function(){r.on("click.drag",null)}),0)),"onselectstart"in n?r.on("selectstart.drag",null):(n.style.MozUserSelect=n.__noselect,delete n.__noselect)}(t.view,s.moved),En(t),s.event(t).end()}),!0),u=It(t,i),l=t.clientX,f=t.clientY;!function(t){var e=t.document.documentElement,n=pt(t).on("dragstart.drag",xt,_t);"onselectstart"in e?n.on("selectstart.drag",xt,_t):(e.__noselect=e.style.MozUserSelect,e.style.MozUserSelect="none")}(t.view),Mn(t),s.mouse=[u,this.__zoom.invert(u)],ne(this),s.start()}}function T(t,...e){if(r.apply(this,arguments)){var n=this.__zoom,s=It(t.changedTouches?t.changedTouches[0]:t,this),a=n.invert(s),u=n.k*(t.shiftKey?.5:2),f=o(g(m(n,u),s,a),i.apply(this,e),c);En(t),l>0?pt(this).transition().duration(l).call(_,f,s,t):pt(this).call(b.transform,f,s,t)}}function A(n,...i){if(r.apply(this,arguments)){var o,s,a,u,c=n.touches,l=c.length,f=x(this,i,n.changedTouches.length===l).event(n);for(Mn(n),s=0;s=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(s.targetTouches);try{for(f.s();!(u=f.n()).done;){var h=u.value;c+=h.clientX,l+=h.clientY}}catch(t){f.e(t)}finally{f.f()}c/=s.targetTouches.length,l/=s.targetTouches.length,o.zoom(n,o.pixToGeoX(c),o.pixToGeoY(l))}}a=e,o.onZoomFun&&o.onZoomFun(t)})).on("start",(function(t){o.canvasSave.c=document.createElement("canvas"),o.canvasSave.c.setAttribute("width",""+o.w),o.canvasSave.c.setAttribute("height",""+o.h),o.canvasSave.c.getContext("2d").drawImage(o.canvas,0,0),o.canvasSave.dx=0,o.canvasSave.dy=0,o.canvasSave.f=1,o.onZoomStartFun&&o.onZoomStartFun(t)})).on("end",(function(t){o.redraw(!0),o.canvasSave={c:null,dx:0,dy:0,f:1},o.onZoomEndFun&&o.onZoomEndFun(t)}))(pt(this.canvas))}this.zfExtent=[0,1/0],this.canvasSave={c:null,dx:0,dy:0,f:1}}var e,n,r;return e=t,n=[{key:"setCenter",value:function(t){this.center=t}},{key:"getCenter",value:function(){return this.center}},{key:"setZf",value:function(t){this.zf=t,this.slider&&this.slider.attr("value",+this.zf)}},{key:"getZf",value:function(){return this.zf}},{key:"setZfExtent",value:function(t){this.zfExtent=t}},{key:"getZfExtent",value:function(){return this.zfExtent}},{key:"initCanvasTransform",value:function(){this.ctx.setTransform(1,0,0,1,0,0)}},{key:"setCanvasTransform",value:function(){var t=1/this.getZf(),e=-this.center.x/this.getZf()+.5*this.w,n=this.center.y/this.getZf()+.5*this.h;this.ctx.setTransform(t,0,0,-t,e,n)}},{key:"getWebGLTransform",value:function(){var t=2/(this.w*this.getZf()),e=2/(this.h*this.getZf());return[t,0,0,0,e,0,-t*this.center.x,-e*this.center.y,1]}},{key:"redraw",value:function(){throw new Error("Method redraw not implemented.")}},{key:"clear",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"white";this.opts.transparentBackground?this.ctx.clearRect(0,0,this.w,this.h):(this.ctx&&(this.ctx.fillStyle=t),this.ctx.fillRect(0,0,this.w,this.h))}},{key:"pan",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.center.x+=t,this.center.y+=e,this.updateExtentGeo(),this.canvasSave.c&&(this.canvasSave.dx-=t/this.getZf(),this.canvasSave.dy+=e/this.getZf(),this.clear(this.backgroundColor),this.ctx.drawImage(this.canvasSave.c,this.canvasSave.dx,this.canvasSave.dy))}},{key:"zoom",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.center.x,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.center.y;if(!(this.zfExtent[0]==this.getZf()&&t<=1||this.zfExtent[1]==this.getZf()&&t>=1)){var r=t*this.getZf();rthis.zfExtent[1]&&(t=this.zfExtent[1]/this.getZf()),this.setZf(t*this.getZf());var i=(e-this.center.x)*(1-t);this.center.x+=i;var o=(n-this.center.y)*(1-t);this.center.y+=o,this.updateExtentGeo(),this.canvasSave.c&&(this.clear(this.backgroundColor),this.canvasSave.f/=t,this.canvasSave.dx=this.geoToPixX(e)*(1-this.canvasSave.f),this.canvasSave.dy=this.geoToPixY(n)*(1-this.canvasSave.f),this.clear(this.backgroundColor),this.ctx.drawImage(this.canvasSave.c,this.canvasSave.dx,this.canvasSave.dy,this.canvasSave.f*this.canvasSave.c.width,this.canvasSave.f*this.canvasSave.c.height))}}},{key:"updateExtentGeo",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:20;return this.extGeo={xMin:this.pixToGeoX(-t),xMax:this.pixToGeoX(this.w+t),yMin:this.pixToGeoY(this.h+t),yMax:this.pixToGeoY(-t)},this.extGeo}},{key:"toDraw",value:function(t){return!(t.xthis.extGeo.xMax||t.ythis.extGeo.yMax)}},{key:"geoToPixX",value:function(t){return(t-this.center.x)/this.getZf()+.5*this.w}},{key:"geoToPixY",value:function(t){return-(t-this.center.y)/this.getZf()+.5*this.h}},{key:"pixToGeoX",value:function(t){return(t-.5*this.w)*this.getZf()+this.center.x}},{key:"pixToGeoY",value:function(t){return-(t-.5*this.h)*this.getZf()+this.center.y}},{key:"setViewFromURL",value:function(){var e=t.getParameterByName("x"),n=t.getParameterByName("y"),r=t.getParameterByName("z"),i=this.getCenter();null==e||null==e||isNaN(+e)||(i.x=+e),null==n||null==n||isNaN(+n)||(i.y=+n),null==r||null==r||isNaN(+r)||this.setZf(+r)}},{key:"addZoomSlider",value:function(t,e){(e=e||{}).width=e.width||"30px",e.height=e.height||"300px";var n=pt("#"+t);if(n.empty())return console.error("Could not find div element to build zoom slider. Id: "+t),this;var r=this;return this.slider=n.append("input").attr("type","range").attr("min",this.getZfExtent()[0]).attr("max",this.getZfExtent()[1]).attr("value",this.getZf()).on("input",(function(t){if(this&&this.value){var e=+this.value;pt(this).attr("value",e),r.setZf(e),r.redraw()}})).style("width",e.width).style("height",e.height).style("opacity",.7).on("mouseover",(function(t){pt(this).style("opacity",1)})).on("mouseout",(function(t){pt(this).style("opacity",.7)})).style("-webkit-appearance","slider-vertical").style("writing-mode","bt-lr").attr("orient","vertical").style("background","lightgray").style("outline","none").style("-webkit-transition",".2s").style("transition","opacity .2s"),this}}],r=[{key:"getParameterByName",value:function(t){t=t.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var e=new RegExp("[\\?&]"+t+"=([^&#]*)").exec(location.search);return e?decodeURIComponent(e[1].replace(/\+/g," ")):null}}],n&&Nn(e.prototype,n),r&&Nn(e,r),Object.defineProperty(e,"prototype",{writable:!1}),t}();function zn(t){return zn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},zn(t)}function Un(t,e){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:{};if(function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),r=r||{},this.dataset=e,this.styles=n,this.visible=0!=r.visible,this.minZoom=r.minZoom||0,this.maxZoom=r.maxZoom||1/0,this.minZoom>=this.maxZoom)throw new Error("Unexpected zoom limits for layer. Zoom min should be smaller than zoom max.");this.pixNb=r.pixNb||3,this.cellInfoHTML=r.cellInfoHTML||t.defaultCellInfoHTML}var e,n,r;return e=t,r=[{key:"defaultCellInfoHTML",value:function(t){for(var e=[],n=0,r=Object.keys(t);n",i,""," : ",t[i],"
")}return e.join("")}}],(n=[{key:"getDatasetComponent",value:function(t){if(!(tthis.maxZoom)){if(1==this.dataset.datasetComponents.length)return this.dataset.datasetComponents[0];for(var e=this.dataset.resolutions,n=0,r=e[n]/this.pixNb;r=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function Gn(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n2&&void 0!==arguments[2]?arguments[2]:{};if(function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),r=r||{},this.datasetComponents=e,this.resolutions=n,this.datasetComponents.length>1&&this.datasetComponents.length!=this.resolutions.length)throw new Error("Uncompatible number of datasets and resolutions: "+this.datasetComponents.length+" "+this.resolutions.length);r.preprocess&&this.setPrepocesses(r.preprocess)}var e,n,r;return e=t,r=[{key:"make",value:function(e,n,r){var i,o=[],s=$n(e);try{for(s.s();!(i=s.n()).done;){var a=i.value;o.push(n(a))}}catch(t){s.e(t)}finally{s.f()}return new t(o,e,r)}}],(n=[{key:"setPrepocesses",value:function(t){var e,n=$n(this.datasetComponents);try{for(n.s();!(e=n.n()).done;)e.value.preprocess=t}catch(t){n.e(t)}finally{n.f()}return this}}])&&Yn(e.prototype,n),r&&Yn(e,r),Object.defineProperty(e,"prototype",{writable:!1}),t}();function Hn(t){return Hn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Hn(t)}function qn(t,e){for(var n=0;nn.left+r-e.clientWidth){var o=t.x-e.clientWidth-this.xOffset;if(e.style.left=o+"px",e.offsetLeft+e.clientWidth>t.x){var s=t.x-(e.clientWidth+this.xOffset);e.style.left=s+"px"}}e.offsetTop+e.clientHeight>n.top+i&&(e.style.top=e.offsetTop-e.clientHeight+"px")},(r=Xn(r="ensureTooltipInsideContainer"))in n?Object.defineProperty(n,r,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[r]=i,e=e||{},this.div=e.div||"tooltip_eurostat",this.maxWidth=e.maxWidth||"20em",this.fontSize=e.fontSize||"1.2em",this.background=e.background||"white",this.padding=e.padding||"5px",this.border=e.border||"0px",this["border-radius"]=e["border-radius"]||"5px",this["box-shadow"]=e["box-shadow"]||"5px 5px 5px grey",this["font-family"]=e["font-family"]||"Helvetica, Arial, sans-serif",this.transitionDuration=e.transitionDuration||100,this.xOffset=e.xOffset||30,this.yOffset=e.yOffset||20,this.yMouseOffset=e.yMouseOffset||0,this.xMouseOffset=e.xMouseOffset||0,this.parentElement=e.parentElement||document.body,this.tooltip=pt("#"+this.div),this.tooltip.empty()&&(this.tooltip=pt("#"+this.parentElement.id).append("div").attr("id",this.div)),this.tooltip.style("max-width",this.maxWidth),this.tooltip.style("overflow","hidden"),this.tooltip.style("font-size",this.fontSize),this.tooltip.style("background",this.background),this.tooltip.style("padding",this.padding),this.tooltip.style("border",this.border),this.tooltip.style("border-radius",this["border-radius"]),this.tooltip.style("box-shadow",this["box-shadow"]),this.tooltip.style("font-family",this["font-family"]),this.tooltip.style("position","absolute"),this.tooltip.style("pointer-events","none"),this.tooltip.style("opacity","0"),this.tooltip.attr("role","tooltip").attr("aria-live","polite")}var e,n;return e=t,n=[{key:"show",value:function(){this.tooltip.transition().duration(this.transitionDuration).style("opacity",1)}},{key:"hide",value:function(){this.tooltip.transition().duration(this.transitionDuration).style("opacity",0)}},{key:"html",value:function(t){this.tooltip.html(t)}},{key:"setPosition",value:function(t){this.tooltip.style("left",t.pageX+this.xOffset+"px").style("top",t.pageY-this.yOffset+"px"),this.ensureTooltipInsideContainer(t)}},{key:"style",value:function(t,e){return 1==arguments.length?this.tooltip.style(t):(this.tooltip.style(t,e),this)}},{key:"attr",value:function(t,e){return 1==arguments.length?this.tooltip.attr(t):(this.tooltip.attr(t,e),this)}}],n&&qn(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}(),Jn={},Qn={};function tr(t){return new Function("d","return {"+t.map((function(t,e){return JSON.stringify(t)+": d["+e+'] || ""'})).join(",")+"}")}function er(t){var e=Object.create(null),n=[];return t.forEach((function(t){for(var r in t)r in e||n.push(e[r]=r)})),n}function nr(t,e){var n=t+"",r=n.length;return r=o?u=!0:10===(r=t.charCodeAt(s++))?c=!0:13===r&&(c=!0,10===t.charCodeAt(s)&&++s),t.slice(i+1,e-1).replace(/""/g,'"')}for(;s9999?"+"+nr(r,6):nr(r,4))+"-"+nr(n.getUTCMonth()+1,2)+"-"+nr(n.getUTCDate(),2)+(a?"T"+nr(i,2)+":"+nr(o,2)+":"+nr(s,2)+"."+nr(a,3)+"Z":s?"T"+nr(i,2)+":"+nr(o,2)+":"+nr(s,2)+"Z":o||i?"T"+nr(i,2)+":"+nr(o,2)+"Z":"")):e.test(t+="")?'"'+t.replace(/"/g,'""')+'"':t;var n,r,i,o,s,a}return{parse:function(t,e){var n,i,o=r(t,(function(t,r){if(n)return n(t,r-1);i=t,n=e?function(t,e){var n=tr(t);return function(r,i){return e(n(r),i,t)}}(t,e):tr(t)}));return o.columns=i||[],o},parseRows:r,format:function(e,n){return null==n&&(n=er(e)),[n.map(s).join(t)].concat(i(e,n)).join("\n")},formatBody:function(t,e){return null==e&&(e=er(t)),i(t,e).join("\n")},formatRows:function(t){return t.map(o).join("\n")},formatRow:o,formatValue:s}}var ir=rr(","),or=ir.parse,sr=(ir.parseRows,ir.format,ir.formatBody,ir.formatRows,ir.formatRow,ir.formatValue,rr("\t")),ar=sr.parse;function ur(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);return t.text()}function cr(t){return function(e,n,r){return 2===arguments.length&&"function"==typeof n&&(r=n,n=void 0),function(t,e){return fetch(t,e).then(ur)}(e,n).then((function(e){return t(e,r)}))}}sr.parseRows,sr.format,sr.formatBody,sr.formatRows,sr.formatRow,sr.formatValue;var lr=cr(or);function fr(t){return fr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},fr(t)}function hr(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n2&&void 0!==arguments[2]?arguments[2]:{};!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),r=r||{},this.url=e,this.resolution=n,this.preprocess=r.preprocess||void 0,this.cellsViewCache=[]}var e,n;return e=t,(n=[{key:"getData",value:function(t,e){throw new Error("Method getData not implemented.")}},{key:"updateViewCache",value:function(t){throw new Error("Method updateViewCache not implemented.")}},{key:"getCellFromPosition",value:function(t,e){var n,r=this.getResolution(),i=r*Math.floor(t.x/r),o=r*Math.floor(t.y/r),s=function(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return hr(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?hr(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,i=function(){};return{s:i,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(e);try{for(s.s();!(n=s.n()).done;){var a=n.value;if(a.x==i&&a.y==o)return a}}catch(t){s.e(t)}finally{s.f()}}},{key:"getResolution",value:function(){return this.resolution}},{key:"getViewCache",value:function(){return this.cellsViewCache}}])&&dr(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();function yr(t){return yr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},yr(t)}function vr(){vr=function(){return t};var t={},e=Object.prototype,n=e.hasOwnProperty,r=Object.defineProperty||function(t,e,n){t[e]=n.value},i="function"==typeof Symbol?Symbol:{},o=i.iterator||"@@iterator",s=i.asyncIterator||"@@asyncIterator",a=i.toStringTag||"@@toStringTag";function u(t,e,n){return Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{u({},"")}catch(t){u=function(t,e,n){return t[e]=n}}function c(t,e,n,i){var o=e&&e.prototype instanceof h?e:h,s=Object.create(o.prototype),a=new I(i||[]);return r(s,"_invoke",{value:_(t,n,a)}),s}function l(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(t){return{type:"throw",arg:t}}}t.wrap=c;var f={};function h(){}function d(){}function p(){}var y={};u(y,o,(function(){return this}));var v=Object.getPrototypeOf,b=v&&v(v(T([])));b&&b!==e&&n.call(b,o)&&(y=b);var m=p.prototype=h.prototype=Object.create(y);function g(t){["next","throw","return"].forEach((function(e){u(t,e,(function(t){return this._invoke(e,t)}))}))}function w(t,e){function i(r,o,s,a){var u=l(t[r],t,o);if("throw"!==u.type){var c=u.arg,f=c.value;return f&&"object"==yr(f)&&n.call(f,"__await")?e.resolve(f.__await).then((function(t){i("next",t,s,a)}),(function(t){i("throw",t,s,a)})):e.resolve(f).then((function(t){c.value=t,s(c)}),(function(t){return i("throw",t,s,a)}))}a(u.arg)}var o;r(this,"_invoke",{value:function(t,n){function r(){return new e((function(e,r){i(t,n,e,r)}))}return o=o?o.then(r,r):r()}})}function _(t,e,n){var r="suspendedStart";return function(i,o){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===i)throw o;return{value:void 0,done:!0}}for(n.method=i,n.arg=o;;){var s=n.delegate;if(s){var a=x(s,n);if(a){if(a===f)continue;return a}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var u=l(t,e,n);if("normal"===u.type){if(r=n.done?"completed":"suspendedYield",u.arg===f)continue;return{value:u.arg,done:n.done}}"throw"===u.type&&(r="completed",n.method="throw",n.arg=u.arg)}}}function x(t,e){var n=e.method,r=t.iterator[n];if(void 0===r)return e.delegate=null,"throw"===n&&t.iterator.return&&(e.method="return",e.arg=void 0,x(t,e),"throw"===e.method)||"return"!==n&&(e.method="throw",e.arg=new TypeError("The iterator does not provide a '"+n+"' method")),f;var i=l(r,t.iterator,e.arg);if("throw"===i.type)return e.method="throw",e.arg=i.arg,e.delegate=null,f;var o=i.arg;return o?o.done?(e[t.resultName]=o.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=void 0),e.delegate=null,f):o:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,f)}function S(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function O(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function I(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(S,this),this.reset(!0)}function T(t){if(t){var e=t[o];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var r=-1,i=function e(){for(;++r=0;--i){var o=this.tryEntries[i],s=o.completion;if("root"===o.tryLoc)return r("end");if(o.tryLoc<=this.prev){var a=n.call(o,"catchLoc"),u=n.call(o,"finallyLoc");if(a&&u){if(this.prev=0;--r){var i=this.tryEntries[r];if(i.tryLoc<=this.prev&&n.call(i,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),O(n),f}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var i=r.arg;O(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:T(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=void 0),f}},t}function br(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return mr(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?mr(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,i=function(){};return{s:i,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function mr(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n2&&void 0!==arguments[2]?arguments[2]:{};return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),(n=o.call(this,t,e,r)).cells=[],n.infoLoadingStatus="notLoaded",n}return e=s,n=[{key:"getData",value:function(t,e){var n,r=this;return"notLoaded"!=this.infoLoadingStatus||(this.infoLoadingStatus="loading",(n=vr().mark((function t(){var n,i,o,s,a,u,c;return vr().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,lr(r.url);case 3:n=t.sent,i=br(n);try{for(i.s();!(o=i.n()).done;)(s=o.value).x=+s.x,s.y=+s.y}catch(t){i.e(t)}finally{i.f()}if(!r.preprocess){t.next=29;break}r.cells=[],a=br(n),t.prev=9,a.s();case 11:if((u=a.n()).done){t.next=19;break}if(c=u.value,0!=r.preprocess(c)){t.next=16;break}return t.abrupt("continue",17);case 16:r.cells.push(c);case 17:t.next=11;break;case 19:t.next=24;break;case 21:t.prev=21,t.t0=t.catch(9),a.e(t.t0);case 24:return t.prev=24,a.f(),t.finish(24);case 27:t.next=30;break;case 29:r.cells=n;case 30:e&&e(),r.infoLoadingStatus="loaded",t.next=38;break;case 34:t.prev=34,t.t1=t.catch(0),r.infoLoadingStatus="failed",r.cells=[];case 38:case"end":return t.stop()}}),t,null,[[0,34],[9,21,24,27]])})),function(){var t=this,e=arguments;return new Promise((function(r,i){var o=n.apply(t,e);function s(t){gr(o,r,i,s,a,"next",t)}function a(t){gr(o,r,i,s,a,"throw",t)}s(void 0)}))})()),this}},{key:"updateViewCache",value:function(t){if(this.cells){this.cellsViewCache=[];var e,n=br(this.cells);try{for(n.s();!(e=n.n()).done;){var r=e.value;+r.x+this.resolutiont.xMax||+r.y+this.resolutiont.yMax||this.cellsViewCache.push(r)}}catch(t){n.e(t)}finally{n.f()}}}}],n&&wr(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),s}(pr);function Or(t){return Or="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Or(t)}function Ir(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(this.cells);try{for(u.s();!(a=u.n()).done;){var c=a.value;c.x=this.extGeo.xMin+c.x*o,c.y=this.extGeo.yMin+c.y*o}}catch(t){u.e(t)}finally{u.f()}}));function Vr(t,e){if(e){if(0==e.length)return 0;if(t<=e[0])return 0;for(var n=1;nGr(t)))}]`:`[${t}]`:ArrayBuffer.isView(t)?`[${t}]`:JSON.stringify(t,((t,e)=>"bigint"==typeof e?`${e}`:e))}function Yr(t,e,n,r){return new(n||(n=Promise))((function(i,o){function s(t){try{u(r.next(t))}catch(t){o(t)}}function a(t){try{u(r.throw(t))}catch(t){o(t)}}function u(t){var e;t.done?i(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,a)}u((r=r.apply(t,e||[])).next())}))}function Zr(t){return this instanceof Zr?(this.v=t,this):new Zr(t)}function Hr(t,e,n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var r,i=n.apply(t,e||[]),o=[];return r={},s("next"),s("throw"),s("return"),r[Symbol.asyncIterator]=function(){return this},r;function s(t){i[t]&&(r[t]=function(e){return new Promise((function(n,r){o.push([t,e,n,r])>1||a(t,e)}))})}function a(t,e){try{(n=i[t](e)).value instanceof Zr?Promise.resolve(n.value.v).then(u,c):l(o[0][2],n)}catch(t){l(o[0][3],t)}var n}function u(t){a("next",t)}function c(t){a("throw",t)}function l(t,e){t(e),o.shift(),o.length&&a(o[0][0],o[0][1])}}function qr(t){var e,n;return e={},r("next"),r("throw",(function(t){throw t})),r("return"),e[Symbol.iterator]=function(){return this},e;function r(r,i){e[r]=t[r]?function(e){return(n=!n)?{value:Zr(t[r](e)),done:!1}:i?i(e):e}:i}}function Xr(t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var e,n=t[Symbol.asyncIterator];return n?n.call(t):(t=function(t){var e="function"==typeof Symbol&&Symbol.iterator,n=e&&t[e],r=0;if(n)return n.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}(t),e={},r("next"),r("throw"),r("return"),e[Symbol.asyncIterator]=function(){return this},e);function r(n){e[n]=t[n]&&function(e){return new Promise((function(r,i){!function(t,e,n,r){Promise.resolve(r).then((function(e){t({value:e,done:n})}),e)}(r,i,(e=t[n](e)).done,e.value)}))}}}!function(t){t[t.V1=0]="V1",t[t.V2=1]="V2",t[t.V3=2]="V3",t[t.V4=3]="V4",t[t.V5=4]="V5"}(Mr||(Mr={})),(zr=Er||(Er={}))[zr.Sparse=0]="Sparse",zr[zr.Dense=1]="Dense",function(t){t[t.HALF=0]="HALF",t[t.SINGLE=1]="SINGLE",t[t.DOUBLE=2]="DOUBLE"}(Cr||(Cr={})),(Rr=Pr||(Pr={}))[Rr.DAY=0]="DAY",Rr[Rr.MILLISECOND=1]="MILLISECOND",(Nr=jr||(jr={}))[Nr.SECOND=0]="SECOND",Nr[Nr.MILLISECOND=1]="MILLISECOND",Nr[Nr.MICROSECOND=2]="MICROSECOND",Nr[Nr.NANOSECOND=3]="NANOSECOND",(Dr=kr||(kr={}))[Dr.YEAR_MONTH=0]="YEAR_MONTH",Dr[Dr.DAY_TIME=1]="DAY_TIME",Dr[Dr.MONTH_DAY_NANO=2]="MONTH_DAY_NANO",function(t){t[t.NONE=0]="NONE",t[t.Schema=1]="Schema",t[t.DictionaryBatch=2]="DictionaryBatch",t[t.RecordBatch=3]="RecordBatch",t[t.Tensor=4]="Tensor",t[t.SparseTensor=5]="SparseTensor"}(Br||(Br={})),function(t){t[t.NONE=0]="NONE",t[t.Null=1]="Null",t[t.Int=2]="Int",t[t.Float=3]="Float",t[t.Binary=4]="Binary",t[t.Utf8=5]="Utf8",t[t.Bool=6]="Bool",t[t.Decimal=7]="Decimal",t[t.Date=8]="Date",t[t.Time=9]="Time",t[t.Timestamp=10]="Timestamp",t[t.Interval=11]="Interval",t[t.List=12]="List",t[t.Struct=13]="Struct",t[t.Union=14]="Union",t[t.FixedSizeBinary=15]="FixedSizeBinary",t[t.FixedSizeList=16]="FixedSizeList",t[t.Map=17]="Map",t[t.Dictionary=-1]="Dictionary",t[t.Int8=-2]="Int8",t[t.Int16=-3]="Int16",t[t.Int32=-4]="Int32",t[t.Int64=-5]="Int64",t[t.Uint8=-6]="Uint8",t[t.Uint16=-7]="Uint16",t[t.Uint32=-8]="Uint32",t[t.Uint64=-9]="Uint64",t[t.Float16=-10]="Float16",t[t.Float32=-11]="Float32",t[t.Float64=-12]="Float64",t[t.DateDay=-13]="DateDay",t[t.DateMillisecond=-14]="DateMillisecond",t[t.TimestampSecond=-15]="TimestampSecond",t[t.TimestampMillisecond=-16]="TimestampMillisecond",t[t.TimestampMicrosecond=-17]="TimestampMicrosecond",t[t.TimestampNanosecond=-18]="TimestampNanosecond",t[t.TimeSecond=-19]="TimeSecond",t[t.TimeMillisecond=-20]="TimeMillisecond",t[t.TimeMicrosecond=-21]="TimeMicrosecond",t[t.TimeNanosecond=-22]="TimeNanosecond",t[t.DenseUnion=-23]="DenseUnion",t[t.SparseUnion=-24]="SparseUnion",t[t.IntervalDayTime=-25]="IntervalDayTime",t[t.IntervalYearMonth=-26]="IntervalYearMonth"}(Fr||(Fr={})),function(t){t[t.OFFSET=0]="OFFSET",t[t.DATA=1]="DATA",t[t.VALIDITY=2]="VALIDITY",t[t.TYPE=3]="TYPE"}(Lr||(Lr={})),Object.create,Object.create;const Kr=new TextDecoder("utf-8"),Jr=t=>Kr.decode(t),Qr=new TextEncoder,ti=t=>Qr.encode(t),[ei,ni]=(()=>{const t=()=>{throw new Error("BigInt is not available in this environment")};function e(){throw t()}return e.asIntN=()=>{throw t()},e.asUintN=()=>{throw t()},"undefined"!=typeof BigInt?[BigInt,!0]:[e,!1]})(),[ri,ii]=(()=>{const t=()=>{throw new Error("BigInt64Array is not available in this environment")};return"undefined"!=typeof BigInt64Array?[BigInt64Array,!0]:[class{static get BYTES_PER_ELEMENT(){return 8}static of(){throw t()}static from(){throw t()}constructor(){throw t()}},!1]})(),[oi,si]=(()=>{const t=()=>{throw new Error("BigUint64Array is not available in this environment")};return"undefined"!=typeof BigUint64Array?[BigUint64Array,!0]:[class{static get BYTES_PER_ELEMENT(){return 8}static of(){throw t()}static from(){throw t()}constructor(){throw t()}},!1]})(),ai=t=>"function"==typeof t,ui=t=>null!=t&&Object(t)===t,ci=t=>ui(t)&&ai(t.then),li=t=>ui(t)&&ai(t[Symbol.iterator]),fi=t=>ui(t)&&ai(t[Symbol.asyncIterator]),hi=t=>ui(t)&&ui(t.schema),di=t=>ui(t)&&"done"in t&&"value"in t,pi=t=>ui(t)&&ai(t.stat)&&(t=>"number"==typeof t)(t.fd),yi=t=>ui(t)&&bi(t.body),vi=t=>"_getDOMStream"in t&&"_getNodeStream"in t,bi=t=>ui(t)&&ai(t.cancel)&&ai(t.getReader)&&!vi(t),mi=t=>ui(t)&&ai(t.read)&&ai(t.pipe)&&(t=>"boolean"==typeof t)(t.readable)&&!vi(t),gi=t=>ui(t)&&ai(t.clear)&&ai(t.bytes)&&ai(t.position)&&ai(t.setPosition)&&ai(t.capacity)&&ai(t.getBufferIdentifier)&&ai(t.createLong),wi="undefined"!=typeof SharedArrayBuffer?SharedArrayBuffer:ArrayBuffer;function _i(t,e,n=0,r=e.byteLength){const i=t.byteLength,o=new Uint8Array(t.buffer,t.byteOffset,i),s=new Uint8Array(e.buffer,e.byteOffset,Math.min(r,i));return o.set(s,n),t}function xi(t,e){const n=function(t){const e=t[0]?[t[0]]:[];let n,r,i,o;for(let s,a,u=0,c=0,l=t.length;++ut+e.byteLength),0);let i,o,s,a=0,u=-1;const c=Math.min(e||Number.POSITIVE_INFINITY,r);for(const t=n.length;++uSi(Int32Array,t),Ii=t=>Si(Uint8Array,t),Ti=t=>(t.next(),t);function Ai(t,e){return Hr(this,arguments,(function*(){if(ci(e))return yield Zr(yield Zr(yield*qr(Xr(Ai(t,yield Zr(e))))));const n=function(t){return Hr(this,arguments,(function*(){yield yield Zr(yield Zr(t))}))},r="string"==typeof e||ArrayBuffer.isView(e)||e instanceof ArrayBuffer||e instanceof wi?n(e):li(e)?function(t){return Hr(this,arguments,(function*(){yield Zr(yield*qr(Xr(Ti(function*(t){let e=null;do{e=t.next(yield null==e?void 0:e.value)}while(!e.done)}(t[Symbol.iterator]())))))}))}(e):fi(e)?e:n(e);return yield Zr(yield*qr(Xr(Ti(function(e){return Hr(this,arguments,(function*(){let n=null;do{n=yield Zr(e.next(yield yield Zr(Si(t,n))))}while(!n.done)}))}(r[Symbol.asyncIterator]()))))),yield Zr(new t)}))}const Mi=Symbol.for("isArrowBigNum");function Ei(t,...e){return 0===e.length?Object.setPrototypeOf(Si(this.TypedArray,t),this.constructor.prototype):Object.setPrototypeOf(new this.TypedArray(t,...e),this.constructor.prototype)}function Ci(...t){return Ei.apply(this,t)}function Pi(...t){return Ei.apply(this,t)}function ji(...t){return Ei.apply(this,t)}function ki(t){const{buffer:e,byteOffset:n,length:r,signed:i}=t,o=new oi(e,n,r),s=i&&o[o.length-1]&BigInt(1)<8===t.byteLength?new t.BigIntArray(t.buffer,t.byteOffset,1)[0]:Li(t),Bi=t=>8===t.byteLength?`${new t.BigIntArray(t.buffer,t.byteOffset,1)[0]}`:Li(t)):(Bi=Li,Fi=Bi);class Di{static new(t,e){switch(e){case!0:return new Ci(t);case!1:return new Pi(t)}switch(t.constructor){case Int8Array:case Int16Array:case Int32Array:case ri:return new Ci(t)}return 16===t.byteLength?new ji(t):new Pi(t)}static signed(t){return new Ci(t)}static unsigned(t){return new Pi(t)}static decimal(t){return new ji(t)}constructor(t,e){return Di.new(t,e)}}var Ni,Ri,zi,Ui,Vi,Wi,$i,Gi,Yi,Zi,Hi,qi,Xi,Ki,Ji,Qi,to,eo,no,ro;class io{static isNull(t){return(null==t?void 0:t.typeId)===Fr.Null}static isInt(t){return(null==t?void 0:t.typeId)===Fr.Int}static isFloat(t){return(null==t?void 0:t.typeId)===Fr.Float}static isBinary(t){return(null==t?void 0:t.typeId)===Fr.Binary}static isUtf8(t){return(null==t?void 0:t.typeId)===Fr.Utf8}static isBool(t){return(null==t?void 0:t.typeId)===Fr.Bool}static isDecimal(t){return(null==t?void 0:t.typeId)===Fr.Decimal}static isDate(t){return(null==t?void 0:t.typeId)===Fr.Date}static isTime(t){return(null==t?void 0:t.typeId)===Fr.Time}static isTimestamp(t){return(null==t?void 0:t.typeId)===Fr.Timestamp}static isInterval(t){return(null==t?void 0:t.typeId)===Fr.Interval}static isList(t){return(null==t?void 0:t.typeId)===Fr.List}static isStruct(t){return(null==t?void 0:t.typeId)===Fr.Struct}static isUnion(t){return(null==t?void 0:t.typeId)===Fr.Union}static isFixedSizeBinary(t){return(null==t?void 0:t.typeId)===Fr.FixedSizeBinary}static isFixedSizeList(t){return(null==t?void 0:t.typeId)===Fr.FixedSizeList}static isMap(t){return(null==t?void 0:t.typeId)===Fr.Map}static isDictionary(t){return(null==t?void 0:t.typeId)===Fr.Dictionary}static isDenseUnion(t){return io.isUnion(t)&&t.mode===Er.Dense}static isSparseUnion(t){return io.isUnion(t)&&t.mode===Er.Sparse}get typeId(){return Fr.NONE}}Ni=Symbol.toStringTag,io[Ni]=((ro=io.prototype).children=null,ro.ArrayType=Array,ro[Symbol.toStringTag]="DataType");class oo extends io{toString(){return"Null"}get typeId(){return Fr.Null}}Ri=Symbol.toStringTag,oo[Ri]=(t=>t[Symbol.toStringTag]="Null")(oo.prototype);class so extends io{constructor(t,e){super(),this.isSigned=t,this.bitWidth=e}get typeId(){return Fr.Int}get ArrayType(){switch(this.bitWidth){case 8:return this.isSigned?Int8Array:Uint8Array;case 16:return this.isSigned?Int16Array:Uint16Array;case 32:return this.isSigned?Int32Array:Uint32Array;case 64:return this.isSigned?BigInt64Array:BigUint64Array}throw new Error(`Unrecognized ${this[Symbol.toStringTag]} type`)}toString(){return`${this.isSigned?"I":"Ui"}nt${this.bitWidth}`}}zi=Symbol.toStringTag,so[zi]=(t=>(t.isSigned=null,t.bitWidth=null,t[Symbol.toStringTag]="Int"))(so.prototype);class ao extends so{constructor(){super(!0,32)}get ArrayType(){return Int32Array}}Object.defineProperty(class extends so{constructor(){super(!0,8)}get ArrayType(){return Int8Array}}.prototype,"ArrayType",{value:Int8Array}),Object.defineProperty(class extends so{constructor(){super(!0,16)}get ArrayType(){return Int16Array}}.prototype,"ArrayType",{value:Int16Array}),Object.defineProperty(ao.prototype,"ArrayType",{value:Int32Array}),Object.defineProperty(class extends so{constructor(){super(!0,64)}get ArrayType(){return BigInt64Array}}.prototype,"ArrayType",{value:BigInt64Array}),Object.defineProperty(class extends so{constructor(){super(!1,8)}get ArrayType(){return Uint8Array}}.prototype,"ArrayType",{value:Uint8Array}),Object.defineProperty(class extends so{constructor(){super(!1,16)}get ArrayType(){return Uint16Array}}.prototype,"ArrayType",{value:Uint16Array}),Object.defineProperty(class extends so{constructor(){super(!1,32)}get ArrayType(){return Uint32Array}}.prototype,"ArrayType",{value:Uint32Array}),Object.defineProperty(class extends so{constructor(){super(!1,64)}get ArrayType(){return BigUint64Array}}.prototype,"ArrayType",{value:BigUint64Array});class uo extends io{constructor(t){super(),this.precision=t}get typeId(){return Fr.Float}get ArrayType(){switch(this.precision){case Cr.HALF:return Uint16Array;case Cr.SINGLE:return Float32Array;case Cr.DOUBLE:return Float64Array}throw new Error(`Unrecognized ${this[Symbol.toStringTag]} type`)}toString(){return`Float${this.precision<<5||16}`}}Ui=Symbol.toStringTag,uo[Ui]=(t=>(t.precision=null,t[Symbol.toStringTag]="Float"))(uo.prototype),Object.defineProperty(class extends uo{constructor(){super(Cr.HALF)}}.prototype,"ArrayType",{value:Uint16Array}),Object.defineProperty(class extends uo{constructor(){super(Cr.SINGLE)}}.prototype,"ArrayType",{value:Float32Array}),Object.defineProperty(class extends uo{constructor(){super(Cr.DOUBLE)}}.prototype,"ArrayType",{value:Float64Array});class co extends io{constructor(){super()}get typeId(){return Fr.Binary}toString(){return"Binary"}}Vi=Symbol.toStringTag,co[Vi]=(t=>(t.ArrayType=Uint8Array,t[Symbol.toStringTag]="Binary"))(co.prototype);class lo extends io{constructor(){super()}get typeId(){return Fr.Utf8}toString(){return"Utf8"}}Wi=Symbol.toStringTag,lo[Wi]=(t=>(t.ArrayType=Uint8Array,t[Symbol.toStringTag]="Utf8"))(lo.prototype);class fo extends io{constructor(){super()}get typeId(){return Fr.Bool}toString(){return"Bool"}}$i=Symbol.toStringTag,fo[$i]=(t=>(t.ArrayType=Uint8Array,t[Symbol.toStringTag]="Bool"))(fo.prototype);class ho extends io{constructor(t,e,n=128){super(),this.scale=t,this.precision=e,this.bitWidth=n}get typeId(){return Fr.Decimal}toString(){return`Decimal[${this.precision}e${this.scale>0?"+":""}${this.scale}]`}}Gi=Symbol.toStringTag,ho[Gi]=(t=>(t.scale=null,t.precision=null,t.ArrayType=Uint32Array,t[Symbol.toStringTag]="Decimal"))(ho.prototype);class po extends io{constructor(t){super(),this.unit=t}get typeId(){return Fr.Date}toString(){return`Date${32*(this.unit+1)}<${Pr[this.unit]}>`}}Yi=Symbol.toStringTag,po[Yi]=(t=>(t.unit=null,t.ArrayType=Int32Array,t[Symbol.toStringTag]="Date"))(po.prototype);class yo extends io{constructor(t,e){super(),this.unit=t,this.bitWidth=e}get typeId(){return Fr.Time}toString(){return`Time${this.bitWidth}<${jr[this.unit]}>`}get ArrayType(){switch(this.bitWidth){case 32:return Int32Array;case 64:return BigInt64Array}throw new Error(`Unrecognized ${this[Symbol.toStringTag]} type`)}}Zi=Symbol.toStringTag,yo[Zi]=(t=>(t.unit=null,t.bitWidth=null,t[Symbol.toStringTag]="Time"))(yo.prototype);class vo extends io{constructor(t,e){super(),this.unit=t,this.timezone=e}get typeId(){return Fr.Timestamp}toString(){return`Timestamp<${jr[this.unit]}${this.timezone?`, ${this.timezone}`:""}>`}}Hi=Symbol.toStringTag,vo[Hi]=(t=>(t.unit=null,t.timezone=null,t.ArrayType=Int32Array,t[Symbol.toStringTag]="Timestamp"))(vo.prototype);class bo extends io{constructor(t){super(),this.unit=t}get typeId(){return Fr.Interval}toString(){return`Interval<${kr[this.unit]}>`}}qi=Symbol.toStringTag,bo[qi]=(t=>(t.unit=null,t.ArrayType=Int32Array,t[Symbol.toStringTag]="Interval"))(bo.prototype);class mo extends io{constructor(t){super(),this.children=[t]}get typeId(){return Fr.List}toString(){return`List<${this.valueType}>`}get valueType(){return this.children[0].type}get valueField(){return this.children[0]}get ArrayType(){return this.valueType.ArrayType}}Xi=Symbol.toStringTag,mo[Xi]=(t=>(t.children=null,t[Symbol.toStringTag]="List"))(mo.prototype);class go extends io{constructor(t){super(),this.children=t}get typeId(){return Fr.Struct}toString(){return`Struct<{${this.children.map((t=>`${t.name}:${t.type}`)).join(", ")}}>`}}Ki=Symbol.toStringTag,go[Ki]=(t=>(t.children=null,t[Symbol.toStringTag]="Struct"))(go.prototype);class wo extends io{constructor(t,e,n){super(),this.mode=t,this.children=n,this.typeIds=e=Int32Array.from(e),this.typeIdToChildIndex=e.reduce(((t,e,n)=>(t[e]=n)&&t||t),Object.create(null))}get typeId(){return Fr.Union}toString(){return`${this[Symbol.toStringTag]}<${this.children.map((t=>`${t.type}`)).join(" | ")}>`}}Ji=Symbol.toStringTag,wo[Ji]=(t=>(t.mode=null,t.typeIds=null,t.children=null,t.typeIdToChildIndex=null,t.ArrayType=Int8Array,t[Symbol.toStringTag]="Union"))(wo.prototype);class _o extends io{constructor(t){super(),this.byteWidth=t}get typeId(){return Fr.FixedSizeBinary}toString(){return`FixedSizeBinary[${this.byteWidth}]`}}Qi=Symbol.toStringTag,_o[Qi]=(t=>(t.byteWidth=null,t.ArrayType=Uint8Array,t[Symbol.toStringTag]="FixedSizeBinary"))(_o.prototype);class xo extends io{constructor(t,e){super(),this.listSize=t,this.children=[e]}get typeId(){return Fr.FixedSizeList}get valueType(){return this.children[0].type}get valueField(){return this.children[0]}get ArrayType(){return this.valueType.ArrayType}toString(){return`FixedSizeList[${this.listSize}]<${this.valueType}>`}}to=Symbol.toStringTag,xo[to]=(t=>(t.children=null,t.listSize=null,t[Symbol.toStringTag]="FixedSizeList"))(xo.prototype);class So extends io{constructor(t,e=!1){super(),this.children=[t],this.keysSorted=e}get typeId(){return Fr.Map}get keyType(){return this.children[0].type.children[0].type}get valueType(){return this.children[0].type.children[1].type}get childType(){return this.children[0].type}toString(){return`Map<{${this.children[0].type.children.map((t=>`${t.name}:${t.type}`)).join(", ")}}>`}}eo=Symbol.toStringTag,So[eo]=(t=>(t.children=null,t.keysSorted=null,t[Symbol.toStringTag]="Map_"))(So.prototype);const Oo=(Io=-1,()=>++Io);var Io;class To extends io{constructor(t,e,n,r){super(),this.indices=e,this.dictionary=t,this.isOrdered=r||!1,this.id=null==n?Oo():"number"==typeof n?n:n.low}get typeId(){return Fr.Dictionary}get children(){return this.dictionary.children}get valueType(){return this.dictionary}get ArrayType(){return this.dictionary.ArrayType}toString(){return`Dictionary<${this.indices}, ${this.dictionary}>`}}function Ao(t){const e=t;switch(t.typeId){case Fr.Decimal:return t.bitWidth/32;case Fr.Timestamp:return 2;case Fr.Date:case Fr.Interval:return 1+e.unit;case Fr.FixedSizeList:return e.listSize;case Fr.FixedSizeBinary:return e.byteWidth;default:return 1}}no=Symbol.toStringTag,To[no]=(t=>(t.id=null,t.indices=null,t.isOrdered=null,t.dictionary=null,t[Symbol.toStringTag]="Dictionary"))(To.prototype);class Mo{visitMany(t,...e){return t.map(((t,n)=>this.visit(t,...e.map((t=>t[n])))))}visit(...t){return this.getVisitFn(t[0],!1).apply(this,t)}getVisitFn(t,e=!0){return function(t,e,n=!0){return"number"==typeof e?Eo(t,e,n):"string"==typeof e&&e in Fr?Eo(t,Fr[e],n):e&&e instanceof io?Eo(t,Co(e),n):(null==e?void 0:e.type)&&e.type instanceof io?Eo(t,Co(e.type),n):Eo(t,Fr.NONE,n)}(this,t,e)}getVisitFnByTypeId(t,e=!0){return Eo(this,t,e)}visitNull(t,...e){return null}visitBool(t,...e){return null}visitInt(t,...e){return null}visitFloat(t,...e){return null}visitUtf8(t,...e){return null}visitBinary(t,...e){return null}visitFixedSizeBinary(t,...e){return null}visitDate(t,...e){return null}visitTimestamp(t,...e){return null}visitTime(t,...e){return null}visitDecimal(t,...e){return null}visitList(t,...e){return null}visitStruct(t,...e){return null}visitUnion(t,...e){return null}visitDictionary(t,...e){return null}visitInterval(t,...e){return null}visitFixedSizeList(t,...e){return null}visitMap(t,...e){return null}}function Eo(t,e,n=!0){let r=null;switch(e){case Fr.Null:r=t.visitNull;break;case Fr.Bool:r=t.visitBool;break;case Fr.Int:r=t.visitInt;break;case Fr.Int8:r=t.visitInt8||t.visitInt;break;case Fr.Int16:r=t.visitInt16||t.visitInt;break;case Fr.Int32:r=t.visitInt32||t.visitInt;break;case Fr.Int64:r=t.visitInt64||t.visitInt;break;case Fr.Uint8:r=t.visitUint8||t.visitInt;break;case Fr.Uint16:r=t.visitUint16||t.visitInt;break;case Fr.Uint32:r=t.visitUint32||t.visitInt;break;case Fr.Uint64:r=t.visitUint64||t.visitInt;break;case Fr.Float:r=t.visitFloat;break;case Fr.Float16:r=t.visitFloat16||t.visitFloat;break;case Fr.Float32:r=t.visitFloat32||t.visitFloat;break;case Fr.Float64:r=t.visitFloat64||t.visitFloat;break;case Fr.Utf8:r=t.visitUtf8;break;case Fr.Binary:r=t.visitBinary;break;case Fr.FixedSizeBinary:r=t.visitFixedSizeBinary;break;case Fr.Date:r=t.visitDate;break;case Fr.DateDay:r=t.visitDateDay||t.visitDate;break;case Fr.DateMillisecond:r=t.visitDateMillisecond||t.visitDate;break;case Fr.Timestamp:r=t.visitTimestamp;break;case Fr.TimestampSecond:r=t.visitTimestampSecond||t.visitTimestamp;break;case Fr.TimestampMillisecond:r=t.visitTimestampMillisecond||t.visitTimestamp;break;case Fr.TimestampMicrosecond:r=t.visitTimestampMicrosecond||t.visitTimestamp;break;case Fr.TimestampNanosecond:r=t.visitTimestampNanosecond||t.visitTimestamp;break;case Fr.Time:r=t.visitTime;break;case Fr.TimeSecond:r=t.visitTimeSecond||t.visitTime;break;case Fr.TimeMillisecond:r=t.visitTimeMillisecond||t.visitTime;break;case Fr.TimeMicrosecond:r=t.visitTimeMicrosecond||t.visitTime;break;case Fr.TimeNanosecond:r=t.visitTimeNanosecond||t.visitTime;break;case Fr.Decimal:r=t.visitDecimal;break;case Fr.List:r=t.visitList;break;case Fr.Struct:r=t.visitStruct;break;case Fr.Union:r=t.visitUnion;break;case Fr.DenseUnion:r=t.visitDenseUnion||t.visitUnion;break;case Fr.SparseUnion:r=t.visitSparseUnion||t.visitUnion;break;case Fr.Dictionary:r=t.visitDictionary;break;case Fr.Interval:r=t.visitInterval;break;case Fr.IntervalDayTime:r=t.visitIntervalDayTime||t.visitInterval;break;case Fr.IntervalYearMonth:r=t.visitIntervalYearMonth||t.visitInterval;break;case Fr.FixedSizeList:r=t.visitFixedSizeList;break;case Fr.Map:r=t.visitMap}if("function"==typeof r)return r;if(!n)return()=>null;throw new Error(`Unrecognized type '${Fr[e]}'`)}function Co(t){switch(t.typeId){case Fr.Null:return Fr.Null;case Fr.Int:{const{bitWidth:e,isSigned:n}=t;switch(e){case 8:return n?Fr.Int8:Fr.Uint8;case 16:return n?Fr.Int16:Fr.Uint16;case 32:return n?Fr.Int32:Fr.Uint32;case 64:return n?Fr.Int64:Fr.Uint64}return Fr.Int}case Fr.Float:switch(t.precision){case Cr.HALF:return Fr.Float16;case Cr.SINGLE:return Fr.Float32;case Cr.DOUBLE:return Fr.Float64}return Fr.Float;case Fr.Binary:return Fr.Binary;case Fr.Utf8:return Fr.Utf8;case Fr.Bool:return Fr.Bool;case Fr.Decimal:return Fr.Decimal;case Fr.Time:switch(t.unit){case jr.SECOND:return Fr.TimeSecond;case jr.MILLISECOND:return Fr.TimeMillisecond;case jr.MICROSECOND:return Fr.TimeMicrosecond;case jr.NANOSECOND:return Fr.TimeNanosecond}return Fr.Time;case Fr.Timestamp:switch(t.unit){case jr.SECOND:return Fr.TimestampSecond;case jr.MILLISECOND:return Fr.TimestampMillisecond;case jr.MICROSECOND:return Fr.TimestampMicrosecond;case jr.NANOSECOND:return Fr.TimestampNanosecond}return Fr.Timestamp;case Fr.Date:switch(t.unit){case Pr.DAY:return Fr.DateDay;case Pr.MILLISECOND:return Fr.DateMillisecond}return Fr.Date;case Fr.Interval:switch(t.unit){case kr.DAY_TIME:return Fr.IntervalDayTime;case kr.YEAR_MONTH:return Fr.IntervalYearMonth}return Fr.Interval;case Fr.Map:return Fr.Map;case Fr.List:return Fr.List;case Fr.Struct:return Fr.Struct;case Fr.Union:switch(t.mode){case Er.Dense:return Fr.DenseUnion;case Er.Sparse:return Fr.SparseUnion}return Fr.Union;case Fr.FixedSizeBinary:return Fr.FixedSizeBinary;case Fr.FixedSizeList:return Fr.FixedSizeList;case Fr.Dictionary:return Fr.Dictionary}throw new Error(`Unrecognized type '${Fr[t.typeId]}'`)}Mo.prototype.visitInt8=null,Mo.prototype.visitInt16=null,Mo.prototype.visitInt32=null,Mo.prototype.visitInt64=null,Mo.prototype.visitUint8=null,Mo.prototype.visitUint16=null,Mo.prototype.visitUint32=null,Mo.prototype.visitUint64=null,Mo.prototype.visitFloat16=null,Mo.prototype.visitFloat32=null,Mo.prototype.visitFloat64=null,Mo.prototype.visitDateDay=null,Mo.prototype.visitDateMillisecond=null,Mo.prototype.visitTimestampSecond=null,Mo.prototype.visitTimestampMillisecond=null,Mo.prototype.visitTimestampMicrosecond=null,Mo.prototype.visitTimestampNanosecond=null,Mo.prototype.visitTimeSecond=null,Mo.prototype.visitTimeMillisecond=null,Mo.prototype.visitTimeMicrosecond=null,Mo.prototype.visitTimeNanosecond=null,Mo.prototype.visitDenseUnion=null,Mo.prototype.visitSparseUnion=null,Mo.prototype.visitIntervalDayTime=null,Mo.prototype.visitIntervalYearMonth=null;const Po=new Float64Array(1),jo=new Uint32Array(Po.buffer);function ko(t){const e=(31744&t)>>10,n=(1023&t)/1024,r=Math.pow(-1,(32768&t)>>15);switch(e){case 31:return r*(n?Number.NaN:1/0);case 0:return r*(n?6103515625e-14*n:0)}return r*Math.pow(2,e-15)*(1+n)}class Bo extends Mo{}function Fo(t){return(e,n,r)=>{if(e.setValid(n,null!=r))return t(e,n,r)}}const Lo=(t,e,n)=>{t[e]=Math.trunc(n%4294967296),t[e+1]=Math.trunc(n/4294967296)},Do=(t,e,n,r)=>{if(n+1{t[e]=n},Ro=({values:t},e,n)=>{t[e]=n},zo=({values:t},e,n)=>{t[e]=function(t){if(t!=t)return 32256;Po[0]=t;const e=(2147483648&jo[1])>>16&65535;let n=2146435072&jo[1],r=0;return n>=1089470464?jo[0]>0?n=31744:(n=(2080374784&n)>>16,r=(1048575&jo[1])>>10):n<=1056964608?(r=1048576+(1048575&jo[1]),r=1048576+(r<<(n>>20)-998)>>21,n=0):(n=n-1056964608>>10,r=512+(1048575&jo[1])>>10),e|n|65535&r}(n)},Uo=({values:t},e,n)=>{((t,e,n)=>{t[e]=Math.trunc(n/864e5)})(t,e,n.valueOf())},Vo=({values:t},e,n)=>{Lo(t,2*e,n.valueOf())},Wo=({values:t},e,n)=>Lo(t,2*e,n/1e3),$o=({values:t},e,n)=>Lo(t,2*e,n),Go=({values:t},e,n)=>((t,e,n)=>{t[e]=Math.trunc(1e3*n%4294967296),t[e+1]=Math.trunc(1e3*n/4294967296)})(t,2*e,n),Yo=({values:t},e,n)=>((t,e,n)=>{t[e]=Math.trunc(1e6*n%4294967296),t[e+1]=Math.trunc(1e6*n/4294967296)})(t,2*e,n),Zo=({values:t},e,n)=>{t[e]=n},Ho=({values:t},e,n)=>{t[e]=n},qo=({values:t},e,n)=>{t[e]=n},Xo=({values:t},e,n)=>{t[e]=n},Ko=(t,e,n)=>{const r=t.type.typeIdToChildIndex[t.typeIds[e]],i=t.children[r];es.visit(i,t.valueOffsets[e],n)},Jo=(t,e,n)=>{const r=t.type.typeIdToChildIndex[t.typeIds[e]],i=t.children[r];es.visit(i,e,n)},Qo=({values:t},e,n)=>{t.set(n.subarray(0,2),2*e)},ts=({values:t},e,n)=>{t[e]=12*n[0]+n[1]%12};Bo.prototype.visitBool=Fo((({offset:t,values:e},n,r)=>{const i=t+n;r?e[i>>3]|=1<>3]&=~(1<{switch(t.type.precision){case Cr.HALF:return zo(t,e,n);case Cr.SINGLE:case Cr.DOUBLE:return Ro(t,e,n)}})),Bo.prototype.visitFloat16=Fo(zo),Bo.prototype.visitFloat32=Fo(Ro),Bo.prototype.visitFloat64=Fo(Ro),Bo.prototype.visitUtf8=Fo((({values:t,valueOffsets:e},n,r)=>{Do(t,e,n,ti(r))})),Bo.prototype.visitBinary=Fo((({values:t,valueOffsets:e},n,r)=>Do(t,e,n,r))),Bo.prototype.visitFixedSizeBinary=Fo((({stride:t,values:e},n,r)=>{e.set(r.subarray(0,t),t*n)})),Bo.prototype.visitDate=Fo(((t,e,n)=>{t.type.unit===Pr.DAY?Uo(t,e,n):Vo(t,e,n)})),Bo.prototype.visitDateDay=Fo(Uo),Bo.prototype.visitDateMillisecond=Fo(Vo),Bo.prototype.visitTimestamp=Fo(((t,e,n)=>{switch(t.type.unit){case jr.SECOND:return Wo(t,e,n);case jr.MILLISECOND:return $o(t,e,n);case jr.MICROSECOND:return Go(t,e,n);case jr.NANOSECOND:return Yo(t,e,n)}})),Bo.prototype.visitTimestampSecond=Fo(Wo),Bo.prototype.visitTimestampMillisecond=Fo($o),Bo.prototype.visitTimestampMicrosecond=Fo(Go),Bo.prototype.visitTimestampNanosecond=Fo(Yo),Bo.prototype.visitTime=Fo(((t,e,n)=>{switch(t.type.unit){case jr.SECOND:return Zo(t,e,n);case jr.MILLISECOND:return Ho(t,e,n);case jr.MICROSECOND:return qo(t,e,n);case jr.NANOSECOND:return Xo(t,e,n)}})),Bo.prototype.visitTimeSecond=Fo(Zo),Bo.prototype.visitTimeMillisecond=Fo(Ho),Bo.prototype.visitTimeMicrosecond=Fo(qo),Bo.prototype.visitTimeNanosecond=Fo(Xo),Bo.prototype.visitDecimal=Fo((({values:t,stride:e},n,r)=>{t.set(r.subarray(0,e),e*n)})),Bo.prototype.visitList=Fo(((t,e,n)=>{const r=t.children[0],i=t.valueOffsets,o=es.getVisitFn(r);if(Array.isArray(n))for(let t=-1,s=i[e],a=i[e+1];s{const r=t.type.children.map((t=>es.getVisitFn(t.type))),i=n instanceof Map?(o=e,s=n,(t,e,n,r)=>e&&t(e,o,s.get(n.name))):n instanceof ba?((t,e)=>(n,r,i,o)=>r&&n(r,t,e.get(o)))(e,n):Array.isArray(n)?((t,e)=>(n,r,i,o)=>r&&n(r,t,e[o]))(e,n):((t,e)=>(n,r,i,o)=>r&&n(r,t,e[i.name]))(e,n);var o,s;t.type.children.forEach(((e,n)=>i(r[n],t.children[n],e,n)))})),Bo.prototype.visitUnion=Fo(((t,e,n)=>{t.type.mode===Er.Dense?Ko(t,e,n):Jo(t,e,n)})),Bo.prototype.visitDenseUnion=Fo(Ko),Bo.prototype.visitSparseUnion=Fo(Jo),Bo.prototype.visitDictionary=Fo(((t,e,n)=>{var r;null===(r=t.dictionary)||void 0===r||r.set(t.values[e],n)})),Bo.prototype.visitInterval=Fo(((t,e,n)=>{t.type.unit===kr.DAY_TIME?Qo(t,e,n):ts(t,e,n)})),Bo.prototype.visitIntervalDayTime=Fo(Qo),Bo.prototype.visitIntervalYearMonth=Fo(ts),Bo.prototype.visitFixedSizeList=Fo(((t,e,n)=>{const{stride:r}=t,i=t.children[0],o=es.getVisitFn(i);if(Array.isArray(n))for(let t=-1,s=e*r;++t{const r=t.children[0],{valueOffsets:i}=t,o=es.getVisitFn(r);let{[e]:s,[e+1]:a}=i;const u=n instanceof Map?n.entries():Object.entries(n);for(const t of u)if(o(r,s,t),++s>=a)break}));const es=new Bo,ns=Symbol.for("parent"),rs=Symbol.for("rowIndex");class is{constructor(t,e){return this[ns]=t,this[rs]=e,new Proxy(this,new ss)}toArray(){return Object.values(this.toJSON())}toJSON(){const t=this[rs],e=this[ns],n=e.type.children,r={};for(let i=-1,o=n.length;++i`${Gr(t)}: ${Gr(e)}`)).join(", ")}}`}[Symbol.for("nodejs.util.inspect.custom")](){return this.toString()}[Symbol.iterator](){return new os(this[ns],this[rs])}}class os{constructor(t,e){this.childIndex=0,this.children=t.children,this.rowIndex=e,this.childFields=t.type.children,this.numChildren=this.childFields.length}[Symbol.iterator](){return this}next(){const t=this.childIndex;return tt.name))}has(t,e){return-1!==t[ns].type.children.findIndex((t=>t.name===e))}getOwnPropertyDescriptor(t,e){if(-1!==t[ns].type.children.findIndex((t=>t.name===e)))return{writable:!0,enumerable:!0,configurable:!0}}get(t,e){if(Reflect.has(t,e))return t[e];const n=t[ns].type.children.findIndex((t=>t.name===e));if(-1!==n){const r=Ms.visit(t[ns].children[n],t[rs]);return Reflect.set(t,e,r),r}}set(t,e,n){const r=t[ns].type.children.findIndex((t=>t.name===e));return-1!==r?(es.visit(t[ns].children[r],t[rs],n),Reflect.set(t,e,n)):!(!Reflect.has(t,e)&&"symbol"!=typeof e)&&Reflect.set(t,e,n)}}class as extends Mo{}function us(t){return(e,n)=>e.getValid(n)?t(e,n):null}const cs=(t,e)=>4294967296*t[e+1]+(t[e]>>>0),ls=t=>new Date(t),fs=(t,e,n)=>{if(n+1>=e.length)return null;const r=e[n],i=e[n+1];return t.subarray(r,i)},hs=({values:t},e)=>((t,e)=>ls(((t,e)=>864e5*t[e])(t,e)))(t,e),ds=({values:t},e)=>((t,e)=>ls(cs(t,e)))(t,2*e),ps=({stride:t,values:e},n)=>e[t*n],ys=({values:t},e)=>t[e],vs=({values:t},e)=>1e3*cs(t,2*e),bs=({values:t},e)=>cs(t,2*e),ms=({values:t},e)=>((t,e)=>t[e+1]/1e3*4294967296+(t[e]>>>0)/1e3)(t,2*e),gs=({values:t},e)=>((t,e)=>t[e+1]/1e6*4294967296+(t[e]>>>0)/1e6)(t,2*e),ws=({values:t},e)=>t[e],_s=({values:t},e)=>t[e],xs=({values:t},e)=>t[e],Ss=({values:t},e)=>t[e],Os=(t,e)=>{const n=t.type.typeIdToChildIndex[t.typeIds[e]],r=t.children[n];return Ms.visit(r,t.valueOffsets[e])},Is=(t,e)=>{const n=t.type.typeIdToChildIndex[t.typeIds[e]],r=t.children[n];return Ms.visit(r,e)},Ts=({values:t},e)=>t.subarray(2*e,2*(e+1)),As=({values:t},e)=>{const n=t[e],r=new Int32Array(2);return r[0]=Math.trunc(n/12),r[1]=Math.trunc(n%12),r};as.prototype.visitNull=us(((t,e)=>null)),as.prototype.visitBool=us((({offset:t,values:e},n)=>{const r=t+n;return 0!=(e[r>>3]&1<t[e])),as.prototype.visitInt8=us(ps),as.prototype.visitInt16=us(ps),as.prototype.visitInt32=us(ps),as.prototype.visitInt64=us(ys),as.prototype.visitUint8=us(ps),as.prototype.visitUint16=us(ps),as.prototype.visitUint32=us(ps),as.prototype.visitUint64=us(ys),as.prototype.visitFloat=us((({type:t,values:e},n)=>t.precision!==Cr.HALF?e[n]:ko(e[n]))),as.prototype.visitFloat16=us((({stride:t,values:e},n)=>ko(e[t*n]))),as.prototype.visitFloat32=us(ps),as.prototype.visitFloat64=us(ps),as.prototype.visitUtf8=us((({values:t,valueOffsets:e},n)=>{const r=fs(t,e,n);return null!==r?Jr(r):null})),as.prototype.visitBinary=us((({values:t,valueOffsets:e},n)=>fs(t,e,n))),as.prototype.visitFixedSizeBinary=us((({stride:t,values:e},n)=>e.subarray(t*n,t*(n+1)))),as.prototype.visitDate=us(((t,e)=>t.type.unit===Pr.DAY?hs(t,e):ds(t,e))),as.prototype.visitDateDay=us(hs),as.prototype.visitDateMillisecond=us(ds),as.prototype.visitTimestamp=us(((t,e)=>{switch(t.type.unit){case jr.SECOND:return vs(t,e);case jr.MILLISECOND:return bs(t,e);case jr.MICROSECOND:return ms(t,e);case jr.NANOSECOND:return gs(t,e)}})),as.prototype.visitTimestampSecond=us(vs),as.prototype.visitTimestampMillisecond=us(bs),as.prototype.visitTimestampMicrosecond=us(ms),as.prototype.visitTimestampNanosecond=us(gs),as.prototype.visitTime=us(((t,e)=>{switch(t.type.unit){case jr.SECOND:return ws(t,e);case jr.MILLISECOND:return _s(t,e);case jr.MICROSECOND:return xs(t,e);case jr.NANOSECOND:return Ss(t,e)}})),as.prototype.visitTimeSecond=us(ws),as.prototype.visitTimeMillisecond=us(_s),as.prototype.visitTimeMicrosecond=us(xs),as.prototype.visitTimeNanosecond=us(Ss),as.prototype.visitDecimal=us((({values:t,stride:e},n)=>Di.decimal(t.subarray(e*n,e*(n+1))))),as.prototype.visitList=us(((t,e)=>{const{valueOffsets:n,stride:r,children:i}=t,{[e*r]:o,[e*r+1]:s}=n,a=i[0].slice(o,s-o);return new ba([a])})),as.prototype.visitStruct=us(((t,e)=>new is(t,e))),as.prototype.visitUnion=us(((t,e)=>t.type.mode===Er.Dense?Os(t,e):Is(t,e))),as.prototype.visitDenseUnion=us(Os),as.prototype.visitSparseUnion=us(Is),as.prototype.visitDictionary=us(((t,e)=>{var n;return null===(n=t.dictionary)||void 0===n?void 0:n.get(t.values[e])})),as.prototype.visitInterval=us(((t,e)=>t.type.unit===kr.DAY_TIME?Ts(t,e):As(t,e))),as.prototype.visitIntervalDayTime=us(Ts),as.prototype.visitIntervalYearMonth=us(As),as.prototype.visitFixedSizeList=us(((t,e)=>{const{stride:n,children:r}=t,i=r[0].slice(e*n,n);return new ba([i])})),as.prototype.visitMap=us(((t,e)=>{const{valueOffsets:n,children:r}=t,{[e]:i,[e+1]:o}=n,s=r[0];return new Ps(s.slice(i,o-i))}));const Ms=new as,Es=Symbol.for("keys"),Cs=Symbol.for("vals");class Ps{constructor(t){return this[Es]=new ba([t.children[0]]).memoize(),this[Cs]=t.children[1],new Proxy(this,new ks)}[Symbol.iterator](){return new js(this[Es],this[Cs])}get size(){return this[Es].length}toArray(){return Object.values(this.toJSON())}toJSON(){const t=this[Es],e=this[Cs],n={};for(let r=-1,i=t.length;++r`${Gr(t)}: ${Gr(e)}`)).join(", ")}}`}[Symbol.for("nodejs.util.inspect.custom")](){return this.toString()}}class js{constructor(t,e){this.keys=t,this.vals=e,this.keyIndex=0,this.numKeys=t.length}[Symbol.iterator](){return this}next(){const t=this.keyIndex;return t===this.numKeys?{done:!0,value:null}:(this.keyIndex++,{done:!1,value:[this.keys.get(t),Ms.visit(this.vals,t)]})}}class ks{isExtensible(){return!1}deleteProperty(){return!1}preventExtensions(){return!0}ownKeys(t){return t[Es].toArray().map(String)}has(t,e){return t[Es].includes(e)}getOwnPropertyDescriptor(t,e){if(-1!==t[Es].indexOf(e))return{writable:!0,enumerable:!0,configurable:!0}}get(t,e){if(Reflect.has(t,e))return t[e];const n=t[Es].indexOf(e);if(-1!==n){const r=Ms.visit(Reflect.get(t,Cs),n);return Reflect.set(t,e,r),r}}set(t,e,n){const r=t[Es].indexOf(e);return-1!==r?(es.visit(Reflect.get(t,Cs),r,n),Reflect.set(t,e,n)):!!Reflect.has(t,e)&&Reflect.set(t,e,n)}}let Bs;function Fs(t,e,n,r){const{length:i=0}=t;let o="number"!=typeof e?0:e,s="number"!=typeof n?i:n;return o<0&&(o=(o%i+i)%i),s<0&&(s=(s%i+i)%i),si&&(s=i),r?r(t,o,s):[o,s]}Object.defineProperties(Ps.prototype,{[Symbol.toStringTag]:{enumerable:!1,configurable:!1,value:"Row"},[Es]:{writable:!0,enumerable:!1,configurable:!1,value:null},[Cs]:{writable:!0,enumerable:!1,configurable:!1,value:null}});const Ls=t=>t!=t;function Ds(t){if("object"!=typeof t||null===t)return Ls(t)?Ls:e=>e===t;if(t instanceof Date){const e=t.valueOf();return t=>t instanceof Date&&t.valueOf()===e}return ArrayBuffer.isView(t)?e=>!!e&&function(t,e){let n=0;const r=t.length;if(r!==e.length)return!1;if(r>0)do{if(t[n]!==e[n])return!1}while(++n!1;const r=[];for(let e=-1,i=n.length;++e{if(!n||"object"!=typeof n)return!1;switch(n.constructor){case Array:return function(t,e){const n=t.length;if(e.length!==n)return!1;for(let r=-1;++rt+e.nullCount),0)}function Vs(t){return t.reduce(((t,e,n)=>(t[n+1]=t[n]+e.length,t)),new Uint32Array(t.length+1))}function Ws(t,e,n,r){const i=[];for(let o=-1,s=t.length;++o=r)break;if(n>=a+u)continue;if(a>=n&&a+u<=r){i.push(s);continue}const c=Math.max(0,n-a),l=Math.min(r-a,u);i.push(s.slice(c,l-c))}return 0===i.length&&i.push(t[0].slice(0,0)),i}function $s(t,e,n,r){let i=0,o=0,s=e.length-1;do{if(i>=s-1)return n>r}function Ks(t){const e=[];let n=0,r=0,i=0;for(const o of t)o&&(i|=1<0)&&(e[n++]=i);const o=new Uint8Array(e.length+7&-8);return o.set(e),o}class Js{constructor(t,e,n,r,i){this.bytes=t,this.length=n,this.context=r,this.get=i,this.bit=e%8,this.byteIndex=e>>3,this.byte=t[this.byteIndex++],this.index=0}next(){return this.index>3<<3,i=e+(e%8==0?0:8-e%8);return Qs(t,e,i)+Qs(t,r,n)+function(t,e,n){let r=0,i=Math.trunc(e);const o=new DataView(t.buffer,t.byteOffset,t.byteLength),s=void 0===n?t.byteLength:i+n;for(;s-i>=4;)r+=ta(o.getUint32(i)),i+=4;for(;s-i>=2;)r+=ta(o.getUint16(i)),i+=2;for(;s-i>=1;)r+=ta(o.getUint8(i)),i+=1;return r}(t,i>>3,r-i>>3)}function ta(t){let e=Math.trunc(t);return e-=e>>>1&1431655765,e=(858993459&e)+(e>>>2&858993459),16843009*(e+(e>>>4)&252645135)>>>24}class ea extends Mo{}function na(t,e,n){if(void 0===e)return-1;if(null===e)return function(t,e){const{nullBitmap:n}=t;if(!n||t.nullCount<=0)return-1;let r=0;for(const i of new Js(n,t.offset+(e||0),t.length,n,qs)){if(!i)return r;++r}return-1}(t,n);const r=Ms.getVisitFn(t),i=Ds(e);for(let e=(n||0)-1,o=t.length;++e0?0:-1},ea.prototype.visitBool=na,ea.prototype.visitInt=na,ea.prototype.visitInt8=na,ea.prototype.visitInt16=na,ea.prototype.visitInt32=na,ea.prototype.visitInt64=na,ea.prototype.visitUint8=na,ea.prototype.visitUint16=na,ea.prototype.visitUint32=na,ea.prototype.visitUint64=na,ea.prototype.visitFloat=na,ea.prototype.visitFloat16=na,ea.prototype.visitFloat32=na,ea.prototype.visitFloat64=na,ea.prototype.visitUtf8=na,ea.prototype.visitBinary=na,ea.prototype.visitFixedSizeBinary=na,ea.prototype.visitDate=na,ea.prototype.visitDateDay=na,ea.prototype.visitDateMillisecond=na,ea.prototype.visitTimestamp=na,ea.prototype.visitTimestampSecond=na,ea.prototype.visitTimestampMillisecond=na,ea.prototype.visitTimestampMicrosecond=na,ea.prototype.visitTimestampNanosecond=na,ea.prototype.visitTime=na,ea.prototype.visitTimeSecond=na,ea.prototype.visitTimeMillisecond=na,ea.prototype.visitTimeMicrosecond=na,ea.prototype.visitTimeNanosecond=na,ea.prototype.visitDecimal=na,ea.prototype.visitList=na,ea.prototype.visitStruct=na,ea.prototype.visitUnion=na,ea.prototype.visitDenseUnion=ra,ea.prototype.visitSparseUnion=ra,ea.prototype.visitDictionary=na,ea.prototype.visitInterval=na,ea.prototype.visitIntervalDayTime=na,ea.prototype.visitIntervalYearMonth=na,ea.prototype.visitFixedSizeList=na,ea.prototype.visitMap=na;const ia=new ea;class oa extends Mo{}function sa(t){const{type:e}=t;if(0===t.nullCount&&1===t.stride&&(e.typeId===Fr.Timestamp||e instanceof so&&64!==e.bitWidth||e instanceof yo&&64!==e.bitWidth||e instanceof uo&&e.precision!==Cr.HALF))return new zs(t.data.length,(e=>{const n=t.data[e];return n.values.subarray(0,n.length)[Symbol.iterator]()}));let n=0;return new zs(t.data.length,(e=>{const r=t.data[e].length,i=t.slice(n,n+r);return n+=r,new aa(i)}))}class aa{constructor(t){this.vector=t,this.index=0}next(){return this.indext+e;class la extends Mo{visitNull(t,e){return 0}visitInt(t,e){return t.type.bitWidth/8}visitFloat(t,e){return t.type.ArrayType.BYTES_PER_ELEMENT}visitBool(t,e){return 1/8}visitDecimal(t,e){return t.type.bitWidth/8}visitDate(t,e){return 4*(t.type.unit+1)}visitTime(t,e){return t.type.bitWidth/8}visitTimestamp(t,e){return t.type.unit===jr.SECOND?4:8}visitInterval(t,e){return 4*(t.type.unit+1)}visitStruct(t,e){return t.children.reduce(((t,n)=>t+da.visit(n,e)),0)}visitFixedSizeBinary(t,e){return t.type.byteWidth}visitMap(t,e){return 8+t.children.reduce(((t,n)=>t+da.visit(n,e)),0)}visitDictionary(t,e){var n;return t.type.indices.bitWidth/8+((null===(n=t.dictionary)||void 0===n?void 0:n.getByteLength(t.values[e]))||0)}}const fa=({type:t,children:e,typeIds:n,valueOffsets:r},i)=>{const o=t.typeIdToChildIndex[n[i]];return 8+da.visit(e[o],r[i])},ha=({children:t},e)=>4+da.visitMany(t,t.map((()=>e))).reduce(ca,0);la.prototype.visitUtf8=({valueOffsets:t},e)=>t[e+1]-t[e]+8,la.prototype.visitBinary=({valueOffsets:t},e)=>t[e+1]-t[e]+8,la.prototype.visitList=({valueOffsets:t,stride:e,children:n},r)=>{const i=n[0],{[r*e]:o}=t,{[r*e+1]:s}=t,a=da.getVisitFn(i.type),u=i.slice(o,s-o);let c=8;for(let t=-1,e=s-o;++t{const r=e[0],i=r.slice(n*t,t),o=da.getVisitFn(r.type);let s=0;for(let t=-1,e=i.length;++tt.type.mode===Er.Dense?fa(t,e):ha(t,e),la.prototype.visitDenseUnion=fa,la.prototype.visitSparseUnion=ha;const da=new la;var pa;const ya={},va={};class ba{constructor(t){var e,n,r;const i=t[0]instanceof ba?t.flatMap((t=>t.data)):t;if(0===i.length||i.some((t=>!(t instanceof ga))))throw new TypeError("Vector constructor expects an Array of Data instances.");const o=null===(e=i[0])||void 0===e?void 0:e.type;switch(i.length){case 0:this._offsets=[0];break;case 1:{const{get:t,set:e,indexOf:n,byteLength:r}=ya[o.typeId],s=i[0];this.isValid=t=>Gs(s,t),this.get=e=>t(s,e),this.set=(t,n)=>e(s,t,n),this.indexOf=t=>n(s,t),this.getByteLength=t=>r(s,t),this._offsets=[0,s.length];break}default:Object.setPrototypeOf(this,va[o.typeId]),this._offsets=Vs(i)}this.data=i,this.type=o,this.stride=Ao(o),this.numChildren=null!==(r=null===(n=o.children)||void 0===n?void 0:n.length)&&void 0!==r?r:0,this.length=this._offsets[this._offsets.length-1]}get byteLength(){return-1===this._byteLength&&(this._byteLength=this.data.reduce(((t,e)=>t+e.byteLength),0)),this._byteLength}get nullCount(){return-1===this._nullCount&&(this._nullCount=Us(this.data)),this._nullCount}get ArrayType(){return this.type.ArrayType}get[Symbol.toStringTag](){return`${this.VectorName}<${this.type[Symbol.toStringTag]}>`}get VectorName(){return`${Fr[this.type.typeId]}Vector`}isValid(t){return!1}get(t){return null}set(t,e){}indexOf(t,e){return-1}includes(t,e){return this.indexOf(t,e)>0}getByteLength(t){return 0}[Symbol.iterator](){return ua.visit(this)}concat(...t){return new ba(this.data.concat(t.flatMap((t=>t.data)).flat(Number.POSITIVE_INFINITY)))}slice(t,e){return new ba(Fs(this,t,e,(({data:t,_offsets:e},n,r)=>Ws(t,e,n,r))))}toJSON(){return[...this]}toArray(){const{type:t,data:e,length:n,stride:r,ArrayType:i}=this;switch(t.typeId){case Fr.Int:case Fr.Float:case Fr.Decimal:case Fr.Time:case Fr.Timestamp:switch(e.length){case 0:return new i;case 1:return e[0].values.subarray(0,n*r);default:return e.reduce(((t,{values:e})=>(t.array.set(e,t.offset),t.offset+=e.length,t)),{array:new i(n*r),offset:0}).array}}return[...this]}toString(){return`[${[...this].join(",")}]`}getChild(t){var e;return this.getChildAt(null===(e=this.type.children)||void 0===e?void 0:e.findIndex((e=>e.name===t)))}getChildAt(t){return t>-1&&te[t]))):null}get isMemoized(){return!!io.isDictionary(this.type)&&this.data[0].dictionary.isMemoized}memoize(){if(io.isDictionary(this.type)){const t=new ma(this.data[0].dictionary),e=this.data.map((e=>{const n=e.clone();return n.dictionary=t,n}));return new ba(e)}return new ma(this)}unmemoize(){if(io.isDictionary(this.type)&&this.isMemoized){const t=this.data[0].dictionary.unmemoize(),e=this.data.map((e=>{const n=e.clone();return n.dictionary=t,n}));return new ba(e)}return this}}pa=Symbol.toStringTag,ba[pa]=(t=>{t.type=io.prototype,t.data=[],t.length=0,t.stride=1,t.numChildren=0,t._nullCount=-1,t._byteLength=-1,t._offsets=new Uint32Array([0]),t[Symbol.isConcatSpreadable]=!0;const e=Object.keys(Fr).map((t=>Fr[t])).filter((t=>"number"==typeof t&&t!==Fr.NONE));for(const n of e){const e=Ms.getVisitFnByTypeId(n),r=es.getVisitFnByTypeId(n),i=ia.getVisitFnByTypeId(n),o=da.getVisitFnByTypeId(n);ya[n]={get:e,set:r,indexOf:i,byteLength:o},va[n]=Object.create(t,{isValid:{value:Ys(Gs)},get:{value:Ys(Ms.getVisitFnByTypeId(n))},set:{value:Zs(es.getVisitFnByTypeId(n))},indexOf:{value:Hs(ia.getVisitFnByTypeId(n))},getByteLength:{value:Ys(da.getVisitFnByTypeId(n))}})}return"Vector"})(ba.prototype);class ma extends ba{constructor(t){super(t.data);const e=this.get,n=this.set,r=this.slice,i=new Array(this.length);Object.defineProperty(this,"get",{value(t){const n=i[t];if(void 0!==n)return n;const r=e.call(this,t);return i[t]=r,r}}),Object.defineProperty(this,"set",{value(t,e){n.call(this,t,e),i[t]=e}}),Object.defineProperty(this,"slice",{value:(t,e)=>new ma(r.call(this,t,e))}),Object.defineProperty(this,"isMemoized",{value:!0}),Object.defineProperty(this,"unmemoize",{value:()=>new ba(this.data)}),Object.defineProperty(this,"memoize",{value:()=>this})}}class ga{constructor(t,e,n,r,i,o=[],s){let a;this.type=t,this.children=o,this.dictionary=s,this.offset=Math.floor(Math.max(e||0,0)),this.length=Math.floor(Math.max(n||0,0)),this._nullCount=Math.floor(Math.max(r||0,-1)),i instanceof ga?(this.stride=i.stride,this.values=i.values,this.typeIds=i.typeIds,this.nullBitmap=i.nullBitmap,this.valueOffsets=i.valueOffsets):(this.stride=Ao(t),i&&((a=i[0])&&(this.valueOffsets=a),(a=i[1])&&(this.values=a),(a=i[2])&&(this.nullBitmap=a),(a=i[3])&&(this.typeIds=a))),this.nullable=0!==this._nullCount&&this.nullBitmap&&this.nullBitmap.byteLength>0}get typeId(){return this.type.typeId}get ArrayType(){return this.type.ArrayType}get buffers(){return[this.valueOffsets,this.values,this.nullBitmap,this.typeIds]}get byteLength(){let t=0;const{valueOffsets:e,values:n,nullBitmap:r,typeIds:i}=this;return e&&(t+=e.byteLength),n&&(t+=n.byteLength),r&&(t+=r.byteLength),i&&(t+=i.byteLength),this.children.reduce(((t,e)=>t+e.byteLength),t)}get nullCount(){let t,e=this._nullCount;return e<=-1&&(t=this.nullBitmap)&&(this._nullCount=e=this.length-Qs(t,this.offset,this.offset+this.length)),e}getValid(t){if(this.nullable&&this.nullCount>0){const e=this.offset+t;return 0!=(this.nullBitmap[e>>3]&1<>3){const{nullBitmap:t}=this._changeLengthAndBackfillNullBitmap(this.length);Object.assign(this,{nullBitmap:t,_nullCount:0})}const{nullBitmap:n,offset:r}=this,i=r+t>>3,o=(r+t)%8,s=n[i]>>o&1;return e?0===s&&(n[i]|=1<>3).fill(255,0,e>>3);r[e>>3]=(1<0&&r.set(function(t,e,n){const r=n.byteLength+7&-8;if(t>0||n.byteLength>3):Ks(new Js(n,t,e,null,qs)).subarray(0,r)),i}return n}(this.offset,e,this.nullBitmap),0);const i=this.buffers;return i[Lr.VALIDITY]=r,this.clone(this.type,0,t,n+(t-e),i)}_sliceBuffers(t,e,n,r){let i;const{buffers:o}=this;return(i=o[Lr.TYPE])&&(o[Lr.TYPE]=i.subarray(t,t+e)),(i=o[Lr.OFFSET])&&(o[Lr.OFFSET]=i.subarray(t,t+e+1))||(i=o[Lr.DATA])&&(o[Lr.DATA]=6===r?i:i.subarray(n*t,n*(t+e))),o}_sliceChildren(t,e,n){return t.map((t=>t.slice(e,n)))}}ga.prototype.children=Object.freeze([]);class wa extends Mo{visit(t){return this.getVisitFn(t.type).call(this,t)}visitNull(t){const{type:e,offset:n=0,length:r=0}=t;return new ga(e,n,r,0)}visitBool(t){const{type:e,offset:n=0}=t,r=Ii(t.nullBitmap),i=Si(e.ArrayType,t.data),{length:o=i.length>>3,nullCount:s=(t.nullBitmap?-1:0)}=t;return new ga(e,n,o,s,[void 0,i,r])}visitInt(t){const{type:e,offset:n=0}=t,r=Ii(t.nullBitmap),i=Si(e.ArrayType,t.data),{length:o=i.length,nullCount:s=(t.nullBitmap?-1:0)}=t;return new ga(e,n,o,s,[void 0,i,r])}visitFloat(t){const{type:e,offset:n=0}=t,r=Ii(t.nullBitmap),i=Si(e.ArrayType,t.data),{length:o=i.length,nullCount:s=(t.nullBitmap?-1:0)}=t;return new ga(e,n,o,s,[void 0,i,r])}visitUtf8(t){const{type:e,offset:n=0}=t,r=Ii(t.data),i=Ii(t.nullBitmap),o=Oi(t.valueOffsets),{length:s=o.length-1,nullCount:a=(t.nullBitmap?-1:0)}=t;return new ga(e,n,s,a,[o,r,i])}visitBinary(t){const{type:e,offset:n=0}=t,r=Ii(t.data),i=Ii(t.nullBitmap),o=Oi(t.valueOffsets),{length:s=o.length-1,nullCount:a=(t.nullBitmap?-1:0)}=t;return new ga(e,n,s,a,[o,r,i])}visitFixedSizeBinary(t){const{type:e,offset:n=0}=t,r=Ii(t.nullBitmap),i=Si(e.ArrayType,t.data),{length:o=i.length/Ao(e),nullCount:s=(t.nullBitmap?-1:0)}=t;return new ga(e,n,o,s,[void 0,i,r])}visitDate(t){const{type:e,offset:n=0}=t,r=Ii(t.nullBitmap),i=Si(e.ArrayType,t.data),{length:o=i.length/Ao(e),nullCount:s=(t.nullBitmap?-1:0)}=t;return new ga(e,n,o,s,[void 0,i,r])}visitTimestamp(t){const{type:e,offset:n=0}=t,r=Ii(t.nullBitmap),i=Si(e.ArrayType,t.data),{length:o=i.length/Ao(e),nullCount:s=(t.nullBitmap?-1:0)}=t;return new ga(e,n,o,s,[void 0,i,r])}visitTime(t){const{type:e,offset:n=0}=t,r=Ii(t.nullBitmap),i=Si(e.ArrayType,t.data),{length:o=i.length/Ao(e),nullCount:s=(t.nullBitmap?-1:0)}=t;return new ga(e,n,o,s,[void 0,i,r])}visitDecimal(t){const{type:e,offset:n=0}=t,r=Ii(t.nullBitmap),i=Si(e.ArrayType,t.data),{length:o=i.length/Ao(e),nullCount:s=(t.nullBitmap?-1:0)}=t;return new ga(e,n,o,s,[void 0,i,r])}visitList(t){const{type:e,offset:n=0,child:r}=t,i=Ii(t.nullBitmap),o=Oi(t.valueOffsets),{length:s=o.length-1,nullCount:a=(t.nullBitmap?-1:0)}=t;return new ga(e,n,s,a,[o,void 0,i],[r])}visitStruct(t){const{type:e,offset:n=0,children:r=[]}=t,i=Ii(t.nullBitmap),{length:o=r.reduce(((t,{length:e})=>Math.max(t,e)),0),nullCount:s=(t.nullBitmap?-1:0)}=t;return new ga(e,n,o,s,[void 0,void 0,i],r)}visitUnion(t){const{type:e,offset:n=0,children:r=[]}=t,i=Ii(t.nullBitmap),o=Si(e.ArrayType,t.typeIds),{length:s=o.length,nullCount:a=(t.nullBitmap?-1:0)}=t;if(io.isSparseUnion(e))return new ga(e,n,s,a,[void 0,void 0,i,o],r);const u=Oi(t.valueOffsets);return new ga(e,n,s,a,[u,void 0,i,o],r)}visitDictionary(t){const{type:e,offset:n=0}=t,r=Ii(t.nullBitmap),i=Si(e.indices.ArrayType,t.data),{dictionary:o=new ba([(new wa).visit({type:e.dictionary})])}=t,{length:s=i.length,nullCount:a=(t.nullBitmap?-1:0)}=t;return new ga(e,n,s,a,[void 0,i,r],[],o)}visitInterval(t){const{type:e,offset:n=0}=t,r=Ii(t.nullBitmap),i=Si(e.ArrayType,t.data),{length:o=i.length/Ao(e),nullCount:s=(t.nullBitmap?-1:0)}=t;return new ga(e,n,o,s,[void 0,i,r])}visitFixedSizeList(t){const{type:e,offset:n=0,child:r=(new wa).visit({type:e.valueType})}=t,i=Ii(t.nullBitmap),{length:o=r.length/Ao(e),nullCount:s=(t.nullBitmap?-1:0)}=t;return new ga(e,n,o,s,[void 0,void 0,i],[r])}visitMap(t){const{type:e,offset:n=0,child:r=(new wa).visit({type:e.childType})}=t,i=Ii(t.nullBitmap),o=Oi(t.valueOffsets),{length:s=o.length-1,nullCount:a=(t.nullBitmap?-1:0)}=t;return new ga(e,n,s,a,[o,void 0,i],[r])}}function _a(t){return(new wa).visit(t)}class xa{constructor(t=[],e,n){this.fields=t||[],this.metadata=e||new Map,n||(n=Ia(t)),this.dictionaries=n}get[Symbol.toStringTag](){return"Schema"}get names(){return this.fields.map((t=>t.name))}toString(){return`Schema<{ ${this.fields.map(((t,e)=>`${e}: ${t}`)).join(", ")} }>`}select(t){const e=new Set(t),n=this.fields.filter((t=>e.has(t.name)));return new xa(n,this.metadata)}selectAt(t){const e=t.map((t=>this.fields[t])).filter(Boolean);return new xa(e,this.metadata)}assign(...t){const e=t[0]instanceof xa?t[0]:Array.isArray(t[0])?new xa(t[0]):new xa(t),n=[...this.fields],r=Oa(Oa(new Map,this.metadata),e.metadata),i=e.fields.filter((t=>{const e=n.findIndex((e=>e.name===t.name));return!~e||(n[e]=t.clone({metadata:Oa(Oa(new Map,n[e].metadata),t.metadata)}))&&!1})),o=Ia(i,new Map);return new xa([...n,...i],r,new Map([...this.dictionaries,...o]))}}xa.prototype.fields=null,xa.prototype.metadata=null,xa.prototype.dictionaries=null;class Sa{constructor(t,e,n=!1,r){this.name=t,this.type=e,this.nullable=n,this.metadata=r||new Map}static new(...t){let[e,n,r,i]=t;return t[0]&&"object"==typeof t[0]&&(({name:e}=t[0]),void 0===n&&(n=t[0].type),void 0===r&&(r=t[0].nullable),void 0===i&&(i=t[0].metadata)),new Sa(`${e}`,n,r,i)}get typeId(){return this.type.typeId}get[Symbol.toStringTag](){return"Field"}toString(){return`${this.name}: ${this.type}`}clone(...t){let[e,n,r,i]=t;return t[0]&&"object"==typeof t[0]?({name:e=this.name,type:n=this.type,nullable:r=this.nullable,metadata:i=this.metadata}=t[0]):[e=this.name,n=this.type,r=this.nullable,i=this.metadata]=t,Sa.new(e,n,r,i)}}function Oa(t,e){return new Map([...t||new Map,...e||new Map])}function Ia(t,e=new Map){for(let n=-1,r=t.length;++n0&&Ia(r.children,e)}return e}Sa.prototype.type=null,Sa.prototype.name=null,Sa.prototype.nullable=null,Sa.prototype.metadata=null;class Ta extends Mo{compareSchemas(t,e){return t===e||e instanceof t.constructor&&this.compareManyFields(t.fields,e.fields)}compareManyFields(t,e){return t===e||Array.isArray(t)&&Array.isArray(e)&&t.length===e.length&&t.every(((t,n)=>this.compareFields(t,e[n])))}compareFields(t,e){return t===e||e instanceof t.constructor&&t.name===e.name&&t.nullable===e.nullable&&this.visit(t.type,e.type)}}function Aa(t,e){return e instanceof t.constructor}function Ma(t,e){return t===e||Aa(t,e)}function Ea(t,e){return t===e||Aa(t,e)&&t.bitWidth===e.bitWidth&&t.isSigned===e.isSigned}function Ca(t,e){return t===e||Aa(t,e)&&t.precision===e.precision}function Pa(t,e){return t===e||Aa(t,e)&&t.unit===e.unit}function ja(t,e){return t===e||Aa(t,e)&&t.unit===e.unit&&t.timezone===e.timezone}function ka(t,e){return t===e||Aa(t,e)&&t.unit===e.unit&&t.bitWidth===e.bitWidth}function Ba(t,e){return t===e||Aa(t,e)&&t.mode===e.mode&&t.typeIds.every(((t,n)=>t===e.typeIds[n]))&&La.compareManyFields(t.children,e.children)}function Fa(t,e){return t===e||Aa(t,e)&&t.unit===e.unit}Ta.prototype.visitNull=Ma,Ta.prototype.visitBool=Ma,Ta.prototype.visitInt=Ea,Ta.prototype.visitInt8=Ea,Ta.prototype.visitInt16=Ea,Ta.prototype.visitInt32=Ea,Ta.prototype.visitInt64=Ea,Ta.prototype.visitUint8=Ea,Ta.prototype.visitUint16=Ea,Ta.prototype.visitUint32=Ea,Ta.prototype.visitUint64=Ea,Ta.prototype.visitFloat=Ca,Ta.prototype.visitFloat16=Ca,Ta.prototype.visitFloat32=Ca,Ta.prototype.visitFloat64=Ca,Ta.prototype.visitUtf8=Ma,Ta.prototype.visitBinary=Ma,Ta.prototype.visitFixedSizeBinary=function(t,e){return t===e||Aa(t,e)&&t.byteWidth===e.byteWidth},Ta.prototype.visitDate=Pa,Ta.prototype.visitDateDay=Pa,Ta.prototype.visitDateMillisecond=Pa,Ta.prototype.visitTimestamp=ja,Ta.prototype.visitTimestampSecond=ja,Ta.prototype.visitTimestampMillisecond=ja,Ta.prototype.visitTimestampMicrosecond=ja,Ta.prototype.visitTimestampNanosecond=ja,Ta.prototype.visitTime=ka,Ta.prototype.visitTimeSecond=ka,Ta.prototype.visitTimeMillisecond=ka,Ta.prototype.visitTimeMicrosecond=ka,Ta.prototype.visitTimeNanosecond=ka,Ta.prototype.visitDecimal=Ma,Ta.prototype.visitList=function(t,e){return t===e||Aa(t,e)&&t.children.length===e.children.length&&La.compareManyFields(t.children,e.children)},Ta.prototype.visitStruct=function(t,e){return t===e||Aa(t,e)&&t.children.length===e.children.length&&La.compareManyFields(t.children,e.children)},Ta.prototype.visitUnion=Ba,Ta.prototype.visitDenseUnion=Ba,Ta.prototype.visitSparseUnion=Ba,Ta.prototype.visitDictionary=function(t,e){return t===e||Aa(t,e)&&t.id===e.id&&t.isOrdered===e.isOrdered&&La.visit(t.indices,e.indices)&&La.visit(t.dictionary,e.dictionary)},Ta.prototype.visitInterval=Fa,Ta.prototype.visitIntervalDayTime=Fa,Ta.prototype.visitIntervalYearMonth=Fa,Ta.prototype.visitFixedSizeList=function(t,e){return t===e||Aa(t,e)&&t.listSize===e.listSize&&t.children.length===e.children.length&&La.compareManyFields(t.children,e.children)},Ta.prototype.visitMap=function(t,e){return t===e||Aa(t,e)&&t.keysSorted===e.keysSorted&&t.children.length===e.children.length&&La.compareManyFields(t.children,e.children)};const La=new Ta;function Da(t,e){return La.compareSchemas(t,e)}var Na,Ra;class za{constructor(...t){switch(t.length){case 2:if([this.schema]=t,!(this.schema instanceof xa))throw new TypeError("RecordBatch constructor expects a [Schema, Data] pair.");if([,this.data=_a({nullCount:0,type:new go(this.schema.fields),children:this.schema.fields.map((t=>_a({type:t.type,nullCount:0})))})]=t,!(this.data instanceof ga))throw new TypeError("RecordBatch constructor expects a [Schema, Data] pair.");[this.schema,this.data]=Ua(this.schema,this.data.children);break;case 1:{const[e]=t,{fields:n,children:r,length:i}=Object.keys(e).reduce(((t,n,r)=>(t.children[r]=e[n],t.length=Math.max(t.length,e[n].length),t.fields[r]=Sa.new({name:n,type:e[n].type,nullable:!0}),t)),{length:0,fields:new Array,children:new Array}),o=new xa(n),s=_a({type:new go(n),length:i,children:r,nullCount:0});[this.schema,this.data]=Ua(o,s.children,i);break}default:throw new TypeError("RecordBatch constructor expects an Object mapping names to child Data, or a [Schema, Data] pair.")}}get dictionaries(){return this._dictionaries||(this._dictionaries=Va(this.schema.fields,this.data.children))}get numCols(){return this.schema.fields.length}get numRows(){return this.data.length}get nullCount(){return this.data.nullCount}isValid(t){return this.data.getValid(t)}get(t){return Ms.visit(this.data,t)}set(t,e){return es.visit(this.data,t,e)}indexOf(t,e){return ia.visit(this.data,t,e)}getByteLength(t){return da.visit(this.data,t)}[Symbol.iterator](){return ua.visit(new ba([this.data]))}toArray(){return[...this]}concat(...t){return new Ya(this.schema,[this,...t])}slice(t,e){const[n]=new ba([this.data]).slice(t,e).data;return new za(this.schema,n)}getChild(t){var e;return this.getChildAt(null===(e=this.schema.fields)||void 0===e?void 0:e.findIndex((e=>e.name===t)))}getChildAt(t){return t>-1&&te.name===t)),e)}setChildAt(t,e){let n=this.schema,r=this.data;if(t>-1&&tt.name===e));~t&&(r[t]=this.data.children[t])}return new za(e,_a({type:n,length:this.numRows,children:r}))}selectAt(t){const e=this.schema.selectAt(t),n=t.map((t=>this.data.children[t])).filter(Boolean),r=_a({type:new go(e.fields),length:this.numRows,children:n});return new za(e,r)}}function Ua(t,e,n=e.reduce(((t,e)=>Math.max(t,e.length)),0)){var r;const i=[...t.fields],o=[...e],s=(n+63&-64)>>3;for(const[a,u]of t.fields.entries()){const t=e[a];t&&t.length===n||(i[a]=u.clone({nullable:!0}),o[a]=null!==(r=null==t?void 0:t._changeLengthAndBackfillNullBitmap(n))&&void 0!==r?r:_a({type:u.type,length:n,nullCount:n,nullBitmap:new Uint8Array(s)}))}return[t.assign(i),_a({type:new go(i),length:n,children:o})]}function Va(t,e,n=new Map){for(let r=-1,i=t.length;++r0&&Va(i.children,o.children,n)}return n}Na=Symbol.toStringTag,za[Na]=(t=>(t._nullCount=-1,t[Symbol.isConcatSpreadable]=!0,"RecordBatch"))(za.prototype);class Wa extends za{constructor(t){const e=t.fields.map((t=>_a({type:t.type})));super(t,_a({type:new go(t.fields),nullCount:0,children:e}))}}function $a(t,e){return function(t,e){const n=[...t.fields],r=[],i={numBatches:e.reduce(((t,e)=>Math.max(t,e.length)),0)};let o=0,s=0,a=-1;const u=e.length;let c,l=[];for(;i.numBatches-- >0;){for(s=Number.POSITIVE_INFINITY,a=-1;++a0&&(r[o++]=_a({type:new go(n),length:s,nullCount:0,children:l.slice()})))}return[t=t.assign(n),r.map((e=>new za(t,e)))]}(t,e.map((t=>t.data.concat())))}function Ga(t,e,n,r,i){var o;const s=(e+63&-64)>>3;for(let a=-1,u=r.length;++a=e)c===e?n[a]=u:(n[a]=u.slice(0,e),i.numBatches=Math.max(i.numBatches,r[a].unshift(u.slice(e,c-e))));else{const r=t[a];t[a]=r.clone({nullable:!0}),n[a]=null!==(o=null==u?void 0:u._changeLengthAndBackfillNullBitmap(e))&&void 0!==o?o:_a({type:r.type,length:e,nullCount:e,nullBitmap:new Uint8Array(s)})}}return n}class Ya{constructor(...t){var e,n;if(0===t.length)return this.batches=[],this.schema=new xa([]),this._offsets=[0],this;let r,i;t[0]instanceof xa&&(r=t.shift()),t[t.length-1]instanceof Uint32Array&&(i=t.pop());const o=t=>{if(t){if(t instanceof za)return[t];if(t instanceof Ya)return t.batches;if(t instanceof ga){if(t.type instanceof go)return[new za(new xa(t.type.children),t)]}else{if(Array.isArray(t))return t.flatMap((t=>o(t)));if("function"==typeof t[Symbol.iterator])return[...t].flatMap((t=>o(t)));if("object"==typeof t){const e=Object.keys(t),n=e.map((e=>new ba([t[e]]))),r=new xa(e.map(((t,e)=>new Sa(String(t),n[e].type)))),[,i]=$a(r,n);return 0===i.length?[new za(t)]:i}}}return[]},s=t.flatMap((t=>o(t)));if(r=null!==(n=null!=r?r:null===(e=s[0])||void 0===e?void 0:e.schema)&&void 0!==n?n:new xa([]),!(r instanceof xa))throw new TypeError("Table constructor expects a [Schema, RecordBatch[]] pair.");for(const t of s){if(!(t instanceof za))throw new TypeError("Table constructor expects a [Schema, RecordBatch[]] pair.");if(!Da(r,t.schema))throw new TypeError("Table and inner RecordBatch schemas must be equivalent.")}this.schema=r,this.batches=s,this._offsets=null!=i?i:Vs(this.data)}get data(){return this.batches.map((({data:t})=>t))}get numCols(){return this.schema.fields.length}get numRows(){return this.data.reduce(((t,e)=>t+e.length),0)}get nullCount(){return-1===this._nullCount&&(this._nullCount=Us(this.data)),this._nullCount}isValid(t){return!1}get(t){return null}set(t,e){}indexOf(t,e){return-1}getByteLength(t){return 0}[Symbol.iterator](){return this.batches.length>0?ua.visit(new ba(this.data)):new Array(0)[Symbol.iterator]()}toArray(){return[...this]}toString(){return`[\n ${this.toArray().join(",\n ")}\n]`}concat(...t){const e=this.schema,n=this.data.concat(t.flatMap((({data:t})=>t)));return new Ya(e,n.map((t=>new za(e,t))))}slice(t,e){const n=this.schema;[t,e]=Fs({length:this.numRows},t,e);const r=Ws(this.data,this._offsets,t,e);return new Ya(n,r.map((t=>new za(n,t))))}getChild(t){return this.getChildAt(this.schema.fields.findIndex((e=>e.name===t)))}getChildAt(t){if(t>-1&&te.children[t]));if(0===e.length){const{type:n}=this.schema.fields[t],r=_a({type:n,length:0,nullCount:0});e.push(r._changeLengthAndBackfillNullBitmap(this.numRows))}return new ba(e)}return null}setChild(t,e){var n;return this.setChildAt(null===(n=this.schema.fields)||void 0===n?void 0:n.findIndex((e=>e.name===t)),e)}setChildAt(t,e){let n=this.schema,r=[...this.batches];if(t>-1&&tthis.getChildAt(e)));[i[t],s[t]]=[o,e],[n,r]=$a(n,s)}return new Ya(n,r)}select(t){const e=this.schema.fields.reduce(((t,e,n)=>t.set(e.name,n)),new Map);return this.selectAt(t.map((t=>e.get(t))).filter((t=>t>-1)))}selectAt(t){const e=this.schema.selectAt(t),n=this.batches.map((e=>e.selectAt(t)));return new Ya(e,n)}assign(t){const e=this.schema.fields,[n,r]=t.schema.fields.reduce(((t,n,r)=>{const[i,o]=t,s=e.findIndex((t=>t.name===n.name));return~s?o[s]=r:i.push(r),t}),[[],[]]),i=this.schema.assign(t.schema),o=[...e.map(((t,e)=>[e,r[e]])).map((([e,n])=>void 0===n?this.getChildAt(e):t.getChildAt(n))),...n.map((e=>t.getChildAt(e)))].filter(Boolean);return new Ya(...$a(i,o))}}Ra=Symbol.toStringTag,Ya[Ra]=(t=>(t.schema=null,t.batches=[],t._offsets=new Uint32Array([0]),t._nullCount=-1,t[Symbol.isConcatSpreadable]=!0,t.isValid=Ys(Gs),t.get=Ys(Ms.getVisitFn(Fr.Struct)),t.set=Zs(es.getVisitFn(Fr.Struct)),t.indexOf=Hs(ia.getVisitFn(Fr.Struct)),t.getByteLength=Ys(da.getVisitFn(Fr.Struct)),"Table"))(Ya.prototype);class Za{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}offset(){return this.bb.readInt64(this.bb_pos)}metaDataLength(){return this.bb.readInt32(this.bb_pos+8)}bodyLength(){return this.bb.readInt64(this.bb_pos+16)}static sizeOf(){return 24}static createBlock(t,e,n,r){return t.prep(8,24),t.writeInt64(r),t.pad(4),t.writeInt32(n),t.writeInt64(e),t.offset()}}const Ha=new Int32Array(2),qa=new Float32Array(Ha.buffer),Xa=new Float64Array(Ha.buffer),Ka=1===new Uint16Array(new Uint8Array([1,0]).buffer)[0];class Ja{constructor(t,e){this.low=0|t,this.high=0|e}static create(t,e){return 0==t&&0==e?Ja.ZERO:new Ja(t,e)}toFloat64(){return(this.low>>>0)+4294967296*this.high}equals(t){return this.low==t.low&&this.high==t.high}}var Qa,tu,eu,nu,ru;Ja.ZERO=new Ja(0,0),function(t){t[t.UTF8_BYTES=1]="UTF8_BYTES",t[t.UTF16_STRING=2]="UTF16_STRING"}(Qa||(Qa={}));class iu{constructor(t){this.bytes_=t,this.position_=0}static allocate(t){return new iu(new Uint8Array(t))}clear(){this.position_=0}bytes(){return this.bytes_}position(){return this.position_}setPosition(t){this.position_=t}capacity(){return this.bytes_.length}readInt8(t){return this.readUint8(t)<<24>>24}readUint8(t){return this.bytes_[t]}readInt16(t){return this.readUint16(t)<<16>>16}readUint16(t){return this.bytes_[t]|this.bytes_[t+1]<<8}readInt32(t){return this.bytes_[t]|this.bytes_[t+1]<<8|this.bytes_[t+2]<<16|this.bytes_[t+3]<<24}readUint32(t){return this.readInt32(t)>>>0}readInt64(t){return new Ja(this.readInt32(t),this.readInt32(t+4))}readUint64(t){return new Ja(this.readUint32(t),this.readUint32(t+4))}readFloat32(t){return Ha[0]=this.readInt32(t),qa[0]}readFloat64(t){return Ha[Ka?0:1]=this.readInt32(t),Ha[Ka?1:0]=this.readInt32(t+4),Xa[0]}writeInt8(t,e){this.bytes_[t]=e}writeUint8(t,e){this.bytes_[t]=e}writeInt16(t,e){this.bytes_[t]=e,this.bytes_[t+1]=e>>8}writeUint16(t,e){this.bytes_[t]=e,this.bytes_[t+1]=e>>8}writeInt32(t,e){this.bytes_[t]=e,this.bytes_[t+1]=e>>8,this.bytes_[t+2]=e>>16,this.bytes_[t+3]=e>>24}writeUint32(t,e){this.bytes_[t]=e,this.bytes_[t+1]=e>>8,this.bytes_[t+2]=e>>16,this.bytes_[t+3]=e>>24}writeInt64(t,e){this.writeInt32(t,e.low),this.writeInt32(t+4,e.high)}writeUint64(t,e){this.writeUint32(t,e.low),this.writeUint32(t+4,e.high)}writeFloat32(t,e){qa[0]=e,this.writeInt32(t,Ha[0])}writeFloat64(t,e){Xa[0]=e,this.writeInt32(t,Ha[Ka?0:1]),this.writeInt32(t+4,Ha[Ka?1:0])}getBufferIdentifier(){if(this.bytes_.length>10),56320+(1023&e)))}return r}__union_with_string(t,e){return"string"==typeof t?this.__string(e):this.__union(t,e)}__indirect(t){return t+this.readInt32(t)}__vector(t){return t+this.readInt32(t)+4}__vector_len(t){return this.readInt32(t+this.readInt32(t))}__has_identifier(t){if(4!=t.length)throw new Error("FlatBuffers: file identifier must be length 4");for(let e=0;e<4;e++)if(t.charCodeAt(e)!=this.readInt8(this.position()+4+e))return!1;return!0}createLong(t,e){return Ja.create(t,e)}createScalarList(t,e){const n=[];for(let r=0;rthis.minalign&&(this.minalign=t);const n=1+~(this.bb.capacity()-this.space+e)&t-1;for(;this.space=0&&0==this.vtable[e];e--);const n=e+1;for(;e>=0;e--)this.addInt16(0!=this.vtable[e]?t-this.vtable[e]:0);this.addInt16(t-this.object_start);const r=2*(n+2);this.addInt16(r);let i=0;const o=this.space;t:for(e=0;e=0;e--)this.writeInt8(t.charCodeAt(e))}this.prep(this.minalign,4+r),this.addOffset(t),r&&this.addInt32(this.bb.capacity()-this.space),this.bb.setPosition(this.space)}finishSizePrefixed(t,e){this.finish(t,e,!0)}requiredField(t,e){const n=this.bb.capacity()-t,r=n-this.bb.readInt32(n);if(0==this.bb.readInt16(r+e))throw new Error("FlatBuffers: field "+e+" must be set")}startVector(t,e,n){this.notNested(),this.vector_num_elems=e,this.prep(4,t*e),this.prep(n,t*e)}endVector(){return this.writeInt32(this.vector_num_elems),this.offset()}createSharedString(t){if(!t)return 0;if(this.string_maps||(this.string_maps=new Map),this.string_maps.has(t))return this.string_maps.get(t);const e=this.createString(t);return this.string_maps.set(t,e),e}createString(t){if(!t)return 0;let e;if(t instanceof Uint8Array)e=t;else{e=[];let n=0;for(;n=56320?i:(i<<10)+t.charCodeAt(n++)+-56613888,r<128?e.push(r):(r<2048?e.push(r>>6&31|192):(r<65536?e.push(r>>12&15|224):e.push(r>>18&7|240,r>>12&63|128),e.push(r>>6&63|128)),e.push(63&r|128))}}this.addInt8(0),this.startVector(1,e.length,1),this.bb.setPosition(this.space-=e.length);for(let t=0,n=this.space,r=this.bb.bytes();t=0;n--)t.addOffset(e[n]);return t.endVector()}static startChildrenVector(t,e){t.startVector(4,e,4)}static addCustomMetadata(t,e){t.addFieldOffset(6,e,0)}static createCustomMetadataVector(t,e){t.startVector(4,e.length,4);for(let n=e.length-1;n>=0;n--)t.addOffset(e[n]);return t.endVector()}static startCustomMetadataVector(t,e){t.startVector(4,e,4)}static endField(t){return t.endObject()}}class lu{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsSchema(t,e){return(e||new lu).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsSchema(t,e){return t.setPosition(t.position()+4),(e||new lu).__init(t.readInt32(t.position())+t.position(),t)}endianness(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt16(this.bb_pos+t):eu.Little}fields(t,e){const n=this.bb.__offset(this.bb_pos,6);return n?(e||new cu).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+n)+4*t),this.bb):null}fieldsLength(){const t=this.bb.__offset(this.bb_pos,6);return t?this.bb.__vector_len(this.bb_pos+t):0}customMetadata(t,e){const n=this.bb.__offset(this.bb_pos,8);return n?(e||new su).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+n)+4*t),this.bb):null}customMetadataLength(){const t=this.bb.__offset(this.bb_pos,8);return t?this.bb.__vector_len(this.bb_pos+t):0}features(t){const e=this.bb.__offset(this.bb_pos,10);return e?this.bb.readInt64(this.bb.__vector(this.bb_pos+e)+8*t):this.bb.createLong(0,0)}featuresLength(){const t=this.bb.__offset(this.bb_pos,10);return t?this.bb.__vector_len(this.bb_pos+t):0}static startSchema(t){t.startObject(4)}static addEndianness(t,e){t.addFieldInt16(0,e,eu.Little)}static addFields(t,e){t.addFieldOffset(1,e,0)}static createFieldsVector(t,e){t.startVector(4,e.length,4);for(let n=e.length-1;n>=0;n--)t.addOffset(e[n]);return t.endVector()}static startFieldsVector(t,e){t.startVector(4,e,4)}static addCustomMetadata(t,e){t.addFieldOffset(2,e,0)}static createCustomMetadataVector(t,e){t.startVector(4,e.length,4);for(let n=e.length-1;n>=0;n--)t.addOffset(e[n]);return t.endVector()}static startCustomMetadataVector(t,e){t.startVector(4,e,4)}static addFeatures(t,e){t.addFieldOffset(3,e,0)}static createFeaturesVector(t,e){t.startVector(8,e.length,8);for(let n=e.length-1;n>=0;n--)t.addInt64(e[n]);return t.endVector()}static startFeaturesVector(t,e){t.startVector(8,e,8)}static endSchema(t){return t.endObject()}static finishSchemaBuffer(t,e){t.finish(e)}static finishSizePrefixedSchemaBuffer(t,e){t.finish(e,void 0,!0)}static createSchema(t,e,n,r,i){return lu.startSchema(t),lu.addEndianness(t,e),lu.addFields(t,n),lu.addCustomMetadata(t,r),lu.addFeatures(t,i),lu.endSchema(t)}}class fu{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsFooter(t,e){return(e||new fu).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsFooter(t,e){return t.setPosition(t.position()+4),(e||new fu).__init(t.readInt32(t.position())+t.position(),t)}version(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt16(this.bb_pos+t):tu.V1}schema(t){const e=this.bb.__offset(this.bb_pos,6);return e?(t||new lu).__init(this.bb.__indirect(this.bb_pos+e),this.bb):null}dictionaries(t,e){const n=this.bb.__offset(this.bb_pos,8);return n?(e||new Za).__init(this.bb.__vector(this.bb_pos+n)+24*t,this.bb):null}dictionariesLength(){const t=this.bb.__offset(this.bb_pos,8);return t?this.bb.__vector_len(this.bb_pos+t):0}recordBatches(t,e){const n=this.bb.__offset(this.bb_pos,10);return n?(e||new Za).__init(this.bb.__vector(this.bb_pos+n)+24*t,this.bb):null}recordBatchesLength(){const t=this.bb.__offset(this.bb_pos,10);return t?this.bb.__vector_len(this.bb_pos+t):0}customMetadata(t,e){const n=this.bb.__offset(this.bb_pos,12);return n?(e||new su).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+n)+4*t),this.bb):null}customMetadataLength(){const t=this.bb.__offset(this.bb_pos,12);return t?this.bb.__vector_len(this.bb_pos+t):0}static startFooter(t){t.startObject(5)}static addVersion(t,e){t.addFieldInt16(0,e,tu.V1)}static addSchema(t,e){t.addFieldOffset(1,e,0)}static addDictionaries(t,e){t.addFieldOffset(2,e,0)}static startDictionariesVector(t,e){t.startVector(24,e,8)}static addRecordBatches(t,e){t.addFieldOffset(3,e,0)}static startRecordBatchesVector(t,e){t.startVector(24,e,8)}static addCustomMetadata(t,e){t.addFieldOffset(4,e,0)}static createCustomMetadataVector(t,e){t.startVector(4,e.length,4);for(let n=e.length-1;n>=0;n--)t.addOffset(e[n]);return t.endVector()}static startCustomMetadataVector(t,e){t.startVector(4,e,4)}static endFooter(t){return t.endObject()}static finishFooterBuffer(t,e){t.finish(e)}static finishSizePrefixedFooterBuffer(t,e){t.finish(e,void 0,!0)}}var hu=Ja,du=ou,pu=iu;class yu{constructor(t,e=Mr.V4,n,r){this.schema=t,this.version=e,n&&(this._recordBatches=n),r&&(this._dictionaryBatches=r)}static decode(t){t=new pu(Ii(t));const e=fu.getRootAsFooter(t),n=xa.decode(e.schema());return new vu(n,e)}static encode(t){const e=new du,n=xa.encode(e,t.schema);fu.startRecordBatchesVector(e,t.numRecordBatches);for(const n of[...t.recordBatches()].slice().reverse())bu.encode(e,n);const r=e.endVector();fu.startDictionariesVector(e,t.numDictionaries);for(const n of[...t.dictionaryBatches()].slice().reverse())bu.encode(e,n);const i=e.endVector();return fu.startFooter(e),fu.addSchema(e,n),fu.addVersion(e,Mr.V4),fu.addRecordBatches(e,r),fu.addDictionaries(e,i),fu.finishFooterBuffer(e,fu.endFooter(e)),e.asUint8Array()}get numRecordBatches(){return this._recordBatches.length}get numDictionaries(){return this._dictionaryBatches.length}*recordBatches(){for(let t,e=-1,n=this.numRecordBatches;++e=0&&t=0&&t=0&&t=0&&tgu(function*(t){let e,n,r,i,o=!1,s=[],a=0;({cmd:r,size:i}=yield null);const u=(c=t,function*(t,e){const n=function*(t){yield t},r="string"==typeof e||ArrayBuffer.isView(e)||e instanceof ArrayBuffer||e instanceof wi?n(e):li(e)?e:n(e);return yield*Ti(function*(e){let n=null;do{n=e.next(yield Si(t,n))}while(!n.done)}(r[Symbol.iterator]())),new t}(Uint8Array,c))[Symbol.iterator]();var c;try{do{if(({done:e,value:n}=Number.isNaN(i-a)?u.next():u.next(i-a)),!e&&n.byteLength>0&&(s.push(n),a+=n.byteLength),e||i<=a)do{({cmd:r,size:i}=yield"peek"===r?xi(s,i)[0]:([n,s,a]=xi(s,i),n))}while(igu(function(t){return Hr(this,arguments,(function*(){let e,n,r,i,o=!1,s=[],a=0;({cmd:r,size:i}=yield yield Zr(null));const u=(c=t,Ai(Uint8Array,c))[Symbol.asyncIterator]();var c;try{do{if(({done:e,value:n}=Number.isNaN(i-a)?yield Zr(u.next()):yield Zr(u.next(i-a))),!e&&n.byteLength>0&&(s.push(n),a+=n.byteLength),e||i<=a)do{({cmd:r,size:i}=yield yield Zr("peek"===r?xi(s,i)[0]:([n,s,a]=xi(s,i),n)))}while(igu(function(t){return Hr(this,arguments,(function*(){let e,n,r,i=!1,o=!1,s=[],a=0;({cmd:n,size:r}=yield yield Zr(null));const u=new wu(t);try{do{if(({done:i,value:e}=Number.isNaN(r-a)?yield Zr(u.read()):yield Zr(u.read(r-a))),!i&&e.byteLength>0&&(s.push(Ii(e)),a+=e.byteLength),i||r<=a)do{({cmd:n,size:r}=yield yield Zr("peek"===n?xi(s,r)[0]:([e,s,a]=xi(s,r),e)))}while(rgu(function(t){return Hr(this,arguments,(function*(){const e=[];let n,r,i,o="error",s=!1,a=null,u=0,c=[];if(({cmd:n,size:r}=yield yield Zr(null)),t.isTTY)return yield yield Zr(new Uint8Array(0)),yield Zr(null);try{e[0]=_u(t,"end"),e[1]=_u(t,"error");do{if(e[2]=_u(t,"readable"),[o,a]=yield Zr(Promise.race(e.map((t=>t[2])))),"error"===o)break;if((s="end"===o)||(Number.isFinite(r-u)?(i=Ii(t.read(r-u)),i.byteLength0&&(c.push(i),u+=i.byteLength)),s||r<=u)do{({cmd:n,size:r}=yield yield Zr("peek"===n?xi(c,r)[0]:([i,c,u]=xi(c,r),i)))}while(r{for(const[n,r]of e)t.off(n,r);try{const e=t.destroy;e&&e.call(t,n),n=void 0}catch(t){n=t||n}finally{null!=n?i(n):r()}}))}(e,"error"===o?a:null))}return yield Zr(null)}))}(t)),toDOMStream(t,e){throw new Error('"toDOMStream" not available in this environment')},toNodeStream(t,e){throw new Error('"toNodeStream" not available in this environment')}},gu=t=>(t.next(),t);class wu{constructor(t){this.source=t,this.reader=null,this.reader=this.source.getReader(),this.reader.closed.catch((()=>{}))}get closed(){return this.reader?this.reader.closed.catch((()=>{})):Promise.resolve()}releaseLock(){this.reader&&this.reader.releaseLock(),this.reader=null}cancel(t){return Yr(this,void 0,void 0,(function*(){const{reader:e,source:n}=this;e&&(yield e.cancel(t).catch((()=>{}))),n&&n.locked&&this.releaseLock()}))}read(t){return Yr(this,void 0,void 0,(function*(){if(0===t)return{done:null==this.reader,value:new Uint8Array(0)};const e=yield this.reader.read();return!e.done&&(e.value=Ii(e)),e}))}}const _u=(t,e)=>{const n=t=>r([e,t]);let r;return[e,n,new Promise((i=>(r=i)&&t.once(e,n)))]},xu=Object.freeze({done:!0,value:void 0});class Su{constructor(t){this._json=t}get schema(){return this._json.schema}get batches(){return this._json.batches||[]}get dictionaries(){return this._json.dictionaries||[]}}class Ou{tee(){return this._getDOMStream().tee()}pipe(t,e){return this._getNodeStream().pipe(t,e)}pipeTo(t,e){return this._getDOMStream().pipeTo(t,e)}pipeThrough(t,e){return this._getDOMStream().pipeThrough(t,e)}_getDOMStream(){return this._DOMStream||(this._DOMStream=this.toDOMStream())}_getNodeStream(){return this._nodeStream||(this._nodeStream=this.toNodeStream())}}class Iu extends Ou{constructor(){super(),this._values=[],this.resolvers=[],this._closedPromise=new Promise((t=>this._closedPromiseResolve=t))}get closed(){return this._closedPromise}cancel(t){return Yr(this,void 0,void 0,(function*(){yield this.return(t)}))}write(t){this._ensureOpen()&&(this.resolvers.length<=0?this._values.push(t):this.resolvers.shift().resolve({done:!1,value:t}))}abort(t){this._closedPromiseResolve&&(this.resolvers.length<=0?this._error={error:t}:this.resolvers.shift().reject({done:!0,value:t}))}close(){if(this._closedPromiseResolve){const{resolvers:t}=this;for(;t.length>0;)t.shift().resolve(xu);this._closedPromiseResolve(),this._closedPromiseResolve=void 0}}[Symbol.asyncIterator](){return this}toDOMStream(t){return mu.toDOMStream(this._closedPromiseResolve||this._error?this:this._values,t)}toNodeStream(t){return mu.toNodeStream(this._closedPromiseResolve||this._error?this:this._values,t)}throw(t){return Yr(this,void 0,void 0,(function*(){return yield this.abort(t),xu}))}return(t){return Yr(this,void 0,void 0,(function*(){return yield this.close(),xu}))}read(t){return Yr(this,void 0,void 0,(function*(){return(yield this.next(t,"read")).value}))}peek(t){return Yr(this,void 0,void 0,(function*(){return(yield this.next(t,"peek")).value}))}next(...t){return this._values.length>0?Promise.resolve({done:!1,value:this._values.shift()}):this._error?Promise.reject({done:!0,value:this._error.error}):this._closedPromiseResolve?new Promise(((t,e)=>{this.resolvers.push({resolve:t,reject:e})})):Promise.resolve(xu)}_ensureOpen(){if(this._closedPromiseResolve)return!0;throw new Error("AsyncQueue is closed")}}class Tu extends Iu{write(t){if((t=Ii(t)).byteLength>0)return super.write(t)}toString(t=!1){return t?Jr(this.toUint8Array(!0)):this.toUint8Array(!1).then(Jr)}toUint8Array(t=!1){return t?xi(this._values)[0]:(()=>Yr(this,void 0,void 0,(function*(){var t,e;const n=[];let r=0;try{for(var i,o=Xr(this);!(i=yield o.next()).done;){const t=i.value;n.push(t),r+=t.byteLength}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=o.return)&&(yield e.call(o))}finally{if(t)throw t.error}}return xi(n,r)[0]})))()}}class Au{constructor(t){t&&(this.source=new Eu(mu.fromIterable(t)))}[Symbol.iterator](){return this}next(t){return this.source.next(t)}throw(t){return this.source.throw(t)}return(t){return this.source.return(t)}peek(t){return this.source.peek(t)}read(t){return this.source.read(t)}}class Mu{constructor(t){t instanceof Mu?this.source=t.source:t instanceof Tu?this.source=new Cu(mu.fromAsyncIterable(t)):mi(t)?this.source=new Cu(mu.fromNodeStream(t)):bi(t)?this.source=new Cu(mu.fromDOMStream(t)):yi(t)?this.source=new Cu(mu.fromDOMStream(t.body)):li(t)?this.source=new Cu(mu.fromIterable(t)):(ci(t)||fi(t))&&(this.source=new Cu(mu.fromAsyncIterable(t)))}[Symbol.asyncIterator](){return this}next(t){return this.source.next(t)}throw(t){return this.source.throw(t)}return(t){return this.source.return(t)}get closed(){return this.source.closed}cancel(t){return this.source.cancel(t)}peek(t){return this.source.peek(t)}read(t){return this.source.read(t)}}class Eu{constructor(t){this.source=t}cancel(t){this.return(t)}peek(t){return this.next(t,"peek").value}read(t){return this.next(t,"read").value}next(t,e="read"){return this.source.next({cmd:e,size:t})}throw(t){return Object.create(this.source.throw&&this.source.throw(t)||xu)}return(t){return Object.create(this.source.return&&this.source.return(t)||xu)}}class Cu{constructor(t){this.source=t,this._closedPromise=new Promise((t=>this._closedPromiseResolve=t))}cancel(t){return Yr(this,void 0,void 0,(function*(){yield this.return(t)}))}get closed(){return this._closedPromise}read(t){return Yr(this,void 0,void 0,(function*(){return(yield this.next(t,"read")).value}))}peek(t){return Yr(this,void 0,void 0,(function*(){return(yield this.next(t,"peek")).value}))}next(t,e="read"){return Yr(this,void 0,void 0,(function*(){return yield this.source.next({cmd:e,size:t})}))}throw(t){return Yr(this,void 0,void 0,(function*(){const e=this.source.throw&&(yield this.source.throw(t))||xu;return this._closedPromiseResolve&&this._closedPromiseResolve(),this._closedPromiseResolve=void 0,Object.create(e)}))}return(t){return Yr(this,void 0,void 0,(function*(){const e=this.source.return&&(yield this.source.return(t))||xu;return this._closedPromiseResolve&&this._closedPromiseResolve(),this._closedPromiseResolve=void 0,Object.create(e)}))}}class Pu extends Au{constructor(t,e){super(),this.position=0,this.buffer=Ii(t),this.size=void 0===e?this.buffer.byteLength:e}readInt32(t){const{buffer:e,byteOffset:n}=this.readAt(t,4);return new DataView(e,n).getInt32(0,!0)}seek(t){return this.position=Math.min(t,this.size),tYr(this,void 0,void 0,(function*(){this.size=(yield t.stat()).size,delete this._pending})))()}readInt32(t){return Yr(this,void 0,void 0,(function*(){const{buffer:e,byteOffset:n}=yield this.readAt(t,4);return new DataView(e,n).getInt32(0,!0)}))}seek(t){return Yr(this,void 0,void 0,(function*(){return this._pending&&(yield this._pending),this.position=Math.min(t,this.size),t>>16,65535&this.buffer[1],this.buffer[0]>>>16,65535&this.buffer[0]]),n=new Uint32Array([t.buffer[1]>>>16,65535&t.buffer[1],t.buffer[0]>>>16,65535&t.buffer[0]]);let r=e[3]*n[3];this.buffer[0]=65535&r;let i=r>>>16;return r=e[2]*n[3],i+=r,r=e[3]*n[2]>>>0,i+=r,this.buffer[0]+=i<<16,this.buffer[1]=i>>>0>>16,this.buffer[1]+=e[1]*n[3]+e[2]*n[2]+e[3]*n[1],this.buffer[1]+=e[0]*n[3]+e[1]*n[2]+e[2]*n[1]+e[3]*n[0]<<16,this}_plus(t){const e=this.buffer[0]+t.buffer[0]>>>0;this.buffer[1]+=t.buffer[1],e>>0&&++this.buffer[1],this.buffer[0]=e}lessThan(t){return this.buffer[1]>>0,e[2]=this.buffer[2]+t.buffer[2]>>>0,e[1]=this.buffer[1]+t.buffer[1]>>>0,e[0]=this.buffer[0]+t.buffer[0]>>>0,e[0]>>0&&++e[1],e[1]>>0&&++e[2],e[2]>>0&&++e[3],this.buffer[3]=e[3],this.buffer[2]=e[2],this.buffer[1]=e[1],this.buffer[0]=e[0],this}hex(){return`${ku(this.buffer[3])} ${ku(this.buffer[2])} ${ku(this.buffer[1])} ${ku(this.buffer[0])}`}static multiply(t,e){return new Nu(new Uint32Array(t.buffer)).times(e)}static add(t,e){return new Nu(new Uint32Array(t.buffer)).plus(e)}static from(t,e=new Uint32Array(4)){return Nu.fromString("string"==typeof t?t:t.toString(),e)}static fromNumber(t,e=new Uint32Array(4)){return Nu.fromString(t.toString(),e)}static fromString(t,e=new Uint32Array(4)){const n=t.startsWith("-"),r=t.length,i=new Nu(e);for(let e=n?1:0;e0&&this.readData(t,n)||new Uint8Array(0)}readOffsets(t,e){return this.readData(t,e)}readTypeIds(t,e){return this.readData(t,e)}readData(t,{length:e,offset:n}=this.nextBufferRange()){return this.bytes.subarray(n,n+e)}readDictionary(t){return this.dictionaries.get(t.id)}}class zu extends Ru{constructor(t,e,n,r){super(new Uint8Array(0),e,n,r),this.sources=t}readNullBitmap(t,e,{offset:n}=this.nextBufferRange()){return e<=0?new Uint8Array(0):Ks(this.sources[n])}readOffsets(t,{offset:e}=this.nextBufferRange()){return Si(Uint8Array,Si(Int32Array,this.sources[e]))}readTypeIds(t,{offset:e}=this.nextBufferRange()){return Si(Uint8Array,Si(t.ArrayType,this.sources[e]))}readData(t,{offset:e}=this.nextBufferRange()){const{sources:n}=this;return io.isTimestamp(t)||(io.isInt(t)||io.isTime(t))&&64===t.bitWidth||io.isDate(t)&&t.unit===Pr.MILLISECOND?Si(Uint8Array,Du.convertArray(n[e])):io.isDecimal(t)?Si(Uint8Array,Nu.convertArray(n[e])):io.isBinary(t)||io.isFixedSizeBinary(t)?function(t){const e=t.join(""),n=new Uint8Array(e.length/2);for(let t=0;t>1]=Number.parseInt(e.slice(t,t+2),16);return n}(n[e]):io.isBool(t)?Ks(n[e]):io.isUtf8(t)?ti(n[e].join("")):Si(Uint8Array,Si(t.ArrayType,n[e].map((t=>+t))))}}var Uu,Vu,Wu,$u,Gu,Yu,Zu,Hu;!function(t){t[t.BUFFER=0]="BUFFER"}(Uu||(Uu={})),function(t){t[t.LZ4_FRAME=0]="LZ4_FRAME",t[t.ZSTD=1]="ZSTD"}(Vu||(Vu={}));class qu{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsBodyCompression(t,e){return(e||new qu).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsBodyCompression(t,e){return t.setPosition(t.position()+4),(e||new qu).__init(t.readInt32(t.position())+t.position(),t)}codec(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt8(this.bb_pos+t):Vu.LZ4_FRAME}method(){const t=this.bb.__offset(this.bb_pos,6);return t?this.bb.readInt8(this.bb_pos+t):Uu.BUFFER}static startBodyCompression(t){t.startObject(2)}static addCodec(t,e){t.addFieldInt8(0,e,Vu.LZ4_FRAME)}static addMethod(t,e){t.addFieldInt8(1,e,Uu.BUFFER)}static endBodyCompression(t){return t.endObject()}static createBodyCompression(t,e,n){return qu.startBodyCompression(t),qu.addCodec(t,e),qu.addMethod(t,n),qu.endBodyCompression(t)}}class Xu{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}offset(){return this.bb.readInt64(this.bb_pos)}length(){return this.bb.readInt64(this.bb_pos+8)}static sizeOf(){return 16}static createBuffer(t,e,n){return t.prep(8,16),t.writeInt64(n),t.writeInt64(e),t.offset()}}class Ku{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}length(){return this.bb.readInt64(this.bb_pos)}nullCount(){return this.bb.readInt64(this.bb_pos+8)}static sizeOf(){return 16}static createFieldNode(t,e,n){return t.prep(8,16),t.writeInt64(n),t.writeInt64(e),t.offset()}}class Ju{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsRecordBatch(t,e){return(e||new Ju).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsRecordBatch(t,e){return t.setPosition(t.position()+4),(e||new Ju).__init(t.readInt32(t.position())+t.position(),t)}length(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt64(this.bb_pos+t):this.bb.createLong(0,0)}nodes(t,e){const n=this.bb.__offset(this.bb_pos,6);return n?(e||new Ku).__init(this.bb.__vector(this.bb_pos+n)+16*t,this.bb):null}nodesLength(){const t=this.bb.__offset(this.bb_pos,6);return t?this.bb.__vector_len(this.bb_pos+t):0}buffers(t,e){const n=this.bb.__offset(this.bb_pos,8);return n?(e||new Xu).__init(this.bb.__vector(this.bb_pos+n)+16*t,this.bb):null}buffersLength(){const t=this.bb.__offset(this.bb_pos,8);return t?this.bb.__vector_len(this.bb_pos+t):0}compression(t){const e=this.bb.__offset(this.bb_pos,10);return e?(t||new qu).__init(this.bb.__indirect(this.bb_pos+e),this.bb):null}static startRecordBatch(t){t.startObject(4)}static addLength(t,e){t.addFieldInt64(0,e,t.createLong(0,0))}static addNodes(t,e){t.addFieldOffset(1,e,0)}static startNodesVector(t,e){t.startVector(16,e,8)}static addBuffers(t,e){t.addFieldOffset(2,e,0)}static startBuffersVector(t,e){t.startVector(16,e,8)}static addCompression(t,e){t.addFieldOffset(3,e,0)}static endRecordBatch(t){return t.endObject()}}class Qu{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsDictionaryBatch(t,e){return(e||new Qu).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsDictionaryBatch(t,e){return t.setPosition(t.position()+4),(e||new Qu).__init(t.readInt32(t.position())+t.position(),t)}id(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt64(this.bb_pos+t):this.bb.createLong(0,0)}data(t){const e=this.bb.__offset(this.bb_pos,6);return e?(t||new Ju).__init(this.bb.__indirect(this.bb_pos+e),this.bb):null}isDelta(){const t=this.bb.__offset(this.bb_pos,8);return!!t&&!!this.bb.readInt8(this.bb_pos+t)}static startDictionaryBatch(t){t.startObject(3)}static addId(t,e){t.addFieldInt64(0,e,t.createLong(0,0))}static addData(t,e){t.addFieldOffset(1,e,0)}static addIsDelta(t,e){t.addFieldInt8(2,+e,0)}static endDictionaryBatch(t){return t.endObject()}}!function(t){t[t.HALF=0]="HALF",t[t.SINGLE=1]="SINGLE",t[t.DOUBLE=2]="DOUBLE"}(Wu||(Wu={}));class tc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsFloatingPoint(t,e){return(e||new tc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsFloatingPoint(t,e){return t.setPosition(t.position()+4),(e||new tc).__init(t.readInt32(t.position())+t.position(),t)}precision(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt16(this.bb_pos+t):Wu.HALF}static startFloatingPoint(t){t.startObject(1)}static addPrecision(t,e){t.addFieldInt16(0,e,Wu.HALF)}static endFloatingPoint(t){return t.endObject()}static createFloatingPoint(t,e){return tc.startFloatingPoint(t),tc.addPrecision(t,e),tc.endFloatingPoint(t)}}class ec{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsDecimal(t,e){return(e||new ec).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsDecimal(t,e){return t.setPosition(t.position()+4),(e||new ec).__init(t.readInt32(t.position())+t.position(),t)}precision(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt32(this.bb_pos+t):0}scale(){const t=this.bb.__offset(this.bb_pos,6);return t?this.bb.readInt32(this.bb_pos+t):0}bitWidth(){const t=this.bb.__offset(this.bb_pos,8);return t?this.bb.readInt32(this.bb_pos+t):128}static startDecimal(t){t.startObject(3)}static addPrecision(t,e){t.addFieldInt32(0,e,0)}static addScale(t,e){t.addFieldInt32(1,e,0)}static addBitWidth(t,e){t.addFieldInt32(2,e,128)}static endDecimal(t){return t.endObject()}static createDecimal(t,e,n,r){return ec.startDecimal(t),ec.addPrecision(t,e),ec.addScale(t,n),ec.addBitWidth(t,r),ec.endDecimal(t)}}!function(t){t[t.DAY=0]="DAY",t[t.MILLISECOND=1]="MILLISECOND"}($u||($u={}));class nc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsDate(t,e){return(e||new nc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsDate(t,e){return t.setPosition(t.position()+4),(e||new nc).__init(t.readInt32(t.position())+t.position(),t)}unit(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt16(this.bb_pos+t):$u.MILLISECOND}static startDate(t){t.startObject(1)}static addUnit(t,e){t.addFieldInt16(0,e,$u.MILLISECOND)}static endDate(t){return t.endObject()}static createDate(t,e){return nc.startDate(t),nc.addUnit(t,e),nc.endDate(t)}}!function(t){t[t.SECOND=0]="SECOND",t[t.MILLISECOND=1]="MILLISECOND",t[t.MICROSECOND=2]="MICROSECOND",t[t.NANOSECOND=3]="NANOSECOND"}(Gu||(Gu={}));class rc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsTime(t,e){return(e||new rc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsTime(t,e){return t.setPosition(t.position()+4),(e||new rc).__init(t.readInt32(t.position())+t.position(),t)}unit(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt16(this.bb_pos+t):Gu.MILLISECOND}bitWidth(){const t=this.bb.__offset(this.bb_pos,6);return t?this.bb.readInt32(this.bb_pos+t):32}static startTime(t){t.startObject(2)}static addUnit(t,e){t.addFieldInt16(0,e,Gu.MILLISECOND)}static addBitWidth(t,e){t.addFieldInt32(1,e,32)}static endTime(t){return t.endObject()}static createTime(t,e,n){return rc.startTime(t),rc.addUnit(t,e),rc.addBitWidth(t,n),rc.endTime(t)}}class ic{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsTimestamp(t,e){return(e||new ic).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsTimestamp(t,e){return t.setPosition(t.position()+4),(e||new ic).__init(t.readInt32(t.position())+t.position(),t)}unit(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt16(this.bb_pos+t):Gu.SECOND}timezone(t){const e=this.bb.__offset(this.bb_pos,6);return e?this.bb.__string(this.bb_pos+e,t):null}static startTimestamp(t){t.startObject(2)}static addUnit(t,e){t.addFieldInt16(0,e,Gu.SECOND)}static addTimezone(t,e){t.addFieldOffset(1,e,0)}static endTimestamp(t){return t.endObject()}static createTimestamp(t,e,n){return ic.startTimestamp(t),ic.addUnit(t,e),ic.addTimezone(t,n),ic.endTimestamp(t)}}!function(t){t[t.YEAR_MONTH=0]="YEAR_MONTH",t[t.DAY_TIME=1]="DAY_TIME",t[t.MONTH_DAY_NANO=2]="MONTH_DAY_NANO"}(Yu||(Yu={}));class oc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsInterval(t,e){return(e||new oc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsInterval(t,e){return t.setPosition(t.position()+4),(e||new oc).__init(t.readInt32(t.position())+t.position(),t)}unit(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt16(this.bb_pos+t):Yu.YEAR_MONTH}static startInterval(t){t.startObject(1)}static addUnit(t,e){t.addFieldInt16(0,e,Yu.YEAR_MONTH)}static endInterval(t){return t.endObject()}static createInterval(t,e){return oc.startInterval(t),oc.addUnit(t,e),oc.endInterval(t)}}!function(t){t[t.Sparse=0]="Sparse",t[t.Dense=1]="Dense"}(Zu||(Zu={}));class sc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsUnion(t,e){return(e||new sc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsUnion(t,e){return t.setPosition(t.position()+4),(e||new sc).__init(t.readInt32(t.position())+t.position(),t)}mode(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt16(this.bb_pos+t):Zu.Sparse}typeIds(t){const e=this.bb.__offset(this.bb_pos,6);return e?this.bb.readInt32(this.bb.__vector(this.bb_pos+e)+4*t):0}typeIdsLength(){const t=this.bb.__offset(this.bb_pos,6);return t?this.bb.__vector_len(this.bb_pos+t):0}typeIdsArray(){const t=this.bb.__offset(this.bb_pos,6);return t?new Int32Array(this.bb.bytes().buffer,this.bb.bytes().byteOffset+this.bb.__vector(this.bb_pos+t),this.bb.__vector_len(this.bb_pos+t)):null}static startUnion(t){t.startObject(2)}static addMode(t,e){t.addFieldInt16(0,e,Zu.Sparse)}static addTypeIds(t,e){t.addFieldOffset(1,e,0)}static createTypeIdsVector(t,e){t.startVector(4,e.length,4);for(let n=e.length-1;n>=0;n--)t.addInt32(e[n]);return t.endVector()}static startTypeIdsVector(t,e){t.startVector(4,e,4)}static endUnion(t){return t.endObject()}static createUnion(t,e,n){return sc.startUnion(t),sc.addMode(t,e),sc.addTypeIds(t,n),sc.endUnion(t)}}class ac{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsFixedSizeBinary(t,e){return(e||new ac).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsFixedSizeBinary(t,e){return t.setPosition(t.position()+4),(e||new ac).__init(t.readInt32(t.position())+t.position(),t)}byteWidth(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt32(this.bb_pos+t):0}static startFixedSizeBinary(t){t.startObject(1)}static addByteWidth(t,e){t.addFieldInt32(0,e,0)}static endFixedSizeBinary(t){return t.endObject()}static createFixedSizeBinary(t,e){return ac.startFixedSizeBinary(t),ac.addByteWidth(t,e),ac.endFixedSizeBinary(t)}}class uc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsFixedSizeList(t,e){return(e||new uc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsFixedSizeList(t,e){return t.setPosition(t.position()+4),(e||new uc).__init(t.readInt32(t.position())+t.position(),t)}listSize(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt32(this.bb_pos+t):0}static startFixedSizeList(t){t.startObject(1)}static addListSize(t,e){t.addFieldInt32(0,e,0)}static endFixedSizeList(t){return t.endObject()}static createFixedSizeList(t,e){return uc.startFixedSizeList(t),uc.addListSize(t,e),uc.endFixedSizeList(t)}}class cc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsMap(t,e){return(e||new cc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsMap(t,e){return t.setPosition(t.position()+4),(e||new cc).__init(t.readInt32(t.position())+t.position(),t)}keysSorted(){const t=this.bb.__offset(this.bb_pos,4);return!!t&&!!this.bb.readInt8(this.bb_pos+t)}static startMap(t){t.startObject(1)}static addKeysSorted(t,e){t.addFieldInt8(0,+e,0)}static endMap(t){return t.endObject()}static createMap(t,e){return cc.startMap(t),cc.addKeysSorted(t,e),cc.endMap(t)}}!function(t){t[t.NONE=0]="NONE",t[t.Schema=1]="Schema",t[t.DictionaryBatch=2]="DictionaryBatch",t[t.RecordBatch=3]="RecordBatch",t[t.Tensor=4]="Tensor",t[t.SparseTensor=5]="SparseTensor"}(Hu||(Hu={}));class lc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsMessage(t,e){return(e||new lc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsMessage(t,e){return t.setPosition(t.position()+4),(e||new lc).__init(t.readInt32(t.position())+t.position(),t)}version(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readInt16(this.bb_pos+t):tu.V1}headerType(){const t=this.bb.__offset(this.bb_pos,6);return t?this.bb.readUint8(this.bb_pos+t):Hu.NONE}header(t){const e=this.bb.__offset(this.bb_pos,8);return e?this.bb.__union(t,this.bb_pos+e):null}bodyLength(){const t=this.bb.__offset(this.bb_pos,10);return t?this.bb.readInt64(this.bb_pos+t):this.bb.createLong(0,0)}customMetadata(t,e){const n=this.bb.__offset(this.bb_pos,12);return n?(e||new su).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+n)+4*t),this.bb):null}customMetadataLength(){const t=this.bb.__offset(this.bb_pos,12);return t?this.bb.__vector_len(this.bb_pos+t):0}static startMessage(t){t.startObject(5)}static addVersion(t,e){t.addFieldInt16(0,e,tu.V1)}static addHeaderType(t,e){t.addFieldInt8(1,e,Hu.NONE)}static addHeader(t,e){t.addFieldOffset(2,e,0)}static addBodyLength(t,e){t.addFieldInt64(3,e,t.createLong(0,0))}static addCustomMetadata(t,e){t.addFieldOffset(4,e,0)}static createCustomMetadataVector(t,e){t.startVector(4,e.length,4);for(let n=e.length-1;n>=0;n--)t.addOffset(e[n]);return t.endVector()}static startCustomMetadataVector(t,e){t.startVector(4,e,4)}static endMessage(t){return t.endObject()}static finishMessageBuffer(t,e){t.finish(e)}static finishSizePrefixedMessageBuffer(t,e){t.finish(e,void 0,!0)}static createMessage(t,e,n,r,i,o){return lc.startMessage(t),lc.addVersion(t,e),lc.addHeaderType(t,n),lc.addHeader(t,r),lc.addBodyLength(t,i),lc.addCustomMetadata(t,o),lc.endMessage(t)}}class fc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsNull(t,e){return(e||new fc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsNull(t,e){return t.setPosition(t.position()+4),(e||new fc).__init(t.readInt32(t.position())+t.position(),t)}static startNull(t){t.startObject(0)}static endNull(t){return t.endObject()}static createNull(t){return fc.startNull(t),fc.endNull(t)}}class hc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsBinary(t,e){return(e||new hc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsBinary(t,e){return t.setPosition(t.position()+4),(e||new hc).__init(t.readInt32(t.position())+t.position(),t)}static startBinary(t){t.startObject(0)}static endBinary(t){return t.endObject()}static createBinary(t){return hc.startBinary(t),hc.endBinary(t)}}class dc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsBool(t,e){return(e||new dc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsBool(t,e){return t.setPosition(t.position()+4),(e||new dc).__init(t.readInt32(t.position())+t.position(),t)}static startBool(t){t.startObject(0)}static endBool(t){return t.endObject()}static createBool(t){return dc.startBool(t),dc.endBool(t)}}class pc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsUtf8(t,e){return(e||new pc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsUtf8(t,e){return t.setPosition(t.position()+4),(e||new pc).__init(t.readInt32(t.position())+t.position(),t)}static startUtf8(t){t.startObject(0)}static endUtf8(t){return t.endObject()}static createUtf8(t){return pc.startUtf8(t),pc.endUtf8(t)}}class yc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsList(t,e){return(e||new yc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsList(t,e){return t.setPosition(t.position()+4),(e||new yc).__init(t.readInt32(t.position())+t.position(),t)}static startList(t){t.startObject(0)}static endList(t){return t.endObject()}static createList(t){return yc.startList(t),yc.endList(t)}}class vc{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsStruct_(t,e){return(e||new vc).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsStruct_(t,e){return t.setPosition(t.position()+4),(e||new vc).__init(t.readInt32(t.position())+t.position(),t)}static startStruct_(t){t.startObject(0)}static endStruct_(t){return t.endObject()}static createStruct_(t){return vc.startStruct_(t),vc.endStruct_(t)}}var bc=Ja;const mc=new class extends Mo{visit(t,e){return null==t||null==e?void 0:super.visit(t,e)}visitNull(t,e){return fc.startNull(e),fc.endNull(e)}visitInt(t,e){return au.startInt(e),au.addBitWidth(e,t.bitWidth),au.addIsSigned(e,t.isSigned),au.endInt(e)}visitFloat(t,e){return tc.startFloatingPoint(e),tc.addPrecision(e,t.precision),tc.endFloatingPoint(e)}visitBinary(t,e){return hc.startBinary(e),hc.endBinary(e)}visitBool(t,e){return dc.startBool(e),dc.endBool(e)}visitUtf8(t,e){return pc.startUtf8(e),pc.endUtf8(e)}visitDecimal(t,e){return ec.startDecimal(e),ec.addScale(e,t.scale),ec.addPrecision(e,t.precision),ec.addBitWidth(e,t.bitWidth),ec.endDecimal(e)}visitDate(t,e){return nc.startDate(e),nc.addUnit(e,t.unit),nc.endDate(e)}visitTime(t,e){return rc.startTime(e),rc.addUnit(e,t.unit),rc.addBitWidth(e,t.bitWidth),rc.endTime(e)}visitTimestamp(t,e){const n=t.timezone&&e.createString(t.timezone)||void 0;return ic.startTimestamp(e),ic.addUnit(e,t.unit),void 0!==n&&ic.addTimezone(e,n),ic.endTimestamp(e)}visitInterval(t,e){return oc.startInterval(e),oc.addUnit(e,t.unit),oc.endInterval(e)}visitList(t,e){return yc.startList(e),yc.endList(e)}visitStruct(t,e){return vc.startStruct_(e),vc.endStruct_(e)}visitUnion(t,e){sc.startTypeIdsVector(e,t.typeIds.length);const n=sc.createTypeIdsVector(e,t.typeIds);return sc.startUnion(e),sc.addMode(e,t.mode),sc.addTypeIds(e,n),sc.endUnion(e)}visitDictionary(t,e){const n=this.visit(t.indices,e);return uu.startDictionaryEncoding(e),uu.addId(e,new bc(t.id,0)),uu.addIsOrdered(e,t.isOrdered),void 0!==n&&uu.addIndexType(e,n),uu.endDictionaryEncoding(e)}visitFixedSizeBinary(t,e){return ac.startFixedSizeBinary(e),ac.addByteWidth(e,t.byteWidth),ac.endFixedSizeBinary(e)}visitFixedSizeList(t,e){return uc.startFixedSizeList(e),uc.addListSize(e,t.listSize),uc.endFixedSizeList(e)}visitMap(t,e){return cc.startMap(e),cc.addKeysSorted(e,t.keysSorted),cc.endMap(e)}};function gc(t){return new Cc(t.count,_c(t.columns),xc(t.columns))}function wc(t,e){return(t.children||[]).filter(Boolean).map((t=>Sa.fromJSON(t,e)))}function _c(t){return(t||[]).reduce(((t,e)=>{return[...t,new kc(e.count,(n=e.VALIDITY,(n||[]).reduce(((t,e)=>t+ +(0===e)),0))),..._c(e.children)];var n}),[])}function xc(t,e=[]){for(let n=-1,r=(t||[]).length;++nr),this._bodyLength="number"==typeof t?t:t.low}static fromJSON(t,e){const n=new Ec(0,Mr.V4,e);return n._createHeader=function(t,e){return()=>{switch(e){case Br.Schema:return xa.fromJSON(t);case Br.RecordBatch:return Cc.fromJSON(t);case Br.DictionaryBatch:return Pc.fromJSON(t)}throw new Error(`Unrecognized Message type: { name: ${Br[e]}, type: ${e} }`)}}(t,e),n}static decode(t){t=new Mc(Ii(t));const e=lc.getRootAsMessage(t),n=e.bodyLength(),r=e.version(),i=e.headerType(),o=new Ec(n,r,i);return o._createHeader=function(t,e){return()=>{switch(e){case Br.Schema:return xa.decode(t.header(new lu));case Br.RecordBatch:return Cc.decode(t.header(new Ju),t.version());case Br.DictionaryBatch:return Pc.decode(t.header(new Qu),t.version())}throw new Error(`Unrecognized Message type: { name: ${Br[e]}, type: ${e} }`)}}(e,i),o}static encode(t){const e=new Ac;let n=-1;return t.isSchema()?n=xa.encode(e,t.header()):t.isRecordBatch()?n=Cc.encode(e,t.header()):t.isDictionaryBatch()&&(n=Pc.encode(e,t.header())),lc.startMessage(e),lc.addVersion(e,Mr.V4),lc.addHeader(e,n),lc.addHeaderType(e,t.headerType),lc.addBodyLength(e,new Tc(t.bodyLength,0)),lc.finishMessageBuffer(e,lc.endMessage(e)),e.asUint8Array()}static from(t,e=0){if(t instanceof xa)return new Ec(0,Mr.V4,Br.Schema,t);if(t instanceof Cc)return new Ec(e,Mr.V4,Br.RecordBatch,t);if(t instanceof Pc)return new Ec(e,Mr.V4,Br.DictionaryBatch,t);throw new Error(`Unrecognized Message header: ${t}`)}get type(){return this.headerType}get version(){return this._version}get headerType(){return this._headerType}get bodyLength(){return this._bodyLength}header(){return this._createHeader()}isSchema(){return this.headerType===Br.Schema}isRecordBatch(){return this.headerType===Br.RecordBatch}isDictionaryBatch(){return this.headerType===Br.DictionaryBatch}}class Cc{constructor(t,e,n){this._nodes=e,this._buffers=n,this._length="number"==typeof t?t:t.low}get nodes(){return this._nodes}get length(){return this._length}get buffers(){return this._buffers}}class Pc{constructor(t,e,n=!1){this._data=t,this._isDelta=n,this._id="number"==typeof e?e:e.low}get id(){return this._id}get data(){return this._data}get isDelta(){return this._isDelta}get length(){return this.data.length}get nodes(){return this.data.nodes}get buffers(){return this.data.buffers}}class jc{constructor(t,e){this.offset="number"==typeof t?t:t.low,this.length="number"==typeof e?e:e.low}}class kc{constructor(t,e){this.length="number"==typeof t?t:t.low,this.nullCount="number"==typeof e?e:e.low}}function Bc(t,e){const n=[];for(let r,i=-1,o=-1,s=t.childrenLength();++iSa.encode(t,e))),u=cu.createChildrenVector(t,a),c=e.metadata&&e.metadata.size>0?cu.createCustomMetadataVector(t,[...e.metadata].map((([e,n])=>{const r=t.createString(`${e}`),i=t.createString(`${n}`);return su.startKeyValue(t),su.addKey(t,r),su.addValue(t,i),su.endKeyValue(t)}))):-1;return e.name&&(n=t.createString(e.name)),cu.startField(t),cu.addType(t,r),cu.addTypeType(t,s),cu.addChildren(t,u),cu.addNullable(t,!!e.nullable),-1!==n&&cu.addName(t,n),-1!==i&&cu.addDictionary(t,i),-1!==c&&cu.addCustomMetadata(t,c),cu.endField(t)},Sa.decode=function(t,e){let n,r,i,o,s,a;return e&&(a=t.dictionary())?e.has(n=a.id().low)?(o=(o=a.indexType())?Lc(o):new ao,s=new To(e.get(n),o,n,a.isOrdered()),r=new Sa(t.name(),s,t.nullable(),Fc(t))):(o=(o=a.indexType())?Lc(o):new ao,e.set(n,i=Dc(t,Bc(t,e))),s=new To(i,o,n,a.isOrdered()),r=new Sa(t.name(),s,t.nullable(),Fc(t))):(i=Dc(t,Bc(t,e)),r=new Sa(t.name(),i,t.nullable(),Fc(t))),r||null},Sa.fromJSON=function(t,e){let n,r,i,o,s,a;return e&&(o=t.dictionary)?e.has(n=o.id)?(r=(r=o.indexType)?Oc(r):new ao,a=new To(e.get(n),r,n,o.isOrdered),i=new Sa(t.name,a,t.nullable,Sc(t.customMetadata))):(r=(r=o.indexType)?Oc(r):new ao,e.set(n,s=Ic(t,wc(t,e))),a=new To(s,r,n,o.isOrdered),i=new Sa(t.name,a,t.nullable,Sc(t.customMetadata))):(s=Ic(t,wc(t,e)),i=new Sa(t.name,s,t.nullable,Sc(t.customMetadata))),i||null},xa.encode=function(t,e){const n=e.fields.map((e=>Sa.encode(t,e)));lu.startFieldsVector(t,n.length);const r=lu.createFieldsVector(t,n),i=e.metadata&&e.metadata.size>0?lu.createCustomMetadataVector(t,[...e.metadata].map((([e,n])=>{const r=t.createString(`${e}`),i=t.createString(`${n}`);return su.startKeyValue(t),su.addKey(t,r),su.addValue(t,i),su.endKeyValue(t)}))):-1;return lu.startSchema(t),lu.addFields(t,r),lu.addEndianness(t,Nc?eu.Little:eu.Big),-1!==i&&lu.addCustomMetadata(t,i),lu.endSchema(t)},xa.decode=function(t,e=new Map){const n=function(t,e){const n=[];for(let r,i=-1,o=-1,s=t.fieldsLength();++iSa.fromJSON(t,e)))}(t,e),Sc(t.customMetadata),e)},Cc.encode=function(t,e){const n=e.nodes||[],r=e.buffers||[];Ju.startNodesVector(t,n.length);for(const e of n.slice().reverse())kc.encode(t,e);const i=t.endVector();Ju.startBuffersVector(t,r.length);for(const e of r.slice().reverse())jc.encode(t,e);const o=t.endVector();return Ju.startRecordBatch(t),Ju.addLength(t,new Tc(e.length,0)),Ju.addNodes(t,i),Ju.addBuffers(t,o),Ju.endRecordBatch(t)},Cc.decode=function(t,e=Mr.V4){if(null!==t.compression())throw new Error("Record batch compression not implemented");return new Cc(t.length(),function(t){const e=[];for(let n,r=-1,i=-1,o=t.nodesLength();++r{const t=new ArrayBuffer(2);return new DataView(t).setInt16(0,256,!0),256===new Int16Array(t)[0]})(),Rc=t=>`Expected ${Br[t]} Message in stream, but was null or length 0.`,zc=t=>`Header pointer of flatbuffer-encoded ${Br[t]} Message is null or length 0.`,Uc=(t,e)=>`Expected to read ${t} metadata bytes, but only read ${e}.`,Vc=(t,e)=>`Expected to read ${t} bytes for message body, but only read ${e}.`;class Wc{constructor(t){this.source=t instanceof Au?t:new Au(t)}[Symbol.iterator](){return this}next(){let t;return(t=this.readMetadataLength()).done||-1===t.value&&(t=this.readMetadataLength()).done||(t=this.readMetadata(t.value)).done?xu:t}throw(t){return this.source.throw(t)}return(t){return this.source.return(t)}readMessage(t){let e;if((e=this.next()).done)return null;if(null!=t&&e.value.headerType!==t)throw new Error(Rc(t));return e.value}readMessageBody(t){if(t<=0)return new Uint8Array(0);const e=Ii(this.source.read(t));if(e.byteLength[...e,...n.VALIDITY&&[n.VALIDITY]||[],...n.TYPE&&[n.TYPE]||[],...n.OFFSET&&[n.OFFSET]||[],...n.DATA&&[n.DATA]||[],...t(n.children)]),[])}(this._body)}readMessage(t){let e;if((e=this.next()).done)return null;if(null!=t&&e.value.headerType!==t)throw new Error(Rc(t));return e.value}readSchema(){const t=Br.Schema,e=this.readMessage(t),n=null==e?void 0:e.header();if(!e||!n)throw new Error(zc(t));return n}}const Yc=4,Zc=new Uint8Array(6);for(let t=0;t<6;t+=1)Zc[t]="ARROW1".codePointAt(t);function Hc(t,e=0){for(let n=-1,r=Zc.length;++nthis)):this}readRecordBatch(t){return this._impl.isFile()?this._impl.readRecordBatch(t):null}[Symbol.iterator](){return this._impl[Symbol.iterator]()}[Symbol.asyncIterator](){return this._impl[Symbol.asyncIterator]()}toDOMStream(){return mu.toDOMStream(this.isSync()?{[Symbol.iterator]:()=>this}:{[Symbol.asyncIterator]:()=>this})}toNodeStream(){return mu.toNodeStream(this.isSync()?{[Symbol.iterator]:()=>this}:{[Symbol.asyncIterator]:()=>this},{objectMode:!0})}static throughNode(t){throw new Error('"throughNode" not available in this environment')}static throughDOM(t,e){throw new Error('"throughDOM" not available in this environment')}static from(t){return t instanceof Jc?t:hi(t)?function(t){return new Qc(new ul(t))}(t):pi(t)?function(t){return Yr(this,void 0,void 0,(function*(){const{size:e}=yield t.stat(),n=new ju(t,e);return e>=Kc&&Hc(yield n.readAt(0,qc+7&-8))?new nl(new al(n)):new tl(new ol(n))}))}(t):ci(t)?(()=>Yr(this,void 0,void 0,(function*(){return yield Jc.from(yield t)})))():yi(t)||bi(t)||mi(t)||fi(t)?function(t){return Yr(this,void 0,void 0,(function*(){const e=yield t.peek(qc+7&-8);return e&&e.byteLength>=4?Hc(e)?new el(new sl(yield t.read())):new tl(new ol(t)):new tl(new ol(function(){return Hr(this,arguments,(function*(){}))}()))}))}(new Mu(t)):function(t){const e=t.peek(qc+7&-8);return e&&e.byteLength>=4?Hc(e)?new el(new sl(t.read())):new Qc(new il(t)):new Qc(new il(function*(){}()))}(new Au(t))}static readAll(t){return t instanceof Jc?t.isSync()?ll(t):fl(t):hi(t)||ArrayBuffer.isView(t)||li(t)||di(t)?ll(t):fl(t)}}class Qc extends Jc{constructor(t){super(t),this._impl=t}readAll(){return[...this]}[Symbol.iterator](){return this._impl[Symbol.iterator]()}[Symbol.asyncIterator](){return Hr(this,arguments,(function*(){yield Zr(yield*qr(Xr(this[Symbol.iterator]())))}))}}class tl extends Jc{constructor(t){super(t),this._impl=t}readAll(){var t,e;return Yr(this,void 0,void 0,(function*(){const n=new Array;try{for(var r,i=Xr(this);!(r=yield i.next()).done;){const t=r.value;n.push(t)}}catch(e){t={error:e}}finally{try{r&&!r.done&&(e=i.return)&&(yield e.call(i))}finally{if(t)throw t.error}}return n}))}[Symbol.iterator](){throw new Error("AsyncRecordBatchStreamReader is not Iterable")}[Symbol.asyncIterator](){return this._impl[Symbol.asyncIterator]()}}class el extends Qc{constructor(t){super(t),this._impl=t}}class nl extends tl{constructor(t){super(t),this._impl=t}}class rl{constructor(t=new Map){this.closed=!1,this.autoDestroy=!0,this._dictionaryIndex=0,this._recordBatchIndex=0,this.dictionaries=t}get numDictionaries(){return this._dictionaryIndex}get numRecordBatches(){return this._recordBatchIndex}isSync(){return!1}isAsync(){return!1}isFile(){return!1}isStream(){return!1}reset(t){return this._dictionaryIndex=0,this._recordBatchIndex=0,this.schema=t,this.dictionaries=new Map,this}_loadRecordBatch(t,e){const n=this._loadVectors(t,e,this.schema.fields),r=_a({type:new go(this.schema.fields),length:t.length,children:n});return new za(this.schema,r)}_loadDictionaryBatch(t,e){const{id:n,isDelta:r}=t,{dictionaries:i,schema:o}=this,s=i.get(n);if(r||!s){const i=o.dictionaries.get(n),a=this._loadVectors(t.data,e,[i]);return(s&&r?s.concat(new ba(a)):new ba(a)).memoize()}return s.memoize()}_loadVectors(t,e,n){return new Ru(e,t.nodes,t.buffers,this.dictionaries).visitMany(n)}}class il extends rl{constructor(t,e){super(e),this._reader=hi(t)?new Gc(this._handle=t):new Wc(this._handle=t)}isSync(){return!0}isStream(){return!0}[Symbol.iterator](){return this}cancel(){!this.closed&&(this.closed=!0)&&(this.reset()._reader.return(),this._reader=null,this.dictionaries=null)}open(t){return this.closed||(this.autoDestroy=cl(this,t),this.schema||(this.schema=this._reader.readSchema())||this.cancel()),this}throw(t){return!this.closed&&this.autoDestroy&&(this.closed=!0)?this.reset()._reader.throw(t):xu}return(t){return!this.closed&&this.autoDestroy&&(this.closed=!0)?this.reset()._reader.return(t):xu}next(){if(this.closed)return xu;let t;const{_reader:e}=this;for(;t=this._readNextMessageAndValidate();)if(t.isSchema())this.reset(t.header());else{if(t.isRecordBatch()){this._recordBatchIndex++;const n=t.header(),r=e.readMessageBody(t.bodyLength);return{done:!1,value:this._loadRecordBatch(n,r)}}if(t.isDictionaryBatch()){this._dictionaryIndex++;const n=t.header(),r=e.readMessageBody(t.bodyLength),i=this._loadDictionaryBatch(n,r);this.dictionaries.set(n.id,i)}}return this.schema&&0===this._recordBatchIndex?(this._recordBatchIndex++,{done:!1,value:new Wa(this.schema)}):this.return()}_readNextMessageAndValidate(t){return this._reader.readMessage(t)}}class ol extends rl{constructor(t,e){super(e),this._reader=new $c(this._handle=t)}isAsync(){return!0}isStream(){return!0}[Symbol.asyncIterator](){return this}cancel(){return Yr(this,void 0,void 0,(function*(){!this.closed&&(this.closed=!0)&&(yield this.reset()._reader.return(),this._reader=null,this.dictionaries=null)}))}open(t){return Yr(this,void 0,void 0,(function*(){return this.closed||(this.autoDestroy=cl(this,t),this.schema||(this.schema=yield this._reader.readSchema())||(yield this.cancel())),this}))}throw(t){return Yr(this,void 0,void 0,(function*(){return!this.closed&&this.autoDestroy&&(this.closed=!0)?yield this.reset()._reader.throw(t):xu}))}return(t){return Yr(this,void 0,void 0,(function*(){return!this.closed&&this.autoDestroy&&(this.closed=!0)?yield this.reset()._reader.return(t):xu}))}next(){return Yr(this,void 0,void 0,(function*(){if(this.closed)return xu;let t;const{_reader:e}=this;for(;t=yield this._readNextMessageAndValidate();)if(t.isSchema())yield this.reset(t.header());else{if(t.isRecordBatch()){this._recordBatchIndex++;const n=t.header(),r=yield e.readMessageBody(t.bodyLength);return{done:!1,value:this._loadRecordBatch(n,r)}}if(t.isDictionaryBatch()){this._dictionaryIndex++;const n=t.header(),r=yield e.readMessageBody(t.bodyLength),i=this._loadDictionaryBatch(n,r);this.dictionaries.set(n.id,i)}}return this.schema&&0===this._recordBatchIndex?(this._recordBatchIndex++,{done:!1,value:new Wa(this.schema)}):yield this.return()}))}_readNextMessageAndValidate(t){return Yr(this,void 0,void 0,(function*(){return yield this._reader.readMessage(t)}))}}class sl extends il{constructor(t,e){super(t instanceof Pu?t:new Pu(t),e)}get footer(){return this._footer}get numDictionaries(){return this._footer?this._footer.numDictionaries:0}get numRecordBatches(){return this._footer?this._footer.numRecordBatches:0}isSync(){return!0}isFile(){return!0}open(t){if(!this.closed&&!this._footer){this.schema=(this._footer=this._readFooter()).schema;for(const t of this._footer.dictionaryBatches())t&&this._readDictionaryBatch(this._dictionaryIndex++)}return super.open(t)}readRecordBatch(t){var e;if(this.closed)return null;this._footer||this.open();const n=null===(e=this._footer)||void 0===e?void 0:e.getRecordBatch(t);if(n&&this._handle.seek(n.offset)){const t=this._reader.readMessage(Br.RecordBatch);if(null==t?void 0:t.isRecordBatch()){const e=t.header(),n=this._reader.readMessageBody(t.bodyLength);return this._loadRecordBatch(e,n)}}return null}_readDictionaryBatch(t){var e;const n=null===(e=this._footer)||void 0===e?void 0:e.getDictionaryBatch(t);if(n&&this._handle.seek(n.offset)){const t=this._reader.readMessage(Br.DictionaryBatch);if(null==t?void 0:t.isDictionaryBatch()){const e=t.header(),n=this._reader.readMessageBody(t.bodyLength),r=this._loadDictionaryBatch(e,n);this.dictionaries.set(e.id,r)}}}_readFooter(){const{_handle:t}=this,e=t.size-Xc,n=t.readInt32(e),r=t.readAt(e-n,n);return yu.decode(r)}_readNextMessageAndValidate(t){var e;if(this._footer||this.open(),this._footer&&this._recordBatchIndexsuper.open}});return Yr(this,void 0,void 0,(function*(){if(!this.closed&&!this._footer){this.schema=(this._footer=yield this._readFooter()).schema;for(const t of this._footer.dictionaryBatches())t&&(yield this._readDictionaryBatch(this._dictionaryIndex++))}return yield e.open.call(this,t)}))}readRecordBatch(t){var e;return Yr(this,void 0,void 0,(function*(){if(this.closed)return null;this._footer||(yield this.open());const n=null===(e=this._footer)||void 0===e?void 0:e.getRecordBatch(t);if(n&&(yield this._handle.seek(n.offset))){const t=yield this._reader.readMessage(Br.RecordBatch);if(null==t?void 0:t.isRecordBatch()){const e=t.header(),n=yield this._reader.readMessageBody(t.bodyLength);return this._loadRecordBatch(e,n)}}return null}))}_readDictionaryBatch(t){var e;return Yr(this,void 0,void 0,(function*(){const n=null===(e=this._footer)||void 0===e?void 0:e.getDictionaryBatch(t);if(n&&(yield this._handle.seek(n.offset))){const t=yield this._reader.readMessage(Br.DictionaryBatch);if(null==t?void 0:t.isDictionaryBatch()){const e=t.header(),n=yield this._reader.readMessageBody(t.bodyLength),r=this._loadDictionaryBatch(e,n);this.dictionaries.set(e.id,r)}}}))}_readFooter(){return Yr(this,void 0,void 0,(function*(){const{_handle:t}=this;t._pending&&(yield t._pending);const e=t.size-Xc,n=yield t.readInt32(e),r=yield t.readAt(e-n,n);return yu.decode(r)}))}_readNextMessageAndValidate(t){return Yr(this,void 0,void 0,(function*(){if(this._footer||(yield this.open()),this._footer&&this._recordBatchIndexhl(t))):e.isAsync()?e.readAll().then((t=>new Ya(t))):new Ya(e.readAll())}function dl(t){return dl="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},dl(t)}function pl(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return yl(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?yl(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,i=function(){};return{s:i,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function yl(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=0;--i){var o=this.tryEntries[i],s=o.completion;if("root"===o.tryLoc)return r("end");if(o.tryLoc<=this.prev){var a=n.call(o,"catchLoc"),u=n.call(o,"finallyLoc");if(a&&u){if(this.prev=0;--r){var i=this.tryEntries[r];if(i.tryLoc<=this.prev&&n.call(i,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),O(n),f}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var i=r.arg;O(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:T(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=void 0),f}},t}function bl(t,e,n,r,i,o,s){try{var a=t[o](s),u=a.value}catch(t){return void n(t)}a.done?e(u):Promise.resolve(u).then(r,i)}function ml(t){return function(){var e=this,n=arguments;return new Promise((function(r,i){var o=t.apply(e,n);function s(t){bl(o,r,i,s,a,"next",t)}function a(t){bl(o,r,i,s,a,"throw",t)}s(void 0)}))}}function gl(t,e){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:{};return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,s),(n=o.call(this,t,0,r)).app=e,n.info=void 0,n.infoLoadingStatus="notLoaded",n.cache={},n.readParquetFun=r.readParquetFun,n}return e=s,n=[{key:"loadInfo",value:function(t){var e=this;return this.info||"notLoaded"!==this.infoLoadingStatus?!t||"loaded"!==this.infoLoadingStatus&&"failed"!==this.infoLoadingStatus||t():ml(vl().mark((function n(){var r;return vl().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.prev=0,n.next=3,$r(e.url+"info.json");case 3:r=n.sent,e.info=r,e.resolution=r.resolutionGeo,e.infoLoadingStatus="loaded",t&&t(),n.next=13;break;case 10:n.prev=10,n.t0=n.catch(0),e.infoLoadingStatus="failed";case 13:case"end":return n.stop()}}),n,null,[[0,10]])})))(),this}},{key:"getTilingEnvelope",value:function(t){if(this.info){var e=this.info.originPoint,n=this.info.resolutionGeo,r=this.info.tileSizeCell;return{xMin:Math.floor((t.xMin-e.x)/(n*r)),xMax:Math.floor((t.xMax-e.x)/(n*r)),yMin:Math.floor((t.yMin-e.y)/(n*r)),yMax:Math.floor((t.yMax-e.y)/(n*r))}}this.loadInfo((function(){}))}},{key:"getData",value:function(t,e){var n=this;if(!this.info)return this;var r=this.getTilingEnvelope(t);if(!r)return this;for(var i=this.info.tilingBounds,o=this.info.format,s=function(t){for(var s=function(r){if(n.cache[t]||(n.cache[t]={}),n.cache[t][r])return"continue";n.cache[t][r]="loading",ml(vl().mark((function i(){var s,a,u,c,l,f,h,d,p,y,v,b,m,g,w,_,x,S,O,I,T;return vl().wrap((function(i){for(;;)switch(i.prev=i.next){case 0:if(i.prev=0,o&&"CSV"!==o){i.next=33;break}return i.next=4,lr(n.url+t+"/"+r+".csv");case 4:if(a=i.sent,!n.preprocess){i.next=29;break}s=[],u=pl(a),i.prev=9,u.s();case 11:if((c=u.n()).done){i.next=19;break}if(l=c.value,0!=n.preprocess(l)){i.next=16;break}return i.abrupt("continue",17);case 16:s.push(l);case 17:i.next=11;break;case 19:i.next=24;break;case 21:i.prev=21,i.t0=i.catch(9),u.e(i.t0);case 24:return i.prev=24,u.f(),i.finish(24);case 27:i.next=30;break;case 29:s=a;case 30:i.next=74;break;case 33:if("PARQUET"!==o){i.next=73;break}if(n.readParquetFun){i.next=36;break}throw new Error("readParquet function needed for parquet dataset");case 36:return i.next=38,fetch(n.url+t+"/"+r+".parquet");case 38:return f=i.sent,i.t1=Uint8Array,i.next=42,f.arrayBuffer();case 42:i.t2=i.sent,h=new i.t1(i.t2),d=n.readParquetFun(h),p=hl(d),s=[],y=pl(p),i.prev=48,y.s();case 50:if((v=y.n()).done){i.next=63;break}if(b=v.value,m=b.toJSON(),!n.preprocess){i.next=60;break}if(0!=n.preprocess(m)){i.next=57;break}return i.abrupt("continue",61);case 57:s.push(m),i.next=61;break;case 60:s.push(m);case 61:i.next=50;break;case 63:i.next=68;break;case 65:i.prev=65,i.t3=i.catch(48),y.e(i.t3);case 68:return i.prev=68,y.f(),i.finish(68);case 71:i.next=74;break;case 73:throw new Error("Tiled format not supported: "+o);case 74:i.next=80;break;case 76:return i.prev=76,i.t4=i.catch(0),n.cache[t][r]="failed",i.abrupt("return");case 80:if(n.info){i.next=83;break}return console.error("Tile info inknown"),i.abrupt("return");case 83:if(g=new Ur(s,t,r,n.info),n.cache[t][r]=g,e){i.next=88;break}return i.abrupt("return");case 88:w=!1,_=n.app.getZoomFactor(),x=pl(n.app.layers),i.prev=91,x.s();case 93:if((S=x.n()).done){i.next=103;break}if((O=S.value).visible){i.next=97;break}return i.abrupt("continue",101);case 97:if(O.getDatasetComponent(_)==n){i.next=99;break}return i.abrupt("continue",101);case 99:return w=!0,i.abrupt("break",103);case 101:i.next=93;break;case 103:i.next=108;break;case 105:i.prev=105,i.t5=i.catch(91),x.e(i.t5);case 108:return i.prev=108,x.f(),i.finish(108);case 111:if(w){i.next=114;break}return i.abrupt("return");case 114:if(I=n.app.updateExtentGeo(),T=g.extGeo,!(I.xMax<=T.xMin)){i.next=118;break}return i.abrupt("return");case 118:if(!(I.xMin>=T.xMax)){i.next=120;break}return i.abrupt("return");case 120:if(!(I.yMax<=T.yMin)){i.next=122;break}return i.abrupt("return");case 122:if(!(I.yMin>=T.yMax)){i.next=124;break}return i.abrupt("return");case 124:e();case 127:case"end":return i.stop()}}),i,null,[[0,76],[9,21,24,27],[48,65,68,71],[91,105,108,111]])})))()},a=Math.max(r.yMin,i.yMin);a<=Math.min(r.yMax,i.yMax);a++)s(a)},a=Math.max(r.xMin,i.xMin);a<=Math.min(r.xMax,i.xMax);a++)s(a);return this}},{key:"updateViewCache",value:function(t){if(this.cellsViewCache=[],this.info){var e=this.getTilingEnvelope(t);if(e)for(var n=this.info.tilingBounds,r=Math.max(e.xMin,n.xMin);r<=Math.min(e.xMax,n.xMax);r++)if(this.cache[r])for(var i=Math.max(e.yMin,n.yMin);i<=Math.min(e.yMax,n.yMax);i++){var o=this.cache[r][i];if(o&&"string"!=typeof o){var s,a=pl(o.cells);try{for(a.s();!(s=a.n()).done;){var u=s.value;+u.x+this.resolutiont.xMax||+u.y+this.resolutiont.yMax||this.cellsViewCache.push(u)}}catch(t){a.e(t)}finally{a.f()}}}}}}],n&&gl(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),s}(pr);function Sl(t){return Sl="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Sl(t)}function Ol(t,e){for(var n=0;n=this.maxZoom)throw new Error("Unexpected zoom limits for layer. Zoom min should be smaller than zoom max.");if(this.cache={},this.url=e.url,this.urlFun=e.urlFun||function(t,e,r){return n.url+r+"/"+t+"/"+e+".png"},this.resolutions=e.resolutions,!this.resolutions||0==this.resolutions.length)throw new Error("No resolutions provided for background layer");this.nbPix=e.nbPix||256,this.origin=e.origin||[0,0],this.z0=e.z0||0,this.filterColor=e.filterColor}var e,n;return e=t,n=[{key:"get",value:function(t,e,n){var r=this.cache[t];if(r&&(r=r[e]))return r[n]}},{key:"put",value:function(t,e,n,r){this.cache[e]||(this.cache[e]={}),this.cache[e][n]||(this.cache[e][n]={}),this.cache[e][n][r]=t}},{key:"draw",value:function(t){var e=this;if(this.resolutions&&0!=this.resolutions.length){var n=t.getZf(),r=this.origin[0],i=this.origin[1],o=0;for(o=0;o=this.maxZoom)throw new Error("Unexpected zoom limits for layer. Zoom min should be smaller than zoom max.");this.url=e.url,this.filterColor=e.filterColor,this.img=void 0,this.xMin=void 0,this.xMax=void 0,this.yMin=void 0,this.yMax=void 0}var e,n;return e=t,(n=[{key:"hasMoved",value:function(t){return t.xMin!=this.xMin||t.xMax!=this.xMax||t.yMin!=this.yMin||t.yMax!=this.yMax}},{key:"draw",value:function(t){if(t.updateExtentGeo(0),!this.hasMoved(t.extGeo)&&this.img)t.ctx.drawImage(this.img,0,0,t.w,t.h);else{this.xMin=t.extGeo.xMin,this.xMax=t.extGeo.xMax,this.yMin=t.extGeo.yMin,this.yMax=t.extGeo.yMax;var e=[];e.push(this.url),e.push("&width="),e.push(t.w),e.push("&height="),e.push(t.h),e.push("&bbox="),e.push(t.extGeo.xMin),e.push(","),e.push(t.extGeo.yMin),e.push(","),e.push(t.extGeo.xMax),e.push(","),e.push(t.extGeo.yMax);var n=e.join("");this.img||(this.img=new Image,this.img.onload=function(){t.redraw()},this.img.onerror=function(){console.warn("Could not retrieve WMS background image from",n)}),this.img.src=n}var r=t.getZf();if(this.filterColor){var i=this.filterColor(r);i&&"none"!=i&&(t.ctx.fillStyle=i,t.ctx.fillRect(0,0,t.w,t.h))}}}])&&Al(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();function El(t){return El="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},El(t)}function Cl(){Cl=function(){return t};var t={},e=Object.prototype,n=e.hasOwnProperty,r=Object.defineProperty||function(t,e,n){t[e]=n.value},i="function"==typeof Symbol?Symbol:{},o=i.iterator||"@@iterator",s=i.asyncIterator||"@@asyncIterator",a=i.toStringTag||"@@toStringTag";function u(t,e,n){return Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{u({},"")}catch(t){u=function(t,e,n){return t[e]=n}}function c(t,e,n,i){var o=e&&e.prototype instanceof h?e:h,s=Object.create(o.prototype),a=new I(i||[]);return r(s,"_invoke",{value:_(t,n,a)}),s}function l(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(t){return{type:"throw",arg:t}}}t.wrap=c;var f={};function h(){}function d(){}function p(){}var y={};u(y,o,(function(){return this}));var v=Object.getPrototypeOf,b=v&&v(v(T([])));b&&b!==e&&n.call(b,o)&&(y=b);var m=p.prototype=h.prototype=Object.create(y);function g(t){["next","throw","return"].forEach((function(e){u(t,e,(function(t){return this._invoke(e,t)}))}))}function w(t,e){function i(r,o,s,a){var u=l(t[r],t,o);if("throw"!==u.type){var c=u.arg,f=c.value;return f&&"object"==El(f)&&n.call(f,"__await")?e.resolve(f.__await).then((function(t){i("next",t,s,a)}),(function(t){i("throw",t,s,a)})):e.resolve(f).then((function(t){c.value=t,s(c)}),(function(t){return i("throw",t,s,a)}))}a(u.arg)}var o;r(this,"_invoke",{value:function(t,n){function r(){return new e((function(e,r){i(t,n,e,r)}))}return o=o?o.then(r,r):r()}})}function _(t,e,n){var r="suspendedStart";return function(i,o){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===i)throw o;return{value:void 0,done:!0}}for(n.method=i,n.arg=o;;){var s=n.delegate;if(s){var a=x(s,n);if(a){if(a===f)continue;return a}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var u=l(t,e,n);if("normal"===u.type){if(r=n.done?"completed":"suspendedYield",u.arg===f)continue;return{value:u.arg,done:n.done}}"throw"===u.type&&(r="completed",n.method="throw",n.arg=u.arg)}}}function x(t,e){var n=e.method,r=t.iterator[n];if(void 0===r)return e.delegate=null,"throw"===n&&t.iterator.return&&(e.method="return",e.arg=void 0,x(t,e),"throw"===e.method)||"return"!==n&&(e.method="throw",e.arg=new TypeError("The iterator does not provide a '"+n+"' method")),f;var i=l(r,t.iterator,e.arg);if("throw"===i.type)return e.method="throw",e.arg=i.arg,e.delegate=null,f;var o=i.arg;return o?o.done?(e[t.resultName]=o.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=void 0),e.delegate=null,f):o:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,f)}function S(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function O(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function I(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(S,this),this.reset(!0)}function T(t){if(t){var e=t[o];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var r=-1,i=function e(){for(;++r=0;--i){var o=this.tryEntries[i],s=o.completion;if("root"===o.tryLoc)return r("end");if(o.tryLoc<=this.prev){var a=n.call(o,"catchLoc"),u=n.call(o,"finallyLoc");if(a&&u){if(this.prev=0;--r){var i=this.tryEntries[r];if(i.tryLoc<=this.prev&&n.call(i,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),O(n),f}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var i=r.arg;O(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:T(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=void 0),f}},t}function Pl(t,e,n,r,i,o,s){try{var a=t[o](s),u=a.value}catch(t){return void n(t)}a.done?e(u):Promise.resolve(u).then(r,i)}function jl(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return kl(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?kl(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,i=function(){};return{s:i,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function kl(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n0&&(t.ctx.strokeStyle=u,t.ctx.lineWidth=c,t.ctx.strokeText(i.name,s,a))}if(this.color){var l=this.color(i,e);l&&(t.ctx.fillStyle=l,t.ctx.fillText(i.name,s,a))}}}}catch(t){r.e(t)}finally{r.f()}}else this.load(t.redraw)}},{key:"load",value:(r=Cl().mark((function t(e){var n,r,i,o;return Cl().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this.url){t.next=5;break}return console.log("Failed loading labels: No URL specified. "+this.url),this.loadingStatus="failed",this.labels=[],t.abrupt("return");case 5:if("notLoaded"==this.loadingStatus){t.next=7;break}return t.abrupt("return");case 7:return this.loadingStatus="loading",t.prev=8,t.next=11,lr(this.url);case 11:if(n=t.sent,!this.preprocess){t.next=35;break}this.labels=[],r=jl(n),t.prev=15,r.s();case 17:if((i=r.n()).done){t.next=25;break}if(o=i.value,0!=this.preprocess(o)){t.next=22;break}return t.abrupt("continue",23);case 22:this.labels.push(o);case 23:t.next=17;break;case 25:t.next=30;break;case 27:t.prev=27,t.t0=t.catch(15),r.e(t.t0);case 30:return t.prev=30,r.f(),t.finish(30);case 33:t.next=36;break;case 35:this.labels=n;case 36:this.loadingStatus="loaded",e&&e(),t.next=45;break;case 40:t.prev=40,t.t1=t.catch(8),console.log("Failed loading labels from "+this.url),this.labels=[],this.loadingStatus="failed";case 45:case"end":return t.stop()}}),t,this,[[8,40],[15,27,30,33]])})),i=function(){var t=this,e=arguments;return new Promise((function(n,i){var o=r.apply(t,e);function s(t){Pl(o,n,i,s,a,"next",t)}function a(t){Pl(o,n,i,s,a,"throw",t)}s(void 0)}))},function(t){return i.apply(this,arguments)})}],n&&Bl(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();function Ll(t){return Ll="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ll(t)}function Dl(){Dl=function(){return t};var t={},e=Object.prototype,n=e.hasOwnProperty,r=Object.defineProperty||function(t,e,n){t[e]=n.value},i="function"==typeof Symbol?Symbol:{},o=i.iterator||"@@iterator",s=i.asyncIterator||"@@asyncIterator",a=i.toStringTag||"@@toStringTag";function u(t,e,n){return Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{u({},"")}catch(t){u=function(t,e,n){return t[e]=n}}function c(t,e,n,i){var o=e&&e.prototype instanceof h?e:h,s=Object.create(o.prototype),a=new I(i||[]);return r(s,"_invoke",{value:_(t,n,a)}),s}function l(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(t){return{type:"throw",arg:t}}}t.wrap=c;var f={};function h(){}function d(){}function p(){}var y={};u(y,o,(function(){return this}));var v=Object.getPrototypeOf,b=v&&v(v(T([])));b&&b!==e&&n.call(b,o)&&(y=b);var m=p.prototype=h.prototype=Object.create(y);function g(t){["next","throw","return"].forEach((function(e){u(t,e,(function(t){return this._invoke(e,t)}))}))}function w(t,e){function i(r,o,s,a){var u=l(t[r],t,o);if("throw"!==u.type){var c=u.arg,f=c.value;return f&&"object"==Ll(f)&&n.call(f,"__await")?e.resolve(f.__await).then((function(t){i("next",t,s,a)}),(function(t){i("throw",t,s,a)})):e.resolve(f).then((function(t){c.value=t,s(c)}),(function(t){return i("throw",t,s,a)}))}a(u.arg)}var o;r(this,"_invoke",{value:function(t,n){function r(){return new e((function(e,r){i(t,n,e,r)}))}return o=o?o.then(r,r):r()}})}function _(t,e,n){var r="suspendedStart";return function(i,o){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===i)throw o;return{value:void 0,done:!0}}for(n.method=i,n.arg=o;;){var s=n.delegate;if(s){var a=x(s,n);if(a){if(a===f)continue;return a}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var u=l(t,e,n);if("normal"===u.type){if(r=n.done?"completed":"suspendedYield",u.arg===f)continue;return{value:u.arg,done:n.done}}"throw"===u.type&&(r="completed",n.method="throw",n.arg=u.arg)}}}function x(t,e){var n=e.method,r=t.iterator[n];if(void 0===r)return e.delegate=null,"throw"===n&&t.iterator.return&&(e.method="return",e.arg=void 0,x(t,e),"throw"===e.method)||"return"!==n&&(e.method="throw",e.arg=new TypeError("The iterator does not provide a '"+n+"' method")),f;var i=l(r,t.iterator,e.arg);if("throw"===i.type)return e.method="throw",e.arg=i.arg,e.delegate=null,f;var o=i.arg;return o?o.done?(e[t.resultName]=o.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=void 0),e.delegate=null,f):o:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,f)}function S(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function O(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function I(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(S,this),this.reset(!0)}function T(t){if(t){var e=t[o];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var r=-1,i=function e(){for(;++r=0;--i){var o=this.tryEntries[i],s=o.completion;if("root"===o.tryLoc)return r("end");if(o.tryLoc<=this.prev){var a=n.call(o,"catchLoc"),u=n.call(o,"finallyLoc");if(a&&u){if(this.prev=0;--r){var i=this.tryEntries[r];if(i.tryLoc<=this.prev&&n.call(i,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),O(n),f}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var i=r.arg;O(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:T(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=void 0),f}},t}function Nl(t,e,n,r,i,o,s){try{var a=t[o](s),u=a.value}catch(t){return void n(t)}a.done?e(u):Promise.resolve(u).then(r,i)}function Rl(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return zl(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?zl(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,i=function(){};return{s:i,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function zl(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function Gl(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n0&&void 0!==arguments[0])||arguments[0];r.legend&&t&&r.legend.selectAll("*").remove(),r.cg.initCanvasTransform(),r.cg.clear(r.cg.backgroundColor);var n=r.getZoomFactor();r.updateExtentGeo();var o,s=$l(r.bgLayers);try{for(s.s();!(o=s.n()).done;){var a=o.value;a.visible&&(n>a.maxZoom||nl.maxZoom||np.maxZoom||nb.maxZoom||nS.maxZoom||n0&&void 0!==arguments[0]?arguments[0]:20;return this.cg.updateExtentGeo(t)}},{key:"getCellFocusInfo",value:function(t){for(var e=this.getZoomFactor(),n=this.layers.length-1;n>=0;n--){var r=this.layers[n];if(r.visible&&r.cellInfoHTML&&"none"!==r.cellInfoHTML){var i=r.getDatasetComponent(e);if(i){var o=i.getCellFromPosition(t,i.getViewCache());if(!o)return;var s=r.cellInfoHTML(o,i.getResolution());if(!s)return;return{cell:o,html:s,resolution:i.getResolution()}}}}}},{key:"getGeoCenter",value:function(){return this.cg.getCenter()}},{key:"setGeoCenter",value:function(t){return this.cg.setCenter(t),this}},{key:"getZoomFactor",value:function(){return this.cg.getZf()}},{key:"setZoomFactor",value:function(t){return this.cg.setZf(t),this}},{key:"getZoomFactorExtent",value:function(){return this.cg.getZfExtent()}},{key:"setZoomFactorExtent",value:function(t){return this.cg.setZfExtent(t),this}},{key:"getBackgroundColor",value:function(){return this.cg.backgroundColor}},{key:"setBackgroundColor",value:function(t){return this.cg.backgroundColor=t,this}},{key:"getBoundaryLayer",value:function(){return this.boundaryLayer}},{key:"setBoundaryLayer",value:function(t){return this.boundaryLayer=new Vl(t),this}},{key:"getLabelLayer",value:function(){return this.labelLayer}},{key:"setLabelLayer",value:function(t){return this.labelLayer=new Fl(t),this}},{key:"redraw",value:function(){return this.cg.redraw(),this}},{key:"addLayerFromDataset",value:function(t,e,n){var r=new Vn(t,e,n);return this.layers.push(r),this}},{key:"makeCSVGridDataset",value:function(t,e,n){var r=this;return new Zn([new Sr(t,e,n).getData(void 0,(function(){r.cg.redraw()}))],[],n)}},{key:"makeTiledGridDataset",value:function(t,e){var n=this;return new Zn([new xl(t,this,e).loadInfo((function(){n.cg.redraw()}))],[],e)}},{key:"makeMultiScaleCSVGridDataset",value:function(t,e,n){var r=this;return Zn.make(t,(function(t){return new Sr(e(t),t,n).getData(void 0,(function(){r.cg.redraw()}))}),n)}},{key:"makeMultiScaleTiledGridDataset",value:function(t,e,n){var r=this;return Zn.make(t,(function(t){return new xl(e(t),r,n).loadInfo((function(){r.cg.redraw()}))}),n)}},{key:"addCSVGridLayer",value:function(t,e,n,r){var i=this.makeCSVGridDataset(t,e,r);return this.addLayerFromDataset(i,n,r)}},{key:"addTiledGridLayer",value:function(t,e,n){var r=this.makeTiledGridDataset(t,n);return this.addLayerFromDataset(r,e,n)}},{key:"addMultiScaleCSVGridLayer",value:function(t,e,n,r){var i=this.makeMultiScaleCSVGridDataset(t,e,r);return this.addLayerFromDataset(i,n,r)}},{key:"addMultiScaleTiledGridLayer",value:function(t,e,n,r){var i=this.makeMultiScaleTiledGridDataset(t,e,r);return this.addLayerFromDataset(i,n,r)}},{key:"addBackgroundLayer",value:function(t){return this.bgLayers.push(new Il(t)),this.redraw(),this}},{key:"addBackgroundLayerWMS",value:function(t){return this.bgLayers.push(new Ml(t)),this.redraw(),this}},{key:"addZoomSlider",value:function(t,e){return this.cg.addZoomSlider(t,e),this}},{key:"setViewFromURL",value:function(){return this.cg.setViewFromURL(),this}},{key:"defineResizeObserver",value:function(t,e){var n=this;new ResizeObserver((function(r){t.clientWidth>0&&t.clientHeight>0&&window.requestAnimationFrame((function(){Array.isArray(r)&&r.length&&(n.h===t.clientHeight&&n.w===t.clientWidth||(n.h=t.clientHeight,n.w=t.clientWidth,n.cg.h=t.clientHeight,n.cg.w=t.clientWidth,e.setAttribute("width",""+n.w),e.setAttribute("height",""+n.h),n.redraw()))}))})).observe(t)}}],n&&Yl(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();function Hl(t){return Hl="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Hl(t)}function ql(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return Xl(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Xl(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,i=function(){};return{s:i,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function Xl(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=this.maxZoom)throw new Error("Unexpected zoom limits for layer. Zoom min should be smaller than zoom max.");this.legends=[]}var e,n,r;return e=t,r=[{key:"getStatistics",value:function(t,e,n){if(t&&0!=t.length){var r,i=1/0,o=-1/0,s=ql(t);try{for(s.s();!(r=s.n()).done;){var a=+e(r.value);n&&!a||(ao&&(o=a))}}catch(t){s.e(t)}finally{s.f()}return{min:i,max:o}}}}],(n=[{key:"draw",value:function(t,e,n){throw new Error("Method draw not implemented.")}},{key:"getOffset",value:function(){return this.offset}},{key:"setOffset",value:function(t){return this.offset=t,this}},{key:"updateLegends",value:function(t){var e,n=ql(this.legends);try{for(n.s();!(e=n.n()).done;)e.value.update(t)}catch(t){n.e(t)}finally{n.f()}return this}}])&&Kl(e.prototype,n),r&&Kl(e,r),Object.defineProperty(e,"prototype",{writable:!1}),t}();function Ql(t){return Ql="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ql(t)}function tf(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(t);try{for(c.s();!(a=c.n()).done;){var l=a.value,f=this.color?this.color(l[this.colorCol],e,o,s):void 0;if(f&&"none"!==f){n.ctx.fillStyle=f;var h=this.shape?this.shape(l):"square";if("none"!==h){var d=(this.size||function(){return e})(l[this.sizeCol],e,i,s),p=this.offset(l,e,s);if("square"===h){var y=e*(1-d/e)*.5;n.ctx.fillRect(l.x+y+p.dx,l.y+y+p.dy,d,d)}else if("circle"===h)n.ctx.beginPath(),n.ctx.arc(l.x+u+p.dx,l.y+u+p.dy,.5*d,0,2*Math.PI,!1),n.ctx.fill();else if("donut"===h){var v=l.x+u+p.dx,b=l.y+u+p.dy;n.ctx.beginPath(),n.ctx.moveTo(v,b),n.ctx.arc(v,b,u,0,2*Math.PI),n.ctx.arc(v,b,(1-d/e)*u,0,2*Math.PI,!0),n.ctx.closePath(),n.ctx.fill()}else{if("diamond"!==h)throw new Error("Unexpected shape:"+h);var m=.5*d;n.ctx.beginPath(),n.ctx.moveTo(l.x+u-m,l.y+u),n.ctx.lineTo(l.x+u,l.y+u+m),n.ctx.lineTo(l.x+u+m,l.y+u),n.ctx.lineTo(l.x+u,l.y+u-m),n.ctx.fill()}}}}}catch(t){c.e(t)}finally{c.f()}this.updateLegends({style:this,r:e,zf:s,sSize:i,sColor:o})}}])&&ef(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),s}(Jl);function sf(t){return sf="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},sf(t)}function af(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(t);try{for(l.s();!(u=l.n()).done;){var f=u.value,h=this.strokeColor?this.strokeColor(f[this.strokeColorCol],e,i):void 0;if(h&&"none"!==h){n.ctx.strokeStyle=h;var d=(this.size||function(){return e})(f[this.sizeCol],e,o,a),p=this.strokeWidth?this.strokeWidth(f[this.strokeWidthCol],e,s,a):1*a;if(p&&!(p<=0)){n.ctx.lineWidth=p;var y=this.shape?this.shape(f):"square";if("none"!==y){var v=this.offset(f,e,a);if("square"===y){var b=e*(1-d/e)*.5;n.ctx.beginPath(),n.ctx.rect(f.x+b+v.dx,f.y+b+v.dy,d,d),n.ctx.stroke()}else if("circle"===y)n.ctx.beginPath(),n.ctx.arc(f.x+c+v.dx,f.y+c+v.dy,.5*d,0,2*Math.PI,!1),n.ctx.stroke();else if("diamond"===y){var m=.5*d;n.ctx.beginPath(),n.ctx.moveTo(f.x+c-m,f.y+c),n.ctx.lineTo(f.x+c,f.y+c+m),n.ctx.lineTo(f.x+c+m,f.y+c),n.ctx.lineTo(f.x+c,f.y+c-m),n.ctx.lineTo(f.x+c-m,f.y+c),n.ctx.stroke()}else{if("donut"!==y)throw new Error("Unexpected shape:"+y);console.error("Not implemented")}}}}}}catch(t){l.e(t)}finally{l.f()}}}])&&uf(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),s}(Jl);function hf(t){return hf="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},hf(t)}function df(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(t);try{for(u.s();!(i=u.n()).done;){var c=i.value,l=a[c.y];l||(l={},a[c.y]=l),l[c.x]=this.height(c[this.heightCol],e,s,o)}}catch(t){u.e(t)}finally{u.f()}var f=n.extGeo;if(f){var h=Math.floor(f.xMin/e)*e,d=Math.floor(f.xMax/e)*e,p=Math.floor(f.yMin/e)*e,y=Math.floor(f.yMax/e)*e,v={min:p,max:y};n.setCanvasTransform();for(var b=y;b>=p;b-=e){var m=a[b];if(m){n.ctx.beginPath(),n.ctx.moveTo(h-e/2,b);for(var g=void 0,w=h;w<=d;w+=e){var _=m[w];_||(_=0),_||g?n.ctx.lineTo(w+e/2,b+_):n.ctx.moveTo(w+e/2,b),g=_}g&&n.ctx.lineTo(d+e/2,b);var x=this.fillColor(b,v,e,o);x&&"none"!=x&&(n.ctx.fillStyle=x,n.ctx.fill());var S=this.lineColor(b,v,e,o),O=this.lineWidth(b,v,e,o);S&&"none"!=S&&O>0&&(n.ctx.strokeStyle=S,n.ctx.lineWidth=O,n.ctx.stroke())}}}}}])&&pf(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),s}(Jl);function mf(t){return mf="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},mf(t)}function gf(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var r,i,o,s,a=[],u=!0,c=!1;try{if(o=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=o.call(n)).done)&&(a.push(r.value),a.length!==e);u=!0);}catch(t){c=!0,i=t}finally{try{if(!u&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(c)throw i}}return a}}(t,e)||wf(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function wf(t,e){if(t){if("string"==typeof t)return _f(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_f(t,e):void 0}}function _f(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(t);try{for(u.s();!(a=u.n()).done;){var c=a.value,l=(this.size||function(){return e})(c[this.sizeCol],e,i,o),f=this.offset(c,e,o),h=this.type?this.type(c):"flag",d=c.x+f.dx+("agepyramid"===h?0:.5*e),p=c.y+f.dy+("agepyramid"===h?0:.5*e),y=this.offsetAngle?this.offsetAngle(c,e,o)*Math.PI/180:0;if("agepyramid"===h||"radar"===h||"halftone"===h){for(var v=-1/0,b=0,m=Object.keys(this.color);bv&&(v=g)}var w=0;"agepyramid"===h&&this.agePyramidHeight&&(w=(e-this.agePyramidHeight(c,e,o))/2),"radar"!==h&&"halftone"!==h||(w=Math.PI/2+y);var _="agepyramid"===h?(this.agePyramidHeight?this.agePyramidHeight(c,e,o):e)/s:"radar"===h||"halftone"===h?2*Math.PI/s:void 0;if(void 0===_)throw new Error("Unexpected symbol type:"+h);for(var x=0,S=Object.entries(this.color);xt.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(t);try{for(l.s();!(c=l.n()).done;){var f=c.value,h=this.color?this.color(f[this.colorCol],e,i):void 0;if(h){var d=this.width?this.width(f[this.widthCol],e,s,a):void 0;if(d&&!(d<0)){var p=this.length?this.length(f[this.lengthCol],e,o,a):void 0;if(p&&!(p<0)){var y=this.orientation(f)*u;if(void 0!==y&&!isNaN(y)){var v=this.offset(f,e,a);n.ctx.strokeStyle=h,n.ctx.lineWidth=d;var b=f.x+e/2+v.dx,m=f.y+e/2+v.dy,g=.5*Math.cos(y)*p,w=.5*Math.sin(y)*p;n.ctx.beginPath(),n.ctx.moveTo(b-g,m-w),n.ctx.lineTo(b+g,m+w),n.ctx.stroke()}}}}}}catch(t){l.e(t)}finally{l.f()}this.updateLegends({style:this,r:e,zf:a,sColor:i,sLength:o,sWidth:s})}}])&&Mf(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),s}(Jl);function jf(t){return jf="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},jf(t)}function kf(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(t);try{for(c.s();!(u=c.n()).done;){var l=u.value,f=this.text?this.text(l[this.textCol],e,i):void 0;if(null!=f&&null!=f&&f+""!=""){var h=this.color?this.color(l[this.colorCol],e,o):void 0;if(h){n.ctx.fillStyle=h;var d=this.fontSize(l[this.fontSizeCol],e,s,a)/a,p=this.fontFamily||"Arial",y=this.fontWeight||"bold";n.ctx.font=y+" "+d+"px "+p;var v=this.offset(l,e,a);n.ctx.textAlign="center";var b=n.geoToPixX(l.x+.5*e+v.dx),m=n.geoToPixY(l.y+.5*e+v.dy)+.3*d;n.ctx.fillText(f,b,m)}}}}catch(t){c.e(t)}finally{c.f()}this.updateLegends({style:this,r:e,zf:a,sColor:o})}}])&&Bf(e.prototype,n),r&&Bf(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}(Jl);function Nf(t,e){return null==t?e:"function"==typeof t?t:e=>e[t]}function Rf(t,e=!1){const n=new Float64Array(5),r=new Float64Array(4);!function(t,e,n){const r=Float64Array.of(.84,1.8675,.84,-1.8675,-.34015,-.1299,-.34015,.1299),i=Math.exp(-1.783/n),o=Math.exp(-1.723/n),s=.6318/n,a=1.997/n,u=Float64Array.of(-i*Math.cos(s),i*Math.sin(s),-i*Math.cos(-s),i*Math.sin(-s),-o*Math.cos(a),o*Math.sin(a),-o*Math.cos(-a),o*Math.sin(-a)),c=2.5066282746310007*n,l=Float64Array.of(r[0],r[1],0,0,0,0,0,0),f=Float64Array.of(1,0,u[0],u[1],0,0,0,0,0,0);let h,d;for(d=2;d<8;d+=2){for(l[d]=u[d]*l[d-2]-u[d+1]*l[d-1],l[d+1]=u[d]*l[d-1]+u[d+1]*l[d-2],h=d-2;h>0;h-=2)l[h]+=u[d]*l[h-2]-u[d+1]*l[h-1],l[h+1]+=u[d]*l[h-1]+u[d+1]*l[h-2];for(h=0;h<=d;h+=2)l[h]+=r[d]*f[h]-r[d+1]*f[h+1],l[h+1]+=r[d]*f[h+1]+r[d+1]*f[h];for(f[d+2]=u[d]*f[d]-u[d+1]*f[d+1],f[d+3]=u[d]*f[d+1]+u[d+1]*f[d],h=d;h>0;h-=2)f[h]+=u[d]*f[h-2]-u[d+1]*f[h-1],f[h+1]+=u[d]*f[h-1]+u[d+1]*f[h-2]}for(d=0;d<4;++d)h=d<<1,e[d]=l[h]/c,t[d+1]=f[h+2]}(n,r,t);const i=Float64Array.of(0,r[1]-n[1]*r[0],r[2]-n[2]*r[0],r[3]-n[3]*r[0],-n[4]*r[0]),o=1+n[1]+n[2]+n[3]+n[4];return{sigma:t,negative:e,a:n,b_causal:r,b_anticausal:i,sum_causal:(r[0]+r[1]+r[2]+r[3])/o,sum_anticausal:(i[1]+i[2]+i[3]+i[4])/o}}function zf(t,e,n,r=1,i=new Float64Array(n),o=new Float64Array(n),s=new Float64Array(5),a=i,u=Uf){const c=2*r,l=3*r,f=4*r,h=r*n;let d,p;for(u(i,e,n,r,t.b_causal,3,t.a,4,t.sum_causal,s,t.sigma),p=4,d=f;p=0&&h0)for(p=0;p=r&&(i=o=r):(ro&&(o=r)))}return[i-n,o+n]}function Wf(t,e){const n=t.length;for(let r=0;re&&(e=t[r]);return e}function $f(t,e){const n=t.length;for(let r=0;rnull!=t&&t>=t));n.sort(((t,e)=>t-e));const r=function(t){const e=t.length;let n,r=0,i=0,o=0;for(let s=0;s1?Math.sqrt(o/(r-1)):NaN}(n),i=Yf(n,.25),o=Yf(n,.75),s=n.length,a=(o-i)/1.34;return 1.06*(Math.min(r,a)||r||Math.abs(i)||1)*Math.pow(s,-.2)}function Yf(t,e){const n=t.length;if(!n)return NaN;if((e=+e)<=0||n<2)return t[0];if(e>=1)return t[n-1];const r=(n-1)*e,i=Math.floor(r),o=t[i];return o+(t[i+1]-o)*(r-i)}function Zf(t,e={}){const{adjust:n=1,pad:r=3,bins:i=[256,256]}=e,o=Nf(e.x,(t=>t[0])),s=Nf(e.y,(t=>t[1])),a=Nf(e.weight,(()=>1/t.length));let[u=n*Gf(t,o),c=n*Gf(t,s)]=Hf(e.bandwidth);const[[l,f]=Vf(t,o,r*u),[h,d]=Vf(t,s,r*c)]=null==(p=e.extent)?[void 0,void 0]:"number"==typeof p[0]?[p,p]:p;var p;const[y,v]=Hf(i),b=function(t,e,n,r,i,o,s,a,u,c){const l=new Float64Array(s*c),f=(s-1)/(o-i),h=(c-1)/(u-a);for(let o=0;ot<0));let _,x=Rf(u/m,w),S=Rf(c/g,w);function*O(t="x",e="y",n="z"){const r=I.grid(),i=1/(m*g);for(let o=0,s=0;s_||(_=function(t,e,n,[r,i]){const o=new Float64Array(Math.max(r,i)),s=new Float64Array(Math.max(r,i)),a=new Float64Array(5),u=new Float64Array(n.length);for(let e=0,c=0;e[[l,f],[h,d]],heatmap:({color:t,clamp:e,canvas:n,maxColors:r}={})=>function(t,e,n,r=(t=>({r:0,g:0,b:0,opacity:t})),[i,o]=[$f(t,0),Wf(t,0)],s=function(t,e){if("undefined"!=typeof document){const n=document.createElement("canvas");return n.setAttribute("width",t),n.setAttribute("height",e),n}throw"Can not create a canvas instance, provide a canvas as a parameter."}(e,n),a=256){const u=1/(o-i),c=s.getContext("2d"),l=c.getImageData(0,0,e,n),f=l.data,h=a-1,d=function(t,e){const n=new Uint8ClampedArray(4*(t+1));for(let r=0;r<=t;++r){const i=e(r/t),{r:o,g:s,b:a,opacity:u=1}="string"==typeof i?Fe(i):i,c=r<<2;n[c+0]=o,n[c+1]=s,n[c+2]=a,n[c+3]=255*u|0}return n}(h,r);for(let r=0,o=0;rt.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(this.styles);try{for(v.s();!(y=v.n()).done;)y.value.draw(t,c,n)}catch(t){v.e(t)}finally{v.f()}}}}])&&Kf(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),s}(Jl);function eh(t){return eh="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},eh(t)}function nh(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return rh(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?rh(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,i=function(){};return{s:i,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function rh(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function lh(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);ni&&(i=s))}}catch(t){o.e(t)}finally{o.f()}return{min:r,max:i}}}}],n&&fh(e.prototype,n),r&&fh(e,r),Object.defineProperty(e,"prototype",{writable:!1}),a}(Jl);function yh(t){return yh="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},yh(t)}function vh(t,e){return vh=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},vh(t,e)}function bh(t){return bh=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},bh(t)}var mh=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&vh(t,e)}(o,t);var e,n,r,i=(n=o,r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,e=bh(n);if(r){var i=bh(this).constructor;t=Reflect.construct(e,arguments,i)}else t=e.apply(this,arguments);return function(t,e){if(e&&("object"===yh(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(this,t)});function o(t){var e;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,o),e=i.call(this,t),(t=t||{}).breaks=t.breaks||[100,1e3,1e4,1e5,1e6],t.width=t.width||function(){return 1},t.color=t.color||function(){return"#E7A935"};var n=function(e){if(null==e)return 0;for(var n=0;nt.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(t);try{for(p.s();!(d=p.n()).done;){var y=d.value,v=this.fillColor(y);v&&"none"!=v&&(n.ctx.fillStyle=v,n.ctx.fillRect(y.x,y.y,e,e))}}catch(t){p.e(t)}finally{p.f()}}n.ctx.lineCap="butt";for(var b=0,m=i;b1);return t+n*o*Math.sqrt(-2*Math.log(i)/i)}}return n.source=t,n}(Math.random);function Th(t,e,n){var r=document.createElement("canvas");r.setAttribute("width",t),r.setAttribute("height",e);var i=r.getContext("webgl",n);if(!i)throw new Error("Unable to initialize WebGL. Your browser or machine may not support it.");return{canvas:r,gl:i}}function Ah(t){var e=t.createProgram();if(null==e)throw new Error("Cannot create webGL program");for(var n=arguments.length,r=new Array(n>1?n-1:0),i=1;i2?r-2:0),o=2;o=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function Bh(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n3&&void 0!==arguments[3]?arguments[3]:10,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.gl=e;var s=Mh(e,e.VERTEX_SHADER,"\n attribute vec2 pos;\n uniform float sizePix;\n uniform mat3 mat;\n\n attribute float t;\n varying float vt;\n\n void main() {\n gl_Position = vec4(mat * vec3(pos, 1.0), 1.0);\n gl_PointSize = sizePix;\n vt = t;\n }\n "),a="precision mediump float;\nvarying float vt;\nuniform float alpha;\n"+function(){for(var t=[],e=0;et.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(t);try{for(f.s();!(a=f.n()).done;){var h=a.value,d=this.tFun(h[this.colorCol],e,o);null!=d&&null!=d&&(c.push(h.x+u,h.y+u),l.push(d>1?1:d<0?0:d))}}catch(t){f.e(t)}finally{f.f()}var p=this.size?this.size(e,i):e+.2*i,y=this.opacity?this.opacity(e,i):void 0;new Uh(s.gl,this.colors,this.stretching,p/i,y).draw(c,l,n.getWebGLTransform()),n.initCanvasTransform(),n.ctx.drawImage(s.canvas,0,0),this.updateLegends({style:this,r:e,zf:i,sColor:o})}else console.error("No webGL")}}}])&&$h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),s}(Jl);function Hh(t){return Hh="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Hh(t)}function qh(t,e){for(var n=0;n0&&"h"===t.or||t.value<0&&"v"===t.or?"rgba(255,255,100,"+o+")":"rgba(0,0,0,"+o+")"}:function(t,n,r,i){if(0!==t.value)return"v"===t.or?t.value<0?e.colBright:e.colDark:t.value<0?e.colDark:e.colBright},width:e.newShading?function(t,n,r,i){return e.newShadingWidthPix*i}:function(t,n,r,i){return e.widthFactor*n*Math.abs(t.value)*("v"===t.or?.5:1)},filter:e.filter});return[o,s]}}],null&&qh(e.prototype,null),n&&qh(e,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();function Kh(t){return Kh="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Kh(t)}function Jh(t,e){for(var n=0;n0&&n.push(","),n.push(" c"+r);n.push(";\n"),n.push("void main(void) {\n");for(var i=0;i0&&n.push("else "),n.push("if(vi=="),n.push(i),n.push(".0) gl_FragColor = vec4(c"),n.push(i),n.push("[0], c"),n.push(i),n.push("[1], c"),n.push(i),n.push("[2], c"),n.push(i),n.push("[3]);\n");n.push("else gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\n}"),this.fshString=n.join("")}var e,n;return e=t,n=[{key:"draw",value:function(t,e,n,r){var i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:10,o=Ah(t,Mh(t,t.VERTEX_SHADER,this.vshString),Mh(t,t.FRAGMENT_SHADER,this.fshString));t.useProgram(o),t.uniform1f(t.getUniformLocation(o,"sizePix"),1*i);for(var s=0;s=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function ad(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);nt.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(t);try{for(c.s();!(u=c.n()).done;){var l=u.value,f=this.color?this.color(l[this.colorCol],e,i):void 0;if(f&&"none"!==f){n.ctx.fillStyle=f;var h=this.offset(l,e,o),d=a(),p=a(),y=a(),v=a();this.shadowFactor>0&&(n.ctx.beginPath(),n.ctx.moveTo(l.x+h.dx+d.x,l.y+h.dy+d.y),n.ctx.lineTo(l.x+h.dx+e-y.x,l.y+h.dy+y.y),n.ctx.lineTo(l.x+h.dx+e-v.x,l.y+h.dy+e-v.y),n.ctx.stroke()),n.ctx.beginPath(),n.ctx.moveTo(l.x+h.dx+d.x,l.y+h.dy+d.y),n.ctx.lineTo(l.x+h.dx+e-y.x,l.y+h.dy+y.y),n.ctx.lineTo(l.x+h.dx+e-v.x,l.y+h.dy+e-v.y),n.ctx.lineTo(l.x+h.dx+p.x,l.y+h.dy+e-p.y),n.ctx.fill()}}}catch(t){c.e(t)}finally{c.f()}this.updateLegends({style:this,r:e,zf:o,sColor:i})}}])&&bd(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),s}(Jl);function _d(t){return _d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},_d(t)}function xd(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}(t);try{for(c.s();!(a=c.n()).done;){var l=a.value,f=this.color?this.color(l[this.colorCol],e,o,s):void 0;if(f&&"none"!==f){n.ctx.fillStyle=f;var h=this.shape?this.shape(l):"o";if("none"!==h){var d=(this.size||function(){return.5})(l[this.sizeCol],e,i,s)*u,p=(this.offset(l,e,s),l.x+u),y=l.y+u;if("p"===h)n.ctx.beginPath(),n.ctx.moveTo(p,y+u),n.ctx.lineTo(p+d,y+d),n.ctx.lineTo(p+u,y),n.ctx.lineTo(p+d,y-d),n.ctx.lineTo(p,y-u),n.ctx.lineTo(p-d,y-d),n.ctx.lineTo(p-u,y),n.ctx.lineTo(p-d,y+d),n.ctx.fill();else{if("o"!==h)throw new Error("Unexpected shape:"+h);n.ctx.beginPath(),n.ctx.moveTo(p,y+d),n.ctx.lineTo(p+u,y+u),n.ctx.lineTo(p+d,y),n.ctx.lineTo(p+u,y-u),n.ctx.lineTo(p,y-d),n.ctx.lineTo(p-u,y-u),n.ctx.lineTo(p-d,y),n.ctx.lineTo(p-u,y+u),n.ctx.fill()}}}}}catch(t){c.e(t)}finally{c.f()}this.updateLegends({style:this,r:e,zf:s,sSize:i,sColor:o})}}])&&Sd(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),s}(Jl);function Ad(t){return Ad="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ad(t)}function Md(t,e){for(var n=0;n1?r[0]+r.slice(2):r,+t.slice(n+1)]}var Pd,jd=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function kd(t){if(!(e=jd.exec(t)))throw new Error("invalid format: "+t);var e;return new Bd({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function Bd(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function Fd(t,e){var n=Cd(t,e);if(!n)return t+"";var r=n[0],i=n[1];return i<0?"0."+new Array(-i).join("0")+r:r.length>i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")}kd.prototype=Bd.prototype,Bd.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};const Ld={"%":(t,e)=>(100*t).toFixed(e),b:t=>Math.round(t).toString(2),c:t=>t+"",d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)},e:(t,e)=>t.toExponential(e),f:(t,e)=>t.toFixed(e),g:(t,e)=>t.toPrecision(e),o:t=>Math.round(t).toString(8),p:(t,e)=>Fd(100*t,e),r:Fd,s:function(t,e){var n=Cd(t,e);if(!n)return t+"";var r=n[0],i=n[1],o=i-(Pd=3*Math.max(-8,Math.min(8,Math.floor(i/3))))+1,s=r.length;return o===s?r:o>s?r+new Array(o-s+1).join("0"):o>0?r.slice(0,o)+"."+r.slice(o):"0."+new Array(1-o).join("0")+Cd(t,Math.max(0,e+o-1))[0]},X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)};function Dd(t){return t}var Nd,Rd,zd=Array.prototype.map,Ud=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function Vd(t){return Nd=function(t){var e,n,r=void 0===t.grouping||void 0===t.thousands?Dd:(e=zd.call(t.grouping,Number),n=t.thousands+"",function(t,r){for(var i=t.length,o=[],s=0,a=e[0],u=0;i>0&&a>0&&(u+a+1>r&&(a=Math.max(1,r-u)),o.push(t.substring(i-=a,i+a)),!((u+=a+1)>r));)a=e[s=(s+1)%e.length];return o.reverse().join(n)}),i=void 0===t.currency?"":t.currency[0]+"",o=void 0===t.currency?"":t.currency[1]+"",s=void 0===t.decimal?".":t.decimal+"",a=void 0===t.numerals?Dd:function(t){return function(e){return e.replace(/[0-9]/g,(function(e){return t[+e]}))}}(zd.call(t.numerals,String)),u=void 0===t.percent?"%":t.percent+"",c=void 0===t.minus?"−":t.minus+"",l=void 0===t.nan?"NaN":t.nan+"";function f(t){var e=(t=kd(t)).fill,n=t.align,f=t.sign,h=t.symbol,d=t.zero,p=t.width,y=t.comma,v=t.precision,b=t.trim,m=t.type;"n"===m?(y=!0,m="g"):Ld[m]||(void 0===v&&(v=12),b=!0,m="g"),(d||"0"===e&&"="===n)&&(d=!0,e="0",n="=");var g="$"===h?i:"#"===h&&/[boxX]/.test(m)?"0"+m.toLowerCase():"",w="$"===h?o:/[%p]/.test(m)?u:"",_=Ld[m],x=/[defgprs%]/.test(m);function S(t){var i,o,u,h=g,S=w;if("c"===m)S=_(t)+S,t="";else{var O=(t=+t)<0||1/t<0;if(t=isNaN(t)?l:_(Math.abs(t),v),b&&(t=function(t){t:for(var e,n=t.length,r=1,i=-1;r0&&(i=0)}return i>0?t.slice(0,i)+t.slice(e+1):t}(t)),O&&0==+t&&"+"!==f&&(O=!1),h=(O?"("===f?f:c:"-"===f||"("===f?"":f)+h,S=("s"===m?Ud[8+Pd/3]:"")+S+(O&&"("===f?")":""),x)for(i=-1,o=t.length;++i(u=t.charCodeAt(i))||u>57){S=(46===u?s+t.slice(i+1):t.slice(i))+S,t=t.slice(0,i);break}}y&&!d&&(t=r(t,1/0));var I=h.length+t.length+S.length,T=I>1)+h+t+S+T.slice(I);break;default:t=T+h+t+S}return a(t)}return v=void 0===v?6:/[gprs]/.test(m)?Math.max(1,Math.min(21,v)):Math.max(0,Math.min(20,v)),S.toString=function(){return t+""},S}return{format:f,formatPrefix:function(t,e){var n,r=f(((t=kd(t)).type="f",t)),i=3*Math.max(-8,Math.min(8,Math.floor((n=e,((n=Cd(Math.abs(n)))?n[1]:NaN)/3)))),o=Math.pow(10,-i),s=Ud[8+i/3];return function(t){return r(o*t)+s}}}}(t),Rd=Nd.format,Nd.formatPrefix,Nd}function Wd(t){return Wd="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Wd(t)}function $d(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:3;return Math.pow(t,e)},wp=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3;return 1-Math.pow(1-t,1/e)},_p=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3;return 0==e?t:(Math.exp(t*e)-1)/(Math.exp(e)-1)},xp=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3;return 0==e?t:1-1/e*Math.log(Math.exp(e)*(1-t)+t)},Sp=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.8;if(0==e)return t;if(1==e)return Math.sqrt(t*(2-t));var n=e/(1-e);return Math.sqrt(1/(n*n)+t*(2/n+2-t))-1/n},Op=function(t){return 1-Sp(1-t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:.8)},Ip=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3;return 0==e?t:1/e*Math.log(1-t+t*Math.exp(e))},Tp=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3;return(Math.exp(-e*t)-1)/(Math.exp(-e)-1)},Ap=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3;return Math.pow(t,1/e)},Mp=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3;return 1-Math.pow(1-t,e)},Ep=1e-6,Cp=1e-12,Pp=Math.PI,jp=Pp/2,kp=Pp/4,Bp=2*Pp,Fp=180/Pp,Lp=Pp/180,Dp=Math.abs,Np=Math.atan,Rp=Math.atan2,zp=Math.cos,Up=(Math.ceil,Math.exp,Math.floor,Math.hypot,Math.log,Math.pow,Math.sin),Vp=Math.sign||function(t){return t>0?1:t<0?-1:0},Wp=Math.sqrt;function $p(t){return t>1?jp:t<-1?-jp:Math.asin(t)}function Gp(){}function Yp(){var t,e=[];return{point:function(e,n,r){t.push([e,n,r])},lineStart:function(){e.push(t=[])},lineEnd:Gp,rejoin:function(){e.length>1&&e.push(e.pop().concat(e.shift()))},result:function(){var n=e;return e=[],t=null,n}}}function Zp(t,e){return Dp(t[0]-e[0])=0;--o)i.point((l=c[o])[0],l[1]);else r(h.x,h.p.x,-1,i);h=h.p}c=(h=h.o).z,d=!d}while(!h.v);i.lineEnd()}}}function Xp(t){if(e=t.length){for(var e,n,r=0,i=t[0];++r0){for(o=t[--i];i>0&&(e=o,n=t[--i],o=e+n,r=n-(o-e),!r););i>0&&(r<0&&t[i-1]<0||r>0&&t[i-1]>0)&&(n=2*r,e=o+n,n==e-o&&(o=e))}return o}}function Jp(t){return[Rp(t[1],t[0]),$p(t[2])]}function Qp(t){var e=t[0],n=t[1],r=zp(n);return[r*zp(e),r*Up(e),Up(n)]}function ty(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function ey(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function ny(t,e){t[0]+=e[0],t[1]+=e[1],t[2]+=e[2]}function ry(t,e){return[t[0]*e,t[1]*e,t[2]*e]}function iy(t){var e=Wp(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=e,t[1]/=e,t[2]/=e}function oy(t){return Dp(t[0])<=Pp?t[0]:Vp(t[0])*((Dp(t[0])+Pp)%Bp-Pp)}function sy(t){return Array.from(function*(t){for(const e of t)yield*e}(t))}function ay(t,e,n,r){return function(i){var o,s,a,u=e(i),c=Yp(),l=e(c),f=!1,h={point:d,lineStart:y,lineEnd:v,polygonStart:function(){h.point=b,h.lineStart=m,h.lineEnd=g,s=[],o=[]},polygonEnd:function(){h.point=d,h.lineStart=y,h.lineEnd=v,s=sy(s);var t=function(t,e){var n=oy(e),r=e[1],i=Up(r),o=[Up(n),-zp(n),0],s=0,a=0,u=new Kp;1===i?r=jp+Ep:-1===i&&(r=-jp-Ep);for(var c=0,l=t.length;c=0?1:-1,T=I*O,A=T>Pp,M=v*x;if(u.add(Rp(M*I*Up(T),b*S+M*zp(T))),s+=A?O+I*Bp:O,A^p>=n^w>=n){var E=ey(Qp(d),Qp(g));iy(E);var C=ey(o,E);iy(C);var P=(A^O>=0?-1:1)*$p(C[2]);(r>P||r===P&&(E[0]||E[1]))&&(a+=A^O>=0?1:-1)}}return(s<-Ep||s0){for(f||(i.polygonStart(),f=!0),i.lineStart(),t=0;t1&&2&u&&h.push(h.pop().concat(h.shift())),s.push(h.filter(uy))}return h}}function uy(t){return t.length>1}function cy(t,e){return((t=t.x)[0]<0?t[1]-jp-Ep:jp-t[1])-((e=e.x)[0]<0?e[1]-jp-Ep:jp-e[1])}const ly=ay((function(){return!0}),(function(t){var e,n=NaN,r=NaN,i=NaN;return{lineStart:function(){t.lineStart(),e=1},point:function(o,s){var a=o>0?Pp:-Pp,u=Dp(o-n);Dp(u-Pp)0?jp:-jp),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(a,r),t.point(o,r),e=0):i!==a&&u>=Pp&&(Dp(n-i)Ep?Np((Up(e)*(o=zp(r))*Up(n)-Up(r)*(i=zp(e))*Up(t))/(i*o*s)):(e+r)/2}(n,r,o,s),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(a,r),e=0),t.point(n=o,r=s),i=a},lineEnd:function(){t.lineEnd(),n=r=NaN},clean:function(){return 2-e}}}),(function(t,e,n,r){var i;if(null==t)i=n*jp,r.point(-Pp,i),r.point(0,i),r.point(Pp,i),r.point(Pp,0),r.point(Pp,-i),r.point(0,-i),r.point(-Pp,-i),r.point(-Pp,0),r.point(-Pp,i);else if(Dp(t[0]-e[0])>Ep){var o=t[0]1?0:n<-1?Pp:Math.acos(n);return((-e[2]<0?-r:r)+Bp-Ep)%Bp}var hy=1e9,dy=-hy;function py(t,e){function n(n,r){return n=t(n,r),e(n[0],n[1])}return t.invert&&e.invert&&(n.invert=function(n,r){return(n=e.invert(n,r))&&t.invert(n[0],n[1])}),n}const yy=t=>t;function vy(t,e){return Dp(t)>Pp&&(t-=Math.round(t/Bp)*Bp),[t,e]}function by(t){return function(e,n){return Dp(e+=t)>Pp&&(e-=Math.round(e/Bp)*Bp),[e,n]}}function my(t){var e=by(t);return e.invert=by(-t),e}function gy(t,e){var n=zp(t),r=Up(t),i=zp(e),o=Up(e);function s(t,e){var s=zp(e),a=zp(t)*s,u=Up(t)*s,c=Up(e),l=c*n+a*r;return[Rp(u*i-l*o,a*n-c*r),$p(l*i+u*o)]}return s.invert=function(t,e){var s=zp(e),a=zp(t)*s,u=Up(t)*s,c=Up(e),l=c*i-u*o;return[Rp(u*i+c*o,a*n+l*r),$p(l*n-a*r)]},s}function wy(t){return function(e){var n=new _y;for(var r in t)n[r]=t[r];return n.stream=e,n}}function _y(){}function xy(t,e){t&&Oy.hasOwnProperty(t.type)&&Oy[t.type](t,e)}vy.invert=vy,_y.prototype={constructor:_y,point:function(t,e){this.stream.point(t,e)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}};var Sy={Feature:function(t,e){xy(t.geometry,e)},FeatureCollection:function(t,e){for(var n=t.features,r=-1,i=n.length;++rEy&&(Ey=t),eCy&&(Cy=e)},lineStart:Gp,lineEnd:Gp,polygonStart:Gp,polygonEnd:Gp,result:function(){var t=[[Ay,My],[Ey,Cy]];return Ey=Cy=-(My=Ay=1/0),t}};const jy=Py;function ky(t,e,n){var r=t.clipExtent&&t.clipExtent();return t.scale(150).translate([0,0]),null!=r&&t.clipExtent(null),function(t,e){t&&Sy.hasOwnProperty(t.type)?Sy[t.type](t,e):xy(t,e)}(n,t.stream(jy)),e(jy.result()),null!=r&&t.clipExtent(r),t}function By(t,e,n){return ky(t,(function(n){var r=e[1][0]-e[0][0],i=e[1][1]-e[0][1],o=Math.min(r/(n[1][0]-n[0][0]),i/(n[1][1]-n[0][1])),s=+e[0][0]+(r-o*(n[1][0]+n[0][0]))/2,a=+e[0][1]+(i-o*(n[1][1]+n[0][1]))/2;t.scale(150*o).translate([s,a])}),n)}var Fy=16,Ly=zp(30*Lp);function Dy(t,e){return+e?function(t,e){function n(r,i,o,s,a,u,c,l,f,h,d,p,y,v){var b=c-r,m=l-i,g=b*b+m*m;if(g>4*e&&y--){var w=s+h,_=a+d,x=u+p,S=Wp(w*w+_*_+x*x),O=$p(x/=S),I=Dp(Dp(x)-1)e||Dp((b*E+m*C)/g-.5)>.3||s*h+a*d+u*p0,i=Dp(e)>Ep;function o(t,n){return zp(t)*zp(n)>e}function s(t,n,r){var i=[1,0,0],o=ey(Qp(t),Qp(n)),s=ty(o,o),a=o[0],u=s-a*a;if(!u)return!r&&t;var c=e*s/u,l=-e*a/u,f=ey(i,o),h=ry(i,c);ny(h,ry(o,l));var d=f,p=ty(h,d),y=ty(d,d),v=p*p-y*(ty(h,h)-1);if(!(v<0)){var b=Wp(v),m=ry(d,(-p-b)/y);if(ny(m,h),m=Jp(m),!r)return m;var g,w=t[0],_=n[0],x=t[1],S=n[1];_0^m[1]<(Dp(m[0]-w)Pp^(w<=m[0]&&m[0]<=_)){var T=ry(d,(-p+b)/y);return ny(T,h),[m,Jp(T)]}}}function a(e,n){var i=r?t:Pp-t,o=0;return e<-i?o|=1:e>i&&(o|=2),n<-i?o|=4:n>i&&(o|=8),o}return ay(o,(function(t){var e,n,u,c,l;return{lineStart:function(){c=u=!1,l=1},point:function(f,h){var d,p=[f,h],y=o(f,h),v=r?y?0:a(f,h):y?a(f+(f<0?Pp:-Pp),h):0;if(!e&&(c=u=y)&&t.lineStart(),y!==u&&(!(d=s(e,p))||Zp(e,d)||Zp(p,d))&&(p[2]=1),y!==u)l=0,y?(t.lineStart(),d=s(p,e),t.point(d[0],d[1])):(d=s(e,p),t.point(d[0],d[1],2),t.lineEnd()),e=d;else if(i&&e&&r^y){var b;v&n||!(b=s(p,e,!0))||(l=0,r?(t.lineStart(),t.point(b[0][0],b[0][1]),t.point(b[1][0],b[1][1]),t.lineEnd()):(t.point(b[1][0],b[1][1]),t.lineEnd(),t.lineStart(),t.point(b[0][0],b[0][1],3)))}!y||e&&Zp(e,p)||t.point(p[0],p[1]),e=p,u=y,n=v},lineEnd:function(){u&&t.lineEnd(),e=null},clean:function(){return l|(c&&u)<<1}}}),(function(e,r,i,o){!function(t,e,n,r,i,o){if(n){var s=zp(e),a=Up(e),u=r*n;null==i?(i=e+r*Bp,o=e-u/2):(i=fy(s,i),o=fy(s,o),(r>0?io)&&(i+=r*Bp));for(var c,l=i;r>0?l>o:l0)do{c.point(0===l||3===l?t:n,l>1?r:e)}while((l=(l+a+4)%4)!==f);else c.point(o[0],o[1])}function s(r,i){return Dp(r[0]-t)0?0:3:Dp(r[0]-n)0?2:1:Dp(r[1]-e)0?1:0:i>0?3:2}function a(t,e){return u(t.x,e.x)}function u(t,e){var n=s(t,1),r=s(e,1);return n!==r?n-r:0===n?e[1]-t[1]:1===n?t[0]-e[0]:2===n?t[1]-e[1]:e[0]-t[0]}return function(s){var u,c,l,f,h,d,p,y,v,b,m,g=s,w=Yp(),_={point:x,lineStart:function(){_.point=S,c&&c.push(l=[]),b=!0,v=!1,p=y=NaN},lineEnd:function(){u&&(S(f,h),d&&v&&w.rejoin(),u.push(w.result())),_.point=x,v&&g.lineEnd()},polygonStart:function(){g=w,u=[],c=[],m=!0},polygonEnd:function(){var e=function(){for(var e=0,n=0,i=c.length;nr&&(h-o)*(r-s)>(d-s)*(t-o)&&++e:d<=r&&(h-o)*(r-s)<(d-s)*(t-o)&&--e;return e}(),n=m&&e,i=(u=sy(u)).length;(n||i)&&(s.polygonStart(),n&&(s.lineStart(),o(null,null,1,s),s.lineEnd()),i&&qp(u,a,e,o,s),s.polygonEnd()),g=s,u=c=l=null}};function x(t,e){i(t,e)&&g.point(t,e)}function S(o,s){var a=i(o,s);if(c&&l.push([o,s]),b)f=o,h=s,d=a,b=!1,a&&(g.lineStart(),g.point(o,s));else if(a&&v)g.point(o,s);else{var u=[p=Math.max(dy,Math.min(hy,p)),y=Math.max(dy,Math.min(hy,y))],w=[o=Math.max(dy,Math.min(hy,o)),s=Math.max(dy,Math.min(hy,s))];!function(t,e,n,r,i,o){var s,a=t[0],u=t[1],c=0,l=1,f=e[0]-a,h=e[1]-u;if(s=n-a,f||!(s>0)){if(s/=f,f<0){if(s0){if(s>l)return;s>c&&(c=s)}if(s=i-a,f||!(s<0)){if(s/=f,f<0){if(s>l)return;s>c&&(c=s)}else if(f>0){if(s0)){if(s/=h,h<0){if(s0){if(s>l)return;s>c&&(c=s)}if(s=o-u,h||!(s<0)){if(s/=h,h<0){if(s>l)return;s>c&&(c=s)}else if(h>0){if(s0&&(t[0]=a+c*f,t[1]=u+c*h),l<1&&(e[0]=a+l*f,e[1]=u+l*h),!0}}}}}(u,w,t,e,n,r)?a&&(g.lineStart(),g.point(o,s),m=!1):(v||(g.lineStart(),g.point(u[0],u[1])),g.point(w[0],w[1]),a||g.lineEnd(),m=!1)}p=o,y=s,v=a}return _}}(O=+t[0][0],r=+t[0][1],i=+t[1][0],o=+t[1][1]),C()):null==O?null:[[O,r],[i,o]]},A.scale=function(t){return arguments.length?(f=+t,E()):f},A.translate=function(t){return arguments.length?(h=+t[0],d=+t[1],E()):[h,d]},A.center=function(t){return arguments.length?(p=t[0]%360*Lp,y=t[1]%360*Lp,E()):[p*Fp,y*Fp]},A.rotate=function(t){return arguments.length?(v=t[0]%360*Lp,b=t[1]%360*Lp,m=t.length>2?t[2]%360*Lp:0,E()):[v*Fp,b*Fp,m*Fp]},A.angle=function(t){return arguments.length?(g=t%360*Lp,E()):g*Fp},A.reflectX=function(t){return arguments.length?(w=t?-1:1,E()):w<0},A.reflectY=function(t){return arguments.length?(_=t?-1:1,E()):_<0},A.precision=function(t){return arguments.length?(s=Dy(a,T=t*t),C()):Wp(T)},A.fitExtent=function(t,e){return By(A,t,e)},A.fitSize=function(t,e){return function(t,e,n){return By(t,[[0,0],e],n)}(A,t,e)},A.fitWidth=function(t,e){return function(t,e,n){return ky(t,(function(n){var r=+e,i=r/(n[1][0]-n[0][0]),o=(r-i*(n[1][0]+n[0][0]))/2,s=-i*n[0][1];t.scale(150*i).translate([o,s])}),n)}(A,t,e)},A.fitHeight=function(t,e){return function(t,e,n){return ky(t,(function(n){var r=+e,i=r/(n[1][1]-n[0][1]),o=-i*n[0][0],s=(r-i*(n[1][1]+n[0][1]))/2;t.scale(150*i).translate([o,s])}),n)}(A,t,e)},function(){return e=t.apply(this,arguments),A.invert=e.invert&&M,E()}}((function(){return t}))()}var Uy,Vy,Wy=(Uy=function(t){return Wp(2/(1+t))},function(t,e){var n=zp(t),r=zp(e),i=Uy(n*r);return i===1/0?[2,0]:[i*r*Up(t),i*Up(e)]});Wy.invert=(Vy=function(t){return 2*$p(t/2)},function(t,e){var n=Wp(t*t+e*e),r=Vy(n),i=Up(r),o=zp(r);return[Rp(t*i,n*o),$p(n&&e*i/n)]});var $y=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"EUR",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:50,n=arguments.length>2?arguments[2]:void 0,r=(n=n||{}).ex||1.2,i=n.fontFamily||"Arial",o=n.exSize||1;return n.style=n.style||function(t,e){if(!(t.rs=0))return!1;var e=n.proj([t.lon,t.lat]);t.x=e[0],t.y=e[1],delete t.lon,delete t.lat},n.baseURL=n.baseURL||"https://raw.githubusercontent.com/eurostat/euronym/main/pub/v2/UTF/",n.url=n.baseURL+e+"/"+t+".csv",n},Gy=function(t){var e=(t=t||{}).nutsYear||"2021",n=t.crs||"3035",r=t.scale||"03M",i=t.nutsLevel||"3",o=t.col||"#888",s=t.colKosovo||"#bcbcbc",a=null==t.showOth||t.showOth;return t.color=t.color||function(t,e){var n=t.properties;if(a||"T"==n.eu||"T"==n.cc||"T"==n.efta||"T"!==n.oth)return n.id>=1e5?s:"T"===n.co||e<400?o:e<1e3?n.lvl>=3?"":o:e<2e3?n.lvl>=2?"":o:n.lvl>=1?"":o},t.width=t.width||function(t,e){var n=t.properties;return"T"===n.co?.5:e<400?3==n.lvl||2==n.lvl||1==n.lvl?2.2:4:e<1e3?2==n.lvl||1==n.lvl?1.8:2.5:e<2e3?1==n.lvl?1.8:2.5:1.2},t.lineDash=t.lineDash||function(t,e){var n=t.properties;return"T"===n.co?[]:e<400?3==n.lvl?[2*e,2*e]:2==n.lvl||1==n.lvl?[5*e,2*e]:[10*e,3*e]:e<1e3?2==n.lvl||1==n.lvl?[5*e,2*e]:[10*e,3*e]:e<2e3&&1==n.lvl?[5*e,2*e]:[10*e,3*e]},t.baseURL=t.baseURL||"https://raw.githubusercontent.com/eurostat/Nuts2json/master/pub/v2/",t.url=t.baseURL+e+"/"+n+"/"+r+"/nutsbn_"+i+".json",t},Yy=Rn.getParameterByName;return Vd({decimal:".",thousands:" ",grouping:[3],currency:["","€"]}),e})())); \ No newline at end of file diff --git a/docs/reference.md b/docs/reference.md index d4e4f85bf..6f22d8364 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -2,52 +2,52 @@ ## Table of contents -- [Gridviz API reference](#gridviz-api-reference) - - [Table of contents](#table-of-contents) - - [Usage](#usage) - - [App Configuration](#app-configuration) - - [App options object](#app-options-object) - - [Multi layer, multi style and multi scale mapping](#multi-layer-multi-style-and-multi-scale-mapping) - - [Adding data](#adding-data) - - [Single CSV file](#single-csv-file) - - [Multi scale CSV data](#multi-scale-csv-data) - - [Tiled data](#tiled-data) - - [Multi scale tiled data](#multi-scale-tiled-data) - - [Data pre-processing and filtering](#data-pre-processing-and-filtering) - - [Basic styles](#basic-styles) - - [Shape/Color/Size Style](#shapecolorsize-style) - - [Square color WebGL Style](#square-color-webgl-style) - - [Square color category WebGL style](#square-color-category-webgl-style) - - [Composition style](#composition-style) - - [Segment style](#segment-style) - - [Stroke style](#stroke-style) - - [Advanced styles](#advanced-styles) - - [Tanaka style](#tanaka-style) - - [Dot density style](#dot-density-style) - - [Pillars style](#pillars-style) - - [Text style](#text-style) - - [Side styles](#side-styles) - - [Side style](#side-style) - - [Side category style](#side-category-style) - - [Contour style](#contour-style) - - [Esthetic styles](#esthetic-styles) - - [JoyPlot Style](#joyplot-style) - - [Mosaic style](#mosaic-style) - - [Ninja star style](#ninja-star-style) - - [Lego style](#lego-style) - - [Lego category style](#lego-category-style) - - [Kernel smoothing](#kernel-smoothing) - - [Others styles](#others-styles) - - [Legends](#legends) - - [Stretching](#stretching) - - [Background layer](#background-layer) - - [Tiled layer](#tiled-layer) - - [WMS](#wms) - - [Foreground information](#foreground-information) - - [Showing labels](#showing-labels) - - [Showing boundaries](#showing-boundaries) - - [Tooltip](#tooltip) - - [Alright?](#alright) +- [Gridviz API reference](#gridviz-api-reference) + - [Table of contents](#table-of-contents) + - [Usage](#usage) + - [App Configuration](#app-configuration) + - [App options object](#app-options-object) + - [Multi layer, multi style and multi scale mapping](#multi-layer-multi-style-and-multi-scale-mapping) + - [Adding data](#adding-data) + - [Single CSV file](#single-csv-file) + - [Multi scale CSV data](#multi-scale-csv-data) + - [Tiled data](#tiled-data) + - [Multi scale tiled data](#multi-scale-tiled-data) + - [Data pre-processing and filtering](#data-pre-processing-and-filtering) + - [Basic styles](#basic-styles) + - [Shape/Color/Size Style](#shapecolorsize-style) + - [Square color WebGL Style](#square-color-webgl-style) + - [Square color category WebGL style](#square-color-category-webgl-style) + - [Composition style](#composition-style) + - [Segment style](#segment-style) + - [Stroke style](#stroke-style) + - [Advanced styles](#advanced-styles) + - [Tanaka style](#tanaka-style) + - [Dot density style](#dot-density-style) + - [Pillars style](#pillars-style) + - [Text style](#text-style) + - [Side styles](#side-styles) + - [Side style](#side-style) + - [Side category style](#side-category-style) + - [Contour style](#contour-style) + - [Esthetic styles](#esthetic-styles) + - [JoyPlot Style](#joyplot-style) + - [Mosaic style](#mosaic-style) + - [Ninja star style](#ninja-star-style) + - [Lego style](#lego-style) + - [Lego category style](#lego-category-style) + - [Kernel smoothing](#kernel-smoothing) + - [Others styles](#others-styles) + - [Legends](#legends) + - [Stretching](#stretching) + - [Background layer](#background-layer) + - [Tiled layer](#tiled-layer) + - [WMS](#wms) + - [Foreground information](#foreground-information) + - [Showing labels](#showing-labels) + - [Showing boundaries](#showing-boundaries) + - [Tooltip](#tooltip) + - [Alright?](#alright) Anything unclear or missing? Feel free to [ask](https://github.com/eurostat/gridviz/issues/new) ! @@ -116,7 +116,7 @@ new gviz.App(containerDiv, { backgroundColor: 'white', tooltip: { fontSize: '1.2em', - transitionDuration: 100 + transitionDuration: 100, }, onZoomStartFun: (event) => { console.log('pan/zoom start', event) @@ -130,21 +130,21 @@ new gviz.App(containerDiv, { }) ``` -| Property | Type | Default | Description | -| ---------------------------------- | ----------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| _opts_.**canvas** | HTMLCanvasElement | created automatically by gridviz | Specify your own canvas element upon which gridviz will be rendered. | -| _opts_.**w** | number | container.offsetWidth | The width of the canvas. | -| _opts_.**h** | number | container.offsetHeight | The height of the canvas. | -| _opts_.**legendDivId** | string | 'gvizLegend' | The identifier of the element upon which the legend will be appended. | -| _opts_.**selectionRectangleColor** | string | 'red' | The colour of the outline when a cell is highlighted. | -| _opts_.**selectionRectangleWidthPix** | Function | (r,zf) => 4 | A function specifying the thickness in pixels of the outline when a cell is highlighted. The function parameter *r* is the cell resolution. *zf* is the zoom level. | -| _opts_.**transparentbackground** | boolean | false | Whether the background should be filled with colour (backgroundColor) or not. It is essentially the difference between using context.fillRect vs context.clearRect. | -| _opts_.**backgroundColor** | string | 'white' | The background color of the canvas when transparentBackground is set to false. | -| _opts_.**disableZoom** | Boolean | false | Disables d3 pan and zoom when set to true. | -| _opts_.**onZoomStartFun** | Function | null | Event handler for when a pan/zoom event is initiated. | -| _opts_.**onZoomFun** | Function | null | Event handler for when a pan/zoom event is occurring. | -| _opts_.**onZoomEndFun** | Function | null | Event handler for when a pan/zoom event has finished. | -| _opts_.**tooltip** | Object | undefined | See [tooltip docs](#tooltip) | +| Property | Type | Default | Description | +| ------------------------------------- | ----------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| _opts_.**canvas** | HTMLCanvasElement | created automatically by gridviz | Specify your own canvas element upon which gridviz will be rendered. | +| _opts_.**w** | number | container.offsetWidth | The width of the canvas. | +| _opts_.**h** | number | container.offsetHeight | The height of the canvas. | +| _opts_.**legendDivId** | string | 'gvizLegend' | The identifier of the element upon which the legend will be appended. | +| _opts_.**selectionRectangleColor** | string | 'red' | The colour of the outline when a cell is highlighted. | +| _opts_.**selectionRectangleWidthPix** | Function | (r,zf) => 4 | A function specifying the thickness in pixels of the outline when a cell is highlighted. The function parameter _r_ is the cell resolution. _zf_ is the zoom level. | +| _opts_.**transparentbackground** | boolean | false | Whether the background should be filled with colour (backgroundColor) or not. It is essentially the difference between using context.fillRect vs context.clearRect. | +| _opts_.**backgroundColor** | string | 'white' | The background color of the canvas when transparentBackground is set to false. | +| _opts_.**disableZoom** | Boolean | false | Disables d3 pan and zoom when set to true. | +| _opts_.**onZoomStartFun** | Function | null | Event handler for when a pan/zoom event is initiated. | +| _opts_.**onZoomFun** | Function | null | Event handler for when a pan/zoom event is occurring. | +| _opts_.**onZoomEndFun** | Function | null | Event handler for when a pan/zoom event has finished. | +| _opts_.**tooltip** | Object | undefined | See [tooltip docs](#tooltip) | ## Multi layer, multi style and multi scale mapping @@ -427,16 +427,16 @@ See [this basic example](https://eurostat.github.io/gridviz/examples/styles/comp See [this example showing population of France by age group](https://eurostat.github.io/gridviz/examples/styles/composition_pop_FR.html) ([code](https://github.com/eurostat/gridviz/blob/master/examples/styles/composition_pop_FR.html)). -| Property | Type | Default | Description | -| -------------------------------- | --------------------------- | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **color** | Object, string -> color | undefined | The dictionary (string -> color) which give the color of each category. | -| **type** | function(c):CompositionType | () => "flag | A function returning the symbol type of a cell **c**. CompositionType are among _"flag", "piechart", "ring", "segment", "radar", "agepyramid", "halftone"_ | -| **sizeCol** | string | undefined | The name of the column used for the size. | -| **size** | function(v,r,s,zf):number | (v,r,s,zf) => r | A function computing the cell size from its **sizeCol** value **v**, the resolution **r**, statistics **s** and zoom | -| **stripesOrientation** | function(c,r,zf):number | () => 0 | For style types with stripes (flag, segment), a function returning the symbol stripes orientation (0 for horizontal, other for vertical) from the cell **c**, the resolution **r** and zoom factor **zf**. | -| **offsetAngle** | function(c,r,zf):number | () => 0 | For radar, halftone or pie chart style, a function returning the offset angle from the cell **c**, the resolution **r** and zoom factor **zf**. The angle is specified in degree. The rotation is anti-clockwise. | -| **agePyramidHeight** | function(c,r,zf):number | (c,r,zf) => r | The function specifying the height of the age pyramid. | -| **pieChartInternalRadiusFactor** | number | 0 | For pie chart, this is parameter for internal radius, so that the pie chart looks like a donut. 0 for normal pie charts, 0.5 to empty half of the radius. | +| Property | Type | Default | Description | +| -------------------------------- | --------------------------- | --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **color** | Object, string -> color | undefined | The dictionary (string -> color) which give the color of each category. | +| **type** | function(c):CompositionType | () => "flag | A function returning the symbol type of a cell **c**. CompositionType are among _"flag", "piechart", "ring", "segment", "radar", "agepyramid", "halftone"_ | +| **sizeCol** | string | undefined | The name of the column used for the size. | +| **size** | function(v,r,s,zf):number | (v,r,s,zf) => r | A function computing the cell size from its **sizeCol** value **v**, the resolution **r**, statistics **s** and zoom | +| **stripesOrientation** | function(c,r,zf):number | () => 0 | For style types with stripes (flag, segment), a function returning the symbol stripes orientation (0 for horizontal, other for vertical) from the cell **c**, the resolution **r** and zoom factor **zf**. | +| **offsetAngle** | function(c,r,zf):number | () => 0 | For radar, halftone or pie chart style, a function returning the offset angle from the cell **c**, the resolution **r** and zoom factor **zf**. The angle is specified in degree. The rotation is anti-clockwise. | +| **agePyramidHeight** | function(c,r,zf):number | (c,r,zf) => r | The function specifying the height of the age pyramid. | +| **pieChartInternalRadiusFactor** | number | 0 | For pie chart, this is parameter for internal radius, so that the pie chart looks like a donut. 0 for normal pie charts, 0.5 to empty half of the radius. | ### Segment style @@ -672,15 +672,13 @@ See [this basic example](https://eurostat.github.io/gridviz/examples/styles/ninj See [this other example](https://eurostat.github.io/gridviz/examples/styles/ninja_star_p.html) ([code](https://github.com/eurostat/gridviz/blob/master/examples/styles/ninja_star_p.html)) with stars parallel to the x/y axes. - -| Property | Type | Default | Description | -| ------------ | ------------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -| **colorCol** | string | undefined | The name of the column used for the color. | -| **color** | function(v,r,s):string | (v,r,s,zf) => "#EA6BAC" | A function computing the cell color from its **colorCol** value **v**, the resolution **r**, statistics **s** and zoom factor **zf**. | -| **sizeCol** | string | undefined | The name of the column used for the size. | -| **size** | function(v,r,s,zf):number | (v,r,s,zf) => t | A function computing the cell size, within [0,1], from its **sizeCol** value **v**, the resolution **r**, statistics **s** and zoom factor **zf**. 1 corresponds to a square, 0 to an infinitly thin cross. | -| **shape** | function(c):string | () => "o" | A function computing the orientation of the ninja star: *"o"* for 45deg oblique star, *"p"* for a star parallel to the x/y axes. | - +| Property | Type | Default | Description | +| ------------ | ------------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **colorCol** | string | undefined | The name of the column used for the color. | +| **color** | function(v,r,s):string | (v,r,s,zf) => "#EA6BAC" | A function computing the cell color from its **colorCol** value **v**, the resolution **r**, statistics **s** and zoom factor **zf**. | +| **sizeCol** | string | undefined | The name of the column used for the size. | +| **size** | function(v,r,s,zf):number | (v,r,s,zf) => t | A function computing the cell size, within [0,1], from its **sizeCol** value **v**, the resolution **r**, statistics **s** and zoom factor **zf**. 1 corresponds to a square, 0 to an infinitly thin cross. | +| **shape** | function(c):string | () => "o" | A function computing the orientation of the ninja star: _"o"_ for 45deg oblique star, _"p"_ for a star parallel to the x/y axes. | ### Lego style @@ -768,7 +766,6 @@ For more information on these functions and an overview of how they differ, see: [![gridviz background layer TMS](img/background.png)](https://eurostat.github.io/gridviz/examples/background.html) - ### Tiled layer To add a background layer to a [Gridviz](https://github.com/eurostat/gridviz/) map, use the following **addBackgroundLayer** method: @@ -797,14 +794,13 @@ The **addBackgroundLayer** method has the following parameters: | **resolutions** | Array(number) | undefined | The list of resolutions by zoom **z** level, starting with the zoom level with larger resolution to lower resolutions. | | **z0** | number | 0 | If number of the first zoom level (larger resolution), usually 0. | | **nbPix** | number | 256 | The size of each tile image, in pixel number, usually 256. | -| **origin** | Array(number) | [0, 0] | The geographical coordinates of top left corner of the tiling scheme. | -| **visible** | boolean | true | The visibility of the layer. When _false_, the layer is not drawn. | -| **minZoom** and **maxZoom** | number | 0 and Infinity | The min/maximum zoom factors to show the layer. Outside of this range, the layer is not drawn. | -| **filterColor** | function(zf):string | undefined | A function returning a filter color from the zoom factor **zf**. This color alpha channel can be used to soften the background layer: Use _"ffffffd1"_ for example. This color can addapt to the zoom level, so that the layer can progressively fade away when zooming out. | +| **origin** | Array(number) | [0, 0] | The geographical coordinates of top left corner of the tiling scheme. | +| **visible** | boolean | true | The visibility of the layer. When _false_, the layer is not drawn. | +| **minZoom** and **maxZoom** | number | 0 and Infinity | The min/maximum zoom factors to show the layer. Outside of this range, the layer is not drawn. | +| **filterColor** | function(zf):string | undefined | A function returning a filter color from the zoom factor **zf**. This color alpha channel can be used to soften the background layer: Use _"ffffffd1"_ for example. This color can addapt to the zoom level, so that the layer can progressively fade away when zooming out. | For more information, [see the code](../src/BackgroundLayer.js). - ### WMS To add a WMS background layer to a [Gridviz](https://github.com/eurostat/gridviz/) map, use the following **addBackgroundLayerWMS** method: @@ -822,16 +818,15 @@ See [this example](https://eurostat.github.io/gridviz/examples/background_WMS.ht The **addBackgroundLayer** method has the following parameters: -| Parameter | Type | Default | Description | -| ------------------- | ---------------------- | ------------- | ----------------- | -| **url** | string | undefined | The base URL of the WMS. This URL must contain all necessary parameters, except *width*, *height* and *bbox* which are computed by the application. | -| **visible** | boolean | true | The visibility of the layer. When _false_, the layer is not drawn. | -| **minZoom** and **maxZoom** | number | 0 and Infinity | The min/maximum zoom factors to show the layer. Outside of this range, the layer is not drawn. | -| **filterColor** | function(zf):string | undefined | A function returning a filter color from the zoom factor **zf**. This color alpha channel can be used to soften the background layer: Use _"ffffffd1"_ for example. This color can addapt to the zoom level, so that the layer can progressively fade away when zooming out. | +| Parameter | Type | Default | Description | +| --------------------------- | ------------------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **url** | string | undefined | The base URL of the WMS. This URL must contain all necessary parameters, except _width_, _height_ and _bbox_ which are computed by the application. | +| **visible** | boolean | true | The visibility of the layer. When _false_, the layer is not drawn. | +| **minZoom** and **maxZoom** | number | 0 and Infinity | The min/maximum zoom factors to show the layer. Outside of this range, the layer is not drawn. | +| **filterColor** | function(zf):string | undefined | A function returning a filter color from the zoom factor **zf**. This color alpha channel can be used to soften the background layer: Use _"ffffffd1"_ for example. This color can addapt to the zoom level, so that the layer can progressively fade away when zooming out. | For more information, [see the code](../src/BackgroundLayerWMS.js). - ## Foreground information ### Showing labels diff --git a/examples/test/test.html b/examples/test/test.html index c3558154b..75abcaca7 100644 --- a/examples/test/test.html +++ b/examples/test/test.html @@ -43,6 +43,17 @@ } ) + //add legend + app.layers[0].styles[0].legends.push( + new gviz.ColorLegend({ + title: 'Number of inhabitants', + width: 400, + ticks: 5, + colorRamp: d3.interpolateYlOrRd, + fun: (t, r, s) => s.max * gviz.sExpRevInverse(t, -7), + }) + ) + /*app.addBackgroundLayer({ urlFun: (x, y, z) => "https://webgate.ec.europa.eu/inspireec/arcgis/rest/services/Basemaps/Natural_Earth_3035/MapServer/tile/" + z + "/" + y + "/" + x, resolutions: [66145.9656252646, 26458.386250105836, 13229.193125052918, 6614.596562526459, 2645.8386250105837, 1322.9193125052918,], diff --git a/src/App.js b/src/App.js index b79b319ed..c9d71373e 100644 --- a/src/App.js +++ b/src/App.js @@ -186,7 +186,7 @@ export class App { this.legendDivId = opts.legendDivId || 'gvizLegend' this.legend = select('#' + this.legendDivId) if (this.legend.empty()) { - this.legend = select('body') + this.legend = select('#' + container.id) .append('div') .attr('id', this.legendDivId) .style('position', 'absolute') @@ -206,6 +206,10 @@ export class App { //tooltip + // set App container as default parent element for tooltip + if (!opts.tooltip) opts.tooltip = {} + if (!opts.tooltip.parentElement) opts.tooltip.parentElement = container + /** * @private * @type {Tooltip} */ diff --git a/src/Tooltip.js b/src/Tooltip.js index d03c2ac7e..487c6c77c 100644 --- a/src/Tooltip.js +++ b/src/Tooltip.js @@ -44,12 +44,17 @@ export class Tooltip { this.yMouseOffset = opts.yMouseOffset || 0 /** @type {number} */ this.xMouseOffset = opts.xMouseOffset || 0 + /** @type {HTMLElement} */ + this.parentElement = opts.parentElement || document.body /** * @private * @type {import("d3-selection").Selection} */ this.tooltip = select('#' + this.div) - if (this.tooltip.empty()) this.tooltip = select('body').append('div').attr('id', this.div) + if (this.tooltip.empty()) + this.tooltip = select('#' + this.parentElement.id) + .append('div') + .attr('id', this.div) //initialise this.tooltip.style('max-width', this.maxWidth) @@ -64,6 +69,9 @@ export class Tooltip { this.tooltip.style('position', 'absolute') this.tooltip.style('pointer-events', 'none') this.tooltip.style('opacity', '0') + + // aria-labels (thanks to wahlatlas) + this.tooltip.attr('role', 'tooltip').attr('aria-live', 'polite') } /** Show the tooltip */ @@ -94,6 +102,8 @@ export class Tooltip { this.tooltip .style('left', event.pageX + this.xOffset + 'px') .style('top', event.pageY - this.yOffset + 'px') + + this.ensureTooltipInsideContainer(event) } /* @@ -101,12 +111,12 @@ export class Tooltip { if (html) my.html(html); my.setPosition(event); my.show() - //this.ensureTooltipOnScreen(); + //this.ensureTooltipInsideContainer(); }; my.mousemove = function (event) { my.setPosition(event); - //this.ensureTooltipOnScreen(); + //this.ensureTooltipInsideContainer(); }; my.mouseout = function () { @@ -126,25 +136,31 @@ export class Tooltip { } /** - * @function ensureTooltipOnScreen - * @description Prevents the tooltip from overflowing off screen + * @function ensureTooltipInsideContainer + * @description Prevents the tooltip from overflowing out of the App container (ensures that the tooltip is inside the gridviz container) + * @param {MouseEvent} event */ - /*my.ensureTooltipOnScreen = function () { - // TODO: parent needs to be the all-encompassing container, not the map SVG id otherwise it just uses the last SVG which will be an inset SVG. - let parent = document.getElementById(config.parentContainerId); - let bbox = parent.getBBox(); - let parentWidth = bbox.width; - let parentHeight = bbox.height; - let node = tooltip.node(); - //too far right - if (node.offsetLeft > parentWidth - node.clientWidth) { - node.style.left = node.offsetLeft - (node.clientWidth + config.xOffset * 2) + "px"; - - } - //too far down - if (node.offsetTop + node.clientHeight > parentHeight) { - node.style.top = node.offsetTop - (node.clientHeight + config.yOffset * 2) + "px"; - } - - }*/ + ensureTooltipInsideContainer = function (event) { + let node = this.tooltip.node() + let rect = this.parentElement.getBoundingClientRect() + let parentWidth = rect.width + let parentHeight = rect.height + + //too far right + if (node.offsetLeft > rect.left + parentWidth - node.clientWidth) { + let left = event.x - node.clientWidth - this.xOffset + node.style.left = left + 'px' + // check if mouse covers tooltip + if (node.offsetLeft + node.clientWidth > event.x) { + //move tooltip left so it doesnt cover mouse + let left2 = event.x - (node.clientWidth + this.xOffset) + node.style.left = left2 + 'px' + } + } + + //too far down + if (node.offsetTop + node.clientHeight > rect.top + parentHeight) { + node.style.top = node.offsetTop - node.clientHeight + 'px' + } + } }