UNPKG

@versatiledatakit/shared

Version:

Versatile Data Kit Shared library enables reusability of shared features like: NgRx Redux, Error Handlers, Utils, Generic Components, etc.

94 lines 16.5 kB
/* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ /* eslint-disable arrow-body-style,prefer-arrow/prefer-arrow-functions */ import { ROUTER_NAVIGATION } from '@ngrx/router-store'; import { CollectionsUtil } from '../../../../utils'; import { RouteSegments } from '../../../router'; import { ComponentsStateHelper, FAILED, IDLE, INITIALIZED, LOADED, LOADING } from '../../model'; import { COMPONENT_CLEAR_DATA, COMPONENT_FAILED, COMPONENT_IDLE, COMPONENT_INIT, COMPONENT_LOADED, COMPONENT_LOADING, COMPONENT_UPDATE, ComponentIdle, ComponentLoaded } from '../actions'; const stateHelper = new ComponentsStateHelper(); /** * ** Reducer for Components Actions. */ export function componentReducer(state = stateHelper.getState(), action = { type: null, payload: null }) { let actionComponentState; let actionLiteralComponentState; let storeLiteralComponentState; stateHelper.setState(state); switch (action.type) { case COMPONENT_INIT: actionComponentState = action.payload; stateHelper.updateLiteralComponentState({ ...actionComponentState.toLiteralCloneDeep(), status: INITIALIZED }); return stateHelper.getState(); case COMPONENT_IDLE: case COMPONENT_LOADING: actionComponentState = action.payload; storeLiteralComponentState = stateHelper.getLiteralComponentState(actionComponentState.id, actionComponentState.routePathSegments); actionLiteralComponentState = actionComponentState.toLiteralCloneDeep(); stateHelper.updateLiteralComponentState({ ...storeLiteralComponentState, ...actionLiteralComponentState, status: action instanceof ComponentIdle ? IDLE : LOADING }); return stateHelper.getState(); case COMPONENT_UPDATE: case COMPONENT_LOADED: actionComponentState = action.payload; storeLiteralComponentState = stateHelper.getLiteralComponentState(actionComponentState.id, actionComponentState.routePathSegments); actionLiteralComponentState = actionComponentState.toLiteralCloneDeep(); stateHelper.updateLiteralComponentState({ ...storeLiteralComponentState, ...actionLiteralComponentState, status: action instanceof ComponentLoaded ? LOADED : actionComponentState.status, data: getComponentStateData(actionLiteralComponentState, storeLiteralComponentState) }); return stateHelper.getState(); case COMPONENT_FAILED: actionComponentState = action.payload; storeLiteralComponentState = stateHelper.getLiteralComponentState(actionComponentState.id, actionComponentState.routePathSegments); actionLiteralComponentState = actionComponentState.toLiteralCloneDeep(); stateHelper.updateLiteralComponentState({ ...storeLiteralComponentState, ...actionLiteralComponentState, data: getComponentStateData(actionLiteralComponentState, storeLiteralComponentState), status: FAILED }); return stateHelper.getState(); case COMPONENT_CLEAR_DATA: actionComponentState = action.payload; storeLiteralComponentState = stateHelper.getLiteralComponentState(actionComponentState.id, actionComponentState.routePathSegments); stateHelper.updateLiteralComponentState({ ...storeLiteralComponentState, ...actionComponentState.toLiteralCloneDeep(), data: {}, status: LOADING }); return stateHelper.getState(); case ROUTER_NAVIGATION: const routeSegments = action.payload.routerState.routeSegments; if (!(routeSegments instanceof RouteSegments)) { return state; } stateHelper.resetComponentStates(routeSegments.routePathSegments); return stateHelper.getState(); default: return state; } } const getComponentStateData = (actionComponentState, // eslint-disable-next-line @typescript-eslint/no-explicit-any storeLiteralComponentState) => { if (CollectionsUtil.isLiteralObjectWithProperties(actionComponentState.data)) { return actionComponentState.data; } if (CollectionsUtil.isDefined(storeLiteralComponentState)) { return storeLiteralComponentState.data; } return {}; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LnJlZHVjZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb3JlL2NvbXBvbmVudC9zdGF0ZS9yZWR1Y2Vycy9jb21wb25lbnQucmVkdWNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCx5RUFBeUU7QUFFekUsT0FBTyxFQUFFLGlCQUFpQixFQUEwQixNQUFNLG9CQUFvQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVwRCxPQUFPLEVBQXFCLGFBQWEsRUFBYyxNQUFNLGlCQUFpQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxxQkFBcUIsRUFBa0IsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQXlCLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFdkksT0FBTyxFQUNILG9CQUFvQixFQUNwQixnQkFBZ0IsRUFDaEIsY0FBYyxFQUNkLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUdoQixhQUFhLEVBRWIsZUFBZSxFQUdsQixNQUFNLFlBQVksQ0FBQztBQUVwQixNQUFNLFdBQVcsR0FBRyxJQUFJLHFCQUFxQixFQUFFLENBQUM7QUFFaEQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQzVCLEtBQUssR0FBRyxXQUFXLENBQUMsUUFBUSxFQUFFLEVBQzlCLFNBQStDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFO0lBRTVFLElBQUksb0JBQW9DLENBQUM7SUFDekMsSUFBSSwyQkFBa0QsQ0FBQztJQUN2RCxJQUFJLDBCQUFpRCxDQUFDO0lBRXRELFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFNUIsUUFBUSxNQUFNLENBQUMsSUFBSSxFQUFFO1FBQ2pCLEtBQUssY0FBYztZQUNmLG9CQUFvQixHQUFJLE1BQXdCLENBQUMsT0FBTyxDQUFDO1lBRXpELFdBQVcsQ0FBQywyQkFBMkIsQ0FBQztnQkFDcEMsR0FBRyxvQkFBb0IsQ0FBQyxrQkFBa0IsRUFBRTtnQkFDNUMsTUFBTSxFQUFFLFdBQVc7YUFDdEIsQ0FBQyxDQUFDO1lBRUgsT0FBTyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbEMsS0FBSyxjQUFjLENBQUM7UUFDcEIsS0FBSyxpQkFBaUI7WUFDbEIsb0JBQW9CLEdBQUksTUFBMkMsQ0FBQyxPQUFPLENBQUM7WUFDNUUsMEJBQTBCLEdBQUcsV0FBVyxDQUFDLHdCQUF3QixDQUM3RCxvQkFBb0IsQ0FBQyxFQUFFLEVBQ3ZCLG9CQUFvQixDQUFDLGlCQUFpQixDQUN6QyxDQUFDO1lBRUYsMkJBQTJCLEdBQUcsb0JBQW9CLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUV4RSxXQUFXLENBQUMsMkJBQTJCLENBQUM7Z0JBQ3BDLEdBQUcsMEJBQTBCO2dCQUM3QixHQUFHLDJCQUEyQjtnQkFDOUIsTUFBTSxFQUFFLE1BQU0sWUFBWSxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTzthQUMzRCxDQUFDLENBQUM7WUFFSCxPQUFPLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQyxLQUFLLGdCQUFnQixDQUFDO1FBQ3RCLEtBQUssZ0JBQWdCO1lBQ2pCLG9CQUFvQixHQUFJLE1BQTRDLENBQUMsT0FBTyxDQUFDO1lBQzdFLDBCQUEwQixHQUFHLFdBQVcsQ0FBQyx3QkFBd0IsQ0FDN0Qsb0JBQW9CLENBQUMsRUFBRSxFQUN2QixvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FDekMsQ0FBQztZQUVGLDJCQUEyQixHQUFHLG9CQUFvQixDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFFeEUsV0FBVyxDQUFDLDJCQUEyQixDQUFDO2dCQUNwQyxHQUFHLDBCQUEwQjtnQkFDN0IsR0FBRywyQkFBMkI7Z0JBQzlCLE1BQU0sRUFBRSxNQUFNLFlBQVksZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLE1BQU07Z0JBQ2hGLElBQUksRUFBRSxxQkFBcUIsQ0FBQywyQkFBMkIsRUFBRSwwQkFBMEIsQ0FBQzthQUN2RixDQUFDLENBQUM7WUFFSCxPQUFPLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQyxLQUFLLGdCQUFnQjtZQUNqQixvQkFBb0IsR0FBSSxNQUE0QyxDQUFDLE9BQU8sQ0FBQztZQUM3RSwwQkFBMEIsR0FBRyxXQUFXLENBQUMsd0JBQXdCLENBQzdELG9CQUFvQixDQUFDLEVBQUUsRUFDdkIsb0JBQW9CLENBQUMsaUJBQWlCLENBQ3pDLENBQUM7WUFFRiwyQkFBMkIsR0FBRyxvQkFBb0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBRXhFLFdBQVcsQ0FBQywyQkFBMkIsQ0FBQztnQkFDcEMsR0FBRywwQkFBMEI7Z0JBQzdCLEdBQUcsMkJBQTJCO2dCQUM5QixJQUFJLEVBQUUscUJBQXFCLENBQUMsMkJBQTJCLEVBQUUsMEJBQTBCLENBQUM7Z0JBQ3BGLE1BQU0sRUFBRSxNQUFNO2FBQ2pCLENBQUMsQ0FBQztZQUVILE9BQU8sV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLEtBQUssb0JBQW9CO1lBQ3JCLG9CQUFvQixHQUFJLE1BQTZCLENBQUMsT0FBTyxDQUFDO1lBQzlELDBCQUEwQixHQUFHLFdBQVcsQ0FBQyx3QkFBd0IsQ0FDN0Qsb0JBQW9CLENBQUMsRUFBRSxFQUN2QixvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FDekMsQ0FBQztZQUVGLFdBQVcsQ0FBQywyQkFBMkIsQ0FBQztnQkFDcEMsR0FBRywwQkFBMEI7Z0JBQzdCLEdBQUcsb0JBQW9CLENBQUMsa0JBQWtCLEVBQUU7Z0JBQzVDLElBQUksRUFBRSxFQUFFO2dCQUNSLE1BQU0sRUFBRSxPQUFPO2FBQ2xCLENBQUMsQ0FBQztZQUVILE9BQU8sV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLEtBQUssaUJBQWlCO1lBQ2xCLE1BQU0sYUFBYSxHQUFJLE1BQTZDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUM7WUFFdkcsSUFBSSxDQUFDLENBQUMsYUFBYSxZQUFZLGFBQWEsQ0FBQyxFQUFFO2dCQUMzQyxPQUFPLEtBQUssQ0FBQzthQUNoQjtZQUVELFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUVsRSxPQUFPLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQztZQUNJLE9BQU8sS0FBSyxDQUFDO0tBQ3BCO0FBQ0wsQ0FBQztBQUVELE1BQU0scUJBQXFCLEdBQUcsQ0FDMUIsb0JBQTJDO0FBQzNDLDhEQUE4RDtBQUM5RCwwQkFBaUQsRUFDM0IsRUFBRTtJQUN4QixJQUFJLGVBQWUsQ0FBQyw2QkFBNkIsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUMxRSxPQUFPLG9CQUFvQixDQUFDLElBQUksQ0FBQztLQUNwQztJQUVELElBQUksZUFBZSxDQUFDLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxFQUFFO1FBQ3ZELE9BQU8sMEJBQTBCLENBQUMsSUFBSSxDQUFDO0tBQzFDO0lBRUQsT0FBTyxFQUFFLENBQUM7QUFDZCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMjMtMjAyNSBCcm9hZGNvbVxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBhcnJvdy1ib2R5LXN0eWxlLHByZWZlci1hcnJvdy9wcmVmZXItYXJyb3ctZnVuY3Rpb25zICovXG5cbmltcG9ydCB7IFJPVVRFUl9OQVZJR0FUSU9OLCBSb3V0ZXJOYXZpZ2F0aW9uQWN0aW9uIH0gZnJvbSAnQG5ncngvcm91dGVyLXN0b3JlJztcblxuaW1wb3J0IHsgQ29sbGVjdGlvbnNVdGlsIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMnO1xuXG5pbXBvcnQgeyBOYXZpZ2F0aW9uQWN0aW9ucywgUm91dGVTZWdtZW50cywgUm91dGVTdGF0ZSB9IGZyb20gJy4uLy4uLy4uL3JvdXRlcic7XG5cbmltcG9ydCB7IENvbXBvbmVudHNTdGF0ZUhlbHBlciwgQ29tcG9uZW50U3RhdGUsIEZBSUxFRCwgSURMRSwgSU5JVElBTElaRUQsIExpdGVyYWxDb21wb25lbnRTdGF0ZSwgTE9BREVELCBMT0FESU5HIH0gZnJvbSAnLi4vLi4vbW9kZWwnO1xuXG5pbXBvcnQge1xuICAgIENPTVBPTkVOVF9DTEVBUl9EQVRBLFxuICAgIENPTVBPTkVOVF9GQUlMRUQsXG4gICAgQ09NUE9ORU5UX0lETEUsXG4gICAgQ09NUE9ORU5UX0lOSVQsXG4gICAgQ09NUE9ORU5UX0xPQURFRCxcbiAgICBDT01QT05FTlRfTE9BRElORyxcbiAgICBDT01QT05FTlRfVVBEQVRFLFxuICAgIENvbXBvbmVudEFjdGlvbnMsXG4gICAgQ29tcG9uZW50Q2xlYXJEYXRhLFxuICAgIENvbXBvbmVudElkbGUsXG4gICAgQ29tcG9uZW50SW5pdCxcbiAgICBDb21wb25lbnRMb2FkZWQsXG4gICAgQ29tcG9uZW50TG9hZGluZyxcbiAgICBDb21wb25lbnRVcGRhdGVcbn0gZnJvbSAnLi4vYWN0aW9ucyc7XG5cbmNvbnN0IHN0YXRlSGVscGVyID0gbmV3IENvbXBvbmVudHNTdGF0ZUhlbHBlcigpO1xuXG4vKipcbiAqICoqIFJlZHVjZXIgZm9yIENvbXBvbmVudHMgQWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvbmVudFJlZHVjZXIoXG4gICAgc3RhdGUgPSBzdGF0ZUhlbHBlci5nZXRTdGF0ZSgpLFxuICAgIGFjdGlvbjogQ29tcG9uZW50QWN0aW9ucyB8IE5hdmlnYXRpb25BY3Rpb25zID0geyB0eXBlOiBudWxsLCBwYXlsb2FkOiBudWxsIH1cbikge1xuICAgIGxldCBhY3Rpb25Db21wb25lbnRTdGF0ZTogQ29tcG9uZW50U3RhdGU7XG4gICAgbGV0IGFjdGlvbkxpdGVyYWxDb21wb25lbnRTdGF0ZTogTGl0ZXJhbENvbXBvbmVudFN0YXRlO1xuICAgIGxldCBzdG9yZUxpdGVyYWxDb21wb25lbnRTdGF0ZTogTGl0ZXJhbENvbXBvbmVudFN0YXRlO1xuXG4gICAgc3RhdGVIZWxwZXIuc2V0U3RhdGUoc3RhdGUpO1xuXG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlIENPTVBPTkVOVF9JTklUOlxuICAgICAgICAgICAgYWN0aW9uQ29tcG9uZW50U3RhdGUgPSAoYWN0aW9uIGFzIENvbXBvbmVudEluaXQpLnBheWxvYWQ7XG5cbiAgICAgICAgICAgIHN0YXRlSGVscGVyLnVwZGF0ZUxpdGVyYWxDb21wb25lbnRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgLi4uYWN0aW9uQ29tcG9uZW50U3RhdGUudG9MaXRlcmFsQ2xvbmVEZWVwKCksXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBJTklUSUFMSVpFRFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBzdGF0ZUhlbHBlci5nZXRTdGF0ZSgpO1xuICAgICAgICBjYXNlIENPTVBPTkVOVF9JRExFOlxuICAgICAgICBjYXNlIENPTVBPTkVOVF9MT0FESU5HOlxuICAgICAgICAgICAgYWN0aW9uQ29tcG9uZW50U3RhdGUgPSAoYWN0aW9uIGFzIENvbXBvbmVudElkbGUgfCBDb21wb25lbnRMb2FkaW5nKS5wYXlsb2FkO1xuICAgICAgICAgICAgc3RvcmVMaXRlcmFsQ29tcG9uZW50U3RhdGUgPSBzdGF0ZUhlbHBlci5nZXRMaXRlcmFsQ29tcG9uZW50U3RhdGUoXG4gICAgICAgICAgICAgICAgYWN0aW9uQ29tcG9uZW50U3RhdGUuaWQsXG4gICAgICAgICAgICAgICAgYWN0aW9uQ29tcG9uZW50U3RhdGUucm91dGVQYXRoU2VnbWVudHNcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGFjdGlvbkxpdGVyYWxDb21wb25lbnRTdGF0ZSA9IGFjdGlvbkNvbXBvbmVudFN0YXRlLnRvTGl0ZXJhbENsb25lRGVlcCgpO1xuXG4gICAgICAgICAgICBzdGF0ZUhlbHBlci51cGRhdGVMaXRlcmFsQ29tcG9uZW50U3RhdGUoe1xuICAgICAgICAgICAgICAgIC4uLnN0b3JlTGl0ZXJhbENvbXBvbmVudFN0YXRlLFxuICAgICAgICAgICAgICAgIC4uLmFjdGlvbkxpdGVyYWxDb21wb25lbnRTdGF0ZSxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IGFjdGlvbiBpbnN0YW5jZW9mIENvbXBvbmVudElkbGUgPyBJRExFIDogTE9BRElOR1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBzdGF0ZUhlbHBlci5nZXRTdGF0ZSgpO1xuICAgICAgICBjYXNlIENPTVBPTkVOVF9VUERBVEU6XG4gICAgICAgIGNhc2UgQ09NUE9ORU5UX0xPQURFRDpcbiAgICAgICAgICAgIGFjdGlvbkNvbXBvbmVudFN0YXRlID0gKGFjdGlvbiBhcyBDb21wb25lbnRMb2FkZWQgfCBDb21wb25lbnRVcGRhdGUpLnBheWxvYWQ7XG4gICAgICAgICAgICBzdG9yZUxpdGVyYWxDb21wb25lbnRTdGF0ZSA9IHN0YXRlSGVscGVyLmdldExpdGVyYWxDb21wb25lbnRTdGF0ZShcbiAgICAgICAgICAgICAgICBhY3Rpb25Db21wb25lbnRTdGF0ZS5pZCxcbiAgICAgICAgICAgICAgICBhY3Rpb25Db21wb25lbnRTdGF0ZS5yb3V0ZVBhdGhTZWdtZW50c1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgYWN0aW9uTGl0ZXJhbENvbXBvbmVudFN0YXRlID0gYWN0aW9uQ29tcG9uZW50U3RhdGUudG9MaXRlcmFsQ2xvbmVEZWVwKCk7XG5cbiAgICAgICAgICAgIHN0YXRlSGVscGVyLnVwZGF0ZUxpdGVyYWxDb21wb25lbnRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgLi4uc3RvcmVMaXRlcmFsQ29tcG9uZW50U3RhdGUsXG4gICAgICAgICAgICAgICAgLi4uYWN0aW9uTGl0ZXJhbENvbXBvbmVudFN0YXRlLFxuICAgICAgICAgICAgICAgIHN0YXR1czogYWN0aW9uIGluc3RhbmNlb2YgQ29tcG9uZW50TG9hZGVkID8gTE9BREVEIDogYWN0aW9uQ29tcG9uZW50U3RhdGUuc3RhdHVzLFxuICAgICAgICAgICAgICAgIGRhdGE6IGdldENvbXBvbmVudFN0YXRlRGF0YShhY3Rpb25MaXRlcmFsQ29tcG9uZW50U3RhdGUsIHN0b3JlTGl0ZXJhbENvbXBvbmVudFN0YXRlKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBzdGF0ZUhlbHBlci5nZXRTdGF0ZSgpO1xuICAgICAgICBjYXNlIENPTVBPTkVOVF9GQUlMRUQ6XG4gICAgICAgICAgICBhY3Rpb25Db21wb25lbnRTdGF0ZSA9IChhY3Rpb24gYXMgQ29tcG9uZW50TG9hZGVkIHwgQ29tcG9uZW50VXBkYXRlKS5wYXlsb2FkO1xuICAgICAgICAgICAgc3RvcmVMaXRlcmFsQ29tcG9uZW50U3RhdGUgPSBzdGF0ZUhlbHBlci5nZXRMaXRlcmFsQ29tcG9uZW50U3RhdGUoXG4gICAgICAgICAgICAgICAgYWN0aW9uQ29tcG9uZW50U3RhdGUuaWQsXG4gICAgICAgICAgICAgICAgYWN0aW9uQ29tcG9uZW50U3RhdGUucm91dGVQYXRoU2VnbWVudHNcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGFjdGlvbkxpdGVyYWxDb21wb25lbnRTdGF0ZSA9IGFjdGlvbkNvbXBvbmVudFN0YXRlLnRvTGl0ZXJhbENsb25lRGVlcCgpO1xuXG4gICAgICAgICAgICBzdGF0ZUhlbHBlci51cGRhdGVMaXRlcmFsQ29tcG9uZW50U3RhdGUoe1xuICAgICAgICAgICAgICAgIC4uLnN0b3JlTGl0ZXJhbENvbXBvbmVudFN0YXRlLFxuICAgICAgICAgICAgICAgIC4uLmFjdGlvbkxpdGVyYWxDb21wb25lbnRTdGF0ZSxcbiAgICAgICAgICAgICAgICBkYXRhOiBnZXRDb21wb25lbnRTdGF0ZURhdGEoYWN0aW9uTGl0ZXJhbENvbXBvbmVudFN0YXRlLCBzdG9yZUxpdGVyYWxDb21wb25lbnRTdGF0ZSksXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBGQUlMRURcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gc3RhdGVIZWxwZXIuZ2V0U3RhdGUoKTtcbiAgICAgICAgY2FzZSBDT01QT05FTlRfQ0xFQVJfREFUQTpcbiAgICAgICAgICAgIGFjdGlvbkNvbXBvbmVudFN0YXRlID0gKGFjdGlvbiBhcyBDb21wb25lbnRDbGVhckRhdGEpLnBheWxvYWQ7XG4gICAgICAgICAgICBzdG9yZUxpdGVyYWxDb21wb25lbnRTdGF0ZSA9IHN0YXRlSGVscGVyLmdldExpdGVyYWxDb21wb25lbnRTdGF0ZShcbiAgICAgICAgICAgICAgICBhY3Rpb25Db21wb25lbnRTdGF0ZS5pZCxcbiAgICAgICAgICAgICAgICBhY3Rpb25Db21wb25lbnRTdGF0ZS5yb3V0ZVBhdGhTZWdtZW50c1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgc3RhdGVIZWxwZXIudXBkYXRlTGl0ZXJhbENvbXBvbmVudFN0YXRlKHtcbiAgICAgICAgICAgICAgICAuLi5zdG9yZUxpdGVyYWxDb21wb25lbnRTdGF0ZSxcbiAgICAgICAgICAgICAgICAuLi5hY3Rpb25Db21wb25lbnRTdGF0ZS50b0xpdGVyYWxDbG9uZURlZXAoKSxcbiAgICAgICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IExPQURJTkdcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gc3RhdGVIZWxwZXIuZ2V0U3RhdGUoKTtcbiAgICAgICAgY2FzZSBST1VURVJfTkFWSUdBVElPTjpcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlU2VnbWVudHMgPSAoYWN0aW9uIGFzIFJvdXRlck5hdmlnYXRpb25BY3Rpb248Um91dGVTdGF0ZT4pLnBheWxvYWQucm91dGVyU3RhdGUucm91dGVTZWdtZW50cztcblxuICAgICAgICAgICAgaWYgKCEocm91dGVTZWdtZW50cyBpbnN0YW5jZW9mIFJvdXRlU2VnbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGF0ZUhlbHBlci5yZXNldENvbXBvbmVudFN0YXRlcyhyb3V0ZVNlZ21lbnRzLnJvdXRlUGF0aFNlZ21lbnRzKTtcblxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlSGVscGVyLmdldFN0YXRlKCk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxufVxuXG5jb25zdCBnZXRDb21wb25lbnRTdGF0ZURhdGEgPSAoXG4gICAgYWN0aW9uQ29tcG9uZW50U3RhdGU6IExpdGVyYWxDb21wb25lbnRTdGF0ZSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHN0b3JlTGl0ZXJhbENvbXBvbmVudFN0YXRlOiBMaXRlcmFsQ29tcG9uZW50U3RhdGVcbik6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPT4ge1xuICAgIGlmIChDb2xsZWN0aW9uc1V0aWwuaXNMaXRlcmFsT2JqZWN0V2l0aFByb3BlcnRpZXMoYWN0aW9uQ29tcG9uZW50U3RhdGUuZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuIGFjdGlvbkNvbXBvbmVudFN0YXRlLmRhdGE7XG4gICAgfVxuXG4gICAgaWYgKENvbGxlY3Rpb25zVXRpbC5pc0RlZmluZWQoc3RvcmVMaXRlcmFsQ29tcG9uZW50U3RhdGUpKSB7XG4gICAgICAgIHJldHVybiBzdG9yZUxpdGVyYWxDb21wb25lbnRTdGF0ZS5kYXRhO1xuICAgIH1cblxuICAgIHJldHVybiB7fTtcbn07XG4iXX0=