@spartacus/core
Version:
Spartacus - the core framework
141 lines • 20.8 kB
JavaScript
import { Injectable } from '@angular/core';
import { BehaviorSubject, combineLatest, of } from 'rxjs';
import { filter, map, shareReplay, switchMap, take, tap } from 'rxjs/operators';
import { OCC_USER_ID_ANONYMOUS } from '../../occ/utils/occ-constants';
import * as i0 from "@angular/core";
import * as i1 from "@ngrx/store";
import * as i2 from "../../user/facade/user.service";
import * as i3 from "./multi-cart.service";
import * as i4 from "../../site-context/facade/base-site.service";
import * as i5 from "../services/cart-config.service";
import * as i6 from "../../auth/user-auth/facade/user-id.service";
export class SelectiveCartService {
constructor(store, userService, multiCartService, baseSiteService, cartConfigService, userIdService) {
this.store = store;
this.userService = userService;
this.multiCartService = multiCartService;
this.baseSiteService = baseSiteService;
this.cartConfigService = cartConfigService;
this.userIdService = userIdService;
this.cartId$ = new BehaviorSubject(undefined);
this.PREVIOUS_USER_ID_INITIAL_VALUE = 'PREVIOUS_USER_ID_INITIAL_VALUE';
this.previousUserId = this.PREVIOUS_USER_ID_INITIAL_VALUE;
this.cartSelector$ = this.cartId$.pipe(switchMap((cartId) => {
this.cartId = cartId;
return this.multiCartService.getCartEntity(cartId);
}));
combineLatest([
this.userService.get(),
this.baseSiteService.getActive(),
]).subscribe(([user, activeBaseSite]) => {
if (user && user.customerId && activeBaseSite) {
this.customerId = user.customerId;
this.cartId$.next(`selectivecart${activeBaseSite}${this.customerId}`);
}
else if (user && !user.customerId) {
this.cartId$.next(undefined);
}
});
this.userIdService.getUserId().subscribe((userId) => {
this.userId = userId;
if (this.isJustLoggedIn(userId)) {
this.load();
}
this.previousUserId = userId;
});
this.selectiveCart$ = this.cartSelector$.pipe(map((cartEntity) => {
return {
cart: cartEntity.value,
loading: cartEntity.loading,
loaded: (cartEntity.error || cartEntity.success) && !cartEntity.loading,
};
}), filter(({ loading }) => !loading), tap(({ cart, loaded }) => {
if (this.cartId && this.isEmpty(cart) && !loaded) {
this.load();
}
}), map(({ cart }) => (cart ? cart : {})), shareReplay({ bufferSize: 1, refCount: true }));
}
getCart() {
return this.selectiveCart$;
}
getEntries() {
return this.multiCartService.getEntries(this.cartId);
}
/**
* Returns true when selective cart is stable (not loading and not pending processes on cart)
*/
isStable() {
return this.cartId$.pipe(switchMap((cartId) => this.multiCartService.isStable(cartId)));
}
/**
* Loads logged user's selective cart
*/
load() {
if (this.isLoggedIn(this.userId) && this.cartId) {
this.multiCartService.loadCart({
userId: this.userId,
cartId: this.cartId,
});
}
}
addEntry(productCode, quantity) {
let loadAttempted = false;
this.cartSelector$
.pipe(filter(() => !loadAttempted), switchMap((cartState) => {
if (this.isEmpty(cartState.value) && !cartState.loading) {
loadAttempted = true;
this.load();
}
return of(cartState);
}), filter((cartState) => !this.isEmpty(cartState.value)), take(1))
.subscribe(() => {
this.multiCartService.addEntry(this.userId, this.cartId, productCode, quantity);
});
}
removeEntry(entry) {
this.multiCartService.removeEntry(this.userId, this.cartId, entry.entryNumber);
}
updateEntry(entryNumber, quantity) {
this.multiCartService.updateEntry(this.userId, this.cartId, entryNumber, quantity);
}
getEntry(productCode) {
return this.multiCartService.getEntry(this.cartId, productCode);
}
/**
* Indicates if selectiveCart feature is enabled based on cart configuration.
*/
isEnabled() {
return this.cartConfigService.isSelectiveCartEnabled();
}
/**
* Indicates if given cart is empty.
* Returns true is cart is undefined, null or is an empty object.
*/
isEmpty(cart) {
return (!cart || (typeof cart === 'object' && Object.keys(cart).length === 0));
}
/**
* Indicates if a given user is logged in on account different than preceding user account
*/
isJustLoggedIn(userId) {
return (this.isLoggedIn(userId) &&
this.previousUserId !== userId && // *just* logged in
this.previousUserId !== this.PREVIOUS_USER_ID_INITIAL_VALUE // not app initialization
);
}
/**
* Indicates if given user is logged in
*/
isLoggedIn(userId) {
return typeof userId !== 'undefined' && userId !== OCC_USER_ID_ANONYMOUS;
}
}
SelectiveCartService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: SelectiveCartService, deps: [{ token: i1.Store }, { token: i2.UserService }, { token: i3.MultiCartService }, { token: i4.BaseSiteService }, { token: i5.CartConfigService }, { token: i6.UserIdService }], target: i0.ɵɵFactoryTarget.Injectable });
SelectiveCartService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: SelectiveCartService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: SelectiveCartService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i1.Store }, { type: i2.UserService }, { type: i3.MultiCartService }, { type: i4.BaseSiteService }, { type: i5.CartConfigService }, { type: i6.UserIdService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aXZlLWNhcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2NhcnQvZmFjYWRlL3NlbGVjdGl2ZS1jYXJ0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJaEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0JBQStCLENBQUM7Ozs7Ozs7O0FBV3RFLE1BQU0sT0FBTyxvQkFBb0I7SUFvQi9CLFlBQ1ksS0FBZ0MsRUFDaEMsV0FBd0IsRUFDeEIsZ0JBQWtDLEVBQ2xDLGVBQWdDLEVBQ2hDLGlCQUFvQyxFQUNwQyxhQUE0QjtRQUw1QixVQUFLLEdBQUwsS0FBSyxDQUEyQjtRQUNoQyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBckI5QixZQUFPLEdBQTRCLElBQUksZUFBZSxDQUM5RCxTQUFTLENBQ1YsQ0FBQztRQUVpQixtQ0FBOEIsR0FDL0MsZ0NBQWdDLENBQUM7UUFDekIsbUJBQWMsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUM7UUFFckQsa0JBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDekMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDbkIs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UUFDakMsT0FBTyxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksTUFBTSxLQUFLLHFCQUFxQixDQUFDO0lBQzNFLENBQUM7O2lIQXpMVSxvQkFBb0I7cUhBQXBCLG9CQUFvQixjQUZuQixNQUFNOzJGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCB0YWtlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBVc2VySWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYXV0aC91c2VyLWF1dGgvZmFjYWRlL3VzZXItaWQuc2VydmljZSc7XG5pbXBvcnQgeyBDYXJ0IH0gZnJvbSAnLi4vLi4vbW9kZWwvY2FydC5tb2RlbCc7XG5pbXBvcnQgeyBPcmRlckVudHJ5IH0gZnJvbSAnLi4vLi4vbW9kZWwvb3JkZXIubW9kZWwnO1xuaW1wb3J0IHsgT0NDX1VTRVJfSURfQU5PTllNT1VTIH0gZnJvbSAnLi4vLi4vb2NjL3V0aWxzL29jYy1jb25zdGFudHMnO1xuaW1wb3J0IHsgQmFzZVNpdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2l0ZS1jb250ZXh0L2ZhY2FkZS9iYXNlLXNpdGUuc2VydmljZSc7XG5pbXBvcnQgeyBMb2FkZXJTdGF0ZSB9IGZyb20gJy4uLy4uL3N0YXRlL3V0aWxzL2xvYWRlci9sb2FkZXItc3RhdGUnO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi8uLi91c2VyL2ZhY2FkZS91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FydENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jYXJ0LWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IFN0YXRlV2l0aE11bHRpQ2FydCB9IGZyb20gJy4uL3N0b3JlL211bHRpLWNhcnQtc3RhdGUnO1xuaW1wb3J0IHsgTXVsdGlDYXJ0U2VydmljZSB9IGZyb20gJy4vbXVsdGktY2FydC5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFNlbGVjdGl2ZUNhcnRTZXJ2aWNlIHtcbiAgcHJvdGVjdGVkIGN1c3RvbWVySWQ6IHN0cmluZztcbiAgcHJvdGVjdGVkIHVzZXJJZDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgY2FydElkOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBzZWxlY3RpdmVDYXJ0JDogT2JzZXJ2YWJsZTxDYXJ0PjtcbiAgcHJvdGVjdGVkIGNhcnRJZCQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KFxuICAgIHVuZGVmaW5lZFxuICApO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBQUkVWSU9VU19VU0VSX0lEX0lOSVRJQUxfVkFMVUUgPVxuICAgICdQUkVWSU9VU19VU0VSX0lEX0lOSVRJQUxfVkFMVUUnO1xuICBwcm90ZWN0ZWQgcHJldmlvdXNVc2VySWQgPSB0aGlzLlBSRVZJT1VTX1VTRVJfSURfSU5JVElBTF9WQUxVRTtcblxuICBwcm90ZWN0ZWQgY2FydFNlbGVjdG9yJCA9IHRoaXMuY2FydElkJC5waXBlKFxuICAgIHN3aXRjaE1hcCgoY2FydElkKSA9PiB7XG4gICAgICB0aGlzLmNhcnRJZCA9IGNhcnRJZDtcbiAgICAgIHJldHVybiB0aGlzLm11bHRpQ2FydFNlcnZpY2UuZ2V0Q2FydEVudGl0eShjYXJ0SWQpO1xuICAgIH0pXG4gICk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHN0b3JlOiBTdG9yZTxTdGF0ZVdpdGhNdWx0aUNhcnQ+LFxuICAgIHByb3RlY3RlZCB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIG11bHRpQ2FydFNlcnZpY2U6IE11bHRpQ2FydFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGJhc2VTaXRlU2VydmljZTogQmFzZVNpdGVTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjYXJ0Q29uZmlnU2VydmljZTogQ2FydENvbmZpZ1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHVzZXJJZFNlcnZpY2U6IFVzZXJJZFNlcnZpY2VcbiAgKSB7XG4gICAgY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnVzZXJTZXJ2aWNlLmdldCgpLFxuICAgICAgdGhpcy5iYXNlU2l0ZVNlcnZpY2UuZ2V0QWN0aXZlKCksXG4gICAgXSkuc3Vic2NyaWJlKChbdXNlciwgYWN0aXZlQmFzZVNpdGVdKSA9PiB7XG4gICAgICBpZiAodXNlciAmJiB1c2VyLmN1c3RvbWVySWQgJiYgYWN0aXZlQmFzZVNpdGUpIHtcbiAgICAgICAgdGhpcy5jdXN0b21lcklkID0gdXNlci5jdXN0b21lcklkO1xuICAgICAgICB0aGlzLmNhcnRJZCQubmV4dChgc2VsZWN0aXZlY2FydCR7YWN0aXZlQmFzZVNpdGV9JHt0aGlzLmN1c3RvbWVySWR9YCk7XG4gICAgICB9IGVsc2UgaWYgKHVzZXIgJiYgIXVzZXIuY3VzdG9tZXJJZCkge1xuICAgICAgICB0aGlzLmNhcnRJZCQubmV4dCh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy51c2VySWRTZXJ2aWNlLmdldFVzZXJJZCgpLnN1YnNjcmliZSgodXNlcklkKSA9PiB7XG4gICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDtcblxuICAgICAgaWYgKHRoaXMuaXNKdXN0TG9nZ2VkSW4odXNlcklkKSkge1xuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcmV2aW91c1VzZXJJZCA9IHVzZXJJZDtcbiAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0aXZlQ2FydCQgPSB0aGlzLmNhcnRTZWxlY3RvciQucGlwZShcbiAgICAgIG1hcChcbiAgICAgICAgKFxuICAgICAgICAgIGNhcnRFbnRpdHk6IExvYWRlclN0YXRlPENhcnQ+XG4gICAgICAgICk6IHtcbiAgICAgICAgICBjYXJ0OiBDYXJ0O1xuICAgICAgICAgIGxvYWRpbmc6IGJvb2xlYW47XG4gICAgICAgICAgbG9hZGVkOiBib29sZWFuO1xuICAgICAgICB9ID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2FydDogY2FydEVudGl0eS52YWx1ZSxcbiAgICAgICAgICAgIGxvYWRpbmc6IGNhcnRFbnRpdHkubG9hZGluZyxcbiAgICAgICAgICAgIGxvYWRlZDpcbiAgICAgICAgICAgICAgKGNhcnRFbnRpdHkuZXJyb3IgfHwgY2FydEVudGl0eS5zdWNjZXNzKSAmJiAhY2FydEVudGl0eS5sb2FkaW5nLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICksXG4gICAgICBmaWx0ZXIoKHsgbG9hZGluZyB9KSA9PiAhbG9hZGluZyksXG4gICAgICB0YXAoKHsgY2FydCwgbG9hZGVkIH0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2FydElkICYmIHRoaXMuaXNFbXB0eShjYXJ0KSAmJiAhbG9hZGVkKSB7XG4gICAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgbWFwKCh7IGNhcnQgfSkgPT4gKGNhcnQgPyBjYXJ0IDoge30pKSxcbiAgICAgIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0Q2FydCgpOiBPYnNlcnZhYmxlPENhcnQ+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RpdmVDYXJ0JDtcbiAgfVxuXG4gIGdldEVudHJpZXMoKTogT2JzZXJ2YWJsZTxPcmRlckVudHJ5W10+IHtcbiAgICByZXR1cm4gdGhpcy5tdWx0aUNhcnRTZXJ2aWNlLmdldEVudHJpZXModGhpcy5jYXJ0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHNlbGVjdGl2ZSBjYXJ0IGlzIHN0YWJsZSAobm90IGxvYWRpbmcgYW5kIG5vdCBwZW5kaW5nIHByb2Nlc3NlcyBvbiBjYXJ0KVxuICAgKi9cbiAgaXNTdGFibGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FydElkJC5waXBlKFxuICAgICAgc3dpdGNoTWFwKChjYXJ0SWQpID0+IHRoaXMubXVsdGlDYXJ0U2VydmljZS5pc1N0YWJsZShjYXJ0SWQpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgbG9nZ2VkIHVzZXIncyBzZWxlY3RpdmUgY2FydFxuICAgKi9cbiAgcHJvdGVjdGVkIGxvYWQoKSB7XG4gICAgaWYgKHRoaXMuaXNMb2dnZWRJbih0aGlzLnVzZXJJZCkgJiYgdGhpcy5jYXJ0SWQpIHtcbiAgICAgIHRoaXMubXVsdGlDYXJ0U2VydmljZS5sb2FkQ2FydCh7XG4gICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQsXG4gICAgICAgIGNhcnRJZDogdGhpcy5jYXJ0SWQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhZGRFbnRyeShwcm9kdWN0Q29kZTogc3RyaW5nLCBxdWFudGl0eTogbnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IGxvYWRBdHRlbXB0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNhcnRTZWxlY3RvciRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKCkgPT4gIWxvYWRBdHRlbXB0ZWQpLFxuICAgICAgICBzd2l0Y2hNYXAoKGNhcnRTdGF0ZSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzRW1wdHkoY2FydFN0YXRlLnZhbHVlKSAmJiAhY2FydFN0YXRlLmxvYWRpbmcpIHtcbiAgICAgICAgICAgIGxvYWRBdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvZihjYXJ0U3RhdGUpO1xuICAgICAgICB9KSxcbiAgICAgICAgZmlsdGVyKChjYXJ0U3RhdGUpID0+ICF0aGlzLmlzRW1wdHkoY2FydFN0YXRlLnZhbHVlKSksXG4gICAgICAgIHRha2UoMSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLm11bHRpQ2FydFNlcnZpY2UuYWRkRW50cnkoXG4gICAgICAgICAgdGhpcy51c2VySWQsXG4gICAgICAgICAgdGhpcy5jYXJ0SWQsXG4gICAgICAgICAgcHJvZHVjdENvZGUsXG4gICAgICAgICAgcXVhbnRpdHlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlRW50cnkoZW50cnk6IE9yZGVyRW50cnkpOiB2b2lkIHtcbiAgICB0aGlzLm11bHRpQ2FydFNlcnZpY2UucmVtb3ZlRW50cnkoXG4gICAgICB0aGlzLnVzZXJJZCxcbiAgICAgIHRoaXMuY2FydElkLFxuICAgICAgZW50cnkuZW50cnlOdW1iZXJcbiAgICApO1xuICB9XG5cbiAgdXBkYXRlRW50cnkoZW50cnlOdW1iZXI6IG51bWJlciwgcXVhbnRpdHk6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubXVsdGlDYXJ0U2VydmljZS51cGRhdGVFbnRyeShcbiAgICAgIHRoaXMudXNlcklkLFxuICAgICAgdGhpcy5jYXJ0SWQsXG4gICAgICBlbnRyeU51bWJlcixcbiAgICAgIHF1YW50aXR5XG4gICAgKTtcbiAgfVxuXG4gIGdldEVudHJ5KHByb2R1Y3RDb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE9yZGVyRW50cnk+IHtcbiAgICByZXR1cm4gdGhpcy5tdWx0aUNhcnRTZXJ2aWNlLmdldEVudHJ5KHRoaXMuY2FydElkLCBwcm9kdWN0Q29kZSk7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHNlbGVjdGl2ZUNhcnQgZmVhdHVyZSBpcyBlbmFibGVkIGJhc2VkIG9uIGNhcnQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGlzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jYXJ0Q29uZmlnU2VydmljZS5pc1NlbGVjdGl2ZUNhcnRFbmFibGVkKCk7XG4gIH1cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBnaXZlbiBjYXJ0IGlzIGVtcHR5LlxuICAgKiBSZXR1cm5zIHRydWUgaXMgY2FydCBpcyB1bmRlZmluZWQsIG51bGwgb3IgaXMgYW4gZW1wdHkgb2JqZWN0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGlzRW1wdHkoY2FydDogQ2FydCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhY2FydCB8fCAodHlwZW9mIGNhcnQgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKGNhcnQpLmxlbmd0aCA9PT0gMClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBhIGdpdmVuIHVzZXIgaXMgbG9nZ2VkIGluIG9uIGFjY291bnQgZGlmZmVyZW50IHRoYW4gcHJlY2VkaW5nIHVzZXIgYWNjb3VudFxuICAgKi9cbiAgcHJvdGVjdGVkIGlzSnVzdExvZ2dlZEluKHVzZXJJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaXNMb2dnZWRJbih1c2VySWQpICYmXG4gICAgICB0aGlzLnByZXZpb3VzVXNlcklkICE9PSB1c2VySWQgJiYgLy8gKmp1c3QqIGxvZ2dlZCBpblxuICAgICAgdGhpcy5wcmV2aW91c1VzZXJJZCAhPT0gdGhpcy5QUkVWSU9VU19VU0VSX0lEX0lOSVRJQUxfVkFMVUUgLy8gbm90IGFwcCBpbml0aWFsaXphdGlvblxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIGdpdmVuIHVzZXIgaXMgbG9nZ2VkIGluXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNMb2dnZWRJbih1c2VySWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgdXNlcklkICE9PSAndW5kZWZpbmVkJyAmJiB1c2VySWQgIT09IE9DQ19VU0VSX0lEX0FOT05ZTU9VUztcbiAgfVxufVxuIl19