posthog_error_tracking � import { injectQuery as __vite__injectQuery } from "/@vite/client";import { createHotContext as __vite__createHotContext } from "/@vite/client";import.meta.hot = __vite__createHotContext("/@id/__x00__virtual:remix/hmr-runtime");const exports = {};
/**
* @license React
* react-refresh-runtime.development.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
"use strict";
if (true) {
(function() {
"use strict";
var REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref");
var REACT_MEMO_TYPE = Symbol.for("react.memo");
var PossiblyWeakMap = typeof WeakMap === "function" ? WeakMap : Map;
var allFamiliesByID = /* @__PURE__ */ new Map();
var allFamiliesByType = new PossiblyWeakMap();
var allSignaturesByType = new PossiblyWeakMap();
var updatedFamiliesByType = new PossiblyWeakMap();
var pendingUpdates = [];
var helpersByRendererID = /* @__PURE__ */ new Map();
var helpersByRoot = /* @__PURE__ */ new Map();
var mountedRoots = /* @__PURE__ */ new Set();
var failedRoots = /* @__PURE__ */ new Set();
var rootElements = (
// $FlowIssue
typeof WeakMap === "function" ? /* @__PURE__ */ new WeakMap() : null
);
var isPerformingRefresh = false;
function computeFullKey(signature) {
if (signature.fullKey !== null) {
return signature.fullKey;
}
var fullKey = signature.ownKey;
var hooks;
try {
hooks = signature.getCustomHooks();
} catch (err) {
signature.forceReset = true;
signature.fullKey = fullKey;
return fullKey;
}
for (var i = 0; i < hooks.length; i++) {
var hook = hooks[i];
if (typeof hook !== "function") {
signature.forceReset = true;
signature.fullKey = fullKey;
return fullKey;
}
var nestedHookSignature = allSignaturesByType.get(hook);
if (nestedHookSignature === void 0) {
continue;
}
var nestedHookKey = computeFullKey(nestedHookSignature);
if (nestedHookSignature.forceReset) {
signature.forceReset = true;
}
fullKey += "\n---\n" + nestedHookKey;
}
signature.fullKey = fullKey;
return fullKey;
}
function haveEqualSignatures(prevType, nextType) {
var prevSignature = allSignaturesByType.get(prevType);
var nextSignature = allSignaturesByType.get(nextType);
if (prevSignature === void 0 && nextSignature === void 0) {
return true;
}
if (prevSignature === void 0 || nextSignature === void 0) {
return false;
}
if (computeFullKey(prevSignature) !== computeFullKey(nextSignature)) {
return false;
}
if (nextSignature.forceReset) {
return false;
}
return true;
}
function isReactClass(type) {
return type.prototype && type.prototype.isReactComponent;
}
function canPreserveStateBetween(prevType, nextType) {
if (isReactClass(prevType) || isReactClass(nextType)) {
return false;
}
if (haveEqualSignatures(prevType, nextType)) {
return true;
}
return false;
}
function resolveFamily(type) {
return updatedFamiliesByType.get(type);
}
function cloneMap(map) {
var clone = /* @__PURE__ */ new Map();
map.forEach(function(value, key) {
clone.set(key, value);
});
return clone;
}
function cloneSet(set) {
var clone = /* @__PURE__ */ new Set();
set.forEach(function(value) {
clone.add(value);
});
return clone;
}
function getProperty(object, property) {
try {
return object[property];
} catch (err) {
return void 0;
}
}
function performReactRefresh() {
if (pendingUpdates.length === 0) {
return null;
}
if (isPerformingRefresh) {
return null;
}
isPerformingRefresh = true;
try {
var staleFamilies = /* @__PURE__ */ new Set();
var updatedFamilies = /* @__PURE__ */ new Set();
var updates = pendingUpdates;
pendingUpdates = [];
updates.forEach(function(_ref) {
var family = _ref[0], nextType = _ref[1];
var prevType = family.current;
updatedFamiliesByType.set(prevType, family);
updatedFamiliesByType.set(nextType, family);
family.current = nextType;
if (canPreserveStateBetween(prevType, nextType)) {
updatedFamilies.add(family);
} else {
staleFamilies.add(family);
}
});
var update = {
updatedFamilies,
// Families that will re-render preserving state
staleFamilies
// Families that will be remounted
};
helpersByRendererID.forEach(function(helpers) {
helpers.setRefreshHandler(resolveFamily);
});
var didError = false;
var firstError = null;
var failedRootsSnapshot = cloneSet(failedRoots);
var mountedRootsSnapshot = cloneSet(mountedRoots);
var helpersByRootSnapshot = cloneMap(helpersByRoot);
failedRootsSnapshot.forEach(function(root) {
var helpers = helpersByRootSnapshot.get(root);
if (helpers === void 0) {
throw new Error("Could not find helpers for a root. This is a bug in React Refresh.");
}
if (!failedRoots.has(root)) {
}
if (rootElements === null) {
return;
}
if (!rootElements.has(root)) {
return;
}
var element = rootElements.get(root);
try {
helpers.scheduleRoot(root, element);
} catch (err) {
if (!didError) {
didError = true;
firstError = err;
}
}
});
mountedRootsSnapshot.forEach(function(root) {
var helpers = helpersByRootSnapshot.get(root);
if (helpers === void 0) {
throw new Error("Could not find helpers for a root. This is a bug in React Refresh.");
}
if (!mountedRoots.has(root)) {
}
try {
helpers.scheduleRefresh(root, update);
} catch (err) {
if (!didError) {
didError = true;
firstError = err;
}
}
});
if (didError) {
throw firstError;
}
return update;
} finally {
isPerformingRefresh = false;
}
}
function register(type, id) {
{
if (type === null) {
return;
}
if (typeof type !== "function" && typeof type !== "object") {
return;
}
if (allFamiliesByType.has(type)) {
return;
}
var family = allFamiliesByID.get(id);
if (family === void 0) {
family = {
current: type
};
allFamiliesByID.set(id, family);
} else {
pendingUpdates.push([family, type]);
}
allFamiliesByType.set(type, family);
if (typeof type === "object" && type !== null) {
switch (getProperty(type, "$$typeof")) {
case REACT_FORWARD_REF_TYPE:
register(type.render, id + "$render");
break;
case REACT_MEMO_TYPE:
register(type.type, id + "$type");
break;
}
}
}
}
function setSignature(type, key) {
var forceReset = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false;
var getCustomHooks = arguments.length > 3 ? arguments[3] : void 0;
{
if (!allSignaturesByType.has(type)) {
allSignaturesByType.set(type, {
forceReset,
ownKey: key,
fullKey: null,
getCustomHooks: getCustomHooks || function() {
return [];
}
});
}
if (typeof type === "object" && type !== null) {
switch (getProperty(type, "$$typeof")) {
case REACT_FORWARD_REF_TYPE:
setSignature(type.render, key, forceReset, getCustomHooks);
break;
case REACT_MEMO_TYPE:
setSignature(type.type, key, forceReset, getCustomHooks);
break;
}
}
}
}
function collectCustomHooksForSignature(type) {
{
var signature = allSignaturesByType.get(type);
if (signature !== void 0) {
computeFullKey(signature);
}
}
}
function getFamilyByID(id) {
{
return allFamiliesByID.get(id);
}
}
function getFamilyByType(type) {
{
return allFamiliesByType.get(type);
}
}
function findAffectedHostInstances(families) {
{
var affectedInstances = /* @__PURE__ */ new Set();
mountedRoots.forEach(function(root) {
var helpers = helpersByRoot.get(root);
if (helpers === void 0) {
throw new Error("Could not find helpers for a root. This is a bug in React Refresh.");
}
var instancesForRoot = helpers.findHostInstancesForRefresh(root, families);
instancesForRoot.forEach(function(inst) {
affectedInstances.add(inst);
});
});
return affectedInstances;
}
}
function injectIntoGlobalHook(globalObject) {
{
var hook = globalObject.__REACT_DEVTOOLS_GLOBAL_HOOK__;
if (hook === void 0) {
var nextID = 0;
globalObject.__REACT_DEVTOOLS_GLOBAL_HOOK__ = hook = {
renderers: /* @__PURE__ */ new Map(),
supportsFiber: true,
inject: function(injected) {
return nextID++;
},
onScheduleFiberRoot: function(id, root, children) {
},
onCommitFiberRoot: function(id, root, maybePriorityLevel, didError) {
},
onCommitFiberUnmount: function() {
}
};
}
if (hook.isDisabled) {
console["warn"]("Something has shimmed the React DevTools global hook (__REACT_DEVTOOLS_GLOBAL_HOOK__). Fast Refresh is not compatible with this shim and will be disabled.");
return;
}
var oldInject = hook.inject;
hook.inject = function(injected) {
var id = oldInject.apply(this, arguments);
if (typeof injected.scheduleRefresh === "function" && typeof injected.setRefreshHandler === "function") {
helpersByRendererID.set(id, injected);
}
return id;
};
hook.renderers.forEach(function(injected, id) {
if (typeof injected.scheduleRefresh === "function" && typeof injected.setRefreshHandler === "function") {
helpersByRendererID.set(id, injected);
}
});
var oldOnCommitFiberRoot = hook.onCommitFiberRoot;
var oldOnScheduleFiberRoot = hook.onScheduleFiberRoot || function() {
};
hook.onScheduleFiberRoot = function(id, root, children) {
if (!isPerformingRefresh) {
failedRoots.delete(root);
if (rootElements !== null) {
rootElements.set(root, children);
}
}
return oldOnScheduleFiberRoot.apply(this, arguments);
};
hook.onCommitFiberRoot = function(id, root, maybePriorityLevel, didError) {
var helpers = helpersByRendererID.get(id);
if (helpers !== void 0) {
helpersByRoot.set(root, helpers);
var current = root.current;
var alternate = current.alternate;
if (alternate !== null) {
var wasMounted = alternate.memoizedState != null && alternate.memoizedState.element != null && mountedRoots.has(root);
var isMounted = current.memoizedState != null && current.memoizedState.element != null;
if (!wasMounted && isMounted) {
mountedRoots.add(root);
failedRoots.delete(root);
} else if (wasMounted && isMounted) ;
else if (wasMounted && !isMounted) {
mountedRoots.delete(root);
if (didError) {
failedRoots.add(root);
} else {
helpersByRoot.delete(root);
}
} else if (!wasMounted && !isMounted) {
if (didError) {
failedRoots.add(root);
}
}
} else {
mountedRoots.add(root);
}
}
return oldOnCommitFiberRoot.apply(this, arguments);
};
}
}
function hasUnrecoverableErrors() {
return false;
}
function _getMountedRootCount() {
{
return mountedRoots.size;
}
}
function createSignatureFunctionForTransform() {
{
var savedType;
var hasCustomHooks;
var didCollectHooks = false;
return function(type, key, forceReset, getCustomHooks) {
if (typeof key === "string") {
if (!savedType) {
savedType = type;
hasCustomHooks = typeof getCustomHooks === "function";
}
if (type != null && (typeof type === "function" || typeof type === "object")) {
setSignature(type, key, forceReset, getCustomHooks);
}
return type;
} else {
if (!didCollectHooks && hasCustomHooks) {
didCollectHooks = true;
collectCustomHooksForSignature(savedType);
}
}
};
}
}
function isLikelyComponentType(type) {
{
switch (typeof type) {
case "function": {
if (type.prototype != null) {
if (type.prototype.isReactComponent) {
return true;
}
var ownNames = Object.getOwnPropertyNames(type.prototype);
if (ownNames.length > 1 || ownNames[0] !== "constructor") {
return false;
}
if (type.prototype.__proto__ !== Object.prototype) {
return false;
}
}
var name = type.name || type.displayName;
return typeof name === "string" && /^[A-Z]/.test(name);
}
case "object": {
if (type != null) {
switch (getProperty(type, "$$typeof")) {
case REACT_FORWARD_REF_TYPE:
case REACT_MEMO_TYPE:
return true;
default:
return false;
}
}
return false;
}
default: {
return false;
}
}
}
}
exports._getMountedRootCount = _getMountedRootCount;
exports.collectCustomHooksForSignature = collectCustomHooksForSignature;
exports.createSignatureFunctionForTransform = createSignatureFunctionForTransform;
exports.findAffectedHostInstances = findAffectedHostInstances;
exports.getFamilyByID = getFamilyByID;
exports.getFamilyByType = getFamilyByType;
exports.hasUnrecoverableErrors = hasUnrecoverableErrors;
exports.injectIntoGlobalHook = injectIntoGlobalHook;
exports.isLikelyComponentType = isLikelyComponentType;
exports.performReactRefresh = performReactRefresh;
exports.register = register;
exports.setSignature = setSignature;
})();
}
function debounce(fn, delay) {
let handle;
return () => {
clearTimeout(handle);
handle = setTimeout(fn, delay);
};
}
const enqueueUpdate = debounce(async () => {
let manifest;
if (routeUpdates.size > 0) {
manifest = JSON.parse(JSON.stringify(__remixManifest));
for (let route of routeUpdates.values()) {
manifest.routes[route.id] = route;
let imported = window.__remixRouteModuleUpdates.get(route.id);
if (!imported) {
throw Error(`[remix:hmr] No module update found for route ${route.id}`);
}
let routeModule = {
...imported,
// react-refresh takes care of updating these in-place,
// if we don't preserve existing values we'll loose state.
default: imported.default ? window.__remixRouteModules[route.id]?.default ?? imported.default : imported.default,
ErrorBoundary: imported.ErrorBoundary ? window.__remixRouteModules[route.id]?.ErrorBoundary ?? imported.ErrorBoundary : imported.ErrorBoundary,
HydrateFallback: imported.HydrateFallback ? window.__remixRouteModules[route.id]?.HydrateFallback ?? imported.HydrateFallback : imported.HydrateFallback
};
window.__remixRouteModules[route.id] = routeModule;
}
let needsRevalidation = new Set(
Array.from(routeUpdates.values()).filter((route) => route.hasLoader || route.hasClientLoader).map((route) => route.id)
);
let routes = __remixRouter.createRoutesForHMR(
needsRevalidation,
manifest.routes,
window.__remixRouteModules,
window.__remixContext.future,
window.__remixContext.isSpaMode
);
__remixRouter._internalSetRoutes(routes);
routeUpdates.clear();
window.__remixRouteModuleUpdates.clear();
}
try {
window.__remixHdrActive = true;
await revalidate();
} finally {
window.__remixHdrActive = false;
}
if (manifest) {
Object.assign(window.__remixManifest, manifest);
}
exports.performReactRefresh();
}, 16);
function registerExportsForReactRefresh(filename, moduleExports) {
for (let key in moduleExports) {
if (key === "__esModule") continue;
let exportValue = moduleExports[key];
if (exports.isLikelyComponentType(exportValue)) {
exports.register(exportValue, filename + " export " + key);
}
}
}
function validateRefreshBoundaryAndEnqueueUpdate(prevExports, nextExports, acceptExports = []) {
if (!predicateOnExport(
prevExports,
(key) => key in nextExports || acceptExports.includes(key)
)) {
return "Could not Fast Refresh (export removed)";
}
if (!predicateOnExport(
nextExports,
(key) => key in prevExports || acceptExports.includes(key)
)) {
return "Could not Fast Refresh (new export)";
}
let hasExports = false;
let allExportsAreHandledOrUnchanged = predicateOnExport(
nextExports,
(key, value) => {
hasExports = true;
if (acceptExports.includes(key)) return true;
if (exports.isLikelyComponentType(value)) return true;
return prevExports[key] === nextExports[key];
}
);
if (hasExports && allExportsAreHandledOrUnchanged) {
enqueueUpdate();
} else {
return "Could not Fast Refresh. Learn more at https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react#consistent-components-exports";
}
}
function predicateOnExport(moduleExports, predicate) {
for (let key in moduleExports) {
if (key === "__esModule") continue;
let desc = Object.getOwnPropertyDescriptor(moduleExports, key);
if (desc && desc.get) return false;
if (!predicate(key, moduleExports[key])) return false;
}
return true;
}
function __hmr_import(module) {
return import(
/* @vite-ignore */
__vite__injectQuery(module, 'import')
);
}
const routeUpdates = /* @__PURE__ */ new Map();
window.__remixRouteModuleUpdates = /* @__PURE__ */ new Map();
async function revalidate() {
let { promise, resolve } = channel();
let unsub = __remixRouter.subscribe((state) => {
if (state.revalidation === "idle") {
unsub();
resolve();
}
});
window.__remixRevalidation = (window.__remixRevalidation || 0) + 1;
__remixRouter.revalidate();
return promise;
}
function channel() {
let resolve;
let reject;
let promise = new Promise((_resolve, _reject) => {
resolve = _resolve;
reject = _reject;
});
return { promise, resolve, reject };
}
import.meta.hot.on("remix:hmr", async ({ route }) => {
window.__remixClearCriticalCss();
if (route) {
routeUpdates.set(route.id, route);
}
});
exports.__hmr_import = __hmr_import;
exports.registerExportsForReactRefresh = registerExportsForReactRefresh;
exports.validateRefreshBoundaryAndEnqueueUpdate = validateRefreshBoundaryAndEnqueueUpdate;
exports.enqueueUpdate = enqueueUpdate;
export default exports;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlx1MDAwMHZpcnR1YWw6cmVtaXgvaG1yLXJ1bnRpbWUiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgZXhwb3J0cyA9IHt9XG4vKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC1yZWZyZXNoLXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBBVFRFTlRJT05cbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJyk7XG5cbnZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7IC8vIFdlIG5ldmVyIHJlbW92ZSB0aGVzZSBhc3NvY2lhdGlvbnMuXG4vLyBJdCdzIE9LIHRvIHJlZmVyZW5jZSBmYW1pbGllcywgYnV0IHVzZSBXZWFrTWFwL1NldCBmb3IgdHlwZXMuXG5cbnZhciBhbGxGYW1pbGllc0J5SUQgPSBuZXcgTWFwKCk7XG52YXIgYWxsRmFtaWxpZXNCeVR5cGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG52YXIgYWxsU2lnbmF0dXJlc0J5VHlwZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTsgLy8gVGhpcyBXZWFrTWFwIGlzIHJlYWQgYnkgUmVhY3QsIHNvIHdlIG9ubHkgcHV0IGZhbWlsaWVzXG4vLyB0aGF0IGhhdmUgYWN0dWFsbHkgYmVlbiBlZGl0ZWQgaGVyZS4gVGhpcyBrZWVwcyBjaGVja3MgZmFzdC5cbi8vICRGbG93SXNzdWVcblxudmFyIHVwZGF0ZWRGYW1pbGllc0J5VHlwZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTsgLy8gVGhpcyBpcyBjbGVhcmVkIG9uIGV2ZXJ5IHBlcmZvcm1SZWFjdFJlZnJlc2goKSBjYWxsLlxuLy8gSXQgaXMgYW4gYXJyYXkgb2YgW0ZhbWlseSwgTmV4dFR5cGVdIHR1cGxlcy5cblxudmFyIHBlbmRpbmdVcGRhdGVzID0gW107IC8vIFRoaXMgaXMgaW5qZWN0ZWQgYnkgdGhlIHJlbmRlcmVyIHZpYSBEZXZUb29scyBnbG9iYWwgaG9vay5cblxudmFyIGhlbHBlcnNCeVJlbmRlcmVySUQgPSBuZXcgTWFwKCk7XG52YXIgaGVscGVyc0J5Um9vdCA9IG5ldyBNYXAoKTsgLy8gV2Uga2VlcCB0cmFjayBvZiBtb3VudGVkIHJvb3RzIHNvIHdlIGNhbiBzY2hlZHVsZSB1cGRhdGVzLlxuXG52YXIgbW91bnRlZFJvb3RzID0gbmV3IFNldCgpOyAvLyBJZiBhIHJvb3QgY2FwdHVyZXMgYW4gZXJyb3IsIHdlIHJlbWVtYmVyIGl0IHNvIHdlIGNhbiByZXRyeSBvbiBlZGl0LlxuXG52YXIgZmFpbGVkUm9vdHMgPSBuZXcgU2V0KCk7IC8vIEluIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgV2Vha01hcCwgd2UgYWxzbyByZW1lbWJlciB0aGUgbGFzdCBlbGVtZW50IGZvciBldmVyeSByb290LlxuLy8gSXQgbmVlZHMgdG8gYmUgd2VhayBiZWNhdXNlIHdlIGRvIHRoaXMgZXZlbiBmb3Igcm9vdHMgdGhhdCBmYWlsZWQgdG8gbW91bnQuXG4vLyBJZiB0aGVyZSBpcyBubyBXZWFrTWFwLCB3ZSB3b24ndCBhdHRlbXB0IHRvIGRvIHJldHJ5aW5nLlxuLy8gJEZsb3dJc3N1ZVxuXG52YXIgcm9vdEVsZW1lbnRzID0gLy8gJEZsb3dJc3N1ZVxudHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBuZXcgV2Vha01hcCgpIDogbnVsbDtcbnZhciBpc1BlcmZvcm1pbmdSZWZyZXNoID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGNvbXB1dGVGdWxsS2V5KHNpZ25hdHVyZSkge1xuICBpZiAoc2lnbmF0dXJlLmZ1bGxLZXkgIT09IG51bGwpIHtcbiAgICByZXR1cm4gc2lnbmF0dXJlLmZ1bGxLZXk7XG4gIH1cblxuICB2YXIgZnVsbEtleSA9IHNpZ25hdHVyZS5vd25LZXk7XG4gIHZhciBob29rcztcblxuICB0cnkge1xuICAgIGhvb2tzID0gc2lnbmF0dXJlLmdldEN1c3RvbUhvb2tzKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpbiBhbiBlZGdlIGNhc2UsIGUuZy4gaWYgZXhwcmVzc2lvbiBsaWtlIEZvby51c2VTb21ldGhpbmdcbiAgICAvLyBkZXBlbmRzIG9uIEZvbyB3aGljaCBpcyBsYXppbHkgaW5pdGlhbGl6ZWQgZHVyaW5nIHJlbmRlcmluZy5cbiAgICAvLyBJbiB0aGF0IGNhc2UganVzdCBhc3N1bWUgd2UnbGwgaGF2ZSB0byByZW1vdW50LlxuICAgIHNpZ25hdHVyZS5mb3JjZVJlc2V0ID0gdHJ1ZTtcbiAgICBzaWduYXR1cmUuZnVsbEtleSA9IGZ1bGxLZXk7XG4gICAgcmV0dXJuIGZ1bGxLZXk7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGhvb2sgPSBob29rc1tpXTtcblxuICAgIGlmICh0eXBlb2YgaG9vayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gU29tZXRoaW5nJ3Mgd3JvbmcuIEFzc3VtZSB3ZSBuZWVkIHRvIHJlbW91bnQuXG4gICAgICBzaWduYXR1cmUuZm9yY2VSZXNldCA9IHRydWU7XG4gICAgICBzaWduYXR1cmUuZnVsbEtleSA9IGZ1bGxLZXk7XG4gICAgICByZXR1cm4gZnVsbEtleTtcbiAgICB9XG5cbiAgICB2YXIgbmVzdGVkSG9va1NpZ25hdHVyZSA9IGFsbFNpZ25hdHVyZXNCeVR5cGUuZ2V0KGhvb2spO1xuXG4gICAgaWYgKG5lc3RlZEhvb2tTaWduYXR1cmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gTm8gc2lnbmF0dXJlIG1lYW5zIEhvb2sgd2Fzbid0IGluIHRoZSBzb3VyY2UgY29kZSwgZS5nLiBpbiBhIGxpYnJhcnkuXG4gICAgICAvLyBXZSdsbCBza2lwIGl0IGJlY2F1c2Ugd2UgY2FuIGFzc3VtZSBpdCB3b24ndCBjaGFuZ2UgZHVyaW5nIHRoaXMgc2Vzc2lvbi5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBuZXN0ZWRIb29rS2V5ID0gY29tcHV0ZUZ1bGxLZXkobmVzdGVkSG9va1NpZ25hdHVyZSk7XG5cbiAgICBpZiAobmVzdGVkSG9va1NpZ25hdHVyZS5mb3JjZVJlc2V0KSB7XG4gICAgICBzaWduYXR1cmUuZm9yY2VSZXNldCA9IHRydWU7XG4gICAgfVxuXG4gICAgZnVsbEtleSArPSAnXFxuLS0tXFxuJyArIG5lc3RlZEhvb2tLZXk7XG4gIH1cblxuICBzaWduYXR1cmUuZnVsbEtleSA9IGZ1bGxLZXk7XG4gIHJldHVybiBmdWxsS2V5O1xufVxuXG5mdW5jdGlvbiBoYXZlRXF1YWxTaWduYXR1cmVzKHByZXZUeXBlLCBuZXh0VHlwZSkge1xuICB2YXIgcHJldlNpZ25hdHVyZSA9IGFsbFNpZ25hdHVyZXNCeVR5cGUuZ2V0KHByZXZUeXBlKTtcbiAgdmFyIG5leHRTaWduYXR1cmUgPSBhbGxTaWduYXR1cmVzQnlUeXBlLmdldChuZXh0VHlwZSk7XG5cbiAgaWYgKHByZXZTaWduYXR1cmUgPT09IHVuZGVmaW5lZCAmJiBuZXh0U2lnbmF0dXJlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChwcmV2U2lnbmF0dXJlID09PSB1bmRlZmluZWQgfHwgbmV4dFNpZ25hdHVyZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGNvbXB1dGVGdWxsS2V5KHByZXZTaWduYXR1cmUpICE9PSBjb21wdXRlRnVsbEtleShuZXh0U2lnbmF0dXJlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChuZXh0U2lnbmF0dXJlLmZvcmNlUmVzZXQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNSZWFjdENsYXNzKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUucHJvdG90eXBlICYmIHR5cGUucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ7XG59XG5cbmZ1bmN0aW9uIGNhblByZXNlcnZlU3RhdGVCZXR3ZWVuKHByZXZUeXBlLCBuZXh0VHlwZSkge1xuICBpZiAoaXNSZWFjdENsYXNzKHByZXZUeXBlKSB8fCBpc1JlYWN0Q2xhc3MobmV4dFR5cGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGhhdmVFcXVhbFNpZ25hdHVyZXMocHJldlR5cGUsIG5leHRUeXBlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRmFtaWx5KHR5cGUpIHtcbiAgLy8gT25seSBjaGVjayB1cGRhdGVkIHR5cGVzIHRvIGtlZXAgbG9va3VwcyBmYXN0LlxuICByZXR1cm4gdXBkYXRlZEZhbWlsaWVzQnlUeXBlLmdldCh0eXBlKTtcbn0gLy8gSWYgd2UgZGlkbid0IGNhcmUgYWJvdXQgSUUxMSwgd2UgY291bGQgdXNlIG5ldyBNYXAvU2V0KGl0ZXJhYmxlKS5cblxuXG5mdW5jdGlvbiBjbG9uZU1hcChtYXApIHtcbiAgdmFyIGNsb25lID0gbmV3IE1hcCgpO1xuICBtYXAuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgIGNsb25lLnNldChrZXksIHZhbHVlKTtcbiAgfSk7XG4gIHJldHVybiBjbG9uZTtcbn1cblxuZnVuY3Rpb24gY2xvbmVTZXQoc2V0KSB7XG4gIHZhciBjbG9uZSA9IG5ldyBTZXQoKTtcbiAgc2V0LmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgY2xvbmUuYWRkKHZhbHVlKTtcbiAgfSk7XG4gIHJldHVybiBjbG9uZTtcbn0gLy8gVGhpcyBpcyBhIHNhZmV0eSBtZWNoYW5pc20gdG8gcHJvdGVjdCBhZ2FpbnN0IHJvZ3VlIGdldHRlcnMgYW5kIFByb3hpZXMuXG5cblxuZnVuY3Rpb24gZ2V0UHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSkge1xuICB0cnkge1xuICAgIHJldHVybiBvYmplY3RbcHJvcGVydHldO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBJbnRlbnRpb25hbGx5IGlnbm9yZS5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBlcmZvcm1SZWFjdFJlZnJlc2goKSB7XG5cbiAgaWYgKHBlbmRpbmdVcGRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGlzUGVyZm9ybWluZ1JlZnJlc2gpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlzUGVyZm9ybWluZ1JlZnJlc2ggPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgdmFyIHN0YWxlRmFtaWxpZXMgPSBuZXcgU2V0KCk7XG4gICAgdmFyIHVwZGF0ZWRGYW1pbGllcyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgdXBkYXRlcyA9IHBlbmRpbmdVcGRhdGVzO1xuICAgIHBlbmRpbmdVcGRhdGVzID0gW107XG4gICAgdXBkYXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgZmFtaWx5ID0gX3JlZlswXSxcbiAgICAgICAgICBuZXh0VHlwZSA9IF9yZWZbMV07XG4gICAgICAvLyBOb3cgdGhhdCB3ZSBnb3QgYSByZWFsIGVkaXQsIHdlIGNhbiBjcmVhdGUgYXNzb2NpYXRpb25zXG4gICAgICAvLyB0aGF0IHdpbGwgYmUgcmVhZCBieSB0aGUgUmVhY3QgcmVjb25jaWxlci5cbiAgICAgIHZhciBwcmV2VHlwZSA9IGZhbWlseS5jdXJyZW50O1xuICAgICAgdXBkYXRlZEZhbWlsaWVzQnlUeXBlLnNldChwcmV2VHlwZSwgZmFtaWx5KTtcbiAgICAgIHVwZGF0ZWRGYW1pbGllc0J5VHlwZS5zZXQobmV4dFR5cGUsIGZhbWlseSk7XG4gICAgICBmYW1pbHkuY3VycmVudCA9IG5leHRUeXBlOyAvLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHNob3VsZCBiZSBhIHJlLXJlbmRlciBvciBhIHJlLW1vdW50LlxuXG4gICAgICBpZiAoY2FuUHJlc2VydmVTdGF0ZUJldHdlZW4ocHJldlR5cGUsIG5leHRUeXBlKSkge1xuICAgICAgICB1cGRhdGVkRmFtaWxpZXMuYWRkKGZhbWlseSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFsZUZhbWlsaWVzLmFkZChmYW1pbHkpO1xuICAgICAgfVxuICAgIH0pOyAvLyBUT0RPOiByZW5hbWUgdGhlc2UgZmllbGRzIHRvIHNvbWV0aGluZyBtb3JlIG1lYW5pbmdmdWwuXG5cbiAgICB2YXIgdXBkYXRlID0ge1xuICAgICAgdXBkYXRlZEZhbWlsaWVzOiB1cGRhdGVkRmFtaWxpZXMsXG4gICAgICAvLyBGYW1pbGllcyB0aGF0IHdpbGwgcmUtcmVuZGVyIHByZXNlcnZpbmcgc3RhdGVcbiAgICAgIHN0YWxlRmFtaWxpZXM6IHN0YWxlRmFtaWxpZXMgLy8gRmFtaWxpZXMgdGhhdCB3aWxsIGJlIHJlbW91bnRlZFxuXG4gICAgfTtcbiAgICBoZWxwZXJzQnlSZW5kZXJlcklELmZvckVhY2goZnVuY3Rpb24gKGhlbHBlcnMpIHtcbiAgICAgIC8vIEV2ZW4gaWYgdGhlcmUgYXJlIG5vIHJvb3RzLCBzZXQgdGhlIGhhbmRsZXIgb24gZmlyc3QgdXBkYXRlLlxuICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgaWYgKm5ldyogcm9vdHMgYXJlIG1vdW50ZWQsIHRoZXknbGwgdXNlIHRoZSByZXNvbHZlIGhhbmRsZXIuXG4gICAgICBoZWxwZXJzLnNldFJlZnJlc2hIYW5kbGVyKHJlc29sdmVGYW1pbHkpO1xuICAgIH0pO1xuICAgIHZhciBkaWRFcnJvciA9IGZhbHNlO1xuICAgIHZhciBmaXJzdEVycm9yID0gbnVsbDsgLy8gV2Ugc25hcHNob3QgbWFwcyBhbmQgc2V0cyB0aGF0IGFyZSBtdXRhdGVkIGR1cmluZyBjb21taXRzLlxuICAgIC8vIElmIHdlIGRvbid0IGRvIHRoaXMsIHRoZXJlIGlzIGEgcmlzayB0aGV5IHdpbGwgYmUgbXV0YXRlZCB3aGlsZVxuICAgIC8vIHdlIGl0ZXJhdGUgb3ZlciB0aGVtLiBGb3IgZXhhbXBsZSwgdHJ5aW5nIHRvIHJlY292ZXIgYSBmYWlsZWQgcm9vdFxuICAgIC8vIG1heSBjYXVzZSBhbm90aGVyIHJvb3QgdG8gYmUgYWRkZWQgdG8gdGhlIGZhaWxlZCBsaXN0IC0tIGFuIGluZmluaXRlIGxvb3AuXG5cbiAgICB2YXIgZmFpbGVkUm9vdHNTbmFwc2hvdCA9IGNsb25lU2V0KGZhaWxlZFJvb3RzKTtcbiAgICB2YXIgbW91bnRlZFJvb3RzU25hcHNob3QgPSBjbG9uZVNldChtb3VudGVkUm9vdHMpO1xuICAgIHZhciBoZWxwZXJzQnlSb290U25hcHNob3QgPSBjbG9uZU1hcChoZWxwZXJzQnlSb290KTtcbiAgICBmYWlsZWRSb290c1NuYXBzaG90LmZvckVhY2goZnVuY3Rpb24gKHJvb3QpIHtcbiAgICAgIHZhciBoZWxwZXJzID0gaGVscGVyc0J5Um9vdFNuYXBzaG90LmdldChyb290KTtcblxuICAgICAgaWYgKGhlbHBlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGhlbHBlcnMgZm9yIGEgcm9vdC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdCBSZWZyZXNoLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWZhaWxlZFJvb3RzLmhhcyhyb290KSkgey8vIE5vIGxvbmdlciBmYWlsZWQuXG4gICAgICB9XG5cbiAgICAgIGlmIChyb290RWxlbWVudHMgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJvb3RFbGVtZW50cy5oYXMocm9vdCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZWxlbWVudCA9IHJvb3RFbGVtZW50cy5nZXQocm9vdCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGhlbHBlcnMuc2NoZWR1bGVSb290KHJvb3QsIGVsZW1lbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghZGlkRXJyb3IpIHtcbiAgICAgICAgICBkaWRFcnJvciA9IHRydWU7XG4gICAgICAgICAgZmlyc3RFcnJvciA9IGVycjtcbiAgICAgICAgfSAvLyBLZWVwIHRyeWluZyBvdGhlciByb290cy5cblxuICAgICAgfVxuICAgIH0pO1xuICAgIG1vdW50ZWRSb290c1NuYXBzaG90LmZvckVhY2goZnVuY3Rpb24gKHJvb3QpIHtcbiAgICAgIHZhciBoZWxwZXJzID0gaGVscGVyc0J5Um9vdFNuYXBzaG90LmdldChyb290KTtcblxuICAgICAgaWYgKGhlbHBlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGhlbHBlcnMgZm9yIGEgcm9vdC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdCBSZWZyZXNoLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW1vdW50ZWRSb290cy5oYXMocm9vdCkpIHsvLyBObyBsb25nZXIgbW91bnRlZC5cbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgaGVscGVycy5zY2hlZHVsZVJlZnJlc2gocm9vdCwgdXBkYXRlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoIWRpZEVycm9yKSB7XG4gICAgICAgICAgZGlkRXJyb3IgPSB0cnVlO1xuICAgICAgICAgIGZpcnN0RXJyb3IgPSBlcnI7XG4gICAgICAgIH0gLy8gS2VlcCB0cnlpbmcgb3RoZXIgcm9vdHMuXG5cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChkaWRFcnJvcikge1xuICAgICAgdGhyb3cgZmlyc3RFcnJvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlO1xuICB9IGZpbmFsbHkge1xuICAgIGlzUGVyZm9ybWluZ1JlZnJlc2ggPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gcmVnaXN0ZXIodHlwZSwgaWQpIHtcbiAge1xuICAgIGlmICh0eXBlID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0eXBlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB0eXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gVGhpcyBjYW4gaGFwcGVuIGluIGFuIGVkZ2UgY2FzZSwgZS5nLiBpZiB3ZSByZWdpc3RlclxuICAgIC8vIHJldHVybiB2YWx1ZSBvZiBhIEhPQyBidXQgaXQgcmV0dXJucyBhIGNhY2hlZCBjb21wb25lbnQuXG4gICAgLy8gSWdub3JlIGFueXRoaW5nIGJ1dCB0aGUgZmlyc3QgcmVnaXN0cmF0aW9uIGZvciBlYWNoIHR5cGUuXG5cblxuICAgIGlmIChhbGxGYW1pbGllc0J5VHlwZS5oYXModHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIENyZWF0ZSBmYW1pbHkgb3IgcmVtZW1iZXIgdG8gdXBkYXRlIGl0LlxuICAgIC8vIE5vbmUgb2YgdGhpcyBib29ra2VlcGluZyBhZmZlY3RzIHJlY29uY2lsaWF0aW9uXG4gICAgLy8gdW50aWwgdGhlIGZpcnN0IHBlcmZvcm1SZWFjdFJlZnJlc2goKSBjYWxsIGFib3ZlLlxuXG5cbiAgICB2YXIgZmFtaWx5ID0gYWxsRmFtaWxpZXNCeUlELmdldChpZCk7XG5cbiAgICBpZiAoZmFtaWx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZhbWlseSA9IHtcbiAgICAgICAgY3VycmVudDogdHlwZVxuICAgICAgfTtcbiAgICAgIGFsbEZhbWlsaWVzQnlJRC5zZXQoaWQsIGZhbWlseSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlbmRpbmdVcGRhdGVzLnB1c2goW2ZhbWlseSwgdHlwZV0pO1xuICAgIH1cblxuICAgIGFsbEZhbWlsaWVzQnlUeXBlLnNldCh0eXBlLCBmYW1pbHkpOyAvLyBWaXNpdCBpbm5lciB0eXBlcyBiZWNhdXNlIHdlIG1pZ2h0IG5vdCBoYXZlIHJlZ2lzdGVyZWQgdGhlbS5cblxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChnZXRQcm9wZXJ0eSh0eXBlLCAnJCR0eXBlb2YnKSkge1xuICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgcmVnaXN0ZXIodHlwZS5yZW5kZXIsIGlkICsgJyRyZW5kZXInKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICByZWdpc3Rlcih0eXBlLnR5cGUsIGlkICsgJyR0eXBlJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzZXRTaWduYXR1cmUodHlwZSwga2V5KSB7XG4gIHZhciBmb3JjZVJlc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgdmFyIGdldEN1c3RvbUhvb2tzID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgPyBhcmd1bWVudHNbM10gOiB1bmRlZmluZWQ7XG5cbiAge1xuICAgIGlmICghYWxsU2lnbmF0dXJlc0J5VHlwZS5oYXModHlwZSkpIHtcbiAgICAgIGFsbFNpZ25hdHVyZXNCeVR5cGUuc2V0KHR5cGUsIHtcbiAgICAgICAgZm9yY2VSZXNldDogZm9yY2VSZXNldCxcbiAgICAgICAgb3duS2V5OiBrZXksXG4gICAgICAgIGZ1bGxLZXk6IG51bGwsXG4gICAgICAgIGdldEN1c3RvbUhvb2tzOiBnZXRDdXN0b21Ib29rcyB8fCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IC8vIFZpc2l0IGlubmVyIHR5cGVzIGJlY2F1c2Ugd2UgbWlnaHQgbm90IGhhdmUgc2lnbmVkIHRoZW0uXG5cblxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChnZXRQcm9wZXJ0eSh0eXBlLCAnJCR0eXBlb2YnKSkge1xuICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgc2V0U2lnbmF0dXJlKHR5cGUucmVuZGVyLCBrZXksIGZvcmNlUmVzZXQsIGdldEN1c3RvbUhvb2tzKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICBzZXRTaWduYXR1cmUodHlwZS50eXBlLCBrZXksIGZvcmNlUmVzZXQsIGdldEN1c3RvbUhvb2tzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0gLy8gVGhpcyBpcyBsYXppbHkgY2FsbGVkIGR1cmluZyBmaXJzdCByZW5kZXIgZm9yIGEgdHlwZS5cbi8vIEl0IGNhcHR1cmVzIEhvb2sgbGlzdCBhdCB0aGF0IHRpbWUgc28gaW5saW5lIHJlcXVpcmVzIGRvbid0IGJyZWFrIGNvbXBhcmlzb25zLlxuXG5mdW5jdGlvbiBjb2xsZWN0Q3VzdG9tSG9va3NGb3JTaWduYXR1cmUodHlwZSkge1xuICB7XG4gICAgdmFyIHNpZ25hdHVyZSA9IGFsbFNpZ25hdHVyZXNCeVR5cGUuZ2V0KHR5cGUpO1xuXG4gICAgaWYgKHNpZ25hdHVyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb21wdXRlRnVsbEtleShzaWduYXR1cmUpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZ2V0RmFtaWx5QnlJRChpZCkge1xuICB7XG4gICAgcmV0dXJuIGFsbEZhbWlsaWVzQnlJRC5nZXQoaWQpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRGYW1pbHlCeVR5cGUodHlwZSkge1xuICB7XG4gICAgcmV0dXJuIGFsbEZhbWlsaWVzQnlUeXBlLmdldCh0eXBlKTtcbiAgfVxufVxuZnVuY3Rpb24gZmluZEFmZmVjdGVkSG9zdEluc3RhbmNlcyhmYW1pbGllcykge1xuICB7XG4gICAgdmFyIGFmZmVjdGVkSW5zdGFuY2VzID0gbmV3IFNldCgpO1xuICAgIG1vdW50ZWRSb290cy5mb3JFYWNoKGZ1bmN0aW9uIChyb290KSB7XG4gICAgICB2YXIgaGVscGVycyA9IGhlbHBlcnNCeVJvb3QuZ2V0KHJvb3QpO1xuXG4gICAgICBpZiAoaGVscGVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgaGVscGVycyBmb3IgYSByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0IFJlZnJlc2guJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBpbnN0YW5jZXNGb3JSb290ID0gaGVscGVycy5maW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2gocm9vdCwgZmFtaWxpZXMpO1xuICAgICAgaW5zdGFuY2VzRm9yUm9vdC5mb3JFYWNoKGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgICAgIGFmZmVjdGVkSW5zdGFuY2VzLmFkZChpbnN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBhZmZlY3RlZEluc3RhbmNlcztcbiAgfVxufVxuZnVuY3Rpb24gaW5qZWN0SW50b0dsb2JhbEhvb2soZ2xvYmFsT2JqZWN0KSB7XG4gIHtcbiAgICAvLyBGb3IgUmVhY3QgTmF0aXZlLCB0aGUgZ2xvYmFsIGhvb2sgd2lsbCBiZSBzZXQgdXAgYnkgcmVxdWlyZSgncmVhY3QtZGV2dG9vbHMtY29yZScpLlxuICAgIC8vIFRoYXQgY29kZSB3aWxsIHJ1biBiZWZvcmUgdXMuIFNvIHdlIG5lZWQgdG8gbW9ua2V5cGF0Y2ggZnVuY3Rpb25zIG9uIGV4aXN0aW5nIGhvb2suXG4gICAgLy8gRm9yIFJlYWN0IFdlYiwgdGhlIGdsb2JhbCBob29rIHdpbGwgYmUgc2V0IHVwIGJ5IHRoZSBleHRlbnNpb24uXG4gICAgLy8gVGhpcyB3aWxsIGFsc28gcnVuIGJlZm9yZSB1cy5cbiAgICB2YXIgaG9vayA9IGdsb2JhbE9iamVjdC5fX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX187XG5cbiAgICBpZiAoaG9vayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBIb3dldmVyLCBpZiB0aGVyZSBpcyBubyBEZXZUb29scyBleHRlbnNpb24sIHdlJ2xsIG5lZWQgdG8gc2V0IHVwIHRoZSBnbG9iYWwgaG9vayBvdXJzZWx2ZXMuXG4gICAgICAvLyBOb3RlIHRoYXQgaW4gdGhpcyBjYXNlIGl0J3MgaW1wb3J0YW50IHRoYXQgcmVuZGVyZXIgY29kZSBydW5zICphZnRlciogdGhpcyBtZXRob2QgY2FsbC5cbiAgICAgIC8vIE90aGVyd2lzZSwgdGhlIHJlbmRlcmVyIHdpbGwgdGhpbmsgdGhhdCB0aGVyZSBpcyBubyBnbG9iYWwgaG9vaywgYW5kIHdvbid0IGRvIHRoZSBpbmplY3Rpb24uXG4gICAgICB2YXIgbmV4dElEID0gMDtcbiAgICAgIGdsb2JhbE9iamVjdC5fX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPSBob29rID0ge1xuICAgICAgICByZW5kZXJlcnM6IG5ldyBNYXAoKSxcbiAgICAgICAgc3VwcG9ydHNGaWJlcjogdHJ1ZSxcbiAgICAgICAgaW5qZWN0OiBmdW5jdGlvbiAoaW5qZWN0ZWQpIHtcbiAgICAgICAgICByZXR1cm4gbmV4dElEKys7XG4gICAgICAgIH0sXG4gICAgICAgIG9uU2NoZWR1bGVGaWJlclJvb3Q6IGZ1bmN0aW9uIChpZCwgcm9vdCwgY2hpbGRyZW4pIHt9LFxuICAgICAgICBvbkNvbW1pdEZpYmVyUm9vdDogZnVuY3Rpb24gKGlkLCByb290LCBtYXliZVByaW9yaXR5TGV2ZWwsIGRpZEVycm9yKSB7fSxcbiAgICAgICAgb25Db21taXRGaWJlclVubW91bnQ6IGZ1bmN0aW9uICgpIHt9XG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChob29rLmlzRGlzYWJsZWQpIHtcbiAgICAgIC8vIFRoaXMgaXNuJ3QgYSByZWFsIHByb3BlcnR5IG9uIHRoZSBob29rLCBidXQgaXQgY2FuIGJlIHNldCB0byBvcHQgb3V0XG4gICAgICAvLyBvZiBEZXZUb29scyBpbnRlZ3JhdGlvbiBhbmQgYXNzb2NpYXRlZCB3YXJuaW5ncyBhbmQgbG9ncy5cbiAgICAgIC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG4gICAgICBjb25zb2xlWyd3YXJuJ10oJ1NvbWV0aGluZyBoYXMgc2hpbW1lZCB0aGUgUmVhY3QgRGV2VG9vbHMgZ2xvYmFsIGhvb2sgKF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXykuICcgKyAnRmFzdCBSZWZyZXNoIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyBzaGltIGFuZCB3aWxsIGJlIGRpc2FibGVkLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gSGVyZSwgd2UganVzdCB3YW50IHRvIGdldCBhIHJlZmVyZW5jZSB0byBzY2hlZHVsZVJlZnJlc2guXG5cblxuICAgIHZhciBvbGRJbmplY3QgPSBob29rLmluamVjdDtcblxuICAgIGhvb2suaW5qZWN0ID0gZnVuY3Rpb24gKGluamVjdGVkKSB7XG4gICAgICB2YXIgaWQgPSBvbGRJbmplY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgaWYgKHR5cGVvZiBpbmplY3RlZC5zY2hlZHVsZVJlZnJlc2ggPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluamVjdGVkLnNldFJlZnJlc2hIYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRoaXMgdmVyc2lvbiBzdXBwb3J0cyBSZWFjdCBSZWZyZXNoLlxuICAgICAgICBoZWxwZXJzQnlSZW5kZXJlcklELnNldChpZCwgaW5qZWN0ZWQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaWQ7XG4gICAgfTsgLy8gRG8gdGhlIHNhbWUgZm9yIGFueSBhbHJlYWR5IGluamVjdGVkIHJvb3RzLlxuICAgIC8vIFRoaXMgaXMgdXNlZnVsIGlmIFJlYWN0RE9NIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNzYyNlxuXG5cbiAgICBob29rLnJlbmRlcmVycy5mb3JFYWNoKGZ1bmN0aW9uIChpbmplY3RlZCwgaWQpIHtcbiAgICAgIGlmICh0eXBlb2YgaW5qZWN0ZWQuc2NoZWR1bGVSZWZyZXNoID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbmplY3RlZC5zZXRSZWZyZXNoSGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUaGlzIHZlcnNpb24gc3VwcG9ydHMgUmVhY3QgUmVmcmVzaC5cbiAgICAgICAgaGVscGVyc0J5UmVuZGVyZXJJRC5zZXQoaWQsIGluamVjdGVkKTtcbiAgICAgIH1cbiAgICB9KTsgLy8gV2UgYWxzbyB3YW50IHRvIHRyYWNrIGN1cnJlbnRseSBtb3VudGVkIHJvb3RzLlxuXG4gICAgdmFyIG9sZE9uQ29tbWl0RmliZXJSb290ID0gaG9vay5vbkNvbW1pdEZpYmVyUm9vdDtcblxuICAgIHZhciBvbGRPblNjaGVkdWxlRmliZXJSb290ID0gaG9vay5vblNjaGVkdWxlRmliZXJSb290IHx8IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgaG9vay5vblNjaGVkdWxlRmliZXJSb290ID0gZnVuY3Rpb24gKGlkLCByb290LCBjaGlsZHJlbikge1xuICAgICAgaWYgKCFpc1BlcmZvcm1pbmdSZWZyZXNoKSB7XG4gICAgICAgIC8vIElmIGl0IHdhcyBpbnRlbnRpb25hbGx5IHNjaGVkdWxlZCwgZG9uJ3QgYXR0ZW1wdCB0byByZXN0b3JlLlxuICAgICAgICAvLyBUaGlzIGluY2x1ZGVzIGludGVudGlvbmFsbHkgc2NoZWR1bGVkIHVubW91bnRzLlxuICAgICAgICBmYWlsZWRSb290cy5kZWxldGUocm9vdCk7XG5cbiAgICAgICAgaWYgKHJvb3RFbGVtZW50cyAhPT0gbnVsbCkge1xuICAgICAgICAgIHJvb3RFbGVtZW50cy5zZXQocm9vdCwgY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvbGRPblNjaGVkdWxlRmliZXJSb290LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIGhvb2sub25Db21taXRGaWJlclJvb3QgPSBmdW5jdGlvbiAoaWQsIHJvb3QsIG1heWJlUHJpb3JpdHlMZXZlbCwgZGlkRXJyb3IpIHtcbiAgICAgIHZhciBoZWxwZXJzID0gaGVscGVyc0J5UmVuZGVyZXJJRC5nZXQoaWQpO1xuXG4gICAgICBpZiAoaGVscGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlbHBlcnNCeVJvb3Quc2V0KHJvb3QsIGhlbHBlcnMpO1xuICAgICAgICB2YXIgY3VycmVudCA9IHJvb3QuY3VycmVudDtcbiAgICAgICAgdmFyIGFsdGVybmF0ZSA9IGN1cnJlbnQuYWx0ZXJuYXRlOyAvLyBXZSBuZWVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgcm9vdCBoYXMganVzdCAodW4pbW91bnRlZC5cbiAgICAgICAgLy8gVGhpcyBsb2dpYyBpcyBjb3B5LXBhc3RlZCBmcm9tIHNpbWlsYXIgbG9naWMgaW4gdGhlIERldlRvb2xzIGJhY2tlbmQuXG4gICAgICAgIC8vIElmIHRoaXMgYnJlYWtzIHdpdGggc29tZSByZWZhY3RvcmluZywgeW91J2xsIHdhbnQgdG8gdXBkYXRlIERldlRvb2xzIHRvby5cblxuICAgICAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIHdhc01vdW50ZWQgPSBhbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZSAhPSBudWxsICYmIGFsdGVybmF0ZS5tZW1vaXplZFN0YXRlLmVsZW1lbnQgIT0gbnVsbCAmJiBtb3VudGVkUm9vdHMuaGFzKHJvb3QpO1xuICAgICAgICAgIHZhciBpc01vdW50ZWQgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUuZWxlbWVudCAhPSBudWxsO1xuXG4gICAgICAgICAgaWYgKCF3YXNNb3VudGVkICYmIGlzTW91bnRlZCkge1xuICAgICAgICAgICAgLy8gTW91bnQgYSBuZXcgcm9vdC5cbiAgICAgICAgICAgIG1vdW50ZWRSb290cy5hZGQocm9vdCk7XG4gICAgICAgICAgICBmYWlsZWRSb290cy5kZWxldGUocm9vdCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh3YXNNb3VudGVkICYmIGlzTW91bnRlZCkgOyBlbHNlIGlmICh3YXNNb3VudGVkICYmICFpc01vdW50ZWQpIHtcbiAgICAgICAgICAgIC8vIFVubW91bnQgYW4gZXhpc3Rpbmcgcm9vdC5cbiAgICAgICAgICAgIG1vdW50ZWRSb290cy5kZWxldGUocm9vdCk7XG5cbiAgICAgICAgICAgIGlmIChkaWRFcnJvcikge1xuICAgICAgICAgICAgICAvLyBXZSdsbCByZW1vdW50IGl0IG9uIGZ1dHVyZSBlZGl0cy5cbiAgICAgICAgICAgICAgZmFpbGVkUm9vdHMuYWRkKHJvb3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaGVscGVyc0J5Um9vdC5kZWxldGUocm9vdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICghd2FzTW91bnRlZCAmJiAhaXNNb3VudGVkKSB7XG4gICAgICAgICAgICBpZiAoZGlkRXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gV2UnbGwgcmVtb3VudCBpdCBvbiBmdXR1cmUgZWRpdHMuXG4gICAgICAgICAgICAgIGZhaWxlZFJvb3RzLmFkZChyb290KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTW91bnQgYSBuZXcgcm9vdC5cbiAgICAgICAgICBtb3VudGVkUm9vdHMuYWRkKHJvb3QpO1xuICAgICAgICB9XG4gICAgICB9IC8vIEFsd2F5cyBjYWxsIHRoZSBkZWNvcmF0ZWQgRGV2VG9vbHMgaG9vay5cblxuXG4gICAgICByZXR1cm4gb2xkT25Db21taXRGaWJlclJvb3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBoYXNVbnJlY292ZXJhYmxlRXJyb3JzKCkge1xuICAvLyBUT0RPOiBkZWxldGUgdGhpcyBhZnRlciByZW1vdmluZyBkZXBlbmRlbmN5IGluIFJOLlxuICByZXR1cm4gZmFsc2U7XG59IC8vIEV4cG9zZWQgZm9yIHRlc3RpbmcuXG5cbmZ1bmN0aW9uIF9nZXRNb3VudGVkUm9vdENvdW50KCkge1xuICB7XG4gICAgcmV0dXJuIG1vdW50ZWRSb290cy5zaXplO1xuICB9XG59IC8vIFRoaXMgaXMgYSB3cmFwcGVyIG92ZXIgbW9yZSBwcmltaXRpdmUgZnVuY3Rpb25zIGZvciBzZXR0aW5nIHNpZ25hdHVyZS5cbi8vIFNpZ25hdHVyZXMgbGV0IHVzIGRlY2lkZSB3aGV0aGVyIHRoZSBIb29rIG9yZGVyIGhhcyBjaGFuZ2VkIG9uIHJlZnJlc2guXG4vL1xuLy8gVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGEgdHJhbnNmb3JtIHRhcmdldCwgZS5nLjpcbi8vIHZhciBfcyA9IGNyZWF0ZVNpZ25hdHVyZUZ1bmN0aW9uRm9yVHJhbnNmb3JtKClcbi8vXG4vLyBmdW5jdGlvbiBIZWxsbygpIHtcbi8vICAgY29uc3QgW2Zvbywgc2V0Rm9vXSA9IHVzZVN0YXRlKDApO1xuLy8gICBjb25zdCB2YWx1ZSA9IHVzZUN1c3RvbUhvb2soKTtcbi8vICAgX3MoKTsgLyogQ2FsbCB3aXRob3V0IGFyZ3VtZW50cyB0cmlnZ2VycyBjb2xsZWN0aW5nIHRoZSBjdXN0b20gSG9vayBsaXN0LlxuLy8gICAgICAgICAgKiBUaGlzIGRvZXNuJ3QgaGFwcGVuIGR1cmluZyB0aGUgbW9kdWxlIGV2YWx1YXRpb24gYmVjYXVzZSB3ZVxuLy8gICAgICAgICAgKiBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGUgbW9kdWxlIG9yZGVyIHdpdGggaW5saW5lIHJlcXVpcmVzLlxuLy8gICAgICAgICAgKiBOZXh0IGNhbGxzIGFyZSBub29wcy4gKi9cbi8vICAgcmV0dXJuIDxoMT5IaTwvaDE+O1xuLy8gfVxuLy9cbi8vIC8qIENhbGwgd2l0aCBhcmd1bWVudHMgYXR0YWNoZXMgdGhlIHNpZ25hdHVyZSB0byB0aGUgdHlwZTogKi9cbi8vIF9zKFxuLy8gICBIZWxsbyxcbi8vICAgJ3VzZVN0YXRle1tmb28sIHNldEZvb119KDApJyxcbi8vICAgKCkgPT4gW3VzZUN1c3RvbUhvb2tdLCAvKiBMYXp5IHRvIGF2b2lkIHRyaWdnZXJpbmcgaW5saW5lIHJlcXVpcmVzICovXG4vLyApO1xuXG5mdW5jdGlvbiBjcmVhdGVTaWduYXR1cmVGdW5jdGlvbkZvclRyYW5zZm9ybSgpIHtcbiAge1xuICAgIHZhciBzYXZlZFR5cGU7XG4gICAgdmFyIGhhc0N1c3RvbUhvb2tzO1xuICAgIHZhciBkaWRDb2xsZWN0SG9va3MgPSBmYWxzZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHR5cGUsIGtleSwgZm9yY2VSZXNldCwgZ2V0Q3VzdG9tSG9va3MpIHtcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBXZSdyZSBpbiB0aGUgaW5pdGlhbCBwaGFzZSB0aGF0IGFzc29jaWF0ZXMgc2lnbmF0dXJlc1xuICAgICAgICAvLyB3aXRoIHRoZSBmdW5jdGlvbnMuIE5vdGUgdGhpcyBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzXG4gICAgICAgIC8vIGluIEhPQyBjaGFpbnMgbGlrZSBfcyhob2MxKF9zKGhvYzIoX3MoYWN0dWFsRnVuY3Rpb24pKSkpKS5cbiAgICAgICAgaWYgKCFzYXZlZFR5cGUpIHtcbiAgICAgICAgICAvLyBXZSdyZSBpbiB0aGUgaW5uZXJtb3N0IGNhbGwsIHNvIHRoaXMgaXMgdGhlIGFjdHVhbCB0eXBlLlxuICAgICAgICAgIHNhdmVkVHlwZSA9IHR5cGU7XG4gICAgICAgICAgaGFzQ3VzdG9tSG9va3MgPSB0eXBlb2YgZ2V0Q3VzdG9tSG9va3MgPT09ICdmdW5jdGlvbic7XG4gICAgICAgIH0gLy8gU2V0IHRoZSBzaWduYXR1cmUgZm9yIGFsbCB0eXBlcyAoZXZlbiB3cmFwcGVycyEpIGluIGNhc2VcbiAgICAgICAgLy8gdGhleSBoYXZlIG5vIHNpZ25hdHVyZXMgb2YgdGhlaXIgb3duLiBUaGlzIGlzIHRvIHByZXZlbnRcbiAgICAgICAgLy8gcHJvYmxlbXMgbGlrZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIwNDE3LlxuXG5cbiAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCAmJiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSkge1xuICAgICAgICAgIHNldFNpZ25hdHVyZSh0eXBlLCBrZXksIGZvcmNlUmVzZXQsIGdldEN1c3RvbUhvb2tzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2UncmUgaW4gdGhlIF9zKCkgY2FsbCB3aXRob3V0IGFyZ3VtZW50cywgd2hpY2ggbWVhbnNcbiAgICAgICAgLy8gdGhpcyBpcyB0aGUgdGltZSB0byBjb2xsZWN0IGN1c3RvbSBIb29rIHNpZ25hdHVyZXMuXG4gICAgICAgIC8vIE9ubHkgZG8gdGhpcyBvbmNlLiBUaGlzIHBhdGggaXMgaG90IGFuZCBydW5zICppbnNpZGUqIGV2ZXJ5IHJlbmRlciFcbiAgICAgICAgaWYgKCFkaWRDb2xsZWN0SG9va3MgJiYgaGFzQ3VzdG9tSG9va3MpIHtcbiAgICAgICAgICBkaWRDb2xsZWN0SG9va3MgPSB0cnVlO1xuICAgICAgICAgIGNvbGxlY3RDdXN0b21Ib29rc0ZvclNpZ25hdHVyZShzYXZlZFR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gaXNMaWtlbHlDb21wb25lbnRUeXBlKHR5cGUpIHtcbiAge1xuICAgIHN3aXRjaCAodHlwZW9mIHR5cGUpIHtcbiAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAge1xuICAgICAgICAgIC8vIEZpcnN0LCBkZWFsIHdpdGggY2xhc3Nlcy5cbiAgICAgICAgICBpZiAodHlwZS5wcm90b3R5cGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGUucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgLy8gUmVhY3QgY2xhc3MuXG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb3duTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0eXBlLnByb3RvdHlwZSk7XG5cbiAgICAgICAgICAgIGlmIChvd25OYW1lcy5sZW5ndGggPiAxIHx8IG93bk5hbWVzWzBdICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgICAgIC8vIFRoaXMgbG9va3MgbGlrZSBhIGNsYXNzLlxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b1xuXG5cbiAgICAgICAgICAgIGlmICh0eXBlLnByb3RvdHlwZS5fX3Byb3RvX18gIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgICAgICAgLy8gSXQgaGFzIGEgc3VwZXJjbGFzcy5cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSAvLyBQYXNzIHRocm91Z2guXG4gICAgICAgICAgICAvLyBUaGlzIGxvb2tzIGxpa2UgYSByZWd1bGFyIGZ1bmN0aW9uIHdpdGggZW1wdHkgcHJvdG90eXBlLlxuXG4gICAgICAgICAgfSAvLyBGb3IgcGxhaW4gZnVuY3Rpb25zIGFuZCBhcnJvd3MsIHVzZSBuYW1lIGFzIGEgaGV1cmlzdGljLlxuXG5cbiAgICAgICAgICB2YXIgbmFtZSA9IHR5cGUubmFtZSB8fCB0eXBlLmRpc3BsYXlOYW1lO1xuICAgICAgICAgIHJldHVybiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgJiYgL15bQS1aXS8udGVzdChuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgc3dpdGNoIChnZXRQcm9wZXJ0eSh0eXBlLCAnJCR0eXBlb2YnKSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICAgIC8vIERlZmluaXRlbHkgUmVhY3QgY29tcG9uZW50cy5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnRzLl9nZXRNb3VudGVkUm9vdENvdW50ID0gX2dldE1vdW50ZWRSb290Q291bnQ7XG5leHBvcnRzLmNvbGxlY3RDdXN0b21Ib29rc0ZvclNpZ25hdHVyZSA9IGNvbGxlY3RDdXN0b21Ib29rc0ZvclNpZ25hdHVyZTtcbmV4cG9ydHMuY3JlYXRlU2lnbmF0dXJlRnVuY3Rpb25Gb3JUcmFuc2Zvcm0gPSBjcmVhdGVTaWduYXR1cmVGdW5jdGlvbkZvclRyYW5zZm9ybTtcbmV4cG9ydHMuZmluZEFmZmVjdGVkSG9zdEluc3RhbmNlcyA9IGZpbmRBZmZlY3RlZEhvc3RJbnN0YW5jZXM7XG5leHBvcnRzLmdldEZhbWlseUJ5SUQgPSBnZXRGYW1pbHlCeUlEO1xuZXhwb3J0cy5nZXRGYW1pbHlCeVR5cGUgPSBnZXRGYW1pbHlCeVR5cGU7XG5leHBvcnRzLmhhc1VucmVjb3ZlcmFibGVFcnJvcnMgPSBoYXNVbnJlY292ZXJhYmxlRXJyb3JzO1xuZXhwb3J0cy5pbmplY3RJbnRvR2xvYmFsSG9vayA9IGluamVjdEludG9HbG9iYWxIb29rO1xuZXhwb3J0cy5pc0xpa2VseUNvbXBvbmVudFR5cGUgPSBpc0xpa2VseUNvbXBvbmVudFR5cGU7XG5leHBvcnRzLnBlcmZvcm1SZWFjdFJlZnJlc2ggPSBwZXJmb3JtUmVhY3RSZWZyZXNoO1xuZXhwb3J0cy5yZWdpc3RlciA9IHJlZ2lzdGVyO1xuZXhwb3J0cy5zZXRTaWduYXR1cmUgPSBzZXRTaWduYXR1cmU7XG4gIH0pKCk7XG59XG5cbi8vIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vdml0ZWpzL3ZpdGUtcGx1Z2luLXJlYWN0L2Jsb2IvbWFpbi9wYWNrYWdlcy9wbHVnaW4tcmVhY3Qvc3JjL3JlZnJlc2hVdGlscy5qc1xuLy8gVGhpcyBmaWxlIGdldHMgaW5qZWN0ZWQgaW50byB0aGUgYnJvd3NlciBhcyBhIHBhcnQgb2YgdGhlIEhNUiBydW50aW1lXG5cbmZ1bmN0aW9uIGRlYm91bmNlKGZuLCBkZWxheSkge1xuICBsZXQgaGFuZGxlO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICAgIGhhbmRsZSA9IHNldFRpbWVvdXQoZm4sIGRlbGF5KTtcbiAgfTtcbn1cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbmNvbnN0IGVucXVldWVVcGRhdGUgPSBkZWJvdW5jZShhc3luYyAoKSA9PiB7XG4gIGxldCBtYW5pZmVzdDtcbiAgaWYgKHJvdXRlVXBkYXRlcy5zaXplID4gMCkge1xuICAgIG1hbmlmZXN0ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShfX3JlbWl4TWFuaWZlc3QpKTtcblxuICAgIGZvciAobGV0IHJvdXRlIG9mIHJvdXRlVXBkYXRlcy52YWx1ZXMoKSkge1xuICAgICAgbWFuaWZlc3Qucm91dGVzW3JvdXRlLmlkXSA9IHJvdXRlO1xuICAgICAgbGV0IGltcG9ydGVkID0gd2luZG93Ll9fcmVtaXhSb3V0ZU1vZHVsZVVwZGF0ZXMuZ2V0KHJvdXRlLmlkKTtcbiAgICAgIGlmICghaW1wb3J0ZWQpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYFtyZW1peDpobXJdIE5vIG1vZHVsZSB1cGRhdGUgZm91bmQgZm9yIHJvdXRlICR7cm91dGUuaWR9YCk7XG4gICAgICB9XG4gICAgICBsZXQgcm91dGVNb2R1bGUgPSB7XG4gICAgICAgIC4uLmltcG9ydGVkLFxuICAgICAgICAvLyByZWFjdC1yZWZyZXNoIHRha2VzIGNhcmUgb2YgdXBkYXRpbmcgdGhlc2UgaW4tcGxhY2UsXG4gICAgICAgIC8vIGlmIHdlIGRvbid0IHByZXNlcnZlIGV4aXN0aW5nIHZhbHVlcyB3ZSdsbCBsb29zZSBzdGF0ZS5cbiAgICAgICAgZGVmYXVsdDogaW1wb3J0ZWQuZGVmYXVsdFxuICAgICAgICAgID8gd2luZG93Ll9fcmVtaXhSb3V0ZU1vZHVsZXNbcm91dGUuaWRdPy5kZWZhdWx0ID8/IGltcG9ydGVkLmRlZmF1bHRcbiAgICAgICAgICA6IGltcG9ydGVkLmRlZmF1bHQsXG4gICAgICAgIEVycm9yQm91bmRhcnk6IGltcG9ydGVkLkVycm9yQm91bmRhcnlcbiAgICAgICAgICA/IHdpbmRvdy5fX3JlbWl4Um91dGVNb2R1bGVzW3JvdXRlLmlkXT8uRXJyb3JCb3VuZGFyeSA/P1xuICAgICAgICAgICAgaW1wb3J0ZWQuRXJyb3JCb3VuZGFyeVxuICAgICAgICAgIDogaW1wb3J0ZWQuRXJyb3JCb3VuZGFyeSxcbiAgICAgICAgSHlkcmF0ZUZhbGxiYWNrOiBpbXBvcnRlZC5IeWRyYXRlRmFsbGJhY2tcbiAgICAgICAgICA/IHdpbmRvdy5fX3JlbWl4Um91dGVNb2R1bGVzW3JvdXRlLmlkXT8uSHlkcmF0ZUZhbGxiYWNrID8/XG4gICAgICAgICAgICBpbXBvcnRlZC5IeWRyYXRlRmFsbGJhY2tcbiAgICAgICAgICA6IGltcG9ydGVkLkh5ZHJhdGVGYWxsYmFjayxcbiAgICAgIH07XG4gICAgICB3aW5kb3cuX19yZW1peFJvdXRlTW9kdWxlc1tyb3V0ZS5pZF0gPSByb3V0ZU1vZHVsZTtcbiAgICB9XG5cbiAgICBsZXQgbmVlZHNSZXZhbGlkYXRpb24gPSBuZXcgU2V0KFxuICAgICAgQXJyYXkuZnJvbShyb3V0ZVVwZGF0ZXMudmFsdWVzKCkpXG4gICAgICAgIC5maWx0ZXIoKHJvdXRlKSA9PiByb3V0ZS5oYXNMb2FkZXIgfHwgcm91dGUuaGFzQ2xpZW50TG9hZGVyKVxuICAgICAgICAubWFwKChyb3V0ZSkgPT4gcm91dGUuaWQpXG4gICAgKTtcblxuICAgIGxldCByb3V0ZXMgPSBfX3JlbWl4Um91dGVyLmNyZWF0ZVJvdXRlc0ZvckhNUihcbiAgICAgIG5lZWRzUmV2YWxpZGF0aW9uLFxuICAgICAgbWFuaWZlc3Qucm91dGVzLFxuICAgICAgd2luZG93Ll9fcmVtaXhSb3V0ZU1vZHVsZXMsXG4gICAgICB3aW5kb3cuX19yZW1peENvbnRleHQuZnV0dXJlLFxuICAgICAgd2luZG93Ll9fcmVtaXhDb250ZXh0LmlzU3BhTW9kZVxuICAgICk7XG4gICAgX19yZW1peFJvdXRlci5faW50ZXJuYWxTZXRSb3V0ZXMocm91dGVzKTtcbiAgICByb3V0ZVVwZGF0ZXMuY2xlYXIoKTtcbiAgICB3aW5kb3cuX19yZW1peFJvdXRlTW9kdWxlVXBkYXRlcy5jbGVhcigpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICB3aW5kb3cuX19yZW1peEhkckFjdGl2ZSA9IHRydWU7XG4gICAgYXdhaXQgcmV2YWxpZGF0ZSgpO1xuICB9IGZpbmFsbHkge1xuICAgIHdpbmRvdy5fX3JlbWl4SGRyQWN0aXZlID0gZmFsc2U7XG4gIH1cblxuICBpZiAobWFuaWZlc3QpIHtcbiAgICBPYmplY3QuYXNzaWduKHdpbmRvdy5fX3JlbWl4TWFuaWZlc3QsIG1hbmlmZXN0KTtcbiAgfVxuICBleHBvcnRzLnBlcmZvcm1SZWFjdFJlZnJlc2goKTtcbn0sIDE2KTtcblxuLy8gVGFrZW4gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vcG1tbXdoL3JlYWN0LXJlZnJlc2gtd2VicGFjay1wbHVnaW4vYmxvYi9tYWluL2xpYi9ydW50aW1lL1JlZnJlc2hVdGlscy5qcyNMMTQxXG4vLyBUaGlzIGFsbG93cyB0byByZXNpc3RlciBjb21wb25lbnRzIG5vdCBkZXRlY3RlZCBieSBTV0MgbGlrZSBzdHlsZWQgY29tcG9uZW50XG5mdW5jdGlvbiByZWdpc3RlckV4cG9ydHNGb3JSZWFjdFJlZnJlc2goZmlsZW5hbWUsIG1vZHVsZUV4cG9ydHMpIHtcbiAgZm9yIChsZXQga2V5IGluIG1vZHVsZUV4cG9ydHMpIHtcbiAgICBpZiAoa2V5ID09PSBcIl9fZXNNb2R1bGVcIikgY29udGludWU7XG4gICAgbGV0IGV4cG9ydFZhbHVlID0gbW9kdWxlRXhwb3J0c1trZXldO1xuICAgIGlmIChleHBvcnRzLmlzTGlrZWx5Q29tcG9uZW50VHlwZShleHBvcnRWYWx1ZSkpIHtcbiAgICAgIC8vICdleHBvcnQnIGlzIHJlcXVpcmVkIHRvIGF2b2lkIGtleSBjb2xsaXNpb24gd2hlbiByZW5hbWVkIGV4cG9ydHMgdGhhdFxuICAgICAgLy8gc2hhZG93IGEgbG9jYWwgY29tcG9uZW50IG5hbWU6IGh0dHBzOi8vZ2l0aHViLmNvbS92aXRlanMvdml0ZS1wbHVnaW4tcmVhY3QvaXNzdWVzLzExNlxuICAgICAgLy8gVGhlIHJlZ2lzdGVyIGZ1bmN0aW9uIGhhcyBhbiBpZGVudGl0eSBjaGVjayB0byBub3QgcmVnaXN0ZXIgdHdpY2UgdGhlIHNhbWUgY29tcG9uZW50LFxuICAgICAgLy8gc28gdGhpcyBpcyBzYWZlIHRvIG5vdCB1c2VkIHRoZSBzYW1lIGtleSBoZXJlLlxuICAgICAgZXhwb3J0cy5yZWdpc3RlcihleHBvcnRWYWx1ZSwgZmlsZW5hbWUgKyBcIiBleHBvcnQgXCIgKyBrZXkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVJlZnJlc2hCb3VuZGFyeUFuZEVucXVldWVVcGRhdGUoXG4gIHByZXZFeHBvcnRzLFxuICBuZXh0RXhwb3J0cyxcbiAgLy8gbm9uLWNvbXBvbmVudCBleHBvcnRzIHRoYXQgYXJlIGhhbmRsZWQgYnkgdGhlIGZyYW1ld29yayAoZS5nLiBgbWV0YWAgYW5kIGBsaW5rc2AgZm9yIHJvdXRlIG1vZHVsZXMpXG4gIGFjY2VwdEV4cG9ydHMgPSBbXVxuKSB7XG4gIGlmIChcbiAgICAhcHJlZGljYXRlT25FeHBvcnQoXG4gICAgICBwcmV2RXhwb3J0cyxcbiAgICAgIChrZXkpID0+IGtleSBpbiBuZXh0RXhwb3J0cyB8fCBhY2NlcHRFeHBvcnRzLmluY2x1ZGVzKGtleSlcbiAgICApXG4gICkge1xuICAgIHJldHVybiBcIkNvdWxkIG5vdCBGYXN0IFJlZnJlc2ggKGV4cG9ydCByZW1vdmVkKVwiO1xuICB9XG4gIGlmIChcbiAgICAhcHJlZGljYXRlT25FeHBvcnQoXG4gICAgICBuZXh0RXhwb3J0cyxcbiAgICAgIChrZXkpID0+IGtleSBpbiBwcmV2RXhwb3J0cyB8fCBhY2NlcHRFeHBvcnRzLmluY2x1ZGVzKGtleSlcbiAgICApXG4gICkge1xuICAgIHJldHVybiBcIkNvdWxkIG5vdCBGYXN0IFJlZnJlc2ggKG5ldyBleHBvcnQpXCI7XG4gIH1cblxuICBsZXQgaGFzRXhwb3J0cyA9IGZhbHNlO1xuICBsZXQgYWxsRXhwb3J0c0FyZUhhbmRsZWRPclVuY2hhbmdlZCA9IHByZWRpY2F0ZU9uRXhwb3J0KFxuICAgIG5leHRFeHBvcnRzLFxuICAgIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBoYXNFeHBvcnRzID0gdHJ1ZTtcbiAgICAgIC8vIFJlbWl4IGNhbiBoYW5kbGUgUmVtaXgtc3BlY2lmaWMgZXhwb3J0cyAoZS5nLiBgbWV0YWAgYW5kIGBsaW5rc2ApXG4gICAgICBpZiAoYWNjZXB0RXhwb3J0cy5pbmNsdWRlcyhrZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIC8vIFJlYWN0IEZhc3QgUmVmcmVzaCBjYW4gaGFuZGxlIGNvbXBvbmVudCBleHBvcnRzXG4gICAgICBpZiAoZXhwb3J0cy5pc0xpa2VseUNvbXBvbmVudFR5cGUodmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIC8vIFVuY2hhbmdlZCBleHBvcnRzIGFyZSBpbXBsaWNpdGx5IGhhbmRsZWRcbiAgICAgIHJldHVybiBwcmV2RXhwb3J0c1trZXldID09PSBuZXh0RXhwb3J0c1trZXldO1xuICAgIH1cbiAgKTtcbiAgaWYgKGhhc0V4cG9ydHMgJiYgYWxsRXhwb3J0c0FyZUhhbmRsZWRPclVuY2hhbmdlZCkge1xuICAgIGVucXVldWVVcGRhdGUoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCJDb3VsZCBub3QgRmFzdCBSZWZyZXNoLiBMZWFybiBtb3JlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS92aXRlanMvdml0ZS1wbHVnaW4tcmVhY3QvdHJlZS9tYWluL3BhY2thZ2VzL3BsdWdpbi1yZWFjdCNjb25zaXN0ZW50LWNvbXBvbmVudHMtZXhwb3J0c1wiO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByZWRpY2F0ZU9uRXhwb3J0KG1vZHVsZUV4cG9ydHMsIHByZWRpY2F0ZSkge1xuICBmb3IgKGxldCBrZXkgaW4gbW9kdWxlRXhwb3J0cykge1xuICAgIGlmIChrZXkgPT09IFwiX19lc01vZHVsZVwiKSBjb250aW51ZTtcbiAgICBsZXQgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobW9kdWxlRXhwb3J0cywga2V5KTtcbiAgICBpZiAoZGVzYyAmJiBkZXNjLmdldCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghcHJlZGljYXRlKGtleSwgbW9kdWxlRXhwb3J0c1trZXldKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBIaWRlcyB2aXRlLWlnbm9yZWQgZHluYW1pYyBpbXBvcnQgc28gdGhhdCBWaXRlIGNhbiBza2lwIGFuYWx5c2lzIGlmIG5vIG90aGVyXG4vLyBkeW5hbWljIGltcG9ydCBpcyBwcmVzZW50IChodHRwczovL2dpdGh1Yi5jb20vdml0ZWpzL3ZpdGUvcHVsbC8xMjczMilcbmZ1bmN0aW9uIF9faG1yX2ltcG9ydChtb2R1bGUpIHtcbiAgcmV0dXJuIGltcG9ydCgvKiBAdml0ZS1pZ25vcmUgKi8gbW9kdWxlKTtcbn1cblxuY29uc3Qgcm91dGVVcGRhdGVzID0gbmV3IE1hcCgpO1xud2luZG93Ll9fcmVtaXhSb3V0ZU1vZHVsZVVwZGF0ZXMgPSBuZXcgTWFwKCk7XG5cbmFzeW5jIGZ1bmN0aW9uIHJldmFsaWRhdGUoKSB7XG4gIGxldCB7IHByb21pc2UsIHJlc29sdmUgfSA9IGNoYW5uZWwoKTtcbiAgbGV0IHVuc3ViID0gX19yZW1peFJvdXRlci5zdWJzY3JpYmUoKHN0YXRlKSA9PiB7XG4gICAgaWYgKHN0YXRlLnJldmFsaWRhdGlvbiA9PT0gXCJpZGxlXCIpIHtcbiAgICAgIHVuc3ViKCk7XG4gICAgICAvLyBFbnN1cmUgUm91dGVyUHJvdmlkZXIgc2V0U3RhdGUgaGFzIGZsdXNoZWQgYmVmb3JlIHJlLXJlbmRlcmluZ1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH1cbiAgfSk7XG4gIHdpbmRvdy5fX3JlbWl4UmV2YWxpZGF0aW9uID0gKHdpbmRvdy5fX3JlbWl4UmV2YWxpZGF0aW9uIHx8IDApICsgMTtcbiAgX19yZW1peFJvdXRlci5yZXZhbGlkYXRlKCk7XG4gIHJldHVybiBwcm9taXNlO1xufVxuXG5mdW5jdGlvbiBjaGFubmVsKCkge1xuICBsZXQgcmVzb2x2ZTtcbiAgbGV0IHJlamVjdDtcblxuICBsZXQgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xuICAgIHJlc29sdmUgPSBfcmVzb2x2ZTtcbiAgICByZWplY3QgPSBfcmVqZWN0O1xuICB9KTtcbiAgcmV0dXJuIHsgcHJvbWlzZSwgcmVzb2x2ZSwgcmVqZWN0IH07XG59XG5cbmltcG9ydC5tZXRhLmhvdC5vbihcInJlbWl4OmhtclwiLCBhc3luYyAoeyByb3V0ZSB9KSA9PiB7XG4gIHdpbmRvdy5fX3JlbWl4Q2xlYXJDcml0aWNhbENzcygpO1xuXG4gIGlmIChyb3V0ZSkge1xuICAgIHJvdXRlVXBkYXRlcy5zZXQocm91dGUuaWQsIHJvdXRlKTtcbiAgfVxufSk7XG5cbmV4cG9ydHMuX19obXJfaW1wb3J0ID0gX19obXJfaW1wb3J0O1xuZXhwb3J0cy5yZWdpc3RlckV4cG9ydHNGb3JSZWFjdFJlZnJlc2ggPSByZWdpc3RlckV4cG9ydHNGb3JSZWFjdFJlZnJlc2g7XG5leHBvcnRzLnZhbGlkYXRlUmVmcmVzaEJvdW5kYXJ5QW5kRW5xdWV1ZVVwZGF0ZSA9XG4gIHZhbGlkYXRlUmVmcmVzaEJvdW5kYXJ5QW5kRW5xdWV1ZVVwZGF0ZTtcbmV4cG9ydHMuZW5xdWV1ZVVwZGF0ZSA9IGVucXVldWVVcGRhdGU7XG5cbmV4cG9ydCBkZWZhdWx0IGV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sVUFBVSxDQUFDO0FBQ2pCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVVBO0FBRUEsSUFBSSxNQUF1QztBQUN6QyxHQUFDLFdBQVc7QUFDZDtBQUdBLFFBQUkseUJBQXlCLE9BQU8sSUFBSSxtQkFBbUI7QUFDM0QsUUFBSSxrQkFBa0IsT0FBTyxJQUFJLFlBQVk7QUFFN0MsUUFBSSxrQkFBa0IsT0FBTyxZQUFZLGFBQWEsVUFBVTtBQUdoRSxRQUFJLGtCQUFrQixvQkFBSSxJQUFJO0FBQzlCLFFBQUksb0JBQW9CLElBQUksZ0JBQWdCO0FBQzVDLFFBQUksc0JBQXNCLElBQUksZ0JBQWdCO0FBSTlDLFFBQUksd0JBQXdCLElBQUksZ0JBQWdCO0FBR2hELFFBQUksaUJBQWlCLENBQUM7QUFFdEIsUUFBSSxzQkFBc0Is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_� {"version":3,"sources":["\u0000virtual:remix/hmr-runtime"],"sourcesContent":["const exports = {}\n/**\n * @license React\n * react-refresh-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\n// ATTENTION\nvar REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nvar REACT_MEMO_TYPE = Symbol.for('react.memo');\n\nvar PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; // We never remove these associations.\n// It's OK to reference families, but use WeakMap/Set for types.\n\nvar allFamiliesByID = new Map();\nvar allFamiliesByType = new PossiblyWeakMap();\nvar allSignaturesByType = new PossiblyWeakMap(); // This WeakMap is read by React, so we only put families\n// that have actually been edited here. This keeps checks fast.\n// $FlowIssue\n\nvar updatedFamiliesByType = new PossiblyWeakMap(); // This is cleared on every performReactRefresh() call.\n// It is an array of [Family, NextType] tuples.\n\nvar pendingUpdates = []; // This is injected by the renderer via DevTools global hook.\n\nvar helpersByRendererID = new Map();\nvar helpersByRoot = new Map(); // We keep track of mounted roots so we can schedule updates.\n\nvar mountedRoots = new Set(); // If a root captures an error, we remember it so we can retry on edit.\n\nvar failedRoots = new Set(); // In environments that support WeakMap, we also remember the last element for every root.\n// It needs to be weak because we do this even for roots that failed to mount.\n// If there is no WeakMap, we won't attempt to do retrying.\n// $FlowIssue\n\nvar rootElements = // $FlowIssue\ntypeof WeakMap === 'function' ? new WeakMap() : null;\nvar isPerformingRefresh = false;\n\nfunction computeFullKey(signature) {\n if (signature.fullKey !== null) {\n return signature.fullKey;\n }\n\n var fullKey = signature.ownKey;\n var hooks;\n\n try {\n hooks = signature.getCustomHooks();\n } catch (err) {\n // This can happen in an edge case, e.g. if expression like Foo.useSomething\n // depends on Foo which is lazily initialized during rendering.\n // In that case just assume we'll have to remount.\n signature.forceReset = true;\n signature.fullKey = fullKey;\n return fullKey;\n }\n\n for (var i = 0; i < hooks.length; i++) {\n var hook = hooks[i];\n\n if (typeof hook !== 'function') {\n // Something's wrong. Assume we need to remount.\n signature.forceReset = true;\n signature.fullKey = fullKey;\n return fullKey;\n }\n\n var nestedHookSignature = allSignaturesByType.get(hook);\n\n if (nestedHookSignature === undefined) {\n // No signature means Hook wasn't in the source code, e.g. in a library.\n // We'll skip it because we can assume it won't change during this session.\n continue;\n }\n\n var nestedHookKey = computeFullKey(nestedHookSignature);\n\n if (nestedHookSignature.forceReset) {\n signature.forceReset = true;\n }\n\n fullKey += '\\n---\\n' + nestedHookKey;\n }\n\n signature.fullKey = fullKey;\n return fullKey;\n}\n\nfunction haveEqualSignatures(prevType, nextType) {\n var prevSignature = allSignaturesByType.get(prevType);\n var nextSignature = allSignaturesByType.get(nextType);\n\n if (prevSignature === undefined && nextSignature === undefined) {\n return true;\n }\n\n if (prevSignature === undefined || nextSignature === undefined) {\n return false;\n }\n\n if (computeFullKey(prevSignature) !== computeFullKey(nextSignature)) {\n return false;\n }\n\n if (nextSignature.forceReset) {\n return false;\n }\n\n return true;\n}\n\nfunction isReactClass(type) {\n return type.prototype && type.prototype.isReactComponent;\n}\n\nfunction canPreserveStateBetween(prevType, nextType) {\n if (isReactClass(prevType) || isReactClass(nextType)) {\n return false;\n }\n\n if (haveEqualSignatures(prevType, nextType)) {\n return true;\n }\n\n return false;\n}\n\nfunction resolveFamily(type) {\n // Only check updated types to keep lookups fast.\n return updatedFamiliesByType.get(type);\n} // If we didn't care about IE11, we could use new Map/Set(iterable).\n\n\nfunction cloneMap(map) {\n var clone = new Map();\n map.forEach(function (value, key) {\n clone.set(key, value);\n });\n return clone;\n}\n\nfunction cloneSet(set) {\n var clone = new Set();\n set.forEach(function (value) {\n clone.add(value);\n });\n return clone;\n} // This is a safety mechanism to protect against rogue getters and Proxies.\n\n\nfunction getProperty(object, property) {\n try {\n return object[property];\n } catch (err) {\n // Intentionally ignore.\n return undefined;\n }\n}\n\nfunction performReactRefresh() {\n\n if (pendingUpdates.length === 0) {\n return null;\n }\n\n if (isPerformingRefresh) {\n return null;\n }\n\n isPerformingRefresh = true;\n\n try {\n var staleFamilies = new Set();\n var updatedFamilies = new Set();\n var updates = pendingUpdates;\n pendingUpdates = [];\n updates.forEach(function (_ref) {\n var family = _ref[0],\n nextType = _ref[1];\n // Now that we got a real edit, we can create associations\n // that will be read by the React reconciler.\n var prevType = family.current;\n updatedFamiliesByType.set(prevType, family);\n updatedFamiliesByType.set(nextType, family);\n family.current = nextType; // Determine whether this should be a re-render or a re-mount.\n\n if (canPreserveStateBetween(prevType, nextType)) {\n updatedFamilies.add(family);\n } else {\n staleFamilies.add(family);\n }\n }); // TODO: rename these fields to something more meaningful.\n\n var update = {\n updatedFamilies: updatedFamilies,\n // Families that will re-render preserving state\n staleFamilies: staleFamilies // Families that will be remounted\n\n };\n helpersByRendererID.forEach(function (helpers) {\n // Even if there are no roots, set the handler on first update.\n // This ensures that if *new* roots are mounted, they'll use the resolve handler.\n helpers.setRefreshHandler(resolveFamily);\n });\n var didError = false;\n var firstError = null; // We snapshot maps and sets that are mutated during commits.\n // If we don't do this, there is a risk they will be mutated while\n // we iterate over them. For example, trying to recover a failed root\n // may cause another root to be added to the failed list -- an infinite loop.\n\n var failedRootsSnapshot = cloneSet(failedRoots);\n var mountedRootsSnapshot = cloneSet(mountedRoots);\n var helpersByRootSnapshot = cloneMap(helpersByRoot);\n failedRootsSnapshot.forEach(function (root) {\n var helpers = helpersByRootSnapshot.get(root);\n\n if (helpers === undefined) {\n throw new Error('Could not find helpers for a root. This is a bug in React Refresh.');\n }\n\n if (!failedRoots.has(root)) {// No longer failed.\n }\n\n if (rootElements === null) {\n return;\n }\n\n if (!rootElements.has(root)) {\n return;\n }\n\n var element = rootElements.get(root);\n\n try {\n helpers.scheduleRoot(root, element);\n } catch (err) {\n if (!didError) {\n didError = true;\n firstError = err;\n } // Keep trying other roots.\n\n }\n });\n mountedRootsSnapshot.forEach(function (root) {\n var helpers = helpersByRootSnapshot.get(root);\n\n if (helpers === undefined) {\n throw new Error('Could not find helpers for a root. This is a bug in React Refresh.');\n }\n\n if (!mountedRoots.has(root)) {// No longer mounted.\n }\n\n try {\n helpers.scheduleRefresh(root, update);\n } catch (err) {\n if (!didError) {\n didError = true;\n firstError = err;\n } // Keep trying other roots.\n\n }\n });\n\n if (didError) {\n throw firstError;\n }\n\n return update;\n } finally {\n isPerformingRefresh = false;\n }\n}\nfunction register(type, id) {\n {\n if (type === null) {\n return;\n }\n\n if (typeof type !== 'function' && typeof type !== 'object') {\n return;\n } // This can happen in an edge case, e.g. if we register\n // return value of a HOC but it returns a cached component.\n // Ignore anything but the first registration for each type.\n\n\n if (allFamiliesByType.has(type)) {\n return;\n } // Create family or remember to update it.\n // None of this bookkeeping affects reconciliation\n // until the first performReactRefresh() call above.\n\n\n var family = allFamiliesByID.get(id);\n\n if (family === undefined) {\n family = {\n current: type\n };\n allFamiliesByID.set(id, family);\n } else {\n pendingUpdates.push([family, type]);\n }\n\n allFamiliesByType.set(type, family); // Visit inner types because we might not have registered them.\n\n if (typeof type === 'object' && type !== null) {\n switch (getProperty(type, '$$typeof')) {\n case REACT_FORWARD_REF_TYPE:\n register(type.render, id + '$render');\n break;\n\n case REACT_MEMO_TYPE:\n register(type.type, id + '$type');\n break;\n }\n }\n }\n}\nfunction setSignature(type, key) {\n var forceReset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var getCustomHooks = arguments.length > 3 ? arguments[3] : undefined;\n\n {\n if (!allSignaturesByType.has(type)) {\n allSignaturesByType.set(type, {\n forceReset: forceReset,\n ownKey: key,\n fullKey: null,\n getCustomHooks: getCustomHooks || function () {\n return [];\n }\n });\n } // Visit inner types because we might not have signed them.\n\n\n if (typeof type === 'object' && type !== null) {\n switch (getProperty(type, '$$typeof')) {\n case REACT_FORWARD_REF_TYPE:\n setSignature(type.render, key, forceReset, getCustomHooks);\n break;\n\n case REACT_MEMO_TYPE:\n setSignature(type.type, key, forceReset, getCustomHooks);\n break;\n }\n }\n }\n} // This is lazily called during first render for a type.\n// It captures Hook list at that time so inline requires don't break comparisons.\n\nfunction collectCustomHooksForSignature(type) {\n {\n var signature = allSignaturesByType.get(type);\n\n if (signature !== undefined) {\n computeFullKey(signature);\n }\n }\n}\nfunction getFamilyByID(id) {\n {\n return allFamiliesByID.get(id);\n }\n}\nfunction getFamilyByType(type) {\n {\n return allFamiliesByType.get(type);\n }\n}\nfunction findAffectedHostInstances(families) {\n {\n var affectedInstances = new Set();\n mountedRoots.forEach(function (root) {\n var helpers = helpersByRoot.get(root);\n\n if (helpers === undefined) {\n throw new Error('Could not find helpers for a root. This is a bug in React Refresh.');\n }\n\n var instancesForRoot = helpers.findHostInstancesForRefresh(root, families);\n instancesForRoot.forEach(function (inst) {\n affectedInstances.add(inst);\n });\n });\n return affectedInstances;\n }\n}\nfunction injectIntoGlobalHook(globalObject) {\n {\n // For React Native, the global hook will be set up by require('react-devtools-core').\n // That code will run before us. So we need to monkeypatch functions on existing hook.\n // For React Web, the global hook will be set up by the extension.\n // This will also run before us.\n var hook = globalObject.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n\n if (hook === undefined) {\n // However, if there is no DevTools extension, we'll need to set up the global hook ourselves.\n // Note that in this case it's important that renderer code runs *after* this method call.\n // Otherwise, the renderer will think that there is no global hook, and won't do the injection.\n var nextID = 0;\n globalObject.__REACT_DEVTOOLS_GLOBAL_HOOK__ = hook = {\n renderers: new Map(),\n supportsFiber: true,\n inject: function (injected) {\n return nextID++;\n },\n onScheduleFiberRoot: function (id, root, children) {},\n onCommitFiberRoot: function (id, root, maybePriorityLevel, didError) {},\n onCommitFiberUnmount: function () {}\n };\n }\n\n if (hook.isDisabled) {\n // This isn't a real property on the hook, but it can be set to opt out\n // of DevTools integration and associated warnings and logs.\n // Using console['warn'] to evade Babel and ESLint\n console['warn']('Something has shimmed the React DevTools global hook (__REACT_DEVTOOLS_GLOBAL_HOOK__). ' + 'Fast Refresh is not compatible with this shim and will be disabled.');\n return;\n } // Here, we just want to get a reference to scheduleRefresh.\n\n\n var oldInject = hook.inject;\n\n hook.inject = function (injected) {\n var id = oldInject.apply(this, arguments);\n\n if (typeof injected.scheduleRefresh === 'function' && typeof injected.setRefreshHandler === 'function') {\n // This version supports React Refresh.\n helpersByRendererID.set(id, injected);\n }\n\n return id;\n }; // Do the same for any already injected roots.\n // This is useful if ReactDOM has already been initialized.\n // https://github.com/facebook/react/issues/17626\n\n\n hook.renderers.forEach(function (injected, id) {\n if (typeof injected.scheduleRefresh === 'function' && typeof injected.setRefreshHandler === 'function') {\n // This version supports React Refresh.\n helpersByRendererID.set(id, injected);\n }\n }); // We also want to track currently mounted roots.\n\n var oldOnCommitFiberRoot = hook.onCommitFiberRoot;\n\n var oldOnScheduleFiberRoot = hook.onScheduleFiberRoot || function () {};\n\n hook.onScheduleFiberRoot = function (id, root, children) {\n if (!isPerformingRefresh) {\n // If it was intentionally scheduled, don't attempt to restore.\n // This includes intentionally scheduled unmounts.\n failedRoots.delete(root);\n\n if (rootElements !== null) {\n rootElements.set(root, children);\n }\n }\n\n return oldOnScheduleFiberRoot.apply(this, arguments);\n };\n\n hook.onCommitFiberRoot = function (id, root, maybePriorityLevel, didError) {\n var helpers = helpersByRendererID.get(id);\n\n if (helpers !== undefined) {\n helpersByRoot.set(root, helpers);\n var current = root.current;\n var alternate = current.alternate; // We need to determine whether this root has just (un)mounted.\n // This logic is copy-pasted from similar logic in the DevTools backend.\n // If this breaks with some refactoring, you'll want to update DevTools too.\n\n if (alternate !== null) {\n var wasMounted = alternate.memoizedState != null && alternate.memoizedState.element != null && mountedRoots.has(root);\n var isMounted = current.memoizedState != null && current.memoizedState.element != null;\n\n if (!wasMounted && isMounted) {\n // Mount a new root.\n mountedRoots.add(root);\n failedRoots.delete(root);\n } else if (wasMounted && isMounted) ; else if (wasMounted && !isMounted) {\n // Unmount an existing root.\n mountedRoots.delete(root);\n\n if (didError) {\n // We'll remount it on future edits.\n failedRoots.add(root);\n } else {\n helpersByRoot.delete(root);\n }\n } else if (!wasMounted && !isMounted) {\n if (didError) {\n // We'll remount it on future edits.\n failedRoots.add(root);\n }\n }\n } else {\n // Mount a new root.\n mountedRoots.add(root);\n }\n } // Always call the decorated DevTools hook.\n\n\n return oldOnCommitFiberRoot.apply(this, arguments);\n };\n }\n}\nfunction hasUnrecoverableErrors() {\n // TODO: delete this after removing dependency in RN.\n return false;\n} // Exposed for testing.\n\nfunction _getMountedRootCount() {\n {\n return mountedRoots.size;\n }\n} // This is a wrapper over more primitive functions for setting signature.\n// Signatures let us decide whether the Hook order has changed on refresh.\n//\n// This function is intended to be used as a transform target, e.g.:\n// var _s = createSignatureFunctionForTransform()\n//\n// function Hello() {\n// const [foo, setFoo] = useState(0);\n// const value = useCustomHook();\n// _s(); /* Call without arguments triggers collecting the custom Hook list.\n// * This doesn't happen during the module evaluation because we\n// * don't want to change the module order with inline requires.\n// * Next calls are noops. */\n// return <h1>Hi</h1>;\n// }\n//\n// /* Call with arguments attaches the signature to the type: */\n// _s(\n// Hello,\n// 'useState{[foo, setFoo]}(0)',\n// () => [useCustomHook], /* Lazy to avoid triggering inline requires */\n// );\n\nfunction createSignatureFunctionForTransform() {\n {\n var savedType;\n var hasCustomHooks;\n var didCollectHooks = false;\n return function (type, key, forceReset, getCustomHooks) {\n if (typeof key === 'string') {\n // We're in the initial phase that associates signatures\n // with the functions. Note this may be called multiple times\n // in HOC chains like _s(hoc1(_s(hoc2(_s(actualFunction))))).\n if (!savedType) {\n // We're in the innermost call, so this is the actual type.\n savedType = type;\n hasCustomHooks = typeof getCustomHooks === 'function';\n } // Set the signature for all types (even wrappers!) in case\n // they have no signatures of their own. This is to prevent\n // problems like https://github.com/facebook/react/issues/20417.\n\n\n if (type != null && (typeof type === 'function' || typeof type === 'object')) {\n setSignature(type, key, forceReset, getCustomHooks);\n }\n\n return type;\n } else {\n // We're in the _s() call without arguments, which means\n // this is the time to collect custom Hook signatures.\n // Only do this once. This path is hot and runs *inside* every render!\n if (!didCollectHooks && hasCustomHooks) {\n didCollectHooks = true;\n collectCustomHooksForSignature(savedType);\n }\n }\n };\n }\n}\nfunction isLikelyComponentType(type) {\n {\n switch (typeof type) {\n case 'function':\n {\n // First, deal with classes.\n if (type.prototype != null) {\n if (type.prototype.isReactComponent) {\n // React class.\n return true;\n }\n\n var ownNames = Object.getOwnPropertyNames(type.prototype);\n\n if (ownNames.length > 1 || ownNames[0] !== 'constructor') {\n // This looks like a class.\n return false;\n } // eslint-disable-next-line no-proto\n\n\n if (type.prototype.__proto__ !== Object.prototype) {\n // It has a superclass.\n return false;\n } // Pass through.\n // This looks like a regular function with empty prototype.\n\n } // For plain functions and arrows, use name as a heuristic.\n\n\n var name = type.name || type.displayName;\n return typeof name === 'string' && /^[A-Z]/.test(name);\n }\n\n case 'object':\n {\n if (type != null) {\n switch (getProperty(type, '$$typeof')) {\n case REACT_FORWARD_REF_TYPE:\n case REACT_MEMO_TYPE:\n // Definitely React components.\n return true;\n\n default:\n return false;\n }\n }\n\n return false;\n }\n\n default:\n {\n return false;\n }\n }\n }\n}\n\nexports._getMountedRootCount = _getMountedRootCount;\nexports.collectCustomHooksForSignature = collectCustomHooksForSignature;\nexports.createSignatureFunctionForTransform = createSignatureFunctionForTransform;\nexports.findAffectedHostInstances = findAffectedHostInstances;\nexports.getFamilyByID = getFamilyByID;\nexports.getFamilyByType = getFamilyByType;\nexports.hasUnrecoverableErrors = hasUnrecoverableErrors;\nexports.injectIntoGlobalHook = injectIntoGlobalHook;\nexports.isLikelyComponentType = isLikelyComponentType;\nexports.performReactRefresh = performReactRefresh;\nexports.register = register;\nexports.setSignature = setSignature;\n })();\n}\n\n// adapted from https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/src/refreshUtils.js\n// This file gets injected into the browser as a part of the HMR runtime\n\nfunction debounce(fn, delay) {\n let handle;\n return () => {\n clearTimeout(handle);\n handle = setTimeout(fn, delay);\n };\n}\n\n/* eslint-disable no-undef */\nconst enqueueUpdate = debounce(async () => {\n let manifest;\n if (routeUpdates.size > 0) {\n manifest = JSON.parse(JSON.stringify(__remixManifest));\n\n for (let route of routeUpdates.values()) {\n manifest.routes[route.id] = route;\n let imported = window.__remixRouteModuleUpdates.get(route.id);\n if (!imported) {\n throw Error(`[remix:hmr] No module update found for route ${route.id}`);\n }\n let routeModule = {\n ...imported,\n // react-refresh takes care of updating these in-place,\n // if we don't preserve existing values we'll loose state.\n default: imported.default\n ? window.__remixRouteModules[route.id]?.default ?? imported.default\n : imported.default,\n ErrorBoundary: imported.ErrorBoundary\n ? window.__remixRouteModules[route.id]?.ErrorBoundary ??\n imported.ErrorBoundary\n : imported.ErrorBoundary,\n HydrateFallback: imported.HydrateFallback\n ? window.__remixRouteModules[route.id]?.HydrateFallback ??\n imported.HydrateFallback\n : imported.HydrateFallback,\n };\n window.__remixRouteModules[route.id] = routeModule;\n }\n\n let needsRevalidation = new Set(\n Array.from(routeUpdates.values())\n .filter((route) => route.hasLoader || route.hasClientLoader)\n .map((route) => route.id)\n );\n\n let routes = __remixRouter.createRoutesForHMR(\n needsRevalidation,\n manifest.routes,\n window.__remixRouteModules,\n window.__remixContext.future,\n window.__remixContext.isSpaMode\n );\n __remixRouter._internalSetRoutes(routes);\n routeUpdates.clear();\n window.__remixRouteModuleUpdates.clear();\n }\n\n try {\n window.__remixHdrActive = true;\n await revalidate();\n } finally {\n window.__remixHdrActive = false;\n }\n\n if (manifest) {\n Object.assign(window.__remixManifest, manifest);\n }\n exports.performReactRefresh();\n}, 16);\n\n// Taken from https://github.com/pmmmwh/react-refresh-webpack-plugin/blob/main/lib/runtime/RefreshUtils.js#L141\n// This allows to resister components not detected by SWC like styled component\nfunction registerExportsForReactRefresh(filename, moduleExports) {\n for (let key in moduleExports) {\n if (key === \"__esModule\") continue;\n let exportValue = moduleExports[key];\n if (exports.isLikelyComponentType(exportValue)) {\n // 'export' is required to avoid key collision when renamed exports that\n // shadow a local component name: https://github.com/vitejs/vite-plugin-react/issues/116\n // The register function has an identity check to not register twice the same component,\n // so this is safe to not used the same key here.\n exports.register(exportValue, filename + \" export \" + key);\n }\n }\n}\n\nfunction validateRefreshBoundaryAndEnqueueUpdate(\n prevExports,\n nextExports,\n // non-component exports that are handled by the framework (e.g. `meta` and `links` for route modules)\n acceptExports = []\n) {\n if (\n !predicateOnExport(\n prevExports,\n (key) => key in nextExports || acceptExports.includes(key)\n )\n ) {\n return \"Could not Fast Refresh (export removed)\";\n }\n if (\n !predicateOnExport(\n nextExports,\n (key) => key in prevExports || acceptExports.includes(key)\n )\n ) {\n return \"Could not Fast Refresh (new export)\";\n }\n\n let hasExports = false;\n let allExportsAreHandledOrUnchanged = predicateOnExport(\n nextExports,\n (key, value) => {\n hasExports = true;\n // Remix can handle Remix-specific exports (e.g. `meta` and `links`)\n if (acceptExports.includes(key)) return true;\n // React Fast Refresh can handle component exports\n if (exports.isLikelyComponentType(value)) return true;\n // Unchanged exports are implicitly handled\n return prevExports[key] === nextExports[key];\n }\n );\n if (hasExports && allExportsAreHandledOrUnchanged) {\n enqueueUpdate();\n } else {\n return \"Could not Fast Refresh. Learn more at https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react#consistent-components-exports\";\n }\n}\n\nfunction predicateOnExport(moduleExports, predicate) {\n for (let key in moduleExports) {\n if (key === \"__esModule\") continue;\n let desc = Object.getOwnPropertyDescriptor(moduleExports, key);\n if (desc && desc.get) return false;\n if (!predicate(key, moduleExports[key])) return false;\n }\n return true;\n}\n\n// Hides vite-ignored dynamic import so that Vite can skip analysis if no other\n// dynamic import is present (https://github.com/vitejs/vite/pull/12732)\nfunction __hmr_import(module) {\n return import(/* @vite-ignore */ module);\n}\n\nconst routeUpdates = new Map();\nwindow.__remixRouteModuleUpdates = new Map();\n\nasync function revalidate() {\n let { promise, resolve } = channel();\n let unsub = __remixRouter.subscribe((state) => {\n if (state.revalidation === \"idle\") {\n unsub();\n // Ensure RouterProvider setState has flushed before re-rendering\n resolve();\n }\n });\n window.__remixRevalidation = (window.__remixRevalidation || 0) + 1;\n __remixRouter.revalidate();\n return promise;\n}\n\nfunction channel() {\n let resolve;\n let reject;\n\n let promise = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n return { promise, resolve, reject };\n}\n\nimport.meta.hot.on(\"remix:hmr\", async ({ route }) => {\n window.__remixClearCriticalCss();\n\n if (route) {\n routeUpdates.set(route.id, route);\n }\n});\n\nexports.__hmr_import = __hmr_import;\nexports.registerExportsForReactRefresh = registerExportsForReactRefresh;\nexports.validateRefreshBoundaryAndEnqueueUpdate =\n validateRefreshBoundaryAndEnqueueUpdate;\nexports.enqueueUpdate = enqueueUpdate;\n\nexport default exports"],"mappings":"AAAA,MAAM,UAAU,CAAC;AACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;AAEA,IAAI,MAAuC;AACzC,GAAC,WAAW;AACd;AAGA,QAAI,yBAAyB,OAAO,IAAI,mBAAmB;AAC3D,QAAI,kBAAkB,OAAO,IAAI,YAAY;AAE7C,QAAI,kBAAkB,OAAO,YAAY,aAAa,UAAU;AAGhE,QAAI,kBAAkB,oBAAI,IAAI;AAC9B,QAAI,oBAAoB,IAAI,gBAAgB;AAC5C,QAAI,sBAAsB,IAAI,gBAAgB;AAI9C,QAAI,wBAAwB,IAAI,gBAAgB;AAGhD,QAAI,iBAAiB,CAAC;AAEtB,QAAI,sBAAsB,oBAAI,IAAI;AAClC,QAAI,gBAAgB,oBAAI,IAAI;AAE5B,QAAI,eAAe,oBAAI,IAAI;AAE3B,QAAI,cAAc,oBAAI,IAAI;AAK1B,QAAI;AAAA;AAAA,MACJ,OAAO,YAAY,aAAa,oBAAI,QAAQ,IAAI;AAAA;AAChD,QAAI,sBAAsB;AAE1B,aAAS,eAAe,WAAW;AACjC,UAAI,UAAU,YAAY,MAAM;AAC9B,eAAO,UAAU;AAAA,MACnB;AAEA,UAAI,UAAU,UAAU;AACxB,UAAI;AAEJ,UAAI;AACF,gBAAQ,UAAU,eAAe;AAAA,MACnC,SAAS,KAAK;AAIZ,kBAAU,aAAa;AACvB,kBAAU,UAAU;AACpB,eAAO;AAAA,MACT;AAEA,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAI,OAAO,MAAM,CAAC;AAElB,YAAI,OAAO,SAAS,YAAY;AAE9B,oBAAU,aAAa;AACvB,oBAAU,UAAU;AACpB,iBAAO;AAAA,QACT;AAEA,YAAI,sBAAsB,oBAAoB,IAAI,IAAI;AAEtD,YAAI,wBAAwB,QAAW;AAGrC;AAAA,QACF;AAEA,YAAI,gBAAgB,eAAe,mBAAmB;AAEtD,YAAI,oBAAoB,YAAY;AAClC,oBAAU,aAAa;AAAA,QACzB;AAEA,mBAAW,YAAY;AAAA,MACzB;AAEA,gBAAU,UAAU;AACpB,aAAO;AAAA,IACT;AAEA,aAAS,oBAAoB,UAAU,UAAU;AAC/C,UAAI,gBAAgB,oBAAoB,IAAI,QAAQ;AACpD,UAAI,gBAAgB,oBAAoB,IAAI,QAAQ;AAEpD,UAAI,kBAAkB,UAAa,kBAAkB,QAAW;AAC9D,eAAO;AAAA,MACT;AAEA,UAAI,kBAAkB,UAAa,kBAAkB,QAAW;AAC9D,eAAO;AAAA,MACT;AAEA,UAAI,eAAe,aAAa,MAAM,eAAe,aAAa,GAAG;AACnE,eAAO;AAAA,MACT;AAEA,UAAI,cAAc,YAAY;AAC5B,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAEA,aAAS,aAAa,MAAM;AAC1B,aAAO,KAAK,aAAa,KAAK,UAAU;AAAA,IAC1C;AAEA,aAAS,wBAAwB,UAAU,UAAU;AACnD,UAAI,aAAa,QAAQ,KAAK,aAAa,QAAQ,GAAG;AACpD,eAAO;AAAA,MACT;AAEA,UAAI,oBAAoB,UAAU,QAAQ,GAAG;AAC3C,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAEA,aAAS,cAAc,MAAM;AAE3B,aAAO,sBAAsB,IAAI,IAAI;AAAA,IACvC;AAGA,aAAS,SAAS,KAAK;AACrB,UAAI,QAAQ,oBAAI,IAAI;AACpB,UAAI,QAAQ,SAAU,OAAO,KAAK;AAChC,cAAM,IAAI,KAAK,KAAK;AAAA,MACtB,CAAC;AACD,aAAO;AAAA,IACT;AAEA,aAAS,SAAS,KAAK;AACrB,UAAI,QAAQ,oBAAI,IAAI;AACpB,UAAI,QAAQ,SAAU,OAAO;AAC3B,cAAM,IAAI,KAAK;AAAA,MACjB,CAAC;AACD,aAAO;AAAA,IACT;AAGA,aAAS,YAAY,QAAQ,UAAU;AACrC,UAAI;AACF,eAAO,OAAO,QAAQ;AAAA,MACxB,SAAS,KAAK;AAEZ,eAAO;AAAA,MACT;AAAA,IACF;AAEA,aAAS,sBAAsB;AAE7B,UAAI,eAAe,WAAW,GAAG;AAC/B,eAAO;AAAA,MACT;AAEA,UAAI,qBAAqB;AACvB,eAAO;AAAA,MACT;AAEA,4BAAsB;AAEtB,UAAI;AACF,YAAI,gBAAgB,oBAAI,IAAI;AAC5B,YAAI,kBAAkB,oBAAI,IAAI;AAC9B,YAAI,UAAU;AACd,yBAAiB,CAAC;AAClB,gBAAQ,QAAQ,SAAU,MAAM;AAC9B,cAAI,SAAS,KAAK,CAAC,GACf,WAAW,KAAK,CAAC;AAGrB,cAAI,WAAW,OAAO;AACtB,gCAAsB,IAAI,UAAU,MAAM;AAC1C,gCAAsB,IAAI,UAAU,MAAM;AAC1C,iBAAO,UAAU;AAEjB,cAAI,wBAAwB,UAAU,QAAQ,GAAG;AAC/C,4BAAgB,IAAI,MAAM;AAAA,UAC5B,OAAO;AACL,0BAAc,IAAI,MAAM;AAAA,UAC1B;AAAA,QACF,CAAC;AAED,YAAI,SAAS;AAAA,UACX;AAAA;AAAA,UAEA;AAAA;AAAA,QAEF;AACA,4BAAoB,QAAQ,SAAU,SAAS;AAG7C,kBAAQ,kBAAkB,aAAa;AAAA,QACzC,CAAC;AACD,YAAI,WAAW;AACf,YAAI,aAAa;AAKjB,YAAI,sBAAsB,SAAS,WAAW;AAC9C,YAAI,uBAAuB,SAAS,YAAY;AAChD,YAAI,wBAAwB,SAAS,aAAa;AAClD,4BAAoB,QAAQ,SAAU,MAAM;AAC1C,cAAI,UAAU,sBAAsB,IAAI,IAAI;AAE5C,cAAI,YAAY,QAAW;AACzB,kBAAM,IAAI,MAAM,oEAAoE;AAAA,UACtF;AAEA,cAAI,CAAC,YAAY,IAAI,IAAI,GAAG;AAAA,UAC5B;AAEA,cAAI,iBAAiB,MAAM;AACzB;AAAA,UACF;AAEA,cAAI,CAAC,aAAa,IAAI,IAAI,GAAG;AAC3B;AAAA,UACF;AAEA,cAAI,UAAU,aAAa,IAAI,IAAI;AAEnC,cAAI;AACF,oBAAQ,aAAa,MAAM,OAAO;AAAA,UACpC,SAAS,KAAK;AACZ,gBAAI,CAAC,UAAU;AACb,yBAAW;AACX,2BAAa;AAAA,YACf;AAAA,UAEF;AAAA,QACF,CAAC;AACD,6BAAqB,QAAQ,SAAU,MAAM;AAC3C,cAAI,UAAU,sBAAsB,IAAI,IAAI;AAE5C,cAAI,YAAY,QAAW;AACzB,kBAAM,IAAI,MAAM,oEAAoE;AAAA,UACtF;AAEA,cAAI,CAAC,aAAa,IAAI,IAAI,GAAG;AAAA,UAC7B;AAEA,cAAI;AACF,oBAAQ,gBAAgB,MAAM,MAAM;AAAA,UACtC,SAAS,KAAK;AACZ,gBAAI,CAAC,UAAU;AACb,yBAAW;AACX,2BAAa;AAAA,YACf;AAAA,UAEF;AAAA,QACF,CAAC;AAED,YAAI,UAAU;AACZ,gBAAM;AAAA,QACR;AAEA,eAAO;AAAA,MACT,UAAE;AACA,8BAAsB;AAAA,MACxB;AAAA,IACF;AACA,aAAS,SAAS,MAAM,IAAI;AAC1B;AACE,YAAI,SAAS,MAAM;AACjB;AAAA,QACF;AAEA,YAAI,OAAO,SAAS,cAAc,OAAO,SAAS,UAAU;AAC1D;AAAA,QACF;AAKA,YAAI,kBAAkB,IAAI,IAAI,GAAG;AAC/B;AAAA,QACF;AAKA,YAAI,SAAS,gBAAgB,IAAI,EAAE;AAEnC,YAAI,WAAW,QAAW;AACxB,mBAAS;AAAA,YACP,SAAS;AAAA,UACX;AACA,0BAAgB,IAAI,IAAI,MAAM;AAAA,QAChC,OAAO;AACL,yBAAe,KAAK,CAAC,QAAQ,IAAI,CAAC;AAAA,QACpC;AAEA,0BAAkB,IAAI,MAAM,MAAM;AAElC,YAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,kBAAQ,YAAY,MAAM,UAAU,GAAG;AAAA,YACrC,KAAK;AACH,uBAAS,KAAK,QAAQ,KAAK,SAAS;AACpC;AAAA,YAEF,KAAK;AACH,uBAAS,KAAK,MAAM,KAAK,OAAO;AAChC;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,aAAS,aAAa,MAAM,KAAK;AAC/B,UAAI,aAAa,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI;AACrF,UAAI,iBAAiB,UAAU,SAAS,IAAI,UAAU,CAAC,IAAI;AAE3D;AACE,YAAI,CAAC,oBAAoB,IAAI,IAAI,GAAG;AAClC,8BAAoB,IAAI,MAAM;AAAA,YAC5B;AAAA,YACA,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,gBAAgB,kBAAkB,WAAY;AAC5C,qBAAO,CAAC;AAAA,YACV;AAAA,UACF,CAAC;AAAA,QACH;AAGA,YAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,kBAAQ,YAAY,MAAM,UAAU,GAAG;AAAA,YACrC,KAAK;AACH,2BAAa,KAAK,QAAQ,KAAK,YAAY,cAAc;AACzD;AAAA,YAEF,KAAK;AACH,2BAAa,KAAK,MAAM,KAAK,YAAY,cAAc;AACvD;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,aAAS,+BAA+B,MAAM;AAC5C;AACE,YAAI,YAAY,oBAAoB,IAAI,IAAI;AAE5C,YAAI,cAAc,QAAW;AAC3B,yBAAe,SAAS;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AACA,aAAS,cAAc,IAAI;AACzB;AACE,eAAO,gBAAgB,IAAI,EAAE;AAAA,MAC/B;AAAA,IACF;AACA,aAAS,gBAAgB,MAAM;AAC7B;AACE,eAAO,kBAAkB,IAAI,IAAI;AAAA,MACnC;AAAA,IACF;AACA,aAAS,0BAA0B,UAAU;AAC3C;AACE,YAAI,oBAAoB,oBAAI,IAAI;AAChC,qBAAa,QAAQ,SAAU,MAAM;AACnC,cAAI,UAAU,cAAc,IAAI,IAAI;AAEpC,cAAI,YAAY,QAAW;AACzB,kBAAM,IAAI,MAAM,oEAAoE;AAAA,UACtF;AAEA,cAAI,mBAAmB,QAAQ,4BAA4B,MAAM,QAAQ;AACzE,2BAAiB,QAAQ,SAAU,MAAM;AACvC,8BAAkB,IAAI,IAAI;AAAA,UAC5B,CAAC;AAAA,QACH,CAAC;AACD,eAAO;AAAA,MACT;AAAA,IACF;AACA,aAAS,qBAAqB,cAAc;AAC1C;AAKE,YAAI,OAAO,aAAa;AAExB,YAAI,SAAS,QAAW;AAItB,cAAI,SAAS;AACb,uBAAa,iCAAiC,OAAO;AAAA,YACnD,WAAW,oBAAI,IAAI;AAAA,YACnB,eAAe;AAAA,YACf,QAAQ,SAAU,UAAU;AAC1B,qBAAO;AAAA,YACT;AAAA,YACA,qBAAqB,SAAU,IAAI,MAAM,UAAU;AAAA,YAAC;AAAA,YACpD,mBAAmB,SAAU,IAAI,MAAM,oBAAoB,UAAU;AAAA,YAAC;AAAA,YACtE,sBAAsB,WAAY;AAAA,YAAC;AAAA,UACrC;AAAA,QACF;AAEA,YAAI,KAAK,YAAY;AAInB,kBAAQ,MAAM,EAAE,4JAAiK;AACjL;AAAA,QACF;AAGA,YAAI,YAAY,KAAK;AAErB,aAAK,SAAS,SAAU,UAAU;AAChC,cAAI,KAAK,UAAU,MAAM,MAAM,SAAS;AAExC,cAAI,OAAO,SAAS,oBAAoB,cAAc,OAAO,SAAS,sBAAsB,YAAY;AAEtG,gCAAoB,IAAI,IAAI,QAAQ;AAAA,UACtC;AAEA,iBAAO;AAAA,QACT;AAKA,aAAK,UAAU,QAAQ,SAAU,UAAU,IAAI;AAC7C,cAAI,OAAO,SAAS,oBAAoB,cAAc,OAAO,SAAS,sBAAsB,YAAY;AAEtG,gCAAoB,IAAI,IAAI,QAAQ;AAAA,UACtC;AAAA,QACF,CAAC;AAED,YAAI,uBAAuB,KAAK;AAEhC,YAAI,yBAAyB,KAAK,uBAAuB,WAAY;AAAA,QAAC;AAEtE,aAAK,sBAAsB,SAAU,IAAI,MAAM,UAAU;AACvD,cAAI,CAAC,qBAAqB;AAGxB,wBAAY,OAAO,IAAI;AAEvB,gBAAI,iBAAiB,MAAM;AACzB,2BAAa,IAAI,MAAM,QAAQ;AAAA,YACjC;AAAA,UACF;AAEA,iBAAO,uBAAuB,MAAM,MAAM,SAAS;AAAA,QACrD;AAEA,aAAK,oBAAoB,SAAU,IAAI,MAAM,oBAAoB,UAAU;AACzE,cAAI,UAAU,oBAAoB,IAAI,EAAE;AAExC,cAAI,YAAY,QAAW;AACzB,0BAAc,IAAI,MAAM,OAAO;AAC/B,gBAAI,UAAU,KAAK;AACnB,gBAAI,YAAY,QAAQ;AAIxB,gBAAI,cAAc,MAAM;AACtB,kBAAI,aAAa,UAAU,iBAAiB,QAAQ,UAAU,cAAc,WAAW,QAAQ,aAAa,IAAI,IAAI;AACpH,kBAAI,YAAY,QAAQ,iBAAiB,QAAQ,QAAQ,cAAc,WAAW;AAElF,kBAAI,CAAC,cAAc,WAAW;AAE5B,6BAAa,IAAI,IAAI;AACrB,4BAAY,OAAO,IAAI;AAAA,cACzB,WAAW,cAAc,UAAW;AAAA,uBAAW,cAAc,CAAC,WAAW;AAEvE,6BAAa,OAAO,IAAI;AAExB,oBAAI,UAAU;AAEZ,8BAAY,IAAI,IAAI;AAAA,gBACtB,OAAO;AACL,gCAAc,OAAO,IAAI;AAAA,gBAC3B;AAAA,cACF,WAAW,CAAC,cAAc,CAAC,WAAW;AACpC,oBAAI,UAAU;AAEZ,8BAAY,IAAI,IAAI;AAAA,gBACtB;AAAA,cACF;AAAA,YACF,OAAO;AAEL,2BAAa,IAAI,IAAI;AAAA,YACvB;AAAA,UACF;AAGA,iBAAO,qBAAqB,MAAM,MAAM,SAAS;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AACA,aAAS,yBAAyB;AAEhC,aAAO;AAAA,IACT;AAEA,aAAS,uBAAuB;AAC9B;AACE,eAAO,aAAa;AAAA,MACtB;AAAA,IACF;AAuBA,aAAS,sCAAsC;AAC7C;AACE,YAAI;AACJ,YAAI;AACJ,YAAI,kBAAkB;AACtB,eAAO,SAAU,MAAM,KAAK,YAAY,gBAAgB;AACtD,cAAI,OAAO,QAAQ,UAAU;AAI3B,gBAAI,CAAC,WAAW;AAEd,0BAAY;AACZ,+BAAiB,OAAO,mBAAmB;AAAA,YAC7C;AAKA,gBAAI,QAAQ,SAAS,OAAO,SAAS,cAAc,OAAO,SAAS,WAAW;AAC5E,2BAAa,MAAM,KAAK,YAAY,cAAc;AAAA,YACpD;AAEA,mBAAO;AAAA,UACT,OAAO;AAIL,gBAAI,CAAC,mBAAmB,gBAAgB;AACtC,gCAAkB;AAClB,6CAA+B,SAAS;AAAA,YAC1C;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,aAAS,sBAAsB,MAAM;AACnC;AACE,gBAAQ,OAAO,MAAM;AAAA,UACnB,KAAK,YACH;AAEE,gBAAI,KAAK,aAAa,MAAM;AAC1B,kBAAI,KAAK,UAAU,kBAAkB;AAEnC,uBAAO;AAAA,cACT;AAEA,kBAAI,WAAW,OAAO,oBAAoB,KAAK,SAAS;AAExD,kBAAI,SAAS,SAAS,KAAK,SAAS,CAAC,MAAM,eAAe;AAExD,uBAAO;AAAA,cACT;AAGA,kBAAI,KAAK,UAAU,cAAc,OAAO,WAAW;AAEjD,uBAAO;AAAA,cACT;AAAA,YAGF;AAGA,gBAAI,OAAO,KAAK,QAAQ,KAAK;AAC7B,mBAAO,OAAO,SAAS,YAAY,SAAS,KAAK,IAAI;AAAA,UACvD;AAAA,UAEF,KAAK,UACH;AACE,gBAAI,QAAQ,MAAM;AAChB,sBAAQ,YAAY,MAAM,UAAU,GAAG;AAAA,gBACrC,KAAK;AAAA,gBACL,KAAK;AAEH,yBAAO;AAAA,gBAET;AACE,yBAAO;AAAA,cACX;AAAA,YACF;AAEA,mBAAO;AAAA,UACT;AAAA,UAEF,SACE;AACE,mBAAO;AAAA,UACT;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,uBAAuB;AAC/B,YAAQ,iCAAiC;AACzC,YAAQ,sCAAsC;AAC9C,YAAQ,4BAA4B;AACpC,YAAQ,gBAAgB;AACxB,YAAQ,kBAAkB;AAC1B,YAAQ,yBAAyB;AACjC,YAAQ,uBAAuB;AAC/B,YAAQ,wBAAwB;AAChC,YAAQ,sBAAsB;AAC9B,YAAQ,WAAW;AACnB,YAAQ,eAAe;AAAA,EACrB,GAAG;AACL;AAKA,SAAS,SAAS,IAAI,OAAO;AAC3B,MAAI;AACJ,SAAO,MAAM;AACX,iBAAa,MAAM;AACnB,aAAS,WAAW,IAAI,KAAK;AAAA,EAC/B;AACF;AAGA,MAAM,gBAAgB,SAAS,YAAY;AACzC,MAAI;AACJ,MAAI,aAAa,OAAO,GAAG;AACzB,eAAW,KAAK,MAAM,KAAK,UAAU,eAAe,CAAC;AAErD,aAAS,SAAS,aAAa,OAAO,GAAG;AACvC,eAAS,OAAO,MAAM,EAAE,IAAI;AAC5B,UAAI,WAAW,OAAO,0BAA0B,IAAI,MAAM,EAAE;AAC5D,UAAI,CAAC,UAAU;AACb,cAAM,MAAM,gDAAgD,MAAM,EAAE,EAAE;AAAA,MACxE;AACA,UAAI,cAAc;AAAA,QAChB,GAAG;AAAA;AAAA;AAAA,QAGH,SAAS,SAAS,UACd,OAAO,oBAAoB,MAAM,EAAE,GAAG,WAAW,SAAS,UAC1D,SAAS;AAAA,QACb,eAAe,SAAS,gBACpB,OAAO,oBAAoB,MAAM,EAAE,GAAG,iBACtC,SAAS,gBACT,SAAS;AAAA,QACb,iBAAiB,SAAS,kBACtB,OAAO,oBAAoB,MAAM,EAAE,GAAG,mBACtC,SAAS,kBACT,SAAS;AAAA,MACf;AACA,aAAO,oBAAoB,MAAM,EAAE,IAAI;AAAA,IACzC;AAEA,QAAI,oBAAoB,IAAI;AAAA,MAC1B,MAAM,KAAK,aAAa,OAAO,CAAC,EAC7B,OAAO,CAAC,UAAU,MAAM,aAAa,MAAM,eAAe,EAC1D,IAAI,CAAC,UAAU,MAAM,EAAE;AAAA,IAC5B;AAEA,QAAI,SAAS,cAAc;AAAA,MACzB;AAAA,MACA,SAAS;AAAA,MACT,OAAO;AAAA,MACP,OAAO,eAAe;AAAA,MACtB,OAAO,eAAe;AAAA,IACxB;AACA,kBAAc,mBAAmB,MAAM;AACvC,iBAAa,MAAM;AACnB,WAAO,0BAA0B,MAAM;AAAA,EACzC;AAEA,MAAI;AACF,WAAO,mBAAmB;AAC1B,UAAM,WAAW;AAAA,EACnB,UAAE;AACA,WAAO,mBAAmB;AAAA,EAC5B;AAEA,MAAI,UAAU;AACZ,WAAO,OAAO,OAAO,iBAAiB,QAAQ;AAAA,EAChD;AACA,UAAQ,oBAAoB;AAC9B,GAAG,EAAE;AAIL,SAAS,+BAA+B,UAAU,eAAe;AAC/D,WAAS,OAAO,eAAe;AAC7B,QAAI,QAAQ,aAAc;AAC1B,QAAI,cAAc,cAAc,GAAG;AACnC,QAAI,QAAQ,sBAAsB,WAAW,GAAG;AAK9C,cAAQ,SAAS,aAAa,WAAW,aAAa,GAAG;AAAA,IAC3D;AAAA,EACF;AACF;AAEA,SAAS,wCACP,aACA,aAEA,gBAAgB,CAAC,GACjB;AACA,MACE,CAAC;AAAA,IACC;AAAA,IACA,CAAC,QAAQ,OAAO,eAAe,cAAc,SAAS,GAAG;AAAA,EAC3D,GACA;AACA,WAAO;AAAA,EACT;AACA,MACE,CAAC;AAAA,IACC;AAAA,IACA,CAAC,QAAQ,OAAO,eAAe,cAAc,SAAS,GAAG;AAAA,EAC3D,GACA;AACA,WAAO;AAAA,EACT;AAEA,MAAI,aAAa;AACjB,MAAI,kCAAkC;AAAA,IACpC;AAAA,IACA,CAAC,KAAK,UAAU;AACd,mBAAa;AAEb,UAAI,cAAc,SAAS,GAAG,EAAG,QAAO;AAExC,UAAI,QAAQ,sBAAsB,KAAK,EAAG,QAAO;AAEjD,aAAO,YAAY,GAAG,MAAM,YAAY,GAAG;AAAA,IAC7C;AAAA,EACF;AACA,MAAI,cAAc,iCAAiC;AACjD,kBAAc;AAAA,EAChB,OAAO;AACL,WAAO;AAAA,EACT;AACF;AAEA,SAAS,kBAAkB,eAAe,WAAW;AACnD,WAAS,OAAO,eAAe;AAC7B,QAAI,QAAQ,aAAc;AAC1B,QAAI,OAAO,OAAO,yBAAyB,eAAe,GAAG;AAC7D,QAAI,QAAQ,KAAK,IAAK,QAAO;AAC7B,QAAI,CAAC,UAAU,KAAK,cAAc,GAAG,CAAC,EAAG,QAAO;AAAA,EAClD;AACA,SAAO;AACT;AAIA,SAAS,aAAa,QAAQ;AAC5B,SAAO;AAAA;AAAA,IAA0B;AAAA;AACnC;AAEA,MAAM,eAAe,oBAAI,IAAI;AAC7B,OAAO,4BAA4B,oBAAI,IAAI;AAE3C,eAAe,aAAa;AAC1B,MAAI,EAAE,SAAS,QAAQ,IAAI,QAAQ;AACnC,MAAI,QAAQ,cAAc,UAAU,CAAC,UAAU;AAC7C,QAAI,MAAM,iBAAiB,QAAQ;AACjC,YAAM;AAEN,cAAQ;AAAA,IACV;AAAA,EACF,CAAC;AACD,SAAO,uBAAuB,OAAO,uBAAuB,KAAK;AACjE,gBAAc,WAAW;AACzB,SAAO;AACT;AAEA,SAAS,UAAU;AACjB,MAAI;AACJ,MAAI;AAEJ,MAAI,UAAU,IAAI,QAAQ,CAAC,UAAU,YAAY;AAC/C,cAAU;AACV,aAAS;AAAA,EACX,CAAC;AACD,SAAO,EAAE,SAAS,SAAS,OAAO;AACpC;AAEA,YAAY,IAAI,GAAG,aAAa,OAAO,EAAE,MAAM,MAAM;AACnD,SAAO,wBAAwB;AAE/B,MAAI,OAAO;AACT,iBAAa,IAAI,MAAM,IAAI,KAAK;AAAA,EAClC;AACF,CAAC;AAED,QAAQ,eAAe;AACvB,QAAQ,iCAAiC;AACzC,QAAQ,0CACN;AACF,QAAQ,gBAAgB;AAExB,eAAe;","names":[]}