Standardize settings file naming and relocate documentation files Fix code quality violations from rsx:check Reorganize user_management directory into logical subdirectories Move Quill Bundle to core and align with Tom Select pattern Simplify Site Settings page to focus on core site information Complete Phase 5: Multi-tenant authentication with login flow and site selection Add route query parameter rule and synchronize filename validation logic Fix critical bug in UpdateNpmCommand causing missing JavaScript stubs Implement filename convention rule and resolve VS Code auto-rename conflict Implement js-sanitizer RPC server to eliminate 900+ Node.js process spawns Implement RPC server architecture for JavaScript parsing WIP: Add RPC server infrastructure for JS parsing (partial implementation) Update jqhtml terminology from destroy to stop, fix datagrid DOM preservation Add JQHTML-CLASS-01 rule and fix redundant class names Improve code quality rules and resolve violations Remove legacy fatal error format in favor of unified 'fatal' error type Filter internal keys from window.rsxapp output Update button styling and comprehensive form/modal documentation Add conditional fly-in animation for modals Fix non-deterministic bundle compilation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
6086 lines
761 KiB
JavaScript
Executable File
6086 lines
761 KiB
JavaScript
Executable File
"use strict";
|
||
|
||
/*!
|
||
* Bootstrap v5.3.3 (https://getbootstrap.com/)
|
||
* Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
*/
|
||
(function (global, factory) {
|
||
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.bootstrap = factory());
|
||
})(void 0, function () {
|
||
'use strict';
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap dom/data.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Constants
|
||
*/
|
||
const elementMap = new Map();
|
||
const Data = {
|
||
set(element, key, instance) {
|
||
if (!elementMap.has(element)) {
|
||
elementMap.set(element, new Map());
|
||
}
|
||
const instanceMap = elementMap.get(element);
|
||
|
||
// make it clear we only want one instance per element
|
||
// can be removed later when multiple key/instances are fine to be used
|
||
if (!instanceMap.has(key) && instanceMap.size !== 0) {
|
||
// eslint-disable-next-line no-console
|
||
console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);
|
||
return;
|
||
}
|
||
instanceMap.set(key, instance);
|
||
},
|
||
get(element, key) {
|
||
if (elementMap.has(element)) {
|
||
return elementMap.get(element).get(key) || null;
|
||
}
|
||
return null;
|
||
},
|
||
remove(element, key) {
|
||
if (!elementMap.has(element)) {
|
||
return;
|
||
}
|
||
const instanceMap = elementMap.get(element);
|
||
instanceMap.delete(key);
|
||
|
||
// free up element references if there are no instances left for an element
|
||
if (instanceMap.size === 0) {
|
||
elementMap.delete(element);
|
||
}
|
||
}
|
||
};
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap util/index.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
const MAX_UID = 1000000;
|
||
const MILLISECONDS_MULTIPLIER = 1000;
|
||
const TRANSITION_END = 'transitionend';
|
||
|
||
/**
|
||
* Properly escape IDs selectors to handle weird IDs
|
||
* @param {string} selector
|
||
* @returns {string}
|
||
*/
|
||
const parseSelector = selector => {
|
||
if (selector && window.CSS && window.CSS.escape) {
|
||
// document.querySelector needs escaping to handle IDs (html5+) containing for instance /
|
||
selector = selector.replace(/#([^\s"#']+)/g, (match, id) => `#${CSS.escape(id)}`);
|
||
}
|
||
return selector;
|
||
};
|
||
|
||
// Shout-out Angus Croll (https://goo.gl/pxwQGp)
|
||
const toType = object => {
|
||
if (object === null || object === undefined) {
|
||
return `${object}`;
|
||
}
|
||
return Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase();
|
||
};
|
||
|
||
/**
|
||
* Public Util API
|
||
*/
|
||
|
||
const getUID = prefix => {
|
||
do {
|
||
prefix += Math.floor(Math.random() * MAX_UID);
|
||
} while (document.getElementById(prefix));
|
||
return prefix;
|
||
};
|
||
const getTransitionDurationFromElement = element => {
|
||
if (!element) {
|
||
return 0;
|
||
}
|
||
|
||
// Get transition-duration of the element
|
||
let {
|
||
transitionDuration,
|
||
transitionDelay
|
||
} = window.getComputedStyle(element);
|
||
const floatTransitionDuration = Number.parseFloat(transitionDuration);
|
||
const floatTransitionDelay = Number.parseFloat(transitionDelay);
|
||
|
||
// Return 0 if element or transition duration is not found
|
||
if (!floatTransitionDuration && !floatTransitionDelay) {
|
||
return 0;
|
||
}
|
||
|
||
// If multiple durations are defined, take the first
|
||
transitionDuration = transitionDuration.split(',')[0];
|
||
transitionDelay = transitionDelay.split(',')[0];
|
||
return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
|
||
};
|
||
const triggerTransitionEnd = element => {
|
||
element.dispatchEvent(new Event(TRANSITION_END));
|
||
};
|
||
const isElement$1 = object => {
|
||
if (!object || typeof object !== 'object') {
|
||
return false;
|
||
}
|
||
if (typeof object.jquery !== 'undefined') {
|
||
object = object[0];
|
||
}
|
||
return typeof object.nodeType !== 'undefined';
|
||
};
|
||
const getElement = object => {
|
||
// it's a jQuery object or a node element
|
||
if (isElement$1(object)) {
|
||
return object.jquery ? object[0] : object;
|
||
}
|
||
if (typeof object === 'string' && object.length > 0) {
|
||
return document.querySelector(parseSelector(object));
|
||
}
|
||
return null;
|
||
};
|
||
const isVisible = element => {
|
||
if (!isElement$1(element) || element.getClientRects().length === 0) {
|
||
return false;
|
||
}
|
||
const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';
|
||
// Handle `details` element as its content may falsie appear visible when it is closed
|
||
const closedDetails = element.closest('details:not([open])');
|
||
if (!closedDetails) {
|
||
return elementIsVisible;
|
||
}
|
||
if (closedDetails !== element) {
|
||
const summary = element.closest('summary');
|
||
if (summary && summary.parentNode !== closedDetails) {
|
||
return false;
|
||
}
|
||
if (summary === null) {
|
||
return false;
|
||
}
|
||
}
|
||
return elementIsVisible;
|
||
};
|
||
const isDisabled = element => {
|
||
if (!element || element.nodeType !== Node.ELEMENT_NODE) {
|
||
return true;
|
||
}
|
||
if (element.classList.contains('disabled')) {
|
||
return true;
|
||
}
|
||
if (typeof element.disabled !== 'undefined') {
|
||
return element.disabled;
|
||
}
|
||
return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
|
||
};
|
||
const findShadowRoot = element => {
|
||
if (!document.documentElement.attachShadow) {
|
||
return null;
|
||
}
|
||
|
||
// Can find the shadow root otherwise it'll return the document
|
||
if (typeof element.getRootNode === 'function') {
|
||
const root = element.getRootNode();
|
||
return root instanceof ShadowRoot ? root : null;
|
||
}
|
||
if (element instanceof ShadowRoot) {
|
||
return element;
|
||
}
|
||
|
||
// when we don't find a shadow root
|
||
if (!element.parentNode) {
|
||
return null;
|
||
}
|
||
return findShadowRoot(element.parentNode);
|
||
};
|
||
const noop = () => {};
|
||
|
||
/**
|
||
* Trick to restart an element's animation
|
||
*
|
||
* @param {HTMLElement} element
|
||
* @return void
|
||
*
|
||
* @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
|
||
*/
|
||
const reflow = element => {
|
||
element.offsetHeight; // eslint-disable-line no-unused-expressions
|
||
};
|
||
const getjQuery = () => {
|
||
if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
|
||
return window.jQuery;
|
||
}
|
||
return null;
|
||
};
|
||
const DOMContentLoadedCallbacks = [];
|
||
const onDOMContentLoaded = callback => {
|
||
if (document.readyState === 'loading') {
|
||
// add listener on the first call when the document is in loading state
|
||
if (!DOMContentLoadedCallbacks.length) {
|
||
document.addEventListener('DOMContentLoaded', () => {
|
||
for (const callback of DOMContentLoadedCallbacks) {
|
||
callback();
|
||
}
|
||
});
|
||
}
|
||
DOMContentLoadedCallbacks.push(callback);
|
||
} else {
|
||
callback();
|
||
}
|
||
};
|
||
const isRTL = () => document.documentElement.dir === 'rtl';
|
||
const defineJQueryPlugin = plugin => {
|
||
onDOMContentLoaded(() => {
|
||
const $ = getjQuery();
|
||
/* istanbul ignore if */
|
||
if ($) {
|
||
const name = plugin.NAME;
|
||
const JQUERY_NO_CONFLICT = $.fn[name];
|
||
$.fn[name] = plugin.jQueryInterface;
|
||
$.fn[name].Constructor = plugin;
|
||
$.fn[name].noConflict = () => {
|
||
$.fn[name] = JQUERY_NO_CONFLICT;
|
||
return plugin.jQueryInterface;
|
||
};
|
||
}
|
||
});
|
||
};
|
||
const execute = function (possibleCallback) {
|
||
let args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
||
let defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : possibleCallback;
|
||
return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue;
|
||
};
|
||
const executeAfterTransition = function (callback, transitionElement) {
|
||
let waitForTransition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
||
if (!waitForTransition) {
|
||
execute(callback);
|
||
return;
|
||
}
|
||
const durationPadding = 5;
|
||
const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;
|
||
let called = false;
|
||
const handler = _ref6 => {
|
||
let {
|
||
target
|
||
} = _ref6;
|
||
if (target !== transitionElement) {
|
||
return;
|
||
}
|
||
called = true;
|
||
transitionElement.removeEventListener(TRANSITION_END, handler);
|
||
execute(callback);
|
||
};
|
||
transitionElement.addEventListener(TRANSITION_END, handler);
|
||
setTimeout(() => {
|
||
if (!called) {
|
||
triggerTransitionEnd(transitionElement);
|
||
}
|
||
}, emulatedDuration);
|
||
};
|
||
|
||
/**
|
||
* Return the previous/next element of a list.
|
||
*
|
||
* @param {array} list The list of elements
|
||
* @param activeElement The active element
|
||
* @param shouldGetNext Choose to get next or previous element
|
||
* @param isCycleAllowed
|
||
* @return {Element|elem} The proper element
|
||
*/
|
||
const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {
|
||
const listLength = list.length;
|
||
let index = list.indexOf(activeElement);
|
||
|
||
// if the element does not exist in the list return an element
|
||
// depending on the direction and if cycle is allowed
|
||
if (index === -1) {
|
||
return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];
|
||
}
|
||
index += shouldGetNext ? 1 : -1;
|
||
if (isCycleAllowed) {
|
||
index = (index + listLength) % listLength;
|
||
}
|
||
return list[Math.max(0, Math.min(index, listLength - 1))];
|
||
};
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap dom/event-handler.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Constants
|
||
*/
|
||
|
||
const namespaceRegex = /[^.]*(?=\..*)\.|.*/;
|
||
const stripNameRegex = /\..*/;
|
||
const stripUidRegex = /::\d+$/;
|
||
const eventRegistry = {}; // Events storage
|
||
let uidEvent = 1;
|
||
const customEvents = {
|
||
mouseenter: 'mouseover',
|
||
mouseleave: 'mouseout'
|
||
};
|
||
const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);
|
||
|
||
/**
|
||
* Private methods
|
||
*/
|
||
|
||
function makeEventUid(element, uid) {
|
||
return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;
|
||
}
|
||
function getElementEvents(element) {
|
||
const uid = makeEventUid(element);
|
||
element.uidEvent = uid;
|
||
eventRegistry[uid] = eventRegistry[uid] || {};
|
||
return eventRegistry[uid];
|
||
}
|
||
function bootstrapHandler(element, fn) {
|
||
return function handler(event) {
|
||
hydrateObj(event, {
|
||
delegateTarget: element
|
||
});
|
||
if (handler.oneOff) {
|
||
EventHandler.off(element, event.type, fn);
|
||
}
|
||
return fn.apply(element, [event]);
|
||
};
|
||
}
|
||
function bootstrapDelegationHandler(element, selector, fn) {
|
||
return function handler(event) {
|
||
const domElements = element.querySelectorAll(selector);
|
||
for (let {
|
||
target
|
||
} = event; target && target !== this; target = target.parentNode) {
|
||
for (const domElement of domElements) {
|
||
if (domElement !== target) {
|
||
continue;
|
||
}
|
||
hydrateObj(event, {
|
||
delegateTarget: target
|
||
});
|
||
if (handler.oneOff) {
|
||
EventHandler.off(element, event.type, selector, fn);
|
||
}
|
||
return fn.apply(target, [event]);
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function findHandler(events, callable) {
|
||
let delegationSelector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
||
return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);
|
||
}
|
||
function normalizeParameters(originalTypeEvent, handler, delegationFunction) {
|
||
const isDelegated = typeof handler === 'string';
|
||
// TODO: tooltip passes `false` instead of selector, so we need to check
|
||
const callable = isDelegated ? delegationFunction : handler || delegationFunction;
|
||
let typeEvent = getTypeEvent(originalTypeEvent);
|
||
if (!nativeEvents.has(typeEvent)) {
|
||
typeEvent = originalTypeEvent;
|
||
}
|
||
return [isDelegated, callable, typeEvent];
|
||
}
|
||
function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {
|
||
if (typeof originalTypeEvent !== 'string' || !element) {
|
||
return;
|
||
}
|
||
let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
|
||
|
||
// in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position
|
||
// this prevents the handler from being dispatched the same way as mouseover or mouseout does
|
||
if (originalTypeEvent in customEvents) {
|
||
const wrapFunction = fn => {
|
||
return function (event) {
|
||
if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {
|
||
return fn.call(this, event);
|
||
}
|
||
};
|
||
};
|
||
callable = wrapFunction(callable);
|
||
}
|
||
const events = getElementEvents(element);
|
||
const handlers = events[typeEvent] || (events[typeEvent] = {});
|
||
const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);
|
||
if (previousFunction) {
|
||
previousFunction.oneOff = previousFunction.oneOff && oneOff;
|
||
return;
|
||
}
|
||
const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));
|
||
const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);
|
||
fn.delegationSelector = isDelegated ? handler : null;
|
||
fn.callable = callable;
|
||
fn.oneOff = oneOff;
|
||
fn.uidEvent = uid;
|
||
handlers[uid] = fn;
|
||
element.addEventListener(typeEvent, fn, isDelegated);
|
||
}
|
||
function removeHandler(element, events, typeEvent, handler, delegationSelector) {
|
||
const fn = findHandler(events[typeEvent], handler, delegationSelector);
|
||
if (!fn) {
|
||
return;
|
||
}
|
||
element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));
|
||
delete events[typeEvent][fn.uidEvent];
|
||
}
|
||
function removeNamespacedHandlers(element, events, typeEvent, namespace) {
|
||
const storeElementEvent = events[typeEvent] || {};
|
||
for (const [handlerKey, event] of Object.entries(storeElementEvent)) {
|
||
if (handlerKey.includes(namespace)) {
|
||
removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
|
||
}
|
||
}
|
||
}
|
||
function getTypeEvent(event) {
|
||
// allow to get the native events from namespaced events ('click.bs.button' --> 'click')
|
||
event = event.replace(stripNameRegex, '');
|
||
return customEvents[event] || event;
|
||
}
|
||
const EventHandler = {
|
||
on(element, event, handler, delegationFunction) {
|
||
addHandler(element, event, handler, delegationFunction, false);
|
||
},
|
||
one(element, event, handler, delegationFunction) {
|
||
addHandler(element, event, handler, delegationFunction, true);
|
||
},
|
||
off(element, originalTypeEvent, handler, delegationFunction) {
|
||
if (typeof originalTypeEvent !== 'string' || !element) {
|
||
return;
|
||
}
|
||
const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
|
||
const inNamespace = typeEvent !== originalTypeEvent;
|
||
const events = getElementEvents(element);
|
||
const storeElementEvent = events[typeEvent] || {};
|
||
const isNamespace = originalTypeEvent.startsWith('.');
|
||
if (typeof callable !== 'undefined') {
|
||
// Simplest case: handler is passed, remove that listener ONLY.
|
||
if (!Object.keys(storeElementEvent).length) {
|
||
return;
|
||
}
|
||
removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);
|
||
return;
|
||
}
|
||
if (isNamespace) {
|
||
for (const elementEvent of Object.keys(events)) {
|
||
removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));
|
||
}
|
||
}
|
||
for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {
|
||
const handlerKey = keyHandlers.replace(stripUidRegex, '');
|
||
if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
|
||
removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
|
||
}
|
||
}
|
||
},
|
||
trigger(element, event, args) {
|
||
if (typeof event !== 'string' || !element) {
|
||
return null;
|
||
}
|
||
const $ = getjQuery();
|
||
const typeEvent = getTypeEvent(event);
|
||
const inNamespace = event !== typeEvent;
|
||
let jQueryEvent = null;
|
||
let bubbles = true;
|
||
let nativeDispatch = true;
|
||
let defaultPrevented = false;
|
||
if (inNamespace && $) {
|
||
jQueryEvent = $.Event(event, args);
|
||
$(element).trigger(jQueryEvent);
|
||
bubbles = !jQueryEvent.isPropagationStopped();
|
||
nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();
|
||
defaultPrevented = jQueryEvent.isDefaultPrevented();
|
||
}
|
||
const evt = hydrateObj(new Event(event, {
|
||
bubbles,
|
||
cancelable: true
|
||
}), args);
|
||
if (defaultPrevented) {
|
||
evt.preventDefault();
|
||
}
|
||
if (nativeDispatch) {
|
||
element.dispatchEvent(evt);
|
||
}
|
||
if (evt.defaultPrevented && jQueryEvent) {
|
||
jQueryEvent.preventDefault();
|
||
}
|
||
return evt;
|
||
}
|
||
};
|
||
function hydrateObj(obj) {
|
||
let meta = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
||
for (const [key, value] of Object.entries(meta)) {
|
||
try {
|
||
obj[key] = value;
|
||
} catch (_unused) {
|
||
Object.defineProperty(obj, key, {
|
||
configurable: true,
|
||
get() {
|
||
return value;
|
||
}
|
||
});
|
||
}
|
||
}
|
||
return obj;
|
||
}
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap dom/manipulator.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
function normalizeData(value) {
|
||
if (value === 'true') {
|
||
return true;
|
||
}
|
||
if (value === 'false') {
|
||
return false;
|
||
}
|
||
if (value === Number(value).toString()) {
|
||
return Number(value);
|
||
}
|
||
if (value === '' || value === 'null') {
|
||
return null;
|
||
}
|
||
if (typeof value !== 'string') {
|
||
return value;
|
||
}
|
||
try {
|
||
return JSON.parse(decodeURIComponent(value));
|
||
} catch (_unused) {
|
||
return value;
|
||
}
|
||
}
|
||
function normalizeDataKey(key) {
|
||
return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);
|
||
}
|
||
const Manipulator = {
|
||
setDataAttribute(element, key, value) {
|
||
element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);
|
||
},
|
||
removeDataAttribute(element, key) {
|
||
element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);
|
||
},
|
||
getDataAttributes(element) {
|
||
if (!element) {
|
||
return {};
|
||
}
|
||
const attributes = {};
|
||
const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));
|
||
for (const key of bsKeys) {
|
||
let pureKey = key.replace(/^bs/, '');
|
||
pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);
|
||
attributes[pureKey] = normalizeData(element.dataset[key]);
|
||
}
|
||
return attributes;
|
||
},
|
||
getDataAttribute(element, key) {
|
||
return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
|
||
}
|
||
};
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap util/config.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Class definition
|
||
*/
|
||
|
||
class Config {
|
||
// Getters
|
||
static get Default() {
|
||
return {};
|
||
}
|
||
static get DefaultType() {
|
||
return {};
|
||
}
|
||
static get NAME() {
|
||
throw new Error('You have to implement the static method "NAME", for each component!');
|
||
}
|
||
_getConfig(config) {
|
||
config = this._mergeConfigObj(config);
|
||
config = this._configAfterMerge(config);
|
||
this._typeCheckConfig(config);
|
||
return config;
|
||
}
|
||
_configAfterMerge(config) {
|
||
return config;
|
||
}
|
||
_mergeConfigObj(config, element) {
|
||
const jsonConfig = isElement$1(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse
|
||
|
||
return {
|
||
...this.constructor.Default,
|
||
...(typeof jsonConfig === 'object' ? jsonConfig : {}),
|
||
...(isElement$1(element) ? Manipulator.getDataAttributes(element) : {}),
|
||
...(typeof config === 'object' ? config : {})
|
||
};
|
||
}
|
||
_typeCheckConfig(config) {
|
||
let configTypes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.constructor.DefaultType;
|
||
for (const [property, expectedTypes] of Object.entries(configTypes)) {
|
||
const value = config[property];
|
||
const valueType = isElement$1(value) ? 'element' : toType(value);
|
||
if (!new RegExp(expectedTypes).test(valueType)) {
|
||
throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap base-component.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Constants
|
||
*/
|
||
|
||
const VERSION = '5.3.3';
|
||
|
||
/**
|
||
* Class definition
|
||
*/
|
||
|
||
class BaseComponent extends Config {
|
||
constructor(element, config) {
|
||
super();
|
||
element = getElement(element);
|
||
if (!element) {
|
||
return;
|
||
}
|
||
this._element = element;
|
||
this._config = this._getConfig(config);
|
||
Data.set(this._element, this.constructor.DATA_KEY, this);
|
||
}
|
||
|
||
// Public
|
||
dispose() {
|
||
Data.remove(this._element, this.constructor.DATA_KEY);
|
||
EventHandler.off(this._element, this.constructor.EVENT_KEY);
|
||
for (const propertyName of Object.getOwnPropertyNames(this)) {
|
||
this[propertyName] = null;
|
||
}
|
||
}
|
||
_queueCallback(callback, element) {
|
||
let isAnimated = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
||
executeAfterTransition(callback, element, isAnimated);
|
||
}
|
||
_getConfig(config) {
|
||
config = this._mergeConfigObj(config, this._element);
|
||
config = this._configAfterMerge(config);
|
||
this._typeCheckConfig(config);
|
||
return config;
|
||
}
|
||
|
||
// Static
|
||
static getInstance(element) {
|
||
return Data.get(getElement(element), this.DATA_KEY);
|
||
}
|
||
static getOrCreateInstance(element) {
|
||
let config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
||
return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);
|
||
}
|
||
static get VERSION() {
|
||
return VERSION;
|
||
}
|
||
static get DATA_KEY() {
|
||
return `bs.${this.NAME}`;
|
||
}
|
||
static get EVENT_KEY() {
|
||
return `.${this.DATA_KEY}`;
|
||
}
|
||
static eventName(name) {
|
||
return `${name}${this.EVENT_KEY}`;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap dom/selector-engine.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
const getSelector = element => {
|
||
let selector = element.getAttribute('data-bs-target');
|
||
if (!selector || selector === '#') {
|
||
let hrefAttribute = element.getAttribute('href');
|
||
|
||
// The only valid content that could double as a selector are IDs or classes,
|
||
// so everything starting with `#` or `.`. If a "real" URL is used as the selector,
|
||
// `document.querySelector` will rightfully complain it is invalid.
|
||
// See https://github.com/twbs/bootstrap/issues/32273
|
||
if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {
|
||
return null;
|
||
}
|
||
|
||
// Just in case some CMS puts out a full URL with the anchor appended
|
||
if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {
|
||
hrefAttribute = `#${hrefAttribute.split('#')[1]}`;
|
||
}
|
||
selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;
|
||
}
|
||
return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null;
|
||
};
|
||
const SelectorEngine = {
|
||
find(selector) {
|
||
let element = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document.documentElement;
|
||
return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
|
||
},
|
||
findOne(selector) {
|
||
let element = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document.documentElement;
|
||
return Element.prototype.querySelector.call(element, selector);
|
||
},
|
||
children(element, selector) {
|
||
return [].concat(...element.children).filter(child => child.matches(selector));
|
||
},
|
||
parents(element, selector) {
|
||
const parents = [];
|
||
let ancestor = element.parentNode.closest(selector);
|
||
while (ancestor) {
|
||
parents.push(ancestor);
|
||
ancestor = ancestor.parentNode.closest(selector);
|
||
}
|
||
return parents;
|
||
},
|
||
prev(element, selector) {
|
||
let previous = element.previousElementSibling;
|
||
while (previous) {
|
||
if (previous.matches(selector)) {
|
||
return [previous];
|
||
}
|
||
previous = previous.previousElementSibling;
|
||
}
|
||
return [];
|
||
},
|
||
// TODO: this is now unused; remove later along with prev()
|
||
next(element, selector) {
|
||
let next = element.nextElementSibling;
|
||
while (next) {
|
||
if (next.matches(selector)) {
|
||
return [next];
|
||
}
|
||
next = next.nextElementSibling;
|
||
}
|
||
return [];
|
||
},
|
||
focusableChildren(element) {
|
||
const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(selector => `${selector}:not([tabindex^="-"])`).join(',');
|
||
return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));
|
||
},
|
||
getSelectorFromElement(element) {
|
||
const selector = getSelector(element);
|
||
if (selector) {
|
||
return SelectorEngine.findOne(selector) ? selector : null;
|
||
}
|
||
return null;
|
||
},
|
||
getElementFromSelector(element) {
|
||
const selector = getSelector(element);
|
||
return selector ? SelectorEngine.findOne(selector) : null;
|
||
},
|
||
getMultipleElementsFromSelector(element) {
|
||
const selector = getSelector(element);
|
||
return selector ? SelectorEngine.find(selector) : [];
|
||
}
|
||
};
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap util/component-functions.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
const enableDismissTrigger = function (component) {
|
||
let method = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'hide';
|
||
const clickEvent = `click.dismiss${component.EVENT_KEY}`;
|
||
const name = component.NAME;
|
||
EventHandler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) {
|
||
if (['A', 'AREA'].includes(this.tagName)) {
|
||
event.preventDefault();
|
||
}
|
||
if (isDisabled(this)) {
|
||
return;
|
||
}
|
||
const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);
|
||
const instance = component.getOrCreateInstance(target);
|
||
|
||
// Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
|
||
instance[method]();
|
||
});
|
||
};
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap alert.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Constants
|
||
*/
|
||
|
||
const NAME$f = 'alert';
|
||
const DATA_KEY$a = 'bs.alert';
|
||
const EVENT_KEY$b = `.${DATA_KEY$a}`;
|
||
const EVENT_CLOSE = `close${EVENT_KEY$b}`;
|
||
const EVENT_CLOSED = `closed${EVENT_KEY$b}`;
|
||
const CLASS_NAME_FADE$5 = 'fade';
|
||
const CLASS_NAME_SHOW$8 = 'show';
|
||
|
||
/**
|
||
* Class definition
|
||
*/
|
||
|
||
class Alert extends BaseComponent {
|
||
// Getters
|
||
static get NAME() {
|
||
return NAME$f;
|
||
}
|
||
|
||
// Public
|
||
close() {
|
||
const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);
|
||
if (closeEvent.defaultPrevented) {
|
||
return;
|
||
}
|
||
this._element.classList.remove(CLASS_NAME_SHOW$8);
|
||
const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);
|
||
this._queueCallback(() => this._destroyElement(), this._element, isAnimated);
|
||
}
|
||
|
||
// Private
|
||
_destroyElement() {
|
||
this._element.remove();
|
||
EventHandler.trigger(this._element, EVENT_CLOSED);
|
||
this.dispose();
|
||
}
|
||
|
||
// Static
|
||
static jQueryInterface(config) {
|
||
return this.each(function () {
|
||
const data = Alert.getOrCreateInstance(this);
|
||
if (typeof config !== 'string') {
|
||
return;
|
||
}
|
||
if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
|
||
throw new TypeError(`No method named "${config}"`);
|
||
}
|
||
data[config](this);
|
||
});
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Data API implementation
|
||
*/
|
||
|
||
enableDismissTrigger(Alert, 'close');
|
||
|
||
/**
|
||
* jQuery
|
||
*/
|
||
|
||
defineJQueryPlugin(Alert);
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap button.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Constants
|
||
*/
|
||
|
||
const NAME$e = 'button';
|
||
const DATA_KEY$9 = 'bs.button';
|
||
const EVENT_KEY$a = `.${DATA_KEY$9}`;
|
||
const DATA_API_KEY$6 = '.data-api';
|
||
const CLASS_NAME_ACTIVE$3 = 'active';
|
||
const SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle="button"]';
|
||
const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;
|
||
|
||
/**
|
||
* Class definition
|
||
*/
|
||
|
||
class Button extends BaseComponent {
|
||
// Getters
|
||
static get NAME() {
|
||
return NAME$e;
|
||
}
|
||
|
||
// Public
|
||
toggle() {
|
||
// Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method
|
||
this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));
|
||
}
|
||
|
||
// Static
|
||
static jQueryInterface(config) {
|
||
return this.each(function () {
|
||
const data = Button.getOrCreateInstance(this);
|
||
if (config === 'toggle') {
|
||
data[config]();
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Data API implementation
|
||
*/
|
||
|
||
EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {
|
||
event.preventDefault();
|
||
const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);
|
||
const data = Button.getOrCreateInstance(button);
|
||
data.toggle();
|
||
});
|
||
|
||
/**
|
||
* jQuery
|
||
*/
|
||
|
||
defineJQueryPlugin(Button);
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap util/swipe.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Constants
|
||
*/
|
||
|
||
const NAME$d = 'swipe';
|
||
const EVENT_KEY$9 = '.bs.swipe';
|
||
const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;
|
||
const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;
|
||
const EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;
|
||
const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;
|
||
const EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;
|
||
const POINTER_TYPE_TOUCH = 'touch';
|
||
const POINTER_TYPE_PEN = 'pen';
|
||
const CLASS_NAME_POINTER_EVENT = 'pointer-event';
|
||
const SWIPE_THRESHOLD = 40;
|
||
const Default$c = {
|
||
endCallback: null,
|
||
leftCallback: null,
|
||
rightCallback: null
|
||
};
|
||
const DefaultType$c = {
|
||
endCallback: '(function|null)',
|
||
leftCallback: '(function|null)',
|
||
rightCallback: '(function|null)'
|
||
};
|
||
|
||
/**
|
||
* Class definition
|
||
*/
|
||
|
||
class Swipe extends Config {
|
||
constructor(element, config) {
|
||
super();
|
||
this._element = element;
|
||
if (!element || !Swipe.isSupported()) {
|
||
return;
|
||
}
|
||
this._config = this._getConfig(config);
|
||
this._deltaX = 0;
|
||
this._supportPointerEvents = Boolean(window.PointerEvent);
|
||
this._initEvents();
|
||
}
|
||
|
||
// Getters
|
||
static get Default() {
|
||
return Default$c;
|
||
}
|
||
static get DefaultType() {
|
||
return DefaultType$c;
|
||
}
|
||
static get NAME() {
|
||
return NAME$d;
|
||
}
|
||
|
||
// Public
|
||
dispose() {
|
||
EventHandler.off(this._element, EVENT_KEY$9);
|
||
}
|
||
|
||
// Private
|
||
_start(event) {
|
||
if (!this._supportPointerEvents) {
|
||
this._deltaX = event.touches[0].clientX;
|
||
return;
|
||
}
|
||
if (this._eventIsPointerPenTouch(event)) {
|
||
this._deltaX = event.clientX;
|
||
}
|
||
}
|
||
_end(event) {
|
||
if (this._eventIsPointerPenTouch(event)) {
|
||
this._deltaX = event.clientX - this._deltaX;
|
||
}
|
||
this._handleSwipe();
|
||
execute(this._config.endCallback);
|
||
}
|
||
_move(event) {
|
||
this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;
|
||
}
|
||
_handleSwipe() {
|
||
const absDeltaX = Math.abs(this._deltaX);
|
||
if (absDeltaX <= SWIPE_THRESHOLD) {
|
||
return;
|
||
}
|
||
const direction = absDeltaX / this._deltaX;
|
||
this._deltaX = 0;
|
||
if (!direction) {
|
||
return;
|
||
}
|
||
execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);
|
||
}
|
||
_initEvents() {
|
||
if (this._supportPointerEvents) {
|
||
EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));
|
||
EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));
|
||
this._element.classList.add(CLASS_NAME_POINTER_EVENT);
|
||
} else {
|
||
EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));
|
||
EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));
|
||
EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));
|
||
}
|
||
}
|
||
_eventIsPointerPenTouch(event) {
|
||
return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);
|
||
}
|
||
|
||
// Static
|
||
static isSupported() {
|
||
return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap carousel.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Constants
|
||
*/
|
||
|
||
const NAME$c = 'carousel';
|
||
const DATA_KEY$8 = 'bs.carousel';
|
||
const EVENT_KEY$8 = `.${DATA_KEY$8}`;
|
||
const DATA_API_KEY$5 = '.data-api';
|
||
const ARROW_LEFT_KEY$1 = 'ArrowLeft';
|
||
const ARROW_RIGHT_KEY$1 = 'ArrowRight';
|
||
const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
|
||
|
||
const ORDER_NEXT = 'next';
|
||
const ORDER_PREV = 'prev';
|
||
const DIRECTION_LEFT = 'left';
|
||
const DIRECTION_RIGHT = 'right';
|
||
const EVENT_SLIDE = `slide${EVENT_KEY$8}`;
|
||
const EVENT_SLID = `slid${EVENT_KEY$8}`;
|
||
const EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;
|
||
const EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;
|
||
const EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;
|
||
const EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;
|
||
const EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;
|
||
const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;
|
||
const CLASS_NAME_CAROUSEL = 'carousel';
|
||
const CLASS_NAME_ACTIVE$2 = 'active';
|
||
const CLASS_NAME_SLIDE = 'slide';
|
||
const CLASS_NAME_END = 'carousel-item-end';
|
||
const CLASS_NAME_START = 'carousel-item-start';
|
||
const CLASS_NAME_NEXT = 'carousel-item-next';
|
||
const CLASS_NAME_PREV = 'carousel-item-prev';
|
||
const SELECTOR_ACTIVE = '.active';
|
||
const SELECTOR_ITEM = '.carousel-item';
|
||
const SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;
|
||
const SELECTOR_ITEM_IMG = '.carousel-item img';
|
||
const SELECTOR_INDICATORS = '.carousel-indicators';
|
||
const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';
|
||
const SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]';
|
||
const KEY_TO_DIRECTION = {
|
||
[ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,
|
||
[ARROW_RIGHT_KEY$1]: DIRECTION_LEFT
|
||
};
|
||
const Default$b = {
|
||
interval: 5000,
|
||
keyboard: true,
|
||
pause: 'hover',
|
||
ride: false,
|
||
touch: true,
|
||
wrap: true
|
||
};
|
||
const DefaultType$b = {
|
||
interval: '(number|boolean)',
|
||
// TODO:v6 remove boolean support
|
||
keyboard: 'boolean',
|
||
pause: '(string|boolean)',
|
||
ride: '(boolean|string)',
|
||
touch: 'boolean',
|
||
wrap: 'boolean'
|
||
};
|
||
|
||
/**
|
||
* Class definition
|
||
*/
|
||
|
||
class Carousel extends BaseComponent {
|
||
constructor(element, config) {
|
||
super(element, config);
|
||
this._interval = null;
|
||
this._activeElement = null;
|
||
this._isSliding = false;
|
||
this.touchTimeout = null;
|
||
this._swipeHelper = null;
|
||
this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);
|
||
this._addEventListeners();
|
||
if (this._config.ride === CLASS_NAME_CAROUSEL) {
|
||
this.cycle();
|
||
}
|
||
}
|
||
|
||
// Getters
|
||
static get Default() {
|
||
return Default$b;
|
||
}
|
||
static get DefaultType() {
|
||
return DefaultType$b;
|
||
}
|
||
static get NAME() {
|
||
return NAME$c;
|
||
}
|
||
|
||
// Public
|
||
next() {
|
||
this._slide(ORDER_NEXT);
|
||
}
|
||
nextWhenVisible() {
|
||
// FIXME TODO use `document.visibilityState`
|
||
// Don't call next when the page isn't visible
|
||
// or the carousel or its parent isn't visible
|
||
if (!document.hidden && isVisible(this._element)) {
|
||
this.next();
|
||
}
|
||
}
|
||
prev() {
|
||
this._slide(ORDER_PREV);
|
||
}
|
||
pause() {
|
||
if (this._isSliding) {
|
||
triggerTransitionEnd(this._element);
|
||
}
|
||
this._clearInterval();
|
||
}
|
||
cycle() {
|
||
this._clearInterval();
|
||
this._updateInterval();
|
||
this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);
|
||
}
|
||
_maybeEnableCycle() {
|
||
if (!this._config.ride) {
|
||
return;
|
||
}
|
||
if (this._isSliding) {
|
||
EventHandler.one(this._element, EVENT_SLID, () => this.cycle());
|
||
return;
|
||
}
|
||
this.cycle();
|
||
}
|
||
to(index) {
|
||
const items = this._getItems();
|
||
if (index > items.length - 1 || index < 0) {
|
||
return;
|
||
}
|
||
if (this._isSliding) {
|
||
EventHandler.one(this._element, EVENT_SLID, () => this.to(index));
|
||
return;
|
||
}
|
||
const activeIndex = this._getItemIndex(this._getActive());
|
||
if (activeIndex === index) {
|
||
return;
|
||
}
|
||
const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;
|
||
this._slide(order, items[index]);
|
||
}
|
||
dispose() {
|
||
if (this._swipeHelper) {
|
||
this._swipeHelper.dispose();
|
||
}
|
||
super.dispose();
|
||
}
|
||
|
||
// Private
|
||
_configAfterMerge(config) {
|
||
config.defaultInterval = config.interval;
|
||
return config;
|
||
}
|
||
_addEventListeners() {
|
||
if (this._config.keyboard) {
|
||
EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event));
|
||
}
|
||
if (this._config.pause === 'hover') {
|
||
EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());
|
||
EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());
|
||
}
|
||
if (this._config.touch && Swipe.isSupported()) {
|
||
this._addTouchEventListeners();
|
||
}
|
||
}
|
||
_addTouchEventListeners() {
|
||
for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {
|
||
EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());
|
||
}
|
||
const endCallBack = () => {
|
||
if (this._config.pause !== 'hover') {
|
||
return;
|
||
}
|
||
|
||
// If it's a touch-enabled device, mouseenter/leave are fired as
|
||
// part of the mouse compatibility events on first tap - the carousel
|
||
// would stop cycling until user tapped out of it;
|
||
// here, we listen for touchend, explicitly pause the carousel
|
||
// (as if it's the second time we tap on it, mouseenter compat event
|
||
// is NOT fired) and after a timeout (to allow for mouse compatibility
|
||
// events to fire) we explicitly restart cycling
|
||
|
||
this.pause();
|
||
if (this.touchTimeout) {
|
||
clearTimeout(this.touchTimeout);
|
||
}
|
||
this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);
|
||
};
|
||
const swipeConfig = {
|
||
leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),
|
||
rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),
|
||
endCallback: endCallBack
|
||
};
|
||
this._swipeHelper = new Swipe(this._element, swipeConfig);
|
||
}
|
||
_keydown(event) {
|
||
if (/input|textarea/i.test(event.target.tagName)) {
|
||
return;
|
||
}
|
||
const direction = KEY_TO_DIRECTION[event.key];
|
||
if (direction) {
|
||
event.preventDefault();
|
||
this._slide(this._directionToOrder(direction));
|
||
}
|
||
}
|
||
_getItemIndex(element) {
|
||
return this._getItems().indexOf(element);
|
||
}
|
||
_setActiveIndicatorElement(index) {
|
||
if (!this._indicatorsElement) {
|
||
return;
|
||
}
|
||
const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);
|
||
activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);
|
||
activeIndicator.removeAttribute('aria-current');
|
||
const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to="${index}"]`, this._indicatorsElement);
|
||
if (newActiveIndicator) {
|
||
newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);
|
||
newActiveIndicator.setAttribute('aria-current', 'true');
|
||
}
|
||
}
|
||
_updateInterval() {
|
||
const element = this._activeElement || this._getActive();
|
||
if (!element) {
|
||
return;
|
||
}
|
||
const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);
|
||
this._config.interval = elementInterval || this._config.defaultInterval;
|
||
}
|
||
_slide(order) {
|
||
let element = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
||
if (this._isSliding) {
|
||
return;
|
||
}
|
||
const activeElement = this._getActive();
|
||
const isNext = order === ORDER_NEXT;
|
||
const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);
|
||
if (nextElement === activeElement) {
|
||
return;
|
||
}
|
||
const nextElementIndex = this._getItemIndex(nextElement);
|
||
const triggerEvent = eventName => {
|
||
return EventHandler.trigger(this._element, eventName, {
|
||
relatedTarget: nextElement,
|
||
direction: this._orderToDirection(order),
|
||
from: this._getItemIndex(activeElement),
|
||
to: nextElementIndex
|
||
});
|
||
};
|
||
const slideEvent = triggerEvent(EVENT_SLIDE);
|
||
if (slideEvent.defaultPrevented) {
|
||
return;
|
||
}
|
||
if (!activeElement || !nextElement) {
|
||
// Some weirdness is happening, so we bail
|
||
// TODO: change tests that use empty divs to avoid this check
|
||
return;
|
||
}
|
||
const isCycling = Boolean(this._interval);
|
||
this.pause();
|
||
this._isSliding = true;
|
||
this._setActiveIndicatorElement(nextElementIndex);
|
||
this._activeElement = nextElement;
|
||
const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;
|
||
const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;
|
||
nextElement.classList.add(orderClassName);
|
||
reflow(nextElement);
|
||
activeElement.classList.add(directionalClassName);
|
||
nextElement.classList.add(directionalClassName);
|
||
const completeCallBack = () => {
|
||
nextElement.classList.remove(directionalClassName, orderClassName);
|
||
nextElement.classList.add(CLASS_NAME_ACTIVE$2);
|
||
activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);
|
||
this._isSliding = false;
|
||
triggerEvent(EVENT_SLID);
|
||
};
|
||
this._queueCallback(completeCallBack, activeElement, this._isAnimated());
|
||
if (isCycling) {
|
||
this.cycle();
|
||
}
|
||
}
|
||
_isAnimated() {
|
||
return this._element.classList.contains(CLASS_NAME_SLIDE);
|
||
}
|
||
_getActive() {
|
||
return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
|
||
}
|
||
_getItems() {
|
||
return SelectorEngine.find(SELECTOR_ITEM, this._element);
|
||
}
|
||
_clearInterval() {
|
||
if (this._interval) {
|
||
clearInterval(this._interval);
|
||
this._interval = null;
|
||
}
|
||
}
|
||
_directionToOrder(direction) {
|
||
if (isRTL()) {
|
||
return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;
|
||
}
|
||
return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;
|
||
}
|
||
_orderToDirection(order) {
|
||
if (isRTL()) {
|
||
return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;
|
||
}
|
||
return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;
|
||
}
|
||
|
||
// Static
|
||
static jQueryInterface(config) {
|
||
return this.each(function () {
|
||
const data = Carousel.getOrCreateInstance(this, config);
|
||
if (typeof config === 'number') {
|
||
data.to(config);
|
||
return;
|
||
}
|
||
if (typeof config === 'string') {
|
||
if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
|
||
throw new TypeError(`No method named "${config}"`);
|
||
}
|
||
data[config]();
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Data API implementation
|
||
*/
|
||
|
||
EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) {
|
||
const target = SelectorEngine.getElementFromSelector(this);
|
||
if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {
|
||
return;
|
||
}
|
||
event.preventDefault();
|
||
const carousel = Carousel.getOrCreateInstance(target);
|
||
const slideIndex = this.getAttribute('data-bs-slide-to');
|
||
if (slideIndex) {
|
||
carousel.to(slideIndex);
|
||
carousel._maybeEnableCycle();
|
||
return;
|
||
}
|
||
if (Manipulator.getDataAttribute(this, 'slide') === 'next') {
|
||
carousel.next();
|
||
carousel._maybeEnableCycle();
|
||
return;
|
||
}
|
||
carousel.prev();
|
||
carousel._maybeEnableCycle();
|
||
});
|
||
EventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {
|
||
const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);
|
||
for (const carousel of carousels) {
|
||
Carousel.getOrCreateInstance(carousel);
|
||
}
|
||
});
|
||
|
||
/**
|
||
* jQuery
|
||
*/
|
||
|
||
defineJQueryPlugin(Carousel);
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap collapse.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Constants
|
||
*/
|
||
|
||
const NAME$b = 'collapse';
|
||
const DATA_KEY$7 = 'bs.collapse';
|
||
const EVENT_KEY$7 = `.${DATA_KEY$7}`;
|
||
const DATA_API_KEY$4 = '.data-api';
|
||
const EVENT_SHOW$6 = `show${EVENT_KEY$7}`;
|
||
const EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;
|
||
const EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;
|
||
const EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;
|
||
const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;
|
||
const CLASS_NAME_SHOW$7 = 'show';
|
||
const CLASS_NAME_COLLAPSE = 'collapse';
|
||
const CLASS_NAME_COLLAPSING = 'collapsing';
|
||
const CLASS_NAME_COLLAPSED = 'collapsed';
|
||
const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;
|
||
const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';
|
||
const WIDTH = 'width';
|
||
const HEIGHT = 'height';
|
||
const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';
|
||
const SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle="collapse"]';
|
||
const Default$a = {
|
||
parent: null,
|
||
toggle: true
|
||
};
|
||
const DefaultType$a = {
|
||
parent: '(null|element)',
|
||
toggle: 'boolean'
|
||
};
|
||
|
||
/**
|
||
* Class definition
|
||
*/
|
||
|
||
class Collapse extends BaseComponent {
|
||
constructor(element, config) {
|
||
super(element, config);
|
||
this._isTransitioning = false;
|
||
this._triggerArray = [];
|
||
const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);
|
||
for (const elem of toggleList) {
|
||
const selector = SelectorEngine.getSelectorFromElement(elem);
|
||
const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);
|
||
if (selector !== null && filterElement.length) {
|
||
this._triggerArray.push(elem);
|
||
}
|
||
}
|
||
this._initializeChildren();
|
||
if (!this._config.parent) {
|
||
this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
|
||
}
|
||
if (this._config.toggle) {
|
||
this.toggle();
|
||
}
|
||
}
|
||
|
||
// Getters
|
||
static get Default() {
|
||
return Default$a;
|
||
}
|
||
static get DefaultType() {
|
||
return DefaultType$a;
|
||
}
|
||
static get NAME() {
|
||
return NAME$b;
|
||
}
|
||
|
||
// Public
|
||
toggle() {
|
||
if (this._isShown()) {
|
||
this.hide();
|
||
} else {
|
||
this.show();
|
||
}
|
||
}
|
||
show() {
|
||
if (this._isTransitioning || this._isShown()) {
|
||
return;
|
||
}
|
||
let activeChildren = [];
|
||
|
||
// find active children
|
||
if (this._config.parent) {
|
||
activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {
|
||
toggle: false
|
||
}));
|
||
}
|
||
if (activeChildren.length && activeChildren[0]._isTransitioning) {
|
||
return;
|
||
}
|
||
const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);
|
||
if (startEvent.defaultPrevented) {
|
||
return;
|
||
}
|
||
for (const activeInstance of activeChildren) {
|
||
activeInstance.hide();
|
||
}
|
||
const dimension = this._getDimension();
|
||
this._element.classList.remove(CLASS_NAME_COLLAPSE);
|
||
this._element.classList.add(CLASS_NAME_COLLAPSING);
|
||
this._element.style[dimension] = 0;
|
||
this._addAriaAndCollapsedClass(this._triggerArray, true);
|
||
this._isTransitioning = true;
|
||
const complete = () => {
|
||
this._isTransitioning = false;
|
||
this._element.classList.remove(CLASS_NAME_COLLAPSING);
|
||
this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
|
||
this._element.style[dimension] = '';
|
||
EventHandler.trigger(this._element, EVENT_SHOWN$6);
|
||
};
|
||
const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
|
||
const scrollSize = `scroll${capitalizedDimension}`;
|
||
this._queueCallback(complete, this._element, true);
|
||
this._element.style[dimension] = `${this._element[scrollSize]}px`;
|
||
}
|
||
hide() {
|
||
if (this._isTransitioning || !this._isShown()) {
|
||
return;
|
||
}
|
||
const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);
|
||
if (startEvent.defaultPrevented) {
|
||
return;
|
||
}
|
||
const dimension = this._getDimension();
|
||
this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
|
||
reflow(this._element);
|
||
this._element.classList.add(CLASS_NAME_COLLAPSING);
|
||
this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
|
||
for (const trigger of this._triggerArray) {
|
||
const element = SelectorEngine.getElementFromSelector(trigger);
|
||
if (element && !this._isShown(element)) {
|
||
this._addAriaAndCollapsedClass([trigger], false);
|
||
}
|
||
}
|
||
this._isTransitioning = true;
|
||
const complete = () => {
|
||
this._isTransitioning = false;
|
||
this._element.classList.remove(CLASS_NAME_COLLAPSING);
|
||
this._element.classList.add(CLASS_NAME_COLLAPSE);
|
||
EventHandler.trigger(this._element, EVENT_HIDDEN$6);
|
||
};
|
||
this._element.style[dimension] = '';
|
||
this._queueCallback(complete, this._element, true);
|
||
}
|
||
_isShown() {
|
||
let element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._element;
|
||
return element.classList.contains(CLASS_NAME_SHOW$7);
|
||
}
|
||
|
||
// Private
|
||
_configAfterMerge(config) {
|
||
config.toggle = Boolean(config.toggle); // Coerce string values
|
||
config.parent = getElement(config.parent);
|
||
return config;
|
||
}
|
||
_getDimension() {
|
||
return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
|
||
}
|
||
_initializeChildren() {
|
||
if (!this._config.parent) {
|
||
return;
|
||
}
|
||
const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);
|
||
for (const element of children) {
|
||
const selected = SelectorEngine.getElementFromSelector(element);
|
||
if (selected) {
|
||
this._addAriaAndCollapsedClass([element], this._isShown(selected));
|
||
}
|
||
}
|
||
}
|
||
_getFirstLevelChildren(selector) {
|
||
const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);
|
||
// remove children if greater depth
|
||
return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));
|
||
}
|
||
_addAriaAndCollapsedClass(triggerArray, isOpen) {
|
||
if (!triggerArray.length) {
|
||
return;
|
||
}
|
||
for (const element of triggerArray) {
|
||
element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);
|
||
element.setAttribute('aria-expanded', isOpen);
|
||
}
|
||
}
|
||
|
||
// Static
|
||
static jQueryInterface(config) {
|
||
const _config = {};
|
||
if (typeof config === 'string' && /show|hide/.test(config)) {
|
||
_config.toggle = false;
|
||
}
|
||
return this.each(function () {
|
||
const data = Collapse.getOrCreateInstance(this, _config);
|
||
if (typeof config === 'string') {
|
||
if (typeof data[config] === 'undefined') {
|
||
throw new TypeError(`No method named "${config}"`);
|
||
}
|
||
data[config]();
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Data API implementation
|
||
*/
|
||
|
||
EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {
|
||
// preventDefault only for <a> elements (which change the URL) not inside the collapsible element
|
||
if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {
|
||
event.preventDefault();
|
||
}
|
||
for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {
|
||
Collapse.getOrCreateInstance(element, {
|
||
toggle: false
|
||
}).toggle();
|
||
}
|
||
});
|
||
|
||
/**
|
||
* jQuery
|
||
*/
|
||
|
||
defineJQueryPlugin(Collapse);
|
||
var top = 'top';
|
||
var bottom = 'bottom';
|
||
var right = 'right';
|
||
var left = 'left';
|
||
var auto = 'auto';
|
||
var basePlacements = [top, bottom, right, left];
|
||
var start = 'start';
|
||
var end = 'end';
|
||
var clippingParents = 'clippingParents';
|
||
var viewport = 'viewport';
|
||
var popper = 'popper';
|
||
var reference = 'reference';
|
||
var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {
|
||
return acc.concat([placement + "-" + start, placement + "-" + end]);
|
||
}, []);
|
||
var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {
|
||
return acc.concat([placement, placement + "-" + start, placement + "-" + end]);
|
||
}, []); // modifiers that need to read the DOM
|
||
|
||
var beforeRead = 'beforeRead';
|
||
var read = 'read';
|
||
var afterRead = 'afterRead'; // pure-logic modifiers
|
||
|
||
var beforeMain = 'beforeMain';
|
||
var main = 'main';
|
||
var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)
|
||
|
||
var beforeWrite = 'beforeWrite';
|
||
var write = 'write';
|
||
var afterWrite = 'afterWrite';
|
||
var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];
|
||
function getNodeName(element) {
|
||
return element ? (element.nodeName || '').toLowerCase() : null;
|
||
}
|
||
function getWindow(node) {
|
||
if (node == null) {
|
||
return window;
|
||
}
|
||
if (node.toString() !== '[object Window]') {
|
||
var ownerDocument = node.ownerDocument;
|
||
return ownerDocument ? ownerDocument.defaultView || window : window;
|
||
}
|
||
return node;
|
||
}
|
||
function isElement(node) {
|
||
var OwnElement = getWindow(node).Element;
|
||
return node instanceof OwnElement || node instanceof Element;
|
||
}
|
||
function isHTMLElement(node) {
|
||
var OwnElement = getWindow(node).HTMLElement;
|
||
return node instanceof OwnElement || node instanceof HTMLElement;
|
||
}
|
||
function isShadowRoot(node) {
|
||
// IE 11 has no ShadowRoot
|
||
if (typeof ShadowRoot === 'undefined') {
|
||
return false;
|
||
}
|
||
var OwnElement = getWindow(node).ShadowRoot;
|
||
return node instanceof OwnElement || node instanceof ShadowRoot;
|
||
}
|
||
|
||
// and applies them to the HTMLElements such as popper and arrow
|
||
|
||
function applyStyles(_ref) {
|
||
var state = _ref.state;
|
||
Object.keys(state.elements).forEach(function (name) {
|
||
var style = state.styles[name] || {};
|
||
var attributes = state.attributes[name] || {};
|
||
var element = state.elements[name]; // arrow is optional + virtual elements
|
||
|
||
if (!isHTMLElement(element) || !getNodeName(element)) {
|
||
return;
|
||
} // Flow doesn't support to extend this property, but it's the most
|
||
// effective way to apply styles to an HTMLElement
|
||
// $FlowFixMe[cannot-write]
|
||
|
||
Object.assign(element.style, style);
|
||
Object.keys(attributes).forEach(function (name) {
|
||
var value = attributes[name];
|
||
if (value === false) {
|
||
element.removeAttribute(name);
|
||
} else {
|
||
element.setAttribute(name, value === true ? '' : value);
|
||
}
|
||
});
|
||
});
|
||
}
|
||
function effect$2(_ref2) {
|
||
var state = _ref2.state;
|
||
var initialStyles = {
|
||
popper: {
|
||
position: state.options.strategy,
|
||
left: '0',
|
||
top: '0',
|
||
margin: '0'
|
||
},
|
||
arrow: {
|
||
position: 'absolute'
|
||
},
|
||
reference: {}
|
||
};
|
||
Object.assign(state.elements.popper.style, initialStyles.popper);
|
||
state.styles = initialStyles;
|
||
if (state.elements.arrow) {
|
||
Object.assign(state.elements.arrow.style, initialStyles.arrow);
|
||
}
|
||
return function () {
|
||
Object.keys(state.elements).forEach(function (name) {
|
||
var element = state.elements[name];
|
||
var attributes = state.attributes[name] || {};
|
||
var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them
|
||
|
||
var style = styleProperties.reduce(function (style, property) {
|
||
style[property] = '';
|
||
return style;
|
||
}, {}); // arrow is optional + virtual elements
|
||
|
||
if (!isHTMLElement(element) || !getNodeName(element)) {
|
||
return;
|
||
}
|
||
Object.assign(element.style, style);
|
||
Object.keys(attributes).forEach(function (attribute) {
|
||
element.removeAttribute(attribute);
|
||
});
|
||
});
|
||
};
|
||
} // eslint-disable-next-line import/no-unused-modules
|
||
|
||
const applyStyles$1 = {
|
||
name: 'applyStyles',
|
||
enabled: true,
|
||
phase: 'write',
|
||
fn: applyStyles,
|
||
effect: effect$2,
|
||
requires: ['computeStyles']
|
||
};
|
||
function getBasePlacement(placement) {
|
||
return placement.split('-')[0];
|
||
}
|
||
var max = Math.max;
|
||
var min = Math.min;
|
||
var round = Math.round;
|
||
function getUAString() {
|
||
var uaData = navigator.userAgentData;
|
||
if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {
|
||
return uaData.brands.map(function (item) {
|
||
return item.brand + "/" + item.version;
|
||
}).join(' ');
|
||
}
|
||
return navigator.userAgent;
|
||
}
|
||
function isLayoutViewport() {
|
||
return !/^((?!chrome|android).)*safari/i.test(getUAString());
|
||
}
|
||
function getBoundingClientRect(element, includeScale, isFixedStrategy) {
|
||
if (includeScale === void 0) {
|
||
includeScale = false;
|
||
}
|
||
if (isFixedStrategy === void 0) {
|
||
isFixedStrategy = false;
|
||
}
|
||
var clientRect = element.getBoundingClientRect();
|
||
var scaleX = 1;
|
||
var scaleY = 1;
|
||
if (includeScale && isHTMLElement(element)) {
|
||
scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;
|
||
scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;
|
||
}
|
||
var _ref = isElement(element) ? getWindow(element) : window,
|
||
visualViewport = _ref.visualViewport;
|
||
var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;
|
||
var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;
|
||
var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;
|
||
var width = clientRect.width / scaleX;
|
||
var height = clientRect.height / scaleY;
|
||
return {
|
||
width: width,
|
||
height: height,
|
||
top: y,
|
||
right: x + width,
|
||
bottom: y + height,
|
||
left: x,
|
||
x: x,
|
||
y: y
|
||
};
|
||
}
|
||
|
||
// means it doesn't take into account transforms.
|
||
|
||
function getLayoutRect(element) {
|
||
var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.
|
||
// Fixes https://github.com/popperjs/popper-core/issues/1223
|
||
|
||
var width = element.offsetWidth;
|
||
var height = element.offsetHeight;
|
||
if (Math.abs(clientRect.width - width) <= 1) {
|
||
width = clientRect.width;
|
||
}
|
||
if (Math.abs(clientRect.height - height) <= 1) {
|
||
height = clientRect.height;
|
||
}
|
||
return {
|
||
x: element.offsetLeft,
|
||
y: element.offsetTop,
|
||
width: width,
|
||
height: height
|
||
};
|
||
}
|
||
function contains(parent, child) {
|
||
var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method
|
||
|
||
if (parent.contains(child)) {
|
||
return true;
|
||
} // then fallback to custom implementation with Shadow DOM support
|
||
else if (rootNode && isShadowRoot(rootNode)) {
|
||
var next = child;
|
||
do {
|
||
if (next && parent.isSameNode(next)) {
|
||
return true;
|
||
} // $FlowFixMe[prop-missing]: need a better way to handle this...
|
||
|
||
next = next.parentNode || next.host;
|
||
} while (next);
|
||
} // Give up, the result is false
|
||
|
||
return false;
|
||
}
|
||
function getComputedStyle$1(element) {
|
||
return getWindow(element).getComputedStyle(element);
|
||
}
|
||
function isTableElement(element) {
|
||
return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;
|
||
}
|
||
function getDocumentElement(element) {
|
||
// $FlowFixMe[incompatible-return]: assume body is always available
|
||
return ((isElement(element) ? element.ownerDocument :
|
||
// $FlowFixMe[prop-missing]
|
||
element.document) || window.document).documentElement;
|
||
}
|
||
function getParentNode(element) {
|
||
if (getNodeName(element) === 'html') {
|
||
return element;
|
||
}
|
||
return (
|
||
// this is a quicker (but less type safe) way to save quite some bytes from the bundle
|
||
// $FlowFixMe[incompatible-return]
|
||
// $FlowFixMe[prop-missing]
|
||
element.assignedSlot ||
|
||
// step into the shadow DOM of the parent of a slotted node
|
||
element.parentNode || (
|
||
// DOM Element detected
|
||
isShadowRoot(element) ? element.host : null) ||
|
||
// ShadowRoot detected
|
||
// $FlowFixMe[incompatible-call]: HTMLElement is a Node
|
||
getDocumentElement(element) // fallback
|
||
);
|
||
}
|
||
function getTrueOffsetParent(element) {
|
||
if (!isHTMLElement(element) ||
|
||
// https://github.com/popperjs/popper-core/issues/837
|
||
getComputedStyle$1(element).position === 'fixed') {
|
||
return null;
|
||
}
|
||
return element.offsetParent;
|
||
} // `.offsetParent` reports `null` for fixed elements, while absolute elements
|
||
// return the containing block
|
||
|
||
function getContainingBlock(element) {
|
||
var isFirefox = /firefox/i.test(getUAString());
|
||
var isIE = /Trident/i.test(getUAString());
|
||
if (isIE && isHTMLElement(element)) {
|
||
// In IE 9, 10 and 11 fixed elements containing block is always established by the viewport
|
||
var elementCss = getComputedStyle$1(element);
|
||
if (elementCss.position === 'fixed') {
|
||
return null;
|
||
}
|
||
}
|
||
var currentNode = getParentNode(element);
|
||
if (isShadowRoot(currentNode)) {
|
||
currentNode = currentNode.host;
|
||
}
|
||
while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {
|
||
var css = getComputedStyle$1(currentNode); // This is non-exhaustive but covers the most common CSS properties that
|
||
// create a containing block.
|
||
// https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block
|
||
|
||
if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {
|
||
return currentNode;
|
||
} else {
|
||
currentNode = currentNode.parentNode;
|
||
}
|
||
}
|
||
return null;
|
||
} // Gets the closest ancestor positioned element. Handles some edge cases,
|
||
// such as table ancestors and cross browser bugs.
|
||
|
||
function getOffsetParent(element) {
|
||
var window = getWindow(element);
|
||
var offsetParent = getTrueOffsetParent(element);
|
||
while (offsetParent && isTableElement(offsetParent) && getComputedStyle$1(offsetParent).position === 'static') {
|
||
offsetParent = getTrueOffsetParent(offsetParent);
|
||
}
|
||
if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle$1(offsetParent).position === 'static')) {
|
||
return window;
|
||
}
|
||
return offsetParent || getContainingBlock(element) || window;
|
||
}
|
||
function getMainAxisFromPlacement(placement) {
|
||
return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';
|
||
}
|
||
function within(min$1, value, max$1) {
|
||
return max(min$1, min(value, max$1));
|
||
}
|
||
function withinMaxClamp(min, value, max) {
|
||
var v = within(min, value, max);
|
||
return v > max ? max : v;
|
||
}
|
||
function getFreshSideObject() {
|
||
return {
|
||
top: 0,
|
||
right: 0,
|
||
bottom: 0,
|
||
left: 0
|
||
};
|
||
}
|
||
function mergePaddingObject(paddingObject) {
|
||
return Object.assign({}, getFreshSideObject(), paddingObject);
|
||
}
|
||
function expandToHashMap(value, keys) {
|
||
return keys.reduce(function (hashMap, key) {
|
||
hashMap[key] = value;
|
||
return hashMap;
|
||
}, {});
|
||
}
|
||
var toPaddingObject = function toPaddingObject(padding, state) {
|
||
padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {
|
||
placement: state.placement
|
||
})) : padding;
|
||
return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));
|
||
};
|
||
function arrow(_ref) {
|
||
var _state$modifiersData$;
|
||
var state = _ref.state,
|
||
name = _ref.name,
|
||
options = _ref.options;
|
||
var arrowElement = state.elements.arrow;
|
||
var popperOffsets = state.modifiersData.popperOffsets;
|
||
var basePlacement = getBasePlacement(state.placement);
|
||
var axis = getMainAxisFromPlacement(basePlacement);
|
||
var isVertical = [left, right].indexOf(basePlacement) >= 0;
|
||
var len = isVertical ? 'height' : 'width';
|
||
if (!arrowElement || !popperOffsets) {
|
||
return;
|
||
}
|
||
var paddingObject = toPaddingObject(options.padding, state);
|
||
var arrowRect = getLayoutRect(arrowElement);
|
||
var minProp = axis === 'y' ? top : left;
|
||
var maxProp = axis === 'y' ? bottom : right;
|
||
var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];
|
||
var startDiff = popperOffsets[axis] - state.rects.reference[axis];
|
||
var arrowOffsetParent = getOffsetParent(arrowElement);
|
||
var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;
|
||
var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is
|
||
// outside of the popper bounds
|
||
|
||
var min = paddingObject[minProp];
|
||
var max = clientSize - arrowRect[len] - paddingObject[maxProp];
|
||
var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;
|
||
var offset = within(min, center, max); // Prevents breaking syntax highlighting...
|
||
|
||
var axisProp = axis;
|
||
state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);
|
||
}
|
||
function effect$1(_ref2) {
|
||
var state = _ref2.state,
|
||
options = _ref2.options;
|
||
var _options$element = options.element,
|
||
arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;
|
||
if (arrowElement == null) {
|
||
return;
|
||
} // CSS selector
|
||
|
||
if (typeof arrowElement === 'string') {
|
||
arrowElement = state.elements.popper.querySelector(arrowElement);
|
||
if (!arrowElement) {
|
||
return;
|
||
}
|
||
}
|
||
if (!contains(state.elements.popper, arrowElement)) {
|
||
return;
|
||
}
|
||
state.elements.arrow = arrowElement;
|
||
} // eslint-disable-next-line import/no-unused-modules
|
||
|
||
const arrow$1 = {
|
||
name: 'arrow',
|
||
enabled: true,
|
||
phase: 'main',
|
||
fn: arrow,
|
||
effect: effect$1,
|
||
requires: ['popperOffsets'],
|
||
requiresIfExists: ['preventOverflow']
|
||
};
|
||
function getVariation(placement) {
|
||
return placement.split('-')[1];
|
||
}
|
||
var unsetSides = {
|
||
top: 'auto',
|
||
right: 'auto',
|
||
bottom: 'auto',
|
||
left: 'auto'
|
||
}; // Round the offsets to the nearest suitable subpixel based on the DPR.
|
||
// Zooming can change the DPR, but it seems to report a value that will
|
||
// cleanly divide the values into the appropriate subpixels.
|
||
|
||
function roundOffsetsByDPR(_ref, win) {
|
||
var x = _ref.x,
|
||
y = _ref.y;
|
||
var dpr = win.devicePixelRatio || 1;
|
||
return {
|
||
x: round(x * dpr) / dpr || 0,
|
||
y: round(y * dpr) / dpr || 0
|
||
};
|
||
}
|
||
function mapToStyles(_ref2) {
|
||
var _Object$assign2;
|
||
var popper = _ref2.popper,
|
||
popperRect = _ref2.popperRect,
|
||
placement = _ref2.placement,
|
||
variation = _ref2.variation,
|
||
offsets = _ref2.offsets,
|
||
position = _ref2.position,
|
||
gpuAcceleration = _ref2.gpuAcceleration,
|
||
adaptive = _ref2.adaptive,
|
||
roundOffsets = _ref2.roundOffsets,
|
||
isFixed = _ref2.isFixed;
|
||
var _offsets$x = offsets.x,
|
||
x = _offsets$x === void 0 ? 0 : _offsets$x,
|
||
_offsets$y = offsets.y,
|
||
y = _offsets$y === void 0 ? 0 : _offsets$y;
|
||
var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({
|
||
x: x,
|
||
y: y
|
||
}) : {
|
||
x: x,
|
||
y: y
|
||
};
|
||
x = _ref3.x;
|
||
y = _ref3.y;
|
||
var hasX = offsets.hasOwnProperty('x');
|
||
var hasY = offsets.hasOwnProperty('y');
|
||
var sideX = left;
|
||
var sideY = top;
|
||
var win = window;
|
||
if (adaptive) {
|
||
var offsetParent = getOffsetParent(popper);
|
||
var heightProp = 'clientHeight';
|
||
var widthProp = 'clientWidth';
|
||
if (offsetParent === getWindow(popper)) {
|
||
offsetParent = getDocumentElement(popper);
|
||
if (getComputedStyle$1(offsetParent).position !== 'static' && position === 'absolute') {
|
||
heightProp = 'scrollHeight';
|
||
widthProp = 'scrollWidth';
|
||
}
|
||
} // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it
|
||
|
||
offsetParent = offsetParent;
|
||
if (placement === top || (placement === left || placement === right) && variation === end) {
|
||
sideY = bottom;
|
||
var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height :
|
||
// $FlowFixMe[prop-missing]
|
||
offsetParent[heightProp];
|
||
y -= offsetY - popperRect.height;
|
||
y *= gpuAcceleration ? 1 : -1;
|
||
}
|
||
if (placement === left || (placement === top || placement === bottom) && variation === end) {
|
||
sideX = right;
|
||
var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width :
|
||
// $FlowFixMe[prop-missing]
|
||
offsetParent[widthProp];
|
||
x -= offsetX - popperRect.width;
|
||
x *= gpuAcceleration ? 1 : -1;
|
||
}
|
||
}
|
||
var commonStyles = Object.assign({
|
||
position: position
|
||
}, adaptive && unsetSides);
|
||
var _ref4 = roundOffsets === true ? roundOffsetsByDPR({
|
||
x: x,
|
||
y: y
|
||
}, getWindow(popper)) : {
|
||
x: x,
|
||
y: y
|
||
};
|
||
x = _ref4.x;
|
||
y = _ref4.y;
|
||
if (gpuAcceleration) {
|
||
var _Object$assign;
|
||
return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign));
|
||
}
|
||
return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2));
|
||
}
|
||
function computeStyles(_ref5) {
|
||
var state = _ref5.state,
|
||
options = _ref5.options;
|
||
var _options$gpuAccelerat = options.gpuAcceleration,
|
||
gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,
|
||
_options$adaptive = options.adaptive,
|
||
adaptive = _options$adaptive === void 0 ? true : _options$adaptive,
|
||
_options$roundOffsets = options.roundOffsets,
|
||
roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;
|
||
var commonStyles = {
|
||
placement: getBasePlacement(state.placement),
|
||
variation: getVariation(state.placement),
|
||
popper: state.elements.popper,
|
||
popperRect: state.rects.popper,
|
||
gpuAcceleration: gpuAcceleration,
|
||
isFixed: state.options.strategy === 'fixed'
|
||
};
|
||
if (state.modifiersData.popperOffsets != null) {
|
||
state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {
|
||
offsets: state.modifiersData.popperOffsets,
|
||
position: state.options.strategy,
|
||
adaptive: adaptive,
|
||
roundOffsets: roundOffsets
|
||
})));
|
||
}
|
||
if (state.modifiersData.arrow != null) {
|
||
state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {
|
||
offsets: state.modifiersData.arrow,
|
||
position: 'absolute',
|
||
adaptive: false,
|
||
roundOffsets: roundOffsets
|
||
})));
|
||
}
|
||
state.attributes.popper = Object.assign({}, state.attributes.popper, {
|
||
'data-popper-placement': state.placement
|
||
});
|
||
} // eslint-disable-next-line import/no-unused-modules
|
||
|
||
const computeStyles$1 = {
|
||
name: 'computeStyles',
|
||
enabled: true,
|
||
phase: 'beforeWrite',
|
||
fn: computeStyles,
|
||
data: {}
|
||
};
|
||
var passive = {
|
||
passive: true
|
||
};
|
||
function effect(_ref) {
|
||
var state = _ref.state,
|
||
instance = _ref.instance,
|
||
options = _ref.options;
|
||
var _options$scroll = options.scroll,
|
||
scroll = _options$scroll === void 0 ? true : _options$scroll,
|
||
_options$resize = options.resize,
|
||
resize = _options$resize === void 0 ? true : _options$resize;
|
||
var window = getWindow(state.elements.popper);
|
||
var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);
|
||
if (scroll) {
|
||
scrollParents.forEach(function (scrollParent) {
|
||
scrollParent.addEventListener('scroll', instance.update, passive);
|
||
});
|
||
}
|
||
if (resize) {
|
||
window.addEventListener('resize', instance.update, passive);
|
||
}
|
||
return function () {
|
||
if (scroll) {
|
||
scrollParents.forEach(function (scrollParent) {
|
||
scrollParent.removeEventListener('scroll', instance.update, passive);
|
||
});
|
||
}
|
||
if (resize) {
|
||
window.removeEventListener('resize', instance.update, passive);
|
||
}
|
||
};
|
||
} // eslint-disable-next-line import/no-unused-modules
|
||
|
||
const eventListeners = {
|
||
name: 'eventListeners',
|
||
enabled: true,
|
||
phase: 'write',
|
||
fn: function fn() {},
|
||
effect: effect,
|
||
data: {}
|
||
};
|
||
var hash$1 = {
|
||
left: 'right',
|
||
right: 'left',
|
||
bottom: 'top',
|
||
top: 'bottom'
|
||
};
|
||
function getOppositePlacement(placement) {
|
||
return placement.replace(/left|right|bottom|top/g, function (matched) {
|
||
return hash$1[matched];
|
||
});
|
||
}
|
||
var hash = {
|
||
start: 'end',
|
||
end: 'start'
|
||
};
|
||
function getOppositeVariationPlacement(placement) {
|
||
return placement.replace(/start|end/g, function (matched) {
|
||
return hash[matched];
|
||
});
|
||
}
|
||
function getWindowScroll(node) {
|
||
var win = getWindow(node);
|
||
var scrollLeft = win.pageXOffset;
|
||
var scrollTop = win.pageYOffset;
|
||
return {
|
||
scrollLeft: scrollLeft,
|
||
scrollTop: scrollTop
|
||
};
|
||
}
|
||
function getWindowScrollBarX(element) {
|
||
// If <html> has a CSS width greater than the viewport, then this will be
|
||
// incorrect for RTL.
|
||
// Popper 1 is broken in this case and never had a bug report so let's assume
|
||
// it's not an issue. I don't think anyone ever specifies width on <html>
|
||
// anyway.
|
||
// Browsers where the left scrollbar doesn't cause an issue report `0` for
|
||
// this (e.g. Edge 2019, IE11, Safari)
|
||
return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;
|
||
}
|
||
function getViewportRect(element, strategy) {
|
||
var win = getWindow(element);
|
||
var html = getDocumentElement(element);
|
||
var visualViewport = win.visualViewport;
|
||
var width = html.clientWidth;
|
||
var height = html.clientHeight;
|
||
var x = 0;
|
||
var y = 0;
|
||
if (visualViewport) {
|
||
width = visualViewport.width;
|
||
height = visualViewport.height;
|
||
var layoutViewport = isLayoutViewport();
|
||
if (layoutViewport || !layoutViewport && strategy === 'fixed') {
|
||
x = visualViewport.offsetLeft;
|
||
y = visualViewport.offsetTop;
|
||
}
|
||
}
|
||
return {
|
||
width: width,
|
||
height: height,
|
||
x: x + getWindowScrollBarX(element),
|
||
y: y
|
||
};
|
||
}
|
||
|
||
// of the `<html>` and `<body>` rect bounds if horizontally scrollable
|
||
|
||
function getDocumentRect(element) {
|
||
var _element$ownerDocumen;
|
||
var html = getDocumentElement(element);
|
||
var winScroll = getWindowScroll(element);
|
||
var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;
|
||
var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);
|
||
var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);
|
||
var x = -winScroll.scrollLeft + getWindowScrollBarX(element);
|
||
var y = -winScroll.scrollTop;
|
||
if (getComputedStyle$1(body || html).direction === 'rtl') {
|
||
x += max(html.clientWidth, body ? body.clientWidth : 0) - width;
|
||
}
|
||
return {
|
||
width: width,
|
||
height: height,
|
||
x: x,
|
||
y: y
|
||
};
|
||
}
|
||
function isScrollParent(element) {
|
||
// Firefox wants us to check `-x` and `-y` variations as well
|
||
var _getComputedStyle = getComputedStyle$1(element),
|
||
overflow = _getComputedStyle.overflow,
|
||
overflowX = _getComputedStyle.overflowX,
|
||
overflowY = _getComputedStyle.overflowY;
|
||
return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);
|
||
}
|
||
function getScrollParent(node) {
|
||
if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {
|
||
// $FlowFixMe[incompatible-return]: assume body is always available
|
||
return node.ownerDocument.body;
|
||
}
|
||
if (isHTMLElement(node) && isScrollParent(node)) {
|
||
return node;
|
||
}
|
||
return getScrollParent(getParentNode(node));
|
||
}
|
||
|
||
/*
|
||
given a DOM element, return the list of all scroll parents, up the list of ancesors
|
||
until we get to the top window object. This list is what we attach scroll listeners
|
||
to, because if any of these parent elements scroll, we'll need to re-calculate the
|
||
reference element's position.
|
||
*/
|
||
|
||
function listScrollParents(element, list) {
|
||
var _element$ownerDocumen;
|
||
if (list === void 0) {
|
||
list = [];
|
||
}
|
||
var scrollParent = getScrollParent(element);
|
||
var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);
|
||
var win = getWindow(scrollParent);
|
||
var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;
|
||
var updatedList = list.concat(target);
|
||
return isBody ? updatedList :
|
||
// $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here
|
||
updatedList.concat(listScrollParents(getParentNode(target)));
|
||
}
|
||
function rectToClientRect(rect) {
|
||
return Object.assign({}, rect, {
|
||
left: rect.x,
|
||
top: rect.y,
|
||
right: rect.x + rect.width,
|
||
bottom: rect.y + rect.height
|
||
});
|
||
}
|
||
function getInnerBoundingClientRect(element, strategy) {
|
||
var rect = getBoundingClientRect(element, false, strategy === 'fixed');
|
||
rect.top = rect.top + element.clientTop;
|
||
rect.left = rect.left + element.clientLeft;
|
||
rect.bottom = rect.top + element.clientHeight;
|
||
rect.right = rect.left + element.clientWidth;
|
||
rect.width = element.clientWidth;
|
||
rect.height = element.clientHeight;
|
||
rect.x = rect.left;
|
||
rect.y = rect.top;
|
||
return rect;
|
||
}
|
||
function getClientRectFromMixedType(element, clippingParent, strategy) {
|
||
return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));
|
||
} // A "clipping parent" is an overflowable container with the characteristic of
|
||
// clipping (or hiding) overflowing elements with a position different from
|
||
// `initial`
|
||
|
||
function getClippingParents(element) {
|
||
var clippingParents = listScrollParents(getParentNode(element));
|
||
var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle$1(element).position) >= 0;
|
||
var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;
|
||
if (!isElement(clipperElement)) {
|
||
return [];
|
||
} // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414
|
||
|
||
return clippingParents.filter(function (clippingParent) {
|
||
return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';
|
||
});
|
||
} // Gets the maximum area that the element is visible in due to any number of
|
||
// clipping parents
|
||
|
||
function getClippingRect(element, boundary, rootBoundary, strategy) {
|
||
var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);
|
||
var clippingParents = [].concat(mainClippingParents, [rootBoundary]);
|
||
var firstClippingParent = clippingParents[0];
|
||
var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {
|
||
var rect = getClientRectFromMixedType(element, clippingParent, strategy);
|
||
accRect.top = max(rect.top, accRect.top);
|
||
accRect.right = min(rect.right, accRect.right);
|
||
accRect.bottom = min(rect.bottom, accRect.bottom);
|
||
accRect.left = max(rect.left, accRect.left);
|
||
return accRect;
|
||
}, getClientRectFromMixedType(element, firstClippingParent, strategy));
|
||
clippingRect.width = clippingRect.right - clippingRect.left;
|
||
clippingRect.height = clippingRect.bottom - clippingRect.top;
|
||
clippingRect.x = clippingRect.left;
|
||
clippingRect.y = clippingRect.top;
|
||
return clippingRect;
|
||
}
|
||
function computeOffsets(_ref) {
|
||
var reference = _ref.reference,
|
||
element = _ref.element,
|
||
placement = _ref.placement;
|
||
var basePlacement = placement ? getBasePlacement(placement) : null;
|
||
var variation = placement ? getVariation(placement) : null;
|
||
var commonX = reference.x + reference.width / 2 - element.width / 2;
|
||
var commonY = reference.y + reference.height / 2 - element.height / 2;
|
||
var offsets;
|
||
switch (basePlacement) {
|
||
case top:
|
||
offsets = {
|
||
x: commonX,
|
||
y: reference.y - element.height
|
||
};
|
||
break;
|
||
case bottom:
|
||
offsets = {
|
||
x: commonX,
|
||
y: reference.y + reference.height
|
||
};
|
||
break;
|
||
case right:
|
||
offsets = {
|
||
x: reference.x + reference.width,
|
||
y: commonY
|
||
};
|
||
break;
|
||
case left:
|
||
offsets = {
|
||
x: reference.x - element.width,
|
||
y: commonY
|
||
};
|
||
break;
|
||
default:
|
||
offsets = {
|
||
x: reference.x,
|
||
y: reference.y
|
||
};
|
||
}
|
||
var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;
|
||
if (mainAxis != null) {
|
||
var len = mainAxis === 'y' ? 'height' : 'width';
|
||
switch (variation) {
|
||
case start:
|
||
offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);
|
||
break;
|
||
case end:
|
||
offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);
|
||
break;
|
||
}
|
||
}
|
||
return offsets;
|
||
}
|
||
function detectOverflow(state, options) {
|
||
if (options === void 0) {
|
||
options = {};
|
||
}
|
||
var _options = options,
|
||
_options$placement = _options.placement,
|
||
placement = _options$placement === void 0 ? state.placement : _options$placement,
|
||
_options$strategy = _options.strategy,
|
||
strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,
|
||
_options$boundary = _options.boundary,
|
||
boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,
|
||
_options$rootBoundary = _options.rootBoundary,
|
||
rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,
|
||
_options$elementConte = _options.elementContext,
|
||
elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,
|
||
_options$altBoundary = _options.altBoundary,
|
||
altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,
|
||
_options$padding = _options.padding,
|
||
padding = _options$padding === void 0 ? 0 : _options$padding;
|
||
var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));
|
||
var altContext = elementContext === popper ? reference : popper;
|
||
var popperRect = state.rects.popper;
|
||
var element = state.elements[altBoundary ? altContext : elementContext];
|
||
var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);
|
||
var referenceClientRect = getBoundingClientRect(state.elements.reference);
|
||
var popperOffsets = computeOffsets({
|
||
reference: referenceClientRect,
|
||
element: popperRect,
|
||
strategy: 'absolute',
|
||
placement: placement
|
||
});
|
||
var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));
|
||
var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect
|
||
// 0 or negative = within the clipping rect
|
||
|
||
var overflowOffsets = {
|
||
top: clippingClientRect.top - elementClientRect.top + paddingObject.top,
|
||
bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,
|
||
left: clippingClientRect.left - elementClientRect.left + paddingObject.left,
|
||
right: elementClientRect.right - clippingClientRect.right + paddingObject.right
|
||
};
|
||
var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element
|
||
|
||
if (elementContext === popper && offsetData) {
|
||
var offset = offsetData[placement];
|
||
Object.keys(overflowOffsets).forEach(function (key) {
|
||
var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;
|
||
var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';
|
||
overflowOffsets[key] += offset[axis] * multiply;
|
||
});
|
||
}
|
||
return overflowOffsets;
|
||
}
|
||
function computeAutoPlacement(state, options) {
|
||
if (options === void 0) {
|
||
options = {};
|
||
}
|
||
var _options = options,
|
||
placement = _options.placement,
|
||
boundary = _options.boundary,
|
||
rootBoundary = _options.rootBoundary,
|
||
padding = _options.padding,
|
||
flipVariations = _options.flipVariations,
|
||
_options$allowedAutoP = _options.allowedAutoPlacements,
|
||
allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP;
|
||
var variation = getVariation(placement);
|
||
var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {
|
||
return getVariation(placement) === variation;
|
||
}) : basePlacements;
|
||
var allowedPlacements = placements$1.filter(function (placement) {
|
||
return allowedAutoPlacements.indexOf(placement) >= 0;
|
||
});
|
||
if (allowedPlacements.length === 0) {
|
||
allowedPlacements = placements$1;
|
||
} // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...
|
||
|
||
var overflows = allowedPlacements.reduce(function (acc, placement) {
|
||
acc[placement] = detectOverflow(state, {
|
||
placement: placement,
|
||
boundary: boundary,
|
||
rootBoundary: rootBoundary,
|
||
padding: padding
|
||
})[getBasePlacement(placement)];
|
||
return acc;
|
||
}, {});
|
||
return Object.keys(overflows).sort(function (a, b) {
|
||
return overflows[a] - overflows[b];
|
||
});
|
||
}
|
||
function getExpandedFallbackPlacements(placement) {
|
||
if (getBasePlacement(placement) === auto) {
|
||
return [];
|
||
}
|
||
var oppositePlacement = getOppositePlacement(placement);
|
||
return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];
|
||
}
|
||
function flip(_ref) {
|
||
var state = _ref.state,
|
||
options = _ref.options,
|
||
name = _ref.name;
|
||
if (state.modifiersData[name]._skip) {
|
||
return;
|
||
}
|
||
var _options$mainAxis = options.mainAxis,
|
||
checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,
|
||
_options$altAxis = options.altAxis,
|
||
checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,
|
||
specifiedFallbackPlacements = options.fallbackPlacements,
|
||
padding = options.padding,
|
||
boundary = options.boundary,
|
||
rootBoundary = options.rootBoundary,
|
||
altBoundary = options.altBoundary,
|
||
_options$flipVariatio = options.flipVariations,
|
||
flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,
|
||
allowedAutoPlacements = options.allowedAutoPlacements;
|
||
var preferredPlacement = state.options.placement;
|
||
var basePlacement = getBasePlacement(preferredPlacement);
|
||
var isBasePlacement = basePlacement === preferredPlacement;
|
||
var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));
|
||
var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {
|
||
return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {
|
||
placement: placement,
|
||
boundary: boundary,
|
||
rootBoundary: rootBoundary,
|
||
padding: padding,
|
||
flipVariations: flipVariations,
|
||
allowedAutoPlacements: allowedAutoPlacements
|
||
}) : placement);
|
||
}, []);
|
||
var referenceRect = state.rects.reference;
|
||
var popperRect = state.rects.popper;
|
||
var checksMap = new Map();
|
||
var makeFallbackChecks = true;
|
||
var firstFittingPlacement = placements[0];
|
||
for (var i = 0; i < placements.length; i++) {
|
||
var placement = placements[i];
|
||
var _basePlacement = getBasePlacement(placement);
|
||
var isStartVariation = getVariation(placement) === start;
|
||
var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;
|
||
var len = isVertical ? 'width' : 'height';
|
||
var overflow = detectOverflow(state, {
|
||
placement: placement,
|
||
boundary: boundary,
|
||
rootBoundary: rootBoundary,
|
||
altBoundary: altBoundary,
|
||
padding: padding
|
||
});
|
||
var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;
|
||
if (referenceRect[len] > popperRect[len]) {
|
||
mainVariationSide = getOppositePlacement(mainVariationSide);
|
||
}
|
||
var altVariationSide = getOppositePlacement(mainVariationSide);
|
||
var checks = [];
|
||
if (checkMainAxis) {
|
||
checks.push(overflow[_basePlacement] <= 0);
|
||
}
|
||
if (checkAltAxis) {
|
||
checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);
|
||
}
|
||
if (checks.every(function (check) {
|
||
return check;
|
||
})) {
|
||
firstFittingPlacement = placement;
|
||
makeFallbackChecks = false;
|
||
break;
|
||
}
|
||
checksMap.set(placement, checks);
|
||
}
|
||
if (makeFallbackChecks) {
|
||
// `2` may be desired in some cases – research later
|
||
var numberOfChecks = flipVariations ? 3 : 1;
|
||
var _loop = function _loop(_i) {
|
||
var fittingPlacement = placements.find(function (placement) {
|
||
var checks = checksMap.get(placement);
|
||
if (checks) {
|
||
return checks.slice(0, _i).every(function (check) {
|
||
return check;
|
||
});
|
||
}
|
||
});
|
||
if (fittingPlacement) {
|
||
firstFittingPlacement = fittingPlacement;
|
||
return "break";
|
||
}
|
||
};
|
||
for (var _i = numberOfChecks; _i > 0; _i--) {
|
||
var _ret = _loop(_i);
|
||
if (_ret === "break") break;
|
||
}
|
||
}
|
||
if (state.placement !== firstFittingPlacement) {
|
||
state.modifiersData[name]._skip = true;
|
||
state.placement = firstFittingPlacement;
|
||
state.reset = true;
|
||
}
|
||
} // eslint-disable-next-line import/no-unused-modules
|
||
|
||
const flip$1 = {
|
||
name: 'flip',
|
||
enabled: true,
|
||
phase: 'main',
|
||
fn: flip,
|
||
requiresIfExists: ['offset'],
|
||
data: {
|
||
_skip: false
|
||
}
|
||
};
|
||
function getSideOffsets(overflow, rect, preventedOffsets) {
|
||
if (preventedOffsets === void 0) {
|
||
preventedOffsets = {
|
||
x: 0,
|
||
y: 0
|
||
};
|
||
}
|
||
return {
|
||
top: overflow.top - rect.height - preventedOffsets.y,
|
||
right: overflow.right - rect.width + preventedOffsets.x,
|
||
bottom: overflow.bottom - rect.height + preventedOffsets.y,
|
||
left: overflow.left - rect.width - preventedOffsets.x
|
||
};
|
||
}
|
||
function isAnySideFullyClipped(overflow) {
|
||
return [top, right, bottom, left].some(function (side) {
|
||
return overflow[side] >= 0;
|
||
});
|
||
}
|
||
function hide(_ref) {
|
||
var state = _ref.state,
|
||
name = _ref.name;
|
||
var referenceRect = state.rects.reference;
|
||
var popperRect = state.rects.popper;
|
||
var preventedOffsets = state.modifiersData.preventOverflow;
|
||
var referenceOverflow = detectOverflow(state, {
|
||
elementContext: 'reference'
|
||
});
|
||
var popperAltOverflow = detectOverflow(state, {
|
||
altBoundary: true
|
||
});
|
||
var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);
|
||
var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);
|
||
var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);
|
||
var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);
|
||
state.modifiersData[name] = {
|
||
referenceClippingOffsets: referenceClippingOffsets,
|
||
popperEscapeOffsets: popperEscapeOffsets,
|
||
isReferenceHidden: isReferenceHidden,
|
||
hasPopperEscaped: hasPopperEscaped
|
||
};
|
||
state.attributes.popper = Object.assign({}, state.attributes.popper, {
|
||
'data-popper-reference-hidden': isReferenceHidden,
|
||
'data-popper-escaped': hasPopperEscaped
|
||
});
|
||
} // eslint-disable-next-line import/no-unused-modules
|
||
|
||
const hide$1 = {
|
||
name: 'hide',
|
||
enabled: true,
|
||
phase: 'main',
|
||
requiresIfExists: ['preventOverflow'],
|
||
fn: hide
|
||
};
|
||
function distanceAndSkiddingToXY(placement, rects, offset) {
|
||
var basePlacement = getBasePlacement(placement);
|
||
var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;
|
||
var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {
|
||
placement: placement
|
||
})) : offset,
|
||
skidding = _ref[0],
|
||
distance = _ref[1];
|
||
skidding = skidding || 0;
|
||
distance = (distance || 0) * invertDistance;
|
||
return [left, right].indexOf(basePlacement) >= 0 ? {
|
||
x: distance,
|
||
y: skidding
|
||
} : {
|
||
x: skidding,
|
||
y: distance
|
||
};
|
||
}
|
||
function offset(_ref2) {
|
||
var state = _ref2.state,
|
||
options = _ref2.options,
|
||
name = _ref2.name;
|
||
var _options$offset = options.offset,
|
||
offset = _options$offset === void 0 ? [0, 0] : _options$offset;
|
||
var data = placements.reduce(function (acc, placement) {
|
||
acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);
|
||
return acc;
|
||
}, {});
|
||
var _data$state$placement = data[state.placement],
|
||
x = _data$state$placement.x,
|
||
y = _data$state$placement.y;
|
||
if (state.modifiersData.popperOffsets != null) {
|
||
state.modifiersData.popperOffsets.x += x;
|
||
state.modifiersData.popperOffsets.y += y;
|
||
}
|
||
state.modifiersData[name] = data;
|
||
} // eslint-disable-next-line import/no-unused-modules
|
||
|
||
const offset$1 = {
|
||
name: 'offset',
|
||
enabled: true,
|
||
phase: 'main',
|
||
requires: ['popperOffsets'],
|
||
fn: offset
|
||
};
|
||
function popperOffsets(_ref) {
|
||
var state = _ref.state,
|
||
name = _ref.name;
|
||
// Offsets are the actual position the popper needs to have to be
|
||
// properly positioned near its reference element
|
||
// This is the most basic placement, and will be adjusted by
|
||
// the modifiers in the next step
|
||
state.modifiersData[name] = computeOffsets({
|
||
reference: state.rects.reference,
|
||
element: state.rects.popper,
|
||
strategy: 'absolute',
|
||
placement: state.placement
|
||
});
|
||
} // eslint-disable-next-line import/no-unused-modules
|
||
|
||
const popperOffsets$1 = {
|
||
name: 'popperOffsets',
|
||
enabled: true,
|
||
phase: 'read',
|
||
fn: popperOffsets,
|
||
data: {}
|
||
};
|
||
function getAltAxis(axis) {
|
||
return axis === 'x' ? 'y' : 'x';
|
||
}
|
||
function preventOverflow(_ref) {
|
||
var state = _ref.state,
|
||
options = _ref.options,
|
||
name = _ref.name;
|
||
var _options$mainAxis = options.mainAxis,
|
||
checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,
|
||
_options$altAxis = options.altAxis,
|
||
checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,
|
||
boundary = options.boundary,
|
||
rootBoundary = options.rootBoundary,
|
||
altBoundary = options.altBoundary,
|
||
padding = options.padding,
|
||
_options$tether = options.tether,
|
||
tether = _options$tether === void 0 ? true : _options$tether,
|
||
_options$tetherOffset = options.tetherOffset,
|
||
tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;
|
||
var overflow = detectOverflow(state, {
|
||
boundary: boundary,
|
||
rootBoundary: rootBoundary,
|
||
padding: padding,
|
||
altBoundary: altBoundary
|
||
});
|
||
var basePlacement = getBasePlacement(state.placement);
|
||
var variation = getVariation(state.placement);
|
||
var isBasePlacement = !variation;
|
||
var mainAxis = getMainAxisFromPlacement(basePlacement);
|
||
var altAxis = getAltAxis(mainAxis);
|
||
var popperOffsets = state.modifiersData.popperOffsets;
|
||
var referenceRect = state.rects.reference;
|
||
var popperRect = state.rects.popper;
|
||
var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {
|
||
placement: state.placement
|
||
})) : tetherOffset;
|
||
var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {
|
||
mainAxis: tetherOffsetValue,
|
||
altAxis: tetherOffsetValue
|
||
} : Object.assign({
|
||
mainAxis: 0,
|
||
altAxis: 0
|
||
}, tetherOffsetValue);
|
||
var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;
|
||
var data = {
|
||
x: 0,
|
||
y: 0
|
||
};
|
||
if (!popperOffsets) {
|
||
return;
|
||
}
|
||
if (checkMainAxis) {
|
||
var _offsetModifierState$;
|
||
var mainSide = mainAxis === 'y' ? top : left;
|
||
var altSide = mainAxis === 'y' ? bottom : right;
|
||
var len = mainAxis === 'y' ? 'height' : 'width';
|
||
var offset = popperOffsets[mainAxis];
|
||
var min$1 = offset + overflow[mainSide];
|
||
var max$1 = offset - overflow[altSide];
|
||
var additive = tether ? -popperRect[len] / 2 : 0;
|
||
var minLen = variation === start ? referenceRect[len] : popperRect[len];
|
||
var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go
|
||
// outside the reference bounds
|
||
|
||
var arrowElement = state.elements.arrow;
|
||
var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {
|
||
width: 0,
|
||
height: 0
|
||
};
|
||
var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();
|
||
var arrowPaddingMin = arrowPaddingObject[mainSide];
|
||
var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want
|
||
// to include its full size in the calculation. If the reference is small
|
||
// and near the edge of a boundary, the popper can overflow even if the
|
||
// reference is not overflowing as well (e.g. virtual elements with no
|
||
// width or height)
|
||
|
||
var arrowLen = within(0, referenceRect[len], arrowRect[len]);
|
||
var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;
|
||
var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;
|
||
var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);
|
||
var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;
|
||
var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;
|
||
var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;
|
||
var tetherMax = offset + maxOffset - offsetModifierValue;
|
||
var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset, tether ? max(max$1, tetherMax) : max$1);
|
||
popperOffsets[mainAxis] = preventedOffset;
|
||
data[mainAxis] = preventedOffset - offset;
|
||
}
|
||
if (checkAltAxis) {
|
||
var _offsetModifierState$2;
|
||
var _mainSide = mainAxis === 'x' ? top : left;
|
||
var _altSide = mainAxis === 'x' ? bottom : right;
|
||
var _offset = popperOffsets[altAxis];
|
||
var _len = altAxis === 'y' ? 'height' : 'width';
|
||
var _min = _offset + overflow[_mainSide];
|
||
var _max = _offset - overflow[_altSide];
|
||
var isOriginSide = [top, left].indexOf(basePlacement) !== -1;
|
||
var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;
|
||
var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;
|
||
var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;
|
||
var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);
|
||
popperOffsets[altAxis] = _preventedOffset;
|
||
data[altAxis] = _preventedOffset - _offset;
|
||
}
|
||
state.modifiersData[name] = data;
|
||
} // eslint-disable-next-line import/no-unused-modules
|
||
|
||
const preventOverflow$1 = {
|
||
name: 'preventOverflow',
|
||
enabled: true,
|
||
phase: 'main',
|
||
fn: preventOverflow,
|
||
requiresIfExists: ['offset']
|
||
};
|
||
function getHTMLElementScroll(element) {
|
||
return {
|
||
scrollLeft: element.scrollLeft,
|
||
scrollTop: element.scrollTop
|
||
};
|
||
}
|
||
function getNodeScroll(node) {
|
||
if (node === getWindow(node) || !isHTMLElement(node)) {
|
||
return getWindowScroll(node);
|
||
} else {
|
||
return getHTMLElementScroll(node);
|
||
}
|
||
}
|
||
function isElementScaled(element) {
|
||
var rect = element.getBoundingClientRect();
|
||
var scaleX = round(rect.width) / element.offsetWidth || 1;
|
||
var scaleY = round(rect.height) / element.offsetHeight || 1;
|
||
return scaleX !== 1 || scaleY !== 1;
|
||
} // Returns the composite rect of an element relative to its offsetParent.
|
||
// Composite means it takes into account transforms as well as layout.
|
||
|
||
function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
|
||
if (isFixed === void 0) {
|
||
isFixed = false;
|
||
}
|
||
var isOffsetParentAnElement = isHTMLElement(offsetParent);
|
||
var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);
|
||
var documentElement = getDocumentElement(offsetParent);
|
||
var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);
|
||
var scroll = {
|
||
scrollLeft: 0,
|
||
scrollTop: 0
|
||
};
|
||
var offsets = {
|
||
x: 0,
|
||
y: 0
|
||
};
|
||
if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
|
||
if (getNodeName(offsetParent) !== 'body' ||
|
||
// https://github.com/popperjs/popper-core/issues/1078
|
||
isScrollParent(documentElement)) {
|
||
scroll = getNodeScroll(offsetParent);
|
||
}
|
||
if (isHTMLElement(offsetParent)) {
|
||
offsets = getBoundingClientRect(offsetParent, true);
|
||
offsets.x += offsetParent.clientLeft;
|
||
offsets.y += offsetParent.clientTop;
|
||
} else if (documentElement) {
|
||
offsets.x = getWindowScrollBarX(documentElement);
|
||
}
|
||
}
|
||
return {
|
||
x: rect.left + scroll.scrollLeft - offsets.x,
|
||
y: rect.top + scroll.scrollTop - offsets.y,
|
||
width: rect.width,
|
||
height: rect.height
|
||
};
|
||
}
|
||
function order(modifiers) {
|
||
var map = new Map();
|
||
var visited = new Set();
|
||
var result = [];
|
||
modifiers.forEach(function (modifier) {
|
||
map.set(modifier.name, modifier);
|
||
}); // On visiting object, check for its dependencies and visit them recursively
|
||
|
||
function sort(modifier) {
|
||
visited.add(modifier.name);
|
||
var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);
|
||
requires.forEach(function (dep) {
|
||
if (!visited.has(dep)) {
|
||
var depModifier = map.get(dep);
|
||
if (depModifier) {
|
||
sort(depModifier);
|
||
}
|
||
}
|
||
});
|
||
result.push(modifier);
|
||
}
|
||
modifiers.forEach(function (modifier) {
|
||
if (!visited.has(modifier.name)) {
|
||
// check for visited object
|
||
sort(modifier);
|
||
}
|
||
});
|
||
return result;
|
||
}
|
||
function orderModifiers(modifiers) {
|
||
// order based on dependencies
|
||
var orderedModifiers = order(modifiers); // order based on phase
|
||
|
||
return modifierPhases.reduce(function (acc, phase) {
|
||
return acc.concat(orderedModifiers.filter(function (modifier) {
|
||
return modifier.phase === phase;
|
||
}));
|
||
}, []);
|
||
}
|
||
function debounce(fn) {
|
||
var pending;
|
||
return function () {
|
||
if (!pending) {
|
||
pending = new Promise(function (resolve) {
|
||
Promise.resolve().then(function () {
|
||
pending = undefined;
|
||
resolve(fn());
|
||
});
|
||
});
|
||
}
|
||
return pending;
|
||
};
|
||
}
|
||
function mergeByName(modifiers) {
|
||
var merged = modifiers.reduce(function (merged, current) {
|
||
var existing = merged[current.name];
|
||
merged[current.name] = existing ? Object.assign({}, existing, current, {
|
||
options: Object.assign({}, existing.options, current.options),
|
||
data: Object.assign({}, existing.data, current.data)
|
||
}) : current;
|
||
return merged;
|
||
}, {}); // IE11 does not support Object.values
|
||
|
||
return Object.keys(merged).map(function (key) {
|
||
return merged[key];
|
||
});
|
||
}
|
||
var DEFAULT_OPTIONS = {
|
||
placement: 'bottom',
|
||
modifiers: [],
|
||
strategy: 'absolute'
|
||
};
|
||
function areValidElements() {
|
||
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
||
args[_key] = arguments[_key];
|
||
}
|
||
return !args.some(function (element) {
|
||
return !(element && typeof element.getBoundingClientRect === 'function');
|
||
});
|
||
}
|
||
function popperGenerator(generatorOptions) {
|
||
if (generatorOptions === void 0) {
|
||
generatorOptions = {};
|
||
}
|
||
var _generatorOptions = generatorOptions,
|
||
_generatorOptions$def = _generatorOptions.defaultModifiers,
|
||
defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,
|
||
_generatorOptions$def2 = _generatorOptions.defaultOptions,
|
||
defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;
|
||
return function createPopper(reference, popper, options) {
|
||
if (options === void 0) {
|
||
options = defaultOptions;
|
||
}
|
||
var state = {
|
||
placement: 'bottom',
|
||
orderedModifiers: [],
|
||
options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),
|
||
modifiersData: {},
|
||
elements: {
|
||
reference: reference,
|
||
popper: popper
|
||
},
|
||
attributes: {},
|
||
styles: {}
|
||
};
|
||
var effectCleanupFns = [];
|
||
var isDestroyed = false;
|
||
var instance = {
|
||
state: state,
|
||
setOptions: function setOptions(setOptionsAction) {
|
||
var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;
|
||
cleanupModifierEffects();
|
||
state.options = Object.assign({}, defaultOptions, state.options, options);
|
||
state.scrollParents = {
|
||
reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],
|
||
popper: listScrollParents(popper)
|
||
}; // Orders the modifiers based on their dependencies and `phase`
|
||
// properties
|
||
|
||
var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers
|
||
|
||
state.orderedModifiers = orderedModifiers.filter(function (m) {
|
||
return m.enabled;
|
||
});
|
||
runModifierEffects();
|
||
return instance.update();
|
||
},
|
||
// Sync update – it will always be executed, even if not necessary. This
|
||
// is useful for low frequency updates where sync behavior simplifies the
|
||
// logic.
|
||
// For high frequency updates (e.g. `resize` and `scroll` events), always
|
||
// prefer the async Popper#update method
|
||
forceUpdate: function forceUpdate() {
|
||
if (isDestroyed) {
|
||
return;
|
||
}
|
||
var _state$elements = state.elements,
|
||
reference = _state$elements.reference,
|
||
popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements
|
||
// anymore
|
||
|
||
if (!areValidElements(reference, popper)) {
|
||
return;
|
||
} // Store the reference and popper rects to be read by modifiers
|
||
|
||
state.rects = {
|
||
reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),
|
||
popper: getLayoutRect(popper)
|
||
}; // Modifiers have the ability to reset the current update cycle. The
|
||
// most common use case for this is the `flip` modifier changing the
|
||
// placement, which then needs to re-run all the modifiers, because the
|
||
// logic was previously ran for the previous placement and is therefore
|
||
// stale/incorrect
|
||
|
||
state.reset = false;
|
||
state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier
|
||
// is filled with the initial data specified by the modifier. This means
|
||
// it doesn't persist and is fresh on each update.
|
||
// To ensure persistent data, use `${name}#persistent`
|
||
|
||
state.orderedModifiers.forEach(function (modifier) {
|
||
return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);
|
||
});
|
||
for (var index = 0; index < state.orderedModifiers.length; index++) {
|
||
if (state.reset === true) {
|
||
state.reset = false;
|
||
index = -1;
|
||
continue;
|
||
}
|
||
var _state$orderedModifie = state.orderedModifiers[index],
|
||
fn = _state$orderedModifie.fn,
|
||
_state$orderedModifie2 = _state$orderedModifie.options,
|
||
_options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,
|
||
name = _state$orderedModifie.name;
|
||
if (typeof fn === 'function') {
|
||
state = fn({
|
||
state: state,
|
||
options: _options,
|
||
name: name,
|
||
instance: instance
|
||
}) || state;
|
||
}
|
||
}
|
||
},
|
||
// Async and optimistically optimized update – it will not be executed if
|
||
// not necessary (debounced to run at most once-per-tick)
|
||
update: debounce(function () {
|
||
return new Promise(function (resolve) {
|
||
instance.forceUpdate();
|
||
resolve(state);
|
||
});
|
||
}),
|
||
destroy: function destroy() {
|
||
cleanupModifierEffects();
|
||
isDestroyed = true;
|
||
}
|
||
};
|
||
if (!areValidElements(reference, popper)) {
|
||
return instance;
|
||
}
|
||
instance.setOptions(options).then(function (state) {
|
||
if (!isDestroyed && options.onFirstUpdate) {
|
||
options.onFirstUpdate(state);
|
||
}
|
||
}); // Modifiers have the ability to execute arbitrary code before the first
|
||
// update cycle runs. They will be executed in the same order as the update
|
||
// cycle. This is useful when a modifier adds some persistent data that
|
||
// other modifiers need to use, but the modifier is run after the dependent
|
||
// one.
|
||
|
||
function runModifierEffects() {
|
||
state.orderedModifiers.forEach(function (_ref) {
|
||
var name = _ref.name,
|
||
_ref$options = _ref.options,
|
||
options = _ref$options === void 0 ? {} : _ref$options,
|
||
effect = _ref.effect;
|
||
if (typeof effect === 'function') {
|
||
var cleanupFn = effect({
|
||
state: state,
|
||
name: name,
|
||
instance: instance,
|
||
options: options
|
||
});
|
||
var noopFn = function noopFn() {};
|
||
effectCleanupFns.push(cleanupFn || noopFn);
|
||
}
|
||
});
|
||
}
|
||
function cleanupModifierEffects() {
|
||
effectCleanupFns.forEach(function (fn) {
|
||
return fn();
|
||
});
|
||
effectCleanupFns = [];
|
||
}
|
||
return instance;
|
||
};
|
||
}
|
||
var createPopper$2 = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules
|
||
|
||
var defaultModifiers$1 = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1];
|
||
var createPopper$1 = /*#__PURE__*/popperGenerator({
|
||
defaultModifiers: defaultModifiers$1
|
||
}); // eslint-disable-next-line import/no-unused-modules
|
||
|
||
var defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1];
|
||
var createPopper = /*#__PURE__*/popperGenerator({
|
||
defaultModifiers: defaultModifiers
|
||
}); // eslint-disable-next-line import/no-unused-modules
|
||
|
||
const Popper = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
|
||
__proto__: null,
|
||
afterMain,
|
||
afterRead,
|
||
afterWrite,
|
||
applyStyles: applyStyles$1,
|
||
arrow: arrow$1,
|
||
auto,
|
||
basePlacements,
|
||
beforeMain,
|
||
beforeRead,
|
||
beforeWrite,
|
||
bottom,
|
||
clippingParents,
|
||
computeStyles: computeStyles$1,
|
||
createPopper,
|
||
createPopperBase: createPopper$2,
|
||
createPopperLite: createPopper$1,
|
||
detectOverflow,
|
||
end,
|
||
eventListeners,
|
||
flip: flip$1,
|
||
hide: hide$1,
|
||
left,
|
||
main,
|
||
modifierPhases,
|
||
offset: offset$1,
|
||
placements,
|
||
popper,
|
||
popperGenerator,
|
||
popperOffsets: popperOffsets$1,
|
||
preventOverflow: preventOverflow$1,
|
||
read,
|
||
reference,
|
||
right,
|
||
start,
|
||
top,
|
||
variationPlacements,
|
||
viewport,
|
||
write
|
||
}, Symbol.toStringTag, {
|
||
value: 'Module'
|
||
}));
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap dropdown.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Constants
|
||
*/
|
||
|
||
const NAME$a = 'dropdown';
|
||
const DATA_KEY$6 = 'bs.dropdown';
|
||
const EVENT_KEY$6 = `.${DATA_KEY$6}`;
|
||
const DATA_API_KEY$3 = '.data-api';
|
||
const ESCAPE_KEY$2 = 'Escape';
|
||
const TAB_KEY$1 = 'Tab';
|
||
const ARROW_UP_KEY$1 = 'ArrowUp';
|
||
const ARROW_DOWN_KEY$1 = 'ArrowDown';
|
||
const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button
|
||
|
||
const EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;
|
||
const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;
|
||
const EVENT_SHOW$5 = `show${EVENT_KEY$6}`;
|
||
const EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;
|
||
const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;
|
||
const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;
|
||
const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;
|
||
const CLASS_NAME_SHOW$6 = 'show';
|
||
const CLASS_NAME_DROPUP = 'dropup';
|
||
const CLASS_NAME_DROPEND = 'dropend';
|
||
const CLASS_NAME_DROPSTART = 'dropstart';
|
||
const CLASS_NAME_DROPUP_CENTER = 'dropup-center';
|
||
const CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';
|
||
const SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)';
|
||
const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;
|
||
const SELECTOR_MENU = '.dropdown-menu';
|
||
const SELECTOR_NAVBAR = '.navbar';
|
||
const SELECTOR_NAVBAR_NAV = '.navbar-nav';
|
||
const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
|
||
const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';
|
||
const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';
|
||
const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';
|
||
const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';
|
||
const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';
|
||
const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';
|
||
const PLACEMENT_TOPCENTER = 'top';
|
||
const PLACEMENT_BOTTOMCENTER = 'bottom';
|
||
const Default$9 = {
|
||
autoClose: true,
|
||
boundary: 'clippingParents',
|
||
display: 'dynamic',
|
||
offset: [0, 2],
|
||
popperConfig: null,
|
||
reference: 'toggle'
|
||
};
|
||
const DefaultType$9 = {
|
||
autoClose: '(boolean|string)',
|
||
boundary: '(string|element)',
|
||
display: 'string',
|
||
offset: '(array|string|function)',
|
||
popperConfig: '(null|object|function)',
|
||
reference: '(string|element|object)'
|
||
};
|
||
|
||
/**
|
||
* Class definition
|
||
*/
|
||
|
||
class Dropdown extends BaseComponent {
|
||
constructor(element, config) {
|
||
super(element, config);
|
||
this._popper = null;
|
||
this._parent = this._element.parentNode; // dropdown wrapper
|
||
// TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/
|
||
this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);
|
||
this._inNavbar = this._detectNavbar();
|
||
}
|
||
|
||
// Getters
|
||
static get Default() {
|
||
return Default$9;
|
||
}
|
||
static get DefaultType() {
|
||
return DefaultType$9;
|
||
}
|
||
static get NAME() {
|
||
return NAME$a;
|
||
}
|
||
|
||
// Public
|
||
toggle() {
|
||
return this._isShown() ? this.hide() : this.show();
|
||
}
|
||
show() {
|
||
if (isDisabled(this._element) || this._isShown()) {
|
||
return;
|
||
}
|
||
const relatedTarget = {
|
||
relatedTarget: this._element
|
||
};
|
||
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);
|
||
if (showEvent.defaultPrevented) {
|
||
return;
|
||
}
|
||
this._createPopper();
|
||
|
||
// If this is a touch-enabled device we add extra
|
||
// empty mouseover listeners to the body's immediate children;
|
||
// only needed because of broken event delegation on iOS
|
||
// https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
|
||
if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {
|
||
for (const element of [].concat(...document.body.children)) {
|
||
EventHandler.on(element, 'mouseover', noop);
|
||
}
|
||
}
|
||
this._element.focus();
|
||
this._element.setAttribute('aria-expanded', true);
|
||
this._menu.classList.add(CLASS_NAME_SHOW$6);
|
||
this._element.classList.add(CLASS_NAME_SHOW$6);
|
||
EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);
|
||
}
|
||
hide() {
|
||
if (isDisabled(this._element) || !this._isShown()) {
|
||
return;
|
||
}
|
||
const relatedTarget = {
|
||
relatedTarget: this._element
|
||
};
|
||
this._completeHide(relatedTarget);
|
||
}
|
||
dispose() {
|
||
if (this._popper) {
|
||
this._popper.destroy();
|
||
}
|
||
super.dispose();
|
||
}
|
||
update() {
|
||
this._inNavbar = this._detectNavbar();
|
||
if (this._popper) {
|
||
this._popper.update();
|
||
}
|
||
}
|
||
|
||
// Private
|
||
_completeHide(relatedTarget) {
|
||
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);
|
||
if (hideEvent.defaultPrevented) {
|
||
return;
|
||
}
|
||
|
||
// If this is a touch-enabled device we remove the extra
|
||
// empty mouseover listeners we added for iOS support
|
||
if ('ontouchstart' in document.documentElement) {
|
||
for (const element of [].concat(...document.body.children)) {
|
||
EventHandler.off(element, 'mouseover', noop);
|
||
}
|
||
}
|
||
if (this._popper) {
|
||
this._popper.destroy();
|
||
}
|
||
this._menu.classList.remove(CLASS_NAME_SHOW$6);
|
||
this._element.classList.remove(CLASS_NAME_SHOW$6);
|
||
this._element.setAttribute('aria-expanded', 'false');
|
||
Manipulator.removeDataAttribute(this._menu, 'popper');
|
||
EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);
|
||
}
|
||
_getConfig(config) {
|
||
config = super._getConfig(config);
|
||
if (typeof config.reference === 'object' && !isElement$1(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {
|
||
// Popper virtual elements require a getBoundingClientRect method
|
||
throw new TypeError(`${NAME$a.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
|
||
}
|
||
return config;
|
||
}
|
||
_createPopper() {
|
||
if (typeof Popper === 'undefined') {
|
||
throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
|
||
}
|
||
let referenceElement = this._element;
|
||
if (this._config.reference === 'parent') {
|
||
referenceElement = this._parent;
|
||
} else if (isElement$1(this._config.reference)) {
|
||
referenceElement = getElement(this._config.reference);
|
||
} else if (typeof this._config.reference === 'object') {
|
||
referenceElement = this._config.reference;
|
||
}
|
||
const popperConfig = this._getPopperConfig();
|
||
this._popper = createPopper(referenceElement, this._menu, popperConfig);
|
||
}
|
||
_isShown() {
|
||
return this._menu.classList.contains(CLASS_NAME_SHOW$6);
|
||
}
|
||
_getPlacement() {
|
||
const parentDropdown = this._parent;
|
||
if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
|
||
return PLACEMENT_RIGHT;
|
||
}
|
||
if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
|
||
return PLACEMENT_LEFT;
|
||
}
|
||
if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {
|
||
return PLACEMENT_TOPCENTER;
|
||
}
|
||
if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {
|
||
return PLACEMENT_BOTTOMCENTER;
|
||
}
|
||
|
||
// We need to trim the value because custom properties can also include spaces
|
||
const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';
|
||
if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
|
||
return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
|
||
}
|
||
return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
|
||
}
|
||
_detectNavbar() {
|
||
return this._element.closest(SELECTOR_NAVBAR) !== null;
|
||
}
|
||
_getOffset() {
|
||
const {
|
||
offset
|
||
} = this._config;
|
||
if (typeof offset === 'string') {
|
||
return offset.split(',').map(value => Number.parseInt(value, 10));
|
||
}
|
||
if (typeof offset === 'function') {
|
||
return popperData => offset(popperData, this._element);
|
||
}
|
||
return offset;
|
||
}
|
||
_getPopperConfig() {
|
||
const defaultBsPopperConfig = {
|
||
placement: this._getPlacement(),
|
||
modifiers: [{
|
||
name: 'preventOverflow',
|
||
options: {
|
||
boundary: this._config.boundary
|
||
}
|
||
}, {
|
||
name: 'offset',
|
||
options: {
|
||
offset: this._getOffset()
|
||
}
|
||
}]
|
||
};
|
||
|
||
// Disable Popper if we have a static display or Dropdown is in Navbar
|
||
if (this._inNavbar || this._config.display === 'static') {
|
||
Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove
|
||
defaultBsPopperConfig.modifiers = [{
|
||
name: 'applyStyles',
|
||
enabled: false
|
||
}];
|
||
}
|
||
return {
|
||
...defaultBsPopperConfig,
|
||
...execute(this._config.popperConfig, [defaultBsPopperConfig])
|
||
};
|
||
}
|
||
_selectMenuItem(_ref7) {
|
||
let {
|
||
key,
|
||
target
|
||
} = _ref7;
|
||
const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element));
|
||
if (!items.length) {
|
||
return;
|
||
}
|
||
|
||
// if target isn't included in items (e.g. when expanding the dropdown)
|
||
// allow cycling to get the last item in case key equals ARROW_UP_KEY
|
||
getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();
|
||
}
|
||
|
||
// Static
|
||
static jQueryInterface(config) {
|
||
return this.each(function () {
|
||
const data = Dropdown.getOrCreateInstance(this, config);
|
||
if (typeof config !== 'string') {
|
||
return;
|
||
}
|
||
if (typeof data[config] === 'undefined') {
|
||
throw new TypeError(`No method named "${config}"`);
|
||
}
|
||
data[config]();
|
||
});
|
||
}
|
||
static clearMenus(event) {
|
||
if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) {
|
||
return;
|
||
}
|
||
const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);
|
||
for (const toggle of openToggles) {
|
||
const context = Dropdown.getInstance(toggle);
|
||
if (!context || context._config.autoClose === false) {
|
||
continue;
|
||
}
|
||
const composedPath = event.composedPath();
|
||
const isMenuTarget = composedPath.includes(context._menu);
|
||
if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {
|
||
continue;
|
||
}
|
||
|
||
// Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu
|
||
if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {
|
||
continue;
|
||
}
|
||
const relatedTarget = {
|
||
relatedTarget: context._element
|
||
};
|
||
if (event.type === 'click') {
|
||
relatedTarget.clickEvent = event;
|
||
}
|
||
context._completeHide(relatedTarget);
|
||
}
|
||
}
|
||
static dataApiKeydownHandler(event) {
|
||
// If not an UP | DOWN | ESCAPE key => not a dropdown command
|
||
// If input/textarea && if key is other than ESCAPE => not a dropdown command
|
||
|
||
const isInput = /input|textarea/i.test(event.target.tagName);
|
||
const isEscapeEvent = event.key === ESCAPE_KEY$2;
|
||
const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);
|
||
if (!isUpOrDownEvent && !isEscapeEvent) {
|
||
return;
|
||
}
|
||
if (isInput && !isEscapeEvent) {
|
||
return;
|
||
}
|
||
event.preventDefault();
|
||
|
||
// TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/
|
||
const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);
|
||
const instance = Dropdown.getOrCreateInstance(getToggleButton);
|
||
if (isUpOrDownEvent) {
|
||
event.stopPropagation();
|
||
instance.show();
|
||
instance._selectMenuItem(event);
|
||
return;
|
||
}
|
||
if (instance._isShown()) {
|
||
// else is escape and we check if it is shown
|
||
event.stopPropagation();
|
||
instance.hide();
|
||
getToggleButton.focus();
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Data API implementation
|
||
*/
|
||
|
||
EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);
|
||
EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
|
||
EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);
|
||
EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
|
||
EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {
|
||
event.preventDefault();
|
||
Dropdown.getOrCreateInstance(this).toggle();
|
||
});
|
||
|
||
/**
|
||
* jQuery
|
||
*/
|
||
|
||
defineJQueryPlugin(Dropdown);
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap util/backdrop.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Constants
|
||
*/
|
||
|
||
const NAME$9 = 'backdrop';
|
||
const CLASS_NAME_FADE$4 = 'fade';
|
||
const CLASS_NAME_SHOW$5 = 'show';
|
||
const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;
|
||
const Default$8 = {
|
||
className: 'modal-backdrop',
|
||
clickCallback: null,
|
||
isAnimated: false,
|
||
isVisible: true,
|
||
// if false, we use the backdrop helper without adding any element to the dom
|
||
rootElement: 'body' // give the choice to place backdrop under different elements
|
||
};
|
||
const DefaultType$8 = {
|
||
className: 'string',
|
||
clickCallback: '(function|null)',
|
||
isAnimated: 'boolean',
|
||
isVisible: 'boolean',
|
||
rootElement: '(element|string)'
|
||
};
|
||
|
||
/**
|
||
* Class definition
|
||
*/
|
||
|
||
class Backdrop extends Config {
|
||
constructor(config) {
|
||
super();
|
||
this._config = this._getConfig(config);
|
||
this._isAppended = false;
|
||
this._element = null;
|
||
}
|
||
|
||
// Getters
|
||
static get Default() {
|
||
return Default$8;
|
||
}
|
||
static get DefaultType() {
|
||
return DefaultType$8;
|
||
}
|
||
static get NAME() {
|
||
return NAME$9;
|
||
}
|
||
|
||
// Public
|
||
show(callback) {
|
||
if (!this._config.isVisible) {
|
||
execute(callback);
|
||
return;
|
||
}
|
||
this._append();
|
||
const element = this._getElement();
|
||
if (this._config.isAnimated) {
|
||
reflow(element);
|
||
}
|
||
element.classList.add(CLASS_NAME_SHOW$5);
|
||
this._emulateAnimation(() => {
|
||
execute(callback);
|
||
});
|
||
}
|
||
hide(callback) {
|
||
if (!this._config.isVisible) {
|
||
execute(callback);
|
||
return;
|
||
}
|
||
this._getElement().classList.remove(CLASS_NAME_SHOW$5);
|
||
this._emulateAnimation(() => {
|
||
this.dispose();
|
||
execute(callback);
|
||
});
|
||
}
|
||
dispose() {
|
||
if (!this._isAppended) {
|
||
return;
|
||
}
|
||
EventHandler.off(this._element, EVENT_MOUSEDOWN);
|
||
this._element.remove();
|
||
this._isAppended = false;
|
||
}
|
||
|
||
// Private
|
||
_getElement() {
|
||
if (!this._element) {
|
||
const backdrop = document.createElement('div');
|
||
backdrop.className = this._config.className;
|
||
if (this._config.isAnimated) {
|
||
backdrop.classList.add(CLASS_NAME_FADE$4);
|
||
}
|
||
this._element = backdrop;
|
||
}
|
||
return this._element;
|
||
}
|
||
_configAfterMerge(config) {
|
||
// use getElement() with the default "body" to get a fresh Element on each instantiation
|
||
config.rootElement = getElement(config.rootElement);
|
||
return config;
|
||
}
|
||
_append() {
|
||
if (this._isAppended) {
|
||
return;
|
||
}
|
||
const element = this._getElement();
|
||
this._config.rootElement.append(element);
|
||
EventHandler.on(element, EVENT_MOUSEDOWN, () => {
|
||
execute(this._config.clickCallback);
|
||
});
|
||
this._isAppended = true;
|
||
}
|
||
_emulateAnimation(callback) {
|
||
executeAfterTransition(callback, this._getElement(), this._config.isAnimated);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap util/focustrap.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Constants
|
||
*/
|
||
|
||
const NAME$8 = 'focustrap';
|
||
const DATA_KEY$5 = 'bs.focustrap';
|
||
const EVENT_KEY$5 = `.${DATA_KEY$5}`;
|
||
const EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;
|
||
const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;
|
||
const TAB_KEY = 'Tab';
|
||
const TAB_NAV_FORWARD = 'forward';
|
||
const TAB_NAV_BACKWARD = 'backward';
|
||
const Default$7 = {
|
||
autofocus: true,
|
||
trapElement: null // The element to trap focus inside of
|
||
};
|
||
const DefaultType$7 = {
|
||
autofocus: 'boolean',
|
||
trapElement: 'element'
|
||
};
|
||
|
||
/**
|
||
* Class definition
|
||
*/
|
||
|
||
class FocusTrap extends Config {
|
||
constructor(config) {
|
||
super();
|
||
this._config = this._getConfig(config);
|
||
this._isActive = false;
|
||
this._lastTabNavDirection = null;
|
||
}
|
||
|
||
// Getters
|
||
static get Default() {
|
||
return Default$7;
|
||
}
|
||
static get DefaultType() {
|
||
return DefaultType$7;
|
||
}
|
||
static get NAME() {
|
||
return NAME$8;
|
||
}
|
||
|
||
// Public
|
||
activate() {
|
||
if (this._isActive) {
|
||
return;
|
||
}
|
||
if (this._config.autofocus) {
|
||
this._config.trapElement.focus();
|
||
}
|
||
EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop
|
||
EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));
|
||
EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));
|
||
this._isActive = true;
|
||
}
|
||
deactivate() {
|
||
if (!this._isActive) {
|
||
return;
|
||
}
|
||
this._isActive = false;
|
||
EventHandler.off(document, EVENT_KEY$5);
|
||
}
|
||
|
||
// Private
|
||
_handleFocusin(event) {
|
||
const {
|
||
trapElement
|
||
} = this._config;
|
||
if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {
|
||
return;
|
||
}
|
||
const elements = SelectorEngine.focusableChildren(trapElement);
|
||
if (elements.length === 0) {
|
||
trapElement.focus();
|
||
} else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
|
||
elements[elements.length - 1].focus();
|
||
} else {
|
||
elements[0].focus();
|
||
}
|
||
}
|
||
_handleKeydown(event) {
|
||
if (event.key !== TAB_KEY) {
|
||
return;
|
||
}
|
||
this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap util/scrollBar.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Constants
|
||
*/
|
||
|
||
const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
|
||
const SELECTOR_STICKY_CONTENT = '.sticky-top';
|
||
const PROPERTY_PADDING = 'padding-right';
|
||
const PROPERTY_MARGIN = 'margin-right';
|
||
|
||
/**
|
||
* Class definition
|
||
*/
|
||
|
||
class ScrollBarHelper {
|
||
constructor() {
|
||
this._element = document.body;
|
||
}
|
||
|
||
// Public
|
||
getWidth() {
|
||
// https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
|
||
const documentWidth = document.documentElement.clientWidth;
|
||
return Math.abs(window.innerWidth - documentWidth);
|
||
}
|
||
hide() {
|
||
const width = this.getWidth();
|
||
this._disableOverFlow();
|
||
// give padding to element to balance the hidden scrollbar width
|
||
this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);
|
||
// trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth
|
||
this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);
|
||
this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);
|
||
}
|
||
reset() {
|
||
this._resetElementAttributes(this._element, 'overflow');
|
||
this._resetElementAttributes(this._element, PROPERTY_PADDING);
|
||
this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);
|
||
this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);
|
||
}
|
||
isOverflowing() {
|
||
return this.getWidth() > 0;
|
||
}
|
||
|
||
// Private
|
||
_disableOverFlow() {
|
||
this._saveInitialAttribute(this._element, 'overflow');
|
||
this._element.style.overflow = 'hidden';
|
||
}
|
||
_setElementAttributes(selector, styleProperty, callback) {
|
||
const scrollbarWidth = this.getWidth();
|
||
const manipulationCallBack = element => {
|
||
if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
|
||
return;
|
||
}
|
||
this._saveInitialAttribute(element, styleProperty);
|
||
const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);
|
||
element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);
|
||
};
|
||
this._applyManipulationCallback(selector, manipulationCallBack);
|
||
}
|
||
_saveInitialAttribute(element, styleProperty) {
|
||
const actualValue = element.style.getPropertyValue(styleProperty);
|
||
if (actualValue) {
|
||
Manipulator.setDataAttribute(element, styleProperty, actualValue);
|
||
}
|
||
}
|
||
_resetElementAttributes(selector, styleProperty) {
|
||
const manipulationCallBack = element => {
|
||
const value = Manipulator.getDataAttribute(element, styleProperty);
|
||
// We only want to remove the property if the value is `null`; the value can also be zero
|
||
if (value === null) {
|
||
element.style.removeProperty(styleProperty);
|
||
return;
|
||
}
|
||
Manipulator.removeDataAttribute(element, styleProperty);
|
||
element.style.setProperty(styleProperty, value);
|
||
};
|
||
this._applyManipulationCallback(selector, manipulationCallBack);
|
||
}
|
||
_applyManipulationCallback(selector, callBack) {
|
||
if (isElement$1(selector)) {
|
||
callBack(selector);
|
||
return;
|
||
}
|
||
for (const sel of SelectorEngine.find(selector, this._element)) {
|
||
callBack(sel);
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap modal.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Constants
|
||
*/
|
||
|
||
const NAME$7 = 'modal';
|
||
const DATA_KEY$4 = 'bs.modal';
|
||
const EVENT_KEY$4 = `.${DATA_KEY$4}`;
|
||
const DATA_API_KEY$2 = '.data-api';
|
||
const ESCAPE_KEY$1 = 'Escape';
|
||
const EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;
|
||
const EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;
|
||
const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;
|
||
const EVENT_SHOW$4 = `show${EVENT_KEY$4}`;
|
||
const EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;
|
||
const EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;
|
||
const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;
|
||
const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;
|
||
const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;
|
||
const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;
|
||
const CLASS_NAME_OPEN = 'modal-open';
|
||
const CLASS_NAME_FADE$3 = 'fade';
|
||
const CLASS_NAME_SHOW$4 = 'show';
|
||
const CLASS_NAME_STATIC = 'modal-static';
|
||
const OPEN_SELECTOR$1 = '.modal.show';
|
||
const SELECTOR_DIALOG = '.modal-dialog';
|
||
const SELECTOR_MODAL_BODY = '.modal-body';
|
||
const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]';
|
||
const Default$6 = {
|
||
backdrop: true,
|
||
focus: true,
|
||
keyboard: true
|
||
};
|
||
const DefaultType$6 = {
|
||
backdrop: '(boolean|string)',
|
||
focus: 'boolean',
|
||
keyboard: 'boolean'
|
||
};
|
||
|
||
/**
|
||
* Class definition
|
||
*/
|
||
|
||
class Modal extends BaseComponent {
|
||
constructor(element, config) {
|
||
super(element, config);
|
||
this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);
|
||
this._backdrop = this._initializeBackDrop();
|
||
this._focustrap = this._initializeFocusTrap();
|
||
this._isShown = false;
|
||
this._isTransitioning = false;
|
||
this._scrollBar = new ScrollBarHelper();
|
||
this._addEventListeners();
|
||
}
|
||
|
||
// Getters
|
||
static get Default() {
|
||
return Default$6;
|
||
}
|
||
static get DefaultType() {
|
||
return DefaultType$6;
|
||
}
|
||
static get NAME() {
|
||
return NAME$7;
|
||
}
|
||
|
||
// Public
|
||
toggle(relatedTarget) {
|
||
return this._isShown ? this.hide() : this.show(relatedTarget);
|
||
}
|
||
show(relatedTarget) {
|
||
if (this._isShown || this._isTransitioning) {
|
||
return;
|
||
}
|
||
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {
|
||
relatedTarget
|
||
});
|
||
if (showEvent.defaultPrevented) {
|
||
return;
|
||
}
|
||
this._isShown = true;
|
||
this._isTransitioning = true;
|
||
this._scrollBar.hide();
|
||
document.body.classList.add(CLASS_NAME_OPEN);
|
||
this._adjustDialog();
|
||
this._backdrop.show(() => this._showElement(relatedTarget));
|
||
}
|
||
hide() {
|
||
if (!this._isShown || this._isTransitioning) {
|
||
return;
|
||
}
|
||
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);
|
||
if (hideEvent.defaultPrevented) {
|
||
return;
|
||
}
|
||
this._isShown = false;
|
||
this._isTransitioning = true;
|
||
this._focustrap.deactivate();
|
||
this._element.classList.remove(CLASS_NAME_SHOW$4);
|
||
this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());
|
||
}
|
||
dispose() {
|
||
EventHandler.off(window, EVENT_KEY$4);
|
||
EventHandler.off(this._dialog, EVENT_KEY$4);
|
||
this._backdrop.dispose();
|
||
this._focustrap.deactivate();
|
||
super.dispose();
|
||
}
|
||
handleUpdate() {
|
||
this._adjustDialog();
|
||
}
|
||
|
||
// Private
|
||
_initializeBackDrop() {
|
||
return new Backdrop({
|
||
isVisible: Boolean(this._config.backdrop),
|
||
// 'static' option will be translated to true, and booleans will keep their value,
|
||
isAnimated: this._isAnimated()
|
||
});
|
||
}
|
||
_initializeFocusTrap() {
|
||
return new FocusTrap({
|
||
trapElement: this._element
|
||
});
|
||
}
|
||
_showElement(relatedTarget) {
|
||
// try to append dynamic modal
|
||
if (!document.body.contains(this._element)) {
|
||
document.body.append(this._element);
|
||
}
|
||
this._element.style.display = 'block';
|
||
this._element.removeAttribute('aria-hidden');
|
||
this._element.setAttribute('aria-modal', true);
|
||
this._element.setAttribute('role', 'dialog');
|
||
this._element.scrollTop = 0;
|
||
const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);
|
||
if (modalBody) {
|
||
modalBody.scrollTop = 0;
|
||
}
|
||
reflow(this._element);
|
||
this._element.classList.add(CLASS_NAME_SHOW$4);
|
||
const transitionComplete = () => {
|
||
if (this._config.focus) {
|
||
this._focustrap.activate();
|
||
}
|
||
this._isTransitioning = false;
|
||
EventHandler.trigger(this._element, EVENT_SHOWN$4, {
|
||
relatedTarget
|
||
});
|
||
};
|
||
this._queueCallback(transitionComplete, this._dialog, this._isAnimated());
|
||
}
|
||
_addEventListeners() {
|
||
EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {
|
||
if (event.key !== ESCAPE_KEY$1) {
|
||
return;
|
||
}
|
||
if (this._config.keyboard) {
|
||
this.hide();
|
||
return;
|
||
}
|
||
this._triggerBackdropTransition();
|
||
});
|
||
EventHandler.on(window, EVENT_RESIZE$1, () => {
|
||
if (this._isShown && !this._isTransitioning) {
|
||
this._adjustDialog();
|
||
}
|
||
});
|
||
EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {
|
||
// a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks
|
||
EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {
|
||
if (this._element !== event.target || this._element !== event2.target) {
|
||
return;
|
||
}
|
||
if (this._config.backdrop === 'static') {
|
||
this._triggerBackdropTransition();
|
||
return;
|
||
}
|
||
if (this._config.backdrop) {
|
||
this.hide();
|
||
}
|
||
});
|
||
});
|
||
}
|
||
_hideModal() {
|
||
this._element.style.display = 'none';
|
||
this._element.setAttribute('aria-hidden', true);
|
||
this._element.removeAttribute('aria-modal');
|
||
this._element.removeAttribute('role');
|
||
this._isTransitioning = false;
|
||
this._backdrop.hide(() => {
|
||
document.body.classList.remove(CLASS_NAME_OPEN);
|
||
this._resetAdjustments();
|
||
this._scrollBar.reset();
|
||
EventHandler.trigger(this._element, EVENT_HIDDEN$4);
|
||
});
|
||
}
|
||
_isAnimated() {
|
||
return this._element.classList.contains(CLASS_NAME_FADE$3);
|
||
}
|
||
_triggerBackdropTransition() {
|
||
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);
|
||
if (hideEvent.defaultPrevented) {
|
||
return;
|
||
}
|
||
const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
|
||
const initialOverflowY = this._element.style.overflowY;
|
||
// return if the following background transition hasn't yet completed
|
||
if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {
|
||
return;
|
||
}
|
||
if (!isModalOverflowing) {
|
||
this._element.style.overflowY = 'hidden';
|
||
}
|
||
this._element.classList.add(CLASS_NAME_STATIC);
|
||
this._queueCallback(() => {
|
||
this._element.classList.remove(CLASS_NAME_STATIC);
|
||
this._queueCallback(() => {
|
||
this._element.style.overflowY = initialOverflowY;
|
||
}, this._dialog);
|
||
}, this._dialog);
|
||
this._element.focus();
|
||
}
|
||
|
||
/**
|
||
* The following methods are used to handle overflowing modals
|
||
*/
|
||
|
||
_adjustDialog() {
|
||
const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
|
||
const scrollbarWidth = this._scrollBar.getWidth();
|
||
const isBodyOverflowing = scrollbarWidth > 0;
|
||
if (isBodyOverflowing && !isModalOverflowing) {
|
||
const property = isRTL() ? 'paddingLeft' : 'paddingRight';
|
||
this._element.style[property] = `${scrollbarWidth}px`;
|
||
}
|
||
if (!isBodyOverflowing && isModalOverflowing) {
|
||
const property = isRTL() ? 'paddingRight' : 'paddingLeft';
|
||
this._element.style[property] = `${scrollbarWidth}px`;
|
||
}
|
||
}
|
||
_resetAdjustments() {
|
||
this._element.style.paddingLeft = '';
|
||
this._element.style.paddingRight = '';
|
||
}
|
||
|
||
// Static
|
||
static jQueryInterface(config, relatedTarget) {
|
||
return this.each(function () {
|
||
const data = Modal.getOrCreateInstance(this, config);
|
||
if (typeof config !== 'string') {
|
||
return;
|
||
}
|
||
if (typeof data[config] === 'undefined') {
|
||
throw new TypeError(`No method named "${config}"`);
|
||
}
|
||
data[config](relatedTarget);
|
||
});
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Data API implementation
|
||
*/
|
||
|
||
EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {
|
||
const target = SelectorEngine.getElementFromSelector(this);
|
||
if (['A', 'AREA'].includes(this.tagName)) {
|
||
event.preventDefault();
|
||
}
|
||
EventHandler.one(target, EVENT_SHOW$4, showEvent => {
|
||
if (showEvent.defaultPrevented) {
|
||
// only register focus restorer if modal will actually get shown
|
||
return;
|
||
}
|
||
EventHandler.one(target, EVENT_HIDDEN$4, () => {
|
||
if (isVisible(this)) {
|
||
this.focus();
|
||
}
|
||
});
|
||
});
|
||
|
||
// avoid conflict when clicking modal toggler while another one is open
|
||
const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);
|
||
if (alreadyOpen) {
|
||
Modal.getInstance(alreadyOpen).hide();
|
||
}
|
||
const data = Modal.getOrCreateInstance(target);
|
||
data.toggle(this);
|
||
});
|
||
enableDismissTrigger(Modal);
|
||
|
||
/**
|
||
* jQuery
|
||
*/
|
||
|
||
defineJQueryPlugin(Modal);
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap offcanvas.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Constants
|
||
*/
|
||
|
||
const NAME$6 = 'offcanvas';
|
||
const DATA_KEY$3 = 'bs.offcanvas';
|
||
const EVENT_KEY$3 = `.${DATA_KEY$3}`;
|
||
const DATA_API_KEY$1 = '.data-api';
|
||
const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;
|
||
const ESCAPE_KEY = 'Escape';
|
||
const CLASS_NAME_SHOW$3 = 'show';
|
||
const CLASS_NAME_SHOWING$1 = 'showing';
|
||
const CLASS_NAME_HIDING = 'hiding';
|
||
const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';
|
||
const OPEN_SELECTOR = '.offcanvas.show';
|
||
const EVENT_SHOW$3 = `show${EVENT_KEY$3}`;
|
||
const EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;
|
||
const EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;
|
||
const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;
|
||
const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;
|
||
const EVENT_RESIZE = `resize${EVENT_KEY$3}`;
|
||
const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;
|
||
const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;
|
||
const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]';
|
||
const Default$5 = {
|
||
backdrop: true,
|
||
keyboard: true,
|
||
scroll: false
|
||
};
|
||
const DefaultType$5 = {
|
||
backdrop: '(boolean|string)',
|
||
keyboard: 'boolean',
|
||
scroll: 'boolean'
|
||
};
|
||
|
||
/**
|
||
* Class definition
|
||
*/
|
||
|
||
class Offcanvas extends BaseComponent {
|
||
constructor(element, config) {
|
||
super(element, config);
|
||
this._isShown = false;
|
||
this._backdrop = this._initializeBackDrop();
|
||
this._focustrap = this._initializeFocusTrap();
|
||
this._addEventListeners();
|
||
}
|
||
|
||
// Getters
|
||
static get Default() {
|
||
return Default$5;
|
||
}
|
||
static get DefaultType() {
|
||
return DefaultType$5;
|
||
}
|
||
static get NAME() {
|
||
return NAME$6;
|
||
}
|
||
|
||
// Public
|
||
toggle(relatedTarget) {
|
||
return this._isShown ? this.hide() : this.show(relatedTarget);
|
||
}
|
||
show(relatedTarget) {
|
||
if (this._isShown) {
|
||
return;
|
||
}
|
||
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {
|
||
relatedTarget
|
||
});
|
||
if (showEvent.defaultPrevented) {
|
||
return;
|
||
}
|
||
this._isShown = true;
|
||
this._backdrop.show();
|
||
if (!this._config.scroll) {
|
||
new ScrollBarHelper().hide();
|
||
}
|
||
this._element.setAttribute('aria-modal', true);
|
||
this._element.setAttribute('role', 'dialog');
|
||
this._element.classList.add(CLASS_NAME_SHOWING$1);
|
||
const completeCallBack = () => {
|
||
if (!this._config.scroll || this._config.backdrop) {
|
||
this._focustrap.activate();
|
||
}
|
||
this._element.classList.add(CLASS_NAME_SHOW$3);
|
||
this._element.classList.remove(CLASS_NAME_SHOWING$1);
|
||
EventHandler.trigger(this._element, EVENT_SHOWN$3, {
|
||
relatedTarget
|
||
});
|
||
};
|
||
this._queueCallback(completeCallBack, this._element, true);
|
||
}
|
||
hide() {
|
||
if (!this._isShown) {
|
||
return;
|
||
}
|
||
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);
|
||
if (hideEvent.defaultPrevented) {
|
||
return;
|
||
}
|
||
this._focustrap.deactivate();
|
||
this._element.blur();
|
||
this._isShown = false;
|
||
this._element.classList.add(CLASS_NAME_HIDING);
|
||
this._backdrop.hide();
|
||
const completeCallback = () => {
|
||
this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);
|
||
this._element.removeAttribute('aria-modal');
|
||
this._element.removeAttribute('role');
|
||
if (!this._config.scroll) {
|
||
new ScrollBarHelper().reset();
|
||
}
|
||
EventHandler.trigger(this._element, EVENT_HIDDEN$3);
|
||
};
|
||
this._queueCallback(completeCallback, this._element, true);
|
||
}
|
||
dispose() {
|
||
this._backdrop.dispose();
|
||
this._focustrap.deactivate();
|
||
super.dispose();
|
||
}
|
||
|
||
// Private
|
||
_initializeBackDrop() {
|
||
const clickCallback = () => {
|
||
if (this._config.backdrop === 'static') {
|
||
EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
|
||
return;
|
||
}
|
||
this.hide();
|
||
};
|
||
|
||
// 'static' option will be translated to true, and booleans will keep their value
|
||
const isVisible = Boolean(this._config.backdrop);
|
||
return new Backdrop({
|
||
className: CLASS_NAME_BACKDROP,
|
||
isVisible,
|
||
isAnimated: true,
|
||
rootElement: this._element.parentNode,
|
||
clickCallback: isVisible ? clickCallback : null
|
||
});
|
||
}
|
||
_initializeFocusTrap() {
|
||
return new FocusTrap({
|
||
trapElement: this._element
|
||
});
|
||
}
|
||
_addEventListeners() {
|
||
EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
|
||
if (event.key !== ESCAPE_KEY) {
|
||
return;
|
||
}
|
||
if (this._config.keyboard) {
|
||
this.hide();
|
||
return;
|
||
}
|
||
EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
|
||
});
|
||
}
|
||
|
||
// Static
|
||
static jQueryInterface(config) {
|
||
return this.each(function () {
|
||
const data = Offcanvas.getOrCreateInstance(this, config);
|
||
if (typeof config !== 'string') {
|
||
return;
|
||
}
|
||
if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
|
||
throw new TypeError(`No method named "${config}"`);
|
||
}
|
||
data[config](this);
|
||
});
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Data API implementation
|
||
*/
|
||
|
||
EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {
|
||
const target = SelectorEngine.getElementFromSelector(this);
|
||
if (['A', 'AREA'].includes(this.tagName)) {
|
||
event.preventDefault();
|
||
}
|
||
if (isDisabled(this)) {
|
||
return;
|
||
}
|
||
EventHandler.one(target, EVENT_HIDDEN$3, () => {
|
||
// focus on trigger when it is closed
|
||
if (isVisible(this)) {
|
||
this.focus();
|
||
}
|
||
});
|
||
|
||
// avoid conflict when clicking a toggler of an offcanvas, while another is open
|
||
const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);
|
||
if (alreadyOpen && alreadyOpen !== target) {
|
||
Offcanvas.getInstance(alreadyOpen).hide();
|
||
}
|
||
const data = Offcanvas.getOrCreateInstance(target);
|
||
data.toggle(this);
|
||
});
|
||
EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {
|
||
for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {
|
||
Offcanvas.getOrCreateInstance(selector).show();
|
||
}
|
||
});
|
||
EventHandler.on(window, EVENT_RESIZE, () => {
|
||
for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {
|
||
if (getComputedStyle(element).position !== 'fixed') {
|
||
Offcanvas.getOrCreateInstance(element).hide();
|
||
}
|
||
}
|
||
});
|
||
enableDismissTrigger(Offcanvas);
|
||
|
||
/**
|
||
* jQuery
|
||
*/
|
||
|
||
defineJQueryPlugin(Offcanvas);
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap util/sanitizer.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
// js-docs-start allow-list
|
||
const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
|
||
const DefaultAllowlist = {
|
||
// Global attributes allowed on any supplied element below.
|
||
'*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
|
||
a: ['target', 'href', 'title', 'rel'],
|
||
area: [],
|
||
b: [],
|
||
br: [],
|
||
col: [],
|
||
code: [],
|
||
dd: [],
|
||
div: [],
|
||
dl: [],
|
||
dt: [],
|
||
em: [],
|
||
hr: [],
|
||
h1: [],
|
||
h2: [],
|
||
h3: [],
|
||
h4: [],
|
||
h5: [],
|
||
h6: [],
|
||
i: [],
|
||
img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],
|
||
li: [],
|
||
ol: [],
|
||
p: [],
|
||
pre: [],
|
||
s: [],
|
||
small: [],
|
||
span: [],
|
||
sub: [],
|
||
sup: [],
|
||
strong: [],
|
||
u: [],
|
||
ul: []
|
||
};
|
||
// js-docs-end allow-list
|
||
|
||
const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);
|
||
|
||
/**
|
||
* A pattern that recognizes URLs that are safe wrt. XSS in URL navigation
|
||
* contexts.
|
||
*
|
||
* Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38
|
||
*/
|
||
// eslint-disable-next-line unicorn/better-regex
|
||
const SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;
|
||
const allowedAttribute = (attribute, allowedAttributeList) => {
|
||
const attributeName = attribute.nodeName.toLowerCase();
|
||
if (allowedAttributeList.includes(attributeName)) {
|
||
if (uriAttributes.has(attributeName)) {
|
||
return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));
|
||
}
|
||
return true;
|
||
}
|
||
|
||
// Check if a regular expression validates the attribute.
|
||
return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));
|
||
};
|
||
function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {
|
||
if (!unsafeHtml.length) {
|
||
return unsafeHtml;
|
||
}
|
||
if (sanitizeFunction && typeof sanitizeFunction === 'function') {
|
||
return sanitizeFunction(unsafeHtml);
|
||
}
|
||
const domParser = new window.DOMParser();
|
||
const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
|
||
const elements = [].concat(...createdDocument.body.querySelectorAll('*'));
|
||
for (const element of elements) {
|
||
const elementName = element.nodeName.toLowerCase();
|
||
if (!Object.keys(allowList).includes(elementName)) {
|
||
element.remove();
|
||
continue;
|
||
}
|
||
const attributeList = [].concat(...element.attributes);
|
||
const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);
|
||
for (const attribute of attributeList) {
|
||
if (!allowedAttribute(attribute, allowedAttributes)) {
|
||
element.removeAttribute(attribute.nodeName);
|
||
}
|
||
}
|
||
}
|
||
return createdDocument.body.innerHTML;
|
||
}
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap util/template-factory.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Constants
|
||
*/
|
||
|
||
const NAME$5 = 'TemplateFactory';
|
||
const Default$4 = {
|
||
allowList: DefaultAllowlist,
|
||
content: {},
|
||
// { selector : text , selector2 : text2 , }
|
||
extraClass: '',
|
||
html: false,
|
||
sanitize: true,
|
||
sanitizeFn: null,
|
||
template: '<div></div>'
|
||
};
|
||
const DefaultType$4 = {
|
||
allowList: 'object',
|
||
content: 'object',
|
||
extraClass: '(string|function)',
|
||
html: 'boolean',
|
||
sanitize: 'boolean',
|
||
sanitizeFn: '(null|function)',
|
||
template: 'string'
|
||
};
|
||
const DefaultContentType = {
|
||
entry: '(string|element|function|null)',
|
||
selector: '(string|element)'
|
||
};
|
||
|
||
/**
|
||
* Class definition
|
||
*/
|
||
|
||
class TemplateFactory extends Config {
|
||
constructor(config) {
|
||
super();
|
||
this._config = this._getConfig(config);
|
||
}
|
||
|
||
// Getters
|
||
static get Default() {
|
||
return Default$4;
|
||
}
|
||
static get DefaultType() {
|
||
return DefaultType$4;
|
||
}
|
||
static get NAME() {
|
||
return NAME$5;
|
||
}
|
||
|
||
// Public
|
||
getContent() {
|
||
return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);
|
||
}
|
||
hasContent() {
|
||
return this.getContent().length > 0;
|
||
}
|
||
changeContent(content) {
|
||
this._checkContent(content);
|
||
this._config.content = {
|
||
...this._config.content,
|
||
...content
|
||
};
|
||
return this;
|
||
}
|
||
toHtml() {
|
||
const templateWrapper = document.createElement('div');
|
||
templateWrapper.innerHTML = this._maybeSanitize(this._config.template);
|
||
for (const [selector, text] of Object.entries(this._config.content)) {
|
||
this._setContent(templateWrapper, text, selector);
|
||
}
|
||
const template = templateWrapper.children[0];
|
||
const extraClass = this._resolvePossibleFunction(this._config.extraClass);
|
||
if (extraClass) {
|
||
template.classList.add(...extraClass.split(' '));
|
||
}
|
||
return template;
|
||
}
|
||
|
||
// Private
|
||
_typeCheckConfig(config) {
|
||
super._typeCheckConfig(config);
|
||
this._checkContent(config.content);
|
||
}
|
||
_checkContent(arg) {
|
||
for (const [selector, content] of Object.entries(arg)) {
|
||
super._typeCheckConfig({
|
||
selector,
|
||
entry: content
|
||
}, DefaultContentType);
|
||
}
|
||
}
|
||
_setContent(template, content, selector) {
|
||
const templateElement = SelectorEngine.findOne(selector, template);
|
||
if (!templateElement) {
|
||
return;
|
||
}
|
||
content = this._resolvePossibleFunction(content);
|
||
if (!content) {
|
||
templateElement.remove();
|
||
return;
|
||
}
|
||
if (isElement$1(content)) {
|
||
this._putElementInTemplate(getElement(content), templateElement);
|
||
return;
|
||
}
|
||
if (this._config.html) {
|
||
templateElement.innerHTML = this._maybeSanitize(content);
|
||
return;
|
||
}
|
||
templateElement.textContent = content;
|
||
}
|
||
_maybeSanitize(arg) {
|
||
return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;
|
||
}
|
||
_resolvePossibleFunction(arg) {
|
||
return execute(arg, [this]);
|
||
}
|
||
_putElementInTemplate(element, templateElement) {
|
||
if (this._config.html) {
|
||
templateElement.innerHTML = '';
|
||
templateElement.append(element);
|
||
return;
|
||
}
|
||
templateElement.textContent = element.textContent;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap tooltip.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Constants
|
||
*/
|
||
|
||
const NAME$4 = 'tooltip';
|
||
const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);
|
||
const CLASS_NAME_FADE$2 = 'fade';
|
||
const CLASS_NAME_MODAL = 'modal';
|
||
const CLASS_NAME_SHOW$2 = 'show';
|
||
const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';
|
||
const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;
|
||
const EVENT_MODAL_HIDE = 'hide.bs.modal';
|
||
const TRIGGER_HOVER = 'hover';
|
||
const TRIGGER_FOCUS = 'focus';
|
||
const TRIGGER_CLICK = 'click';
|
||
const TRIGGER_MANUAL = 'manual';
|
||
const EVENT_HIDE$2 = 'hide';
|
||
const EVENT_HIDDEN$2 = 'hidden';
|
||
const EVENT_SHOW$2 = 'show';
|
||
const EVENT_SHOWN$2 = 'shown';
|
||
const EVENT_INSERTED = 'inserted';
|
||
const EVENT_CLICK$1 = 'click';
|
||
const EVENT_FOCUSIN$1 = 'focusin';
|
||
const EVENT_FOCUSOUT$1 = 'focusout';
|
||
const EVENT_MOUSEENTER = 'mouseenter';
|
||
const EVENT_MOUSELEAVE = 'mouseleave';
|
||
const AttachmentMap = {
|
||
AUTO: 'auto',
|
||
TOP: 'top',
|
||
RIGHT: isRTL() ? 'left' : 'right',
|
||
BOTTOM: 'bottom',
|
||
LEFT: isRTL() ? 'right' : 'left'
|
||
};
|
||
const Default$3 = {
|
||
allowList: DefaultAllowlist,
|
||
animation: true,
|
||
boundary: 'clippingParents',
|
||
container: false,
|
||
customClass: '',
|
||
delay: 0,
|
||
fallbackPlacements: ['top', 'right', 'bottom', 'left'],
|
||
html: false,
|
||
offset: [0, 6],
|
||
placement: 'top',
|
||
popperConfig: null,
|
||
sanitize: true,
|
||
sanitizeFn: null,
|
||
selector: false,
|
||
template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-arrow"></div>' + '<div class="tooltip-inner"></div>' + '</div>',
|
||
title: '',
|
||
trigger: 'hover focus'
|
||
};
|
||
const DefaultType$3 = {
|
||
allowList: 'object',
|
||
animation: 'boolean',
|
||
boundary: '(string|element)',
|
||
container: '(string|element|boolean)',
|
||
customClass: '(string|function)',
|
||
delay: '(number|object)',
|
||
fallbackPlacements: 'array',
|
||
html: 'boolean',
|
||
offset: '(array|string|function)',
|
||
placement: '(string|function)',
|
||
popperConfig: '(null|object|function)',
|
||
sanitize: 'boolean',
|
||
sanitizeFn: '(null|function)',
|
||
selector: '(string|boolean)',
|
||
template: 'string',
|
||
title: '(string|element|function)',
|
||
trigger: 'string'
|
||
};
|
||
|
||
/**
|
||
* Class definition
|
||
*/
|
||
|
||
class Tooltip extends BaseComponent {
|
||
constructor(element, config) {
|
||
if (typeof Popper === 'undefined') {
|
||
throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)');
|
||
}
|
||
super(element, config);
|
||
|
||
// Private
|
||
this._isEnabled = true;
|
||
this._timeout = 0;
|
||
this._isHovered = null;
|
||
this._activeTrigger = {};
|
||
this._popper = null;
|
||
this._templateFactory = null;
|
||
this._newContent = null;
|
||
|
||
// Protected
|
||
this.tip = null;
|
||
this._setListeners();
|
||
if (!this._config.selector) {
|
||
this._fixTitle();
|
||
}
|
||
}
|
||
|
||
// Getters
|
||
static get Default() {
|
||
return Default$3;
|
||
}
|
||
static get DefaultType() {
|
||
return DefaultType$3;
|
||
}
|
||
static get NAME() {
|
||
return NAME$4;
|
||
}
|
||
|
||
// Public
|
||
enable() {
|
||
this._isEnabled = true;
|
||
}
|
||
disable() {
|
||
this._isEnabled = false;
|
||
}
|
||
toggleEnabled() {
|
||
this._isEnabled = !this._isEnabled;
|
||
}
|
||
toggle() {
|
||
if (!this._isEnabled) {
|
||
return;
|
||
}
|
||
this._activeTrigger.click = !this._activeTrigger.click;
|
||
if (this._isShown()) {
|
||
this._leave();
|
||
return;
|
||
}
|
||
this._enter();
|
||
}
|
||
dispose() {
|
||
clearTimeout(this._timeout);
|
||
EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
|
||
if (this._element.getAttribute('data-bs-original-title')) {
|
||
this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));
|
||
}
|
||
this._disposePopper();
|
||
super.dispose();
|
||
}
|
||
show() {
|
||
if (this._element.style.display === 'none') {
|
||
throw new Error('Please use show on visible elements');
|
||
}
|
||
if (!(this._isWithContent() && this._isEnabled)) {
|
||
return;
|
||
}
|
||
const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));
|
||
const shadowRoot = findShadowRoot(this._element);
|
||
const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);
|
||
if (showEvent.defaultPrevented || !isInTheDom) {
|
||
return;
|
||
}
|
||
|
||
// TODO: v6 remove this or make it optional
|
||
this._disposePopper();
|
||
const tip = this._getTipElement();
|
||
this._element.setAttribute('aria-describedby', tip.getAttribute('id'));
|
||
const {
|
||
container
|
||
} = this._config;
|
||
if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
|
||
container.append(tip);
|
||
EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));
|
||
}
|
||
this._popper = this._createPopper(tip);
|
||
tip.classList.add(CLASS_NAME_SHOW$2);
|
||
|
||
// If this is a touch-enabled device we add extra
|
||
// empty mouseover listeners to the body's immediate children;
|
||
// only needed because of broken event delegation on iOS
|
||
// https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
|
||
if ('ontouchstart' in document.documentElement) {
|
||
for (const element of [].concat(...document.body.children)) {
|
||
EventHandler.on(element, 'mouseover', noop);
|
||
}
|
||
}
|
||
const complete = () => {
|
||
EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));
|
||
if (this._isHovered === false) {
|
||
this._leave();
|
||
}
|
||
this._isHovered = false;
|
||
};
|
||
this._queueCallback(complete, this.tip, this._isAnimated());
|
||
}
|
||
hide() {
|
||
if (!this._isShown()) {
|
||
return;
|
||
}
|
||
const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));
|
||
if (hideEvent.defaultPrevented) {
|
||
return;
|
||
}
|
||
const tip = this._getTipElement();
|
||
tip.classList.remove(CLASS_NAME_SHOW$2);
|
||
|
||
// If this is a touch-enabled device we remove the extra
|
||
// empty mouseover listeners we added for iOS support
|
||
if ('ontouchstart' in document.documentElement) {
|
||
for (const element of [].concat(...document.body.children)) {
|
||
EventHandler.off(element, 'mouseover', noop);
|
||
}
|
||
}
|
||
this._activeTrigger[TRIGGER_CLICK] = false;
|
||
this._activeTrigger[TRIGGER_FOCUS] = false;
|
||
this._activeTrigger[TRIGGER_HOVER] = false;
|
||
this._isHovered = null; // it is a trick to support manual triggering
|
||
|
||
const complete = () => {
|
||
if (this._isWithActiveTrigger()) {
|
||
return;
|
||
}
|
||
if (!this._isHovered) {
|
||
this._disposePopper();
|
||
}
|
||
this._element.removeAttribute('aria-describedby');
|
||
EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));
|
||
};
|
||
this._queueCallback(complete, this.tip, this._isAnimated());
|
||
}
|
||
update() {
|
||
if (this._popper) {
|
||
this._popper.update();
|
||
}
|
||
}
|
||
|
||
// Protected
|
||
_isWithContent() {
|
||
return Boolean(this._getTitle());
|
||
}
|
||
_getTipElement() {
|
||
if (!this.tip) {
|
||
this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());
|
||
}
|
||
return this.tip;
|
||
}
|
||
_createTipElement(content) {
|
||
const tip = this._getTemplateFactory(content).toHtml();
|
||
|
||
// TODO: remove this check in v6
|
||
if (!tip) {
|
||
return null;
|
||
}
|
||
tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);
|
||
// TODO: v6 the following can be achieved with CSS only
|
||
tip.classList.add(`bs-${this.constructor.NAME}-auto`);
|
||
const tipId = getUID(this.constructor.NAME).toString();
|
||
tip.setAttribute('id', tipId);
|
||
if (this._isAnimated()) {
|
||
tip.classList.add(CLASS_NAME_FADE$2);
|
||
}
|
||
return tip;
|
||
}
|
||
setContent(content) {
|
||
this._newContent = content;
|
||
if (this._isShown()) {
|
||
this._disposePopper();
|
||
this.show();
|
||
}
|
||
}
|
||
_getTemplateFactory(content) {
|
||
if (this._templateFactory) {
|
||
this._templateFactory.changeContent(content);
|
||
} else {
|
||
this._templateFactory = new TemplateFactory({
|
||
...this._config,
|
||
// the `content` var has to be after `this._config`
|
||
// to override config.content in case of popover
|
||
content,
|
||
extraClass: this._resolvePossibleFunction(this._config.customClass)
|
||
});
|
||
}
|
||
return this._templateFactory;
|
||
}
|
||
_getContentForTemplate() {
|
||
return {
|
||
[SELECTOR_TOOLTIP_INNER]: this._getTitle()
|
||
};
|
||
}
|
||
_getTitle() {
|
||
return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');
|
||
}
|
||
|
||
// Private
|
||
_initializeOnDelegatedTarget(event) {
|
||
return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());
|
||
}
|
||
_isAnimated() {
|
||
return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);
|
||
}
|
||
_isShown() {
|
||
return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);
|
||
}
|
||
_createPopper(tip) {
|
||
const placement = execute(this._config.placement, [this, tip, this._element]);
|
||
const attachment = AttachmentMap[placement.toUpperCase()];
|
||
return createPopper(this._element, tip, this._getPopperConfig(attachment));
|
||
}
|
||
_getOffset() {
|
||
const {
|
||
offset
|
||
} = this._config;
|
||
if (typeof offset === 'string') {
|
||
return offset.split(',').map(value => Number.parseInt(value, 10));
|
||
}
|
||
if (typeof offset === 'function') {
|
||
return popperData => offset(popperData, this._element);
|
||
}
|
||
return offset;
|
||
}
|
||
_resolvePossibleFunction(arg) {
|
||
return execute(arg, [this._element]);
|
||
}
|
||
_getPopperConfig(attachment) {
|
||
const defaultBsPopperConfig = {
|
||
placement: attachment,
|
||
modifiers: [{
|
||
name: 'flip',
|
||
options: {
|
||
fallbackPlacements: this._config.fallbackPlacements
|
||
}
|
||
}, {
|
||
name: 'offset',
|
||
options: {
|
||
offset: this._getOffset()
|
||
}
|
||
}, {
|
||
name: 'preventOverflow',
|
||
options: {
|
||
boundary: this._config.boundary
|
||
}
|
||
}, {
|
||
name: 'arrow',
|
||
options: {
|
||
element: `.${this.constructor.NAME}-arrow`
|
||
}
|
||
}, {
|
||
name: 'preSetPlacement',
|
||
enabled: true,
|
||
phase: 'beforeMain',
|
||
fn: data => {
|
||
// Pre-set Popper's placement attribute in order to read the arrow sizes properly.
|
||
// Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement
|
||
this._getTipElement().setAttribute('data-popper-placement', data.state.placement);
|
||
}
|
||
}]
|
||
};
|
||
return {
|
||
...defaultBsPopperConfig,
|
||
...execute(this._config.popperConfig, [defaultBsPopperConfig])
|
||
};
|
||
}
|
||
_setListeners() {
|
||
const triggers = this._config.trigger.split(' ');
|
||
for (const trigger of triggers) {
|
||
if (trigger === 'click') {
|
||
EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {
|
||
const context = this._initializeOnDelegatedTarget(event);
|
||
context.toggle();
|
||
});
|
||
} else if (trigger !== TRIGGER_MANUAL) {
|
||
const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);
|
||
const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);
|
||
EventHandler.on(this._element, eventIn, this._config.selector, event => {
|
||
const context = this._initializeOnDelegatedTarget(event);
|
||
context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
|
||
context._enter();
|
||
});
|
||
EventHandler.on(this._element, eventOut, this._config.selector, event => {
|
||
const context = this._initializeOnDelegatedTarget(event);
|
||
context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);
|
||
context._leave();
|
||
});
|
||
}
|
||
}
|
||
this._hideModalHandler = () => {
|
||
if (this._element) {
|
||
this.hide();
|
||
}
|
||
};
|
||
EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
|
||
}
|
||
_fixTitle() {
|
||
const title = this._element.getAttribute('title');
|
||
if (!title) {
|
||
return;
|
||
}
|
||
if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {
|
||
this._element.setAttribute('aria-label', title);
|
||
}
|
||
this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility
|
||
this._element.removeAttribute('title');
|
||
}
|
||
_enter() {
|
||
if (this._isShown() || this._isHovered) {
|
||
this._isHovered = true;
|
||
return;
|
||
}
|
||
this._isHovered = true;
|
||
this._setTimeout(() => {
|
||
if (this._isHovered) {
|
||
this.show();
|
||
}
|
||
}, this._config.delay.show);
|
||
}
|
||
_leave() {
|
||
if (this._isWithActiveTrigger()) {
|
||
return;
|
||
}
|
||
this._isHovered = false;
|
||
this._setTimeout(() => {
|
||
if (!this._isHovered) {
|
||
this.hide();
|
||
}
|
||
}, this._config.delay.hide);
|
||
}
|
||
_setTimeout(handler, timeout) {
|
||
clearTimeout(this._timeout);
|
||
this._timeout = setTimeout(handler, timeout);
|
||
}
|
||
_isWithActiveTrigger() {
|
||
return Object.values(this._activeTrigger).includes(true);
|
||
}
|
||
_getConfig(config) {
|
||
const dataAttributes = Manipulator.getDataAttributes(this._element);
|
||
for (const dataAttribute of Object.keys(dataAttributes)) {
|
||
if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {
|
||
delete dataAttributes[dataAttribute];
|
||
}
|
||
}
|
||
config = {
|
||
...dataAttributes,
|
||
...(typeof config === 'object' && config ? config : {})
|
||
};
|
||
config = this._mergeConfigObj(config);
|
||
config = this._configAfterMerge(config);
|
||
this._typeCheckConfig(config);
|
||
return config;
|
||
}
|
||
_configAfterMerge(config) {
|
||
config.container = config.container === false ? document.body : getElement(config.container);
|
||
if (typeof config.delay === 'number') {
|
||
config.delay = {
|
||
show: config.delay,
|
||
hide: config.delay
|
||
};
|
||
}
|
||
if (typeof config.title === 'number') {
|
||
config.title = config.title.toString();
|
||
}
|
||
if (typeof config.content === 'number') {
|
||
config.content = config.content.toString();
|
||
}
|
||
return config;
|
||
}
|
||
_getDelegateConfig() {
|
||
const config = {};
|
||
for (const [key, value] of Object.entries(this._config)) {
|
||
if (this.constructor.Default[key] !== value) {
|
||
config[key] = value;
|
||
}
|
||
}
|
||
config.selector = false;
|
||
config.trigger = 'manual';
|
||
|
||
// In the future can be replaced with:
|
||
// const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])
|
||
// `Object.fromEntries(keysWithDifferentValues)`
|
||
return config;
|
||
}
|
||
_disposePopper() {
|
||
if (this._popper) {
|
||
this._popper.destroy();
|
||
this._popper = null;
|
||
}
|
||
if (this.tip) {
|
||
this.tip.remove();
|
||
this.tip = null;
|
||
}
|
||
}
|
||
|
||
// Static
|
||
static jQueryInterface(config) {
|
||
return this.each(function () {
|
||
const data = Tooltip.getOrCreateInstance(this, config);
|
||
if (typeof config !== 'string') {
|
||
return;
|
||
}
|
||
if (typeof data[config] === 'undefined') {
|
||
throw new TypeError(`No method named "${config}"`);
|
||
}
|
||
data[config]();
|
||
});
|
||
}
|
||
}
|
||
|
||
/**
|
||
* jQuery
|
||
*/
|
||
|
||
defineJQueryPlugin(Tooltip);
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap popover.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Constants
|
||
*/
|
||
|
||
const NAME$3 = 'popover';
|
||
const SELECTOR_TITLE = '.popover-header';
|
||
const SELECTOR_CONTENT = '.popover-body';
|
||
const Default$2 = {
|
||
...Tooltip.Default,
|
||
content: '',
|
||
offset: [0, 8],
|
||
placement: 'right',
|
||
template: '<div class="popover" role="tooltip">' + '<div class="popover-arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div>' + '</div>',
|
||
trigger: 'click'
|
||
};
|
||
const DefaultType$2 = {
|
||
...Tooltip.DefaultType,
|
||
content: '(null|string|element|function)'
|
||
};
|
||
|
||
/**
|
||
* Class definition
|
||
*/
|
||
|
||
class Popover extends Tooltip {
|
||
// Getters
|
||
static get Default() {
|
||
return Default$2;
|
||
}
|
||
static get DefaultType() {
|
||
return DefaultType$2;
|
||
}
|
||
static get NAME() {
|
||
return NAME$3;
|
||
}
|
||
|
||
// Overrides
|
||
_isWithContent() {
|
||
return this._getTitle() || this._getContent();
|
||
}
|
||
|
||
// Private
|
||
_getContentForTemplate() {
|
||
return {
|
||
[SELECTOR_TITLE]: this._getTitle(),
|
||
[SELECTOR_CONTENT]: this._getContent()
|
||
};
|
||
}
|
||
_getContent() {
|
||
return this._resolvePossibleFunction(this._config.content);
|
||
}
|
||
|
||
// Static
|
||
static jQueryInterface(config) {
|
||
return this.each(function () {
|
||
const data = Popover.getOrCreateInstance(this, config);
|
||
if (typeof config !== 'string') {
|
||
return;
|
||
}
|
||
if (typeof data[config] === 'undefined') {
|
||
throw new TypeError(`No method named "${config}"`);
|
||
}
|
||
data[config]();
|
||
});
|
||
}
|
||
}
|
||
|
||
/**
|
||
* jQuery
|
||
*/
|
||
|
||
defineJQueryPlugin(Popover);
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap scrollspy.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Constants
|
||
*/
|
||
|
||
const NAME$2 = 'scrollspy';
|
||
const DATA_KEY$2 = 'bs.scrollspy';
|
||
const EVENT_KEY$2 = `.${DATA_KEY$2}`;
|
||
const DATA_API_KEY = '.data-api';
|
||
const EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;
|
||
const EVENT_CLICK = `click${EVENT_KEY$2}`;
|
||
const EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;
|
||
const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';
|
||
const CLASS_NAME_ACTIVE$1 = 'active';
|
||
const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]';
|
||
const SELECTOR_TARGET_LINKS = '[href]';
|
||
const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
|
||
const SELECTOR_NAV_LINKS = '.nav-link';
|
||
const SELECTOR_NAV_ITEMS = '.nav-item';
|
||
const SELECTOR_LIST_ITEMS = '.list-group-item';
|
||
const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;
|
||
const SELECTOR_DROPDOWN = '.dropdown';
|
||
const SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';
|
||
const Default$1 = {
|
||
offset: null,
|
||
// TODO: v6 @deprecated, keep it for backwards compatibility reasons
|
||
rootMargin: '0px 0px -25%',
|
||
smoothScroll: false,
|
||
target: null,
|
||
threshold: [0.1, 0.5, 1]
|
||
};
|
||
const DefaultType$1 = {
|
||
offset: '(number|null)',
|
||
// TODO v6 @deprecated, keep it for backwards compatibility reasons
|
||
rootMargin: 'string',
|
||
smoothScroll: 'boolean',
|
||
target: 'element',
|
||
threshold: 'array'
|
||
};
|
||
|
||
/**
|
||
* Class definition
|
||
*/
|
||
|
||
class ScrollSpy extends BaseComponent {
|
||
constructor(element, config) {
|
||
super(element, config);
|
||
|
||
// this._element is the observablesContainer and config.target the menu links wrapper
|
||
this._targetLinks = new Map();
|
||
this._observableSections = new Map();
|
||
this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;
|
||
this._activeTarget = null;
|
||
this._observer = null;
|
||
this._previousScrollData = {
|
||
visibleEntryTop: 0,
|
||
parentScrollTop: 0
|
||
};
|
||
this.refresh(); // initialize
|
||
}
|
||
|
||
// Getters
|
||
static get Default() {
|
||
return Default$1;
|
||
}
|
||
static get DefaultType() {
|
||
return DefaultType$1;
|
||
}
|
||
static get NAME() {
|
||
return NAME$2;
|
||
}
|
||
|
||
// Public
|
||
refresh() {
|
||
this._initializeTargetsAndObservables();
|
||
this._maybeEnableSmoothScroll();
|
||
if (this._observer) {
|
||
this._observer.disconnect();
|
||
} else {
|
||
this._observer = this._getNewObserver();
|
||
}
|
||
for (const section of this._observableSections.values()) {
|
||
this._observer.observe(section);
|
||
}
|
||
}
|
||
dispose() {
|
||
this._observer.disconnect();
|
||
super.dispose();
|
||
}
|
||
|
||
// Private
|
||
_configAfterMerge(config) {
|
||
// TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case
|
||
config.target = getElement(config.target) || document.body;
|
||
|
||
// TODO: v6 Only for backwards compatibility reasons. Use rootMargin only
|
||
config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;
|
||
if (typeof config.threshold === 'string') {
|
||
config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));
|
||
}
|
||
return config;
|
||
}
|
||
_maybeEnableSmoothScroll() {
|
||
if (!this._config.smoothScroll) {
|
||
return;
|
||
}
|
||
|
||
// unregister any previous listeners
|
||
EventHandler.off(this._config.target, EVENT_CLICK);
|
||
EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {
|
||
const observableSection = this._observableSections.get(event.target.hash);
|
||
if (observableSection) {
|
||
event.preventDefault();
|
||
const root = this._rootElement || window;
|
||
const height = observableSection.offsetTop - this._element.offsetTop;
|
||
if (root.scrollTo) {
|
||
root.scrollTo({
|
||
top: height,
|
||
behavior: 'smooth'
|
||
});
|
||
return;
|
||
}
|
||
|
||
// Chrome 60 doesn't support `scrollTo`
|
||
root.scrollTop = height;
|
||
}
|
||
});
|
||
}
|
||
_getNewObserver() {
|
||
const options = {
|
||
root: this._rootElement,
|
||
threshold: this._config.threshold,
|
||
rootMargin: this._config.rootMargin
|
||
};
|
||
return new IntersectionObserver(entries => this._observerCallback(entries), options);
|
||
}
|
||
|
||
// The logic of selection
|
||
_observerCallback(entries) {
|
||
const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);
|
||
const activate = entry => {
|
||
this._previousScrollData.visibleEntryTop = entry.target.offsetTop;
|
||
this._process(targetElement(entry));
|
||
};
|
||
const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;
|
||
const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;
|
||
this._previousScrollData.parentScrollTop = parentScrollTop;
|
||
for (const entry of entries) {
|
||
if (!entry.isIntersecting) {
|
||
this._activeTarget = null;
|
||
this._clearActiveClass(targetElement(entry));
|
||
continue;
|
||
}
|
||
const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;
|
||
// if we are scrolling down, pick the bigger offsetTop
|
||
if (userScrollsDown && entryIsLowerThanPrevious) {
|
||
activate(entry);
|
||
// if parent isn't scrolled, let's keep the first visible item, breaking the iteration
|
||
if (!parentScrollTop) {
|
||
return;
|
||
}
|
||
continue;
|
||
}
|
||
|
||
// if we are scrolling up, pick the smallest offsetTop
|
||
if (!userScrollsDown && !entryIsLowerThanPrevious) {
|
||
activate(entry);
|
||
}
|
||
}
|
||
}
|
||
_initializeTargetsAndObservables() {
|
||
this._targetLinks = new Map();
|
||
this._observableSections = new Map();
|
||
const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);
|
||
for (const anchor of targetLinks) {
|
||
// ensure that the anchor has an id and is not disabled
|
||
if (!anchor.hash || isDisabled(anchor)) {
|
||
continue;
|
||
}
|
||
const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);
|
||
|
||
// ensure that the observableSection exists & is visible
|
||
if (isVisible(observableSection)) {
|
||
this._targetLinks.set(decodeURI(anchor.hash), anchor);
|
||
this._observableSections.set(anchor.hash, observableSection);
|
||
}
|
||
}
|
||
}
|
||
_process(target) {
|
||
if (this._activeTarget === target) {
|
||
return;
|
||
}
|
||
this._clearActiveClass(this._config.target);
|
||
this._activeTarget = target;
|
||
target.classList.add(CLASS_NAME_ACTIVE$1);
|
||
this._activateParents(target);
|
||
EventHandler.trigger(this._element, EVENT_ACTIVATE, {
|
||
relatedTarget: target
|
||
});
|
||
}
|
||
_activateParents(target) {
|
||
// Activate dropdown parents
|
||
if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
|
||
SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);
|
||
return;
|
||
}
|
||
for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {
|
||
// Set triggered links parents as active
|
||
// With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
|
||
for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {
|
||
item.classList.add(CLASS_NAME_ACTIVE$1);
|
||
}
|
||
}
|
||
}
|
||
_clearActiveClass(parent) {
|
||
parent.classList.remove(CLASS_NAME_ACTIVE$1);
|
||
const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE$1}`, parent);
|
||
for (const node of activeNodes) {
|
||
node.classList.remove(CLASS_NAME_ACTIVE$1);
|
||
}
|
||
}
|
||
|
||
// Static
|
||
static jQueryInterface(config) {
|
||
return this.each(function () {
|
||
const data = ScrollSpy.getOrCreateInstance(this, config);
|
||
if (typeof config !== 'string') {
|
||
return;
|
||
}
|
||
if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
|
||
throw new TypeError(`No method named "${config}"`);
|
||
}
|
||
data[config]();
|
||
});
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Data API implementation
|
||
*/
|
||
|
||
EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => {
|
||
for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {
|
||
ScrollSpy.getOrCreateInstance(spy);
|
||
}
|
||
});
|
||
|
||
/**
|
||
* jQuery
|
||
*/
|
||
|
||
defineJQueryPlugin(ScrollSpy);
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap tab.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Constants
|
||
*/
|
||
|
||
const NAME$1 = 'tab';
|
||
const DATA_KEY$1 = 'bs.tab';
|
||
const EVENT_KEY$1 = `.${DATA_KEY$1}`;
|
||
const EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;
|
||
const EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;
|
||
const EVENT_SHOW$1 = `show${EVENT_KEY$1}`;
|
||
const EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;
|
||
const EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}`;
|
||
const EVENT_KEYDOWN = `keydown${EVENT_KEY$1}`;
|
||
const EVENT_LOAD_DATA_API = `load${EVENT_KEY$1}`;
|
||
const ARROW_LEFT_KEY = 'ArrowLeft';
|
||
const ARROW_RIGHT_KEY = 'ArrowRight';
|
||
const ARROW_UP_KEY = 'ArrowUp';
|
||
const ARROW_DOWN_KEY = 'ArrowDown';
|
||
const HOME_KEY = 'Home';
|
||
const END_KEY = 'End';
|
||
const CLASS_NAME_ACTIVE = 'active';
|
||
const CLASS_NAME_FADE$1 = 'fade';
|
||
const CLASS_NAME_SHOW$1 = 'show';
|
||
const CLASS_DROPDOWN = 'dropdown';
|
||
const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
|
||
const SELECTOR_DROPDOWN_MENU = '.dropdown-menu';
|
||
const NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`;
|
||
const SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]';
|
||
const SELECTOR_OUTER = '.nav-item, .list-group-item';
|
||
const SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`;
|
||
const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]'; // TODO: could only be `tab` in v6
|
||
const SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`;
|
||
const SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`;
|
||
|
||
/**
|
||
* Class definition
|
||
*/
|
||
|
||
class Tab extends BaseComponent {
|
||
constructor(element) {
|
||
super(element);
|
||
this._parent = this._element.closest(SELECTOR_TAB_PANEL);
|
||
if (!this._parent) {
|
||
return;
|
||
// TODO: should throw exception in v6
|
||
// throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)
|
||
}
|
||
|
||
// Set up initial aria attributes
|
||
this._setInitialAttributes(this._parent, this._getChildren());
|
||
EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event));
|
||
}
|
||
|
||
// Getters
|
||
static get NAME() {
|
||
return NAME$1;
|
||
}
|
||
|
||
// Public
|
||
show() {
|
||
// Shows this elem and deactivate the active sibling if exists
|
||
const innerElem = this._element;
|
||
if (this._elemIsActive(innerElem)) {
|
||
return;
|
||
}
|
||
|
||
// Search for active tab on same parent to deactivate it
|
||
const active = this._getActiveElem();
|
||
const hideEvent = active ? EventHandler.trigger(active, EVENT_HIDE$1, {
|
||
relatedTarget: innerElem
|
||
}) : null;
|
||
const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW$1, {
|
||
relatedTarget: active
|
||
});
|
||
if (showEvent.defaultPrevented || hideEvent && hideEvent.defaultPrevented) {
|
||
return;
|
||
}
|
||
this._deactivate(active, innerElem);
|
||
this._activate(innerElem, active);
|
||
}
|
||
|
||
// Private
|
||
_activate(element, relatedElem) {
|
||
if (!element) {
|
||
return;
|
||
}
|
||
element.classList.add(CLASS_NAME_ACTIVE);
|
||
this._activate(SelectorEngine.getElementFromSelector(element)); // Search and activate/show the proper section
|
||
|
||
const complete = () => {
|
||
if (element.getAttribute('role') !== 'tab') {
|
||
element.classList.add(CLASS_NAME_SHOW$1);
|
||
return;
|
||
}
|
||
element.removeAttribute('tabindex');
|
||
element.setAttribute('aria-selected', true);
|
||
this._toggleDropDown(element, true);
|
||
EventHandler.trigger(element, EVENT_SHOWN$1, {
|
||
relatedTarget: relatedElem
|
||
});
|
||
};
|
||
this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));
|
||
}
|
||
_deactivate(element, relatedElem) {
|
||
if (!element) {
|
||
return;
|
||
}
|
||
element.classList.remove(CLASS_NAME_ACTIVE);
|
||
element.blur();
|
||
this._deactivate(SelectorEngine.getElementFromSelector(element)); // Search and deactivate the shown section too
|
||
|
||
const complete = () => {
|
||
if (element.getAttribute('role') !== 'tab') {
|
||
element.classList.remove(CLASS_NAME_SHOW$1);
|
||
return;
|
||
}
|
||
element.setAttribute('aria-selected', false);
|
||
element.setAttribute('tabindex', '-1');
|
||
this._toggleDropDown(element, false);
|
||
EventHandler.trigger(element, EVENT_HIDDEN$1, {
|
||
relatedTarget: relatedElem
|
||
});
|
||
};
|
||
this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));
|
||
}
|
||
_keydown(event) {
|
||
if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key)) {
|
||
return;
|
||
}
|
||
event.stopPropagation(); // stopPropagation/preventDefault both added to support up/down keys without scrolling the page
|
||
event.preventDefault();
|
||
const children = this._getChildren().filter(element => !isDisabled(element));
|
||
let nextActiveElement;
|
||
if ([HOME_KEY, END_KEY].includes(event.key)) {
|
||
nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1];
|
||
} else {
|
||
const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);
|
||
nextActiveElement = getNextActiveElement(children, event.target, isNext, true);
|
||
}
|
||
if (nextActiveElement) {
|
||
nextActiveElement.focus({
|
||
preventScroll: true
|
||
});
|
||
Tab.getOrCreateInstance(nextActiveElement).show();
|
||
}
|
||
}
|
||
_getChildren() {
|
||
// collection of inner elements
|
||
return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent);
|
||
}
|
||
_getActiveElem() {
|
||
return this._getChildren().find(child => this._elemIsActive(child)) || null;
|
||
}
|
||
_setInitialAttributes(parent, children) {
|
||
this._setAttributeIfNotExists(parent, 'role', 'tablist');
|
||
for (const child of children) {
|
||
this._setInitialAttributesOnChild(child);
|
||
}
|
||
}
|
||
_setInitialAttributesOnChild(child) {
|
||
child = this._getInnerElement(child);
|
||
const isActive = this._elemIsActive(child);
|
||
const outerElem = this._getOuterElement(child);
|
||
child.setAttribute('aria-selected', isActive);
|
||
if (outerElem !== child) {
|
||
this._setAttributeIfNotExists(outerElem, 'role', 'presentation');
|
||
}
|
||
if (!isActive) {
|
||
child.setAttribute('tabindex', '-1');
|
||
}
|
||
this._setAttributeIfNotExists(child, 'role', 'tab');
|
||
|
||
// set attributes to the related panel too
|
||
this._setInitialAttributesOnTargetPanel(child);
|
||
}
|
||
_setInitialAttributesOnTargetPanel(child) {
|
||
const target = SelectorEngine.getElementFromSelector(child);
|
||
if (!target) {
|
||
return;
|
||
}
|
||
this._setAttributeIfNotExists(target, 'role', 'tabpanel');
|
||
if (child.id) {
|
||
this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`);
|
||
}
|
||
}
|
||
_toggleDropDown(element, open) {
|
||
const outerElem = this._getOuterElement(element);
|
||
if (!outerElem.classList.contains(CLASS_DROPDOWN)) {
|
||
return;
|
||
}
|
||
const toggle = (selector, className) => {
|
||
const element = SelectorEngine.findOne(selector, outerElem);
|
||
if (element) {
|
||
element.classList.toggle(className, open);
|
||
}
|
||
};
|
||
toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE);
|
||
toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW$1);
|
||
outerElem.setAttribute('aria-expanded', open);
|
||
}
|
||
_setAttributeIfNotExists(element, attribute, value) {
|
||
if (!element.hasAttribute(attribute)) {
|
||
element.setAttribute(attribute, value);
|
||
}
|
||
}
|
||
_elemIsActive(elem) {
|
||
return elem.classList.contains(CLASS_NAME_ACTIVE);
|
||
}
|
||
|
||
// Try to get the inner element (usually the .nav-link)
|
||
_getInnerElement(elem) {
|
||
return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem);
|
||
}
|
||
|
||
// Try to get the outer element (usually the .nav-item)
|
||
_getOuterElement(elem) {
|
||
return elem.closest(SELECTOR_OUTER) || elem;
|
||
}
|
||
|
||
// Static
|
||
static jQueryInterface(config) {
|
||
return this.each(function () {
|
||
const data = Tab.getOrCreateInstance(this);
|
||
if (typeof config !== 'string') {
|
||
return;
|
||
}
|
||
if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
|
||
throw new TypeError(`No method named "${config}"`);
|
||
}
|
||
data[config]();
|
||
});
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Data API implementation
|
||
*/
|
||
|
||
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
||
if (['A', 'AREA'].includes(this.tagName)) {
|
||
event.preventDefault();
|
||
}
|
||
if (isDisabled(this)) {
|
||
return;
|
||
}
|
||
Tab.getOrCreateInstance(this).show();
|
||
});
|
||
|
||
/**
|
||
* Initialize on focus
|
||
*/
|
||
EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
|
||
for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {
|
||
Tab.getOrCreateInstance(element);
|
||
}
|
||
});
|
||
/**
|
||
* jQuery
|
||
*/
|
||
|
||
defineJQueryPlugin(Tab);
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap toast.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Constants
|
||
*/
|
||
|
||
const NAME = 'toast';
|
||
const DATA_KEY = 'bs.toast';
|
||
const EVENT_KEY = `.${DATA_KEY}`;
|
||
const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;
|
||
const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;
|
||
const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
|
||
const EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;
|
||
const EVENT_HIDE = `hide${EVENT_KEY}`;
|
||
const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
|
||
const EVENT_SHOW = `show${EVENT_KEY}`;
|
||
const EVENT_SHOWN = `shown${EVENT_KEY}`;
|
||
const CLASS_NAME_FADE = 'fade';
|
||
const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility
|
||
const CLASS_NAME_SHOW = 'show';
|
||
const CLASS_NAME_SHOWING = 'showing';
|
||
const DefaultType = {
|
||
animation: 'boolean',
|
||
autohide: 'boolean',
|
||
delay: 'number'
|
||
};
|
||
const Default = {
|
||
animation: true,
|
||
autohide: true,
|
||
delay: 5000
|
||
};
|
||
|
||
/**
|
||
* Class definition
|
||
*/
|
||
|
||
class Toast extends BaseComponent {
|
||
constructor(element, config) {
|
||
super(element, config);
|
||
this._timeout = null;
|
||
this._hasMouseInteraction = false;
|
||
this._hasKeyboardInteraction = false;
|
||
this._setListeners();
|
||
}
|
||
|
||
// Getters
|
||
static get Default() {
|
||
return Default;
|
||
}
|
||
static get DefaultType() {
|
||
return DefaultType;
|
||
}
|
||
static get NAME() {
|
||
return NAME;
|
||
}
|
||
|
||
// Public
|
||
show() {
|
||
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);
|
||
if (showEvent.defaultPrevented) {
|
||
return;
|
||
}
|
||
this._clearTimeout();
|
||
if (this._config.animation) {
|
||
this._element.classList.add(CLASS_NAME_FADE);
|
||
}
|
||
const complete = () => {
|
||
this._element.classList.remove(CLASS_NAME_SHOWING);
|
||
EventHandler.trigger(this._element, EVENT_SHOWN);
|
||
this._maybeScheduleHide();
|
||
};
|
||
this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated
|
||
reflow(this._element);
|
||
this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING);
|
||
this._queueCallback(complete, this._element, this._config.animation);
|
||
}
|
||
hide() {
|
||
if (!this.isShown()) {
|
||
return;
|
||
}
|
||
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
|
||
if (hideEvent.defaultPrevented) {
|
||
return;
|
||
}
|
||
const complete = () => {
|
||
this._element.classList.add(CLASS_NAME_HIDE); // @deprecated
|
||
this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW);
|
||
EventHandler.trigger(this._element, EVENT_HIDDEN);
|
||
};
|
||
this._element.classList.add(CLASS_NAME_SHOWING);
|
||
this._queueCallback(complete, this._element, this._config.animation);
|
||
}
|
||
dispose() {
|
||
this._clearTimeout();
|
||
if (this.isShown()) {
|
||
this._element.classList.remove(CLASS_NAME_SHOW);
|
||
}
|
||
super.dispose();
|
||
}
|
||
isShown() {
|
||
return this._element.classList.contains(CLASS_NAME_SHOW);
|
||
}
|
||
|
||
// Private
|
||
|
||
_maybeScheduleHide() {
|
||
if (!this._config.autohide) {
|
||
return;
|
||
}
|
||
if (this._hasMouseInteraction || this._hasKeyboardInteraction) {
|
||
return;
|
||
}
|
||
this._timeout = setTimeout(() => {
|
||
this.hide();
|
||
}, this._config.delay);
|
||
}
|
||
_onInteraction(event, isInteracting) {
|
||
switch (event.type) {
|
||
case 'mouseover':
|
||
case 'mouseout':
|
||
{
|
||
this._hasMouseInteraction = isInteracting;
|
||
break;
|
||
}
|
||
case 'focusin':
|
||
case 'focusout':
|
||
{
|
||
this._hasKeyboardInteraction = isInteracting;
|
||
break;
|
||
}
|
||
}
|
||
if (isInteracting) {
|
||
this._clearTimeout();
|
||
return;
|
||
}
|
||
const nextElement = event.relatedTarget;
|
||
if (this._element === nextElement || this._element.contains(nextElement)) {
|
||
return;
|
||
}
|
||
this._maybeScheduleHide();
|
||
}
|
||
_setListeners() {
|
||
EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));
|
||
EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));
|
||
EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));
|
||
EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false));
|
||
}
|
||
_clearTimeout() {
|
||
clearTimeout(this._timeout);
|
||
this._timeout = null;
|
||
}
|
||
|
||
// Static
|
||
static jQueryInterface(config) {
|
||
return this.each(function () {
|
||
const data = Toast.getOrCreateInstance(this, config);
|
||
if (typeof config === 'string') {
|
||
if (typeof data[config] === 'undefined') {
|
||
throw new TypeError(`No method named "${config}"`);
|
||
}
|
||
data[config](this);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Data API implementation
|
||
*/
|
||
|
||
enableDismissTrigger(Toast);
|
||
|
||
/**
|
||
* jQuery
|
||
*/
|
||
|
||
defineJQueryPlugin(Toast);
|
||
|
||
/**
|
||
* --------------------------------------------------------------------------
|
||
* Bootstrap index.umd.js
|
||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||
* --------------------------------------------------------------------------
|
||
*/
|
||
|
||
const index_umd = {
|
||
Alert,
|
||
Button,
|
||
Carousel,
|
||
Collapse,
|
||
Dropdown,
|
||
Modal,
|
||
Offcanvas,
|
||
Popover,
|
||
ScrollSpy,
|
||
Tab,
|
||
Toast,
|
||
Tooltip
|
||
};
|
||
return index_umd;
|
||
});
|
||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbGVtZW50TWFwIiwiTWFwIiwiRGF0YSIsInNldCIsImVsZW1lbnQiLCJrZXkiLCJpbnN0YW5jZSIsImhhcyIsImluc3RhbmNlTWFwIiwiZ2V0Iiwic2l6ZSIsImNvbnNvbGUiLCJlcnJvciIsIkFycmF5IiwiZnJvbSIsImtleXMiLCJyZW1vdmUiLCJkZWxldGUiLCJNQVhfVUlEIiwiTUlMTElTRUNPTkRTX01VTFRJUExJRVIiLCJUUkFOU0lUSU9OX0VORCIsInBhcnNlU2VsZWN0b3IiLCJzZWxlY3RvciIsIndpbmRvdyIsIkNTUyIsImVzY2FwZSIsInJlcGxhY2UiLCJtYXRjaCIsImlkIiwidG9UeXBlIiwib2JqZWN0IiwidW5kZWZpbmVkIiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwidG9Mb3dlckNhc2UiLCJnZXRVSUQiLCJwcmVmaXgiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQiLCJ0cmFuc2l0aW9uRHVyYXRpb24iLCJ0cmFuc2l0aW9uRGVsYXkiLCJnZXRDb21wdXRlZFN0eWxlIiwiZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24iLCJOdW1iZXIiLCJwYXJzZUZsb2F0IiwiZmxvYXRUcmFuc2l0aW9uRGVsYXkiLCJzcGxpdCIsInRyaWdnZXJUcmFuc2l0aW9uRW5kIiwiZGlzcGF0Y2hFdmVudCIsIkV2ZW50IiwiaXNFbGVtZW50JDEiLCJqcXVlcnkiLCJub2RlVHlwZSIsImdldEVsZW1lbnQiLCJsZW5ndGgiLCJxdWVyeVNlbGVjdG9yIiwiaXNWaXNpYmxlIiwiZ2V0Q2xpZW50UmVjdHMiLCJlbGVtZW50SXNWaXNpYmxlIiwiZ2V0UHJvcGVydHlWYWx1ZSIsImNsb3NlZERldGFpbHMiLCJjbG9zZXN0Iiwic3VtbWFyeSIsInBhcmVudE5vZGUiLCJpc0Rpc2FibGVkIiwiTm9kZSIsIkVMRU1FTlRfTk9ERSIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwiZGlzYWJsZWQiLCJoYXNBdHRyaWJ1dGUiLCJnZXRBdHRyaWJ1dGUiLCJmaW5kU2hhZG93Um9vdCIsImRvY3VtZW50RWxlbWVudCIsImF0dGFjaFNoYWRvdyIsImdldFJvb3ROb2RlIiwicm9vdCIsIlNoYWRvd1Jvb3QiLCJub29wIiwicmVmbG93Iiwib2Zmc2V0SGVpZ2h0IiwiZ2V0alF1ZXJ5IiwialF1ZXJ5IiwiYm9keSIsIkRPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MiLCJvbkRPTUNvbnRlbnRMb2FkZWQiLCJjYWxsYmFjayIsInJlYWR5U3RhdGUiLCJhZGRFdmVudExpc3RlbmVyIiwicHVzaCIsImlzUlRMIiwiZGlyIiwiZGVmaW5lSlF1ZXJ5UGx1Z2luIiwicGx1Z2luIiwiJCIsIm5hbWUiLCJOQU1FIiwiSlFVRVJZX05PX0NPTkZMSUNUIiwiZm4iLCJqUXVlcnlJbnRlcmZhY2UiLCJDb25zdHJ1Y3RvciIsIm5vQ29uZmxpY3QiLCJleGVjdXRlIiwicG9zc2libGVDYWxsYmFjayIsImFyZ3MiLCJhcmd1bWVudHMiLCJkZWZhdWx0VmFsdWUiLCJleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uIiwidHJhbnNpdGlvbkVsZW1lbnQiLCJ3YWl0Rm9yVHJhbnNpdGlvbiIsImR1cmF0aW9uUGFkZGluZyIsImVtdWxhdGVkRHVyYXRpb24iLCJjYWxsZWQiLCJoYW5kbGVyIiwiX3JlZjYiLCJ0YXJnZXQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwic2V0VGltZW91dCIsImdldE5leHRBY3RpdmVFbGVtZW50IiwibGlzdCIsImFjdGl2ZUVsZW1lbnQiLCJzaG91bGRHZXROZXh0IiwiaXNDeWNsZUFsbG93ZWQiLCJsaXN0TGVuZ3RoIiwiaW5kZXgiLCJpbmRleE9mIiwibWF4IiwibWluIiwibmFtZXNwYWNlUmVnZXgiLCJzdHJpcE5hbWVSZWdleCIsInN0cmlwVWlkUmVnZXgiLCJldmVudFJlZ2lzdHJ5IiwidWlkRXZlbnQiLCJjdXN0b21FdmVudHMiLCJtb3VzZWVudGVyIiwibW91c2VsZWF2ZSIsIm5hdGl2ZUV2ZW50cyIsIlNldCIsIm1ha2VFdmVudFVpZCIsInVpZCIsImdldEVsZW1lbnRFdmVudHMiLCJib290c3RyYXBIYW5kbGVyIiwiZXZlbnQiLCJoeWRyYXRlT2JqIiwiZGVsZWdhdGVUYXJnZXQiLCJvbmVPZmYiLCJFdmVudEhhbmRsZXIiLCJvZmYiLCJ0eXBlIiwiYXBwbHkiLCJib290c3RyYXBEZWxlZ2F0aW9uSGFuZGxlciIsImRvbUVsZW1lbnRzIiwicXVlcnlTZWxlY3RvckFsbCIsImRvbUVsZW1lbnQiLCJmaW5kSGFuZGxlciIsImV2ZW50cyIsImNhbGxhYmxlIiwiZGVsZWdhdGlvblNlbGVjdG9yIiwidmFsdWVzIiwiZmluZCIsIm5vcm1hbGl6ZVBhcmFtZXRlcnMiLCJvcmlnaW5hbFR5cGVFdmVudCIsImRlbGVnYXRpb25GdW5jdGlvbiIsImlzRGVsZWdhdGVkIiwidHlwZUV2ZW50IiwiZ2V0VHlwZUV2ZW50IiwiYWRkSGFuZGxlciIsIndyYXBGdW5jdGlvbiIsInJlbGF0ZWRUYXJnZXQiLCJoYW5kbGVycyIsInByZXZpb3VzRnVuY3Rpb24iLCJyZW1vdmVIYW5kbGVyIiwiQm9vbGVhbiIsInJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyIsIm5hbWVzcGFjZSIsInN0b3JlRWxlbWVudEV2ZW50IiwiaGFuZGxlcktleSIsImVudHJpZXMiLCJpbmNsdWRlcyIsIm9uIiwib25lIiwiaW5OYW1lc3BhY2UiLCJpc05hbWVzcGFjZSIsInN0YXJ0c1dpdGgiLCJlbGVtZW50RXZlbnQiLCJzbGljZSIsImtleUhhbmRsZXJzIiwidHJpZ2dlciIsImpRdWVyeUV2ZW50IiwiYnViYmxlcyIsIm5hdGl2ZURpc3BhdGNoIiwiZGVmYXVsdFByZXZlbnRlZCIsImlzUHJvcGFnYXRpb25TdG9wcGVkIiwiaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQiLCJpc0RlZmF1bHRQcmV2ZW50ZWQiLCJldnQiLCJjYW5jZWxhYmxlIiwicHJldmVudERlZmF1bHQiLCJvYmoiLCJtZXRhIiwidmFsdWUiLCJfdW51c2VkIiwiZGVmaW5lUHJvcGVydHkiLCJjb25maWd1cmFibGUiLCJub3JtYWxpemVEYXRhIiwiSlNPTiIsInBhcnNlIiwiZGVjb2RlVVJJQ29tcG9uZW50Iiwibm9ybWFsaXplRGF0YUtleSIsImNociIsIk1hbmlwdWxhdG9yIiwic2V0RGF0YUF0dHJpYnV0ZSIsInNldEF0dHJpYnV0ZSIsInJlbW92ZURhdGFBdHRyaWJ1dGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJnZXREYXRhQXR0cmlidXRlcyIsImF0dHJpYnV0ZXMiLCJic0tleXMiLCJkYXRhc2V0IiwiZmlsdGVyIiwicHVyZUtleSIsImNoYXJBdCIsImdldERhdGFBdHRyaWJ1dGUiLCJDb25maWciLCJEZWZhdWx0IiwiRGVmYXVsdFR5cGUiLCJFcnJvciIsIl9nZXRDb25maWciLCJjb25maWciLCJfbWVyZ2VDb25maWdPYmoiLCJfY29uZmlnQWZ0ZXJNZXJnZSIsIl90eXBlQ2hlY2tDb25maWciLCJqc29uQ29uZmlnIiwiY29uc3RydWN0b3IiLCJjb25maWdUeXBlcyIsInByb3BlcnR5IiwiZXhwZWN0ZWRUeXBlcyIsInZhbHVlVHlwZSIsIlJlZ0V4cCIsInRlc3QiLCJUeXBlRXJyb3IiLCJ0b1VwcGVyQ2FzZSIsIlZFUlNJT04iLCJCYXNlQ29tcG9uZW50IiwiX2VsZW1lbnQiLCJfY29uZmlnIiwiREFUQV9LRVkiLCJkaXNwb3NlIiwiRVZFTlRfS0VZIiwicHJvcGVydHlOYW1lIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsIl9xdWV1ZUNhbGxiYWNrIiwiaXNBbmltYXRlZCIsImdldEluc3RhbmNlIiwiZ2V0T3JDcmVhdGVJbnN0YW5jZSIsImV2ZW50TmFtZSIsImdldFNlbGVjdG9yIiwiaHJlZkF0dHJpYnV0ZSIsInRyaW0iLCJtYXAiLCJzZWwiLCJqb2luIiwiU2VsZWN0b3JFbmdpbmUiLCJjb25jYXQiLCJFbGVtZW50IiwiZmluZE9uZSIsImNoaWxkcmVuIiwiY2hpbGQiLCJtYXRjaGVzIiwicGFyZW50cyIsImFuY2VzdG9yIiwicHJldiIsInByZXZpb3VzIiwicHJldmlvdXNFbGVtZW50U2libGluZyIsIm5leHQiLCJuZXh0RWxlbWVudFNpYmxpbmciLCJmb2N1c2FibGVDaGlsZHJlbiIsImZvY3VzYWJsZXMiLCJlbCIsImdldFNlbGVjdG9yRnJvbUVsZW1lbnQiLCJnZXRFbGVtZW50RnJvbVNlbGVjdG9yIiwiZ2V0TXVsdGlwbGVFbGVtZW50c0Zyb21TZWxlY3RvciIsImVuYWJsZURpc21pc3NUcmlnZ2VyIiwiY29tcG9uZW50IiwibWV0aG9kIiwiY2xpY2tFdmVudCIsInRhZ05hbWUiLCJOQU1FJGYiLCJEQVRBX0tFWSRhIiwiRVZFTlRfS0VZJGIiLCJFVkVOVF9DTE9TRSIsIkVWRU5UX0NMT1NFRCIsIkNMQVNTX05BTUVfRkFERSQ1IiwiQ0xBU1NfTkFNRV9TSE9XJDgiLCJBbGVydCIsImNsb3NlIiwiY2xvc2VFdmVudCIsIl9kZXN0cm95RWxlbWVudCIsImVhY2giLCJkYXRhIiwiTkFNRSRlIiwiREFUQV9LRVkkOSIsIkVWRU5UX0tFWSRhIiwiREFUQV9BUElfS0VZJDYiLCJDTEFTU19OQU1FX0FDVElWRSQzIiwiU0VMRUNUT1JfREFUQV9UT0dHTEUkNSIsIkVWRU5UX0NMSUNLX0RBVEFfQVBJJDYiLCJCdXR0b24iLCJ0b2dnbGUiLCJidXR0b24iLCJOQU1FJGQiLCJFVkVOVF9LRVkkOSIsIkVWRU5UX1RPVUNIU1RBUlQiLCJFVkVOVF9UT1VDSE1PVkUiLCJFVkVOVF9UT1VDSEVORCIsIkVWRU5UX1BPSU5URVJET1dOIiwiRVZFTlRfUE9JTlRFUlVQIiwiUE9JTlRFUl9UWVBFX1RPVUNIIiwiUE9JTlRFUl9UWVBFX1BFTiIsIkNMQVNTX05BTUVfUE9JTlRFUl9FVkVOVCIsIlNXSVBFX1RIUkVTSE9MRCIsIkRlZmF1bHQkYyIsImVuZENhbGxiYWNrIiwibGVmdENhbGxiYWNrIiwicmlnaHRDYWxsYmFjayIsIkRlZmF1bHRUeXBlJGMiLCJTd2lwZSIsImlzU3VwcG9ydGVkIiwiX2RlbHRhWCIsIl9zdXBwb3J0UG9pbnRlckV2ZW50cyIsIlBvaW50ZXJFdmVudCIsIl9pbml0RXZlbnRzIiwiX3N0YXJ0IiwidG91Y2hlcyIsImNsaWVudFgiLCJfZXZlbnRJc1BvaW50ZXJQZW5Ub3VjaCIsIl9lbmQiLCJfaGFuZGxlU3dpcGUiLCJfbW92ZSIsImFic0RlbHRhWCIsImFicyIsImRpcmVjdGlvbiIsImFkZCIsInBvaW50ZXJUeXBlIiwibmF2aWdhdG9yIiwibWF4VG91Y2hQb2ludHMiLCJOQU1FJGMiLCJEQVRBX0tFWSQ4IiwiRVZFTlRfS0VZJDgiLCJEQVRBX0FQSV9LRVkkNSIsIkFSUk9XX0xFRlRfS0VZJDEiLCJBUlJPV19SSUdIVF9LRVkkMSIsIlRPVUNIRVZFTlRfQ09NUEFUX1dBSVQiLCJPUkRFUl9ORVhUIiwiT1JERVJfUFJFViIsIkRJUkVDVElPTl9MRUZUIiwiRElSRUNUSU9OX1JJR0hUIiwiRVZFTlRfU0xJREUiLCJFVkVOVF9TTElEIiwiRVZFTlRfS0VZRE9XTiQxIiwiRVZFTlRfTU9VU0VFTlRFUiQxIiwiRVZFTlRfTU9VU0VMRUFWRSQxIiwiRVZFTlRfRFJBR19TVEFSVCIsIkVWRU5UX0xPQURfREFUQV9BUEkkMyIsIkVWRU5UX0NMSUNLX0RBVEFfQVBJJDUiLCJDTEFTU19OQU1FX0NBUk9VU0VMIiwiQ0xBU1NfTkFNRV9BQ1RJVkUkMiIsIkNMQVNTX05BTUVfU0xJREUiLCJDTEFTU19OQU1FX0VORCIsIkNMQVNTX05BTUVfU1RBUlQiLCJDTEFTU19OQU1FX05FWFQiLCJDTEFTU19OQU1FX1BSRVYiLCJTRUxFQ1RPUl9BQ1RJVkUiLCJTRUxFQ1RPUl9JVEVNIiwiU0VMRUNUT1JfQUNUSVZFX0lURU0iLCJTRUxFQ1RPUl9JVEVNX0lNRyIsIlNFTEVDVE9SX0lORElDQVRPUlMiLCJTRUxFQ1RPUl9EQVRBX1NMSURFIiwiU0VMRUNUT1JfREFUQV9SSURFIiwiS0VZX1RPX0RJUkVDVElPTiIsIkRlZmF1bHQkYiIsImludGVydmFsIiwia2V5Ym9hcmQiLCJwYXVzZSIsInJpZGUiLCJ0b3VjaCIsIndyYXAiLCJEZWZhdWx0VHlwZSRiIiwiQ2Fyb3VzZWwiLCJfaW50ZXJ2YWwiLCJfYWN0aXZlRWxlbWVudCIsIl9pc1NsaWRpbmciLCJ0b3VjaFRpbWVvdXQiLCJfc3dpcGVIZWxwZXIiLCJfaW5kaWNhdG9yc0VsZW1lbnQiLCJfYWRkRXZlbnRMaXN0ZW5lcnMiLCJjeWNsZSIsIl9zbGlkZSIsIm5leHRXaGVuVmlzaWJsZSIsImhpZGRlbiIsIl9jbGVhckludGVydmFsIiwiX3VwZGF0ZUludGVydmFsIiwic2V0SW50ZXJ2YWwiLCJfbWF5YmVFbmFibGVDeWNsZSIsInRvIiwiaXRlbXMiLCJfZ2V0SXRlbXMiLCJhY3RpdmVJbmRleCIsIl9nZXRJdGVtSW5kZXgiLCJfZ2V0QWN0aXZlIiwib3JkZXIiLCJkZWZhdWx0SW50ZXJ2YWwiLCJfa2V5ZG93biIsIl9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzIiwiaW1nIiwiZW5kQ2FsbEJhY2siLCJjbGVhclRpbWVvdXQiLCJzd2lwZUNvbmZpZyIsIl9kaXJlY3Rpb25Ub09yZGVyIiwiX3NldEFjdGl2ZUluZGljYXRvckVsZW1lbnQiLCJhY3RpdmVJbmRpY2F0b3IiLCJuZXdBY3RpdmVJbmRpY2F0b3IiLCJlbGVtZW50SW50ZXJ2YWwiLCJwYXJzZUludCIsImlzTmV4dCIsIm5leHRFbGVtZW50IiwibmV4dEVsZW1lbnRJbmRleCIsInRyaWdnZXJFdmVudCIsIl9vcmRlclRvRGlyZWN0aW9uIiwic2xpZGVFdmVudCIsImlzQ3ljbGluZyIsImRpcmVjdGlvbmFsQ2xhc3NOYW1lIiwib3JkZXJDbGFzc05hbWUiLCJjb21wbGV0ZUNhbGxCYWNrIiwiX2lzQW5pbWF0ZWQiLCJjbGVhckludGVydmFsIiwiY2Fyb3VzZWwiLCJzbGlkZUluZGV4IiwiY2Fyb3VzZWxzIiwiTkFNRSRiIiwiREFUQV9LRVkkNyIsIkVWRU5UX0tFWSQ3IiwiREFUQV9BUElfS0VZJDQiLCJFVkVOVF9TSE9XJDYiLCJFVkVOVF9TSE9XTiQ2IiwiRVZFTlRfSElERSQ2IiwiRVZFTlRfSElEREVOJDYiLCJFVkVOVF9DTElDS19EQVRBX0FQSSQ0IiwiQ0xBU1NfTkFNRV9TSE9XJDciLCJDTEFTU19OQU1FX0NPTExBUFNFIiwiQ0xBU1NfTkFNRV9DT0xMQVBTSU5HIiwiQ0xBU1NfTkFNRV9DT0xMQVBTRUQiLCJDTEFTU19OQU1FX0RFRVBFUl9DSElMRFJFTiIsIkNMQVNTX05BTUVfSE9SSVpPTlRBTCIsIldJRFRIIiwiSEVJR0hUIiwiU0VMRUNUT1JfQUNUSVZFUyIsIlNFTEVDVE9SX0RBVEFfVE9HR0xFJDQiLCJEZWZhdWx0JGEiLCJwYXJlbnQiLCJEZWZhdWx0VHlwZSRhIiwiQ29sbGFwc2UiLCJfaXNUcmFuc2l0aW9uaW5nIiwiX3RyaWdnZXJBcnJheSIsInRvZ2dsZUxpc3QiLCJlbGVtIiwiZmlsdGVyRWxlbWVudCIsImZvdW5kRWxlbWVudCIsIl9pbml0aWFsaXplQ2hpbGRyZW4iLCJfYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzIiwiX2lzU2hvd24iLCJoaWRlIiwic2hvdyIsImFjdGl2ZUNoaWxkcmVuIiwiX2dldEZpcnN0TGV2ZWxDaGlsZHJlbiIsInN0YXJ0RXZlbnQiLCJhY3RpdmVJbnN0YW5jZSIsImRpbWVuc2lvbiIsIl9nZXREaW1lbnNpb24iLCJzdHlsZSIsImNvbXBsZXRlIiwiY2FwaXRhbGl6ZWREaW1lbnNpb24iLCJzY3JvbGxTaXplIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwic2VsZWN0ZWQiLCJ0cmlnZ2VyQXJyYXkiLCJpc09wZW4iLCJ0b3AiLCJib3R0b20iLCJyaWdodCIsImxlZnQiLCJhdXRvIiwiYmFzZVBsYWNlbWVudHMiLCJzdGFydCIsImVuZCIsImNsaXBwaW5nUGFyZW50cyIsInZpZXdwb3J0IiwicG9wcGVyIiwicmVmZXJlbmNlIiwidmFyaWF0aW9uUGxhY2VtZW50cyIsInJlZHVjZSIsImFjYyIsInBsYWNlbWVudCIsInBsYWNlbWVudHMiLCJiZWZvcmVSZWFkIiwicmVhZCIsImFmdGVyUmVhZCIsImJlZm9yZU1haW4iLCJtYWluIiwiYWZ0ZXJNYWluIiwiYmVmb3JlV3JpdGUiLCJ3cml0ZSIsImFmdGVyV3JpdGUiLCJtb2RpZmllclBoYXNlcyIsImdldE5vZGVOYW1lIiwibm9kZU5hbWUiLCJnZXRXaW5kb3ciLCJub2RlIiwib3duZXJEb2N1bWVudCIsImRlZmF1bHRWaWV3IiwiaXNFbGVtZW50IiwiT3duRWxlbWVudCIsImlzSFRNTEVsZW1lbnQiLCJIVE1MRWxlbWVudCIsImlzU2hhZG93Um9vdCIsImFwcGx5U3R5bGVzIiwiX3JlZiIsInN0YXRlIiwiZWxlbWVudHMiLCJmb3JFYWNoIiwic3R5bGVzIiwiYXNzaWduIiwiZWZmZWN0JDIiLCJlZmZlY3QiLCJfcmVmMiIsImluaXRpYWxTdHlsZXMiLCJwb3NpdGlvbiIsIm9wdGlvbnMiLCJzdHJhdGVneSIsIm1hcmdpbiIsImFycm93Iiwic3R5bGVQcm9wZXJ0aWVzIiwiaGFzT3duUHJvcGVydHkiLCJhdHRyaWJ1dGUiLCJhcHBseVN0eWxlcyQxIiwiZW5hYmxlZCIsInBoYXNlIiwicmVxdWlyZXMiLCJnZXRCYXNlUGxhY2VtZW50Iiwicm91bmQiLCJnZXRVQVN0cmluZyIsInVhRGF0YSIsInVzZXJBZ2VudERhdGEiLCJicmFuZHMiLCJpc0FycmF5IiwiaXRlbSIsImJyYW5kIiwidmVyc2lvbiIsInVzZXJBZ2VudCIsImlzTGF5b3V0Vmlld3BvcnQiLCJpbmNsdWRlU2NhbGUiLCJpc0ZpeGVkU3RyYXRlZ3kiLCJjbGllbnRSZWN0Iiwic2NhbGVYIiwic2NhbGVZIiwib2Zmc2V0V2lkdGgiLCJ3aWR0aCIsImhlaWdodCIsInZpc3VhbFZpZXdwb3J0IiwiYWRkVmlzdWFsT2Zmc2V0cyIsIngiLCJvZmZzZXRMZWZ0IiwieSIsIm9mZnNldFRvcCIsImdldExheW91dFJlY3QiLCJyb290Tm9kZSIsImlzU2FtZU5vZGUiLCJob3N0IiwiZ2V0Q29tcHV0ZWRTdHlsZSQxIiwiaXNUYWJsZUVsZW1lbnQiLCJnZXREb2N1bWVudEVsZW1lbnQiLCJnZXRQYXJlbnROb2RlIiwiYXNzaWduZWRTbG90IiwiZ2V0VHJ1ZU9mZnNldFBhcmVudCIsIm9mZnNldFBhcmVudCIsImdldENvbnRhaW5pbmdCbG9jayIsImlzRmlyZWZveCIsImlzSUUiLCJlbGVtZW50Q3NzIiwiY3VycmVudE5vZGUiLCJjc3MiLCJ0cmFuc2Zvcm0iLCJwZXJzcGVjdGl2ZSIsImNvbnRhaW4iLCJ3aWxsQ2hhbmdlIiwiZ2V0T2Zmc2V0UGFyZW50IiwiZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50Iiwid2l0aGluIiwibWluJDEiLCJtYXgkMSIsIndpdGhpbk1heENsYW1wIiwidiIsImdldEZyZXNoU2lkZU9iamVjdCIsIm1lcmdlUGFkZGluZ09iamVjdCIsInBhZGRpbmdPYmplY3QiLCJleHBhbmRUb0hhc2hNYXAiLCJoYXNoTWFwIiwidG9QYWRkaW5nT2JqZWN0IiwicGFkZGluZyIsInJlY3RzIiwiX3N0YXRlJG1vZGlmaWVyc0RhdGEkIiwiYXJyb3dFbGVtZW50IiwicG9wcGVyT2Zmc2V0cyIsIm1vZGlmaWVyc0RhdGEiLCJiYXNlUGxhY2VtZW50IiwiYXhpcyIsImlzVmVydGljYWwiLCJsZW4iLCJhcnJvd1JlY3QiLCJtaW5Qcm9wIiwibWF4UHJvcCIsImVuZERpZmYiLCJzdGFydERpZmYiLCJhcnJvd09mZnNldFBhcmVudCIsImNsaWVudFNpemUiLCJjbGllbnRIZWlnaHQiLCJjbGllbnRXaWR0aCIsImNlbnRlclRvUmVmZXJlbmNlIiwiY2VudGVyIiwib2Zmc2V0IiwiYXhpc1Byb3AiLCJjZW50ZXJPZmZzZXQiLCJlZmZlY3QkMSIsIl9vcHRpb25zJGVsZW1lbnQiLCJhcnJvdyQxIiwicmVxdWlyZXNJZkV4aXN0cyIsImdldFZhcmlhdGlvbiIsInVuc2V0U2lkZXMiLCJyb3VuZE9mZnNldHNCeURQUiIsIndpbiIsImRwciIsImRldmljZVBpeGVsUmF0aW8iLCJtYXBUb1N0eWxlcyIsIl9PYmplY3QkYXNzaWduMiIsInBvcHBlclJlY3QiLCJ2YXJpYXRpb24iLCJvZmZzZXRzIiwiZ3B1QWNjZWxlcmF0aW9uIiwiYWRhcHRpdmUiLCJyb3VuZE9mZnNldHMiLCJpc0ZpeGVkIiwiX29mZnNldHMkeCIsIl9vZmZzZXRzJHkiLCJfcmVmMyIsImhhc1giLCJoYXNZIiwic2lkZVgiLCJzaWRlWSIsImhlaWdodFByb3AiLCJ3aWR0aFByb3AiLCJvZmZzZXRZIiwib2Zmc2V0WCIsImNvbW1vblN0eWxlcyIsIl9yZWY0IiwiX09iamVjdCRhc3NpZ24iLCJjb21wdXRlU3R5bGVzIiwiX3JlZjUiLCJfb3B0aW9ucyRncHVBY2NlbGVyYXQiLCJfb3B0aW9ucyRhZGFwdGl2ZSIsIl9vcHRpb25zJHJvdW5kT2Zmc2V0cyIsImNvbXB1dGVTdHlsZXMkMSIsInBhc3NpdmUiLCJfb3B0aW9ucyRzY3JvbGwiLCJzY3JvbGwiLCJfb3B0aW9ucyRyZXNpemUiLCJyZXNpemUiLCJzY3JvbGxQYXJlbnRzIiwic2Nyb2xsUGFyZW50IiwidXBkYXRlIiwiZXZlbnRMaXN0ZW5lcnMiLCJoYXNoJDEiLCJnZXRPcHBvc2l0ZVBsYWNlbWVudCIsIm1hdGNoZWQiLCJoYXNoIiwiZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQiLCJnZXRXaW5kb3dTY3JvbGwiLCJzY3JvbGxMZWZ0IiwicGFnZVhPZmZzZXQiLCJzY3JvbGxUb3AiLCJwYWdlWU9mZnNldCIsImdldFdpbmRvd1Njcm9sbEJhclgiLCJnZXRWaWV3cG9ydFJlY3QiLCJodG1sIiwibGF5b3V0Vmlld3BvcnQiLCJnZXREb2N1bWVudFJlY3QiLCJfZWxlbWVudCRvd25lckRvY3VtZW4iLCJ3aW5TY3JvbGwiLCJzY3JvbGxXaWR0aCIsInNjcm9sbEhlaWdodCIsImlzU2Nyb2xsUGFyZW50IiwiX2dldENvbXB1dGVkU3R5bGUiLCJvdmVyZmxvdyIsIm92ZXJmbG93WCIsIm92ZXJmbG93WSIsImdldFNjcm9sbFBhcmVudCIsImxpc3RTY3JvbGxQYXJlbnRzIiwiaXNCb2R5IiwidXBkYXRlZExpc3QiLCJyZWN0VG9DbGllbnRSZWN0IiwicmVjdCIsImdldElubmVyQm91bmRpbmdDbGllbnRSZWN0IiwiY2xpZW50VG9wIiwiY2xpZW50TGVmdCIsImdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlIiwiY2xpcHBpbmdQYXJlbnQiLCJnZXRDbGlwcGluZ1BhcmVudHMiLCJjYW5Fc2NhcGVDbGlwcGluZyIsImNsaXBwZXJFbGVtZW50IiwiZ2V0Q2xpcHBpbmdSZWN0IiwiYm91bmRhcnkiLCJyb290Qm91bmRhcnkiLCJtYWluQ2xpcHBpbmdQYXJlbnRzIiwiZmlyc3RDbGlwcGluZ1BhcmVudCIsImNsaXBwaW5nUmVjdCIsImFjY1JlY3QiLCJjb21wdXRlT2Zmc2V0cyIsImNvbW1vblgiLCJjb21tb25ZIiwibWFpbkF4aXMiLCJkZXRlY3RPdmVyZmxvdyIsIl9vcHRpb25zIiwiX29wdGlvbnMkcGxhY2VtZW50IiwiX29wdGlvbnMkc3RyYXRlZ3kiLCJfb3B0aW9ucyRib3VuZGFyeSIsIl9vcHRpb25zJHJvb3RCb3VuZGFyeSIsIl9vcHRpb25zJGVsZW1lbnRDb250ZSIsImVsZW1lbnRDb250ZXh0IiwiX29wdGlvbnMkYWx0Qm91bmRhcnkiLCJhbHRCb3VuZGFyeSIsIl9vcHRpb25zJHBhZGRpbmciLCJhbHRDb250ZXh0IiwiY2xpcHBpbmdDbGllbnRSZWN0IiwiY29udGV4dEVsZW1lbnQiLCJyZWZlcmVuY2VDbGllbnRSZWN0IiwicG9wcGVyQ2xpZW50UmVjdCIsImVsZW1lbnRDbGllbnRSZWN0Iiwib3ZlcmZsb3dPZmZzZXRzIiwib2Zmc2V0RGF0YSIsIm11bHRpcGx5IiwiY29tcHV0ZUF1dG9QbGFjZW1lbnQiLCJmbGlwVmFyaWF0aW9ucyIsIl9vcHRpb25zJGFsbG93ZWRBdXRvUCIsImFsbG93ZWRBdXRvUGxhY2VtZW50cyIsInBsYWNlbWVudHMkMSIsImFsbG93ZWRQbGFjZW1lbnRzIiwib3ZlcmZsb3dzIiwic29ydCIsImEiLCJiIiwiZ2V0RXhwYW5kZWRGYWxsYmFja1BsYWNlbWVudHMiLCJvcHBvc2l0ZVBsYWNlbWVudCIsImZsaXAiLCJfc2tpcCIsIl9vcHRpb25zJG1haW5BeGlzIiwiY2hlY2tNYWluQXhpcyIsIl9vcHRpb25zJGFsdEF4aXMiLCJhbHRBeGlzIiwiY2hlY2tBbHRBeGlzIiwic3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzIiwiZmFsbGJhY2tQbGFjZW1lbnRzIiwiX29wdGlvbnMkZmxpcFZhcmlhdGlvIiwicHJlZmVycmVkUGxhY2VtZW50IiwiaXNCYXNlUGxhY2VtZW50IiwicmVmZXJlbmNlUmVjdCIsImNoZWNrc01hcCIsIm1ha2VGYWxsYmFja0NoZWNrcyIsImZpcnN0Rml0dGluZ1BsYWNlbWVudCIsImkiLCJfYmFzZVBsYWNlbWVudCIsImlzU3RhcnRWYXJpYXRpb24iLCJtYWluVmFyaWF0aW9uU2lkZSIsImFsdFZhcmlhdGlvblNpZGUiLCJjaGVja3MiLCJldmVyeSIsImNoZWNrIiwibnVtYmVyT2ZDaGVja3MiLCJfbG9vcCIsIl9pIiwiZml0dGluZ1BsYWNlbWVudCIsIl9yZXQiLCJyZXNldCIsImZsaXAkMSIsImdldFNpZGVPZmZzZXRzIiwicHJldmVudGVkT2Zmc2V0cyIsImlzQW55U2lkZUZ1bGx5Q2xpcHBlZCIsInNvbWUiLCJzaWRlIiwicHJldmVudE92ZXJmbG93IiwicmVmZXJlbmNlT3ZlcmZsb3ciLCJwb3BwZXJBbHRPdmVyZmxvdyIsInJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyIsInBvcHBlckVzY2FwZU9mZnNldHMiLCJpc1JlZmVyZW5jZUhpZGRlbiIsImhhc1BvcHBlckVzY2FwZWQiLCJoaWRlJDEiLCJkaXN0YW5jZUFuZFNraWRkaW5nVG9YWSIsImludmVydERpc3RhbmNlIiwic2tpZGRpbmciLCJkaXN0YW5jZSIsIl9vcHRpb25zJG9mZnNldCIsIl9kYXRhJHN0YXRlJHBsYWNlbWVudCIsIm9mZnNldCQxIiwicG9wcGVyT2Zmc2V0cyQxIiwiZ2V0QWx0QXhpcyIsIl9vcHRpb25zJHRldGhlciIsInRldGhlciIsIl9vcHRpb25zJHRldGhlck9mZnNldCIsInRldGhlck9mZnNldCIsInRldGhlck9mZnNldFZhbHVlIiwibm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlIiwib2Zmc2V0TW9kaWZpZXJTdGF0ZSIsIl9vZmZzZXRNb2RpZmllclN0YXRlJCIsIm1haW5TaWRlIiwiYWx0U2lkZSIsImFkZGl0aXZlIiwibWluTGVuIiwibWF4TGVuIiwiYXJyb3dQYWRkaW5nT2JqZWN0IiwiYXJyb3dQYWRkaW5nTWluIiwiYXJyb3dQYWRkaW5nTWF4IiwiYXJyb3dMZW4iLCJtaW5PZmZzZXQiLCJtYXhPZmZzZXQiLCJjbGllbnRPZmZzZXQiLCJvZmZzZXRNb2RpZmllclZhbHVlIiwidGV0aGVyTWluIiwidGV0aGVyTWF4IiwicHJldmVudGVkT2Zmc2V0IiwiX29mZnNldE1vZGlmaWVyU3RhdGUkMiIsIl9tYWluU2lkZSIsIl9hbHRTaWRlIiwiX29mZnNldCIsIl9sZW4iLCJfbWluIiwiX21heCIsImlzT3JpZ2luU2lkZSIsIl9vZmZzZXRNb2RpZmllclZhbHVlIiwiX3RldGhlck1pbiIsIl90ZXRoZXJNYXgiLCJfcHJldmVudGVkT2Zmc2V0IiwicHJldmVudE92ZXJmbG93JDEiLCJnZXRIVE1MRWxlbWVudFNjcm9sbCIsImdldE5vZGVTY3JvbGwiLCJpc0VsZW1lbnRTY2FsZWQiLCJnZXRDb21wb3NpdGVSZWN0IiwiZWxlbWVudE9yVmlydHVhbEVsZW1lbnQiLCJpc09mZnNldFBhcmVudEFuRWxlbWVudCIsIm9mZnNldFBhcmVudElzU2NhbGVkIiwibW9kaWZpZXJzIiwidmlzaXRlZCIsInJlc3VsdCIsIm1vZGlmaWVyIiwiZGVwIiwiZGVwTW9kaWZpZXIiLCJvcmRlck1vZGlmaWVycyIsIm9yZGVyZWRNb2RpZmllcnMiLCJkZWJvdW5jZSIsInBlbmRpbmciLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJtZXJnZUJ5TmFtZSIsIm1lcmdlZCIsImN1cnJlbnQiLCJleGlzdGluZyIsIkRFRkFVTFRfT1BUSU9OUyIsImFyZVZhbGlkRWxlbWVudHMiLCJfa2V5IiwicG9wcGVyR2VuZXJhdG9yIiwiZ2VuZXJhdG9yT3B0aW9ucyIsIl9nZW5lcmF0b3JPcHRpb25zIiwiX2dlbmVyYXRvck9wdGlvbnMkZGVmIiwiZGVmYXVsdE1vZGlmaWVycyIsIl9nZW5lcmF0b3JPcHRpb25zJGRlZjIiLCJkZWZhdWx0T3B0aW9ucyIsImNyZWF0ZVBvcHBlciIsImVmZmVjdENsZWFudXBGbnMiLCJpc0Rlc3Ryb3llZCIsInNldE9wdGlvbnMiLCJzZXRPcHRpb25zQWN0aW9uIiwiY2xlYW51cE1vZGlmaWVyRWZmZWN0cyIsIm0iLCJydW5Nb2RpZmllckVmZmVjdHMiLCJmb3JjZVVwZGF0ZSIsIl9zdGF0ZSRlbGVtZW50cyIsIl9zdGF0ZSRvcmRlcmVkTW9kaWZpZSIsIl9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIiLCJkZXN0cm95Iiwib25GaXJzdFVwZGF0ZSIsIl9yZWYkb3B0aW9ucyIsImNsZWFudXBGbiIsIm5vb3BGbiIsImNyZWF0ZVBvcHBlciQyIiwiZGVmYXVsdE1vZGlmaWVycyQxIiwiY3JlYXRlUG9wcGVyJDEiLCJOQU1FJGEiLCJEQVRBX0tFWSQ2IiwiRVZFTlRfS0VZJDYiLCJEQVRBX0FQSV9LRVkkMyIsIkVTQ0FQRV9LRVkkMiIsIlRBQl9LRVkkMSIsIkFSUk9XX1VQX0tFWSQxIiwiQVJST1dfRE9XTl9LRVkkMSIsIlJJR0hUX01PVVNFX0JVVFRPTiIsIkVWRU5UX0hJREUkNSIsIkVWRU5UX0hJRERFTiQ1IiwiRVZFTlRfU0hPVyQ1IiwiRVZFTlRfU0hPV04kNSIsIkVWRU5UX0NMSUNLX0RBVEFfQVBJJDMiLCJFVkVOVF9LRVlET1dOX0RBVEFfQVBJIiwiRVZFTlRfS0VZVVBfREFUQV9BUEkiLCJDTEFTU19OQU1FX1NIT1ckNiIsIkNMQVNTX05BTUVfRFJPUFVQIiwiQ0xBU1NfTkFNRV9EUk9QRU5EIiwiQ0xBU1NfTkFNRV9EUk9QU1RBUlQiLCJDTEFTU19OQU1FX0RST1BVUF9DRU5URVIiLCJDTEFTU19OQU1FX0RST1BET1dOX0NFTlRFUiIsIlNFTEVDVE9SX0RBVEFfVE9HR0xFJDMiLCJTRUxFQ1RPUl9EQVRBX1RPR0dMRV9TSE9XTiIsIlNFTEVDVE9SX01FTlUiLCJTRUxFQ1RPUl9OQVZCQVIiLCJTRUxFQ1RPUl9OQVZCQVJfTkFWIiwiU0VMRUNUT1JfVklTSUJMRV9JVEVNUyIsIlBMQUNFTUVOVF9UT1AiLCJQTEFDRU1FTlRfVE9QRU5EIiwiUExBQ0VNRU5UX0JPVFRPTSIsIlBMQUNFTUVOVF9CT1RUT01FTkQiLCJQTEFDRU1FTlRfUklHSFQiLCJQTEFDRU1FTlRfTEVGVCIsIlBMQUNFTUVOVF9UT1BDRU5URVIiLCJQTEFDRU1FTlRfQk9UVE9NQ0VOVEVSIiwiRGVmYXVsdCQ5IiwiYXV0b0Nsb3NlIiwiZGlzcGxheSIsInBvcHBlckNvbmZpZyIsIkRlZmF1bHRUeXBlJDkiLCJEcm9wZG93biIsIl9wb3BwZXIiLCJfcGFyZW50IiwiX21lbnUiLCJfaW5OYXZiYXIiLCJfZGV0ZWN0TmF2YmFyIiwic2hvd0V2ZW50IiwiX2NyZWF0ZVBvcHBlciIsImZvY3VzIiwiX2NvbXBsZXRlSGlkZSIsImhpZGVFdmVudCIsIlBvcHBlciIsInJlZmVyZW5jZUVsZW1lbnQiLCJfZ2V0UG9wcGVyQ29uZmlnIiwiX2dldFBsYWNlbWVudCIsInBhcmVudERyb3Bkb3duIiwiaXNFbmQiLCJfZ2V0T2Zmc2V0IiwicG9wcGVyRGF0YSIsImRlZmF1bHRCc1BvcHBlckNvbmZpZyIsIl9zZWxlY3RNZW51SXRlbSIsIl9yZWY3IiwiY2xlYXJNZW51cyIsIm9wZW5Ub2dnbGVzIiwiY29udGV4dCIsImNvbXBvc2VkUGF0aCIsImlzTWVudVRhcmdldCIsImRhdGFBcGlLZXlkb3duSGFuZGxlciIsImlzSW5wdXQiLCJpc0VzY2FwZUV2ZW50IiwiaXNVcE9yRG93bkV2ZW50IiwiZ2V0VG9nZ2xlQnV0dG9uIiwic3RvcFByb3BhZ2F0aW9uIiwiTkFNRSQ5IiwiQ0xBU1NfTkFNRV9GQURFJDQiLCJDTEFTU19OQU1FX1NIT1ckNSIsIkVWRU5UX01PVVNFRE9XTiIsIkRlZmF1bHQkOCIsImNsYXNzTmFtZSIsImNsaWNrQ2FsbGJhY2siLCJyb290RWxlbWVudCIsIkRlZmF1bHRUeXBlJDgiLCJCYWNrZHJvcCIsIl9pc0FwcGVuZGVkIiwiX2FwcGVuZCIsIl9nZXRFbGVtZW50IiwiX2VtdWxhdGVBbmltYXRpb24iLCJiYWNrZHJvcCIsImNyZWF0ZUVsZW1lbnQiLCJhcHBlbmQiLCJOQU1FJDgiLCJEQVRBX0tFWSQ1IiwiRVZFTlRfS0VZJDUiLCJFVkVOVF9GT0NVU0lOJDIiLCJFVkVOVF9LRVlET1dOX1RBQiIsIlRBQl9LRVkiLCJUQUJfTkFWX0ZPUldBUkQiLCJUQUJfTkFWX0JBQ0tXQVJEIiwiRGVmYXVsdCQ3IiwiYXV0b2ZvY3VzIiwidHJhcEVsZW1lbnQiLCJEZWZhdWx0VHlwZSQ3IiwiRm9jdXNUcmFwIiwiX2lzQWN0aXZlIiwiX2xhc3RUYWJOYXZEaXJlY3Rpb24iLCJhY3RpdmF0ZSIsIl9oYW5kbGVGb2N1c2luIiwiX2hhbmRsZUtleWRvd24iLCJkZWFjdGl2YXRlIiwic2hpZnRLZXkiLCJTRUxFQ1RPUl9GSVhFRF9DT05URU5UIiwiU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQiLCJQUk9QRVJUWV9QQURESU5HIiwiUFJPUEVSVFlfTUFSR0lOIiwiU2Nyb2xsQmFySGVscGVyIiwiZ2V0V2lkdGgiLCJkb2N1bWVudFdpZHRoIiwiaW5uZXJXaWR0aCIsIl9kaXNhYmxlT3ZlckZsb3ciLCJfc2V0RWxlbWVudEF0dHJpYnV0ZXMiLCJjYWxjdWxhdGVkVmFsdWUiLCJfcmVzZXRFbGVtZW50QXR0cmlidXRlcyIsImlzT3ZlcmZsb3dpbmciLCJfc2F2ZUluaXRpYWxBdHRyaWJ1dGUiLCJzdHlsZVByb3BlcnR5Iiwic2Nyb2xsYmFyV2lkdGgiLCJtYW5pcHVsYXRpb25DYWxsQmFjayIsInNldFByb3BlcnR5IiwiX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2siLCJhY3R1YWxWYWx1ZSIsInJlbW92ZVByb3BlcnR5IiwiY2FsbEJhY2siLCJOQU1FJDciLCJEQVRBX0tFWSQ0IiwiRVZFTlRfS0VZJDQiLCJEQVRBX0FQSV9LRVkkMiIsIkVTQ0FQRV9LRVkkMSIsIkVWRU5UX0hJREUkNCIsIkVWRU5UX0hJREVfUFJFVkVOVEVEJDEiLCJFVkVOVF9ISURERU4kNCIsIkVWRU5UX1NIT1ckNCIsIkVWRU5UX1NIT1dOJDQiLCJFVkVOVF9SRVNJWkUkMSIsIkVWRU5UX0NMSUNLX0RJU01JU1MiLCJFVkVOVF9NT1VTRURPV05fRElTTUlTUyIsIkVWRU5UX0tFWURPV05fRElTTUlTUyQxIiwiRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMiIsIkNMQVNTX05BTUVfT1BFTiIsIkNMQVNTX05BTUVfRkFERSQzIiwiQ0xBU1NfTkFNRV9TSE9XJDQiLCJDTEFTU19OQU1FX1NUQVRJQyIsIk9QRU5fU0VMRUNUT1IkMSIsIlNFTEVDVE9SX0RJQUxPRyIsIlNFTEVDVE9SX01PREFMX0JPRFkiLCJTRUxFQ1RPUl9EQVRBX1RPR0dMRSQyIiwiRGVmYXVsdCQ2IiwiRGVmYXVsdFR5cGUkNiIsIk1vZGFsIiwiX2RpYWxvZyIsIl9iYWNrZHJvcCIsIl9pbml0aWFsaXplQmFja0Ryb3AiLCJfZm9jdXN0cmFwIiwiX2luaXRpYWxpemVGb2N1c1RyYXAiLCJfc2Nyb2xsQmFyIiwiX2FkanVzdERpYWxvZyIsIl9zaG93RWxlbWVudCIsIl9oaWRlTW9kYWwiLCJoYW5kbGVVcGRhdGUiLCJtb2RhbEJvZHkiLCJ0cmFuc2l0aW9uQ29tcGxldGUiLCJfdHJpZ2dlckJhY2tkcm9wVHJhbnNpdGlvbiIsImV2ZW50MiIsIl9yZXNldEFkanVzdG1lbnRzIiwiaXNNb2RhbE92ZXJmbG93aW5nIiwiaW5pdGlhbE92ZXJmbG93WSIsImlzQm9keU92ZXJmbG93aW5nIiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiLCJhbHJlYWR5T3BlbiIsIk5BTUUkNiIsIkRBVEFfS0VZJDMiLCJFVkVOVF9LRVkkMyIsIkRBVEFfQVBJX0tFWSQxIiwiRVZFTlRfTE9BRF9EQVRBX0FQSSQyIiwiRVNDQVBFX0tFWSIsIkNMQVNTX05BTUVfU0hPVyQzIiwiQ0xBU1NfTkFNRV9TSE9XSU5HJDEiLCJDTEFTU19OQU1FX0hJRElORyIsIkNMQVNTX05BTUVfQkFDS0RST1AiLCJPUEVOX1NFTEVDVE9SIiwiRVZFTlRfU0hPVyQzIiwiRVZFTlRfU0hPV04kMyIsIkVWRU5UX0hJREUkMyIsIkVWRU5UX0hJREVfUFJFVkVOVEVEIiwiRVZFTlRfSElEREVOJDMiLCJFVkVOVF9SRVNJWkUiLCJFVkVOVF9DTElDS19EQVRBX0FQSSQxIiwiRVZFTlRfS0VZRE9XTl9ESVNNSVNTIiwiU0VMRUNUT1JfREFUQV9UT0dHTEUkMSIsIkRlZmF1bHQkNSIsIkRlZmF1bHRUeXBlJDUiLCJPZmZjYW52YXMiLCJibHVyIiwiY29tcGxldGVDYWxsYmFjayIsIkFSSUFfQVRUUklCVVRFX1BBVFRFUk4iLCJEZWZhdWx0QWxsb3dsaXN0IiwiYXJlYSIsImJyIiwiY29sIiwiY29kZSIsImRkIiwiZGl2IiwiZGwiLCJkdCIsImVtIiwiaHIiLCJoMSIsImgyIiwiaDMiLCJoNCIsImg1IiwiaDYiLCJsaSIsIm9sIiwicCIsInByZSIsInMiLCJzbWFsbCIsInNwYW4iLCJzdWIiLCJzdXAiLCJzdHJvbmciLCJ1IiwidWwiLCJ1cmlBdHRyaWJ1dGVzIiwiU0FGRV9VUkxfUEFUVEVSTiIsImFsbG93ZWRBdHRyaWJ1dGUiLCJhbGxvd2VkQXR0cmlidXRlTGlzdCIsImF0dHJpYnV0ZU5hbWUiLCJub2RlVmFsdWUiLCJhdHRyaWJ1dGVSZWdleCIsInJlZ2V4Iiwic2FuaXRpemVIdG1sIiwidW5zYWZlSHRtbCIsImFsbG93TGlzdCIsInNhbml0aXplRnVuY3Rpb24iLCJkb21QYXJzZXIiLCJET01QYXJzZXIiLCJjcmVhdGVkRG9jdW1lbnQiLCJwYXJzZUZyb21TdHJpbmciLCJlbGVtZW50TmFtZSIsImF0dHJpYnV0ZUxpc3QiLCJhbGxvd2VkQXR0cmlidXRlcyIsImlubmVySFRNTCIsIk5BTUUkNSIsIkRlZmF1bHQkNCIsImNvbnRlbnQiLCJleHRyYUNsYXNzIiwic2FuaXRpemUiLCJzYW5pdGl6ZUZuIiwidGVtcGxhdGUiLCJEZWZhdWx0VHlwZSQ0IiwiRGVmYXVsdENvbnRlbnRUeXBlIiwiZW50cnkiLCJUZW1wbGF0ZUZhY3RvcnkiLCJnZXRDb250ZW50IiwiX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uIiwiaGFzQ29udGVudCIsImNoYW5nZUNvbnRlbnQiLCJfY2hlY2tDb250ZW50IiwidG9IdG1sIiwidGVtcGxhdGVXcmFwcGVyIiwiX21heWJlU2FuaXRpemUiLCJ0ZXh0IiwiX3NldENvbnRlbnQiLCJhcmciLCJ0ZW1wbGF0ZUVsZW1lbnQiLCJfcHV0RWxlbWVudEluVGVtcGxhdGUiLCJ0ZXh0Q29udGVudCIsIk5BTUUkNCIsIkRJU0FMTE9XRURfQVRUUklCVVRFUyIsIkNMQVNTX05BTUVfRkFERSQyIiwiQ0xBU1NfTkFNRV9NT0RBTCIsIkNMQVNTX05BTUVfU0hPVyQyIiwiU0VMRUNUT1JfVE9PTFRJUF9JTk5FUiIsIlNFTEVDVE9SX01PREFMIiwiRVZFTlRfTU9EQUxfSElERSIsIlRSSUdHRVJfSE9WRVIiLCJUUklHR0VSX0ZPQ1VTIiwiVFJJR0dFUl9DTElDSyIsIlRSSUdHRVJfTUFOVUFMIiwiRVZFTlRfSElERSQyIiwiRVZFTlRfSElEREVOJDIiLCJFVkVOVF9TSE9XJDIiLCJFVkVOVF9TSE9XTiQyIiwiRVZFTlRfSU5TRVJURUQiLCJFVkVOVF9DTElDSyQxIiwiRVZFTlRfRk9DVVNJTiQxIiwiRVZFTlRfRk9DVVNPVVQkMSIsIkVWRU5UX01PVVNFRU5URVIiLCJFVkVOVF9NT1VTRUxFQVZFIiwiQXR0YWNobWVudE1hcCIsIkFVVE8iLCJUT1AiLCJSSUdIVCIsIkJPVFRPTSIsIkxFRlQiLCJEZWZhdWx0JDMiLCJhbmltYXRpb24iLCJjb250YWluZXIiLCJjdXN0b21DbGFzcyIsImRlbGF5IiwidGl0bGUiLCJEZWZhdWx0VHlwZSQzIiwiVG9vbHRpcCIsIl9pc0VuYWJsZWQiLCJfdGltZW91dCIsIl9pc0hvdmVyZWQiLCJfYWN0aXZlVHJpZ2dlciIsIl90ZW1wbGF0ZUZhY3RvcnkiLCJfbmV3Q29udGVudCIsInRpcCIsIl9zZXRMaXN0ZW5lcnMiLCJfZml4VGl0bGUiLCJlbmFibGUiLCJkaXNhYmxlIiwidG9nZ2xlRW5hYmxlZCIsImNsaWNrIiwiX2xlYXZlIiwiX2VudGVyIiwiX2hpZGVNb2RhbEhhbmRsZXIiLCJfZGlzcG9zZVBvcHBlciIsIl9pc1dpdGhDb250ZW50Iiwic2hhZG93Um9vdCIsImlzSW5UaGVEb20iLCJfZ2V0VGlwRWxlbWVudCIsIl9pc1dpdGhBY3RpdmVUcmlnZ2VyIiwiX2dldFRpdGxlIiwiX2NyZWF0ZVRpcEVsZW1lbnQiLCJfZ2V0Q29udGVudEZvclRlbXBsYXRlIiwiX2dldFRlbXBsYXRlRmFjdG9yeSIsInRpcElkIiwic2V0Q29udGVudCIsIl9pbml0aWFsaXplT25EZWxlZ2F0ZWRUYXJnZXQiLCJfZ2V0RGVsZWdhdGVDb25maWciLCJhdHRhY2htZW50IiwidHJpZ2dlcnMiLCJldmVudEluIiwiZXZlbnRPdXQiLCJfc2V0VGltZW91dCIsInRpbWVvdXQiLCJkYXRhQXR0cmlidXRlcyIsImRhdGFBdHRyaWJ1dGUiLCJOQU1FJDMiLCJTRUxFQ1RPUl9USVRMRSIsIlNFTEVDVE9SX0NPTlRFTlQiLCJEZWZhdWx0JDIiLCJEZWZhdWx0VHlwZSQyIiwiUG9wb3ZlciIsIl9nZXRDb250ZW50IiwiTkFNRSQyIiwiREFUQV9LRVkkMiIsIkVWRU5UX0tFWSQyIiwiREFUQV9BUElfS0VZIiwiRVZFTlRfQUNUSVZBVEUiLCJFVkVOVF9DTElDSyIsIkVWRU5UX0xPQURfREFUQV9BUEkkMSIsIkNMQVNTX05BTUVfRFJPUERPV05fSVRFTSIsIkNMQVNTX05BTUVfQUNUSVZFJDEiLCJTRUxFQ1RPUl9EQVRBX1NQWSIsIlNFTEVDVE9SX1RBUkdFVF9MSU5LUyIsIlNFTEVDVE9SX05BVl9MSVNUX0dST1VQIiwiU0VMRUNUT1JfTkFWX0xJTktTIiwiU0VMRUNUT1JfTkFWX0lURU1TIiwiU0VMRUNUT1JfTElTVF9JVEVNUyIsIlNFTEVDVE9SX0xJTktfSVRFTVMiLCJTRUxFQ1RPUl9EUk9QRE9XTiIsIlNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSQxIiwiRGVmYXVsdCQxIiwicm9vdE1hcmdpbiIsInNtb290aFNjcm9sbCIsInRocmVzaG9sZCIsIkRlZmF1bHRUeXBlJDEiLCJTY3JvbGxTcHkiLCJfdGFyZ2V0TGlua3MiLCJfb2JzZXJ2YWJsZVNlY3Rpb25zIiwiX3Jvb3RFbGVtZW50IiwiX2FjdGl2ZVRhcmdldCIsIl9vYnNlcnZlciIsIl9wcmV2aW91c1Njcm9sbERhdGEiLCJ2aXNpYmxlRW50cnlUb3AiLCJwYXJlbnRTY3JvbGxUb3AiLCJyZWZyZXNoIiwiX2luaXRpYWxpemVUYXJnZXRzQW5kT2JzZXJ2YWJsZXMiLCJfbWF5YmVFbmFibGVTbW9vdGhTY3JvbGwiLCJkaXNjb25uZWN0IiwiX2dldE5ld09ic2VydmVyIiwic2VjdGlvbiIsIm9ic2VydmUiLCJvYnNlcnZhYmxlU2VjdGlvbiIsInNjcm9sbFRvIiwiYmVoYXZpb3IiLCJJbnRlcnNlY3Rpb25PYnNlcnZlciIsIl9vYnNlcnZlckNhbGxiYWNrIiwidGFyZ2V0RWxlbWVudCIsIl9wcm9jZXNzIiwidXNlclNjcm9sbHNEb3duIiwiaXNJbnRlcnNlY3RpbmciLCJfY2xlYXJBY3RpdmVDbGFzcyIsImVudHJ5SXNMb3dlclRoYW5QcmV2aW91cyIsInRhcmdldExpbmtzIiwiYW5jaG9yIiwiZGVjb2RlVVJJIiwiX2FjdGl2YXRlUGFyZW50cyIsImxpc3RHcm91cCIsImFjdGl2ZU5vZGVzIiwic3B5IiwiTkFNRSQxIiwiREFUQV9LRVkkMSIsIkVWRU5UX0tFWSQxIiwiRVZFTlRfSElERSQxIiwiRVZFTlRfSElEREVOJDEiLCJFVkVOVF9TSE9XJDEiLCJFVkVOVF9TSE9XTiQxIiwiRVZFTlRfQ0xJQ0tfREFUQV9BUEkiLCJFVkVOVF9LRVlET1dOIiwiRVZFTlRfTE9BRF9EQVRBX0FQSSIsIkFSUk9XX0xFRlRfS0VZIiwiQVJST1dfUklHSFRfS0VZIiwiQVJST1dfVVBfS0VZIiwiQVJST1dfRE9XTl9LRVkiLCJIT01FX0tFWSIsIkVORF9LRVkiLCJDTEFTU19OQU1FX0FDVElWRSIsIkNMQVNTX05BTUVfRkFERSQxIiwiQ0xBU1NfTkFNRV9TSE9XJDEiLCJDTEFTU19EUk9QRE9XTiIsIlNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSIsIlNFTEVDVE9SX0RST1BET1dOX01FTlUiLCJOT1RfU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFIiwiU0VMRUNUT1JfVEFCX1BBTkVMIiwiU0VMRUNUT1JfT1VURVIiLCJTRUxFQ1RPUl9JTk5FUiIsIlNFTEVDVE9SX0RBVEFfVE9HR0xFIiwiU0VMRUNUT1JfSU5ORVJfRUxFTSIsIlNFTEVDVE9SX0RBVEFfVE9HR0xFX0FDVElWRSIsIlRhYiIsIl9zZXRJbml0aWFsQXR0cmlidXRlcyIsIl9nZXRDaGlsZHJlbiIsImlubmVyRWxlbSIsIl9lbGVtSXNBY3RpdmUiLCJhY3RpdmUiLCJfZ2V0QWN0aXZlRWxlbSIsIl9kZWFjdGl2YXRlIiwiX2FjdGl2YXRlIiwicmVsYXRlZEVsZW0iLCJfdG9nZ2xlRHJvcERvd24iLCJuZXh0QWN0aXZlRWxlbWVudCIsInByZXZlbnRTY3JvbGwiLCJfc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMiLCJfc2V0SW5pdGlhbEF0dHJpYnV0ZXNPbkNoaWxkIiwiX2dldElubmVyRWxlbWVudCIsImlzQWN0aXZlIiwib3V0ZXJFbGVtIiwiX2dldE91dGVyRWxlbWVudCIsIl9zZXRJbml0aWFsQXR0cmlidXRlc09uVGFyZ2V0UGFuZWwiLCJvcGVuIiwiRVZFTlRfTU9VU0VPVkVSIiwiRVZFTlRfTU9VU0VPVVQiLCJFVkVOVF9GT0NVU0lOIiwiRVZFTlRfRk9DVVNPVVQiLCJFVkVOVF9ISURFIiwiRVZFTlRfSElEREVOIiwiRVZFTlRfU0hPVyIsIkVWRU5UX1NIT1dOIiwiQ0xBU1NfTkFNRV9GQURFIiwiQ0xBU1NfTkFNRV9ISURFIiwiQ0xBU1NfTkFNRV9TSE9XIiwiQ0xBU1NfTkFNRV9TSE9XSU5HIiwiYXV0b2hpZGUiLCJUb2FzdCIsIl9oYXNNb3VzZUludGVyYWN0aW9uIiwiX2hhc0tleWJvYXJkSW50ZXJhY3Rpb24iLCJfY2xlYXJUaW1lb3V0IiwiX21heWJlU2NoZWR1bGVIaWRlIiwiaXNTaG93biIsIl9vbkludGVyYWN0aW9uIiwiaXNJbnRlcmFjdGluZyIsImluZGV4X3VtZCJdLCJzb3VyY2VzIjpbIi4uLy4uL2pzL3NyYy9kb20vZGF0YS5qcyIsIi4uLy4uL2pzL3NyYy91dGlsL2luZGV4LmpzIiwiLi4vLi4vanMvc3JjL2RvbS9ldmVudC1oYW5kbGVyLmpzIiwiLi4vLi4vanMvc3JjL2RvbS9tYW5pcHVsYXRvci5qcyIsIi4uLy4uL2pzL3NyYy91dGlsL2NvbmZpZy5qcyIsIi4uLy4uL2pzL3NyYy9iYXNlLWNvbXBvbmVudC5qcyIsIi4uLy4uL2pzL3NyYy9kb20vc2VsZWN0b3ItZW5naW5lLmpzIiwiLi4vLi4vanMvc3JjL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucy5qcyIsIi4uLy4uL2pzL3NyYy9hbGVydC5qcyIsIi4uLy4uL2pzL3NyYy9idXR0b24uanMiLCIuLi8uLi9qcy9zcmMvdXRpbC9zd2lwZS5qcyIsIi4uLy4uL2pzL3NyYy9jYXJvdXNlbC5qcyIsIi4uLy4uL2pzL3NyYy9jb2xsYXBzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZW51bXMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXROb2RlTmFtZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvdy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2luc3RhbmNlT2YuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9hcHBseVN0eWxlcy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvbWF0aC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvdXNlckFnZW50LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaXNMYXlvdXRWaWV3cG9ydC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldExheW91dFJlY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9jb250YWlucy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldENvbXB1dGVkU3R5bGUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pc1RhYmxlRWxlbWVudC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFBhcmVudE5vZGUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvd2l0aGluLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRGcmVzaFNpZGVPYmplY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21lcmdlUGFkZGluZ09iamVjdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZXhwYW5kVG9IYXNoTWFwLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvYXJyb3cuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldFZhcmlhdGlvbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2NvbXB1dGVTdHlsZXMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9ldmVudExpc3RlbmVycy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0T3Bwb3NpdGVQbGFjZW1lbnQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsQmFyWC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFZpZXdwb3J0UmVjdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldERvY3VtZW50UmVjdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2lzU2Nyb2xsUGFyZW50LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0U2Nyb2xsUGFyZW50LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvbGlzdFNjcm9sbFBhcmVudHMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3JlY3RUb0NsaWVudFJlY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDbGlwcGluZ1JlY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVPZmZzZXRzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9kZXRlY3RPdmVyZmxvdy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvY29tcHV0ZUF1dG9QbGFjZW1lbnQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9mbGlwLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvaGlkZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL29mZnNldC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL3BvcHBlck9mZnNldHMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEFsdEF4aXMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9wcmV2ZW50T3ZlcmZsb3cuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRIVE1MRWxlbWVudFNjcm9sbC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldE5vZGVTY3JvbGwuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDb21wb3NpdGVSZWN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9vcmRlck1vZGlmaWVycy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZGVib3VuY2UuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21lcmdlQnlOYW1lLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9jcmVhdGVQb3BwZXIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3BvcHBlci1saXRlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9wb3BwZXIuanMiLCIuLi8uLi9qcy9zcmMvZHJvcGRvd24uanMiLCIuLi8uLi9qcy9zcmMvdXRpbC9iYWNrZHJvcC5qcyIsIi4uLy4uL2pzL3NyYy91dGlsL2ZvY3VzdHJhcC5qcyIsIi4uLy4uL2pzL3NyYy91dGlsL3Njcm9sbGJhci5qcyIsIi4uLy4uL2pzL3NyYy9tb2RhbC5qcyIsIi4uLy4uL2pzL3NyYy9vZmZjYW52YXMuanMiLCIuLi8uLi9qcy9zcmMvdXRpbC9zYW5pdGl6ZXIuanMiLCIuLi8uLi9qcy9zcmMvdXRpbC90ZW1wbGF0ZS1mYWN0b3J5LmpzIiwiLi4vLi4vanMvc3JjL3Rvb2x0aXAuanMiLCIuLi8uLi9qcy9zcmMvcG9wb3Zlci5qcyIsIi4uLy4uL2pzL3NyYy9zY3JvbGxzcHkuanMiLCIuLi8uLi9qcy9zcmMvdGFiLmpzIiwiLi4vLi4vanMvc3JjL3RvYXN0LmpzIiwiLi4vLi4vanMvaW5kZXgudW1kLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBkb20vZGF0YS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgZWxlbWVudE1hcCA9IG5ldyBNYXAoKVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHNldChlbGVtZW50LCBrZXksIGluc3RhbmNlKSB7XG4gICAgaWYgKCFlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgZWxlbWVudE1hcC5zZXQoZWxlbWVudCwgbmV3IE1hcCgpKVxuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbmNlTWFwID0gZWxlbWVudE1hcC5nZXQoZWxlbWVudClcblxuICAgIC8vIG1ha2UgaXQgY2xlYXIgd2Ugb25seSB3YW50IG9uZSBpbnN0YW5jZSBwZXIgZWxlbWVudFxuICAgIC8vIGNhbiBiZSByZW1vdmVkIGxhdGVyIHdoZW4gbXVsdGlwbGUga2V5L2luc3RhbmNlcyBhcmUgZmluZSB0byBiZSB1c2VkXG4gICAgaWYgKCFpbnN0YW5jZU1hcC5oYXMoa2V5KSAmJiBpbnN0YW5jZU1hcC5zaXplICE9PSAwKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihgQm9vdHN0cmFwIGRvZXNuJ3QgYWxsb3cgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBwZXIgZWxlbWVudC4gQm91bmQgaW5zdGFuY2U6ICR7QXJyYXkuZnJvbShpbnN0YW5jZU1hcC5rZXlzKCkpWzBdfS5gKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaW5zdGFuY2VNYXAuc2V0KGtleSwgaW5zdGFuY2UpXG4gIH0sXG5cbiAgZ2V0KGVsZW1lbnQsIGtleSkge1xuICAgIGlmIChlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpLmdldChrZXkpIHx8IG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9LFxuXG4gIHJlbW92ZShlbGVtZW50LCBrZXkpIHtcbiAgICBpZiAoIWVsZW1lbnRNYXAuaGFzKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZU1hcCA9IGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpXG5cbiAgICBpbnN0YW5jZU1hcC5kZWxldGUoa2V5KVxuXG4gICAgLy8gZnJlZSB1cCBlbGVtZW50IHJlZmVyZW5jZXMgaWYgdGhlcmUgYXJlIG5vIGluc3RhbmNlcyBsZWZ0IGZvciBhbiBlbGVtZW50XG4gICAgaWYgKGluc3RhbmNlTWFwLnNpemUgPT09IDApIHtcbiAgICAgIGVsZW1lbnRNYXAuZGVsZXRlKGVsZW1lbnQpXG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9pbmRleC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmNvbnN0IE1BWF9VSUQgPSAxXzAwMF8wMDBcbmNvbnN0IE1JTExJU0VDT05EU19NVUxUSVBMSUVSID0gMTAwMFxuY29uc3QgVFJBTlNJVElPTl9FTkQgPSAndHJhbnNpdGlvbmVuZCdcblxuLyoqXG4gKiBQcm9wZXJseSBlc2NhcGUgSURzIHNlbGVjdG9ycyB0byBoYW5kbGUgd2VpcmQgSURzXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHBhcnNlU2VsZWN0b3IgPSBzZWxlY3RvciA9PiB7XG4gIGlmIChzZWxlY3RvciAmJiB3aW5kb3cuQ1NTICYmIHdpbmRvdy5DU1MuZXNjYXBlKSB7XG4gICAgLy8gZG9jdW1lbnQucXVlcnlTZWxlY3RvciBuZWVkcyBlc2NhcGluZyB0byBoYW5kbGUgSURzIChodG1sNSspIGNvbnRhaW5pbmcgZm9yIGluc3RhbmNlIC9cbiAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoLyMoW15cXHNcIiMnXSspL2csIChtYXRjaCwgaWQpID0+IGAjJHtDU1MuZXNjYXBlKGlkKX1gKVxuICB9XG5cbiAgcmV0dXJuIHNlbGVjdG9yXG59XG5cbi8vIFNob3V0LW91dCBBbmd1cyBDcm9sbCAoaHR0cHM6Ly9nb28uZ2wvcHh3UUdwKVxuY29uc3QgdG9UeXBlID0gb2JqZWN0ID0+IHtcbiAgaWYgKG9iamVjdCA9PT0gbnVsbCB8fCBvYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBgJHtvYmplY3R9YFxuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpLm1hdGNoKC9cXHMoW2Etel0rKS9pKVsxXS50b0xvd2VyQ2FzZSgpXG59XG5cbi8qKlxuICogUHVibGljIFV0aWwgQVBJXG4gKi9cblxuY29uc3QgZ2V0VUlEID0gcHJlZml4ID0+IHtcbiAgZG8ge1xuICAgIHByZWZpeCArPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBNQVhfVUlEKVxuICB9IHdoaWxlIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwcmVmaXgpKVxuXG4gIHJldHVybiBwcmVmaXhcbn1cblxuY29uc3QgZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQgPSBlbGVtZW50ID0+IHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuXG4gIC8vIEdldCB0cmFuc2l0aW9uLWR1cmF0aW9uIG9mIHRoZSBlbGVtZW50XG4gIGxldCB7IHRyYW5zaXRpb25EdXJhdGlvbiwgdHJhbnNpdGlvbkRlbGF5IH0gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVxuXG4gIGNvbnN0IGZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uID0gTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkR1cmF0aW9uKVxuICBjb25zdCBmbG9hdFRyYW5zaXRpb25EZWxheSA9IE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSlcblxuICAvLyBSZXR1cm4gMCBpZiBlbGVtZW50IG9yIHRyYW5zaXRpb24gZHVyYXRpb24gaXMgbm90IGZvdW5kXG4gIGlmICghZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24gJiYgIWZsb2F0VHJhbnNpdGlvbkRlbGF5KSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuXG4gIC8vIElmIG11bHRpcGxlIGR1cmF0aW9ucyBhcmUgZGVmaW5lZCwgdGFrZSB0aGUgZmlyc3RcbiAgdHJhbnNpdGlvbkR1cmF0aW9uID0gdHJhbnNpdGlvbkR1cmF0aW9uLnNwbGl0KCcsJylbMF1cbiAgdHJhbnNpdGlvbkRlbGF5ID0gdHJhbnNpdGlvbkRlbGF5LnNwbGl0KCcsJylbMF1cblxuICByZXR1cm4gKE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EdXJhdGlvbikgKyBOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRGVsYXkpKSAqIE1JTExJU0VDT05EU19NVUxUSVBMSUVSXG59XG5cbmNvbnN0IHRyaWdnZXJUcmFuc2l0aW9uRW5kID0gZWxlbWVudCA9PiB7XG4gIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoVFJBTlNJVElPTl9FTkQpKVxufVxuXG5jb25zdCBpc0VsZW1lbnQgPSBvYmplY3QgPT4ge1xuICBpZiAoIW9iamVjdCB8fCB0eXBlb2Ygb2JqZWN0ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmplY3QuanF1ZXJ5ICE9PSAndW5kZWZpbmVkJykge1xuICAgIG9iamVjdCA9IG9iamVjdFswXVxuICB9XG5cbiAgcmV0dXJuIHR5cGVvZiBvYmplY3Qubm9kZVR5cGUgIT09ICd1bmRlZmluZWQnXG59XG5cbmNvbnN0IGdldEVsZW1lbnQgPSBvYmplY3QgPT4ge1xuICAvLyBpdCdzIGEgalF1ZXJ5IG9iamVjdCBvciBhIG5vZGUgZWxlbWVudFxuICBpZiAoaXNFbGVtZW50KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0LmpxdWVyeSA/IG9iamVjdFswXSA6IG9iamVjdFxuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdzdHJpbmcnICYmIG9iamVjdC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocGFyc2VTZWxlY3RvcihvYmplY3QpKVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuY29uc3QgaXNWaXNpYmxlID0gZWxlbWVudCA9PiB7XG4gIGlmICghaXNFbGVtZW50KGVsZW1lbnQpIHx8IGVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0IGVsZW1lbnRJc1Zpc2libGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ3Zpc2liaWxpdHknKSA9PT0gJ3Zpc2libGUnXG4gIC8vIEhhbmRsZSBgZGV0YWlsc2AgZWxlbWVudCBhcyBpdHMgY29udGVudCBtYXkgZmFsc2llIGFwcGVhciB2aXNpYmxlIHdoZW4gaXQgaXMgY2xvc2VkXG4gIGNvbnN0IGNsb3NlZERldGFpbHMgPSBlbGVtZW50LmNsb3Nlc3QoJ2RldGFpbHM6bm90KFtvcGVuXSknKVxuXG4gIGlmICghY2xvc2VkRGV0YWlscykge1xuICAgIHJldHVybiBlbGVtZW50SXNWaXNpYmxlXG4gIH1cblxuICBpZiAoY2xvc2VkRGV0YWlscyAhPT0gZWxlbWVudCkge1xuICAgIGNvbnN0IHN1bW1hcnkgPSBlbGVtZW50LmNsb3Nlc3QoJ3N1bW1hcnknKVxuICAgIGlmIChzdW1tYXJ5ICYmIHN1bW1hcnkucGFyZW50Tm9kZSAhPT0gY2xvc2VkRGV0YWlscykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHN1bW1hcnkgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbGVtZW50SXNWaXNpYmxlXG59XG5cbmNvbnN0IGlzRGlzYWJsZWQgPSBlbGVtZW50ID0+IHtcbiAgaWYgKCFlbGVtZW50IHx8IGVsZW1lbnQubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZGlzYWJsZWQnKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAodHlwZW9mIGVsZW1lbnQuZGlzYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQuZGlzYWJsZWRcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGlzYWJsZWQnKSAhPT0gJ2ZhbHNlJ1xufVxuXG5jb25zdCBmaW5kU2hhZG93Um9vdCA9IGVsZW1lbnQgPT4ge1xuICBpZiAoIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hdHRhY2hTaGFkb3cpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gQ2FuIGZpbmQgdGhlIHNoYWRvdyByb290IG90aGVyd2lzZSBpdCdsbCByZXR1cm4gdGhlIGRvY3VtZW50XG4gIGlmICh0eXBlb2YgZWxlbWVudC5nZXRSb290Tm9kZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IHJvb3QgPSBlbGVtZW50LmdldFJvb3ROb2RlKClcbiAgICByZXR1cm4gcm9vdCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QgPyByb290IDogbnVsbFxuICB9XG5cbiAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgcmV0dXJuIGVsZW1lbnRcbiAgfVxuXG4gIC8vIHdoZW4gd2UgZG9uJ3QgZmluZCBhIHNoYWRvdyByb290XG4gIGlmICghZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiBmaW5kU2hhZG93Um9vdChlbGVtZW50LnBhcmVudE5vZGUpXG59XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fVxuXG4vKipcbiAqIFRyaWNrIHRvIHJlc3RhcnQgYW4gZWxlbWVudCdzIGFuaW1hdGlvblxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm4gdm9pZFxuICpcbiAqIEBzZWUgaHR0cHM6Ly93d3cuY2hhcmlzdGhlby5pby9ibG9nLzIwMjEvMDIvcmVzdGFydC1hLWNzcy1hbmltYXRpb24td2l0aC1qYXZhc2NyaXB0LyNyZXN0YXJ0aW5nLWEtY3NzLWFuaW1hdGlvblxuICovXG5jb25zdCByZWZsb3cgPSBlbGVtZW50ID0+IHtcbiAgZWxlbWVudC5vZmZzZXRIZWlnaHQgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcbn1cblxuY29uc3QgZ2V0alF1ZXJ5ID0gKCkgPT4ge1xuICBpZiAod2luZG93LmpRdWVyeSAmJiAhZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoJ2RhdGEtYnMtbm8tanF1ZXJ5JykpIHtcbiAgICByZXR1cm4gd2luZG93LmpRdWVyeVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuY29uc3QgRE9NQ29udGVudExvYWRlZENhbGxiYWNrcyA9IFtdXG5cbmNvbnN0IG9uRE9NQ29udGVudExvYWRlZCA9IGNhbGxiYWNrID0+IHtcbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgIC8vIGFkZCBsaXN0ZW5lciBvbiB0aGUgZmlyc3QgY2FsbCB3aGVuIHRoZSBkb2N1bWVudCBpcyBpbiBsb2FkaW5nIHN0YXRlXG4gICAgaWYgKCFET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIERPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MucHVzaChjYWxsYmFjaylcbiAgfSBlbHNlIHtcbiAgICBjYWxsYmFjaygpXG4gIH1cbn1cblxuY29uc3QgaXNSVEwgPSAoKSA9PiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZGlyID09PSAncnRsJ1xuXG5jb25zdCBkZWZpbmVKUXVlcnlQbHVnaW4gPSBwbHVnaW4gPT4ge1xuICBvbkRPTUNvbnRlbnRMb2FkZWQoKCkgPT4ge1xuICAgIGNvbnN0ICQgPSBnZXRqUXVlcnkoKVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICgkKSB7XG4gICAgICBjb25zdCBuYW1lID0gcGx1Z2luLk5BTUVcbiAgICAgIGNvbnN0IEpRVUVSWV9OT19DT05GTElDVCA9ICQuZm5bbmFtZV1cbiAgICAgICQuZm5bbmFtZV0gPSBwbHVnaW4ualF1ZXJ5SW50ZXJmYWNlXG4gICAgICAkLmZuW25hbWVdLkNvbnN0cnVjdG9yID0gcGx1Z2luXG4gICAgICAkLmZuW25hbWVdLm5vQ29uZmxpY3QgPSAoKSA9PiB7XG4gICAgICAgICQuZm5bbmFtZV0gPSBKUVVFUllfTk9fQ09ORkxJQ1RcbiAgICAgICAgcmV0dXJuIHBsdWdpbi5qUXVlcnlJbnRlcmZhY2VcbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbmNvbnN0IGV4ZWN1dGUgPSAocG9zc2libGVDYWxsYmFjaywgYXJncyA9IFtdLCBkZWZhdWx0VmFsdWUgPSBwb3NzaWJsZUNhbGxiYWNrKSA9PiB7XG4gIHJldHVybiB0eXBlb2YgcG9zc2libGVDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyA/IHBvc3NpYmxlQ2FsbGJhY2soLi4uYXJncykgOiBkZWZhdWx0VmFsdWVcbn1cblxuY29uc3QgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbiA9IChjYWxsYmFjaywgdHJhbnNpdGlvbkVsZW1lbnQsIHdhaXRGb3JUcmFuc2l0aW9uID0gdHJ1ZSkgPT4ge1xuICBpZiAoIXdhaXRGb3JUcmFuc2l0aW9uKSB7XG4gICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IGR1cmF0aW9uUGFkZGluZyA9IDVcbiAgY29uc3QgZW11bGF0ZWREdXJhdGlvbiA9IGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRyYW5zaXRpb25FbGVtZW50KSArIGR1cmF0aW9uUGFkZGluZ1xuXG4gIGxldCBjYWxsZWQgPSBmYWxzZVxuXG4gIGNvbnN0IGhhbmRsZXIgPSAoeyB0YXJnZXQgfSkgPT4ge1xuICAgIGlmICh0YXJnZXQgIT09IHRyYW5zaXRpb25FbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjYWxsZWQgPSB0cnVlXG4gICAgdHJhbnNpdGlvbkVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihUUkFOU0lUSU9OX0VORCwgaGFuZGxlcilcbiAgICBleGVjdXRlKGNhbGxiYWNrKVxuICB9XG5cbiAgdHJhbnNpdGlvbkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihUUkFOU0lUSU9OX0VORCwgaGFuZGxlcilcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgIHRyaWdnZXJUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25FbGVtZW50KVxuICAgIH1cbiAgfSwgZW11bGF0ZWREdXJhdGlvbilcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIHByZXZpb3VzL25leHQgZWxlbWVudCBvZiBhIGxpc3QuXG4gKlxuICogQHBhcmFtIHthcnJheX0gbGlzdCAgICBUaGUgbGlzdCBvZiBlbGVtZW50c1xuICogQHBhcmFtIGFjdGl2ZUVsZW1lbnQgICBUaGUgYWN0aXZlIGVsZW1lbnRcbiAqIEBwYXJhbSBzaG91bGRHZXROZXh0ICAgQ2hvb3NlIHRvIGdldCBuZXh0IG9yIHByZXZpb3VzIGVsZW1lbnRcbiAqIEBwYXJhbSBpc0N5Y2xlQWxsb3dlZFxuICogQHJldHVybiB7RWxlbWVudHxlbGVtfSBUaGUgcHJvcGVyIGVsZW1lbnRcbiAqL1xuY29uc3QgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQgPSAobGlzdCwgYWN0aXZlRWxlbWVudCwgc2hvdWxkR2V0TmV4dCwgaXNDeWNsZUFsbG93ZWQpID0+IHtcbiAgY29uc3QgbGlzdExlbmd0aCA9IGxpc3QubGVuZ3RoXG4gIGxldCBpbmRleCA9IGxpc3QuaW5kZXhPZihhY3RpdmVFbGVtZW50KVxuXG4gIC8vIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIHRoZSBsaXN0IHJldHVybiBhbiBlbGVtZW50XG4gIC8vIGRlcGVuZGluZyBvbiB0aGUgZGlyZWN0aW9uIGFuZCBpZiBjeWNsZSBpcyBhbGxvd2VkXG4gIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gIXNob3VsZEdldE5leHQgJiYgaXNDeWNsZUFsbG93ZWQgPyBsaXN0W2xpc3RMZW5ndGggLSAxXSA6IGxpc3RbMF1cbiAgfVxuXG4gIGluZGV4ICs9IHNob3VsZEdldE5leHQgPyAxIDogLTFcblxuICBpZiAoaXNDeWNsZUFsbG93ZWQpIHtcbiAgICBpbmRleCA9IChpbmRleCArIGxpc3RMZW5ndGgpICUgbGlzdExlbmd0aFxuICB9XG5cbiAgcmV0dXJuIGxpc3RbTWF0aC5tYXgoMCwgTWF0aC5taW4oaW5kZXgsIGxpc3RMZW5ndGggLSAxKSldXG59XG5cbmV4cG9ydCB7XG4gIGRlZmluZUpRdWVyeVBsdWdpbixcbiAgZXhlY3V0ZSxcbiAgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbixcbiAgZmluZFNoYWRvd1Jvb3QsXG4gIGdldEVsZW1lbnQsXG4gIGdldGpRdWVyeSxcbiAgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQsXG4gIGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50LFxuICBnZXRVSUQsXG4gIGlzRGlzYWJsZWQsXG4gIGlzRWxlbWVudCxcbiAgaXNSVEwsXG4gIGlzVmlzaWJsZSxcbiAgbm9vcCxcbiAgb25ET01Db250ZW50TG9hZGVkLFxuICBwYXJzZVNlbGVjdG9yLFxuICByZWZsb3csXG4gIHRyaWdnZXJUcmFuc2l0aW9uRW5kLFxuICB0b1R5cGVcbn1cbiIsIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBkb20vZXZlbnQtaGFuZGxlci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCB7IGdldGpRdWVyeSB9IGZyb20gJy4uL3V0aWwvaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgbmFtZXNwYWNlUmVnZXggPSAvW14uXSooPz1cXC4uKilcXC58LiovXG5jb25zdCBzdHJpcE5hbWVSZWdleCA9IC9cXC4uKi9cbmNvbnN0IHN0cmlwVWlkUmVnZXggPSAvOjpcXGQrJC9cbmNvbnN0IGV2ZW50UmVnaXN0cnkgPSB7fSAvLyBFdmVudHMgc3RvcmFnZVxubGV0IHVpZEV2ZW50ID0gMVxuY29uc3QgY3VzdG9tRXZlbnRzID0ge1xuICBtb3VzZWVudGVyOiAnbW91c2VvdmVyJyxcbiAgbW91c2VsZWF2ZTogJ21vdXNlb3V0J1xufVxuXG5jb25zdCBuYXRpdmVFdmVudHMgPSBuZXcgU2V0KFtcbiAgJ2NsaWNrJyxcbiAgJ2RibGNsaWNrJyxcbiAgJ21vdXNldXAnLFxuICAnbW91c2Vkb3duJyxcbiAgJ2NvbnRleHRtZW51JyxcbiAgJ21vdXNld2hlZWwnLFxuICAnRE9NTW91c2VTY3JvbGwnLFxuICAnbW91c2VvdmVyJyxcbiAgJ21vdXNlb3V0JyxcbiAgJ21vdXNlbW92ZScsXG4gICdzZWxlY3RzdGFydCcsXG4gICdzZWxlY3RlbmQnLFxuICAna2V5ZG93bicsXG4gICdrZXlwcmVzcycsXG4gICdrZXl1cCcsXG4gICdvcmllbnRhdGlvbmNoYW5nZScsXG4gICd0b3VjaHN0YXJ0JyxcbiAgJ3RvdWNobW92ZScsXG4gICd0b3VjaGVuZCcsXG4gICd0b3VjaGNhbmNlbCcsXG4gICdwb2ludGVyZG93bicsXG4gICdwb2ludGVybW92ZScsXG4gICdwb2ludGVydXAnLFxuICAncG9pbnRlcmxlYXZlJyxcbiAgJ3BvaW50ZXJjYW5jZWwnLFxuICAnZ2VzdHVyZXN0YXJ0JyxcbiAgJ2dlc3R1cmVjaGFuZ2UnLFxuICAnZ2VzdHVyZWVuZCcsXG4gICdmb2N1cycsXG4gICdibHVyJyxcbiAgJ2NoYW5nZScsXG4gICdyZXNldCcsXG4gICdzZWxlY3QnLFxuICAnc3VibWl0JyxcbiAgJ2ZvY3VzaW4nLFxuICAnZm9jdXNvdXQnLFxuICAnbG9hZCcsXG4gICd1bmxvYWQnLFxuICAnYmVmb3JldW5sb2FkJyxcbiAgJ3Jlc2l6ZScsXG4gICdtb3ZlJyxcbiAgJ0RPTUNvbnRlbnRMb2FkZWQnLFxuICAncmVhZHlzdGF0ZWNoYW5nZScsXG4gICdlcnJvcicsXG4gICdhYm9ydCcsXG4gICdzY3JvbGwnXG5dKVxuXG4vKipcbiAqIFByaXZhdGUgbWV0aG9kc1xuICovXG5cbmZ1bmN0aW9uIG1ha2VFdmVudFVpZChlbGVtZW50LCB1aWQpIHtcbiAgcmV0dXJuICh1aWQgJiYgYCR7dWlkfTo6JHt1aWRFdmVudCsrfWApIHx8IGVsZW1lbnQudWlkRXZlbnQgfHwgdWlkRXZlbnQrK1xufVxuXG5mdW5jdGlvbiBnZXRFbGVtZW50RXZlbnRzKGVsZW1lbnQpIHtcbiAgY29uc3QgdWlkID0gbWFrZUV2ZW50VWlkKGVsZW1lbnQpXG5cbiAgZWxlbWVudC51aWRFdmVudCA9IHVpZFxuICBldmVudFJlZ2lzdHJ5W3VpZF0gPSBldmVudFJlZ2lzdHJ5W3VpZF0gfHwge31cblxuICByZXR1cm4gZXZlbnRSZWdpc3RyeVt1aWRdXG59XG5cbmZ1bmN0aW9uIGJvb3RzdHJhcEhhbmRsZXIoZWxlbWVudCwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHtcbiAgICBoeWRyYXRlT2JqKGV2ZW50LCB7IGRlbGVnYXRlVGFyZ2V0OiBlbGVtZW50IH0pXG5cbiAgICBpZiAoaGFuZGxlci5vbmVPZmYpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgZXZlbnQudHlwZSwgZm4pXG4gICAgfVxuXG4gICAgcmV0dXJuIGZuLmFwcGx5KGVsZW1lbnQsIFtldmVudF0pXG4gIH1cbn1cblxuZnVuY3Rpb24gYm9vdHN0cmFwRGVsZWdhdGlvbkhhbmRsZXIoZWxlbWVudCwgc2VsZWN0b3IsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7XG4gICAgY29uc3QgZG9tRWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG5cbiAgICBmb3IgKGxldCB7IHRhcmdldCB9ID0gZXZlbnQ7IHRhcmdldCAmJiB0YXJnZXQgIT09IHRoaXM7IHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlKSB7XG4gICAgICBmb3IgKGNvbnN0IGRvbUVsZW1lbnQgb2YgZG9tRWxlbWVudHMpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQgIT09IHRhcmdldCkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBoeWRyYXRlT2JqKGV2ZW50LCB7IGRlbGVnYXRlVGFyZ2V0OiB0YXJnZXQgfSlcblxuICAgICAgICBpZiAoaGFuZGxlci5vbmVPZmYpIHtcbiAgICAgICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsIGV2ZW50LnR5cGUsIHNlbGVjdG9yLCBmbilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0YXJnZXQsIFtldmVudF0pXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRIYW5kbGVyKGV2ZW50cywgY2FsbGFibGUsIGRlbGVnYXRpb25TZWxlY3RvciA9IG51bGwpIHtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZXZlbnRzKVxuICAgIC5maW5kKGV2ZW50ID0+IGV2ZW50LmNhbGxhYmxlID09PSBjYWxsYWJsZSAmJiBldmVudC5kZWxlZ2F0aW9uU2VsZWN0b3IgPT09IGRlbGVnYXRpb25TZWxlY3Rvcilcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGFyYW1ldGVycyhvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gIGNvbnN0IGlzRGVsZWdhdGVkID0gdHlwZW9mIGhhbmRsZXIgPT09ICdzdHJpbmcnXG4gIC8vIFRPRE86IHRvb2x0aXAgcGFzc2VzIGBmYWxzZWAgaW5zdGVhZCBvZiBzZWxlY3Rvciwgc28gd2UgbmVlZCB0byBjaGVja1xuICBjb25zdCBjYWxsYWJsZSA9IGlzRGVsZWdhdGVkID8gZGVsZWdhdGlvbkZ1bmN0aW9uIDogKGhhbmRsZXIgfHwgZGVsZWdhdGlvbkZ1bmN0aW9uKVxuICBsZXQgdHlwZUV2ZW50ID0gZ2V0VHlwZUV2ZW50KG9yaWdpbmFsVHlwZUV2ZW50KVxuXG4gIGlmICghbmF0aXZlRXZlbnRzLmhhcyh0eXBlRXZlbnQpKSB7XG4gICAgdHlwZUV2ZW50ID0gb3JpZ2luYWxUeXBlRXZlbnRcbiAgfVxuXG4gIHJldHVybiBbaXNEZWxlZ2F0ZWQsIGNhbGxhYmxlLCB0eXBlRXZlbnRdXG59XG5cbmZ1bmN0aW9uIGFkZEhhbmRsZXIoZWxlbWVudCwgb3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbiwgb25lT2ZmKSB7XG4gIGlmICh0eXBlb2Ygb3JpZ2luYWxUeXBlRXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBsZXQgW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XSA9IG5vcm1hbGl6ZVBhcmFtZXRlcnMob3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbilcblxuICAvLyBpbiBjYXNlIG9mIG1vdXNlZW50ZXIgb3IgbW91c2VsZWF2ZSB3cmFwIHRoZSBoYW5kbGVyIHdpdGhpbiBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGZvciBpdHMgRE9NIHBvc2l0aW9uXG4gIC8vIHRoaXMgcHJldmVudHMgdGhlIGhhbmRsZXIgZnJvbSBiZWluZyBkaXNwYXRjaGVkIHRoZSBzYW1lIHdheSBhcyBtb3VzZW92ZXIgb3IgbW91c2VvdXQgZG9lc1xuICBpZiAob3JpZ2luYWxUeXBlRXZlbnQgaW4gY3VzdG9tRXZlbnRzKSB7XG4gICAgY29uc3Qgd3JhcEZ1bmN0aW9uID0gZm4gPT4ge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpZiAoIWV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgIT09IGV2ZW50LmRlbGVnYXRlVGFyZ2V0ICYmICFldmVudC5kZWxlZ2F0ZVRhcmdldC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSkpIHtcbiAgICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNhbGxhYmxlID0gd3JhcEZ1bmN0aW9uKGNhbGxhYmxlKVxuICB9XG5cbiAgY29uc3QgZXZlbnRzID0gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KVxuICBjb25zdCBoYW5kbGVycyA9IGV2ZW50c1t0eXBlRXZlbnRdIHx8IChldmVudHNbdHlwZUV2ZW50XSA9IHt9KVxuICBjb25zdCBwcmV2aW91c0Z1bmN0aW9uID0gZmluZEhhbmRsZXIoaGFuZGxlcnMsIGNhbGxhYmxlLCBpc0RlbGVnYXRlZCA/IGhhbmRsZXIgOiBudWxsKVxuXG4gIGlmIChwcmV2aW91c0Z1bmN0aW9uKSB7XG4gICAgcHJldmlvdXNGdW5jdGlvbi5vbmVPZmYgPSBwcmV2aW91c0Z1bmN0aW9uLm9uZU9mZiAmJiBvbmVPZmZcblxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdWlkID0gbWFrZUV2ZW50VWlkKGNhbGxhYmxlLCBvcmlnaW5hbFR5cGVFdmVudC5yZXBsYWNlKG5hbWVzcGFjZVJlZ2V4LCAnJykpXG4gIGNvbnN0IGZuID0gaXNEZWxlZ2F0ZWQgP1xuICAgIGJvb3RzdHJhcERlbGVnYXRpb25IYW5kbGVyKGVsZW1lbnQsIGhhbmRsZXIsIGNhbGxhYmxlKSA6XG4gICAgYm9vdHN0cmFwSGFuZGxlcihlbGVtZW50LCBjYWxsYWJsZSlcblxuICBmbi5kZWxlZ2F0aW9uU2VsZWN0b3IgPSBpc0RlbGVnYXRlZCA/IGhhbmRsZXIgOiBudWxsXG4gIGZuLmNhbGxhYmxlID0gY2FsbGFibGVcbiAgZm4ub25lT2ZmID0gb25lT2ZmXG4gIGZuLnVpZEV2ZW50ID0gdWlkXG4gIGhhbmRsZXJzW3VpZF0gPSBmblxuXG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlRXZlbnQsIGZuLCBpc0RlbGVnYXRlZClcbn1cblxuZnVuY3Rpb24gcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvblNlbGVjdG9yKSB7XG4gIGNvbnN0IGZuID0gZmluZEhhbmRsZXIoZXZlbnRzW3R5cGVFdmVudF0sIGhhbmRsZXIsIGRlbGVnYXRpb25TZWxlY3RvcilcblxuICBpZiAoIWZuKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZUV2ZW50LCBmbiwgQm9vbGVhbihkZWxlZ2F0aW9uU2VsZWN0b3IpKVxuICBkZWxldGUgZXZlbnRzW3R5cGVFdmVudF1bZm4udWlkRXZlbnRdXG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyhlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgbmFtZXNwYWNlKSB7XG4gIGNvbnN0IHN0b3JlRWxlbWVudEV2ZW50ID0gZXZlbnRzW3R5cGVFdmVudF0gfHwge31cblxuICBmb3IgKGNvbnN0IFtoYW5kbGVyS2V5LCBldmVudF0gb2YgT2JqZWN0LmVudHJpZXMoc3RvcmVFbGVtZW50RXZlbnQpKSB7XG4gICAgaWYgKGhhbmRsZXJLZXkuaW5jbHVkZXMobmFtZXNwYWNlKSkge1xuICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgZXZlbnQuY2FsbGFibGUsIGV2ZW50LmRlbGVnYXRpb25TZWxlY3RvcilcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VHlwZUV2ZW50KGV2ZW50KSB7XG4gIC8vIGFsbG93IHRvIGdldCB0aGUgbmF0aXZlIGV2ZW50cyBmcm9tIG5hbWVzcGFjZWQgZXZlbnRzICgnY2xpY2suYnMuYnV0dG9uJyAtLT4gJ2NsaWNrJylcbiAgZXZlbnQgPSBldmVudC5yZXBsYWNlKHN0cmlwTmFtZVJlZ2V4LCAnJylcbiAgcmV0dXJuIGN1c3RvbUV2ZW50c1tldmVudF0gfHwgZXZlbnRcbn1cblxuY29uc3QgRXZlbnRIYW5kbGVyID0ge1xuICBvbihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgYWRkSGFuZGxlcihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uLCBmYWxzZSlcbiAgfSxcblxuICBvbmUoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xuICAgIGFkZEhhbmRsZXIoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbiwgdHJ1ZSlcbiAgfSxcblxuICBvZmYoZWxlbWVudCwgb3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xuICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxUeXBlRXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBbaXNEZWxlZ2F0ZWQsIGNhbGxhYmxlLCB0eXBlRXZlbnRdID0gbm9ybWFsaXplUGFyYW1ldGVycyhvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKVxuICAgIGNvbnN0IGluTmFtZXNwYWNlID0gdHlwZUV2ZW50ICE9PSBvcmlnaW5hbFR5cGVFdmVudFxuICAgIGNvbnN0IGV2ZW50cyA9IGdldEVsZW1lbnRFdmVudHMoZWxlbWVudClcbiAgICBjb25zdCBzdG9yZUVsZW1lbnRFdmVudCA9IGV2ZW50c1t0eXBlRXZlbnRdIHx8IHt9XG4gICAgY29uc3QgaXNOYW1lc3BhY2UgPSBvcmlnaW5hbFR5cGVFdmVudC5zdGFydHNXaXRoKCcuJylcblxuICAgIGlmICh0eXBlb2YgY2FsbGFibGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBTaW1wbGVzdCBjYXNlOiBoYW5kbGVyIGlzIHBhc3NlZCwgcmVtb3ZlIHRoYXQgbGlzdGVuZXIgT05MWS5cbiAgICAgIGlmICghT2JqZWN0LmtleXMoc3RvcmVFbGVtZW50RXZlbnQpLmxlbmd0aCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgY2FsbGFibGUsIGlzRGVsZWdhdGVkID8gaGFuZGxlciA6IG51bGwpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaXNOYW1lc3BhY2UpIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudEV2ZW50IG9mIE9iamVjdC5rZXlzKGV2ZW50cykpIHtcbiAgICAgICAgcmVtb3ZlTmFtZXNwYWNlZEhhbmRsZXJzKGVsZW1lbnQsIGV2ZW50cywgZWxlbWVudEV2ZW50LCBvcmlnaW5hbFR5cGVFdmVudC5zbGljZSgxKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXlIYW5kbGVycywgZXZlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHN0b3JlRWxlbWVudEV2ZW50KSkge1xuICAgICAgY29uc3QgaGFuZGxlcktleSA9IGtleUhhbmRsZXJzLnJlcGxhY2Uoc3RyaXBVaWRSZWdleCwgJycpXG5cbiAgICAgIGlmICghaW5OYW1lc3BhY2UgfHwgb3JpZ2luYWxUeXBlRXZlbnQuaW5jbHVkZXMoaGFuZGxlcktleSkpIHtcbiAgICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgZXZlbnQuY2FsbGFibGUsIGV2ZW50LmRlbGVnYXRpb25TZWxlY3RvcilcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgdHJpZ2dlcihlbGVtZW50LCBldmVudCwgYXJncykge1xuICAgIGlmICh0eXBlb2YgZXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0ICQgPSBnZXRqUXVlcnkoKVxuICAgIGNvbnN0IHR5cGVFdmVudCA9IGdldFR5cGVFdmVudChldmVudClcbiAgICBjb25zdCBpbk5hbWVzcGFjZSA9IGV2ZW50ICE9PSB0eXBlRXZlbnRcblxuICAgIGxldCBqUXVlcnlFdmVudCA9IG51bGxcbiAgICBsZXQgYnViYmxlcyA9IHRydWVcbiAgICBsZXQgbmF0aXZlRGlzcGF0Y2ggPSB0cnVlXG4gICAgbGV0IGRlZmF1bHRQcmV2ZW50ZWQgPSBmYWxzZVxuXG4gICAgaWYgKGluTmFtZXNwYWNlICYmICQpIHtcbiAgICAgIGpRdWVyeUV2ZW50ID0gJC5FdmVudChldmVudCwgYXJncylcblxuICAgICAgJChlbGVtZW50KS50cmlnZ2VyKGpRdWVyeUV2ZW50KVxuICAgICAgYnViYmxlcyA9ICFqUXVlcnlFdmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpXG4gICAgICBuYXRpdmVEaXNwYXRjaCA9ICFqUXVlcnlFdmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpXG4gICAgICBkZWZhdWx0UHJldmVudGVkID0galF1ZXJ5RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKClcbiAgICB9XG5cbiAgICBjb25zdCBldnQgPSBoeWRyYXRlT2JqKG5ldyBFdmVudChldmVudCwgeyBidWJibGVzLCBjYW5jZWxhYmxlOiB0cnVlIH0pLCBhcmdzKVxuXG4gICAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgfVxuXG4gICAgaWYgKG5hdGl2ZURpc3BhdGNoKSB7XG4gICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KVxuICAgIH1cblxuICAgIGlmIChldnQuZGVmYXVsdFByZXZlbnRlZCAmJiBqUXVlcnlFdmVudCkge1xuICAgICAgalF1ZXJ5RXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIH1cblxuICAgIHJldHVybiBldnRcbiAgfVxufVxuXG5mdW5jdGlvbiBoeWRyYXRlT2JqKG9iaiwgbWV0YSA9IHt9KSB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGEpKSB7XG4gICAgdHJ5IHtcbiAgICAgIG9ialtrZXldID0gdmFsdWVcbiAgICB9IGNhdGNoIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbmV4cG9ydCBkZWZhdWx0IEV2ZW50SGFuZGxlclxuIiwiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGRvbS9tYW5pcHVsYXRvci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZURhdGEodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpZiAodmFsdWUgPT09IE51bWJlcih2YWx1ZSkudG9TdHJpbmcoKSkge1xuICAgIHJldHVybiBOdW1iZXIodmFsdWUpXG4gIH1cblxuICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSAnbnVsbCcpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSlcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRGF0YUtleShrZXkpIHtcbiAgcmV0dXJuIGtleS5yZXBsYWNlKC9bQS1aXS9nLCBjaHIgPT4gYC0ke2Noci50b0xvd2VyQ2FzZSgpfWApXG59XG5cbmNvbnN0IE1hbmlwdWxhdG9yID0ge1xuICBzZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIGtleSwgdmFsdWUpIHtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShgZGF0YS1icy0ke25vcm1hbGl6ZURhdGFLZXkoa2V5KX1gLCB2YWx1ZSlcbiAgfSxcblxuICByZW1vdmVEYXRhQXR0cmlidXRlKGVsZW1lbnQsIGtleSkge1xuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWApXG4gIH0sXG5cbiAgZ2V0RGF0YUF0dHJpYnV0ZXMoZWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHt9XG4gICAgY29uc3QgYnNLZXlzID0gT2JqZWN0LmtleXMoZWxlbWVudC5kYXRhc2V0KS5maWx0ZXIoa2V5ID0+IGtleS5zdGFydHNXaXRoKCdicycpICYmICFrZXkuc3RhcnRzV2l0aCgnYnNDb25maWcnKSlcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGJzS2V5cykge1xuICAgICAgbGV0IHB1cmVLZXkgPSBrZXkucmVwbGFjZSgvXmJzLywgJycpXG4gICAgICBwdXJlS2V5ID0gcHVyZUtleS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHB1cmVLZXkuc2xpY2UoMSwgcHVyZUtleS5sZW5ndGgpXG4gICAgICBhdHRyaWJ1dGVzW3B1cmVLZXldID0gbm9ybWFsaXplRGF0YShlbGVtZW50LmRhdGFzZXRba2V5XSlcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRlc1xuICB9LFxuXG4gIGdldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwga2V5KSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZURhdGEoZWxlbWVudC5nZXRBdHRyaWJ1dGUoYGRhdGEtYnMtJHtub3JtYWxpemVEYXRhS2V5KGtleSl9YCkpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWFuaXB1bGF0b3JcbiIsIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL2NvbmZpZy5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBNYW5pcHVsYXRvciBmcm9tICcuLi9kb20vbWFuaXB1bGF0b3IuanMnXG5pbXBvcnQgeyBpc0VsZW1lbnQsIHRvVHlwZSB9IGZyb20gJy4vaW5kZXguanMnXG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIENvbmZpZyB7XG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiB7fVxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBoYXZlIHRvIGltcGxlbWVudCB0aGUgc3RhdGljIG1ldGhvZCBcIk5BTUVcIiwgZm9yIGVhY2ggY29tcG9uZW50IScpXG4gIH1cblxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IHRoaXMuX21lcmdlQ29uZmlnT2JqKGNvbmZpZylcbiAgICBjb25maWcgPSB0aGlzLl9jb25maWdBZnRlck1lcmdlKGNvbmZpZylcbiAgICB0aGlzLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKVxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9tZXJnZUNvbmZpZ09iaihjb25maWcsIGVsZW1lbnQpIHtcbiAgICBjb25zdCBqc29uQ29uZmlnID0gaXNFbGVtZW50KGVsZW1lbnQpID8gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCAnY29uZmlnJykgOiB7fSAvLyB0cnkgdG8gcGFyc2VcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHQsXG4gICAgICAuLi4odHlwZW9mIGpzb25Db25maWcgPT09ICdvYmplY3QnID8ganNvbkNvbmZpZyA6IHt9KSxcbiAgICAgIC4uLihpc0VsZW1lbnQoZWxlbWVudCkgPyBNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlcyhlbGVtZW50KSA6IHt9KSxcbiAgICAgIC4uLih0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IHt9KVxuICAgIH1cbiAgfVxuXG4gIF90eXBlQ2hlY2tDb25maWcoY29uZmlnLCBjb25maWdUeXBlcyA9IHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpIHtcbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eSwgZXhwZWN0ZWRUeXBlc10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnVHlwZXMpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1twcm9wZXJ0eV1cbiAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IGlzRWxlbWVudCh2YWx1ZSkgPyAnZWxlbWVudCcgOiB0b1R5cGUodmFsdWUpXG5cbiAgICAgIGlmICghbmV3IFJlZ0V4cChleHBlY3RlZFR5cGVzKS50ZXN0KHZhbHVlVHlwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBgJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUUudG9VcHBlckNhc2UoKX06IE9wdGlvbiBcIiR7cHJvcGVydHl9XCIgcHJvdmlkZWQgdHlwZSBcIiR7dmFsdWVUeXBlfVwiIGJ1dCBleHBlY3RlZCB0eXBlIFwiJHtleHBlY3RlZFR5cGVzfVwiLmBcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb25maWdcbiIsIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBiYXNlLWNvbXBvbmVudC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBEYXRhIGZyb20gJy4vZG9tL2RhdGEuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgQ29uZmlnIGZyb20gJy4vdXRpbC9jb25maWcuanMnXG5pbXBvcnQgeyBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uLCBnZXRFbGVtZW50IH0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IFZFUlNJT04gPSAnNS4zLjMnXG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIEJhc2VDb21wb25lbnQgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcigpXG5cbiAgICBlbGVtZW50ID0gZ2V0RWxlbWVudChlbGVtZW50KVxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnRcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKVxuXG4gICAgRGF0YS5zZXQodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSwgdGhpcylcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBkaXNwb3NlKCkge1xuICAgIERhdGEucmVtb3ZlKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVkpXG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkVWRU5UX0tFWSlcblxuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7XG4gICAgICB0aGlzW3Byb3BlcnR5TmFtZV0gPSBudWxsXG4gICAgfVxuICB9XG5cbiAgX3F1ZXVlQ2FsbGJhY2soY2FsbGJhY2ssIGVsZW1lbnQsIGlzQW5pbWF0ZWQgPSB0cnVlKSB7XG4gICAgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbihjYWxsYmFjaywgZWxlbWVudCwgaXNBbmltYXRlZClcbiAgfVxuXG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uZmlnID0gdGhpcy5fbWVyZ2VDb25maWdPYmooY29uZmlnLCB0aGlzLl9lbGVtZW50KVxuICAgIGNvbmZpZyA9IHRoaXMuX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKVxuICAgIHRoaXMuX3R5cGVDaGVja0NvbmZpZyhjb25maWcpXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBnZXRJbnN0YW5jZShlbGVtZW50KSB7XG4gICAgcmV0dXJuIERhdGEuZ2V0KGdldEVsZW1lbnQoZWxlbWVudCksIHRoaXMuREFUQV9LRVkpXG4gIH1cblxuICBzdGF0aWMgZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50LCBjb25maWcgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmdldEluc3RhbmNlKGVsZW1lbnQpIHx8IG5ldyB0aGlzKGVsZW1lbnQsIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDogbnVsbClcbiAgfVxuXG4gIHN0YXRpYyBnZXQgVkVSU0lPTigpIHtcbiAgICByZXR1cm4gVkVSU0lPTlxuICB9XG5cbiAgc3RhdGljIGdldCBEQVRBX0tFWSgpIHtcbiAgICByZXR1cm4gYGJzLiR7dGhpcy5OQU1FfWBcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRVZFTlRfS0VZKCkge1xuICAgIHJldHVybiBgLiR7dGhpcy5EQVRBX0tFWX1gXG4gIH1cblxuICBzdGF0aWMgZXZlbnROYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gYCR7bmFtZX0ke3RoaXMuRVZFTlRfS0VZfWBcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCYXNlQ29tcG9uZW50XG4iLCIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgZG9tL3NlbGVjdG9yLWVuZ2luZS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCB7IGlzRGlzYWJsZWQsIGlzVmlzaWJsZSwgcGFyc2VTZWxlY3RvciB9IGZyb20gJy4uL3V0aWwvaW5kZXguanMnXG5cbmNvbnN0IGdldFNlbGVjdG9yID0gZWxlbWVudCA9PiB7XG4gIGxldCBzZWxlY3RvciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLXRhcmdldCcpXG5cbiAgaWYgKCFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gJyMnKSB7XG4gICAgbGV0IGhyZWZBdHRyaWJ1dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpXG5cbiAgICAvLyBUaGUgb25seSB2YWxpZCBjb250ZW50IHRoYXQgY291bGQgZG91YmxlIGFzIGEgc2VsZWN0b3IgYXJlIElEcyBvciBjbGFzc2VzLFxuICAgIC8vIHNvIGV2ZXJ5dGhpbmcgc3RhcnRpbmcgd2l0aCBgI2Agb3IgYC5gLiBJZiBhIFwicmVhbFwiIFVSTCBpcyB1c2VkIGFzIHRoZSBzZWxlY3RvcixcbiAgICAvLyBgZG9jdW1lbnQucXVlcnlTZWxlY3RvcmAgd2lsbCByaWdodGZ1bGx5IGNvbXBsYWluIGl0IGlzIGludmFsaWQuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMzIyNzNcbiAgICBpZiAoIWhyZWZBdHRyaWJ1dGUgfHwgKCFocmVmQXR0cmlidXRlLmluY2x1ZGVzKCcjJykgJiYgIWhyZWZBdHRyaWJ1dGUuc3RhcnRzV2l0aCgnLicpKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICAvLyBKdXN0IGluIGNhc2Ugc29tZSBDTVMgcHV0cyBvdXQgYSBmdWxsIFVSTCB3aXRoIHRoZSBhbmNob3IgYXBwZW5kZWRcbiAgICBpZiAoaHJlZkF0dHJpYnV0ZS5pbmNsdWRlcygnIycpICYmICFocmVmQXR0cmlidXRlLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgaHJlZkF0dHJpYnV0ZSA9IGAjJHtocmVmQXR0cmlidXRlLnNwbGl0KCcjJylbMV19YFxuICAgIH1cblxuICAgIHNlbGVjdG9yID0gaHJlZkF0dHJpYnV0ZSAmJiBocmVmQXR0cmlidXRlICE9PSAnIycgPyBocmVmQXR0cmlidXRlLnRyaW0oKSA6IG51bGxcbiAgfVxuXG4gIHJldHVybiBzZWxlY3RvciA/IHNlbGVjdG9yLnNwbGl0KCcsJykubWFwKHNlbCA9PiBwYXJzZVNlbGVjdG9yKHNlbCkpLmpvaW4oJywnKSA6IG51bGxcbn1cblxuY29uc3QgU2VsZWN0b3JFbmdpbmUgPSB7XG4gIGZpbmQoc2VsZWN0b3IsIGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KC4uLkVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwuY2FsbChlbGVtZW50LCBzZWxlY3RvcikpXG4gIH0sXG5cbiAgZmluZE9uZShzZWxlY3RvciwgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgIHJldHVybiBFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpXG4gIH0sXG5cbiAgY2hpbGRyZW4oZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KC4uLmVsZW1lbnQuY2hpbGRyZW4pLmZpbHRlcihjaGlsZCA9PiBjaGlsZC5tYXRjaGVzKHNlbGVjdG9yKSlcbiAgfSxcblxuICBwYXJlbnRzKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgY29uc3QgcGFyZW50cyA9IFtdXG4gICAgbGV0IGFuY2VzdG9yID0gZWxlbWVudC5wYXJlbnROb2RlLmNsb3Nlc3Qoc2VsZWN0b3IpXG5cbiAgICB3aGlsZSAoYW5jZXN0b3IpIHtcbiAgICAgIHBhcmVudHMucHVzaChhbmNlc3RvcilcbiAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50Tm9kZS5jbG9zZXN0KHNlbGVjdG9yKVxuICAgIH1cblxuICAgIHJldHVybiBwYXJlbnRzXG4gIH0sXG5cbiAgcHJldihlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIGxldCBwcmV2aW91cyA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZ1xuXG4gICAgd2hpbGUgKHByZXZpb3VzKSB7XG4gICAgICBpZiAocHJldmlvdXMubWF0Y2hlcyhzZWxlY3RvcikpIHtcbiAgICAgICAgcmV0dXJuIFtwcmV2aW91c11cbiAgICAgIH1cblxuICAgICAgcHJldmlvdXMgPSBwcmV2aW91cy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXG4gICAgfVxuXG4gICAgcmV0dXJuIFtdXG4gIH0sXG4gIC8vIFRPRE86IHRoaXMgaXMgbm93IHVudXNlZDsgcmVtb3ZlIGxhdGVyIGFsb25nIHdpdGggcHJldigpXG4gIG5leHQoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICBsZXQgbmV4dCA9IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nXG5cbiAgICB3aGlsZSAobmV4dCkge1xuICAgICAgaWYgKG5leHQubWF0Y2hlcyhzZWxlY3RvcikpIHtcbiAgICAgICAgcmV0dXJuIFtuZXh0XVxuICAgICAgfVxuXG4gICAgICBuZXh0ID0gbmV4dC5uZXh0RWxlbWVudFNpYmxpbmdcbiAgICB9XG5cbiAgICByZXR1cm4gW11cbiAgfSxcblxuICBmb2N1c2FibGVDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgY29uc3QgZm9jdXNhYmxlcyA9IFtcbiAgICAgICdhJyxcbiAgICAgICdidXR0b24nLFxuICAgICAgJ2lucHV0JyxcbiAgICAgICd0ZXh0YXJlYScsXG4gICAgICAnc2VsZWN0JyxcbiAgICAgICdkZXRhaWxzJyxcbiAgICAgICdbdGFiaW5kZXhdJyxcbiAgICAgICdbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXSdcbiAgICBdLm1hcChzZWxlY3RvciA9PiBgJHtzZWxlY3Rvcn06bm90KFt0YWJpbmRleF49XCItXCJdKWApLmpvaW4oJywnKVxuXG4gICAgcmV0dXJuIHRoaXMuZmluZChmb2N1c2FibGVzLCBlbGVtZW50KS5maWx0ZXIoZWwgPT4gIWlzRGlzYWJsZWQoZWwpICYmIGlzVmlzaWJsZShlbCkpXG4gIH0sXG5cbiAgZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KVxuXG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3RvcikgPyBzZWxlY3RvciA6IG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9LFxuXG4gIGdldEVsZW1lbnRGcm9tU2VsZWN0b3IoZWxlbWVudCkge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gZ2V0U2VsZWN0b3IoZWxlbWVudClcblxuICAgIHJldHVybiBzZWxlY3RvciA/IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IpIDogbnVsbFxuICB9LFxuXG4gIGdldE11bHRpcGxlRWxlbWVudHNGcm9tU2VsZWN0b3IoZWxlbWVudCkge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gZ2V0U2VsZWN0b3IoZWxlbWVudClcblxuICAgIHJldHVybiBzZWxlY3RvciA/IFNlbGVjdG9yRW5naW5lLmZpbmQoc2VsZWN0b3IpIDogW11cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTZWxlY3RvckVuZ2luZVxuIiwiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvY29tcG9uZW50LWZ1bmN0aW9ucy5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi4vZG9tL3NlbGVjdG9yLWVuZ2luZS5qcydcbmltcG9ydCB7IGlzRGlzYWJsZWQgfSBmcm9tICcuL2luZGV4LmpzJ1xuXG5jb25zdCBlbmFibGVEaXNtaXNzVHJpZ2dlciA9IChjb21wb25lbnQsIG1ldGhvZCA9ICdoaWRlJykgPT4ge1xuICBjb25zdCBjbGlja0V2ZW50ID0gYGNsaWNrLmRpc21pc3Mke2NvbXBvbmVudC5FVkVOVF9LRVl9YFxuICBjb25zdCBuYW1lID0gY29tcG9uZW50Lk5BTUVcblxuICBFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIGNsaWNrRXZlbnQsIGBbZGF0YS1icy1kaXNtaXNzPVwiJHtuYW1lfVwiXWAsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICB9XG5cbiAgICBpZiAoaXNEaXNhYmxlZCh0aGlzKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3Rvcih0aGlzKSB8fCB0aGlzLmNsb3Nlc3QoYC4ke25hbWV9YClcbiAgICBjb25zdCBpbnN0YW5jZSA9IGNvbXBvbmVudC5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldClcblxuICAgIC8vIE1ldGhvZCBhcmd1bWVudCBpcyBsZWZ0LCBmb3IgQWxlcnQgYW5kIG9ubHksIGFzIGl0IGRvZXNuJ3QgaW1wbGVtZW50IHRoZSAnaGlkZScgbWV0aG9kXG4gICAgaW5zdGFuY2VbbWV0aG9kXSgpXG4gIH0pXG59XG5cbmV4cG9ydCB7XG4gIGVuYWJsZURpc21pc3NUcmlnZ2VyXG59XG4iLCIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgYWxlcnQuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50LmpzJ1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyLmpzJ1xuaW1wb3J0IHsgZW5hYmxlRGlzbWlzc1RyaWdnZXIgfSBmcm9tICcuL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucy5qcydcbmltcG9ydCB7IGRlZmluZUpRdWVyeVBsdWdpbiB9IGZyb20gJy4vdXRpbC9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ2FsZXJ0J1xuY29uc3QgREFUQV9LRVkgPSAnYnMuYWxlcnQnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuXG5jb25zdCBFVkVOVF9DTE9TRSA9IGBjbG9zZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMT1NFRCA9IGBjbG9zZWQke0VWRU5UX0tFWX1gXG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSdcbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBBbGVydCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIGNsb3NlKCkge1xuICAgIGNvbnN0IGNsb3NlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9DTE9TRSlcblxuICAgIGlmIChjbG9zZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG5cbiAgICBjb25zdCBpc0FuaW1hdGVkID0gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFKVxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4gdGhpcy5fZGVzdHJveUVsZW1lbnQoKSwgdGhpcy5fZWxlbWVudCwgaXNBbmltYXRlZClcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2Rlc3Ryb3lFbGVtZW50KCkge1xuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKClcbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9DTE9TRUQpXG4gICAgdGhpcy5kaXNwb3NlKClcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IEFsZXJ0LmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YVtjb25maWddID09PSB1bmRlZmluZWQgfHwgY29uZmlnLnN0YXJ0c1dpdGgoJ18nKSB8fCBjb25maWcgPT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgfVxuXG4gICAgICBkYXRhW2NvbmZpZ10odGhpcylcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5lbmFibGVEaXNtaXNzVHJpZ2dlcihBbGVydCwgJ2Nsb3NlJylcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oQWxlcnQpXG5cbmV4cG9ydCBkZWZhdWx0IEFsZXJ0XG4iLCIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgYnV0dG9uLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCB7IGRlZmluZUpRdWVyeVBsdWdpbiB9IGZyb20gJy4vdXRpbC9pbmRleC5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ2J1dHRvbidcbmNvbnN0IERBVEFfS0VZID0gJ2JzLmJ1dHRvbidcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJ1xuXG5jb25zdCBDTEFTU19OQU1FX0FDVElWRSA9ICdhY3RpdmUnXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS1icy10b2dnbGU9XCJidXR0b25cIl0nXG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQnV0dG9uIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKCkge1xuICAgIC8vIFRvZ2dsZSBjbGFzcyBhbmQgc3luYyB0aGUgYGFyaWEtcHJlc3NlZGAgYXR0cmlidXRlIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYC50b2dnbGUoKWAgbWV0aG9kXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShDTEFTU19OQU1FX0FDVElWRSkpXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBCdXR0b24uZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKVxuXG4gICAgICBpZiAoY29uZmlnID09PSAndG9nZ2xlJykge1xuICAgICAgICBkYXRhW2NvbmZpZ10oKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBldmVudCA9PiB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICBjb25zdCBidXR0b24gPSBldmVudC50YXJnZXQuY2xvc2VzdChTRUxFQ1RPUl9EQVRBX1RPR0dMRSlcbiAgY29uc3QgZGF0YSA9IEJ1dHRvbi5nZXRPckNyZWF0ZUluc3RhbmNlKGJ1dHRvbilcblxuICBkYXRhLnRvZ2dsZSgpXG59KVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihCdXR0b24pXG5cbmV4cG9ydCBkZWZhdWx0IEJ1dHRvblxuIiwiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvc3dpcGUuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4uL2RvbS9ldmVudC1oYW5kbGVyLmpzJ1xuaW1wb3J0IENvbmZpZyBmcm9tICcuL2NvbmZpZy5qcydcbmltcG9ydCB7IGV4ZWN1dGUgfSBmcm9tICcuL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnc3dpcGUnXG5jb25zdCBFVkVOVF9LRVkgPSAnLmJzLnN3aXBlJ1xuY29uc3QgRVZFTlRfVE9VQ0hTVEFSVCA9IGB0b3VjaHN0YXJ0JHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfVE9VQ0hNT1ZFID0gYHRvdWNobW92ZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1RPVUNIRU5EID0gYHRvdWNoZW5kJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfUE9JTlRFUkRPV04gPSBgcG9pbnRlcmRvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9QT0lOVEVSVVAgPSBgcG9pbnRlcnVwJHtFVkVOVF9LRVl9YFxuY29uc3QgUE9JTlRFUl9UWVBFX1RPVUNIID0gJ3RvdWNoJ1xuY29uc3QgUE9JTlRFUl9UWVBFX1BFTiA9ICdwZW4nXG5jb25zdCBDTEFTU19OQU1FX1BPSU5URVJfRVZFTlQgPSAncG9pbnRlci1ldmVudCdcbmNvbnN0IFNXSVBFX1RIUkVTSE9MRCA9IDQwXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGVuZENhbGxiYWNrOiBudWxsLFxuICBsZWZ0Q2FsbGJhY2s6IG51bGwsXG4gIHJpZ2h0Q2FsbGJhY2s6IG51bGxcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGVuZENhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJyxcbiAgbGVmdENhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJyxcbiAgcmlnaHRDYWxsYmFjazogJyhmdW5jdGlvbnxudWxsKSdcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgU3dpcGUgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnRcblxuICAgIGlmICghZWxlbWVudCB8fCAhU3dpcGUuaXNTdXBwb3J0ZWQoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZylcbiAgICB0aGlzLl9kZWx0YVggPSAwXG4gICAgdGhpcy5fc3VwcG9ydFBvaW50ZXJFdmVudHMgPSBCb29sZWFuKHdpbmRvdy5Qb2ludGVyRXZlbnQpXG4gICAgdGhpcy5faW5pdEV2ZW50cygpXG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIGRpc3Bvc2UoKSB7XG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVkpXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9zdGFydChldmVudCkge1xuICAgIGlmICghdGhpcy5fc3VwcG9ydFBvaW50ZXJFdmVudHMpIHtcbiAgICAgIHRoaXMuX2RlbHRhWCA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WFxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZXZlbnRJc1BvaW50ZXJQZW5Ub3VjaChldmVudCkpIHtcbiAgICAgIHRoaXMuX2RlbHRhWCA9IGV2ZW50LmNsaWVudFhcbiAgICB9XG4gIH1cblxuICBfZW5kKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuX2V2ZW50SXNQb2ludGVyUGVuVG91Y2goZXZlbnQpKSB7XG4gICAgICB0aGlzLl9kZWx0YVggPSBldmVudC5jbGllbnRYIC0gdGhpcy5fZGVsdGFYXG4gICAgfVxuXG4gICAgdGhpcy5faGFuZGxlU3dpcGUoKVxuICAgIGV4ZWN1dGUodGhpcy5fY29uZmlnLmVuZENhbGxiYWNrKVxuICB9XG5cbiAgX21vdmUoZXZlbnQpIHtcbiAgICB0aGlzLl9kZWx0YVggPSBldmVudC50b3VjaGVzICYmIGV2ZW50LnRvdWNoZXMubGVuZ3RoID4gMSA/XG4gICAgICAwIDpcbiAgICAgIGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCAtIHRoaXMuX2RlbHRhWFxuICB9XG5cbiAgX2hhbmRsZVN3aXBlKCkge1xuICAgIGNvbnN0IGFic0RlbHRhWCA9IE1hdGguYWJzKHRoaXMuX2RlbHRhWClcblxuICAgIGlmIChhYnNEZWx0YVggPD0gU1dJUEVfVEhSRVNIT0xEKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBkaXJlY3Rpb24gPSBhYnNEZWx0YVggLyB0aGlzLl9kZWx0YVhcblxuICAgIHRoaXMuX2RlbHRhWCA9IDBcblxuICAgIGlmICghZGlyZWN0aW9uKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBleGVjdXRlKGRpcmVjdGlvbiA+IDAgPyB0aGlzLl9jb25maWcucmlnaHRDYWxsYmFjayA6IHRoaXMuX2NvbmZpZy5sZWZ0Q2FsbGJhY2spXG4gIH1cblxuICBfaW5pdEV2ZW50cygpIHtcbiAgICBpZiAodGhpcy5fc3VwcG9ydFBvaW50ZXJFdmVudHMpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9QT0lOVEVSRE9XTiwgZXZlbnQgPT4gdGhpcy5fc3RhcnQoZXZlbnQpKVxuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1BPSU5URVJVUCwgZXZlbnQgPT4gdGhpcy5fZW5kKGV2ZW50KSlcblxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfUE9JTlRFUl9FVkVOVClcbiAgICB9IGVsc2Uge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1RPVUNIU1RBUlQsIGV2ZW50ID0+IHRoaXMuX3N0YXJ0KGV2ZW50KSlcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9UT1VDSE1PVkUsIGV2ZW50ID0+IHRoaXMuX21vdmUoZXZlbnQpKVxuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1RPVUNIRU5ELCBldmVudCA9PiB0aGlzLl9lbmQoZXZlbnQpKVxuICAgIH1cbiAgfVxuXG4gIF9ldmVudElzUG9pbnRlclBlblRvdWNoKGV2ZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuX3N1cHBvcnRQb2ludGVyRXZlbnRzICYmIChldmVudC5wb2ludGVyVHlwZSA9PT0gUE9JTlRFUl9UWVBFX1BFTiB8fCBldmVudC5wb2ludGVyVHlwZSA9PT0gUE9JTlRFUl9UWVBFX1RPVUNIKVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBpc1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDBcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTd2lwZVxuIiwiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGNhcm91c2VsLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBNYW5pcHVsYXRvciBmcm9tICcuL2RvbS9tYW5pcHVsYXRvci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sXG4gIGdldE5leHRBY3RpdmVFbGVtZW50LFxuICBpc1JUTCxcbiAgaXNWaXNpYmxlLFxuICByZWZsb3csXG4gIHRyaWdnZXJUcmFuc2l0aW9uRW5kXG59IGZyb20gJy4vdXRpbC9pbmRleC5qcydcbmltcG9ydCBTd2lwZSBmcm9tICcuL3V0aWwvc3dpcGUuanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdjYXJvdXNlbCdcbmNvbnN0IERBVEFfS0VZID0gJ2JzLmNhcm91c2VsJ1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcbmNvbnN0IERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknXG5cbmNvbnN0IEFSUk9XX0xFRlRfS0VZID0gJ0Fycm93TGVmdCdcbmNvbnN0IEFSUk9XX1JJR0hUX0tFWSA9ICdBcnJvd1JpZ2h0J1xuY29uc3QgVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCA9IDUwMCAvLyBUaW1lIGZvciBtb3VzZSBjb21wYXQgZXZlbnRzIHRvIGZpcmUgYWZ0ZXIgdG91Y2hcblxuY29uc3QgT1JERVJfTkVYVCA9ICduZXh0J1xuY29uc3QgT1JERVJfUFJFViA9ICdwcmV2J1xuY29uc3QgRElSRUNUSU9OX0xFRlQgPSAnbGVmdCdcbmNvbnN0IERJUkVDVElPTl9SSUdIVCA9ICdyaWdodCdcblxuY29uc3QgRVZFTlRfU0xJREUgPSBgc2xpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TTElEID0gYHNsaWQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlET1dOID0gYGtleWRvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9NT1VTRUVOVEVSID0gYG1vdXNlZW50ZXIke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9NT1VTRUxFQVZFID0gYG1vdXNlbGVhdmUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9EUkFHX1NUQVJUID0gYGRyYWdzdGFydCR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0xPQURfREFUQV9BUEkgPSBgbG9hZCR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuXG5jb25zdCBDTEFTU19OQU1FX0NBUk9VU0VMID0gJ2Nhcm91c2VsJ1xuY29uc3QgQ0xBU1NfTkFNRV9BQ1RJVkUgPSAnYWN0aXZlJ1xuY29uc3QgQ0xBU1NfTkFNRV9TTElERSA9ICdzbGlkZSdcbmNvbnN0IENMQVNTX05BTUVfRU5EID0gJ2Nhcm91c2VsLWl0ZW0tZW5kJ1xuY29uc3QgQ0xBU1NfTkFNRV9TVEFSVCA9ICdjYXJvdXNlbC1pdGVtLXN0YXJ0J1xuY29uc3QgQ0xBU1NfTkFNRV9ORVhUID0gJ2Nhcm91c2VsLWl0ZW0tbmV4dCdcbmNvbnN0IENMQVNTX05BTUVfUFJFViA9ICdjYXJvdXNlbC1pdGVtLXByZXYnXG5cbmNvbnN0IFNFTEVDVE9SX0FDVElWRSA9ICcuYWN0aXZlJ1xuY29uc3QgU0VMRUNUT1JfSVRFTSA9ICcuY2Fyb3VzZWwtaXRlbSdcbmNvbnN0IFNFTEVDVE9SX0FDVElWRV9JVEVNID0gU0VMRUNUT1JfQUNUSVZFICsgU0VMRUNUT1JfSVRFTVxuY29uc3QgU0VMRUNUT1JfSVRFTV9JTUcgPSAnLmNhcm91c2VsLWl0ZW0gaW1nJ1xuY29uc3QgU0VMRUNUT1JfSU5ESUNBVE9SUyA9ICcuY2Fyb3VzZWwtaW5kaWNhdG9ycydcbmNvbnN0IFNFTEVDVE9SX0RBVEFfU0xJREUgPSAnW2RhdGEtYnMtc2xpZGVdLCBbZGF0YS1icy1zbGlkZS10b10nXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1JJREUgPSAnW2RhdGEtYnMtcmlkZT1cImNhcm91c2VsXCJdJ1xuXG5jb25zdCBLRVlfVE9fRElSRUNUSU9OID0ge1xuICBbQVJST1dfTEVGVF9LRVldOiBESVJFQ1RJT05fUklHSFQsXG4gIFtBUlJPV19SSUdIVF9LRVldOiBESVJFQ1RJT05fTEVGVFxufVxuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBpbnRlcnZhbDogNTAwMCxcbiAga2V5Ym9hcmQ6IHRydWUsXG4gIHBhdXNlOiAnaG92ZXInLFxuICByaWRlOiBmYWxzZSxcbiAgdG91Y2g6IHRydWUsXG4gIHdyYXA6IHRydWVcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGludGVydmFsOiAnKG51bWJlcnxib29sZWFuKScsIC8vIFRPRE86djYgcmVtb3ZlIGJvb2xlYW4gc3VwcG9ydFxuICBrZXlib2FyZDogJ2Jvb2xlYW4nLFxuICBwYXVzZTogJyhzdHJpbmd8Ym9vbGVhbiknLFxuICByaWRlOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIHRvdWNoOiAnYm9vbGVhbicsXG4gIHdyYXA6ICdib29sZWFuJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBDYXJvdXNlbCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGxcbiAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gbnVsbFxuICAgIHRoaXMuX2lzU2xpZGluZyA9IGZhbHNlXG4gICAgdGhpcy50b3VjaFRpbWVvdXQgPSBudWxsXG4gICAgdGhpcy5fc3dpcGVIZWxwZXIgPSBudWxsXG5cbiAgICB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfSU5ESUNBVE9SUywgdGhpcy5fZWxlbWVudClcbiAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpXG5cbiAgICBpZiAodGhpcy5fY29uZmlnLnJpZGUgPT09IENMQVNTX05BTUVfQ0FST1VTRUwpIHtcbiAgICAgIHRoaXMuY3ljbGUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgbmV4dCgpIHtcbiAgICB0aGlzLl9zbGlkZShPUkRFUl9ORVhUKVxuICB9XG5cbiAgbmV4dFdoZW5WaXNpYmxlKCkge1xuICAgIC8vIEZJWE1FIFRPRE8gdXNlIGBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGVgXG4gICAgLy8gRG9uJ3QgY2FsbCBuZXh0IHdoZW4gdGhlIHBhZ2UgaXNuJ3QgdmlzaWJsZVxuICAgIC8vIG9yIHRoZSBjYXJvdXNlbCBvciBpdHMgcGFyZW50IGlzbid0IHZpc2libGVcbiAgICBpZiAoIWRvY3VtZW50LmhpZGRlbiAmJiBpc1Zpc2libGUodGhpcy5fZWxlbWVudCkpIHtcbiAgICAgIHRoaXMubmV4dCgpXG4gICAgfVxuICB9XG5cbiAgcHJldigpIHtcbiAgICB0aGlzLl9zbGlkZShPUkRFUl9QUkVWKVxuICB9XG5cbiAgcGF1c2UoKSB7XG4gICAgaWYgKHRoaXMuX2lzU2xpZGluZykge1xuICAgICAgdHJpZ2dlclRyYW5zaXRpb25FbmQodGhpcy5fZWxlbWVudClcbiAgICB9XG5cbiAgICB0aGlzLl9jbGVhckludGVydmFsKClcbiAgfVxuXG4gIGN5Y2xlKCkge1xuICAgIHRoaXMuX2NsZWFySW50ZXJ2YWwoKVxuICAgIHRoaXMuX3VwZGF0ZUludGVydmFsKClcblxuICAgIHRoaXMuX2ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5uZXh0V2hlblZpc2libGUoKSwgdGhpcy5fY29uZmlnLmludGVydmFsKVxuICB9XG5cbiAgX21heWJlRW5hYmxlQ3ljbGUoKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcucmlkZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzU2xpZGluZykge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uZSh0aGlzLl9lbGVtZW50LCBFVkVOVF9TTElELCAoKSA9PiB0aGlzLmN5Y2xlKCkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmN5Y2xlKClcbiAgfVxuXG4gIHRvKGluZGV4KSB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLl9nZXRJdGVtcygpXG4gICAgaWYgKGluZGV4ID4gaXRlbXMubGVuZ3RoIC0gMSB8fCBpbmRleCA8IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc1NsaWRpbmcpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbmUodGhpcy5fZWxlbWVudCwgRVZFTlRfU0xJRCwgKCkgPT4gdGhpcy50byhpbmRleCkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleCh0aGlzLl9nZXRBY3RpdmUoKSlcbiAgICBpZiAoYWN0aXZlSW5kZXggPT09IGluZGV4KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBvcmRlciA9IGluZGV4ID4gYWN0aXZlSW5kZXggPyBPUkRFUl9ORVhUIDogT1JERVJfUFJFVlxuXG4gICAgdGhpcy5fc2xpZGUob3JkZXIsIGl0ZW1zW2luZGV4XSlcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgaWYgKHRoaXMuX3N3aXBlSGVscGVyKSB7XG4gICAgICB0aGlzLl9zd2lwZUhlbHBlci5kaXNwb3NlKClcbiAgICB9XG5cbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgY29uZmlnLmRlZmF1bHRJbnRlcnZhbCA9IGNvbmZpZy5pbnRlcnZhbFxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTiwgZXZlbnQgPT4gdGhpcy5fa2V5ZG93bihldmVudCkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5wYXVzZSA9PT0gJ2hvdmVyJykge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFRU5URVIsICgpID0+IHRoaXMucGF1c2UoKSlcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRUxFQVZFLCAoKSA9PiB0aGlzLl9tYXliZUVuYWJsZUN5Y2xlKCkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy50b3VjaCAmJiBTd2lwZS5pc1N1cHBvcnRlZCgpKSB7XG4gICAgICB0aGlzLl9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzKClcbiAgICB9XG4gIH1cblxuICBfYWRkVG91Y2hFdmVudExpc3RlbmVycygpIHtcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0lURU1fSU1HLCB0aGlzLl9lbGVtZW50KSkge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKGltZywgRVZFTlRfRFJBR19TVEFSVCwgZXZlbnQgPT4gZXZlbnQucHJldmVudERlZmF1bHQoKSlcbiAgICB9XG5cbiAgICBjb25zdCBlbmRDYWxsQmFjayA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jb25maWcucGF1c2UgIT09ICdob3ZlcicpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIElmIGl0J3MgYSB0b3VjaC1lbmFibGVkIGRldmljZSwgbW91c2VlbnRlci9sZWF2ZSBhcmUgZmlyZWQgYXNcbiAgICAgIC8vIHBhcnQgb2YgdGhlIG1vdXNlIGNvbXBhdGliaWxpdHkgZXZlbnRzIG9uIGZpcnN0IHRhcCAtIHRoZSBjYXJvdXNlbFxuICAgICAgLy8gd291bGQgc3RvcCBjeWNsaW5nIHVudGlsIHVzZXIgdGFwcGVkIG91dCBvZiBpdDtcbiAgICAgIC8vIGhlcmUsIHdlIGxpc3RlbiBmb3IgdG91Y2hlbmQsIGV4cGxpY2l0bHkgcGF1c2UgdGhlIGNhcm91c2VsXG4gICAgICAvLyAoYXMgaWYgaXQncyB0aGUgc2Vjb25kIHRpbWUgd2UgdGFwIG9uIGl0LCBtb3VzZWVudGVyIGNvbXBhdCBldmVudFxuICAgICAgLy8gaXMgTk9UIGZpcmVkKSBhbmQgYWZ0ZXIgYSB0aW1lb3V0ICh0byBhbGxvdyBmb3IgbW91c2UgY29tcGF0aWJpbGl0eVxuICAgICAgLy8gZXZlbnRzIHRvIGZpcmUpIHdlIGV4cGxpY2l0bHkgcmVzdGFydCBjeWNsaW5nXG5cbiAgICAgIHRoaXMucGF1c2UoKVxuICAgICAgaWYgKHRoaXMudG91Y2hUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvdWNoVGltZW91dClcbiAgICAgIH1cblxuICAgICAgdGhpcy50b3VjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX21heWJlRW5hYmxlQ3ljbGUoKSwgVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCArIHRoaXMuX2NvbmZpZy5pbnRlcnZhbClcbiAgICB9XG5cbiAgICBjb25zdCBzd2lwZUNvbmZpZyA9IHtcbiAgICAgIGxlZnRDYWxsYmFjazogKCkgPT4gdGhpcy5fc2xpZGUodGhpcy5fZGlyZWN0aW9uVG9PcmRlcihESVJFQ1RJT05fTEVGVCkpLFxuICAgICAgcmlnaHRDYWxsYmFjazogKCkgPT4gdGhpcy5fc2xpZGUodGhpcy5fZGlyZWN0aW9uVG9PcmRlcihESVJFQ1RJT05fUklHSFQpKSxcbiAgICAgIGVuZENhbGxiYWNrOiBlbmRDYWxsQmFja1xuICAgIH1cblxuICAgIHRoaXMuX3N3aXBlSGVscGVyID0gbmV3IFN3aXBlKHRoaXMuX2VsZW1lbnQsIHN3aXBlQ29uZmlnKVxuICB9XG5cbiAgX2tleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoL2lucHV0fHRleHRhcmVhL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IEtFWV9UT19ESVJFQ1RJT05bZXZlbnQua2V5XVxuICAgIGlmIChkaXJlY3Rpb24pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIHRoaXMuX3NsaWRlKHRoaXMuX2RpcmVjdGlvblRvT3JkZXIoZGlyZWN0aW9uKSlcbiAgICB9XG4gIH1cblxuICBfZ2V0SXRlbUluZGV4KGVsZW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0SXRlbXMoKS5pbmRleE9mKGVsZW1lbnQpXG4gIH1cblxuICBfc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudChpbmRleCkge1xuICAgIGlmICghdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2ZUluZGljYXRvciA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfQUNUSVZFLCB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudClcblxuICAgIGFjdGl2ZUluZGljYXRvci5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFKVxuICAgIGFjdGl2ZUluZGljYXRvci5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcpXG5cbiAgICBjb25zdCBuZXdBY3RpdmVJbmRpY2F0b3IgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKGBbZGF0YS1icy1zbGlkZS10bz1cIiR7aW5kZXh9XCJdYCwgdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpXG5cbiAgICBpZiAobmV3QWN0aXZlSW5kaWNhdG9yKSB7XG4gICAgICBuZXdBY3RpdmVJbmRpY2F0b3IuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSlcbiAgICAgIG5ld0FjdGl2ZUluZGljYXRvci5zZXRBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcsICd0cnVlJylcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlSW50ZXJ2YWwoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2FjdGl2ZUVsZW1lbnQgfHwgdGhpcy5fZ2V0QWN0aXZlKClcblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudEludGVydmFsID0gTnVtYmVyLnBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLWludGVydmFsJyksIDEwKVxuXG4gICAgdGhpcy5fY29uZmlnLmludGVydmFsID0gZWxlbWVudEludGVydmFsIHx8IHRoaXMuX2NvbmZpZy5kZWZhdWx0SW50ZXJ2YWxcbiAgfVxuXG4gIF9zbGlkZShvcmRlciwgZWxlbWVudCA9IG51bGwpIHtcbiAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5fZ2V0QWN0aXZlKClcbiAgICBjb25zdCBpc05leHQgPSBvcmRlciA9PT0gT1JERVJfTkVYVFxuICAgIGNvbnN0IG5leHRFbGVtZW50ID0gZWxlbWVudCB8fCBnZXROZXh0QWN0aXZlRWxlbWVudCh0aGlzLl9nZXRJdGVtcygpLCBhY3RpdmVFbGVtZW50LCBpc05leHQsIHRoaXMuX2NvbmZpZy53cmFwKVxuXG4gICAgaWYgKG5leHRFbGVtZW50ID09PSBhY3RpdmVFbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBuZXh0RWxlbWVudEluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KG5leHRFbGVtZW50KVxuXG4gICAgY29uc3QgdHJpZ2dlckV2ZW50ID0gZXZlbnROYW1lID0+IHtcbiAgICAgIHJldHVybiBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBldmVudE5hbWUsIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogbmV4dEVsZW1lbnQsXG4gICAgICAgIGRpcmVjdGlvbjogdGhpcy5fb3JkZXJUb0RpcmVjdGlvbihvcmRlciksXG4gICAgICAgIGZyb206IHRoaXMuX2dldEl0ZW1JbmRleChhY3RpdmVFbGVtZW50KSxcbiAgICAgICAgdG86IG5leHRFbGVtZW50SW5kZXhcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3Qgc2xpZGVFdmVudCA9IHRyaWdnZXJFdmVudChFVkVOVF9TTElERSlcblxuICAgIGlmIChzbGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghYWN0aXZlRWxlbWVudCB8fCAhbmV4dEVsZW1lbnQpIHtcbiAgICAgIC8vIFNvbWUgd2VpcmRuZXNzIGlzIGhhcHBlbmluZywgc28gd2UgYmFpbFxuICAgICAgLy8gVE9ETzogY2hhbmdlIHRlc3RzIHRoYXQgdXNlIGVtcHR5IGRpdnMgdG8gYXZvaWQgdGhpcyBjaGVja1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaXNDeWNsaW5nID0gQm9vbGVhbih0aGlzLl9pbnRlcnZhbClcbiAgICB0aGlzLnBhdXNlKClcblxuICAgIHRoaXMuX2lzU2xpZGluZyA9IHRydWVcblxuICAgIHRoaXMuX3NldEFjdGl2ZUluZGljYXRvckVsZW1lbnQobmV4dEVsZW1lbnRJbmRleClcbiAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gbmV4dEVsZW1lbnRcblxuICAgIGNvbnN0IGRpcmVjdGlvbmFsQ2xhc3NOYW1lID0gaXNOZXh0ID8gQ0xBU1NfTkFNRV9TVEFSVCA6IENMQVNTX05BTUVfRU5EXG4gICAgY29uc3Qgb3JkZXJDbGFzc05hbWUgPSBpc05leHQgPyBDTEFTU19OQU1FX05FWFQgOiBDTEFTU19OQU1FX1BSRVZcblxuICAgIG5leHRFbGVtZW50LmNsYXNzTGlzdC5hZGQob3JkZXJDbGFzc05hbWUpXG5cbiAgICByZWZsb3cobmV4dEVsZW1lbnQpXG5cbiAgICBhY3RpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoZGlyZWN0aW9uYWxDbGFzc05hbWUpXG4gICAgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmFkZChkaXJlY3Rpb25hbENsYXNzTmFtZSlcblxuICAgIGNvbnN0IGNvbXBsZXRlQ2FsbEJhY2sgPSAoKSA9PiB7XG4gICAgICBuZXh0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGRpcmVjdGlvbmFsQ2xhc3NOYW1lLCBvcmRlckNsYXNzTmFtZSlcbiAgICAgIG5leHRFbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG5cbiAgICAgIGFjdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSwgb3JkZXJDbGFzc05hbWUsIGRpcmVjdGlvbmFsQ2xhc3NOYW1lKVxuXG4gICAgICB0aGlzLl9pc1NsaWRpbmcgPSBmYWxzZVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoRVZFTlRfU0xJRClcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlQ2FsbEJhY2ssIGFjdGl2ZUVsZW1lbnQsIHRoaXMuX2lzQW5pbWF0ZWQoKSlcblxuICAgIGlmIChpc0N5Y2xpbmcpIHtcbiAgICAgIHRoaXMuY3ljbGUoKVxuICAgIH1cbiAgfVxuXG4gIF9pc0FuaW1hdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NMSURFKVxuICB9XG5cbiAgX2dldEFjdGl2ZSgpIHtcbiAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9BQ1RJVkVfSVRFTSwgdGhpcy5fZWxlbWVudClcbiAgfVxuXG4gIF9nZXRJdGVtcygpIHtcbiAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9JVEVNLCB0aGlzLl9lbGVtZW50KVxuICB9XG5cbiAgX2NsZWFySW50ZXJ2YWwoKSB7XG4gICAgaWYgKHRoaXMuX2ludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKVxuICAgICAgdGhpcy5faW50ZXJ2YWwgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgX2RpcmVjdGlvblRvT3JkZXIoZGlyZWN0aW9uKSB7XG4gICAgaWYgKGlzUlRMKCkpIHtcbiAgICAgIHJldHVybiBkaXJlY3Rpb24gPT09IERJUkVDVElPTl9MRUZUID8gT1JERVJfUFJFViA6IE9SREVSX05FWFRcbiAgICB9XG5cbiAgICByZXR1cm4gZGlyZWN0aW9uID09PSBESVJFQ1RJT05fTEVGVCA/IE9SREVSX05FWFQgOiBPUkRFUl9QUkVWXG4gIH1cblxuICBfb3JkZXJUb0RpcmVjdGlvbihvcmRlcikge1xuICAgIGlmIChpc1JUTCgpKSB7XG4gICAgICByZXR1cm4gb3JkZXIgPT09IE9SREVSX1BSRVYgPyBESVJFQ1RJT05fTEVGVCA6IERJUkVDVElPTl9SSUdIVFxuICAgIH1cblxuICAgIHJldHVybiBvcmRlciA9PT0gT1JERVJfUFJFViA/IERJUkVDVElPTl9SSUdIVCA6IERJUkVDVElPTl9MRUZUXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBDYXJvdXNlbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGRhdGEudG8oY29uZmlnKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9TTElERSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGNvbnN0IHRhcmdldCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcylcblxuICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0NBUk9VU0VMKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gIGNvbnN0IGNhcm91c2VsID0gQ2Fyb3VzZWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpXG4gIGNvbnN0IHNsaWRlSW5kZXggPSB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1icy1zbGlkZS10bycpXG5cbiAgaWYgKHNsaWRlSW5kZXgpIHtcbiAgICBjYXJvdXNlbC50byhzbGlkZUluZGV4KVxuICAgIGNhcm91c2VsLl9tYXliZUVuYWJsZUN5Y2xlKClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlKHRoaXMsICdzbGlkZScpID09PSAnbmV4dCcpIHtcbiAgICBjYXJvdXNlbC5uZXh0KClcbiAgICBjYXJvdXNlbC5fbWF5YmVFbmFibGVDeWNsZSgpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjYXJvdXNlbC5wcmV2KClcbiAgY2Fyb3VzZWwuX21heWJlRW5hYmxlQ3ljbGUoKVxufSlcblxuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfTE9BRF9EQVRBX0FQSSwgKCkgPT4ge1xuICBjb25zdCBjYXJvdXNlbHMgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfUklERSlcblxuICBmb3IgKGNvbnN0IGNhcm91c2VsIG9mIGNhcm91c2Vscykge1xuICAgIENhcm91c2VsLmdldE9yQ3JlYXRlSW5zdGFuY2UoY2Fyb3VzZWwpXG4gIH1cbn0pXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKENhcm91c2VsKVxuXG5leHBvcnQgZGVmYXVsdCBDYXJvdXNlbFxuIiwiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGNvbGxhcHNlLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sXG4gIGdldEVsZW1lbnQsXG4gIHJlZmxvd1xufSBmcm9tICcuL3V0aWwvaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdjb2xsYXBzZSdcbmNvbnN0IERBVEFfS0VZID0gJ2JzLmNvbGxhcHNlJ1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcbmNvbnN0IERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknXG5cbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1dOID0gYHNob3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElERSA9IGBoaWRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcbmNvbnN0IENMQVNTX05BTUVfQ09MTEFQU0UgPSAnY29sbGFwc2UnXG5jb25zdCBDTEFTU19OQU1FX0NPTExBUFNJTkcgPSAnY29sbGFwc2luZydcbmNvbnN0IENMQVNTX05BTUVfQ09MTEFQU0VEID0gJ2NvbGxhcHNlZCdcbmNvbnN0IENMQVNTX05BTUVfREVFUEVSX0NISUxEUkVOID0gYDpzY29wZSAuJHtDTEFTU19OQU1FX0NPTExBUFNFfSAuJHtDTEFTU19OQU1FX0NPTExBUFNFfWBcbmNvbnN0IENMQVNTX05BTUVfSE9SSVpPTlRBTCA9ICdjb2xsYXBzZS1ob3Jpem9udGFsJ1xuXG5jb25zdCBXSURUSCA9ICd3aWR0aCdcbmNvbnN0IEhFSUdIVCA9ICdoZWlnaHQnXG5cbmNvbnN0IFNFTEVDVE9SX0FDVElWRVMgPSAnLmNvbGxhcHNlLnNob3csIC5jb2xsYXBzZS5jb2xsYXBzaW5nJ1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwiY29sbGFwc2VcIl0nXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIHBhcmVudDogbnVsbCxcbiAgdG9nZ2xlOiB0cnVlXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBwYXJlbnQ6ICcobnVsbHxlbGVtZW50KScsXG4gIHRvZ2dsZTogJ2Jvb2xlYW4nXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIENvbGxhcHNlIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZylcblxuICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlXG4gICAgdGhpcy5fdHJpZ2dlckFycmF5ID0gW11cblxuICAgIGNvbnN0IHRvZ2dsZUxpc3QgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfVE9HR0xFKVxuXG4gICAgZm9yIChjb25zdCBlbGVtIG9mIHRvZ2dsZUxpc3QpIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gU2VsZWN0b3JFbmdpbmUuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtKVxuICAgICAgY29uc3QgZmlsdGVyRWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmQoc2VsZWN0b3IpXG4gICAgICAgIC5maWx0ZXIoZm91bmRFbGVtZW50ID0+IGZvdW5kRWxlbWVudCA9PT0gdGhpcy5fZWxlbWVudClcblxuICAgICAgaWYgKHNlbGVjdG9yICE9PSBudWxsICYmIGZpbHRlckVsZW1lbnQubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX3RyaWdnZXJBcnJheS5wdXNoKGVsZW0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5faW5pdGlhbGl6ZUNoaWxkcmVuKClcblxuICAgIGlmICghdGhpcy5fY29uZmlnLnBhcmVudCkge1xuICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuX3RyaWdnZXJBcnJheSwgdGhpcy5faXNTaG93bigpKVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jb25maWcudG9nZ2xlKSB7XG4gICAgICB0aGlzLnRvZ2dsZSgpXG4gICAgfVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICB0b2dnbGUoKSB7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgdGhpcy5oaWRlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93KClcbiAgICB9XG4gIH1cblxuICBzaG93KCkge1xuICAgIGlmICh0aGlzLl9pc1RyYW5zaXRpb25pbmcgfHwgdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsZXQgYWN0aXZlQ2hpbGRyZW4gPSBbXVxuXG4gICAgLy8gZmluZCBhY3RpdmUgY2hpbGRyZW5cbiAgICBpZiAodGhpcy5fY29uZmlnLnBhcmVudCkge1xuICAgICAgYWN0aXZlQ2hpbGRyZW4gPSB0aGlzLl9nZXRGaXJzdExldmVsQ2hpbGRyZW4oU0VMRUNUT1JfQUNUSVZFUylcbiAgICAgICAgLmZpbHRlcihlbGVtZW50ID0+IGVsZW1lbnQgIT09IHRoaXMuX2VsZW1lbnQpXG4gICAgICAgIC5tYXAoZWxlbWVudCA9PiBDb2xsYXBzZS5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQsIHsgdG9nZ2xlOiBmYWxzZSB9KSlcbiAgICB9XG5cbiAgICBpZiAoYWN0aXZlQ2hpbGRyZW4ubGVuZ3RoICYmIGFjdGl2ZUNoaWxkcmVuWzBdLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XKVxuICAgIGlmIChzdGFydEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGZvciAoY29uc3QgYWN0aXZlSW5zdGFuY2Ugb2YgYWN0aXZlQ2hpbGRyZW4pIHtcbiAgICAgIGFjdGl2ZUluc3RhbmNlLmhpZGUoKVxuICAgIH1cblxuICAgIGNvbnN0IGRpbWVuc2lvbiA9IHRoaXMuX2dldERpbWVuc2lvbigpXG5cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9DT0xMQVBTRSlcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKVxuXG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gMFxuXG4gICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuX3RyaWdnZXJBcnJheSwgdHJ1ZSlcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlXG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlXG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0NPTExBUFNJTkcpXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTRSwgQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAnJ1xuXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTilcbiAgICB9XG5cbiAgICBjb25zdCBjYXBpdGFsaXplZERpbWVuc2lvbiA9IGRpbWVuc2lvblswXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKDEpXG4gICAgY29uc3Qgc2Nyb2xsU2l6ZSA9IGBzY3JvbGwke2NhcGl0YWxpemVkRGltZW5zaW9ufWBcblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMuX2VsZW1lbnQsIHRydWUpXG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gYCR7dGhpcy5fZWxlbWVudFtzY3JvbGxTaXplXX1weGBcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgaWYgKHRoaXMuX2lzVHJhbnNpdGlvbmluZyB8fCAhdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzdGFydEV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSlcbiAgICBpZiAoc3RhcnRFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBkaW1lbnNpb24gPSB0aGlzLl9nZXREaW1lbnNpb24oKVxuXG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gYCR7dGhpcy5fZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtkaW1lbnNpb25dfXB4YFxuXG4gICAgcmVmbG93KHRoaXMuX2VsZW1lbnQpXG5cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0NPTExBUFNFLCBDTEFTU19OQU1FX1NIT1cpXG5cbiAgICBmb3IgKGNvbnN0IHRyaWdnZXIgb2YgdGhpcy5fdHJpZ2dlckFycmF5KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3Rvcih0cmlnZ2VyKVxuXG4gICAgICBpZiAoZWxlbWVudCAmJiAhdGhpcy5faXNTaG93bihlbGVtZW50KSkge1xuICAgICAgICB0aGlzLl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MoW3RyaWdnZXJdLCBmYWxzZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlXG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0UpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4pXG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gJydcblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMuX2VsZW1lbnQsIHRydWUpXG4gIH1cblxuICBfaXNTaG93bihlbGVtZW50ID0gdGhpcy5fZWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1cpXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgIGNvbmZpZy50b2dnbGUgPSBCb29sZWFuKGNvbmZpZy50b2dnbGUpIC8vIENvZXJjZSBzdHJpbmcgdmFsdWVzXG4gICAgY29uZmlnLnBhcmVudCA9IGdldEVsZW1lbnQoY29uZmlnLnBhcmVudClcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfZ2V0RGltZW5zaW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0hPUklaT05UQUwpID8gV0lEVEggOiBIRUlHSFRcbiAgfVxuXG4gIF9pbml0aWFsaXplQ2hpbGRyZW4oKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcucGFyZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuX2dldEZpcnN0TGV2ZWxDaGlsZHJlbihTRUxFQ1RPUl9EQVRBX1RPR0dMRSlcblxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBjaGlsZHJlbikge1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpXG5cbiAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICB0aGlzLl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MoW2VsZW1lbnRdLCB0aGlzLl9pc1Nob3duKHNlbGVjdGVkKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfZ2V0Rmlyc3RMZXZlbENoaWxkcmVuKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBTZWxlY3RvckVuZ2luZS5maW5kKENMQVNTX05BTUVfREVFUEVSX0NISUxEUkVOLCB0aGlzLl9jb25maWcucGFyZW50KVxuICAgIC8vIHJlbW92ZSBjaGlsZHJlbiBpZiBncmVhdGVyIGRlcHRoXG4gICAgcmV0dXJuIFNlbGVjdG9yRW5naW5lLmZpbmQoc2VsZWN0b3IsIHRoaXMuX2NvbmZpZy5wYXJlbnQpLmZpbHRlcihlbGVtZW50ID0+ICFjaGlsZHJlbi5pbmNsdWRlcyhlbGVtZW50KSlcbiAgfVxuXG4gIF9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3ModHJpZ2dlckFycmF5LCBpc09wZW4pIHtcbiAgICBpZiAoIXRyaWdnZXJBcnJheS5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0cmlnZ2VyQXJyYXkpIHtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShDTEFTU19OQU1FX0NPTExBUFNFRCwgIWlzT3BlbilcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgaXNPcGVuKVxuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIGNvbnN0IF9jb25maWcgPSB7fVxuICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJyAmJiAvc2hvd3xoaWRlLy50ZXN0KGNvbmZpZykpIHtcbiAgICAgIF9jb25maWcudG9nZ2xlID0gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBDb2xsYXBzZS5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIF9jb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICAgIH1cblxuICAgICAgICBkYXRhW2NvbmZpZ10oKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgLy8gcHJldmVudERlZmF1bHQgb25seSBmb3IgPGE+IGVsZW1lbnRzICh3aGljaCBjaGFuZ2UgdGhlIFVSTCkgbm90IGluc2lkZSB0aGUgY29sbGFwc2libGUgZWxlbWVudFxuICBpZiAoZXZlbnQudGFyZ2V0LnRhZ05hbWUgPT09ICdBJyB8fCAoZXZlbnQuZGVsZWdhdGVUYXJnZXQgJiYgZXZlbnQuZGVsZWdhdGVUYXJnZXQudGFnTmFtZSA9PT0gJ0EnKSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBTZWxlY3RvckVuZ2luZS5nZXRNdWx0aXBsZUVsZW1lbnRzRnJvbVNlbGVjdG9yKHRoaXMpKSB7XG4gICAgQ29sbGFwc2UuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50LCB7IHRvZ2dsZTogZmFsc2UgfSkudG9nZ2xlKClcbiAgfVxufSlcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oQ29sbGFwc2UpXG5cbmV4cG9ydCBkZWZhdWx0IENvbGxhcHNlXG4iLCJleHBvcnQgdmFyIHRvcCA9ICd0b3AnO1xuZXhwb3J0IHZhciBib3R0b20gPSAnYm90dG9tJztcbmV4cG9ydCB2YXIgcmlnaHQgPSAncmlnaHQnO1xuZXhwb3J0IHZhciBsZWZ0ID0gJ2xlZnQnO1xuZXhwb3J0IHZhciBhdXRvID0gJ2F1dG8nO1xuZXhwb3J0IHZhciBiYXNlUGxhY2VtZW50cyA9IFt0b3AsIGJvdHRvbSwgcmlnaHQsIGxlZnRdO1xuZXhwb3J0IHZhciBzdGFydCA9ICdzdGFydCc7XG5leHBvcnQgdmFyIGVuZCA9ICdlbmQnO1xuZXhwb3J0IHZhciBjbGlwcGluZ1BhcmVudHMgPSAnY2xpcHBpbmdQYXJlbnRzJztcbmV4cG9ydCB2YXIgdmlld3BvcnQgPSAndmlld3BvcnQnO1xuZXhwb3J0IHZhciBwb3BwZXIgPSAncG9wcGVyJztcbmV4cG9ydCB2YXIgcmVmZXJlbmNlID0gJ3JlZmVyZW5jZSc7XG5leHBvcnQgdmFyIHZhcmlhdGlvblBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovYmFzZVBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICByZXR1cm4gYWNjLmNvbmNhdChbcGxhY2VtZW50ICsgXCItXCIgKyBzdGFydCwgcGxhY2VtZW50ICsgXCItXCIgKyBlbmRdKTtcbn0sIFtdKTtcbmV4cG9ydCB2YXIgcGxhY2VtZW50cyA9IC8qI19fUFVSRV9fKi9bXS5jb25jYXQoYmFzZVBsYWNlbWVudHMsIFthdXRvXSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICByZXR1cm4gYWNjLmNvbmNhdChbcGxhY2VtZW50LCBwbGFjZW1lbnQgKyBcIi1cIiArIHN0YXJ0LCBwbGFjZW1lbnQgKyBcIi1cIiArIGVuZF0pO1xufSwgW10pOyAvLyBtb2RpZmllcnMgdGhhdCBuZWVkIHRvIHJlYWQgdGhlIERPTVxuXG5leHBvcnQgdmFyIGJlZm9yZVJlYWQgPSAnYmVmb3JlUmVhZCc7XG5leHBvcnQgdmFyIHJlYWQgPSAncmVhZCc7XG5leHBvcnQgdmFyIGFmdGVyUmVhZCA9ICdhZnRlclJlYWQnOyAvLyBwdXJlLWxvZ2ljIG1vZGlmaWVyc1xuXG5leHBvcnQgdmFyIGJlZm9yZU1haW4gPSAnYmVmb3JlTWFpbic7XG5leHBvcnQgdmFyIG1haW4gPSAnbWFpbic7XG5leHBvcnQgdmFyIGFmdGVyTWFpbiA9ICdhZnRlck1haW4nOyAvLyBtb2RpZmllciB3aXRoIHRoZSBwdXJwb3NlIHRvIHdyaXRlIHRvIHRoZSBET00gKG9yIHdyaXRlIGludG8gYSBmcmFtZXdvcmsgc3RhdGUpXG5cbmV4cG9ydCB2YXIgYmVmb3JlV3JpdGUgPSAnYmVmb3JlV3JpdGUnO1xuZXhwb3J0IHZhciB3cml0ZSA9ICd3cml0ZSc7XG5leHBvcnQgdmFyIGFmdGVyV3JpdGUgPSAnYWZ0ZXJXcml0ZSc7XG5leHBvcnQgdmFyIG1vZGlmaWVyUGhhc2VzID0gW2JlZm9yZVJlYWQsIHJlYWQsIGFmdGVyUmVhZCwgYmVmb3JlTWFpbiwgbWFpbiwgYWZ0ZXJNYWluLCBiZWZvcmVXcml0ZSwgd3JpdGUsIGFmdGVyV3JpdGVdOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE5vZGVOYW1lKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnQgPyAoZWxlbWVudC5ub2RlTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA6IG51bGw7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93KG5vZGUpIHtcbiAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICBpZiAobm9kZS50b1N0cmluZygpICE9PSAnW29iamVjdCBXaW5kb3ddJykge1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIHJldHVybiBvd25lckRvY3VtZW50ID8gb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3cgOiB3aW5kb3c7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBpc0VsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5FbGVtZW50O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5IVE1MRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gaXNTaGFkb3dSb290KG5vZGUpIHtcbiAgLy8gSUUgMTEgaGFzIG5vIFNoYWRvd1Jvb3RcbiAgaWYgKHR5cGVvZiBTaGFkb3dSb290ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLlNoYWRvd1Jvb3Q7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdDtcbn1cblxuZXhwb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50LCBpc1NoYWRvd1Jvb3QgfTsiLCJpbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4uL2RvbS11dGlscy9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiOyAvLyBUaGlzIG1vZGlmaWVyIHRha2VzIHRoZSBzdHlsZXMgcHJlcGFyZWQgYnkgdGhlIGBjb21wdXRlU3R5bGVzYCBtb2RpZmllclxuLy8gYW5kIGFwcGxpZXMgdGhlbSB0byB0aGUgSFRNTEVsZW1lbnRzIHN1Y2ggYXMgcG9wcGVyIGFuZCBhcnJvd1xuXG5mdW5jdGlvbiBhcHBseVN0eWxlcyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGU7XG4gIE9iamVjdC5rZXlzKHN0YXRlLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdmFyIHN0eWxlID0gc3RhdGUuc3R5bGVzW25hbWVdIHx8IHt9O1xuICAgIHZhciBhdHRyaWJ1dGVzID0gc3RhdGUuYXR0cmlidXRlc1tuYW1lXSB8fCB7fTtcbiAgICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW25hbWVdOyAvLyBhcnJvdyBpcyBvcHRpb25hbCArIHZpcnR1YWwgZWxlbWVudHNcblxuICAgIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAhZ2V0Tm9kZU5hbWUoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIEZsb3cgZG9lc24ndCBzdXBwb3J0IHRvIGV4dGVuZCB0aGlzIHByb3BlcnR5LCBidXQgaXQncyB0aGUgbW9zdFxuICAgIC8vIGVmZmVjdGl2ZSB3YXkgdG8gYXBwbHkgc3R5bGVzIHRvIGFuIEhUTUxFbGVtZW50XG4gICAgLy8gJEZsb3dGaXhNZVtjYW5ub3Qtd3JpdGVdXG5cblxuICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpO1xuICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGF0dHJpYnV0ZXNbbmFtZV07XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSA9PT0gdHJ1ZSA/ICcnIDogdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYyKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlO1xuICB2YXIgaW5pdGlhbFN0eWxlcyA9IHtcbiAgICBwb3BwZXI6IHtcbiAgICAgIHBvc2l0aW9uOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgbGVmdDogJzAnLFxuICAgICAgdG9wOiAnMCcsXG4gICAgICBtYXJnaW46ICcwJ1xuICAgIH0sXG4gICAgYXJyb3c6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnXG4gICAgfSxcbiAgICByZWZlcmVuY2U6IHt9XG4gIH07XG4gIE9iamVjdC5hc3NpZ24oc3RhdGUuZWxlbWVudHMucG9wcGVyLnN0eWxlLCBpbml0aWFsU3R5bGVzLnBvcHBlcik7XG4gIHN0YXRlLnN0eWxlcyA9IGluaXRpYWxTdHlsZXM7XG5cbiAgaWYgKHN0YXRlLmVsZW1lbnRzLmFycm93KSB7XG4gICAgT2JqZWN0LmFzc2lnbihzdGF0ZS5lbGVtZW50cy5hcnJvdy5zdHlsZSwgaW5pdGlhbFN0eWxlcy5hcnJvdyk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIE9iamVjdC5rZXlzKHN0YXRlLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW25hbWVdO1xuICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBzdGF0ZS5hdHRyaWJ1dGVzW25hbWVdIHx8IHt9O1xuICAgICAgdmFyIHN0eWxlUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKHN0YXRlLnN0eWxlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IHN0YXRlLnN0eWxlc1tuYW1lXSA6IGluaXRpYWxTdHlsZXNbbmFtZV0pOyAvLyBTZXQgYWxsIHZhbHVlcyB0byBhbiBlbXB0eSBzdHJpbmcgdG8gdW5zZXQgdGhlbVxuXG4gICAgICB2YXIgc3R5bGUgPSBzdHlsZVByb3BlcnRpZXMucmVkdWNlKGZ1bmN0aW9uIChzdHlsZSwgcHJvcGVydHkpIHtcbiAgICAgICAgc3R5bGVbcHJvcGVydHldID0gJyc7XG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgIH0sIHt9KTsgLy8gYXJyb3cgaXMgb3B0aW9uYWwgKyB2aXJ0dWFsIGVsZW1lbnRzXG5cbiAgICAgIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAhZ2V0Tm9kZU5hbWUoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKTtcbiAgICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdhcHBseVN0eWxlcycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnd3JpdGUnLFxuICBmbjogYXBwbHlTdHlsZXMsXG4gIGVmZmVjdDogZWZmZWN0LFxuICByZXF1aXJlczogWydjb21wdXRlU3R5bGVzJ11cbn07IiwiaW1wb3J0IHsgYXV0byB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xufSIsImV4cG9ydCB2YXIgbWF4ID0gTWF0aC5tYXg7XG5leHBvcnQgdmFyIG1pbiA9IE1hdGgubWluO1xuZXhwb3J0IHZhciByb3VuZCA9IE1hdGgucm91bmQ7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VUFTdHJpbmcoKSB7XG4gIHZhciB1YURhdGEgPSBuYXZpZ2F0b3IudXNlckFnZW50RGF0YTtcblxuICBpZiAodWFEYXRhICE9IG51bGwgJiYgdWFEYXRhLmJyYW5kcyAmJiBBcnJheS5pc0FycmF5KHVhRGF0YS5icmFuZHMpKSB7XG4gICAgcmV0dXJuIHVhRGF0YS5icmFuZHMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gaXRlbS5icmFuZCArIFwiL1wiICsgaXRlbS52ZXJzaW9uO1xuICAgIH0pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50O1xufSIsImltcG9ydCBnZXRVQVN0cmluZyBmcm9tIFwiLi4vdXRpbHMvdXNlckFnZW50LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0xheW91dFZpZXdwb3J0KCkge1xuICByZXR1cm4gIS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QoZ2V0VUFTdHJpbmcoKSk7XG59IiwiaW1wb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBpc0xheW91dFZpZXdwb3J0IGZyb20gXCIuL2lzTGF5b3V0Vmlld3BvcnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBpbmNsdWRlU2NhbGUsIGlzRml4ZWRTdHJhdGVneSkge1xuICBpZiAoaW5jbHVkZVNjYWxlID09PSB2b2lkIDApIHtcbiAgICBpbmNsdWRlU2NhbGUgPSBmYWxzZTtcbiAgfVxuXG4gIGlmIChpc0ZpeGVkU3RyYXRlZ3kgPT09IHZvaWQgMCkge1xuICAgIGlzRml4ZWRTdHJhdGVneSA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGNsaWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc2NhbGVYID0gMTtcbiAgdmFyIHNjYWxlWSA9IDE7XG5cbiAgaWYgKGluY2x1ZGVTY2FsZSAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgc2NhbGVYID0gZWxlbWVudC5vZmZzZXRXaWR0aCA+IDAgPyByb3VuZChjbGllbnRSZWN0LndpZHRoKSAvIGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMSA6IDE7XG4gICAgc2NhbGVZID0gZWxlbWVudC5vZmZzZXRIZWlnaHQgPiAwID8gcm91bmQoY2xpZW50UmVjdC5oZWlnaHQpIC8gZWxlbWVudC5vZmZzZXRIZWlnaHQgfHwgMSA6IDE7XG4gIH1cblxuICB2YXIgX3JlZiA9IGlzRWxlbWVudChlbGVtZW50KSA/IGdldFdpbmRvdyhlbGVtZW50KSA6IHdpbmRvdyxcbiAgICAgIHZpc3VhbFZpZXdwb3J0ID0gX3JlZi52aXN1YWxWaWV3cG9ydDtcblxuICB2YXIgYWRkVmlzdWFsT2Zmc2V0cyA9ICFpc0xheW91dFZpZXdwb3J0KCkgJiYgaXNGaXhlZFN0cmF0ZWd5O1xuICB2YXIgeCA9IChjbGllbnRSZWN0LmxlZnQgKyAoYWRkVmlzdWFsT2Zmc2V0cyAmJiB2aXN1YWxWaWV3cG9ydCA/IHZpc3VhbFZpZXdwb3J0Lm9mZnNldExlZnQgOiAwKSkgLyBzY2FsZVg7XG4gIHZhciB5ID0gKGNsaWVudFJlY3QudG9wICsgKGFkZFZpc3VhbE9mZnNldHMgJiYgdmlzdWFsVmlld3BvcnQgPyB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3AgOiAwKSkgLyBzY2FsZVk7XG4gIHZhciB3aWR0aCA9IGNsaWVudFJlY3Qud2lkdGggLyBzY2FsZVg7XG4gIHZhciBoZWlnaHQgPSBjbGllbnRSZWN0LmhlaWdodCAvIHNjYWxlWTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgdG9wOiB5LFxuICAgIHJpZ2h0OiB4ICsgd2lkdGgsXG4gICAgYm90dG9tOiB5ICsgaGVpZ2h0LFxuICAgIGxlZnQ6IHgsXG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG59IiwiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjsgLy8gUmV0dXJucyB0aGUgbGF5b3V0IHJlY3Qgb2YgYW4gZWxlbWVudCByZWxhdGl2ZSB0byBpdHMgb2Zmc2V0UGFyZW50LiBMYXlvdXRcbi8vIG1lYW5zIGl0IGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgdHJhbnNmb3Jtcy5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0TGF5b3V0UmVjdChlbGVtZW50KSB7XG4gIHZhciBjbGllbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQpOyAvLyBVc2UgdGhlIGNsaWVudFJlY3Qgc2l6ZXMgaWYgaXQncyBub3QgYmVlbiB0cmFuc2Zvcm1lZC5cbiAgLy8gRml4ZXMgaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy8xMjIzXG5cbiAgdmFyIHdpZHRoID0gZWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgdmFyIGhlaWdodCA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuXG4gIGlmIChNYXRoLmFicyhjbGllbnRSZWN0LndpZHRoIC0gd2lkdGgpIDw9IDEpIHtcbiAgICB3aWR0aCA9IGNsaWVudFJlY3Qud2lkdGg7XG4gIH1cblxuICBpZiAoTWF0aC5hYnMoY2xpZW50UmVjdC5oZWlnaHQgLSBoZWlnaHQpIDw9IDEpIHtcbiAgICBoZWlnaHQgPSBjbGllbnRSZWN0LmhlaWdodDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogZWxlbWVudC5vZmZzZXRMZWZ0LFxuICAgIHk6IGVsZW1lbnQub2Zmc2V0VG9wLFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9O1xufSIsImltcG9ydCB7IGlzU2hhZG93Um9vdCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnRhaW5zKHBhcmVudCwgY2hpbGQpIHtcbiAgdmFyIHJvb3ROb2RlID0gY2hpbGQuZ2V0Um9vdE5vZGUgJiYgY2hpbGQuZ2V0Um9vdE5vZGUoKTsgLy8gRmlyc3QsIGF0dGVtcHQgd2l0aCBmYXN0ZXIgbmF0aXZlIG1ldGhvZFxuXG4gIGlmIChwYXJlbnQuY29udGFpbnMoY2hpbGQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gdGhlbiBmYWxsYmFjayB0byBjdXN0b20gaW1wbGVtZW50YXRpb24gd2l0aCBTaGFkb3cgRE9NIHN1cHBvcnRcbiAgZWxzZSBpZiAocm9vdE5vZGUgJiYgaXNTaGFkb3dSb290KHJvb3ROb2RlKSkge1xuICAgICAgdmFyIG5leHQgPSBjaGlsZDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAobmV4dCAmJiBwYXJlbnQuaXNTYW1lTm9kZShuZXh0KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXTogbmVlZCBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoaXMuLi5cblxuXG4gICAgICAgIG5leHQgPSBuZXh0LnBhcmVudE5vZGUgfHwgbmV4dC5ob3N0O1xuICAgICAgfSB3aGlsZSAobmV4dCk7XG4gICAgfSAvLyBHaXZlIHVwLCB0aGUgcmVzdWx0IGlzIGZhbHNlXG5cblxuICByZXR1cm4gZmFsc2U7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkge1xuICByZXR1cm4gZ2V0V2luZG93KGVsZW1lbnQpLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG59IiwiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1RhYmxlRWxlbWVudChlbGVtZW50KSB7XG4gIHJldHVybiBbJ3RhYmxlJywgJ3RkJywgJ3RoJ10uaW5kZXhPZihnZXROb2RlTmFtZShlbGVtZW50KSkgPj0gMDtcbn0iLCJpbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkge1xuICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBhc3N1bWUgYm9keSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gIHJldHVybiAoKGlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQub3duZXJEb2N1bWVudCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICBlbGVtZW50LmRvY3VtZW50KSB8fCB3aW5kb3cuZG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudDtcbn0iLCJpbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRQYXJlbnROb2RlKGVsZW1lbnQpIHtcbiAgaWYgKGdldE5vZGVOYW1lKGVsZW1lbnQpID09PSAnaHRtbCcpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiAoLy8gdGhpcyBpcyBhIHF1aWNrZXIgKGJ1dCBsZXNzIHR5cGUgc2FmZSkgd2F5IHRvIHNhdmUgcXVpdGUgc29tZSBieXRlcyBmcm9tIHRoZSBidW5kbGVcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dXG4gICAgLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgZWxlbWVudC5hc3NpZ25lZFNsb3QgfHwgLy8gc3RlcCBpbnRvIHRoZSBzaGFkb3cgRE9NIG9mIHRoZSBwYXJlbnQgb2YgYSBzbG90dGVkIG5vZGVcbiAgICBlbGVtZW50LnBhcmVudE5vZGUgfHwgKCAvLyBET00gRWxlbWVudCBkZXRlY3RlZFxuICAgIGlzU2hhZG93Um9vdChlbGVtZW50KSA/IGVsZW1lbnQuaG9zdCA6IG51bGwpIHx8IC8vIFNoYWRvd1Jvb3QgZGV0ZWN0ZWRcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYWxsXTogSFRNTEVsZW1lbnQgaXMgYSBOb2RlXG4gICAgZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIC8vIGZhbGxiYWNrXG5cbiAgKTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50LCBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgaXNUYWJsZUVsZW1lbnQgZnJvbSBcIi4vaXNUYWJsZUVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBnZXRVQVN0cmluZyBmcm9tIFwiLi4vdXRpbHMvdXNlckFnZW50LmpzXCI7XG5cbmZ1bmN0aW9uIGdldFRydWVPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy84MzdcbiAgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0UGFyZW50O1xufSAvLyBgLm9mZnNldFBhcmVudGAgcmVwb3J0cyBgbnVsbGAgZm9yIGZpeGVkIGVsZW1lbnRzLCB3aGlsZSBhYnNvbHV0ZSBlbGVtZW50c1xuLy8gcmV0dXJuIHRoZSBjb250YWluaW5nIGJsb2NrXG5cblxuZnVuY3Rpb24gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHtcbiAgdmFyIGlzRmlyZWZveCA9IC9maXJlZm94L2kudGVzdChnZXRVQVN0cmluZygpKTtcbiAgdmFyIGlzSUUgPSAvVHJpZGVudC9pLnRlc3QoZ2V0VUFTdHJpbmcoKSk7XG5cbiAgaWYgKGlzSUUgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSkge1xuICAgIC8vIEluIElFIDksIDEwIGFuZCAxMSBmaXhlZCBlbGVtZW50cyBjb250YWluaW5nIGJsb2NrIGlzIGFsd2F5cyBlc3RhYmxpc2hlZCBieSB0aGUgdmlld3BvcnRcbiAgICB2YXIgZWxlbWVudENzcyA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG5cbiAgICBpZiAoZWxlbWVudENzcy5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgdmFyIGN1cnJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcblxuICBpZiAoaXNTaGFkb3dSb290KGN1cnJlbnROb2RlKSkge1xuICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuaG9zdDtcbiAgfVxuXG4gIHdoaWxlIChpc0hUTUxFbGVtZW50KGN1cnJlbnROb2RlKSAmJiBbJ2h0bWwnLCAnYm9keSddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoY3VycmVudE5vZGUpKSA8IDApIHtcbiAgICB2YXIgY3NzID0gZ2V0Q29tcHV0ZWRTdHlsZShjdXJyZW50Tm9kZSk7IC8vIFRoaXMgaXMgbm9uLWV4aGF1c3RpdmUgYnV0IGNvdmVycyB0aGUgbW9zdCBjb21tb24gQ1NTIHByb3BlcnRpZXMgdGhhdFxuICAgIC8vIGNyZWF0ZSBhIGNvbnRhaW5pbmcgYmxvY2suXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NvbnRhaW5pbmdfYmxvY2sjaWRlbnRpZnlpbmdfdGhlX2NvbnRhaW5pbmdfYmxvY2tcblxuICAgIGlmIChjc3MudHJhbnNmb3JtICE9PSAnbm9uZScgfHwgY3NzLnBlcnNwZWN0aXZlICE9PSAnbm9uZScgfHwgY3NzLmNvbnRhaW4gPT09ICdwYWludCcgfHwgWyd0cmFuc2Zvcm0nLCAncGVyc3BlY3RpdmUnXS5pbmRleE9mKGNzcy53aWxsQ2hhbmdlKSAhPT0gLTEgfHwgaXNGaXJlZm94ICYmIGNzcy53aWxsQ2hhbmdlID09PSAnZmlsdGVyJyB8fCBpc0ZpcmVmb3ggJiYgY3NzLmZpbHRlciAmJiBjc3MuZmlsdGVyICE9PSAnbm9uZScpIHtcbiAgICAgIHJldHVybiBjdXJyZW50Tm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufSAvLyBHZXRzIHRoZSBjbG9zZXN0IGFuY2VzdG9yIHBvc2l0aW9uZWQgZWxlbWVudC4gSGFuZGxlcyBzb21lIGVkZ2UgY2FzZXMsXG4vLyBzdWNoIGFzIHRhYmxlIGFuY2VzdG9ycyBhbmQgY3Jvc3MgYnJvd3NlciBidWdzLlxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9mZnNldFBhcmVudChlbGVtZW50KSB7XG4gIHZhciB3aW5kb3cgPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpO1xuXG4gIHdoaWxlIChvZmZzZXRQYXJlbnQgJiYgaXNUYWJsZUVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJiBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XG4gICAgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChvZmZzZXRQYXJlbnQpO1xuICB9XG5cbiAgaWYgKG9mZnNldFBhcmVudCAmJiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSA9PT0gJ2h0bWwnIHx8IGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdib2R5JyAmJiBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnKSkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB8fCB3aW5kb3c7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gWyd0b3AnLCAnYm90dG9tJ10uaW5kZXhPZihwbGFjZW1lbnQpID49IDAgPyAneCcgOiAneSc7XG59IiwiaW1wb3J0IHsgbWF4IGFzIG1hdGhNYXgsIG1pbiBhcyBtYXRoTWluIH0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhpbihtaW4sIHZhbHVlLCBtYXgpIHtcbiAgcmV0dXJuIG1hdGhNYXgobWluLCBtYXRoTWluKHZhbHVlLCBtYXgpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3aXRoaW5NYXhDbGFtcChtaW4sIHZhbHVlLCBtYXgpIHtcbiAgdmFyIHYgPSB3aXRoaW4obWluLCB2YWx1ZSwgbWF4KTtcbiAgcmV0dXJuIHYgPiBtYXggPyBtYXggOiB2O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEZyZXNoU2lkZU9iamVjdCgpIHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgYm90dG9tOiAwLFxuICAgIGxlZnQ6IDBcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0RnJlc2hTaWRlT2JqZWN0IGZyb20gXCIuL2dldEZyZXNoU2lkZU9iamVjdC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VQYWRkaW5nT2JqZWN0KHBhZGRpbmdPYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGdldEZyZXNoU2lkZU9iamVjdCgpLCBwYWRkaW5nT2JqZWN0KTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHBhbmRUb0hhc2hNYXAodmFsdWUsIGtleXMpIHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uIChoYXNoTWFwLCBrZXkpIHtcbiAgICBoYXNoTWFwW2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gaGFzaE1hcDtcbiAgfSwge30pO1xufSIsImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBjb250YWlucyBmcm9tIFwiLi4vZG9tLXV0aWxzL2NvbnRhaW5zLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IHdpdGhpbiB9IGZyb20gXCIuLi91dGlscy93aXRoaW4uanNcIjtcbmltcG9ydCBtZXJnZVBhZGRpbmdPYmplY3QgZnJvbSBcIi4uL3V0aWxzL21lcmdlUGFkZGluZ09iamVjdC5qc1wiO1xuaW1wb3J0IGV4cGFuZFRvSGFzaE1hcCBmcm9tIFwiLi4vdXRpbHMvZXhwYW5kVG9IYXNoTWFwLmpzXCI7XG5pbXBvcnQgeyBsZWZ0LCByaWdodCwgYmFzZVBsYWNlbWVudHMsIHRvcCwgYm90dG9tIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHRvUGFkZGluZ09iamVjdCA9IGZ1bmN0aW9uIHRvUGFkZGluZ09iamVjdChwYWRkaW5nLCBzdGF0ZSkge1xuICBwYWRkaW5nID0gdHlwZW9mIHBhZGRpbmcgPT09ICdmdW5jdGlvbicgPyBwYWRkaW5nKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnJlY3RzLCB7XG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSkpIDogcGFkZGluZztcbiAgcmV0dXJuIG1lcmdlUGFkZGluZ09iamVjdCh0eXBlb2YgcGFkZGluZyAhPT0gJ251bWJlcicgPyBwYWRkaW5nIDogZXhwYW5kVG9IYXNoTWFwKHBhZGRpbmcsIGJhc2VQbGFjZW1lbnRzKSk7XG59O1xuXG5mdW5jdGlvbiBhcnJvdyhfcmVmKSB7XG4gIHZhciBfc3RhdGUkbW9kaWZpZXJzRGF0YSQ7XG5cbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zO1xuICB2YXIgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3c7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzO1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQoc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIGF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCk7XG4gIHZhciBpc1ZlcnRpY2FsID0gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDA7XG4gIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gIGlmICghYXJyb3dFbGVtZW50IHx8ICFwb3BwZXJPZmZzZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBhZGRpbmdPYmplY3QgPSB0b1BhZGRpbmdPYmplY3Qob3B0aW9ucy5wYWRkaW5nLCBzdGF0ZSk7XG4gIHZhciBhcnJvd1JlY3QgPSBnZXRMYXlvdXRSZWN0KGFycm93RWxlbWVudCk7XG4gIHZhciBtaW5Qcm9wID0gYXhpcyA9PT0gJ3knID8gdG9wIDogbGVmdDtcbiAgdmFyIG1heFByb3AgPSBheGlzID09PSAneScgPyBib3R0b20gOiByaWdodDtcbiAgdmFyIGVuZERpZmYgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbbGVuXSArIHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtheGlzXSAtIHBvcHBlck9mZnNldHNbYXhpc10gLSBzdGF0ZS5yZWN0cy5wb3BwZXJbbGVuXTtcbiAgdmFyIHN0YXJ0RGlmZiA9IHBvcHBlck9mZnNldHNbYXhpc10gLSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbYXhpc107XG4gIHZhciBhcnJvd09mZnNldFBhcmVudCA9IGdldE9mZnNldFBhcmVudChhcnJvd0VsZW1lbnQpO1xuICB2YXIgY2xpZW50U2l6ZSA9IGFycm93T2Zmc2V0UGFyZW50ID8gYXhpcyA9PT0gJ3knID8gYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50SGVpZ2h0IHx8IDAgOiBhcnJvd09mZnNldFBhcmVudC5jbGllbnRXaWR0aCB8fCAwIDogMDtcbiAgdmFyIGNlbnRlclRvUmVmZXJlbmNlID0gZW5kRGlmZiAvIDIgLSBzdGFydERpZmYgLyAyOyAvLyBNYWtlIHN1cmUgdGhlIGFycm93IGRvZXNuJ3Qgb3ZlcmZsb3cgdGhlIHBvcHBlciBpZiB0aGUgY2VudGVyIHBvaW50IGlzXG4gIC8vIG91dHNpZGUgb2YgdGhlIHBvcHBlciBib3VuZHNcblxuICB2YXIgbWluID0gcGFkZGluZ09iamVjdFttaW5Qcm9wXTtcbiAgdmFyIG1heCA9IGNsaWVudFNpemUgLSBhcnJvd1JlY3RbbGVuXSAtIHBhZGRpbmdPYmplY3RbbWF4UHJvcF07XG4gIHZhciBjZW50ZXIgPSBjbGllbnRTaXplIC8gMiAtIGFycm93UmVjdFtsZW5dIC8gMiArIGNlbnRlclRvUmVmZXJlbmNlO1xuICB2YXIgb2Zmc2V0ID0gd2l0aGluKG1pbiwgY2VudGVyLCBtYXgpOyAvLyBQcmV2ZW50cyBicmVha2luZyBzeW50YXggaGlnaGxpZ2h0aW5nLi4uXG5cbiAgdmFyIGF4aXNQcm9wID0gYXhpcztcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IChfc3RhdGUkbW9kaWZpZXJzRGF0YSQgPSB7fSwgX3N0YXRlJG1vZGlmaWVyc0RhdGEkW2F4aXNQcm9wXSA9IG9mZnNldCwgX3N0YXRlJG1vZGlmaWVyc0RhdGEkLmNlbnRlck9mZnNldCA9IG9mZnNldCAtIGNlbnRlciwgX3N0YXRlJG1vZGlmaWVyc0RhdGEkKTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYyKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYyLm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRlbGVtZW50ID0gb3B0aW9ucy5lbGVtZW50LFxuICAgICAgYXJyb3dFbGVtZW50ID0gX29wdGlvbnMkZWxlbWVudCA9PT0gdm9pZCAwID8gJ1tkYXRhLXBvcHBlci1hcnJvd10nIDogX29wdGlvbnMkZWxlbWVudDtcblxuICBpZiAoYXJyb3dFbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gQ1NTIHNlbGVjdG9yXG5cblxuICBpZiAodHlwZW9mIGFycm93RWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5wb3BwZXIucXVlcnlTZWxlY3RvcihhcnJvd0VsZW1lbnQpO1xuXG4gICAgaWYgKCFhcnJvd0VsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbnRhaW5zKHN0YXRlLmVsZW1lbnRzLnBvcHBlciwgYXJyb3dFbGVtZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN0YXRlLmVsZW1lbnRzLmFycm93ID0gYXJyb3dFbGVtZW50O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnYXJyb3cnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogYXJyb3csXG4gIGVmZmVjdDogZWZmZWN0LFxuICByZXF1aXJlczogWydwb3BwZXJPZmZzZXRzJ10sXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsncHJldmVudE92ZXJmbG93J11cbn07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMV07XG59IiwiaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tLCBlbmQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciB1bnNldFNpZGVzID0ge1xuICB0b3A6ICdhdXRvJyxcbiAgcmlnaHQ6ICdhdXRvJyxcbiAgYm90dG9tOiAnYXV0bycsXG4gIGxlZnQ6ICdhdXRvJ1xufTsgLy8gUm91bmQgdGhlIG9mZnNldHMgdG8gdGhlIG5lYXJlc3Qgc3VpdGFibGUgc3VicGl4ZWwgYmFzZWQgb24gdGhlIERQUi5cbi8vIFpvb21pbmcgY2FuIGNoYW5nZSB0aGUgRFBSLCBidXQgaXQgc2VlbXMgdG8gcmVwb3J0IGEgdmFsdWUgdGhhdCB3aWxsXG4vLyBjbGVhbmx5IGRpdmlkZSB0aGUgdmFsdWVzIGludG8gdGhlIGFwcHJvcHJpYXRlIHN1YnBpeGVscy5cblxuZnVuY3Rpb24gcm91bmRPZmZzZXRzQnlEUFIoX3JlZiwgd2luKSB7XG4gIHZhciB4ID0gX3JlZi54LFxuICAgICAgeSA9IF9yZWYueTtcbiAgdmFyIGRwciA9IHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gIHJldHVybiB7XG4gICAgeDogcm91bmQoeCAqIGRwcikgLyBkcHIgfHwgMCxcbiAgICB5OiByb3VuZCh5ICogZHByKSAvIGRwciB8fCAwXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBUb1N0eWxlcyhfcmVmMikge1xuICB2YXIgX09iamVjdCRhc3NpZ24yO1xuXG4gIHZhciBwb3BwZXIgPSBfcmVmMi5wb3BwZXIsXG4gICAgICBwb3BwZXJSZWN0ID0gX3JlZjIucG9wcGVyUmVjdCxcbiAgICAgIHBsYWNlbWVudCA9IF9yZWYyLnBsYWNlbWVudCxcbiAgICAgIHZhcmlhdGlvbiA9IF9yZWYyLnZhcmlhdGlvbixcbiAgICAgIG9mZnNldHMgPSBfcmVmMi5vZmZzZXRzLFxuICAgICAgcG9zaXRpb24gPSBfcmVmMi5wb3NpdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9yZWYyLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGFkYXB0aXZlID0gX3JlZjIuYWRhcHRpdmUsXG4gICAgICByb3VuZE9mZnNldHMgPSBfcmVmMi5yb3VuZE9mZnNldHMsXG4gICAgICBpc0ZpeGVkID0gX3JlZjIuaXNGaXhlZDtcbiAgdmFyIF9vZmZzZXRzJHggPSBvZmZzZXRzLngsXG4gICAgICB4ID0gX29mZnNldHMkeCA9PT0gdm9pZCAwID8gMCA6IF9vZmZzZXRzJHgsXG4gICAgICBfb2Zmc2V0cyR5ID0gb2Zmc2V0cy55LFxuICAgICAgeSA9IF9vZmZzZXRzJHkgPT09IHZvaWQgMCA/IDAgOiBfb2Zmc2V0cyR5O1xuXG4gIHZhciBfcmVmMyA9IHR5cGVvZiByb3VuZE9mZnNldHMgPT09ICdmdW5jdGlvbicgPyByb3VuZE9mZnNldHMoe1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9KSA6IHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcblxuICB4ID0gX3JlZjMueDtcbiAgeSA9IF9yZWYzLnk7XG4gIHZhciBoYXNYID0gb2Zmc2V0cy5oYXNPd25Qcm9wZXJ0eSgneCcpO1xuICB2YXIgaGFzWSA9IG9mZnNldHMuaGFzT3duUHJvcGVydHkoJ3knKTtcbiAgdmFyIHNpZGVYID0gbGVmdDtcbiAgdmFyIHNpZGVZID0gdG9wO1xuICB2YXIgd2luID0gd2luZG93O1xuXG4gIGlmIChhZGFwdGl2ZSkge1xuICAgIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQocG9wcGVyKTtcbiAgICB2YXIgaGVpZ2h0UHJvcCA9ICdjbGllbnRIZWlnaHQnO1xuICAgIHZhciB3aWR0aFByb3AgPSAnY2xpZW50V2lkdGgnO1xuXG4gICAgaWYgKG9mZnNldFBhcmVudCA9PT0gZ2V0V2luZG93KHBvcHBlcikpIHtcbiAgICAgIG9mZnNldFBhcmVudCA9IGdldERvY3VtZW50RWxlbWVudChwb3BwZXIpO1xuXG4gICAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uICE9PSAnc3RhdGljJyAmJiBwb3NpdGlvbiA9PT0gJ2Fic29sdXRlJykge1xuICAgICAgICBoZWlnaHRQcm9wID0gJ3Njcm9sbEhlaWdodCc7XG4gICAgICAgIHdpZHRoUHJvcCA9ICdzY3JvbGxXaWR0aCc7XG4gICAgICB9XG4gICAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYXN0XTogZm9yY2UgdHlwZSByZWZpbmVtZW50LCB3ZSBjb21wYXJlIG9mZnNldFBhcmVudCB3aXRoIHdpbmRvdyBhYm92ZSwgYnV0IEZsb3cgZG9lc24ndCBkZXRlY3QgaXRcblxuXG4gICAgb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50O1xuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gdG9wIHx8IChwbGFjZW1lbnQgPT09IGxlZnQgfHwgcGxhY2VtZW50ID09PSByaWdodCkgJiYgdmFyaWF0aW9uID09PSBlbmQpIHtcbiAgICAgIHNpZGVZID0gYm90dG9tO1xuICAgICAgdmFyIG9mZnNldFkgPSBpc0ZpeGVkICYmIG9mZnNldFBhcmVudCA9PT0gd2luICYmIHdpbi52aXN1YWxWaWV3cG9ydCA/IHdpbi52aXN1YWxWaWV3cG9ydC5oZWlnaHQgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgICAgIG9mZnNldFBhcmVudFtoZWlnaHRQcm9wXTtcbiAgICAgIHkgLT0gb2Zmc2V0WSAtIHBvcHBlclJlY3QuaGVpZ2h0O1xuICAgICAgeSAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gbGVmdCB8fCAocGxhY2VtZW50ID09PSB0b3AgfHwgcGxhY2VtZW50ID09PSBib3R0b20pICYmIHZhcmlhdGlvbiA9PT0gZW5kKSB7XG4gICAgICBzaWRlWCA9IHJpZ2h0O1xuICAgICAgdmFyIG9mZnNldFggPSBpc0ZpeGVkICYmIG9mZnNldFBhcmVudCA9PT0gd2luICYmIHdpbi52aXN1YWxWaWV3cG9ydCA/IHdpbi52aXN1YWxWaWV3cG9ydC53aWR0aCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgb2Zmc2V0UGFyZW50W3dpZHRoUHJvcF07XG4gICAgICB4IC09IG9mZnNldFggLSBwb3BwZXJSZWN0LndpZHRoO1xuICAgICAgeCAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbW1vblN0eWxlcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHBvc2l0aW9uOiBwb3NpdGlvblxuICB9LCBhZGFwdGl2ZSAmJiB1bnNldFNpZGVzKTtcblxuICB2YXIgX3JlZjQgPSByb3VuZE9mZnNldHMgPT09IHRydWUgPyByb3VuZE9mZnNldHNCeURQUih7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH0sIGdldFdpbmRvdyhwb3BwZXIpKSA6IHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcblxuICB4ID0gX3JlZjQueDtcbiAgeSA9IF9yZWY0Lnk7XG5cbiAgaWYgKGdwdUFjY2VsZXJhdGlvbikge1xuICAgIHZhciBfT2JqZWN0JGFzc2lnbjtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIChfT2JqZWN0JGFzc2lnbiA9IHt9LCBfT2JqZWN0JGFzc2lnbltzaWRlWV0gPSBoYXNZID8gJzAnIDogJycsIF9PYmplY3QkYXNzaWduW3NpZGVYXSA9IGhhc1ggPyAnMCcgOiAnJywgX09iamVjdCRhc3NpZ24udHJhbnNmb3JtID0gKHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpIDw9IDEgPyBcInRyYW5zbGF0ZShcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4KVwiIDogXCJ0cmFuc2xhdGUzZChcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4LCAwKVwiLCBfT2JqZWN0JGFzc2lnbikpO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywgKF9PYmplY3QkYXNzaWduMiA9IHt9LCBfT2JqZWN0JGFzc2lnbjJbc2lkZVldID0gaGFzWSA/IHkgKyBcInB4XCIgOiAnJywgX09iamVjdCRhc3NpZ24yW3NpZGVYXSA9IGhhc1ggPyB4ICsgXCJweFwiIDogJycsIF9PYmplY3QkYXNzaWduMi50cmFuc2Zvcm0gPSAnJywgX09iamVjdCRhc3NpZ24yKSk7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVTdHlsZXMoX3JlZjUpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjUuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjUub3B0aW9ucztcbiAgdmFyIF9vcHRpb25zJGdwdUFjY2VsZXJhdCA9IG9wdGlvbnMuZ3B1QWNjZWxlcmF0aW9uLFxuICAgICAgZ3B1QWNjZWxlcmF0aW9uID0gX29wdGlvbnMkZ3B1QWNjZWxlcmF0ID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkZ3B1QWNjZWxlcmF0LFxuICAgICAgX29wdGlvbnMkYWRhcHRpdmUgPSBvcHRpb25zLmFkYXB0aXZlLFxuICAgICAgYWRhcHRpdmUgPSBfb3B0aW9ucyRhZGFwdGl2ZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGFkYXB0aXZlLFxuICAgICAgX29wdGlvbnMkcm91bmRPZmZzZXRzID0gb3B0aW9ucy5yb3VuZE9mZnNldHMsXG4gICAgICByb3VuZE9mZnNldHMgPSBfb3B0aW9ucyRyb3VuZE9mZnNldHMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRyb3VuZE9mZnNldHM7XG4gIHZhciBjb21tb25TdHlsZXMgPSB7XG4gICAgcGxhY2VtZW50OiBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCksXG4gICAgdmFyaWF0aW9uOiBnZXRWYXJpYXRpb24oc3RhdGUucGxhY2VtZW50KSxcbiAgICBwb3BwZXI6IHN0YXRlLmVsZW1lbnRzLnBvcHBlcixcbiAgICBwb3BwZXJSZWN0OiBzdGF0ZS5yZWN0cy5wb3BwZXIsXG4gICAgZ3B1QWNjZWxlcmF0aW9uOiBncHVBY2NlbGVyYXRpb24sXG4gICAgaXNGaXhlZDogc3RhdGUub3B0aW9ucy5zdHJhdGVneSA9PT0gJ2ZpeGVkJ1xuICB9O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zdHlsZXMucG9wcGVyLCBtYXBUb1N0eWxlcyhPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIHtcbiAgICAgIG9mZnNldHM6IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyxcbiAgICAgIHBvc2l0aW9uOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgYWRhcHRpdmU6IGFkYXB0aXZlLFxuICAgICAgcm91bmRPZmZzZXRzOiByb3VuZE9mZnNldHNcbiAgICB9KSkpO1xuICB9XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEuYXJyb3cgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5hcnJvdyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnN0eWxlcy5hcnJvdywgbWFwVG9TdHlsZXMoT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCB7XG4gICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93LFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBhZGFwdGl2ZTogZmFsc2UsXG4gICAgICByb3VuZE9mZnNldHM6IHJvdW5kT2Zmc2V0c1xuICAgIH0pKSk7XG4gIH1cblxuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyLCB7XG4gICAgJ2RhdGEtcG9wcGVyLXBsYWNlbWVudCc6IHN0YXRlLnBsYWNlbWVudFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2NvbXB1dGVTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ2JlZm9yZVdyaXRlJyxcbiAgZm46IGNvbXB1dGVTdHlsZXMsXG4gIGRhdGE6IHt9XG59OyIsImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRXaW5kb3cuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgcGFzc2l2ZSA9IHtcbiAgcGFzc2l2ZTogdHJ1ZVxufTtcblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRzY3JvbGwgPSBvcHRpb25zLnNjcm9sbCxcbiAgICAgIHNjcm9sbCA9IF9vcHRpb25zJHNjcm9sbCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHNjcm9sbCxcbiAgICAgIF9vcHRpb25zJHJlc2l6ZSA9IG9wdGlvbnMucmVzaXplLFxuICAgICAgcmVzaXplID0gX29wdGlvbnMkcmVzaXplID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkcmVzaXplO1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KHN0YXRlLmVsZW1lbnRzLnBvcHBlcik7XG4gIHZhciBzY3JvbGxQYXJlbnRzID0gW10uY29uY2F0KHN0YXRlLnNjcm9sbFBhcmVudHMucmVmZXJlbmNlLCBzdGF0ZS5zY3JvbGxQYXJlbnRzLnBvcHBlcik7XG5cbiAgaWYgKHNjcm9sbCkge1xuICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICBzY3JvbGxQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChyZXNpemUpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNjcm9sbCkge1xuICAgICAgc2Nyb2xsUGFyZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChzY3JvbGxQYXJlbnQpIHtcbiAgICAgICAgc2Nyb2xsUGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocmVzaXplKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICB9XG4gIH07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdldmVudExpc3RlbmVycycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnd3JpdGUnLFxuICBmbjogZnVuY3Rpb24gZm4oKSB7fSxcbiAgZWZmZWN0OiBlZmZlY3QsXG4gIGRhdGE6IHt9XG59OyIsInZhciBoYXNoID0ge1xuICBsZWZ0OiAncmlnaHQnLFxuICByaWdodDogJ2xlZnQnLFxuICBib3R0b206ICd0b3AnLFxuICB0b3A6ICdib3R0b20nXG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvbGVmdHxyaWdodHxib3R0b218dG9wL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7XG4gICAgcmV0dXJuIGhhc2hbbWF0Y2hlZF07XG4gIH0pO1xufSIsInZhciBoYXNoID0ge1xuICBzdGFydDogJ2VuZCcsXG4gIGVuZDogJ3N0YXJ0J1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL3N0YXJ0fGVuZC9nLCBmdW5jdGlvbiAobWF0Y2hlZCkge1xuICAgIHJldHVybiBoYXNoW21hdGNoZWRdO1xuICB9KTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsKG5vZGUpIHtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhub2RlKTtcbiAgdmFyIHNjcm9sbExlZnQgPSB3aW4ucGFnZVhPZmZzZXQ7XG4gIHZhciBzY3JvbGxUb3AgPSB3aW4ucGFnZVlPZmZzZXQ7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCxcbiAgICBzY3JvbGxUb3A6IHNjcm9sbFRvcFxuICB9O1xufSIsImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGwuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCkge1xuICAvLyBJZiA8aHRtbD4gaGFzIGEgQ1NTIHdpZHRoIGdyZWF0ZXIgdGhhbiB0aGUgdmlld3BvcnQsIHRoZW4gdGhpcyB3aWxsIGJlXG4gIC8vIGluY29ycmVjdCBmb3IgUlRMLlxuICAvLyBQb3BwZXIgMSBpcyBicm9rZW4gaW4gdGhpcyBjYXNlIGFuZCBuZXZlciBoYWQgYSBidWcgcmVwb3J0IHNvIGxldCdzIGFzc3VtZVxuICAvLyBpdCdzIG5vdCBhbiBpc3N1ZS4gSSBkb24ndCB0aGluayBhbnlvbmUgZXZlciBzcGVjaWZpZXMgd2lkdGggb24gPGh0bWw+XG4gIC8vIGFueXdheS5cbiAgLy8gQnJvd3NlcnMgd2hlcmUgdGhlIGxlZnQgc2Nyb2xsYmFyIGRvZXNuJ3QgY2F1c2UgYW4gaXNzdWUgcmVwb3J0IGAwYCBmb3JcbiAgLy8gdGhpcyAoZS5nLiBFZGdlIDIwMTksIElFMTEsIFNhZmFyaSlcbiAgcmV0dXJuIGdldEJvdW5kaW5nQ2xpZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpLmxlZnQgKyBnZXRXaW5kb3dTY3JvbGwoZWxlbWVudCkuc2Nyb2xsTGVmdDtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBpc0xheW91dFZpZXdwb3J0IGZyb20gXCIuL2lzTGF5b3V0Vmlld3BvcnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZpZXdwb3J0UmVjdChlbGVtZW50LCBzdHJhdGVneSkge1xuICB2YXIgd2luID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICB2YXIgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgdmFyIHZpc3VhbFZpZXdwb3J0ID0gd2luLnZpc3VhbFZpZXdwb3J0O1xuICB2YXIgd2lkdGggPSBodG1sLmNsaWVudFdpZHRoO1xuICB2YXIgaGVpZ2h0ID0gaHRtbC5jbGllbnRIZWlnaHQ7XG4gIHZhciB4ID0gMDtcbiAgdmFyIHkgPSAwO1xuXG4gIGlmICh2aXN1YWxWaWV3cG9ydCkge1xuICAgIHdpZHRoID0gdmlzdWFsVmlld3BvcnQud2lkdGg7XG4gICAgaGVpZ2h0ID0gdmlzdWFsVmlld3BvcnQuaGVpZ2h0O1xuICAgIHZhciBsYXlvdXRWaWV3cG9ydCA9IGlzTGF5b3V0Vmlld3BvcnQoKTtcblxuICAgIGlmIChsYXlvdXRWaWV3cG9ydCB8fCAhbGF5b3V0Vmlld3BvcnQgJiYgc3RyYXRlZ3kgPT09ICdmaXhlZCcpIHtcbiAgICAgIHggPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRMZWZ0O1xuICAgICAgeSA9IHZpc3VhbFZpZXdwb3J0Lm9mZnNldFRvcDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiB4ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KSxcbiAgICB5OiB5XG4gIH07XG59IiwiaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5pbXBvcnQgeyBtYXggfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiOyAvLyBHZXRzIHRoZSBlbnRpcmUgc2l6ZSBvZiB0aGUgc2Nyb2xsYWJsZSBkb2N1bWVudCBhcmVhLCBldmVuIGV4dGVuZGluZyBvdXRzaWRlXG4vLyBvZiB0aGUgYDxodG1sPmAgYW5kIGA8Ym9keT5gIHJlY3QgYm91bmRzIGlmIGhvcml6b250YWxseSBzY3JvbGxhYmxlXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERvY3VtZW50UmVjdChlbGVtZW50KSB7XG4gIHZhciBfZWxlbWVudCRvd25lckRvY3VtZW47XG5cbiAgdmFyIGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIHZhciB3aW5TY3JvbGwgPSBnZXRXaW5kb3dTY3JvbGwoZWxlbWVudCk7XG4gIHZhciBib2R5ID0gKF9lbGVtZW50JG93bmVyRG9jdW1lbiA9IGVsZW1lbnQub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lbGVtZW50JG93bmVyRG9jdW1lbi5ib2R5O1xuICB2YXIgd2lkdGggPSBtYXgoaHRtbC5zY3JvbGxXaWR0aCwgaHRtbC5jbGllbnRXaWR0aCwgYm9keSA/IGJvZHkuc2Nyb2xsV2lkdGggOiAwLCBib2R5ID8gYm9keS5jbGllbnRXaWR0aCA6IDApO1xuICB2YXIgaGVpZ2h0ID0gbWF4KGh0bWwuc2Nyb2xsSGVpZ2h0LCBodG1sLmNsaWVudEhlaWdodCwgYm9keSA/IGJvZHkuc2Nyb2xsSGVpZ2h0IDogMCwgYm9keSA/IGJvZHkuY2xpZW50SGVpZ2h0IDogMCk7XG4gIHZhciB4ID0gLXdpblNjcm9sbC5zY3JvbGxMZWZ0ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KTtcbiAgdmFyIHkgPSAtd2luU2Nyb2xsLnNjcm9sbFRvcDtcblxuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShib2R5IHx8IGh0bWwpLmRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICB4ICs9IG1heChodG1sLmNsaWVudFdpZHRoLCBib2R5ID8gYm9keS5jbGllbnRXaWR0aCA6IDApIC0gd2lkdGg7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1Njcm9sbFBhcmVudChlbGVtZW50KSB7XG4gIC8vIEZpcmVmb3ggd2FudHMgdXMgdG8gY2hlY2sgYC14YCBhbmQgYC15YCB2YXJpYXRpb25zIGFzIHdlbGxcbiAgdmFyIF9nZXRDb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KSxcbiAgICAgIG92ZXJmbG93ID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3csXG4gICAgICBvdmVyZmxvd1ggPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvd1gsXG4gICAgICBvdmVyZmxvd1kgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvd1k7XG5cbiAgcmV0dXJuIC9hdXRvfHNjcm9sbHxvdmVybGF5fGhpZGRlbi8udGVzdChvdmVyZmxvdyArIG92ZXJmbG93WSArIG92ZXJmbG93WCk7XG59IiwiaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTY3JvbGxQYXJlbnQobm9kZSkge1xuICBpZiAoWydodG1sJywgJ2JvZHknLCAnI2RvY3VtZW50J10uaW5kZXhPZihnZXROb2RlTmFtZShub2RlKSkgPj0gMCkge1xuICAgIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGFzc3VtZSBib2R5IGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50LmJvZHk7XG4gIH1cblxuICBpZiAoaXNIVE1MRWxlbWVudChub2RlKSAmJiBpc1Njcm9sbFBhcmVudChub2RlKSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgcmV0dXJuIGdldFNjcm9sbFBhcmVudChnZXRQYXJlbnROb2RlKG5vZGUpKTtcbn0iLCJpbXBvcnQgZ2V0U2Nyb2xsUGFyZW50IGZyb20gXCIuL2dldFNjcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuLypcbmdpdmVuIGEgRE9NIGVsZW1lbnQsIHJldHVybiB0aGUgbGlzdCBvZiBhbGwgc2Nyb2xsIHBhcmVudHMsIHVwIHRoZSBsaXN0IG9mIGFuY2Vzb3JzXG51bnRpbCB3ZSBnZXQgdG8gdGhlIHRvcCB3aW5kb3cgb2JqZWN0LiBUaGlzIGxpc3QgaXMgd2hhdCB3ZSBhdHRhY2ggc2Nyb2xsIGxpc3RlbmVyc1xudG8sIGJlY2F1c2UgaWYgYW55IG9mIHRoZXNlIHBhcmVudCBlbGVtZW50cyBzY3JvbGwsIHdlJ2xsIG5lZWQgdG8gcmUtY2FsY3VsYXRlIHRoZVxucmVmZXJlbmNlIGVsZW1lbnQncyBwb3NpdGlvbi5cbiovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpc3RTY3JvbGxQYXJlbnRzKGVsZW1lbnQsIGxpc3QpIHtcbiAgdmFyIF9lbGVtZW50JG93bmVyRG9jdW1lbjtcblxuICBpZiAobGlzdCA9PT0gdm9pZCAwKSB7XG4gICAgbGlzdCA9IFtdO1xuICB9XG5cbiAgdmFyIHNjcm9sbFBhcmVudCA9IGdldFNjcm9sbFBhcmVudChlbGVtZW50KTtcbiAgdmFyIGlzQm9keSA9IHNjcm9sbFBhcmVudCA9PT0gKChfZWxlbWVudCRvd25lckRvY3VtZW4gPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZWxlbWVudCRvd25lckRvY3VtZW4uYm9keSk7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3coc2Nyb2xsUGFyZW50KTtcbiAgdmFyIHRhcmdldCA9IGlzQm9keSA/IFt3aW5dLmNvbmNhdCh3aW4udmlzdWFsVmlld3BvcnQgfHwgW10sIGlzU2Nyb2xsUGFyZW50KHNjcm9sbFBhcmVudCkgPyBzY3JvbGxQYXJlbnQgOiBbXSkgOiBzY3JvbGxQYXJlbnQ7XG4gIHZhciB1cGRhdGVkTGlzdCA9IGxpc3QuY29uY2F0KHRhcmdldCk7XG4gIHJldHVybiBpc0JvZHkgPyB1cGRhdGVkTGlzdCA6IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLWNhbGxdOiBpc0JvZHkgdGVsbHMgdXMgdGFyZ2V0IHdpbGwgYmUgYW4gSFRNTEVsZW1lbnQgaGVyZVxuICB1cGRhdGVkTGlzdC5jb25jYXQobGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZSh0YXJnZXQpKSk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVjdFRvQ2xpZW50UmVjdChyZWN0KSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCByZWN0LCB7XG4gICAgbGVmdDogcmVjdC54LFxuICAgIHRvcDogcmVjdC55LFxuICAgIHJpZ2h0OiByZWN0LnggKyByZWN0LndpZHRoLFxuICAgIGJvdHRvbTogcmVjdC55ICsgcmVjdC5oZWlnaHRcbiAgfSk7XG59IiwiaW1wb3J0IHsgdmlld3BvcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRWaWV3cG9ydFJlY3QgZnJvbSBcIi4vZ2V0Vmlld3BvcnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRSZWN0IGZyb20gXCIuL2dldERvY3VtZW50UmVjdC5qc1wiO1xuaW1wb3J0IGxpc3RTY3JvbGxQYXJlbnRzIGZyb20gXCIuL2xpc3RTY3JvbGxQYXJlbnRzLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCB7IGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcIi4vY29udGFpbnMuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHJlY3RUb0NsaWVudFJlY3QgZnJvbSBcIi4uL3V0aWxzL3JlY3RUb0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCB7IG1heCwgbWluIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpIHtcbiAgdmFyIHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgZmFsc2UsIHN0cmF0ZWd5ID09PSAnZml4ZWQnKTtcbiAgcmVjdC50b3AgPSByZWN0LnRvcCArIGVsZW1lbnQuY2xpZW50VG9wO1xuICByZWN0LmxlZnQgPSByZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudExlZnQ7XG4gIHJlY3QuYm90dG9tID0gcmVjdC50b3AgKyBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgcmVjdC5yaWdodCA9IHJlY3QubGVmdCArIGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIHJlY3Qud2lkdGggPSBlbGVtZW50LmNsaWVudFdpZHRoO1xuICByZWN0LmhlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICByZWN0LnggPSByZWN0LmxlZnQ7XG4gIHJlY3QueSA9IHJlY3QudG9wO1xuICByZXR1cm4gcmVjdDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgY2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KSB7XG4gIHJldHVybiBjbGlwcGluZ1BhcmVudCA9PT0gdmlld3BvcnQgPyByZWN0VG9DbGllbnRSZWN0KGdldFZpZXdwb3J0UmVjdChlbGVtZW50LCBzdHJhdGVneSkpIDogaXNFbGVtZW50KGNsaXBwaW5nUGFyZW50KSA/IGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGNsaXBwaW5nUGFyZW50LCBzdHJhdGVneSkgOiByZWN0VG9DbGllbnRSZWN0KGdldERvY3VtZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpKTtcbn0gLy8gQSBcImNsaXBwaW5nIHBhcmVudFwiIGlzIGFuIG92ZXJmbG93YWJsZSBjb250YWluZXIgd2l0aCB0aGUgY2hhcmFjdGVyaXN0aWMgb2Zcbi8vIGNsaXBwaW5nIChvciBoaWRpbmcpIG92ZXJmbG93aW5nIGVsZW1lbnRzIHdpdGggYSBwb3NpdGlvbiBkaWZmZXJlbnQgZnJvbVxuLy8gYGluaXRpYWxgXG5cblxuZnVuY3Rpb24gZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsZW1lbnQpIHtcbiAgdmFyIGNsaXBwaW5nUGFyZW50cyA9IGxpc3RTY3JvbGxQYXJlbnRzKGdldFBhcmVudE5vZGUoZWxlbWVudCkpO1xuICB2YXIgY2FuRXNjYXBlQ2xpcHBpbmcgPSBbJ2Fic29sdXRlJywgJ2ZpeGVkJ10uaW5kZXhPZihnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uKSA+PSAwO1xuICB2YXIgY2xpcHBlckVsZW1lbnQgPSBjYW5Fc2NhcGVDbGlwcGluZyAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpID8gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIDogZWxlbWVudDtcblxuICBpZiAoIWlzRWxlbWVudChjbGlwcGVyRWxlbWVudCkpIHtcbiAgICByZXR1cm4gW107XG4gIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzE0MTRcblxuXG4gIHJldHVybiBjbGlwcGluZ1BhcmVudHMuZmlsdGVyKGZ1bmN0aW9uIChjbGlwcGluZ1BhcmVudCkge1xuICAgIHJldHVybiBpc0VsZW1lbnQoY2xpcHBpbmdQYXJlbnQpICYmIGNvbnRhaW5zKGNsaXBwaW5nUGFyZW50LCBjbGlwcGVyRWxlbWVudCkgJiYgZ2V0Tm9kZU5hbWUoY2xpcHBpbmdQYXJlbnQpICE9PSAnYm9keSc7XG4gIH0pO1xufSAvLyBHZXRzIHRoZSBtYXhpbXVtIGFyZWEgdGhhdCB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIGluIGR1ZSB0byBhbnkgbnVtYmVyIG9mXG4vLyBjbGlwcGluZyBwYXJlbnRzXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q2xpcHBpbmdSZWN0KGVsZW1lbnQsIGJvdW5kYXJ5LCByb290Qm91bmRhcnksIHN0cmF0ZWd5KSB7XG4gIHZhciBtYWluQ2xpcHBpbmdQYXJlbnRzID0gYm91bmRhcnkgPT09ICdjbGlwcGluZ1BhcmVudHMnID8gZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsZW1lbnQpIDogW10uY29uY2F0KGJvdW5kYXJ5KTtcbiAgdmFyIGNsaXBwaW5nUGFyZW50cyA9IFtdLmNvbmNhdChtYWluQ2xpcHBpbmdQYXJlbnRzLCBbcm9vdEJvdW5kYXJ5XSk7XG4gIHZhciBmaXJzdENsaXBwaW5nUGFyZW50ID0gY2xpcHBpbmdQYXJlbnRzWzBdO1xuICB2YXIgY2xpcHBpbmdSZWN0ID0gY2xpcHBpbmdQYXJlbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjUmVjdCwgY2xpcHBpbmdQYXJlbnQpIHtcbiAgICB2YXIgcmVjdCA9IGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGNsaXBwaW5nUGFyZW50LCBzdHJhdGVneSk7XG4gICAgYWNjUmVjdC50b3AgPSBtYXgocmVjdC50b3AsIGFjY1JlY3QudG9wKTtcbiAgICBhY2NSZWN0LnJpZ2h0ID0gbWluKHJlY3QucmlnaHQsIGFjY1JlY3QucmlnaHQpO1xuICAgIGFjY1JlY3QuYm90dG9tID0gbWluKHJlY3QuYm90dG9tLCBhY2NSZWN0LmJvdHRvbSk7XG4gICAgYWNjUmVjdC5sZWZ0ID0gbWF4KHJlY3QubGVmdCwgYWNjUmVjdC5sZWZ0KTtcbiAgICByZXR1cm4gYWNjUmVjdDtcbiAgfSwgZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgZmlyc3RDbGlwcGluZ1BhcmVudCwgc3RyYXRlZ3kpKTtcbiAgY2xpcHBpbmdSZWN0LndpZHRoID0gY2xpcHBpbmdSZWN0LnJpZ2h0IC0gY2xpcHBpbmdSZWN0LmxlZnQ7XG4gIGNsaXBwaW5nUmVjdC5oZWlnaHQgPSBjbGlwcGluZ1JlY3QuYm90dG9tIC0gY2xpcHBpbmdSZWN0LnRvcDtcbiAgY2xpcHBpbmdSZWN0LnggPSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LnkgPSBjbGlwcGluZ1JlY3QudG9wO1xuICByZXR1cm4gY2xpcHBpbmdSZWN0O1xufSIsImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4vZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCBzdGFydCwgZW5kIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciByZWZlcmVuY2UgPSBfcmVmLnJlZmVyZW5jZSxcbiAgICAgIGVsZW1lbnQgPSBfcmVmLmVsZW1lbnQsXG4gICAgICBwbGFjZW1lbnQgPSBfcmVmLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBwbGFjZW1lbnQgPyBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgdmFyaWF0aW9uID0gcGxhY2VtZW50ID8gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgY29tbW9uWCA9IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoIC8gMiAtIGVsZW1lbnQud2lkdGggLyAyO1xuICB2YXIgY29tbW9uWSA9IHJlZmVyZW5jZS55ICsgcmVmZXJlbmNlLmhlaWdodCAvIDIgLSBlbGVtZW50LmhlaWdodCAvIDI7XG4gIHZhciBvZmZzZXRzO1xuXG4gIHN3aXRjaCAoYmFzZVBsYWNlbWVudCkge1xuICAgIGNhc2UgdG9wOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgLSBlbGVtZW50LmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBib3R0b206XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgcmlnaHQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBsZWZ0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggLSBlbGVtZW50LndpZHRoLFxuICAgICAgICB5OiBjb21tb25ZXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLngsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55XG4gICAgICB9O1xuICB9XG5cbiAgdmFyIG1haW5BeGlzID0gYmFzZVBsYWNlbWVudCA/IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KSA6IG51bGw7XG5cbiAgaWYgKG1haW5BeGlzICE9IG51bGwpIHtcbiAgICB2YXIgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHN3aXRjaCAodmFyaWF0aW9uKSB7XG4gICAgICBjYXNlIHN0YXJ0OlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9IG9mZnNldHNbbWFpbkF4aXNdIC0gKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBlbmQ6XG4gICAgICAgIG9mZnNldHNbbWFpbkF4aXNdID0gb2Zmc2V0c1ttYWluQXhpc10gKyAocmVmZXJlbmNlW2xlbl0gLyAyIC0gZWxlbWVudFtsZW5dIC8gMik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvZmZzZXRzO1xufSIsImltcG9ydCBnZXRDbGlwcGluZ1JlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRDbGlwcGluZ1JlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBjb21wdXRlT2Zmc2V0cyBmcm9tIFwiLi9jb21wdXRlT2Zmc2V0cy5qc1wiO1xuaW1wb3J0IHJlY3RUb0NsaWVudFJlY3QgZnJvbSBcIi4vcmVjdFRvQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IHsgY2xpcHBpbmdQYXJlbnRzLCByZWZlcmVuY2UsIHBvcHBlciwgYm90dG9tLCB0b3AsIHJpZ2h0LCBiYXNlUGxhY2VtZW50cywgdmlld3BvcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gXCIuLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IG1lcmdlUGFkZGluZ09iamVjdCBmcm9tIFwiLi9tZXJnZVBhZGRpbmdPYmplY3QuanNcIjtcbmltcG9ydCBleHBhbmRUb0hhc2hNYXAgZnJvbSBcIi4vZXhwYW5kVG9IYXNoTWFwLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICBfb3B0aW9ucyRwbGFjZW1lbnQgPSBfb3B0aW9ucy5wbGFjZW1lbnQsXG4gICAgICBwbGFjZW1lbnQgPSBfb3B0aW9ucyRwbGFjZW1lbnQgPT09IHZvaWQgMCA/IHN0YXRlLnBsYWNlbWVudCA6IF9vcHRpb25zJHBsYWNlbWVudCxcbiAgICAgIF9vcHRpb25zJHN0cmF0ZWd5ID0gX29wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICBzdHJhdGVneSA9IF9vcHRpb25zJHN0cmF0ZWd5ID09PSB2b2lkIDAgPyBzdGF0ZS5zdHJhdGVneSA6IF9vcHRpb25zJHN0cmF0ZWd5LFxuICAgICAgX29wdGlvbnMkYm91bmRhcnkgPSBfb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIGJvdW5kYXJ5ID0gX29wdGlvbnMkYm91bmRhcnkgPT09IHZvaWQgMCA/IGNsaXBwaW5nUGFyZW50cyA6IF9vcHRpb25zJGJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkcm9vdEJvdW5kYXJ5ID0gX29wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gX29wdGlvbnMkcm9vdEJvdW5kYXJ5ID09PSB2b2lkIDAgPyB2aWV3cG9ydCA6IF9vcHRpb25zJHJvb3RCb3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJGVsZW1lbnRDb250ZSA9IF9vcHRpb25zLmVsZW1lbnRDb250ZXh0LFxuICAgICAgZWxlbWVudENvbnRleHQgPSBfb3B0aW9ucyRlbGVtZW50Q29udGUgPT09IHZvaWQgMCA/IHBvcHBlciA6IF9vcHRpb25zJGVsZW1lbnRDb250ZSxcbiAgICAgIF9vcHRpb25zJGFsdEJvdW5kYXJ5ID0gX29wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IF9vcHRpb25zJGFsdEJvdW5kYXJ5ID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJGFsdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkcGFkZGluZyA9IF9vcHRpb25zLnBhZGRpbmcsXG4gICAgICBwYWRkaW5nID0gX29wdGlvbnMkcGFkZGluZyA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJHBhZGRpbmc7XG4gIHZhciBwYWRkaW5nT2JqZWN0ID0gbWVyZ2VQYWRkaW5nT2JqZWN0KHR5cGVvZiBwYWRkaW5nICE9PSAnbnVtYmVyJyA/IHBhZGRpbmcgOiBleHBhbmRUb0hhc2hNYXAocGFkZGluZywgYmFzZVBsYWNlbWVudHMpKTtcbiAgdmFyIGFsdENvbnRleHQgPSBlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyID8gcmVmZXJlbmNlIDogcG9wcGVyO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1thbHRCb3VuZGFyeSA/IGFsdENvbnRleHQgOiBlbGVtZW50Q29udGV4dF07XG4gIHZhciBjbGlwcGluZ0NsaWVudFJlY3QgPSBnZXRDbGlwcGluZ1JlY3QoaXNFbGVtZW50KGVsZW1lbnQpID8gZWxlbWVudCA6IGVsZW1lbnQuY29udGV4dEVsZW1lbnQgfHwgZ2V0RG9jdW1lbnRFbGVtZW50KHN0YXRlLmVsZW1lbnRzLnBvcHBlciksIGJvdW5kYXJ5LCByb290Qm91bmRhcnksIHN0cmF0ZWd5KTtcbiAgdmFyIHJlZmVyZW5jZUNsaWVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qoc3RhdGUuZWxlbWVudHMucmVmZXJlbmNlKTtcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBjb21wdXRlT2Zmc2V0cyh7XG4gICAgcmVmZXJlbmNlOiByZWZlcmVuY2VDbGllbnRSZWN0LFxuICAgIGVsZW1lbnQ6IHBvcHBlclJlY3QsXG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZScsXG4gICAgcGxhY2VtZW50OiBwbGFjZW1lbnRcbiAgfSk7XG4gIHZhciBwb3BwZXJDbGllbnRSZWN0ID0gcmVjdFRvQ2xpZW50UmVjdChPYmplY3QuYXNzaWduKHt9LCBwb3BwZXJSZWN0LCBwb3BwZXJPZmZzZXRzKSk7XG4gIHZhciBlbGVtZW50Q2xpZW50UmVjdCA9IGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgPyBwb3BwZXJDbGllbnRSZWN0IDogcmVmZXJlbmNlQ2xpZW50UmVjdDsgLy8gcG9zaXRpdmUgPSBvdmVyZmxvd2luZyB0aGUgY2xpcHBpbmcgcmVjdFxuICAvLyAwIG9yIG5lZ2F0aXZlID0gd2l0aGluIHRoZSBjbGlwcGluZyByZWN0XG5cbiAgdmFyIG92ZXJmbG93T2Zmc2V0cyA9IHtcbiAgICB0b3A6IGNsaXBwaW5nQ2xpZW50UmVjdC50b3AgLSBlbGVtZW50Q2xpZW50UmVjdC50b3AgKyBwYWRkaW5nT2JqZWN0LnRvcCxcbiAgICBib3R0b206IGVsZW1lbnRDbGllbnRSZWN0LmJvdHRvbSAtIGNsaXBwaW5nQ2xpZW50UmVjdC5ib3R0b20gKyBwYWRkaW5nT2JqZWN0LmJvdHRvbSxcbiAgICBsZWZ0OiBjbGlwcGluZ0NsaWVudFJlY3QubGVmdCAtIGVsZW1lbnRDbGllbnRSZWN0LmxlZnQgKyBwYWRkaW5nT2JqZWN0LmxlZnQsXG4gICAgcmlnaHQ6IGVsZW1lbnRDbGllbnRSZWN0LnJpZ2h0IC0gY2xpcHBpbmdDbGllbnRSZWN0LnJpZ2h0ICsgcGFkZGluZ09iamVjdC5yaWdodFxuICB9O1xuICB2YXIgb2Zmc2V0RGF0YSA9IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0OyAvLyBPZmZzZXRzIGNhbiBiZSBhcHBsaWVkIG9ubHkgdG8gdGhlIHBvcHBlciBlbGVtZW50XG5cbiAgaWYgKGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgJiYgb2Zmc2V0RGF0YSkge1xuICAgIHZhciBvZmZzZXQgPSBvZmZzZXREYXRhW3BsYWNlbWVudF07XG4gICAgT2JqZWN0LmtleXMob3ZlcmZsb3dPZmZzZXRzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBtdWx0aXBseSA9IFtyaWdodCwgYm90dG9tXS5pbmRleE9mKGtleSkgPj0gMCA/IDEgOiAtMTtcbiAgICAgIHZhciBheGlzID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKGtleSkgPj0gMCA/ICd5JyA6ICd4JztcbiAgICAgIG92ZXJmbG93T2Zmc2V0c1trZXldICs9IG9mZnNldFtheGlzXSAqIG11bHRpcGx5O1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG92ZXJmbG93T2Zmc2V0cztcbn0iLCJpbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IHsgdmFyaWF0aW9uUGxhY2VtZW50cywgYmFzZVBsYWNlbWVudHMsIHBsYWNlbWVudHMgYXMgYWxsUGxhY2VtZW50cyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIHBsYWNlbWVudCA9IF9vcHRpb25zLnBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5ID0gX29wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBfb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gX29wdGlvbnMucGFkZGluZyxcbiAgICAgIGZsaXBWYXJpYXRpb25zID0gX29wdGlvbnMuZmxpcFZhcmlhdGlvbnMsXG4gICAgICBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPSBfb3B0aW9ucy5hbGxvd2VkQXV0b1BsYWNlbWVudHMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPT09IHZvaWQgMCA/IGFsbFBsYWNlbWVudHMgOiBfb3B0aW9ucyRhbGxvd2VkQXV0b1A7XG4gIHZhciB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24ocGxhY2VtZW50KTtcbiAgdmFyIHBsYWNlbWVudHMgPSB2YXJpYXRpb24gPyBmbGlwVmFyaWF0aW9ucyA/IHZhcmlhdGlvblBsYWNlbWVudHMgOiB2YXJpYXRpb25QbGFjZW1lbnRzLmZpbHRlcihmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGdldFZhcmlhdGlvbihwbGFjZW1lbnQpID09PSB2YXJpYXRpb247XG4gIH0pIDogYmFzZVBsYWNlbWVudHM7XG4gIHZhciBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWxsb3dlZEF1dG9QbGFjZW1lbnRzLmluZGV4T2YocGxhY2VtZW50KSA+PSAwO1xuICB9KTtcblxuICBpZiAoYWxsb3dlZFBsYWNlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgYWxsb3dlZFBsYWNlbWVudHMgPSBwbGFjZW1lbnRzO1xuICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXR5cGVdOiBGbG93IHNlZW1zIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCB0d28gYXJyYXkgdW5pb25zLi4uXG5cblxuICB2YXIgb3ZlcmZsb3dzID0gYWxsb3dlZFBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIGFjY1twbGFjZW1lbnRdID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nXG4gICAgfSlbZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpXTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvdmVyZmxvd3MpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gb3ZlcmZsb3dzW2FdIC0gb3ZlcmZsb3dzW2JdO1xuICB9KTtcbn0iLCJpbXBvcnQgZ2V0T3Bwb3NpdGVQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE9wcG9zaXRlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGNvbXB1dGVBdXRvUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9jb21wdXRlQXV0b1BsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgYm90dG9tLCB0b3AsIHN0YXJ0LCByaWdodCwgbGVmdCwgYXV0byB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZnVuY3Rpb24gZ2V0RXhwYW5kZWRGYWxsYmFja1BsYWNlbWVudHMocGxhY2VtZW50KSB7XG4gIGlmIChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgb3Bwb3NpdGVQbGFjZW1lbnQgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICByZXR1cm4gW2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCksIG9wcG9zaXRlUGxhY2VtZW50LCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChvcHBvc2l0ZVBsYWNlbWVudCldO1xufVxuXG5mdW5jdGlvbiBmbGlwKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdLl9za2lwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIF9vcHRpb25zJG1haW5BeGlzID0gb3B0aW9ucy5tYWluQXhpcyxcbiAgICAgIGNoZWNrTWFpbkF4aXMgPSBfb3B0aW9ucyRtYWluQXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJG1haW5BeGlzLFxuICAgICAgX29wdGlvbnMkYWx0QXhpcyA9IG9wdGlvbnMuYWx0QXhpcyxcbiAgICAgIGNoZWNrQWx0QXhpcyA9IF9vcHRpb25zJGFsdEF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgc3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzID0gb3B0aW9ucy5mYWxsYmFja1BsYWNlbWVudHMsXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPSBvcHRpb25zLmZsaXBWYXJpYXRpb25zLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRmbGlwVmFyaWF0aW8sXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBvcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cztcbiAgdmFyIHByZWZlcnJlZFBsYWNlbWVudCA9IHN0YXRlLm9wdGlvbnMucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9IGJhc2VQbGFjZW1lbnQgPT09IHByZWZlcnJlZFBsYWNlbWVudDtcbiAgdmFyIGZhbGxiYWNrUGxhY2VtZW50cyA9IHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyB8fCAoaXNCYXNlUGxhY2VtZW50IHx8ICFmbGlwVmFyaWF0aW9ucyA/IFtnZXRPcHBvc2l0ZVBsYWNlbWVudChwcmVmZXJyZWRQbGFjZW1lbnQpXSA6IGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHByZWZlcnJlZFBsYWNlbWVudCkpO1xuICB2YXIgcGxhY2VtZW50cyA9IFtwcmVmZXJyZWRQbGFjZW1lbnRdLmNvbmNhdChmYWxsYmFja1BsYWNlbWVudHMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8gPyBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgICBmbGlwVmFyaWF0aW9uczogZmxpcFZhcmlhdGlvbnMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IGFsbG93ZWRBdXRvUGxhY2VtZW50c1xuICAgIH0pIDogcGxhY2VtZW50KTtcbiAgfSwgW10pO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBjaGVja3NNYXAgPSBuZXcgTWFwKCk7XG4gIHZhciBtYWtlRmFsbGJhY2tDaGVja3MgPSB0cnVlO1xuICB2YXIgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50c1swXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBsYWNlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGxhY2VtZW50ID0gcGxhY2VtZW50c1tpXTtcblxuICAgIHZhciBfYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcblxuICAgIHZhciBpc1N0YXJ0VmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHN0YXJ0O1xuICAgIHZhciBpc1ZlcnRpY2FsID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKF9iYXNlUGxhY2VtZW50KSA+PSAwO1xuICAgIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgIHZhciBvdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnk6IGFsdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZ1xuICAgIH0pO1xuICAgIHZhciBtYWluVmFyaWF0aW9uU2lkZSA9IGlzVmVydGljYWwgPyBpc1N0YXJ0VmFyaWF0aW9uID8gcmlnaHQgOiBsZWZ0IDogaXNTdGFydFZhcmlhdGlvbiA/IGJvdHRvbSA6IHRvcDtcblxuICAgIGlmIChyZWZlcmVuY2VSZWN0W2xlbl0gPiBwb3BwZXJSZWN0W2xlbl0pIHtcbiAgICAgIG1haW5WYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIH1cblxuICAgIHZhciBhbHRWYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIHZhciBjaGVja3MgPSBbXTtcblxuICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICBjaGVja3MucHVzaChvdmVyZmxvd1tfYmFzZVBsYWNlbWVudF0gPD0gMCk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbbWFpblZhcmlhdGlvblNpZGVdIDw9IDAsIG92ZXJmbG93W2FsdFZhcmlhdGlvblNpZGVdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja3MuZXZlcnkoZnVuY3Rpb24gKGNoZWNrKSB7XG4gICAgICByZXR1cm4gY2hlY2s7XG4gICAgfSkpIHtcbiAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgICAgIG1ha2VGYWxsYmFja0NoZWNrcyA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2hlY2tzTWFwLnNldChwbGFjZW1lbnQsIGNoZWNrcyk7XG4gIH1cblxuICBpZiAobWFrZUZhbGxiYWNrQ2hlY2tzKSB7XG4gICAgLy8gYDJgIG1heSBiZSBkZXNpcmVkIGluIHNvbWUgY2FzZXMg4oCTIHJlc2VhcmNoIGxhdGVyXG4gICAgdmFyIG51bWJlck9mQ2hlY2tzID0gZmxpcFZhcmlhdGlvbnMgPyAzIDogMTtcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKF9pKSB7XG4gICAgICB2YXIgZml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHMuZmluZChmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgICAgIHZhciBjaGVja3MgPSBjaGVja3NNYXAuZ2V0KHBsYWNlbWVudCk7XG5cbiAgICAgICAgaWYgKGNoZWNrcykge1xuICAgICAgICAgIHJldHVybiBjaGVja3Muc2xpY2UoMCwgX2kpLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgICAgICAgcmV0dXJuIGNoZWNrO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGZpdHRpbmdQbGFjZW1lbnQpIHtcbiAgICAgICAgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gZml0dGluZ1BsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgX2kgPSBudW1iZXJPZkNoZWNrczsgX2kgPiAwOyBfaS0tKSB7XG4gICAgICB2YXIgX3JldCA9IF9sb29wKF9pKTtcblxuICAgICAgaWYgKF9yZXQgPT09IFwiYnJlYWtcIikgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnBsYWNlbWVudCAhPT0gZmlyc3RGaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCA9IHRydWU7XG4gICAgc3RhdGUucGxhY2VtZW50ID0gZmlyc3RGaXR0aW5nUGxhY2VtZW50O1xuICAgIHN0YXRlLnJlc2V0ID0gdHJ1ZTtcbiAgfVxufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZmxpcCcsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBmbGlwLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ29mZnNldCddLFxuICBkYXRhOiB7XG4gICAgX3NraXA6IGZhbHNlXG4gIH1cbn07IiwiaW1wb3J0IHsgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5cbmZ1bmN0aW9uIGdldFNpZGVPZmZzZXRzKG92ZXJmbG93LCByZWN0LCBwcmV2ZW50ZWRPZmZzZXRzKSB7XG4gIGlmIChwcmV2ZW50ZWRPZmZzZXRzID09PSB2b2lkIDApIHtcbiAgICBwcmV2ZW50ZWRPZmZzZXRzID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0b3A6IG92ZXJmbG93LnRvcCAtIHJlY3QuaGVpZ2h0IC0gcHJldmVudGVkT2Zmc2V0cy55LFxuICAgIHJpZ2h0OiBvdmVyZmxvdy5yaWdodCAtIHJlY3Qud2lkdGggKyBwcmV2ZW50ZWRPZmZzZXRzLngsXG4gICAgYm90dG9tOiBvdmVyZmxvdy5ib3R0b20gLSByZWN0LmhlaWdodCArIHByZXZlbnRlZE9mZnNldHMueSxcbiAgICBsZWZ0OiBvdmVyZmxvdy5sZWZ0IC0gcmVjdC53aWR0aCAtIHByZXZlbnRlZE9mZnNldHMueFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0FueVNpZGVGdWxseUNsaXBwZWQob3ZlcmZsb3cpIHtcbiAgcmV0dXJuIFt0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnRdLnNvbWUoZnVuY3Rpb24gKHNpZGUpIHtcbiAgICByZXR1cm4gb3ZlcmZsb3dbc2lkZV0gPj0gMDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGhpZGUoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgcHJldmVudGVkT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucHJldmVudE92ZXJmbG93O1xuICB2YXIgcmVmZXJlbmNlT3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGVsZW1lbnRDb250ZXh0OiAncmVmZXJlbmNlJ1xuICB9KTtcbiAgdmFyIHBvcHBlckFsdE92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBhbHRCb3VuZGFyeTogdHJ1ZVxuICB9KTtcbiAgdmFyIHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKHJlZmVyZW5jZU92ZXJmbG93LCByZWZlcmVuY2VSZWN0KTtcbiAgdmFyIHBvcHBlckVzY2FwZU9mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhwb3BwZXJBbHRPdmVyZmxvdywgcG9wcGVyUmVjdCwgcHJldmVudGVkT2Zmc2V0cyk7XG4gIHZhciBpc1JlZmVyZW5jZUhpZGRlbiA9IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChyZWZlcmVuY2VDbGlwcGluZ09mZnNldHMpO1xuICB2YXIgaGFzUG9wcGVyRXNjYXBlZCA9IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChwb3BwZXJFc2NhcGVPZmZzZXRzKTtcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IHtcbiAgICByZWZlcmVuY2VDbGlwcGluZ09mZnNldHM6IHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyxcbiAgICBwb3BwZXJFc2NhcGVPZmZzZXRzOiBwb3BwZXJFc2NhcGVPZmZzZXRzLFxuICAgIGlzUmVmZXJlbmNlSGlkZGVuOiBpc1JlZmVyZW5jZUhpZGRlbixcbiAgICBoYXNQb3BwZXJFc2NhcGVkOiBoYXNQb3BwZXJFc2NhcGVkXG4gIH07XG4gIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIsIHtcbiAgICAnZGF0YS1wb3BwZXItcmVmZXJlbmNlLWhpZGRlbic6IGlzUmVmZXJlbmNlSGlkZGVuLFxuICAgICdkYXRhLXBvcHBlci1lc2NhcGVkJzogaGFzUG9wcGVyRXNjYXBlZFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2hpZGUnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ3ByZXZlbnRPdmVyZmxvdyddLFxuICBmbjogaGlkZVxufTsiLCJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgcGxhY2VtZW50cyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHJlY3RzLCBvZmZzZXQpIHtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHZhciBpbnZlcnREaXN0YW5jZSA9IFtsZWZ0LCB0b3BdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMCA/IC0xIDogMTtcblxuICB2YXIgX3JlZiA9IHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbicgPyBvZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgcmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICB9KSkgOiBvZmZzZXQsXG4gICAgICBza2lkZGluZyA9IF9yZWZbMF0sXG4gICAgICBkaXN0YW5jZSA9IF9yZWZbMV07XG5cbiAgc2tpZGRpbmcgPSBza2lkZGluZyB8fCAwO1xuICBkaXN0YW5jZSA9IChkaXN0YW5jZSB8fCAwKSAqIGludmVydERpc3RhbmNlO1xuICByZXR1cm4gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDAgPyB7XG4gICAgeDogZGlzdGFuY2UsXG4gICAgeTogc2tpZGRpbmdcbiAgfSA6IHtcbiAgICB4OiBza2lkZGluZyxcbiAgICB5OiBkaXN0YW5jZVxuICB9O1xufVxuXG5mdW5jdGlvbiBvZmZzZXQoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjIub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmMi5uYW1lO1xuICB2YXIgX29wdGlvbnMkb2Zmc2V0ID0gb3B0aW9ucy5vZmZzZXQsXG4gICAgICBvZmZzZXQgPSBfb3B0aW9ucyRvZmZzZXQgPT09IHZvaWQgMCA/IFswLCAwXSA6IF9vcHRpb25zJG9mZnNldDtcbiAgdmFyIGRhdGEgPSBwbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICBhY2NbcGxhY2VtZW50XSA9IGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKHBsYWNlbWVudCwgc3RhdGUucmVjdHMsIG9mZnNldCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICB2YXIgX2RhdGEkc3RhdGUkcGxhY2VtZW50ID0gZGF0YVtzdGF0ZS5wbGFjZW1lbnRdLFxuICAgICAgeCA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC54LFxuICAgICAgeSA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC55O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy54ICs9IHg7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLnkgKz0geTtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnb2Zmc2V0JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICBmbjogb2Zmc2V0XG59OyIsImltcG9ydCBjb21wdXRlT2Zmc2V0cyBmcm9tIFwiLi4vdXRpbHMvY29tcHV0ZU9mZnNldHMuanNcIjtcblxuZnVuY3Rpb24gcG9wcGVyT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICAvLyBPZmZzZXRzIGFyZSB0aGUgYWN0dWFsIHBvc2l0aW9uIHRoZSBwb3BwZXIgbmVlZHMgdG8gaGF2ZSB0byBiZVxuICAvLyBwcm9wZXJseSBwb3NpdGlvbmVkIG5lYXIgaXRzIHJlZmVyZW5jZSBlbGVtZW50XG4gIC8vIFRoaXMgaXMgdGhlIG1vc3QgYmFzaWMgcGxhY2VtZW50LCBhbmQgd2lsbCBiZSBhZGp1c3RlZCBieVxuICAvLyB0aGUgbW9kaWZpZXJzIGluIHRoZSBuZXh0IHN0ZXBcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGNvbXB1dGVPZmZzZXRzKHtcbiAgICByZWZlcmVuY2U6IHN0YXRlLnJlY3RzLnJlZmVyZW5jZSxcbiAgICBlbGVtZW50OiBzdGF0ZS5yZWN0cy5wb3BwZXIsXG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZScsXG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdwb3BwZXJPZmZzZXRzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdyZWFkJyxcbiAgZm46IHBvcHBlck9mZnNldHMsXG4gIGRhdGE6IHt9XG59OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEFsdEF4aXMoYXhpcykge1xuICByZXR1cm4gYXhpcyA9PT0gJ3gnID8gJ3knIDogJ3gnO1xufSIsImltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgc3RhcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRBbHRBeGlzIGZyb20gXCIuLi91dGlscy9nZXRBbHRBeGlzLmpzXCI7XG5pbXBvcnQgeyB3aXRoaW4sIHdpdGhpbk1heENsYW1wIH0gZnJvbSBcIi4uL3V0aWxzL3dpdGhpbi5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuLi91dGlscy9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCBnZXRGcmVzaFNpZGVPYmplY3QgZnJvbSBcIi4uL3V0aWxzL2dldEZyZXNoU2lkZU9iamVjdC5qc1wiO1xuaW1wb3J0IHsgbWluIGFzIG1hdGhNaW4sIG1heCBhcyBtYXRoTWF4IH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gcHJldmVudE92ZXJmbG93KF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICB2YXIgX29wdGlvbnMkbWFpbkF4aXMgPSBvcHRpb25zLm1haW5BeGlzLFxuICAgICAgY2hlY2tNYWluQXhpcyA9IF9vcHRpb25zJG1haW5BeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkbWFpbkF4aXMsXG4gICAgICBfb3B0aW9ucyRhbHRBeGlzID0gb3B0aW9ucy5hbHRBeGlzLFxuICAgICAgY2hlY2tBbHRBeGlzID0gX29wdGlvbnMkYWx0QXhpcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgX29wdGlvbnMkdGV0aGVyID0gb3B0aW9ucy50ZXRoZXIsXG4gICAgICB0ZXRoZXIgPSBfb3B0aW9ucyR0ZXRoZXIgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyR0ZXRoZXIsXG4gICAgICBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQgPSBvcHRpb25zLnRldGhlck9mZnNldCxcbiAgICAgIHRldGhlck9mZnNldCA9IF9vcHRpb25zJHRldGhlck9mZnNldCA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJHRldGhlck9mZnNldDtcbiAgdmFyIG92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgcGFkZGluZzogcGFkZGluZyxcbiAgICBhbHRCb3VuZGFyeTogYWx0Qm91bmRhcnlcbiAgfSk7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgdmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBpc0Jhc2VQbGFjZW1lbnQgPSAhdmFyaWF0aW9uO1xuICB2YXIgbWFpbkF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCk7XG4gIHZhciBhbHRBeGlzID0gZ2V0QWx0QXhpcyhtYWluQXhpcyk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciB0ZXRoZXJPZmZzZXRWYWx1ZSA9IHR5cGVvZiB0ZXRoZXJPZmZzZXQgPT09ICdmdW5jdGlvbicgPyB0ZXRoZXJPZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KSkgOiB0ZXRoZXJPZmZzZXQ7XG4gIHZhciBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUgPSB0eXBlb2YgdGV0aGVyT2Zmc2V0VmFsdWUgPT09ICdudW1iZXInID8ge1xuICAgIG1haW5BeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZSxcbiAgICBhbHRBeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZVxuICB9IDogT2JqZWN0LmFzc2lnbih7XG4gICAgbWFpbkF4aXM6IDAsXG4gICAgYWx0QXhpczogMFxuICB9LCB0ZXRoZXJPZmZzZXRWYWx1ZSk7XG4gIHZhciBvZmZzZXRNb2RpZmllclN0YXRlID0gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQgPyBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldFtzdGF0ZS5wbGFjZW1lbnRdIDogbnVsbDtcbiAgdmFyIGRhdGEgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgaWYgKCFwb3BwZXJPZmZzZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICB2YXIgX29mZnNldE1vZGlmaWVyU3RhdGUkO1xuXG4gICAgdmFyIG1haW5TaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gICAgdmFyIGFsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gICAgdmFyIG9mZnNldCA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdO1xuICAgIHZhciBtaW4gPSBvZmZzZXQgKyBvdmVyZmxvd1ttYWluU2lkZV07XG4gICAgdmFyIG1heCA9IG9mZnNldCAtIG92ZXJmbG93W2FsdFNpZGVdO1xuICAgIHZhciBhZGRpdGl2ZSA9IHRldGhlciA/IC1wb3BwZXJSZWN0W2xlbl0gLyAyIDogMDtcbiAgICB2YXIgbWluTGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IHJlZmVyZW5jZVJlY3RbbGVuXSA6IHBvcHBlclJlY3RbbGVuXTtcbiAgICB2YXIgbWF4TGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IC1wb3BwZXJSZWN0W2xlbl0gOiAtcmVmZXJlbmNlUmVjdFtsZW5dOyAvLyBXZSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFycm93IGluIHRoZSBjYWxjdWxhdGlvbiBzbyB0aGUgYXJyb3cgZG9lc24ndCBnb1xuICAgIC8vIG91dHNpZGUgdGhlIHJlZmVyZW5jZSBib3VuZHNcblxuICAgIHZhciBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdztcbiAgICB2YXIgYXJyb3dSZWN0ID0gdGV0aGVyICYmIGFycm93RWxlbWVudCA/IGdldExheW91dFJlY3QoYXJyb3dFbGVtZW50KSA6IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nT2JqZWN0ID0gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddID8gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddLnBhZGRpbmcgOiBnZXRGcmVzaFNpZGVPYmplY3QoKTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWluID0gYXJyb3dQYWRkaW5nT2JqZWN0W21haW5TaWRlXTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWF4ID0gYXJyb3dQYWRkaW5nT2JqZWN0W2FsdFNpZGVdOyAvLyBJZiB0aGUgcmVmZXJlbmNlIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gdGhlIGFycm93IGxlbmd0aCwgd2UgZG9uJ3Qgd2FudFxuICAgIC8vIHRvIGluY2x1ZGUgaXRzIGZ1bGwgc2l6ZSBpbiB0aGUgY2FsY3VsYXRpb24uIElmIHRoZSByZWZlcmVuY2UgaXMgc21hbGxcbiAgICAvLyBhbmQgbmVhciB0aGUgZWRnZSBvZiBhIGJvdW5kYXJ5LCB0aGUgcG9wcGVyIGNhbiBvdmVyZmxvdyBldmVuIGlmIHRoZVxuICAgIC8vIHJlZmVyZW5jZSBpcyBub3Qgb3ZlcmZsb3dpbmcgYXMgd2VsbCAoZS5nLiB2aXJ0dWFsIGVsZW1lbnRzIHdpdGggbm9cbiAgICAvLyB3aWR0aCBvciBoZWlnaHQpXG5cbiAgICB2YXIgYXJyb3dMZW4gPSB3aXRoaW4oMCwgcmVmZXJlbmNlUmVjdFtsZW5dLCBhcnJvd1JlY3RbbGVuXSk7XG4gICAgdmFyIG1pbk9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IHJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgLSBhZGRpdGl2ZSAtIGFycm93TGVuIC0gYXJyb3dQYWRkaW5nTWluIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzIDogbWluTGVuIC0gYXJyb3dMZW4gLSBhcnJvd1BhZGRpbmdNaW4gLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXM7XG4gICAgdmFyIG1heE9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IC1yZWZlcmVuY2VSZWN0W2xlbl0gLyAyICsgYWRkaXRpdmUgKyBhcnJvd0xlbiArIGFycm93UGFkZGluZ01heCArIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcyA6IG1heExlbiArIGFycm93TGVuICsgYXJyb3dQYWRkaW5nTWF4ICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzO1xuICAgIHZhciBhcnJvd09mZnNldFBhcmVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93ICYmIGdldE9mZnNldFBhcmVudChzdGF0ZS5lbGVtZW50cy5hcnJvdyk7XG4gICAgdmFyIGNsaWVudE9mZnNldCA9IGFycm93T2Zmc2V0UGFyZW50ID8gbWFpbkF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudFRvcCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50TGVmdCB8fCAwIDogMDtcbiAgICB2YXIgb2Zmc2V0TW9kaWZpZXJWYWx1ZSA9IChfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQgPSBvZmZzZXRNb2RpZmllclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBvZmZzZXRNb2RpZmllclN0YXRlW21haW5BeGlzXSkgIT0gbnVsbCA/IF9vZmZzZXRNb2RpZmllclN0YXRlJCA6IDA7XG4gICAgdmFyIHRldGhlck1pbiA9IG9mZnNldCArIG1pbk9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWUgLSBjbGllbnRPZmZzZXQ7XG4gICAgdmFyIHRldGhlck1heCA9IG9mZnNldCArIG1heE9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWU7XG4gICAgdmFyIHByZXZlbnRlZE9mZnNldCA9IHdpdGhpbih0ZXRoZXIgPyBtYXRoTWluKG1pbiwgdGV0aGVyTWluKSA6IG1pbiwgb2Zmc2V0LCB0ZXRoZXIgPyBtYXRoTWF4KG1heCwgdGV0aGVyTWF4KSA6IG1heCk7XG4gICAgcG9wcGVyT2Zmc2V0c1ttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQ7XG4gICAgZGF0YVttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQgLSBvZmZzZXQ7XG4gIH1cblxuICBpZiAoY2hlY2tBbHRBeGlzKSB7XG4gICAgdmFyIF9vZmZzZXRNb2RpZmllclN0YXRlJDI7XG5cbiAgICB2YXIgX21haW5TaWRlID0gbWFpbkF4aXMgPT09ICd4JyA/IHRvcCA6IGxlZnQ7XG5cbiAgICB2YXIgX2FsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3gnID8gYm90dG9tIDogcmlnaHQ7XG5cbiAgICB2YXIgX29mZnNldCA9IHBvcHBlck9mZnNldHNbYWx0QXhpc107XG5cbiAgICB2YXIgX2xlbiA9IGFsdEF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHZhciBfbWluID0gX29mZnNldCArIG92ZXJmbG93W19tYWluU2lkZV07XG5cbiAgICB2YXIgX21heCA9IF9vZmZzZXQgLSBvdmVyZmxvd1tfYWx0U2lkZV07XG5cbiAgICB2YXIgaXNPcmlnaW5TaWRlID0gW3RvcCwgbGVmdF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgICB2YXIgX29mZnNldE1vZGlmaWVyVmFsdWUgPSAoX29mZnNldE1vZGlmaWVyU3RhdGUkMiA9IG9mZnNldE1vZGlmaWVyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9mZnNldE1vZGlmaWVyU3RhdGVbYWx0QXhpc10pICE9IG51bGwgPyBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyIDogMDtcblxuICAgIHZhciBfdGV0aGVyTWluID0gaXNPcmlnaW5TaWRlID8gX21pbiA6IF9vZmZzZXQgLSByZWZlcmVuY2VSZWN0W19sZW5dIC0gcG9wcGVyUmVjdFtfbGVuXSAtIF9vZmZzZXRNb2RpZmllclZhbHVlICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXM7XG5cbiAgICB2YXIgX3RldGhlck1heCA9IGlzT3JpZ2luU2lkZSA/IF9vZmZzZXQgKyByZWZlcmVuY2VSZWN0W19sZW5dICsgcG9wcGVyUmVjdFtfbGVuXSAtIF9vZmZzZXRNb2RpZmllclZhbHVlIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXMgOiBfbWF4O1xuXG4gICAgdmFyIF9wcmV2ZW50ZWRPZmZzZXQgPSB0ZXRoZXIgJiYgaXNPcmlnaW5TaWRlID8gd2l0aGluTWF4Q2xhbXAoX3RldGhlck1pbiwgX29mZnNldCwgX3RldGhlck1heCkgOiB3aXRoaW4odGV0aGVyID8gX3RldGhlck1pbiA6IF9taW4sIF9vZmZzZXQsIHRldGhlciA/IF90ZXRoZXJNYXggOiBfbWF4KTtcblxuICAgIHBvcHBlck9mZnNldHNbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0O1xuICAgIGRhdGFbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0IC0gX29mZnNldDtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IHByZXZlbnRPdmVyZmxvdyxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXVxufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRIVE1MRWxlbWVudFNjcm9sbChlbGVtZW50KSB7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogZWxlbWVudC5zY3JvbGxMZWZ0LFxuICAgIHNjcm9sbFRvcDogZWxlbWVudC5zY3JvbGxUb3BcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0SFRNTEVsZW1lbnRTY3JvbGwgZnJvbSBcIi4vZ2V0SFRNTEVsZW1lbnRTY3JvbGwuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE5vZGVTY3JvbGwobm9kZSkge1xuICBpZiAobm9kZSA9PT0gZ2V0V2luZG93KG5vZGUpIHx8ICFpc0hUTUxFbGVtZW50KG5vZGUpKSB7XG4gICAgcmV0dXJuIGdldFdpbmRvd1Njcm9sbChub2RlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZ2V0SFRNTEVsZW1lbnRTY3JvbGwobm9kZSk7XG4gIH1cbn0iLCJpbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldE5vZGVTY3JvbGwgZnJvbSBcIi4vZ2V0Tm9kZVNjcm9sbC5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsQmFyWC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBpc0VsZW1lbnRTY2FsZWQoZWxlbWVudCkge1xuICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciBzY2FsZVggPSByb3VuZChyZWN0LndpZHRoKSAvIGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMTtcbiAgdmFyIHNjYWxlWSA9IHJvdW5kKHJlY3QuaGVpZ2h0KSAvIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IDE7XG4gIHJldHVybiBzY2FsZVggIT09IDEgfHwgc2NhbGVZICE9PSAxO1xufSAvLyBSZXR1cm5zIHRoZSBjb21wb3NpdGUgcmVjdCBvZiBhbiBlbGVtZW50IHJlbGF0aXZlIHRvIGl0cyBvZmZzZXRQYXJlbnQuXG4vLyBDb21wb3NpdGUgbWVhbnMgaXQgdGFrZXMgaW50byBhY2NvdW50IHRyYW5zZm9ybXMgYXMgd2VsbCBhcyBsYXlvdXQuXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q29tcG9zaXRlUmVjdChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCwgb2Zmc2V0UGFyZW50LCBpc0ZpeGVkKSB7XG4gIGlmIChpc0ZpeGVkID09PSB2b2lkIDApIHtcbiAgICBpc0ZpeGVkID0gZmFsc2U7XG4gIH1cblxuICB2YXIgaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIHZhciBvZmZzZXRQYXJlbnRJc1NjYWxlZCA9IGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJiBpc0VsZW1lbnRTY2FsZWQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIGRvY3VtZW50RWxlbWVudCA9IGdldERvY3VtZW50RWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICB2YXIgcmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCwgb2Zmc2V0UGFyZW50SXNTY2FsZWQsIGlzRml4ZWQpO1xuICB2YXIgc2Nyb2xsID0ge1xuICAgIHNjcm9sbExlZnQ6IDAsXG4gICAgc2Nyb2xsVG9wOiAwXG4gIH07XG4gIHZhciBvZmZzZXRzID0ge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xuXG4gIGlmIChpc09mZnNldFBhcmVudEFuRWxlbWVudCB8fCAhaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgJiYgIWlzRml4ZWQpIHtcbiAgICBpZiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSAhPT0gJ2JvZHknIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTA3OFxuICAgIGlzU2Nyb2xsUGFyZW50KGRvY3VtZW50RWxlbWVudCkpIHtcbiAgICAgIHNjcm9sbCA9IGdldE5vZGVTY3JvbGwob2Zmc2V0UGFyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICBvZmZzZXRzID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KG9mZnNldFBhcmVudCwgdHJ1ZSk7XG4gICAgICBvZmZzZXRzLnggKz0gb2Zmc2V0UGFyZW50LmNsaWVudExlZnQ7XG4gICAgICBvZmZzZXRzLnkgKz0gb2Zmc2V0UGFyZW50LmNsaWVudFRvcDtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50RWxlbWVudCkge1xuICAgICAgb2Zmc2V0cy54ID0gZ2V0V2luZG93U2Nyb2xsQmFyWChkb2N1bWVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogcmVjdC5sZWZ0ICsgc2Nyb2xsLnNjcm9sbExlZnQgLSBvZmZzZXRzLngsXG4gICAgeTogcmVjdC50b3AgKyBzY3JvbGwuc2Nyb2xsVG9wIC0gb2Zmc2V0cy55LFxuICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgIGhlaWdodDogcmVjdC5oZWlnaHRcbiAgfTtcbn0iLCJpbXBvcnQgeyBtb2RpZmllclBoYXNlcyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBzb3VyY2U6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ5ODc1MjU1XG5cbmZ1bmN0aW9uIG9yZGVyKG1vZGlmaWVycykge1xuICB2YXIgbWFwID0gbmV3IE1hcCgpO1xuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBtb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBtYXAuc2V0KG1vZGlmaWVyLm5hbWUsIG1vZGlmaWVyKTtcbiAgfSk7IC8vIE9uIHZpc2l0aW5nIG9iamVjdCwgY2hlY2sgZm9yIGl0cyBkZXBlbmRlbmNpZXMgYW5kIHZpc2l0IHRoZW0gcmVjdXJzaXZlbHlcblxuICBmdW5jdGlvbiBzb3J0KG1vZGlmaWVyKSB7XG4gICAgdmlzaXRlZC5hZGQobW9kaWZpZXIubmFtZSk7XG4gICAgdmFyIHJlcXVpcmVzID0gW10uY29uY2F0KG1vZGlmaWVyLnJlcXVpcmVzIHx8IFtdLCBtb2RpZmllci5yZXF1aXJlc0lmRXhpc3RzIHx8IFtdKTtcbiAgICByZXF1aXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChkZXApIHtcbiAgICAgIGlmICghdmlzaXRlZC5oYXMoZGVwKSkge1xuICAgICAgICB2YXIgZGVwTW9kaWZpZXIgPSBtYXAuZ2V0KGRlcCk7XG5cbiAgICAgICAgaWYgKGRlcE1vZGlmaWVyKSB7XG4gICAgICAgICAgc29ydChkZXBNb2RpZmllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXN1bHQucHVzaChtb2RpZmllcik7XG4gIH1cblxuICBtb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBpZiAoIXZpc2l0ZWQuaGFzKG1vZGlmaWVyLm5hbWUpKSB7XG4gICAgICAvLyBjaGVjayBmb3IgdmlzaXRlZCBvYmplY3RcbiAgICAgIHNvcnQobW9kaWZpZXIpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9yZGVyTW9kaWZpZXJzKG1vZGlmaWVycykge1xuICAvLyBvcmRlciBiYXNlZCBvbiBkZXBlbmRlbmNpZXNcbiAgdmFyIG9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcihtb2RpZmllcnMpOyAvLyBvcmRlciBiYXNlZCBvbiBwaGFzZVxuXG4gIHJldHVybiBtb2RpZmllclBoYXNlcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGhhc2UpIHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdChvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgIHJldHVybiBtb2RpZmllci5waGFzZSA9PT0gcGhhc2U7XG4gICAgfSkpO1xuICB9LCBbXSk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVib3VuY2UoZm4pIHtcbiAgdmFyIHBlbmRpbmc7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICBwZW5kaW5nID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcGVuZGluZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICByZXNvbHZlKGZuKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwZW5kaW5nO1xuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlQnlOYW1lKG1vZGlmaWVycykge1xuICB2YXIgbWVyZ2VkID0gbW9kaWZpZXJzLnJlZHVjZShmdW5jdGlvbiAobWVyZ2VkLCBjdXJyZW50KSB7XG4gICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkW2N1cnJlbnQubmFtZV07XG4gICAgbWVyZ2VkW2N1cnJlbnQubmFtZV0gPSBleGlzdGluZyA/IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLCBjdXJyZW50LCB7XG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZy5vcHRpb25zLCBjdXJyZW50Lm9wdGlvbnMpLFxuICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmcuZGF0YSwgY3VycmVudC5kYXRhKVxuICAgIH0pIDogY3VycmVudDtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9LCB7fSk7IC8vIElFMTEgZG9lcyBub3Qgc3VwcG9ydCBPYmplY3QudmFsdWVzXG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1lcmdlZCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gbWVyZ2VkW2tleV07XG4gIH0pO1xufSIsImltcG9ydCBnZXRDb21wb3NpdGVSZWN0IGZyb20gXCIuL2RvbS11dGlscy9nZXRDb21wb3NpdGVSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qc1wiO1xuaW1wb3J0IGxpc3RTY3JvbGxQYXJlbnRzIGZyb20gXCIuL2RvbS11dGlscy9saXN0U2Nyb2xsUGFyZW50cy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgb3JkZXJNb2RpZmllcnMgZnJvbSBcIi4vdXRpbHMvb3JkZXJNb2RpZmllcnMuanNcIjtcbmltcG9ydCBkZWJvdW5jZSBmcm9tIFwiLi91dGlscy9kZWJvdW5jZS5qc1wiO1xuaW1wb3J0IG1lcmdlQnlOYW1lIGZyb20gXCIuL3V0aWxzL21lcmdlQnlOYW1lLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gXCIuL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzXCI7XG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuICBtb2RpZmllcnM6IFtdLFxuICBzdHJhdGVneTogJ2Fic29sdXRlJ1xufTtcblxuZnVuY3Rpb24gYXJlVmFsaWRFbGVtZW50cygpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiAhYXJncy5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgcmV0dXJuICEoZWxlbWVudCAmJiB0eXBlb2YgZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPT09ICdmdW5jdGlvbicpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvcHBlckdlbmVyYXRvcihnZW5lcmF0b3JPcHRpb25zKSB7XG4gIGlmIChnZW5lcmF0b3JPcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBnZW5lcmF0b3JPcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX2dlbmVyYXRvck9wdGlvbnMgPSBnZW5lcmF0b3JPcHRpb25zLFxuICAgICAgX2dlbmVyYXRvck9wdGlvbnMkZGVmID0gX2dlbmVyYXRvck9wdGlvbnMuZGVmYXVsdE1vZGlmaWVycyxcbiAgICAgIGRlZmF1bHRNb2RpZmllcnMgPSBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYgPT09IHZvaWQgMCA/IFtdIDogX2dlbmVyYXRvck9wdGlvbnMkZGVmLFxuICAgICAgX2dlbmVyYXRvck9wdGlvbnMkZGVmMiA9IF9nZW5lcmF0b3JPcHRpb25zLmRlZmF1bHRPcHRpb25zLFxuICAgICAgZGVmYXVsdE9wdGlvbnMgPSBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyID09PSB2b2lkIDAgPyBERUZBVUxUX09QVElPTlMgOiBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyO1xuICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlUG9wcGVyKHJlZmVyZW5jZSwgcG9wcGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuICAgIH1cblxuICAgIHZhciBzdGF0ZSA9IHtcbiAgICAgIHBsYWNlbWVudDogJ2JvdHRvbScsXG4gICAgICBvcmRlcmVkTW9kaWZpZXJzOiBbXSxcbiAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfT1BUSU9OUywgZGVmYXVsdE9wdGlvbnMpLFxuICAgICAgbW9kaWZpZXJzRGF0YToge30sXG4gICAgICBlbGVtZW50czoge1xuICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZSxcbiAgICAgICAgcG9wcGVyOiBwb3BwZXJcbiAgICAgIH0sXG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIHN0eWxlczoge31cbiAgICB9O1xuICAgIHZhciBlZmZlY3RDbGVhbnVwRm5zID0gW107XG4gICAgdmFyIGlzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgdmFyIGluc3RhbmNlID0ge1xuICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgc2V0T3B0aW9uczogZnVuY3Rpb24gc2V0T3B0aW9ucyhzZXRPcHRpb25zQWN0aW9uKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdHlwZW9mIHNldE9wdGlvbnNBY3Rpb24gPT09ICdmdW5jdGlvbicgPyBzZXRPcHRpb25zQWN0aW9uKHN0YXRlLm9wdGlvbnMpIDogc2V0T3B0aW9uc0FjdGlvbjtcbiAgICAgICAgY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICBzdGF0ZS5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMsIHN0YXRlLm9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICBzdGF0ZS5zY3JvbGxQYXJlbnRzID0ge1xuICAgICAgICAgIHJlZmVyZW5jZTogaXNFbGVtZW50KHJlZmVyZW5jZSkgPyBsaXN0U2Nyb2xsUGFyZW50cyhyZWZlcmVuY2UpIDogcmVmZXJlbmNlLmNvbnRleHRFbGVtZW50ID8gbGlzdFNjcm9sbFBhcmVudHMocmVmZXJlbmNlLmNvbnRleHRFbGVtZW50KSA6IFtdLFxuICAgICAgICAgIHBvcHBlcjogbGlzdFNjcm9sbFBhcmVudHMocG9wcGVyKVxuICAgICAgICB9OyAvLyBPcmRlcnMgdGhlIG1vZGlmaWVycyBiYXNlZCBvbiB0aGVpciBkZXBlbmRlbmNpZXMgYW5kIGBwaGFzZWBcbiAgICAgICAgLy8gcHJvcGVydGllc1xuXG4gICAgICAgIHZhciBvcmRlcmVkTW9kaWZpZXJzID0gb3JkZXJNb2RpZmllcnMobWVyZ2VCeU5hbWUoW10uY29uY2F0KGRlZmF1bHRNb2RpZmllcnMsIHN0YXRlLm9wdGlvbnMubW9kaWZpZXJzKSkpOyAvLyBTdHJpcCBvdXQgZGlzYWJsZWQgbW9kaWZpZXJzXG5cbiAgICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyZWRNb2RpZmllcnMuZmlsdGVyKGZ1bmN0aW9uIChtKSB7XG4gICAgICAgICAgcmV0dXJuIG0uZW5hYmxlZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJ1bk1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICB9LFxuICAgICAgLy8gU3luYyB1cGRhdGUg4oCTIGl0IHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGVkLCBldmVuIGlmIG5vdCBuZWNlc3NhcnkuIFRoaXNcbiAgICAgIC8vIGlzIHVzZWZ1bCBmb3IgbG93IGZyZXF1ZW5jeSB1cGRhdGVzIHdoZXJlIHN5bmMgYmVoYXZpb3Igc2ltcGxpZmllcyB0aGVcbiAgICAgIC8vIGxvZ2ljLlxuICAgICAgLy8gRm9yIGhpZ2ggZnJlcXVlbmN5IHVwZGF0ZXMgKGUuZy4gYHJlc2l6ZWAgYW5kIGBzY3JvbGxgIGV2ZW50cyksIGFsd2F5c1xuICAgICAgLy8gcHJlZmVyIHRoZSBhc3luYyBQb3BwZXIjdXBkYXRlIG1ldGhvZFxuICAgICAgZm9yY2VVcGRhdGU6IGZ1bmN0aW9uIGZvcmNlVXBkYXRlKCkge1xuICAgICAgICBpZiAoaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX3N0YXRlJGVsZW1lbnRzID0gc3RhdGUuZWxlbWVudHMsXG4gICAgICAgICAgICByZWZlcmVuY2UgPSBfc3RhdGUkZWxlbWVudHMucmVmZXJlbmNlLFxuICAgICAgICAgICAgcG9wcGVyID0gX3N0YXRlJGVsZW1lbnRzLnBvcHBlcjsgLy8gRG9uJ3QgcHJvY2VlZCBpZiBgcmVmZXJlbmNlYCBvciBgcG9wcGVyYCBhcmUgbm90IHZhbGlkIGVsZW1lbnRzXG4gICAgICAgIC8vIGFueW1vcmVcblxuICAgICAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIFN0b3JlIHRoZSByZWZlcmVuY2UgYW5kIHBvcHBlciByZWN0cyB0byBiZSByZWFkIGJ5IG1vZGlmaWVyc1xuXG5cbiAgICAgICAgc3RhdGUucmVjdHMgPSB7XG4gICAgICAgICAgcmVmZXJlbmNlOiBnZXRDb21wb3NpdGVSZWN0KHJlZmVyZW5jZSwgZ2V0T2Zmc2V0UGFyZW50KHBvcHBlciksIHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3kgPT09ICdmaXhlZCcpLFxuICAgICAgICAgIHBvcHBlcjogZ2V0TGF5b3V0UmVjdChwb3BwZXIpXG4gICAgICAgIH07IC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIHJlc2V0IHRoZSBjdXJyZW50IHVwZGF0ZSBjeWNsZS4gVGhlXG4gICAgICAgIC8vIG1vc3QgY29tbW9uIHVzZSBjYXNlIGZvciB0aGlzIGlzIHRoZSBgZmxpcGAgbW9kaWZpZXIgY2hhbmdpbmcgdGhlXG4gICAgICAgIC8vIHBsYWNlbWVudCwgd2hpY2ggdGhlbiBuZWVkcyB0byByZS1ydW4gYWxsIHRoZSBtb2RpZmllcnMsIGJlY2F1c2UgdGhlXG4gICAgICAgIC8vIGxvZ2ljIHdhcyBwcmV2aW91c2x5IHJhbiBmb3IgdGhlIHByZXZpb3VzIHBsYWNlbWVudCBhbmQgaXMgdGhlcmVmb3JlXG4gICAgICAgIC8vIHN0YWxlL2luY29ycmVjdFxuXG4gICAgICAgIHN0YXRlLnJlc2V0ID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLnBsYWNlbWVudCA9IHN0YXRlLm9wdGlvbnMucGxhY2VtZW50OyAvLyBPbiBlYWNoIHVwZGF0ZSBjeWNsZSwgdGhlIGBtb2RpZmllcnNEYXRhYCBwcm9wZXJ0eSBmb3IgZWFjaCBtb2RpZmllclxuICAgICAgICAvLyBpcyBmaWxsZWQgd2l0aCB0aGUgaW5pdGlhbCBkYXRhIHNwZWNpZmllZCBieSB0aGUgbW9kaWZpZXIuIFRoaXMgbWVhbnNcbiAgICAgICAgLy8gaXQgZG9lc24ndCBwZXJzaXN0IGFuZCBpcyBmcmVzaCBvbiBlYWNoIHVwZGF0ZS5cbiAgICAgICAgLy8gVG8gZW5zdXJlIHBlcnNpc3RlbnQgZGF0YSwgdXNlIGAke25hbWV9I3BlcnNpc3RlbnRgXG5cbiAgICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgICAgICAgIHJldHVybiBzdGF0ZS5tb2RpZmllcnNEYXRhW21vZGlmaWVyLm5hbWVdID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kaWZpZXIuZGF0YSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIGlmIChzdGF0ZS5yZXNldCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgc3RhdGUucmVzZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX3N0YXRlJG9yZGVyZWRNb2RpZmllID0gc3RhdGUub3JkZXJlZE1vZGlmaWVyc1tpbmRleF0sXG4gICAgICAgICAgICAgIGZuID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllLmZuLFxuICAgICAgICAgICAgICBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllLm9wdGlvbnMsXG4gICAgICAgICAgICAgIF9vcHRpb25zID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllMiA9PT0gdm9pZCAwID8ge30gOiBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyLFxuICAgICAgICAgICAgICBuYW1lID0gX3N0YXRlJG9yZGVyZWRNb2RpZmllLm5hbWU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IGZuKHtcbiAgICAgICAgICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgICAgICAgICBvcHRpb25zOiBfb3B0aW9ucyxcbiAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlXG4gICAgICAgICAgICB9KSB8fCBzdGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBBc3luYyBhbmQgb3B0aW1pc3RpY2FsbHkgb3B0aW1pemVkIHVwZGF0ZSDigJMgaXQgd2lsbCBub3QgYmUgZXhlY3V0ZWQgaWZcbiAgICAgIC8vIG5vdCBuZWNlc3NhcnkgKGRlYm91bmNlZCB0byBydW4gYXQgbW9zdCBvbmNlLXBlci10aWNrKVxuICAgICAgdXBkYXRlOiBkZWJvdW5jZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIGluc3RhbmNlLmZvcmNlVXBkYXRlKCk7XG4gICAgICAgICAgcmVzb2x2ZShzdGF0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICBjbGVhbnVwTW9kaWZpZXJFZmZlY3RzKCk7XG4gICAgICAgIGlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKCFhcmVWYWxpZEVsZW1lbnRzKHJlZmVyZW5jZSwgcG9wcGVyKSkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIGluc3RhbmNlLnNldE9wdGlvbnMob3B0aW9ucykudGhlbihmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgIGlmICghaXNEZXN0cm95ZWQgJiYgb3B0aW9ucy5vbkZpcnN0VXBkYXRlKSB7XG4gICAgICAgIG9wdGlvbnMub25GaXJzdFVwZGF0ZShzdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7IC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IGNvZGUgYmVmb3JlIHRoZSBmaXJzdFxuICAgIC8vIHVwZGF0ZSBjeWNsZSBydW5zLiBUaGV5IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHVwZGF0ZVxuICAgIC8vIGN5Y2xlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGEgbW9kaWZpZXIgYWRkcyBzb21lIHBlcnNpc3RlbnQgZGF0YSB0aGF0XG4gICAgLy8gb3RoZXIgbW9kaWZpZXJzIG5lZWQgdG8gdXNlLCBidXQgdGhlIG1vZGlmaWVyIGlzIHJ1biBhZnRlciB0aGUgZGVwZW5kZW50XG4gICAgLy8gb25lLlxuXG4gICAgZnVuY3Rpb24gcnVuTW9kaWZpZXJFZmZlY3RzKCkge1xuICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgIHZhciBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgICAgICAgX3JlZiRvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuICAgICAgICAgICAgb3B0aW9ucyA9IF9yZWYkb3B0aW9ucyA9PT0gdm9pZCAwID8ge30gOiBfcmVmJG9wdGlvbnMsXG4gICAgICAgICAgICBlZmZlY3QgPSBfcmVmLmVmZmVjdDtcblxuICAgICAgICBpZiAodHlwZW9mIGVmZmVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhciBjbGVhbnVwRm4gPSBlZmZlY3Qoe1xuICAgICAgICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHZhciBub29wRm4gPSBmdW5jdGlvbiBub29wRm4oKSB7fTtcblxuICAgICAgICAgIGVmZmVjdENsZWFudXBGbnMucHVzaChjbGVhbnVwRm4gfHwgbm9vcEZuKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpIHtcbiAgICAgIGVmZmVjdENsZWFudXBGbnMuZm9yRWFjaChmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZuKCk7XG4gICAgICB9KTtcbiAgICAgIGVmZmVjdENsZWFudXBGbnMgPSBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG59XG5leHBvcnQgdmFyIGNyZWF0ZVBvcHBlciA9IC8qI19fUFVSRV9fKi9wb3BwZXJHZW5lcmF0b3IoKTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBkZXRlY3RPdmVyZmxvdyB9OyIsImltcG9ydCB7IHBvcHBlckdlbmVyYXRvciwgZGV0ZWN0T3ZlcmZsb3cgfSBmcm9tIFwiLi9jcmVhdGVQb3BwZXIuanNcIjtcbmltcG9ydCBldmVudExpc3RlbmVycyBmcm9tIFwiLi9tb2RpZmllcnMvZXZlbnRMaXN0ZW5lcnMuanNcIjtcbmltcG9ydCBwb3BwZXJPZmZzZXRzIGZyb20gXCIuL21vZGlmaWVycy9wb3BwZXJPZmZzZXRzLmpzXCI7XG5pbXBvcnQgY29tcHV0ZVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvY29tcHV0ZVN0eWxlcy5qc1wiO1xuaW1wb3J0IGFwcGx5U3R5bGVzIGZyb20gXCIuL21vZGlmaWVycy9hcHBseVN0eWxlcy5qc1wiO1xudmFyIGRlZmF1bHRNb2RpZmllcnMgPSBbZXZlbnRMaXN0ZW5lcnMsIHBvcHBlck9mZnNldHMsIGNvbXB1dGVTdHlsZXMsIGFwcGx5U3R5bGVzXTtcbnZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKHtcbiAgZGVmYXVsdE1vZGlmaWVyczogZGVmYXVsdE1vZGlmaWVyc1xufSk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgY3JlYXRlUG9wcGVyLCBwb3BwZXJHZW5lcmF0b3IsIGRlZmF1bHRNb2RpZmllcnMsIGRldGVjdE92ZXJmbG93IH07IiwiaW1wb3J0IHsgcG9wcGVyR2VuZXJhdG9yLCBkZXRlY3RPdmVyZmxvdyB9IGZyb20gXCIuL2NyZWF0ZVBvcHBlci5qc1wiO1xuaW1wb3J0IGV2ZW50TGlzdGVuZXJzIGZyb20gXCIuL21vZGlmaWVycy9ldmVudExpc3RlbmVycy5qc1wiO1xuaW1wb3J0IHBvcHBlck9mZnNldHMgZnJvbSBcIi4vbW9kaWZpZXJzL3BvcHBlck9mZnNldHMuanNcIjtcbmltcG9ydCBjb21wdXRlU3R5bGVzIGZyb20gXCIuL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzXCI7XG5pbXBvcnQgYXBwbHlTdHlsZXMgZnJvbSBcIi4vbW9kaWZpZXJzL2FwcGx5U3R5bGVzLmpzXCI7XG5pbXBvcnQgb2Zmc2V0IGZyb20gXCIuL21vZGlmaWVycy9vZmZzZXQuanNcIjtcbmltcG9ydCBmbGlwIGZyb20gXCIuL21vZGlmaWVycy9mbGlwLmpzXCI7XG5pbXBvcnQgcHJldmVudE92ZXJmbG93IGZyb20gXCIuL21vZGlmaWVycy9wcmV2ZW50T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBhcnJvdyBmcm9tIFwiLi9tb2RpZmllcnMvYXJyb3cuanNcIjtcbmltcG9ydCBoaWRlIGZyb20gXCIuL21vZGlmaWVycy9oaWRlLmpzXCI7XG52YXIgZGVmYXVsdE1vZGlmaWVycyA9IFtldmVudExpc3RlbmVycywgcG9wcGVyT2Zmc2V0cywgY29tcHV0ZVN0eWxlcywgYXBwbHlTdHlsZXMsIG9mZnNldCwgZmxpcCwgcHJldmVudE92ZXJmbG93LCBhcnJvdywgaGlkZV07XG52YXIgY3JlYXRlUG9wcGVyID0gLyojX19QVVJFX18qL3BvcHBlckdlbmVyYXRvcih7XG4gIGRlZmF1bHRNb2RpZmllcnM6IGRlZmF1bHRNb2RpZmllcnNcbn0pOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciwgcG9wcGVyR2VuZXJhdG9yLCBkZWZhdWx0TW9kaWZpZXJzLCBkZXRlY3RPdmVyZmxvdyB9OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciBhcyBjcmVhdGVQb3BwZXJMaXRlIH0gZnJvbSBcIi4vcG9wcGVyLWxpdGUuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgKiBmcm9tIFwiLi9tb2RpZmllcnMvaW5kZXguanNcIjsiLCIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgZHJvcGRvd24uanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgKiBhcyBQb3BwZXIgZnJvbSAnQHBvcHBlcmpzL2NvcmUnXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50LmpzJ1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyLmpzJ1xuaW1wb3J0IE1hbmlwdWxhdG9yIGZyb20gJy4vZG9tL21hbmlwdWxhdG9yLmpzJ1xuaW1wb3J0IFNlbGVjdG9yRW5naW5lIGZyb20gJy4vZG9tL3NlbGVjdG9yLWVuZ2luZS5qcydcbmltcG9ydCB7XG4gIGRlZmluZUpRdWVyeVBsdWdpbixcbiAgZXhlY3V0ZSxcbiAgZ2V0RWxlbWVudCxcbiAgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQsXG4gIGlzRGlzYWJsZWQsXG4gIGlzRWxlbWVudCxcbiAgaXNSVEwsXG4gIGlzVmlzaWJsZSxcbiAgbm9vcFxufSBmcm9tICcuL3V0aWwvaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdkcm9wZG93bidcbmNvbnN0IERBVEFfS0VZID0gJ2JzLmRyb3Bkb3duJ1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcbmNvbnN0IERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknXG5cbmNvbnN0IEVTQ0FQRV9LRVkgPSAnRXNjYXBlJ1xuY29uc3QgVEFCX0tFWSA9ICdUYWInXG5jb25zdCBBUlJPV19VUF9LRVkgPSAnQXJyb3dVcCdcbmNvbnN0IEFSUk9XX0RPV05fS0VZID0gJ0Fycm93RG93bidcbmNvbnN0IFJJR0hUX01PVVNFX0JVVFRPTiA9IDIgLy8gTW91c2VFdmVudC5idXR0b24gdmFsdWUgZm9yIHRoZSBzZWNvbmRhcnkgYnV0dG9uLCB1c3VhbGx5IHRoZSByaWdodCBidXR0b25cblxuY29uc3QgRVZFTlRfSElERSA9IGBoaWRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1dOID0gYHNob3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2ske0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlET1dOX0RBVEFfQVBJID0gYGtleWRvd24ke0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlVUF9EQVRBX0FQSSA9IGBrZXl1cCR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcblxuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBDTEFTU19OQU1FX0RST1BVUCA9ICdkcm9wdXAnXG5jb25zdCBDTEFTU19OQU1FX0RST1BFTkQgPSAnZHJvcGVuZCdcbmNvbnN0IENMQVNTX05BTUVfRFJPUFNUQVJUID0gJ2Ryb3BzdGFydCdcbmNvbnN0IENMQVNTX05BTUVfRFJPUFVQX0NFTlRFUiA9ICdkcm9wdXAtY2VudGVyJ1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QRE9XTl9DRU5URVIgPSAnZHJvcGRvd24tY2VudGVyJ1xuXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiXTpub3QoLmRpc2FibGVkKTpub3QoOmRpc2FibGVkKSdcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFX1NIT1dOID0gYCR7U0VMRUNUT1JfREFUQV9UT0dHTEV9LiR7Q0xBU1NfTkFNRV9TSE9XfWBcbmNvbnN0IFNFTEVDVE9SX01FTlUgPSAnLmRyb3Bkb3duLW1lbnUnXG5jb25zdCBTRUxFQ1RPUl9OQVZCQVIgPSAnLm5hdmJhcidcbmNvbnN0IFNFTEVDVE9SX05BVkJBUl9OQVYgPSAnLm5hdmJhci1uYXYnXG5jb25zdCBTRUxFQ1RPUl9WSVNJQkxFX0lURU1TID0gJy5kcm9wZG93bi1tZW51IC5kcm9wZG93bi1pdGVtOm5vdCguZGlzYWJsZWQpOm5vdCg6ZGlzYWJsZWQpJ1xuXG5jb25zdCBQTEFDRU1FTlRfVE9QID0gaXNSVEwoKSA/ICd0b3AtZW5kJyA6ICd0b3Atc3RhcnQnXG5jb25zdCBQTEFDRU1FTlRfVE9QRU5EID0gaXNSVEwoKSA/ICd0b3Atc3RhcnQnIDogJ3RvcC1lbmQnXG5jb25zdCBQTEFDRU1FTlRfQk9UVE9NID0gaXNSVEwoKSA/ICdib3R0b20tZW5kJyA6ICdib3R0b20tc3RhcnQnXG5jb25zdCBQTEFDRU1FTlRfQk9UVE9NRU5EID0gaXNSVEwoKSA/ICdib3R0b20tc3RhcnQnIDogJ2JvdHRvbS1lbmQnXG5jb25zdCBQTEFDRU1FTlRfUklHSFQgPSBpc1JUTCgpID8gJ2xlZnQtc3RhcnQnIDogJ3JpZ2h0LXN0YXJ0J1xuY29uc3QgUExBQ0VNRU5UX0xFRlQgPSBpc1JUTCgpID8gJ3JpZ2h0LXN0YXJ0JyA6ICdsZWZ0LXN0YXJ0J1xuY29uc3QgUExBQ0VNRU5UX1RPUENFTlRFUiA9ICd0b3AnXG5jb25zdCBQTEFDRU1FTlRfQk9UVE9NQ0VOVEVSID0gJ2JvdHRvbSdcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgYXV0b0Nsb3NlOiB0cnVlLFxuICBib3VuZGFyeTogJ2NsaXBwaW5nUGFyZW50cycsXG4gIGRpc3BsYXk6ICdkeW5hbWljJyxcbiAgb2Zmc2V0OiBbMCwgMl0sXG4gIHBvcHBlckNvbmZpZzogbnVsbCxcbiAgcmVmZXJlbmNlOiAndG9nZ2xlJ1xufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgYXV0b0Nsb3NlOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIGJvdW5kYXJ5OiAnKHN0cmluZ3xlbGVtZW50KScsXG4gIGRpc3BsYXk6ICdzdHJpbmcnLFxuICBvZmZzZXQ6ICcoYXJyYXl8c3RyaW5nfGZ1bmN0aW9uKScsXG4gIHBvcHBlckNvbmZpZzogJyhudWxsfG9iamVjdHxmdW5jdGlvbiknLFxuICByZWZlcmVuY2U6ICcoc3RyaW5nfGVsZW1lbnR8b2JqZWN0KSdcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgRHJvcGRvd24gZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKVxuXG4gICAgdGhpcy5fcG9wcGVyID0gbnVsbFxuICAgIHRoaXMuX3BhcmVudCA9IHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZSAvLyBkcm9wZG93biB3cmFwcGVyXG4gICAgLy8gVE9ETzogdjYgcmV2ZXJ0ICMzNzAxMSAmIGNoYW5nZSBtYXJrdXAgaHR0cHM6Ly9nZXRib290c3RyYXAuY29tL2RvY3MvNS4zL2Zvcm1zL2lucHV0LWdyb3VwL1xuICAgIHRoaXMuX21lbnUgPSBTZWxlY3RvckVuZ2luZS5uZXh0KHRoaXMuX2VsZW1lbnQsIFNFTEVDVE9SX01FTlUpWzBdIHx8XG4gICAgICBTZWxlY3RvckVuZ2luZS5wcmV2KHRoaXMuX2VsZW1lbnQsIFNFTEVDVE9SX01FTlUpWzBdIHx8XG4gICAgICBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX01FTlUsIHRoaXMuX3BhcmVudClcbiAgICB0aGlzLl9pbk5hdmJhciA9IHRoaXMuX2RldGVjdE5hdmJhcigpXG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIHRvZ2dsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTaG93bigpID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3coKVxuICB9XG5cbiAgc2hvdygpIHtcbiAgICBpZiAoaXNEaXNhYmxlZCh0aGlzLl9lbGVtZW50KSB8fCB0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSB7XG4gICAgICByZWxhdGVkVGFyZ2V0OiB0aGlzLl9lbGVtZW50XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvd0V2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPVywgcmVsYXRlZFRhcmdldClcblxuICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fY3JlYXRlUG9wcGVyKClcblxuICAgIC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSBhZGQgZXh0cmFcbiAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHRvIHRoZSBib2R5J3MgaW1tZWRpYXRlIGNoaWxkcmVuO1xuICAgIC8vIG9ubHkgbmVlZGVkIGJlY2F1c2Ugb2YgYnJva2VuIGV2ZW50IGRlbGVnYXRpb24gb24gaU9TXG4gICAgLy8gaHR0cHM6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDE0LzAyL21vdXNlX2V2ZW50X2J1Yi5odG1sXG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiAhdGhpcy5fcGFyZW50LmNsb3Nlc3QoU0VMRUNUT1JfTkFWQkFSX05BVikpIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBbXS5jb25jYXQoLi4uZG9jdW1lbnQuYm9keS5jaGlsZHJlbikpIHtcbiAgICAgICAgRXZlbnRIYW5kbGVyLm9uKGVsZW1lbnQsICdtb3VzZW92ZXInLCBub29wKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuZm9jdXMoKVxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSlcblxuICAgIHRoaXMuX21lbnUuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTiwgcmVsYXRlZFRhcmdldClcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgaWYgKGlzRGlzYWJsZWQodGhpcy5fZWxlbWVudCkgfHwgIXRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IHtcbiAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRoaXMuX2VsZW1lbnRcbiAgICB9XG5cbiAgICB0aGlzLl9jb21wbGV0ZUhpZGUocmVsYXRlZFRhcmdldClcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLmRlc3Ryb3koKVxuICAgIH1cblxuICAgIHN1cGVyLmRpc3Bvc2UoKVxuICB9XG5cbiAgdXBkYXRlKCkge1xuICAgIHRoaXMuX2luTmF2YmFyID0gdGhpcy5fZGV0ZWN0TmF2YmFyKClcbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIudXBkYXRlKClcbiAgICB9XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9jb21wbGV0ZUhpZGUocmVsYXRlZFRhcmdldCkge1xuICAgIGNvbnN0IGhpZGVFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREUsIHJlbGF0ZWRUYXJnZXQpXG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgcmVtb3ZlIHRoZSBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgd2UgYWRkZWQgZm9yIGlPUyBzdXBwb3J0XG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsICdtb3VzZW92ZXInLCBub29wKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9wb3BwZXIpIHtcbiAgICAgIHRoaXMuX3BvcHBlci5kZXN0cm95KClcbiAgICB9XG5cbiAgICB0aGlzLl9tZW51LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKVxuICAgIE1hbmlwdWxhdG9yLnJlbW92ZURhdGFBdHRyaWJ1dGUodGhpcy5fbWVudSwgJ3BvcHBlcicpXG4gICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOLCByZWxhdGVkVGFyZ2V0KVxuICB9XG5cbiAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICBjb25maWcgPSBzdXBlci5fZ2V0Q29uZmlnKGNvbmZpZylcblxuICAgIGlmICh0eXBlb2YgY29uZmlnLnJlZmVyZW5jZSA9PT0gJ29iamVjdCcgJiYgIWlzRWxlbWVudChjb25maWcucmVmZXJlbmNlKSAmJlxuICAgICAgdHlwZW9mIGNvbmZpZy5yZWZlcmVuY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICE9PSAnZnVuY3Rpb24nXG4gICAgKSB7XG4gICAgICAvLyBQb3BwZXIgdmlydHVhbCBlbGVtZW50cyByZXF1aXJlIGEgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IG1ldGhvZFxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtOQU1FLnRvVXBwZXJDYXNlKCl9OiBPcHRpb24gXCJyZWZlcmVuY2VcIiBwcm92aWRlZCB0eXBlIFwib2JqZWN0XCIgd2l0aG91dCBhIHJlcXVpcmVkIFwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0XCIgbWV0aG9kLmApXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2NyZWF0ZVBvcHBlcigpIHtcbiAgICBpZiAodHlwZW9mIFBvcHBlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Jvb3RzdHJhcFxcJ3MgZHJvcGRvd25zIHJlcXVpcmUgUG9wcGVyIChodHRwczovL3BvcHBlci5qcy5vcmcpJylcbiAgICB9XG5cbiAgICBsZXQgcmVmZXJlbmNlRWxlbWVudCA9IHRoaXMuX2VsZW1lbnRcblxuICAgIGlmICh0aGlzLl9jb25maWcucmVmZXJlbmNlID09PSAncGFyZW50Jykge1xuICAgICAgcmVmZXJlbmNlRWxlbWVudCA9IHRoaXMuX3BhcmVudFxuICAgIH0gZWxzZSBpZiAoaXNFbGVtZW50KHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UpKSB7XG4gICAgICByZWZlcmVuY2VFbGVtZW50ID0gZ2V0RWxlbWVudCh0aGlzLl9jb25maWcucmVmZXJlbmNlKVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UgPT09ICdvYmplY3QnKSB7XG4gICAgICByZWZlcmVuY2VFbGVtZW50ID0gdGhpcy5fY29uZmlnLnJlZmVyZW5jZVxuICAgIH1cblxuICAgIGNvbnN0IHBvcHBlckNvbmZpZyA9IHRoaXMuX2dldFBvcHBlckNvbmZpZygpXG4gICAgdGhpcy5fcG9wcGVyID0gUG9wcGVyLmNyZWF0ZVBvcHBlcihyZWZlcmVuY2VFbGVtZW50LCB0aGlzLl9tZW51LCBwb3BwZXJDb25maWcpXG4gIH1cblxuICBfaXNTaG93bigpIHtcbiAgICByZXR1cm4gdGhpcy5fbWVudS5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XKVxuICB9XG5cbiAgX2dldFBsYWNlbWVudCgpIHtcbiAgICBjb25zdCBwYXJlbnREcm9wZG93biA9IHRoaXMuX3BhcmVudFxuXG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BFTkQpKSB7XG4gICAgICByZXR1cm4gUExBQ0VNRU5UX1JJR0hUXG4gICAgfVxuXG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BTVEFSVCkpIHtcbiAgICAgIHJldHVybiBQTEFDRU1FTlRfTEVGVFxuICAgIH1cblxuICAgIGlmIChwYXJlbnREcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QVVBfQ0VOVEVSKSkge1xuICAgICAgcmV0dXJuIFBMQUNFTUVOVF9UT1BDRU5URVJcbiAgICB9XG5cbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUERPV05fQ0VOVEVSKSkge1xuICAgICAgcmV0dXJuIFBMQUNFTUVOVF9CT1RUT01DRU5URVJcbiAgICB9XG5cbiAgICAvLyBXZSBuZWVkIHRvIHRyaW0gdGhlIHZhbHVlIGJlY2F1c2UgY3VzdG9tIHByb3BlcnRpZXMgY2FuIGFsc28gaW5jbHVkZSBzcGFjZXNcbiAgICBjb25zdCBpc0VuZCA9IGdldENvbXB1dGVkU3R5bGUodGhpcy5fbWVudSkuZ2V0UHJvcGVydHlWYWx1ZSgnLS1icy1wb3NpdGlvbicpLnRyaW0oKSA9PT0gJ2VuZCdcblxuICAgIGlmIChwYXJlbnREcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QVVApKSB7XG4gICAgICByZXR1cm4gaXNFbmQgPyBQTEFDRU1FTlRfVE9QRU5EIDogUExBQ0VNRU5UX1RPUFxuICAgIH1cblxuICAgIHJldHVybiBpc0VuZCA/IFBMQUNFTUVOVF9CT1RUT01FTkQgOiBQTEFDRU1FTlRfQk9UVE9NXG4gIH1cblxuICBfZGV0ZWN0TmF2YmFyKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50LmNsb3Nlc3QoU0VMRUNUT1JfTkFWQkFSKSAhPT0gbnVsbFxuICB9XG5cbiAgX2dldE9mZnNldCgpIHtcbiAgICBjb25zdCB7IG9mZnNldCB9ID0gdGhpcy5fY29uZmlnXG5cbiAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBvZmZzZXQuc3BsaXQoJywnKS5tYXAodmFsdWUgPT4gTnVtYmVyLnBhcnNlSW50KHZhbHVlLCAxMCkpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBwb3BwZXJEYXRhID0+IG9mZnNldChwb3BwZXJEYXRhLCB0aGlzLl9lbGVtZW50KVxuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXRcbiAgfVxuXG4gIF9nZXRQb3BwZXJDb25maWcoKSB7XG4gICAgY29uc3QgZGVmYXVsdEJzUG9wcGVyQ29uZmlnID0ge1xuICAgICAgcGxhY2VtZW50OiB0aGlzLl9nZXRQbGFjZW1lbnQoKSxcbiAgICAgIG1vZGlmaWVyczogW3tcbiAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBib3VuZGFyeTogdGhpcy5fY29uZmlnLmJvdW5kYXJ5XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdvZmZzZXQnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgb2Zmc2V0OiB0aGlzLl9nZXRPZmZzZXQoKVxuICAgICAgICB9XG4gICAgICB9XVxuICAgIH1cblxuICAgIC8vIERpc2FibGUgUG9wcGVyIGlmIHdlIGhhdmUgYSBzdGF0aWMgZGlzcGxheSBvciBEcm9wZG93biBpcyBpbiBOYXZiYXJcbiAgICBpZiAodGhpcy5faW5OYXZiYXIgfHwgdGhpcy5fY29uZmlnLmRpc3BsYXkgPT09ICdzdGF0aWMnKSB7XG4gICAgICBNYW5pcHVsYXRvci5zZXREYXRhQXR0cmlidXRlKHRoaXMuX21lbnUsICdwb3BwZXInLCAnc3RhdGljJykgLy8gVE9ETzogdjYgcmVtb3ZlXG4gICAgICBkZWZhdWx0QnNQb3BwZXJDb25maWcubW9kaWZpZXJzID0gW3tcbiAgICAgICAgbmFtZTogJ2FwcGx5U3R5bGVzJyxcbiAgICAgICAgZW5hYmxlZDogZmFsc2VcbiAgICAgIH1dXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZmF1bHRCc1BvcHBlckNvbmZpZyxcbiAgICAgIC4uLmV4ZWN1dGUodGhpcy5fY29uZmlnLnBvcHBlckNvbmZpZywgW2RlZmF1bHRCc1BvcHBlckNvbmZpZ10pXG4gICAgfVxuICB9XG5cbiAgX3NlbGVjdE1lbnVJdGVtKHsga2V5LCB0YXJnZXQgfSkge1xuICAgIGNvbnN0IGl0ZW1zID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9WSVNJQkxFX0lURU1TLCB0aGlzLl9tZW51KS5maWx0ZXIoZWxlbWVudCA9PiBpc1Zpc2libGUoZWxlbWVudCkpXG5cbiAgICBpZiAoIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gaWYgdGFyZ2V0IGlzbid0IGluY2x1ZGVkIGluIGl0ZW1zIChlLmcuIHdoZW4gZXhwYW5kaW5nIHRoZSBkcm9wZG93bilcbiAgICAvLyBhbGxvdyBjeWNsaW5nIHRvIGdldCB0aGUgbGFzdCBpdGVtIGluIGNhc2Uga2V5IGVxdWFscyBBUlJPV19VUF9LRVlcbiAgICBnZXROZXh0QWN0aXZlRWxlbWVudChpdGVtcywgdGFyZ2V0LCBrZXkgPT09IEFSUk9XX0RPV05fS0VZLCAhaXRlbXMuaW5jbHVkZXModGFyZ2V0KSkuZm9jdXMoKVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gRHJvcGRvd24uZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKClcbiAgICB9KVxuICB9XG5cbiAgc3RhdGljIGNsZWFyTWVudXMoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuYnV0dG9uID09PSBSSUdIVF9NT1VTRV9CVVRUT04gfHwgKGV2ZW50LnR5cGUgPT09ICdrZXl1cCcgJiYgZXZlbnQua2V5ICE9PSBUQUJfS0VZKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgb3BlblRvZ2dsZXMgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfVE9HR0xFX1NIT1dOKVxuXG4gICAgZm9yIChjb25zdCB0b2dnbGUgb2Ygb3BlblRvZ2dsZXMpIHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBEcm9wZG93bi5nZXRJbnN0YW5jZSh0b2dnbGUpXG4gICAgICBpZiAoIWNvbnRleHQgfHwgY29udGV4dC5fY29uZmlnLmF1dG9DbG9zZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29tcG9zZWRQYXRoID0gZXZlbnQuY29tcG9zZWRQYXRoKClcbiAgICAgIGNvbnN0IGlzTWVudVRhcmdldCA9IGNvbXBvc2VkUGF0aC5pbmNsdWRlcyhjb250ZXh0Ll9tZW51KVxuICAgICAgaWYgKFxuICAgICAgICBjb21wb3NlZFBhdGguaW5jbHVkZXMoY29udGV4dC5fZWxlbWVudCkgfHxcbiAgICAgICAgKGNvbnRleHQuX2NvbmZpZy5hdXRvQ2xvc2UgPT09ICdpbnNpZGUnICYmICFpc01lbnVUYXJnZXQpIHx8XG4gICAgICAgIChjb250ZXh0Ll9jb25maWcuYXV0b0Nsb3NlID09PSAnb3V0c2lkZScgJiYgaXNNZW51VGFyZ2V0KVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIFRhYiBuYXZpZ2F0aW9uIHRocm91Z2ggdGhlIGRyb3Bkb3duIG1lbnUgb3IgZXZlbnRzIGZyb20gY29udGFpbmVkIGlucHV0cyBzaG91bGRuJ3QgY2xvc2UgdGhlIG1lbnVcbiAgICAgIGlmIChjb250ZXh0Ll9tZW51LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiYgKChldmVudC50eXBlID09PSAna2V5dXAnICYmIGV2ZW50LmtleSA9PT0gVEFCX0tFWSkgfHwgL2lucHV0fHNlbGVjdHxvcHRpb258dGV4dGFyZWF8Zm9ybS9pLnRlc3QoZXZlbnQudGFyZ2V0LnRhZ05hbWUpKSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0geyByZWxhdGVkVGFyZ2V0OiBjb250ZXh0Ll9lbGVtZW50IH1cblxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldC5jbGlja0V2ZW50ID0gZXZlbnRcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5fY29tcGxldGVIaWRlKHJlbGF0ZWRUYXJnZXQpXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGRhdGFBcGlLZXlkb3duSGFuZGxlcihldmVudCkge1xuICAgIC8vIElmIG5vdCBhbiBVUCB8IERPV04gfCBFU0NBUEUga2V5ID0+IG5vdCBhIGRyb3Bkb3duIGNvbW1hbmRcbiAgICAvLyBJZiBpbnB1dC90ZXh0YXJlYSAmJiBpZiBrZXkgaXMgb3RoZXIgdGhhbiBFU0NBUEUgPT4gbm90IGEgZHJvcGRvd24gY29tbWFuZFxuXG4gICAgY29uc3QgaXNJbnB1dCA9IC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZXZlbnQudGFyZ2V0LnRhZ05hbWUpXG4gICAgY29uc3QgaXNFc2NhcGVFdmVudCA9IGV2ZW50LmtleSA9PT0gRVNDQVBFX0tFWVxuICAgIGNvbnN0IGlzVXBPckRvd25FdmVudCA9IFtBUlJPV19VUF9LRVksIEFSUk9XX0RPV05fS0VZXS5pbmNsdWRlcyhldmVudC5rZXkpXG5cbiAgICBpZiAoIWlzVXBPckRvd25FdmVudCAmJiAhaXNFc2NhcGVFdmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGlzSW5wdXQgJiYgIWlzRXNjYXBlRXZlbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICAgIC8vIFRPRE86IHY2IHJldmVydCAjMzcwMTEgJiBjaGFuZ2UgbWFya3VwIGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS9kb2NzLzUuMy9mb3Jtcy9pbnB1dC1ncm91cC9cbiAgICBjb25zdCBnZXRUb2dnbGVCdXR0b24gPSB0aGlzLm1hdGNoZXMoU0VMRUNUT1JfREFUQV9UT0dHTEUpID9cbiAgICAgIHRoaXMgOlxuICAgICAgKFNlbGVjdG9yRW5naW5lLnByZXYodGhpcywgU0VMRUNUT1JfREFUQV9UT0dHTEUpWzBdIHx8XG4gICAgICAgIFNlbGVjdG9yRW5naW5lLm5leHQodGhpcywgU0VMRUNUT1JfREFUQV9UT0dHTEUpWzBdIHx8XG4gICAgICAgIFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfREFUQV9UT0dHTEUsIGV2ZW50LmRlbGVnYXRlVGFyZ2V0LnBhcmVudE5vZGUpKVxuXG4gICAgY29uc3QgaW5zdGFuY2UgPSBEcm9wZG93bi5nZXRPckNyZWF0ZUluc3RhbmNlKGdldFRvZ2dsZUJ1dHRvbilcblxuICAgIGlmIChpc1VwT3JEb3duRXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICBpbnN0YW5jZS5zaG93KClcbiAgICAgIGluc3RhbmNlLl9zZWxlY3RNZW51SXRlbShldmVudClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5faXNTaG93bigpKSB7IC8vIGVsc2UgaXMgZXNjYXBlIGFuZCB3ZSBjaGVjayBpZiBpdCBpcyBzaG93blxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgIGluc3RhbmNlLmhpZGUoKVxuICAgICAgZ2V0VG9nZ2xlQnV0dG9uLmZvY3VzKClcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfS0VZRE9XTl9EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIERyb3Bkb3duLmRhdGFBcGlLZXlkb3duSGFuZGxlcilcbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfS0VZRE9XTl9EQVRBX0FQSSwgU0VMRUNUT1JfTUVOVSwgRHJvcGRvd24uZGF0YUFwaUtleWRvd25IYW5kbGVyKVxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgRHJvcGRvd24uY2xlYXJNZW51cylcbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfS0VZVVBfREFUQV9BUEksIERyb3Bkb3duLmNsZWFyTWVudXMpXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgRHJvcGRvd24uZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKS50b2dnbGUoKVxufSlcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oRHJvcGRvd24pXG5cbmV4cG9ydCBkZWZhdWx0IERyb3Bkb3duXG4iLCIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9iYWNrZHJvcC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgQ29uZmlnIGZyb20gJy4vY29uZmlnLmpzJ1xuaW1wb3J0IHtcbiAgZXhlY3V0ZSwgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbiwgZ2V0RWxlbWVudCwgcmVmbG93XG59IGZyb20gJy4vaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdiYWNrZHJvcCdcbmNvbnN0IENMQVNTX05BTUVfRkFERSA9ICdmYWRlJ1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBFVkVOVF9NT1VTRURPV04gPSBgbW91c2Vkb3duLmJzLiR7TkFNRX1gXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGNsYXNzTmFtZTogJ21vZGFsLWJhY2tkcm9wJyxcbiAgY2xpY2tDYWxsYmFjazogbnVsbCxcbiAgaXNBbmltYXRlZDogZmFsc2UsXG4gIGlzVmlzaWJsZTogdHJ1ZSwgLy8gaWYgZmFsc2UsIHdlIHVzZSB0aGUgYmFja2Ryb3AgaGVscGVyIHdpdGhvdXQgYWRkaW5nIGFueSBlbGVtZW50IHRvIHRoZSBkb21cbiAgcm9vdEVsZW1lbnQ6ICdib2R5JyAvLyBnaXZlIHRoZSBjaG9pY2UgdG8gcGxhY2UgYmFja2Ryb3AgdW5kZXIgZGlmZmVyZW50IGVsZW1lbnRzXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICBjbGlja0NhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJyxcbiAgaXNBbmltYXRlZDogJ2Jvb2xlYW4nLFxuICBpc1Zpc2libGU6ICdib29sZWFuJyxcbiAgcm9vdEVsZW1lbnQ6ICcoZWxlbWVudHxzdHJpbmcpJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBCYWNrZHJvcCBleHRlbmRzIENvbmZpZyB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKVxuICAgIHRoaXMuX2lzQXBwZW5kZWQgPSBmYWxzZVxuICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsXG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIHNob3coY2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5pc1Zpc2libGUpIHtcbiAgICAgIGV4ZWN1dGUoY2FsbGJhY2spXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9hcHBlbmQoKVxuXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2dldEVsZW1lbnQoKVxuICAgIGlmICh0aGlzLl9jb25maWcuaXNBbmltYXRlZCkge1xuICAgICAgcmVmbG93KGVsZW1lbnQpXG4gICAgfVxuXG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcblxuICAgIHRoaXMuX2VtdWxhdGVBbmltYXRpb24oKCkgPT4ge1xuICAgICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgICB9KVxuICB9XG5cbiAgaGlkZShjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5fY29uZmlnLmlzVmlzaWJsZSkge1xuICAgICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2dldEVsZW1lbnQoKS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcblxuICAgIHRoaXMuX2VtdWxhdGVBbmltYXRpb24oKCkgPT4ge1xuICAgICAgdGhpcy5kaXNwb3NlKClcbiAgICAgIGV4ZWN1dGUoY2FsbGJhY2spXG4gICAgfSlcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgaWYgKCF0aGlzLl9pc0FwcGVuZGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFRE9XTilcblxuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKClcbiAgICB0aGlzLl9pc0FwcGVuZGVkID0gZmFsc2VcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2dldEVsZW1lbnQoKSB7XG4gICAgaWYgKCF0aGlzLl9lbGVtZW50KSB7XG4gICAgICBjb25zdCBiYWNrZHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgICBiYWNrZHJvcC5jbGFzc05hbWUgPSB0aGlzLl9jb25maWcuY2xhc3NOYW1lXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmlzQW5pbWF0ZWQpIHtcbiAgICAgICAgYmFja2Ryb3AuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0ZBREUpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBiYWNrZHJvcFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9lbGVtZW50XG4gIH1cblxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICAvLyB1c2UgZ2V0RWxlbWVudCgpIHdpdGggdGhlIGRlZmF1bHQgXCJib2R5XCIgdG8gZ2V0IGEgZnJlc2ggRWxlbWVudCBvbiBlYWNoIGluc3RhbnRpYXRpb25cbiAgICBjb25maWcucm9vdEVsZW1lbnQgPSBnZXRFbGVtZW50KGNvbmZpZy5yb290RWxlbWVudClcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfYXBwZW5kKCkge1xuICAgIGlmICh0aGlzLl9pc0FwcGVuZGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZ2V0RWxlbWVudCgpXG4gICAgdGhpcy5fY29uZmlnLnJvb3RFbGVtZW50LmFwcGVuZChlbGVtZW50KVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uKGVsZW1lbnQsIEVWRU5UX01PVVNFRE9XTiwgKCkgPT4ge1xuICAgICAgZXhlY3V0ZSh0aGlzLl9jb25maWcuY2xpY2tDYWxsYmFjaylcbiAgICB9KVxuXG4gICAgdGhpcy5faXNBcHBlbmRlZCA9IHRydWVcbiAgfVxuXG4gIF9lbXVsYXRlQW5pbWF0aW9uKGNhbGxiYWNrKSB7XG4gICAgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbihjYWxsYmFjaywgdGhpcy5fZ2V0RWxlbWVudCgpLCB0aGlzLl9jb25maWcuaXNBbmltYXRlZClcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCYWNrZHJvcFxuIiwiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvZm9jdXN0cmFwLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IENvbmZpZyBmcm9tICcuL2NvbmZpZy5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ2ZvY3VzdHJhcCdcbmNvbnN0IERBVEFfS0VZID0gJ2JzLmZvY3VzdHJhcCdcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5jb25zdCBFVkVOVF9GT0NVU0lOID0gYGZvY3VzaW4ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlET1dOX1RBQiA9IGBrZXlkb3duLnRhYiR7RVZFTlRfS0VZfWBcblxuY29uc3QgVEFCX0tFWSA9ICdUYWInXG5jb25zdCBUQUJfTkFWX0ZPUldBUkQgPSAnZm9yd2FyZCdcbmNvbnN0IFRBQl9OQVZfQkFDS1dBUkQgPSAnYmFja3dhcmQnXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGF1dG9mb2N1czogdHJ1ZSxcbiAgdHJhcEVsZW1lbnQ6IG51bGwgLy8gVGhlIGVsZW1lbnQgdG8gdHJhcCBmb2N1cyBpbnNpZGUgb2Zcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGF1dG9mb2N1czogJ2Jvb2xlYW4nLFxuICB0cmFwRWxlbWVudDogJ2VsZW1lbnQnXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIEZvY3VzVHJhcCBleHRlbmRzIENvbmZpZyB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKVxuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2VcbiAgICB0aGlzLl9sYXN0VGFiTmF2RGlyZWN0aW9uID0gbnVsbFxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBhY3RpdmF0ZSgpIHtcbiAgICBpZiAodGhpcy5faXNBY3RpdmUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jb25maWcuYXV0b2ZvY3VzKSB7XG4gICAgICB0aGlzLl9jb25maWcudHJhcEVsZW1lbnQuZm9jdXMoKVxuICAgIH1cblxuICAgIEV2ZW50SGFuZGxlci5vZmYoZG9jdW1lbnQsIEVWRU5UX0tFWSkgLy8gZ3VhcmQgYWdhaW5zdCBpbmZpbml0ZSBmb2N1cyBsb29wXG4gICAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9GT0NVU0lOLCBldmVudCA9PiB0aGlzLl9oYW5kbGVGb2N1c2luKGV2ZW50KSlcbiAgICBFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWURPV05fVEFCLCBldmVudCA9PiB0aGlzLl9oYW5kbGVLZXlkb3duKGV2ZW50KSlcblxuICAgIHRoaXMuX2lzQWN0aXZlID0gdHJ1ZVxuICB9XG5cbiAgZGVhY3RpdmF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlXG4gICAgRXZlbnRIYW5kbGVyLm9mZihkb2N1bWVudCwgRVZFTlRfS0VZKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfaGFuZGxlRm9jdXNpbihldmVudCkge1xuICAgIGNvbnN0IHsgdHJhcEVsZW1lbnQgfSA9IHRoaXMuX2NvbmZpZ1xuXG4gICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gZG9jdW1lbnQgfHwgZXZlbnQudGFyZ2V0ID09PSB0cmFwRWxlbWVudCB8fCB0cmFwRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50cyA9IFNlbGVjdG9yRW5naW5lLmZvY3VzYWJsZUNoaWxkcmVuKHRyYXBFbGVtZW50KVxuXG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdHJhcEVsZW1lbnQuZm9jdXMoKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9PT0gVEFCX05BVl9CQUNLV0FSRCkge1xuICAgICAgZWxlbWVudHNbZWxlbWVudHMubGVuZ3RoIC0gMV0uZm9jdXMoKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50c1swXS5mb2N1cygpXG4gICAgfVxuICB9XG5cbiAgX2hhbmRsZUtleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5ICE9PSBUQUJfS0VZKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9sYXN0VGFiTmF2RGlyZWN0aW9uID0gZXZlbnQuc2hpZnRLZXkgPyBUQUJfTkFWX0JBQ0tXQVJEIDogVEFCX05BVl9GT1JXQVJEXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRm9jdXNUcmFwXG4iLCIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9zY3JvbGxCYXIuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgTWFuaXB1bGF0b3IgZnJvbSAnLi4vZG9tL21hbmlwdWxhdG9yLmpzJ1xuaW1wb3J0IFNlbGVjdG9yRW5naW5lIGZyb20gJy4uL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tICcuL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IFNFTEVDVE9SX0ZJWEVEX0NPTlRFTlQgPSAnLmZpeGVkLXRvcCwgLmZpeGVkLWJvdHRvbSwgLmlzLWZpeGVkLCAuc3RpY2t5LXRvcCdcbmNvbnN0IFNFTEVDVE9SX1NUSUNLWV9DT05URU5UID0gJy5zdGlja3ktdG9wJ1xuY29uc3QgUFJPUEVSVFlfUEFERElORyA9ICdwYWRkaW5nLXJpZ2h0J1xuY29uc3QgUFJPUEVSVFlfTUFSR0lOID0gJ21hcmdpbi1yaWdodCdcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgU2Nyb2xsQmFySGVscGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmJvZHlcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBnZXRXaWR0aCgpIHtcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2lubmVyV2lkdGgjdXNhZ2Vfbm90ZXNcbiAgICBjb25zdCBkb2N1bWVudFdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoXG4gICAgcmV0dXJuIE1hdGguYWJzKHdpbmRvdy5pbm5lcldpZHRoIC0gZG9jdW1lbnRXaWR0aClcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLmdldFdpZHRoKClcbiAgICB0aGlzLl9kaXNhYmxlT3ZlckZsb3coKVxuICAgIC8vIGdpdmUgcGFkZGluZyB0byBlbGVtZW50IHRvIGJhbGFuY2UgdGhlIGhpZGRlbiBzY3JvbGxiYXIgd2lkdGhcbiAgICB0aGlzLl9zZXRFbGVtZW50QXR0cmlidXRlcyh0aGlzLl9lbGVtZW50LCBQUk9QRVJUWV9QQURESU5HLCBjYWxjdWxhdGVkVmFsdWUgPT4gY2FsY3VsYXRlZFZhbHVlICsgd2lkdGgpXG4gICAgLy8gdHJpY2s6IFdlIGFkanVzdCBwb3NpdGl2ZSBwYWRkaW5nUmlnaHQgYW5kIG5lZ2F0aXZlIG1hcmdpblJpZ2h0IHRvIHN0aWNreS10b3AgZWxlbWVudHMgdG8ga2VlcCBzaG93aW5nIGZ1bGx3aWR0aFxuICAgIHRoaXMuX3NldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX0ZJWEVEX0NPTlRFTlQsIFBST1BFUlRZX1BBRERJTkcsIGNhbGN1bGF0ZWRWYWx1ZSA9PiBjYWxjdWxhdGVkVmFsdWUgKyB3aWR0aClcbiAgICB0aGlzLl9zZXRFbGVtZW50QXR0cmlidXRlcyhTRUxFQ1RPUl9TVElDS1lfQ09OVEVOVCwgUFJPUEVSVFlfTUFSR0lOLCBjYWxjdWxhdGVkVmFsdWUgPT4gY2FsY3VsYXRlZFZhbHVlIC0gd2lkdGgpXG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsICdvdmVyZmxvdycpXG4gICAgdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyh0aGlzLl9lbGVtZW50LCBQUk9QRVJUWV9QQURESU5HKVxuICAgIHRoaXMuX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfRklYRURfQ09OVEVOVCwgUFJPUEVSVFlfUEFERElORylcbiAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX1NUSUNLWV9DT05URU5ULCBQUk9QRVJUWV9NQVJHSU4pXG4gIH1cblxuICBpc092ZXJmbG93aW5nKCkge1xuICAgIHJldHVybiB0aGlzLmdldFdpZHRoKCkgPiAwXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9kaXNhYmxlT3ZlckZsb3coKSB7XG4gICAgdGhpcy5fc2F2ZUluaXRpYWxBdHRyaWJ1dGUodGhpcy5fZWxlbWVudCwgJ292ZXJmbG93JylcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbidcbiAgfVxuXG4gIF9zZXRFbGVtZW50QXR0cmlidXRlcyhzZWxlY3Rvciwgc3R5bGVQcm9wZXJ0eSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBzY3JvbGxiYXJXaWR0aCA9IHRoaXMuZ2V0V2lkdGgoKVxuICAgIGNvbnN0IG1hbmlwdWxhdGlvbkNhbGxCYWNrID0gZWxlbWVudCA9PiB7XG4gICAgICBpZiAoZWxlbWVudCAhPT0gdGhpcy5fZWxlbWVudCAmJiB3aW5kb3cuaW5uZXJXaWR0aCA+IGVsZW1lbnQuY2xpZW50V2lkdGggKyBzY3JvbGxiYXJXaWR0aCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2F2ZUluaXRpYWxBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSlcbiAgICAgIGNvbnN0IGNhbGN1bGF0ZWRWYWx1ZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoc3R5bGVQcm9wZXJ0eSlcbiAgICAgIGVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoc3R5bGVQcm9wZXJ0eSwgYCR7Y2FsbGJhY2soTnVtYmVyLnBhcnNlRmxvYXQoY2FsY3VsYXRlZFZhbHVlKSl9cHhgKVxuICAgIH1cblxuICAgIHRoaXMuX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2soc2VsZWN0b3IsIG1hbmlwdWxhdGlvbkNhbGxCYWNrKVxuICB9XG5cbiAgX3NhdmVJbml0aWFsQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpIHtcbiAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IGVsZW1lbnQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZVByb3BlcnR5KVxuICAgIGlmIChhY3R1YWxWYWx1ZSkge1xuICAgICAgTWFuaXB1bGF0b3Iuc2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5LCBhY3R1YWxWYWx1ZSlcbiAgICB9XG4gIH1cblxuICBfcmVzZXRFbGVtZW50QXR0cmlidXRlcyhzZWxlY3Rvciwgc3R5bGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IG1hbmlwdWxhdGlvbkNhbGxCYWNrID0gZWxlbWVudCA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSlcbiAgICAgIC8vIFdlIG9ubHkgd2FudCB0byByZW1vdmUgdGhlIHByb3BlcnR5IGlmIHRoZSB2YWx1ZSBpcyBgbnVsbGA7IHRoZSB2YWx1ZSBjYW4gYWxzbyBiZSB6ZXJvXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eShzdHlsZVByb3BlcnR5KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgTWFuaXB1bGF0b3IucmVtb3ZlRGF0YUF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5KVxuICAgICAgZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShzdHlsZVByb3BlcnR5LCB2YWx1ZSlcbiAgICB9XG5cbiAgICB0aGlzLl9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrKHNlbGVjdG9yLCBtYW5pcHVsYXRpb25DYWxsQmFjaylcbiAgfVxuXG4gIF9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrKHNlbGVjdG9yLCBjYWxsQmFjaykge1xuICAgIGlmIChpc0VsZW1lbnQoc2VsZWN0b3IpKSB7XG4gICAgICBjYWxsQmFjayhzZWxlY3RvcilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2VsIG9mIFNlbGVjdG9yRW5naW5lLmZpbmQoc2VsZWN0b3IsIHRoaXMuX2VsZW1lbnQpKSB7XG4gICAgICBjYWxsQmFjayhzZWwpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNjcm9sbEJhckhlbHBlclxuIiwiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIG1vZGFsLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQgQmFja2Ryb3AgZnJvbSAnLi91dGlsL2JhY2tkcm9wLmpzJ1xuaW1wb3J0IHsgZW5hYmxlRGlzbWlzc1RyaWdnZXIgfSBmcm9tICcuL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucy5qcydcbmltcG9ydCBGb2N1c1RyYXAgZnJvbSAnLi91dGlsL2ZvY3VzdHJhcC5qcydcbmltcG9ydCB7XG4gIGRlZmluZUpRdWVyeVBsdWdpbiwgaXNSVEwsIGlzVmlzaWJsZSwgcmVmbG93XG59IGZyb20gJy4vdXRpbC9pbmRleC5qcydcbmltcG9ydCBTY3JvbGxCYXJIZWxwZXIgZnJvbSAnLi91dGlsL3Njcm9sbGJhci5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ21vZGFsJ1xuY29uc3QgREFUQV9LRVkgPSAnYnMubW9kYWwnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcbmNvbnN0IEVTQ0FQRV9LRVkgPSAnRXNjYXBlJ1xuXG5jb25zdCBFVkVOVF9ISURFID0gYGhpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURFX1BSRVZFTlRFRCA9IGBoaWRlUHJldmVudGVkJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1dOID0gYHNob3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfUkVTSVpFID0gYHJlc2l6ZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RJU01JU1MgPSBgY2xpY2suZGlzbWlzcyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX01PVVNFRE9XTl9ESVNNSVNTID0gYG1vdXNlZG93bi5kaXNtaXNzJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfS0VZRE9XTl9ESVNNSVNTID0gYGtleWRvd24uZGlzbWlzcyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuXG5jb25zdCBDTEFTU19OQU1FX09QRU4gPSAnbW9kYWwtb3BlbidcbmNvbnN0IENMQVNTX05BTUVfRkFERSA9ICdmYWRlJ1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBDTEFTU19OQU1FX1NUQVRJQyA9ICdtb2RhbC1zdGF0aWMnXG5cbmNvbnN0IE9QRU5fU0VMRUNUT1IgPSAnLm1vZGFsLnNob3cnXG5jb25zdCBTRUxFQ1RPUl9ESUFMT0cgPSAnLm1vZGFsLWRpYWxvZydcbmNvbnN0IFNFTEVDVE9SX01PREFMX0JPRFkgPSAnLm1vZGFsLWJvZHknXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiXSdcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgYmFja2Ryb3A6IHRydWUsXG4gIGZvY3VzOiB0cnVlLFxuICBrZXlib2FyZDogdHJ1ZVxufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgYmFja2Ryb3A6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAgZm9jdXM6ICdib29sZWFuJyxcbiAga2V5Ym9hcmQ6ICdib29sZWFuJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBNb2RhbCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl9kaWFsb2cgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0RJQUxPRywgdGhpcy5fZWxlbWVudClcbiAgICB0aGlzLl9iYWNrZHJvcCA9IHRoaXMuX2luaXRpYWxpemVCYWNrRHJvcCgpXG4gICAgdGhpcy5fZm9jdXN0cmFwID0gdGhpcy5faW5pdGlhbGl6ZUZvY3VzVHJhcCgpXG4gICAgdGhpcy5faXNTaG93biA9IGZhbHNlXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2VcbiAgICB0aGlzLl9zY3JvbGxCYXIgPSBuZXcgU2Nyb2xsQmFySGVscGVyKClcblxuICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKClcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKHJlbGF0ZWRUYXJnZXQpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTaG93biA/IHRoaXMuaGlkZSgpIDogdGhpcy5zaG93KHJlbGF0ZWRUYXJnZXQpXG4gIH1cblxuICBzaG93KHJlbGF0ZWRUYXJnZXQpIHtcbiAgICBpZiAodGhpcy5faXNTaG93biB8fCB0aGlzLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1csIHtcbiAgICAgIHJlbGF0ZWRUYXJnZXRcbiAgICB9KVxuXG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9pc1Nob3duID0gdHJ1ZVxuICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IHRydWVcblxuICAgIHRoaXMuX3Njcm9sbEJhci5oaWRlKClcblxuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX09QRU4pXG5cbiAgICB0aGlzLl9hZGp1c3REaWFsb2coKVxuXG4gICAgdGhpcy5fYmFja2Ryb3Auc2hvdygoKSA9PiB0aGlzLl9zaG93RWxlbWVudChyZWxhdGVkVGFyZ2V0KSlcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc1Nob3duIHx8IHRoaXMuX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSlcblxuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5faXNTaG93biA9IGZhbHNlXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZVxuICAgIHRoaXMuX2ZvY3VzdHJhcC5kZWFjdGl2YXRlKClcblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKCgpID0+IHRoaXMuX2hpZGVNb2RhbCgpLCB0aGlzLl9lbGVtZW50LCB0aGlzLl9pc0FuaW1hdGVkKCkpXG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIEV2ZW50SGFuZGxlci5vZmYod2luZG93LCBFVkVOVF9LRVkpXG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9kaWFsb2csIEVWRU5UX0tFWSlcblxuICAgIHRoaXMuX2JhY2tkcm9wLmRpc3Bvc2UoKVxuICAgIHRoaXMuX2ZvY3VzdHJhcC5kZWFjdGl2YXRlKClcblxuICAgIHN1cGVyLmRpc3Bvc2UoKVxuICB9XG5cbiAgaGFuZGxlVXBkYXRlKCkge1xuICAgIHRoaXMuX2FkanVzdERpYWxvZygpXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9pbml0aWFsaXplQmFja0Ryb3AoKSB7XG4gICAgcmV0dXJuIG5ldyBCYWNrZHJvcCh7XG4gICAgICBpc1Zpc2libGU6IEJvb2xlYW4odGhpcy5fY29uZmlnLmJhY2tkcm9wKSwgLy8gJ3N0YXRpYycgb3B0aW9uIHdpbGwgYmUgdHJhbnNsYXRlZCB0byB0cnVlLCBhbmQgYm9vbGVhbnMgd2lsbCBrZWVwIHRoZWlyIHZhbHVlLFxuICAgICAgaXNBbmltYXRlZDogdGhpcy5faXNBbmltYXRlZCgpXG4gICAgfSlcbiAgfVxuXG4gIF9pbml0aWFsaXplRm9jdXNUcmFwKCkge1xuICAgIHJldHVybiBuZXcgRm9jdXNUcmFwKHtcbiAgICAgIHRyYXBFbGVtZW50OiB0aGlzLl9lbGVtZW50XG4gICAgfSlcbiAgfVxuXG4gIF9zaG93RWxlbWVudChyZWxhdGVkVGFyZ2V0KSB7XG4gICAgLy8gdHJ5IHRvIGFwcGVuZCBkeW5hbWljIG1vZGFsXG4gICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHRoaXMuX2VsZW1lbnQpKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh0aGlzLl9lbGVtZW50KVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jaydcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKVxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLW1vZGFsJywgdHJ1ZSlcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdkaWFsb2cnKVxuICAgIHRoaXMuX2VsZW1lbnQuc2Nyb2xsVG9wID0gMFxuXG4gICAgY29uc3QgbW9kYWxCb2R5ID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9NT0RBTF9CT0RZLCB0aGlzLl9kaWFsb2cpXG4gICAgaWYgKG1vZGFsQm9keSkge1xuICAgICAgbW9kYWxCb2R5LnNjcm9sbFRvcCA9IDBcbiAgICB9XG5cbiAgICByZWZsb3codGhpcy5fZWxlbWVudClcblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpXG5cbiAgICBjb25zdCB0cmFuc2l0aW9uQ29tcGxldGUgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmZvY3VzKSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzdHJhcC5hY3RpdmF0ZSgpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTiwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0XG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2sodHJhbnNpdGlvbkNvbXBsZXRlLCB0aGlzLl9kaWFsb2csIHRoaXMuX2lzQW5pbWF0ZWQoKSlcbiAgfVxuXG4gIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTl9ESVNNSVNTLCBldmVudCA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5ICE9PSBFU0NBUEVfS0VZKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLl90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKClcbiAgICB9KVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfUkVTSVpFLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5faXNTaG93biAmJiAhdGhpcy5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICAgIHRoaXMuX2FkanVzdERpYWxvZygpXG4gICAgICB9XG4gICAgfSlcblxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRURPV05fRElTTUlTUywgZXZlbnQgPT4ge1xuICAgICAgLy8gYSBiYWQgdHJpY2sgdG8gc2VncmVnYXRlIGNsaWNrcyB0aGF0IG1heSBzdGFydCBpbnNpZGUgZGlhbG9nIGJ1dCBlbmQgb3V0c2lkZSwgYW5kIGF2b2lkIGxpc3RlbiB0byBzY3JvbGxiYXIgY2xpY2tzXG4gICAgICBFdmVudEhhbmRsZXIub25lKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0NMSUNLX0RJU01JU1MsIGV2ZW50MiA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9lbGVtZW50ICE9PSBldmVudC50YXJnZXQgfHwgdGhpcy5fZWxlbWVudCAhPT0gZXZlbnQyLnRhcmdldCkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCA9PT0gJ3N0YXRpYycpIHtcbiAgICAgICAgICB0aGlzLl90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuYmFja2Ryb3ApIHtcbiAgICAgICAgICB0aGlzLmhpZGUoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBfaGlkZU1vZGFsKCkge1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsIHRydWUpXG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnKVxuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdyb2xlJylcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZVxuXG4gICAgdGhpcy5fYmFja2Ryb3AuaGlkZSgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9PUEVOKVxuICAgICAgdGhpcy5fcmVzZXRBZGp1c3RtZW50cygpXG4gICAgICB0aGlzLl9zY3JvbGxCYXIucmVzZXQoKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOKVxuICAgIH0pXG4gIH1cblxuICBfaXNBbmltYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFKVxuICB9XG5cbiAgX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKSB7XG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERV9QUkVWRU5URUQpXG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBpc01vZGFsT3ZlcmZsb3dpbmcgPSB0aGlzLl9lbGVtZW50LnNjcm9sbEhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHRcbiAgICBjb25zdCBpbml0aWFsT3ZlcmZsb3dZID0gdGhpcy5fZWxlbWVudC5zdHlsZS5vdmVyZmxvd1lcbiAgICAvLyByZXR1cm4gaWYgdGhlIGZvbGxvd2luZyBiYWNrZ3JvdW5kIHRyYW5zaXRpb24gaGFzbid0IHlldCBjb21wbGV0ZWRcbiAgICBpZiAoaW5pdGlhbE92ZXJmbG93WSA9PT0gJ2hpZGRlbicgfHwgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TVEFUSUMpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIWlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSAnaGlkZGVuJ1xuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NUQVRJQylcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NUQVRJQylcbiAgICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IGluaXRpYWxPdmVyZmxvd1lcbiAgICAgIH0sIHRoaXMuX2RpYWxvZylcbiAgICB9LCB0aGlzLl9kaWFsb2cpXG5cbiAgICB0aGlzLl9lbGVtZW50LmZvY3VzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHVzZWQgdG8gaGFuZGxlIG92ZXJmbG93aW5nIG1vZGFsc1xuICAgKi9cblxuICBfYWRqdXN0RGlhbG9nKCkge1xuICAgIGNvbnN0IGlzTW9kYWxPdmVyZmxvd2luZyA9IHRoaXMuX2VsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodFxuICAgIGNvbnN0IHNjcm9sbGJhcldpZHRoID0gdGhpcy5fc2Nyb2xsQmFyLmdldFdpZHRoKClcbiAgICBjb25zdCBpc0JvZHlPdmVyZmxvd2luZyA9IHNjcm9sbGJhcldpZHRoID4gMFxuXG4gICAgaWYgKGlzQm9keU92ZXJmbG93aW5nICYmICFpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gaXNSVEwoKSA/ICdwYWRkaW5nTGVmdCcgOiAncGFkZGluZ1JpZ2h0J1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtwcm9wZXJ0eV0gPSBgJHtzY3JvbGxiYXJXaWR0aH1weGBcbiAgICB9XG5cbiAgICBpZiAoIWlzQm9keU92ZXJmbG93aW5nICYmIGlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgY29uc3QgcHJvcGVydHkgPSBpc1JUTCgpID8gJ3BhZGRpbmdSaWdodCcgOiAncGFkZGluZ0xlZnQnXG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW3Byb3BlcnR5XSA9IGAke3Njcm9sbGJhcldpZHRofXB4YFxuICAgIH1cbiAgfVxuXG4gIF9yZXNldEFkanVzdG1lbnRzKCkge1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgPSAnJ1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ1JpZ2h0ID0gJydcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZywgcmVsYXRlZFRhcmdldCkge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IE1vZGFsLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXShyZWxhdGVkVGFyZ2V0KVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgY29uc3QgdGFyZ2V0ID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3Rvcih0aGlzKVxuXG4gIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIH1cblxuICBFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfU0hPVywgc2hvd0V2ZW50ID0+IHtcbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIC8vIG9ubHkgcmVnaXN0ZXIgZm9jdXMgcmVzdG9yZXIgaWYgbW9kYWwgd2lsbCBhY3R1YWxseSBnZXQgc2hvd25cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIEV2ZW50SGFuZGxlci5vbmUodGFyZ2V0LCBFVkVOVF9ISURERU4sICgpID0+IHtcbiAgICAgIGlmIChpc1Zpc2libGUodGhpcykpIHtcbiAgICAgICAgdGhpcy5mb2N1cygpXG4gICAgICB9XG4gICAgfSlcbiAgfSlcblxuICAvLyBhdm9pZCBjb25mbGljdCB3aGVuIGNsaWNraW5nIG1vZGFsIHRvZ2dsZXIgd2hpbGUgYW5vdGhlciBvbmUgaXMgb3BlblxuICBjb25zdCBhbHJlYWR5T3BlbiA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoT1BFTl9TRUxFQ1RPUilcbiAgaWYgKGFscmVhZHlPcGVuKSB7XG4gICAgTW9kYWwuZ2V0SW5zdGFuY2UoYWxyZWFkeU9wZW4pLmhpZGUoKVxuICB9XG5cbiAgY29uc3QgZGF0YSA9IE1vZGFsLmdldE9yQ3JlYXRlSW5zdGFuY2UodGFyZ2V0KVxuXG4gIGRhdGEudG9nZ2xlKHRoaXMpXG59KVxuXG5lbmFibGVEaXNtaXNzVHJpZ2dlcihNb2RhbClcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oTW9kYWwpXG5cbmV4cG9ydCBkZWZhdWx0IE1vZGFsXG4iLCIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgb2ZmY2FudmFzLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQgQmFja2Ryb3AgZnJvbSAnLi91dGlsL2JhY2tkcm9wLmpzJ1xuaW1wb3J0IHsgZW5hYmxlRGlzbWlzc1RyaWdnZXIgfSBmcm9tICcuL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucy5qcydcbmltcG9ydCBGb2N1c1RyYXAgZnJvbSAnLi91dGlsL2ZvY3VzdHJhcC5qcydcbmltcG9ydCB7XG4gIGRlZmluZUpRdWVyeVBsdWdpbixcbiAgaXNEaXNhYmxlZCxcbiAgaXNWaXNpYmxlXG59IGZyb20gJy4vdXRpbC9pbmRleC5qcydcbmltcG9ydCBTY3JvbGxCYXJIZWxwZXIgZnJvbSAnLi91dGlsL3Njcm9sbGJhci5qcydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ29mZmNhbnZhcydcbmNvbnN0IERBVEFfS0VZID0gJ2JzLm9mZmNhbnZhcydcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJ1xuY29uc3QgRVZFTlRfTE9BRF9EQVRBX0FQSSA9IGBsb2FkJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuY29uc3QgRVNDQVBFX0tFWSA9ICdFc2NhcGUnXG5cbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XSU5HID0gJ3Nob3dpbmcnXG5jb25zdCBDTEFTU19OQU1FX0hJRElORyA9ICdoaWRpbmcnXG5jb25zdCBDTEFTU19OQU1FX0JBQ0tEUk9QID0gJ29mZmNhbnZhcy1iYWNrZHJvcCdcbmNvbnN0IE9QRU5fU0VMRUNUT1IgPSAnLm9mZmNhbnZhcy5zaG93J1xuXG5jb25zdCBFVkVOVF9TSE9XID0gYHNob3cke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJREVfUFJFVkVOVEVEID0gYGhpZGVQcmV2ZW50ZWQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURERU4gPSBgaGlkZGVuJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfUkVTSVpFID0gYHJlc2l6ZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuY29uc3QgRVZFTlRfS0VZRE9XTl9ESVNNSVNTID0gYGtleWRvd24uZGlzbWlzcyR7RVZFTlRfS0VZfWBcblxuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwib2ZmY2FudmFzXCJdJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBiYWNrZHJvcDogdHJ1ZSxcbiAga2V5Ym9hcmQ6IHRydWUsXG4gIHNjcm9sbDogZmFsc2Vcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGJhY2tkcm9wOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIGtleWJvYXJkOiAnYm9vbGVhbicsXG4gIHNjcm9sbDogJ2Jvb2xlYW4nXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIE9mZmNhbnZhcyBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl9pc1Nob3duID0gZmFsc2VcbiAgICB0aGlzLl9iYWNrZHJvcCA9IHRoaXMuX2luaXRpYWxpemVCYWNrRHJvcCgpXG4gICAgdGhpcy5fZm9jdXN0cmFwID0gdGhpcy5faW5pdGlhbGl6ZUZvY3VzVHJhcCgpXG4gICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICB0b2dnbGUocmVsYXRlZFRhcmdldCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Nob3duID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3cocmVsYXRlZFRhcmdldClcbiAgfVxuXG4gIHNob3cocmVsYXRlZFRhcmdldCkge1xuICAgIGlmICh0aGlzLl9pc1Nob3duKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XLCB7IHJlbGF0ZWRUYXJnZXQgfSlcblxuICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5faXNTaG93biA9IHRydWVcbiAgICB0aGlzLl9iYWNrZHJvcC5zaG93KClcblxuICAgIGlmICghdGhpcy5fY29uZmlnLnNjcm9sbCkge1xuICAgICAgbmV3IFNjcm9sbEJhckhlbHBlcigpLmhpZGUoKVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLW1vZGFsJywgdHJ1ZSlcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdkaWFsb2cnKVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1dJTkcpXG5cbiAgICBjb25zdCBjb21wbGV0ZUNhbGxCYWNrID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jb25maWcuc2Nyb2xsIHx8IHRoaXMuX2NvbmZpZy5iYWNrZHJvcCkge1xuICAgICAgICB0aGlzLl9mb2N1c3RyYXAuYWN0aXZhdGUoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPV0lORylcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1dOLCB7IHJlbGF0ZWRUYXJnZXQgfSlcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlQ2FsbEJhY2ssIHRoaXMuX2VsZW1lbnQsIHRydWUpXG4gIH1cblxuICBoaWRlKCkge1xuICAgIGlmICghdGhpcy5faXNTaG93bikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSlcblxuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKVxuICAgIHRoaXMuX2VsZW1lbnQuYmx1cigpXG4gICAgdGhpcy5faXNTaG93biA9IGZhbHNlXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfSElESU5HKVxuICAgIHRoaXMuX2JhY2tkcm9wLmhpZGUoKVxuXG4gICAgY29uc3QgY29tcGxldGVDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1csIENMQVNTX05BTUVfSElESU5HKVxuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnKVxuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JvbGUnKVxuXG4gICAgICBpZiAoIXRoaXMuX2NvbmZpZy5zY3JvbGwpIHtcbiAgICAgICAgbmV3IFNjcm9sbEJhckhlbHBlcigpLnJlc2V0KClcbiAgICAgIH1cblxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOKVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGVDYWxsYmFjaywgdGhpcy5fZWxlbWVudCwgdHJ1ZSlcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5fYmFja2Ryb3AuZGlzcG9zZSgpXG4gICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKVxuICAgIHN1cGVyLmRpc3Bvc2UoKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfaW5pdGlhbGl6ZUJhY2tEcm9wKCkge1xuICAgIGNvbnN0IGNsaWNrQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmJhY2tkcm9wID09PSAnc3RhdGljJykge1xuICAgICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFX1BSRVZFTlRFRClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGlkZSgpXG4gICAgfVxuXG4gICAgLy8gJ3N0YXRpYycgb3B0aW9uIHdpbGwgYmUgdHJhbnNsYXRlZCB0byB0cnVlLCBhbmQgYm9vbGVhbnMgd2lsbCBrZWVwIHRoZWlyIHZhbHVlXG4gICAgY29uc3QgaXNWaXNpYmxlID0gQm9vbGVhbih0aGlzLl9jb25maWcuYmFja2Ryb3ApXG5cbiAgICByZXR1cm4gbmV3IEJhY2tkcm9wKHtcbiAgICAgIGNsYXNzTmFtZTogQ0xBU1NfTkFNRV9CQUNLRFJPUCxcbiAgICAgIGlzVmlzaWJsZSxcbiAgICAgIGlzQW5pbWF0ZWQ6IHRydWUsXG4gICAgICByb290RWxlbWVudDogdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlLFxuICAgICAgY2xpY2tDYWxsYmFjazogaXNWaXNpYmxlID8gY2xpY2tDYWxsYmFjayA6IG51bGxcbiAgICB9KVxuICB9XG5cbiAgX2luaXRpYWxpemVGb2N1c1RyYXAoKSB7XG4gICAgcmV0dXJuIG5ldyBGb2N1c1RyYXAoe1xuICAgICAgdHJhcEVsZW1lbnQ6IHRoaXMuX2VsZW1lbnRcbiAgICB9KVxuICB9XG5cbiAgX2FkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOX0RJU01JU1MsIGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudC5rZXkgIT09IEVTQ0FQRV9LRVkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcua2V5Ym9hcmQpIHtcbiAgICAgICAgdGhpcy5oaWRlKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREVfUFJFVkVOVEVEKVxuICAgIH0pXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBPZmZjYW52YXMuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGFbY29uZmlnXSA9PT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5zdGFydHNXaXRoKCdfJykgfHwgY29uZmlnID09PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKHRoaXMpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpXG5cbiAgaWYgKFsnQScsICdBUkVBJ10uaW5jbHVkZXModGhpcy50YWdOYW1lKSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG4gIGlmIChpc0Rpc2FibGVkKHRoaXMpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfSElEREVOLCAoKSA9PiB7XG4gICAgLy8gZm9jdXMgb24gdHJpZ2dlciB3aGVuIGl0IGlzIGNsb3NlZFxuICAgIGlmIChpc1Zpc2libGUodGhpcykpIHtcbiAgICAgIHRoaXMuZm9jdXMoKVxuICAgIH1cbiAgfSlcblxuICAvLyBhdm9pZCBjb25mbGljdCB3aGVuIGNsaWNraW5nIGEgdG9nZ2xlciBvZiBhbiBvZmZjYW52YXMsIHdoaWxlIGFub3RoZXIgaXMgb3BlblxuICBjb25zdCBhbHJlYWR5T3BlbiA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoT1BFTl9TRUxFQ1RPUilcbiAgaWYgKGFscmVhZHlPcGVuICYmIGFscmVhZHlPcGVuICE9PSB0YXJnZXQpIHtcbiAgICBPZmZjYW52YXMuZ2V0SW5zdGFuY2UoYWxyZWFkeU9wZW4pLmhpZGUoKVxuICB9XG5cbiAgY29uc3QgZGF0YSA9IE9mZmNhbnZhcy5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldClcbiAgZGF0YS50b2dnbGUodGhpcylcbn0pXG5cbkV2ZW50SGFuZGxlci5vbih3aW5kb3csIEVWRU5UX0xPQURfREFUQV9BUEksICgpID0+IHtcbiAgZm9yIChjb25zdCBzZWxlY3RvciBvZiBTZWxlY3RvckVuZ2luZS5maW5kKE9QRU5fU0VMRUNUT1IpKSB7XG4gICAgT2ZmY2FudmFzLmdldE9yQ3JlYXRlSW5zdGFuY2Uoc2VsZWN0b3IpLnNob3coKVxuICB9XG59KVxuXG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9SRVNJWkUsICgpID0+IHtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIFNlbGVjdG9yRW5naW5lLmZpbmQoJ1thcmlhLW1vZGFsXVtjbGFzcyo9c2hvd11bY2xhc3MqPW9mZmNhbnZhcy1dJykpIHtcbiAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiAhPT0gJ2ZpeGVkJykge1xuICAgICAgT2ZmY2FudmFzLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCkuaGlkZSgpXG4gICAgfVxuICB9XG59KVxuXG5lbmFibGVEaXNtaXNzVHJpZ2dlcihPZmZjYW52YXMpXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKE9mZmNhbnZhcylcblxuZXhwb3J0IGRlZmF1bHQgT2ZmY2FudmFzXG4iLCIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9zYW5pdGl6ZXIuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG4vLyBqcy1kb2NzLXN0YXJ0IGFsbG93LWxpc3RcbmNvbnN0IEFSSUFfQVRUUklCVVRFX1BBVFRFUk4gPSAvXmFyaWEtW1xcdy1dKiQvaVxuXG5leHBvcnQgY29uc3QgRGVmYXVsdEFsbG93bGlzdCA9IHtcbiAgLy8gR2xvYmFsIGF0dHJpYnV0ZXMgYWxsb3dlZCBvbiBhbnkgc3VwcGxpZWQgZWxlbWVudCBiZWxvdy5cbiAgJyonOiBbJ2NsYXNzJywgJ2RpcicsICdpZCcsICdsYW5nJywgJ3JvbGUnLCBBUklBX0FUVFJJQlVURV9QQVRURVJOXSxcbiAgYTogWyd0YXJnZXQnLCAnaHJlZicsICd0aXRsZScsICdyZWwnXSxcbiAgYXJlYTogW10sXG4gIGI6IFtdLFxuICBicjogW10sXG4gIGNvbDogW10sXG4gIGNvZGU6IFtdLFxuICBkZDogW10sXG4gIGRpdjogW10sXG4gIGRsOiBbXSxcbiAgZHQ6IFtdLFxuICBlbTogW10sXG4gIGhyOiBbXSxcbiAgaDE6IFtdLFxuICBoMjogW10sXG4gIGgzOiBbXSxcbiAgaDQ6IFtdLFxuICBoNTogW10sXG4gIGg2OiBbXSxcbiAgaTogW10sXG4gIGltZzogWydzcmMnLCAnc3Jjc2V0JywgJ2FsdCcsICd0aXRsZScsICd3aWR0aCcsICdoZWlnaHQnXSxcbiAgbGk6IFtdLFxuICBvbDogW10sXG4gIHA6IFtdLFxuICBwcmU6IFtdLFxuICBzOiBbXSxcbiAgc21hbGw6IFtdLFxuICBzcGFuOiBbXSxcbiAgc3ViOiBbXSxcbiAgc3VwOiBbXSxcbiAgc3Ryb25nOiBbXSxcbiAgdTogW10sXG4gIHVsOiBbXVxufVxuLy8ganMtZG9jcy1lbmQgYWxsb3ctbGlzdFxuXG5jb25zdCB1cmlBdHRyaWJ1dGVzID0gbmV3IFNldChbXG4gICdiYWNrZ3JvdW5kJyxcbiAgJ2NpdGUnLFxuICAnaHJlZicsXG4gICdpdGVtdHlwZScsXG4gICdsb25nZGVzYycsXG4gICdwb3N0ZXInLFxuICAnc3JjJyxcbiAgJ3hsaW5rOmhyZWYnXG5dKVxuXG4vKipcbiAqIEEgcGF0dGVybiB0aGF0IHJlY29nbml6ZXMgVVJMcyB0aGF0IGFyZSBzYWZlIHdydC4gWFNTIGluIFVSTCBuYXZpZ2F0aW9uXG4gKiBjb250ZXh0cy5cbiAqXG4gKiBTaG91dC1vdXQgdG8gQW5ndWxhciBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvMTUuMi44L3BhY2thZ2VzL2NvcmUvc3JjL3Nhbml0aXphdGlvbi91cmxfc2FuaXRpemVyLnRzI0wzOFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9iZXR0ZXItcmVnZXhcbmNvbnN0IFNBRkVfVVJMX1BBVFRFUk4gPSAvXig/IWphdmFzY3JpcHQ6KSg/OlthLXowLTkrLi1dKzp8W14mOi8/I10qKD86Wy8/I118JCkpL2lcblxuY29uc3QgYWxsb3dlZEF0dHJpYnV0ZSA9IChhdHRyaWJ1dGUsIGFsbG93ZWRBdHRyaWJ1dGVMaXN0KSA9PiB7XG4gIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKVxuXG4gIGlmIChhbGxvd2VkQXR0cmlidXRlTGlzdC5pbmNsdWRlcyhhdHRyaWJ1dGVOYW1lKSkge1xuICAgIGlmICh1cmlBdHRyaWJ1dGVzLmhhcyhhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgcmV0dXJuIEJvb2xlYW4oU0FGRV9VUkxfUEFUVEVSTi50ZXN0KGF0dHJpYnV0ZS5ub2RlVmFsdWUpKVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyBDaGVjayBpZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB2YWxpZGF0ZXMgdGhlIGF0dHJpYnV0ZS5cbiAgcmV0dXJuIGFsbG93ZWRBdHRyaWJ1dGVMaXN0LmZpbHRlcihhdHRyaWJ1dGVSZWdleCA9PiBhdHRyaWJ1dGVSZWdleCBpbnN0YW5jZW9mIFJlZ0V4cClcbiAgICAuc29tZShyZWdleCA9PiByZWdleC50ZXN0KGF0dHJpYnV0ZU5hbWUpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVIdG1sKHVuc2FmZUh0bWwsIGFsbG93TGlzdCwgc2FuaXRpemVGdW5jdGlvbikge1xuICBpZiAoIXVuc2FmZUh0bWwubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuc2FmZUh0bWxcbiAgfVxuXG4gIGlmIChzYW5pdGl6ZUZ1bmN0aW9uICYmIHR5cGVvZiBzYW5pdGl6ZUZ1bmN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHNhbml0aXplRnVuY3Rpb24odW5zYWZlSHRtbClcbiAgfVxuXG4gIGNvbnN0IGRvbVBhcnNlciA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKClcbiAgY29uc3QgY3JlYXRlZERvY3VtZW50ID0gZG9tUGFyc2VyLnBhcnNlRnJvbVN0cmluZyh1bnNhZmVIdG1sLCAndGV4dC9odG1sJylcbiAgY29uc3QgZWxlbWVudHMgPSBbXS5jb25jYXQoLi4uY3JlYXRlZERvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvckFsbCgnKicpKVxuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgIGNvbnN0IGVsZW1lbnROYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXG5cbiAgICBpZiAoIU9iamVjdC5rZXlzKGFsbG93TGlzdCkuaW5jbHVkZXMoZWxlbWVudE5hbWUpKSB7XG4gICAgICBlbGVtZW50LnJlbW92ZSgpXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZUxpc3QgPSBbXS5jb25jYXQoLi4uZWxlbWVudC5hdHRyaWJ1dGVzKVxuICAgIGNvbnN0IGFsbG93ZWRBdHRyaWJ1dGVzID0gW10uY29uY2F0KGFsbG93TGlzdFsnKiddIHx8IFtdLCBhbGxvd0xpc3RbZWxlbWVudE5hbWVdIHx8IFtdKVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlTGlzdCkge1xuICAgICAgaWYgKCFhbGxvd2VkQXR0cmlidXRlKGF0dHJpYnV0ZSwgYWxsb3dlZEF0dHJpYnV0ZXMpKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZS5ub2RlTmFtZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY3JlYXRlZERvY3VtZW50LmJvZHkuaW5uZXJIVE1MXG59XG4iLCIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC90ZW1wbGF0ZS1mYWN0b3J5LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IFNlbGVjdG9yRW5naW5lIGZyb20gJy4uL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQgQ29uZmlnIGZyb20gJy4vY29uZmlnLmpzJ1xuaW1wb3J0IHsgRGVmYXVsdEFsbG93bGlzdCwgc2FuaXRpemVIdG1sIH0gZnJvbSAnLi9zYW5pdGl6ZXIuanMnXG5pbXBvcnQgeyBleGVjdXRlLCBnZXRFbGVtZW50LCBpc0VsZW1lbnQgfSBmcm9tICcuL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnVGVtcGxhdGVGYWN0b3J5J1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBhbGxvd0xpc3Q6IERlZmF1bHRBbGxvd2xpc3QsXG4gIGNvbnRlbnQ6IHt9LCAvLyB7IHNlbGVjdG9yIDogdGV4dCAsICBzZWxlY3RvcjIgOiB0ZXh0MiAsIH1cbiAgZXh0cmFDbGFzczogJycsXG4gIGh0bWw6IGZhbHNlLFxuICBzYW5pdGl6ZTogdHJ1ZSxcbiAgc2FuaXRpemVGbjogbnVsbCxcbiAgdGVtcGxhdGU6ICc8ZGl2PjwvZGl2Pidcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGFsbG93TGlzdDogJ29iamVjdCcsXG4gIGNvbnRlbnQ6ICdvYmplY3QnLFxuICBleHRyYUNsYXNzOiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICBodG1sOiAnYm9vbGVhbicsXG4gIHNhbml0aXplOiAnYm9vbGVhbicsXG4gIHNhbml0aXplRm46ICcobnVsbHxmdW5jdGlvbiknLFxuICB0ZW1wbGF0ZTogJ3N0cmluZydcbn1cblxuY29uc3QgRGVmYXVsdENvbnRlbnRUeXBlID0ge1xuICBlbnRyeTogJyhzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbnxudWxsKScsXG4gIHNlbGVjdG9yOiAnKHN0cmluZ3xlbGVtZW50KSdcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgVGVtcGxhdGVGYWN0b3J5IGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpXG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIGdldENvbnRlbnQoKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fY29uZmlnLmNvbnRlbnQpXG4gICAgICAubWFwKGNvbmZpZyA9PiB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbihjb25maWcpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICB9XG5cbiAgaGFzQ29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb250ZW50KCkubGVuZ3RoID4gMFxuICB9XG5cbiAgY2hhbmdlQ29udGVudChjb250ZW50KSB7XG4gICAgdGhpcy5fY2hlY2tDb250ZW50KGNvbnRlbnQpXG4gICAgdGhpcy5fY29uZmlnLmNvbnRlbnQgPSB7IC4uLnRoaXMuX2NvbmZpZy5jb250ZW50LCAuLi5jb250ZW50IH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgdG9IdG1sKCkge1xuICAgIGNvbnN0IHRlbXBsYXRlV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgdGVtcGxhdGVXcmFwcGVyLmlubmVySFRNTCA9IHRoaXMuX21heWJlU2FuaXRpemUodGhpcy5fY29uZmlnLnRlbXBsYXRlKVxuXG4gICAgZm9yIChjb25zdCBbc2VsZWN0b3IsIHRleHRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX2NvbmZpZy5jb250ZW50KSkge1xuICAgICAgdGhpcy5fc2V0Q29udGVudCh0ZW1wbGF0ZVdyYXBwZXIsIHRleHQsIHNlbGVjdG9yKVxuICAgIH1cblxuICAgIGNvbnN0IHRlbXBsYXRlID0gdGVtcGxhdGVXcmFwcGVyLmNoaWxkcmVuWzBdXG4gICAgY29uc3QgZXh0cmFDbGFzcyA9IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5leHRyYUNsYXNzKVxuXG4gICAgaWYgKGV4dHJhQ2xhc3MpIHtcbiAgICAgIHRlbXBsYXRlLmNsYXNzTGlzdC5hZGQoLi4uZXh0cmFDbGFzcy5zcGxpdCgnICcpKVxuICAgIH1cblxuICAgIHJldHVybiB0ZW1wbGF0ZVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfdHlwZUNoZWNrQ29uZmlnKGNvbmZpZykge1xuICAgIHN1cGVyLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKVxuICAgIHRoaXMuX2NoZWNrQ29udGVudChjb25maWcuY29udGVudClcbiAgfVxuXG4gIF9jaGVja0NvbnRlbnQoYXJnKSB7XG4gICAgZm9yIChjb25zdCBbc2VsZWN0b3IsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKGFyZykpIHtcbiAgICAgIHN1cGVyLl90eXBlQ2hlY2tDb25maWcoeyBzZWxlY3RvciwgZW50cnk6IGNvbnRlbnQgfSwgRGVmYXVsdENvbnRlbnRUeXBlKVxuICAgIH1cbiAgfVxuXG4gIF9zZXRDb250ZW50KHRlbXBsYXRlLCBjb250ZW50LCBzZWxlY3Rvcikge1xuICAgIGNvbnN0IHRlbXBsYXRlRWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IsIHRlbXBsYXRlKVxuXG4gICAgaWYgKCF0ZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnRlbnQgPSB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbihjb250ZW50KVxuXG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICB0ZW1wbGF0ZUVsZW1lbnQucmVtb3ZlKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChpc0VsZW1lbnQoY29udGVudCkpIHtcbiAgICAgIHRoaXMuX3B1dEVsZW1lbnRJblRlbXBsYXRlKGdldEVsZW1lbnQoY29udGVudCksIHRlbXBsYXRlRWxlbWVudClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jb25maWcuaHRtbCkge1xuICAgICAgdGVtcGxhdGVFbGVtZW50LmlubmVySFRNTCA9IHRoaXMuX21heWJlU2FuaXRpemUoY29udGVudClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRlbXBsYXRlRWxlbWVudC50ZXh0Q29udGVudCA9IGNvbnRlbnRcbiAgfVxuXG4gIF9tYXliZVNhbml0aXplKGFyZykge1xuICAgIHJldHVybiB0aGlzLl9jb25maWcuc2FuaXRpemUgPyBzYW5pdGl6ZUh0bWwoYXJnLCB0aGlzLl9jb25maWcuYWxsb3dMaXN0LCB0aGlzLl9jb25maWcuc2FuaXRpemVGbikgOiBhcmdcbiAgfVxuXG4gIF9yZXNvbHZlUG9zc2libGVGdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZXhlY3V0ZShhcmcsIFt0aGlzXSlcbiAgfVxuXG4gIF9wdXRFbGVtZW50SW5UZW1wbGF0ZShlbGVtZW50LCB0ZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLmh0bWwpIHtcbiAgICAgIHRlbXBsYXRlRWxlbWVudC5pbm5lckhUTUwgPSAnJ1xuICAgICAgdGVtcGxhdGVFbGVtZW50LmFwcGVuZChlbGVtZW50KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGVtcGxhdGVFbGVtZW50LnRleHRDb250ZW50ID0gZWxlbWVudC50ZXh0Q29udGVudFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRlbXBsYXRlRmFjdG9yeVxuIiwiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHRvb2x0aXAuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgKiBhcyBQb3BwZXIgZnJvbSAnQHBvcHBlcmpzL2NvcmUnXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50LmpzJ1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyLmpzJ1xuaW1wb3J0IE1hbmlwdWxhdG9yIGZyb20gJy4vZG9tL21hbmlwdWxhdG9yLmpzJ1xuaW1wb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLCBleGVjdXRlLCBmaW5kU2hhZG93Um9vdCwgZ2V0RWxlbWVudCwgZ2V0VUlELCBpc1JUTCwgbm9vcFxufSBmcm9tICcuL3V0aWwvaW5kZXguanMnXG5pbXBvcnQgeyBEZWZhdWx0QWxsb3dsaXN0IH0gZnJvbSAnLi91dGlsL3Nhbml0aXplci5qcydcbmltcG9ydCBUZW1wbGF0ZUZhY3RvcnkgZnJvbSAnLi91dGlsL3RlbXBsYXRlLWZhY3RvcnkuanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICd0b29sdGlwJ1xuY29uc3QgRElTQUxMT1dFRF9BVFRSSUJVVEVTID0gbmV3IFNldChbJ3Nhbml0aXplJywgJ2FsbG93TGlzdCcsICdzYW5pdGl6ZUZuJ10pXG5cbmNvbnN0IENMQVNTX05BTUVfRkFERSA9ICdmYWRlJ1xuY29uc3QgQ0xBU1NfTkFNRV9NT0RBTCA9ICdtb2RhbCdcbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuXG5jb25zdCBTRUxFQ1RPUl9UT09MVElQX0lOTkVSID0gJy50b29sdGlwLWlubmVyJ1xuY29uc3QgU0VMRUNUT1JfTU9EQUwgPSBgLiR7Q0xBU1NfTkFNRV9NT0RBTH1gXG5cbmNvbnN0IEVWRU5UX01PREFMX0hJREUgPSAnaGlkZS5icy5tb2RhbCdcblxuY29uc3QgVFJJR0dFUl9IT1ZFUiA9ICdob3ZlcidcbmNvbnN0IFRSSUdHRVJfRk9DVVMgPSAnZm9jdXMnXG5jb25zdCBUUklHR0VSX0NMSUNLID0gJ2NsaWNrJ1xuY29uc3QgVFJJR0dFUl9NQU5VQUwgPSAnbWFudWFsJ1xuXG5jb25zdCBFVkVOVF9ISURFID0gJ2hpZGUnXG5jb25zdCBFVkVOVF9ISURERU4gPSAnaGlkZGVuJ1xuY29uc3QgRVZFTlRfU0hPVyA9ICdzaG93J1xuY29uc3QgRVZFTlRfU0hPV04gPSAnc2hvd24nXG5jb25zdCBFVkVOVF9JTlNFUlRFRCA9ICdpbnNlcnRlZCdcbmNvbnN0IEVWRU5UX0NMSUNLID0gJ2NsaWNrJ1xuY29uc3QgRVZFTlRfRk9DVVNJTiA9ICdmb2N1c2luJ1xuY29uc3QgRVZFTlRfRk9DVVNPVVQgPSAnZm9jdXNvdXQnXG5jb25zdCBFVkVOVF9NT1VTRUVOVEVSID0gJ21vdXNlZW50ZXInXG5jb25zdCBFVkVOVF9NT1VTRUxFQVZFID0gJ21vdXNlbGVhdmUnXG5cbmNvbnN0IEF0dGFjaG1lbnRNYXAgPSB7XG4gIEFVVE86ICdhdXRvJyxcbiAgVE9QOiAndG9wJyxcbiAgUklHSFQ6IGlzUlRMKCkgPyAnbGVmdCcgOiAncmlnaHQnLFxuICBCT1RUT006ICdib3R0b20nLFxuICBMRUZUOiBpc1JUTCgpID8gJ3JpZ2h0JyA6ICdsZWZ0J1xufVxuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBhbGxvd0xpc3Q6IERlZmF1bHRBbGxvd2xpc3QsXG4gIGFuaW1hdGlvbjogdHJ1ZSxcbiAgYm91bmRhcnk6ICdjbGlwcGluZ1BhcmVudHMnLFxuICBjb250YWluZXI6IGZhbHNlLFxuICBjdXN0b21DbGFzczogJycsXG4gIGRlbGF5OiAwLFxuICBmYWxsYmFja1BsYWNlbWVudHM6IFsndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0J10sXG4gIGh0bWw6IGZhbHNlLFxuICBvZmZzZXQ6IFswLCA2XSxcbiAgcGxhY2VtZW50OiAndG9wJyxcbiAgcG9wcGVyQ29uZmlnOiBudWxsLFxuICBzYW5pdGl6ZTogdHJ1ZSxcbiAgc2FuaXRpemVGbjogbnVsbCxcbiAgc2VsZWN0b3I6IGZhbHNlLFxuICB0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9XCJ0b29sdGlwXCIgcm9sZT1cInRvb2x0aXBcIj4nICtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwidG9vbHRpcC1hcnJvd1wiPjwvZGl2PicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJ0b29sdGlwLWlubmVyXCI+PC9kaXY+JyArXG4gICAgICAgICAgICAnPC9kaXY+JyxcbiAgdGl0bGU6ICcnLFxuICB0cmlnZ2VyOiAnaG92ZXIgZm9jdXMnXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBhbGxvd0xpc3Q6ICdvYmplY3QnLFxuICBhbmltYXRpb246ICdib29sZWFuJyxcbiAgYm91bmRhcnk6ICcoc3RyaW5nfGVsZW1lbnQpJyxcbiAgY29udGFpbmVyOiAnKHN0cmluZ3xlbGVtZW50fGJvb2xlYW4pJyxcbiAgY3VzdG9tQ2xhc3M6ICcoc3RyaW5nfGZ1bmN0aW9uKScsXG4gIGRlbGF5OiAnKG51bWJlcnxvYmplY3QpJyxcbiAgZmFsbGJhY2tQbGFjZW1lbnRzOiAnYXJyYXknLFxuICBodG1sOiAnYm9vbGVhbicsXG4gIG9mZnNldDogJyhhcnJheXxzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgcGxhY2VtZW50OiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICBwb3BwZXJDb25maWc6ICcobnVsbHxvYmplY3R8ZnVuY3Rpb24pJyxcbiAgc2FuaXRpemU6ICdib29sZWFuJyxcbiAgc2FuaXRpemVGbjogJyhudWxsfGZ1bmN0aW9uKScsXG4gIHNlbGVjdG9yOiAnKHN0cmluZ3xib29sZWFuKScsXG4gIHRlbXBsYXRlOiAnc3RyaW5nJyxcbiAgdGl0bGU6ICcoc3RyaW5nfGVsZW1lbnR8ZnVuY3Rpb24pJyxcbiAgdHJpZ2dlcjogJ3N0cmluZydcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgVG9vbHRpcCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBpZiAodHlwZW9mIFBvcHBlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Jvb3RzdHJhcFxcJ3MgdG9vbHRpcHMgcmVxdWlyZSBQb3BwZXIgKGh0dHBzOi8vcG9wcGVyLmpzLm9yZyknKVxuICAgIH1cblxuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZylcblxuICAgIC8vIFByaXZhdGVcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSB0cnVlXG4gICAgdGhpcy5fdGltZW91dCA9IDBcbiAgICB0aGlzLl9pc0hvdmVyZWQgPSBudWxsXG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlciA9IHt9XG4gICAgdGhpcy5fcG9wcGVyID0gbnVsbFxuICAgIHRoaXMuX3RlbXBsYXRlRmFjdG9yeSA9IG51bGxcbiAgICB0aGlzLl9uZXdDb250ZW50ID0gbnVsbFxuXG4gICAgLy8gUHJvdGVjdGVkXG4gICAgdGhpcy50aXAgPSBudWxsXG5cbiAgICB0aGlzLl9zZXRMaXN0ZW5lcnMoKVxuXG4gICAgaWYgKCF0aGlzLl9jb25maWcuc2VsZWN0b3IpIHtcbiAgICAgIHRoaXMuX2ZpeFRpdGxlKClcbiAgICB9XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIGVuYWJsZSgpIHtcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSB0cnVlXG4gIH1cblxuICBkaXNhYmxlKCkge1xuICAgIHRoaXMuX2lzRW5hYmxlZCA9IGZhbHNlXG4gIH1cblxuICB0b2dnbGVFbmFibGVkKCkge1xuICAgIHRoaXMuX2lzRW5hYmxlZCA9ICF0aGlzLl9pc0VuYWJsZWRcbiAgfVxuXG4gIHRvZ2dsZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlci5jbGljayA9ICF0aGlzLl9hY3RpdmVUcmlnZ2VyLmNsaWNrXG4gICAgaWYgKHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgdGhpcy5fbGVhdmUoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZW50ZXIoKVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dClcblxuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX01PREFMKSwgRVZFTlRfTU9EQUxfSElERSwgdGhpcy5faGlkZU1vZGFsSGFuZGxlcilcblxuICAgIGlmICh0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1icy1vcmlnaW5hbC10aXRsZScpKSB7XG4gICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCB0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1icy1vcmlnaW5hbC10aXRsZScpKVxuICAgIH1cblxuICAgIHRoaXMuX2Rpc3Bvc2VQb3BwZXIoKVxuICAgIHN1cGVyLmRpc3Bvc2UoKVxuICB9XG5cbiAgc2hvdygpIHtcbiAgICBpZiAodGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHVzZSBzaG93IG9uIHZpc2libGUgZWxlbWVudHMnKVxuICAgIH1cblxuICAgIGlmICghKHRoaXMuX2lzV2l0aENvbnRlbnQoKSAmJiB0aGlzLl9pc0VuYWJsZWQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9TSE9XKSlcbiAgICBjb25zdCBzaGFkb3dSb290ID0gZmluZFNoYWRvd1Jvb3QodGhpcy5fZWxlbWVudClcbiAgICBjb25zdCBpc0luVGhlRG9tID0gKHNoYWRvd1Jvb3QgfHwgdGhpcy5fZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuY29udGFpbnModGhpcy5fZWxlbWVudClcblxuICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCB8fCAhaXNJblRoZURvbSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gVE9ETzogdjYgcmVtb3ZlIHRoaXMgb3IgbWFrZSBpdCBvcHRpb25hbFxuICAgIHRoaXMuX2Rpc3Bvc2VQb3BwZXIoKVxuXG4gICAgY29uc3QgdGlwID0gdGhpcy5fZ2V0VGlwRWxlbWVudCgpXG5cbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIHRpcC5nZXRBdHRyaWJ1dGUoJ2lkJykpXG5cbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gdGhpcy5fY29uZmlnXG5cbiAgICBpZiAoIXRoaXMuX2VsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnModGhpcy50aXApKSB7XG4gICAgICBjb250YWluZXIuYXBwZW5kKHRpcClcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0lOU0VSVEVEKSlcbiAgICB9XG5cbiAgICB0aGlzLl9wb3BwZXIgPSB0aGlzLl9jcmVhdGVQb3BwZXIodGlwKVxuXG4gICAgdGlwLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIGFkZCBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgdG8gdGhlIGJvZHkncyBpbW1lZGlhdGUgY2hpbGRyZW47XG4gICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTQvMDIvbW91c2VfZXZlbnRfYnViLmh0bWxcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW10uY29uY2F0KC4uLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbihlbGVtZW50LCAnbW91c2VvdmVyJywgbm9vcClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX1NIT1dOKSlcblxuICAgICAgaWYgKHRoaXMuX2lzSG92ZXJlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5fbGVhdmUoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9pc0hvdmVyZWQgPSBmYWxzZVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMudGlwLCB0aGlzLl9pc0FuaW1hdGVkKCkpXG4gIH1cblxuICBoaWRlKCkge1xuICAgIGlmICghdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9ISURFKSlcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHRpcCA9IHRoaXMuX2dldFRpcEVsZW1lbnQoKVxuICAgIHRpcC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcblxuICAgIC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSByZW1vdmUgdGhlIGV4dHJhXG4gICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB3ZSBhZGRlZCBmb3IgaU9TIHN1cHBvcnRcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW10uY29uY2F0KC4uLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlcltUUklHR0VSX0NMSUNLXSA9IGZhbHNlXG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlcltUUklHR0VSX0ZPQ1VTXSA9IGZhbHNlXG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlcltUUklHR0VSX0hPVkVSXSA9IGZhbHNlXG4gICAgdGhpcy5faXNIb3ZlcmVkID0gbnVsbCAvLyBpdCBpcyBhIHRyaWNrIHRvIHN1cHBvcnQgbWFudWFsIHRyaWdnZXJpbmdcblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5fZGlzcG9zZVBvcHBlcigpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5JylcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0hJRERFTikpXG4gICAgfVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy50aXAsIHRoaXMuX2lzQW5pbWF0ZWQoKSlcbiAgfVxuXG4gIHVwZGF0ZSgpIHtcbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIudXBkYXRlKClcbiAgICB9XG4gIH1cblxuICAvLyBQcm90ZWN0ZWRcbiAgX2lzV2l0aENvbnRlbnQoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fZ2V0VGl0bGUoKSlcbiAgfVxuXG4gIF9nZXRUaXBFbGVtZW50KCkge1xuICAgIGlmICghdGhpcy50aXApIHtcbiAgICAgIHRoaXMudGlwID0gdGhpcy5fY3JlYXRlVGlwRWxlbWVudCh0aGlzLl9uZXdDb250ZW50IHx8IHRoaXMuX2dldENvbnRlbnRGb3JUZW1wbGF0ZSgpKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRpcFxuICB9XG5cbiAgX2NyZWF0ZVRpcEVsZW1lbnQoY29udGVudCkge1xuICAgIGNvbnN0IHRpcCA9IHRoaXMuX2dldFRlbXBsYXRlRmFjdG9yeShjb250ZW50KS50b0h0bWwoKVxuXG4gICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgY2hlY2sgaW4gdjZcbiAgICBpZiAoIXRpcCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB0aXAuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0ZBREUsIENMQVNTX05BTUVfU0hPVylcbiAgICAvLyBUT0RPOiB2NiB0aGUgZm9sbG93aW5nIGNhbiBiZSBhY2hpZXZlZCB3aXRoIENTUyBvbmx5XG4gICAgdGlwLmNsYXNzTGlzdC5hZGQoYGJzLSR7dGhpcy5jb25zdHJ1Y3Rvci5OQU1FfS1hdXRvYClcblxuICAgIGNvbnN0IHRpcElkID0gZ2V0VUlEKHRoaXMuY29uc3RydWN0b3IuTkFNRSkudG9TdHJpbmcoKVxuXG4gICAgdGlwLnNldEF0dHJpYnV0ZSgnaWQnLCB0aXBJZClcblxuICAgIGlmICh0aGlzLl9pc0FuaW1hdGVkKCkpIHtcbiAgICAgIHRpcC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfRkFERSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGlwXG4gIH1cblxuICBzZXRDb250ZW50KGNvbnRlbnQpIHtcbiAgICB0aGlzLl9uZXdDb250ZW50ID0gY29udGVudFxuICAgIGlmICh0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHRoaXMuX2Rpc3Bvc2VQb3BwZXIoKVxuICAgICAgdGhpcy5zaG93KClcbiAgICB9XG4gIH1cblxuICBfZ2V0VGVtcGxhdGVGYWN0b3J5KGNvbnRlbnQpIHtcbiAgICBpZiAodGhpcy5fdGVtcGxhdGVGYWN0b3J5KSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZUZhY3RvcnkuY2hhbmdlQ29udGVudChjb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZUZhY3RvcnkgPSBuZXcgVGVtcGxhdGVGYWN0b3J5KHtcbiAgICAgICAgLi4udGhpcy5fY29uZmlnLFxuICAgICAgICAvLyB0aGUgYGNvbnRlbnRgIHZhciBoYXMgdG8gYmUgYWZ0ZXIgYHRoaXMuX2NvbmZpZ2BcbiAgICAgICAgLy8gdG8gb3ZlcnJpZGUgY29uZmlnLmNvbnRlbnQgaW4gY2FzZSBvZiBwb3BvdmVyXG4gICAgICAgIGNvbnRlbnQsXG4gICAgICAgIGV4dHJhQ2xhc3M6IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5jdXN0b21DbGFzcylcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3RlbXBsYXRlRmFjdG9yeVxuICB9XG5cbiAgX2dldENvbnRlbnRGb3JUZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgW1NFTEVDVE9SX1RPT0xUSVBfSU5ORVJdOiB0aGlzLl9nZXRUaXRsZSgpXG4gICAgfVxuICB9XG5cbiAgX2dldFRpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbih0aGlzLl9jb25maWcudGl0bGUpIHx8IHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJylcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2luaXRpYWxpemVPbkRlbGVnYXRlZFRhcmdldChldmVudCkge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLmdldE9yQ3JlYXRlSW5zdGFuY2UoZXZlbnQuZGVsZWdhdGVUYXJnZXQsIHRoaXMuX2dldERlbGVnYXRlQ29uZmlnKCkpXG4gIH1cblxuICBfaXNBbmltYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLmFuaW1hdGlvbiB8fCAodGhpcy50aXAgJiYgdGhpcy50aXAuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSkpXG4gIH1cblxuICBfaXNTaG93bigpIHtcbiAgICByZXR1cm4gdGhpcy50aXAgJiYgdGhpcy50aXAuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU0hPVylcbiAgfVxuXG4gIF9jcmVhdGVQb3BwZXIodGlwKSB7XG4gICAgY29uc3QgcGxhY2VtZW50ID0gZXhlY3V0ZSh0aGlzLl9jb25maWcucGxhY2VtZW50LCBbdGhpcywgdGlwLCB0aGlzLl9lbGVtZW50XSlcbiAgICBjb25zdCBhdHRhY2htZW50ID0gQXR0YWNobWVudE1hcFtwbGFjZW1lbnQudG9VcHBlckNhc2UoKV1cbiAgICByZXR1cm4gUG9wcGVyLmNyZWF0ZVBvcHBlcih0aGlzLl9lbGVtZW50LCB0aXAsIHRoaXMuX2dldFBvcHBlckNvbmZpZyhhdHRhY2htZW50KSlcbiAgfVxuXG4gIF9nZXRPZmZzZXQoKSB7XG4gICAgY29uc3QgeyBvZmZzZXQgfSA9IHRoaXMuX2NvbmZpZ1xuXG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gb2Zmc2V0LnNwbGl0KCcsJykubWFwKHZhbHVlID0+IE51bWJlci5wYXJzZUludCh2YWx1ZSwgMTApKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcG9wcGVyRGF0YSA9PiBvZmZzZXQocG9wcGVyRGF0YSwgdGhpcy5fZWxlbWVudClcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0XG4gIH1cblxuICBfcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGV4ZWN1dGUoYXJnLCBbdGhpcy5fZWxlbWVudF0pXG4gIH1cblxuICBfZ2V0UG9wcGVyQ29uZmlnKGF0dGFjaG1lbnQpIHtcbiAgICBjb25zdCBkZWZhdWx0QnNQb3BwZXJDb25maWcgPSB7XG4gICAgICBwbGFjZW1lbnQ6IGF0dGFjaG1lbnQsXG4gICAgICBtb2RpZmllcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdmbGlwJyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBmYWxsYmFja1BsYWNlbWVudHM6IHRoaXMuX2NvbmZpZy5mYWxsYmFja1BsYWNlbWVudHNcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnb2Zmc2V0JyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBvZmZzZXQ6IHRoaXMuX2dldE9mZnNldCgpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgYm91bmRhcnk6IHRoaXMuX2NvbmZpZy5ib3VuZGFyeVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdhcnJvdycsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgZWxlbWVudDogYC4ke3RoaXMuY29uc3RydWN0b3IuTkFNRX0tYXJyb3dgXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3ByZVNldFBsYWNlbWVudCcsXG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBwaGFzZTogJ2JlZm9yZU1haW4nLFxuICAgICAgICAgIGZuOiBkYXRhID0+IHtcbiAgICAgICAgICAgIC8vIFByZS1zZXQgUG9wcGVyJ3MgcGxhY2VtZW50IGF0dHJpYnV0ZSBpbiBvcmRlciB0byByZWFkIHRoZSBhcnJvdyBzaXplcyBwcm9wZXJseS5cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgUG9wcGVyIG1peGVzIHVwIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRpbWVuc2lvbnMgc2luY2UgdGhlIGluaXRpYWwgYXJyb3cgc3R5bGUgaXMgZm9yIHRvcCBwbGFjZW1lbnRcbiAgICAgICAgICAgIHRoaXMuX2dldFRpcEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcG9wcGVyLXBsYWNlbWVudCcsIGRhdGEuc3RhdGUucGxhY2VtZW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWZhdWx0QnNQb3BwZXJDb25maWcsXG4gICAgICAuLi5leGVjdXRlKHRoaXMuX2NvbmZpZy5wb3BwZXJDb25maWcsIFtkZWZhdWx0QnNQb3BwZXJDb25maWddKVxuICAgIH1cbiAgfVxuXG4gIF9zZXRMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSB0aGlzLl9jb25maWcudHJpZ2dlci5zcGxpdCgnICcpXG5cbiAgICBmb3IgKGNvbnN0IHRyaWdnZXIgb2YgdHJpZ2dlcnMpIHtcbiAgICAgIGlmICh0cmlnZ2VyID09PSAnY2xpY2snKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9DTElDSyksIHRoaXMuX2NvbmZpZy5zZWxlY3RvciwgZXZlbnQgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9pbml0aWFsaXplT25EZWxlZ2F0ZWRUYXJnZXQoZXZlbnQpXG4gICAgICAgICAgY29udGV4dC50b2dnbGUoKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyICE9PSBUUklHR0VSX01BTlVBTCkge1xuICAgICAgICBjb25zdCBldmVudEluID0gdHJpZ2dlciA9PT0gVFJJR0dFUl9IT1ZFUiA/XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfTU9VU0VFTlRFUikgOlxuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0ZPQ1VTSU4pXG4gICAgICAgIGNvbnN0IGV2ZW50T3V0ID0gdHJpZ2dlciA9PT0gVFJJR0dFUl9IT1ZFUiA/XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfTU9VU0VMRUFWRSkgOlxuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0ZPQ1VTT1VUKVxuXG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBldmVudEluLCB0aGlzLl9jb25maWcuc2VsZWN0b3IsIGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5faW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KGV2ZW50KVxuICAgICAgICAgIGNvbnRleHQuX2FjdGl2ZVRyaWdnZXJbZXZlbnQudHlwZSA9PT0gJ2ZvY3VzaW4nID8gVFJJR0dFUl9GT0NVUyA6IFRSSUdHRVJfSE9WRVJdID0gdHJ1ZVxuICAgICAgICAgIGNvbnRleHQuX2VudGVyKClcbiAgICAgICAgfSlcbiAgICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIGV2ZW50T3V0LCB0aGlzLl9jb25maWcuc2VsZWN0b3IsIGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5faW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KGV2ZW50KVxuICAgICAgICAgIGNvbnRleHQuX2FjdGl2ZVRyaWdnZXJbZXZlbnQudHlwZSA9PT0gJ2ZvY3Vzb3V0JyA/IFRSSUdHRVJfRk9DVVMgOiBUUklHR0VSX0hPVkVSXSA9XG4gICAgICAgICAgICBjb250ZXh0Ll9lbGVtZW50LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpXG5cbiAgICAgICAgICBjb250ZXh0Ll9sZWF2ZSgpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5faGlkZU1vZGFsSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9lbGVtZW50KSB7XG4gICAgICAgIHRoaXMuaGlkZSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9NT0RBTCksIEVWRU5UX01PREFMX0hJREUsIHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIpXG4gIH1cblxuICBfZml4VGl0bGUoKSB7XG4gICAgY29uc3QgdGl0bGUgPSB0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgndGl0bGUnKVxuXG4gICAgaWYgKCF0aXRsZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpICYmICF0aGlzLl9lbGVtZW50LnRleHRDb250ZW50LnRyaW0oKSkge1xuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0aXRsZSlcbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1icy1vcmlnaW5hbC10aXRsZScsIHRpdGxlKSAvLyBETyBOT1QgVVNFIElULiBJcyBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0aXRsZScpXG4gIH1cblxuICBfZW50ZXIoKSB7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24oKSB8fCB0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgIHRoaXMuX2lzSG92ZXJlZCA9IHRydWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2lzSG92ZXJlZCA9IHRydWVcblxuICAgIHRoaXMuX3NldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2lzSG92ZXJlZCkge1xuICAgICAgICB0aGlzLnNob3coKVxuICAgICAgfVxuICAgIH0sIHRoaXMuX2NvbmZpZy5kZWxheS5zaG93KVxuICB9XG5cbiAgX2xlYXZlKCkge1xuICAgIGlmICh0aGlzLl9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2lzSG92ZXJlZCA9IGZhbHNlXG5cbiAgICB0aGlzLl9zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5faXNIb3ZlcmVkKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpXG4gICAgICB9XG4gICAgfSwgdGhpcy5fY29uZmlnLmRlbGF5LmhpZGUpXG4gIH1cblxuICBfc2V0VGltZW91dChoYW5kbGVyLCB0aW1lb3V0KSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpXG4gICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoaGFuZGxlciwgdGltZW91dClcbiAgfVxuXG4gIF9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX2FjdGl2ZVRyaWdnZXIpLmluY2x1ZGVzKHRydWUpXG4gIH1cblxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbnN0IGRhdGFBdHRyaWJ1dGVzID0gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZXModGhpcy5fZWxlbWVudClcblxuICAgIGZvciAoY29uc3QgZGF0YUF0dHJpYnV0ZSBvZiBPYmplY3Qua2V5cyhkYXRhQXR0cmlidXRlcykpIHtcbiAgICAgIGlmIChESVNBTExPV0VEX0FUVFJJQlVURVMuaGFzKGRhdGFBdHRyaWJ1dGUpKSB7XG4gICAgICAgIGRlbGV0ZSBkYXRhQXR0cmlidXRlc1tkYXRhQXR0cmlidXRlXVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbmZpZyA9IHtcbiAgICAgIC4uLmRhdGFBdHRyaWJ1dGVzLFxuICAgICAgLi4uKHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnICYmIGNvbmZpZyA/IGNvbmZpZyA6IHt9KVxuICAgIH1cbiAgICBjb25maWcgPSB0aGlzLl9tZXJnZUNvbmZpZ09iaihjb25maWcpXG4gICAgY29uZmlnID0gdGhpcy5fY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpXG4gICAgdGhpcy5fdHlwZUNoZWNrQ29uZmlnKGNvbmZpZylcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICBjb25maWcuY29udGFpbmVyID0gY29uZmlnLmNvbnRhaW5lciA9PT0gZmFsc2UgPyBkb2N1bWVudC5ib2R5IDogZ2V0RWxlbWVudChjb25maWcuY29udGFpbmVyKVxuXG4gICAgaWYgKHR5cGVvZiBjb25maWcuZGVsYXkgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25maWcuZGVsYXkgPSB7XG4gICAgICAgIHNob3c6IGNvbmZpZy5kZWxheSxcbiAgICAgICAgaGlkZTogY29uZmlnLmRlbGF5XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb25maWcudGl0bGUgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25maWcudGl0bGUgPSBjb25maWcudGl0bGUudG9TdHJpbmcoKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29uZmlnLmNvbnRlbnQgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25maWcuY29udGVudCA9IGNvbmZpZy5jb250ZW50LnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfZ2V0RGVsZWdhdGVDb25maWcoKSB7XG4gICAgY29uc3QgY29uZmlnID0ge31cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX2NvbmZpZykpIHtcbiAgICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRba2V5XSAhPT0gdmFsdWUpIHtcbiAgICAgICAgY29uZmlnW2tleV0gPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbmZpZy5zZWxlY3RvciA9IGZhbHNlXG4gICAgY29uZmlnLnRyaWdnZXIgPSAnbWFudWFsJ1xuXG4gICAgLy8gSW4gdGhlIGZ1dHVyZSBjYW4gYmUgcmVwbGFjZWQgd2l0aDpcbiAgICAvLyBjb25zdCBrZXlzV2l0aERpZmZlcmVudFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuX2NvbmZpZykuZmlsdGVyKGVudHJ5ID0+IHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtlbnRyeVswXV0gIT09IHRoaXMuX2NvbmZpZ1tlbnRyeVswXV0pXG4gICAgLy8gYE9iamVjdC5mcm9tRW50cmllcyhrZXlzV2l0aERpZmZlcmVudFZhbHVlcylgXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2Rpc3Bvc2VQb3BwZXIoKSB7XG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLmRlc3Ryb3koKVxuICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbFxuICAgIH1cblxuICAgIGlmICh0aGlzLnRpcCkge1xuICAgICAgdGhpcy50aXAucmVtb3ZlKClcbiAgICAgIHRoaXMudGlwID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFRvb2x0aXAuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKClcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFRvb2x0aXApXG5cbmV4cG9ydCBkZWZhdWx0IFRvb2x0aXBcbiIsIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBwb3BvdmVyLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IFRvb2x0aXAgZnJvbSAnLi90b29sdGlwLmpzJ1xuaW1wb3J0IHsgZGVmaW5lSlF1ZXJ5UGx1Z2luIH0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAncG9wb3ZlcidcblxuY29uc3QgU0VMRUNUT1JfVElUTEUgPSAnLnBvcG92ZXItaGVhZGVyJ1xuY29uc3QgU0VMRUNUT1JfQ09OVEVOVCA9ICcucG9wb3Zlci1ib2R5J1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICAuLi5Ub29sdGlwLkRlZmF1bHQsXG4gIGNvbnRlbnQ6ICcnLFxuICBvZmZzZXQ6IFswLCA4XSxcbiAgcGxhY2VtZW50OiAncmlnaHQnLFxuICB0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9XCJwb3BvdmVyXCIgcm9sZT1cInRvb2x0aXBcIj4nICtcbiAgICAnPGRpdiBjbGFzcz1cInBvcG92ZXItYXJyb3dcIj48L2Rpdj4nICtcbiAgICAnPGgzIGNsYXNzPVwicG9wb3Zlci1oZWFkZXJcIj48L2gzPicgK1xuICAgICc8ZGl2IGNsYXNzPVwicG9wb3Zlci1ib2R5XCI+PC9kaXY+JyArXG4gICAgJzwvZGl2PicsXG4gIHRyaWdnZXI6ICdjbGljaydcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIC4uLlRvb2x0aXAuRGVmYXVsdFR5cGUsXG4gIGNvbnRlbnQ6ICcobnVsbHxzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbiknXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFBvcG92ZXIgZXh0ZW5kcyBUb29sdGlwIHtcbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIE92ZXJyaWRlc1xuICBfaXNXaXRoQ29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0VGl0bGUoKSB8fCB0aGlzLl9nZXRDb250ZW50KClcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2dldENvbnRlbnRGb3JUZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgW1NFTEVDVE9SX1RJVExFXTogdGhpcy5fZ2V0VGl0bGUoKSxcbiAgICAgIFtTRUxFQ1RPUl9DT05URU5UXTogdGhpcy5fZ2V0Q29udGVudCgpXG4gICAgfVxuICB9XG5cbiAgX2dldENvbnRlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5jb250ZW50KVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gUG9wb3Zlci5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgfVxuXG4gICAgICBkYXRhW2NvbmZpZ10oKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oUG9wb3ZlcilcblxuZXhwb3J0IGRlZmF1bHQgUG9wb3ZlclxuIiwiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHNjcm9sbHNweS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJ1xuaW1wb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLCBnZXRFbGVtZW50LCBpc0Rpc2FibGVkLCBpc1Zpc2libGVcbn0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnc2Nyb2xsc3B5J1xuY29uc3QgREFUQV9LRVkgPSAnYnMuc2Nyb2xsc3B5J1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcbmNvbnN0IERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknXG5cbmNvbnN0IEVWRU5UX0FDVElWQVRFID0gYGFjdGl2YXRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xJQ0sgPSBgY2xpY2ske0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9MT0FEX0RBVEFfQVBJID0gYGxvYWQke0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5cbmNvbnN0IENMQVNTX05BTUVfRFJPUERPV05fSVRFTSA9ICdkcm9wZG93bi1pdGVtJ1xuY29uc3QgQ0xBU1NfTkFNRV9BQ1RJVkUgPSAnYWN0aXZlJ1xuXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1NQWSA9ICdbZGF0YS1icy1zcHk9XCJzY3JvbGxcIl0nXG5jb25zdCBTRUxFQ1RPUl9UQVJHRVRfTElOS1MgPSAnW2hyZWZdJ1xuY29uc3QgU0VMRUNUT1JfTkFWX0xJU1RfR1JPVVAgPSAnLm5hdiwgLmxpc3QtZ3JvdXAnXG5jb25zdCBTRUxFQ1RPUl9OQVZfTElOS1MgPSAnLm5hdi1saW5rJ1xuY29uc3QgU0VMRUNUT1JfTkFWX0lURU1TID0gJy5uYXYtaXRlbSdcbmNvbnN0IFNFTEVDVE9SX0xJU1RfSVRFTVMgPSAnLmxpc3QtZ3JvdXAtaXRlbSdcbmNvbnN0IFNFTEVDVE9SX0xJTktfSVRFTVMgPSBgJHtTRUxFQ1RPUl9OQVZfTElOS1N9LCAke1NFTEVDVE9SX05BVl9JVEVNU30gPiAke1NFTEVDVE9SX05BVl9MSU5LU30sICR7U0VMRUNUT1JfTElTVF9JVEVNU31gXG5jb25zdCBTRUxFQ1RPUl9EUk9QRE9XTiA9ICcuZHJvcGRvd24nXG5jb25zdCBTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUgPSAnLmRyb3Bkb3duLXRvZ2dsZSdcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgb2Zmc2V0OiBudWxsLCAvLyBUT0RPOiB2NiBAZGVwcmVjYXRlZCwga2VlcCBpdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29uc1xuICByb290TWFyZ2luOiAnMHB4IDBweCAtMjUlJyxcbiAgc21vb3RoU2Nyb2xsOiBmYWxzZSxcbiAgdGFyZ2V0OiBudWxsLFxuICB0aHJlc2hvbGQ6IFswLjEsIDAuNSwgMV1cbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIG9mZnNldDogJyhudW1iZXJ8bnVsbCknLCAvLyBUT0RPIHY2IEBkZXByZWNhdGVkLCBrZWVwIGl0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zXG4gIHJvb3RNYXJnaW46ICdzdHJpbmcnLFxuICBzbW9vdGhTY3JvbGw6ICdib29sZWFuJyxcbiAgdGFyZ2V0OiAnZWxlbWVudCcsXG4gIHRocmVzaG9sZDogJ2FycmF5J1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBTY3JvbGxTcHkgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKVxuXG4gICAgLy8gdGhpcy5fZWxlbWVudCBpcyB0aGUgb2JzZXJ2YWJsZXNDb250YWluZXIgYW5kIGNvbmZpZy50YXJnZXQgdGhlIG1lbnUgbGlua3Mgd3JhcHBlclxuICAgIHRoaXMuX3RhcmdldExpbmtzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zID0gbmV3IE1hcCgpXG4gICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuX2VsZW1lbnQpLm92ZXJmbG93WSA9PT0gJ3Zpc2libGUnID8gbnVsbCA6IHRoaXMuX2VsZW1lbnRcbiAgICB0aGlzLl9hY3RpdmVUYXJnZXQgPSBudWxsXG4gICAgdGhpcy5fb2JzZXJ2ZXIgPSBudWxsXG4gICAgdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhID0ge1xuICAgICAgdmlzaWJsZUVudHJ5VG9wOiAwLFxuICAgICAgcGFyZW50U2Nyb2xsVG9wOiAwXG4gICAgfVxuICAgIHRoaXMucmVmcmVzaCgpIC8vIGluaXRpYWxpemVcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgcmVmcmVzaCgpIHtcbiAgICB0aGlzLl9pbml0aWFsaXplVGFyZ2V0c0FuZE9ic2VydmFibGVzKClcbiAgICB0aGlzLl9tYXliZUVuYWJsZVNtb290aFNjcm9sbCgpXG5cbiAgICBpZiAodGhpcy5fb2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vYnNlcnZlciA9IHRoaXMuX2dldE5ld09ic2VydmVyKClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zLnZhbHVlcygpKSB7XG4gICAgICB0aGlzLl9vYnNlcnZlci5vYnNlcnZlKHNlY3Rpb24pXG4gICAgfVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KClcbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgLy8gVE9ETzogb24gdjYgdGFyZ2V0IHNob3VsZCBiZSBnaXZlbiBleHBsaWNpdGx5ICYgcmVtb3ZlIHRoZSB7dGFyZ2V0OiAnc3MtdGFyZ2V0J30gY2FzZVxuICAgIGNvbmZpZy50YXJnZXQgPSBnZXRFbGVtZW50KGNvbmZpZy50YXJnZXQpIHx8IGRvY3VtZW50LmJvZHlcblxuICAgIC8vIFRPRE86IHY2IE9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMuIFVzZSByb290TWFyZ2luIG9ubHlcbiAgICBjb25maWcucm9vdE1hcmdpbiA9IGNvbmZpZy5vZmZzZXQgPyBgJHtjb25maWcub2Zmc2V0fXB4IDBweCAtMzAlYCA6IGNvbmZpZy5yb290TWFyZ2luXG5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy50aHJlc2hvbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25maWcudGhyZXNob2xkID0gY29uZmlnLnRocmVzaG9sZC5zcGxpdCgnLCcpLm1hcCh2YWx1ZSA9PiBOdW1iZXIucGFyc2VGbG9hdCh2YWx1ZSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX21heWJlRW5hYmxlU21vb3RoU2Nyb2xsKCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnLnNtb290aFNjcm9sbCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gdW5yZWdpc3RlciBhbnkgcHJldmlvdXMgbGlzdGVuZXJzXG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9jb25maWcudGFyZ2V0LCBFVkVOVF9DTElDSylcblxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9jb25maWcudGFyZ2V0LCBFVkVOVF9DTElDSywgU0VMRUNUT1JfVEFSR0VUX0xJTktTLCBldmVudCA9PiB7XG4gICAgICBjb25zdCBvYnNlcnZhYmxlU2VjdGlvbiA9IHRoaXMuX29ic2VydmFibGVTZWN0aW9ucy5nZXQoZXZlbnQudGFyZ2V0Lmhhc2gpXG4gICAgICBpZiAob2JzZXJ2YWJsZVNlY3Rpb24pIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICBjb25zdCByb290ID0gdGhpcy5fcm9vdEVsZW1lbnQgfHwgd2luZG93XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IG9ic2VydmFibGVTZWN0aW9uLm9mZnNldFRvcCAtIHRoaXMuX2VsZW1lbnQub2Zmc2V0VG9wXG4gICAgICAgIGlmIChyb290LnNjcm9sbFRvKSB7XG4gICAgICAgICAgcm9vdC5zY3JvbGxUbyh7IHRvcDogaGVpZ2h0LCBiZWhhdmlvcjogJ3Ntb290aCcgfSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENocm9tZSA2MCBkb2Vzbid0IHN1cHBvcnQgYHNjcm9sbFRvYFxuICAgICAgICByb290LnNjcm9sbFRvcCA9IGhlaWdodFxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBfZ2V0TmV3T2JzZXJ2ZXIoKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHJvb3Q6IHRoaXMuX3Jvb3RFbGVtZW50LFxuICAgICAgdGhyZXNob2xkOiB0aGlzLl9jb25maWcudGhyZXNob2xkLFxuICAgICAgcm9vdE1hcmdpbjogdGhpcy5fY29uZmlnLnJvb3RNYXJnaW5cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGVudHJpZXMgPT4gdGhpcy5fb2JzZXJ2ZXJDYWxsYmFjayhlbnRyaWVzKSwgb3B0aW9ucylcbiAgfVxuXG4gIC8vIFRoZSBsb2dpYyBvZiBzZWxlY3Rpb25cbiAgX29ic2VydmVyQ2FsbGJhY2soZW50cmllcykge1xuICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBlbnRyeSA9PiB0aGlzLl90YXJnZXRMaW5rcy5nZXQoYCMke2VudHJ5LnRhcmdldC5pZH1gKVxuICAgIGNvbnN0IGFjdGl2YXRlID0gZW50cnkgPT4ge1xuICAgICAgdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhLnZpc2libGVFbnRyeVRvcCA9IGVudHJ5LnRhcmdldC5vZmZzZXRUb3BcbiAgICAgIHRoaXMuX3Byb2Nlc3ModGFyZ2V0RWxlbWVudChlbnRyeSkpXG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50U2Nyb2xsVG9wID0gKHRoaXMuX3Jvb3RFbGVtZW50IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuc2Nyb2xsVG9wXG4gICAgY29uc3QgdXNlclNjcm9sbHNEb3duID0gcGFyZW50U2Nyb2xsVG9wID49IHRoaXMuX3ByZXZpb3VzU2Nyb2xsRGF0YS5wYXJlbnRTY3JvbGxUb3BcbiAgICB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEucGFyZW50U2Nyb2xsVG9wID0gcGFyZW50U2Nyb2xsVG9wXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmICghZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gbnVsbFxuICAgICAgICB0aGlzLl9jbGVhckFjdGl2ZUNsYXNzKHRhcmdldEVsZW1lbnQoZW50cnkpKVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVudHJ5SXNMb3dlclRoYW5QcmV2aW91cyA9IGVudHJ5LnRhcmdldC5vZmZzZXRUb3AgPj0gdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhLnZpc2libGVFbnRyeVRvcFxuICAgICAgLy8gaWYgd2UgYXJlIHNjcm9sbGluZyBkb3duLCBwaWNrIHRoZSBiaWdnZXIgb2Zmc2V0VG9wXG4gICAgICBpZiAodXNlclNjcm9sbHNEb3duICYmIGVudHJ5SXNMb3dlclRoYW5QcmV2aW91cykge1xuICAgICAgICBhY3RpdmF0ZShlbnRyeSlcbiAgICAgICAgLy8gaWYgcGFyZW50IGlzbid0IHNjcm9sbGVkLCBsZXQncyBrZWVwIHRoZSBmaXJzdCB2aXNpYmxlIGl0ZW0sIGJyZWFraW5nIHRoZSBpdGVyYXRpb25cbiAgICAgICAgaWYgKCFwYXJlbnRTY3JvbGxUb3ApIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHdlIGFyZSBzY3JvbGxpbmcgdXAsIHBpY2sgdGhlIHNtYWxsZXN0IG9mZnNldFRvcFxuICAgICAgaWYgKCF1c2VyU2Nyb2xsc0Rvd24gJiYgIWVudHJ5SXNMb3dlclRoYW5QcmV2aW91cykge1xuICAgICAgICBhY3RpdmF0ZShlbnRyeSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfaW5pdGlhbGl6ZVRhcmdldHNBbmRPYnNlcnZhYmxlcygpIHtcbiAgICB0aGlzLl90YXJnZXRMaW5rcyA9IG5ldyBNYXAoKVxuICAgIHRoaXMuX29ic2VydmFibGVTZWN0aW9ucyA9IG5ldyBNYXAoKVxuXG4gICAgY29uc3QgdGFyZ2V0TGlua3MgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX1RBUkdFVF9MSU5LUywgdGhpcy5fY29uZmlnLnRhcmdldClcblxuICAgIGZvciAoY29uc3QgYW5jaG9yIG9mIHRhcmdldExpbmtzKSB7XG4gICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgYW5jaG9yIGhhcyBhbiBpZCBhbmQgaXMgbm90IGRpc2FibGVkXG4gICAgICBpZiAoIWFuY2hvci5oYXNoIHx8IGlzRGlzYWJsZWQoYW5jaG9yKSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBvYnNlcnZhYmxlU2VjdGlvbiA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoZGVjb2RlVVJJKGFuY2hvci5oYXNoKSwgdGhpcy5fZWxlbWVudClcblxuICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIG9ic2VydmFibGVTZWN0aW9uIGV4aXN0cyAmIGlzIHZpc2libGVcbiAgICAgIGlmIChpc1Zpc2libGUob2JzZXJ2YWJsZVNlY3Rpb24pKSB7XG4gICAgICAgIHRoaXMuX3RhcmdldExpbmtzLnNldChkZWNvZGVVUkkoYW5jaG9yLmhhc2gpLCBhbmNob3IpXG4gICAgICAgIHRoaXMuX29ic2VydmFibGVTZWN0aW9ucy5zZXQoYW5jaG9yLmhhc2gsIG9ic2VydmFibGVTZWN0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9wcm9jZXNzKHRhcmdldCkge1xuICAgIGlmICh0aGlzLl9hY3RpdmVUYXJnZXQgPT09IHRhcmdldCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fY2xlYXJBY3RpdmVDbGFzcyh0aGlzLl9jb25maWcudGFyZ2V0KVxuICAgIHRoaXMuX2FjdGl2ZVRhcmdldCA9IHRhcmdldFxuICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFKVxuICAgIHRoaXMuX2FjdGl2YXRlUGFyZW50cyh0YXJnZXQpXG5cbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9BQ1RJVkFURSwgeyByZWxhdGVkVGFyZ2V0OiB0YXJnZXQgfSlcbiAgfVxuXG4gIF9hY3RpdmF0ZVBhcmVudHModGFyZ2V0KSB7XG4gICAgLy8gQWN0aXZhdGUgZHJvcGRvd24gcGFyZW50c1xuICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUERPV05fSVRFTSkpIHtcbiAgICAgIFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFLCB0YXJnZXQuY2xvc2VzdChTRUxFQ1RPUl9EUk9QRE9XTikpXG4gICAgICAgIC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBsaXN0R3JvdXAgb2YgU2VsZWN0b3JFbmdpbmUucGFyZW50cyh0YXJnZXQsIFNFTEVDVE9SX05BVl9MSVNUX0dST1VQKSkge1xuICAgICAgLy8gU2V0IHRyaWdnZXJlZCBsaW5rcyBwYXJlbnRzIGFzIGFjdGl2ZVxuICAgICAgLy8gV2l0aCBib3RoIDx1bD4gYW5kIDxuYXY+IG1hcmt1cCBhIHBhcmVudCBpcyB0aGUgcHJldmlvdXMgc2libGluZyBvZiBhbnkgbmF2IGFuY2VzdG9yXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgU2VsZWN0b3JFbmdpbmUucHJldihsaXN0R3JvdXAsIFNFTEVDVE9SX0xJTktfSVRFTVMpKSB7XG4gICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfY2xlYXJBY3RpdmVDbGFzcyhwYXJlbnQpIHtcbiAgICBwYXJlbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSlcblxuICAgIGNvbnN0IGFjdGl2ZU5vZGVzID0gU2VsZWN0b3JFbmdpbmUuZmluZChgJHtTRUxFQ1RPUl9UQVJHRVRfTElOS1N9LiR7Q0xBU1NfTkFNRV9BQ1RJVkV9YCwgcGFyZW50KVxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBhY3RpdmVOb2Rlcykge1xuICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFKVxuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFNjcm9sbFNweS5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YVtjb25maWddID09PSB1bmRlZmluZWQgfHwgY29uZmlnLnN0YXJ0c1dpdGgoJ18nKSB8fCBjb25maWcgPT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgfVxuXG4gICAgICBkYXRhW2NvbmZpZ10oKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbih3aW5kb3csIEVWRU5UX0xPQURfREFUQV9BUEksICgpID0+IHtcbiAgZm9yIChjb25zdCBzcHkgb2YgU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9EQVRBX1NQWSkpIHtcbiAgICBTY3JvbGxTcHkuZ2V0T3JDcmVhdGVJbnN0YW5jZShzcHkpXG4gIH1cbn0pXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFNjcm9sbFNweSlcblxuZXhwb3J0IGRlZmF1bHQgU2Nyb2xsU3B5XG4iLCIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdGFiLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudC5qcydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlci5qcydcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnXG5pbXBvcnQgeyBkZWZpbmVKUXVlcnlQbHVnaW4sIGdldE5leHRBY3RpdmVFbGVtZW50LCBpc0Rpc2FibGVkIH0gZnJvbSAnLi91dGlsL2luZGV4LmpzJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAndGFiJ1xuY29uc3QgREFUQV9LRVkgPSAnYnMudGFiJ1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcblxuY29uc3QgRVZFTlRfSElERSA9IGBoaWRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1dOID0gYHNob3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2ske0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlET1dOID0gYGtleWRvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9MT0FEX0RBVEFfQVBJID0gYGxvYWQke0VWRU5UX0tFWX1gXG5cbmNvbnN0IEFSUk9XX0xFRlRfS0VZID0gJ0Fycm93TGVmdCdcbmNvbnN0IEFSUk9XX1JJR0hUX0tFWSA9ICdBcnJvd1JpZ2h0J1xuY29uc3QgQVJST1dfVVBfS0VZID0gJ0Fycm93VXAnXG5jb25zdCBBUlJPV19ET1dOX0tFWSA9ICdBcnJvd0Rvd24nXG5jb25zdCBIT01FX0tFWSA9ICdIb21lJ1xuY29uc3QgRU5EX0tFWSA9ICdFbmQnXG5cbmNvbnN0IENMQVNTX05BTUVfQUNUSVZFID0gJ2FjdGl2ZSdcbmNvbnN0IENMQVNTX05BTUVfRkFERSA9ICdmYWRlJ1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBDTEFTU19EUk9QRE9XTiA9ICdkcm9wZG93bidcblxuY29uc3QgU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFID0gJy5kcm9wZG93bi10b2dnbGUnXG5jb25zdCBTRUxFQ1RPUl9EUk9QRE9XTl9NRU5VID0gJy5kcm9wZG93bi1tZW51J1xuY29uc3QgTk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9IGA6bm90KCR7U0VMRUNUT1JfRFJPUERPV05fVE9HR0xFfSlgXG5cbmNvbnN0IFNFTEVDVE9SX1RBQl9QQU5FTCA9ICcubGlzdC1ncm91cCwgLm5hdiwgW3JvbGU9XCJ0YWJsaXN0XCJdJ1xuY29uc3QgU0VMRUNUT1JfT1VURVIgPSAnLm5hdi1pdGVtLCAubGlzdC1ncm91cC1pdGVtJ1xuY29uc3QgU0VMRUNUT1JfSU5ORVIgPSBgLm5hdi1saW5rJHtOT1RfU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFfSwgLmxpc3QtZ3JvdXAtaXRlbSR7Tk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX0sIFtyb2xlPVwidGFiXCJdJHtOT1RfU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFfWBcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFID0gJ1tkYXRhLWJzLXRvZ2dsZT1cInRhYlwiXSwgW2RhdGEtYnMtdG9nZ2xlPVwicGlsbFwiXSwgW2RhdGEtYnMtdG9nZ2xlPVwibGlzdFwiXScgLy8gVE9ETzogY291bGQgb25seSBiZSBgdGFiYCBpbiB2NlxuY29uc3QgU0VMRUNUT1JfSU5ORVJfRUxFTSA9IGAke1NFTEVDVE9SX0lOTkVSfSwgJHtTRUxFQ1RPUl9EQVRBX1RPR0dMRX1gXG5cbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFX0FDVElWRSA9IGAuJHtDTEFTU19OQU1FX0FDVElWRX1bZGF0YS1icy10b2dnbGU9XCJ0YWJcIl0sIC4ke0NMQVNTX05BTUVfQUNUSVZFfVtkYXRhLWJzLXRvZ2dsZT1cInBpbGxcIl0sIC4ke0NMQVNTX05BTUVfQUNUSVZFfVtkYXRhLWJzLXRvZ2dsZT1cImxpc3RcIl1gXG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFRhYiBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG4gICAgc3VwZXIoZWxlbWVudClcbiAgICB0aGlzLl9wYXJlbnQgPSB0aGlzLl9lbGVtZW50LmNsb3Nlc3QoU0VMRUNUT1JfVEFCX1BBTkVMKVxuXG4gICAgaWYgKCF0aGlzLl9wYXJlbnQpIHtcbiAgICAgIHJldHVyblxuICAgICAgLy8gVE9ETzogc2hvdWxkIHRocm93IGV4Y2VwdGlvbiBpbiB2NlxuICAgICAgLy8gdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtlbGVtZW50Lm91dGVySFRNTH0gaGFzIG5vdCBhIHZhbGlkIHBhcmVudCAke1NFTEVDVE9SX0lOTkVSX0VMRU19YClcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgaW5pdGlhbCBhcmlhIGF0dHJpYnV0ZXNcbiAgICB0aGlzLl9zZXRJbml0aWFsQXR0cmlidXRlcyh0aGlzLl9wYXJlbnQsIHRoaXMuX2dldENoaWxkcmVuKCkpXG5cbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTiwgZXZlbnQgPT4gdGhpcy5fa2V5ZG93bihldmVudCkpXG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIHNob3coKSB7IC8vIFNob3dzIHRoaXMgZWxlbSBhbmQgZGVhY3RpdmF0ZSB0aGUgYWN0aXZlIHNpYmxpbmcgaWYgZXhpc3RzXG4gICAgY29uc3QgaW5uZXJFbGVtID0gdGhpcy5fZWxlbWVudFxuICAgIGlmICh0aGlzLl9lbGVtSXNBY3RpdmUoaW5uZXJFbGVtKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gU2VhcmNoIGZvciBhY3RpdmUgdGFiIG9uIHNhbWUgcGFyZW50IHRvIGRlYWN0aXZhdGUgaXRcbiAgICBjb25zdCBhY3RpdmUgPSB0aGlzLl9nZXRBY3RpdmVFbGVtKClcblxuICAgIGNvbnN0IGhpZGVFdmVudCA9IGFjdGl2ZSA/XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcihhY3RpdmUsIEVWRU5UX0hJREUsIHsgcmVsYXRlZFRhcmdldDogaW5uZXJFbGVtIH0pIDpcbiAgICAgIG51bGxcblxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKGlubmVyRWxlbSwgRVZFTlRfU0hPVywgeyByZWxhdGVkVGFyZ2V0OiBhY3RpdmUgfSlcblxuICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCB8fCAoaGlkZUV2ZW50ICYmIGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZGVhY3RpdmF0ZShhY3RpdmUsIGlubmVyRWxlbSlcbiAgICB0aGlzLl9hY3RpdmF0ZShpbm5lckVsZW0sIGFjdGl2ZSlcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2FjdGl2YXRlKGVsZW1lbnQsIHJlbGF0ZWRFbGVtKSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG5cbiAgICB0aGlzLl9hY3RpdmF0ZShTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpKSAvLyBTZWFyY2ggYW5kIGFjdGl2YXRlL3Nob3cgdGhlIHByb3BlciBzZWN0aW9uXG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgncm9sZScpICE9PSAndGFiJykge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4JylcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgdHJ1ZSlcbiAgICAgIHRoaXMuX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIHRydWUpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcihlbGVtZW50LCBFVkVOVF9TSE9XTiwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiByZWxhdGVkRWxlbVxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCBlbGVtZW50LCBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUpKVxuICB9XG5cbiAgX2RlYWN0aXZhdGUoZWxlbWVudCwgcmVsYXRlZEVsZW0pIHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSlcbiAgICBlbGVtZW50LmJsdXIoKVxuXG4gICAgdGhpcy5fZGVhY3RpdmF0ZShTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpKSAvLyBTZWFyY2ggYW5kIGRlYWN0aXZhdGUgdGhlIHNob3duIHNlY3Rpb24gdG9vXG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgncm9sZScpICE9PSAndGFiJykge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCBmYWxzZSlcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpXG4gICAgICB0aGlzLl90b2dnbGVEcm9wRG93bihlbGVtZW50LCBmYWxzZSlcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKGVsZW1lbnQsIEVWRU5UX0hJRERFTiwgeyByZWxhdGVkVGFyZ2V0OiByZWxhdGVkRWxlbSB9KVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIGVsZW1lbnQsIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSkpXG4gIH1cblxuICBfa2V5ZG93bihldmVudCkge1xuICAgIGlmICghKFtBUlJPV19MRUZUX0tFWSwgQVJST1dfUklHSFRfS0VZLCBBUlJPV19VUF9LRVksIEFSUk9XX0RPV05fS0VZLCBIT01FX0tFWSwgRU5EX0tFWV0uaW5jbHVkZXMoZXZlbnQua2V5KSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpLy8gc3RvcFByb3BhZ2F0aW9uL3ByZXZlbnREZWZhdWx0IGJvdGggYWRkZWQgdG8gc3VwcG9ydCB1cC9kb3duIGtleXMgd2l0aG91dCBzY3JvbGxpbmcgdGhlIHBhZ2VcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuX2dldENoaWxkcmVuKCkuZmlsdGVyKGVsZW1lbnQgPT4gIWlzRGlzYWJsZWQoZWxlbWVudCkpXG4gICAgbGV0IG5leHRBY3RpdmVFbGVtZW50XG5cbiAgICBpZiAoW0hPTUVfS0VZLCBFTkRfS0VZXS5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICBuZXh0QWN0aXZlRWxlbWVudCA9IGNoaWxkcmVuW2V2ZW50LmtleSA9PT0gSE9NRV9LRVkgPyAwIDogY2hpbGRyZW4ubGVuZ3RoIC0gMV1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXNOZXh0ID0gW0FSUk9XX1JJR0hUX0tFWSwgQVJST1dfRE9XTl9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSlcbiAgICAgIG5leHRBY3RpdmVFbGVtZW50ID0gZ2V0TmV4dEFjdGl2ZUVsZW1lbnQoY2hpbGRyZW4sIGV2ZW50LnRhcmdldCwgaXNOZXh0LCB0cnVlKVxuICAgIH1cblxuICAgIGlmIChuZXh0QWN0aXZlRWxlbWVudCkge1xuICAgICAgbmV4dEFjdGl2ZUVsZW1lbnQuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pXG4gICAgICBUYWIuZ2V0T3JDcmVhdGVJbnN0YW5jZShuZXh0QWN0aXZlRWxlbWVudCkuc2hvdygpXG4gICAgfVxuICB9XG5cbiAgX2dldENoaWxkcmVuKCkgeyAvLyBjb2xsZWN0aW9uIG9mIGlubmVyIGVsZW1lbnRzXG4gICAgcmV0dXJuIFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfSU5ORVJfRUxFTSwgdGhpcy5fcGFyZW50KVxuICB9XG5cbiAgX2dldEFjdGl2ZUVsZW0oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldENoaWxkcmVuKCkuZmluZChjaGlsZCA9PiB0aGlzLl9lbGVtSXNBY3RpdmUoY2hpbGQpKSB8fCBudWxsXG4gIH1cblxuICBfc2V0SW5pdGlhbEF0dHJpYnV0ZXMocGFyZW50LCBjaGlsZHJlbikge1xuICAgIHRoaXMuX3NldEF0dHJpYnV0ZUlmTm90RXhpc3RzKHBhcmVudCwgJ3JvbGUnLCAndGFibGlzdCcpXG5cbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICB0aGlzLl9zZXRJbml0aWFsQXR0cmlidXRlc09uQ2hpbGQoY2hpbGQpXG4gICAgfVxuICB9XG5cbiAgX3NldEluaXRpYWxBdHRyaWJ1dGVzT25DaGlsZChjaGlsZCkge1xuICAgIGNoaWxkID0gdGhpcy5fZ2V0SW5uZXJFbGVtZW50KGNoaWxkKVxuICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy5fZWxlbUlzQWN0aXZlKGNoaWxkKVxuICAgIGNvbnN0IG91dGVyRWxlbSA9IHRoaXMuX2dldE91dGVyRWxlbWVudChjaGlsZClcbiAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCBpc0FjdGl2ZSlcblxuICAgIGlmIChvdXRlckVsZW0gIT09IGNoaWxkKSB7XG4gICAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhvdXRlckVsZW0sICdyb2xlJywgJ3ByZXNlbnRhdGlvbicpXG4gICAgfVxuXG4gICAgaWYgKCFpc0FjdGl2ZSkge1xuICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpXG4gICAgfVxuXG4gICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMoY2hpbGQsICdyb2xlJywgJ3RhYicpXG5cbiAgICAvLyBzZXQgYXR0cmlidXRlcyB0byB0aGUgcmVsYXRlZCBwYW5lbCB0b29cbiAgICB0aGlzLl9zZXRJbml0aWFsQXR0cmlidXRlc09uVGFyZ2V0UGFuZWwoY2hpbGQpXG4gIH1cblxuICBfc2V0SW5pdGlhbEF0dHJpYnV0ZXNPblRhcmdldFBhbmVsKGNoaWxkKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3RvcihjaGlsZClcblxuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyh0YXJnZXQsICdyb2xlJywgJ3RhYnBhbmVsJylcblxuICAgIGlmIChjaGlsZC5pZCkge1xuICAgICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHModGFyZ2V0LCAnYXJpYS1sYWJlbGxlZGJ5JywgYCR7Y2hpbGQuaWR9YClcbiAgICB9XG4gIH1cblxuICBfdG9nZ2xlRHJvcERvd24oZWxlbWVudCwgb3Blbikge1xuICAgIGNvbnN0IG91dGVyRWxlbSA9IHRoaXMuX2dldE91dGVyRWxlbWVudChlbGVtZW50KVxuICAgIGlmICghb3V0ZXJFbGVtLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19EUk9QRE9XTikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHRvZ2dsZSA9IChzZWxlY3RvciwgY2xhc3NOYW1lKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3Rvciwgb3V0ZXJFbGVtKVxuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGNsYXNzTmFtZSwgb3BlbilcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0b2dnbGUoU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFLCBDTEFTU19OQU1FX0FDVElWRSlcbiAgICB0b2dnbGUoU0VMRUNUT1JfRFJPUERPV05fTUVOVSwgQ0xBU1NfTkFNRV9TSE9XKVxuICAgIG91dGVyRWxlbS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBvcGVuKVxuICB9XG5cbiAgX3NldEF0dHJpYnV0ZUlmTm90RXhpc3RzKGVsZW1lbnQsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZSkpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpXG4gICAgfVxuICB9XG5cbiAgX2VsZW1Jc0FjdGl2ZShlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfQUNUSVZFKVxuICB9XG5cbiAgLy8gVHJ5IHRvIGdldCB0aGUgaW5uZXIgZWxlbWVudCAodXN1YWxseSB0aGUgLm5hdi1saW5rKVxuICBfZ2V0SW5uZXJFbGVtZW50KGVsZW0pIHtcbiAgICByZXR1cm4gZWxlbS5tYXRjaGVzKFNFTEVDVE9SX0lOTkVSX0VMRU0pID8gZWxlbSA6IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfSU5ORVJfRUxFTSwgZWxlbSlcbiAgfVxuXG4gIC8vIFRyeSB0byBnZXQgdGhlIG91dGVyIGVsZW1lbnQgKHVzdWFsbHkgdGhlIC5uYXYtaXRlbSlcbiAgX2dldE91dGVyRWxlbWVudChlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW0uY2xvc2VzdChTRUxFQ1RPUl9PVVRFUikgfHwgZWxlbVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YVtjb25maWddID09PSB1bmRlZmluZWQgfHwgY29uZmlnLnN0YXJ0c1dpdGgoJ18nKSB8fCBjb25maWcgPT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgfVxuXG4gICAgICBkYXRhW2NvbmZpZ10oKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgaWYgKFsnQScsICdBUkVBJ10uaW5jbHVkZXModGhpcy50YWdOYW1lKSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG4gIGlmIChpc0Rpc2FibGVkKHRoaXMpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBUYWIuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKS5zaG93KClcbn0pXG5cbi8qKlxuICogSW5pdGlhbGl6ZSBvbiBmb2N1c1xuICovXG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9MT0FEX0RBVEFfQVBJLCAoKSA9PiB7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfVE9HR0xFX0FDVElWRSkpIHtcbiAgICBUYWIuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50KVxuICB9XG59KVxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oVGFiKVxuXG5leHBvcnQgZGVmYXVsdCBUYWJcbiIsIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB0b2FzdC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQuanMnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnXG5pbXBvcnQgeyBlbmFibGVEaXNtaXNzVHJpZ2dlciB9IGZyb20gJy4vdXRpbC9jb21wb25lbnQtZnVuY3Rpb25zLmpzJ1xuaW1wb3J0IHsgZGVmaW5lSlF1ZXJ5UGx1Z2luLCByZWZsb3cgfSBmcm9tICcuL3V0aWwvaW5kZXguanMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICd0b2FzdCdcbmNvbnN0IERBVEFfS0VZID0gJ2JzLnRvYXN0J1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcblxuY29uc3QgRVZFTlRfTU9VU0VPVkVSID0gYG1vdXNlb3ZlciR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX01PVVNFT1VUID0gYG1vdXNlb3V0JHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfRk9DVVNJTiA9IGBmb2N1c2luJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfRk9DVVNPVVQgPSBgZm9jdXNvdXQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURFID0gYGhpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURERU4gPSBgaGlkZGVuJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0hPVyA9IGBzaG93JHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0hPV04gPSBgc2hvd24ke0VWRU5UX0tFWX1gXG5cbmNvbnN0IENMQVNTX05BTUVfRkFERSA9ICdmYWRlJ1xuY29uc3QgQ0xBU1NfTkFNRV9ISURFID0gJ2hpZGUnIC8vIEBkZXByZWNhdGVkIC0ga2VwdCBoZXJlIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcbmNvbnN0IENMQVNTX05BTUVfU0hPV0lORyA9ICdzaG93aW5nJ1xuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgYW5pbWF0aW9uOiAnYm9vbGVhbicsXG4gIGF1dG9oaWRlOiAnYm9vbGVhbicsXG4gIGRlbGF5OiAnbnVtYmVyJ1xufVxuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBhbmltYXRpb246IHRydWUsXG4gIGF1dG9oaWRlOiB0cnVlLFxuICBkZWxheTogNTAwMFxufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBUb2FzdCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl90aW1lb3V0ID0gbnVsbFxuICAgIHRoaXMuX2hhc01vdXNlSW50ZXJhY3Rpb24gPSBmYWxzZVxuICAgIHRoaXMuX2hhc0tleWJvYXJkSW50ZXJhY3Rpb24gPSBmYWxzZVxuICAgIHRoaXMuX3NldExpc3RlbmVycygpXG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIHNob3coKSB7XG4gICAgY29uc3Qgc2hvd0V2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPVylcblxuICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fY2xlYXJUaW1lb3V0KClcblxuICAgIGlmICh0aGlzLl9jb25maWcuYW5pbWF0aW9uKSB7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9GQURFKVxuICAgIH1cblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPV0lORylcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1dOKVxuXG4gICAgICB0aGlzLl9tYXliZVNjaGVkdWxlSGlkZSgpXG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfSElERSkgLy8gQGRlcHJlY2F0ZWRcbiAgICByZWZsb3codGhpcy5fZWxlbWVudClcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XLCBDTEFTU19OQU1FX1NIT1dJTkcpXG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLl9lbGVtZW50LCB0aGlzLl9jb25maWcuYW5pbWF0aW9uKVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNTaG93bigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFKVxuXG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0hJREUpIC8vIEBkZXByZWNhdGVkXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XSU5HLCBDTEFTU19OQU1FX1NIT1cpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4pXG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPV0lORylcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLl9lbGVtZW50LCB0aGlzLl9jb25maWcuYW5pbWF0aW9uKVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9jbGVhclRpbWVvdXQoKVxuXG4gICAgaWYgKHRoaXMuaXNTaG93bigpKSB7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKVxuICAgIH1cblxuICAgIHN1cGVyLmRpc3Bvc2UoKVxuICB9XG5cbiAgaXNTaG93bigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuXG4gIF9tYXliZVNjaGVkdWxlSGlkZSgpIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5hdXRvaGlkZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2hhc01vdXNlSW50ZXJhY3Rpb24gfHwgdGhpcy5faGFzS2V5Ym9hcmRJbnRlcmFjdGlvbikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5oaWRlKClcbiAgICB9LCB0aGlzLl9jb25maWcuZGVsYXkpXG4gIH1cblxuICBfb25JbnRlcmFjdGlvbihldmVudCwgaXNJbnRlcmFjdGluZykge1xuICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgY2FzZSAnbW91c2VvdmVyJzpcbiAgICAgIGNhc2UgJ21vdXNlb3V0Jzoge1xuICAgICAgICB0aGlzLl9oYXNNb3VzZUludGVyYWN0aW9uID0gaXNJbnRlcmFjdGluZ1xuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIGNhc2UgJ2ZvY3Vzb3V0Jzoge1xuICAgICAgICB0aGlzLl9oYXNLZXlib2FyZEludGVyYWN0aW9uID0gaXNJbnRlcmFjdGluZ1xuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzSW50ZXJhY3RpbmcpIHtcbiAgICAgIHRoaXMuX2NsZWFyVGltZW91dCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBuZXh0RWxlbWVudCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXRcbiAgICBpZiAodGhpcy5fZWxlbWVudCA9PT0gbmV4dEVsZW1lbnQgfHwgdGhpcy5fZWxlbWVudC5jb250YWlucyhuZXh0RWxlbWVudCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX21heWJlU2NoZWR1bGVIaWRlKClcbiAgfVxuXG4gIF9zZXRMaXN0ZW5lcnMoKSB7XG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFT1ZFUiwgZXZlbnQgPT4gdGhpcy5fb25JbnRlcmFjdGlvbihldmVudCwgdHJ1ZSkpXG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFT1VULCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCBmYWxzZSkpXG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0ZPQ1VTSU4sIGV2ZW50ID0+IHRoaXMuX29uSW50ZXJhY3Rpb24oZXZlbnQsIHRydWUpKVxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9GT0NVU09VVCwgZXZlbnQgPT4gdGhpcy5fb25JbnRlcmFjdGlvbihldmVudCwgZmFsc2UpKVxuICB9XG5cbiAgX2NsZWFyVGltZW91dCgpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dClcbiAgICB0aGlzLl90aW1lb3V0ID0gbnVsbFxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gVG9hc3QuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICAgIH1cblxuICAgICAgICBkYXRhW2NvbmZpZ10odGhpcylcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5lbmFibGVEaXNtaXNzVHJpZ2dlcihUb2FzdClcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oVG9hc3QpXG5cbmV4cG9ydCBkZWZhdWx0IFRvYXN0XG4iLCIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgaW5kZXgudW1kLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEFsZXJ0IGZyb20gJy4vc3JjL2FsZXJ0LmpzJ1xuaW1wb3J0IEJ1dHRvbiBmcm9tICcuL3NyYy9idXR0b24uanMnXG5pbXBvcnQgQ2Fyb3VzZWwgZnJvbSAnLi9zcmMvY2Fyb3VzZWwuanMnXG5pbXBvcnQgQ29sbGFwc2UgZnJvbSAnLi9zcmMvY29sbGFwc2UuanMnXG5pbXBvcnQgRHJvcGRvd24gZnJvbSAnLi9zcmMvZHJvcGRvd24uanMnXG5pbXBvcnQgTW9kYWwgZnJvbSAnLi9zcmMvbW9kYWwuanMnXG5pbXBvcnQgT2ZmY2FudmFzIGZyb20gJy4vc3JjL29mZmNhbnZhcy5qcydcbmltcG9ydCBQb3BvdmVyIGZyb20gJy4vc3JjL3BvcG92ZXIuanMnXG5pbXBvcnQgU2Nyb2xsU3B5IGZyb20gJy4vc3JjL3Njcm9sbHNweS5qcydcbmltcG9ydCBUYWIgZnJvbSAnLi9zcmMvdGFiLmpzJ1xuaW1wb3J0IFRvYXN0IGZyb20gJy4vc3JjL3RvYXN0LmpzJ1xuaW1wb3J0IFRvb2x0aXAgZnJvbSAnLi9zcmMvdG9vbHRpcC5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBBbGVydCxcbiAgQnV0dG9uLFxuICBDYXJvdXNlbCxcbiAgQ29sbGFwc2UsXG4gIERyb3Bkb3duLFxuICBNb2RhbCxcbiAgT2ZmY2FudmFzLFxuICBQb3BvdmVyLFxuICBTY3JvbGxTcHksXG4gIFRhYixcbiAgVG9hc3QsXG4gIFRvb2x0aXBcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0VBQUE7Ozs7Ozs7RUFPQTs7O0VBSUEsTUFBTUEsVUFBVSxHQUFHLElBQUlDLEdBQUcsRUFBRTtFQUU1QixNQUFBQyxJQUFBLEdBQWU7SUFDYkMsR0FBR0EsQ0FBQ0MsT0FBTyxFQUFFQyxHQUFHLEVBQUVDLFFBQVEsRUFBRTtNQUMxQixJQUFJLENBQUNOLFVBQVUsQ0FBQ08sR0FBRyxDQUFDSCxPQUFPLENBQUMsRUFBRTtRQUM1QkosVUFBVSxDQUFDRyxHQUFHLENBQUNDLE9BQU8sRUFBRSxJQUFJSCxHQUFHLEVBQUUsQ0FBQztNQUNwQztNQUVBLE1BQU1PLFdBQVcsR0FBR1IsVUFBVSxDQUFDUyxHQUFHLENBQUNMLE9BQU8sQ0FBQzs7TUFFM0M7TUFDQTtNQUNBLElBQUksQ0FBQ0ksV0FBVyxDQUFDRCxHQUFHLENBQUNGLEdBQUcsQ0FBQyxJQUFJRyxXQUFXLENBQUNFLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDbkQ7UUFDQUMsT0FBTyxDQUFDQyxLQUFLLENBQUUsK0VBQThFQyxLQUFLLENBQUNDLElBQUksQ0FBQ04sV0FBVyxDQUFDTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBRSxHQUFFLENBQUM7UUFDbEk7TUFDRjtNQUVBUCxXQUFXLENBQUNMLEdBQUcs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
|