UNPKG

@nowzoo/ngx-firebase-auth

Version:

Angular components for Firebase email-first sign in and out-of-band (oob) actions (reset password, etc).

177 lines (176 loc) 24.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, Input, Output, EventEmitter, ViewChild, ElementRef } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; import { AngularFireAuth } from 'angularfire2/auth'; import { fadeInOutAnimation } from '../../shared'; import { NgxFirebaseAuthFormHelper } from '../../form-helper'; import { NgxFirebaseAuthService } from '../../ngx-firebase-auth.service'; var SignUpFormComponent = /** @class */ (function () { function SignUpFormComponent(_afAuth, _authService) { this._afAuth = _afAuth; this._authService = _authService; this.rememberChange = new EventEmitter(); this.success = new EventEmitter(); this.error = new EventEmitter(); this.formId = 'ngx-firebase-auth-sign-up-form-'; this.submitting = false; } Object.defineProperty(SignUpFormComponent.prototype, "auth", { get: /** * @return {?} */ function () { return this._afAuth.auth; }, enumerable: true, configurable: true }); Object.defineProperty(SignUpFormComponent.prototype, "authService", { get: /** * @return {?} */ function () { return this._authService; }, enumerable: true, configurable: true }); /** * @return {?} */ SignUpFormComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.emailFc = new FormControl(this.email, { validators: [Validators.required, Validators.email] }); this.passwordFc = new FormControl('', { validators: [Validators.required] }); this.nameFc = new FormControl('', { validators: [Validators.required, NgxFirebaseAuthFormHelper.requiredNonEmpty] }); this.rememberFc = new FormControl(this.remember); this.rememberFc.valueChanges.subscribe(function (val) { return _this.rememberChange.emit(val); }); this.fg = new FormGroup({ email: this.emailFc, password: this.passwordFc, name: this.nameFc, remember: this.rememberFc }); }; /** * @return {?} */ SignUpFormComponent.prototype.ngAfterViewInit = /** * @return {?} */ function () { this.passwordInput.nativeElement.focus(); }; /** * @return {?} */ SignUpFormComponent.prototype.submit = /** * @return {?} */ function () { var _this = this; this.submitting = true; /** @type {?} */ var cred; this.auth.fetchSignInMethodsForEmail(this.email) .then(function (results) { if (results.length > 0) { return Promise.reject({ code: 'ngx-firebase-auth/account-exists' }); } return _this.auth.createUserWithEmailAndPassword(_this.email, _this.passwordFc.value); }) .then(function (result) { cred = result; return cred.user.updateProfile({ displayName: _this.nameFc.value.trim(), photoURL: null }); }) .then(function () { return _this.authService.setRemembered(_this.rememberFc.value === true, _this.email); }) .then(function () { _this.success.emit(cred); }) .catch(function (error) { _this.submitting = false; _this.emailFc.markAsDirty(); _this.emailFc.markAsTouched(); _this.passwordFc.markAsDirty(); _this.passwordFc.markAsTouched(); switch (error.code) { case 'auth/invalid-email': case 'ngx-firebase-auth/account-exists': NgxFirebaseAuthFormHelper.setErrorUntilChanged(_this.emailFc, error.code); break; case 'auth/weak-password': NgxFirebaseAuthFormHelper.setErrorUntilChanged(_this.passwordFc, error.code); break; default: _this.error.emit(error); break; } }); }; SignUpFormComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-firebase-auth-sign-up-form', template: "<form [formGroup]=\"fg\" (ngSubmit)=\"submit()\">\n <div class=\"form-group\">\n <label [attr.for]=\"formId + 'email'\">Email Address</label>\n <input\n readonly\n #emailInput\n [attr.id]=\"formId + 'email'\"\n [attr.aria-describedby]=\"formId + 'email'\"\n type=\"email\"\n autocomplete=\"email\"\n placeholder=\"Email Address\"\n formControlName=\"email\"\n class=\"form-control\">\n <div class=\"invalid-feedback\" [@fadeInOut]=\"'in'\"\n *ngIf=\"emailFc.hasError('required')\">\n Required.\n </div>\n <div class=\"invalid-feedback\" [@fadeInOut]=\"'in'\"\n *ngIf=\"emailFc.hasError('email')\">\n Invalid email.\n </div>\n <div class=\"invalid-feedback\" [@fadeInOut]=\"'in'\"\n *ngIf=\"emailFc.hasError('auth/invalid-email')\">\n Invalid email.\n </div>\n <div class=\"invalid-feedback\" [@fadeInOut]=\"'in'\"\n *ngIf=\"emailFc.hasError('ngx-firebase-auth/account-exists')\">\n We found an account with that email address.\n <a routerLink=\".\" [queryParams]=\"{action: 'signIn'}\">Sign In</a>\n </div>\n <small class=\"text-muted form-text\" [attr.id]=\"formId + 'email'\" >\n Not your email address?\n <a routerLink=\".\" [queryParams]=\"{action: 'signIn'}\">Go Back</a>\n </small>\n </div>\n\n <div class=\"form-group\">\n <div class=\"d-flex justify-content-between align-items-end\">\n <label [attr.for]=\"formId + 'password'\">Choose Password</label>\n <small>\n <a (click)=\"$event.preventDefault(); passwordInput.type = 'password' === passwordInput.type ? 'text' : 'password'\"\n href=\"#\" tabindex=\"-1\" class=\"d-inline-block\">\n <span *ngIf=\"'password' === passwordInput.type\">Show</span>\n <span *ngIf=\"'text' === passwordInput.type\">Hide</span>\n </a>\n </small>\n </div>\n <input\n #passwordInput\n [attr.id]=\"formId + 'password'\"\n [attr.aria-describedby]=\"formId + 'password-help'\"\n type=\"password\"\n formControlName=\"password\"\n placeholder=\"Choose Password\"\n autocomplete=\"password\"\n class=\"form-control\"\n [class.is-invalid]=\"passwordFc.touched && passwordFc.invalid\">\n <div class=\"invalid-feedback\" [@fadeInOut]=\"'in'\"\n *ngIf=\"passwordFc.touched && passwordFc.hasError('required')\">\n Required.\n </div>\n <div class=\"invalid-feedback\" [@fadeInOut]=\"'in'\"\n *ngIf=\"passwordFc.touched && passwordFc.hasError('auth/wrong-password')\">\n Wrong password.\n </div>\n <small [attr.id]=\"formId + 'password-help'\" class=\"form-text text-muted\">\n Please choose a strong password.\n </small>\n </div>\n <div class=\"form-group\">\n <label [attr.for]=\"formId + 'name'\">Your Name</label>\n <input\n [attr.id]=\"formId + 'name'\"\n type=\"text\"\n formControlName=\"name\"\n placeholder=\"Your Name\"\n class=\"form-control\"\n [class.is-invalid]=\"nameFc.touched && nameFc.invalid\">\n <div class=\"invalid-feedback\" [@fadeInOut]=\"'in'\"\n *ngIf=\"nameFc.touched && nameFc.hasError('required')\">\n Required.\n </div>\n </div>\n <div class=\"form-group\">\n <div class=\"form-check\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n [value]=\"true\"\n formControlName=\"remember\"\n [attr.id]=\"formId + 'remember'\">\n <label class=\"form-check-label\" [attr.for]=\"formId + 'remember'\">\n Remember me on this device.\n </label>\n </div>\n </div>\n <div class=\"form-group\">\n <button type=\"submit\"\n class=\"btn btn-success btn-block\"\n [disabled]=\"fg.invalid || submitting\">\n <i class=\"fas fa-lock fa-fw\" aria-hidden=\"true\"></i>\n Create Account\n </button>\n </div>\n</form>\n", styles: [""], animations: [fadeInOutAnimation] },] }, ]; /** @nocollapse */ SignUpFormComponent.ctorParameters = function () { return [ { type: AngularFireAuth }, { type: NgxFirebaseAuthService } ]; }; SignUpFormComponent.propDecorators = { passwordInput: [{ type: ViewChild, args: ['passwordInput',] }], email: [{ type: Input }], remember: [{ type: Input }], rememberChange: [{ type: Output }], success: [{ type: Output }], error: [{ type: Output }] }; return SignUpFormComponent; }()); export { SignUpFormComponent }; if (false) { /** @type {?} */ SignUpFormComponent.prototype.passwordInput; /** @type {?} */ SignUpFormComponent.prototype.email; /** @type {?} */ SignUpFormComponent.prototype.remember; /** @type {?} */ SignUpFormComponent.prototype.rememberChange; /** @type {?} */ SignUpFormComponent.prototype.success; /** @type {?} */ SignUpFormComponent.prototype.error; /** @type {?} */ SignUpFormComponent.prototype.formId; /** @type {?} */ SignUpFormComponent.prototype.submitting; /** @type {?} */ SignUpFormComponent.prototype.fg; /** @type {?} */ SignUpFormComponent.prototype.emailFc; /** @type {?} */ SignUpFormComponent.prototype.passwordFc; /** @type {?} */ SignUpFormComponent.prototype.nameFc; /** @type {?} */ SignUpFormComponent.prototype.rememberFc; /** @type {?} */ SignUpFormComponent.prototype._afAuth; /** @type {?} */ SignUpFormComponent.prototype._authService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi11cC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bub3d6b28vbmd4LWZpcmViYXNlLWF1dGgvIiwic291cmNlcyI6WyJsaWIvc2lnbi1pbi9zaWduLXVwLWZvcm0vc2lnbi11cC1mb3JtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBeUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNySCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOztJQWdJdkUsNkJBQ1UsU0FDQTtRQURBLFlBQU8sR0FBUCxPQUFPO1FBQ1AsaUJBQVksR0FBWixZQUFZOzhCQWI0QixJQUFJLFlBQVksRUFBRTt1QkFDYixJQUFJLFlBQVksRUFBRTtxQkFDN0IsSUFBSSxZQUFZLEVBQUU7c0JBRXJELGlDQUFpQzswQkFDN0IsS0FBSztLQVNiO0lBRUwsc0JBQUkscUNBQUk7Ozs7UUFBUjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztTQUMxQjs7O09BQUE7SUFFRCxzQkFBSSw0Q0FBVzs7OztRQUFmO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDMUI7OztPQUFBOzs7O0lBR0Qsc0NBQVE7OztJQUFSO1FBQUEsaUJBZUM7UUFkQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksV0FBVyxDQUM1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QVcsRUFBRSxDQUFDO1lBQzlCLEtBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDaEMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLEtBQUssb0JBQW9CLENBQUM7Z0JBQzFCLEtBQUssa0NBQWtDO29CQUNyQyx5QkFBeUIsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDekUsS0FBSyxDQUFDO2dCQUNSLEtBQUssb0JBQW9CO29CQUN2Qix5QkFBeUIsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDNUUsS0FBSyxDQUFDO2dCQUNSO29CQUNFLEtBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN2QixLQUFLLENBQUM7YUFDVDtTQUNGLENBQUMsQ0FBQztLQUNOOztnQkEzTUYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxnQ0FBZ0M7b0JBQzFDLFFBQVEsRUFBRSxrMEhBeUdYO29CQUNDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDWixVQUFVLEVBQUUsQ0FBRSxrQkFBa0IsQ0FBRTtpQkFDbkM7Ozs7Z0JBcEhRLGVBQWU7Z0JBS2Ysc0JBQXNCOzs7Z0NBa0g1QixTQUFTLFNBQUMsZUFBZTt3QkFDekIsS0FBSzsyQkFDTCxLQUFLO2lDQUNMLE1BQU07MEJBQ04sTUFBTTt3QkFDTixNQUFNOzs4QkE5SFQ7O1NBdUhhLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFuZ3VsYXJGaXJlQXV0aCB9IGZyb20gJ2FuZ3VsYXJmaXJlMi9hdXRoJztcbmltcG9ydCB7IGF1dGggfSBmcm9tICdmaXJlYmFzZS9hcHAnO1xuXG5pbXBvcnQgeyBmYWRlSW5PdXRBbmltYXRpb24gfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgTmd4RmlyZWJhc2VBdXRoRm9ybUhlbHBlciB9IGZyb20gJy4uLy4uL2Zvcm0taGVscGVyJztcbmltcG9ydCB7IE5neEZpcmViYXNlQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi9uZ3gtZmlyZWJhc2UtYXV0aC5zZXJ2aWNlJztcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1maXJlYmFzZS1hdXRoLXNpZ24tdXAtZm9ybScsXG4gIHRlbXBsYXRlOiBgPGZvcm0gW2Zvcm1Hcm91cF09XCJmZ1wiIChuZ1N1Ym1pdCk9XCJzdWJtaXQoKVwiPlxuICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgIDxsYWJlbCBbYXR0ci5mb3JdPVwiZm9ybUlkICsgJ2VtYWlsJ1wiPkVtYWlsIEFkZHJlc3M8L2xhYmVsPlxuICAgIDxpbnB1dFxuICAgICAgcmVhZG9ubHlcbiAgICAgICNlbWFpbElucHV0XG4gICAgICBbYXR0ci5pZF09XCJmb3JtSWQgKyAnZW1haWwnXCJcbiAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiZm9ybUlkICsgJ2VtYWlsJ1wiXG4gICAgICB0eXBlPVwiZW1haWxcIlxuICAgICAgYXV0b2NvbXBsZXRlPVwiZW1haWxcIlxuICAgICAgcGxhY2Vob2xkZXI9XCJFbWFpbCBBZGRyZXNzXCJcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cImVtYWlsXCJcbiAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+XG4gICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIiBbQGZhZGVJbk91dF09XCInaW4nXCJcbiAgICAgICpuZ0lmPVwiZW1haWxGYy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxuICAgICAgUmVxdWlyZWQuXG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIiBbQGZhZGVJbk91dF09XCInaW4nXCJcbiAgICAgICpuZ0lmPVwiZW1haWxGYy5oYXNFcnJvcignZW1haWwnKVwiPlxuICAgICAgSW52YWxpZCBlbWFpbC5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiIFtAZmFkZUluT3V0XT1cIidpbidcIlxuICAgICAgKm5nSWY9XCJlbWFpbEZjLmhhc0Vycm9yKCdhdXRoL2ludmFsaWQtZW1haWwnKVwiPlxuICAgICAgSW52YWxpZCBlbWFpbC5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiIFtAZmFkZUluT3V0XT1cIidpbidcIlxuICAgICAgKm5nSWY9XCJlbWFpbEZjLmhhc0Vycm9yKCduZ3gtZmlyZWJhc2UtYXV0aC9hY2NvdW50LWV4aXN0cycpXCI+XG4gICAgICBXZSBmb3VuZCBhbiBhY2NvdW50IHdpdGggdGhhdCBlbWFpbCBhZGRyZXNzLlxuICAgICAgPGEgcm91dGVyTGluaz1cIi5cIiBbcXVlcnlQYXJhbXNdPVwie2FjdGlvbjogJ3NpZ25Jbid9XCI+U2lnbiBJbjwvYT5cbiAgICA8L2Rpdj5cbiAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkIGZvcm0tdGV4dFwiIFthdHRyLmlkXT1cImZvcm1JZCArICdlbWFpbCdcIiA+XG4gICAgICBOb3QgeW91ciBlbWFpbCBhZGRyZXNzP1xuICAgICAgPGEgcm91dGVyTGluaz1cIi5cIiBbcXVlcnlQYXJhbXNdPVwie2FjdGlvbjogJ3NpZ25Jbid9XCI+R28gQmFjazwvYT5cbiAgICA8L3NtYWxsPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtZW5kXCI+XG4gICAgICA8bGFiZWwgW2F0dHIuZm9yXT1cImZvcm1JZCArICdwYXNzd29yZCdcIj5DaG9vc2UgUGFzc3dvcmQ8L2xhYmVsPlxuICAgICAgPHNtYWxsPlxuICAgICAgICA8YSAoY2xpY2spPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHBhc3N3b3JkSW5wdXQudHlwZSA9ICdwYXNzd29yZCcgPT09IHBhc3N3b3JkSW5wdXQudHlwZSAgPyAndGV4dCcgOiAncGFzc3dvcmQnXCJcbiAgICAgICAgICBocmVmPVwiI1wiIHRhYmluZGV4PVwiLTFcIiBjbGFzcz1cImQtaW5saW5lLWJsb2NrXCI+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCIncGFzc3dvcmQnID09PSBwYXNzd29yZElucHV0LnR5cGVcIj5TaG93PC9zcGFuPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiJ3RleHQnID09PSBwYXNzd29yZElucHV0LnR5cGVcIj5IaWRlPC9zcGFuPlxuICAgICAgICA8L2E+XG4gICAgICA8L3NtYWxsPlxuICAgIDwvZGl2PlxuICAgIDxpbnB1dFxuICAgICAgI3Bhc3N3b3JkSW5wdXRcbiAgICAgIFthdHRyLmlkXT1cImZvcm1JZCArICdwYXNzd29yZCdcIlxuICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJmb3JtSWQgKyAncGFzc3dvcmQtaGVscCdcIlxuICAgICAgdHlwZT1cInBhc3N3b3JkXCJcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cInBhc3N3b3JkXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiQ2hvb3NlIFBhc3N3b3JkXCJcbiAgICAgIGF1dG9jb21wbGV0ZT1cInBhc3N3b3JkXCJcbiAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cInBhc3N3b3JkRmMudG91Y2hlZCAmJiBwYXNzd29yZEZjLmludmFsaWRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiIFtAZmFkZUluT3V0XT1cIidpbidcIlxuICAgICAgKm5nSWY9XCJwYXNzd29yZEZjLnRvdWNoZWQgJiYgcGFzc3dvcmRGYy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxuICAgICAgUmVxdWlyZWQuXG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIiBbQGZhZGVJbk91dF09XCInaW4nXCJcbiAgICAgICpuZ0lmPVwicGFzc3dvcmRGYy50b3VjaGVkICYmIHBhc3N3b3JkRmMuaGFzRXJyb3IoJ2F1dGgvd3JvbmctcGFzc3dvcmQnKVwiPlxuICAgICAgV3JvbmcgcGFzc3dvcmQuXG4gICAgPC9kaXY+XG4gICAgPHNtYWxsIFthdHRyLmlkXT1cImZvcm1JZCArICdwYXNzd29yZC1oZWxwJ1wiIGNsYXNzPVwiZm9ybS10ZXh0IHRleHQtbXV0ZWRcIj5cbiAgICAgIFBsZWFzZSBjaG9vc2UgYSBzdHJvbmcgcGFzc3dvcmQuXG4gICAgPC9zbWFsbD5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgPGxhYmVsIFthdHRyLmZvcl09XCJmb3JtSWQgKyAnbmFtZSdcIj5Zb3VyIE5hbWU8L2xhYmVsPlxuICAgIDxpbnB1dFxuICAgICAgW2F0dHIuaWRdPVwiZm9ybUlkICsgJ25hbWUnXCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIlxuICAgICAgcGxhY2Vob2xkZXI9XCJZb3VyIE5hbWVcIlxuICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwibmFtZUZjLnRvdWNoZWQgJiYgbmFtZUZjLmludmFsaWRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiIFtAZmFkZUluT3V0XT1cIidpbidcIlxuICAgICAgKm5nSWY9XCJuYW1lRmMudG91Y2hlZCAmJiBuYW1lRmMuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cbiAgICAgIFJlcXVpcmVkLlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiPlxuICAgICAgPGlucHV0XG4gICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiXG4gICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgIFt2YWx1ZV09XCJ0cnVlXCJcbiAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmVtZW1iZXJcIlxuICAgICAgICBbYXR0ci5pZF09XCJmb3JtSWQgKyAncmVtZW1iZXInXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgW2F0dHIuZm9yXT1cImZvcm1JZCArICdyZW1lbWJlcidcIj5cbiAgICAgICAgUmVtZW1iZXIgbWUgb24gdGhpcyBkZXZpY2UuXG4gICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3MgYnRuLWJsb2NrXCJcbiAgICAgIFtkaXNhYmxlZF09XCJmZy5pbnZhbGlkIHx8IHN1Ym1pdHRpbmdcIj5cbiAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWxvY2sgZmEtZndcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICBDcmVhdGUgQWNjb3VudFxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZm9ybT5cbmAsXG4gIHN0eWxlczogW2BgXSxcbiAgYW5pbWF0aW9uczogWyBmYWRlSW5PdXRBbmltYXRpb24gXVxufSlcbmV4cG9ydCBjbGFzcyBTaWduVXBGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcblxuICBAVmlld0NoaWxkKCdwYXNzd29yZElucHV0JykgcGFzc3dvcmRJbnB1dDogRWxlbWVudFJlZjtcbiAgQElucHV0KCkgZW1haWw6IHN0cmluZztcbiAgQElucHV0KCkgcmVtZW1iZXI6IGJvb2xlYW47XG4gIEBPdXRwdXQoKSByZW1lbWJlckNoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgc3VjY2VzczogRXZlbnRFbWl0dGVyPGF1dGguVXNlckNyZWRlbnRpYWw+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZXJyb3I6IEV2ZW50RW1pdHRlcjxhdXRoLkVycm9yPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBmb3JtSWQgPSAnbmd4LWZpcmViYXNlLWF1dGgtc2lnbi11cC1mb3JtLSc7XG4gIHN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgZmc6IEZvcm1Hcm91cDtcbiAgZW1haWxGYzogRm9ybUNvbnRyb2w7XG4gIHBhc3N3b3JkRmM6IEZvcm1Db250cm9sO1xuICBuYW1lRmM6IEZvcm1Db250cm9sO1xuICByZW1lbWJlckZjOiBGb3JtQ29udHJvbDtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfYWZBdXRoOiBBbmd1bGFyRmlyZUF1dGgsXG4gICAgcHJpdmF0ZSBfYXV0aFNlcnZpY2U6IE5neEZpcmViYXNlQXV0aFNlcnZpY2VcbiAgKSB7IH1cblxuICBnZXQgYXV0aCgpOiBhdXRoLkF1dGgge1xuICAgIHJldHVybiB0aGlzLl9hZkF1dGguYXV0aDtcbiAgfVxuXG4gIGdldCBhdXRoU2VydmljZSgpOiBOZ3hGaXJlYmFzZUF1dGhTZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0aFNlcnZpY2U7XG4gIH1cblxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZW1haWxGYyA9IG5ldyBGb3JtQ29udHJvbChcbiAgICAgIHRoaXMuZW1haWwsXG4gICAgICB7dmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMuZW1haWxdfVxuICAgICk7XG4gICAgdGhpcy5wYXNzd29yZEZjID0gbmV3IEZvcm1Db250cm9sKCcnLCB7dmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWRdfSk7XG4gICAgdGhpcy5uYW1lRmMgPSBuZXcgRm9ybUNvbnRyb2woJycsIHt2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgTmd4RmlyZWJhc2VBdXRoRm9ybUhlbHBlci5yZXF1aXJlZE5vbkVtcHR5XX0pO1xuICAgIHRoaXMucmVtZW1iZXJGYyA9IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlbWVtYmVyKTtcbiAgICB0aGlzLnJlbWVtYmVyRmMudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWwgPT4gdGhpcy5yZW1lbWJlckNoYW5nZS5lbWl0KHZhbCkpO1xuICAgIHRoaXMuZmcgPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgIGVtYWlsOiB0aGlzLmVtYWlsRmMsXG4gICAgICBwYXNzd29yZDogdGhpcy5wYXNzd29yZEZjLFxuICAgICAgbmFtZTogdGhpcy5uYW1lRmMsXG4gICAgICByZW1lbWJlcjogdGhpcy5yZW1lbWJlckZjXG4gICAgfSk7XG4gIH1cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMucGFzc3dvcmRJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICBzdWJtaXQoKSB7XG5cbiAgICB0aGlzLnN1Ym1pdHRpbmcgPSB0cnVlO1xuICAgIGxldCBjcmVkOiBhdXRoLlVzZXJDcmVkZW50aWFsO1xuICAgIHRoaXMuYXV0aC5mZXRjaFNpZ25Jbk1ldGhvZHNGb3JFbWFpbCh0aGlzLmVtYWlsKVxuICAgICAgLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh7XG4gICAgICAgICAgICBjb2RlOiAnbmd4LWZpcmViYXNlLWF1dGgvYWNjb3VudC1leGlzdHMnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYXV0aC5jcmVhdGVVc2VyV2l0aEVtYWlsQW5kUGFzc3dvcmQodGhpcy5lbWFpbCwgdGhpcy5wYXNzd29yZEZjLnZhbHVlKTtcbiAgICAgIH0pXG4gICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICBjcmVkID0gcmVzdWx0O1xuICAgICAgICByZXR1cm4gY3JlZC51c2VyLnVwZGF0ZVByb2ZpbGUoe2Rpc3BsYXlOYW1lOiB0aGlzLm5hbWVGYy52YWx1ZS50cmltKCksIHBob3RvVVJMOiBudWxsfSk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hdXRoU2VydmljZS5zZXRSZW1lbWJlcmVkKHRoaXMucmVtZW1iZXJGYy52YWx1ZSA9PT0gdHJ1ZSwgdGhpcy5lbWFpbCk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnN1Y2Nlc3MuZW1pdChjcmVkKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLnN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lbWFpbEZjLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuZW1haWxGYy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgIHRoaXMucGFzc3dvcmRGYy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLnBhc3N3b3JkRmMubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICBzd2l0Y2ggKGVycm9yLmNvZGUpIHtcbiAgICAgICAgICBjYXNlICdhdXRoL2ludmFsaWQtZW1haWwnOlxuICAgICAgICAgIGNhc2UgJ25neC1maXJlYmFzZS1hdXRoL2FjY291bnQtZXhpc3RzJzpcbiAgICAgICAgICAgIE5neEZpcmViYXNlQXV0aEZvcm1IZWxwZXIuc2V0RXJyb3JVbnRpbENoYW5nZWQodGhpcy5lbWFpbEZjLCBlcnJvci5jb2RlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2F1dGgvd2Vhay1wYXNzd29yZCc6XG4gICAgICAgICAgICBOZ3hGaXJlYmFzZUF1dGhGb3JtSGVscGVyLnNldEVycm9yVW50aWxDaGFuZ2VkKHRoaXMucGFzc3dvcmRGYywgZXJyb3IuY29kZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhpcy5lcnJvci5lbWl0KGVycm9yKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG59XG4iXX0=