weex-lrui
Version:
A Flyme Style UI library based on Weex for Creator.
11,655 lines • 1.24 MB
JavaScript
console.log('START WEEX VUE RENDER: 0.12.21, Build 2017-10-12 15:49.');
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global.WeexVueRender = factory());
}(this, (function () { 'use strict';
function __$styleInject(css, returnValue) {
if (typeof document === 'undefined') {
return returnValue;
}
css = css || '';
var head = document.head || document.getElementsByTagName('head')[0];
var style = document.createElement('style');
style.type = 'text/css';
if (style.styleSheet){
style.styleSheet.cssText = css;
} else {
style.appendChild(document.createTextNode(css));
}
head.appendChild(style);
return returnValue;
}
__$styleInject("/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n \n.weex-root,\n.weex-root * {\n color: initial;\n cursor: initial;\n direction: initial;\n font: initial;\n font-family: initial;\n font-size: initial;\n font-style: initial;\n font-variant: initial;\n font-weight: initial;\n line-height: initial;\n text-align: initial;\n text-indent: initial;\n visibility: initial;\n white-space: initial;\n word-spacing: initial;\n font-family: BlinkMacSystemFont, 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;\n}\n\n.weex-root,\n.weex-root *,\n.weex-root *::before,\n.weex-root *::after {\n box-sizing: border-box;\n -webkit-text-size-adjust: none;\n -moz-text-size-adjust: none;\n -ms-text-size-adjust: none;\n text-size-adjust: none;\n}\n\n.weex-root a,\n.weex-root button,\n.weex-root [role=\"button\"],\n.weex-root input,\n.weex-root label,\n.weex-root select,\n.weex-root textarea {\n -ms-touch-action: manipulation;\n touch-action: manipulation;\n}\n\n.weex-root p,\n.weex-root ol,\n.weex-root ul,\n.weex-root dl {\n margin: 0;\n padding: 0;\n}\n\n.weex-root li {\n list-style: none;\n}\n\n.weex-root figure {\n margin: 0;\n}\n\n.weex-root textarea {\n resize: none;\n}\n\n/* show no scroll bar. */\n::-webkit-scrollbar {\n display: none;\n}\n",undefined);
__$styleInject("/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n \n.weex-root * {\n border-width: 0;\n border-color: inherit;\n border-style: solid;\n}\n\n.weex-flex-ct {\n display: -webkit-box;\n display: -webkit-flex;\n display: -moz-box;\n display: -ms-flexbox;\n display: flex;\n}\n\n.weex-ct {\n box-sizing: border-box;\n display: -webkit-box;\n display: -webkit-flex;\n display: -moz-box;\n display: -ms-flexbox;\n display: flex;\n position: relative;\n -webkit-box-orient: vertical;\n -webkit-flex-direction: column;\n -moz-box-orient: vertical;\n -moz-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n -webkit-flex-shrink: 0;\n -ms-flex-negative: 0;\n flex-shrink: 0;\n -webkit-flex-grow: 0;\n -moz-box-flex: 0;\n -ms-flex-grow: 0;\n flex-grow: 0;\n -webkit-flex-basis: auto;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n -webkit-box-align: stretch;\n -webkit-align-items: stretch;\n -moz-box-align: stretch;\n -ms-flex-align: stretch;\n align-items: stretch;\n -webkit-align-content: flex-start;\n -ms-flex-line-pack: start;\n align-content: flex-start;\n border: 0 solid black;\n margin: 0;\n padding: 0;\n min-width: 0;\n}\n\n.weex-ct.horizontal {\n -webkit-box-orient: horizontal;\n -webkit-flex-direction: row;\n -moz-box-orient: horizontal;\n -moz-box-direction: normal;\n -ms-flex-direction: row;\n flex-direction: row;\n}\n\n.weex-el {\n display: block;\n box-sizing: border-box;\n position: relative;\n -webkit-flex-shrink: 0;\n -ms-flex-negative: 0;\n flex-shrink: 0;\n -webkit-flex-grow: 0;\n -moz-box-flex: 0;\n -ms-flex-grow: 0;\n flex-grow: 0;\n -webkit-flex-basis: auto;\n -ms-flex-preferred-size: auto;\n flex-basis: auto;\n border: 0 solid black;\n margin: 0;\n padding: 0;\n min-width: 0;\n}\n\n.weex-ios-sticky {\n position: -webkit-sticky !important;\n position: sticky !important;\n z-index: 9999;\n top: 0;\n}\n\n.weex-fixed {\n position: fixed;\n z-index: 1;\n}\n\n.weex-sticky {\n position: fixed;\n top: 0;\n z-index: 9999;\n}\n",undefined);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* eslint-disable */
var isInitialized = false;
// major events supported:
// panstart
// panmove
// panend
// swipe
// longpress
// extra events supported:
// dualtouchstart
// dualtouch
// dualtouchend
// tap
// doubletap
// pressend
var doc = window.document;
var docEl = doc.documentElement;
var slice = Array.prototype.slice;
var gestures = {};
var lastTap = null;
/**
* find the closest common ancestor
* if there's no one, return null
*
* @param {Element} el1 first element
* @param {Element} el2 second element
* @return {Element} common ancestor
*/
function getCommonAncestor(el1, el2) {
var el = el1;
while (el) {
if (el.contains(el2) || el == el2) {
return el
}
el = el.parentNode;
}
return null
}
/**
* fire a HTMLEvent
*
* @param {Element} element which element to fire a event on
* @param {string} type type of event
* @param {object} extra extra data for the event object
*/
function fireEvent(element, type, extra) {
var event = doc.createEvent('HTMLEvents');
event.initEvent(type, true, true);
if (typeof extra === 'object') {
for (var p in extra) {
event[p] = extra[p];
}
}
/**
* A flag to distinguish with other events with the same name generated
* by another library in the same page.
*/
event._for = 'weex';
element.dispatchEvent(event);
}
/**
* calc the transform
* assume 4 points ABCD on the coordinate system
* > rotate:angle rotating from AB to CD
* > scale:scale ratio from AB to CD
* > translate:translate shift from A to C
*
* @param {number} x1 abscissa of A
* @param {number} y1 ordinate of A
* @param {number} x2 abscissa of B
* @param {number} y2 ordinate of B
* @param {number} x3 abscissa of C
* @param {number} y3 ordinate of C
* @param {number} x4 abscissa of D
* @param {number} y4 ordinate of D
* @return {object} transform object like
* {rotate, scale, translate[2], matrix[3][3]}
*/
function calc(x1, y1, x2, y2, x3, y3, x4, y4) {
var rotate = Math.atan2(y4 - y3, x4 - x3) - Math.atan2(y2 - y1, x2 - x1);
var scale = Math.sqrt((Math.pow(y4 - y3, 2)
+ Math.pow(x4 - x3, 2)) / (Math.pow(y2 - y1, 2)
+ Math.pow(x2 - x1, 2)));
var translate = [
x3
- scale * x1 * Math.cos(rotate)
+ scale * y1 * Math.sin(rotate),
y3
- scale * y1 * Math.cos(rotate)
- scale * x1 * Math.sin(rotate)];
return {
rotate: rotate,
scale: scale,
translate: translate,
matrix: [
[scale * Math.cos(rotate), -scale * Math.sin(rotate), translate[0]],
[scale * Math.sin(rotate), scale * Math.cos(rotate), translate[1]],
[0, 0, 1]
]
}
}
/**
* take over the touchstart events. Add new touches to the gestures.
* If there is no previous records, then bind touchmove, tochend
* and touchcancel events.
* new touches initialized with state 'tapping', and within 500 milliseconds
* if the state is still tapping, then trigger gesture 'press'.
* If there are two touche points, then the 'dualtouchstart' is triggerd. The
* node of the touch gesture is their cloest common ancestor.
*
* @event
* @param {event} event
*/
function touchstartHandler(event) {
if (Object.keys(gestures).length === 0) {
docEl.addEventListener('touchmove', touchmoveHandler, false);
docEl.addEventListener('touchend', touchendHandler, false);
docEl.addEventListener('touchcancel', touchcancelHandler, false);
}
// record every touch
for (var i = 0; i < event.changedTouches.length; i++) {
var touch = event.changedTouches[i];
var touchRecord = {};
for (var p in touch) {
touchRecord[p] = touch[p];
}
var gesture = {
startTouch: touchRecord,
startTime: Date.now(),
status: 'tapping',
element: event.srcElement || event.target,
pressingHandler: setTimeout(function (element, touch) {
return function () {
if (gesture.status === 'tapping') {
gesture.status = 'pressing';
fireEvent(element, 'longpress', {
// add touch data for weex
touch: touch,
touches: event.touches,
changedTouches: event.changedTouches,
touchEvent: event
});
}
clearTimeout(gesture.pressingHandler);
gesture.pressingHandler = null;
}
}(event.srcElement || event.target, event.changedTouches[i]), 500)
};
gestures[touch.identifier] = gesture;
}
if (Object.keys(gestures).length == 2) {
var elements = [];
for (var p in gestures) {
elements.push(gestures[p].element);
}
fireEvent(getCommonAncestor(elements[0], elements[1]), 'dualtouchstart', {
touches: slice.call(event.touches),
touchEvent: event
});
}
}
/**
* take over touchmove events, and handle pan and dual related gestures.
*
* 1. traverse every touch point:
* > if 'tapping' and the shift is over 10 pixles, then it's a 'panning'.
* 2. if there are two touch points, then calc the tranform and trigger
* 'dualtouch'.
*
* @event
* @param {event} event
*/
function touchmoveHandler(event) {
for (var i = 0; i < event.changedTouches.length; i++) {
var touch = event.changedTouches[i];
var gesture = gestures[touch.identifier];
if (!gesture) {
return
}
if (!gesture.lastTouch) {
gesture.lastTouch = gesture.startTouch;
}
if (!gesture.lastTime) {
gesture.lastTime = gesture.startTime;
}
if (!gesture.velocityX) {
gesture.velocityX = 0;
}
if (!gesture.velocityY) {
gesture.velocityY = 0;
}
if (!gesture.duration) {
gesture.duration = 0;
}
var time = Date.now() - gesture.lastTime;
var vx = (touch.clientX - gesture.lastTouch.clientX) / time;
var vy = (touch.clientY - gesture.lastTouch.clientY) / time;
var RECORD_DURATION = 70;
if (time > RECORD_DURATION) {
time = RECORD_DURATION;
}
if (gesture.duration + time > RECORD_DURATION) {
gesture.duration = RECORD_DURATION - time;
}
gesture.velocityX = (gesture.velocityX * gesture.duration + vx * time)
/ (gesture.duration + time);
gesture.velocityY = (gesture.velocityY * gesture.duration + vy * time)
/ (gesture.duration + time);
gesture.duration += time;
gesture.lastTouch = {};
for (var p in touch) {
gesture.lastTouch[p] = touch[p];
}
gesture.lastTime = Date.now();
var displacementX = touch.clientX - gesture.startTouch.clientX;
var displacementY = touch.clientY - gesture.startTouch.clientY;
var distance = Math.sqrt(Math.pow(displacementX, 2)
+ Math.pow(displacementY, 2));
var isVertical = !(Math.abs(displacementX) > Math.abs(displacementY));
var direction = isVertical
? displacementY >= 0 ? 'down' : 'up'
: displacementX >= 0 ? 'right' : 'left';
// magic number 10: moving 10px means pan, not tap
if ((gesture.status === 'tapping' || gesture.status === 'pressing')
&& distance > 10) {
gesture.status = 'panning';
gesture.isVertical = isVertical;
gesture.direction = direction;
fireEvent(gesture.element, 'panstart', {
touch: touch,
touches: event.touches,
changedTouches: event.changedTouches,
touchEvent: event,
isVertical: gesture.isVertical,
direction: direction
});
}
if (gesture.status === 'panning') {
gesture.panTime = Date.now();
fireEvent(gesture.element, 'panmove', {
displacementX: displacementX,
displacementY: displacementY,
touch: touch,
touches: event.touches,
changedTouches: event.changedTouches,
touchEvent: event,
isVertical: gesture.isVertical,
direction: direction
});
}
}
if (Object.keys(gestures).length == 2) {
var position = [];
var current = [];
var elements = [];
var transform;
for (var i = 0; i < event.touches.length; i++) {
var touch = event.touches[i];
var gesture = gestures[touch.identifier];
position.push([gesture.startTouch.clientX, gesture.startTouch.clientY]);
current.push([touch.clientX, touch.clientY]);
}
for (var p in gestures) {
elements.push(gestures[p].element);
}
transform = calc(
position[0][0],
position[0][1],
position[1][0],
position[1][1],
current[0][0],
current[0][1],
current[1][0],
current[1][1]
);
fireEvent(getCommonAncestor(elements[0], elements[1]), 'dualtouch', {
transform: transform,
touches: event.touches,
touchEvent: event
});
}
}
/**
* handle touchend event
*
* 1. if there are tow touch points, then trigger 'dualtouchend'如
*
* 2. traverse every touch piont:
* > if tapping, then trigger 'tap'.
* If there is a tap 300 milliseconds before, then it's a 'doubletap'.
* > if padding, then decide to trigger 'panend' or 'swipe'
* > if pressing, then trigger 'pressend'.
*
* 3. remove listeners.
*
* @event
* @param {event} event
*/
function touchendHandler(event) {
if (Object.keys(gestures).length == 2) {
var elements = [];
for (var p in gestures) {
elements.push(gestures[p].element);
}
fireEvent(getCommonAncestor(elements[0], elements[1]), 'dualtouchend', {
touches: slice.call(event.touches),
touchEvent: event
});
}
for (var i = 0; i < event.changedTouches.length; i++) {
var touch = event.changedTouches[i];
var id = touch.identifier;
var gesture = gestures[id];
if (!gesture) {
continue
}
if (gesture.pressingHandler) {
clearTimeout(gesture.pressingHandler);
gesture.pressingHandler = null;
}
if (gesture.status === 'tapping') {
gesture.timestamp = Date.now();
// fire click, not tap.
fireEvent(gesture.element, 'tap', {
touch: touch,
touchEvent: event
});
if (lastTap && gesture.timestamp - lastTap.timestamp < 300) {
fireEvent(gesture.element, 'doubletap', {
touch: touch,
touchEvent: event
});
}
lastTap = gesture;
}
if (gesture.status === 'panning') {
var now = Date.now();
var duration = now - gesture.startTime;
var displacementX = touch.clientX - gesture.startTouch.clientX;
var displacementY = touch.clientY - gesture.startTouch.clientY;
var velocity = Math.sqrt(gesture.velocityY * gesture.velocityY
+ gesture.velocityX * gesture.velocityX);
var isSwipe = velocity > 0.5 && (now - gesture.lastTime) < 100;
var extra = {
duration: duration,
isSwipe: isSwipe,
velocityX: gesture.velocityX,
velocityY: gesture.velocityY,
displacementX: displacementX,
displacementY: displacementY,
touch: touch,
touches: event.touches,
changedTouches: event.changedTouches,
touchEvent: event,
isVertical: gesture.isVertical,
direction: gesture.direction
};
fireEvent(gesture.element, 'panend', extra);
if (isSwipe) {
fireEvent(gesture.element, 'swipe', extra);
}
}
if (gesture.status === 'pressing') {
fireEvent(gesture.element, 'pressend', {
touch: touch,
touchEvent: event
});
}
delete gestures[id];
}
if (Object.keys(gestures).length === 0) {
docEl.removeEventListener('touchmove', touchmoveHandler, false);
docEl.removeEventListener('touchend', touchendHandler, false);
docEl.removeEventListener('touchcancel', touchcancelHandler, false);
}
}
/**
* handle touchcancel
*
* 1. if there are two touch points, then trigger 'dualtouchend'
*
* 2. traverse everty touch point:
* > if pannnig, then trigger 'panend'
* > if pressing, then trigger 'pressend'
*
* 3. remove listeners
*
* @event
* @param {event} event
*/
function touchcancelHandler(event) {
if (Object.keys(gestures).length == 2) {
var elements = [];
for (var p in gestures) {
elements.push(gestures[p].element);
}
fireEvent(getCommonAncestor(elements[0], elements[1]), 'dualtouchend', {
touches: slice.call(event.touches),
touchEvent: event
});
}
for (var i = 0; i < event.changedTouches.length; i++) {
var touch = event.changedTouches[i];
var id = touch.identifier;
var gesture = gestures[id];
if (!gesture) {
continue
}
if (gesture.pressingHandler) {
clearTimeout(gesture.pressingHandler);
gesture.pressingHandler = null;
}
if (gesture.status === 'panning') {
fireEvent(gesture.element, 'panend', {
touch: touch,
touches: event.touches,
changedTouches: event.changedTouches,
touchEvent: event
});
}
if (gesture.status === 'pressing') {
fireEvent(gesture.element, 'pressend', {
touch: touch,
touchEvent: event
});
}
delete gestures[id];
}
if (Object.keys(gestures).length === 0) {
docEl.removeEventListener('touchmove', touchmoveHandler, false);
docEl.removeEventListener('touchend', touchendHandler, false);
docEl.removeEventListener('touchcancel', touchcancelHandler, false);
}
}
if (!isInitialized) {
docEl.addEventListener('touchstart', touchstartHandler, false);
isInitialized = true;
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* eslint-disable */
// Production steps of ECMA-262, Edition 6, 22.1.2.1
// Reference: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.from
/* istanbul ignore if */
if (!Array.from) {
Array.from = (function() {
var toStr = Object.prototype.toString;
var isCallable = function(fn) {
return typeof fn === 'function' || toStr.call(fn) === '[object Function]';
};
var toInteger = function(value) {
var number = Number(value);
if (isNaN(number)) {
return 0;
}
if (number === 0 || !isFinite(number)) {
return number;
}
return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
};
var maxSafeInteger = Math.pow(2, 53) - 1;
var toLength = function(value) {
var len = toInteger(value);
return Math.min(Math.max(len, 0), maxSafeInteger);
};
// The length property of the from method is 1.
return function from(arrayLike/*, mapFn, thisArg */) {
// 1. Let C be the this value.
var C = this;
// 2. Let items be ToObject(arrayLike).
var items = Object(arrayLike);
// 3. ReturnIfAbrupt(items).
if (arrayLike == null) {
throw new TypeError('Array.from requires an array-like object - not null or undefined');
}
// 4. If mapfn is undefined, then let mapping be false.
var mapFn = arguments.length > 1 ? arguments[1] : void undefined;
var T;
if (typeof mapFn !== 'undefined') {
// 5. else
// 5. a If IsCallable(mapfn) is false, throw a TypeError exception.
if (!isCallable(mapFn)) {
throw new TypeError('Array.from: when provided, the second argument must be a function');
}
// 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.
if (arguments.length > 2) {
T = arguments[2];
}
}
// 10. Let lenValue be Get(items, "length").
// 11. Let len be ToLength(lenValue).
var len = toLength(items.length);
// 13. If IsConstructor(C) is true, then
// 13. a. Let A be the result of calling the [[Construct]] internal method of C with an argument list containing the single item len.
// 14. a. Else, Let A be ArrayCreate(len).
var A = isCallable(C) ? Object(new C(len)) : new Array(len);
// 16. Let k be 0.
var k = 0;
// 17. Repeat, while k < len… (also steps a - h)
var kValue;
while (k < len) {
kValue = items[k];
if (mapFn) {
A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);
} else {
A[k] = kValue;
}
k += 1;
}
// 18. Let putStatus be Put(A, "length", len, true).
A.length = len;
// 20. Return A.
return A;
};
}());
}
function unwrapExports (x) {
return x && x.__esModule ? x['default'] : x;
}
function createCommonjsModule(fn, module) {
return module = { exports: {} }, fn(module, module.exports), module.exports;
}
var _global = createCommonjsModule(function (module) {
// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
var global = module.exports = typeof window != 'undefined' && window.Math == Math
? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();
if(typeof __g == 'number'){ __g = global; } // eslint-disable-line no-undef
});
var _core = createCommonjsModule(function (module) {
var core = module.exports = {version: '2.4.0'};
if(typeof __e == 'number'){ __e = core; } // eslint-disable-line no-undef
});
var _isObject = function(it){
return typeof it === 'object' ? it !== null : typeof it === 'function';
};
var isObject = _isObject;
var _anObject = function(it){
if(!isObject(it)){ throw TypeError(it + ' is not an object!'); }
return it;
};
var _fails = function(exec){
try {
return !!exec();
} catch(e){
return true;
}
};
// Thank's IE8 for his funny defineProperty
var _descriptors = !_fails(function(){
return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7;
});
var isObject$1 = _isObject;
var document$1 = _global.document;
var is = isObject$1(document$1) && isObject$1(document$1.createElement);
var _domCreate = function(it){
return is ? document$1.createElement(it) : {};
};
var _ie8DomDefine = !_descriptors && !_fails(function(){
return Object.defineProperty(_domCreate('div'), 'a', {get: function(){ return 7; }}).a != 7;
});
// 7.1.1 ToPrimitive(input [, PreferredType])
var isObject$2 = _isObject;
// instead of the ES6 spec version, we didn't implement @@toPrimitive case
// and the second argument - flag - preferred type is a string
var _toPrimitive = function(it, S){
if(!isObject$2(it)){ return it; }
var fn, val;
if(S && typeof (fn = it.toString) == 'function' && !isObject$2(val = fn.call(it))){ return val; }
if(typeof (fn = it.valueOf) == 'function' && !isObject$2(val = fn.call(it))){ return val; }
if(!S && typeof (fn = it.toString) == 'function' && !isObject$2(val = fn.call(it))){ return val; }
throw TypeError("Can't convert object to primitive value");
};
var anObject = _anObject;
var IE8_DOM_DEFINE = _ie8DomDefine;
var toPrimitive = _toPrimitive;
var dP$1 = Object.defineProperty;
var f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes){
anObject(O);
P = toPrimitive(P, true);
anObject(Attributes);
if(IE8_DOM_DEFINE){ try {
return dP$1(O, P, Attributes);
} catch(e){ /* empty */ } }
if('get' in Attributes || 'set' in Attributes){ throw TypeError('Accessors not supported!'); }
if('value' in Attributes){ O[P] = Attributes.value; }
return O;
};
var _objectDp = {
f: f
};
var _propertyDesc = function(bitmap, value){
return {
enumerable : !(bitmap & 1),
configurable: !(bitmap & 2),
writable : !(bitmap & 4),
value : value
};
};
var dP = _objectDp;
var createDesc = _propertyDesc;
var _hide = _descriptors ? function(object, key, value){
return dP.f(object, key, createDesc(1, value));
} : function(object, key, value){
object[key] = value;
return object;
};
var hasOwnProperty = {}.hasOwnProperty;
var _has = function(it, key){
return hasOwnProperty.call(it, key);
};
var id = 0;
var px = Math.random();
var _uid = function(key){
return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
};
var _redefine = createCommonjsModule(function (module) {
var global = _global
, hide = _hide
, has = _has
, SRC = _uid('src')
, TO_STRING = 'toString'
, $toString = Function[TO_STRING]
, TPL = ('' + $toString).split(TO_STRING);
_core.inspectSource = function(it){
return $toString.call(it);
};
(module.exports = function(O, key, val, safe){
var isFunction = typeof val == 'function';
if(isFunction){ has(val, 'name') || hide(val, 'name', key); }
if(O[key] === val){ return; }
if(isFunction){ has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); }
if(O === global){
O[key] = val;
} else {
if(!safe){
delete O[key];
hide(O, key, val);
} else {
if(O[key]){ O[key] = val; }
else { hide(O, key, val); }
}
}
// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
})(Function.prototype, TO_STRING, function toString(){
return typeof this == 'function' && this[SRC] || $toString.call(this);
});
});
var _aFunction = function(it){
if(typeof it != 'function'){ throw TypeError(it + ' is not a function!'); }
return it;
};
// optional / simple context binding
var aFunction = _aFunction;
var _ctx = function(fn, that, length){
aFunction(fn);
if(that === undefined){ return fn; }
switch(length){
case 1: return function(a){
return fn.call(that, a);
};
case 2: return function(a, b){
return fn.call(that, a, b);
};
case 3: return function(a, b, c){
return fn.call(that, a, b, c);
};
}
return function(/* ...args */){
return fn.apply(that, arguments);
};
};
var global$1 = _global;
var core = _core;
var hide = _hide;
var redefine = _redefine;
var ctx = _ctx;
var PROTOTYPE = 'prototype';
var $export$1 = function(type, name, source){
var IS_FORCED = type & $export$1.F
, IS_GLOBAL = type & $export$1.G
, IS_STATIC = type & $export$1.S
, IS_PROTO = type & $export$1.P
, IS_BIND = type & $export$1.B
, target = IS_GLOBAL ? global$1 : IS_STATIC ? global$1[name] || (global$1[name] = {}) : (global$1[name] || {})[PROTOTYPE]
, exports = IS_GLOBAL ? core : core[name] || (core[name] = {})
, expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {})
, key, own, out, exp;
if(IS_GLOBAL){ source = name; }
for(key in source){
// contains in native
own = !IS_FORCED && target && target[key] !== undefined;
// export native or passed
out = (own ? target : source)[key];
// bind timers to global for call from export context
exp = IS_BIND && own ? ctx(out, global$1) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
// extend global
if(target){ redefine(target, key, out, type & $export$1.U); }
// export
if(exports[key] != out){ hide(exports, key, exp); }
if(IS_PROTO && expProto[key] != out){ expProto[key] = out; }
}
};
global$1.core = core;
// type bitmap
$export$1.F = 1; // forced
$export$1.G = 2; // global
$export$1.S = 4; // static
$export$1.P = 8; // proto
$export$1.B = 16; // bind
$export$1.W = 32; // wrap
$export$1.U = 64; // safe
$export$1.R = 128; // real proto method for `library`
var _export = $export$1;
var toString$1 = {}.toString;
var _cof = function(it){
return toString$1.call(it).slice(8, -1);
};
// fallback for non-array-like ES3 and non-enumerable old V8 strings
var cof = _cof;
var _iobject = Object('z').propertyIsEnumerable(0) ? Object : function(it){
return cof(it) == 'String' ? it.split('') : Object(it);
};
// 7.2.1 RequireObjectCoercible(argument)
var _defined = function(it){
if(it == undefined){ throw TypeError("Can't call method on " + it); }
return it;
};
// to indexed object, toObject with fallback for non-array-like ES3 strings
var IObject$1 = _iobject;
var defined = _defined;
var _toIobject = function(it){
return IObject$1(defined(it));
};
// 7.1.4 ToInteger
var ceil = Math.ceil;
var floor = Math.floor;
var _toInteger = function(it){
return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
};
// 7.1.15 ToLength
var toInteger = _toInteger;
var min = Math.min;
var _toLength = function(it){
return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
};
var toInteger$1 = _toInteger;
var max = Math.max;
var min$1 = Math.min;
var _toIndex = function(index, length){
index = toInteger$1(index);
return index < 0 ? max(index + length, 0) : min$1(index, length);
};
// false -> Array#indexOf
// true -> Array#includes
var toIObject$1 = _toIobject;
var toLength = _toLength;
var toIndex = _toIndex;
var _arrayIncludes = function(IS_INCLUDES){
return function($this, el, fromIndex){
var O = toIObject$1($this)
, length = toLength(O.length)
, index = toIndex(fromIndex, length)
, value;
// Array#includes uses SameValueZero equality algorithm
if(IS_INCLUDES && el != el){ while(length > index){
value = O[index++];
if(value != value){ return true; }
// Array#toIndex ignores holes, Array#includes - not
} } else { for(;length > index; index++){ if(IS_INCLUDES || index in O){
if(O[index] === el){ return IS_INCLUDES || index || 0; }
} } } return !IS_INCLUDES && -1;
};
};
var global$2 = _global;
var SHARED = '__core-js_shared__';
var store = global$2[SHARED] || (global$2[SHARED] = {});
var _shared = function(key){
return store[key] || (store[key] = {});
};
var shared = _shared('keys');
var uid = _uid;
var _sharedKey = function(key){
return shared[key] || (shared[key] = uid(key));
};
var has = _has;
var toIObject = _toIobject;
var arrayIndexOf = _arrayIncludes(false);
var IE_PROTO = _sharedKey('IE_PROTO');
var _objectKeysInternal = function(object, names){
var O = toIObject(object)
, i = 0
, result = []
, key;
for(key in O){ if(key != IE_PROTO){ has(O, key) && result.push(key); } }
// Don't enum bug & hidden keys
while(names.length > i){ if(has(O, key = names[i++])){
~arrayIndexOf(result, key) || result.push(key);
} }
return result;
};
// IE 8- don't enum bug keys
var _enumBugKeys = (
'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
).split(',');
// 19.1.2.14 / 15.2.3.14 Object.keys(O)
var $keys = _objectKeysInternal;
var enumBugKeys = _enumBugKeys;
var _objectKeys = Object.keys || function keys(O){
return $keys(O, enumBugKeys);
};
var f$1 = Object.getOwnPropertySymbols;
var _objectGops = {
f: f$1
};
var f$2 = {}.propertyIsEnumerable;
var _objectPie = {
f: f$2
};
// 7.1.13 ToObject(argument)
var defined$1 = _defined;
var _toObject = function(it){
return Object(defined$1(it));
};
// 19.1.2.1 Object.assign(target, source, ...)
var getKeys = _objectKeys;
var gOPS = _objectGops;
var pIE = _objectPie;
var toObject = _toObject;
var IObject = _iobject;
var $assign = Object.assign;
// should work with symbols and should have deterministic property order (V8 bug)
var _objectAssign = !$assign || _fails(function(){
var A = {}
, B = {}
, S = Symbol()
, K = 'abcdefghijklmnopqrst';
A[S] = 7;
K.split('').forEach(function(k){ B[k] = k; });
return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
}) ? function assign(target, source){
var arguments$1 = arguments;
// eslint-disable-line no-unused-vars
var T = toObject(target)
, aLen = arguments.length
, index = 1
, getSymbols = gOPS.f
, isEnum = pIE.f;
while(aLen > index){
var S = IObject(arguments$1[index++])
, keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S)
, length = keys.length
, j = 0
, key;
while(length > j){ if(isEnum.call(S, key = keys[j++])){ T[key] = S[key]; } }
} return T;
} : $assign;
// 19.1.3.1 Object.assign(target, source)
var $export = _export;
$export($export.S + $export.F, 'Object', {assign: _objectAssign});
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* eslint-disable */
// https://gist.github.com/WebReflection/5593554
/* istanbul ignore if */
if (!Object.setPrototypeOf) {
Object.setPrototypeOf = (function(Object, magic) {
var set;
function setPrototypeOf(O, proto) {
set.call(O, proto);
return O;
}
try {
// this works already in Firefox and Safari
set = Object.getOwnPropertyDescriptor(Object.prototype, magic).set;
set.call({}, null);
} catch (e) {
if (
// IE < 11 cannot be shimmed
Object.prototype !== {}[magic] ||
// neither can any browser that actually
// implemented __proto__ correctly
// (all but old V8 will return here)
{__proto__: null}.__proto__ === void 0
// this case means null objects cannot be passed
// through setPrototypeOf in a reliable way
// which means here a **Sham** is needed instead
) {
return;
}
// nodejs 0.8 and 0.10 are (buggy and..) fine here
// probably Chrome or some old Mobile stock browser
set = function(proto) {
this[magic] = proto;
};
// please note that this will **not** work
// in those browsers that do not inherit
// __proto__ by mistake from Object.prototype
// in these cases we should probably throw an error
// or at least be informed about the issue
setPrototypeOf.polyfill = setPrototypeOf(
setPrototypeOf({}, null),
Object.prototype
) instanceof Object;
// setPrototypeOf.polyfill === true means it works as meant
// setPrototypeOf.polyfill === false means it's not 100% reliable
// setPrototypeOf.polyfill === undefined
// or
// setPrototypeOf.polyfill == null means it's not a polyfill
// which means it works as expected
// we can even delete Object.prototype.__proto__;
}
return setPrototypeOf;
}(Object, '__proto__'));
}
var _wks = createCommonjsModule(function (module) {
var store = _shared('wks')
, uid = _uid
, Symbol = _global.Symbol
, USE_SYMBOL = typeof Symbol == 'function';
var $exports = module.exports = function(name){
return store[name] || (store[name] =
USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
};
$exports.store = store;
});
// getting tag from 19.1.3.6 Object.prototype.toString()
var cof$1 = _cof;
var TAG = _wks('toStringTag');
var ARG = cof$1(function(){ return arguments; }()) == 'Arguments';
// fallback for IE11 Script Access Denied error
var tryGet = function(it, key){
try {
return it[key];
} catch(e){ /* empty */ }
};
var _classof = function(it){
var O, T, B;
return it === undefined ? 'Undefined' : it === null ? 'Null'
// @@toStringTag case
: typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T
// builtinTag case
: ARG ? cof$1(O)
// ES3 arguments fallback
: (B = cof$1(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
};
// 19.1.3.6 Object.prototype.toString()
var classof = _classof;
var test = {};
test[_wks('toStringTag')] = 'z';
if(test + '' != '[object z]'){
_redefine(Object.prototype, 'toString', function toString(){
return '[object ' + classof(this) + ']';
}, true);
}
var toInteger$2 = _toInteger;
var defined$2 = _defined;
// true -> String#at
// false -> String#codePointAt
var _stringAt = function(TO_STRING){
return function(that, pos){
var s = String(defined$2(that))
, i = toInteger$2(pos)
, l = s.length
, a, b;
if(i < 0 || i >= l){ return TO_STRING ? '' : undefined; }
a = s.charCodeAt(i);
return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
? TO_STRING ? s.charAt(i) : a
: TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
};
};
var _library = false;
var _iterators = {};
var dP$2 = _objectDp;
var anObject$2 = _anObject;
var getKeys$1 = _objectKeys;
var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties){
anObject$2(O);
var keys = getKeys$1(Properties)
, length = keys.length
, i = 0
, P;
while(length > i){ dP$2.f(O, P = keys[i++], Properties[P]); }
return O;
};
var _html = _global.document && document.documentElement;
// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
var anObject$1 = _anObject;
var dPs = _objectDps;
var enumBugKeys$1 = _enumBugKeys;
var IE_PROTO$1 = _sharedKey('IE_PROTO');
var Empty = function(){ /* empty */ };
var PROTOTYPE$1 = 'prototype';
// Create object with fake `null` prototype: use iframe Object with cleared prototype
var createDict = function(){
// Thrash, waste and sodomy: IE GC bug
var iframe = _domCreate('iframe')
, i = enumBugKeys$1.length
, lt = '<'
, gt = '>'
, iframeDocument;
iframe.style.display = 'none';
_html.appendChild(iframe);
iframe.src = 'javascript:'; // eslint-disable-line no-script-url
// createDict = iframe.contentWindow.Object;
// html.removeChild(iframe);
iframeDocument = iframe.contentWindow.document;
iframeDocument.open();
iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
iframeDocument.close();
createDict = iframeDocument.F;
while(i--){ delete createDict[PROTOTYPE$1][enumBugKeys$1[i]]; }
return createDict();
};
var _objectCreate = Object.create || function create(O, Properties){
var result;
if(O !== null){
Empty[PROTOTYPE$1] = anObject$1(O);
result = new Empty;
Empty[PROTOTYPE$1] = null;
// add "__proto__" for Object.getPrototypeOf polyfill
result[IE_PROTO$1] = O;
} else { result = createDict(); }
return Properties === undefined ? result : dPs(result, Properties);
};
var def = _objectDp.f;
var has$2 = _has;
var TAG$1 = _wks('toStringTag');
var _setToStringTag = function(it, tag, stat){
if(it && !has$2(it = stat ? it : it.prototype, TAG$1)){ def(it, TAG$1, {configurable: true, value: tag}); }
};
var create$1 = _objectCreate;
var descriptor = _propertyDesc;
var setToStringTag$1 = _setToStringTag;
var IteratorPrototype = {};
// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
_hide(IteratorPrototype, _wks('iterator'), function(){ return this; });
var _iterCreate = function(Constructor, NAME, next){
Constructor.prototype = create$1(IteratorPrototype, {next: descriptor(1, next)});
setToStringTag$1(Constructor, NAME + ' Iterator');
};
// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
var has$3 = _has;
var toObject$1 = _toObject;
var IE_PROTO$2 = _sharedKey('IE_PROTO');
var ObjectProto = Object.prototype;
var _objectGpo = Object.getPrototypeOf || function(O){
O = toObject$1(O);
if(has$3(O, IE_PROTO$2)){ return O[IE_PROTO$2]; }
if(typeof O.constructor == 'function' && O instanceof O.constructor){
return O.constructor.prototype;
} return O instanceof Object ? ObjectProto : null;
};
var LIBRARY = _library;
var $export$2 = _export;
var redefine$1 = _redefine;
var hide$1 = _hide;
var has$1 = _has;
var Iterators = _iterators;
var $iterCreate = _iterCreate;
var setToStringTag = _setToStringTag;
var getPrototypeOf = _objectGpo;
var ITERATOR = _wks('iterator');
var BUGGY = !([].keys && 'next' in [].keys());
var FF_ITERATOR = '@@iterator';
var KEYS = 'keys';
var VALUES = 'values';
var returnThis = function(){ return this; };
var _iterDefine = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){
$iterCreate(Constructor, NAME, next);
var getMethod = function(kind){
if(!BUGGY && kind in proto){ return proto[kind]; }
switch(kind){
case KEYS: return function keys(){ return new Constructor(this, kind); };
case VALUES: return function values(){ return new Constructor(this, kind); };
} return function entries(){ return new Constructor(this, kind); };
};
var TAG = NAME + ' Iterator'
, DEF_VALUES = DEFAULT == VALUES
, VALUES_BUG = false
, proto = Base.prototype
, $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]
, $default = $native || getMethod(DEFAULT)
, $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined
, $anyNative = NAME == 'Array' ? proto.entries || $native : $native
, methods, key, IteratorPrototype;
// Fix native
if($anyNative){
IteratorPrototype = getPrototypeOf($anyNative.call(new Base));
if(IteratorPrototype !== Object.prototype){
// Set @@toStringTag to native iterators
setToStringTag(IteratorPrototype, TAG, true);
// fix for some old engines
if(!LIBRARY && !has$1(IteratorPrototype, ITERATOR)){ hide$1(IteratorPrototype, ITERATOR, returnThis); }
}
}
// fix Array#{values, @@iterator}.name in V8 / FF
if(DEF_VALUES && $native && $native.name !== VALUES){
VALUES_BUG = true;
$default = function values(){ return $native.call(this); };
}
// Define iterator
if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){
hide$1(proto, ITERATOR, $default);
}
// Plug for library
Iterators[NAME] = $default;
Iterators[TAG] = returnThis;
if(DEFAULT){
methods = {
values: DEF_VALUES ? $default : getMethod(VALUES),
keys: IS_SET ? $default : getMethod(KEYS),
entries: $entries
};
if(FORCED){ for(key in methods){
if(!(key in proto)){ redefine$1(proto, key, methods[key]); }
} } else { $export$2($export$2.P + $export$2.F * (BUGGY || VALUES_BUG), NAME, methods); }
}
return methods;
};
var $at = _stringAt(true);
// 21.1.3.27 String.prototype[@@iterator]()
_iterDefine(String, 'String', function(iterated){
this._t = String(iterated); // target
this._i = 0; // next index
// 21.1.5.2.1 %StringIteratorPrototype%.next()
}, function(){
var O = this._t
, index = this._i
, point;
if(index >= O.length){ return {value: undefined, done: true}; }
point = $at(O, index);
this._i += point.length;
return {value: point, done: false};
});
// 22.1.3.31 Array.prototype[@@unscopables]
var UNSCOPABLES = _wks('unscopables');
var ArrayProto = Array.prototype;
if(ArrayProto[UNSCOPABLES] == undefined){ _hide(ArrayProto, UNSCOPABLES, {}); }
var _addToUnscopables = function(key){
ArrayProto[UNSCOPABLES][key] = true;
};
var _iterStep = function(done, value){
return {value: value, done: !!done};
};
var addToUnscopables = _addToUnscopables;
var step = _iterStep;
var Iterators$2 = _iterators;
var toIObject$2 = _toIobject;
// 22.1.3.4 Array.prototype.entries()
// 22.1.3.13 Array.prototype.keys()
// 22.1.3.29 Array.prototype.values()
// 22.1.3.30 Array.prototype[@@iterator]()
var es6_array_iterator = _iterDefine(Array, 'Array', function(iterated, kind){
this._t = toIObject$2(iterated); // target
this._i = 0; // next index
this._k = kind; // kind
// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
}, function(){
var O = this._t
, kind = this._k
, index = this._i++;
if(!O || index >= O.length){
this._t = undefined;
return step(1);
}
if(kind == 'keys' ){ return step(0, index); }
if(kind == 'values'){ return step(0, O[index]); }
return step(0, [index, O[index]]);
}, 'values');
// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
Iterators$2.Arguments = Iterators$2.Array;
addToUnscopables('keys');
addToUnscopables('values');
addToUnscopables('entries');
var $iterators = es6_array_iterator;
var redefine$2 = _redefine;
var global$3 = _global;
var hide$2 = _hide;
var Iterators$1 = _iterators;
var wks = _wks;
var ITERATOR$1 = wks('iterator');
var TO_STRING_TAG = wks('toStringTag');
var ArrayValues = Iterators$1.Array;
for(var collections = ['NodeList', 'DOMTokenList', 'MediaList', 'StyleSheetList', 'CSSRuleList'], i = 0; i < 5; i++){
var NAME = collections[i]
, Collection = global$3[NAME]
, proto = Collection && Collection.prototype
, key;
if(proto){
if(!proto[ITERATOR$1]){ hide$2(proto, ITERATOR$1, ArrayValues); }
if(!proto[TO_STRING_TAG]){ hide$2(proto, TO_STRING_TAG, NAME); }
Iterators$1[NAME] = ArrayValues;
for(key in $iterators){ if(!proto[key]){ redefine$2(proto, key, $iterators[key], true); } }
}
}
var _anInstance = function(it, Constructor, name, forbiddenField){
if(!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)){
throw TypeError(name + ': incorrect invocation!');
} return it;
};
// call something on iterator step with safe closing on error
var anObject$3 = _anObject;
var _iterCall = function(iterator, fn, value, entries){
try {
return entries ? fn(anObject$3(value)[0], value[1]) : fn(value);
// 7.4.6 IteratorClose(iterator, completion)
} catch(e){
var ret = iterator['return'];
if(ret !== undefined){ anObject$3(ret.call(iterator)); }
throw e;
}
};
// check on default Array iterator
var Iterators$3 = _iterators;
var ITERATOR$2 = _wks('iterator');
var ArrayProto$1 = Array.prototype;
var _isArrayIter = function(it){
return it !== undefined && (Iterators$3.Array === it || ArrayProto$1[ITERATOR$2] === it);
};
var classof$2 = _classof;
var ITERATOR$3 = _wks('iterator');
var Iterators$4 = _iterators;
var core_getIteratorMethod = _core.getIteratorMethod = function(it){
if(it != undefined){ return it[ITERATOR$3]
|| it['@@iterator']
|| Iterators$4[classof$2(it)]; }
};
var _forOf = createCommonjsModule(function (module) {
var ctx = _ctx
, call = _iterCall
, isArrayIter = _isArrayIter
, anObject = _anObject
, toLength = _toLength
, getIterFn = core_getIteratorMethod
, BREAK = {}
, RETURN = {};
var exports = module.exports = function(iterable, entries, fn, that, ITERATOR){
var iterFn = ITERATOR ? function(){ return iterable; } : getIterFn(iterable)
, f = ctx(fn, that, entries ? 2 : 1)
, index = 0
, length, step, iterator, result;
if(typeof iterFn != 'function'){ throw TypeError(iterable + ' is not iterable!'); }
// fast case for arrays with default iterator
if(isArrayIter(iterFn)){ for(length = toLength(iterable.length); length > index; index++){
result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
if(result === BREAK || result === RETURN){ return result; }
} } else { for(iterator = iterFn.call(iterable); !(step = iterator.next()).done; ){
result = call(iterator, f, step.value, entries);
if(result === BREAK || result === RETURN){ return result; }
} }
};
exports.BREAK = BREAK;
exports.RETURN = RETURN;
});
// 7.3.20 SpeciesConstructor(O, defaultConstructor)
var anObject$4 = _anObject;
var aFunction$2 = _aFunction;
var SPECIES = _wks('species');
var _speciesConstructor = function(O, D){
var C = anObject$4(O).constructor, S;
return C === undefined || (S = anObject$4(C)[SPECIES]) == undefined ? D : aFunction$2(S);
};
// fast apply, http://jsperf.lnkit.com/fast-apply/5
var _invoke = function(fn, args, that){
var un = that === undefined;
switch(args.length){
case 0: return un ? fn()
: fn.call(that);
case 1: return un ? fn(args[0])
: fn.call(that, args[0]);
case 2: return un ? fn(args[0], args[1])
: fn.call(that, args[0], args[1]);
case 3: return un ? fn(args[0], args[1], args[2])
: fn.call(that, args[0], args[1], args[2]);
case 4: return un ? fn(args[0], args[1], args[2], args[3])
: fn.call(that, args[0], args[1], args[2], args[3]);
} return fn.apply(that, args);
};
var ctx$2 = _ctx;
var invoke = _invoke;
var html = _html;
var cel = _domCreate;
var global$5 = _global;
var process$1 = global$5.process;
var setTask = global$5.setImmediate;
var clearTask = global$5.clearImmediate;
var MessageChannel = global$5.MessageChannel;
var counter = 0;
var queue = {};
var ONREADYSTATECHANGE = 'onreadystatechange';
var defer;
var channel;
var port;
var run = function(){
var id = +this;
if(queue.hasOwnProperty(id)){
var fn = queue[id];
delete queue[id];
fn();
}
};
var listener = function(event){
run.call(event.data);
};
// Node.js 0.9+ & IE10+ has setImmediate, otherwise:
if(!setTask || !clearTask){
setTask = function setImmediate(fn){
var arguments$1 = arguments;
var args = [], i = 1;
while(arguments.length > i){ args.push(arguments$1[i++]); }
queue[++counter] = function(){
invoke(typeof fn == 'function' ? fn : Function(fn), args);
};
defer(counter);
return counter;
};
clearTask = function clearImmediate(id){
delete queue[id];
};
// Node.js 0.8-
if(_cof(process$1) == 'process'){
defer = function(id){
process$1.nextTick(ctx$2(run, id, 1));
};
// Browsers with MessageChannel, includes WebWorkers
} else if(MessageChannel){
channel = new MessageChannel;
port = channel.port2;
channel.port1.onmessage = listener;
defer = ctx$2(port.postMessage, port, 1);
// Browsers with postMessage, skip WebWorkers
// IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
} else if(global$5.addEventListener && typeof postMessage == 'function' && !global$5.importScripts){
defer = function(id){
global$5.postMessage(id + '', '*');
};
global$5.addEventListener('message', listener, false);
// IE8-
} else if(ONREADYSTATECHANGE in cel('script')){
defer = function(id){
html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function(){
html.removeChild(this);
run.call(id);
};
};
// Rest old browsers
} else {
defer = function(id){
setTimeout(ctx$2(run, id, 1), 0);
};
}
}
var _task = {
set: setTask,
clear: clearTask
};
var global$6 = _global;
var macrotask = _task.set;
var Observer = global$6.MutationObserver || global$6.WebKitMutationObserver;
var process$2 = global$6.process;
var Promise$1 = global$6.Promise;
var isNode$1 = _cof(process$2) == 'process';
var _microtask = function(){
var head, last, notify;
var flush = function(){
var parent, fn;
if(isNode$1 && (parent = process$2.domain)){ parent.exit(); }
while(head){
fn = head.fn;
head = head.next;
try {
fn();
} catch(e){
if(head){ notify(); }
else { last = undefined; }
throw e;
}
} last = undefined;
if(parent){ parent.enter(); }
};
// Node.js
if(isNode$1){
notify = function(){
process$2.nextTick(flush);
};
// browsers with MutationObserver
} else if(Observer){
var toggle = true
, node = document.createTextNode('');
new Observer(flush).observe(node, {characterData: true}); // eslint-disable-line no-new
notify = function(){
node.data = toggle = !toggle;
};
// environments with maybe non-completely correct, but existent Promise
} else if(Promise$1 && Promise$1.resolve){
var promise = Promise$1.resolve();
notify = function(){
promise.then(flush);
};
// for other environments - macrotask based on:
// - setImmediate
// - MessageChannel
// - window.postMessag
// - onreadystatechange
// - setTimeout
} else {
notify = function(){
// strange IE + webpack dev server bug - use .call(global)
macrotask.call(global$6, flush);
};
}
return function(fn){
var task = {fn: fn, next: undefined};
if(last){ last.next = task; }
if(!head){
head = task;
notify();
} last = task;
};
};
var redefine$3 = _redefine;
var _redefineAll = function(target, src, safe){
for(var key in src){ redefine$3(target, key, src[key], safe); }
return target;
};
var global$7 = _global;
var dP$3 = _objectDp;
var DESCRIPTORS = _descriptors;
var SPECIES$1 = _wks('species');
var _setSpecies = function(KEY){
var C = global$7[KEY];
if(DESCRIPTORS && C && !C[SPECIES$1]){ dP$3.f(C, SPECIES$1, {
configurable: true,
get: function(){ return this; }
}); }
};
var ITERATOR$4 = _wks('iterator');
var SAFE_CLOSING = false;
try {
var riter = [7][ITERATOR$4]();
riter['return'] = function(){ SAFE_CLOSING = true; };
Array.from(riter, function(){ throw 2; });
} catch(e){ /* empty */ }
var _iterDetect = function(exec, skipClosing){
if(!skipClosing && !SAFE_CLOSING){ return false; }
var safe = false;
try {
var arr = [7]
, iter = arr[ITERATOR$4]();
iter.next = function(){ return {done: safe = true}; };
arr[ITERATOR$4] = function(){ return iter; };
exec(arr);
} catch(e){ /* empty */ }
return safe;
};
var LIBRARY$1 = _library;
var global$4 = _global;
var ctx$1 = _ctx;
var classof$1 = _classof;
var $export$3 = _export;
var isObject$3 = _isObject;
var aFunction$1 = _aFunction;
var anInstance = _anInstance;
var forOf = _forOf;
var speciesConstructor = _speciesConstructor;
var task = _task.set;
var microtask = _microtask();
var PROMISE = 'Promise';
var TypeError$1 = global$4.TypeError;
var process = global$4.process;
var $Promise = global$4[PROMISE];
var process = global$4.process;
var isNode = classof$1(process) == 'process';
var empty = function(){ /* empty */ };
var Internal;
var GenericPromiseCapability;
var Wrapper;
var USE_NATIVE = !!function(){
try {
// correct subclassing with @@species support
var promise = $Promise.resolve(1)
, FakePromise = (promise.constructor = {})[_wks('species')] = function(exec){ exec(empty, empty); };
// unhandled rejections tracking support, NodeJS Promise without it fails @@species test
return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;
} catch(e){ /* empty */ }
}();
// helpers
var sameConstructor = function(a, b){
// with library wrapper special case
return a === b || a === $Promise && b === Wrapper;
};
var isThenable = function(it){
var then;
return isObject$3(it) && typeof (then = it.then) == 'function' ? then : false;
};
var newPromiseCapability = function(C){
return sameConstructor($Promise, C)
? new PromiseCapability(C)
: new GenericPromiseCapability(C);
};
var PromiseCapability = GenericPromiseCapability = function(C){
var resolve, reject;
this.promise = new C(function($$resolve, $$reject){
if(resolve !== undefined || reject !== undefined){ throw TypeError$1('Bad Promise constructor'); }
resolve = $$resolve;
reject = $$reject;
});
this.resolve = aFunction$1(resolve);
this.reject = aFunction$1(reject);
};
var perform = function(exec){
try {
exec();
} catch(e){
return {error: e};
}
};
var notify = function(promise, isReject){
if(promise._n){ return; }
promise._n = true;
var chain = promise._c;
microtask(function(){
var value = promise._v
, ok = promise._s == 1
, i = 0;
var run = function(reaction){
var handler = ok ? reaction.ok : reaction.fail
, resolve = reaction.resolve
, reject = reaction.reject
, domain = reaction.domain
, result, then;
try {
if(handler){
if(!ok){
if(promise._h == 2){ onHandleUnhandled(promise); }
promise._h = 1;
}
if(handler === true){ result = value; }
else {
if(domain){ domain.enter(); }
result = handler(value);
if(domain){ domain.exit(); }
}
if(result === reaction.promise){
reject(TypeError$1('Promise-chain cycle'));
} else if(then = isThenable(result)){
then.call(result, resolve, reject);
} else { resolve(result); }
} else { reject(value); }
} catch(e){
reject(e);
}
};
while(chain.length > i){ run(chain[i++]); } // variable length - can't use forEach
promise._c = [];
promise._n = false;
if(isReject && !promise._h){ onUnhandled(promise); }
});
};
var onUnhandled = function(promise){
task.call(global$4, function(){
var value = promise._v
, abrupt, handler, console;
if(isUnhandled(promise)){
abrupt = perform(function(){
if(isNode){
process.emit('unhandledRejection', value, promise);
} else if(handler = global$4.onunhandledrejection){
handler({promise: promise, reason: value});
} else if((console = global$4.console) && console.error){
console.error('Unhandled promise rejection', value);
}
});
// Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
promise._h = isNode || isUnhandled(promise) ? 2 : 1;
} promise._a = undefined;
if(abrupt){ throw abrupt.error; }
});
};
var isUnhandled = function(promise){
if(promise._h == 1){ return false; }
var chain = promise._a || promise._c
, i = 0
, reaction;
while(chain.length > i){
reaction = chain[i++];
if(reaction.fail || !isUnhandled(reaction.promise)){ return false; }
} return true;
};
var onHandleUnhandled = function(promise){
task.call(global$4, function(){
var handler;
if(isNode){
process.emit('rejectionHandled', promise);
} else if(handler = global$4.onrejectionhandled){
handler({promise: promise, reason: promise._v});
}
});
};
var $reject = function(value){
var promise = this;
if(promise._d){ return; }
promise._d = true;
promise = promise._w || promise; // unwrap
promise._v = value;
promise._s = 2;
if(!promise._a){ promise._a = promise._c.slice(); }
notify(promise, true);
};
var $resolve = function(value){
var promise = this
, then;
if(promise._d){ return; }
promise._d = true;
promise = promise._w || promise; // unwrap
try {
if(promise === value){ throw TypeError$1("Promise can't be resolved itself"); }
if(then = isThenable(value)){
microtask(function(){
var wrapper = {_w: promise, _d: false}; // wrap
try {
then.call(value, ctx$1($resolve, wrapper, 1), ctx$1($reject, wrapper, 1));
} catch(e){
$reject.call(wrapper, e);
}
});
} else {
promise._v = value;
promise._s = 1;
notify(promise, false);
}
} catch(e){
$reject.call({_w: promise, _d: false}, e); // wrap
}
};
// constructor polyfill
if(!USE_NATIVE){
// 25.4.3.1 Promise(executor)
$Promise = function Promise(executor){
anInstance(this, $Promise, PROMISE, '_h');
aFunction$1(executor);
Internal.call(this);
try {
executor(ctx$1($resolve, this, 1), ctx$1($reject, this, 1));
} catch(err){
$reject.call(this, err);
}
};
Internal = function Promise(executor){
this._c = []; // <- awaiting reactions
this._a = undefined; // <- checked in isUnhandled reactions
this._s = 0; // <- state
this._d = false; // <- done
this._v = undefined; // <- value
this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled
this._n = false; // <- notify
};
Internal.prototype = _redefineAll($Promise.prototype, {
// 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)
then: function then(onFulfilled, onRejected){
var reaction = newPromiseCapability(speciesConstructor(this, $Promise));
reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
reaction.fail = typeof onRejected == 'function' && onRejected;
reaction.domain = isNode ? process.domain : undefined;
this._c.push(reaction);
if(this._a){ this._a.push(reaction); }
if(this._s){ notify(this, false); }
return reaction.promise;
},
// 25.4.5.1 Promise.prototype.catch(onRejected)
'catch': function(onRejected){
return this.then(undefined, onRejected);
}
});
PromiseCapability = function(){
var promise = new Internal;
this.promise = promise;
this.resolve = ctx$1($resolve, promise, 1);
this.reject = ctx$1($reject, promise, 1);
};
}
$export$3($export$3.G + $export$3.W + $export$3.F * !USE_NATIVE, {Promise: $Promise});
_setToStringTag($Promise, PROMISE);
_setSpecies(PROMISE);
Wrapper = _core[PROMISE];
// statics
$export$3($export$3.S + $export$3.F * !USE_NATIVE, PROMISE, {
// 25.4.4.5 Promise.reject(r)
reject: function reject(r){
var capability = newPromiseCapability(this)
, $$reject = capability.reject;
$$reject(r);
return capability.promise;
}
});
$export$3($export$3.S + $export$3.F * (LIBRARY$1 || !USE_NATIVE), PROMISE, {
// 25.4.4.6 Promise.resolve(x)
resolve: function resolve(x){
// instanceof instead of internal slot check because we should fix it without replacement native Promise core
if(x instanceof $Promise && sameConstructor(x.constructor, this)){ return x; }
var capability = newPromiseCapability(this)
, $$resolve = capability.resolve;
$$resolve(x);
return capability.promise;
}
});
$export$3($export$3.S + $export$3.F * !(USE_NATIVE && _iterDetect(function(iter){
$Promise.all(iter)['catch'](empty);
})), PROMISE, {
// 25.4.4.1 Promise.all(iterable)
all: function all(iterable){
var C = this
, capability = newPromiseCapability(C)
, resolve = capability.resolve
, reject = capability.reject;
var abrupt = perform(function(){
var values = []
, index = 0
, remaining = 1;
forOf(iterable, false, function(promise){
var $index = index++
, alreadyCalled = false;
values.push(undefined);
remaining++;
C.resolve(promise).then(function(value){
if(alreadyCalled){ return; }
alreadyCalled = true;
values[$index] = value;
--remaining || resolve(values);
}, reject);
});
--remaining || resolve(values);
});
if(abrupt){ reject(abrupt.error); }
return capability.promise;
},
// 25.4.4.4 Promise.race(iterable)
race: function race(iterable){
var C = this
, capability = newPromiseCapability(C)
, reject = capability.reject;
var abrupt = perform(function(){
forOf(iterable, false, function(promise){
C.resolve(promise).then(capability.resolve, reject);
});
});
if(abrupt){ reject(abrupt.error); }
return capability.promise;
}
});
var lib$2 = window.lib || (window.lib = {});
/**
* Version class.
* @class lib.env~Version
* @param {String} v - version number.
*/
function Version (v) {
Object.defineProperty(this, 'val', {
value: v.toString(),
enumerable: true
});
/**
* larger than
* @method gt
* @param {String} v - version
* @return {Boolean} result
* @instance
* @memberof Version
*/
this.gt = function (v) {
return Version.compare(this, v) > 0
};
/**
* larger than or equal to.
* @method gte
* @param {String} v - version
* @return {Boolean} result
* @instance
* @memberof Version
*/
this.gte = function (v) {
return Version.compare(this, v) >= 0
};
/**
* less than.
* @method lt
* @param {String} v - version
* @return {Boolean} result
* @instance
* @memberof Version
*/
this.lt = function (v) {
return Version.compare(this, v) < 0
};
/**
* less than or equal to.
* @method lte
* @param {String} v - version
* @return {Boolean} result
* @instance
* @memberof Version
*/
this.lte = function (v) {
return Version.compare(this, v) <= 0
};
/**
* equal to.
* @method eq
* @param {String} v - version
* @return {Boolean} equal to
* @instance
* @memberof Version
*/
this.eq = function (v) {
return Version.compare(this, v) === 0
};
}
/**
* version number string.
* @method toString
* @return {String} current version number string.
* @instance
* @memberof Version
*/
Version.prototype.toString = function () {
return this.val
};
/**
* return current version number.
* @method valueOf
* @return {Boolean} version number
* @instance
* @memberof Version
*/
Version.prototype.valueOf = function () {
var v = this.val.split('.');
var r = [];
for (var i = 0; i < v.length; i++) {
var n = parseInt(v[i], 10);
if (isNaN(n)) {
n = 0;
}
var s = n.toString();
if (s.length < 5) {
s = Array(6 - s.length).join('0') + s;
}
r.push(s);
if (r.length === 1) {
r.push('.');
}
}
return parseFloat(r.join(''))
};
/**
* compare two versions.
* @method compare
* @param {String} v1 - version1
* @param {String} v2 - version2
* @return {Number} 0 for equality,-1 for less than,1 for larger than.
* @memberof Version
*/
Version.compare = function (v1, v2) {
v1 = v1.toString().split('.');
v2 = v2.toString().split('.');
for (var i = 0; i < v1.length || i < v2.length; i++) {
var n1 = parseInt(v1[i], 10);
var n2 = parseInt(v2[i], 10);
if (window.isNaN(n1)) {
n1 = 0;
}
if (window.isNaN(n2)) {
n2 = 0;
}
if (n1 < n2) {
return -1
}
else if (n1 > n2) {
return 1
}
}
return 0
};
/**
* 解析和操作版本号
* @method version
* @param {string} v - 需要解析的版本号
* @return {lib.env~Version} Verson实例
* @memberof lib
*/
lib$2.version = function (v) {
return new Version(v)
};
var lib$3 = window.lib || (window.lib = {});
var env$1 = lib$3.env || (lib$3.env = {});
var search = window.location.search.replace(/^\?/, '');
env$1.params = {};
if (search) {
var params = search.split('&');
for (var i$1 = 0; i$1 < params.length; i$1++) {
params[i$1] = params[i$1].split('=');
try {
env$1.params[params[i$1][0]] = decodeURIComponent(params[i$1][1]);
}
catch (e) {
env$1.params[params[i$1][0]] = params[i$1][1];
}
}
}
var lib$1 = window.lib || (window.lib = {});
var env = lib$1.env || (lib$1.env = {});
var ua = window.navigator.userAgent;
var match;
/**
* os
*/
match = ua.match(/Windows\sPhone\s(?:OS\s)?([\d.]+)/);
if (match) {
/**
* @type {Object}
* @memberof lib.env
* @property {String} name - os name, e.g. Android/AndroidPad/iPhone/iPod/iPad/Windows Phone/unknown, etc.
* @property {lib.env~Version} version - os version.
* @property {Boolean} isWindowsPhone
* @property {Boolean} isIPhone - is iPhone/iTouch
* @property {Boolean} isIPad
* @property {Boolean} isIOS
* @property {Boolean} isAndroid
* @property {Boolean} isAndroidPad
*/
env.os = {
name: 'Windows Phone',
isWindowsPhone: true,
version: match[1]
};
}
else if (!!ua.match(/Safari/) && (match = ua.match(/Android[\s/]([\d.]+)/))) {
env.os = {
version: match[1]
};
if ((ua.match(/Mobile\s+Safari/))) {
env.os.name = 'Android';
env.os.isAndroid = true;
}
else {
env.os.name = 'AndroidPad';
env.os.isAndroidPad = true;
}
}
else if ((match = ua.match(/(iPhone|iPad|iPod)/))) {
var name = match[1];
match = ua.match(/OS ([\d_.]+) like Mac OS X/);
env.os = {
name: name,
isIPhone: (name === 'iPhone' || name === 'iPod'),
isIPad: name === 'iPad',
isIOS: true,
version: match && match[1].split('_').join('.') || ''
};
}
else {
env.os = {
name: 'unknown',
version: '0.0.0'
};
}
if (lib$1.version) {
env.os.version = lib$1.version(env.os.version);
}
/**
* browser
*/
match = ua.match(/(?:UCWEB|UCBrowser\/)([\d.]+)/);
if (match) {
/**
* @type {Object}
* @memberof env
* @property {String} name - browser name,e.g. UC/QQ/Firefox/Chrome/Android/Safari/iOS Webview/Chrome Webview/IE/IEMobile/unknown, etc.
* @property {env~Version} version - browser version.
* @property {Boolean} isUC
* @property {Boolean} isQQ
* @property {Boolean} isIE
* @property {Boolean} isIEMobile
* @property {Boolean} isIELikeWebkit
* @property {Boolean} isChrome
* @property {Boolean} isAndroid
* @property {Boolean} isSafari
* @property {Boolean} isWebview
*/
env.browser = {
name: 'UC',
isUC: true,
version: match[1]
};
}
else if ((match = ua.match(/MQQBrowser\/([\d.]+)/))) {
env.browser = {
name: 'QQ',
isQQ: true,
version: match[1]
};
}
else if ((match = ua.match(/Firefox\/([\d.]+)/))) {
env.browser = {
name: 'Firefox',
isFirefox: true,
version: match[1]
};
}
else if ((match = ua.match(/MSIE\s([\d.]+)/))
|| (match = ua.match(/IEMobile\/([\d.]+)/))) {
env.browser = {
version: match[1]
};
if (ua.match(/IEMobile/)) {
env.browser.name = 'IEMobile';
env.browser.isIEMobile = true;
}
else {
env.browser.name = 'IE';
env.browser.isIE = true;
}
if (ua.match(/Android|iPhone/)) {
env.browser.isIELikeWebkit = true;
}
}
else if ((match = ua.match(/(?:Chrome|CriOS)\/([\d.]+)/))) {
env.browser = {
name: 'Chrome',
isChrome: true,
version: match[1]
};
if (ua.match(/Version\/[\d+.]+\s*Chrome/)) {
env.browser.name = 'Chrome Webview';
env.browser.isWebview = true;
}
}
else if (!!ua.match(/Safari/) && (match = ua.match(/Android[\s/]([\d.]+)/))) {
env.browser = {
name: 'Android',
isAndroid: true,
version: match[1]
};
}
else if (ua.match(/iPhone|iPad|iPod/)) {
if (ua.match(/Safari/)) {
match = ua.match(/Version\/([\d.]+)/);
env.browser = {
name: 'Safari',
isSafari: true,
version: match && match[1] || ''
};
}
else {
match = ua.match(/OS ([\d_.]+) like Mac OS X/);
env.browser = {
name: 'iOS Webview',
isWebview: true,
version: match && match[1].replace(/_/g, '.') || ''
};
}
}
else {
env.browser = {
name: 'unknown',
version: '0.0.0'
};
}
if (lib$1.version) {
env.browser.version = lib$1.version(env.browser.version);
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
//
var toString$2 = Object.prototype.toString;
/**
* Strict object type check. Only returns true
* for plain JavaScript objects.
*
* @param {*} obj
* @return {Boolean}
*/
var OBJECT_STRING = '[object Object]';
function isPlainObject (obj) {
return toString$2.call(obj) === OBJECT_STRING
}
var ARRAY_STRING = '[object Array]';
function isArray (arr) {
return toString$2.call(arr) === ARRAY_STRING
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
//
/**
* Mix properties into target object.
* the rightest object's value has the highest priority.
*/
function extend (to) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
if (!args || args.length <= 0) {
return to
}
args.forEach(function (from) {
if (typeof from !== 'object') {
return
}
for (var key in from) {
to[key] = from[key];
}
});
return to
}
/**
* Mix truthy or '' property values into target object.
* mostly for merging styles. (that's why '' is falsy but still should be counted in.)
* the rightest object's value has the highest priority.
*/
function extendTruthy (to) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
if (!args || args.length <= 0) {
return to
}
args.forEach(function (from) {
if (typeof from !== 'object') {
return
}
var i;
for (var key in from) {
if (((i = from[key]) || i === '' || i === 0) && i !== 'undefined') {
to[key] = i;
}
}
});
return to
}
/**
* Mix specified properties into target object.
*/
function extendKeys (to, from, keys) {
if ( from === void 0 ) from = {};
(keys || []).forEach(function (key) {
from && (to[key] = from[key]);
});
return to
}
/**
* Extract specified properties from src to target object.
*/
function extractKeys (to, from, keys) {
if ( from === void 0 ) from = {};
if (!from) {
return to
}
(keys || []).forEach(function (key) {
from && (to[key] = from[key]);
from && (delete from[key]);
});
return to
}
/**
* Simple bind, faster than native
*
* @param {Function} fn
* @param {Object} ctx
* @return {Function}
*/
function bind (fn, ctx) {
return function (a) {
var l = arguments.length;
return l ? l > 1 ? fn.apply(ctx, arguments) : fn.call(ctx, a) : fn.call(ctx)
}
}
/**
* Only call the func the last time before it's not that frequently called.
*/
function debounce (func, wait) {
var timerId;
function later () {
timerId = null;
func.apply(null);
}
return function () {
clearTimeout(timerId);
timerId = setTimeout(later, wait);
}
}
/**
* Only call the func the first time before a series frequently function calls happen.
*/
function depress (func, wait) {
var timerId;
function later () {
timerId = null;
}
return function () {
if (!timerId) {
func.apply();
}
clearTimeout(timerId);
timerId = setTimeout(later, wait);
}
}
/**
* Only call the func every time after a wait milliseconds if it's too frequently called.
*/
function throttle (func, wait, callLastTime) {
var last = 0;
var lastTimer = null;
var lastTimeDuration = wait + (wait > 25 ? wait : 25); // plus half wait time.
return function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
var context = this;
var time = new Date().getTime();
if (time - last > wait) {
if (callLastTime) {
lastTimer && clearTimeout(lastTimer);
lastTimer = setTimeout(function () {
lastTimer = null;
func.apply(context, args);
}, lastTimeDuration);
}
func.apply(context, args);
last = time;
}
}
}
// direction: 'l' | 'r', default is 'r'
// num: how many times to loop, should be a positive integer
function loopArray (arr, num, direction) {
if (!isArray(arr)) {
return
}
var isLeft = (direction + '').toLowerCase() === 'l';
var len = arr.length;
num = num % len;
if (num < 0) {
num = -num;
isLeft = !isLeft;
}
if (num === 0) {
return arr
}
var lp, rp;
if (isLeft) {
lp = arr.slice(0, num);
rp = arr.slice(num);
}
else {
lp = arr.slice(0, len - num);
rp = arr.slice(len - num);
}
return rp.concat(lp)
}
/**
* Create a cached version of a pure function.
*/
function cached (fn) {
var cache = Object.create(null);
return function cachedFn (str) {
var hit = cache[str];
return hit || (cache[str] = fn(str))
}
}
/**
* Camelize a hyphen-delmited string.
*/
var camelizeRE = /-(\w)/g;
var camelize = cached(function (str) {
return str.replace(camelizeRE, function (_, c) { return c.toUpperCase(); })
});
function camelizeKeys (obj) {
var res = {};
for (var key in obj) {
res[camelize(key)] = obj[key];
}
return res
}
/**
* Capitalize a string.
*/
var capitalize = cached(function (str) {
return str.charAt(0).toUpperCase() + str.slice(1)
});
/**
* Hyphenate a camelCase string.
*/
var hyphenateRE = /([^-])([A-Z])/g;
var hyphenate = cached(function (str) {
return str.replace(hyphenateRE, '$1-$2').replace(hyphenateRE, '$1-$2').toLowerCase()
});
function hyphenateKeys (obj) {
var res = {};
for (var key in obj) {
res[hyphenate(key)] = obj[key];
}
return res
}
var vendorsReg = /webkit-|moz-|o-|ms-/;
function hyphenateStyleKeys (obj) {
var res = {};
for (var key in obj) {
var hk = hyphenate(key).replace(vendorsReg, function ($0) {
return '-' + $0
});
res[hk] = obj[key];
}
return res
}
function camelToKebab (name) {
if (!name) {
return ''
}
return name.replace(/([A-Z])/g, function (g, g1) {
return ("-" + (g1.toLowerCase()))
})
}
function appendCss (css, cssId, replace) {
var style = document.getElementById(cssId);
if (style && replace) {
style.parentNode.removeChild(style);
style = null;
}
if (!style) {
style = document.createElement('style');
style.type = 'text/css';
cssId && (style.id = cssId);
document.getElementsByTagName('head')[0].appendChild(style);
}
style.appendChild(document.createTextNode(css));
}
function nextFrame (callback) {
var runner = window.requestAnimationFrame
|| window.webkitRequestAnimationFrame
|| window.mozRequestAnimationFrame
|| (function (cb) { return setTimeout(cb, 16); });
runner(callback);
}
function toCSSText (object) {
if (!object) {
return
}
var obj = hyphenateStyleKeys(object);
var cssText = '';
for (var key in obj) {
cssText += key + ":" + (obj[key]) + ";";
}
return cssText
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
//
/**
* viewport priority:
*
* 1. meta weex-viewport (developer custom)
* 2. setViewport(config) := config.width (private code) @deprecated
* 3. 750 (buid time)
*
*/
var isInited = false;
var DEFAULT_VIEWPORT_WIDTH = 750;
/**
* get viewport width from weex-viewport meta.
*/
var envViewportWidth = parseInt(750);
var width = !isNaN(envViewportWidth) && envViewportWidth > 0
? envViewportWidth
: DEFAULT_VIEWPORT_WIDTH;
var wxViewportMeta = document.querySelector('meta[name="weex-viewport"]');
var metaWidth = wxViewportMeta && parseInt(wxViewportMeta.getAttribute('content'));
if (metaWidth && !isNaN(metaWidth) && metaWidth > 0) {
width = metaWidth;
}
var dpr = 0;
var screenWidth = 0;
var screenHeight = 0;
var info = {
dpr: dpr,
scale: 0,
rem: 0,
deviceWidth: 0,
deviceHeight: 0
};
/**
* set root font-size for rem units. If already been set, just skip this.
*/
function setRootFont (width) {
var doc = window.document;
var rem = width / 10;
if (!doc.documentElement) { return }
var rootFontSize = doc.documentElement.style.fontSize;
if (!rootFontSize) {
doc.documentElement.style.fontSize = rem + 'px';
info.rem = rem;
}
}
function setMetaViewport (width) {
if (!wxViewportMeta) {
wxViewportMeta = document.createElement('meta');
wxViewportMeta.setAttribute('name', 'weex-viewport');
}
else {
var metaWidth = parseInt(wxViewportMeta.getAttribute('content'));
if (metaWidth === width) {
return
}
}
wxViewportMeta.setAttribute('content', width + '');
}
/**
* export viewport info.
*/
function init$2 (viewportWidth) {
if ( viewportWidth === void 0 ) viewportWidth = width;
if (!isInited) {
isInited = true;
var doc = window.document;
if (!doc) {
console.error('[vue-render] window.document is undfined.');
return
}
if (!doc.documentElement) {
console.error('[vue-render] document.documentElement is undfined.');
return
}
dpr = info.dpr = window.devicePixelRatio;
screenWidth = doc.documentElement.clientWidth;
screenHeight = doc.documentElement.clientHeight;
var resetDeviceHeight = function () {
screenHeight = doc.documentElement.clientHeight;
var env = window.weex && window.weex.config.env;
info.deviceHeight = env.deviceHeight = screenHeight * dpr;
};
// set root font for rem.
setRootFont(screenWidth);
setMetaViewport(viewportWidth);
window.addEventListener('resize', resetDeviceHeight);
/**
* why not to use window.screen.width to get screenWidth ? Because in some
* old webkit browser on android system it get the device pixel width, which
* is the screenWidth multiply by the device pixel ratio.
* e.g. ip6 -> get 375 for virtual screen width.
*/
var scale = screenWidth / viewportWidth;
/**
* 1. if set initial/maximum/mimimum-scale some how the page will have a bounce
* effect when user drag the page towards horizontal axis.
* 2. Due to compatibility reasons, not to use viewport meta anymore. Just bring
* a parameter scale into the style value processing.
*/
// const contents = [
// `width=${viewportWidth}`,
// `initial-scale=${scale}`,
// `maximum-scale=${scale}`,
// `minimum-scale=${scale}`,
// `user-scalable=no`
// ]
// let meta = doc.querySelector('meta[name="viewport"]')
// if (!meta) {
// meta = doc.createElement('meta')
// meta.setAttribute('name', 'viewport')
// document.querySelector('head').appendChild(meta)
// }
// meta.setAttribute('content', contents.join(','))
extend(info, {
scale: scale,
deviceWidth: screenWidth * dpr,
deviceHeight: screenHeight * dpr
});
}
return info
}
/**
* reset viewport width and scale.
* @return new scale.
*/
function getViewportInfo () {
return info
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function extend$1 (to) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
if (!args || args.length <= 0) { return to }
args.forEach(function (from) {
if (typeof from !== 'object') { return }
for (var key in from) {
to[key] = from[key];
}
});
return to
}
// if support passive event listeners.
var _supportsPassive = false;
try {
document.createElement('div').addEventListener('test', function (_) {}, {
get passive () {
_supportsPassive = true;
}
});
}
catch (e) {
// do nothing.
}
function supportsPassive () {
return _supportsPassive
}
/**
* Create Event.
* @param {DOMString} type
* @param {Object} props
*/
function createEvent (target, type, props) {
var event = new Event(type, { bubbles: false });
extend$1(event, props);
// phantomjs don't support customer event
if (window.navigator.userAgent.toLowerCase().indexOf('phantomjs') !== -1) {
return event
}
try {
Object.defineProperty(event, 'target', {
enumerable: true,
value: target
});
}
catch (err) {
return extend$1({}, event, { target: target })
}
return event
}
/**
* Create a bubbable Event.
* @param {DOMString} type
* @param {Object} props
*/
function createBubblesEvent (target, type, props) {
var event = new Event(type, { bubbles: true });
extend$1(event, props);
// phantomjs don't support customer event
if (window.navigator.userAgent.toLowerCase().indexOf('phantomjs') !== -1) {
return event
}
try {
Object.defineProperty(event, 'target', {
enumerable: true,
value: target
});
}
catch (err) {
return extend$1({}, event, { target: target })
}
return event
}
/**
* Create Custom Event.
* @param {DOMString} type
* @param {Object} props
*/
function createCustomEvent (target, type, props) {
// compatibility: http://caniuse.com/#search=customevent
// const event = new CustomEvent(type)
var event = document.createEvent('CustomEvent');
event.initCustomEvent(type, false, true, {});
// event.preventDefault()
// event.stopPropagation()
extend$1(event, props);
// event.target is readonly
try {
Object.defineProperty(event, 'target', {
enumerable: true,
value: target || null
});
}
catch (err) {
return extend$1({}, event, { target: target || null })
}
return event
}
/**
* dispatch a event on a dom element.
* @param {HTMLElement} dom
* @param {Event} event
*/
function dispatchEvent (dom, event) {
dom.dispatchEvent(event);
}
function mapFormEvents (context) {
var eventMap = {};['input', 'change', 'focus', 'blur'].forEach(function (type) {
eventMap[type] = function (event) {
if (context.$el) {
event.value = context.$el.value;
}
context.$emit(type, event);
};
});
return eventMap
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var config = {
scrollableTypes: ['scroller', 'list', 'waterfall'],
gestureEvents: [
'panstart',
'panmove',
'panend',
'swipe',
'longpress',
'tap'
]
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function getParentScroller (vm) {
if (!vm) { return null }
if (vm._parentScroller) {
return vm._parentScroller
}
function _getParentScroller (parent) {
if (!parent) { return }
if (config.scrollableTypes.indexOf(parent.weexType) > -1) {
vm._parentScroller = parent;
return parent
}
return _getParentScroller(parent.$parent)
}
return _getParentScroller(vm.$parent)
}
function horizontalBalance (rect, ctRect) {
return rect.left < ctRect.right && rect.right > ctRect.left
}
function verticalBalance (rect, ctRect) {
return rect.top < ctRect.bottom && rect.bottom > ctRect.top
}
/**
* return a data array with two boolean value, which are:
* 1. visible in current ct's viewport.
* 2. visible with offset in current ct's viewport.
*/
function hasIntersection (rect, ctRect, dir, offset) {
dir = dir || 'up';
var isHorizontal = dir === 'left' || dir === 'right';
var isVertical = dir === 'up' || dir === 'down';
if (isHorizontal && !verticalBalance(rect, ctRect)) {
return [false, false]
}
if (isVertical && !horizontalBalance(rect, ctRect)) {
return [false, false]
}
offset = parseInt(offset || 0) * weex.config.env.scale;
switch (dir) {
case 'up':
return [
rect.top < ctRect.bottom && rect.bottom > ctRect.top,
rect.top < ctRect.bottom + offset && rect.bottom > ctRect.top - offset
]
case 'down':
return [
rect.bottom > ctRect.top && rect.top < ctRect.bottom,
rect.bottom > ctRect.top - offset && rect.top < ctRect.bottom + offset
]
case 'left':
return [
rect.left < ctRect.right && rect.right > ctRect.left,
rect.left < ctRect.right + offset && rect.right > ctRect.left - offset
]
case 'right':
return [
rect.right > ctRect.left && rect.left < ctRect.right,
rect.right > ctRect.left - offset && rect.left < ctRect.right + offset
]
}
}
/**
* isElementVisible
* @param {HTMLElement} el a dom element.
* @param {HTMLElement} container optional, the container of this el.
*/
function isElementVisible (el, container, dir, offset) {
if (!el.getBoundingClientRect) { return false }
var bodyRect = {
top: 0,
left: 0,
bottom: window.innerHeight,
right: window.innerWidth
};
var ctRect = (container === window || container === document.body)
? bodyRect : container
? container.getBoundingClientRect() : bodyRect;
return hasIntersection(el.getBoundingClientRect(), ctRect, dir, offset)
}
// to trigger the appear/disappear event.
function triggerEvent (elm, handlers, evt, dir) {
var listener = handlers[evt];
if (listener && listener.fn) {
listener = listener.fn;
}
if (listener) {
listener(createEvent(elm, evt, {
direction: dir
}));
}
}
/**
* get all event listeners. including bound handlers in all parent vnodes.
*/
function getEventHandlers (context) {
var vnode = context.$vnode;
var handlers = {};
var attachedVnodes = [];
while (vnode) {
attachedVnodes.push(vnode);
vnode = vnode.parent;
}
attachedVnodes.forEach(function (vnode) {
var parentListeners = vnode.componentOptions && vnode.componentOptions.listeners;
var dataOn = vnode.data && vnode.data.on;
extend(handlers, parentListeners, dataOn);
});
return handlers
}
function getAppearOffset (el) {
return el && el.getAttribute('appear-offset')
}
function checkHandlers (handlers) {
return [
!!(handlers.appear || handlers.disappear),
!!(handlers.offsetAppear || handlers.offsetDisappear)
]
}
/**
* Watch element's visibility to tell whether should trigger a appear/disappear
* event in scroll handler.
*/
function watchAppear (context, fireNow) {
var el = context && context.$el;
if (!el || el.nodeType !== 1) { return }
var appearOffset = getAppearOffset(el);
var handlers = getEventHandlers(context);
var checkResults = checkHandlers(handlers);
// no appear or offsetAppear handler was bound.
if (!checkResults[0] && !checkResults[1]) {
return
}
var isWindow = false;
var container = window;
var scroller = getParentScroller(context);
if (scroller && scroller.$el) {
container = scroller.$el;
}
else {
isWindow = true;
}
if (fireNow) {
var visibleData = isElementVisible(el, container, null, appearOffset);
detectAppear(context, visibleData, null);
}
// add current vm to the container's appear watch list.
if (!container._watchAppearList) {
container._watchAppearList = [];
}
container._watchAppearList.push(context);
/**
* Code below will only exec once for binding scroll handler for parent container.
*/
if (container._scrollWatched) {
return
}
container._scrollWatched = true;
var scrollHandler = throttle(function (event) {
/**
* detect scrolling direction.
* direction only support up & down yet.
* TODO: direction support left & right.
*/
var scrollTop = isWindow ? window.pageYOffset : container.scrollTop;
var preTop = container._lastScrollTop;
container._lastScrollTop = scrollTop;
var dir = (scrollTop < preTop
? 'down' : scrollTop > preTop
? 'up' : container._prevDirection) || null;
container._prevDirection = dir;
var watchAppearList = container._watchAppearList || [];
var len = watchAppearList.length;
for (var i = 0; i < len; i++) {
var vm = watchAppearList[i];
var el = vm.$el;
var appearOffset = getAppearOffset(el);
var visibleData = isElementVisible(el, container, dir, appearOffset);
detectAppear(vm, visibleData, dir);
}
}, 25, true);
container.addEventListener('scroll', scrollHandler, false);
}
/**
* trigger a disappear event.
*/
function triggerDisappear (context) {
return detectAppear(context, [false, false])
}
/**
* decide whether to trigger a appear/disappear event.
* @param {VueComponent} context
* @param {boolean} visible
* @param {string} dir
*/
function detectAppear (context, visibleData, dir, appearOffset) {
if ( dir === void 0 ) dir = null;
var el = context && context.$el;
var visible = visibleData[0];
var offsetVisible = visibleData[1];
if (!el) { return }
var handlers = getEventHandlers(context);
/**
* No matter it's binding appear/disappear or both of them. Always
* should test it's visibility and change the context/._visible.
* If neithor of them was bound, then just ignore it.
*/
/**
* if the component hasn't appeared for once yet, then it shouldn't trigger
* a disappear event at all.
*/
if (context._appearedOnce || visible) {
if (context._visible !== visible) {
if (!context._appearedOnce) {
context._appearedOnce = true;
}
context._visible = visible;
triggerEvent(el, handlers, visible ? 'appear' : 'disappear', dir);
}
}
if (context._offsetAppearedOnce || offsetVisible) {
if (context._offsetVisible !== offsetVisible) {
if (!context._offsetAppearedOnce) {
context._offsetAppearedOnce = true;
}
context._offsetVisible = offsetVisible;
triggerEvent(el, handlers, offsetVisible ? 'offsetAppear' : 'offsetDisappear', dir);
}
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
//
function preLoadImg (src,
loadCallback,
errorCallback) {
var img = new Image();
img.onload = loadCallback ? loadCallback.bind(img) : null;
img.onerror = errorCallback ? errorCallback.bind(img) : null;
img.src = src;
}
function applySrc (item, src, placeholderSrc) {
if (!src) { return }
function finallCb () {
delete item._src_loading;
}
if (item._src_loading === src) {
return
}
/**
* 1. apply src immediately in case javscript blocks the image loading
* before next tick.
*/
item.style.backgroundImage = "url(" + (src || '') + ")";
item.removeAttribute('img-src');
/**
* 2. then load the img src with Image constructor (but would not post
* a request again), just to trigger the load event.
*/
item._src_loading = src;
preLoadImg(src, function (evt) {
item.style.backgroundImage = "url(" + (src || '') + ")";
var ref = this;
var naturalWidth = ref.width;
var naturalHeight = ref.height;
var params = {
success: true,
size: { naturalWidth: naturalWidth, naturalHeight: naturalHeight }
};
dispatchEvent(item, createEvent(item, 'load', params));
finallCb();
}, function (evt) {
var params = {
success: false,
size: { naturalWidth: 0, naturalHeight: 0 }
};
dispatchEvent(item, createEvent(item, 'load', params));
if (placeholderSrc) {
preLoadImg(placeholderSrc, function () {
item.style.backgroundImage = "url(" + (placeholderSrc || '') + ")";
});
}
finallCb();
});
}
function fireLazyload (el, ignoreVisibility) {
if (Array.isArray(el)) {
return el.forEach(function (ct) { return fireLazyload(ct); })
}
el = el || document.body;
if (!el) { return }
var imgs = (el || document.body).querySelectorAll('[img-src]');
if (el.getAttribute('img-src')) { imgs = [el]; }
for (var i = 0; i < imgs.length; i++) {
var img = imgs[i];
if (typeof ignoreVisibility === 'boolean' && ignoreVisibility) {
applySrc(img, img.getAttribute('img-src'), img.getAttribute('img-placeholder'));
}
else if (isElementVisible(img, el)[0]) {
applySrc(img, img.getAttribute('img-src'), img.getAttribute('img-placeholder'));
}
}
}
/**
* cache a throttle lazyload function for every container element
* once for different wait times separate.
* the architecture of this cache:
* cache: {
* el.id: {
* wait: throttledFunction () { ... }
* }
* }
*/
var cache = {};
var _uid$2 = 1;
function getThrottleLazyload (wait, el) {
if ( wait === void 0 ) wait = 16;
if ( el === void 0 ) el = document.body;
var id = +(el && el.dataset.throttleId);
if (isNaN(id) || id <= 0) {
id = _uid$2++;
el && el.setAttribute('data-throttle-id', id + '');
}
!cache[id] && (cache[id] = {});
var throttled = cache[id][wait] ||
(cache[id][wait] = throttle(
fireLazyload.bind(this, el),
parseFloat(wait),
// true for callLastTime.
// to trigger once more time after the last throttled function called with a little more delay.
true)
);
return throttled
}
var capitalizeString_1 = createCommonjsModule(function (module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = capitalizeString;
function capitalizeString(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
}
module.exports = exports["default"];
});
var prefixProperty_1 = createCommonjsModule(function (module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = prefixProperty;
var _capitalizeString = capitalizeString_1;
var _capitalizeString2 = _interopRequireDefault(_capitalizeString);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function prefixProperty(prefixProperties, property, style) {
if (prefixProperties.hasOwnProperty(property)) {
var requiredPrefixes = prefixProperties[property];
for (var i = 0, len = requiredPrefixes.length; i < len; ++i) {
style[requiredPrefixes[i] + (0, _capitalizeString2.default)(property)] = style[property];
}
}
}
module.exports = exports['default'];
});
var prefixValue_1 = createCommonjsModule(function (module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = prefixValue;
function prefixValue(plugins, property, value, style, metaData) {
for (var i = 0, len = plugins.length; i < len; ++i) {
var processedValue = plugins[i](property, value, style, metaData
// we can stop processing if a value is returned
// as all plugin criteria are unique
);if (processedValue) {
return processedValue;
}
}
}
module.exports = exports["default"];
});
var addNewValuesOnly_1 = createCommonjsModule(function (module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = addNewValuesOnly;
function addIfNew(list, value) {
if (list.indexOf(value) === -1) {
list.push(value);
}
}
function addNewValuesOnly(list, values) {
if (Array.isArray(values)) {
for (var i = 0, len = values.length; i < len; ++i) {
addIfNew(list, values[i]);
}
} else {
addIfNew(list, values);
}
}
module.exports = exports["default"];
});
var isObject_1 = createCommonjsModule(function (module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = isObject;
function isObject(value) {
return value instanceof Object && !Array.isArray(value);
}
module.exports = exports["default"];
});
var createPrefixer_1 = createCommonjsModule(function (module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = createPrefixer;
var _prefixProperty = prefixProperty_1;
var _prefixProperty2 = _interopRequireDefault(_prefixProperty);
var _prefixValue = prefixValue_1;
var _prefixValue2 = _interopRequireDefault(_prefixValue);
var _addNewValuesOnly = addNewValuesOnly_1;
var _addNewValuesOnly2 = _interopRequireDefault(_addNewValuesOnly);
var _isObject = isObject_1;
var _isObject2 = _interopRequireDefault(_isObject);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function createPrefixer(_ref) {
var prefixMap = _ref.prefixMap,
plugins = _ref.plugins;
function prefixAll(style) {
for (var property in style) {
var value = style[property];
// handle nested objects
if ((0, _isObject2.default)(value)) {
style[property] = prefixAll(value
// handle array values
);
} else if (Array.isArray(value)) {
var combinedValue = [];
for (var i = 0, len = value.length; i < len; ++i) {
var processedValue = (0, _prefixValue2.default)(plugins, property, value[i], style, prefixMap);
(0, _addNewValuesOnly2.default)(combinedValue, processedValue || value[i]);
}
// only modify the value if it was touched
// by any plugin to prevent unnecessary mutations
if (combinedValue.length > 0) {
style[property] = combinedValue;
}
} else {
var _processedValue = (0, _prefixValue2.default)(plugins, property, value, style, prefixMap
// only modify the value if it was touched
// by any plugin to prevent unnecessary mutations
);if (_processedValue) {
style[property] = _processedValue;
}
(0, _prefixProperty2.default)(prefixMap, property, style);
}
}
return style;
}
return prefixAll;
}
module.exports = exports['default'];
});
var staticData = createCommonjsModule(function (module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var w = ["Webkit"];
var m = ["Moz"];
var ms = ["ms"];
var wm = ["Webkit", "Moz"];
var wms = ["Webkit", "ms"];
var wmms = ["Webkit", "Moz", "ms"];
exports.default = {
plugins: [],
prefixMap: { "appearance": wm, "userSelect": wmms, "textEmphasisPosition": w, "textEmphasis": w, "textEmphasisStyle": w, "textEmphasisColor": w, "boxDecorationBreak": w, "clipPath": w, "maskImage": w, "maskMode": w, "maskRepeat": w, "maskPosition": w, "maskClip": w, "maskOrigin": w, "maskSize": w, "maskComposite": w, "mask": w, "maskBorderSource": w, "maskBorderMode": w, "maskBorderSlice": w, "maskBorderWidth": w, "maskBorderOutset": w, "maskBorderRepeat": w, "maskBorder": w, "maskType": w, "textDecorationStyle": w, "textDecorationSkip": w, "textDecorationLine": w, "textDecorationColor": w, "filter": w, "fontFeatureSettings": w, "breakAfter": wmms, "breakBefore": wmms, "breakInside": wmms, "columnCount": wm, "columnFill": wm, "columnGap": wm, "columnRule": wm, "columnRuleColor": wm, "columnRuleStyle": wm, "columnRuleWidth": wm, "columns": wm, "columnSpan": wm, "columnWidth": wm, "flex": w, "flexBasis": w, "flexDirection": w, "flexGrow": w, "flexFlow": w, "flexShrink": w, "flexWrap": w, "alignContent": w, "alignItems": w, "alignSelf": w, "justifyContent": w, "order": w, "transform": w, "transformOrigin": w, "transformOriginX": w, "transformOriginY": w, "backfaceVisibility": w, "perspective": w, "perspectiveOrigin": w, "transformStyle": w, "transformOriginZ": w, "animation": w, "animationDelay": w, "animationDirection": w, "animationFillMode": w, "animationDuration": w, "animationIterationCount": w, "animationName": w, "animationPlayState": w, "animationTimingFunction": w, "backdropFilter": w, "fontKerning": w, "scrollSnapType": wms, "scrollSnapPointsX": wms, "scrollSnapPointsY": wms, "scrollSnapDestination": wms, "scrollSnapCoordinate": wms, "shapeImageThreshold": w, "shapeImageMargin": w, "shapeImageOutside": w, "hyphens": wmms, "flowInto": wms, "flowFrom": wms, "regionFragment": wms, "textAlignLast": m, "tabSize": m, "wrapFlow": ms, "wrapThrough": ms, "wrapMargin": ms, "gridTemplateColumns": ms, "gridTemplateRows": ms, "gridTemplateAreas": ms, "gridTemplate": ms, "gridAutoColumns": ms, "gridAutoRows": ms, "gridAutoFlow": ms, "grid": ms, "gridRowStart": ms, "gridColumnStart": ms, "gridRowEnd": ms, "gridRow": ms, "gridColumn": ms, "gridColumnEnd": ms, "gridColumnGap": ms, "gridRowGap": ms, "gridArea": ms, "gridGap": ms, "textSizeAdjust": wms, "borderImage": w, "borderImageOutset": w, "borderImageRepeat": w, "borderImageSlice": w, "borderImageSource": w, "borderImageWidth": w, "transitionDelay": w, "transitionDuration": w, "transitionProperty": w, "transitionTimingFunction": w }
};
module.exports = exports["default"];
});
var cursor_1 = createCommonjsModule(function (module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = cursor;
var prefixes = ['-webkit-', '-moz-', ''];
var values = {
'zoom-in': true,
'zoom-out': true,
grab: true,
grabbing: true
};
function cursor(property, value) {
if (property === 'cursor' && values.hasOwnProperty(value)) {
return prefixes.map(function (prefix) {
return prefix + value;
});
}
}
module.exports = exports['default'];
});
var isPrefixedValue_1 = createCommonjsModule(function (module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = isPrefixedValue;
var regex = /-webkit-|-moz-|-ms-/;
function isPrefixedValue(value) {
return typeof value === 'string' && regex.test(value);
}
module.exports = exports['default'];
});
var isPrefixedValue = unwrapExports(isPrefixedValue_1);
var crossFade_1 = createCommonjsModule(function (module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = crossFade;
var _isPrefixedValue = isPrefixedValue_1;
var _isPrefixedValue2 = _interopRequireDefault(_isPrefixedValue);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// http://caniuse.com/#search=cross-fade
var prefixes = ['-webkit-', ''];
function crossFade(property, value) {
if (typeof value === 'string' && !(0, _isPrefixedValue2.default)(value) && value.indexOf('cross-fade(') > -1) {
return prefixes.map(function (prefix) {
return value.replace(/cross-fade\(/g, prefix + 'cross-fade(');
});
}
}
module.exports = exports['default'];
});
var filter_1 = createCommonjsModule(function (module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = filter;
var _isPrefixedValue = isPrefixedValue_1;
var _isPrefixedValue2 = _interopRequireDefault(_isPrefixedValue);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// http://caniuse.com/#feat=css-filter-function
var prefixes = ['-webkit-', ''];
function filter(property, value) {
if (typeof value === 'string' && !(0, _isPrefixedValue2.default)(value) && value.indexOf('filter(') > -1) {
return prefixes.map(function (prefix) {
return value.replace(/filter\(/g, prefix + 'filter(');
});
}
}
module.exports = exports['default'];
});
var flex_1 = createCommonjsModule(function (module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = flex;
var values = {
flex: ['-webkit-box', '-moz-box', '-ms-flexbox', '-webkit-flex', 'flex'],
'inline-flex': ['-webkit-inline-box', '-moz-inline-box', '-ms-inline-flexbox', '-webkit-inline-flex', 'inline-flex']
};
function flex(property, value) {
if (property === 'display' && values.hasOwnProperty(value)) {
return values[value];
}
}
module.exports = exports['default'];
});
var flexboxOld_1 = createCommonjsModule(function (module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = flexboxOld;
var alternativeValues = {
'space-around': 'justify',
'space-between': 'justify',
'flex-start': 'start',
'flex-end': 'end',
'wrap-reverse': 'multiple',
wrap: 'multiple'
};
var alternativeProps = {
alignItems: 'WebkitBoxAlign',
justifyContent: 'WebkitBoxPack',
flexWrap: 'WebkitBoxLines'
};
function flexboxOld(property, value, style) {
if (property === 'flexDirection' && typeof value === 'string') {
if (value.indexOf('column') > -1) {
style.WebkitBoxOrient = 'vertical';
} else {
style.WebkitBoxOrient = 'horizontal';
}
if (value.indexOf('reverse') > -1) {
style.WebkitBoxDirection = 'reverse';
} else {
style.WebkitBoxDirection = 'normal';
}
}
if (alternativeProps.hasOwnProperty(property)) {
style[alternativeProps[property]] = alternativeValues[value] || value;
}
}
module.exports = exports['default'];
});
/* */
// direction to replace
var directions = {
top: 'bottom',
left: 'right',
bottom: 'top',
right: 'left'
};
var prefixes = ['-webkit-', '-moz-'];
var values$1 = /linear-gradient|radial-gradient|repeating-linear-gradient|repeating-radial-gradient/;
/**
* covert valStr into deg through full angle.
*/
function normalizeAngleUnit(valStr, full) {
var val = parseFloat(valStr);
return val / full * 360
}
function wrapRange(min, max, value) {
var maxLessMin = max - min;
return ((value - min) % maxLessMin + maxLessMin) % maxLessMin + min;
}
/**
* normalize angle value.
*/
function normalize (value) {
if (!value) {
return value
}
return value
.trim()
.replace(/^([+-]?\d+(?:.\d+)?)grad/, function ($0, $1) {
return ((normalizeAngleUnit($1, 400)) + "deg")
})
.replace(/^([+-]?\d+(?:.\d+)?)rad/, function ($0, $1) {
return ((normalizeAngleUnit($1, 2 * Math.PI)) + "deg")
})
.replace(/^([+-]?\d+(?:.\d+)?)turn/, function ($0, $1) {
return ((normalizeAngleUnit($1, 1)) + "deg")
})
.replace(/^([+-]?\d+(?:.\d+)?)deg/, function ($0, $1) {
var val = (wrapRange(0, 360, parseFloat($1))) + "deg";
switch (val) {
case '0deg':
val = 'to top';
break
case '90deg':
val = 'to right';
break
case '180deg':
val = 'to bottom';
break
case '270deg':
val = 'to left';
break
}
return val
})
}
/**
* convert directions to old version.
*/
function convertDirection (value) {
return value
.replace(/^to\s(top|left|bottom|right)(?:\s+(top|left|bottom|right))?/, function ($0, $1, $2) {
var dir2 = $2 && (" " + (directions[$2])) || '';
return ("" + (directions[$1]) + dir2)
})
.replace(/^([+-]?\d+(?:.\d+)?)deg/, function ($0, $1) {
var val = Math.abs(450 - parseFloat($1)) % 360;
val = parseFloat(val.toFixed(3));
return (val + "deg")
})
}
/**
* fix radial direction syntax.
* e.g.
* farthest-side at 0 50%, white, black
* -> 0 50%, farthest-side, white, black
*/
function fixRadial (value) {
return value.replace(/^(\S+)\sat\s([^,]+)/, function ($0, $1, $2) {
return ($2 + ", " + $1)
})
}
function transformValue (value) {
value = normalize(value);
value = convertDirection(value);
value = fixRadial(value);
return value
}
function gradient(property, value) {
if (typeof value === 'string' && !isPrefixedValue(value) && values$1.test(value)) {
var insertPrefixFlag = '@@@';
var reg = new RegExp(
("(" + (values$1.toString().substr(1).replace(/\/$/, '')) + ")\\(([^)]+)\\)"),
'g'
);
var newValue = value.replace(
reg,
function ($0, $1, $2) {
return ("" + insertPrefixFlag + $1 + "(" + (transformValue($2)) + ")")
});
var results = prefixes.map(function (prefix) { return newValue.replace(
new RegExp(insertPrefixFlag, 'g'),
prefix
); });
results.push(value);
return results
}
}
var gradient$1 = Object.freeze({
default: gradient
});
var imageSet_1 = createCommonjsModule(function (module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = imageSet;
var _isPrefixedValue = isPrefixedValue_1;
var _isPrefixedValue2 = _interopRequireDefault(_isPrefixedValue);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// http://caniuse.com/#feat=css-image-set
var prefixes = ['-webkit-', ''];
function imageSet(property, value) {
if (typeof value === 'string' && !(0, _isPrefixedValue2.default)(value) && value.indexOf('image-set(') > -1) {
return prefixes.map(function (prefix) {
return value.replace(/image-set\(/g, prefix + 'image-set(');
});
}
}
module.exports = exports['default'];
});
var position_1 = createCommonjsModule(function (module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = position;
function position(property, value) {
if (property === 'position' && value === 'sticky') {
return ['-webkit-sticky', 'sticky'];
}
}
module.exports = exports['default'];
});
var sizing_1 = createCommonjsModule(function (module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = sizing;
var prefixes = ['-webkit-', '-moz-', ''];
var properties = {
maxHeight: true,
maxWidth: true,
width: true,
height: true,
columnWidth: true,
minWidth: true,
minHeight: true
};
var values = {
'min-content': true,
'max-content': true,
'fill-available': true,
'fit-content': true,
'contain-floats': true
};
function sizing(property, value) {
if (properties.hasOwnProperty(property) && values.hasOwnProperty(value)) {
return prefixes.map(function (prefix) {
return prefix + value;
});
}
}
module.exports = exports['default'];
});
var uppercasePattern = /[A-Z]/g;
var msPattern = /^ms-/;
var cache$1 = {};
function hyphenateStyleName(string) {
return string in cache$1
? cache$1[string]
: cache$1[string] = string
.replace(uppercasePattern, '-$&')
.toLowerCase()
.replace(msPattern, '-ms-');
}
var index$2 = hyphenateStyleName;
var hyphenateProperty_1 = createCommonjsModule(function (module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = hyphenateProperty;
var _hyphenateStyleName = index$2;
var _hyphenateStyleName2 = _interopRequireDefault(_hyphenateStyleName);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function hyphenateProperty(property) {
return (0, _hyphenateStyleName2.default)(property);
}
module.exports = exports['default'];
});
var transition_1 = createCommonjsModule(function (module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = transition;
var _hyphenateProperty = hyphenateProperty_1;
var _hyphenateProperty2 = _interopRequireDefault(_hyphenateProperty);
var _isPrefixedValue = isPrefixedValue_1;
var _isPrefixedValue2 = _interopRequireDefault(_isPrefixedValue);
var _capitalizeString = capitalizeString_1;
var _capitalizeString2 = _interopRequireDefault(_capitalizeString);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var properties = {
transition: true,
transitionProperty: true,
WebkitTransition: true,
WebkitTransitionProperty: true,
MozTransition: true,
MozTransitionProperty: true
};
var prefixMapping = {
Webkit: '-webkit-',
Moz: '-moz-',
ms: '-ms-'
};
function prefixValue(value, propertyPrefixMap) {
if ((0, _isPrefixedValue2.default)(value)) {
return value;
}
// only split multi values, not cubic beziers
var multipleValues = value.split(/,(?![^()]*(?:\([^()]*\))?\))/g);
for (var i = 0, len = multipleValues.length; i < len; ++i) {
var singleValue = multipleValues[i];
var values = [singleValue];
for (var property in propertyPrefixMap) {
var dashCaseProperty = (0, _hyphenateProperty2.default)(property);
if (singleValue.indexOf(dashCaseProperty) > -1 && dashCaseProperty !== 'order') {
var prefixes = propertyPrefixMap[property];
for (var j = 0, pLen = prefixes.length; j < pLen; ++j) {
// join all prefixes and create a new value
values.unshift(singleValue.replace(dashCaseProperty, prefixMapping[prefixes[j]] + dashCaseProperty));
}
}
}
multipleValues[i] = values.join(',');
}
return multipleValues.join(',');
}
function transition(property, value, style, propertyPrefixMap) {
// also check for already prefixed transitions
if (typeof value === 'string' && properties.hasOwnProperty(property)) {
var outputValue = prefixValue(value, propertyPrefixMap
// if the property is already prefixed
);var webkitOutput = outputValue.split(/,(?![^()]*(?:\([^()]*\))?\))/g).filter(function (val) {
return !/-moz-|-ms-/.test(val);
}).join(',');
if (property.indexOf('Webkit') > -1) {
return webkitOutput;
}
var mozOutput = outputValue.split(/,(?![^()]*(?:\([^()]*\))?\))/g).filter(function (val) {
return !/-webkit-|-ms-/.test(val);
}).join(',');
if (property.indexOf('Moz') > -1) {
return mozOutput;
}
style['Webkit' + (0, _capitalizeString2.default)(property)] = webkitOutput;
style['Moz' + (0, _capitalizeString2.default)(property)] = mozOutput;
return outputValue;
}
}
module.exports = exports['default'];
});
var require$$4$7 = ( gradient$1 && gradient$1['default'] ) || gradient$1;
var index$1 = createCommonjsModule(function (module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createPrefixer = createPrefixer_1;
var _createPrefixer2 = _interopRequireDefault(_createPrefixer);
var _staticData = staticData;
var _staticData2 = _interopRequireDefault(_staticData);
var _cursor = cursor_1;
var _cursor2 = _interopRequireDefault(_cursor);
var _crossFade = crossFade_1;
var _crossFade2 = _interopRequireDefault(_crossFade);
var _filter = filter_1;
var _filter2 = _interopRequireDefault(_filter);
var _flex = flex_1;
var _flex2 = _interopRequireDefault(_flex);
var _flexboxOld = flexboxOld_1;
var _flexboxOld2 = _interopRequireDefault(_flexboxOld);
var _gradient = require$$4$7;
var _gradient2 = _interopRequireDefault(_gradient);
var _imageSet = imageSet_1;
var _imageSet2 = _interopRequireDefault(_imageSet);
var _position = position_1;
var _position2 = _interopRequireDefault(_position);
var _sizing = sizing_1;
var _sizing2 = _interopRequireDefault(_sizing);
var _transition = transition_1;
var _transition2 = _interopRequireDefault(_transition);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var plugins = [_crossFade2.default, _cursor2.default, _filter2.default, _flexboxOld2.default, _gradient2.default, _imageSet2.default, _position2.default, _sizing2.default, _transition2.default, _flex2.default];
exports.default = (0, _createPrefixer2.default)({
prefixMap: _staticData2.default.prefixMap,
plugins: plugins
});
module.exports = exports['default'];
});
var addPrefix = unwrapExports(index$1);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
//
var noUnitsNumberKeys = [
'flex',
'opacity',
'zIndex',
'fontWeight',
'lines'
];
// whether to support using 0.5px to paint 1px width border.
var _supportHairlines;
function supportHairlines () {
if (typeof _supportHairlines === 'undefined') {
var dpr = window.devicePixelRatio;
if (dpr && dpr >= 2 && document.documentElement) {
var docElm = document.documentElement;
var testElm = document.createElement('div');
var fakeBody = document.createElement('body');
var beforeNode = docElm.firstElementChild || docElm.firstChild;
testElm.style.border = '0.5px solid transparent';
fakeBody.appendChild(testElm);
docElm.insertBefore(fakeBody, beforeNode);
_supportHairlines = testElm.offsetHeight === 1;
docElm.removeChild(fakeBody);
}
else {
_supportHairlines = false;
}
}
return _supportHairlines
}
/**
* remove comments from a cssText.
*/
function trimComment (cssText) {
return cssText.replace(/(?:\/\*)[\s\S]*?\*\//g, '')
}
var support$1 = null;
function supportSticky () {
if (support$1 !== null) {
return support$1
}
var element = window.document.createElement('div');
var elementStyle = element.style;
elementStyle.cssText = 'position:-webkit-sticky;position:sticky;';
support$1 = elementStyle.position.indexOf('sticky') !== -1;
return support$1
}
var regPercentage = /^[+-]?\d+(\.\d+)?%$/;
function isPercentage (val) {
return regPercentage.test(val)
}
var regUnitsNum = /^([+-]?\d+(?:\.\d+)?)([p,w]x)?$/; // support units: px, wx.
function normalizeUnitsNum (val) {
var match = val.match(regUnitsNum);
if (!match) { return '' }
var unit = 'px'; // px by default.
if (match[2]) {
unit = match[2];
}
return parseScale(parseFloat(match[1]), unit)
}
function getUnitScaleMap () {
var ref = getViewportInfo();
var scale = ref.scale;
var dpr = ref.dpr;
return {
px: scale,
wx: scale * dpr
}
}
function limitScale (val, limit) {
limit = limit || 1;
var sign = val === 0 ? 0 : val > 0 ? 1 : -1;
var newVal = Math.abs(val) > limit ? val : sign * limit;
// support 1px device width.
if (newVal === 1 && val < 1 && supportHairlines()) {
newVal = 0.5;
}
return newVal
}
function parseScale (val, unit) {
var unitScaleMap = getUnitScaleMap();
return limitScale(val * unitScaleMap[unit]) + 'px'
}
function normalizeString (styleKey, styleVal) {
if (isPercentage(styleVal)) {
return styleVal
}
/**
* 1. test if is a regular scale css. e.g. `width: 100px;`
* this should be a standalone number value with or without unit, otherwise
* it shouldn't be changed.
*/
var unitsNum = normalizeUnitsNum(styleVal);
if (unitsNum) { return unitsNum }
/**
* 2. if a string contains multiple px values, than they should be all normalized.
* values should have wx or px units, otherwise they should be left unchanged.
* e.g.
* transform: translate(10px, 6px, 0)
* border: 2px solid red
*/
var numReg = /([+-]?[\d.]+)([p,w]x)/ig;
if (numReg.test(styleVal)) {
var unitScaleMap = getUnitScaleMap();
var val = styleVal.replace(numReg, function (m, $0, $1) {
var res = parseFloat($0) * unitScaleMap[$1];
return limitScale(res) + 'px'
});
return val
}
// otherwise
return styleVal
}
function autoPrefix (style) {
var prefixed = addPrefix(style);
// flex only added WebkitFlex. Should add WebkitBoxFlex also.
var flex = prefixed.flex;
if (flex) {
prefixed.WebkitBoxFlex = flex;
prefixed.MozBoxFlex = flex;
prefixed.MsFlex = flex;
}
return prefixed
}
function normalizeNumber (styleKey, styleVal) {
var ref = getViewportInfo();
var scale = ref.scale;
return styleVal * scale + 'px'
}
/**
* normalize style to adapte to current viewport by multiply current scale.
* @param {object} style: should be camelCase.
*/
function normalizeStyle (style) {
var res = {};
for (var key in style) {
var val = style[key];
if (noUnitsNumberKeys.indexOf(key) > -1) {
res[key] = val;
continue
}
switch (typeof val) {
case 'string':
res[key] = normalizeString(key, val);
break
case 'number':
res[key] = normalizeNumber(key, val);
break
default:
res[key] = val;
break
}
}
return res
}
/**
* get transformObj
*/
function getTransformObj (elm) {
var styleObj = {};
if (!elm) { return styleObj }
var transformStr = elm.style.webkitTransform
|| elm.style.mozTransform
|| elm.style.transform;
if (transformStr && transformStr.match(/(?: *(?:translate|rotate|scale)[^(]*\([^(]+\))+/i)) {
styleObj = transformStr.trim().replace(/, +/g, ',').split(' ').reduce(function (pre, str) {
['translate', 'scale', 'rotate'].forEach(function (name) {
if (new RegExp(name, 'i').test(str)) {
pre[name] = str;
}
});
return pre
}, {});
}
return styleObj
}
/**
* translate a transform string from a transformObj.
*/
function getTransformStr (obj) {
return Object.keys(obj).reduce(function (pre, key) {
return pre + obj[key] + ' '
}, '')
}
/**
* add transform style to element.
* @param {HTMLElement} elm
* @param {object} style: transform object, format is like this:
* {
* translate: 'translate3d(2px, 2px, 2px)',
* scale: 'scale(0.2)',
* rotate: 'rotate(30deg)'
* }
* @param {boolean} replace: whether to replace all transform properties.
*/
function addTransform (elm, style, replace) {
if (!style) { return }
var styleObj = {};
if (!replace) {
styleObj = getTransformObj(elm);
}
for (var key in style) {
var val = style[key];
if (val) {
styleObj[key] = val;
}
}
var resStr = getTransformStr(styleObj);
elm.style.webkitTransform = resStr;
elm.style.mozTransform = resStr;
elm.style.transform = resStr;
}
/**
* add translate X to the element.
*/
function addTranslateX (elm, toAdd) {
if (!toAdd) { return }
var styleObj = getTransformObj(elm);
if (!styleObj.translate) {
styleObj.translate = 'translate3d(0px, 0px, 0px)';
}
styleObj.translate = styleObj.translate.replace(/[+-\d.]+[pw]x/, function ($0) {
return (parseFloat($0) + toAdd) + 'px'
});
var resStr = getTransformStr(styleObj);
elm.style.webkitTransform = resStr;
elm.style.mozTransform = resStr;
elm.style.transform = resStr;
}
/**
* copy a transform behaviour from one element to another.
* key could be: 'translate' | 'scale' | 'rotate'
*/
function copyTransform (from, to, key) {
var str;
if (!key) {
str = from.style.webkitTransform
|| from.style.mozTransform
|| from.style.transform;
}
else {
var fromObj = getTransformObj(from);
if (!fromObj[key]) { return }
var toObj = getTransformObj(to);
toObj[key] = fromObj[key];
str = getTransformStr(toObj);
}
to.style.webkitTransform = str;
to.style.mozTransform = str;
to.style.transform = str;
}
/**
* get color's r, g, b value.
* @param {string} color support all kinds of value of color.
*/
function getRgb (color) {
var haxReg = /#([\da-fA-F]{2})([\da-fA-F]{2})([\da-fA-F]{2})/;
var rgbReg = /rgb\((\d+),\s*(\d+),\s*(\d+)\)/;
var span = document.createElement('span');
var body = document.body;
span.style.cssText = "color: " + color + "; width: 0px; height: 0px;";
body && body.appendChild(span);
color = window.getComputedStyle(span).color + '';
body && body.removeChild(span);
var match;
match = color.match(haxReg);
if (match) {
return {
r: parseInt(match[1], 16),
g: parseInt(match[2], 16),
b: parseInt(match[3], 16)
}
}
match = color.match(rgbReg);
if (match) {
return {
r: parseInt(match[1]),
g: parseInt(match[2]),
b: parseInt(match[3])
}
}
}
/**
* get style sheet with owner node's id
* @param {string} id owner node id.
*/
function getStyleSheetById (id) {
if (!id) { return }
var styleSheets = document.styleSheets;
var len = styleSheets.length;
for (var i = 0; i < len; i++) {
var styleSheet = styleSheets[i];
if (styleSheet.ownerNode.id === id) {
return styleSheet
}
}
}
function getChildrenTotalWidth (children) {
var len = children.length;
var total = 0;
for (var i = 0; i < len; i++) {
total += children[i].getBoundingClientRect().width;
}
return total
}
/**
* get total content width of the element.
* @param {HTMLElement} elm
*/
function getRangeWidth (elm) {
var children = elm.children;
if (!children) {
return elm.getBoundingClientRect().width
}
if (!Range) {
return getChildrenTotalWidth(children)
}
var range = document.createRange();
if (!range.selectNodeContents) {
return getChildrenTotalWidth(children)
}
range.selectNodeContents(elm);
return range.getBoundingClientRect().width
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var utils = Object.freeze({
extend: extend,
extendTruthy: extendTruthy,
extendKeys: extendKeys,
extractKeys: extractKeys,
bind: bind,
debounce: debounce,
depress: depress,
throttle: throttle,
loopArray: loopArray,
cached: cached,
camelize: camelize,
camelizeKeys: camelizeKeys,
capitalize: capitalize,
hyphenate: hyphenate,
hyphenateKeys: hyphenateKeys,
hyphenateStyleKeys: hyphenateStyleKeys,
camelToKebab: camelToKebab,
appendCss: appendCss,
nextFrame: nextFrame,
toCSSText: toCSSText,
supportsPassive: supportsPassive,
createEvent: createEvent,
createBubblesEvent: createBubblesEvent,
createCustomEvent: createCustomEvent,
dispatchEvent: dispatchEvent,
mapFormEvents: mapFormEvents,
getParentScroller: getParentScroller,
hasIntersection: hasIntersection,
isElementVisible: isElementVisible,
getEventHandlers: getEventHandlers,
watchAppear: watchAppear,
triggerDisappear: triggerDisappear,
detectAppear: detectAppear,
applySrc: applySrc,
fireLazyload: fireLazyload,
getThrottleLazyload: getThrottleLazyload,
supportHairlines: supportHairlines,
trimComment: trimComment,
supportSticky: supportSticky,
isPercentage: isPercentage,
normalizeUnitsNum: normalizeUnitsNum,
normalizeString: normalizeString,
autoPrefix: autoPrefix,
normalizeNumber: normalizeNumber,
normalizeStyle: normalizeStyle,
getTransformObj: getTransformObj,
getTransformStr: getTransformStr,
addTransform: addTransform,
addTranslateX: addTranslateX,
copyTransform: copyTransform,
getRgb: getRgb,
getStyleSheetById: getStyleSheetById,
getRangeWidth: getRangeWidth,
isPlainObject: isPlainObject,
isArray: isArray
});
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* get WXEnvironment info.
* @param {object} viewportInfo: info about viewport.
* @param {object} envInfo: info parsed from lib.env.
*/
function initEnv (viewportInfo, envInfo) {
var browserName = envInfo.browser ? envInfo.browser.name : navigator.appName;
var browserVersion = envInfo.browser ? envInfo.browser.version.val : null;
var osName = envInfo.os.name;
if (osName.match(/(iPhone|iPad|iPod)/i)) {
osName = 'iOS';
}
else if (osName.match(/Android/i)) {
osName = 'android';
}
var osVersion = envInfo.os.version.val;
var env = {
platform: 'Web',
weexVersion: '0.12.21',
userAgent: navigator.userAgent,
appName: browserName,
appVersion: browserVersion,
osName: osName,
osVersion: osVersion,
deviceModel: envInfo.os.name || null
};
/**
* viewportInfo: scale, deviceWidth, deviceHeight. dpr
*/
return extend(env, viewportInfo)
}
// const viewportInfo = initViewport()
// 750 by default currently
// const scale = viewportInfo.scale
// const units = {
// REM: 12 * scale,
// VW: viewportInfo.deviceWidth / 100,
// VH: viewportInfo.deviceHeight / 100,
// VMIN: Math.min(viewportInfo.deviceWidth, viewportInfo.deviceHeight) / 100,
// VMAX: Math.max(viewportInfo.deviceWidth, viewportInfo.deviceHeight) / 100,
// CM: 96 / 2.54 * scale,
// MM: 96 / 25.4 * scale,
// Q: 96 / 25.4 / 4 * scale,
// IN: 96 * scale,
// PT: 96 / 72 * scale,
// PC: 96 / 6 * scale,
// PX: scale
// }
// Object.freeze(units)
// Object.freeze(env)
// window.CSS_UNIT = units
window.WXEnvironment = initEnv(init$2(), window.lib.env);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* global Vue */
var weexModules = {};
var _roots = [];
var weex$4 = {
__vue__: null,
utils: utils,
// units: window.CSS_UNIT,
config: {
env: window.WXEnvironment,
bundleUrl: location.href
},
_components: {},
document: {
body: {}
},
requireModule: function requireModule (moduleName) {
return weexModules[moduleName]
},
registerModule: function registerModule () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
return (ref = this).registerApiModule.apply(ref, args)
var ref;
},
support: function support (feature) {
if ( feature === void 0 ) feature = '';
var match = (feature + '').match(/@(component|module)\/(\w+)(.\w+)?/);
if (match) {
var type = match[1];
var mod = match[2];
var method = match[3];
method = method && method.replace(/^\./, '');
switch (type) {
case 'component':
return !!this._components[mod]
case 'module':
var module = this.requireModule(mod);
return module && method ? !!module[method] : !!module
}
}
else {
console.warn(("[vue-render] invalid argument for weex.support: " + feature));
return null
}
},
/**
* Register a new vue instance in this weex instance. Put its root element into weex.document.body.children, so
* that user can use weex.document.body to walk through all dom structures in all vue instances in the page.
*/
registerVueInstance: function registerVueInstance (instance) {
if (!instance instanceof Vue) {
{
console.error("[vue-render] registerVueInstance: invalid instance, not a vue instance.");
}
return
}
var root = instance.$root;
if (!root || !root.$el) {
{
console.error("[vue-render] registerVueInstance: instance has no root.");
}
return
}
this.document.body.children.push(root.$el);
},
// @deprecated
require: function require () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
console.log("[Vue Render] \"weex.require\" is deprecated, please use \"weex.requireModule\" instead.");
return (ref = this).requireModule.apply(ref, args)
var ref;
},
// @deprecated
// TODO: rename to registerModule
registerApiModule: function registerApiModule (name, module, meta) {
var this$1 = this;
if (!weexModules[name]) {
weexModules[name] = {};
}
if (!!meta && meta.mountType === 'full') {
weexModules[name] = module;
}
for (var key in module) {
if (module.hasOwnProperty(key)) {
weexModules[name][key] = bind(module[key], this$1);
}
}
},
registerComponent: function registerComponent (name, component) {
if (!this.__vue__) {
return console.log('[Vue Render] Vue is not found. Please import Vue.js before register a component.')
}
this._components[name] = 1;
if (component._css) {
var css = component._css.replace(/\b[+-]?[\d.]+rem;?\b/g, function (m) {
return parseFloat(m) * 75 * weex$4.config.env.scale + 'px'
});
appendCss(css, ("weex-cmp-" + name));
delete component._css;
}
this.__vue__.component(name, component);
},
// @deprecated
getRoot: function getRoot () {},
// @deprecated
sender: {
performCallback: function performCallback (callback, data, keepAlive) {
if (typeof callback === 'function') {
return callback(data)
}
return null
}
},
// @deprecated
install: function install (module) {
module.init(this);
}
};
Object.defineProperty(weex$4.document.body, 'children', {
get: function get () { return _roots }
})
; ['on', 'once', 'off', 'emit'].forEach(function (method) {
weex$4[method] = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (!this._vue) {
this._vue = new this.__vue__();
}
return (ref = this._vue)[("$" + method)].apply(ref, args)
var ref;
};
});
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
//
/**
* @fileOverview: perf data recorder.
*/
var perf = window._weex_perf = {
time: {}
};
var tmp = {};
function getNow () {
var performance = window.performance;
return performance && performance.now ? performance.now() : new Date().getTime()
}
function tagBegin (name) {
tmp[name] = getNow();
}
function tagEnd (name) {
var pre = perf.time[name];
if (!pre) {
pre = 0;
}
perf.time[name] = pre + getNow() - tmp[name];
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* istanbul ignore next */
var pseudoId = 0;
/**
* get scoped class style map from stylesheets in <head>.
*/
function getHeadStyleMap () {
{
tagBegin('getHeadStyleMap');
}
var needToRemoveStyleSheetNodes = [];
var styleSheetsArr = Array.from(document.styleSheets || []).filter(function (styleSheet) {
return styleSheet.ownerNode.getAttribute('weex-scanned') !== '1'
});
var res = Array.from(styleSheetsArr)
.reduce(function (pre, styleSheet) {
styleSheet.ownerNode.setAttribute('weex-scanned', 1);
/**
* why not using styleSheet.rules || styleSheet.cssRules to get css rules ?
* because weex's components defined non-standard style attributes, which is
* auto ignored when access rule.cssText.
* another reason not to use cssRules directy:
* @issue: https://stackoverflow.com/questions/21642277/security-error-the-operation-is-insecure-in-firefox-document-stylesheets
*/
if (
// css in a link. just ignore this. probably a link stylesheet.
(styleSheet.ownerNode.tagName.toLowerCase() === 'link')
|| !styleSheet.ownerNode.textContent
// pseudo class styleSheet node is generated by weex. just ignore it.
|| styleSheet.ownerNode.id.match(/weex-pseudo-\d+/)) {
return pre
}
/**
* start to analyze it's content.
*/
var strArr = trimComment(styleSheet.ownerNode.textContent.trim()).split(/}/);
var len = strArr.length;
var rules = [];
for (var i = 0; i < len; i++) {
var str = strArr[i];
if (!str || str.match(/^\s*$/)) {
continue
}
/**
* should match these cases:
* .a[data-v-xxx] { color: red; }
* .a[data-v-xxx]:active { color: green; }
* .a[data-v-xxx], .b[data-v-xxx] { color: red; }
*
* should not match these cases:
* .a { color: red; }
* etc.
*/
var match = str.match(/((?:,?\s*\.[\w-]+\[data-v-\w+\](?::\w+)?)+)\s*({[^}]+)/);
if (!match) {
// not the vue static class styles map. so acquire no rules for this styleSheet.
// just jump through this styleSheet and go to analyzing next.
return pre
}
var clsNms = match[1].split(',').map(function (n) { return n.trim(); });
var cssText = match[2].replace(/[{}]/g, '').trim();
var clsNmsIdx = 0;
var clsNmsLen = clsNms.length;
while (clsNmsIdx < clsNmsLen) {
rules.push({
selectorText: clsNms[clsNmsIdx],
cssText: cssText
});
clsNmsIdx++;
}
}
Array.from(rules).forEach(function (rule) {
var selector = rule.selectorText || '';
var isPseudo = false;
if (selector.match(/:(?:active|focus|enabled|disabled)/)) {
isPseudo = true;
}
var styleObj = trimComment(rule.cssText).split(';')
.reduce(function (styleObj, statement) {
statement = statement.trim();
if (statement && statement.indexOf('/*') <= -1) {
var resArr = statement.split(':').map(function (part) { return part.trim(); });
styleObj[resArr[0]] = resArr[1];
}
return styleObj
}, {});
if (isPseudo) {
var txt = Object.keys(styleObj).reduce(function (pre, cur) {
return pre + cur + ":" + (styleObj[cur]) + "!important;"
}, '');
appendCss((selector + "{" + txt + "}"), ("weex-pseudo-" + (pseudoId++)));
}
var objMap = !isPseudo ? pre : pre.pseudo;
var res = objMap[selector];
if (!res) {
objMap[selector] = styleObj;
}
else {
extend(objMap[selector], styleObj);
}
});
/**
* remove this styleSheet node since it's in the styleMap already. And this style
* should only be fetched and used from styleMap to generate the final combined
* component style, not from the stylesheet itself.
*/
needToRemoveStyleSheetNodes.push(styleSheet.ownerNode);
return pre
}, { pseudo: {}});
if (!window._no_remove_style_sheets) {
needToRemoveStyleSheetNodes.forEach(function (node) {
node.parentNode.removeChild(node);
});
}
else {
console.warn("[vue-render] you've defined '_no_remove_style_sheets' and the v-data-xx stylesheets will not be removed.");
}
{
tagEnd('getHeadStyleMap');
}
return res
}
// export function getScopeIds (context) {
// const arr = []
// let ctx = context
// let scopeId
// while (ctx) {
// scopeId = ctx.$options._scopeId
// scopeId && arr.push(scopeId)
// ctx = ctx.$options.parent
// }
// return arr
// }
function getScopeId (vnode) {
return vnode.context.$options._scopeId
}
/**
* get style in <style scoped> tags for this component.
*/
function getScopeStyle (vnode, classNames) {
var scopeId = getScopeId(vnode);
var style = {};
var styleMap = weex._styleMap || {};
var clsNmsIdx = 0;
var clsNmsLen = classNames.length;
while (clsNmsIdx < clsNmsLen) {
var cls = "." + (classNames[clsNmsIdx]) + "[" + scopeId + "]";
var map = styleMap[cls];
map && extendTruthy(style, map);
clsNmsIdx++;
}
return camelizeKeys(style)
}
function getStyle (vnode, extract) {
var data = vnode.data || {};
var staticClassNames = (typeof data.staticClass === 'string') ? data.staticClass.split(' ') : (data.staticClass || []);
var classNames = (typeof data.class === 'string') ? data.class.split(' ') : (data.class || []);
var clsNms = staticClassNames.concat(classNames);
var style = normalizeStyle(getScopeStyle(vnode, clsNms));
/**
* cache static style and bind style.
* cached staticStyle (including style and staticStyle) has already been normalized
* in $processStyle. So there's no need to normalize it again.
*/
if (!data.cached) {
// cache staticStyle once in the beginning.
data.cached = extendTruthy({}, data.staticStyle);
}
// cache binding style every time since the binding style is variable.
extendTruthy(data.cached, data.style);
extend(style, data.cached);
data.staticStyle = style;
if (extract) {
delete data.staticStyle;
delete data.style;
}
return style
}
/**
* get style merged with static styles, binding styles, and scoped class styles,
* with keys in camelcase.
*/
function getComponentStyle (context, extract) {
if (!context.$vnode) {
{
return console.error('[vue-render] getComponentStyle failed: no $vnode in context.')
}
return {}
}
var style = {};
var vnode = context.$vnode;
while (vnode) {
extend(style, getStyle(vnode, extract));
vnode = vnode.parent;
}
style = autoPrefix(style);
/**
* when prefixed value is a array, it should be applied to element
* during the next tick.
* e.g.
* background-image: linear-gradient(to top,#f5fefd,#ffffff);
* will generate:
* {
* backgroundImage: [
* "-webkit-linear-gradient(to top,#f5fefd,#ffffff)",
* "-moz-linear-gradient(to top,#f5fefd,#ffffff)",
* "linear-gradient(to top,#f5fefd,#ffffff)"]
* }
*/
var loop = function ( k ) {
if (Array.isArray(style[k])) {
var vals = style[k];
context.$nextTick(function () {
var el = context.$el;
if (el) {
for (var i = 0; i < vals.length; i++) {
el.style[k] = vals[i];
}
}
});
if (k !== 'position') { delete style[k]; }
}
};
for (var k in style) loop( k );
/**
* If position is 'sticky', then add it to the stickyChildren of the parent scroller.
*/
var pos = style.position;
var reg = /sticky$/;
if (pos === 'fixed') {
context.$nextTick(function () {
var el = context.$el;
if (el) {
el.classList.add('weex-fixed');
}
});
}
else if (isArray(pos) && pos[0].match(reg) || (pos + '').match(reg)) {
delete style.position;
// use native sticky.
if (supportSticky()) {
context.$nextTick(function () {
var el = context.$el;
if (el) {
el.classList.add('weex-ios-sticky');
}
});
}
// use re-implementation of sticky.
else if (!context._stickyAdded) {
var uid = context._uid;
var scroller = getParentScroller(context);
if (scroller) {
context._stickyAdded = true;
if (!scroller._stickyChildren) {
scroller._stickyChildren = {};
}
scroller._stickyChildren[uid] = context;
}
context.$nextTick(function () {
var el = context.$el;
if (el) {
context._initOffsetTop = el.offsetTop;
}
});
}
}
return style
}
function extractComponentStyle (context) {
return getComponentStyle(context, true)
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* remove text nodes in the nodes array.
* @param {Array} nodes
* @return {Array} nodes without text nodes.
*/
function trimTextVNodes (vnodes) {
if (isArray(vnodes)) {
return vnodes.filter(function (vnode) { return !!vnode.tag; })
}
return vnodes
}
/**
* get listeners from on config and v-on binding.
* v-on binding has a priority over on config.
* @param {vnode} vnode
* @param {String} evt: event name.
*/
function getListeners (vnode, evt) {
var handlers = [];
while (vnode) {
if (vnode.data && vnode.data.on) {
var handler = vnode.data.on[evt];
handler && handlers.push(handler);
}
if (vnode.componentOptions && vnode.componentOptions.listeners) {
var handler$1 = vnode.componentOptions.listeners[evt];
handler$1 && handlers.push(handler$1);
}
vnode = vnode.parent;
}
return handlers
}
/**
* Instead of vue's invoker, this function should check if the binding function
* has a _weex_hook flag. If there is one, the handler should not be triggered.
* @param {Array | Function} fns
*/
function applyFns (fns) {
var args = [], len$1 = arguments.length - 1;
while ( len$1-- > 0 ) args[ len$1 ] = arguments[ len$1 + 1 ];
if (Array.isArray(fns)) {
var cloned = fns.slice();
var len = cloned.length;
for (var i = 0; i < len; i++) {
var fn = cloned[i];
if (fn._weex_hook) {
continue
}
fn.apply(null, args);
}
}
else {
if (!fns._weex_hook) {
fns.apply(null, args);
}
}
}
/**
* emit native events to enable v-on.
* @param {VComponent} context: which one to emit a event on.
* @param {array | object} events: extra events. You can pass in multiple arguments here.
*/
function createEventMap (context) {
var events = [], len$1 = arguments.length - 1;
while ( len$1-- > 0 ) events[ len$1 ] = arguments[ len$1 + 1 ];
var eventMap = {};
/**
* Bind some original type event to your specified type event handler.
* e.g. bind 'tap' event to 'click' event listener: bindFunc('tap')('click').
* Or bind certian event with your specified handler: bindFunc('click', someFunction)
*/
var bindFunc = function (originalType) {
return function (listenTo) {
var handler;
var evtName = originalType || listenTo;
if (typeof listenTo === 'function') {
handler = listenTo;
}
else if (typeof listenTo === 'string') {
handler = function (e) {
/**
* use '_triggered' to control actural bubbling (allow original bubbling).
*/
if (e._triggered) {
return
}
/**
* trigger the closest parent which has bound event handlers.
*/
var vm = context;
while (vm) {
var ons = getListeners(vm._vnode || vm.$vnode, listenTo);
var len = ons.length;
if (len > 0) {
var idx = 0;
while (idx < len) {
var on = ons[idx];
applyFns(on.fns, e);
idx++;
}
// once a parent node (or self node) has triggered the handler, then
// it stops bubbling immediately, and a '_triggered' object is set.
e._triggered = {
el: vm.$el
};
return
}
vm = vm.$parent;
}
};
// flag to distinguish from user-binding listeners.
handler._weex_hook = true;
}
if (!eventMap[evtName]) {
eventMap[evtName] = [];
}
eventMap[evtName].push(handler);
}
};
/**
* component's extra event bindings. This is mostly for the needs of component's
* own special behaviours. These handlers will be processed after the user's
* corresponding event handlers.
*/
if (events) {
var len = events.length;
for (var i = 0; i < len; i++) {
var extra = events[i];
if (isArray(extra)) {
extra.forEach(bindFunc());
}
else if (typeof extra === 'object') {
for (var key in extra) {
bindFunc(key)(extra[key]);
}
}
}
}
return eventMap
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var core$1 = Object.freeze({
getHeadStyleMap: getHeadStyleMap,
getScopeId: getScopeId,
getScopeStyle: getScopeStyle,
getComponentStyle: getComponentStyle,
extractComponentStyle: extractComponentStyle,
trimTextVNodes: trimTextVNodes,
applyFns: applyFns,
createEventMap: createEventMap
});
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var lazyloadWatched = false;
function watchLazyload () {
lazyloadWatched = true
; [
'scroll',
// 'transitionend',
// 'webkitTransitionEnd',
// 'animationend',
// 'webkitAnimationEnd',
'resize'
].forEach(function (evt) {
window.addEventListener(evt, getThrottleLazyload(25, document.body));
});
}
var warned = false;
var notePage = 'https://gist.github.com/MrRaindrop/5a805a067146609e5cfd4d64d775d693#file-weex-vue-render-config-for-vue-loader-js';
function warnProcessStyle () {
if (!warned) {
warned = true;
var page = window._process_style_note_page || notePage;
console.warn("[vue-render]: you should add vue-loader config with $processStyle to enable inline styles's "
+ "normalization. see " + page + " If you already did this, please ignore this message.");
}
}
var idCnt = 0;
var base$1 = {
beforeCreate: function beforeCreate () {
if (!lazyloadWatched) {
watchLazyload();
}
},
updated: function updated () {
if (this._rootId) {
var el = this.$el;
if (el.nodeType === 1
&& el.className.indexOf('weex-root') <= -1) {
el.classList.add('weex-root');
el.setAttribute('data-wx-root-id', this._rootId);
}
}
/**
* since the updating of component may affect the layout, the lazyloading should
* be fired.
*/
this._fireLazyload();
},
mounted: function mounted () {
if (this === this.$root) {
var rootId = "wx-root-" + (idCnt++);
if (!weex._root) {
weex._root = {};
}
weex._root[rootId] = this;
this._rootId = rootId;
var el = this.$el;
if (el.nodeType !== 1) {
return
}
el.classList.add('weex-root');
el.setAttribute('data-wx-root-id', rootId);
this._fireLazyload(el);
}
// give warning for not using $processStyle in vue-loader config.
if (!warned && !window._style_processing_added) {
warnProcessStyle();
}
// bind attrs to $el.
var i, j;
if (this.$el && (i = j = this.$vnode) && (i = i.data) && (j = j.componentOptions)) {
this.$el.attrs = extend({}, i.attrs, j.propsData);
}
watchAppear(this, true);
},
destroyed: function destroyed () {
/**
* if the destroyed element is above another panel with images inside, and the images
* moved into the viewport, then the lazyloading should be triggered.
*/
if (this._rootId) {
delete weex._root[this._rootId];
delete this._rootId;
}
this._fireLazyload();
triggerDisappear(this);
},
methods: {
_fireLazyload: function _fireLazyload (el) {
getThrottleLazyload(25, el || document.body)();
}
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* get a beforeCreate hook, which has a mark to identify the hook function itself.
*/
function getIdentifiedBeforeCreate () {
var disposed = {}; // disposed components. Already scanned.
function beforeCreate () {
/**
* get static class style map from document's styleSheets.
* Weex.on will create a Vue instance. In this case we'll ignore it, since
* it's not sure whether the scoped style has already attached to head or not.
*/
var tagName = this.$options && this.$options._componentTag;
/**
* For vue-loader ^11.3.x, there's no injectStyle function. The styleSheet
* is already injected into the head. Just scan it.
*/
// async component.
if ((this.$vnode && this.$vnode.data && this.$vnode.data.tag === 'component')
|| (this === this.$root && this.$options && !this._firstScanned)) {
this._firstScanned = true;
extend(weex._styleMap, getHeadStyleMap());
}
/**
* For vue-loader ^12.0, the injectStyle function is hooked. We should scan
* style map after the injectStyle hook called.
*/
if (((this === this.$root && this.$options)
|| (tagName
&& !weex._components[tagName]
&& !disposed[tagName]))
&& !this._secondScanned) {
disposed[tagName] = 1;
this._secondScanned = true;
var hooks = this.$options.beforeCreate;
var len = hooks.length;
var thisHookIdx = 0; // index of this hook in the hooks array.
for (; thisHookIdx < len; thisHookIdx++) {
if (hooks[thisHookIdx]._styleMixin) { break }
}
if (thisHookIdx !== len - 1) {
var func = hooks[len - 1];
hooks[len - 1] = function () {
// call the original injectStyle hook.
func.call(this);
// scan the new appended styleSheet.
extend(weex._styleMap, getHeadStyleMap());
hooks[len - 1] = func;
};
}
}
}
beforeCreate._styleMixin = true;
return beforeCreate
}
var style = {
beforeCreate: getIdentifiedBeforeCreate(),
methods: {
$processStyle: function $processStyle (style) {
window._style_processing_added = true;
if (!style) {
return
}
return normalizeStyle(camelizeKeys(style))
},
_getParentRect: function _getParentRect () {
var parentElm = this.$options._parentElm;
return parentElm && parentElm.getBoundingClientRect()
}
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
//
// input and textare has some common api and event
var findEnterKeyType = function (key) {
var keys = ['default', 'go', 'next', 'search', 'send'];
if (keys.indexOf(key) > -1) {
return key
}
return 'done'
};
var inputCommon = {
methods: {
focus: function focus () {
this.$el && this.$el.focus();
},
blur: function blur () {
this.$el && this.$el.blur();
},
setSelectionRange: function setSelectionRange (start, end) {
try {
this.$el.setSelectionRange(start, end);
}
catch (e) {
{
console.warn("[vue-render] setSelectionRange is not supported.");
}
}
},
getSelectionRange: function getSelectionRange (callback) {
try {
var selection = window.getSelection();
var str = selection.toString();
var selectionStart = this.$el.value.indexOf(str);
var selectionEnd = selectionStart === -1 ? selectionStart : selectionStart + str.length;
callback && callback({
selectionStart: selectionStart,
selectionEnd: selectionEnd
});
}
catch (e) {
callback && callback(new Error('[vue-render] getSelection is not supported.'));
}
},
getEditSelectionRange: function getEditSelectionRange (callback) {
return this.getSelectionRange(callback)
},
// support enter key event
createKeyboardEvent: function createKeyboardEvent (events) {
var customKeyType = this.returnKeyType;
var self = this;
if (this._events['return']) {
var keyboardEvents = {
'keyup': function (ev) {
var code = ev.keyCode;
var key = ev.key;
if (code === 13) {
if (!key || key.toLowerCase() === 'tab') {
ev.key = 'next';
}
var rightKeyType = findEnterKeyType(customKeyType);
ev.returnKeyType = rightKeyType;
ev.value = ev.target.value;
self.$emit('return', ev);
}
}
};
events = extend(events, keyboardEvents);
}
return events
}
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var sticky = {
destroyed: function destroyed () {
if (!this._stickyAdded) { return }
var scroller = getParentScroller(this);
if (!scroller) { return }
delete scroller._stickyChildren[this._uid];
},
methods: {
_addSticky: function _addSticky () {
var el = this.$el;
if (!el || el.nodeType === 1) {
{
console.error("[vue-render] $el doesn't exist to add sticky.");
}
return
}
el.classList.add('sticky');
if (!this._placeholder) {
this._placeholder = el.cloneNode(true);
}
this._placeholder.style.display = 'block';
this._placeholder.style.width = this.$el.offsetWidth + 'px';
this._placeholder.style.height = this.$el.offsetHeight + 'px';
el.parentNode.insertBefore(this._placeholder, this.$el);
},
_removeSticky: function _removeSticky () {
var el = this.$el;
if (!el || el.nodeType === 1) {
{
console.error("[vue-render] $el doesn't exist to remove sticky.");
}
return
}
el.classList.remove('sticky');
if (this._placeholder) {
this._placeholder.parentNode.removeChild(this._placeholder);
}
this._placeholder = null;
}
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
window.global = window;
window.weex = weex$4;
weex$4._styleMap = {}
; ['getComponentStyle',
'extractComponentStyle',
'createEventMap',
'trimTextVNodes'].forEach(function (method) {
weex$4[method] = core$1[method].bind(weex$4);
});
weex$4.mixins = {
inputCommon: inputCommon
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function setVue (vue) {
if (!vue) {
throw new Error('[Vue Render] Vue not found. Please make sure vue 2.x runtime is imported.')
}
global.weex.__vue__ = vue;
console.log(("[Vue Render] install Vue " + (vue.version) + "."));
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var gestureEvents = config.gestureEvents;
var nativeEvents = ['click', 'touchstart', 'touchmove', 'touchend'];
var needPassive = ['touchmove'];
var events = gestureEvents.concat(nativeEvents);
/**
* if el is a `<a>` element.
* @param {HTMLElement} el
*/
function isANode (el) {
return el.tagName.toLowerCase() === 'a'
}
function isInANode (el) {
var parent = el.parentElement;
while (parent && parent !== document.body) {
if (parent.tagName === 'A') { return true }
parent = parent.parentElement;
}
return false
}
/**
* get listeners from on config and v-on binding.
* v-on binding has a priority over on config.
* @param {vnode} vnode
* @param {String} evt: event name.
*/
function getListeners$1 (vnode, evt) {
var handlers = [];
while (vnode) {
if (vnode.data && vnode.data.on) {
var handler = vnode.data.on[evt];
handler && handlers.push(handler);
}
if (vnode.componentOptions && vnode.componentOptions.listeners) {
var handler$1 = vnode.componentOptions.listeners[evt];
handler$1 && handlers.push(handler$1);
}
vnode = vnode.parent;
}
return handlers
}
var _inited$1 = false;
function _init (doc) {
if (_inited$1) {
return
}
if (!doc) {
return
}
_inited$1 = true;
var _sp = supportsPassive();
events.forEach(function (evt) {
/**
* use capture for click handling, therefore there's a chance to handle
* it before any other listeners binding on document or document.body.
*/
var option =
evt === 'click'
? true : needPassive.indexOf(evt) > -1 && _sp
? { passive: true } : false;
doc.addEventListener(evt, function (e) {
var el = e.target;
var vm = el.__vue__;
while (!vm && el && el !== document.body) {
el = el.parentElement;
vm = el && el.__vue__;
}
if (!vm) { // not a vue component.
return
}
var disposed = false;
var evtName = e.type;
if (evtName === 'tap' && e._for !== 'weex') {
return
}
while (vm) {
var vnode = vm._vnode || vm.$vnode;
var elm = vm.$el;
var ons = getListeners$1(vnode, evtName === 'tap' ? 'click' : evtName);
var len = ons && ons.length;
if (len > 0) {
if (evtName !== 'click') {
for (var i = 0; i < len; i++) {
var handler = ons[i];
var newEvt = evtName === 'tap'
? createEvent(el, 'click')
: e;
newEvt._triggered = { target: elm };
applyFns(handler.fns, newEvt);
}
}
e._triggered = { target: elm };
disposed = true;
}
if (isANode(elm)
&& (evtName === 'click' || evtName === 'tap')) {
var href = elm.getAttribute('href');
var voidHrefReg = /^\s*javascript\s*:\s*void\s*(?:\(\s*0\s*\)|0)\s*;?\s*$/;
var prevent = elm.getAttribute('prevent');
if (window._should_intercept_a_jump && window._should_intercept_a_jump(elm)) {
// e._triggered should not be true since we left the intercepter to handle the event.
e._triggered = false;
disposed = true;
}
else if (href.match(voidHrefReg)
|| prevent === '' || prevent === 'true') {
e._triggered = false;
e.preventDefault();
}
else {
e._triggered = { target: elm };
disposed = true; // handled by default behavior for clicking on a element.
}
}
/**
* If the click handler is binding on a element inside a <a> element,
* then should prevent default.
*/
if (disposed && evtName === 'click' && isInANode(elm)) {
e._triggered = { target: elm };
e.preventDefault();
return
}
if (disposed) {
return
}
vm = vm.$parent;
}
}, option);
});
}
function init$3 () {
_init(document);
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* init weex.
* @param {Vue$2} Vue: Vue Constructor.
* @param {object} options: extend weex plugins.
* - components.
* - modules.
*/
var _inited = false;
function init$1 (Vue/*, options = {}*/) {
if (_inited) { return }
_inited = true;
setVue(Vue);
Vue.prototype.$getConfig = function () {
console.warn('[Vue Render] "this.$getConfig" is deprecated, please use "weex.config" instead.');
return weex.config
};
var htmlRegex = /^html:/i;
Vue.config.isReservedTag = function (tag) { return htmlRegex.test(tag); };
Vue.config.parsePlatformTagName = function (tag) { return tag.replace(htmlRegex, ''); };
function isWeexTag (tag) {
return !!weex._components[tag]
}
var oldGetTagNamespace = Vue.config.getTagNamespace;
Vue.config.getTagNamespace = function (tag) {
if (isWeexTag(tag)) {
return
}
return oldGetTagNamespace(tag)
};
Vue.mixin(base$1);
Vue.mixin(style);
Vue.mixin(sticky);
init$3();
}
// auto init in dist mode.
if (typeof window !== 'undefined' && window.Vue) {
init$1(window.Vue);
}
weex.init = init$1;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// import { validateStyles } from '../validator'
var _css = "\n.weex-a {\n text-decoration: none;\n}\n";
function getA (weex) {
var extractComponentStyle = weex.extractComponentStyle;
var trimTextVNodes = weex.trimTextVNodes;
return {
name: 'weex-a',
props: {
href: String
},
render: function render (createElement) {
/* istanbul ignore next */
// if ("development" === 'development') {
// validateStyles('a', this.$vnode.data && this.$vnode.data.staticStyle)
// }
return createElement('html:a', {
attrs: {
'weex-type': 'a',
href: this.href
},
staticClass: 'weex-a weex-ct',
staticStyle: extractComponentStyle(this)
}, trimTextVNodes(this.$slots.default))
},
_css: _css
}
}
var a = {
init: function init (weex) {
weex.registerComponent('a', getA(weex));
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var _css$1 = "\nbody > .weex-div {\n min-height: 100%;\n}\n";
function getDiv (weex) {
var extractComponentStyle = weex.extractComponentStyle;
var trimTextVNodes = weex.trimTextVNodes;
return {
name: 'weex-div',
render: function render (createElement) {
return createElement('html:div', {
attrs: { 'weex-type': 'div' },
staticClass: 'weex-div weex-ct',
staticStyle: extractComponentStyle(this)
}, trimTextVNodes(this.$slots.default))
},
_css: _css$1
}
}
var div = {
init: function init (weex) {
var div = getDiv(weex);
weex.registerComponent('div', div);
weex.registerComponent('container', div);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var extractComponentStyle$1;
var createEventMap$1;
var extend$2;
var IMG_NAME_BITS = 15;
var _css$2 = "\n.weex-image, .weex-img {\n background-repeat: no-repeat;\n background-position: 50% 50%;\n}\n";
/**
* get resize (stetch|cover|contain) related styles.
*/
function getResizeStyle (context) {
var stretch = '100% 100%';
var resize = context.resize || stretch;
var bgSize = ['cover', 'contain', stretch].indexOf(resize) > -1 ? resize : stretch;
// compatibility: http://caniuse.com/#search=background-size
return { 'background-size': bgSize }
}
function preProcessSrc (context, url, mergedStyle) {
// somehow the merged style in _prerender hook is gone.
// just return the original src.
if (!mergedStyle || !mergedStyle.width || !mergedStyle.height) {
return url
}
var width = mergedStyle.width;
var height = mergedStyle.height;
return context.processImgSrc && context.processImgSrc(url, {
width: parseFloat(width),
height: parseFloat(height),
quality: context.quality,
sharpen: context.sharpen,
original: context.original
}) || url
}
function download (url, callback) {
function success () {
callback && callback({
success: true
});
}
function fail (err) {
callback && callback({
success: false,
errorDesc: err + ''
});
}
try {
var isDataUrl = false;
var parts;
var name;
if (url.match(/data:image\/[^;]+;base64,/)) {
isDataUrl = true;
parts = url.split(',');
}
if (!isDataUrl) {
name = url
.replace(/\?[^?]+/, '')
.replace(/#[^#]+/, '')
.match(/([^/]+)$/);
}
else {
name = parts[1].substr(0, IMG_NAME_BITS);
}
var aEl = document.createElement('a');
aEl.href = url;
/**
* Not all browser support this 'download' attribute. In these browsers it'll jump
* to the photo url page and user have to longpress the photo to save it.
*/
aEl.download = name;
var clickEvt = new Event('click', { bubbles: false });
aEl.dispatchEvent(clickEvt);
success();
}
catch (err) {
fail(err);
}
}
var image = {
name: 'weex-image',
props: {
src: String,
placeholder: String,
resize: String,
quality: String,
sharpen: String,
original: [String, Boolean]
},
updated: function updated () {
this._fireLazyload();
},
mounted: function mounted () {
this._fireLazyload();
},
methods: {
save: function save (callback) {
download(this.src, callback);
}
},
render: function render (createElement) {
var resizeStyle = getResizeStyle(this);
var style = extractComponentStyle$1(this);
return createElement('figure', {
attrs: {
'weex-type': 'image',
'img-src': preProcessSrc(this, this.src, style),
'img-placeholder': preProcessSrc(this, this.placeholder, style)
},
on: createEventMap$1(this, ['load', 'error']),
staticClass: 'weex-image weex-el',
staticStyle: extend$2(style, resizeStyle)
})
},
_css: _css$2
};
var image$1 = {
init: function init (weex) {
extractComponentStyle$1 = weex.extractComponentStyle;
createEventMap$1 = weex.createEventMap;
extend$2 = weex.utils.extend;
weex.registerComponent('image', image);
weex.registerComponent('img', image);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview Input component.
* Support v-model only if vue version is larger than 2.2.0
*/
var extractComponentStyle$2;
var mapFormEvents$1;
var appendCss$1;
var ID_PREFIX_PLACEHOLDER_COLOR = 'wipt_plc_';
var ID_PREFIX_INPUT = 'wipt_';
var idCount = 0;
var _css$3 = "\n.weex-input, .weex-textarea {\n font-size: 0.426667rem;\n}\n.weex-input:focus, .weex-textarea:focus {\n outline: none;\n}\n";
function setPlaceholderColor (inputVm, placeholderColor) {
if (!placeholderColor) {
return
}
var vendors = [
'::-webkit-input-placeholder',
':-moz-placeholder',
'::-moz-placeholder',
':-ms-input-placeholder',
':placeholder-shown'
];
var id = inputVm._id;
appendCss$1(
vendors.map(function (vendor, idx) {
return ("#" + ID_PREFIX_INPUT + id + (vendors[idx]) + "{color:" + placeholderColor + ";}")
}).join(''),
("" + ID_PREFIX_PLACEHOLDER_COLOR + id),
true);
}
function processStyle (vm) {
var styles = extractComponentStyle$2(vm);
var phColor = styles.placeholderColor;
if (phColor) {
setPlaceholderColor(vm, phColor);
}
return styles
}
function getInput (weex) {
var ref = weex.mixins;
var inputCommon = ref.inputCommon;
return {
name: 'weex-input',
mixins: [inputCommon],
props: {
type: {
type: String,
default: 'text',
validator: function validator (value) {
return [
'email', 'number', 'password', 'search', 'tel', 'text', 'url', 'date',
'datetime', 'time' ].indexOf(value) !== -1
}
},
value: String,
placeholder: String,
disabled: {
type: [String, Boolean],
default: false
},
autofocus: {
type: [String, Boolean],
default: false
},
maxlength: [String, Number],
returnKeyType: String
},
render: function render (createElement) {
if (!this._id) {
this._id = idCount++;
}
var events = mapFormEvents$1(this);
return createElement('html:input', {
attrs: {
'weex-type': 'input',
id: ("" + ID_PREFIX_INPUT + (this._id)),
type: this.type,
value: this.value,
disabled: (this.disabled !== 'false' && this.disabled !== false),
autofocus: (this.autofocus !== 'false' && this.autofocus !== false),
placeholder: this.placeholder,
maxlength: this.maxlength,
'returnKeyType': this.returnKeyType
},
domProps: {
value: this.value
},
on: this.createKeyboardEvent(events),
staticClass: 'weex-input weex-el',
staticStyle: processStyle(this)
})
},
_css: _css$3
}
}
var input = {
init: function init (weex) {
extractComponentStyle$2 = weex.extractComponentStyle;
mapFormEvents$1 = weex.utils.mapFormEvents;
appendCss$1 = weex.utils.appendCss;
weex.registerComponent('input', getInput(weex));
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var _css$4 = "\n.weex-switch {\n border: 0.013333rem solid #dfdfdf;\n cursor: pointer;\n display: inline-block;\n position: relative;\n vertical-align: middle;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n box-sizing: content-box;\n background-clip: content-box;\n color: #64bd63;\n width: 1.333333rem;\n height: 0.8rem;\n background-color: white;\n border-color: #dfdfdf;\n box-shadow: #dfdfdf 0 0 0 0 inset;\n border-radius: 0.8rem;\n -webkit-transition: border 0.4s, box-shadow 0.4s, background-color 1.2s;\n -moz-transition: border 0.4s, box-shadow 0.4s, background-color 1.2s;\n transition: border 0.4s, box-shadow 0.4s, background-color 1.2s;\n}\n\n.weex-switch-checked {\n background-color: #64bd63;\n border-color: #64bd63;\n box-shadow: #64bd63 0 0 0 0.533333rem inset;\n}\n\n.weex-switch-checked.weex-switch-disabled {\n background-color: #A0CCA0;\n box-shadow: #A0CCA0 0 0 0 0.533333rem inset;\n}\n\n.weex-switch-disabled {\n background-color: #EEEEEE;\n}\n\n.weex-switch-inner {\n width: 0.8rem;\n height: 0.8rem;\n background: #fff;\n border-radius: 100%;\n box-shadow: 0 0.013333rem 0.04rem rgba(0, 0, 0, 0.4);\n position: absolute;\n top: 0;\n left: 0;\n -webkit-transition: background-color 0.4s, left 0.2s;\n -moz-transition: background-color 0.4s, left 0.2s;\n transition: background-color 0.4s, left 0.2s;\n}\n\n.weex-switch-checked > .weex-switch-inner {\n left: 0.533333rem;\n}\n";
function getSwitch (weex) {
var extractComponentStyle = weex.extractComponentStyle;
return {
name: 'weex-switch',
props: {
checked: {
type: [Boolean, String],
default: false
},
disabled: {
type: [Boolean, String],
default: false
}
},
data: function data () {
return {
isChecked: (this.checked !== 'false' && this.checked !== false),
isDisabled: (this.disabled !== 'false' && this.disabled !== false)
}
},
computed: {
wrapperClass: function wrapperClass () {
var classArray = ['weex-switch'];
this.isChecked && classArray.push('weex-switch-checked');
this.isDisabled && classArray.push('weex-switch-disabled');
return classArray.join(' ')
}
},
methods: {
toggle: function toggle () {
// TODO: handle the events
if (!this.isDisabled) {
this.isChecked = !this.isChecked;
this.$emit('change', { value: this.isChecked });
}
}
},
render: function render (createElement) {
var this$1 = this;
/* istanbul ignore next */
// if ("development" === 'development') {
// validateStyles('switch', this.$vnode.data && this.$vnode.data.staticStyle)
// }
return createElement('span', {
attrs: { 'weex-type': 'switch' },
on: {
click: function (event) {
this$1.$emit('click', event);
this$1.toggle();
}
},
staticClass: this.wrapperClass,
staticStyle: extractComponentStyle(this)
}, [createElement('small', { staticClass: 'weex-switch-inner' })])
},
_css: _css$4
}
}
var _switch = {
init: function init (weex) {
weex.registerComponent('switch', getSwitch(weex));
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var DEFAULT_OFFSET_ACCURACY = 10;
var DEFAULT_LOADMORE_OFFSET = 0;
function getThrottledScroll (context) {
var scale = weex.config.env.scale;
if (!context._throttleScroll) {
var wrapper = context.$refs.wrapper;
var inner = context.$refs.inner;
var preOffset = (context.scrollDirection === 'horizontal'
? wrapper.scrollLeft
: wrapper.scrollTop)
|| 0;
context._throttleScroll = weex.utils.throttle(function (evt) {
var offset = context.scrollDirection === 'horizontal'
? wrapper.scrollLeft
: wrapper.scrollTop;
var indent = parseInt(context.offsetAccuracy) * scale;
function triggerScroll () {
var rect = inner.getBoundingClientRect();
evt.contentSize = { width: rect.width, height: rect.height };
evt.contentOffset = {
x: wrapper.scrollLeft,
/**
* positive direciton for y-axis is down.
* so should use negative operation on scrollTop.
*
* (0,0)---------------> x
* |
* |
* |
* |
* v y
*
*/
y: -wrapper.scrollTop
};
context.$emit('scroll', evt);
}
if (Math.abs(offset - preOffset) >= indent) {
triggerScroll();
preOffset = offset;
}
}, 16, true);
}
return context._throttleScroll
}
var scrollable$1 = {
props: {
loadmoreoffset: {
type: [String, Number],
default: DEFAULT_LOADMORE_OFFSET,
validator: function validator (value) {
var val = parseInt(value);
return !isNaN(val) && val >= DEFAULT_LOADMORE_OFFSET
}
},
offsetAccuracy: {
type: [Number, String],
default: DEFAULT_OFFSET_ACCURACY,
validator: function validator$1 (value) {
var val = parseInt(value);
return !isNaN(val) && val >= DEFAULT_OFFSET_ACCURACY
}
}
},
created: function created () {
// should call resetLoadmore() to enable loadmore event.
this._loadmoreReset = true;
},
methods: {
updateLayout: function updateLayout () {
var wrapper = this.$refs.wrapper;
if (wrapper) {
var rect = wrapper.getBoundingClientRect();
this._wrapperWidth = rect.width;
this._wrapperHeight = rect.height;
}
var inner = this.$refs.inner;
var children = inner && inner.children;
if (inner) {
var rect$1 = inner.getBoundingClientRect();
this._innerWidth = rect$1.width;
this._innerHeight = rect$1.height;
}
var loadingEl = this._loading && this._loading.$el;
var refreshEl = this._refresh && this._refresh.$el;
if (loadingEl) {
this._innerHeight -= loadingEl.getBoundingClientRect().height;
}
if (refreshEl) {
this._innerHeight -= refreshEl.getBoundingClientRect().height;
}
// inner width is always the viewport width somehow in horizontal
// scoller, therefore the inner width should be reclaculated.
if (this.scrollDirection === 'horizontal' && children) {
this._innerWidth = weex.utils.getRangeWidth(inner);
}
},
resetLoadmore: function resetLoadmore () {
this._loadmoreReset = true;
},
/**
* process sticky children in scrollable components.
* current only support list and vertical scroller.
*/
processSticky: function processSticky () {
/**
* current browser support 'sticky' or '-webkit-sticky', so there's no need
* to do further more.
*/
if (weex.utils.supportSticky()) {
return
}
// current only support list and vertical scroller.
if (this.scrollDirection === 'horizontal') {
return
}
var stickyChildren = this._stickyChildren;
var len = stickyChildren && stickyChildren.length || 0;
if (len <= 0) { return }
var container = this.$el;
if (!container) { return }
var scrollTop = container.scrollTop;
var stickyChild;
for (var i = 0; i < len; i++) {
stickyChild = stickyChildren[i];
if (stickyChild._initOffsetTop < scrollTop) {
stickyChild._addSticky();
}
else {
stickyChild._removeSticky();
}
}
},
handleScroll: function handleScroll (event) {
weex.utils.getThrottleLazyload(25, this.$el, 'scroll')();
getThrottledScroll(this)(event);
this.processSticky();
// fire loadmore event.
var inner = this.$refs.inner;
if (inner) {
var innerLength = this.scrollDirection === 'horizontal'
? this._innerWidth
: this._innerHeight;
if (!this._innerLength) {
this._innerLength = innerLength;
}
if (this._innerLength !== innerLength) {
this._innerLength = innerLength;
this._loadmoreReset = true;
}
if (this._loadmoreReset && this.reachBottom(this.loadmoreoffset)) {
this._loadmoreReset = false;
this.$emit('loadmore', event);
}
}
},
reachTop: function reachTop () {
var wrapper = this.$refs.wrapper;
return (!!wrapper) && (wrapper.scrollTop <= 0)
},
reachBottom: function reachBottom (offset) {
var wrapper = this.$refs.wrapper;
var inner = this.$refs.inner;
offset = parseInt(offset || 0) * weex.config.env.scale;
if (wrapper && inner) {
var key = this.scrollDirection === 'horizontal'
? 'width'
: 'height';
var innerLength = this[("_inner" + (key[0].toUpperCase()) + (key.substr(1)))];
var wrapperLength = this[("_wrapper" + (key[0].toUpperCase()) + (key.substr(1)))];
var scrollOffset = this.scrollDirection === 'horizontal'
? wrapper.scrollLeft
: wrapper.scrollTop;
return scrollOffset >= innerLength - wrapperLength - offset
}
return false
},
handleTouchStart: function handleTouchStart (event) {
if (this._loading || this._refresh) {
var touch = event.changedTouches[0];
this._touchParams = {
reachTop: this.reachTop(),
reachBottom: this.reachBottom(),
startTouchEvent: touch,
startX: touch.pageX,
startY: touch.pageY,
timeStamp: event.timeStamp
};
}
},
handleTouchMove: function handleTouchMove (event) {
if (!this._touchParams || !this._refresh && !this._loading) {
return
}
var inner = this.$refs.inner;
var ref = this._touchParams;
var startY = ref.startY;
var reachTop = ref.reachTop;
var reachBottom = ref.reachBottom;
if (inner) {
var touch = event.changedTouches[0];
var offsetY = touch.pageY - startY;
var dir = offsetY > 0 ? 'down' : 'up';
this._touchParams.offsetY = offsetY;
if (this._refresh && (dir === 'down') && reachTop) {
this._refresh.pullingDown(offsetY);
}
else if (this._loading && (dir === 'up') && reachBottom) {
this._loading.pullingUp(-offsetY);
}
}
},
handleTouchEnd: function handleTouchEnd (event) {
if (!this._touchParams || !this._refresh && !this._loading) {
return
}
var inner = this.$refs.inner;
var ref = this._touchParams;
var startY = ref.startY;
var reachTop = ref.reachTop;
var reachBottom = ref.reachBottom;
if (inner) {
var touch = event.changedTouches[0];
var offsetY = touch.pageY - startY;
var dir = offsetY > 0 ? 'down' : 'up';
this._touchParams.offsetY = offsetY;
if (this._refresh && (dir === 'down') && reachTop) {
this._refresh.pullingEnd();
}
else if (this._loading && (dir === 'up') && reachBottom) {
this._loading.pullingEnd();
}
}
delete this._touchParams;
}
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var listMixin = {
methods: {
handleListScroll: function handleListScroll (event) {
this.handleScroll(event);
if (weex.utils.supportSticky()) {
return
}
var scrollTop = this.$el.scrollTop;
var h = this.$children.filter(function (vm) { return vm.$refs.header; });
if (h.length <= 0) {
return
}
for (var i = 0; i < h.length; i++) {
if (h[i].initTop < scrollTop) {
h[i].addSticky();
}
else {
h[i].removeSticky();
}
}
}
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function getList (weex) {
var extractComponentStyle = weex.extractComponentStyle;
var createEventMap = weex.createEventMap;
return {
name: 'weex-list',
mixins: [scrollable$1, listMixin],
computed: {
wrapperClass: function wrapperClass () {
var classArray = ['weex-list', 'weex-list-wrapper', 'weex-ct'];
this._refresh && classArray.push('with-refresh');
this._loading && classArray.push('with-loading');
return classArray.join(' ')
}
},
methods: {
createChildren: function createChildren (h) {
var slots = this.$slots.default || [];
this._cells = slots.filter(function (vnode) {
if (!vnode.tag || !vnode.componentOptions) { return false }
return true
});
return [
h('article', {
ref: 'inner',
staticClass: 'weex-list-inner weex-ct'
}, this._cells)
]
}
},
render: function render (createElement) {
var this$1 = this;
this.weexType = 'list';
this.$nextTick(function () {
this$1.updateLayout();
});
return createElement('main', {
ref: 'wrapper',
attrs: { 'weex-type': 'list' },
staticClass: this.wrapperClass,
on: createEventMap(this, {
scroll: this.handleListScroll,
touchstart: this.handleTouchStart,
touchmove: this.handleTouchMove,
touchend: this.handleTouchEnd
}),
staticStyle: extractComponentStyle(this)
}, this.createChildren(createElement))
}
}
}
var list$$1 = {
init: function init (weex) {
weex.registerComponent('list', getList(weex));
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function getScroller (weex) {
var extractComponentStyle = weex.extractComponentStyle;
var createEventMap = weex.createEventMap;
return {
name: 'weex-scroller',
mixins: [scrollable$1, listMixin],
props: {
scrollDirection: {
type: [String],
default: 'vertical',
validator: function validator (value) {
return ['horizontal', 'vertical'].indexOf(value) !== -1
}
},
scrollable: {
type: [Boolean],
default: true
}
},
computed: {
wrapperClass: function wrapperClass () {
var classArray = ['weex-scroller', 'weex-scroller-wrapper', 'weex-ct'];
if (this.scrollDirection === 'horizontal') {
classArray.push('weex-scroller-horizontal');
}
else {
classArray.push('weex-scroller-vertical');
}
if (!this.scrollable) {
classArray.push('weex-scroller-disabled');
}
return classArray.join(' ')
}
},
methods: {
createChildren: function createChildren (h) {
var slots = this.$slots.default || [];
this._cells = slots.filter(function (vnode) {
if (!vnode.tag || !vnode.componentOptions) { return false }
return true
});
return [
h('article', {
ref: 'inner',
staticClass: 'weex-scroller-inner weex-ct'
}, this._cells)
]
}
},
render: function render (createElement) {
var this$1 = this;
this.weexType = 'scroller';
/* istanbul ignore next */
// if ("development" === 'development') {
// validateStyles('scroller', this.$vnode.data && this.$vnode.data.staticStyle)
// }
this._cells = this.$slots.default || [];
this.$nextTick(function () {
this$1.updateLayout();
});
return createElement('main', {
ref: 'wrapper',
attrs: { 'weex-type': 'scroller' },
on: createEventMap(this, {
scroll: this.handleScroll,
touchstart: this.handleTouchStart,
touchmove: this.handleTouchMove,
touchend: this.handleTouchEnd
}),
staticClass: this.wrapperClass,
staticStyle: extractComponentStyle(this)
}, this.createChildren(createElement))
}
}
}
var scroller = {
init: function init (weex) {
weex.registerComponent('scroller', getScroller(weex));
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileoverview waterfall
* NOTE: only support full screen width waterfall.
*/
var NORMAL_GAP_SIZE = 32;
var DEFAULT_COLUMN_COUNT = 1;
function getWaterfall (weex) {
var extractComponentStyle = weex.extractComponentStyle;
var createEventMap = weex.createEventMap;
return {
name: 'weex-waterfall',
mixins: [scrollable$1],
props: {
/**
* specified gap size.
* value can be number or 'normal'. 'normal' (32px) by default.
*/
columnGap: {
type: [String, Number],
default: 'normal',
validator: function validator (val) {
if (!val || val === 'normal') {
return true
}
val = parseInt(val);
return !isNaN(val) && val > 0
}
},
/**
* the maximum column counts.
* value can be number or 'auto'. 1 by default.
*/
columnCount: {
type: [String, Number],
default: DEFAULT_COLUMN_COUNT,
validator: function validator$1 (val) {
val = parseInt(val);
return !isNaN(val) && val > 0
}
},
/**
* the mimimum column width.
* value can be number or 'auto'. 'auto' by default.
*/
columnWidth: {
type: [String, Number],
default: 'auto',
validator: function validator$2 (val) {
if (!val || val === 'auto') {
return true
}
val = parseInt(val);
return !isNaN(val) && val > 0
}
}
},
mounted: function mounted () {
this._nextTick();
},
updated: function updated () {
this.$nextTick(this._nextTick());
},
methods: {
_createChildren: function _createChildren (h, rootStyle) {
var this$1 = this;
var slots = this.$slots.default || [];
this._headers = [];
this._others = [];
this._cells = slots.filter(function (vnode) {
if (!vnode.tag || !vnode.componentOptions) { return false }
var tag = vnode.componentOptions.tag;
if (tag === 'refresh' || tag === 'loading') {
this$1[("_" + tag)] = vnode;
return false
}
if (tag === 'header') {
this$1._headers.push(vnode);
return false
}
if (tag !== 'cell') {
this$1._others.push(vnode);
return false
}
return true
});
this._reCalc(rootStyle);
this._genColumns(h);
var children = [];
this._refresh && children.push(this._refresh);
children = children
.concat(this._headers)
.concat(this._others);
children.push(h('html:div', {
ref: 'columns',
staticClass: 'weex-waterfall-inner-columns weex-ct'
}, this._columns));
this._loading && children.push(this._loading);
return [
h('article', {
ref: 'inner',
staticClass: 'weex-waterfall-inner weex-ct'
}, children)
]
},
_reCalc: function _reCalc (rootStyle) {
/**
* NOTE: columnGap and columnWidth can't both be auto.
* NOTE: the formula:
* totalWidth = n * w + (n - 1) * gap
* 1. if columnCount = n then calc w
* 2. if columnWidth = w then calc n
* 3. if columnWidth = w and columnCount = n then calc totalWidth
* 3.1 if totalWidth < ctWidth then increase columnWidth
* 3.2 if totalWidth > ctWidth then decrease columnCount
*/
var width, gap, cnt, ctWidth;
var scale = weex.config.env.scale;
var el = this.$el;
function getCtWidth (width, style) {
var padding = style.padding
? parseInt(style.padding) * 2
: parseInt(style.paddingLeft || 0) + parseInt(style.paddingRight || 0);
return width - padding
}
if (el && el.nodeType === 1) { // already mounted
var cstyle = window.getComputedStyle(el);
ctWidth = getCtWidth(el.getBoundingClientRect().width, cstyle);
}
else { // not mounted.
// only support full screen width for waterfall component.
ctWidth = getCtWidth(document.documentElement.clientWidth, rootStyle);
}
gap = this.columnGap;
if (gap && gap !== 'normal') {
gap = parseInt(gap);
}
else {
gap = NORMAL_GAP_SIZE;
}
gap = gap * scale;
width = this.columnWidth;
cnt = this.columnCount;
if (width && width !== 'auto') {
width = parseInt(width) * scale;
}
if (cnt && cnt !== 'auto') {
cnt = parseInt(cnt);
}
// 0. if !columnCount && !columnWidth
if (cnt === 'auto' && width === 'auto') {
{
console.warn("[vue-render] waterfall's columnWidth and columnCount shouldn't"
+ " both be auto at the same time.");
cnt = DEFAULT_COLUMN_COUNT;
width = ctWidth;
}
}
// 1. if columnCount = n then calc w.
else if (cnt !== 'auto' && width === 'auto') {
width = (ctWidth - (cnt - 1) * gap) / cnt;
}
// 2. if columnWidth = w then calc n.
else if (cnt === 'auto' && width !== 'auto') {
cnt = (ctWidth + gap) / (width + gap);
}
// 3. if columnWidth = w and columnCount = n then calc totalWidth
else if (cnt !== 'auto' && width !== 'auto') {
var totalWidth;
var adjustCountAndWidth = function () {
totalWidth = cnt * width + (cnt - 1) * gap;
if (totalWidth < ctWidth) {
width += (ctWidth - totalWidth) / cnt;
}
else if (totalWidth > ctWidth && cnt > 1) {
cnt--;
adjustCountAndWidth();
}
else if (totalWidth > ctWidth) { // cnt === 1
width = ctWidth;
}
};
adjustCountAndWidth();
}
this._columnCount = cnt;
this._columnWidth = width;
this._columnGap = gap;
},
_genColumns: function _genColumns (createElement) {
var this$1 = this;
this._columns = [];
var cells = this._cells;
var columnCnt = this._columnCount;
var len = cells.length;
var columnCells = this._columnCells = Array(columnCnt).join('.').split('.').map(function () { return [] });
// spread cells to the columns using simpole polling algorithm.
for (var i = 0; i < len; i++) {
(cells[i].data.attrs || (cells[i].data.attrs = {}))['data-cell'] = i;
columnCells[i % columnCnt].push(cells[i]);
}
for (var i$1 = 0; i$1 < columnCnt; i$1++) {
this$1._columns.push(createElement('html:div', {
ref: ("column" + i$1),
attrs: {
'data-column': i$1
},
staticClass: 'weex-ct',
staticStyle: {
width: this$1._columnWidth + 'px',
marginLeft: i$1 === 0 ? 0 : this$1._columnGap + 'px'
}
}, columnCells[i$1]));
}
},
_nextTick: function _nextTick () {
this._reLayoutChildren();
},
_reLayoutChildren: function _reLayoutChildren () {
var this$1 = this;
/**
* treat the shortest column bottom as the match standard.
* whichever cell exceeded it would be rearranged.
* 1. m = shortest column bottom.
* 2. get all cell ids who is below m.
* 3. calculate which cell should be in which column.
*/
var columnCnt = this._columnCount;
var columnDoms = [];
var columnAppendFragments = [];
var columnBottoms = [];
var minBottom = Number.MAX_SAFE_INTEGER;
var minBottomColumnIndex = 0;
// 1. find the shortest column bottom.
for (var i = 0; i < columnCnt; i++) {
var columnDom = this$1._columns[i].elm;
var lastChild = columnDom.lastElementChild;
var bottom = lastChild ? lastChild.getBoundingClientRect().bottom : 0;
columnDoms.push(columnDom);
columnBottoms[i] = bottom;
columnAppendFragments.push(document.createDocumentFragment());
if (bottom < minBottom) {
minBottom = bottom;
minBottomColumnIndex = i;
}
}
// 2. get all cell ids who is below m.
var belowCellIds = [];
var belowCells = {};
for (var i$1 = 0; i$1 < columnCnt; i$1++) {
if (i$1 === minBottomColumnIndex) {
continue
}
var columnDom$1 = columnDoms[i$1];
var cellsInColumn = columnDom$1.querySelectorAll('section.weex-cell');
var len = cellsInColumn.length;
for (var j = len - 1; j >= 0; j--) {
var cellDom = cellsInColumn[j];
var cellRect = cellDom.getBoundingClientRect();
if (cellRect.top > minBottom) {
var id = ~~cellDom.getAttribute('data-cell');
belowCellIds.push(id);
belowCells[id] = { elm: cellDom, height: cellRect.height };
columnBottoms[i$1] -= cellRect.height;
}
}
}
// 3. calculate which cell should be in which column and rearrange them
// in the dom tree.
belowCellIds.sort(function (a, b) { return a > b });
var cellIdsLen = belowCellIds.length;
function addToShortestColumn (belowCell) {
// find shortest bottom.
minBottom = Math.min.apply(Math, columnBottoms);
minBottomColumnIndex = columnBottoms.indexOf(minBottom);
var cellElm = belowCell.elm;
var cellHeight = belowCell.height;
columnAppendFragments[minBottomColumnIndex].appendChild(cellElm);
columnBottoms[minBottomColumnIndex] += cellHeight;
}
for (var i$2 = 0; i$2 < cellIdsLen; i$2++) {
addToShortestColumn(belowCells[belowCellIds[i$2]]);
}
for (var i$3 = 0; i$3 < columnCnt; i$3++) {
columnDoms[i$3].appendChild(columnAppendFragments[i$3]);
}
}
},
render: function render (createElement) {
var this$1 = this;
this.weexType = 'waterfall';
this._cells = this.$slots.default || [];
this.$nextTick(function () {
this$1.updateLayout();
});
var mergedStyle = extractComponentStyle(this);
return createElement('main', {
ref: 'wrapper',
attrs: { 'weex-type': 'waterfall' },
on: createEventMap(this, {
scroll: this.handleScroll,
touchstart: this.handleTouchStart,
touchmove: this.handleTouchMove,
touchend: this.handleTouchEnd
}),
staticClass: 'weex-waterfall weex-waterfall-wrapper weex-ct',
staticStyle: mergedStyle
}, this._createChildren(createElement, mergedStyle))
}
}
}
var waterfall = {
init: function init (weex) {
weex.registerComponent('waterfall', getWaterfall(weex));
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function getCell (weex) {
var extractComponentStyle = weex.extractComponentStyle;
return {
name: 'weex-cell',
render: function render (createElement) {
return createElement('section', {
attrs: { 'weex-type': 'cell' },
staticClass: 'weex-cell weex-ct',
staticStyle: extractComponentStyle(this)
}, this.$slots.default)
}
}
}
var cell = {
init: function init (weex) {
weex.registerComponent('cell', getCell(weex));
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function getHeader (weex) {
var extractComponentStyle = weex.extractComponentStyle;
var ref = weex.utils;
var supportSticky = ref.supportSticky;
return {
data: function data () {
return {
sticky: false,
initTop: 0,
placeholder: null,
supportSticky: supportSticky()
}
},
mounted: function mounted () {
this.initTop = this.$el.offsetTop;
this.placeholder = window.document.createElement('header');
},
updated: function updated () {
if (!this.sticky) {
this.initTop = this.$el.offsetTop;
}
},
methods: {
addSticky: function addSticky () {
this.sticky = true;
this.placeholder.style.display = 'block';
this.placeholder.style.width = this.$el.offsetWidth + 'px';
this.placeholder.style.height = this.$el.offsetHeight + 'px';
this.$el.parentNode.insertBefore(this.placeholder, this.$el);
},
removeSticky: function removeSticky () {
this.sticky = false;
try {
this.$el.parentNode.removeChild(this.placeholder);
}
catch (e) {
}
}
},
render: function render (createElement) {
/* istanbul ignore next */
// if ("development" === 'development') {
// validateStyles('header', this.$vnode.data && this.$vnode.data.staticStyle)
// }
return createElement('html:header', {
attrs: { 'weex-type': 'header' },
ref: 'header',
staticClass: 'weex-header weex-ct',
class: { 'weex-sticky': this.sticky, 'weex-ios-sticky': this.supportSticky },
staticStyle: extractComponentStyle(this)
}, this.$slots.default)
}
}
}
var header = {
init: function init (weex) {
weex.registerComponent('header', getHeader(weex));
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function getLoading () {
var extractComponentStyle = weex.extractComponentStyle;
return {
name: 'weex-loading',
props: {
display: {
type: String,
default: 'show',
validator: function validator (value) {
return ['show', 'hide'].indexOf(value) !== -1
}
}
},
data: function data () {
return {
height: -1,
viewHeight: 0
}
},
mounted: function mounted () {
this.viewHeight = this.$el.offsetHeight;
if (this.display === 'hide') {
this.height = 0;
}
else {
this.height = this.viewHeight;
}
},
watch: {
height: function height (val) {
this.$el.style.height = val + "px";
},
display: function display (val) {
if (val === 'hide') {
this.height = 0;
}
else {
this.height = this.viewHeight;
}
}
},
methods: {
pulling: function pulling (offsetY) {
if ( offsetY === void 0 ) offsetY = 0;
this.height = offsetY;
},
pullingUp: function pullingUp (offsetY) {
this.$el.style.transition = "height 0s";
this.pulling(offsetY);
},
pullingEnd: function pullingEnd () {
this.$el.style.transition = "height .2s";
if (this.height >= this.viewHeight) {
this.pulling(this.viewHeight);
this.$emit('loading');
}
else {
this.pulling(0);
}
},
getChildren: function getChildren () {
var children = this.$slots.default || [];
if (this.display === 'show') {
return children
}
return children.filter(function (vnode) {
return vnode.componentOptions
&& vnode.componentOptions.tag !== 'loading-indicator'
})
}
},
render: function render (createElement) {
this.$parent._loading = this;
return createElement('aside', {
ref: 'loading',
attrs: { 'weex-type': 'loading' },
staticClass: 'weex-loading weex-ct',
staticStyle: extractComponentStyle(this)
}, this.getChildren())
}
}
}
var loading = {
init: function init (weex) {
weex.registerComponent('loading', getLoading(weex));
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function getRefresh (weex) {
var extractComponentStyle = weex.extractComponentStyle;
var ref = weex.utils;
var createEvent = ref.createEvent;
return {
name: 'weex-refresh',
props: {
display: {
type: String,
default: 'show',
validator: function validator (value) {
return ['show', 'hide'].indexOf(value) !== -1
}
}
},
data: function data () {
return {
lastDy: 0,
viewHeight: 0,
height: -1
}
},
mounted: function mounted () {
this.viewHeight = this.$el.offsetHeight;
if (this.display === 'hide') {
this.height = 0;
}
else {
this.height = this.viewHeight;
}
},
watch: {
height: function height (val) {
this.$el.style.height = val + "px";
},
display: function display (val) {
if (val === 'hide') {
this.height = 0;
}
else {
this.height = this.viewHeight;
}
}
},
methods: {
pulling: function pulling (offsetY) {
if ( offsetY === void 0 ) offsetY = 0;
this.height = offsetY;
this.$emit('pullingdown', createEvent(this, 'pullingdown', {
dy: offsetY - this.lastDy,
pullingDistance: offsetY,
viewHeight: this.viewHeight
}));
this.lastDy = offsetY;
},
pullingDown: function pullingDown (offsetY) {
this.$el.style.transition = "height 0s";
this.pulling(offsetY);
},
pullingEnd: function pullingEnd () {
this.$el.style.transition = "height .2s";
if (this.height >= this.viewHeight) {
this.pulling(this.viewHeight);
this.$emit('refresh');
}
else {
this.pulling(0);
}
},
getChildren: function getChildren () {
var children = this.$slots.default || [];
if (this.display === 'show') {
return children
}
return children.filter(function (vnode) {
return vnode.componentOptions
&& vnode.componentOptions.tag !== 'loading-indicator'
})
}
},
render: function render (createElement) {
this.$parent._refresh = this;
return createElement('aside', {
ref: 'refresh',
attrs: { 'weex-type': 'refresh' },
staticClass: 'weex-refresh weex-ct',
staticStyle: extractComponentStyle(this)
}, this.getChildren())
}
}
}
var refresh = {
init: function init (weex) {
weex.registerComponent('refresh', getRefresh(weex));
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var extractComponentStyle$3;
var getRgb$1;
var loopArray$1;
var getStyleSheetById$1;
var _css$5 = "\n.weex-refresh-indicator,\n.weex-loading-indicator {\n width: 1rem !important;\n height: 1rem !important;\n -webkit-box-align: center;\n -moz-box-align: center;\n -webkit-align-items: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-box-pack: center;\n -moz-box-pack: center;\n -webkit-justify-content: center;\n -ms-flex-pack: center;\n justify-content: center;\n overflow: visible;\n background: none;\n}\n.weex-refresh-indicator:before,\n.weex-loading-indicator:before {\n display: block;\n content: '';\n font-size: 0.16rem;\n width: 0.5em;\n height: 0.5em;\n left: 0;\n top: 0;\n border-radius: 50%;\n position: relative;\n text-indent: -9999em;\n -webkit-animation: weex-spinner 1.1s infinite ease;\n -moz-animation: weex-spinner 1.1s infinite ease;\n animation: weex-spinner 1.1s infinite ease;\n}\n\n@-webkit-keyframes weex-spinner {\n 0%,\n 100% {\n box-shadow: 0em -1.3em 0em 0em #ffffff, 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2), 1.25em 0em 0 0em rgba(255, 255, 255, 0.2), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.2), 0em 1.25em 0 0em rgba(255, 255, 255, 0.2), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.2), -1.3em 0em 0 0em rgba(255, 255, 255, 0.5), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.7);\n }\n 11.25% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.7), 0.9em -0.9em 0 0em #ffffff, 1.25em 0em 0 0em rgba(255, 255, 255, 0.2), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.2), 0em 1.25em 0 0em rgba(255, 255, 255, 0.2), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.2), -1.3em 0em 0 0em rgba(255, 255, 255, 0.2), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.5);\n }\n 25% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.5), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.7), 1.25em 0em 0 0em #ffffff, 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.2), 0em 1.25em 0 0em rgba(255, 255, 255, 0.2), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.2), -1.3em 0em 0 0em rgba(255, 255, 255, 0.2), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2);\n }\n 37.5% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.2), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.5), 1.25em 0em 0 0em rgba(255, 255, 255, 0.7), 0.875em 0.875em 0 0em #ffffff, 0em 1.25em 0 0em rgba(255, 255, 255, 0.2), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.2), -1.3em 0em 0 0em rgba(255, 255, 255, 0.2), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2);\n }\n 50% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.2), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2), 1.25em 0em 0 0em rgba(255, 255, 255, 0.5), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.7), 0em 1.25em 0 0em #ffffff, -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.2), -1.3em 0em 0 0em rgba(255, 255, 255, 0.2), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2);\n }\n 61.25% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.2), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2), 1.25em 0em 0 0em rgba(255, 255, 255, 0.2), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.5), 0em 1.25em 0 0em rgba(255, 255, 255, 0.7), -0.9em 0.9em 0 0em #ffffff, -1.3em 0em 0 0em rgba(255, 255, 255, 0.2), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2);\n }\n 75% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.2), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2), 1.25em 0em 0 0em rgba(255, 255, 255, 0.2), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.2), 0em 1.25em 0 0em rgba(255, 255, 255, 0.5), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.7), -1.3em 0em 0 0em #ffffff, -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2);\n }\n 87.5% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.2), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2), 1.25em 0em 0 0em rgba(255, 255, 255, 0.2), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.2), 0em 1.25em 0 0em rgba(255, 255, 255, 0.2), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.5), -1.3em 0em 0 0em rgba(255, 255, 255, 0.7), -0.9em -0.9em 0 0em #ffffff;\n }\n}\n\n@keyframes weex-spinner {\n 0%,\n 100% {\n box-shadow: 0em -1.3em 0em 0em #ffffff, 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2), 1.25em 0em 0 0em rgba(255, 255, 255, 0.2), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.2), 0em 1.25em 0 0em rgba(255, 255, 255, 0.2), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.2), -1.3em 0em 0 0em rgba(255, 255, 255, 0.5), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.7);\n }\n 11.25% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.7), 0.9em -0.9em 0 0em #ffffff, 1.25em 0em 0 0em rgba(255, 255, 255, 0.2), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.2), 0em 1.25em 0 0em rgba(255, 255, 255, 0.2), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.2), -1.3em 0em 0 0em rgba(255, 255, 255, 0.2), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.5);\n }\n 25% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.5), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.7), 1.25em 0em 0 0em #ffffff, 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.2), 0em 1.25em 0 0em rgba(255, 255, 255, 0.2), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.2), -1.3em 0em 0 0em rgba(255, 255, 255, 0.2), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2);\n }\n 37.5% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.2), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.5), 1.25em 0em 0 0em rgba(255, 255, 255, 0.7), 0.875em 0.875em 0 0em #ffffff, 0em 1.25em 0 0em rgba(255, 255, 255, 0.2), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.2), -1.3em 0em 0 0em rgba(255, 255, 255, 0.2), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2);\n }\n 50% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.2), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2), 1.25em 0em 0 0em rgba(255, 255, 255, 0.5), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.7), 0em 1.25em 0 0em #ffffff, -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.2), -1.3em 0em 0 0em rgba(255, 255, 255, 0.2), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2);\n }\n 61.25% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.2), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2), 1.25em 0em 0 0em rgba(255, 255, 255, 0.2), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.5), 0em 1.25em 0 0em rgba(255, 255, 255, 0.7), -0.9em 0.9em 0 0em #ffffff, -1.3em 0em 0 0em rgba(255, 255, 255, 0.2), -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2);\n }\n 75% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.2), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2), 1.25em 0em 0 0em rgba(255, 255, 255, 0.2), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.2), 0em 1.25em 0 0em rgba(255, 255, 255, 0.5), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.7), -1.3em 0em 0 0em #ffffff, -0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2);\n }\n 87.5% {\n box-shadow: 0em -1.3em 0em 0em rgba(255, 255, 255, 0.2), 0.9em -0.9em 0 0em rgba(255, 255, 255, 0.2), 1.25em 0em 0 0em rgba(255, 255, 255, 0.2), 0.875em 0.875em 0 0em rgba(255, 255, 255, 0.2), 0em 1.25em 0 0em rgba(255, 255, 255, 0.2), -0.9em 0.9em 0 0em rgba(255, 255, 255, 0.5), -1.3em 0em 0 0em rgba(255, 255, 255, 0.7), -0.9em -0.9em 0 0em #ffffff;\n }\n}\n";
function getStyleSheet (spinnerVm) {
if (spinnerVm._styleSheet) {
return
}
spinnerVm._styleSheet = getStyleSheetById$1('weex-cmp-loading-indicator');
}
function setKeyframeColor (spinnerVm, val) {
getStyleSheet(spinnerVm);
var keyframeRules = computeKeyFrameRules(val);
var rules = spinnerVm._styleSheet.rules || spinnerVm._styleSheet.cssRules;
for (var i = 0, l = rules.length; i < l; i++) {
var item = rules.item(i);
if ((item.type === CSSRule.KEYFRAMES_RULE
|| item.type === CSSRule.WEBKIT_KEYFRAMES_RULE)
&& item.name === 'weex-spinner') {
var cssRules = item.cssRules;
for (var j = 0, m = cssRules.length; j < m; j++) {
var keyframe = cssRules[j];
if (keyframe.type === CSSRule.KEYFRAME_RULE
|| keyframe.type === CSSRule.WEBKIT_KEYFRAME_RULE) {
keyframe.style.boxShadow = keyframeRules[j];
}
}
}
}
}
function computeKeyFrameRules (rgb) {
if (!rgb) {
return
}
var scaleArr = [
'0em -1.3em 0em 0em',
'0.9em -0.9em 0 0em',
'1.25em 0em 0 0em',
'0.875em 0.875em 0 0em',
'0em 1.25em 0 0em',
'-0.9em 0.9em 0 0em',
'-1.3em 0em 0 0em',
'-0.9em -0.9em 0 0em'];
var colorArr = [
'1',
'0.2',
'0.2',
'0.2',
'0.2',
'0.2',
'0.5',
'0.7'].map(function (e) {
return 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + e + ')'
});
var rules = [];
var loop = function ( i ) {
var tmpColorArr = loopArray$1(colorArr, i, 'r');
rules.push(scaleArr.map(function (scaleStr, i) {
return scaleStr + ' ' + tmpColorArr[i]
}).join(', '));
};
for (var i = 0; i < scaleArr.length; i++) loop( i );
return rules
}
function processStyle$1 (vm) {
var style = extractComponentStyle$3(vm);
var color = style.color;
var rgb = color && getRgb$1(color);
if (rgb) {
setKeyframeColor(vm, rgb);
}
return style
}
var loadingIndicator = {
name: 'weex-loading-indicator',
render: function render (createElement) {
this.weexType = 'loading-indicator';
return createElement('mark', {
attrs: { 'weex-type': 'loading-indicator' },
staticClass: 'weex-loading-indicator weex-ct',
staticStyle: processStyle$1(this)
})
},
_css: _css$5
};
var loadingIndicator$1 = {
init: function init (weex) {
extractComponentStyle$3 = weex.extractComponentStyle;
getRgb$1 = weex.utils.getRgb;
loopArray$1 = weex.utils.loopArray;
getStyleSheetById$1 = weex.utils.getStyleSheetById;
weex.registerComponent('loading-indicator', loadingIndicator);
}
};
__$styleInject("/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nbody > .weex-list,\nbody > .weex-scroller,\nbody > .weex-waterfall {\n max-height: 100%;\n}\n\n.weex-list-wrapper,\n.weex-scroller-wrapper,\n.weex-waterfall-wrapper {\n -webkit-overflow-scrolling: touch;\n}\n\n.weex-list-wrapper,\n.weex-waterfall-wrapper {\n overflow-y: scroll !important;\n overflow-x: hidden !important;\n}\n\n.weex-list-inner,\n.weex-scroller-inner,\n.weex-waterfall-inner {\n -webkit-overflow-scrolling: touch;\n}\n\n.weex-waterfall-inner-columns {\n -webkit-flex-direction: row;\n -moz-box-orient: horizontal;\n -moz-box-direction: normal;\n -ms-flex-direction: row;\n flex-direction: row;\n -webkit-box-orient: horizontal;\n}\n\n.weex-scroller-wrapper.weex-scroller-vertical {\n overflow-x: hidden;\n overflow-y: scroll;\n}\n\n.weex-scroller-wrapper.weex-scroller-horizontal {\n overflow-x: scroll;\n overflow-y: hidden;\n}\n\n.weex-scroller-wrapper.weex-scroller-disabled {\n overflow-x: hidden;\n overflow-y: hidden;\n}\n\n.weex-scroller-horizontal .weex-scroller-inner {\n -webkit-flex-direction: row;\n -ms-flex-direction: row;\n -moz-box-orient: horizontal;\n -moz-box-direction: normal;\n flex-direction: row;\n -webkit-box-orient: horizontal;\n height: 100%;\n}\n\n.weex-cell {\n width: 100%;\n}\n\n.weex-refresh,\n.weex-loading {\n -webkit-box-align: center;\n -webkit-align-items: center;\n -moz-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-box-pack: center;\n -webkit-justify-content: center;\n -moz-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n width: 100%;\n overflow: hidden;\n}\n",undefined);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var modules = [
list$$1,
scroller,
waterfall,
cell,
header,
loading,
refresh,
loadingIndicator$1
];
var scrollable = {
init: function init (weex) {
modules.forEach(function (mod) {
weex.install(mod);
});
}
};
__$styleInject("/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n \n.weex-slider-wrapper {\n overflow-x: hidden;\n overflow-y: visible;\n}\n\n.weex-slider-inner {\n width: 100%;\n height: 100%;\n overflow: visible;\n -webkit-flex-direction: row;\n -moz-box-orient: horizontal;\n -moz-box-direction: normal;\n -ms-flex-direction: row;\n flex-direction: row;\n -webkit-box-orient: horizontal;\n}\n\n.weex-slider-cell {\n width: 100%;\n height: 100%;\n position: absolute;\n top: 0px;\n left: 0px;\n background: transparent !important;\n overflow: hidden;\n -webkit-box-align: center;\n -webkit-align-items: center;\n -moz-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-box-pack: center;\n -webkit-justify-content: center;\n -moz-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n}\n\n.neighbor-cell {\n overflow: visible !important;\n}",undefined);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var TRANSITION_TIME = 400;
var NEIGHBOR_SCALE_TIME = 100;
var MAIN_SLIDE_OPACITY = 1;
var THROTTLE_SCROLL_TIME = 25;
var INTERVAL_MINIMUM = 200;
var slideMixin = {
created: function created () {
this._clones = [];
this.innerOffset = 0;
this._indicator = null;
},
beforeUpdate: function beforeUpdate () {
this._getWrapperSize();
},
updated: function updated () {
var children = this.$children;
var len = children && children.length;
if (children && len > 0) {
for (var i = 0; i < len; i++) {
var vm = children[i];
if (vm.$options._componentTag === 'indicator'
|| vm.$vnode.data.ref === 'indicator') {
vm._watcher.get();
break
}
}
}
weex.utils.fireLazyload(this.$el, true);
if (this._preIndex !== this.currentIndex) {
this._slideTo(this.currentIndex);
}
},
mounted: function mounted () {
this._getWrapperSize();
this._slideTo(this.currentIndex);
weex.utils.fireLazyload(this.$el, true);
},
methods: {
_getWrapperSize: function _getWrapperSize () {
var wrapper = this.$refs.wrapper;
if (wrapper) {
var rect = wrapper.getBoundingClientRect();
this._wrapperWidth = rect.width;
this._wrapperHeight = rect.height;
}
},
_formatChildren: function _formatChildren (createElement) {
var this$1 = this;
var children = this.$slots.default || [];
var indicatorVnode;
var cells = children.filter(function (vnode) {
if (!vnode.tag) { return false }
if (vnode.componentOptions && vnode.componentOptions.tag === 'indicator') {
indicatorVnode = vnode;
return false
}
return true
}).map(function (vnode) {
return createElement('li', {
ref: 'cells',
staticClass: ("weex-slider-cell weex-ct" + (this$1.isNeighbor ? ' neighbor-cell' : ''))
}, [vnode])
});
if (indicatorVnode) {
indicatorVnode.data.attrs = indicatorVnode.data.attrs || {};
indicatorVnode.data.attrs.count = cells.length;
indicatorVnode.data.attrs.active = this.currentIndex;
this._indicator = indicatorVnode;
}
return cells
},
_renderSlides: function _renderSlides (createElement) {
this._cells = this._formatChildren(createElement);
this.frameCount = this._cells.length;
return createElement(
'nav',
{
ref: 'wrapper',
attrs: { 'weex-type': this.isNeighbor ? 'slider-neighbor' : 'slider' },
on: weex.createEventMap(
this,
['scroll', 'scrollstart', 'scrollend'],
{
touchstart: this._handleTouchStart,
touchmove: weex.utils.throttle(weex.utils.bind(this._handleTouchMove, this), 25),
touchend: this._handleTouchEnd,
touchcancel: this._handleTouchCancel
}
),
staticClass: 'weex-slider weex-slider-wrapper weex-ct',
staticStyle: weex.extractComponentStyle(this)
},
[
createElement('ul', {
ref: 'inner',
staticClass: 'weex-slider-inner weex-ct'
}, this._cells),
this._indicator
]
)
},
// get standard index
_normalizeIndex: function _normalizeIndex (index) {
var newIndex = (index + this.frameCount) % this.frameCount;
return Math.min(Math.max(newIndex, 0), this.frameCount - 1)
},
_startAutoPlay: function _startAutoPlay () {
if (!this.autoPlay || this.autoPlay === 'false') {
return
}
if (this._autoPlayTimer) {
clearTimeout(this._autoPlayTimer);
this._autoPlayTimer = null;
}
var interval = parseInt(this.interval - TRANSITION_TIME - NEIGHBOR_SCALE_TIME);
interval = interval > INTERVAL_MINIMUM ? interval : INTERVAL_MINIMUM;
this._autoPlayTimer = setTimeout(weex.utils.bind(this._next, this), interval);
},
_stopAutoPlay: function _stopAutoPlay () {
if (this._autoPlayTimer) {
clearTimeout(this._autoPlayTimer);
this._autoPlayTimer = null;
}
},
_slideTo: function _slideTo (index, isTouchScroll) {
var this$1 = this;
if (this.frameCount <= 0) {
return
}
if (!this.infinite || this.infinite === 'false') {
if (index === -1 || index > (this.frameCount - 1)) {
this._slideTo(this.currentIndex);
return
}
}
if (!this._preIndex && this._preIndex !== 0) {
if (this._showNodes && this._showNodes[0]) {
this._preIndex = this._showNodes[0].index;
}
else {
this._preIndex = this.currentIndex;
}
}
if (this._sliding) {
return
}
this._sliding = true;
var newIndex = this._normalizeIndex(index);
var inner = this.$refs.inner;
var step = this._step = this.frameCount <= 1 ? 0 : this._preIndex - index;
if (inner) {
this._prepareNodes();
var translate = weex.utils.getTransformObj(inner).translate;
var match = translate && translate.match(/translate[^(]+\(([+-\d.]+)/);
var innerX = match && match[1] || 0;
var dist = innerX - this.innerOffset;
this.innerOffset += step * this._wrapperWidth;
// transform the whole slides group.
inner.style.webkitTransition = "-webkit-transform " + (TRANSITION_TIME / 1000) + "s ease-in-out";
inner.style.mozTransition = "transform " + (TRANSITION_TIME / 1000) + "s ease-in-out";
inner.style.transition = "transform " + (TRANSITION_TIME / 1000) + "s ease-in-out";
inner.style.webkitTransform = "translate3d(" + (this.innerOffset) + "px, 0, 0)";
inner.style.mozTransform = "translate3d(" + (this.innerOffset) + "px, 0, 0)";
inner.style.transform = "translate3d(" + (this.innerOffset) + "px, 0, 0)";
// emit scroll events.
if (!isTouchScroll) {
this._emitScrollEvent('scrollstart');
}
setTimeout(function () {
this$1._throttleEmitScroll(dist, function () {
this$1._emitScrollEvent('scrollend');
});
}, THROTTLE_SCROLL_TIME);
this._loopShowNodes(step);
setTimeout(function () {
if (this$1.isNeighbor) {
this$1._setNeighbors();
}
setTimeout(function () {
inner.style.webkitTransition = '';
inner.style.mozTransition = '';
inner.style.transition = '';
for (var i = this$1._showStartIdx; i <= this$1._showEndIdx; i++) {
var node = this$1._showNodes[i];
if (!node) { continue }
var elm = node.firstElementChild;
elm.style.webkitTransition = '';
elm.style.mozTransition = '';
elm.style.transition = '';
}
// clean cloned nodes and rearrange slide cells.
this$1._rearrangeNodes(newIndex);
}, NEIGHBOR_SCALE_TIME);
}, TRANSITION_TIME);
}
if (newIndex !== this._preIndex) {
this.$emit('change', weex.utils.createEvent(this.$el, 'change', {
index: newIndex
}));
}
},
_clearNodesOffset: function _clearNodesOffset () {
var this$1 = this;
var end = this._showEndIdx;
for (var i = this._showStartIdx; i <= end; i++) {
var node = this$1._showNodes[i];
node = node && node.firstElementChild;
if (!node) { continue }
weex.utils.addTransform(this$1._showNodes[i].firstElementChild, {
translate: 'translate3d(0px, 0px, 0px)'
});
}
},
_loopShowNodes: function _loopShowNodes (step) {
var this$1 = this;
if (!step || this.frameCount <= 1) {
return
}
var sign = step > 0 ? 1 : -1;
var i = step <= 0 ? this._showStartIdx : this._showEndIdx;
var end = step <= 0 ? this._showEndIdx : this._showStartIdx;
for (; i !== end - sign; i -= sign) {
var nextIdx = i + step;
this$1._showNodes[nextIdx] = this$1._showNodes[i];
this$1._showNodes[nextIdx]._showIndex = nextIdx;
delete this$1._showNodes[i];
}
this._showStartIdx += step;
this._showEndIdx += step;
},
_prepareNodes: function _prepareNodes () {
// test if the next slide towards the direction exists.
// e.g. currentIndex 0 -> 1: should prepare 4 slides: -1, 0, 1, 2
// if not, translate a node to here, or just clone it.
var step = this._step;
if (!this._inited) {
this._initNodes();
this._inited = true;
this._showNodes = {};
}
if (this.frameCount <= 1) {
this._showStartIdx = this._showEndIdx = 0;
var node = this._cells[0].elm;
node.style.opacity = 1;
node.style.zIndex = 99;
node.index = 0;
this._showNodes[0] = node;
node._inShow = true;
node._showIndex = 0;
return
}
var showCount = this._showCount = Math.abs(step) + 3;
this._showStartIdx = step <= 0 ? -1 : 2 - showCount;
this._showEndIdx = step <= 0 ? showCount - 2 : 1;
this._clearNodesOffset();
this._positionNodes(this._showStartIdx, this._showEndIdx, step);
},
_initNodes: function _initNodes () {
var total = this.frameCount;
var cells = this._cells;
for (var i = 0; i < total; i++) {
var node = cells[i].elm;
node.index = i;
node._inShow = false;
node.style.zIndex = 0;
node.style.opacity = 0;
}
},
_positionNodes: function _positionNodes (begin, end, step, anim) {
var this$1 = this;
var cells = this._cells;
var start = step <= 0 ? begin : end;
var stop = step <= 0 ? end : begin;
var sign = step <= 0 ? -1 : 1;
var cellIndex = this._preIndex + sign;
for (var i = start; i !== stop - sign; i = i - sign) {
var node = cells[this$1._normalizeIndex(cellIndex)].elm;
cellIndex = cellIndex - sign;
this$1._positionNode(node, i);
}
},
/**
* index: position index in the showing cells' view.
*/
_positionNode: function _positionNode (node, index) {
var holder = this._showNodes[index];
if (node._inShow && holder !== node) {
if (holder) { this._removeClone(holder); }
node = this._getClone(node.index);
}
else if (node._inShow) {
return
}
node._inShow = true;
var translateX = index * this._wrapperWidth - this.innerOffset;
weex.utils.addTransform(node, {
translate: ("translate3d(" + translateX + "px, 0px, 0px)")
});
node.style.zIndex = 99 - Math.abs(index);
node.style.opacity = 1;
node._showIndex = index;
this._showNodes[index] = node;
},
_getClone: function _getClone (index) {
var arr = this._clones[index];
if (!arr) {
this._clones[index] = arr = [];
}
if (arr.length <= 0) {
var origNode = this._cells[index].elm;
var clone = origNode.cloneNode(true);
clone._isClone = true;
clone._inShow = origNode._inShow;
clone.index = origNode.index;
clone.style.opacity = 0;
clone.style.zIndex = 0;
var ct = this.$refs.inner;
ct.appendChild(clone);
arr.push(clone);
}
return arr.pop()
},
_removeClone: function _removeClone (node) {
var idx = node.index;
this._hideNode(node);
var arr = this._clones[idx];
arr.push(node);
},
_hideNode: function _hideNode (node) {
node._inShow = false;
node.style.opacity = 0;
node.style.zIndex = 0;
},
/**
* hide nodes from begin to end in showArray.
* if it is clone node, just move the clone node to the buffer.
*/
_clearNodes: function _clearNodes (begin, end) {
var this$1 = this;
for (var i = begin; i <= end; i++) {
var node = this$1._showNodes[i];
if (!node) { return }
if (node._isClone) {
this$1._removeClone(node);
}
else if (!node._inShow) {
this$1._hideNode(node);
}
delete this$1._showNodes[i];
}
},
/**
* copy node style props (opacity and zIndex) and transform status from
* one element to another.
*/
_copyStyle: function _copyStyle (from, to, styles, transformExtra) {
if ( styles === void 0 ) styles = ['opacity', 'zIndex'];
if ( transformExtra === void 0 ) transformExtra = {};
weex.utils.extendKeys(to.style, from.style, styles);
var transObj = weex.utils.getTransformObj(from);
for (var k in transformExtra) {
transObj[k] = transformExtra[k];
}
weex.utils.addTransform(to, transObj);
var fromInner = from.firstElementChild;
var toInner = to.firstElementChild;
toInner.style.opacity = fromInner.style.opacity;
weex.utils.copyTransform(fromInner, toInner);
},
/**
* replace a clone node with the original node if it's not in use.
*/
_replaceClone: function _replaceClone (clone, pos) {
var this$1 = this;
var origNode = this._cells[clone.index].elm;
if (origNode._inShow) {
return
}
var origShowIndex = origNode._showIndex;
var styleProps = ['opacity', 'zIndex'];
var cl;
if (Math.abs(origShowIndex) <= 1) {
// leave a clone to replace the origNode in the show zone(-1 ~ 1).
cl = this._getClone(origNode.index);
this._copyStyle(origNode, cl);
this._showNodes[origShowIndex] = cl;
}
origNode._inShow = true;
var transObj = weex.utils.getTransformObj(clone);
transObj.translate = transObj.translate.replace(/[+-\d.]+[pw]x/, function ($0) {
return pos * this$1._wrapperWidth - this$1.innerOffset + 'px'
});
this._copyStyle(clone, origNode, styleProps, transObj);
this._removeClone(clone);
if (!cl) {
delete this._showNodes[origShowIndex];
}
this._showNodes[pos] = origNode;
origNode._showIndex = pos;
},
_rearrangeNodes: function _rearrangeNodes (newIndex) {
var this$1 = this;
if (this.frameCount <= 1) {
this._sliding = false;
this.currentIndex = 0;
return
}
// clear autoPlay timer (and restart after updated hook).
this._startAutoPlay();
/**
* clean nodes. replace current node with non-cloned node.
* set current index to the new index.
*/
var shows = this._showNodes;
for (var i = this._showStartIdx; i <= this._showEndIdx; i++) {
shows[i]._inShow = false;
}
for (var i$1 = -1; i$1 <= 1; i$1++) {
var node = shows[i$1];
if (!node._isClone) {
node._inShow = true;
}
else {
this$1._replaceClone(node, i$1);
}
}
this._clearNodes(this._showStartIdx, -2);
this._showStartIdx = -1;
this._clearNodes(2, this._showEndIdx);
this._showEndIdx = 1;
this._sliding = false;
// set current index to the new index.
this.currentIndex = newIndex;
this._preIndex = newIndex;
},
/**
* according to the attrs: neighborScale, neighborAlpha, neighborSpace.
* 1. apply the main cell transform effects.
* 2. set the previous cell and the next cell's positon, scale and alpha.
* 3. set other cells' scale and alpha.
*/
_setNeighbors: function _setNeighbors () {
var this$1 = this;
for (var i = this._showStartIdx; i <= this._showEndIdx; i++) {
var elm = this$1._showNodes[i].firstElementChild;
elm.style.webkitTransition = "all " + (NEIGHBOR_SCALE_TIME / 1000) + "s ease";
elm.style.mozTransition = "all " + (NEIGHBOR_SCALE_TIME / 1000) + "s ease";
elm.style.transition = "all " + (NEIGHBOR_SCALE_TIME / 1000) + "s ease";
var transObj = {
scale: ("scale(" + (i === 0 ? this$1.currentItemScale : this$1.neighborScale) + ")")
};
var translateX = (void 0);
if (!this$1._neighborWidth) {
this$1._neighborWidth = parseFloat(elm.style.width) || elm.getBoundingClientRect().width;
}
// calculate position offsets according to neighbor scales.
if (Math.abs(i) === 1) {
var dist = ((this$1._wrapperWidth - this$1._neighborWidth * this$1.neighborScale) / 2
+ this$1.neighborSpace * weex.config.env.scale) / this$1.neighborScale;
translateX = -i * dist;
}
else {
// clear position offsets.
translateX = 0;
}
transObj.translate = "translate3d(" + translateX + "px, 0px, 0px)";
weex.utils.addTransform(elm, transObj);
elm.style.opacity = i === 0 ? MAIN_SLIDE_OPACITY : this$1.neighborAlpha;
}
},
_next: function _next () {
var next = this.currentIndex + 1;
if (this.frameCount <= 1) {
next--;
}
this._slideTo(next);
},
_prev: function _prev () {
var prev = this.currentIndex - 1;
if (this.frameCount <= 1) {
prev++;
}
this._slideTo(prev);
},
_handleTouchStart: function _handleTouchStart (event) {
var touch = event.changedTouches[0];
this._stopAutoPlay();
var inner = this.$refs.inner;
this._touchParams = {
originalTransform: inner.style.webkitTransform
|| inner.style.mozTransform
|| inner.style.transform,
startTouchEvent: touch,
startX: touch.pageX,
startY: touch.pageY,
timeStamp: event.timeStamp
};
},
_handleTouchMove: function _handleTouchMove (event) {
var tp = this._touchParams;
if (!tp) { return }
if (this._sliding) {
{
console.warn("[vue-render] warn: can't scroll the slider during sliding.");
}
return
}
var ref = this._touchParams;
var startX = ref.startX;
var startY = ref.startY;
var touch = event.changedTouches[0];
var offsetX = touch.pageX - startX;
var offsetY = touch.pageY - startY;
tp.offsetX = offsetX;
tp.offsetY = offsetY;
var isV = tp.isVertical;
if (typeof isV === 'undefined') {
isV = tp.isVertical = Math.abs(offsetX) < Math.abs(offsetY);
if (!isV) {
this._emitScrollEvent('scrollstart');
}
}
// vertical scroll. just ignore it.
if (isV) {
return
}
// horizontal scroll. trigger scroll event.
event.preventDefault();
var inner = this.$refs.inner;
if (inner && offsetX) {
if (!this._nodesOffsetCleared) {
this._nodesOffsetCleared = true;
this._clearNodesOffset();
}
this._emitScrollEvent('scroll', {
offsetXRatio: offsetX / this._wrapperWidth
});
inner.style.webkitTransform = "translate3d(" + (this.innerOffset + offsetX) + "px, 0, 0)";
inner.style.mozTransform = "translate3d(" + (this.innerOffset + offsetX) + "px, 0, 0)";
inner.style.transform = "translate3d(" + (this.innerOffset + offsetX) + "px, 0, 0)";
}
},
_handleTouchEnd: function _handleTouchEnd (event) {
this._startAutoPlay();
var tp = this._touchParams;
if (!tp) { return }
var isV = tp.isVertical;
if (typeof isV === 'undefined') {
return
}
var inner = this.$refs.inner;
var offsetX = tp.offsetX;
if (inner) {
this._nodesOffsetCleared = false;
// TODO: test the velocity if it's less than 0.2.
var reset = Math.abs(offsetX / this._wrapperWidth) < 0.2;
var direction = offsetX > 0 ? 1 : -1;
var newIndex = reset ? this.currentIndex : (this.currentIndex - direction);
this._slideTo(newIndex, true);
}
delete this._touchParams;
},
_handleTouchCancel: function _handleTouchCancel (event) {
return this._handleTouchEnd(event)
},
_emitScrollEvent: function _emitScrollEvent (type, data) {
if ( data === void 0 ) data = {};
this.$emit(type, weex.utils.createEvent(this.$el, type, data));
},
_throttleEmitScroll: function _throttleEmitScroll (offset, callback) {
var this$1 = this;
var i = 0;
var throttleTime = THROTTLE_SCROLL_TIME;
var cnt = parseInt(TRANSITION_TIME / throttleTime) - 1;
var sign = offset > 0 ? 1 : -1;
var r = Math.abs(offset / this._wrapperWidth);
var throttledScroll = function () {
if (++i > cnt) {
return callback && callback.call(this$1)
}
var ratio = this$1._step === 0
? sign * r * (1 - i / cnt)
: sign * (r + (1 - r) * i / cnt);
this$1._emitScrollEvent('scroll', {
offsetXRatio: ratio
});
setTimeout(throttledScroll, THROTTLE_SCROLL_TIME);
};
throttledScroll();
}
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// import { validateStyles } from '../../validator'
// import indicator from './indicator'
var slider$1 = {
mixins: [slideMixin],
props: {
index: {
type: [String, Number],
default: 0
},
'auto-play': {
type: [String, Boolean],
default: false
},
interval: {
type: [String, Number],
default: 3000
},
infinite: {
type: [String, Boolean],
default: true
}
},
watch: {
index: function index () {
this.currentIndex = this._normalizeIndex(this.index);
}
},
data: function data () {
return {
frameCount: 0,
currentIndex: this.index
}
},
beforeCreate: function beforeCreate () {
this.weexType = 'slider';
},
render: function render (createElement) {
/* istanbul ignore next */
// if ("development" === 'development') {
// validateStyles('slider', this.$vnode.data && this.$vnode.data.staticStyle)
// }
return this._renderSlides(createElement)
}
};
var slider$2 = {
init: function init (weex) {
weex.registerComponent('slider', slider$1);
weex.registerComponent('cycleslider', slider$1);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var DEFAULT_NEIGHBOR_SPACE = 20;
var DEFAULT_NEIGHBOR_ALPHA = 0.6;
var DEFAULT_NEIGHBOR_SCALE = 0.8;
var DEFAULT_CURRENT_ITEM_SCALE = 0.9;
var sliderNeighbor = {
mixins: [slideMixin],
props: {
index: {
type: [String, Number],
default: 0
},
autoPlay: {
type: [String, Boolean],
default: false
},
interval: {
type: [String, Number],
default: 3000
},
infinite: {
type: [String, Boolean],
default: true
},
neighborSpace: {
type: [String, Number],
validator: function (val) {
val = parseFloat(val);
return !isNaN(val) && val > 0
},
default: DEFAULT_NEIGHBOR_SPACE
},
neighborAlpha: {
type: [String, Number],
validator: function (val) {
val = parseFloat(val);
return !isNaN(val) && val >= 0 && val <= 1
},
default: DEFAULT_NEIGHBOR_ALPHA
},
neighborScale: {
type: [String, Number],
validator: function (val) {
val = parseFloat(val);
return !isNaN(val) && val >= 0 && val <= 1
},
default: DEFAULT_NEIGHBOR_SCALE
},
currentItemScale: {
type: [String, Number],
validator: function (val) {
val = parseFloat(val);
return !isNaN(val) && val >= 0 && val <= 1
},
default: DEFAULT_CURRENT_ITEM_SCALE
}
},
watch: {
index: function index () {
this.currentIndex = this._normalizeIndex(this.index);
}
},
data: function data () {
return {
currentIndex: this.index,
frameCount: 0
}
},
beforeCreate: function beforeCreate () {
this.isNeighbor = true;
this.weexType = 'slider-neighbor';
},
render: function render (createElement) {
return this._renderSlides(createElement)
}
};
var neighbor = {
init: function init (weex) {
weex.registerComponent('slider-neighbor', sliderNeighbor);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var _css$6 = "\n.weex-indicator {\n position: absolute;\n z-index: 10;\n -webkit-flex-direction: row;\n -ms-flex-direction: row;\n -moz-box-orient: horizontal;\n -moz-box-direction: normal;\n flex-direction: row;\n -webkit-box-orient: horizontal;\n margin: 0;\n padding: 0;\n}\n\n.weex-indicator-item {\n display: inline-block;\n position: relative;\n border-radius: 50%;\n width: 0.266667rem;\n height: 0.266667rem;\n background-color: #BBBBBB;\n}\n.weex-indicator-item + .weex-indicator-item {\n margin-left: 0.133333rem;\n}\n\n.weex-indicator-item-active {\n background-color: blue;\n}\n";
var extractComponentStyle$4;
var extend$3;
var extendKeys$1;
function getIndicatorItemStyle (spec, isActive) {
var style = {};
style['background-color'] = spec[isActive ? 'itemSelectedColor' : 'itemColor'];
style['width'] = style['height'] = spec['itemSize'];
return style
}
function _render (context, h) {
var children = [];
var mergedStyle = extractComponentStyle$4(context);
var indicatorSpecStyle = extendKeys$1(
{},
mergedStyle,
['itemColor', 'itemSelectedColor', 'itemSize']
);
for (var i = 0; i < Number(context.count); ++i) {
var classNames = ['weex-indicator-item weex-el'];
var isActive = false;
if (i === Number(context.active)) {
classNames.push('weex-indicator-item-active');
isActive = true;
}
children.push(h('mark', {
staticClass: classNames.join(' '),
staticStyle: getIndicatorItemStyle(indicatorSpecStyle, isActive)
}));
}
context.$nextTick(function () {
_reLayout(this, _getVirtualRect(this, mergedStyle), _getLtbr(this, mergedStyle));
});
return h('nav', {
attrs: { 'weex-type': 'indicator' },
staticClass: 'weex-indicator weex-ct',
staticStyle: mergedStyle
}, children)
}
/**
* get indicator's virtual rect (width, height), which is the .
*/
function _getVirtualRect (context, mergedStyle) {
var ct = context._getParentRect();
var rect = ['width', 'height'].reduce(function (pre, key) {
var msv = mergedStyle && mergedStyle[key];
pre[key] = msv ? parseFloat(msv) : ct[key];
return pre
}, {});
return rect
}
/**
* get indicator's ltbr values (without units).
*/
function _getLtbr (context, mergedStyle) {
return ['left', 'top', 'bottom', 'right'].reduce(function (pre, key) {
var msv = mergedStyle && mergedStyle[key];
if (!msv && msv !== 0) { return pre }
pre[key] = parseFloat(msv);
return pre
}, {})
}
/**
* get indicator's rect (width, height).
*/
function _getIndicatorRect (el) {
var width, height;
if (el.children.length === 1) {
width = height = window.getComputedStyle(el.children[0]);
}
else {
var itemComputedStyle = window.getComputedStyle(el.children[1]);
var padding = parseFloat(itemComputedStyle.marginLeft);
height = parseFloat(itemComputedStyle.height);
width = el.children.length * (height + padding) - padding;
}
return { width: width, height: height }
}
/**
* calculate and reset indicator's width, height, and ltbr.
* @param {object} virtualRect. width and height of indicator's virtual rect box.
* @param {object} ltbr. the user specified left, top, bottom, right pixels (without units).
*/
function _reLayout (context, virtualRect, ltbr) {
var el = context.$el;
var rect = _getIndicatorRect(el);
var rectWithPx = Object.keys(rect).reduce(function (pre, key) {
pre[key] = rect[key] + 'px';
return pre
}, {});
extend$3(el.style, rectWithPx);
var axisMap = [{
dir: ltbr.left || ltbr.left === 0
? 'left' : ltbr.right || ltbr.right === 0
? 'right' : 'left',
scale: 'width'
}, {
dir: ltbr.top || ltbr.top === 0
? 'top' : ltbr.bottom || ltbr.bottom === 0
? 'bottom' : 'top',
scale: 'height'
}];
Object.keys(axisMap).forEach(function (key) {
var ref = axisMap[key];
var dir = ref.dir;
var scale = ref.scale;
el.style[dir] = (ltbr[dir] || 0) + virtualRect[scale] / 2 - rect[scale] / 2 + 'px';
});
}
var indicator = {
name: 'weex-indicator',
methods: {
show: function () {
this.$el.style.visibility = 'visible';
}
},
data: function data () {
return {
count: 0,
active: 0
}
},
render: function render (createElement) {
var ref = this.$vnode.data.attrs || {};
var count = ref.count;
var active = ref.active;
this.count = count;
this.active = active;
if (!this.count) { return }
return _render(this, createElement)
},
_css: _css$6
};
var indicator$1 = {
init: function init (weex) {
extractComponentStyle$4 = weex.extractComponentStyle;
extend$3 = weex.utils.extend;
extendKeys$1 = weex.utils.extendKeys;
weex.registerComponent('indicator', indicator);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var slider = {
init: function init (weex) {
weex.install(slider$2);
weex.install(neighbor);
weex.install(indicator$1);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview Impl of text component.
*
* Notes about the style 'height' and 'lines':
* if the computed value of 'height' is bigger than 'lines', than the text will
* be clipped according to the 'lines'. Otherwise, it'll be the 'height'.
*/
var _css$7 = "\n.weex-text {\n display: -webkit-box;\n display: -moz-box;\n -webkit-box-orient: vertical;\n -moz-box-orient: vertical;\n -moz-box-direction: normal;\n position: relative;\n white-space: pre-wrap; /* not using 'pre': support auto line feed. */\n font-size: 0.426667rem;\n word-wrap: break-word;\n overflow: hidden; /* it'll be clipped if the height is not high enough. */\n}\n";
/**
* Get text special styles (lines and text-overflow).
*/
function getTextSpecStyle (ms) {
if ( ms === void 0 ) ms = {};
var lines = parseInt(ms.lines) || 0;
var overflow = ms['text-overflow'] || 'ellipsis';
if (lines > 0) {
return {
overflow: 'hidden',
'text-overflow': overflow,
'-webkit-line-clamp': lines
}
}
}
function getText (weex) {
var extractComponentStyle = weex.extractComponentStyle;
var createEventMap = weex.createEventMap;
var ref = weex.utils;
var extend = ref.extend;
return {
name: 'weex-text',
props: {
lines: [Number, String],
value: [String]
},
render: function render (createElement) {
var style = extractComponentStyle(this);
var textSpecStyle = getTextSpecStyle(style);
return createElement('p', {
attrs: { 'weex-type': 'text' },
on: createEventMap(this),
staticClass: 'weex-text weex-el',
staticStyle: extend(style, textSpecStyle)
}, this.$slots.default || [this.value])
},
_css: _css$7
}
}
var text = {
init: function init (weex) {
weex.registerComponent('text', getText(weex));
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var _css$8 = "\n.weex-textarea {\n font-size: 0.426667rem\n}\n.weex-textarea:focus {\n outline: none;\n}\n";
function getTextarea (weex) {
var extractComponentStyle = weex.extractComponentStyle;
var createEventMap = weex.createEventMap;
var ref = weex.mixins;
var inputCommon = ref.inputCommon;
var ref$1 = weex.utils;
var extend = ref$1.extend;
var mapFormEvents = ref$1.mapFormEvents;
return {
name: 'weex-textarea',
mixins: [inputCommon],
props: {
value: String,
placeholder: String,
disabled: {
type: [String, Boolean],
default: false
},
autofocus: {
type: [String, Boolean],
default: false
},
rows: {
type: [String, Number],
default: 2
},
returnKeyType: String
},
render: function render (createElement) {
/* istanbul ignore next */
// if ("development" === 'development') {
// validateStyles('textarea', this.$vnode.data && this.$vnode.data.staticStyle)
// }
var events = extend(createEventMap(this), mapFormEvents(this));
return createElement('html:textarea', {
attrs: {
'weex-type': 'textarea',
value: this.value,
disabled: (this.disabled !== 'false' && this.disabled !== false),
autofocus: (this.autofocus !== 'false' && this.autofocus !== false),
placeholder: this.placeholder,
rows: this.rows,
'return-key-type': this.returnKeyType
},
domProps: {
value: this.value
},
on: this.createKeyboardEvent(events),
staticClass: 'weex-textarea weex-el',
staticStyle: extractComponentStyle(this)
})
},
_css: _css$8
}
}
var textarea = {
init: function init (weex) {
weex.registerComponent('textarea', getTextarea(weex));
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function getVideo (weex) {
var extractComponentStyle = weex.extractComponentStyle;
var createEventMap = weex.createEventMap;
return {
name: 'weex-video',
props: {
src: String,
playStatus: {
type: String,
default: 'pause',
validator: function validator (value) {
return ['play', 'pause'].indexOf(value) !== -1
}
},
autoplay: {
type: [String, Boolean],
default: false
},
autoPlay: {
type: [String, Boolean],
default: false
},
playsinline: {
type: [String, Boolean],
default: true
},
controls: {
type: [String, Boolean],
default: false
}
},
render: function render (createElement) {
if (this.playStatus === 'play') {
this.$nextTick(function () {
this.$el && this.$el.play();
});
}
else if (this.playStatus === 'pause') {
this.$nextTick(function () {
this.$el && this.$el.pause();
});
}
return createElement('html:video', {
attrs: {
'weex-type': 'video',
autoplay: ((this.autoplay !== 'false' && this.autoplay !== false)
|| (this.autoPlay !== 'false' && this.autoPlay !== false)),
'webkit-playsinline': this.playsinline,
controls: this.controls,
src: this.src
},
on: createEventMap(this, ['start', 'pause', 'finish', 'fail']),
staticClass: 'weex-video weex-el',
staticStyle: extractComponentStyle(this)
})
}
}
}
var video = {
init: function init (weex) {
weex.registerComponent('video', getVideo(weex));
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var _css$9 = "\n.weex-web {\n position: relative;\n width: 100%;\n height: 100%;\n border: none;\n box-sizing: border-box;\n}\n";
function getWeb (weex) {
var extractComponentStyle = weex.extractComponentStyle;
var createEventMap = weex.createEventMap;
var ref = weex.utils;
var createEvent = ref.createEvent;
return {
name: 'weex-web',
props: {
src: String
},
methods: {
// TODO: check cross-origin
goBack: function goBack () {
if (this.$el) {
this.$el.contentWindow.history.back();
}
},
goForward: function goForward () {
if (this.$el) {
this.$el.contentWindow.history.forward();
}
},
reload: function reload () {
if (this.$el) {
this.$el.contentWindow.history.reload();
}
}
},
mounted: function mounted () {
var this$1 = this;
if (this.$el) {
this.$emit('pagestart', createEvent(this.$el, 'pagestart', { url: this.src }));
this.$el.addEventListener('load', function (event) {
this$1.$emit('pagefinish', createEvent(this$1.$el, 'pagefinish', { url: this$1.src }));
});
}
},
render: function render (createElement) {
/* istanbul ignore next */
// if ("development" === 'development') {
// validateStyles('web', this.$vnode.data && this.$vnode.data.staticStyle)
// }
return createElement('iframe', {
attrs: {
'weex-type': 'web',
src: this.src
},
on: createEventMap(this, ['error']),
staticClass: 'weex-web weex-el',
staticStyle: extractComponentStyle(this)
})
},
_css: _css$9
}
}
var web = {
init: function init (weex) {
weex.registerComponent('web', getWeb(weex));
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var components = [
a,
div,
image$1,
input,
_switch,
scrollable,
slider,
text,
textarea,
video,
web
];
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var supportGeolocation = 'geolocation' in navigator;
var errorMsg = "[h5-render]: browser doesn't support geolocation.";
var geolocation = {
// options:
// - enableHighAccuracy optional, value is true or false, false by default.
// - timeout [none-native] optional, value is a number (milliseconds), default vaule is FINFINITY.
// - maximumAge [none-native] optional, value is a number (milliseconds), default value is 0.
getCurrentPosition: function getCurrentPosition (successCbId, errorCbId, options) {
var this$1 = this;
var successCb = function (pos) { return this$1.sender.performCallback(successCbId, pos); };
var errorCb = function (err) { return this$1.sender.performCallback(errorCbId, err); };
if (supportGeolocation) {
navigator.geolocation.getCurrentPosition(successCb, errorCb, options);
}
else {
console.warn(errorMsg);
errorCb(new Error(errorMsg));
}
},
// options: the same with `getCurrentPosition`.
watchPosition: function watchPosition (successCbId, errorCbId, options) {
var this$1 = this;
var successCb = function (pos) { return this$1.sender.performCallback(successCbId, pos, true); };
var errorCb = function (err) { return this$1.sender.performCallback(errorCbId, err); };
if (supportGeolocation) {
var id = navigator.geolocation.watchPosition(function (pos) {
pos.watchId = id;
successCb(pos);
}, errorCb, options);
}
else {
console.warn(errorMsg);
errorCb(new Error(errorMsg));
}
},
clearWatch: function clearWatch (watchId) {
if (supportGeolocation) {
navigator.geolocation.clearWatch(watchId);
}
else {
console.warn(errorMsg);
}
}
};
var meta = {
geolocation: [{
name: 'getCurrentPosition',
args: ['function', 'function', 'object']
}, {
name: 'watchPosition',
args: ['function', 'function', 'object']
}, {
name: 'clearWatch',
args: ['string']
}]
};
var geolocation$1 = {
init: function init (Weex) {
Weex.registerApiModule('geolocation', geolocation, meta);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* global localStorage */
var supportLocalStorage = typeof localStorage !== 'undefined';
var SUCCESS = 'success';
var FAILED = 'failed';
var INVALID_PARAM = 'invalid_param';
var UNDEFINED = 'undefined';
var storage = {
/**
* When passed a key name and value, will add that key to the storage,
* or update that key's value if it already exists.
* @param {string} key
* @param {string} value not null nor undifined,but 0 works.
* @param {function} callbackId
*/
setItem: function (key, value, callbackId) {
if (!supportLocalStorage) {
console.error('your browser is not support localStorage yet.');
return
}
var sender = this.sender;
if (!key || (!value && value !== 0)) {
sender.performCallback(callbackId, {
result: 'failed',
data: INVALID_PARAM
});
return
}
try {
localStorage.setItem(key, value);
sender.performCallback(callbackId, {
result: SUCCESS,
data: UNDEFINED
});
}
catch (e) {
// accept any exception thrown during a storage attempt as a quota error
sender.performCallback(callbackId, {
result: FAILED,
data: UNDEFINED
});
}
},
/**
* When passed a key name, will return that key's value.
* @param {string} key
* @param {function} callbackId
*/
getItem: function (key, callbackId) {
if (!supportLocalStorage) {
console.error('your browser is not support localStorage yet.');
return
}
var sender = this.sender;
if (!key) {
sender.performCallback(callbackId, {
result: FAILED,
data: INVALID_PARAM
});
return
}
var val = localStorage.getItem(key);
sender.performCallback(callbackId, {
result: val ? SUCCESS : FAILED,
data: val || UNDEFINED
});
},
/**
*When passed a key name, will remove that key from the storage.
* @param {string} key
* @param {function} callbackId
*/
removeItem: function (key, callbackId) {
if (!supportLocalStorage) {
console.error('your browser is not support localStorage yet.');
return
}
var sender = this.sender;
if (!key) {
sender.performCallback(callbackId, {
result: FAILED,
data: INVALID_PARAM
});
return
}
localStorage.removeItem(key);
sender.performCallback(callbackId, {
result: SUCCESS,
data: UNDEFINED
});
},
/**
* Returns an integer representing the number of data items stored in the Storage object.
* @param {function} callbackId
*/
length: function (callbackId) {
if (!supportLocalStorage) {
console.error('your browser is not support localStorage yet.');
return
}
var sender = this.sender;
var len = localStorage.length;
sender.performCallback(callbackId, {
result: SUCCESS,
data: len
});
},
/**
* Returns an array that contains all keys stored in Storage object.
* @param {function} callbackId
*/
getAllKeys: function (callbackId) {
if (!supportLocalStorage) {
console.error('your browser is not support localStorage yet.');
return
}
var sender = this.sender;
var _arr = [];
for (var i = 0; i < localStorage.length; i++) {
_arr.push(localStorage.key(i));
}
sender.performCallback(callbackId, {
result: SUCCESS,
data: _arr
});
}
};
var meta$1 = {
storage: [{
name: 'setItem',
args: ['string', 'string', 'function']
}, {
name: 'getItem',
args: ['string', 'function']
}, {
name: 'removeItem',
args: ['string', 'function']
}, {
name: 'length',
args: ['function']
}, {
name: 'getAllKeys',
args: ['function']
}]
};
var storage$1 = {
init: function (Weex) {
Weex.registerApiModule('storage', storage, meta$1);
}
};
(typeof window === 'undefined') && (window = {ctrl: {}, lib: {}});!window.ctrl && (window.ctrl = {});!window.lib && (window.lib = {});!function(a,b){function c(a){var b={};Object.defineProperty(this,"params",{set:function(a){if("object"==typeof a){for(var c in b){ delete b[c]; }for(var c in a){ b[c]=a[c]; }}},get:function(){return b},enumerable:!0}),Object.defineProperty(this,"search",{set:function(a){if("string"==typeof a){0===a.indexOf("?")&&(a=a.substr(1));var c=a.split("&");for(var d in b){ delete b[d]; }for(var e=0;e<c.length;e++){var f=c[e].split("=");if(void 0!==f[1]&&(f[1]=f[1].toString()),f[0]){ try{b[decodeURIComponent(f[0])]=decodeURIComponent(f[1]);}catch(g){b[f[0]]=f[1];} }}}},get:function(){var a=[];for(var c in b){ if(void 0!==b[c]){ if(""!==b[c]){ try{a.push(encodeURIComponent(c)+"="+encodeURIComponent(b[c]));}catch(d){a.push(c+"="+b[c]);} }else { try{a.push(encodeURIComponent(c));}catch(d){a.push(c);} } } }return a.length?"?"+a.join("&"):""},enumerable:!0});var c;Object.defineProperty(this,"hash",{set:function(a){"string"==typeof a&&(a&&a.indexOf("#")<0&&(a="#"+a),c=a||"");},get:function(){return c},enumerable:!0}),this.set=function(a){a=a||"";var b;if(!(b=a.match(new RegExp("^([a-z0-9-]+:)?[/]{2}(?:([^@/:?]+)(?::([^@/:]+))?@)?([^:/?#]+)(?:[:]([0-9]+))?([/][^?#;]*)?(?:[?]([^#]*))?([#][^?]*)?$","i")))){ throw new Error("Wrong uri scheme."); }this.protocol=b[1]||("object"==typeof location?location.protocol:""),this.username=b[2]||"",this.password=b[3]||"",this.hostname=this.host=b[4],this.port=b[5]||"",this.pathname=b[6]||"/",this.search=b[7]||"",this.hash=b[8]||"",this.origin=this.protocol+"//"+this.hostname;},this.toString=function(){var a=this.protocol+"//";return this.username&&(a+=this.username,this.password&&(a+=":"+this.password),a+="@"),a+=this.host,this.port&&"80"!==this.port&&(a+=":"+this.port),this.pathname&&(a+=this.pathname),this.search&&(a+=this.search),this.hash&&(a+=this.hash),a},a&&this.set(a.toString());}b.httpurl=function(a){return new c(a)};}(window,window.lib||(window.lib={}));
var index$5 = function (str) {
return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {
return '%' + c.charCodeAt(0).toString(16).toUpperCase();
});
};
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/
/* eslint-disable no-unused-vars */
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
var propIsEnumerable = Object.prototype.propertyIsEnumerable;
function toObject$2(val) {
if (val === null || val === undefined) {
throw new TypeError('Object.assign cannot be called with null or undefined');
}
return Object(val);
}
function shouldUseNative() {
try {
if (!Object.assign) {
return false;
}
// Detect buggy property enumeration order in older V8 versions.
// https://bugs.chromium.org/p/v8/issues/detail?id=4118
var test1 = new String('abc'); // eslint-disable-line no-new-wrappers
test1[5] = 'de';
if (Object.getOwnPropertyNames(test1)[0] === '5') {
return false;
}
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
var test2 = {};
for (var i = 0; i < 10; i++) {
test2['_' + String.fromCharCode(i)] = i;
}
var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
return test2[n];
});
if (order2.join('') !== '0123456789') {
return false;
}
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
var test3 = {};
'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
test3[letter] = letter;
});
if (Object.keys(Object.assign({}, test3)).join('') !==
'abcdefghijklmnopqrst') {
return false;
}
return true;
} catch (err) {
// We don't expect any of the above to throw, but better to be safe.
return false;
}
}
var index$7 = shouldUseNative() ? Object.assign : function (target, source) {
var arguments$1 = arguments;
var from;
var to = toObject$2(target);
var symbols;
for (var s = 1; s < arguments.length; s++) {
from = Object(arguments$1[s]);
for (var key in from) {
if (hasOwnProperty$1.call(from, key)) {
to[key] = from[key];
}
}
if (getOwnPropertySymbols) {
symbols = getOwnPropertySymbols(from);
for (var i = 0; i < symbols.length; i++) {
if (propIsEnumerable.call(from, symbols[i])) {
to[symbols[i]] = from[symbols[i]];
}
}
}
}
return to;
};
var strictUriEncode = index$5;
var objectAssign = index$7;
function encoderForArrayFormat(opts) {
switch (opts.arrayFormat) {
case 'index':
return function (key, value, index) {
return value === null ? [
encode(key, opts),
'[',
index,
']'
].join('') : [
encode(key, opts),
'[',
encode(index, opts),
']=',
encode(value, opts)
].join('');
};
case 'bracket':
return function (key, value) {
return value === null ? encode(key, opts) : [
encode(key, opts),
'[]=',
encode(value, opts)
].join('');
};
default:
return function (key, value) {
return value === null ? encode(key, opts) : [
encode(key, opts),
'=',
encode(value, opts)
].join('');
};
}
}
function parserForArrayFormat(opts) {
var result;
switch (opts.arrayFormat) {
case 'index':
return function (key, value, accumulator) {
result = /\[(\d*)\]$/.exec(key);
key = key.replace(/\[\d*\]$/, '');
if (!result) {
accumulator[key] = value;
return;
}
if (accumulator[key] === undefined) {
accumulator[key] = {};
}
accumulator[key][result[1]] = value;
};
case 'bracket':
return function (key, value, accumulator) {
result = /(\[\])$/.exec(key);
key = key.replace(/\[\]$/, '');
if (!result || accumulator[key] === undefined) {
accumulator[key] = [value];
return;
}
accumulator[key] = [].concat(accumulator[key], value);
};
default:
return function (key, value, accumulator) {
if (accumulator[key] === undefined) {
accumulator[key] = value;
return;
}
accumulator[key] = [].concat(accumulator[key], value);
};
}
}
function encode(value, opts) {
if (opts.encode) {
return opts.strict ? strictUriEncode(value) : encodeURIComponent(value);
}
return value;
}
function keysSorter(input) {
if (Array.isArray(input)) {
return input.sort();
} else if (typeof input === 'object') {
return keysSorter(Object.keys(input)).sort(function (a, b) {
return Number(a) - Number(b);
}).map(function (key) {
return input[key];
});
}
return input;
}
var extract = function (str) {
return str.split('?')[1] || '';
};
var parse = function (str, opts) {
opts = objectAssign({arrayFormat: 'none'}, opts);
var formatter = parserForArrayFormat(opts);
// Create an object with no prototype
// https://github.com/sindresorhus/query-string/issues/47
var ret = Object.create(null);
if (typeof str !== 'string') {
return ret;
}
str = str.trim().replace(/^(\?|#|&)/, '');
if (!str) {
return ret;
}
str.split('&').forEach(function (param) {
var parts = param.replace(/\+/g, ' ').split('=');
// Firefox (pre 40) decodes `%3D` to `=`
// https://github.com/sindresorhus/query-string/pull/37
var key = parts.shift();
var val = parts.length > 0 ? parts.join('=') : undefined;
// missing `=` should be `null`:
// http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters
val = val === undefined ? null : decodeURIComponent(val);
formatter(decodeURIComponent(key), val, ret);
});
return Object.keys(ret).sort().reduce(function (result, key) {
var val = ret[key];
if (Boolean(val) && typeof val === 'object' && !Array.isArray(val)) {
// Sort object keys, not values
result[key] = keysSorter(val);
} else {
result[key] = val;
}
return result;
}, Object.create(null));
};
var stringify = function (obj, opts) {
var defaults = {
encode: true,
strict: true,
arrayFormat: 'none'
};
opts = objectAssign(defaults, opts);
var formatter = encoderForArrayFormat(opts);
return obj ? Object.keys(obj).sort().map(function (key) {
var val = obj[key];
if (val === undefined) {
return '';
}
if (val === null) {
return encode(key, opts);
}
if (Array.isArray(val)) {
var result = [];
val.slice().forEach(function (val2) {
if (val2 === undefined) {
return;
}
result.push(formatter(key, val2, result.length));
});
return result.join('&');
}
return encode(key, opts) + '=' + encode(val, opts);
}).filter(function (x) {
return x.length > 0;
}).join('&') : '';
};
var index$4 = {
extract: extract,
parse: parse,
stringify: stringify
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* global lib, XMLHttpRequest */
/* deps: httpurl */
var utils$1;
var jsonpCnt = 0;
var ERROR_STATE = -1;
function _jsonp (config, callback, progressCallback) {
var cbName = 'jsonp_' + (++jsonpCnt);
var url;
if (!config.url) {
console.error('[h5-render] config.url should be set in _jsonp for \'fetch\' API.');
}
global[cbName] = (function (cb) {
return function (response) {
callback({
status: 200,
ok: true,
statusText: 'OK',
data: response
});
delete global[cb];
}
})(cbName);
var script = document.createElement('script');
try {
url = lib.httpurl(config.url);
}
catch (err) {
console.error('[h5-render] invalid config.url in _jsonp for \'fetch\' API: '
+ config.url);
}
url.params.callback = cbName;
script.type = 'text/javascript';
script.src = url.toString();
// script.onerror is not working on IE or safari.
// but they are not considered here.
script.onerror = (function (cb) {
return function (err) {
console.error('[h5-render] unexpected error in _jsonp for \'fetch\' API', err);
callback({
status: ERROR_STATE,
ok: false,
statusText: '',
data: ''
});
delete global[cb];
}
})(cbName);
var head = document.getElementsByTagName('head')[0];
head.insertBefore(script, null);
}
function _xhr (config, callback, progressCallback) {
var xhr = new XMLHttpRequest();
xhr.responseType = config.type;
xhr.open(config.method, config.url, true);
// cors cookie support
if (config.withCredentials === true) {
xhr.withCredentials = true;
}
var headers = config.headers || {};
for (var k in headers) {
xhr.setRequestHeader(k, headers[k]);
}
xhr.onload = function (res) {
callback({
status: xhr.status,
ok: xhr.status >= 200 && xhr.status < 300,
statusText: xhr.statusText,
data: xhr.response,
headers: xhr.getAllResponseHeaders().split('\n')
.reduce(function (obj, headerStr) {
var headerArr = headerStr.match(/(.+): (.+)/);
if (headerArr) {
obj[headerArr[1]] = headerArr[2];
}
return obj
}, {})
});
};
if (progressCallback) {
xhr.onprogress = function (e) {
progressCallback({
readyState: xhr.readyState,
status: xhr.status,
length: e.loaded,
total: e.total,
statusText: xhr.statusText,
headers: xhr.getAllResponseHeaders().split('\n')
.reduce(function (obj, headerStr) {
var headerArr = headerStr.match(/(.+): (.+)/);
if (headerArr) {
obj[headerArr[1]] = headerArr[2];
}
return obj
}, {})
});
};
}
xhr.onerror = function (err) {
console.error('[h5-render] unexpected error in _xhr for \'fetch\' API', err);
callback({
status: ERROR_STATE,
ok: false,
statusText: '',
data: ''
});
};
xhr.send(config.body || null);
}
var stream = {
/**
* sendHttp
* @deprecated
* Note: This API is deprecated. Please use stream.fetch instead.
* send a http request through XHR.
* @param {obj} params
* - method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD' | 'PATCH',
* - url: url requested
* @param {string} callbackId
*/
sendHttp: function (param, callbackId) {
if (typeof param === 'string') {
try {
param = JSON.parse(param);
}
catch (e) {
return
}
}
if (typeof param !== 'object' || !param.url) {
return console.error(
'[h5-render] invalid config or invalid config.url for sendHttp API')
}
var sender = this.sender;
var method = param.method || 'GET';
var xhr = new XMLHttpRequest();
xhr.open(method, param.url, true);
xhr.onload = function () {
sender.performCallback(callbackId, this.responseText);
};
xhr.onerror = function (error) {
return console.error('[h5-render] unexpected error in sendHttp API', error)
// sender.performCallback(
// callbackId,
// new Error('unexpected error in sendHttp API')
// )
};
xhr.send();
},
/**
* fetch
* use stream.fetch to request for a json file, a plain text file or
* a arraybuffer for a file stream. (You can use Blob and FileReader
* API implemented by most modern browsers to read a arraybuffer.)
* @param {object} options config options
* - method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD' | 'PATCH'
* - headers {obj}
* - url {string}
* - mode {string} 'cors' | 'no-cors' | 'same-origin' | 'navigate'
* - withCredentials {boolean}
* - body
* - type {string} 'json' | 'jsonp' | 'text'
* @param {string} callbackId
* @param {string} progressCallbackId
*/
fetch: function (options, callbackId, progressCallbackId) {
var DEFAULT_METHOD = 'GET';
var DEFAULT_MODE = 'cors';
var DEFAULT_TYPE = 'text';
var methodOptions = ['GET', 'POST', 'PUT', 'DELETE', 'HEAD', 'PATCH'];
var modeOptions = ['cors', 'no-cors', 'same-origin', 'navigate'];
var typeOptions = ['text', 'json', 'jsonp', 'arraybuffer'];
// const fallback = false // fallback from 'fetch' API to XHR.
var sender = this.sender;
var config = utils$1.extend({}, options);
// validate options.method
if (typeof config.method === 'undefined') {
config.method = DEFAULT_METHOD;
console.warn('[h5-render] options.method for \'fetch\' API has been set to '
+ 'default value \'' + config.method + '\'');
}
else if (methodOptions.indexOf((config.method + '')
.toUpperCase()) === -1) {
return console.error('[h5-render] options.method \''
+ config.method
+ '\' for \'fetch\' API should be one of '
+ methodOptions + '.')
}
// validate options.url
if (!config.url) {
return console.error('[h5-render] options.url should be set for \'fetch\' API.')
}
// validate body content for method 'GET'.
if (config.method.toUpperCase() === 'GET') {
var body = config.body;
if (utils$1.isPlainObject(body)) {
body = index$4.stringify(body);
}
var url = config.url;
var hashIdx = url.indexOf('#');
hashIdx <= -1 && (hashIdx = url.length);
var hash = url.substr(hashIdx);
if (hash && hash[0] === '#') {
hash = hash.substr(1);
}
url = url.substring(0, hashIdx);
if (body) {
url += (config.url.indexOf('?') <= -1 ? '?' : '&') + body;
}
url += '#' + hash;
config.url = url;
}
// validate options.mode
if (typeof config.mode === 'undefined') {
config.mode = DEFAULT_MODE;
}
else if (modeOptions.indexOf((config.mode + '').toLowerCase()) === -1) {
return console.error('[h5-render] options.mode \''
+ config.mode
+ '\' for \'fetch\' API should be one of '
+ modeOptions + '.')
}
// validate options.type
if (typeof config.type === 'undefined') {
config.type = DEFAULT_TYPE;
console.warn('[h5-render] options.type for \'fetch\' API has been set to '
+ 'default value \'' + config.type + '\'.');
}
else if (typeOptions.indexOf((config.type + '').toLowerCase()) === -1) {
return console.error('[h5-render] options.type \''
+ config.type
+ '\' for \'fetch\' API should be one of '
+ typeOptions + '.')
}
// validate options.headers
config.headers = config.headers || {};
if (!utils$1.isPlainObject(config.headers)) {
return console.error('[h5-render] options.headers should be a plain object')
}
// validate options.timeout
config.timeout = parseInt(config.timeout, 10) || 2500;
var _callArgs = [config, function (res) {
sender.performCallback(callbackId, res);
}];
if (progressCallbackId) {
_callArgs.push(function (res) {
// Set 'keepAlive' to true for sending continuous callbacks
sender.performCallback(progressCallbackId, res, true);
});
}
if (config.type === 'jsonp') {
_jsonp.apply(this, _callArgs);
}
else {
_xhr.apply(this, _callArgs);
}
}
};
var meta$2 = {
stream: [{
name: 'sendHttp',
args: ['object', 'function']
}, {
name: 'fetch',
args: ['object', 'function', 'function']
}]
};
var stream$1 = {
init: function (Weex) {
utils$1 = Weex.utils;
Weex.registerApiModule('stream', stream, meta$2);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
AUCTION:
taskQueue
Clipboard.setString() NOW not works, facing to user-act lose of taskQueue.
works in Chrome Firefox Opera. but not in Safari.
@see https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand#Browser_compatibility
Clipboard.getString() unimplemented. There is no easy way to do paste from clipboard to js variable.
So look out your app behavior, when downgrade to html5 render.
Any idea is welcome.
**/
var WEEX_CLIPBOARD_ID = '__weex_clipboard_id__';
var clipboard = {
getString: function (callbackId) {
// not supported in html5
console.log('clipboard.getString() is not supported now.');
},
setString: function (text) {
// not support safari
if (typeof text === 'string' && text !== '' && document.execCommand) {
var tempInput = element();
tempInput.value = text;
tempInput.select();
document.execCommand('copy');
// var out = document.execCommand('copy');
// console.log("execCommand out is " + out);
tempInput.value = '';
tempInput.blur();
}
else {
console.log('only support string input now');
}
}
};
function element () {
var tempInput = document.getElementById(WEEX_CLIPBOARD_ID);
if (!tempInput) {
tempInput = document.createElement('input');
tempInput.setAttribute('id', WEEX_CLIPBOARD_ID);
tempInput.style.cssText = 'height:1px;width:1px;border:none;';
// tempInput.style.cssText = "height:40px;width:300px;border:solid;"
document.body.appendChild(tempInput);
}
return tempInput
}
var meta$3 = {
clipboard: [{
name: 'getString',
args: ['function']
}, {
name: 'setString',
args: ['string']
}]
};
var clipboard$1 = {
init: function (Weex) {
Weex.registerApiModule('clipboard', clipboard, meta$3);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var event$1 = {
/**
* openUrl
* @param {string} url
*/
openURL: function (url) {
location.href = url;
}
};
var meta$4 = {
event: [{
name: 'openURL',
args: ['string']
}]
};
var eventModule = {
init: function (Weex) {
Weex.registerApiModule('event', event$1, meta$4);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var utils$2 = {};
var endEvent;
var styleName;
var EVENT_NAME_MAP = {
transition: 'transitionend',
WebkitTransition: 'webkitTransitionEnd',
MozTransition: 'mozTransitionEnd',
OTransition: 'oTransitionEnd',
msTransition: 'MSTransitionEnd'
};
function detectEvents () {
var testEl = document.createElement('div');
var style = testEl.style;
for (var name in EVENT_NAME_MAP) {
if (name in style) {
endEvent = EVENT_NAME_MAP[name];
styleName = name;
break
}
}
}
detectEvents();
function transitionOnce (vnode, config, callback) {
var nextFrame = utils$2.nextFrame;
var toCSSText = utils$2.toCSSText;
var autoPrefix = utils$2.autoPrefix;
var camelizeKeys = utils$2.camelizeKeys;
var normalizeStyle = utils$2.normalizeStyle;
var isArray = utils$2.isArray;
if (isArray(vnode)) {
{
console.warn('[vue-render] the ref passed to animation.transitionOnce is a array.');
}
vnode = vnode[0];
}
var duration = config.duration || 0; // ms
var timing = config.timingFunction || 'linear';
var delay = config.delay || 0; // ms
// TODO: parse transition properties
var transitionValue = "all " + duration + "ms " + timing + " " + delay + "ms";
var dom = vnode.$el;
// trigger image lazyloading by force.
dom && weex.utils.fireLazyload(dom, true);
var transitionEndHandler = function (event) {
event && event.stopPropagation();
if (endEvent) {
dom.removeEventListener(endEvent, transitionEndHandler);
dom.style[styleName] = '';
}
callback();
};
if (endEvent) {
dom.style[styleName] = transitionValue;
dom.addEventListener(endEvent, transitionEndHandler);
}
nextFrame(function () {
dom.style.cssText
+= toCSSText(autoPrefix(normalizeStyle(camelizeKeys(config.styles))) || {});
});
}
var animation = {
/**
* transition
* @param {String} vnode
* @param {Object} config
* @param {String} callback
*/
transition: function transition (vnode, config, callback) {
if (!config.styles) { return }
return transitionOnce(vnode, config, function () {
callback && callback();
})
}
};
var animation$1 = {
init: function init (weex) {
var extendKeys = weex.utils.extendKeys;
extendKeys(utils$2, weex.utils, [
'nextFrame',
'toCSSText',
'autoPrefix',
'camelizeKeys',
'normalizeStyle',
'isArray'
]);
weex.registerModule('animation', animation);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var utils$3 = {};
function getParentScroller$1 (vnode) {
if (!vnode) { return null }
var vm = vnode.$el
? vnode : vnode.elm
? vnode.componentInstance || vnode.context : null;
if (!vm) { return null }
var type = vm.$el && vm.$el.getAttribute('weex-type');
if (config.scrollableTypes.indexOf(type) > -1) {
return vm
}
return getParentScroller$1(vm.$parent)
}
function now () {
var now = window.performance && window.performance.now
? window.performance.now.bind(window.performance) : Date.now;
return now()
}
function scrollElement (dSuffix, position) {
if ((this === document.body) || (this === window)
&& window.scrollTo) {
return window.scrollTo(0, position)
}
this[("scroll" + dSuffix)] = position;
}
/**
* self invoked function that, given a context, steps through scrolling
* @method step
* @param {Object} context
*/
function step$1 (context) {
// call method again on next available frame
context.frame = window.requestAnimationFrame(step$1.bind(window, context));
var time = now();
var elapsed = (time - context.startTime) / 468;
// avoid elapsed times higher than one
elapsed = elapsed > 1 ? 1 : elapsed;
// apply easing to elapsed time
var value = ease(elapsed);
var currentPosition = context.startPosition + (context.position - context.startPosition) * value;
context.method.call(context.scrollable, context.dSuffix, currentPosition);
// return when end points have been reached
/**
* NOTE: should use ~~ to parse position number into integer. Otherwise
* this two float numbers maybe have a slicely little difference, which
* will cause this function never to stop.
*/
if (~~currentPosition === ~~context.position) {
window.cancelAnimationFrame(context.frame);
return
}
}
/**
* returns result of applying ease math function to a number
* @method ease
* @param {Number} k
* @returns {Number}
*/
function ease (k) {
return 0.5 * (1 - Math.cos(Math.PI * k))
}
var dom = {
/**
* scrollToElement
* @param {Vnode | VComponent} vnode
* @param {Object} options {offset:Number}
* ps: scroll-to has 'ease' and 'duration'(ms) as options.
*/
scrollToElement: function (vnode, options) {
var isArray = utils$3.isArray;
if (isArray(vnode)) {
{
console.warn('[vue-render] the ref passed to animation.transitionOnce is a array.');
}
vnode = vnode[0];
}
var scroller = getParentScroller$1(vnode);
var scrollDirection = scroller && scroller.scrollDirection || 'vertical';
var isWindow = !scroller;
var ct = isWindow ? document.body : scroller.$el;
var el = vnode.$el || vnode.elm;
if (ct && el) {
// if it's a list, then the listVnode.scrollDirection is undefined. just
// assum it is the default value 'vertical'.
var dSuffix = ({
horizontal: 'Left',
vertical: 'Top'
})[scrollDirection];
var ctRect = ct.getBoundingClientRect();
var elRect = el.getBoundingClientRect();
/**
* if it's a waterfall, and you want to scroll to a header, then just
* scroll to the top.
*/
if (scroller && scroller.weexType === 'waterfall' && scroller._headers && scroller._headers.indexOf(vnode.$vnode || vnode) > -1) {
// it's in waterfall. just scroll to the top.
elRect = ct.firstElementChild.getBoundingClientRect();
}
var dir = dSuffix.toLowerCase();
var offset = (isWindow ? 0 : ct[("scroll" + dSuffix)]) + elRect[dir] - ctRect[dir];
if (options) {
offset += options.offset && options.offset * weex.config.env.scale || 0;
// offset *= weex.config.env.scale /* adapt offset to different screen scales. */
}
else {
console.warn('[Vue Render] The second parameter of "scrollToElement" is required, '
+ 'otherwise it may not works well on native.');
}
if (options && options.animated === false) {
return scrollElement.call(ct, dSuffix, offset)
}
step$1({
scrollable: ct,
startTime: now(),
frame: null,
startPosition: isWindow ? window.pageYOffset : ct[("scroll" + dSuffix)],
position: offset,
method: scrollElement,
dSuffix: dSuffix
});
}
},
/**
* getComponentRect
* @param {String} vnode
* @param {Function} callback
*/
getComponentRect: function (vnode, callback) {
var isArray = utils$3.isArray;
if (isArray(vnode)) {
{
console.warn('[vue-render] the ref passed to animation.transitionOnce is a array.');
}
vnode = vnode[0];
}
var scale = window.weex.config.env.scale;
var info = {
result: false
};
var rectKeys = ['width', 'height', 'top', 'bottom', 'left', 'right'];
function recalc (rect) {
var res = {};
rectKeys.forEach(function (key) {
if (rect[key]) {
res[key] = rect[key] / scale;
}
});
return res
}
if (vnode && vnode === 'viewport') {
info.result = true;
info.size = recalc({
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight,
top: 0,
left: 0,
right: document.documentElement.clientWidth,
bottom: document.documentElement.clientHeight
});
info.contentSize = recalc({
width: document.documentElement.offsetWidth,
height: document.documentElement.offsetHeight
});
}
else if (vnode && vnode.$el) {
info.result = true;
info.size = recalc(vnode.$el.getBoundingClientRect());
if (vnode.$refs.inner) {
info.contentSize = recalc({
width: vnode.$refs.inner.offsetWidth,
height: vnode.$refs.inner.offsetHeight
});
}
else {
info.contentSize = recalc({
width: vnode.$el.offsetWidth,
height: vnode.$el.offsetHeight
});
}
}
var message = info.result ? info : {
result: false,
errMsg: 'Illegal parameter'
};
callback && callback(message);
return message
},
/**
* for adding fontFace
* @param {string} key fontFace
* @param {object} styles rules
*/
addRule: function (key, styles) {
var camelToKebab = utils$3.camelToKebab;
var appendCss = utils$3.appendCss;
key = camelToKebab(key);
var stylesText = '';
for (var k in styles) {
if (styles.hasOwnProperty(k)) {
stylesText += camelToKebab(k) + ':' + styles[k] + ';';
}
}
var styleText = "@" + key + "{" + stylesText + "}";
appendCss(styleText, 'dom-added-rules');
}
};
var dom$1 = {
init: function init (weex) {
var extendKeys = weex.utils.extendKeys;
extendKeys(utils$3, weex.utils, ['camelToKebab', 'appendCss', 'isArray']);
weex.registerModule('dom', dom);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* globalEvent API:
* @doc http://weex.apache.org/cn/references/modules/globalevent.html
*/
// track varies kinds of events and listeners.
var handlerTraker = {};
var globalEvent = {
/**
* addEventListener
* NOTE: one callback can only be bound to the same event once. Bind a callback twice doesn't
* mean it will be called twice when the event fired once.
* @param {string} evt - the event name to add a listener on.
*/
addEventListener: function addEventListener (evt, callback) {
if (!callback) {
{
console.error("[vue-render] missing callback arg in globalEvent.addEventListener.");
}
return
}
var handlers = handlerTraker[evt];
if (!handlers) {
handlers = handlerTraker[evt] = [];
}
var len = handlers.length;
for (var i = 0; i < len; i++) {
if (handlers[i] === callback) {
// this callback is already bound. no need to bind it again.
return
}
}
handlers.push(callback);
document.addEventListener(evt, callback);
},
/**
* removeEventListener
* NOTE: remove all the event handlers for the specified event type.
* @param {string} evt - the event name to remove a listener from.
*/
removeEventListener: function removeEventListener (evt) {
var handlers = handlerTraker[evt];
if (!handlers) {
// evt handlers has been already removed.
return
}
handlers.forEach(function (cb) { return document.removeEventListener(evt, cb); });
delete handlerTraker[evt];
}
};
var globalEvent$1 = {
init: function init (weex) {
weex.registerModule('globalEvent', globalEvent);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var queue$1 = [];
var isProcessing = false;
var toastWin;
var TOAST_WIN_CLASS_NAME = 'weex-toast';
var TOAST_TRANSITION_DURATION = 0.4;
var DEFAULT_DURATION = 0.8;
function showToastWindow (msg, callback) {
if (!toastWin) {
toastWin = document.createElement('div');
toastWin.classList.add(TOAST_WIN_CLASS_NAME);
toastWin.classList.add('hide');
document.body.appendChild(toastWin);
}
toastWin.textContent = msg;
setTimeout(function () {
toastWin.classList.remove('hide');
callback && callback();
}, 16);
}
function hideToastWindow (callback) {
if (!toastWin) {
return
}
toastWin.classList.add('hide');
setTimeout(function () {
callback && callback();
}, TOAST_TRANSITION_DURATION * 1000);
}
var toast = {
push: function (msg, duration) {
queue$1.push({
msg: msg,
duration: duration || DEFAULT_DURATION
});
this.show();
},
show: function () {
var that = this;
// All messages had been toasted already, so remove the toast window,
if (!queue$1.length) {
toastWin && toastWin.parentNode.removeChild(toastWin);
toastWin = null;
return
}
// the previous toast is not ended yet.
if (isProcessing) {
return
}
isProcessing = true;
var toastInfo = queue$1.shift();
showToastWindow(toastInfo.msg, function () {
setTimeout(function () {
hideToastWindow(function () {
isProcessing = false;
that.show();
});
}, toastInfo.duration * 1000);
});
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// there will be only one instance of modal.
var MODAL_WRAP_CLASS = 'weex-modal-wrap';
var MODAL_NODE_CLASS = 'weex-modal-node';
function Modal () {
this.wrap = document.querySelector(MODAL_WRAP_CLASS);
this.node = document.querySelector(MODAL_NODE_CLASS);
if (!this.wrap) {
this.createWrap();
}
if (!this.node) {
this.createNode();
}
this.clearNode();
this.createNodeContent();
this.bindEvents();
}
Modal.prototype = {
show: function () {
this.wrap.style.display = 'block';
this.node.classList.remove('hide');
},
destroy: function () {
document.body.removeChild(this.wrap);
document.body.removeChild(this.node);
this.wrap = null;
this.node = null;
},
createWrap: function () {
this.wrap = document.createElement('div');
this.wrap.className = MODAL_WRAP_CLASS;
document.body.appendChild(this.wrap);
},
createNode: function () {
this.node = document.createElement('div');
this.node.classList.add(MODAL_NODE_CLASS, 'hide');
document.body.appendChild(this.node);
},
clearNode: function () {
this.node.innerHTML = '';
},
createNodeContent: function () {
// do nothing.
// child classes can override this method.
},
bindEvents: function () {
this.wrap.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
});
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var CONTENT_CLASS = 'content';
var MSG_CLASS = 'content-msg';
var BUTTON_GROUP_CLASS = 'btn-group';
var BUTTON_CLASS = 'btn';
function Alert (config) {
this.msg = config.message || '';
this.callback = config.callback;
this.okTitle = config.okTitle || 'OK';
Modal.call(this);
this.node.classList.add('weex-alert');
}
Alert.prototype = Object.create(Modal.prototype);
Alert.prototype.createNodeContent = function () {
var content = document.createElement('div');
content.classList.add(CONTENT_CLASS);
this.node.appendChild(content);
var msg = document.createElement('div');
msg.classList.add(MSG_CLASS);
msg.appendChild(document.createTextNode(this.msg));
content.appendChild(msg);
var buttonGroup = document.createElement('div');
buttonGroup.classList.add(BUTTON_GROUP_CLASS);
this.node.appendChild(buttonGroup);
var button = document.createElement('div');
button.classList.add(BUTTON_CLASS, 'alert-ok');
button.appendChild(document.createTextNode(this.okTitle));
buttonGroup.appendChild(button);
};
Alert.prototype.bindEvents = function () {
Modal.prototype.bindEvents.call(this);
var button = this.node.querySelector('.' + BUTTON_CLASS);
button.addEventListener('click', function () {
this.destroy();
this.callback && this.callback();
}.bind(this));
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var CONTENT_CLASS$1 = 'content';
var MSG_CLASS$1 = 'content-msg';
var BUTTON_GROUP_CLASS$1 = 'btn-group';
var BUTTON_CLASS$1 = 'btn';
function Confirm (config) {
this.msg = config.message || '';
this.callback = config.callback;
this.okTitle = config.okTitle || 'OK';
this.cancelTitle = config.cancelTitle || 'Cancel';
Modal.call(this);
this.node.classList.add('weex-confirm');
}
Confirm.prototype = Object.create(Modal.prototype);
Confirm.prototype.createNodeContent = function () {
var content = document.createElement('div');
content.classList.add(CONTENT_CLASS$1);
this.node.appendChild(content);
var msg = document.createElement('div');
msg.classList.add(MSG_CLASS$1);
msg.appendChild(document.createTextNode(this.msg));
content.appendChild(msg);
var buttonGroup = document.createElement('div');
buttonGroup.classList.add(BUTTON_GROUP_CLASS$1);
this.node.appendChild(buttonGroup);
var btnOk = document.createElement('div');
btnOk.appendChild(document.createTextNode(this.okTitle));
btnOk.classList.add('btn-ok', BUTTON_CLASS$1);
var btnCancel = document.createElement('div');
btnCancel.appendChild(document.createTextNode(this.cancelTitle));
btnCancel.classList.add('btn-cancel', BUTTON_CLASS$1);
buttonGroup.appendChild(btnOk);
buttonGroup.appendChild(btnCancel);
this.node.appendChild(buttonGroup);
};
Confirm.prototype.bindEvents = function () {
Modal.prototype.bindEvents.call(this);
var btnOk = this.node.querySelector('.' + BUTTON_CLASS$1 + '.btn-ok');
var btnCancel = this.node.querySelector('.' + BUTTON_CLASS$1 + '.btn-cancel');
btnOk.addEventListener('click', function () {
this.destroy();
this.callback && this.callback(this.okTitle);
}.bind(this));
btnCancel.addEventListener('click', function () {
this.destroy();
this.callback && this.callback(this.cancelTitle);
}.bind(this));
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var CONTENT_CLASS$2 = 'content';
var MSG_CLASS$2 = 'content-msg';
var BUTTON_GROUP_CLASS$2 = 'btn-group';
var BUTTON_CLASS$2 = 'btn';
var INPUT_WRAP_CLASS = 'input-wrap';
var INPUT_CLASS = 'input';
function Prompt (config) {
this.msg = config.message || '';
this.defaultMsg = config.default || '';
this.callback = config.callback;
this.okTitle = config.okTitle || 'OK';
this.cancelTitle = config.cancelTitle || 'Cancel';
Modal.call(this);
this.node.classList.add('weex-prompt');
}
Prompt.prototype = Object.create(Modal.prototype);
Prompt.prototype.createNodeContent = function () {
var content = document.createElement('div');
content.classList.add(CONTENT_CLASS$2);
this.node.appendChild(content);
var msg = document.createElement('div');
msg.classList.add(MSG_CLASS$2);
msg.appendChild(document.createTextNode(this.msg));
content.appendChild(msg);
var inputWrap = document.createElement('div');
inputWrap.classList.add(INPUT_WRAP_CLASS);
content.appendChild(inputWrap);
var input = document.createElement('input');
input.classList.add(INPUT_CLASS);
input.type = 'text';
input.autofocus = true;
input.placeholder = this.defaultMsg;
inputWrap.appendChild(input);
var buttonGroup = document.createElement('div');
buttonGroup.classList.add(BUTTON_GROUP_CLASS$2);
var btnOk = document.createElement('div');
btnOk.appendChild(document.createTextNode(this.okTitle));
btnOk.classList.add('btn-ok', BUTTON_CLASS$2);
var btnCancel = document.createElement('div');
btnCancel.appendChild(document.createTextNode(this.cancelTitle));
btnCancel.classList.add('btn-cancel', BUTTON_CLASS$2);
buttonGroup.appendChild(btnOk);
buttonGroup.appendChild(btnCancel);
this.node.appendChild(buttonGroup);
};
Prompt.prototype.bindEvents = function () {
Modal.prototype.bindEvents.call(this);
var btnOk = this.node.querySelector('.' + BUTTON_CLASS$2 + '.btn-ok');
var btnCancel = this.node.querySelector('.' + BUTTON_CLASS$2 + '.btn-cancel');
var that = this;
btnOk.addEventListener('click', function () {
var val = document.querySelector('input').value;
this.destroy();
this.callback && this.callback({
result: that.okTitle,
data: val
});
}.bind(this));
btnCancel.addEventListener('click', function () {
var val = document.querySelector('input').value;
this.destroy();
this.callback && this.callback({
result: that.cancelTitle,
data: val
});
}.bind(this));
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var _css$10 = "\n.weex-toast {\n font-size: 0.426667rem;\n line-height: 0.426667rem;\n position: fixed;\n z-index: 1999999999;\n box-sizing: border-box;\n max-width: 80%;\n bottom: 50%;\n left: 50%;\n padding: 0.213333rem;\n background-color: #000;\n color: #fff;\n text-align: center;\n opacity: 0.7;\n -webkit-transition: all 0.4s ease-in-out;\n -moz-transition: all 0.4s ease-in-out;\n -ms-transition: all 0.4s ease-in-out;\n transition: all 0.4s ease-in-out;\n border-radius: 0.066667rem;\n -webkit-transform: translateX(-50%);\n -moz-transform: translateX(-50%);\n -ms-transform: translateX(-50%);\n transform: translateX(-50%);\n}\n\n.weex-toast.hide {\n opacity: 0;\n}\n\n.weex-alert .weex-alert-ok {\n width: 100%;\n}\n\n.weex-confirm .btn-group .btn {\n float: left;\n width: 50%;\n}\n\n.weex-confirm .btn-group .btn.btn-ok {\n border-right: 0.013333rem solid #ddd;\n}\n\n.weex-modal-wrap {\n display: none;\n position: fixed;\n z-index: 999999999;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: #000;\n opacity: 0.5;\n}\n\n.weex-modal-node {\n position: fixed;\n z-index: 9999999999;\n top: 50%;\n left: 50%;\n width: 6.666667rem;\n min-height: 2.666667rem;\n border-radius: 0.066667rem;\n -webkit-transform: translate(-50%, -50%);\n -moz-transform: translate(-50%, -50%);\n -ms-transform: translate(-50%, -50%);\n transform: translate(-50%, -50%);\n background-color: #fff;\n}\n\n.weex-modal-node.hide {\n display: none;\n}\n\n.weex-modal-node .content {\n display: -webkit-box;\n display: -webkit-flex;\n display: -moz-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-orient: vertical;\n -webkit-flex-direction: column;\n -moz-box-orient: vertical;\n -moz-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n -webkit-box-align: center;\n -webkit-align-items: center;\n -ms-flex-align: center;\n -moz-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-box-pack: center;\n -webkit-justify-content: center;\n -moz-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n width: 100%;\n min-height: 1.866667rem;\n box-sizing: border-box;\n font-size: 0.426667rem;\n line-height: 0.426667rem;\n padding: 0.213333rem;\n border-bottom: 0.013333rem solid #ddd;\n}\n\n.weex-modal-node .btn-group {\n width: 100%;\n height: 0.8rem;\n font-size: 0.373333rem;\n text-align: center;\n margin: 0;\n padding: 0;\n border: none;\n}\n\n.weex-modal-node .btn-group .btn {\n text-align: center;\n}\n\n.weex-modal-node .btn-group .btn {\n box-sizing: border-box;\n height: 0.8rem;\n line-height: 0.8rem;\n margin: 0;\n padding: 0;\n border: none;\n background: none;\n text-align: center;\n}\n\n.weex-prompt .input-wrap {\n box-sizing: border-box;\n width: 100%;\n margin-top: 0.133333rem;\n height: 0.96rem;\n}\n\n.weex-prompt .input-wrap .input {\n box-sizing: border-box;\n width: 100%;\n height: 0.56rem;\n line-height: 0.56rem;\n font-size: 0.426667rem;\n border: 0.013333rem solid #999;\n}\n\n.weex-prompt .btn-group .btn {\n float: left;\n width: 50%;\n}\n\n.weex-prompt .btn-group .btn.btn-ok {\n border-right: 0.013333rem solid #ddd;\n}\n";
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// TODO: rewrite the modal styles
var modal = {
// duration: default is 0.8 seconds.
toast: function (config) {
toast.push(config.message, config.duration);
},
// config:
// - message: string
// - okTitle: title of ok button
// - callback
alert: function (config, callback) {
config.callback = function () {
callback && callback();
};
new Alert(config).show();
},
// config:
// - message: string
// - okTitle: title of ok button
// - cancelTitle: title of cancel button
// - callback
confirm: function (config, callback) {
config.callback = function (val) {
callback && callback(val);
};
new Confirm(config).show();
},
// config:
// - message: string
// - okTitle: title of ok button
// - cancelTitle: title of cancel button
// - callback
prompt: function (config, callback) {
config.callback = function (val) {
callback && callback(val);
};
new Prompt(config).show();
}
};
var modal$1 = {
init: function (Weex) {
Weex.utils.appendCss(_css$10, 'weex-mud-modal');
Weex.registerModule('modal', modal);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Navigator module
*/
var navigatorModule = {
push: function (config, callback) {
window.location.href = config.url;
callback && callback();
},
pop: function (config, callback) {
window.history.back();
callback && callback();
}
};
var navigatorModule$1 = {
init: function init (weex) {
weex.registerModule('navigator', navigatorModule);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Webview module
*/
var isArray$1;
var webview = {
goBack: function goBack (vnode) {
if (isArray$1(vnode)) {
{
console.warn('[vue-render] the ref passed to webview.goBack is a array.');
}
vnode = vnode[0];
}
if (vnode && typeof vnode.goBack === 'function') {
vnode.goBack();
}
},
goForward: function goForward (vnode) {
if (isArray$1(vnode)) {
{
console.warn('[vue-render] the ref passed to webview.goForward is a array.');
}
vnode = vnode[0];
}
if (vnode && typeof vnode.goForward === 'function') {
vnode.goForward();
}
},
reload: function reload (vnode) {
if (isArray$1(vnode)) {
{
console.warn('[vue-render] the ref passed to webview.reload is a array.');
}
vnode = vnode[0];
}
if (vnode && typeof vnode.reload === 'function') {
vnode.reload();
}
}
};
var webview$1 = {
init: function init (weex) {
isArray$1 = weex.utils.isArray;
weex.registerModule('webview', webview);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* websocket module
*/
/*global WebSocket*/
var websocket$1 = (function () {
var registerListeners = ['onopen', 'onmessage', 'onerror', 'onclose'];
var ws = {
INSTANCE: null,
WebSocket: function (url, protocol) {
if (!url) {
ws.INSTANCE = null;
return
}
if (!protocol) {
ws.INSTANCE = new WebSocket(url);
}
else {
ws.INSTANCE = new WebSocket(url, protocol);
}
return ws.INSTANCE
},
send: function (messages) {
ws.INSTANCE && ws.INSTANCE.send(messages);
},
close: function () {
ws.INSTANCE && ws.INSTANCE.close();
}
};
var loop = function ( i ) {
if (registerListeners.hasOwnProperty(i)) {
Object.defineProperty(ws, registerListeners[i], {
get: function () {
return ws.INSTANCE && ws.INSTANCE[registerListeners[i]]
},
set: function (fn) {
if (ws.INSTANCE) {
ws.INSTANCE[registerListeners[i]] = fn;
}
}
});
}
};
for (var i in registerListeners) loop( i );
return ws
})();
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// TODO: rewrite the module meta
var websocket = {
init: function (Weex) {
Weex.registerModule('webSocket', websocket$1, { mountType: 'full' });
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var meta$5 = {
/**
* setViewport
* Changing viewport width at runtime is not supported. Please use weex-viewport meta
* tag to specify your viewport in your html file.
*/
setViewport: function setViewport (options) {
console.warn("[vue-render] meta.setViewport doesn't works as expected in web platform."
+ " Please use <meta name=\"weex-viewport\" content=\"xxx\"> to specify your viewport width.");
}
};
var meta$6 = {
init: function init (weex) {
weex.registerModule('meta', meta$5);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// modules from render/browesr (legacy modules)
// custom modules
var modules$1 = [
geolocation$1,
storage$1,
stream$1,
clipboard$1,
eventModule,
modal$1,
websocket,
animation$1,
dom$1,
globalEvent$1,
navigatorModule$1,
webview$1,
meta$6
];
var preInit = weex.init;
weex.init = function () {
preInit.apply(weex, arguments);
var plugins = components.concat(modules$1);
plugins.forEach(function (plugin) {
weex.install(plugin);
});
};
if (global.Vue) {
weex.init(global.Vue);
}
return weex;
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvbGliL2dlc3R1cmUuanMiLCIuLi8uLi8uLi9odG1sNS9zaGFyZWQvYXJyYXlGcm9tLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZ2xvYmFsLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29yZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLW9iamVjdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FuLW9iamVjdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ZhaWxzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kb20tY3JlYXRlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faWU4LWRvbS1kZWZpbmUuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1wcmltaXRpdmUuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHAuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faGlkZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2hhcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3VpZC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3JlZGVmaW5lLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYS1mdW5jdGlvbi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2N0eC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2V4cG9ydC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NvZi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lvYmplY3QuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZWZpbmVkLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8taW9iamVjdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWludGVnZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1sZW5ndGguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FycmF5LWluY2x1ZGVzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLWtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1rZXlzLWludGVybmFsLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZW51bS1idWcta2V5cy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1rZXlzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcHMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtcGllLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tb2JqZWN0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWFzc2lnbi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24uanMiLCIuLi8uLi8uLi9odG1sNS9zaGFyZWQvb2JqZWN0QXNzaWduLmpzIiwiLi4vLi4vLi4vaHRtbDUvc2hhcmVkL29iamVjdFNldFByb3RvdHlwZU9mLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fd2tzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY2xhc3NvZi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctYXQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlcmF0b3JzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWRwcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2h0bWwuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtY3JlYXRlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWNyZWF0ZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1ncG8uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWRlZmluZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FkZC10by11bnNjb3BhYmxlcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItc3RlcC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYW4taW5zdGFuY2UuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWNhbGwuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mb3Itb2YuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW52b2tlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdGFzay5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX21pY3JvdGFzay5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3JlZGVmaW5lLWFsbC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC1zcGVjaWVzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5wcm9taXNlLmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9saWIvZW52ZC92ZXJzaW9uLmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9saWIvZW52ZC9wYXJhbXMuanMiLCIuLi8uLi8uLi9odG1sNS9yZW5kZXIvdnVlL2xpYi9lbnZkL2luZGV4LmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS91dGlscy90eXBlLmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS91dGlscy9mdW5jLmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9lbnYvdmlld3BvcnQuanMiLCIuLi8uLi8uLi9odG1sNS9yZW5kZXIvdnVlL3V0aWxzL2V2ZW50LmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9jb25maWcuanMiLCIuLi8uLi8uLi9odG1sNS9yZW5kZXIvdnVlL3V0aWxzL2NvbXBvbmVudC5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvdXRpbHMvbGF6eWxvYWQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaW5saW5lLXN0eWxlLXByZWZpeGVyL3V0aWxzL2NhcGl0YWxpemVTdHJpbmcuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaW5saW5lLXN0eWxlLXByZWZpeGVyL3V0aWxzL3ByZWZpeFByb3BlcnR5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2lubGluZS1zdHlsZS1wcmVmaXhlci91dGlscy9wcmVmaXhWYWx1ZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9pbmxpbmUtc3R5bGUtcHJlZml4ZXIvdXRpbHMvYWRkTmV3VmFsdWVzT25seS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9pbmxpbmUtc3R5bGUtcHJlZml4ZXIvdXRpbHMvaXNPYmplY3QuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaW5saW5lLXN0eWxlLXByZWZpeGVyL3N0YXRpYy9jcmVhdGVQcmVmaXhlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9pbmxpbmUtc3R5bGUtcHJlZml4ZXIvc3RhdGljL3N0YXRpY0RhdGEuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaW5saW5lLXN0eWxlLXByZWZpeGVyL3N0YXRpYy9wbHVnaW5zL2N1cnNvci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtaW4tanMtdXRpbHMvbGliL2lzUHJlZml4ZWRWYWx1ZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9pbmxpbmUtc3R5bGUtcHJlZml4ZXIvc3RhdGljL3BsdWdpbnMvY3Jvc3NGYWRlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2lubGluZS1zdHlsZS1wcmVmaXhlci9zdGF0aWMvcGx1Z2lucy9maWx0ZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaW5saW5lLXN0eWxlLXByZWZpeGVyL3N0YXRpYy9wbHVnaW5zL2ZsZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaW5saW5lLXN0eWxlLXByZWZpeGVyL3N0YXRpYy9wbHVnaW5zL2ZsZXhib3hPbGQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaW5saW5lLXN0eWxlLXByZWZpeGVyL3N0YXRpYy9wbHVnaW5zL2dyYWRpZW50LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2lubGluZS1zdHlsZS1wcmVmaXhlci9zdGF0aWMvcGx1Z2lucy9pbWFnZVNldC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9pbmxpbmUtc3R5bGUtcHJlZml4ZXIvc3RhdGljL3BsdWdpbnMvcG9zaXRpb24uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaW5saW5lLXN0eWxlLXByZWZpeGVyL3N0YXRpYy9wbHVnaW5zL3NpemluZy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9oeXBoZW5hdGUtc3R5bGUtbmFtZS9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtaW4tanMtdXRpbHMvbGliL2h5cGhlbmF0ZVByb3BlcnR5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2lubGluZS1zdHlsZS1wcmVmaXhlci9zdGF0aWMvcGx1Z2lucy90cmFuc2l0aW9uLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2lubGluZS1zdHlsZS1wcmVmaXhlci9zdGF0aWMvaW5kZXguanMiLCIuLi8uLi8uLi9odG1sNS9yZW5kZXIvdnVlL3V0aWxzL3N0eWxlLmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS91dGlscy9pbmRleC5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvZW52L3d4LWVudi5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvZW52L3dlZXguanMiLCIuLi8uLi8uLi9odG1sNS9yZW5kZXIvdnVlL3V0aWxzL3BlcmYuanMiLCIuLi8uLi8uLi9odG1sNS9yZW5kZXIvdnVlL2NvcmUvc3R5bGUuanMiLCIuLi8uLi8uLi9odG1sNS9yZW5kZXIvdnVlL2NvcmUvbm9kZS5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvY29yZS9pbmRleC5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvbWl4aW5zL2Jhc2UuanMiLCIuLi8uLi8uLi9odG1sNS9yZW5kZXIvdnVlL21peGlucy9zdHlsZS5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvbWl4aW5zL2lucHV0LWNvbW1vbi5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvbWl4aW5zL3N0aWNreS5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvbWl4aW5zL2luZGV4LmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9lbnYvZ2xvYmFsLmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9lbnYvaW5kZXguanMiLCIuLi8uLi8uLi9odG1sNS9yZW5kZXIvdnVlL2Vudi9ldmVudC1tYW5hZ2VyLmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9pbmRleC5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvY29tcG9uZW50cy9hLmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9jb21wb25lbnRzL2Rpdi5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvY29tcG9uZW50cy9pbWFnZS5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvY29tcG9uZW50cy9pbnB1dC5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvY29tcG9uZW50cy9zd2l0Y2guanMiLCIuLi8uLi8uLi9odG1sNS9yZW5kZXIvdnVlL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9taXhpbnMvc2Nyb2xsYWJsZS5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvY29tcG9uZW50cy9zY3JvbGxhYmxlL21peGlucy9saXN0LmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9jb21wb25lbnRzL3Njcm9sbGFibGUvbWl4aW5zL2luZGV4LmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9jb21wb25lbnRzL3Njcm9sbGFibGUvbGlzdC5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvY29tcG9uZW50cy9zY3JvbGxhYmxlL3Njcm9sbGVyLmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9jb21wb25lbnRzL3Njcm9sbGFibGUvd2F0ZXJmYWxsLmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9jb21wb25lbnRzL3Njcm9sbGFibGUvY2VsbC5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvY29tcG9uZW50cy9zY3JvbGxhYmxlL2hlYWRlci5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvY29tcG9uZW50cy9zY3JvbGxhYmxlL2xvYWRpbmcuanMiLCIuLi8uLi8uLi9odG1sNS9yZW5kZXIvdnVlL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9yZWZyZXNoLmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9jb21wb25lbnRzL3Njcm9sbGFibGUvbG9hZGluZy1pbmRpY2F0b3IuanMiLCIuLi8uLi8uLi9odG1sNS9yZW5kZXIvdnVlL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9pbmRleC5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvY29tcG9uZW50cy9zbGlkZXIvc2xpZGVNaXhpbi5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvY29tcG9uZW50cy9zbGlkZXIvc2xpZGVyLmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9jb21wb25lbnRzL3NsaWRlci9zbGlkZXItbmVpZ2hib3IuanMiLCIuLi8uLi8uLi9odG1sNS9yZW5kZXIvdnVlL2NvbXBvbmVudHMvc2xpZGVyL2luZGljYXRvci5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvY29tcG9uZW50cy9zbGlkZXIvaW5kZXguanMiLCIuLi8uLi8uLi9odG1sNS9yZW5kZXIvdnVlL2NvbXBvbmVudHMvdGV4dC5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvY29tcG9uZW50cy90ZXh0YXJlYS5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvY29tcG9uZW50cy92aWRlby5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvY29tcG9uZW50cy93ZWIuanMiLCIuLi8uLi8uLi9odG1sNS9yZW5kZXIvdnVlL2NvbXBvbmVudHMvaW5kZXguanMiLCIuLi8uLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvYXBpL2dlb2xvY2F0aW9uLmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2FwaS9zdG9yYWdlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2h0dHB1cmwvYnVpbGQvaHR0cHVybC5jb21tb24uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3RyaWN0LXVyaS1lbmNvZGUvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9xdWVyeS1zdHJpbmcvaW5kZXguanMiLCIuLi8uLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvYXBpL3N0cmVhbS5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9hcGkvY2xpcGJvYXJkLmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2FwaS9ldmVudC5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvbW9kdWxlcy9hbmltYXRpb24uanMiLCIuLi8uLi8uLi9odG1sNS9yZW5kZXIvdnVlL21vZHVsZXMvZG9tLmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9tb2R1bGVzL2dsb2JhbEV2ZW50LmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9tb2R1bGVzL21vZGFsL3RvYXN0LmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9tb2R1bGVzL21vZGFsL21vZGFsLmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9tb2R1bGVzL21vZGFsL2FsZXJ0LmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9tb2R1bGVzL21vZGFsL2NvbmZpcm0uanMiLCIuLi8uLi8uLi9odG1sNS9yZW5kZXIvdnVlL21vZHVsZXMvbW9kYWwvcHJvbXB0LmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9tb2R1bGVzL21vZGFsL3N0eWxlLmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9tb2R1bGVzL21vZGFsL2luZGV4LmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9tb2R1bGVzL25hdmlnYXRvci5qcyIsIi4uLy4uLy4uL2h0bWw1L3JlbmRlci92dWUvbW9kdWxlcy93ZWJ2aWV3LmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9tb2R1bGVzL3dlYnNvY2tldC93ZWJzb2NrZXQuanMiLCIuLi8uLi8uLi9odG1sNS9yZW5kZXIvdnVlL21vZHVsZXMvd2Vic29ja2V0L2luZGV4LmpzIiwiLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9tb2R1bGVzL21ldGEuanMiLCIuLi8uLi8uLi9odG1sNS9yZW5kZXIvdnVlL21vZHVsZXMvaW5kZXguanMiLCIuLi9zcmMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZVxuXG4vLyBtYWpvciBldmVudHMgc3VwcG9ydGVkOlxuLy8gICBwYW5zdGFydFxuLy8gICBwYW5tb3ZlXG4vLyAgIHBhbmVuZFxuLy8gICBzd2lwZVxuLy8gICBsb25ncHJlc3Ncbi8vIGV4dHJhIGV2ZW50cyBzdXBwb3J0ZWQ6XG4vLyAgIGR1YWx0b3VjaHN0YXJ0XG4vLyAgIGR1YWx0b3VjaFxuLy8gICBkdWFsdG91Y2hlbmRcbi8vICAgdGFwXG4vLyAgIGRvdWJsZXRhcFxuLy8gICBwcmVzc2VuZFxuXG52YXIgZG9jID0gd2luZG93LmRvY3VtZW50XG52YXIgZG9jRWwgPSBkb2MuZG9jdW1lbnRFbGVtZW50XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2VcbnZhciBnZXN0dXJlcyA9IHt9XG52YXIgbGFzdFRhcCA9IG51bGxcblxuLyoqXG4gKiBmaW5kIHRoZSBjbG9zZXN0IGNvbW1vbiBhbmNlc3RvclxuICogaWYgdGhlcmUncyBubyBvbmUsIHJldHVybiBudWxsXG4gKlxuICogQHBhcmFtICB7RWxlbWVudH0gZWwxIGZpcnN0IGVsZW1lbnRcbiAqIEBwYXJhbSAge0VsZW1lbnR9IGVsMiBzZWNvbmQgZWxlbWVudFxuICogQHJldHVybiB7RWxlbWVudH0gICAgIGNvbW1vbiBhbmNlc3RvclxuICovXG5mdW5jdGlvbiBnZXRDb21tb25BbmNlc3RvcihlbDEsIGVsMikge1xuICB2YXIgZWwgPSBlbDFcbiAgd2hpbGUgKGVsKSB7XG4gICAgaWYgKGVsLmNvbnRhaW5zKGVsMikgfHwgZWwgPT0gZWwyKSB7XG4gICAgICByZXR1cm4gZWxcbiAgICB9XG4gICAgZWwgPSBlbC5wYXJlbnROb2RlXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuLyoqXG4gKiBmaXJlIGEgSFRNTEV2ZW50XG4gKlxuICogQHBhcmFtICB7RWxlbWVudH0gZWxlbWVudCB3aGljaCBlbGVtZW50IHRvIGZpcmUgYSBldmVudCBvblxuICogQHBhcmFtICB7c3RyaW5nfSAgdHlwZSAgICB0eXBlIG9mIGV2ZW50XG4gKiBAcGFyYW0gIHtvYmplY3R9ICBleHRyYSAgIGV4dHJhIGRhdGEgZm9yIHRoZSBldmVudCBvYmplY3RcbiAqL1xuZnVuY3Rpb24gZmlyZUV2ZW50KGVsZW1lbnQsIHR5cGUsIGV4dHJhKSB7XG4gIHZhciBldmVudCA9IGRvYy5jcmVhdGVFdmVudCgnSFRNTEV2ZW50cycpXG4gIGV2ZW50LmluaXRFdmVudCh0eXBlLCB0cnVlLCB0cnVlKVxuXG4gIGlmICh0eXBlb2YgZXh0cmEgPT09ICdvYmplY3QnKSB7XG4gICAgZm9yICh2YXIgcCBpbiBleHRyYSkge1xuICAgICAgZXZlbnRbcF0gPSBleHRyYVtwXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZsYWcgdG8gZGlzdGluZ3Vpc2ggd2l0aCBvdGhlciBldmVudHMgd2l0aCB0aGUgc2FtZSBuYW1lIGdlbmVyYXRlZFxuICAgKiBieSBhbm90aGVyIGxpYnJhcnkgaW4gdGhlIHNhbWUgcGFnZS5cbiAgICovIFxuICBldmVudC5fZm9yID0gJ3dlZXgnXG5cbiAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KVxufVxuXG4vKipcbiAqIGNhbGMgdGhlIHRyYW5zZm9ybVxuICogYXNzdW1lIDQgcG9pbnRzIEFCQ0Qgb24gdGhlIGNvb3JkaW5hdGUgc3lzdGVtXG4gKiA+IHJvdGF0Ze+8mmFuZ2xlIHJvdGF0aW5nIGZyb20gQUIgdG8gQ0RcbiAqID4gc2NhbGXvvJpzY2FsZSByYXRpbyBmcm9tIEFCIHRvIENEXG4gKiA+IHRyYW5zbGF0Ze+8mnRyYW5zbGF0ZSBzaGlmdCBmcm9tIEEgdG8gQ1xuICpcbiAqIEBwYXJhbSAge251bWJlcn0geDEgYWJzY2lzc2Egb2YgQVxuICogQHBhcmFtICB7bnVtYmVyfSB5MSBvcmRpbmF0ZSBvZiBBXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHgyIGFic2Npc3NhIG9mIEJcbiAqIEBwYXJhbSAge251bWJlcn0geTIgb3JkaW5hdGUgb2YgQlxuICogQHBhcmFtICB7bnVtYmVyfSB4MyBhYnNjaXNzYSBvZiBDXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHkzIG9yZGluYXRlIG9mIENcbiAqIEBwYXJhbSAge251bWJlcn0geDQgYWJzY2lzc2Egb2YgRFxuICogQHBhcmFtICB7bnVtYmVyfSB5NCBvcmRpbmF0ZSBvZiBEXG4gKiBAcmV0dXJuIHtvYmplY3R9ICAgIHRyYW5zZm9ybSBvYmplY3QgbGlrZVxuICogICB7cm90YXRlLCBzY2FsZSwgdHJhbnNsYXRlWzJdLCBtYXRyaXhbM11bM119XG4gKi9cbmZ1bmN0aW9uIGNhbGMoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0KSB7XG4gIHZhciByb3RhdGUgPSBNYXRoLmF0YW4yKHk0IC0geTMsIHg0IC0geDMpIC0gTWF0aC5hdGFuMih5MiAtIHkxLCB4MiAtIHgxKVxuICB2YXIgc2NhbGUgPSBNYXRoLnNxcnQoKE1hdGgucG93KHk0IC0geTMsIDIpXG4gICAgKyBNYXRoLnBvdyh4NCAtIHgzLCAyKSkgLyAoTWF0aC5wb3coeTIgLSB5MSwgMilcbiAgICArIE1hdGgucG93KHgyIC0geDEsIDIpKSlcbiAgdmFyIHRyYW5zbGF0ZSA9IFtcbiAgICB4M1xuICAgIC0gc2NhbGUgKiB4MSAqIE1hdGguY29zKHJvdGF0ZSlcbiAgICArIHNjYWxlICogeTEgKiBNYXRoLnNpbihyb3RhdGUpLFxuICAgIHkzXG4gICAgLSBzY2FsZSAqIHkxICogTWF0aC5jb3Mocm90YXRlKVxuICAgIC0gc2NhbGUgKiB4MSAqIE1hdGguc2luKHJvdGF0ZSldXG5cbiAgcmV0dXJuIHtcbiAgICByb3RhdGU6IHJvdGF0ZSxcbiAgICBzY2FsZTogc2NhbGUsXG4gICAgdHJhbnNsYXRlOiB0cmFuc2xhdGUsXG4gICAgbWF0cml4OiBbXG4gICAgICBbc2NhbGUgKiBNYXRoLmNvcyhyb3RhdGUpLCAtc2NhbGUgKiBNYXRoLnNpbihyb3RhdGUpLCB0cmFuc2xhdGVbMF1dLFxuICAgICAgW3NjYWxlICogTWF0aC5zaW4ocm90YXRlKSwgc2NhbGUgKiBNYXRoLmNvcyhyb3RhdGUpLCB0cmFuc2xhdGVbMV1dLFxuICAgICAgWzAsIDAsIDFdXG4gICAgXVxuICB9XG59XG5cbi8qKlxuICogdGFrZSBvdmVyIHRoZSB0b3VjaHN0YXJ0IGV2ZW50cy4gQWRkIG5ldyB0b3VjaGVzIHRvIHRoZSBnZXN0dXJlcy5cbiAqIElmIHRoZXJlIGlzIG5vIHByZXZpb3VzIHJlY29yZHMsIHRoZW4gYmluZCB0b3VjaG1vdmUsIHRvY2hlbmRcbiAqIGFuZCB0b3VjaGNhbmNlbCBldmVudHMuXG4gKiBuZXcgdG91Y2hlcyBpbml0aWFsaXplZCB3aXRoIHN0YXRlICd0YXBwaW5nJywgYW5kIHdpdGhpbiA1MDAgbWlsbGlzZWNvbmRzXG4gKiBpZiB0aGUgc3RhdGUgaXMgc3RpbGwgdGFwcGluZywgdGhlbiB0cmlnZ2VyIGdlc3R1cmUgJ3ByZXNzJy5cbiAqIElmIHRoZXJlIGFyZSB0d28gdG91Y2hlIHBvaW50cywgdGhlbiB0aGUgJ2R1YWx0b3VjaHN0YXJ0JyBpcyB0cmlnZ2VyZC4gVGhlXG4gKiBub2RlIG9mIHRoZSB0b3VjaCBnZXN0dXJlIGlzIHRoZWlyIGNsb2VzdCBjb21tb24gYW5jZXN0b3IuXG4gKlxuICogQGV2ZW50XG4gKiBAcGFyYW0gIHtldmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gdG91Y2hzdGFydEhhbmRsZXIoZXZlbnQpIHtcblxuICBpZiAoT2JqZWN0LmtleXMoZ2VzdHVyZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRvY0VsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRvdWNobW92ZUhhbmRsZXIsIGZhbHNlKVxuICAgIGRvY0VsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdG91Y2hlbmRIYW5kbGVyLCBmYWxzZSlcbiAgICBkb2NFbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRvdWNoY2FuY2VsSGFuZGxlciwgZmFsc2UpXG4gIH1cblxuICAvLyByZWNvcmQgZXZlcnkgdG91Y2hcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0b3VjaCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzW2ldXG4gICAgdmFyIHRvdWNoUmVjb3JkID0ge31cblxuICAgIGZvciAodmFyIHAgaW4gdG91Y2gpIHtcbiAgICAgIHRvdWNoUmVjb3JkW3BdID0gdG91Y2hbcF1cbiAgICB9XG5cbiAgICB2YXIgZ2VzdHVyZSA9IHtcbiAgICAgIHN0YXJ0VG91Y2g6IHRvdWNoUmVjb3JkLFxuICAgICAgc3RhcnRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgc3RhdHVzOiAndGFwcGluZycsXG4gICAgICBlbGVtZW50OiBldmVudC5zcmNFbGVtZW50IHx8IGV2ZW50LnRhcmdldCxcbiAgICAgIHByZXNzaW5nSGFuZGxlcjogc2V0VGltZW91dChmdW5jdGlvbiAoZWxlbWVudCwgdG91Y2gpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoZ2VzdHVyZS5zdGF0dXMgPT09ICd0YXBwaW5nJykge1xuICAgICAgICAgICAgZ2VzdHVyZS5zdGF0dXMgPSAncHJlc3NpbmcnXG5cbiAgICAgICAgICAgIGZpcmVFdmVudChlbGVtZW50LCAnbG9uZ3ByZXNzJywge1xuICAgICAgICAgICAgICAvLyBhZGQgdG91Y2ggZGF0YSBmb3Igd2VleFxuICAgICAgICAgICAgICB0b3VjaDogdG91Y2gsXG4gICAgICAgICAgICAgIHRvdWNoZXM6IGV2ZW50LnRvdWNoZXMsXG4gICAgICAgICAgICAgIGNoYW5nZWRUb3VjaGVzOiBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgICAgICAgdG91Y2hFdmVudDogZXZlbnRcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGdlc3R1cmUucHJlc3NpbmdIYW5kbGVyKVxuICAgICAgICAgIGdlc3R1cmUucHJlc3NpbmdIYW5kbGVyID0gbnVsbFxuICAgICAgICB9XG4gICAgICB9KGV2ZW50LnNyY0VsZW1lbnQgfHwgZXZlbnQudGFyZ2V0LCBldmVudC5jaGFuZ2VkVG91Y2hlc1tpXSksIDUwMClcbiAgICB9XG4gICAgZ2VzdHVyZXNbdG91Y2guaWRlbnRpZmllcl0gPSBnZXN0dXJlXG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoZ2VzdHVyZXMpLmxlbmd0aCA9PSAyKSB7XG4gICAgdmFyIGVsZW1lbnRzID0gW11cblxuICAgIGZvciAodmFyIHAgaW4gZ2VzdHVyZXMpIHtcbiAgICAgIGVsZW1lbnRzLnB1c2goZ2VzdHVyZXNbcF0uZWxlbWVudClcbiAgICB9XG5cbiAgICBmaXJlRXZlbnQoZ2V0Q29tbW9uQW5jZXN0b3IoZWxlbWVudHNbMF0sIGVsZW1lbnRzWzFdKSwgJ2R1YWx0b3VjaHN0YXJ0Jywge1xuICAgICAgdG91Y2hlczogc2xpY2UuY2FsbChldmVudC50b3VjaGVzKSxcbiAgICAgIHRvdWNoRXZlbnQ6IGV2ZW50XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIHRha2Ugb3ZlciB0b3VjaG1vdmUgZXZlbnRzLCBhbmQgaGFuZGxlIHBhbiBhbmQgZHVhbCByZWxhdGVkIGdlc3R1cmVzLlxuICpcbiAqIDEuIHRyYXZlcnNlIGV2ZXJ5IHRvdWNoIHBvaW5077yaXG4gKiA+IGlmICd0YXBwaW5nJyBhbmQgdGhlIHNoaWZ0IGlzIG92ZXIgMTAgcGl4bGVzLCB0aGVuIGl0J3MgYSAncGFubmluZycuXG4gKiAyLiBpZiB0aGVyZSBhcmUgdHdvIHRvdWNoIHBvaW50cywgdGhlbiBjYWxjIHRoZSB0cmFuZm9ybSBhbmQgdHJpZ2dlclxuICogICAnZHVhbHRvdWNoJy5cbiAqXG4gKiBAZXZlbnRcbiAqIEBwYXJhbSAge2V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiB0b3VjaG1vdmVIYW5kbGVyKGV2ZW50KSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1tpXVxuICAgIHZhciBnZXN0dXJlID0gZ2VzdHVyZXNbdG91Y2guaWRlbnRpZmllcl1cblxuICAgIGlmICghZ2VzdHVyZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFnZXN0dXJlLmxhc3RUb3VjaCkge1xuICAgICAgZ2VzdHVyZS5sYXN0VG91Y2ggPSBnZXN0dXJlLnN0YXJ0VG91Y2hcbiAgICB9XG4gICAgaWYgKCFnZXN0dXJlLmxhc3RUaW1lKSB7XG4gICAgICBnZXN0dXJlLmxhc3RUaW1lID0gZ2VzdHVyZS5zdGFydFRpbWVcbiAgICB9XG4gICAgaWYgKCFnZXN0dXJlLnZlbG9jaXR5WCkge1xuICAgICAgZ2VzdHVyZS52ZWxvY2l0eVggPSAwXG4gICAgfVxuICAgIGlmICghZ2VzdHVyZS52ZWxvY2l0eVkpIHtcbiAgICAgIGdlc3R1cmUudmVsb2NpdHlZID0gMFxuICAgIH1cbiAgICBpZiAoIWdlc3R1cmUuZHVyYXRpb24pIHtcbiAgICAgIGdlc3R1cmUuZHVyYXRpb24gPSAwXG4gICAgfVxuXG4gICAgdmFyIHRpbWUgPSAgRGF0ZS5ub3coKSAtIGdlc3R1cmUubGFzdFRpbWVcbiAgICB2YXIgdnggPSAodG91Y2guY2xpZW50WCAtIGdlc3R1cmUubGFzdFRvdWNoLmNsaWVudFgpIC8gdGltZVxuICAgIHZhciB2eSA9ICh0b3VjaC5jbGllbnRZIC0gZ2VzdHVyZS5sYXN0VG91Y2guY2xpZW50WSkgLyB0aW1lXG5cbiAgICB2YXIgUkVDT1JEX0RVUkFUSU9OID0gNzBcbiAgICBpZiAodGltZSA+IFJFQ09SRF9EVVJBVElPTikge1xuICAgICAgdGltZSA9IFJFQ09SRF9EVVJBVElPTlxuICAgIH1cbiAgICBpZiAoZ2VzdHVyZS5kdXJhdGlvbiArIHRpbWUgPiBSRUNPUkRfRFVSQVRJT04pIHtcbiAgICAgIGdlc3R1cmUuZHVyYXRpb24gPSBSRUNPUkRfRFVSQVRJT04gLSB0aW1lXG4gICAgfVxuXG4gICAgZ2VzdHVyZS52ZWxvY2l0eVggPSAoZ2VzdHVyZS52ZWxvY2l0eVggKiBnZXN0dXJlLmR1cmF0aW9uICsgdnggKiB0aW1lKVxuICAgICAgLyAoZ2VzdHVyZS5kdXJhdGlvbiArIHRpbWUpXG4gICAgZ2VzdHVyZS52ZWxvY2l0eVkgPSAoZ2VzdHVyZS52ZWxvY2l0eVkgKiBnZXN0dXJlLmR1cmF0aW9uICsgdnkgKiB0aW1lKVxuICAgICAgLyAoZ2VzdHVyZS5kdXJhdGlvbiArIHRpbWUpXG4gICAgZ2VzdHVyZS5kdXJhdGlvbiArPSB0aW1lXG5cbiAgICBnZXN0dXJlLmxhc3RUb3VjaCA9IHt9XG5cbiAgICBmb3IgKHZhciBwIGluIHRvdWNoKSB7XG4gICAgICBnZXN0dXJlLmxhc3RUb3VjaFtwXSA9IHRvdWNoW3BdXG4gICAgfVxuICAgIGdlc3R1cmUubGFzdFRpbWUgPSBEYXRlLm5vdygpXG5cbiAgICB2YXIgZGlzcGxhY2VtZW50WCA9IHRvdWNoLmNsaWVudFggLSBnZXN0dXJlLnN0YXJ0VG91Y2guY2xpZW50WFxuICAgIHZhciBkaXNwbGFjZW1lbnRZID0gdG91Y2guY2xpZW50WSAtIGdlc3R1cmUuc3RhcnRUb3VjaC5jbGllbnRZXG4gICAgdmFyIGRpc3RhbmNlID0gTWF0aC5zcXJ0KE1hdGgucG93KGRpc3BsYWNlbWVudFgsIDIpXG4gICAgICArIE1hdGgucG93KGRpc3BsYWNlbWVudFksIDIpKVxuICAgIHZhciBpc1ZlcnRpY2FsID0gIShNYXRoLmFicyhkaXNwbGFjZW1lbnRYKSA+IE1hdGguYWJzKGRpc3BsYWNlbWVudFkpKVxuICAgIHZhciBkaXJlY3Rpb24gPSBpc1ZlcnRpY2FsXG4gICAgICA/IGRpc3BsYWNlbWVudFkgPj0gMCA/ICdkb3duJyA6ICd1cCdcbiAgICAgIDogZGlzcGxhY2VtZW50WCA+PSAwID8gJ3JpZ2h0JyA6ICdsZWZ0J1xuXG4gICAgLy8gbWFnaWMgbnVtYmVyIDEwOiBtb3ZpbmcgMTBweCBtZWFucyBwYW4sIG5vdCB0YXBcbiAgICBpZiAoKGdlc3R1cmUuc3RhdHVzID09PSAndGFwcGluZycgfHwgZ2VzdHVyZS5zdGF0dXMgPT09ICdwcmVzc2luZycpXG4gICAgICAgICYmIGRpc3RhbmNlID4gMTApIHtcbiAgICAgIGdlc3R1cmUuc3RhdHVzID0gJ3Bhbm5pbmcnXG4gICAgICBnZXN0dXJlLmlzVmVydGljYWwgPSBpc1ZlcnRpY2FsXG4gICAgICBnZXN0dXJlLmRpcmVjdGlvbiA9IGRpcmVjdGlvblxuXG4gICAgICBmaXJlRXZlbnQoZ2VzdHVyZS5lbGVtZW50LCAncGFuc3RhcnQnLCB7XG4gICAgICAgIHRvdWNoOiB0b3VjaCxcbiAgICAgICAgdG91Y2hlczogZXZlbnQudG91Y2hlcyxcbiAgICAgICAgY2hhbmdlZFRvdWNoZXM6IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICB0b3VjaEV2ZW50OiBldmVudCxcbiAgICAgICAgaXNWZXJ0aWNhbDogZ2VzdHVyZS5pc1ZlcnRpY2FsLFxuICAgICAgICBkaXJlY3Rpb246IGRpcmVjdGlvblxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoZ2VzdHVyZS5zdGF0dXMgPT09ICdwYW5uaW5nJykge1xuICAgICAgZ2VzdHVyZS5wYW5UaW1lID0gRGF0ZS5ub3coKVxuXG4gICAgICBmaXJlRXZlbnQoZ2VzdHVyZS5lbGVtZW50LCAncGFubW92ZScsIHtcbiAgICAgICAgZGlzcGxhY2VtZW50WDogZGlzcGxhY2VtZW50WCxcbiAgICAgICAgZGlzcGxhY2VtZW50WTogZGlzcGxhY2VtZW50WSxcbiAgICAgICAgdG91Y2g6IHRvdWNoLFxuICAgICAgICB0b3VjaGVzOiBldmVudC50b3VjaGVzLFxuICAgICAgICBjaGFuZ2VkVG91Y2hlczogZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIHRvdWNoRXZlbnQ6IGV2ZW50LFxuICAgICAgICBpc1ZlcnRpY2FsOiBnZXN0dXJlLmlzVmVydGljYWwsXG4gICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhnZXN0dXJlcykubGVuZ3RoID09IDIpIHtcbiAgICB2YXIgcG9zaXRpb24gPSBbXVxuICAgIHZhciBjdXJyZW50ID0gW11cbiAgICB2YXIgZWxlbWVudHMgPSBbXVxuICAgIHZhciB0cmFuc2Zvcm1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnQudG91Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRvdWNoID0gZXZlbnQudG91Y2hlc1tpXVxuICAgICAgdmFyIGdlc3R1cmUgPSBnZXN0dXJlc1t0b3VjaC5pZGVudGlmaWVyXVxuICAgICAgcG9zaXRpb24ucHVzaChbZ2VzdHVyZS5zdGFydFRvdWNoLmNsaWVudFgsIGdlc3R1cmUuc3RhcnRUb3VjaC5jbGllbnRZXSlcbiAgICAgIGN1cnJlbnQucHVzaChbdG91Y2guY2xpZW50WCwgdG91Y2guY2xpZW50WV0pXG4gICAgfVxuXG4gICAgZm9yICh2YXIgcCBpbiBnZXN0dXJlcykge1xuICAgICAgZWxlbWVudHMucHVzaChnZXN0dXJlc1twXS5lbGVtZW50KVxuICAgIH1cblxuICAgIHRyYW5zZm9ybSA9IGNhbGMoXG4gICAgICBwb3NpdGlvblswXVswXSxcbiAgICAgIHBvc2l0aW9uWzBdWzFdLFxuICAgICAgcG9zaXRpb25bMV1bMF0sXG4gICAgICBwb3NpdGlvblsxXVsxXSxcbiAgICAgIGN1cnJlbnRbMF1bMF0sXG4gICAgICBjdXJyZW50WzBdWzFdLFxuICAgICAgY3VycmVudFsxXVswXSxcbiAgICAgIGN1cnJlbnRbMV1bMV1cbiAgICApXG4gICAgZmlyZUV2ZW50KGdldENvbW1vbkFuY2VzdG9yKGVsZW1lbnRzWzBdLCBlbGVtZW50c1sxXSksICdkdWFsdG91Y2gnLCB7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybSxcbiAgICAgIHRvdWNoZXM6IGV2ZW50LnRvdWNoZXMsXG4gICAgICB0b3VjaEV2ZW50OiBldmVudFxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBoYW5kbGUgdG91Y2hlbmQgZXZlbnRcbiAqXG4gKiAxLiBpZiB0aGVyZSBhcmUgdG93IHRvdWNoIHBvaW50cywgdGhlbiB0cmlnZ2VyICdkdWFsdG91Y2hlbmQn5aaCXG4gKlxuICogMi4gdHJhdmVyc2UgZXZlcnkgdG91Y2ggcGlvbnTvvJpcbiAqID4gaWYgdGFwcGluZywgdGhlbiB0cmlnZ2VyICd0YXAnLlxuICogSWYgdGhlcmUgaXMgYSB0YXAgMzAwIG1pbGxpc2Vjb25kcyBiZWZvcmUsIHRoZW4gaXQncyBhICdkb3VibGV0YXAnLlxuICogPiBpZiBwYWRkaW5nLCB0aGVuIGRlY2lkZSB0byB0cmlnZ2VyICdwYW5lbmQnIG9yICdzd2lwZSdcbiAqID4gaWYgcHJlc3NpbmcsIHRoZW4gdHJpZ2dlciAncHJlc3NlbmQnLlxuICpcbiAqIDMuIHJlbW92ZSBsaXN0ZW5lcnMuXG4gKlxuICogQGV2ZW50XG4gKiBAcGFyYW0gIHtldmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gdG91Y2hlbmRIYW5kbGVyKGV2ZW50KSB7XG5cbiAgaWYgKE9iamVjdC5rZXlzKGdlc3R1cmVzKS5sZW5ndGggPT0gMikge1xuICAgIHZhciBlbGVtZW50cyA9IFtdXG4gICAgZm9yICh2YXIgcCBpbiBnZXN0dXJlcykge1xuICAgICAgZWxlbWVudHMucHVzaChnZXN0dXJlc1twXS5lbGVtZW50KVxuICAgIH1cbiAgICBmaXJlRXZlbnQoZ2V0Q29tbW9uQW5jZXN0b3IoZWxlbWVudHNbMF0sIGVsZW1lbnRzWzFdKSwgJ2R1YWx0b3VjaGVuZCcsIHtcbiAgICAgIHRvdWNoZXM6IHNsaWNlLmNhbGwoZXZlbnQudG91Y2hlcyksXG4gICAgICB0b3VjaEV2ZW50OiBldmVudFxuICAgIH0pXG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHRvdWNoID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbaV1cbiAgICB2YXIgaWQgPSB0b3VjaC5pZGVudGlmaWVyXG4gICAgdmFyIGdlc3R1cmUgPSBnZXN0dXJlc1tpZF1cblxuICAgIGlmICghZ2VzdHVyZSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoZ2VzdHVyZS5wcmVzc2luZ0hhbmRsZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dChnZXN0dXJlLnByZXNzaW5nSGFuZGxlcilcbiAgICAgIGdlc3R1cmUucHJlc3NpbmdIYW5kbGVyID0gbnVsbFxuICAgIH1cblxuICAgIGlmIChnZXN0dXJlLnN0YXR1cyA9PT0gJ3RhcHBpbmcnKSB7XG4gICAgICBnZXN0dXJlLnRpbWVzdGFtcCA9IERhdGUubm93KClcbiAgICAgIC8vIGZpcmUgY2xpY2ssIG5vdCB0YXAuXG4gICAgICBmaXJlRXZlbnQoZ2VzdHVyZS5lbGVtZW50LCAndGFwJywge1xuICAgICAgICB0b3VjaDogdG91Y2gsXG4gICAgICAgIHRvdWNoRXZlbnQ6IGV2ZW50XG4gICAgICB9KVxuXG4gICAgICBpZiAobGFzdFRhcCAmJiBnZXN0dXJlLnRpbWVzdGFtcCAtIGxhc3RUYXAudGltZXN0YW1wIDwgMzAwKSB7XG4gICAgICAgIGZpcmVFdmVudChnZXN0dXJlLmVsZW1lbnQsICdkb3VibGV0YXAnLCB7XG4gICAgICAgICAgdG91Y2g6IHRvdWNoLFxuICAgICAgICAgIHRvdWNoRXZlbnQ6IGV2ZW50XG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGxhc3RUYXAgPSBnZXN0dXJlXG4gICAgfVxuXG4gICAgaWYgKGdlc3R1cmUuc3RhdHVzID09PSAncGFubmluZycpIHtcbiAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpXG4gICAgICB2YXIgZHVyYXRpb24gPSBub3cgLSBnZXN0dXJlLnN0YXJ0VGltZVxuICAgICAgdmFyIGRpc3BsYWNlbWVudFggPSB0b3VjaC5jbGllbnRYIC0gZ2VzdHVyZS5zdGFydFRvdWNoLmNsaWVudFhcbiAgICAgIHZhciBkaXNwbGFjZW1lbnRZID0gdG91Y2guY2xpZW50WSAtIGdlc3R1cmUuc3RhcnRUb3VjaC5jbGllbnRZXG5cbiAgICAgIHZhciB2ZWxvY2l0eSA9IE1hdGguc3FydChnZXN0dXJlLnZlbG9jaXR5WSAqIGdlc3R1cmUudmVsb2NpdHlZXG4gICAgICAgICsgZ2VzdHVyZS52ZWxvY2l0eVggKiBnZXN0dXJlLnZlbG9jaXR5WClcbiAgICAgIHZhciBpc1N3aXBlID0gdmVsb2NpdHkgPiAwLjUgJiYgKG5vdyAtIGdlc3R1cmUubGFzdFRpbWUpIDwgMTAwXG4gICAgICB2YXIgZXh0cmEgPSB7XG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgaXNTd2lwZTogaXNTd2lwZSxcbiAgICAgICAgdmVsb2NpdHlYOiBnZXN0dXJlLnZlbG9jaXR5WCxcbiAgICAgICAgdmVsb2NpdHlZOiBnZXN0dXJlLnZlbG9jaXR5WSxcbiAgICAgICAgZGlzcGxhY2VtZW50WDogZGlzcGxhY2VtZW50WCxcbiAgICAgICAgZGlzcGxhY2VtZW50WTogZGlzcGxhY2VtZW50WSxcbiAgICAgICAgdG91Y2g6IHRvdWNoLFxuICAgICAgICB0b3VjaGVzOiBldmVudC50b3VjaGVzLFxuICAgICAgICBjaGFuZ2VkVG91Y2hlczogZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIHRvdWNoRXZlbnQ6IGV2ZW50LFxuICAgICAgICBpc1ZlcnRpY2FsOiBnZXN0dXJlLmlzVmVydGljYWwsXG4gICAgICAgIGRpcmVjdGlvbjogZ2VzdHVyZS5kaXJlY3Rpb25cbiAgICAgIH1cblxuICAgICAgZmlyZUV2ZW50KGdlc3R1cmUuZWxlbWVudCwgJ3BhbmVuZCcsIGV4dHJhKVxuICAgICAgaWYgKGlzU3dpcGUpIHtcbiAgICAgICAgZmlyZUV2ZW50KGdlc3R1cmUuZWxlbWVudCwgJ3N3aXBlJywgZXh0cmEpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGdlc3R1cmUuc3RhdHVzID09PSAncHJlc3NpbmcnKSB7XG4gICAgICBmaXJlRXZlbnQoZ2VzdHVyZS5lbGVtZW50LCAncHJlc3NlbmQnLCB7XG4gICAgICAgIHRvdWNoOiB0b3VjaCxcbiAgICAgICAgdG91Y2hFdmVudDogZXZlbnRcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZGVsZXRlIGdlc3R1cmVzW2lkXVxuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGdlc3R1cmVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkb2NFbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0b3VjaG1vdmVIYW5kbGVyLCBmYWxzZSlcbiAgICBkb2NFbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRvdWNoZW5kSGFuZGxlciwgZmFsc2UpXG4gICAgZG9jRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0b3VjaGNhbmNlbEhhbmRsZXIsIGZhbHNlKVxuICB9XG59XG5cbi8qKlxuICogaGFuZGxlIHRvdWNoY2FuY2VsXG4gKlxuICogMS4gaWYgdGhlcmUgYXJlIHR3byB0b3VjaCBwb2ludHMsIHRoZW4gdHJpZ2dlciAnZHVhbHRvdWNoZW5kJ1xuICpcbiAqIDIuIHRyYXZlcnNlIGV2ZXJ0eSB0b3VjaCBwb2ludDpcbiAqID4gaWYgcGFubm5pZywgdGhlbiB0cmlnZ2VyICdwYW5lbmQnXG4gKiA+IGlmIHByZXNzaW5nLCB0aGVuIHRyaWdnZXIgJ3ByZXNzZW5kJ1xuICpcbiAqIDMuIHJlbW92ZSBsaXN0ZW5lcnNcbiAqXG4gKiBAZXZlbnRcbiAqIEBwYXJhbSAge2V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiB0b3VjaGNhbmNlbEhhbmRsZXIoZXZlbnQpIHtcblxuICBpZiAoT2JqZWN0LmtleXMoZ2VzdHVyZXMpLmxlbmd0aCA9PSAyKSB7XG4gICAgdmFyIGVsZW1lbnRzID0gW11cbiAgICBmb3IgKHZhciBwIGluIGdlc3R1cmVzKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKGdlc3R1cmVzW3BdLmVsZW1lbnQpXG4gICAgfVxuICAgIGZpcmVFdmVudChnZXRDb21tb25BbmNlc3RvcihlbGVtZW50c1swXSwgZWxlbWVudHNbMV0pLCAnZHVhbHRvdWNoZW5kJywge1xuICAgICAgdG91Y2hlczogc2xpY2UuY2FsbChldmVudC50b3VjaGVzKSxcbiAgICAgIHRvdWNoRXZlbnQ6IGV2ZW50XG4gICAgfSlcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1tpXVxuICAgIHZhciBpZCA9IHRvdWNoLmlkZW50aWZpZXJcbiAgICB2YXIgZ2VzdHVyZSA9IGdlc3R1cmVzW2lkXVxuXG4gICAgaWYgKCFnZXN0dXJlKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChnZXN0dXJlLnByZXNzaW5nSGFuZGxlcikge1xuICAgICAgY2xlYXJUaW1lb3V0KGdlc3R1cmUucHJlc3NpbmdIYW5kbGVyKVxuICAgICAgZ2VzdHVyZS5wcmVzc2luZ0hhbmRsZXIgPSBudWxsXG4gICAgfVxuXG4gICAgaWYgKGdlc3R1cmUuc3RhdHVzID09PSAncGFubmluZycpIHtcbiAgICAgIGZpcmVFdmVudChnZXN0dXJlLmVsZW1lbnQsICdwYW5lbmQnLCB7XG4gICAgICAgIHRvdWNoOiB0b3VjaCxcbiAgICAgICAgdG91Y2hlczogZXZlbnQudG91Y2hlcyxcbiAgICAgICAgY2hhbmdlZFRvdWNoZXM6IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICB0b3VjaEV2ZW50OiBldmVudFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGdlc3R1cmUuc3RhdHVzID09PSAncHJlc3NpbmcnKSB7XG4gICAgICBmaXJlRXZlbnQoZ2VzdHVyZS5lbGVtZW50LCAncHJlc3NlbmQnLCB7XG4gICAgICAgIHRvdWNoOiB0b3VjaCxcbiAgICAgICAgdG91Y2hFdmVudDogZXZlbnRcbiAgICAgIH0pXG4gICAgfVxuICAgIGRlbGV0ZSBnZXN0dXJlc1tpZF1cbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhnZXN0dXJlcykubGVuZ3RoID09PSAwKSB7XG4gICAgZG9jRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdG91Y2htb3ZlSGFuZGxlciwgZmFsc2UpXG4gICAgZG9jRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0b3VjaGVuZEhhbmRsZXIsIGZhbHNlKVxuICAgIGRvY0VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdG91Y2hjYW5jZWxIYW5kbGVyLCBmYWxzZSlcbiAgfVxufVxuXG5pZiAoIWlzSW5pdGlhbGl6ZWQpIHtcbiAgZG9jRWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRvdWNoc3RhcnRIYW5kbGVyLCBmYWxzZSlcbiAgaXNJbml0aWFsaXplZCA9IHRydWVcbn1cblxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qIGVzbGludC1kaXNhYmxlICovXG5cbi8vIFByb2R1Y3Rpb24gc3RlcHMgb2YgRUNNQS0yNjIsIEVkaXRpb24gNiwgMjIuMS4yLjFcbi8vIFJlZmVyZW5jZTogaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWFycmF5LmZyb21cblxuLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5pZiAoIUFycmF5LmZyb20pIHtcbiAgQXJyYXkuZnJvbSA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgIHZhciBpc0NhbGxhYmxlID0gZnVuY3Rpb24oZm4pIHtcbiAgICAgIHJldHVybiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgfHwgdG9TdHIuY2FsbChmbikgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG4gICAgfTtcbiAgICB2YXIgdG9JbnRlZ2VyID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBudW1iZXIgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgaWYgKGlzTmFOKG51bWJlcikpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBpZiAobnVtYmVyID09PSAwIHx8ICFpc0Zpbml0ZShudW1iZXIpKSB7XG4gICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gKG51bWJlciA+IDAgPyAxIDogLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyhudW1iZXIpKTtcbiAgICB9O1xuICAgIHZhciBtYXhTYWZlSW50ZWdlciA9IE1hdGgucG93KDIsIDUzKSAtIDE7XG4gICAgdmFyIHRvTGVuZ3RoID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBsZW4gPSB0b0ludGVnZXIodmFsdWUpO1xuICAgICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGxlbiwgMCksIG1heFNhZmVJbnRlZ2VyKTtcbiAgICB9O1xuXG4gICAgLy8gVGhlIGxlbmd0aCBwcm9wZXJ0eSBvZiB0aGUgZnJvbSBtZXRob2QgaXMgMS5cbiAgICByZXR1cm4gZnVuY3Rpb24gZnJvbShhcnJheUxpa2UvKiwgbWFwRm4sIHRoaXNBcmcgKi8pIHtcbiAgICAgIC8vIDEuIExldCBDIGJlIHRoZSB0aGlzIHZhbHVlLlxuICAgICAgdmFyIEMgPSB0aGlzO1xuXG4gICAgICAvLyAyLiBMZXQgaXRlbXMgYmUgVG9PYmplY3QoYXJyYXlMaWtlKS5cbiAgICAgIHZhciBpdGVtcyA9IE9iamVjdChhcnJheUxpa2UpO1xuXG4gICAgICAvLyAzLiBSZXR1cm5JZkFicnVwdChpdGVtcykuXG4gICAgICBpZiAoYXJyYXlMaWtlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkuZnJvbSByZXF1aXJlcyBhbiBhcnJheS1saWtlIG9iamVjdCAtIG5vdCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuICAgICAgfVxuXG4gICAgICAvLyA0LiBJZiBtYXBmbiBpcyB1bmRlZmluZWQsIHRoZW4gbGV0IG1hcHBpbmcgYmUgZmFsc2UuXG4gICAgICB2YXIgbWFwRm4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHZvaWQgdW5kZWZpbmVkO1xuICAgICAgdmFyIFQ7XG4gICAgICBpZiAodHlwZW9mIG1hcEZuICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyA1LiBlbHNlXG4gICAgICAgIC8vIDUuIGEgSWYgSXNDYWxsYWJsZShtYXBmbikgaXMgZmFsc2UsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi5cbiAgICAgICAgaWYgKCFpc0NhbGxhYmxlKG1hcEZuKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5LmZyb206IHdoZW4gcHJvdmlkZWQsIHRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyA1LiBiLiBJZiB0aGlzQXJnIHdhcyBzdXBwbGllZCwgbGV0IFQgYmUgdGhpc0FyZzsgZWxzZSBsZXQgVCBiZSB1bmRlZmluZWQuXG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuICAgICAgICAgIFQgPSBhcmd1bWVudHNbMl07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gMTAuIExldCBsZW5WYWx1ZSBiZSBHZXQoaXRlbXMsIFwibGVuZ3RoXCIpLlxuICAgICAgLy8gMTEuIExldCBsZW4gYmUgVG9MZW5ndGgobGVuVmFsdWUpLlxuICAgICAgdmFyIGxlbiA9IHRvTGVuZ3RoKGl0ZW1zLmxlbmd0aCk7XG5cbiAgICAgIC8vIDEzLiBJZiBJc0NvbnN0cnVjdG9yKEMpIGlzIHRydWUsIHRoZW5cbiAgICAgIC8vIDEzLiBhLiBMZXQgQSBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgbWV0aG9kIG9mIEMgd2l0aCBhbiBhcmd1bWVudCBsaXN0IGNvbnRhaW5pbmcgdGhlIHNpbmdsZSBpdGVtIGxlbi5cbiAgICAgIC8vIDE0LiBhLiBFbHNlLCBMZXQgQSBiZSBBcnJheUNyZWF0ZShsZW4pLlxuICAgICAgdmFyIEEgPSBpc0NhbGxhYmxlKEMpID8gT2JqZWN0KG5ldyBDKGxlbikpIDogbmV3IEFycmF5KGxlbik7XG5cbiAgICAgIC8vIDE2LiBMZXQgayBiZSAwLlxuICAgICAgdmFyIGsgPSAwO1xuICAgICAgLy8gMTcuIFJlcGVhdCwgd2hpbGUgayA8IGxlbuKApiAoYWxzbyBzdGVwcyBhIC0gaClcbiAgICAgIHZhciBrVmFsdWU7XG4gICAgICB3aGlsZSAoayA8IGxlbikge1xuICAgICAgICBrVmFsdWUgPSBpdGVtc1trXTtcbiAgICAgICAgaWYgKG1hcEZuKSB7XG4gICAgICAgICAgQVtrXSA9IHR5cGVvZiBUID09PSAndW5kZWZpbmVkJyA/IG1hcEZuKGtWYWx1ZSwgaykgOiBtYXBGbi5jYWxsKFQsIGtWYWx1ZSwgayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgQVtrXSA9IGtWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBrICs9IDE7XG4gICAgICB9XG4gICAgICAvLyAxOC4gTGV0IHB1dFN0YXR1cyBiZSBQdXQoQSwgXCJsZW5ndGhcIiwgbGVuLCB0cnVlKS5cbiAgICAgIEEubGVuZ3RoID0gbGVuO1xuICAgICAgLy8gMjAuIFJldHVybiBBLlxuICAgICAgcmV0dXJuIEE7XG4gICAgfTtcbiAgfSgpKTtcbn1cbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG52YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGYgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuaWYodHlwZW9mIF9fZyA9PSAnbnVtYmVyJylfX2cgPSBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWYiLCJ2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0ge3ZlcnNpb246ICcyLjQuMCd9O1xuaWYodHlwZW9mIF9fZSA9PSAnbnVtYmVyJylfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59OyIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKCFpc09iamVjdChpdCkpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYW4gb2JqZWN0IScpO1xuICByZXR1cm4gaXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZXhlYyl7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoKGUpe1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59OyIsIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcbn0pOyIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudFxuICAvLyBpbiBvbGQgSUUgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCdcbiAgLCBpcyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdkaXYnKSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcbn0pOyIsIi8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIFMpe1xuICBpZighaXNPYmplY3QoaXQpKXJldHVybiBpdDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpcmV0dXJuIHZhbDtcbiAgaWYodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICBpZighUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59OyIsInZhciBhbk9iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuL19pZTgtZG9tLWRlZmluZScpXG4gICwgdG9QcmltaXRpdmUgICAgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKVxuICAsIGRQICAgICAgICAgICAgID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyl7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZihJRThfRE9NX0RFRklORSl0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuICBpZignZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEnKTtcbiAgaWYoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKU9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihiaXRtYXAsIHZhbHVlKXtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlICA6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlICAgIDogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZSAgICAgICA6IHZhbHVlXG4gIH07XG59OyIsInZhciBkUCAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTsiLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIGtleSl7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTsiLCJ2YXIgaWQgPSAwXG4gICwgcHggPSBNYXRoLnJhbmRvbSgpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTsiLCJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBoaWRlICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCBoYXMgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIFNSQyAgICAgICA9IHJlcXVpcmUoJy4vX3VpZCcpKCdzcmMnKVxuICAsIFRPX1NUUklORyA9ICd0b1N0cmluZydcbiAgLCAkdG9TdHJpbmcgPSBGdW5jdGlvbltUT19TVFJJTkddXG4gICwgVFBMICAgICAgID0gKCcnICsgJHRvU3RyaW5nKS5zcGxpdChUT19TVFJJTkcpO1xuXG5yZXF1aXJlKCcuL19jb3JlJykuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuICR0b1N0cmluZy5jYWxsKGl0KTtcbn07XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKE8sIGtleSwgdmFsLCBzYWZlKXtcbiAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2YgdmFsID09ICdmdW5jdGlvbic7XG4gIGlmKGlzRnVuY3Rpb24paGFzKHZhbCwgJ25hbWUnKSB8fCBoaWRlKHZhbCwgJ25hbWUnLCBrZXkpO1xuICBpZihPW2tleV0gPT09IHZhbClyZXR1cm47XG4gIGlmKGlzRnVuY3Rpb24paGFzKHZhbCwgU1JDKSB8fCBoaWRlKHZhbCwgU1JDLCBPW2tleV0gPyAnJyArIE9ba2V5XSA6IFRQTC5qb2luKFN0cmluZyhrZXkpKSk7XG4gIGlmKE8gPT09IGdsb2JhbCl7XG4gICAgT1trZXldID0gdmFsO1xuICB9IGVsc2Uge1xuICAgIGlmKCFzYWZlKXtcbiAgICAgIGRlbGV0ZSBPW2tleV07XG4gICAgICBoaWRlKE8sIGtleSwgdmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYoT1trZXldKU9ba2V5XSA9IHZhbDtcbiAgICAgIGVsc2UgaGlkZShPLCBrZXksIHZhbCk7XG4gICAgfVxuICB9XG4vLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmVcbn0pKEZ1bmN0aW9uLnByb3RvdHlwZSwgVE9fU1RSSU5HLCBmdW5jdGlvbiB0b1N0cmluZygpe1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiB0aGlzW1NSQ10gfHwgJHRvU3RyaW5nLmNhbGwodGhpcyk7XG59KTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTtcbiAgcmV0dXJuIGl0O1xufTsiLCIvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuLCB0aGF0LCBsZW5ndGgpe1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZih0aGF0ID09PSB1bmRlZmluZWQpcmV0dXJuIGZuO1xuICBzd2l0Y2gobGVuZ3RoKXtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbihhKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24oYSwgYil7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uKGEsIGIsIGMpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24oLyogLi4uYXJncyAqLyl7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59OyIsInZhciBnbG9iYWwgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGNvcmUgICAgICA9IHJlcXVpcmUoJy4vX2NvcmUnKVxuICAsIGhpZGUgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIHJlZGVmaW5lICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBjdHggICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgJGV4cG9ydCA9IGZ1bmN0aW9uKHR5cGUsIG5hbWUsIHNvdXJjZSl7XG4gIHZhciBJU19GT1JDRUQgPSB0eXBlICYgJGV4cG9ydC5GXG4gICAgLCBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HXG4gICAgLCBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TXG4gICAgLCBJU19QUk9UTyAgPSB0eXBlICYgJGV4cG9ydC5QXG4gICAgLCBJU19CSU5EICAgPSB0eXBlICYgJGV4cG9ydC5CXG4gICAgLCB0YXJnZXQgICAgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gfHwgKGdsb2JhbFtuYW1lXSA9IHt9KSA6IChnbG9iYWxbbmFtZV0gfHwge30pW1BST1RPVFlQRV1cbiAgICAsIGV4cG9ydHMgICA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pXG4gICAgLCBleHBQcm90byAgPSBleHBvcnRzW1BST1RPVFlQRV0gfHwgKGV4cG9ydHNbUFJPVE9UWVBFXSA9IHt9KVxuICAgICwga2V5LCBvd24sIG91dCwgZXhwO1xuICBpZihJU19HTE9CQUwpc291cmNlID0gbmFtZTtcbiAgZm9yKGtleSBpbiBzb3VyY2Upe1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcbiAgICBvdXQgPSAob3duID8gdGFyZ2V0IDogc291cmNlKVtrZXldO1xuICAgIC8vIGJpbmQgdGltZXJzIHRvIGdsb2JhbCBmb3IgY2FsbCBmcm9tIGV4cG9ydCBjb250ZXh0XG4gICAgZXhwID0gSVNfQklORCAmJiBvd24gPyBjdHgob3V0LCBnbG9iYWwpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIGlmKHRhcmdldClyZWRlZmluZSh0YXJnZXQsIGtleSwgb3V0LCB0eXBlICYgJGV4cG9ydC5VKTtcbiAgICAvLyBleHBvcnRcbiAgICBpZihleHBvcnRzW2tleV0gIT0gb3V0KWhpZGUoZXhwb3J0cywga2V5LCBleHApO1xuICAgIGlmKElTX1BST1RPICYmIGV4cFByb3RvW2tleV0gIT0gb3V0KWV4cFByb3RvW2tleV0gPSBvdXQ7XG4gIH1cbn07XG5nbG9iYWwuY29yZSA9IGNvcmU7XG4vLyB0eXBlIGJpdG1hcFxuJGV4cG9ydC5GID0gMTsgICAvLyBmb3JjZWRcbiRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG4kZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuJGV4cG9ydC5QID0gODsgICAvLyBwcm90b1xuJGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG4kZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcbiRleHBvcnQuVSA9IDY0OyAgLy8gc2FmZVxuJGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgIFxubW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0OyIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07IiwiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBjb2YoaXQpID09ICdTdHJpbmcnID8gaXQuc3BsaXQoJycpIDogT2JqZWN0KGl0KTtcbn07IiwiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZihpdCA9PSB1bmRlZmluZWQpdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59OyIsIi8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0JylcbiAgLCBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBJT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07IiwiLy8gNy4xLjQgVG9JbnRlZ2VyXG52YXIgY2VpbCAgPSBNYXRoLmNlaWxcbiAgLCBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59OyIsIi8vIDcuMS4xNSBUb0xlbmd0aFxudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKVxuICAsIG1pbiAgICAgICA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59OyIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBtYXggICAgICAgPSBNYXRoLm1heFxuICAsIG1pbiAgICAgICA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpbmRleCwgbGVuZ3RoKXtcbiAgaW5kZXggPSB0b0ludGVnZXIoaW5kZXgpO1xuICByZXR1cm4gaW5kZXggPCAwID8gbWF4KGluZGV4ICsgbGVuZ3RoLCAwKSA6IG1pbihpbmRleCwgbGVuZ3RoKTtcbn07IiwiLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCB0b0xlbmd0aCAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIHRvSW5kZXggICA9IHJlcXVpcmUoJy4vX3RvLWluZGV4Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKElTX0lOQ0xVREVTKXtcbiAgcmV0dXJuIGZ1bmN0aW9uKCR0aGlzLCBlbCwgZnJvbUluZGV4KXtcbiAgICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KCR0aGlzKVxuICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aClcbiAgICAgICwgaW5kZXggID0gdG9JbmRleChmcm9tSW5kZXgsIGxlbmd0aClcbiAgICAgICwgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIGlmKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKXdoaWxlKGxlbmd0aCA+IGluZGV4KXtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIGlmKHZhbHVlICE9IHZhbHVlKXJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I3RvSW5kZXggaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKylpZihJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKXtcbiAgICAgIGlmKE9baW5kZXhdID09PSBlbClyZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59OyIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nXG4gICwgc3RvcmUgID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHt9KTtcbn07IiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdrZXlzJylcbiAgLCB1aWQgICAgPSByZXF1aXJlKCcuL191aWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcbn07IiwidmFyIGhhcyAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgdG9JT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgYXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSlcbiAgLCBJRV9QUk9UTyAgICAgPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqZWN0LCBuYW1lcyl7XG4gIHZhciBPICAgICAgPSB0b0lPYmplY3Qob2JqZWN0KVxuICAgICwgaSAgICAgID0gMFxuICAgICwgcmVzdWx0ID0gW11cbiAgICAsIGtleTtcbiAgZm9yKGtleSBpbiBPKWlmKGtleSAhPSBJRV9QUk9UTyloYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlKG5hbWVzLmxlbmd0aCA+IGkpaWYoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKXtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59OyIsIi8vIElFIDgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gKFxuICAnY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSx0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mJ1xuKS5zcGxpdCgnLCcpOyIsIi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxudmFyICRrZXlzICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKVxuICAsIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTyl7XG4gIHJldHVybiAka2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59OyIsImV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7IiwiZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7IiwiLy8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIE9iamVjdChkZWZpbmVkKGl0KSk7XG59OyIsIid1c2Ugc3RyaWN0Jztcbi8vIDE5LjEuMi4xIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UsIC4uLilcbnZhciBnZXRLZXlzICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJylcbiAgLCBnT1BTICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJylcbiAgLCBwSUUgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKVxuICAsIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0JylcbiAgLCBJT2JqZWN0ICA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKVxuICAsICRhc3NpZ24gID0gT2JqZWN0LmFzc2lnbjtcblxuLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG5tb2R1bGUuZXhwb3J0cyA9ICEkYXNzaWduIHx8IHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgdmFyIEEgPSB7fVxuICAgICwgQiA9IHt9XG4gICAgLCBTID0gU3ltYm9sKClcbiAgICAsIEsgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnO1xuICBBW1NdID0gNztcbiAgSy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbihrKXsgQltrXSA9IGs7IH0pO1xuICByZXR1cm4gJGFzc2lnbih7fSwgQSlbU10gIT0gNyB8fCBPYmplY3Qua2V5cygkYXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gSztcbn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKXsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICB2YXIgVCAgICAgPSB0b09iamVjdCh0YXJnZXQpXG4gICAgLCBhTGVuICA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAsIGluZGV4ID0gMVxuICAgICwgZ2V0U3ltYm9scyA9IGdPUFMuZlxuICAgICwgaXNFbnVtICAgICA9IHBJRS5mO1xuICB3aGlsZShhTGVuID4gaW5kZXgpe1xuICAgIHZhciBTICAgICAgPSBJT2JqZWN0KGFyZ3VtZW50c1tpbmRleCsrXSlcbiAgICAgICwga2V5cyAgID0gZ2V0U3ltYm9scyA/IGdldEtleXMoUykuY29uY2F0KGdldFN5bWJvbHMoUykpIDogZ2V0S2V5cyhTKVxuICAgICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuICAgICAgLCBqICAgICAgPSAwXG4gICAgICAsIGtleTtcbiAgICB3aGlsZShsZW5ndGggPiBqKWlmKGlzRW51bS5jYWxsKFMsIGtleSA9IGtleXNbaisrXSkpVFtrZXldID0gU1trZXldO1xuICB9IHJldHVybiBUO1xufSA6ICRhc3NpZ247IiwiLy8gMTkuMS4zLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GLCAnT2JqZWN0Jywge2Fzc2lnbjogcmVxdWlyZSgnLi9fb2JqZWN0LWFzc2lnbicpfSk7IiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgJ2NvcmUtanMvZm4vb2JqZWN0L2Fzc2lnbidcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG4vLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9XZWJSZWZsZWN0aW9uLzU1OTM1NTRcblxuLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5pZiAoIU9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICBPYmplY3Quc2V0UHJvdG90eXBlT2YgPSAoZnVuY3Rpb24oT2JqZWN0LCBtYWdpYykge1xuICAgIHZhciBzZXQ7XG4gICAgZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHtcbiAgICAgIHNldC5jYWxsKE8sIHByb3RvKTtcbiAgICAgIHJldHVybiBPO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gdGhpcyB3b3JrcyBhbHJlYWR5IGluIEZpcmVmb3ggYW5kIFNhZmFyaVxuICAgICAgc2V0ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCBtYWdpYykuc2V0O1xuICAgICAgc2V0LmNhbGwoe30sIG51bGwpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgLy8gSUUgPCAxMSBjYW5ub3QgYmUgc2hpbW1lZFxuICAgICAgICBPYmplY3QucHJvdG90eXBlICE9PSB7fVttYWdpY10gfHxcbiAgICAgICAgLy8gbmVpdGhlciBjYW4gYW55IGJyb3dzZXIgdGhhdCBhY3R1YWxseVxuICAgICAgICAvLyBpbXBsZW1lbnRlZCBfX3Byb3RvX18gY29ycmVjdGx5XG4gICAgICAgIC8vIChhbGwgYnV0IG9sZCBWOCB3aWxsIHJldHVybiBoZXJlKVxuICAgICAgICB7X19wcm90b19fOiBudWxsfS5fX3Byb3RvX18gPT09IHZvaWQgMFxuICAgICAgICAvLyB0aGlzIGNhc2UgbWVhbnMgbnVsbCBvYmplY3RzIGNhbm5vdCBiZSBwYXNzZWRcbiAgICAgICAgLy8gdGhyb3VnaCBzZXRQcm90b3R5cGVPZiBpbiBhIHJlbGlhYmxlIHdheVxuICAgICAgICAvLyB3aGljaCBtZWFucyBoZXJlIGEgKipTaGFtKiogaXMgbmVlZGVkIGluc3RlYWRcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBub2RlanMgMC44IGFuZCAwLjEwIGFyZSAoYnVnZ3kgYW5kLi4pIGZpbmUgaGVyZVxuICAgICAgLy8gcHJvYmFibHkgQ2hyb21lIG9yIHNvbWUgb2xkIE1vYmlsZSBzdG9jayBicm93c2VyXG4gICAgICBzZXQgPSBmdW5jdGlvbihwcm90bykge1xuICAgICAgICB0aGlzW21hZ2ljXSA9IHByb3RvO1xuICAgICAgfTtcbiAgICAgIC8vIHBsZWFzZSBub3RlIHRoYXQgdGhpcyB3aWxsICoqbm90Kiogd29ya1xuICAgICAgLy8gaW4gdGhvc2UgYnJvd3NlcnMgdGhhdCBkbyBub3QgaW5oZXJpdFxuICAgICAgLy8gX19wcm90b19fIGJ5IG1pc3Rha2UgZnJvbSBPYmplY3QucHJvdG90eXBlXG4gICAgICAvLyBpbiB0aGVzZSBjYXNlcyB3ZSBzaG91bGQgcHJvYmFibHkgdGhyb3cgYW4gZXJyb3JcbiAgICAgIC8vIG9yIGF0IGxlYXN0IGJlIGluZm9ybWVkIGFib3V0IHRoZSBpc3N1ZVxuICAgICAgc2V0UHJvdG90eXBlT2YucG9seWZpbGwgPSBzZXRQcm90b3R5cGVPZihcbiAgICAgICAgc2V0UHJvdG90eXBlT2Yoe30sIG51bGwpLFxuICAgICAgICBPYmplY3QucHJvdG90eXBlXG4gICAgICApIGluc3RhbmNlb2YgT2JqZWN0O1xuICAgICAgLy8gc2V0UHJvdG90eXBlT2YucG9seWZpbGwgPT09IHRydWUgbWVhbnMgaXQgd29ya3MgYXMgbWVhbnRcbiAgICAgIC8vIHNldFByb3RvdHlwZU9mLnBvbHlmaWxsID09PSBmYWxzZSBtZWFucyBpdCdzIG5vdCAxMDAlIHJlbGlhYmxlXG4gICAgICAvLyBzZXRQcm90b3R5cGVPZi5wb2x5ZmlsbCA9PT0gdW5kZWZpbmVkXG4gICAgICAvLyBvclxuICAgICAgLy8gc2V0UHJvdG90eXBlT2YucG9seWZpbGwgPT0gIG51bGwgbWVhbnMgaXQncyBub3QgYSBwb2x5ZmlsbFxuICAgICAgLy8gd2hpY2ggbWVhbnMgaXQgd29ya3MgYXMgZXhwZWN0ZWRcbiAgICAgIC8vIHdlIGNhbiBldmVuIGRlbGV0ZSBPYmplY3QucHJvdG90eXBlLl9fcHJvdG9fXztcbiAgICB9XG4gICAgcmV0dXJuIHNldFByb3RvdHlwZU9mO1xuICB9KE9iamVjdCwgJ19fcHJvdG9fXycpKTtcbn1cbiIsInZhciBzdG9yZSAgICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ3drcycpXG4gICwgdWlkICAgICAgICA9IHJlcXVpcmUoJy4vX3VpZCcpXG4gICwgU3ltYm9sICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLlN5bWJvbFxuICAsIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5cbnZhciAkZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obmFtZSl7XG4gIHJldHVybiBzdG9yZVtuYW1lXSB8fCAoc3RvcmVbbmFtZV0gPVxuICAgIFVTRV9TWU1CT0wgJiYgU3ltYm9sW25hbWVdIHx8IChVU0VfU1lNQk9MID8gU3ltYm9sIDogdWlkKSgnU3ltYm9sLicgKyBuYW1lKSk7XG59O1xuXG4kZXhwb3J0cy5zdG9yZSA9IHN0b3JlOyIsIi8vIGdldHRpbmcgdGFnIGZyb20gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJylcbiAgLCBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKVxuICAvLyBFUzMgd3JvbmcgaGVyZVxuICAsIEFSRyA9IGNvZihmdW5jdGlvbigpeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uKGl0LCBrZXkpe1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUQUcpKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07IiwiJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsIHRlc3QgICAgPSB7fTtcbnRlc3RbcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyldID0gJ3onO1xuaWYodGVzdCArICcnICE9ICdbb2JqZWN0IHpdJyl7XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoT2JqZWN0LnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKXtcbiAgICByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7XG4gIH0sIHRydWUpO1xufSIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBkZWZpbmVkICAgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG4vLyB0cnVlICAtPiBTdHJpbmcjYXRcbi8vIGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihUT19TVFJJTkcpe1xuICByZXR1cm4gZnVuY3Rpb24odGhhdCwgcG9zKXtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKVxuICAgICAgLCBpID0gdG9JbnRlZ2VyKHBvcylcbiAgICAgICwgbCA9IHMubGVuZ3RoXG4gICAgICAsIGEsIGI7XG4gICAgaWYoaSA8IDAgfHwgaSA+PSBsKXJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBhIDwgMHhkODAwIHx8IGEgPiAweGRiZmYgfHwgaSArIDEgPT09IGwgfHwgKGIgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBiID4gMHhkZmZmXG4gICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG4gIH07XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZmFsc2U7IiwibW9kdWxlLmV4cG9ydHMgPSB7fTsiLCJ2YXIgZFAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBnZXRLZXlzICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKXtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzICAgPSBnZXRLZXlzKFByb3BlcnRpZXMpXG4gICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuICAgICwgaSA9IDBcbiAgICAsIFA7XG4gIHdoaWxlKGxlbmd0aCA+IGkpZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcbiAgcmV0dXJuIE87XG59OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OyIsIi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxudmFyIGFuT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBkUHMgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcHMnKVxuICAsIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpXG4gICwgSUVfUFJPVE8gICAgPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJylcbiAgLCBFbXB0eSAgICAgICA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH1cbiAgLCBQUk9UT1RZUEUgICA9ICdwcm90b3R5cGUnO1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uKCl7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2lmcmFtZScpXG4gICAgLCBpICAgICAgPSBlbnVtQnVnS2V5cy5sZW5ndGhcbiAgICAsIGx0ICAgICA9ICc8J1xuICAgICwgZ3QgICAgID0gJz4nXG4gICAgLCBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlcXVpcmUoJy4vX2h0bWwnKS5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zY3JpcHQtdXJsXG4gIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XG4gIC8vIGh0bWwucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShsdCArICdzY3JpcHQnICsgZ3QgKyAnZG9jdW1lbnQuRj1PYmplY3QnICsgbHQgKyAnL3NjcmlwdCcgKyBndCk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuICB3aGlsZShpLS0pZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tpXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpe1xuICB2YXIgcmVzdWx0O1xuICBpZihPICE9PSBudWxsKXtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5O1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBkZWYgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mXG4gICwgaGFzID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgdGFnLCBzdGF0KXtcbiAgaWYoaXQgJiYgIWhhcyhpdCA9IHN0YXQgPyBpdCA6IGl0LnByb3RvdHlwZSwgVEFHKSlkZWYoaXQsIFRBRywge2NvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRhZ30pO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJylcbiAgLCBkZXNjcmlwdG9yICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKVxuICAsIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKVxuICAsIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19oaWRlJykoSXRlcmF0b3JQcm90b3R5cGUsIHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpe1xuICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHtuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpfSk7XG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTsiLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCB0b09iamVjdCAgICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgSUVfUFJPVE8gICAgPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJylcbiAgLCBPYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uKE8pe1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmKGhhcyhPLCBJRV9QUk9UTykpcmV0dXJuIE9bSUVfUFJPVE9dO1xuICBpZih0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKXtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90byA6IG51bGw7XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZICAgICAgICA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCByZWRlZmluZSAgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBoaWRlICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIGhhcyAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBJdGVyYXRvcnMgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgJGl0ZXJDcmVhdGUgICAgPSByZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJylcbiAgLCBJVEVSQVRPUiAgICAgICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgQlVHR1kgICAgICAgICAgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSkgLy8gU2FmYXJpIGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuICAsIEZGX0lURVJBVE9SICAgID0gJ0BAaXRlcmF0b3InXG4gICwgS0VZUyAgICAgICAgICAgPSAna2V5cydcbiAgLCBWQUxVRVMgICAgICAgICA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCl7XG4gICRpdGVyQ3JlYXRlKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcbiAgdmFyIGdldE1ldGhvZCA9IGZ1bmN0aW9uKGtpbmQpe1xuICAgIGlmKCFCVUdHWSAmJiBraW5kIGluIHByb3RvKXJldHVybiBwcm90b1traW5kXTtcbiAgICBzd2l0Y2goa2luZCl7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgfTtcbiAgdmFyIFRBRyAgICAgICAgPSBOQU1FICsgJyBJdGVyYXRvcidcbiAgICAsIERFRl9WQUxVRVMgPSBERUZBVUxUID09IFZBTFVFU1xuICAgICwgVkFMVUVTX0JVRyA9IGZhbHNlXG4gICAgLCBwcm90byAgICAgID0gQmFzZS5wcm90b3R5cGVcbiAgICAsICRuYXRpdmUgICAgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF1cbiAgICAsICRkZWZhdWx0ICAgPSAkbmF0aXZlIHx8IGdldE1ldGhvZChERUZBVUxUKVxuICAgICwgJGVudHJpZXMgICA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWRcbiAgICAsICRhbnlOYXRpdmUgPSBOQU1FID09ICdBcnJheScgPyBwcm90by5lbnRyaWVzIHx8ICRuYXRpdmUgOiAkbmF0aXZlXG4gICAgLCBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuICAvLyBGaXggbmF0aXZlXG4gIGlmKCRhbnlOYXRpdmUpe1xuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoJGFueU5hdGl2ZS5jYWxsKG5ldyBCYXNlKSk7XG4gICAgaWYoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpe1xuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JQcm90b3R5cGUsIFRBRywgdHJ1ZSk7XG4gICAgICAvLyBmaXggZm9yIHNvbWUgb2xkIGVuZ2luZXNcbiAgICAgIGlmKCFMSUJSQVJZICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSloaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYoREVGX1ZBTFVFUyAmJiAkbmF0aXZlICYmICRuYXRpdmUubmFtZSAhPT0gVkFMVUVTKXtcbiAgICBWQUxVRVNfQlVHID0gdHJ1ZTtcbiAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZigoIUxJQlJBUlkgfHwgRk9SQ0VEKSAmJiAoQlVHR1kgfHwgVkFMVUVTX0JVRyB8fCAhcHJvdG9bSVRFUkFUT1JdKSl7XG4gICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcbiAgfVxuICAvLyBQbHVnIGZvciBsaWJyYXJ5XG4gIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuICBJdGVyYXRvcnNbVEFHXSAgPSByZXR1cm5UaGlzO1xuICBpZihERUZBVUxUKXtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiAgREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiAgICBJU19TRVQgICAgID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiAkZW50cmllc1xuICAgIH07XG4gICAgaWYoRk9SQ0VEKWZvcihrZXkgaW4gbWV0aG9kcyl7XG4gICAgICBpZighKGtleSBpbiBwcm90bykpcmVkZWZpbmUocHJvdG8sIGtleSwgbWV0aG9kc1trZXldKTtcbiAgICB9IGVsc2UgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoQlVHR1kgfHwgVkFMVUVTX0JVRyksIE5BTUUsIG1ldGhvZHMpO1xuICB9XG4gIHJldHVybiBtZXRob2RzO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgJGF0ICA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uKGl0ZXJhdGVkKXtcbiAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuLy8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24oKXtcbiAgdmFyIE8gICAgID0gdGhpcy5fdFxuICAgICwgaW5kZXggPSB0aGlzLl9pXG4gICAgLCBwb2ludDtcbiAgaWYoaW5kZXggPj0gTy5sZW5ndGgpcmV0dXJuIHt2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlfTtcbiAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHt2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlfTtcbn0pOyIsIi8vIDIyLjEuMy4zMSBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbnZhciBVTlNDT1BBQkxFUyA9IHJlcXVpcmUoJy4vX3drcycpKCd1bnNjb3BhYmxlcycpXG4gICwgQXJyYXlQcm90byAgPSBBcnJheS5wcm90b3R5cGU7XG5pZihBcnJheVByb3RvW1VOU0NPUEFCTEVTXSA9PSB1bmRlZmluZWQpcmVxdWlyZSgnLi9faGlkZScpKEFycmF5UHJvdG8sIFVOU0NPUEFCTEVTLCB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIEFycmF5UHJvdG9bVU5TQ09QQUJMRVNdW2tleV0gPSB0cnVlO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRvbmUsIHZhbHVlKXtcbiAgcmV0dXJuIHt2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZX07XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJylcbiAgLCBzdGVwICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJylcbiAgLCBJdGVyYXRvcnMgICAgICAgID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJylcbiAgLCB0b0lPYmplY3QgICAgICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xuXG4vLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuLy8gMjIuMS4zLjI5IEFycmF5LnByb3RvdHlwZS52YWx1ZXMoKVxuLy8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uKGl0ZXJhdGVkLCBraW5kKXtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbigpe1xuICB2YXIgTyAgICAgPSB0aGlzLl90XG4gICAgLCBraW5kICA9IHRoaXMuX2tcbiAgICAsIGluZGV4ID0gdGhpcy5faSsrO1xuICBpZighTyB8fCBpbmRleCA+PSBPLmxlbmd0aCl7XG4gICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gc3RlcCgxKTtcbiAgfVxuICBpZihraW5kID09ICdrZXlzJyAgKXJldHVybiBzdGVwKDAsIGluZGV4KTtcbiAgaWYoa2luZCA9PSAndmFsdWVzJylyZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7IiwidmFyICRpdGVyYXRvcnMgICAgPSByZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpXG4gICwgcmVkZWZpbmUgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBnbG9iYWwgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBoaWRlICAgICAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgSXRlcmF0b3JzICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgd2tzICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3drcycpXG4gICwgSVRFUkFUT1IgICAgICA9IHdrcygnaXRlcmF0b3InKVxuICAsIFRPX1NUUklOR19UQUcgPSB3a3MoJ3RvU3RyaW5nVGFnJylcbiAgLCBBcnJheVZhbHVlcyAgID0gSXRlcmF0b3JzLkFycmF5O1xuXG5mb3IodmFyIGNvbGxlY3Rpb25zID0gWydOb2RlTGlzdCcsICdET01Ub2tlbkxpc3QnLCAnTWVkaWFMaXN0JywgJ1N0eWxlU2hlZXRMaXN0JywgJ0NTU1J1bGVMaXN0J10sIGkgPSAwOyBpIDwgNTsgaSsrKXtcbiAgdmFyIE5BTUUgICAgICAgPSBjb2xsZWN0aW9uc1tpXVxuICAgICwgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXVxuICAgICwgcHJvdG8gICAgICA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGVcbiAgICAsIGtleTtcbiAgaWYocHJvdG8pe1xuICAgIGlmKCFwcm90b1tJVEVSQVRPUl0paGlkZShwcm90bywgSVRFUkFUT1IsIEFycmF5VmFsdWVzKTtcbiAgICBpZighcHJvdG9bVE9fU1RSSU5HX1RBR10paGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gICAgSXRlcmF0b3JzW05BTUVdID0gQXJyYXlWYWx1ZXM7XG4gICAgZm9yKGtleSBpbiAkaXRlcmF0b3JzKWlmKCFwcm90b1trZXldKXJlZGVmaW5lKHByb3RvLCBrZXksICRpdGVyYXRvcnNba2V5XSwgdHJ1ZSk7XG4gIH1cbn0iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSwgZm9yYmlkZGVuRmllbGQpe1xuICBpZighKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpIHx8IChmb3JiaWRkZW5GaWVsZCAhPT0gdW5kZWZpbmVkICYmIGZvcmJpZGRlbkZpZWxkIGluIGl0KSl7XG4gICAgdGhyb3cgVHlwZUVycm9yKG5hbWUgKyAnOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnKTtcbiAgfSByZXR1cm4gaXQ7XG59OyIsIi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3JcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdGVyYXRvciwgZm4sIHZhbHVlLCBlbnRyaWVzKXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZW50cmllcyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICAvLyA3LjQuNiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCBjb21wbGV0aW9uKVxuICB9IGNhdGNoKGUpe1xuICAgIHZhciByZXQgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYocmV0ICE9PSB1bmRlZmluZWQpYW5PYmplY3QocmV0LmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlO1xuICB9XG59OyIsIi8vIGNoZWNrIG9uIGRlZmF1bHQgQXJyYXkgaXRlcmF0b3JcbnZhciBJdGVyYXRvcnMgID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJylcbiAgLCBJVEVSQVRPUiAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b1tJVEVSQVRPUl0gPT09IGl0KTtcbn07IiwidmFyIGNsYXNzb2YgICA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsIElURVJBVE9SICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoaXQgIT0gdW5kZWZpbmVkKXJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07IiwidmFyIGN0eCAgICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBjYWxsICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXItY2FsbCcpXG4gICwgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJylcbiAgLCBhbk9iamVjdCAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgdG9MZW5ndGggICAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIGdldEl0ZXJGbiAgID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKVxuICAsIEJSRUFLICAgICAgID0ge31cbiAgLCBSRVRVUk4gICAgICA9IHt9O1xudmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZXJhYmxlLCBlbnRyaWVzLCBmbiwgdGhhdCwgSVRFUkFUT1Ipe1xuICB2YXIgaXRlckZuID0gSVRFUkFUT1IgPyBmdW5jdGlvbigpeyByZXR1cm4gaXRlcmFibGU7IH0gOiBnZXRJdGVyRm4oaXRlcmFibGUpXG4gICAgLCBmICAgICAgPSBjdHgoZm4sIHRoYXQsIGVudHJpZXMgPyAyIDogMSlcbiAgICAsIGluZGV4ICA9IDBcbiAgICAsIGxlbmd0aCwgc3RlcCwgaXRlcmF0b3IsIHJlc3VsdDtcbiAgaWYodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKXRocm93IFR5cGVFcnJvcihpdGVyYWJsZSArICcgaXMgbm90IGl0ZXJhYmxlIScpO1xuICAvLyBmYXN0IGNhc2UgZm9yIGFycmF5cyB3aXRoIGRlZmF1bHQgaXRlcmF0b3JcbiAgaWYoaXNBcnJheUl0ZXIoaXRlckZuKSlmb3IobGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4Kyspe1xuICAgIHJlc3VsdCA9IGVudHJpZXMgPyBmKGFuT2JqZWN0KHN0ZXAgPSBpdGVyYWJsZVtpbmRleF0pWzBdLCBzdGVwWzFdKSA6IGYoaXRlcmFibGVbaW5kZXhdKTtcbiAgICBpZihyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKXJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSBmb3IoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgKXtcbiAgICByZXN1bHQgPSBjYWxsKGl0ZXJhdG9yLCBmLCBzdGVwLnZhbHVlLCBlbnRyaWVzKTtcbiAgICBpZihyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKXJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5leHBvcnRzLkJSRUFLICA9IEJSRUFLO1xuZXhwb3J0cy5SRVRVUk4gPSBSRVRVUk47IiwiLy8gNy4zLjIwIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpXG52YXIgYW5PYmplY3QgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcbiAgLCBTUEVDSUVTICAgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihPLCBEKXtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvciwgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBEIDogYUZ1bmN0aW9uKFMpO1xufTsiLCIvLyBmYXN0IGFwcGx5LCBodHRwOi8vanNwZXJmLmxua2l0LmNvbS9mYXN0LWFwcGx5LzVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4sIGFyZ3MsIHRoYXQpe1xuICB2YXIgdW4gPSB0aGF0ID09PSB1bmRlZmluZWQ7XG4gIHN3aXRjaChhcmdzLmxlbmd0aCl7XG4gICAgY2FzZSAwOiByZXR1cm4gdW4gPyBmbigpXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQpO1xuICAgIGNhc2UgMTogcmV0dXJuIHVuID8gZm4oYXJnc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIGNhc2UgNDogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gIH0gcmV0dXJuICAgICAgICAgICAgICBmbi5hcHBseSh0aGF0LCBhcmdzKTtcbn07IiwidmFyIGN0eCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgaW52b2tlICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faW52b2tlJylcbiAgLCBodG1sICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19odG1sJylcbiAgLCBjZWwgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJylcbiAgLCBnbG9iYWwgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIHByb2Nlc3MgICAgICAgICAgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgc2V0VGFzayAgICAgICAgICAgID0gZ2xvYmFsLnNldEltbWVkaWF0ZVxuICAsIGNsZWFyVGFzayAgICAgICAgICA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZVxuICAsIE1lc3NhZ2VDaGFubmVsICAgICA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbFxuICAsIGNvdW50ZXIgICAgICAgICAgICA9IDBcbiAgLCBxdWV1ZSAgICAgICAgICAgICAgPSB7fVxuICAsIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnXG4gICwgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG52YXIgcnVuID0gZnVuY3Rpb24oKXtcbiAgdmFyIGlkID0gK3RoaXM7XG4gIGlmKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSl7XG4gICAgdmFyIGZuID0gcXVldWVbaWRdO1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gICAgZm4oKTtcbiAgfVxufTtcbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50KXtcbiAgcnVuLmNhbGwoZXZlbnQuZGF0YSk7XG59O1xuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYoIXNldFRhc2sgfHwgIWNsZWFyVGFzayl7XG4gIHNldFRhc2sgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZm4pe1xuICAgIHZhciBhcmdzID0gW10sIGkgPSAxO1xuICAgIHdoaWxlKGFyZ3VtZW50cy5sZW5ndGggPiBpKWFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uKCl7XG4gICAgICBpbnZva2UodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXJUYXNrID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpe1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZihyZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcycpe1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgfSBlbHNlIGlmKE1lc3NhZ2VDaGFubmVsKXtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsO1xuICAgIHBvcnQgICAgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBjdHgocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCwgMSk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiYgdHlwZW9mIHBvc3RNZXNzYWdlID09ICdmdW5jdGlvbicgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKXtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShpZCArICcnLCAnKicpO1xuICAgIH07XG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0ZW5lciwgZmFsc2UpO1xuICAvLyBJRTgtXG4gIH0gZWxzZSBpZihPTlJFQURZU1RBVEVDSEFOR0UgaW4gY2VsKCdzY3JpcHQnKSl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNlbCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbigpe1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4uY2FsbChpZCk7XG4gICAgICB9O1xuICAgIH07XG4gIC8vIFJlc3Qgb2xkIGJyb3dzZXJzXG4gIH0gZWxzZSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBzZXRUaW1lb3V0KGN0eChydW4sIGlkLCAxKSwgMCk7XG4gICAgfTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogICBzZXRUYXNrLFxuICBjbGVhcjogY2xlYXJUYXNrXG59OyIsInZhciBnbG9iYWwgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXRcbiAgLCBPYnNlcnZlciAgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlclxuICAsIHByb2Nlc3MgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgUHJvbWlzZSAgID0gZ2xvYmFsLlByb21pc2VcbiAgLCBpc05vZGUgICAgPSByZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKXtcbiAgdmFyIGhlYWQsIGxhc3QsIG5vdGlmeTtcblxuICB2YXIgZmx1c2ggPSBmdW5jdGlvbigpe1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmKGlzTm9kZSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKXBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUoaGVhZCl7XG4gICAgICBmbiAgID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgaWYoaGVhZClub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZihwYXJlbnQpcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gTm9kZS5qc1xuICBpZihpc05vZGUpe1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXJcbiAgfSBlbHNlIGlmKE9ic2VydmVyKXtcbiAgICB2YXIgdG9nZ2xlID0gdHJ1ZVxuICAgICAgLCBub2RlICAgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHtjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKXtcbiAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgICBwcm9taXNlLnRoZW4oZmx1c2gpO1xuICAgIH07XG4gIC8vIGZvciBvdGhlciBlbnZpcm9ubWVudHMgLSBtYWNyb3Rhc2sgYmFzZWQgb246XG4gIC8vIC0gc2V0SW1tZWRpYXRlXG4gIC8vIC0gTWVzc2FnZUNoYW5uZWxcbiAgLy8gLSB3aW5kb3cucG9zdE1lc3NhZ1xuICAvLyAtIG9ucmVhZHlzdGF0ZWNoYW5nZVxuICAvLyAtIHNldFRpbWVvdXRcbiAgfSBlbHNlIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbihmbil7XG4gICAgdmFyIHRhc2sgPSB7Zm46IGZuLCBuZXh0OiB1bmRlZmluZWR9O1xuICAgIGlmKGxhc3QpbGFzdC5uZXh0ID0gdGFzaztcbiAgICBpZighaGVhZCl7XG4gICAgICBoZWFkID0gdGFzaztcbiAgICAgIG5vdGlmeSgpO1xuICAgIH0gbGFzdCA9IHRhc2s7XG4gIH07XG59OyIsInZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHRhcmdldCwgc3JjLCBzYWZlKXtcbiAgZm9yKHZhciBrZXkgaW4gc3JjKXJlZGVmaW5lKHRhcmdldCwga2V5LCBzcmNba2V5XSwgc2FmZSk7XG4gIHJldHVybiB0YXJnZXQ7XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgZFAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKVxuICAsIFNQRUNJRVMgICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVkpe1xuICB2YXIgQyA9IGdsb2JhbFtLRVldO1xuICBpZihERVNDUklQVE9SUyAmJiBDICYmICFDW1NQRUNJRVNdKWRQLmYoQywgU1BFQ0lFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9XG4gIH0pO1xufTsiLCJ2YXIgSVRFUkFUT1IgICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIHJpdGVyID0gWzddW0lURVJBVE9SXSgpO1xuICByaXRlclsncmV0dXJuJ10gPSBmdW5jdGlvbigpeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbigpeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjLCBza2lwQ2xvc2luZyl7XG4gIGlmKCFza2lwQ2xvc2luZyAmJiAhU0FGRV9DTE9TSU5HKXJldHVybiBmYWxzZTtcbiAgdmFyIHNhZmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyICA9IFs3XVxuICAgICAgLCBpdGVyID0gYXJyW0lURVJBVE9SXSgpO1xuICAgIGl0ZXIubmV4dCA9IGZ1bmN0aW9uKCl7IHJldHVybiB7ZG9uZTogc2FmZSA9IHRydWV9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbigpeyByZXR1cm4gaXRlcjsgfTtcbiAgICBleGVjKGFycik7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIHNhZmU7XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZICAgICAgICAgICAgPSByZXF1aXJlKCcuL19saWJyYXJ5JylcbiAgLCBnbG9iYWwgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGN0eCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgY2xhc3NvZiAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpXG4gICwgJGV4cG9ydCAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBpc09iamVjdCAgICAgICAgICAgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGFGdW5jdGlvbiAgICAgICAgICA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKVxuICAsIGFuSW5zdGFuY2UgICAgICAgICA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJylcbiAgLCBmb3JPZiAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19mb3Itb2YnKVxuICAsIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKVxuICAsIHRhc2sgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXRcbiAgLCBtaWNyb3Rhc2sgICAgICAgICAgPSByZXF1aXJlKCcuL19taWNyb3Rhc2snKSgpXG4gICwgUFJPTUlTRSAgICAgICAgICAgID0gJ1Byb21pc2UnXG4gICwgVHlwZUVycm9yICAgICAgICAgID0gZ2xvYmFsLlR5cGVFcnJvclxuICAsIHByb2Nlc3MgICAgICAgICAgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgJFByb21pc2UgICAgICAgICAgID0gZ2xvYmFsW1BST01JU0VdXG4gICwgcHJvY2VzcyAgICAgICAgICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCBpc05vZGUgICAgICAgICAgICAgPSBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJ1xuICAsIGVtcHR5ICAgICAgICAgICAgICA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH1cbiAgLCBJbnRlcm5hbCwgR2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5LCBXcmFwcGVyO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24oKXtcbiAgdHJ5IHtcbiAgICAvLyBjb3JyZWN0IHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgICB2YXIgcHJvbWlzZSAgICAgPSAkUHJvbWlzZS5yZXNvbHZlKDEpXG4gICAgICAsIEZha2VQcm9taXNlID0gKHByb21pc2UuY29uc3RydWN0b3IgPSB7fSlbcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKV0gPSBmdW5jdGlvbihleGVjKXsgZXhlYyhlbXB0eSwgZW1wdHkpOyB9O1xuICAgIC8vIHVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgICByZXR1cm4gKGlzTm9kZSB8fCB0eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID09ICdmdW5jdGlvbicpICYmIHByb21pc2UudGhlbihlbXB0eSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxufSgpO1xuXG4vLyBoZWxwZXJzXG52YXIgc2FtZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24oYSwgYil7XG4gIC8vIHdpdGggbGlicmFyeSB3cmFwcGVyIHNwZWNpYWwgY2FzZVxuICByZXR1cm4gYSA9PT0gYiB8fCBhID09PSAkUHJvbWlzZSAmJiBiID09PSBXcmFwcGVyO1xufTtcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24oaXQpe1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlO1xufTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKEMpe1xuICByZXR1cm4gc2FtZUNvbnN0cnVjdG9yKCRQcm9taXNlLCBDKVxuICAgID8gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgOiBuZXcgR2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbnZhciBQcm9taXNlQ2FwYWJpbGl0eSA9IEdlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKEMpe1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbigkJHJlc29sdmUsICQkcmVqZWN0KXtcbiAgICBpZihyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ICA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCAgPSBhRnVuY3Rpb24ocmVqZWN0KTtcbn07XG52YXIgcGVyZm9ybSA9IGZ1bmN0aW9uKGV4ZWMpe1xuICB0cnkge1xuICAgIGV4ZWMoKTtcbiAgfSBjYXRjaChlKXtcbiAgICByZXR1cm4ge2Vycm9yOiBlfTtcbiAgfVxufTtcbnZhciBub3RpZnkgPSBmdW5jdGlvbihwcm9taXNlLCBpc1JlamVjdCl7XG4gIGlmKHByb21pc2UuX24pcmV0dXJuO1xuICBwcm9taXNlLl9uID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYztcbiAgbWljcm90YXNrKGZ1bmN0aW9uKCl7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdlxuICAgICAgLCBvayAgICA9IHByb21pc2UuX3MgPT0gMVxuICAgICAgLCBpICAgICA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uKHJlYWN0aW9uKXtcbiAgICAgIHZhciBoYW5kbGVyID0gb2sgPyByZWFjdGlvbi5vayA6IHJlYWN0aW9uLmZhaWxcbiAgICAgICAgLCByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZVxuICAgICAgICAsIHJlamVjdCAgPSByZWFjdGlvbi5yZWplY3RcbiAgICAgICAgLCBkb21haW4gID0gcmVhY3Rpb24uZG9tYWluXG4gICAgICAgICwgcmVzdWx0LCB0aGVuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYoaGFuZGxlcil7XG4gICAgICAgICAgaWYoIW9rKXtcbiAgICAgICAgICAgIGlmKHByb21pc2UuX2ggPT0gMilvbkhhbmRsZVVuaGFuZGxlZChwcm9taXNlKTtcbiAgICAgICAgICAgIHByb21pc2UuX2ggPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihoYW5kbGVyID09PSB0cnVlKXJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYoZG9tYWluKWRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICBpZihkb21haW4pZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKXtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpe1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdoaWxlKGNoYWluLmxlbmd0aCA+IGkpcnVuKGNoYWluW2krK10pOyAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHByb21pc2UuX2MgPSBbXTtcbiAgICBwcm9taXNlLl9uID0gZmFsc2U7XG4gICAgaWYoaXNSZWplY3QgJiYgIXByb21pc2UuX2gpb25VbmhhbmRsZWQocHJvbWlzZSk7XG4gIH0pO1xufTtcbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uKHByb21pc2Upe1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbigpe1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3ZcbiAgICAgICwgYWJydXB0LCBoYW5kbGVyLCBjb25zb2xlO1xuICAgIGlmKGlzVW5oYW5kbGVkKHByb21pc2UpKXtcbiAgICAgIGFicnVwdCA9IHBlcmZvcm0oZnVuY3Rpb24oKXtcbiAgICAgICAgaWYoaXNOb2RlKXtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGlmKGhhbmRsZXIgPSBnbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24pe1xuICAgICAgICAgIGhhbmRsZXIoe3Byb21pc2U6IHByb21pc2UsIHJlYXNvbjogdmFsdWV9KTtcbiAgICAgICAgfSBlbHNlIGlmKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3Ipe1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgcHJvbWlzZS5faCA9IGlzTm9kZSB8fCBpc1VuaGFuZGxlZChwcm9taXNlKSA/IDIgOiAxO1xuICAgIH0gcHJvbWlzZS5fYSA9IHVuZGVmaW5lZDtcbiAgICBpZihhYnJ1cHQpdGhyb3cgYWJydXB0LmVycm9yO1xuICB9KTtcbn07XG52YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbihwcm9taXNlKXtcbiAgaWYocHJvbWlzZS5faCA9PSAxKXJldHVybiBmYWxzZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYSB8fCBwcm9taXNlLl9jXG4gICAgLCBpICAgICA9IDBcbiAgICAsIHJlYWN0aW9uO1xuICB3aGlsZShjaGFpbi5sZW5ndGggPiBpKXtcbiAgICByZWFjdGlvbiA9IGNoYWluW2krK107XG4gICAgaWYocmVhY3Rpb24uZmFpbCB8fCAhaXNVbmhhbmRsZWQocmVhY3Rpb24ucHJvbWlzZSkpcmV0dXJuIGZhbHNlO1xuICB9IHJldHVybiB0cnVlO1xufTtcbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uKHByb21pc2Upe1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbigpe1xuICAgIHZhciBoYW5kbGVyO1xuICAgIGlmKGlzTm9kZSl7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgaWYoaGFuZGxlciA9IGdsb2JhbC5vbnJlamVjdGlvbmhhbmRsZWQpe1xuICAgICAgaGFuZGxlcih7cHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiBwcm9taXNlLl92fSk7XG4gICAgfVxuICB9KTtcbn07XG52YXIgJHJlamVjdCA9IGZ1bmN0aW9uKHZhbHVlKXtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICBpZihwcm9taXNlLl9kKXJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICBwcm9taXNlLl92ID0gdmFsdWU7XG4gIHByb21pc2UuX3MgPSAyO1xuICBpZighcHJvbWlzZS5fYSlwcm9taXNlLl9hID0gcHJvbWlzZS5fYy5zbGljZSgpO1xuICBub3RpZnkocHJvbWlzZSwgdHJ1ZSk7XG59O1xudmFyICRyZXNvbHZlID0gZnVuY3Rpb24odmFsdWUpe1xuICB2YXIgcHJvbWlzZSA9IHRoaXNcbiAgICAsIHRoZW47XG4gIGlmKHByb21pc2UuX2QpcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHRyeSB7XG4gICAgaWYocHJvbWlzZSA9PT0gdmFsdWUpdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYodGhlbiA9IGlzVGhlbmFibGUodmFsdWUpKXtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbigpe1xuICAgICAgICB2YXIgd3JhcHBlciA9IHtfdzogcHJvbWlzZSwgX2Q6IGZhbHNlfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAkcmVqZWN0LmNhbGwod3JhcHBlciwgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9taXNlLl92ID0gdmFsdWU7XG4gICAgICBwcm9taXNlLl9zID0gMTtcbiAgICAgIG5vdGlmeShwcm9taXNlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoKGUpe1xuICAgICRyZWplY3QuY2FsbCh7X3c6IHByb21pc2UsIF9kOiBmYWxzZX0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZighVVNFX05BVElWRSl7XG4gIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpXG4gICRQcm9taXNlID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcil7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkUHJvbWlzZSwgUFJPTUlTRSwgJ19oJyk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHRoaXMsIDEpLCBjdHgoJHJlamVjdCwgdGhpcywgMSkpO1xuICAgIH0gY2F0Y2goZXJyKXtcbiAgICAgICRyZWplY3QuY2FsbCh0aGlzLCBlcnIpO1xuICAgIH1cbiAgfTtcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKXtcbiAgICB0aGlzLl9jID0gW107ICAgICAgICAgICAgIC8vIDwtIGF3YWl0aW5nIHJlYWN0aW9uc1xuICAgIHRoaXMuX2EgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gY2hlY2tlZCBpbiBpc1VuaGFuZGxlZCByZWFjdGlvbnNcbiAgICB0aGlzLl9zID0gMDsgICAgICAgICAgICAgIC8vIDwtIHN0YXRlXG4gICAgdGhpcy5fZCA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBkb25lXG4gICAgdGhpcy5fdiA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSB2YWx1ZVxuICAgIHRoaXMuX2ggPSAwOyAgICAgICAgICAgICAgLy8gPC0gcmVqZWN0aW9uIHN0YXRlLCAwIC0gZGVmYXVsdCwgMSAtIGhhbmRsZWQsIDIgLSB1bmhhbmRsZWRcbiAgICB0aGlzLl9uID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIG5vdGlmeVxuICB9O1xuICBJbnRlcm5hbC5wcm90b3R5cGUgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKSgkUHJvbWlzZS5wcm90b3R5cGUsIHtcbiAgICAvLyAyNS40LjUuMyBQcm9taXNlLnByb3RvdHlwZS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKVxuICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpe1xuICAgICAgdmFyIHJlYWN0aW9uICAgID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsICRQcm9taXNlKSk7XG4gICAgICByZWFjdGlvbi5vayAgICAgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICAgIHJlYWN0aW9uLmZhaWwgICA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IGlzTm9kZSA/IHByb2Nlc3MuZG9tYWluIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fYy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmKHRoaXMuX2EpdGhpcy5fYS5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmKHRoaXMuX3Mpbm90aWZ5KHRoaXMsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbihvblJlamVjdGVkKXtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH0pO1xuICBQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKCl7XG4gICAgdmFyIHByb21pc2UgID0gbmV3IEludGVybmFsO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gY3R4KCRyZXNvbHZlLCBwcm9taXNlLCAxKTtcbiAgICB0aGlzLnJlamVjdCAgPSBjdHgoJHJlamVjdCwgcHJvbWlzZSwgMSk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHtQcm9taXNlOiAkUHJvbWlzZX0pO1xucmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKSgkUHJvbWlzZSwgUFJPTUlTRSk7XG5yZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKFBST01JU0UpO1xuV3JhcHBlciA9IHJlcXVpcmUoJy4vX2NvcmUnKVtQUk9NSVNFXTtcblxuLy8gc3RhdGljc1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNSBQcm9taXNlLnJlamVjdChyKVxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKXtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpXG4gICAgICAsICQkcmVqZWN0ICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICAkJHJlamVjdChyKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKExJQlJBUlkgfHwgIVVTRV9OQVRJVkUpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC42IFByb21pc2UucmVzb2x2ZSh4KVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpe1xuICAgIC8vIGluc3RhbmNlb2YgaW5zdGVhZCBvZiBpbnRlcm5hbCBzbG90IGNoZWNrIGJlY2F1c2Ugd2Ugc2hvdWxkIGZpeCBpdCB3aXRob3V0IHJlcGxhY2VtZW50IG5hdGl2ZSBQcm9taXNlIGNvcmVcbiAgICBpZih4IGluc3RhbmNlb2YgJFByb21pc2UgJiYgc2FtZUNvbnN0cnVjdG9yKHguY29uc3RydWN0b3IsIHRoaXMpKXJldHVybiB4O1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcylcbiAgICAgICwgJCRyZXNvbHZlICA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICAkJHJlc29sdmUoeCk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoVVNFX05BVElWRSAmJiByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpKGZ1bmN0aW9uKGl0ZXIpe1xuICAkUHJvbWlzZS5hbGwoaXRlcilbJ2NhdGNoJ10oZW1wdHkpO1xufSkpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC4xIFByb21pc2UuYWxsKGl0ZXJhYmxlKVxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSl7XG4gICAgdmFyIEMgICAgICAgICAgPSB0aGlzXG4gICAgICAsIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgLCByZXNvbHZlICAgID0gY2FwYWJpbGl0eS5yZXNvbHZlXG4gICAgICAsIHJlamVjdCAgICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgdmFyIHZhbHVlcyAgICA9IFtdXG4gICAgICAgICwgaW5kZXggICAgID0gMFxuICAgICAgICAsIHJlbWFpbmluZyA9IDE7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uKHByb21pc2Upe1xuICAgICAgICB2YXIgJGluZGV4ICAgICAgICA9IGluZGV4KytcbiAgICAgICAgICAsIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAgICAgICBpZihhbHJlYWR5Q2FsbGVkKXJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkICA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzWyRpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZihhYnJ1cHQpcmVqZWN0KGFicnVwdC5lcnJvcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gMjUuNC40LjQgUHJvbWlzZS5yYWNlKGl0ZXJhYmxlKVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKXtcbiAgICB2YXIgQyAgICAgICAgICA9IHRoaXNcbiAgICAgICwgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICAsIHJlamVjdCAgICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbihwcm9taXNlKXtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYoYWJydXB0KXJlamVjdChhYnJ1cHQuZXJyb3IpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pOyIsImNvbnN0IGxpYiA9IHdpbmRvdy5saWIgfHwgKHdpbmRvdy5saWIgPSB7fSlcblxuLyoqXG4gKiBWZXJzaW9uIGNsYXNzLlxuICogQGNsYXNzIGxpYi5lbnZ+VmVyc2lvblxuICogQHBhcmFtIHtTdHJpbmd9IHYgLSB2ZXJzaW9uIG51bWJlci5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gVmVyc2lvbiAodikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3ZhbCcsIHtcbiAgICB2YWx1ZTogdi50b1N0cmluZygpLFxuICAgIGVudW1lcmFibGU6IHRydWVcbiAgfSlcblxuICAvKipcbiAgICogbGFyZ2VyIHRoYW5cbiAgICogQG1ldGhvZCBndFxuICAgKiBAcGFyYW0ge1N0cmluZ30gdiAtIHZlcnNpb25cbiAgICogQHJldHVybiB7Qm9vbGVhbn0gcmVzdWx0XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAbWVtYmVyb2YgVmVyc2lvblxuICAgKi9cbiAgdGhpcy5ndCA9IGZ1bmN0aW9uICh2KSB7XG4gICAgcmV0dXJuIFZlcnNpb24uY29tcGFyZSh0aGlzLCB2KSA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBsYXJnZXIgdGhhbiBvciBlcXVhbCB0by5cbiAgICogQG1ldGhvZCBndGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHYgLSB2ZXJzaW9uXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IHJlc3VsdFxuICAgKiBAaW5zdGFuY2VcbiAgICogQG1lbWJlcm9mIFZlcnNpb25cbiAgICovXG4gIHRoaXMuZ3RlID0gZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gVmVyc2lvbi5jb21wYXJlKHRoaXMsIHYpID49IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBsZXNzIHRoYW4uXG4gICAqIEBtZXRob2QgbHRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHYgLSB2ZXJzaW9uXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IHJlc3VsdFxuICAgKiBAaW5zdGFuY2VcbiAgICogQG1lbWJlcm9mIFZlcnNpb25cbiAgICovXG4gIHRoaXMubHQgPSBmdW5jdGlvbiAodikge1xuICAgIHJldHVybiBWZXJzaW9uLmNvbXBhcmUodGhpcywgdikgPCAwXG4gIH1cblxuICAvKipcbiAgICogbGVzcyB0aGFuIG9yIGVxdWFsIHRvLlxuICAgKiBAbWV0aG9kIGx0ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gdiAtIHZlcnNpb25cbiAgICogQHJldHVybiB7Qm9vbGVhbn0gcmVzdWx0XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAbWVtYmVyb2YgVmVyc2lvblxuICAgKi9cbiAgdGhpcy5sdGUgPSBmdW5jdGlvbiAodikge1xuICAgIHJldHVybiBWZXJzaW9uLmNvbXBhcmUodGhpcywgdikgPD0gMFxuICB9XG5cbiAgLyoqXG4gICAqIGVxdWFsIHRvLlxuICAgKiBAbWV0aG9kIGVxXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2IC0gdmVyc2lvblxuICAgKiBAcmV0dXJuIHtCb29sZWFufSBlcXVhbCB0b1xuICAgKiBAaW5zdGFuY2VcbiAgICogQG1lbWJlcm9mIFZlcnNpb25cbiAgICovXG4gIHRoaXMuZXEgPSBmdW5jdGlvbiAodikge1xuICAgIHJldHVybiBWZXJzaW9uLmNvbXBhcmUodGhpcywgdikgPT09IDBcbiAgfVxufVxuXG4vKipcbiAqIHZlcnNpb24gbnVtYmVyIHN0cmluZy5cbiAqIEBtZXRob2QgdG9TdHJpbmdcbiAqIEByZXR1cm4ge1N0cmluZ30gY3VycmVudCB2ZXJzaW9uIG51bWJlciBzdHJpbmcuXG4gKiBAaW5zdGFuY2VcbiAqIEBtZW1iZXJvZiBWZXJzaW9uXG4gKi9cblZlcnNpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy52YWxcbn1cblxuLyoqXG4gKiByZXR1cm4gY3VycmVudCB2ZXJzaW9uIG51bWJlci5cbiAqIEBtZXRob2QgdmFsdWVPZlxuICogQHJldHVybiB7Qm9vbGVhbn0gdmVyc2lvbiBudW1iZXJcbiAqIEBpbnN0YW5jZVxuICogQG1lbWJlcm9mIFZlcnNpb25cbiAqL1xuVmVyc2lvbi5wcm90b3R5cGUudmFsdWVPZiA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgdiA9IHRoaXMudmFsLnNwbGl0KCcuJylcbiAgY29uc3QgciA9IFtdXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKykge1xuICAgIGxldCBuID0gcGFyc2VJbnQodltpXSwgMTApXG4gICAgaWYgKGlzTmFOKG4pKSB7XG4gICAgICBuID0gMFxuICAgIH1cbiAgICBsZXQgcyA9IG4udG9TdHJpbmcoKVxuICAgIGlmIChzLmxlbmd0aCA8IDUpIHtcbiAgICAgIHMgPSBBcnJheSg2IC0gcy5sZW5ndGgpLmpvaW4oJzAnKSArIHNcbiAgICB9XG4gICAgci5wdXNoKHMpXG4gICAgaWYgKHIubGVuZ3RoID09PSAxKSB7XG4gICAgICByLnB1c2goJy4nKVxuICAgIH1cbiAgfVxuICByZXR1cm4gcGFyc2VGbG9hdChyLmpvaW4oJycpKVxufVxuXG4vKipcbiAqIGNvbXBhcmUgdHdvIHZlcnNpb25zLlxuICogQG1ldGhvZCBjb21wYXJlXG4gKiBAcGFyYW0ge1N0cmluZ30gdjEgLSB2ZXJzaW9uMVxuICogQHBhcmFtIHtTdHJpbmd9IHYyIC0gdmVyc2lvbjJcbiAqIEByZXR1cm4ge051bWJlcn0gMCBmb3IgZXF1YWxpdHnvvIwtMSBmb3IgbGVzcyB0aGFu77yMMSBmb3IgbGFyZ2VyIHRoYW4uXG4gKiBAbWVtYmVyb2YgVmVyc2lvblxuICovXG5WZXJzaW9uLmNvbXBhcmUgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gIHYxID0gdjEudG9TdHJpbmcoKS5zcGxpdCgnLicpXG4gIHYyID0gdjIudG9TdHJpbmcoKS5zcGxpdCgnLicpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdjEubGVuZ3RoIHx8IGkgPCB2Mi5sZW5ndGg7IGkrKykge1xuICAgIGxldCBuMSA9IHBhcnNlSW50KHYxW2ldLCAxMClcbiAgICBsZXQgbjIgPSBwYXJzZUludCh2MltpXSwgMTApXG4gICAgaWYgKHdpbmRvdy5pc05hTihuMSkpIHtcbiAgICAgIG4xID0gMFxuICAgIH1cbiAgICBpZiAod2luZG93LmlzTmFOKG4yKSkge1xuICAgICAgbjIgPSAwXG4gICAgfVxuICAgIGlmIChuMSA8IG4yKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgZWxzZSBpZiAobjEgPiBuMikge1xuICAgICAgcmV0dXJuIDFcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDBcbn1cblxuLyoqXG4gKiDop6PmnpDlkozmk43kvZzniYjmnKzlj7dcbiAqIEBtZXRob2QgdmVyc2lvblxuICogQHBhcmFtIHtzdHJpbmd9IHYgLSDpnIDopoHop6PmnpDnmoTniYjmnKzlj7dcbiAqIEByZXR1cm4ge2xpYi5lbnZ+VmVyc2lvbn0gVmVyc29u5a6e5L6LXG4gKiBAbWVtYmVyb2YgbGliXG4gKi9cbmxpYi52ZXJzaW9uID0gZnVuY3Rpb24gKHYpIHtcbiAgcmV0dXJuIG5ldyBWZXJzaW9uKHYpXG59XG4iLCJjb25zdCBsaWIgPSB3aW5kb3cubGliIHx8ICh3aW5kb3cubGliID0ge30pXG5jb25zdCBlbnYgPSBsaWIuZW52IHx8IChsaWIuZW52ID0ge30pXG5cbmNvbnN0IHNlYXJjaCA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gucmVwbGFjZSgvXlxcPy8sICcnKVxuZW52LnBhcmFtcyA9IHt9XG5pZiAoc2VhcmNoKSB7XG4gIGNvbnN0IHBhcmFtcyA9IHNlYXJjaC5zcGxpdCgnJicpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgcGFyYW1zW2ldID0gcGFyYW1zW2ldLnNwbGl0KCc9JylcbiAgICB0cnkge1xuICAgICAgZW52LnBhcmFtc1twYXJhbXNbaV1bMF1dID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhcmFtc1tpXVsxXSlcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgIGVudi5wYXJhbXNbcGFyYW1zW2ldWzBdXSA9IHBhcmFtc1tpXVsxXVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0ICcuL3ZlcnNpb24nXG5pbXBvcnQgJy4vcGFyYW1zJ1xuXG5jb25zdCBsaWIgPSB3aW5kb3cubGliIHx8ICh3aW5kb3cubGliID0ge30pXG5jb25zdCBlbnYgPSBsaWIuZW52IHx8IChsaWIuZW52ID0ge30pXG5cbmNvbnN0IHVhID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnRcbmxldCBtYXRjaFxuXG4vKipcbiAqIG9zXG4gKi9cblxubWF0Y2ggPSB1YS5tYXRjaCgvV2luZG93c1xcc1Bob25lXFxzKD86T1NcXHMpPyhbXFxkLl0rKS8pXG5pZiAobWF0Y2gpIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBtZW1iZXJvZiBsaWIuZW52XG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIC0gb3MgbmFtZSwgZS5nLiBBbmRyb2lkL0FuZHJvaWRQYWQvaVBob25lL2lQb2QvaVBhZC9XaW5kb3dzIFBob25lL3Vua25vd24sIGV0Yy5cbiAgICogQHByb3BlcnR5IHtsaWIuZW52flZlcnNpb259IHZlcnNpb24gLSBvcyB2ZXJzaW9uLlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGlzV2luZG93c1Bob25lXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaXNJUGhvbmUgLSBpcyBpUGhvbmUvaVRvdWNoXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaXNJUGFkXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaXNJT1NcbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBpc0FuZHJvaWRcbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBpc0FuZHJvaWRQYWRcbiAgICovXG4gIGVudi5vcyA9IHtcbiAgICBuYW1lOiAnV2luZG93cyBQaG9uZScsXG4gICAgaXNXaW5kb3dzUGhvbmU6IHRydWUsXG4gICAgdmVyc2lvbjogbWF0Y2hbMV1cbiAgfVxufVxuZWxzZSBpZiAoISF1YS5tYXRjaCgvU2FmYXJpLykgJiYgKG1hdGNoID0gdWEubWF0Y2goL0FuZHJvaWRbXFxzL10oW1xcZC5dKykvKSkpIHtcbiAgZW52Lm9zID0ge1xuICAgIHZlcnNpb246IG1hdGNoWzFdXG4gIH1cblxuICBpZiAoKHVhLm1hdGNoKC9Nb2JpbGVcXHMrU2FmYXJpLykpKSB7XG4gICAgZW52Lm9zLm5hbWUgPSAnQW5kcm9pZCdcbiAgICBlbnYub3MuaXNBbmRyb2lkID0gdHJ1ZVxuICB9XG4gIGVsc2Uge1xuICAgIGVudi5vcy5uYW1lID0gJ0FuZHJvaWRQYWQnXG4gICAgZW52Lm9zLmlzQW5kcm9pZFBhZCA9IHRydWVcbiAgfVxufVxuZWxzZSBpZiAoKG1hdGNoID0gdWEubWF0Y2goLyhpUGhvbmV8aVBhZHxpUG9kKS8pKSkge1xuICBjb25zdCBuYW1lID0gbWF0Y2hbMV1cblxuICBtYXRjaCA9IHVhLm1hdGNoKC9PUyAoW1xcZF8uXSspIGxpa2UgTWFjIE9TIFgvKVxuXG4gIGVudi5vcyA9IHtcbiAgICBuYW1lOiBuYW1lLFxuICAgIGlzSVBob25lOiAobmFtZSA9PT0gJ2lQaG9uZScgfHwgbmFtZSA9PT0gJ2lQb2QnKSxcbiAgICBpc0lQYWQ6IG5hbWUgPT09ICdpUGFkJyxcbiAgICBpc0lPUzogdHJ1ZSxcbiAgICB2ZXJzaW9uOiBtYXRjaCAmJiBtYXRjaFsxXS5zcGxpdCgnXycpLmpvaW4oJy4nKSB8fCAnJ1xuICB9XG59XG5lbHNlIHtcbiAgZW52Lm9zID0ge1xuICAgIG5hbWU6ICd1bmtub3duJyxcbiAgICB2ZXJzaW9uOiAnMC4wLjAnXG4gIH1cbn1cblxuaWYgKGxpYi52ZXJzaW9uKSB7XG4gIGVudi5vcy52ZXJzaW9uID0gbGliLnZlcnNpb24oZW52Lm9zLnZlcnNpb24pXG59XG5cbi8qKlxuICogYnJvd3NlclxuICovXG5cbm1hdGNoID0gdWEubWF0Y2goLyg/OlVDV0VCfFVDQnJvd3NlclxcLykoW1xcZC5dKykvKVxuXG5pZiAobWF0Y2gpIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBtZW1iZXJvZiBlbnZcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgLSBicm93c2VyIG5hbWXvvIxlLmcuIFVDL1FRL0ZpcmVmb3gvQ2hyb21lL0FuZHJvaWQvU2FmYXJpL2lPUyBXZWJ2aWV3L0Nocm9tZSBXZWJ2aWV3L0lFL0lFTW9iaWxlL3Vua25vd24sIGV0Yy5cbiAgICogQHByb3BlcnR5IHtlbnZ+VmVyc2lvbn0gdmVyc2lvbiAtIGJyb3dzZXIgdmVyc2lvbi5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBpc1VDXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaXNRUVxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGlzSUVcbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBpc0lFTW9iaWxlXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaXNJRUxpa2VXZWJraXRcbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBpc0Nocm9tZVxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGlzQW5kcm9pZFxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGlzU2FmYXJpXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaXNXZWJ2aWV3XG4gICAqL1xuICBlbnYuYnJvd3NlciA9IHtcbiAgICBuYW1lOiAnVUMnLFxuICAgIGlzVUM6IHRydWUsXG4gICAgdmVyc2lvbjogbWF0Y2hbMV1cbiAgfVxufVxuZWxzZSBpZiAoKG1hdGNoID0gdWEubWF0Y2goL01RUUJyb3dzZXJcXC8oW1xcZC5dKykvKSkpIHtcbiAgZW52LmJyb3dzZXIgPSB7XG4gICAgbmFtZTogJ1FRJyxcbiAgICBpc1FROiB0cnVlLFxuICAgIHZlcnNpb246IG1hdGNoWzFdXG4gIH1cbn1cbmVsc2UgaWYgKChtYXRjaCA9IHVhLm1hdGNoKC9GaXJlZm94XFwvKFtcXGQuXSspLykpKSB7XG4gIGVudi5icm93c2VyID0ge1xuICAgIG5hbWU6ICdGaXJlZm94JyxcbiAgICBpc0ZpcmVmb3g6IHRydWUsXG4gICAgdmVyc2lvbjogbWF0Y2hbMV1cbiAgfVxufVxuZWxzZSBpZiAoKG1hdGNoID0gdWEubWF0Y2goL01TSUVcXHMoW1xcZC5dKykvKSlcbiAgfHwgKG1hdGNoID0gdWEubWF0Y2goL0lFTW9iaWxlXFwvKFtcXGQuXSspLykpKSB7XG4gIGVudi5icm93c2VyID0ge1xuICAgIHZlcnNpb246IG1hdGNoWzFdXG4gIH1cblxuICBpZiAodWEubWF0Y2goL0lFTW9iaWxlLykpIHtcbiAgICBlbnYuYnJvd3Nlci5uYW1lID0gJ0lFTW9iaWxlJ1xuICAgIGVudi5icm93c2VyLmlzSUVNb2JpbGUgPSB0cnVlXG4gIH1cbiAgZWxzZSB7XG4gICAgZW52LmJyb3dzZXIubmFtZSA9ICdJRSdcbiAgICBlbnYuYnJvd3Nlci5pc0lFID0gdHJ1ZVxuICB9XG5cbiAgaWYgKHVhLm1hdGNoKC9BbmRyb2lkfGlQaG9uZS8pKSB7XG4gICAgZW52LmJyb3dzZXIuaXNJRUxpa2VXZWJraXQgPSB0cnVlXG4gIH1cbn1cbmVsc2UgaWYgKChtYXRjaCA9IHVhLm1hdGNoKC8oPzpDaHJvbWV8Q3JpT1MpXFwvKFtcXGQuXSspLykpKSB7XG4gIGVudi5icm93c2VyID0ge1xuICAgIG5hbWU6ICdDaHJvbWUnLFxuICAgIGlzQ2hyb21lOiB0cnVlLFxuICAgIHZlcnNpb246IG1hdGNoWzFdXG4gIH1cblxuICBpZiAodWEubWF0Y2goL1ZlcnNpb25cXC9bXFxkKy5dK1xccypDaHJvbWUvKSkge1xuICAgIGVudi5icm93c2VyLm5hbWUgPSAnQ2hyb21lIFdlYnZpZXcnXG4gICAgZW52LmJyb3dzZXIuaXNXZWJ2aWV3ID0gdHJ1ZVxuICB9XG59XG5lbHNlIGlmICghIXVhLm1hdGNoKC9TYWZhcmkvKSAmJiAobWF0Y2ggPSB1YS5tYXRjaCgvQW5kcm9pZFtcXHMvXShbXFxkLl0rKS8pKSkge1xuICBlbnYuYnJvd3NlciA9IHtcbiAgICBuYW1lOiAnQW5kcm9pZCcsXG4gICAgaXNBbmRyb2lkOiB0cnVlLFxuICAgIHZlcnNpb246IG1hdGNoWzFdXG4gIH1cbn1cbmVsc2UgaWYgKHVhLm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kLykpIHtcbiAgaWYgKHVhLm1hdGNoKC9TYWZhcmkvKSkge1xuICAgIG1hdGNoID0gdWEubWF0Y2goL1ZlcnNpb25cXC8oW1xcZC5dKykvKVxuICAgIGVudi5icm93c2VyID0ge1xuICAgICAgbmFtZTogJ1NhZmFyaScsXG4gICAgICBpc1NhZmFyaTogdHJ1ZSxcbiAgICAgIHZlcnNpb246IG1hdGNoICYmIG1hdGNoWzFdIHx8ICcnXG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIG1hdGNoID0gdWEubWF0Y2goL09TIChbXFxkXy5dKykgbGlrZSBNYWMgT1MgWC8pXG4gICAgZW52LmJyb3dzZXIgPSB7XG4gICAgICBuYW1lOiAnaU9TIFdlYnZpZXcnLFxuICAgICAgaXNXZWJ2aWV3OiB0cnVlLFxuICAgICAgdmVyc2lvbjogbWF0Y2ggJiYgbWF0Y2hbMV0ucmVwbGFjZSgvXy9nLCAnLicpIHx8ICcnXG4gICAgfVxuICB9XG59XG5lbHNlIHtcbiAgZW52LmJyb3dzZXIgPSB7XG4gICAgbmFtZTogJ3Vua25vd24nLFxuICAgIHZlcnNpb246ICcwLjAuMCdcbiAgfVxufVxuXG5pZiAobGliLnZlcnNpb24pIHtcbiAgZW52LmJyb3dzZXIudmVyc2lvbiA9IGxpYi52ZXJzaW9uKGVudi5icm93c2VyLnZlcnNpb24pXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gQGZsb3dcblxuY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nXG5cbi8qKlxuICogU3RyaWN0IG9iamVjdCB0eXBlIGNoZWNrLiBPbmx5IHJldHVybnMgdHJ1ZVxuICogZm9yIHBsYWluIEphdmFTY3JpcHQgb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0geyp9IG9ialxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuY29uc3QgT0JKRUNUX1NUUklORyA9ICdbb2JqZWN0IE9iamVjdF0nXG5leHBvcnQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCAob2JqPzogbWl4ZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gT0JKRUNUX1NUUklOR1xufVxuXG5jb25zdCBBUlJBWV9TVFJJTkcgPSAnW29iamVjdCBBcnJheV0nXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheSAoYXJyPzogbWl4ZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PT0gQVJSQVlfU1RSSU5HXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vIEBmbG93XG5pbXBvcnQge1xuICBpc0FycmF5XG59IGZyb20gJy4vdHlwZSdcbi8qKlxuICogTWl4IHByb3BlcnRpZXMgaW50byB0YXJnZXQgb2JqZWN0LlxuICogdGhlIHJpZ2h0ZXN0IG9iamVjdCdzIHZhbHVlIGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZCAodG86IHt9LCAuLi5hcmdzOiBBcnJheTx7fT4pOiB7fSB7XG4gIGlmICghYXJncyB8fCBhcmdzLmxlbmd0aCA8PSAwKSB7XG4gICAgcmV0dXJuIHRvXG4gIH1cbiAgYXJncy5mb3JFYWNoKGZyb20gPT4ge1xuICAgIGlmICh0eXBlb2YgZnJvbSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBmcm9tKSB7XG4gICAgICB0b1trZXldID0gZnJvbVtrZXldXG4gICAgfVxuICB9KVxuICByZXR1cm4gdG9cbn1cbi8qKlxuICogTWl4IHRydXRoeSBvciAnJyBwcm9wZXJ0eSB2YWx1ZXMgaW50byB0YXJnZXQgb2JqZWN0LlxuICogbW9zdGx5IGZvciBtZXJnaW5nIHN0eWxlcy4gKHRoYXQncyB3aHkgJycgaXMgZmFsc3kgYnV0IHN0aWxsIHNob3VsZCBiZSBjb3VudGVkIGluLilcbiAqIHRoZSByaWdodGVzdCBvYmplY3QncyB2YWx1ZSBoYXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmRUcnV0aHkgKHRvOiB7fSwgLi4uYXJnczogQXJyYXk8e30+KToge30ge1xuICBpZiAoIWFyZ3MgfHwgYXJncy5sZW5ndGggPD0gMCkge1xuICAgIHJldHVybiB0b1xuICB9XG4gIGFyZ3MuZm9yRWFjaChmcm9tID0+IHtcbiAgICBpZiAodHlwZW9mIGZyb20gIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgbGV0IGlcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBmcm9tKSB7XG4gICAgICBpZiAoKChpID0gZnJvbVtrZXldKSB8fCBpID09PSAnJyB8fCBpID09PSAwKSAmJiBpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0b1trZXldID0gaVxuICAgICAgfVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIHRvXG59XG4vKipcbiAqIE1peCBzcGVjaWZpZWQgcHJvcGVydGllcyBpbnRvIHRhcmdldCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmRLZXlzICh0bzoge30sIGZyb206IHt9ID0ge30sIGtleXM6IEFycmF5PHN0cmluZz4pOiB7fSB7XG4gIChrZXlzIHx8IFtdKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgZnJvbSAmJiAodG9ba2V5XSA9IGZyb21ba2V5XSlcbiAgfSlcbiAgcmV0dXJuIHRvXG59XG4vKipcbiAqIEV4dHJhY3Qgc3BlY2lmaWVkIHByb3BlcnRpZXMgZnJvbSBzcmMgdG8gdGFyZ2V0IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RLZXlzICh0bzoge30sIGZyb206IHt9ID0ge30sIGtleXM6IEFycmF5PHN0cmluZz4pIHtcbiAgaWYgKCFmcm9tKSB7XG4gICAgcmV0dXJuIHRvXG4gIH1cbiAgKGtleXMgfHwgW10pLmZvckVhY2goa2V5ID0+IHtcbiAgICBmcm9tICYmICh0b1trZXldID0gZnJvbVtrZXldKVxuICAgIGZyb20gJiYgKGRlbGV0ZSBmcm9tW2tleV0pXG4gIH0pXG4gIHJldHVybiB0b1xufVxuLyoqXG4gKiBTaW1wbGUgYmluZCwgZmFzdGVyIHRoYW4gbmF0aXZlXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjdHhcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZCAoZm46IEZ1bmN0aW9uLCBjdHg6IG1peGVkKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoYTogbWl4ZWQpIHtcbiAgICBjb25zdCBsID0gYXJndW1lbnRzLmxlbmd0aFxuICAgIHJldHVybiBsID8gbCA+IDEgPyBmbi5hcHBseShjdHgsIGFyZ3VtZW50cykgOiBmbi5jYWxsKGN0eCwgYSkgOiBmbi5jYWxsKGN0eClcbiAgfVxufVxuLyoqXG4gKiBPbmx5IGNhbGwgdGhlIGZ1bmMgdGhlIGxhc3QgdGltZSBiZWZvcmUgaXQncyBub3QgdGhhdCBmcmVxdWVudGx5IGNhbGxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYm91bmNlIChmdW5jOiBGdW5jdGlvbiwgd2FpdDogbnVtYmVyKSB7XG4gIGxldCB0aW1lcklkXG4gIGZ1bmN0aW9uIGxhdGVyICgpIHtcbiAgICB0aW1lcklkID0gbnVsbFxuICAgIGZ1bmMuYXBwbHkobnVsbClcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcklkKVxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KGxhdGVyLCB3YWl0KVxuICB9XG59XG4vKipcbiAqIE9ubHkgY2FsbCB0aGUgZnVuYyB0aGUgZmlyc3QgdGltZSBiZWZvcmUgYSBzZXJpZXMgZnJlcXVlbnRseSBmdW5jdGlvbiBjYWxscyBoYXBwZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXByZXNzIChmdW5jOiBGdW5jdGlvbiwgd2FpdDogbnVtYmVyKSB7XG4gIGxldCB0aW1lcklkXG5cbiAgZnVuY3Rpb24gbGF0ZXIgKCkge1xuICAgIHRpbWVySWQgPSBudWxsXG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRpbWVySWQpIHtcbiAgICAgIGZ1bmMuYXBwbHkoKVxuICAgIH1cbiAgICBjbGVhclRpbWVvdXQodGltZXJJZClcbiAgICB0aW1lcklkID0gc2V0VGltZW91dChsYXRlciwgd2FpdClcbiAgfVxufVxuLyoqXG4gKiBPbmx5IGNhbGwgdGhlIGZ1bmMgZXZlcnkgdGltZSBhZnRlciBhIHdhaXQgbWlsbGlzZWNvbmRzIGlmIGl0J3MgdG9vIGZyZXF1ZW50bHkgY2FsbGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGhyb3R0bGUgKGZ1bmM6IEZ1bmN0aW9uLCB3YWl0OiBudW1iZXIsIGNhbGxMYXN0VGltZTogYm9vbGVhbikge1xuICBsZXQgbGFzdCA9IDBcbiAgbGV0IGxhc3RUaW1lciA9IG51bGxcbiAgY29uc3QgbGFzdFRpbWVEdXJhdGlvbiA9IHdhaXQgKyAod2FpdCA+IDI1ID8gd2FpdCA6IDI1KSAvLyBwbHVzIGhhbGYgd2FpdCB0aW1lLlxuICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3M6IEFycmF5PG1peGVkPikge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzXG4gICAgY29uc3QgdGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgaWYgKHRpbWUgLSBsYXN0ID4gd2FpdCkge1xuICAgICAgaWYgKGNhbGxMYXN0VGltZSkge1xuICAgICAgICBsYXN0VGltZXIgJiYgY2xlYXJUaW1lb3V0KGxhc3RUaW1lcilcbiAgICAgICAgbGFzdFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgbGFzdFRpbWVyID0gbnVsbFxuICAgICAgICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncylcbiAgICAgICAgfSwgbGFzdFRpbWVEdXJhdGlvbilcbiAgICAgIH1cbiAgICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncylcbiAgICAgIGxhc3QgPSB0aW1lXG4gICAgfVxuICB9XG59XG4vLyBkaXJlY3Rpb246ICdsJyB8ICdyJywgZGVmYXVsdCBpcyAncidcbi8vIG51bTogaG93IG1hbnkgdGltZXMgdG8gbG9vcCwgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlclxuZXhwb3J0IGZ1bmN0aW9uIGxvb3BBcnJheSAoYXJyOiBhbnksIG51bTogbnVtYmVyLCBkaXJlY3Rpb246IHN0cmluZykge1xuICBpZiAoIWlzQXJyYXkoYXJyKSkge1xuICAgIHJldHVyblxuICB9XG4gIGxldCBpc0xlZnQgPSAoZGlyZWN0aW9uICsgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdsJ1xuICBjb25zdCBsZW4gPSBhcnIubGVuZ3RoXG4gIG51bSA9IG51bSAlIGxlblxuICBpZiAobnVtIDwgMCkge1xuICAgIG51bSA9IC1udW1cbiAgICBpc0xlZnQgPSAhaXNMZWZ0XG4gIH1cbiAgaWYgKG51bSA9PT0gMCkge1xuICAgIHJldHVybiBhcnJcbiAgfVxuICBsZXQgbHAsIHJwXG4gIGlmIChpc0xlZnQpIHtcbiAgICBscCA9IGFyci5zbGljZSgwLCBudW0pXG4gICAgcnAgPSBhcnIuc2xpY2UobnVtKVxuICB9XG4gIGVsc2Uge1xuICAgIGxwID0gYXJyLnNsaWNlKDAsIGxlbiAtIG51bSlcbiAgICBycCA9IGFyci5zbGljZShsZW4gLSBudW0pXG4gIH1cbiAgcmV0dXJuIHJwLmNvbmNhdChscClcbn1cbi8qKlxuICogQ3JlYXRlIGEgY2FjaGVkIHZlcnNpb24gb2YgYSBwdXJlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVkIChmbjogYW55KSB7XG4gIGNvbnN0IGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICByZXR1cm4gZnVuY3Rpb24gY2FjaGVkRm4gKHN0cjogc3RyaW5nKSB7XG4gICAgY29uc3QgaGl0ID0gY2FjaGVbc3RyXVxuICAgIHJldHVybiBoaXQgfHwgKGNhY2hlW3N0cl0gPSBmbihzdHIpKVxuICB9XG59XG4vKipcbiAqIENhbWVsaXplIGEgaHlwaGVuLWRlbG1pdGVkIHN0cmluZy5cbiAqL1xuY29uc3QgY2FtZWxpemVSRSA9IC8tKFxcdykvZ1xuZXhwb3J0IGNvbnN0IGNhbWVsaXplID0gY2FjaGVkKHN0ciA9PiB7XG4gIHJldHVybiBzdHIucmVwbGFjZShjYW1lbGl6ZVJFLCAoXywgYykgPT4gYy50b1VwcGVyQ2FzZSgpKVxufSlcbmV4cG9ydCBmdW5jdGlvbiBjYW1lbGl6ZUtleXMgKG9iajogYW55KSB7XG4gIGNvbnN0IHJlcyA9IHt9XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIHJlc1tjYW1lbGl6ZShrZXkpXSA9IG9ialtrZXldXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuLyoqXG4gKiBDYXBpdGFsaXplIGEgc3RyaW5nLlxuICovXG5leHBvcnQgY29uc3QgY2FwaXRhbGl6ZSA9IGNhY2hlZChzdHIgPT4ge1xuICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpXG59KVxuICAvKipcbiAgICogSHlwaGVuYXRlIGEgY2FtZWxDYXNlIHN0cmluZy5cbiAgICovXG5jb25zdCBoeXBoZW5hdGVSRSA9IC8oW14tXSkoW0EtWl0pL2dcbmV4cG9ydCBjb25zdCBoeXBoZW5hdGUgPSBjYWNoZWQoc3RyID0+IHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKGh5cGhlbmF0ZVJFLCAnJDEtJDInKS5yZXBsYWNlKGh5cGhlbmF0ZVJFLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG59KVxuZXhwb3J0IGZ1bmN0aW9uIGh5cGhlbmF0ZUtleXMgKG9iajogYW55KSB7XG4gIGNvbnN0IHJlcyA9IHt9XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIHJlc1toeXBoZW5hdGUoa2V5KV0gPSBvYmpba2V5XVxuICB9XG4gIHJldHVybiByZXNcbn1cbmNvbnN0IHZlbmRvcnNSZWcgPSAvd2Via2l0LXxtb3otfG8tfG1zLS9cbmV4cG9ydCBmdW5jdGlvbiBoeXBoZW5hdGVTdHlsZUtleXMgKG9iajogYW55KSB7XG4gIGNvbnN0IHJlcyA9IHt9XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGNvbnN0IGhrID0gaHlwaGVuYXRlKGtleSkucmVwbGFjZSh2ZW5kb3JzUmVnLCBmdW5jdGlvbiAoJDApIHtcbiAgICAgIHJldHVybiAnLScgKyAkMFxuICAgIH0pXG4gICAgcmVzW2hrXSA9IG9ialtrZXldXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNhbWVsVG9LZWJhYiAobmFtZTogc3RyaW5nKSB7XG4gIGlmICghbmFtZSkge1xuICAgIHJldHVybiAnJ1xuICB9XG4gIHJldHVybiBuYW1lLnJlcGxhY2UoLyhbQS1aXSkvZywgZnVuY3Rpb24gKGcsIGcxKSB7XG4gICAgcmV0dXJuIGAtJHtnMS50b0xvd2VyQ2FzZSgpfWBcbiAgfSlcbn1cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRDc3MgKGNzczogc3RyaW5nLCBjc3NJZDogc3RyaW5nLCByZXBsYWNlOiBib29sZWFuKSB7XG4gIGxldCBzdHlsZTogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY3NzSWQpXG4gIGlmIChzdHlsZSAmJiByZXBsYWNlKSB7XG4gICAgc3R5bGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZSlcbiAgICBzdHlsZSA9IG51bGxcbiAgfVxuICBpZiAoIXN0eWxlKSB7XG4gICAgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpXG4gICAgc3R5bGUudHlwZSA9ICd0ZXh0L2NzcydcbiAgICBjc3NJZCAmJiAoc3R5bGUuaWQgPSBjc3NJZClcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKHN0eWxlKVxuICB9XG4gIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpXG59XG5leHBvcnQgZnVuY3Rpb24gbmV4dEZyYW1lIChjYWxsYmFjazogYW55KSB7XG4gIGNvbnN0IHJ1bm5lciA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICB8fCB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgfHwgd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgIHx8IChjYiA9PiBzZXRUaW1lb3V0KGNiLCAxNikpXG4gIHJ1bm5lcihjYWxsYmFjaylcbn1cbmV4cG9ydCBmdW5jdGlvbiB0b0NTU1RleHQgKG9iamVjdDogYW55KSB7XG4gIGlmICghb2JqZWN0KSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3Qgb2JqID0gaHlwaGVuYXRlU3R5bGVLZXlzKG9iamVjdClcbiAgbGV0IGNzc1RleHQgPSAnJ1xuICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICBjc3NUZXh0ICs9IGAke2tleX06JHtvYmpba2V5XX07YFxuICB9XG4gIHJldHVybiBjc3NUZXh0XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vIEBmbG93XG5cbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gJy4uL3V0aWxzL2Z1bmMnXG5cbi8qKlxuICogdmlld3BvcnQgcHJpb3JpdHk6XG4gKlxuICogMS4gbWV0YSB3ZWV4LXZpZXdwb3J0IChkZXZlbG9wZXIgY3VzdG9tKVxuICogMi4gc2V0Vmlld3BvcnQoY29uZmlnKSA6PSBjb25maWcud2lkdGggKHByaXZhdGUgY29kZSkgQGRlcHJlY2F0ZWRcbiAqIDMuIHByb2Nlc3MuZW52LlZJRVdQT1JUX1dJRFRIIChidWlkIHRpbWUpXG4gKlxuICovXG5sZXQgaXNJbml0ZWQgPSBmYWxzZVxuY29uc3QgREVGQVVMVF9WSUVXUE9SVF9XSURUSCA9IDc1MFxuXG4vKipcbiAqIGdldCB2aWV3cG9ydCB3aWR0aCBmcm9tIHdlZXgtdmlld3BvcnQgbWV0YS5cbiAqL1xuY29uc3QgZW52Vmlld3BvcnRXaWR0aCA9IHBhcnNlSW50KHByb2Nlc3MuZW52LlZJRVdQT1JUX1dJRFRIKVxubGV0IHdpZHRoOiBudW1iZXIgPSAhaXNOYU4oZW52Vmlld3BvcnRXaWR0aCkgJiYgZW52Vmlld3BvcnRXaWR0aCA+IDBcbiAgPyBlbnZWaWV3cG9ydFdpZHRoXG4gIDogREVGQVVMVF9WSUVXUE9SVF9XSURUSFxuXG5sZXQgd3hWaWV3cG9ydE1ldGEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJ3ZWV4LXZpZXdwb3J0XCJdJylcbmNvbnN0IG1ldGFXaWR0aCA9IHd4Vmlld3BvcnRNZXRhICYmIHBhcnNlSW50KHd4Vmlld3BvcnRNZXRhLmdldEF0dHJpYnV0ZSgnY29udGVudCcpKVxuaWYgKG1ldGFXaWR0aCAmJiAhaXNOYU4obWV0YVdpZHRoKSAmJiBtZXRhV2lkdGggPiAwKSB7XG4gIHdpZHRoID0gbWV0YVdpZHRoXG59XG5cbmxldCBkcHI6IG51bWJlciA9IDBcbmxldCBzY3JlZW5XaWR0aDogbnVtYmVyID0gMFxubGV0IHNjcmVlbkhlaWdodDogbnVtYmVyID0gMFxuXG5jb25zdCBpbmZvOiB7XG4gIGRwcjogbnVtYmVyLFxuICBzY2FsZTogbnVtYmVyLFxuICByZW06IG51bWJlcixcbiAgZGV2aWNlV2lkdGg6IG51bWJlcixcbiAgZGV2aWNlSGVpZ2h0OiBudW1iZXJcbn0gPSB7XG4gIGRwcixcbiAgc2NhbGU6IDAsXG4gIHJlbTogMCxcbiAgZGV2aWNlV2lkdGg6IDAsXG4gIGRldmljZUhlaWdodDogMFxufVxuXG4vKipcbiAqIHNldCByb290IGZvbnQtc2l6ZSBmb3IgcmVtIHVuaXRzLiBJZiBhbHJlYWR5IGJlZW4gc2V0LCBqdXN0IHNraXAgdGhpcy5cbiAqL1xuZnVuY3Rpb24gc2V0Um9vdEZvbnQgKHdpZHRoOiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3QgZG9jID0gd2luZG93LmRvY3VtZW50XG4gIGNvbnN0IHJlbSA9IHdpZHRoIC8gMTBcbiAgaWYgKCFkb2MuZG9jdW1lbnRFbGVtZW50KSB7IHJldHVybiB9XG4gIGNvbnN0IHJvb3RGb250U2l6ZSA9IGRvYy5kb2N1bWVudEVsZW1lbnQuc3R5bGUuZm9udFNpemVcbiAgaWYgKCFyb290Rm9udFNpemUpIHtcbiAgICBkb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmZvbnRTaXplID0gcmVtICsgJ3B4J1xuICAgIGluZm8ucmVtID0gcmVtXG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0TWV0YVZpZXdwb3J0ICh3aWR0aDogbnVtYmVyKTogdm9pZCB7XG4gIGlmICghd3hWaWV3cG9ydE1ldGEpIHtcbiAgICB3eFZpZXdwb3J0TWV0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21ldGEnKVxuICAgIHd4Vmlld3BvcnRNZXRhLnNldEF0dHJpYnV0ZSgnbmFtZScsICd3ZWV4LXZpZXdwb3J0JylcbiAgfVxuICBlbHNlIHtcbiAgICBjb25zdCBtZXRhV2lkdGggPSBwYXJzZUludCh3eFZpZXdwb3J0TWV0YS5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKSlcbiAgICBpZiAobWV0YVdpZHRoID09PSB3aWR0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICB9XG4gIHd4Vmlld3BvcnRNZXRhLnNldEF0dHJpYnV0ZSgnY29udGVudCcsIHdpZHRoICsgJycpXG59XG5cbi8qKlxuICogZXhwb3J0IHZpZXdwb3J0IGluZm8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0ICh2aWV3cG9ydFdpZHRoOiBudW1iZXIgPSB3aWR0aCk6ID97XG4gIGRwcjogbnVtYmVyLFxuICBzY2FsZTogbnVtYmVyLFxuICByZW06IG51bWJlcixcbiAgZGV2aWNlV2lkdGg6IG51bWJlcixcbiAgZGV2aWNlSGVpZ2h0OiBudW1iZXJcbn0ge1xuICBpZiAoIWlzSW5pdGVkKSB7XG4gICAgaXNJbml0ZWQgPSB0cnVlXG5cbiAgICBjb25zdCBkb2MgPSB3aW5kb3cuZG9jdW1lbnRcbiAgICBpZiAoIWRvYykge1xuICAgICAgY29uc29sZS5lcnJvcignW3Z1ZS1yZW5kZXJdIHdpbmRvdy5kb2N1bWVudCBpcyB1bmRmaW5lZC4nKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghZG9jLmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgY29uc29sZS5lcnJvcignW3Z1ZS1yZW5kZXJdIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCBpcyB1bmRmaW5lZC4nKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZHByID0gaW5mby5kcHIgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb1xuICAgIHNjcmVlbldpZHRoID0gZG9jLmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aFxuICAgIHNjcmVlbkhlaWdodCA9IGRvYy5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0XG5cbiAgICBjb25zdCByZXNldERldmljZUhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNjcmVlbkhlaWdodCA9IGRvYy5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0XG4gICAgICBjb25zdCBlbnYgPSB3aW5kb3cud2VleCAmJiB3aW5kb3cud2VleC5jb25maWcuZW52XG4gICAgICBpbmZvLmRldmljZUhlaWdodCA9IGVudi5kZXZpY2VIZWlnaHQgPSBzY3JlZW5IZWlnaHQgKiBkcHJcbiAgICB9XG5cbiAgICAvLyBzZXQgcm9vdCBmb250IGZvciByZW0uXG4gICAgc2V0Um9vdEZvbnQoc2NyZWVuV2lkdGgpXG4gICAgc2V0TWV0YVZpZXdwb3J0KHZpZXdwb3J0V2lkdGgpXG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgcmVzZXREZXZpY2VIZWlnaHQpXG5cbiAgICAvKipcbiAgICAgKiB3aHkgbm90IHRvIHVzZSB3aW5kb3cuc2NyZWVuLndpZHRoIHRvIGdldCBzY3JlZW5XaWR0aCA/IEJlY2F1c2UgaW4gc29tZVxuICAgICAqIG9sZCB3ZWJraXQgYnJvd3NlciBvbiBhbmRyb2lkIHN5c3RlbSBpdCBnZXQgdGhlIGRldmljZSBwaXhlbCB3aWR0aCwgd2hpY2hcbiAgICAgKiBpcyB0aGUgc2NyZWVuV2lkdGggbXVsdGlwbHkgYnkgdGhlIGRldmljZSBwaXhlbCByYXRpby5cbiAgICAgKiBlLmcuIGlwNiAtPiBnZXQgMzc1IGZvciB2aXJ0dWFsIHNjcmVlbiB3aWR0aC5cbiAgICAgKi9cbiAgICBjb25zdCBzY2FsZSA9IHNjcmVlbldpZHRoIC8gdmlld3BvcnRXaWR0aFxuICAgIC8qKlxuICAgICAqIDEuIGlmIHNldCBpbml0aWFsL21heGltdW0vbWltaW11bS1zY2FsZSBzb21lIGhvdyB0aGUgcGFnZSB3aWxsIGhhdmUgYSBib3VuY2VcbiAgICAgKiBlZmZlY3Qgd2hlbiB1c2VyIGRyYWcgdGhlIHBhZ2UgdG93YXJkcyBob3Jpem9udGFsIGF4aXMuXG4gICAgICogMi4gRHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucywgbm90IHRvIHVzZSB2aWV3cG9ydCBtZXRhIGFueW1vcmUuIEp1c3QgYnJpbmdcbiAgICAgKiBhIHBhcmFtZXRlciBzY2FsZSBpbnRvIHRoZSBzdHlsZSB2YWx1ZSBwcm9jZXNzaW5nLlxuICAgICAqL1xuXG4gICAgLy8gY29uc3QgY29udGVudHMgPSBbXG4gICAgLy8gICBgd2lkdGg9JHt2aWV3cG9ydFdpZHRofWAsXG4gICAgLy8gICBgaW5pdGlhbC1zY2FsZT0ke3NjYWxlfWAsXG4gICAgLy8gICBgbWF4aW11bS1zY2FsZT0ke3NjYWxlfWAsXG4gICAgLy8gICBgbWluaW11bS1zY2FsZT0ke3NjYWxlfWAsXG4gICAgLy8gICBgdXNlci1zY2FsYWJsZT1ub2BcbiAgICAvLyBdXG5cbiAgICAvLyBsZXQgbWV0YSA9IGRvYy5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJ2aWV3cG9ydFwiXScpXG4gICAgLy8gaWYgKCFtZXRhKSB7XG4gICAgLy8gICBtZXRhID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ21ldGEnKVxuICAgIC8vICAgbWV0YS5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAndmlld3BvcnQnKVxuICAgIC8vICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZCcpLmFwcGVuZENoaWxkKG1ldGEpXG4gICAgLy8gfVxuICAgIC8vIG1ldGEuc2V0QXR0cmlidXRlKCdjb250ZW50JywgY29udGVudHMuam9pbignLCcpKVxuXG4gICAgZXh0ZW5kKGluZm8sIHtcbiAgICAgIHNjYWxlLFxuICAgICAgZGV2aWNlV2lkdGg6IHNjcmVlbldpZHRoICogZHByLFxuICAgICAgZGV2aWNlSGVpZ2h0OiBzY3JlZW5IZWlnaHQgKiBkcHJcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGluZm9cbn1cblxuLyoqXG4gKiByZXNldCB2aWV3cG9ydCB3aWR0aCBhbmQgc2NhbGUuXG4gKiBAcmV0dXJuIG5ldyBzY2FsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0Vmlld3BvcnQgKHZpZXdwb3J0V2lkdGg6IG51bWJlcik6IG51bWJlciB7XG4gIHNldE1ldGFWaWV3cG9ydCh2aWV3cG9ydFdpZHRoKVxuICBjb25zdCBuZXdTY2FsZSA9IHNjcmVlbldpZHRoIC8gdmlld3BvcnRXaWR0aFxuICBpbmZvLnNjYWxlID0gbmV3U2NhbGVcbiAgcmV0dXJuIG5ld1NjYWxlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaWV3cG9ydEluZm8gKCk6IHtcbiAgZHByOiBudW1iZXIsXG4gIHNjYWxlOiBudW1iZXIsXG4gIHJlbTogbnVtYmVyLFxuICBkZXZpY2VXaWR0aDogbnVtYmVyLFxuICBkZXZpY2VIZWlnaHQ6IG51bWJlclxufSB7XG4gIHJldHVybiBpbmZvXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuZnVuY3Rpb24gZXh0ZW5kICh0bywgLi4uYXJncykge1xuICBpZiAoIWFyZ3MgfHwgYXJncy5sZW5ndGggPD0gMCkgeyByZXR1cm4gdG8gfVxuICBhcmdzLmZvckVhY2goZnJvbSA9PiB7XG4gICAgaWYgKHR5cGVvZiBmcm9tICE9PSAnb2JqZWN0JykgeyByZXR1cm4gfVxuICAgIGZvciAoY29uc3Qga2V5IGluIGZyb20pIHtcbiAgICAgIHRvW2tleV0gPSBmcm9tW2tleV1cbiAgICB9XG4gIH0pXG4gIHJldHVybiB0b1xufVxuXG4vLyBpZiBzdXBwb3J0IHBhc3NpdmUgZXZlbnQgbGlzdGVuZXJzLlxubGV0IF9zdXBwb3J0c1Bhc3NpdmUgPSBmYWxzZVxudHJ5IHtcbiAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIF8gPT4ge30sIHtcbiAgICBnZXQgcGFzc2l2ZSAoKSB7XG4gICAgICBfc3VwcG9ydHNQYXNzaXZlID0gdHJ1ZVxuICAgIH1cbiAgfSlcbn1cbmNhdGNoIChlKSB7XG4gIC8vIGRvIG5vdGhpbmcuXG59XG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNQYXNzaXZlICgpIHtcbiAgcmV0dXJuIF9zdXBwb3J0c1Bhc3NpdmVcbn1cblxuLyoqXG4gKiBDcmVhdGUgRXZlbnQuXG4gKiBAcGFyYW0ge0RPTVN0cmluZ30gdHlwZVxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFdmVudCAodGFyZ2V0LCB0eXBlLCBwcm9wcykge1xuICBjb25zdCBldmVudCA9IG5ldyBFdmVudCh0eXBlLCB7IGJ1YmJsZXM6IGZhbHNlIH0pXG5cbiAgZXh0ZW5kKGV2ZW50LCBwcm9wcylcbiAgLy8gIHBoYW50b21qcyBkb24ndCBzdXBwb3J0IGN1c3RvbWVyIGV2ZW50XG4gIGlmICh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ3BoYW50b21qcycpICE9PSAtMSkge1xuICAgIHJldHVybiBldmVudFxuICB9XG4gIHRyeSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV2ZW50LCAndGFyZ2V0Jywge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiB0YXJnZXRcbiAgICB9KVxuICB9XG4gIGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gZXh0ZW5kKHt9LCBldmVudCwgeyB0YXJnZXQ6IHRhcmdldCB9KVxuICB9XG4gIHJldHVybiBldmVudFxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGJ1YmJhYmxlIEV2ZW50LlxuICogQHBhcmFtIHtET01TdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQnViYmxlc0V2ZW50ICh0YXJnZXQsIHR5cGUsIHByb3BzKSB7XG4gIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KHR5cGUsIHsgYnViYmxlczogdHJ1ZSB9KVxuICBleHRlbmQoZXZlbnQsIHByb3BzKVxuICAvLyAgcGhhbnRvbWpzIGRvbid0IHN1cHBvcnQgY3VzdG9tZXIgZXZlbnRcbiAgaWYgKHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZigncGhhbnRvbWpzJykgIT09IC0xKSB7XG4gICAgcmV0dXJuIGV2ZW50XG4gIH1cbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXZlbnQsICd0YXJnZXQnLCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHRhcmdldFxuICAgIH0pXG4gIH1cbiAgY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBleHRlbmQoe30sIGV2ZW50LCB7IHRhcmdldDogdGFyZ2V0IH0pXG4gIH1cbiAgcmV0dXJuIGV2ZW50XG59XG5cbi8qKlxuICogQ3JlYXRlIEN1c3RvbSBFdmVudC5cbiAqIEBwYXJhbSB7RE9NU3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUN1c3RvbUV2ZW50ICh0YXJnZXQsIHR5cGUsIHByb3BzKSB7XG4gIC8vIGNvbXBhdGliaWxpdHk6IGh0dHA6Ly9jYW5pdXNlLmNvbS8jc2VhcmNoPWN1c3RvbWV2ZW50XG4gIC8vIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KHR5cGUpXG4gIGNvbnN0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgZXZlbnQuaW5pdEN1c3RvbUV2ZW50KHR5cGUsIGZhbHNlLCB0cnVlLCB7fSlcbiAgLy8gZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAvLyBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuXG4gIGV4dGVuZChldmVudCwgcHJvcHMpXG5cbiAgLy8gZXZlbnQudGFyZ2V0IGlzIHJlYWRvbmx5XG4gIHRyeSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV2ZW50LCAndGFyZ2V0Jywge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiB0YXJnZXQgfHwgbnVsbFxuICAgIH0pXG4gIH1cbiAgY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBleHRlbmQoe30sIGV2ZW50LCB7IHRhcmdldDogdGFyZ2V0IHx8IG51bGwgfSlcbiAgfVxuXG4gIHJldHVybiBldmVudFxufVxuXG4vKipcbiAqIGRpc3BhdGNoIGEgZXZlbnQgb24gYSBkb20gZWxlbWVudC5cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBkb21cbiAqIEBwYXJhbSAge0V2ZW50fSBldmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcGF0Y2hFdmVudCAoZG9tLCBldmVudCkge1xuICBkb20uZGlzcGF0Y2hFdmVudChldmVudClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcEZvcm1FdmVudHMgKGNvbnRleHQpIHtcbiAgY29uc3QgZXZlbnRNYXAgPSB7fVxuICA7WydpbnB1dCcsICdjaGFuZ2UnLCAnZm9jdXMnLCAnYmx1ciddLmZvckVhY2godHlwZSA9PiB7XG4gICAgZXZlbnRNYXBbdHlwZV0gPSBldmVudCA9PiB7XG4gICAgICBpZiAoY29udGV4dC4kZWwpIHtcbiAgICAgICAgZXZlbnQudmFsdWUgPSBjb250ZXh0LiRlbC52YWx1ZVxuICAgICAgfVxuICAgICAgY29udGV4dC4kZW1pdCh0eXBlLCBldmVudClcbiAgICB9XG4gIH0pXG4gIHJldHVybiBldmVudE1hcFxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG1hcEZvcm1FdmVudHNcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQge1xuICBzY3JvbGxhYmxlVHlwZXM6IFsnc2Nyb2xsZXInLCAnbGlzdCcsICd3YXRlcmZhbGwnXSxcbiAgZ2VzdHVyZUV2ZW50czogW1xuICAgICdwYW5zdGFydCcsXG4gICAgJ3Bhbm1vdmUnLFxuICAgICdwYW5lbmQnLFxuICAgICdzd2lwZScsXG4gICAgJ2xvbmdwcmVzcycsXG4gICAgJ3RhcCdcbiAgXVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyB0aHJvdHRsZSwgZXh0ZW5kIH0gZnJvbSAnLi9mdW5jJ1xuaW1wb3J0IHsgY3JlYXRlRXZlbnQgfSBmcm9tICcuL2V2ZW50J1xuaW1wb3J0IGNvbmZpZyBmcm9tICcuLi9jb25maWcnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJlbnRTY3JvbGxlciAodm0pIHtcbiAgaWYgKCF2bSkgcmV0dXJuIG51bGxcbiAgaWYgKHZtLl9wYXJlbnRTY3JvbGxlcikge1xuICAgIHJldHVybiB2bS5fcGFyZW50U2Nyb2xsZXJcbiAgfVxuICBmdW5jdGlvbiBfZ2V0UGFyZW50U2Nyb2xsZXIgKHBhcmVudCkge1xuICAgIGlmICghcGFyZW50KSB7IHJldHVybiB9XG4gICAgaWYgKGNvbmZpZy5zY3JvbGxhYmxlVHlwZXMuaW5kZXhPZihwYXJlbnQud2VleFR5cGUpID4gLTEpIHtcbiAgICAgIHZtLl9wYXJlbnRTY3JvbGxlciA9IHBhcmVudFxuICAgICAgcmV0dXJuIHBhcmVudFxuICAgIH1cbiAgICByZXR1cm4gX2dldFBhcmVudFNjcm9sbGVyKHBhcmVudC4kcGFyZW50KVxuICB9XG4gIHJldHVybiBfZ2V0UGFyZW50U2Nyb2xsZXIodm0uJHBhcmVudClcbn1cblxuZnVuY3Rpb24gaG9yaXpvbnRhbEJhbGFuY2UgKHJlY3QsIGN0UmVjdCkge1xuICByZXR1cm4gcmVjdC5sZWZ0IDwgY3RSZWN0LnJpZ2h0ICYmIHJlY3QucmlnaHQgPiBjdFJlY3QubGVmdFxufVxuXG5mdW5jdGlvbiB2ZXJ0aWNhbEJhbGFuY2UgKHJlY3QsIGN0UmVjdCkge1xuICByZXR1cm4gcmVjdC50b3AgPCBjdFJlY3QuYm90dG9tICYmIHJlY3QuYm90dG9tID4gY3RSZWN0LnRvcFxufVxuXG4vKipcbiAqIHJldHVybiBhIGRhdGEgYXJyYXkgd2l0aCB0d28gYm9vbGVhbiB2YWx1ZSwgd2hpY2ggYXJlOlxuICogMS4gdmlzaWJsZSBpbiBjdXJyZW50IGN0J3Mgdmlld3BvcnQuXG4gKiAyLiB2aXNpYmxlIHdpdGggb2Zmc2V0IGluIGN1cnJlbnQgY3QncyB2aWV3cG9ydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0ludGVyc2VjdGlvbiAocmVjdCwgY3RSZWN0LCBkaXIsIG9mZnNldCkge1xuICBkaXIgPSBkaXIgfHwgJ3VwJ1xuICBjb25zdCBpc0hvcml6b250YWwgPSBkaXIgPT09ICdsZWZ0JyB8fCBkaXIgPT09ICdyaWdodCdcbiAgY29uc3QgaXNWZXJ0aWNhbCA9IGRpciA9PT0gJ3VwJyB8fCBkaXIgPT09ICdkb3duJ1xuICBpZiAoaXNIb3Jpem9udGFsICYmICF2ZXJ0aWNhbEJhbGFuY2UocmVjdCwgY3RSZWN0KSkge1xuICAgIHJldHVybiBbZmFsc2UsIGZhbHNlXVxuICB9XG4gIGlmIChpc1ZlcnRpY2FsICYmICFob3Jpem9udGFsQmFsYW5jZShyZWN0LCBjdFJlY3QpKSB7XG4gICAgcmV0dXJuIFtmYWxzZSwgZmFsc2VdXG4gIH1cbiAgb2Zmc2V0ID0gcGFyc2VJbnQob2Zmc2V0IHx8IDApICogd2VleC5jb25maWcuZW52LnNjYWxlXG4gIHN3aXRjaCAoZGlyKSB7XG4gICAgY2FzZSAndXAnOlxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgcmVjdC50b3AgPCBjdFJlY3QuYm90dG9tICYmIHJlY3QuYm90dG9tID4gY3RSZWN0LnRvcCxcbiAgICAgICAgcmVjdC50b3AgPCBjdFJlY3QuYm90dG9tICsgb2Zmc2V0ICYmIHJlY3QuYm90dG9tID4gY3RSZWN0LnRvcCAtIG9mZnNldFxuICAgICAgXVxuICAgIGNhc2UgJ2Rvd24nOlxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgcmVjdC5ib3R0b20gPiBjdFJlY3QudG9wICYmIHJlY3QudG9wIDwgY3RSZWN0LmJvdHRvbSxcbiAgICAgICAgcmVjdC5ib3R0b20gPiBjdFJlY3QudG9wIC0gb2Zmc2V0ICYmIHJlY3QudG9wIDwgY3RSZWN0LmJvdHRvbSArIG9mZnNldFxuICAgICAgXVxuICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgcmVjdC5sZWZ0IDwgY3RSZWN0LnJpZ2h0ICYmIHJlY3QucmlnaHQgPiBjdFJlY3QubGVmdCxcbiAgICAgICAgcmVjdC5sZWZ0IDwgY3RSZWN0LnJpZ2h0ICsgb2Zmc2V0ICYmIHJlY3QucmlnaHQgPiBjdFJlY3QubGVmdCAtIG9mZnNldFxuICAgICAgXVxuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHJlY3QucmlnaHQgPiBjdFJlY3QubGVmdCAmJiByZWN0LmxlZnQgPCBjdFJlY3QucmlnaHQsXG4gICAgICAgIHJlY3QucmlnaHQgPiBjdFJlY3QubGVmdCAtIG9mZnNldCAmJiByZWN0LmxlZnQgPCBjdFJlY3QucmlnaHQgKyBvZmZzZXRcbiAgICAgIF1cbiAgfVxufVxuXG4vKipcbiAqIGlzRWxlbWVudFZpc2libGVcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSAgZWwgICAgYSBkb20gZWxlbWVudC5cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSAgY29udGFpbmVyICBvcHRpb25hbCwgdGhlIGNvbnRhaW5lciBvZiB0aGlzIGVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbGVtZW50VmlzaWJsZSAoZWwsIGNvbnRhaW5lciwgZGlyLCBvZmZzZXQpIHtcbiAgaWYgKCFlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHsgcmV0dXJuIGZhbHNlIH1cbiAgY29uc3QgYm9keVJlY3QgPSB7XG4gICAgdG9wOiAwLFxuICAgIGxlZnQ6IDAsXG4gICAgYm90dG9tOiB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gICAgcmlnaHQ6IHdpbmRvdy5pbm5lcldpZHRoXG4gIH1cbiAgY29uc3QgY3RSZWN0ID0gKGNvbnRhaW5lciA9PT0gd2luZG93IHx8IGNvbnRhaW5lciA9PT0gZG9jdW1lbnQuYm9keSlcbiAgICA/IGJvZHlSZWN0IDogY29udGFpbmVyXG4gICAgPyBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiBib2R5UmVjdFxuICByZXR1cm4gaGFzSW50ZXJzZWN0aW9uKGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBjdFJlY3QsIGRpciwgb2Zmc2V0KVxufVxuXG4vLyB0byB0cmlnZ2VyIHRoZSBhcHBlYXIvZGlzYXBwZWFyIGV2ZW50LlxuZnVuY3Rpb24gdHJpZ2dlckV2ZW50IChlbG0sIGhhbmRsZXJzLCBldnQsIGRpcikge1xuICBsZXQgbGlzdGVuZXIgPSBoYW5kbGVyc1tldnRdXG4gIGlmIChsaXN0ZW5lciAmJiBsaXN0ZW5lci5mbikge1xuICAgIGxpc3RlbmVyID0gbGlzdGVuZXIuZm5cbiAgfVxuICBpZiAobGlzdGVuZXIpIHtcbiAgICBsaXN0ZW5lcihjcmVhdGVFdmVudChlbG0sIGV2dCwge1xuICAgICAgZGlyZWN0aW9uOiBkaXJcbiAgICB9KSlcbiAgfVxufVxuXG4vKipcbiAqIGdldCBhbGwgZXZlbnQgbGlzdGVuZXJzLiBpbmNsdWRpbmcgYm91bmQgaGFuZGxlcnMgaW4gYWxsIHBhcmVudCB2bm9kZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFdmVudEhhbmRsZXJzIChjb250ZXh0KSB7XG4gIGxldCB2bm9kZSA9IGNvbnRleHQuJHZub2RlXG4gIGNvbnN0IGhhbmRsZXJzID0ge31cbiAgY29uc3QgYXR0YWNoZWRWbm9kZXMgPSBbXVxuICB3aGlsZSAodm5vZGUpIHtcbiAgICBhdHRhY2hlZFZub2Rlcy5wdXNoKHZub2RlKVxuICAgIHZub2RlID0gdm5vZGUucGFyZW50XG4gIH1cbiAgYXR0YWNoZWRWbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAodm5vZGUpIHtcbiAgICBjb25zdCBwYXJlbnRMaXN0ZW5lcnMgPSB2bm9kZS5jb21wb25lbnRPcHRpb25zICYmIHZub2RlLmNvbXBvbmVudE9wdGlvbnMubGlzdGVuZXJzXG4gICAgY29uc3QgZGF0YU9uID0gdm5vZGUuZGF0YSAmJiB2bm9kZS5kYXRhLm9uXG4gICAgZXh0ZW5kKGhhbmRsZXJzLCBwYXJlbnRMaXN0ZW5lcnMsIGRhdGFPbilcbiAgfSlcbiAgcmV0dXJuIGhhbmRsZXJzXG59XG5cbmZ1bmN0aW9uIGdldEFwcGVhck9mZnNldCAoZWwpIHtcbiAgcmV0dXJuIGVsICYmIGVsLmdldEF0dHJpYnV0ZSgnYXBwZWFyLW9mZnNldCcpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSGFuZGxlcnMgKGhhbmRsZXJzKSB7XG4gIHJldHVybiBbXG4gICAgISEoaGFuZGxlcnMuYXBwZWFyIHx8IGhhbmRsZXJzLmRpc2FwcGVhciksXG4gICAgISEoaGFuZGxlcnMub2Zmc2V0QXBwZWFyIHx8IGhhbmRsZXJzLm9mZnNldERpc2FwcGVhcilcbiAgXVxufVxuXG4vKipcbiAqIFdhdGNoIGVsZW1lbnQncyB2aXNpYmlsaXR5IHRvIHRlbGwgd2hldGhlciBzaG91bGQgdHJpZ2dlciBhIGFwcGVhci9kaXNhcHBlYXJcbiAqIGV2ZW50IGluIHNjcm9sbCBoYW5kbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2F0Y2hBcHBlYXIgKGNvbnRleHQsIGZpcmVOb3cpIHtcbiAgY29uc3QgZWwgPSBjb250ZXh0ICYmIGNvbnRleHQuJGVsXG4gIGlmICghZWwgfHwgZWwubm9kZVR5cGUgIT09IDEpIHsgcmV0dXJuIH1cbiAgY29uc3QgYXBwZWFyT2Zmc2V0ID0gZ2V0QXBwZWFyT2Zmc2V0KGVsKVxuXG4gIGNvbnN0IGhhbmRsZXJzID0gZ2V0RXZlbnRIYW5kbGVycyhjb250ZXh0KVxuICBjb25zdCBjaGVja1Jlc3VsdHMgPSBjaGVja0hhbmRsZXJzKGhhbmRsZXJzKVxuICAvLyBubyBhcHBlYXIgb3Igb2Zmc2V0QXBwZWFyIGhhbmRsZXIgd2FzIGJvdW5kLlxuICBpZiAoIWNoZWNrUmVzdWx0c1swXSAmJiAhY2hlY2tSZXN1bHRzWzFdKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBsZXQgaXNXaW5kb3cgPSBmYWxzZVxuICBsZXQgY29udGFpbmVyID0gd2luZG93XG4gIGNvbnN0IHNjcm9sbGVyID0gZ2V0UGFyZW50U2Nyb2xsZXIoY29udGV4dClcbiAgaWYgKHNjcm9sbGVyICYmIHNjcm9sbGVyLiRlbCkge1xuICAgIGNvbnRhaW5lciA9IHNjcm9sbGVyLiRlbFxuICB9XG4gIGVsc2Uge1xuICAgIGlzV2luZG93ID0gdHJ1ZVxuICB9XG5cbiAgaWYgKGZpcmVOb3cpIHtcbiAgICBjb25zdCB2aXNpYmxlRGF0YSA9IGlzRWxlbWVudFZpc2libGUoZWwsIGNvbnRhaW5lciwgbnVsbCwgYXBwZWFyT2Zmc2V0KVxuICAgIGRldGVjdEFwcGVhcihjb250ZXh0LCB2aXNpYmxlRGF0YSwgbnVsbClcbiAgfVxuXG4gIC8vIGFkZCBjdXJyZW50IHZtIHRvIHRoZSBjb250YWluZXIncyBhcHBlYXIgd2F0Y2ggbGlzdC5cbiAgaWYgKCFjb250YWluZXIuX3dhdGNoQXBwZWFyTGlzdCkge1xuICAgIGNvbnRhaW5lci5fd2F0Y2hBcHBlYXJMaXN0ID0gW11cbiAgfVxuICBjb250YWluZXIuX3dhdGNoQXBwZWFyTGlzdC5wdXNoKGNvbnRleHQpXG5cbiAgLyoqXG4gICAqIENvZGUgYmVsb3cgd2lsbCBvbmx5IGV4ZWMgb25jZSBmb3IgYmluZGluZyBzY3JvbGwgaGFuZGxlciBmb3IgcGFyZW50IGNvbnRhaW5lci5cbiAgICovXG4gIGlmIChjb250YWluZXIuX3Njcm9sbFdhdGNoZWQpIHtcbiAgICByZXR1cm5cbiAgfVxuICBjb250YWluZXIuX3Njcm9sbFdhdGNoZWQgPSB0cnVlXG4gIGNvbnN0IHNjcm9sbEhhbmRsZXIgPSB0aHJvdHRsZShldmVudCA9PiB7XG4gICAgLyoqXG4gICAgICogZGV0ZWN0IHNjcm9sbGluZyBkaXJlY3Rpb24uXG4gICAgICogZGlyZWN0aW9uIG9ubHkgc3VwcG9ydCB1cCAmIGRvd24geWV0LlxuICAgICAqIFRPRE86IGRpcmVjdGlvbiBzdXBwb3J0IGxlZnQgJiByaWdodC5cbiAgICAgKi9cbiAgICBjb25zdCBzY3JvbGxUb3AgPSBpc1dpbmRvdyA/IHdpbmRvdy5wYWdlWU9mZnNldCA6IGNvbnRhaW5lci5zY3JvbGxUb3BcbiAgICBjb25zdCBwcmVUb3AgPSBjb250YWluZXIuX2xhc3RTY3JvbGxUb3BcbiAgICBjb250YWluZXIuX2xhc3RTY3JvbGxUb3AgPSBzY3JvbGxUb3BcbiAgICBjb25zdCBkaXIgPSAoc2Nyb2xsVG9wIDwgcHJlVG9wXG4gICAgICA/ICdkb3duJyA6IHNjcm9sbFRvcCA+IHByZVRvcFxuICAgICAgPyAndXAnIDogY29udGFpbmVyLl9wcmV2RGlyZWN0aW9uKSB8fCBudWxsXG4gICAgY29udGFpbmVyLl9wcmV2RGlyZWN0aW9uID0gZGlyXG4gICAgY29uc3Qgd2F0Y2hBcHBlYXJMaXN0ID0gY29udGFpbmVyLl93YXRjaEFwcGVhckxpc3QgfHwgW11cbiAgICBjb25zdCBsZW4gPSB3YXRjaEFwcGVhckxpc3QubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3Qgdm0gPSB3YXRjaEFwcGVhckxpc3RbaV1cbiAgICAgIGNvbnN0IGVsID0gdm0uJGVsXG4gICAgICBjb25zdCBhcHBlYXJPZmZzZXQgPSBnZXRBcHBlYXJPZmZzZXQoZWwpXG4gICAgICBjb25zdCB2aXNpYmxlRGF0YSA9IGlzRWxlbWVudFZpc2libGUoZWwsIGNvbnRhaW5lciwgZGlyLCBhcHBlYXJPZmZzZXQpXG4gICAgICBkZXRlY3RBcHBlYXIodm0sIHZpc2libGVEYXRhLCBkaXIpXG4gICAgfVxuICB9LCAyNSwgdHJ1ZSlcbiAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbEhhbmRsZXIsIGZhbHNlKVxufVxuXG4vKipcbiAqIHRyaWdnZXIgYSBkaXNhcHBlYXIgZXZlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyRGlzYXBwZWFyIChjb250ZXh0KSB7XG4gIHJldHVybiBkZXRlY3RBcHBlYXIoY29udGV4dCwgW2ZhbHNlLCBmYWxzZV0pXG59XG5cbi8qKlxuICogZGVjaWRlIHdoZXRoZXIgdG8gdHJpZ2dlciBhIGFwcGVhci9kaXNhcHBlYXIgZXZlbnQuXG4gKiBAcGFyYW0ge1Z1ZUNvbXBvbmVudH0gY29udGV4dFxuICogQHBhcmFtIHtib29sZWFufSB2aXNpYmxlXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RBcHBlYXIgKGNvbnRleHQsIHZpc2libGVEYXRhLCBkaXIgPSBudWxsLCBhcHBlYXJPZmZzZXQpIHtcbiAgY29uc3QgZWwgPSBjb250ZXh0ICYmIGNvbnRleHQuJGVsXG4gIGNvbnN0IFt2aXNpYmxlLCBvZmZzZXRWaXNpYmxlXSA9IHZpc2libGVEYXRhXG4gIGlmICghZWwpIHsgcmV0dXJuIH1cbiAgY29uc3QgaGFuZGxlcnMgPSBnZXRFdmVudEhhbmRsZXJzKGNvbnRleHQpXG4gIC8qKlxuICAgKiBObyBtYXR0ZXIgaXQncyBiaW5kaW5nIGFwcGVhci9kaXNhcHBlYXIgb3IgYm90aCBvZiB0aGVtLiBBbHdheXNcbiAgICogc2hvdWxkIHRlc3QgaXQncyB2aXNpYmlsaXR5IGFuZCBjaGFuZ2UgdGhlIGNvbnRleHQvLl92aXNpYmxlLlxuICAgKiBJZiBuZWl0aG9yIG9mIHRoZW0gd2FzIGJvdW5kLCB0aGVuIGp1c3QgaWdub3JlIGl0LlxuICAgKi9cbiAgLyoqXG4gICAqIGlmIHRoZSBjb21wb25lbnQgaGFzbid0IGFwcGVhcmVkIGZvciBvbmNlIHlldCwgdGhlbiBpdCBzaG91bGRuJ3QgdHJpZ2dlclxuICAgKiBhIGRpc2FwcGVhciBldmVudCBhdCBhbGwuXG4gICAqL1xuICBpZiAoY29udGV4dC5fYXBwZWFyZWRPbmNlIHx8IHZpc2libGUpIHtcbiAgICBpZiAoY29udGV4dC5fdmlzaWJsZSAhPT0gdmlzaWJsZSkge1xuICAgICAgaWYgKCFjb250ZXh0Ll9hcHBlYXJlZE9uY2UpIHtcbiAgICAgICAgY29udGV4dC5fYXBwZWFyZWRPbmNlID0gdHJ1ZVxuICAgICAgfVxuICAgICAgY29udGV4dC5fdmlzaWJsZSA9IHZpc2libGVcbiAgICAgIHRyaWdnZXJFdmVudChlbCwgaGFuZGxlcnMsIHZpc2libGUgPyAnYXBwZWFyJyA6ICdkaXNhcHBlYXInLCBkaXIpXG4gICAgfVxuICB9XG4gIGlmIChjb250ZXh0Ll9vZmZzZXRBcHBlYXJlZE9uY2UgfHwgb2Zmc2V0VmlzaWJsZSkge1xuICAgIGlmIChjb250ZXh0Ll9vZmZzZXRWaXNpYmxlICE9PSBvZmZzZXRWaXNpYmxlKSB7XG4gICAgICBpZiAoIWNvbnRleHQuX29mZnNldEFwcGVhcmVkT25jZSkge1xuICAgICAgICBjb250ZXh0Ll9vZmZzZXRBcHBlYXJlZE9uY2UgPSB0cnVlXG4gICAgICB9XG4gICAgICBjb250ZXh0Ll9vZmZzZXRWaXNpYmxlID0gb2Zmc2V0VmlzaWJsZVxuICAgICAgdHJpZ2dlckV2ZW50KGVsLCBoYW5kbGVycywgb2Zmc2V0VmlzaWJsZSA/ICdvZmZzZXRBcHBlYXInIDogJ29mZnNldERpc2FwcGVhcicsIGRpcilcbiAgICB9XG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vLyBAZmxvd1xuXG5pbXBvcnQgeyBpc0VsZW1lbnRWaXNpYmxlIH0gZnJvbSAnLi9jb21wb25lbnQnXG5pbXBvcnQgeyBjcmVhdGVFdmVudCwgZGlzcGF0Y2hFdmVudCB9IGZyb20gJy4vZXZlbnQnXG5pbXBvcnQgeyB0aHJvdHRsZSB9IGZyb20gJy4vZnVuYydcblxuZnVuY3Rpb24gcHJlTG9hZEltZyAoc3JjOiBzdHJpbmcsXG4gICAgbG9hZENhbGxiYWNrOiA/KEV2ZW50KSA9PiB2b2lkLFxuICAgIGVycm9yQ2FsbGJhY2s6ID8oRXZlbnQpID0+IHZvaWQpOiB2b2lkIHtcbiAgY29uc3QgaW1nID0gbmV3IEltYWdlKClcbiAgaW1nLm9ubG9hZCA9IGxvYWRDYWxsYmFjayA/IGxvYWRDYWxsYmFjay5iaW5kKGltZykgOiBudWxsXG4gIGltZy5vbmVycm9yID0gZXJyb3JDYWxsYmFjayA/IGVycm9yQ2FsbGJhY2suYmluZChpbWcpIDogbnVsbFxuICBpbWcuc3JjID0gc3JjXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNyYyAoaXRlbTogYW55LCBzcmM6ID9zdHJpbmcsIHBsYWNlaG9sZGVyU3JjOiA/c3RyaW5nKTogdm9pZCB7XG4gIGlmICghc3JjKSB7IHJldHVybiB9XG4gIGZ1bmN0aW9uIGZpbmFsbENiICgpIHtcbiAgICBkZWxldGUgaXRlbS5fc3JjX2xvYWRpbmdcbiAgfVxuICBpZiAoaXRlbS5fc3JjX2xvYWRpbmcgPT09IHNyYykge1xuICAgIHJldHVyblxuICB9XG4gIC8qKlxuICAgKiAxLiBhcHBseSBzcmMgaW1tZWRpYXRlbHkgaW4gY2FzZSBqYXZzY3JpcHQgYmxvY2tzIHRoZSBpbWFnZSBsb2FkaW5nXG4gICAqICBiZWZvcmUgbmV4dCB0aWNrLlxuICAgKi9cbiAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBgdXJsKCR7c3JjIHx8ICcnfSlgXG4gIGl0ZW0ucmVtb3ZlQXR0cmlidXRlKCdpbWctc3JjJylcbiAgLyoqXG4gICAqIDIuIHRoZW4gbG9hZCB0aGUgaW1nIHNyYyB3aXRoIEltYWdlIGNvbnN0cnVjdG9yIChidXQgd291bGQgbm90IHBvc3RcbiAgICogIGEgcmVxdWVzdCBhZ2FpbiksIGp1c3QgdG8gdHJpZ2dlciB0aGUgbG9hZCBldmVudC5cbiAgICovXG4gIGl0ZW0uX3NyY19sb2FkaW5nID0gc3JjXG4gIHByZUxvYWRJbWcoc3JjLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBgdXJsKCR7c3JjIHx8ICcnfSlgXG4gICAgY29uc3QgeyB3aWR0aDogbmF0dXJhbFdpZHRoLCBoZWlnaHQ6IG5hdHVyYWxIZWlnaHQgfSA9IHRoaXNcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgc2l6ZTogeyBuYXR1cmFsV2lkdGgsIG5hdHVyYWxIZWlnaHQgfVxuICAgIH1cbiAgICBkaXNwYXRjaEV2ZW50KGl0ZW0sIGNyZWF0ZUV2ZW50KGl0ZW0sICdsb2FkJywgcGFyYW1zKSlcbiAgICBmaW5hbGxDYigpXG4gIH0sIGZ1bmN0aW9uIChldnQpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIHNpemU6IHsgbmF0dXJhbFdpZHRoOiAwLCBuYXR1cmFsSGVpZ2h0OiAwIH1cbiAgICB9XG4gICAgZGlzcGF0Y2hFdmVudChpdGVtLCBjcmVhdGVFdmVudChpdGVtLCAnbG9hZCcsIHBhcmFtcykpXG4gICAgaWYgKHBsYWNlaG9sZGVyU3JjKSB7XG4gICAgICBwcmVMb2FkSW1nKHBsYWNlaG9sZGVyU3JjLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0ZW0uc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYHVybCgke3BsYWNlaG9sZGVyU3JjIHx8ICcnfSlgXG4gICAgICB9KVxuICAgIH1cbiAgICBmaW5hbGxDYigpXG4gIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXJlTGF6eWxvYWQgKGVsOiBBcnJheTxhbnk+IHwgYW55IHwgbnVsbCwgaWdub3JlVmlzaWJpbGl0eTogP2Jvb2xlYW4pOiB2b2lkIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZWwpKSB7XG4gICAgcmV0dXJuIGVsLmZvckVhY2goY3QgPT4gZmlyZUxhenlsb2FkKGN0KSlcbiAgfVxuICBlbCA9IGVsIHx8IGRvY3VtZW50LmJvZHlcbiAgaWYgKCFlbCkgeyByZXR1cm4gfVxuICBsZXQgaW1nczogTm9kZUxpc3QgfCBBcnJheTxhbnk+ID0gKGVsIHx8IGRvY3VtZW50LmJvZHkpLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpbWctc3JjXScpXG4gIGlmIChlbC5nZXRBdHRyaWJ1dGUoJ2ltZy1zcmMnKSkgeyBpbWdzID0gW2VsXSB9XG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBpbWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaW1nID0gaW1nc1tpXVxuICAgIGlmICh0eXBlb2YgaWdub3JlVmlzaWJpbGl0eSA9PT0gJ2Jvb2xlYW4nICYmIGlnbm9yZVZpc2liaWxpdHkpIHtcbiAgICAgIGFwcGx5U3JjKGltZywgaW1nLmdldEF0dHJpYnV0ZSgnaW1nLXNyYycpLCBpbWcuZ2V0QXR0cmlidXRlKCdpbWctcGxhY2Vob2xkZXInKSlcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNFbGVtZW50VmlzaWJsZShpbWcsIGVsKVswXSkge1xuICAgICAgYXBwbHlTcmMoaW1nLCBpbWcuZ2V0QXR0cmlidXRlKCdpbWctc3JjJyksIGltZy5nZXRBdHRyaWJ1dGUoJ2ltZy1wbGFjZWhvbGRlcicpKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIGNhY2hlIGEgdGhyb3R0bGUgbGF6eWxvYWQgZnVuY3Rpb24gZm9yIGV2ZXJ5IGNvbnRhaW5lciBlbGVtZW50XG4gKiBvbmNlIGZvciBkaWZmZXJlbnQgd2FpdCB0aW1lcyBzZXBhcmF0ZS5cbiAqICAgdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGlzIGNhY2hlOlxuICogICAgICBjYWNoZToge1xuICogICAgICAgIGVsLmlkOiB7XG4gKiAgICAgICAgICB3YWl0OiB0aHJvdHRsZWRGdW5jdGlvbiAoKSB7IC4uLiB9XG4gKiAgICAgICAgfVxuICogICAgICB9XG4gKi9cbmNvbnN0IGNhY2hlID0ge31cbmxldCBfdWlkOiBudW1iZXIgPSAxXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGhyb3R0bGVMYXp5bG9hZCAod2FpdDogbnVtYmVyID0gMTYsIGVsOiBhbnkgfCBudWxsID0gZG9jdW1lbnQuYm9keSkge1xuICBsZXQgaWQ6IG51bWJlciA9ICsoZWwgJiYgZWwuZGF0YXNldC50aHJvdHRsZUlkKVxuICBpZiAoaXNOYU4oaWQpIHx8IGlkIDw9IDApIHtcbiAgICBpZCA9IF91aWQrK1xuICAgIGVsICYmIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS10aHJvdHRsZS1pZCcsIGlkICsgJycpXG4gIH1cblxuICAhY2FjaGVbaWRdICYmIChjYWNoZVtpZF0gPSB7fSlcbiAgY29uc3QgdGhyb3R0bGVkID0gY2FjaGVbaWRdW3dhaXRdIHx8XG4gICAgKGNhY2hlW2lkXVt3YWl0XSA9IHRocm90dGxlKFxuICAgICAgZmlyZUxhenlsb2FkLmJpbmQodGhpcywgZWwpLFxuICAgICAgcGFyc2VGbG9hdCh3YWl0KSxcbiAgICAgIC8vIHRydWUgZm9yIGNhbGxMYXN0VGltZS5cbiAgICAgIC8vIHRvIHRyaWdnZXIgb25jZSBtb3JlIHRpbWUgYWZ0ZXIgdGhlIGxhc3QgdGhyb3R0bGVkIGZ1bmN0aW9uIGNhbGxlZCB3aXRoIGEgbGl0dGxlIG1vcmUgZGVsYXkuXG4gICAgICB0cnVlKVxuICAgIClcbiAgcmV0dXJuIHRocm90dGxlZFxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBjYXBpdGFsaXplU3RyaW5nO1xuZnVuY3Rpb24gY2FwaXRhbGl6ZVN0cmluZyhzdHIpIHtcbiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gcHJlZml4UHJvcGVydHk7XG5cbnZhciBfY2FwaXRhbGl6ZVN0cmluZyA9IHJlcXVpcmUoJy4vY2FwaXRhbGl6ZVN0cmluZycpO1xuXG52YXIgX2NhcGl0YWxpemVTdHJpbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2FwaXRhbGl6ZVN0cmluZyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIHByZWZpeFByb3BlcnR5KHByZWZpeFByb3BlcnRpZXMsIHByb3BlcnR5LCBzdHlsZSkge1xuICBpZiAocHJlZml4UHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcbiAgICB2YXIgcmVxdWlyZWRQcmVmaXhlcyA9IHByZWZpeFByb3BlcnRpZXNbcHJvcGVydHldO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSByZXF1aXJlZFByZWZpeGVzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICBzdHlsZVtyZXF1aXJlZFByZWZpeGVzW2ldICsgKDAsIF9jYXBpdGFsaXplU3RyaW5nMi5kZWZhdWx0KShwcm9wZXJ0eSldID0gc3R5bGVbcHJvcGVydHldO1xuICAgIH1cbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBwcmVmaXhWYWx1ZTtcbmZ1bmN0aW9uIHByZWZpeFZhbHVlKHBsdWdpbnMsIHByb3BlcnR5LCB2YWx1ZSwgc3R5bGUsIG1ldGFEYXRhKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwbHVnaW5zLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgdmFyIHByb2Nlc3NlZFZhbHVlID0gcGx1Z2luc1tpXShwcm9wZXJ0eSwgdmFsdWUsIHN0eWxlLCBtZXRhRGF0YVxuXG4gICAgLy8gd2UgY2FuIHN0b3AgcHJvY2Vzc2luZyBpZiBhIHZhbHVlIGlzIHJldHVybmVkXG4gICAgLy8gYXMgYWxsIHBsdWdpbiBjcml0ZXJpYSBhcmUgdW5pcXVlXG4gICAgKTtpZiAocHJvY2Vzc2VkVmFsdWUpIHtcbiAgICAgIHJldHVybiBwcm9jZXNzZWRWYWx1ZTtcbiAgICB9XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBhZGROZXdWYWx1ZXNPbmx5O1xuZnVuY3Rpb24gYWRkSWZOZXcobGlzdCwgdmFsdWUpIHtcbiAgaWYgKGxpc3QuaW5kZXhPZih2YWx1ZSkgPT09IC0xKSB7XG4gICAgbGlzdC5wdXNoKHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGROZXdWYWx1ZXNPbmx5KGxpc3QsIHZhbHVlcykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHZhbHVlcy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgYWRkSWZOZXcobGlzdCwgdmFsdWVzW2ldKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYWRkSWZOZXcobGlzdCwgdmFsdWVzKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGlzT2JqZWN0O1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gY3JlYXRlUHJlZml4ZXI7XG5cbnZhciBfcHJlZml4UHJvcGVydHkgPSByZXF1aXJlKCcuLi91dGlscy9wcmVmaXhQcm9wZXJ0eScpO1xuXG52YXIgX3ByZWZpeFByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3ByZWZpeFByb3BlcnR5KTtcblxudmFyIF9wcmVmaXhWYWx1ZSA9IHJlcXVpcmUoJy4uL3V0aWxzL3ByZWZpeFZhbHVlJyk7XG5cbnZhciBfcHJlZml4VmFsdWUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJlZml4VmFsdWUpO1xuXG52YXIgX2FkZE5ld1ZhbHVlc09ubHkgPSByZXF1aXJlKCcuLi91dGlscy9hZGROZXdWYWx1ZXNPbmx5Jyk7XG5cbnZhciBfYWRkTmV3VmFsdWVzT25seTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hZGROZXdWYWx1ZXNPbmx5KTtcblxudmFyIF9pc09iamVjdCA9IHJlcXVpcmUoJy4uL3V0aWxzL2lzT2JqZWN0Jyk7XG5cbnZhciBfaXNPYmplY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNPYmplY3QpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBjcmVhdGVQcmVmaXhlcihfcmVmKSB7XG4gIHZhciBwcmVmaXhNYXAgPSBfcmVmLnByZWZpeE1hcCxcbiAgICAgIHBsdWdpbnMgPSBfcmVmLnBsdWdpbnM7XG5cbiAgZnVuY3Rpb24gcHJlZml4QWxsKHN0eWxlKSB7XG4gICAgZm9yICh2YXIgcHJvcGVydHkgaW4gc3R5bGUpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHN0eWxlW3Byb3BlcnR5XTtcblxuICAgICAgLy8gaGFuZGxlIG5lc3RlZCBvYmplY3RzXG4gICAgICBpZiAoKDAsIF9pc09iamVjdDIuZGVmYXVsdCkodmFsdWUpKSB7XG4gICAgICAgIHN0eWxlW3Byb3BlcnR5XSA9IHByZWZpeEFsbCh2YWx1ZVxuICAgICAgICAvLyBoYW5kbGUgYXJyYXkgdmFsdWVzXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhciBjb21iaW5lZFZhbHVlID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHZhbHVlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgdmFyIHByb2Nlc3NlZFZhbHVlID0gKDAsIF9wcmVmaXhWYWx1ZTIuZGVmYXVsdCkocGx1Z2lucywgcHJvcGVydHksIHZhbHVlW2ldLCBzdHlsZSwgcHJlZml4TWFwKTtcbiAgICAgICAgICAoMCwgX2FkZE5ld1ZhbHVlc09ubHkyLmRlZmF1bHQpKGNvbWJpbmVkVmFsdWUsIHByb2Nlc3NlZFZhbHVlIHx8IHZhbHVlW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG9ubHkgbW9kaWZ5IHRoZSB2YWx1ZSBpZiBpdCB3YXMgdG91Y2hlZFxuICAgICAgICAvLyBieSBhbnkgcGx1Z2luIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgbXV0YXRpb25zXG4gICAgICAgIGlmIChjb21iaW5lZFZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzdHlsZVtwcm9wZXJ0eV0gPSBjb21iaW5lZFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgX3Byb2Nlc3NlZFZhbHVlID0gKDAsIF9wcmVmaXhWYWx1ZTIuZGVmYXVsdCkocGx1Z2lucywgcHJvcGVydHksIHZhbHVlLCBzdHlsZSwgcHJlZml4TWFwXG5cbiAgICAgICAgLy8gb25seSBtb2RpZnkgdGhlIHZhbHVlIGlmIGl0IHdhcyB0b3VjaGVkXG4gICAgICAgIC8vIGJ5IGFueSBwbHVnaW4gdG8gcHJldmVudCB1bm5lY2Vzc2FyeSBtdXRhdGlvbnNcbiAgICAgICAgKTtpZiAoX3Byb2Nlc3NlZFZhbHVlKSB7XG4gICAgICAgICAgc3R5bGVbcHJvcGVydHldID0gX3Byb2Nlc3NlZFZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgKDAsIF9wcmVmaXhQcm9wZXJ0eTIuZGVmYXVsdCkocHJlZml4TWFwLCBwcm9wZXJ0eSwgc3R5bGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdHlsZTtcbiAgfVxuXG4gIHJldHVybiBwcmVmaXhBbGw7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIHcgPSBbXCJXZWJraXRcIl07XG52YXIgbSA9IFtcIk1velwiXTtcbnZhciBtcyA9IFtcIm1zXCJdO1xudmFyIHdtID0gW1wiV2Via2l0XCIsIFwiTW96XCJdO1xudmFyIHdtcyA9IFtcIldlYmtpdFwiLCBcIm1zXCJdO1xudmFyIHdtbXMgPSBbXCJXZWJraXRcIiwgXCJNb3pcIiwgXCJtc1wiXTtcblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICBwbHVnaW5zOiBbXSxcbiAgcHJlZml4TWFwOiB7IFwiYXBwZWFyYW5jZVwiOiB3bSwgXCJ1c2VyU2VsZWN0XCI6IHdtbXMsIFwidGV4dEVtcGhhc2lzUG9zaXRpb25cIjogdywgXCJ0ZXh0RW1waGFzaXNcIjogdywgXCJ0ZXh0RW1waGFzaXNTdHlsZVwiOiB3LCBcInRleHRFbXBoYXNpc0NvbG9yXCI6IHcsIFwiYm94RGVjb3JhdGlvbkJyZWFrXCI6IHcsIFwiY2xpcFBhdGhcIjogdywgXCJtYXNrSW1hZ2VcIjogdywgXCJtYXNrTW9kZVwiOiB3LCBcIm1hc2tSZXBlYXRcIjogdywgXCJtYXNrUG9zaXRpb25cIjogdywgXCJtYXNrQ2xpcFwiOiB3LCBcIm1hc2tPcmlnaW5cIjogdywgXCJtYXNrU2l6ZVwiOiB3LCBcIm1hc2tDb21wb3NpdGVcIjogdywgXCJtYXNrXCI6IHcsIFwibWFza0JvcmRlclNvdXJjZVwiOiB3LCBcIm1hc2tCb3JkZXJNb2RlXCI6IHcsIFwibWFza0JvcmRlclNsaWNlXCI6IHcsIFwibWFza0JvcmRlcldpZHRoXCI6IHcsIFwibWFza0JvcmRlck91dHNldFwiOiB3LCBcIm1hc2tCb3JkZXJSZXBlYXRcIjogdywgXCJtYXNrQm9yZGVyXCI6IHcsIFwibWFza1R5cGVcIjogdywgXCJ0ZXh0RGVjb3JhdGlvblN0eWxlXCI6IHcsIFwidGV4dERlY29yYXRpb25Ta2lwXCI6IHcsIFwidGV4dERlY29yYXRpb25MaW5lXCI6IHcsIFwidGV4dERlY29yYXRpb25Db2xvclwiOiB3LCBcImZpbHRlclwiOiB3LCBcImZvbnRGZWF0dXJlU2V0dGluZ3NcIjogdywgXCJicmVha0FmdGVyXCI6IHdtbXMsIFwiYnJlYWtCZWZvcmVcIjogd21tcywgXCJicmVha0luc2lkZVwiOiB3bW1zLCBcImNvbHVtbkNvdW50XCI6IHdtLCBcImNvbHVtbkZpbGxcIjogd20sIFwiY29sdW1uR2FwXCI6IHdtLCBcImNvbHVtblJ1bGVcIjogd20sIFwiY29sdW1uUnVsZUNvbG9yXCI6IHdtLCBcImNvbHVtblJ1bGVTdHlsZVwiOiB3bSwgXCJjb2x1bW5SdWxlV2lkdGhcIjogd20sIFwiY29sdW1uc1wiOiB3bSwgXCJjb2x1bW5TcGFuXCI6IHdtLCBcImNvbHVtbldpZHRoXCI6IHdtLCBcImZsZXhcIjogdywgXCJmbGV4QmFzaXNcIjogdywgXCJmbGV4RGlyZWN0aW9uXCI6IHcsIFwiZmxleEdyb3dcIjogdywgXCJmbGV4Rmxvd1wiOiB3LCBcImZsZXhTaHJpbmtcIjogdywgXCJmbGV4V3JhcFwiOiB3LCBcImFsaWduQ29udGVudFwiOiB3LCBcImFsaWduSXRlbXNcIjogdywgXCJhbGlnblNlbGZcIjogdywgXCJqdXN0aWZ5Q29udGVudFwiOiB3LCBcIm9yZGVyXCI6IHcsIFwidHJhbnNmb3JtXCI6IHcsIFwidHJhbnNmb3JtT3JpZ2luXCI6IHcsIFwidHJhbnNmb3JtT3JpZ2luWFwiOiB3LCBcInRyYW5zZm9ybU9yaWdpbllcIjogdywgXCJiYWNrZmFjZVZpc2liaWxpdHlcIjogdywgXCJwZXJzcGVjdGl2ZVwiOiB3LCBcInBlcnNwZWN0aXZlT3JpZ2luXCI6IHcsIFwidHJhbnNmb3JtU3R5bGVcIjogdywgXCJ0cmFuc2Zvcm1PcmlnaW5aXCI6IHcsIFwiYW5pbWF0aW9uXCI6IHcsIFwiYW5pbWF0aW9uRGVsYXlcIjogdywgXCJhbmltYXRpb25EaXJlY3Rpb25cIjogdywgXCJhbmltYXRpb25GaWxsTW9kZVwiOiB3LCBcImFuaW1hdGlvbkR1cmF0aW9uXCI6IHcsIFwiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnRcIjogdywgXCJhbmltYXRpb25OYW1lXCI6IHcsIFwiYW5pbWF0aW9uUGxheVN0YXRlXCI6IHcsIFwiYW5pbWF0aW9uVGltaW5nRnVuY3Rpb25cIjogdywgXCJiYWNrZHJvcEZpbHRlclwiOiB3LCBcImZvbnRLZXJuaW5nXCI6IHcsIFwic2Nyb2xsU25hcFR5cGVcIjogd21zLCBcInNjcm9sbFNuYXBQb2ludHNYXCI6IHdtcywgXCJzY3JvbGxTbmFwUG9pbnRzWVwiOiB3bXMsIFwic2Nyb2xsU25hcERlc3RpbmF0aW9uXCI6IHdtcywgXCJzY3JvbGxTbmFwQ29vcmRpbmF0ZVwiOiB3bXMsIFwic2hhcGVJbWFnZVRocmVzaG9sZFwiOiB3LCBcInNoYXBlSW1hZ2VNYXJnaW5cIjogdywgXCJzaGFwZUltYWdlT3V0c2lkZVwiOiB3LCBcImh5cGhlbnNcIjogd21tcywgXCJmbG93SW50b1wiOiB3bXMsIFwiZmxvd0Zyb21cIjogd21zLCBcInJlZ2lvbkZyYWdtZW50XCI6IHdtcywgXCJ0ZXh0QWxpZ25MYXN0XCI6IG0sIFwidGFiU2l6ZVwiOiBtLCBcIndyYXBGbG93XCI6IG1zLCBcIndyYXBUaHJvdWdoXCI6IG1zLCBcIndyYXBNYXJnaW5cIjogbXMsIFwiZ3JpZFRlbXBsYXRlQ29sdW1uc1wiOiBtcywgXCJncmlkVGVtcGxhdGVSb3dzXCI6IG1zLCBcImdyaWRUZW1wbGF0ZUFyZWFzXCI6IG1zLCBcImdyaWRUZW1wbGF0ZVwiOiBtcywgXCJncmlkQXV0b0NvbHVtbnNcIjogbXMsIFwiZ3JpZEF1dG9Sb3dzXCI6IG1zLCBcImdyaWRBdXRvRmxvd1wiOiBtcywgXCJncmlkXCI6IG1zLCBcImdyaWRSb3dTdGFydFwiOiBtcywgXCJncmlkQ29sdW1uU3RhcnRcIjogbXMsIFwiZ3JpZFJvd0VuZFwiOiBtcywgXCJncmlkUm93XCI6IG1zLCBcImdyaWRDb2x1bW5cIjogbXMsIFwiZ3JpZENvbHVtbkVuZFwiOiBtcywgXCJncmlkQ29sdW1uR2FwXCI6IG1zLCBcImdyaWRSb3dHYXBcIjogbXMsIFwiZ3JpZEFyZWFcIjogbXMsIFwiZ3JpZEdhcFwiOiBtcywgXCJ0ZXh0U2l6ZUFkanVzdFwiOiB3bXMsIFwiYm9yZGVySW1hZ2VcIjogdywgXCJib3JkZXJJbWFnZU91dHNldFwiOiB3LCBcImJvcmRlckltYWdlUmVwZWF0XCI6IHcsIFwiYm9yZGVySW1hZ2VTbGljZVwiOiB3LCBcImJvcmRlckltYWdlU291cmNlXCI6IHcsIFwiYm9yZGVySW1hZ2VXaWR0aFwiOiB3LCBcInRyYW5zaXRpb25EZWxheVwiOiB3LCBcInRyYW5zaXRpb25EdXJhdGlvblwiOiB3LCBcInRyYW5zaXRpb25Qcm9wZXJ0eVwiOiB3LCBcInRyYW5zaXRpb25UaW1pbmdGdW5jdGlvblwiOiB3IH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGN1cnNvcjtcbnZhciBwcmVmaXhlcyA9IFsnLXdlYmtpdC0nLCAnLW1vei0nLCAnJ107XG5cbnZhciB2YWx1ZXMgPSB7XG4gICd6b29tLWluJzogdHJ1ZSxcbiAgJ3pvb20tb3V0JzogdHJ1ZSxcbiAgZ3JhYjogdHJ1ZSxcbiAgZ3JhYmJpbmc6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGN1cnNvcihwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgaWYgKHByb3BlcnR5ID09PSAnY3Vyc29yJyAmJiB2YWx1ZXMuaGFzT3duUHJvcGVydHkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHByZWZpeGVzLm1hcChmdW5jdGlvbiAocHJlZml4KSB7XG4gICAgICByZXR1cm4gcHJlZml4ICsgdmFsdWU7XG4gICAgfSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGlzUHJlZml4ZWRWYWx1ZTtcblxudmFyIHJlZ2V4ID0gLy13ZWJraXQtfC1tb3otfC1tcy0vO1xuXG5mdW5jdGlvbiBpc1ByZWZpeGVkVmFsdWUodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgcmVnZXgudGVzdCh2YWx1ZSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBjcm9zc0ZhZGU7XG5cbnZhciBfaXNQcmVmaXhlZFZhbHVlID0gcmVxdWlyZSgnY3NzLWluLWpzLXV0aWxzL2xpYi9pc1ByZWZpeGVkVmFsdWUnKTtcblxudmFyIF9pc1ByZWZpeGVkVmFsdWUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNQcmVmaXhlZFZhbHVlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLy8gaHR0cDovL2Nhbml1c2UuY29tLyNzZWFyY2g9Y3Jvc3MtZmFkZVxudmFyIHByZWZpeGVzID0gWyctd2Via2l0LScsICcnXTtcbmZ1bmN0aW9uIGNyb3NzRmFkZShwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgISgwLCBfaXNQcmVmaXhlZFZhbHVlMi5kZWZhdWx0KSh2YWx1ZSkgJiYgdmFsdWUuaW5kZXhPZignY3Jvc3MtZmFkZSgnKSA+IC0xKSB7XG4gICAgcmV0dXJuIHByZWZpeGVzLm1hcChmdW5jdGlvbiAocHJlZml4KSB7XG4gICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvY3Jvc3MtZmFkZVxcKC9nLCBwcmVmaXggKyAnY3Jvc3MtZmFkZSgnKTtcbiAgICB9KTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZmlsdGVyO1xuXG52YXIgX2lzUHJlZml4ZWRWYWx1ZSA9IHJlcXVpcmUoJ2Nzcy1pbi1qcy11dGlscy9saWIvaXNQcmVmaXhlZFZhbHVlJyk7XG5cbnZhciBfaXNQcmVmaXhlZFZhbHVlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2lzUHJlZml4ZWRWYWx1ZSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8vIGh0dHA6Ly9jYW5pdXNlLmNvbS8jZmVhdD1jc3MtZmlsdGVyLWZ1bmN0aW9uXG52YXIgcHJlZml4ZXMgPSBbJy13ZWJraXQtJywgJyddO1xuZnVuY3Rpb24gZmlsdGVyKHByb3BlcnR5LCB2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhKDAsIF9pc1ByZWZpeGVkVmFsdWUyLmRlZmF1bHQpKHZhbHVlKSAmJiB2YWx1ZS5pbmRleE9mKCdmaWx0ZXIoJykgPiAtMSkge1xuICAgIHJldHVybiBwcmVmaXhlcy5tYXAoZnVuY3Rpb24gKHByZWZpeCkge1xuICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL2ZpbHRlclxcKC9nLCBwcmVmaXggKyAnZmlsdGVyKCcpO1xuICAgIH0pO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBmbGV4O1xudmFyIHZhbHVlcyA9IHtcbiAgZmxleDogWyctd2Via2l0LWJveCcsICctbW96LWJveCcsICctbXMtZmxleGJveCcsICctd2Via2l0LWZsZXgnLCAnZmxleCddLFxuICAnaW5saW5lLWZsZXgnOiBbJy13ZWJraXQtaW5saW5lLWJveCcsICctbW96LWlubGluZS1ib3gnLCAnLW1zLWlubGluZS1mbGV4Ym94JywgJy13ZWJraXQtaW5saW5lLWZsZXgnLCAnaW5saW5lLWZsZXgnXVxufTtcblxuZnVuY3Rpb24gZmxleChwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgaWYgKHByb3BlcnR5ID09PSAnZGlzcGxheScgJiYgdmFsdWVzLmhhc093blByb3BlcnR5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZXNbdmFsdWVdO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBmbGV4Ym94T2xkO1xudmFyIGFsdGVybmF0aXZlVmFsdWVzID0ge1xuICAnc3BhY2UtYXJvdW5kJzogJ2p1c3RpZnknLFxuICAnc3BhY2UtYmV0d2Vlbic6ICdqdXN0aWZ5JyxcbiAgJ2ZsZXgtc3RhcnQnOiAnc3RhcnQnLFxuICAnZmxleC1lbmQnOiAnZW5kJyxcbiAgJ3dyYXAtcmV2ZXJzZSc6ICdtdWx0aXBsZScsXG4gIHdyYXA6ICdtdWx0aXBsZSdcbn07XG5cbnZhciBhbHRlcm5hdGl2ZVByb3BzID0ge1xuICBhbGlnbkl0ZW1zOiAnV2Via2l0Qm94QWxpZ24nLFxuICBqdXN0aWZ5Q29udGVudDogJ1dlYmtpdEJveFBhY2snLFxuICBmbGV4V3JhcDogJ1dlYmtpdEJveExpbmVzJ1xufTtcblxuZnVuY3Rpb24gZmxleGJveE9sZChwcm9wZXJ0eSwgdmFsdWUsIHN0eWxlKSB7XG4gIGlmIChwcm9wZXJ0eSA9PT0gJ2ZsZXhEaXJlY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodmFsdWUuaW5kZXhPZignY29sdW1uJykgPiAtMSkge1xuICAgICAgc3R5bGUuV2Via2l0Qm94T3JpZW50ID0gJ3ZlcnRpY2FsJztcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGUuV2Via2l0Qm94T3JpZW50ID0gJ2hvcml6b250YWwnO1xuICAgIH1cbiAgICBpZiAodmFsdWUuaW5kZXhPZigncmV2ZXJzZScpID4gLTEpIHtcbiAgICAgIHN0eWxlLldlYmtpdEJveERpcmVjdGlvbiA9ICdyZXZlcnNlJztcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGUuV2Via2l0Qm94RGlyZWN0aW9uID0gJ25vcm1hbCc7XG4gICAgfVxuICB9XG4gIGlmIChhbHRlcm5hdGl2ZVByb3BzLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xuICAgIHN0eWxlW2FsdGVybmF0aXZlUHJvcHNbcHJvcGVydHldXSA9IGFsdGVybmF0aXZlVmFsdWVzW3ZhbHVlXSB8fCB2YWx1ZTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiLyogQGZsb3cgKi9cbmltcG9ydCBpc1ByZWZpeGVkVmFsdWUgZnJvbSAnY3NzLWluLWpzLXV0aWxzL2xpYi9pc1ByZWZpeGVkVmFsdWUnXG5cbmNvbnN0IGlzRGlyZWN0aW9uID0gL3RvcHxsZWZ0fHJpZ2h0fGJvdHRvbS9naVxuXG5jb25zdCBuYW1lcyA9IFtcbiAgJ2xpbmVhci1ncmFkaWVudCcsXG4gICdyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50JyxcbiAgJ3JhZGlhbC1ncmFkaWVudCcsXG4gICdyZXBlYXRpbmctcmFkaWFsLWdyYWRpZW50J1xuXVxuXG4vLyBkaXJlY3Rpb24gdG8gcmVwbGFjZVxuY29uc3QgZGlyZWN0aW9ucyA9IHtcbiAgdG9wOiAnYm90dG9tJyxcbiAgbGVmdDogJ3JpZ2h0JyxcbiAgYm90dG9tOiAndG9wJyxcbiAgcmlnaHQ6ICdsZWZ0J1xufVxuXG5jb25zdCBwcmVmaXhlcyA9IFsnLXdlYmtpdC0nLCAnLW1vei0nXVxuY29uc3QgdmFsdWVzID0gL2xpbmVhci1ncmFkaWVudHxyYWRpYWwtZ3JhZGllbnR8cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudHxyZXBlYXRpbmctcmFkaWFsLWdyYWRpZW50L1xuXG4vKipcbiAqIGNvdmVydCB2YWxTdHIgaW50byBkZWcgdGhyb3VnaCBmdWxsIGFuZ2xlLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVBbmdsZVVuaXQodmFsU3RyOiBzdHJpbmcsIGZ1bGw6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IHZhbCA9IHBhcnNlRmxvYXQodmFsU3RyKVxuICByZXR1cm4gdmFsIC8gZnVsbCAqIDM2MFxufVxuXG5mdW5jdGlvbiB3cmFwUmFuZ2UobWluOiBudW1iZXIsIG1heDogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XG4gIHZhciBtYXhMZXNzTWluID0gbWF4IC0gbWluO1xuICByZXR1cm4gKCh2YWx1ZSAtIG1pbikgJSBtYXhMZXNzTWluICsgbWF4TGVzc01pbikgJSBtYXhMZXNzTWluICsgbWluO1xufVxuXG4vKipcbiAqIG5vcm1hbGl6ZSBhbmdsZSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG4gIHJldHVybiB2YWx1ZVxuICAgIC50cmltKClcbiAgICAucmVwbGFjZSgvXihbKy1dP1xcZCsoPzouXFxkKyk/KWdyYWQvLCBmdW5jdGlvbiAoJDAsICQxKSB7XG4gICAgICByZXR1cm4gYCR7bm9ybWFsaXplQW5nbGVVbml0KCQxLCA0MDApfWRlZ2BcbiAgICB9KVxuICAgIC5yZXBsYWNlKC9eKFsrLV0/XFxkKyg/Oi5cXGQrKT8pcmFkLywgZnVuY3Rpb24gKCQwLCAkMSkge1xuICAgICAgcmV0dXJuIGAke25vcm1hbGl6ZUFuZ2xlVW5pdCgkMSwgMiAqIE1hdGguUEkpfWRlZ2BcbiAgICB9KVxuICAgIC5yZXBsYWNlKC9eKFsrLV0/XFxkKyg/Oi5cXGQrKT8pdHVybi8sIGZ1bmN0aW9uICgkMCwgJDEpIHtcbiAgICAgIHJldHVybiBgJHtub3JtYWxpemVBbmdsZVVuaXQoJDEsIDEpfWRlZ2BcbiAgICB9KVxuICAgIC5yZXBsYWNlKC9eKFsrLV0/XFxkKyg/Oi5cXGQrKT8pZGVnLywgZnVuY3Rpb24gKCQwLCAkMSkge1xuICAgICAgbGV0IHZhbCA9IGAke3dyYXBSYW5nZSgwLCAzNjAsIHBhcnNlRmxvYXQoJDEpKX1kZWdgXG4gICAgICBzd2l0Y2ggKHZhbCkge1xuICAgICAgICBjYXNlICcwZGVnJzpcbiAgICAgICAgICB2YWwgPSAndG8gdG9wJ1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJzkwZGVnJzpcbiAgICAgICAgICB2YWwgPSAndG8gcmlnaHQnXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnMTgwZGVnJzpcbiAgICAgICAgICB2YWwgPSAndG8gYm90dG9tJ1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJzI3MGRlZyc6XG4gICAgICAgICAgdmFsID0gJ3RvIGxlZnQnXG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxcbiAgICB9KVxufVxuXG4vKipcbiAqIGNvbnZlcnQgZGlyZWN0aW9ucyB0byBvbGQgdmVyc2lvbi5cbiAqL1xuZnVuY3Rpb24gY29udmVydERpcmVjdGlvbiAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZVxuICAgIC5yZXBsYWNlKC9edG9cXHModG9wfGxlZnR8Ym90dG9tfHJpZ2h0KSg/OlxccysodG9wfGxlZnR8Ym90dG9tfHJpZ2h0KSk/LywgZnVuY3Rpb24gKCQwLCAkMSwgJDIpIHtcbiAgICAgIGNvbnN0IGRpcjIgPSAkMiAmJiBgICR7ZGlyZWN0aW9uc1skMl19YCB8fCAnJ1xuICAgICAgcmV0dXJuIGAke2RpcmVjdGlvbnNbJDFdfSR7ZGlyMn1gXG4gICAgfSlcbiAgICAucmVwbGFjZSgvXihbKy1dP1xcZCsoPzouXFxkKyk/KWRlZy8sIGZ1bmN0aW9uICgkMCwgJDEpIHtcbiAgICAgIGxldCB2YWwgPSBNYXRoLmFicyg0NTAgLSBwYXJzZUZsb2F0KCQxKSkgJSAzNjBcbiAgICAgIHZhbCA9IHBhcnNlRmxvYXQodmFsLnRvRml4ZWQoMykpXG4gICAgICByZXR1cm4gYCR7dmFsfWRlZ2BcbiAgICB9KVxufVxuXG4vKipcbiAqIGZpeCByYWRpYWwgZGlyZWN0aW9uIHN5bnRheC5cbiAqIGUuZy5cbiAqICBmYXJ0aGVzdC1zaWRlIGF0IDAgNTAlLCB3aGl0ZSwgYmxhY2tcbiAqICAgLT4gMCA1MCUsIGZhcnRoZXN0LXNpZGUsIHdoaXRlLCBibGFja1xuICovXG5mdW5jdGlvbiBmaXhSYWRpYWwgKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXihcXFMrKVxcc2F0XFxzKFteLF0rKS8sIGZ1bmN0aW9uICgkMCwgJDEsICQyKSB7XG4gICAgcmV0dXJuIGAkeyQyfSwgJHskMX1gXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVZhbHVlICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgdmFsdWUgPSBub3JtYWxpemUodmFsdWUpXG4gIHZhbHVlID0gY29udmVydERpcmVjdGlvbih2YWx1ZSlcbiAgdmFsdWUgPSBmaXhSYWRpYWwodmFsdWUpXG4gIHJldHVybiB2YWx1ZVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBncmFkaWVudChwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogYW55KTogP0FycmF5PHN0cmluZz4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhaXNQcmVmaXhlZFZhbHVlKHZhbHVlKSAmJiB2YWx1ZXMudGVzdCh2YWx1ZSkpIHtcbiAgICBjb25zdCBpbnNlcnRQcmVmaXhGbGFnID0gJ0BAQCdcbiAgICBjb25zdCByZWcgPSBuZXcgUmVnRXhwKFxuICAgICAgYCgke3ZhbHVlcy50b1N0cmluZygpLnN1YnN0cigxKS5yZXBsYWNlKC9cXC8kLywgJycpfSlcXFxcXFwoKFteKV0rKVxcXFxcXClgLFxuICAgICAgJ2cnXG4gICAgKVxuICAgIGNvbnN0IG5ld1ZhbHVlID0gdmFsdWUucmVwbGFjZShcbiAgICAgIHJlZyxcbiAgICAgIGZ1bmN0aW9uICgkMCwgJDEsICQyKSB7XG4gICAgICAgIHJldHVybiBgJHtpbnNlcnRQcmVmaXhGbGFnfSR7JDF9KCR7dHJhbnNmb3JtVmFsdWUoJDIpfSlgXG4gICAgICB9KVxuICAgIGNvbnN0IHJlc3VsdHMgPSBwcmVmaXhlcy5tYXAocHJlZml4ID0+IG5ld1ZhbHVlLnJlcGxhY2UoXG4gICAgICAgIG5ldyBSZWdFeHAoaW5zZXJ0UHJlZml4RmxhZywgJ2cnKSxcbiAgICAgICAgcHJlZml4XG4gICAgICApKVxuICAgIHJlc3VsdHMucHVzaCh2YWx1ZSlcbiAgICByZXR1cm4gcmVzdWx0c1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBpbWFnZVNldDtcblxudmFyIF9pc1ByZWZpeGVkVmFsdWUgPSByZXF1aXJlKCdjc3MtaW4tanMtdXRpbHMvbGliL2lzUHJlZml4ZWRWYWx1ZScpO1xuXG52YXIgX2lzUHJlZml4ZWRWYWx1ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pc1ByZWZpeGVkVmFsdWUpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vLyBodHRwOi8vY2FuaXVzZS5jb20vI2ZlYXQ9Y3NzLWltYWdlLXNldFxudmFyIHByZWZpeGVzID0gWyctd2Via2l0LScsICcnXTtcbmZ1bmN0aW9uIGltYWdlU2V0KHByb3BlcnR5LCB2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhKDAsIF9pc1ByZWZpeGVkVmFsdWUyLmRlZmF1bHQpKHZhbHVlKSAmJiB2YWx1ZS5pbmRleE9mKCdpbWFnZS1zZXQoJykgPiAtMSkge1xuICAgIHJldHVybiBwcmVmaXhlcy5tYXAoZnVuY3Rpb24gKHByZWZpeCkge1xuICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL2ltYWdlLXNldFxcKC9nLCBwcmVmaXggKyAnaW1hZ2Utc2V0KCcpO1xuICAgIH0pO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBwb3NpdGlvbjtcbmZ1bmN0aW9uIHBvc2l0aW9uKHByb3BlcnR5LCB2YWx1ZSkge1xuICBpZiAocHJvcGVydHkgPT09ICdwb3NpdGlvbicgJiYgdmFsdWUgPT09ICdzdGlja3knKSB7XG4gICAgcmV0dXJuIFsnLXdlYmtpdC1zdGlja3knLCAnc3RpY2t5J107XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHNpemluZztcbnZhciBwcmVmaXhlcyA9IFsnLXdlYmtpdC0nLCAnLW1vei0nLCAnJ107XG5cbnZhciBwcm9wZXJ0aWVzID0ge1xuICBtYXhIZWlnaHQ6IHRydWUsXG4gIG1heFdpZHRoOiB0cnVlLFxuICB3aWR0aDogdHJ1ZSxcbiAgaGVpZ2h0OiB0cnVlLFxuICBjb2x1bW5XaWR0aDogdHJ1ZSxcbiAgbWluV2lkdGg6IHRydWUsXG4gIG1pbkhlaWdodDogdHJ1ZVxufTtcbnZhciB2YWx1ZXMgPSB7XG4gICdtaW4tY29udGVudCc6IHRydWUsXG4gICdtYXgtY29udGVudCc6IHRydWUsXG4gICdmaWxsLWF2YWlsYWJsZSc6IHRydWUsXG4gICdmaXQtY29udGVudCc6IHRydWUsXG4gICdjb250YWluLWZsb2F0cyc6IHRydWVcbn07XG5cbmZ1bmN0aW9uIHNpemluZyhwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJvcGVydHkpICYmIHZhbHVlcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gcHJlZml4ZXMubWFwKGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgICAgIHJldHVybiBwcmVmaXggKyB2YWx1ZTtcbiAgICB9KTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXBwZXJjYXNlUGF0dGVybiA9IC9bQS1aXS9nO1xudmFyIG1zUGF0dGVybiA9IC9ebXMtLztcbnZhciBjYWNoZSA9IHt9O1xuXG5mdW5jdGlvbiBoeXBoZW5hdGVTdHlsZU5hbWUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZyBpbiBjYWNoZVxuICAgID8gY2FjaGVbc3RyaW5nXVxuICAgIDogY2FjaGVbc3RyaW5nXSA9IHN0cmluZ1xuICAgICAgLnJlcGxhY2UodXBwZXJjYXNlUGF0dGVybiwgJy0kJicpXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UobXNQYXR0ZXJuLCAnLW1zLScpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGh5cGhlbmF0ZVN0eWxlTmFtZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGh5cGhlbmF0ZVByb3BlcnR5O1xuXG52YXIgX2h5cGhlbmF0ZVN0eWxlTmFtZSA9IHJlcXVpcmUoJ2h5cGhlbmF0ZS1zdHlsZS1uYW1lJyk7XG5cbnZhciBfaHlwaGVuYXRlU3R5bGVOYW1lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2h5cGhlbmF0ZVN0eWxlTmFtZSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIGh5cGhlbmF0ZVByb3BlcnR5KHByb3BlcnR5KSB7XG4gIHJldHVybiAoMCwgX2h5cGhlbmF0ZVN0eWxlTmFtZTIuZGVmYXVsdCkocHJvcGVydHkpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdHJhbnNpdGlvbjtcblxudmFyIF9oeXBoZW5hdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJ2Nzcy1pbi1qcy11dGlscy9saWIvaHlwaGVuYXRlUHJvcGVydHknKTtcblxudmFyIF9oeXBoZW5hdGVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oeXBoZW5hdGVQcm9wZXJ0eSk7XG5cbnZhciBfaXNQcmVmaXhlZFZhbHVlID0gcmVxdWlyZSgnY3NzLWluLWpzLXV0aWxzL2xpYi9pc1ByZWZpeGVkVmFsdWUnKTtcblxudmFyIF9pc1ByZWZpeGVkVmFsdWUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNQcmVmaXhlZFZhbHVlKTtcblxudmFyIF9jYXBpdGFsaXplU3RyaW5nID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvY2FwaXRhbGl6ZVN0cmluZycpO1xuXG52YXIgX2NhcGl0YWxpemVTdHJpbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2FwaXRhbGl6ZVN0cmluZyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBwcm9wZXJ0aWVzID0ge1xuICB0cmFuc2l0aW9uOiB0cnVlLFxuICB0cmFuc2l0aW9uUHJvcGVydHk6IHRydWUsXG4gIFdlYmtpdFRyYW5zaXRpb246IHRydWUsXG4gIFdlYmtpdFRyYW5zaXRpb25Qcm9wZXJ0eTogdHJ1ZSxcbiAgTW96VHJhbnNpdGlvbjogdHJ1ZSxcbiAgTW96VHJhbnNpdGlvblByb3BlcnR5OiB0cnVlXG59O1xuXG5cbnZhciBwcmVmaXhNYXBwaW5nID0ge1xuICBXZWJraXQ6ICctd2Via2l0LScsXG4gIE1vejogJy1tb3otJyxcbiAgbXM6ICctbXMtJ1xufTtcblxuZnVuY3Rpb24gcHJlZml4VmFsdWUodmFsdWUsIHByb3BlcnR5UHJlZml4TWFwKSB7XG4gIGlmICgoMCwgX2lzUHJlZml4ZWRWYWx1ZTIuZGVmYXVsdCkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLy8gb25seSBzcGxpdCBtdWx0aSB2YWx1ZXMsIG5vdCBjdWJpYyBiZXppZXJzXG4gIHZhciBtdWx0aXBsZVZhbHVlcyA9IHZhbHVlLnNwbGl0KC8sKD8hW14oKV0qKD86XFwoW14oKV0qXFwpKT9cXCkpL2cpO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBtdWx0aXBsZVZhbHVlcy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIHZhciBzaW5nbGVWYWx1ZSA9IG11bHRpcGxlVmFsdWVzW2ldO1xuICAgIHZhciB2YWx1ZXMgPSBbc2luZ2xlVmFsdWVdO1xuICAgIGZvciAodmFyIHByb3BlcnR5IGluIHByb3BlcnR5UHJlZml4TWFwKSB7XG4gICAgICB2YXIgZGFzaENhc2VQcm9wZXJ0eSA9ICgwLCBfaHlwaGVuYXRlUHJvcGVydHkyLmRlZmF1bHQpKHByb3BlcnR5KTtcblxuICAgICAgaWYgKHNpbmdsZVZhbHVlLmluZGV4T2YoZGFzaENhc2VQcm9wZXJ0eSkgPiAtMSAmJiBkYXNoQ2FzZVByb3BlcnR5ICE9PSAnb3JkZXInKSB7XG4gICAgICAgIHZhciBwcmVmaXhlcyA9IHByb3BlcnR5UHJlZml4TWFwW3Byb3BlcnR5XTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDAsIHBMZW4gPSBwcmVmaXhlcy5sZW5ndGg7IGogPCBwTGVuOyArK2opIHtcbiAgICAgICAgICAvLyBqb2luIGFsbCBwcmVmaXhlcyBhbmQgY3JlYXRlIGEgbmV3IHZhbHVlXG4gICAgICAgICAgdmFsdWVzLnVuc2hpZnQoc2luZ2xlVmFsdWUucmVwbGFjZShkYXNoQ2FzZVByb3BlcnR5LCBwcmVmaXhNYXBwaW5nW3ByZWZpeGVzW2pdXSArIGRhc2hDYXNlUHJvcGVydHkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG11bHRpcGxlVmFsdWVzW2ldID0gdmFsdWVzLmpvaW4oJywnKTtcbiAgfVxuXG4gIHJldHVybiBtdWx0aXBsZVZhbHVlcy5qb2luKCcsJyk7XG59XG5cbmZ1bmN0aW9uIHRyYW5zaXRpb24ocHJvcGVydHksIHZhbHVlLCBzdHlsZSwgcHJvcGVydHlQcmVmaXhNYXApIHtcbiAgLy8gYWxzbyBjaGVjayBmb3IgYWxyZWFkeSBwcmVmaXhlZCB0cmFuc2l0aW9uc1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xuICAgIHZhciBvdXRwdXRWYWx1ZSA9IHByZWZpeFZhbHVlKHZhbHVlLCBwcm9wZXJ0eVByZWZpeE1hcFxuICAgIC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBhbHJlYWR5IHByZWZpeGVkXG4gICAgKTt2YXIgd2Via2l0T3V0cHV0ID0gb3V0cHV0VmFsdWUuc3BsaXQoLywoPyFbXigpXSooPzpcXChbXigpXSpcXCkpP1xcKSkvZykuZmlsdGVyKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiAhLy1tb3otfC1tcy0vLnRlc3QodmFsKTtcbiAgICB9KS5qb2luKCcsJyk7XG5cbiAgICBpZiAocHJvcGVydHkuaW5kZXhPZignV2Via2l0JykgPiAtMSkge1xuICAgICAgcmV0dXJuIHdlYmtpdE91dHB1dDtcbiAgICB9XG5cbiAgICB2YXIgbW96T3V0cHV0ID0gb3V0cHV0VmFsdWUuc3BsaXQoLywoPyFbXigpXSooPzpcXChbXigpXSpcXCkpP1xcKSkvZykuZmlsdGVyKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiAhLy13ZWJraXQtfC1tcy0vLnRlc3QodmFsKTtcbiAgICB9KS5qb2luKCcsJyk7XG5cbiAgICBpZiAocHJvcGVydHkuaW5kZXhPZignTW96JykgPiAtMSkge1xuICAgICAgcmV0dXJuIG1vek91dHB1dDtcbiAgICB9XG5cbiAgICBzdHlsZVsnV2Via2l0JyArICgwLCBfY2FwaXRhbGl6ZVN0cmluZzIuZGVmYXVsdCkocHJvcGVydHkpXSA9IHdlYmtpdE91dHB1dDtcbiAgICBzdHlsZVsnTW96JyArICgwLCBfY2FwaXRhbGl6ZVN0cmluZzIuZGVmYXVsdCkocHJvcGVydHkpXSA9IG1vek91dHB1dDtcbiAgICByZXR1cm4gb3V0cHV0VmFsdWU7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVQcmVmaXhlciA9IHJlcXVpcmUoJy4vY3JlYXRlUHJlZml4ZXInKTtcblxudmFyIF9jcmVhdGVQcmVmaXhlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVQcmVmaXhlcik7XG5cbnZhciBfc3RhdGljRGF0YSA9IHJlcXVpcmUoJy4vc3RhdGljRGF0YScpO1xuXG52YXIgX3N0YXRpY0RhdGEyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3RhdGljRGF0YSk7XG5cbnZhciBfY3Vyc29yID0gcmVxdWlyZSgnLi9wbHVnaW5zL2N1cnNvcicpO1xuXG52YXIgX2N1cnNvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jdXJzb3IpO1xuXG52YXIgX2Nyb3NzRmFkZSA9IHJlcXVpcmUoJy4vcGx1Z2lucy9jcm9zc0ZhZGUnKTtcblxudmFyIF9jcm9zc0ZhZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3Jvc3NGYWRlKTtcblxudmFyIF9maWx0ZXIgPSByZXF1aXJlKCcuL3BsdWdpbnMvZmlsdGVyJyk7XG5cbnZhciBfZmlsdGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ZpbHRlcik7XG5cbnZhciBfZmxleCA9IHJlcXVpcmUoJy4vcGx1Z2lucy9mbGV4Jyk7XG5cbnZhciBfZmxleDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9mbGV4KTtcblxudmFyIF9mbGV4Ym94T2xkID0gcmVxdWlyZSgnLi9wbHVnaW5zL2ZsZXhib3hPbGQnKTtcblxudmFyIF9mbGV4Ym94T2xkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ZsZXhib3hPbGQpO1xuXG52YXIgX2dyYWRpZW50ID0gcmVxdWlyZSgnLi9wbHVnaW5zL2dyYWRpZW50Jyk7XG5cbnZhciBfZ3JhZGllbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ3JhZGllbnQpO1xuXG52YXIgX2ltYWdlU2V0ID0gcmVxdWlyZSgnLi9wbHVnaW5zL2ltYWdlU2V0Jyk7XG5cbnZhciBfaW1hZ2VTZXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW1hZ2VTZXQpO1xuXG52YXIgX3Bvc2l0aW9uID0gcmVxdWlyZSgnLi9wbHVnaW5zL3Bvc2l0aW9uJyk7XG5cbnZhciBfcG9zaXRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zaXRpb24pO1xuXG52YXIgX3NpemluZyA9IHJlcXVpcmUoJy4vcGx1Z2lucy9zaXppbmcnKTtcblxudmFyIF9zaXppbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2l6aW5nKTtcblxudmFyIF90cmFuc2l0aW9uID0gcmVxdWlyZSgnLi9wbHVnaW5zL3RyYW5zaXRpb24nKTtcblxudmFyIF90cmFuc2l0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3RyYW5zaXRpb24pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgcGx1Z2lucyA9IFtfY3Jvc3NGYWRlMi5kZWZhdWx0LCBfY3Vyc29yMi5kZWZhdWx0LCBfZmlsdGVyMi5kZWZhdWx0LCBfZmxleGJveE9sZDIuZGVmYXVsdCwgX2dyYWRpZW50Mi5kZWZhdWx0LCBfaW1hZ2VTZXQyLmRlZmF1bHQsIF9wb3NpdGlvbjIuZGVmYXVsdCwgX3NpemluZzIuZGVmYXVsdCwgX3RyYW5zaXRpb24yLmRlZmF1bHQsIF9mbGV4Mi5kZWZhdWx0XTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gKDAsIF9jcmVhdGVQcmVmaXhlcjIuZGVmYXVsdCkoe1xuICBwcmVmaXhNYXA6IF9zdGF0aWNEYXRhMi5kZWZhdWx0LnByZWZpeE1hcCxcbiAgcGx1Z2luczogcGx1Z2luc1xufSk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gQGZsb3dcblxuaW1wb3J0IHsgZ2V0Vmlld3BvcnRJbmZvIH0gZnJvbSAnLi4vZW52L3ZpZXdwb3J0J1xuaW1wb3J0IGFkZFByZWZpeCBmcm9tICdpbmxpbmUtc3R5bGUtcHJlZml4ZXIvc3RhdGljL2luZGV4J1xuXG5jb25zdCBub1VuaXRzTnVtYmVyS2V5cyA9IFtcbiAgJ2ZsZXgnLFxuICAnb3BhY2l0eScsXG4gICd6SW5kZXgnLFxuICAnZm9udFdlaWdodCcsXG4gICdsaW5lcydcbl1cblxuLy8gd2hldGhlciB0byBzdXBwb3J0IHVzaW5nIDAuNXB4IHRvIHBhaW50IDFweCB3aWR0aCBib3JkZXIuXG5sZXQgX3N1cHBvcnRIYWlybGluZXM6ID9ib29sZWFuXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydEhhaXJsaW5lcyAoKSB7XG4gIGlmICh0eXBlb2YgX3N1cHBvcnRIYWlybGluZXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgY29uc3QgZHByID0gd2luZG93LmRldmljZVBpeGVsUmF0aW9cbiAgICBpZiAoZHByICYmIGRwciA+PSAyICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgY29uc3QgZG9jRWxtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgICBjb25zdCB0ZXN0RWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICAgIGNvbnN0IGZha2VCb2R5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYm9keScpXG4gICAgICBjb25zdCBiZWZvcmVOb2RlID0gZG9jRWxtLmZpcnN0RWxlbWVudENoaWxkIHx8IGRvY0VsbS5maXJzdENoaWxkXG4gICAgICB0ZXN0RWxtLnN0eWxlLmJvcmRlciA9ICcwLjVweCBzb2xpZCB0cmFuc3BhcmVudCdcbiAgICAgIGZha2VCb2R5LmFwcGVuZENoaWxkKHRlc3RFbG0pXG4gICAgICBkb2NFbG0uaW5zZXJ0QmVmb3JlKGZha2VCb2R5LCBiZWZvcmVOb2RlKVxuICAgICAgX3N1cHBvcnRIYWlybGluZXMgPSB0ZXN0RWxtLm9mZnNldEhlaWdodCA9PT0gMVxuICAgICAgZG9jRWxtLnJlbW92ZUNoaWxkKGZha2VCb2R5KVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIF9zdXBwb3J0SGFpcmxpbmVzID0gZmFsc2VcbiAgICB9XG4gIH1cbiAgcmV0dXJuIF9zdXBwb3J0SGFpcmxpbmVzXG59XG5cbi8qKlxuICogcmVtb3ZlIGNvbW1lbnRzIGZyb20gYSBjc3NUZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpbUNvbW1lbnQgKGNzc1RleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjc3NUZXh0LnJlcGxhY2UoLyg/OlxcL1xcKilbXFxzXFxTXSo/XFwqXFwvL2csICcnKVxufVxuXG5sZXQgc3VwcG9ydDogYm9vbGVhbiB8IG51bGwgPSBudWxsXG5cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0U3RpY2t5ICgpOiBib29sZWFuIHtcbiAgaWYgKHN1cHBvcnQgIT09IG51bGwpIHtcbiAgICByZXR1cm4gc3VwcG9ydFxuICB9XG4gIGNvbnN0IGVsZW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgY29uc3QgZWxlbWVudFN0eWxlID0gZWxlbWVudC5zdHlsZVxuICBlbGVtZW50U3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjotd2Via2l0LXN0aWNreTtwb3NpdGlvbjpzdGlja3k7J1xuICBzdXBwb3J0ID0gZWxlbWVudFN0eWxlLnBvc2l0aW9uLmluZGV4T2YoJ3N0aWNreScpICE9PSAtMVxuICByZXR1cm4gc3VwcG9ydFxufVxuXG5jb25zdCByZWdQZXJjZW50YWdlID0gL15bKy1dP1xcZCsoXFwuXFxkKyk/JSQvXG5leHBvcnQgZnVuY3Rpb24gaXNQZXJjZW50YWdlICh2YWw6IHN0cmluZykge1xuICByZXR1cm4gcmVnUGVyY2VudGFnZS50ZXN0KHZhbClcbn1cblxuY29uc3QgcmVnVW5pdHNOdW0gPSAvXihbKy1dP1xcZCsoPzpcXC5cXGQrKT8pKFtwLHddeCk/JC8gLy8gc3VwcG9ydCB1bml0czogcHgsIHd4LlxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXRzTnVtICh2YWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG1hdGNoID0gdmFsLm1hdGNoKHJlZ1VuaXRzTnVtKVxuICBpZiAoIW1hdGNoKSB7IHJldHVybiAnJyB9XG4gIGxldCB1bml0ID0gJ3B4JyAvLyBweCBieSBkZWZhdWx0LlxuICBpZiAobWF0Y2hbMl0pIHtcbiAgICB1bml0ID0gbWF0Y2hbMl1cbiAgfVxuICByZXR1cm4gcGFyc2VTY2FsZShwYXJzZUZsb2F0KG1hdGNoWzFdKSwgdW5pdClcbn1cblxuZnVuY3Rpb24gZ2V0VW5pdFNjYWxlTWFwICgpIHtcbiAgY29uc3QgeyBzY2FsZSwgZHByIH0gPSBnZXRWaWV3cG9ydEluZm8oKVxuICByZXR1cm4ge1xuICAgIHB4OiBzY2FsZSxcbiAgICB3eDogc2NhbGUgKiBkcHJcbiAgfVxufVxuXG5mdW5jdGlvbiBsaW1pdFNjYWxlICh2YWwsIGxpbWl0KSB7XG4gIGxpbWl0ID0gbGltaXQgfHwgMVxuICBjb25zdCBzaWduID0gdmFsID09PSAwID8gMCA6IHZhbCA+IDAgPyAxIDogLTFcbiAgbGV0IG5ld1ZhbCA9IE1hdGguYWJzKHZhbCkgPiBsaW1pdCA/IHZhbCA6IHNpZ24gKiBsaW1pdFxuICAvLyBzdXBwb3J0IDFweCBkZXZpY2Ugd2lkdGguXG4gIGlmIChuZXdWYWwgPT09IDEgJiYgdmFsIDwgMSAmJiBzdXBwb3J0SGFpcmxpbmVzKCkpIHtcbiAgICBuZXdWYWwgPSAwLjVcbiAgfVxuICByZXR1cm4gbmV3VmFsXG59XG5cbmZ1bmN0aW9uIHBhcnNlU2NhbGUgKHZhbDogbnVtYmVyLCB1bml0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB1bml0U2NhbGVNYXAgPSBnZXRVbml0U2NhbGVNYXAoKVxuICByZXR1cm4gbGltaXRTY2FsZSh2YWwgKiB1bml0U2NhbGVNYXBbdW5pdF0pICsgJ3B4J1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nIChzdHlsZUtleTogc3RyaW5nLCBzdHlsZVZhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGlzUGVyY2VudGFnZShzdHlsZVZhbCkpIHtcbiAgICByZXR1cm4gc3R5bGVWYWxcbiAgfVxuXG4gIC8qKlxuICAgKiAxLiB0ZXN0IGlmIGlzIGEgcmVndWxhciBzY2FsZSBjc3MuIGUuZy4gYHdpZHRoOiAxMDBweDtgXG4gICAqICB0aGlzIHNob3VsZCBiZSBhIHN0YW5kYWxvbmUgbnVtYmVyIHZhbHVlIHdpdGggb3Igd2l0aG91dCB1bml0LCBvdGhlcndpc2VcbiAgICogIGl0IHNob3VsZG4ndCBiZSBjaGFuZ2VkLlxuICAgKi9cbiAgY29uc3QgdW5pdHNOdW0gPSBub3JtYWxpemVVbml0c051bShzdHlsZVZhbClcbiAgaWYgKHVuaXRzTnVtKSB7IHJldHVybiB1bml0c051bSB9XG5cbiAgLyoqXG4gICAqIDIuIGlmIGEgc3RyaW5nIGNvbnRhaW5zIG11bHRpcGxlIHB4IHZhbHVlcywgdGhhbiB0aGV5IHNob3VsZCBiZSBhbGwgbm9ybWFsaXplZC5cbiAgICogIHZhbHVlcyBzaG91bGQgaGF2ZSB3eCBvciBweCB1bml0cywgb3RoZXJ3aXNlIHRoZXkgc2hvdWxkIGJlIGxlZnQgdW5jaGFuZ2VkLlxuICAgKiAgZS5nLlxuICAgKiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMHB4LCA2cHgsIDApXG4gICAqICAgIGJvcmRlcjogMnB4IHNvbGlkIHJlZFxuICAgKi9cbiAgY29uc3QgbnVtUmVnID0gLyhbKy1dP1tcXGQuXSspKFtwLHddeCkvaWdcbiAgaWYgKG51bVJlZy50ZXN0KHN0eWxlVmFsKSkge1xuICAgIGNvbnN0IHVuaXRTY2FsZU1hcCA9IGdldFVuaXRTY2FsZU1hcCgpXG4gICAgY29uc3QgdmFsID0gc3R5bGVWYWwucmVwbGFjZShudW1SZWcsIGZ1bmN0aW9uIChtLCAkMCwgJDEpIHtcbiAgICAgIGNvbnN0IHJlcyA9IHBhcnNlRmxvYXQoJDApICogdW5pdFNjYWxlTWFwWyQxXVxuICAgICAgcmV0dXJuIGxpbWl0U2NhbGUocmVzKSArICdweCdcbiAgICB9KVxuICAgIHJldHVybiB2YWxcbiAgfVxuXG4gIC8vIG90aGVyd2lzZVxuICByZXR1cm4gc3R5bGVWYWxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF1dG9QcmVmaXggKHN0eWxlOiB7fSk6IHt9IHtcbiAgY29uc3QgcHJlZml4ZWQgPSBhZGRQcmVmaXgoc3R5bGUpXG4gIC8vIGZsZXggb25seSBhZGRlZCBXZWJraXRGbGV4LiBTaG91bGQgYWRkIFdlYmtpdEJveEZsZXggYWxzby5cbiAgY29uc3QgZmxleCA9IHByZWZpeGVkLmZsZXhcbiAgaWYgKGZsZXgpIHtcbiAgICBwcmVmaXhlZC5XZWJraXRCb3hGbGV4ID0gZmxleFxuICAgIHByZWZpeGVkLk1vekJveEZsZXggPSBmbGV4XG4gICAgcHJlZml4ZWQuTXNGbGV4ID0gZmxleFxuICB9XG4gIHJldHVybiBwcmVmaXhlZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplTnVtYmVyIChzdHlsZUtleTogc3RyaW5nLCBzdHlsZVZhbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgeyBzY2FsZSB9ID0gZ2V0Vmlld3BvcnRJbmZvKClcbiAgcmV0dXJuIHN0eWxlVmFsICogc2NhbGUgKyAncHgnXG59XG5cbi8qKlxuICogbm9ybWFsaXplIHN0eWxlIHRvIGFkYXB0ZSB0byBjdXJyZW50IHZpZXdwb3J0IGJ5IG11bHRpcGx5IGN1cnJlbnQgc2NhbGUuXG4gKiBAcGFyYW0gIHtvYmplY3R9IHN0eWxlOiBzaG91bGQgYmUgY2FtZWxDYXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU3R5bGUgKHN0eWxlOiB7fSkge1xuICBjb25zdCByZXMgPSB7fVxuICBmb3IgKGNvbnN0IGtleSBpbiBzdHlsZSkge1xuICAgIGNvbnN0IHZhbCA9IHN0eWxlW2tleV1cbiAgICBpZiAobm9Vbml0c051bWJlcktleXMuaW5kZXhPZihrZXkpID4gLTEpIHtcbiAgICAgIHJlc1trZXldID0gdmFsXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBzd2l0Y2ggKHR5cGVvZiB2YWwpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJlc1trZXldID0gbm9ybWFsaXplU3RyaW5nKGtleSwgdmFsKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgcmVzW2tleV0gPSBub3JtYWxpemVOdW1iZXIoa2V5LCB2YWwpXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXNba2V5XSA9IHZhbFxuICAgICAgICBicmVha1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbi8qKlxuICogZ2V0IHRyYW5zZm9ybU9ialxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNmb3JtT2JqIChlbG06IEhUTUxFbGVtZW50KTogYW55IHtcbiAgbGV0IHN0eWxlT2JqID0ge31cbiAgaWYgKCFlbG0pIHsgcmV0dXJuIHN0eWxlT2JqIH1cbiAgY29uc3QgdHJhbnNmb3JtU3RyID0gZWxtLnN0eWxlLndlYmtpdFRyYW5zZm9ybVxuICAgIHx8IGVsbS5zdHlsZS5tb3pUcmFuc2Zvcm1cbiAgICB8fCBlbG0uc3R5bGUudHJhbnNmb3JtXG4gIGlmICh0cmFuc2Zvcm1TdHIgJiYgdHJhbnNmb3JtU3RyLm1hdGNoKC8oPzogKig/OnRyYW5zbGF0ZXxyb3RhdGV8c2NhbGUpW14oXSpcXChbXihdK1xcKSkrL2kpKSB7XG4gICAgc3R5bGVPYmogPSB0cmFuc2Zvcm1TdHIudHJpbSgpLnJlcGxhY2UoLywgKy9nLCAnLCcpLnNwbGl0KCcgJykucmVkdWNlKGZ1bmN0aW9uIChwcmUsIHN0cikge1xuICAgICAgWyd0cmFuc2xhdGUnLCAnc2NhbGUnLCAncm90YXRlJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBpZiAobmV3IFJlZ0V4cChuYW1lLCAnaScpLnRlc3Qoc3RyKSkge1xuICAgICAgICAgIHByZVtuYW1lXSA9IHN0clxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgcmV0dXJuIHByZVxuICAgIH0sIHt9KVxuICB9XG4gIHJldHVybiBzdHlsZU9ialxufVxuXG4vKipcbiAqIHRyYW5zbGF0ZSBhIHRyYW5zZm9ybSBzdHJpbmcgZnJvbSBhIHRyYW5zZm9ybU9iai5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRyYW5zZm9ybVN0ciAob2JqOiB7fSk6IHN0cmluZyB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopLnJlZHVjZShmdW5jdGlvbiAocHJlLCBrZXkpIHtcbiAgICByZXR1cm4gcHJlICsgb2JqW2tleV0gKyAnICdcbiAgfSwgJycpXG59XG5cbi8qKlxuICogYWRkIHRyYW5zZm9ybSBzdHlsZSB0byBlbGVtZW50LlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxtXG4gKiBAcGFyYW0ge29iamVjdH0gc3R5bGU6IHRyYW5zZm9ybSBvYmplY3QsIGZvcm1hdCBpcyBsaWtlIHRoaXM6XG4gKiAgIHtcbiAqICAgICB0cmFuc2xhdGU6ICd0cmFuc2xhdGUzZCgycHgsIDJweCwgMnB4KScsXG4gKiAgICAgc2NhbGU6ICdzY2FsZSgwLjIpJyxcbiAqICAgICByb3RhdGU6ICdyb3RhdGUoMzBkZWcpJ1xuICogICB9XG4gKiBAcGFyYW0ge2Jvb2xlYW59IHJlcGxhY2U6IHdoZXRoZXIgdG8gcmVwbGFjZSBhbGwgdHJhbnNmb3JtIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRUcmFuc2Zvcm0gKGVsbTogSFRNTEVsZW1lbnQsIHN0eWxlOiB7fSwgcmVwbGFjZTogYm9vbGVhbik6IHZvaWQge1xuICBpZiAoIXN0eWxlKSB7IHJldHVybiB9XG4gIGxldCBzdHlsZU9iaiA9IHt9XG4gIGlmICghcmVwbGFjZSkge1xuICAgIHN0eWxlT2JqID0gZ2V0VHJhbnNmb3JtT2JqKGVsbSlcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBzdHlsZSkge1xuICAgIGNvbnN0IHZhbCA9IHN0eWxlW2tleV1cbiAgICBpZiAodmFsKSB7XG4gICAgICBzdHlsZU9ialtrZXldID0gdmFsXG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc1N0ciA9IGdldFRyYW5zZm9ybVN0cihzdHlsZU9iailcbiAgZWxtLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHJlc1N0clxuICBlbG0uc3R5bGUubW96VHJhbnNmb3JtID0gcmVzU3RyXG4gIGVsbS5zdHlsZS50cmFuc2Zvcm0gPSByZXNTdHJcbn1cblxuLyoqXG4gKiBhZGQgdHJhbnNsYXRlIFggdG8gdGhlIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRUcmFuc2xhdGVYIChlbG06IEhUTUxFbGVtZW50LCB0b0FkZDogbnVtYmVyKTogdm9pZCB7XG4gIGlmICghdG9BZGQpIHsgcmV0dXJuIH1cbiAgY29uc3Qgc3R5bGVPYmogPSBnZXRUcmFuc2Zvcm1PYmooZWxtKVxuICBpZiAoIXN0eWxlT2JqLnRyYW5zbGF0ZSkge1xuICAgIHN0eWxlT2JqLnRyYW5zbGF0ZSA9ICd0cmFuc2xhdGUzZCgwcHgsIDBweCwgMHB4KSdcbiAgfVxuICBzdHlsZU9iai50cmFuc2xhdGUgPSBzdHlsZU9iai50cmFuc2xhdGUucmVwbGFjZSgvWystXFxkLl0rW3B3XXgvLCBmdW5jdGlvbiAoJDApIHtcbiAgICByZXR1cm4gKHBhcnNlRmxvYXQoJDApICsgdG9BZGQpICsgJ3B4J1xuICB9KVxuICBjb25zdCByZXNTdHIgPSBnZXRUcmFuc2Zvcm1TdHIoc3R5bGVPYmopXG4gIGVsbS5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSByZXNTdHJcbiAgZWxtLnN0eWxlLm1velRyYW5zZm9ybSA9IHJlc1N0clxuICBlbG0uc3R5bGUudHJhbnNmb3JtID0gcmVzU3RyXG59XG5cbi8qKlxuICogY29weSBhIHRyYW5zZm9ybSBiZWhhdmlvdXIgZnJvbSBvbmUgZWxlbWVudCB0byBhbm90aGVyLlxuICoga2V5IGNvdWxkIGJlOiAndHJhbnNsYXRlJyB8ICdzY2FsZScgfCAncm90YXRlJ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29weVRyYW5zZm9ybSAoZnJvbTogSFRNTEVsZW1lbnQsIHRvOiBIVE1MRWxlbWVudCwga2V5OiBzdHJpbmcgfCB2b2lkKTogdm9pZCB7XG4gIGxldCBzdHJcbiAgaWYgKCFrZXkpIHtcbiAgICBzdHIgPSBmcm9tLnN0eWxlLndlYmtpdFRyYW5zZm9ybVxuICAgICAgfHwgZnJvbS5zdHlsZS5tb3pUcmFuc2Zvcm1cbiAgICAgIHx8IGZyb20uc3R5bGUudHJhbnNmb3JtXG4gIH1cbiAgZWxzZSB7XG4gICAgY29uc3QgZnJvbU9iaiA9IGdldFRyYW5zZm9ybU9iaihmcm9tKVxuICAgIGlmICghZnJvbU9ialtrZXldKSB7IHJldHVybiB9XG4gICAgY29uc3QgdG9PYmogPSBnZXRUcmFuc2Zvcm1PYmoodG8pXG4gICAgdG9PYmpba2V5XSA9IGZyb21PYmpba2V5XVxuICAgIHN0ciA9IGdldFRyYW5zZm9ybVN0cih0b09iailcbiAgfVxuICB0by5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSBzdHJcbiAgdG8uc3R5bGUubW96VHJhbnNmb3JtID0gc3RyXG4gIHRvLnN0eWxlLnRyYW5zZm9ybSA9IHN0clxufVxuXG4vKipcbiAqIGdldCBjb2xvcidzIHIsIGcsIGIgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3Igc3VwcG9ydCBhbGwga2luZHMgb2YgdmFsdWUgb2YgY29sb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZ2IgKGNvbG9yOiBzdHJpbmcpIHtcbiAgY29uc3QgaGF4UmVnID0gLyMoW1xcZGEtZkEtRl17Mn0pKFtcXGRhLWZBLUZdezJ9KShbXFxkYS1mQS1GXXsyfSkvXG4gIGNvbnN0IHJnYlJlZyA9IC9yZ2JcXCgoXFxkKyksXFxzKihcXGQrKSxcXHMqKFxcZCspXFwpL1xuICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5ib2R5XG4gIHNwYW4uc3R5bGUuY3NzVGV4dCA9IGBjb2xvcjogJHtjb2xvcn07IHdpZHRoOiAwcHg7IGhlaWdodDogMHB4O2BcbiAgYm9keSAmJiBib2R5LmFwcGVuZENoaWxkKHNwYW4pXG4gIGNvbG9yID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoc3BhbikuY29sb3IgKyAnJ1xuICBib2R5ICYmIGJvZHkucmVtb3ZlQ2hpbGQoc3BhbilcblxuICBsZXQgbWF0Y2hcbiAgbWF0Y2ggPSBjb2xvci5tYXRjaChoYXhSZWcpXG4gIGlmIChtYXRjaCkge1xuICAgIHJldHVybiB7XG4gICAgICByOiBwYXJzZUludChtYXRjaFsxXSwgMTYpLFxuICAgICAgZzogcGFyc2VJbnQobWF0Y2hbMl0sIDE2KSxcbiAgICAgIGI6IHBhcnNlSW50KG1hdGNoWzNdLCAxNilcbiAgICB9XG4gIH1cbiAgbWF0Y2ggPSBjb2xvci5tYXRjaChyZ2JSZWcpXG4gIGlmIChtYXRjaCkge1xuICAgIHJldHVybiB7XG4gICAgICByOiBwYXJzZUludChtYXRjaFsxXSksXG4gICAgICBnOiBwYXJzZUludChtYXRjaFsyXSksXG4gICAgICBiOiBwYXJzZUludChtYXRjaFszXSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBnZXQgc3R5bGUgc2hlZXQgd2l0aCBvd25lciBub2RlJ3MgaWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCBvd25lciBub2RlIGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3R5bGVTaGVldEJ5SWQgKGlkPzogc3RyaW5nKSB7XG4gIGlmICghaWQpIHsgcmV0dXJuIH1cbiAgY29uc3Qgc3R5bGVTaGVldHMgPSBkb2N1bWVudC5zdHlsZVNoZWV0c1xuICBjb25zdCBsZW4gPSBzdHlsZVNoZWV0cy5sZW5ndGhcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IHN0eWxlU2hlZXQgPSBzdHlsZVNoZWV0c1tpXVxuICAgIGlmIChzdHlsZVNoZWV0Lm93bmVyTm9kZS5pZCA9PT0gaWQpIHtcbiAgICAgIHJldHVybiBzdHlsZVNoZWV0XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldENoaWxkcmVuVG90YWxXaWR0aCAoY2hpbGRyZW4pIHtcbiAgY29uc3QgbGVuID0gY2hpbGRyZW4ubGVuZ3RoXG4gIGxldCB0b3RhbCA9IDBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHRvdGFsICs9IGNoaWxkcmVuW2ldLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoXG4gIH1cbiAgcmV0dXJuIHRvdGFsXG59XG4vKipcbiAqIGdldCB0b3RhbCBjb250ZW50IHdpZHRoIG9mIHRoZSBlbGVtZW50LlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYW5nZVdpZHRoIChlbG06IEhUTUxFbGVtZW50KSB7XG4gIGNvbnN0IGNoaWxkcmVuID0gZWxtLmNoaWxkcmVuXG4gIGlmICghY2hpbGRyZW4pIHtcbiAgICByZXR1cm4gZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoXG4gIH1cbiAgaWYgKCFSYW5nZSkge1xuICAgIHJldHVybiBnZXRDaGlsZHJlblRvdGFsV2lkdGgoY2hpbGRyZW4pXG4gIH1cbiAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG4gIGlmICghcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKSB7XG4gICAgcmV0dXJuIGdldENoaWxkcmVuVG90YWxXaWR0aChjaGlsZHJlbilcbiAgfVxuICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxtKVxuICByZXR1cm4gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGhcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9mdW5jJ1xuZXhwb3J0ICogZnJvbSAnLi9ldmVudCdcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50J1xuZXhwb3J0ICogZnJvbSAnLi9sYXp5bG9hZCdcbmV4cG9ydCAqIGZyb20gJy4vc3R5bGUnXG5leHBvcnQgKiBmcm9tICcuL3R5cGUnXG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCAnLi4vbGliL2VudmQnXG5cbmltcG9ydCB7IGluaXQgYXMgaW5pdFZpZXdwb3J0IH0gZnJvbSAnLi92aWV3cG9ydCdcbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gJy4uL3V0aWxzJ1xuXG4vKipcbiAqIGdldCBXWEVudmlyb25tZW50IGluZm8uXG4gKiBAcGFyYW0gIHtvYmplY3R9IHZpZXdwb3J0SW5mbzogaW5mbyBhYm91dCB2aWV3cG9ydC5cbiAqIEBwYXJhbSAge29iamVjdH0gZW52SW5mbzogaW5mbyBwYXJzZWQgZnJvbSBsaWIuZW52LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdEVudiAodmlld3BvcnRJbmZvLCBlbnZJbmZvKSB7XG4gIGNvbnN0IGJyb3dzZXJOYW1lID0gZW52SW5mby5icm93c2VyID8gZW52SW5mby5icm93c2VyLm5hbWUgOiBuYXZpZ2F0b3IuYXBwTmFtZVxuICBjb25zdCBicm93c2VyVmVyc2lvbiA9IGVudkluZm8uYnJvd3NlciA/IGVudkluZm8uYnJvd3Nlci52ZXJzaW9uLnZhbCA6IG51bGxcbiAgbGV0IG9zTmFtZSA9IGVudkluZm8ub3MubmFtZVxuICBpZiAob3NOYW1lLm1hdGNoKC8oaVBob25lfGlQYWR8aVBvZCkvaSkpIHtcbiAgICBvc05hbWUgPSAnaU9TJ1xuICB9XG4gIGVsc2UgaWYgKG9zTmFtZS5tYXRjaCgvQW5kcm9pZC9pKSkge1xuICAgIG9zTmFtZSA9ICdhbmRyb2lkJ1xuICB9XG4gIGNvbnN0IG9zVmVyc2lvbiA9IGVudkluZm8ub3MudmVyc2lvbi52YWxcbiAgY29uc3QgZW52ID0ge1xuICAgIHBsYXRmb3JtOiAnV2ViJyxcbiAgICB3ZWV4VmVyc2lvbjogJ3Byb2Nlc3MuZW52LldFRVhfVkVSU0lPTicsXG4gICAgdXNlckFnZW50OiBuYXZpZ2F0b3IudXNlckFnZW50LFxuICAgIGFwcE5hbWU6IGJyb3dzZXJOYW1lLFxuICAgIGFwcFZlcnNpb246IGJyb3dzZXJWZXJzaW9uLFxuICAgIG9zTmFtZSxcbiAgICBvc1ZlcnNpb24sXG4gICAgZGV2aWNlTW9kZWw6IGVudkluZm8ub3MubmFtZSB8fCBudWxsXG4gIH1cbiAgLyoqXG4gICAqIHZpZXdwb3J0SW5mbzogc2NhbGUsIGRldmljZVdpZHRoLCBkZXZpY2VIZWlnaHQuIGRwclxuICAgKi9cbiAgcmV0dXJuIGV4dGVuZChlbnYsIHZpZXdwb3J0SW5mbylcbn1cblxuLy8gY29uc3Qgdmlld3BvcnRJbmZvID0gaW5pdFZpZXdwb3J0KClcblxuLy8gNzUwIGJ5IGRlZmF1bHQgY3VycmVudGx5XG4vLyBjb25zdCBzY2FsZSA9IHZpZXdwb3J0SW5mby5zY2FsZVxuXG4vLyBjb25zdCB1bml0cyA9IHtcbi8vICAgUkVNOiAxMiAqIHNjYWxlLFxuLy8gICBWVzogdmlld3BvcnRJbmZvLmRldmljZVdpZHRoIC8gMTAwLFxuLy8gICBWSDogdmlld3BvcnRJbmZvLmRldmljZUhlaWdodCAvIDEwMCxcbi8vICAgVk1JTjogTWF0aC5taW4odmlld3BvcnRJbmZvLmRldmljZVdpZHRoLCB2aWV3cG9ydEluZm8uZGV2aWNlSGVpZ2h0KSAvIDEwMCxcbi8vICAgVk1BWDogTWF0aC5tYXgodmlld3BvcnRJbmZvLmRldmljZVdpZHRoLCB2aWV3cG9ydEluZm8uZGV2aWNlSGVpZ2h0KSAvIDEwMCxcbi8vICAgQ006IDk2IC8gMi41NCAqIHNjYWxlLFxuLy8gICBNTTogOTYgLyAyNS40ICogc2NhbGUsXG4vLyAgIFE6IDk2IC8gMjUuNCAvIDQgKiBzY2FsZSxcbi8vICAgSU46IDk2ICogc2NhbGUsXG4vLyAgIFBUOiA5NiAvIDcyICogc2NhbGUsXG4vLyAgIFBDOiA5NiAvIDYgKiBzY2FsZSxcbi8vICAgUFg6IHNjYWxlXG4vLyB9XG5cbi8vIE9iamVjdC5mcmVlemUodW5pdHMpXG4vLyBPYmplY3QuZnJlZXplKGVudilcblxuLy8gd2luZG93LkNTU19VTklUID0gdW5pdHNcbndpbmRvdy5XWEVudmlyb25tZW50ID0gaW5pdEVudihpbml0Vmlld3BvcnQoKSwgd2luZG93LmxpYi5lbnYpXG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGdsb2JhbCBWdWUgKi9cblxuaW1wb3J0ICcuL3d4LWVudidcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL3V0aWxzJ1xuXG5jb25zdCB3ZWV4TW9kdWxlcyA9IHt9XG5jb25zdCBfcm9vdHMgPSBbXVxuXG5jb25zdCB3ZWV4ID0ge1xuICBfX3Z1ZV9fOiBudWxsLFxuICB1dGlscyxcbiAgLy8gdW5pdHM6IHdpbmRvdy5DU1NfVU5JVCxcbiAgY29uZmlnOiB7XG4gICAgZW52OiB3aW5kb3cuV1hFbnZpcm9ubWVudCxcbiAgICBidW5kbGVVcmw6IGxvY2F0aW9uLmhyZWZcbiAgfSxcblxuICBfY29tcG9uZW50czoge30sXG5cbiAgZG9jdW1lbnQ6IHtcbiAgICBib2R5OiB7fVxuICB9LFxuXG4gIHJlcXVpcmVNb2R1bGUgKG1vZHVsZU5hbWUpIHtcbiAgICByZXR1cm4gd2VleE1vZHVsZXNbbW9kdWxlTmFtZV1cbiAgfSxcblxuICByZWdpc3Rlck1vZHVsZSAoLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyQXBpTW9kdWxlKC4uLmFyZ3MpXG4gIH0sXG5cbiAgc3VwcG9ydCAoZmVhdHVyZSA9ICcnKSB7XG4gICAgY29uc3QgbWF0Y2ggPSAoZmVhdHVyZSArICcnKS5tYXRjaCgvQChjb21wb25lbnR8bW9kdWxlKVxcLyhcXHcrKSguXFx3Kyk/LylcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBtYXRjaFsxXVxuICAgICAgY29uc3QgbW9kID0gbWF0Y2hbMl1cbiAgICAgIGxldCBtZXRob2QgPSBtYXRjaFszXVxuICAgICAgbWV0aG9kID0gbWV0aG9kICYmIG1ldGhvZC5yZXBsYWNlKC9eXFwuLywgJycpXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAnY29tcG9uZW50JzpcbiAgICAgICAgICByZXR1cm4gISF0aGlzLl9jb21wb25lbnRzW21vZF1cbiAgICAgICAgY2FzZSAnbW9kdWxlJzpcbiAgICAgICAgICBjb25zdCBtb2R1bGUgPSB0aGlzLnJlcXVpcmVNb2R1bGUobW9kKVxuICAgICAgICAgIHJldHVybiBtb2R1bGUgJiYgbWV0aG9kID8gISFtb2R1bGVbbWV0aG9kXSA6ICEhbW9kdWxlXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGBbdnVlLXJlbmRlcl0gaW52YWxpZCBhcmd1bWVudCBmb3Igd2VleC5zdXBwb3J0OiAke2ZlYXR1cmV9YClcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIG5ldyB2dWUgaW5zdGFuY2UgaW4gdGhpcyB3ZWV4IGluc3RhbmNlLiBQdXQgaXRzIHJvb3QgZWxlbWVudCBpbnRvIHdlZXguZG9jdW1lbnQuYm9keS5jaGlsZHJlbiwgc29cbiAgICogdGhhdCB1c2VyIGNhbiB1c2Ugd2VleC5kb2N1bWVudC5ib2R5IHRvIHdhbGsgdGhyb3VnaCBhbGwgZG9tIHN0cnVjdHVyZXMgaW4gYWxsIHZ1ZSBpbnN0YW5jZXMgaW4gdGhlIHBhZ2UuXG4gICAqL1xuICByZWdpc3RlclZ1ZUluc3RhbmNlIChpbnN0YW5jZSkge1xuICAgIGlmICghaW5zdGFuY2UgaW5zdGFuY2VvZiBWdWUpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbdnVlLXJlbmRlcl0gcmVnaXN0ZXJWdWVJbnN0YW5jZTogaW52YWxpZCBpbnN0YW5jZSwgbm90IGEgdnVlIGluc3RhbmNlLmApXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgcm9vdCA9IGluc3RhbmNlLiRyb290XG4gICAgaWYgKCFyb290IHx8ICFyb290LiRlbCkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFt2dWUtcmVuZGVyXSByZWdpc3RlclZ1ZUluc3RhbmNlOiBpbnN0YW5jZSBoYXMgbm8gcm9vdC5gKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuZG9jdW1lbnQuYm9keS5jaGlsZHJlbi5wdXNoKHJvb3QuJGVsKVxuICB9LFxuXG4gIC8vIEBkZXByZWNhdGVkXG4gIHJlcXVpcmUgKC4uLmFyZ3MpIHtcbiAgICBjb25zb2xlLmxvZyhgW1Z1ZSBSZW5kZXJdIFwid2VleC5yZXF1aXJlXCIgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBcIndlZXgucmVxdWlyZU1vZHVsZVwiIGluc3RlYWQuYClcbiAgICByZXR1cm4gdGhpcy5yZXF1aXJlTW9kdWxlKC4uLmFyZ3MpXG4gIH0sXG5cbiAgLy8gQGRlcHJlY2F0ZWRcbiAgLy8gVE9ETzogcmVuYW1lIHRvIHJlZ2lzdGVyTW9kdWxlXG4gIHJlZ2lzdGVyQXBpTW9kdWxlIChuYW1lLCBtb2R1bGUsIG1ldGEpIHtcbiAgICBpZiAoIXdlZXhNb2R1bGVzW25hbWVdKSB7XG4gICAgICB3ZWV4TW9kdWxlc1tuYW1lXSA9IHt9XG4gICAgfVxuICAgIGlmICghIW1ldGEgJiYgbWV0YS5tb3VudFR5cGUgPT09ICdmdWxsJykge1xuICAgICAgd2VleE1vZHVsZXNbbmFtZV0gPSBtb2R1bGVcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbW9kdWxlKSB7XG4gICAgICBpZiAobW9kdWxlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgd2VleE1vZHVsZXNbbmFtZV1ba2V5XSA9IHV0aWxzLmJpbmQobW9kdWxlW2tleV0sIHRoaXMpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHJlZ2lzdGVyQ29tcG9uZW50IChuYW1lLCBjb21wb25lbnQpIHtcbiAgICBpZiAoIXRoaXMuX192dWVfXykge1xuICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKCdbVnVlIFJlbmRlcl0gVnVlIGlzIG5vdCBmb3VuZC4gUGxlYXNlIGltcG9ydCBWdWUuanMgYmVmb3JlIHJlZ2lzdGVyIGEgY29tcG9uZW50LicpXG4gICAgfVxuICAgIHRoaXMuX2NvbXBvbmVudHNbbmFtZV0gPSAxXG4gICAgaWYgKGNvbXBvbmVudC5fY3NzKSB7XG4gICAgICBjb25zdCBjc3MgPSBjb21wb25lbnQuX2Nzcy5yZXBsYWNlKC9cXGJbKy1dP1tcXGQuXStyZW07P1xcYi9nLCBmdW5jdGlvbiAobSkge1xuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChtKSAqIDc1ICogd2VleC5jb25maWcuZW52LnNjYWxlICsgJ3B4J1xuICAgICAgfSlcbiAgICAgIHV0aWxzLmFwcGVuZENzcyhjc3MsIGB3ZWV4LWNtcC0ke25hbWV9YClcbiAgICAgIGRlbGV0ZSBjb21wb25lbnQuX2Nzc1xuICAgIH1cbiAgICB0aGlzLl9fdnVlX18uY29tcG9uZW50KG5hbWUsIGNvbXBvbmVudClcbiAgfSxcblxuICAvLyBAZGVwcmVjYXRlZFxuICBnZXRSb290ICgpIHt9LFxuXG4gIC8vIEBkZXByZWNhdGVkXG4gIHNlbmRlcjoge1xuICAgIHBlcmZvcm1DYWxsYmFjayAoY2FsbGJhY2ssIGRhdGEsIGtlZXBBbGl2ZSkge1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZGF0YSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9LFxuXG4gIC8vIEBkZXByZWNhdGVkXG4gIGluc3RhbGwgKG1vZHVsZSkge1xuICAgIG1vZHVsZS5pbml0KHRoaXMpXG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHdlZXguZG9jdW1lbnQuYm9keSwgJ2NoaWxkcmVuJywge1xuICBnZXQgKCkgeyByZXR1cm4gX3Jvb3RzIH1cbn0pXG5cbjsgWydvbicsICdvbmNlJywgJ29mZicsICdlbWl0J10uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gIHdlZXhbbWV0aG9kXSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgaWYgKCF0aGlzLl92dWUpIHtcbiAgICAgIHRoaXMuX3Z1ZSA9IG5ldyB0aGlzLl9fdnVlX18oKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdnVlW2AkJHttZXRob2R9YF0oLi4uYXJncylcbiAgfVxufSlcblxuZXhwb3J0IGRlZmF1bHQgd2VleFxuIiwiIC8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vLyBAZmxvd1xuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3OiBwZXJmIGRhdGEgcmVjb3JkZXIuXG4gKi9cblxuZXhwb3J0IGNvbnN0IHBlcmY6IHtcbiAgdGltZToge31cbn0gPSB3aW5kb3cuX3dlZXhfcGVyZiA9IHtcbiAgdGltZToge31cbn1cblxuY29uc3QgdG1wID0ge31cblxuZnVuY3Rpb24gZ2V0Tm93ICgpOiBudW1iZXIge1xuICBjb25zdCBwZXJmb3JtYW5jZSA9IHdpbmRvdy5wZXJmb3JtYW5jZVxuICByZXR1cm4gcGVyZm9ybWFuY2UgJiYgcGVyZm9ybWFuY2Uubm93ID8gcGVyZm9ybWFuY2Uubm93KCkgOiBuZXcgRGF0ZSgpLmdldFRpbWUoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFnQmVnaW4gKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICB0bXBbbmFtZV0gPSBnZXROb3coKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFnRW5kIChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgbGV0IHByZSA9IHBlcmYudGltZVtuYW1lXVxuICBpZiAoIXByZSkge1xuICAgIHByZSA9IDBcbiAgfVxuICBwZXJmLnRpbWVbbmFtZV0gPSBwcmUgKyBnZXROb3coKSAtIHRtcFtuYW1lXVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQge1xuICBjYW1lbGl6ZUtleXMsXG4gIC8vIGh5cGhlbmF0ZUtleXMsXG4gIGV4dGVuZCxcbiAgZXh0ZW5kVHJ1dGh5LFxuICB0cmltQ29tbWVudCxcbiAgbm9ybWFsaXplU3R5bGUsXG4gIGF1dG9QcmVmaXgsXG4gIGlzQXJyYXksXG4gIGdldFBhcmVudFNjcm9sbGVyLFxuICBzdXBwb3J0U3RpY2t5LFxuICBhcHBlbmRDc3Ncbn0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgeyB0YWdCZWdpbiwgdGFnRW5kIH0gZnJvbSAnLi4vdXRpbHMvcGVyZidcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cbmxldCBwc2V1ZG9JZCA9IDBcbi8qKlxuICogZ2V0IHNjb3BlZCBjbGFzcyBzdHlsZSBtYXAgZnJvbSBzdHlsZXNoZWV0cyBpbiA8aGVhZD4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIZWFkU3R5bGVNYXAgKCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICB0YWdCZWdpbignZ2V0SGVhZFN0eWxlTWFwJylcbiAgfVxuICBjb25zdCBuZWVkVG9SZW1vdmVTdHlsZVNoZWV0Tm9kZXMgPSBbXVxuICBjb25zdCBzdHlsZVNoZWV0c0FyciA9IEFycmF5LmZyb20oZG9jdW1lbnQuc3R5bGVTaGVldHMgfHwgW10pLmZpbHRlcihmdW5jdGlvbiAoc3R5bGVTaGVldCkge1xuICAgIHJldHVybiBzdHlsZVNoZWV0Lm93bmVyTm9kZS5nZXRBdHRyaWJ1dGUoJ3dlZXgtc2Nhbm5lZCcpICE9PSAnMSdcbiAgfSlcblxuICBjb25zdCByZXMgPSBBcnJheS5mcm9tKHN0eWxlU2hlZXRzQXJyKVxuICAgIC5yZWR1Y2UoKHByZSwgc3R5bGVTaGVldCkgPT4ge1xuICAgICAgc3R5bGVTaGVldC5vd25lck5vZGUuc2V0QXR0cmlidXRlKCd3ZWV4LXNjYW5uZWQnLCAxKVxuICAgICAgLyoqXG4gICAgICAgKiB3aHkgbm90IHVzaW5nIHN0eWxlU2hlZXQucnVsZXMgfHwgc3R5bGVTaGVldC5jc3NSdWxlcyB0byBnZXQgY3NzIHJ1bGVzID9cbiAgICAgICAqIGJlY2F1c2Ugd2VleCdzIGNvbXBvbmVudHMgZGVmaW5lZCBub24tc3RhbmRhcmQgc3R5bGUgYXR0cmlidXRlcywgd2hpY2ggaXNcbiAgICAgICAqIGF1dG8gaWdub3JlZCB3aGVuIGFjY2VzcyBydWxlLmNzc1RleHQuXG4gICAgICAgKiBhbm90aGVyIHJlYXNvbiBub3QgdG8gdXNlIGNzc1J1bGVzIGRpcmVjdHk6XG4gICAgICAgKiBAaXNzdWU6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzIxNjQyMjc3L3NlY3VyaXR5LWVycm9yLXRoZS1vcGVyYXRpb24taXMtaW5zZWN1cmUtaW4tZmlyZWZveC1kb2N1bWVudC1zdHlsZXNoZWV0c1xuICAgICAgICovXG4gICAgICBpZiAoXG4gICAgICAgIC8vIGNzcyBpbiBhIGxpbmsuIGp1c3QgaWdub3JlIHRoaXMuIHByb2JhYmx5IGEgbGluayBzdHlsZXNoZWV0LlxuICAgICAgICAoc3R5bGVTaGVldC5vd25lck5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnbGluaycpXG4gICAgICAgIHx8ICFzdHlsZVNoZWV0Lm93bmVyTm9kZS50ZXh0Q29udGVudFxuICAgICAgICAvLyBwc2V1ZG8gY2xhc3Mgc3R5bGVTaGVldCBub2RlIGlzIGdlbmVyYXRlZCBieSB3ZWV4LiBqdXN0IGlnbm9yZSBpdC5cbiAgICAgICAgfHwgc3R5bGVTaGVldC5vd25lck5vZGUuaWQubWF0Y2goL3dlZXgtcHNldWRvLVxcZCsvKSkge1xuICAgICAgICByZXR1cm4gcHJlXG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIHN0YXJ0IHRvIGFuYWx5emUgaXQncyBjb250ZW50LlxuICAgICAgICovXG4gICAgICBjb25zdCBzdHJBcnIgPSB0cmltQ29tbWVudChzdHlsZVNoZWV0Lm93bmVyTm9kZS50ZXh0Q29udGVudC50cmltKCkpLnNwbGl0KC99LylcbiAgICAgIGNvbnN0IGxlbiA9IHN0ckFyci5sZW5ndGhcbiAgICAgIGNvbnN0IHJ1bGVzID0gW11cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgY29uc3Qgc3RyID0gc3RyQXJyW2ldXG4gICAgICAgIGlmICghc3RyIHx8IHN0ci5tYXRjaCgvXlxccyokLykpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBzaG91bGQgbWF0Y2ggdGhlc2UgY2FzZXM6XG4gICAgICAgICAqIC5hW2RhdGEtdi14eHhdIHsgY29sb3I6IHJlZDsgfVxuICAgICAgICAgKiAuYVtkYXRhLXYteHh4XTphY3RpdmUgeyBjb2xvcjogZ3JlZW47IH1cbiAgICAgICAgICogLmFbZGF0YS12LXh4eF0sIC5iW2RhdGEtdi14eHhdIHsgY29sb3I6IHJlZDsgfVxuICAgICAgICAgKlxuICAgICAgICAgKiBzaG91bGQgbm90IG1hdGNoIHRoZXNlIGNhc2VzOlxuICAgICAgICAgKiAuYSB7IGNvbG9yOiByZWQ7IH1cbiAgICAgICAgICogZXRjLlxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgbWF0Y2ggPSBzdHIubWF0Y2goLygoPzosP1xccypcXC5bXFx3LV0rXFxbZGF0YS12LVxcdytcXF0oPzo6XFx3Kyk/KSspXFxzKih7W159XSspLylcbiAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgIC8vIG5vdCB0aGUgdnVlIHN0YXRpYyBjbGFzcyBzdHlsZXMgbWFwLiBzbyBhY3F1aXJlIG5vIHJ1bGVzIGZvciB0aGlzIHN0eWxlU2hlZXQuXG4gICAgICAgICAgLy8ganVzdCBqdW1wIHRocm91Z2ggdGhpcyBzdHlsZVNoZWV0IGFuZCBnbyB0byBhbmFseXppbmcgbmV4dC5cbiAgICAgICAgICByZXR1cm4gcHJlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2xzTm1zID0gbWF0Y2hbMV0uc3BsaXQoJywnKS5tYXAobiA9PiBuLnRyaW0oKSlcbiAgICAgICAgY29uc3QgY3NzVGV4dCA9IG1hdGNoWzJdLnJlcGxhY2UoL1t7fV0vZywgJycpLnRyaW0oKVxuICAgICAgICBsZXQgY2xzTm1zSWR4ID0gMFxuICAgICAgICBjb25zdCBjbHNObXNMZW4gPSBjbHNObXMubGVuZ3RoXG4gICAgICAgIHdoaWxlIChjbHNObXNJZHggPCBjbHNObXNMZW4pIHtcbiAgICAgICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAgICAgIHNlbGVjdG9yVGV4dDogY2xzTm1zW2Nsc05tc0lkeF0sXG4gICAgICAgICAgICBjc3NUZXh0XG4gICAgICAgICAgfSlcbiAgICAgICAgICBjbHNObXNJZHgrK1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBBcnJheS5mcm9tKHJ1bGVzKS5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgICAgICBjb25zdCBzZWxlY3RvciA9IHJ1bGUuc2VsZWN0b3JUZXh0IHx8ICcnXG4gICAgICAgIGxldCBpc1BzZXVkbyA9IGZhbHNlXG4gICAgICAgIGlmIChzZWxlY3Rvci5tYXRjaCgvOig/OmFjdGl2ZXxmb2N1c3xlbmFibGVkfGRpc2FibGVkKS8pKSB7XG4gICAgICAgICAgaXNQc2V1ZG8gPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3R5bGVPYmogPSB0cmltQ29tbWVudChydWxlLmNzc1RleHQpLnNwbGl0KCc7JylcbiAgICAgICAgICAucmVkdWNlKChzdHlsZU9iaiwgc3RhdGVtZW50KSA9PiB7XG4gICAgICAgICAgICBzdGF0ZW1lbnQgPSBzdGF0ZW1lbnQudHJpbSgpXG4gICAgICAgICAgICBpZiAoc3RhdGVtZW50ICYmIHN0YXRlbWVudC5pbmRleE9mKCcvKicpIDw9IC0xKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc0FyciA9IHN0YXRlbWVudC5zcGxpdCgnOicpLm1hcCgocGFydCkgPT4gcGFydC50cmltKCkpXG4gICAgICAgICAgICAgIHN0eWxlT2JqW3Jlc0FyclswXV0gPSByZXNBcnJbMV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdHlsZU9ialxuICAgICAgICAgIH0sIHt9KVxuICAgICAgICBpZiAoaXNQc2V1ZG8pIHtcbiAgICAgICAgICBjb25zdCB0eHQgPSBPYmplY3Qua2V5cyhzdHlsZU9iaikucmVkdWNlKGZ1bmN0aW9uIChwcmUsIGN1cikge1xuICAgICAgICAgICAgcmV0dXJuIHByZSArIGAke2N1cn06JHtzdHlsZU9ialtjdXJdfSFpbXBvcnRhbnQ7YFxuICAgICAgICAgIH0sICcnKVxuICAgICAgICAgIGFwcGVuZENzcyhgJHtzZWxlY3Rvcn17JHt0eHR9fWAsIGB3ZWV4LXBzZXVkby0ke3BzZXVkb0lkKyt9YClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvYmpNYXAgPSAhaXNQc2V1ZG8gPyBwcmUgOiBwcmUucHNldWRvXG4gICAgICAgIGNvbnN0IHJlcyA9IG9iak1hcFtzZWxlY3Rvcl1cbiAgICAgICAgaWYgKCFyZXMpIHtcbiAgICAgICAgICBvYmpNYXBbc2VsZWN0b3JdID0gc3R5bGVPYmpcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBleHRlbmQob2JqTWFwW3NlbGVjdG9yXSwgc3R5bGVPYmopXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAvKipcbiAgICAgICAqIHJlbW92ZSB0aGlzIHN0eWxlU2hlZXQgbm9kZSBzaW5jZSBpdCdzIGluIHRoZSBzdHlsZU1hcCBhbHJlYWR5LiBBbmQgdGhpcyBzdHlsZVxuICAgICAgICogc2hvdWxkIG9ubHkgYmUgZmV0Y2hlZCBhbmQgdXNlZCBmcm9tIHN0eWxlTWFwIHRvIGdlbmVyYXRlIHRoZSBmaW5hbCBjb21iaW5lZFxuICAgICAgICogY29tcG9uZW50IHN0eWxlLCBub3QgZnJvbSB0aGUgc3R5bGVzaGVldCBpdHNlbGYuXG4gICAgICAgKi9cbiAgICAgIG5lZWRUb1JlbW92ZVN0eWxlU2hlZXROb2Rlcy5wdXNoKHN0eWxlU2hlZXQub3duZXJOb2RlKVxuICAgICAgcmV0dXJuIHByZVxuICAgIH0sIHsgcHNldWRvOiB7fX0pXG4gIGlmICghd2luZG93Ll9ub19yZW1vdmVfc3R5bGVfc2hlZXRzKSB7XG4gICAgbmVlZFRvUmVtb3ZlU3R5bGVTaGVldE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKVxuICAgIH0pXG4gIH1cbiAgZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICBjb25zb2xlLndhcm4oYFt2dWUtcmVuZGVyXSB5b3UndmUgZGVmaW5lZCAnX25vX3JlbW92ZV9zdHlsZV9zaGVldHMnIGFuZCB0aGUgdi1kYXRhLXh4IHN0eWxlc2hlZXRzIHdpbGwgbm90IGJlIHJlbW92ZWQuYClcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICB0YWdFbmQoJ2dldEhlYWRTdHlsZU1hcCcpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG4vLyBleHBvcnQgZnVuY3Rpb24gZ2V0U2NvcGVJZHMgKGNvbnRleHQpIHtcbi8vICAgY29uc3QgYXJyID0gW11cbi8vICAgbGV0IGN0eCA9IGNvbnRleHRcbi8vICAgbGV0IHNjb3BlSWRcbi8vICAgd2hpbGUgKGN0eCkge1xuLy8gICAgIHNjb3BlSWQgPSBjdHguJG9wdGlvbnMuX3Njb3BlSWRcbi8vICAgICBzY29wZUlkICYmIGFyci5wdXNoKHNjb3BlSWQpXG4vLyAgICAgY3R4ID0gY3R4LiRvcHRpb25zLnBhcmVudFxuLy8gICB9XG4vLyAgIHJldHVybiBhcnJcbi8vIH1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjb3BlSWQgKHZub2RlKSB7XG4gIHJldHVybiB2bm9kZS5jb250ZXh0LiRvcHRpb25zLl9zY29wZUlkXG59XG5cbi8qKlxuICogZ2V0IHN0eWxlIGluIDxzdHlsZSBzY29wZWQ+IHRhZ3MgZm9yIHRoaXMgY29tcG9uZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NvcGVTdHlsZSAodm5vZGUsIGNsYXNzTmFtZXMpIHtcbiAgY29uc3Qgc2NvcGVJZCA9IGdldFNjb3BlSWQodm5vZGUpXG4gIGNvbnN0IHN0eWxlID0ge31cbiAgY29uc3Qgc3R5bGVNYXAgPSB3ZWV4Ll9zdHlsZU1hcCB8fCB7fVxuICBsZXQgY2xzTm1zSWR4ID0gMFxuICBjb25zdCBjbHNObXNMZW4gPSBjbGFzc05hbWVzLmxlbmd0aFxuICB3aGlsZSAoY2xzTm1zSWR4IDwgY2xzTm1zTGVuKSB7XG4gICAgY29uc3QgY2xzID0gYC4ke2NsYXNzTmFtZXNbY2xzTm1zSWR4XX1bJHtzY29wZUlkfV1gXG4gICAgY29uc3QgbWFwID0gc3R5bGVNYXBbY2xzXVxuICAgIG1hcCAmJiBleHRlbmRUcnV0aHkoc3R5bGUsIG1hcClcbiAgICBjbHNObXNJZHgrK1xuICB9XG4gIHJldHVybiBjYW1lbGl6ZUtleXMoc3R5bGUpXG59XG5cbmZ1bmN0aW9uIGdldFN0eWxlICh2bm9kZSwgZXh0cmFjdCkge1xuICBjb25zdCBkYXRhID0gdm5vZGUuZGF0YSB8fCB7fVxuICBjb25zdCBzdGF0aWNDbGFzc05hbWVzID0gKHR5cGVvZiBkYXRhLnN0YXRpY0NsYXNzID09PSAnc3RyaW5nJykgPyBkYXRhLnN0YXRpY0NsYXNzLnNwbGl0KCcgJykgOiAoZGF0YS5zdGF0aWNDbGFzcyB8fCBbXSlcbiAgY29uc3QgY2xhc3NOYW1lcyA9ICh0eXBlb2YgZGF0YS5jbGFzcyA9PT0gJ3N0cmluZycpID8gZGF0YS5jbGFzcy5zcGxpdCgnICcpIDogKGRhdGEuY2xhc3MgfHwgW10pXG4gIGNvbnN0IGNsc05tcyA9IHN0YXRpY0NsYXNzTmFtZXMuY29uY2F0KGNsYXNzTmFtZXMpXG4gIGNvbnN0IHN0eWxlID0gbm9ybWFsaXplU3R5bGUoZ2V0U2NvcGVTdHlsZSh2bm9kZSwgY2xzTm1zKSlcbiAgLyoqXG4gICAqIGNhY2hlIHN0YXRpYyBzdHlsZSBhbmQgYmluZCBzdHlsZS5cbiAgICogY2FjaGVkIHN0YXRpY1N0eWxlIChpbmNsdWRpbmcgc3R5bGUgYW5kIHN0YXRpY1N0eWxlKSBoYXMgYWxyZWFkeSBiZWVuIG5vcm1hbGl6ZWRcbiAgICogaW4gJHByb2Nlc3NTdHlsZS4gU28gdGhlcmUncyBubyBuZWVkIHRvIG5vcm1hbGl6ZSBpdCBhZ2Fpbi5cbiAgICovXG4gIGlmICghZGF0YS5jYWNoZWQpIHtcbiAgICAvLyBjYWNoZSBzdGF0aWNTdHlsZSBvbmNlIGluIHRoZSBiZWdpbm5pbmcuXG4gICAgZGF0YS5jYWNoZWQgPSBleHRlbmRUcnV0aHkoe30sIGRhdGEuc3RhdGljU3R5bGUpXG4gIH1cbiAgLy8gY2FjaGUgYmluZGluZyBzdHlsZSBldmVyeSB0aW1lIHNpbmNlIHRoZSBiaW5kaW5nIHN0eWxlIGlzIHZhcmlhYmxlLlxuICBleHRlbmRUcnV0aHkoZGF0YS5jYWNoZWQsIGRhdGEuc3R5bGUpXG4gIGV4dGVuZChzdHlsZSwgZGF0YS5jYWNoZWQpXG4gIGRhdGEuc3RhdGljU3R5bGUgPSBzdHlsZVxuICBpZiAoZXh0cmFjdCkge1xuICAgIGRlbGV0ZSBkYXRhLnN0YXRpY1N0eWxlXG4gICAgZGVsZXRlIGRhdGEuc3R5bGVcbiAgfVxuICByZXR1cm4gc3R5bGVcbn1cblxuLyoqXG4gKiBnZXQgc3R5bGUgbWVyZ2VkIHdpdGggc3RhdGljIHN0eWxlcywgYmluZGluZyBzdHlsZXMsIGFuZCBzY29wZWQgY2xhc3Mgc3R5bGVzLFxuICogd2l0aCBrZXlzIGluIGNhbWVsY2FzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBvbmVudFN0eWxlIChjb250ZXh0LCBleHRyYWN0KSB7XG4gIGlmICghY29udGV4dC4kdm5vZGUpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKCdbdnVlLXJlbmRlcl0gZ2V0Q29tcG9uZW50U3R5bGUgZmFpbGVkOiBubyAkdm5vZGUgaW4gY29udGV4dC4nKVxuICAgIH1cbiAgICByZXR1cm4ge31cbiAgfVxuICBsZXQgc3R5bGUgPSB7fVxuICBsZXQgdm5vZGUgPSBjb250ZXh0LiR2bm9kZVxuICB3aGlsZSAodm5vZGUpIHtcbiAgICBleHRlbmQoc3R5bGUsIGdldFN0eWxlKHZub2RlLCBleHRyYWN0KSlcbiAgICB2bm9kZSA9IHZub2RlLnBhcmVudFxuICB9XG4gIHN0eWxlID0gYXV0b1ByZWZpeChzdHlsZSlcbiAgLyoqXG4gICAqIHdoZW4gcHJlZml4ZWQgdmFsdWUgaXMgYSBhcnJheSwgaXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gZWxlbWVudFxuICAgKiBkdXJpbmcgdGhlIG5leHQgdGljay5cbiAgICogZS5nLlxuICAgKiAgYmFja2dyb3VuZC1pbWFnZTogIGxpbmVhci1ncmFkaWVudCh0byB0b3AsI2Y1ZmVmZCwjZmZmZmZmKTtcbiAgICogIHdpbGwgZ2VuZXJhdGU6XG4gICAqICB7XG4gICAqICAgIGJhY2tncm91bmRJbWFnZTogW1xuICAgKiAgICAgIFwiLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG8gdG9wLCNmNWZlZmQsI2ZmZmZmZilcIixcbiAgICogICAgICBcIi1tb3otbGluZWFyLWdyYWRpZW50KHRvIHRvcCwjZjVmZWZkLCNmZmZmZmYpXCIsXG4gICAqICAgICAgXCJsaW5lYXItZ3JhZGllbnQodG8gdG9wLCNmNWZlZmQsI2ZmZmZmZilcIl1cbiAgICogIH1cbiAgICovXG4gIGZvciAoY29uc3QgayBpbiBzdHlsZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHN0eWxlW2tdKSkge1xuICAgICAgY29uc3QgdmFscyA9IHN0eWxlW2tdXG4gICAgICBjb250ZXh0LiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGVsID0gY29udGV4dC4kZWxcbiAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBlbC5zdHlsZVtrXSA9IHZhbHNbaV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZiAoayAhPT0gJ3Bvc2l0aW9uJykgeyBkZWxldGUgc3R5bGVba10gfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBwb3NpdGlvbiBpcyAnc3RpY2t5JywgdGhlbiBhZGQgaXQgdG8gdGhlIHN0aWNreUNoaWxkcmVuIG9mIHRoZSBwYXJlbnQgc2Nyb2xsZXIuXG4gICAqL1xuICBjb25zdCBwb3MgPSBzdHlsZS5wb3NpdGlvblxuICBjb25zdCByZWcgPSAvc3RpY2t5JC9cbiAgaWYgKHBvcyA9PT0gJ2ZpeGVkJykge1xuICAgIGNvbnRleHQuJG5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGVsID0gY29udGV4dC4kZWxcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKCd3ZWV4LWZpeGVkJylcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIGVsc2UgaWYgKGlzQXJyYXkocG9zKSAmJiBwb3NbMF0ubWF0Y2gocmVnKSB8fCAocG9zICsgJycpLm1hdGNoKHJlZykpIHtcbiAgICBkZWxldGUgc3R5bGUucG9zaXRpb25cbiAgICAvLyB1c2UgbmF0aXZlIHN0aWNreS5cbiAgICBpZiAoc3VwcG9ydFN0aWNreSgpKSB7XG4gICAgICBjb250ZXh0LiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGVsID0gY29udGV4dC4kZWxcbiAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnd2VleC1pb3Mtc3RpY2t5JylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgLy8gdXNlIHJlLWltcGxlbWVudGF0aW9uIG9mIHN0aWNreS5cbiAgICBlbHNlIGlmICghY29udGV4dC5fc3RpY2t5QWRkZWQpIHtcbiAgICAgIGNvbnN0IHVpZCA9IGNvbnRleHQuX3VpZFxuICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBnZXRQYXJlbnRTY3JvbGxlcihjb250ZXh0KVxuICAgICAgaWYgKHNjcm9sbGVyKSB7XG4gICAgICAgIGNvbnRleHQuX3N0aWNreUFkZGVkID0gdHJ1ZVxuICAgICAgICBpZiAoIXNjcm9sbGVyLl9zdGlja3lDaGlsZHJlbikge1xuICAgICAgICAgIHNjcm9sbGVyLl9zdGlja3lDaGlsZHJlbiA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgc2Nyb2xsZXIuX3N0aWNreUNoaWxkcmVuW3VpZF0gPSBjb250ZXh0XG4gICAgICB9XG4gICAgICBjb250ZXh0LiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGVsID0gY29udGV4dC4kZWxcbiAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgY29udGV4dC5faW5pdE9mZnNldFRvcCA9IGVsLm9mZnNldFRvcFxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdHlsZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdENvbXBvbmVudFN0eWxlIChjb250ZXh0KSB7XG4gIHJldHVybiBnZXRDb21wb25lbnRTdHlsZShjb250ZXh0LCB0cnVlKVxufVxuXG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgaXNBcnJheSB9IGZyb20gJy4uL3V0aWxzJ1xuXG4vKipcbiAqIHJlbW92ZSB0ZXh0IG5vZGVzIGluIHRoZSBub2RlcyBhcnJheS5cbiAqIEBwYXJhbSAge0FycmF5fSBub2Rlc1xuICogQHJldHVybiB7QXJyYXl9IG5vZGVzIHdpdGhvdXQgdGV4dCBub2Rlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaW1UZXh0Vk5vZGVzICh2bm9kZXMpIHtcbiAgaWYgKGlzQXJyYXkodm5vZGVzKSkge1xuICAgIHJldHVybiB2bm9kZXMuZmlsdGVyKHZub2RlID0+ICEhdm5vZGUudGFnKVxuICB9XG4gIHJldHVybiB2bm9kZXNcbn1cblxuLyoqXG4gKiBnZXQgbGlzdGVuZXJzIGZyb20gb24gY29uZmlnIGFuZCB2LW9uIGJpbmRpbmcuXG4gKiB2LW9uIGJpbmRpbmcgaGFzIGEgcHJpb3JpdHkgb3ZlciBvbiBjb25maWcuXG4gKiBAcGFyYW0ge3Zub2RlfSB2bm9kZVxuICogQHBhcmFtIHtTdHJpbmd9IGV2dDogZXZlbnQgbmFtZS5cbiAqL1xuZnVuY3Rpb24gZ2V0TGlzdGVuZXJzICh2bm9kZSwgZXZ0KSB7XG4gIGNvbnN0IGhhbmRsZXJzID0gW11cbiAgd2hpbGUgKHZub2RlKSB7XG4gICAgaWYgKHZub2RlLmRhdGEgJiYgdm5vZGUuZGF0YS5vbikge1xuICAgICAgY29uc3QgaGFuZGxlciA9IHZub2RlLmRhdGEub25bZXZ0XVxuICAgICAgaGFuZGxlciAmJiBoYW5kbGVycy5wdXNoKGhhbmRsZXIpXG4gICAgfVxuICAgIGlmICh2bm9kZS5jb21wb25lbnRPcHRpb25zICYmIHZub2RlLmNvbXBvbmVudE9wdGlvbnMubGlzdGVuZXJzKSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gdm5vZGUuY29tcG9uZW50T3B0aW9ucy5saXN0ZW5lcnNbZXZ0XVxuICAgICAgaGFuZGxlciAmJiBoYW5kbGVycy5wdXNoKGhhbmRsZXIpXG4gICAgfVxuICAgIHZub2RlID0gdm5vZGUucGFyZW50XG4gIH1cbiAgcmV0dXJuIGhhbmRsZXJzXG59XG5cbi8qKlxuICogSW5zdGVhZCBvZiB2dWUncyBpbnZva2VyLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBjaGVjayBpZiB0aGUgYmluZGluZyBmdW5jdGlvblxuICogaGFzIGEgX3dlZXhfaG9vayBmbGFnLiBJZiB0aGVyZSBpcyBvbmUsIHRoZSBoYW5kbGVyIHNob3VsZCBub3QgYmUgdHJpZ2dlcmVkLlxuICogQHBhcmFtIHtBcnJheSB8IEZ1bmN0aW9ufSBmbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5Rm5zIChmbnMsIC4uLmFyZ3MpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZm5zKSkge1xuICAgIGNvbnN0IGNsb25lZCA9IGZucy5zbGljZSgpXG4gICAgY29uc3QgbGVuID0gY2xvbmVkLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGZuID0gY2xvbmVkW2ldXG4gICAgICBpZiAoZm4uX3dlZXhfaG9vaykge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgZm4uYXBwbHkobnVsbCwgYXJncylcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgaWYgKCFmbnMuX3dlZXhfaG9vaykge1xuICAgICAgZm5zLmFwcGx5KG51bGwsIGFyZ3MpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogZW1pdCBuYXRpdmUgZXZlbnRzIHRvIGVuYWJsZSB2LW9uLlxuICogQHBhcmFtIHtWQ29tcG9uZW50fSBjb250ZXh0OiB3aGljaCBvbmUgdG8gZW1pdCBhIGV2ZW50IG9uLlxuICogQHBhcmFtIHthcnJheSB8IG9iamVjdH0gZXZlbnRzOiBleHRyYSBldmVudHMuIFlvdSBjYW4gcGFzcyBpbiBtdWx0aXBsZSBhcmd1bWVudHMgaGVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50TWFwIChjb250ZXh0LCAuLi5ldmVudHMpIHtcbiAgY29uc3QgZXZlbnRNYXAgPSB7fVxuICAvKipcbiAgICogQmluZCBzb21lIG9yaWdpbmFsIHR5cGUgZXZlbnQgdG8geW91ciBzcGVjaWZpZWQgdHlwZSBldmVudCBoYW5kbGVyLlxuICAgKiBlLmcuIGJpbmQgJ3RhcCcgZXZlbnQgdG8gJ2NsaWNrJyBldmVudCBsaXN0ZW5lcjogYmluZEZ1bmMoJ3RhcCcpKCdjbGljaycpLlxuICAgKiBPciBiaW5kIGNlcnRpYW4gZXZlbnQgd2l0aCB5b3VyIHNwZWNpZmllZCBoYW5kbGVyOiBiaW5kRnVuYygnY2xpY2snLCBzb21lRnVuY3Rpb24pXG4gICAqL1xuICBjb25zdCBiaW5kRnVuYyA9IChvcmlnaW5hbFR5cGUpID0+IHtcbiAgICByZXR1cm4gbGlzdGVuVG8gPT4ge1xuICAgICAgbGV0IGhhbmRsZXJcbiAgICAgIGNvbnN0IGV2dE5hbWUgPSBvcmlnaW5hbFR5cGUgfHwgbGlzdGVuVG9cbiAgICAgIGlmICh0eXBlb2YgbGlzdGVuVG8gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaGFuZGxlciA9IGxpc3RlblRvXG4gICAgICB9XG4gICAgICBlbHNlIGlmICh0eXBlb2YgbGlzdGVuVG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIHVzZSAnX3RyaWdnZXJlZCcgdG8gY29udHJvbCBhY3R1cmFsIGJ1YmJsaW5nIChhbGxvdyBvcmlnaW5hbCBidWJibGluZykuXG4gICAgICAgICAgICovXG4gICAgICAgICAgaWYgKGUuX3RyaWdnZXJlZCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIHRyaWdnZXIgdGhlIGNsb3Nlc3QgcGFyZW50IHdoaWNoIGhhcyBib3VuZCBldmVudCBoYW5kbGVycy5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBsZXQgdm0gPSBjb250ZXh0XG4gICAgICAgICAgd2hpbGUgKHZtKSB7XG4gICAgICAgICAgICBjb25zdCBvbnMgPSBnZXRMaXN0ZW5lcnModm0uX3Zub2RlIHx8IHZtLiR2bm9kZSwgbGlzdGVuVG8pXG4gICAgICAgICAgICBjb25zdCBsZW4gPSBvbnMubGVuZ3RoXG4gICAgICAgICAgICBpZiAobGVuID4gMCkge1xuICAgICAgICAgICAgICBsZXQgaWR4ID0gMFxuICAgICAgICAgICAgICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb24gPSBvbnNbaWR4XVxuICAgICAgICAgICAgICAgIGFwcGx5Rm5zKG9uLmZucywgZSlcbiAgICAgICAgICAgICAgICBpZHgrK1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIG9uY2UgYSBwYXJlbnQgbm9kZSAob3Igc2VsZiBub2RlKSBoYXMgdHJpZ2dlcmVkIHRoZSBoYW5kbGVyLCB0aGVuXG4gICAgICAgICAgICAgIC8vIGl0IHN0b3BzIGJ1YmJsaW5nIGltbWVkaWF0ZWx5LCBhbmQgYSAnX3RyaWdnZXJlZCcgb2JqZWN0IGlzIHNldC5cbiAgICAgICAgICAgICAgZS5fdHJpZ2dlcmVkID0ge1xuICAgICAgICAgICAgICAgIGVsOiB2bS4kZWxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZtID0gdm0uJHBhcmVudFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBmbGFnIHRvIGRpc3Rpbmd1aXNoIGZyb20gdXNlci1iaW5kaW5nIGxpc3RlbmVycy5cbiAgICAgICAgaGFuZGxlci5fd2VleF9ob29rID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKCFldmVudE1hcFtldnROYW1lXSkge1xuICAgICAgICBldmVudE1hcFtldnROYW1lXSA9IFtdXG4gICAgICB9XG4gICAgICBldmVudE1hcFtldnROYW1lXS5wdXNoKGhhbmRsZXIpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGNvbXBvbmVudCdzIGV4dHJhIGV2ZW50IGJpbmRpbmdzLiBUaGlzIGlzIG1vc3RseSBmb3IgdGhlIG5lZWRzIG9mIGNvbXBvbmVudCdzXG4gICAqIG93biBzcGVjaWFsIGJlaGF2aW91cnMuIFRoZXNlIGhhbmRsZXJzIHdpbGwgYmUgcHJvY2Vzc2VkIGFmdGVyIHRoZSB1c2VyJ3NcbiAgICogY29ycmVzcG9uZGluZyBldmVudCBoYW5kbGVycy5cbiAgICovXG4gIGlmIChldmVudHMpIHtcbiAgICBjb25zdCBsZW4gPSBldmVudHMubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgZXh0cmEgPSBldmVudHNbaV1cbiAgICAgIGlmIChpc0FycmF5KGV4dHJhKSkge1xuICAgICAgICBleHRyYS5mb3JFYWNoKGJpbmRGdW5jKCkpXG4gICAgICB9XG4gICAgICBlbHNlIGlmICh0eXBlb2YgZXh0cmEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGV4dHJhKSB7XG4gICAgICAgICAgYmluZEZ1bmMoa2V5KShleHRyYVtrZXldKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV2ZW50TWFwXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vc3R5bGUnXG5leHBvcnQgKiBmcm9tICcuL25vZGUnXG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7XG4gIGdldFRocm90dGxlTGF6eWxvYWQsXG4gIHdhdGNoQXBwZWFyLFxuICB0cmlnZ2VyRGlzYXBwZWFyLFxuICBleHRlbmRcbn0gZnJvbSAnLi4vdXRpbHMnXG5cbmxldCBsYXp5bG9hZFdhdGNoZWQgPSBmYWxzZVxuZnVuY3Rpb24gd2F0Y2hMYXp5bG9hZCAoKSB7XG4gIGxhenlsb2FkV2F0Y2hlZCA9IHRydWVcbiAgOyBbXG4gICAgJ3Njcm9sbCcsXG4gICAgLy8gJ3RyYW5zaXRpb25lbmQnLFxuICAgIC8vICd3ZWJraXRUcmFuc2l0aW9uRW5kJyxcbiAgICAvLyAnYW5pbWF0aW9uZW5kJyxcbiAgICAvLyAnd2Via2l0QW5pbWF0aW9uRW5kJyxcbiAgICAncmVzaXplJ1xuICBdLmZvckVhY2goZXZ0ID0+IHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihldnQsIGdldFRocm90dGxlTGF6eWxvYWQoMjUsIGRvY3VtZW50LmJvZHkpKVxuICB9KVxufVxuXG5sZXQgd2FybmVkID0gZmFsc2VcbmNvbnN0IG5vdGVQYWdlID0gJ2h0dHBzOi8vZ2lzdC5naXRodWIuY29tL01yUmFpbmRyb3AvNWE4MDVhMDY3MTQ2NjA5ZTVjZmQ0ZDY0ZDc3NWQ2OTMjZmlsZS13ZWV4LXZ1ZS1yZW5kZXItY29uZmlnLWZvci12dWUtbG9hZGVyLWpzJ1xuZnVuY3Rpb24gd2FyblByb2Nlc3NTdHlsZSAoKSB7XG4gIGlmICghd2FybmVkKSB7XG4gICAgd2FybmVkID0gdHJ1ZVxuICAgIGNvbnN0IHBhZ2UgPSB3aW5kb3cuX3Byb2Nlc3Nfc3R5bGVfbm90ZV9wYWdlIHx8IG5vdGVQYWdlXG4gICAgY29uc29sZS53YXJuKGBbdnVlLXJlbmRlcl06IHlvdSBzaG91bGQgYWRkIHZ1ZS1sb2FkZXIgY29uZmlnIHdpdGggJHByb2Nlc3NTdHlsZSB0byBlbmFibGUgaW5saW5lIHN0eWxlcydzIGBcbiAgICAgICsgYG5vcm1hbGl6YXRpb24uIHNlZSAke3BhZ2V9IElmIHlvdSBhbHJlYWR5IGRpZCB0aGlzLCBwbGVhc2UgaWdub3JlIHRoaXMgbWVzc2FnZS5gKVxuICB9XG59XG5cbmxldCBpZENudCA9IDBcblxuZXhwb3J0IGRlZmF1bHQge1xuICBiZWZvcmVDcmVhdGUgKCkge1xuICAgIGlmICghbGF6eWxvYWRXYXRjaGVkKSB7XG4gICAgICB3YXRjaExhenlsb2FkKClcbiAgICB9XG4gIH0sXG5cbiAgdXBkYXRlZCAoKSB7XG4gICAgaWYgKHRoaXMuX3Jvb3RJZCkge1xuICAgICAgY29uc3QgZWwgPSB0aGlzLiRlbFxuICAgICAgaWYgKGVsLm5vZGVUeXBlID09PSAxXG4gICAgICAgICYmIGVsLmNsYXNzTmFtZS5pbmRleE9mKCd3ZWV4LXJvb3QnKSA8PSAtMSkge1xuICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKCd3ZWV4LXJvb3QnKVxuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtd3gtcm9vdC1pZCcsIHRoaXMuX3Jvb3RJZClcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogc2luY2UgdGhlIHVwZGF0aW5nIG9mIGNvbXBvbmVudCBtYXkgYWZmZWN0IHRoZSBsYXlvdXQsIHRoZSBsYXp5bG9hZGluZyBzaG91bGRcbiAgICAgKiBiZSBmaXJlZC5cbiAgICAgKi9cbiAgICB0aGlzLl9maXJlTGF6eWxvYWQoKVxuICB9LFxuXG4gIG1vdW50ZWQgKCkge1xuICAgIGlmICh0aGlzID09PSB0aGlzLiRyb290KSB7XG4gICAgICBjb25zdCByb290SWQgPSBgd3gtcm9vdC0ke2lkQ250Kyt9YFxuICAgICAgaWYgKCF3ZWV4Ll9yb290KSB7XG4gICAgICAgIHdlZXguX3Jvb3QgPSB7fVxuICAgICAgfVxuICAgICAgd2VleC5fcm9vdFtyb290SWRdID0gdGhpc1xuICAgICAgdGhpcy5fcm9vdElkID0gcm9vdElkXG4gICAgICBjb25zdCBlbCA9IHRoaXMuJGVsXG4gICAgICBpZiAoZWwubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCd3ZWV4LXJvb3QnKVxuICAgICAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLXd4LXJvb3QtaWQnLCByb290SWQpXG4gICAgICB0aGlzLl9maXJlTGF6eWxvYWQoZWwpXG4gICAgfVxuXG4gICAgLy8gZ2l2ZSB3YXJuaW5nIGZvciBub3QgdXNpbmcgJHByb2Nlc3NTdHlsZSBpbiB2dWUtbG9hZGVyIGNvbmZpZy5cbiAgICBpZiAoIXdhcm5lZCAmJiAhd2luZG93Ll9zdHlsZV9wcm9jZXNzaW5nX2FkZGVkKSB7XG4gICAgICB3YXJuUHJvY2Vzc1N0eWxlKClcbiAgICB9XG5cbiAgICAvLyBiaW5kIGF0dHJzIHRvICRlbC5cbiAgICBsZXQgaSwgalxuICAgIGlmICh0aGlzLiRlbCAmJiAoaSA9IGogPSB0aGlzLiR2bm9kZSkgJiYgKGkgPSBpLmRhdGEpICYmIChqID0gai5jb21wb25lbnRPcHRpb25zKSkge1xuICAgICAgdGhpcy4kZWwuYXR0cnMgPSBleHRlbmQoe30sIGkuYXR0cnMsIGoucHJvcHNEYXRhKVxuICAgIH1cbiAgICB3YXRjaEFwcGVhcih0aGlzLCB0cnVlKVxuICB9LFxuXG4gIGRlc3Ryb3llZCAoKSB7XG4gICAgLyoqXG4gICAgICogaWYgdGhlIGRlc3Ryb3llZCBlbGVtZW50IGlzIGFib3ZlIGFub3RoZXIgcGFuZWwgd2l0aCBpbWFnZXMgaW5zaWRlLCBhbmQgdGhlIGltYWdlc1xuICAgICAqIG1vdmVkIGludG8gdGhlIHZpZXdwb3J0LCB0aGVuIHRoZSBsYXp5bG9hZGluZyBzaG91bGQgYmUgdHJpZ2dlcmVkLlxuICAgICAqL1xuICAgIGlmICh0aGlzLl9yb290SWQpIHtcbiAgICAgIGRlbGV0ZSB3ZWV4Ll9yb290W3RoaXMuX3Jvb3RJZF1cbiAgICAgIGRlbGV0ZSB0aGlzLl9yb290SWRcbiAgICB9XG4gICAgdGhpcy5fZmlyZUxhenlsb2FkKClcbiAgICB0cmlnZ2VyRGlzYXBwZWFyKHRoaXMpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIF9maXJlTGF6eWxvYWQgKGVsKSB7XG4gICAgICBnZXRUaHJvdHRsZUxhenlsb2FkKDI1LCBlbCB8fCBkb2N1bWVudC5ib2R5KSgpXG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7XG4gIGdldEhlYWRTdHlsZU1hcFxufSBmcm9tICcuLi9jb3JlJ1xuXG5pbXBvcnQge1xuICBub3JtYWxpemVTdHlsZSxcbiAgY2FtZWxpemVLZXlzLFxuICBleHRlbmRcbn0gZnJvbSAnLi4vdXRpbHMnXG5cbi8qKlxuICogZ2V0IGEgYmVmb3JlQ3JlYXRlIGhvb2ssIHdoaWNoIGhhcyBhIG1hcmsgdG8gaWRlbnRpZnkgdGhlIGhvb2sgZnVuY3Rpb24gaXRzZWxmLlxuICovXG5mdW5jdGlvbiBnZXRJZGVudGlmaWVkQmVmb3JlQ3JlYXRlICgpIHtcbiAgY29uc3QgZGlzcG9zZWQgPSB7fSAvLyBkaXNwb3NlZCBjb21wb25lbnRzLiBBbHJlYWR5IHNjYW5uZWQuXG4gIGZ1bmN0aW9uIGJlZm9yZUNyZWF0ZSAoKSB7XG4gICAgLyoqXG4gICAgICogZ2V0IHN0YXRpYyBjbGFzcyBzdHlsZSBtYXAgZnJvbSBkb2N1bWVudCdzIHN0eWxlU2hlZXRzLlxuICAgICAqIFdlZXgub24gd2lsbCBjcmVhdGUgYSBWdWUgaW5zdGFuY2UuIEluIHRoaXMgY2FzZSB3ZSdsbCBpZ25vcmUgaXQsIHNpbmNlXG4gICAgICogaXQncyBub3Qgc3VyZSB3aGV0aGVyIHRoZSBzY29wZWQgc3R5bGUgaGFzIGFscmVhZHkgYXR0YWNoZWQgdG8gaGVhZCBvciBub3QuXG4gICAgICovXG4gICAgY29uc3QgdGFnTmFtZSA9IHRoaXMuJG9wdGlvbnMgJiYgdGhpcy4kb3B0aW9ucy5fY29tcG9uZW50VGFnXG4gICAgLyoqXG4gICAgICogRm9yIHZ1ZS1sb2FkZXIgXjExLjMueCwgdGhlcmUncyBubyBpbmplY3RTdHlsZSBmdW5jdGlvbi4gVGhlIHN0eWxlU2hlZXRcbiAgICAgKiBpcyBhbHJlYWR5IGluamVjdGVkIGludG8gdGhlIGhlYWQuIEp1c3Qgc2NhbiBpdC5cbiAgICAgKi9cbiAgICAvLyBhc3luYyBjb21wb25lbnQuXG4gICAgaWYgKCh0aGlzLiR2bm9kZSAmJiB0aGlzLiR2bm9kZS5kYXRhICYmIHRoaXMuJHZub2RlLmRhdGEudGFnID09PSAnY29tcG9uZW50JylcbiAgICAgIHx8ICh0aGlzID09PSB0aGlzLiRyb290ICYmIHRoaXMuJG9wdGlvbnMgJiYgIXRoaXMuX2ZpcnN0U2Nhbm5lZCkpIHtcbiAgICAgIHRoaXMuX2ZpcnN0U2Nhbm5lZCA9IHRydWVcbiAgICAgIGV4dGVuZCh3ZWV4Ll9zdHlsZU1hcCwgZ2V0SGVhZFN0eWxlTWFwKCkpXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZvciB2dWUtbG9hZGVyIF4xMi4wLCB0aGUgaW5qZWN0U3R5bGUgZnVuY3Rpb24gaXMgaG9va2VkLiBXZSBzaG91bGQgc2NhblxuICAgICAqIHN0eWxlIG1hcCBhZnRlciB0aGUgaW5qZWN0U3R5bGUgaG9vayBjYWxsZWQuXG4gICAgICovXG4gICAgaWYgKCgodGhpcyA9PT0gdGhpcy4kcm9vdCAmJiB0aGlzLiRvcHRpb25zKVxuICAgICAgfHwgKHRhZ05hbWVcbiAgICAgICYmICF3ZWV4Ll9jb21wb25lbnRzW3RhZ05hbWVdXG4gICAgICAmJiAhZGlzcG9zZWRbdGFnTmFtZV0pKVxuICAgICAgJiYgIXRoaXMuX3NlY29uZFNjYW5uZWQpIHtcbiAgICAgIGRpc3Bvc2VkW3RhZ05hbWVdID0gMVxuICAgICAgdGhpcy5fc2Vjb25kU2Nhbm5lZCA9IHRydWVcbiAgICAgIGNvbnN0IGhvb2tzID0gdGhpcy4kb3B0aW9ucy5iZWZvcmVDcmVhdGVcbiAgICAgIGNvbnN0IGxlbiA9IGhvb2tzLmxlbmd0aFxuICAgICAgbGV0IHRoaXNIb29rSWR4ID0gMCAvLyBpbmRleCBvZiB0aGlzIGhvb2sgaW4gdGhlIGhvb2tzIGFycmF5LlxuICAgICAgZm9yICg7IHRoaXNIb29rSWR4IDwgbGVuOyB0aGlzSG9va0lkeCsrKSB7XG4gICAgICAgIGlmIChob29rc1t0aGlzSG9va0lkeF0uX3N0eWxlTWl4aW4pIHsgYnJlYWsgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXNIb29rSWR4ICE9PSBsZW4gLSAxKSB7XG4gICAgICAgIGNvbnN0IGZ1bmMgPSBob29rc1tsZW4gLSAxXVxuICAgICAgICBob29rc1tsZW4gLSAxXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBjYWxsIHRoZSBvcmlnaW5hbCBpbmplY3RTdHlsZSBob29rLlxuICAgICAgICAgIGZ1bmMuY2FsbCh0aGlzKVxuICAgICAgICAgIC8vIHNjYW4gdGhlIG5ldyBhcHBlbmRlZCBzdHlsZVNoZWV0LlxuICAgICAgICAgIGV4dGVuZCh3ZWV4Ll9zdHlsZU1hcCwgZ2V0SGVhZFN0eWxlTWFwKCkpXG4gICAgICAgICAgaG9va3NbbGVuIC0gMV0gPSBmdW5jXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgYmVmb3JlQ3JlYXRlLl9zdHlsZU1peGluID0gdHJ1ZVxuICByZXR1cm4gYmVmb3JlQ3JlYXRlXG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgYmVmb3JlQ3JlYXRlOiBnZXRJZGVudGlmaWVkQmVmb3JlQ3JlYXRlKCksXG5cbiAgbWV0aG9kczoge1xuICAgICRwcm9jZXNzU3R5bGUgKHN0eWxlKSB7XG4gICAgICB3aW5kb3cuX3N0eWxlX3Byb2Nlc3NpbmdfYWRkZWQgPSB0cnVlXG4gICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVN0eWxlKGNhbWVsaXplS2V5cyhzdHlsZSkpXG4gICAgfSxcblxuICAgIF9nZXRQYXJlbnRSZWN0ICgpIHtcbiAgICAgIGNvbnN0IHBhcmVudEVsbSA9IHRoaXMuJG9wdGlvbnMuX3BhcmVudEVsbVxuICAgICAgcmV0dXJuIHBhcmVudEVsbSAmJiBwYXJlbnRFbG0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICB9XG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vLyBAZmxvd1xuXG4vLyBpbnB1dCBhbmQgdGV4dGFyZSBoYXMgc29tZSBjb21tb24gYXBpIGFuZCBldmVudFxuaW1wb3J0IHsgZXh0ZW5kIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmNvbnN0IGZpbmRFbnRlcktleVR5cGUgPSBmdW5jdGlvbiAoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBrZXlzID0gWydkZWZhdWx0JywgJ2dvJywgJ25leHQnLCAnc2VhcmNoJywgJ3NlbmQnXVxuICBpZiAoa2V5cy5pbmRleE9mKGtleSkgPiAtMSkge1xuICAgIHJldHVybiBrZXlcbiAgfVxuICByZXR1cm4gJ2RvbmUnXG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWV0aG9kczoge1xuICAgIGZvY3VzICgpIHtcbiAgICAgIHRoaXMuJGVsICYmIHRoaXMuJGVsLmZvY3VzKClcbiAgICB9LFxuICAgIGJsdXIgKCkge1xuICAgICAgdGhpcy4kZWwgJiYgdGhpcy4kZWwuYmx1cigpXG4gICAgfSxcblxuICAgIHNldFNlbGVjdGlvblJhbmdlIChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy4kZWwuc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZClcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW3Z1ZS1yZW5kZXJdIHNldFNlbGVjdGlvblJhbmdlIGlzIG5vdCBzdXBwb3J0ZWQuYClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRTZWxlY3Rpb25SYW5nZSAoY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICAgICAgY29uc3Qgc3RyID0gc2VsZWN0aW9uLnRvU3RyaW5nKClcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uU3RhcnQgPSB0aGlzLiRlbC52YWx1ZS5pbmRleE9mKHN0cilcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uRW5kID0gc2VsZWN0aW9uU3RhcnQgPT09IC0xID8gc2VsZWN0aW9uU3RhcnQgOiBzZWxlY3Rpb25TdGFydCArIHN0ci5sZW5ndGhcbiAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soe1xuICAgICAgICAgIHNlbGVjdGlvblN0YXJ0LFxuICAgICAgICAgIHNlbGVjdGlvbkVuZFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2sobmV3IEVycm9yKCdbdnVlLXJlbmRlcl0gZ2V0U2VsZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuJykpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldEVkaXRTZWxlY3Rpb25SYW5nZSAoY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRTZWxlY3Rpb25SYW5nZShjYWxsYmFjaylcbiAgICB9LFxuXG4gICAgLy8gc3VwcG9ydCBlbnRlciBrZXkgZXZlbnRcbiAgICBjcmVhdGVLZXlib2FyZEV2ZW50IChldmVudHM6IHt9KSB7XG4gICAgICBjb25zdCBjdXN0b21LZXlUeXBlID0gdGhpcy5yZXR1cm5LZXlUeXBlXG4gICAgICBjb25zdCBzZWxmID0gdGhpc1xuICAgICAgaWYgKHRoaXMuX2V2ZW50c1sncmV0dXJuJ10pIHtcbiAgICAgICAgY29uc3Qga2V5Ym9hcmRFdmVudHMgPSB7XG4gICAgICAgICAgJ2tleXVwJzogZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBjb25zdCBjb2RlID0gZXYua2V5Q29kZVxuICAgICAgICAgICAgY29uc3Qga2V5ID0gZXYua2V5XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gMTMpIHtcbiAgICAgICAgICAgICAgaWYgKCFrZXkgfHwga2V5LnRvTG93ZXJDYXNlKCkgPT09ICd0YWInKSB7XG4gICAgICAgICAgICAgICAgZXYua2V5ID0gJ25leHQnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgcmlnaHRLZXlUeXBlID0gZmluZEVudGVyS2V5VHlwZShjdXN0b21LZXlUeXBlKVxuICAgICAgICAgICAgICBldi5yZXR1cm5LZXlUeXBlID0gcmlnaHRLZXlUeXBlXG4gICAgICAgICAgICAgIGV2LnZhbHVlID0gZXYudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgICAgIHNlbGYuJGVtaXQoJ3JldHVybicsIGV2KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBldmVudHMgPSBleHRlbmQoZXZlbnRzLCBrZXlib2FyZEV2ZW50cylcbiAgICAgIH1cbiAgICAgIHJldHVybiBldmVudHNcbiAgICB9XG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHtcbiAgZ2V0UGFyZW50U2Nyb2xsZXJcbn0gZnJvbSAnLi4vdXRpbHMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZGVzdHJveWVkICgpIHtcbiAgICBpZiAoIXRoaXMuX3N0aWNreUFkZGVkKSB7IHJldHVybiB9XG4gICAgY29uc3Qgc2Nyb2xsZXIgPSBnZXRQYXJlbnRTY3JvbGxlcih0aGlzKVxuICAgIGlmICghc2Nyb2xsZXIpIHsgcmV0dXJuIH1cbiAgICBkZWxldGUgc2Nyb2xsZXIuX3N0aWNreUNoaWxkcmVuW3RoaXMuX3VpZF1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgX2FkZFN0aWNreSAoKSB7XG4gICAgICBjb25zdCBlbCA9IHRoaXMuJGVsXG4gICAgICBpZiAoIWVsIHx8IGVsLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFt2dWUtcmVuZGVyXSAkZWwgZG9lc24ndCBleGlzdCB0byBhZGQgc3RpY2t5LmApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCdzdGlja3knKVxuICAgICAgaWYgKCF0aGlzLl9wbGFjZWhvbGRlcikge1xuICAgICAgICB0aGlzLl9wbGFjZWhvbGRlciA9IGVsLmNsb25lTm9kZSh0cnVlKVxuICAgICAgfVxuICAgICAgdGhpcy5fcGxhY2Vob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jaydcbiAgICAgIHRoaXMuX3BsYWNlaG9sZGVyLnN0eWxlLndpZHRoID0gdGhpcy4kZWwub2Zmc2V0V2lkdGggKyAncHgnXG4gICAgICB0aGlzLl9wbGFjZWhvbGRlci5zdHlsZS5oZWlnaHQgPSB0aGlzLiRlbC5vZmZzZXRIZWlnaHQgKyAncHgnXG4gICAgICBlbC5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLl9wbGFjZWhvbGRlciwgdGhpcy4kZWwpXG4gICAgfSxcblxuICAgIF9yZW1vdmVTdGlja3kgKCkge1xuICAgICAgY29uc3QgZWwgPSB0aGlzLiRlbFxuICAgICAgaWYgKCFlbCB8fCBlbC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBbdnVlLXJlbmRlcl0gJGVsIGRvZXNuJ3QgZXhpc3QgdG8gcmVtb3ZlIHN0aWNreS5gKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnc3RpY2t5JylcbiAgICAgIGlmICh0aGlzLl9wbGFjZWhvbGRlcikge1xuICAgICAgICB0aGlzLl9wbGFjZWhvbGRlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX3BsYWNlaG9sZGVyKVxuICAgICAgfVxuICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPSBudWxsXG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCBiYXNlIGZyb20gJy4vYmFzZSdcbmltcG9ydCBzdHlsZSBmcm9tICcuL3N0eWxlJ1xuaW1wb3J0IGlucHV0Q29tbW9uIGZyb20gJy4vaW5wdXQtY29tbW9uJ1xuaW1wb3J0IHN0aWNreSBmcm9tICcuL3N0aWNreSdcblxuZXhwb3J0IHtcbiAgYmFzZSxcbiAgc3R5bGUsXG4gIGlucHV0Q29tbW9uLFxuICBzdGlja3lcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHdlZXggZnJvbSAnLi93ZWV4J1xuaW1wb3J0ICogYXMgY29yZSBmcm9tICcuLi9jb3JlJ1xuXG5pbXBvcnQgeyBpbnB1dENvbW1vbiB9IGZyb20gJy4uL21peGlucydcblxud2luZG93Lmdsb2JhbCA9IHdpbmRvd1xud2luZG93LndlZXggPSB3ZWV4XG5cbndlZXguX3N0eWxlTWFwID0ge31cblxuOyBbJ2dldENvbXBvbmVudFN0eWxlJyxcbiAgJ2V4dHJhY3RDb21wb25lbnRTdHlsZScsXG4gICdjcmVhdGVFdmVudE1hcCcsXG4gICd0cmltVGV4dFZOb2RlcyddLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgIHdlZXhbbWV0aG9kXSA9IGNvcmVbbWV0aG9kXS5iaW5kKHdlZXgpXG4gIH0pXG5cbndlZXgubWl4aW5zID0ge1xuICBpbnB1dENvbW1vblxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgJy4uL3N0eWxlcy9yZXNldC5jc3MnXG5pbXBvcnQgJy4uL3N0eWxlcy9iYXNlLmNzcydcblxuaW1wb3J0ICcuLi9saWIvZ2VzdHVyZSdcblxuaW1wb3J0ICcuLi8uLi8uLi9zaGFyZWQvYXJyYXlGcm9tJ1xuaW1wb3J0ICcuLi8uLi8uLi9zaGFyZWQvb2JqZWN0QXNzaWduJ1xuaW1wb3J0ICcuLi8uLi8uLi9zaGFyZWQvb2JqZWN0U2V0UHJvdG90eXBlT2YnXG5cbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJ1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcidcbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnXG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lczYucHJvbWlzZSdcblxuaW1wb3J0ICcuL2dsb2JhbCdcblxuZXhwb3J0IGZ1bmN0aW9uIHNldFZ1ZSAodnVlKSB7XG4gIGlmICghdnVlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbVnVlIFJlbmRlcl0gVnVlIG5vdCBmb3VuZC4gUGxlYXNlIG1ha2Ugc3VyZSB2dWUgMi54IHJ1bnRpbWUgaXMgaW1wb3J0ZWQuJylcbiAgfVxuICBnbG9iYWwud2VleC5fX3Z1ZV9fID0gdnVlXG4gIGNvbnNvbGUubG9nKGBbVnVlIFJlbmRlcl0gaW5zdGFsbCBWdWUgJHt2dWUudmVyc2lvbn0uYClcbn1cblxuZXhwb3J0IGRlZmF1bHQgd2VleFxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBjb25maWcgZnJvbSAnLi4vY29uZmlnJ1xuaW1wb3J0IHsgY3JlYXRlRXZlbnQsIHN1cHBvcnRzUGFzc2l2ZSB9IGZyb20gJy4uL3V0aWxzJ1xuaW1wb3J0IHsgYXBwbHlGbnMgfSBmcm9tICcuLi9jb3JlJ1xuXG5jb25zdCBnZXN0dXJlRXZlbnRzID0gY29uZmlnLmdlc3R1cmVFdmVudHNcbmNvbnN0IG5hdGl2ZUV2ZW50cyA9IFsnY2xpY2snLCAndG91Y2hzdGFydCcsICd0b3VjaG1vdmUnLCAndG91Y2hlbmQnXVxuY29uc3QgbmVlZFBhc3NpdmUgPSBbJ3RvdWNobW92ZSddXG5cbmNvbnN0IGV2ZW50cyA9IGdlc3R1cmVFdmVudHMuY29uY2F0KG5hdGl2ZUV2ZW50cylcblxuLyoqXG4gKiBpZiBlbCBpcyBhIGA8YT5gIGVsZW1lbnQuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxuICovXG5mdW5jdGlvbiBpc0FOb2RlIChlbCkge1xuICByZXR1cm4gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYSdcbn1cblxuZnVuY3Rpb24gaXNJbkFOb2RlIChlbCkge1xuICBsZXQgcGFyZW50ID0gZWwucGFyZW50RWxlbWVudFxuICB3aGlsZSAocGFyZW50ICYmIHBhcmVudCAhPT0gZG9jdW1lbnQuYm9keSkge1xuICAgIGlmIChwYXJlbnQudGFnTmFtZSA9PT0gJ0EnKSB7IHJldHVybiB0cnVlIH1cbiAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50RWxlbWVudFxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIGdldCBsaXN0ZW5lcnMgZnJvbSBvbiBjb25maWcgYW5kIHYtb24gYmluZGluZy5cbiAqIHYtb24gYmluZGluZyBoYXMgYSBwcmlvcml0eSBvdmVyIG9uIGNvbmZpZy5cbiAqIEBwYXJhbSB7dm5vZGV9IHZub2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZ0OiBldmVudCBuYW1lLlxuICovXG5mdW5jdGlvbiBnZXRMaXN0ZW5lcnMgKHZub2RlLCBldnQpIHtcbiAgY29uc3QgaGFuZGxlcnMgPSBbXVxuICB3aGlsZSAodm5vZGUpIHtcbiAgICBpZiAodm5vZGUuZGF0YSAmJiB2bm9kZS5kYXRhLm9uKSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gdm5vZGUuZGF0YS5vbltldnRdXG4gICAgICBoYW5kbGVyICYmIGhhbmRsZXJzLnB1c2goaGFuZGxlcilcbiAgICB9XG4gICAgaWYgKHZub2RlLmNvbXBvbmVudE9wdGlvbnMgJiYgdm5vZGUuY29tcG9uZW50T3B0aW9ucy5saXN0ZW5lcnMpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB2bm9kZS5jb21wb25lbnRPcHRpb25zLmxpc3RlbmVyc1tldnRdXG4gICAgICBoYW5kbGVyICYmIGhhbmRsZXJzLnB1c2goaGFuZGxlcilcbiAgICB9XG4gICAgdm5vZGUgPSB2bm9kZS5wYXJlbnRcbiAgfVxuICByZXR1cm4gaGFuZGxlcnNcbn1cblxubGV0IF9pbml0ZWQgPSBmYWxzZVxuZnVuY3Rpb24gX2luaXQgKGRvYykge1xuICBpZiAoX2luaXRlZCkge1xuICAgIHJldHVyblxuICB9XG4gIGlmICghZG9jKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgX2luaXRlZCA9IHRydWVcbiAgY29uc3QgX3NwID0gc3VwcG9ydHNQYXNzaXZlKClcbiAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2dCkge1xuICAgIC8qKlxuICAgICAqIHVzZSBjYXB0dXJlIGZvciBjbGljayBoYW5kbGluZywgdGhlcmVmb3JlIHRoZXJlJ3MgYSBjaGFuY2UgdG8gaGFuZGxlXG4gICAgICogaXQgYmVmb3JlIGFueSBvdGhlciBsaXN0ZW5lcnMgYmluZGluZyBvbiBkb2N1bWVudCBvciBkb2N1bWVudC5ib2R5LlxuICAgICAqL1xuICAgIGNvbnN0IG9wdGlvbiA9XG4gICAgICBldnQgPT09ICdjbGljaydcbiAgICAgID8gdHJ1ZSA6IG5lZWRQYXNzaXZlLmluZGV4T2YoZXZ0KSA+IC0xICYmIF9zcFxuICAgICAgPyB7IHBhc3NpdmU6IHRydWUgfSA6IGZhbHNlXG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoZXZ0LCBmdW5jdGlvbiAoZSkge1xuICAgICAgbGV0IGVsID0gZS50YXJnZXRcbiAgICAgIGxldCB2bSA9IGVsLl9fdnVlX19cbiAgICAgIHdoaWxlICghdm0gJiYgZWwgJiYgZWwgIT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgZWwgPSBlbC5wYXJlbnRFbGVtZW50XG4gICAgICAgIHZtID0gZWwgJiYgZWwuX192dWVfX1xuICAgICAgfVxuICAgICAgaWYgKCF2bSkgeyAgLy8gbm90IGEgdnVlIGNvbXBvbmVudC5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBsZXQgZGlzcG9zZWQgPSBmYWxzZVxuICAgICAgY29uc3QgZXZ0TmFtZSA9IGUudHlwZVxuXG4gICAgICBpZiAoZXZ0TmFtZSA9PT0gJ3RhcCcgJiYgZS5fZm9yICE9PSAnd2VleCcpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHdoaWxlICh2bSkge1xuICAgICAgICBjb25zdCB2bm9kZSA9IHZtLl92bm9kZSB8fCB2bS4kdm5vZGVcbiAgICAgICAgY29uc3QgZWxtID0gdm0uJGVsXG4gICAgICAgIGNvbnN0IG9ucyA9IGdldExpc3RlbmVycyh2bm9kZSwgZXZ0TmFtZSA9PT0gJ3RhcCcgPyAnY2xpY2snIDogZXZ0TmFtZSlcbiAgICAgICAgY29uc3QgbGVuID0gb25zICYmIG9ucy5sZW5ndGhcblxuICAgICAgICBpZiAobGVuID4gMCkge1xuICAgICAgICAgIGlmIChldnROYW1lICE9PSAnY2xpY2snKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBvbnNbaV1cbiAgICAgICAgICAgICAgY29uc3QgbmV3RXZ0ID0gZXZ0TmFtZSA9PT0gJ3RhcCdcbiAgICAgICAgICAgICAgICA/IGNyZWF0ZUV2ZW50KGVsLCAnY2xpY2snKVxuICAgICAgICAgICAgICAgIDogZVxuICAgICAgICAgICAgICBuZXdFdnQuX3RyaWdnZXJlZCA9IHsgdGFyZ2V0OiBlbG0gfVxuICAgICAgICAgICAgICBhcHBseUZucyhoYW5kbGVyLmZucywgbmV3RXZ0KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlLl90cmlnZ2VyZWQgPSB7IHRhcmdldDogZWxtIH1cbiAgICAgICAgICBkaXNwb3NlZCA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0FOb2RlKGVsbSlcbiAgICAgICAgICAmJiAoZXZ0TmFtZSA9PT0gJ2NsaWNrJyB8fCBldnROYW1lID09PSAndGFwJykpIHtcbiAgICAgICAgICBjb25zdCBocmVmID0gZWxtLmdldEF0dHJpYnV0ZSgnaHJlZicpXG4gICAgICAgICAgY29uc3Qgdm9pZEhyZWZSZWcgPSAvXlxccypqYXZhc2NyaXB0XFxzKjpcXHMqdm9pZFxccyooPzpcXChcXHMqMFxccypcXCl8MClcXHMqOz9cXHMqJC9cbiAgICAgICAgICBjb25zdCBwcmV2ZW50ID0gZWxtLmdldEF0dHJpYnV0ZSgncHJldmVudCcpXG4gICAgICAgICAgaWYgKHdpbmRvdy5fc2hvdWxkX2ludGVyY2VwdF9hX2p1bXAgJiYgd2luZG93Ll9zaG91bGRfaW50ZXJjZXB0X2FfanVtcChlbG0pKSB7XG4gICAgICAgICAgICAvLyBlLl90cmlnZ2VyZWQgc2hvdWxkIG5vdCBiZSB0cnVlIHNpbmNlIHdlIGxlZnQgdGhlIGludGVyY2VwdGVyIHRvIGhhbmRsZSB0aGUgZXZlbnQuXG4gICAgICAgICAgICBlLl90cmlnZ2VyZWQgPSBmYWxzZVxuICAgICAgICAgICAgZGlzcG9zZWQgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGhyZWYubWF0Y2godm9pZEhyZWZSZWcpXG4gICAgICAgICAgICB8fCBwcmV2ZW50ID09PSAnJyB8fCBwcmV2ZW50ID09PSAndHJ1ZScpIHtcbiAgICAgICAgICAgIGUuX3RyaWdnZXJlZCA9IGZhbHNlXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlLl90cmlnZ2VyZWQgPSB7IHRhcmdldDogZWxtIH1cbiAgICAgICAgICAgIGRpc3Bvc2VkID0gdHJ1ZSAvLyBoYW5kbGVkIGJ5IGRlZmF1bHQgYmVoYXZpb3IgZm9yIGNsaWNraW5nIG9uIGEgZWxlbWVudC5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgdGhlIGNsaWNrIGhhbmRsZXIgaXMgYmluZGluZyBvbiBhIGVsZW1lbnQgaW5zaWRlIGEgPGE+IGVsZW1lbnQsXG4gICAgICAgICAqIHRoZW4gc2hvdWxkIHByZXZlbnQgZGVmYXVsdC5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChkaXNwb3NlZCAmJiBldnROYW1lID09PSAnY2xpY2snICYmIGlzSW5BTm9kZShlbG0pKSB7XG4gICAgICAgICAgZS5fdHJpZ2dlcmVkID0geyB0YXJnZXQ6IGVsbSB9XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlzcG9zZWQpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB2bSA9IHZtLiRwYXJlbnRcbiAgICAgIH1cbiAgICB9LCBvcHRpb24pXG4gIH0pXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXQgKCkge1xuICBfaW5pdChkb2N1bWVudClcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHdlZXggZnJvbSAnLi9lbnYnXG5pbXBvcnQgeyBzZXRWdWUgfSBmcm9tICcuL2VudidcbmltcG9ydCB7IGJhc2UsIHN0eWxlLCBzdGlja3kgfSBmcm9tICcuL21peGlucydcblxuaW1wb3J0IGluaXRFdmVudE1nciBmcm9tICcuL2Vudi9ldmVudC1tYW5hZ2VyJ1xuXG4vKipcbiAqIGluaXQgd2VleC5cbiAqIEBwYXJhbSAge1Z1ZSQyfSBWdWU6IFZ1ZSBDb25zdHJ1Y3Rvci5cbiAqIEBwYXJhbSAge29iamVjdH0gb3B0aW9uczogZXh0ZW5kIHdlZXggcGx1Z2lucy5cbiAqICAgICAgICAgLSBjb21wb25lbnRzLlxuICogICAgICAgICAtIG1vZHVsZXMuXG4gKi9cbmxldCBfaW5pdGVkID0gZmFsc2VcbmZ1bmN0aW9uIGluaXQgKFZ1ZS8qLCBvcHRpb25zID0ge30qLykge1xuICBpZiAoX2luaXRlZCkgeyByZXR1cm4gfVxuICBfaW5pdGVkID0gdHJ1ZVxuXG4gIHNldFZ1ZShWdWUpXG5cbiAgVnVlLnByb3RvdHlwZS4kZ2V0Q29uZmlnID0gKCkgPT4ge1xuICAgIGNvbnNvbGUud2FybignW1Z1ZSBSZW5kZXJdIFwidGhpcy4kZ2V0Q29uZmlnXCIgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBcIndlZXguY29uZmlnXCIgaW5zdGVhZC4nKVxuICAgIHJldHVybiB3ZWV4LmNvbmZpZ1xuICB9XG5cbiAgY29uc3QgaHRtbFJlZ2V4ID0gL15odG1sOi9pXG4gIFZ1ZS5jb25maWcuaXNSZXNlcnZlZFRhZyA9IHRhZyA9PiBodG1sUmVnZXgudGVzdCh0YWcpXG4gIFZ1ZS5jb25maWcucGFyc2VQbGF0Zm9ybVRhZ05hbWUgPSB0YWcgPT4gdGFnLnJlcGxhY2UoaHRtbFJlZ2V4LCAnJylcblxuICBmdW5jdGlvbiBpc1dlZXhUYWcgKHRhZykge1xuICAgIHJldHVybiAhIXdlZXguX2NvbXBvbmVudHNbdGFnXVxuICB9XG4gIGNvbnN0IG9sZEdldFRhZ05hbWVzcGFjZSA9IFZ1ZS5jb25maWcuZ2V0VGFnTmFtZXNwYWNlXG4gIFZ1ZS5jb25maWcuZ2V0VGFnTmFtZXNwYWNlID0gZnVuY3Rpb24gKHRhZykge1xuICAgIGlmIChpc1dlZXhUYWcodGFnKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHJldHVybiBvbGRHZXRUYWdOYW1lc3BhY2UodGFnKVxuICB9XG5cbiAgVnVlLm1peGluKGJhc2UpXG4gIFZ1ZS5taXhpbihzdHlsZSlcbiAgVnVlLm1peGluKHN0aWNreSlcblxuICBpbml0RXZlbnRNZ3IoKVxufVxuXG4vLyBhdXRvIGluaXQgaW4gZGlzdCBtb2RlLlxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5WdWUpIHtcbiAgaW5pdCh3aW5kb3cuVnVlKVxufVxuXG53ZWV4LmluaXQgPSBpbml0XG5cbmV4cG9ydCBkZWZhdWx0IHdlZXhcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gaW1wb3J0IHsgdmFsaWRhdGVTdHlsZXMgfSBmcm9tICcuLi92YWxpZGF0b3InXG5cbmNvbnN0IF9jc3MgPSBgXG4ud2VleC1hIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuYFxuXG5mdW5jdGlvbiBnZXRBICh3ZWV4KSB7XG4gIGNvbnN0IHtcbiAgICBleHRyYWN0Q29tcG9uZW50U3R5bGUsXG4gICAgdHJpbVRleHRWTm9kZXNcbiAgfSA9IHdlZXhcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3ZWV4LWEnLFxuICAgIHByb3BzOiB7XG4gICAgICBocmVmOiBTdHJpbmdcbiAgICB9LFxuICAgIHJlbmRlciAoY3JlYXRlRWxlbWVudCkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgLy8gICB2YWxpZGF0ZVN0eWxlcygnYScsIHRoaXMuJHZub2RlLmRhdGEgJiYgdGhpcy4kdm5vZGUuZGF0YS5zdGF0aWNTdHlsZSlcbiAgICAgIC8vIH1cbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KCdodG1sOmEnLCB7XG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgJ3dlZXgtdHlwZSc6ICdhJyxcbiAgICAgICAgICBocmVmOiB0aGlzLmhyZWZcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdGljQ2xhc3M6ICd3ZWV4LWEgd2VleC1jdCcsXG4gICAgICAgIHN0YXRpY1N0eWxlOiBleHRyYWN0Q29tcG9uZW50U3R5bGUodGhpcylcbiAgICAgIH0sIHRyaW1UZXh0Vk5vZGVzKHRoaXMuJHNsb3RzLmRlZmF1bHQpKVxuICAgIH0sXG4gICAgX2Nzc1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdCAod2VleCkge1xuICAgIHdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ2EnLCBnZXRBKHdlZXgpKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuY29uc3QgX2NzcyA9IGBcbmJvZHkgPiAud2VleC1kaXYge1xuICBtaW4taGVpZ2h0OiAxMDAlO1xufVxuYFxuXG5mdW5jdGlvbiBnZXREaXYgKHdlZXgpIHtcbiAgY29uc3Qge1xuICAgIGV4dHJhY3RDb21wb25lbnRTdHlsZSxcbiAgICB0cmltVGV4dFZOb2Rlc1xuICB9ID0gd2VleFxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3dlZXgtZGl2JyxcbiAgICByZW5kZXIgKGNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KCdodG1sOmRpdicsIHtcbiAgICAgICAgYXR0cnM6IHsgJ3dlZXgtdHlwZSc6ICdkaXYnIH0sXG4gICAgICAgIHN0YXRpY0NsYXNzOiAnd2VleC1kaXYgd2VleC1jdCcsXG4gICAgICAgIHN0YXRpY1N0eWxlOiBleHRyYWN0Q29tcG9uZW50U3R5bGUodGhpcylcbiAgICAgIH0sIHRyaW1UZXh0Vk5vZGVzKHRoaXMuJHNsb3RzLmRlZmF1bHQpKVxuICAgIH0sXG4gICAgX2Nzc1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdCAod2VleCkge1xuICAgIGNvbnN0IGRpdiA9IGdldERpdih3ZWV4KVxuICAgIHdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ2RpdicsIGRpdilcbiAgICB3ZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdjb250YWluZXInLCBkaXYpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5sZXQgZXh0cmFjdENvbXBvbmVudFN0eWxlLCBjcmVhdGVFdmVudE1hcCwgZXh0ZW5kXG5cbmNvbnN0IElNR19OQU1FX0JJVFMgPSAxNVxuXG5jb25zdCBfY3NzID0gYFxuLndlZXgtaW1hZ2UsIC53ZWV4LWltZyB7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IDUwJSA1MCU7XG59XG5gXG4vKipcbiAqIGdldCByZXNpemUgKHN0ZXRjaHxjb3Zlcnxjb250YWluKSByZWxhdGVkIHN0eWxlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzaXplU3R5bGUgKGNvbnRleHQpIHtcbiAgY29uc3Qgc3RyZXRjaCA9ICcxMDAlIDEwMCUnXG4gIGNvbnN0IHJlc2l6ZSA9IGNvbnRleHQucmVzaXplIHx8IHN0cmV0Y2hcbiAgY29uc3QgYmdTaXplID0gWydjb3ZlcicsICdjb250YWluJywgc3RyZXRjaF0uaW5kZXhPZihyZXNpemUpID4gLTEgPyByZXNpemUgOiBzdHJldGNoXG4gIC8vIGNvbXBhdGliaWxpdHk6IGh0dHA6Ly9jYW5pdXNlLmNvbS8jc2VhcmNoPWJhY2tncm91bmQtc2l6ZVxuICByZXR1cm4geyAnYmFja2dyb3VuZC1zaXplJzogYmdTaXplIH1cbn1cblxuZnVuY3Rpb24gcHJlUHJvY2Vzc1NyYyAoY29udGV4dCwgdXJsLCBtZXJnZWRTdHlsZSkge1xuICAvLyBzb21laG93IHRoZSBtZXJnZWQgc3R5bGUgaW4gX3ByZXJlbmRlciBob29rIGlzIGdvbmUuXG4gIC8vIGp1c3QgcmV0dXJuIHRoZSBvcmlnaW5hbCBzcmMuXG4gIGlmICghbWVyZ2VkU3R5bGUgfHwgIW1lcmdlZFN0eWxlLndpZHRoIHx8ICFtZXJnZWRTdHlsZS5oZWlnaHQpIHtcbiAgICByZXR1cm4gdXJsXG4gIH1cbiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBtZXJnZWRTdHlsZVxuICByZXR1cm4gY29udGV4dC5wcm9jZXNzSW1nU3JjICYmIGNvbnRleHQucHJvY2Vzc0ltZ1NyYyh1cmwsIHtcbiAgICB3aWR0aDogcGFyc2VGbG9hdCh3aWR0aCksXG4gICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGhlaWdodCksXG4gICAgcXVhbGl0eTogY29udGV4dC5xdWFsaXR5LFxuICAgIHNoYXJwZW46IGNvbnRleHQuc2hhcnBlbixcbiAgICBvcmlnaW5hbDogY29udGV4dC5vcmlnaW5hbFxuICB9KSB8fCB1cmxcbn1cblxuZnVuY3Rpb24gZG93bmxvYWQgKHVybCwgY2FsbGJhY2spIHtcbiAgZnVuY3Rpb24gc3VjY2VzcyAoKSB7XG4gICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soe1xuICAgICAgc3VjY2VzczogdHJ1ZVxuICAgIH0pXG4gIH1cbiAgZnVuY3Rpb24gZmFpbCAoZXJyKSB7XG4gICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soe1xuICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICBlcnJvckRlc2M6IGVyciArICcnXG4gICAgfSlcbiAgfVxuICB0cnkge1xuICAgIGxldCBpc0RhdGFVcmwgPSBmYWxzZVxuICAgIGxldCBwYXJ0c1xuICAgIGxldCBuYW1lXG4gICAgaWYgKHVybC5tYXRjaCgvZGF0YTppbWFnZVxcL1teO10rO2Jhc2U2NCwvKSkge1xuICAgICAgaXNEYXRhVXJsID0gdHJ1ZVxuICAgICAgcGFydHMgPSB1cmwuc3BsaXQoJywnKVxuICAgIH1cbiAgICBpZiAoIWlzRGF0YVVybCkge1xuICAgICAgbmFtZSA9IHVybFxuICAgICAgICAucmVwbGFjZSgvXFw/W14/XSsvLCAnJylcbiAgICAgICAgLnJlcGxhY2UoLyNbXiNdKy8sICcnKVxuICAgICAgICAubWF0Y2goLyhbXi9dKykkLylcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBuYW1lID0gcGFydHNbMV0uc3Vic3RyKDAsIElNR19OQU1FX0JJVFMpXG4gICAgfVxuICAgIGNvbnN0IGFFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgIGFFbC5ocmVmID0gdXJsXG4gICAgLyoqXG4gICAgICogTm90IGFsbCBicm93c2VyIHN1cHBvcnQgdGhpcyAnZG93bmxvYWQnIGF0dHJpYnV0ZS4gSW4gdGhlc2UgYnJvd3NlcnMgaXQnbGwganVtcFxuICAgICAqIHRvIHRoZSBwaG90byB1cmwgcGFnZSBhbmQgdXNlciBoYXZlIHRvIGxvbmdwcmVzcyB0aGUgcGhvdG8gdG8gc2F2ZSBpdC5cbiAgICAgKi9cbiAgICBhRWwuZG93bmxvYWQgPSBuYW1lXG4gICAgY29uc3QgY2xpY2tFdnQgPSBuZXcgRXZlbnQoJ2NsaWNrJywgeyBidWJibGVzOiBmYWxzZSB9KVxuICAgIGFFbC5kaXNwYXRjaEV2ZW50KGNsaWNrRXZ0KVxuICAgIHN1Y2Nlc3MoKVxuICB9XG4gIGNhdGNoIChlcnIpIHtcbiAgICBmYWlsKGVycilcbiAgfVxufVxuXG5jb25zdCBpbWFnZSA9IHtcbiAgbmFtZTogJ3dlZXgtaW1hZ2UnLFxuICBwcm9wczoge1xuICAgIHNyYzogU3RyaW5nLFxuICAgIHBsYWNlaG9sZGVyOiBTdHJpbmcsXG4gICAgcmVzaXplOiBTdHJpbmcsXG4gICAgcXVhbGl0eTogU3RyaW5nLFxuICAgIHNoYXJwZW46IFN0cmluZyxcbiAgICBvcmlnaW5hbDogW1N0cmluZywgQm9vbGVhbl1cbiAgfSxcblxuICB1cGRhdGVkICgpIHtcbiAgICB0aGlzLl9maXJlTGF6eWxvYWQoKVxuICB9LFxuXG4gIG1vdW50ZWQgKCkge1xuICAgIHRoaXMuX2ZpcmVMYXp5bG9hZCgpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHNhdmUgKGNhbGxiYWNrKSB7XG4gICAgICBkb3dubG9hZCh0aGlzLnNyYywgY2FsbGJhY2spXG4gICAgfVxuICB9LFxuXG4gIHJlbmRlciAoY3JlYXRlRWxlbWVudCkge1xuICAgIGNvbnN0IHJlc2l6ZVN0eWxlID0gZ2V0UmVzaXplU3R5bGUodGhpcylcbiAgICBjb25zdCBzdHlsZSA9IGV4dHJhY3RDb21wb25lbnRTdHlsZSh0aGlzKVxuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KCdmaWd1cmUnLCB7XG4gICAgICBhdHRyczoge1xuICAgICAgICAnd2VleC10eXBlJzogJ2ltYWdlJyxcbiAgICAgICAgJ2ltZy1zcmMnOiBwcmVQcm9jZXNzU3JjKHRoaXMsIHRoaXMuc3JjLCBzdHlsZSksXG4gICAgICAgICdpbWctcGxhY2Vob2xkZXInOiBwcmVQcm9jZXNzU3JjKHRoaXMsIHRoaXMucGxhY2Vob2xkZXIsIHN0eWxlKVxuICAgICAgfSxcbiAgICAgIG9uOiBjcmVhdGVFdmVudE1hcCh0aGlzLCBbJ2xvYWQnLCAnZXJyb3InXSksXG4gICAgICBzdGF0aWNDbGFzczogJ3dlZXgtaW1hZ2Ugd2VleC1lbCcsXG4gICAgICBzdGF0aWNTdHlsZTogZXh0ZW5kKHN0eWxlLCByZXNpemVTdHlsZSlcbiAgICB9KVxuICB9LFxuICBfY3NzXG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdCAod2VleCkge1xuICAgIGV4dHJhY3RDb21wb25lbnRTdHlsZSA9IHdlZXguZXh0cmFjdENvbXBvbmVudFN0eWxlXG4gICAgY3JlYXRlRXZlbnRNYXAgPSB3ZWV4LmNyZWF0ZUV2ZW50TWFwXG4gICAgZXh0ZW5kID0gd2VleC51dGlscy5leHRlbmRcblxuICAgIHdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ2ltYWdlJywgaW1hZ2UpXG4gICAgd2VleC5yZWdpc3RlckNvbXBvbmVudCgnaW1nJywgaW1hZ2UpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgSW5wdXQgY29tcG9uZW50LlxuICogU3VwcG9ydCB2LW1vZGVsIG9ubHkgaWYgdnVlIHZlcnNpb24gaXMgbGFyZ2VyIHRoYW4gMi4yLjBcbiAqL1xubGV0IGV4dHJhY3RDb21wb25lbnRTdHlsZSwgbWFwRm9ybUV2ZW50cywgYXBwZW5kQ3NzXG5cbmNvbnN0IElEX1BSRUZJWF9QTEFDRUhPTERFUl9DT0xPUiA9ICd3aXB0X3BsY18nXG5jb25zdCBJRF9QUkVGSVhfSU5QVVQgPSAnd2lwdF8nXG5sZXQgaWRDb3VudCA9IDBcblxuY29uc3QgX2NzcyA9IGBcbi53ZWV4LWlucHV0LCAud2VleC10ZXh0YXJlYSB7XG4gIGZvbnQtc2l6ZTogMC40MjY2NjdyZW07XG59XG4ud2VleC1pbnB1dDpmb2N1cywgLndlZXgtdGV4dGFyZWE6Zm9jdXMge1xuICBvdXRsaW5lOiBub25lO1xufVxuYFxuXG5mdW5jdGlvbiBzZXRQbGFjZWhvbGRlckNvbG9yIChpbnB1dFZtLCBwbGFjZWhvbGRlckNvbG9yKSB7XG4gIGlmICghcGxhY2Vob2xkZXJDb2xvcikge1xuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IHZlbmRvcnMgPSBbXG4gICAgJzo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcicsXG4gICAgJzotbW96LXBsYWNlaG9sZGVyJyxcbiAgICAnOjotbW96LXBsYWNlaG9sZGVyJyxcbiAgICAnOi1tcy1pbnB1dC1wbGFjZWhvbGRlcicsXG4gICAgJzpwbGFjZWhvbGRlci1zaG93bidcbiAgXVxuICBjb25zdCBpZCA9IGlucHV0Vm0uX2lkXG4gIGFwcGVuZENzcyhcbiAgICB2ZW5kb3JzLm1hcChmdW5jdGlvbiAodmVuZG9yLCBpZHgpIHtcbiAgICAgIHJldHVybiBgIyR7SURfUFJFRklYX0lOUFVUfSR7aWR9JHt2ZW5kb3JzW2lkeF19e2NvbG9yOiR7cGxhY2Vob2xkZXJDb2xvcn07fWBcbiAgICB9KS5qb2luKCcnKSxcbiAgICBgJHtJRF9QUkVGSVhfUExBQ0VIT0xERVJfQ09MT1J9JHtpZH1gLFxuICAgIHRydWUpXG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NTdHlsZSAodm0pIHtcbiAgY29uc3Qgc3R5bGVzID0gZXh0cmFjdENvbXBvbmVudFN0eWxlKHZtKVxuICBjb25zdCBwaENvbG9yID0gc3R5bGVzLnBsYWNlaG9sZGVyQ29sb3JcbiAgaWYgKHBoQ29sb3IpIHtcbiAgICBzZXRQbGFjZWhvbGRlckNvbG9yKHZtLCBwaENvbG9yKVxuICB9XG4gIHJldHVybiBzdHlsZXNcbn1cblxuZnVuY3Rpb24gZ2V0SW5wdXQgKHdlZXgpIHtcbiAgY29uc3QgeyBpbnB1dENvbW1vbiB9ID0gd2VleC5taXhpbnNcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3ZWV4LWlucHV0JyxcbiAgICBtaXhpbnM6IFtpbnB1dENvbW1vbl0sXG4gICAgcHJvcHM6IHtcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICBkZWZhdWx0OiAndGV4dCcsXG4gICAgICAgIHZhbGlkYXRvciAodmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2VtYWlsJywgJ251bWJlcicsICdwYXNzd29yZCcsICdzZWFyY2gnLCAndGVsJywgJ3RleHQnLCAndXJsJywgJ2RhdGUnLFxuICAgICAgICAgICAgJ2RhdGV0aW1lJywgJ3RpbWUnXG4gICAgICAgICAgICAvLyB1bnN1cHBvcnRlZCB0eXBlOlxuICAgICAgICAgICAgLy8gYnV0dG9uLCBjaGVja2JveCwgY29sb3IsIGZpbGUsIGhpZGRlbiwgaW1hZ2UsXG4gICAgICAgICAgICAvLyBtb250aCwgcmFkaW8sIHJhbmdlLCByZXNldCwgc3VibWl0LCB3ZWVrLFxuICAgICAgICAgIF0uaW5kZXhPZih2YWx1ZSkgIT09IC0xXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB2YWx1ZTogU3RyaW5nLFxuICAgICAgcGxhY2Vob2xkZXI6IFN0cmluZyxcbiAgICAgIGRpc2FibGVkOiB7XG4gICAgICAgIHR5cGU6IFtTdHJpbmcsIEJvb2xlYW5dLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZVxuICAgICAgfSxcbiAgICAgIGF1dG9mb2N1czoge1xuICAgICAgICB0eXBlOiBbU3RyaW5nLCBCb29sZWFuXSxcbiAgICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICAgIH0sXG4gICAgICBtYXhsZW5ndGg6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICByZXR1cm5LZXlUeXBlOiBTdHJpbmdcbiAgICB9LFxuXG4gICAgcmVuZGVyIChjcmVhdGVFbGVtZW50KSB7XG4gICAgICBpZiAoIXRoaXMuX2lkKSB7XG4gICAgICAgIHRoaXMuX2lkID0gaWRDb3VudCsrXG4gICAgICB9XG4gICAgICBjb25zdCBldmVudHMgPSBtYXBGb3JtRXZlbnRzKHRoaXMpXG4gICAgICByZXR1cm4gY3JlYXRlRWxlbWVudCgnaHRtbDppbnB1dCcsIHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAnd2VleC10eXBlJzogJ2lucHV0JyxcbiAgICAgICAgICBpZDogYCR7SURfUFJFRklYX0lOUFVUfSR7dGhpcy5faWR9YCxcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXG4gICAgICAgICAgZGlzYWJsZWQ6ICh0aGlzLmRpc2FibGVkICE9PSAnZmFsc2UnICYmIHRoaXMuZGlzYWJsZWQgIT09IGZhbHNlKSxcbiAgICAgICAgICBhdXRvZm9jdXM6ICh0aGlzLmF1dG9mb2N1cyAhPT0gJ2ZhbHNlJyAmJiB0aGlzLmF1dG9mb2N1cyAhPT0gZmFsc2UpLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnBsYWNlaG9sZGVyLFxuICAgICAgICAgIG1heGxlbmd0aDogdGhpcy5tYXhsZW5ndGgsXG4gICAgICAgICAgJ3JldHVybktleVR5cGUnOiB0aGlzLnJldHVybktleVR5cGVcbiAgICAgICAgfSxcbiAgICAgICAgZG9tUHJvcHM6IHtcbiAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZVxuICAgICAgICB9LFxuICAgICAgICBvbjogdGhpcy5jcmVhdGVLZXlib2FyZEV2ZW50KGV2ZW50cyksXG4gICAgICAgIHN0YXRpY0NsYXNzOiAnd2VleC1pbnB1dCB3ZWV4LWVsJyxcbiAgICAgICAgc3RhdGljU3R5bGU6IHByb2Nlc3NTdHlsZSh0aGlzKVxuICAgICAgfSlcbiAgICB9LFxuICAgIF9jc3NcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKHdlZXgpIHtcbiAgICBleHRyYWN0Q29tcG9uZW50U3R5bGUgPSB3ZWV4LmV4dHJhY3RDb21wb25lbnRTdHlsZVxuICAgIG1hcEZvcm1FdmVudHMgPSB3ZWV4LnV0aWxzLm1hcEZvcm1FdmVudHNcbiAgICBhcHBlbmRDc3MgPSB3ZWV4LnV0aWxzLmFwcGVuZENzc1xuXG4gICAgd2VleC5yZWdpc3RlckNvbXBvbmVudCgnaW5wdXQnLCBnZXRJbnB1dCh3ZWV4KSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmNvbnN0IF9jc3MgPSBgXG4ud2VleC1zd2l0Y2gge1xuICBib3JkZXI6IDAuMDEzMzMzcmVtIHNvbGlkICNkZmRmZGY7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XG4gIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICBiYWNrZ3JvdW5kLWNsaXA6IGNvbnRlbnQtYm94O1xuICBjb2xvcjogIzY0YmQ2MztcbiAgd2lkdGg6IDEuMzMzMzMzcmVtO1xuICBoZWlnaHQ6IDAuOHJlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gIGJvcmRlci1jb2xvcjogI2RmZGZkZjtcbiAgYm94LXNoYWRvdzogI2RmZGZkZiAwIDAgMCAwIGluc2V0O1xuICBib3JkZXItcmFkaXVzOiAwLjhyZW07XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogYm9yZGVyIDAuNHMsIGJveC1zaGFkb3cgMC40cywgYmFja2dyb3VuZC1jb2xvciAxLjJzO1xuICAtbW96LXRyYW5zaXRpb246IGJvcmRlciAwLjRzLCBib3gtc2hhZG93IDAuNHMsIGJhY2tncm91bmQtY29sb3IgMS4ycztcbiAgdHJhbnNpdGlvbjogYm9yZGVyIDAuNHMsIGJveC1zaGFkb3cgMC40cywgYmFja2dyb3VuZC1jb2xvciAxLjJzO1xufVxuXG4ud2VleC1zd2l0Y2gtY2hlY2tlZCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM2NGJkNjM7XG4gIGJvcmRlci1jb2xvcjogIzY0YmQ2MztcbiAgYm94LXNoYWRvdzogIzY0YmQ2MyAwIDAgMCAwLjUzMzMzM3JlbSBpbnNldDtcbn1cblxuLndlZXgtc3dpdGNoLWNoZWNrZWQud2VleC1zd2l0Y2gtZGlzYWJsZWQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjQTBDQ0EwO1xuICBib3gtc2hhZG93OiAjQTBDQ0EwIDAgMCAwIDAuNTMzMzMzcmVtIGluc2V0O1xufVxuXG4ud2VleC1zd2l0Y2gtZGlzYWJsZWQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjRUVFRUVFO1xufVxuXG4ud2VleC1zd2l0Y2gtaW5uZXIge1xuICB3aWR0aDogMC44cmVtO1xuICBoZWlnaHQ6IDAuOHJlbTtcbiAgYmFja2dyb3VuZDogI2ZmZjtcbiAgYm9yZGVyLXJhZGl1czogMTAwJTtcbiAgYm94LXNoYWRvdzogMCAwLjAxMzMzM3JlbSAwLjA0cmVtIHJnYmEoMCwgMCwgMCwgMC40KTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjRzLCBsZWZ0IDAuMnM7XG4gIC1tb3otdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjRzLCBsZWZ0IDAuMnM7XG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC40cywgbGVmdCAwLjJzO1xufVxuXG4ud2VleC1zd2l0Y2gtY2hlY2tlZCA+IC53ZWV4LXN3aXRjaC1pbm5lciB7XG4gIGxlZnQ6IDAuNTMzMzMzcmVtO1xufVxuYFxuXG5mdW5jdGlvbiBnZXRTd2l0Y2ggKHdlZXgpIHtcbiAgY29uc3QgeyBleHRyYWN0Q29tcG9uZW50U3R5bGUgfSA9IHdlZXhcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3ZWV4LXN3aXRjaCcsXG4gICAgcHJvcHM6IHtcbiAgICAgIGNoZWNrZWQ6IHtcbiAgICAgICAgdHlwZTogW0Jvb2xlYW4sIFN0cmluZ10sXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgICB9LFxuICAgICAgZGlzYWJsZWQ6IHtcbiAgICAgICAgdHlwZTogW0Jvb2xlYW4sIFN0cmluZ10sXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgICB9XG4gICAgfSxcbiAgICBkYXRhICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzQ2hlY2tlZDogKHRoaXMuY2hlY2tlZCAhPT0gJ2ZhbHNlJyAmJiB0aGlzLmNoZWNrZWQgIT09IGZhbHNlKSxcbiAgICAgICAgaXNEaXNhYmxlZDogKHRoaXMuZGlzYWJsZWQgIT09ICdmYWxzZScgJiYgdGhpcy5kaXNhYmxlZCAhPT0gZmFsc2UpXG4gICAgICB9XG4gICAgfSxcbiAgICBjb21wdXRlZDoge1xuICAgICAgd3JhcHBlckNsYXNzICgpIHtcbiAgICAgICAgY29uc3QgY2xhc3NBcnJheSA9IFsnd2VleC1zd2l0Y2gnXVxuICAgICAgICB0aGlzLmlzQ2hlY2tlZCAmJiBjbGFzc0FycmF5LnB1c2goJ3dlZXgtc3dpdGNoLWNoZWNrZWQnKVxuICAgICAgICB0aGlzLmlzRGlzYWJsZWQgJiYgY2xhc3NBcnJheS5wdXNoKCd3ZWV4LXN3aXRjaC1kaXNhYmxlZCcpXG4gICAgICAgIHJldHVybiBjbGFzc0FycmF5LmpvaW4oJyAnKVxuICAgICAgfVxuICAgIH0sXG4gICAgbWV0aG9kczoge1xuICAgICAgdG9nZ2xlICgpIHtcbiAgICAgICAgLy8gVE9ETzogaGFuZGxlIHRoZSBldmVudHNcbiAgICAgICAgaWYgKCF0aGlzLmlzRGlzYWJsZWQpIHtcbiAgICAgICAgICB0aGlzLmlzQ2hlY2tlZCA9ICF0aGlzLmlzQ2hlY2tlZFxuICAgICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHsgdmFsdWU6IHRoaXMuaXNDaGVja2VkIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVuZGVyIChjcmVhdGVFbGVtZW50KSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgLy8gaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAvLyAgIHZhbGlkYXRlU3R5bGVzKCdzd2l0Y2gnLCB0aGlzLiR2bm9kZS5kYXRhICYmIHRoaXMuJHZub2RlLmRhdGEuc3RhdGljU3R5bGUpXG4gICAgICAvLyB9XG4gICAgICByZXR1cm4gY3JlYXRlRWxlbWVudCgnc3BhbicsIHtcbiAgICAgICAgYXR0cnM6IHsgJ3dlZXgtdHlwZSc6ICdzd2l0Y2gnIH0sXG4gICAgICAgIG9uOiB7XG4gICAgICAgICAgY2xpY2s6IGV2ZW50ID0+IHtcbiAgICAgICAgICAgIHRoaXMuJGVtaXQoJ2NsaWNrJywgZXZlbnQpXG4gICAgICAgICAgICB0aGlzLnRvZ2dsZSgpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzdGF0aWNDbGFzczogdGhpcy53cmFwcGVyQ2xhc3MsXG4gICAgICAgIHN0YXRpY1N0eWxlOiBleHRyYWN0Q29tcG9uZW50U3R5bGUodGhpcylcbiAgICAgIH0sIFtjcmVhdGVFbGVtZW50KCdzbWFsbCcsIHsgc3RhdGljQ2xhc3M6ICd3ZWV4LXN3aXRjaC1pbm5lcicgfSldKVxuICAgIH0sXG4gICAgX2Nzc1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdCAod2VleCkge1xuICAgIHdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ3N3aXRjaCcsIGdldFN3aXRjaCh3ZWV4KSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmNvbnN0IERFRkFVTFRfT0ZGU0VUX0FDQ1VSQUNZID0gMTBcbmNvbnN0IERFRkFVTFRfTE9BRE1PUkVfT0ZGU0VUID0gMFxuXG5mdW5jdGlvbiBnZXRUaHJvdHRsZWRTY3JvbGwgKGNvbnRleHQpIHtcbiAgY29uc3Qgc2NhbGUgPSB3ZWV4LmNvbmZpZy5lbnYuc2NhbGVcbiAgaWYgKCFjb250ZXh0Ll90aHJvdHRsZVNjcm9sbCkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBjb250ZXh0LiRyZWZzLndyYXBwZXJcbiAgICBjb25zdCBpbm5lciA9IGNvbnRleHQuJHJlZnMuaW5uZXJcbiAgICBsZXQgcHJlT2Zmc2V0ID0gKGNvbnRleHQuc2Nyb2xsRGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCdcbiAgICAgICAgPyB3cmFwcGVyLnNjcm9sbExlZnRcbiAgICAgICAgOiB3cmFwcGVyLnNjcm9sbFRvcClcbiAgICAgIHx8IDBcbiAgICBjb250ZXh0Ll90aHJvdHRsZVNjcm9sbCA9IHdlZXgudXRpbHMudGhyb3R0bGUoZnVuY3Rpb24gKGV2dCkge1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gY29udGV4dC5zY3JvbGxEaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJ1xuICAgICAgICA/IHdyYXBwZXIuc2Nyb2xsTGVmdFxuICAgICAgICA6IHdyYXBwZXIuc2Nyb2xsVG9wXG4gICAgICBjb25zdCBpbmRlbnQgPSBwYXJzZUludChjb250ZXh0Lm9mZnNldEFjY3VyYWN5KSAqIHNjYWxlXG4gICAgICBmdW5jdGlvbiB0cmlnZ2VyU2Nyb2xsICgpIHtcbiAgICAgICAgY29uc3QgcmVjdCA9IGlubmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgIGV2dC5jb250ZW50U2l6ZSA9IHsgd2lkdGg6IHJlY3Qud2lkdGgsIGhlaWdodDogcmVjdC5oZWlnaHQgfVxuICAgICAgICBldnQuY29udGVudE9mZnNldCA9IHtcbiAgICAgICAgICB4OiB3cmFwcGVyLnNjcm9sbExlZnQsXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogcG9zaXRpdmUgZGlyZWNpdG9uIGZvciB5LWF4aXMgaXMgZG93bi5cbiAgICAgICAgICAgKiBzbyBzaG91bGQgdXNlIG5lZ2F0aXZlIG9wZXJhdGlvbiBvbiBzY3JvbGxUb3AuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiAgKDAsMCktLS0tLS0tLS0tLS0tLS0+IHhcbiAgICAgICAgICAgKiAgICAgICB8XG4gICAgICAgICAgICogICAgICAgfFxuICAgICAgICAgICAqICAgICAgIHxcbiAgICAgICAgICAgKiAgICAgICB8XG4gICAgICAgICAgICogICAgICAgdiB5XG4gICAgICAgICAgICpcbiAgICAgICAgICAgKi9cbiAgICAgICAgICB5OiAtd3JhcHBlci5zY3JvbGxUb3BcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LiRlbWl0KCdzY3JvbGwnLCBldnQpXG4gICAgICB9XG4gICAgICBpZiAoTWF0aC5hYnMob2Zmc2V0IC0gcHJlT2Zmc2V0KSA+PSBpbmRlbnQpIHtcbiAgICAgICAgdHJpZ2dlclNjcm9sbCgpXG4gICAgICAgIHByZU9mZnNldCA9IG9mZnNldFxuICAgICAgfVxuICAgIH0sIDE2LCB0cnVlKVxuICB9XG4gIHJldHVybiBjb250ZXh0Ll90aHJvdHRsZVNjcm9sbFxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHByb3BzOiB7XG4gICAgbG9hZG1vcmVvZmZzZXQ6IHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICBkZWZhdWx0OiBERUZBVUxUX0xPQURNT1JFX09GRlNFVCxcbiAgICAgIHZhbGlkYXRvciAodmFsdWUpIHtcbiAgICAgICAgY29uc3QgdmFsID0gcGFyc2VJbnQodmFsdWUpXG4gICAgICAgIHJldHVybiAhaXNOYU4odmFsKSAmJiB2YWwgPj0gREVGQVVMVF9MT0FETU9SRV9PRkZTRVRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb2Zmc2V0QWNjdXJhY3k6IHtcbiAgICAgIHR5cGU6IFtOdW1iZXIsIFN0cmluZ10sXG4gICAgICBkZWZhdWx0OiBERUZBVUxUX09GRlNFVF9BQ0NVUkFDWSxcbiAgICAgIHZhbGlkYXRvciAodmFsdWUpIHtcbiAgICAgICAgY29uc3QgdmFsID0gcGFyc2VJbnQodmFsdWUpXG4gICAgICAgIHJldHVybiAhaXNOYU4odmFsKSAmJiB2YWwgPj0gREVGQVVMVF9PRkZTRVRfQUNDVVJBQ1lcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZCAoKSB7XG4gICAgLy8gc2hvdWxkIGNhbGwgcmVzZXRMb2FkbW9yZSgpIHRvIGVuYWJsZSBsb2FkbW9yZSBldmVudC5cbiAgICB0aGlzLl9sb2FkbW9yZVJlc2V0ID0gdHJ1ZVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICB1cGRhdGVMYXlvdXQgKCkge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuJHJlZnMud3JhcHBlclxuICAgICAgaWYgKHdyYXBwZXIpIHtcbiAgICAgICAgY29uc3QgcmVjdCA9IHdyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgdGhpcy5fd3JhcHBlcldpZHRoID0gcmVjdC53aWR0aFxuICAgICAgICB0aGlzLl93cmFwcGVySGVpZ2h0ID0gcmVjdC5oZWlnaHRcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlubmVyID0gdGhpcy4kcmVmcy5pbm5lclxuICAgICAgY29uc3QgY2hpbGRyZW4gPSBpbm5lciAmJiBpbm5lci5jaGlsZHJlblxuICAgICAgaWYgKGlubmVyKSB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSBpbm5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICB0aGlzLl9pbm5lcldpZHRoID0gcmVjdC53aWR0aFxuICAgICAgICB0aGlzLl9pbm5lckhlaWdodCA9IHJlY3QuaGVpZ2h0XG4gICAgICB9XG4gICAgICBjb25zdCBsb2FkaW5nRWwgPSB0aGlzLl9sb2FkaW5nICYmIHRoaXMuX2xvYWRpbmcuJGVsXG4gICAgICBjb25zdCByZWZyZXNoRWwgPSB0aGlzLl9yZWZyZXNoICYmIHRoaXMuX3JlZnJlc2guJGVsXG4gICAgICBpZiAobG9hZGluZ0VsKSB7XG4gICAgICAgIHRoaXMuX2lubmVySGVpZ2h0IC09IGxvYWRpbmdFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgIH1cbiAgICAgIGlmIChyZWZyZXNoRWwpIHtcbiAgICAgICAgdGhpcy5faW5uZXJIZWlnaHQgLT0gcmVmcmVzaEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgfVxuICAgICAgLy8gaW5uZXIgd2lkdGggaXMgYWx3YXlzIHRoZSB2aWV3cG9ydCB3aWR0aCBzb21laG93IGluIGhvcml6b250YWxcbiAgICAgIC8vIHNjb2xsZXIsIHRoZXJlZm9yZSB0aGUgaW5uZXIgd2lkdGggc2hvdWxkIGJlIHJlY2xhY3VsYXRlZC5cbiAgICAgIGlmICh0aGlzLnNjcm9sbERpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnICYmIGNoaWxkcmVuKSB7XG4gICAgICAgIHRoaXMuX2lubmVyV2lkdGggPSB3ZWV4LnV0aWxzLmdldFJhbmdlV2lkdGgoaW5uZXIpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlc2V0TG9hZG1vcmUgKCkge1xuICAgICAgdGhpcy5fbG9hZG1vcmVSZXNldCA9IHRydWVcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcHJvY2VzcyBzdGlja3kgY2hpbGRyZW4gaW4gc2Nyb2xsYWJsZSBjb21wb25lbnRzLlxuICAgICAqIGN1cnJlbnQgb25seSBzdXBwb3J0IGxpc3QgYW5kIHZlcnRpY2FsIHNjcm9sbGVyLlxuICAgICAqL1xuICAgIHByb2Nlc3NTdGlja3kgKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBjdXJyZW50IGJyb3dzZXIgc3VwcG9ydCAnc3RpY2t5JyBvciAnLXdlYmtpdC1zdGlja3knLCBzbyB0aGVyZSdzIG5vIG5lZWRcbiAgICAgICAqIHRvIGRvIGZ1cnRoZXIgbW9yZS5cbiAgICAgICAqL1xuICAgICAgaWYgKHdlZXgudXRpbHMuc3VwcG9ydFN0aWNreSgpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgLy8gY3VycmVudCBvbmx5IHN1cHBvcnQgbGlzdCBhbmQgdmVydGljYWwgc2Nyb2xsZXIuXG4gICAgICBpZiAodGhpcy5zY3JvbGxEaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0aWNreUNoaWxkcmVuID0gdGhpcy5fc3RpY2t5Q2hpbGRyZW5cbiAgICAgIGNvbnN0IGxlbiA9IHN0aWNreUNoaWxkcmVuICYmIHN0aWNreUNoaWxkcmVuLmxlbmd0aCB8fCAwXG4gICAgICBpZiAobGVuIDw9IDApIHsgcmV0dXJuIH1cblxuICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy4kZWxcbiAgICAgIGlmICghY29udGFpbmVyKSB7IHJldHVybiB9XG4gICAgICBjb25zdCBzY3JvbGxUb3AgPSBjb250YWluZXIuc2Nyb2xsVG9wXG5cbiAgICAgIGxldCBzdGlja3lDaGlsZFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBzdGlja3lDaGlsZCA9IHN0aWNreUNoaWxkcmVuW2ldXG4gICAgICAgIGlmIChzdGlja3lDaGlsZC5faW5pdE9mZnNldFRvcCA8IHNjcm9sbFRvcCkge1xuICAgICAgICAgIHN0aWNreUNoaWxkLl9hZGRTdGlja3koKVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHN0aWNreUNoaWxkLl9yZW1vdmVTdGlja3koKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGhhbmRsZVNjcm9sbCAoZXZlbnQpIHtcbiAgICAgIHdlZXgudXRpbHMuZ2V0VGhyb3R0bGVMYXp5bG9hZCgyNSwgdGhpcy4kZWwsICdzY3JvbGwnKSgpXG4gICAgICBnZXRUaHJvdHRsZWRTY3JvbGwodGhpcykoZXZlbnQpXG5cbiAgICAgIHRoaXMucHJvY2Vzc1N0aWNreSgpXG5cbiAgICAgIC8vIGZpcmUgbG9hZG1vcmUgZXZlbnQuXG4gICAgICBjb25zdCBpbm5lciA9IHRoaXMuJHJlZnMuaW5uZXJcbiAgICAgIGlmIChpbm5lcikge1xuICAgICAgICBjb25zdCBpbm5lckxlbmd0aCA9IHRoaXMuc2Nyb2xsRGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCdcbiAgICAgICAgICA/IHRoaXMuX2lubmVyV2lkdGhcbiAgICAgICAgICA6IHRoaXMuX2lubmVySGVpZ2h0XG4gICAgICAgIGlmICghdGhpcy5faW5uZXJMZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLl9pbm5lckxlbmd0aCA9IGlubmVyTGVuZ3RoXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2lubmVyTGVuZ3RoICE9PSBpbm5lckxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuX2lubmVyTGVuZ3RoID0gaW5uZXJMZW5ndGhcbiAgICAgICAgICB0aGlzLl9sb2FkbW9yZVJlc2V0ID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9sb2FkbW9yZVJlc2V0ICYmIHRoaXMucmVhY2hCb3R0b20odGhpcy5sb2FkbW9yZW9mZnNldCkpIHtcbiAgICAgICAgICB0aGlzLl9sb2FkbW9yZVJlc2V0ID0gZmFsc2VcbiAgICAgICAgICB0aGlzLiRlbWl0KCdsb2FkbW9yZScsIGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlYWNoVG9wICgpIHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLiRyZWZzLndyYXBwZXJcbiAgICAgIHJldHVybiAoISF3cmFwcGVyKSAmJiAod3JhcHBlci5zY3JvbGxUb3AgPD0gMClcbiAgICB9LFxuXG4gICAgcmVhY2hCb3R0b20gKG9mZnNldCkge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuJHJlZnMud3JhcHBlclxuICAgICAgY29uc3QgaW5uZXIgPSB0aGlzLiRyZWZzLmlubmVyXG4gICAgICBvZmZzZXQgPSBwYXJzZUludChvZmZzZXQgfHwgMCkgKiB3ZWV4LmNvbmZpZy5lbnYuc2NhbGVcblxuICAgICAgaWYgKHdyYXBwZXIgJiYgaW5uZXIpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5zY3JvbGxEaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJ1xuICAgICAgICAgID8gJ3dpZHRoJ1xuICAgICAgICAgIDogJ2hlaWdodCdcbiAgICAgICAgY29uc3QgaW5uZXJMZW5ndGggPSB0aGlzW2BfaW5uZXIke2tleVswXS50b1VwcGVyQ2FzZSgpfSR7a2V5LnN1YnN0cigxKX1gXVxuICAgICAgICBjb25zdCB3cmFwcGVyTGVuZ3RoID0gdGhpc1tgX3dyYXBwZXIke2tleVswXS50b1VwcGVyQ2FzZSgpfSR7a2V5LnN1YnN0cigxKX1gXVxuICAgICAgICBjb25zdCBzY3JvbGxPZmZzZXQgPSB0aGlzLnNjcm9sbERpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnXG4gICAgICAgICAgPyB3cmFwcGVyLnNjcm9sbExlZnRcbiAgICAgICAgICA6IHdyYXBwZXIuc2Nyb2xsVG9wXG4gICAgICAgIHJldHVybiBzY3JvbGxPZmZzZXQgPj0gaW5uZXJMZW5ndGggLSB3cmFwcGVyTGVuZ3RoIC0gb2Zmc2V0XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgaGFuZGxlVG91Y2hTdGFydCAoZXZlbnQpIHtcbiAgICAgIGlmICh0aGlzLl9sb2FkaW5nIHx8IHRoaXMuX3JlZnJlc2gpIHtcbiAgICAgICAgY29uc3QgdG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXVxuICAgICAgICB0aGlzLl90b3VjaFBhcmFtcyA9IHtcbiAgICAgICAgICByZWFjaFRvcDogdGhpcy5yZWFjaFRvcCgpLFxuICAgICAgICAgIHJlYWNoQm90dG9tOiB0aGlzLnJlYWNoQm90dG9tKCksXG4gICAgICAgICAgc3RhcnRUb3VjaEV2ZW50OiB0b3VjaCxcbiAgICAgICAgICBzdGFydFg6IHRvdWNoLnBhZ2VYLFxuICAgICAgICAgIHN0YXJ0WTogdG91Y2gucGFnZVksXG4gICAgICAgICAgdGltZVN0YW1wOiBldmVudC50aW1lU3RhbXBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBoYW5kbGVUb3VjaE1vdmUgKGV2ZW50KSB7XG4gICAgICBpZiAoIXRoaXMuX3RvdWNoUGFyYW1zIHx8ICF0aGlzLl9yZWZyZXNoICYmICF0aGlzLl9sb2FkaW5nKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3QgaW5uZXIgPSB0aGlzLiRyZWZzLmlubmVyXG4gICAgICBjb25zdCB7IHN0YXJ0WSwgcmVhY2hUb3AsIHJlYWNoQm90dG9tIH0gPSB0aGlzLl90b3VjaFBhcmFtc1xuICAgICAgaWYgKGlubmVyKSB7XG4gICAgICAgIGNvbnN0IHRvdWNoID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF1cbiAgICAgICAgY29uc3Qgb2Zmc2V0WSA9IHRvdWNoLnBhZ2VZIC0gc3RhcnRZXG4gICAgICAgIGNvbnN0IGRpciA9IG9mZnNldFkgPiAwID8gJ2Rvd24nIDogJ3VwJ1xuICAgICAgICB0aGlzLl90b3VjaFBhcmFtcy5vZmZzZXRZID0gb2Zmc2V0WVxuICAgICAgICBpZiAodGhpcy5fcmVmcmVzaCAmJiAoZGlyID09PSAnZG93bicpICYmIHJlYWNoVG9wKSB7XG4gICAgICAgICAgdGhpcy5fcmVmcmVzaC5wdWxsaW5nRG93bihvZmZzZXRZKVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX2xvYWRpbmcgJiYgKGRpciA9PT0gJ3VwJykgJiYgcmVhY2hCb3R0b20pIHtcbiAgICAgICAgICB0aGlzLl9sb2FkaW5nLnB1bGxpbmdVcCgtb2Zmc2V0WSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBoYW5kbGVUb3VjaEVuZCAoZXZlbnQpIHtcbiAgICAgIGlmICghdGhpcy5fdG91Y2hQYXJhbXMgfHwgIXRoaXMuX3JlZnJlc2ggJiYgIXRoaXMuX2xvYWRpbmcpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjb25zdCBpbm5lciA9IHRoaXMuJHJlZnMuaW5uZXJcbiAgICAgIGNvbnN0IHsgc3RhcnRZLCByZWFjaFRvcCwgcmVhY2hCb3R0b20gfSA9IHRoaXMuX3RvdWNoUGFyYW1zXG4gICAgICBpZiAoaW5uZXIpIHtcbiAgICAgICAgY29uc3QgdG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXVxuICAgICAgICBjb25zdCBvZmZzZXRZID0gdG91Y2gucGFnZVkgLSBzdGFydFlcbiAgICAgICAgY29uc3QgZGlyID0gb2Zmc2V0WSA+IDAgPyAnZG93bicgOiAndXAnXG4gICAgICAgIHRoaXMuX3RvdWNoUGFyYW1zLm9mZnNldFkgPSBvZmZzZXRZXG4gICAgICAgIGlmICh0aGlzLl9yZWZyZXNoICYmIChkaXIgPT09ICdkb3duJykgJiYgcmVhY2hUb3ApIHtcbiAgICAgICAgICB0aGlzLl9yZWZyZXNoLnB1bGxpbmdFbmQoKVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX2xvYWRpbmcgJiYgKGRpciA9PT0gJ3VwJykgJiYgcmVhY2hCb3R0b20pIHtcbiAgICAgICAgICB0aGlzLl9sb2FkaW5nLnB1bGxpbmdFbmQoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpcy5fdG91Y2hQYXJhbXNcbiAgICB9XG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG1ldGhvZHM6IHtcbiAgICBoYW5kbGVMaXN0U2Nyb2xsIChldmVudCkge1xuICAgICAgdGhpcy5oYW5kbGVTY3JvbGwoZXZlbnQpXG5cbiAgICAgIGlmICh3ZWV4LnV0aWxzLnN1cHBvcnRTdGlja3koKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2Nyb2xsVG9wID0gdGhpcy4kZWwuc2Nyb2xsVG9wXG4gICAgICBjb25zdCBoID0gdGhpcy4kY2hpbGRyZW4uZmlsdGVyKHZtID0+IHZtLiRyZWZzLmhlYWRlcilcblxuICAgICAgaWYgKGgubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaFtpXS5pbml0VG9wIDwgc2Nyb2xsVG9wKSB7XG4gICAgICAgICAgaFtpXS5hZGRTdGlja3koKVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGhbaV0ucmVtb3ZlU3RpY2t5KClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBzY3JvbGxhYmxlIGZyb20gJy4vc2Nyb2xsYWJsZSdcbmltcG9ydCBsaXN0IGZyb20gJy4vbGlzdCdcblxuZXhwb3J0IHtcbiAgc2Nyb2xsYWJsZSxcbiAgbGlzdFxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBzY3JvbGxhYmxlLCBsaXN0IGFzIGxpc3RNaXhpbiB9IGZyb20gJy4vbWl4aW5zJ1xuXG5mdW5jdGlvbiBnZXRMaXN0ICh3ZWV4KSB7XG4gIGNvbnN0IHtcbiAgICBleHRyYWN0Q29tcG9uZW50U3R5bGUsXG4gICAgY3JlYXRlRXZlbnRNYXBcbiAgfSA9IHdlZXhcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3ZWV4LWxpc3QnLFxuICAgIG1peGluczogW3Njcm9sbGFibGUsIGxpc3RNaXhpbl0sXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIHdyYXBwZXJDbGFzcyAoKSB7XG4gICAgICAgIGNvbnN0IGNsYXNzQXJyYXkgPSBbJ3dlZXgtbGlzdCcsICd3ZWV4LWxpc3Qtd3JhcHBlcicsICd3ZWV4LWN0J11cbiAgICAgICAgdGhpcy5fcmVmcmVzaCAmJiBjbGFzc0FycmF5LnB1c2goJ3dpdGgtcmVmcmVzaCcpXG4gICAgICAgIHRoaXMuX2xvYWRpbmcgJiYgY2xhc3NBcnJheS5wdXNoKCd3aXRoLWxvYWRpbmcnKVxuICAgICAgICByZXR1cm4gY2xhc3NBcnJheS5qb2luKCcgJylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbWV0aG9kczoge1xuICAgICAgY3JlYXRlQ2hpbGRyZW4gKGgpIHtcbiAgICAgICAgY29uc3Qgc2xvdHMgPSB0aGlzLiRzbG90cy5kZWZhdWx0IHx8IFtdXG4gICAgICAgIHRoaXMuX2NlbGxzID0gc2xvdHMuZmlsdGVyKHZub2RlID0+IHtcbiAgICAgICAgICBpZiAoIXZub2RlLnRhZyB8fCAhdm5vZGUuY29tcG9uZW50T3B0aW9ucykgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBoKCdhcnRpY2xlJywge1xuICAgICAgICAgICAgcmVmOiAnaW5uZXInLFxuICAgICAgICAgICAgc3RhdGljQ2xhc3M6ICd3ZWV4LWxpc3QtaW5uZXIgd2VleC1jdCdcbiAgICAgICAgICB9LCB0aGlzLl9jZWxscylcbiAgICAgICAgXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICByZW5kZXIgKGNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMud2VleFR5cGUgPSAnbGlzdCdcblxuICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZUxheW91dCgpXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gY3JlYXRlRWxlbWVudCgnbWFpbicsIHtcbiAgICAgICAgcmVmOiAnd3JhcHBlcicsXG4gICAgICAgIGF0dHJzOiB7ICd3ZWV4LXR5cGUnOiAnbGlzdCcgfSxcbiAgICAgICAgc3RhdGljQ2xhc3M6IHRoaXMud3JhcHBlckNsYXNzLFxuICAgICAgICBvbjogY3JlYXRlRXZlbnRNYXAodGhpcywge1xuICAgICAgICAgIHNjcm9sbDogdGhpcy5oYW5kbGVMaXN0U2Nyb2xsLFxuICAgICAgICAgIHRvdWNoc3RhcnQ6IHRoaXMuaGFuZGxlVG91Y2hTdGFydCxcbiAgICAgICAgICB0b3VjaG1vdmU6IHRoaXMuaGFuZGxlVG91Y2hNb3ZlLFxuICAgICAgICAgIHRvdWNoZW5kOiB0aGlzLmhhbmRsZVRvdWNoRW5kXG4gICAgICAgIH0pLFxuICAgICAgICBzdGF0aWNTdHlsZTogZXh0cmFjdENvbXBvbmVudFN0eWxlKHRoaXMpXG4gICAgICB9LCB0aGlzLmNyZWF0ZUNoaWxkcmVuKGNyZWF0ZUVsZW1lbnQpKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKHdlZXgpIHtcbiAgICB3ZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdsaXN0JywgZ2V0TGlzdCh3ZWV4KSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IHNjcm9sbGFibGUsIGxpc3QgYXMgbGlzdE1peGluIH0gZnJvbSAnLi9taXhpbnMnXG5cbmZ1bmN0aW9uIGdldFNjcm9sbGVyICh3ZWV4KSB7XG4gIGNvbnN0IHtcbiAgICBleHRyYWN0Q29tcG9uZW50U3R5bGUsXG4gICAgY3JlYXRlRXZlbnRNYXBcbiAgfSA9IHdlZXhcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3ZWV4LXNjcm9sbGVyJyxcbiAgICBtaXhpbnM6IFtzY3JvbGxhYmxlLCBsaXN0TWl4aW5dLFxuICAgIHByb3BzOiB7XG4gICAgICBzY3JvbGxEaXJlY3Rpb246IHtcbiAgICAgICAgdHlwZTogW1N0cmluZ10sXG4gICAgICAgIGRlZmF1bHQ6ICd2ZXJ0aWNhbCcsXG4gICAgICAgIHZhbGlkYXRvciAodmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gWydob3Jpem9udGFsJywgJ3ZlcnRpY2FsJ10uaW5kZXhPZih2YWx1ZSkgIT09IC0xXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzY3JvbGxhYmxlOiB7XG4gICAgICAgIHR5cGU6IFtCb29sZWFuXSxcbiAgICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgICAgfVxuICAgIH0sXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIHdyYXBwZXJDbGFzcyAoKSB7XG4gICAgICAgIGNvbnN0IGNsYXNzQXJyYXkgPSBbJ3dlZXgtc2Nyb2xsZXInLCAnd2VleC1zY3JvbGxlci13cmFwcGVyJywgJ3dlZXgtY3QnXVxuICAgICAgICBpZiAodGhpcy5zY3JvbGxEaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJykge1xuICAgICAgICAgIGNsYXNzQXJyYXkucHVzaCgnd2VleC1zY3JvbGxlci1ob3Jpem9udGFsJylcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjbGFzc0FycmF5LnB1c2goJ3dlZXgtc2Nyb2xsZXItdmVydGljYWwnKVxuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zY3JvbGxhYmxlKSB7XG4gICAgICAgICAgY2xhc3NBcnJheS5wdXNoKCd3ZWV4LXNjcm9sbGVyLWRpc2FibGVkJylcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xhc3NBcnJheS5qb2luKCcgJylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbWV0aG9kczoge1xuICAgICAgY3JlYXRlQ2hpbGRyZW4gKGgpIHtcbiAgICAgICAgY29uc3Qgc2xvdHMgPSB0aGlzLiRzbG90cy5kZWZhdWx0IHx8IFtdXG4gICAgICAgIHRoaXMuX2NlbGxzID0gc2xvdHMuZmlsdGVyKHZub2RlID0+IHtcbiAgICAgICAgICBpZiAoIXZub2RlLnRhZyB8fCAhdm5vZGUuY29tcG9uZW50T3B0aW9ucykgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBoKCdhcnRpY2xlJywge1xuICAgICAgICAgICAgcmVmOiAnaW5uZXInLFxuICAgICAgICAgICAgc3RhdGljQ2xhc3M6ICd3ZWV4LXNjcm9sbGVyLWlubmVyIHdlZXgtY3QnXG4gICAgICAgICAgfSwgdGhpcy5fY2VsbHMpXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVuZGVyIChjcmVhdGVFbGVtZW50KSB7XG4gICAgICB0aGlzLndlZXhUeXBlID0gJ3Njcm9sbGVyJ1xuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgLy8gaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAvLyAgIHZhbGlkYXRlU3R5bGVzKCdzY3JvbGxlcicsIHRoaXMuJHZub2RlLmRhdGEgJiYgdGhpcy4kdm5vZGUuZGF0YS5zdGF0aWNTdHlsZSlcbiAgICAgIC8vIH1cblxuICAgICAgdGhpcy5fY2VsbHMgPSB0aGlzLiRzbG90cy5kZWZhdWx0IHx8IFtdXG4gICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlTGF5b3V0KClcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KCdtYWluJywge1xuICAgICAgICByZWY6ICd3cmFwcGVyJyxcbiAgICAgICAgYXR0cnM6IHsgJ3dlZXgtdHlwZSc6ICdzY3JvbGxlcicgfSxcbiAgICAgICAgb246IGNyZWF0ZUV2ZW50TWFwKHRoaXMsIHtcbiAgICAgICAgICBzY3JvbGw6IHRoaXMuaGFuZGxlU2Nyb2xsLFxuICAgICAgICAgIHRvdWNoc3RhcnQ6IHRoaXMuaGFuZGxlVG91Y2hTdGFydCxcbiAgICAgICAgICB0b3VjaG1vdmU6IHRoaXMuaGFuZGxlVG91Y2hNb3ZlLFxuICAgICAgICAgIHRvdWNoZW5kOiB0aGlzLmhhbmRsZVRvdWNoRW5kXG4gICAgICAgIH0pLFxuICAgICAgICBzdGF0aWNDbGFzczogdGhpcy53cmFwcGVyQ2xhc3MsXG4gICAgICAgIHN0YXRpY1N0eWxlOiBleHRyYWN0Q29tcG9uZW50U3R5bGUodGhpcylcbiAgICAgIH0sIHRoaXMuY3JlYXRlQ2hpbGRyZW4oY3JlYXRlRWxlbWVudCkpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdCAod2VleCkge1xuICAgIHdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ3Njcm9sbGVyJywgZ2V0U2Nyb2xsZXIod2VleCkpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IHdhdGVyZmFsbFxuICogTk9URTogb25seSBzdXBwb3J0IGZ1bGwgc2NyZWVuIHdpZHRoIHdhdGVyZmFsbC5cbiAqL1xuXG5pbXBvcnQgeyBzY3JvbGxhYmxlIH0gZnJvbSAnLi9taXhpbnMnXG5cbmNvbnN0IE5PUk1BTF9HQVBfU0laRSA9IDMyXG5jb25zdCBERUZBVUxUX0NPTFVNTl9DT1VOVCA9IDFcblxuZnVuY3Rpb24gZ2V0V2F0ZXJmYWxsICh3ZWV4KSB7XG4gIGNvbnN0IHtcbiAgICBleHRyYWN0Q29tcG9uZW50U3R5bGUsXG4gICAgY3JlYXRlRXZlbnRNYXBcbiAgfSA9IHdlZXhcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3ZWV4LXdhdGVyZmFsbCcsXG4gICAgbWl4aW5zOiBbc2Nyb2xsYWJsZV0sXG4gICAgcHJvcHM6IHtcbiAgICAgIC8qKlxuICAgICAgICogc3BlY2lmaWVkIGdhcCBzaXplLlxuICAgICAgICogdmFsdWUgY2FuIGJlIG51bWJlciBvciAnbm9ybWFsJy4gJ25vcm1hbCcgKDMycHgpIGJ5IGRlZmF1bHQuXG4gICAgICAgKi9cbiAgICAgIGNvbHVtbkdhcDoge1xuICAgICAgICB0eXBlOiBbU3RyaW5nLCBOdW1iZXJdLFxuICAgICAgICBkZWZhdWx0OiAnbm9ybWFsJyxcbiAgICAgICAgdmFsaWRhdG9yICh2YWwpIHtcbiAgICAgICAgICBpZiAoIXZhbCB8fCB2YWwgPT09ICdub3JtYWwnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YWwgPSBwYXJzZUludCh2YWwpXG4gICAgICAgICAgcmV0dXJuICFpc05hTih2YWwpICYmIHZhbCA+IDBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogdGhlIG1heGltdW0gY29sdW1uIGNvdW50cy5cbiAgICAgICAqIHZhbHVlIGNhbiBiZSBudW1iZXIgb3IgJ2F1dG8nLiAxIGJ5IGRlZmF1bHQuXG4gICAgICAgKi9cbiAgICAgIGNvbHVtbkNvdW50OiB7XG4gICAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICAgIGRlZmF1bHQ6IERFRkFVTFRfQ09MVU1OX0NPVU5ULFxuICAgICAgICB2YWxpZGF0b3IgKHZhbCkge1xuICAgICAgICAgIHZhbCA9IHBhcnNlSW50KHZhbClcbiAgICAgICAgICByZXR1cm4gIWlzTmFOKHZhbCkgJiYgdmFsID4gMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiB0aGUgbWltaW11bSBjb2x1bW4gd2lkdGguXG4gICAgICAgKiB2YWx1ZSBjYW4gYmUgbnVtYmVyIG9yICdhdXRvJy4gJ2F1dG8nIGJ5IGRlZmF1bHQuXG4gICAgICAgKi9cbiAgICAgIGNvbHVtbldpZHRoOiB7XG4gICAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICAgICAgdmFsaWRhdG9yICh2YWwpIHtcbiAgICAgICAgICBpZiAoIXZhbCB8fCB2YWwgPT09ICdhdXRvJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFsID0gcGFyc2VJbnQodmFsKVxuICAgICAgICAgIHJldHVybiAhaXNOYU4odmFsKSAmJiB2YWwgPiAwXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbW91bnRlZCAoKSB7XG4gICAgICB0aGlzLl9uZXh0VGljaygpXG4gICAgfSxcblxuICAgIHVwZGF0ZWQgKCkge1xuICAgICAgdGhpcy4kbmV4dFRpY2sodGhpcy5fbmV4dFRpY2soKSlcbiAgICB9LFxuXG4gICAgbWV0aG9kczoge1xuICAgICAgX2NyZWF0ZUNoaWxkcmVuIChoLCByb290U3R5bGUpIHtcbiAgICAgICAgY29uc3Qgc2xvdHMgPSB0aGlzLiRzbG90cy5kZWZhdWx0IHx8IFtdXG4gICAgICAgIHRoaXMuX2hlYWRlcnMgPSBbXVxuICAgICAgICB0aGlzLl9vdGhlcnMgPSBbXVxuICAgICAgICB0aGlzLl9jZWxscyA9IHNsb3RzLmZpbHRlcih2bm9kZSA9PiB7XG4gICAgICAgICAgaWYgKCF2bm9kZS50YWcgfHwgIXZub2RlLmNvbXBvbmVudE9wdGlvbnMpIHJldHVybiBmYWxzZVxuICAgICAgICAgIGNvbnN0IHRhZyA9IHZub2RlLmNvbXBvbmVudE9wdGlvbnMudGFnXG4gICAgICAgICAgaWYgKHRhZyA9PT0gJ3JlZnJlc2gnIHx8IHRhZyA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgICAgICAgICB0aGlzW2BfJHt0YWd9YF0gPSB2bm9kZVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0YWcgPT09ICdoZWFkZXInKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkZXJzLnB1c2godm5vZGUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRhZyAhPT0gJ2NlbGwnKSB7XG4gICAgICAgICAgICB0aGlzLl9vdGhlcnMucHVzaCh2bm9kZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLl9yZUNhbGMocm9vdFN0eWxlKVxuICAgICAgICB0aGlzLl9nZW5Db2x1bW5zKGgpXG4gICAgICAgIGxldCBjaGlsZHJlbiA9IFtdXG4gICAgICAgIHRoaXMuX3JlZnJlc2ggJiYgY2hpbGRyZW4ucHVzaCh0aGlzLl9yZWZyZXNoKVxuICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuXG4gICAgICAgICAgLmNvbmNhdCh0aGlzLl9oZWFkZXJzKVxuICAgICAgICAgIC5jb25jYXQodGhpcy5fb3RoZXJzKVxuICAgICAgICBjaGlsZHJlbi5wdXNoKGgoJ2h0bWw6ZGl2Jywge1xuICAgICAgICAgIHJlZjogJ2NvbHVtbnMnLFxuICAgICAgICAgIHN0YXRpY0NsYXNzOiAnd2VleC13YXRlcmZhbGwtaW5uZXItY29sdW1ucyB3ZWV4LWN0J1xuICAgICAgICB9LCB0aGlzLl9jb2x1bW5zKSlcbiAgICAgICAgdGhpcy5fbG9hZGluZyAmJiBjaGlsZHJlbi5wdXNoKHRoaXMuX2xvYWRpbmcpXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgaCgnYXJ0aWNsZScsIHtcbiAgICAgICAgICAgIHJlZjogJ2lubmVyJyxcbiAgICAgICAgICAgIHN0YXRpY0NsYXNzOiAnd2VleC13YXRlcmZhbGwtaW5uZXIgd2VleC1jdCdcbiAgICAgICAgICB9LCBjaGlsZHJlbilcbiAgICAgICAgXVxuICAgICAgfSxcblxuICAgICAgX3JlQ2FsYyAocm9vdFN0eWxlKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOT1RFOiBjb2x1bW5HYXAgYW5kIGNvbHVtbldpZHRoIGNhbid0IGJvdGggYmUgYXV0by5cbiAgICAgICAgICogTk9URTogdGhlIGZvcm11bGE6XG4gICAgICAgICAqICB0b3RhbFdpZHRoID0gbiAqIHcgKyAobiAtIDEpICogZ2FwXG4gICAgICAgICAqIDEuIGlmIGNvbHVtbkNvdW50ID0gbiB0aGVuIGNhbGMgd1xuICAgICAgICAgKiAyLiBpZiBjb2x1bW5XaWR0aCA9IHcgdGhlbiBjYWxjIG5cbiAgICAgICAgICogMy4gaWYgY29sdW1uV2lkdGggPSB3IGFuZCBjb2x1bW5Db3VudCA9IG4gdGhlbiBjYWxjIHRvdGFsV2lkdGhcbiAgICAgICAgICogICAgMy4xIGlmIHRvdGFsV2lkdGggPCBjdFdpZHRoIHRoZW4gaW5jcmVhc2UgY29sdW1uV2lkdGhcbiAgICAgICAgICogICAgMy4yIGlmIHRvdGFsV2lkdGggPiBjdFdpZHRoIHRoZW4gZGVjcmVhc2UgY29sdW1uQ291bnRcbiAgICAgICAgICovXG4gICAgICAgIGxldCB3aWR0aCwgZ2FwLCBjbnQsIGN0V2lkdGhcbiAgICAgICAgY29uc3Qgc2NhbGUgPSB3ZWV4LmNvbmZpZy5lbnYuc2NhbGVcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLiRlbFxuICAgICAgICBmdW5jdGlvbiBnZXRDdFdpZHRoICh3aWR0aCwgc3R5bGUpIHtcbiAgICAgICAgICBjb25zdCBwYWRkaW5nID0gc3R5bGUucGFkZGluZ1xuICAgICAgICAgICAgPyBwYXJzZUludChzdHlsZS5wYWRkaW5nKSAqIDJcbiAgICAgICAgICAgIDogcGFyc2VJbnQoc3R5bGUucGFkZGluZ0xlZnQgfHwgMCkgKyBwYXJzZUludChzdHlsZS5wYWRkaW5nUmlnaHQgfHwgMClcbiAgICAgICAgICByZXR1cm4gd2lkdGggLSBwYWRkaW5nXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsICYmIGVsLm5vZGVUeXBlID09PSAxKSB7ICAvLyBhbHJlYWR5IG1vdW50ZWRcbiAgICAgICAgICBjb25zdCBjc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbClcbiAgICAgICAgICBjdFdpZHRoID0gZ2V0Q3RXaWR0aChlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCwgY3N0eWxlKVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAgLy8gbm90IG1vdW50ZWQuXG4gICAgICAgICAgLy8gb25seSBzdXBwb3J0IGZ1bGwgc2NyZWVuIHdpZHRoIGZvciB3YXRlcmZhbGwgY29tcG9uZW50LlxuICAgICAgICAgIGN0V2lkdGggPSBnZXRDdFdpZHRoKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgcm9vdFN0eWxlKVxuICAgICAgICB9XG5cbiAgICAgICAgZ2FwID0gdGhpcy5jb2x1bW5HYXBcbiAgICAgICAgaWYgKGdhcCAmJiBnYXAgIT09ICdub3JtYWwnKSB7XG4gICAgICAgICAgZ2FwID0gcGFyc2VJbnQoZ2FwKVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGdhcCA9IE5PUk1BTF9HQVBfU0laRVxuICAgICAgICB9XG4gICAgICAgIGdhcCA9IGdhcCAqIHNjYWxlXG5cbiAgICAgICAgd2lkdGggPSB0aGlzLmNvbHVtbldpZHRoXG4gICAgICAgIGNudCA9IHRoaXMuY29sdW1uQ291bnRcbiAgICAgICAgaWYgKHdpZHRoICYmIHdpZHRoICE9PSAnYXV0bycpIHtcbiAgICAgICAgICB3aWR0aCA9IHBhcnNlSW50KHdpZHRoKSAqIHNjYWxlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNudCAmJiBjbnQgIT09ICdhdXRvJykge1xuICAgICAgICAgIGNudCA9IHBhcnNlSW50KGNudClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDAuIGlmICFjb2x1bW5Db3VudCAmJiAhY29sdW1uV2lkdGhcbiAgICAgICAgaWYgKGNudCA9PT0gJ2F1dG8nICYmIHdpZHRoID09PSAnYXV0bycpIHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgW3Z1ZS1yZW5kZXJdIHdhdGVyZmFsbCdzIGNvbHVtbldpZHRoIGFuZCBjb2x1bW5Db3VudCBzaG91bGRuJ3RgXG4gICAgICAgICAgICArIGAgYm90aCBiZSBhdXRvIGF0IHRoZSBzYW1lIHRpbWUuYClcbiAgICAgICAgICAgIGNudCA9IERFRkFVTFRfQ09MVU1OX0NPVU5UXG4gICAgICAgICAgICB3aWR0aCA9IGN0V2lkdGhcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gMS4gaWYgY29sdW1uQ291bnQgPSBuIHRoZW4gY2FsYyB3LlxuICAgICAgICBlbHNlIGlmIChjbnQgIT09ICdhdXRvJyAmJiB3aWR0aCA9PT0gJ2F1dG8nKSB7XG4gICAgICAgICAgd2lkdGggPSAoY3RXaWR0aCAtIChjbnQgLSAxKSAqIGdhcCkgLyBjbnRcbiAgICAgICAgfVxuICAgICAgICAvLyAyLiBpZiBjb2x1bW5XaWR0aCA9IHcgdGhlbiBjYWxjIG4uXG4gICAgICAgIGVsc2UgaWYgKGNudCA9PT0gJ2F1dG8nICYmIHdpZHRoICE9PSAnYXV0bycpIHtcbiAgICAgICAgICBjbnQgPSAoY3RXaWR0aCArIGdhcCkgLyAod2lkdGggKyBnYXApXG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4gaWYgY29sdW1uV2lkdGggPSB3IGFuZCBjb2x1bW5Db3VudCA9IG4gdGhlbiBjYWxjIHRvdGFsV2lkdGhcbiAgICAgICAgZWxzZSBpZiAoY250ICE9PSAnYXV0bycgJiYgd2lkdGggIT09ICdhdXRvJykge1xuICAgICAgICAgIGxldCB0b3RhbFdpZHRoXG4gICAgICAgICAgY29uc3QgYWRqdXN0Q291bnRBbmRXaWR0aCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRvdGFsV2lkdGggPSBjbnQgKiB3aWR0aCArIChjbnQgLSAxKSAqIGdhcFxuICAgICAgICAgICAgaWYgKHRvdGFsV2lkdGggPCBjdFdpZHRoKSB7XG4gICAgICAgICAgICAgIHdpZHRoICs9IChjdFdpZHRoIC0gdG90YWxXaWR0aCkgLyBjbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRvdGFsV2lkdGggPiBjdFdpZHRoICYmIGNudCA+IDEpIHtcbiAgICAgICAgICAgICAgY250LS1cbiAgICAgICAgICAgICAgYWRqdXN0Q291bnRBbmRXaWR0aCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0b3RhbFdpZHRoID4gY3RXaWR0aCkgeyAgLy8gY250ID09PSAxXG4gICAgICAgICAgICAgIHdpZHRoID0gY3RXaWR0aFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhZGp1c3RDb3VudEFuZFdpZHRoKClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb2x1bW5Db3VudCA9IGNudFxuICAgICAgICB0aGlzLl9jb2x1bW5XaWR0aCA9IHdpZHRoXG4gICAgICAgIHRoaXMuX2NvbHVtbkdhcCA9IGdhcFxuICAgICAgfSxcblxuICAgICAgX2dlbkNvbHVtbnMgKGNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5fY29sdW1ucyA9IFtdXG4gICAgICAgIGNvbnN0IGNlbGxzID0gdGhpcy5fY2VsbHNcbiAgICAgICAgY29uc3QgY29sdW1uQ250ID0gdGhpcy5fY29sdW1uQ291bnRcbiAgICAgICAgY29uc3QgbGVuID0gY2VsbHMubGVuZ3RoXG4gICAgICAgIGNvbnN0IGNvbHVtbkNlbGxzID0gdGhpcy5fY29sdW1uQ2VsbHMgPSBBcnJheShjb2x1bW5DbnQpLmpvaW4oJy4nKS5zcGxpdCgnLicpLm1hcChmdW5jdGlvbiAoKSB7IHJldHVybiBbXSB9KVxuICAgICAgICAvLyBzcHJlYWQgY2VsbHMgdG8gdGhlIGNvbHVtbnMgdXNpbmcgc2ltcG9sZSBwb2xsaW5nIGFsZ29yaXRobS5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIChjZWxsc1tpXS5kYXRhLmF0dHJzIHx8IChjZWxsc1tpXS5kYXRhLmF0dHJzID0ge30pKVsnZGF0YS1jZWxsJ10gPSBpXG4gICAgICAgICAgY29sdW1uQ2VsbHNbaSAlIGNvbHVtbkNudF0ucHVzaChjZWxsc1tpXSlcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbkNudDsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5fY29sdW1ucy5wdXNoKGNyZWF0ZUVsZW1lbnQoJ2h0bWw6ZGl2Jywge1xuICAgICAgICAgICAgcmVmOiBgY29sdW1uJHtpfWAsXG4gICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAnZGF0YS1jb2x1bW4nOiBpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhdGljQ2xhc3M6ICd3ZWV4LWN0JyxcbiAgICAgICAgICAgIHN0YXRpY1N0eWxlOiB7XG4gICAgICAgICAgICAgIHdpZHRoOiB0aGlzLl9jb2x1bW5XaWR0aCArICdweCcsXG4gICAgICAgICAgICAgIG1hcmdpbkxlZnQ6IGkgPT09IDAgPyAwIDogdGhpcy5fY29sdW1uR2FwICsgJ3B4J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIGNvbHVtbkNlbGxzW2ldKSlcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgX25leHRUaWNrICgpIHtcbiAgICAgICAgdGhpcy5fcmVMYXlvdXRDaGlsZHJlbigpXG4gICAgICB9LFxuXG4gICAgICBfcmVMYXlvdXRDaGlsZHJlbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0cmVhdCB0aGUgc2hvcnRlc3QgY29sdW1uIGJvdHRvbSBhcyB0aGUgbWF0Y2ggc3RhbmRhcmQuXG4gICAgICAgICAqIHdoaWNoZXZlciBjZWxsIGV4Y2VlZGVkIGl0IHdvdWxkIGJlIHJlYXJyYW5nZWQuXG4gICAgICAgICAqIDEuIG0gPSBzaG9ydGVzdCBjb2x1bW4gYm90dG9tLlxuICAgICAgICAgKiAyLiBnZXQgYWxsIGNlbGwgaWRzIHdobyBpcyBiZWxvdyBtLlxuICAgICAgICAgKiAzLiBjYWxjdWxhdGUgd2hpY2ggY2VsbCBzaG91bGQgYmUgaW4gd2hpY2ggY29sdW1uLlxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgY29sdW1uQ250ID0gdGhpcy5fY29sdW1uQ291bnRcbiAgICAgICAgY29uc3QgY29sdW1uRG9tcyA9IFtdXG4gICAgICAgIGNvbnN0IGNvbHVtbkFwcGVuZEZyYWdtZW50cyA9IFtdXG4gICAgICAgIGNvbnN0IGNvbHVtbkJvdHRvbXMgPSBbXVxuICAgICAgICBsZXQgbWluQm90dG9tID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcbiAgICAgICAgbGV0IG1pbkJvdHRvbUNvbHVtbkluZGV4ID0gMFxuXG4gICAgICAgIC8vIDEuIGZpbmQgdGhlIHNob3J0ZXN0IGNvbHVtbiBib3R0b20uXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1uQ250OyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjb2x1bW5Eb20gPSB0aGlzLl9jb2x1bW5zW2ldLmVsbVxuICAgICAgICAgIGNvbnN0IGxhc3RDaGlsZCA9IGNvbHVtbkRvbS5sYXN0RWxlbWVudENoaWxkXG4gICAgICAgICAgY29uc3QgYm90dG9tID0gbGFzdENoaWxkID8gbGFzdENoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSA6IDBcbiAgICAgICAgICBjb2x1bW5Eb21zLnB1c2goY29sdW1uRG9tKVxuICAgICAgICAgIGNvbHVtbkJvdHRvbXNbaV0gPSBib3R0b21cbiAgICAgICAgICBjb2x1bW5BcHBlbmRGcmFnbWVudHMucHVzaChkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICAgICAgaWYgKGJvdHRvbSA8IG1pbkJvdHRvbSkge1xuICAgICAgICAgICAgbWluQm90dG9tID0gYm90dG9tXG4gICAgICAgICAgICBtaW5Cb3R0b21Db2x1bW5JbmRleCA9IGlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBnZXQgYWxsIGNlbGwgaWRzIHdobyBpcyBiZWxvdyBtLlxuICAgICAgICBjb25zdCBiZWxvd0NlbGxJZHMgPSBbXVxuICAgICAgICBjb25zdCBiZWxvd0NlbGxzID0ge31cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5DbnQ7IGkrKykge1xuICAgICAgICAgIGlmIChpID09PSBtaW5Cb3R0b21Db2x1bW5JbmRleCkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgY29sdW1uRG9tID0gY29sdW1uRG9tc1tpXVxuICAgICAgICAgIGNvbnN0IGNlbGxzSW5Db2x1bW4gPSBjb2x1bW5Eb20ucXVlcnlTZWxlY3RvckFsbCgnc2VjdGlvbi53ZWV4LWNlbGwnKVxuICAgICAgICAgIGNvbnN0IGxlbiA9IGNlbGxzSW5Db2x1bW4ubGVuZ3RoXG4gICAgICAgICAgZm9yIChsZXQgaiA9IGxlbiAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgICBjb25zdCBjZWxsRG9tID0gY2VsbHNJbkNvbHVtbltqXVxuICAgICAgICAgICAgY29uc3QgY2VsbFJlY3QgPSBjZWxsRG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgICAgICBpZiAoY2VsbFJlY3QudG9wID4gbWluQm90dG9tKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGlkID0gfn5jZWxsRG9tLmdldEF0dHJpYnV0ZSgnZGF0YS1jZWxsJylcbiAgICAgICAgICAgICAgYmVsb3dDZWxsSWRzLnB1c2goaWQpXG4gICAgICAgICAgICAgIGJlbG93Q2VsbHNbaWRdID0geyBlbG06IGNlbGxEb20sIGhlaWdodDogY2VsbFJlY3QuaGVpZ2h0IH1cbiAgICAgICAgICAgICAgY29sdW1uQm90dG9tc1tpXSAtPSBjZWxsUmVjdC5oZWlnaHRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiBjYWxjdWxhdGUgd2hpY2ggY2VsbCBzaG91bGQgYmUgaW4gd2hpY2ggY29sdW1uIGFuZCByZWFycmFuZ2UgdGhlbVxuICAgICAgICAvLyAgaW4gdGhlIGRvbSB0cmVlLlxuICAgICAgICBiZWxvd0NlbGxJZHMuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA+IGIgfSlcbiAgICAgICAgY29uc3QgY2VsbElkc0xlbiA9IGJlbG93Q2VsbElkcy5sZW5ndGhcbiAgICAgICAgZnVuY3Rpb24gYWRkVG9TaG9ydGVzdENvbHVtbiAoYmVsb3dDZWxsKSB7XG4gICAgICAgICAgLy8gZmluZCBzaG9ydGVzdCBib3R0b20uXG4gICAgICAgICAgbWluQm90dG9tID0gTWF0aC5taW4oLi4uY29sdW1uQm90dG9tcylcbiAgICAgICAgICBtaW5Cb3R0b21Db2x1bW5JbmRleCA9IGNvbHVtbkJvdHRvbXMuaW5kZXhPZihtaW5Cb3R0b20pXG4gICAgICAgICAgY29uc3QgeyBlbG06IGNlbGxFbG0sIGhlaWdodDogY2VsbEhlaWdodCB9ID0gYmVsb3dDZWxsXG4gICAgICAgICAgY29sdW1uQXBwZW5kRnJhZ21lbnRzW21pbkJvdHRvbUNvbHVtbkluZGV4XS5hcHBlbmRDaGlsZChjZWxsRWxtKVxuICAgICAgICAgIGNvbHVtbkJvdHRvbXNbbWluQm90dG9tQ29sdW1uSW5kZXhdICs9IGNlbGxIZWlnaHRcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNlbGxJZHNMZW47IGkrKykge1xuICAgICAgICAgIGFkZFRvU2hvcnRlc3RDb2x1bW4oYmVsb3dDZWxsc1tiZWxvd0NlbGxJZHNbaV1dKVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1uQ250OyBpKyspIHtcbiAgICAgICAgICBjb2x1bW5Eb21zW2ldLmFwcGVuZENoaWxkKGNvbHVtbkFwcGVuZEZyYWdtZW50c1tpXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICByZW5kZXIgKGNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMud2VleFR5cGUgPSAnd2F0ZXJmYWxsJ1xuICAgICAgdGhpcy5fY2VsbHMgPSB0aGlzLiRzbG90cy5kZWZhdWx0IHx8IFtdXG4gICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlTGF5b3V0KClcbiAgICAgIH0pXG4gICAgICBjb25zdCBtZXJnZWRTdHlsZSA9IGV4dHJhY3RDb21wb25lbnRTdHlsZSh0aGlzKVxuICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoJ21haW4nLCB7XG4gICAgICAgIHJlZjogJ3dyYXBwZXInLFxuICAgICAgICBhdHRyczogeyAnd2VleC10eXBlJzogJ3dhdGVyZmFsbCcgfSxcbiAgICAgICAgb246IGNyZWF0ZUV2ZW50TWFwKHRoaXMsIHtcbiAgICAgICAgICBzY3JvbGw6IHRoaXMuaGFuZGxlU2Nyb2xsLFxuICAgICAgICAgIHRvdWNoc3RhcnQ6IHRoaXMuaGFuZGxlVG91Y2hTdGFydCxcbiAgICAgICAgICB0b3VjaG1vdmU6IHRoaXMuaGFuZGxlVG91Y2hNb3ZlLFxuICAgICAgICAgIHRvdWNoZW5kOiB0aGlzLmhhbmRsZVRvdWNoRW5kXG4gICAgICAgIH0pLFxuICAgICAgICBzdGF0aWNDbGFzczogJ3dlZXgtd2F0ZXJmYWxsIHdlZXgtd2F0ZXJmYWxsLXdyYXBwZXIgd2VleC1jdCcsXG4gICAgICAgIHN0YXRpY1N0eWxlOiBtZXJnZWRTdHlsZVxuICAgICAgfSwgdGhpcy5fY3JlYXRlQ2hpbGRyZW4oY3JlYXRlRWxlbWVudCwgbWVyZ2VkU3R5bGUpKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKHdlZXgpIHtcbiAgICB3ZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCd3YXRlcmZhbGwnLCBnZXRXYXRlcmZhbGwod2VleCkpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5mdW5jdGlvbiBnZXRDZWxsICh3ZWV4KSB7XG4gIGNvbnN0IHsgZXh0cmFjdENvbXBvbmVudFN0eWxlIH0gPSB3ZWV4XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3dlZXgtY2VsbCcsXG4gICAgcmVuZGVyIChjcmVhdGVFbGVtZW50KSB7XG4gICAgICByZXR1cm4gY3JlYXRlRWxlbWVudCgnc2VjdGlvbicsIHtcbiAgICAgICAgYXR0cnM6IHsgJ3dlZXgtdHlwZSc6ICdjZWxsJyB9LFxuICAgICAgICBzdGF0aWNDbGFzczogJ3dlZXgtY2VsbCB3ZWV4LWN0JyxcbiAgICAgICAgc3RhdGljU3R5bGU6IGV4dHJhY3RDb21wb25lbnRTdHlsZSh0aGlzKVxuICAgICAgfSwgdGhpcy4kc2xvdHMuZGVmYXVsdClcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0ICh3ZWV4KSB7XG4gICAgd2VleC5yZWdpc3RlckNvbXBvbmVudCgnY2VsbCcsIGdldENlbGwod2VleCkpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5mdW5jdGlvbiBnZXRIZWFkZXIgKHdlZXgpIHtcbiAgY29uc3QgeyBleHRyYWN0Q29tcG9uZW50U3R5bGUgfSA9IHdlZXhcbiAgY29uc3QgeyBzdXBwb3J0U3RpY2t5IH0gPSB3ZWV4LnV0aWxzXG5cbiAgcmV0dXJuIHtcbiAgICBkYXRhICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0aWNreTogZmFsc2UsXG4gICAgICAgIGluaXRUb3A6IDAsXG4gICAgICAgIHBsYWNlaG9sZGVyOiBudWxsLFxuICAgICAgICBzdXBwb3J0U3RpY2t5OiBzdXBwb3J0U3RpY2t5KClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbW91bnRlZCAoKSB7XG4gICAgICB0aGlzLmluaXRUb3AgPSB0aGlzLiRlbC5vZmZzZXRUb3BcbiAgICAgIHRoaXMucGxhY2Vob2xkZXIgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaGVhZGVyJylcbiAgICB9LFxuXG4gICAgdXBkYXRlZCAoKSB7XG4gICAgICBpZiAoIXRoaXMuc3RpY2t5KSB7XG4gICAgICAgIHRoaXMuaW5pdFRvcCA9IHRoaXMuJGVsLm9mZnNldFRvcFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBtZXRob2RzOiB7XG4gICAgICBhZGRTdGlja3kgKCkge1xuICAgICAgICB0aGlzLnN0aWNreSA9IHRydWVcbiAgICAgICAgdGhpcy5wbGFjZWhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xuICAgICAgICB0aGlzLnBsYWNlaG9sZGVyLnN0eWxlLndpZHRoID0gdGhpcy4kZWwub2Zmc2V0V2lkdGggKyAncHgnXG4gICAgICAgIHRoaXMucGxhY2Vob2xkZXIuc3R5bGUuaGVpZ2h0ID0gdGhpcy4kZWwub2Zmc2V0SGVpZ2h0ICsgJ3B4J1xuICAgICAgICB0aGlzLiRlbC5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnBsYWNlaG9sZGVyLCB0aGlzLiRlbClcbiAgICAgIH0sXG5cbiAgICAgIHJlbW92ZVN0aWNreSAoKSB7XG4gICAgICAgIHRoaXMuc3RpY2t5ID0gZmFsc2VcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLiRlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucGxhY2Vob2xkZXIpXG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICByZW5kZXIgKGNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgIC8vICAgdmFsaWRhdGVTdHlsZXMoJ2hlYWRlcicsIHRoaXMuJHZub2RlLmRhdGEgJiYgdGhpcy4kdm5vZGUuZGF0YS5zdGF0aWNTdHlsZSlcbiAgICAgIC8vIH1cbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KCdodG1sOmhlYWRlcicsIHtcbiAgICAgICAgYXR0cnM6IHsgJ3dlZXgtdHlwZSc6ICdoZWFkZXInIH0sXG4gICAgICAgIHJlZjogJ2hlYWRlcicsXG4gICAgICAgIHN0YXRpY0NsYXNzOiAnd2VleC1oZWFkZXIgd2VleC1jdCcsXG4gICAgICAgIGNsYXNzOiB7ICd3ZWV4LXN0aWNreSc6IHRoaXMuc3RpY2t5LCAnd2VleC1pb3Mtc3RpY2t5JzogdGhpcy5zdXBwb3J0U3RpY2t5IH0sXG4gICAgICAgIHN0YXRpY1N0eWxlOiBleHRyYWN0Q29tcG9uZW50U3R5bGUodGhpcylcbiAgICAgIH0sIHRoaXMuJHNsb3RzLmRlZmF1bHQpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdCAod2VleCkge1xuICAgIHdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ2hlYWRlcicsIGdldEhlYWRlcih3ZWV4KSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmZ1bmN0aW9uIGdldExvYWRpbmcgKCkge1xuICBjb25zdCB7IGV4dHJhY3RDb21wb25lbnRTdHlsZSB9ID0gd2VleFxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3dlZXgtbG9hZGluZycsXG4gICAgcHJvcHM6IHtcbiAgICAgIGRpc3BsYXk6IHtcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICBkZWZhdWx0OiAnc2hvdycsXG4gICAgICAgIHZhbGlkYXRvciAodmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gWydzaG93JywgJ2hpZGUnXS5pbmRleE9mKHZhbHVlKSAhPT0gLTFcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgZGF0YSAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoZWlnaHQ6IC0xLFxuICAgICAgICB2aWV3SGVpZ2h0OiAwXG4gICAgICB9XG4gICAgfSxcbiAgICBtb3VudGVkICgpIHtcbiAgICAgIHRoaXMudmlld0hlaWdodCA9IHRoaXMuJGVsLm9mZnNldEhlaWdodFxuICAgICAgaWYgKHRoaXMuZGlzcGxheSA9PT0gJ2hpZGUnKSB7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMFxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy52aWV3SGVpZ2h0XG4gICAgICB9XG4gICAgfSxcbiAgICB3YXRjaDoge1xuICAgICAgaGVpZ2h0ICh2YWwpIHtcbiAgICAgICAgdGhpcy4kZWwuc3R5bGUuaGVpZ2h0ID0gYCR7dmFsfXB4YFxuICAgICAgfSxcbiAgICAgIGRpc3BsYXkgKHZhbCkge1xuICAgICAgICBpZiAodmFsID09PSAnaGlkZScpIHtcbiAgICAgICAgICB0aGlzLmhlaWdodCA9IDBcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMudmlld0hlaWdodFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBtZXRob2RzOiB7XG4gICAgICBwdWxsaW5nIChvZmZzZXRZID0gMCkge1xuICAgICAgICB0aGlzLmhlaWdodCA9IG9mZnNldFlcbiAgICAgIH0sXG4gICAgICBwdWxsaW5nVXAgKG9mZnNldFkpIHtcbiAgICAgICAgdGhpcy4kZWwuc3R5bGUudHJhbnNpdGlvbiA9IGBoZWlnaHQgMHNgXG4gICAgICAgIHRoaXMucHVsbGluZyhvZmZzZXRZKVxuICAgICAgfSxcbiAgICAgIHB1bGxpbmdFbmQgKCkge1xuICAgICAgICB0aGlzLiRlbC5zdHlsZS50cmFuc2l0aW9uID0gYGhlaWdodCAuMnNgXG4gICAgICAgIGlmICh0aGlzLmhlaWdodCA+PSB0aGlzLnZpZXdIZWlnaHQpIHtcbiAgICAgICAgICB0aGlzLnB1bGxpbmcodGhpcy52aWV3SGVpZ2h0KVxuICAgICAgICAgIHRoaXMuJGVtaXQoJ2xvYWRpbmcnKVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMucHVsbGluZygwKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0Q2hpbGRyZW4gKCkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuJHNsb3RzLmRlZmF1bHQgfHwgW11cbiAgICAgICAgaWYgKHRoaXMuZGlzcGxheSA9PT0gJ3Nob3cnKSB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkcmVuXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuLmZpbHRlcih2bm9kZSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHZub2RlLmNvbXBvbmVudE9wdGlvbnNcbiAgICAgICAgICAgICYmIHZub2RlLmNvbXBvbmVudE9wdGlvbnMudGFnICE9PSAnbG9hZGluZy1pbmRpY2F0b3InXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSxcbiAgICByZW5kZXIgKGNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuJHBhcmVudC5fbG9hZGluZyA9IHRoaXNcbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KCdhc2lkZScsIHtcbiAgICAgICAgcmVmOiAnbG9hZGluZycsXG4gICAgICAgIGF0dHJzOiB7ICd3ZWV4LXR5cGUnOiAnbG9hZGluZycgfSxcbiAgICAgICAgc3RhdGljQ2xhc3M6ICd3ZWV4LWxvYWRpbmcgd2VleC1jdCcsXG4gICAgICAgIHN0YXRpY1N0eWxlOiBleHRyYWN0Q29tcG9uZW50U3R5bGUodGhpcylcbiAgICAgIH0sIHRoaXMuZ2V0Q2hpbGRyZW4oKSlcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0ICh3ZWV4KSB7XG4gICAgd2VleC5yZWdpc3RlckNvbXBvbmVudCgnbG9hZGluZycsIGdldExvYWRpbmcod2VleCkpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5mdW5jdGlvbiBnZXRSZWZyZXNoICh3ZWV4KSB7XG4gIGNvbnN0IHsgZXh0cmFjdENvbXBvbmVudFN0eWxlIH0gPSB3ZWV4XG4gIGNvbnN0IHsgY3JlYXRlRXZlbnQgfSA9IHdlZXgudXRpbHNcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3ZWV4LXJlZnJlc2gnLFxuICAgIHByb3BzOiB7XG4gICAgICBkaXNwbGF5OiB7XG4gICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgZGVmYXVsdDogJ3Nob3cnLFxuICAgICAgICB2YWxpZGF0b3IgKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIFsnc2hvdycsICdoaWRlJ10uaW5kZXhPZih2YWx1ZSkgIT09IC0xXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGRhdGEgKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFzdER5OiAwLFxuICAgICAgICB2aWV3SGVpZ2h0OiAwLFxuICAgICAgICBoZWlnaHQ6IC0xXG4gICAgICB9XG4gICAgfSxcbiAgICBtb3VudGVkICgpIHtcbiAgICAgIHRoaXMudmlld0hlaWdodCA9IHRoaXMuJGVsLm9mZnNldEhlaWdodFxuICAgICAgaWYgKHRoaXMuZGlzcGxheSA9PT0gJ2hpZGUnKSB7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMFxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy52aWV3SGVpZ2h0XG4gICAgICB9XG4gICAgfSxcbiAgICB3YXRjaDoge1xuICAgICAgaGVpZ2h0ICh2YWwpIHtcbiAgICAgICAgdGhpcy4kZWwuc3R5bGUuaGVpZ2h0ID0gYCR7dmFsfXB4YFxuICAgICAgfSxcbiAgICAgIGRpc3BsYXkgKHZhbCkge1xuICAgICAgICBpZiAodmFsID09PSAnaGlkZScpIHtcbiAgICAgICAgICB0aGlzLmhlaWdodCA9IDBcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMudmlld0hlaWdodFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBtZXRob2RzOiB7XG4gICAgICBwdWxsaW5nIChvZmZzZXRZID0gMCkge1xuICAgICAgICB0aGlzLmhlaWdodCA9IG9mZnNldFlcbiAgICAgICAgdGhpcy4kZW1pdCgncHVsbGluZ2Rvd24nLCBjcmVhdGVFdmVudCh0aGlzLCAncHVsbGluZ2Rvd24nLCB7XG4gICAgICAgICAgZHk6IG9mZnNldFkgLSB0aGlzLmxhc3REeSxcbiAgICAgICAgICBwdWxsaW5nRGlzdGFuY2U6IG9mZnNldFksXG4gICAgICAgICAgdmlld0hlaWdodDogdGhpcy52aWV3SGVpZ2h0XG4gICAgICAgIH0pKVxuICAgICAgICB0aGlzLmxhc3REeSA9IG9mZnNldFlcbiAgICAgIH0sXG4gICAgICBwdWxsaW5nRG93biAob2Zmc2V0WSkge1xuICAgICAgICB0aGlzLiRlbC5zdHlsZS50cmFuc2l0aW9uID0gYGhlaWdodCAwc2BcbiAgICAgICAgdGhpcy5wdWxsaW5nKG9mZnNldFkpXG4gICAgICB9LFxuICAgICAgcHVsbGluZ0VuZCAoKSB7XG4gICAgICAgIHRoaXMuJGVsLnN0eWxlLnRyYW5zaXRpb24gPSBgaGVpZ2h0IC4yc2BcbiAgICAgICAgaWYgKHRoaXMuaGVpZ2h0ID49IHRoaXMudmlld0hlaWdodCkge1xuICAgICAgICAgIHRoaXMucHVsbGluZyh0aGlzLnZpZXdIZWlnaHQpXG4gICAgICAgICAgdGhpcy4kZW1pdCgncmVmcmVzaCcpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5wdWxsaW5nKDApXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXRDaGlsZHJlbiAoKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy4kc2xvdHMuZGVmYXVsdCB8fCBbXVxuICAgICAgICBpZiAodGhpcy5kaXNwbGF5ID09PSAnc2hvdycpIHtcbiAgICAgICAgICByZXR1cm4gY2hpbGRyZW5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hpbGRyZW4uZmlsdGVyKHZub2RlID0+IHtcbiAgICAgICAgICByZXR1cm4gdm5vZGUuY29tcG9uZW50T3B0aW9uc1xuICAgICAgICAgICAgJiYgdm5vZGUuY29tcG9uZW50T3B0aW9ucy50YWcgIT09ICdsb2FkaW5nLWluZGljYXRvcidcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlbmRlciAoY3JlYXRlRWxlbWVudCkge1xuICAgICAgdGhpcy4kcGFyZW50Ll9yZWZyZXNoID0gdGhpc1xuICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoJ2FzaWRlJywge1xuICAgICAgICByZWY6ICdyZWZyZXNoJyxcbiAgICAgICAgYXR0cnM6IHsgJ3dlZXgtdHlwZSc6ICdyZWZyZXNoJyB9LFxuICAgICAgICBzdGF0aWNDbGFzczogJ3dlZXgtcmVmcmVzaCB3ZWV4LWN0JyxcbiAgICAgICAgc3RhdGljU3R5bGU6IGV4dHJhY3RDb21wb25lbnRTdHlsZSh0aGlzKVxuICAgICAgfSwgdGhpcy5nZXRDaGlsZHJlbigpKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKHdlZXgpIHtcbiAgICB3ZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdyZWZyZXNoJywgZ2V0UmVmcmVzaCh3ZWV4KSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5sZXQgZXh0cmFjdENvbXBvbmVudFN0eWxlLCBnZXRSZ2IsIGxvb3BBcnJheSwgZ2V0U3R5bGVTaGVldEJ5SWRcblxuY29uc3QgX2NzcyA9IGBcbi53ZWV4LXJlZnJlc2gtaW5kaWNhdG9yLFxuLndlZXgtbG9hZGluZy1pbmRpY2F0b3Ige1xuICB3aWR0aDogMXJlbSAhaW1wb3J0YW50O1xuICBoZWlnaHQ6IDFyZW0gIWltcG9ydGFudDtcbiAgLXdlYmtpdC1ib3gtYWxpZ246IGNlbnRlcjtcbiAgLW1vei1ib3gtYWxpZ246IGNlbnRlcjtcbiAgLXdlYmtpdC1hbGlnbi1pdGVtczogY2VudGVyO1xuICAtbXMtZmxleC1hbGlnbjogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAtd2Via2l0LWJveC1wYWNrOiBjZW50ZXI7XG4gIC1tb3otYm94LXBhY2s6IGNlbnRlcjtcbiAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgLW1zLWZsZXgtcGFjazogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG4gIGJhY2tncm91bmQ6IG5vbmU7XG59XG4ud2VleC1yZWZyZXNoLWluZGljYXRvcjpiZWZvcmUsXG4ud2VleC1sb2FkaW5nLWluZGljYXRvcjpiZWZvcmUge1xuICBkaXNwbGF5OiBibG9jaztcbiAgY29udGVudDogJyc7XG4gIGZvbnQtc2l6ZTogMC4xNnJlbTtcbiAgd2lkdGg6IDAuNWVtO1xuICBoZWlnaHQ6IDAuNWVtO1xuICBsZWZ0OiAwO1xuICB0b3A6IDA7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0ZXh0LWluZGVudDogLTk5OTllbTtcbiAgLXdlYmtpdC1hbmltYXRpb246IHdlZXgtc3Bpbm5lciAxLjFzIGluZmluaXRlIGVhc2U7XG4gIC1tb3otYW5pbWF0aW9uOiB3ZWV4LXNwaW5uZXIgMS4xcyBpbmZpbml0ZSBlYXNlO1xuICBhbmltYXRpb246IHdlZXgtc3Bpbm5lciAxLjFzIGluZmluaXRlIGVhc2U7XG59XG5cbkAtd2Via2l0LWtleWZyYW1lcyB3ZWV4LXNwaW5uZXIge1xuICAwJSxcbiAgMTAwJSB7XG4gICAgYm94LXNoYWRvdzogMGVtIC0xLjNlbSAwZW0gMGVtICNmZmZmZmYsIDAuOWVtIC0wLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDEuMjVlbSAwZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwLjg3NWVtIDAuODc1ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwZW0gMS4yNWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTAuOWVtIDAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTEuM2VtIDBlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSksIC0wLjllbSAtMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xuICB9XG4gIDExLjI1JSB7XG4gICAgYm94LXNoYWRvdzogMGVtIC0xLjNlbSAwZW0gMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KSwgMC45ZW0gLTAuOWVtIDAgMGVtICNmZmZmZmYsIDEuMjVlbSAwZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwLjg3NWVtIDAuODc1ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwZW0gMS4yNWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTAuOWVtIDAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTEuM2VtIDBlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIC0wLjllbSAtMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpO1xuICB9XG4gIDI1JSB7XG4gICAgYm94LXNoYWRvdzogMGVtIC0xLjNlbSAwZW0gMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSwgMC45ZW0gLTAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KSwgMS4yNWVtIDBlbSAwIDBlbSAjZmZmZmZmLCAwLjg3NWVtIDAuODc1ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwZW0gMS4yNWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTAuOWVtIDAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTEuM2VtIDBlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIC0wLjllbSAtMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpO1xuICB9XG4gIDM3LjUlIHtcbiAgICBib3gtc2hhZG93OiAwZW0gLTEuM2VtIDBlbSAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwLjllbSAtMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpLCAxLjI1ZW0gMGVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KSwgMC44NzVlbSAwLjg3NWVtIDAgMGVtICNmZmZmZmYsIDBlbSAxLjI1ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAtMC45ZW0gMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAtMS4zZW0gMGVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTAuOWVtIC0wLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7XG4gIH1cbiAgNTAlIHtcbiAgICBib3gtc2hhZG93OiAwZW0gLTEuM2VtIDBlbSAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwLjllbSAtMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAxLjI1ZW0gMGVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSwgMC44NzVlbSAwLjg3NWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KSwgMGVtIDEuMjVlbSAwIDBlbSAjZmZmZmZmLCAtMC45ZW0gMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAtMS4zZW0gMGVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTAuOWVtIC0wLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7XG4gIH1cbiAgNjEuMjUlIHtcbiAgICBib3gtc2hhZG93OiAwZW0gLTEuM2VtIDBlbSAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwLjllbSAtMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAxLjI1ZW0gMGVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMC44NzVlbSAwLjg3NWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSwgMGVtIDEuMjVlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyksIC0wLjllbSAwLjllbSAwIDBlbSAjZmZmZmZmLCAtMS4zZW0gMGVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTAuOWVtIC0wLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7XG4gIH1cbiAgNzUlIHtcbiAgICBib3gtc2hhZG93OiAwZW0gLTEuM2VtIDBlbSAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwLjllbSAtMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAxLjI1ZW0gMGVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMC44NzVlbSAwLjg3NWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMGVtIDEuMjVlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSksIC0wLjllbSAwLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyksIC0xLjNlbSAwZW0gMCAwZW0gI2ZmZmZmZiwgLTAuOWVtIC0wLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7XG4gIH1cbiAgODcuNSUge1xuICAgIGJveC1zaGFkb3c6IDBlbSAtMS4zZW0gMGVtIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDAuOWVtIC0wLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDEuMjVlbSAwZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwLjg3NWVtIDAuODc1ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwZW0gMS4yNWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTAuOWVtIDAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSwgLTEuM2VtIDBlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyksIC0wLjllbSAtMC45ZW0gMCAwZW0gI2ZmZmZmZjtcbiAgfVxufVxuXG5Aa2V5ZnJhbWVzIHdlZXgtc3Bpbm5lciB7XG4gIDAlLFxuICAxMDAlIHtcbiAgICBib3gtc2hhZG93OiAwZW0gLTEuM2VtIDBlbSAwZW0gI2ZmZmZmZiwgMC45ZW0gLTAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMS4yNWVtIDBlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDAuODc1ZW0gMC44NzVlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDBlbSAxLjI1ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAtMC45ZW0gMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAtMS4zZW0gMGVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSwgLTAuOWVtIC0wLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7XG4gIH1cbiAgMTEuMjUlIHtcbiAgICBib3gtc2hhZG93OiAwZW0gLTEuM2VtIDBlbSAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpLCAwLjllbSAtMC45ZW0gMCAwZW0gI2ZmZmZmZiwgMS4yNWVtIDBlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDAuODc1ZW0gMC44NzVlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDBlbSAxLjI1ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAtMC45ZW0gMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAtMS4zZW0gMGVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTAuOWVtIC0wLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSk7XG4gIH1cbiAgMjUlIHtcbiAgICBib3gtc2hhZG93OiAwZW0gLTEuM2VtIDBlbSAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpLCAwLjllbSAtMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpLCAxLjI1ZW0gMGVtIDAgMGVtICNmZmZmZmYsIDAuODc1ZW0gMC44NzVlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDBlbSAxLjI1ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAtMC45ZW0gMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAtMS4zZW0gMGVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgLTAuOWVtIC0wLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7XG4gIH1cbiAgMzcuNSUge1xuICAgIGJveC1zaGFkb3c6IDBlbSAtMS4zZW0gMGVtIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDAuOWVtIC0wLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSksIDEuMjVlbSAwZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpLCAwLjg3NWVtIDAuODc1ZW0gMCAwZW0gI2ZmZmZmZiwgMGVtIDEuMjVlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIC0wLjllbSAwLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIC0xLjNlbSAwZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAtMC45ZW0gLTAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTtcbiAgfVxuICA1MCUge1xuICAgIGJveC1zaGFkb3c6IDBlbSAtMS4zZW0gMGVtIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDAuOWVtIC0wLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDEuMjVlbSAwZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpLCAwLjg3NWVtIDAuODc1ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpLCAwZW0gMS4yNWVtIDAgMGVtICNmZmZmZmYsIC0wLjllbSAwLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIC0xLjNlbSAwZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAtMC45ZW0gLTAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTtcbiAgfVxuICA2MS4yNSUge1xuICAgIGJveC1zaGFkb3c6IDBlbSAtMS4zZW0gMGVtIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDAuOWVtIC0wLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDEuMjVlbSAwZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwLjg3NWVtIDAuODc1ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpLCAwZW0gMS4yNWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KSwgLTAuOWVtIDAuOWVtIDAgMGVtICNmZmZmZmYsIC0xLjNlbSAwZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAtMC45ZW0gLTAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTtcbiAgfVxuICA3NSUge1xuICAgIGJveC1zaGFkb3c6IDBlbSAtMS4zZW0gMGVtIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDAuOWVtIC0wLjllbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDEuMjVlbSAwZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwLjg3NWVtIDAuODc1ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAwZW0gMS4yNWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSwgLTAuOWVtIDAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KSwgLTEuM2VtIDBlbSAwIDBlbSAjZmZmZmZmLCAtMC45ZW0gLTAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTtcbiAgfVxuICA4Ny41JSB7XG4gICAgYm94LXNoYWRvdzogMGVtIC0xLjNlbSAwZW0gMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMC45ZW0gLTAuOWVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSwgMS4yNWVtIDBlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDAuODc1ZW0gMC44NzVlbSAwIDBlbSByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDBlbSAxLjI1ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpLCAtMC45ZW0gMC45ZW0gMCAwZW0gcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpLCAtMS4zZW0gMGVtIDAgMGVtIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KSwgLTAuOWVtIC0wLjllbSAwIDBlbSAjZmZmZmZmO1xuICB9XG59XG5gXG5cbmZ1bmN0aW9uIGdldFN0eWxlU2hlZXQgKHNwaW5uZXJWbSkge1xuICBpZiAoc3Bpbm5lclZtLl9zdHlsZVNoZWV0KSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgc3Bpbm5lclZtLl9zdHlsZVNoZWV0ID0gZ2V0U3R5bGVTaGVldEJ5SWQoJ3dlZXgtY21wLWxvYWRpbmctaW5kaWNhdG9yJylcbn1cblxuZnVuY3Rpb24gc2V0S2V5ZnJhbWVDb2xvciAoc3Bpbm5lclZtLCB2YWwpIHtcbiAgZ2V0U3R5bGVTaGVldChzcGlubmVyVm0pXG4gIGNvbnN0IGtleWZyYW1lUnVsZXMgPSBjb21wdXRlS2V5RnJhbWVSdWxlcyh2YWwpXG4gIGNvbnN0IHJ1bGVzID0gc3Bpbm5lclZtLl9zdHlsZVNoZWV0LnJ1bGVzIHx8IHNwaW5uZXJWbS5fc3R5bGVTaGVldC5jc3NSdWxlc1xuICBmb3IgKGxldCBpID0gMCwgbCA9IHJ1bGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IGl0ZW0gPSBydWxlcy5pdGVtKGkpXG4gICAgaWYgKChpdGVtLnR5cGUgPT09IENTU1J1bGUuS0VZRlJBTUVTX1JVTEVcbiAgICAgICAgICB8fCBpdGVtLnR5cGUgPT09IENTU1J1bGUuV0VCS0lUX0tFWUZSQU1FU19SVUxFKVxuICAgICAgICAmJiBpdGVtLm5hbWUgPT09ICd3ZWV4LXNwaW5uZXInKSB7XG4gICAgICBjb25zdCBjc3NSdWxlcyA9IGl0ZW0uY3NzUnVsZXNcbiAgICAgIGZvciAobGV0IGogPSAwLCBtID0gY3NzUnVsZXMubGVuZ3RoOyBqIDwgbTsgaisrKSB7XG4gICAgICAgIGNvbnN0IGtleWZyYW1lID0gY3NzUnVsZXNbal1cbiAgICAgICAgaWYgKGtleWZyYW1lLnR5cGUgPT09IENTU1J1bGUuS0VZRlJBTUVfUlVMRVxuICAgICAgICAgIHx8IGtleWZyYW1lLnR5cGUgPT09IENTU1J1bGUuV0VCS0lUX0tFWUZSQU1FX1JVTEUpIHtcbiAgICAgICAgICBrZXlmcmFtZS5zdHlsZS5ib3hTaGFkb3cgPSBrZXlmcmFtZVJ1bGVzW2pdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcHV0ZUtleUZyYW1lUnVsZXMgKHJnYikge1xuICBpZiAoIXJnYikge1xuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IHNjYWxlQXJyID0gW1xuICAgICcwZW0gLTEuM2VtIDBlbSAwZW0nLFxuICAgICcwLjllbSAtMC45ZW0gMCAwZW0nLFxuICAgICcxLjI1ZW0gMGVtIDAgMGVtJyxcbiAgICAnMC44NzVlbSAwLjg3NWVtIDAgMGVtJyxcbiAgICAnMGVtIDEuMjVlbSAwIDBlbScsXG4gICAgJy0wLjllbSAwLjllbSAwIDBlbScsXG4gICAgJy0xLjNlbSAwZW0gMCAwZW0nLFxuICAgICctMC45ZW0gLTAuOWVtIDAgMGVtJ11cbiAgY29uc3QgY29sb3JBcnIgPSBbXG4gICAgJzEnLFxuICAgICcwLjInLFxuICAgICcwLjInLFxuICAgICcwLjInLFxuICAgICcwLjInLFxuICAgICcwLjInLFxuICAgICcwLjUnLFxuICAgICcwLjcnXS5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiAncmdiYSgnICsgcmdiLnIgKyAnLCcgKyByZ2IuZyArICcsJyArIHJnYi5iICsgJywnICsgZSArICcpJ1xuICAgIH0pXG4gIGNvbnN0IHJ1bGVzID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2FsZUFyci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRtcENvbG9yQXJyID0gbG9vcEFycmF5KGNvbG9yQXJyLCBpLCAncicpXG4gICAgcnVsZXMucHVzaChzY2FsZUFyci5tYXAoZnVuY3Rpb24gKHNjYWxlU3RyLCBpKSB7XG4gICAgICByZXR1cm4gc2NhbGVTdHIgKyAnICcgKyB0bXBDb2xvckFycltpXVxuICAgIH0pLmpvaW4oJywgJykpXG4gIH1cbiAgcmV0dXJuIHJ1bGVzXG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NTdHlsZSAodm0pIHtcbiAgY29uc3Qgc3R5bGUgPSBleHRyYWN0Q29tcG9uZW50U3R5bGUodm0pXG4gIGNvbnN0IGNvbG9yID0gc3R5bGUuY29sb3JcbiAgY29uc3QgcmdiID0gY29sb3IgJiYgZ2V0UmdiKGNvbG9yKVxuICBpZiAocmdiKSB7XG4gICAgc2V0S2V5ZnJhbWVDb2xvcih2bSwgcmdiKVxuICB9XG4gIHJldHVybiBzdHlsZVxufVxuXG5jb25zdCBsb2FkaW5nSW5kaWNhdG9yID0ge1xuICBuYW1lOiAnd2VleC1sb2FkaW5nLWluZGljYXRvcicsXG4gIHJlbmRlciAoY3JlYXRlRWxlbWVudCkge1xuICAgIHRoaXMud2VleFR5cGUgPSAnbG9hZGluZy1pbmRpY2F0b3InXG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoJ21hcmsnLCB7XG4gICAgICBhdHRyczogeyAnd2VleC10eXBlJzogJ2xvYWRpbmctaW5kaWNhdG9yJyB9LFxuICAgICAgc3RhdGljQ2xhc3M6ICd3ZWV4LWxvYWRpbmctaW5kaWNhdG9yIHdlZXgtY3QnLFxuICAgICAgc3RhdGljU3R5bGU6IHByb2Nlc3NTdHlsZSh0aGlzKVxuICAgIH0pXG4gIH0sXG4gIF9jc3Ncbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0ICh3ZWV4KSB7XG4gICAgZXh0cmFjdENvbXBvbmVudFN0eWxlID0gd2VleC5leHRyYWN0Q29tcG9uZW50U3R5bGVcbiAgICBnZXRSZ2IgPSB3ZWV4LnV0aWxzLmdldFJnYlxuICAgIGxvb3BBcnJheSA9IHdlZXgudXRpbHMubG9vcEFycmF5XG4gICAgZ2V0U3R5bGVTaGVldEJ5SWQgPSB3ZWV4LnV0aWxzLmdldFN0eWxlU2hlZXRCeUlkXG4gICAgd2VleC5yZWdpc3RlckNvbXBvbmVudCgnbG9hZGluZy1pbmRpY2F0b3InLCBsb2FkaW5nSW5kaWNhdG9yKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IGxpc3QgZnJvbSAnLi9saXN0J1xuaW1wb3J0IHNjcm9sbGVyIGZyb20gJy4vc2Nyb2xsZXInXG5pbXBvcnQgd2F0ZXJmYWxsIGZyb20gJy4vd2F0ZXJmYWxsJ1xuaW1wb3J0IGNlbGwgZnJvbSAnLi9jZWxsJ1xuaW1wb3J0IGhlYWRlciBmcm9tICcuL2hlYWRlcidcbmltcG9ydCBsb2FkaW5nIGZyb20gJy4vbG9hZGluZydcbmltcG9ydCByZWZyZXNoIGZyb20gJy4vcmVmcmVzaCdcbmltcG9ydCBsb2FkaW5nSW5kaWNhdG9yIGZyb20gJy4vbG9hZGluZy1pbmRpY2F0b3InXG5cbmltcG9ydCAnLi9zdHlsZS5jc3MnXG5cbmNvbnN0IG1vZHVsZXMgPSBbXG4gIGxpc3QsXG4gIHNjcm9sbGVyLFxuICB3YXRlcmZhbGwsXG4gIGNlbGwsXG4gIGhlYWRlcixcbiAgbG9hZGluZyxcbiAgcmVmcmVzaCxcbiAgbG9hZGluZ0luZGljYXRvclxuXVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKHdlZXgpIHtcbiAgICBtb2R1bGVzLmZvckVhY2goZnVuY3Rpb24gKG1vZCkge1xuICAgICAgd2VleC5pbnN0YWxsKG1vZClcbiAgICB9KVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCAnLi9zbGlkZXIuY3NzJ1xuXG5jb25zdCBUUkFOU0lUSU9OX1RJTUUgPSA0MDBcbmNvbnN0IE5FSUdIQk9SX1NDQUxFX1RJTUUgPSAxMDBcbmNvbnN0IE1BSU5fU0xJREVfT1BBQ0lUWSA9IDFcbmNvbnN0IFRIUk9UVExFX1NDUk9MTF9USU1FID0gMjVcbmNvbnN0IElOVEVSVkFMX01JTklNVU0gPSAyMDBcblxuZXhwb3J0IGRlZmF1bHQge1xuICBjcmVhdGVkICgpIHtcbiAgICB0aGlzLl9jbG9uZXMgPSBbXVxuICAgIHRoaXMuaW5uZXJPZmZzZXQgPSAwXG4gICAgdGhpcy5faW5kaWNhdG9yID0gbnVsbFxuICB9LFxuXG4gIGJlZm9yZVVwZGF0ZSAoKSB7XG4gICAgdGhpcy5fZ2V0V3JhcHBlclNpemUoKVxuICB9LFxuXG4gIHVwZGF0ZWQgKCkge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy4kY2hpbGRyZW5cbiAgICBjb25zdCBsZW4gPSBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGhcbiAgICBpZiAoY2hpbGRyZW4gJiYgbGVuID4gMCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCB2bSA9IGNoaWxkcmVuW2ldXG4gICAgICAgIGlmICh2bS4kb3B0aW9ucy5fY29tcG9uZW50VGFnID09PSAnaW5kaWNhdG9yJ1xuICAgICAgICAgIHx8IHZtLiR2bm9kZS5kYXRhLnJlZiA9PT0gJ2luZGljYXRvcicpIHtcbiAgICAgICAgICB2bS5fd2F0Y2hlci5nZXQoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgd2VleC51dGlscy5maXJlTGF6eWxvYWQodGhpcy4kZWwsIHRydWUpXG4gICAgaWYgKHRoaXMuX3ByZUluZGV4ICE9PSB0aGlzLmN1cnJlbnRJbmRleCkge1xuICAgICAgdGhpcy5fc2xpZGVUbyh0aGlzLmN1cnJlbnRJbmRleClcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCAoKSB7XG4gICAgdGhpcy5fZ2V0V3JhcHBlclNpemUoKVxuICAgIHRoaXMuX3NsaWRlVG8odGhpcy5jdXJyZW50SW5kZXgpXG4gICAgd2VleC51dGlscy5maXJlTGF6eWxvYWQodGhpcy4kZWwsIHRydWUpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIF9nZXRXcmFwcGVyU2l6ZSAoKSB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy4kcmVmcy53cmFwcGVyXG4gICAgICBpZiAod3JhcHBlcikge1xuICAgICAgICBjb25zdCByZWN0ID0gd3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICB0aGlzLl93cmFwcGVyV2lkdGggPSByZWN0LndpZHRoXG4gICAgICAgIHRoaXMuX3dyYXBwZXJIZWlnaHQgPSByZWN0LmhlaWdodFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBfZm9ybWF0Q2hpbGRyZW4gKGNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy4kc2xvdHMuZGVmYXVsdCB8fCBbXVxuICAgICAgbGV0IGluZGljYXRvclZub2RlXG4gICAgICBjb25zdCBjZWxscyA9IGNoaWxkcmVuLmZpbHRlcih2bm9kZSA9PiB7XG4gICAgICAgIGlmICghdm5vZGUudGFnKSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKHZub2RlLmNvbXBvbmVudE9wdGlvbnMgJiYgdm5vZGUuY29tcG9uZW50T3B0aW9ucy50YWcgPT09ICdpbmRpY2F0b3InKSB7XG4gICAgICAgICAgaW5kaWNhdG9yVm5vZGUgPSB2bm9kZVxuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9KS5tYXAodm5vZGUgPT4ge1xuICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudCgnbGknLCB7XG4gICAgICAgICAgcmVmOiAnY2VsbHMnLFxuICAgICAgICAgIHN0YXRpY0NsYXNzOiBgd2VleC1zbGlkZXItY2VsbCB3ZWV4LWN0JHt0aGlzLmlzTmVpZ2hib3IgPyAnIG5laWdoYm9yLWNlbGwnIDogJyd9YFxuICAgICAgICB9LCBbdm5vZGVdKVxuICAgICAgfSlcbiAgICAgIGlmIChpbmRpY2F0b3JWbm9kZSkge1xuICAgICAgICBpbmRpY2F0b3JWbm9kZS5kYXRhLmF0dHJzID0gaW5kaWNhdG9yVm5vZGUuZGF0YS5hdHRycyB8fCB7fVxuICAgICAgICBpbmRpY2F0b3JWbm9kZS5kYXRhLmF0dHJzLmNvdW50ID0gY2VsbHMubGVuZ3RoXG4gICAgICAgIGluZGljYXRvclZub2RlLmRhdGEuYXR0cnMuYWN0aXZlID0gdGhpcy5jdXJyZW50SW5kZXhcbiAgICAgICAgdGhpcy5faW5kaWNhdG9yID0gaW5kaWNhdG9yVm5vZGVcbiAgICAgIH1cbiAgICAgIHJldHVybiBjZWxsc1xuICAgIH0sXG5cbiAgICBfcmVuZGVyU2xpZGVzIChjcmVhdGVFbGVtZW50KSB7XG4gICAgICB0aGlzLl9jZWxscyA9IHRoaXMuX2Zvcm1hdENoaWxkcmVuKGNyZWF0ZUVsZW1lbnQpXG4gICAgICB0aGlzLmZyYW1lQ291bnQgPSB0aGlzLl9jZWxscy5sZW5ndGhcbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFxuICAgICAgICAnbmF2JyxcbiAgICAgICAge1xuICAgICAgICAgIHJlZjogJ3dyYXBwZXInLFxuICAgICAgICAgIGF0dHJzOiB7ICd3ZWV4LXR5cGUnOiB0aGlzLmlzTmVpZ2hib3IgPyAnc2xpZGVyLW5laWdoYm9yJyA6ICdzbGlkZXInIH0sXG4gICAgICAgICAgb246IHdlZXguY3JlYXRlRXZlbnRNYXAoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgWydzY3JvbGwnLCAnc2Nyb2xsc3RhcnQnLCAnc2Nyb2xsZW5kJ10sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRvdWNoc3RhcnQ6IHRoaXMuX2hhbmRsZVRvdWNoU3RhcnQsXG4gICAgICAgICAgICAgIHRvdWNobW92ZTogd2VleC51dGlscy50aHJvdHRsZSh3ZWV4LnV0aWxzLmJpbmQodGhpcy5faGFuZGxlVG91Y2hNb3ZlLCB0aGlzKSwgMjUpLFxuICAgICAgICAgICAgICB0b3VjaGVuZDogdGhpcy5faGFuZGxlVG91Y2hFbmQsXG4gICAgICAgICAgICAgIHRvdWNoY2FuY2VsOiB0aGlzLl9oYW5kbGVUb3VjaENhbmNlbFxuICAgICAgICAgICAgfVxuICAgICAgICAgICksXG4gICAgICAgICAgc3RhdGljQ2xhc3M6ICd3ZWV4LXNsaWRlciB3ZWV4LXNsaWRlci13cmFwcGVyIHdlZXgtY3QnLFxuICAgICAgICAgIHN0YXRpY1N0eWxlOiB3ZWV4LmV4dHJhY3RDb21wb25lbnRTdHlsZSh0aGlzKVxuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAgY3JlYXRlRWxlbWVudCgndWwnLCB7XG4gICAgICAgICAgICByZWY6ICdpbm5lcicsXG4gICAgICAgICAgICBzdGF0aWNDbGFzczogJ3dlZXgtc2xpZGVyLWlubmVyIHdlZXgtY3QnXG4gICAgICAgICAgfSwgdGhpcy5fY2VsbHMpLFxuICAgICAgICAgIHRoaXMuX2luZGljYXRvclxuICAgICAgICBdXG4gICAgICApXG4gICAgfSxcblxuICAgIC8vIGdldCBzdGFuZGFyZCBpbmRleFxuICAgIF9ub3JtYWxpemVJbmRleCAoaW5kZXgpIHtcbiAgICAgIGNvbnN0IG5ld0luZGV4ID0gKGluZGV4ICsgdGhpcy5mcmFtZUNvdW50KSAlIHRoaXMuZnJhbWVDb3VudFxuICAgICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KG5ld0luZGV4LCAwKSwgdGhpcy5mcmFtZUNvdW50IC0gMSlcbiAgICB9LFxuXG4gICAgX3N0YXJ0QXV0b1BsYXkgKCkge1xuICAgICAgaWYgKCF0aGlzLmF1dG9QbGF5IHx8IHRoaXMuYXV0b1BsYXkgPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fYXV0b1BsYXlUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fYXV0b1BsYXlUaW1lcilcbiAgICAgICAgdGhpcy5fYXV0b1BsYXlUaW1lciA9IG51bGxcbiAgICAgIH1cbiAgICAgIGxldCBpbnRlcnZhbCA9IHBhcnNlSW50KHRoaXMuaW50ZXJ2YWwgLSBUUkFOU0lUSU9OX1RJTUUgLSBORUlHSEJPUl9TQ0FMRV9USU1FKVxuICAgICAgaW50ZXJ2YWwgPSBpbnRlcnZhbCA+IElOVEVSVkFMX01JTklNVU0gPyBpbnRlcnZhbCA6IElOVEVSVkFMX01JTklNVU1cbiAgICAgIHRoaXMuX2F1dG9QbGF5VGltZXIgPSBzZXRUaW1lb3V0KHdlZXgudXRpbHMuYmluZCh0aGlzLl9uZXh0LCB0aGlzKSwgaW50ZXJ2YWwpXG4gICAgfSxcblxuICAgIF9zdG9wQXV0b1BsYXkgKCkge1xuICAgICAgaWYgKHRoaXMuX2F1dG9QbGF5VGltZXIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2F1dG9QbGF5VGltZXIpXG4gICAgICAgIHRoaXMuX2F1dG9QbGF5VGltZXIgPSBudWxsXG4gICAgICB9XG4gICAgfSxcblxuICAgIF9zbGlkZVRvIChpbmRleCwgaXNUb3VjaFNjcm9sbCkge1xuICAgICAgaWYgKHRoaXMuZnJhbWVDb3VudCA8PSAwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmluZmluaXRlIHx8IHRoaXMuaW5maW5pdGUgPT09ICdmYWxzZScpIHtcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSB8fCBpbmRleCA+ICh0aGlzLmZyYW1lQ291bnQgLSAxKSkge1xuICAgICAgICAgIHRoaXMuX3NsaWRlVG8odGhpcy5jdXJyZW50SW5kZXgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLl9wcmVJbmRleCAmJiB0aGlzLl9wcmVJbmRleCAhPT0gMCkge1xuICAgICAgICBpZiAodGhpcy5fc2hvd05vZGVzICYmIHRoaXMuX3Nob3dOb2Rlc1swXSkge1xuICAgICAgICAgIHRoaXMuX3ByZUluZGV4ID0gdGhpcy5fc2hvd05vZGVzWzBdLmluZGV4XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcHJlSW5kZXggPSB0aGlzLmN1cnJlbnRJbmRleFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9zbGlkaW5nKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgdGhpcy5fc2xpZGluZyA9IHRydWVcblxuICAgICAgY29uc3QgbmV3SW5kZXggPSB0aGlzLl9ub3JtYWxpemVJbmRleChpbmRleClcbiAgICAgIGNvbnN0IGlubmVyID0gdGhpcy4kcmVmcy5pbm5lclxuICAgICAgY29uc3Qgc3RlcCA9IHRoaXMuX3N0ZXAgPSB0aGlzLmZyYW1lQ291bnQgPD0gMSA/IDAgOiB0aGlzLl9wcmVJbmRleCAtIGluZGV4XG5cbiAgICAgIGlmIChpbm5lcikge1xuICAgICAgICB0aGlzLl9wcmVwYXJlTm9kZXMoKVxuICAgICAgICBjb25zdCB0cmFuc2xhdGUgPSB3ZWV4LnV0aWxzLmdldFRyYW5zZm9ybU9iaihpbm5lcikudHJhbnNsYXRlXG4gICAgICAgIGNvbnN0IG1hdGNoID0gdHJhbnNsYXRlICYmIHRyYW5zbGF0ZS5tYXRjaCgvdHJhbnNsYXRlW14oXStcXCgoWystXFxkLl0rKS8pXG4gICAgICAgIGNvbnN0IGlubmVyWCA9IG1hdGNoICYmIG1hdGNoWzFdIHx8IDBcbiAgICAgICAgY29uc3QgZGlzdCA9IGlubmVyWCAtIHRoaXMuaW5uZXJPZmZzZXRcbiAgICAgICAgdGhpcy5pbm5lck9mZnNldCArPSBzdGVwICogdGhpcy5fd3JhcHBlcldpZHRoXG4gICAgICAgIC8vIHRyYW5zZm9ybSB0aGUgd2hvbGUgc2xpZGVzIGdyb3VwLlxuICAgICAgICBpbm5lci5zdHlsZS53ZWJraXRUcmFuc2l0aW9uID0gYC13ZWJraXQtdHJhbnNmb3JtICR7VFJBTlNJVElPTl9USU1FIC8gMTAwMH1zIGVhc2UtaW4tb3V0YFxuICAgICAgICBpbm5lci5zdHlsZS5tb3pUcmFuc2l0aW9uID0gYHRyYW5zZm9ybSAke1RSQU5TSVRJT05fVElNRSAvIDEwMDB9cyBlYXNlLWluLW91dGBcbiAgICAgICAgaW5uZXIuc3R5bGUudHJhbnNpdGlvbiA9IGB0cmFuc2Zvcm0gJHtUUkFOU0lUSU9OX1RJTUUgLyAxMDAwfXMgZWFzZS1pbi1vdXRgXG4gICAgICAgIGlubmVyLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgke3RoaXMuaW5uZXJPZmZzZXR9cHgsIDAsIDApYFxuICAgICAgICBpbm5lci5zdHlsZS5tb3pUcmFuc2Zvcm0gPSBgdHJhbnNsYXRlM2QoJHt0aGlzLmlubmVyT2Zmc2V0fXB4LCAwLCAwKWBcbiAgICAgICAgaW5uZXIuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZTNkKCR7dGhpcy5pbm5lck9mZnNldH1weCwgMCwgMClgXG5cbiAgICAgICAgLy8gZW1pdCBzY3JvbGwgZXZlbnRzLlxuICAgICAgICBpZiAoIWlzVG91Y2hTY3JvbGwpIHtcbiAgICAgICAgICB0aGlzLl9lbWl0U2Nyb2xsRXZlbnQoJ3Njcm9sbHN0YXJ0JylcbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLl90aHJvdHRsZUVtaXRTY3JvbGwoZGlzdCwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZW1pdFNjcm9sbEV2ZW50KCdzY3JvbGxlbmQnKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sIFRIUk9UVExFX1NDUk9MTF9USU1FKVxuXG4gICAgICAgIHRoaXMuX2xvb3BTaG93Tm9kZXMoc3RlcClcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc05laWdoYm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXROZWlnaGJvcnMoKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaW5uZXIuc3R5bGUud2Via2l0VHJhbnNpdGlvbiA9ICcnXG4gICAgICAgICAgICBpbm5lci5zdHlsZS5tb3pUcmFuc2l0aW9uID0gJydcbiAgICAgICAgICAgIGlubmVyLnN0eWxlLnRyYW5zaXRpb24gPSAnJ1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX3Nob3dTdGFydElkeDsgaSA8PSB0aGlzLl9zaG93RW5kSWR4OyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX3Nob3dOb2Rlc1tpXVxuICAgICAgICAgICAgICBpZiAoIW5vZGUpIHsgY29udGludWUgfVxuICAgICAgICAgICAgICBjb25zdCBlbG0gPSBub2RlLmZpcnN0RWxlbWVudENoaWxkXG4gICAgICAgICAgICAgIGVsbS5zdHlsZS53ZWJraXRUcmFuc2l0aW9uID0gJydcbiAgICAgICAgICAgICAgZWxtLnN0eWxlLm1velRyYW5zaXRpb24gPSAnJ1xuICAgICAgICAgICAgICBlbG0uc3R5bGUudHJhbnNpdGlvbiA9ICcnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjbGVhbiBjbG9uZWQgbm9kZXMgYW5kIHJlYXJyYW5nZSBzbGlkZSBjZWxscy5cbiAgICAgICAgICAgIHRoaXMuX3JlYXJyYW5nZU5vZGVzKG5ld0luZGV4KVxuICAgICAgICAgIH0sIE5FSUdIQk9SX1NDQUxFX1RJTUUpXG4gICAgICAgIH0sIFRSQU5TSVRJT05fVElNRSlcbiAgICAgIH1cblxuICAgICAgaWYgKG5ld0luZGV4ICE9PSB0aGlzLl9wcmVJbmRleCkge1xuICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB3ZWV4LnV0aWxzLmNyZWF0ZUV2ZW50KHRoaXMuJGVsLCAnY2hhbmdlJywge1xuICAgICAgICAgIGluZGV4OiBuZXdJbmRleFxuICAgICAgICB9KSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX2NsZWFyTm9kZXNPZmZzZXQgKCkge1xuICAgICAgY29uc3QgZW5kID0gdGhpcy5fc2hvd0VuZElkeFxuICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX3Nob3dTdGFydElkeDsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgICBsZXQgbm9kZSA9IHRoaXMuX3Nob3dOb2Rlc1tpXVxuICAgICAgICBub2RlID0gbm9kZSAmJiBub2RlLmZpcnN0RWxlbWVudENoaWxkXG4gICAgICAgIGlmICghbm9kZSkgeyBjb250aW51ZSB9XG4gICAgICAgIHdlZXgudXRpbHMuYWRkVHJhbnNmb3JtKHRoaXMuX3Nob3dOb2Rlc1tpXS5maXJzdEVsZW1lbnRDaGlsZCwge1xuICAgICAgICAgIHRyYW5zbGF0ZTogJ3RyYW5zbGF0ZTNkKDBweCwgMHB4LCAwcHgpJ1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBfbG9vcFNob3dOb2RlcyAoc3RlcCkge1xuICAgICAgaWYgKCFzdGVwIHx8IHRoaXMuZnJhbWVDb3VudCA8PSAxKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3Qgc2lnbiA9IHN0ZXAgPiAwID8gMSA6IC0xXG4gICAgICBsZXQgaSA9IHN0ZXAgPD0gMCA/IHRoaXMuX3Nob3dTdGFydElkeCA6IHRoaXMuX3Nob3dFbmRJZHhcbiAgICAgIGNvbnN0IGVuZCA9IHN0ZXAgPD0gMCA/IHRoaXMuX3Nob3dFbmRJZHggOiB0aGlzLl9zaG93U3RhcnRJZHhcbiAgICAgIGZvciAoOyBpICE9PSBlbmQgLSBzaWduOyBpIC09IHNpZ24pIHtcbiAgICAgICAgY29uc3QgbmV4dElkeCA9IGkgKyBzdGVwXG4gICAgICAgIHRoaXMuX3Nob3dOb2Rlc1tuZXh0SWR4XSA9IHRoaXMuX3Nob3dOb2Rlc1tpXVxuICAgICAgICB0aGlzLl9zaG93Tm9kZXNbbmV4dElkeF0uX3Nob3dJbmRleCA9IG5leHRJZHhcbiAgICAgICAgZGVsZXRlIHRoaXMuX3Nob3dOb2Rlc1tpXVxuICAgICAgfVxuICAgICAgdGhpcy5fc2hvd1N0YXJ0SWR4ICs9IHN0ZXBcbiAgICAgIHRoaXMuX3Nob3dFbmRJZHggKz0gc3RlcFxuICAgIH0sXG5cbiAgICBfcHJlcGFyZU5vZGVzICgpIHtcbiAgICAgIC8vIHRlc3QgaWYgdGhlIG5leHQgc2xpZGUgdG93YXJkcyB0aGUgZGlyZWN0aW9uIGV4aXN0cy5cbiAgICAgIC8vIGUuZy4gY3VycmVudEluZGV4IDAgLT4gMTogc2hvdWxkIHByZXBhcmUgNCBzbGlkZXM6IC0xLCAwLCAxLCAyXG4gICAgICAvLyBpZiBub3QsIHRyYW5zbGF0ZSBhIG5vZGUgdG8gaGVyZSwgb3IganVzdCBjbG9uZSBpdC5cbiAgICAgIGNvbnN0IHN0ZXAgPSB0aGlzLl9zdGVwXG4gICAgICBpZiAoIXRoaXMuX2luaXRlZCkge1xuICAgICAgICB0aGlzLl9pbml0Tm9kZXMoKVxuICAgICAgICB0aGlzLl9pbml0ZWQgPSB0cnVlXG4gICAgICAgIHRoaXMuX3Nob3dOb2RlcyA9IHt9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5mcmFtZUNvdW50IDw9IDEpIHtcbiAgICAgICAgdGhpcy5fc2hvd1N0YXJ0SWR4ID0gdGhpcy5fc2hvd0VuZElkeCA9IDBcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX2NlbGxzWzBdLmVsbVxuICAgICAgICBub2RlLnN0eWxlLm9wYWNpdHkgPSAxXG4gICAgICAgIG5vZGUuc3R5bGUuekluZGV4ID0gOTlcbiAgICAgICAgbm9kZS5pbmRleCA9IDBcbiAgICAgICAgdGhpcy5fc2hvd05vZGVzWzBdID0gbm9kZVxuICAgICAgICBub2RlLl9pblNob3cgPSB0cnVlXG4gICAgICAgIG5vZGUuX3Nob3dJbmRleCA9IDBcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjb25zdCBzaG93Q291bnQgPSB0aGlzLl9zaG93Q291bnQgPSBNYXRoLmFicyhzdGVwKSArIDNcbiAgICAgIHRoaXMuX3Nob3dTdGFydElkeCA9IHN0ZXAgPD0gMCA/IC0xIDogMiAtIHNob3dDb3VudFxuICAgICAgdGhpcy5fc2hvd0VuZElkeCA9IHN0ZXAgPD0gMCA/IHNob3dDb3VudCAtIDIgOiAxXG4gICAgICB0aGlzLl9jbGVhck5vZGVzT2Zmc2V0KClcbiAgICAgIHRoaXMuX3Bvc2l0aW9uTm9kZXModGhpcy5fc2hvd1N0YXJ0SWR4LCB0aGlzLl9zaG93RW5kSWR4LCBzdGVwKVxuICAgIH0sXG5cbiAgICBfaW5pdE5vZGVzICgpIHtcbiAgICAgIGNvbnN0IHRvdGFsID0gdGhpcy5mcmFtZUNvdW50XG4gICAgICBjb25zdCBjZWxscyA9IHRoaXMuX2NlbGxzXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdGFsOyBpKyspIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGNlbGxzW2ldLmVsbVxuICAgICAgICBub2RlLmluZGV4ID0gaVxuICAgICAgICBub2RlLl9pblNob3cgPSBmYWxzZVxuICAgICAgICBub2RlLnN0eWxlLnpJbmRleCA9IDBcbiAgICAgICAgbm9kZS5zdHlsZS5vcGFjaXR5ID0gMFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBfcG9zaXRpb25Ob2RlcyAoYmVnaW4sIGVuZCwgc3RlcCwgYW5pbSkge1xuICAgICAgY29uc3QgY2VsbHMgPSB0aGlzLl9jZWxsc1xuICAgICAgY29uc3Qgc3RhcnQgPSBzdGVwIDw9IDAgPyBiZWdpbiA6IGVuZFxuICAgICAgY29uc3Qgc3RvcCA9IHN0ZXAgPD0gMCA/IGVuZCA6IGJlZ2luXG4gICAgICBjb25zdCBzaWduID0gc3RlcCA8PSAwID8gLTEgOiAxXG4gICAgICBsZXQgY2VsbEluZGV4ID0gdGhpcy5fcHJlSW5kZXggKyBzaWduXG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgIT09IHN0b3AgLSBzaWduOyBpID0gaSAtIHNpZ24pIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGNlbGxzW3RoaXMuX25vcm1hbGl6ZUluZGV4KGNlbGxJbmRleCldLmVsbVxuICAgICAgICBjZWxsSW5kZXggPSBjZWxsSW5kZXggLSBzaWduXG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uTm9kZShub2RlLCBpKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBpbmRleDogcG9zaXRpb24gaW5kZXggaW4gdGhlIHNob3dpbmcgY2VsbHMnIHZpZXcuXG4gICAgICovXG4gICAgX3Bvc2l0aW9uTm9kZSAobm9kZSwgaW5kZXgpIHtcbiAgICAgIGNvbnN0IGhvbGRlciA9IHRoaXMuX3Nob3dOb2Rlc1tpbmRleF1cbiAgICAgIGlmIChub2RlLl9pblNob3cgJiYgaG9sZGVyICE9PSBub2RlKSB7XG4gICAgICAgIGlmIChob2xkZXIpIHsgdGhpcy5fcmVtb3ZlQ2xvbmUoaG9sZGVyKSB9XG4gICAgICAgIG5vZGUgPSB0aGlzLl9nZXRDbG9uZShub2RlLmluZGV4KVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAobm9kZS5faW5TaG93KSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBub2RlLl9pblNob3cgPSB0cnVlXG4gICAgICBjb25zdCB0cmFuc2xhdGVYID0gaW5kZXggKiB0aGlzLl93cmFwcGVyV2lkdGggLSB0aGlzLmlubmVyT2Zmc2V0XG4gICAgICB3ZWV4LnV0aWxzLmFkZFRyYW5zZm9ybShub2RlLCB7XG4gICAgICAgIHRyYW5zbGF0ZTogYHRyYW5zbGF0ZTNkKCR7dHJhbnNsYXRlWH1weCwgMHB4LCAwcHgpYFxuICAgICAgfSlcbiAgICAgIG5vZGUuc3R5bGUuekluZGV4ID0gOTkgLSBNYXRoLmFicyhpbmRleClcbiAgICAgIG5vZGUuc3R5bGUub3BhY2l0eSA9IDFcbiAgICAgIG5vZGUuX3Nob3dJbmRleCA9IGluZGV4XG4gICAgICB0aGlzLl9zaG93Tm9kZXNbaW5kZXhdID0gbm9kZVxuICAgIH0sXG5cbiAgICBfZ2V0Q2xvbmUgKGluZGV4KSB7XG4gICAgICBsZXQgYXJyID0gdGhpcy5fY2xvbmVzW2luZGV4XVxuICAgICAgaWYgKCFhcnIpIHtcbiAgICAgICAgdGhpcy5fY2xvbmVzW2luZGV4XSA9IGFyciA9IFtdXG4gICAgICB9XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8PSAwKSB7XG4gICAgICAgIGNvbnN0IG9yaWdOb2RlID0gdGhpcy5fY2VsbHNbaW5kZXhdLmVsbVxuICAgICAgICBjb25zdCBjbG9uZSA9IG9yaWdOb2RlLmNsb25lTm9kZSh0cnVlKVxuICAgICAgICBjbG9uZS5faXNDbG9uZSA9IHRydWVcbiAgICAgICAgY2xvbmUuX2luU2hvdyA9IG9yaWdOb2RlLl9pblNob3dcbiAgICAgICAgY2xvbmUuaW5kZXggPSBvcmlnTm9kZS5pbmRleFxuICAgICAgICBjbG9uZS5zdHlsZS5vcGFjaXR5ID0gMFxuICAgICAgICBjbG9uZS5zdHlsZS56SW5kZXggPSAwXG4gICAgICAgIGNvbnN0IGN0ID0gdGhpcy4kcmVmcy5pbm5lclxuICAgICAgICBjdC5hcHBlbmRDaGlsZChjbG9uZSlcbiAgICAgICAgYXJyLnB1c2goY2xvbmUpXG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyLnBvcCgpXG4gICAgfSxcblxuICAgIF9yZW1vdmVDbG9uZSAobm9kZSkge1xuICAgICAgY29uc3QgaWR4ID0gbm9kZS5pbmRleFxuICAgICAgdGhpcy5faGlkZU5vZGUobm9kZSlcbiAgICAgIGNvbnN0IGFyciA9IHRoaXMuX2Nsb25lc1tpZHhdXG4gICAgICBhcnIucHVzaChub2RlKVxuICAgIH0sXG5cbiAgICBfaGlkZU5vZGUgKG5vZGUpIHtcbiAgICAgIG5vZGUuX2luU2hvdyA9IGZhbHNlXG4gICAgICBub2RlLnN0eWxlLm9wYWNpdHkgPSAwXG4gICAgICBub2RlLnN0eWxlLnpJbmRleCA9IDBcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogaGlkZSBub2RlcyBmcm9tIGJlZ2luIHRvIGVuZCBpbiBzaG93QXJyYXkuXG4gICAgICogaWYgaXQgaXMgY2xvbmUgbm9kZSwganVzdCBtb3ZlIHRoZSBjbG9uZSBub2RlIHRvIHRoZSBidWZmZXIuXG4gICAgICovXG4gICAgX2NsZWFyTm9kZXMgKGJlZ2luLCBlbmQpIHtcbiAgICAgIGZvciAobGV0IGkgPSBiZWdpbjsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5fc2hvd05vZGVzW2ldXG4gICAgICAgIGlmICghbm9kZSkgeyByZXR1cm4gfVxuICAgICAgICBpZiAobm9kZS5faXNDbG9uZSkge1xuICAgICAgICAgIHRoaXMuX3JlbW92ZUNsb25lKG5vZGUpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIW5vZGUuX2luU2hvdykge1xuICAgICAgICAgIHRoaXMuX2hpZGVOb2RlKG5vZGUpXG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMuX3Nob3dOb2Rlc1tpXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBjb3B5IG5vZGUgc3R5bGUgcHJvcHMgKG9wYWNpdHkgYW5kIHpJbmRleCkgYW5kIHRyYW5zZm9ybSBzdGF0dXMgZnJvbVxuICAgICAqIG9uZSBlbGVtZW50IHRvIGFub3RoZXIuXG4gICAgICovXG4gICAgX2NvcHlTdHlsZSAoZnJvbSwgdG8sIHN0eWxlcyA9IFsnb3BhY2l0eScsICd6SW5kZXgnXSwgdHJhbnNmb3JtRXh0cmEgPSB7fSkge1xuICAgICAgd2VleC51dGlscy5leHRlbmRLZXlzKHRvLnN0eWxlLCBmcm9tLnN0eWxlLCBzdHlsZXMpXG4gICAgICBjb25zdCB0cmFuc09iaiA9IHdlZXgudXRpbHMuZ2V0VHJhbnNmb3JtT2JqKGZyb20pXG4gICAgICBmb3IgKGNvbnN0IGsgaW4gdHJhbnNmb3JtRXh0cmEpIHtcbiAgICAgICAgdHJhbnNPYmpba10gPSB0cmFuc2Zvcm1FeHRyYVtrXVxuICAgICAgfVxuICAgICAgd2VleC51dGlscy5hZGRUcmFuc2Zvcm0odG8sIHRyYW5zT2JqKVxuICAgICAgY29uc3QgZnJvbUlubmVyID0gZnJvbS5maXJzdEVsZW1lbnRDaGlsZFxuICAgICAgY29uc3QgdG9Jbm5lciA9IHRvLmZpcnN0RWxlbWVudENoaWxkXG4gICAgICB0b0lubmVyLnN0eWxlLm9wYWNpdHkgPSBmcm9tSW5uZXIuc3R5bGUub3BhY2l0eVxuICAgICAgd2VleC51dGlscy5jb3B5VHJhbnNmb3JtKGZyb21Jbm5lciwgdG9Jbm5lcilcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVwbGFjZSBhIGNsb25lIG5vZGUgd2l0aCB0aGUgb3JpZ2luYWwgbm9kZSBpZiBpdCdzIG5vdCBpbiB1c2UuXG4gICAgICovXG4gICAgX3JlcGxhY2VDbG9uZSAoY2xvbmUsIHBvcykge1xuICAgICAgY29uc3Qgb3JpZ05vZGUgPSB0aGlzLl9jZWxsc1tjbG9uZS5pbmRleF0uZWxtXG4gICAgICBpZiAob3JpZ05vZGUuX2luU2hvdykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IG9yaWdTaG93SW5kZXggPSBvcmlnTm9kZS5fc2hvd0luZGV4XG4gICAgICBjb25zdCBzdHlsZVByb3BzID0gWydvcGFjaXR5JywgJ3pJbmRleCddXG4gICAgICBsZXQgY2xcbiAgICAgIGlmIChNYXRoLmFicyhvcmlnU2hvd0luZGV4KSA8PSAxKSB7XG4gICAgICAgIC8vIGxlYXZlIGEgY2xvbmUgdG8gcmVwbGFjZSB0aGUgb3JpZ05vZGUgaW4gdGhlIHNob3cgem9uZSgtMSB+IDEpLlxuICAgICAgICBjbCA9IHRoaXMuX2dldENsb25lKG9yaWdOb2RlLmluZGV4KVxuICAgICAgICB0aGlzLl9jb3B5U3R5bGUob3JpZ05vZGUsIGNsKVxuICAgICAgICB0aGlzLl9zaG93Tm9kZXNbb3JpZ1Nob3dJbmRleF0gPSBjbFxuICAgICAgfVxuICAgICAgb3JpZ05vZGUuX2luU2hvdyA9IHRydWVcbiAgICAgIGNvbnN0IHRyYW5zT2JqID0gd2VleC51dGlscy5nZXRUcmFuc2Zvcm1PYmooY2xvbmUpXG4gICAgICB0cmFuc09iai50cmFuc2xhdGUgPSB0cmFuc09iai50cmFuc2xhdGUucmVwbGFjZSgvWystXFxkLl0rW3B3XXgvLCAoJDApID0+IHtcbiAgICAgICAgcmV0dXJuIHBvcyAqIHRoaXMuX3dyYXBwZXJXaWR0aCAtIHRoaXMuaW5uZXJPZmZzZXQgKyAncHgnXG4gICAgICB9KVxuICAgICAgdGhpcy5fY29weVN0eWxlKGNsb25lLCBvcmlnTm9kZSwgc3R5bGVQcm9wcywgdHJhbnNPYmopXG4gICAgICB0aGlzLl9yZW1vdmVDbG9uZShjbG9uZSlcbiAgICAgIGlmICghY2wpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3Nob3dOb2Rlc1tvcmlnU2hvd0luZGV4XVxuICAgICAgfVxuICAgICAgdGhpcy5fc2hvd05vZGVzW3Bvc10gPSBvcmlnTm9kZVxuICAgICAgb3JpZ05vZGUuX3Nob3dJbmRleCA9IHBvc1xuICAgIH0sXG5cbiAgICBfcmVhcnJhbmdlTm9kZXMgKG5ld0luZGV4KSB7XG4gICAgICBpZiAodGhpcy5mcmFtZUNvdW50IDw9IDEpIHtcbiAgICAgICAgdGhpcy5fc2xpZGluZyA9IGZhbHNlXG4gICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gMFxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gY2xlYXIgYXV0b1BsYXkgdGltZXIgKGFuZCByZXN0YXJ0IGFmdGVyIHVwZGF0ZWQgaG9vaykuXG4gICAgICB0aGlzLl9zdGFydEF1dG9QbGF5KClcblxuICAgICAgLyoqXG4gICAgICAgKiBjbGVhbiBub2Rlcy4gcmVwbGFjZSBjdXJyZW50IG5vZGUgd2l0aCBub24tY2xvbmVkIG5vZGUuXG4gICAgICAgKiBzZXQgY3VycmVudCBpbmRleCB0byB0aGUgbmV3IGluZGV4LlxuICAgICAgICovXG4gICAgICBjb25zdCBzaG93cyA9IHRoaXMuX3Nob3dOb2Rlc1xuICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX3Nob3dTdGFydElkeDsgaSA8PSB0aGlzLl9zaG93RW5kSWR4OyBpKyspIHtcbiAgICAgICAgc2hvd3NbaV0uX2luU2hvdyA9IGZhbHNlXG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gLTE7IGkgPD0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBzaG93c1tpXVxuICAgICAgICBpZiAoIW5vZGUuX2lzQ2xvbmUpIHtcbiAgICAgICAgICBub2RlLl9pblNob3cgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcmVwbGFjZUNsb25lKG5vZGUsIGkpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fY2xlYXJOb2Rlcyh0aGlzLl9zaG93U3RhcnRJZHgsIC0yKVxuICAgICAgdGhpcy5fc2hvd1N0YXJ0SWR4ID0gLTFcbiAgICAgIHRoaXMuX2NsZWFyTm9kZXMoMiwgdGhpcy5fc2hvd0VuZElkeClcbiAgICAgIHRoaXMuX3Nob3dFbmRJZHggPSAxXG4gICAgICB0aGlzLl9zbGlkaW5nID0gZmFsc2VcblxuICAgICAgLy8gc2V0IGN1cnJlbnQgaW5kZXggdG8gdGhlIG5ldyBpbmRleC5cbiAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gbmV3SW5kZXhcbiAgICAgIHRoaXMuX3ByZUluZGV4ID0gbmV3SW5kZXhcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogYWNjb3JkaW5nIHRvIHRoZSBhdHRyczogbmVpZ2hib3JTY2FsZSwgbmVpZ2hib3JBbHBoYSwgbmVpZ2hib3JTcGFjZS5cbiAgICAgKiAxLiBhcHBseSB0aGUgbWFpbiBjZWxsIHRyYW5zZm9ybSBlZmZlY3RzLlxuICAgICAqIDIuIHNldCB0aGUgcHJldmlvdXMgY2VsbCBhbmQgdGhlIG5leHQgY2VsbCdzIHBvc2l0b24sIHNjYWxlIGFuZCBhbHBoYS5cbiAgICAgKiAzLiBzZXQgb3RoZXIgY2VsbHMnIHNjYWxlIGFuZCBhbHBoYS5cbiAgICAgKi9cbiAgICBfc2V0TmVpZ2hib3JzICgpIHtcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLl9zaG93U3RhcnRJZHg7IGkgPD0gdGhpcy5fc2hvd0VuZElkeDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGVsbSA9IHRoaXMuX3Nob3dOb2Rlc1tpXS5maXJzdEVsZW1lbnRDaGlsZFxuICAgICAgICBlbG0uc3R5bGUud2Via2l0VHJhbnNpdGlvbiA9IGBhbGwgJHtORUlHSEJPUl9TQ0FMRV9USU1FIC8gMTAwMH1zIGVhc2VgXG4gICAgICAgIGVsbS5zdHlsZS5tb3pUcmFuc2l0aW9uID0gYGFsbCAke05FSUdIQk9SX1NDQUxFX1RJTUUgLyAxMDAwfXMgZWFzZWBcbiAgICAgICAgZWxtLnN0eWxlLnRyYW5zaXRpb24gPSBgYWxsICR7TkVJR0hCT1JfU0NBTEVfVElNRSAvIDEwMDB9cyBlYXNlYFxuICAgICAgICBjb25zdCB0cmFuc09iaiA9IHtcbiAgICAgICAgICBzY2FsZTogYHNjYWxlKCR7aSA9PT0gMCA/IHRoaXMuY3VycmVudEl0ZW1TY2FsZSA6IHRoaXMubmVpZ2hib3JTY2FsZX0pYFxuICAgICAgICB9XG4gICAgICAgIGxldCB0cmFuc2xhdGVYXG4gICAgICAgIGlmICghdGhpcy5fbmVpZ2hib3JXaWR0aCkge1xuICAgICAgICAgIHRoaXMuX25laWdoYm9yV2lkdGggPSBwYXJzZUZsb2F0KGVsbS5zdHlsZS53aWR0aCkgfHwgZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoXG4gICAgICAgIH1cbiAgICAgICAgLy8gY2FsY3VsYXRlIHBvc2l0aW9uIG9mZnNldHMgYWNjb3JkaW5nIHRvIG5laWdoYm9yIHNjYWxlcy5cbiAgICAgICAgaWYgKE1hdGguYWJzKGkpID09PSAxKSB7XG4gICAgICAgICAgY29uc3QgZGlzdCA9ICgodGhpcy5fd3JhcHBlcldpZHRoIC0gdGhpcy5fbmVpZ2hib3JXaWR0aCAqIHRoaXMubmVpZ2hib3JTY2FsZSkgLyAyXG4gICAgICAgICAgICArIHRoaXMubmVpZ2hib3JTcGFjZSAqIHdlZXguY29uZmlnLmVudi5zY2FsZSkgLyB0aGlzLm5laWdoYm9yU2NhbGVcbiAgICAgICAgICB0cmFuc2xhdGVYID0gLWkgKiBkaXN0XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgLy8gY2xlYXIgcG9zaXRpb24gb2Zmc2V0cy5cbiAgICAgICAgICB0cmFuc2xhdGVYID0gMFxuICAgICAgICB9XG4gICAgICAgIHRyYW5zT2JqLnRyYW5zbGF0ZSA9IGB0cmFuc2xhdGUzZCgke3RyYW5zbGF0ZVh9cHgsIDBweCwgMHB4KWBcbiAgICAgICAgd2VleC51dGlscy5hZGRUcmFuc2Zvcm0oZWxtLCB0cmFuc09iailcbiAgICAgICAgZWxtLnN0eWxlLm9wYWNpdHkgPSBpID09PSAwID8gTUFJTl9TTElERV9PUEFDSVRZIDogdGhpcy5uZWlnaGJvckFscGhhXG4gICAgICB9XG4gICAgfSxcblxuICAgIF9uZXh0ICgpIHtcbiAgICAgIGxldCBuZXh0ID0gdGhpcy5jdXJyZW50SW5kZXggKyAxXG4gICAgICBpZiAodGhpcy5mcmFtZUNvdW50IDw9IDEpIHtcbiAgICAgICAgbmV4dC0tXG4gICAgICB9XG4gICAgICB0aGlzLl9zbGlkZVRvKG5leHQpXG4gICAgfSxcblxuICAgIF9wcmV2ICgpIHtcbiAgICAgIGxldCBwcmV2ID0gdGhpcy5jdXJyZW50SW5kZXggLSAxXG4gICAgICBpZiAodGhpcy5mcmFtZUNvdW50IDw9IDEpIHtcbiAgICAgICAgcHJldisrXG4gICAgICB9XG4gICAgICB0aGlzLl9zbGlkZVRvKHByZXYpXG4gICAgfSxcblxuICAgIF9oYW5kbGVUb3VjaFN0YXJ0IChldmVudCkge1xuICAgICAgY29uc3QgdG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXVxuICAgICAgdGhpcy5fc3RvcEF1dG9QbGF5KClcbiAgICAgIGNvbnN0IGlubmVyID0gdGhpcy4kcmVmcy5pbm5lclxuICAgICAgdGhpcy5fdG91Y2hQYXJhbXMgPSB7XG4gICAgICAgIG9yaWdpbmFsVHJhbnNmb3JtOiBpbm5lci5zdHlsZS53ZWJraXRUcmFuc2Zvcm1cbiAgICAgICAgICB8fCBpbm5lci5zdHlsZS5tb3pUcmFuc2Zvcm1cbiAgICAgICAgICB8fCBpbm5lci5zdHlsZS50cmFuc2Zvcm0sXG4gICAgICAgIHN0YXJ0VG91Y2hFdmVudDogdG91Y2gsXG4gICAgICAgIHN0YXJ0WDogdG91Y2gucGFnZVgsXG4gICAgICAgIHN0YXJ0WTogdG91Y2gucGFnZVksXG4gICAgICAgIHRpbWVTdGFtcDogZXZlbnQudGltZVN0YW1wXG4gICAgICB9XG4gICAgfSxcblxuICAgIF9oYW5kbGVUb3VjaE1vdmUgKGV2ZW50KSB7XG4gICAgICBjb25zdCB0cCA9IHRoaXMuX3RvdWNoUGFyYW1zXG4gICAgICBpZiAoIXRwKSB7IHJldHVybiB9XG4gICAgICBpZiAodGhpcy5fc2xpZGluZykge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFt2dWUtcmVuZGVyXSB3YXJuOiBjYW4ndCBzY3JvbGwgdGhlIHNsaWRlciBkdXJpbmcgc2xpZGluZy5gKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3QgeyBzdGFydFgsIHN0YXJ0WSB9ID0gdGhpcy5fdG91Y2hQYXJhbXNcbiAgICAgIGNvbnN0IHRvdWNoID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF1cbiAgICAgIGNvbnN0IG9mZnNldFggPSB0b3VjaC5wYWdlWCAtIHN0YXJ0WFxuICAgICAgY29uc3Qgb2Zmc2V0WSA9IHRvdWNoLnBhZ2VZIC0gc3RhcnRZXG4gICAgICB0cC5vZmZzZXRYID0gb2Zmc2V0WFxuICAgICAgdHAub2Zmc2V0WSA9IG9mZnNldFlcbiAgICAgIGxldCBpc1YgPSB0cC5pc1ZlcnRpY2FsXG4gICAgICBpZiAodHlwZW9mIGlzViA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaXNWID0gdHAuaXNWZXJ0aWNhbCA9IE1hdGguYWJzKG9mZnNldFgpIDwgTWF0aC5hYnMob2Zmc2V0WSlcbiAgICAgICAgaWYgKCFpc1YpIHtcbiAgICAgICAgICB0aGlzLl9lbWl0U2Nyb2xsRXZlbnQoJ3Njcm9sbHN0YXJ0JylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gdmVydGljYWwgc2Nyb2xsLiBqdXN0IGlnbm9yZSBpdC5cbiAgICAgIGlmIChpc1YpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvLyBob3Jpem9udGFsIHNjcm9sbC4gdHJpZ2dlciBzY3JvbGwgZXZlbnQuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBjb25zdCBpbm5lciA9IHRoaXMuJHJlZnMuaW5uZXJcbiAgICAgIGlmIChpbm5lciAmJiBvZmZzZXRYKSB7XG4gICAgICAgIGlmICghdGhpcy5fbm9kZXNPZmZzZXRDbGVhcmVkKSB7XG4gICAgICAgICAgdGhpcy5fbm9kZXNPZmZzZXRDbGVhcmVkID0gdHJ1ZVxuICAgICAgICAgIHRoaXMuX2NsZWFyTm9kZXNPZmZzZXQoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2VtaXRTY3JvbGxFdmVudCgnc2Nyb2xsJywge1xuICAgICAgICAgIG9mZnNldFhSYXRpbzogb2Zmc2V0WCAvIHRoaXMuX3dyYXBwZXJXaWR0aFxuICAgICAgICB9KVxuICAgICAgICBpbm5lci5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSBgdHJhbnNsYXRlM2QoJHt0aGlzLmlubmVyT2Zmc2V0ICsgb2Zmc2V0WH1weCwgMCwgMClgXG4gICAgICAgIGlubmVyLnN0eWxlLm1velRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgke3RoaXMuaW5uZXJPZmZzZXQgKyBvZmZzZXRYfXB4LCAwLCAwKWBcbiAgICAgICAgaW5uZXIuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZTNkKCR7dGhpcy5pbm5lck9mZnNldCArIG9mZnNldFh9cHgsIDAsIDApYFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBfaGFuZGxlVG91Y2hFbmQgKGV2ZW50KSB7XG4gICAgICB0aGlzLl9zdGFydEF1dG9QbGF5KClcbiAgICAgIGNvbnN0IHRwID0gdGhpcy5fdG91Y2hQYXJhbXNcbiAgICAgIGlmICghdHApIHsgcmV0dXJuIH1cbiAgICAgIGNvbnN0IGlzViA9IHRwLmlzVmVydGljYWxcbiAgICAgIGlmICh0eXBlb2YgaXNWID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IGlubmVyID0gdGhpcy4kcmVmcy5pbm5lclxuICAgICAgY29uc3QgeyBvZmZzZXRYIH0gPSB0cFxuICAgICAgaWYgKGlubmVyKSB7XG4gICAgICAgIHRoaXMuX25vZGVzT2Zmc2V0Q2xlYXJlZCA9IGZhbHNlXG4gICAgICAgIC8vIFRPRE86IHRlc3QgdGhlIHZlbG9jaXR5IGlmIGl0J3MgbGVzcyB0aGFuIDAuMi5cbiAgICAgICAgY29uc3QgcmVzZXQgPSBNYXRoLmFicyhvZmZzZXRYIC8gdGhpcy5fd3JhcHBlcldpZHRoKSA8IDAuMlxuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBvZmZzZXRYID4gMCA/IDEgOiAtMVxuICAgICAgICBjb25zdCBuZXdJbmRleCA9IHJlc2V0ID8gdGhpcy5jdXJyZW50SW5kZXggOiAodGhpcy5jdXJyZW50SW5kZXggLSBkaXJlY3Rpb24pXG4gICAgICAgIHRoaXMuX3NsaWRlVG8obmV3SW5kZXgsIHRydWUpXG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpcy5fdG91Y2hQYXJhbXNcbiAgICB9LFxuXG4gICAgX2hhbmRsZVRvdWNoQ2FuY2VsIChldmVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZVRvdWNoRW5kKGV2ZW50KVxuICAgIH0sXG5cbiAgICBfZW1pdFNjcm9sbEV2ZW50ICh0eXBlLCBkYXRhID0ge30pIHtcbiAgICAgIHRoaXMuJGVtaXQodHlwZSwgd2VleC51dGlscy5jcmVhdGVFdmVudCh0aGlzLiRlbCwgdHlwZSwgZGF0YSkpXG4gICAgfSxcblxuICAgIF90aHJvdHRsZUVtaXRTY3JvbGwgKG9mZnNldCwgY2FsbGJhY2spIHtcbiAgICAgIGxldCBpID0gMFxuICAgICAgY29uc3QgdGhyb3R0bGVUaW1lID0gVEhST1RUTEVfU0NST0xMX1RJTUVcbiAgICAgIGNvbnN0IGNudCA9IHBhcnNlSW50KFRSQU5TSVRJT05fVElNRSAvIHRocm90dGxlVGltZSkgLSAxXG4gICAgICBjb25zdCBzaWduID0gb2Zmc2V0ID4gMCA/IDEgOiAtMVxuICAgICAgY29uc3QgciA9IE1hdGguYWJzKG9mZnNldCAvIHRoaXMuX3dyYXBwZXJXaWR0aClcbiAgICAgIGNvbnN0IHRocm90dGxlZFNjcm9sbCA9ICgpID0+IHtcbiAgICAgICAgaWYgKCsraSA+IGNudCkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayAmJiBjYWxsYmFjay5jYWxsKHRoaXMpXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmF0aW8gPSB0aGlzLl9zdGVwID09PSAwXG4gICAgICAgICAgPyBzaWduICogciAqICgxIC0gaSAvIGNudClcbiAgICAgICAgICA6IHNpZ24gKiAociArICgxIC0gcikgKiBpIC8gY250KVxuICAgICAgICB0aGlzLl9lbWl0U2Nyb2xsRXZlbnQoJ3Njcm9sbCcsIHtcbiAgICAgICAgICBvZmZzZXRYUmF0aW86IHJhdGlvXG4gICAgICAgIH0pXG4gICAgICAgIHNldFRpbWVvdXQodGhyb3R0bGVkU2Nyb2xsLCBUSFJPVFRMRV9TQ1JPTExfVElNRSlcbiAgICAgIH1cbiAgICAgIHRocm90dGxlZFNjcm9sbCgpXG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vIGltcG9ydCB7IHZhbGlkYXRlU3R5bGVzIH0gZnJvbSAnLi4vLi4vdmFsaWRhdG9yJ1xuLy8gaW1wb3J0IGluZGljYXRvciBmcm9tICcuL2luZGljYXRvcidcbmltcG9ydCBzbGlkZU1peGluIGZyb20gJy4vc2xpZGVNaXhpbidcblxuY29uc3Qgc2xpZGVyID0ge1xuICBtaXhpbnM6IFtzbGlkZU1peGluXSxcbiAgcHJvcHM6IHtcbiAgICBpbmRleDoge1xuICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgIGRlZmF1bHQ6IDBcbiAgICB9LFxuICAgICdhdXRvLXBsYXknOiB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBCb29sZWFuXSxcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSxcbiAgICBpbnRlcnZhbDoge1xuICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgIGRlZmF1bHQ6IDMwMDBcbiAgICB9LFxuICAgIGluZmluaXRlOiB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBCb29sZWFuXSxcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBpbmRleCAoKSB7XG4gICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IHRoaXMuX25vcm1hbGl6ZUluZGV4KHRoaXMuaW5kZXgpXG4gICAgfVxuICB9LFxuXG4gIGRhdGEgKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmcmFtZUNvdW50OiAwLFxuICAgICAgY3VycmVudEluZGV4OiB0aGlzLmluZGV4XG4gICAgfVxuICB9LFxuXG4gIGJlZm9yZUNyZWF0ZSAoKSB7XG4gICAgdGhpcy53ZWV4VHlwZSA9ICdzbGlkZXInXG4gIH0sXG5cbiAgcmVuZGVyIChjcmVhdGVFbGVtZW50KSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAvLyBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAvLyAgIHZhbGlkYXRlU3R5bGVzKCdzbGlkZXInLCB0aGlzLiR2bm9kZS5kYXRhICYmIHRoaXMuJHZub2RlLmRhdGEuc3RhdGljU3R5bGUpXG4gICAgLy8gfVxuICAgIHJldHVybiB0aGlzLl9yZW5kZXJTbGlkZXMoY3JlYXRlRWxlbWVudClcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKHdlZXgpIHtcbiAgICB3ZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdzbGlkZXInLCBzbGlkZXIpXG4gICAgd2VleC5yZWdpc3RlckNvbXBvbmVudCgnY3ljbGVzbGlkZXInLCBzbGlkZXIpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHNsaWRlTWl4aW4gZnJvbSAnLi9zbGlkZU1peGluJ1xuXG5jb25zdCBERUZBVUxUX05FSUdIQk9SX1NQQUNFID0gMjBcbmNvbnN0IERFRkFVTFRfTkVJR0hCT1JfQUxQSEEgPSAwLjZcbmNvbnN0IERFRkFVTFRfTkVJR0hCT1JfU0NBTEUgPSAwLjhcbmNvbnN0IERFRkFVTFRfQ1VSUkVOVF9JVEVNX1NDQUxFID0gMC45XG5cbmNvbnN0IHNsaWRlck5laWdoYm9yID0ge1xuICBtaXhpbnM6IFtzbGlkZU1peGluXSxcbiAgcHJvcHM6IHtcbiAgICBpbmRleDoge1xuICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgIGRlZmF1bHQ6IDBcbiAgICB9LFxuICAgIGF1dG9QbGF5OiB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBCb29sZWFuXSxcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSxcbiAgICBpbnRlcnZhbDoge1xuICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgIGRlZmF1bHQ6IDMwMDBcbiAgICB9LFxuICAgIGluZmluaXRlOiB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBCb29sZWFuXSxcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIG5laWdoYm9yU3BhY2U6IHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICB2YWxpZGF0b3I6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgdmFsID0gcGFyc2VGbG9hdCh2YWwpXG4gICAgICAgIHJldHVybiAhaXNOYU4odmFsKSAmJiB2YWwgPiAwXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogREVGQVVMVF9ORUlHSEJPUl9TUEFDRVxuICAgIH0sXG4gICAgbmVpZ2hib3JBbHBoYToge1xuICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICB2YWwgPSBwYXJzZUZsb2F0KHZhbClcbiAgICAgICAgcmV0dXJuICFpc05hTih2YWwpICYmIHZhbCA+PSAwICYmIHZhbCA8PSAxXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogREVGQVVMVF9ORUlHSEJPUl9BTFBIQVxuICAgIH0sXG4gICAgbmVpZ2hib3JTY2FsZToge1xuICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICB2YWwgPSBwYXJzZUZsb2F0KHZhbClcbiAgICAgICAgcmV0dXJuICFpc05hTih2YWwpICYmIHZhbCA+PSAwICYmIHZhbCA8PSAxXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogREVGQVVMVF9ORUlHSEJPUl9TQ0FMRVxuICAgIH0sXG4gICAgY3VycmVudEl0ZW1TY2FsZToge1xuICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICB2YWwgPSBwYXJzZUZsb2F0KHZhbClcbiAgICAgICAgcmV0dXJuICFpc05hTih2YWwpICYmIHZhbCA+PSAwICYmIHZhbCA8PSAxXG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogREVGQVVMVF9DVVJSRU5UX0lURU1fU0NBTEVcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBpbmRleCAoKSB7XG4gICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IHRoaXMuX25vcm1hbGl6ZUluZGV4KHRoaXMuaW5kZXgpXG4gICAgfVxuICB9LFxuXG4gIGRhdGEgKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50SW5kZXg6IHRoaXMuaW5kZXgsXG4gICAgICBmcmFtZUNvdW50OiAwXG4gICAgfVxuICB9LFxuXG4gIGJlZm9yZUNyZWF0ZSAoKSB7XG4gICAgdGhpcy5pc05laWdoYm9yID0gdHJ1ZVxuICAgIHRoaXMud2VleFR5cGUgPSAnc2xpZGVyLW5laWdoYm9yJ1xuICB9LFxuXG4gIHJlbmRlciAoY3JlYXRlRWxlbWVudCkge1xuICAgIHJldHVybiB0aGlzLl9yZW5kZXJTbGlkZXMoY3JlYXRlRWxlbWVudClcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKHdlZXgpIHtcbiAgICB3ZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdzbGlkZXItbmVpZ2hib3InLCBzbGlkZXJOZWlnaGJvcilcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmNvbnN0IF9jc3MgPSBgXG4ud2VleC1pbmRpY2F0b3Ige1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDEwO1xuICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93O1xuICAtbW96LWJveC1vcmllbnQ6IGhvcml6b250YWw7XG4gIC1tb3otYm94LWRpcmVjdGlvbjogbm9ybWFsO1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAtd2Via2l0LWJveC1vcmllbnQ6IGhvcml6b250YWw7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbn1cblxuLndlZXgtaW5kaWNhdG9yLWl0ZW0ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICB3aWR0aDogMC4yNjY2NjdyZW07XG4gIGhlaWdodDogMC4yNjY2NjdyZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNCQkJCQkI7XG59XG4ud2VleC1pbmRpY2F0b3ItaXRlbSArIC53ZWV4LWluZGljYXRvci1pdGVtIHtcbiAgbWFyZ2luLWxlZnQ6IDAuMTMzMzMzcmVtO1xufVxuXG4ud2VleC1pbmRpY2F0b3ItaXRlbS1hY3RpdmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBibHVlO1xufVxuYFxuXG5sZXQgZXh0cmFjdENvbXBvbmVudFN0eWxlLCBleHRlbmQsIGV4dGVuZEtleXNcblxuZnVuY3Rpb24gZ2V0SW5kaWNhdG9ySXRlbVN0eWxlIChzcGVjLCBpc0FjdGl2ZSkge1xuICBjb25zdCBzdHlsZSA9IHt9XG4gIHN0eWxlWydiYWNrZ3JvdW5kLWNvbG9yJ10gPSBzcGVjW2lzQWN0aXZlID8gJ2l0ZW1TZWxlY3RlZENvbG9yJyA6ICdpdGVtQ29sb3InXVxuICBzdHlsZVsnd2lkdGgnXSA9IHN0eWxlWydoZWlnaHQnXSA9IHNwZWNbJ2l0ZW1TaXplJ11cbiAgcmV0dXJuIHN0eWxlXG59XG5cbmZ1bmN0aW9uIF9yZW5kZXIgKGNvbnRleHQsIGgpIHtcbiAgY29uc3QgY2hpbGRyZW4gPSBbXVxuICBjb25zdCBtZXJnZWRTdHlsZSA9IGV4dHJhY3RDb21wb25lbnRTdHlsZShjb250ZXh0KVxuICBjb25zdCBpbmRpY2F0b3JTcGVjU3R5bGUgPSBleHRlbmRLZXlzKFxuICAgICAge30sXG4gICAgICBtZXJnZWRTdHlsZSxcbiAgICAgIFsnaXRlbUNvbG9yJywgJ2l0ZW1TZWxlY3RlZENvbG9yJywgJ2l0ZW1TaXplJ11cbiAgICApXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgTnVtYmVyKGNvbnRleHQuY291bnQpOyArK2kpIHtcbiAgICBjb25zdCBjbGFzc05hbWVzID0gWyd3ZWV4LWluZGljYXRvci1pdGVtIHdlZXgtZWwnXVxuICAgIGxldCBpc0FjdGl2ZSA9IGZhbHNlXG4gICAgaWYgKGkgPT09IE51bWJlcihjb250ZXh0LmFjdGl2ZSkpIHtcbiAgICAgIGNsYXNzTmFtZXMucHVzaCgnd2VleC1pbmRpY2F0b3ItaXRlbS1hY3RpdmUnKVxuICAgICAgaXNBY3RpdmUgPSB0cnVlXG4gICAgfVxuICAgIGNoaWxkcmVuLnB1c2goaCgnbWFyaycsIHtcbiAgICAgIHN0YXRpY0NsYXNzOiBjbGFzc05hbWVzLmpvaW4oJyAnKSxcbiAgICAgIHN0YXRpY1N0eWxlOiBnZXRJbmRpY2F0b3JJdGVtU3R5bGUoaW5kaWNhdG9yU3BlY1N0eWxlLCBpc0FjdGl2ZSlcbiAgICB9KSlcbiAgfVxuICBjb250ZXh0LiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgX3JlTGF5b3V0KHRoaXMsIF9nZXRWaXJ0dWFsUmVjdCh0aGlzLCBtZXJnZWRTdHlsZSksIF9nZXRMdGJyKHRoaXMsIG1lcmdlZFN0eWxlKSlcbiAgfSlcbiAgcmV0dXJuIGgoJ25hdicsIHtcbiAgICBhdHRyczogeyAnd2VleC10eXBlJzogJ2luZGljYXRvcicgfSxcbiAgICBzdGF0aWNDbGFzczogJ3dlZXgtaW5kaWNhdG9yIHdlZXgtY3QnLFxuICAgIHN0YXRpY1N0eWxlOiBtZXJnZWRTdHlsZVxuICB9LCBjaGlsZHJlbilcbn1cblxuLyoqXG4gKiBnZXQgaW5kaWNhdG9yJ3MgdmlydHVhbCByZWN0ICh3aWR0aCwgaGVpZ2h0KSwgd2hpY2ggaXMgdGhlIC5cbiAqL1xuZnVuY3Rpb24gX2dldFZpcnR1YWxSZWN0IChjb250ZXh0LCBtZXJnZWRTdHlsZSkge1xuICBjb25zdCBjdCA9IGNvbnRleHQuX2dldFBhcmVudFJlY3QoKVxuICBjb25zdCByZWN0ID0gWyd3aWR0aCcsICdoZWlnaHQnXS5yZWR1Y2UoKHByZSwga2V5KSA9PiB7XG4gICAgY29uc3QgbXN2ID0gbWVyZ2VkU3R5bGUgJiYgbWVyZ2VkU3R5bGVba2V5XVxuICAgIHByZVtrZXldID0gbXN2ID8gcGFyc2VGbG9hdChtc3YpIDogY3Rba2V5XVxuICAgIHJldHVybiBwcmVcbiAgfSwge30pXG4gIHJldHVybiByZWN0XG59XG5cbi8qKlxuICogZ2V0IGluZGljYXRvcidzIGx0YnIgdmFsdWVzICh3aXRob3V0IHVuaXRzKS5cbiAqL1xuZnVuY3Rpb24gX2dldEx0YnIgKGNvbnRleHQsIG1lcmdlZFN0eWxlKSB7XG4gIHJldHVybiBbJ2xlZnQnLCAndG9wJywgJ2JvdHRvbScsICdyaWdodCddLnJlZHVjZSgocHJlLCBrZXkpID0+IHtcbiAgICBjb25zdCBtc3YgPSBtZXJnZWRTdHlsZSAmJiBtZXJnZWRTdHlsZVtrZXldXG4gICAgaWYgKCFtc3YgJiYgbXN2ICE9PSAwKSB7IHJldHVybiBwcmUgfVxuICAgIHByZVtrZXldID0gcGFyc2VGbG9hdChtc3YpXG4gICAgcmV0dXJuIHByZVxuICB9LCB7fSlcbn1cblxuLyoqXG4gKiBnZXQgaW5kaWNhdG9yJ3MgcmVjdCAod2lkdGgsIGhlaWdodCkuXG4gKi9cbmZ1bmN0aW9uIF9nZXRJbmRpY2F0b3JSZWN0IChlbCkge1xuICBsZXQgd2lkdGgsIGhlaWdodFxuICBpZiAoZWwuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgd2lkdGggPSBoZWlnaHQgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbC5jaGlsZHJlblswXSlcbiAgfVxuICBlbHNlIHtcbiAgICBjb25zdCBpdGVtQ29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLmNoaWxkcmVuWzFdKVxuICAgIGNvbnN0IHBhZGRpbmcgPSBwYXJzZUZsb2F0KGl0ZW1Db21wdXRlZFN0eWxlLm1hcmdpbkxlZnQpXG4gICAgaGVpZ2h0ID0gcGFyc2VGbG9hdChpdGVtQ29tcHV0ZWRTdHlsZS5oZWlnaHQpXG4gICAgd2lkdGggPSBlbC5jaGlsZHJlbi5sZW5ndGggKiAoaGVpZ2h0ICsgcGFkZGluZykgLSBwYWRkaW5nXG4gIH1cbiAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCB9XG59XG5cbi8qKlxuICogY2FsY3VsYXRlIGFuZCByZXNldCBpbmRpY2F0b3IncyB3aWR0aCwgaGVpZ2h0LCBhbmQgbHRici5cbiAqIEBwYXJhbSB7b2JqZWN0fSB2aXJ0dWFsUmVjdC4gd2lkdGggYW5kIGhlaWdodCBvZiBpbmRpY2F0b3IncyB2aXJ0dWFsIHJlY3QgYm94LlxuICogQHBhcmFtIHtvYmplY3R9IGx0YnIuIHRoZSB1c2VyIHNwZWNpZmllZCBsZWZ0LCB0b3AsIGJvdHRvbSwgcmlnaHQgcGl4ZWxzICh3aXRob3V0IHVuaXRzKS5cbiAqL1xuZnVuY3Rpb24gX3JlTGF5b3V0IChjb250ZXh0LCB2aXJ0dWFsUmVjdCwgbHRicikge1xuICBjb25zdCBlbCA9IGNvbnRleHQuJGVsXG4gIGNvbnN0IHJlY3QgPSBfZ2V0SW5kaWNhdG9yUmVjdChlbClcbiAgY29uc3QgcmVjdFdpdGhQeCA9IE9iamVjdC5rZXlzKHJlY3QpLnJlZHVjZSgocHJlLCBrZXkpID0+IHtcbiAgICBwcmVba2V5XSA9IHJlY3Rba2V5XSArICdweCdcbiAgICByZXR1cm4gcHJlXG4gIH0sIHt9KVxuICBleHRlbmQoZWwuc3R5bGUsIHJlY3RXaXRoUHgpXG4gIGNvbnN0IGF4aXNNYXAgPSBbe1xuICAgIGRpcjogbHRici5sZWZ0IHx8IGx0YnIubGVmdCA9PT0gMFxuICAgICAgPyAnbGVmdCcgOiBsdGJyLnJpZ2h0IHx8IGx0YnIucmlnaHQgPT09IDBcbiAgICAgID8gJ3JpZ2h0JyA6ICdsZWZ0JyxcbiAgICBzY2FsZTogJ3dpZHRoJ1xuICB9LCB7XG4gICAgZGlyOiBsdGJyLnRvcCB8fCBsdGJyLnRvcCA9PT0gMFxuICAgICAgPyAndG9wJyA6IGx0YnIuYm90dG9tIHx8IGx0YnIuYm90dG9tID09PSAwXG4gICAgICA/ICdib3R0b20nIDogJ3RvcCcsXG4gICAgc2NhbGU6ICdoZWlnaHQnXG4gIH1dXG4gIE9iamVjdC5rZXlzKGF4aXNNYXApLmZvckVhY2goa2V5ID0+IHtcbiAgICBjb25zdCB7IGRpciwgc2NhbGUgfSA9IGF4aXNNYXBba2V5XVxuICAgIGVsLnN0eWxlW2Rpcl0gPSAobHRicltkaXJdIHx8IDApICsgdmlydHVhbFJlY3Rbc2NhbGVdIC8gMiAtIHJlY3Rbc2NhbGVdIC8gMiArICdweCdcbiAgfSlcbn1cblxuY29uc3QgaW5kaWNhdG9yID0ge1xuICBuYW1lOiAnd2VleC1pbmRpY2F0b3InLFxuICBtZXRob2RzOiB7XG4gICAgc2hvdzogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy4kZWwuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJ1xuICAgIH1cbiAgfSxcbiAgZGF0YSAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvdW50OiAwLFxuICAgICAgYWN0aXZlOiAwXG4gICAgfVxuICB9LFxuICByZW5kZXIgKGNyZWF0ZUVsZW1lbnQpIHtcbiAgICBjb25zdCB7IGNvdW50LCBhY3RpdmUgfSA9IHRoaXMuJHZub2RlLmRhdGEuYXR0cnMgfHwge31cbiAgICB0aGlzLmNvdW50ID0gY291bnRcbiAgICB0aGlzLmFjdGl2ZSA9IGFjdGl2ZVxuICAgIGlmICghdGhpcy5jb3VudCkgeyByZXR1cm4gfVxuICAgIHJldHVybiBfcmVuZGVyKHRoaXMsIGNyZWF0ZUVsZW1lbnQpXG4gIH0sXG4gIF9jc3Ncbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0ICh3ZWV4KSB7XG4gICAgZXh0cmFjdENvbXBvbmVudFN0eWxlID0gd2VleC5leHRyYWN0Q29tcG9uZW50U3R5bGVcbiAgICBleHRlbmQgPSB3ZWV4LnV0aWxzLmV4dGVuZFxuICAgIGV4dGVuZEtleXMgPSB3ZWV4LnV0aWxzLmV4dGVuZEtleXNcbiAgICB3ZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdpbmRpY2F0b3InLCBpbmRpY2F0b3IpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgc2xpZGVyIGZyb20gJy4vc2xpZGVyJ1xuaW1wb3J0IG5laWdoYm9yIGZyb20gJy4vc2xpZGVyLW5laWdoYm9yJ1xuaW1wb3J0IGluZGljYXRvciBmcm9tICcuL2luZGljYXRvcidcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0ICh3ZWV4KSB7XG4gICAgd2VleC5pbnN0YWxsKHNsaWRlcilcbiAgICB3ZWV4Lmluc3RhbGwobmVpZ2hib3IpXG4gICAgd2VleC5pbnN0YWxsKGluZGljYXRvcilcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogQGZpbGVPdmVydmlldyBJbXBsIG9mIHRleHQgY29tcG9uZW50LlxuICpcbiAqIE5vdGVzIGFib3V0IHRoZSBzdHlsZSAnaGVpZ2h0JyBhbmQgJ2xpbmVzJzpcbiAqIGlmIHRoZSBjb21wdXRlZCB2YWx1ZSBvZiAnaGVpZ2h0JyBpcyBiaWdnZXIgdGhhbiAnbGluZXMnLCB0aGFuIHRoZSB0ZXh0IHdpbGxcbiAqIGJlIGNsaXBwZWQgYWNjb3JkaW5nIHRvIHRoZSAnbGluZXMnLiBPdGhlcndpc2UsIGl0J2xsIGJlIHRoZSAnaGVpZ2h0Jy5cbiAqL1xuXG5jb25zdCBfY3NzID0gYFxuLndlZXgtdGV4dCB7XG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xuICBkaXNwbGF5OiAtbW96LWJveDtcbiAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcbiAgLW1vei1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcbiAgLW1vei1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyAgLyogbm90IHVzaW5nICdwcmUnOiBzdXBwb3J0IGF1dG8gbGluZSBmZWVkLiAqL1xuICBmb250LXNpemU6IDAuNDI2NjY3cmVtO1xuICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XG4gIG92ZXJmbG93OiBoaWRkZW47IC8qIGl0J2xsIGJlIGNsaXBwZWQgaWYgdGhlIGhlaWdodCBpcyBub3QgaGlnaCBlbm91Z2guICovXG59XG5gXG5cbi8qKlxuICogR2V0IHRleHQgc3BlY2lhbCBzdHlsZXMgKGxpbmVzIGFuZCB0ZXh0LW92ZXJmbG93KS5cbiAqL1xuZnVuY3Rpb24gZ2V0VGV4dFNwZWNTdHlsZSAobXMgPSB7fSkge1xuICBjb25zdCBsaW5lcyA9IHBhcnNlSW50KG1zLmxpbmVzKSB8fCAwXG4gIGNvbnN0IG92ZXJmbG93ID0gbXNbJ3RleHQtb3ZlcmZsb3cnXSB8fCAnZWxsaXBzaXMnXG4gIGlmIChsaW5lcyA+IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgJ3RleHQtb3ZlcmZsb3cnOiBvdmVyZmxvdyxcbiAgICAgICctd2Via2l0LWxpbmUtY2xhbXAnOiBsaW5lc1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUZXh0ICh3ZWV4KSB7XG4gIGNvbnN0IHsgZXh0cmFjdENvbXBvbmVudFN0eWxlLCBjcmVhdGVFdmVudE1hcCB9ID0gd2VleFxuICBjb25zdCB7IGV4dGVuZCB9ID0gd2VleC51dGlsc1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3dlZXgtdGV4dCcsXG4gICAgcHJvcHM6IHtcbiAgICAgIGxpbmVzOiBbTnVtYmVyLCBTdHJpbmddLFxuICAgICAgdmFsdWU6IFtTdHJpbmddXG4gICAgfSxcblxuICAgIHJlbmRlciAoY3JlYXRlRWxlbWVudCkge1xuICAgICAgY29uc3Qgc3R5bGUgPSBleHRyYWN0Q29tcG9uZW50U3R5bGUodGhpcylcbiAgICAgIGNvbnN0IHRleHRTcGVjU3R5bGUgPSBnZXRUZXh0U3BlY1N0eWxlKHN0eWxlKVxuICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoJ3AnLCB7XG4gICAgICAgIGF0dHJzOiB7ICd3ZWV4LXR5cGUnOiAndGV4dCcgfSxcbiAgICAgICAgb246IGNyZWF0ZUV2ZW50TWFwKHRoaXMpLFxuICAgICAgICBzdGF0aWNDbGFzczogJ3dlZXgtdGV4dCB3ZWV4LWVsJyxcbiAgICAgICAgc3RhdGljU3R5bGU6IGV4dGVuZChzdHlsZSwgdGV4dFNwZWNTdHlsZSlcbiAgICAgIH0sIHRoaXMuJHNsb3RzLmRlZmF1bHQgfHwgW3RoaXMudmFsdWVdKVxuICAgIH0sXG4gICAgX2Nzc1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdCAod2VleCkge1xuICAgIHdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ3RleHQnLCBnZXRUZXh0KHdlZXgpKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmNvbnN0IF9jc3MgPSBgXG4ud2VleC10ZXh0YXJlYSB7XG4gIGZvbnQtc2l6ZTogMC40MjY2NjdyZW1cbn1cbi53ZWV4LXRleHRhcmVhOmZvY3VzIHtcbiAgb3V0bGluZTogbm9uZTtcbn1cbmBcblxuZnVuY3Rpb24gZ2V0VGV4dGFyZWEgKHdlZXgpIHtcbiAgY29uc3QgeyBleHRyYWN0Q29tcG9uZW50U3R5bGUsIGNyZWF0ZUV2ZW50TWFwIH0gPSB3ZWV4XG4gIGNvbnN0IHsgaW5wdXRDb21tb24gfSA9IHdlZXgubWl4aW5zXG4gIGNvbnN0IHsgZXh0ZW5kLCBtYXBGb3JtRXZlbnRzIH0gPSB3ZWV4LnV0aWxzXG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnd2VleC10ZXh0YXJlYScsXG4gICAgbWl4aW5zOiBbaW5wdXRDb21tb25dLFxuICAgIHByb3BzOiB7XG4gICAgICB2YWx1ZTogU3RyaW5nLFxuICAgICAgcGxhY2Vob2xkZXI6IFN0cmluZyxcbiAgICAgIGRpc2FibGVkOiB7XG4gICAgICAgIHR5cGU6IFtTdHJpbmcsIEJvb2xlYW5dLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZVxuICAgICAgfSxcbiAgICAgIGF1dG9mb2N1czoge1xuICAgICAgICB0eXBlOiBbU3RyaW5nLCBCb29sZWFuXSxcbiAgICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICAgIH0sXG4gICAgICByb3dzOiB7XG4gICAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICAgIGRlZmF1bHQ6IDJcbiAgICAgIH0sXG4gICAgICByZXR1cm5LZXlUeXBlOiBTdHJpbmdcbiAgICB9LFxuXG4gICAgcmVuZGVyIChjcmVhdGVFbGVtZW50KSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgLy8gaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAvLyAgIHZhbGlkYXRlU3R5bGVzKCd0ZXh0YXJlYScsIHRoaXMuJHZub2RlLmRhdGEgJiYgdGhpcy4kdm5vZGUuZGF0YS5zdGF0aWNTdHlsZSlcbiAgICAgIC8vIH1cbiAgICAgIGNvbnN0IGV2ZW50cyA9IGV4dGVuZChjcmVhdGVFdmVudE1hcCh0aGlzKSwgbWFwRm9ybUV2ZW50cyh0aGlzKSlcbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KCdodG1sOnRleHRhcmVhJywge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgICd3ZWV4LXR5cGUnOiAndGV4dGFyZWEnLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlLFxuICAgICAgICAgIGRpc2FibGVkOiAodGhpcy5kaXNhYmxlZCAhPT0gJ2ZhbHNlJyAmJiB0aGlzLmRpc2FibGVkICE9PSBmYWxzZSksXG4gICAgICAgICAgYXV0b2ZvY3VzOiAodGhpcy5hdXRvZm9jdXMgIT09ICdmYWxzZScgJiYgdGhpcy5hdXRvZm9jdXMgIT09IGZhbHNlKSxcbiAgICAgICAgICBwbGFjZWhvbGRlcjogdGhpcy5wbGFjZWhvbGRlcixcbiAgICAgICAgICByb3dzOiB0aGlzLnJvd3MsXG4gICAgICAgICAgJ3JldHVybi1rZXktdHlwZSc6IHRoaXMucmV0dXJuS2V5VHlwZVxuICAgICAgICB9LFxuICAgICAgICBkb21Qcm9wczoge1xuICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlXG4gICAgICAgIH0sXG4gICAgICAgIG9uOiB0aGlzLmNyZWF0ZUtleWJvYXJkRXZlbnQoZXZlbnRzKSxcbiAgICAgICAgc3RhdGljQ2xhc3M6ICd3ZWV4LXRleHRhcmVhIHdlZXgtZWwnLFxuICAgICAgICBzdGF0aWNTdHlsZTogZXh0cmFjdENvbXBvbmVudFN0eWxlKHRoaXMpXG4gICAgICB9KVxuICAgIH0sXG4gICAgX2Nzc1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdCAod2VleCkge1xuICAgIHdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ3RleHRhcmVhJywgZ2V0VGV4dGFyZWEod2VleCkpXG4gIH1cbn1cbiIsIiAvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuZnVuY3Rpb24gZ2V0VmlkZW8gKHdlZXgpIHtcbiAgY29uc3QgeyBleHRyYWN0Q29tcG9uZW50U3R5bGUsIGNyZWF0ZUV2ZW50TWFwIH0gPSB3ZWV4XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnd2VleC12aWRlbycsXG4gICAgcHJvcHM6IHtcbiAgICAgIHNyYzogU3RyaW5nLFxuICAgICAgcGxheVN0YXR1czoge1xuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgIGRlZmF1bHQ6ICdwYXVzZScsXG4gICAgICAgIHZhbGlkYXRvciAodmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gWydwbGF5JywgJ3BhdXNlJ10uaW5kZXhPZih2YWx1ZSkgIT09IC0xXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhdXRvcGxheToge1xuICAgICAgICB0eXBlOiBbU3RyaW5nLCBCb29sZWFuXSxcbiAgICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICAgIH0sXG4gICAgICBhdXRvUGxheToge1xuICAgICAgICB0eXBlOiBbU3RyaW5nLCBCb29sZWFuXSxcbiAgICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICAgIH0sXG4gICAgICBwbGF5c2lubGluZToge1xuICAgICAgICB0eXBlOiBbU3RyaW5nLCBCb29sZWFuXSxcbiAgICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgICAgfSxcbiAgICAgIGNvbnRyb2xzOiB7XG4gICAgICAgIHR5cGU6IFtTdHJpbmcsIEJvb2xlYW5dLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICByZW5kZXIgKGNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIGlmICh0aGlzLnBsYXlTdGF0dXMgPT09ICdwbGF5Jykge1xuICAgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy4kZWwgJiYgdGhpcy4kZWwucGxheSgpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBlbHNlIGlmICh0aGlzLnBsYXlTdGF0dXMgPT09ICdwYXVzZScpIHtcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMuJGVsICYmIHRoaXMuJGVsLnBhdXNlKClcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoJ2h0bWw6dmlkZW8nLCB7XG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgJ3dlZXgtdHlwZSc6ICd2aWRlbycsXG4gICAgICAgICAgYXV0b3BsYXk6ICgodGhpcy5hdXRvcGxheSAhPT0gJ2ZhbHNlJyAmJiB0aGlzLmF1dG9wbGF5ICE9PSBmYWxzZSlcbiAgICAgICAgICAgIHx8ICh0aGlzLmF1dG9QbGF5ICE9PSAnZmFsc2UnICYmIHRoaXMuYXV0b1BsYXkgIT09IGZhbHNlKSksXG4gICAgICAgICAgJ3dlYmtpdC1wbGF5c2lubGluZSc6IHRoaXMucGxheXNpbmxpbmUsXG4gICAgICAgICAgY29udHJvbHM6IHRoaXMuY29udHJvbHMsXG4gICAgICAgICAgc3JjOiB0aGlzLnNyY1xuICAgICAgICB9LFxuICAgICAgICBvbjogY3JlYXRlRXZlbnRNYXAodGhpcywgWydzdGFydCcsICdwYXVzZScsICdmaW5pc2gnLCAnZmFpbCddKSxcbiAgICAgICAgc3RhdGljQ2xhc3M6ICd3ZWV4LXZpZGVvIHdlZXgtZWwnLFxuICAgICAgICBzdGF0aWNTdHlsZTogZXh0cmFjdENvbXBvbmVudFN0eWxlKHRoaXMpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKHdlZXgpIHtcbiAgICB3ZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCd2aWRlbycsIGdldFZpZGVvKHdlZXgpKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuY29uc3QgX2NzcyA9IGBcbi53ZWV4LXdlYiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyOiBub25lO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuYFxuXG5mdW5jdGlvbiBnZXRXZWIgKHdlZXgpIHtcbiAgY29uc3QgeyBleHRyYWN0Q29tcG9uZW50U3R5bGUsIGNyZWF0ZUV2ZW50TWFwIH0gPSB3ZWV4XG4gIGNvbnN0IHsgY3JlYXRlRXZlbnQgfSA9IHdlZXgudXRpbHNcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3ZWV4LXdlYicsXG4gICAgcHJvcHM6IHtcbiAgICAgIHNyYzogU3RyaW5nXG4gICAgfSxcbiAgICBtZXRob2RzOiB7XG4gICAgICAvLyBUT0RPOiBjaGVjayBjcm9zcy1vcmlnaW5cbiAgICAgIGdvQmFjayAoKSB7XG4gICAgICAgIGlmICh0aGlzLiRlbCkge1xuICAgICAgICAgIHRoaXMuJGVsLmNvbnRlbnRXaW5kb3cuaGlzdG9yeS5iYWNrKClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGdvRm9yd2FyZCAoKSB7XG4gICAgICAgIGlmICh0aGlzLiRlbCkge1xuICAgICAgICAgIHRoaXMuJGVsLmNvbnRlbnRXaW5kb3cuaGlzdG9yeS5mb3J3YXJkKClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHJlbG9hZCAoKSB7XG4gICAgICAgIGlmICh0aGlzLiRlbCkge1xuICAgICAgICAgIHRoaXMuJGVsLmNvbnRlbnRXaW5kb3cuaGlzdG9yeS5yZWxvYWQoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIG1vdW50ZWQgKCkge1xuICAgICAgaWYgKHRoaXMuJGVsKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3BhZ2VzdGFydCcsIGNyZWF0ZUV2ZW50KHRoaXMuJGVsLCAncGFnZXN0YXJ0JywgeyB1cmw6IHRoaXMuc3JjIH0pKVxuICAgICAgICB0aGlzLiRlbC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZXZlbnQgPT4ge1xuICAgICAgICAgIHRoaXMuJGVtaXQoJ3BhZ2VmaW5pc2gnLCBjcmVhdGVFdmVudCh0aGlzLiRlbCwgJ3BhZ2VmaW5pc2gnLCB7IHVybDogdGhpcy5zcmMgfSkpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlbmRlciAoY3JlYXRlRWxlbWVudCkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgLy8gICB2YWxpZGF0ZVN0eWxlcygnd2ViJywgdGhpcy4kdm5vZGUuZGF0YSAmJiB0aGlzLiR2bm9kZS5kYXRhLnN0YXRpY1N0eWxlKVxuICAgICAgLy8gfVxuICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScsIHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAnd2VleC10eXBlJzogJ3dlYicsXG4gICAgICAgICAgc3JjOiB0aGlzLnNyY1xuICAgICAgICB9LFxuICAgICAgICBvbjogY3JlYXRlRXZlbnRNYXAodGhpcywgWydlcnJvciddKSxcbiAgICAgICAgc3RhdGljQ2xhc3M6ICd3ZWV4LXdlYiB3ZWV4LWVsJyxcbiAgICAgICAgc3RhdGljU3R5bGU6IGV4dHJhY3RDb21wb25lbnRTdHlsZSh0aGlzKVxuICAgICAgfSlcbiAgICB9LFxuICAgIF9jc3NcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKHdlZXgpIHtcbiAgICB3ZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCd3ZWInLCBnZXRXZWIod2VleCkpXG4gIH1cbn1cblxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgYSBmcm9tICcuL2EnXG5pbXBvcnQgZGl2IGZyb20gJy4vZGl2J1xuaW1wb3J0IGltYWdlIGZyb20gJy4vaW1hZ2UnXG5pbXBvcnQgaW5wdXQgZnJvbSAnLi9pbnB1dCdcbmltcG9ydCBfc3dpdGNoIGZyb20gJy4vc3dpdGNoJ1xuaW1wb3J0IHNjcm9sbGFibGUgZnJvbSAnLi9zY3JvbGxhYmxlJ1xuaW1wb3J0IHNsaWRlciBmcm9tICcuL3NsaWRlcidcbmltcG9ydCB0ZXh0IGZyb20gJy4vdGV4dCdcbmltcG9ydCB0ZXh0YXJlYSBmcm9tICcuL3RleHRhcmVhJ1xuaW1wb3J0IHZpZGVvIGZyb20gJy4vdmlkZW8nXG5pbXBvcnQgd2ViIGZyb20gJy4vd2ViJ1xuXG5leHBvcnQgZGVmYXVsdCBbXG4gIGEsXG4gIGRpdixcbiAgaW1hZ2UsXG4gIGlucHV0LFxuICBfc3dpdGNoLFxuICBzY3JvbGxhYmxlLFxuICBzbGlkZXIsXG4gIHRleHQsXG4gIHRleHRhcmVhLFxuICB2aWRlbyxcbiAgd2ViXG5dXG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCBzdXBwb3J0R2VvbG9jYXRpb24gPSAnZ2VvbG9jYXRpb24nIGluIG5hdmlnYXRvclxuY29uc3QgZXJyb3JNc2cgPSBgW2g1LXJlbmRlcl06IGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IGdlb2xvY2F0aW9uLmBcblxuY29uc3QgZ2VvbG9jYXRpb24gPSB7XG4gIC8vIG9wdGlvbnM6XG4gIC8vICAgLSBlbmFibGVIaWdoQWNjdXJhY3kgb3B0aW9uYWwsIHZhbHVlIGlzIHRydWUgb3IgZmFsc2UsIGZhbHNlIGJ5IGRlZmF1bHQuXG4gIC8vICAgLSB0aW1lb3V0IFtub25lLW5hdGl2ZV0gb3B0aW9uYWwsIHZhbHVlIGlzIGEgbnVtYmVyIChtaWxsaXNlY29uZHMpLCBkZWZhdWx0IHZhdWxlIGlzIEZJTkZJTklUWS5cbiAgLy8gICAtIG1heGltdW1BZ2UgW25vbmUtbmF0aXZlXSBvcHRpb25hbCwgdmFsdWUgaXMgYSBudW1iZXIgKG1pbGxpc2Vjb25kcyksIGRlZmF1bHQgdmFsdWUgaXMgMC5cbiAgZ2V0Q3VycmVudFBvc2l0aW9uIChzdWNjZXNzQ2JJZCwgZXJyb3JDYklkLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgc3VjY2Vzc0NiID0gcG9zID0+IHRoaXMuc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhzdWNjZXNzQ2JJZCwgcG9zKVxuICAgIGNvbnN0IGVycm9yQ2IgPSBlcnIgPT4gdGhpcy5zZW5kZXIucGVyZm9ybUNhbGxiYWNrKGVycm9yQ2JJZCwgZXJyKVxuICAgIGlmIChzdXBwb3J0R2VvbG9jYXRpb24pIHtcbiAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oc3VjY2Vzc0NiLCBlcnJvckNiLCBvcHRpb25zKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihlcnJvck1zZylcbiAgICAgIGVycm9yQ2IobmV3IEVycm9yKGVycm9yTXNnKSlcbiAgICB9XG4gIH0sXG5cbiAgLy8gb3B0aW9uczogdGhlIHNhbWUgd2l0aCBgZ2V0Q3VycmVudFBvc2l0aW9uYC5cbiAgd2F0Y2hQb3NpdGlvbiAoc3VjY2Vzc0NiSWQsIGVycm9yQ2JJZCwgb3B0aW9ucykge1xuICAgIGNvbnN0IHN1Y2Nlc3NDYiA9IHBvcyA9PiB0aGlzLnNlbmRlci5wZXJmb3JtQ2FsbGJhY2soc3VjY2Vzc0NiSWQsIHBvcywgdHJ1ZSlcbiAgICBjb25zdCBlcnJvckNiID0gZXJyID0+IHRoaXMuc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhlcnJvckNiSWQsIGVycilcbiAgICBpZiAoc3VwcG9ydEdlb2xvY2F0aW9uKSB7XG4gICAgICBjb25zdCBpZCA9IG5hdmlnYXRvci5nZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKHBvcyA9PiB7XG4gICAgICAgIHBvcy53YXRjaElkID0gaWRcbiAgICAgICAgc3VjY2Vzc0NiKHBvcylcbiAgICAgIH0sIGVycm9yQ2IsIG9wdGlvbnMpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGVycm9yTXNnKVxuICAgICAgZXJyb3JDYihuZXcgRXJyb3IoZXJyb3JNc2cpKVxuICAgIH1cbiAgfSxcblxuICBjbGVhcldhdGNoICh3YXRjaElkKSB7XG4gICAgaWYgKHN1cHBvcnRHZW9sb2NhdGlvbikge1xuICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2god2F0Y2hJZClcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oZXJyb3JNc2cpXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IG1ldGEgPSB7XG4gIGdlb2xvY2F0aW9uOiBbe1xuICAgIG5hbWU6ICdnZXRDdXJyZW50UG9zaXRpb24nLFxuICAgIGFyZ3M6IFsnZnVuY3Rpb24nLCAnZnVuY3Rpb24nLCAnb2JqZWN0J11cbiAgfSwge1xuICAgIG5hbWU6ICd3YXRjaFBvc2l0aW9uJyxcbiAgICBhcmdzOiBbJ2Z1bmN0aW9uJywgJ2Z1bmN0aW9uJywgJ29iamVjdCddXG4gIH0sIHtcbiAgICBuYW1lOiAnY2xlYXJXYXRjaCcsXG4gICAgYXJnczogWydzdHJpbmcnXVxuICB9XVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKFdlZXgpIHtcbiAgICBXZWV4LnJlZ2lzdGVyQXBpTW9kdWxlKCdnZW9sb2NhdGlvbicsIGdlb2xvY2F0aW9uLCBtZXRhKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGdsb2JhbCBsb2NhbFN0b3JhZ2UgKi9cblxuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHN1cHBvcnRMb2NhbFN0b3JhZ2UgPSB0eXBlb2YgbG9jYWxTdG9yYWdlICE9PSAndW5kZWZpbmVkJ1xuY29uc3QgU1VDQ0VTUyA9ICdzdWNjZXNzJ1xuY29uc3QgRkFJTEVEID0gJ2ZhaWxlZCdcbmNvbnN0IElOVkFMSURfUEFSQU0gPSAnaW52YWxpZF9wYXJhbSdcbmNvbnN0IFVOREVGSU5FRCA9ICd1bmRlZmluZWQnXG5cbmNvbnN0IHN0b3JhZ2UgPSB7XG5cbiAgLyoqXG4gICAqIFdoZW4gcGFzc2VkIGEga2V5IG5hbWUgYW5kIHZhbHVlLCB3aWxsIGFkZCB0aGF0IGtleSB0byB0aGUgc3RvcmFnZSxcbiAgICogb3IgdXBkYXRlIHRoYXQga2V5J3MgdmFsdWUgaWYgaXQgYWxyZWFkeSBleGlzdHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIG5vdCBudWxsIG5vciB1bmRpZmluZWTvvIxidXQgMCB3b3Jrcy5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tJZFxuICAgKi9cbiAgc2V0SXRlbTogZnVuY3Rpb24gKGtleSwgdmFsdWUsIGNhbGxiYWNrSWQpIHtcbiAgICBpZiAoIXN1cHBvcnRMb2NhbFN0b3JhZ2UpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3lvdXIgYnJvd3NlciBpcyBub3Qgc3VwcG9ydCBsb2NhbFN0b3JhZ2UgeWV0LicpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc2VuZGVyID0gdGhpcy5zZW5kZXJcbiAgICBpZiAoIWtleSB8fCAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSkge1xuICAgICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB7XG4gICAgICAgIHJlc3VsdDogJ2ZhaWxlZCcsXG4gICAgICAgIGRhdGE6IElOVkFMSURfUEFSQU1cbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpXG4gICAgICBzZW5kZXIucGVyZm9ybUNhbGxiYWNrKGNhbGxiYWNrSWQsIHtcbiAgICAgICAgcmVzdWx0OiBTVUNDRVNTLFxuICAgICAgICBkYXRhOiBVTkRFRklORURcbiAgICAgIH0pXG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAvLyBhY2NlcHQgYW55IGV4Y2VwdGlvbiB0aHJvd24gZHVyaW5nIGEgc3RvcmFnZSBhdHRlbXB0IGFzIGEgcXVvdGEgZXJyb3JcbiAgICAgIHNlbmRlci5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2tJZCwge1xuICAgICAgICByZXN1bHQ6IEZBSUxFRCxcbiAgICAgICAgZGF0YTogVU5ERUZJTkVEXG4gICAgICB9KVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogV2hlbiBwYXNzZWQgYSBrZXkgbmFtZSwgd2lsbCByZXR1cm4gdGhhdCBrZXkncyB2YWx1ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja0lkXG4gICAqL1xuICBnZXRJdGVtOiBmdW5jdGlvbiAoa2V5LCBjYWxsYmFja0lkKSB7XG4gICAgaWYgKCFzdXBwb3J0TG9jYWxTdG9yYWdlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd5b3VyIGJyb3dzZXIgaXMgbm90IHN1cHBvcnQgbG9jYWxTdG9yYWdlIHlldC4nKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHNlbmRlciA9IHRoaXMuc2VuZGVyXG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHNlbmRlci5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2tJZCwge1xuICAgICAgICByZXN1bHQ6IEZBSUxFRCxcbiAgICAgICAgZGF0YTogSU5WQUxJRF9QQVJBTVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCB2YWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpXG4gICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB7XG4gICAgICByZXN1bHQ6IHZhbCA/IFNVQ0NFU1MgOiBGQUlMRUQsXG4gICAgICBkYXRhOiB2YWwgfHwgVU5ERUZJTkVEXG4gICAgfSlcbiAgfSxcblxuICAvKipcbiAgICpXaGVuIHBhc3NlZCBhIGtleSBuYW1lLCB3aWxsIHJlbW92ZSB0aGF0IGtleSBmcm9tIHRoZSBzdG9yYWdlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrSWRcbiAgICovXG4gIHJlbW92ZUl0ZW06IGZ1bmN0aW9uIChrZXksIGNhbGxiYWNrSWQpIHtcbiAgICBpZiAoIXN1cHBvcnRMb2NhbFN0b3JhZ2UpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3lvdXIgYnJvd3NlciBpcyBub3Qgc3VwcG9ydCBsb2NhbFN0b3JhZ2UgeWV0LicpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc2VuZGVyID0gdGhpcy5zZW5kZXJcbiAgICBpZiAoIWtleSkge1xuICAgICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB7XG4gICAgICAgIHJlc3VsdDogRkFJTEVELFxuICAgICAgICBkYXRhOiBJTlZBTElEX1BBUkFNXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSlcbiAgICBzZW5kZXIucGVyZm9ybUNhbGxiYWNrKGNhbGxiYWNrSWQsIHtcbiAgICAgIHJlc3VsdDogU1VDQ0VTUyxcbiAgICAgIGRhdGE6IFVOREVGSU5FRFxuICAgIH0pXG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBkYXRhIGl0ZW1zIHN0b3JlZCBpbiB0aGUgU3RvcmFnZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrSWRcbiAgICovXG4gIGxlbmd0aDogZnVuY3Rpb24gKGNhbGxiYWNrSWQpIHtcbiAgICBpZiAoIXN1cHBvcnRMb2NhbFN0b3JhZ2UpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3lvdXIgYnJvd3NlciBpcyBub3Qgc3VwcG9ydCBsb2NhbFN0b3JhZ2UgeWV0LicpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc2VuZGVyID0gdGhpcy5zZW5kZXJcbiAgICBjb25zdCBsZW4gPSBsb2NhbFN0b3JhZ2UubGVuZ3RoXG4gICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB7XG4gICAgICByZXN1bHQ6IFNVQ0NFU1MsXG4gICAgICBkYXRhOiBsZW5cbiAgICB9KVxuICB9LFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IHRoYXQgY29udGFpbnMgYWxsIGtleXMgc3RvcmVkIGluIFN0b3JhZ2Ugb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja0lkXG4gICAqL1xuICBnZXRBbGxLZXlzOiBmdW5jdGlvbiAoY2FsbGJhY2tJZCkge1xuICAgIGlmICghc3VwcG9ydExvY2FsU3RvcmFnZSkge1xuICAgICAgY29uc29sZS5lcnJvcigneW91ciBicm93c2VyIGlzIG5vdCBzdXBwb3J0IGxvY2FsU3RvcmFnZSB5ZXQuJylcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBzZW5kZXIgPSB0aGlzLnNlbmRlclxuICAgIGNvbnN0IF9hcnIgPSBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYWxTdG9yYWdlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBfYXJyLnB1c2gobG9jYWxTdG9yYWdlLmtleShpKSlcbiAgICB9XG4gICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB7XG4gICAgICByZXN1bHQ6IFNVQ0NFU1MsXG4gICAgICBkYXRhOiBfYXJyXG4gICAgfSlcbiAgfVxufVxuXG5jb25zdCBtZXRhID0ge1xuICBzdG9yYWdlOiBbe1xuICAgIG5hbWU6ICdzZXRJdGVtJyxcbiAgICBhcmdzOiBbJ3N0cmluZycsICdzdHJpbmcnLCAnZnVuY3Rpb24nXVxuICB9LCB7XG4gICAgbmFtZTogJ2dldEl0ZW0nLFxuICAgIGFyZ3M6IFsnc3RyaW5nJywgJ2Z1bmN0aW9uJ11cbiAgfSwge1xuICAgIG5hbWU6ICdyZW1vdmVJdGVtJyxcbiAgICBhcmdzOiBbJ3N0cmluZycsICdmdW5jdGlvbiddXG4gIH0sIHtcbiAgICBuYW1lOiAnbGVuZ3RoJyxcbiAgICBhcmdzOiBbJ2Z1bmN0aW9uJ11cbiAgfSwge1xuICAgIG5hbWU6ICdnZXRBbGxLZXlzJyxcbiAgICBhcmdzOiBbJ2Z1bmN0aW9uJ11cbiAgfV1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBmdW5jdGlvbiAoV2VleCkge1xuICAgIFdlZXgucmVnaXN0ZXJBcGlNb2R1bGUoJ3N0b3JhZ2UnLCBzdG9yYWdlLCBtZXRhKVxuICB9XG59XG4iLCIodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpICYmICh3aW5kb3cgPSB7Y3RybDoge30sIGxpYjoge319KTshd2luZG93LmN0cmwgJiYgKHdpbmRvdy5jdHJsID0ge30pOyF3aW5kb3cubGliICYmICh3aW5kb3cubGliID0ge30pOyFmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7dmFyIGI9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJwYXJhbXNcIix7c2V0OmZ1bmN0aW9uKGEpe2lmKFwib2JqZWN0XCI9PXR5cGVvZiBhKXtmb3IodmFyIGMgaW4gYilkZWxldGUgYltjXTtmb3IodmFyIGMgaW4gYSliW2NdPWFbY119fSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYn0sZW51bWVyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwic2VhcmNoXCIse3NldDpmdW5jdGlvbihhKXtpZihcInN0cmluZ1wiPT10eXBlb2YgYSl7MD09PWEuaW5kZXhPZihcIj9cIikmJihhPWEuc3Vic3RyKDEpKTt2YXIgYz1hLnNwbGl0KFwiJlwiKTtmb3IodmFyIGQgaW4gYilkZWxldGUgYltkXTtmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXS5zcGxpdChcIj1cIik7aWYodm9pZCAwIT09ZlsxXSYmKGZbMV09ZlsxXS50b1N0cmluZygpKSxmWzBdKXRyeXtiW2RlY29kZVVSSUNvbXBvbmVudChmWzBdKV09ZGVjb2RlVVJJQ29tcG9uZW50KGZbMV0pfWNhdGNoKGcpe2JbZlswXV09ZlsxXX19fX0sZ2V0OmZ1bmN0aW9uKCl7dmFyIGE9W107Zm9yKHZhciBjIGluIGIpaWYodm9pZCAwIT09YltjXSlpZihcIlwiIT09YltjXSl0cnl7YS5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChjKStcIj1cIitlbmNvZGVVUklDb21wb25lbnQoYltjXSkpfWNhdGNoKGQpe2EucHVzaChjK1wiPVwiK2JbY10pfWVsc2UgdHJ5e2EucHVzaChlbmNvZGVVUklDb21wb25lbnQoYykpfWNhdGNoKGQpe2EucHVzaChjKX1yZXR1cm4gYS5sZW5ndGg/XCI/XCIrYS5qb2luKFwiJlwiKTpcIlwifSxlbnVtZXJhYmxlOiEwfSk7dmFyIGM7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJoYXNoXCIse3NldDpmdW5jdGlvbihhKXtcInN0cmluZ1wiPT10eXBlb2YgYSYmKGEmJmEuaW5kZXhPZihcIiNcIik8MCYmKGE9XCIjXCIrYSksYz1hfHxcIlwiKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGN9LGVudW1lcmFibGU6ITB9KSx0aGlzLnNldD1mdW5jdGlvbihhKXthPWF8fFwiXCI7dmFyIGI7aWYoIShiPWEubWF0Y2gobmV3IFJlZ0V4cChcIl4oW2EtejAtOS1dKzopP1svXXsyfSg/OihbXkAvOj9dKykoPzo6KFteQC86XSspKT9AKT8oW146Lz8jXSspKD86WzpdKFswLTldKykpPyhbL11bXj8jO10qKT8oPzpbP10oW14jXSopKT8oWyNdW14/XSopPyRcIixcImlcIikpKSl0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyB1cmkgc2NoZW1lLlwiKTt0aGlzLnByb3RvY29sPWJbMV18fChcIm9iamVjdFwiPT10eXBlb2YgbG9jYXRpb24/bG9jYXRpb24ucHJvdG9jb2w6XCJcIiksdGhpcy51c2VybmFtZT1iWzJdfHxcIlwiLHRoaXMucGFzc3dvcmQ9YlszXXx8XCJcIix0aGlzLmhvc3RuYW1lPXRoaXMuaG9zdD1iWzRdLHRoaXMucG9ydD1iWzVdfHxcIlwiLHRoaXMucGF0aG5hbWU9Yls2XXx8XCIvXCIsdGhpcy5zZWFyY2g9Yls3XXx8XCJcIix0aGlzLmhhc2g9Yls4XXx8XCJcIix0aGlzLm9yaWdpbj10aGlzLnByb3RvY29sK1wiLy9cIit0aGlzLmhvc3RuYW1lfSx0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wcm90b2NvbCtcIi8vXCI7cmV0dXJuIHRoaXMudXNlcm5hbWUmJihhKz10aGlzLnVzZXJuYW1lLHRoaXMucGFzc3dvcmQmJihhKz1cIjpcIit0aGlzLnBhc3N3b3JkKSxhKz1cIkBcIiksYSs9dGhpcy5ob3N0LHRoaXMucG9ydCYmXCI4MFwiIT09dGhpcy5wb3J0JiYoYSs9XCI6XCIrdGhpcy5wb3J0KSx0aGlzLnBhdGhuYW1lJiYoYSs9dGhpcy5wYXRobmFtZSksdGhpcy5zZWFyY2gmJihhKz10aGlzLnNlYXJjaCksdGhpcy5oYXNoJiYoYSs9dGhpcy5oYXNoKSxhfSxhJiZ0aGlzLnNldChhLnRvU3RyaW5nKCkpfWIuaHR0cHVybD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IGMoYSl9fSh3aW5kb3csd2luZG93LmxpYnx8KHdpbmRvdy5saWI9e30pKTs7bW9kdWxlLmV4cG9ydHMgPSB3aW5kb3cubGliWydodHRwdXJsJ107IiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RyKSB7XG5cdHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyKS5yZXBsYWNlKC9bIScoKSpdL2csIGZ1bmN0aW9uIChjKSB7XG5cdFx0cmV0dXJuICclJyArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0fSk7XG59O1xuIiwiLypcbm9iamVjdC1hc3NpZ25cbihjKSBTaW5kcmUgU29yaHVzXG5AbGljZW5zZSBNSVRcbiovXG5cbid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KHZhbCkge1xuXHRpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTtcblx0fVxuXG5cdHJldHVybiBPYmplY3QodmFsKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKCkge1xuXHR0cnkge1xuXHRcdGlmICghT2JqZWN0LmFzc2lnbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIERldGVjdCBidWdneSBwcm9wZXJ0eSBlbnVtZXJhdGlvbiBvcmRlciBpbiBvbGRlciBWOCB2ZXJzaW9ucy5cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxMThcblx0XHR2YXIgdGVzdDEgPSBuZXcgU3RyaW5nKCdhYmMnKTsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3LXdyYXBwZXJzXG5cdFx0dGVzdDFbNV0gPSAnZGUnO1xuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF0gPT09ICc1Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDIgPSB7fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcblx0XHRcdHRlc3QyWydfJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcblx0XHR9XG5cdFx0dmFyIG9yZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4pIHtcblx0XHRcdHJldHVybiB0ZXN0MltuXTtcblx0XHR9KTtcblx0XHRpZiAob3JkZXIyLmpvaW4oJycpICE9PSAnMDEyMzQ1Njc4OScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QzID0ge307XG5cdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAobGV0dGVyKSB7XG5cdFx0XHR0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyO1xuXHRcdH0pO1xuXHRcdGlmIChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PVxuXHRcdFx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdC8vIFdlIGRvbid0IGV4cGVjdCBhbnkgb2YgdGhlIGFib3ZlIHRvIHRocm93LCBidXQgYmV0dGVyIHRvIGJlIHNhZmUuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hvdWxkVXNlTmF0aXZlKCkgPyBPYmplY3QuYXNzaWduIDogZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG5cdHZhciBmcm9tO1xuXHR2YXIgdG8gPSB0b09iamVjdCh0YXJnZXQpO1xuXHR2YXIgc3ltYm9scztcblxuXHRmb3IgKHZhciBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykge1xuXHRcdGZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTtcblxuXHRcdGZvciAodmFyIGtleSBpbiBmcm9tKSB7XG5cdFx0XHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7XG5cdFx0XHRcdHRvW2tleV0gPSBmcm9tW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuXHRcdFx0c3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9scyhmcm9tKTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7XG5cdFx0XHRcdFx0dG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBzdHJpY3RVcmlFbmNvZGUgPSByZXF1aXJlKCdzdHJpY3QtdXJpLWVuY29kZScpO1xudmFyIG9iamVjdEFzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxuZnVuY3Rpb24gZW5jb2RlckZvckFycmF5Rm9ybWF0KG9wdHMpIHtcblx0c3dpdGNoIChvcHRzLmFycmF5Rm9ybWF0KSB7XG5cdFx0Y2FzZSAnaW5kZXgnOlxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlLCBpbmRleCkge1xuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IG51bGwgPyBbXG5cdFx0XHRcdFx0ZW5jb2RlKGtleSwgb3B0cyksXG5cdFx0XHRcdFx0J1snLFxuXHRcdFx0XHRcdGluZGV4LFxuXHRcdFx0XHRcdCddJ1xuXHRcdFx0XHRdLmpvaW4oJycpIDogW1xuXHRcdFx0XHRcdGVuY29kZShrZXksIG9wdHMpLFxuXHRcdFx0XHRcdCdbJyxcblx0XHRcdFx0XHRlbmNvZGUoaW5kZXgsIG9wdHMpLFxuXHRcdFx0XHRcdCddPScsXG5cdFx0XHRcdFx0ZW5jb2RlKHZhbHVlLCBvcHRzKVxuXHRcdFx0XHRdLmpvaW4oJycpO1xuXHRcdFx0fTtcblxuXHRcdGNhc2UgJ2JyYWNrZXQnOlxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IGVuY29kZShrZXksIG9wdHMpIDogW1xuXHRcdFx0XHRcdGVuY29kZShrZXksIG9wdHMpLFxuXHRcdFx0XHRcdCdbXT0nLFxuXHRcdFx0XHRcdGVuY29kZSh2YWx1ZSwgb3B0cylcblx0XHRcdFx0XS5qb2luKCcnKTtcblx0XHRcdH07XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IGVuY29kZShrZXksIG9wdHMpIDogW1xuXHRcdFx0XHRcdGVuY29kZShrZXksIG9wdHMpLFxuXHRcdFx0XHRcdCc9Jyxcblx0XHRcdFx0XHRlbmNvZGUodmFsdWUsIG9wdHMpXG5cdFx0XHRcdF0uam9pbignJyk7XG5cdFx0XHR9O1xuXHR9XG59XG5cbmZ1bmN0aW9uIHBhcnNlckZvckFycmF5Rm9ybWF0KG9wdHMpIHtcblx0dmFyIHJlc3VsdDtcblxuXHRzd2l0Y2ggKG9wdHMuYXJyYXlGb3JtYXQpIHtcblx0XHRjYXNlICdpbmRleCc6XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUsIGFjY3VtdWxhdG9yKSB7XG5cdFx0XHRcdHJlc3VsdCA9IC9cXFsoXFxkKilcXF0kLy5leGVjKGtleSk7XG5cblx0XHRcdFx0a2V5ID0ga2V5LnJlcGxhY2UoL1xcW1xcZCpcXF0kLywgJycpO1xuXG5cdFx0XHRcdGlmICghcmVzdWx0KSB7XG5cdFx0XHRcdFx0YWNjdW11bGF0b3Jba2V5XSA9IHZhbHVlO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChhY2N1bXVsYXRvcltrZXldID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRhY2N1bXVsYXRvcltrZXldID0ge307XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhY2N1bXVsYXRvcltrZXldW3Jlc3VsdFsxXV0gPSB2YWx1ZTtcblx0XHRcdH07XG5cblx0XHRjYXNlICdicmFja2V0Jzpcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgYWNjdW11bGF0b3IpIHtcblx0XHRcdFx0cmVzdWx0ID0gLyhcXFtcXF0pJC8uZXhlYyhrZXkpO1xuXG5cdFx0XHRcdGtleSA9IGtleS5yZXBsYWNlKC9cXFtcXF0kLywgJycpO1xuXG5cdFx0XHRcdGlmICghcmVzdWx0IHx8IGFjY3VtdWxhdG9yW2tleV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGFjY3VtdWxhdG9yW2tleV0gPSBbdmFsdWVdO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFjY3VtdWxhdG9yW2tleV0gPSBbXS5jb25jYXQoYWNjdW11bGF0b3Jba2V5XSwgdmFsdWUpO1xuXHRcdFx0fTtcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUsIGFjY3VtdWxhdG9yKSB7XG5cdFx0XHRcdGlmIChhY2N1bXVsYXRvcltrZXldID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRhY2N1bXVsYXRvcltrZXldID0gdmFsdWU7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YWNjdW11bGF0b3Jba2V5XSA9IFtdLmNvbmNhdChhY2N1bXVsYXRvcltrZXldLCB2YWx1ZSk7XG5cdFx0XHR9O1xuXHR9XG59XG5cbmZ1bmN0aW9uIGVuY29kZSh2YWx1ZSwgb3B0cykge1xuXHRpZiAob3B0cy5lbmNvZGUpIHtcblx0XHRyZXR1cm4gb3B0cy5zdHJpY3QgPyBzdHJpY3RVcmlFbmNvZGUodmFsdWUpIDogZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcblx0fVxuXG5cdHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24ga2V5c1NvcnRlcihpbnB1dCkge1xuXHRpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcblx0XHRyZXR1cm4gaW5wdXQuc29ydCgpO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcpIHtcblx0XHRyZXR1cm4ga2V5c1NvcnRlcihPYmplY3Qua2V5cyhpbnB1dCkpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcblx0XHRcdHJldHVybiBOdW1iZXIoYSkgLSBOdW1iZXIoYik7XG5cdFx0fSkubWFwKGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdHJldHVybiBpbnB1dFtrZXldO1xuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIGlucHV0O1xufVxuXG5leHBvcnRzLmV4dHJhY3QgPSBmdW5jdGlvbiAoc3RyKSB7XG5cdHJldHVybiBzdHIuc3BsaXQoJz8nKVsxXSB8fCAnJztcbn07XG5cbmV4cG9ydHMucGFyc2UgPSBmdW5jdGlvbiAoc3RyLCBvcHRzKSB7XG5cdG9wdHMgPSBvYmplY3RBc3NpZ24oe2FycmF5Rm9ybWF0OiAnbm9uZSd9LCBvcHRzKTtcblxuXHR2YXIgZm9ybWF0dGVyID0gcGFyc2VyRm9yQXJyYXlGb3JtYXQob3B0cyk7XG5cblx0Ly8gQ3JlYXRlIGFuIG9iamVjdCB3aXRoIG5vIHByb3RvdHlwZVxuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3F1ZXJ5LXN0cmluZy9pc3N1ZXMvNDdcblx0dmFyIHJldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cblx0aWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIHJldDtcblx0fVxuXG5cdHN0ciA9IHN0ci50cmltKCkucmVwbGFjZSgvXihcXD98I3wmKS8sICcnKTtcblxuXHRpZiAoIXN0cikge1xuXHRcdHJldHVybiByZXQ7XG5cdH1cblxuXHRzdHIuc3BsaXQoJyYnKS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkge1xuXHRcdHZhciBwYXJ0cyA9IHBhcmFtLnJlcGxhY2UoL1xcKy9nLCAnICcpLnNwbGl0KCc9Jyk7XG5cdFx0Ly8gRmlyZWZveCAocHJlIDQwKSBkZWNvZGVzIGAlM0RgIHRvIGA9YFxuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvcXVlcnktc3RyaW5nL3B1bGwvMzdcblx0XHR2YXIga2V5ID0gcGFydHMuc2hpZnQoKTtcblx0XHR2YXIgdmFsID0gcGFydHMubGVuZ3RoID4gMCA/IHBhcnRzLmpvaW4oJz0nKSA6IHVuZGVmaW5lZDtcblxuXHRcdC8vIG1pc3NpbmcgYD1gIHNob3VsZCBiZSBgbnVsbGA6XG5cdFx0Ly8gaHR0cDovL3czLm9yZy9UUi8yMDEyL1dELXVybC0yMDEyMDUyNC8jY29sbGVjdC11cmwtcGFyYW1ldGVyc1xuXHRcdHZhbCA9IHZhbCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlY29kZVVSSUNvbXBvbmVudCh2YWwpO1xuXG5cdFx0Zm9ybWF0dGVyKGRlY29kZVVSSUNvbXBvbmVudChrZXkpLCB2YWwsIHJldCk7XG5cdH0pO1xuXG5cdHJldHVybiBPYmplY3Qua2V5cyhyZXQpLnNvcnQoKS5yZWR1Y2UoZnVuY3Rpb24gKHJlc3VsdCwga2V5KSB7XG5cdFx0dmFyIHZhbCA9IHJldFtrZXldO1xuXHRcdGlmIChCb29sZWFuKHZhbCkgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsKSkge1xuXHRcdFx0Ly8gU29ydCBvYmplY3Qga2V5cywgbm90IHZhbHVlc1xuXHRcdFx0cmVzdWx0W2tleV0gPSBrZXlzU29ydGVyKHZhbCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdFtrZXldID0gdmFsO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sIE9iamVjdC5jcmVhdGUobnVsbCkpO1xufTtcblxuZXhwb3J0cy5zdHJpbmdpZnkgPSBmdW5jdGlvbiAob2JqLCBvcHRzKSB7XG5cdHZhciBkZWZhdWx0cyA9IHtcblx0XHRlbmNvZGU6IHRydWUsXG5cdFx0c3RyaWN0OiB0cnVlLFxuXHRcdGFycmF5Rm9ybWF0OiAnbm9uZSdcblx0fTtcblxuXHRvcHRzID0gb2JqZWN0QXNzaWduKGRlZmF1bHRzLCBvcHRzKTtcblxuXHR2YXIgZm9ybWF0dGVyID0gZW5jb2RlckZvckFycmF5Rm9ybWF0KG9wdHMpO1xuXG5cdHJldHVybiBvYmogPyBPYmplY3Qua2V5cyhvYmopLnNvcnQoKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuXHRcdHZhciB2YWwgPSBvYmpba2V5XTtcblxuXHRcdGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuICcnO1xuXHRcdH1cblxuXHRcdGlmICh2YWwgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBlbmNvZGUoa2V5LCBvcHRzKTtcblx0XHR9XG5cblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG5cdFx0XHR2YXIgcmVzdWx0ID0gW107XG5cblx0XHRcdHZhbC5zbGljZSgpLmZvckVhY2goZnVuY3Rpb24gKHZhbDIpIHtcblx0XHRcdFx0aWYgKHZhbDIgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJlc3VsdC5wdXNoKGZvcm1hdHRlcihrZXksIHZhbDIsIHJlc3VsdC5sZW5ndGgpKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gcmVzdWx0LmpvaW4oJyYnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZW5jb2RlKGtleSwgb3B0cykgKyAnPScgKyBlbmNvZGUodmFsLCBvcHRzKTtcblx0fSkuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG5cdFx0cmV0dXJuIHgubGVuZ3RoID4gMDtcblx0fSkuam9pbignJicpIDogJyc7XG59O1xuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBnbG9iYWwgbGliLCBYTUxIdHRwUmVxdWVzdCAqL1xuLyogZGVwczogaHR0cHVybCAqL1xuXG4ndXNlIHN0cmljdCdcblxubGV0IHV0aWxzXG5cbmltcG9ydCAnaHR0cHVybCdcbmltcG9ydCBxcyBmcm9tICdxdWVyeS1zdHJpbmcnXG5cbmxldCBqc29ucENudCA9IDBcbmNvbnN0IEVSUk9SX1NUQVRFID0gLTFcblxuZnVuY3Rpb24gX2pzb25wIChjb25maWcsIGNhbGxiYWNrLCBwcm9ncmVzc0NhbGxiYWNrKSB7XG4gIGNvbnN0IGNiTmFtZSA9ICdqc29ucF8nICsgKCsranNvbnBDbnQpXG4gIGxldCB1cmxcblxuICBpZiAoIWNvbmZpZy51cmwpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbaDUtcmVuZGVyXSBjb25maWcudXJsIHNob3VsZCBiZSBzZXQgaW4gX2pzb25wIGZvciBcXCdmZXRjaFxcJyBBUEkuJylcbiAgfVxuXG4gIGdsb2JhbFtjYk5hbWVdID0gKGZ1bmN0aW9uIChjYikge1xuICAgIHJldHVybiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgIG9rOiB0cnVlLFxuICAgICAgICBzdGF0dXNUZXh0OiAnT0snLFxuICAgICAgICBkYXRhOiByZXNwb25zZVxuICAgICAgfSlcbiAgICAgIGRlbGV0ZSBnbG9iYWxbY2JdXG4gICAgfVxuICB9KShjYk5hbWUpXG5cbiAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JylcbiAgdHJ5IHtcbiAgICB1cmwgPSBsaWIuaHR0cHVybChjb25maWcudXJsKVxuICB9XG4gIGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbaDUtcmVuZGVyXSBpbnZhbGlkIGNvbmZpZy51cmwgaW4gX2pzb25wIGZvciBcXCdmZXRjaFxcJyBBUEk6ICdcbiAgICAgICsgY29uZmlnLnVybClcbiAgfVxuICB1cmwucGFyYW1zLmNhbGxiYWNrID0gY2JOYW1lXG4gIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCdcbiAgc2NyaXB0LnNyYyA9IHVybC50b1N0cmluZygpXG4gIC8vIHNjcmlwdC5vbmVycm9yIGlzIG5vdCB3b3JraW5nIG9uIElFIG9yIHNhZmFyaS5cbiAgLy8gYnV0IHRoZXkgYXJlIG5vdCBjb25zaWRlcmVkIGhlcmUuXG4gIHNjcmlwdC5vbmVycm9yID0gKGZ1bmN0aW9uIChjYikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbaDUtcmVuZGVyXSB1bmV4cGVjdGVkIGVycm9yIGluIF9qc29ucCBmb3IgXFwnZmV0Y2hcXCcgQVBJJywgZXJyKVxuICAgICAgY2FsbGJhY2soe1xuICAgICAgICBzdGF0dXM6IEVSUk9SX1NUQVRFLFxuICAgICAgICBvazogZmFsc2UsXG4gICAgICAgIHN0YXR1c1RleHQ6ICcnLFxuICAgICAgICBkYXRhOiAnJ1xuICAgICAgfSlcbiAgICAgIGRlbGV0ZSBnbG9iYWxbY2JdXG4gICAgfVxuICB9KShjYk5hbWUpXG4gIGNvbnN0IGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdXG4gIGhlYWQuaW5zZXJ0QmVmb3JlKHNjcmlwdCwgbnVsbClcbn1cblxuZnVuY3Rpb24gX3hociAoY29uZmlnLCBjYWxsYmFjaywgcHJvZ3Jlc3NDYWxsYmFjaykge1xuICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICB4aHIucmVzcG9uc2VUeXBlID0gY29uZmlnLnR5cGVcbiAgeGhyLm9wZW4oY29uZmlnLm1ldGhvZCwgY29uZmlnLnVybCwgdHJ1ZSlcblxuICAvLyBjb3JzIGNvb2tpZSBzdXBwb3J0XG4gIGlmIChjb25maWcud2l0aENyZWRlbnRpYWxzID09PSB0cnVlKSB7XG4gICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWVcbiAgfVxuXG4gIGNvbnN0IGhlYWRlcnMgPSBjb25maWcuaGVhZGVycyB8fCB7fVxuICBmb3IgKGNvbnN0IGsgaW4gaGVhZGVycykge1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGssIGhlYWRlcnNba10pXG4gIH1cblxuICB4aHIub25sb2FkID0gZnVuY3Rpb24gKHJlcykge1xuICAgIGNhbGxiYWNrKHtcbiAgICAgIHN0YXR1czogeGhyLnN0YXR1cyxcbiAgICAgIG9rOiB4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwLFxuICAgICAgc3RhdHVzVGV4dDogeGhyLnN0YXR1c1RleHQsXG4gICAgICBkYXRhOiB4aHIucmVzcG9uc2UsXG4gICAgICBoZWFkZXJzOiB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkuc3BsaXQoJ1xcbicpXG4gICAgICAgIC5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwgaGVhZGVyU3RyKSB7XG4gICAgICAgICAgY29uc3QgaGVhZGVyQXJyID0gaGVhZGVyU3RyLm1hdGNoKC8oLispOiAoLispLylcbiAgICAgICAgICBpZiAoaGVhZGVyQXJyKSB7XG4gICAgICAgICAgICBvYmpbaGVhZGVyQXJyWzFdXSA9IGhlYWRlckFyclsyXVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2JqXG4gICAgICAgIH0sIHt9KVxuICAgIH0pXG4gIH1cblxuICBpZiAocHJvZ3Jlc3NDYWxsYmFjaykge1xuICAgIHhoci5vbnByb2dyZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHByb2dyZXNzQ2FsbGJhY2soe1xuICAgICAgICByZWFkeVN0YXRlOiB4aHIucmVhZHlTdGF0ZSxcbiAgICAgICAgc3RhdHVzOiB4aHIuc3RhdHVzLFxuICAgICAgICBsZW5ndGg6IGUubG9hZGVkLFxuICAgICAgICB0b3RhbDogZS50b3RhbCxcbiAgICAgICAgc3RhdHVzVGV4dDogeGhyLnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS5zcGxpdCgnXFxuJylcbiAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChvYmosIGhlYWRlclN0cikge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyQXJyID0gaGVhZGVyU3RyLm1hdGNoKC8oLispOiAoLispLylcbiAgICAgICAgICAgIGlmIChoZWFkZXJBcnIpIHtcbiAgICAgICAgICAgICAgb2JqW2hlYWRlckFyclsxXV0gPSBoZWFkZXJBcnJbMl1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvYmpcbiAgICAgICAgICB9LCB7fSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gdW5leHBlY3RlZCBlcnJvciBpbiBfeGhyIGZvciBcXCdmZXRjaFxcJyBBUEknLCBlcnIpXG4gICAgY2FsbGJhY2soe1xuICAgICAgc3RhdHVzOiBFUlJPUl9TVEFURSxcbiAgICAgIG9rOiBmYWxzZSxcbiAgICAgIHN0YXR1c1RleHQ6ICcnLFxuICAgICAgZGF0YTogJydcbiAgICB9KVxuICB9XG5cbiAgeGhyLnNlbmQoY29uZmlnLmJvZHkgfHwgbnVsbClcbn1cblxuY29uc3Qgc3RyZWFtID0ge1xuXG4gIC8qKlxuICAgKiBzZW5kSHR0cFxuICAgKiBAZGVwcmVjYXRlZFxuICAgKiBOb3RlOiBUaGlzIEFQSSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHN0cmVhbS5mZXRjaCBpbnN0ZWFkLlxuICAgKiBzZW5kIGEgaHR0cCByZXF1ZXN0IHRocm91Z2ggWEhSLlxuICAgKiBAcGFyYW0gIHtvYmp9IHBhcmFtc1xuICAgKiAgLSBtZXRob2Q6ICdHRVQnIHwgJ1BPU1QnIHwgJ1BVVCcgfCAnREVMRVRFJyB8ICdIRUFEJyB8ICdQQVRDSCcsXG4gICAqICAtIHVybDogdXJsIHJlcXVlc3RlZFxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IGNhbGxiYWNrSWRcbiAgICovXG4gIHNlbmRIdHRwOiBmdW5jdGlvbiAocGFyYW0sIGNhbGxiYWNrSWQpIHtcbiAgICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGFyYW0gPSBKU09OLnBhcnNlKHBhcmFtKVxuICAgICAgfVxuICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGFyYW0gIT09ICdvYmplY3QnIHx8ICFwYXJhbS51cmwpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKFxuICAgICAgICAnW2g1LXJlbmRlcl0gaW52YWxpZCBjb25maWcgb3IgaW52YWxpZCBjb25maWcudXJsIGZvciBzZW5kSHR0cCBBUEknKVxuICAgIH1cblxuICAgIGNvbnN0IHNlbmRlciA9IHRoaXMuc2VuZGVyXG4gICAgY29uc3QgbWV0aG9kID0gcGFyYW0ubWV0aG9kIHx8ICdHRVQnXG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICB4aHIub3BlbihtZXRob2QsIHBhcmFtLnVybCwgdHJ1ZSlcbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB0aGlzLnJlc3BvbnNlVGV4dClcbiAgICB9XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKCdbaDUtcmVuZGVyXSB1bmV4cGVjdGVkIGVycm9yIGluIHNlbmRIdHRwIEFQSScsIGVycm9yKVxuICAgICAgLy8gc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhcbiAgICAgIC8vICAgY2FsbGJhY2tJZCxcbiAgICAgIC8vICAgbmV3IEVycm9yKCd1bmV4cGVjdGVkIGVycm9yIGluIHNlbmRIdHRwIEFQSScpXG4gICAgICAvLyApXG4gICAgfVxuICAgIHhoci5zZW5kKClcbiAgfSxcblxuICAvKipcbiAgICogZmV0Y2hcbiAgICogdXNlIHN0cmVhbS5mZXRjaCB0byByZXF1ZXN0IGZvciBhIGpzb24gZmlsZSwgYSBwbGFpbiB0ZXh0IGZpbGUgb3JcbiAgICogYSBhcnJheWJ1ZmZlciBmb3IgYSBmaWxlIHN0cmVhbS4gKFlvdSBjYW4gdXNlIEJsb2IgYW5kIEZpbGVSZWFkZXJcbiAgICogQVBJIGltcGxlbWVudGVkIGJ5IG1vc3QgbW9kZXJuIGJyb3dzZXJzIHRvIHJlYWQgYSBhcnJheWJ1ZmZlci4pXG4gICAqIEBwYXJhbSAge29iamVjdH0gb3B0aW9ucyBjb25maWcgb3B0aW9uc1xuICAgKiAgIC0gbWV0aG9kOiAnR0VUJyB8ICdQT1NUJyB8ICdQVVQnIHwgJ0RFTEVURScgfCAnSEVBRCcgfCAnUEFUQ0gnXG4gICAqICAgLSBoZWFkZXJzIHtvYmp9XG4gICAqICAgLSB1cmwge3N0cmluZ31cbiAgICogICAtIG1vZGUge3N0cmluZ30gJ2NvcnMnIHwgJ25vLWNvcnMnIHwgJ3NhbWUtb3JpZ2luJyB8ICduYXZpZ2F0ZSdcbiAgICogICAtIHdpdGhDcmVkZW50aWFscyB7Ym9vbGVhbn1cbiAgICogICAtIGJvZHlcbiAgICogICAtIHR5cGUge3N0cmluZ30gJ2pzb24nIHwgJ2pzb25wJyB8ICd0ZXh0J1xuICAgKiBAcGFyYW0gIHtzdHJpbmd9IGNhbGxiYWNrSWRcbiAgICogQHBhcmFtICB7c3RyaW5nfSBwcm9ncmVzc0NhbGxiYWNrSWRcbiAgICovXG4gIGZldGNoOiBmdW5jdGlvbiAob3B0aW9ucywgY2FsbGJhY2tJZCwgcHJvZ3Jlc3NDYWxsYmFja0lkKSB7XG4gICAgY29uc3QgREVGQVVMVF9NRVRIT0QgPSAnR0VUJ1xuICAgIGNvbnN0IERFRkFVTFRfTU9ERSA9ICdjb3JzJ1xuICAgIGNvbnN0IERFRkFVTFRfVFlQRSA9ICd0ZXh0J1xuXG4gICAgY29uc3QgbWV0aG9kT3B0aW9ucyA9IFsnR0VUJywgJ1BPU1QnLCAnUFVUJywgJ0RFTEVURScsICdIRUFEJywgJ1BBVENIJ11cbiAgICBjb25zdCBtb2RlT3B0aW9ucyA9IFsnY29ycycsICduby1jb3JzJywgJ3NhbWUtb3JpZ2luJywgJ25hdmlnYXRlJ11cbiAgICBjb25zdCB0eXBlT3B0aW9ucyA9IFsndGV4dCcsICdqc29uJywgJ2pzb25wJywgJ2FycmF5YnVmZmVyJ11cblxuICAgIC8vIGNvbnN0IGZhbGxiYWNrID0gZmFsc2UgIC8vIGZhbGxiYWNrIGZyb20gJ2ZldGNoJyBBUEkgdG8gWEhSLlxuICAgIGNvbnN0IHNlbmRlciA9IHRoaXMuc2VuZGVyXG5cbiAgICBjb25zdCBjb25maWcgPSB1dGlscy5leHRlbmQoe30sIG9wdGlvbnMpXG5cbiAgICAvLyB2YWxpZGF0ZSBvcHRpb25zLm1ldGhvZFxuICAgIGlmICh0eXBlb2YgY29uZmlnLm1ldGhvZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbmZpZy5tZXRob2QgPSBERUZBVUxUX01FVEhPRFxuICAgICAgY29uc29sZS53YXJuKCdbaDUtcmVuZGVyXSBvcHRpb25zLm1ldGhvZCBmb3IgXFwnZmV0Y2hcXCcgQVBJIGhhcyBiZWVuIHNldCB0byAnXG4gICAgICAgICsgJ2RlZmF1bHQgdmFsdWUgXFwnJyArIGNvbmZpZy5tZXRob2QgKyAnXFwnJylcbiAgICB9XG4gICAgZWxzZSBpZiAobWV0aG9kT3B0aW9ucy5pbmRleE9mKChjb25maWcubWV0aG9kICsgJycpXG4gICAgICAgIC50b1VwcGVyQ2FzZSgpKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKCdbaDUtcmVuZGVyXSBvcHRpb25zLm1ldGhvZCBcXCcnXG4gICAgICAgICsgY29uZmlnLm1ldGhvZFxuICAgICAgICArICdcXCcgZm9yIFxcJ2ZldGNoXFwnIEFQSSBzaG91bGQgYmUgb25lIG9mICdcbiAgICAgICAgKyBtZXRob2RPcHRpb25zICsgJy4nKVxuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIG9wdGlvbnMudXJsXG4gICAgaWYgKCFjb25maWcudXJsKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gb3B0aW9ucy51cmwgc2hvdWxkIGJlIHNldCBmb3IgXFwnZmV0Y2hcXCcgQVBJLicpXG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUgYm9keSBjb250ZW50IGZvciBtZXRob2QgJ0dFVCcuXG4gICAgaWYgKGNvbmZpZy5tZXRob2QudG9VcHBlckNhc2UoKSA9PT0gJ0dFVCcpIHtcbiAgICAgIGxldCBib2R5ID0gY29uZmlnLmJvZHlcbiAgICAgIGlmICh1dGlscy5pc1BsYWluT2JqZWN0KGJvZHkpKSB7XG4gICAgICAgIGJvZHkgPSBxcy5zdHJpbmdpZnkoYm9keSlcbiAgICAgIH1cbiAgICAgIGxldCB1cmwgPSBjb25maWcudXJsXG4gICAgICBsZXQgaGFzaElkeCA9IHVybC5pbmRleE9mKCcjJylcbiAgICAgIGhhc2hJZHggPD0gLTEgJiYgKGhhc2hJZHggPSB1cmwubGVuZ3RoKVxuICAgICAgbGV0IGhhc2ggPSB1cmwuc3Vic3RyKGhhc2hJZHgpXG4gICAgICBpZiAoaGFzaCAmJiBoYXNoWzBdID09PSAnIycpIHtcbiAgICAgICAgaGFzaCA9IGhhc2guc3Vic3RyKDEpXG4gICAgICB9XG4gICAgICB1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGhhc2hJZHgpXG4gICAgICBpZiAoYm9keSkge1xuICAgICAgICB1cmwgKz0gKGNvbmZpZy51cmwuaW5kZXhPZignPycpIDw9IC0xID8gJz8nIDogJyYnKSArIGJvZHlcbiAgICAgIH1cbiAgICAgIHVybCArPSAnIycgKyBoYXNoXG4gICAgICBjb25maWcudXJsID0gdXJsXG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUgb3B0aW9ucy5tb2RlXG4gICAgaWYgKHR5cGVvZiBjb25maWcubW9kZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbmZpZy5tb2RlID0gREVGQVVMVF9NT0RFXG4gICAgfVxuICAgIGVsc2UgaWYgKG1vZGVPcHRpb25zLmluZGV4T2YoKGNvbmZpZy5tb2RlICsgJycpLnRvTG93ZXJDYXNlKCkpID09PSAtMSkge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1toNS1yZW5kZXJdIG9wdGlvbnMubW9kZSBcXCcnXG4gICAgICAgICsgY29uZmlnLm1vZGVcbiAgICAgICAgKyAnXFwnIGZvciBcXCdmZXRjaFxcJyBBUEkgc2hvdWxkIGJlIG9uZSBvZiAnXG4gICAgICAgICsgbW9kZU9wdGlvbnMgKyAnLicpXG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUgb3B0aW9ucy50eXBlXG4gICAgaWYgKHR5cGVvZiBjb25maWcudHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbmZpZy50eXBlID0gREVGQVVMVF9UWVBFXG4gICAgICBjb25zb2xlLndhcm4oJ1toNS1yZW5kZXJdIG9wdGlvbnMudHlwZSBmb3IgXFwnZmV0Y2hcXCcgQVBJIGhhcyBiZWVuIHNldCB0byAnXG4gICAgICAgICsgJ2RlZmF1bHQgdmFsdWUgXFwnJyArIGNvbmZpZy50eXBlICsgJ1xcJy4nKVxuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlT3B0aW9ucy5pbmRleE9mKChjb25maWcudHlwZSArICcnKS50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKCdbaDUtcmVuZGVyXSBvcHRpb25zLnR5cGUgXFwnJ1xuICAgICAgICAgICsgY29uZmlnLnR5cGVcbiAgICAgICAgICArICdcXCcgZm9yIFxcJ2ZldGNoXFwnIEFQSSBzaG91bGQgYmUgb25lIG9mICdcbiAgICAgICAgICArIHR5cGVPcHRpb25zICsgJy4nKVxuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIG9wdGlvbnMuaGVhZGVyc1xuICAgIGNvbmZpZy5oZWFkZXJzID0gY29uZmlnLmhlYWRlcnMgfHwge31cbiAgICBpZiAoIXV0aWxzLmlzUGxhaW5PYmplY3QoY29uZmlnLmhlYWRlcnMpKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gb3B0aW9ucy5oZWFkZXJzIHNob3VsZCBiZSBhIHBsYWluIG9iamVjdCcpXG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUgb3B0aW9ucy50aW1lb3V0XG4gICAgY29uZmlnLnRpbWVvdXQgPSBwYXJzZUludChjb25maWcudGltZW91dCwgMTApIHx8IDI1MDBcblxuICAgIGNvbnN0IF9jYWxsQXJncyA9IFtjb25maWcsIGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIHNlbmRlci5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2tJZCwgcmVzKVxuICAgIH1dXG4gICAgaWYgKHByb2dyZXNzQ2FsbGJhY2tJZCkge1xuICAgICAgX2NhbGxBcmdzLnB1c2goZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAvLyBTZXQgJ2tlZXBBbGl2ZScgdG8gdHJ1ZSBmb3Igc2VuZGluZyBjb250aW51b3VzIGNhbGxiYWNrc1xuICAgICAgICBzZW5kZXIucGVyZm9ybUNhbGxiYWNrKHByb2dyZXNzQ2FsbGJhY2tJZCwgcmVzLCB0cnVlKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnR5cGUgPT09ICdqc29ucCcpIHtcbiAgICAgIF9qc29ucC5hcHBseSh0aGlzLCBfY2FsbEFyZ3MpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgX3hoci5hcHBseSh0aGlzLCBfY2FsbEFyZ3MpXG4gICAgfVxuICB9XG5cbn1cblxuY29uc3QgbWV0YSA9IHtcbiAgc3RyZWFtOiBbe1xuICAgIG5hbWU6ICdzZW5kSHR0cCcsXG4gICAgYXJnczogWydvYmplY3QnLCAnZnVuY3Rpb24nXVxuICB9LCB7XG4gICAgbmFtZTogJ2ZldGNoJyxcbiAgICBhcmdzOiBbJ29iamVjdCcsICdmdW5jdGlvbicsICdmdW5jdGlvbiddXG4gIH1dXG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogZnVuY3Rpb24gKFdlZXgpIHtcbiAgICB1dGlscyA9IFdlZXgudXRpbHNcbiAgICBXZWV4LnJlZ2lzdGVyQXBpTW9kdWxlKCdzdHJlYW0nLCBzdHJlYW0sIG1ldGEpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuXG5BVUNUSU9OOlxudGFza1F1ZXVlXG5DbGlwYm9hcmQuc2V0U3RyaW5nKCkgIE5PVyBub3Qgd29ya3MsIGZhY2luZyB0byB1c2VyLWFjdCBsb3NlIG9mIHRhc2tRdWV1ZS5cblxud29ya3MgaW4gQ2hyb21lIEZpcmVmb3ggT3BlcmEuIGJ1dCBub3QgaW4gU2FmYXJpLlxuQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRG9jdW1lbnQvZXhlY0NvbW1hbmQjQnJvd3Nlcl9jb21wYXRpYmlsaXR5XG5cbkNsaXBib2FyZC5nZXRTdHJpbmcoKSB1bmltcGxlbWVudGVkLiBUaGVyZSBpcyBubyBlYXN5IHdheSB0byBkbyBwYXN0ZSBmcm9tIGNsaXBib2FyZCB0byBqcyB2YXJpYWJsZS5cblxuU28gbG9vayBvdXQgeW91ciBhcHAgYmVoYXZpb3IsIHdoZW4gZG93bmdyYWRlIHRvIGh0bWw1IHJlbmRlci5cbkFueSBpZGVhIGlzIHdlbGNvbWUuXG4qKi9cblxuY29uc3QgV0VFWF9DTElQQk9BUkRfSUQgPSAnX193ZWV4X2NsaXBib2FyZF9pZF9fJ1xuXG5jb25zdCBjbGlwYm9hcmQgPSB7XG5cbiAgZ2V0U3RyaW5nOiBmdW5jdGlvbiAoY2FsbGJhY2tJZCkge1xuICAgIC8vIG5vdCBzdXBwb3J0ZWQgaW4gaHRtbDVcbiAgICBjb25zb2xlLmxvZygnY2xpcGJvYXJkLmdldFN0cmluZygpIGlzIG5vdCBzdXBwb3J0ZWQgbm93LicpXG4gIH0sXG5cbiAgc2V0U3RyaW5nOiBmdW5jdGlvbiAodGV4dCkge1xuICAgIC8vIG5vdCBzdXBwb3J0IHNhZmFyaVxuICAgIGlmICh0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycgJiYgdGV4dCAhPT0gJycgJiYgZG9jdW1lbnQuZXhlY0NvbW1hbmQpIHtcbiAgICAgIGNvbnN0IHRlbXBJbnB1dCA9IGVsZW1lbnQoKVxuICAgICAgdGVtcElucHV0LnZhbHVlID0gdGV4dFxuXG4gICAgICB0ZW1wSW5wdXQuc2VsZWN0KClcbiAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5JylcbiAgICAgIC8vIHZhciBvdXQgPSBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpO1xuICAgICAgLy8gY29uc29sZS5sb2coXCJleGVjQ29tbWFuZCBvdXQgaXMgXCIgKyBvdXQpO1xuICAgICAgdGVtcElucHV0LnZhbHVlID0gJydcbiAgICAgIHRlbXBJbnB1dC5ibHVyKClcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygnb25seSBzdXBwb3J0IHN0cmluZyBpbnB1dCBub3cnKVxuICAgIH1cbiAgfVxuXG59XG5cbmZ1bmN0aW9uIGVsZW1lbnQgKCkge1xuICBsZXQgdGVtcElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoV0VFWF9DTElQQk9BUkRfSUQpXG4gIGlmICghdGVtcElucHV0KSB7XG4gICAgdGVtcElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxuICAgIHRlbXBJbnB1dC5zZXRBdHRyaWJ1dGUoJ2lkJywgV0VFWF9DTElQQk9BUkRfSUQpXG4gICAgdGVtcElucHV0LnN0eWxlLmNzc1RleHQgPSAnaGVpZ2h0OjFweDt3aWR0aDoxcHg7Ym9yZGVyOm5vbmU7J1xuICAgIC8vIHRlbXBJbnB1dC5zdHlsZS5jc3NUZXh0ID0gXCJoZWlnaHQ6NDBweDt3aWR0aDozMDBweDtib3JkZXI6c29saWQ7XCJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRlbXBJbnB1dClcbiAgfVxuICByZXR1cm4gdGVtcElucHV0XG59XG5cbmNvbnN0IG1ldGEgPSB7XG4gIGNsaXBib2FyZDogW3tcbiAgICBuYW1lOiAnZ2V0U3RyaW5nJyxcbiAgICBhcmdzOiBbJ2Z1bmN0aW9uJ11cbiAgfSwge1xuICAgIG5hbWU6ICdzZXRTdHJpbmcnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJ11cbiAgfV1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBmdW5jdGlvbiAoV2VleCkge1xuICAgIFdlZXgucmVnaXN0ZXJBcGlNb2R1bGUoJ2NsaXBib2FyZCcsIGNsaXBib2FyZCwgbWV0YSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuY29uc3QgZXZlbnQgPSB7XG4gIC8qKlxuICAgKiBvcGVuVXJsXG4gICAqIEBwYXJhbSAge3N0cmluZ30gdXJsXG4gICAqL1xuICBvcGVuVVJMOiBmdW5jdGlvbiAodXJsKSB7XG4gICAgbG9jYXRpb24uaHJlZiA9IHVybFxuICB9XG5cbn1cblxuY29uc3QgbWV0YSA9IHtcbiAgZXZlbnQ6IFt7XG4gICAgbmFtZTogJ29wZW5VUkwnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJ11cbiAgfV1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBmdW5jdGlvbiAoV2VleCkge1xuICAgIFdlZXgucmVnaXN0ZXJBcGlNb2R1bGUoJ2V2ZW50JywgZXZlbnQsIG1ldGEpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuY29uc3QgdXRpbHMgPSB7fVxubGV0IGVuZEV2ZW50XG5sZXQgc3R5bGVOYW1lXG5cbmNvbnN0IEVWRU5UX05BTUVfTUFQID0ge1xuICB0cmFuc2l0aW9uOiAndHJhbnNpdGlvbmVuZCcsXG4gIFdlYmtpdFRyYW5zaXRpb246ICd3ZWJraXRUcmFuc2l0aW9uRW5kJyxcbiAgTW96VHJhbnNpdGlvbjogJ21velRyYW5zaXRpb25FbmQnLFxuICBPVHJhbnNpdGlvbjogJ29UcmFuc2l0aW9uRW5kJyxcbiAgbXNUcmFuc2l0aW9uOiAnTVNUcmFuc2l0aW9uRW5kJ1xufVxuXG5mdW5jdGlvbiBkZXRlY3RFdmVudHMgKCkge1xuICBjb25zdCB0ZXN0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBjb25zdCBzdHlsZSA9IHRlc3RFbC5zdHlsZVxuICBmb3IgKGNvbnN0IG5hbWUgaW4gRVZFTlRfTkFNRV9NQVApIHtcbiAgICBpZiAobmFtZSBpbiBzdHlsZSkge1xuICAgICAgZW5kRXZlbnQgPSBFVkVOVF9OQU1FX01BUFtuYW1lXVxuICAgICAgc3R5bGVOYW1lID0gbmFtZVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbn1cblxuZGV0ZWN0RXZlbnRzKClcblxuZnVuY3Rpb24gdHJhbnNpdGlvbk9uY2UgKHZub2RlLCBjb25maWcsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IHtcbiAgICBuZXh0RnJhbWUsXG4gICAgdG9DU1NUZXh0LFxuICAgIGF1dG9QcmVmaXgsXG4gICAgY2FtZWxpemVLZXlzLFxuICAgIG5vcm1hbGl6ZVN0eWxlLFxuICAgIGlzQXJyYXlcbiAgfSA9IHV0aWxzXG5cbiAgaWYgKGlzQXJyYXkodm5vZGUpKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1t2dWUtcmVuZGVyXSB0aGUgcmVmIHBhc3NlZCB0byBhbmltYXRpb24udHJhbnNpdGlvbk9uY2UgaXMgYSBhcnJheS4nKVxuICAgIH1cbiAgICB2bm9kZSA9IHZub2RlWzBdXG4gIH1cblxuICBjb25zdCBkdXJhdGlvbiA9IGNvbmZpZy5kdXJhdGlvbiB8fCAwIC8vIG1zXG4gIGNvbnN0IHRpbWluZyA9IGNvbmZpZy50aW1pbmdGdW5jdGlvbiB8fCAnbGluZWFyJ1xuICBjb25zdCBkZWxheSA9IGNvbmZpZy5kZWxheSB8fCAwICAvLyBtc1xuXG4gIC8vIFRPRE86IHBhcnNlIHRyYW5zaXRpb24gcHJvcGVydGllc1xuICBjb25zdCB0cmFuc2l0aW9uVmFsdWUgPSBgYWxsICR7ZHVyYXRpb259bXMgJHt0aW1pbmd9ICR7ZGVsYXl9bXNgXG5cbiAgY29uc3QgZG9tID0gdm5vZGUuJGVsXG4gIC8vIHRyaWdnZXIgaW1hZ2UgbGF6eWxvYWRpbmcgYnkgZm9yY2UuXG4gIGRvbSAmJiB3ZWV4LnV0aWxzLmZpcmVMYXp5bG9hZChkb20sIHRydWUpXG5cbiAgY29uc3QgdHJhbnNpdGlvbkVuZEhhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudCAmJiBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgIGlmIChlbmRFdmVudCkge1xuICAgICAgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoZW5kRXZlbnQsIHRyYW5zaXRpb25FbmRIYW5kbGVyKVxuICAgICAgZG9tLnN0eWxlW3N0eWxlTmFtZV0gPSAnJ1xuICAgIH1cbiAgICBjYWxsYmFjaygpXG4gIH1cbiAgaWYgKGVuZEV2ZW50KSB7XG4gICAgZG9tLnN0eWxlW3N0eWxlTmFtZV0gPSB0cmFuc2l0aW9uVmFsdWVcbiAgICBkb20uYWRkRXZlbnRMaXN0ZW5lcihlbmRFdmVudCwgdHJhbnNpdGlvbkVuZEhhbmRsZXIpXG4gIH1cbiAgbmV4dEZyYW1lKCgpID0+IHtcbiAgICBkb20uc3R5bGUuY3NzVGV4dFxuICAgICAgKz0gdG9DU1NUZXh0KGF1dG9QcmVmaXgobm9ybWFsaXplU3R5bGUoY2FtZWxpemVLZXlzKGNvbmZpZy5zdHlsZXMpKSkgfHwge30pXG4gIH0pXG59XG5cbmNvbnN0IGFuaW1hdGlvbiA9IHtcbiAgLyoqXG4gICAqIHRyYW5zaXRpb25cbiAgICogQHBhcmFtICB7U3RyaW5nfSB2bm9kZVxuICAgKiBAcGFyYW0gIHtPYmplY3R9IGNvbmZpZ1xuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGNhbGxiYWNrXG4gICAqL1xuICB0cmFuc2l0aW9uICh2bm9kZSwgY29uZmlnLCBjYWxsYmFjaykge1xuICAgIGlmICghY29uZmlnLnN0eWxlcykgeyByZXR1cm4gfVxuICAgIHJldHVybiB0cmFuc2l0aW9uT25jZSh2bm9kZSwgY29uZmlnLCAoKSA9PiB7XG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKHdlZXgpIHtcbiAgICBjb25zdCBleHRlbmRLZXlzID0gd2VleC51dGlscy5leHRlbmRLZXlzXG4gICAgZXh0ZW5kS2V5cyh1dGlscywgd2VleC51dGlscywgW1xuICAgICAgJ25leHRGcmFtZScsXG4gICAgICAndG9DU1NUZXh0JyxcbiAgICAgICdhdXRvUHJlZml4JyxcbiAgICAgICdjYW1lbGl6ZUtleXMnLFxuICAgICAgJ25vcm1hbGl6ZVN0eWxlJyxcbiAgICAgICdpc0FycmF5J1xuICAgIF0pXG5cbiAgICB3ZWV4LnJlZ2lzdGVyTW9kdWxlKCdhbmltYXRpb24nLCBhbmltYXRpb24pXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IGNvbmZpZyBmcm9tICcuLi9jb25maWcnXG5jb25zdCB1dGlscyA9IHt9XG5cbmZ1bmN0aW9uIGdldFBhcmVudFNjcm9sbGVyICh2bm9kZSkge1xuICBpZiAoIXZub2RlKSByZXR1cm4gbnVsbFxuICBjb25zdCB2bSA9IHZub2RlLiRlbFxuICA/IHZub2RlIDogdm5vZGUuZWxtXG4gID8gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgfHwgdm5vZGUuY29udGV4dCA6IG51bGxcbiAgaWYgKCF2bSkgcmV0dXJuIG51bGxcbiAgY29uc3QgdHlwZSA9IHZtLiRlbCAmJiB2bS4kZWwuZ2V0QXR0cmlidXRlKCd3ZWV4LXR5cGUnKVxuICBpZiAoY29uZmlnLnNjcm9sbGFibGVUeXBlcy5pbmRleE9mKHR5cGUpID4gLTEpIHtcbiAgICByZXR1cm4gdm1cbiAgfVxuICByZXR1cm4gZ2V0UGFyZW50U2Nyb2xsZXIodm0uJHBhcmVudClcbn1cblxuZnVuY3Rpb24gbm93ICgpIHtcbiAgY29uc3Qgbm93ID0gd2luZG93LnBlcmZvcm1hbmNlICYmIHdpbmRvdy5wZXJmb3JtYW5jZS5ub3dcbiAgPyB3aW5kb3cucGVyZm9ybWFuY2Uubm93LmJpbmQod2luZG93LnBlcmZvcm1hbmNlKSA6IERhdGUubm93XG4gIHJldHVybiBub3coKVxufVxuXG5mdW5jdGlvbiBzY3JvbGxFbGVtZW50IChkU3VmZml4LCBwb3NpdGlvbikge1xuICBpZiAoKHRoaXMgPT09IGRvY3VtZW50LmJvZHkpIHx8ICh0aGlzID09PSB3aW5kb3cpXG4gICAgJiYgd2luZG93LnNjcm9sbFRvKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5zY3JvbGxUbygwLCBwb3NpdGlvbilcbiAgfVxuICB0aGlzW2BzY3JvbGwke2RTdWZmaXh9YF0gPSBwb3NpdGlvblxufVxuLyoqXG4gKiBzZWxmIGludm9rZWQgZnVuY3Rpb24gdGhhdCwgZ2l2ZW4gYSBjb250ZXh0LCBzdGVwcyB0aHJvdWdoIHNjcm9sbGluZ1xuICogQG1ldGhvZCBzdGVwXG4gKiBAcGFyYW0ge09iamVjdH0gY29udGV4dFxuICovXG5mdW5jdGlvbiBzdGVwIChjb250ZXh0KSB7XG4gIC8vIGNhbGwgbWV0aG9kIGFnYWluIG9uIG5leHQgYXZhaWxhYmxlIGZyYW1lXG4gIGNvbnRleHQuZnJhbWUgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHN0ZXAuYmluZCh3aW5kb3csIGNvbnRleHQpKVxuICBjb25zdCB0aW1lID0gbm93KClcbiAgbGV0IGVsYXBzZWQgPSAodGltZSAtIGNvbnRleHQuc3RhcnRUaW1lKSAvIDQ2OFxuICAvLyBhdm9pZCBlbGFwc2VkIHRpbWVzIGhpZ2hlciB0aGFuIG9uZVxuICBlbGFwc2VkID0gZWxhcHNlZCA+IDEgPyAxIDogZWxhcHNlZFxuICAvLyBhcHBseSBlYXNpbmcgdG8gZWxhcHNlZCB0aW1lXG4gIGNvbnN0IHZhbHVlID0gZWFzZShlbGFwc2VkKVxuICBjb25zdCBjdXJyZW50UG9zaXRpb24gPSBjb250ZXh0LnN0YXJ0UG9zaXRpb24gKyAoY29udGV4dC5wb3NpdGlvbiAtIGNvbnRleHQuc3RhcnRQb3NpdGlvbikgKiB2YWx1ZVxuICBjb250ZXh0Lm1ldGhvZC5jYWxsKGNvbnRleHQuc2Nyb2xsYWJsZSwgY29udGV4dC5kU3VmZml4LCBjdXJyZW50UG9zaXRpb24pXG4gIC8vIHJldHVybiB3aGVuIGVuZCBwb2ludHMgaGF2ZSBiZWVuIHJlYWNoZWRcbiAgLyoqXG4gICAgKiBOT1RFOiBzaG91bGQgdXNlIH5+IHRvIHBhcnNlIHBvc2l0aW9uIG51bWJlciBpbnRvIGludGVnZXIuIE90aGVyd2lzZVxuICAgICogdGhpcyB0d28gZmxvYXQgbnVtYmVycyBtYXliZSBoYXZlIGEgc2xpY2VseSBsaXR0bGUgZGlmZmVyZW5jZSwgd2hpY2hcbiAgICAqIHdpbGwgY2F1c2UgdGhpcyBmdW5jdGlvbiBuZXZlciB0byBzdG9wLlxuICAqL1xuICBpZiAofn5jdXJyZW50UG9zaXRpb24gPT09IH5+Y29udGV4dC5wb3NpdGlvbikge1xuICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShjb250ZXh0LmZyYW1lKVxuICAgIHJldHVyblxuICB9XG59XG4vKipcbiAqIHJldHVybnMgcmVzdWx0IG9mIGFwcGx5aW5nIGVhc2UgbWF0aCBmdW5jdGlvbiB0byBhIG51bWJlclxuICogQG1ldGhvZCBlYXNlXG4gKiBAcGFyYW0ge051bWJlcn0ga1xuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuZnVuY3Rpb24gZWFzZSAoaykge1xuICByZXR1cm4gMC41ICogKDEgLSBNYXRoLmNvcyhNYXRoLlBJICogaykpXG59XG5jb25zdCBkb20gPSB7XG4gIC8qKlxuICAgKiBzY3JvbGxUb0VsZW1lbnRcbiAgICogQHBhcmFtICB7Vm5vZGUgfCBWQ29tcG9uZW50fSB2bm9kZVxuICAgKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnMge29mZnNldDpOdW1iZXJ9XG4gICAqICAgcHM6IHNjcm9sbC10byBoYXMgJ2Vhc2UnIGFuZCAnZHVyYXRpb24nKG1zKSBhcyBvcHRpb25zLlxuICAgKi9cbiAgc2Nyb2xsVG9FbGVtZW50OiBmdW5jdGlvbiAodm5vZGUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBpc0FycmF5XG4gICAgfSA9IHV0aWxzXG4gICAgaWYgKGlzQXJyYXkodm5vZGUpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbdnVlLXJlbmRlcl0gdGhlIHJlZiBwYXNzZWQgdG8gYW5pbWF0aW9uLnRyYW5zaXRpb25PbmNlIGlzIGEgYXJyYXkuJylcbiAgICAgIH1cbiAgICAgIHZub2RlID0gdm5vZGVbMF1cbiAgICB9XG4gICAgY29uc3Qgc2Nyb2xsZXIgPSBnZXRQYXJlbnRTY3JvbGxlcih2bm9kZSlcbiAgICBjb25zdCBzY3JvbGxEaXJlY3Rpb24gPSBzY3JvbGxlciAmJiBzY3JvbGxlci5zY3JvbGxEaXJlY3Rpb24gfHwgJ3ZlcnRpY2FsJ1xuICAgIGNvbnN0IGlzV2luZG93ID0gIXNjcm9sbGVyXG4gICAgY29uc3QgY3QgPSBpc1dpbmRvdyA/IGRvY3VtZW50LmJvZHkgOiBzY3JvbGxlci4kZWxcbiAgICBjb25zdCBlbCA9IHZub2RlLiRlbCB8fCB2bm9kZS5lbG1cbiAgICBpZiAoY3QgJiYgZWwpIHtcbiAgICAgIC8vIGlmIGl0J3MgYSBsaXN0LCB0aGVuIHRoZSBsaXN0Vm5vZGUuc2Nyb2xsRGlyZWN0aW9uIGlzIHVuZGVmaW5lZC4ganVzdFxuICAgICAgLy8gYXNzdW0gaXQgaXMgdGhlIGRlZmF1bHQgdmFsdWUgJ3ZlcnRpY2FsJy5cbiAgICAgIGNvbnN0IGRTdWZmaXggPSAoe1xuICAgICAgICBob3Jpem9udGFsOiAnTGVmdCcsXG4gICAgICAgIHZlcnRpY2FsOiAnVG9wJ1xuICAgICAgfSlbc2Nyb2xsRGlyZWN0aW9uXVxuICAgICAgY29uc3QgY3RSZWN0ID0gY3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgIGxldCBlbFJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgLyoqXG4gICAgICAgICogaWYgaXQncyBhIHdhdGVyZmFsbCwgYW5kIHlvdSB3YW50IHRvIHNjcm9sbCB0byBhIGhlYWRlciwgdGhlbiBqdXN0XG4gICAgICAgICogc2Nyb2xsIHRvIHRoZSB0b3AuXG4gICAgICAqL1xuICAgICAgaWYgKHNjcm9sbGVyICYmIHNjcm9sbGVyLndlZXhUeXBlID09PSAnd2F0ZXJmYWxsJyAmJiBzY3JvbGxlci5faGVhZGVycyAmJiBzY3JvbGxlci5faGVhZGVycy5pbmRleE9mKHZub2RlLiR2bm9kZSB8fCB2bm9kZSkgPiAtMSkge1xuICAgICAgICAvLyBpdCdzIGluIHdhdGVyZmFsbC4ganVzdCBzY3JvbGwgdG8gdGhlIHRvcC5cbiAgICAgICAgZWxSZWN0ID0gY3QuZmlyc3RFbGVtZW50Q2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRpciA9IGRTdWZmaXgudG9Mb3dlckNhc2UoKVxuICAgICAgbGV0IG9mZnNldCA9IChpc1dpbmRvdyA/IDAgOiBjdFtgc2Nyb2xsJHtkU3VmZml4fWBdKSArIGVsUmVjdFtkaXJdIC0gY3RSZWN0W2Rpcl1cbiAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgIG9mZnNldCArPSBvcHRpb25zLm9mZnNldCAmJiBvcHRpb25zLm9mZnNldCAqIHdlZXguY29uZmlnLmVudi5zY2FsZSB8fCAwXG4gICAgICAgIC8vIG9mZnNldCAqPSB3ZWV4LmNvbmZpZy5lbnYuc2NhbGUgLyogYWRhcHQgb2Zmc2V0IHRvIGRpZmZlcmVudCBzY3JlZW4gc2NhbGVzLiAqL1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbVnVlIFJlbmRlcl0gVGhlIHNlY29uZCBwYXJhbWV0ZXIgb2YgXCJzY3JvbGxUb0VsZW1lbnRcIiBpcyByZXF1aXJlZCwgJ1xuICAgICAgICArICdvdGhlcndpc2UgaXQgbWF5IG5vdCB3b3JrcyB3ZWxsIG9uIG5hdGl2ZS4nKVxuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5hbmltYXRlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHNjcm9sbEVsZW1lbnQuY2FsbChjdCwgZFN1ZmZpeCwgb2Zmc2V0KVxuICAgICAgfVxuICAgICAgc3RlcCh7XG4gICAgICAgIHNjcm9sbGFibGU6IGN0LFxuICAgICAgICBzdGFydFRpbWU6IG5vdygpLFxuICAgICAgICBmcmFtZTogbnVsbCxcbiAgICAgICAgc3RhcnRQb3NpdGlvbjogaXNXaW5kb3cgPyB3aW5kb3cucGFnZVlPZmZzZXQgOiBjdFtgc2Nyb2xsJHtkU3VmZml4fWBdLFxuICAgICAgICBwb3NpdGlvbjogb2Zmc2V0LFxuICAgICAgICBtZXRob2Q6IHNjcm9sbEVsZW1lbnQsXG4gICAgICAgIGRTdWZmaXg6IGRTdWZmaXhcbiAgICAgIH0pXG4gICAgfVxuICB9LFxuICAvKipcbiAgICogZ2V0Q29tcG9uZW50UmVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gdm5vZGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIGdldENvbXBvbmVudFJlY3Q6IGZ1bmN0aW9uICh2bm9kZSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCB7XG4gICAgICBpc0FycmF5XG4gICAgfSA9IHV0aWxzXG4gICAgaWYgKGlzQXJyYXkodm5vZGUpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbdnVlLXJlbmRlcl0gdGhlIHJlZiBwYXNzZWQgdG8gYW5pbWF0aW9uLnRyYW5zaXRpb25PbmNlIGlzIGEgYXJyYXkuJylcbiAgICAgIH1cbiAgICAgIHZub2RlID0gdm5vZGVbMF1cbiAgICB9XG4gICAgY29uc3Qgc2NhbGUgPSB3aW5kb3cud2VleC5jb25maWcuZW52LnNjYWxlXG4gICAgY29uc3QgaW5mbyA9IHtcbiAgICAgIHJlc3VsdDogZmFsc2VcbiAgICB9XG4gICAgY29uc3QgcmVjdEtleXMgPSBbJ3dpZHRoJywgJ2hlaWdodCcsICd0b3AnLCAnYm90dG9tJywgJ2xlZnQnLCAncmlnaHQnXVxuXG4gICAgZnVuY3Rpb24gcmVjYWxjIChyZWN0KSB7XG4gICAgICBjb25zdCByZXMgPSB7fVxuICAgICAgcmVjdEtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAocmVjdFtrZXldKSB7XG4gICAgICAgICAgcmVzW2tleV0gPSByZWN0W2tleV0gLyBzY2FsZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgcmV0dXJuIHJlc1xuICAgIH1cbiAgICBpZiAodm5vZGUgJiYgdm5vZGUgPT09ICd2aWV3cG9ydCcpIHtcbiAgICAgIGluZm8ucmVzdWx0ID0gdHJ1ZVxuICAgICAgaW5mby5zaXplID0gcmVjYWxjKHtcbiAgICAgICAgd2lkdGg6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LFxuICAgICAgICB0b3A6IDAsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIHJpZ2h0OiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsXG4gICAgICAgIGJvdHRvbTogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodFxuICAgICAgfSlcbiAgICAgIGluZm8uY29udGVudFNpemUgPSByZWNhbGMoe1xuICAgICAgICB3aWR0aDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldFdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHRcbiAgICAgIH0pXG4gICAgfVxuICAgIGVsc2UgaWYgKHZub2RlICYmIHZub2RlLiRlbCkge1xuICAgICAgaW5mby5yZXN1bHQgPSB0cnVlXG4gICAgICBpbmZvLnNpemUgPSByZWNhbGModm5vZGUuJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKVxuICAgICAgaWYgKHZub2RlLiRyZWZzLmlubmVyKSB7XG4gICAgICAgIGluZm8uY29udGVudFNpemUgPSByZWNhbGMoe1xuICAgICAgICAgIHdpZHRoOiB2bm9kZS4kcmVmcy5pbm5lci5vZmZzZXRXaWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHZub2RlLiRyZWZzLmlubmVyLm9mZnNldEhlaWdodFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGluZm8uY29udGVudFNpemUgPSByZWNhbGMoe1xuICAgICAgICAgIHdpZHRoOiB2bm9kZS4kZWwub2Zmc2V0V2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiB2bm9kZS4kZWwub2Zmc2V0SGVpZ2h0XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2UgPSBpbmZvLnJlc3VsdCA/IGluZm8gOiB7XG4gICAgICByZXN1bHQ6IGZhbHNlLFxuICAgICAgZXJyTXNnOiAnSWxsZWdhbCBwYXJhbWV0ZXInXG4gICAgfVxuICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKG1lc3NhZ2UpXG4gICAgcmV0dXJuIG1lc3NhZ2VcbiAgfSxcbiAgLyoqXG4gICAqIGZvciBhZGRpbmcgZm9udEZhY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBmb250RmFjZVxuICAgKiBAcGFyYW0ge29iamVjdH0gc3R5bGVzIHJ1bGVzXG4gICAqL1xuICBhZGRSdWxlOiBmdW5jdGlvbiAoa2V5LCBzdHlsZXMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjYW1lbFRvS2ViYWIsXG4gICAgICBhcHBlbmRDc3NcbiAgICB9ID0gdXRpbHNcbiAgICBrZXkgPSBjYW1lbFRvS2ViYWIoa2V5KVxuICAgIGxldCBzdHlsZXNUZXh0ID0gJydcbiAgICBmb3IgKGNvbnN0IGsgaW4gc3R5bGVzKSB7XG4gICAgICBpZiAoc3R5bGVzLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgIHN0eWxlc1RleHQgKz0gY2FtZWxUb0tlYmFiKGspICsgJzonICsgc3R5bGVzW2tdICsgJzsnXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHN0eWxlVGV4dCA9IGBAJHtrZXl9eyR7c3R5bGVzVGV4dH19YFxuICAgIGFwcGVuZENzcyhzdHlsZVRleHQsICdkb20tYWRkZWQtcnVsZXMnKVxuICB9XG59XG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKHdlZXgpIHtcbiAgICBjb25zdCBleHRlbmRLZXlzID0gd2VleC51dGlscy5leHRlbmRLZXlzXG4gICAgZXh0ZW5kS2V5cyh1dGlscywgd2VleC51dGlscywgWydjYW1lbFRvS2ViYWInLCAnYXBwZW5kQ3NzJywgJ2lzQXJyYXknXSlcbiAgICB3ZWV4LnJlZ2lzdGVyTW9kdWxlKCdkb20nLCBkb20pXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBnbG9iYWxFdmVudCBBUEk6XG4gKiBAZG9jIGh0dHA6Ly93ZWV4LmFwYWNoZS5vcmcvY24vcmVmZXJlbmNlcy9tb2R1bGVzL2dsb2JhbGV2ZW50Lmh0bWxcbiAqL1xuLy8gdHJhY2sgdmFyaWVzIGtpbmRzIG9mIGV2ZW50cyBhbmQgbGlzdGVuZXJzLlxuY29uc3QgaGFuZGxlclRyYWtlciA9IHt9XG5cbmNvbnN0IGdsb2JhbEV2ZW50ID0ge1xuICAvKipcbiAgICogYWRkRXZlbnRMaXN0ZW5lclxuICAgKiBOT1RFOiBvbmUgY2FsbGJhY2sgY2FuIG9ubHkgYmUgYm91bmQgdG8gdGhlIHNhbWUgZXZlbnQgb25jZS4gQmluZCBhIGNhbGxiYWNrIHR3aWNlIGRvZXNuJ3RcbiAgICogIG1lYW4gaXQgd2lsbCBiZSBjYWxsZWQgdHdpY2Ugd2hlbiB0aGUgZXZlbnQgZmlyZWQgb25jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2dCAtIHRoZSBldmVudCBuYW1lIHRvIGFkZCBhIGxpc3RlbmVyIG9uLlxuICAgKi9cbiAgYWRkRXZlbnRMaXN0ZW5lciAoZXZ0LCBjYWxsYmFjaykge1xuICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbdnVlLXJlbmRlcl0gbWlzc2luZyBjYWxsYmFjayBhcmcgaW4gZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lci5gKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGxldCBoYW5kbGVycyA9IGhhbmRsZXJUcmFrZXJbZXZ0XVxuICAgIGlmICghaGFuZGxlcnMpIHtcbiAgICAgIGhhbmRsZXJzID0gaGFuZGxlclRyYWtlcltldnRdID0gW11cbiAgICB9XG4gICAgY29uc3QgbGVuID0gaGFuZGxlcnMubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKGhhbmRsZXJzW2ldID09PSBjYWxsYmFjaykge1xuICAgICAgICAvLyB0aGlzIGNhbGxiYWNrIGlzIGFscmVhZHkgYm91bmQuIG5vIG5lZWQgdG8gYmluZCBpdCBhZ2Fpbi5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICAgIGhhbmRsZXJzLnB1c2goY2FsbGJhY2spXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldnQsIGNhbGxiYWNrKVxuICB9LFxuXG4gIC8qKlxuICAgKiByZW1vdmVFdmVudExpc3RlbmVyXG4gICAqIE5PVEU6IHJlbW92ZSBhbGwgdGhlIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50IHR5cGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldnQgLSB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgYSBsaXN0ZW5lciBmcm9tLlxuICAgKi9cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lciAoZXZ0KSB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSBoYW5kbGVyVHJha2VyW2V2dF1cbiAgICBpZiAoIWhhbmRsZXJzKSB7XG4gICAgICAvLyBldnQgaGFuZGxlcnMgaGFzIGJlZW4gYWxyZWFkeSByZW1vdmVkLlxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGhhbmRsZXJzLmZvckVhY2goY2IgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldnQsIGNiKSlcbiAgICBkZWxldGUgaGFuZGxlclRyYWtlcltldnRdXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0ICh3ZWV4KSB7XG4gICAgd2VleC5yZWdpc3Rlck1vZHVsZSgnZ2xvYmFsRXZlbnQnLCBnbG9iYWxFdmVudClcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5jb25zdCBxdWV1ZSA9IFtdXG5sZXQgaXNQcm9jZXNzaW5nID0gZmFsc2VcbmxldCB0b2FzdFdpblxuY29uc3QgVE9BU1RfV0lOX0NMQVNTX05BTUUgPSAnd2VleC10b2FzdCdcbmNvbnN0IFRPQVNUX1RSQU5TSVRJT05fRFVSQVRJT04gPSAwLjRcblxuY29uc3QgREVGQVVMVF9EVVJBVElPTiA9IDAuOFxuXG5mdW5jdGlvbiBzaG93VG9hc3RXaW5kb3cgKG1zZywgY2FsbGJhY2spIHtcbiAgaWYgKCF0b2FzdFdpbikge1xuICAgIHRvYXN0V2luID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICB0b2FzdFdpbi5jbGFzc0xpc3QuYWRkKFRPQVNUX1dJTl9DTEFTU19OQU1FKVxuICAgIHRvYXN0V2luLmNsYXNzTGlzdC5hZGQoJ2hpZGUnKVxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodG9hc3RXaW4pXG4gIH1cbiAgdG9hc3RXaW4udGV4dENvbnRlbnQgPSBtc2dcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgdG9hc3RXaW4uY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpXG4gICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICB9LCAxNilcbn1cblxuZnVuY3Rpb24gaGlkZVRvYXN0V2luZG93IChjYWxsYmFjaykge1xuICBpZiAoIXRvYXN0V2luKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdG9hc3RXaW4uY2xhc3NMaXN0LmFkZCgnaGlkZScpXG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKClcbiAgfSwgVE9BU1RfVFJBTlNJVElPTl9EVVJBVElPTiAqIDEwMDApXG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgcHVzaDogZnVuY3Rpb24gKG1zZywgZHVyYXRpb24pIHtcbiAgICBxdWV1ZS5wdXNoKHtcbiAgICAgIG1zZzogbXNnLFxuICAgICAgZHVyYXRpb246IGR1cmF0aW9uIHx8IERFRkFVTFRfRFVSQVRJT05cbiAgICB9KVxuICAgIHRoaXMuc2hvdygpXG4gIH0sXG5cbiAgc2hvdzogZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzXG5cbiAgICAvLyBBbGwgbWVzc2FnZXMgaGFkIGJlZW4gdG9hc3RlZCBhbHJlYWR5LCBzbyByZW1vdmUgdGhlIHRvYXN0IHdpbmRvdyxcbiAgICBpZiAoIXF1ZXVlLmxlbmd0aCkge1xuICAgICAgdG9hc3RXaW4gJiYgdG9hc3RXaW4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0b2FzdFdpbilcbiAgICAgIHRvYXN0V2luID0gbnVsbFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gdGhlIHByZXZpb3VzIHRvYXN0IGlzIG5vdCBlbmRlZCB5ZXQuXG4gICAgaWYgKGlzUHJvY2Vzc2luZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlzUHJvY2Vzc2luZyA9IHRydWVcblxuICAgIGNvbnN0IHRvYXN0SW5mbyA9IHF1ZXVlLnNoaWZ0KClcbiAgICBzaG93VG9hc3RXaW5kb3codG9hc3RJbmZvLm1zZywgZnVuY3Rpb24gKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGhpZGVUb2FzdFdpbmRvdyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaXNQcm9jZXNzaW5nID0gZmFsc2VcbiAgICAgICAgICB0aGF0LnNob3coKVxuICAgICAgICB9KVxuICAgICAgfSwgdG9hc3RJbmZvLmR1cmF0aW9uICogMTAwMClcbiAgICB9KVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gdGhlcmUgd2lsbCBiZSBvbmx5IG9uZSBpbnN0YW5jZSBvZiBtb2RhbC5cbmNvbnN0IE1PREFMX1dSQVBfQ0xBU1MgPSAnd2VleC1tb2RhbC13cmFwJ1xuY29uc3QgTU9EQUxfTk9ERV9DTEFTUyA9ICd3ZWV4LW1vZGFsLW5vZGUnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1vZGFsICgpIHtcbiAgdGhpcy53cmFwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihNT0RBTF9XUkFQX0NMQVNTKVxuICB0aGlzLm5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKE1PREFMX05PREVfQ0xBU1MpXG4gIGlmICghdGhpcy53cmFwKSB7XG4gICAgdGhpcy5jcmVhdGVXcmFwKClcbiAgfVxuICBpZiAoIXRoaXMubm9kZSkge1xuICAgIHRoaXMuY3JlYXRlTm9kZSgpXG4gIH1cbiAgdGhpcy5jbGVhck5vZGUoKVxuICB0aGlzLmNyZWF0ZU5vZGVDb250ZW50KClcbiAgdGhpcy5iaW5kRXZlbnRzKClcbn1cblxuTW9kYWwucHJvdG90eXBlID0ge1xuXG4gIHNob3c6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLndyYXAuc3R5bGUuZGlzcGxheSA9ICdibG9jaydcbiAgICB0aGlzLm5vZGUuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpXG4gIH0sXG5cbiAgZGVzdHJveTogZnVuY3Rpb24gKCkge1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy53cmFwKVxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5ub2RlKVxuICAgIHRoaXMud3JhcCA9IG51bGxcbiAgICB0aGlzLm5vZGUgPSBudWxsXG4gIH0sXG5cbiAgY3JlYXRlV3JhcDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMud3JhcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgdGhpcy53cmFwLmNsYXNzTmFtZSA9IE1PREFMX1dSQVBfQ0xBU1NcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMud3JhcClcbiAgfSxcblxuICBjcmVhdGVOb2RlOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5ub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICB0aGlzLm5vZGUuY2xhc3NMaXN0LmFkZChNT0RBTF9OT0RFX0NMQVNTLCAnaGlkZScpXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLm5vZGUpXG4gIH0sXG5cbiAgY2xlYXJOb2RlOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5ub2RlLmlubmVySFRNTCA9ICcnXG4gIH0sXG5cbiAgY3JlYXRlTm9kZUNvbnRlbnQ6IGZ1bmN0aW9uICgpIHtcblxuICAgIC8vIGRvIG5vdGhpbmcuXG4gICAgLy8gY2hpbGQgY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QuXG4gIH0sXG5cbiAgYmluZEV2ZW50czogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMud3JhcC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICB9KVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCBNb2RhbCBmcm9tICcuL21vZGFsJ1xuXG5jb25zdCBDT05URU5UX0NMQVNTID0gJ2NvbnRlbnQnXG5jb25zdCBNU0dfQ0xBU1MgPSAnY29udGVudC1tc2cnXG5jb25zdCBCVVRUT05fR1JPVVBfQ0xBU1MgPSAnYnRuLWdyb3VwJ1xuY29uc3QgQlVUVE9OX0NMQVNTID0gJ2J0bidcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQWxlcnQgKGNvbmZpZykge1xuICB0aGlzLm1zZyA9IGNvbmZpZy5tZXNzYWdlIHx8ICcnXG4gIHRoaXMuY2FsbGJhY2sgPSBjb25maWcuY2FsbGJhY2tcbiAgdGhpcy5va1RpdGxlID0gY29uZmlnLm9rVGl0bGUgfHwgJ09LJ1xuICBNb2RhbC5jYWxsKHRoaXMpXG4gIHRoaXMubm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LWFsZXJ0Jylcbn1cblxuQWxlcnQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShNb2RhbC5wcm90b3R5cGUpXG5cbkFsZXJ0LnByb3RvdHlwZS5jcmVhdGVOb2RlQ29udGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gIGNvbnRlbnQuY2xhc3NMaXN0LmFkZChDT05URU5UX0NMQVNTKVxuICB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoY29udGVudClcblxuICBjb25zdCBtc2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBtc2cuY2xhc3NMaXN0LmFkZChNU0dfQ0xBU1MpXG4gIG1zZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLm1zZykpXG4gIGNvbnRlbnQuYXBwZW5kQ2hpbGQobXNnKVxuXG4gIGNvbnN0IGJ1dHRvbkdyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgYnV0dG9uR3JvdXAuY2xhc3NMaXN0LmFkZChCVVRUT05fR1JPVVBfQ0xBU1MpXG4gIHRoaXMubm9kZS5hcHBlbmRDaGlsZChidXR0b25Hcm91cClcbiAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoQlVUVE9OX0NMQVNTLCAnYWxlcnQtb2snKVxuICBidXR0b24uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5va1RpdGxlKSlcbiAgYnV0dG9uR3JvdXAuYXBwZW5kQ2hpbGQoYnV0dG9uKVxufVxuXG5BbGVydC5wcm90b3R5cGUuYmluZEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgTW9kYWwucHJvdG90eXBlLmJpbmRFdmVudHMuY2FsbCh0aGlzKVxuICBjb25zdCBidXR0b24gPSB0aGlzLm5vZGUucXVlcnlTZWxlY3RvcignLicgKyBCVVRUT05fQ0xBU1MpXG4gIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmRlc3Ryb3koKVxuICAgIHRoaXMuY2FsbGJhY2sgJiYgdGhpcy5jYWxsYmFjaygpXG4gIH0uYmluZCh0aGlzKSlcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IE1vZGFsIGZyb20gJy4vbW9kYWwnXG5cbmNvbnN0IENPTlRFTlRfQ0xBU1MgPSAnY29udGVudCdcbmNvbnN0IE1TR19DTEFTUyA9ICdjb250ZW50LW1zZydcbmNvbnN0IEJVVFRPTl9HUk9VUF9DTEFTUyA9ICdidG4tZ3JvdXAnXG5jb25zdCBCVVRUT05fQ0xBU1MgPSAnYnRuJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDb25maXJtIChjb25maWcpIHtcbiAgdGhpcy5tc2cgPSBjb25maWcubWVzc2FnZSB8fCAnJ1xuICB0aGlzLmNhbGxiYWNrID0gY29uZmlnLmNhbGxiYWNrXG4gIHRoaXMub2tUaXRsZSA9IGNvbmZpZy5va1RpdGxlIHx8ICdPSydcbiAgdGhpcy5jYW5jZWxUaXRsZSA9IGNvbmZpZy5jYW5jZWxUaXRsZSB8fCAnQ2FuY2VsJ1xuICBNb2RhbC5jYWxsKHRoaXMpXG4gIHRoaXMubm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LWNvbmZpcm0nKVxufVxuXG5Db25maXJtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTW9kYWwucHJvdG90eXBlKVxuXG5Db25maXJtLnByb3RvdHlwZS5jcmVhdGVOb2RlQ29udGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gIGNvbnRlbnQuY2xhc3NMaXN0LmFkZChDT05URU5UX0NMQVNTKVxuICB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoY29udGVudClcblxuICBjb25zdCBtc2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBtc2cuY2xhc3NMaXN0LmFkZChNU0dfQ0xBU1MpXG4gIG1zZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLm1zZykpXG4gIGNvbnRlbnQuYXBwZW5kQ2hpbGQobXNnKVxuXG4gIGNvbnN0IGJ1dHRvbkdyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgYnV0dG9uR3JvdXAuY2xhc3NMaXN0LmFkZChCVVRUT05fR1JPVVBfQ0xBU1MpXG4gIHRoaXMubm9kZS5hcHBlbmRDaGlsZChidXR0b25Hcm91cClcbiAgY29uc3QgYnRuT2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBidG5Pay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLm9rVGl0bGUpKVxuICBidG5Pay5jbGFzc0xpc3QuYWRkKCdidG4tb2snLCBCVVRUT05fQ0xBU1MpXG4gIGNvbnN0IGJ0bkNhbmNlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gIGJ0bkNhbmNlbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLmNhbmNlbFRpdGxlKSlcbiAgYnRuQ2FuY2VsLmNsYXNzTGlzdC5hZGQoJ2J0bi1jYW5jZWwnLCBCVVRUT05fQ0xBU1MpXG4gIGJ1dHRvbkdyb3VwLmFwcGVuZENoaWxkKGJ0bk9rKVxuICBidXR0b25Hcm91cC5hcHBlbmRDaGlsZChidG5DYW5jZWwpXG4gIHRoaXMubm9kZS5hcHBlbmRDaGlsZChidXR0b25Hcm91cClcbn1cblxuQ29uZmlybS5wcm90b3R5cGUuYmluZEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgTW9kYWwucHJvdG90eXBlLmJpbmRFdmVudHMuY2FsbCh0aGlzKVxuICBjb25zdCBidG5PayA9IHRoaXMubm9kZS5xdWVyeVNlbGVjdG9yKCcuJyArIEJVVFRPTl9DTEFTUyArICcuYnRuLW9rJylcbiAgY29uc3QgYnRuQ2FuY2VsID0gdGhpcy5ub2RlLnF1ZXJ5U2VsZWN0b3IoJy4nICsgQlVUVE9OX0NMQVNTICsgJy5idG4tY2FuY2VsJylcbiAgYnRuT2suYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5kZXN0cm95KClcbiAgICB0aGlzLmNhbGxiYWNrICYmIHRoaXMuY2FsbGJhY2sodGhpcy5va1RpdGxlKVxuICB9LmJpbmQodGhpcykpXG4gIGJ0bkNhbmNlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmRlc3Ryb3koKVxuICAgIHRoaXMuY2FsbGJhY2sgJiYgdGhpcy5jYWxsYmFjayh0aGlzLmNhbmNlbFRpdGxlKVxuICB9LmJpbmQodGhpcykpXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCBNb2RhbCBmcm9tICcuL21vZGFsJ1xuXG5jb25zdCBDT05URU5UX0NMQVNTID0gJ2NvbnRlbnQnXG5jb25zdCBNU0dfQ0xBU1MgPSAnY29udGVudC1tc2cnXG5jb25zdCBCVVRUT05fR1JPVVBfQ0xBU1MgPSAnYnRuLWdyb3VwJ1xuY29uc3QgQlVUVE9OX0NMQVNTID0gJ2J0bidcbmNvbnN0IElOUFVUX1dSQVBfQ0xBU1MgPSAnaW5wdXQtd3JhcCdcbmNvbnN0IElOUFVUX0NMQVNTID0gJ2lucHV0J1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBQcm9tcHQgKGNvbmZpZykge1xuICB0aGlzLm1zZyA9IGNvbmZpZy5tZXNzYWdlIHx8ICcnXG4gIHRoaXMuZGVmYXVsdE1zZyA9IGNvbmZpZy5kZWZhdWx0IHx8ICcnXG4gIHRoaXMuY2FsbGJhY2sgPSBjb25maWcuY2FsbGJhY2tcbiAgdGhpcy5va1RpdGxlID0gY29uZmlnLm9rVGl0bGUgfHwgJ09LJ1xuICB0aGlzLmNhbmNlbFRpdGxlID0gY29uZmlnLmNhbmNlbFRpdGxlIHx8ICdDYW5jZWwnXG4gIE1vZGFsLmNhbGwodGhpcylcbiAgdGhpcy5ub2RlLmNsYXNzTGlzdC5hZGQoJ3dlZXgtcHJvbXB0Jylcbn1cblxuUHJvbXB0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTW9kYWwucHJvdG90eXBlKVxuXG5Qcm9tcHQucHJvdG90eXBlLmNyZWF0ZU5vZGVDb250ZW50ID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgY29udGVudC5jbGFzc0xpc3QuYWRkKENPTlRFTlRfQ0xBU1MpXG4gIHRoaXMubm9kZS5hcHBlbmRDaGlsZChjb250ZW50KVxuXG4gIGNvbnN0IG1zZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gIG1zZy5jbGFzc0xpc3QuYWRkKE1TR19DTEFTUylcbiAgbXNnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMubXNnKSlcbiAgY29udGVudC5hcHBlbmRDaGlsZChtc2cpXG5cbiAgY29uc3QgaW5wdXRXcmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgaW5wdXRXcmFwLmNsYXNzTGlzdC5hZGQoSU5QVVRfV1JBUF9DTEFTUylcbiAgY29udGVudC5hcHBlbmRDaGlsZChpbnB1dFdyYXApXG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxuICBpbnB1dC5jbGFzc0xpc3QuYWRkKElOUFVUX0NMQVNTKVxuICBpbnB1dC50eXBlID0gJ3RleHQnXG4gIGlucHV0LmF1dG9mb2N1cyA9IHRydWVcbiAgaW5wdXQucGxhY2Vob2xkZXIgPSB0aGlzLmRlZmF1bHRNc2dcbiAgaW5wdXRXcmFwLmFwcGVuZENoaWxkKGlucHV0KVxuXG4gIGNvbnN0IGJ1dHRvbkdyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgYnV0dG9uR3JvdXAuY2xhc3NMaXN0LmFkZChCVVRUT05fR1JPVVBfQ0xBU1MpXG4gIGNvbnN0IGJ0bk9rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgYnRuT2suYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5va1RpdGxlKSlcbiAgYnRuT2suY2xhc3NMaXN0LmFkZCgnYnRuLW9rJywgQlVUVE9OX0NMQVNTKVxuICBjb25zdCBidG5DYW5jZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBidG5DYW5jZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5jYW5jZWxUaXRsZSkpXG4gIGJ0bkNhbmNlbC5jbGFzc0xpc3QuYWRkKCdidG4tY2FuY2VsJywgQlVUVE9OX0NMQVNTKVxuICBidXR0b25Hcm91cC5hcHBlbmRDaGlsZChidG5PaylcbiAgYnV0dG9uR3JvdXAuYXBwZW5kQ2hpbGQoYnRuQ2FuY2VsKVxuICB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoYnV0dG9uR3JvdXApXG59XG5cblByb21wdC5wcm90b3R5cGUuYmluZEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgTW9kYWwucHJvdG90eXBlLmJpbmRFdmVudHMuY2FsbCh0aGlzKVxuICBjb25zdCBidG5PayA9IHRoaXMubm9kZS5xdWVyeVNlbGVjdG9yKCcuJyArIEJVVFRPTl9DTEFTUyArICcuYnRuLW9rJylcbiAgY29uc3QgYnRuQ2FuY2VsID0gdGhpcy5ub2RlLnF1ZXJ5U2VsZWN0b3IoJy4nICsgQlVUVE9OX0NMQVNTICsgJy5idG4tY2FuY2VsJylcbiAgY29uc3QgdGhhdCA9IHRoaXNcbiAgYnRuT2suYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdmFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKS52YWx1ZVxuICAgIHRoaXMuZGVzdHJveSgpXG4gICAgdGhpcy5jYWxsYmFjayAmJiB0aGlzLmNhbGxiYWNrKHtcbiAgICAgIHJlc3VsdDogdGhhdC5va1RpdGxlLFxuICAgICAgZGF0YTogdmFsXG4gICAgfSlcbiAgfS5iaW5kKHRoaXMpKVxuICBidG5DYW5jZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdmFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKS52YWx1ZVxuICAgIHRoaXMuZGVzdHJveSgpXG4gICAgdGhpcy5jYWxsYmFjayAmJiB0aGlzLmNhbGxiYWNrKHtcbiAgICAgIHJlc3VsdDogdGhhdC5jYW5jZWxUaXRsZSxcbiAgICAgIGRhdGE6IHZhbFxuICAgIH0pXG4gIH0uYmluZCh0aGlzKSlcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYFxuLndlZXgtdG9hc3Qge1xuICBmb250LXNpemU6IDAuNDI2NjY3cmVtO1xuICBsaW5lLWhlaWdodDogMC40MjY2NjdyZW07XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogMTk5OTk5OTk5OTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgbWF4LXdpZHRoOiA4MCU7XG4gIGJvdHRvbTogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHBhZGRpbmc6IDAuMjEzMzMzcmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwO1xuICBjb2xvcjogI2ZmZjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBvcGFjaXR5OiAwLjc7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuNHMgZWFzZS1pbi1vdXQ7XG4gIC1tb3otdHJhbnNpdGlvbjogYWxsIDAuNHMgZWFzZS1pbi1vdXQ7XG4gIC1tcy10cmFuc2l0aW9uOiBhbGwgMC40cyBlYXNlLWluLW91dDtcbiAgdHJhbnNpdGlvbjogYWxsIDAuNHMgZWFzZS1pbi1vdXQ7XG4gIGJvcmRlci1yYWRpdXM6IDAuMDY2NjY3cmVtO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgLW1vei10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbn1cblxuLndlZXgtdG9hc3QuaGlkZSB7XG4gIG9wYWNpdHk6IDA7XG59XG5cbi53ZWV4LWFsZXJ0IC53ZWV4LWFsZXJ0LW9rIHtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi53ZWV4LWNvbmZpcm0gLmJ0bi1ncm91cCAuYnRuIHtcbiAgZmxvYXQ6IGxlZnQ7XG4gIHdpZHRoOiA1MCU7XG59XG5cbi53ZWV4LWNvbmZpcm0gLmJ0bi1ncm91cCAuYnRuLmJ0bi1vayB7XG4gIGJvcmRlci1yaWdodDogMC4wMTMzMzNyZW0gc29saWQgI2RkZDtcbn1cblxuLndlZXgtbW9kYWwtd3JhcCB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogOTk5OTk5OTk5O1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XG4gIG9wYWNpdHk6IDAuNTtcbn1cblxuLndlZXgtbW9kYWwtbm9kZSB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogOTk5OTk5OTk5OTtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDYuNjY2NjY3cmVtO1xuICBtaW4taGVpZ2h0OiAyLjY2NjY2N3JlbTtcbiAgYm9yZGVyLXJhZGl1czogMC4wNjY2NjdyZW07XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIC1tb3otdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG59XG5cbi53ZWV4LW1vZGFsLW5vZGUuaGlkZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi53ZWV4LW1vZGFsLW5vZGUgLmNvbnRlbnQge1xuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgZGlzcGxheTogLXdlYmtpdC1mbGV4O1xuICBkaXNwbGF5OiAtbW96LWJveDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XG4gIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgLW1vei1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcbiAgLW1vei1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XG4gIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgLXdlYmtpdC1ib3gtYWxpZ246IGNlbnRlcjtcbiAgLXdlYmtpdC1hbGlnbi1pdGVtczogY2VudGVyO1xuICAtbXMtZmxleC1hbGlnbjogY2VudGVyO1xuICAtbW96LWJveC1hbGlnbjogY2VudGVyO1xuICAtbXMtZmxleC1hbGlnbjogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAtd2Via2l0LWJveC1wYWNrOiBjZW50ZXI7XG4gIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIC1tb3otYm94LXBhY2s6IGNlbnRlcjtcbiAgLW1zLWZsZXgtcGFjazogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgd2lkdGg6IDEwMCU7XG4gIG1pbi1oZWlnaHQ6IDEuODY2NjY3cmVtO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBmb250LXNpemU6IDAuNDI2NjY3cmVtO1xuICBsaW5lLWhlaWdodDogMC40MjY2NjdyZW07XG4gIHBhZGRpbmc6IDAuMjEzMzMzcmVtO1xuICBib3JkZXItYm90dG9tOiAwLjAxMzMzM3JlbSBzb2xpZCAjZGRkO1xufVxuXG4ud2VleC1tb2RhbC1ub2RlIC5idG4tZ3JvdXAge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAwLjhyZW07XG4gIGZvbnQtc2l6ZTogMC4zNzMzMzNyZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBib3JkZXI6IG5vbmU7XG59XG5cbi53ZWV4LW1vZGFsLW5vZGUgLmJ0bi1ncm91cCAuYnRuIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4ud2VleC1tb2RhbC1ub2RlIC5idG4tZ3JvdXAgLmJ0biB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGhlaWdodDogMC44cmVtO1xuICBsaW5lLWhlaWdodDogMC44cmVtO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGJvcmRlcjogbm9uZTtcbiAgYmFja2dyb3VuZDogbm9uZTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4ud2VleC1wcm9tcHQgLmlucHV0LXdyYXAge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB3aWR0aDogMTAwJTtcbiAgbWFyZ2luLXRvcDogMC4xMzMzMzNyZW07XG4gIGhlaWdodDogMC45NnJlbTtcbn1cblxuLndlZXgtcHJvbXB0IC5pbnB1dC13cmFwIC5pbnB1dCB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDAuNTZyZW07XG4gIGxpbmUtaGVpZ2h0OiAwLjU2cmVtO1xuICBmb250LXNpemU6IDAuNDI2NjY3cmVtO1xuICBib3JkZXI6IDAuMDEzMzMzcmVtIHNvbGlkICM5OTk7XG59XG5cbi53ZWV4LXByb21wdCAuYnRuLWdyb3VwIC5idG4ge1xuICBmbG9hdDogbGVmdDtcbiAgd2lkdGg6IDUwJTtcbn1cblxuLndlZXgtcHJvbXB0IC5idG4tZ3JvdXAgLmJ0bi5idG4tb2sge1xuICBib3JkZXItcmlnaHQ6IDAuMDEzMzMzcmVtIHNvbGlkICNkZGQ7XG59XG5gXG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB0b2FzdCBmcm9tICcuL3RvYXN0J1xuaW1wb3J0IEFsZXJ0IGZyb20gJy4vYWxlcnQnXG5pbXBvcnQgQ29uZmlybSBmcm9tICcuL2NvbmZpcm0nXG5pbXBvcnQgUHJvbXB0IGZyb20gJy4vcHJvbXB0J1xuaW1wb3J0IF9jc3MgZnJvbSAnLi9zdHlsZSdcblxuLy8gVE9ETzogcmV3cml0ZSB0aGUgbW9kYWwgc3R5bGVzXG5jb25zdCBtb2RhbCA9IHtcblxuICAvLyBkdXJhdGlvbjogZGVmYXVsdCBpcyAwLjggc2Vjb25kcy5cbiAgdG9hc3Q6IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICB0b2FzdC5wdXNoKGNvbmZpZy5tZXNzYWdlLCBjb25maWcuZHVyYXRpb24pXG4gIH0sXG5cbiAgLy8gY29uZmlnOlxuICAvLyAgLSBtZXNzYWdlOiBzdHJpbmdcbiAgLy8gIC0gb2tUaXRsZTogdGl0bGUgb2Ygb2sgYnV0dG9uXG4gIC8vICAtIGNhbGxiYWNrXG4gIGFsZXJ0OiBmdW5jdGlvbiAoY29uZmlnLCBjYWxsYmFjaykge1xuICAgIGNvbmZpZy5jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKClcbiAgICB9XG4gICAgbmV3IEFsZXJ0KGNvbmZpZykuc2hvdygpXG4gIH0sXG5cbiAgLy8gY29uZmlnOlxuICAvLyAgLSBtZXNzYWdlOiBzdHJpbmdcbiAgLy8gIC0gb2tUaXRsZTogdGl0bGUgb2Ygb2sgYnV0dG9uXG4gIC8vICAtIGNhbmNlbFRpdGxlOiB0aXRsZSBvZiBjYW5jZWwgYnV0dG9uXG4gIC8vICAtIGNhbGxiYWNrXG4gIGNvbmZpcm06IGZ1bmN0aW9uIChjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgY29uZmlnLmNhbGxiYWNrID0gZnVuY3Rpb24gKHZhbCkge1xuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2sodmFsKVxuICAgIH1cbiAgICBuZXcgQ29uZmlybShjb25maWcpLnNob3coKVxuICB9LFxuXG4gIC8vIGNvbmZpZzpcbiAgLy8gIC0gbWVzc2FnZTogc3RyaW5nXG4gIC8vICAtIG9rVGl0bGU6IHRpdGxlIG9mIG9rIGJ1dHRvblxuICAvLyAgLSBjYW5jZWxUaXRsZTogdGl0bGUgb2YgY2FuY2VsIGJ1dHRvblxuICAvLyAgLSBjYWxsYmFja1xuICBwcm9tcHQ6IGZ1bmN0aW9uIChjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgY29uZmlnLmNhbGxiYWNrID0gZnVuY3Rpb24gKHZhbCkge1xuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2sodmFsKVxuICAgIH1cbiAgICBuZXcgUHJvbXB0KGNvbmZpZykuc2hvdygpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBmdW5jdGlvbiAoV2VleCkge1xuICAgIFdlZXgudXRpbHMuYXBwZW5kQ3NzKF9jc3MsICd3ZWV4LW11ZC1tb2RhbCcpXG4gICAgV2VleC5yZWdpc3Rlck1vZHVsZSgnbW9kYWwnLCBtb2RhbClcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogTmF2aWdhdG9yIG1vZHVsZVxuICovXG5jb25zdCBuYXZpZ2F0b3JNb2R1bGUgPSB7XG4gIHB1c2g6IGZ1bmN0aW9uIChjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBjb25maWcudXJsXG4gICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICB9LFxuXG4gIHBvcDogZnVuY3Rpb24gKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICB3aW5kb3cuaGlzdG9yeS5iYWNrKClcbiAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0ICh3ZWV4KSB7XG4gICAgd2VleC5yZWdpc3Rlck1vZHVsZSgnbmF2aWdhdG9yJywgbmF2aWdhdG9yTW9kdWxlKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBXZWJ2aWV3IG1vZHVsZVxuICovXG5sZXQgaXNBcnJheVxuXG5jb25zdCB3ZWJ2aWV3ID0ge1xuICBnb0JhY2sgKHZub2RlKSB7XG4gICAgaWYgKGlzQXJyYXkodm5vZGUpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbdnVlLXJlbmRlcl0gdGhlIHJlZiBwYXNzZWQgdG8gd2Vidmlldy5nb0JhY2sgaXMgYSBhcnJheS4nKVxuICAgICAgfVxuICAgICAgdm5vZGUgPSB2bm9kZVswXVxuICAgIH1cbiAgICBpZiAodm5vZGUgJiYgdHlwZW9mIHZub2RlLmdvQmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdm5vZGUuZ29CYWNrKClcbiAgICB9XG4gIH0sXG4gIGdvRm9yd2FyZCAodm5vZGUpIHtcbiAgICBpZiAoaXNBcnJheSh2bm9kZSkpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1t2dWUtcmVuZGVyXSB0aGUgcmVmIHBhc3NlZCB0byB3ZWJ2aWV3LmdvRm9yd2FyZCBpcyBhIGFycmF5LicpXG4gICAgICB9XG4gICAgICB2bm9kZSA9IHZub2RlWzBdXG4gICAgfVxuICAgIGlmICh2bm9kZSAmJiB0eXBlb2Ygdm5vZGUuZ29Gb3J3YXJkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2bm9kZS5nb0ZvcndhcmQoKVxuICAgIH1cbiAgfSxcbiAgcmVsb2FkICh2bm9kZSkge1xuICAgIGlmIChpc0FycmF5KHZub2RlKSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW3Z1ZS1yZW5kZXJdIHRoZSByZWYgcGFzc2VkIHRvIHdlYnZpZXcucmVsb2FkIGlzIGEgYXJyYXkuJylcbiAgICAgIH1cbiAgICAgIHZub2RlID0gdm5vZGVbMF1cbiAgICB9XG4gICAgaWYgKHZub2RlICYmIHR5cGVvZiB2bm9kZS5yZWxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZub2RlLnJlbG9hZCgpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdCAod2VleCkge1xuICAgIGlzQXJyYXkgPSB3ZWV4LnV0aWxzLmlzQXJyYXlcbiAgICB3ZWV4LnJlZ2lzdGVyTW9kdWxlKCd3ZWJ2aWV3Jywgd2VidmlldylcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIHdlYnNvY2tldCBtb2R1bGVcbiAqL1xuLypnbG9iYWwgV2ViU29ja2V0Ki9cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHJlZ2lzdGVyTGlzdGVuZXJzID0gWydvbm9wZW4nLCAnb25tZXNzYWdlJywgJ29uZXJyb3InLCAnb25jbG9zZSddXG4gIGNvbnN0IHdzID0ge1xuICAgIElOU1RBTkNFOiBudWxsLFxuICAgIFdlYlNvY2tldDogZnVuY3Rpb24gKHVybCwgcHJvdG9jb2wpIHtcbiAgICAgIGlmICghdXJsKSB7XG4gICAgICAgIHdzLklOU1RBTkNFID0gbnVsbFxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmICghcHJvdG9jb2wpIHtcbiAgICAgICAgd3MuSU5TVEFOQ0UgPSBuZXcgV2ViU29ja2V0KHVybClcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB3cy5JTlNUQU5DRSA9IG5ldyBXZWJTb2NrZXQodXJsLCBwcm90b2NvbClcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cy5JTlNUQU5DRVxuICAgIH0sXG4gICAgc2VuZDogZnVuY3Rpb24gKG1lc3NhZ2VzKSB7XG4gICAgICB3cy5JTlNUQU5DRSAmJiB3cy5JTlNUQU5DRS5zZW5kKG1lc3NhZ2VzKVxuICAgIH0sXG4gICAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdzLklOU1RBTkNFICYmIHdzLklOU1RBTkNFLmNsb3NlKClcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBpIGluIHJlZ2lzdGVyTGlzdGVuZXJzKSB7XG4gICAgaWYgKHJlZ2lzdGVyTGlzdGVuZXJzLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod3MsIHJlZ2lzdGVyTGlzdGVuZXJzW2ldLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB3cy5JTlNUQU5DRSAmJiB3cy5JTlNUQU5DRVtyZWdpc3Rlckxpc3RlbmVyc1tpXV1cbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICBpZiAod3MuSU5TVEFOQ0UpIHtcbiAgICAgICAgICAgIHdzLklOU1RBTkNFW3JlZ2lzdGVyTGlzdGVuZXJzW2ldXSA9IGZuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuICByZXR1cm4gd3Ncbn0pKClcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHdlYnNvY2tldCBmcm9tICcuL3dlYnNvY2tldCdcblxuLy8gVE9ETzogcmV3cml0ZSB0aGUgbW9kdWxlIG1ldGFcbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogZnVuY3Rpb24gKFdlZXgpIHtcbiAgICBXZWV4LnJlZ2lzdGVyTW9kdWxlKCd3ZWJTb2NrZXQnLCB3ZWJzb2NrZXQsIHsgbW91bnRUeXBlOiAnZnVsbCcgfSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmNvbnN0IG1ldGEgPSB7XG4gIC8qKlxuICAgKiBzZXRWaWV3cG9ydFxuICAgKiBDaGFuZ2luZyB2aWV3cG9ydCB3aWR0aCBhdCBydW50aW1lIGlzIG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1c2Ugd2VleC12aWV3cG9ydCBtZXRhXG4gICAqIHRhZyB0byBzcGVjaWZ5IHlvdXIgdmlld3BvcnQgaW4geW91ciBodG1sIGZpbGUuXG4gICAqL1xuICBzZXRWaWV3cG9ydCAob3B0aW9ucykge1xuICAgIGNvbnNvbGUud2FybihgW3Z1ZS1yZW5kZXJdIG1ldGEuc2V0Vmlld3BvcnQgZG9lc24ndCB3b3JrcyBhcyBleHBlY3RlZCBpbiB3ZWIgcGxhdGZvcm0uYFxuICAgICsgYCBQbGVhc2UgdXNlIDxtZXRhIG5hbWU9XCJ3ZWV4LXZpZXdwb3J0XCIgY29udGVudD1cInh4eFwiPiB0byBzcGVjaWZ5IHlvdXIgdmlld3BvcnQgd2lkdGguYClcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKHdlZXgpIHtcbiAgICB3ZWV4LnJlZ2lzdGVyTW9kdWxlKCdtZXRhJywgbWV0YSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8vIG1vZHVsZXMgZnJvbSByZW5kZXIvYnJvd2VzciAobGVnYWN5IG1vZHVsZXMpXG5cbmltcG9ydCBnZW9sb2NhdGlvbiBmcm9tICcuLi8uLi9icm93c2VyL2V4dGVuZC9hcGkvZ2VvbG9jYXRpb24nXG5pbXBvcnQgc3RvcmFnZSBmcm9tICcuLi8uLi9icm93c2VyL2V4dGVuZC9hcGkvc3RvcmFnZSdcbmltcG9ydCBzdHJlYW0gZnJvbSAnLi4vLi4vYnJvd3Nlci9leHRlbmQvYXBpL3N0cmVhbSdcbmltcG9ydCBjbGlwYm9hcmQgZnJvbSAnLi4vLi4vYnJvd3Nlci9leHRlbmQvYXBpL2NsaXBib2FyZCdcbmltcG9ydCBldmVudE1vZHVsZSBmcm9tICcuLi8uLi9icm93c2VyL2V4dGVuZC9hcGkvZXZlbnQnXG5cbi8vIGN1c3RvbSBtb2R1bGVzXG5pbXBvcnQgYW5pbWF0aW9uIGZyb20gJy4vYW5pbWF0aW9uJ1xuaW1wb3J0IGRvbSBmcm9tICcuL2RvbSdcbmltcG9ydCBnbG9iYWxFdmVudCBmcm9tICcuL2dsb2JhbEV2ZW50J1xuaW1wb3J0IG1vZGFsIGZyb20gJy4vbW9kYWwnXG5pbXBvcnQgbmF2aWdhdG9yTW9kdWxlIGZyb20gJy4vbmF2aWdhdG9yJ1xuaW1wb3J0IHdlYnZpZXcgZnJvbSAnLi93ZWJ2aWV3J1xuaW1wb3J0IHdlYnNvY2tldCBmcm9tICcuL3dlYnNvY2tldCdcbmltcG9ydCBtZXRhIGZyb20gJy4vbWV0YSdcblxuZXhwb3J0IGRlZmF1bHQgW1xuICBnZW9sb2NhdGlvbixcbiAgc3RvcmFnZSxcbiAgc3RyZWFtLFxuICBjbGlwYm9hcmQsXG4gIGV2ZW50TW9kdWxlLFxuICBtb2RhbCxcbiAgd2Vic29ja2V0LFxuICBhbmltYXRpb24sXG4gIGRvbSxcbiAgZ2xvYmFsRXZlbnQsXG4gIG5hdmlnYXRvck1vZHVsZSxcbiAgd2VidmlldyxcbiAgbWV0YVxuXVxuIiwiaW1wb3J0IHdlZXggZnJvbSAnLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZSdcblxuaW1wb3J0IGNvbXBvbmVudHMgZnJvbSAnLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9jb21wb25lbnRzJ1xuaW1wb3J0IG1vZHVsZXMgZnJvbSAnLi4vLi4vLi4vaHRtbDUvcmVuZGVyL3Z1ZS9tb2R1bGVzJ1xuXG5jb25zdCBwcmVJbml0ID0gd2VleC5pbml0XG5cbndlZXguaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgcHJlSW5pdC5hcHBseSh3ZWV4LCBhcmd1bWVudHMpXG4gIGNvbnN0IHBsdWdpbnMgPSBjb21wb25lbnRzLmNvbmNhdChtb2R1bGVzKVxuXG4gIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgd2VleC5pbnN0YWxsKHBsdWdpbilcbiAgfSlcbn1cblxuaWYgKGdsb2JhbC5WdWUpIHtcbiAgd2VleC5pbml0KGdsb2JhbC5WdWUpXG59XG5cbmV4cG9ydCBkZWZhdWx0IHdlZXhcbiJdLCJuYW1lcyI6WyJyZXF1aXJlJCQwIiwiaXNPYmplY3QiLCJyZXF1aXJlJCQxIiwiZG9jdW1lbnQiLCJyZXF1aXJlJCQyIiwicmVxdWlyZSQkMyIsImRQIiwicmVxdWlyZSQkNCIsImdsb2JhbCIsIiRleHBvcnQiLCJ0b1N0cmluZyIsIklPYmplY3QiLCJ0b0ludGVnZXIiLCJtaW4iLCJ0b0lPYmplY3QiLCJkZWZpbmVkIiwicmVxdWlyZSQkNSIsImFyZ3VtZW50cyIsImNvZiIsImFuT2JqZWN0IiwiZ2V0S2V5cyIsImVudW1CdWdLZXlzIiwiSUVfUFJPVE8iLCJQUk9UT1RZUEUiLCJoYXMiLCJUQUciLCJjcmVhdGUiLCJzZXRUb1N0cmluZ1RhZyIsInRvT2JqZWN0IiwicmVxdWlyZSQkOSIsInJlcXVpcmUkJDgiLCJyZWRlZmluZSIsInJlcXVpcmUkJDciLCJoaWRlIiwicmVxdWlyZSQkNiIsIkl0ZXJhdG9ycyIsIklURVJBVE9SIiwiQXJyYXlQcm90byIsImNsYXNzb2YiLCJhRnVuY3Rpb24iLCJjdHgiLCJwcm9jZXNzIiwiUHJvbWlzZSIsImlzTm9kZSIsIlNQRUNJRVMiLCJMSUJSQVJZIiwicmVxdWlyZSQkMTciLCJyZXF1aXJlJCQxNiIsInJlcXVpcmUkJDE1IiwicmVxdWlyZSQkMTQiLCJyZXF1aXJlJCQxMyIsInJlcXVpcmUkJDEyIiwicmVxdWlyZSQkMTEiLCJyZXF1aXJlJCQxMCIsIlR5cGVFcnJvciIsImNvbnN0IiwibGliIiwibGV0IiwiZW52IiwiaSIsImluaXQiLCJleHRlbmQiLCJfdWlkIiwidmFsdWVzIiwiY2FjaGUiLCJzdXBwb3J0IiwiaW5pdFZpZXdwb3J0Iiwid2VleCIsInV0aWxzLmJpbmQiLCJ0aGlzIiwidXRpbHMuYXBwZW5kQ3NzIiwiaGFuZGxlciIsImNvcmUiLCJnZXRMaXN0ZW5lcnMiLCJfaW5pdGVkIiwiYmFzZSIsImluaXRFdmVudE1nciIsIl9jc3MiLCJleHRyYWN0Q29tcG9uZW50U3R5bGUiLCJjcmVhdGVFdmVudE1hcCIsIm1hcEZvcm1FdmVudHMiLCJhcHBlbmRDc3MiLCJyZWN0Iiwic2Nyb2xsYWJsZSIsImNvbHVtbkRvbSIsImdldFJnYiIsImxvb3BBcnJheSIsImdldFN0eWxlU2hlZXRCeUlkIiwicHJvY2Vzc1N0eWxlIiwibGlzdCIsImxvYWRpbmdJbmRpY2F0b3IiLCJzbGlkZXIiLCJleHRlbmRLZXlzIiwiaW5kaWNhdG9yIiwiaW1hZ2UiLCJtZXRhIiwiaGFzT3duUHJvcGVydHkiLCJ1dGlscyIsInFzIiwiZXZlbnQiLCJnZXRQYXJlbnRTY3JvbGxlciIsInN0ZXAiLCJxdWV1ZSIsIkNPTlRFTlRfQ0xBU1MiLCJNU0dfQ0xBU1MiLCJCVVRUT05fR1JPVVBfQ0xBU1MiLCJCVVRUT05fQ0xBU1MiLCJpc0FycmF5Iiwid2Vic29ja2V0IiwiZ2VvbG9jYXRpb24iLCJzdG9yYWdlIiwic3RyZWFtIiwiY2xpcGJvYXJkIiwibW9kYWwiLCJhbmltYXRpb24iLCJkb20iLCJnbG9iYWxFdmVudCIsIm5hdmlnYXRvck1vZHVsZSIsIndlYnZpZXciLCJtb2R1bGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkEsQUFFQSxJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQnpCLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUE7QUFDekIsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQTtBQUMvQixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQTtBQUNqQyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUE7QUFDakIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFBOzs7Ozs7Ozs7O0FBVWxCLFNBQVMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtFQUNuQyxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUE7RUFDWixPQUFPLEVBQUUsRUFBRTtJQUNULElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksR0FBRyxFQUFFO01BQ2pDLE9BQU8sRUFBRTtLQUNWO0lBQ0QsRUFBRSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUE7R0FDbkI7RUFDRCxPQUFPLElBQUk7Q0FDWjs7Ozs7Ozs7O0FBU0QsU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7RUFDdkMsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQTtFQUN6QyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUE7O0VBRWpDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO0lBQzdCLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxFQUFFO01BQ25CLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7S0FDcEI7R0FDRjs7Ozs7O0VBTUQsS0FBSyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUE7O0VBRW5CLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7Q0FDN0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JELFNBQVMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7RUFDNUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBO0VBQ3hFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO01BQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztNQUM3QyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0VBQzFCLElBQUksU0FBUyxHQUFHO0lBQ2QsRUFBRTtNQUNBLEtBQUssR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7TUFDN0IsS0FBSyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUMvQixFQUFFO01BQ0EsS0FBSyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztNQUM3QixLQUFLLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTs7RUFFbEMsT0FBTztJQUNMLE1BQU0sRUFBRSxNQUFNO0lBQ2QsS0FBSyxFQUFFLEtBQUs7SUFDWixTQUFTLEVBQUUsU0FBUztJQUNwQixNQUFNLEVBQUU7TUFDTixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsU0FB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QUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLGlCQUFpQixFQUFFLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxFQUFFLG9CQUFvQixFQUFFLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxDQUFDLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLGlCQUFpQixFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFF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QUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUEsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsRUFBQSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFBLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQSxHQUFHLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxFQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBQSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFBLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFBLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxFQUFBLEtBQUssRUFBQSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsTUFBQSxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyx3SEFBd0gsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQSxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBQSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsT0FBTyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FB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