@agencycoda/ngx-paypal
Version:
Paypal integration for Angular
215 lines • 32.4 kB
JavaScript
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, NgZone, Output, ViewChild, } from '@angular/core';
import { Subject } from 'rxjs';
import { PayPalScriptService } from '../services/paypal-script.service';
export class NgxPaypalComponent {
constructor(paypalScriptService, cdr, ngZone) {
this.paypalScriptService = paypalScriptService;
this.cdr = cdr;
this.ngZone = ngZone;
/**
* If enabled, paypal SDK script will be loaded. Useful if you want to have multiple PayPal components on the same page
* sharing base configuration. In such a case only a single component may register script.
*/
this.registerScript = true;
/**
* Emitted when paypal script is loaded
*/
this.scriptLoaded = new EventEmitter();
this.ngUnsubscribe = new Subject();
/**
* Flag that indicates if paypal should be initialized (required for handling script load events and availability of DOM element)
*/
this.initializePayPal = true;
}
set payPalButtonContainer(content) {
this.payPalButtonContainerElem = content;
}
ngOnChanges(changes) {
if (!this.payPalButtonContainerId) {
this.payPalButtonContainerId = this.generateElementId();
}
// first time config setup
const config = this.config;
if (changes.config.isFirstChange()) {
if (config && this.registerScript) {
this.initPayPalScript(config, (payPal) => {
// store reference to paypal global script
this.payPal = payPal;
this.doPayPalCheck();
});
}
}
// changes to config
if (!changes.config.isFirstChange()) {
this.reinitialize(config);
}
}
ngOnDestroy() {
this.paypalScriptService.destroyPayPalScript();
this.ngUnsubscribe.next();
this.ngUnsubscribe.complete();
}
ngAfterViewInit() {
this.doPayPalCheck();
}
customInit(payPal) {
this.payPal = payPal;
this.doPayPalCheck();
}
reinitialize(config) {
this.config = config;
this.payPal = undefined;
this.paypalScriptService.destroyPayPalScript();
this.payPalButtonContainerId = this.generateElementId();
this.initializePayPal = true;
if (this.payPalButtonContainerElem) {
while (this.payPalButtonContainerElem.nativeElement.firstChild) {
this.payPalButtonContainerElem.nativeElement.removeChild(this.payPalButtonContainerElem.nativeElement.firstChild);
}
}
this.cdr.detectChanges();
if (this.config) {
if (!this.payPal) {
this.initPayPalScript(this.config, (payPal) => {
// store reference to paypal global script
this.payPal = payPal;
this.doPayPalCheck();
});
}
else {
this.doPayPalCheck();
}
}
}
doPayPalCheck() {
if (this.initializePayPal && this.config && this.payPal && this.payPalButtonContainerElem) {
// make sure that id is also set
if (this.payPalButtonContainerElem.nativeElement.id) {
this.initializePayPal = false;
this.initPayPal(this.config, this.payPal);
}
}
}
initPayPalScript(config, initPayPal) {
this.paypalScriptService.registerPayPalScript({
clientId: config.clientId,
commit: config.advanced && config.advanced.commit ? config.advanced.commit : undefined,
currency: config.currency,
vault: config.vault,
extraParams: config.advanced && config.advanced.extraQueryParams ? config.advanced.extraQueryParams : []
}, (paypal) => {
this.scriptLoaded.next(paypal);
initPayPal(paypal);
});
}
generateElementId() {
return `ngx-captcha-id-${new Date().valueOf()}`;
}
initPayPal(config, paypal) {
// Running outside angular zone prevents infinite ngDoCheck lifecycle calls
this.ngZone.runOutsideAngular(() => {
// https://developer.paypal.com/docs/checkout/integrate/#2-add-the-paypal-script-to-your-web-page
const createOrder = (data, actions) => {
return this.ngZone.run(() => {
if (config.createOrderOnClient && config.createOrderOnServer) {
throw Error(`Both 'createOrderOnClient' and 'createOrderOnServer' are defined.
Please choose one or the other.`);
}
if (!config.createOrderOnClient && !config.createOrderOnServer) {
throw Error(`Neither 'createOrderOnClient' or 'createOrderOnServer' are defined.
Please define one of these to create order.`);
}
if (config.createOrderOnClient) {
return actions.order.create(config.createOrderOnClient(data));
}
if (config.createOrderOnServer) {
return config.createOrderOnServer(data);
}
throw Error(`Invalid state for 'createOrder'.`);
});
};
const createSubscription = (data, actions) => {
return this.ngZone.run(() => {
if (config.createSubscription) {
return config.createSubscription(data, actions);
}
});
};
const onShippingChange = (data, actions) => {
return this.ngZone.run(() => {
if (config.onShippingChange) {
return config.onShippingChange(data, actions);
}
});
};
const buttonsConfig = Object.assign(Object.assign(Object.assign({ style: config.style, onApprove: (data, actions) => {
return this.ngZone.run(() => {
if (config.onApprove) {
config.onApprove(data, actions);
}
// capture on server
if (config.authorizeOnServer) {
return config.authorizeOnServer(data, actions);
}
// capture on client
const onClientAuthorization = config.onClientAuthorization;
if (onClientAuthorization) {
actions.order.capture().then((details) => {
this.ngZone.run(() => {
onClientAuthorization(details);
});
});
return;
}
});
}, onError: (error) => {
this.ngZone.run(() => {
if (config.onError) {
config.onError(error);
}
});
}, onCancel: (data, actions) => {
this.ngZone.run(() => {
if (config.onCancel) {
config.onCancel(data, actions);
}
});
}, onClick: (data, actions) => {
this.ngZone.run(() => {
if (config.onClick) {
config.onClick(data, actions);
}
});
}, onInit: (data, actions) => {
this.ngZone.run(() => {
if (config.onInit) {
config.onInit(data, actions);
}
});
} }, ((config.createOrderOnClient || config.createOrderOnServer) && { createOrder })), (config.createSubscription && { createSubscription })), (config.onShippingChange && { onShippingChange }));
paypal.Buttons(buttonsConfig).render(`#${this.payPalButtonContainerId}`);
});
}
}
NgxPaypalComponent.decorators = [
{ type: Component, args: [{
changeDetection: ChangeDetectionStrategy.OnPush,
selector: 'ngx-paypal',
template: `
<div #payPalButtonContainer [id]="payPalButtonContainerId"></div>
`
},] }
];
/** @nocollapse */
NgxPaypalComponent.ctorParameters = () => [
{ type: PayPalScriptService },
{ type: ChangeDetectorRef },
{ type: NgZone }
];
NgxPaypalComponent.propDecorators = {
config: [{ type: Input }],
registerScript: [{ type: Input }],
scriptLoaded: [{ type: Output }],
payPalButtonContainer: [{ type: ViewChild, args: ['payPalButtonContainer', { static: false },] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5cGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9wYXlwYWwuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBR04sTUFBTSxFQUVOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBaUIvQixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQVN4RSxNQUFNLE9BQU8sa0JBQWtCO0lBd0MzQixZQUNZLG1CQUF3QyxFQUN4QyxHQUFzQixFQUN0QixNQUFjO1FBRmQsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBcEMxQjs7O1dBR0c7UUFDTSxtQkFBYyxHQUFZLElBQUksQ0FBQztRQUV4Qzs7V0FFRztRQUNPLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQU9oQyxrQkFBYSxHQUFrQixJQUFJLE9BQU8sRUFBUSxDQUFDO1FBT3BFOztXQUVHO1FBQ0sscUJBQWdCLEdBQVksSUFBSSxDQUFDO0lBWXpDLENBQUM7SUFuQkQsSUFBMkQscUJBQXFCLENBQUMsT0FBbUI7UUFDaEcsSUFBSSxDQUFDLHlCQUF5QixHQUFHLE9BQU8sQ0FBQztJQUM3QyxDQUFDO0lBbUJELFdBQVcsQ0FBQyxPQUFzQjtRQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQy9CLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUMzRDtRQUVELDBCQUEwQjtRQUMx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LENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7O1lBL1BKLFNBQVMsU0FBQztnQkFDUCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtnQkFDL0MsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLFFBQVEsRUFBRTs7S0FFVDthQUNKOzs7O1lBUlEsbUJBQW1CO1lBN0J4QixpQkFBaUI7WUFLakIsTUFBTTs7O3FCQXNDTCxLQUFLOzZCQU1MLEtBQUs7MkJBS0wsTUFBTTtvQ0FVTixTQUFTLFNBQUMsdUJBQXVCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBOZ1pvbmUsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICAgIElDYW5jZWxDYWxsYmFja0RhdGEsXG4gICAgSUNsaWVudEF1dGhvcml6ZUNhbGxiYWNrRGF0YSxcbiAgICBJQ3JlYXRlT3JkZXJDYWxsYmFja0FjdGlvbnMsXG4gICAgSUluaXRDYWxsYmFja0RhdGEsXG4gICAgSU9uQXBwcm92ZUNhbGxiYWNrQWN0aW9ucyxcbiAgICBJT25BcHByb3ZlQ2FsbGJhY2tEYXRhLFxuICAgIElPbkNsaWNrQ2FsbGJhY2tBY3Rpb25zLFxuICAgIElPbkluaXRDYWxsYmFja0FjdGlvbnMsXG4gICAgSU9uU2hpcHBpbmdDaGFuZ2VBY3Rpb25zLFxuICAgIElPblNoaXBwaW5nQ2hhbmdlRGF0YSxcbiAgICBJUGF5UGFsQ29uZmlnLFxuICAgIElDcmVhdGVTdWJzY3JpcHRpb25DYWxsYmFja0FjdGlvbnMsXG4gICAgSUNyZWF0ZVN1YnNjcmlwdGlvbkNhbGxiYWNrRGF0YSxcbn0gZnJvbSAnLi4vbW9kZWxzL3BheXBhbC1tb2RlbHMnO1xuaW1wb3J0IHsgUGF5UGFsU2NyaXB0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3BheXBhbC1zY3JpcHQuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHNlbGVjdG9yOiAnbmd4LXBheXBhbCcsXG4gICAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2ICNwYXlQYWxCdXR0b25Db250YWluZXIgW2lkXT1cInBheVBhbEJ1dHRvbkNvbnRhaW5lcklkXCI+PC9kaXY+XG4gICAgYFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hQYXlwYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmF0aW9uIGZvciBwYXlwYWwuXG4gICAgICovXG4gICAgQElucHV0KCkgY29uZmlnPzogSVBheVBhbENvbmZpZztcblxuICAgIC8qKlxuICAgICAqIElmIGVuYWJsZWQsIHBheXBhbCBTREsgc2NyaXB0IHdpbGwgYmUgbG9hZGVkLiBVc2VmdWwgaWYgeW91IHdhbnQgdG8gaGF2ZSBtdWx0aXBsZSBQYXlQYWwgY29tcG9uZW50cyBvbiB0aGUgc2FtZSBwYWdlXG4gICAgICogc2hhcmluZyBiYXNlIGNvbmZpZ3VyYXRpb24uIEluIHN1Y2ggYSBjYXNlIG9ubHkgYSBzaW5nbGUgY29tcG9uZW50IG1heSByZWdpc3RlciBzY3JpcHQuXG4gICAgICovXG4gICAgQElucHV0KCkgcmVnaXN0ZXJTY3JpcHQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHBheXBhbCBzY3JpcHQgaXMgbG9hZGVkXG4gICAgICovXG4gICAgQE91dHB1dCgpIHNjcmlwdExvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgLyoqXG4gICAgICogSWQgb2YgdGhlIGVsZW1lbnQgd2hlcmUgUGF5UGFsIGJ1dHRvbiB3aWxsIGJlIHJlbmRlcmVkXG4gICAgICovXG4gICAgcHVibGljIHBheVBhbEJ1dHRvbkNvbnRhaW5lcklkPzogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBuZ1Vuc3Vic2NyaWJlOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIHByaXZhdGUgcGF5UGFsQnV0dG9uQ29udGFpbmVyRWxlbT86IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgncGF5UGFsQnV0dG9uQ29udGFpbmVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIHNldCBwYXlQYWxCdXR0b25Db250YWluZXIoY29udGVudDogRWxlbWVudFJlZikge1xuICAgICAgICB0aGlzLnBheVBhbEJ1dHRvbkNvbnRhaW5lckVsZW0gPSBjb250ZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZsYWcgdGhhdCBpbmRpY2F0ZXMgaWYgcGF5cGFsIHNob3VsZCBiZSBpbml0aWFsaXplZCAocmVxdWlyZWQgZm9yIGhhbmRsaW5nIHNjcmlwdCBsb2FkIGV2ZW50cyBhbmQgYXZhaWxhYmlsaXR5IG9mIERPTSBlbGVtZW50KVxuICAgICAqL1xuICAgIHByaXZhdGUgaW5pdGlhbGl6ZVBheVBhbDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBSZWZlcmVuY2UgdG8gUGF5UGFsIGdsb2JhbCBBUElcbiAgICAgKi9cbiAgICBwcml2YXRlIHBheVBhbDogYW55O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcGF5cGFsU2NyaXB0U2VydmljZTogUGF5UGFsU2NyaXB0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lXG4gICAgKSB7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMucGF5UGFsQnV0dG9uQ29udGFpbmVySWQpIHtcbiAgICAgICAgICAgIHRoaXMucGF5UGFsQnV0dG9uQ29udGFpbmVySWQgPSB0aGlzLmdlbmVyYXRlRWxlbWVudElkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaXJzdCB0aW1lIGNvbmZpZyBzZXR1cFxuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZztcblxuICAgICAgICBpZiAoY2hhbmdlcy5jb25maWcuaXNGaXJzdENoYW5nZSgpKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnICYmIHRoaXMucmVnaXN0ZXJTY3JpcHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRQYXlQYWxTY3JpcHQoY29uZmlnLCAocGF5UGFsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlIHJlZmVyZW5jZSB0byBwYXlwYWwgZ2xvYmFsIHNjcmlwdFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBheVBhbCA9IHBheVBhbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb1BheVBhbENoZWNrKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGFuZ2VzIHRvIGNvbmZpZ1xuICAgICAgICBpZiAoIWNoYW5nZXMuY29uZmlnLmlzRmlyc3RDaGFuZ2UoKSkge1xuICAgICAgICAgICAgdGhpcy5yZWluaXRpYWxpemUoY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBheXBhbFNjcmlwdFNlcnZpY2UuZGVzdHJveVBheVBhbFNjcmlwdCgpO1xuICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZG9QYXlQYWxDaGVjaygpO1xuICAgIH1cblxuICAgIGN1c3RvbUluaXQocGF5UGFsOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wYXlQYWwgPSBwYXlQYWw7XG4gICAgICAgIHRoaXMuZG9QYXlQYWxDaGVjaygpO1xuICAgIH1cblxuICAgIHJlaW5pdGlhbGl6ZShjb25maWc6IElQYXlQYWxDb25maWcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMucGF5UGFsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnBheXBhbFNjcmlwdFNlcnZpY2UuZGVzdHJveVBheVBhbFNjcmlwdCgpO1xuICAgICAgICB0aGlzLnBheVBhbEJ1dHRvbkNvbnRhaW5lcklkID0gdGhpcy5nZW5lcmF0ZUVsZW1lbnRJZCgpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVQYXlQYWwgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLnBheVBhbEJ1dHRvbkNvbnRhaW5lckVsZW0pIHtcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLnBheVBhbEJ1dHRvbkNvbnRhaW5lckVsZW0ubmF0aXZlRWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXlQYWxCdXR0b25Db250YWluZXJFbGVtLm5hdGl2ZUVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5wYXlQYWxCdXR0b25Db250YWluZXJFbGVtLm5hdGl2ZUVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucGF5UGFsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0UGF5UGFsU2NyaXB0KHRoaXMuY29uZmlnLCAocGF5UGFsKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgcmVmZXJlbmNlIHRvIHBheXBhbCBnbG9iYWwgc2NyaXB0XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGF5UGFsID0gcGF5UGFsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvUGF5UGFsQ2hlY2soKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kb1BheVBhbENoZWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHByaXZhdGUgZG9QYXlQYWxDaGVjaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZVBheVBhbCAmJiB0aGlzLmNvbmZpZyAmJiB0aGlzLnBheVBhbCAmJiB0aGlzLnBheVBhbEJ1dHRvbkNvbnRhaW5lckVsZW0pIHtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGlkIGlzIGFsc28gc2V0XG4gICAgICAgICAgICBpZiAodGhpcy5wYXlQYWxCdXR0b25Db250YWluZXJFbGVtLm5hdGl2ZUVsZW1lbnQuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVQYXlQYWwgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRQYXlQYWwodGhpcy5jb25maWcsIHRoaXMucGF5UGFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFBheVBhbFNjcmlwdChjb25maWc6IElQYXlQYWxDb25maWcsIGluaXRQYXlQYWw6IChwYXlwYWw6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBheXBhbFNjcmlwdFNlcnZpY2UucmVnaXN0ZXJQYXlQYWxTY3JpcHQoe1xuICAgICAgICAgICAgY2xpZW50SWQ6IGNvbmZpZy5jbGllbnRJZCxcbiAgICAgICAgICAgIGNvbW1pdDogY29uZmlnLmFkdmFuY2VkICYmIGNvbmZpZy5hZHZhbmNlZC5jb21taXQgPyBjb25maWcuYWR2YW5jZWQuY29tbWl0IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY3VycmVuY3k6IGNvbmZpZy5jdXJyZW5jeSxcbiAgICAgICAgICAgIHZhdWx0OiBjb25maWcudmF1bHQsXG4gICAgICAgICAgICBleHRyYVBhcmFtczogY29uZmlnLmFkdmFuY2VkICYmIGNvbmZpZy5hZHZhbmNlZC5leHRyYVF1ZXJ5UGFyYW1zID8gY29uZmlnLmFkdmFuY2VkLmV4dHJhUXVlcnlQYXJhbXMgOiBbXVxuICAgICAgICB9LCAocGF5cGFsKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNjcmlwdExvYWRlZC5uZXh0KHBheXBhbCk7XG4gICAgICAgICAgICBpbml0UGF5UGFsKHBheXBhbCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVFbGVtZW50SWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGBuZ3gtY2FwdGNoYS1pZC0ke25ldyBEYXRlKCkudmFsdWVPZigpfWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0UGF5UGFsKGNvbmZpZzogSVBheVBhbENvbmZpZywgcGF5cGFsOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gUnVubmluZyBvdXRzaWRlIGFuZ3VsYXIgem9uZSBwcmV2ZW50cyBpbmZpbml0ZSBuZ0RvQ2hlY2sgbGlmZWN5Y2xlIGNhbGxzXG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcblxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIucGF5cGFsLmNvbS9kb2NzL2NoZWNrb3V0L2ludGVncmF0ZS8jMi1hZGQtdGhlLXBheXBhbC1zY3JpcHQtdG8teW91ci13ZWItcGFnZVxuICAgICAgICAgICAgY29uc3QgY3JlYXRlT3JkZXIgPSAoZGF0YTogYW55LCBhY3Rpb25zOiBJQ3JlYXRlT3JkZXJDYWxsYmFja0FjdGlvbnMpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5jcmVhdGVPcmRlck9uQ2xpZW50ICYmIGNvbmZpZy5jcmVhdGVPcmRlck9uU2VydmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgQm90aCAnY3JlYXRlT3JkZXJPbkNsaWVudCcgYW5kICdjcmVhdGVPcmRlck9uU2VydmVyJyBhcmUgZGVmaW5lZC5cbiAgICAgICAgICAgICAgICAgICAgUGxlYXNlIGNob29zZSBvbmUgb3IgdGhlIG90aGVyLmApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25maWcuY3JlYXRlT3JkZXJPbkNsaWVudCAmJiAhY29uZmlnLmNyZWF0ZU9yZGVyT25TZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBOZWl0aGVyICdjcmVhdGVPcmRlck9uQ2xpZW50JyBvciAnY3JlYXRlT3JkZXJPblNlcnZlcicgYXJlIGRlZmluZWQuXG4gICAgICAgICAgICAgICAgICAgIFBsZWFzZSBkZWZpbmUgb25lIG9mIHRoZXNlIHRvIGNyZWF0ZSBvcmRlci5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuY3JlYXRlT3JkZXJPbkNsaWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbnMub3JkZXIuY3JlYXRlKGNvbmZpZy5jcmVhdGVPcmRlck9uQ2xpZW50KGRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuY3JlYXRlT3JkZXJPblNlcnZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZy5jcmVhdGVPcmRlck9uU2VydmVyKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgc3RhdGUgZm9yICdjcmVhdGVPcmRlcicuYCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgY3JlYXRlU3Vic2NyaXB0aW9uID0gKGRhdGE6IElDcmVhdGVTdWJzY3JpcHRpb25DYWxsYmFja0RhdGEsIGFjdGlvbnM6IElDcmVhdGVTdWJzY3JpcHRpb25DYWxsYmFja0FjdGlvbnMpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5jcmVhdGVTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWcuY3JlYXRlU3Vic2NyaXB0aW9uKGRhdGEsIGFjdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3Qgb25TaGlwcGluZ0NoYW5nZSA9IChkYXRhOiBJT25TaGlwcGluZ0NoYW5nZURhdGEsIGFjdGlvbnM6IElPblNoaXBwaW5nQ2hhbmdlQWN0aW9ucykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm9uU2hpcHBpbmdDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWcub25TaGlwcGluZ0NoYW5nZShkYXRhLCBhY3Rpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbnNDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgc3R5bGU6IGNvbmZpZy5zdHlsZSxcbiAgICAgICAgICAgICAgICBvbkFwcHJvdmU6IChkYXRhOiBJT25BcHByb3ZlQ2FsbGJhY2tEYXRhLCBhY3Rpb25zOiBJT25BcHByb3ZlQ2FsbGJhY2tBY3Rpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5vbkFwcHJvdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcub25BcHByb3ZlKGRhdGEsIGFjdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXB0dXJlIG9uIHNlcnZlclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5hdXRob3JpemVPblNlcnZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWcuYXV0aG9yaXplT25TZXJ2ZXIoZGF0YSwgYWN0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcHR1cmUgb24gY2xpZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbkNsaWVudEF1dGhvcml6YXRpb24gPSBjb25maWcub25DbGllbnRBdXRob3JpemF0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uQ2xpZW50QXV0aG9yaXphdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnMub3JkZXIuY2FwdHVyZSgpLnRoZW4oKGRldGFpbHM6IElDbGllbnRBdXRob3JpemVDYWxsYmFja0RhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpZW50QXV0aG9yaXphdGlvbihkZXRhaWxzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uRXJyb3I6IChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcub25FcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25DYW5jZWw6IChkYXRhOiBJQ2FuY2VsQ2FsbGJhY2tEYXRhLCBhY3Rpb25zOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcub25DYW5jZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcub25DYW5jZWwoZGF0YSwgYWN0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25DbGljazogKGRhdGE6IGFueSwgYWN0aW9uczogSU9uQ2xpY2tDYWxsYmFja0FjdGlvbnMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcub25DbGljaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vbkNsaWNrKGRhdGEsIGFjdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uSW5pdDogKGRhdGE6IElJbml0Q2FsbGJhY2tEYXRhLCBhY3Rpb25zOiBJT25Jbml0Q2FsbGJhY2tBY3Rpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm9uSW5pdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vbkluaXQoZGF0YSwgYWN0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBmdW5jdGlvbnMgaWYgdGhleSd2ZSBiZWVuIGNyZWF0ZWQgaW4gdGhlIGNvbmZpZyBvYmplY3RcbiAgICAgICAgICAgICAgICAvLyBUaGUgQVBJIG9ubHkgYWxsb3dzIG9uZSBvZiB0aGUgdHdvIHRvIGJlIHNldFxuICAgICAgICAgICAgICAgIC4uLigoY29uZmlnLmNyZWF0ZU9yZGVyT25DbGllbnQgfHwgY29uZmlnLmNyZWF0ZU9yZGVyT25TZXJ2ZXIpICYmIHsgY3JlYXRlT3JkZXIgfSksXG4gICAgICAgICAgICAgICAgLi4uKGNvbmZpZy5jcmVhdGVTdWJzY3JpcHRpb24gJiYgeyBjcmVhdGVTdWJzY3JpcHRpb24gfSksXG4gICAgICAgICAgICAgICAgLy8gVGhlIG9uU2hpcHBpbmdDaGFuZ2UgY2FsbGJhY2sgY2Fubm90IGJlIHVzZWQgd2l0aCBzdWJzY3JpcHRpb25zXG4gICAgICAgICAgICAgICAgLy8gc28gd2Ugb25seSBhZGQgaXQgaWYgaXQgaXMgc2V0XG4gICAgICAgICAgICAgICAgLi4uKGNvbmZpZy5vblNoaXBwaW5nQ2hhbmdlICYmIHsgb25TaGlwcGluZ0NoYW5nZSB9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHBheXBhbC5CdXR0b25zKGJ1dHRvbnNDb25maWcpLnJlbmRlcihgIyR7dGhpcy5wYXlQYWxCdXR0b25Db250YWluZXJJZH1gKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4iXX0=