UNPKG

@chargebee/chargebee-js-angular-wrapper

Version:
168 lines 20.3 kB
import { Input, Directive, Output, EventEmitter, ContentChild, } from "@angular/core"; import { NumberFieldDirective } from "./number-field.directive"; import { ExpiryFieldDirective } from "./expiry-field.directive"; import { CvvFieldDirective } from "./cvv-field.directive"; import { getPropChanges } from "../../utils"; import * as i0 from "@angular/core"; export class CardFieldDirective { id = ""; cbInstance = null; cbComponent = null; icon; classes; fonts; styles; locale; showTestCards; currency; placeholder; numberComponent; expiryComponent; cvvComponent; // Below events only for combined-field ready = new EventEmitter(); focus = new EventEmitter(); blur = new EventEmitter(); change = new EventEmitter(); load; initialization; constructor(el) { if (el.nativeElement) { this.id = el.nativeElement.id; } } onReady = (cardComponent, field) => { let data; if (field) { // Emit allows only one argument (Spec deviation) data = { cardComponent, field }; } else { data = cardComponent; } this.ready.emit(data); }; // Below events only for Combined field onFocus = (status) => { this.focus.emit(status); }; onBlur = (status) => { this.blur.emit(status); }; onChange = (status) => { this.change.emit(status); }; ngOnInit() { if (typeof window !== "undefined" && typeof window["Chargebee"] !== "undefined") { const options = { icon: typeof this.icon === "boolean" ? this.icon : true, fonts: this.fonts || [], style: this.styles || {}, locale: this.locale || "en", showTestCards: this.showTestCards ?? false, classes: this.classes || {}, currency: this.currency || "USD", placeholder: this.placeholder || {}, }; this.cbInstance = window["Chargebee"].getInstance(); this.cbInstance.load("components").then(() => { this.cbComponent = this.cbInstance.createComponent("card", options); // Attaching listeners if any (only applicable for combined field) this.cbComponent.on("ready", this.onReady); this.cbComponent.on("focus", this.onFocus); this.cbComponent.on("blur", this.onBlur); this.cbComponent.on("change", this.onChange); // Initialize inidividual fields (if present) this.initializeField(this.cbComponent, this.numberComponent); this.initializeField(this.cbComponent, this.expiryComponent); this.initializeField(this.cbComponent, this.cvvComponent); this.cbComponent.mount(`#${this.id}`); }); } } initializeField(cbComponent, fieldElement) { if (cbComponent && fieldElement) { const fieldInstance = cbComponent .createField(fieldElement.type, { style: fieldElement.styles || {}, placeholder: fieldElement.placeholder || "", }) .at(`#${fieldElement.id}`); fieldElement.field = fieldInstance; // attach listeners fieldInstance.on("ready", fieldElement.onReady); fieldInstance.on("focus", fieldElement.onFocus); fieldInstance.on("blur", fieldElement.onBlur); fieldInstance.on("change", fieldElement.onChange); return fieldInstance; } return null; } tokenize(additionalData) { return this.cbComponent.tokenize(additionalData); } authorizeWith3ds(paymentIntent, additionalData, callbacks) { return this.cbComponent.authorizeWith3ds(paymentIntent, additionalData, callbacks); } ngOnChanges(changes) { if (this.cbComponent) { const props = [ "icon", "classes", "fonts", "locale", "showTestCards", "styles", "placeholder", ]; const { currentOptions, hasChanged } = getPropChanges(changes, props); if (hasChanged) { this.cbComponent.update(currentOptions); } } } /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CardFieldDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); /** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: CardFieldDirective, isStandalone: true, selector: "[cbCardField]", inputs: { icon: "icon", classes: "classes", fonts: "fonts", styles: "styles", locale: "locale", showTestCards: "showTestCards", currency: "currency", placeholder: "placeholder" }, outputs: { ready: "ready", focus: "focus", blur: "blur", change: "change" }, queries: [{ propertyName: "numberComponent", first: true, predicate: NumberFieldDirective, descendants: true, static: true }, { propertyName: "expiryComponent", first: true, predicate: ExpiryFieldDirective, descendants: true, static: true }, { propertyName: "cvvComponent", first: true, predicate: CvvFieldDirective, descendants: true, static: true }], usesOnChanges: true, ngImport: i0 }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CardFieldDirective, decorators: [{ type: Directive, args: [{ selector: "[cbCardField]", standalone: true, }] }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { icon: [{ type: Input }], classes: [{ type: Input }], fonts: [{ type: Input }], styles: [{ type: Input }], locale: [{ type: Input }], showTestCards: [{ type: Input }], currency: [{ type: Input }], placeholder: [{ type: Input }], numberComponent: [{ type: ContentChild, args: [NumberFieldDirective, { static: true }] }], expiryComponent: [{ type: ContentChild, args: [ExpiryFieldDirective, { static: true }] }], cvvComponent: [{ type: ContentChild, args: [CvvFieldDirective, { static: true }] }], ready: [{ type: Output }], focus: [{ type: Output }], blur: [{ type: Output }], change: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC1maWVsZC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGFyZ2ViZWUtanMtYW5ndWxhci13cmFwcGVyL3NyYy9saWIvZGlyZWN0aXZlcy9jYXJkLWZpZWxkLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsS0FBSyxFQUNMLFNBQVMsRUFDVCxNQUFNLEVBQ04sWUFBWSxFQUNaLFlBQVksR0FLYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDOztBQVM3QyxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDUixVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFFVixJQUFJLENBQVc7SUFDZixPQUFPLENBQVU7SUFDakIsS0FBSyxDQUFVO0lBQ2YsTUFBTSxDQUFVO0lBQ2hCLE1BQU0sQ0FBVTtJQUNoQixhQUFhLENBQVc7SUFDeEIsUUFBUSxDQUFVO0lBQ2xCLFdBQVcsQ0FJbEI7SUFFb0QsZUFBZSxDQUFDO0lBQ2hCLGVBQWUsQ0FBQztJQUNuQixZQUFZLENBQUM7SUFFaEUsdUNBQXVDO0lBQzdCLEtBQUssR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUM5QyxLQUFLLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7SUFDOUMsSUFBSSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBQzdDLE1BQU0sR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUV6RCxJQUFJLENB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QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFNZ0QsZUFBZTtzQkFBcEUsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ0UsZUFBZTtzQkFBcEUsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ0QsWUFBWTtzQkFBOUQsWUFBWTt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBR3ZDLEtBQUs7c0JBQWQsTUFBTTtnQkFDRyxLQUFLO3NCQUFkLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIElucHV0LFxuICBEaXJlY3RpdmUsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIE9uSW5pdCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTnVtYmVyRmllbGREaXJlY3RpdmUgfSBmcm9tIFwiLi9udW1iZXItZmllbGQuZGlyZWN0aXZlXCI7XG5pbXBvcnQgeyBFeHBpcnlGaWVsZERpcmVjdGl2ZSB9IGZyb20gXCIuL2V4cGlyeS1maWVsZC5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IEN2dkZpZWxkRGlyZWN0aXZlIH0gZnJvbSBcIi4vY3Z2LWZpZWxkLmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgZ2V0UHJvcENoYW5nZXMgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCB7IFBheW1lbnRJbnRlbnQsIEFkZGl0aW9uYWxEYXRhLCBDYWxsYmFja3MgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZGVjbGFyZSB2YXIgQ2hhcmdlYmVlOiBhbnk7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogXCJbY2JDYXJkRmllbGRdXCIsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIENhcmRGaWVsZERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgaWQgPSBcIlwiO1xuICBjYkluc3RhbmNlID0gbnVsbDtcbiAgY2JDb21wb25lbnQgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGljb24/OiBib29sZWFuO1xuICBASW5wdXQoKSBjbGFzc2VzPzogb2JqZWN0O1xuICBASW5wdXQoKSBmb250cz86IG9iamVjdDtcbiAgQElucHV0KCkgc3R5bGVzPzogb2JqZWN0O1xuICBASW5wdXQoKSBsb2NhbGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNob3dUZXN0Q2FyZHM/OiBib29sZWFuO1xuICBASW5wdXQoKSBjdXJyZW5jeT86IHN0cmluZztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI/OiB7XG4gICAgbnVtYmVyPzogc3RyaW5nO1xuICAgIGV4cGlyeT86IHN0cmluZztcbiAgICBjdnY/OiBzdHJpbmc7XG4gIH07XG5cbiAgQENvbnRlbnRDaGlsZChOdW1iZXJGaWVsZERpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSkgbnVtYmVyQ29tcG9uZW50O1xuICBAQ29udGVudENoaWxkKEV4cGlyeUZpZWxkRGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KSBleHBpcnlDb21wb25lbnQ7XG4gIEBDb250ZW50Q2hpbGQoQ3Z2RmllbGREaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0pIGN2dkNvbXBvbmVudDtcblxuICAvLyBCZWxvdyBldmVudHMgb25seSBmb3IgY29tYmluZWQtZmllbGRcbiAgQE91dHB1dCgpIHJlYWR5OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGZvY3VzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGJsdXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBsb2FkOiBQcm9taXNlPGJvb2xlYW4+O1xuICBpbml0aWFsaXphdGlvbjogUHJvbWlzZTxhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKGVsOiBFbGVtZW50UmVmKSB7XG4gICAgaWYgKGVsLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuaWQgPSBlbC5uYXRpdmVFbGVtZW50LmlkO1xuICAgIH1cbiAgfVxuXG4gIG9uUmVhZHkgPSAoY2FyZENvbXBvbmVudDogYW55LCBmaWVsZDogYW55KSA9PiB7XG4gICAgbGV0IGRhdGE6IGFueTtcbiAgICBpZiAoZmllbGQpIHtcbiAgICAgIC8vIEVtaXQgYWxsb3dzIG9ubHkgb25lIGFyZ3VtZW50IChTcGVjIGRldmlhdGlvbilcbiAgICAgIGRhdGEgPSB7IGNhcmRDb21wb25lbnQsIGZpZWxkIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEgPSBjYXJkQ29tcG9uZW50O1xuICAgIH1cbiAgICB0aGlzLnJlYWR5LmVtaXQoZGF0YSk7XG4gIH07XG5cbiAgLy8gQmVsb3cgZXZlbnRzIG9ubHkgZm9yIENvbWJpbmVkIGZpZWxkXG4gIG9uRm9jdXMgPSAoc3RhdHVzOiBhbnkpID0+IHtcbiAgICB0aGlzLmZvY3VzLmVtaXQoc3RhdHVzKTtcbiAgfTtcbiAgb25CbHVyID0gKHN0YXR1czogYW55KSA9PiB7XG4gICAgdGhpcy5ibHVyLmVtaXQoc3RhdHVzKTtcbiAgfTtcbiAgb25DaGFuZ2UgPSAoc3RhdHVzOiBhbnkpID0+IHtcbiAgICB0aGlzLmNoYW5nZS5lbWl0KHN0YXR1cyk7XG4gIH07XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgdHlwZW9mIHdpbmRvd1tcIkNoYXJnZWJlZVwiXSAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgaWNvbjogdHlwZW9mIHRoaXMuaWNvbiA9PT0gXCJib29sZWFuXCIgPyB0aGlzLmljb24gOiB0cnVlLFxuICAgICAgICBmb250czogdGhpcy5mb250cyB8fCBbXSxcbiAgICAgICAgc3R5bGU6IHRoaXMuc3R5bGVzIHx8IHt9LFxuICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlIHx8IFwiZW5cIixcbiAgICAgICAgc2hvd1Rlc3RDYXJkczogdGhpcy5zaG93VGVzdENhcmRzID8/IGZhbHNlLFxuICAgICAgICBjbGFzc2VzOiB0aGlzLmNsYXNzZXMgfHwge30sXG4gICAgICAgIGN1cnJlbmN5OiB0aGlzLmN1cnJlbmN5IHx8IFwiVVNEXCIsXG4gICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnBsYWNlaG9sZGVyIHx8IHt9LFxuICAgICAgfTtcblxuICAgICAgdGhpcy5jYkluc3RhbmNlID0gd2luZG93W1wiQ2hhcmdlYmVlXCJdLmdldEluc3RhbmNlKCk7XG5cbiAgICAgIHRoaXMuY2JJbnN0YW5jZS5sb2FkKFwiY29tcG9uZW50c1wiKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5jYkNvbXBvbmVudCA9IHRoaXMuY2JJbnN0YW5jZS5jcmVhdGVDb21wb25lbnQoXCJjYXJkXCIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIEF0dGFjaGluZyBsaXN0ZW5lcnMgaWYgYW55IChvbmx5IGFwcGxpY2FibGUgZm9yIGNvbWJpbmVkIGZpZWxkKVxuICAgICAgICB0aGlzLmNiQ29tcG9uZW50Lm9uKFwicmVhZHlcIiwgdGhpcy5vblJlYWR5KTtcbiAgICAgICAgdGhpcy5jYkNvbXBvbmVudC5vbihcImZvY3VzXCIsIHRoaXMub25Gb2N1cyk7XG4gICAgICAgIHRoaXMuY2JDb21wb25lbnQub24oXCJibHVyXCIsIHRoaXMub25CbHVyKTtcbiAgICAgICAgdGhpcy5jYkNvbXBvbmVudC5vbihcImNoYW5nZVwiLCB0aGlzLm9uQ2hhbmdlKTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIGluaWRpdmlkdWFsIGZpZWxkcyAoaWYgcHJlc2VudClcbiAgICAgICAgdGhpcy5pbml0aWFsaXplRmllbGQodGhpcy5jYkNvbXBvbmVudCwgdGhpcy5udW1iZXJDb21wb25lbnQpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVGaWVsZCh0aGlzLmNiQ29tcG9uZW50LCB0aGlzLmV4cGlyeUNvbXBvbmVudCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUZpZWxkKHRoaXMuY2JDb21wb25lbnQsIHRoaXMuY3Z2Q29tcG9uZW50KTtcblxuICAgICAgICB0aGlzLmNiQ29tcG9uZW50Lm1vdW50KGAjJHt0aGlzLmlkfWApO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaW5pdGlhbGl6ZUZpZWxkKGNiQ29tcG9uZW50LCBmaWVsZEVsZW1lbnQpIHtcbiAgICBpZiAoY2JDb21wb25lbnQgJiYgZmllbGRFbGVtZW50KSB7XG4gICAgICBjb25zdCBmaWVsZEluc3RhbmNlID0gY2JDb21wb25lbnRcbiAgICAgICAgLmNyZWF0ZUZpZWxkKGZpZWxkRWxlbWVudC50eXBlLCB7XG4gICAgICAgICAgc3R5bGU6IGZpZWxkRWxlbWVudC5zdHlsZXMgfHwge30sXG4gICAgICAgICAgcGxhY2Vob2xkZXI6IGZpZWxkRWxlbWVudC5wbGFjZWhvbGRlciB8fCBcIlwiLFxuICAgICAgICB9KVxuICAgICAgICAuYXQoYCMke2ZpZWxkRWxlbWVudC5pZH1gKTtcblxuICAgICAgZmllbGRFbGVtZW50LmZpZWxkID0gZmllbGRJbnN0YW5jZTtcblxuICAgICAgLy8gYXR0YWNoIGxpc3RlbmVyc1xuICAgICAgZmllbGRJbnN0YW5jZS5vbihcInJlYWR5XCIsIGZpZWxkRWxlbWVudC5vblJlYWR5KTtcbiAgICAgIGZpZWxkSW5zdGFuY2Uub24oXCJmb2N1c1wiLCBmaWVsZEVsZW1lbnQub25Gb2N1cyk7XG4gICAgICBmaWVsZEluc3RhbmNlLm9uKFwiYmx1clwiLCBmaWVsZEVsZW1lbnQub25CbHVyKTtcbiAgICAgIGZpZWxkSW5zdGFuY2Uub24oXCJjaGFuZ2VcIiwgZmllbGRFbGVtZW50Lm9uQ2hhbmdlKTtcbiAgICAgIHJldHVybiBmaWVsZEluc3RhbmNlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyB0b2tlbml6ZShhZGRpdGlvbmFsRGF0YTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuY2JDb21wb25lbnQudG9rZW5pemUoYWRkaXRpb25hbERhdGEpO1xuICB9XG5cbiAgcHVibGljIGF1dGhvcml6ZVdpdGgzZHMoXG4gICAgcGF5bWVudEludGVudDogUGF5bWVudEludGVudCxcbiAgICBhZGRpdGlvbmFsRGF0YTogQWRkaXRpb25hbERhdGEsXG4gICAgY2FsbGJhY2tzOiBDYWxsYmFja3NcbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuY2JDb21wb25lbnQuYXV0aG9yaXplV2l0aDNkcyhcbiAgICAgIHBheW1lbnRJbnRlbnQsXG4gICAgICBhZGRpdGlvbmFsRGF0YSxcbiAgICAgIGNhbGxiYWNrc1xuICAgICk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKHRoaXMuY2JDb21wb25lbnQpIHtcbiAgICAgIGNvbnN0IHByb3BzID0gW1xuICAgICAgICBcImljb25cIixcbiAgICAgICAgXCJjbGFzc2VzXCIsXG4gICAgICAgIFwiZm9udHNcIixcbiAgICAgICAgXCJsb2NhbGVcIixcbiAgICAgICAgXCJzaG93VGVzdENhcmRzXCIsXG4gICAgICAgIFwic3R5bGVzXCIsXG4gICAgICAgIFwicGxhY2Vob2xkZXJcIixcbiAgICAgIF07XG4gICAgICBjb25zdCB7IGN1cnJlbnRPcHRpb25zLCBoYXNDaGFuZ2VkIH0gPSBnZXRQcm9wQ2hhbmdlcyhjaGFuZ2VzLCBwcm9wcyk7XG5cbiAgICAgIGlmIChoYXNDaGFuZ2VkKSB7XG4gICAgICAgIHRoaXMuY2JDb21wb25lbnQudXBkYXRlKGN1cnJlbnRPcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==