@versatiledatakit/shared
Version:
Versatile Data Kit Shared library enables reusability of shared features like: NgRx Redux, Error Handlers, Utils, Generic Components, etc.
168 lines • 25 kB
JavaScript
/*
* Copyright 2023-2025 Broadcom
* SPDX-License-Identifier: Apache-2.0
*/
import { CollectionsUtil } from '../../../../utils';
import { IDLE } from './component-status.model';
import { ComponentStateImpl } from './component-state.model';
/**
* ** ComponentsState Helper.
*/
export class ComponentsStateHelper {
constructor() {
this._literalComponentsState = {
components: {},
routePathSegments: {}
};
}
/**
* ** Returns LiteralComponentsState from Helper.
*/
getState() {
return {
...this._literalComponentsState
};
}
/**
* ** Will set state to the local Helper state.
*/
setState(literalComponentsState) {
this._literalComponentsState = this._shallowCloneComponentsState(literalComponentsState);
return this;
}
/**
* ** Will return LiteralComponentState for given id and routePathSegments.
*/
getLiteralComponentState(id, routePathSegments) {
return this._getLiteralComponentState(id, CollectionsUtil.isArray(routePathSegments) ? [...routePathSegments] : [], this._literalComponentsState);
}
/**
* ** Get ComponentState for given id and routePathSegments.
*/
getComponentState(id, routePathSegments) {
const literalComponentState = this._getLiteralComponentState(id, CollectionsUtil.isArray(routePathSegments) ? [...routePathSegments] : [], this._literalComponentsState);
return CollectionsUtil.isDefined(literalComponentState)
? ComponentStateImpl.fromLiteralComponentState(literalComponentState)
: null;
}
/**
* ** Get all ComponentState for given routePathSegments.
*/
getAllComponentState(routePathSegments) {
return this._getAllComponentState(CollectionsUtil.isArray(routePathSegments) ? [...routePathSegments] : [], this._literalComponentsState);
}
/**
* ** Update LiteralComponentState.
*/
updateLiteralComponentState(literalComponentState) {
return this._updateLiteralComponentState(literalComponentState, [...literalComponentState.routePathSegments], this._literalComponentsState);
}
/**
* ** Reset component status to NOT_LOADED for all ComponentState in a given routePathSegment.
*/
resetComponentStates(routePathSegments) {
this._resetComponentStates(CollectionsUtil.isArray(routePathSegments) ? [...routePathSegments] : [], this._literalComponentsState);
}
/**
* ** Delete all ComponentState for given routePathSegment.
*/
deleteRoutePathSegments(routePathSegments) {
this._deleteRoutePathSegments(CollectionsUtil.isArray(routePathSegments) ? [...routePathSegments] : [], this._literalComponentsState);
}
/**
* ** Update ComponentState.
*/
_updateLiteralComponentState(literalComponentState, routePathSegments, state) {
if (CollectionsUtil.isArrayEmpty(routePathSegments)) {
state.components[literalComponentState.id] = literalComponentState;
return;
}
const routePathSegment = routePathSegments.shift();
this._updateLiteralComponentState(literalComponentState, routePathSegments, this._normalizeRoutePathSegments(state.routePathSegments, routePathSegment));
}
/**
* ** Get ComponentState.
*/
_getLiteralComponentState(id, routePathSegments, state) {
if (!state) {
return null;
}
if (CollectionsUtil.isArrayEmpty(routePathSegments)) {
if (state.components[id]) {
return ComponentStateImpl.cloneDeepLiteral(state.components[id]);
}
return null;
}
const routePathSegment = routePathSegments.shift();
return this._getLiteralComponentState(id, routePathSegments, state.routePathSegments[routePathSegment]);
}
/**
* ** Get all components for given routePathSegments.
*/
_getAllComponentState(routePathSegments, state) {
if (!state) {
return [];
}
const components = CollectionsUtil.objectValues(state.components).map((c) => ComponentStateImpl.fromLiteralComponentState(ComponentStateImpl.cloneDeepLiteral(c)));
if (CollectionsUtil.isArrayEmpty(routePathSegments)) {
return components;
}
const routePathSegment = routePathSegments.shift();
return [...components, ...this._getAllComponentState(routePathSegments, state.routePathSegments[routePathSegment])];
}
/**
* ** Reset component status to NOT_LOADED for all component in a given context.
*/
_resetComponentStates(routePathSegments, state) {
CollectionsUtil.iterateObject(state.components, (componentState, id) => {
state.components[id] = { ...componentState, status: IDLE };
});
if (CollectionsUtil.isArrayEmpty(routePathSegments)) {
return;
}
const routePathSegment = routePathSegments.shift();
this._resetComponentStates(routePathSegments, this._normalizeRoutePathSegments(state.routePathSegments, routePathSegment));
}
/**
* ** Delete all components state for a given route path segment.
*/
_deleteRoutePathSegments(routePathSegments, state) {
const routePathSegment = routePathSegments.shift();
if (!routePathSegment) {
return;
}
if (CollectionsUtil.isArrayEmpty(routePathSegments)) {
delete state.routePathSegments[routePathSegment];
return;
}
this._deleteRoutePathSegments(routePathSegments, this._normalizeRoutePathSegments(state.routePathSegments, routePathSegment));
}
/**
* ** Normalize Route path segments.
*/
_normalizeRoutePathSegments(urlSegments, urlSegmentName) {
if (CollectionsUtil.isNil(urlSegments[urlSegmentName])) {
urlSegments[urlSegmentName] = {
components: {},
routePathSegments: {}
};
}
return urlSegments[urlSegmentName];
}
_shallowCloneComponentsState(source, target) {
const _source = source ?? { components: {}, routePathSegments: {} };
const _target = target ?? { components: {}, routePathSegments: {} };
CollectionsUtil.iterateObject(_source.components, (value, key) => {
_target.components[key] = value;
});
CollectionsUtil.iterateObject(_source.routePathSegments, (value, key) => {
_target.routePathSegments[key] = {
components: {},
routePathSegments: {}
};
this._shallowCloneComponentsState(value, _target.routePathSegments[key]);
});
return _target;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50cy1zdGF0ZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2NvcmUvY29tcG9uZW50L21vZGVsL3N0YXRlL2NvbXBvbmVudHMtc3RhdGUubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXBELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRCxPQUFPLEVBQWtCLGtCQUFrQixFQUF5QixNQUFNLHlCQUF5QixDQUFDO0FBT3BHOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHFCQUFxQjtJQUc5QjtRQUNJLElBQUksQ0FBQyx1QkFBdUIsR0FBRztZQUMzQixVQUFVLEVBQUUsRUFBRTtZQUNkLGlCQUFpQixFQUFFLEVBQUU7U0FDeEIsQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVE7UUFDSixPQUFPO1lBQ0gsR0FBRyxJQUFJLENBQUMsdUJBQXVCO1NBQ2xDLENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRLENBQUMsc0JBQThDO1FBQ25ELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUV6RixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSCx3QkFBd0IsQ0FBQyxFQUFVLEVBQUUsaUJBQTRCO1FBQzdELE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUNqQyxFQUFFLEVBQ0YsZUFBZSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUN4RSxJQUFJLENBQUMsdUJBQXVCLENBQy9CLENBQUM7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LE9BQU8sR0FBMkIsTUFBTSxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUM1RixNQUFNLE9BQU8sR0FBMkIsTUFBTSxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUU1RixlQUFlLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDN0QsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxlQUFlLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUNwRSxPQUFPLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEdBQUc7Z0JBQzdCLFVBQVUsRUFBRSxFQUFFO2dCQUNkLGlCQUFpQixFQUFFLEVBQUU7YUFDeEIsQ0FBQztZQUVGLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0UsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMjMtMjAyNSBCcm9hZGNvbVxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuXG5pbXBvcnQgeyBDb2xsZWN0aW9uc1V0aWwgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCB7IElETEUgfSBmcm9tICcuL2NvbXBvbmVudC1zdGF0dXMubW9kZWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50U3RhdGUsIENvbXBvbmVudFN0YXRlSW1wbCwgTGl0ZXJhbENvbXBvbmVudFN0YXRlIH0gZnJvbSAnLi9jb21wb25lbnQtc3RhdGUubW9kZWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExpdGVyYWxDb21wb25lbnRzU3RhdGUge1xuICAgIHJlYWRvbmx5IGNvbXBvbmVudHM6IHsgW25hbWU6IHN0cmluZ106IExpdGVyYWxDb21wb25lbnRTdGF0ZSB9O1xuICAgIHJlYWRvbmx5IHJvdXRlUGF0aFNlZ21lbnRzOiB7IFtzZWdtZW50SWQ6IHN0cmluZ106IExpdGVyYWxDb21wb25lbnRzU3RhdGUgfTtcbn1cblxuLyoqXG4gKiAqKiBDb21wb25lbnRzU3RhdGUgSGVscGVyLlxuICovXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50c1N0YXRlSGVscGVyIHtcbiAgICBwcml2YXRlIF9saXRlcmFsQ29tcG9uZW50c1N0YXRlOiBMaXRlcmFsQ29tcG9uZW50c1N0YXRlO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2xpdGVyYWxDb21wb25lbnRzU3RhdGUgPSB7XG4gICAgICAgICAgICBjb21wb25lbnRzOiB7fSxcbiAgICAgICAgICAgIHJvdXRlUGF0aFNlZ21lbnRzOiB7fVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFJldHVybnMgTGl0ZXJhbENvbXBvbmVudHNTdGF0ZSBmcm9tIEhlbHBlci5cbiAgICAgKi9cbiAgICBnZXRTdGF0ZSgpOiBMaXRlcmFsQ29tcG9uZW50c1N0YXRlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2xpdGVyYWxDb21wb25lbnRzU3RhdGVcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBXaWxsIHNldCBzdGF0ZSB0byB0aGUgbG9jYWwgSGVscGVyIHN0YXRlLlxuICAgICAqL1xuICAgIHNldFN0YXRlKGxpdGVyYWxDb21wb25lbnRzU3RhdGU6IExpdGVyYWxDb21wb25lbnRzU3RhdGUpIHtcbiAgICAgICAgdGhpcy5fbGl0ZXJhbENvbXBvbmVudHNTdGF0ZSA9IHRoaXMuX3NoYWxsb3dDbG9uZUNvbXBvbmVudHNTdGF0ZShsaXRlcmFsQ29tcG9uZW50c1N0YXRlKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBXaWxsIHJldHVybiBMaXRlcmFsQ29tcG9uZW50U3RhdGUgZm9yIGdpdmVuIGlkIGFuZCByb3V0ZVBhdGhTZWdtZW50cy5cbiAgICAgKi9cbiAgICBnZXRMaXRlcmFsQ29tcG9uZW50U3RhdGUoaWQ6IHN0cmluZywgcm91dGVQYXRoU2VnbWVudHM/OiBzdHJpbmdbXSk6IExpdGVyYWxDb21wb25lbnRTdGF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRMaXRlcmFsQ29tcG9uZW50U3RhdGUoXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIENvbGxlY3Rpb25zVXRpbC5pc0FycmF5KHJvdXRlUGF0aFNlZ21lbnRzKSA/IFsuLi5yb3V0ZVBhdGhTZWdtZW50c10gOiBbXSxcbiAgICAgICAgICAgIHRoaXMuX2xpdGVyYWxDb21wb25lbnRzU3RhdGVcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBHZXQgQ29tcG9uZW50U3RhdGUgZm9yIGdpdmVuIGlkIGFuZCByb3V0ZVBhdGhTZWdtZW50cy5cbiAgICAgKi9cbiAgICBnZXRDb21wb25lbnRTdGF0ZShpZDogc3RyaW5nLCByb3V0ZVBhdGhTZWdtZW50cz86IHN0cmluZ1tdKTogQ29tcG9uZW50U3RhdGUge1xuICAgICAgICBjb25zdCBsaXRlcmFsQ29tcG9uZW50U3RhdGUgPSB0aGlzLl9nZXRMaXRlcmFsQ29tcG9uZW50U3RhdGUoXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIENvbGxlY3Rpb25zVXRpbC5pc0FycmF5KHJvdXRlUGF0aFNlZ21lbnRzKSA/IFsuLi5yb3V0ZVBhdGhTZWdtZW50c10gOiBbXSxcbiAgICAgICAgICAgIHRoaXMuX2xpdGVyYWxDb21wb25lbnRzU3RhdGVcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnNVdGlsLmlzRGVmaW5lZChsaXRlcmFsQ29tcG9uZW50U3RhdGUpXG4gICAgICAgICAgICA/IENvbXBvbmVudFN0YXRlSW1wbC5mcm9tTGl0ZXJhbENvbXBvbmVudFN0YXRlKGxpdGVyYWxDb21wb25lbnRTdGF0ZSlcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBHZXQgYWxsIENvbXBvbmVudFN0YXRlIGZvciBnaXZlbiByb3V0ZVBhdGhTZWdtZW50cy5cbiAgICAgKi9cbiAgICBnZXRBbGxDb21wb25lbnRTdGF0ZShyb3V0ZVBhdGhTZWdtZW50czogc3RyaW5nW10pOiBDb21wb25lbnRTdGF0ZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEFsbENvbXBvbmVudFN0YXRlKFxuICAgICAgICAgICAgQ29sbGVjdGlvbnNVdGlsLmlzQXJyYXkocm91dGVQYXRoU2VnbWVudHMpID8gWy4uLnJvdXRlUGF0aFNlZ21lbnRzXSA6IFtdLFxuICAgICAgICAgICAgdGhpcy5fbGl0ZXJhbENvbXBvbmVudHNTdGF0ZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFVwZGF0ZSBMaXRlcmFsQ29tcG9uZW50U3RhdGUuXG4gICAgICovXG4gICAgdXBkYXRlTGl0ZXJhbENvbXBvbmVudFN0YXRlKGxpdGVyYWxDb21wb25lbnRTdGF0ZTogTGl0ZXJhbENvbXBvbmVudFN0YXRlKTogdm9pZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVMaXRlcmFsQ29tcG9uZW50U3RhdGUoXG4gICAgICAgICAgICBsaXRlcmFsQ29tcG9uZW50U3RhdGUsXG4gICAgICAgICAgICBbLi4ubGl0ZXJhbENvbXBvbmVudFN0YXRlLnJvdXRlUGF0aFNlZ21lbnRzXSxcbiAgICAgICAgICAgIHRoaXMuX2xpdGVyYWxDb21wb25lbnRzU3RhdGVcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBSZXNldCBjb21wb25lbnQgc3RhdHVzIHRvIE5PVF9MT0FERUQgZm9yIGFsbCBDb21wb25lbnRTdGF0ZSBpbiBhIGdpdmVuIHJvdXRlUGF0aFNlZ21lbnQuXG4gICAgICovXG4gICAgcmVzZXRDb21wb25lbnRTdGF0ZXMocm91dGVQYXRoU2VnbWVudHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Jlc2V0Q29tcG9uZW50U3RhdGVzKENvbGxlY3Rpb25zVXRpbC5pc0FycmF5KHJvdXRlUGF0aFNlZ21lbnRzKSA/IFsuLi5yb3V0ZVBhdGhTZWdtZW50c10gOiBbXSwgdGhpcy5fbGl0ZXJhbENvbXBvbmVudHNTdGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogRGVsZXRlIGFsbCBDb21wb25lbnRTdGF0ZSBmb3IgZ2l2ZW4gcm91dGVQYXRoU2VnbWVudC5cbiAgICAgKi9cbiAgICBkZWxldGVSb3V0ZVBhdGhTZWdtZW50cyhyb3V0ZVBhdGhTZWdtZW50czogc3RyaW5nW10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZGVsZXRlUm91dGVQYXRoU2VnbWVudHMoXG4gICAgICAgICAgICBDb2xsZWN0aW9uc1V0aWwuaXNBcnJheShyb3V0ZVBhdGhTZWdtZW50cykgPyBbLi4ucm91dGVQYXRoU2VnbWVudHNdIDogW10sXG4gICAgICAgICAgICB0aGlzLl9saXRlcmFsQ29tcG9uZW50c1N0YXRlXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogVXBkYXRlIENvbXBvbmVudFN0YXRlLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3VwZGF0ZUxpdGVyYWxDb21wb25lbnRTdGF0ZShcbiAgICAgICAgbGl0ZXJhbENvbXBvbmVudFN0YXRlOiBMaXRlcmFsQ29tcG9uZW50U3RhdGUsXG4gICAgICAgIHJvdXRlUGF0aFNlZ21lbnRzOiBzdHJpbmdbXSxcbiAgICAgICAgc3RhdGU6IExpdGVyYWxDb21wb25lbnRzU3RhdGVcbiAgICApOiB2b2lkIHtcbiAgICAgICAgaWYgKENvbGxlY3Rpb25zVXRpbC5pc0FycmF5RW1wdHkocm91dGVQYXRoU2VnbWVudHMpKSB7XG4gICAgICAgICAgICBzdGF0ZS5jb21wb25lbnRzW2xpdGVyYWxDb21wb25lbnRTdGF0ZS5pZF0gPSBsaXRlcmFsQ29tcG9uZW50U3RhdGU7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJvdXRlUGF0aFNlZ21lbnQgPSByb3V0ZVBhdGhTZWdtZW50cy5zaGlmdCgpO1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUxpdGVyYWxDb21wb25lbnRTdGF0ZShcbiAgICAgICAgICAgIGxpdGVyYWxDb21wb25lbnRTdGF0ZSxcbiAgICAgICAgICAgIHJvdXRlUGF0aFNlZ21lbnRzLFxuICAgICAgICAgICAgdGhpcy5fbm9ybWFsaXplUm91dGVQYXRoU2VnbWVudHMoc3RhdGUucm91dGVQYXRoU2VnbWVudHMsIHJvdXRlUGF0aFNlZ21lbnQpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogR2V0IENvbXBvbmVudFN0YXRlLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldExpdGVyYWxDb21wb25lbnRTdGF0ZShcbiAgICAgICAgaWQ6IHN0cmluZyxcbiAgICAgICAgcm91dGVQYXRoU2VnbWVudHM6IHN0cmluZ1tdLFxuICAgICAgICBzdGF0ZTogTGl0ZXJhbENvbXBvbmVudHNTdGF0ZVxuICAgICk6IExpdGVyYWxDb21wb25lbnRTdGF0ZSB8IG51bGwge1xuICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChDb2xsZWN0aW9uc1V0aWwuaXNBcnJheUVtcHR5KHJvdXRlUGF0aFNlZ21lbnRzKSkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLmNvbXBvbmVudHNbaWRdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudFN0YXRlSW1wbC5jbG9uZURlZXBMaXRlcmFsKHN0YXRlLmNvbXBvbmVudHNbaWRdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb3V0ZVBhdGhTZWdtZW50ID0gcm91dGVQYXRoU2VnbWVudHMuc2hpZnQoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TGl0ZXJhbENvbXBvbmVudFN0YXRlKGlkLCByb3V0ZVBhdGhTZWdtZW50cywgc3RhdGUucm91dGVQYXRoU2VnbWVudHNbcm91dGVQYXRoU2VnbWVudF0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIEdldCBhbGwgY29tcG9uZW50cyBmb3IgZ2l2ZW4gcm91dGVQYXRoU2VnbWVudHMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0QWxsQ29tcG9uZW50U3RhdGUocm91dGVQYXRoU2VnbWVudHM6IHN0cmluZ1tdLCBzdGF0ZTogTGl0ZXJhbENvbXBvbmVudHNTdGF0ZSk6IENvbXBvbmVudFN0YXRlW10ge1xuICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21wb25lbnRzOiBDb21wb25lbnRTdGF0ZVtdID0gQ29sbGVjdGlvbnNVdGlsLm9iamVjdFZhbHVlcyhzdGF0ZS5jb21wb25lbnRzKS5tYXAoKGMpID0+XG4gICAgICAgICAgICBDb21wb25lbnRTdGF0ZUltcGwuZnJvbUxpdGVyYWxDb21wb25lbnRTdGF0ZShDb21wb25lbnRTdGF0ZUltcGwuY2xvbmVEZWVwTGl0ZXJhbChjKSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoQ29sbGVjdGlvbnNVdGlsLmlzQXJyYXlFbXB0eShyb3V0ZVBhdGhTZWdtZW50cykpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm91dGVQYXRoU2VnbWVudCA9IHJvdXRlUGF0aFNlZ21lbnRzLnNoaWZ0KCk7XG5cbiAgICAgICAgcmV0dXJuIFsuLi5jb21wb25lbnRzLCAuLi50aGlzLl9nZXRBbGxDb21wb25lbnRTdGF0ZShyb3V0ZVBhdGhTZWdtZW50cywgc3RhdGUucm91dGVQYXRoU2VnbWVudHNbcm91dGVQYXRoU2VnbWVudF0pXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBSZXNldCBjb21wb25lbnQgc3RhdHVzIHRvIE5PVF9MT0FERUQgZm9yIGFsbCBjb21wb25lbnQgaW4gYSBnaXZlbiBjb250ZXh0LlxuICAgICAqL1xuICAgIHByaXZhdGUgX3Jlc2V0Q29tcG9uZW50U3RhdGVzKHJvdXRlUGF0aFNlZ21lbnRzOiBzdHJpbmdbXSwgc3RhdGU6IExpdGVyYWxDb21wb25lbnRzU3RhdGUpOiB2b2lkIHtcbiAgICAgICAgQ29sbGVjdGlvbnNVdGlsLml0ZXJhdGVPYmplY3Qoc3RhdGUuY29tcG9uZW50cywgKGNvbXBvbmVudFN0YXRlLCBpZCkgPT4ge1xuICAgICAgICAgICAgc3RhdGUuY29tcG9uZW50c1tpZF0gPSB7IC4uLmNvbXBvbmVudFN0YXRlLCBzdGF0dXM6IElETEUgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKENvbGxlY3Rpb25zVXRpbC5pc0FycmF5RW1wdHkocm91dGVQYXRoU2VnbWVudHMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb3V0ZVBhdGhTZWdtZW50ID0gcm91dGVQYXRoU2VnbWVudHMuc2hpZnQoKTtcblxuICAgICAgICB0aGlzLl9yZXNldENvbXBvbmVudFN0YXRlcyhyb3V0ZVBhdGhTZWdtZW50cywgdGhpcy5fbm9ybWFsaXplUm91dGVQYXRoU2VnbWVudHMoc3RhdGUucm91dGVQYXRoU2VnbWVudHMsIHJvdXRlUGF0aFNlZ21lbnQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBEZWxldGUgYWxsIGNvbXBvbmVudHMgc3RhdGUgZm9yIGEgZ2l2ZW4gcm91dGUgcGF0aCBzZWdtZW50LlxuICAgICAqL1xuICAgIHByaXZhdGUgX2RlbGV0ZVJvdXRlUGF0aFNlZ21lbnRzKHJvdXRlUGF0aFNlZ21lbnRzOiBzdHJpbmdbXSwgc3RhdGU6IExpdGVyYWxDb21wb25lbnRzU3RhdGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgcm91dGVQYXRoU2VnbWVudCA9IHJvdXRlUGF0aFNlZ21lbnRzLnNoaWZ0KCk7XG5cbiAgICAgICAgaWYgKCFyb3V0ZVBhdGhTZWdtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQ29sbGVjdGlvbnNVdGlsLmlzQXJyYXlFbXB0eShyb3V0ZVBhdGhTZWdtZW50cykpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBzdGF0ZS5yb3V0ZVBhdGhTZWdtZW50c1tyb3V0ZVBhdGhTZWdtZW50XTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZGVsZXRlUm91dGVQYXRoU2VnbWVudHMocm91dGVQYXRoU2VnbWVudHMsIHRoaXMuX25vcm1hbGl6ZVJvdXRlUGF0aFNlZ21lbnRzKHN0YXRlLnJvdXRlUGF0aFNlZ21lbnRzLCByb3V0ZVBhdGhTZWdtZW50KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogTm9ybWFsaXplIFJvdXRlIHBhdGggc2VnbWVudHMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfbm9ybWFsaXplUm91dGVQYXRoU2VnbWVudHMoXG4gICAgICAgIHVybFNlZ21lbnRzOiB7IFtzZWdtZW50SWQ6IHN0cmluZ106IExpdGVyYWxDb21wb25lbnRzU3RhdGUgfSxcbiAgICAgICAgdXJsU2VnbWVudE5hbWU6IHN0cmluZ1xuICAgICk6IExpdGVyYWxDb21wb25lbnRzU3RhdGUge1xuICAgICAgICBpZiAoQ29sbGVjdGlvbnNVdGlsLmlzTmlsKHVybFNlZ21lbnRzW3VybFNlZ21lbnROYW1lXSkpIHtcbiAgICAgICAgICAgIHVybFNlZ21lbnRzW3VybFNlZ21lbnROYW1lXSA9IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzOiB7fSxcbiAgICAgICAgICAgICAgICByb3V0ZVBhdGhTZWdtZW50czoge31cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXJsU2VnbWVudHNbdXJsU2VnbWVudE5hbWVdO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NoYWxsb3dDbG9uZUNvbXBvbmVudHNTdGF0ZShzb3VyY2U6IExpdGVyYWxDb21wb25lbnRzU3RhdGUsIHRhcmdldD86IExpdGVyYWxDb21wb25lbnRzU3RhdGUpOiBMaXRlcmFsQ29tcG9uZW50c1N0YXRlIHtcbiAgICAgICAgY29uc3QgX3NvdXJjZTogTGl0ZXJhbENvbXBvbmVudHNTdGF0ZSA9IHNvdXJjZSA/PyB7IGNvbXBvbmVudHM6IHt9LCByb3V0ZVBhdGhTZWdtZW50czoge30gfTtcbiAgICAgICAgY29uc3QgX3RhcmdldDogTGl0ZXJhbENvbXBvbmVudHNTdGF0ZSA9IHRhcmdldCA/PyB7IGNvbXBvbmVudHM6IHt9LCByb3V0ZVBhdGhTZWdtZW50czoge30gfTtcblxuICAgICAgICBDb2xsZWN0aW9uc1V0aWwuaXRlcmF0ZU9iamVjdChfc291cmNlLmNvbXBvbmVudHMsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICBfdGFyZ2V0LmNvbXBvbmVudHNba2V5XSA9IHZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBDb2xsZWN0aW9uc1V0aWwuaXRlcmF0ZU9iamVjdChfc291cmNlLnJvdXRlUGF0aFNlZ21lbnRzLCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgX3RhcmdldC5yb3V0ZVBhdGhTZWdtZW50c1trZXldID0ge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IHt9LFxuICAgICAgICAgICAgICAgIHJvdXRlUGF0aFNlZ21lbnRzOiB7fVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5fc2hhbGxvd0Nsb25lQ29tcG9uZW50c1N0YXRlKHZhbHVlLCBfdGFyZ2V0LnJvdXRlUGF0aFNlZ21lbnRzW2tleV0pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gX3RhcmdldDtcbiAgICB9XG59XG4iXX0=