ng2-idle-timeout
Version:
Zoneless-friendly session timeout management for Angular 16-20.
92 lines • 14.6 kB
JavaScript
import { DEFAULT_SESSION_TIMEOUT_CONFIG } from './defaults';
import { DOM_ACTIVITY_EVENT_NAMES } from './models/session-timeout-config';
const DOM_ACTIVITY_EVENT_SET = new Set(DOM_ACTIVITY_EVENT_NAMES);
export function validateConfig(partial) {
const issues = [];
const { config, invalidDomActivityEvents } = normalizeConfig(partial);
if (config.idleGraceMs <= 0) {
issues.push(createIssue('idleGraceMs', 'Value must be greater than 0'));
}
if (config.countdownMs <= 0) {
issues.push(createIssue('countdownMs', 'Value must be greater than 0'));
}
if (config.warnBeforeMs < 0 || config.warnBeforeMs > config.countdownMs) {
issues.push(createIssue('warnBeforeMs', 'Value must be between 0 and countdownMs inclusive'));
}
if (config.pollingMs <= 0) {
issues.push(createIssue('pollingMs', 'Value must be greater than 0'));
}
if (config.activityResetCooldownMs < 0) {
issues.push(createIssue('activityResetCooldownMs', 'Value must be >= 0'));
}
if (!config.storageKeyPrefix.trim()) {
issues.push(createIssue('storageKeyPrefix', 'Prefix cannot be empty'));
}
if (config.maxExtendPerSession < 0) {
issues.push(createIssue('maxExtendPerSession', 'Value must be >= 0'));
}
if (config.timeSource === 'server' && !config.serverTimeEndpoint) {
issues.push(createIssue('serverTimeEndpoint', 'Required when timeSource is server'));
}
if (typeof config.onExpire === 'string' &&
config.onExpire.startsWith('navigate:') &&
config.onExpire.split(':').length < 2) {
issues.push(createIssue('onExpire', 'navigate: form requires target path'));
}
for (const [key, value] of Object.entries(config.actionDelays)) {
if (value < 0) {
issues.push(createIssue(`actionDelays.${key}`, 'Value must be >= 0'));
}
}
if (invalidDomActivityEvents.length > 0) {
issues.push(createIssue('domActivityEvents', `Unsupported DOM events: ${invalidDomActivityEvents.join(', ')}`));
}
return { issues, config };
}
function normalizeConfig(partial) {
const base = {
...DEFAULT_SESSION_TIMEOUT_CONFIG,
domActivityEvents: [...DEFAULT_SESSION_TIMEOUT_CONFIG.domActivityEvents]
};
const { httpActivity, actionDelays, domActivityEvents, ...shallow } = partial ?? {};
const merged = {
...base,
...shallow,
httpActivity: {
...base.httpActivity,
...(httpActivity ?? {})
},
actionDelays: {
...base.actionDelays,
...(actionDelays ?? {})
},
domActivityEvents: base.domActivityEvents
};
const invalidDomActivityEvents = [];
if (Array.isArray(domActivityEvents)) {
const deduped = [];
const seen = new Set();
for (const raw of domActivityEvents) {
const candidate = String(raw);
if (!DOM_ACTIVITY_EVENT_SET.has(candidate)) {
invalidDomActivityEvents.push(candidate);
continue;
}
if (!seen.has(candidate)) {
seen.add(candidate);
deduped.push(candidate);
}
}
merged.domActivityEvents = deduped;
}
else {
merged.domActivityEvents = [...base.domActivityEvents];
}
merged.httpActivity.allowlist = [...(merged.httpActivity.allowlist ?? [])];
merged.httpActivity.denylist = [...(merged.httpActivity.denylist ?? [])];
return { config: merged, invalidDomActivityEvents };
}
function createIssue(field, message) {
return { field, message };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdmFsaWRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUQsT0FBTyxFQUNMLHdCQUF3QixFQUl6QixNQUFNLGlDQUFpQyxDQUFDO0FBWXpDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxHQUFHLENBQVMsd0JBQXdCLENBQUMsQ0FBQztBQUV6RSxNQUFNLFVBQVUsY0FBYyxDQUFDLE9BQWdEO0lBQzdFLE1BQU0sTUFBTSxHQUFzQixFQUFFLENBQUM7SUFDckMsTUFBTSxFQUFFLE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUV0RSxJQUFJLE1BQU0sQ0FBQyxXQUFXLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLDhCQUE4QixDQUFDLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsV0FBVyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLFlBQVksR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDeEUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLG1EQUFtRCxDQUFDLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsU0FBUyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLHVCQUF1QixHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLHlCQUF5QixFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLHdCQUF3QixDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMscUJBQXFCLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDakUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLEVBQUUsb0NBQW9DLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFDRCxJQUNFLE9BQU8sTUFBTSxDQUFDLFFBQVEsS0FBSyxRQUFRO1FBQ25DLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztRQUN2QyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUNyQyxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLHFDQUFxQyxDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDL0QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDZCxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSx3QkFBd0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDeEMsTUFBTSxDQUFDLElBQUksQ0FDVCxXQUFXLENBQ1QsbUJBQW1CLEVBQ25CLDJCQUEyQix3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDakUsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDNUIsQ0FBQztBQU9ELFNBQVMsZUFBZSxDQUFDLE9BQWdEO0lBQ3ZFLE1BQU0sSUFBSSxHQUF5QjtRQUNqQyxHQUFHLDhCQUE4QjtRQUNqQyxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsOEJBQThCLENBQUMsaUJBQWlCLENBQUM7S0FDekUsQ0FBQztJQUNGLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLEdBQUcsT0FBTyxFQUFFLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUVwRixNQUFNLE1BQU0sR0FBeUI7UUFDbkMsR0FBRyxJQUFJO1FBQ1AsR0FBRyxPQUFPO1FBQ1YsWUFBWSxFQUFFO1lBQ1osR0FBRyxJQUFJLENBQUMsWUFBWTtZQUNwQixHQUFHLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztTQUN4QjtRQUNELFlBQVksRUFBRTtZQUNaLEdBQUcsSUFBSSxDQUFDLFlBQVk7WUFDcEIsR0FBRyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7U0FDeEI7UUFDRCxpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCO0tBQzFDLENBQUM7SUFFRixNQUFNLHdCQUF3QixHQUFhLEVBQUUsQ0FBQztJQUU5QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sT0FBTyxHQUEyQixFQUFFLENBQUM7UUFDM0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUMvQixLQUFLLE1BQU0sR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDcEMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDM0Msd0JBQXdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN6QyxTQUFTO1lBQ1gsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3BCLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBaUMsQ0FBQyxDQUFDO1lBQ2xELENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQztJQUNyQyxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0UsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUV6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxDQUFDO0FBQ3RELENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFhLEVBQUUsT0FBZTtJQUNqRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBERUZBVUxUX1NFU1NJT05fVElNRU9VVF9DT05GSUcgfSBmcm9tICcuL2RlZmF1bHRzJztcclxuaW1wb3J0IHtcclxuICBET01fQUNUSVZJVFlfRVZFTlRfTkFNRVMsXHJcbiAgdHlwZSBEb21BY3Rpdml0eUV2ZW50TmFtZSxcclxuICB0eXBlIFNlc3Npb25UaW1lb3V0Q29uZmlnLFxyXG4gIHR5cGUgU2Vzc2lvblRpbWVvdXRQYXJ0aWFsQ29uZmlnXHJcbn0gZnJvbSAnLi9tb2RlbHMvc2Vzc2lvbi10aW1lb3V0LWNvbmZpZyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25Jc3N1ZSB7XHJcbiAgZmllbGQ6IHN0cmluZztcclxuICBtZXNzYWdlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblJlc3VsdCB7XHJcbiAgaXNzdWVzOiBWYWxpZGF0aW9uSXNzdWVbXTtcclxuICBjb25maWc6IFNlc3Npb25UaW1lb3V0Q29uZmlnO1xyXG59XHJcblxyXG5jb25zdCBET01fQUNUSVZJVFlfRVZFTlRfU0VUID0gbmV3IFNldDxzdHJpbmc+KERPTV9BQ1RJVklUWV9FVkVOVF9OQU1FUyk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVDb25maWcocGFydGlhbDogU2Vzc2lvblRpbWVvdXRQYXJ0aWFsQ29uZmlnIHwgdW5kZWZpbmVkKTogVmFsaWRhdGlvblJlc3VsdCB7XHJcbiAgY29uc3QgaXNzdWVzOiBWYWxpZGF0aW9uSXNzdWVbXSA9IFtdO1xyXG4gIGNvbnN0IHsgY29uZmlnLCBpbnZhbGlkRG9tQWN0aXZpdHlFdmVudHMgfSA9IG5vcm1hbGl6ZUNvbmZpZyhwYXJ0aWFsKTtcclxuXHJcbiAgaWYgKGNvbmZpZy5pZGxlR3JhY2VNcyA8PSAwKSB7XHJcbiAgICBpc3N1ZXMucHVzaChjcmVhdGVJc3N1ZSgnaWRsZUdyYWNlTXMnLCAnVmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpKTtcclxuICB9XHJcbiAgaWYgKGNvbmZpZy5jb3VudGRvd25NcyA8PSAwKSB7XHJcbiAgICBpc3N1ZXMucHVzaChjcmVhdGVJc3N1ZSgnY291bnRkb3duTXMnLCAnVmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpKTtcclxuICB9XHJcbiAgaWYgKGNvbmZpZy53YXJuQmVmb3JlTXMgPCAwIHx8IGNvbmZpZy53YXJuQmVmb3JlTXMgPiBjb25maWcuY291bnRkb3duTXMpIHtcclxuICAgIGlzc3Vlcy5wdXNoKGNyZWF0ZUlzc3VlKCd3YXJuQmVmb3JlTXMnLCAnVmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIGNvdW50ZG93bk1zIGluY2x1c2l2ZScpKTtcclxuICB9XHJcbiAgaWYgKGNvbmZpZy5wb2xsaW5nTXMgPD0gMCkge1xyXG4gICAgaXNzdWVzLnB1c2goY3JlYXRlSXNzdWUoJ3BvbGxpbmdNcycsICdWYWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwJykpO1xyXG4gIH1cclxuICBpZiAoY29uZmlnLmFjdGl2aXR5UmVzZXRDb29sZG93bk1zIDwgMCkge1xyXG4gICAgaXNzdWVzLnB1c2goY3JlYXRlSXNzdWUoJ2FjdGl2aXR5UmVzZXRDb29sZG93bk1zJywgJ1ZhbHVlIG11c3QgYmUgPj0gMCcpKTtcclxuICB9XHJcbiAgaWYgKCFjb25maWcuc3RvcmFnZUtleVByZWZpeC50cmltKCkpIHtcclxuICAgIGlzc3Vlcy5wdXNoKGNyZWF0ZUlzc3VlKCdzdG9yYWdlS2V5UHJlZml4JywgJ1ByZWZpeCBjYW5ub3QgYmUgZW1wdHknKSk7XHJcbiAgfVxyXG4gIGlmIChjb25maWcubWF4RXh0ZW5kUGVyU2Vzc2lvbiA8IDApIHtcclxuICAgIGlzc3Vlcy5wdXNoKGNyZWF0ZUlzc3VlKCdtYXhFeHRlbmRQZXJTZXNzaW9uJywgJ1ZhbHVlIG11c3QgYmUgPj0gMCcpKTtcclxuICB9XHJcbiAgaWYgKGNvbmZpZy50aW1lU291cmNlID09PSAnc2VydmVyJyAmJiAhY29uZmlnLnNlcnZlclRpbWVFbmRwb2ludCkge1xyXG4gICAgaXNzdWVzLnB1c2goY3JlYXRlSXNzdWUoJ3NlcnZlclRpbWVFbmRwb2ludCcsICdSZXF1aXJlZCB3aGVuIHRpbWVTb3VyY2UgaXMgc2VydmVyJykpO1xyXG4gIH1cclxuICBpZiAoXHJcbiAgICB0eXBlb2YgY29uZmlnLm9uRXhwaXJlID09PSAnc3RyaW5nJyAmJlxyXG4gICAgY29uZmlnLm9uRXhwaXJlLnN0YXJ0c1dpdGgoJ25hdmlnYXRlOicpICYmXHJcbiAgICBjb25maWcub25FeHBpcmUuc3BsaXQoJzonKS5sZW5ndGggPCAyXHJcbiAgKSB7XHJcbiAgICBpc3N1ZXMucHVzaChjcmVhdGVJc3N1ZSgnb25FeHBpcmUnLCAnbmF2aWdhdGU6IGZvcm0gcmVxdWlyZXMgdGFyZ2V0IHBhdGgnKSk7XHJcbiAgfVxyXG5cclxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcuYWN0aW9uRGVsYXlzKSkge1xyXG4gICAgaWYgKHZhbHVlIDwgMCkge1xyXG4gICAgICBpc3N1ZXMucHVzaChjcmVhdGVJc3N1ZShgYWN0aW9uRGVsYXlzLiR7a2V5fWAsICdWYWx1ZSBtdXN0IGJlID49IDAnKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpZiAoaW52YWxpZERvbUFjdGl2aXR5RXZlbnRzLmxlbmd0aCA+IDApIHtcclxuICAgIGlzc3Vlcy5wdXNoKFxyXG4gICAgICBjcmVhdGVJc3N1ZShcclxuICAgICAgICAnZG9tQWN0aXZpdHlFdmVudHMnLFxyXG4gICAgICAgIGBVbnN1cHBvcnRlZCBET00gZXZlbnRzOiAke2ludmFsaWREb21BY3Rpdml0eUV2ZW50cy5qb2luKCcsICcpfWBcclxuICAgICAgKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHJldHVybiB7IGlzc3VlcywgY29uZmlnIH07XHJcbn1cclxuXHJcbmludGVyZmFjZSBOb3JtYWxpemVkQ29uZmlnUmVzdWx0IHtcclxuICBjb25maWc6IFNlc3Npb25UaW1lb3V0Q29uZmlnO1xyXG4gIGludmFsaWREb21BY3Rpdml0eUV2ZW50czogc3RyaW5nW107XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbmZpZyhwYXJ0aWFsOiBTZXNzaW9uVGltZW91dFBhcnRpYWxDb25maWcgfCB1bmRlZmluZWQpOiBOb3JtYWxpemVkQ29uZmlnUmVzdWx0IHtcclxuICBjb25zdCBiYXNlOiBTZXNzaW9uVGltZW91dENvbmZpZyA9IHtcclxuICAgIC4uLkRFRkFVTFRfU0VTU0lPTl9USU1FT1VUX0NPTkZJRyxcclxuICAgIGRvbUFjdGl2aXR5RXZlbnRzOiBbLi4uREVGQVVMVF9TRVNTSU9OX1RJTUVPVVRfQ09ORklHLmRvbUFjdGl2aXR5RXZlbnRzXVxyXG4gIH07XHJcbiAgY29uc3QgeyBodHRwQWN0aXZpdHksIGFjdGlvbkRlbGF5cywgZG9tQWN0aXZpdHlFdmVudHMsIC4uLnNoYWxsb3cgfSA9IHBhcnRpYWwgPz8ge307XHJcblxyXG4gIGNvbnN0IG1lcmdlZDogU2Vzc2lvblRpbWVvdXRDb25maWcgPSB7XHJcbiAgICAuLi5iYXNlLFxyXG4gICAgLi4uc2hhbGxvdyxcclxuICAgIGh0dHBBY3Rpdml0eToge1xyXG4gICAgICAuLi5iYXNlLmh0dHBBY3Rpdml0eSxcclxuICAgICAgLi4uKGh0dHBBY3Rpdml0eSA/PyB7fSlcclxuICAgIH0sXHJcbiAgICBhY3Rpb25EZWxheXM6IHtcclxuICAgICAgLi4uYmFzZS5hY3Rpb25EZWxheXMsXHJcbiAgICAgIC4uLihhY3Rpb25EZWxheXMgPz8ge30pXHJcbiAgICB9LFxyXG4gICAgZG9tQWN0aXZpdHlFdmVudHM6IGJhc2UuZG9tQWN0aXZpdHlFdmVudHNcclxuICB9O1xyXG5cclxuICBjb25zdCBpbnZhbGlkRG9tQWN0aXZpdHlFdmVudHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIGlmIChBcnJheS5pc0FycmF5KGRvbUFjdGl2aXR5RXZlbnRzKSkge1xyXG4gICAgY29uc3QgZGVkdXBlZDogRG9tQWN0aXZpdHlFdmVudE5hbWVbXSA9IFtdO1xyXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gICAgZm9yIChjb25zdCByYXcgb2YgZG9tQWN0aXZpdHlFdmVudHMpIHtcclxuICAgICAgY29uc3QgY2FuZGlkYXRlID0gU3RyaW5nKHJhdyk7XHJcbiAgICAgIGlmICghRE9NX0FDVElWSVRZX0VWRU5UX1NFVC5oYXMoY2FuZGlkYXRlKSkge1xyXG4gICAgICAgIGludmFsaWREb21BY3Rpdml0eUV2ZW50cy5wdXNoKGNhbmRpZGF0ZSk7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFzZWVuLmhhcyhjYW5kaWRhdGUpKSB7XHJcbiAgICAgICAgc2Vlbi5hZGQoY2FuZGlkYXRlKTtcclxuICAgICAgICBkZWR1cGVkLnB1c2goY2FuZGlkYXRlIGFzIERvbUFjdGl2aXR5RXZlbnROYW1lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbWVyZ2VkLmRvbUFjdGl2aXR5RXZlbnRzID0gZGVkdXBlZDtcclxuICB9IGVsc2Uge1xyXG4gICAgbWVyZ2VkLmRvbUFjdGl2aXR5RXZlbnRzID0gWy4uLmJhc2UuZG9tQWN0aXZpdHlFdmVudHNdO1xyXG4gIH1cclxuXHJcbiAgbWVyZ2VkLmh0dHBBY3Rpdml0eS5hbGxvd2xpc3QgPSBbLi4uKG1lcmdlZC5odHRwQWN0aXZpdHkuYWxsb3dsaXN0ID8/IFtdKV07XHJcbiAgbWVyZ2VkLmh0dHBBY3Rpdml0eS5kZW55bGlzdCA9IFsuLi4obWVyZ2VkLmh0dHBBY3Rpdml0eS5kZW55bGlzdCA/PyBbXSldO1xyXG5cclxuICByZXR1cm4geyBjb25maWc6IG1lcmdlZCwgaW52YWxpZERvbUFjdGl2aXR5RXZlbnRzIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUlzc3VlKGZpZWxkOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IFZhbGlkYXRpb25Jc3N1ZSB7XHJcbiAgcmV0dXJuIHsgZmllbGQsIG1lc3NhZ2UgfTtcclxufVxyXG4iXX0=