Files
speckle-server/scratch/edge-debug-selection/Default/Cache/Cache_Data/f_00003b
T

997 lines
122 KiB
Plaintext

// src/useApolloClient.ts
import { hasInjectionContext, inject } from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29";
var DefaultApolloClient = Symbol("default-apollo-client");
var ApolloClients = Symbol("apollo-clients");
function resolveDefaultClient(providedApolloClients, providedApolloClient) {
const resolvedClient = providedApolloClients ? providedApolloClients.default : providedApolloClient != null ? providedApolloClient : void 0;
return resolvedClient;
}
function resolveClientWithId(providedApolloClients, clientId) {
return providedApolloClients == null ? void 0 : providedApolloClients[clientId];
}
function useApolloClient(clientId) {
let resolveImpl;
const savedCurrentClients = currentApolloClients;
if (!hasInjectionContext()) {
resolveImpl = (id) => {
if (id) {
return resolveClientWithId(savedCurrentClients, id);
}
return resolveDefaultClient(savedCurrentClients, savedCurrentClients.default);
};
} else {
const providedApolloClients = inject(ApolloClients, null);
const providedApolloClient = inject(DefaultApolloClient, null);
resolveImpl = (id) => {
if (id) {
const client2 = resolveClientWithId(providedApolloClients, id);
if (client2) {
return client2;
}
return resolveClientWithId(savedCurrentClients, id);
}
const client = resolveDefaultClient(providedApolloClients, providedApolloClient);
if (client) {
return client;
}
return resolveDefaultClient(savedCurrentClients, savedCurrentClients.default);
};
}
function resolveClient(id = clientId) {
const client = resolveImpl(id);
if (!client) {
throw new Error(
`Apollo client with id ${id != null ? id : "default"} not found. Use an app.runWithContext() or provideApolloClient() if you are outside of a component setup.`
);
}
return client;
}
return {
resolveClient,
get client() {
return resolveClient();
}
};
}
var currentApolloClients = {};
function provideApolloClient(client) {
currentApolloClients = {
default: client
};
return function(fn) {
const result = fn();
currentApolloClients = {};
return result;
};
}
function provideApolloClients(clients) {
currentApolloClients = clients;
return function(fn) {
const result = fn();
currentApolloClients = {};
return result;
};
}
// src/useLazyQuery.ts
import { isRef as isRef3 } from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29";
// src/useQuery.ts
import { debounce, throttle } from "/_nuxt/node_modules/throttle-debounce/esm/index.js?v=e4f18c29";
import {
computed as computed3,
getCurrentInstance,
getCurrentScope as getCurrentScope2,
nextTick,
onScopeDispose as onScopeDispose2,
onServerPrefetch,
ref as ref3,
shallowRef,
unref,
watch as watch2
} from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29";
// src/util/env.ts
var isServer = typeof window === "undefined";
// src/util/loadingTracking.ts
import { getCurrentScope, onScopeDispose, ref, watch } from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29";
var globalTracking = {
queries: ref(0),
mutations: ref(0),
subscriptions: ref(0),
components: /* @__PURE__ */ new Map()
};
function getCurrentTracking() {
const currentScope = getCurrentScope();
if (!currentScope) {
return {};
}
let tracking;
if (isServer) {
tracking = {
queries: ref(0),
mutations: ref(0),
subscriptions: ref(0)
};
return { tracking };
}
if (!globalTracking.components.has(currentScope)) {
globalTracking.components.set(currentScope, tracking = {
queries: ref(0),
mutations: ref(0),
subscriptions: ref(0)
});
onScopeDispose(() => {
globalTracking.components.delete(currentScope);
});
} else {
tracking = globalTracking.components.get(currentScope);
}
return {
tracking
};
}
function track(loading, type) {
if (isServer)
return;
const { tracking } = getCurrentTracking();
watch(loading, (value, oldValue) => {
if (oldValue != null && value !== oldValue) {
const mod = value ? 1 : -1;
if (tracking)
tracking[type].value += mod;
globalTracking[type].value += mod;
}
}, {
immediate: true
});
onScopeDispose(() => {
if (loading.value) {
if (tracking)
tracking[type].value--;
globalTracking[type].value--;
}
});
}
function trackQuery(loading) {
track(loading, "queries");
}
function trackMutation(loading) {
track(loading, "mutations");
}
function trackSubscription(loading) {
track(loading, "subscriptions");
}
// src/util/paramToReactive.ts
import { computed, isRef, reactive } from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29";
function paramToReactive(param) {
if (isRef(param)) {
return param;
} else if (typeof param === "function") {
return computed(param);
} else if (param) {
return reactive(param);
} else {
return param;
}
}
// src/util/paramToRef.ts
import { computed as computed2, isRef as isRef2, ref as ref2 } from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29";
function paramToRef(param) {
if (isRef2(param)) {
return param;
} else if (typeof param === "function") {
return computed2(param);
} else {
return ref2(param);
}
}
// src/util/toApolloError.ts
import { ApolloError, isApolloError } from "/_nuxt/node_modules/@apollo/client/core/index.js?v=e4f18c29";
function toApolloError(error) {
if (!(error instanceof Error)) {
return new ApolloError({
networkError: Object.assign(new Error(error == null ? void 0 : error.message), { originalError: error }),
errorMessage: String(error)
});
}
if (isApolloError(error)) {
return error;
}
return new ApolloError({ networkError: error, errorMessage: error.message });
}
function resultErrorsToApolloError(errors) {
return new ApolloError({
graphQLErrors: errors,
errorMessage: `GraphQL response contains errors: ${errors.map((e) => e.message).join(" | ")}`
});
}
// src/util/useEventHook.ts
function useEventHook() {
const fns = [];
function on(fn) {
fns.push(fn);
return {
off: () => off(fn)
};
}
function off(fn) {
const index = fns.indexOf(fn);
if (index !== -1) {
fns.splice(index, 1);
}
}
function trigger(...params) {
for (const fn of fns) {
fn(...params);
}
}
function getCount() {
return fns.length;
}
return {
on,
off,
trigger,
getCount
};
}
// src/useQuery.ts
function useQuery(document, variables, options) {
return useQueryImpl(document, variables, options);
}
function useQueryImpl(document, variables, options = {}, lazy = false) {
var _a;
const currentScope = getCurrentScope2();
const currentInstance = getCurrentInstance();
const currentOptions = ref3();
const documentRef = paramToRef(document);
const variablesRef = paramToRef(variables);
const optionsRef = paramToReactive(options);
const result = shallowRef();
const resultEvent = useEventHook();
const error = shallowRef(null);
const errorEvent = useEventHook();
const loading = ref3(false);
currentScope && trackQuery(loading);
const networkStatus = ref3();
let firstResolve;
let firstResolveTriggered = false;
let firstReject;
let firstRejectError;
const tryFirstResolve = () => {
firstResolveTriggered = true;
if (firstResolve)
firstResolve();
};
const tryFirstReject = (apolloError) => {
firstRejectError = apolloError;
if (firstReject)
firstReject(apolloError);
};
const resetFirstResolveReject = () => {
firstResolve = void 0;
firstReject = void 0;
firstResolveTriggered = false;
firstRejectError = void 0;
};
currentInstance && ((_a = onServerPrefetch) == null ? void 0 : _a(() => {
var _a2;
if (!isEnabled.value || isServer && ((_a2 = currentOptions.value) == null ? void 0 : _a2.prefetch) === false)
return;
return new Promise((resolve, reject) => {
firstResolve = () => {
resetFirstResolveReject();
resolve();
};
firstReject = (apolloError) => {
resetFirstResolveReject();
reject(apolloError);
};
if (firstResolveTriggered) {
firstResolve();
} else if (firstRejectError) {
firstReject(firstRejectError);
}
}).finally(stop);
}));
const { resolveClient } = useApolloClient();
function getClient() {
var _a2;
return resolveClient((_a2 = currentOptions.value) == null ? void 0 : _a2.clientId);
}
const query = shallowRef();
let observer;
let started = false;
let ignoreNextResult = false;
let firstStart = true;
function start() {
var _a2, _b, _c, _d, _e;
if (started || !isEnabled.value || isServer && ((_a2 = currentOptions.value) == null ? void 0 : _a2.prefetch) === false || !currentDocument) {
tryFirstResolve();
return;
}
if (isServer) {
applyDocument(documentRef.value);
applyVariables(variablesRef.value);
applyOptions(unref(optionsRef));
}
started = true;
error.value = null;
loading.value = true;
const client = getClient();
query.value = client.watchQuery({
query: currentDocument,
variables: currentVariables != null ? currentVariables : {},
...currentOptions.value,
...isServer && ((_b = currentOptions.value) == null ? void 0 : _b.fetchPolicy) !== "no-cache" ? {
fetchPolicy: "network-only"
} : {}
});
startQuerySubscription();
if (!isServer && (firstStart || !((_c = currentOptions.value) == null ? void 0 : _c.keepPreviousResult)) && (((_d = currentOptions.value) == null ? void 0 : _d.fetchPolicy) !== "no-cache" || currentOptions.value.notifyOnNetworkStatusChange)) {
const currentResult = query.value.getCurrentResult(false);
if (!currentResult.loading || currentResult.partial || ((_e = currentOptions.value) == null ? void 0 : _e.notifyOnNetworkStatusChange)) {
onNextResult(currentResult);
ignoreNextResult = !currentResult.loading;
} else if (currentResult.error) {
onError(currentResult.error);
ignoreNextResult = true;
}
}
if (!isServer) {
for (const item of subscribeToMoreItems) {
addSubscribeToMore(item);
}
}
firstStart = false;
}
function startQuerySubscription() {
if (observer && !observer.closed)
return;
if (!query.value)
return;
ignoreNextResult = false;
observer = query.value.subscribe({
next: onNextResult,
error: onError
});
}
function getErrorPolicy() {
var _a2, _b, _c, _d;
const client = resolveClient((_a2 = currentOptions.value) == null ? void 0 : _a2.clientId);
return ((_b = currentOptions.value) == null ? void 0 : _b.errorPolicy) || ((_d = (_c = client.defaultOptions) == null ? void 0 : _c.watchQuery) == null ? void 0 : _d.errorPolicy);
}
function onNextResult(queryResult) {
var _a2;
if (ignoreNextResult) {
ignoreNextResult = false;
return;
}
error.value = null;
processNextResult(queryResult);
const errorPolicy = getErrorPolicy();
if (errorPolicy && errorPolicy === "all" && !queryResult.error && ((_a2 = queryResult.errors) == null ? void 0 : _a2.length)) {
processError(resultErrorsToApolloError(queryResult.errors));
}
tryFirstResolve();
}
function processNextResult(queryResult) {
var _a2, _b;
result.value = queryResult.data && Object.keys(queryResult.data).length === 0 ? queryResult.error && !((_a2 = currentOptions.value) == null ? void 0 : _a2.returnPartialData) && ((_b = currentOptions.value) == null ? void 0 : _b.errorPolicy) === "none" ? void 0 : result.value : queryResult.data;
loading.value = queryResult.loading;
networkStatus.value = queryResult.networkStatus;
nextTick(() => {
resultEvent.trigger(queryResult, {
client: getClient()
});
});
}
function onError(queryError) {
if (ignoreNextResult) {
ignoreNextResult = false;
return;
}
const apolloError = toApolloError(queryError);
const errorPolicy = getErrorPolicy();
if (errorPolicy && errorPolicy !== "none") {
processNextResult(query.value.getCurrentResult());
}
processError(apolloError);
tryFirstReject(apolloError);
resubscribeToQuery();
}
function processError(apolloError) {
error.value = apolloError;
loading.value = false;
networkStatus.value = 8;
nextTick(() => {
errorEvent.trigger(apolloError, {
client: getClient()
});
});
}
function resubscribeToQuery() {
if (!query.value)
return;
const lastError = query.value.getLastError();
const lastResult = query.value.getLastResult();
query.value.resetLastResults();
startQuerySubscription();
Object.assign(query.value, { lastError, lastResult });
}
let onStopHandlers = [];
function stop() {
tryFirstResolve();
if (!started)
return;
started = false;
loading.value = false;
onStopHandlers.forEach((handler) => handler());
onStopHandlers = [];
if (query.value) {
query.value.stopPolling();
query.value = null;
}
if (observer) {
observer.unsubscribe();
observer = void 0;
}
}
let restarting = false;
function baseRestart() {
if (!started || restarting)
return;
restarting = true;
nextTick(() => {
if (started) {
stop();
start();
}
restarting = false;
});
}
let debouncedRestart;
let isRestartDebounceSetup = false;
function updateRestartFn() {
var _a2, _b;
if (!currentOptions.value) {
debouncedRestart = baseRestart;
} else {
if ((_a2 = currentOptions.value) == null ? void 0 : _a2.throttle) {
debouncedRestart = throttle(currentOptions.value.throttle, baseRestart);
} else if ((_b = currentOptions.value) == null ? void 0 : _b.debounce) {
debouncedRestart = debounce(currentOptions.value.debounce, baseRestart);
} else {
debouncedRestart = baseRestart;
}
isRestartDebounceSetup = true;
}
}
function restart() {
if (!started || restarting)
return;
if (!isRestartDebounceSetup)
updateRestartFn();
debouncedRestart();
}
let currentDocument = documentRef.value;
const forceDisabled = ref3(lazy);
const enabledOption = computed3(() => !currentOptions.value || currentOptions.value.enabled == null || currentOptions.value.enabled);
const isEnabled = computed3(() => enabledOption.value && !forceDisabled.value && !!documentRef.value);
watch2(() => unref(optionsRef), applyOptions, {
deep: true,
immediate: true
});
function applyOptions(value) {
if (currentOptions.value && (currentOptions.value.throttle !== value.throttle || currentOptions.value.debounce !== value.debounce)) {
updateRestartFn();
}
currentOptions.value = value;
restart();
}
watch2(documentRef, applyDocument);
function applyDocument(value) {
currentDocument = value;
restart();
}
let currentVariables;
let currentVariablesSerialized;
watch2(() => {
if (isEnabled.value) {
return variablesRef.value;
} else {
return void 0;
}
}, applyVariables, {
deep: true,
immediate: true
});
function applyVariables(value) {
const serialized = JSON.stringify([value, isEnabled.value]);
if (serialized !== currentVariablesSerialized) {
currentVariables = value;
restart();
}
currentVariablesSerialized = serialized;
}
function refetch(variables2 = void 0) {
if (query.value) {
if (variables2) {
currentVariables = variables2;
}
error.value = null;
loading.value = true;
return query.value.refetch(variables2).then((refetchResult) => {
var _a2;
const currentResult = (_a2 = query.value) == null ? void 0 : _a2.getCurrentResult();
currentResult && processNextResult(currentResult);
return refetchResult;
});
}
}
function updateQuery(mapFn) {
if (query.value) {
query.value.updateQuery(mapFn);
}
}
function fetchMore(options2) {
if (query.value) {
error.value = null;
loading.value = true;
return query.value.fetchMore(options2).then((fetchMoreResult) => {
var _a2;
const currentResult = (_a2 = query.value) == null ? void 0 : _a2.getCurrentResult();
currentResult && processNextResult(currentResult);
return fetchMoreResult;
});
}
}
const subscribeToMoreItems = [];
function subscribeToMore(options2) {
if (isServer)
return;
const optionsRef2 = paramToRef(options2);
watch2(optionsRef2, (value, oldValue, onCleanup) => {
const index = subscribeToMoreItems.findIndex((item2) => item2.options === oldValue);
if (index !== -1) {
subscribeToMoreItems.splice(index, 1);
}
const item = {
options: value,
unsubscribeFns: []
};
subscribeToMoreItems.push(item);
addSubscribeToMore(item);
onCleanup(() => {
item.unsubscribeFns.forEach((fn) => fn());
item.unsubscribeFns = [];
});
}, {
immediate: true
});
}
function addSubscribeToMore(item) {
if (!started)
return;
if (!query.value) {
throw new Error("Query is not defined");
}
const unsubscribe = query.value.subscribeToMore(item.options);
onStopHandlers.push(unsubscribe);
item.unsubscribeFns.push(unsubscribe);
}
watch2(isEnabled, (value) => {
if (value) {
nextTick(() => {
start();
});
} else {
stop();
}
});
if (isEnabled.value) {
start();
}
if (currentScope) {
onScopeDispose2(() => {
stop();
subscribeToMoreItems.length = 0;
});
} else {
console.warn("[Vue apollo] useQuery() is called outside of an active effect scope and the query will not be automatically stopped.");
}
return {
result,
loading,
networkStatus,
error,
start,
stop,
restart,
forceDisabled,
document: documentRef,
variables: variablesRef,
options: optionsRef,
query,
refetch,
fetchMore,
subscribeToMore,
updateQuery,
onResult: resultEvent.on,
onError: errorEvent.on
};
}
// src/useLazyQuery.ts
function useLazyQuery(document, variables, options) {
const query = useQueryImpl(document, variables, options, true);
function load(document2, variables2, options2) {
if (document2) {
query.document.value = document2;
}
if (variables2) {
query.variables.value = variables2;
}
if (options2) {
Object.assign(isRef3(query.options) ? query.options.value : query.options, options2);
}
const isFirstRun = query.forceDisabled.value;
if (isFirstRun) {
query.forceDisabled.value = false;
if (isServer) {
query.start();
}
return new Promise((resolve, reject) => {
const { off: offResult } = query.onResult((result) => {
if (!result.loading) {
resolve(result.data);
offResult();
offError();
}
});
const { off: offError } = query.onError((error) => {
reject(error);
offResult();
offError();
});
});
} else {
return false;
}
}
return {
...query,
load
};
}
// src/useLoading.ts
import { computed as computed4 } from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29";
function useQueryLoading() {
const { tracking } = getCurrentTracking();
if (!tracking)
throw new Error("useQueryLoading must be called inside a setup function.");
return computed4(() => tracking.queries.value > 0);
}
function useMutationLoading() {
const { tracking } = getCurrentTracking();
if (!tracking)
throw new Error("useMutationLoading must be called inside a setup function.");
return computed4(() => tracking.mutations.value > 0);
}
function useSubscriptionLoading() {
const { tracking } = getCurrentTracking();
if (!tracking)
throw new Error("useSubscriptionLoading must be called inside a setup function.");
return computed4(() => tracking.subscriptions.value > 0);
}
function useGlobalQueryLoading() {
return computed4(() => globalTracking.queries.value > 0);
}
function useGlobalMutationLoading() {
return computed4(() => globalTracking.mutations.value > 0);
}
function useGlobalSubscriptionLoading() {
return computed4(() => globalTracking.subscriptions.value > 0);
}
// src/useMutation.ts
import { getCurrentScope as getCurrentScope3, isRef as isRef4, nextTick as nextTick2, onScopeDispose as onScopeDispose3, ref as ref4, shallowRef as shallowRef2 } from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29";
function useMutation(document, options = {}) {
const currentScope = getCurrentScope3();
const loading = ref4(false);
currentScope && trackMutation(loading);
const error = shallowRef2(null);
const called = ref4(false);
const doneEvent = useEventHook();
const errorEvent = useEventHook();
const { resolveClient } = useApolloClient();
async function mutate(variables, overrideOptions = {}) {
let currentDocument;
if (typeof document === "function") {
currentDocument = document();
} else if (isRef4(document)) {
currentDocument = document.value;
} else {
currentDocument = document;
}
let currentOptions;
if (typeof options === "function") {
currentOptions = options();
} else if (isRef4(options)) {
currentOptions = options.value;
} else {
currentOptions = options;
}
const client = resolveClient(currentOptions.clientId);
error.value = null;
loading.value = true;
called.value = true;
try {
const result = await client.mutate({
mutation: currentDocument,
...currentOptions,
...overrideOptions,
variables: (variables != null ? variables : currentOptions.variables) ? {
...currentOptions.variables,
...variables
} : void 0
});
loading.value = false;
await nextTick2();
doneEvent.trigger(result, {
client
});
return result;
} catch (e) {
const apolloError = toApolloError(e);
error.value = apolloError;
loading.value = false;
await nextTick2();
errorEvent.trigger(apolloError, {
client
});
if (currentOptions.throws === "always" || currentOptions.throws !== "never" && !errorEvent.getCount()) {
throw apolloError;
}
}
return null;
}
currentScope && onScopeDispose3(() => {
loading.value = false;
});
return {
mutate,
loading,
error,
called,
onDone: doneEvent.on,
onError: errorEvent.on
};
}
// src/useResult.ts
import { computed as computed5 } from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29";
function useResult(result, defaultValue, pick) {
console.warn(`'useResult' is deprecated and will be removed soon. Please use 'computed' instead.
Before:
const items = useResult(result, [], data => data.someField.myItems)
After:
const items = computed(() => result.value?.someField.myItems ?? [])`);
return computed5(() => {
const value = result.value;
if (value) {
if (pick) {
try {
return pick(value);
} catch (e) {
}
} else {
const keys = Object.keys(value);
if (keys.length === 1) {
return value[keys[0]];
} else {
return value;
}
}
}
return defaultValue;
});
}
// src/useSubscription.ts
import { debounce as debounce2, throttle as throttle2 } from "/_nuxt/node_modules/throttle-debounce/esm/index.js?v=e4f18c29";
import {
computed as computed6,
getCurrentScope as getCurrentScope4,
isRef as isRef5,
nextTick as nextTick3,
onScopeDispose as onScopeDispose4,
ref as ref5,
shallowRef as shallowRef3,
watch as watch3
} from "/_nuxt/node_modules/nuxt/dist/app/compat/vue-demi.js?v=e4f18c29";
function useSubscription(document, variables = void 0, options = {}) {
const currentScope = getCurrentScope4();
const documentRef = paramToRef(document);
const variablesRef = paramToRef(variables);
const optionsRef = paramToReactive(options);
const result = shallowRef3();
const resultEvent = useEventHook();
const error = shallowRef3(null);
const errorEvent = useEventHook();
const loading = ref5(false);
currentScope && trackSubscription(loading);
const { resolveClient } = useApolloClient();
const subscription = ref5(null);
let observer = null;
let started = false;
function getClient() {
var _a;
return resolveClient((_a = currentOptions.value) == null ? void 0 : _a.clientId);
}
function start() {
if (started || !isEnabled.value || isServer)
return;
started = true;
loading.value = true;
const client = getClient();
subscription.value = client.subscribe({
query: currentDocument,
variables: currentVariables,
...currentOptions.value
});
observer = subscription.value.subscribe({
next: onNextResult,
error: onError
});
}
function onNextResult(fetchResult) {
result.value = fetchResult.data;
loading.value = false;
resultEvent.trigger(fetchResult, {
client: getClient()
});
}
function onError(fetchError) {
const apolloError = toApolloError(fetchError);
error.value = apolloError;
loading.value = false;
errorEvent.trigger(apolloError, {
client: getClient()
});
}
function stop() {
if (!started)
return;
started = false;
loading.value = false;
if (subscription.value) {
subscription.value = null;
}
if (observer) {
observer.unsubscribe();
observer = null;
}
}
let restarting = false;
function baseRestart() {
if (!started || restarting)
return;
restarting = true;
nextTick3(() => {
if (started) {
stop();
start();
}
restarting = false;
});
}
let debouncedRestart;
function updateRestartFn() {
var _a, _b;
if ((_a = currentOptions.value) == null ? void 0 : _a.throttle) {
debouncedRestart = throttle2(currentOptions.value.throttle, baseRestart);
} else if ((_b = currentOptions.value) == null ? void 0 : _b.debounce) {
debouncedRestart = debounce2(currentOptions.value.debounce, baseRestart);
} else {
debouncedRestart = baseRestart;
}
}
function restart() {
if (!debouncedRestart)
updateRestartFn();
debouncedRestart();
}
const currentOptions = ref5();
watch3(() => isRef5(optionsRef) ? optionsRef.value : optionsRef, (value) => {
if (currentOptions.value && (currentOptions.value.throttle !== value.throttle || currentOptions.value.debounce !== value.debounce)) {
updateRestartFn();
}
currentOptions.value = value;
restart();
}, {
deep: true,
immediate: true
});
let currentDocument;
watch3(documentRef, (value) => {
currentDocument = value;
restart();
}, {
immediate: true
});
let currentVariables;
let currentVariablesSerialized;
watch3(variablesRef, (value, oldValue) => {
const serialized = JSON.stringify(value);
if (serialized !== currentVariablesSerialized) {
currentVariables = value;
restart();
}
currentVariablesSerialized = serialized;
}, {
deep: true,
immediate: true
});
const enabledOption = computed6(() => !currentOptions.value || currentOptions.value.enabled == null || currentOptions.value.enabled);
const isEnabled = enabledOption;
watch3(isEnabled, (value) => {
if (value) {
start();
} else {
stop();
}
}, {
immediate: true
});
if (currentScope) {
onScopeDispose4(stop);
} else {
console.warn("[Vue apollo] useSubscription() is called outside of an active effect scope and the subscription will not be automatically stopped.");
}
return {
result,
loading,
error,
// @TODO doesn't fully work yet
// enabled,
start,
stop,
restart,
document: documentRef,
variables: variablesRef,
options: optionsRef,
subscription,
onResult: resultEvent.on,
onError: errorEvent.on
};
}
export {
ApolloClients,
DefaultApolloClient,
provideApolloClient,
provideApolloClients,
useApolloClient,
useGlobalMutationLoading,
useGlobalQueryLoading,
useGlobalSubscriptionLoading,
useLazyQuery,
useMutation,
useMutationLoading,
useQuery,
useQueryLoading,
useResult,
useSubscription,
useSubscriptionLoading
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91c2VBcG9sbG9DbGllbnQudHMiLCIuLi9zcmMvdXNlTGF6eVF1ZXJ5LnRzIiwiLi4vc3JjL3VzZVF1ZXJ5LnRzIiwiLi4vc3JjL3V0aWwvZW52LnRzIiwiLi4vc3JjL3V0aWwvbG9hZGluZ1RyYWNraW5nLnRzIiwiLi4vc3JjL3V0aWwvcGFyYW1Ub1JlYWN0aXZlLnRzIiwiLi4vc3JjL3V0aWwvcGFyYW1Ub1JlZi50cyIsIi4uL3NyYy91dGlsL3RvQXBvbGxvRXJyb3IudHMiLCIuLi9zcmMvdXRpbC91c2VFdmVudEhvb2sudHMiLCIuLi9zcmMvdXNlTG9hZGluZy50cyIsIi4uL3NyYy91c2VNdXRhdGlvbi50cyIsIi4uL3NyYy91c2VSZXN1bHQudHMiLCIuLi9zcmMvdXNlU3Vic2NyaXB0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQXBvbGxvQ2xpZW50IH0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZS9pbmRleC5qcydcbmltcG9ydCB7IGhhc0luamVjdGlvbkNvbnRleHQsIGluamVjdCB9IGZyb20gJ3Z1ZS1kZW1pJ1xuXG5leHBvcnQgY29uc3QgRGVmYXVsdEFwb2xsb0NsaWVudCA9IFN5bWJvbCgnZGVmYXVsdC1hcG9sbG8tY2xpZW50JylcbmV4cG9ydCBjb25zdCBBcG9sbG9DbGllbnRzID0gU3ltYm9sKCdhcG9sbG8tY2xpZW50cycpXG5cbnR5cGUgQ2xpZW50SWQgPSBzdHJpbmdcbnR5cGUgQ2xpZW50RGljdDxUPiA9IFJlY29yZDxDbGllbnRJZCwgQXBvbGxvQ2xpZW50PFQ+PlxuXG50eXBlIFJlc29sdmVDbGllbnQ8VENhY2hlU2hhcGUsIFRSZXR1cm4gPSBBcG9sbG9DbGllbnQ8VENhY2hlU2hhcGU+PiA9IChjbGllbnRJZD86IENsaWVudElkKSA9PiBUUmV0dXJuXG50eXBlIE51bGxhYmxlQXBvbGxvQ2xpZW50PFRDYWNoZVNoYXBlPiA9IEFwb2xsb0NsaWVudDxUQ2FjaGVTaGFwZT4gfCB1bmRlZmluZWRcblxuZXhwb3J0IGludGVyZmFjZSBVc2VBcG9sbG9DbGllbnRSZXR1cm48VENhY2hlU2hhcGU+IHtcbiAgcmVzb2x2ZUNsaWVudDogUmVzb2x2ZUNsaWVudDxUQ2FjaGVTaGFwZT5cbiAgcmVhZG9ubHkgY2xpZW50OiBBcG9sbG9DbGllbnQ8VENhY2hlU2hhcGU+XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEZWZhdWx0Q2xpZW50PFQ+KHByb3ZpZGVkQXBvbGxvQ2xpZW50czogQ2xpZW50RGljdDxUPiB8IG51bGwsIHByb3ZpZGVkQXBvbGxvQ2xpZW50OiBBcG9sbG9DbGllbnQ8VD4gfCBudWxsKTogTnVsbGFibGVBcG9sbG9DbGllbnQ8VD4ge1xuICBjb25zdCByZXNvbHZlZENsaWVudCA9IHByb3ZpZGVkQXBvbGxvQ2xpZW50c1xuICAgID8gcHJvdmlkZWRBcG9sbG9DbGllbnRzLmRlZmF1bHRcbiAgICA6IChwcm92aWRlZEFwb2xsb0NsaWVudCA/PyB1bmRlZmluZWQpXG4gIHJldHVybiByZXNvbHZlZENsaWVudFxufVxuXG5mdW5jdGlvbiByZXNvbHZlQ2xpZW50V2l0aElkPFQ+KHByb3ZpZGVkQXBvbGxvQ2xpZW50czogQ2xpZW50RGljdDxUPiB8IG51bGwsIGNsaWVudElkOiBDbGllbnRJZCk6IE51bGxhYmxlQXBvbGxvQ2xpZW50PFQ+IHtcbiAgcmV0dXJuIHByb3ZpZGVkQXBvbGxvQ2xpZW50cz8uW2NsaWVudElkXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlQXBvbGxvQ2xpZW50PFRDYWNoZVNoYXBlID0gYW55PihjbGllbnRJZD86IENsaWVudElkKTogVXNlQXBvbGxvQ2xpZW50UmV0dXJuPFRDYWNoZVNoYXBlPiB7XG4gIGxldCByZXNvbHZlSW1wbDogUmVzb2x2ZUNsaWVudDxUQ2FjaGVTaGFwZSwgTnVsbGFibGVBcG9sbG9DbGllbnQ8VENhY2hlU2hhcGU+PlxuXG4gIC8vIFNhdmUgY3VycmVudCBjbGllbnQgaW4gY3VycmVudCBjbG9zdXJlIHNjb3BlXG4gIGNvbnN0IHNhdmVkQ3VycmVudENsaWVudHMgPSBjdXJyZW50QXBvbGxvQ2xpZW50c1xuXG4gIGlmICghaGFzSW5qZWN0aW9uQ29udGV4dCgpKSB7XG4gICAgcmVzb2x2ZUltcGwgPSAoaWQ/OiBDbGllbnRJZCkgPT4ge1xuICAgICAgaWYgKGlkKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlQ2xpZW50V2l0aElkKHNhdmVkQ3VycmVudENsaWVudHMsIGlkKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmVEZWZhdWx0Q2xpZW50KHNhdmVkQ3VycmVudENsaWVudHMsIHNhdmVkQ3VycmVudENsaWVudHMuZGVmYXVsdClcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgY29uc3QgcHJvdmlkZWRBcG9sbG9DbGllbnRzOiBDbGllbnREaWN0PFRDYWNoZVNoYXBlPiB8IG51bGwgPSBpbmplY3QoQXBvbGxvQ2xpZW50cywgbnVsbClcbiAgICBjb25zdCBwcm92aWRlZEFwb2xsb0NsaWVudDogQXBvbGxvQ2xpZW50PFRDYWNoZVNoYXBlPiB8IG51bGwgPSBpbmplY3QoRGVmYXVsdEFwb2xsb0NsaWVudCwgbnVsbClcblxuICAgIHJlc29sdmVJbXBsID0gKGlkPzogQ2xpZW50SWQpID0+IHtcbiAgICAgIGlmIChpZCkge1xuICAgICAgICBjb25zdCBjbGllbnQgPSByZXNvbHZlQ2xpZW50V2l0aElkKHByb3ZpZGVkQXBvbGxvQ2xpZW50cywgaWQpXG4gICAgICAgIGlmIChjbGllbnQpIHtcbiAgICAgICAgICByZXR1cm4gY2xpZW50XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVDbGllbnRXaXRoSWQoc2F2ZWRDdXJyZW50Q2xpZW50cywgaWQpXG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnQgPSByZXNvbHZlRGVmYXVsdENsaWVudChwcm92aWRlZEFwb2xsb0NsaWVudHMsIHByb3ZpZGVkQXBvbGxvQ2xpZW50KVxuICAgICAgaWYgKGNsaWVudCkge1xuICAgICAgICByZXR1cm4gY2xpZW50XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb2x2ZURlZmF1bHRDbGllbnQoc2F2ZWRDdXJyZW50Q2xpZW50cywgc2F2ZWRDdXJyZW50Q2xpZW50cy5kZWZhdWx0KVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc29sdmVDbGllbnQoaWQ6IENsaWVudElkIHwgdW5kZWZpbmVkID0gY2xpZW50SWQpIHtcbiAgICBjb25zdCBjbGllbnQgPSByZXNvbHZlSW1wbChpZClcbiAgICBpZiAoIWNsaWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQXBvbGxvIGNsaWVudCB3aXRoIGlkICR7XG4gICAgICAgICAgaWQgPz8gJ2RlZmF1bHQnXG4gICAgICAgIH0gbm90IGZvdW5kLiBVc2UgYW4gYXBwLnJ1bldpdGhDb250ZXh0KCkgb3IgcHJvdmlkZUFwb2xsb0NsaWVudCgpIGlmIHlvdSBhcmUgb3V0c2lkZSBvZiBhIGNvbXBvbmVudCBzZXR1cC5gLFxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gY2xpZW50XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlc29sdmVDbGllbnQsXG4gICAgZ2V0IGNsaWVudCgpIHtcbiAgICAgIHJldHVybiByZXNvbHZlQ2xpZW50KClcbiAgICB9LFxuICB9XG59XG5cbmxldCBjdXJyZW50QXBvbGxvQ2xpZW50czogQ2xpZW50RGljdDxhbnk+ID0ge31cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVBcG9sbG9DbGllbnQ8VENhY2hlU2hhcGUgPSBhbnk+KGNsaWVudDogQXBvbGxvQ2xpZW50PFRDYWNoZVNoYXBlPikge1xuICBjdXJyZW50QXBvbGxvQ2xpZW50cyA9IHtcbiAgICBkZWZhdWx0OiBjbGllbnQsXG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIDxURm5SZXN1bHQgPSBhbnk+IChmbjogKCkgPT4gVEZuUmVzdWx0KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gZm4oKVxuICAgIGN1cnJlbnRBcG9sbG9DbGllbnRzID0ge31cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVBcG9sbG9DbGllbnRzPFRDYWNoZVNoYXBlID0gYW55PihjbGllbnRzOiBDbGllbnREaWN0PFRDYWNoZVNoYXBlPikge1xuICBjdXJyZW50QXBvbGxvQ2xpZW50cyA9IGNsaWVudHNcbiAgcmV0dXJuIGZ1bmN0aW9uIDxURm5SZXN1bHQgPSBhbnk+IChmbjogKCkgPT4gVEZuUmVzdWx0KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gZm4oKVxuICAgIGN1cnJlbnRBcG9sbG9DbGllbnRzID0ge31cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgT3BlcmF0aW9uVmFyaWFibGVzIH0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZSdcbmltcG9ydCB0eXBlIHsgRG9jdW1lbnROb2RlIH0gZnJvbSAnZ3JhcGhxbCdcbmltcG9ydCB0eXBlIHsgRG9jdW1lbnRQYXJhbWV0ZXIsIE9wdGlvbnNQYXJhbWV0ZXIsIFVzZVF1ZXJ5T3B0aW9ucywgVXNlUXVlcnlSZXR1cm4sIFZhcmlhYmxlc1BhcmFtZXRlciB9IGZyb20gJy4vdXNlUXVlcnknXG5pbXBvcnQgeyBpc1JlZiB9IGZyb20gJ3Z1ZS1kZW1pJ1xuaW1wb3J0IHsgdXNlUXVlcnlJbXBsIH0gZnJvbSAnLi91c2VRdWVyeSdcbmltcG9ydCB7IGlzU2VydmVyIH0gZnJvbSAnLi91dGlsL2Vudi5qcydcblxuZXhwb3J0IGludGVyZmFjZSBVc2VMYXp5UXVlcnlSZXR1cm48VFJlc3VsdCwgVFZhcmlhYmxlcyBleHRlbmRzIE9wZXJhdGlvblZhcmlhYmxlcz4gZXh0ZW5kcyBVc2VRdWVyeVJldHVybjxUUmVzdWx0LCBUVmFyaWFibGVzPiB7XG4gIC8qKlxuICAgKiBBY3RpdmF0ZSB0aGUgcXVlcnkgYW5kIHN0YXJ0cyBsb2FkaW5nLlxuICAgKiBAcGFyYW0gZG9jdW1lbnQgT3ZlcnJpZGUgZG9jdW1lbnRcbiAgICogQHBhcmFtIHZhcmlhYmxlcyBPdmVycmlkZSB2YXJpYWJsZXNcbiAgICogQHBhcmFtIG9wdGlvbnMgT3ZlcnJpZGUgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBSZXR1cm5zIGZhbHNlIGlmIHRoZSBxdWVyeSBpcyBhbHJlYWR5IGFjdGl2ZSwgb3RoZXJ3aXNlIHRoZSBuZXh0IHJlc3VsdCBvZiB0aGUgcXVlcnkuXG4gICAqL1xuICBsb2FkOiAoZG9jdW1lbnQ/OiBEb2N1bWVudE5vZGUgfCBudWxsLCB2YXJpYWJsZXM/OiBUVmFyaWFibGVzIHwgbnVsbCwgb3B0aW9ucz86IFVzZVF1ZXJ5T3B0aW9ucyB8IG51bGwpID0+IGZhbHNlIHwgUHJvbWlzZTxUUmVzdWx0PlxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlTGF6eVF1ZXJ5PFxuICBUUmVzdWx0ID0gYW55LFxuICBUVmFyaWFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBhbnksXG4+KFxuICBkb2N1bWVudDogRG9jdW1lbnRQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4sXG4gIHZhcmlhYmxlcz86IFZhcmlhYmxlc1BhcmFtZXRlcjxUVmFyaWFibGVzPixcbiAgb3B0aW9ucz86IE9wdGlvbnNQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4sXG4pOiBVc2VMYXp5UXVlcnlSZXR1cm48VFJlc3VsdCwgVFZhcmlhYmxlcz4ge1xuICBjb25zdCBxdWVyeSA9IHVzZVF1ZXJ5SW1wbDxUUmVzdWx0LCBUVmFyaWFibGVzPihkb2N1bWVudCwgdmFyaWFibGVzLCBvcHRpb25zLCB0cnVlKVxuXG4gIGZ1bmN0aW9uIGxvYWQoXG4gICAgZG9jdW1lbnQ/OiBEb2N1bWVudE5vZGUgfCBudWxsLFxuICAgIHZhcmlhYmxlcz86IFRWYXJpYWJsZXMgfCBudWxsLFxuICAgIG9wdGlvbnM/OiBVc2VRdWVyeU9wdGlvbnMgfCBudWxsLFxuICApIHtcbiAgICBpZiAoZG9jdW1lbnQpIHtcbiAgICAgIHF1ZXJ5LmRvY3VtZW50LnZhbHVlID0gZG9jdW1lbnRcbiAgICB9XG4gICAgaWYgKHZhcmlhYmxlcykge1xuICAgICAgcXVlcnkudmFyaWFibGVzLnZhbHVlID0gdmFyaWFibGVzXG4gICAgfVxuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGlzUmVmKHF1ZXJ5Lm9wdGlvbnMpID8gcXVlcnkub3B0aW9ucy52YWx1ZSA6IHF1ZXJ5Lm9wdGlvbnMsIG9wdGlvbnMpXG4gICAgfVxuICAgIGNvbnN0IGlzRmlyc3RSdW4gPSBxdWVyeS5mb3JjZURpc2FibGVkLnZhbHVlXG4gICAgaWYgKGlzRmlyc3RSdW4pIHtcbiAgICAgIHF1ZXJ5LmZvcmNlRGlzYWJsZWQudmFsdWUgPSBmYWxzZVxuXG4gICAgICAvLyBJZiBTU1IsIHdlIG5lZWQgdG8gc3RhcnQgdGhlIHF1ZXJ5IG1hbnVhbGx5IHNpbmNlIGB3YXRjaGAgb24gYGlzRW5hYmxlZGAgaW4gYHVzZVF1ZXJ5SW1wbGAgd29uJ3QgYmUgY2FsbGVkLlxuICAgICAgaWYgKGlzU2VydmVyKSB7XG4gICAgICAgIHF1ZXJ5LnN0YXJ0KClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPFRSZXN1bHQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBvZmY6IG9mZlJlc3VsdCB9ID0gcXVlcnkub25SZXN1bHQoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmICghcmVzdWx0LmxvYWRpbmcpIHtcbiAgICAgICAgICAgIHJlc29sdmUocmVzdWx0LmRhdGEpXG4gICAgICAgICAgICBvZmZSZXN1bHQoKVxuICAgICAgICAgICAgb2ZmRXJyb3IoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgeyBvZmY6IG9mZkVycm9yIH0gPSBxdWVyeS5vbkVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgICBvZmZSZXN1bHQoKVxuICAgICAgICAgIG9mZkVycm9yKClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5xdWVyeSxcbiAgICBsb2FkLFxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIEFwb2xsb0NsaWVudCxcbiAgQXBvbGxvRXJyb3IsXG4gIEFwb2xsb1F1ZXJ5UmVzdWx0LFxuICBGZXRjaE1vcmVRdWVyeU9wdGlvbnMsXG4gIE1heWJlTWFza2VkLFxuICBPYnNlcnZhYmxlUXVlcnksXG4gIE9ic2VydmFibGVTdWJzY3JpcHRpb24sXG4gIE9wZXJhdGlvblZhcmlhYmxlcyxcbiAgU3Vic2NyaWJlVG9Nb3JlT3B0aW9ucyxcbiAgVHlwZWREb2N1bWVudE5vZGUsXG4gIFVubWFza2VkLFxuICBVcGRhdGVRdWVyeU1hcEZuLFxuICBXYXRjaFF1ZXJ5T3B0aW9ucyxcbn0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZS9pbmRleC5qcydcbmltcG9ydCB0eXBlIHsgRG9jdW1lbnROb2RlIH0gZnJvbSAnZ3JhcGhxbCdcbmltcG9ydCB0eXBlIHtcbiAgUmVmLFxufSBmcm9tICd2dWUtZGVtaSdcbmltcG9ydCB0eXBlIHsgUmVhY3RpdmVGdW5jdGlvbiB9IGZyb20gJy4vdXRpbC9SZWFjdGl2ZUZ1bmN0aW9uJ1xuaW1wb3J0IHsgZGVib3VuY2UsIHRocm90dGxlIH0gZnJvbSAndGhyb3R0bGUtZGVib3VuY2UnXG5pbXBvcnQge1xuICBjb21wdXRlZCxcbiAgZ2V0Q3VycmVudEluc3RhbmNlLFxuICBnZXRDdXJyZW50U2NvcGUsXG4gIG5leHRUaWNrLFxuICBvblNjb3BlRGlzcG9zZSxcbiAgb25TZXJ2ZXJQcmVmZXRjaCxcbiAgcmVmLFxuICBzaGFsbG93UmVmLFxuICB1bnJlZixcbiAgd2F0Y2gsXG59IGZyb20gJ3Z1ZS1kZW1pJ1xuaW1wb3J0IHsgdXNlQXBvbGxvQ2xpZW50IH0gZnJvbSAnLi91c2VBcG9sbG9DbGllbnQnXG5pbXBvcnQgeyBpc1NlcnZlciB9IGZyb20gJy4vdXRpbC9lbnYnXG5pbXBvcnQgeyB0cmFja1F1ZXJ5IH0gZnJvbSAnLi91dGlsL2xvYWRpbmdUcmFja2luZydcbmltcG9ydCB7IHBhcmFtVG9SZWFjdGl2ZSB9IGZyb20gJy4vdXRpbC9wYXJhbVRvUmVhY3RpdmUnXG5pbXBvcnQgeyBwYXJhbVRvUmVmIH0gZnJvbSAnLi91dGlsL3BhcmFtVG9SZWYnXG5pbXBvcnQgeyByZXN1bHRFcnJvcnNUb0Fwb2xsb0Vycm9yLCB0b0Fwb2xsb0Vycm9yIH0gZnJvbSAnLi91dGlsL3RvQXBvbGxvRXJyb3InXG5pbXBvcnQgeyB1c2VFdmVudEhvb2sgfSBmcm9tICcuL3V0aWwvdXNlRXZlbnRIb29rJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZVF1ZXJ5T3B0aW9uczxcbiAgVFJlc3VsdCA9IGFueSxcbiAgVFZhcmlhYmxlcyBleHRlbmRzIE9wZXJhdGlvblZhcmlhYmxlcyA9IE9wZXJhdGlvblZhcmlhYmxlcyxcbj4gZXh0ZW5kcyBPbWl0PFdhdGNoUXVlcnlPcHRpb25zPFRWYXJpYWJsZXM+LCAncXVlcnknIHwgJ3ZhcmlhYmxlcyc+IHtcbiAgY2xpZW50SWQ/OiBzdHJpbmdcbiAgZW5hYmxlZD86IGJvb2xlYW4gfCBSZWY8Ym9vbGVhbj5cbiAgdGhyb3R0bGU/OiBudW1iZXJcbiAgZGVib3VuY2U/OiBudW1iZXJcbiAgcHJlZmV0Y2g/OiBib29sZWFuXG4gIGtlZXBQcmV2aW91c1Jlc3VsdD86IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIFN1YnNjcmliZVRvTW9yZUl0ZW0ge1xuICBvcHRpb25zOiBhbnlcbiAgdW5zdWJzY3JpYmVGbnM6ICgoKSA9PiB2b2lkKVtdXG59XG5cbi8vIFBhcmFtZXRlcnNcbmV4cG9ydCB0eXBlIERvY3VtZW50UGFyYW1ldGVyPFRSZXN1bHQsIFRWYXJpYWJsZXM+ID0gRG9jdW1lbnROb2RlIHwgUmVmPERvY3VtZW50Tm9kZSB8IG51bGwgfCB1bmRlZmluZWQ+IHwgUmVhY3RpdmVGdW5jdGlvbjxEb2N1bWVudE5vZGUgfCBudWxsIHwgdW5kZWZpbmVkPiB8IFR5cGVkRG9jdW1lbnROb2RlPFRSZXN1bHQsIFRWYXJpYWJsZXM+IHwgUmVmPFR5cGVkRG9jdW1lbnROb2RlPFRSZXN1bHQsIFRWYXJpYWJsZXM+IHwgbnVsbCB8IHVuZGVmaW5lZD4gfCBSZWFjdGl2ZUZ1bmN0aW9uPFR5cGVkRG9jdW1lbnROb2RlPFRSZXN1bHQsIFRWYXJpYWJsZXM+IHwgbnVsbCB8IHVuZGVmaW5lZD5cbmV4cG9ydCB0eXBlIFZhcmlhYmxlc1BhcmFtZXRlcjxUVmFyaWFibGVzPiA9IFRWYXJpYWJsZXMgfCBSZWY8VFZhcmlhYmxlcz4gfCBSZWFjdGl2ZUZ1bmN0aW9uPFRWYXJpYWJsZXM+XG5leHBvcnQgdHlwZSBPcHRpb25zUGFyYW1ldGVyPFRSZXN1bHQsIFRWYXJpYWJsZXMgZXh0ZW5kcyBPcGVyYXRpb25WYXJpYWJsZXM+ID0gVXNlUXVlcnlPcHRpb25zPFRSZXN1bHQsIFRWYXJpYWJsZXM+IHwgUmVmPFVzZVF1ZXJ5T3B0aW9uczxUUmVzdWx0LCBUVmFyaWFibGVzPj4gfCBSZWFjdGl2ZUZ1bmN0aW9uPFVzZVF1ZXJ5T3B0aW9uczxUUmVzdWx0LCBUVmFyaWFibGVzPj5cblxuZXhwb3J0IGludGVyZmFjZSBPblJlc3VsdENvbnRleHQge1xuICBjbGllbnQ6IEFwb2xsb0NsaWVudDxhbnk+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT25FcnJvckNvbnRleHQge1xuICBjbGllbnQ6IEFwb2xsb0NsaWVudDxhbnk+XG59XG5cbi8vIFJldHVyblxuZXhwb3J0IGludGVyZmFjZSBVc2VRdWVyeVJldHVybjxUUmVzdWx0LCBUVmFyaWFibGVzIGV4dGVuZHMgT3BlcmF0aW9uVmFyaWFibGVzPiB7XG4gIHJlc3VsdDogUmVmPFRSZXN1bHQgfCB1bmRlZmluZWQ+XG4gIGxvYWRpbmc6IFJlZjxib29sZWFuPlxuICBuZXR3b3JrU3RhdHVzOiBSZWY8bnVtYmVyIHwgdW5kZWZpbmVkPlxuICBlcnJvcjogUmVmPEFwb2xsb0Vycm9yIHwgbnVsbD5cbiAgc3RhcnQ6ICgpID0+IHZvaWRcbiAgc3RvcDogKCkgPT4gdm9pZFxuICByZXN0YXJ0OiAoKSA9PiB2b2lkXG4gIGZvcmNlRGlzYWJsZWQ6IFJlZjxib29sZWFuPlxuICBkb2N1bWVudDogUmVmPERvY3VtZW50Tm9kZSB8IG51bGwgfCB1bmRlZmluZWQ+XG4gIHZhcmlhYmxlczogUmVmPFRWYXJpYWJsZXMgfCB1bmRlZmluZWQ+XG4gIG9wdGlvbnM6IFVzZVF1ZXJ5T3B0aW9uczxUUmVzdWx0LCBUVmFyaWFibGVzPiB8IFJlZjxVc2VRdWVyeU9wdGlvbnM8VFJlc3VsdCwgVFZhcmlhYmxlcz4+XG4gIHF1ZXJ5OiBSZWY8T2JzZXJ2YWJsZVF1ZXJ5PFRSZXN1bHQsIFRWYXJpYWJsZXM+IHwgbnVsbCB8IHVuZGVmaW5lZD5cbiAgcmVmZXRjaDogKHZhcmlhYmxlcz86IFRWYXJpYWJsZXMpID0+IFByb21pc2U8QXBvbGxvUXVlcnlSZXN1bHQ8VFJlc3VsdD4+IHwgdW5kZWZpbmVkXG4gIGZldGNoTW9yZTogPFRGZXRjaERhdGEgPSBUUmVzdWx0LCBURmV0Y2hWYXJzIGV4dGVuZHMgT3BlcmF0aW9uVmFyaWFibGVzID0gVFZhcmlhYmxlcz4gKG9wdGlvbnM6IEZldGNoTW9yZVF1ZXJ5T3B0aW9uczxURmV0Y2hWYXJzLCBURmV0Y2hEYXRhPiAmIHtcbiAgICB1cGRhdGVRdWVyeT86IChwcmV2aW91c1F1ZXJ5UmVzdWx0OiBVbm1hc2tlZDxUUmVzdWx0Piwgb3B0aW9uczoge1xuICAgICAgZmV0Y2hNb3JlUmVzdWx0OiBVbm1hc2tlZDxURmV0Y2hEYXRhPlxuICAgICAgdmFyaWFibGVzOiBURmV0Y2hWYXJzXG4gICAgfSkgPT4gVW5tYXNrZWQ8VFJlc3VsdD5cbiAgfSkgPT4gUHJvbWlzZTxBcG9sbG9RdWVyeVJlc3VsdDxNYXliZU1hc2tlZDxURmV0Y2hEYXRhPj4+IHwgdW5kZWZpbmVkXG4gIHVwZGF0ZVF1ZXJ5OiAobWFwRm46IFVwZGF0ZVF1ZXJ5TWFwRm48VFJlc3VsdCwgVFZhcmlhYmxlcz4pID0+IHZvaWRcbiAgc3Vic2NyaWJlVG9Nb3JlOiA8VFN1YnNjcmlwdGlvblZhcmlhYmxlcyBleHRlbmRzIE9wZXJhdGlvblZhcmlhYmxlcyA9IE9wZXJhdGlvblZhcmlhYmxlcywgVFN1YnNjcmlwdGlvbkRhdGEgPSBUUmVzdWx0PihvcHRpb25zOiBTdWJzY3JpYmVUb01vcmVPcHRpb25zPFRSZXN1bHQsIFRTdWJzY3JpcHRpb25WYXJpYWJsZXMsIFRTdWJzY3JpcHRpb25EYXRhPiB8IFJlZjxTdWJzY3JpYmVUb01vcmVPcHRpb25zPFRSZXN1bHQsIFRTdWJzY3JpcHRpb25WYXJpYWJsZXMsIFRTdWJzY3JpcHRpb25EYXRhPj4gfCBSZWFjdGl2ZUZ1bmN0aW9uPFN1YnNjcmliZVRvTW9yZU9wdGlvbnM8VFJlc3VsdCwgVFN1YnNjcmlwdGlvblZhcmlhYmxlcywgVFN1YnNjcmlwdGlvbkRhdGE+PikgPT4gdm9pZFxuICBvblJlc3VsdDogKGZuOiAocGFyYW06IEFwb2xsb1F1ZXJ5UmVzdWx0PFRSZXN1bHQ+LCBjb250ZXh0OiBPblJlc3VsdENvbnRleHQpID0+IHZvaWQpID0+IHtcbiAgICBvZmY6ICgpID0+IHZvaWRcbiAgfVxuICBvbkVycm9yOiAoZm46IChwYXJhbTogQXBvbGxvRXJyb3IsIGNvbnRleHQ6IE9uRXJyb3JDb250ZXh0KSA9PiB2b2lkKSA9PiB7XG4gICAgb2ZmOiAoKSA9PiB2b2lkXG4gIH1cbn1cblxuLyoqXG4gKiBVc2UgYSBxdWVyeSB0aGF0IGRvZXMgbm90IHJlcXVpcmUgdmFyaWFibGVzIG9yIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWVyeTxUUmVzdWx0ID0gYW55PihcbiAgZG9jdW1lbnQ6IERvY3VtZW50UGFyYW1ldGVyPFRSZXN1bHQsIHVuZGVmaW5lZD5cbik6IFVzZVF1ZXJ5UmV0dXJuPFRSZXN1bHQsIFJlY29yZDxzdHJpbmcsIG5ldmVyPj5cblxuLyoqXG4gKiBVc2UgYSBxdWVyeSB0aGF0IGhhcyBvcHRpb25hbCB2YXJpYWJsZXMgYnV0IG5vdCBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWVyeTxUUmVzdWx0ID0gYW55LCBUVmFyaWFibGVzIGV4dGVuZHMgT3BlcmF0aW9uVmFyaWFibGVzID0gT3BlcmF0aW9uVmFyaWFibGVzPihcbiAgZG9jdW1lbnQ6IERvY3VtZW50UGFyYW1ldGVyPFRSZXN1bHQsIFRWYXJpYWJsZXM+XG4pOiBVc2VRdWVyeVJldHVybjxUUmVzdWx0LCBUVmFyaWFibGVzPlxuXG4vKipcbiAqIFVzZSBhIHF1ZXJ5IHRoYXQgaGFzIHJlcXVpcmVkIHZhcmlhYmxlcyBidXQgbm90IG9wdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVF1ZXJ5PFRSZXN1bHQgPSBhbnksIFRWYXJpYWJsZXMgZXh0ZW5kcyBPcGVyYXRpb25WYXJpYWJsZXMgPSBPcGVyYXRpb25WYXJpYWJsZXM+KFxuICBkb2N1bWVudDogRG9jdW1lbnRQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4sXG4gIHZhcmlhYmxlczogVmFyaWFibGVzUGFyYW1ldGVyPFRWYXJpYWJsZXM+XG4pOiBVc2VRdWVyeVJldHVybjxUUmVzdWx0LCBUVmFyaWFibGVzPlxuXG4vKipcbiAqIFVzZSBhIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgb3B0aW9ucyBidXQgbm90IHZhcmlhYmxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVF1ZXJ5PFRSZXN1bHQgPSBhbnk+KFxuICBkb2N1bWVudDogRG9jdW1lbnRQYXJhbWV0ZXI8VFJlc3VsdCwgdW5kZWZpbmVkPixcbiAgdmFyaWFibGVzOiB1bmRlZmluZWQgfCBudWxsLFxuICBvcHRpb25zOiBPcHRpb25zUGFyYW1ldGVyPFRSZXN1bHQsIFJlY29yZDxzdHJpbmcsIG5ldmVyPj4sXG4pOiBVc2VRdWVyeVJldHVybjxUUmVzdWx0LCBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4+XG5cbi8qKlxuICogVXNlIGEgcXVlcnkgdGhhdCByZXF1aXJlcyB2YXJpYWJsZXMgYW5kIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWVyeTxUUmVzdWx0ID0gYW55LCBUVmFyaWFibGVzIGV4dGVuZHMgT3BlcmF0aW9uVmFyaWFibGVzID0gT3BlcmF0aW9uVmFyaWFibGVzPihcbiAgZG9jdW1lbnQ6IERvY3VtZW50UGFyYW1ldGVyPFRSZXN1bHQsIFRWYXJpYWJsZXM+LFxuICB2YXJpYWJsZXM6IFZhcmlhYmxlc1BhcmFtZXRlcjxUVmFyaWFibGVzPixcbiAgb3B0aW9uczogT3B0aW9uc1BhcmFtZXRlcjxUUmVzdWx0LCBUVmFyaWFibGVzPixcbik6IFVzZVF1ZXJ5UmV0dXJuPFRSZXN1bHQsIFRWYXJpYWJsZXM+XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWVyeTxcbiAgVFJlc3VsdCxcbiAgVFZhcmlhYmxlcyBleHRlbmRzIE9wZXJhdGlvblZhcmlhYmxlcyxcbj4oXG4gIGRvY3VtZW50OiBEb2N1bWVudFBhcmFtZXRlcjxUUmVzdWx0LCBUVmFyaWFibGVzPixcbiAgdmFyaWFibGVzPzogVmFyaWFibGVzUGFyYW1ldGVyPFRWYXJpYWJsZXM+LFxuICBvcHRpb25zPzogT3B0aW9uc1BhcmFtZXRlcjxUUmVzdWx0LCBUVmFyaWFibGVzPixcbik6IFVzZVF1ZXJ5UmV0dXJuPFRSZXN1bHQsIFRWYXJpYWJsZXM+IHtcbiAgcmV0dXJuIHVzZVF1ZXJ5SW1wbDxUUmVzdWx0LCBUVmFyaWFibGVzPihkb2N1bWVudCwgdmFyaWFibGVzLCBvcHRpb25zKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlUXVlcnlJbXBsPFxuICBUUmVzdWx0LFxuICBUVmFyaWFibGVzIGV4dGVuZHMgT3BlcmF0aW9uVmFyaWFibGVzLFxuPihcbiAgZG9jdW1lbnQ6IERvY3VtZW50UGFyYW1ldGVyPFRSZXN1bHQsIFRWYXJpYWJsZXM+LFxuICB2YXJpYWJsZXM/OiBWYXJpYWJsZXNQYXJhbWV0ZXI8VFZhcmlhYmxlcz4sXG4gIG9wdGlvbnM6IE9wdGlvbnNQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4gPSB7fSxcbiAgbGF6eSA9IGZhbHNlLFxuKTogVXNlUXVlcnlSZXR1cm48VFJlc3VsdCwgVFZhcmlhYmxlcz4ge1xuICBjb25zdCBjdXJyZW50U2NvcGUgPSBnZXRDdXJyZW50U2NvcGUoKVxuICBjb25zdCBjdXJyZW50SW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKVxuXG4gIGNvbnN0IGN1cnJlbnRPcHRpb25zID0gcmVmPFVzZVF1ZXJ5T3B0aW9uczxUUmVzdWx0LCBUVmFyaWFibGVzPj4oKVxuXG4gIGNvbnN0IGRvY3VtZW50UmVmID0gcGFyYW1Ub1JlZihkb2N1bWVudClcbiAgY29uc3QgdmFyaWFibGVzUmVmID0gcGFyYW1Ub1JlZih2YXJpYWJsZXMpXG4gIGNvbnN0IG9wdGlvbnNSZWYgPSBwYXJhbVRvUmVhY3RpdmUob3B0aW9ucylcblxuICAvLyBSZXN1bHRcbiAgLyoqXG4gICAqIFJlc3VsdCBmcm9tIHRoZSBxdWVyeVxuICAgKi9cbiAgY29uc3QgcmVzdWx0ID0gc2hhbGxvd1JlZjxUUmVzdWx0IHwgdW5kZWZpbmVkPigpXG4gIGNvbnN0IHJlc3VsdEV2ZW50ID0gdXNlRXZlbnRIb29rPFtBcG9sbG9RdWVyeVJlc3VsdDxUUmVzdWx0PiwgT25SZXN1bHRDb250ZXh0XT4oKVxuICBjb25zdCBlcnJvciA9IHNoYWxsb3dSZWY8QXBvbGxvRXJyb3IgfCBudWxsPihudWxsKVxuICBjb25zdCBlcnJvckV2ZW50ID0gdXNlRXZlbnRIb29rPFtBcG9sbG9FcnJvciwgT25FcnJvckNvbnRleHRdPigpXG5cbiAgLy8gTG9hZGluZ1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgYSBuZXR3b3JrIHJlcXVlc3QgaXMgcGVuZGluZ1xuICAgKi9cbiAgY29uc3QgbG9hZGluZyA9IHJlZihmYWxzZSlcbiAgY3VycmVudFNjb3BlICYmIHRyYWNrUXVlcnkobG9hZGluZylcbiAgY29uc3QgbmV0d29ya1N0YXR1cyA9IHJlZjxudW1iZXI+KClcblxuICAvLyBTU1JcbiAgbGV0IGZpcnN0UmVzb2x2ZTogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkXG4gIGxldCBmaXJzdFJlc29sdmVUcmlnZ2VyZWQgPSBmYWxzZVxuICBsZXQgZmlyc3RSZWplY3Q6ICgoYXBvbGxvRXJyb3I6IEFwb2xsb0Vycm9yKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuICBsZXQgZmlyc3RSZWplY3RFcnJvcjogdW5kZWZpbmVkIHwgQXBvbGxvRXJyb3JcblxuICBjb25zdCB0cnlGaXJzdFJlc29sdmUgPSAoKSA9PiB7XG4gICAgZmlyc3RSZXNvbHZlVHJpZ2dlcmVkID0gdHJ1ZVxuICAgIGlmIChmaXJzdFJlc29sdmUpXG4gICAgICBmaXJzdFJlc29sdmUoKVxuICB9XG5cbiAgY29uc3QgdHJ5Rmlyc3RSZWplY3QgPSAoYXBvbGxvRXJyb3I6IEFwb2xsb0Vycm9yKSA9PiB7XG4gICAgZmlyc3RSZWplY3RFcnJvciA9IGFwb2xsb0Vycm9yXG4gICAgaWYgKGZpcnN0UmVqZWN0KVxuICAgICAgZmlyc3RSZWplY3QoYXBvbGxvRXJyb3IpXG4gIH1cblxuICBjb25zdCByZXNldEZpcnN0UmVzb2x2ZVJlamVjdCA9ICgpID0+IHtcbiAgICBmaXJzdFJlc29sdmUgPSB1bmRlZmluZWRcbiAgICBmaXJzdFJlamVjdCA9IHVuZGVmaW5lZFxuICAgIGZpcnN0UmVzb2x2ZVRyaWdnZXJlZCA9IGZhbHNlXG4gICAgZmlyc3RSZWplY3RFcnJvciA9IHVuZGVmaW5lZFxuICB9XG5cbiAgY3VycmVudEluc3RhbmNlICYmIG9uU2VydmVyUHJlZmV0Y2g/LigoKSA9PiB7XG4gICAgaWYgKCFpc0VuYWJsZWQudmFsdWUgfHwgKGlzU2VydmVyICYmIGN1cnJlbnRPcHRpb25zLnZhbHVlPy5wcmVmZXRjaCA9PT0gZmFsc2UpKVxuICAgICAgcmV0dXJuXG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZmlyc3RSZXNvbHZlID0gKCkgPT4ge1xuICAgICAgICByZXNldEZpcnN0UmVzb2x2ZVJlamVjdCgpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuICAgICAgZmlyc3RSZWplY3QgPSAoYXBvbGxvRXJyb3I6IEFwb2xsb0Vycm9yKSA9PiB7XG4gICAgICAgIHJlc2V0Rmlyc3RSZXNvbHZlUmVqZWN0KClcbiAgICAgICAgcmVqZWN0KGFwb2xsb0Vycm9yKVxuICAgICAgfVxuXG4gICAgICBpZiAoZmlyc3RSZXNvbHZlVHJpZ2dlcmVkKSB7XG4gICAgICAgIGZpcnN0UmVzb2x2ZSgpXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChmaXJzdFJlamVjdEVycm9yKSB7XG4gICAgICAgIGZpcnN0UmVqZWN0KGZpcnN0UmVqZWN0RXJyb3IpXG4gICAgICB9XG4gICAgfSkuZmluYWxseShzdG9wKVxuICB9KVxuXG4gIC8vIEFwb2xsbyBDbGllbnRcbiAgY29uc3QgeyByZXNvbHZlQ2xpZW50IH0gPSB1c2VBcG9sbG9DbGllbnQoKVxuXG4gIGZ1bmN0aW9uIGdldENsaWVudCgpIHtcbiAgICByZXR1cm4gcmVzb2x2ZUNsaWVudChjdXJyZW50T3B0aW9ucy52YWx1ZT8uY2xpZW50SWQpXG4gIH1cblxuICAvLyBRdWVyeVxuXG4gIGNvbnN0IHF1ZXJ5OiBSZWY8T2JzZXJ2YWJsZVF1ZXJ5PFRSZXN1bHQsIFRWYXJpYWJsZXM+IHwgbnVsbCB8IHVuZGVmaW5lZD4gPSBzaGFsbG93UmVmKClcbiAgbGV0IG9ic2VydmVyOiBPYnNlcnZhYmxlU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkXG4gIGxldCBzdGFydGVkID0gZmFsc2VcbiAgbGV0IGlnbm9yZU5leHRSZXN1bHQgPSBmYWxzZVxuICBsZXQgZmlyc3RTdGFydCA9IHRydWVcblxuICAvKipcbiAgICogU3RhcnRzIHdhdGNoaW5nIHRoZSBxdWVyeVxuICAgKi9cbiAgZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgaWYgKFxuICAgICAgc3RhcnRlZCB8fCAhaXNFbmFibGVkLnZhbHVlXG4gICAgICB8fCAoaXNTZXJ2ZXIgJiYgY3VycmVudE9wdGlvbnMudmFsdWU/LnByZWZldGNoID09PSBmYWxzZSlcbiAgICAgIHx8ICFjdXJyZW50RG9jdW1lbnRcbiAgICApIHtcbiAgICAgIHRyeUZpcnN0UmVzb2x2ZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBPbiBzZXJ2ZXIgdGhlIHdhdGNoZXJzIG9uIGRvY3VtZW50LCB2YXJpYWJsZXMgYW5kIG9wdGlvbnMgYXJlIG5vdCB0cmlnZ2VyZWRcbiAgICBpZiAoaXNTZXJ2ZXIpIHtcbiAgICAgIGFwcGx5RG9jdW1lbnQoZG9jdW1lbnRSZWYudmFsdWUpXG4gICAgICBhcHBseVZhcmlhYmxlcyh2YXJpYWJsZXNSZWYudmFsdWUpXG4gICAgICBhcHBseU9wdGlvbnModW5yZWYob3B0aW9uc1JlZikpXG4gICAgfVxuXG4gICAgc3RhcnRlZCA9IHRydWVcbiAgICBlcnJvci52YWx1ZSA9IG51bGxcbiAgICBsb2FkaW5nLnZhbHVlID0gdHJ1ZVxuXG4gICAgY29uc3QgY2xpZW50ID0gZ2V0Q2xpZW50KClcblxuICAgIHF1ZXJ5LnZhbHVlID0gY2xpZW50LndhdGNoUXVlcnk8VFJlc3VsdCwgVFZhcmlhYmxlcz4oe1xuICAgICAgcXVlcnk6IGN1cnJlbnREb2N1bWVudCxcbiAgICAgIHZhcmlhYmxlczogY3VycmVudFZhcmlhYmxlcyA/PyB7fSBhcyBUVmFyaWFibGVzLFxuICAgICAgLi4uY3VycmVudE9wdGlvbnMudmFsdWUsXG4gICAgICAuLi4oaXNTZXJ2ZXIgJiYgY3VycmVudE9wdGlvbnMudmFsdWU/LmZldGNoUG9saWN5ICE9PSAnbm8tY2FjaGUnKVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGZldGNoUG9saWN5OiAnbmV0d29yay1vbmx5JyxcbiAgICAgICAgICB9XG4gICAgICAgIDoge30sXG4gICAgfSlcblxuICAgIHN0YXJ0UXVlcnlTdWJzY3JpcHRpb24oKVxuXG4gICAgLy8gTWFrZSB0aGUgY2FjaGUgZGF0YSBhdmFpbGFibGUgdG8gdGhlIGNvbXBvbmVudCBpbW1lZGlhdGVseVxuICAgIC8vIFRoaXMgcHJldmVudHMgU1NSIGh5ZHJhdGlvbiBtaXNtYXRjaGVzXG4gICAgaWYgKCFpc1NlcnZlciAmJiAoZmlyc3RTdGFydCB8fCAhY3VycmVudE9wdGlvbnMudmFsdWU/LmtlZXBQcmV2aW91c1Jlc3VsdCkgJiYgKGN1cnJlbnRPcHRpb25zLnZhbHVlPy5mZXRjaFBvbGljeSAhPT0gJ25vLWNhY2hlJyB8fCBjdXJyZW50T3B0aW9ucy52YWx1ZS5ub3RpZnlPbk5ldHdvcmtTdGF0dXNDaGFuZ2UpKSB7XG4gICAgICBjb25zdCBjdXJyZW50UmVzdWx0ID0gcXVlcnkudmFsdWUuZ2V0Q3VycmVudFJlc3VsdChmYWxzZSlcblxuICAgICAgaWYgKCFjdXJyZW50UmVzdWx0LmxvYWRpbmcgfHwgY3VycmVudFJlc3VsdC5wYXJ0aWFsIHx8IGN1cnJlbnRPcHRpb25zLnZhbHVlPy5ub3RpZnlPbk5ldHdvcmtTdGF0dXNDaGFuZ2UpIHtcbiAgICAgICAgb25OZXh0UmVzdWx0KGN1cnJlbnRSZXN1bHQpXG4gICAgICAgIGlnbm9yZU5leHRSZXN1bHQgPSAhY3VycmVudFJlc3VsdC5sb2FkaW5nXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChjdXJyZW50UmVzdWx0LmVycm9yKSB7XG4gICAgICAgIG9uRXJyb3IoY3VycmVudFJlc3VsdC5lcnJvcilcbiAgICAgICAgaWdub3JlTmV4dFJlc3VsdCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWlzU2VydmVyKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc3Vic2NyaWJlVG9Nb3JlSXRlbXMpIHtcbiAgICAgICAgYWRkU3Vic2NyaWJlVG9Nb3JlKGl0ZW0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgZmlyc3RTdGFydCA9IGZhbHNlXG4gIH1cblxuICBmdW5jdGlvbiBzdGFydFF1ZXJ5U3Vic2NyaXB0aW9uKCkge1xuICAgIGlmIChvYnNlcnZlciAmJiAhb2JzZXJ2ZXIuY2xvc2VkKVxuICAgICAgcmV0dXJuXG4gICAgaWYgKCFxdWVyeS52YWx1ZSlcbiAgICAgIHJldHVyblxuXG4gICAgLy8gQ3JlYXRlIHN1YnNjcmlwdGlvblxuICAgIGlnbm9yZU5leHRSZXN1bHQgPSBmYWxzZVxuICAgIG9ic2VydmVyID0gcXVlcnkudmFsdWUuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IG9uTmV4dFJlc3VsdCxcbiAgICAgIGVycm9yOiBvbkVycm9yLFxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBnZXRFcnJvclBvbGljeSgpIHtcbiAgICBjb25zdCBjbGllbnQgPSByZXNvbHZlQ2xpZW50KGN1cnJlbnRPcHRpb25zLnZhbHVlPy5jbGllbnRJZClcbiAgICByZXR1cm4gY3VycmVudE9wdGlvbnMudmFsdWU/LmVycm9yUG9saWN5IHx8IGNsaWVudC5kZWZhdWx0T3B0aW9ucz8ud2F0Y2hRdWVyeT8uZXJyb3JQb2xpY3lcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uTmV4dFJlc3VsdChxdWVyeVJlc3VsdDogQXBvbGxvUXVlcnlSZXN1bHQ8VFJlc3VsdD4pIHtcbiAgICBpZiAoaWdub3JlTmV4dFJlc3VsdCkge1xuICAgICAgaWdub3JlTmV4dFJlc3VsdCA9IGZhbHNlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYW55IHByZXZpb3VzIGVycm9yIHRoYXQgbWF5IHN0aWxsIGJlIHByZXNlbnQgZnJvbSB0aGUgbGFzdCBmZXRjaCAoc28gcmVzdWx0IGhhbmRsZXJzXG4gICAgLy8gZG9uJ3QgcmVjZWl2ZSBvbGQgZXJyb3JzIHRoYXQgbWF5IG5vdCBldmVuIGJlIGFwcGxpY2FibGUgYW55bW9yZSkuXG4gICAgZXJyb3IudmFsdWUgPSBudWxsXG5cbiAgICBwcm9jZXNzTmV4dFJlc3VsdChxdWVyeVJlc3VsdClcblxuICAgIC8vIFdoZW4gYGVycm9yUG9saWN5YCBpcyBgYWxsYCwgYG9uRXJyb3JgIHdpbGwgbm90IGdldCBjYWxsZWQgYW5kXG4gICAgLy8gQXBvbGxvUXVlcnlSZXN1bHQuZXJyb3JzIG1heSBiZSBzZXQgYXQgdGhlIHNhbWUgdGltZSBhcyB3ZSBnZXQgYSByZXN1bHQuXG4gICAgLy8gVGhlIGNvZGUgaXMgb25seSByZWxldmFudCB3aGVuIGBlcnJvclBvbGljeWAgaXMgYGFsbGAsIGJlY2F1c2UgZm9yIG90aGVyIHNpdHVhdGlvbnMgaXRcbiAgICAvLyBjb3VsZCBoYXBlbiB0aGF0IG5leHQgYW5kIGVycm9yIGFyZSBjYWxsZWQgYXQgdGhlIHNhbWUgdGltZSBhbmQgdGhlbiBpdCB3aWxsIGxlYWQgdG8gbXVsdGlwbGVcbiAgICAvLyBvbkVycm9yIGNhbGxzLlxuICAgIGNvbnN0IGVycm9yUG9saWN5ID0gZ2V0RXJyb3JQb2xpY3koKVxuICAgIGlmIChlcnJvclBvbGljeSAmJiBlcnJvclBvbGljeSA9PT0gJ2FsbCcgJiYgIXF1ZXJ5UmVzdWx0LmVycm9yICYmIHF1ZXJ5UmVzdWx0LmVycm9ycz8ubGVuZ3RoKSB7XG4gICAgICBwcm9jZXNzRXJyb3IocmVzdWx0RXJyb3JzVG9BcG9sbG9FcnJvcihxdWVyeVJlc3VsdC5lcnJvcnMpKVxuICAgIH1cblxuICAgIHRyeUZpcnN0UmVzb2x2ZSgpXG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzTmV4dFJlc3VsdChxdWVyeVJlc3VsdDogQXBvbGxvUXVlcnlSZXN1bHQ8VFJlc3VsdD4pIHtcbiAgICByZXN1bHQudmFsdWUgPSBxdWVyeVJlc3VsdC5kYXRhICYmIE9iamVjdC5rZXlzKHF1ZXJ5UmVzdWx0LmRhdGEpLmxlbmd0aCA9PT0gMFxuICAgICAgPyBxdWVyeVJlc3VsdC5lcnJvclxuICAgICAgJiYgIWN1cnJlbnRPcHRpb25zLnZhbHVlPy5yZXR1cm5QYXJ0aWFsRGF0YVxuICAgICAgJiYgY3VycmVudE9wdGlvbnMudmFsdWU/LmVycm9yUG9saWN5ID09PSAnbm9uZSdcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiByZXN1bHQudmFsdWVcbiAgICAgIDogcXVlcnlSZXN1bHQuZGF0YVxuICAgIGxvYWRpbmcudmFsdWUgPSBxdWVyeVJlc3VsdC5sb2FkaW5nXG4gICAgbmV0d29ya1N0YXR1cy52YWx1ZSA9IHF1ZXJ5UmVzdWx0Lm5ldHdvcmtTdGF0dXNcbiAgICAvLyBXYWl0IGZvciBoYW5kbGVycyB0byBiZSByZWdpc3RlcmVkXG4gICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgcmVzdWx0RXZlbnQudHJpZ2dlcihxdWVyeVJlc3VsdCwge1xuICAgICAgICBjbGllbnQ6IGdldENsaWVudCgpLFxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gb25FcnJvcihxdWVyeUVycm9yOiB1bmtub3duKSB7XG4gICAgaWYgKGlnbm9yZU5leHRSZXN1bHQpIHtcbiAgICAgIGlnbm9yZU5leHRSZXN1bHQgPSBmYWxzZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gYW55IGVycm9yIHNob3VsZCBhbHJlYWR5IGJlIGFuIEFwb2xsb0Vycm9yLCBidXQgd2UgbWFrZSBzdXJlXG4gICAgY29uc3QgYXBvbGxvRXJyb3IgPSB0b0Fwb2xsb0Vycm9yKHF1ZXJ5RXJyb3IpXG4gICAgY29uc3QgZXJyb3JQb2xpY3kgPSBnZXRFcnJvclBvbGljeSgpXG5cbiAgICBpZiAoZXJyb3JQb2xpY3kgJiYgZXJyb3JQb2xpY3kgIT09ICdub25lJykge1xuICAgICAgcHJvY2Vzc05leHRSZXN1bHQoKHF1ZXJ5LnZhbHVlIGFzIE9ic2VydmFibGVRdWVyeTxUUmVzdWx0LCBUVmFyaWFibGVzPikuZ2V0Q3VycmVudFJlc3VsdCgpKVxuICAgIH1cbiAgICBwcm9jZXNzRXJyb3IoYXBvbGxvRXJyb3IpXG4gICAgdHJ5Rmlyc3RSZWplY3QoYXBvbGxvRXJyb3IpXG4gICAgLy8gVGhlIG9ic2VydmFibGUgY2xvc2VzIHRoZSBzdWIgaWYgYW4gZXJyb3Igb2NjdXJzXG4gICAgcmVzdWJzY3JpYmVUb1F1ZXJ5KClcbiAgfVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NFcnJvcihhcG9sbG9FcnJvcjogQXBvbGxvRXJyb3IpIHtcbiAgICBlcnJvci52YWx1ZSA9IGFwb2xsb0Vycm9yXG4gICAgbG9hZGluZy52YWx1ZSA9IGZhbHNlXG4gICAgbmV0d29ya1N0YXR1cy52YWx1ZSA9IDhcbiAgICAvLyBXYWl0IGZvciBoYW5kbGVycyB0byBiZSByZWdpc3RlcmVkXG4gICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgZXJyb3JFdmVudC50cmlnZ2VyKGFwb2xsb0Vycm9yLCB7XG4gICAgICAgIGNsaWVudDogZ2V0Q2xpZW50KCksXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiByZXN1YnNjcmliZVRvUXVlcnkoKSB7XG4gICAgaWYgKCFxdWVyeS52YWx1ZSlcbiAgICAgIHJldHVyblxuICAgIGNvbnN0IGxhc3RFcnJvciA9IHF1ZXJ5LnZhbHVlLmdldExhc3RFcnJvcigpXG4gICAgY29uc3QgbGFzdFJlc3VsdCA9IHF1ZXJ5LnZhbHVlLmdldExhc3RSZXN1bHQoKVxuICAgIHF1ZXJ5LnZhbHVlLnJlc2V0TGFzdFJlc3VsdHMoKVxuICAgIHN0YXJ0UXVlcnlTdWJzY3JpcHRpb24oKVxuICAgIE9iamVjdC5hc3NpZ24ocXVlcnkudmFsdWUsIHsgbGFzdEVycm9yLCBsYXN0UmVzdWx0IH0pXG4gIH1cblxuICBsZXQgb25TdG9wSGFuZGxlcnM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW11cblxuICAvKipcbiAgICogU3RvcCB3YXRjaGluZyB0aGUgcXVlcnlcbiAgICovXG4gIGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgdHJ5Rmlyc3RSZXNvbHZlKClcbiAgICBpZiAoIXN0YXJ0ZWQpXG4gICAgICByZXR1cm5cbiAgICBzdGFydGVkID0gZmFsc2VcbiAgICBsb2FkaW5nLnZhbHVlID0gZmFsc2VcblxuICAgIG9uU3RvcEhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiBoYW5kbGVyKCkpXG4gICAgb25TdG9wSGFuZGxlcnMgPSBbXVxuXG4gICAgaWYgKHF1ZXJ5LnZhbHVlKSB7XG4gICAgICBxdWVyeS52YWx1ZS5zdG9wUG9sbGluZygpXG4gICAgICBxdWVyeS52YWx1ZSA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAob2JzZXJ2ZXIpIHtcbiAgICAgIG9ic2VydmVyLnVuc3Vic2NyaWJlKClcbiAgICAgIG9ic2VydmVyID0gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgLy8gUmVzdGFydFxuICBsZXQgcmVzdGFydGluZyA9IGZhbHNlXG4gIC8qKlxuICAgKiBRdWV1ZSBhIHJlc3RhcnQgb2YgdGhlIHF1ZXJ5IChvbiBuZXh0IHRpY2spIGlmIGl0IGlzIGFscmVhZHkgYWN0aXZlXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlUmVzdGFydCgpIHtcbiAgICBpZiAoIXN0YXJ0ZWQgfHwgcmVzdGFydGluZylcbiAgICAgIHJldHVyblxuICAgIHJlc3RhcnRpbmcgPSB0cnVlXG4gICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgaWYgKHN0YXJ0ZWQpIHtcbiAgICAgICAgc3RvcCgpXG4gICAgICAgIHN0YXJ0KClcbiAgICAgIH1cbiAgICAgIHJlc3RhcnRpbmcgPSBmYWxzZVxuICAgIH0pXG4gIH1cblxuICBsZXQgZGVib3VuY2VkUmVzdGFydDogdHlwZW9mIGJhc2VSZXN0YXJ0XG4gIGxldCBpc1Jlc3RhcnREZWJvdW5jZVNldHVwID0gZmFsc2VcbiAgZnVuY3Rpb24gdXBkYXRlUmVzdGFydEZuKCkge1xuICAgIC8vIE9uIHNlcnZlciwgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGN1cnJlbnRPcHRpb25zIGlzIGluaXRpYWxpemVkXG4gICAgLy8gQFRPRE8gaW52ZXN0aWdhdGVcbiAgICBpZiAoIWN1cnJlbnRPcHRpb25zLnZhbHVlKSB7XG4gICAgICBkZWJvdW5jZWRSZXN0YXJ0ID0gYmFzZVJlc3RhcnRcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpZiAoY3VycmVudE9wdGlvbnMudmFsdWU/LnRocm90dGxlKSB7XG4gICAgICAgIGRlYm91bmNlZFJlc3RhcnQgPSB0aHJvdHRsZShjdXJyZW50T3B0aW9ucy52YWx1ZS50aHJvdHRsZSwgYmFzZVJlc3RhcnQpXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChjdXJyZW50T3B0aW9ucy52YWx1ZT8uZGVib3VuY2UpIHtcbiAgICAgICAgZGVib3VuY2VkUmVzdGFydCA9IGRlYm91bmNlKGN1cnJlbnRPcHRpb25zLnZhbHVlLmRlYm91bmNlLCBiYXNlUmVzdGFydClcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBkZWJvdW5jZWRSZXN0YXJ0ID0gYmFzZVJlc3RhcnRcbiAgICAgIH1cbiAgICAgIGlzUmVzdGFydERlYm91bmNlU2V0dXAgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVzdGFydCgpIHtcbiAgICBpZiAoIXN0YXJ0ZWQgfHwgcmVzdGFydGluZylcbiAgICAgIHJldHVyblxuICAgIGlmICghaXNSZXN0YXJ0RGVib3VuY2VTZXR1cClcbiAgICAgIHVwZGF0ZVJlc3RhcnRGbigpXG4gICAgZGVib3VuY2VkUmVzdGFydCgpXG4gIH1cblxuICAvLyBBcHBseWluZyBkb2N1bWVudFxuICBsZXQgY3VycmVudERvY3VtZW50OiBEb2N1bWVudE5vZGUgfCBudWxsIHwgdW5kZWZpbmVkID0gZG9jdW1lbnRSZWYudmFsdWVcblxuICAvLyBFbmFibGVkIHN0YXRlXG5cbiAgY29uc3QgZm9yY2VEaXNhYmxlZCA9IHJlZihsYXp5KVxuICBjb25zdCBlbmFibGVkT3B0aW9uID0gY29tcHV0ZWQoKCkgPT4gIWN1cnJlbnRPcHRpb25zLnZhbHVlIHx8IGN1cnJlbnRPcHRpb25zLnZhbHVlLmVuYWJsZWQgPT0gbnVsbCB8fCBjdXJyZW50T3B0aW9ucy52YWx1ZS5lbmFibGVkKVxuICBjb25zdCBpc0VuYWJsZWQgPSBjb21wdXRlZCgoKSA9PiBlbmFibGVkT3B0aW9uLnZhbHVlICYmICFmb3JjZURpc2FibGVkLnZhbHVlICYmICEhZG9jdW1lbnRSZWYudmFsdWUpXG5cbiAgLy8gQXBwbHlpbmcgb3B0aW9ucyBmaXJzdCAoaW4gY2FzZSBpdCBkaXNhYmxlcyB0aGUgcXVlcnkpXG4gIHdhdGNoKCgpID0+IHVucmVmKG9wdGlvbnNSZWYpLCBhcHBseU9wdGlvbnMsIHtcbiAgICBkZWVwOiB0cnVlLFxuICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgfSlcblxuICBmdW5jdGlvbiBhcHBseU9wdGlvbnModmFsdWU6IFVzZVF1ZXJ5T3B0aW9uczxUUmVzdWx0LCBUVmFyaWFibGVzPikge1xuICAgIGlmIChjdXJyZW50T3B0aW9ucy52YWx1ZSAmJiAoXG4gICAgICBjdXJyZW50T3B0aW9ucy52YWx1ZS50aHJvdHRsZSAhPT0gdmFsdWUudGhyb3R0bGVcbiAgICAgIHx8IGN1cnJlbnRPcHRpb25zLnZhbHVlLmRlYm91bmNlICE9PSB2YWx1ZS5kZWJvdW5jZVxuICAgICkpIHtcbiAgICAgIHVwZGF0ZVJlc3RhcnRGbigpXG4gICAgfVxuICAgIGN1cnJlbnRPcHRpb25zLnZhbHVlID0gdmFsdWVcbiAgICByZXN0YXJ0KClcbiAgfVxuXG4gIC8vIEFwcGx5aW5nIGRvY3VtZW50XG4gIHdhdGNoKGRvY3VtZW50UmVmLCBhcHBseURvY3VtZW50KVxuXG4gIGZ1bmN0aW9uIGFwcGx5RG9jdW1lbnQodmFsdWU6IERvY3VtZW50Tm9kZSB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBjdXJyZW50RG9jdW1lbnQgPSB2YWx1ZVxuICAgIHJlc3RhcnQoKVxuICB9XG5cbiAgLy8gQXBwbHlpbmcgdmFyaWFibGVzXG4gIGxldCBjdXJyZW50VmFyaWFibGVzOiBUVmFyaWFibGVzIHwgdW5kZWZpbmVkXG4gIGxldCBjdXJyZW50VmFyaWFibGVzU2VyaWFsaXplZDogc3RyaW5nXG4gIHdhdGNoKCgpID0+IHtcbiAgICBpZiAoaXNFbmFibGVkLnZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFyaWFibGVzUmVmLnZhbHVlXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cbiAgfSwgYXBwbHlWYXJpYWJsZXMsIHtcbiAgICBkZWVwOiB0cnVlLFxuICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgfSlcblxuICBmdW5jdGlvbiBhcHBseVZhcmlhYmxlcyh2YWx1ZT86IFRWYXJpYWJsZXMpIHtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkoW3ZhbHVlLCBpc0VuYWJsZWQudmFsdWVdKVxuICAgIGlmIChzZXJpYWxpemVkICE9PSBjdXJyZW50VmFyaWFibGVzU2VyaWFsaXplZCkge1xuICAgICAgY3VycmVudFZhcmlhYmxlcyA9IHZhbHVlXG4gICAgICByZXN0YXJ0KClcbiAgICB9XG4gICAgY3VycmVudFZhcmlhYmxlc1NlcmlhbGl6ZWQgPSBzZXJpYWxpemVkXG4gIH1cblxuICAvLyBSZWZldGNoXG5cbiAgZnVuY3Rpb24gcmVmZXRjaCh2YXJpYWJsZXM6IFRWYXJpYWJsZXMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpIHtcbiAgICBpZiAocXVlcnkudmFsdWUpIHtcbiAgICAgIGlmICh2YXJpYWJsZXMpIHtcbiAgICAgICAgY3VycmVudFZhcmlhYmxlcyA9IHZhcmlhYmxlc1xuICAgICAgfVxuICAgICAgZXJyb3IudmFsdWUgPSBudWxsXG4gICAgICBsb2FkaW5nLnZhbHVlID0gdHJ1ZVxuICAgICAgcmV0dXJuIHF1ZXJ5LnZhbHVlLnJlZmV0Y2godmFyaWFibGVzKVxuICAgICAgICAudGhlbigocmVmZXRjaFJlc3VsdCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRSZXN1bHQgPSBxdWVyeS52YWx1ZT8uZ2V0Q3VycmVudFJlc3VsdCgpXG4gICAgICAgICAgY3VycmVudFJlc3VsdCAmJiBwcm9jZXNzTmV4dFJlc3VsdChjdXJyZW50UmVzdWx0KVxuICAgICAgICAgIHJldHVybiByZWZldGNoUmVzdWx0XG4gICAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLy8gVXBkYXRlIFF1ZXJ5XG5cbiAgZnVuY3Rpb24gdXBkYXRlUXVlcnkobWFwRm46IFVwZGF0ZVF1ZXJ5TWFwRm48VFJlc3VsdCwgVFZhcmlhYmxlcz4pIHtcbiAgICBpZiAocXVlcnkudmFsdWUpIHtcbiAgICAgIHF1ZXJ5LnZhbHVlLnVwZGF0ZVF1ZXJ5KG1hcEZuKVxuICAgIH1cbiAgfVxuXG4gIC8vIEZldGNoIG1vcmVcblxuICBmdW5jdGlvbiBmZXRjaE1vcmU8VEZldGNoRGF0YSA9IFRSZXN1bHQsIFRGZXRjaFZhcnMgZXh0ZW5kcyBPcGVyYXRpb25WYXJpYWJsZXMgPSBUVmFyaWFibGVzPihvcHRpb25zOiBGZXRjaE1vcmVRdWVyeU9wdGlvbnM8VEZldGNoVmFycywgVEZldGNoRGF0YT4gJiB7XG4gICAgdXBkYXRlUXVlcnk/OiAocHJldmlvdXNRdWVyeVJlc3VsdDogVW5tYXNrZWQ8VFJlc3VsdD4sIG9wdGlvbnM6IHtcbiAgICAgIGZldGNoTW9yZVJlc3VsdDogVW5tYXNrZWQ8VEZldGNoRGF0YT5cbiAgICAgIHZhcmlhYmxlczogVEZldGNoVmFyc1xuICAgIH0pID0+IFVubWFza2VkPFRSZXN1bHQ+XG4gIH0pOiBQcm9taXNlPEFwb2xsb1F1ZXJ5UmVzdWx0PE1heWJlTWFza2VkPFRGZXRjaERhdGE+Pj4gfCB1bmRlZmluZWQge1xuICAgIGlmIChxdWVyeS52YWx1ZSkge1xuICAgICAgZXJyb3IudmFsdWUgPSBudWxsXG4gICAgICBsb2FkaW5nLnZhbHVlID0gdHJ1ZVxuICAgICAgcmV0dXJuIHF1ZXJ5LnZhbHVlLmZldGNoTW9yZShvcHRpb25zKVxuICAgICAgICAudGhlbigoZmV0Y2hNb3JlUmVzdWx0KSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFJlc3VsdCA9IHF1ZXJ5LnZhbHVlPy5nZXRDdXJyZW50UmVzdWx0KClcbiAgICAgICAgICBjdXJyZW50UmVzdWx0ICYmIHByb2Nlc3NOZXh0UmVzdWx0KGN1cnJlbnRSZXN1bHQpXG4gICAgICAgICAgcmV0dXJuIGZldGNoTW9yZVJlc3VsdFxuICAgICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8vIFN1YnNjcmliZSB0byBtb3JlXG5cbiAgY29uc3Qgc3Vic2NyaWJlVG9Nb3JlSXRlbXM6IFN1YnNjcmliZVRvTW9yZUl0ZW1bXSA9IFtdXG5cbiAgZnVuY3Rpb24gc3Vic2NyaWJlVG9Nb3JlPFxuICAgIFRTdWJzY3JpcHRpb25WYXJpYWJsZXMgZXh0ZW5kcyBPcGVyYXRpb25WYXJpYWJsZXMgPSBPcGVyYXRpb25WYXJpYWJsZXMsXG4gICAgVFN1YnNjcmlwdGlvbkRhdGEgPSBUUmVzdWx0LFxuICA+KFxuICAgIG9wdGlvbnM6IFN1YnNjcmliZVRvTW9yZU9wdGlvbnM8VFJlc3VsdCwgVFN1YnNjcmlwdGlvblZhcmlhYmxlcywgVFN1YnNjcmlwdGlvbkRhdGE+IHxcbiAgICAgIFJlZjxTdWJzY3JpYmVUb01vcmVPcHRpb25zPFRSZXN1bHQsIFRTdWJzY3JpcHRpb25WYXJpYWJsZXMsIFRTdWJzY3JpcHRpb25EYXRhPj4gfFxuICAgICAgUmVhY3RpdmVGdW5jdGlvbjxTdWJzY3JpYmVUb01vcmVPcHRpb25zPFRSZXN1bHQsIFRTdWJzY3JpcHRpb25WYXJpYWJsZXMsIFRTdWJzY3JpcHRpb25EYXRhPj4sXG4gICkge1xuICAgIGlmIChpc1NlcnZlcilcbiAgICAgIHJldHVyblxuICAgIGNvbnN0IG9wdGlvbnNSZWYgPSBwYXJhbVRvUmVmKG9wdGlvbnMpXG4gICAgd2F0Y2gob3B0aW9uc1JlZiwgKHZhbHVlLCBvbGRWYWx1ZSwgb25DbGVhbnVwKSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IHN1YnNjcmliZVRvTW9yZUl0ZW1zLmZpbmRJbmRleChpdGVtID0+IGl0ZW0ub3B0aW9ucyA9PT0gb2xkVmFsdWUpXG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHN1YnNjcmliZVRvTW9yZUl0ZW1zLnNwbGljZShpbmRleCwgMSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW06IFN1YnNjcmliZVRvTW9yZUl0ZW0gPSB7XG4gICAgICAgIG9wdGlvbnM6IHZhbHVlLFxuICAgICAgICB1bnN1YnNjcmliZUZuczogW10sXG4gICAgICB9XG4gICAgICBzdWJzY3JpYmVUb01vcmVJdGVtcy5wdXNoKGl0ZW0pXG5cbiAgICAgIGFkZFN1YnNjcmliZVRvTW9yZShpdGVtKVxuXG4gICAgICBvbkNsZWFudXAoKCkgPT4ge1xuICAgICAgICBpdGVtLnVuc3Vic2NyaWJlRm5zLmZvckVhY2goZm4gPT4gZm4oKSlcbiAgICAgICAgaXRlbS51bnN1YnNjcmliZUZucyA9IFtdXG4gICAgICB9KVxuICAgIH0sIHtcbiAgICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gYWRkU3Vic2NyaWJlVG9Nb3JlKGl0ZW06IFN1YnNjcmliZVRvTW9yZUl0ZW0pIHtcbiAgICBpZiAoIXN0YXJ0ZWQpXG4gICAgICByZXR1cm5cbiAgICBpZiAoIXF1ZXJ5LnZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1F1ZXJ5IGlzIG5vdCBkZWZpbmVkJylcbiAgICB9XG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSBxdWVyeS52YWx1ZS5zdWJzY3JpYmVUb01vcmUoaXRlbS5vcHRpb25zKVxuICAgIG9uU3RvcEhhbmRsZXJzLnB1c2godW5zdWJzY3JpYmUpXG4gICAgaXRlbS51bnN1YnNjcmliZUZucy5wdXNoKHVuc3Vic2NyaWJlKVxuICB9XG5cbiAgLy8gQXV0byBzdGFydCAmIHN0b3BcblxuICB3YXRjaChpc0VuYWJsZWQsICh2YWx1ZSkgPT4ge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICBzdGFydCgpXG4gICAgICB9KVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHN0b3AoKVxuICAgIH1cbiAgfSlcblxuICBpZiAoaXNFbmFibGVkLnZhbHVlKSB7XG4gICAgc3RhcnQoKVxuICB9XG5cbiAgLy8gVGVhcmRvd25cbiAgaWYgKGN1cnJlbnRTY29wZSkge1xuICAgIG9uU2NvcGVEaXNwb3NlKCgpID0+IHtcbiAgICAgIHN0b3AoKVxuICAgICAgc3Vic2NyaWJlVG9Nb3JlSXRlbXMubGVuZ3RoID0gMFxuICAgIH0pXG4gIH1cbiAgZWxzZSB7XG4gICAgY29uc29sZS53YXJuKCdbVnVlIGFwb2xsb10gdXNlUXVlcnkoKSBpcyBjYWxsZWQgb3V0c2lkZSBvZiBhbiBhY3RpdmUgZWZmZWN0IHNjb3BlIGFuZCB0aGUgcXVlcnkgd2lsbCBub3QgYmUgYXV0b21hdGljYWxseSBzdG9wcGVkLicpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlc3VsdCxcbiAgICBsb2FkaW5nLFxuICAgIG5ldHdvcmtTdGF0dXMsXG4gICAgZXJyb3IsXG4gICAgc3RhcnQsXG4gICAgc3RvcCxcbiAgICByZXN0YXJ0LFxuICAgIGZvcmNlRGlzYWJsZWQsXG4gICAgZG9jdW1lbnQ6IGRvY3VtZW50UmVmLFxuICAgIHZhcmlhYmxlczogdmFyaWFibGVzUmVmLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNSZWYsXG4gICAgcXVlcnksXG4gICAgcmVmZXRjaCxcbiAgICBmZXRjaE1vcmUsXG4gICAgc3Vic2NyaWJlVG9Nb3JlLFxuICAgIHVwZGF0ZVF1ZXJ5LFxuICAgIG9uUmVzdWx0OiByZXN1bHRFdmVudC5vbixcbiAgICBvbkVycm9yOiBlcnJvckV2ZW50Lm9uLFxuICB9XG59XG4iLCJleHBvcnQgY29uc3QgaXNTZXJ2ZXIgPSB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJ1xuIiwiaW1wb3J0IHR5cGUgeyBFZmZlY3RTY29wZSwgUmVmIH0gZnJvbSAndnVlLWRlbWknXG5pbXBvcnQgeyBnZXRDdXJyZW50U2NvcGUsIG9uU2NvcGVEaXNwb3NlLCByZWYsIHdhdGNoIH0gZnJvbSAndnVlLWRlbWknXG5cbmltcG9ydCB7IGlzU2VydmVyIH0gZnJvbSAnLi9lbnYuanMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZGluZ1RyYWNraW5nIHtcbiAgcXVlcmllczogUmVmPG51bWJlcj5cbiAgbXV0YXRpb25zOiBSZWY8bnVtYmVyPlxuICBzdWJzY3JpcHRpb25zOiBSZWY8bnVtYmVyPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcExvYWRpbmdUcmFja2luZyBleHRlbmRzIExvYWRpbmdUcmFja2luZyB7XG4gIGNvbXBvbmVudHM6IE1hcDxFZmZlY3RTY29wZSwgTG9hZGluZ1RyYWNraW5nPlxufVxuXG5leHBvcnQgY29uc3QgZ2xvYmFsVHJhY2tpbmc6IEFwcExvYWRpbmdUcmFja2luZyA9IHtcbiAgcXVlcmllczogcmVmKDApLFxuICBtdXRhdGlvbnM6IHJlZigwKSxcbiAgc3Vic2NyaXB0aW9uczogcmVmKDApLFxuICBjb21wb25lbnRzOiBuZXcgTWFwKCksXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50VHJhY2tpbmcoKSB7XG4gIGNvbnN0IGN1cnJlbnRTY29wZSA9IGdldEN1cnJlbnRTY29wZSgpXG4gIGlmICghY3VycmVudFNjb3BlKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICBsZXQgdHJhY2tpbmc6IExvYWRpbmdUcmFja2luZ1xuICBpZiAoaXNTZXJ2ZXIpIHtcbiAgICAvLyBTU1IgZG9lcyBub3Qgc3VwcG9ydCBvblNjb3BlRGlzcG9zZSwgc28gaWYgd2UgZG9uJ3Qgc2tpcCB0aGlzLCBpdCB3aWxsIGxlYWsgbWVtb3J5XG4gICAgdHJhY2tpbmcgPSB7XG4gICAgICBxdWVyaWVzOiByZWYoMCksXG4gICAgICBtdXRhdGlvbnM6IHJlZigwKSxcbiAgICAgIHN1YnNjcmlwdGlvbnM6IHJlZigwKSxcbiAgICB9XG4gICAgcmV0dXJuIHsgdHJhY2tpbmcgfVxuICB9XG5cbiAgaWYgKCFnbG9iYWxUcmFja2luZy5jb21wb25lbnRzLmhhcyhjdXJyZW50U2NvcGUpKSB7XG4gICAgLy8gQWRkIHBlci1jb21wb25lbnQgdHJhY2tpbmdcbiAgICBnbG9iYWxUcmFja2luZy5jb21wb25lbnRzLnNldChjdXJyZW50U2NvcGUsIHRyYWNraW5nID0ge1xuICAgICAgcXVlcmllczogcmVmKDApLFxuICAgICAgbXV0YXRpb25zOiByZWYoMCksXG4gICAgICBzdWJzY3JpcHRpb25zOiByZWYoMCksXG4gICAgfSlcbiAgICAvLyBDbGVhbnVwXG4gICAgb25TY29wZURpc3Bvc2UoKCkgPT4ge1xuICAgICAgZ2xvYmFsVHJhY2tpbmcuY29tcG9uZW50cy5kZWxldGUoY3VycmVudFNjb3BlKVxuICAgIH0pXG4gIH1cbiAgZWxzZSB7XG4gICAgdHJhY2tpbmcgPSBnbG9iYWxUcmFja2luZy5jb21wb25lbnRzLmdldChjdXJyZW50U2NvcGUpIGFzIExvYWRpbmdUcmFja2luZ1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0cmFja2luZyxcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmFjayhsb2FkaW5nOiBSZWY8Ym9vbGVhbj4sIHR5cGU6IGtleW9mIExvYWRpbmdUcmFja2luZykge1xuICBpZiAoaXNTZXJ2ZXIpXG4gICAgcmV0dXJuXG5cbiAgY29uc3QgeyB0cmFja2luZyB9ID0gZ2V0Q3VycmVudFRyYWNraW5nKClcblxuICB3YXRjaChsb2FkaW5nLCAodmFsdWUsIG9sZFZhbHVlKSA9PiB7XG4gICAgaWYgKG9sZFZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT09IG9sZFZhbHVlKSB7XG4gICAgICBjb25zdCBtb2QgPSB2YWx1ZSA/IDEgOiAtMVxuICAgICAgaWYgKHRyYWNraW5nKVxuICAgICAgICB0cmFja2luZ1t0eXBlXS52YWx1ZSArPSBtb2RcbiAgICAgIGdsb2JhbFRyYWNraW5nW3R5cGVdLnZhbHVlICs9IG1vZFxuICAgIH1cbiAgfSwge1xuICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgfSlcblxuICBvblNjb3BlRGlzcG9zZSgoKSA9PiB7XG4gICAgaWYgKGxvYWRpbmcudmFsdWUpIHtcbiAgICAgIGlmICh0cmFja2luZylcbiAgICAgICAgdHJhY2tpbmdbdHlwZV0udmFsdWUtLVxuICAgICAgZ2xvYmFsVHJhY2tpbmdbdHlwZV0udmFsdWUtLVxuICAgIH1cbiAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYWNrUXVlcnkobG9hZGluZzogUmVmPGJvb2xlYW4+KSB7XG4gIHRyYWNrKGxvYWRpbmcsICdxdWVyaWVzJylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYWNrTXV0YXRpb24obG9hZGluZzogUmVmPGJvb2xlYW4+KSB7XG4gIHRyYWNrKGxvYWRpbmcsICdtdXRhdGlvbnMnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhY2tTdWJzY3JpcHRpb24obG9hZGluZzogUmVmPGJvb2xlYW4+KSB7XG4gIHRyYWNrKGxvYWRpbmcsICdzdWJzY3JpcHRpb25zJylcbn1cbiIsImltcG9ydCB0eXBlIHsgUmVmIH0gZnJvbSAndnVlLWRlbWknXG5pbXBvcnQgdHlwZSB7IFJlYWN0aXZlRnVuY3Rpb24gfSBmcm9tICcuL1JlYWN0aXZlRnVuY3Rpb24nXG5pbXBvcnQgeyBjb21wdXRlZCwgaXNSZWYsIHJlYWN0aXZlIH0gZnJvbSAndnVlLWRlbWknXG5cbnR5cGUgVE9iamVjdCA9IG9iamVjdFxuXG5leHBvcnQgZnVuY3Rpb24gcGFyYW1Ub1JlYWN0aXZlPFQgZXh0ZW5kcyBUT2JqZWN0PihwYXJhbTogVCB8IFJlZjxUPiB8IFJlYWN0aXZlRnVuY3Rpb248VD4pOiBUIHwgUmVmPFQ+IHtcbiAgaWYgKGlzUmVmKHBhcmFtKSkge1xuICAgIHJldHVybiBwYXJhbVxuICB9XG4gIGVsc2UgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBjb21wdXRlZChwYXJhbSBhcyBSZWFjdGl2ZUZ1bmN0aW9uPFQ+KVxuICB9XG4gIGVsc2UgaWYgKHBhcmFtKSB7XG4gICAgcmV0dXJuIHJlYWN0aXZlKHBhcmFtKSBhcyBUXG4gIH1cbiAgZWxzZSB7XG4gICAgcmV0dXJuIHBhcmFtXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUmVmIH0gZnJvbSAndnVlLWRlbWknXG5pbXBvcnQgdHlwZSB7IFJlYWN0aXZlRnVuY3Rpb24gfSBmcm9tICcuL1JlYWN0aXZlRnVuY3Rpb24nXG5pbXBvcnQgeyBjb21wdXRlZCwgaXNSZWYsIHJlZiB9IGZyb20gJ3Z1ZS1kZW1pJ1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyYW1Ub1JlZjxUPihwYXJhbTogVCB8IFJlZjxUPiB8IFJlYWN0aXZlRnVuY3Rpb248VD4pOiBSZWY8VD4ge1xuICBpZiAoaXNSZWYocGFyYW0pKSB7XG4gICAgcmV0dXJuIHBhcmFtXG4gIH1cbiAgZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGNvbXB1dGVkKHBhcmFtIGFzIFJlYWN0aXZlRnVuY3Rpb248VD4pXG4gIH1cbiAgZWxzZSB7XG4gICAgcmV0dXJuIHJlZihwYXJhbSkgYXMgUmVmPFQ+XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgR3JhcGhRTEZvcm1hdHRlZEVycm9yIH0gZnJvbSAnZ3JhcGhxbCdcbmltcG9ydCB7IEFwb2xsb0Vycm9yLCBpc0Fwb2xsb0Vycm9yIH0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZS9pbmRleC5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIHRvQXBvbGxvRXJyb3IoZXJyb3I6IHVua25vd24pOiBBcG9sbG9FcnJvciB7XG4gIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgcmV0dXJuIG5ldyBBcG9sbG9FcnJvcih7XG4gICAgICBuZXR3b3JrRXJyb3I6IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKChlcnJvciBhcyBhbnkpPy5tZXNzYWdlKSwgeyBvcmlnaW5hbEVycm9yOiBlcnJvciB9KSxcbiAgICAgIGVycm9yTWVzc2FnZTogU3RyaW5nKGVycm9yKSxcbiAgICB9KVxuICB9XG5cbiAgaWYgKGlzQXBvbGxvRXJyb3IoZXJyb3IpKSB7XG4gICAgcmV0dXJuIGVycm9yXG4gIH1cblxuICByZXR1cm4gbmV3IEFwb2xsb0Vycm9yKHsgbmV0d29ya0Vycm9yOiBlcnJvciwgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXN1bHRFcnJvcnNUb0Fwb2xsb0Vycm9yKGVycm9yczogUmVhZG9ubHlBcnJheTxHcmFwaFFMRm9ybWF0dGVkRXJyb3I+KTogQXBvbGxvRXJyb3Ige1xuICByZXR1cm4gbmV3IEFwb2xsb0Vycm9yKHtcbiAgICBncmFwaFFMRXJyb3JzOiBlcnJvcnMsXG4gICAgZXJyb3JNZXNzYWdlOiBgR3JhcGhRTCByZXNwb25zZSBjb250YWlucyBlcnJvcnM6ICR7ZXJyb3JzLm1hcCgoZTogYW55KSA9PiBlLm1lc3NhZ2UpLmpvaW4oJyB8ICcpfWAsXG4gIH0pXG59XG4iLCJleHBvcnQgZnVuY3Rpb24gdXNlRXZlbnRIb29rPFRQYXJhbXMgZXh0ZW5kcyBhbnlbXSA9IGFueVtdPigpIHtcbiAgY29uc3QgZm5zOiBBcnJheTwoLi4ucGFyYW1zOiBUUGFyYW1zKSA9PiB2b2lkPiA9IFtdXG5cbiAgZnVuY3Rpb24gb24oZm46ICguLi5wYXJhbXM6IFRQYXJhbXMpID0+IHZvaWQpIHtcbiAgICBmbnMucHVzaChmbilcbiAgICByZXR1cm4ge1xuICAgICAgb2ZmOiAoKSA9PiBvZmYoZm4pLFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9mZihmbjogKC4uLnBhcmFtczogVFBhcmFtcykgPT4gdm9pZCkge1xuICAgIGNvbnN0IGluZGV4ID0gZm5zLmluZGV4T2YoZm4pXG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgZm5zLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0cmlnZ2VyKC4uLnBhcmFtczogVFBhcmFtcykge1xuICAgIGZvciAoY29uc3QgZm4gb2YgZm5zKSB7XG4gICAgICBmbiguLi5wYXJhbXMpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Q291bnQoKSB7XG4gICAgcmV0dXJuIGZucy5sZW5ndGhcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgb24sXG4gICAgb2ZmLFxuICAgIHRyaWdnZXIsXG4gICAgZ2V0Q291bnQsXG4gIH1cbn1cbiIsImltcG9ydCB7IGNvbXB1dGVkIH0gZnJvbSAndnVlLWRlbWknXG5pbXBvcnQgeyBnZXRDdXJyZW50VHJhY2tpbmcsIGdsb2JhbFRyYWNraW5nIH0gZnJvbSAnLi91dGlsL2xvYWRpbmdUcmFja2luZydcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVF1ZXJ5TG9hZGluZygpIHtcbiAgY29uc3QgeyB0cmFja2luZyB9ID0gZ2V0Q3VycmVudFRyYWNraW5nKClcbiAgaWYgKCF0cmFja2luZylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZVF1ZXJ5TG9hZGluZyBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgYSBzZXR1cCBmdW5jdGlvbi4nKVxuICByZXR1cm4gY29tcHV0ZWQoKCkgPT4gdHJhY2tpbmcucXVlcmllcy52YWx1ZSA+IDApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VNdXRhdGlvbkxvYWRpbmcoKSB7XG4gIGNvbnN0IHsgdHJhY2tpbmcgfSA9IGdldEN1cnJlbnRUcmFja2luZygpXG4gIGlmICghdHJhY2tpbmcpXG4gICAgdGhyb3cgbmV3IEVycm9yKCd1c2VNdXRhdGlvbkxvYWRpbmcgbXVzdCBiZSBjYWxsZWQgaW5zaWRlIGEgc2V0dXAgZnVuY3Rpb24uJylcbiAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHRyYWNraW5nLm11dGF0aW9ucy52YWx1ZSA+IDApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdWJzY3JpcHRpb25Mb2FkaW5nKCkge1xuICBjb25zdCB7IHRyYWNraW5nIH0gPSBnZXRDdXJyZW50VHJhY2tpbmcoKVxuICBpZiAoIXRyYWNraW5nKVxuICAgIHRocm93IG5ldyBFcnJvcigndXNlU3Vic2NyaXB0aW9uTG9hZGluZyBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgYSBzZXR1cCBmdW5jdGlvbi4nKVxuICByZXR1cm4gY29tcHV0ZWQoKCkgPT4gdHJhY2tpbmcuc3Vic2NyaXB0aW9ucy52YWx1ZSA+IDApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VHbG9iYWxRdWVyeUxvYWRpbmcoKSB7XG4gIHJldHVybiBjb21wdXRlZCgoKSA9PiBnbG9iYWxUcmFja2luZy5xdWVyaWVzLnZhbHVlID4gMClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUdsb2JhbE11dGF0aW9uTG9hZGluZygpIHtcbiAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IGdsb2JhbFRyYWNraW5nLm11dGF0aW9ucy52YWx1ZSA+IDApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VHbG9iYWxTdWJzY3JpcHRpb25Mb2FkaW5nKCkge1xuICByZXR1cm4gY29tcHV0ZWQoKCkgPT4gZ2xvYmFsVHJhY2tpbmcuc3Vic2NyaXB0aW9ucy52YWx1ZSA+IDApXG59XG4iLCJpbXBvcnQgdHlwZSB7IEFwb2xsb0NsaWVudCwgQXBvbGxvRXJyb3IsIEZldGNoUmVzdWx0LCBNdXRhdGlvbk9wdGlvbnMsIE9wZXJhdGlvblZhcmlhYmxlcywgVHlwZWREb2N1bWVudE5vZGUgfSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlL2luZGV4LmpzJ1xuaW1wb3J0IHR5cGUgeyBEb2N1bWVudE5vZGUgfSBmcm9tICdncmFwaHFsJ1xuaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUtZGVtaSdcbmltcG9ydCB0eXBlIHsgUmVhY3RpdmVGdW5jdGlvbiB9IGZyb20gJy4vdXRpbC9SZWFjdGl2ZUZ1bmN0aW9uJ1xuaW1wb3J0IHsgZ2V0Q3VycmVudFNjb3BlLCBpc1JlZiwgbmV4dFRpY2ssIG9uU2NvcGVEaXNwb3NlLCByZWYsIHNoYWxsb3dSZWYgfSBmcm9tICd2dWUtZGVtaSdcbmltcG9ydCB7IHVzZUFwb2xsb0NsaWVudCB9IGZyb20gJy4vdXNlQXBvbGxvQ2xpZW50J1xuaW1wb3J0IHsgdHJhY2tNdXRhdGlvbiB9IGZyb20gJy4vdXRpbC9sb2FkaW5nVHJhY2tpbmcnXG5pbXBvcnQgeyB0b0Fwb2xsb0Vycm9yIH0gZnJvbSAnLi91dGlsL3RvQXBvbGxvRXJyb3InXG5pbXBvcnQgeyB1c2VFdmVudEhvb2sgfSBmcm9tICcuL3V0aWwvdXNlRXZlbnRIb29rJ1xuXG4vKipcbiAqIGB1c2VNdXRhdGlvbmAgb3B0aW9ucyBmb3IgbXV0YXRpb25zIHRoYXQgZG9uJ3QgcmVxdWlyZSBgdmFyaWFibGVzYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VNdXRhdGlvbk9wdGlvbnM8XG4gIFRSZXN1bHQgPSBhbnksXG4gIFRWYXJpYWJsZXMgPSBPcGVyYXRpb25WYXJpYWJsZXMsXG4+IGV4dGVuZHMgT21pdDxNdXRhdGlvbk9wdGlvbnM8VFJlc3VsdCwgVFZhcmlhYmxlcz4sICdtdXRhdGlvbic+IHtcbiAgY2xpZW50SWQ/OiBzdHJpbmdcbiAgdGhyb3dzPzogJ2F1dG8nIHwgJ2Fsd2F5cycgfCAnbmV2ZXInXG59XG5cbnR5cGUgRG9jdW1lbnRQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4gPSBEb2N1bWVudE5vZGUgfCBSZWY8RG9jdW1lbnROb2RlPiB8IFJlYWN0aXZlRnVuY3Rpb248RG9jdW1lbnROb2RlPiB8IFR5cGVkRG9jdW1lbnROb2RlPFRSZXN1bHQsIFRWYXJpYWJsZXM+IHwgUmVmPFR5cGVkRG9jdW1lbnROb2RlPFRSZXN1bHQsIFRWYXJpYWJsZXM+PiB8IFJlYWN0aXZlRnVuY3Rpb248VHlwZWREb2N1bWVudE5vZGU8VFJlc3VsdCwgVFZhcmlhYmxlcz4+XG50eXBlIE9wdGlvbnNQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4gPSBVc2VNdXRhdGlvbk9wdGlvbnM8VFJlc3VsdCwgVFZhcmlhYmxlcz4gfCBSZWY8VXNlTXV0YXRpb25PcHRpb25zPFRSZXN1bHQsIFRWYXJpYWJsZXM+PiB8IFJlYWN0aXZlRnVuY3Rpb248VXNlTXV0YXRpb25PcHRpb25zPFRSZXN1bHQsIFRWYXJpYWJsZXM+PlxuXG5leHBvcnQgdHlwZSBNdXRhdGVPdmVycmlkZU9wdGlvbnM8VFJlc3VsdD4gPSBQaWNrPFVzZU11dGF0aW9uT3B0aW9uczxUUmVzdWx0LCBPcGVyYXRpb25WYXJpYWJsZXM+LCAndXBkYXRlJyB8ICdvcHRpbWlzdGljUmVzcG9uc2UnIHwgJ2NvbnRleHQnIHwgJ3VwZGF0ZVF1ZXJpZXMnIHwgJ3JlZmV0Y2hRdWVyaWVzJyB8ICdhd2FpdFJlZmV0Y2hRdWVyaWVzJyB8ICdlcnJvclBvbGljeScgfCAnZmV0Y2hQb2xpY3knIHwgJ2NsaWVudElkJz5cbmV4cG9ydCB0eXBlIE11dGF0ZVJlc3VsdDxUUmVzdWx0PiA9IFByb21pc2U8RmV0Y2hSZXN1bHQ8VFJlc3VsdCwgUmVjb3JkPHN0cmluZywgYW55PiwgUmVjb3JkPHN0cmluZywgYW55Pj4gfCBudWxsPlxuZXhwb3J0IHR5cGUgTXV0YXRlRnVuY3Rpb248VFJlc3VsdCwgVFZhcmlhYmxlcz4gPSAodmFyaWFibGVzPzogVFZhcmlhYmxlcyB8IG51bGwsIG92ZXJyaWRlT3B0aW9ucz86IE11dGF0ZU92ZXJyaWRlT3B0aW9uczxUUmVzdWx0PikgPT4gTXV0YXRlUmVzdWx0PFRSZXN1bHQ+XG5cbmV4cG9ydCBpbnRlcmZhY2UgT25Eb25lQ29udGV4dCB7XG4gIGNsaWVudDogQXBvbGxvQ2xpZW50PGFueT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBPbkVycm9yQ29udGV4dCB7XG4gIGNsaWVudDogQXBvbGxvQ2xpZW50PGFueT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VNdXRhdGlvblJldHVybjxUUmVzdWx0LCBUVmFyaWFibGVzPiB7XG4gIG11dGF0ZTogTXV0YXRlRnVuY3Rpb248VFJlc3VsdCwgVFZhcmlhYmxlcz5cbiAgbG9hZGluZzogUmVmPGJvb2xlYW4+XG4gIGVycm9yOiBSZWY8QXBvbGxvRXJyb3IgfCBudWxsPlxuICBjYWxsZWQ6IFJlZjxib29sZWFuPlxuICBvbkRvbmU6IChmbjogKHBhcmFtOiBGZXRjaFJlc3VsdDxUUmVzdWx0LCBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBSZWNvcmQ8c3RyaW5nLCBhbnk+PiwgY29udGV4dDogT25Eb25lQ29udGV4dCkgPT4gdm9pZCkgPT4ge1xuICAgIG9mZjogKCkgPT4gdm9pZFxuICB9XG4gIG9uRXJyb3I6IChmbjogKHBhcmFtOiBBcG9sbG9FcnJvciwgY29udGV4dDogT25FcnJvckNvbnRleHQpID0+IHZvaWQpID0+IHtcbiAgICBvZmY6ICgpID0+IHZvaWRcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlTXV0YXRpb248XG4gIFRSZXN1bHQgPSBhbnksXG4gIFRWYXJpYWJsZXMgZXh0ZW5kcyBPcGVyYXRpb25WYXJpYWJsZXMgPSBPcGVyYXRpb25WYXJpYWJsZXMsXG4+KFxuICBkb2N1bWVudDogRG9jdW1lbnRQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4sXG4gIG9wdGlvbnM6IE9wdGlvbnNQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4gPSB7fSxcbik6IFVzZU11dGF0aW9uUmV0dXJuPFRSZXN1bHQsIFRWYXJpYWJsZXM+IHtcbiAgY29uc3QgY3VycmVudFNjb3BlID0gZ2V0Q3VycmVudFNjb3BlKClcbiAgY29uc3QgbG9hZGluZyA9IHJlZjxib29sZWFuPihmYWxzZSlcbiAgY3VycmVudFNjb3BlICYmIHRyYWNrTXV0YXRpb24obG9hZGluZylcbiAgY29uc3QgZXJyb3IgPSBzaGFsbG93UmVmPEFwb2xsb0Vycm9yIHwgbnVsbD4obnVsbClcbiAgY29uc3QgY2FsbGVkID0gcmVmPGJvb2xlYW4+KGZhbHNlKVxuXG4gIGNvbnN0IGRvbmVFdmVudCA9IHVzZUV2ZW50SG9vazxbRmV0Y2hSZXN1bHQ8VFJlc3VsdCwgUmVjb3JkPHN0cmluZywgYW55PiwgUmVjb3JkPHN0cmluZywgYW55Pj4sIE9uRG9uZUNvbnRleHRdPigpXG4gIGNvbnN0IGVycm9yRXZlbnQgPSB1c2VFdmVudEhvb2s8W0Fwb2xsb0Vycm9yLCBPbkVycm9yQ29udGV4dF0+KClcblxuICAvLyBBcG9sbG8gQ2xpZW50XG4gIGNvbnN0IHsgcmVzb2x2ZUNsaWVudCB9ID0gdXNlQXBvbGxvQ2xpZW50KClcblxuICBhc3luYyBmdW5jdGlvbiBtdXRhdGUodmFyaWFibGVzPzogVFZhcmlhYmxlcyB8IG51bGwsIG92ZXJyaWRlT3B0aW9uczogT21pdDxVc2VNdXRhdGlvbk9wdGlvbnM8VFJlc3VsdCwgVFZhcmlhYmxlcz4sICd2YXJpYWJsZXMnPiA9IHt9KSB7XG4gICAgbGV0IGN1cnJlbnREb2N1bWVudDogRG9jdW1lbnROb2RlXG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY3VycmVudERvY3VtZW50ID0gZG9jdW1lbnQoKVxuICAgIH1cbiAgICBlbHNlIGlmIChpc1JlZihkb2N1bWVudCkpIHtcbiAgICAgIGN1cnJlbnREb2N1bWVudCA9IGRvY3VtZW50LnZhbHVlXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY3VycmVudERvY3VtZW50ID0gZG9jdW1lbnRcbiAgICB9XG5cbiAgICBsZXQgY3VycmVudE9wdGlvbnM6IFVzZU11dGF0aW9uT3B0aW9uczxUUmVzdWx0LCBUVmFyaWFibGVzPlxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY3VycmVudE9wdGlvbnMgPSBvcHRpb25zKClcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNSZWYob3B0aW9ucykpIHtcbiAgICAgIGN1cnJlbnRPcHRpb25zID0gb3B0aW9ucy52YWx1ZVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGN1cnJlbnRPcHRpb25zID0gb3B0aW9uc1xuICAgIH1cbiAgICBjb25zdCBjbGllbnQgPSByZXNvbHZlQ2xpZW50KGN1cnJlbnRPcHRpb25zLmNsaWVudElkKVxuICAgIGVycm9yLnZhbHVlID0gbnVsbFxuICAgIGxvYWRpbmcudmFsdWUgPSB0cnVlXG4gICAgY2FsbGVkLnZhbHVlID0gdHJ1ZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQubXV0YXRlPFRSZXN1bHQsIFRWYXJpYWJsZXM+KHtcbiAgICAgICAgbXV0YXRpb246IGN1cnJlbnREb2N1bWVudCxcbiAgICAgICAgLi4uY3VycmVudE9wdGlvbnMsXG4gICAgICAgIC4uLm92ZXJyaWRlT3B0aW9ucyxcbiAgICAgICAgdmFyaWFibGVzOiAodmFyaWFibGVzID8/IGN1cnJlbnRPcHRpb25zLnZhcmlhYmxlcylcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgLi4uKGN1cnJlbnRPcHRpb25zLnZhcmlhYmxlcyBhcyBUVmFyaWFibGVzKSxcbiAgICAgICAgICAgICAgLi4uKHZhcmlhYmxlcyBhcyBUVmFyaWFibGVzKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH0pXG4gICAgICBsb2FkaW5nLnZhbHVlID0gZmFsc2VcbiAgICAgIGF3YWl0IG5leHRUaWNrKClcbiAgICAgIGRvbmVFdmVudC50cmlnZ2VyKHJlc3VsdCwge1xuICAgICAgICBjbGllbnQsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgYXBvbGxvRXJyb3IgPSB0b0Fwb2xsb0Vycm9yKGUpXG4gICAgICBlcnJvci52YWx1ZSA9IGFwb2xsb0Vycm9yXG4gICAgICBsb2FkaW5nLnZhbHVlID0gZmFsc2VcbiAgICAgIGF3YWl0IG5leHRUaWNrKClcbiAgICAgIGVycm9yRXZlbnQudHJpZ2dlcihhcG9sbG9FcnJvciwge1xuICAgICAgICBjbGllbnQsXG4gICAgICB9KVxuICAgICAgaWYgKGN1cnJlbnRPcHRpb25zLnRocm93cyA9PT0gJ2Fsd2F5cycgfHwgKGN1cnJlbnRPcHRpb25zLnRocm93cyAhPT0gJ25ldmVyJyAmJiAhZXJyb3JFdmVudC5nZXRDb3VudCgpKSkge1xuICAgICAgICB0aHJvdyBhcG9sbG9FcnJvclxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY3VycmVudFNjb3BlICYmIG9uU2NvcGVEaXNwb3NlKCgpID0+IHtcbiAgICBsb2FkaW5nLnZhbHVlID0gZmFsc2VcbiAgfSlcblxuICByZXR1cm4ge1xuICAgIG11dGF0ZSxcbiAgICBsb2FkaW5nLFxuICAgIGVycm9yLFxuICAgIGNhbGxlZCxcbiAgICBvbkRvbmU6IGRvbmVFdmVudC5vbixcbiAgICBvbkVycm9yOiBlcnJvckV2ZW50Lm9uLFxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IERlZXBOb25OdWxsYWJsZSwgRGVlcFJlcXVpcmVkIH0gZnJvbSAndHMtZXNzZW50aWFscydcbmltcG9ydCB0eXBlIHsgUmVmIH0gZnJvbSAndnVlLWRlbWknXG5pbXBvcnQgdHlwZSB7IEV4dHJhY3RTaW5nbGVLZXkgfSBmcm9tICcuL3V0aWwvRXh0cmFjdFNpbmdsZUtleSdcbmltcG9ydCB7IGNvbXB1dGVkIH0gZnJvbSAndnVlLWRlbWknXG5cbmV4cG9ydCB0eXBlIFVzZVJlc3VsdFJldHVybjxUPiA9IFJlYWRvbmx5PFJlZjxSZWFkb25seTxUPj4+XG5cbi8qKlxuICogUmVzb2x2ZSBhIGByZXN1bHRgLCByZXR1cm5pbmcgZWl0aGVyIHRoZSBmaXJzdCBrZXkgb2YgdGhlIGByZXN1bHRgIGlmIHRoZXJlXG4gKiBpcyBvbmx5IG9uZSwgb3IgdGhlIGByZXN1bHRgIGl0c2VsZi4gVGhlIGB2YWx1ZWAgb2YgdGhlIHJlZiB3aWxsIGJlXG4gKiBgdW5kZWZpbmVkYCB1bnRpbCBpdCBpcyByZXNvbHZlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgeyByZXN1bHQgfSA9IHVzZVF1ZXJ5KHt9KVxuICogY29uc3QgdXNlciA9IHVzZVJlc3VsdChyZXN1bHQpXG4gKiAvLyB1c2VyIGlzIGB1bmRlZmluZWRgIHVudGlsIHRoZSBxdWVyeSByZXNvbHZlc1xuICpcbiAqIEBwYXJhbSAge1JlZjxUUmVzdWx0Pn0gcmVzdWx0IEEgYHJlc3VsdGAgcmV0dXJuZWQgZnJvbSBgdXNlUXVlcnlgIHRvIHJlc29sdmUuXG4gKiBAcmV0dXJucyBSZWFkb25seSByZWYgd2l0aCBgdW5kZWZpbmVkYCBvciB0aGUgcmVzb2x2ZWQgYHJlc3VsdGAuXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGNvbXB1dGVkYCBpbnN0ZWFkLiBCZWZvcmU6IGBjb25zdCBpdGVtcyA9IHVzZVJlc3VsdChyZXN1bHQsIFtdLCBkYXRhID0+IGRhdGEuc29tZUZpZWxkLm15SXRlbXMpYCBBZnRlcjogYGNvbnN0IGl0ZW1zID0gY29tcHV0ZWQoKCkgPT4gcmVzdWx0LnZhbHVlPy5zb21lRmllbGQubXlJdGVtcyA/PyBbXSlgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VSZXN1bHQ8VFJlc3VsdCwgVFJlc3VsdEtleSBleHRlbmRzIGtleW9mIE5vbk51bGxhYmxlPFRSZXN1bHQ+ID0ga2V5b2YgTm9uTnVsbGFibGU8VFJlc3VsdD4+KFxuICByZXN1bHQ6IFJlZjxUUmVzdWx0PlxuKTogVXNlUmVzdWx0UmV0dXJuPHVuZGVmaW5lZCB8IEV4dHJhY3RTaW5nbGVLZXk8Tm9uTnVsbGFibGU8VFJlc3VsdD4sIFRSZXN1bHRLZXk+PlxuXG4vKipcbiAqIFJlc29sdmUgYSBgcmVzdWx0YCwgcmV0dXJuaW5nIGVpdGhlciB0aGUgZmlyc3Qga2V5IG9mIHRoZSBgcmVzdWx0YCBpZiB0aGVyZVxuICogaXMgb25seSBvbmUsIG9yIHRoZSBgcmVzdWx0YCBpdHNlbGYuIFRoZSBgdmFsdWVgIG9mIHRoZSByZWYgd2lsbCBiZVxuICogYGRlZmF1bHRWYWx1ZWAgdW50aWwgaXQgaXMgcmVzb2x2ZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHsgcmVzdWx0IH0gPSB1c2VRdWVyeSh7fSlcbiAqIGNvbnN0IHByb2ZpbGUgPSB1c2VSZXN1bHQocmVzdWx0LCB7fSlcbiAqIC8vIHByb2ZpbGUgaXMgYHt9YCB1bnRpbCB0aGUgcXVlcnkgcmVzb2x2ZXNcbiAqXG4gKiBAcGFyYW0gIHtSZWY8VFJlc3VsdD59IHJlc3VsdCBBIGByZXN1bHRgIHJldHVybmVkIGZyb20gYHVzZVF1ZXJ5YCB0byByZXNvbHZlLlxuICogQHBhcmFtICB7VERlZmF1bHRWYWx1ZX0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZSBiZWZvcmUgYHJlc3VsdGAgaXMgcmVzb2x2ZWQuXG4gKiBAcmV0dXJucyBSZWFkb25seSByZWYgd2l0aCB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgdGhlIHJlc29sdmVkIGByZXN1bHRgLlxuICogQGRlcHJlY2F0ZWQgVXNlIGBjb21wdXRlZGAgaW5zdGVhZC4gQmVmb3JlOiBgY29uc3QgaXRlbXMgPSB1c2VSZXN1bHQocmVzdWx0LCBbXSwgZGF0YSA9PiBkYXRhLnNvbWVGaWVsZC5teUl0ZW1zKWAgQWZ0ZXI6IGBjb25zdCBpdGVtcyA9IGNvbXB1dGVkKCgpID0+IHJlc3VsdC52YWx1ZT8uc29tZUZpZWxkLm15SXRlbXMgPz8gW10pYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVzdWx0PFRSZXN1bHQsIFREZWZhdWx0VmFsdWUsIFRSZXN1bHRLZXkgZXh0ZW5kcyBrZXlvZiBOb25OdWxsYWJsZTxUUmVzdWx0PiA9IGtleW9mIE5vbk51bGxhYmxlPFRSZXN1bHQ+PihcbiAgcmVzdWx0OiBSZWY8VFJlc3VsdD4sXG4gIGRlZmF1bHRWYWx1ZTogVERlZmF1bHRWYWx1ZVxuKTogVXNlUmVzdWx0UmV0dXJuPFREZWZhdWx0VmFsdWUgfCBFeHRyYWN0U2luZ2xlS2V5PE5vbk51bGxhYmxlPFRSZXN1bHQ+LCBUUmVzdWx0S2V5Pj5cblxuLyoqXG4gKiBSZXNvbHZlIGEgYHJlc3VsdGAsIHJldHVybmluZyB0aGUgYHJlc3VsdGAgbWFwcGVkIHdpdGggdGhlIGBwaWNrYCBmdW5jdGlvbi5cbiAqIFRoZSBgdmFsdWVgIG9mIHRoZSByZWYgd2lsbCBiZSBgZGVmYXVsdFZhbHVlYCB1bnRpbCBpdCBpcyByZXNvbHZlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgeyByZXN1bHQgfSA9IHVzZVF1ZXJ5KHt9KVxuICogY29uc3QgY29tbWVudHMgPSB1c2VSZXN1bHQocmVzdWx0LCB1bmRlZmluZWQsIChkYXRhKSA9PiBkYXRhLmNvbW1lbnRzKVxuICogLy8gdXNlciBpcyBgdW5kZWZpbmVkYCwgdGhlbiByZXNvbHZlcyB0byB0aGUgcmVzdWx0J3MgYGNvbW1lbnRzYFxuICpcbiAqIEBwYXJhbSAge1JlZjxUUmVzdWx0Pn0gcmVzdWx0IEEgYHJlc3VsdGAgcmV0dXJuZWQgZnJvbSBgdXNlUXVlcnlgIHRvIHJlc29sdmUuXG4gKiBAcGFyYW0gIHtURGVmYXVsdFZhbHVlfSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGJlZm9yZSBgcmVzdWx0YCBpcyByZXNvbHZlZC5cbiAqIEBwYXJhbSAgeyhkYXRhOlRSZXN1bHQpPT5UUmV0dXJuVmFsdWV9IHBpY2sgVGhlIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgYHJlc3VsdGAgYW5kIG1hcHMgYSByZXR1cm4gdmFsdWUgZnJvbSBpdC5cbiAqIEByZXR1cm5zIFJlYWRvbmx5IHJlZiB3aXRoIHRoZSBgZGVmYXVsdFZhbHVlYCBvciB0aGUgcmVzb2x2ZWQgYW5kIGBwaWNrYC1tYXBwZWQgYHJlc3VsdGBcbiAqIEBkZXByZWNhdGVkIFVzZSBgY29tcHV0ZWRgIGluc3RlYWQuIEJlZm9yZTogYGNvbnN0IGl0ZW1zID0gdXNlUmVzdWx0KHJlc3VsdCwgW10sIGRhdGEgPT4gZGF0YS5zb21lRmllbGQubXlJdGVtcylgIEFmdGVyOiBgY29uc3QgaXRlbXMgPSBjb21wdXRlZCgoKSA9PiByZXN1bHQudmFsdWU/LnNvbWVGaWVsZC5teUl0ZW1zID8/IFtdKWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVJlc3VsdDxcbiAgVFJlc3VsdCxcbiAgVERlZmF1bHRWYWx1ZSxcbiAgVFJldHVyblZhbHVlLFxuPihcbiAgcmVzdWx0OiBSZWY8VFJlc3VsdD4sXG4gIGRlZmF1bHRWYWx1ZTogVERlZmF1bHRWYWx1ZSB8IHVuZGVmaW5lZCxcbiAgcGljazogKGRhdGE6IERlZXBSZXF1aXJlZDxEZWVwTm9uTnVsbGFibGU8VFJlc3VsdD4+KSA9PiBUUmV0dXJuVmFsdWVcbik6IFVzZVJlc3VsdFJldHVybjxURGVmYXVsdFZhbHVlIHwgVFJldHVyblZhbHVlPlxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgY29tcHV0ZWRgIGluc3RlYWQuIEJlZm9yZTogYGNvbnN0IGl0ZW1zID0gdXNlUmVzdWx0KHJlc3VsdCwgW10sIGRhdGEgPT4gZGF0YS5zb21lRmllbGQubXlJdGVtcylgIEFmdGVyOiBgY29uc3QgaXRlbXMgPSBjb21wdXRlZCgoKSA9PiByZXN1bHQudmFsdWU/LnNvbWVGaWVsZC5teUl0ZW1zID8/IFtdKWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVJlc3VsdDxcbiAgVFJlc3VsdCxcbiAgVERlZmF1bHRWYWx1ZSxcbiAgVFJldHVyblZhbHVlLFxuPihcbiAgcmVzdWx0OiBSZWY8VFJlc3VsdD4sXG4gIGRlZmF1bHRWYWx1ZT86IFREZWZhdWx0VmFsdWUsXG4gIHBpY2s/OiAoZGF0YTogRGVlcFJlcXVpcmVkPERlZXBOb25OdWxsYWJsZTxUUmVzdWx0Pj4pID0+IFRSZXR1cm5WYWx1ZSxcbik6IFVzZVJlc3VsdFJldHVybjxUUmVzdWx0IHwgVFJlc3VsdFtrZXlvZiBUUmVzdWx0XSB8IFREZWZhdWx0VmFsdWUgfCBUUmV0dXJuVmFsdWUgfCB1bmRlZmluZWQ+IHtcbiAgY29uc29sZS53YXJuKGAndXNlUmVzdWx0JyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgc29vbi4gUGxlYXNlIHVzZSAnY29tcHV0ZWQnIGluc3RlYWQuXG5CZWZvcmU6XG5jb25zdCBpdGVtcyA9IHVzZVJlc3VsdChyZXN1bHQsIFtdLCBkYXRhID0+IGRhdGEuc29tZUZpZWxkLm15SXRlbXMpXG5BZnRlcjpcbmNvbnN0IGl0ZW1zID0gY29tcHV0ZWQoKCkgPT4gcmVzdWx0LnZhbHVlPy5zb21lRmllbGQubXlJdGVtcyA/PyBbXSlgKVxuICByZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gcmVzdWx0LnZhbHVlXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBpZiAocGljaykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBwaWNrKHZhbHVlIGFzIERlZXBSZXF1aXJlZDxEZWVwTm9uTnVsbGFibGU8VFJlc3VsdD4+KVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gU2lsZW50IGVycm9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpXG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgdGFrZSB0aGUgb25seSBrZXkgaW4gcmVzdWx0IGRhdGFcbiAgICAgICAgICByZXR1cm4gdmFsdWVba2V5c1swXSBhcyBrZXlvZiBUUmVzdWx0XVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIC8vIFJldHVybiBlbnRpcmUgcmVzdWx0IGRhdGFcbiAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gIH0pXG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIEFwb2xsb0NsaWVudCxcbiAgQXBvbGxvRXJyb3IsXG4gIEZldGNoUmVzdWx0LFxuICBPYnNlcnZhYmxlLFxuICBPYnNlcnZhYmxlU3Vic2NyaXB0aW9uLFxuICBPcGVyYXRpb25WYXJpYWJsZXMsXG4gIFN1YnNjcmlwdGlvbk9wdGlvbnMsXG4gIFR5cGVkRG9jdW1lbnROb2RlLFxufSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlL2luZGV4LmpzJ1xuaW1wb3J0IHR5cGUgeyBEb2N1bWVudE5vZGUgfSBmcm9tICdncmFwaHFsJ1xuaW1wb3J0IHR5cGUge1xuICBSZWYsXG59IGZyb20gJ3Z1ZS1kZW1pJ1xuaW1wb3J0IHR5cGUgeyBSZWFjdGl2ZUZ1bmN0aW9uIH0gZnJvbSAnLi91dGlsL1JlYWN0aXZlRnVuY3Rpb24nXG5pbXBvcnQgeyBkZWJvdW5jZSwgdGhyb3R0bGUgfSBmcm9tICd0aHJvdHRsZS1kZWJvdW5jZSdcbmltcG9ydCB7XG4gIGNvbXB1dGVkLFxuICBnZXRDdXJyZW50U2NvcGUsXG4gIGlzUmVmLFxuICBuZXh0VGljayxcbiAgb25TY29wZURpc3Bvc2UsXG4gIHJlZixcbiAgc2hhbGxvd1JlZixcbiAgd2F0Y2gsXG59IGZyb20gJ3Z1ZS1kZW1pJ1xuaW1wb3J0IHsgdXNlQXBvbGxvQ2xpZW50IH0gZnJvbSAnLi91c2VBcG9sbG9DbGllbnQnXG5pbXBvcnQgeyBpc1NlcnZlciB9IGZyb20gJy4vdXRpbC9lbnYnXG5pbXBvcnQgeyB0cmFja1N1YnNjcmlwdGlvbiB9IGZyb20gJy4vdXRpbC9sb2FkaW5nVHJhY2tpbmcnXG5pbXBvcnQgeyBwYXJhbVRvUmVhY3RpdmUgfSBmcm9tICcuL3V0aWwvcGFyYW1Ub1JlYWN0aXZlJ1xuaW1wb3J0IHsgcGFyYW1Ub1JlZiB9IGZyb20gJy4vdXRpbC9wYXJhbVRvUmVmJ1xuaW1wb3J0IHsgdG9BcG9sbG9FcnJvciB9IGZyb20gJy4vdXRpbC90b0Fwb2xsb0Vycm9yJ1xuaW1wb3J0IHsgdXNlRXZlbnRIb29rIH0gZnJvbSAnLi91dGlsL3VzZUV2ZW50SG9vaydcblxuZXhwb3J0IGludGVyZmFjZSBVc2VTdWJzY3JpcHRpb25PcHRpb25zPFxuICBUUmVzdWx0ID0gYW55LFxuICBUVmFyaWFibGVzID0gT3BlcmF0aW9uVmFyaWFibGVzLFxuPiBleHRlbmRzIE9taXQ8U3Vic2NyaXB0aW9uT3B0aW9uczxUVmFyaWFibGVzPiwgJ3F1ZXJ5JyB8ICd2YXJpYWJsZXMnPiB7XG4gIGNsaWVudElkPzogc3RyaW5nXG4gIGVuYWJsZWQ/OiBib29sZWFuIHwgUmVmPGJvb2xlYW4+XG4gIHRocm90dGxlPzogbnVtYmVyXG4gIGRlYm91bmNlPzogbnVtYmVyXG59XG5cbnR5cGUgRG9jdW1lbnRQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4gPSBEb2N1bWVudE5vZGUgfCBSZWY8RG9jdW1lbnROb2RlPiB8IFJlYWN0aXZlRnVuY3Rpb248RG9jdW1lbnROb2RlPiB8IFR5cGVkRG9jdW1lbnROb2RlPFRSZXN1bHQsIFRWYXJpYWJsZXM+IHwgUmVmPFR5cGVkRG9jdW1lbnROb2RlPFRSZXN1bHQsIFRWYXJpYWJsZXM+PiB8IFJlYWN0aXZlRnVuY3Rpb248VHlwZWREb2N1bWVudE5vZGU8VFJlc3VsdCwgVFZhcmlhYmxlcz4+XG50eXBlIFZhcmlhYmxlc1BhcmFtZXRlcjxUVmFyaWFibGVzPiA9IFRWYXJpYWJsZXMgfCBSZWY8VFZhcmlhYmxlcz4gfCBSZWFjdGl2ZUZ1bmN0aW9uPFRWYXJpYWJsZXM+XG50eXBlIE9wdGlvbnNQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4gPSBVc2VTdWJzY3JpcHRpb25PcHRpb25zPFRSZXN1bHQsIFRWYXJpYWJsZXM+IHwgUmVmPFVzZVN1YnNjcmlwdGlvbk9wdGlvbnM8VFJlc3VsdCwgVFZhcmlhYmxlcz4+IHwgUmVhY3RpdmVGdW5jdGlvbjxVc2VTdWJzY3JpcHRpb25PcHRpb25zPFRSZXN1bHQsIFRWYXJpYWJsZXM+PlxuXG5leHBvcnQgaW50ZXJmYWNlIE9uUmVzdWx0Q29udGV4dCB7XG4gIGNsaWVudDogQXBvbGxvQ2xpZW50PGFueT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBPbkVycm9yQ29udGV4dCB7XG4gIGNsaWVudDogQXBvbGxvQ2xpZW50PGFueT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VTdWJzY3JpcHRpb25SZXR1cm48VFJlc3VsdCwgVFZhcmlhYmxlcz4ge1xuICByZXN1bHQ6IFJlZjxUUmVzdWx0IHwgbnVsbCB8IHVuZGVmaW5lZD5cbiAgbG9hZGluZzogUmVmPGJvb2xlYW4+XG4gIGVycm9yOiBSZWY8QXBvbGxvRXJyb3IgfCBudWxsPlxuICBzdGFydDogKCkgPT4gdm9pZFxuICBzdG9wOiAoKSA9PiB2b2lkXG4gIHJlc3RhcnQ6ICgpID0+IHZvaWRcbiAgZG9jdW1lbnQ6IFJlZjxEb2N1bWVudE5vZGU+XG4gIHZhcmlhYmxlczogUmVmPFRWYXJpYWJsZXMgfCB1bmRlZmluZWQ+XG4gIG9wdGlvbnM6IFVzZVN1YnNjcmlwdGlvbk9wdGlvbnM8VFJlc3VsdCwgVFZhcmlhYmxlcz4gfCBSZWY8VXNlU3Vic2NyaXB0aW9uT3B0aW9uczxUUmVzdWx0LCBUVmFyaWFibGVzPj5cbiAgc3Vic2NyaXB0aW9uOiBSZWY8T2JzZXJ2YWJsZTxGZXRjaFJlc3VsdDxUUmVzdWx0LCBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBSZWNvcmQ8c3RyaW5nLCBhbnk+Pj4gfCBudWxsPlxuICBvblJlc3VsdDogKGZuOiAocGFyYW06IEZldGNoUmVzdWx0PFRSZXN1bHQsIFJlY29yZDxzdHJpbmcsIGFueT4sIFJlY29yZDxzdHJpbmcsIGFueT4+LCBjb250ZXh0OiBPblJlc3VsdENvbnRleHQpID0+IHZvaWQpID0+IHtcbiAgICBvZmY6ICgpID0+IHZvaWRcbiAgfVxuICBvbkVycm9yOiAoZm46IChwYXJhbTogQXBvbGxvRXJyb3IsIGNvbnRleHQ6IE9uRXJyb3JDb250ZXh0KSA9PiB2b2lkKSA9PiB7XG4gICAgb2ZmOiAoKSA9PiB2b2lkXG4gIH1cbn1cblxuLyoqXG4gKiBVc2UgYSBzdWJzY3JpcHRpb24gdGhhdCBkb2VzIG5vdCByZXF1aXJlIHZhcmlhYmxlcyBvciBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlU3Vic2NyaXB0aW9uPFRSZXN1bHQgPSBhbnk+KFxuICBkb2N1bWVudDogRG9jdW1lbnRQYXJhbWV0ZXI8VFJlc3VsdCwgdW5kZWZpbmVkPlxuKTogVXNlU3Vic2NyaXB0aW9uUmV0dXJuPFRSZXN1bHQsIHVuZGVmaW5lZD5cblxuLyoqXG4gKiBVc2UgYSBzdWJzY3JpcHRpb24gdGhhdCByZXF1aXJlcyBvcHRpb25zIGJ1dCBub3QgdmFyaWFibGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlU3Vic2NyaXB0aW9uPFRSZXN1bHQgPSBhbnk+KFxuICBkb2N1bWVudDogRG9jdW1lbnRQYXJhbWV0ZXI8VFJlc3VsdCwgdW5kZWZpbmVkPixcbiAgdmFyaWFibGVzOiB1bmRlZmluZWQgfCBudWxsLFxuICBvcHRpb25zOiBPcHRpb25zUGFyYW1ldGVyPFRSZXN1bHQsIG51bGw+XG4pOiBVc2VTdWJzY3JpcHRpb25SZXR1cm48VFJlc3VsdCwgbnVsbD5cblxuLyoqXG4gKiBVc2UgYSBzdWJzY3JpcHRpb24gdGhhdCByZXF1aXJlcyB2YXJpYWJsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdWJzY3JpcHRpb248VFJlc3VsdCA9IGFueSwgVFZhcmlhYmxlcyBleHRlbmRzIE9wZXJhdGlvblZhcmlhYmxlcyA9IE9wZXJhdGlvblZhcmlhYmxlcz4oXG4gIGRvY3VtZW50OiBEb2N1bWVudFBhcmFtZXRlcjxUUmVzdWx0LCBUVmFyaWFibGVzPixcbiAgdmFyaWFibGVzOiBWYXJpYWJsZXNQYXJhbWV0ZXI8VFZhcmlhYmxlcz5cbik6IFVzZVN1YnNjcmlwdGlvblJldHVybjxUUmVzdWx0LCBUVmFyaWFibGVzPlxuXG4vKipcbiAqIFVzZSBhIHN1YnNjcmlwdGlvbiB0aGF0IGhhcyBvcHRpb25hbCB2YXJpYWJsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdWJzY3JpcHRpb248VFJlc3VsdCA9IGFueSwgVFZhcmlhYmxlcyBleHRlbmRzIE9wZXJhdGlvblZhcmlhYmxlcyA9IE9wZXJhdGlvblZhcmlhYmxlcz4oXG4gIGRvY3VtZW50OiBEb2N1bWVudFBhcmFtZXRlcjxUUmVzdWx0LCBUVmFyaWFibGVzPixcbik6IFVzZVN1YnNjcmlwdGlvblJldHVybjxUUmVzdWx0LCBUVmFyaWFibGVzPlxuXG4vKipcbiAqIFVzZSBhIHN1YnNjcmlwdGlvbiB0aGF0IHJlcXVpcmVzIHZhcmlhYmxlcyBhbmQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVN1YnNjcmlwdGlvbjxUUmVzdWx0ID0gYW55LCBUVmFyaWFibGVzIGV4dGVuZHMgT3BlcmF0aW9uVmFyaWFibGVzID0gT3BlcmF0aW9uVmFyaWFibGVzPihcbiAgZG9jdW1lbnQ6IERvY3VtZW50UGFyYW1ldGVyPFRSZXN1bHQsIFRWYXJpYWJsZXM+LFxuICB2YXJpYWJsZXM6IFZhcmlhYmxlc1BhcmFtZXRlcjxUVmFyaWFibGVzPixcbiAgb3B0aW9uczogT3B0aW9uc1BhcmFtZXRlcjxUUmVzdWx0LCBUVmFyaWFibGVzPlxuKTogVXNlU3Vic2NyaXB0aW9uUmV0dXJuPFRSZXN1bHQsIFRWYXJpYWJsZXM+XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdWJzY3JpcHRpb248XG4gIFRSZXN1bHQsXG4gIFRWYXJpYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbj4oXG4gIGRvY3VtZW50OiBEb2N1bWVudFBhcmFtZXRlcjxUUmVzdWx0LCBUVmFyaWFibGVzPixcbiAgdmFyaWFibGVzOiBWYXJpYWJsZXNQYXJhbWV0ZXI8VFZhcmlhYmxlcz4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IE9wdGlvbnNQYXJhbWV0ZXI8VFJlc3VsdCwgVFZhcmlhYmxlcz4gPSB7fSxcbik6IFVzZVN1YnNjcmlwdGlvblJldHVybjxUUmVzdWx0LCBUVmFyaWFibGVzPiB7XG4gIGNvbnN0IGN1cnJlbnRTY29wZSA9IGdldEN1cnJlbnRTY29wZSgpXG5cbiAgY29uc3QgZG9jdW1lbnRSZWYgPSBwYXJhbVRvUmVmKGRvY3VtZW50KVxuICBjb25zdCB2YXJpYWJsZXNSZWYgPSBwYXJhbVRvUmVmKHZhcmlhYmxlcylcbiAgY29uc3Qgb3B0aW9uc1JlZiA9IHBhcmFtVG9SZWFjdGl2ZShvcHRpb25zKVxuXG4gIGNvbnN0IHJlc3VsdCA9IHNoYWxsb3dSZWY8VFJlc3VsdCB8IG51bGwgfCB1bmRlZmluZWQ+KClcbiAgY29uc3QgcmVzdWx0RXZlbnQgPSB1c2VFdmVudEhvb2s8W0ZldGNoUmVzdWx0PFRSZXN1bHQ+LCBPblJlc3VsdENvbnRleHRdPigpXG4gIGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZjxBcG9sbG9FcnJvciB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGVycm9yRXZlbnQgPSB1c2VFdmVudEhvb2s8W0Fwb2xsb0Vycm9yLCBPbkVycm9yQ29udGV4dF0+KClcblxuICBjb25zdCBsb2FkaW5nID0gcmVmKGZhbHNlKVxuICBjdXJyZW50U2NvcGUgJiYgdHJhY2tTdWJzY3JpcHRpb24obG9hZGluZylcblxuICAvLyBBcG9sbG8gQ2xpZW50XG4gIGNvbnN0IHsgcmVzb2x2ZUNsaWVudCB9ID0gdXNlQXBvbGxvQ2xpZW50KClcblxuICBjb25zdCBzdWJzY3JpcHRpb246IFJlZjxPYnNlcnZhYmxlPEZldGNoUmVzdWx0PFRSZXN1bHQ+PiB8IG51bGw+ID0gcmVmKG51bGwpXG4gIGxldCBvYnNlcnZlcjogT2JzZXJ2YWJsZVN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIGxldCBzdGFydGVkID0gZmFsc2VcblxuICBmdW5jdGlvbiBnZXRDbGllbnQoKSB7XG4gICAgcmV0dXJuIHJlc29sdmVDbGllbnQoY3VycmVudE9wdGlvbnMudmFsdWU/LmNsaWVudElkKVxuICB9XG5cbiAgZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgaWYgKHN0YXJ0ZWQgfHwgIWlzRW5hYmxlZC52YWx1ZSB8fCBpc1NlcnZlcilcbiAgICAgIHJldHVyblxuICAgIHN0YXJ0ZWQgPSB0cnVlXG4gICAgbG9hZGluZy52YWx1ZSA9IHRydWVcblxuICAgIGNvbnN0IGNsaWVudCA9IGdldENsaWVudCgpXG5cbiAgICBzdWJzY3JpcHRpb24udmFsdWUgPSBjbGllbnQuc3Vic2NyaWJlPFRSZXN1bHQsIFRWYXJpYWJsZXM+KHtcbiAgICAgIHF1ZXJ5OiBjdXJyZW50RG9jdW1lbnQsXG4gICAgICB2YXJpYWJsZXM6IGN1cnJlbnRWYXJpYWJsZXMsXG4gICAgICAuLi5jdXJyZW50T3B0aW9ucy52YWx1ZSxcbiAgICB9KVxuXG4gICAgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb24udmFsdWUuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IG9uTmV4dFJlc3VsdCxcbiAgICAgIGVycm9yOiBvbkVycm9yLFxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBvbk5leHRSZXN1bHQoZmV0Y2hSZXN1bHQ6IEZldGNoUmVzdWx0PFRSZXN1bHQ+KSB7XG4gICAgcmVzdWx0LnZhbHVlID0gZmV0Y2hSZXN1bHQuZGF0YVxuICAgIGxvYWRpbmcudmFsdWUgPSBmYWxzZVxuICAgIHJlc3VsdEV2ZW50LnRyaWdnZXIoZmV0Y2hSZXN1bHQsIHtcbiAgICAgIGNsaWVudDogZ2V0Q2xpZW50KCksXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uRXJyb3IoZmV0Y2hFcnJvcjogdW5rbm93bikge1xuICAgIGNvbnN0IGFwb2xsb0Vycm9yID0gdG9BcG9sbG9FcnJvcihmZXRjaEVycm9yKVxuXG4gICAgZXJyb3IudmFsdWUgPSBhcG9sbG9FcnJvclxuICAgIGxvYWRpbmcudmFsdWUgPSBmYWxzZVxuICAgIGVycm9yRXZlbnQudHJpZ2dlcihhcG9sbG9FcnJvciwge1xuICAgICAgY2xpZW50OiBnZXRDbGllbnQoKSxcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gc3RvcCgpIHtcbiAgICBpZiAoIXN0YXJ0ZWQpXG4gICAgICByZXR1cm5cbiAgICBzdGFydGVkID0gZmFsc2VcbiAgICBsb2FkaW5nLnZhbHVlID0gZmFsc2VcblxuICAgIGlmIChzdWJzY3JpcHRpb24udmFsdWUpIHtcbiAgICAgIHN1YnNjcmlwdGlvbi52YWx1ZSA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAob2JzZXJ2ZXIpIHtcbiAgICAgIG9ic2VydmVyLnVuc3Vic2NyaWJlKClcbiAgICAgIG9ic2VydmVyID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8vIFJlc3RhcnRcbiAgbGV0IHJlc3RhcnRpbmcgPSBmYWxzZVxuICAvKipcbiAgICogUXVldWUgYSByZXN0YXJ0IG9mIHRoZSBxdWVyeSAob24gbmV4dCB0aWNrKSBpZiBpdCBpcyBhbHJlYWR5IGFjdGl2ZVxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVJlc3RhcnQoKSB7XG4gICAgaWYgKCFzdGFydGVkIHx8IHJlc3RhcnRpbmcpXG4gICAgICByZXR1cm5cbiAgICByZXN0YXJ0aW5nID0gdHJ1ZVxuICAgIG5leHRUaWNrKCgpID0+IHtcbiAgICAgIGlmIChzdGFydGVkKSB7XG4gICAgICAgIHN0b3AoKVxuICAgICAgICBzdGFydCgpXG4gICAgICB9XG4gICAgICByZXN0YXJ0aW5nID0gZmFsc2VcbiAgICB9KVxuICB9XG5cbiAgbGV0IGRlYm91bmNlZFJlc3RhcnQ6IHR5cGVvZiBiYXNlUmVzdGFydFxuICBmdW5jdGlvbiB1cGRhdGVSZXN0YXJ0Rm4oKSB7XG4gICAgaWYgKGN1cnJlbnRPcHRpb25zLnZhbHVlPy50aHJvdHRsZSkge1xuICAgICAgZGVib3VuY2VkUmVzdGFydCA9IHRocm90dGxlKGN1cnJlbnRPcHRpb25zLnZhbHVlLnRocm90dGxlLCBiYXNlUmVzdGFydClcbiAgICB9XG4gICAgZWxzZSBpZiAoY3VycmVudE9wdGlvbnMudmFsdWU/LmRlYm91bmNlKSB7XG4gICAgICBkZWJvdW5jZWRSZXN0YXJ0ID0gZGVib3VuY2UoY3VycmVudE9wdGlvbnMudmFsdWUuZGVib3VuY2UsIGJhc2VSZXN0YXJ0KVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGRlYm91bmNlZFJlc3RhcnQgPSBiYXNlUmVzdGFydFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc3RhcnQoKSB7XG4gICAgaWYgKCFkZWJvdW5jZWRSZXN0YXJ0KVxuICAgICAgdXBkYXRlUmVzdGFydEZuKClcbiAgICBkZWJvdW5jZWRSZXN0YXJ0KClcbiAgfVxuXG4gIC8vIEFwcGx5aW5nIG9wdGlvbnNcbiAgY29uc3QgY3VycmVudE9wdGlvbnMgPSByZWY8VXNlU3Vic2NyaXB0aW9uT3B0aW9uczxUUmVzdWx0LCBUVmFyaWFibGVzPj4oKVxuICB3YXRjaCgoKSA9PiBpc1JlZihvcHRpb25zUmVmKSA/IG9wdGlvbnNSZWYudmFsdWUgOiBvcHRpb25zUmVmLCAodmFsdWUpID0+IHtcbiAgICBpZiAoY3VycmVudE9wdGlvbnMudmFsdWUgJiYgKFxuICAgICAgY3VycmVudE9wdGlvbnMudmFsdWUudGhyb3R0bGUgIT09IHZhbHVlLnRocm90dGxlXG4gICAgICB8fCBjdXJyZW50T3B0aW9ucy52YWx1ZS5kZWJvdW5jZSAhPT0gdmFsdWUuZGVib3VuY2VcbiAgICApKSB7XG4gICAgICB1cGRhdGVSZXN0YXJ0Rm4oKVxuICAgIH1cbiAgICBjdXJyZW50T3B0aW9ucy52YWx1ZSA9IHZhbHVlXG4gICAgcmVzdGFydCgpXG4gIH0sIHtcbiAgICBkZWVwOiB0cnVlLFxuICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgfSlcblxuICAvLyBBcHBseWluZyBkb2N1bWVudFxuICBsZXQgY3VycmVudERvY3VtZW50OiBEb2N1bWVudE5vZGVcbiAgd2F0Y2goZG9jdW1lbnRSZWYsICh2YWx1ZSkgPT4ge1xuICAgIGN1cnJlbnREb2N1bWVudCA9IHZhbHVlXG4gICAgcmVzdGFydCgpXG4gIH0sIHtcbiAgICBpbW1lZGlhdGU6IHRydWUsXG4gIH0pXG5cbiAgLy8gQXBwbHlpbmcgdmFyaWFibGVzXG4gIGxldCBjdXJyZW50VmFyaWFibGVzOiBUVmFyaWFibGVzIHwgdW5kZWZpbmVkXG4gIGxldCBjdXJyZW50VmFyaWFibGVzU2VyaWFsaXplZDogc3RyaW5nXG4gIHdhdGNoKHZhcmlhYmxlc1JlZiwgKHZhbHVlLCBvbGRWYWx1ZSkgPT4ge1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgICBpZiAoc2VyaWFsaXplZCAhPT0gY3VycmVudFZhcmlhYmxlc1NlcmlhbGl6ZWQpIHtcbiAgICAgIGN1cnJlbnRWYXJpYWJsZXMgPSB2YWx1ZVxuICAgICAgcmVzdGFydCgpXG4gICAgfVxuICAgIGN1cnJlbnRWYXJpYWJsZXNTZXJpYWxpemVkID0gc2VyaWFsaXplZFxuICB9LCB7XG4gICAgZGVlcDogdHJ1ZSxcbiAgICBpbW1lZGlhdGU6IHRydWUsXG4gIH0pXG5cbiAgLy8gSW50ZXJuYWwgZW5hYmxlZCByZXR1cm5lZCB0byB1c2VyXG4gIC8vIEBUT0RPIERvZXNuJ3QgZnVsbHkgd29yayB5ZXQsIG5lZWQgdG8gaW5pdGlhbGl6ZSB3aXRoIG9wdGlvblxuICAvLyBjb25zdCBlbmFibGVkID0gcmVmPGJvb2xlYW4+KClcbiAgY29uc3QgZW5hYmxlZE9wdGlvbiA9IGNvbXB1dGVkKCgpID0+ICFjdXJyZW50T3B0aW9ucy52YWx1ZSB8fCBjdXJyZW50T3B0aW9ucy52YWx1ZS5lbmFibGVkID09IG51bGwgfHwgY3VycmVudE9wdGlvbnMudmFsdWUuZW5hYmxlZClcbiAgLy8gY29uc3QgaXNFbmFibGVkID0gY29tcHV0ZWQoKCkgPT4gISEoKHR5cGVvZiBlbmFibGVkLnZhbHVlID09PSAnYm9vbGVhbicgJiYgZW5hYmxlZC52YWx1ZSkgJiYgZW5hYmxlZE9wdGlvbi52YWx1ZSkpXG4gIGNvbnN0IGlzRW5hYmxlZCA9IGVuYWJsZWRPcHRpb25cblxuICAvLyB3YXRjaChlbmFibGVkLCB2YWx1ZSA9PiB7XG4gIC8vICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgLy8gICAgIGVuYWJsZWQudmFsdWUgPSBlbmFibGVkT3B0aW9uLnZhbHVlXG4gIC8vICAgfVxuICAvLyB9KVxuXG4gIC8vIEF1dG8gc3RhcnQgJiBzdG9wXG4gIHdhdGNoKGlzRW5hYmxlZCwgKHZhbHVlKSA9PiB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBzdGFydCgpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc3RvcCgpXG4gICAgfVxuICB9LCB7XG4gICAgaW1tZWRpYXRlOiB0cnVlLFxuICB9KVxuXG4gIC8vIFRlYXJkb3duXG4gIGlmIChjdXJyZW50U2NvcGUpIHtcbiAgICBvblNjb3BlRGlzcG9zZShzdG9wKVxuICB9XG4gIGVsc2Uge1xuICAgIGNvbnNvbGUud2FybignW1Z1ZSBhcG9sbG9dIHVzZVN1YnNjcmlwdGlvbigpIGlzIGNhbGxlZCBvdXRzaWRlIG9mIGFuIGFjdGl2ZSBlZmZlY3Qgc2NvcGUgYW5kIHRoZSBzdWJzY3JpcHRpb24gd2lsbCBub3QgYmUgYXV0b21hdGljYWxseSBzdG9wcGVkLicpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlc3VsdCxcbiAgICBsb2FkaW5nLFxuICAgIGVycm9yLFxuICAgIC8vIEBUT0RPIGRvZXNuJ3QgZnVsbHkgd29yayB5ZXRcbiAgICAvLyBlbmFibGVkLFxuICAgIHN0YXJ0LFxuICAgIHN0b3AsXG4gICAgcmVzdGFydCxcbiAgICBkb2N1bWVudDogZG9jdW1lbnRSZWYsXG4gICAgdmFyaWFibGVzOiB2YXJpYWJsZXNSZWYsXG4gICAgb3B0aW9uczogb3B0aW9uc1JlZixcbiAgICBzdWJzY3JpcHRpb24sXG4gICAgb25SZXN1bHQ6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Y2xpZW50IiwiaXNSZWYiLCJjb21wdXRlZCIsImdldEN1cnJlbnRTY29wZSIsIm9uU2NvcGVEaXNwb3NlIiwicmVmIiwid2F0Y2giLCJjb21wdXRlZCIsImlzUmVmIiwicmVmIiwiZ2V0Q3VycmVudFNjb3BlIiwicmVmIiwiX2EiLCJjb21wdXRlZCIsIndhdGNoIiwidmFyaWFibGVzIiwib3B0aW9ucyIsIm9wdGlvbnNSZWYiLCJpdGVtIiwib25TY29wZURpc3Bvc2UiLCJkb2N1bWVudCIsInZhcmlhYmxlcyIsIm9wdGlvbnMiLCJpc1JlZiIsImNvbXB1dGVkIiwiY29tcHV0ZWQiLCJnZXRDdXJyZW50U2NvcGUiLCJpc1JlZiIsIm5leHRUaWNrIiwib25TY29wZURpc3Bvc2UiLCJyZWYiLCJzaGFsbG93UmVmIiwiZ2V0Q3VycmVudFNjb3BlIiwicmVmIiwic2hhbGxvd1JlZiIsImlzUmVmIiwibmV4dFRpY2siLCJvblNjb3BlRGlzcG9zZSIsImNvbXB1dGVkIiwiZGVib3VuY2UiLCJ0aHJvdHRsZSIsImNvbXB1dGVkIiwiZ2V0Q3VycmVudFNjb3BlIiwiaXNSZWYiLCJuZXh0VGljayIsIm9uU2NvcGVEaXNwb3NlIiwicmVmIiwic2hhbGxvd1JlZiIsIndhdGNoIiwiZ2V0Q3VycmVudFNjb3BlIiwic2hhbGxvd1JlZiIsInJlZiIsIm5leHRUaWNrIiwidGhyb3R0bGUiLCJkZWJvdW5jZSIsIndhdGNoIiwiaXNSZWYiLCJjb21wdXRlZCIsIm9uU2NvcGVEaXNwb3NlIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyXX0=