@spartacus/cart
Version:
`@spartacus/cart` is a package that you can include in your application, which allows you to use various cart features.
184 lines • 29.6 kB
JavaScript
import { __decorate } from "tslib";
import { Injectable } from '@angular/core';
import { Effect, ofType } from '@ngrx/effects';
import { CartActions, GlobalMessageType, normalizeHttpError, } from '@spartacus/core';
import { of } from 'rxjs';
import { catchError, map, switchMap, withLatestFrom } from 'rxjs/operators';
import { SavedCartActions } from '../actions/index';
import * as i0 from "@angular/core";
import * as i1 from "@ngrx/effects";
import * as i2 from "../../connectors/saved-cart.connector";
import * as i3 from "@spartacus/core";
export class SavedCartEffects {
constructor(actions$, savedCartConnector, activeCartService, globalMessageService) {
this.actions$ = actions$;
this.savedCartConnector = savedCartConnector;
this.activeCartService = activeCartService;
this.globalMessageService = globalMessageService;
this.loadSavedCart$ = this.actions$.pipe(ofType(SavedCartActions.LOAD_SAVED_CART), map((action) => action.payload), switchMap(({ userId, cartId }) => this.savedCartConnector.get(userId, cartId).pipe(switchMap((savedCart) => {
return [
new CartActions.LoadCartSuccess({
userId,
cartId,
cart: savedCart,
}),
new SavedCartActions.LoadSavedCartSuccess({ userId, cartId }),
];
}), catchError((error) => of(new SavedCartActions.LoadSavedCartFail({
userId,
cartId,
error: normalizeHttpError(error),
}))))));
this.loadSavedCarts$ = this.actions$.pipe(ofType(SavedCartActions.LOAD_SAVED_CARTS), map((action) => action.payload), switchMap(({ userId }) => this.savedCartConnector.getList(userId).pipe(switchMap((savedCarts) => {
return [
new CartActions.LoadCartsSuccess(savedCarts),
new SavedCartActions.LoadSavedCartsSuccess({ userId }),
];
}), catchError((error) => of(new SavedCartActions.LoadSavedCartsFail({
userId,
error: normalizeHttpError(error),
}))))));
this.restoreSavedCart$ = this.actions$.pipe(ofType(SavedCartActions.RESTORE_SAVED_CART), map((action) => action.payload), withLatestFrom(this.activeCartService.getActive()), switchMap(([{ userId, cartId }, activeCart]) => {
var _a;
const actions = [];
if (((_a = activeCart === null || activeCart === void 0 ? void 0 : activeCart.entries) !== null && _a !== void 0 ? _a : []).length > 0) {
if (activeCart.code) {
/**
* Instead of calling the SaveCartAction, we are calling the edit saved cart
* because we do not want to clear the state when we swap carts between active and saved cart
*/
actions.push(new SavedCartActions.EditSavedCart({
userId,
cartId: activeCart.code,
saveCartName: '',
saveCartDescription: '',
}));
}
}
return this.savedCartConnector.restoreSavedCart(userId, cartId).pipe(switchMap((savedCart) => {
var _a;
this.globalMessageService.add({
key: ((_a = activeCart === null || activeCart === void 0 ? void 0 : activeCart.entries) !== null && _a !== void 0 ? _a : []).length > 0
? 'savedCartList.swapCartWithActiveCart'
: 'savedCartList.swapCartNoActiveCart',
params: {
cartName: cartId,
previousCartName: activeCart.code,
},
}, GlobalMessageType.MSG_TYPE_CONFIRMATION);
return [
...actions,
new CartActions.SetActiveCartId(cartId),
new CartActions.LoadCartSuccess({
userId,
cartId,
cart: savedCart,
}),
new SavedCartActions.RestoreSavedCartSuccess({ userId, cartId }),
];
}), catchError((error) => of(new SavedCartActions.RestoreSavedCartFail({
userId,
cartId,
error: normalizeHttpError(error),
}))));
}));
this.saveCart$ = this.actions$.pipe(ofType(SavedCartActions.SAVE_CART), map((action) => action.payload), switchMap(({ userId, cartId, saveCartName, saveCartDescription }) => {
return this.savedCartConnector
.saveCart(userId, cartId, saveCartName, saveCartDescription)
.pipe(switchMap((savedCart) => {
return [
new CartActions.ClearCartState(),
new CartActions.LoadCartSuccess({
userId,
cartId,
cart: savedCart,
}),
new SavedCartActions.SaveCartSuccess({
userId,
cartId,
saveCartName,
saveCartDescription,
}),
];
}), catchError((error) => of(new SavedCartActions.SaveCartFail({
userId,
cartId,
saveCartName,
saveCartDescription,
error: normalizeHttpError(error),
}))));
}));
this.editSavedCart$ = this.actions$.pipe(ofType(SavedCartActions.EDIT_SAVED_CART), map((action) => action.payload), switchMap(({ userId, cartId, saveCartName, saveCartDescription }) => {
return this.savedCartConnector
.saveCart(userId, cartId, saveCartName, saveCartDescription)
.pipe(switchMap((savedCart) => {
return [
new CartActions.LoadCartSuccess({
userId,
cartId,
cart: savedCart,
}),
new SavedCartActions.EditSavedCartSuccess({
userId,
cartId,
saveCartName,
saveCartDescription,
}),
];
}), catchError((error) => of(new SavedCartActions.EditSavedCartFail({
userId,
cartId,
saveCartName,
saveCartDescription,
error: normalizeHttpError(error),
}))));
}));
this.cloneSavedCart$ = this.actions$.pipe(ofType(SavedCartActions.CLONE_SAVED_CART), map((action) => action.payload), switchMap(({ userId, cartId, saveCartName }) => {
return this.savedCartConnector
.cloneSavedCart(userId, cartId, saveCartName)
.pipe(switchMap((_) => {
return [
new SavedCartActions.CloneSavedCartSuccess({
userId,
cartId,
saveCartName,
}),
new SavedCartActions.RestoreSavedCart({
userId,
cartId,
}),
new SavedCartActions.LoadSavedCarts({ userId }),
];
}), catchError((error) => of(new SavedCartActions.CloneSavedCartFail({
userId,
cartId,
saveCartName,
error: normalizeHttpError(error),
}))));
}));
}
}
SavedCartEffects.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: SavedCartEffects, deps: [{ token: i1.Actions }, { token: i2.SavedCartConnector }, { token: i3.ActiveCartService }, { token: i3.GlobalMessageService }], target: i0.ɵɵFactoryTarget.Injectable });
SavedCartEffects.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: SavedCartEffects });
__decorate([
Effect()
], SavedCartEffects.prototype, "loadSavedCart$", void 0);
__decorate([
Effect()
], SavedCartEffects.prototype, "loadSavedCarts$", void 0);
__decorate([
Effect()
], SavedCartEffects.prototype, "restoreSavedCart$", void 0);
__decorate([
Effect()
], SavedCartEffects.prototype, "saveCart$", void 0);
__decorate([
Effect()
], SavedCartEffects.prototype, "editSavedCart$", void 0);
__decorate([
Effect()
], SavedCartEffects.prototype, "cloneSavedCart$", void 0);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: SavedCartEffects, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.Actions }, { type: i2.SavedCartConnector }, { type: i3.ActiveCartService }, { type: i3.GlobalMessageService }]; }, propDecorators: { loadSavedCart$: [], loadSavedCarts$: [], restoreSavedCart$: [], saveCart$: [], editSavedCart$: [], cloneSavedCart$: [] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZWQtY2FydC5lZmZlY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9mZWF0dXJlLWxpYnMvY2FydC9zYXZlZC1jYXJ0L2NvcmUvc3RvcmUvZWZmZWN0cy9zYXZlZC1jYXJ0LmVmZmVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQVcsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RCxPQUFPLEVBR0wsV0FBVyxFQUVYLGlCQUFpQixFQUNqQixrQkFBa0IsR0FDbkIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU1RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7QUFHcEQsTUFBTSxPQUFPLGdCQUFnQjtJQXdRM0IsWUFDVSxRQUFpQixFQUNqQixrQkFBc0MsRUFDdEMsaUJBQW9DLEVBQ3BDLG9CQUEwQztRQUgxQyxhQUFRLEdBQVIsUUFBUSxDQUFTO1FBQ2pCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBMVFwRCxtQkFBYyxHQUlWLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUNwQixNQUFNLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLEVBQ3hDLEdBQUcsQ0FBQyxDQUFDLE1BQXNDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFDL0QsU0FBUyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFF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RUFBRSxFQUFFO2dCQUNkLE9BQU87b0JBQ0wsSUFBSSxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQzt3QkFDekMsTUFBTTt3QkFDTixNQUFNO3dCQUNOLFlBQVk7cUJBQ2IsQ0FBQztvQkFDRixJQUFJLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDO3dCQUNwQyxNQUFNO3dCQUNOLE1BQU07cUJBQ1AsQ0FBQztvQkFDRixJQUFJLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO2lCQUNoRCxDQUFDO1lBQ0osQ0FBQyxDQUFDLEVBQ0YsVUFBVSxDQUFDLENBQUMsS0FBd0IsRUFBRSxFQUFFLENBQ3RDLEVBQUUsQ0FDQSxJQUFJLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDO2dCQUN0QyxNQUFNO2dCQUNOLE1BQU07Z0JBQ04sWUFBWTtnQkFDWixLQUFLLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxDQUFDO2FBQ2pDLENBQUMsQ0FDSCxDQUNGLENBQ0YsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUNILENBQUM7SUFPQyxDQUFDOzs2R0E3UU8sZ0JBQWdCO2lIQUFoQixnQkFBZ0I7QUFFM0I7SUFEQyxNQUFNLEVBQUU7d0RBK0JQO0FBR0Y7SUFEQyxNQUFNLEVBQUU7eURBMEJQO0FBR0Y7SUFEQyxNQUFNLEVBQUU7MkRBc0VQO0FBR0Y7SUFEQyxNQUFNLEVBQUU7bURBMkNQO0FBR0Y7SUFEQyxNQUFNLEVBQUU7d0RBeUNQO0FBR0Y7SUFEQyxNQUFNLEVBQUU7eURBd0NQOzJGQXRRUyxnQkFBZ0I7a0JBRDVCLFVBQVU7a01BR1QsY0FBYyxNQWlDZCxlQUFlLE1BNEJmLGlCQUFpQixNQXdFakIsU0FBUyxNQTZDVCxjQUFjLE1BMkNkLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGlvbnMsIEVmZmVjdCwgb2ZUeXBlIH0gZnJvbSAnQG5ncngvZWZmZWN0cyc7XG5pbXBvcnQge1xuICBBY3RpdmVDYXJ0U2VydmljZSxcbiAgQ2FydCxcbiAgQ2FydEFjdGlvbnMsXG4gIEdsb2JhbE1lc3NhZ2VTZXJ2aWNlLFxuICBHbG9iYWxNZXNzYWdlVHlwZSxcbiAgbm9ybWFsaXplSHR0cEVycm9yLFxufSBmcm9tICdAc3BhcnRhY3VzL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCwgc3dpdGNoTWFwLCB3aXRoTGF0ZXN0RnJvbSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFNhdmVkQ2FydENvbm5lY3RvciB9IGZyb20gJy4uLy4uL2Nvbm5lY3RvcnMvc2F2ZWQtY2FydC5jb25uZWN0b3InO1xuaW1wb3J0IHsgU2F2ZWRDYXJ0QWN0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvaW5kZXgnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2F2ZWRDYXJ0RWZmZWN0cyB7XG4gIEBFZmZlY3QoKVxuICBsb2FkU2F2ZWRDYXJ0JDogT2JzZXJ2YWJsZTxcbiAgICB8IENhcnRBY3Rpb25zLkxvYWRDYXJ0U3VjY2Vzc1xuICAgIHwgU2F2ZWRDYXJ0QWN0aW9ucy5Mb2FkU2F2ZWRDYXJ0RmFpbFxuICAgIHwgU2F2ZWRDYXJ0QWN0aW9ucy5Mb2FkU2F2ZWRDYXJ0U3VjY2Vzc1xuICA+ID0gdGhpcy5hY3Rpb25zJC5waXBlKFxuICAgIG9mVHlwZShTYXZlZENhcnRBY3Rpb25zLkxPQURfU0FWRURfQ0FSVCksXG4gICAgbWFwKChhY3Rpb246IFNhdmVkQ2FydEFjdGlvbnMuTG9hZFNhdmVkQ2FydCkgPT4gYWN0aW9uLnBheWxvYWQpLFxuICAgIHN3aXRjaE1hcCgoeyB1c2VySWQsIGNhcnRJZCB9KSA9PlxuICAgICAgdGhpcy5zYXZlZENhcnRDb25uZWN0b3IuZ2V0KHVzZXJJZCwgY2FydElkKS5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKHNhdmVkQ2FydDogQ2FydCkgPT4ge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgQ2FydEFjdGlvbnMuTG9hZENhcnRTdWNjZXNzKHtcbiAgICAgICAgICAgICAgdXNlcklkLFxuICAgICAgICAgICAgICBjYXJ0SWQsXG4gICAgICAgICAgICAgIGNhcnQ6IHNhdmVkQ2FydCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IFNhdmVkQ2FydEFjdGlvbnMuTG9hZFNhdmVkQ2FydFN1Y2Nlc3MoeyB1c2VySWQsIGNhcnRJZCB9KSxcbiAgICAgICAgICBdO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PlxuICAgICAgICAgIG9mKFxuICAgICAgICAgICAgbmV3IFNhdmVkQ2FydEFjdGlvbnMuTG9hZFNhdmVkQ2FydEZhaWwoe1xuICAgICAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgICAgIGNhcnRJZCxcbiAgICAgICAgICAgICAgZXJyb3I6IG5vcm1hbGl6ZUh0dHBFcnJvcihlcnJvciksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKTtcblxuICBARWZmZWN0KClcbiAgbG9hZFNhdmVkQ2FydHMkOiBPYnNlcnZhYmxlPFxuICAgIHwgQ2FydEFjdGlvbnMuTG9hZENhcnRzU3VjY2Vzc1xuICAgIHwgU2F2ZWRDYXJ0QWN0aW9ucy5Mb2FkU2F2ZWRDYXJ0c0ZhaWxcbiAgICB8IFNhdmVkQ2FydEFjdGlvbnMuTG9hZFNhdmVkQ2FydHNTdWNjZXNzXG4gID4gPSB0aGlzLmFjdGlvbnMkLnBpcGUoXG4gICAgb2ZUeXBlKFNhdmVkQ2FydEFjdGlvbnMuTE9BRF9TQVZFRF9DQVJUUyksXG4gICAgbWFwKChhY3Rpb246IFNhdmVkQ2FydEFjdGlvbnMuTG9hZFNhdmVkQ2FydHMpID0+IGFjdGlvbi5wYXlsb2FkKSxcbiAgICBzd2l0Y2hNYXAoKHsgdXNlcklkIH0pID0+XG4gICAgICB0aGlzLnNhdmVkQ2FydENvbm5lY3Rvci5nZXRMaXN0KHVzZXJJZCkucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChzYXZlZENhcnRzOiBDYXJ0W10pID0+IHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbmV3IENhcnRBY3Rpb25zLkxvYWRDYXJ0c1N1Y2Nlc3Moc2F2ZWRDYXJ0cyksXG4gICAgICAgICAgICBuZXcgU2F2ZWRDYXJ0QWN0aW9ucy5Mb2FkU2F2ZWRDYXJ0c1N1Y2Nlc3MoeyB1c2VySWQgfSksXG4gICAgICAgICAgXTtcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT5cbiAgICAgICAgICBvZihcbiAgICAgICAgICAgIG5ldyBTYXZlZENhcnRBY3Rpb25zLkxvYWRTYXZlZENhcnRzRmFpbCh7XG4gICAgICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICAgICAgZXJyb3I6IG5vcm1hbGl6ZUh0dHBFcnJvcihlcnJvciksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKTtcblxuICBARWZmZWN0KClcbiAgcmVzdG9yZVNhdmVkQ2FydCQ6IE9ic2VydmFibGU8XG4gICAgfCBTYXZlZENhcnRBY3Rpb25zLlJlc3RvcmVTYXZlZENhcnRGYWlsXG4gICAgfCBTYXZlZENhcnRBY3Rpb25zLlJlc3RvcmVTYXZlZENhcnRTdWNjZXNzXG4gICAgfCBTYXZlZENhcnRBY3Rpb25zLkxvYWRTYXZlZENhcnRzXG4gICAgfCBTYXZlZENhcnRBY3Rpb25zLlNhdmVDYXJ0XG4gICAgfCBDYXJ0QWN0aW9ucy5Mb2FkQ2FydFN1Y2Nlc3NcbiAgICB8IENhcnRBY3Rpb25zLlNldEFjdGl2ZUNhcnRJZFxuICA+ID0gdGhpcy5hY3Rpb25zJC5waXBlKFxuICAgIG9mVHlwZShTYXZlZENhcnRBY3Rpb25zLlJFU1RPUkVfU0FWRURfQ0FSVCksXG4gICAgbWFwKChhY3Rpb246IFNhdmVkQ2FydEFjdGlvbnMuUmVzdG9yZVNhdmVkQ2FydCkgPT4gYWN0aW9uLnBheWxvYWQpLFxuICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuYWN0aXZlQ2FydFNlcnZpY2UuZ2V0QWN0aXZlKCkpLFxuICAgIHN3aXRjaE1hcCgoW3sgdXNlcklkLCBjYXJ0SWQgfSwgYWN0aXZlQ2FydF0pID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbnM6IGFueVtdID0gW107XG5cbiAgICAgIGlmICgoYWN0aXZlQ2FydD8uZW50cmllcyA/PyBbXSkubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoYWN0aXZlQ2FydC5jb2RlKSB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogSW5zdGVhZCBvZiBjYWxsaW5nIHRoZSBTYXZlQ2FydEFjdGlvbiwgd2UgYXJlIGNhbGxpbmcgdGhlIGVkaXQgc2F2ZWQgY2FydFxuICAgICAgICAgICAqIGJlY2F1c2Ugd2UgZG8gbm90IHdhbnQgdG8gY2xlYXIgdGhlIHN0YXRlIHdoZW4gd2Ugc3dhcCBjYXJ0cyBiZXR3ZWVuIGFjdGl2ZSBhbmQgc2F2ZWQgY2FydFxuICAgICAgICAgICAqL1xuICAgICAgICAgIGFjdGlvbnMucHVzaChcbiAgICAgICAgICAgIG5ldyBTYXZlZENhcnRBY3Rpb25zLkVkaXRTYXZlZENhcnQoe1xuICAgICAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgICAgIGNhcnRJZDogYWN0aXZlQ2FydC5jb2RlLFxuICAgICAgICAgICAgICBzYXZlQ2FydE5hbWU6ICcnLFxuICAgICAgICAgICAgICBzYXZlQ2FydERlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5zYXZlZENhcnRDb25uZWN0b3IucmVzdG9yZVNhdmVkQ2FydCh1c2VySWQsIGNhcnRJZCkucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChzYXZlZENhcnQ6IENhcnQpID0+IHtcbiAgICAgICAgICB0aGlzLmdsb2JhbE1lc3NhZ2VTZXJ2aWNlLmFkZChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OlxuICAgICAgICAgICAgICAgIChhY3RpdmVDYXJ0Py5lbnRyaWVzID8/IFtdKS5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICA/ICdzYXZlZENhcnRMaXN0LnN3YXBDYXJ0V2l0aEFjdGl2ZUNhcnQnXG4gICAgICAgICAgICAgICAgICA6ICdzYXZlZENhcnRMaXN0LnN3YXBDYXJ0Tm9BY3RpdmVDYXJ0JyxcbiAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgY2FydE5hbWU6IGNhcnRJZCxcbiAgICAgICAgICAgICAgICBwcmV2aW91c0NhcnROYW1lOiBhY3RpdmVDYXJ0LmNvZGUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgR2xvYmFsTWVzc2FnZVR5cGUuTVNHX1RZUEVfQ09ORklSTUFUSU9OXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAuLi5hY3Rpb25zLFxuICAgICAgICAgICAgbmV3IENhcnRBY3Rpb25zLlNldEFjdGl2ZUNhcnRJZChjYXJ0SWQpLFxuICAgICAgICAgICAgbmV3IENhcnRBY3Rpb25zLkxvYWRDYXJ0U3VjY2Vzcyh7XG4gICAgICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICAgICAgY2FydElkLFxuICAgICAgICAgICAgICBjYXJ0OiBzYXZlZENhcnQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBTYXZlZENhcnRBY3Rpb25zLlJlc3RvcmVTYXZlZENhcnRTdWNjZXNzKHsgdXNlcklkLCBjYXJ0SWQgfSksXG4gICAgICAgICAgXTtcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT5cbiAgICAgICAgICBvZihcbiAgICAgICAgICAgIG5ldyBTYXZlZENhcnRBY3Rpb25zLlJlc3RvcmVTYXZlZENhcnRGYWlsKHtcbiAgICAgICAgICAgICAgdXNlcklkLFxuICAgICAgICAgICAgICBjYXJ0SWQsXG4gICAgICAgICAgICAgIGVycm9yOiBub3JtYWxpemVIdHRwRXJyb3IoZXJyb3IpLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSlcbiAgKTtcblxuICBARWZmZWN0KClcbiAgc2F2ZUNhcnQkOiBPYnNlcnZhYmxlPFxuICAgIHwgU2F2ZWRDYXJ0QWN0aW9ucy5TYXZlQ2FydEZhaWxcbiAgICB8IFNhdmVkQ2FydEFjdGlvbnMuU2F2ZUNhcnRTdWNjZXNzXG4gICAgfCBTYXZlZENhcnRBY3Rpb25zLlNhdmVDYXJ0XG4gICAgfCBDYXJ0QWN0aW9ucy5Mb2FkQ2FydFN1Y2Nlc3NcbiAgICB8IENhcnRBY3Rpb25zLkNsZWFyQ2FydFN0YXRlXG4gID4gPSB0aGlzLmFjdGlvbnMkLnBpcGUoXG4gICAgb2ZUeXBlKFNhdmVkQ2FydEFjdGlvbnMuU0FWRV9DQVJUKSxcbiAgICBtYXAoKGFjdGlvbjogU2F2ZWRDYXJ0QWN0aW9ucy5TYXZlQ2FydCkgPT4gYWN0aW9uLnBheWxvYWQpLFxuICAgIHN3aXRjaE1hcCgoeyB1c2VySWQsIGNhcnRJZCwgc2F2ZUNhcnROYW1lLCBzYXZlQ2FydERlc2NyaXB0aW9uIH0pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnNhdmVkQ2FydENvbm5lY3RvclxuICAgICAgICAuc2F2ZUNhcnQodXNlcklkLCBjYXJ0SWQsIHNhdmVDYXJ0TmFtZSwgc2F2ZUNhcnREZXNjcmlwdGlvbilcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKChzYXZlZENhcnQ6IENhcnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgIG5ldyBDYXJ0QWN0aW9ucy5DbGVhckNhcnRTdGF0ZSgpLFxuICAgICAgICAgICAgICBuZXcgQ2FydEFjdGlvbnMuTG9hZENhcnRTdWNjZXNzKHtcbiAgICAgICAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgICAgICAgY2FydElkLFxuICAgICAgICAgICAgICAgIGNhcnQ6IHNhdmVkQ2FydCxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIG5ldyBTYXZlZENhcnRBY3Rpb25zLlNhdmVDYXJ0U3VjY2Vzcyh7XG4gICAgICAgICAgICAgICAgdXNlcklkLFxuICAgICAgICAgICAgICAgIGNhcnRJZCxcbiAgICAgICAgICAgICAgICBzYXZlQ2FydE5hbWUsXG4gICAgICAgICAgICAgICAgc2F2ZUNhcnREZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT5cbiAgICAgICAgICAgIG9mKFxuICAgICAgICAgICAgICBuZXcgU2F2ZWRDYXJ0QWN0aW9ucy5TYXZlQ2FydEZhaWwoe1xuICAgICAgICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICAgICAgICBjYXJ0SWQsXG4gICAgICAgICAgICAgICAgc2F2ZUNhcnROYW1lLFxuICAgICAgICAgICAgICAgIHNhdmVDYXJ0RGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgZXJyb3I6IG5vcm1hbGl6ZUh0dHBFcnJvcihlcnJvciksXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH0pXG4gICk7XG5cbiAgQEVmZmVjdCgpXG4gIGVkaXRTYXZlZENhcnQkOiBPYnNlcnZhYmxlPFxuICAgIHwgU2F2ZWRDYXJ0QWN0aW9ucy5FZGl0U2F2ZWRDYXJ0RmFpbFxuICAgIHwgU2F2ZWRDYXJ0QWN0aW9ucy5FZGl0U2F2ZWRDYXJ0U3VjY2Vzc1xuICAgIHwgU2F2ZWRDYXJ0QWN0aW9ucy5FZGl0U2F2ZWRDYXJ0XG4gICAgfCBDYXJ0QWN0aW9ucy5Mb2FkQ2FydFN1Y2Nlc3NcbiAgPiA9IHRoaXMuYWN0aW9ucyQucGlwZShcbiAgICBvZlR5cGUoU2F2ZWRDYXJ0QWN0aW9ucy5FRElUX1NBVkVEX0NBUlQpLFxuICAgIG1hcCgoYWN0aW9uOiBTYXZlZENhcnRBY3Rpb25zLkVkaXRTYXZlZENhcnQpID0+IGFjdGlvbi5wYXlsb2FkKSxcbiAgICBzd2l0Y2hNYXAoKHsgdXNlcklkLCBjYXJ0SWQsIHNhdmVDYXJ0TmFtZSwgc2F2ZUNhcnREZXNjcmlwdGlvbiB9KSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5zYXZlZENhcnRDb25uZWN0b3JcbiAgICAgICAgLnNhdmVDYXJ0KHVzZXJJZCwgY2FydElkLCBzYXZlQ2FydE5hbWUsIHNhdmVDYXJ0RGVzY3JpcHRpb24pXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcCgoc2F2ZWRDYXJ0OiBDYXJ0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICBuZXcgQ2FydEFjdGlvbnMuTG9hZENhcnRTdWNjZXNzKHtcbiAgICAgICAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgICAgICAgY2FydElkLFxuICAgICAgICAgICAgICAgIGNhcnQ6IHNhdmVkQ2FydCxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIG5ldyBTYXZlZENhcnRBY3Rpb25zLkVkaXRTYXZlZENhcnRTdWNjZXNzKHtcbiAgICAgICAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgICAgICAgY2FydElkLFxuICAgICAgICAgICAgICAgIHNhdmVDYXJ0TmFtZSxcbiAgICAgICAgICAgICAgICBzYXZlQ2FydERlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfSksXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PlxuICAgICAgICAgICAgb2YoXG4gICAgICAgICAgICAgIG5ldyBTYXZlZENhcnRBY3Rpb25zLkVkaXRTYXZlZENhcnRGYWlsKHtcbiAgICAgICAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgICAgICAgY2FydElkLFxuICAgICAgICAgICAgICAgIHNhdmVDYXJ0TmFtZSxcbiAgICAgICAgICAgICAgICBzYXZlQ2FydERlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIGVycm9yOiBub3JtYWxpemVIdHRwRXJyb3IoZXJyb3IpLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9KVxuICApO1xuXG4gIEBFZmZlY3QoKVxuICBjbG9uZVNhdmVkQ2FydCQ6IE9ic2VydmFibGU8XG4gICAgfCBTYXZlZENhcnRBY3Rpb25zLkNsb25lU2F2ZWRDYXJ0RmFpbFxuICAgIHwgU2F2ZWRDYXJ0QWN0aW9ucy5DbG9uZVNhdmVkQ2FydFN1Y2Nlc3NcbiAgICB8IFNhdmVkQ2FydEFjdGlvbnMuQ2xvbmVTYXZlZENhcnRcbiAgICB8IFNhdmVkQ2FydEFjdGlvbnMuUmVzdG9yZVNhdmVkQ2FydFxuICAgIHwgU2F2ZWRDYXJ0QWN0aW9ucy5Mb2FkU2F2ZWRDYXJ0c1xuICA+ID0gdGhpcy5hY3Rpb25zJC5waXBlKFxuICAgIG9mVHlwZShTYXZlZENhcnRBY3Rpb25zLkNMT05FX1NBVkVEX0NBUlQpLFxuICAgIG1hcCgoYWN0aW9uOiBTYXZlZENhcnRBY3Rpb25zLkNsb25lU2F2ZWRDYXJ0KSA9PiBhY3Rpb24ucGF5bG9hZCksXG4gICAgc3dpdGNoTWFwKCh7IHVzZXJJZCwgY2FydElkLCBzYXZlQ2FydE5hbWUgfSkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuc2F2ZWRDYXJ0Q29ubmVjdG9yXG4gICAgICAgIC5jbG9uZVNhdmVkQ2FydCh1c2VySWQsIGNhcnRJZCwgc2F2ZUNhcnROYW1lKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoKF8pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgIG5ldyBTYXZlZENhcnRBY3Rpb25zLkNsb25lU2F2ZWRDYXJ0U3VjY2Vzcyh7XG4gICAgICAgICAgICAgICAgdXNlcklkLFxuICAgICAgICAgICAgICAgIGNhcnRJZCxcbiAgICAgICAgICAgICAgICBzYXZlQ2FydE5hbWUsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBuZXcgU2F2ZWRDYXJ0QWN0aW9ucy5SZXN0b3JlU2F2ZWRDYXJ0KHtcbiAgICAgICAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgICAgICAgY2FydElkLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgbmV3IFNhdmVkQ2FydEFjdGlvbnMuTG9hZFNhdmVkQ2FydHMoeyB1c2VySWQgfSksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT5cbiAgICAgICAgICAgIG9mKFxuICAgICAgICAgICAgICBuZXcgU2F2ZWRDYXJ0QWN0aW9ucy5DbG9uZVNhdmVkQ2FydEZhaWwoe1xuICAgICAgICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICAgICAgICBjYXJ0SWQsXG4gICAgICAgICAgICAgICAgc2F2ZUNhcnROYW1lLFxuICAgICAgICAgICAgICAgIGVycm9yOiBub3JtYWxpemVIdHRwRXJyb3IoZXJyb3IpLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9KVxuICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWN0aW9ucyQ6IEFjdGlvbnMsXG4gICAgcHJpdmF0ZSBzYXZlZENhcnRDb25uZWN0b3I6IFNhdmVkQ2FydENvbm5lY3RvcixcbiAgICBwcml2YXRlIGFjdGl2ZUNhcnRTZXJ2aWNlOiBBY3RpdmVDYXJ0U2VydmljZSxcbiAgICBwcml2YXRlIGdsb2JhbE1lc3NhZ2VTZXJ2aWNlOiBHbG9iYWxNZXNzYWdlU2VydmljZVxuICApIHt9XG59XG4iXX0=