said-ngx-paypal
Version:
Paypal integration for Angular
408 lines • 36.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
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 {
/**
* @param {?} paypalScriptService
* @param {?} cdr
* @param {?} ngZone
*/
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.scriptLoadError = 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;
}
/**
* @param {?} content
* @return {?}
*/
set payPalButtonContainer(content) {
this.payPalButtonContainerElem = content;
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (!this.payPalButtonContainerId) {
this.payPalButtonContainerId = this.generateElementId();
}
// first time config setup
/** @type {?} */
const config = this.config;
if (changes.config.isFirstChange()) {
if (config && this.registerScript) {
this.initPayPalScript(config, (/**
* @param {?} payPal
* @return {?}
*/
(payPal) => {
// store reference to paypal global script
this.payPal = payPal;
this.doPayPalCheck();
}));
}
}
// changes to config
if (!changes.config.isFirstChange()) {
this.reinitialize(config);
}
}
/**
* @return {?}
*/
ngOnDestroy() {
this.paypalScriptService.destroyPayPalScript();
this.ngUnsubscribe.next();
this.ngUnsubscribe.complete();
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.doPayPalCheck();
}
/**
* @param {?} payPal
* @return {?}
*/
customInit(payPal) {
this.payPal = payPal;
this.doPayPalCheck();
}
/**
* @param {?} config
* @return {?}
*/
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, (/**
* @param {?} payPal
* @return {?}
*/
(payPal) => {
// store reference to paypal global script
this.payPal = payPal;
this.doPayPalCheck();
}));
}
else {
this.doPayPalCheck();
}
}
}
/**
* @private
* @return {?}
*/
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);
}
}
}
/**
* @private
* @param {?} config
* @param {?} initPayPal
* @return {?}
*/
initPayPalScript(config, initPayPal) {
this.paypalScriptService.registerPayPalScript({
clientId: config.clientId,
commit: config.advanced && config.advanced.commit ? config.advanced.commit : undefined,
currency: config.currency,
extraParams: config.advanced && config.advanced.extraQueryParams ? config.advanced.extraQueryParams : []
}, (/**
* @param {?} paypal
* @return {?}
*/
(paypal) => {
this.scriptLoaded.next(paypal);
initPayPal(paypal);
}), (/**
* @param {?} scriptSrc
* @return {?}
*/
(scriptSrc) => {
this.scriptLoadError.emit(scriptSrc);
}));
}
/**
* @private
* @return {?}
*/
generateElementId() {
return `ngx-captcha-id-${new Date().valueOf()}`;
}
/**
* @private
* @param {?} config
* @param {?} paypal
* @return {?}
*/
initPayPal(config, paypal) {
// Running outside angular zone prevents infinite ngDoCheck lifecycle calls
this.ngZone.runOutsideAngular((/**
* @return {?}
*/
() => {
// https://developer.paypal.com/docs/checkout/integrate/#2-add-the-paypal-script-to-your-web-page
paypal.Buttons({
style: config.style,
createOrder: (/**
* @param {?} data
* @param {?} actions
* @return {?}
*/
(data, actions) => {
return this.ngZone.run((/**
* @return {?}
*/
() => {
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'.`);
}));
}),
onApprove: (/**
* @param {?} data
* @param {?} actions
* @return {?}
*/
(data, actions) => {
return this.ngZone.run((/**
* @return {?}
*/
() => {
if (config.onApprove) {
config.onApprove(data, actions);
}
// capture on server
if (config.authorizeOnServer) {
return config.authorizeOnServer(data, actions);
}
// capture on client
/** @type {?} */
const onClientAuthorization = config.onClientAuthorization;
if (onClientAuthorization) {
actions.order.capture().then((/**
* @param {?} details
* @return {?}
*/
(details) => {
onClientAuthorization(details);
}));
return;
}
}));
}),
onError: (/**
* @param {?} error
* @return {?}
*/
(error) => {
this.ngZone.run((/**
* @return {?}
*/
() => {
if (config.onError) {
config.onError(error);
}
}));
}),
onCancel: (/**
* @param {?} data
* @param {?} actions
* @return {?}
*/
(data, actions) => {
this.ngZone.run((/**
* @return {?}
*/
() => {
if (config.onCancel) {
config.onCancel(data, actions);
}
}));
}),
onShippingChange: (/**
* @param {?} data
* @param {?} actions
* @return {?}
*/
(data, actions) => {
return this.ngZone.run((/**
* @return {?}
*/
() => {
if (config.onShippingChange) {
return config.onShippingChange(data, actions);
}
}));
}),
onClick: (/**
* @param {?} data
* @param {?} actions
* @return {?}
*/
(data, actions) => {
this.ngZone.run((/**
* @return {?}
*/
() => {
if (config.onClick) {
config.onClick(data, actions);
}
}));
}),
onInit: (/**
* @param {?} data
* @param {?} actions
* @return {?}
*/
(data, actions) => {
this.ngZone.run((/**
* @return {?}
*/
() => {
if (config.onInit) {
config.onInit(data, actions);
}
}));
})
}).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 }],
scriptLoadError: [{ type: Output }],
payPalButtonContainer: [{ type: ViewChild, args: ['payPalButtonContainer', { static: false },] }]
};
if (false) {
/**
* Configuration for paypal.
* @type {?}
*/
NgxPaypalComponent.prototype.config;
/**
* 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.
* @type {?}
*/
NgxPaypalComponent.prototype.registerScript;
/**
* Emitted when paypal script is loaded
* @type {?}
*/
NgxPaypalComponent.prototype.scriptLoaded;
/** @type {?} */
NgxPaypalComponent.prototype.scriptLoadError;
/**
* Id of the element where PayPal button will be rendered
* @type {?}
*/
NgxPaypalComponent.prototype.payPalButtonContainerId;
/**
* @type {?}
* @private
*/
NgxPaypalComponent.prototype.ngUnsubscribe;
/**
* @type {?}
* @private
*/
NgxPaypalComponent.prototype.payPalButtonContainerElem;
/**
* Flag that indicates if paypal should be initialized (required for handling script load events and availability of DOM element)
* @type {?}
* @private
*/
NgxPaypalComponent.prototype.initializePayPal;
/**
* Reference to PayPal global API
* @type {?}
* @private
*/
NgxPaypalComponent.prototype.payPal;
/**
* @type {?}
* @private
*/
NgxPaypalComponent.prototype.paypalScriptService;
/**
* @type {?}
* @private
*/
NgxPaypalComponent.prototype.cdr;
/**
* @type {?}
* @private
*/
NgxPaypalComponent.prototype.ngZone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5cGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3NhaWQtbmd4LXBheXBhbC8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3BheXBhbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBR04sTUFBTSxFQUVOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBZS9CLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBU3hFLE1BQU0sT0FBTyxrQkFBa0I7Ozs7OztJQXlDM0IsWUFDWSxtQkFBd0MsRUFDeEMsR0FBc0IsRUFDdEIsTUFBYztRQUZkLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTs7Ozs7UUFqQ2pCLG1CQUFjLEdBQVksSUFBSSxDQUFDOzs7O1FBSzlCLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUN2QyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFPdEMsa0JBQWEsR0FBa0IsSUFBSSxPQUFPLEVBQVEsQ0FBQzs7OztRQVU1RCxxQkFBZ0IsR0FBWSxJQUFJLENBQUM7SUFZekMsQ0FBQzs7Ozs7SUFuQkQsSUFBMkQscUJBQXFCLENBQUMsT0FBbUI7UUFDaEcsSUFBSSxDQUFDLHlCQUF5QixHQUFHLE9BQU8sQ0FBQztJQUM3QyxDQUFDOzs7OztJQW1CRCxXQUFXLENBQUMsT0FBc0I7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUMvQixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGlCQUFp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Q0FBaUQ7O0lBQ2pELDZDQUF1RDs7Ozs7SUFLdkQscURBQXdDOzs7OztJQUV4QywyQ0FBb0U7Ozs7O0lBRXBFLHVEQUErQzs7Ozs7O0lBUS9DLDhDQUF5Qzs7Ozs7O0lBS3pDLG9DQUFvQjs7Ozs7SUFHaEIsaURBQWdEOzs7OztJQUNoRCxpQ0FBOEI7Ozs7O0lBQzlCLG9DQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBBZnRlclZpZXdJbml0LFxyXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIENvbXBvbmVudCxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBJbnB1dCxcclxuICAgIE5nWm9uZSxcclxuICAgIE9uQ2hhbmdlcyxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE91dHB1dCxcclxuICAgIFNpbXBsZUNoYW5nZXMsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgICBJQ2FuY2VsQ2FsbGJhY2tEYXRhLFxyXG4gICAgSUNsaWVudEF1dGhvcml6ZUNhbGxiYWNrRGF0YSxcclxuICAgIElDcmVhdGVPcmRlckNhbGxiYWNrQWN0aW9ucyxcclxuICAgIElJbml0Q2FsbGJhY2tEYXRhLFxyXG4gICAgSU9uQXBwcm92ZUNhbGxiYWNrQWN0aW9ucyxcclxuICAgIElPbkFwcHJvdmVDYWxsYmFja0RhdGEsXHJcbiAgICBJT25DbGlja0NhbGxiYWNrQWN0aW9ucyxcclxuICAgIElPbkluaXRDYWxsYmFja0FjdGlvbnMsXHJcbiAgICBJT25TaGlwcGluZ0NoYW5nZUFjdGlvbnMsXHJcbiAgICBJT25TaGlwcGluZ0NoYW5nZURhdGEsXHJcbiAgICBJUGF5UGFsQ29uZmlnLFxyXG59IGZyb20gJy4uL21vZGVscy9wYXlwYWwtbW9kZWxzJztcclxuaW1wb3J0IHsgUGF5UGFsU2NyaXB0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3BheXBhbC1zY3JpcHQuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gICAgc2VsZWN0b3I6ICduZ3gtcGF5cGFsJyxcclxuICAgIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2ICNwYXlQYWxCdXR0b25Db250YWluZXIgW2lkXT1cInBheVBhbEJ1dHRvbkNvbnRhaW5lcklkXCI+PC9kaXY+XHJcbiAgICBgXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hQYXlwYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25maWd1cmF0aW9uIGZvciBwYXlwYWwuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIGNvbmZpZz86IElQYXlQYWxDb25maWc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiBlbmFibGVkLCBwYXlwYWwgU0RLIHNjcmlwdCB3aWxsIGJlIGxvYWRlZC4gVXNlZnVsIGlmIHlvdSB3YW50IHRvIGhhdmUgbXVsdGlwbGUgUGF5UGFsIGNvbXBvbmVudHMgb24gdGhlIHNhbWUgcGFnZVxyXG4gICAgICogc2hhcmluZyBiYXNlIGNvbmZpZ3VyYXRpb24uIEluIHN1Y2ggYSBjYXNlIG9ubHkgYSBzaW5nbGUgY29tcG9uZW50IG1heSByZWdpc3RlciBzY3JpcHQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHJlZ2lzdGVyU2NyaXB0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXR0ZWQgd2hlbiBwYXlwYWwgc2NyaXB0IGlzIGxvYWRlZFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgc2NyaXB0TG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgc2NyaXB0TG9hZEVycm9yID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZCBvZiB0aGUgZWxlbWVudCB3aGVyZSBQYXlQYWwgYnV0dG9uIHdpbGwgYmUgcmVuZGVyZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBheVBhbEJ1dHRvbkNvbnRhaW5lcklkPzogc3RyaW5nO1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgbmdVbnN1YnNjcmliZTogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBwYXlQYWxCdXR0b25Db250YWluZXJFbGVtPzogRWxlbWVudFJlZjtcclxuICAgIEBWaWV3Q2hpbGQoJ3BheVBhbEJ1dHRvbkNvbnRhaW5lcicsIHsgc3RhdGljOiBmYWxzZSB9KSBzZXQgcGF5UGFsQnV0dG9uQ29udGFpbmVyKGNvbnRlbnQ6IEVsZW1lbnRSZWYpIHtcclxuICAgICAgICB0aGlzLnBheVBhbEJ1dHRvbkNvbnRhaW5lckVsZW0gPSBjb250ZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmxhZyB0aGF0IGluZGljYXRlcyBpZiBwYXlwYWwgc2hvdWxkIGJlIGluaXRpYWxpemVkIChyZXF1aXJlZCBmb3IgaGFuZGxpbmcgc2NyaXB0IGxvYWQgZXZlbnRzIGFuZCBhdmFpbGFiaWxpdHkgb2YgRE9NIGVsZW1lbnQpXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZVBheVBhbDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWZlcmVuY2UgdG8gUGF5UGFsIGdsb2JhbCBBUElcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwYXlQYWw6IGFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHBheXBhbFNjcmlwdFNlcnZpY2U6IFBheVBhbFNjcmlwdFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcclxuICAgICkge1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMucGF5UGFsQnV0dG9uQ29udGFpbmVySWQpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXlQYWxCdXR0b25Db250YWluZXJJZCA9IHRoaXMuZ2VuZXJhdGVFbGVtZW50SWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGZpcnN0IHRpbWUgY29uZmlnIHNldHVwXHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XHJcblxyXG4gICAgICAgIGlmIChjaGFuZ2VzLmNvbmZpZy5pc0ZpcnN0Q2hhbmdlKCkpIHtcclxuICAgICAgICAgICAgaWYgKGNvbmZpZyAmJiB0aGlzLnJlZ2lzdGVyU2NyaXB0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRQYXlQYWxTY3JpcHQoY29uZmlnLCAocGF5UGFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgcmVmZXJlbmNlIHRvIHBheXBhbCBnbG9iYWwgc2NyaXB0XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXlQYWwgPSBwYXlQYWw7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb1BheVBhbENoZWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY2hhbmdlcyB0byBjb25maWdcclxuICAgICAgICBpZiAoIWNoYW5nZXMuY29uZmlnLmlzRmlyc3RDaGFuZ2UoKSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlaW5pdGlhbGl6ZShjb25maWcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBheXBhbFNjcmlwdFNlcnZpY2UuZGVzdHJveVBheVBhbFNjcmlwdCgpO1xyXG4gICAgICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KCk7XHJcbiAgICAgICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZG9QYXlQYWxDaGVjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIGN1c3RvbUluaXQocGF5UGFsOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBheVBhbCA9IHBheVBhbDtcclxuICAgICAgICB0aGlzLmRvUGF5UGFsQ2hlY2soKTtcclxuICAgIH1cclxuXHJcbiAgICByZWluaXRpYWxpemUoY29uZmlnOiBJUGF5UGFsQ29uZmlnIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XHJcbiAgICAgICAgdGhpcy5wYXlQYWwgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5wYXlwYWxTY3JpcHRTZXJ2aWNlLmRlc3Ryb3lQYXlQYWxTY3JpcHQoKTtcclxuICAgICAgICB0aGlzLnBheVBhbEJ1dHRvbkNvbnRhaW5lcklkID0gdGhpcy5nZW5lcmF0ZUVsZW1lbnRJZCgpO1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVBheVBhbCA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBheVBhbEJ1dHRvbkNvbnRhaW5lckVsZW0pIHtcclxuICAgICAgICAgICAgd2hpbGUgKHRoaXMucGF5UGFsQnV0dG9uQ29udGFpbmVyRWxlbS5uYXRpdmVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGF5UGFsQnV0dG9uQ29udGFpbmVyRWxlbS5uYXRpdmVFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMucGF5UGFsQnV0dG9uQ29udGFpbmVyRWxlbS5uYXRpdmVFbGVtZW50LmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZykge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMucGF5UGFsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRQYXlQYWxTY3JpcHQodGhpcy5jb25maWcsIChwYXlQYWwpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgcmVmZXJlbmNlIHRvIHBheXBhbCBnbG9iYWwgc2NyaXB0XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXlQYWwgPSBwYXlQYWw7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb1BheVBhbENoZWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZG9QYXlQYWxDaGVjaygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIGRvUGF5UGFsQ2hlY2soKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZVBheVBhbCAmJiB0aGlzLmNvbmZpZyAmJiB0aGlzLnBheVBhbCAmJiB0aGlzLnBheVBhbEJ1dHRvbkNvbnRhaW5lckVsZW0pIHtcclxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgaWQgaXMgYWxzbyBzZXRcclxuICAgICAgICAgICAgaWYgKHRoaXMucGF5UGFsQnV0dG9uQ29udGFpbmVyRWxlbS5uYXRpdmVFbGVtZW50LmlkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVQYXlQYWwgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFBheVBhbCh0aGlzLmNvbmZpZywgdGhpcy5wYXlQYWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFBheVBhbFNjcmlwdChjb25maWc6IElQYXlQYWxDb25maWcsIGluaXRQYXlQYWw6IChwYXlwYWw6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGF5cGFsU2NyaXB0U2VydmljZS5yZWdpc3RlclBheVBhbFNjcmlwdCh7XHJcbiAgICAgICAgICAgIGNsaWVudElkOiBjb25maWcuY2xpZW50SWQsXHJcbiAgICAgICAgICAgIGNvbW1pdDogY29uZmlnLmFkdmFuY2VkICYmIGNvbmZpZy5hZHZhbmNlZC5jb21taXQgPyBjb25maWcuYWR2YW5jZWQuY29tbWl0IDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBjdXJyZW5jeTogY29uZmlnLmN1cnJlbmN5LFxyXG4gICAgICAgICAgICBleHRyYVBhcmFtczogY29uZmlnLmFkdmFuY2VkICYmIGNvbmZpZy5hZHZhbmNlZC5leHRyYVF1ZXJ5UGFyYW1zID8gY29uZmlnLmFkdmFuY2VkLmV4dHJhUXVlcnlQYXJhbXMgOiBbXVxyXG4gICAgICAgIH0sIChwYXlwYWwpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zY3JpcHRMb2FkZWQubmV4dChwYXlwYWwpO1xyXG4gICAgICAgICAgICBpbml0UGF5UGFsKHBheXBhbCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgIChzY3JpcHRTcmM6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNjcmlwdExvYWRFcnJvci5lbWl0KHNjcmlwdFNyYyk7XHJcbiAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdlbmVyYXRlRWxlbWVudElkKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGBuZ3gtY2FwdGNoYS1pZC0ke25ldyBEYXRlKCkudmFsdWVPZigpfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0UGF5UGFsKGNvbmZpZzogSVBheVBhbENvbmZpZywgcGF5cGFsOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICAvLyBSdW5uaW5nIG91dHNpZGUgYW5ndWxhciB6b25lIHByZXZlbnRzIGluZmluaXRlIG5nRG9DaGVjayBsaWZlY3ljbGUgY2FsbHNcclxuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLnBheXBhbC5jb20vZG9jcy9jaGVja291dC9pbnRlZ3JhdGUvIzItYWRkLXRoZS1wYXlwYWwtc2NyaXB0LXRvLXlvdXItd2ViLXBhZ2VcclxuICAgICAgICAgICAgcGF5cGFsLkJ1dHRvbnMoe1xyXG4gICAgICAgICAgICAgICAgc3R5bGU6IGNvbmZpZy5zdHlsZSxcclxuICAgICAgICAgICAgICAgIGNyZWF0ZU9yZGVyOiAoZGF0YTogYW55LCBhY3Rpb25zOiBJQ3JlYXRlT3JkZXJDYWxsYmFja0FjdGlvbnMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5jcmVhdGVPcmRlck9uQ2xpZW50ICYmIGNvbmZpZy5jcmVhdGVPcmRlck9uU2VydmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgQm90aCAnY3JlYXRlT3JkZXJPbkNsaWVudCcgYW5kICdjcmVhdGVPcmRlck9uU2VydmVyJyBhcmUgZGVmaW5lZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgUGxlYXNlIGNob29zZSBvbmUgb3IgdGhlIG90aGVyLmApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZy5jcmVhdGVPcmRlck9uQ2xpZW50ICYmICFjb25maWcuY3JlYXRlT3JkZXJPblNlcnZlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYE5laXRoZXIgJ2NyZWF0ZU9yZGVyT25DbGllbnQnIG9yICdjcmVhdGVPcmRlck9uU2VydmVyJyBhcmUgZGVmaW5lZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgUGxlYXNlIGRlZmluZSBvbmUgb2YgdGhlc2UgdG8gY3JlYXRlIG9yZGVyLmApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmNyZWF0ZU9yZGVyT25DbGllbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb25zLm9yZGVyLmNyZWF0ZShjb25maWcuY3JlYXRlT3JkZXJPbkNsaWVudChkYXRhKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuY3JlYXRlT3JkZXJPblNlcnZlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZy5jcmVhdGVPcmRlck9uU2VydmVyKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBzdGF0ZSBmb3IgJ2NyZWF0ZU9yZGVyJy5gKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICAgb25BcHByb3ZlOiAoZGF0YTogSU9uQXBwcm92ZUNhbGxiYWNrRGF0YSwgYWN0aW9uczogSU9uQXBwcm92ZUNhbGxiYWNrQWN0aW9ucykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm9uQXBwcm92ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9uQXBwcm92ZShkYXRhLCBhY3Rpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FwdHVyZSBvbiBzZXJ2ZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5hdXRob3JpemVPblNlcnZlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZy5hdXRob3JpemVPblNlcnZlcihkYXRhLCBhY3Rpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FwdHVyZSBvbiBjbGllbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb25DbGllbnRBdXRob3JpemF0aW9uID0gY29uZmlnLm9uQ2xpZW50QXV0aG9yaXphdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uQ2xpZW50QXV0aG9yaXphdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5vcmRlci5jYXB0dXJlKCkudGhlbigoZGV0YWlsczogSUNsaWVudEF1dGhvcml6ZUNhbGxiYWNrRGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpZW50QXV0aG9yaXphdGlvbihkZXRhaWxzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG5cclxuICAgICAgICAgICAgICAgIG9uRXJyb3I6IChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5vbkVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcub25FcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICAgb25DYW5jZWw6IChkYXRhOiBJQ2FuY2VsQ2FsbGJhY2tEYXRhLCBhY3Rpb25zOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm9uQ2FuY2VsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcub25DYW5jZWwoZGF0YSwgYWN0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBvblNoaXBwaW5nQ2hhbmdlOiAoZGF0YTogSU9uU2hpcHBpbmdDaGFuZ2VEYXRhLCBhY3Rpb25zOiBJT25TaGlwcGluZ0NoYW5nZUFjdGlvbnMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5vblNoaXBwaW5nQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnLm9uU2hpcHBpbmdDaGFuZ2UoZGF0YSwgYWN0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiAoZGF0YTogYW55LCBhY3Rpb25zOiBJT25DbGlja0NhbGxiYWNrQWN0aW9ucykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcub25DbGljaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9uQ2xpY2soZGF0YSwgYWN0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBvbkluaXQ6IChkYXRhOiBJSW5pdENhbGxiYWNrRGF0YSwgYWN0aW9uczogSU9uSW5pdENhbGxiYWNrQWN0aW9ucykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcub25Jbml0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcub25Jbml0KGRhdGEsIGFjdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLnJlbmRlcihgIyR7dGhpcy5wYXlQYWxCdXR0b25Db250YWluZXJJZH1gKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbiJdfQ==