UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

189 lines 24.1 kB
import { getTopWindow, noop, NOT_NOTIFY_ON_ERROR_HEADERS, } from '../core/public-api'; import { getInitUrl, recordInitUrl } from './app-init-url'; import { CALLBACK_API, CODE_KEY, STATE_KEY, EXTERNAL_REDIRECT_API, ID_TOKEN_KEY, LOGIN_API, LOGOUT_API, REDIRECT_URIS, } from './constants'; import { cleanStorageToken, readStorageToken, refreshStorageAliveRecord, writeStorageToken, } from './storage-token'; import { fetchTokenApi, requestTokenInfo, requestTokenRefresh, } from './token-client'; let ACCOUNT_INFO; let checkTokenPromise; let refreshTokenPromise; export function getCachedAccountInfo() { return ACCOUNT_INFO; } export async function fetchAuthorizationState() { recordInitUrl(); await getExistingToken(); const info = await resolveTokenInfoWithRefresh(); if (!info) { await logout(true); return new Promise(() => undefined); } return { info }; } export function attachAuthorizationHeader() { const idToken = readStorageToken(); return idToken ? { Authorization: `Bearer ${idToken}` } : {}; } export async function checkAuthorizationToken() { if (checkTokenPromise) { return checkTokenPromise; } checkTokenPromise = requestTokenInfo() .then(info => { ACCOUNT_INFO = info; if (!info) { throw new Error('Authorization token is invalid'); } return info; }) .finally(() => { checkTokenPromise = null; }); return checkTokenPromise; } export async function refreshAuthorizationToken() { if (refreshTokenPromise) { return refreshTokenPromise; } refreshTokenPromise = requestTokenRefresh() .then(tokenResponse => { if (!tokenResponse) { throw new Error('Failed to refresh token'); } return tokenResponse; }) .finally(() => { refreshTokenPromise = null; }); return refreshTokenPromise; } export async function logoutAudit() { return fetchTokenApi(LOGOUT_API, { headers: NOT_NOTIFY_ON_ERROR_HEADERS, }) .then(res => res?.json()) .catch(() => null); } export async function logout(returnCurrentPage = false) { cleanStorageToken(); let logoutUrl; if (typeof returnCurrentPage === 'string' && returnCurrentPage !== '') { logoutUrl = returnCurrentPage; } else { try { const { authUrl } = await getAuthConfiguration(); logoutUrl = dexLogoutUrl(authUrl, !!returnCurrentPage); } catch { logout(returnCurrentPage); } } try { getTopWindow().location.href = logoutUrl; } catch { location.href = logoutUrl; } return new Promise(noop); } export function redirectSSOEntry(entry) { const hasQuery = entry.includes('?'); if (hasQuery) { const [url, query] = entry.split('?'); return `${EXTERNAL_REDIRECT_API}?redirect_url=${url}&${query}`; } return `${EXTERNAL_REDIRECT_API}?redirect_url=${entry}`; } async function resolveTokenInfoWithRefresh() { try { const info = await requestTokenInfo(); ACCOUNT_INFO = info; if (info) { return info; } const refreshed = await requestTokenRefresh(); if (!refreshed) { ACCOUNT_INFO = null; return null; } const newInfo = await requestTokenInfo(); ACCOUNT_INFO = newInfo; return newInfo; } catch { ACCOUNT_INFO = null; return null; } } function dexLogoutUrl(authUrl, returnCurrentPage = false) { return replaceRedirectUrl(authUrl, returnCurrentPage ? location.href : location.origin + '/console-portal'); } function replaceRedirectUrl(dexUrl, redirectUrl) { const [path, queryParams] = dexUrl.split('?'); const replacedQueryParams = queryParams .split('&') .map(pair => { const [key, value] = pair.split('='); return REDIRECT_URIS.has(key) ? `${key}=${encodeURIComponent(redirectUrl)}` : `${key}=${value}`; }) .join('&'); return `${path}?${replacedQueryParams}`; } async function getAuthConfiguration() { const { auth_url: authUrl } = await fetch(LOGIN_API).then(res => res.json()); return { authUrl }; } async function getExistingToken() { const { queryParams, hashParams } = getParams(); const code = queryParams[CODE_KEY] || hashParams[CODE_KEY]; const state = queryParams[STATE_KEY] || hashParams[STATE_KEY]; const idToken = queryParams[ID_TOKEN_KEY] || hashParams[ID_TOKEN_KEY]; if (!code && !idToken) { return; } refreshStorageAliveRecord(); if (code) { await setCookieByCode(code, state); } else { await setCookieByToken(idToken); } } async function setCookieByCode(code, state) { const queryParams = new URLSearchParams({ code, state }); const tokenResponse = await fetch(`${CALLBACK_API}?${queryParams.toString()}`).then(res => res.json()); writeStorageToken(tokenResponse?.id_token); } async function setCookieByToken(idToken) { const queryParams = new URLSearchParams({ id_token: idToken }); const tokenResponse = await fetch(`${CALLBACK_API}?${queryParams.toString()}`).then(res => res.json()); writeStorageToken(tokenResponse?.id_token); } function getParams() { const initUrl = getInitUrl(); const initLocation = new URL(initUrl); const queryParams = parseParams(initLocation.search ? initLocation.search.slice(1) : ''); const hashParams = parseParams(initLocation.hash ? initLocation.hash.slice(1) : ''); return { queryParams, hashParams }; } function parseParams(query) { if (!query) { return {}; } return query.split('&').reduce((acc, param) => { if (!param) { return acc; } const separatorIndex = param.indexOf('='); const key = separatorIndex === -1 ? param : param.slice(0, separatorIndex); const value = separatorIndex === -1 ? '' : param.slice(separatorIndex + 1); if (!key) { return acc; } acc[key] = value; return acc; }, {}); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9hdXRob3JpemF0aW9uL2F1dGhvcml6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFlBQVksRUFDWixJQUFJLEVBQ0osMkJBQTJCLEdBRTVCLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLFFBQVEsRUFDUixTQUFTLEVBQ1QscUJBQXFCLEVBQ3JCLFlBQVksRUFDWixTQUFTLEVBQ1QsVUFBVSxFQUNWLGFBQWEsR0FDZCxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQix5QkFBeUIsRUFDekIsaUJBQWlCLEdBQ2xCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUNMLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsbUJBQW1CLEdBQ3BCLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEIsSUFBSSxZQUF5QixDQUFDO0FBQzlCLElBQUksaUJBQXVDLENBQUM7QUFDNUMsSUFBSSxtQkFBMkMsQ0FBQztBQUVoRCxNQUFNLFVBQVUsb0JBQW9CO0lBQ2xDLE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLHVCQUF1QjtJQUMzQyxhQUFhLEVBQUUsQ0FBQztJQUVoQixNQUFNLGdCQUFnQixFQUFFLENBQUM7SUFFekIsTUFBTSxJQUFJLEdBQUcsTUFBTSwyQkFBMkIsRUFBRSxDQUFDO0lBRWpELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLE9BQU8sSUFBSSxPQUFPLENBQVEsR0FBRyxFQUFFLENBQUMsU0FBUyxD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Q0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDM0UsTUFBTSxLQUFLLEdBQUcsY0FBYyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTNFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztRQUVELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFakIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBZSxDQUFDLENBQUM7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGdldFRvcFdpbmRvdyxcbiAgbm9vcCxcbiAgTk9UX05PVElGWV9PTl9FUlJPUl9IRUFERVJTLFxuICBTdHJpbmdNYXAsXG59IGZyb20gJy4uL2NvcmUvcHVibGljLWFwaSc7XG5cbmltcG9ydCB7IGdldEluaXRVcmwsIHJlY29yZEluaXRVcmwgfSBmcm9tICcuL2FwcC1pbml0LXVybCc7XG5pbXBvcnQge1xuICBDQUxMQkFDS19BUEksXG4gIENPREVfS0VZLFxuICBTVEFURV9LRVksXG4gIEVYVEVSTkFMX1JFRElSRUNUX0FQSSxcbiAgSURfVE9LRU5fS0VZLFxuICBMT0dJTl9BUEksXG4gIExPR09VVF9BUEksXG4gIFJFRElSRUNUX1VSSVMsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIGNsZWFuU3RvcmFnZVRva2VuLFxuICByZWFkU3RvcmFnZVRva2VuLFxuICByZWZyZXNoU3RvcmFnZUFsaXZlUmVjb3JkLFxuICB3cml0ZVN0b3JhZ2VUb2tlbixcbn0gZnJvbSAnLi9zdG9yYWdlLXRva2VuJztcbmltcG9ydCB7XG4gIGZldGNoVG9rZW5BcGksXG4gIHJlcXVlc3RUb2tlbkluZm8sXG4gIHJlcXVlc3RUb2tlblJlZnJlc2gsXG59IGZyb20gJy4vdG9rZW4tY2xpZW50JztcbmltcG9ydCB0eXBlIHsgQWNjb3VudEluZm8sIFRva2VuUmVzcG9uc2UgfSBmcm9tICcuL3Rva2VuLWNsaWVudCc7XG5cbmxldCBBQ0NPVU5UX0lORk86IEFjY291bnRJbmZvO1xubGV0IGNoZWNrVG9rZW5Qcm9taXNlOiBQcm9taXNlPEFjY291bnRJbmZvPjtcbmxldCByZWZyZXNoVG9rZW5Qcm9taXNlOiBQcm9taXNlPFRva2VuUmVzcG9uc2U+O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGVkQWNjb3VudEluZm8oKSB7XG4gIHJldHVybiBBQ0NPVU5UX0lORk87XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaEF1dGhvcml6YXRpb25TdGF0ZSgpIHtcbiAgcmVjb3JkSW5pdFVybCgpO1xuXG4gIGF3YWl0IGdldEV4aXN0aW5nVG9rZW4oKTtcblxuICBjb25zdCBpbmZvID0gYXdhaXQgcmVzb2x2ZVRva2VuSW5mb1dpdGhSZWZyZXNoKCk7XG5cbiAgaWYgKCFpbmZvKSB7XG4gICAgYXdhaXQgbG9nb3V0KHRydWUpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxuZXZlcj4oKCkgPT4gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHJldHVybiB7IGluZm8gfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaEF1dGhvcml6YXRpb25IZWFkZXIoKTogeyBBdXRob3JpemF0aW9uPzogc3RyaW5nIH0ge1xuICBjb25zdCBpZFRva2VuID0gcmVhZFN0b3JhZ2VUb2tlbigpO1xuICByZXR1cm4gaWRUb2tlbiA/IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2lkVG9rZW59YCB9IDoge307XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0F1dGhvcml6YXRpb25Ub2tlbigpOiBQcm9taXNlPEFjY291bnRJbmZvPiB7XG4gIGlmIChjaGVja1Rva2VuUHJvbWlzZSkge1xuICAgIHJldHVybiBjaGVja1Rva2VuUHJvbWlzZTtcbiAgfVxuXG4gIGNoZWNrVG9rZW5Qcm9taXNlID0gcmVxdWVzdFRva2VuSW5mbygpXG4gICAgLnRoZW4oaW5mbyA9PiB7XG4gICAgICBBQ0NPVU5UX0lORk8gPSBpbmZvO1xuXG4gICAgICBpZiAoIWluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRob3JpemF0aW9uIHRva2VuIGlzIGludmFsaWQnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfSlcbiAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICBjaGVja1Rva2VuUHJvbWlzZSA9IG51bGw7XG4gICAgfSk7XG5cbiAgcmV0dXJuIGNoZWNrVG9rZW5Qcm9taXNlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEF1dGhvcml6YXRpb25Ub2tlbigpOiBQcm9taXNlPFRva2VuUmVzcG9uc2U+IHtcbiAgaWYgKHJlZnJlc2hUb2tlblByb21pc2UpIHtcbiAgICByZXR1cm4gcmVmcmVzaFRva2VuUHJvbWlzZTtcbiAgfVxuXG4gIHJlZnJlc2hUb2tlblByb21pc2UgPSByZXF1ZXN0VG9rZW5SZWZyZXNoKClcbiAgICAudGhlbih0b2tlblJlc3BvbnNlID0+IHtcbiAgICAgIGlmICghdG9rZW5SZXNwb25zZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byByZWZyZXNoIHRva2VuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0b2tlblJlc3BvbnNlO1xuICAgIH0pXG4gICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgcmVmcmVzaFRva2VuUHJvbWlzZSA9IG51bGw7XG4gICAgfSk7XG5cbiAgcmV0dXJuIHJlZnJlc2hUb2tlblByb21pc2U7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2dvdXRBdWRpdCgpOiBQcm9taXNlPHsgbG9nb3V0X3JlZGlyZWN0X3VybD86IHN0cmluZyB9PiB7XG4gIHJldHVybiBmZXRjaFRva2VuQXBpKExPR09VVF9BUEksIHtcbiAgICBoZWFkZXJzOiBOT1RfTk9USUZZX09OX0VSUk9SX0hFQURFUlMsXG4gIH0pXG4gICAgLnRoZW4ocmVzID0+IHJlcz8uanNvbigpKVxuICAgIC5jYXRjaCgoKSA9PiBudWxsKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvZ291dChcbiAgcmV0dXJuQ3VycmVudFBhZ2U6IGJvb2xlYW4gfCBzdHJpbmcgPSBmYWxzZSxcbik6IFByb21pc2U8bmV2ZXI+IHtcbiAgY2xlYW5TdG9yYWdlVG9rZW4oKTtcblxuICBsZXQgbG9nb3V0VXJsOiBzdHJpbmc7XG5cbiAgaWYgKHR5cGVvZiByZXR1cm5DdXJyZW50UGFnZSA9PT0gJ3N0cmluZycgJiYgcmV0dXJuQ3VycmVudFBhZ2UgIT09ICcnKSB7XG4gICAgbG9nb3V0VXJsID0gcmV0dXJuQ3VycmVudFBhZ2U7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgYXV0aFVybCB9ID0gYXdhaXQgZ2V0QXV0aENvbmZpZ3VyYXRpb24oKTtcbiAgICAgIGxvZ291dFVybCA9IGRleExvZ291dFVybChhdXRoVXJsLCAhIXJldHVybkN1cnJlbnRQYWdlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGxvZ291dChyZXR1cm5DdXJyZW50UGFnZSk7XG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICBnZXRUb3BXaW5kb3coKS5sb2NhdGlvbi5ocmVmID0gbG9nb3V0VXJsO1xuICB9IGNhdGNoIHtcbiAgICBsb2NhdGlvbi5ocmVmID0gbG9nb3V0VXJsO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlPG5ldmVyPihub29wKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZGlyZWN0U1NPRW50cnkoZW50cnk6IHN0cmluZykge1xuICBjb25zdCBoYXNRdWVyeSA9IGVudHJ5LmluY2x1ZGVzKCc/Jyk7XG5cbiAgaWYgKGhhc1F1ZXJ5KSB7XG4gICAgY29uc3QgW3VybCwgcXVlcnldID0gZW50cnkuc3BsaXQoJz8nKTtcbiAgICByZXR1cm4gYCR7RVhURVJOQUxfUkVESVJFQ1RfQVBJfT9yZWRpcmVjdF91cmw9JHt1cmx9JiR7cXVlcnl9YDtcbiAgfVxuXG4gIHJldHVybiBgJHtFWFRFUk5BTF9SRURJUkVDVF9BUEl9P3JlZGlyZWN0X3VybD0ke2VudHJ5fWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVUb2tlbkluZm9XaXRoUmVmcmVzaCgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBpbmZvID0gYXdhaXQgcmVxdWVzdFRva2VuSW5mbygpO1xuICAgIEFDQ09VTlRfSU5GTyA9IGluZm87XG5cbiAgICBpZiAoaW5mbykge1xuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgY29uc3QgcmVmcmVzaGVkID0gYXdhaXQgcmVxdWVzdFRva2VuUmVmcmVzaCgpO1xuXG4gICAgaWYgKCFyZWZyZXNoZWQpIHtcbiAgICAgIEFDQ09VTlRfSU5GTyA9IG51bGw7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdJbmZvID0gYXdhaXQgcmVxdWVzdFRva2VuSW5mbygpO1xuICAgIEFDQ09VTlRfSU5GTyA9IG5ld0luZm87XG4gICAgcmV0dXJuIG5ld0luZm87XG4gIH0gY2F0Y2gge1xuICAgIEFDQ09VTlRfSU5GTyA9IG51bGw7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGV4TG9nb3V0VXJsKGF1dGhVcmw6IHN0cmluZywgcmV0dXJuQ3VycmVudFBhZ2UgPSBmYWxzZSkge1xuICByZXR1cm4gcmVwbGFjZVJlZGlyZWN0VXJsKFxuICAgIGF1dGhVcmwsXG4gICAgcmV0dXJuQ3VycmVudFBhZ2UgPyBsb2NhdGlvbi5ocmVmIDogbG9jYXRpb24ub3JpZ2luICsgJy9jb25zb2xlLXBvcnRhbCcsXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VSZWRpcmVjdFVybChkZXhVcmw6IHN0cmluZywgcmVkaXJlY3RVcmw6IHN0cmluZykge1xuICBjb25zdCBbcGF0aCwgcXVlcnlQYXJhbXNdID0gZGV4VXJsLnNwbGl0KCc/Jyk7XG5cbiAgY29uc3QgcmVwbGFjZWRRdWVyeVBhcmFtcyA9IHF1ZXJ5UGFyYW1zXG4gICAgLnNwbGl0KCcmJylcbiAgICAubWFwKHBhaXIgPT4ge1xuICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gcGFpci5zcGxpdCgnPScpO1xuICAgICAgcmV0dXJuIFJFRElSRUNUX1VSSVMuaGFzKGtleSlcbiAgICAgICAgPyBgJHtrZXl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHJlZGlyZWN0VXJsKX1gXG4gICAgICAgIDogYCR7a2V5fT0ke3ZhbHVlfWA7XG4gICAgfSlcbiAgICAuam9pbignJicpO1xuXG4gIHJldHVybiBgJHtwYXRofT8ke3JlcGxhY2VkUXVlcnlQYXJhbXN9YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXV0aENvbmZpZ3VyYXRpb24oKTogUHJvbWlzZTx7XG4gIGF1dGhVcmw6IHN0cmluZztcbn0+IHtcbiAgY29uc3QgeyBhdXRoX3VybDogYXV0aFVybCB9ID0gYXdhaXQgZmV0Y2goTE9HSU5fQVBJKS50aGVuKHJlcyA9PiByZXMuanNvbigpKTtcbiAgcmV0dXJuIHsgYXV0aFVybCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRFeGlzdGluZ1Rva2VuKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHF1ZXJ5UGFyYW1zLCBoYXNoUGFyYW1zIH0gPSBnZXRQYXJhbXMoKTtcblxuICBjb25zdCBjb2RlID0gcXVlcnlQYXJhbXNbQ09ERV9LRVldIHx8IGhhc2hQYXJhbXNbQ09ERV9LRVldO1xuICBjb25zdCBzdGF0ZSA9IHF1ZXJ5UGFyYW1zW1NUQVRFX0tFWV0gfHwgaGFzaFBhcmFtc1tTVEFURV9LRVldO1xuICBjb25zdCBpZFRva2VuID0gcXVlcnlQYXJhbXNbSURfVE9LRU5fS0VZXSB8fCBoYXNoUGFyYW1zW0lEX1RPS0VOX0tFWV07XG5cbiAgaWYgKCFjb2RlICYmICFpZFRva2VuKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmVmcmVzaFN0b3JhZ2VBbGl2ZVJlY29yZCgpO1xuXG4gIGlmIChjb2RlKSB7XG4gICAgYXdhaXQgc2V0Q29va2llQnlDb2RlKGNvZGUsIHN0YXRlKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBzZXRDb29raWVCeVRva2VuKGlkVG9rZW4pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldENvb2tpZUJ5Q29kZShjb2RlOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgY29kZSwgc3RhdGUgfSk7XG5cbiAgY29uc3QgdG9rZW5SZXNwb25zZTogVG9rZW5SZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgIGAke0NBTExCQUNLX0FQSX0/JHtxdWVyeVBhcmFtcy50b1N0cmluZygpfWAsXG4gICkudGhlbihyZXMgPT4gcmVzLmpzb24oKSk7XG5cbiAgd3JpdGVTdG9yYWdlVG9rZW4odG9rZW5SZXNwb25zZT8uaWRfdG9rZW4pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRDb29raWVCeVRva2VuKGlkVG9rZW46IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBpZF90b2tlbjogaWRUb2tlbiB9KTtcblxuICBjb25zdCB0b2tlblJlc3BvbnNlOiBUb2tlblJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgYCR7Q0FMTEJBQ0tfQVBJfT8ke3F1ZXJ5UGFyYW1zLnRvU3RyaW5nKCl9YCxcbiAgKS50aGVuKHJlcyA9PiByZXMuanNvbigpKTtcblxuICB3cml0ZVN0b3JhZ2VUb2tlbih0b2tlblJlc3BvbnNlPy5pZF90b2tlbik7XG59XG5cbmZ1bmN0aW9uIGdldFBhcmFtcygpIHtcbiAgY29uc3QgaW5pdFVybCA9IGdldEluaXRVcmwoKTtcblxuICBjb25zdCBpbml0TG9jYXRpb24gPSBuZXcgVVJMKGluaXRVcmwpO1xuXG4gIGNvbnN0IHF1ZXJ5UGFyYW1zID0gcGFyc2VQYXJhbXMoXG4gICAgaW5pdExvY2F0aW9uLnNlYXJjaCA/IGluaXRMb2NhdGlvbi5zZWFyY2guc2xpY2UoMSkgOiAnJyxcbiAgKTtcblxuICBjb25zdCBoYXNoUGFyYW1zID0gcGFyc2VQYXJhbXMoXG4gICAgaW5pdExvY2F0aW9uLmhhc2ggPyBpbml0TG9jYXRpb24uaGFzaC5zbGljZSgxKSA6ICcnLFxuICApO1xuXG4gIHJldHVybiB7IHF1ZXJ5UGFyYW1zLCBoYXNoUGFyYW1zIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlUGFyYW1zKHF1ZXJ5OiBzdHJpbmcpOiBTdHJpbmdNYXAge1xuICBpZiAoIXF1ZXJ5KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmV0dXJuIHF1ZXJ5LnNwbGl0KCcmJykucmVkdWNlKChhY2MsIHBhcmFtKSA9PiB7XG4gICAgaWYgKCFwYXJhbSkge1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9XG5cbiAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IHBhcmFtLmluZGV4T2YoJz0nKTtcbiAgICBjb25zdCBrZXkgPSBzZXBhcmF0b3JJbmRleCA9PT0gLTEgPyBwYXJhbSA6IHBhcmFtLnNsaWNlKDAsIHNlcGFyYXRvckluZGV4KTtcbiAgICBjb25zdCB2YWx1ZSA9IHNlcGFyYXRvckluZGV4ID09PSAtMSA/ICcnIDogcGFyYW0uc2xpY2Uoc2VwYXJhdG9ySW5kZXggKyAxKTtcblxuICAgIGlmICgha2V5KSB7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH1cblxuICAgIGFjY1trZXldID0gdmFsdWU7XG5cbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSBhcyBTdHJpbmdNYXApO1xufVxuIl19