@spartacus/storefront
Version:
Spartacus Storefront is a package that you can include in your application, which allows you to add default storefront features.
88 lines • 15.1 kB
JavaScript
import { ChangeDetectorRef, Directive, EventEmitter, Input, Optional, Output, } from '@angular/core';
import { finalize, tap } from 'rxjs/operators';
import { ComponentCreateEvent, ComponentDestroyEvent, } from './events/component.event';
import * as i0 from "@angular/core";
import * as i1 from "../../services/cms-components.service";
import * as i2 from "@spartacus/core";
import * as i3 from "./services/component-handler.service";
import * as i4 from "./services/cms-injector.service";
/**
* Directive used to facilitate instantiation of CMS driven dynamic components
*/
export class ComponentWrapperDirective {
constructor(vcr, cmsComponentsService, injector, dynamicAttributeService, renderer, componentHandler, cmsInjector, eventService) {
this.vcr = vcr;
this.cmsComponentsService = cmsComponentsService;
this.injector = injector;
this.dynamicAttributeService = dynamicAttributeService;
this.renderer = renderer;
this.componentHandler = componentHandler;
this.cmsInjector = cmsInjector;
this.eventService = eventService;
this.cxComponentRef = new EventEmitter();
}
ngOnInit() {
this.cmsComponentsService
.determineMappings([this.cxComponentWrapper.flexType])
.subscribe(() => {
if (this.cmsComponentsService.shouldRender(this.cxComponentWrapper.flexType)) {
this.launchComponent();
}
});
}
launchComponent() {
const componentMapping = this.cmsComponentsService.getMapping(this.cxComponentWrapper.flexType);
if (!componentMapping) {
return;
}
this.launcherResource = this.componentHandler
.getLauncher(componentMapping, this.vcr, this.cmsInjector.getInjector(this.cxComponentWrapper.flexType, this.cxComponentWrapper.uid, this.injector), this.cmsComponentsService.getModule(this.cxComponentWrapper.flexType))
.pipe(tap(({ elementRef, componentRef }) => {
this.cmpRef = componentRef;
this.cxComponentRef.emit(componentRef);
this.dispatchEvent(ComponentCreateEvent, elementRef);
this.decorate(elementRef);
this.injector.get(ChangeDetectorRef).markForCheck();
}), finalize(() => this.dispatchEvent(ComponentDestroyEvent)))
.subscribe();
}
/**
* Dispatch the component event.
*
* The event is dispatched during creation and removal of the component.
*/
dispatchEvent(event, elementRef) {
var _a;
const payload = {
typeCode: this.cxComponentWrapper.typeCode,
id: this.cxComponentWrapper.uid,
};
if (event === ComponentCreateEvent) {
payload.host = elementRef === null || elementRef === void 0 ? void 0 : elementRef.nativeElement;
}
(_a = this.eventService) === null || _a === void 0 ? void 0 : _a.dispatch(payload, event);
}
decorate(elementRef) {
this.dynamicAttributeService.addAttributesToComponent(elementRef.nativeElement, this.renderer, this.cxComponentWrapper);
}
ngOnDestroy() {
if (this.launcherResource) {
this.launcherResource.unsubscribe();
}
}
}
ComponentWrapperDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ComponentWrapperDirective, deps: [{ token: i0.ViewContainerRef }, { token: i1.CmsComponentsService }, { token: i0.Injector }, { token: i2.DynamicAttributeService }, { token: i0.Renderer2 }, { token: i3.ComponentHandlerService }, { token: i4.CmsInjectorService }, { token: i2.EventService, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
ComponentWrapperDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.0.5", type: ComponentWrapperDirective, selector: "[cxComponentWrapper]", inputs: { cxComponentWrapper: "cxComponentWrapper" }, outputs: { cxComponentRef: "cxComponentRef" }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ComponentWrapperDirective, decorators: [{
type: Directive,
args: [{
selector: '[cxComponentWrapper]',
}]
}], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i1.CmsComponentsService }, { type: i0.Injector }, { type: i2.DynamicAttributeService }, { type: i0.Renderer2 }, { type: i3.ComponentHandlerService }, { type: i4.CmsInjectorService }, { type: i2.EventService, decorators: [{
type: Optional
}] }]; }, propDecorators: { cxComponentWrapper: [{
type: Input
}], cxComponentRef: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LXdyYXBwZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RvcmVmcm9udGxpYi9jbXMtc3RydWN0dXJlL3BhZ2UvY29tcG9uZW50L2NvbXBvbmVudC13cmFwcGVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsaUJBQWlCLEVBRWpCLFNBQVMsRUFFVCxZQUFZLEVBRVosS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEdBSVAsTUFBTSxlQUFlLENBQUM7QUFPdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvQyxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLHFCQUFxQixHQUV0QixNQUFNLDBCQUEwQixDQUFDOzs7Ozs7QUFJbEM7O0dBRUc7QUFJSCxNQUFNLE9BQU8seUJBQXlCO0lBc0NwQyxZQUNZLEdBQXFCLEVBQ3JCLG9CQUEwQyxFQUMxQyxRQUFrQixFQUNsQix1QkFBZ0QsRUFDaEQsUUFBbUIsRUFDbkIsZ0JBQXlDLEVBQ3pDLFdBQStCLEVBQ25CLFlBQTJCO1FBUHZDLFFBQUcsR0FBSCxHQUFHLENBQWtCO1FBQ3JCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQiw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQXlCO1FBQ2hELGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF5QjtRQUN6QyxnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFDbkIsaUJBQVksR0FBWixZQUFZLENBQWU7UUE1Q3pDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7SUE2QzlELENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLG9CQUFvQjthQUN0QixpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNyRCxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFDRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUNwQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUNqQyxFQUNEO2dCQUNBLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzthQUN4QjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLGVBQWU7UUFDckIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUMzRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUNqQyxDQUFDO1FBRUYsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3JCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCO2FBQzFDLFdBQVcsQ0FDVixnQkFBZ0IsRUFDaEIsSUFBSSxDQUFDLEdBQUcsRUFDUixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FDMUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FDZCxFQUNELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUN0RTthQUNBLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFO1lBQ25DLElBQUksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDO1lBRTNCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRXZDLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RELENBQUMsQ0FBQyxFQUNGLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FDMUQ7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLGFBQWEsQ0FDckIsS0FBMkIsRUFDM0IsVUFBdUI7O1FBRXZCLE1BQU0sT0FBTyxHQUFHO1lBQ2QsUUFBUSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRO1lBQzFDLEVBQUUsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRztTQUNkLENBQUM7UUFDcEIsSUFBSSxLQUFLLEtBQUssb0JBQW9CLEVBQUU7WUFDakMsT0FBZ0MsQ0FBQyxJQUFJLEdBQUcsVUFBVSxhQUFWLFVBQVUsdUJBQVYsVUFBVSxDQUFFLGFBQWEsQ0FBQztTQUNwRTtRQUNELE1BQUEsSUFBSSxDQUFDLFlBQVksMENBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRU8sUUFBUSxDQUFDLFVBQXNCO1FBQ3JDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyx3QkFBd0IsQ0FDbkQsVUFBVSxDQUFDLGFBQWEsRUFDeEIsSUFBSSxDQUFDLFFBQVEsRUFDYixJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNyQztJQUNILENBQUM7O3NIQWpJVSx5QkFBeUI7MEdBQXpCLHlCQUF5QjsyRkFBekIseUJBQXlCO2tCQUhyQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxzQkFBc0I7aUJBQ2pDOzswQkErQ0ksUUFBUTs0Q0E3Q0Ysa0JBQWtCO3NCQUExQixLQUFLO2dCQUNJLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50UmVmLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxuICBUeXBlLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENvbnRlbnRTbG90Q29tcG9uZW50RGF0YSxcbiAgRHluYW1pY0F0dHJpYnV0ZVNlcnZpY2UsXG4gIEV2ZW50U2VydmljZSxcbn0gZnJvbSAnQHNwYXJ0YWN1cy9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmluYWxpemUsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENtc0NvbXBvbmVudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY21zLWNvbXBvbmVudHMuc2VydmljZSc7XG5pbXBvcnQge1xuICBDb21wb25lbnRDcmVhdGVFdmVudCxcbiAgQ29tcG9uZW50RGVzdHJveUV2ZW50LFxuICBDb21wb25lbnRFdmVudCxcbn0gZnJvbSAnLi9ldmVudHMvY29tcG9uZW50LmV2ZW50JztcbmltcG9ydCB7IENtc0luamVjdG9yU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvY21zLWluamVjdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tcG9uZW50SGFuZGxlclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2NvbXBvbmVudC1oYW5kbGVyLnNlcnZpY2UnO1xuXG4vKipcbiAqIERpcmVjdGl2ZSB1c2VkIHRvIGZhY2lsaXRhdGUgaW5zdGFudGlhdGlvbiBvZiBDTVMgZHJpdmVuIGR5bmFtaWMgY29tcG9uZW50c1xuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbY3hDb21wb25lbnRXcmFwcGVyXScsXG59KVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudFdyYXBwZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGN4Q29tcG9uZW50V3JhcHBlcjogQ29udGVudFNsb3RDb21wb25lbnREYXRhO1xuICBAT3V0cHV0KCkgY3hDb21wb25lbnRSZWYgPSBuZXcgRXZlbnRFbWl0dGVyPENvbXBvbmVudFJlZjxhbnk+PigpO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAyLjBcbiAgICpcbiAgICogVGhpcyBwcm9wZXJ0eSBpbiB1bnNhZmUsIGkuZS5cbiAgICogLSBjbXBSZWYgY2FuIGJlIHNldCBsYXRlciBiZWNhdXNlIG9mIGxhenkgbG9hZGluZyBvciBkZWZlcnJlZCBsb2FkaW5nXG4gICAqIC0gY21wUmVmIGNhbiBiZSBub3Qgc2V0IGF0IGFsbCBpZiBmb3IgZXhhbXBsZSwgd2ViIGNvbXBvbmVudHMgYXJlIHVzZWQgYXMgY21zIGNvbXBvbmVudHNcbiAgICovXG4gIGNtcFJlZj86IENvbXBvbmVudFJlZjxhbnk+O1xuXG4gIHByaXZhdGUgbGF1bmNoZXJSZXNvdXJjZT86IFN1YnNjcmlwdGlvbjtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAzLjNcbiAgICogVXNlIHRoZSBmb2xsb3dpbmcgY29uc3RydWN0b3IgaW5zdGVhZDpcbiAgICogYGBgXG4gICAqIGNvbnN0cnVjdG9yKCBwcm90ZWN0ZWQgdmNyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgKiBwcm90ZWN0ZWQgY21zQ29tcG9uZW50c1NlcnZpY2U6IENtc0NvbXBvbmVudHNTZXJ2aWNlLFxuICAgKiBwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgKiBwcm90ZWN0ZWQgZHluYW1pY0F0dHJpYnV0ZVNlcnZpY2U6IER5bmFtaWNBdHRyaWJ1dGVTZXJ2aWNlLFxuICAgKiBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICogcHJvdGVjdGVkIGNvbXBvbmVudEhhbmRsZXI6IENvbXBvbmVudEhhbmRsZXJTZXJ2aWNlLFxuICAgKiBwcm90ZWN0ZWQgY21zSW5qZWN0b3I6IENtc0luamVjdG9yU2VydmljZSxcbiAgICogcHJvdGVjdGVkIGV2ZW50U2VydmljZTogRXZlbnRTZXJ2aWNlKSB7fVxuICAgKiBgYGBcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHZjcjogVmlld0NvbnRhaW5lclJlZixcbiAgICBjbXNDb21wb25lbnRzU2VydmljZTogQ21zQ29tcG9uZW50c1NlcnZpY2UsXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIGR5bmFtaWNBdHRyaWJ1dGVTZXJ2aWNlOiBEeW5hbWljQXR0cmlidXRlU2VydmljZSxcbiAgICByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIGNvbXBvbmVudEhhbmRsZXI6IENvbXBvbmVudEhhbmRsZXJTZXJ2aWNlLFxuICAgIGNtc0luamVjdG9yOiBDbXNJbmplY3RvclNlcnZpY2VcbiAgKTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHZjcjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcm90ZWN0ZWQgY21zQ29tcG9uZW50c1NlcnZpY2U6IENtc0NvbXBvbmVudHNTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJvdGVjdGVkIGR5bmFtaWNBdHRyaWJ1dGVTZXJ2aWNlOiBEeW5hbWljQXR0cmlidXRlU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcm90ZWN0ZWQgY29tcG9uZW50SGFuZGxlcjogQ29tcG9uZW50SGFuZGxlclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNtc0luamVjdG9yOiBDbXNJbmplY3RvclNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIGV2ZW50U2VydmljZT86IEV2ZW50U2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jbXNDb21wb25lbnRzU2VydmljZVxuICAgICAgLmRldGVybWluZU1hcHBpbmdzKFt0aGlzLmN4Q29tcG9uZW50V3JhcHBlci5mbGV4VHlwZV0pXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuY21zQ29tcG9uZW50c1NlcnZpY2Uuc2hvdWxkUmVuZGVyKFxuICAgICAgICAgICAgdGhpcy5jeENvbXBvbmVudFdyYXBwZXIuZmxleFR5cGVcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMubGF1bmNoQ29tcG9uZW50KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsYXVuY2hDb21wb25lbnQoKSB7XG4gICAgY29uc3QgY29tcG9uZW50TWFwcGluZyA9IHRoaXMuY21zQ29tcG9uZW50c1NlcnZpY2UuZ2V0TWFwcGluZyhcbiAgICAgIHRoaXMuY3hDb21wb25lbnRXcmFwcGVyLmZsZXhUeXBlXG4gICAgKTtcblxuICAgIGlmICghY29tcG9uZW50TWFwcGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubGF1bmNoZXJSZXNvdXJjZSA9IHRoaXMuY29tcG9uZW50SGFuZGxlclxuICAgICAgLmdldExhdW5jaGVyKFxuICAgICAgICBjb21wb25lbnRNYXBwaW5nLFxuICAgICAgICB0aGlzLnZjcixcbiAgICAgICAgdGhpcy5jbXNJbmplY3Rvci5nZXRJbmplY3RvcihcbiAgICAgICAgICB0aGlzLmN4Q29tcG9uZW50V3JhcHBlci5mbGV4VHlwZSxcbiAgICAgICAgICB0aGlzLmN4Q29tcG9uZW50V3JhcHBlci51aWQsXG4gICAgICAgICAgdGhpcy5pbmplY3RvclxuICAgICAgICApLFxuICAgICAgICB0aGlzLmNtc0NvbXBvbmVudHNTZXJ2aWNlLmdldE1vZHVsZSh0aGlzLmN4Q29tcG9uZW50V3JhcHBlci5mbGV4VHlwZSlcbiAgICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHsgZWxlbWVudFJlZiwgY29tcG9uZW50UmVmIH0pID0+IHtcbiAgICAgICAgICB0aGlzLmNtcFJlZiA9IGNvbXBvbmVudFJlZjtcblxuICAgICAgICAgIHRoaXMuY3hDb21wb25lbnRSZWYuZW1pdChjb21wb25lbnRSZWYpO1xuXG4gICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KENvbXBvbmVudENyZWF0ZUV2ZW50LCBlbGVtZW50UmVmKTtcbiAgICAgICAgICB0aGlzLmRlY29yYXRlKGVsZW1lbnRSZWYpO1xuICAgICAgICAgIHRoaXMuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmKS5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSksXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMuZGlzcGF0Y2hFdmVudChDb21wb25lbnREZXN0cm95RXZlbnQpKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIHRoZSBjb21wb25lbnQgZXZlbnQuXG4gICAqXG4gICAqIFRoZSBldmVudCBpcyBkaXNwYXRjaGVkIGR1cmluZyBjcmVhdGlvbiBhbmQgcmVtb3ZhbCBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGRpc3BhdGNoRXZlbnQoXG4gICAgZXZlbnQ6IFR5cGU8Q29tcG9uZW50RXZlbnQ+LFxuICAgIGVsZW1lbnRSZWY/OiBFbGVtZW50UmVmXG4gICkge1xuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICB0eXBlQ29kZTogdGhpcy5jeENvbXBvbmVudFdyYXBwZXIudHlwZUNvZGUsXG4gICAgICBpZDogdGhpcy5jeENvbXBvbmVudFdyYXBwZXIudWlkLFxuICAgIH0gYXMgQ29tcG9uZW50RXZlbnQ7XG4gICAgaWYgKGV2ZW50ID09PSBDb21wb25lbnRDcmVhdGVFdmVudCkge1xuICAgICAgKHBheWxvYWQgYXMgQ29tcG9uZW50Q3JlYXRlRXZlbnQpLmhvc3QgPSBlbGVtZW50UmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIH1cbiAgICB0aGlzLmV2ZW50U2VydmljZT8uZGlzcGF0Y2gocGF5bG9hZCwgZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWNvcmF0ZShlbGVtZW50UmVmOiBFbGVtZW50UmVmKTogdm9pZCB7XG4gICAgdGhpcy5keW5hbWljQXR0cmlidXRlU2VydmljZS5hZGRBdHRyaWJ1dGVzVG9Db21wb25lbnQoXG4gICAgICBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0aGlzLnJlbmRlcmVyLFxuICAgICAgdGhpcy5jeENvbXBvbmVudFdyYXBwZXJcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMubGF1bmNoZXJSZXNvdXJjZSkge1xuICAgICAgdGhpcy5sYXVuY2hlclJlc291cmNlLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG59XG4iXX0=