4032 lines
No EOL
280 KiB
JavaScript
4032 lines
No EOL
280 KiB
JavaScript
/******/ (function() { // webpackBootstrap
|
|
/******/ "use strict";
|
|
/******/ var __webpack_modules__ = ({
|
|
|
|
/***/ "./node_modules/@splidejs/splide/dist/js/splide.esm.js":
|
|
/*!*************************************************************!*\
|
|
!*** ./node_modules/@splidejs/splide/dist/js/splide.esm.js ***!
|
|
\*************************************************************/
|
|
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
/* harmony export */ "CLASSES": function() { return /* binding */ CLASSES; },
|
|
/* harmony export */ "CLASS_ACTIVE": function() { return /* binding */ CLASS_ACTIVE; },
|
|
/* harmony export */ "CLASS_ARROW": function() { return /* binding */ CLASS_ARROW; },
|
|
/* harmony export */ "CLASS_ARROWS": function() { return /* binding */ CLASS_ARROWS; },
|
|
/* harmony export */ "CLASS_ARROW_NEXT": function() { return /* binding */ CLASS_ARROW_NEXT; },
|
|
/* harmony export */ "CLASS_ARROW_PREV": function() { return /* binding */ CLASS_ARROW_PREV; },
|
|
/* harmony export */ "CLASS_CLONE": function() { return /* binding */ CLASS_CLONE; },
|
|
/* harmony export */ "CLASS_CONTAINER": function() { return /* binding */ CLASS_CONTAINER; },
|
|
/* harmony export */ "CLASS_FOCUS_IN": function() { return /* binding */ CLASS_FOCUS_IN; },
|
|
/* harmony export */ "CLASS_INITIALIZED": function() { return /* binding */ CLASS_INITIALIZED; },
|
|
/* harmony export */ "CLASS_LIST": function() { return /* binding */ CLASS_LIST; },
|
|
/* harmony export */ "CLASS_LOADING": function() { return /* binding */ CLASS_LOADING; },
|
|
/* harmony export */ "CLASS_NEXT": function() { return /* binding */ CLASS_NEXT; },
|
|
/* harmony export */ "CLASS_PAGINATION": function() { return /* binding */ CLASS_PAGINATION; },
|
|
/* harmony export */ "CLASS_PAGINATION_PAGE": function() { return /* binding */ CLASS_PAGINATION_PAGE; },
|
|
/* harmony export */ "CLASS_PREV": function() { return /* binding */ CLASS_PREV; },
|
|
/* harmony export */ "CLASS_PROGRESS": function() { return /* binding */ CLASS_PROGRESS; },
|
|
/* harmony export */ "CLASS_PROGRESS_BAR": function() { return /* binding */ CLASS_PROGRESS_BAR; },
|
|
/* harmony export */ "CLASS_ROOT": function() { return /* binding */ CLASS_ROOT; },
|
|
/* harmony export */ "CLASS_SLIDE": function() { return /* binding */ CLASS_SLIDE; },
|
|
/* harmony export */ "CLASS_SPINNER": function() { return /* binding */ CLASS_SPINNER; },
|
|
/* harmony export */ "CLASS_SR": function() { return /* binding */ CLASS_SR; },
|
|
/* harmony export */ "CLASS_TOGGLE": function() { return /* binding */ CLASS_TOGGLE; },
|
|
/* harmony export */ "CLASS_TOGGLE_PAUSE": function() { return /* binding */ CLASS_TOGGLE_PAUSE; },
|
|
/* harmony export */ "CLASS_TOGGLE_PLAY": function() { return /* binding */ CLASS_TOGGLE_PLAY; },
|
|
/* harmony export */ "CLASS_TRACK": function() { return /* binding */ CLASS_TRACK; },
|
|
/* harmony export */ "CLASS_VISIBLE": function() { return /* binding */ CLASS_VISIBLE; },
|
|
/* harmony export */ "DEFAULTS": function() { return /* binding */ DEFAULTS; },
|
|
/* harmony export */ "EVENT_ACTIVE": function() { return /* binding */ EVENT_ACTIVE; },
|
|
/* harmony export */ "EVENT_ARROWS_MOUNTED": function() { return /* binding */ EVENT_ARROWS_MOUNTED; },
|
|
/* harmony export */ "EVENT_ARROWS_UPDATED": function() { return /* binding */ EVENT_ARROWS_UPDATED; },
|
|
/* harmony export */ "EVENT_AUTOPLAY_PAUSE": function() { return /* binding */ EVENT_AUTOPLAY_PAUSE; },
|
|
/* harmony export */ "EVENT_AUTOPLAY_PLAY": function() { return /* binding */ EVENT_AUTOPLAY_PLAY; },
|
|
/* harmony export */ "EVENT_AUTOPLAY_PLAYING": function() { return /* binding */ EVENT_AUTOPLAY_PLAYING; },
|
|
/* harmony export */ "EVENT_CLICK": function() { return /* binding */ EVENT_CLICK; },
|
|
/* harmony export */ "EVENT_DESTROY": function() { return /* binding */ EVENT_DESTROY; },
|
|
/* harmony export */ "EVENT_DRAG": function() { return /* binding */ EVENT_DRAG; },
|
|
/* harmony export */ "EVENT_DRAGGED": function() { return /* binding */ EVENT_DRAGGED; },
|
|
/* harmony export */ "EVENT_DRAGGING": function() { return /* binding */ EVENT_DRAGGING; },
|
|
/* harmony export */ "EVENT_HIDDEN": function() { return /* binding */ EVENT_HIDDEN; },
|
|
/* harmony export */ "EVENT_INACTIVE": function() { return /* binding */ EVENT_INACTIVE; },
|
|
/* harmony export */ "EVENT_LAZYLOAD_LOADED": function() { return /* binding */ EVENT_LAZYLOAD_LOADED; },
|
|
/* harmony export */ "EVENT_MOUNTED": function() { return /* binding */ EVENT_MOUNTED; },
|
|
/* harmony export */ "EVENT_MOVE": function() { return /* binding */ EVENT_MOVE; },
|
|
/* harmony export */ "EVENT_MOVED": function() { return /* binding */ EVENT_MOVED; },
|
|
/* harmony export */ "EVENT_NAVIGATION_MOUNTED": function() { return /* binding */ EVENT_NAVIGATION_MOUNTED; },
|
|
/* harmony export */ "EVENT_PAGINATION_MOUNTED": function() { return /* binding */ EVENT_PAGINATION_MOUNTED; },
|
|
/* harmony export */ "EVENT_PAGINATION_UPDATED": function() { return /* binding */ EVENT_PAGINATION_UPDATED; },
|
|
/* harmony export */ "EVENT_READY": function() { return /* binding */ EVENT_READY; },
|
|
/* harmony export */ "EVENT_REFRESH": function() { return /* binding */ EVENT_REFRESH; },
|
|
/* harmony export */ "EVENT_RESIZE": function() { return /* binding */ EVENT_RESIZE; },
|
|
/* harmony export */ "EVENT_RESIZED": function() { return /* binding */ EVENT_RESIZED; },
|
|
/* harmony export */ "EVENT_SCROLL": function() { return /* binding */ EVENT_SCROLL; },
|
|
/* harmony export */ "EVENT_SCROLLED": function() { return /* binding */ EVENT_SCROLLED; },
|
|
/* harmony export */ "EVENT_SHIFTED": function() { return /* binding */ EVENT_SHIFTED; },
|
|
/* harmony export */ "EVENT_SLIDE_KEYDOWN": function() { return /* binding */ EVENT_SLIDE_KEYDOWN; },
|
|
/* harmony export */ "EVENT_UPDATED": function() { return /* binding */ EVENT_UPDATED; },
|
|
/* harmony export */ "EVENT_VISIBLE": function() { return /* binding */ EVENT_VISIBLE; },
|
|
/* harmony export */ "EventBinder": function() { return /* binding */ EventBinder; },
|
|
/* harmony export */ "EventInterface": function() { return /* binding */ EventInterface; },
|
|
/* harmony export */ "FADE": function() { return /* binding */ FADE; },
|
|
/* harmony export */ "LOOP": function() { return /* binding */ LOOP; },
|
|
/* harmony export */ "LTR": function() { return /* binding */ LTR; },
|
|
/* harmony export */ "RTL": function() { return /* binding */ RTL; },
|
|
/* harmony export */ "RequestInterval": function() { return /* binding */ RequestInterval; },
|
|
/* harmony export */ "SLIDE": function() { return /* binding */ SLIDE; },
|
|
/* harmony export */ "STATUS_CLASSES": function() { return /* binding */ STATUS_CLASSES; },
|
|
/* harmony export */ "Splide": function() { return /* binding */ Splide; },
|
|
/* harmony export */ "SplideRenderer": function() { return /* binding */ SplideRenderer; },
|
|
/* harmony export */ "State": function() { return /* binding */ State; },
|
|
/* harmony export */ "TTB": function() { return /* binding */ TTB; },
|
|
/* harmony export */ "Throttle": function() { return /* binding */ Throttle; },
|
|
/* harmony export */ "default": function() { return /* binding */ Splide; }
|
|
/* harmony export */ });
|
|
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
|
|
|
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
|
|
/*!
|
|
* Splide.js
|
|
* Version : 4.0.7
|
|
* License : MIT
|
|
* Copyright: 2022 Naotoshi Fujita
|
|
*/
|
|
var MEDIA_PREFERS_REDUCED_MOTION = "(prefers-reduced-motion: reduce)";
|
|
var CREATED = 1;
|
|
var MOUNTED = 2;
|
|
var IDLE = 3;
|
|
var MOVING = 4;
|
|
var SCROLLING = 5;
|
|
var DRAGGING = 6;
|
|
var DESTROYED = 7;
|
|
var STATES = {
|
|
CREATED: CREATED,
|
|
MOUNTED: MOUNTED,
|
|
IDLE: IDLE,
|
|
MOVING: MOVING,
|
|
SCROLLING: SCROLLING,
|
|
DRAGGING: DRAGGING,
|
|
DESTROYED: DESTROYED
|
|
};
|
|
|
|
function empty(array) {
|
|
array.length = 0;
|
|
}
|
|
|
|
function slice(arrayLike, start, end) {
|
|
return Array.prototype.slice.call(arrayLike, start, end);
|
|
}
|
|
|
|
function apply(func) {
|
|
return func.bind.apply(func, [null].concat(slice(arguments, 1)));
|
|
}
|
|
|
|
var nextTick = setTimeout;
|
|
|
|
var noop = function noop() {};
|
|
|
|
function raf(func) {
|
|
return requestAnimationFrame(func);
|
|
}
|
|
|
|
function typeOf(type, subject) {
|
|
return typeof subject === type;
|
|
}
|
|
|
|
function isObject(subject) {
|
|
return !isNull(subject) && typeOf("object", subject);
|
|
}
|
|
|
|
var isArray = Array.isArray;
|
|
var isFunction = apply(typeOf, "function");
|
|
var isString = apply(typeOf, "string");
|
|
var isUndefined = apply(typeOf, "undefined");
|
|
|
|
function isNull(subject) {
|
|
return subject === null;
|
|
}
|
|
|
|
function isHTMLElement(subject) {
|
|
return subject instanceof HTMLElement;
|
|
}
|
|
|
|
function toArray(value) {
|
|
return isArray(value) ? value : [value];
|
|
}
|
|
|
|
function forEach(values, iteratee) {
|
|
toArray(values).forEach(iteratee);
|
|
}
|
|
|
|
function includes(array, value) {
|
|
return array.indexOf(value) > -1;
|
|
}
|
|
|
|
function push(array, items) {
|
|
array.push.apply(array, toArray(items));
|
|
return array;
|
|
}
|
|
|
|
function toggleClass(elm, classes, add) {
|
|
if (elm) {
|
|
forEach(classes, function (name) {
|
|
if (name) {
|
|
elm.classList[add ? "add" : "remove"](name);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
function addClass(elm, classes) {
|
|
toggleClass(elm, isString(classes) ? classes.split(" ") : classes, true);
|
|
}
|
|
|
|
function append(parent, children) {
|
|
forEach(children, parent.appendChild.bind(parent));
|
|
}
|
|
|
|
function before(nodes, ref) {
|
|
forEach(nodes, function (node) {
|
|
var parent = (ref || node).parentNode;
|
|
|
|
if (parent) {
|
|
parent.insertBefore(node, ref);
|
|
}
|
|
});
|
|
}
|
|
|
|
function matches(elm, selector) {
|
|
return isHTMLElement(elm) && (elm["msMatchesSelector"] || elm.matches).call(elm, selector);
|
|
}
|
|
|
|
function children(parent, selector) {
|
|
var children2 = parent ? slice(parent.children) : [];
|
|
return selector ? children2.filter(function (child) {
|
|
return matches(child, selector);
|
|
}) : children2;
|
|
}
|
|
|
|
function child(parent, selector) {
|
|
return selector ? children(parent, selector)[0] : parent.firstElementChild;
|
|
}
|
|
|
|
var ownKeys = Object.keys;
|
|
|
|
function forOwn(object, iteratee, right) {
|
|
if (object) {
|
|
var keys = ownKeys(object);
|
|
keys = right ? keys.reverse() : keys;
|
|
|
|
for (var i = 0; i < keys.length; i++) {
|
|
var key = keys[i];
|
|
|
|
if (key !== "__proto__") {
|
|
if (iteratee(object[key], key) === false) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return object;
|
|
}
|
|
|
|
function assign(object) {
|
|
slice(arguments, 1).forEach(function (source) {
|
|
forOwn(source, function (value, key) {
|
|
object[key] = source[key];
|
|
});
|
|
});
|
|
return object;
|
|
}
|
|
|
|
function merge(object) {
|
|
slice(arguments, 1).forEach(function (source) {
|
|
forOwn(source, function (value, key) {
|
|
if (isArray(value)) {
|
|
object[key] = value.slice();
|
|
} else if (isObject(value)) {
|
|
object[key] = merge({}, isObject(object[key]) ? object[key] : {}, value);
|
|
} else {
|
|
object[key] = value;
|
|
}
|
|
});
|
|
});
|
|
return object;
|
|
}
|
|
|
|
function omit(object, keys) {
|
|
toArray(keys || ownKeys(object)).forEach(function (key) {
|
|
delete object[key];
|
|
});
|
|
}
|
|
|
|
function removeAttribute(elms, attrs) {
|
|
forEach(elms, function (elm) {
|
|
forEach(attrs, function (attr) {
|
|
elm && elm.removeAttribute(attr);
|
|
});
|
|
});
|
|
}
|
|
|
|
function setAttribute(elms, attrs, value) {
|
|
if (isObject(attrs)) {
|
|
forOwn(attrs, function (value2, name) {
|
|
setAttribute(elms, name, value2);
|
|
});
|
|
} else {
|
|
forEach(elms, function (elm) {
|
|
isNull(value) || value === "" ? removeAttribute(elm, attrs) : elm.setAttribute(attrs, String(value));
|
|
});
|
|
}
|
|
}
|
|
|
|
function create(tag, attrs, parent) {
|
|
var elm = document.createElement(tag);
|
|
|
|
if (attrs) {
|
|
isString(attrs) ? addClass(elm, attrs) : setAttribute(elm, attrs);
|
|
}
|
|
|
|
parent && append(parent, elm);
|
|
return elm;
|
|
}
|
|
|
|
function style(elm, prop, value) {
|
|
if (isUndefined(value)) {
|
|
return getComputedStyle(elm)[prop];
|
|
}
|
|
|
|
if (!isNull(value)) {
|
|
elm.style[prop] = "" + value;
|
|
}
|
|
}
|
|
|
|
function display(elm, display2) {
|
|
style(elm, "display", display2);
|
|
}
|
|
|
|
function focus(elm) {
|
|
elm["setActive"] && elm["setActive"]() || elm.focus({
|
|
preventScroll: true
|
|
});
|
|
}
|
|
|
|
function getAttribute(elm, attr) {
|
|
return elm.getAttribute(attr);
|
|
}
|
|
|
|
function hasClass(elm, className) {
|
|
return elm && elm.classList.contains(className);
|
|
}
|
|
|
|
function rect(target) {
|
|
return target.getBoundingClientRect();
|
|
}
|
|
|
|
function remove(nodes) {
|
|
forEach(nodes, function (node) {
|
|
if (node && node.parentNode) {
|
|
node.parentNode.removeChild(node);
|
|
}
|
|
});
|
|
}
|
|
|
|
function parseHtml(html) {
|
|
return child(new DOMParser().parseFromString(html, "text/html").body);
|
|
}
|
|
|
|
function prevent(e, stopPropagation) {
|
|
e.preventDefault();
|
|
|
|
if (stopPropagation) {
|
|
e.stopPropagation();
|
|
e.stopImmediatePropagation();
|
|
}
|
|
}
|
|
|
|
function query(parent, selector) {
|
|
return parent && parent.querySelector(selector);
|
|
}
|
|
|
|
function queryAll(parent, selector) {
|
|
return selector ? slice(parent.querySelectorAll(selector)) : [];
|
|
}
|
|
|
|
function removeClass(elm, classes) {
|
|
toggleClass(elm, classes, false);
|
|
}
|
|
|
|
function timeOf(e) {
|
|
return e.timeStamp;
|
|
}
|
|
|
|
function unit(value) {
|
|
return isString(value) ? value : value ? value + "px" : "";
|
|
}
|
|
|
|
var PROJECT_CODE = "splide";
|
|
var DATA_ATTRIBUTE = "data-" + PROJECT_CODE;
|
|
|
|
function assert(condition, message) {
|
|
if (!condition) {
|
|
throw new Error("[" + PROJECT_CODE + "] " + (message || ""));
|
|
}
|
|
}
|
|
|
|
var min = Math.min,
|
|
max = Math.max,
|
|
floor = Math.floor,
|
|
ceil = Math.ceil,
|
|
abs = Math.abs;
|
|
|
|
function approximatelyEqual(x, y, epsilon) {
|
|
return abs(x - y) < epsilon;
|
|
}
|
|
|
|
function between(number, minOrMax, maxOrMin, exclusive) {
|
|
var minimum = min(minOrMax, maxOrMin);
|
|
var maximum = max(minOrMax, maxOrMin);
|
|
return exclusive ? minimum < number && number < maximum : minimum <= number && number <= maximum;
|
|
}
|
|
|
|
function clamp(number, x, y) {
|
|
var minimum = min(x, y);
|
|
var maximum = max(x, y);
|
|
return min(max(minimum, number), maximum);
|
|
}
|
|
|
|
function sign(x) {
|
|
return +(x > 0) - +(x < 0);
|
|
}
|
|
|
|
function camelToKebab(string) {
|
|
return string.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
|
|
}
|
|
|
|
function format(string, replacements) {
|
|
forEach(replacements, function (replacement) {
|
|
string = string.replace("%s", "" + replacement);
|
|
});
|
|
return string;
|
|
}
|
|
|
|
function pad(number) {
|
|
return number < 10 ? "0" + number : "" + number;
|
|
}
|
|
|
|
var ids = {};
|
|
|
|
function uniqueId(prefix) {
|
|
return "" + prefix + pad(ids[prefix] = (ids[prefix] || 0) + 1);
|
|
}
|
|
|
|
function EventBinder() {
|
|
var listeners = [];
|
|
|
|
function bind(targets, events, callback, options) {
|
|
forEachEvent(targets, events, function (target, event, namespace) {
|
|
var isEventTarget = ("addEventListener" in target);
|
|
var remover = isEventTarget ? target.removeEventListener.bind(target, event, callback, options) : target["removeListener"].bind(target, callback);
|
|
isEventTarget ? target.addEventListener(event, callback, options) : target["addListener"](callback);
|
|
listeners.push([target, event, namespace, callback, remover]);
|
|
});
|
|
}
|
|
|
|
function unbind(targets, events, callback) {
|
|
forEachEvent(targets, events, function (target, event, namespace) {
|
|
listeners = listeners.filter(function (listener) {
|
|
if (listener[0] === target && listener[1] === event && listener[2] === namespace && (!callback || listener[3] === callback)) {
|
|
listener[4]();
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
});
|
|
});
|
|
}
|
|
|
|
function dispatch(target, type, detail) {
|
|
var e;
|
|
var bubbles = true;
|
|
|
|
if (typeof CustomEvent === "function") {
|
|
e = new CustomEvent(type, {
|
|
bubbles: bubbles,
|
|
detail: detail
|
|
});
|
|
} else {
|
|
e = document.createEvent("CustomEvent");
|
|
e.initCustomEvent(type, bubbles, false, detail);
|
|
}
|
|
|
|
target.dispatchEvent(e);
|
|
return e;
|
|
}
|
|
|
|
function forEachEvent(targets, events, iteratee) {
|
|
forEach(targets, function (target) {
|
|
target && forEach(events, function (events2) {
|
|
events2.split(" ").forEach(function (eventNS) {
|
|
var fragment = eventNS.split(".");
|
|
iteratee(target, fragment[0], fragment[1]);
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
function destroy() {
|
|
listeners.forEach(function (data) {
|
|
data[4]();
|
|
});
|
|
empty(listeners);
|
|
}
|
|
|
|
return {
|
|
bind: bind,
|
|
unbind: unbind,
|
|
dispatch: dispatch,
|
|
destroy: destroy
|
|
};
|
|
}
|
|
|
|
var EVENT_MOUNTED = "mounted";
|
|
var EVENT_READY = "ready";
|
|
var EVENT_MOVE = "move";
|
|
var EVENT_MOVED = "moved";
|
|
var EVENT_SHIFTED = "shifted";
|
|
var EVENT_CLICK = "click";
|
|
var EVENT_ACTIVE = "active";
|
|
var EVENT_INACTIVE = "inactive";
|
|
var EVENT_VISIBLE = "visible";
|
|
var EVENT_HIDDEN = "hidden";
|
|
var EVENT_SLIDE_KEYDOWN = "slide:keydown";
|
|
var EVENT_REFRESH = "refresh";
|
|
var EVENT_UPDATED = "updated";
|
|
var EVENT_RESIZE = "resize";
|
|
var EVENT_RESIZED = "resized";
|
|
var EVENT_DRAG = "drag";
|
|
var EVENT_DRAGGING = "dragging";
|
|
var EVENT_DRAGGED = "dragged";
|
|
var EVENT_SCROLL = "scroll";
|
|
var EVENT_SCROLLED = "scrolled";
|
|
var EVENT_DESTROY = "destroy";
|
|
var EVENT_ARROWS_MOUNTED = "arrows:mounted";
|
|
var EVENT_ARROWS_UPDATED = "arrows:updated";
|
|
var EVENT_PAGINATION_MOUNTED = "pagination:mounted";
|
|
var EVENT_PAGINATION_UPDATED = "pagination:updated";
|
|
var EVENT_NAVIGATION_MOUNTED = "navigation:mounted";
|
|
var EVENT_AUTOPLAY_PLAY = "autoplay:play";
|
|
var EVENT_AUTOPLAY_PLAYING = "autoplay:playing";
|
|
var EVENT_AUTOPLAY_PAUSE = "autoplay:pause";
|
|
var EVENT_LAZYLOAD_LOADED = "lazyload:loaded";
|
|
|
|
function EventInterface(Splide2) {
|
|
var bus = Splide2 ? Splide2.event.bus : document.createDocumentFragment();
|
|
var binder = EventBinder();
|
|
|
|
function on(events, callback) {
|
|
binder.bind(bus, toArray(events).join(" "), function (e) {
|
|
callback.apply(callback, isArray(e.detail) ? e.detail : []);
|
|
});
|
|
}
|
|
|
|
function emit(event) {
|
|
binder.dispatch(bus, event, slice(arguments, 1));
|
|
}
|
|
|
|
if (Splide2) {
|
|
Splide2.event.on(EVENT_DESTROY, binder.destroy);
|
|
}
|
|
|
|
return assign(binder, {
|
|
bus: bus,
|
|
on: on,
|
|
off: apply(binder.unbind, bus),
|
|
emit: emit
|
|
});
|
|
}
|
|
|
|
function RequestInterval(interval, onInterval, onUpdate, limit) {
|
|
var now = Date.now;
|
|
var startTime;
|
|
var rate = 0;
|
|
var id;
|
|
var paused = true;
|
|
var count = 0;
|
|
|
|
function update() {
|
|
if (!paused) {
|
|
rate = interval ? min((now() - startTime) / interval, 1) : 1;
|
|
onUpdate && onUpdate(rate);
|
|
|
|
if (rate >= 1) {
|
|
onInterval();
|
|
startTime = now();
|
|
|
|
if (limit && ++count >= limit) {
|
|
return pause();
|
|
}
|
|
}
|
|
|
|
raf(update);
|
|
}
|
|
}
|
|
|
|
function start(resume) {
|
|
!resume && cancel();
|
|
startTime = now() - (resume ? rate * interval : 0);
|
|
paused = false;
|
|
raf(update);
|
|
}
|
|
|
|
function pause() {
|
|
paused = true;
|
|
}
|
|
|
|
function rewind() {
|
|
startTime = now();
|
|
rate = 0;
|
|
|
|
if (onUpdate) {
|
|
onUpdate(rate);
|
|
}
|
|
}
|
|
|
|
function cancel() {
|
|
id && cancelAnimationFrame(id);
|
|
rate = 0;
|
|
id = 0;
|
|
paused = true;
|
|
}
|
|
|
|
function set(time) {
|
|
interval = time;
|
|
}
|
|
|
|
function isPaused() {
|
|
return paused;
|
|
}
|
|
|
|
return {
|
|
start: start,
|
|
rewind: rewind,
|
|
pause: pause,
|
|
cancel: cancel,
|
|
set: set,
|
|
isPaused: isPaused
|
|
};
|
|
}
|
|
|
|
function State(initialState) {
|
|
var state = initialState;
|
|
|
|
function set(value) {
|
|
state = value;
|
|
}
|
|
|
|
function is(states) {
|
|
return includes(toArray(states), state);
|
|
}
|
|
|
|
return {
|
|
set: set,
|
|
is: is
|
|
};
|
|
}
|
|
|
|
function Throttle(func, duration) {
|
|
var interval;
|
|
|
|
function throttled() {
|
|
if (!interval) {
|
|
interval = RequestInterval(duration || 0, function () {
|
|
func();
|
|
interval = null;
|
|
}, null, 1);
|
|
interval.start();
|
|
}
|
|
}
|
|
|
|
return throttled;
|
|
}
|
|
|
|
function Media(Splide2, Components2, options) {
|
|
var state = Splide2.state;
|
|
var breakpoints = options.breakpoints || {};
|
|
var reducedMotion = options.reducedMotion || {};
|
|
var binder = EventBinder();
|
|
var queries = [];
|
|
|
|
function setup() {
|
|
var isMin = options.mediaQuery === "min";
|
|
ownKeys(breakpoints).sort(function (n, m) {
|
|
return isMin ? +n - +m : +m - +n;
|
|
}).forEach(function (key) {
|
|
register(breakpoints[key], "(" + (isMin ? "min" : "max") + "-width:" + key + "px)");
|
|
});
|
|
register(reducedMotion, MEDIA_PREFERS_REDUCED_MOTION);
|
|
update();
|
|
}
|
|
|
|
function destroy(completely) {
|
|
if (completely) {
|
|
binder.destroy();
|
|
}
|
|
}
|
|
|
|
function register(options2, query) {
|
|
var queryList = matchMedia(query);
|
|
binder.bind(queryList, "change", update);
|
|
queries.push([options2, queryList]);
|
|
}
|
|
|
|
function update() {
|
|
var destroyed = state.is(DESTROYED);
|
|
var direction = options.direction;
|
|
var merged = queries.reduce(function (merged2, entry) {
|
|
return merge(merged2, entry[1].matches ? entry[0] : {});
|
|
}, {});
|
|
omit(options);
|
|
set(merged);
|
|
|
|
if (options.destroy) {
|
|
Splide2.destroy(options.destroy === "completely");
|
|
} else if (destroyed) {
|
|
destroy(true);
|
|
Splide2.mount();
|
|
} else {
|
|
direction !== options.direction && Splide2.refresh();
|
|
}
|
|
}
|
|
|
|
function reduce(enable) {
|
|
if (matchMedia(MEDIA_PREFERS_REDUCED_MOTION).matches) {
|
|
enable ? merge(options, reducedMotion) : omit(options, ownKeys(reducedMotion));
|
|
}
|
|
}
|
|
|
|
function set(opts, user) {
|
|
merge(options, opts);
|
|
user && merge(Object.getPrototypeOf(options), opts);
|
|
|
|
if (!state.is(CREATED)) {
|
|
Splide2.emit(EVENT_UPDATED, options);
|
|
}
|
|
}
|
|
|
|
return {
|
|
setup: setup,
|
|
destroy: destroy,
|
|
reduce: reduce,
|
|
set: set
|
|
};
|
|
}
|
|
|
|
var ARROW = "Arrow";
|
|
var ARROW_LEFT = ARROW + "Left";
|
|
var ARROW_RIGHT = ARROW + "Right";
|
|
var ARROW_UP = ARROW + "Up";
|
|
var ARROW_DOWN = ARROW + "Down";
|
|
var LTR = "ltr";
|
|
var RTL = "rtl";
|
|
var TTB = "ttb";
|
|
var ORIENTATION_MAP = {
|
|
width: ["height"],
|
|
left: ["top", "right"],
|
|
right: ["bottom", "left"],
|
|
x: ["y"],
|
|
X: ["Y"],
|
|
Y: ["X"],
|
|
ArrowLeft: [ARROW_UP, ARROW_RIGHT],
|
|
ArrowRight: [ARROW_DOWN, ARROW_LEFT]
|
|
};
|
|
|
|
function Direction(Splide2, Components2, options) {
|
|
function resolve(prop, axisOnly, direction) {
|
|
direction = direction || options.direction;
|
|
var index = direction === RTL && !axisOnly ? 1 : direction === TTB ? 0 : -1;
|
|
return ORIENTATION_MAP[prop] && ORIENTATION_MAP[prop][index] || prop.replace(/width|left|right/i, function (match, offset) {
|
|
var replacement = ORIENTATION_MAP[match.toLowerCase()][index] || match;
|
|
return offset > 0 ? replacement.charAt(0).toUpperCase() + replacement.slice(1) : replacement;
|
|
});
|
|
}
|
|
|
|
function orient(value) {
|
|
return value * (options.direction === RTL ? 1 : -1);
|
|
}
|
|
|
|
return {
|
|
resolve: resolve,
|
|
orient: orient
|
|
};
|
|
}
|
|
|
|
var ROLE = "role";
|
|
var TAB_INDEX = "tabindex";
|
|
var DISABLED = "disabled";
|
|
var ARIA_PREFIX = "aria-";
|
|
var ARIA_CONTROLS = ARIA_PREFIX + "controls";
|
|
var ARIA_CURRENT = ARIA_PREFIX + "current";
|
|
var ARIA_SELECTED = ARIA_PREFIX + "selected";
|
|
var ARIA_LABEL = ARIA_PREFIX + "label";
|
|
var ARIA_LABELLEDBY = ARIA_PREFIX + "labelledby";
|
|
var ARIA_HIDDEN = ARIA_PREFIX + "hidden";
|
|
var ARIA_ORIENTATION = ARIA_PREFIX + "orientation";
|
|
var ARIA_ROLEDESCRIPTION = ARIA_PREFIX + "roledescription";
|
|
var ARIA_LIVE = ARIA_PREFIX + "live";
|
|
var ARIA_BUSY = ARIA_PREFIX + "busy";
|
|
var ARIA_ATOMIC = ARIA_PREFIX + "atomic";
|
|
var ALL_ATTRIBUTES = [ROLE, TAB_INDEX, DISABLED, ARIA_CONTROLS, ARIA_CURRENT, ARIA_LABEL, ARIA_LABELLEDBY, ARIA_HIDDEN, ARIA_ORIENTATION, ARIA_ROLEDESCRIPTION];
|
|
var CLASS_ROOT = PROJECT_CODE;
|
|
var CLASS_TRACK = PROJECT_CODE + "__track";
|
|
var CLASS_LIST = PROJECT_CODE + "__list";
|
|
var CLASS_SLIDE = PROJECT_CODE + "__slide";
|
|
var CLASS_CLONE = CLASS_SLIDE + "--clone";
|
|
var CLASS_CONTAINER = CLASS_SLIDE + "__container";
|
|
var CLASS_ARROWS = PROJECT_CODE + "__arrows";
|
|
var CLASS_ARROW = PROJECT_CODE + "__arrow";
|
|
var CLASS_ARROW_PREV = CLASS_ARROW + "--prev";
|
|
var CLASS_ARROW_NEXT = CLASS_ARROW + "--next";
|
|
var CLASS_PAGINATION = PROJECT_CODE + "__pagination";
|
|
var CLASS_PAGINATION_PAGE = CLASS_PAGINATION + "__page";
|
|
var CLASS_PROGRESS = PROJECT_CODE + "__progress";
|
|
var CLASS_PROGRESS_BAR = CLASS_PROGRESS + "__bar";
|
|
var CLASS_TOGGLE = PROJECT_CODE + "__toggle";
|
|
var CLASS_TOGGLE_PLAY = CLASS_TOGGLE + "__play";
|
|
var CLASS_TOGGLE_PAUSE = CLASS_TOGGLE + "__pause";
|
|
var CLASS_SPINNER = PROJECT_CODE + "__spinner";
|
|
var CLASS_SR = PROJECT_CODE + "__sr";
|
|
var CLASS_INITIALIZED = "is-initialized";
|
|
var CLASS_ACTIVE = "is-active";
|
|
var CLASS_PREV = "is-prev";
|
|
var CLASS_NEXT = "is-next";
|
|
var CLASS_VISIBLE = "is-visible";
|
|
var CLASS_LOADING = "is-loading";
|
|
var CLASS_FOCUS_IN = "is-focus-in";
|
|
var STATUS_CLASSES = [CLASS_ACTIVE, CLASS_VISIBLE, CLASS_PREV, CLASS_NEXT, CLASS_LOADING, CLASS_FOCUS_IN];
|
|
var CLASSES = {
|
|
slide: CLASS_SLIDE,
|
|
clone: CLASS_CLONE,
|
|
arrows: CLASS_ARROWS,
|
|
arrow: CLASS_ARROW,
|
|
prev: CLASS_ARROW_PREV,
|
|
next: CLASS_ARROW_NEXT,
|
|
pagination: CLASS_PAGINATION,
|
|
page: CLASS_PAGINATION_PAGE,
|
|
spinner: CLASS_SPINNER
|
|
};
|
|
|
|
function closest(from, selector) {
|
|
if (isFunction(from.closest)) {
|
|
return from.closest(selector);
|
|
}
|
|
|
|
var elm = from;
|
|
|
|
while (elm && elm.nodeType === 1) {
|
|
if (matches(elm, selector)) {
|
|
break;
|
|
}
|
|
|
|
elm = elm.parentElement;
|
|
}
|
|
|
|
return elm;
|
|
}
|
|
|
|
var FRICTION = 5;
|
|
var LOG_INTERVAL = 200;
|
|
var POINTER_DOWN_EVENTS = "touchstart mousedown";
|
|
var POINTER_MOVE_EVENTS = "touchmove mousemove";
|
|
var POINTER_UP_EVENTS = "touchend touchcancel mouseup click";
|
|
|
|
function Elements(Splide2, Components2, options) {
|
|
var _EventInterface = EventInterface(Splide2),
|
|
on = _EventInterface.on,
|
|
bind = _EventInterface.bind;
|
|
|
|
var root = Splide2.root;
|
|
var i18n = options.i18n;
|
|
var elements = {};
|
|
var slides = [];
|
|
var rootClasses = [];
|
|
var trackClasses = [];
|
|
var track;
|
|
var list;
|
|
var isUsingKey;
|
|
|
|
function setup() {
|
|
collect();
|
|
init();
|
|
update();
|
|
}
|
|
|
|
function mount() {
|
|
on(EVENT_REFRESH, destroy);
|
|
on(EVENT_REFRESH, setup);
|
|
on(EVENT_UPDATED, update);
|
|
bind(document, POINTER_DOWN_EVENTS + " keydown", function (e) {
|
|
isUsingKey = e.type === "keydown";
|
|
}, {
|
|
capture: true
|
|
});
|
|
bind(root, "focusin", function () {
|
|
toggleClass(root, CLASS_FOCUS_IN, !!isUsingKey);
|
|
});
|
|
}
|
|
|
|
function destroy(completely) {
|
|
var attrs = ALL_ATTRIBUTES.concat("style");
|
|
empty(slides);
|
|
removeClass(root, rootClasses);
|
|
removeClass(track, trackClasses);
|
|
removeAttribute([track, list], attrs);
|
|
removeAttribute(root, completely ? attrs : ["style", ARIA_ROLEDESCRIPTION]);
|
|
}
|
|
|
|
function update() {
|
|
removeClass(root, rootClasses);
|
|
removeClass(track, trackClasses);
|
|
rootClasses = getClasses(CLASS_ROOT);
|
|
trackClasses = getClasses(CLASS_TRACK);
|
|
addClass(root, rootClasses);
|
|
addClass(track, trackClasses);
|
|
setAttribute(root, ARIA_LABEL, options.label);
|
|
setAttribute(root, ARIA_LABELLEDBY, options.labelledby);
|
|
}
|
|
|
|
function collect() {
|
|
track = find("." + CLASS_TRACK);
|
|
list = child(track, "." + CLASS_LIST);
|
|
assert(track && list, "A track/list element is missing.");
|
|
push(slides, children(list, "." + CLASS_SLIDE + ":not(." + CLASS_CLONE + ")"));
|
|
forOwn({
|
|
arrows: CLASS_ARROWS,
|
|
pagination: CLASS_PAGINATION,
|
|
prev: CLASS_ARROW_PREV,
|
|
next: CLASS_ARROW_NEXT,
|
|
bar: CLASS_PROGRESS_BAR,
|
|
toggle: CLASS_TOGGLE
|
|
}, function (className, key) {
|
|
elements[key] = find("." + className);
|
|
});
|
|
assign(elements, {
|
|
root: root,
|
|
track: track,
|
|
list: list,
|
|
slides: slides
|
|
});
|
|
}
|
|
|
|
function init() {
|
|
var id = root.id || uniqueId(PROJECT_CODE);
|
|
var role = options.role;
|
|
root.id = id;
|
|
track.id = track.id || id + "-track";
|
|
list.id = list.id || id + "-list";
|
|
|
|
if (!getAttribute(root, ROLE) && root.tagName !== "SECTION" && role) {
|
|
setAttribute(root, ROLE, role);
|
|
}
|
|
|
|
setAttribute(root, ARIA_ROLEDESCRIPTION, i18n.carousel);
|
|
setAttribute(list, ROLE, "presentation");
|
|
}
|
|
|
|
function find(selector) {
|
|
var elm = query(root, selector);
|
|
return elm && closest(elm, "." + CLASS_ROOT) === root ? elm : void 0;
|
|
}
|
|
|
|
function getClasses(base) {
|
|
return [base + "--" + options.type, base + "--" + options.direction, options.drag && base + "--draggable", options.isNavigation && base + "--nav", base === CLASS_ROOT && CLASS_ACTIVE];
|
|
}
|
|
|
|
return assign(elements, {
|
|
setup: setup,
|
|
mount: mount,
|
|
destroy: destroy
|
|
});
|
|
}
|
|
|
|
var SLIDE = "slide";
|
|
var LOOP = "loop";
|
|
var FADE = "fade";
|
|
|
|
function Slide$1(Splide2, index, slideIndex, slide) {
|
|
var event = EventInterface(Splide2);
|
|
var on = event.on,
|
|
emit = event.emit,
|
|
bind = event.bind;
|
|
var Components = Splide2.Components,
|
|
root = Splide2.root,
|
|
options = Splide2.options;
|
|
var isNavigation = options.isNavigation,
|
|
updateOnMove = options.updateOnMove,
|
|
i18n = options.i18n,
|
|
pagination = options.pagination,
|
|
slideFocus = options.slideFocus;
|
|
var resolve = Components.Direction.resolve;
|
|
var styles = getAttribute(slide, "style");
|
|
var label = getAttribute(slide, ARIA_LABEL);
|
|
var isClone = slideIndex > -1;
|
|
var container = child(slide, "." + CLASS_CONTAINER);
|
|
var focusableNodes = queryAll(slide, options.focusableNodes || "");
|
|
var destroyed;
|
|
|
|
function mount() {
|
|
if (!isClone) {
|
|
slide.id = root.id + "-slide" + pad(index + 1);
|
|
setAttribute(slide, ROLE, pagination ? "tabpanel" : "group");
|
|
setAttribute(slide, ARIA_ROLEDESCRIPTION, i18n.slide);
|
|
setAttribute(slide, ARIA_LABEL, label || format(i18n.slideLabel, [index + 1, Splide2.length]));
|
|
}
|
|
|
|
listen();
|
|
}
|
|
|
|
function listen() {
|
|
bind(slide, "click", apply(emit, EVENT_CLICK, self));
|
|
bind(slide, "keydown", apply(emit, EVENT_SLIDE_KEYDOWN, self));
|
|
on([EVENT_MOVED, EVENT_SHIFTED, EVENT_SCROLLED], update);
|
|
on(EVENT_NAVIGATION_MOUNTED, initNavigation);
|
|
|
|
if (updateOnMove) {
|
|
on(EVENT_MOVE, onMove);
|
|
}
|
|
}
|
|
|
|
function destroy() {
|
|
destroyed = true;
|
|
event.destroy();
|
|
removeClass(slide, STATUS_CLASSES);
|
|
removeAttribute(slide, ALL_ATTRIBUTES);
|
|
setAttribute(slide, "style", styles);
|
|
setAttribute(slide, ARIA_LABEL, label || "");
|
|
}
|
|
|
|
function initNavigation() {
|
|
var controls = Splide2.splides.map(function (target) {
|
|
var Slide2 = target.splide.Components.Slides.getAt(index);
|
|
return Slide2 ? Slide2.slide.id : "";
|
|
}).join(" ");
|
|
setAttribute(slide, ARIA_LABEL, format(i18n.slideX, (isClone ? slideIndex : index) + 1));
|
|
setAttribute(slide, ARIA_CONTROLS, controls);
|
|
setAttribute(slide, ROLE, slideFocus ? "button" : "");
|
|
slideFocus && removeAttribute(slide, ARIA_ROLEDESCRIPTION);
|
|
}
|
|
|
|
function onMove() {
|
|
if (!destroyed) {
|
|
update();
|
|
}
|
|
}
|
|
|
|
function update() {
|
|
if (!destroyed) {
|
|
var curr = Splide2.index;
|
|
updateActivity();
|
|
updateVisibility();
|
|
toggleClass(slide, CLASS_PREV, index === curr - 1);
|
|
toggleClass(slide, CLASS_NEXT, index === curr + 1);
|
|
}
|
|
}
|
|
|
|
function updateActivity() {
|
|
var active = isActive();
|
|
|
|
if (active !== hasClass(slide, CLASS_ACTIVE)) {
|
|
toggleClass(slide, CLASS_ACTIVE, active);
|
|
setAttribute(slide, ARIA_CURRENT, isNavigation && active || "");
|
|
emit(active ? EVENT_ACTIVE : EVENT_INACTIVE, self);
|
|
}
|
|
}
|
|
|
|
function updateVisibility() {
|
|
var visible = isVisible();
|
|
var hidden = !visible && (!isActive() || isClone);
|
|
|
|
if (!Splide2.state.is([MOVING, SCROLLING])) {
|
|
setAttribute(slide, ARIA_HIDDEN, hidden || "");
|
|
}
|
|
|
|
setAttribute(focusableNodes, TAB_INDEX, hidden ? -1 : "");
|
|
|
|
if (slideFocus) {
|
|
setAttribute(slide, TAB_INDEX, hidden ? -1 : 0);
|
|
}
|
|
|
|
if (visible !== hasClass(slide, CLASS_VISIBLE)) {
|
|
toggleClass(slide, CLASS_VISIBLE, visible);
|
|
emit(visible ? EVENT_VISIBLE : EVENT_HIDDEN, self);
|
|
}
|
|
|
|
if (!visible && document.activeElement === slide) {
|
|
var Slide2 = Components.Slides.getAt(Splide2.index);
|
|
Slide2 && focus(Slide2.slide);
|
|
}
|
|
}
|
|
|
|
function style$1(prop, value, useContainer) {
|
|
style(useContainer && container || slide, prop, value);
|
|
}
|
|
|
|
function isActive() {
|
|
var curr = Splide2.index;
|
|
return curr === index || options.cloneStatus && curr === slideIndex;
|
|
}
|
|
|
|
function isVisible() {
|
|
if (Splide2.is(FADE)) {
|
|
return isActive();
|
|
}
|
|
|
|
var trackRect = rect(Components.Elements.track);
|
|
var slideRect = rect(slide);
|
|
var left = resolve("left", true);
|
|
var right = resolve("right", true);
|
|
return floor(trackRect[left]) <= ceil(slideRect[left]) && floor(slideRect[right]) <= ceil(trackRect[right]);
|
|
}
|
|
|
|
function isWithin(from, distance) {
|
|
var diff = abs(from - index);
|
|
|
|
if (!isClone && (options.rewind || Splide2.is(LOOP))) {
|
|
diff = min(diff, Splide2.length - diff);
|
|
}
|
|
|
|
return diff <= distance;
|
|
}
|
|
|
|
var self = {
|
|
index: index,
|
|
slideIndex: slideIndex,
|
|
slide: slide,
|
|
container: container,
|
|
isClone: isClone,
|
|
mount: mount,
|
|
destroy: destroy,
|
|
update: update,
|
|
style: style$1,
|
|
isWithin: isWithin
|
|
};
|
|
return self;
|
|
}
|
|
|
|
function Slides(Splide2, Components2, options) {
|
|
var _EventInterface2 = EventInterface(Splide2),
|
|
on = _EventInterface2.on,
|
|
emit = _EventInterface2.emit,
|
|
bind = _EventInterface2.bind;
|
|
|
|
var _Components2$Elements = Components2.Elements,
|
|
slides = _Components2$Elements.slides,
|
|
list = _Components2$Elements.list;
|
|
var Slides2 = [];
|
|
|
|
function mount() {
|
|
init();
|
|
on(EVENT_REFRESH, destroy);
|
|
on(EVENT_REFRESH, init);
|
|
on([EVENT_MOUNTED, EVENT_REFRESH], function () {
|
|
Slides2.sort(function (Slide1, Slide2) {
|
|
return Slide1.index - Slide2.index;
|
|
});
|
|
});
|
|
}
|
|
|
|
function init() {
|
|
slides.forEach(function (slide, index) {
|
|
register(slide, index, -1);
|
|
});
|
|
}
|
|
|
|
function destroy() {
|
|
forEach$1(function (Slide2) {
|
|
Slide2.destroy();
|
|
});
|
|
empty(Slides2);
|
|
}
|
|
|
|
function update() {
|
|
forEach$1(function (Slide2) {
|
|
Slide2.update();
|
|
});
|
|
}
|
|
|
|
function register(slide, index, slideIndex) {
|
|
var object = Slide$1(Splide2, index, slideIndex, slide);
|
|
object.mount();
|
|
Slides2.push(object);
|
|
}
|
|
|
|
function get(excludeClones) {
|
|
return excludeClones ? filter(function (Slide2) {
|
|
return !Slide2.isClone;
|
|
}) : Slides2;
|
|
}
|
|
|
|
function getIn(page) {
|
|
var Controller = Components2.Controller;
|
|
var index = Controller.toIndex(page);
|
|
var max = Controller.hasFocus() ? 1 : options.perPage;
|
|
return filter(function (Slide2) {
|
|
return between(Slide2.index, index, index + max - 1);
|
|
});
|
|
}
|
|
|
|
function getAt(index) {
|
|
return filter(index)[0];
|
|
}
|
|
|
|
function add(items, index) {
|
|
forEach(items, function (slide) {
|
|
if (isString(slide)) {
|
|
slide = parseHtml(slide);
|
|
}
|
|
|
|
if (isHTMLElement(slide)) {
|
|
var ref = slides[index];
|
|
ref ? before(slide, ref) : append(list, slide);
|
|
addClass(slide, options.classes.slide);
|
|
observeImages(slide, apply(emit, EVENT_RESIZE));
|
|
}
|
|
});
|
|
emit(EVENT_REFRESH);
|
|
}
|
|
|
|
function remove$1(matcher) {
|
|
remove(filter(matcher).map(function (Slide2) {
|
|
return Slide2.slide;
|
|
}));
|
|
emit(EVENT_REFRESH);
|
|
}
|
|
|
|
function forEach$1(iteratee, excludeClones) {
|
|
get(excludeClones).forEach(iteratee);
|
|
}
|
|
|
|
function filter(matcher) {
|
|
return Slides2.filter(isFunction(matcher) ? matcher : function (Slide2) {
|
|
return isString(matcher) ? matches(Slide2.slide, matcher) : includes(toArray(matcher), Slide2.index);
|
|
});
|
|
}
|
|
|
|
function style(prop, value, useContainer) {
|
|
forEach$1(function (Slide2) {
|
|
Slide2.style(prop, value, useContainer);
|
|
});
|
|
}
|
|
|
|
function observeImages(elm, callback) {
|
|
var images = queryAll(elm, "img");
|
|
var length = images.length;
|
|
|
|
if (length) {
|
|
images.forEach(function (img) {
|
|
bind(img, "load error", function () {
|
|
if (! --length) {
|
|
callback();
|
|
}
|
|
});
|
|
});
|
|
} else {
|
|
callback();
|
|
}
|
|
}
|
|
|
|
function getLength(excludeClones) {
|
|
return excludeClones ? slides.length : Slides2.length;
|
|
}
|
|
|
|
function isEnough() {
|
|
return Slides2.length > options.perPage;
|
|
}
|
|
|
|
return {
|
|
mount: mount,
|
|
destroy: destroy,
|
|
update: update,
|
|
register: register,
|
|
get: get,
|
|
getIn: getIn,
|
|
getAt: getAt,
|
|
add: add,
|
|
remove: remove$1,
|
|
forEach: forEach$1,
|
|
filter: filter,
|
|
style: style,
|
|
getLength: getLength,
|
|
isEnough: isEnough
|
|
};
|
|
}
|
|
|
|
function Layout(Splide2, Components2, options) {
|
|
var _EventInterface3 = EventInterface(Splide2),
|
|
on = _EventInterface3.on,
|
|
bind = _EventInterface3.bind,
|
|
emit = _EventInterface3.emit;
|
|
|
|
var Slides = Components2.Slides;
|
|
var resolve = Components2.Direction.resolve;
|
|
var _Components2$Elements2 = Components2.Elements,
|
|
root = _Components2$Elements2.root,
|
|
track = _Components2$Elements2.track,
|
|
list = _Components2$Elements2.list;
|
|
var getAt = Slides.getAt,
|
|
styleSlides = Slides.style;
|
|
var vertical;
|
|
var rootRect;
|
|
|
|
function mount() {
|
|
init();
|
|
bind(window, "resize load", Throttle(apply(emit, EVENT_RESIZE)));
|
|
on([EVENT_UPDATED, EVENT_REFRESH], init);
|
|
on(EVENT_RESIZE, resize);
|
|
}
|
|
|
|
function init() {
|
|
rootRect = null;
|
|
vertical = options.direction === TTB;
|
|
style(root, "maxWidth", unit(options.width));
|
|
style(track, resolve("paddingLeft"), cssPadding(false));
|
|
style(track, resolve("paddingRight"), cssPadding(true));
|
|
resize();
|
|
}
|
|
|
|
function resize() {
|
|
var newRect = rect(root);
|
|
|
|
if (!rootRect || rootRect.width !== newRect.width || rootRect.height !== newRect.height) {
|
|
style(track, "height", cssTrackHeight());
|
|
styleSlides(resolve("marginRight"), unit(options.gap));
|
|
styleSlides("width", cssSlideWidth());
|
|
styleSlides("height", cssSlideHeight(), true);
|
|
rootRect = newRect;
|
|
emit(EVENT_RESIZED);
|
|
}
|
|
}
|
|
|
|
function cssPadding(right) {
|
|
var padding = options.padding;
|
|
var prop = resolve(right ? "right" : "left");
|
|
return padding && unit(padding[prop] || (isObject(padding) ? 0 : padding)) || "0px";
|
|
}
|
|
|
|
function cssTrackHeight() {
|
|
var height = "";
|
|
|
|
if (vertical) {
|
|
height = cssHeight();
|
|
assert(height, "height or heightRatio is missing.");
|
|
height = "calc(" + height + " - " + cssPadding(false) + " - " + cssPadding(true) + ")";
|
|
}
|
|
|
|
return height;
|
|
}
|
|
|
|
function cssHeight() {
|
|
return unit(options.height || rect(list).width * options.heightRatio);
|
|
}
|
|
|
|
function cssSlideWidth() {
|
|
return options.autoWidth ? null : unit(options.fixedWidth) || (vertical ? "" : cssSlideSize());
|
|
}
|
|
|
|
function cssSlideHeight() {
|
|
return unit(options.fixedHeight) || (vertical ? options.autoHeight ? null : cssSlideSize() : cssHeight());
|
|
}
|
|
|
|
function cssSlideSize() {
|
|
var gap = unit(options.gap);
|
|
return "calc((100%" + (gap && " + " + gap) + ")/" + (options.perPage || 1) + (gap && " - " + gap) + ")";
|
|
}
|
|
|
|
function listSize() {
|
|
return rect(list)[resolve("width")];
|
|
}
|
|
|
|
function slideSize(index, withoutGap) {
|
|
var Slide = getAt(index || 0);
|
|
return Slide ? rect(Slide.slide)[resolve("width")] + (withoutGap ? 0 : getGap()) : 0;
|
|
}
|
|
|
|
function totalSize(index, withoutGap) {
|
|
var Slide = getAt(index);
|
|
|
|
if (Slide) {
|
|
var right = rect(Slide.slide)[resolve("right")];
|
|
var left = rect(list)[resolve("left")];
|
|
return abs(right - left) + (withoutGap ? 0 : getGap());
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
function sliderSize() {
|
|
return totalSize(Splide2.length - 1, true) - totalSize(-1, true);
|
|
}
|
|
|
|
function getGap() {
|
|
var Slide = getAt(0);
|
|
return Slide && parseFloat(style(Slide.slide, resolve("marginRight"))) || 0;
|
|
}
|
|
|
|
function getPadding(right) {
|
|
return parseFloat(style(track, resolve("padding" + (right ? "Right" : "Left")))) || 0;
|
|
}
|
|
|
|
return {
|
|
mount: mount,
|
|
listSize: listSize,
|
|
slideSize: slideSize,
|
|
sliderSize: sliderSize,
|
|
totalSize: totalSize,
|
|
getPadding: getPadding
|
|
};
|
|
}
|
|
|
|
var MULTIPLIER = 2;
|
|
|
|
function Clones(Splide2, Components2, options) {
|
|
var _EventInterface4 = EventInterface(Splide2),
|
|
on = _EventInterface4.on,
|
|
emit = _EventInterface4.emit;
|
|
|
|
var Elements = Components2.Elements,
|
|
Slides = Components2.Slides;
|
|
var resolve = Components2.Direction.resolve;
|
|
var clones = [];
|
|
var cloneCount;
|
|
|
|
function mount() {
|
|
init();
|
|
on(EVENT_REFRESH, destroy);
|
|
on(EVENT_REFRESH, init);
|
|
on([EVENT_UPDATED, EVENT_RESIZE], observe);
|
|
}
|
|
|
|
function init() {
|
|
if (cloneCount = computeCloneCount()) {
|
|
generate(cloneCount);
|
|
emit(EVENT_RESIZE);
|
|
}
|
|
}
|
|
|
|
function destroy() {
|
|
remove(clones);
|
|
empty(clones);
|
|
}
|
|
|
|
function observe() {
|
|
if (cloneCount < computeCloneCount()) {
|
|
emit(EVENT_REFRESH);
|
|
}
|
|
}
|
|
|
|
function generate(count) {
|
|
var slides = Slides.get().slice();
|
|
var length = slides.length;
|
|
|
|
if (length) {
|
|
while (slides.length < count) {
|
|
push(slides, slides);
|
|
}
|
|
|
|
push(slides.slice(-count), slides.slice(0, count)).forEach(function (Slide, index) {
|
|
var isHead = index < count;
|
|
var clone = cloneDeep(Slide.slide, index);
|
|
isHead ? before(clone, slides[0].slide) : append(Elements.list, clone);
|
|
push(clones, clone);
|
|
Slides.register(clone, index - count + (isHead ? 0 : length), Slide.index);
|
|
});
|
|
}
|
|
}
|
|
|
|
function cloneDeep(elm, index) {
|
|
var clone = elm.cloneNode(true);
|
|
addClass(clone, options.classes.clone);
|
|
clone.id = Splide2.root.id + "-clone" + pad(index + 1);
|
|
return clone;
|
|
}
|
|
|
|
function computeCloneCount() {
|
|
var clones2 = options.clones;
|
|
|
|
if (!Splide2.is(LOOP)) {
|
|
clones2 = 0;
|
|
} else if (!clones2) {
|
|
var fixedSize = options[resolve("fixedWidth")] && Components2.Layout.slideSize(0);
|
|
var fixedCount = fixedSize && ceil(rect(Elements.track)[resolve("width")] / fixedSize);
|
|
clones2 = fixedCount || options[resolve("autoWidth")] && Splide2.length || options.perPage * MULTIPLIER;
|
|
}
|
|
|
|
return clones2;
|
|
}
|
|
|
|
return {
|
|
mount: mount,
|
|
destroy: destroy
|
|
};
|
|
}
|
|
|
|
function Move(Splide2, Components2, options) {
|
|
var _EventInterface5 = EventInterface(Splide2),
|
|
on = _EventInterface5.on,
|
|
emit = _EventInterface5.emit;
|
|
|
|
var set = Splide2.state.set;
|
|
var _Components2$Layout = Components2.Layout,
|
|
slideSize = _Components2$Layout.slideSize,
|
|
getPadding = _Components2$Layout.getPadding,
|
|
totalSize = _Components2$Layout.totalSize,
|
|
listSize = _Components2$Layout.listSize,
|
|
sliderSize = _Components2$Layout.sliderSize;
|
|
var _Components2$Directio = Components2.Direction,
|
|
resolve = _Components2$Directio.resolve,
|
|
orient = _Components2$Directio.orient;
|
|
var _Components2$Elements3 = Components2.Elements,
|
|
list = _Components2$Elements3.list,
|
|
track = _Components2$Elements3.track;
|
|
var Transition;
|
|
|
|
function mount() {
|
|
Transition = Components2.Transition;
|
|
on([EVENT_MOUNTED, EVENT_RESIZED, EVENT_UPDATED, EVENT_REFRESH], reposition);
|
|
}
|
|
|
|
function reposition() {
|
|
if (!Components2.Controller.isBusy()) {
|
|
Components2.Scroll.cancel();
|
|
jump(Splide2.index);
|
|
Components2.Slides.update();
|
|
}
|
|
}
|
|
|
|
function move(dest, index, prev, callback) {
|
|
if (dest !== index && canShift(dest > prev)) {
|
|
cancel();
|
|
translate(shift(getPosition(), dest > prev), true);
|
|
}
|
|
|
|
set(MOVING);
|
|
emit(EVENT_MOVE, index, prev, dest);
|
|
Transition.start(index, function () {
|
|
set(IDLE);
|
|
emit(EVENT_MOVED, index, prev, dest);
|
|
callback && callback();
|
|
});
|
|
}
|
|
|
|
function jump(index) {
|
|
translate(toPosition(index, true));
|
|
}
|
|
|
|
function translate(position, preventLoop) {
|
|
if (!Splide2.is(FADE)) {
|
|
var destination = preventLoop ? position : loop(position);
|
|
style(list, "transform", "translate" + resolve("X") + "(" + destination + "px)");
|
|
position !== destination && emit(EVENT_SHIFTED);
|
|
}
|
|
}
|
|
|
|
function loop(position) {
|
|
if (Splide2.is(LOOP)) {
|
|
var index = toIndex(position);
|
|
var exceededMax = index > Components2.Controller.getEnd();
|
|
var exceededMin = index < 0;
|
|
|
|
if (exceededMin || exceededMax) {
|
|
position = shift(position, exceededMax);
|
|
}
|
|
}
|
|
|
|
return position;
|
|
}
|
|
|
|
function shift(position, backwards) {
|
|
var excess = position - getLimit(backwards);
|
|
var size = sliderSize();
|
|
position -= orient(size * (ceil(abs(excess) / size) || 1)) * (backwards ? 1 : -1);
|
|
return position;
|
|
}
|
|
|
|
function cancel() {
|
|
translate(getPosition());
|
|
Transition.cancel();
|
|
}
|
|
|
|
function toIndex(position) {
|
|
var Slides = Components2.Slides.get();
|
|
var index = 0;
|
|
var minDistance = Infinity;
|
|
|
|
for (var i = 0; i < Slides.length; i++) {
|
|
var slideIndex = Slides[i].index;
|
|
var distance = abs(toPosition(slideIndex, true) - position);
|
|
|
|
if (distance <= minDistance) {
|
|
minDistance = distance;
|
|
index = slideIndex;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
|
|
return index;
|
|
}
|
|
|
|
function toPosition(index, trimming) {
|
|
var position = orient(totalSize(index - 1) - offset(index));
|
|
return trimming ? trim(position) : position;
|
|
}
|
|
|
|
function getPosition() {
|
|
var left = resolve("left");
|
|
return rect(list)[left] - rect(track)[left] + orient(getPadding(false));
|
|
}
|
|
|
|
function trim(position) {
|
|
if (options.trimSpace && Splide2.is(SLIDE)) {
|
|
position = clamp(position, 0, orient(sliderSize() - listSize()));
|
|
}
|
|
|
|
return position;
|
|
}
|
|
|
|
function offset(index) {
|
|
var focus = options.focus;
|
|
return focus === "center" ? (listSize() - slideSize(index, true)) / 2 : +focus * slideSize(index) || 0;
|
|
}
|
|
|
|
function getLimit(max) {
|
|
return toPosition(max ? Components2.Controller.getEnd() : 0, !!options.trimSpace);
|
|
}
|
|
|
|
function canShift(backwards) {
|
|
var shifted = orient(shift(getPosition(), backwards));
|
|
return backwards ? shifted >= 0 : shifted <= list[resolve("scrollWidth")] - rect(track)[resolve("width")];
|
|
}
|
|
|
|
function exceededLimit(max, position) {
|
|
position = isUndefined(position) ? getPosition() : position;
|
|
var exceededMin = max !== true && orient(position) < orient(getLimit(false));
|
|
var exceededMax = max !== false && orient(position) > orient(getLimit(true));
|
|
return exceededMin || exceededMax;
|
|
}
|
|
|
|
return {
|
|
mount: mount,
|
|
move: move,
|
|
jump: jump,
|
|
translate: translate,
|
|
shift: shift,
|
|
cancel: cancel,
|
|
toIndex: toIndex,
|
|
toPosition: toPosition,
|
|
getPosition: getPosition,
|
|
getLimit: getLimit,
|
|
exceededLimit: exceededLimit,
|
|
reposition: reposition
|
|
};
|
|
}
|
|
|
|
function Controller(Splide2, Components2, options) {
|
|
var _EventInterface6 = EventInterface(Splide2),
|
|
on = _EventInterface6.on;
|
|
|
|
var Move = Components2.Move;
|
|
var getPosition = Move.getPosition,
|
|
getLimit = Move.getLimit,
|
|
toPosition = Move.toPosition;
|
|
var _Components2$Slides = Components2.Slides,
|
|
isEnough = _Components2$Slides.isEnough,
|
|
getLength = _Components2$Slides.getLength;
|
|
var isLoop = Splide2.is(LOOP);
|
|
var isSlide = Splide2.is(SLIDE);
|
|
var getNext = apply(getAdjacent, false);
|
|
var getPrev = apply(getAdjacent, true);
|
|
var currIndex = options.start || 0;
|
|
var prevIndex = currIndex;
|
|
var slideCount;
|
|
var perMove;
|
|
var perPage;
|
|
|
|
function mount() {
|
|
init();
|
|
on([EVENT_UPDATED, EVENT_REFRESH], init);
|
|
}
|
|
|
|
function init() {
|
|
slideCount = getLength(true);
|
|
perMove = options.perMove;
|
|
perPage = options.perPage;
|
|
var index = clamp(currIndex, 0, slideCount - 1);
|
|
|
|
if (index !== currIndex) {
|
|
currIndex = index;
|
|
Move.reposition();
|
|
}
|
|
}
|
|
|
|
function go(control, allowSameIndex, callback) {
|
|
if (!isBusy()) {
|
|
var dest = parse(control);
|
|
var index = loop(dest);
|
|
|
|
if (index > -1 && (allowSameIndex || index !== currIndex)) {
|
|
setIndex(index);
|
|
Move.move(dest, index, prevIndex, callback);
|
|
}
|
|
}
|
|
}
|
|
|
|
function scroll(destination, duration, snap, callback) {
|
|
Components2.Scroll.scroll(destination, duration, snap, function () {
|
|
setIndex(loop(Move.toIndex(getPosition())));
|
|
callback && callback();
|
|
});
|
|
}
|
|
|
|
function parse(control) {
|
|
var index = currIndex;
|
|
|
|
if (isString(control)) {
|
|
var _ref = control.match(/([+\-<>])(\d+)?/) || [],
|
|
indicator = _ref[1],
|
|
number = _ref[2];
|
|
|
|
if (indicator === "+" || indicator === "-") {
|
|
index = computeDestIndex(currIndex + +("" + indicator + (+number || 1)), currIndex);
|
|
} else if (indicator === ">") {
|
|
index = number ? toIndex(+number) : getNext(true);
|
|
} else if (indicator === "<") {
|
|
index = getPrev(true);
|
|
}
|
|
} else {
|
|
index = isLoop ? control : clamp(control, 0, getEnd());
|
|
}
|
|
|
|
return index;
|
|
}
|
|
|
|
function getAdjacent(prev, destination) {
|
|
var number = perMove || (hasFocus() ? 1 : perPage);
|
|
var dest = computeDestIndex(currIndex + number * (prev ? -1 : 1), currIndex, !(perMove || hasFocus()));
|
|
|
|
if (dest === -1 && isSlide) {
|
|
if (!approximatelyEqual(getPosition(), getLimit(!prev), 1)) {
|
|
return prev ? 0 : getEnd();
|
|
}
|
|
}
|
|
|
|
return destination ? dest : loop(dest);
|
|
}
|
|
|
|
function computeDestIndex(dest, from, snapPage) {
|
|
if (isEnough()) {
|
|
var end = getEnd();
|
|
var index = computeMovableDestIndex(dest);
|
|
|
|
if (index !== dest) {
|
|
from = dest;
|
|
dest = index;
|
|
snapPage = false;
|
|
}
|
|
|
|
if (dest < 0 || dest > end) {
|
|
if (!perMove && (between(0, dest, from, true) || between(end, from, dest, true))) {
|
|
dest = toIndex(toPage(dest));
|
|
} else {
|
|
if (isLoop) {
|
|
dest = snapPage ? dest < 0 ? -(slideCount % perPage || perPage) : slideCount : dest;
|
|
} else if (options.rewind) {
|
|
dest = dest < 0 ? end : 0;
|
|
} else {
|
|
dest = -1;
|
|
}
|
|
}
|
|
} else {
|
|
if (snapPage && dest !== from) {
|
|
dest = toIndex(toPage(from) + (dest < from ? -1 : 1));
|
|
}
|
|
}
|
|
} else {
|
|
dest = -1;
|
|
}
|
|
|
|
return dest;
|
|
}
|
|
|
|
function computeMovableDestIndex(dest) {
|
|
if (isSlide && options.trimSpace === "move" && dest !== currIndex) {
|
|
var position = getPosition();
|
|
|
|
while (position === toPosition(dest, true) && between(dest, 0, Splide2.length - 1, !options.rewind)) {
|
|
dest < currIndex ? --dest : ++dest;
|
|
}
|
|
}
|
|
|
|
return dest;
|
|
}
|
|
|
|
function loop(index) {
|
|
return isLoop ? (index + slideCount) % slideCount || 0 : index;
|
|
}
|
|
|
|
function getEnd() {
|
|
return max(slideCount - (hasFocus() || isLoop && perMove ? 1 : perPage), 0);
|
|
}
|
|
|
|
function toIndex(page) {
|
|
return clamp(hasFocus() ? page : perPage * page, 0, getEnd());
|
|
}
|
|
|
|
function toPage(index) {
|
|
return hasFocus() ? index : floor((index >= getEnd() ? slideCount - 1 : index) / perPage);
|
|
}
|
|
|
|
function toDest(destination) {
|
|
var closest = Move.toIndex(destination);
|
|
return isSlide ? clamp(closest, 0, getEnd()) : closest;
|
|
}
|
|
|
|
function setIndex(index) {
|
|
if (index !== currIndex) {
|
|
prevIndex = currIndex;
|
|
currIndex = index;
|
|
}
|
|
}
|
|
|
|
function getIndex(prev) {
|
|
return prev ? prevIndex : currIndex;
|
|
}
|
|
|
|
function hasFocus() {
|
|
return !isUndefined(options.focus) || options.isNavigation;
|
|
}
|
|
|
|
function isBusy() {
|
|
return Splide2.state.is([MOVING, SCROLLING]) && !!options.waitForTransition;
|
|
}
|
|
|
|
return {
|
|
mount: mount,
|
|
go: go,
|
|
scroll: scroll,
|
|
getNext: getNext,
|
|
getPrev: getPrev,
|
|
getAdjacent: getAdjacent,
|
|
getEnd: getEnd,
|
|
setIndex: setIndex,
|
|
getIndex: getIndex,
|
|
toIndex: toIndex,
|
|
toPage: toPage,
|
|
toDest: toDest,
|
|
hasFocus: hasFocus,
|
|
isBusy: isBusy
|
|
};
|
|
}
|
|
|
|
var XML_NAME_SPACE = "http://www.w3.org/2000/svg";
|
|
var PATH = "m15.5 0.932-4.3 4.38 14.5 14.6-14.5 14.5 4.3 4.4 14.6-14.6 4.4-4.3-4.4-4.4-14.6-14.6z";
|
|
var SIZE = 40;
|
|
|
|
function Arrows(Splide2, Components2, options) {
|
|
var event = EventInterface(Splide2);
|
|
var on = event.on,
|
|
bind = event.bind,
|
|
emit = event.emit;
|
|
var classes = options.classes,
|
|
i18n = options.i18n;
|
|
var Elements = Components2.Elements,
|
|
Controller = Components2.Controller;
|
|
var userArrows = Elements.arrows,
|
|
track = Elements.track;
|
|
var wrapper = userArrows;
|
|
var prev = Elements.prev;
|
|
var next = Elements.next;
|
|
var created;
|
|
var wrapperClasses;
|
|
var arrows = {};
|
|
|
|
function mount() {
|
|
init();
|
|
on(EVENT_UPDATED, remount);
|
|
}
|
|
|
|
function remount() {
|
|
destroy();
|
|
mount();
|
|
}
|
|
|
|
function init() {
|
|
var enabled = options.arrows;
|
|
|
|
if (enabled && !(prev && next)) {
|
|
createArrows();
|
|
}
|
|
|
|
if (prev && next) {
|
|
assign(arrows, {
|
|
prev: prev,
|
|
next: next
|
|
});
|
|
display(wrapper, enabled ? "" : "none");
|
|
addClass(wrapper, wrapperClasses = CLASS_ARROWS + "--" + options.direction);
|
|
|
|
if (enabled) {
|
|
listen();
|
|
update();
|
|
setAttribute([prev, next], ARIA_CONTROLS, track.id);
|
|
emit(EVENT_ARROWS_MOUNTED, prev, next);
|
|
}
|
|
}
|
|
}
|
|
|
|
function destroy() {
|
|
event.destroy();
|
|
removeClass(wrapper, wrapperClasses);
|
|
|
|
if (created) {
|
|
remove(userArrows ? [prev, next] : wrapper);
|
|
prev = next = null;
|
|
} else {
|
|
removeAttribute([prev, next], ALL_ATTRIBUTES);
|
|
}
|
|
}
|
|
|
|
function listen() {
|
|
on([EVENT_MOVED, EVENT_REFRESH, EVENT_SCROLLED], update);
|
|
bind(next, "click", apply(go, ">"));
|
|
bind(prev, "click", apply(go, "<"));
|
|
}
|
|
|
|
function go(control) {
|
|
Controller.go(control, true);
|
|
}
|
|
|
|
function createArrows() {
|
|
wrapper = userArrows || create("div", classes.arrows);
|
|
prev = createArrow(true);
|
|
next = createArrow(false);
|
|
created = true;
|
|
append(wrapper, [prev, next]);
|
|
!userArrows && before(wrapper, track);
|
|
}
|
|
|
|
function createArrow(prev2) {
|
|
var arrow = "<button class=\"" + classes.arrow + " " + (prev2 ? classes.prev : classes.next) + "\" type=\"button\"><svg xmlns=\"" + XML_NAME_SPACE + "\" viewBox=\"0 0 " + SIZE + " " + SIZE + "\" width=\"" + SIZE + "\" height=\"" + SIZE + "\" focusable=\"false\"><path d=\"" + (options.arrowPath || PATH) + "\" />";
|
|
return parseHtml(arrow);
|
|
}
|
|
|
|
function update() {
|
|
var index = Splide2.index;
|
|
var prevIndex = Controller.getPrev();
|
|
var nextIndex = Controller.getNext();
|
|
var prevLabel = prevIndex > -1 && index < prevIndex ? i18n.last : i18n.prev;
|
|
var nextLabel = nextIndex > -1 && index > nextIndex ? i18n.first : i18n.next;
|
|
prev.disabled = prevIndex < 0;
|
|
next.disabled = nextIndex < 0;
|
|
setAttribute(prev, ARIA_LABEL, prevLabel);
|
|
setAttribute(next, ARIA_LABEL, nextLabel);
|
|
emit(EVENT_ARROWS_UPDATED, prev, next, prevIndex, nextIndex);
|
|
}
|
|
|
|
return {
|
|
arrows: arrows,
|
|
mount: mount,
|
|
destroy: destroy
|
|
};
|
|
}
|
|
|
|
var INTERVAL_DATA_ATTRIBUTE = DATA_ATTRIBUTE + "-interval";
|
|
|
|
function Autoplay(Splide2, Components2, options) {
|
|
var _EventInterface7 = EventInterface(Splide2),
|
|
on = _EventInterface7.on,
|
|
bind = _EventInterface7.bind,
|
|
emit = _EventInterface7.emit;
|
|
|
|
var interval = RequestInterval(options.interval, Splide2.go.bind(Splide2, ">"), onAnimationFrame);
|
|
var isPaused = interval.isPaused;
|
|
var Elements = Components2.Elements,
|
|
_Components2$Elements4 = Components2.Elements,
|
|
root = _Components2$Elements4.root,
|
|
toggle = _Components2$Elements4.toggle;
|
|
var autoplay = options.autoplay;
|
|
var hovered;
|
|
var focused;
|
|
var stopped = autoplay === "pause";
|
|
|
|
function mount() {
|
|
if (autoplay) {
|
|
listen();
|
|
toggle && setAttribute(toggle, ARIA_CONTROLS, Elements.track.id);
|
|
stopped || play();
|
|
update();
|
|
}
|
|
}
|
|
|
|
function listen() {
|
|
if (options.pauseOnHover) {
|
|
bind(root, "mouseenter mouseleave", function (e) {
|
|
hovered = e.type === "mouseenter";
|
|
autoToggle();
|
|
});
|
|
}
|
|
|
|
if (options.pauseOnFocus) {
|
|
bind(root, "focusin focusout", function (e) {
|
|
focused = e.type === "focusin";
|
|
autoToggle();
|
|
});
|
|
}
|
|
|
|
if (toggle) {
|
|
bind(toggle, "click", function () {
|
|
stopped ? play() : pause(true);
|
|
});
|
|
}
|
|
|
|
on([EVENT_MOVE, EVENT_SCROLL, EVENT_REFRESH], interval.rewind);
|
|
on(EVENT_MOVE, onMove);
|
|
}
|
|
|
|
function play() {
|
|
if (isPaused() && Components2.Slides.isEnough()) {
|
|
interval.start(!options.resetProgress);
|
|
focused = hovered = stopped = false;
|
|
update();
|
|
emit(EVENT_AUTOPLAY_PLAY);
|
|
}
|
|
}
|
|
|
|
function pause(stop) {
|
|
if (stop === void 0) {
|
|
stop = true;
|
|
}
|
|
|
|
stopped = !!stop;
|
|
update();
|
|
|
|
if (!isPaused()) {
|
|
interval.pause();
|
|
emit(EVENT_AUTOPLAY_PAUSE);
|
|
}
|
|
}
|
|
|
|
function autoToggle() {
|
|
if (!stopped) {
|
|
hovered || focused ? pause(false) : play();
|
|
}
|
|
}
|
|
|
|
function update() {
|
|
if (toggle) {
|
|
toggleClass(toggle, CLASS_ACTIVE, !stopped);
|
|
setAttribute(toggle, ARIA_LABEL, options.i18n[stopped ? "play" : "pause"]);
|
|
}
|
|
}
|
|
|
|
function onAnimationFrame(rate) {
|
|
var bar = Elements.bar;
|
|
bar && style(bar, "width", rate * 100 + "%");
|
|
emit(EVENT_AUTOPLAY_PLAYING, rate);
|
|
}
|
|
|
|
function onMove(index) {
|
|
var Slide = Components2.Slides.getAt(index);
|
|
interval.set(Slide && +getAttribute(Slide.slide, INTERVAL_DATA_ATTRIBUTE) || options.interval);
|
|
}
|
|
|
|
return {
|
|
mount: mount,
|
|
destroy: interval.cancel,
|
|
play: play,
|
|
pause: pause,
|
|
isPaused: isPaused
|
|
};
|
|
}
|
|
|
|
function Cover(Splide2, Components2, options) {
|
|
var _EventInterface8 = EventInterface(Splide2),
|
|
on = _EventInterface8.on;
|
|
|
|
function mount() {
|
|
if (options.cover) {
|
|
on(EVENT_LAZYLOAD_LOADED, apply(toggle, true));
|
|
on([EVENT_MOUNTED, EVENT_UPDATED, EVENT_REFRESH], apply(cover, true));
|
|
}
|
|
}
|
|
|
|
function cover(cover2) {
|
|
Components2.Slides.forEach(function (Slide) {
|
|
var img = child(Slide.container || Slide.slide, "img");
|
|
|
|
if (img && img.src) {
|
|
toggle(cover2, img, Slide);
|
|
}
|
|
});
|
|
}
|
|
|
|
function toggle(cover2, img, Slide) {
|
|
Slide.style("background", cover2 ? "center/cover no-repeat url(\"" + img.src + "\")" : "", true);
|
|
display(img, cover2 ? "none" : "");
|
|
}
|
|
|
|
return {
|
|
mount: mount,
|
|
destroy: apply(cover, false)
|
|
};
|
|
}
|
|
|
|
var BOUNCE_DIFF_THRESHOLD = 10;
|
|
var BOUNCE_DURATION = 600;
|
|
var FRICTION_FACTOR = 0.6;
|
|
var BASE_VELOCITY = 1.5;
|
|
var MIN_DURATION = 800;
|
|
|
|
function Scroll(Splide2, Components2, options) {
|
|
var _EventInterface9 = EventInterface(Splide2),
|
|
on = _EventInterface9.on,
|
|
emit = _EventInterface9.emit;
|
|
|
|
var set = Splide2.state.set;
|
|
var Move = Components2.Move;
|
|
var getPosition = Move.getPosition,
|
|
getLimit = Move.getLimit,
|
|
exceededLimit = Move.exceededLimit,
|
|
translate = Move.translate;
|
|
var interval;
|
|
var callback;
|
|
var friction = 1;
|
|
|
|
function mount() {
|
|
on(EVENT_MOVE, clear);
|
|
on([EVENT_UPDATED, EVENT_REFRESH], cancel);
|
|
}
|
|
|
|
function scroll(destination, duration, snap, onScrolled, noConstrain) {
|
|
var from = getPosition();
|
|
clear();
|
|
|
|
if (snap) {
|
|
var size = Components2.Layout.sliderSize();
|
|
var offset = sign(destination) * size * floor(abs(destination) / size) || 0;
|
|
destination = Move.toPosition(Components2.Controller.toDest(destination % size)) + offset;
|
|
}
|
|
|
|
var noDistance = approximatelyEqual(from, destination, 1);
|
|
friction = 1;
|
|
duration = noDistance ? 0 : duration || max(abs(destination - from) / BASE_VELOCITY, MIN_DURATION);
|
|
callback = onScrolled;
|
|
interval = RequestInterval(duration, onEnd, apply(update, from, destination, noConstrain), 1);
|
|
set(SCROLLING);
|
|
emit(EVENT_SCROLL);
|
|
interval.start();
|
|
}
|
|
|
|
function onEnd() {
|
|
set(IDLE);
|
|
callback && callback();
|
|
emit(EVENT_SCROLLED);
|
|
}
|
|
|
|
function update(from, to, noConstrain, rate) {
|
|
var position = getPosition();
|
|
var target = from + (to - from) * easing(rate);
|
|
var diff = (target - position) * friction;
|
|
translate(position + diff);
|
|
|
|
if (Splide2.is(SLIDE) && !noConstrain && exceededLimit()) {
|
|
friction *= FRICTION_FACTOR;
|
|
|
|
if (abs(diff) < BOUNCE_DIFF_THRESHOLD) {
|
|
scroll(getLimit(exceededLimit(true)), BOUNCE_DURATION, false, callback, true);
|
|
}
|
|
}
|
|
}
|
|
|
|
function clear() {
|
|
if (interval) {
|
|
interval.cancel();
|
|
}
|
|
}
|
|
|
|
function cancel() {
|
|
if (interval && !interval.isPaused()) {
|
|
clear();
|
|
onEnd();
|
|
}
|
|
}
|
|
|
|
function easing(t) {
|
|
var easingFunc = options.easingFunc;
|
|
return easingFunc ? easingFunc(t) : 1 - Math.pow(1 - t, 4);
|
|
}
|
|
|
|
return {
|
|
mount: mount,
|
|
destroy: clear,
|
|
scroll: scroll,
|
|
cancel: cancel
|
|
};
|
|
}
|
|
|
|
var SCROLL_LISTENER_OPTIONS = {
|
|
passive: false,
|
|
capture: true
|
|
};
|
|
|
|
function Drag(Splide2, Components2, options) {
|
|
var _EventInterface10 = EventInterface(Splide2),
|
|
on = _EventInterface10.on,
|
|
emit = _EventInterface10.emit,
|
|
bind = _EventInterface10.bind,
|
|
unbind = _EventInterface10.unbind;
|
|
|
|
var state = Splide2.state;
|
|
var Move = Components2.Move,
|
|
Scroll = Components2.Scroll,
|
|
Controller = Components2.Controller,
|
|
track = Components2.Elements.track,
|
|
reduce = Components2.Media.reduce;
|
|
var _Components2$Directio2 = Components2.Direction,
|
|
resolve = _Components2$Directio2.resolve,
|
|
orient = _Components2$Directio2.orient;
|
|
var getPosition = Move.getPosition,
|
|
exceededLimit = Move.exceededLimit;
|
|
var basePosition;
|
|
var baseEvent;
|
|
var prevBaseEvent;
|
|
var isFree;
|
|
var dragging;
|
|
var exceeded = false;
|
|
var clickPrevented;
|
|
var disabled;
|
|
var target;
|
|
|
|
function mount() {
|
|
bind(track, POINTER_MOVE_EVENTS, noop, SCROLL_LISTENER_OPTIONS);
|
|
bind(track, POINTER_UP_EVENTS, noop, SCROLL_LISTENER_OPTIONS);
|
|
bind(track, POINTER_DOWN_EVENTS, onPointerDown, SCROLL_LISTENER_OPTIONS);
|
|
bind(track, "click", onClick, {
|
|
capture: true
|
|
});
|
|
bind(track, "dragstart", prevent);
|
|
on([EVENT_MOUNTED, EVENT_UPDATED], init);
|
|
}
|
|
|
|
function init() {
|
|
var drag = options.drag;
|
|
disable(!drag);
|
|
isFree = drag === "free";
|
|
}
|
|
|
|
function onPointerDown(e) {
|
|
clickPrevented = false;
|
|
|
|
if (!disabled) {
|
|
var isTouch = isTouchEvent(e);
|
|
|
|
if (isDraggable(e.target) && (isTouch || !e.button)) {
|
|
if (!Controller.isBusy()) {
|
|
target = isTouch ? track : window;
|
|
dragging = state.is([MOVING, SCROLLING]);
|
|
prevBaseEvent = null;
|
|
bind(target, POINTER_MOVE_EVENTS, onPointerMove, SCROLL_LISTENER_OPTIONS);
|
|
bind(target, POINTER_UP_EVENTS, onPointerUp, SCROLL_LISTENER_OPTIONS);
|
|
Move.cancel();
|
|
Scroll.cancel();
|
|
save(e);
|
|
} else {
|
|
prevent(e, true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function onPointerMove(e) {
|
|
if (!state.is(DRAGGING)) {
|
|
state.set(DRAGGING);
|
|
emit(EVENT_DRAG);
|
|
}
|
|
|
|
if (e.cancelable) {
|
|
if (dragging) {
|
|
Move.translate(basePosition + constrain(diffCoord(e)));
|
|
var expired = diffTime(e) > LOG_INTERVAL;
|
|
var hasExceeded = exceeded !== (exceeded = exceededLimit());
|
|
|
|
if (expired || hasExceeded) {
|
|
save(e);
|
|
}
|
|
|
|
clickPrevented = true;
|
|
emit(EVENT_DRAGGING);
|
|
prevent(e);
|
|
} else if (isSliderDirection(e)) {
|
|
dragging = shouldStart(e);
|
|
prevent(e);
|
|
}
|
|
}
|
|
}
|
|
|
|
function onPointerUp(e) {
|
|
if (state.is(DRAGGING)) {
|
|
state.set(IDLE);
|
|
emit(EVENT_DRAGGED);
|
|
}
|
|
|
|
if (dragging) {
|
|
move(e);
|
|
prevent(e);
|
|
}
|
|
|
|
unbind(target, POINTER_MOVE_EVENTS, onPointerMove);
|
|
unbind(target, POINTER_UP_EVENTS, onPointerUp);
|
|
dragging = false;
|
|
}
|
|
|
|
function onClick(e) {
|
|
if (!disabled && clickPrevented) {
|
|
prevent(e, true);
|
|
}
|
|
}
|
|
|
|
function save(e) {
|
|
prevBaseEvent = baseEvent;
|
|
baseEvent = e;
|
|
basePosition = getPosition();
|
|
}
|
|
|
|
function move(e) {
|
|
var velocity = computeVelocity(e);
|
|
var destination = computeDestination(velocity);
|
|
var rewind = options.rewind && options.rewindByDrag;
|
|
reduce(false);
|
|
|
|
if (isFree) {
|
|
Controller.scroll(destination, 0, options.snap);
|
|
} else if (Splide2.is(FADE)) {
|
|
Controller.go(orient(sign(velocity)) < 0 ? rewind ? "<" : "-" : rewind ? ">" : "+");
|
|
} else if (Splide2.is(SLIDE) && exceeded && rewind) {
|
|
Controller.go(exceededLimit(true) ? ">" : "<");
|
|
} else {
|
|
Controller.go(Controller.toDest(destination), true);
|
|
}
|
|
|
|
reduce(true);
|
|
}
|
|
|
|
function shouldStart(e) {
|
|
var thresholds = options.dragMinThreshold;
|
|
var isObj = isObject(thresholds);
|
|
var mouse = isObj && thresholds.mouse || 0;
|
|
var touch = (isObj ? thresholds.touch : +thresholds) || 10;
|
|
return abs(diffCoord(e)) > (isTouchEvent(e) ? touch : mouse);
|
|
}
|
|
|
|
function isSliderDirection(e) {
|
|
return abs(diffCoord(e)) > abs(diffCoord(e, true));
|
|
}
|
|
|
|
function computeVelocity(e) {
|
|
if (Splide2.is(LOOP) || !exceeded) {
|
|
var time = diffTime(e);
|
|
|
|
if (time && time < LOG_INTERVAL) {
|
|
return diffCoord(e) / time;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
function computeDestination(velocity) {
|
|
return getPosition() + sign(velocity) * min(abs(velocity) * (options.flickPower || 600), isFree ? Infinity : Components2.Layout.listSize() * (options.flickMaxPages || 1));
|
|
}
|
|
|
|
function diffCoord(e, orthogonal) {
|
|
return coordOf(e, orthogonal) - coordOf(getBaseEvent(e), orthogonal);
|
|
}
|
|
|
|
function diffTime(e) {
|
|
return timeOf(e) - timeOf(getBaseEvent(e));
|
|
}
|
|
|
|
function getBaseEvent(e) {
|
|
return baseEvent === e && prevBaseEvent || baseEvent;
|
|
}
|
|
|
|
function coordOf(e, orthogonal) {
|
|
return (isTouchEvent(e) ? e.changedTouches[0] : e)["page" + resolve(orthogonal ? "Y" : "X")];
|
|
}
|
|
|
|
function constrain(diff) {
|
|
return diff / (exceeded && Splide2.is(SLIDE) ? FRICTION : 1);
|
|
}
|
|
|
|
function isDraggable(target2) {
|
|
var noDrag = options.noDrag;
|
|
return !matches(target2, "." + CLASS_PAGINATION_PAGE + ", ." + CLASS_ARROW) && (!noDrag || !matches(target2, noDrag));
|
|
}
|
|
|
|
function isTouchEvent(e) {
|
|
return typeof TouchEvent !== "undefined" && e instanceof TouchEvent;
|
|
}
|
|
|
|
function isDragging() {
|
|
return dragging;
|
|
}
|
|
|
|
function disable(value) {
|
|
disabled = value;
|
|
}
|
|
|
|
return {
|
|
mount: mount,
|
|
disable: disable,
|
|
isDragging: isDragging
|
|
};
|
|
}
|
|
|
|
var NORMALIZATION_MAP = {
|
|
Spacebar: " ",
|
|
Right: ARROW_RIGHT,
|
|
Left: ARROW_LEFT,
|
|
Up: ARROW_UP,
|
|
Down: ARROW_DOWN
|
|
};
|
|
|
|
function normalizeKey(key) {
|
|
key = isString(key) ? key : key.key;
|
|
return NORMALIZATION_MAP[key] || key;
|
|
}
|
|
|
|
var KEYBOARD_EVENT = "keydown";
|
|
|
|
function Keyboard(Splide2, Components2, options) {
|
|
var _EventInterface11 = EventInterface(Splide2),
|
|
on = _EventInterface11.on,
|
|
bind = _EventInterface11.bind,
|
|
unbind = _EventInterface11.unbind;
|
|
|
|
var root = Splide2.root;
|
|
var resolve = Components2.Direction.resolve;
|
|
var target;
|
|
var disabled;
|
|
|
|
function mount() {
|
|
init();
|
|
on(EVENT_UPDATED, destroy);
|
|
on(EVENT_UPDATED, init);
|
|
on(EVENT_MOVE, onMove);
|
|
}
|
|
|
|
function init() {
|
|
var keyboard = options.keyboard;
|
|
|
|
if (keyboard) {
|
|
target = keyboard === "global" ? window : root;
|
|
bind(target, KEYBOARD_EVENT, onKeydown);
|
|
}
|
|
}
|
|
|
|
function destroy() {
|
|
unbind(target, KEYBOARD_EVENT);
|
|
}
|
|
|
|
function disable(value) {
|
|
disabled = value;
|
|
}
|
|
|
|
function onMove() {
|
|
var _disabled = disabled;
|
|
disabled = true;
|
|
nextTick(function () {
|
|
disabled = _disabled;
|
|
});
|
|
}
|
|
|
|
function onKeydown(e) {
|
|
if (!disabled) {
|
|
var key = normalizeKey(e);
|
|
|
|
if (key === resolve(ARROW_LEFT)) {
|
|
Splide2.go("<");
|
|
} else if (key === resolve(ARROW_RIGHT)) {
|
|
Splide2.go(">");
|
|
}
|
|
}
|
|
}
|
|
|
|
return {
|
|
mount: mount,
|
|
destroy: destroy,
|
|
disable: disable
|
|
};
|
|
}
|
|
|
|
var SRC_DATA_ATTRIBUTE = DATA_ATTRIBUTE + "-lazy";
|
|
var SRCSET_DATA_ATTRIBUTE = SRC_DATA_ATTRIBUTE + "-srcset";
|
|
var IMAGE_SELECTOR = "[" + SRC_DATA_ATTRIBUTE + "], [" + SRCSET_DATA_ATTRIBUTE + "]";
|
|
|
|
function LazyLoad(Splide2, Components2, options) {
|
|
var _EventInterface12 = EventInterface(Splide2),
|
|
on = _EventInterface12.on,
|
|
off = _EventInterface12.off,
|
|
bind = _EventInterface12.bind,
|
|
emit = _EventInterface12.emit;
|
|
|
|
var isSequential = options.lazyLoad === "sequential";
|
|
var events = [EVENT_MOUNTED, EVENT_REFRESH, EVENT_MOVED, EVENT_SCROLLED];
|
|
var entries = [];
|
|
|
|
function mount() {
|
|
if (options.lazyLoad) {
|
|
init();
|
|
on(EVENT_REFRESH, init);
|
|
isSequential || on(events, observe);
|
|
}
|
|
}
|
|
|
|
function init() {
|
|
empty(entries);
|
|
Components2.Slides.forEach(function (Slide) {
|
|
queryAll(Slide.slide, IMAGE_SELECTOR).forEach(function (img) {
|
|
var src = getAttribute(img, SRC_DATA_ATTRIBUTE);
|
|
var srcset = getAttribute(img, SRCSET_DATA_ATTRIBUTE);
|
|
|
|
if (src !== img.src || srcset !== img.srcset) {
|
|
var className = options.classes.spinner;
|
|
var parent = img.parentElement;
|
|
var spinner = child(parent, "." + className) || create("span", className, parent);
|
|
entries.push([img, Slide, spinner]);
|
|
img.src || display(img, "none");
|
|
}
|
|
});
|
|
});
|
|
isSequential && loadNext();
|
|
}
|
|
|
|
function observe() {
|
|
entries = entries.filter(function (data) {
|
|
var distance = options.perPage * ((options.preloadPages || 1) + 1) - 1;
|
|
return data[1].isWithin(Splide2.index, distance) ? load(data) : true;
|
|
});
|
|
entries.length || off(events);
|
|
}
|
|
|
|
function load(data) {
|
|
var img = data[0];
|
|
addClass(data[1].slide, CLASS_LOADING);
|
|
bind(img, "load error", apply(onLoad, data));
|
|
setAttribute(img, "src", getAttribute(img, SRC_DATA_ATTRIBUTE));
|
|
setAttribute(img, "srcset", getAttribute(img, SRCSET_DATA_ATTRIBUTE));
|
|
removeAttribute(img, SRC_DATA_ATTRIBUTE);
|
|
removeAttribute(img, SRCSET_DATA_ATTRIBUTE);
|
|
}
|
|
|
|
function onLoad(data, e) {
|
|
var img = data[0],
|
|
Slide = data[1];
|
|
removeClass(Slide.slide, CLASS_LOADING);
|
|
|
|
if (e.type !== "error") {
|
|
remove(data[2]);
|
|
display(img, "");
|
|
emit(EVENT_LAZYLOAD_LOADED, img, Slide);
|
|
emit(EVENT_RESIZE);
|
|
}
|
|
|
|
isSequential && loadNext();
|
|
}
|
|
|
|
function loadNext() {
|
|
entries.length && load(entries.shift());
|
|
}
|
|
|
|
return {
|
|
mount: mount,
|
|
destroy: apply(empty, entries)
|
|
};
|
|
}
|
|
|
|
function Pagination(Splide2, Components2, options) {
|
|
var event = EventInterface(Splide2);
|
|
var on = event.on,
|
|
emit = event.emit,
|
|
bind = event.bind;
|
|
var Slides = Components2.Slides,
|
|
Elements = Components2.Elements,
|
|
Controller = Components2.Controller;
|
|
var hasFocus = Controller.hasFocus,
|
|
getIndex = Controller.getIndex,
|
|
go = Controller.go;
|
|
var resolve = Components2.Direction.resolve;
|
|
var items = [];
|
|
var list;
|
|
var paginationClasses;
|
|
|
|
function mount() {
|
|
destroy();
|
|
on([EVENT_UPDATED, EVENT_REFRESH], mount);
|
|
|
|
if (options.pagination && Slides.isEnough()) {
|
|
on([EVENT_MOVE, EVENT_SCROLL, EVENT_SCROLLED], update);
|
|
createPagination();
|
|
update();
|
|
emit(EVENT_PAGINATION_MOUNTED, {
|
|
list: list,
|
|
items: items
|
|
}, getAt(Splide2.index));
|
|
}
|
|
}
|
|
|
|
function destroy() {
|
|
if (list) {
|
|
remove(Elements.pagination ? slice(list.children) : list);
|
|
removeClass(list, paginationClasses);
|
|
empty(items);
|
|
list = null;
|
|
}
|
|
|
|
event.destroy();
|
|
}
|
|
|
|
function createPagination() {
|
|
var length = Splide2.length;
|
|
var classes = options.classes,
|
|
i18n = options.i18n,
|
|
perPage = options.perPage;
|
|
var max = hasFocus() ? length : ceil(length / perPage);
|
|
list = Elements.pagination || create("ul", classes.pagination, Elements.track.parentElement);
|
|
addClass(list, paginationClasses = CLASS_PAGINATION + "--" + getDirection());
|
|
setAttribute(list, ROLE, "tablist");
|
|
setAttribute(list, ARIA_LABEL, i18n.select);
|
|
setAttribute(list, ARIA_ORIENTATION, getDirection() === TTB ? "vertical" : "");
|
|
|
|
for (var i = 0; i < max; i++) {
|
|
var li = create("li", null, list);
|
|
var button = create("button", {
|
|
class: classes.page,
|
|
type: "button"
|
|
}, li);
|
|
var controls = Slides.getIn(i).map(function (Slide) {
|
|
return Slide.slide.id;
|
|
});
|
|
var text = !hasFocus() && perPage > 1 ? i18n.pageX : i18n.slideX;
|
|
bind(button, "click", apply(onClick, i));
|
|
|
|
if (options.paginationKeyboard) {
|
|
bind(button, "keydown", apply(onKeydown, i));
|
|
}
|
|
|
|
setAttribute(li, ROLE, "presentation");
|
|
setAttribute(button, ROLE, "tab");
|
|
setAttribute(button, ARIA_CONTROLS, controls.join(" "));
|
|
setAttribute(button, ARIA_LABEL, format(text, i + 1));
|
|
setAttribute(button, TAB_INDEX, -1);
|
|
items.push({
|
|
li: li,
|
|
button: button,
|
|
page: i
|
|
});
|
|
}
|
|
}
|
|
|
|
function onClick(page) {
|
|
go(">" + page, true);
|
|
}
|
|
|
|
function onKeydown(page, e) {
|
|
var length = items.length;
|
|
var key = normalizeKey(e);
|
|
var dir = getDirection();
|
|
var nextPage = -1;
|
|
|
|
if (key === resolve(ARROW_RIGHT, false, dir)) {
|
|
nextPage = ++page % length;
|
|
} else if (key === resolve(ARROW_LEFT, false, dir)) {
|
|
nextPage = (--page + length) % length;
|
|
} else if (key === "Home") {
|
|
nextPage = 0;
|
|
} else if (key === "End") {
|
|
nextPage = length - 1;
|
|
}
|
|
|
|
var item = items[nextPage];
|
|
|
|
if (item) {
|
|
focus(item.button);
|
|
go(">" + nextPage);
|
|
prevent(e, true);
|
|
}
|
|
}
|
|
|
|
function getDirection() {
|
|
return options.paginationDirection || options.direction;
|
|
}
|
|
|
|
function getAt(index) {
|
|
return items[Controller.toPage(index)];
|
|
}
|
|
|
|
function update() {
|
|
var prev = getAt(getIndex(true));
|
|
var curr = getAt(getIndex());
|
|
|
|
if (prev) {
|
|
var button = prev.button;
|
|
removeClass(button, CLASS_ACTIVE);
|
|
removeAttribute(button, ARIA_SELECTED);
|
|
setAttribute(button, TAB_INDEX, -1);
|
|
}
|
|
|
|
if (curr) {
|
|
var _button = curr.button;
|
|
addClass(_button, CLASS_ACTIVE);
|
|
setAttribute(_button, ARIA_SELECTED, true);
|
|
setAttribute(_button, TAB_INDEX, "");
|
|
}
|
|
|
|
emit(EVENT_PAGINATION_UPDATED, {
|
|
list: list,
|
|
items: items
|
|
}, prev, curr);
|
|
}
|
|
|
|
return {
|
|
items: items,
|
|
mount: mount,
|
|
destroy: destroy,
|
|
getAt: getAt,
|
|
update: update
|
|
};
|
|
}
|
|
|
|
var TRIGGER_KEYS = [" ", "Enter"];
|
|
|
|
function Sync(Splide2, Components2, options) {
|
|
var isNavigation = options.isNavigation,
|
|
slideFocus = options.slideFocus;
|
|
var events = [];
|
|
|
|
function setup() {
|
|
Splide2.options = {
|
|
slideFocus: isUndefined(slideFocus) ? isNavigation : slideFocus
|
|
};
|
|
}
|
|
|
|
function mount() {
|
|
Splide2.splides.forEach(function (target) {
|
|
if (!target.isParent) {
|
|
sync(Splide2, target.splide);
|
|
sync(target.splide, Splide2);
|
|
}
|
|
});
|
|
|
|
if (isNavigation) {
|
|
navigate();
|
|
}
|
|
}
|
|
|
|
function destroy() {
|
|
events.forEach(function (event) {
|
|
event.destroy();
|
|
});
|
|
empty(events);
|
|
}
|
|
|
|
function remount() {
|
|
destroy();
|
|
mount();
|
|
}
|
|
|
|
function sync(splide, target) {
|
|
var event = EventInterface(splide);
|
|
event.on(EVENT_MOVE, function (index, prev, dest) {
|
|
target.go(target.is(LOOP) ? dest : index);
|
|
});
|
|
events.push(event);
|
|
}
|
|
|
|
function navigate() {
|
|
var event = EventInterface(Splide2);
|
|
var on = event.on;
|
|
on(EVENT_CLICK, onClick);
|
|
on(EVENT_SLIDE_KEYDOWN, onKeydown);
|
|
on([EVENT_MOUNTED, EVENT_UPDATED], update);
|
|
events.push(event);
|
|
event.emit(EVENT_NAVIGATION_MOUNTED, Splide2.splides);
|
|
}
|
|
|
|
function update() {
|
|
setAttribute(Components2.Elements.list, ARIA_ORIENTATION, options.direction === TTB ? "vertical" : "");
|
|
}
|
|
|
|
function onClick(Slide) {
|
|
Splide2.go(Slide.index);
|
|
}
|
|
|
|
function onKeydown(Slide, e) {
|
|
if (includes(TRIGGER_KEYS, normalizeKey(e))) {
|
|
onClick(Slide);
|
|
prevent(e);
|
|
}
|
|
}
|
|
|
|
return {
|
|
setup: setup,
|
|
mount: mount,
|
|
destroy: destroy,
|
|
remount: remount
|
|
};
|
|
}
|
|
|
|
function Wheel(Splide2, Components2, options) {
|
|
var _EventInterface13 = EventInterface(Splide2),
|
|
bind = _EventInterface13.bind;
|
|
|
|
var lastTime = 0;
|
|
|
|
function mount() {
|
|
if (options.wheel) {
|
|
bind(Components2.Elements.track, "wheel", onWheel, SCROLL_LISTENER_OPTIONS);
|
|
}
|
|
}
|
|
|
|
function onWheel(e) {
|
|
if (e.cancelable) {
|
|
var deltaY = e.deltaY;
|
|
var backwards = deltaY < 0;
|
|
var timeStamp = timeOf(e);
|
|
|
|
var _min = options.wheelMinThreshold || 0;
|
|
|
|
var sleep = options.wheelSleep || 0;
|
|
|
|
if (abs(deltaY) > _min && timeStamp - lastTime > sleep) {
|
|
Splide2.go(backwards ? "<" : ">");
|
|
lastTime = timeStamp;
|
|
}
|
|
|
|
shouldPrevent(backwards) && prevent(e);
|
|
}
|
|
}
|
|
|
|
function shouldPrevent(backwards) {
|
|
return !options.releaseWheel || Splide2.state.is(MOVING) || Components2.Controller.getAdjacent(backwards) !== -1;
|
|
}
|
|
|
|
return {
|
|
mount: mount
|
|
};
|
|
}
|
|
|
|
var SR_REMOVAL_DELAY = 90;
|
|
|
|
function Live(Splide2, Components2, options) {
|
|
var _EventInterface14 = EventInterface(Splide2),
|
|
on = _EventInterface14.on;
|
|
|
|
var track = Components2.Elements.track;
|
|
var enabled = options.live && !options.isNavigation;
|
|
var sr = create("span", CLASS_SR);
|
|
var interval = RequestInterval(SR_REMOVAL_DELAY, apply(toggle, false));
|
|
|
|
function mount() {
|
|
if (enabled) {
|
|
disable(!Components2.Autoplay.isPaused());
|
|
setAttribute(track, ARIA_ATOMIC, true);
|
|
sr.textContent = "\u2026";
|
|
on(EVENT_AUTOPLAY_PLAY, apply(disable, true));
|
|
on(EVENT_AUTOPLAY_PAUSE, apply(disable, false));
|
|
on([EVENT_MOVED, EVENT_SCROLLED], apply(toggle, true));
|
|
}
|
|
}
|
|
|
|
function toggle(active) {
|
|
setAttribute(track, ARIA_BUSY, active);
|
|
|
|
if (active) {
|
|
append(track, sr);
|
|
interval.start();
|
|
} else {
|
|
remove(sr);
|
|
}
|
|
}
|
|
|
|
function destroy() {
|
|
removeAttribute(track, [ARIA_LIVE, ARIA_ATOMIC, ARIA_BUSY]);
|
|
remove(sr);
|
|
}
|
|
|
|
function disable(disabled) {
|
|
if (enabled) {
|
|
setAttribute(track, ARIA_LIVE, disabled ? "off" : "polite");
|
|
}
|
|
}
|
|
|
|
return {
|
|
mount: mount,
|
|
disable: disable,
|
|
destroy: destroy
|
|
};
|
|
}
|
|
|
|
var ComponentConstructors = /*#__PURE__*/Object.freeze({
|
|
__proto__: null,
|
|
Media: Media,
|
|
Direction: Direction,
|
|
Elements: Elements,
|
|
Slides: Slides,
|
|
Layout: Layout,
|
|
Clones: Clones,
|
|
Move: Move,
|
|
Controller: Controller,
|
|
Arrows: Arrows,
|
|
Autoplay: Autoplay,
|
|
Cover: Cover,
|
|
Scroll: Scroll,
|
|
Drag: Drag,
|
|
Keyboard: Keyboard,
|
|
LazyLoad: LazyLoad,
|
|
Pagination: Pagination,
|
|
Sync: Sync,
|
|
Wheel: Wheel,
|
|
Live: Live
|
|
});
|
|
var I18N = {
|
|
prev: "Previous slide",
|
|
next: "Next slide",
|
|
first: "Go to first slide",
|
|
last: "Go to last slide",
|
|
slideX: "Go to slide %s",
|
|
pageX: "Go to page %s",
|
|
play: "Start autoplay",
|
|
pause: "Pause autoplay",
|
|
carousel: "carousel",
|
|
slide: "slide",
|
|
select: "Select a slide to show",
|
|
slideLabel: "%s of %s"
|
|
};
|
|
var DEFAULTS = {
|
|
type: "slide",
|
|
role: "region",
|
|
speed: 400,
|
|
perPage: 1,
|
|
cloneStatus: true,
|
|
arrows: true,
|
|
pagination: true,
|
|
paginationKeyboard: true,
|
|
interval: 5e3,
|
|
pauseOnHover: true,
|
|
pauseOnFocus: true,
|
|
resetProgress: true,
|
|
easing: "cubic-bezier(0.25, 1, 0.5, 1)",
|
|
drag: true,
|
|
direction: "ltr",
|
|
trimSpace: true,
|
|
focusableNodes: "a, button, textarea, input, select, iframe",
|
|
live: true,
|
|
classes: CLASSES,
|
|
i18n: I18N,
|
|
reducedMotion: {
|
|
speed: 0,
|
|
rewindSpeed: 0,
|
|
autoplay: "pause"
|
|
}
|
|
};
|
|
|
|
function Fade(Splide2, Components2, options) {
|
|
var _EventInterface15 = EventInterface(Splide2),
|
|
on = _EventInterface15.on;
|
|
|
|
function mount() {
|
|
on([EVENT_MOUNTED, EVENT_REFRESH], function () {
|
|
nextTick(function () {
|
|
Components2.Slides.style("transition", "opacity " + options.speed + "ms " + options.easing);
|
|
});
|
|
});
|
|
}
|
|
|
|
function start(index, done) {
|
|
var track = Components2.Elements.track;
|
|
style(track, "height", unit(rect(track).height));
|
|
nextTick(function () {
|
|
done();
|
|
style(track, "height", "");
|
|
});
|
|
}
|
|
|
|
return {
|
|
mount: mount,
|
|
start: start,
|
|
cancel: noop
|
|
};
|
|
}
|
|
|
|
function Slide(Splide2, Components2, options) {
|
|
var _EventInterface16 = EventInterface(Splide2),
|
|
bind = _EventInterface16.bind;
|
|
|
|
var Move = Components2.Move,
|
|
Controller = Components2.Controller,
|
|
Scroll = Components2.Scroll;
|
|
var list = Components2.Elements.list;
|
|
var transition = apply(style, list, "transition");
|
|
var endCallback;
|
|
|
|
function mount() {
|
|
bind(list, "transitionend", function (e) {
|
|
if (e.target === list && endCallback) {
|
|
cancel();
|
|
endCallback();
|
|
}
|
|
});
|
|
}
|
|
|
|
function start(index, done) {
|
|
var destination = Move.toPosition(index, true);
|
|
var position = Move.getPosition();
|
|
var speed = getSpeed(index);
|
|
|
|
if (abs(destination - position) >= 1 && speed >= 1) {
|
|
if (options.useScroll) {
|
|
Scroll.scroll(destination, speed, false, done);
|
|
} else {
|
|
transition("transform " + speed + "ms " + options.easing);
|
|
Move.translate(destination, true);
|
|
endCallback = done;
|
|
}
|
|
} else {
|
|
Move.jump(index);
|
|
done();
|
|
}
|
|
}
|
|
|
|
function cancel() {
|
|
transition("");
|
|
Scroll.cancel();
|
|
}
|
|
|
|
function getSpeed(index) {
|
|
var rewindSpeed = options.rewindSpeed;
|
|
|
|
if (Splide2.is(SLIDE) && rewindSpeed) {
|
|
var prev = Controller.getIndex(true);
|
|
var end = Controller.getEnd();
|
|
|
|
if (prev === 0 && index >= end || prev >= end && index === 0) {
|
|
return rewindSpeed;
|
|
}
|
|
}
|
|
|
|
return options.speed;
|
|
}
|
|
|
|
return {
|
|
mount: mount,
|
|
start: start,
|
|
cancel: cancel
|
|
};
|
|
}
|
|
|
|
var _Splide = /*#__PURE__*/function () {
|
|
function _Splide(target, options) {
|
|
this.event = EventInterface();
|
|
this.Components = {};
|
|
this.state = State(CREATED);
|
|
this.splides = [];
|
|
this._o = {};
|
|
this._E = {};
|
|
var root = isString(target) ? query(document, target) : target;
|
|
assert(root, root + " is invalid.");
|
|
this.root = root;
|
|
options = merge({
|
|
label: getAttribute(root, ARIA_LABEL) || "",
|
|
labelledby: getAttribute(root, ARIA_LABELLEDBY) || ""
|
|
}, DEFAULTS, _Splide.defaults, options || {});
|
|
|
|
try {
|
|
merge(options, JSON.parse(getAttribute(root, DATA_ATTRIBUTE)));
|
|
} catch (e) {
|
|
assert(false, "Invalid JSON");
|
|
}
|
|
|
|
this._o = Object.create(merge({}, options));
|
|
}
|
|
|
|
var _proto = _Splide.prototype;
|
|
|
|
_proto.mount = function mount(Extensions, Transition) {
|
|
var _this = this;
|
|
|
|
var state = this.state,
|
|
Components2 = this.Components;
|
|
assert(state.is([CREATED, DESTROYED]), "Already mounted!");
|
|
state.set(CREATED);
|
|
this._C = Components2;
|
|
this._T = Transition || this._T || (this.is(FADE) ? Fade : Slide);
|
|
this._E = Extensions || this._E;
|
|
var Constructors = assign({}, ComponentConstructors, this._E, {
|
|
Transition: this._T
|
|
});
|
|
forOwn(Constructors, function (Component, key) {
|
|
var component = Component(_this, Components2, _this._o);
|
|
Components2[key] = component;
|
|
component.setup && component.setup();
|
|
});
|
|
forOwn(Components2, function (component) {
|
|
component.mount && component.mount();
|
|
});
|
|
this.emit(EVENT_MOUNTED);
|
|
addClass(this.root, CLASS_INITIALIZED);
|
|
state.set(IDLE);
|
|
this.emit(EVENT_READY);
|
|
return this;
|
|
};
|
|
|
|
_proto.sync = function sync(splide) {
|
|
this.splides.push({
|
|
splide: splide
|
|
});
|
|
splide.splides.push({
|
|
splide: this,
|
|
isParent: true
|
|
});
|
|
|
|
if (this.state.is(IDLE)) {
|
|
this._C.Sync.remount();
|
|
|
|
splide.Components.Sync.remount();
|
|
}
|
|
|
|
return this;
|
|
};
|
|
|
|
_proto.go = function go(control) {
|
|
this._C.Controller.go(control);
|
|
|
|
return this;
|
|
};
|
|
|
|
_proto.on = function on(events, callback) {
|
|
this.event.on(events, callback);
|
|
return this;
|
|
};
|
|
|
|
_proto.off = function off(events) {
|
|
this.event.off(events);
|
|
return this;
|
|
};
|
|
|
|
_proto.emit = function emit(event) {
|
|
var _this$event;
|
|
|
|
(_this$event = this.event).emit.apply(_this$event, [event].concat(slice(arguments, 1)));
|
|
|
|
return this;
|
|
};
|
|
|
|
_proto.add = function add(slides, index) {
|
|
this._C.Slides.add(slides, index);
|
|
|
|
return this;
|
|
};
|
|
|
|
_proto.remove = function remove(matcher) {
|
|
this._C.Slides.remove(matcher);
|
|
|
|
return this;
|
|
};
|
|
|
|
_proto.is = function is(type) {
|
|
return this._o.type === type;
|
|
};
|
|
|
|
_proto.refresh = function refresh() {
|
|
this.emit(EVENT_REFRESH);
|
|
return this;
|
|
};
|
|
|
|
_proto.destroy = function destroy(completely) {
|
|
if (completely === void 0) {
|
|
completely = true;
|
|
}
|
|
|
|
var event = this.event,
|
|
state = this.state;
|
|
|
|
if (state.is(CREATED)) {
|
|
EventInterface(this).on(EVENT_READY, this.destroy.bind(this, completely));
|
|
} else {
|
|
forOwn(this._C, function (component) {
|
|
component.destroy && component.destroy(completely);
|
|
}, true);
|
|
event.emit(EVENT_DESTROY);
|
|
event.destroy();
|
|
completely && empty(this.splides);
|
|
state.set(DESTROYED);
|
|
}
|
|
|
|
return this;
|
|
};
|
|
|
|
_createClass(_Splide, [{
|
|
key: "options",
|
|
get: function get() {
|
|
return this._o;
|
|
},
|
|
set: function set(options) {
|
|
this._C.Media.set(options, true);
|
|
}
|
|
}, {
|
|
key: "length",
|
|
get: function get() {
|
|
return this._C.Slides.getLength(true);
|
|
}
|
|
}, {
|
|
key: "index",
|
|
get: function get() {
|
|
return this._C.Controller.getIndex();
|
|
}
|
|
}]);
|
|
|
|
return _Splide;
|
|
}();
|
|
|
|
var Splide = _Splide;
|
|
Splide.defaults = {};
|
|
Splide.STATES = STATES;
|
|
var CLASS_RENDERED = "is-rendered";
|
|
var RENDERER_DEFAULT_CONFIG = {
|
|
listTag: "ul",
|
|
slideTag: "li"
|
|
};
|
|
|
|
var Style = /*#__PURE__*/function () {
|
|
function Style(id, options) {
|
|
this.styles = {};
|
|
this.id = id;
|
|
this.options = options;
|
|
}
|
|
|
|
var _proto2 = Style.prototype;
|
|
|
|
_proto2.rule = function rule(selector, prop, value, breakpoint) {
|
|
breakpoint = breakpoint || "default";
|
|
var selectors = this.styles[breakpoint] = this.styles[breakpoint] || {};
|
|
var styles = selectors[selector] = selectors[selector] || {};
|
|
styles[prop] = value;
|
|
};
|
|
|
|
_proto2.build = function build() {
|
|
var _this2 = this;
|
|
|
|
var css = "";
|
|
|
|
if (this.styles.default) {
|
|
css += this.buildSelectors(this.styles.default);
|
|
}
|
|
|
|
Object.keys(this.styles).sort(function (n, m) {
|
|
return _this2.options.mediaQuery === "min" ? +n - +m : +m - +n;
|
|
}).forEach(function (breakpoint) {
|
|
if (breakpoint !== "default") {
|
|
css += "@media screen and (max-width: " + breakpoint + "px) {";
|
|
css += _this2.buildSelectors(_this2.styles[breakpoint]);
|
|
css += "}";
|
|
}
|
|
});
|
|
return css;
|
|
};
|
|
|
|
_proto2.buildSelectors = function buildSelectors(selectors) {
|
|
var _this3 = this;
|
|
|
|
var css = "";
|
|
forOwn(selectors, function (styles, selector) {
|
|
selector = ("#" + _this3.id + " " + selector).trim();
|
|
css += selector + " {";
|
|
forOwn(styles, function (value, prop) {
|
|
if (value || value === 0) {
|
|
css += prop + ": " + value + ";";
|
|
}
|
|
});
|
|
css += "}";
|
|
});
|
|
return css;
|
|
};
|
|
|
|
return Style;
|
|
}();
|
|
|
|
var SplideRenderer = /*#__PURE__*/function () {
|
|
function SplideRenderer(contents, options, config, defaults) {
|
|
this.slides = [];
|
|
this.options = {};
|
|
this.breakpoints = [];
|
|
merge(DEFAULTS, defaults || {});
|
|
merge(merge(this.options, DEFAULTS), options || {});
|
|
this.contents = contents;
|
|
this.config = assign({}, RENDERER_DEFAULT_CONFIG, config || {});
|
|
this.id = this.config.id || uniqueId("splide");
|
|
this.Style = new Style(this.id, this.options);
|
|
this.Direction = Direction(null, null, this.options);
|
|
assert(this.contents.length, "Provide at least 1 content.");
|
|
this.init();
|
|
}
|
|
|
|
SplideRenderer.clean = function clean(splide) {
|
|
var _EventInterface17 = EventInterface(splide),
|
|
on = _EventInterface17.on;
|
|
|
|
var root = splide.root;
|
|
var clones = queryAll(root, "." + CLASS_CLONE);
|
|
on(EVENT_MOUNTED, function () {
|
|
remove(child(root, "style"));
|
|
});
|
|
remove(clones);
|
|
};
|
|
|
|
var _proto3 = SplideRenderer.prototype;
|
|
|
|
_proto3.init = function init() {
|
|
this.parseBreakpoints();
|
|
this.initSlides();
|
|
this.registerRootStyles();
|
|
this.registerTrackStyles();
|
|
this.registerSlideStyles();
|
|
this.registerListStyles();
|
|
};
|
|
|
|
_proto3.initSlides = function initSlides() {
|
|
var _this4 = this;
|
|
|
|
push(this.slides, this.contents.map(function (content, index) {
|
|
content = isString(content) ? {
|
|
html: content
|
|
} : content;
|
|
content.styles = content.styles || {};
|
|
content.attrs = content.attrs || {};
|
|
|
|
_this4.cover(content);
|
|
|
|
var classes = _this4.options.classes.slide + " " + (index === 0 ? CLASS_ACTIVE : "");
|
|
assign(content.attrs, {
|
|
class: (classes + " " + (content.attrs.class || "")).trim(),
|
|
style: _this4.buildStyles(content.styles)
|
|
});
|
|
return content;
|
|
}));
|
|
|
|
if (this.isLoop()) {
|
|
this.generateClones(this.slides);
|
|
}
|
|
};
|
|
|
|
_proto3.registerRootStyles = function registerRootStyles() {
|
|
var _this5 = this;
|
|
|
|
this.breakpoints.forEach(function (_ref2) {
|
|
var width = _ref2[0],
|
|
options = _ref2[1];
|
|
|
|
_this5.Style.rule(" ", "max-width", unit(options.width), width);
|
|
});
|
|
};
|
|
|
|
_proto3.registerTrackStyles = function registerTrackStyles() {
|
|
var _this6 = this;
|
|
|
|
var Style2 = this.Style;
|
|
var selector = "." + CLASS_TRACK;
|
|
this.breakpoints.forEach(function (_ref3) {
|
|
var width = _ref3[0],
|
|
options = _ref3[1];
|
|
Style2.rule(selector, _this6.resolve("paddingLeft"), _this6.cssPadding(options, false), width);
|
|
Style2.rule(selector, _this6.resolve("paddingRight"), _this6.cssPadding(options, true), width);
|
|
Style2.rule(selector, "height", _this6.cssTrackHeight(options), width);
|
|
});
|
|
};
|
|
|
|
_proto3.registerListStyles = function registerListStyles() {
|
|
var _this7 = this;
|
|
|
|
var Style2 = this.Style;
|
|
var selector = "." + CLASS_LIST;
|
|
this.breakpoints.forEach(function (_ref4) {
|
|
var width = _ref4[0],
|
|
options = _ref4[1];
|
|
Style2.rule(selector, "transform", _this7.buildTranslate(options), width);
|
|
|
|
if (!_this7.cssSlideHeight(options)) {
|
|
Style2.rule(selector, "aspect-ratio", _this7.cssAspectRatio(options), width);
|
|
}
|
|
});
|
|
};
|
|
|
|
_proto3.registerSlideStyles = function registerSlideStyles() {
|
|
var _this8 = this;
|
|
|
|
var Style2 = this.Style;
|
|
var selector = "." + CLASS_SLIDE;
|
|
this.breakpoints.forEach(function (_ref5) {
|
|
var width = _ref5[0],
|
|
options = _ref5[1];
|
|
Style2.rule(selector, "width", _this8.cssSlideWidth(options), width);
|
|
Style2.rule(selector, "height", _this8.cssSlideHeight(options) || "100%", width);
|
|
Style2.rule(selector, _this8.resolve("marginRight"), unit(options.gap) || "0px", width);
|
|
Style2.rule(selector + " > img", "display", options.cover ? "none" : "inline", width);
|
|
});
|
|
};
|
|
|
|
_proto3.buildTranslate = function buildTranslate(options) {
|
|
var _this$Direction = this.Direction,
|
|
resolve = _this$Direction.resolve,
|
|
orient = _this$Direction.orient;
|
|
var values = [];
|
|
values.push(this.cssOffsetClones(options));
|
|
values.push(this.cssOffsetGaps(options));
|
|
|
|
if (this.isCenter(options)) {
|
|
values.push(this.buildCssValue(orient(-50), "%"));
|
|
values.push.apply(values, this.cssOffsetCenter(options));
|
|
}
|
|
|
|
return values.filter(Boolean).map(function (value) {
|
|
return "translate" + resolve("X") + "(" + value + ")";
|
|
}).join(" ");
|
|
};
|
|
|
|
_proto3.cssOffsetClones = function cssOffsetClones(options) {
|
|
var _this$Direction2 = this.Direction,
|
|
resolve = _this$Direction2.resolve,
|
|
orient = _this$Direction2.orient;
|
|
var cloneCount = this.getCloneCount();
|
|
|
|
if (this.isFixedWidth(options)) {
|
|
var _this$parseCssValue = this.parseCssValue(options[resolve("fixedWidth")]),
|
|
value = _this$parseCssValue.value,
|
|
unit2 = _this$parseCssValue.unit;
|
|
|
|
return this.buildCssValue(orient(value) * cloneCount, unit2);
|
|
}
|
|
|
|
var percent = 100 * cloneCount / options.perPage;
|
|
return orient(percent) + "%";
|
|
};
|
|
|
|
_proto3.cssOffsetCenter = function cssOffsetCenter(options) {
|
|
var _this$Direction3 = this.Direction,
|
|
resolve = _this$Direction3.resolve,
|
|
orient = _this$Direction3.orient;
|
|
|
|
if (this.isFixedWidth(options)) {
|
|
var _this$parseCssValue2 = this.parseCssValue(options[resolve("fixedWidth")]),
|
|
value = _this$parseCssValue2.value,
|
|
unit2 = _this$parseCssValue2.unit;
|
|
|
|
return [this.buildCssValue(orient(value / 2), unit2)];
|
|
}
|
|
|
|
var values = [];
|
|
var perPage = options.perPage,
|
|
gap = options.gap;
|
|
values.push(orient(50 / perPage) + "%");
|
|
|
|
if (gap) {
|
|
var _this$parseCssValue3 = this.parseCssValue(gap),
|
|
_value = _this$parseCssValue3.value,
|
|
_unit = _this$parseCssValue3.unit;
|
|
|
|
var gapOffset = (_value / perPage - _value) / 2;
|
|
values.push(this.buildCssValue(orient(gapOffset), _unit));
|
|
}
|
|
|
|
return values;
|
|
};
|
|
|
|
_proto3.cssOffsetGaps = function cssOffsetGaps(options) {
|
|
var cloneCount = this.getCloneCount();
|
|
|
|
if (cloneCount && options.gap) {
|
|
var orient = this.Direction.orient;
|
|
|
|
var _this$parseCssValue4 = this.parseCssValue(options.gap),
|
|
value = _this$parseCssValue4.value,
|
|
unit2 = _this$parseCssValue4.unit;
|
|
|
|
if (this.isFixedWidth(options)) {
|
|
return this.buildCssValue(orient(value * cloneCount), unit2);
|
|
}
|
|
|
|
var perPage = options.perPage;
|
|
var gaps = cloneCount / perPage;
|
|
return this.buildCssValue(orient(gaps * value), unit2);
|
|
}
|
|
|
|
return "";
|
|
};
|
|
|
|
_proto3.resolve = function resolve(prop) {
|
|
return camelToKebab(this.Direction.resolve(prop));
|
|
};
|
|
|
|
_proto3.cssPadding = function cssPadding(options, right) {
|
|
var padding = options.padding;
|
|
var prop = this.Direction.resolve(right ? "right" : "left", true);
|
|
return padding && unit(padding[prop] || (isObject(padding) ? 0 : padding)) || "0px";
|
|
};
|
|
|
|
_proto3.cssTrackHeight = function cssTrackHeight(options) {
|
|
var height = "";
|
|
|
|
if (this.isVertical()) {
|
|
height = this.cssHeight(options);
|
|
assert(height, '"height" is missing.');
|
|
height = "calc(" + height + " - " + this.cssPadding(options, false) + " - " + this.cssPadding(options, true) + ")";
|
|
}
|
|
|
|
return height;
|
|
};
|
|
|
|
_proto3.cssHeight = function cssHeight(options) {
|
|
return unit(options.height);
|
|
};
|
|
|
|
_proto3.cssSlideWidth = function cssSlideWidth(options) {
|
|
return options.autoWidth ? "" : unit(options.fixedWidth) || (this.isVertical() ? "" : this.cssSlideSize(options));
|
|
};
|
|
|
|
_proto3.cssSlideHeight = function cssSlideHeight(options) {
|
|
return unit(options.fixedHeight) || (this.isVertical() ? options.autoHeight ? "" : this.cssSlideSize(options) : this.cssHeight(options));
|
|
};
|
|
|
|
_proto3.cssSlideSize = function cssSlideSize(options) {
|
|
var gap = unit(options.gap);
|
|
return "calc((100%" + (gap && " + " + gap) + ")/" + (options.perPage || 1) + (gap && " - " + gap) + ")";
|
|
};
|
|
|
|
_proto3.cssAspectRatio = function cssAspectRatio(options) {
|
|
var heightRatio = options.heightRatio;
|
|
return heightRatio ? "" + 1 / heightRatio : "";
|
|
};
|
|
|
|
_proto3.buildCssValue = function buildCssValue(value, unit2) {
|
|
return "" + value + unit2;
|
|
};
|
|
|
|
_proto3.parseCssValue = function parseCssValue(value) {
|
|
if (isString(value)) {
|
|
var number = parseFloat(value) || 0;
|
|
var unit2 = value.replace(/\d*(\.\d*)?/, "") || "px";
|
|
return {
|
|
value: number,
|
|
unit: unit2
|
|
};
|
|
}
|
|
|
|
return {
|
|
value: value,
|
|
unit: "px"
|
|
};
|
|
};
|
|
|
|
_proto3.parseBreakpoints = function parseBreakpoints() {
|
|
var _this9 = this;
|
|
|
|
var breakpoints = this.options.breakpoints;
|
|
this.breakpoints.push(["default", this.options]);
|
|
|
|
if (breakpoints) {
|
|
forOwn(breakpoints, function (options, width) {
|
|
_this9.breakpoints.push([width, merge(merge({}, _this9.options), options)]);
|
|
});
|
|
}
|
|
};
|
|
|
|
_proto3.isFixedWidth = function isFixedWidth(options) {
|
|
return !!options[this.Direction.resolve("fixedWidth")];
|
|
};
|
|
|
|
_proto3.isLoop = function isLoop() {
|
|
return this.options.type === LOOP;
|
|
};
|
|
|
|
_proto3.isCenter = function isCenter(options) {
|
|
if (options.focus === "center") {
|
|
if (this.isLoop()) {
|
|
return true;
|
|
}
|
|
|
|
if (this.options.type === SLIDE) {
|
|
return !this.options.trimSpace;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
};
|
|
|
|
_proto3.isVertical = function isVertical() {
|
|
return this.options.direction === TTB;
|
|
};
|
|
|
|
_proto3.buildClasses = function buildClasses() {
|
|
var options = this.options;
|
|
return [CLASS_ROOT, CLASS_ROOT + "--" + options.type, CLASS_ROOT + "--" + options.direction, options.drag && CLASS_ROOT + "--draggable", options.isNavigation && CLASS_ROOT + "--nav", CLASS_ACTIVE, !this.config.hidden && CLASS_RENDERED].filter(Boolean).join(" ");
|
|
};
|
|
|
|
_proto3.buildAttrs = function buildAttrs(attrs) {
|
|
var attr = "";
|
|
forOwn(attrs, function (value, key) {
|
|
attr += value ? " " + camelToKebab(key) + "=\"" + value + "\"" : "";
|
|
});
|
|
return attr.trim();
|
|
};
|
|
|
|
_proto3.buildStyles = function buildStyles(styles) {
|
|
var style = "";
|
|
forOwn(styles, function (value, key) {
|
|
style += " " + camelToKebab(key) + ":" + value + ";";
|
|
});
|
|
return style.trim();
|
|
};
|
|
|
|
_proto3.renderSlides = function renderSlides() {
|
|
var _this10 = this;
|
|
|
|
var tag = this.config.slideTag;
|
|
return this.slides.map(function (content) {
|
|
return "<" + tag + " " + _this10.buildAttrs(content.attrs) + ">" + (content.html || "") + "</" + tag + ">";
|
|
}).join("");
|
|
};
|
|
|
|
_proto3.cover = function cover(content) {
|
|
var styles = content.styles,
|
|
_content$html = content.html,
|
|
html = _content$html === void 0 ? "" : _content$html;
|
|
|
|
if (this.options.cover && !this.options.lazyLoad) {
|
|
var src = html.match(/<img.*?src\s*=\s*(['"])(.+?)\1.*?>/);
|
|
|
|
if (src && src[2]) {
|
|
styles.background = "center/cover no-repeat url('" + src[2] + "')";
|
|
}
|
|
}
|
|
};
|
|
|
|
_proto3.generateClones = function generateClones(contents) {
|
|
var classes = this.options.classes;
|
|
var count = this.getCloneCount();
|
|
var slides = contents.slice();
|
|
|
|
while (slides.length < count) {
|
|
push(slides, slides);
|
|
}
|
|
|
|
push(slides.slice(-count).reverse(), slides.slice(0, count)).forEach(function (content, index) {
|
|
var attrs = assign({}, content.attrs, {
|
|
class: content.attrs.class + " " + classes.clone
|
|
});
|
|
var clone = assign({}, content, {
|
|
attrs: attrs
|
|
});
|
|
index < count ? contents.unshift(clone) : contents.push(clone);
|
|
});
|
|
};
|
|
|
|
_proto3.getCloneCount = function getCloneCount() {
|
|
if (this.isLoop()) {
|
|
var options = this.options;
|
|
|
|
if (options.clones) {
|
|
return options.clones;
|
|
}
|
|
|
|
var perPage = max.apply(void 0, this.breakpoints.map(function (_ref6) {
|
|
var options2 = _ref6[1];
|
|
return options2.perPage;
|
|
}));
|
|
return perPage * ((options.flickMaxPages || 1) + 1);
|
|
}
|
|
|
|
return 0;
|
|
};
|
|
|
|
_proto3.renderArrows = function renderArrows() {
|
|
var html = "";
|
|
html += "<div class=\"" + this.options.classes.arrows + "\">";
|
|
html += this.renderArrow(true);
|
|
html += this.renderArrow(false);
|
|
html += "</div>";
|
|
return html;
|
|
};
|
|
|
|
_proto3.renderArrow = function renderArrow(prev) {
|
|
var _this$options = this.options,
|
|
classes = _this$options.classes,
|
|
i18n = _this$options.i18n;
|
|
var attrs = {
|
|
class: classes.arrow + " " + (prev ? classes.prev : classes.next),
|
|
type: "button",
|
|
ariaLabel: prev ? i18n.prev : i18n.next
|
|
};
|
|
return "<button " + this.buildAttrs(attrs) + "><svg xmlns=\"" + XML_NAME_SPACE + "\" viewBox=\"0 0 " + SIZE + " " + SIZE + "\" width=\"" + SIZE + "\" height=\"" + SIZE + "\"><path d=\"" + (this.options.arrowPath || PATH) + "\" /></svg></button>";
|
|
};
|
|
|
|
_proto3.html = function html() {
|
|
var _this$config = this.config,
|
|
rootClass = _this$config.rootClass,
|
|
listTag = _this$config.listTag,
|
|
arrows = _this$config.arrows,
|
|
beforeTrack = _this$config.beforeTrack,
|
|
afterTrack = _this$config.afterTrack,
|
|
slider = _this$config.slider,
|
|
beforeSlider = _this$config.beforeSlider,
|
|
afterSlider = _this$config.afterSlider;
|
|
var html = "";
|
|
html += "<div id=\"" + this.id + "\" class=\"" + this.buildClasses() + " " + (rootClass || "") + "\">";
|
|
html += "<style>" + this.Style.build() + "</style>";
|
|
|
|
if (slider) {
|
|
html += beforeSlider || "";
|
|
html += "<div class=\"splide__slider\">";
|
|
}
|
|
|
|
html += beforeTrack || "";
|
|
|
|
if (arrows) {
|
|
html += this.renderArrows();
|
|
}
|
|
|
|
html += "<div class=\"splide__track\">";
|
|
html += "<" + listTag + " class=\"splide__list\">";
|
|
html += this.renderSlides();
|
|
html += "</" + listTag + ">";
|
|
html += "</div>";
|
|
html += afterTrack || "";
|
|
|
|
if (slider) {
|
|
html += "</div>";
|
|
html += afterSlider || "";
|
|
}
|
|
|
|
html += "</div>";
|
|
return html;
|
|
};
|
|
|
|
return SplideRenderer;
|
|
}();
|
|
|
|
|
|
|
|
|
|
/***/ })
|
|
|
|
/******/ });
|
|
/************************************************************************/
|
|
/******/ // The module cache
|
|
/******/ var __webpack_module_cache__ = {};
|
|
/******/
|
|
/******/ // The require function
|
|
/******/ function __webpack_require__(moduleId) {
|
|
/******/ // Check if module is in cache
|
|
/******/ var cachedModule = __webpack_module_cache__[moduleId];
|
|
/******/ if (cachedModule !== undefined) {
|
|
/******/ return cachedModule.exports;
|
|
/******/ }
|
|
/******/ // Create a new module (and put it into the cache)
|
|
/******/ var module = __webpack_module_cache__[moduleId] = {
|
|
/******/ // no module.id needed
|
|
/******/ // no module.loaded needed
|
|
/******/ exports: {}
|
|
/******/ };
|
|
/******/
|
|
/******/ // Execute the module function
|
|
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
/******/
|
|
/******/ // Return the exports of the module
|
|
/******/ return module.exports;
|
|
/******/ }
|
|
/******/
|
|
/************************************************************************/
|
|
/******/ /* webpack/runtime/define property getters */
|
|
/******/ !function() {
|
|
/******/ // define getter functions for harmony exports
|
|
/******/ __webpack_require__.d = function(exports, definition) {
|
|
/******/ for(var key in definition) {
|
|
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
|
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
|
/******/ }
|
|
/******/ }
|
|
/******/ };
|
|
/******/ }();
|
|
/******/
|
|
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
|
/******/ !function() {
|
|
/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
|
|
/******/ }();
|
|
/******/
|
|
/******/ /* webpack/runtime/make namespace object */
|
|
/******/ !function() {
|
|
/******/ // define __esModule on exports
|
|
/******/ __webpack_require__.r = function(exports) {
|
|
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
|
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
/******/ }
|
|
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
|
/******/ };
|
|
/******/ }();
|
|
/******/
|
|
/************************************************************************/
|
|
var __webpack_exports__ = {};
|
|
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
|
|
!function() {
|
|
/*!*********************************!*\
|
|
!*** ./public/assets/js/app.js ***!
|
|
\*********************************/
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _splidejs_splide__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @splidejs/splide */ "./node_modules/@splidejs/splide/dist/js/splide.esm.js");
|
|
// ----------------------------------------------------------------------------
|
|
// DATA
|
|
// ----------------------------------------------------------------------------
|
|
// UTILS
|
|
|
|
const body = document.body; // SPLIDE SLIDER
|
|
|
|
const logo = document.querySelector('.logo__icon');
|
|
let slider = document.querySelector('.splide');
|
|
const slides = document.querySelectorAll('.splide__slide'); // EXHIBITION IFRAME
|
|
|
|
const sidebar = document.querySelector('.sidebar');
|
|
const sidebarNavLinks = document.querySelectorAll('.sidebar__nav-link--iframe');
|
|
const exhibitionIframe = document.querySelector('.exhibition'); // NAV LINKS TARGET
|
|
|
|
const mediaQueries = {
|
|
remTabletWidth: 48,
|
|
remDesktopWidth: 62
|
|
}; // ----------------------------------------------------------------------------
|
|
// LOGIC
|
|
// ----------------------------------------------------------------------------
|
|
// UTILS
|
|
// Enable CSS :active pseudo-class in Safari Mobile
|
|
|
|
function enableActivePseudoClass() {
|
|
document.addEventListener("touchstart", function () {}, false);
|
|
} // Convert rem to pixels by getting font-size CSS property
|
|
|
|
|
|
function convertRemToPixels(rem) {
|
|
let fontSize = parseFloat(window.getComputedStyle(body).getPropertyValue('font-size'));
|
|
return rem * fontSize;
|
|
} // SPLIDE SLIDER
|
|
|
|
|
|
function setUpSlider() {
|
|
if (slider) {
|
|
slider = new _splidejs_splide__WEBPACK_IMPORTED_MODULE_0__["default"]('.splide', {
|
|
type: 'fade',
|
|
rewind: true,
|
|
rewindByDrag: true,
|
|
speed: 400,
|
|
fixedWidth: '100vw',
|
|
fixedHeight: '100vh',
|
|
arrows: false,
|
|
pagination: false,
|
|
easing: 'ease-in-out',
|
|
drag: true,
|
|
wheel: true
|
|
});
|
|
}
|
|
}
|
|
|
|
function mountSlider() {
|
|
if (slider) {
|
|
slider.mount();
|
|
}
|
|
}
|
|
|
|
function goToNextSlideOnClick() {
|
|
if (slider) {
|
|
slider.on('click', function (e) {
|
|
slider.go('>');
|
|
});
|
|
}
|
|
}
|
|
|
|
function turnLogoToBlack() {
|
|
if (logo) {
|
|
logo.classList.remove('logo__icon--white');
|
|
logo.classList.add('logo__icon--black');
|
|
}
|
|
}
|
|
|
|
function turnLogoToWhite() {
|
|
if (logo) {
|
|
logo.classList.remove('logo__icon--black');
|
|
logo.classList.add('logo__icon--white');
|
|
}
|
|
}
|
|
|
|
function editLogoColor(slide) {
|
|
if (slide) {
|
|
if (slide.getAttribute('data-logo-color') === 'white') {
|
|
turnLogoToWhite();
|
|
} else if (slide.getAttribute('data-logo-color') === 'black') {
|
|
turnLogoToBlack();
|
|
}
|
|
}
|
|
}
|
|
|
|
function editLogoColorOnSliderMounted() {
|
|
if (slider && slides) {
|
|
slider.on('mounted', function () {
|
|
editLogoColor(slides[0]);
|
|
});
|
|
}
|
|
}
|
|
|
|
function editLogoColorOnSlideActive() {
|
|
if (slider) {
|
|
slider.on('active', function (e) {
|
|
editLogoColor(e.slide);
|
|
});
|
|
}
|
|
}
|
|
|
|
function enableLogoRotation() {
|
|
if (logo) {
|
|
logo.classList.add('logo__icon--rotate-horizontal-bottom');
|
|
}
|
|
}
|
|
|
|
function disableLogoRotation() {
|
|
if (logo) {
|
|
logo.classList.remove('logo__icon--rotate-horizontal-bottom');
|
|
}
|
|
}
|
|
|
|
function rotateLogoOnSliderMove() {
|
|
if (slider && logo) {
|
|
slider.on('move', function (e) {
|
|
logo.removeEventListener('animationiteration', disableLogoRotation);
|
|
enableLogoRotation();
|
|
});
|
|
slider.on('moved', function (e) {
|
|
logo.addEventListener('animationiteration', disableLogoRotation);
|
|
});
|
|
}
|
|
} // EXHIBITION IFRAME
|
|
|
|
|
|
function slimDownSidebar() {
|
|
if (sidebar && !sidebar.classList.contains('sidebar--slimmed')) {
|
|
sidebar.classList.add('sidebar--slimmed');
|
|
}
|
|
}
|
|
|
|
function enableExhibitionIframeVisibility() {
|
|
if (exhibitionIframe) {
|
|
exhibitionIframe.classList.add('exhibition--visible');
|
|
}
|
|
}
|
|
|
|
function disableExhibitionIframeVisibility() {
|
|
if (exhibitionIframe) {
|
|
exhibitionIframe.classList.remove('exhibition--visible');
|
|
}
|
|
}
|
|
|
|
function editBackgroundColor(sidebarNavLink) {
|
|
if (body && sidebar) {
|
|
if (sidebarNavLink.getAttribute('data-background') === 'feldgrau') {
|
|
body.classList.remove('body--white-background');
|
|
sidebar.classList.remove('sidebar--white-background');
|
|
} else if (sidebarNavLink.getAttribute('data-background') === 'white') {
|
|
body.classList.add('body--white-background');
|
|
sidebar.classList.add('sidebar--white-background');
|
|
}
|
|
}
|
|
}
|
|
|
|
function loadExhibitionIframe() {
|
|
if (sidebarNavLinks.length > 0 && exhibitionIframe) {
|
|
for (let i = 0; i < sidebarNavLinks.length; i++) {
|
|
sidebarNavLinks[i].addEventListener('click', function (e) {
|
|
if (window.innerWidth >= convertRemToPixels(mediaQueries.remDesktopWidth)) {
|
|
logo.removeEventListener('animationiteration', disableLogoRotation);
|
|
enableLogoRotation();
|
|
disableExhibitionIframeVisibility();
|
|
exhibitionIframe.addEventListener('load', function (e) {
|
|
logo.addEventListener('animationiteration', disableLogoRotation);
|
|
slimDownSidebar();
|
|
enableExhibitionIframeVisibility();
|
|
editBackgroundColor(sidebarNavLinks[i]);
|
|
});
|
|
}
|
|
});
|
|
}
|
|
}
|
|
} // NAV LINKS TARGET
|
|
|
|
|
|
function setNavLinksIframeTarget() {
|
|
if (sidebarNavLinks) {
|
|
for (let i = 0; i < sidebarNavLinks.length; i++) {
|
|
sidebarNavLinks[i].setAttribute('target', 'exhibition');
|
|
}
|
|
}
|
|
}
|
|
|
|
function setNavLinksBlankTarget() {
|
|
if (sidebarNavLinks) {
|
|
for (let i = 0; i < sidebarNavLinks.length; i++) {
|
|
sidebarNavLinks[i].setAttribute('target', '_blank');
|
|
}
|
|
}
|
|
}
|
|
|
|
function editNavLinksTarget() {
|
|
if (window.innerWidth >= convertRemToPixels(mediaQueries.remDesktopWidth)) {
|
|
setNavLinksIframeTarget();
|
|
} else {
|
|
setNavLinksBlankTarget();
|
|
}
|
|
}
|
|
|
|
function editNavLinksTargetOnResize() {
|
|
window.addEventListener('resize', function (e) {
|
|
editNavLinksTarget();
|
|
});
|
|
} // ----------------------------------------------------------------------------
|
|
// PROGRAM
|
|
// ----------------------------------------------------------------------------
|
|
// UTILS
|
|
|
|
|
|
enableActivePseudoClass(); // SPLIDE SLIDER
|
|
|
|
setUpSlider();
|
|
editLogoColorOnSliderMounted();
|
|
mountSlider();
|
|
goToNextSlideOnClick();
|
|
editLogoColorOnSlideActive();
|
|
rotateLogoOnSliderMove(); // EXHIBITION IFRAME
|
|
|
|
loadExhibitionIframe(); // NAV LINKS TARGET
|
|
|
|
editNavLinksTarget();
|
|
editNavLinksTargetOnResize();
|
|
}();
|
|
/******/ })()
|
|
;
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNENBQTRDLGdCQUFnQixrQkFBa0IsT0FBTywyQkFBMkIsd0RBQXdELGdDQUFnQyx1REFBdUQ7O0FBRS9QLDhEQUE4RCxzRUFBc0UsOERBQThELGtEQUFrRCxpQkFBaUIsR0FBRzs7QUFFeFE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixpQkFBaUI7QUFDckM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLDhCQUE4QiwwQ0FBMEM7QUFDeEUsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RDtBQUM1RCxLQUFLLElBQUk7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsbUJBQW1CO0FBQ3ZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSywyQ0FBMkM7O0FBRWhEO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQSxvQ0FBb0M7QUFDcEM7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLHFFQUFxRTtBQUNyRTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQSxPQUFPO0FBQ1AsZUFBZTtBQUNmLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDLHNEQUFzRDtBQUN0RDtBQUNBLDJCQUEyQix1Q0FBdUM7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RCxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBLE9BQU87QUFDUCwyQkFBMkI7QUFDM0I7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRWlsQzs7Ozs7OztVQzNqSGxsQztVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOzs7OztXQ3RCQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHlDQUF5Qyx3Q0FBd0M7V0FDakY7V0FDQTtXQUNBOzs7OztXQ1BBLDhDQUE4Qzs7Ozs7V0NBOUM7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdEOzs7Ozs7Ozs7Ozs7Q0NKQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQSxNQUFNQyxJQUFJLEdBQUdDLFFBQVEsQ0FBQ0QsSUFBdEIsRUFFQTs7QUFFQSxNQUFNRSxJQUFJLEdBQUdELFFBQVEsQ0FBQ0UsYUFBVCxDQUF1QixhQUF2QixDQUFiO0FBQ0EsSUFBSUMsTUFBTSxHQUFHSCxRQUFRLENBQUNFLGFBQVQsQ0FBdUIsU0FBdkIsQ0FBYjtBQUNBLE1BQU1FLE1BQU0sR0FBR0osUUFBUSxDQUFDSyxnQkFBVCxDQUEwQixnQkFBMUIsQ0FBZixFQUVBOztBQUVBLE1BQU1DLE9BQU8sR0FBR04sUUFBUSxDQUFDRSxhQUFULENBQXVCLFVBQXZCLENBQWhCO0FBQ0EsTUFBTUssZUFBZSxHQUFHUCxRQUFRLENBQUNLLGdCQUFULENBQTBCLDRCQUExQixDQUF4QjtBQUNBLE1BQU1HLGdCQUFnQixHQUFHUixRQUFRLENBQUNFLGFBQVQsQ0FBdUIsYUFBdkIsQ0FBekIsRUFFQTs7QUFFQSxNQUFNTyxZQUFZLEdBQUc7RUFDcEJDLGNBQWMsRUFBRSxFQURJO0VBRWpCQyxlQUFlLEVBQUU7QUFGQSxDQUFyQixFQUtBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7O0FBQ0EsU0FBU0MsdUJBQVQsR0FBbUM7RUFDbENaLFFBQVEsQ0FBQ2EsZ0JBQVQsQ0FBMEIsWUFBMUIsRUFBd0MsWUFBVyxDQUFFLENBQXJELEVBQXNELEtBQXREO0FBQ0EsRUFFRDs7O0FBQ0EsU0FBU0Msa0JBQVQsQ0FBNEJDLEdBQTVCLEVBQWlDO0VBQ2hDLElBQUlDLFFBQVEsR0FBR0MsVUFBVSxDQUFDQyxNQUFNLENBQUNDLGdCQUFQLENBQXdCcEIsSUFBeEIsRUFBOEJxQixnQkFBOUIsQ0FBK0MsV0FBL0MsQ0FBRCxDQUF6QjtFQUNBLE9BQU9MLEdBQUcsR0FBR0MsUUFBYjtBQUNBLEVBRUQ7OztBQUVBLFNBQVNLLFdBQVQsR0FBdUI7RUFDdEIsSUFBSWxCLE1BQUosRUFBWTtJQUNYQSxNQUFNLEdBQUcsSUFBSUwsd0RBQUosQ0FBVyxTQUFYLEVBQXNCO01BQzlCd0IsSUFBSSxFQUFFLE1BRHdCO01BRTlCQyxNQUFNLEVBQUUsSUFGc0I7TUFHOUJDLFlBQVksRUFBRSxJQUhnQjtNQUk5QkMsS0FBSyxFQUFFLEdBSnVCO01BSzlCQyxVQUFVLEVBQUUsT0FMa0I7TUFNOUJDLFdBQVcsRUFBRSxPQU5pQjtNQU85QkMsTUFBTSxFQUFFLEtBUHNCO01BUTlCQyxVQUFVLEVBQUUsS0FSa0I7TUFTOUJDLE1BQU0sRUFBRSxhQVRzQjtNQVU5QkMsSUFBSSxFQUFFLElBVndCO01BVzlCQyxLQUFLLEVBQUU7SUFYdUIsQ0FBdEIsQ0FBVDtFQWFBO0FBQ0Q7O0FBRUQsU0FBU0MsV0FBVCxHQUF1QjtFQUN0QixJQUFJOUIsTUFBSixFQUFZO0lBQ1hBLE1BQU0sQ0FBQytCLEtBQVA7RUFDQTtBQUNEOztBQUVELFNBQVNDLG9CQUFULEdBQWdDO0VBQy9CLElBQUloQyxNQUFKLEVBQVk7SUFDWEEsTUFBTSxDQUFDaUMsRUFBUCxDQUFVLE9BQVYsRUFBbUIsVUFBU0MsQ0FBVCxFQUFZO01BQzlCbEMsTUFBTSxDQUFDbUMsRUFBUCxDQUFVLEdBQVY7SUFDQSxDQUZEO0VBR0E7QUFDRDs7QUFFRCxTQUFTQyxlQUFULEdBQTJCO0VBQzFCLElBQUl0QyxJQUFKLEVBQVU7SUFDVEEsSUFBSSxDQUFDdUMsU0FBTCxDQUFlQyxNQUFmLENBQXNCLG1CQUF0QjtJQUNBeEMsSUFBSSxDQUFDdUMsU0FBTCxDQUFlRSxHQUFmLENBQW1CLG1CQUFuQjtFQUNBO0FBQ0Q7O0FBRUQsU0FBU0MsZUFBVCxHQUEyQjtFQUMxQixJQUFJMUMsSUFBSixFQUFVO0lBQ1RBLElBQUksQ0FBQ3VDLFNBQUwsQ0FBZUMsTUFBZixDQUFzQixtQkFBdEI7SUFDQXhDLElBQUksQ0FBQ3VDLFNBQUwsQ0FBZUUsR0FBZixDQUFtQixtQkFBbkI7RUFDQTtBQUNEOztBQUVELFNBQVNFLGFBQVQsQ0FBdUJDLEtBQXZCLEVBQThCO0VBQzdCLElBQUlBLEtBQUosRUFBVztJQUNWLElBQUlBLEtBQUssQ0FBQ0MsWUFBTixDQUFtQixpQkFBbkIsTUFBMEMsT0FBOUMsRUFBdUQ7TUFDdERILGVBQWU7SUFDZixDQUZELE1BRU8sSUFBSUUsS0FBSyxDQUFDQyxZQUFOLENBQW1CLGlCQUFuQixNQUEwQyxPQUE5QyxFQUF1RDtNQUM3RFAsZUFBZTtJQUNmO0VBQ0Q7QUFDRDs7QUFFRCxTQUFTUSw0QkFBVCxHQUF3QztFQUN2QyxJQUFJNUMsTUFBTSxJQUFJQyxNQUFkLEVBQXNCO0lBQ3JCRCxNQUFNLENBQUNpQyxFQUFQLENBQVUsU0FBVixFQUFxQixZQUFXO01BQy9CUSxhQUFhLENBQUN4QyxNQUFNLENBQUMsQ0FBRCxDQUFQLENBQWI7SUFDQSxDQUZEO0VBR0E7QUFDRDs7QUFFRCxTQUFTNEMsMEJBQVQsR0FBc0M7RUFDckMsSUFBSTdDLE1BQUosRUFBWTtJQUNYQSxNQUFNLENBQUNpQyxFQUFQLENBQVUsUUFBVixFQUFvQixVQUFTQyxDQUFULEVBQVk7TUFDL0JPLGFBQWEsQ0FBQ1AsQ0FBQyxDQUFDUSxLQUFILENBQWI7SUFDQSxDQUZEO0VBR0E7QUFDRDs7QUFFRCxTQUFTSSxrQkFBVCxHQUE4QjtFQUM3QixJQUFJaEQsSUFBSixFQUFVO0lBQ1RBLElBQUksQ0FBQ3VDLFNBQUwsQ0FBZUUsR0FBZixDQUFtQixzQ0FBbkI7RUFDQTtBQUNEOztBQUVELFNBQVNRLG1CQUFULEdBQStCO0VBQzlCLElBQUlqRCxJQUFKLEVBQVU7SUFDVEEsSUFBSSxDQUFDdUMsU0FBTCxDQUFlQyxNQUFmLENBQXNCLHNDQUF0QjtFQUNBO0FBQ0Q7O0FBRUQsU0FBU1Usc0JBQVQsR0FBa0M7RUFDakMsSUFBSWhELE1BQU0sSUFBSUYsSUFBZCxFQUFvQjtJQUNuQkUsTUFBTSxDQUFDaUMsRUFBUCxDQUFVLE1BQVYsRUFBa0IsVUFBU0MsQ0FBVCxFQUFZO01BQzdCcEMsSUFBSSxDQUFDbUQsbUJBQUwsQ0FBeUIsb0JBQXpCLEVBQStDRixtQkFBL0M7TUFDQUQsa0JBQWtCO0lBQ2xCLENBSEQ7SUFJQTlDLE1BQU0sQ0FBQ2lDLEVBQVAsQ0FBVSxPQUFWLEVBQW1CLFVBQVNDLENBQVQsRUFBWTtNQUM5QnBDLElBQUksQ0FBQ1ksZ0JBQUwsQ0FBc0Isb0JBQXRCLEVBQTRDcUMsbUJBQTVDO0lBQ0EsQ0FGRDtFQUdBO0FBQ0QsRUFFRDs7O0FBRUEsU0FBU0csZUFBVCxHQUEyQjtFQUMxQixJQUFJL0MsT0FBTyxJQUFJLENBQUNBLE9BQU8sQ0FBQ2tDLFNBQVIsQ0FBa0JjLFFBQWxCLENBQTJCLGtCQUEzQixDQUFoQixFQUFnRTtJQUMvRGhELE9BQU8sQ0FBQ2tDLFNBQVIsQ0FBa0JFLEdBQWxCLENBQXNCLGtCQUF0QjtFQUNBO0FBQ0Q7O0FBRUQsU0FBU2EsZ0NBQVQsR0FBNEM7RUFDM0MsSUFBSS9DLGdCQUFKLEVBQXNCO0lBQ3JCQSxnQkFBZ0IsQ0FBQ2dDLFNBQWpCLENBQTJCRSxHQUEzQixDQUErQixxQkFBL0I7RUFDQTtBQUNEOztBQUVELFNBQVNjLGlDQUFULEdBQTZDO0VBQzVDLElBQUloRCxnQkFBSixFQUFzQjtJQUNyQkEsZ0JBQWdCLENBQUNnQyxTQUFqQixDQUEyQkMsTUFBM0IsQ0FBa0MscUJBQWxDO0VBQ0E7QUFDRDs7QUFFRCxTQUFTZ0IsbUJBQVQsQ0FBNkJDLGNBQTdCLEVBQTZDO0VBQzVDLElBQUkzRCxJQUFJLElBQUlPLE9BQVosRUFBcUI7SUFDcEIsSUFBSW9ELGNBQWMsQ0FBQ1osWUFBZixDQUE0QixpQkFBNUIsTUFBbUQsVUFBdkQsRUFBbUU7TUFDbEUvQyxJQUFJLENBQUN5QyxTQUFMLENBQWVDLE1BQWYsQ0FBc0Isd0JBQXRCO01BQ0FuQyxPQUFPLENBQUNrQyxTQUFSLENBQWtCQyxNQUFsQixDQUF5QiwyQkFBekI7SUFDQSxDQUhELE1BR08sSUFBSWlCLGNBQWMsQ0FBQ1osWUFBZixDQUE0QixpQkFBNUIsTUFBbUQsT0FBdkQsRUFBZ0U7TUFDdEUvQyxJQUFJLENBQUN5QyxTQUFMLENBQWVFLEdBQWYsQ0FBbUIsd0JBQW5CO01BQ0FwQyxPQUFPLENBQUNrQyxTQUFSLENBQWtCRSxHQUFsQixDQUFzQiwyQkFBdEI7SUFDQTtFQUNEO0FBQ0Q7O0FBRUQsU0FBU2lCLG9CQUFULEdBQWdDO0VBQy9CLElBQUlwRCxlQUFlLENBQUNxRCxNQUFoQixHQUF5QixDQUF6QixJQUE4QnBELGdCQUFsQyxFQUFvRDtJQUNuRCxLQUFLLElBQUlxRCxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHdEQsZUFBZSxDQUFDcUQsTUFBcEMsRUFBNENDLENBQUMsRUFBN0MsRUFBaUQ7TUFDaER0RCxlQUFlLENBQUNzRCxDQUFELENBQWYsQ0FBbUJoRCxnQkFBbkIsQ0FBb0MsT0FBcEMsRUFBNkMsVUFBU3dCLENBQVQsRUFBWTtRQUN4RCxJQUFJbkIsTUFBTSxDQUFDNEMsVUFBUCxJQUFxQmhELGtCQUFrQixDQUFDTCxZQUFZLENBQUNFLGVBQWQsQ0FBM0MsRUFBMkU7VUFDMUVWLElBQUksQ0FBQ21ELG1CQUFMLENBQXlCLG9CQUF6QixFQUErQ0YsbUJBQS9DO1VBQ0FELGtCQUFrQjtVQUNsQk8saUNBQWlDO1VBQ2pDaEQsZ0JBQWdCLENBQUNLLGdCQUFqQixDQUFrQyxNQUFsQyxFQUEwQyxVQUFTd0IsQ0FBVCxFQUFZO1lBQ3JEcEMsSUFBSSxDQUFDWSxnQkFBTCxDQUFzQixvQkFBdEIsRUFBNENxQyxtQkFBNUM7WUFDQUcsZUFBZTtZQUNmRSxnQ0FBZ0M7WUFDaENFLG1CQUFtQixDQUFDbEQsZUFBZSxDQUFDc0QsQ0FBRCxDQUFoQixDQUFuQjtVQUNBLENBTEQ7UUFNQTtNQUNELENBWkQ7SUFhQTtFQUNEO0FBQ0QsRUFFRDs7O0FBRUEsU0FBU0UsdUJBQVQsR0FBbUM7RUFDbEMsSUFBSXhELGVBQUosRUFBcUI7SUFDcEIsS0FBSyxJQUFJc0QsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR3RELGVBQWUsQ0FBQ3FELE1BQXBDLEVBQTRDQyxDQUFDLEVBQTdDLEVBQWlEO01BQ2hEdEQsZUFBZSxDQUFDc0QsQ0FBRCxDQUFmLENBQW1CRyxZQUFuQixDQUFnQyxRQUFoQyxFQUEwQyxZQUExQztJQUNBO0VBQ0Q7QUFDRDs7QUFFRCxTQUFTQyxzQkFBVCxHQUFrQztFQUNqQyxJQUFJMUQsZUFBSixFQUFxQjtJQUNwQixLQUFLLElBQUlzRCxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHdEQsZUFBZSxDQUFDcUQsTUFBcEMsRUFBNENDLENBQUMsRUFBN0MsRUFBaUQ7TUFDaER0RCxlQUFlLENBQUNzRCxDQUFELENBQWYsQ0FBbUJHLFlBQW5CLENBQWdDLFFBQWhDLEVBQTBDLFFBQTFDO0lBQ0E7RUFDRDtBQUNEOztBQUVELFNBQVNFLGtCQUFULEdBQThCO0VBQzVCLElBQUloRCxNQUFNLENBQUM0QyxVQUFQLElBQXFCaEQsa0JBQWtCLENBQUNMLFlBQVksQ0FBQ0UsZUFBZCxDQUEzQyxFQUEyRTtJQUMxRW9ELHVCQUF1QjtFQUN2QixDQUZELE1BRU87SUFDTkUsc0JBQXNCO0VBQ3RCO0FBQ0Y7O0FBRUQsU0FBU0UsMEJBQVQsR0FBc0M7RUFDckNqRCxNQUFNLENBQUNMLGdCQUFQLENBQXdCLFFBQXhCLEVBQWtDLFVBQVN3QixDQUFULEVBQVk7SUFDN0M2QixrQkFBa0I7RUFDbEIsQ0FGRDtBQUdBLEVBRUQ7QUFDQTtBQUNBO0FBRUE7OztBQUVBdEQsdUJBQXVCLElBRXZCOztBQUVBUyxXQUFXO0FBQ1gwQiw0QkFBNEI7QUFDNUJkLFdBQVc7QUFDWEUsb0JBQW9CO0FBQ3BCYSwwQkFBMEI7QUFDMUJHLHNCQUFzQixJQUV0Qjs7QUFFQVEsb0JBQW9CLElBRXBCOztBQUVBTyxrQkFBa0I7QUFDbEJDLDBCQUEwQixHIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzcGxpZGVqcy9zcGxpZGUvZGlzdC9qcy9zcGxpZGUuZXNtLmpzIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovLy93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovLy93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovLy8uL3B1YmxpYy9hc3NldHMvanMvYXBwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuLyohXG4gKiBTcGxpZGUuanNcbiAqIFZlcnNpb24gIDogNC4wLjdcbiAqIExpY2Vuc2UgIDogTUlUXG4gKiBDb3B5cmlnaHQ6IDIwMjIgTmFvdG9zaGkgRnVqaXRhXG4gKi9cbnZhciBNRURJQV9QUkVGRVJTX1JFRFVDRURfTU9USU9OID0gXCIocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKVwiO1xudmFyIENSRUFURUQgPSAxO1xudmFyIE1PVU5URUQgPSAyO1xudmFyIElETEUgPSAzO1xudmFyIE1PVklORyA9IDQ7XG52YXIgU0NST0xMSU5HID0gNTtcbnZhciBEUkFHR0lORyA9IDY7XG52YXIgREVTVFJPWUVEID0gNztcbnZhciBTVEFURVMgPSB7XG4gIENSRUFURUQ6IENSRUFURUQsXG4gIE1PVU5URUQ6IE1PVU5URUQsXG4gIElETEU6IElETEUsXG4gIE1PVklORzogTU9WSU5HLFxuICBTQ1JPTExJTkc6IFNDUk9MTElORyxcbiAgRFJBR0dJTkc6IERSQUdHSU5HLFxuICBERVNUUk9ZRUQ6IERFU1RST1lFRFxufTtcblxuZnVuY3Rpb24gZW1wdHkoYXJyYXkpIHtcbiAgYXJyYXkubGVuZ3RoID0gMDtcbn1cblxuZnVuY3Rpb24gc2xpY2UoYXJyYXlMaWtlLCBzdGFydCwgZW5kKSB7XG4gIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcnJheUxpa2UsIHN0YXJ0LCBlbmQpO1xufVxuXG5mdW5jdGlvbiBhcHBseShmdW5jKSB7XG4gIHJldHVybiBmdW5jLmJpbmQuYXBwbHkoZnVuYywgW251bGxdLmNvbmNhdChzbGljZShhcmd1bWVudHMsIDEpKSk7XG59XG5cbnZhciBuZXh0VGljayA9IHNldFRpbWVvdXQ7XG5cbnZhciBub29wID0gZnVuY3Rpb24gbm9vcCgpIHt9O1xuXG5mdW5jdGlvbiByYWYoZnVuYykge1xuICByZXR1cm4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmMpO1xufVxuXG5mdW5jdGlvbiB0eXBlT2YodHlwZSwgc3ViamVjdCkge1xuICByZXR1cm4gdHlwZW9mIHN1YmplY3QgPT09IHR5cGU7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHN1YmplY3QpIHtcbiAgcmV0dXJuICFpc051bGwoc3ViamVjdCkgJiYgdHlwZU9mKFwib2JqZWN0XCIsIHN1YmplY3QpO1xufVxuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG52YXIgaXNGdW5jdGlvbiA9IGFwcGx5KHR5cGVPZiwgXCJmdW5jdGlvblwiKTtcbnZhciBpc1N0cmluZyA9IGFwcGx5KHR5cGVPZiwgXCJzdHJpbmdcIik7XG52YXIgaXNVbmRlZmluZWQgPSBhcHBseSh0eXBlT2YsIFwidW5kZWZpbmVkXCIpO1xuXG5mdW5jdGlvbiBpc051bGwoc3ViamVjdCkge1xuICByZXR1cm4gc3ViamVjdCA9PT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNIVE1MRWxlbWVudChzdWJqZWN0KSB7XG4gIHJldHVybiBzdWJqZWN0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIHRvQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuXG5mdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgaXRlcmF0ZWUpIHtcbiAgdG9BcnJheSh2YWx1ZXMpLmZvckVhY2goaXRlcmF0ZWUpO1xufVxuXG5mdW5jdGlvbiBpbmNsdWRlcyhhcnJheSwgdmFsdWUpIHtcbiAgcmV0dXJuIGFycmF5LmluZGV4T2YodmFsdWUpID4gLTE7XG59XG5cbmZ1bmN0aW9uIHB1c2goYXJyYXksIGl0ZW1zKSB7XG4gIGFycmF5LnB1c2guYXBwbHkoYXJyYXksIHRvQXJyYXkoaXRlbXMpKTtcbiAgcmV0dXJuIGFycmF5O1xufVxuXG5mdW5jdGlvbiB0b2dnbGVDbGFzcyhlbG0sIGNsYXNzZXMsIGFkZCkge1xuICBpZiAoZWxtKSB7XG4gICAgZm9yRWFjaChjbGFzc2VzLCBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgZWxtLmNsYXNzTGlzdFthZGQgPyBcImFkZFwiIDogXCJyZW1vdmVcIl0obmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkQ2xhc3MoZWxtLCBjbGFzc2VzKSB7XG4gIHRvZ2dsZUNsYXNzKGVsbSwgaXNTdHJpbmcoY2xhc3NlcykgPyBjbGFzc2VzLnNwbGl0KFwiIFwiKSA6IGNsYXNzZXMsIHRydWUpO1xufVxuXG5mdW5jdGlvbiBhcHBlbmQocGFyZW50LCBjaGlsZHJlbikge1xuICBmb3JFYWNoKGNoaWxkcmVuLCBwYXJlbnQuYXBwZW5kQ2hpbGQuYmluZChwYXJlbnQpKTtcbn1cblxuZnVuY3Rpb24gYmVmb3JlKG5vZGVzLCByZWYpIHtcbiAgZm9yRWFjaChub2RlcywgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB2YXIgcGFyZW50ID0gKHJlZiB8fCBub2RlKS5wYXJlbnROb2RlO1xuXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShub2RlLCByZWYpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXMoZWxtLCBzZWxlY3Rvcikge1xuICByZXR1cm4gaXNIVE1MRWxlbWVudChlbG0pICYmIChlbG1bXCJtc01hdGNoZXNTZWxlY3RvclwiXSB8fCBlbG0ubWF0Y2hlcykuY2FsbChlbG0sIHNlbGVjdG9yKTtcbn1cblxuZnVuY3Rpb24gY2hpbGRyZW4ocGFyZW50LCBzZWxlY3Rvcikge1xuICB2YXIgY2hpbGRyZW4yID0gcGFyZW50ID8gc2xpY2UocGFyZW50LmNoaWxkcmVuKSA6IFtdO1xuICByZXR1cm4gc2VsZWN0b3IgPyBjaGlsZHJlbjIuZmlsdGVyKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBtYXRjaGVzKGNoaWxkLCBzZWxlY3Rvcik7XG4gIH0pIDogY2hpbGRyZW4yO1xufVxuXG5mdW5jdGlvbiBjaGlsZChwYXJlbnQsIHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA/IGNoaWxkcmVuKHBhcmVudCwgc2VsZWN0b3IpWzBdIDogcGFyZW50LmZpcnN0RWxlbWVudENoaWxkO1xufVxuXG52YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzO1xuXG5mdW5jdGlvbiBmb3JPd24ob2JqZWN0LCBpdGVyYXRlZSwgcmlnaHQpIHtcbiAgaWYgKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gb3duS2V5cyhvYmplY3QpO1xuICAgIGtleXMgPSByaWdodCA/IGtleXMucmV2ZXJzZSgpIDoga2V5cztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmIChrZXkgIT09IFwiX19wcm90b19fXCIpIHtcbiAgICAgICAgaWYgKGl0ZXJhdGVlKG9iamVjdFtrZXldLCBrZXkpID09PSBmYWxzZSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iamVjdDtcbn1cblxuZnVuY3Rpb24gYXNzaWduKG9iamVjdCkge1xuICBzbGljZShhcmd1bWVudHMsIDEpLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgIGZvck93bihzb3VyY2UsIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICBvYmplY3Rba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIG9iamVjdDtcbn1cblxuZnVuY3Rpb24gbWVyZ2Uob2JqZWN0KSB7XG4gIHNsaWNlKGFyZ3VtZW50cywgMSkuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgZm9yT3duKHNvdXJjZSwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBvYmplY3Rba2V5XSA9IHZhbHVlLnNsaWNlKCk7XG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICBvYmplY3Rba2V5XSA9IG1lcmdlKHt9LCBpc09iamVjdChvYmplY3Rba2V5XSkgPyBvYmplY3Rba2V5XSA6IHt9LCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIG9iamVjdDtcbn1cblxuZnVuY3Rpb24gb21pdChvYmplY3QsIGtleXMpIHtcbiAgdG9BcnJheShrZXlzIHx8IG93bktleXMob2JqZWN0KSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgZGVsZXRlIG9iamVjdFtrZXldO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQXR0cmlidXRlKGVsbXMsIGF0dHJzKSB7XG4gIGZvckVhY2goZWxtcywgZnVuY3Rpb24gKGVsbSkge1xuICAgIGZvckVhY2goYXR0cnMsIGZ1bmN0aW9uIChhdHRyKSB7XG4gICAgICBlbG0gJiYgZWxtLnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZShlbG1zLCBhdHRycywgdmFsdWUpIHtcbiAgaWYgKGlzT2JqZWN0KGF0dHJzKSkge1xuICAgIGZvck93bihhdHRycywgZnVuY3Rpb24gKHZhbHVlMiwgbmFtZSkge1xuICAgICAgc2V0QXR0cmlidXRlKGVsbXMsIG5hbWUsIHZhbHVlMik7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgZm9yRWFjaChlbG1zLCBmdW5jdGlvbiAoZWxtKSB7XG4gICAgICBpc051bGwodmFsdWUpIHx8IHZhbHVlID09PSBcIlwiID8gcmVtb3ZlQXR0cmlidXRlKGVsbSwgYXR0cnMpIDogZWxtLnNldEF0dHJpYnV0ZShhdHRycywgU3RyaW5nKHZhbHVlKSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlKHRhZywgYXR0cnMsIHBhcmVudCkge1xuICB2YXIgZWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xuXG4gIGlmIChhdHRycykge1xuICAgIGlzU3RyaW5nKGF0dHJzKSA/IGFkZENsYXNzKGVsbSwgYXR0cnMpIDogc2V0QXR0cmlidXRlKGVsbSwgYXR0cnMpO1xuICB9XG5cbiAgcGFyZW50ICYmIGFwcGVuZChwYXJlbnQsIGVsbSk7XG4gIHJldHVybiBlbG07XG59XG5cbmZ1bmN0aW9uIHN0eWxlKGVsbSwgcHJvcCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKGVsbSlbcHJvcF07XG4gIH1cblxuICBpZiAoIWlzTnVsbCh2YWx1ZSkpIHtcbiAgICBlbG0uc3R5bGVbcHJvcF0gPSBcIlwiICsgdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzcGxheShlbG0sIGRpc3BsYXkyKSB7XG4gIHN0eWxlKGVsbSwgXCJkaXNwbGF5XCIsIGRpc3BsYXkyKTtcbn1cblxuZnVuY3Rpb24gZm9jdXMoZWxtKSB7XG4gIGVsbVtcInNldEFjdGl2ZVwiXSAmJiBlbG1bXCJzZXRBY3RpdmVcIl0oKSB8fCBlbG0uZm9jdXMoe1xuICAgIHByZXZlbnRTY3JvbGw6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEF0dHJpYnV0ZShlbG0sIGF0dHIpIHtcbiAgcmV0dXJuIGVsbS5nZXRBdHRyaWJ1dGUoYXR0cik7XG59XG5cbmZ1bmN0aW9uIGhhc0NsYXNzKGVsbSwgY2xhc3NOYW1lKSB7XG4gIHJldHVybiBlbG0gJiYgZWxtLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpO1xufVxuXG5mdW5jdGlvbiByZWN0KHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xufVxuXG5mdW5jdGlvbiByZW1vdmUobm9kZXMpIHtcbiAgZm9yRWFjaChub2RlcywgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAobm9kZSAmJiBub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZUh0bWwoaHRtbCkge1xuICByZXR1cm4gY2hpbGQobmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhodG1sLCBcInRleHQvaHRtbFwiKS5ib2R5KTtcbn1cblxuZnVuY3Rpb24gcHJldmVudChlLCBzdG9wUHJvcGFnYXRpb24pIHtcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gIGlmIChzdG9wUHJvcGFnYXRpb24pIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcXVlcnkocGFyZW50LCBzZWxlY3Rvcikge1xuICByZXR1cm4gcGFyZW50ICYmIHBhcmVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbn1cblxuZnVuY3Rpb24gcXVlcnlBbGwocGFyZW50LCBzZWxlY3Rvcikge1xuICByZXR1cm4gc2VsZWN0b3IgPyBzbGljZShwYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpIDogW107XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUNsYXNzKGVsbSwgY2xhc3Nlcykge1xuICB0b2dnbGVDbGFzcyhlbG0sIGNsYXNzZXMsIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gdGltZU9mKGUpIHtcbiAgcmV0dXJuIGUudGltZVN0YW1wO1xufVxuXG5mdW5jdGlvbiB1bml0KHZhbHVlKSB7XG4gIHJldHVybiBpc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZSA6IHZhbHVlID8gdmFsdWUgKyBcInB4XCIgOiBcIlwiO1xufVxuXG52YXIgUFJPSkVDVF9DT0RFID0gXCJzcGxpZGVcIjtcbnZhciBEQVRBX0FUVFJJQlVURSA9IFwiZGF0YS1cIiArIFBST0pFQ1RfQ09ERTtcblxuZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbiwgbWVzc2FnZSkge1xuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIltcIiArIFBST0pFQ1RfQ09ERSArIFwiXSBcIiArIChtZXNzYWdlIHx8IFwiXCIpKTtcbiAgfVxufVxuXG52YXIgbWluID0gTWF0aC5taW4sXG4gICAgbWF4ID0gTWF0aC5tYXgsXG4gICAgZmxvb3IgPSBNYXRoLmZsb29yLFxuICAgIGNlaWwgPSBNYXRoLmNlaWwsXG4gICAgYWJzID0gTWF0aC5hYnM7XG5cbmZ1bmN0aW9uIGFwcHJveGltYXRlbHlFcXVhbCh4LCB5LCBlcHNpbG9uKSB7XG4gIHJldHVybiBhYnMoeCAtIHkpIDwgZXBzaWxvbjtcbn1cblxuZnVuY3Rpb24gYmV0d2VlbihudW1iZXIsIG1pbk9yTWF4LCBtYXhPck1pbiwgZXhjbHVzaXZlKSB7XG4gIHZhciBtaW5pbXVtID0gbWluKG1pbk9yTWF4LCBtYXhPck1pbik7XG4gIHZhciBtYXhpbXVtID0gbWF4KG1pbk9yTWF4LCBtYXhPck1pbik7XG4gIHJldHVybiBleGNsdXNpdmUgPyBtaW5pbXVtIDwgbnVtYmVyICYmIG51bWJlciA8IG1heGltdW0gOiBtaW5pbXVtIDw9IG51bWJlciAmJiBudW1iZXIgPD0gbWF4aW11bTtcbn1cblxuZnVuY3Rpb24gY2xhbXAobnVtYmVyLCB4LCB5KSB7XG4gIHZhciBtaW5pbXVtID0gbWluKHgsIHkpO1xuICB2YXIgbWF4aW11bSA9IG1heCh4LCB5KTtcbiAgcmV0dXJuIG1pbihtYXgobWluaW11bSwgbnVtYmVyKSwgbWF4aW11bSk7XG59XG5cbmZ1bmN0aW9uIHNpZ24oeCkge1xuICByZXR1cm4gKyh4ID4gMCkgLSArKHggPCAwKTtcbn1cblxuZnVuY3Rpb24gY2FtZWxUb0tlYmFiKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csIFwiJDEtJDJcIikudG9Mb3dlckNhc2UoKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0KHN0cmluZywgcmVwbGFjZW1lbnRzKSB7XG4gIGZvckVhY2gocmVwbGFjZW1lbnRzLCBmdW5jdGlvbiAocmVwbGFjZW1lbnQpIHtcbiAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShcIiVzXCIsIFwiXCIgKyByZXBsYWNlbWVudCk7XG4gIH0pO1xuICByZXR1cm4gc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBwYWQobnVtYmVyKSB7XG4gIHJldHVybiBudW1iZXIgPCAxMCA/IFwiMFwiICsgbnVtYmVyIDogXCJcIiArIG51bWJlcjtcbn1cblxudmFyIGlkcyA9IHt9O1xuXG5mdW5jdGlvbiB1bmlxdWVJZChwcmVmaXgpIHtcbiAgcmV0dXJuIFwiXCIgKyBwcmVmaXggKyBwYWQoaWRzW3ByZWZpeF0gPSAoaWRzW3ByZWZpeF0gfHwgMCkgKyAxKTtcbn1cblxuZnVuY3Rpb24gRXZlbnRCaW5kZXIoKSB7XG4gIHZhciBsaXN0ZW5lcnMgPSBbXTtcblxuICBmdW5jdGlvbiBiaW5kKHRhcmdldHMsIGV2ZW50cywgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgICBmb3JFYWNoRXZlbnQodGFyZ2V0cywgZXZlbnRzLCBmdW5jdGlvbiAodGFyZ2V0LCBldmVudCwgbmFtZXNwYWNlKSB7XG4gICAgICB2YXIgaXNFdmVudFRhcmdldCA9IChcImFkZEV2ZW50TGlzdGVuZXJcIiBpbiB0YXJnZXQpO1xuICAgICAgdmFyIHJlbW92ZXIgPSBpc0V2ZW50VGFyZ2V0ID8gdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIuYmluZCh0YXJnZXQsIGV2ZW50LCBjYWxsYmFjaywgb3B0aW9ucykgOiB0YXJnZXRbXCJyZW1vdmVMaXN0ZW5lclwiXS5iaW5kKHRhcmdldCwgY2FsbGJhY2spO1xuICAgICAgaXNFdmVudFRhcmdldCA/IHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBjYWxsYmFjaywgb3B0aW9ucykgOiB0YXJnZXRbXCJhZGRMaXN0ZW5lclwiXShjYWxsYmFjayk7XG4gICAgICBsaXN0ZW5lcnMucHVzaChbdGFyZ2V0LCBldmVudCwgbmFtZXNwYWNlLCBjYWxsYmFjaywgcmVtb3Zlcl0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdW5iaW5kKHRhcmdldHMsIGV2ZW50cywgY2FsbGJhY2spIHtcbiAgICBmb3JFYWNoRXZlbnQodGFyZ2V0cywgZXZlbnRzLCBmdW5jdGlvbiAodGFyZ2V0LCBldmVudCwgbmFtZXNwYWNlKSB7XG4gICAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZmlsdGVyKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICBpZiAobGlzdGVuZXJbMF0gPT09IHRhcmdldCAmJiBsaXN0ZW5lclsxXSA9PT0gZXZlbnQgJiYgbGlzdGVuZXJbMl0gPT09IG5hbWVzcGFjZSAmJiAoIWNhbGxiYWNrIHx8IGxpc3RlbmVyWzNdID09PSBjYWxsYmFjaykpIHtcbiAgICAgICAgICBsaXN0ZW5lcls0XSgpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBkaXNwYXRjaCh0YXJnZXQsIHR5cGUsIGRldGFpbCkge1xuICAgIHZhciBlO1xuICAgIHZhciBidWJibGVzID0gdHJ1ZTtcblxuICAgIGlmICh0eXBlb2YgQ3VzdG9tRXZlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgZSA9IG5ldyBDdXN0b21FdmVudCh0eXBlLCB7XG4gICAgICAgIGJ1YmJsZXM6IGJ1YmJsZXMsXG4gICAgICAgIGRldGFpbDogZGV0YWlsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiQ3VzdG9tRXZlbnRcIik7XG4gICAgICBlLmluaXRDdXN0b21FdmVudCh0eXBlLCBidWJibGVzLCBmYWxzZSwgZGV0YWlsKTtcbiAgICB9XG5cbiAgICB0YXJnZXQuZGlzcGF0Y2hFdmVudChlKTtcbiAgICByZXR1cm4gZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvckVhY2hFdmVudCh0YXJnZXRzLCBldmVudHMsIGl0ZXJhdGVlKSB7XG4gICAgZm9yRWFjaCh0YXJnZXRzLCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICB0YXJnZXQgJiYgZm9yRWFjaChldmVudHMsIGZ1bmN0aW9uIChldmVudHMyKSB7XG4gICAgICAgIGV2ZW50czIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TlMpIHtcbiAgICAgICAgICB2YXIgZnJhZ21lbnQgPSBldmVudE5TLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgICBpdGVyYXRlZSh0YXJnZXQsIGZyYWdtZW50WzBdLCBmcmFnbWVudFsxXSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIGxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBkYXRhWzRdKCk7XG4gICAgfSk7XG4gICAgZW1wdHkobGlzdGVuZXJzKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmluZDogYmluZCxcbiAgICB1bmJpbmQ6IHVuYmluZCxcbiAgICBkaXNwYXRjaDogZGlzcGF0Y2gsXG4gICAgZGVzdHJveTogZGVzdHJveVxuICB9O1xufVxuXG52YXIgRVZFTlRfTU9VTlRFRCA9IFwibW91bnRlZFwiO1xudmFyIEVWRU5UX1JFQURZID0gXCJyZWFkeVwiO1xudmFyIEVWRU5UX01PVkUgPSBcIm1vdmVcIjtcbnZhciBFVkVOVF9NT1ZFRCA9IFwibW92ZWRcIjtcbnZhciBFVkVOVF9TSElGVEVEID0gXCJzaGlmdGVkXCI7XG52YXIgRVZFTlRfQ0xJQ0sgPSBcImNsaWNrXCI7XG52YXIgRVZFTlRfQUNUSVZFID0gXCJhY3RpdmVcIjtcbnZhciBFVkVOVF9JTkFDVElWRSA9IFwiaW5hY3RpdmVcIjtcbnZhciBFVkVOVF9WSVNJQkxFID0gXCJ2aXNpYmxlXCI7XG52YXIgRVZFTlRfSElEREVOID0gXCJoaWRkZW5cIjtcbnZhciBFVkVOVF9TTElERV9LRVlET1dOID0gXCJzbGlkZTprZXlkb3duXCI7XG52YXIgRVZFTlRfUkVGUkVTSCA9IFwicmVmcmVzaFwiO1xudmFyIEVWRU5UX1VQREFURUQgPSBcInVwZGF0ZWRcIjtcbnZhciBFVkVOVF9SRVNJWkUgPSBcInJlc2l6ZVwiO1xudmFyIEVWRU5UX1JFU0laRUQgPSBcInJlc2l6ZWRcIjtcbnZhciBFVkVOVF9EUkFHID0gXCJkcmFnXCI7XG52YXIgRVZFTlRfRFJBR0dJTkcgPSBcImRyYWdnaW5nXCI7XG52YXIgRVZFTlRfRFJBR0dFRCA9IFwiZHJhZ2dlZFwiO1xudmFyIEVWRU5UX1NDUk9MTCA9IFwic2Nyb2xsXCI7XG52YXIgRVZFTlRfU0NST0xMRUQgPSBcInNjcm9sbGVkXCI7XG52YXIgRVZFTlRfREVTVFJPWSA9IFwiZGVzdHJveVwiO1xudmFyIEVWRU5UX0FSUk9XU19NT1VOVEVEID0gXCJhcnJvd3M6bW91bnRlZFwiO1xudmFyIEVWRU5UX0FSUk9XU19VUERBVEVEID0gXCJhcnJvd3M6dXBkYXRlZFwiO1xudmFyIEVWRU5UX1BBR0lOQVRJT05fTU9VTlRFRCA9IFwicGFnaW5hdGlvbjptb3VudGVkXCI7XG52YXIgRVZFTlRfUEFHSU5BVElPTl9VUERBVEVEID0gXCJwYWdpbmF0aW9uOnVwZGF0ZWRcIjtcbnZhciBFVkVOVF9OQVZJR0FUSU9OX01PVU5URUQgPSBcIm5hdmlnYXRpb246bW91bnRlZFwiO1xudmFyIEVWRU5UX0FVVE9QTEFZX1BMQVkgPSBcImF1dG9wbGF5OnBsYXlcIjtcbnZhciBFVkVOVF9BVVRPUExBWV9QTEFZSU5HID0gXCJhdXRvcGxheTpwbGF5aW5nXCI7XG52YXIgRVZFTlRfQVVUT1BMQVlfUEFVU0UgPSBcImF1dG9wbGF5OnBhdXNlXCI7XG52YXIgRVZFTlRfTEFaWUxPQURfTE9BREVEID0gXCJsYXp5bG9hZDpsb2FkZWRcIjtcblxuZnVuY3Rpb24gRXZlbnRJbnRlcmZhY2UoU3BsaWRlMikge1xuICB2YXIgYnVzID0gU3BsaWRlMiA/IFNwbGlkZTIuZXZlbnQuYnVzIDogZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICB2YXIgYmluZGVyID0gRXZlbnRCaW5kZXIoKTtcblxuICBmdW5jdGlvbiBvbihldmVudHMsIGNhbGxiYWNrKSB7XG4gICAgYmluZGVyLmJpbmQoYnVzLCB0b0FycmF5KGV2ZW50cykuam9pbihcIiBcIiksIGZ1bmN0aW9uIChlKSB7XG4gICAgICBjYWxsYmFjay5hcHBseShjYWxsYmFjaywgaXNBcnJheShlLmRldGFpbCkgPyBlLmRldGFpbCA6IFtdKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVtaXQoZXZlbnQpIHtcbiAgICBiaW5kZXIuZGlzcGF0Y2goYnVzLCBldmVudCwgc2xpY2UoYXJndW1lbnRzLCAxKSk7XG4gIH1cblxuICBpZiAoU3BsaWRlMikge1xuICAgIFNwbGlkZTIuZXZlbnQub24oRVZFTlRfREVTVFJPWSwgYmluZGVyLmRlc3Ryb3kpO1xuICB9XG5cbiAgcmV0dXJuIGFzc2lnbihiaW5kZXIsIHtcbiAgICBidXM6IGJ1cyxcbiAgICBvbjogb24sXG4gICAgb2ZmOiBhcHBseShiaW5kZXIudW5iaW5kLCBidXMpLFxuICAgIGVtaXQ6IGVtaXRcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIFJlcXVlc3RJbnRlcnZhbChpbnRlcnZhbCwgb25JbnRlcnZhbCwgb25VcGRhdGUsIGxpbWl0KSB7XG4gIHZhciBub3cgPSBEYXRlLm5vdztcbiAgdmFyIHN0YXJ0VGltZTtcbiAgdmFyIHJhdGUgPSAwO1xuICB2YXIgaWQ7XG4gIHZhciBwYXVzZWQgPSB0cnVlO1xuICB2YXIgY291bnQgPSAwO1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICBpZiAoIXBhdXNlZCkge1xuICAgICAgcmF0ZSA9IGludGVydmFsID8gbWluKChub3coKSAtIHN0YXJ0VGltZSkgLyBpbnRlcnZhbCwgMSkgOiAxO1xuICAgICAgb25VcGRhdGUgJiYgb25VcGRhdGUocmF0ZSk7XG5cbiAgICAgIGlmIChyYXRlID49IDEpIHtcbiAgICAgICAgb25JbnRlcnZhbCgpO1xuICAgICAgICBzdGFydFRpbWUgPSBub3coKTtcblxuICAgICAgICBpZiAobGltaXQgJiYgKytjb3VudCA+PSBsaW1pdCkge1xuICAgICAgICAgIHJldHVybiBwYXVzZSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJhZih1cGRhdGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0KHJlc3VtZSkge1xuICAgICFyZXN1bWUgJiYgY2FuY2VsKCk7XG4gICAgc3RhcnRUaW1lID0gbm93KCkgLSAocmVzdW1lID8gcmF0ZSAqIGludGVydmFsIDogMCk7XG4gICAgcGF1c2VkID0gZmFsc2U7XG4gICAgcmFmKHVwZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBwYXVzZSgpIHtcbiAgICBwYXVzZWQgPSB0cnVlO1xuICB9XG5cbiAgZnVuY3Rpb24gcmV3aW5kKCkge1xuICAgIHN0YXJ0VGltZSA9IG5vdygpO1xuICAgIHJhdGUgPSAwO1xuXG4gICAgaWYgKG9uVXBkYXRlKSB7XG4gICAgICBvblVwZGF0ZShyYXRlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgaWQgJiYgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpO1xuICAgIHJhdGUgPSAwO1xuICAgIGlkID0gMDtcbiAgICBwYXVzZWQgPSB0cnVlO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0KHRpbWUpIHtcbiAgICBpbnRlcnZhbCA9IHRpbWU7XG4gIH1cblxuICBmdW5jdGlvbiBpc1BhdXNlZCgpIHtcbiAgICByZXR1cm4gcGF1c2VkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydDogc3RhcnQsXG4gICAgcmV3aW5kOiByZXdpbmQsXG4gICAgcGF1c2U6IHBhdXNlLFxuICAgIGNhbmNlbDogY2FuY2VsLFxuICAgIHNldDogc2V0LFxuICAgIGlzUGF1c2VkOiBpc1BhdXNlZFxuICB9O1xufVxuXG5mdW5jdGlvbiBTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgdmFyIHN0YXRlID0gaW5pdGlhbFN0YXRlO1xuXG4gIGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgIHN0YXRlID0gdmFsdWU7XG4gIH1cblxuICBmdW5jdGlvbiBpcyhzdGF0ZXMpIHtcbiAgICByZXR1cm4gaW5jbHVkZXModG9BcnJheShzdGF0ZXMpLCBzdGF0ZSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNldDogc2V0LFxuICAgIGlzOiBpc1xuICB9O1xufVxuXG5mdW5jdGlvbiBUaHJvdHRsZShmdW5jLCBkdXJhdGlvbikge1xuICB2YXIgaW50ZXJ2YWw7XG5cbiAgZnVuY3Rpb24gdGhyb3R0bGVkKCkge1xuICAgIGlmICghaW50ZXJ2YWwpIHtcbiAgICAgIGludGVydmFsID0gUmVxdWVzdEludGVydmFsKGR1cmF0aW9uIHx8IDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuYygpO1xuICAgICAgICBpbnRlcnZhbCA9IG51bGw7XG4gICAgICB9LCBudWxsLCAxKTtcbiAgICAgIGludGVydmFsLnN0YXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRocm90dGxlZDtcbn1cblxuZnVuY3Rpb24gTWVkaWEoU3BsaWRlMiwgQ29tcG9uZW50czIsIG9wdGlvbnMpIHtcbiAgdmFyIHN0YXRlID0gU3BsaWRlMi5zdGF0ZTtcbiAgdmFyIGJyZWFrcG9pbnRzID0gb3B0aW9ucy5icmVha3BvaW50cyB8fCB7fTtcbiAgdmFyIHJlZHVjZWRNb3Rpb24gPSBvcHRpb25zLnJlZHVjZWRNb3Rpb24gfHwge307XG4gIHZhciBiaW5kZXIgPSBFdmVudEJpbmRlcigpO1xuICB2YXIgcXVlcmllcyA9IFtdO1xuXG4gIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgIHZhciBpc01pbiA9IG9wdGlvbnMubWVkaWFRdWVyeSA9PT0gXCJtaW5cIjtcbiAgICBvd25LZXlzKGJyZWFrcG9pbnRzKS5zb3J0KGZ1bmN0aW9uIChuLCBtKSB7XG4gICAgICByZXR1cm4gaXNNaW4gPyArbiAtICttIDogK20gLSArbjtcbiAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHJlZ2lzdGVyKGJyZWFrcG9pbnRzW2tleV0sIFwiKFwiICsgKGlzTWluID8gXCJtaW5cIiA6IFwibWF4XCIpICsgXCItd2lkdGg6XCIgKyBrZXkgKyBcInB4KVwiKTtcbiAgICB9KTtcbiAgICByZWdpc3RlcihyZWR1Y2VkTW90aW9uLCBNRURJQV9QUkVGRVJTX1JFRFVDRURfTU9USU9OKTtcbiAgICB1cGRhdGUoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3Ryb3koY29tcGxldGVseSkge1xuICAgIGlmIChjb21wbGV0ZWx5KSB7XG4gICAgICBiaW5kZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlZ2lzdGVyKG9wdGlvbnMyLCBxdWVyeSkge1xuICAgIHZhciBxdWVyeUxpc3QgPSBtYXRjaE1lZGlhKHF1ZXJ5KTtcbiAgICBiaW5kZXIuYmluZChxdWVyeUxpc3QsIFwiY2hhbmdlXCIsIHVwZGF0ZSk7XG4gICAgcXVlcmllcy5wdXNoKFtvcHRpb25zMiwgcXVlcnlMaXN0XSk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgdmFyIGRlc3Ryb3llZCA9IHN0YXRlLmlzKERFU1RST1lFRCk7XG4gICAgdmFyIGRpcmVjdGlvbiA9IG9wdGlvbnMuZGlyZWN0aW9uO1xuICAgIHZhciBtZXJnZWQgPSBxdWVyaWVzLnJlZHVjZShmdW5jdGlvbiAobWVyZ2VkMiwgZW50cnkpIHtcbiAgICAgIHJldHVybiBtZXJnZShtZXJnZWQyLCBlbnRyeVsxXS5tYXRjaGVzID8gZW50cnlbMF0gOiB7fSk7XG4gICAgfSwge30pO1xuICAgIG9taXQob3B0aW9ucyk7XG4gICAgc2V0KG1lcmdlZCk7XG5cbiAgICBpZiAob3B0aW9ucy5kZXN0cm95KSB7XG4gICAgICBTcGxpZGUyLmRlc3Ryb3kob3B0aW9ucy5kZXN0cm95ID09PSBcImNvbXBsZXRlbHlcIik7XG4gICAgfSBlbHNlIGlmIChkZXN0cm95ZWQpIHtcbiAgICAgIGRlc3Ryb3kodHJ1ZSk7XG4gICAgICBTcGxpZGUyLm1vdW50KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpcmVjdGlvbiAhPT0gb3B0aW9ucy5kaXJlY3Rpb24gJiYgU3BsaWRlMi5yZWZyZXNoKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVkdWNlKGVuYWJsZSkge1xuICAgIGlmIChtYXRjaE1lZGlhKE1FRElBX1BSRUZFUlNfUkVEVUNFRF9NT1RJT04pLm1hdGNoZXMpIHtcbiAgICAgIGVuYWJsZSA/IG1lcmdlKG9wdGlvbnMsIHJlZHVjZWRNb3Rpb24pIDogb21pdChvcHRpb25zLCBvd25LZXlzKHJlZHVjZWRNb3Rpb24pKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZXQob3B0cywgdXNlcikge1xuICAgIG1lcmdlKG9wdGlvbnMsIG9wdHMpO1xuICAgIHVzZXIgJiYgbWVyZ2UoT2JqZWN0LmdldFByb3RvdHlwZU9mKG9wdGlvbnMpLCBvcHRzKTtcblxuICAgIGlmICghc3RhdGUuaXMoQ1JFQVRFRCkpIHtcbiAgICAgIFNwbGlkZTIuZW1pdChFVkVOVF9VUERBVEVELCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNldHVwOiBzZXR1cCxcbiAgICBkZXN0cm95OiBkZXN0cm95LFxuICAgIHJlZHVjZTogcmVkdWNlLFxuICAgIHNldDogc2V0XG4gIH07XG59XG5cbnZhciBBUlJPVyA9IFwiQXJyb3dcIjtcbnZhciBBUlJPV19MRUZUID0gQVJST1cgKyBcIkxlZnRcIjtcbnZhciBBUlJPV19SSUdIVCA9IEFSUk9XICsgXCJSaWdodFwiO1xudmFyIEFSUk9XX1VQID0gQVJST1cgKyBcIlVwXCI7XG52YXIgQVJST1dfRE9XTiA9IEFSUk9XICsgXCJEb3duXCI7XG52YXIgTFRSID0gXCJsdHJcIjtcbnZhciBSVEwgPSBcInJ0bFwiO1xudmFyIFRUQiA9IFwidHRiXCI7XG52YXIgT1JJRU5UQVRJT05fTUFQID0ge1xuICB3aWR0aDogW1wiaGVpZ2h0XCJdLFxuICBsZWZ0OiBbXCJ0b3BcIiwgXCJyaWdodFwiXSxcbiAgcmlnaHQ6IFtcImJvdHRvbVwiLCBcImxlZnRcIl0sXG4gIHg6IFtcInlcIl0sXG4gIFg6IFtcIllcIl0sXG4gIFk6IFtcIlhcIl0sXG4gIEFycm93TGVmdDogW0FSUk9XX1VQLCBBUlJPV19SSUdIVF0sXG4gIEFycm93UmlnaHQ6IFtBUlJPV19ET1dOLCBBUlJPV19MRUZUXVxufTtcblxuZnVuY3Rpb24gRGlyZWN0aW9uKFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIGZ1bmN0aW9uIHJlc29sdmUocHJvcCwgYXhpc09ubHksIGRpcmVjdGlvbikge1xuICAgIGRpcmVjdGlvbiA9IGRpcmVjdGlvbiB8fCBvcHRpb25zLmRpcmVjdGlvbjtcbiAgICB2YXIgaW5kZXggPSBkaXJlY3Rpb24gPT09IFJUTCAmJiAhYXhpc09ubHkgPyAxIDogZGlyZWN0aW9uID09PSBUVEIgPyAwIDogLTE7XG4gICAgcmV0dXJuIE9SSUVOVEFUSU9OX01BUFtwcm9wXSAmJiBPUklFTlRBVElPTl9NQVBbcHJvcF1baW5kZXhdIHx8IHByb3AucmVwbGFjZSgvd2lkdGh8bGVmdHxyaWdodC9pLCBmdW5jdGlvbiAobWF0Y2gsIG9mZnNldCkge1xuICAgICAgdmFyIHJlcGxhY2VtZW50ID0gT1JJRU5UQVRJT05fTUFQW21hdGNoLnRvTG93ZXJDYXNlKCldW2luZGV4XSB8fCBtYXRjaDtcbiAgICAgIHJldHVybiBvZmZzZXQgPiAwID8gcmVwbGFjZW1lbnQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyByZXBsYWNlbWVudC5zbGljZSgxKSA6IHJlcGxhY2VtZW50O1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gb3JpZW50KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICogKG9wdGlvbnMuZGlyZWN0aW9uID09PSBSVEwgPyAxIDogLTEpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZXNvbHZlOiByZXNvbHZlLFxuICAgIG9yaWVudDogb3JpZW50XG4gIH07XG59XG5cbnZhciBST0xFID0gXCJyb2xlXCI7XG52YXIgVEFCX0lOREVYID0gXCJ0YWJpbmRleFwiO1xudmFyIERJU0FCTEVEID0gXCJkaXNhYmxlZFwiO1xudmFyIEFSSUFfUFJFRklYID0gXCJhcmlhLVwiO1xudmFyIEFSSUFfQ09OVFJPTFMgPSBBUklBX1BSRUZJWCArIFwiY29udHJvbHNcIjtcbnZhciBBUklBX0NVUlJFTlQgPSBBUklBX1BSRUZJWCArIFwiY3VycmVudFwiO1xudmFyIEFSSUFfU0VMRUNURUQgPSBBUklBX1BSRUZJWCArIFwic2VsZWN0ZWRcIjtcbnZhciBBUklBX0xBQkVMID0gQVJJQV9QUkVGSVggKyBcImxhYmVsXCI7XG52YXIgQVJJQV9MQUJFTExFREJZID0gQVJJQV9QUkVGSVggKyBcImxhYmVsbGVkYnlcIjtcbnZhciBBUklBX0hJRERFTiA9IEFSSUFfUFJFRklYICsgXCJoaWRkZW5cIjtcbnZhciBBUklBX09SSUVOVEFUSU9OID0gQVJJQV9QUkVGSVggKyBcIm9yaWVudGF0aW9uXCI7XG52YXIgQVJJQV9ST0xFREVTQ1JJUFRJT04gPSBBUklBX1BSRUZJWCArIFwicm9sZWRlc2NyaXB0aW9uXCI7XG52YXIgQVJJQV9MSVZFID0gQVJJQV9QUkVGSVggKyBcImxpdmVcIjtcbnZhciBBUklBX0JVU1kgPSBBUklBX1BSRUZJWCArIFwiYnVzeVwiO1xudmFyIEFSSUFfQVRPTUlDID0gQVJJQV9QUkVGSVggKyBcImF0b21pY1wiO1xudmFyIEFMTF9BVFRSSUJVVEVTID0gW1JPTEUsIFRBQl9JTkRFWCwgRElTQUJMRUQsIEFSSUFfQ09OVFJPTFMsIEFSSUFfQ1VSUkVOVCwgQVJJQV9MQUJFTCwgQVJJQV9MQUJFTExFREJZLCBBUklBX0hJRERFTiwgQVJJQV9PUklFTlRBVElPTiwgQVJJQV9ST0xFREVTQ1JJUFRJT05dO1xudmFyIENMQVNTX1JPT1QgPSBQUk9KRUNUX0NPREU7XG52YXIgQ0xBU1NfVFJBQ0sgPSBQUk9KRUNUX0NPREUgKyBcIl9fdHJhY2tcIjtcbnZhciBDTEFTU19MSVNUID0gUFJPSkVDVF9DT0RFICsgXCJfX2xpc3RcIjtcbnZhciBDTEFTU19TTElERSA9IFBST0pFQ1RfQ09ERSArIFwiX19zbGlkZVwiO1xudmFyIENMQVNTX0NMT05FID0gQ0xBU1NfU0xJREUgKyBcIi0tY2xvbmVcIjtcbnZhciBDTEFTU19DT05UQUlORVIgPSBDTEFTU19TTElERSArIFwiX19jb250YWluZXJcIjtcbnZhciBDTEFTU19BUlJPV1MgPSBQUk9KRUNUX0NPREUgKyBcIl9fYXJyb3dzXCI7XG52YXIgQ0xBU1NfQVJST1cgPSBQUk9KRUNUX0NPREUgKyBcIl9fYXJyb3dcIjtcbnZhciBDTEFTU19BUlJPV19QUkVWID0gQ0xBU1NfQVJST1cgKyBcIi0tcHJldlwiO1xudmFyIENMQVNTX0FSUk9XX05FWFQgPSBDTEFTU19BUlJPVyArIFwiLS1uZXh0XCI7XG52YXIgQ0xBU1NfUEFHSU5BVElPTiA9IFBST0pFQ1RfQ09ERSArIFwiX19wYWdpbmF0aW9uXCI7XG52YXIgQ0xBU1NfUEFHSU5BVElPTl9QQUdFID0gQ0xBU1NfUEFHSU5BVElPTiArIFwiX19wYWdlXCI7XG52YXIgQ0xBU1NfUFJPR1JFU1MgPSBQUk9KRUNUX0NPREUgKyBcIl9fcHJvZ3Jlc3NcIjtcbnZhciBDTEFTU19QUk9HUkVTU19CQVIgPSBDTEFTU19QUk9HUkVTUyArIFwiX19iYXJcIjtcbnZhciBDTEFTU19UT0dHTEUgPSBQUk9KRUNUX0NPREUgKyBcIl9fdG9nZ2xlXCI7XG52YXIgQ0xBU1NfVE9HR0xFX1BMQVkgPSBDTEFTU19UT0dHTEUgKyBcIl9fcGxheVwiO1xudmFyIENMQVNTX1RPR0dMRV9QQVVTRSA9IENMQVNTX1RPR0dMRSArIFwiX19wYXVzZVwiO1xudmFyIENMQVNTX1NQSU5ORVIgPSBQUk9KRUNUX0NPREUgKyBcIl9fc3Bpbm5lclwiO1xudmFyIENMQVNTX1NSID0gUFJPSkVDVF9DT0RFICsgXCJfX3NyXCI7XG52YXIgQ0xBU1NfSU5JVElBTElaRUQgPSBcImlzLWluaXRpYWxpemVkXCI7XG52YXIgQ0xBU1NfQUNUSVZFID0gXCJpcy1hY3RpdmVcIjtcbnZhciBDTEFTU19QUkVWID0gXCJpcy1wcmV2XCI7XG52YXIgQ0xBU1NfTkVYVCA9IFwiaXMtbmV4dFwiO1xudmFyIENMQVNTX1ZJU0lCTEUgPSBcImlzLXZpc2libGVcIjtcbnZhciBDTEFTU19MT0FESU5HID0gXCJpcy1sb2FkaW5nXCI7XG52YXIgQ0xBU1NfRk9DVVNfSU4gPSBcImlzLWZvY3VzLWluXCI7XG52YXIgU1RBVFVTX0NMQVNTRVMgPSBbQ0xBU1NfQUNUSVZFLCBDTEFTU19WSVNJQkxFLCBDTEFTU19QUkVWLCBDTEFTU19ORVhULCBDTEFTU19MT0FESU5HLCBDTEFTU19GT0NVU19JTl07XG52YXIgQ0xBU1NFUyA9IHtcbiAgc2xpZGU6IENMQVNTX1NMSURFLFxuICBjbG9uZTogQ0xBU1NfQ0xPTkUsXG4gIGFycm93czogQ0xBU1NfQVJST1dTLFxuICBhcnJvdzogQ0xBU1NfQVJST1csXG4gIHByZXY6IENMQVNTX0FSUk9XX1BSRVYsXG4gIG5leHQ6IENMQVNTX0FSUk9XX05FWFQsXG4gIHBhZ2luYXRpb246IENMQVNTX1BBR0lOQVRJT04sXG4gIHBhZ2U6IENMQVNTX1BBR0lOQVRJT05fUEFHRSxcbiAgc3Bpbm5lcjogQ0xBU1NfU1BJTk5FUlxufTtcblxuZnVuY3Rpb24gY2xvc2VzdChmcm9tLCBzZWxlY3Rvcikge1xuICBpZiAoaXNGdW5jdGlvbihmcm9tLmNsb3Nlc3QpKSB7XG4gICAgcmV0dXJuIGZyb20uY2xvc2VzdChzZWxlY3Rvcik7XG4gIH1cblxuICB2YXIgZWxtID0gZnJvbTtcblxuICB3aGlsZSAoZWxtICYmIGVsbS5ub2RlVHlwZSA9PT0gMSkge1xuICAgIGlmIChtYXRjaGVzKGVsbSwgc2VsZWN0b3IpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBlbG0gPSBlbG0ucGFyZW50RWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiBlbG07XG59XG5cbnZhciBGUklDVElPTiA9IDU7XG52YXIgTE9HX0lOVEVSVkFMID0gMjAwO1xudmFyIFBPSU5URVJfRE9XTl9FVkVOVFMgPSBcInRvdWNoc3RhcnQgbW91c2Vkb3duXCI7XG52YXIgUE9JTlRFUl9NT1ZFX0VWRU5UUyA9IFwidG91Y2htb3ZlIG1vdXNlbW92ZVwiO1xudmFyIFBPSU5URVJfVVBfRVZFTlRTID0gXCJ0b3VjaGVuZCB0b3VjaGNhbmNlbCBtb3VzZXVwIGNsaWNrXCI7XG5cbmZ1bmN0aW9uIEVsZW1lbnRzKFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIHZhciBfRXZlbnRJbnRlcmZhY2UgPSBFdmVudEludGVyZmFjZShTcGxpZGUyKSxcbiAgICAgIG9uID0gX0V2ZW50SW50ZXJmYWNlLm9uLFxuICAgICAgYmluZCA9IF9FdmVudEludGVyZmFjZS5iaW5kO1xuXG4gIHZhciByb290ID0gU3BsaWRlMi5yb290O1xuICB2YXIgaTE4biA9IG9wdGlvbnMuaTE4bjtcbiAgdmFyIGVsZW1lbnRzID0ge307XG4gIHZhciBzbGlkZXMgPSBbXTtcbiAgdmFyIHJvb3RDbGFzc2VzID0gW107XG4gIHZhciB0cmFja0NsYXNzZXMgPSBbXTtcbiAgdmFyIHRyYWNrO1xuICB2YXIgbGlzdDtcbiAgdmFyIGlzVXNpbmdLZXk7XG5cbiAgZnVuY3Rpb24gc2V0dXAoKSB7XG4gICAgY29sbGVjdCgpO1xuICAgIGluaXQoKTtcbiAgICB1cGRhdGUoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIG9uKEVWRU5UX1JFRlJFU0gsIGRlc3Ryb3kpO1xuICAgIG9uKEVWRU5UX1JFRlJFU0gsIHNldHVwKTtcbiAgICBvbihFVkVOVF9VUERBVEVELCB1cGRhdGUpO1xuICAgIGJpbmQoZG9jdW1lbnQsIFBPSU5URVJfRE9XTl9FVkVOVFMgKyBcIiBrZXlkb3duXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpc1VzaW5nS2V5ID0gZS50eXBlID09PSBcImtleWRvd25cIjtcbiAgICB9LCB7XG4gICAgICBjYXB0dXJlOiB0cnVlXG4gICAgfSk7XG4gICAgYmluZChyb290LCBcImZvY3VzaW5cIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdG9nZ2xlQ2xhc3Mocm9vdCwgQ0xBU1NfRk9DVVNfSU4sICEhaXNVc2luZ0tleSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZXN0cm95KGNvbXBsZXRlbHkpIHtcbiAgICB2YXIgYXR0cnMgPSBBTExfQVRUUklCVVRFUy5jb25jYXQoXCJzdHlsZVwiKTtcbiAgICBlbXB0eShzbGlkZXMpO1xuICAgIHJlbW92ZUNsYXNzKHJvb3QsIHJvb3RDbGFzc2VzKTtcbiAgICByZW1vdmVDbGFzcyh0cmFjaywgdHJhY2tDbGFzc2VzKTtcbiAgICByZW1vdmVBdHRyaWJ1dGUoW3RyYWNrLCBsaXN0XSwgYXR0cnMpO1xuICAgIHJlbW92ZUF0dHJpYnV0ZShyb290LCBjb21wbGV0ZWx5ID8gYXR0cnMgOiBbXCJzdHlsZVwiLCBBUklBX1JPTEVERVNDUklQVElPTl0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgIHJlbW92ZUNsYXNzKHJvb3QsIHJvb3RDbGFzc2VzKTtcbiAgICByZW1vdmVDbGFzcyh0cmFjaywgdHJhY2tDbGFzc2VzKTtcbiAgICByb290Q2xhc3NlcyA9IGdldENsYXNzZXMoQ0xBU1NfUk9PVCk7XG4gICAgdHJhY2tDbGFzc2VzID0gZ2V0Q2xhc3NlcyhDTEFTU19UUkFDSyk7XG4gICAgYWRkQ2xhc3Mocm9vdCwgcm9vdENsYXNzZXMpO1xuICAgIGFkZENsYXNzKHRyYWNrLCB0cmFja0NsYXNzZXMpO1xuICAgIHNldEF0dHJpYnV0ZShyb290LCBBUklBX0xBQkVMLCBvcHRpb25zLmxhYmVsKTtcbiAgICBzZXRBdHRyaWJ1dGUocm9vdCwgQVJJQV9MQUJFTExFREJZLCBvcHRpb25zLmxhYmVsbGVkYnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gY29sbGVjdCgpIHtcbiAgICB0cmFjayA9IGZpbmQoXCIuXCIgKyBDTEFTU19UUkFDSyk7XG4gICAgbGlzdCA9IGNoaWxkKHRyYWNrLCBcIi5cIiArIENMQVNTX0xJU1QpO1xuICAgIGFzc2VydCh0cmFjayAmJiBsaXN0LCBcIkEgdHJhY2svbGlzdCBlbGVtZW50IGlzIG1pc3NpbmcuXCIpO1xuICAgIHB1c2goc2xpZGVzLCBjaGlsZHJlbihsaXN0LCBcIi5cIiArIENMQVNTX1NMSURFICsgXCI6bm90KC5cIiArIENMQVNTX0NMT05FICsgXCIpXCIpKTtcbiAgICBmb3JPd24oe1xuICAgICAgYXJyb3dzOiBDTEFTU19BUlJPV1MsXG4gICAgICBwYWdpbmF0aW9uOiBDTEFTU19QQUdJTkFUSU9OLFxuICAgICAgcHJldjogQ0xBU1NfQVJST1dfUFJFVixcbiAgICAgIG5leHQ6IENMQVNTX0FSUk9XX05FWFQsXG4gICAgICBiYXI6IENMQVNTX1BST0dSRVNTX0JBUixcbiAgICAgIHRvZ2dsZTogQ0xBU1NfVE9HR0xFXG4gICAgfSwgZnVuY3Rpb24gKGNsYXNzTmFtZSwga2V5KSB7XG4gICAgICBlbGVtZW50c1trZXldID0gZmluZChcIi5cIiArIGNsYXNzTmFtZSk7XG4gICAgfSk7XG4gICAgYXNzaWduKGVsZW1lbnRzLCB7XG4gICAgICByb290OiByb290LFxuICAgICAgdHJhY2s6IHRyYWNrLFxuICAgICAgbGlzdDogbGlzdCxcbiAgICAgIHNsaWRlczogc2xpZGVzXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBpbml0KCkge1xuICAgIHZhciBpZCA9IHJvb3QuaWQgfHwgdW5pcXVlSWQoUFJPSkVDVF9DT0RFKTtcbiAgICB2YXIgcm9sZSA9IG9wdGlvbnMucm9sZTtcbiAgICByb290LmlkID0gaWQ7XG4gICAgdHJhY2suaWQgPSB0cmFjay5pZCB8fCBpZCArIFwiLXRyYWNrXCI7XG4gICAgbGlzdC5pZCA9IGxpc3QuaWQgfHwgaWQgKyBcIi1saXN0XCI7XG5cbiAgICBpZiAoIWdldEF0dHJpYnV0ZShyb290LCBST0xFKSAmJiByb290LnRhZ05hbWUgIT09IFwiU0VDVElPTlwiICYmIHJvbGUpIHtcbiAgICAgIHNldEF0dHJpYnV0ZShyb290LCBST0xFLCByb2xlKTtcbiAgICB9XG5cbiAgICBzZXRBdHRyaWJ1dGUocm9vdCwgQVJJQV9ST0xFREVTQ1JJUFRJT04sIGkxOG4uY2Fyb3VzZWwpO1xuICAgIHNldEF0dHJpYnV0ZShsaXN0LCBST0xFLCBcInByZXNlbnRhdGlvblwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmQoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWxtID0gcXVlcnkocm9vdCwgc2VsZWN0b3IpO1xuICAgIHJldHVybiBlbG0gJiYgY2xvc2VzdChlbG0sIFwiLlwiICsgQ0xBU1NfUk9PVCkgPT09IHJvb3QgPyBlbG0gOiB2b2lkIDA7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRDbGFzc2VzKGJhc2UpIHtcbiAgICByZXR1cm4gW2Jhc2UgKyBcIi0tXCIgKyBvcHRpb25zLnR5cGUsIGJhc2UgKyBcIi0tXCIgKyBvcHRpb25zLmRpcmVjdGlvbiwgb3B0aW9ucy5kcmFnICYmIGJhc2UgKyBcIi0tZHJhZ2dhYmxlXCIsIG9wdGlvbnMuaXNOYXZpZ2F0aW9uICYmIGJhc2UgKyBcIi0tbmF2XCIsIGJhc2UgPT09IENMQVNTX1JPT1QgJiYgQ0xBU1NfQUNUSVZFXTtcbiAgfVxuXG4gIHJldHVybiBhc3NpZ24oZWxlbWVudHMsIHtcbiAgICBzZXR1cDogc2V0dXAsXG4gICAgbW91bnQ6IG1vdW50LFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3lcbiAgfSk7XG59XG5cbnZhciBTTElERSA9IFwic2xpZGVcIjtcbnZhciBMT09QID0gXCJsb29wXCI7XG52YXIgRkFERSA9IFwiZmFkZVwiO1xuXG5mdW5jdGlvbiBTbGlkZSQxKFNwbGlkZTIsIGluZGV4LCBzbGlkZUluZGV4LCBzbGlkZSkge1xuICB2YXIgZXZlbnQgPSBFdmVudEludGVyZmFjZShTcGxpZGUyKTtcbiAgdmFyIG9uID0gZXZlbnQub24sXG4gICAgICBlbWl0ID0gZXZlbnQuZW1pdCxcbiAgICAgIGJpbmQgPSBldmVudC5iaW5kO1xuICB2YXIgQ29tcG9uZW50cyA9IFNwbGlkZTIuQ29tcG9uZW50cyxcbiAgICAgIHJvb3QgPSBTcGxpZGUyLnJvb3QsXG4gICAgICBvcHRpb25zID0gU3BsaWRlMi5vcHRpb25zO1xuICB2YXIgaXNOYXZpZ2F0aW9uID0gb3B0aW9ucy5pc05hdmlnYXRpb24sXG4gICAgICB1cGRhdGVPbk1vdmUgPSBvcHRpb25zLnVwZGF0ZU9uTW92ZSxcbiAgICAgIGkxOG4gPSBvcHRpb25zLmkxOG4sXG4gICAgICBwYWdpbmF0aW9uID0gb3B0aW9ucy5wYWdpbmF0aW9uLFxuICAgICAgc2xpZGVGb2N1cyA9IG9wdGlvbnMuc2xpZGVGb2N1cztcbiAgdmFyIHJlc29sdmUgPSBDb21wb25lbnRzLkRpcmVjdGlvbi5yZXNvbHZlO1xuICB2YXIgc3R5bGVzID0gZ2V0QXR0cmlidXRlKHNsaWRlLCBcInN0eWxlXCIpO1xuICB2YXIgbGFiZWwgPSBnZXRBdHRyaWJ1dGUoc2xpZGUsIEFSSUFfTEFCRUwpO1xuICB2YXIgaXNDbG9uZSA9IHNsaWRlSW5kZXggPiAtMTtcbiAgdmFyIGNvbnRhaW5lciA9IGNoaWxkKHNsaWRlLCBcIi5cIiArIENMQVNTX0NPTlRBSU5FUik7XG4gIHZhciBmb2N1c2FibGVOb2RlcyA9IHF1ZXJ5QWxsKHNsaWRlLCBvcHRpb25zLmZvY3VzYWJsZU5vZGVzIHx8IFwiXCIpO1xuICB2YXIgZGVzdHJveWVkO1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIGlmICghaXNDbG9uZSkge1xuICAgICAgc2xpZGUuaWQgPSByb290LmlkICsgXCItc2xpZGVcIiArIHBhZChpbmRleCArIDEpO1xuICAgICAgc2V0QXR0cmlidXRlKHNsaWRlLCBST0xFLCBwYWdpbmF0aW9uID8gXCJ0YWJwYW5lbFwiIDogXCJncm91cFwiKTtcbiAgICAgIHNldEF0dHJpYnV0ZShzbGlkZSwgQVJJQV9ST0xFREVTQ1JJUFRJT04sIGkxOG4uc2xpZGUpO1xuICAgICAgc2V0QXR0cmlidXRlKHNsaWRlLCBBUklBX0xBQkVMLCBsYWJlbCB8fCBmb3JtYXQoaTE4bi5zbGlkZUxhYmVsLCBbaW5kZXggKyAxLCBTcGxpZGUyLmxlbmd0aF0pKTtcbiAgICB9XG5cbiAgICBsaXN0ZW4oKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpc3RlbigpIHtcbiAgICBiaW5kKHNsaWRlLCBcImNsaWNrXCIsIGFwcGx5KGVtaXQsIEVWRU5UX0NMSUNLLCBzZWxmKSk7XG4gICAgYmluZChzbGlkZSwgXCJrZXlkb3duXCIsIGFwcGx5KGVtaXQsIEVWRU5UX1NMSURFX0tFWURPV04sIHNlbGYpKTtcbiAgICBvbihbRVZFTlRfTU9WRUQsIEVWRU5UX1NISUZURUQsIEVWRU5UX1NDUk9MTEVEXSwgdXBkYXRlKTtcbiAgICBvbihFVkVOVF9OQVZJR0FUSU9OX01PVU5URUQsIGluaXROYXZpZ2F0aW9uKTtcblxuICAgIGlmICh1cGRhdGVPbk1vdmUpIHtcbiAgICAgIG9uKEVWRU5UX01PVkUsIG9uTW92ZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICBkZXN0cm95ZWQgPSB0cnVlO1xuICAgIGV2ZW50LmRlc3Ryb3koKTtcbiAgICByZW1vdmVDbGFzcyhzbGlkZSwgU1RBVFVTX0NMQVNTRVMpO1xuICAgIHJlbW92ZUF0dHJpYnV0ZShzbGlkZSwgQUxMX0FUVFJJQlVURVMpO1xuICAgIHNldEF0dHJpYnV0ZShzbGlkZSwgXCJzdHlsZVwiLCBzdHlsZXMpO1xuICAgIHNldEF0dHJpYnV0ZShzbGlkZSwgQVJJQV9MQUJFTCwgbGFiZWwgfHwgXCJcIik7XG4gIH1cblxuICBmdW5jdGlvbiBpbml0TmF2aWdhdGlvbigpIHtcbiAgICB2YXIgY29udHJvbHMgPSBTcGxpZGUyLnNwbGlkZXMubWFwKGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgIHZhciBTbGlkZTIgPSB0YXJnZXQuc3BsaWRlLkNvbXBvbmVudHMuU2xpZGVzLmdldEF0KGluZGV4KTtcbiAgICAgIHJldHVybiBTbGlkZTIgPyBTbGlkZTIuc2xpZGUuaWQgOiBcIlwiO1xuICAgIH0pLmpvaW4oXCIgXCIpO1xuICAgIHNldEF0dHJpYnV0ZShzbGlkZSwgQVJJQV9MQUJFTCwgZm9ybWF0KGkxOG4uc2xpZGVYLCAoaXNDbG9uZSA/IHNsaWRlSW5kZXggOiBpbmRleCkgKyAxKSk7XG4gICAgc2V0QXR0cmlidXRlKHNsaWRlLCBBUklBX0NPTlRST0xTLCBjb250cm9scyk7XG4gICAgc2V0QXR0cmlidXRlKHNsaWRlLCBST0xFLCBzbGlkZUZvY3VzID8gXCJidXR0b25cIiA6IFwiXCIpO1xuICAgIHNsaWRlRm9jdXMgJiYgcmVtb3ZlQXR0cmlidXRlKHNsaWRlLCBBUklBX1JPTEVERVNDUklQVElPTik7XG4gIH1cblxuICBmdW5jdGlvbiBvbk1vdmUoKSB7XG4gICAgaWYgKCFkZXN0cm95ZWQpIHtcbiAgICAgIHVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICBpZiAoIWRlc3Ryb3llZCkge1xuICAgICAgdmFyIGN1cnIgPSBTcGxpZGUyLmluZGV4O1xuICAgICAgdXBkYXRlQWN0aXZpdHkoKTtcbiAgICAgIHVwZGF0ZVZpc2liaWxpdHkoKTtcbiAgICAgIHRvZ2dsZUNsYXNzKHNsaWRlLCBDTEFTU19QUkVWLCBpbmRleCA9PT0gY3VyciAtIDEpO1xuICAgICAgdG9nZ2xlQ2xhc3Moc2xpZGUsIENMQVNTX05FWFQsIGluZGV4ID09PSBjdXJyICsgMSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlQWN0aXZpdHkoKSB7XG4gICAgdmFyIGFjdGl2ZSA9IGlzQWN0aXZlKCk7XG5cbiAgICBpZiAoYWN0aXZlICE9PSBoYXNDbGFzcyhzbGlkZSwgQ0xBU1NfQUNUSVZFKSkge1xuICAgICAgdG9nZ2xlQ2xhc3Moc2xpZGUsIENMQVNTX0FDVElWRSwgYWN0aXZlKTtcbiAgICAgIHNldEF0dHJpYnV0ZShzbGlkZSwgQVJJQV9DVVJSRU5ULCBpc05hdmlnYXRpb24gJiYgYWN0aXZlIHx8IFwiXCIpO1xuICAgICAgZW1pdChhY3RpdmUgPyBFVkVOVF9BQ1RJVkUgOiBFVkVOVF9JTkFDVElWRSwgc2VsZik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlVmlzaWJpbGl0eSgpIHtcbiAgICB2YXIgdmlzaWJsZSA9IGlzVmlzaWJsZSgpO1xuICAgIHZhciBoaWRkZW4gPSAhdmlzaWJsZSAmJiAoIWlzQWN0aXZlKCkgfHwgaXNDbG9uZSk7XG5cbiAgICBpZiAoIVNwbGlkZTIuc3RhdGUuaXMoW01PVklORywgU0NST0xMSU5HXSkpIHtcbiAgICAgIHNldEF0dHJpYnV0ZShzbGlkZSwgQVJJQV9ISURERU4sIGhpZGRlbiB8fCBcIlwiKTtcbiAgICB9XG5cbiAgICBzZXRBdHRyaWJ1dGUoZm9jdXNhYmxlTm9kZXMsIFRBQl9JTkRFWCwgaGlkZGVuID8gLTEgOiBcIlwiKTtcblxuICAgIGlmIChzbGlkZUZvY3VzKSB7XG4gICAgICBzZXRBdHRyaWJ1dGUoc2xpZGUsIFRBQl9JTkRFWCwgaGlkZGVuID8gLTEgOiAwKTtcbiAgICB9XG5cbiAgICBpZiAodmlzaWJsZSAhPT0gaGFzQ2xhc3Moc2xpZGUsIENMQVNTX1ZJU0lCTEUpKSB7XG4gICAgICB0b2dnbGVDbGFzcyhzbGlkZSwgQ0xBU1NfVklTSUJMRSwgdmlzaWJsZSk7XG4gICAgICBlbWl0KHZpc2libGUgPyBFVkVOVF9WSVNJQkxFIDogRVZFTlRfSElEREVOLCBzZWxmKTtcbiAgICB9XG5cbiAgICBpZiAoIXZpc2libGUgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gc2xpZGUpIHtcbiAgICAgIHZhciBTbGlkZTIgPSBDb21wb25lbnRzLlNsaWRlcy5nZXRBdChTcGxpZGUyLmluZGV4KTtcbiAgICAgIFNsaWRlMiAmJiBmb2N1cyhTbGlkZTIuc2xpZGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0eWxlJDEocHJvcCwgdmFsdWUsIHVzZUNvbnRhaW5lcikge1xuICAgIHN0eWxlKHVzZUNvbnRhaW5lciAmJiBjb250YWluZXIgfHwgc2xpZGUsIHByb3AsIHZhbHVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzQWN0aXZlKCkge1xuICAgIHZhciBjdXJyID0gU3BsaWRlMi5pbmRleDtcbiAgICByZXR1cm4gY3VyciA9PT0gaW5kZXggfHwgb3B0aW9ucy5jbG9uZVN0YXR1cyAmJiBjdXJyID09PSBzbGlkZUluZGV4O1xuICB9XG5cbiAgZnVuY3Rpb24gaXNWaXNpYmxlKCkge1xuICAgIGlmIChTcGxpZGUyLmlzKEZBREUpKSB7XG4gICAgICByZXR1cm4gaXNBY3RpdmUoKTtcbiAgICB9XG5cbiAgICB2YXIgdHJhY2tSZWN0ID0gcmVjdChDb21wb25lbnRzLkVsZW1lbnRzLnRyYWNrKTtcbiAgICB2YXIgc2xpZGVSZWN0ID0gcmVjdChzbGlkZSk7XG4gICAgdmFyIGxlZnQgPSByZXNvbHZlKFwibGVmdFwiLCB0cnVlKTtcbiAgICB2YXIgcmlnaHQgPSByZXNvbHZlKFwicmlnaHRcIiwgdHJ1ZSk7XG4gICAgcmV0dXJuIGZsb29yKHRyYWNrUmVjdFtsZWZ0XSkgPD0gY2VpbChzbGlkZVJlY3RbbGVmdF0pICYmIGZsb29yKHNsaWRlUmVjdFtyaWdodF0pIDw9IGNlaWwodHJhY2tSZWN0W3JpZ2h0XSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc1dpdGhpbihmcm9tLCBkaXN0YW5jZSkge1xuICAgIHZhciBkaWZmID0gYWJzKGZyb20gLSBpbmRleCk7XG5cbiAgICBpZiAoIWlzQ2xvbmUgJiYgKG9wdGlvbnMucmV3aW5kIHx8IFNwbGlkZTIuaXMoTE9PUCkpKSB7XG4gICAgICBkaWZmID0gbWluKGRpZmYsIFNwbGlkZTIubGVuZ3RoIC0gZGlmZik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpZmYgPD0gZGlzdGFuY2U7XG4gIH1cblxuICB2YXIgc2VsZiA9IHtcbiAgICBpbmRleDogaW5kZXgsXG4gICAgc2xpZGVJbmRleDogc2xpZGVJbmRleCxcbiAgICBzbGlkZTogc2xpZGUsXG4gICAgY29udGFpbmVyOiBjb250YWluZXIsXG4gICAgaXNDbG9uZTogaXNDbG9uZSxcbiAgICBtb3VudDogbW91bnQsXG4gICAgZGVzdHJveTogZGVzdHJveSxcbiAgICB1cGRhdGU6IHVwZGF0ZSxcbiAgICBzdHlsZTogc3R5bGUkMSxcbiAgICBpc1dpdGhpbjogaXNXaXRoaW5cbiAgfTtcbiAgcmV0dXJuIHNlbGY7XG59XG5cbmZ1bmN0aW9uIFNsaWRlcyhTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgX0V2ZW50SW50ZXJmYWNlMiA9IEV2ZW50SW50ZXJmYWNlKFNwbGlkZTIpLFxuICAgICAgb24gPSBfRXZlbnRJbnRlcmZhY2UyLm9uLFxuICAgICAgZW1pdCA9IF9FdmVudEludGVyZmFjZTIuZW1pdCxcbiAgICAgIGJpbmQgPSBfRXZlbnRJbnRlcmZhY2UyLmJpbmQ7XG5cbiAgdmFyIF9Db21wb25lbnRzMiRFbGVtZW50cyA9IENvbXBvbmVudHMyLkVsZW1lbnRzLFxuICAgICAgc2xpZGVzID0gX0NvbXBvbmVudHMyJEVsZW1lbnRzLnNsaWRlcyxcbiAgICAgIGxpc3QgPSBfQ29tcG9uZW50czIkRWxlbWVudHMubGlzdDtcbiAgdmFyIFNsaWRlczIgPSBbXTtcblxuICBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICBpbml0KCk7XG4gICAgb24oRVZFTlRfUkVGUkVTSCwgZGVzdHJveSk7XG4gICAgb24oRVZFTlRfUkVGUkVTSCwgaW5pdCk7XG4gICAgb24oW0VWRU5UX01PVU5URUQsIEVWRU5UX1JFRlJFU0hdLCBmdW5jdGlvbiAoKSB7XG4gICAgICBTbGlkZXMyLnNvcnQoZnVuY3Rpb24gKFNsaWRlMSwgU2xpZGUyKSB7XG4gICAgICAgIHJldHVybiBTbGlkZTEuaW5kZXggLSBTbGlkZTIuaW5kZXg7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgc2xpZGVzLmZvckVhY2goZnVuY3Rpb24gKHNsaWRlLCBpbmRleCkge1xuICAgICAgcmVnaXN0ZXIoc2xpZGUsIGluZGV4LCAtMSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIGZvckVhY2gkMShmdW5jdGlvbiAoU2xpZGUyKSB7XG4gICAgICBTbGlkZTIuZGVzdHJveSgpO1xuICAgIH0pO1xuICAgIGVtcHR5KFNsaWRlczIpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgIGZvckVhY2gkMShmdW5jdGlvbiAoU2xpZGUyKSB7XG4gICAgICBTbGlkZTIudXBkYXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiByZWdpc3RlcihzbGlkZSwgaW5kZXgsIHNsaWRlSW5kZXgpIHtcbiAgICB2YXIgb2JqZWN0ID0gU2xpZGUkMShTcGxpZGUyLCBpbmRleCwgc2xpZGVJbmRleCwgc2xpZGUpO1xuICAgIG9iamVjdC5tb3VudCgpO1xuICAgIFNsaWRlczIucHVzaChvYmplY3QpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0KGV4Y2x1ZGVDbG9uZXMpIHtcbiAgICByZXR1cm4gZXhjbHVkZUNsb25lcyA/IGZpbHRlcihmdW5jdGlvbiAoU2xpZGUyKSB7XG4gICAgICByZXR1cm4gIVNsaWRlMi5pc0Nsb25lO1xuICAgIH0pIDogU2xpZGVzMjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEluKHBhZ2UpIHtcbiAgICB2YXIgQ29udHJvbGxlciA9IENvbXBvbmVudHMyLkNvbnRyb2xsZXI7XG4gICAgdmFyIGluZGV4ID0gQ29udHJvbGxlci50b0luZGV4KHBhZ2UpO1xuICAgIHZhciBtYXggPSBDb250cm9sbGVyLmhhc0ZvY3VzKCkgPyAxIDogb3B0aW9ucy5wZXJQYWdlO1xuICAgIHJldHVybiBmaWx0ZXIoZnVuY3Rpb24gKFNsaWRlMikge1xuICAgICAgcmV0dXJuIGJldHdlZW4oU2xpZGUyLmluZGV4LCBpbmRleCwgaW5kZXggKyBtYXggLSAxKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEF0KGluZGV4KSB7XG4gICAgcmV0dXJuIGZpbHRlcihpbmRleClbMF07XG4gIH1cblxuICBmdW5jdGlvbiBhZGQoaXRlbXMsIGluZGV4KSB7XG4gICAgZm9yRWFjaChpdGVtcywgZnVuY3Rpb24gKHNsaWRlKSB7XG4gICAgICBpZiAoaXNTdHJpbmcoc2xpZGUpKSB7XG4gICAgICAgIHNsaWRlID0gcGFyc2VIdG1sKHNsaWRlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzSFRNTEVsZW1lbnQoc2xpZGUpKSB7XG4gICAgICAgIHZhciByZWYgPSBzbGlkZXNbaW5kZXhdO1xuICAgICAgICByZWYgPyBiZWZvcmUoc2xpZGUsIHJlZikgOiBhcHBlbmQobGlzdCwgc2xpZGUpO1xuICAgICAgICBhZGRDbGFzcyhzbGlkZSwgb3B0aW9ucy5jbGFzc2VzLnNsaWRlKTtcbiAgICAgICAgb2JzZXJ2ZUltYWdlcyhzbGlkZSwgYXBwbHkoZW1pdCwgRVZFTlRfUkVTSVpFKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZW1pdChFVkVOVF9SRUZSRVNIKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZSQxKG1hdGNoZXIpIHtcbiAgICByZW1vdmUoZmlsdGVyKG1hdGNoZXIpLm1hcChmdW5jdGlvbiAoU2xpZGUyKSB7XG4gICAgICByZXR1cm4gU2xpZGUyLnNsaWRlO1xuICAgIH0pKTtcbiAgICBlbWl0KEVWRU5UX1JFRlJFU0gpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9yRWFjaCQxKGl0ZXJhdGVlLCBleGNsdWRlQ2xvbmVzKSB7XG4gICAgZ2V0KGV4Y2x1ZGVDbG9uZXMpLmZvckVhY2goaXRlcmF0ZWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gZmlsdGVyKG1hdGNoZXIpIHtcbiAgICByZXR1cm4gU2xpZGVzMi5maWx0ZXIoaXNGdW5jdGlvbihtYXRjaGVyKSA/IG1hdGNoZXIgOiBmdW5jdGlvbiAoU2xpZGUyKSB7XG4gICAgICByZXR1cm4gaXNTdHJpbmcobWF0Y2hlcikgPyBtYXRjaGVzKFNsaWRlMi5zbGlkZSwgbWF0Y2hlcikgOiBpbmNsdWRlcyh0b0FycmF5KG1hdGNoZXIpLCBTbGlkZTIuaW5kZXgpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gc3R5bGUocHJvcCwgdmFsdWUsIHVzZUNvbnRhaW5lcikge1xuICAgIGZvckVhY2gkMShmdW5jdGlvbiAoU2xpZGUyKSB7XG4gICAgICBTbGlkZTIuc3R5bGUocHJvcCwgdmFsdWUsIHVzZUNvbnRhaW5lcik7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBvYnNlcnZlSW1hZ2VzKGVsbSwgY2FsbGJhY2spIHtcbiAgICB2YXIgaW1hZ2VzID0gcXVlcnlBbGwoZWxtLCBcImltZ1wiKTtcbiAgICB2YXIgbGVuZ3RoID0gaW1hZ2VzLmxlbmd0aDtcblxuICAgIGlmIChsZW5ndGgpIHtcbiAgICAgIGltYWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChpbWcpIHtcbiAgICAgICAgYmluZChpbWcsIFwibG9hZCBlcnJvclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCEgLS1sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldExlbmd0aChleGNsdWRlQ2xvbmVzKSB7XG4gICAgcmV0dXJuIGV4Y2x1ZGVDbG9uZXMgPyBzbGlkZXMubGVuZ3RoIDogU2xpZGVzMi5sZW5ndGg7XG4gIH1cblxuICBmdW5jdGlvbiBpc0Vub3VnaCgpIHtcbiAgICByZXR1cm4gU2xpZGVzMi5sZW5ndGggPiBvcHRpb25zLnBlclBhZ2U7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1vdW50OiBtb3VudCxcbiAgICBkZXN0cm95OiBkZXN0cm95LFxuICAgIHVwZGF0ZTogdXBkYXRlLFxuICAgIHJlZ2lzdGVyOiByZWdpc3RlcixcbiAgICBnZXQ6IGdldCxcbiAgICBnZXRJbjogZ2V0SW4sXG4gICAgZ2V0QXQ6IGdldEF0LFxuICAgIGFkZDogYWRkLFxuICAgIHJlbW92ZTogcmVtb3ZlJDEsXG4gICAgZm9yRWFjaDogZm9yRWFjaCQxLFxuICAgIGZpbHRlcjogZmlsdGVyLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBnZXRMZW5ndGg6IGdldExlbmd0aCxcbiAgICBpc0Vub3VnaDogaXNFbm91Z2hcbiAgfTtcbn1cblxuZnVuY3Rpb24gTGF5b3V0KFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIHZhciBfRXZlbnRJbnRlcmZhY2UzID0gRXZlbnRJbnRlcmZhY2UoU3BsaWRlMiksXG4gICAgICBvbiA9IF9FdmVudEludGVyZmFjZTMub24sXG4gICAgICBiaW5kID0gX0V2ZW50SW50ZXJmYWNlMy5iaW5kLFxuICAgICAgZW1pdCA9IF9FdmVudEludGVyZmFjZTMuZW1pdDtcblxuICB2YXIgU2xpZGVzID0gQ29tcG9uZW50czIuU2xpZGVzO1xuICB2YXIgcmVzb2x2ZSA9IENvbXBvbmVudHMyLkRpcmVjdGlvbi5yZXNvbHZlO1xuICB2YXIgX0NvbXBvbmVudHMyJEVsZW1lbnRzMiA9IENvbXBvbmVudHMyLkVsZW1lbnRzLFxuICAgICAgcm9vdCA9IF9Db21wb25lbnRzMiRFbGVtZW50czIucm9vdCxcbiAgICAgIHRyYWNrID0gX0NvbXBvbmVudHMyJEVsZW1lbnRzMi50cmFjayxcbiAgICAgIGxpc3QgPSBfQ29tcG9uZW50czIkRWxlbWVudHMyLmxpc3Q7XG4gIHZhciBnZXRBdCA9IFNsaWRlcy5nZXRBdCxcbiAgICAgIHN0eWxlU2xpZGVzID0gU2xpZGVzLnN0eWxlO1xuICB2YXIgdmVydGljYWw7XG4gIHZhciByb290UmVjdDtcblxuICBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICBpbml0KCk7XG4gICAgYmluZCh3aW5kb3csIFwicmVzaXplIGxvYWRcIiwgVGhyb3R0bGUoYXBwbHkoZW1pdCwgRVZFTlRfUkVTSVpFKSkpO1xuICAgIG9uKFtFVkVOVF9VUERBVEVELCBFVkVOVF9SRUZSRVNIXSwgaW5pdCk7XG4gICAgb24oRVZFTlRfUkVTSVpFLCByZXNpemUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICByb290UmVjdCA9IG51bGw7XG4gICAgdmVydGljYWwgPSBvcHRpb25zLmRpcmVjdGlvbiA9PT0gVFRCO1xuICAgIHN0eWxlKHJvb3QsIFwibWF4V2lkdGhcIiwgdW5pdChvcHRpb25zLndpZHRoKSk7XG4gICAgc3R5bGUodHJhY2ssIHJlc29sdmUoXCJwYWRkaW5nTGVmdFwiKSwgY3NzUGFkZGluZyhmYWxzZSkpO1xuICAgIHN0eWxlKHRyYWNrLCByZXNvbHZlKFwicGFkZGluZ1JpZ2h0XCIpLCBjc3NQYWRkaW5nKHRydWUpKTtcbiAgICByZXNpemUoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2l6ZSgpIHtcbiAgICB2YXIgbmV3UmVjdCA9IHJlY3Qocm9vdCk7XG5cbiAgICBpZiAoIXJvb3RSZWN0IHx8IHJvb3RSZWN0LndpZHRoICE9PSBuZXdSZWN0LndpZHRoIHx8IHJvb3RSZWN0LmhlaWdodCAhPT0gbmV3UmVjdC5oZWlnaHQpIHtcbiAgICAgIHN0eWxlKHRyYWNrLCBcImhlaWdodFwiLCBjc3NUcmFja0hlaWdodCgpKTtcbiAgICAgIHN0eWxlU2xpZGVzKHJlc29sdmUoXCJtYXJnaW5SaWdodFwiKSwgdW5pdChvcHRpb25zLmdhcCkpO1xuICAgICAgc3R5bGVTbGlkZXMoXCJ3aWR0aFwiLCBjc3NTbGlkZVdpZHRoKCkpO1xuICAgICAgc3R5bGVTbGlkZXMoXCJoZWlnaHRcIiwgY3NzU2xpZGVIZWlnaHQoKSwgdHJ1ZSk7XG4gICAgICByb290UmVjdCA9IG5ld1JlY3Q7XG4gICAgICBlbWl0KEVWRU5UX1JFU0laRUQpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNzc1BhZGRpbmcocmlnaHQpIHtcbiAgICB2YXIgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZztcbiAgICB2YXIgcHJvcCA9IHJlc29sdmUocmlnaHQgPyBcInJpZ2h0XCIgOiBcImxlZnRcIik7XG4gICAgcmV0dXJuIHBhZGRpbmcgJiYgdW5pdChwYWRkaW5nW3Byb3BdIHx8IChpc09iamVjdChwYWRkaW5nKSA/IDAgOiBwYWRkaW5nKSkgfHwgXCIwcHhcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNzc1RyYWNrSGVpZ2h0KCkge1xuICAgIHZhciBoZWlnaHQgPSBcIlwiO1xuXG4gICAgaWYgKHZlcnRpY2FsKSB7XG4gICAgICBoZWlnaHQgPSBjc3NIZWlnaHQoKTtcbiAgICAgIGFzc2VydChoZWlnaHQsIFwiaGVpZ2h0IG9yIGhlaWdodFJhdGlvIGlzIG1pc3NpbmcuXCIpO1xuICAgICAgaGVpZ2h0ID0gXCJjYWxjKFwiICsgaGVpZ2h0ICsgXCIgLSBcIiArIGNzc1BhZGRpbmcoZmFsc2UpICsgXCIgLSBcIiArIGNzc1BhZGRpbmcodHJ1ZSkgKyBcIilcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gaGVpZ2h0O1xuICB9XG5cbiAgZnVuY3Rpb24gY3NzSGVpZ2h0KCkge1xuICAgIHJldHVybiB1bml0KG9wdGlvbnMuaGVpZ2h0IHx8IHJlY3QobGlzdCkud2lkdGggKiBvcHRpb25zLmhlaWdodFJhdGlvKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNzc1NsaWRlV2lkdGgoKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuYXV0b1dpZHRoID8gbnVsbCA6IHVuaXQob3B0aW9ucy5maXhlZFdpZHRoKSB8fCAodmVydGljYWwgPyBcIlwiIDogY3NzU2xpZGVTaXplKCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3NzU2xpZGVIZWlnaHQoKSB7XG4gICAgcmV0dXJuIHVuaXQob3B0aW9ucy5maXhlZEhlaWdodCkgfHwgKHZlcnRpY2FsID8gb3B0aW9ucy5hdXRvSGVpZ2h0ID8gbnVsbCA6IGNzc1NsaWRlU2l6ZSgpIDogY3NzSGVpZ2h0KCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3NzU2xpZGVTaXplKCkge1xuICAgIHZhciBnYXAgPSB1bml0KG9wdGlvbnMuZ2FwKTtcbiAgICByZXR1cm4gXCJjYWxjKCgxMDAlXCIgKyAoZ2FwICYmIFwiICsgXCIgKyBnYXApICsgXCIpL1wiICsgKG9wdGlvbnMucGVyUGFnZSB8fCAxKSArIChnYXAgJiYgXCIgLSBcIiArIGdhcCkgKyBcIilcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpc3RTaXplKCkge1xuICAgIHJldHVybiByZWN0KGxpc3QpW3Jlc29sdmUoXCJ3aWR0aFwiKV07XG4gIH1cblxuICBmdW5jdGlvbiBzbGlkZVNpemUoaW5kZXgsIHdpdGhvdXRHYXApIHtcbiAgICB2YXIgU2xpZGUgPSBnZXRBdChpbmRleCB8fCAwKTtcbiAgICByZXR1cm4gU2xpZGUgPyByZWN0KFNsaWRlLnNsaWRlKVtyZXNvbHZlKFwid2lkdGhcIildICsgKHdpdGhvdXRHYXAgPyAwIDogZ2V0R2FwKCkpIDogMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdGFsU2l6ZShpbmRleCwgd2l0aG91dEdhcCkge1xuICAgIHZhciBTbGlkZSA9IGdldEF0KGluZGV4KTtcblxuICAgIGlmIChTbGlkZSkge1xuICAgICAgdmFyIHJpZ2h0ID0gcmVjdChTbGlkZS5zbGlkZSlbcmVzb2x2ZShcInJpZ2h0XCIpXTtcbiAgICAgIHZhciBsZWZ0ID0gcmVjdChsaXN0KVtyZXNvbHZlKFwibGVmdFwiKV07XG4gICAgICByZXR1cm4gYWJzKHJpZ2h0IC0gbGVmdCkgKyAod2l0aG91dEdhcCA/IDAgOiBnZXRHYXAoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBmdW5jdGlvbiBzbGlkZXJTaXplKCkge1xuICAgIHJldHVybiB0b3RhbFNpemUoU3BsaWRlMi5sZW5ndGggLSAxLCB0cnVlKSAtIHRvdGFsU2l6ZSgtMSwgdHJ1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRHYXAoKSB7XG4gICAgdmFyIFNsaWRlID0gZ2V0QXQoMCk7XG4gICAgcmV0dXJuIFNsaWRlICYmIHBhcnNlRmxvYXQoc3R5bGUoU2xpZGUuc2xpZGUsIHJlc29sdmUoXCJtYXJnaW5SaWdodFwiKSkpIHx8IDA7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRQYWRkaW5nKHJpZ2h0KSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoc3R5bGUodHJhY2ssIHJlc29sdmUoXCJwYWRkaW5nXCIgKyAocmlnaHQgPyBcIlJpZ2h0XCIgOiBcIkxlZnRcIikpKSkgfHwgMDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbW91bnQ6IG1vdW50LFxuICAgIGxpc3RTaXplOiBsaXN0U2l6ZSxcbiAgICBzbGlkZVNpemU6IHNsaWRlU2l6ZSxcbiAgICBzbGlkZXJTaXplOiBzbGlkZXJTaXplLFxuICAgIHRvdGFsU2l6ZTogdG90YWxTaXplLFxuICAgIGdldFBhZGRpbmc6IGdldFBhZGRpbmdcbiAgfTtcbn1cblxudmFyIE1VTFRJUExJRVIgPSAyO1xuXG5mdW5jdGlvbiBDbG9uZXMoU3BsaWRlMiwgQ29tcG9uZW50czIsIG9wdGlvbnMpIHtcbiAgdmFyIF9FdmVudEludGVyZmFjZTQgPSBFdmVudEludGVyZmFjZShTcGxpZGUyKSxcbiAgICAgIG9uID0gX0V2ZW50SW50ZXJmYWNlNC5vbixcbiAgICAgIGVtaXQgPSBfRXZlbnRJbnRlcmZhY2U0LmVtaXQ7XG5cbiAgdmFyIEVsZW1lbnRzID0gQ29tcG9uZW50czIuRWxlbWVudHMsXG4gICAgICBTbGlkZXMgPSBDb21wb25lbnRzMi5TbGlkZXM7XG4gIHZhciByZXNvbHZlID0gQ29tcG9uZW50czIuRGlyZWN0aW9uLnJlc29sdmU7XG4gIHZhciBjbG9uZXMgPSBbXTtcbiAgdmFyIGNsb25lQ291bnQ7XG5cbiAgZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgaW5pdCgpO1xuICAgIG9uKEVWRU5UX1JFRlJFU0gsIGRlc3Ryb3kpO1xuICAgIG9uKEVWRU5UX1JFRlJFU0gsIGluaXQpO1xuICAgIG9uKFtFVkVOVF9VUERBVEVELCBFVkVOVF9SRVNJWkVdLCBvYnNlcnZlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgaWYgKGNsb25lQ291bnQgPSBjb21wdXRlQ2xvbmVDb3VudCgpKSB7XG4gICAgICBnZW5lcmF0ZShjbG9uZUNvdW50KTtcbiAgICAgIGVtaXQoRVZFTlRfUkVTSVpFKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIHJlbW92ZShjbG9uZXMpO1xuICAgIGVtcHR5KGNsb25lcyk7XG4gIH1cblxuICBmdW5jdGlvbiBvYnNlcnZlKCkge1xuICAgIGlmIChjbG9uZUNvdW50IDwgY29tcHV0ZUNsb25lQ291bnQoKSkge1xuICAgICAgZW1pdChFVkVOVF9SRUZSRVNIKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZW5lcmF0ZShjb3VudCkge1xuICAgIHZhciBzbGlkZXMgPSBTbGlkZXMuZ2V0KCkuc2xpY2UoKTtcbiAgICB2YXIgbGVuZ3RoID0gc2xpZGVzLmxlbmd0aDtcblxuICAgIGlmIChsZW5ndGgpIHtcbiAgICAgIHdoaWxlIChzbGlkZXMubGVuZ3RoIDwgY291bnQpIHtcbiAgICAgICAgcHVzaChzbGlkZXMsIHNsaWRlcyk7XG4gICAgICB9XG5cbiAgICAgIHB1c2goc2xpZGVzLnNsaWNlKC1jb3VudCksIHNsaWRlcy5zbGljZSgwLCBjb3VudCkpLmZvckVhY2goZnVuY3Rpb24gKFNsaWRlLCBpbmRleCkge1xuICAgICAgICB2YXIgaXNIZWFkID0gaW5kZXggPCBjb3VudDtcbiAgICAgICAgdmFyIGNsb25lID0gY2xvbmVEZWVwKFNsaWRlLnNsaWRlLCBpbmRleCk7XG4gICAgICAgIGlzSGVhZCA/IGJlZm9yZShjbG9uZSwgc2xpZGVzWzBdLnNsaWRlKSA6IGFwcGVuZChFbGVtZW50cy5saXN0LCBjbG9uZSk7XG4gICAgICAgIHB1c2goY2xvbmVzLCBjbG9uZSk7XG4gICAgICAgIFNsaWRlcy5yZWdpc3RlcihjbG9uZSwgaW5kZXggLSBjb3VudCArIChpc0hlYWQgPyAwIDogbGVuZ3RoKSwgU2xpZGUuaW5kZXgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xvbmVEZWVwKGVsbSwgaW5kZXgpIHtcbiAgICB2YXIgY2xvbmUgPSBlbG0uY2xvbmVOb2RlKHRydWUpO1xuICAgIGFkZENsYXNzKGNsb25lLCBvcHRpb25zLmNsYXNzZXMuY2xvbmUpO1xuICAgIGNsb25lLmlkID0gU3BsaWRlMi5yb290LmlkICsgXCItY2xvbmVcIiArIHBhZChpbmRleCArIDEpO1xuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXB1dGVDbG9uZUNvdW50KCkge1xuICAgIHZhciBjbG9uZXMyID0gb3B0aW9ucy5jbG9uZXM7XG5cbiAgICBpZiAoIVNwbGlkZTIuaXMoTE9PUCkpIHtcbiAgICAgIGNsb25lczIgPSAwO1xuICAgIH0gZWxzZSBpZiAoIWNsb25lczIpIHtcbiAgICAgIHZhciBmaXhlZFNpemUgPSBvcHRpb25zW3Jlc29sdmUoXCJmaXhlZFdpZHRoXCIpXSAmJiBDb21wb25lbnRzMi5MYXlvdXQuc2xpZGVTaXplKDApO1xuICAgICAgdmFyIGZpeGVkQ291bnQgPSBmaXhlZFNpemUgJiYgY2VpbChyZWN0KEVsZW1lbnRzLnRyYWNrKVtyZXNvbHZlKFwid2lkdGhcIildIC8gZml4ZWRTaXplKTtcbiAgICAgIGNsb25lczIgPSBmaXhlZENvdW50IHx8IG9wdGlvbnNbcmVzb2x2ZShcImF1dG9XaWR0aFwiKV0gJiYgU3BsaWRlMi5sZW5ndGggfHwgb3B0aW9ucy5wZXJQYWdlICogTVVMVElQTElFUjtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmVzMjtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbW91bnQ6IG1vdW50LFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3lcbiAgfTtcbn1cblxuZnVuY3Rpb24gTW92ZShTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgX0V2ZW50SW50ZXJmYWNlNSA9IEV2ZW50SW50ZXJmYWNlKFNwbGlkZTIpLFxuICAgICAgb24gPSBfRXZlbnRJbnRlcmZhY2U1Lm9uLFxuICAgICAgZW1pdCA9IF9FdmVudEludGVyZmFjZTUuZW1pdDtcblxuICB2YXIgc2V0ID0gU3BsaWRlMi5zdGF0ZS5zZXQ7XG4gIHZhciBfQ29tcG9uZW50czIkTGF5b3V0ID0gQ29tcG9uZW50czIuTGF5b3V0LFxuICAgICAgc2xpZGVTaXplID0gX0NvbXBvbmVudHMyJExheW91dC5zbGlkZVNpemUsXG4gICAgICBnZXRQYWRkaW5nID0gX0NvbXBvbmVudHMyJExheW91dC5nZXRQYWRkaW5nLFxuICAgICAgdG90YWxTaXplID0gX0NvbXBvbmVudHMyJExheW91dC50b3RhbFNpemUsXG4gICAgICBsaXN0U2l6ZSA9IF9Db21wb25lbnRzMiRMYXlvdXQubGlzdFNpemUsXG4gICAgICBzbGlkZXJTaXplID0gX0NvbXBvbmVudHMyJExheW91dC5zbGlkZXJTaXplO1xuICB2YXIgX0NvbXBvbmVudHMyJERpcmVjdGlvID0gQ29tcG9uZW50czIuRGlyZWN0aW9uLFxuICAgICAgcmVzb2x2ZSA9IF9Db21wb25lbnRzMiREaXJlY3Rpby5yZXNvbHZlLFxuICAgICAgb3JpZW50ID0gX0NvbXBvbmVudHMyJERpcmVjdGlvLm9yaWVudDtcbiAgdmFyIF9Db21wb25lbnRzMiRFbGVtZW50czMgPSBDb21wb25lbnRzMi5FbGVtZW50cyxcbiAgICAgIGxpc3QgPSBfQ29tcG9uZW50czIkRWxlbWVudHMzLmxpc3QsXG4gICAgICB0cmFjayA9IF9Db21wb25lbnRzMiRFbGVtZW50czMudHJhY2s7XG4gIHZhciBUcmFuc2l0aW9uO1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIFRyYW5zaXRpb24gPSBDb21wb25lbnRzMi5UcmFuc2l0aW9uO1xuICAgIG9uKFtFVkVOVF9NT1VOVEVELCBFVkVOVF9SRVNJWkVELCBFVkVOVF9VUERBVEVELCBFVkVOVF9SRUZSRVNIXSwgcmVwb3NpdGlvbik7XG4gIH1cblxuICBmdW5jdGlvbiByZXBvc2l0aW9uKCkge1xuICAgIGlmICghQ29tcG9uZW50czIuQ29udHJvbGxlci5pc0J1c3koKSkge1xuICAgICAgQ29tcG9uZW50czIuU2Nyb2xsLmNhbmNlbCgpO1xuICAgICAganVtcChTcGxpZGUyLmluZGV4KTtcbiAgICAgIENvbXBvbmVudHMyLlNsaWRlcy51cGRhdGUoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtb3ZlKGRlc3QsIGluZGV4LCBwcmV2LCBjYWxsYmFjaykge1xuICAgIGlmIChkZXN0ICE9PSBpbmRleCAmJiBjYW5TaGlmdChkZXN0ID4gcHJldikpIHtcbiAgICAgIGNhbmNlbCgpO1xuICAgICAgdHJhbnNsYXRlKHNoaWZ0KGdldFBvc2l0aW9uKCksIGRlc3QgPiBwcmV2KSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgc2V0KE1PVklORyk7XG4gICAgZW1pdChFVkVOVF9NT1ZFLCBpbmRleCwgcHJldiwgZGVzdCk7XG4gICAgVHJhbnNpdGlvbi5zdGFydChpbmRleCwgZnVuY3Rpb24gKCkge1xuICAgICAgc2V0KElETEUpO1xuICAgICAgZW1pdChFVkVOVF9NT1ZFRCwgaW5kZXgsIHByZXYsIGRlc3QpO1xuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGp1bXAoaW5kZXgpIHtcbiAgICB0cmFuc2xhdGUodG9Qb3NpdGlvbihpbmRleCwgdHJ1ZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlKHBvc2l0aW9uLCBwcmV2ZW50TG9vcCkge1xuICAgIGlmICghU3BsaWRlMi5pcyhGQURFKSkge1xuICAgICAgdmFyIGRlc3RpbmF0aW9uID0gcHJldmVudExvb3AgPyBwb3NpdGlvbiA6IGxvb3AocG9zaXRpb24pO1xuICAgICAgc3R5bGUobGlzdCwgXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2xhdGVcIiArIHJlc29sdmUoXCJYXCIpICsgXCIoXCIgKyBkZXN0aW5hdGlvbiArIFwicHgpXCIpO1xuICAgICAgcG9zaXRpb24gIT09IGRlc3RpbmF0aW9uICYmIGVtaXQoRVZFTlRfU0hJRlRFRCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbG9vcChwb3NpdGlvbikge1xuICAgIGlmIChTcGxpZGUyLmlzKExPT1ApKSB7XG4gICAgICB2YXIgaW5kZXggPSB0b0luZGV4KHBvc2l0aW9uKTtcbiAgICAgIHZhciBleGNlZWRlZE1heCA9IGluZGV4ID4gQ29tcG9uZW50czIuQ29udHJvbGxlci5nZXRFbmQoKTtcbiAgICAgIHZhciBleGNlZWRlZE1pbiA9IGluZGV4IDwgMDtcblxuICAgICAgaWYgKGV4Y2VlZGVkTWluIHx8IGV4Y2VlZGVkTWF4KSB7XG4gICAgICAgIHBvc2l0aW9uID0gc2hpZnQocG9zaXRpb24sIGV4Y2VlZGVkTWF4KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH1cblxuICBmdW5jdGlvbiBzaGlmdChwb3NpdGlvbiwgYmFja3dhcmRzKSB7XG4gICAgdmFyIGV4Y2VzcyA9IHBvc2l0aW9uIC0gZ2V0TGltaXQoYmFja3dhcmRzKTtcbiAgICB2YXIgc2l6ZSA9IHNsaWRlclNpemUoKTtcbiAgICBwb3NpdGlvbiAtPSBvcmllbnQoc2l6ZSAqIChjZWlsKGFicyhleGNlc3MpIC8gc2l6ZSkgfHwgMSkpICogKGJhY2t3YXJkcyA/IDEgOiAtMSk7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIHRyYW5zbGF0ZShnZXRQb3NpdGlvbigpKTtcbiAgICBUcmFuc2l0aW9uLmNhbmNlbCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9JbmRleChwb3NpdGlvbikge1xuICAgIHZhciBTbGlkZXMgPSBDb21wb25lbnRzMi5TbGlkZXMuZ2V0KCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgbWluRGlzdGFuY2UgPSBJbmZpbml0eTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgU2xpZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2xpZGVJbmRleCA9IFNsaWRlc1tpXS5pbmRleDtcbiAgICAgIHZhciBkaXN0YW5jZSA9IGFicyh0b1Bvc2l0aW9uKHNsaWRlSW5kZXgsIHRydWUpIC0gcG9zaXRpb24pO1xuXG4gICAgICBpZiAoZGlzdGFuY2UgPD0gbWluRGlzdGFuY2UpIHtcbiAgICAgICAgbWluRGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgaW5kZXggPSBzbGlkZUluZGV4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgZnVuY3Rpb24gdG9Qb3NpdGlvbihpbmRleCwgdHJpbW1pbmcpIHtcbiAgICB2YXIgcG9zaXRpb24gPSBvcmllbnQodG90YWxTaXplKGluZGV4IC0gMSkgLSBvZmZzZXQoaW5kZXgpKTtcbiAgICByZXR1cm4gdHJpbW1pbmcgPyB0cmltKHBvc2l0aW9uKSA6IHBvc2l0aW9uO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UG9zaXRpb24oKSB7XG4gICAgdmFyIGxlZnQgPSByZXNvbHZlKFwibGVmdFwiKTtcbiAgICByZXR1cm4gcmVjdChsaXN0KVtsZWZ0XSAtIHJlY3QodHJhY2spW2xlZnRdICsgb3JpZW50KGdldFBhZGRpbmcoZmFsc2UpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyaW0ocG9zaXRpb24pIHtcbiAgICBpZiAob3B0aW9ucy50cmltU3BhY2UgJiYgU3BsaWRlMi5pcyhTTElERSkpIHtcbiAgICAgIHBvc2l0aW9uID0gY2xhbXAocG9zaXRpb24sIDAsIG9yaWVudChzbGlkZXJTaXplKCkgLSBsaXN0U2l6ZSgpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9XG5cbiAgZnVuY3Rpb24gb2Zmc2V0KGluZGV4KSB7XG4gICAgdmFyIGZvY3VzID0gb3B0aW9ucy5mb2N1cztcbiAgICByZXR1cm4gZm9jdXMgPT09IFwiY2VudGVyXCIgPyAobGlzdFNpemUoKSAtIHNsaWRlU2l6ZShpbmRleCwgdHJ1ZSkpIC8gMiA6ICtmb2N1cyAqIHNsaWRlU2l6ZShpbmRleCkgfHwgMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldExpbWl0KG1heCkge1xuICAgIHJldHVybiB0b1Bvc2l0aW9uKG1heCA/IENvbXBvbmVudHMyLkNvbnRyb2xsZXIuZ2V0RW5kKCkgOiAwLCAhIW9wdGlvbnMudHJpbVNwYWNlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhblNoaWZ0KGJhY2t3YXJkcykge1xuICAgIHZhciBzaGlmdGVkID0gb3JpZW50KHNoaWZ0KGdldFBvc2l0aW9uKCksIGJhY2t3YXJkcykpO1xuICAgIHJldHVybiBiYWNrd2FyZHMgPyBzaGlmdGVkID49IDAgOiBzaGlmdGVkIDw9IGxpc3RbcmVzb2x2ZShcInNjcm9sbFdpZHRoXCIpXSAtIHJlY3QodHJhY2spW3Jlc29sdmUoXCJ3aWR0aFwiKV07XG4gIH1cblxuICBmdW5jdGlvbiBleGNlZWRlZExpbWl0KG1heCwgcG9zaXRpb24pIHtcbiAgICBwb3NpdGlvbiA9IGlzVW5kZWZpbmVkKHBvc2l0aW9uKSA/IGdldFBvc2l0aW9uKCkgOiBwb3NpdGlvbjtcbiAgICB2YXIgZXhjZWVkZWRNaW4gPSBtYXggIT09IHRydWUgJiYgb3JpZW50KHBvc2l0aW9uKSA8IG9yaWVudChnZXRMaW1pdChmYWxzZSkpO1xuICAgIHZhciBleGNlZWRlZE1heCA9IG1heCAhPT0gZmFsc2UgJiYgb3JpZW50KHBvc2l0aW9uKSA+IG9yaWVudChnZXRMaW1pdCh0cnVlKSk7XG4gICAgcmV0dXJuIGV4Y2VlZGVkTWluIHx8IGV4Y2VlZGVkTWF4O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudDogbW91bnQsXG4gICAgbW92ZTogbW92ZSxcbiAgICBqdW1wOiBqdW1wLFxuICAgIHRyYW5zbGF0ZTogdHJhbnNsYXRlLFxuICAgIHNoaWZ0OiBzaGlmdCxcbiAgICBjYW5jZWw6IGNhbmNlbCxcbiAgICB0b0luZGV4OiB0b0luZGV4LFxuICAgIHRvUG9zaXRpb246IHRvUG9zaXRpb24sXG4gICAgZ2V0UG9zaXRpb246IGdldFBvc2l0aW9uLFxuICAgIGdldExpbWl0OiBnZXRMaW1pdCxcbiAgICBleGNlZWRlZExpbWl0OiBleGNlZWRlZExpbWl0LFxuICAgIHJlcG9zaXRpb246IHJlcG9zaXRpb25cbiAgfTtcbn1cblxuZnVuY3Rpb24gQ29udHJvbGxlcihTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgX0V2ZW50SW50ZXJmYWNlNiA9IEV2ZW50SW50ZXJmYWNlKFNwbGlkZTIpLFxuICAgICAgb24gPSBfRXZlbnRJbnRlcmZhY2U2Lm9uO1xuXG4gIHZhciBNb3ZlID0gQ29tcG9uZW50czIuTW92ZTtcbiAgdmFyIGdldFBvc2l0aW9uID0gTW92ZS5nZXRQb3NpdGlvbixcbiAgICAgIGdldExpbWl0ID0gTW92ZS5nZXRMaW1pdCxcbiAgICAgIHRvUG9zaXRpb24gPSBNb3ZlLnRvUG9zaXRpb247XG4gIHZhciBfQ29tcG9uZW50czIkU2xpZGVzID0gQ29tcG9uZW50czIuU2xpZGVzLFxuICAgICAgaXNFbm91Z2ggPSBfQ29tcG9uZW50czIkU2xpZGVzLmlzRW5vdWdoLFxuICAgICAgZ2V0TGVuZ3RoID0gX0NvbXBvbmVudHMyJFNsaWRlcy5nZXRMZW5ndGg7XG4gIHZhciBpc0xvb3AgPSBTcGxpZGUyLmlzKExPT1ApO1xuICB2YXIgaXNTbGlkZSA9IFNwbGlkZTIuaXMoU0xJREUpO1xuICB2YXIgZ2V0TmV4dCA9IGFwcGx5KGdldEFkamFjZW50LCBmYWxzZSk7XG4gIHZhciBnZXRQcmV2ID0gYXBwbHkoZ2V0QWRqYWNlbnQsIHRydWUpO1xuICB2YXIgY3VyckluZGV4ID0gb3B0aW9ucy5zdGFydCB8fCAwO1xuICB2YXIgcHJldkluZGV4ID0gY3VyckluZGV4O1xuICB2YXIgc2xpZGVDb3VudDtcbiAgdmFyIHBlck1vdmU7XG4gIHZhciBwZXJQYWdlO1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIGluaXQoKTtcbiAgICBvbihbRVZFTlRfVVBEQVRFRCwgRVZFTlRfUkVGUkVTSF0sIGluaXQpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBzbGlkZUNvdW50ID0gZ2V0TGVuZ3RoKHRydWUpO1xuICAgIHBlck1vdmUgPSBvcHRpb25zLnBlck1vdmU7XG4gICAgcGVyUGFnZSA9IG9wdGlvbnMucGVyUGFnZTtcbiAgICB2YXIgaW5kZXggPSBjbGFtcChjdXJySW5kZXgsIDAsIHNsaWRlQ291bnQgLSAxKTtcblxuICAgIGlmIChpbmRleCAhPT0gY3VyckluZGV4KSB7XG4gICAgICBjdXJySW5kZXggPSBpbmRleDtcbiAgICAgIE1vdmUucmVwb3NpdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdvKGNvbnRyb2wsIGFsbG93U2FtZUluZGV4LCBjYWxsYmFjaykge1xuICAgIGlmICghaXNCdXN5KCkpIHtcbiAgICAgIHZhciBkZXN0ID0gcGFyc2UoY29udHJvbCk7XG4gICAgICB2YXIgaW5kZXggPSBsb29wKGRlc3QpO1xuXG4gICAgICBpZiAoaW5kZXggPiAtMSAmJiAoYWxsb3dTYW1lSW5kZXggfHwgaW5kZXggIT09IGN1cnJJbmRleCkpIHtcbiAgICAgICAgc2V0SW5kZXgoaW5kZXgpO1xuICAgICAgICBNb3ZlLm1vdmUoZGVzdCwgaW5kZXgsIHByZXZJbmRleCwgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNjcm9sbChkZXN0aW5hdGlvbiwgZHVyYXRpb24sIHNuYXAsIGNhbGxiYWNrKSB7XG4gICAgQ29tcG9uZW50czIuU2Nyb2xsLnNjcm9sbChkZXN0aW5hdGlvbiwgZHVyYXRpb24sIHNuYXAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldEluZGV4KGxvb3AoTW92ZS50b0luZGV4KGdldFBvc2l0aW9uKCkpKSk7XG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2UoY29udHJvbCkge1xuICAgIHZhciBpbmRleCA9IGN1cnJJbmRleDtcblxuICAgIGlmIChpc1N0cmluZyhjb250cm9sKSkge1xuICAgICAgdmFyIF9yZWYgPSBjb250cm9sLm1hdGNoKC8oWytcXC08Pl0pKFxcZCspPy8pIHx8IFtdLFxuICAgICAgICAgIGluZGljYXRvciA9IF9yZWZbMV0sXG4gICAgICAgICAgbnVtYmVyID0gX3JlZlsyXTtcblxuICAgICAgaWYgKGluZGljYXRvciA9PT0gXCIrXCIgfHwgaW5kaWNhdG9yID09PSBcIi1cIikge1xuICAgICAgICBpbmRleCA9IGNvbXB1dGVEZXN0SW5kZXgoY3VyckluZGV4ICsgKyhcIlwiICsgaW5kaWNhdG9yICsgKCtudW1iZXIgfHwgMSkpLCBjdXJySW5kZXgpO1xuICAgICAgfSBlbHNlIGlmIChpbmRpY2F0b3IgPT09IFwiPlwiKSB7XG4gICAgICAgIGluZGV4ID0gbnVtYmVyID8gdG9JbmRleCgrbnVtYmVyKSA6IGdldE5leHQodHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGluZGljYXRvciA9PT0gXCI8XCIpIHtcbiAgICAgICAgaW5kZXggPSBnZXRQcmV2KHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpbmRleCA9IGlzTG9vcCA/IGNvbnRyb2wgOiBjbGFtcChjb250cm9sLCAwLCBnZXRFbmQoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QWRqYWNlbnQocHJldiwgZGVzdGluYXRpb24pIHtcbiAgICB2YXIgbnVtYmVyID0gcGVyTW92ZSB8fCAoaGFzRm9jdXMoKSA/IDEgOiBwZXJQYWdlKTtcbiAgICB2YXIgZGVzdCA9IGNvbXB1dGVEZXN0SW5kZXgoY3VyckluZGV4ICsgbnVtYmVyICogKHByZXYgPyAtMSA6IDEpLCBjdXJySW5kZXgsICEocGVyTW92ZSB8fCBoYXNGb2N1cygpKSk7XG5cbiAgICBpZiAoZGVzdCA9PT0gLTEgJiYgaXNTbGlkZSkge1xuICAgICAgaWYgKCFhcHByb3hpbWF0ZWx5RXF1YWwoZ2V0UG9zaXRpb24oKSwgZ2V0TGltaXQoIXByZXYpLCAxKSkge1xuICAgICAgICByZXR1cm4gcHJldiA/IDAgOiBnZXRFbmQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVzdGluYXRpb24gPyBkZXN0IDogbG9vcChkZXN0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXB1dGVEZXN0SW5kZXgoZGVzdCwgZnJvbSwgc25hcFBhZ2UpIHtcbiAgICBpZiAoaXNFbm91Z2goKSkge1xuICAgICAgdmFyIGVuZCA9IGdldEVuZCgpO1xuICAgICAgdmFyIGluZGV4ID0gY29tcHV0ZU1vdmFibGVEZXN0SW5kZXgoZGVzdCk7XG5cbiAgICAgIGlmIChpbmRleCAhPT0gZGVzdCkge1xuICAgICAgICBmcm9tID0gZGVzdDtcbiAgICAgICAgZGVzdCA9IGluZGV4O1xuICAgICAgICBzbmFwUGFnZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGVzdCA8IDAgfHwgZGVzdCA+IGVuZCkge1xuICAgICAgICBpZiAoIXBlck1vdmUgJiYgKGJldHdlZW4oMCwgZGVzdCwgZnJvbSwgdHJ1ZSkgfHwgYmV0d2VlbihlbmQsIGZyb20sIGRlc3QsIHRydWUpKSkge1xuICAgICAgICAgIGRlc3QgPSB0b0luZGV4KHRvUGFnZShkZXN0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGlzTG9vcCkge1xuICAgICAgICAgICAgZGVzdCA9IHNuYXBQYWdlID8gZGVzdCA8IDAgPyAtKHNsaWRlQ291bnQgJSBwZXJQYWdlIHx8IHBlclBhZ2UpIDogc2xpZGVDb3VudCA6IGRlc3Q7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnJld2luZCkge1xuICAgICAgICAgICAgZGVzdCA9IGRlc3QgPCAwID8gZW5kIDogMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVzdCA9IC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNuYXBQYWdlICYmIGRlc3QgIT09IGZyb20pIHtcbiAgICAgICAgICBkZXN0ID0gdG9JbmRleCh0b1BhZ2UoZnJvbSkgKyAoZGVzdCA8IGZyb20gPyAtMSA6IDEpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0ID0gLTE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlc3Q7XG4gIH1cblxuICBmdW5jdGlvbiBjb21wdXRlTW92YWJsZURlc3RJbmRleChkZXN0KSB7XG4gICAgaWYgKGlzU2xpZGUgJiYgb3B0aW9ucy50cmltU3BhY2UgPT09IFwibW92ZVwiICYmIGRlc3QgIT09IGN1cnJJbmRleCkge1xuICAgICAgdmFyIHBvc2l0aW9uID0gZ2V0UG9zaXRpb24oKTtcblxuICAgICAgd2hpbGUgKHBvc2l0aW9uID09PSB0b1Bvc2l0aW9uKGRlc3QsIHRydWUpICYmIGJldHdlZW4oZGVzdCwgMCwgU3BsaWRlMi5sZW5ndGggLSAxLCAhb3B0aW9ucy5yZXdpbmQpKSB7XG4gICAgICAgIGRlc3QgPCBjdXJySW5kZXggPyAtLWRlc3QgOiArK2Rlc3Q7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlc3Q7XG4gIH1cblxuICBmdW5jdGlvbiBsb29wKGluZGV4KSB7XG4gICAgcmV0dXJuIGlzTG9vcCA/IChpbmRleCArIHNsaWRlQ291bnQpICUgc2xpZGVDb3VudCB8fCAwIDogaW5kZXg7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRFbmQoKSB7XG4gICAgcmV0dXJuIG1heChzbGlkZUNvdW50IC0gKGhhc0ZvY3VzKCkgfHwgaXNMb29wICYmIHBlck1vdmUgPyAxIDogcGVyUGFnZSksIDApO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9JbmRleChwYWdlKSB7XG4gICAgcmV0dXJuIGNsYW1wKGhhc0ZvY3VzKCkgPyBwYWdlIDogcGVyUGFnZSAqIHBhZ2UsIDAsIGdldEVuZCgpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvUGFnZShpbmRleCkge1xuICAgIHJldHVybiBoYXNGb2N1cygpID8gaW5kZXggOiBmbG9vcigoaW5kZXggPj0gZ2V0RW5kKCkgPyBzbGlkZUNvdW50IC0gMSA6IGluZGV4KSAvIHBlclBhZ2UpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9EZXN0KGRlc3RpbmF0aW9uKSB7XG4gICAgdmFyIGNsb3Nlc3QgPSBNb3ZlLnRvSW5kZXgoZGVzdGluYXRpb24pO1xuICAgIHJldHVybiBpc1NsaWRlID8gY2xhbXAoY2xvc2VzdCwgMCwgZ2V0RW5kKCkpIDogY2xvc2VzdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldEluZGV4KGluZGV4KSB7XG4gICAgaWYgKGluZGV4ICE9PSBjdXJySW5kZXgpIHtcbiAgICAgIHByZXZJbmRleCA9IGN1cnJJbmRleDtcbiAgICAgIGN1cnJJbmRleCA9IGluZGV4O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEluZGV4KHByZXYpIHtcbiAgICByZXR1cm4gcHJldiA/IHByZXZJbmRleCA6IGN1cnJJbmRleDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc0ZvY3VzKCkge1xuICAgIHJldHVybiAhaXNVbmRlZmluZWQob3B0aW9ucy5mb2N1cykgfHwgb3B0aW9ucy5pc05hdmlnYXRpb247XG4gIH1cblxuICBmdW5jdGlvbiBpc0J1c3koKSB7XG4gICAgcmV0dXJuIFNwbGlkZTIuc3RhdGUuaXMoW01PVklORywgU0NST0xMSU5HXSkgJiYgISFvcHRpb25zLndhaXRGb3JUcmFuc2l0aW9uO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudDogbW91bnQsXG4gICAgZ286IGdvLFxuICAgIHNjcm9sbDogc2Nyb2xsLFxuICAgIGdldE5leHQ6IGdldE5leHQsXG4gICAgZ2V0UHJldjogZ2V0UHJldixcbiAgICBnZXRBZGphY2VudDogZ2V0QWRqYWNlbnQsXG4gICAgZ2V0RW5kOiBnZXRFbmQsXG4gICAgc2V0SW5kZXg6IHNldEluZGV4LFxuICAgIGdldEluZGV4OiBnZXRJbmRleCxcbiAgICB0b0luZGV4OiB0b0luZGV4LFxuICAgIHRvUGFnZTogdG9QYWdlLFxuICAgIHRvRGVzdDogdG9EZXN0LFxuICAgIGhhc0ZvY3VzOiBoYXNGb2N1cyxcbiAgICBpc0J1c3k6IGlzQnVzeVxuICB9O1xufVxuXG52YXIgWE1MX05BTUVfU1BBQ0UgPSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI7XG52YXIgUEFUSCA9IFwibTE1LjUgMC45MzItNC4zIDQuMzggMTQuNSAxNC42LTE0LjUgMTQuNSA0LjMgNC40IDE0LjYtMTQuNiA0LjQtNC4zLTQuNC00LjQtMTQuNi0xNC42elwiO1xudmFyIFNJWkUgPSA0MDtcblxuZnVuY3Rpb24gQXJyb3dzKFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIHZhciBldmVudCA9IEV2ZW50SW50ZXJmYWNlKFNwbGlkZTIpO1xuICB2YXIgb24gPSBldmVudC5vbixcbiAgICAgIGJpbmQgPSBldmVudC5iaW5kLFxuICAgICAgZW1pdCA9IGV2ZW50LmVtaXQ7XG4gIHZhciBjbGFzc2VzID0gb3B0aW9ucy5jbGFzc2VzLFxuICAgICAgaTE4biA9IG9wdGlvbnMuaTE4bjtcbiAgdmFyIEVsZW1lbnRzID0gQ29tcG9uZW50czIuRWxlbWVudHMsXG4gICAgICBDb250cm9sbGVyID0gQ29tcG9uZW50czIuQ29udHJvbGxlcjtcbiAgdmFyIHVzZXJBcnJvd3MgPSBFbGVtZW50cy5hcnJvd3MsXG4gICAgICB0cmFjayA9IEVsZW1lbnRzLnRyYWNrO1xuICB2YXIgd3JhcHBlciA9IHVzZXJBcnJvd3M7XG4gIHZhciBwcmV2ID0gRWxlbWVudHMucHJldjtcbiAgdmFyIG5leHQgPSBFbGVtZW50cy5uZXh0O1xuICB2YXIgY3JlYXRlZDtcbiAgdmFyIHdyYXBwZXJDbGFzc2VzO1xuICB2YXIgYXJyb3dzID0ge307XG5cbiAgZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgaW5pdCgpO1xuICAgIG9uKEVWRU5UX1VQREFURUQsIHJlbW91bnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3VudCgpIHtcbiAgICBkZXN0cm95KCk7XG4gICAgbW91bnQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgdmFyIGVuYWJsZWQgPSBvcHRpb25zLmFycm93cztcblxuICAgIGlmIChlbmFibGVkICYmICEocHJldiAmJiBuZXh0KSkge1xuICAgICAgY3JlYXRlQXJyb3dzKCk7XG4gICAgfVxuXG4gICAgaWYgKHByZXYgJiYgbmV4dCkge1xuICAgICAgYXNzaWduKGFycm93cywge1xuICAgICAgICBwcmV2OiBwcmV2LFxuICAgICAgICBuZXh0OiBuZXh0XG4gICAgICB9KTtcbiAgICAgIGRpc3BsYXkod3JhcHBlciwgZW5hYmxlZCA/IFwiXCIgOiBcIm5vbmVcIik7XG4gICAgICBhZGRDbGFzcyh3cmFwcGVyLCB3cmFwcGVyQ2xhc3NlcyA9IENMQVNTX0FSUk9XUyArIFwiLS1cIiArIG9wdGlvbnMuZGlyZWN0aW9uKTtcblxuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgbGlzdGVuKCk7XG4gICAgICAgIHVwZGF0ZSgpO1xuICAgICAgICBzZXRBdHRyaWJ1dGUoW3ByZXYsIG5leHRdLCBBUklBX0NPTlRST0xTLCB0cmFjay5pZCk7XG4gICAgICAgIGVtaXQoRVZFTlRfQVJST1dTX01PVU5URUQsIHByZXYsIG5leHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgZXZlbnQuZGVzdHJveSgpO1xuICAgIHJlbW92ZUNsYXNzKHdyYXBwZXIsIHdyYXBwZXJDbGFzc2VzKTtcblxuICAgIGlmIChjcmVhdGVkKSB7XG4gICAgICByZW1vdmUodXNlckFycm93cyA/IFtwcmV2LCBuZXh0XSA6IHdyYXBwZXIpO1xuICAgICAgcHJldiA9IG5leHQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZW1vdmVBdHRyaWJ1dGUoW3ByZXYsIG5leHRdLCBBTExfQVRUUklCVVRFUyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbGlzdGVuKCkge1xuICAgIG9uKFtFVkVOVF9NT1ZFRCwgRVZFTlRfUkVGUkVTSCwgRVZFTlRfU0NST0xMRURdLCB1cGRhdGUpO1xuICAgIGJpbmQobmV4dCwgXCJjbGlja1wiLCBhcHBseShnbywgXCI+XCIpKTtcbiAgICBiaW5kKHByZXYsIFwiY2xpY2tcIiwgYXBwbHkoZ28sIFwiPFwiKSk7XG4gIH1cblxuICBmdW5jdGlvbiBnbyhjb250cm9sKSB7XG4gICAgQ29udHJvbGxlci5nbyhjb250cm9sLCB0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUFycm93cygpIHtcbiAgICB3cmFwcGVyID0gdXNlckFycm93cyB8fCBjcmVhdGUoXCJkaXZcIiwgY2xhc3Nlcy5hcnJvd3MpO1xuICAgIHByZXYgPSBjcmVhdGVBcnJvdyh0cnVlKTtcbiAgICBuZXh0ID0gY3JlYXRlQXJyb3coZmFsc2UpO1xuICAgIGNyZWF0ZWQgPSB0cnVlO1xuICAgIGFwcGVuZCh3cmFwcGVyLCBbcHJldiwgbmV4dF0pO1xuICAgICF1c2VyQXJyb3dzICYmIGJlZm9yZSh3cmFwcGVyLCB0cmFjayk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBcnJvdyhwcmV2Mikge1xuICAgIHZhciBhcnJvdyA9IFwiPGJ1dHRvbiBjbGFzcz1cXFwiXCIgKyBjbGFzc2VzLmFycm93ICsgXCIgXCIgKyAocHJldjIgPyBjbGFzc2VzLnByZXYgOiBjbGFzc2VzLm5leHQpICsgXCJcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCI+PHN2ZyB4bWxucz1cXFwiXCIgKyBYTUxfTkFNRV9TUEFDRSArIFwiXFxcIiB2aWV3Qm94PVxcXCIwIDAgXCIgKyBTSVpFICsgXCIgXCIgKyBTSVpFICsgXCJcXFwiIHdpZHRoPVxcXCJcIiArIFNJWkUgKyBcIlxcXCIgaGVpZ2h0PVxcXCJcIiArIFNJWkUgKyBcIlxcXCIgZm9jdXNhYmxlPVxcXCJmYWxzZVxcXCI+PHBhdGggZD1cXFwiXCIgKyAob3B0aW9ucy5hcnJvd1BhdGggfHwgUEFUSCkgKyBcIlxcXCIgLz5cIjtcbiAgICByZXR1cm4gcGFyc2VIdG1sKGFycm93KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICB2YXIgaW5kZXggPSBTcGxpZGUyLmluZGV4O1xuICAgIHZhciBwcmV2SW5kZXggPSBDb250cm9sbGVyLmdldFByZXYoKTtcbiAgICB2YXIgbmV4dEluZGV4ID0gQ29udHJvbGxlci5nZXROZXh0KCk7XG4gICAgdmFyIHByZXZMYWJlbCA9IHByZXZJbmRleCA+IC0xICYmIGluZGV4IDwgcHJldkluZGV4ID8gaTE4bi5sYXN0IDogaTE4bi5wcmV2O1xuICAgIHZhciBuZXh0TGFiZWwgPSBuZXh0SW5kZXggPiAtMSAmJiBpbmRleCA+IG5leHRJbmRleCA/IGkxOG4uZmlyc3QgOiBpMThuLm5leHQ7XG4gICAgcHJldi5kaXNhYmxlZCA9IHByZXZJbmRleCA8IDA7XG4gICAgbmV4dC5kaXNhYmxlZCA9IG5leHRJbmRleCA8IDA7XG4gICAgc2V0QXR0cmlidXRlKHByZXYsIEFSSUFfTEFCRUwsIHByZXZMYWJlbCk7XG4gICAgc2V0QXR0cmlidXRlKG5leHQsIEFSSUFfTEFCRUwsIG5leHRMYWJlbCk7XG4gICAgZW1pdChFVkVOVF9BUlJPV1NfVVBEQVRFRCwgcHJldiwgbmV4dCwgcHJldkluZGV4LCBuZXh0SW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhcnJvd3M6IGFycm93cyxcbiAgICBtb3VudDogbW91bnQsXG4gICAgZGVzdHJveTogZGVzdHJveVxuICB9O1xufVxuXG52YXIgSU5URVJWQUxfREFUQV9BVFRSSUJVVEUgPSBEQVRBX0FUVFJJQlVURSArIFwiLWludGVydmFsXCI7XG5cbmZ1bmN0aW9uIEF1dG9wbGF5KFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIHZhciBfRXZlbnRJbnRlcmZhY2U3ID0gRXZlbnRJbnRlcmZhY2UoU3BsaWRlMiksXG4gICAgICBvbiA9IF9FdmVudEludGVyZmFjZTcub24sXG4gICAgICBiaW5kID0gX0V2ZW50SW50ZXJmYWNlNy5iaW5kLFxuICAgICAgZW1pdCA9IF9FdmVudEludGVyZmFjZTcuZW1pdDtcblxuICB2YXIgaW50ZXJ2YWwgPSBSZXF1ZXN0SW50ZXJ2YWwob3B0aW9ucy5pbnRlcnZhbCwgU3BsaWRlMi5nby5iaW5kKFNwbGlkZTIsIFwiPlwiKSwgb25BbmltYXRpb25GcmFtZSk7XG4gIHZhciBpc1BhdXNlZCA9IGludGVydmFsLmlzUGF1c2VkO1xuICB2YXIgRWxlbWVudHMgPSBDb21wb25lbnRzMi5FbGVtZW50cyxcbiAgICAgIF9Db21wb25lbnRzMiRFbGVtZW50czQgPSBDb21wb25lbnRzMi5FbGVtZW50cyxcbiAgICAgIHJvb3QgPSBfQ29tcG9uZW50czIkRWxlbWVudHM0LnJvb3QsXG4gICAgICB0b2dnbGUgPSBfQ29tcG9uZW50czIkRWxlbWVudHM0LnRvZ2dsZTtcbiAgdmFyIGF1dG9wbGF5ID0gb3B0aW9ucy5hdXRvcGxheTtcbiAgdmFyIGhvdmVyZWQ7XG4gIHZhciBmb2N1c2VkO1xuICB2YXIgc3RvcHBlZCA9IGF1dG9wbGF5ID09PSBcInBhdXNlXCI7XG5cbiAgZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgaWYgKGF1dG9wbGF5KSB7XG4gICAgICBsaXN0ZW4oKTtcbiAgICAgIHRvZ2dsZSAmJiBzZXRBdHRyaWJ1dGUodG9nZ2xlLCBBUklBX0NPTlRST0xTLCBFbGVtZW50cy50cmFjay5pZCk7XG4gICAgICBzdG9wcGVkIHx8IHBsYXkoKTtcbiAgICAgIHVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxpc3RlbigpIHtcbiAgICBpZiAob3B0aW9ucy5wYXVzZU9uSG92ZXIpIHtcbiAgICAgIGJpbmQocm9vdCwgXCJtb3VzZWVudGVyIG1vdXNlbGVhdmVcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaG92ZXJlZCA9IGUudHlwZSA9PT0gXCJtb3VzZWVudGVyXCI7XG4gICAgICAgIGF1dG9Ub2dnbGUoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnBhdXNlT25Gb2N1cykge1xuICAgICAgYmluZChyb290LCBcImZvY3VzaW4gZm9jdXNvdXRcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZm9jdXNlZCA9IGUudHlwZSA9PT0gXCJmb2N1c2luXCI7XG4gICAgICAgIGF1dG9Ub2dnbGUoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0b2dnbGUpIHtcbiAgICAgIGJpbmQodG9nZ2xlLCBcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc3RvcHBlZCA/IHBsYXkoKSA6IHBhdXNlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgb24oW0VWRU5UX01PVkUsIEVWRU5UX1NDUk9MTCwgRVZFTlRfUkVGUkVTSF0sIGludGVydmFsLnJld2luZCk7XG4gICAgb24oRVZFTlRfTU9WRSwgb25Nb3ZlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBsYXkoKSB7XG4gICAgaWYgKGlzUGF1c2VkKCkgJiYgQ29tcG9uZW50czIuU2xpZGVzLmlzRW5vdWdoKCkpIHtcbiAgICAgIGludGVydmFsLnN0YXJ0KCFvcHRpb25zLnJlc2V0UHJvZ3Jlc3MpO1xuICAgICAgZm9jdXNlZCA9IGhvdmVyZWQgPSBzdG9wcGVkID0gZmFsc2U7XG4gICAgICB1cGRhdGUoKTtcbiAgICAgIGVtaXQoRVZFTlRfQVVUT1BMQVlfUExBWSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGF1c2Uoc3RvcCkge1xuICAgIGlmIChzdG9wID09PSB2b2lkIDApIHtcbiAgICAgIHN0b3AgPSB0cnVlO1xuICAgIH1cblxuICAgIHN0b3BwZWQgPSAhIXN0b3A7XG4gICAgdXBkYXRlKCk7XG5cbiAgICBpZiAoIWlzUGF1c2VkKCkpIHtcbiAgICAgIGludGVydmFsLnBhdXNlKCk7XG4gICAgICBlbWl0KEVWRU5UX0FVVE9QTEFZX1BBVVNFKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhdXRvVG9nZ2xlKCkge1xuICAgIGlmICghc3RvcHBlZCkge1xuICAgICAgaG92ZXJlZCB8fCBmb2N1c2VkID8gcGF1c2UoZmFsc2UpIDogcGxheSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICBpZiAodG9nZ2xlKSB7XG4gICAgICB0b2dnbGVDbGFzcyh0b2dnbGUsIENMQVNTX0FDVElWRSwgIXN0b3BwZWQpO1xuICAgICAgc2V0QXR0cmlidXRlKHRvZ2dsZSwgQVJJQV9MQUJFTCwgb3B0aW9ucy5pMThuW3N0b3BwZWQgPyBcInBsYXlcIiA6IFwicGF1c2VcIl0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uQW5pbWF0aW9uRnJhbWUocmF0ZSkge1xuICAgIHZhciBiYXIgPSBFbGVtZW50cy5iYXI7XG4gICAgYmFyICYmIHN0eWxlKGJhciwgXCJ3aWR0aFwiLCByYXRlICogMTAwICsgXCIlXCIpO1xuICAgIGVtaXQoRVZFTlRfQVVUT1BMQVlfUExBWUlORywgcmF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBvbk1vdmUoaW5kZXgpIHtcbiAgICB2YXIgU2xpZGUgPSBDb21wb25lbnRzMi5TbGlkZXMuZ2V0QXQoaW5kZXgpO1xuICAgIGludGVydmFsLnNldChTbGlkZSAmJiArZ2V0QXR0cmlidXRlKFNsaWRlLnNsaWRlLCBJTlRFUlZBTF9EQVRBX0FUVFJJQlVURSkgfHwgb3B0aW9ucy5pbnRlcnZhbCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1vdW50OiBtb3VudCxcbiAgICBkZXN0cm95OiBpbnRlcnZhbC5jYW5jZWwsXG4gICAgcGxheTogcGxheSxcbiAgICBwYXVzZTogcGF1c2UsXG4gICAgaXNQYXVzZWQ6IGlzUGF1c2VkXG4gIH07XG59XG5cbmZ1bmN0aW9uIENvdmVyKFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIHZhciBfRXZlbnRJbnRlcmZhY2U4ID0gRXZlbnRJbnRlcmZhY2UoU3BsaWRlMiksXG4gICAgICBvbiA9IF9FdmVudEludGVyZmFjZTgub247XG5cbiAgZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgaWYgKG9wdGlvbnMuY292ZXIpIHtcbiAgICAgIG9uKEVWRU5UX0xBWllMT0FEX0xPQURFRCwgYXBwbHkodG9nZ2xlLCB0cnVlKSk7XG4gICAgICBvbihbRVZFTlRfTU9VTlRFRCwgRVZFTlRfVVBEQVRFRCwgRVZFTlRfUkVGUkVTSF0sIGFwcGx5KGNvdmVyLCB0cnVlKSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY292ZXIoY292ZXIyKSB7XG4gICAgQ29tcG9uZW50czIuU2xpZGVzLmZvckVhY2goZnVuY3Rpb24gKFNsaWRlKSB7XG4gICAgICB2YXIgaW1nID0gY2hpbGQoU2xpZGUuY29udGFpbmVyIHx8IFNsaWRlLnNsaWRlLCBcImltZ1wiKTtcblxuICAgICAgaWYgKGltZyAmJiBpbWcuc3JjKSB7XG4gICAgICAgIHRvZ2dsZShjb3ZlcjIsIGltZywgU2xpZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9nZ2xlKGNvdmVyMiwgaW1nLCBTbGlkZSkge1xuICAgIFNsaWRlLnN0eWxlKFwiYmFja2dyb3VuZFwiLCBjb3ZlcjIgPyBcImNlbnRlci9jb3ZlciBuby1yZXBlYXQgdXJsKFxcXCJcIiArIGltZy5zcmMgKyBcIlxcXCIpXCIgOiBcIlwiLCB0cnVlKTtcbiAgICBkaXNwbGF5KGltZywgY292ZXIyID8gXCJub25lXCIgOiBcIlwiKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbW91bnQ6IG1vdW50LFxuICAgIGRlc3Ryb3k6IGFwcGx5KGNvdmVyLCBmYWxzZSlcbiAgfTtcbn1cblxudmFyIEJPVU5DRV9ESUZGX1RIUkVTSE9MRCA9IDEwO1xudmFyIEJPVU5DRV9EVVJBVElPTiA9IDYwMDtcbnZhciBGUklDVElPTl9GQUNUT1IgPSAwLjY7XG52YXIgQkFTRV9WRUxPQ0lUWSA9IDEuNTtcbnZhciBNSU5fRFVSQVRJT04gPSA4MDA7XG5cbmZ1bmN0aW9uIFNjcm9sbChTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgX0V2ZW50SW50ZXJmYWNlOSA9IEV2ZW50SW50ZXJmYWNlKFNwbGlkZTIpLFxuICAgICAgb24gPSBfRXZlbnRJbnRlcmZhY2U5Lm9uLFxuICAgICAgZW1pdCA9IF9FdmVudEludGVyZmFjZTkuZW1pdDtcblxuICB2YXIgc2V0ID0gU3BsaWRlMi5zdGF0ZS5zZXQ7XG4gIHZhciBNb3ZlID0gQ29tcG9uZW50czIuTW92ZTtcbiAgdmFyIGdldFBvc2l0aW9uID0gTW92ZS5nZXRQb3NpdGlvbixcbiAgICAgIGdldExpbWl0ID0gTW92ZS5nZXRMaW1pdCxcbiAgICAgIGV4Y2VlZGVkTGltaXQgPSBNb3ZlLmV4Y2VlZGVkTGltaXQsXG4gICAgICB0cmFuc2xhdGUgPSBNb3ZlLnRyYW5zbGF0ZTtcbiAgdmFyIGludGVydmFsO1xuICB2YXIgY2FsbGJhY2s7XG4gIHZhciBmcmljdGlvbiA9IDE7XG5cbiAgZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgb24oRVZFTlRfTU9WRSwgY2xlYXIpO1xuICAgIG9uKFtFVkVOVF9VUERBVEVELCBFVkVOVF9SRUZSRVNIXSwgY2FuY2VsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjcm9sbChkZXN0aW5hdGlvbiwgZHVyYXRpb24sIHNuYXAsIG9uU2Nyb2xsZWQsIG5vQ29uc3RyYWluKSB7XG4gICAgdmFyIGZyb20gPSBnZXRQb3NpdGlvbigpO1xuICAgIGNsZWFyKCk7XG5cbiAgICBpZiAoc25hcCkge1xuICAgICAgdmFyIHNpemUgPSBDb21wb25lbnRzMi5MYXlvdXQuc2xpZGVyU2l6ZSgpO1xuICAgICAgdmFyIG9mZnNldCA9IHNpZ24oZGVzdGluYXRpb24pICogc2l6ZSAqIGZsb29yKGFicyhkZXN0aW5hdGlvbikgLyBzaXplKSB8fCAwO1xuICAgICAgZGVzdGluYXRpb24gPSBNb3ZlLnRvUG9zaXRpb24oQ29tcG9uZW50czIuQ29udHJvbGxlci50b0Rlc3QoZGVzdGluYXRpb24gJSBzaXplKSkgKyBvZmZzZXQ7XG4gICAgfVxuXG4gICAgdmFyIG5vRGlzdGFuY2UgPSBhcHByb3hpbWF0ZWx5RXF1YWwoZnJvbSwgZGVzdGluYXRpb24sIDEpO1xuICAgIGZyaWN0aW9uID0gMTtcbiAgICBkdXJhdGlvbiA9IG5vRGlzdGFuY2UgPyAwIDogZHVyYXRpb24gfHwgbWF4KGFicyhkZXN0aW5hdGlvbiAtIGZyb20pIC8gQkFTRV9WRUxPQ0lUWSwgTUlOX0RVUkFUSU9OKTtcbiAgICBjYWxsYmFjayA9IG9uU2Nyb2xsZWQ7XG4gICAgaW50ZXJ2YWwgPSBSZXF1ZXN0SW50ZXJ2YWwoZHVyYXRpb24sIG9uRW5kLCBhcHBseSh1cGRhdGUsIGZyb20sIGRlc3RpbmF0aW9uLCBub0NvbnN0cmFpbiksIDEpO1xuICAgIHNldChTQ1JPTExJTkcpO1xuICAgIGVtaXQoRVZFTlRfU0NST0xMKTtcbiAgICBpbnRlcnZhbC5zdGFydCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25FbmQoKSB7XG4gICAgc2V0KElETEUpO1xuICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgZW1pdChFVkVOVF9TQ1JPTExFRCk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGUoZnJvbSwgdG8sIG5vQ29uc3RyYWluLCByYXRlKSB7XG4gICAgdmFyIHBvc2l0aW9uID0gZ2V0UG9zaXRpb24oKTtcbiAgICB2YXIgdGFyZ2V0ID0gZnJvbSArICh0byAtIGZyb20pICogZWFzaW5nKHJhdGUpO1xuICAgIHZhciBkaWZmID0gKHRhcmdldCAtIHBvc2l0aW9uKSAqIGZyaWN0aW9uO1xuICAgIHRyYW5zbGF0ZShwb3NpdGlvbiArIGRpZmYpO1xuXG4gICAgaWYgKFNwbGlkZTIuaXMoU0xJREUpICYmICFub0NvbnN0cmFpbiAmJiBleGNlZWRlZExpbWl0KCkpIHtcbiAgICAgIGZyaWN0aW9uICo9IEZSSUNUSU9OX0ZBQ1RPUjtcblxuICAgICAgaWYgKGFicyhkaWZmKSA8IEJPVU5DRV9ESUZGX1RIUkVTSE9MRCkge1xuICAgICAgICBzY3JvbGwoZ2V0TGltaXQoZXhjZWVkZWRMaW1pdCh0cnVlKSksIEJPVU5DRV9EVVJBVElPTiwgZmFsc2UsIGNhbGxiYWNrLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICBpZiAoaW50ZXJ2YWwpIHtcbiAgICAgIGludGVydmFsLmNhbmNlbCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICBpZiAoaW50ZXJ2YWwgJiYgIWludGVydmFsLmlzUGF1c2VkKCkpIHtcbiAgICAgIGNsZWFyKCk7XG4gICAgICBvbkVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVhc2luZyh0KSB7XG4gICAgdmFyIGVhc2luZ0Z1bmMgPSBvcHRpb25zLmVhc2luZ0Z1bmM7XG4gICAgcmV0dXJuIGVhc2luZ0Z1bmMgPyBlYXNpbmdGdW5jKHQpIDogMSAtIE1hdGgucG93KDEgLSB0LCA0KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbW91bnQ6IG1vdW50LFxuICAgIGRlc3Ryb3k6IGNsZWFyLFxuICAgIHNjcm9sbDogc2Nyb2xsLFxuICAgIGNhbmNlbDogY2FuY2VsXG4gIH07XG59XG5cbnZhciBTQ1JPTExfTElTVEVORVJfT1BUSU9OUyA9IHtcbiAgcGFzc2l2ZTogZmFsc2UsXG4gIGNhcHR1cmU6IHRydWVcbn07XG5cbmZ1bmN0aW9uIERyYWcoU3BsaWRlMiwgQ29tcG9uZW50czIsIG9wdGlvbnMpIHtcbiAgdmFyIF9FdmVudEludGVyZmFjZTEwID0gRXZlbnRJbnRlcmZhY2UoU3BsaWRlMiksXG4gICAgICBvbiA9IF9FdmVudEludGVyZmFjZTEwLm9uLFxuICAgICAgZW1pdCA9IF9FdmVudEludGVyZmFjZTEwLmVtaXQsXG4gICAgICBiaW5kID0gX0V2ZW50SW50ZXJmYWNlMTAuYmluZCxcbiAgICAgIHVuYmluZCA9IF9FdmVudEludGVyZmFjZTEwLnVuYmluZDtcblxuICB2YXIgc3RhdGUgPSBTcGxpZGUyLnN0YXRlO1xuICB2YXIgTW92ZSA9IENvbXBvbmVudHMyLk1vdmUsXG4gICAgICBTY3JvbGwgPSBDb21wb25lbnRzMi5TY3JvbGwsXG4gICAgICBDb250cm9sbGVyID0gQ29tcG9uZW50czIuQ29udHJvbGxlcixcbiAgICAgIHRyYWNrID0gQ29tcG9uZW50czIuRWxlbWVudHMudHJhY2ssXG4gICAgICByZWR1Y2UgPSBDb21wb25lbnRzMi5NZWRpYS5yZWR1Y2U7XG4gIHZhciBfQ29tcG9uZW50czIkRGlyZWN0aW8yID0gQ29tcG9uZW50czIuRGlyZWN0aW9uLFxuICAgICAgcmVzb2x2ZSA9IF9Db21wb25lbnRzMiREaXJlY3RpbzIucmVzb2x2ZSxcbiAgICAgIG9yaWVudCA9IF9Db21wb25lbnRzMiREaXJlY3RpbzIub3JpZW50O1xuICB2YXIgZ2V0UG9zaXRpb24gPSBNb3ZlLmdldFBvc2l0aW9uLFxuICAgICAgZXhjZWVkZWRMaW1pdCA9IE1vdmUuZXhjZWVkZWRMaW1pdDtcbiAgdmFyIGJhc2VQb3NpdGlvbjtcbiAgdmFyIGJhc2VFdmVudDtcbiAgdmFyIHByZXZCYXNlRXZlbnQ7XG4gIHZhciBpc0ZyZWU7XG4gIHZhciBkcmFnZ2luZztcbiAgdmFyIGV4Y2VlZGVkID0gZmFsc2U7XG4gIHZhciBjbGlja1ByZXZlbnRlZDtcbiAgdmFyIGRpc2FibGVkO1xuICB2YXIgdGFyZ2V0O1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIGJpbmQodHJhY2ssIFBPSU5URVJfTU9WRV9FVkVOVFMsIG5vb3AsIFNDUk9MTF9MSVNURU5FUl9PUFRJT05TKTtcbiAgICBiaW5kKHRyYWNrLCBQT0lOVEVSX1VQX0VWRU5UUywgbm9vcCwgU0NST0xMX0xJU1RFTkVSX09QVElPTlMpO1xuICAgIGJpbmQodHJhY2ssIFBPSU5URVJfRE9XTl9FVkVOVFMsIG9uUG9pbnRlckRvd24sIFNDUk9MTF9MSVNURU5FUl9PUFRJT05TKTtcbiAgICBiaW5kKHRyYWNrLCBcImNsaWNrXCIsIG9uQ2xpY2ssIHtcbiAgICAgIGNhcHR1cmU6IHRydWVcbiAgICB9KTtcbiAgICBiaW5kKHRyYWNrLCBcImRyYWdzdGFydFwiLCBwcmV2ZW50KTtcbiAgICBvbihbRVZFTlRfTU9VTlRFRCwgRVZFTlRfVVBEQVRFRF0sIGluaXQpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICB2YXIgZHJhZyA9IG9wdGlvbnMuZHJhZztcbiAgICBkaXNhYmxlKCFkcmFnKTtcbiAgICBpc0ZyZWUgPSBkcmFnID09PSBcImZyZWVcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uUG9pbnRlckRvd24oZSkge1xuICAgIGNsaWNrUHJldmVudGVkID0gZmFsc2U7XG5cbiAgICBpZiAoIWRpc2FibGVkKSB7XG4gICAgICB2YXIgaXNUb3VjaCA9IGlzVG91Y2hFdmVudChlKTtcblxuICAgICAgaWYgKGlzRHJhZ2dhYmxlKGUudGFyZ2V0KSAmJiAoaXNUb3VjaCB8fCAhZS5idXR0b24pKSB7XG4gICAgICAgIGlmICghQ29udHJvbGxlci5pc0J1c3koKSkge1xuICAgICAgICAgIHRhcmdldCA9IGlzVG91Y2ggPyB0cmFjayA6IHdpbmRvdztcbiAgICAgICAgICBkcmFnZ2luZyA9IHN0YXRlLmlzKFtNT1ZJTkcsIFNDUk9MTElOR10pO1xuICAgICAgICAgIHByZXZCYXNlRXZlbnQgPSBudWxsO1xuICAgICAgICAgIGJpbmQodGFyZ2V0LCBQT0lOVEVSX01PVkVfRVZFTlRTLCBvblBvaW50ZXJNb3ZlLCBTQ1JPTExfTElTVEVORVJfT1BUSU9OUyk7XG4gICAgICAgICAgYmluZCh0YXJnZXQsIFBPSU5URVJfVVBfRVZFTlRTLCBvblBvaW50ZXJVcCwgU0NST0xMX0xJU1RFTkVSX09QVElPTlMpO1xuICAgICAgICAgIE1vdmUuY2FuY2VsKCk7XG4gICAgICAgICAgU2Nyb2xsLmNhbmNlbCgpO1xuICAgICAgICAgIHNhdmUoZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmVudChlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uUG9pbnRlck1vdmUoZSkge1xuICAgIGlmICghc3RhdGUuaXMoRFJBR0dJTkcpKSB7XG4gICAgICBzdGF0ZS5zZXQoRFJBR0dJTkcpO1xuICAgICAgZW1pdChFVkVOVF9EUkFHKTtcbiAgICB9XG5cbiAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICBpZiAoZHJhZ2dpbmcpIHtcbiAgICAgICAgTW92ZS50cmFuc2xhdGUoYmFzZVBvc2l0aW9uICsgY29uc3RyYWluKGRpZmZDb29yZChlKSkpO1xuICAgICAgICB2YXIgZXhwaXJlZCA9IGRpZmZUaW1lKGUpID4gTE9HX0lOVEVSVkFMO1xuICAgICAgICB2YXIgaGFzRXhjZWVkZWQgPSBleGNlZWRlZCAhPT0gKGV4Y2VlZGVkID0gZXhjZWVkZWRMaW1pdCgpKTtcblxuICAgICAgICBpZiAoZXhwaXJlZCB8fCBoYXNFeGNlZWRlZCkge1xuICAgICAgICAgIHNhdmUoZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjbGlja1ByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgIGVtaXQoRVZFTlRfRFJBR0dJTkcpO1xuICAgICAgICBwcmV2ZW50KGUpO1xuICAgICAgfSBlbHNlIGlmIChpc1NsaWRlckRpcmVjdGlvbihlKSkge1xuICAgICAgICBkcmFnZ2luZyA9IHNob3VsZFN0YXJ0KGUpO1xuICAgICAgICBwcmV2ZW50KGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uUG9pbnRlclVwKGUpIHtcbiAgICBpZiAoc3RhdGUuaXMoRFJBR0dJTkcpKSB7XG4gICAgICBzdGF0ZS5zZXQoSURMRSk7XG4gICAgICBlbWl0KEVWRU5UX0RSQUdHRUQpO1xuICAgIH1cblxuICAgIGlmIChkcmFnZ2luZykge1xuICAgICAgbW92ZShlKTtcbiAgICAgIHByZXZlbnQoZSk7XG4gICAgfVxuXG4gICAgdW5iaW5kKHRhcmdldCwgUE9JTlRFUl9NT1ZFX0VWRU5UUywgb25Qb2ludGVyTW92ZSk7XG4gICAgdW5iaW5kKHRhcmdldCwgUE9JTlRFUl9VUF9FVkVOVFMsIG9uUG9pbnRlclVwKTtcbiAgICBkcmFnZ2luZyA9IGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgaWYgKCFkaXNhYmxlZCAmJiBjbGlja1ByZXZlbnRlZCkge1xuICAgICAgcHJldmVudChlLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzYXZlKGUpIHtcbiAgICBwcmV2QmFzZUV2ZW50ID0gYmFzZUV2ZW50O1xuICAgIGJhc2VFdmVudCA9IGU7XG4gICAgYmFzZVBvc2l0aW9uID0gZ2V0UG9zaXRpb24oKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdmUoZSkge1xuICAgIHZhciB2ZWxvY2l0eSA9IGNvbXB1dGVWZWxvY2l0eShlKTtcbiAgICB2YXIgZGVzdGluYXRpb24gPSBjb21wdXRlRGVzdGluYXRpb24odmVsb2NpdHkpO1xuICAgIHZhciByZXdpbmQgPSBvcHRpb25zLnJld2luZCAmJiBvcHRpb25zLnJld2luZEJ5RHJhZztcbiAgICByZWR1Y2UoZmFsc2UpO1xuXG4gICAgaWYgKGlzRnJlZSkge1xuICAgICAgQ29udHJvbGxlci5zY3JvbGwoZGVzdGluYXRpb24sIDAsIG9wdGlvbnMuc25hcCk7XG4gICAgfSBlbHNlIGlmIChTcGxpZGUyLmlzKEZBREUpKSB7XG4gICAgICBDb250cm9sbGVyLmdvKG9yaWVudChzaWduKHZlbG9jaXR5KSkgPCAwID8gcmV3aW5kID8gXCI8XCIgOiBcIi1cIiA6IHJld2luZCA/IFwiPlwiIDogXCIrXCIpO1xuICAgIH0gZWxzZSBpZiAoU3BsaWRlMi5pcyhTTElERSkgJiYgZXhjZWVkZWQgJiYgcmV3aW5kKSB7XG4gICAgICBDb250cm9sbGVyLmdvKGV4Y2VlZGVkTGltaXQodHJ1ZSkgPyBcIj5cIiA6IFwiPFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgQ29udHJvbGxlci5nbyhDb250cm9sbGVyLnRvRGVzdChkZXN0aW5hdGlvbiksIHRydWUpO1xuICAgIH1cblxuICAgIHJlZHVjZSh0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3VsZFN0YXJ0KGUpIHtcbiAgICB2YXIgdGhyZXNob2xkcyA9IG9wdGlvbnMuZHJhZ01pblRocmVzaG9sZDtcbiAgICB2YXIgaXNPYmogPSBpc09iamVjdCh0aHJlc2hvbGRzKTtcbiAgICB2YXIgbW91c2UgPSBpc09iaiAmJiB0aHJlc2hvbGRzLm1vdXNlIHx8IDA7XG4gICAgdmFyIHRvdWNoID0gKGlzT2JqID8gdGhyZXNob2xkcy50b3VjaCA6ICt0aHJlc2hvbGRzKSB8fCAxMDtcbiAgICByZXR1cm4gYWJzKGRpZmZDb29yZChlKSkgPiAoaXNUb3VjaEV2ZW50KGUpID8gdG91Y2ggOiBtb3VzZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc1NsaWRlckRpcmVjdGlvbihlKSB7XG4gICAgcmV0dXJuIGFicyhkaWZmQ29vcmQoZSkpID4gYWJzKGRpZmZDb29yZChlLCB0cnVlKSk7XG4gIH1cblxuICBmdW5jdGlvbiBjb21wdXRlVmVsb2NpdHkoZSkge1xuICAgIGlmIChTcGxpZGUyLmlzKExPT1ApIHx8ICFleGNlZWRlZCkge1xuICAgICAgdmFyIHRpbWUgPSBkaWZmVGltZShlKTtcblxuICAgICAgaWYgKHRpbWUgJiYgdGltZSA8IExPR19JTlRFUlZBTCkge1xuICAgICAgICByZXR1cm4gZGlmZkNvb3JkKGUpIC8gdGltZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXB1dGVEZXN0aW5hdGlvbih2ZWxvY2l0eSkge1xuICAgIHJldHVybiBnZXRQb3NpdGlvbigpICsgc2lnbih2ZWxvY2l0eSkgKiBtaW4oYWJzKHZlbG9jaXR5KSAqIChvcHRpb25zLmZsaWNrUG93ZXIgfHwgNjAwKSwgaXNGcmVlID8gSW5maW5pdHkgOiBDb21wb25lbnRzMi5MYXlvdXQubGlzdFNpemUoKSAqIChvcHRpb25zLmZsaWNrTWF4UGFnZXMgfHwgMSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGlmZkNvb3JkKGUsIG9ydGhvZ29uYWwpIHtcbiAgICByZXR1cm4gY29vcmRPZihlLCBvcnRob2dvbmFsKSAtIGNvb3JkT2YoZ2V0QmFzZUV2ZW50KGUpLCBvcnRob2dvbmFsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpZmZUaW1lKGUpIHtcbiAgICByZXR1cm4gdGltZU9mKGUpIC0gdGltZU9mKGdldEJhc2VFdmVudChlKSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRCYXNlRXZlbnQoZSkge1xuICAgIHJldHVybiBiYXNlRXZlbnQgPT09IGUgJiYgcHJldkJhc2VFdmVudCB8fCBiYXNlRXZlbnQ7XG4gIH1cblxuICBmdW5jdGlvbiBjb29yZE9mKGUsIG9ydGhvZ29uYWwpIHtcbiAgICByZXR1cm4gKGlzVG91Y2hFdmVudChlKSA/IGUuY2hhbmdlZFRvdWNoZXNbMF0gOiBlKVtcInBhZ2VcIiArIHJlc29sdmUob3J0aG9nb25hbCA/IFwiWVwiIDogXCJYXCIpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnN0cmFpbihkaWZmKSB7XG4gICAgcmV0dXJuIGRpZmYgLyAoZXhjZWVkZWQgJiYgU3BsaWRlMi5pcyhTTElERSkgPyBGUklDVElPTiA6IDEpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNEcmFnZ2FibGUodGFyZ2V0Mikge1xuICAgIHZhciBub0RyYWcgPSBvcHRpb25zLm5vRHJhZztcbiAgICByZXR1cm4gIW1hdGNoZXModGFyZ2V0MiwgXCIuXCIgKyBDTEFTU19QQUdJTkFUSU9OX1BBR0UgKyBcIiwgLlwiICsgQ0xBU1NfQVJST1cpICYmICghbm9EcmFnIHx8ICFtYXRjaGVzKHRhcmdldDIsIG5vRHJhZykpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNUb3VjaEV2ZW50KGUpIHtcbiAgICByZXR1cm4gdHlwZW9mIFRvdWNoRXZlbnQgIT09IFwidW5kZWZpbmVkXCIgJiYgZSBpbnN0YW5jZW9mIFRvdWNoRXZlbnQ7XG4gIH1cblxuICBmdW5jdGlvbiBpc0RyYWdnaW5nKCkge1xuICAgIHJldHVybiBkcmFnZ2luZztcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpc2FibGUodmFsdWUpIHtcbiAgICBkaXNhYmxlZCA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudDogbW91bnQsXG4gICAgZGlzYWJsZTogZGlzYWJsZSxcbiAgICBpc0RyYWdnaW5nOiBpc0RyYWdnaW5nXG4gIH07XG59XG5cbnZhciBOT1JNQUxJWkFUSU9OX01BUCA9IHtcbiAgU3BhY2ViYXI6IFwiIFwiLFxuICBSaWdodDogQVJST1dfUklHSFQsXG4gIExlZnQ6IEFSUk9XX0xFRlQsXG4gIFVwOiBBUlJPV19VUCxcbiAgRG93bjogQVJST1dfRE9XTlxufTtcblxuZnVuY3Rpb24gbm9ybWFsaXplS2V5KGtleSkge1xuICBrZXkgPSBpc1N0cmluZyhrZXkpID8ga2V5IDoga2V5LmtleTtcbiAgcmV0dXJuIE5PUk1BTElaQVRJT05fTUFQW2tleV0gfHwga2V5O1xufVxuXG52YXIgS0VZQk9BUkRfRVZFTlQgPSBcImtleWRvd25cIjtcblxuZnVuY3Rpb24gS2V5Ym9hcmQoU3BsaWRlMiwgQ29tcG9uZW50czIsIG9wdGlvbnMpIHtcbiAgdmFyIF9FdmVudEludGVyZmFjZTExID0gRXZlbnRJbnRlcmZhY2UoU3BsaWRlMiksXG4gICAgICBvbiA9IF9FdmVudEludGVyZmFjZTExLm9uLFxuICAgICAgYmluZCA9IF9FdmVudEludGVyZmFjZTExLmJpbmQsXG4gICAgICB1bmJpbmQgPSBfRXZlbnRJbnRlcmZhY2UxMS51bmJpbmQ7XG5cbiAgdmFyIHJvb3QgPSBTcGxpZGUyLnJvb3Q7XG4gIHZhciByZXNvbHZlID0gQ29tcG9uZW50czIuRGlyZWN0aW9uLnJlc29sdmU7XG4gIHZhciB0YXJnZXQ7XG4gIHZhciBkaXNhYmxlZDtcblxuICBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICBpbml0KCk7XG4gICAgb24oRVZFTlRfVVBEQVRFRCwgZGVzdHJveSk7XG4gICAgb24oRVZFTlRfVVBEQVRFRCwgaW5pdCk7XG4gICAgb24oRVZFTlRfTU9WRSwgb25Nb3ZlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgdmFyIGtleWJvYXJkID0gb3B0aW9ucy5rZXlib2FyZDtcblxuICAgIGlmIChrZXlib2FyZCkge1xuICAgICAgdGFyZ2V0ID0ga2V5Ym9hcmQgPT09IFwiZ2xvYmFsXCIgPyB3aW5kb3cgOiByb290O1xuICAgICAgYmluZCh0YXJnZXQsIEtFWUJPQVJEX0VWRU5ULCBvbktleWRvd24pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgdW5iaW5kKHRhcmdldCwgS0VZQk9BUkRfRVZFTlQpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGlzYWJsZSh2YWx1ZSkge1xuICAgIGRpc2FibGVkID0gdmFsdWU7XG4gIH1cblxuICBmdW5jdGlvbiBvbk1vdmUoKSB7XG4gICAgdmFyIF9kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICBuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBkaXNhYmxlZCA9IF9kaXNhYmxlZDtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uS2V5ZG93bihlKSB7XG4gICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgdmFyIGtleSA9IG5vcm1hbGl6ZUtleShlKTtcblxuICAgICAgaWYgKGtleSA9PT0gcmVzb2x2ZShBUlJPV19MRUZUKSkge1xuICAgICAgICBTcGxpZGUyLmdvKFwiPFwiKTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSByZXNvbHZlKEFSUk9XX1JJR0hUKSkge1xuICAgICAgICBTcGxpZGUyLmdvKFwiPlwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1vdW50OiBtb3VudCxcbiAgICBkZXN0cm95OiBkZXN0cm95LFxuICAgIGRpc2FibGU6IGRpc2FibGVcbiAgfTtcbn1cblxudmFyIFNSQ19EQVRBX0FUVFJJQlVURSA9IERBVEFfQVRUUklCVVRFICsgXCItbGF6eVwiO1xudmFyIFNSQ1NFVF9EQVRBX0FUVFJJQlVURSA9IFNSQ19EQVRBX0FUVFJJQlVURSArIFwiLXNyY3NldFwiO1xudmFyIElNQUdFX1NFTEVDVE9SID0gXCJbXCIgKyBTUkNfREFUQV9BVFRSSUJVVEUgKyBcIl0sIFtcIiArIFNSQ1NFVF9EQVRBX0FUVFJJQlVURSArIFwiXVwiO1xuXG5mdW5jdGlvbiBMYXp5TG9hZChTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgX0V2ZW50SW50ZXJmYWNlMTIgPSBFdmVudEludGVyZmFjZShTcGxpZGUyKSxcbiAgICAgIG9uID0gX0V2ZW50SW50ZXJmYWNlMTIub24sXG4gICAgICBvZmYgPSBfRXZlbnRJbnRlcmZhY2UxMi5vZmYsXG4gICAgICBiaW5kID0gX0V2ZW50SW50ZXJmYWNlMTIuYmluZCxcbiAgICAgIGVtaXQgPSBfRXZlbnRJbnRlcmZhY2UxMi5lbWl0O1xuXG4gIHZhciBpc1NlcXVlbnRpYWwgPSBvcHRpb25zLmxhenlMb2FkID09PSBcInNlcXVlbnRpYWxcIjtcbiAgdmFyIGV2ZW50cyA9IFtFVkVOVF9NT1VOVEVELCBFVkVOVF9SRUZSRVNILCBFVkVOVF9NT1ZFRCwgRVZFTlRfU0NST0xMRURdO1xuICB2YXIgZW50cmllcyA9IFtdO1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIGlmIChvcHRpb25zLmxhenlMb2FkKSB7XG4gICAgICBpbml0KCk7XG4gICAgICBvbihFVkVOVF9SRUZSRVNILCBpbml0KTtcbiAgICAgIGlzU2VxdWVudGlhbCB8fCBvbihldmVudHMsIG9ic2VydmUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgZW1wdHkoZW50cmllcyk7XG4gICAgQ29tcG9uZW50czIuU2xpZGVzLmZvckVhY2goZnVuY3Rpb24gKFNsaWRlKSB7XG4gICAgICBxdWVyeUFsbChTbGlkZS5zbGlkZSwgSU1BR0VfU0VMRUNUT1IpLmZvckVhY2goZnVuY3Rpb24gKGltZykge1xuICAgICAgICB2YXIgc3JjID0gZ2V0QXR0cmlidXRlKGltZywgU1JDX0RBVEFfQVRUUklCVVRFKTtcbiAgICAgICAgdmFyIHNyY3NldCA9IGdldEF0dHJpYnV0ZShpbWcsIFNSQ1NFVF9EQVRBX0FUVFJJQlVURSk7XG5cbiAgICAgICAgaWYgKHNyYyAhPT0gaW1nLnNyYyB8fCBzcmNzZXQgIT09IGltZy5zcmNzZXQpIHtcbiAgICAgICAgICB2YXIgY2xhc3NOYW1lID0gb3B0aW9ucy5jbGFzc2VzLnNwaW5uZXI7XG4gICAgICAgICAgdmFyIHBhcmVudCA9IGltZy5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgIHZhciBzcGlubmVyID0gY2hpbGQocGFyZW50LCBcIi5cIiArIGNsYXNzTmFtZSkgfHwgY3JlYXRlKFwic3BhblwiLCBjbGFzc05hbWUsIHBhcmVudCk7XG4gICAgICAgICAgZW50cmllcy5wdXNoKFtpbWcsIFNsaWRlLCBzcGlubmVyXSk7XG4gICAgICAgICAgaW1nLnNyYyB8fCBkaXNwbGF5KGltZywgXCJub25lXCIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpc1NlcXVlbnRpYWwgJiYgbG9hZE5leHQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9ic2VydmUoKSB7XG4gICAgZW50cmllcyA9IGVudHJpZXMuZmlsdGVyKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICB2YXIgZGlzdGFuY2UgPSBvcHRpb25zLnBlclBhZ2UgKiAoKG9wdGlvbnMucHJlbG9hZFBhZ2VzIHx8IDEpICsgMSkgLSAxO1xuICAgICAgcmV0dXJuIGRhdGFbMV0uaXNXaXRoaW4oU3BsaWRlMi5pbmRleCwgZGlzdGFuY2UpID8gbG9hZChkYXRhKSA6IHRydWU7XG4gICAgfSk7XG4gICAgZW50cmllcy5sZW5ndGggfHwgb2ZmKGV2ZW50cyk7XG4gIH1cblxuICBmdW5jdGlvbiBsb2FkKGRhdGEpIHtcbiAgICB2YXIgaW1nID0gZGF0YVswXTtcbiAgICBhZGRDbGFzcyhkYXRhWzFdLnNsaWRlLCBDTEFTU19MT0FESU5HKTtcbiAgICBiaW5kKGltZywgXCJsb2FkIGVycm9yXCIsIGFwcGx5KG9uTG9hZCwgZGF0YSkpO1xuICAgIHNldEF0dHJpYnV0ZShpbWcsIFwic3JjXCIsIGdldEF0dHJpYnV0ZShpbWcsIFNSQ19EQVRBX0FUVFJJQlVURSkpO1xuICAgIHNldEF0dHJpYnV0ZShpbWcsIFwic3Jjc2V0XCIsIGdldEF0dHJpYnV0ZShpbWcsIFNSQ1NFVF9EQVRBX0FUVFJJQlVURSkpO1xuICAgIHJlbW92ZUF0dHJpYnV0ZShpbWcsIFNSQ19EQVRBX0FUVFJJQlVURSk7XG4gICAgcmVtb3ZlQXR0cmlidXRlKGltZywgU1JDU0VUX0RBVEFfQVRUUklCVVRFKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uTG9hZChkYXRhLCBlKSB7XG4gICAgdmFyIGltZyA9IGRhdGFbMF0sXG4gICAgICAgIFNsaWRlID0gZGF0YVsxXTtcbiAgICByZW1vdmVDbGFzcyhTbGlkZS5zbGlkZSwgQ0xBU1NfTE9BRElORyk7XG5cbiAgICBpZiAoZS50eXBlICE9PSBcImVycm9yXCIpIHtcbiAgICAgIHJlbW92ZShkYXRhWzJdKTtcbiAgICAgIGRpc3BsYXkoaW1nLCBcIlwiKTtcbiAgICAgIGVtaXQoRVZFTlRfTEFaWUxPQURfTE9BREVELCBpbWcsIFNsaWRlKTtcbiAgICAgIGVtaXQoRVZFTlRfUkVTSVpFKTtcbiAgICB9XG5cbiAgICBpc1NlcXVlbnRpYWwgJiYgbG9hZE5leHQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvYWROZXh0KCkge1xuICAgIGVudHJpZXMubGVuZ3RoICYmIGxvYWQoZW50cmllcy5zaGlmdCgpKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbW91bnQ6IG1vdW50LFxuICAgIGRlc3Ryb3k6IGFwcGx5KGVtcHR5LCBlbnRyaWVzKVxuICB9O1xufVxuXG5mdW5jdGlvbiBQYWdpbmF0aW9uKFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIHZhciBldmVudCA9IEV2ZW50SW50ZXJmYWNlKFNwbGlkZTIpO1xuICB2YXIgb24gPSBldmVudC5vbixcbiAgICAgIGVtaXQgPSBldmVudC5lbWl0LFxuICAgICAgYmluZCA9IGV2ZW50LmJpbmQ7XG4gIHZhciBTbGlkZXMgPSBDb21wb25lbnRzMi5TbGlkZXMsXG4gICAgICBFbGVtZW50cyA9IENvbXBvbmVudHMyLkVsZW1lbnRzLFxuICAgICAgQ29udHJvbGxlciA9IENvbXBvbmVudHMyLkNvbnRyb2xsZXI7XG4gIHZhciBoYXNGb2N1cyA9IENvbnRyb2xsZXIuaGFzRm9jdXMsXG4gICAgICBnZXRJbmRleCA9IENvbnRyb2xsZXIuZ2V0SW5kZXgsXG4gICAgICBnbyA9IENvbnRyb2xsZXIuZ287XG4gIHZhciByZXNvbHZlID0gQ29tcG9uZW50czIuRGlyZWN0aW9uLnJlc29sdmU7XG4gIHZhciBpdGVtcyA9IFtdO1xuICB2YXIgbGlzdDtcbiAgdmFyIHBhZ2luYXRpb25DbGFzc2VzO1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIGRlc3Ryb3koKTtcbiAgICBvbihbRVZFTlRfVVBEQVRFRCwgRVZFTlRfUkVGUkVTSF0sIG1vdW50KTtcblxuICAgIGlmIChvcHRpb25zLnBhZ2luYXRpb24gJiYgU2xpZGVzLmlzRW5vdWdoKCkpIHtcbiAgICAgIG9uKFtFVkVOVF9NT1ZFLCBFVkVOVF9TQ1JPTEwsIEVWRU5UX1NDUk9MTEVEXSwgdXBkYXRlKTtcbiAgICAgIGNyZWF0ZVBhZ2luYXRpb24oKTtcbiAgICAgIHVwZGF0ZSgpO1xuICAgICAgZW1pdChFVkVOVF9QQUdJTkFUSU9OX01PVU5URUQsIHtcbiAgICAgICAgbGlzdDogbGlzdCxcbiAgICAgICAgaXRlbXM6IGl0ZW1zXG4gICAgICB9LCBnZXRBdChTcGxpZGUyLmluZGV4KSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICBpZiAobGlzdCkge1xuICAgICAgcmVtb3ZlKEVsZW1lbnRzLnBhZ2luYXRpb24gPyBzbGljZShsaXN0LmNoaWxkcmVuKSA6IGxpc3QpO1xuICAgICAgcmVtb3ZlQ2xhc3MobGlzdCwgcGFnaW5hdGlvbkNsYXNzZXMpO1xuICAgICAgZW1wdHkoaXRlbXMpO1xuICAgICAgbGlzdCA9IG51bGw7XG4gICAgfVxuXG4gICAgZXZlbnQuZGVzdHJveSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUGFnaW5hdGlvbigpIHtcbiAgICB2YXIgbGVuZ3RoID0gU3BsaWRlMi5sZW5ndGg7XG4gICAgdmFyIGNsYXNzZXMgPSBvcHRpb25zLmNsYXNzZXMsXG4gICAgICAgIGkxOG4gPSBvcHRpb25zLmkxOG4sXG4gICAgICAgIHBlclBhZ2UgPSBvcHRpb25zLnBlclBhZ2U7XG4gICAgdmFyIG1heCA9IGhhc0ZvY3VzKCkgPyBsZW5ndGggOiBjZWlsKGxlbmd0aCAvIHBlclBhZ2UpO1xuICAgIGxpc3QgPSBFbGVtZW50cy5wYWdpbmF0aW9uIHx8IGNyZWF0ZShcInVsXCIsIGNsYXNzZXMucGFnaW5hdGlvbiwgRWxlbWVudHMudHJhY2sucGFyZW50RWxlbWVudCk7XG4gICAgYWRkQ2xhc3MobGlzdCwgcGFnaW5hdGlvbkNsYXNzZXMgPSBDTEFTU19QQUdJTkFUSU9OICsgXCItLVwiICsgZ2V0RGlyZWN0aW9uKCkpO1xuICAgIHNldEF0dHJpYnV0ZShsaXN0LCBST0xFLCBcInRhYmxpc3RcIik7XG4gICAgc2V0QXR0cmlidXRlKGxpc3QsIEFSSUFfTEFCRUwsIGkxOG4uc2VsZWN0KTtcbiAgICBzZXRBdHRyaWJ1dGUobGlzdCwgQVJJQV9PUklFTlRBVElPTiwgZ2V0RGlyZWN0aW9uKCkgPT09IFRUQiA/IFwidmVydGljYWxcIiA6IFwiXCIpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXg7IGkrKykge1xuICAgICAgdmFyIGxpID0gY3JlYXRlKFwibGlcIiwgbnVsbCwgbGlzdCk7XG4gICAgICB2YXIgYnV0dG9uID0gY3JlYXRlKFwiYnV0dG9uXCIsIHtcbiAgICAgICAgY2xhc3M6IGNsYXNzZXMucGFnZSxcbiAgICAgICAgdHlwZTogXCJidXR0b25cIlxuICAgICAgfSwgbGkpO1xuICAgICAgdmFyIGNvbnRyb2xzID0gU2xpZGVzLmdldEluKGkpLm1hcChmdW5jdGlvbiAoU2xpZGUpIHtcbiAgICAgICAgcmV0dXJuIFNsaWRlLnNsaWRlLmlkO1xuICAgICAgfSk7XG4gICAgICB2YXIgdGV4dCA9ICFoYXNGb2N1cygpICYmIHBlclBhZ2UgPiAxID8gaTE4bi5wYWdlWCA6IGkxOG4uc2xpZGVYO1xuICAgICAgYmluZChidXR0b24sIFwiY2xpY2tcIiwgYXBwbHkob25DbGljaywgaSkpO1xuXG4gICAgICBpZiAob3B0aW9ucy5wYWdpbmF0aW9uS2V5Ym9hcmQpIHtcbiAgICAgICAgYmluZChidXR0b24sIFwia2V5ZG93blwiLCBhcHBseShvbktleWRvd24sIGkpKTtcbiAgICAgIH1cblxuICAgICAgc2V0QXR0cmlidXRlKGxpLCBST0xFLCBcInByZXNlbnRhdGlvblwiKTtcbiAgICAgIHNldEF0dHJpYnV0ZShidXR0b24sIFJPTEUsIFwidGFiXCIpO1xuICAgICAgc2V0QXR0cmlidXRlKGJ1dHRvbiwgQVJJQV9DT05UUk9MUywgY29udHJvbHMuam9pbihcIiBcIikpO1xuICAgICAgc2V0QXR0cmlidXRlKGJ1dHRvbiwgQVJJQV9MQUJFTCwgZm9ybWF0KHRleHQsIGkgKyAxKSk7XG4gICAgICBzZXRBdHRyaWJ1dGUoYnV0dG9uLCBUQUJfSU5ERVgsIC0xKTtcbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICBsaTogbGksXG4gICAgICAgIGJ1dHRvbjogYnV0dG9uLFxuICAgICAgICBwYWdlOiBpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbkNsaWNrKHBhZ2UpIHtcbiAgICBnbyhcIj5cIiArIHBhZ2UsIHRydWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25LZXlkb3duKHBhZ2UsIGUpIHtcbiAgICB2YXIgbGVuZ3RoID0gaXRlbXMubGVuZ3RoO1xuICAgIHZhciBrZXkgPSBub3JtYWxpemVLZXkoZSk7XG4gICAgdmFyIGRpciA9IGdldERpcmVjdGlvbigpO1xuICAgIHZhciBuZXh0UGFnZSA9IC0xO1xuXG4gICAgaWYgKGtleSA9PT0gcmVzb2x2ZShBUlJPV19SSUdIVCwgZmFsc2UsIGRpcikpIHtcbiAgICAgIG5leHRQYWdlID0gKytwYWdlICUgbGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSByZXNvbHZlKEFSUk9XX0xFRlQsIGZhbHNlLCBkaXIpKSB7XG4gICAgICBuZXh0UGFnZSA9ICgtLXBhZ2UgKyBsZW5ndGgpICUgbGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIkhvbWVcIikge1xuICAgICAgbmV4dFBhZ2UgPSAwO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIkVuZFwiKSB7XG4gICAgICBuZXh0UGFnZSA9IGxlbmd0aCAtIDE7XG4gICAgfVxuXG4gICAgdmFyIGl0ZW0gPSBpdGVtc1tuZXh0UGFnZV07XG5cbiAgICBpZiAoaXRlbSkge1xuICAgICAgZm9jdXMoaXRlbS5idXR0b24pO1xuICAgICAgZ28oXCI+XCIgKyBuZXh0UGFnZSk7XG4gICAgICBwcmV2ZW50KGUsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldERpcmVjdGlvbigpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5wYWdpbmF0aW9uRGlyZWN0aW9uIHx8IG9wdGlvbnMuZGlyZWN0aW9uO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QXQoaW5kZXgpIHtcbiAgICByZXR1cm4gaXRlbXNbQ29udHJvbGxlci50b1BhZ2UoaW5kZXgpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICB2YXIgcHJldiA9IGdldEF0KGdldEluZGV4KHRydWUpKTtcbiAgICB2YXIgY3VyciA9IGdldEF0KGdldEluZGV4KCkpO1xuXG4gICAgaWYgKHByZXYpIHtcbiAgICAgIHZhciBidXR0b24gPSBwcmV2LmJ1dHRvbjtcbiAgICAgIHJlbW92ZUNsYXNzKGJ1dHRvbiwgQ0xBU1NfQUNUSVZFKTtcbiAgICAgIHJlbW92ZUF0dHJpYnV0ZShidXR0b24sIEFSSUFfU0VMRUNURUQpO1xuICAgICAgc2V0QXR0cmlidXRlKGJ1dHRvbiwgVEFCX0lOREVYLCAtMSk7XG4gICAgfVxuXG4gICAgaWYgKGN1cnIpIHtcbiAgICAgIHZhciBfYnV0dG9uID0gY3Vyci5idXR0b247XG4gICAgICBhZGRDbGFzcyhfYnV0dG9uLCBDTEFTU19BQ1RJVkUpO1xuICAgICAgc2V0QXR0cmlidXRlKF9idXR0b24sIEFSSUFfU0VMRUNURUQsIHRydWUpO1xuICAgICAgc2V0QXR0cmlidXRlKF9idXR0b24sIFRBQl9JTkRFWCwgXCJcIik7XG4gICAgfVxuXG4gICAgZW1pdChFVkVOVF9QQUdJTkFUSU9OX1VQREFURUQsIHtcbiAgICAgIGxpc3Q6IGxpc3QsXG4gICAgICBpdGVtczogaXRlbXNcbiAgICB9LCBwcmV2LCBjdXJyKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaXRlbXM6IGl0ZW1zLFxuICAgIG1vdW50OiBtb3VudCxcbiAgICBkZXN0cm95OiBkZXN0cm95LFxuICAgIGdldEF0OiBnZXRBdCxcbiAgICB1cGRhdGU6IHVwZGF0ZVxuICB9O1xufVxuXG52YXIgVFJJR0dFUl9LRVlTID0gW1wiIFwiLCBcIkVudGVyXCJdO1xuXG5mdW5jdGlvbiBTeW5jKFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIHZhciBpc05hdmlnYXRpb24gPSBvcHRpb25zLmlzTmF2aWdhdGlvbixcbiAgICAgIHNsaWRlRm9jdXMgPSBvcHRpb25zLnNsaWRlRm9jdXM7XG4gIHZhciBldmVudHMgPSBbXTtcblxuICBmdW5jdGlvbiBzZXR1cCgpIHtcbiAgICBTcGxpZGUyLm9wdGlvbnMgPSB7XG4gICAgICBzbGlkZUZvY3VzOiBpc1VuZGVmaW5lZChzbGlkZUZvY3VzKSA/IGlzTmF2aWdhdGlvbiA6IHNsaWRlRm9jdXNcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgU3BsaWRlMi5zcGxpZGVzLmZvckVhY2goZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgaWYgKCF0YXJnZXQuaXNQYXJlbnQpIHtcbiAgICAgICAgc3luYyhTcGxpZGUyLCB0YXJnZXQuc3BsaWRlKTtcbiAgICAgICAgc3luYyh0YXJnZXQuc3BsaWRlLCBTcGxpZGUyKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChpc05hdmlnYXRpb24pIHtcbiAgICAgIG5hdmlnYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgICBlbXB0eShldmVudHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3VudCgpIHtcbiAgICBkZXN0cm95KCk7XG4gICAgbW91bnQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN5bmMoc3BsaWRlLCB0YXJnZXQpIHtcbiAgICB2YXIgZXZlbnQgPSBFdmVudEludGVyZmFjZShzcGxpZGUpO1xuICAgIGV2ZW50Lm9uKEVWRU5UX01PVkUsIGZ1bmN0aW9uIChpbmRleCwgcHJldiwgZGVzdCkge1xuICAgICAgdGFyZ2V0LmdvKHRhcmdldC5pcyhMT09QKSA/IGRlc3QgOiBpbmRleCk7XG4gICAgfSk7XG4gICAgZXZlbnRzLnB1c2goZXZlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gbmF2aWdhdGUoKSB7XG4gICAgdmFyIGV2ZW50ID0gRXZlbnRJbnRlcmZhY2UoU3BsaWRlMik7XG4gICAgdmFyIG9uID0gZXZlbnQub247XG4gICAgb24oRVZFTlRfQ0xJQ0ssIG9uQ2xpY2spO1xuICAgIG9uKEVWRU5UX1NMSURFX0tFWURPV04sIG9uS2V5ZG93bik7XG4gICAgb24oW0VWRU5UX01PVU5URUQsIEVWRU5UX1VQREFURURdLCB1cGRhdGUpO1xuICAgIGV2ZW50cy5wdXNoKGV2ZW50KTtcbiAgICBldmVudC5lbWl0KEVWRU5UX05BVklHQVRJT05fTU9VTlRFRCwgU3BsaWRlMi5zcGxpZGVzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICBzZXRBdHRyaWJ1dGUoQ29tcG9uZW50czIuRWxlbWVudHMubGlzdCwgQVJJQV9PUklFTlRBVElPTiwgb3B0aW9ucy5kaXJlY3Rpb24gPT09IFRUQiA/IFwidmVydGljYWxcIiA6IFwiXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25DbGljayhTbGlkZSkge1xuICAgIFNwbGlkZTIuZ28oU2xpZGUuaW5kZXgpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25LZXlkb3duKFNsaWRlLCBlKSB7XG4gICAgaWYgKGluY2x1ZGVzKFRSSUdHRVJfS0VZUywgbm9ybWFsaXplS2V5KGUpKSkge1xuICAgICAgb25DbGljayhTbGlkZSk7XG4gICAgICBwcmV2ZW50KGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2V0dXA6IHNldHVwLFxuICAgIG1vdW50OiBtb3VudCxcbiAgICBkZXN0cm95OiBkZXN0cm95LFxuICAgIHJlbW91bnQ6IHJlbW91bnRcbiAgfTtcbn1cblxuZnVuY3Rpb24gV2hlZWwoU3BsaWRlMiwgQ29tcG9uZW50czIsIG9wdGlvbnMpIHtcbiAgdmFyIF9FdmVudEludGVyZmFjZTEzID0gRXZlbnRJbnRlcmZhY2UoU3BsaWRlMiksXG4gICAgICBiaW5kID0gX0V2ZW50SW50ZXJmYWNlMTMuYmluZDtcblxuICB2YXIgbGFzdFRpbWUgPSAwO1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIGlmIChvcHRpb25zLndoZWVsKSB7XG4gICAgICBiaW5kKENvbXBvbmVudHMyLkVsZW1lbnRzLnRyYWNrLCBcIndoZWVsXCIsIG9uV2hlZWwsIFNDUk9MTF9MSVNURU5FUl9PUFRJT05TKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbldoZWVsKGUpIHtcbiAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICB2YXIgZGVsdGFZID0gZS5kZWx0YVk7XG4gICAgICB2YXIgYmFja3dhcmRzID0gZGVsdGFZIDwgMDtcbiAgICAgIHZhciB0aW1lU3RhbXAgPSB0aW1lT2YoZSk7XG5cbiAgICAgIHZhciBfbWluID0gb3B0aW9ucy53aGVlbE1pblRocmVzaG9sZCB8fCAwO1xuXG4gICAgICB2YXIgc2xlZXAgPSBvcHRpb25zLndoZWVsU2xlZXAgfHwgMDtcblxuICAgICAgaWYgKGFicyhkZWx0YVkpID4gX21pbiAmJiB0aW1lU3RhbXAgLSBsYXN0VGltZSA+IHNsZWVwKSB7XG4gICAgICAgIFNwbGlkZTIuZ28oYmFja3dhcmRzID8gXCI8XCIgOiBcIj5cIik7XG4gICAgICAgIGxhc3RUaW1lID0gdGltZVN0YW1wO1xuICAgICAgfVxuXG4gICAgICBzaG91bGRQcmV2ZW50KGJhY2t3YXJkcykgJiYgcHJldmVudChlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRQcmV2ZW50KGJhY2t3YXJkcykge1xuICAgIHJldHVybiAhb3B0aW9ucy5yZWxlYXNlV2hlZWwgfHwgU3BsaWRlMi5zdGF0ZS5pcyhNT1ZJTkcpIHx8IENvbXBvbmVudHMyLkNvbnRyb2xsZXIuZ2V0QWRqYWNlbnQoYmFja3dhcmRzKSAhPT0gLTE7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1vdW50OiBtb3VudFxuICB9O1xufVxuXG52YXIgU1JfUkVNT1ZBTF9ERUxBWSA9IDkwO1xuXG5mdW5jdGlvbiBMaXZlKFNwbGlkZTIsIENvbXBvbmVudHMyLCBvcHRpb25zKSB7XG4gIHZhciBfRXZlbnRJbnRlcmZhY2UxNCA9IEV2ZW50SW50ZXJmYWNlKFNwbGlkZTIpLFxuICAgICAgb24gPSBfRXZlbnRJbnRlcmZhY2UxNC5vbjtcblxuICB2YXIgdHJhY2sgPSBDb21wb25lbnRzMi5FbGVtZW50cy50cmFjaztcbiAgdmFyIGVuYWJsZWQgPSBvcHRpb25zLmxpdmUgJiYgIW9wdGlvbnMuaXNOYXZpZ2F0aW9uO1xuICB2YXIgc3IgPSBjcmVhdGUoXCJzcGFuXCIsIENMQVNTX1NSKTtcbiAgdmFyIGludGVydmFsID0gUmVxdWVzdEludGVydmFsKFNSX1JFTU9WQUxfREVMQVksIGFwcGx5KHRvZ2dsZSwgZmFsc2UpKTtcblxuICBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgZGlzYWJsZSghQ29tcG9uZW50czIuQXV0b3BsYXkuaXNQYXVzZWQoKSk7XG4gICAgICBzZXRBdHRyaWJ1dGUodHJhY2ssIEFSSUFfQVRPTUlDLCB0cnVlKTtcbiAgICAgIHNyLnRleHRDb250ZW50ID0gXCJcXHUyMDI2XCI7XG4gICAgICBvbihFVkVOVF9BVVRPUExBWV9QTEFZLCBhcHBseShkaXNhYmxlLCB0cnVlKSk7XG4gICAgICBvbihFVkVOVF9BVVRPUExBWV9QQVVTRSwgYXBwbHkoZGlzYWJsZSwgZmFsc2UpKTtcbiAgICAgIG9uKFtFVkVOVF9NT1ZFRCwgRVZFTlRfU0NST0xMRURdLCBhcHBseSh0b2dnbGUsIHRydWUpKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0b2dnbGUoYWN0aXZlKSB7XG4gICAgc2V0QXR0cmlidXRlKHRyYWNrLCBBUklBX0JVU1ksIGFjdGl2ZSk7XG5cbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICBhcHBlbmQodHJhY2ssIHNyKTtcbiAgICAgIGludGVydmFsLnN0YXJ0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlbW92ZShzcik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICByZW1vdmVBdHRyaWJ1dGUodHJhY2ssIFtBUklBX0xJVkUsIEFSSUFfQVRPTUlDLCBBUklBX0JVU1ldKTtcbiAgICByZW1vdmUoc3IpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGlzYWJsZShkaXNhYmxlZCkge1xuICAgIGlmIChlbmFibGVkKSB7XG4gICAgICBzZXRBdHRyaWJ1dGUodHJhY2ssIEFSSUFfTElWRSwgZGlzYWJsZWQgPyBcIm9mZlwiIDogXCJwb2xpdGVcIik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudDogbW91bnQsXG4gICAgZGlzYWJsZTogZGlzYWJsZSxcbiAgICBkZXN0cm95OiBkZXN0cm95XG4gIH07XG59XG5cbnZhciBDb21wb25lbnRDb25zdHJ1Y3RvcnMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgTWVkaWE6IE1lZGlhLFxuICBEaXJlY3Rpb246IERpcmVjdGlvbixcbiAgRWxlbWVudHM6IEVsZW1lbnRzLFxuICBTbGlkZXM6IFNsaWRlcyxcbiAgTGF5b3V0OiBMYXlvdXQsXG4gIENsb25lczogQ2xvbmVzLFxuICBNb3ZlOiBNb3ZlLFxuICBDb250cm9sbGVyOiBDb250cm9sbGVyLFxuICBBcnJvd3M6IEFycm93cyxcbiAgQXV0b3BsYXk6IEF1dG9wbGF5LFxuICBDb3ZlcjogQ292ZXIsXG4gIFNjcm9sbDogU2Nyb2xsLFxuICBEcmFnOiBEcmFnLFxuICBLZXlib2FyZDogS2V5Ym9hcmQsXG4gIExhenlMb2FkOiBMYXp5TG9hZCxcbiAgUGFnaW5hdGlvbjogUGFnaW5hdGlvbixcbiAgU3luYzogU3luYyxcbiAgV2hlZWw6IFdoZWVsLFxuICBMaXZlOiBMaXZlXG59KTtcbnZhciBJMThOID0ge1xuICBwcmV2OiBcIlByZXZpb3VzIHNsaWRlXCIsXG4gIG5leHQ6IFwiTmV4dCBzbGlkZVwiLFxuICBmaXJzdDogXCJHbyB0byBmaXJzdCBzbGlkZVwiLFxuICBsYXN0OiBcIkdvIHRvIGxhc3Qgc2xpZGVcIixcbiAgc2xpZGVYOiBcIkdvIHRvIHNsaWRlICVzXCIsXG4gIHBhZ2VYOiBcIkdvIHRvIHBhZ2UgJXNcIixcbiAgcGxheTogXCJTdGFydCBhdXRvcGxheVwiLFxuICBwYXVzZTogXCJQYXVzZSBhdXRvcGxheVwiLFxuICBjYXJvdXNlbDogXCJjYXJvdXNlbFwiLFxuICBzbGlkZTogXCJzbGlkZVwiLFxuICBzZWxlY3Q6IFwiU2VsZWN0IGEgc2xpZGUgdG8gc2hvd1wiLFxuICBzbGlkZUxhYmVsOiBcIiVzIG9mICVzXCJcbn07XG52YXIgREVGQVVMVFMgPSB7XG4gIHR5cGU6IFwic2xpZGVcIixcbiAgcm9sZTogXCJyZWdpb25cIixcbiAgc3BlZWQ6IDQwMCxcbiAgcGVyUGFnZTogMSxcbiAgY2xvbmVTdGF0dXM6IHRydWUsXG4gIGFycm93czogdHJ1ZSxcbiAgcGFnaW5hdGlvbjogdHJ1ZSxcbiAgcGFnaW5hdGlvbktleWJvYXJkOiB0cnVlLFxuICBpbnRlcnZhbDogNWUzLFxuICBwYXVzZU9uSG92ZXI6IHRydWUsXG4gIHBhdXNlT25Gb2N1czogdHJ1ZSxcbiAgcmVzZXRQcm9ncmVzczogdHJ1ZSxcbiAgZWFzaW5nOiBcImN1YmljLWJlemllcigwLjI1LCAxLCAwLjUsIDEpXCIsXG4gIGRyYWc6IHRydWUsXG4gIGRpcmVjdGlvbjogXCJsdHJcIixcbiAgdHJpbVNwYWNlOiB0cnVlLFxuICBmb2N1c2FibGVOb2RlczogXCJhLCBidXR0b24sIHRleHRhcmVhLCBpbnB1dCwgc2VsZWN0LCBpZnJhbWVcIixcbiAgbGl2ZTogdHJ1ZSxcbiAgY2xhc3NlczogQ0xBU1NFUyxcbiAgaTE4bjogSTE4TixcbiAgcmVkdWNlZE1vdGlvbjoge1xuICAgIHNwZWVkOiAwLFxuICAgIHJld2luZFNwZWVkOiAwLFxuICAgIGF1dG9wbGF5OiBcInBhdXNlXCJcbiAgfVxufTtcblxuZnVuY3Rpb24gRmFkZShTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgX0V2ZW50SW50ZXJmYWNlMTUgPSBFdmVudEludGVyZmFjZShTcGxpZGUyKSxcbiAgICAgIG9uID0gX0V2ZW50SW50ZXJmYWNlMTUub247XG5cbiAgZnVuY3Rpb24gbW91bnQoKSB7XG4gICAgb24oW0VWRU5UX01PVU5URUQsIEVWRU5UX1JFRlJFU0hdLCBmdW5jdGlvbiAoKSB7XG4gICAgICBuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIENvbXBvbmVudHMyLlNsaWRlcy5zdHlsZShcInRyYW5zaXRpb25cIiwgXCJvcGFjaXR5IFwiICsgb3B0aW9ucy5zcGVlZCArIFwibXMgXCIgKyBvcHRpb25zLmVhc2luZyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGluZGV4LCBkb25lKSB7XG4gICAgdmFyIHRyYWNrID0gQ29tcG9uZW50czIuRWxlbWVudHMudHJhY2s7XG4gICAgc3R5bGUodHJhY2ssIFwiaGVpZ2h0XCIsIHVuaXQocmVjdCh0cmFjaykuaGVpZ2h0KSk7XG4gICAgbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgZG9uZSgpO1xuICAgICAgc3R5bGUodHJhY2ssIFwiaGVpZ2h0XCIsIFwiXCIpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudDogbW91bnQsXG4gICAgc3RhcnQ6IHN0YXJ0LFxuICAgIGNhbmNlbDogbm9vcFxuICB9O1xufVxuXG5mdW5jdGlvbiBTbGlkZShTcGxpZGUyLCBDb21wb25lbnRzMiwgb3B0aW9ucykge1xuICB2YXIgX0V2ZW50SW50ZXJmYWNlMTYgPSBFdmVudEludGVyZmFjZShTcGxpZGUyKSxcbiAgICAgIGJpbmQgPSBfRXZlbnRJbnRlcmZhY2UxNi5iaW5kO1xuXG4gIHZhciBNb3ZlID0gQ29tcG9uZW50czIuTW92ZSxcbiAgICAgIENvbnRyb2xsZXIgPSBDb21wb25lbnRzMi5Db250cm9sbGVyLFxuICAgICAgU2Nyb2xsID0gQ29tcG9uZW50czIuU2Nyb2xsO1xuICB2YXIgbGlzdCA9IENvbXBvbmVudHMyLkVsZW1lbnRzLmxpc3Q7XG4gIHZhciB0cmFuc2l0aW9uID0gYXBwbHkoc3R5bGUsIGxpc3QsIFwidHJhbnNpdGlvblwiKTtcbiAgdmFyIGVuZENhbGxiYWNrO1xuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIGJpbmQobGlzdCwgXCJ0cmFuc2l0aW9uZW5kXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoZS50YXJnZXQgPT09IGxpc3QgJiYgZW5kQ2FsbGJhY2spIHtcbiAgICAgICAgY2FuY2VsKCk7XG4gICAgICAgIGVuZENhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydChpbmRleCwgZG9uZSkge1xuICAgIHZhciBkZXN0aW5hdGlvbiA9IE1vdmUudG9Qb3NpdGlvbihpbmRleCwgdHJ1ZSk7XG4gICAgdmFyIHBvc2l0aW9uID0gTW92ZS5nZXRQb3NpdGlvbigpO1xuICAgIHZhciBzcGVlZCA9IGdldFNwZWVkKGluZGV4KTtcblxuICAgIGlmIChhYnMoZGVzdGluYXRpb24gLSBwb3NpdGlvbikgPj0gMSAmJiBzcGVlZCA+PSAxKSB7XG4gICAgICBpZiAob3B0aW9ucy51c2VTY3JvbGwpIHtcbiAgICAgICAgU2Nyb2xsLnNjcm9sbChkZXN0aW5hdGlvbiwgc3BlZWQsIGZhbHNlLCBkb25lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYW5zaXRpb24oXCJ0cmFuc2Zvcm0gXCIgKyBzcGVlZCArIFwibXMgXCIgKyBvcHRpb25zLmVhc2luZyk7XG4gICAgICAgIE1vdmUudHJhbnNsYXRlKGRlc3RpbmF0aW9uLCB0cnVlKTtcbiAgICAgICAgZW5kQ2FsbGJhY2sgPSBkb25lO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBNb3ZlLmp1bXAoaW5kZXgpO1xuICAgICAgZG9uZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICB0cmFuc2l0aW9uKFwiXCIpO1xuICAgIFNjcm9sbC5jYW5jZWwoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNwZWVkKGluZGV4KSB7XG4gICAgdmFyIHJld2luZFNwZWVkID0gb3B0aW9ucy5yZXdpbmRTcGVlZDtcblxuICAgIGlmIChTcGxpZGUyLmlzKFNMSURFKSAmJiByZXdpbmRTcGVlZCkge1xuICAgICAgdmFyIHByZXYgPSBDb250cm9sbGVyLmdldEluZGV4KHRydWUpO1xuICAgICAgdmFyIGVuZCA9IENvbnRyb2xsZXIuZ2V0RW5kKCk7XG5cbiAgICAgIGlmIChwcmV2ID09PSAwICYmIGluZGV4ID49IGVuZCB8fCBwcmV2ID49IGVuZCAmJiBpbmRleCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gcmV3aW5kU3BlZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbnMuc3BlZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1vdW50OiBtb3VudCxcbiAgICBzdGFydDogc3RhcnQsXG4gICAgY2FuY2VsOiBjYW5jZWxcbiAgfTtcbn1cblxudmFyIF9TcGxpZGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBfU3BsaWRlKHRhcmdldCwgb3B0aW9ucykge1xuICAgIHRoaXMuZXZlbnQgPSBFdmVudEludGVyZmFjZSgpO1xuICAgIHRoaXMuQ29tcG9uZW50cyA9IHt9O1xuICAgIHRoaXMuc3RhdGUgPSBTdGF0ZShDUkVBVEVEKTtcbiAgICB0aGlzLnNwbGlkZXMgPSBbXTtcbiAgICB0aGlzLl9vID0ge307XG4gICAgdGhpcy5fRSA9IHt9O1xuICAgIHZhciByb290ID0gaXNTdHJpbmcodGFyZ2V0KSA/IHF1ZXJ5KGRvY3VtZW50LCB0YXJnZXQpIDogdGFyZ2V0O1xuICAgIGFzc2VydChyb290LCByb290ICsgXCIgaXMgaW52YWxpZC5cIik7XG4gICAgdGhpcy5yb290ID0gcm9vdDtcbiAgICBvcHRpb25zID0gbWVyZ2Uoe1xuICAgICAgbGFiZWw6IGdldEF0dHJpYnV0ZShyb290LCBBUklBX0xBQkVMKSB8fCBcIlwiLFxuICAgICAgbGFiZWxsZWRieTogZ2V0QXR0cmlidXRlKHJvb3QsIEFSSUFfTEFCRUxMRURCWSkgfHwgXCJcIlxuICAgIH0sIERFRkFVTFRTLCBfU3BsaWRlLmRlZmF1bHRzLCBvcHRpb25zIHx8IHt9KTtcblxuICAgIHRyeSB7XG4gICAgICBtZXJnZShvcHRpb25zLCBKU09OLnBhcnNlKGdldEF0dHJpYnV0ZShyb290LCBEQVRBX0FUVFJJQlVURSkpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhc3NlcnQoZmFsc2UsIFwiSW52YWxpZCBKU09OXCIpO1xuICAgIH1cblxuICAgIHRoaXMuX28gPSBPYmplY3QuY3JlYXRlKG1lcmdlKHt9LCBvcHRpb25zKSk7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gX1NwbGlkZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLm1vdW50ID0gZnVuY3Rpb24gbW91bnQoRXh0ZW5zaW9ucywgVHJhbnNpdGlvbikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgc3RhdGUgPSB0aGlzLnN0YXRlLFxuICAgICAgICBDb21wb25lbnRzMiA9IHRoaXMuQ29tcG9uZW50cztcbiAgICBhc3NlcnQoc3RhdGUuaXMoW0NSRUFURUQsIERFU1RST1lFRF0pLCBcIkFscmVhZHkgbW91bnRlZCFcIik7XG4gICAgc3RhdGUuc2V0KENSRUFURUQpO1xuICAgIHRoaXMuX0MgPSBDb21wb25lbnRzMjtcbiAgICB0aGlzLl9UID0gVHJhbnNpdGlvbiB8fCB0aGlzLl9UIHx8ICh0aGlzLmlzKEZBREUpID8gRmFkZSA6IFNsaWRlKTtcbiAgICB0aGlzLl9FID0gRXh0ZW5zaW9ucyB8fCB0aGlzLl9FO1xuICAgIHZhciBDb25zdHJ1Y3RvcnMgPSBhc3NpZ24oe30sIENvbXBvbmVudENvbnN0cnVjdG9ycywgdGhpcy5fRSwge1xuICAgICAgVHJhbnNpdGlvbjogdGhpcy5fVFxuICAgIH0pO1xuICAgIGZvck93bihDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uIChDb21wb25lbnQsIGtleSkge1xuICAgICAgdmFyIGNvbXBvbmVudCA9IENvbXBvbmVudChfdGhpcywgQ29tcG9uZW50czIsIF90aGlzLl9vKTtcbiAgICAgIENvbXBvbmVudHMyW2tleV0gPSBjb21wb25lbnQ7XG4gICAgICBjb21wb25lbnQuc2V0dXAgJiYgY29tcG9uZW50LnNldHVwKCk7XG4gICAgfSk7XG4gICAgZm9yT3duKENvbXBvbmVudHMyLCBmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICBjb21wb25lbnQubW91bnQgJiYgY29tcG9uZW50Lm1vdW50KCk7XG4gICAgfSk7XG4gICAgdGhpcy5lbWl0KEVWRU5UX01PVU5URUQpO1xuICAgIGFkZENsYXNzKHRoaXMucm9vdCwgQ0xBU1NfSU5JVElBTElaRUQpO1xuICAgIHN0YXRlLnNldChJRExFKTtcbiAgICB0aGlzLmVtaXQoRVZFTlRfUkVBRFkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90by5zeW5jID0gZnVuY3Rpb24gc3luYyhzcGxpZGUpIHtcbiAgICB0aGlzLnNwbGlkZXMucHVzaCh7XG4gICAgICBzcGxpZGU6IHNwbGlkZVxuICAgIH0pO1xuICAgIHNwbGlkZS5zcGxpZGVzLnB1c2goe1xuICAgICAgc3BsaWRlOiB0aGlzLFxuICAgICAgaXNQYXJlbnQ6IHRydWVcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnN0YXRlLmlzKElETEUpKSB7XG4gICAgICB0aGlzLl9DLlN5bmMucmVtb3VudCgpO1xuXG4gICAgICBzcGxpZGUuQ29tcG9uZW50cy5TeW5jLnJlbW91bnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBfcHJvdG8uZ28gPSBmdW5jdGlvbiBnbyhjb250cm9sKSB7XG4gICAgdGhpcy5fQy5Db250cm9sbGVyLmdvKGNvbnRyb2wpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgX3Byb3RvLm9uID0gZnVuY3Rpb24gb24oZXZlbnRzLCBjYWxsYmFjaykge1xuICAgIHRoaXMuZXZlbnQub24oZXZlbnRzLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgX3Byb3RvLm9mZiA9IGZ1bmN0aW9uIG9mZihldmVudHMpIHtcbiAgICB0aGlzLmV2ZW50Lm9mZihldmVudHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90by5lbWl0ID0gZnVuY3Rpb24gZW1pdChldmVudCkge1xuICAgIHZhciBfdGhpcyRldmVudDtcblxuICAgIChfdGhpcyRldmVudCA9IHRoaXMuZXZlbnQpLmVtaXQuYXBwbHkoX3RoaXMkZXZlbnQsIFtldmVudF0uY29uY2F0KHNsaWNlKGFyZ3VtZW50cywgMSkpKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90by5hZGQgPSBmdW5jdGlvbiBhZGQoc2xpZGVzLCBpbmRleCkge1xuICAgIHRoaXMuX0MuU2xpZGVzLmFkZChzbGlkZXMsIGluZGV4KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90by5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUobWF0Y2hlcikge1xuICAgIHRoaXMuX0MuU2xpZGVzLnJlbW92ZShtYXRjaGVyKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90by5pcyA9IGZ1bmN0aW9uIGlzKHR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5fby50eXBlID09PSB0eXBlO1xuICB9O1xuXG4gIF9wcm90by5yZWZyZXNoID0gZnVuY3Rpb24gcmVmcmVzaCgpIHtcbiAgICB0aGlzLmVtaXQoRVZFTlRfUkVGUkVTSCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgX3Byb3RvLmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95KGNvbXBsZXRlbHkpIHtcbiAgICBpZiAoY29tcGxldGVseSA9PT0gdm9pZCAwKSB7XG4gICAgICBjb21wbGV0ZWx5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgZXZlbnQgPSB0aGlzLmV2ZW50LFxuICAgICAgICBzdGF0ZSA9IHRoaXMuc3RhdGU7XG5cbiAgICBpZiAoc3RhdGUuaXMoQ1JFQVRFRCkpIHtcbiAgICAgIEV2ZW50SW50ZXJmYWNlKHRoaXMpLm9uKEVWRU5UX1JFQURZLCB0aGlzLmRlc3Ryb3kuYmluZCh0aGlzLCBjb21wbGV0ZWx5KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvck93bih0aGlzLl9DLCBmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICAgIGNvbXBvbmVudC5kZXN0cm95ICYmIGNvbXBvbmVudC5kZXN0cm95KGNvbXBsZXRlbHkpO1xuICAgICAgfSwgdHJ1ZSk7XG4gICAgICBldmVudC5lbWl0KEVWRU5UX0RFU1RST1kpO1xuICAgICAgZXZlbnQuZGVzdHJveSgpO1xuICAgICAgY29tcGxldGVseSAmJiBlbXB0eSh0aGlzLnNwbGlkZXMpO1xuICAgICAgc3RhdGUuc2V0KERFU1RST1lFRCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKF9TcGxpZGUsIFt7XG4gICAga2V5OiBcIm9wdGlvbnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9vO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQob3B0aW9ucykge1xuICAgICAgdGhpcy5fQy5NZWRpYS5zZXQob3B0aW9ucywgdHJ1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxlbmd0aFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX0MuU2xpZGVzLmdldExlbmd0aCh0cnVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5kZXhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9DLkNvbnRyb2xsZXIuZ2V0SW5kZXgoKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gX1NwbGlkZTtcbn0oKTtcblxudmFyIFNwbGlkZSA9IF9TcGxpZGU7XG5TcGxpZGUuZGVmYXVsdHMgPSB7fTtcblNwbGlkZS5TVEFURVMgPSBTVEFURVM7XG52YXIgQ0xBU1NfUkVOREVSRUQgPSBcImlzLXJlbmRlcmVkXCI7XG52YXIgUkVOREVSRVJfREVGQVVMVF9DT05GSUcgPSB7XG4gIGxpc3RUYWc6IFwidWxcIixcbiAgc2xpZGVUYWc6IFwibGlcIlxufTtcblxudmFyIFN0eWxlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU3R5bGUoaWQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLnN0eWxlcyA9IHt9O1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG5cbiAgdmFyIF9wcm90bzIgPSBTdHlsZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvMi5ydWxlID0gZnVuY3Rpb24gcnVsZShzZWxlY3RvciwgcHJvcCwgdmFsdWUsIGJyZWFrcG9pbnQpIHtcbiAgICBicmVha3BvaW50ID0gYnJlYWtwb2ludCB8fCBcImRlZmF1bHRcIjtcbiAgICB2YXIgc2VsZWN0b3JzID0gdGhpcy5zdHlsZXNbYnJlYWtwb2ludF0gPSB0aGlzLnN0eWxlc1ticmVha3BvaW50XSB8fCB7fTtcbiAgICB2YXIgc3R5bGVzID0gc2VsZWN0b3JzW3NlbGVjdG9yXSA9IHNlbGVjdG9yc1tzZWxlY3Rvcl0gfHwge307XG4gICAgc3R5bGVzW3Byb3BdID0gdmFsdWU7XG4gIH07XG5cbiAgX3Byb3RvMi5idWlsZCA9IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIGNzcyA9IFwiXCI7XG5cbiAgICBpZiAodGhpcy5zdHlsZXMuZGVmYXVsdCkge1xuICAgICAgY3NzICs9IHRoaXMuYnVpbGRTZWxlY3RvcnModGhpcy5zdHlsZXMuZGVmYXVsdCk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmtleXModGhpcy5zdHlsZXMpLnNvcnQoZnVuY3Rpb24gKG4sIG0pIHtcbiAgICAgIHJldHVybiBfdGhpczIub3B0aW9ucy5tZWRpYVF1ZXJ5ID09PSBcIm1pblwiID8gK24gLSArbSA6ICttIC0gK247XG4gICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoYnJlYWtwb2ludCkge1xuICAgICAgaWYgKGJyZWFrcG9pbnQgIT09IFwiZGVmYXVsdFwiKSB7XG4gICAgICAgIGNzcyArPSBcIkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IFwiICsgYnJlYWtwb2ludCArIFwicHgpIHtcIjtcbiAgICAgICAgY3NzICs9IF90aGlzMi5idWlsZFNlbGVjdG9ycyhfdGhpczIuc3R5bGVzW2JyZWFrcG9pbnRdKTtcbiAgICAgICAgY3NzICs9IFwifVwiO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjc3M7XG4gIH07XG5cbiAgX3Byb3RvMi5idWlsZFNlbGVjdG9ycyA9IGZ1bmN0aW9uIGJ1aWxkU2VsZWN0b3JzKHNlbGVjdG9ycykge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgdmFyIGNzcyA9IFwiXCI7XG4gICAgZm9yT3duKHNlbGVjdG9ycywgZnVuY3Rpb24gKHN0eWxlcywgc2VsZWN0b3IpIHtcbiAgICAgIHNlbGVjdG9yID0gKFwiI1wiICsgX3RoaXMzLmlkICsgXCIgXCIgKyBzZWxlY3RvcikudHJpbSgpO1xuICAgICAgY3NzICs9IHNlbGVjdG9yICsgXCIge1wiO1xuICAgICAgZm9yT3duKHN0eWxlcywgZnVuY3Rpb24gKHZhbHVlLCBwcm9wKSB7XG4gICAgICAgIGlmICh2YWx1ZSB8fCB2YWx1ZSA9PT0gMCkge1xuICAgICAgICAgIGNzcyArPSBwcm9wICsgXCI6IFwiICsgdmFsdWUgKyBcIjtcIjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjc3MgKz0gXCJ9XCI7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNzcztcbiAgfTtcblxuICByZXR1cm4gU3R5bGU7XG59KCk7XG5cbnZhciBTcGxpZGVSZW5kZXJlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNwbGlkZVJlbmRlcmVyKGNvbnRlbnRzLCBvcHRpb25zLCBjb25maWcsIGRlZmF1bHRzKSB7XG4gICAgdGhpcy5zbGlkZXMgPSBbXTtcbiAgICB0aGlzLm9wdGlvbnMgPSB7fTtcbiAgICB0aGlzLmJyZWFrcG9pbnRzID0gW107XG4gICAgbWVyZ2UoREVGQVVMVFMsIGRlZmF1bHRzIHx8IHt9KTtcbiAgICBtZXJnZShtZXJnZSh0aGlzLm9wdGlvbnMsIERFRkFVTFRTKSwgb3B0aW9ucyB8fCB7fSk7XG4gICAgdGhpcy5jb250ZW50cyA9IGNvbnRlbnRzO1xuICAgIHRoaXMuY29uZmlnID0gYXNzaWduKHt9LCBSRU5ERVJFUl9ERUZBVUxUX0NPTkZJRywgY29uZmlnIHx8IHt9KTtcbiAgICB0aGlzLmlkID0gdGhpcy5jb25maWcuaWQgfHwgdW5pcXVlSWQoXCJzcGxpZGVcIik7XG4gICAgdGhpcy5TdHlsZSA9IG5ldyBTdHlsZSh0aGlzLmlkLCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMuRGlyZWN0aW9uID0gRGlyZWN0aW9uKG51bGwsIG51bGwsIHRoaXMub3B0aW9ucyk7XG4gICAgYXNzZXJ0KHRoaXMuY29udGVudHMubGVuZ3RoLCBcIlByb3ZpZGUgYXQgbGVhc3QgMSBjb250ZW50LlwiKTtcbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIFNwbGlkZVJlbmRlcmVyLmNsZWFuID0gZnVuY3Rpb24gY2xlYW4oc3BsaWRlKSB7XG4gICAgdmFyIF9FdmVudEludGVyZmFjZTE3ID0gRXZlbnRJbnRlcmZhY2Uoc3BsaWRlKSxcbiAgICAgICAgb24gPSBfRXZlbnRJbnRlcmZhY2UxNy5vbjtcblxuICAgIHZhciByb290ID0gc3BsaWRlLnJvb3Q7XG4gICAgdmFyIGNsb25lcyA9IHF1ZXJ5QWxsKHJvb3QsIFwiLlwiICsgQ0xBU1NfQ0xPTkUpO1xuICAgIG9uKEVWRU5UX01PVU5URUQsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlbW92ZShjaGlsZChyb290LCBcInN0eWxlXCIpKTtcbiAgICB9KTtcbiAgICByZW1vdmUoY2xvbmVzKTtcbiAgfTtcblxuICB2YXIgX3Byb3RvMyA9IFNwbGlkZVJlbmRlcmVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8zLmluaXQgPSBmdW5jdGlvbiBpbml0KCkge1xuICAgIHRoaXMucGFyc2VCcmVha3BvaW50cygpO1xuICAgIHRoaXMuaW5pdFNsaWRlcygpO1xuICAgIHRoaXMucmVnaXN0ZXJSb290U3R5bGVzKCk7XG4gICAgdGhpcy5yZWdpc3RlclRyYWNrU3R5bGVzKCk7XG4gICAgdGhpcy5yZWdpc3RlclNsaWRlU3R5bGVzKCk7XG4gICAgdGhpcy5yZWdpc3Rlckxpc3RTdHlsZXMoKTtcbiAgfTtcblxuICBfcHJvdG8zLmluaXRTbGlkZXMgPSBmdW5jdGlvbiBpbml0U2xpZGVzKCkge1xuICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgcHVzaCh0aGlzLnNsaWRlcywgdGhpcy5jb250ZW50cy5tYXAoZnVuY3Rpb24gKGNvbnRlbnQsIGluZGV4KSB7XG4gICAgICBjb250ZW50ID0gaXNTdHJpbmcoY29udGVudCkgPyB7XG4gICAgICAgIGh0bWw6IGNvbnRlbnRcbiAgICAgIH0gOiBjb250ZW50O1xuICAgICAgY29udGVudC5zdHlsZXMgPSBjb250ZW50LnN0eWxlcyB8fCB7fTtcbiAgICAgIGNvbnRlbnQuYXR0cnMgPSBjb250ZW50LmF0dHJzIHx8IHt9O1xuXG4gICAgICBfdGhpczQuY292ZXIoY29udGVudCk7XG5cbiAgICAgIHZhciBjbGFzc2VzID0gX3RoaXM0Lm9wdGlvbnMuY2xhc3Nlcy5zbGlkZSArIFwiIFwiICsgKGluZGV4ID09PSAwID8gQ0xBU1NfQUNUSVZFIDogXCJcIik7XG4gICAgICBhc3NpZ24oY29udGVudC5hdHRycywge1xuICAgICAgICBjbGFzczogKGNsYXNzZXMgKyBcIiBcIiArIChjb250ZW50LmF0dHJzLmNsYXNzIHx8IFwiXCIpKS50cmltKCksXG4gICAgICAgIHN0eWxlOiBfdGhpczQuYnVpbGRTdHlsZXMoY29udGVudC5zdHlsZXMpXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0pKTtcblxuICAgIGlmICh0aGlzLmlzTG9vcCgpKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2xvbmVzKHRoaXMuc2xpZGVzKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvMy5yZWdpc3RlclJvb3RTdHlsZXMgPSBmdW5jdGlvbiByZWdpc3RlclJvb3RTdHlsZXMoKSB7XG4gICAgdmFyIF90aGlzNSA9IHRoaXM7XG5cbiAgICB0aGlzLmJyZWFrcG9pbnRzLmZvckVhY2goZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICB2YXIgd2lkdGggPSBfcmVmMlswXSxcbiAgICAgICAgICBvcHRpb25zID0gX3JlZjJbMV07XG5cbiAgICAgIF90aGlzNS5TdHlsZS5ydWxlKFwiIFwiLCBcIm1heC13aWR0aFwiLCB1bml0KG9wdGlvbnMud2lkdGgpLCB3aWR0aCk7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvMy5yZWdpc3RlclRyYWNrU3R5bGVzID0gZnVuY3Rpb24gcmVnaXN0ZXJUcmFja1N0eWxlcygpIHtcbiAgICB2YXIgX3RoaXM2ID0gdGhpcztcblxuICAgIHZhciBTdHlsZTIgPSB0aGlzLlN0eWxlO1xuICAgIHZhciBzZWxlY3RvciA9IFwiLlwiICsgQ0xBU1NfVFJBQ0s7XG4gICAgdGhpcy5icmVha3BvaW50cy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgdmFyIHdpZHRoID0gX3JlZjNbMF0sXG4gICAgICAgICAgb3B0aW9ucyA9IF9yZWYzWzFdO1xuICAgICAgU3R5bGUyLnJ1bGUoc2VsZWN0b3IsIF90aGlzNi5yZXNvbHZlKFwicGFkZGluZ0xlZnRcIiksIF90aGlzNi5jc3NQYWRkaW5nKG9wdGlvbnMsIGZhbHNlKSwgd2lkdGgpO1xuICAgICAgU3R5bGUyLnJ1bGUoc2VsZWN0b3IsIF90aGlzNi5yZXNvbHZlKFwicGFkZGluZ1JpZ2h0XCIpLCBfdGhpczYuY3NzUGFkZGluZyhvcHRpb25zLCB0cnVlKSwgd2lkdGgpO1xuICAgICAgU3R5bGUyLnJ1bGUoc2VsZWN0b3IsIFwiaGVpZ2h0XCIsIF90aGlzNi5jc3NUcmFja0hlaWdodChvcHRpb25zKSwgd2lkdGgpO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90bzMucmVnaXN0ZXJMaXN0U3R5bGVzID0gZnVuY3Rpb24gcmVnaXN0ZXJMaXN0U3R5bGVzKCkge1xuICAgIHZhciBfdGhpczcgPSB0aGlzO1xuXG4gICAgdmFyIFN0eWxlMiA9IHRoaXMuU3R5bGU7XG4gICAgdmFyIHNlbGVjdG9yID0gXCIuXCIgKyBDTEFTU19MSVNUO1xuICAgIHRoaXMuYnJlYWtwb2ludHMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjQpIHtcbiAgICAgIHZhciB3aWR0aCA9IF9yZWY0WzBdLFxuICAgICAgICAgIG9wdGlvbnMgPSBfcmVmNFsxXTtcbiAgICAgIFN0eWxlMi5ydWxlKHNlbGVjdG9yLCBcInRyYW5zZm9ybVwiLCBfdGhpczcuYnVpbGRUcmFuc2xhdGUob3B0aW9ucyksIHdpZHRoKTtcblxuICAgICAgaWYgKCFfdGhpczcuY3NzU2xpZGVIZWlnaHQob3B0aW9ucykpIHtcbiAgICAgICAgU3R5bGUyLnJ1bGUoc2VsZWN0b3IsIFwiYXNwZWN0LXJhdGlvXCIsIF90aGlzNy5jc3NBc3BlY3RSYXRpbyhvcHRpb25zKSwgd2lkdGgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90bzMucmVnaXN0ZXJTbGlkZVN0eWxlcyA9IGZ1bmN0aW9uIHJlZ2lzdGVyU2xpZGVTdHlsZXMoKSB7XG4gICAgdmFyIF90aGlzOCA9IHRoaXM7XG5cbiAgICB2YXIgU3R5bGUyID0gdGhpcy5TdHlsZTtcbiAgICB2YXIgc2VsZWN0b3IgPSBcIi5cIiArIENMQVNTX1NMSURFO1xuICAgIHRoaXMuYnJlYWtwb2ludHMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjUpIHtcbiAgICAgIHZhciB3aWR0aCA9IF9yZWY1WzBdLFxuICAgICAgICAgIG9wdGlvbnMgPSBfcmVmNVsxXTtcbiAgICAgIFN0eWxlMi5ydWxlKHNlbGVjdG9yLCBcIndpZHRoXCIsIF90aGlzOC5jc3NTbGlkZVdpZHRoKG9wdGlvbnMpLCB3aWR0aCk7XG4gICAgICBTdHlsZTIucnVsZShzZWxlY3RvciwgXCJoZWlnaHRcIiwgX3RoaXM4LmNzc1NsaWRlSGVpZ2h0KG9wdGlvbnMpIHx8IFwiMTAwJVwiLCB3aWR0aCk7XG4gICAgICBTdHlsZTIucnVsZShzZWxlY3RvciwgX3RoaXM4LnJlc29sdmUoXCJtYXJnaW5SaWdodFwiKSwgdW5pdChvcHRpb25zLmdhcCkgfHwgXCIwcHhcIiwgd2lkdGgpO1xuICAgICAgU3R5bGUyLnJ1bGUoc2VsZWN0b3IgKyBcIiA+IGltZ1wiLCBcImRpc3BsYXlcIiwgb3B0aW9ucy5jb3ZlciA/IFwibm9uZVwiIDogXCJpbmxpbmVcIiwgd2lkdGgpO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90bzMuYnVpbGRUcmFuc2xhdGUgPSBmdW5jdGlvbiBidWlsZFRyYW5zbGF0ZShvcHRpb25zKSB7XG4gICAgdmFyIF90aGlzJERpcmVjdGlvbiA9IHRoaXMuRGlyZWN0aW9uLFxuICAgICAgICByZXNvbHZlID0gX3RoaXMkRGlyZWN0aW9uLnJlc29sdmUsXG4gICAgICAgIG9yaWVudCA9IF90aGlzJERpcmVjdGlvbi5vcmllbnQ7XG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgIHZhbHVlcy5wdXNoKHRoaXMuY3NzT2Zmc2V0Q2xvbmVzKG9wdGlvbnMpKTtcbiAgICB2YWx1ZXMucHVzaCh0aGlzLmNzc09mZnNldEdhcHMob3B0aW9ucykpO1xuXG4gICAgaWYgKHRoaXMuaXNDZW50ZXIob3B0aW9ucykpIHtcbiAgICAgIHZhbHVlcy5wdXNoKHRoaXMuYnVpbGRDc3NWYWx1ZShvcmllbnQoLTUwKSwgXCIlXCIpKTtcbiAgICAgIHZhbHVlcy5wdXNoLmFwcGx5KHZhbHVlcywgdGhpcy5jc3NPZmZzZXRDZW50ZXIob3B0aW9ucykpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXMuZmlsdGVyKEJvb2xlYW4pLm1hcChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBcInRyYW5zbGF0ZVwiICsgcmVzb2x2ZShcIlhcIikgKyBcIihcIiArIHZhbHVlICsgXCIpXCI7XG4gICAgfSkuam9pbihcIiBcIik7XG4gIH07XG5cbiAgX3Byb3RvMy5jc3NPZmZzZXRDbG9uZXMgPSBmdW5jdGlvbiBjc3NPZmZzZXRDbG9uZXMob3B0aW9ucykge1xuICAgIHZhciBfdGhpcyREaXJlY3Rpb24yID0gdGhpcy5EaXJlY3Rpb24sXG4gICAgICAgIHJlc29sdmUgPSBfdGhpcyREaXJlY3Rpb24yLnJlc29sdmUsXG4gICAgICAgIG9yaWVudCA9IF90aGlzJERpcmVjdGlvbjIub3JpZW50O1xuICAgIHZhciBjbG9uZUNvdW50ID0gdGhpcy5nZXRDbG9uZUNvdW50KCk7XG5cbiAgICBpZiAodGhpcy5pc0ZpeGVkV2lkdGgob3B0aW9ucykpIHtcbiAgICAgIHZhciBfdGhpcyRwYXJzZUNzc1ZhbHVlID0gdGhpcy5wYXJzZUNzc1ZhbHVlKG9wdGlvbnNbcmVzb2x2ZShcImZpeGVkV2lkdGhcIildKSxcbiAgICAgICAgICB2YWx1ZSA9IF90aGlzJHBhcnNlQ3NzVmFsdWUudmFsdWUsXG4gICAgICAgICAgdW5pdDIgPSBfdGhpcyRwYXJzZUNzc1ZhbHVlLnVuaXQ7XG5cbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkQ3NzVmFsdWUob3JpZW50KHZhbHVlKSAqIGNsb25lQ291bnQsIHVuaXQyKTtcbiAgICB9XG5cbiAgICB2YXIgcGVyY2VudCA9IDEwMCAqIGNsb25lQ291bnQgLyBvcHRpb25zLnBlclBhZ2U7XG4gICAgcmV0dXJuIG9yaWVudChwZXJjZW50KSArIFwiJVwiO1xuICB9O1xuXG4gIF9wcm90bzMuY3NzT2Zmc2V0Q2VudGVyID0gZnVuY3Rpb24gY3NzT2Zmc2V0Q2VudGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXMkRGlyZWN0aW9uMyA9IHRoaXMuRGlyZWN0aW9uLFxuICAgICAgICByZXNvbHZlID0gX3RoaXMkRGlyZWN0aW9uMy5yZXNvbHZlLFxuICAgICAgICBvcmllbnQgPSBfdGhpcyREaXJlY3Rpb24zLm9yaWVudDtcblxuICAgIGlmICh0aGlzLmlzRml4ZWRXaWR0aChvcHRpb25zKSkge1xuICAgICAgdmFyIF90aGlzJHBhcnNlQ3NzVmFsdWUyID0gdGhpcy5wYXJzZUNzc1ZhbHVlKG9wdGlvbnNbcmVzb2x2ZShcImZpeGVkV2lkdGhcIildKSxcbiAgICAgICAgICB2YWx1ZSA9IF90aGlzJHBhcnNlQ3NzVmFsdWUyLnZhbHVlLFxuICAgICAgICAgIHVuaXQyID0gX3RoaXMkcGFyc2VDc3NWYWx1ZTIudW5pdDtcblxuICAgICAgcmV0dXJuIFt0aGlzLmJ1aWxkQ3NzVmFsdWUob3JpZW50KHZhbHVlIC8gMiksIHVuaXQyKV07XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgIHZhciBwZXJQYWdlID0gb3B0aW9ucy5wZXJQYWdlLFxuICAgICAgICBnYXAgPSBvcHRpb25zLmdhcDtcbiAgICB2YWx1ZXMucHVzaChvcmllbnQoNTAgLyBwZXJQYWdlKSArIFwiJVwiKTtcblxuICAgIGlmIChnYXApIHtcbiAgICAgIHZhciBfdGhpcyRwYXJzZUNzc1ZhbHVlMyA9IHRoaXMucGFyc2VDc3NWYWx1ZShnYXApLFxuICAgICAgICAgIF92YWx1ZSA9IF90aGlzJHBhcnNlQ3NzVmFsdWUzLnZhbHVlLFxuICAgICAgICAgIF91bml0ID0gX3RoaXMkcGFyc2VDc3NWYWx1ZTMudW5pdDtcblxuICAgICAgdmFyIGdhcE9mZnNldCA9IChfdmFsdWUgLyBwZXJQYWdlIC0gX3ZhbHVlKSAvIDI7XG4gICAgICB2YWx1ZXMucHVzaCh0aGlzLmJ1aWxkQ3NzVmFsdWUob3JpZW50KGdhcE9mZnNldCksIF91bml0KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfTtcblxuICBfcHJvdG8zLmNzc09mZnNldEdhcHMgPSBmdW5jdGlvbiBjc3NPZmZzZXRHYXBzKG9wdGlvbnMpIHtcbiAgICB2YXIgY2xvbmVDb3VudCA9IHRoaXMuZ2V0Q2xvbmVDb3VudCgpO1xuXG4gICAgaWYgKGNsb25lQ291bnQgJiYgb3B0aW9ucy5nYXApIHtcbiAgICAgIHZhciBvcmllbnQgPSB0aGlzLkRpcmVjdGlvbi5vcmllbnQ7XG5cbiAgICAgIHZhciBfdGhpcyRwYXJzZUNzc1ZhbHVlNCA9IHRoaXMucGFyc2VDc3NWYWx1ZShvcHRpb25zLmdhcCksXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRwYXJzZUNzc1ZhbHVlNC52YWx1ZSxcbiAgICAgICAgICB1bml0MiA9IF90aGlzJHBhcnNlQ3NzVmFsdWU0LnVuaXQ7XG5cbiAgICAgIGlmICh0aGlzLmlzRml4ZWRXaWR0aChvcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZENzc1ZhbHVlKG9yaWVudCh2YWx1ZSAqIGNsb25lQ291bnQpLCB1bml0Mik7XG4gICAgICB9XG5cbiAgICAgIHZhciBwZXJQYWdlID0gb3B0aW9ucy5wZXJQYWdlO1xuICAgICAgdmFyIGdhcHMgPSBjbG9uZUNvdW50IC8gcGVyUGFnZTtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkQ3NzVmFsdWUob3JpZW50KGdhcHMgKiB2YWx1ZSksIHVuaXQyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gXCJcIjtcbiAgfTtcblxuICBfcHJvdG8zLnJlc29sdmUgPSBmdW5jdGlvbiByZXNvbHZlKHByb3ApIHtcbiAgICByZXR1cm4gY2FtZWxUb0tlYmFiKHRoaXMuRGlyZWN0aW9uLnJlc29sdmUocHJvcCkpO1xuICB9O1xuXG4gIF9wcm90bzMuY3NzUGFkZGluZyA9IGZ1bmN0aW9uIGNzc1BhZGRpbmcob3B0aW9ucywgcmlnaHQpIHtcbiAgICB2YXIgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZztcbiAgICB2YXIgcHJvcCA9IHRoaXMuRGlyZWN0aW9uLnJlc29sdmUocmlnaHQgPyBcInJpZ2h0XCIgOiBcImxlZnRcIiwgdHJ1ZSk7XG4gICAgcmV0dXJuIHBhZGRpbmcgJiYgdW5pdChwYWRkaW5nW3Byb3BdIHx8IChpc09iamVjdChwYWRkaW5nKSA/IDAgOiBwYWRkaW5nKSkgfHwgXCIwcHhcIjtcbiAgfTtcblxuICBfcHJvdG8zLmNzc1RyYWNrSGVpZ2h0ID0gZnVuY3Rpb24gY3NzVHJhY2tIZWlnaHQob3B0aW9ucykge1xuICAgIHZhciBoZWlnaHQgPSBcIlwiO1xuXG4gICAgaWYgKHRoaXMuaXNWZXJ0aWNhbCgpKSB7XG4gICAgICBoZWlnaHQgPSB0aGlzLmNzc0hlaWdodChvcHRpb25zKTtcbiAgICAgIGFzc2VydChoZWlnaHQsICdcImhlaWdodFwiIGlzIG1pc3NpbmcuJyk7XG4gICAgICBoZWlnaHQgPSBcImNhbGMoXCIgKyBoZWlnaHQgKyBcIiAtIFwiICsgdGhpcy5jc3NQYWRkaW5nKG9wdGlvbnMsIGZhbHNlKSArIFwiIC0gXCIgKyB0aGlzLmNzc1BhZGRpbmcob3B0aW9ucywgdHJ1ZSkgKyBcIilcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gaGVpZ2h0O1xuICB9O1xuXG4gIF9wcm90bzMuY3NzSGVpZ2h0ID0gZnVuY3Rpb24gY3NzSGVpZ2h0KG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdW5pdChvcHRpb25zLmhlaWdodCk7XG4gIH07XG5cbiAgX3Byb3RvMy5jc3NTbGlkZVdpZHRoID0gZnVuY3Rpb24gY3NzU2xpZGVXaWR0aChvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuYXV0b1dpZHRoID8gXCJcIiA6IHVuaXQob3B0aW9ucy5maXhlZFdpZHRoKSB8fCAodGhpcy5pc1ZlcnRpY2FsKCkgPyBcIlwiIDogdGhpcy5jc3NTbGlkZVNpemUob3B0aW9ucykpO1xuICB9O1xuXG4gIF9wcm90bzMuY3NzU2xpZGVIZWlnaHQgPSBmdW5jdGlvbiBjc3NTbGlkZUhlaWdodChvcHRpb25zKSB7XG4gICAgcmV0dXJuIHVuaXQob3B0aW9ucy5maXhlZEhlaWdodCkgfHwgKHRoaXMuaXNWZXJ0aWNhbCgpID8gb3B0aW9ucy5hdXRvSGVpZ2h0ID8gXCJcIiA6IHRoaXMuY3NzU2xpZGVTaXplKG9wdGlvbnMpIDogdGhpcy5jc3NIZWlnaHQob3B0aW9ucykpO1xuICB9O1xuXG4gIF9wcm90bzMuY3NzU2xpZGVTaXplID0gZnVuY3Rpb24gY3NzU2xpZGVTaXplKG9wdGlvbnMpIHtcbiAgICB2YXIgZ2FwID0gdW5pdChvcHRpb25zLmdhcCk7XG4gICAgcmV0dXJuIFwiY2FsYygoMTAwJVwiICsgKGdhcCAmJiBcIiArIFwiICsgZ2FwKSArIFwiKS9cIiArIChvcHRpb25zLnBlclBhZ2UgfHwgMSkgKyAoZ2FwICYmIFwiIC0gXCIgKyBnYXApICsgXCIpXCI7XG4gIH07XG5cbiAgX3Byb3RvMy5jc3NBc3BlY3RSYXRpbyA9IGZ1bmN0aW9uIGNzc0FzcGVjdFJhdGlvKG9wdGlvbnMpIHtcbiAgICB2YXIgaGVpZ2h0UmF0aW8gPSBvcHRpb25zLmhlaWdodFJhdGlvO1xuICAgIHJldHVybiBoZWlnaHRSYXRpbyA/IFwiXCIgKyAxIC8gaGVpZ2h0UmF0aW8gOiBcIlwiO1xuICB9O1xuXG4gIF9wcm90bzMuYnVpbGRDc3NWYWx1ZSA9IGZ1bmN0aW9uIGJ1aWxkQ3NzVmFsdWUodmFsdWUsIHVuaXQyKSB7XG4gICAgcmV0dXJuIFwiXCIgKyB2YWx1ZSArIHVuaXQyO1xuICB9O1xuXG4gIF9wcm90bzMucGFyc2VDc3NWYWx1ZSA9IGZ1bmN0aW9uIHBhcnNlQ3NzVmFsdWUodmFsdWUpIHtcbiAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICB2YXIgbnVtYmVyID0gcGFyc2VGbG9hdCh2YWx1ZSkgfHwgMDtcbiAgICAgIHZhciB1bml0MiA9IHZhbHVlLnJlcGxhY2UoL1xcZCooXFwuXFxkKik/LywgXCJcIikgfHwgXCJweFwiO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IG51bWJlcixcbiAgICAgICAgdW5pdDogdW5pdDJcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIHVuaXQ6IFwicHhcIlxuICAgIH07XG4gIH07XG5cbiAgX3Byb3RvMy5wYXJzZUJyZWFrcG9pbnRzID0gZnVuY3Rpb24gcGFyc2VCcmVha3BvaW50cygpIHtcbiAgICB2YXIgX3RoaXM5ID0gdGhpcztcblxuICAgIHZhciBicmVha3BvaW50cyA9IHRoaXMub3B0aW9ucy5icmVha3BvaW50cztcbiAgICB0aGlzLmJyZWFrcG9pbnRzLnB1c2goW1wiZGVmYXVsdFwiLCB0aGlzLm9wdGlvbnNdKTtcblxuICAgIGlmIChicmVha3BvaW50cykge1xuICAgICAgZm9yT3duKGJyZWFrcG9pbnRzLCBmdW5jdGlvbiAob3B0aW9ucywgd2lkdGgpIHtcbiAgICAgICAgX3RoaXM5LmJyZWFrcG9pbnRzLnB1c2goW3dpZHRoLCBtZXJnZShtZXJnZSh7fSwgX3RoaXM5Lm9wdGlvbnMpLCBvcHRpb25zKV0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90bzMuaXNGaXhlZFdpZHRoID0gZnVuY3Rpb24gaXNGaXhlZFdpZHRoKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gISFvcHRpb25zW3RoaXMuRGlyZWN0aW9uLnJlc29sdmUoXCJmaXhlZFdpZHRoXCIpXTtcbiAgfTtcblxuICBfcHJvdG8zLmlzTG9vcCA9IGZ1bmN0aW9uIGlzTG9vcCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnR5cGUgPT09IExPT1A7XG4gIH07XG5cbiAgX3Byb3RvMy5pc0NlbnRlciA9IGZ1bmN0aW9uIGlzQ2VudGVyKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5mb2N1cyA9PT0gXCJjZW50ZXJcIikge1xuICAgICAgaWYgKHRoaXMuaXNMb29wKCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudHlwZSA9PT0gU0xJREUpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLm9wdGlvbnMudHJpbVNwYWNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBfcHJvdG8zLmlzVmVydGljYWwgPSBmdW5jdGlvbiBpc1ZlcnRpY2FsKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uID09PSBUVEI7XG4gIH07XG5cbiAgX3Byb3RvMy5idWlsZENsYXNzZXMgPSBmdW5jdGlvbiBidWlsZENsYXNzZXMoKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgcmV0dXJuIFtDTEFTU19ST09ULCBDTEFTU19ST09UICsgXCItLVwiICsgb3B0aW9ucy50eXBlLCBDTEFTU19ST09UICsgXCItLVwiICsgb3B0aW9ucy5kaXJlY3Rpb24sIG9wdGlvbnMuZHJhZyAmJiBDTEFTU19ST09UICsgXCItLWRyYWdnYWJsZVwiLCBvcHRpb25zLmlzTmF2aWdhdGlvbiAmJiBDTEFTU19ST09UICsgXCItLW5hdlwiLCBDTEFTU19BQ1RJVkUsICF0aGlzLmNvbmZpZy5oaWRkZW4gJiYgQ0xBU1NfUkVOREVSRURdLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKTtcbiAgfTtcblxuICBfcHJvdG8zLmJ1aWxkQXR0cnMgPSBmdW5jdGlvbiBidWlsZEF0dHJzKGF0dHJzKSB7XG4gICAgdmFyIGF0dHIgPSBcIlwiO1xuICAgIGZvck93bihhdHRycywgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIGF0dHIgKz0gdmFsdWUgPyBcIiBcIiArIGNhbWVsVG9LZWJhYihrZXkpICsgXCI9XFxcIlwiICsgdmFsdWUgKyBcIlxcXCJcIiA6IFwiXCI7XG4gICAgfSk7XG4gICAgcmV0dXJuIGF0dHIudHJpbSgpO1xuICB9O1xuXG4gIF9wcm90bzMuYnVpbGRTdHlsZXMgPSBmdW5jdGlvbiBidWlsZFN0eWxlcyhzdHlsZXMpIHtcbiAgICB2YXIgc3R5bGUgPSBcIlwiO1xuICAgIGZvck93bihzdHlsZXMsIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICBzdHlsZSArPSBcIiBcIiArIGNhbWVsVG9LZWJhYihrZXkpICsgXCI6XCIgKyB2YWx1ZSArIFwiO1wiO1xuICAgIH0pO1xuICAgIHJldHVybiBzdHlsZS50cmltKCk7XG4gIH07XG5cbiAgX3Byb3RvMy5yZW5kZXJTbGlkZXMgPSBmdW5jdGlvbiByZW5kZXJTbGlkZXMoKSB7XG4gICAgdmFyIF90aGlzMTAgPSB0aGlzO1xuXG4gICAgdmFyIHRhZyA9IHRoaXMuY29uZmlnLnNsaWRlVGFnO1xuICAgIHJldHVybiB0aGlzLnNsaWRlcy5tYXAoZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgICAgIHJldHVybiBcIjxcIiArIHRhZyArIFwiIFwiICsgX3RoaXMxMC5idWlsZEF0dHJzKGNvbnRlbnQuYXR0cnMpICsgXCI+XCIgKyAoY29udGVudC5odG1sIHx8IFwiXCIpICsgXCI8L1wiICsgdGFnICsgXCI+XCI7XG4gICAgfSkuam9pbihcIlwiKTtcbiAgfTtcblxuICBfcHJvdG8zLmNvdmVyID0gZnVuY3Rpb24gY292ZXIoY29udGVudCkge1xuICAgIHZhciBzdHlsZXMgPSBjb250ZW50LnN0eWxlcyxcbiAgICAgICAgX2NvbnRlbnQkaHRtbCA9IGNvbnRlbnQuaHRtbCxcbiAgICAgICAgaHRtbCA9IF9jb250ZW50JGh0bWwgPT09IHZvaWQgMCA/IFwiXCIgOiBfY29udGVudCRodG1sO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb3ZlciAmJiAhdGhpcy5vcHRpb25zLmxhenlMb2FkKSB7XG4gICAgICB2YXIgc3JjID0gaHRtbC5tYXRjaCgvPGltZy4qP3NyY1xccyo9XFxzKihbJ1wiXSkoLis/KVxcMS4qPz4vKTtcblxuICAgICAgaWYgKHNyYyAmJiBzcmNbMl0pIHtcbiAgICAgICAgc3R5bGVzLmJhY2tncm91bmQgPSBcImNlbnRlci9jb3ZlciBuby1yZXBlYXQgdXJsKCdcIiArIHNyY1syXSArIFwiJylcIjtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvMy5nZW5lcmF0ZUNsb25lcyA9IGZ1bmN0aW9uIGdlbmVyYXRlQ2xvbmVzKGNvbnRlbnRzKSB7XG4gICAgdmFyIGNsYXNzZXMgPSB0aGlzLm9wdGlvbnMuY2xhc3NlcztcbiAgICB2YXIgY291bnQgPSB0aGlzLmdldENsb25lQ291bnQoKTtcbiAgICB2YXIgc2xpZGVzID0gY29udGVudHMuc2xpY2UoKTtcblxuICAgIHdoaWxlIChzbGlkZXMubGVuZ3RoIDwgY291bnQpIHtcbiAgICAgIHB1c2goc2xpZGVzLCBzbGlkZXMpO1xuICAgIH1cblxuICAgIHB1c2goc2xpZGVzLnNsaWNlKC1jb3VudCkucmV2ZXJzZSgpLCBzbGlkZXMuc2xpY2UoMCwgY291bnQpKS5mb3JFYWNoKGZ1bmN0aW9uIChjb250ZW50LCBpbmRleCkge1xuICAgICAgdmFyIGF0dHJzID0gYXNzaWduKHt9LCBjb250ZW50LmF0dHJzLCB7XG4gICAgICAgIGNsYXNzOiBjb250ZW50LmF0dHJzLmNsYXNzICsgXCIgXCIgKyBjbGFzc2VzLmNsb25lXG4gICAgICB9KTtcbiAgICAgIHZhciBjbG9uZSA9IGFzc2lnbih7fSwgY29udGVudCwge1xuICAgICAgICBhdHRyczogYXR0cnNcbiAgICAgIH0pO1xuICAgICAgaW5kZXggPCBjb3VudCA/IGNvbnRlbnRzLnVuc2hpZnQoY2xvbmUpIDogY29udGVudHMucHVzaChjbG9uZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvMy5nZXRDbG9uZUNvdW50ID0gZnVuY3Rpb24gZ2V0Q2xvbmVDb3VudCgpIHtcbiAgICBpZiAodGhpcy5pc0xvb3AoKSkge1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgIGlmIChvcHRpb25zLmNsb25lcykge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5jbG9uZXM7XG4gICAgICB9XG5cbiAgICAgIHZhciBwZXJQYWdlID0gbWF4LmFwcGx5KHZvaWQgMCwgdGhpcy5icmVha3BvaW50cy5tYXAoZnVuY3Rpb24gKF9yZWY2KSB7XG4gICAgICAgIHZhciBvcHRpb25zMiA9IF9yZWY2WzFdO1xuICAgICAgICByZXR1cm4gb3B0aW9uczIucGVyUGFnZTtcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybiBwZXJQYWdlICogKChvcHRpb25zLmZsaWNrTWF4UGFnZXMgfHwgMSkgKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfTtcblxuICBfcHJvdG8zLnJlbmRlckFycm93cyA9IGZ1bmN0aW9uIHJlbmRlckFycm93cygpIHtcbiAgICB2YXIgaHRtbCA9IFwiXCI7XG4gICAgaHRtbCArPSBcIjxkaXYgY2xhc3M9XFxcIlwiICsgdGhpcy5vcHRpb25zLmNsYXNzZXMuYXJyb3dzICsgXCJcXFwiPlwiO1xuICAgIGh0bWwgKz0gdGhpcy5yZW5kZXJBcnJvdyh0cnVlKTtcbiAgICBodG1sICs9IHRoaXMucmVuZGVyQXJyb3coZmFsc2UpO1xuICAgIGh0bWwgKz0gXCI8L2Rpdj5cIjtcbiAgICByZXR1cm4gaHRtbDtcbiAgfTtcblxuICBfcHJvdG8zLnJlbmRlckFycm93ID0gZnVuY3Rpb24gcmVuZGVyQXJyb3cocHJldikge1xuICAgIHZhciBfdGhpcyRvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBjbGFzc2VzID0gX3RoaXMkb3B0aW9ucy5jbGFzc2VzLFxuICAgICAgICBpMThuID0gX3RoaXMkb3B0aW9ucy5pMThuO1xuICAgIHZhciBhdHRycyA9IHtcbiAgICAgIGNsYXNzOiBjbGFzc2VzLmFycm93ICsgXCIgXCIgKyAocHJldiA/IGNsYXNzZXMucHJldiA6IGNsYXNzZXMubmV4dCksXG4gICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgYXJpYUxhYmVsOiBwcmV2ID8gaTE4bi5wcmV2IDogaTE4bi5uZXh0XG4gICAgfTtcbiAgICByZXR1cm4gXCI8YnV0dG9uIFwiICsgdGhpcy5idWlsZEF0dHJzKGF0dHJzKSArIFwiPjxzdmcgeG1sbnM9XFxcIlwiICsgWE1MX05BTUVfU1BBQ0UgKyBcIlxcXCIgdmlld0JveD1cXFwiMCAwIFwiICsgU0laRSArIFwiIFwiICsgU0laRSArIFwiXFxcIiB3aWR0aD1cXFwiXCIgKyBTSVpFICsgXCJcXFwiIGhlaWdodD1cXFwiXCIgKyBTSVpFICsgXCJcXFwiPjxwYXRoIGQ9XFxcIlwiICsgKHRoaXMub3B0aW9ucy5hcnJvd1BhdGggfHwgUEFUSCkgKyBcIlxcXCIgLz48L3N2Zz48L2J1dHRvbj5cIjtcbiAgfTtcblxuICBfcHJvdG8zLmh0bWwgPSBmdW5jdGlvbiBodG1sKCkge1xuICAgIHZhciBfdGhpcyRjb25maWcgPSB0aGlzLmNvbmZpZyxcbiAgICAgICAgcm9vdENsYXNzID0gX3RoaXMkY29uZmlnLnJvb3RDbGFzcyxcbiAgICAgICAgbGlzdFRhZyA9IF90aGlzJGNvbmZpZy5saXN0VGFnLFxuICAgICAgICBhcnJvd3MgPSBfdGhpcyRjb25maWcuYXJyb3dzLFxuICAgICAgICBiZWZvcmVUcmFjayA9IF90aGlzJGNvbmZpZy5iZWZvcmVUcmFjayxcbiAgICAgICAgYWZ0ZXJUcmFjayA9IF90aGlzJGNvbmZpZy5hZnRlclRyYWNrLFxuICAgICAgICBzbGlkZXIgPSBfdGhpcyRjb25maWcuc2xpZGVyLFxuICAgICAgICBiZWZvcmVTbGlkZXIgPSBfdGhpcyRjb25maWcuYmVmb3JlU2xpZGVyLFxuICAgICAgICBhZnRlclNsaWRlciA9IF90aGlzJGNvbmZpZy5hZnRlclNsaWRlcjtcbiAgICB2YXIgaHRtbCA9IFwiXCI7XG4gICAgaHRtbCArPSBcIjxkaXYgaWQ9XFxcIlwiICsgdGhpcy5pZCArIFwiXFxcIiBjbGFzcz1cXFwiXCIgKyB0aGlzLmJ1aWxkQ2xhc3NlcygpICsgXCIgXCIgKyAocm9vdENsYXNzIHx8IFwiXCIpICsgXCJcXFwiPlwiO1xuICAgIGh0bWwgKz0gXCI8c3R5bGU+XCIgKyB0aGlzLlN0eWxlLmJ1aWxkKCkgKyBcIjwvc3R5bGU+XCI7XG5cbiAgICBpZiAoc2xpZGVyKSB7XG4gICAgICBodG1sICs9IGJlZm9yZVNsaWRlciB8fCBcIlwiO1xuICAgICAgaHRtbCArPSBcIjxkaXYgY2xhc3M9XFxcInNwbGlkZV9fc2xpZGVyXFxcIj5cIjtcbiAgICB9XG5cbiAgICBodG1sICs9IGJlZm9yZVRyYWNrIHx8IFwiXCI7XG5cbiAgICBpZiAoYXJyb3dzKSB7XG4gICAgICBodG1sICs9IHRoaXMucmVuZGVyQXJyb3dzKCk7XG4gICAgfVxuXG4gICAgaHRtbCArPSBcIjxkaXYgY2xhc3M9XFxcInNwbGlkZV9fdHJhY2tcXFwiPlwiO1xuICAgIGh0bWwgKz0gXCI8XCIgKyBsaXN0VGFnICsgXCIgY2xhc3M9XFxcInNwbGlkZV9fbGlzdFxcXCI+XCI7XG4gICAgaHRtbCArPSB0aGlzLnJlbmRlclNsaWRlcygpO1xuICAgIGh0bWwgKz0gXCI8L1wiICsgbGlzdFRhZyArIFwiPlwiO1xuICAgIGh0bWwgKz0gXCI8L2Rpdj5cIjtcbiAgICBodG1sICs9IGFmdGVyVHJhY2sgfHwgXCJcIjtcblxuICAgIGlmIChzbGlkZXIpIHtcbiAgICAgIGh0bWwgKz0gXCI8L2Rpdj5cIjtcbiAgICAgIGh0bWwgKz0gYWZ0ZXJTbGlkZXIgfHwgXCJcIjtcbiAgICB9XG5cbiAgICBodG1sICs9IFwiPC9kaXY+XCI7XG4gICAgcmV0dXJuIGh0bWw7XG4gIH07XG5cbiAgcmV0dXJuIFNwbGlkZVJlbmRlcmVyO1xufSgpO1xuXG5leHBvcnQgeyBDTEFTU0VTLCBDTEFTU19BQ1RJVkUsIENMQVNTX0FSUk9XLCBDTEFTU19BUlJPV1MsIENMQVNTX0FSUk9XX05FWFQsIENMQVNTX0FSUk9XX1BSRVYsIENMQVNTX0NMT05FLCBDTEFTU19DT05UQUlORVIsIENMQVNTX0ZPQ1VTX0lOLCBDTEFTU19JTklUSUFMSVpFRCwgQ0xBU1NfTElTVCwgQ0xBU1NfTE9BRElORywgQ0xBU1NfTkVYVCwgQ0xBU1NfUEFHSU5BVElPTiwgQ0xBU1NfUEFHSU5BVElPTl9QQUdFLCBDTEFTU19QUkVWLCBDTEFTU19QUk9HUkVTUywgQ0xBU1NfUFJPR1JFU1NfQkFSLCBDTEFTU19ST09ULCBDTEFTU19TTElERSwgQ0xBU1NfU1BJTk5FUiwgQ0xBU1NfU1IsIENMQVNTX1RPR0dMRSwgQ0xBU1NfVE9HR0xFX1BBVVNFLCBDTEFTU19UT0dHTEVfUExBWSwgQ0xBU1NfVFJBQ0ssIENMQVNTX1ZJU0lCTEUsIERFRkFVTFRTLCBFVkVOVF9BQ1RJVkUsIEVWRU5UX0FSUk9XU19NT1VOVEVELCBFVkVOVF9BUlJPV1NfVVBEQVRFRCwgRVZFTlRfQVVUT1BMQVlfUEFVU0UsIEVWRU5UX0FVVE9QTEFZX1BMQVksIEVWRU5UX0FVVE9QTEFZX1BMQVlJTkcsIEVWRU5UX0NMSUNLLCBFVkVOVF9ERVNUUk9ZLCBFVkVOVF9EUkFHLCBFVkVOVF9EUkFHR0VELCBFVkVOVF9EUkFHR0lORywgRVZFTlRfSElEREVOLCBFVkVOVF9JTkFDVElWRSwgRVZFTlRfTEFaWUxPQURfTE9BREVELCBFVkVOVF9NT1VOVEVELCBFVkVOVF9NT1ZFLCBFVkVOVF9NT1ZFRCwgRVZFTlRfTkFWSUdBVElPTl9NT1VOVEVELCBFVkVOVF9QQUdJTkFUSU9OX01PVU5URUQsIEVWRU5UX1BBR0lOQVRJT05fVVBEQVRFRCwgRVZFTlRfUkVBRFksIEVWRU5UX1JFRlJFU0gsIEVWRU5UX1JFU0laRSwgRVZFTlRfUkVTSVpFRCwgRVZFTlRfU0NST0xMLCBFVkVOVF9TQ1JPTExFRCwgRVZFTlRfU0hJRlRFRCwgRVZFTlRfU0xJREVfS0VZRE9XTiwgRVZFTlRfVVBEQVRFRCwgRVZFTlRfVklTSUJMRSwgRXZlbnRCaW5kZXIsIEV2ZW50SW50ZXJmYWNlLCBGQURFLCBMT09QLCBMVFIsIFJUTCwgUmVxdWVzdEludGVydmFsLCBTTElERSwgU1RBVFVTX0NMQVNTRVMsIFNwbGlkZSwgU3BsaWRlUmVuZGVyZXIsIFN0YXRlLCBUVEIsIFRocm90dGxlLCBTcGxpZGUgYXMgZGVmYXVsdCB9O1xuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIGRlZmluaXRpb24pIHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqLCBwcm9wKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTsgfSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0IFNwbGlkZSBmcm9tICdAc3BsaWRlanMvc3BsaWRlJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gREFUQVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBVVElMU1xuXG5jb25zdCBib2R5ID0gZG9jdW1lbnQuYm9keTtcblxuLy8gU1BMSURFIFNMSURFUlxuXG5jb25zdCBsb2dvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmxvZ29fX2ljb24nKTtcbmxldCBzbGlkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc3BsaWRlJyk7XG5jb25zdCBzbGlkZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3BsaWRlX19zbGlkZScpO1xuXG4vLyBFWEhJQklUSU9OIElGUkFNRVxuXG5jb25zdCBzaWRlYmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNpZGViYXInKTtcbmNvbnN0IHNpZGViYXJOYXZMaW5rcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zaWRlYmFyX19uYXYtbGluay0taWZyYW1lJyk7XG5jb25zdCBleGhpYml0aW9uSWZyYW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmV4aGliaXRpb24nKTtcblxuLy8gTkFWIExJTktTIFRBUkdFVFxuXG5jb25zdCBtZWRpYVF1ZXJpZXMgPSB7XG5cdHJlbVRhYmxldFdpZHRoOiA0OCxcbiAgICByZW1EZXNrdG9wV2lkdGg6IDYyXG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIExPR0lDXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIFVUSUxTXG5cbi8vIEVuYWJsZSBDU1MgOmFjdGl2ZSBwc2V1ZG8tY2xhc3MgaW4gU2FmYXJpIE1vYmlsZVxuZnVuY3Rpb24gZW5hYmxlQWN0aXZlUHNldWRvQ2xhc3MoKSB7XG5cdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIGZ1bmN0aW9uKCkge30sZmFsc2UpO1xufVxuXG4vLyBDb252ZXJ0IHJlbSB0byBwaXhlbHMgYnkgZ2V0dGluZyBmb250LXNpemUgQ1NTIHByb3BlcnR5XG5mdW5jdGlvbiBjb252ZXJ0UmVtVG9QaXhlbHMocmVtKSB7XG5cdGxldCBmb250U2l6ZSA9IHBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUoYm9keSkuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udC1zaXplJykpO1xuXHRyZXR1cm4gcmVtICogZm9udFNpemU7XG59XG5cbi8vIFNQTElERSBTTElERVJcblxuZnVuY3Rpb24gc2V0VXBTbGlkZXIoKSB7XG5cdGlmIChzbGlkZXIpIHtcblx0XHRzbGlkZXIgPSBuZXcgU3BsaWRlKCcuc3BsaWRlJywge1xuXHRcdFx0dHlwZTogJ2ZhZGUnLFxuXHRcdFx0cmV3aW5kOiB0cnVlLFxuXHRcdFx0cmV3aW5kQnlEcmFnOiB0cnVlLFxuXHRcdFx0c3BlZWQ6IDQwMCxcblx0XHRcdGZpeGVkV2lkdGg6ICcxMDB2dycsXG5cdFx0XHRmaXhlZEhlaWdodDogJzEwMHZoJyxcblx0XHRcdGFycm93czogZmFsc2UsXG5cdFx0XHRwYWdpbmF0aW9uOiBmYWxzZSxcblx0XHRcdGVhc2luZzogJ2Vhc2UtaW4tb3V0Jyxcblx0XHRcdGRyYWc6IHRydWUsXG5cdFx0XHR3aGVlbDogdHJ1ZVxuXHRcdH0pO1xuXHR9XG59XG5cbmZ1bmN0aW9uIG1vdW50U2xpZGVyKCkge1xuXHRpZiAoc2xpZGVyKSB7XG5cdFx0c2xpZGVyLm1vdW50KCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ29Ub05leHRTbGlkZU9uQ2xpY2soKSB7XG5cdGlmIChzbGlkZXIpIHtcblx0XHRzbGlkZXIub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xuXHRcdFx0c2xpZGVyLmdvKCc+Jyk7XG5cdFx0fSk7XHRcdFxuXHR9XG59XG5cbmZ1bmN0aW9uIHR1cm5Mb2dvVG9CbGFjaygpIHtcblx0aWYgKGxvZ28pIHtcblx0XHRsb2dvLmNsYXNzTGlzdC5yZW1vdmUoJ2xvZ29fX2ljb24tLXdoaXRlJyk7XG5cdFx0bG9nby5jbGFzc0xpc3QuYWRkKCdsb2dvX19pY29uLS1ibGFjaycpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHR1cm5Mb2dvVG9XaGl0ZSgpIHtcblx0aWYgKGxvZ28pIHtcblx0XHRsb2dvLmNsYXNzTGlzdC5yZW1vdmUoJ2xvZ29fX2ljb24tLWJsYWNrJyk7XG5cdFx0bG9nby5jbGFzc0xpc3QuYWRkKCdsb2dvX19pY29uLS13aGl0ZScpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGVkaXRMb2dvQ29sb3Ioc2xpZGUpIHtcblx0aWYgKHNsaWRlKSB7XG5cdFx0aWYgKHNsaWRlLmdldEF0dHJpYnV0ZSgnZGF0YS1sb2dvLWNvbG9yJykgPT09ICd3aGl0ZScpIHtcblx0XHRcdHR1cm5Mb2dvVG9XaGl0ZSgpO1xuXHRcdH0gZWxzZSBpZiAoc2xpZGUuZ2V0QXR0cmlidXRlKCdkYXRhLWxvZ28tY29sb3InKSA9PT0gJ2JsYWNrJykge1xuXHRcdFx0dHVybkxvZ29Ub0JsYWNrKCk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGVkaXRMb2dvQ29sb3JPblNsaWRlck1vdW50ZWQoKSB7XG5cdGlmIChzbGlkZXIgJiYgc2xpZGVzKSB7XG5cdFx0c2xpZGVyLm9uKCdtb3VudGVkJywgZnVuY3Rpb24oKSB7XG5cdFx0XHRlZGl0TG9nb0NvbG9yKHNsaWRlc1swXSk7XG5cdFx0fSlcblx0fVxufVxuXG5mdW5jdGlvbiBlZGl0TG9nb0NvbG9yT25TbGlkZUFjdGl2ZSgpIHtcblx0aWYgKHNsaWRlcikge1xuXHRcdHNsaWRlci5vbignYWN0aXZlJywgZnVuY3Rpb24oZSkge1xuXHRcdFx0ZWRpdExvZ29Db2xvcihlLnNsaWRlKTtcblx0XHR9KTtcblx0fVxufVxuXG5mdW5jdGlvbiBlbmFibGVMb2dvUm90YXRpb24oKSB7XG5cdGlmIChsb2dvKSB7XG5cdFx0bG9nby5jbGFzc0xpc3QuYWRkKCdsb2dvX19pY29uLS1yb3RhdGUtaG9yaXpvbnRhbC1ib3R0b20nKTtcblx0fVxufVxuXG5mdW5jdGlvbiBkaXNhYmxlTG9nb1JvdGF0aW9uKCkge1xuXHRpZiAobG9nbykge1xuXHRcdGxvZ28uY2xhc3NMaXN0LnJlbW92ZSgnbG9nb19faWNvbi0tcm90YXRlLWhvcml6b250YWwtYm90dG9tJyk7XG5cdH1cbn1cblxuZnVuY3Rpb24gcm90YXRlTG9nb09uU2xpZGVyTW92ZSgpIHtcblx0aWYgKHNsaWRlciAmJiBsb2dvKSB7XG5cdFx0c2xpZGVyLm9uKCdtb3ZlJywgZnVuY3Rpb24oZSkge1xuXHRcdFx0bG9nby5yZW1vdmVFdmVudExpc3RlbmVyKCdhbmltYXRpb25pdGVyYXRpb24nLCBkaXNhYmxlTG9nb1JvdGF0aW9uKTtcblx0XHRcdGVuYWJsZUxvZ29Sb3RhdGlvbigpO1xuXHRcdH0pO1xuXHRcdHNsaWRlci5vbignbW92ZWQnLCBmdW5jdGlvbihlKSB7XG5cdFx0XHRsb2dvLmFkZEV2ZW50TGlzdGVuZXIoJ2FuaW1hdGlvbml0ZXJhdGlvbicsIGRpc2FibGVMb2dvUm90YXRpb24pO1xuXHRcdH0pO1xuXHR9XG59XG5cbi8vIEVYSElCSVRJT04gSUZSQU1FXG5cbmZ1bmN0aW9uIHNsaW1Eb3duU2lkZWJhcigpIHtcblx0aWYgKHNpZGViYXIgJiYgIXNpZGViYXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaWRlYmFyLS1zbGltbWVkJykpIHtcblx0XHRzaWRlYmFyLmNsYXNzTGlzdC5hZGQoJ3NpZGViYXItLXNsaW1tZWQnKTtcblx0fVxufVxuXG5mdW5jdGlvbiBlbmFibGVFeGhpYml0aW9uSWZyYW1lVmlzaWJpbGl0eSgpIHtcblx0aWYgKGV4aGliaXRpb25JZnJhbWUpIHtcblx0XHRleGhpYml0aW9uSWZyYW1lLmNsYXNzTGlzdC5hZGQoJ2V4aGliaXRpb24tLXZpc2libGUnKTtcblx0fVxufVxuXG5mdW5jdGlvbiBkaXNhYmxlRXhoaWJpdGlvbklmcmFtZVZpc2liaWxpdHkoKSB7XG5cdGlmIChleGhpYml0aW9uSWZyYW1lKSB7XG5cdFx0ZXhoaWJpdGlvbklmcmFtZS5jbGFzc0xpc3QucmVtb3ZlKCdleGhpYml0aW9uLS12aXNpYmxlJyk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZWRpdEJhY2tncm91bmRDb2xvcihzaWRlYmFyTmF2TGluaykge1xuXHRpZiAoYm9keSAmJiBzaWRlYmFyKSB7XG5cdFx0aWYgKHNpZGViYXJOYXZMaW5rLmdldEF0dHJpYnV0ZSgnZGF0YS1iYWNrZ3JvdW5kJykgPT09ICdmZWxkZ3JhdScpIHtcblx0XHRcdGJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnYm9keS0td2hpdGUtYmFja2dyb3VuZCcpO1xuXHRcdFx0c2lkZWJhci5jbGFzc0xpc3QucmVtb3ZlKCdzaWRlYmFyLS13aGl0ZS1iYWNrZ3JvdW5kJyk7XG5cdFx0fSBlbHNlIGlmIChzaWRlYmFyTmF2TGluay5nZXRBdHRyaWJ1dGUoJ2RhdGEtYmFja2dyb3VuZCcpID09PSAnd2hpdGUnKSB7XG5cdFx0XHRib2R5LmNsYXNzTGlzdC5hZGQoJ2JvZHktLXdoaXRlLWJhY2tncm91bmQnKTtcblx0XHRcdHNpZGViYXIuY2xhc3NMaXN0LmFkZCgnc2lkZWJhci0td2hpdGUtYmFja2dyb3VuZCcpO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBsb2FkRXhoaWJpdGlvbklmcmFtZSgpIHtcblx0aWYgKHNpZGViYXJOYXZMaW5rcy5sZW5ndGggPiAwICYmIGV4aGliaXRpb25JZnJhbWUpIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNpZGViYXJOYXZMaW5rcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0c2lkZWJhck5hdkxpbmtzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAod2luZG93LmlubmVyV2lkdGggPj0gY29udmVydFJlbVRvUGl4ZWxzKG1lZGlhUXVlcmllcy5yZW1EZXNrdG9wV2lkdGgpKSB7XG5cdFx0XHRcdFx0bG9nby5yZW1vdmVFdmVudExpc3RlbmVyKCdhbmltYXRpb25pdGVyYXRpb24nLCBkaXNhYmxlTG9nb1JvdGF0aW9uKTtcblx0XHRcdFx0XHRlbmFibGVMb2dvUm90YXRpb24oKTtcblx0XHRcdFx0XHRkaXNhYmxlRXhoaWJpdGlvbklmcmFtZVZpc2liaWxpdHkoKTtcblx0XHRcdFx0XHRleGhpYml0aW9uSWZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbihlKSB7XG5cdFx0XHRcdFx0XHRsb2dvLmFkZEV2ZW50TGlzdGVuZXIoJ2FuaW1hdGlvbml0ZXJhdGlvbicsIGRpc2FibGVMb2dvUm90YXRpb24pO1xuXHRcdFx0XHRcdFx0c2xpbURvd25TaWRlYmFyKCk7XG5cdFx0XHRcdFx0XHRlbmFibGVFeGhpYml0aW9uSWZyYW1lVmlzaWJpbGl0eSgpO1xuXHRcdFx0XHRcdFx0ZWRpdEJhY2tncm91bmRDb2xvcihzaWRlYmFyTmF2TGlua3NbaV0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn1cblxuLy8gTkFWIExJTktTIFRBUkdFVFxuXG5mdW5jdGlvbiBzZXROYXZMaW5rc0lmcmFtZVRhcmdldCgpIHtcblx0aWYgKHNpZGViYXJOYXZMaW5rcykge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc2lkZWJhck5hdkxpbmtzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRzaWRlYmFyTmF2TGlua3NbaV0uc2V0QXR0cmlidXRlKCd0YXJnZXQnLCAnZXhoaWJpdGlvbicpO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBzZXROYXZMaW5rc0JsYW5rVGFyZ2V0KCkge1xuXHRpZiAoc2lkZWJhck5hdkxpbmtzKSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzaWRlYmFyTmF2TGlua3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdHNpZGViYXJOYXZMaW5rc1tpXS5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsICdfYmxhbmsnKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZWRpdE5hdkxpbmtzVGFyZ2V0KCkge1xuXHRcdGlmICh3aW5kb3cuaW5uZXJXaWR0aCA+PSBjb252ZXJ0UmVtVG9QaXhlbHMobWVkaWFRdWVyaWVzLnJlbURlc2t0b3BXaWR0aCkpIHtcblx0XHRcdHNldE5hdkxpbmtzSWZyYW1lVGFyZ2V0KCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNldE5hdkxpbmtzQmxhbmtUYXJnZXQoKTtcblx0XHR9XG59XG5cbmZ1bmN0aW9uIGVkaXROYXZMaW5rc1RhcmdldE9uUmVzaXplKCkge1xuXHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZnVuY3Rpb24oZSkge1xuXHRcdGVkaXROYXZMaW5rc1RhcmdldCgpO1xuXHR9KVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQUk9HUkFNXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIFVUSUxTXG5cbmVuYWJsZUFjdGl2ZVBzZXVkb0NsYXNzKCk7XG5cbi8vIFNQTElERSBTTElERVJcblxuc2V0VXBTbGlkZXIoKTtcbmVkaXRMb2dvQ29sb3JPblNsaWRlck1vdW50ZWQoKTtcbm1vdW50U2xpZGVyKCk7XG5nb1RvTmV4dFNsaWRlT25DbGljaygpO1xuZWRpdExvZ29Db2xvck9uU2xpZGVBY3RpdmUoKTtcbnJvdGF0ZUxvZ29PblNsaWRlck1vdmUoKTtcblxuLy8gRVhISUJJVElPTiBJRlJBTUVcblxubG9hZEV4aGliaXRpb25JZnJhbWUoKTtcblxuLy8gTkFWIExJTktTIFRBUkdFVFxuXG5lZGl0TmF2TGlua3NUYXJnZXQoKTtcbmVkaXROYXZMaW5rc1RhcmdldE9uUmVzaXplKCk7XG4iXSwibmFtZXMiOlsiU3BsaWRlIiwiYm9keSIsImRvY3VtZW50IiwibG9nbyIsInF1ZXJ5U2VsZWN0b3IiLCJzbGlkZXIiLCJzbGlkZXMiLCJxdWVyeVNlbGVjdG9yQWxsIiwic2lkZWJhciIsInNpZGViYXJOYXZMaW5rcyIsImV4aGliaXRpb25JZnJhbWUiLCJtZWRpYVF1ZXJpZXMiLCJyZW1UYWJsZXRXaWR0aCIsInJlbURlc2t0b3BXaWR0aCIsImVuYWJsZUFjdGl2ZVBzZXVkb0NsYXNzIiwiYWRkRXZlbnRMaXN0ZW5lciIsImNvbnZlcnRSZW1Ub1BpeGVscyIsInJlbSIsImZvbnRTaXplIiwicGFyc2VGbG9hdCIsIndpbmRvdyIsImdldENvbXB1dGVkU3R5bGUiLCJnZXRQcm9wZXJ0eVZhbHVlIiwic2V0VXBTbGlkZXIiLCJ0eXBlIiwicmV3aW5kIiwicmV3aW5kQnlEcmFnIiwic3BlZWQiLCJmaXhlZFdpZHRoIiwiZml4ZWRIZWlnaHQiLCJhcnJvd3MiLCJwYWdpbmF0aW9uIiwiZWFzaW5nIiwiZHJhZyIsIndoZWVsIiwibW91bnRTbGlkZXIiLCJtb3VudCIsImdvVG9OZXh0U2xpZGVPbkNsaWNrIiwib24iLCJlIiwiZ28iLCJ0dXJuTG9nb1RvQmxhY2siLCJjbGFzc0xpc3QiLCJyZW1vdmUiLCJhZGQiLCJ0dXJuTG9nb1RvV2hpdGUiLCJlZGl0TG9nb0NvbG9yIiwic2xpZGUiLCJnZXRBdHRyaWJ1dGUiLCJlZGl0TG9nb0NvbG9yT25TbGlkZXJNb3VudGVkIiwiZWRpdExvZ29Db2xvck9uU2xpZGVBY3RpdmUiLCJlbmFibGVMb2dvUm90YXRpb24iLCJkaXNhYmxlTG9nb1JvdGF0aW9uIiwicm90YXRlTG9nb09uU2xpZGVyTW92ZSIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJzbGltRG93blNpZGViYXIiLCJjb250YWlucyIsImVuYWJsZUV4aGliaXRpb25JZnJhbWVWaXNpYmlsaXR5IiwiZGlzYWJsZUV4aGliaXRpb25JZnJhbWVWaXNpYmlsaXR5IiwiZWRpdEJhY2tncm91bmRDb2xvciIsInNpZGViYXJOYXZMaW5rIiwibG9hZEV4aGliaXRpb25JZnJhbWUiLCJsZW5ndGgiLCJpIiwiaW5uZXJXaWR0aCIsInNldE5hdkxpbmtzSWZyYW1lVGFyZ2V0Iiwic2V0QXR0cmlidXRlIiwic2V0TmF2TGlua3NCbGFua1RhcmdldCIsImVkaXROYXZMaW5rc1RhcmdldCIsImVkaXROYXZMaW5rc1RhcmdldE9uUmVzaXplIl0sInNvdXJjZVJvb3QiOiIifQ==
|