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

152 lines
18 KiB
Plaintext

import Cookies from "/_nuxt/node_modules/.cache/vite/client/deps/js-cookie.js?v=e4f18c29";
import { useLogger } from "/_nuxt/composables/logging.ts";
import { useApiOrigin } from "/_nuxt/composables/env.ts";
import { useGlobalToast } from "/_nuxt/composables/globals.ts";
import { ref } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
import { ToastNotificationType } from "/_nuxt/utils/globals.ts";
export function useAccAuthManager() {
const ACC_COOKIE_KEY = "acc_tokens";
const logger = useLogger();
const apiOrigin = useApiOrigin();
const { triggerNotification } = useGlobalToast();
const loadingTokens = ref(false);
const tokens = ref();
const isExpired = ref(false);
const REFRESH_TOKEN_LIFESPAN = 15 * 24 * 60 * 60;
const tryGetTokensFromCookies = async () => {
const accTokens = Cookies.get(ACC_COOKIE_KEY);
if (accTokens) {
logger.info("Acc tokens are found in cookies");
const tokensInCookies = JSON.parse(accTokens);
const timeDiff = (Date.now() - tokensInCookies.timestamp) / 1e3;
if (timeDiff > REFRESH_TOKEN_LIFESPAN) {
logger.info("Acc refresh token in cookies is expired");
isExpired.value = true;
logOut();
} else if (timeDiff + 300 > tokensInCookies.expires_in) {
logger.info("Acc access token in cookies need refreshing");
const refreshedTokens = await refreshTokens(tokensInCookies);
tokens.value = refreshedTokens;
await saveTokensToCookies();
if (tokens.value) scheduleRefresh(tokens.value);
} else {
logger.info("Acc tokens in cookies still valid");
tokens.value = tokensInCookies;
const remainingTime = tokensInCookies.expires_in - timeDiff;
scheduleRefresh(tokens.value, remainingTime);
}
}
loadingTokens.value = false;
};
const logOut = () => {
tokens.value = void 0;
Cookies.remove(ACC_COOKIE_KEY);
};
const refreshTokens = async (tokensToRefresh) => {
try {
loadingTokens.value = true;
const res = await fetch(`${apiOrigin}/api/v1/acc/auth/refresh`, {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(tokensToRefresh)
});
if (res.ok) {
const refreshedTokens = await res.json();
tokens.value = { ...refreshedTokens, timestamp: Date.now() };
return refreshedTokens;
}
} catch (error) {
triggerNotification({
type: ToastNotificationType.Danger,
title: "Error on refreshing ACC credientials",
description: error instanceof Error ? error.message : "Unexpected error"
});
} finally {
loadingTokens.value = false;
}
};
const saveTokensToCookies = async () => {
const tokensWithTimestamp = { ...tokens.value, timestamp: Date.now() };
Cookies.set("acc_tokens", JSON.stringify(tokensWithTimestamp), {
expires: 30,
// since acc refresh token lifespan 15 days, it is a safe expiration
secure: true,
sameSite: "Strict"
});
isExpired.value = false;
};
const fetchTokens = async () => {
try {
loadingTokens.value = true;
const res = await fetch(`${apiOrigin}/api/v1/acc/auth/status`, {
credentials: "include"
});
if (!res.ok) return;
tokens.value = await res.json();
if (tokens.value?.expires_in) {
scheduleRefresh(tokens.value);
}
await saveTokensToCookies();
} finally {
loadingTokens.value = false;
}
};
const authAcc = async (callbackEndpoint) => {
try {
const response = await fetch(`${apiOrigin}/api/v1/acc/auth/login`, {
method: "POST",
credentials: "include",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ callbackEndpoint })
});
if (!response.ok) throw new Error("Failed to initiate ACC login.");
const { authorizeUrl } = await response.json();
if (!authorizeUrl) throw new Error("No authorize URL returned by server.");
window.location.href = authorizeUrl;
} catch (error) {
triggerNotification({
type: ToastNotificationType.Danger,
title: "Error starting ACC login",
description: error instanceof Error ? error.message : "Unexpected error"
});
}
};
const scheduleRefresh = (tokensToScheduleRefresh, resfreshInSeconds) => {
const refreshTimeInMs = (resfreshInSeconds ?? tokensToScheduleRefresh.expires_in) * 1e3;
setTimeout(async () => {
loadingTokens.value = true;
const res = await fetch(`${apiOrigin}/api/v1/acc/auth/refresh`, {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(tokensToScheduleRefresh)
});
if (res.ok) {
const refreshed = await res.json();
tokens.value = refreshed;
await saveTokensToCookies();
scheduleRefresh(refreshed, refreshed.expires_in);
}
loadingTokens.value = false;
}, refreshTimeInMs);
};
return {
isExpired,
tokens,
loadingTokens,
authAcc,
logOut,
fetchTokens,
refreshTokens,
tryGetTokensFromCookies,
saveTokensToCookies
};
}
//# sourceMappingURL=data:application/json;base64,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OUMsQ0FBQztBQUNELFVBQUksSUFBSSxJQUFJO0FBQ1YsY0FBTSxZQUFZLE1BQU0sSUFBSSxLQUFLO0FBQ2pDLGVBQU8sUUFBUTtBQUtmLGNBQU0sb0JBQW9CO0FBQzFCLHdCQUFnQixXQUFXLFVBQVUsVUFBVTtBQUFBLE1BQ2pEO0FBQ0Esb0JBQWMsUUFBUTtBQUFBLElBQ3hCLEdBQUcsZUFBZTtBQUFBLEVBQ3BCO0FBRUEsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDRiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsidXNlQWNjQXV0aE1hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBY2NUb2tlbnMgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQvYWNjJ1xyXG5pbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnXHJcblxyXG4vKipcclxuICogTWFuYWdlcyBhdXRoZW50aWNhdGlvbiBsb2dpYyBvZiBBQ0MuXHJcbiAqIFdlIHN0b3JlIHRva2VucyBhbmQgaXRzIHRpbWVzdGFtcCBpbiB1bmRlciBgYWNjX3Rva2Vuc2AgY29va2llLlxyXG4gKiBEZXRlY3Rpb24gb2YgXCJSZWZyZXNoIG5lZWRlZFwiIGhhcHBlbnMgd2l0aCB0aW1lc3RhbXAgY2hlY2suXHJcbiAqIEFDQyBhdXRoIGxvZ2ljIHJldHVybnMgb25seSBleHBpcmVzIGluIHNlY29uZHMgYW5kIHdlIG5lZWQgdG8gY29ycmVsYXRlIGl0IHdpdGggdGltZXN0YW1wIHRvIHN1YnN0cmFjdCBsYXRlciB0byB1bmRlcnN0YW5kIHJlZnJlc2ggbmVlZGVkIG9yIG5vdC5cclxuICogVG9rZW4gbGlmZXNwYW5zOlxyXG4gKiAtIEJlYXJlciB0b2tlbjogNjAgbWludXRlc1xyXG4gKiAtIFJlZnJlc2ggdG9rZW46IDE1IGRheXNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VBY2NBdXRoTWFuYWdlcigpIHtcclxuICBjb25zdCBBQ0NfQ09PS0lFX0tFWSA9ICdhY2NfdG9rZW5zJ1xyXG4gIGNvbnN0IGxvZ2dlciA9IHVzZUxvZ2dlcigpXHJcbiAgY29uc3QgYXBpT3JpZ2luID0gdXNlQXBpT3JpZ2luKClcclxuICBjb25zdCB7IHRyaWdnZXJOb3RpZmljYXRpb24gfSA9IHVzZUdsb2JhbFRvYXN0KClcclxuICBjb25zdCBsb2FkaW5nVG9rZW5zID0gcmVmKGZhbHNlKVxyXG4gIGNvbnN0IHRva2VucyA9IHJlZjxBY2NUb2tlbnM+KClcclxuICBjb25zdCBpc0V4cGlyZWQgPSByZWYoZmFsc2UpXHJcbiAgY29uc3QgUkVGUkVTSF9UT0tFTl9MSUZFU1BBTiA9IDE1ICogMjQgKiA2MCAqIDYwIC8vIGluIHNlY29uZHNcclxuXHJcbiAgLyoqXHJcbiAgICogTWFpbiBsb2dpYyB0byB1bmRlcnN0YW5kIGV4aXN0aW5nIHRva2VuIGluIGNvb2tpZXMgaXMgZXhwaXJlZCBvciBub3QuXHJcbiAgICogSWYgcmVmcmVzaCBuZWVkZWQsIHdlIHJlZnJlc2ggYW5kIHNjaGVkdWxlXHJcbiAgICogT3RoZXJ3aXNlLCB3ZSBjYWxjdWxhdGUgdGhlIHRpbWUgZGlmZiBhbmQgc2NoZWR1bGUgcmVmcmVzaCBhY2NvcmRpbmdseVxyXG4gICAqL1xyXG4gIGNvbnN0IHRyeUdldFRva2Vuc0Zyb21Db29raWVzID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgY29uc3QgYWNjVG9rZW5zID0gQ29va2llcy5nZXQoQUNDX0NPT0tJRV9LRVkpXHJcbiAgICBpZiAoYWNjVG9rZW5zKSB7XHJcbiAgICAgIGxvZ2dlci5pbmZvKCdBY2MgdG9rZW5zIGFyZSBmb3VuZCBpbiBjb29raWVzJylcclxuICAgICAgY29uc3QgdG9rZW5zSW5Db29raWVzID0gSlNPTi5wYXJzZShhY2NUb2tlbnMpIGFzIEFjY1Rva2Vuc1xyXG4gICAgICBjb25zdCB0aW1lRGlmZiA9IChEYXRlLm5vdygpIC0gdG9rZW5zSW5Db29raWVzLnRpbWVzdGFtcCkgLyAxMDAwIC8vIGluIHNlY29uZHNcclxuXHJcbiAgICAgIGlmICh0aW1lRGlmZiA+IFJFRlJFU0hfVE9LRU5fTElGRVNQQU4pIHtcclxuICAgICAgICBsb2dnZXIuaW5mbygnQWNjIHJlZnJlc2ggdG9rZW4gaW4gY29va2llcyBpcyBleHBpcmVkJylcclxuICAgICAgICBpc0V4cGlyZWQudmFsdWUgPSB0cnVlXHJcbiAgICAgICAgbG9nT3V0KClcclxuICAgICAgfSBlbHNlIGlmICh0aW1lRGlmZiArIDMwMCA+IHRva2Vuc0luQ29va2llcy5leHBpcmVzX2luKSB7XHJcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0FjYyBhY2Nlc3MgdG9rZW4gaW4gY29va2llcyBuZWVkIHJlZnJlc2hpbmcnKVxyXG4gICAgICAgIC8vIDMwMHMgKDZtaW4pIGlzIGFyYml0cmFyeSBndWFyZFxyXG4gICAgICAgIGNvbnN0IHJlZnJlc2hlZFRva2VucyA9IGF3YWl0IHJlZnJlc2hUb2tlbnModG9rZW5zSW5Db29raWVzKVxyXG4gICAgICAgIHRva2Vucy52YWx1ZSA9IHJlZnJlc2hlZFRva2Vuc1xyXG4gICAgICAgIGF3YWl0IHNhdmVUb2tlbnNUb0Nvb2tpZXMoKVxyXG4gICAgICAgIGlmICh0b2tlbnMudmFsdWUpIHNjaGVkdWxlUmVmcmVzaCh0b2tlbnMudmFsdWUpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0FjYyB0b2tlbnMgaW4gY29va2llcyBzdGlsbCB2YWxpZCcpXHJcbiAgICAgICAgdG9rZW5zLnZhbHVlID0gdG9rZW5zSW5Db29raWVzXHJcbiAgICAgICAgY29uc3QgcmVtYWluaW5nVGltZSA9IHRva2Vuc0luQ29va2llcy5leHBpcmVzX2luIC0gdGltZURpZmZcclxuICAgICAgICBzY2hlZHVsZVJlZnJlc2godG9rZW5zLnZhbHVlLCByZW1haW5pbmdUaW1lKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsb2FkaW5nVG9rZW5zLnZhbHVlID0gZmFsc2VcclxuICB9XHJcblxyXG4gIGNvbnN0IGxvZ091dCA9ICgpID0+IHtcclxuICAgIHRva2Vucy52YWx1ZSA9IHVuZGVmaW5lZFxyXG4gICAgQ29va2llcy5yZW1vdmUoQUNDX0NPT0tJRV9LRVkpXHJcbiAgfVxyXG5cclxuICBjb25zdCByZWZyZXNoVG9rZW5zID0gYXN5bmMgKHRva2Vuc1RvUmVmcmVzaDogQWNjVG9rZW5zKSA9PiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBsb2FkaW5nVG9rZW5zLnZhbHVlID0gdHJ1ZVxyXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHthcGlPcmlnaW59L2FwaS92MS9hY2MvYXV0aC9yZWZyZXNoYCwge1xyXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkodG9rZW5zVG9SZWZyZXNoKVxyXG4gICAgICB9KVxyXG4gICAgICBpZiAocmVzLm9rKSB7XHJcbiAgICAgICAgY29uc3QgcmVmcmVzaGVkVG9rZW5zID0gYXdhaXQgcmVzLmpzb24oKVxyXG4gICAgICAgIHRva2Vucy52YWx1ZSA9IHsgLi4ucmVmcmVzaGVkVG9rZW5zLCB0aW1lc3RhbXA6IERhdGUubm93KCkgfVxyXG4gICAgICAgIHJldHVybiByZWZyZXNoZWRUb2tlbnNcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdHJpZ2dlck5vdGlmaWNhdGlvbih7XHJcbiAgICAgICAgdHlwZTogVG9hc3ROb3RpZmljYXRpb25UeXBlLkRhbmdlcixcclxuICAgICAgICB0aXRsZTogJ0Vycm9yIG9uIHJlZnJlc2hpbmcgQUNDIGNyZWRpZW50aWFscycsXHJcbiAgICAgICAgZGVzY3JpcHRpb246IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1VuZXhwZWN0ZWQgZXJyb3InXHJcbiAgICAgIH0pXHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICBsb2FkaW5nVG9rZW5zLnZhbHVlID0gZmFsc2VcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHNhdmVUb2tlbnNUb0Nvb2tpZXMgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBjb25zdCB0b2tlbnNXaXRoVGltZXN0YW1wID0geyAuLi50b2tlbnMudmFsdWUsIHRpbWVzdGFtcDogRGF0ZS5ub3coKSB9XHJcbiAgICBDb29raWVzLnNldCgnYWNjX3Rva2VucycsIEpTT04uc3RyaW5naWZ5KHRva2Vuc1dpdGhUaW1lc3RhbXApLCB7XHJcbiAgICAgIGV4cGlyZXM6IDMwLCAvLyBzaW5jZSBhY2MgcmVmcmVzaCB0b2tlbiBsaWZlc3BhbiAxNSBkYXlzLCBpdCBpcyBhIHNhZmUgZXhwaXJhdGlvblxyXG4gICAgICBzZWN1cmU6IHRydWUsXHJcbiAgICAgIHNhbWVTaXRlOiAnU3RyaWN0J1xyXG4gICAgfSlcclxuICAgIGlzRXhwaXJlZC52YWx1ZSA9IGZhbHNlXHJcbiAgfVxyXG5cclxuICBjb25zdCBmZXRjaFRva2VucyA9IGFzeW5jICgpID0+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGxvYWRpbmdUb2tlbnMudmFsdWUgPSB0cnVlXHJcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke2FwaU9yaWdpbn0vYXBpL3YxL2FjYy9hdXRoL3N0YXR1c2AsIHtcclxuICAgICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnXHJcbiAgICAgIH0pXHJcbiAgICAgIGlmICghcmVzLm9rKSByZXR1cm5cclxuICAgICAgdG9rZW5zLnZhbHVlID0gYXdhaXQgcmVzLmpzb24oKVxyXG4gICAgICBpZiAodG9rZW5zLnZhbHVlPy5leHBpcmVzX2luKSB7XHJcbiAgICAgICAgc2NoZWR1bGVSZWZyZXNoKHRva2Vucy52YWx1ZSlcclxuICAgICAgfVxyXG4gICAgICBhd2FpdCBzYXZlVG9rZW5zVG9Db29raWVzKClcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGxvYWRpbmdUb2tlbnMudmFsdWUgPSBmYWxzZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgYXV0aEFjYyA9IGFzeW5jIChjYWxsYmFja0VuZHBvaW50OiBzdHJpbmcpID0+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YXBpT3JpZ2lufS9hcGkvdjEvYWNjL2F1dGgvbG9naW5gLCB7XHJcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyxcclxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcclxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNhbGxiYWNrRW5kcG9pbnQgfSlcclxuICAgICAgfSlcclxuICAgICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gaW5pdGlhdGUgQUNDIGxvZ2luLicpXHJcbiAgICAgIGNvbnN0IHsgYXV0aG9yaXplVXJsIH0gPSBhd2FpdCByZXNwb25zZS5qc29uKClcclxuICAgICAgaWYgKCFhdXRob3JpemVVcmwpIHRocm93IG5ldyBFcnJvcignTm8gYXV0aG9yaXplIFVSTCByZXR1cm5lZCBieSBzZXJ2ZXIuJylcclxuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBhdXRob3JpemVVcmxcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRyaWdnZXJOb3RpZmljYXRpb24oe1xyXG4gICAgICAgIHR5cGU6IFRvYXN0Tm90aWZpY2F0aW9uVHlwZS5EYW5nZXIsXHJcbiAgICAgICAgdGl0bGU6ICdFcnJvciBzdGFydGluZyBBQ0MgbG9naW4nLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmV4cGVjdGVkIGVycm9yJ1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3Qgc2NoZWR1bGVSZWZyZXNoID0gKFxyXG4gICAgdG9rZW5zVG9TY2hlZHVsZVJlZnJlc2g6IEFjY1Rva2VucyxcclxuICAgIHJlc2ZyZXNoSW5TZWNvbmRzPzogbnVtYmVyXHJcbiAgKSA9PiB7XHJcbiAgICBjb25zdCByZWZyZXNoVGltZUluTXMgPVxyXG4gICAgICAocmVzZnJlc2hJblNlY29uZHMgPz8gdG9rZW5zVG9TY2hlZHVsZVJlZnJlc2guZXhwaXJlc19pbikgKiAxMDAwXHJcbiAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcclxuICAgICAgbG9hZGluZ1Rva2Vucy52YWx1ZSA9IHRydWVcclxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7YXBpT3JpZ2lufS9hcGkvdjEvYWNjL2F1dGgvcmVmcmVzaGAsIHtcclxuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnLFxyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcclxuICAgICAgICB9LFxyXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHRva2Vuc1RvU2NoZWR1bGVSZWZyZXNoKVxyXG4gICAgICB9KVxyXG4gICAgICBpZiAocmVzLm9rKSB7XHJcbiAgICAgICAgY29uc3QgcmVmcmVzaGVkID0gYXdhaXQgcmVzLmpzb24oKVxyXG4gICAgICAgIHRva2Vucy52YWx1ZSA9IHJlZnJlc2hlZFxyXG4gICAgICAgIC8vIHRyaWdnZXJOb3RpZmljYXRpb24oe1xyXG4gICAgICAgIC8vICAgdHlwZTogVG9hc3ROb3RpZmljYXRpb25UeXBlLlN1Y2Nlc3MsXHJcbiAgICAgICAgLy8gICB0aXRsZTogJ0FDQyB0b2tlbnMgcmVmcmVzaGVkJ1xyXG4gICAgICAgIC8vIH0pXHJcbiAgICAgICAgYXdhaXQgc2F2ZVRva2Vuc1RvQ29va2llcygpXHJcbiAgICAgICAgc2NoZWR1bGVSZWZyZXNoKHJlZnJlc2hlZCwgcmVmcmVzaGVkLmV4cGlyZXNfaW4pXHJcbiAgICAgIH1cclxuICAgICAgbG9hZGluZ1Rva2Vucy52YWx1ZSA9IGZhbHNlXHJcbiAgICB9LCByZWZyZXNoVGltZUluTXMpXHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgaXNFeHBpcmVkLFxyXG4gICAgdG9rZW5zLFxyXG4gICAgbG9hZGluZ1Rva2VucyxcclxuICAgIGF1dGhBY2MsXHJcbiAgICBsb2dPdXQsXHJcbiAgICBmZXRjaFRva2VucyxcclxuICAgIHJlZnJlc2hUb2tlbnMsXHJcbiAgICB0cnlHZXRUb2tlbnNGcm9tQ29va2llcyxcclxuICAgIHNhdmVUb2tlbnNUb0Nvb2tpZXNcclxuICB9XHJcbn1cclxuIl0sImZpbGUiOiJEOi9zcGVja2xlLXNlcnZlci9wYWNrYWdlcy9mcm9udGVuZC0yL2xpYi9hY2MvY29tcG9zYWJsZXMvdXNlQWNjQXV0aE1hbmFnZXIudHMifQ==