UNPKG

ngx2-credit-cards

Version:

A Credit Card Directives and Reactive Form Validators package for Angular X (6+)

210 lines (201 loc) 15.1 kB
import { Directive, ElementRef, Renderer, HostListener, NgModule } from '@angular/core'; import { formatCardCVC, restrictNumeric, formatCardExpiry, formatCardNumber, fns } from 'payment'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ class CCNumberFormatDirective { /** * @param {?} renderer * @param {?} el */ constructor(renderer, el) { this.renderer = renderer; this.el = el; /** @type {?} */ let element = this.el.nativeElement; this.cardType = ""; // call lib functions formatCardNumber(element); restrictNumeric(element); } /** * @param {?} e * @return {?} */ onKeypress(e) { /** @type {?} */ let element = this.el.nativeElement; /** @type {?} */ let elementValue = element.value; this.cardType = fns.cardType(elementValue); if (this.cardType !== "") { this.renderer.setElementClass(element, this.cardType, false); } else { this.cardType = ""; } } } CCNumberFormatDirective.decorators = [ { type: Directive, args: [{ selector: '[ccNum]' },] } ]; /** @nocollapse */ CCNumberFormatDirective.ctorParameters = () => [ { type: Renderer }, { type: ElementRef } ]; CCNumberFormatDirective.propDecorators = { onKeypress: [{ type: HostListener, args: ['keypress', ['$event'],] }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ class CCExpiryFormatDirective { /** * @param {?} el */ constructor(el) { this.el = el; /** @type {?} */ let element = this.el.nativeElement; // call lib functions formatCardExpiry(element); restrictNumeric(element); } } CCExpiryFormatDirective.decorators = [ { type: Directive, args: [{ selector: '[ccExp]' },] } ]; /** @nocollapse */ CCExpiryFormatDirective.ctorParameters = () => [ { type: ElementRef } ]; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ class CCCvcFormatDirective { /** * @param {?} el */ constructor(el) { this.el = el; /** @type {?} */ let element = this.el.nativeElement; // call lib functions formatCardCVC(element); restrictNumeric(element); } } CCCvcFormatDirective.decorators = [ { type: Directive, args: [{ selector: '[ccCvc]' },] } ]; /** @nocollapse */ CCCvcFormatDirective.ctorParameters = () => [ { type: ElementRef } ]; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ /** @type {?} */ const CC_DIRECTIVES = [ CCNumberFormatDirective, CCExpiryFormatDirective, CCCvcFormatDirective ]; class NgXCreditCardsModule { } NgXCreditCardsModule.decorators = [ { type: NgModule, args: [{ declarations: CC_DIRECTIVES, exports: CC_DIRECTIVES },] } ]; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ class CreditCardValidator { /** * Validates a cc number * @param {?} control * @return {?} */ static validateCardNumber(control) { if (control) { /** @type {?} */ let isValid = fns.validateCardNumber(control.value); if (!isValid) { return { "error": "CREDIT_CARD_INVALID" }; } } return null; } /** * Validates the expiry date. * Breaks exp by "/" string and assumes that first array entry is month and second year * Also removes any spaces * @param {?} control * @return {?} */ static validateCardExpiry(control) { if (control) { /** @type {?} */ let controlValue = control.value.split("/"); /** @type {?} */ let isValid = false; if (controlValue.length > 1) { /** @type {?} */ let month = controlValue[0].replace(/^\s+|\s+$/g, ''); /** @type {?} */ let year = controlValue[1].replace(/^\s+|\s+$/g, ''); isValid = fns.validateCardExpiry(month, year); } if (!isValid) { return { "error": "CREDIT_EXPIRY_INVALID" }; } } return null; } /** * Validates cards CVC * Also removes any spaces * @param {?} control * @return {?} */ static validateCardCvc(control) { if (control) { /** @type {?} */ let isValid = fns.validateCardCVC(control.value); if (!isValid) { return { "error": "CREDIT_CARD_INVALID" }; } } return null; } } /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ export { NgXCreditCardsModule, CreditCardValidator, CCCvcFormatDirective as ɵc, CCExpiryFormatDirective as ɵb, CCNumberFormatDirective as ɵa }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4Mi1jcmVkaXQtY2FyZHMuanMubWFwIiwic291cmNlcyI6WyJuZzovL25neDItY3JlZGl0LWNhcmRzL2RpcmVjdGl2ZXMvY2MtbnVtYmVyLWZvcm1hdC5kaXJlY3RpdmUudHMiLCJuZzovL25neDItY3JlZGl0LWNhcmRzL2RpcmVjdGl2ZXMvY2MtZXhwaXJ5LWZvcm1hdC5kaXJlY3RpdmUudHMiLCJuZzovL25neDItY3JlZGl0LWNhcmRzL2RpcmVjdGl2ZXMvY2MtY3ZjLWZvcm1hdC5kaXJlY3RpdmUudHMiLCJuZzovL25neDItY3JlZGl0LWNhcmRzL25neGNyZWRpdGNhcmQubW9kdWxlLnRzIiwibmc6Ly9uZ3gyLWNyZWRpdC1jYXJkcy92YWxpZGF0b3JzL0NyZWRpdENhcmQudmFsaWRhdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFxuXHREaXJlY3RpdmUsIFxuXHRFbGVtZW50UmVmLCBcblx0UmVuZGVyZXIsXG5cdEhvc3RMaXN0ZW5lclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0ICogYXMgUGF5bWVudCBmcm9tICdwYXltZW50JztcblxuQERpcmVjdGl2ZSh7IFxuXHRzZWxlY3RvcjogJ1tjY051bV0nIFxufSlcbmV4cG9ydCBjbGFzcyBDQ051bWJlckZvcm1hdERpcmVjdGl2ZSB7XG5cblx0Y2FyZFR5cGU6IHN0cmluZztcblxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlciwgcHJpdmF0ZSBlbDogRWxlbWVudFJlZikge1xuXG5cdFx0bGV0IGVsZW1lbnQgICA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcblx0XHR0aGlzLmNhcmRUeXBlID0gXCJcIjtcblxuICAgIFx0Ly8gY2FsbCBsaWIgZnVuY3Rpb25zXG4gICAgICAgIFBheW1lbnQuZm9ybWF0Q2FyZE51bWJlcihlbGVtZW50KTtcbiAgICAgICAgUGF5bWVudC5yZXN0cmljdE51bWVyaWMoZWxlbWVudCk7XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKCdrZXlwcmVzcycsIFsnJGV2ZW50J10pIG9uS2V5cHJlc3MoZTogYW55KSB7XG5cdFx0XG5cdFx0bGV0IGVsZW1lbnQgXHQgID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xuXHRcdGxldCBlbGVtZW50VmFsdWUgID0gZWxlbWVudC52YWx1ZTtcblxuXHRcdHRoaXMuY2FyZFR5cGUgPSBQYXltZW50LmZucy5jYXJkVHlwZShlbGVtZW50VmFsdWUpO1xuXG5cdFx0aWYgKCB0aGlzLmNhcmRUeXBlICE9PSBcIlwiIClcblx0XHR7XHRcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudENsYXNzKGVsZW1lbnQsIHRoaXMuY2FyZFR5cGUsIGZhbHNlKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMuY2FyZFR5cGUgPSBcIlwiO1x0XHRcdFxuXHRcdH1cblxuXHR9XG5cbn1cbiIsImltcG9ydCB7IFxuICBEaXJlY3RpdmUsIFxuICBFbGVtZW50UmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgKiBhcyBQYXltZW50IGZyb20gJ3BheW1lbnQnO1xuXG5ARGlyZWN0aXZlKHsgXG5cdHNlbGVjdG9yOiAnW2NjRXhwXScgXG59KVxuZXhwb3J0IGNsYXNzIENDRXhwaXJ5Rm9ybWF0RGlyZWN0aXZlIHtcbiAgXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZikge1xuICAgIFx0bGV0IGVsZW1lbnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBcdC8vIGNhbGwgbGliIGZ1bmN0aW9uc1xuICAgICAgICBQYXltZW50LmZvcm1hdENhcmRFeHBpcnkoZWxlbWVudCk7XG4gICAgICAgIFBheW1lbnQucmVzdHJpY3ROdW1lcmljKGVsZW1lbnQpO1xuICAgIH1cblxufVxuIiwiaW1wb3J0IHsgXG4gIERpcmVjdGl2ZSwgXG4gIEVsZW1lbnRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCAqIGFzIFBheW1lbnQgZnJvbSAncGF5bWVudCc7XG5cbkBEaXJlY3RpdmUoeyBcblx0c2VsZWN0b3I6ICdbY2NDdmNdJyBcbn0pXG5leHBvcnQgY2xhc3MgQ0NDdmNGb3JtYXREaXJlY3RpdmUge1xuICBcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmKSB7XG4gICAgXHRsZXQgZWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcblxuICAgIFx0Ly8gY2FsbCBsaWIgZnVuY3Rpb25zXG4gICAgICAgIFBheW1lbnQuZm9ybWF0Q2FyZENWQyhlbGVtZW50KTtcbiAgICAgICAgUGF5bWVudC5yZXN0cmljdE51bWVyaWMoZWxlbWVudCk7XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDQ051bWJlckZvcm1hdERpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9jYy1udW1iZXItZm9ybWF0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDQ0V4cGlyeUZvcm1hdERpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9jYy1leHBpcnktZm9ybWF0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDQ0N2Y0Zvcm1hdERpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9jYy1jdmMtZm9ybWF0LmRpcmVjdGl2ZSc7XG5cbmltcG9ydCAqIGFzIFBheW1lbnQgZnJvbSAncGF5bWVudCc7XG5cbmNvbnN0IENDX0RJUkVDVElWRVMgPSBbXG5cdENDTnVtYmVyRm9ybWF0RGlyZWN0aXZlLFxuXHRDQ0V4cGlyeUZvcm1hdERpcmVjdGl2ZSwgXG5cdENDQ3ZjRm9ybWF0RGlyZWN0aXZlXG5dO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IENDX0RJUkVDVElWRVMsXG4gIGV4cG9ydHM6IENDX0RJUkVDVElWRVNcbn0pXG5leHBvcnQgY2xhc3MgTmdYQ3JlZGl0Q2FyZHNNb2R1bGUge1xufSIsImltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0ICogYXMgUGF5bWVudCBmcm9tICdwYXltZW50JztcblxuZXhwb3J0IGNsYXNzIENyZWRpdENhcmRWYWxpZGF0b3Ige1xuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGVzIGEgY2MgbnVtYmVyXG4gICAgICogQHBhcmFtIGNvbnRyb2xcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsaWRhdGVDYXJkTnVtYmVyKGNvbnRyb2w6IEZvcm1Db250cm9sKSB7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcblxuICAgICAgICAgICAgbGV0IGlzVmFsaWQgPSBQYXltZW50LmZucy52YWxpZGF0ZUNhcmROdW1iZXIoY29udHJvbC52YWx1ZSk7XG5cbiAgICAgICAgICAgIGlmICghaXNWYWxpZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBcImVycm9yXCI6IFwiQ1JFRElUX0NBUkRfSU5WQUxJRFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9ICAgICBcblxuICAgICAgICByZXR1cm4gbnVsbDsgICBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZXMgdGhlIGV4cGlyeSBkYXRlLlxuICAgICAqIEJyZWFrcyBleHAgYnkgXCIvXCIgc3RyaW5nIGFuZCBhc3N1bWVzIHRoYXQgZmlyc3QgYXJyYXkgZW50cnkgaXMgbW9udGggYW5kIHNlY29uZCB5ZWFyXG4gICAgICogQWxzbyByZW1vdmVzIGFueSBzcGFjZXMgXG4gICAgICogQHBhcmFtIGNvbnRyb2xcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsaWRhdGVDYXJkRXhwaXJ5KGNvbnRyb2w6IEZvcm1Db250cm9sKSB7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcblxuICAgICAgICAgICAgbGV0IGNvbnRyb2xWYWx1ZSA9IGNvbnRyb2wudmFsdWUuc3BsaXQoXCIvXCIpO1xuICAgICAgICAgICAgbGV0IGlzVmFsaWQgICAgICA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoY29udHJvbFZhbHVlLmxlbmd0aCA+IDEpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IG1vbnRoID0gY29udHJvbFZhbHVlWzBdLnJlcGxhY2UoL15cXHMrfFxccyskL2csJycpO1xuICAgICAgICAgICAgICAgIGxldCB5ZWFyID0gY29udHJvbFZhbHVlWzFdLnJlcGxhY2UoL15cXHMrfFxccyskL2csJycpO1xuXG4gICAgICAgICAgICAgICAgaXNWYWxpZCA9IFBheW1lbnQuZm5zLnZhbGlkYXRlQ2FyZEV4cGlyeShtb250aCwgeWVhcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghaXNWYWxpZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBcImVycm9yXCI6IFwiQ1JFRElUX0VYUElSWV9JTlZBTElEXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gICAgIFxuXG4gICAgICAgIHJldHVybiBudWxsOyBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZXMgY2FyZHMgQ1ZDXG4gICAgICogQWxzbyByZW1vdmVzIGFueSBzcGFjZXMgXG4gICAgICogQHBhcmFtIGNvbnRyb2xcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsaWRhdGVDYXJkQ3ZjKGNvbnRyb2w6IEZvcm1Db250cm9sKSB7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcblxuICAgICAgICAgICAgbGV0IGlzVmFsaWQgPSBQYXltZW50LmZucy52YWxpZGF0ZUNhcmRDVkMoY29udHJvbC52YWx1ZSk7XG5cbiAgICAgICAgICAgIGlmICghaXNWYWxpZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBcImVycm9yXCI6IFwiQ1JFRElUX0NBUkRfSU5WQUxJRFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9ICAgICBcblxuICAgICAgICByZXR1cm4gbnVsbDsgIFxuICAgIH1cblxufVxuIl0sIm5hbWVzIjpbIlBheW1lbnQuZm9ybWF0Q2FyZE51bWJlciIsIlBheW1lbnQucmVzdHJpY3ROdW1lcmljIiwiUGF5bWVudC5mbnMiLCJQYXltZW50LmZvcm1hdENhcmRFeHBpcnkiLCJQYXltZW50LmZvcm1hdENhcmRDVkMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7Ozs7SUFnQkMsWUFBb0IsUUFBa0IsRUFBVSxFQUFjO1FBQTFDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFBVSxPQUFFLEdBQUYsRUFBRSxDQUFZOztRQUU3RCxJQUFJLE9BQU8sR0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQzs7UUFHYkEsZ0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbENDLGVBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDdkM7Ozs7O0lBRXFDLFVBQVUsQ0FBQyxDQUFNOztRQUV0RCxJQUFJLE9BQU8sR0FBTSxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQzs7UUFDdkMsSUFBSSxZQUFZLEdBQUksT0FBTyxDQUFDLEtBQUssQ0FBQztRQUVsQyxJQUFJLENBQUMsUUFBUSxHQUFHQyxHQUFXLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRW5ELElBQUssSUFBSSxDQUFDLFFBQVEsS0FBSyxFQUFFLEVBQ3pCO1lBQ0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDN0Q7YUFFRDtZQUNDLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1NBQ25CO0tBRUQ7OztZQWpDRCxTQUFTLFNBQUM7Z0JBQ1YsUUFBUSxFQUFFLFNBQVM7YUFDbkI7Ozs7WUFSQSxRQUFRO1lBRFIsVUFBVTs7O3lCQXdCVCxZQUFZLFNBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDOzs7Ozs7O0FDMUJyQzs7OztJQVlJLFlBQW9CLEVBQWM7UUFBZCxPQUFFLEdBQUYsRUFBRSxDQUFZOztRQUNqQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQzs7UUFHakNDLGdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDRixlQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQ3BDOzs7WUFYSixTQUFTLFNBQUM7Z0JBQ1YsUUFBUSxFQUFFLFNBQVM7YUFDbkI7Ozs7WUFQQyxVQUFVOzs7Ozs7O0FDRlo7Ozs7SUFZSSxZQUFvQixFQUFjO1FBQWQsT0FBRSxHQUFGLEVBQUUsQ0FBWTs7UUFDakMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7O1FBR2pDRyxhQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9CSCxlQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQ3BDOzs7WUFYSixTQUFTLFNBQUM7Z0JBQ1YsUUFBUSxFQUFFLFNBQVM7YUFDbkI7Ozs7WUFQQyxVQUFVOzs7Ozs7O0FDRlo7QUFRQSxNQUFNLGFBQWEsR0FBRztJQUNyQix1QkFBdUI7SUFDdkIsdUJBQXVCO0lBQ3ZCLG9CQUFvQjtDQUNwQixDQUFDO0FBTUY7OztZQUpDLFFBQVEsU0FBQztnQkFDUixZQUFZLEVBQUUsYUFBYTtnQkFDM0IsT0FBTyxFQUFFLGFBQWE7YUFDdkI7Ozs7Ozs7QUNoQkQ7Ozs7OztJQVFJLE9BQU8sa0JBQWtCLENBQUMsT0FBb0I7UUFFMUMsSUFBSSxPQUFPLEVBQUU7O1lBRVQsSUFBSSxPQUFPLEdBQUdDLEdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFNUQsSUFBSSxDQUFDLE9BQU8sRUFDWjtnQkFDSSxPQUFPO29CQUNILE9BQU8sRUFBRSxxQkFBcUI7aUJBQ2pDLENBQUE7YUFDSjtTQUNKO1FBRUQsT0FBTyxJQUFJLENBQUM7S0FDZjs7Ozs7Ozs7SUFRRCxPQUFPLGtCQUFrQixDQUFDLE9BQW9CO1FBRTFDLElBQUksT0FBTyxFQUFFOztZQUVULElBQUksWUFBWSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztZQUM1QyxJQUFJLE9BQU8sR0FBUSxLQUFLLENBQUM7WUFFekIsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDM0I7O2dCQUNJLElBQUksS0FBSyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFDLEVBQUUsQ0FBQyxDQUFDOztnQkFDckQsSUFBSSxJQUFJLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUMsRUFBRSxDQUFDLENBQUM7Z0JBRXBELE9BQU8sR0FBR0EsR0FBVyxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQzthQUN6RDtZQUVELElBQUksQ0FBQyxPQUFPLEVBQ1o7Z0JBQ0ksT0FBTztvQkFDSCxPQUFPLEVBQUUsdUJBQXVCO2lCQUNuQyxDQUFBO2FBQ0o7U0FDSjtRQUVELE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7Ozs7SUFPRCxPQUFPLGVBQWUsQ0FBQyxPQUFvQjtRQUV2QyxJQUFJLE9BQU8sRUFBRTs7WUFFVCxJQUFJLE9BQU8sR0FBR0EsR0FBVyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFekQsSUFBSSxDQUFDLE9BQU8sRUFDWjtnQkFDSSxPQUFPO29CQUNILE9BQU8sRUFBRSxxQkFBcUI7aUJBQ2pDLENBQUE7YUFDSjtTQUNKO1FBRUQsT0FBTyxJQUFJLENBQUM7S0FDZjtDQUVKOzs7Ozs7Ozs7Ozs7OzsifQ==