UNPKG

@nowzoo/ngx-firebase-auth

Version:

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

372 lines (371 loc) 33.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, Input, Output, EventEmitter, TemplateRef } from '@angular/core'; import { Router, ActivatedRoute } from '@angular/router'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { AngularFireAuth } from 'angularfire2/auth'; import { screenAnimation } from '../shared'; import { NgxFirebaseAuthService } from '../ngx-firebase-auth.service'; var SignInComponent = /** @class */ (function () { function SignInComponent(_afAuth, _svc, _route, _router) { this._afAuth = _afAuth; this._svc = _svc; this._route = _route; this._router = _router; this.ngUnsubscribe = new Subject(); this.tosTemplate = null; this.success = new EventEmitter(); this.mode = new EventEmitter(); this.initialOAuthError = null; this.signedOut = false; this.oAuthProviderId = null; this.cred = null; this.unhandledError = null; this.screen = 'wait'; } Object.defineProperty(SignInComponent.prototype, "auth", { get: /** * @return {?} */ function () { return this._afAuth.auth; }, enumerable: true, configurable: true }); Object.defineProperty(SignInComponent.prototype, "authService", { get: /** * @return {?} */ function () { return this._svc; }, enumerable: true, configurable: true }); Object.defineProperty(SignInComponent.prototype, "router", { get: /** * @return {?} */ function () { return this._router; }, enumerable: true, configurable: true }); Object.defineProperty(SignInComponent.prototype, "route", { get: /** * @return {?} */ function () { return this._route; }, enumerable: true, configurable: true }); Object.defineProperty(SignInComponent.prototype, "queryParams", { get: /** * @return {?} */ function () { return this.route.queryParams; }, enumerable: true, configurable: true }); Object.defineProperty(SignInComponent.prototype, "snapshotQueryParams", { get: /** * @return {?} */ function () { return this.route.snapshot.queryParams; }, enumerable: true, configurable: true }); /** * @return {?} */ SignInComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.init(); }; /** * @return {?} */ SignInComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.ngUnsubscribe.next(); this.ngUnsubscribe.complete(); }; /** * @return {?} */ SignInComponent.prototype.init = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var rememberRecord = this.authService.getRemembered(); this.remember = rememberRecord.remember; this.email = rememberRecord.email; return this.onInitHandleSignOut() .then(function (handled) { if (handled) { return handled; } return _this.onInitHandleOAuthRedirect(); }) .then(function (handled) { if (!handled) { _this.showSignIn(); } _this.queryParams.pipe(takeUntil(_this.ngUnsubscribe)).subscribe(function (params) { /** @type {?} */ var action = params["action"] || null; switch (action) { case 'signOut': _this.showSignOut(); break; case 'resetPassword': _this.showResetPassword(); break; case 'signIn': _this.showSignIn(); break; case 'signInPassword': _this.showSignInPassword(); break; case 'signUpPassword': _this.showSignUpPassword(); break; case 'signInOAuth': _this.showSignInOAuth(params["providerId"], null); break; } }); }); }; /** * @return {?} */ SignInComponent.prototype.onInitHandleSignOut = /** * @return {?} */ function () { if (this.snapshotQueryParams["action"] !== 'signOut') { return Promise.resolve(false); } return this.showSignOut().then(function () { return true; }); }; /** * @return {?} */ SignInComponent.prototype.onInitHandleOAuthRedirect = /** * @return {?} */ function () { var _this = this; return new Promise(function (resolve) { /** @type {?} */ var remember = _this.route.snapshot.queryParams["remember"] === 'true'; return _this.auth.getRedirectResult() .then(function (cred) { if (_this.auth.currentUser && cred.user) { _this.authService.setRemembered(remember, cred.user.email) .then(function () { _this.showSignInSuccess(cred); resolve(true); }); } else { resolve(false); } }) .catch(function (error) { _this.showSignInOAuth(null, error); resolve(true); }); }); }; /** * @return {?} */ SignInComponent.prototype.showSignOut = /** * @return {?} */ function () { var _this = this; this.signedOut = false; this.screen = 'wait'; return this.auth.signOut() .then(function () { _this.showSignIn(true); }); }; /** * @param {?=} signedOut * @return {?} */ SignInComponent.prototype.showSignIn = /** * @param {?=} signedOut * @return {?} */ function (signedOut) { this.mode.emit('signIn'); this.signedOut = signedOut === true; this.screen = 'signIn'; }; /** * @return {?} */ SignInComponent.prototype.showSignInPassword = /** * @return {?} */ function () { this.mode.emit('signIn'); this.signedOut = false; this.screen = 'signInPassword'; }; /** * @return {?} */ SignInComponent.prototype.showSignUpPassword = /** * @return {?} */ function () { this.mode.emit('signIn'); this.signedOut = false; this.screen = 'signUpPassword'; }; /** * @param {?} oAuthProviderId * @param {?} error * @return {?} */ SignInComponent.prototype.showSignInOAuth = /** * @param {?} oAuthProviderId * @param {?} error * @return {?} */ function (oAuthProviderId, error) { this.mode.emit('signIn'); this.signedOut = false; this.oAuthProviderId = oAuthProviderId; this.initialOAuthError = error; this.screen = 'signInOAuth'; }; /** * @param {?} cred * @return {?} */ SignInComponent.prototype.showSignInSuccess = /** * @param {?} cred * @return {?} */ function (cred) { this.mode.emit('signIn'); this.signedOut = false; this.cred = cred; this.screen = 'signInSuccess'; this.success.emit(cred); }; /** * @return {?} */ SignInComponent.prototype.showResetPassword = /** * @return {?} */ function () { this.mode.emit('resetPassword'); this.signedOut = false; this.screen = 'resetPassword'; }; /** * @param {?} error * @return {?} */ SignInComponent.prototype.showUnhandledError = /** * @param {?} error * @return {?} */ function (error) { this.signedOut = false; this.unhandledError = error; this.screen = 'unhandledError'; }; SignInComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-firebase-auth-sign-in', template: "<div *ngIf=\"'wait' === screen\" [@screen]=\"'in'\">\n <div class=\"alert alert-secondary\">\n <i class=\"fas fa-spin fa-spinner fa-fw\" aria-hidden=\"true\"></i>\n Please wait...\n </div>\n</div>\n\n<div *ngIf=\"'unhandledError' === screen\" [@screen]=\"'in'\">\n <div class=\"alert alert-danger\">\n <i class=\"fas fa-exclamation-triangle fa-fw text-danger\" aria-hidden=\"true\"></i>\n <strong>Woops!</strong> An unexpected error occurred.\n </div>\n <p class=\"text-muted\">\n Code: {{unhandledError.code}}. Message: {{unhandledError.message}}\n </p>\n <p>\n <a routerLink=\".\" [queryParams]=\"{action: 'signIn'}\">Start Over</a>\n </p>\n</div>\n\n\n<div *ngIf=\"'signInSuccess' === screen\" [@screen]=\"'in'\">\n <div class=\"alert alert-success\">\n <i class=\"fas fa-check fa-fw\" aria-hidden=\"true\"></i>\n Welcome, {{cred.user.displayName}}!\n </div>\n</div>\n\n\n\n\n<div *ngIf=\"'signIn' === screen\" [@screen]=\"'in'\">\n <div class=\"alert alert-success\" *ngIf=\"signedOut\">\n <i class=\"fas fa-check fa-fw\" aria-hidden=\"true\"></i>\n You\u2019re signed out.\n </div>\n <ngx-firebase-auth-sign-in-methods-form\n [(email)]=\"email\"\n [(remember)]=\"remember\"\n [oAuthProviderIds]=\"oAuthProviderIds\"\n (error)=\"showUnhandledError($event)\"\n (success)=\"showSignInSuccess($event)\"></ngx-firebase-auth-sign-in-methods-form>\n <small class=\"text-center text-muted my-2 form-text\">\n <ng-container *ngTemplateOutlet=\"tosTemplate\"></ng-container>\n </small>\n</div>\n\n<div *ngIf=\"'signInPassword' === screen\" [@screen]=\"'in'\">\n <ngx-firebase-auth-sign-in-form\n [email]=\"email\"\n [(remember)]=\"remember\"\n (error)=\"showUnhandledError($event)\"\n (success)=\"showSignInSuccess($event)\"></ngx-firebase-auth-sign-in-form>\n <small class=\"text-center text-muted my-2 form-text\">\n <ng-container *ngTemplateOutlet=\"tosTemplate\"></ng-container>\n </small>\n</div>\n\n<div *ngIf=\"'signUpPassword' === screen\" [@screen]=\"'in'\">\n <ngx-firebase-auth-sign-up-form\n [email]=\"email\"\n [(remember)]=\"remember\"\n (error)=\"showUnhandledError($event)\"\n (success)=\"showSignInSuccess($event)\"></ngx-firebase-auth-sign-up-form>\n <small class=\"text-center text-muted my-2 form-text\">\n <ng-container *ngTemplateOutlet=\"tosTemplate\"></ng-container>\n </small>\n</div>\n\n<div *ngIf=\"'signInOAuth' === screen\" [@screen]=\"'in'\">\n <ngx-firebase-auth-sign-in-oauth\n [providerId]=\"oAuthProviderId\"\n [initialError]=\"initialOAuthError\"\n [useOAuthPopup]=\"useOAuthPopup\"\n [oAuthProviderFactory]=\"oAuthProviderFactory\"\n [(email)]=\"email\"\n [(remember)]=\"remember\"\n (error)=\"showUnhandledError($event)\"\n (success)=\"showSignInSuccess($event)\"></ngx-firebase-auth-sign-in-oauth>\n <small class=\"text-center text-muted my-2 form-text\">\n <ng-container *ngTemplateOutlet=\"tosTemplate\"></ng-container>\n </small>\n</div>\n\n\n\n<div *ngIf=\"'resetPassword' === screen\" [@screen]=\"'in'\">\n <h6>Reset Password</h6>\n <ngx-firebase-auth-reset-password-send-form\n [(email)]=\"email\"\n (error)=\"showUnhandledError($event)\"></ngx-firebase-auth-reset-password-send-form>\n</div>\n", styles: [""], animations: [screenAnimation] },] }, ]; /** @nocollapse */ SignInComponent.ctorParameters = function () { return [ { type: AngularFireAuth }, { type: NgxFirebaseAuthService }, { type: ActivatedRoute }, { type: Router } ]; }; SignInComponent.propDecorators = { oAuthProviderIds: [{ type: Input }], useOAuthPopup: [{ type: Input }], oAuthProviderFactory: [{ type: Input }], tosTemplate: [{ type: Input }], success: [{ type: Output }], mode: [{ type: Output }] }; return SignInComponent; }()); export { SignInComponent }; if (false) { /** @type {?} */ SignInComponent.prototype.ngUnsubscribe; /** @type {?} */ SignInComponent.prototype.oAuthProviderIds; /** @type {?} */ SignInComponent.prototype.useOAuthPopup; /** @type {?} */ SignInComponent.prototype.oAuthProviderFactory; /** @type {?} */ SignInComponent.prototype.tosTemplate; /** @type {?} */ SignInComponent.prototype.success; /** @type {?} */ SignInComponent.prototype.mode; /** @type {?} */ SignInComponent.prototype.remember; /** @type {?} */ SignInComponent.prototype.email; /** @type {?} */ SignInComponent.prototype.initialOAuthError; /** @type {?} */ SignInComponent.prototype.signedOut; /** @type {?} */ SignInComponent.prototype.oAuthProviderId; /** @type {?} */ SignInComponent.prototype.cred; /** @type {?} */ SignInComponent.prototype.unhandledError; /** @type {?} */ SignInComponent.prototype.screen; /** @type {?} */ SignInComponent.prototype._afAuth; /** @type {?} */ SignInComponent.prototype._svc; /** @type {?} */ SignInComponent.prototype._route; /** @type {?} */ SignInComponent.prototype._router; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi1pbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abm93em9vL25neC1maXJlYmFzZS1hdXRoLyIsInNvdXJjZXMiOlsibGliL3NpZ24taW4vc2lnbi1pbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpELE9BQU8sRUFBRSxPQUFPLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTVDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDOztJQTJIcEUseUJBQ1UsU0FDQSxNQUNBLFFBQ0E7UUFIQSxZQUFPLEdBQVAsT0FBTztRQUNQLFNBQUksR0FBSixJQUFJO1FBQ0osV0FBTSxHQUFOLE1BQU07UUFDTixZQUFPLEdBQVAsT0FBTzs2QkF4QnNCLElBQUksT0FBTyxFQUFROzJCQUlqQixJQUFJO3VCQUNVLElBQUksWUFBWSxFQUFFO29CQUNkLElBQUksWUFBWSxFQUFFO2lDQUk3QyxJQUFJO3lCQUN4QixLQUFLOytCQUNTLElBQUk7b0JBQ0YsSUFBSTs4QkFDSCxJQUFJO3NCQUlNLE1BQU07S0FPekM7SUFFSixzQkFBSSxpQ0FBSTs7OztRQUFSO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1NBQzFCOzs7T0FBQTtJQUVELHNCQUFJLHdDQUFXOzs7O1FBQWY7WUFDRSxNQUFNLENBQUMsSUFBSSxD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QyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUM7UUFDOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDekI7Ozs7SUFFRCwyQ0FBaUI7OztJQUFqQjtRQUNFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsZUFBZSxDQUFDO0tBQy9COzs7OztJQUVELDRDQUFrQjs7OztJQUFsQixVQUFtQixLQUFpQjtRQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLGdCQUFnQixDQUFDO0tBQ2hDOztnQkE3UkYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSwyQkFBMkI7b0JBQ3JDLFFBQVEsRUFBRSx3c0dBNEZYO29CQUNDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDWixVQUFVLEVBQUUsQ0FBQyxlQUFlLENBQUM7aUJBQzlCOzs7O2dCQXpHUSxlQUFlO2dCQUlmLHNCQUFzQjtnQkFSZCxjQUFjO2dCQUF0QixNQUFNOzs7bUNBZ0haLEtBQUs7Z0NBQ0wsS0FBSzt1Q0FDTCxLQUFLOzhCQUNMLEtBQUs7MEJBQ0wsTUFBTTt1QkFDTixNQUFNOzswQkF0SFQ7O1NBK0dhLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIsIEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBbmd1bGFyRmlyZUF1dGggfSBmcm9tICdhbmd1bGFyZmlyZTIvYXV0aCc7XG5pbXBvcnQgeyBhdXRoLCBVc2VyIH0gZnJvbSAnZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IHNjcmVlbkFuaW1hdGlvbiB9IGZyb20gJy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBOZ3hGaXJlYmFzZUF1dGhGb3JtSGVscGVyIH0gZnJvbSAnLi4vZm9ybS1oZWxwZXInO1xuaW1wb3J0IHsgTmd4RmlyZWJhc2VBdXRoU2VydmljZSB9IGZyb20gJy4uL25neC1maXJlYmFzZS1hdXRoLnNlcnZpY2UnO1xuXG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWZpcmViYXNlLWF1dGgtc2lnbi1pbicsXG4gIHRlbXBsYXRlOiBgPGRpdiAqbmdJZj1cIid3YWl0JyA9PT0gc2NyZWVuXCIgW0BzY3JlZW5dPVwiJ2luJ1wiPlxuICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtc2Vjb25kYXJ5XCI+XG4gICAgPGkgY2xhc3M9XCJmYXMgZmEtc3BpbiBmYS1zcGlubmVyIGZhLWZ3XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgIFBsZWFzZSB3YWl0Li4uXG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgKm5nSWY9XCIndW5oYW5kbGVkRXJyb3InID09PSBzY3JlZW5cIiBbQHNjcmVlbl09XCInaW4nXCI+XG4gIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIj5cbiAgICA8aSBjbGFzcz1cImZhcyBmYS1leGNsYW1hdGlvbi10cmlhbmdsZSBmYS1mdyB0ZXh0LWRhbmdlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICA8c3Ryb25nPldvb3BzITwvc3Ryb25nPiBBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLlxuICA8L2Rpdj5cbiAgPHAgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XG4gICAgQ29kZToge3t1bmhhbmRsZWRFcnJvci5jb2RlfX0uIE1lc3NhZ2U6IHt7dW5oYW5kbGVkRXJyb3IubWVzc2FnZX19XG4gIDwvcD5cbiAgPHA+XG4gICAgPGEgcm91dGVyTGluaz1cIi5cIiBbcXVlcnlQYXJhbXNdPVwie2FjdGlvbjogJ3NpZ25Jbid9XCI+U3RhcnQgT3ZlcjwvYT5cbiAgPC9wPlxuPC9kaXY+XG5cblxuPGRpdiAqbmdJZj1cIidzaWduSW5TdWNjZXNzJyA9PT0gc2NyZWVuXCIgW0BzY3JlZW5dPVwiJ2luJ1wiPlxuICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtc3VjY2Vzc1wiPlxuICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZWNrIGZhLWZ3XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgIFdlbGNvbWUsIHt7Y3JlZC51c2VyLmRpc3BsYXlOYW1lfX0hXG4gIDwvZGl2PlxuPC9kaXY+XG5cblxuXG5cbjxkaXYgKm5nSWY9XCInc2lnbkluJyA9PT0gc2NyZWVuXCIgW0BzY3JlZW5dPVwiJ2luJ1wiPlxuICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtc3VjY2Vzc1wiICpuZ0lmPVwic2lnbmVkT3V0XCI+XG4gICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hlY2sgZmEtZndcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgWW914oCZcmUgc2lnbmVkIG91dC5cbiAgPC9kaXY+XG4gIDxuZ3gtZmlyZWJhc2UtYXV0aC1zaWduLWluLW1ldGhvZHMtZm9ybVxuICAgIFsoZW1haWwpXT1cImVtYWlsXCJcbiAgICBbKHJlbWVtYmVyKV09XCJyZW1lbWJlclwiXG4gICAgW29BdXRoUHJvdmlkZXJJZHNdPVwib0F1dGhQcm92aWRlcklkc1wiXG4gICAgKGVycm9yKT1cInNob3dVbmhhbmRsZWRFcnJvcigkZXZlbnQpXCJcbiAgICAoc3VjY2Vzcyk9XCJzaG93U2lnbkluU3VjY2VzcygkZXZlbnQpXCI+PC9uZ3gtZmlyZWJhc2UtYXV0aC1zaWduLWluLW1ldGhvZHMtZm9ybT5cbiAgPHNtYWxsIGNsYXNzPVwidGV4dC1jZW50ZXIgdGV4dC1tdXRlZCBteS0yIGZvcm0tdGV4dFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0b3NUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICA8L3NtYWxsPlxuPC9kaXY+XG5cbjxkaXYgKm5nSWY9XCInc2lnbkluUGFzc3dvcmQnID09PSBzY3JlZW5cIiBbQHNjcmVlbl09XCInaW4nXCI+XG4gIDxuZ3gtZmlyZWJhc2UtYXV0aC1zaWduLWluLWZvcm1cbiAgICBbZW1haWxdPVwiZW1haWxcIlxuICAgIFsocmVtZW1iZXIpXT1cInJlbWVtYmVyXCJcbiAgICAoZXJyb3IpPVwic2hvd1VuaGFuZGxlZEVycm9yKCRldmVudClcIlxuICAgIChzdWNjZXNzKT1cInNob3dTaWduSW5TdWNjZXNzKCRldmVudClcIj48L25neC1maXJlYmFzZS1hdXRoLXNpZ24taW4tZm9ybT5cbiAgPHNtYWxsIGNsYXNzPVwidGV4dC1jZW50ZXIgdGV4dC1tdXRlZCBteS0yIGZvcm0tdGV4dFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0b3NUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICA8L3NtYWxsPlxuPC9kaXY+XG5cbjxkaXYgKm5nSWY9XCInc2lnblVwUGFzc3dvcmQnID09PSBzY3JlZW5cIiBbQHNjcmVlbl09XCInaW4nXCI+XG4gIDxuZ3gtZmlyZWJhc2UtYXV0aC1zaWduLXVwLWZvcm1cbiAgICBbZW1haWxdPVwiZW1haWxcIlxuICAgIFsocmVtZW1iZXIpXT1cInJlbWVtYmVyXCJcbiAgICAoZXJyb3IpPVwic2hvd1VuaGFuZGxlZEVycm9yKCRldmVudClcIlxuICAgIChzdWNjZXNzKT1cInNob3dTaWduSW5TdWNjZXNzKCRldmVudClcIj48L25neC1maXJlYmFzZS1hdXRoLXNpZ24tdXAtZm9ybT5cbiAgPHNtYWxsIGNsYXNzPVwidGV4dC1jZW50ZXIgdGV4dC1tdXRlZCBteS0yIGZvcm0tdGV4dFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0b3NUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICA8L3NtYWxsPlxuPC9kaXY+XG5cbjxkaXYgKm5nSWY9XCInc2lnbkluT0F1dGgnID09PSBzY3JlZW5cIiBbQHNjcmVlbl09XCInaW4nXCI+XG4gIDxuZ3gtZmlyZWJhc2UtYXV0aC1zaWduLWluLW9hdXRoXG4gICAgW3Byb3ZpZGVySWRdPVwib0F1dGhQcm92aWRlcklkXCJcbiAgICBbaW5pdGlhbEVycm9yXT1cImluaXRpYWxPQXV0aEVycm9yXCJcbiAgICBbdXNlT0F1dGhQb3B1cF09XCJ1c2VPQXV0aFBvcHVwXCJcbiAgICBbb0F1dGhQcm92aWRlckZhY3RvcnldPVwib0F1dGhQcm92aWRlckZhY3RvcnlcIlxuICAgIFsoZW1haWwpXT1cImVtYWlsXCJcbiAgICBbKHJlbWVtYmVyKV09XCJyZW1lbWJlclwiXG4gICAgKGVycm9yKT1cInNob3dVbmhhbmRsZWRFcnJvcigkZXZlbnQpXCJcbiAgICAoc3VjY2Vzcyk9XCJzaG93U2lnbkluU3VjY2VzcygkZXZlbnQpXCI+PC9uZ3gtZmlyZWJhc2UtYXV0aC1zaWduLWluLW9hdXRoPlxuICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWNlbnRlciB0ZXh0LW11dGVkIG15LTIgZm9ybS10ZXh0XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRvc1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gIDwvc21hbGw+XG48L2Rpdj5cblxuXG5cbjxkaXYgKm5nSWY9XCIncmVzZXRQYXNzd29yZCcgPT09IHNjcmVlblwiIFtAc2NyZWVuXT1cIidpbidcIj5cbiAgPGg2PlJlc2V0IFBhc3N3b3JkPC9oNj5cbiAgPG5neC1maXJlYmFzZS1hdXRoLXJlc2V0LXBhc3N3b3JkLXNlbmQtZm9ybVxuICAgIFsoZW1haWwpXT1cImVtYWlsXCJcbiAgICAoZXJyb3IpPVwic2hvd1VuaGFuZGxlZEVycm9yKCRldmVudClcIj48L25neC1maXJlYmFzZS1hdXRoLXJlc2V0LXBhc3N3b3JkLXNlbmQtZm9ybT5cbjwvZGl2PlxuYCxcbiAgc3R5bGVzOiBbYGBdLFxuICBhbmltYXRpb25zOiBbc2NyZWVuQW5pbWF0aW9uXVxufSlcbmV4cG9ydCBjbGFzcyBTaWduSW5Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgbmdVbnN1YnNjcmliZTogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIEBJbnB1dCgpIG9BdXRoUHJvdmlkZXJJZHM6IHN0cmluZ1tdO1xuICBASW5wdXQoKSB1c2VPQXV0aFBvcHVwOiBib29sZWFuO1xuICBASW5wdXQoKSBvQXV0aFByb3ZpZGVyRmFjdG9yeTogKHByb3ZpZGVySWQ6IHN0cmluZykgPT4gYXV0aC5BdXRoUHJvdmlkZXI7XG4gIEBJbnB1dCgpIHRvc1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbnVsbDtcbiAgQE91dHB1dCgpIHN1Y2Nlc3M6IEV2ZW50RW1pdHRlcjxhdXRoLlVzZXJDcmVkZW50aWFsPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG1vZGU6IEV2ZW50RW1pdHRlcjwnc2lnbkluJyB8ICdyZXNldFBhc3N3b3JkJz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcmVtZW1iZXI6IGJvb2xlYW47XG4gIGVtYWlsOiBzdHJpbmc7XG4gIGluaXRpYWxPQXV0aEVycm9yOiBhdXRoLkVycm9yID0gbnVsbDtcbiAgc2lnbmVkT3V0ID0gZmFsc2U7XG4gIG9BdXRoUHJvdmlkZXJJZDogc3RyaW5nID0gbnVsbDtcbiAgY3JlZDogYXV0aC5Vc2VyQ3JlZGVudGlhbCA9IG51bGw7XG4gIHVuaGFuZGxlZEVycm9yOiBhdXRoLkVycm9yID0gbnVsbDtcblxuICBzY3JlZW46ICd3YWl0JyB8XG4gICAgJ3NpZ25JbicgfCAnc2lnbkluUGFzc3dvcmQnIHwgJ3NpZ25VcFBhc3N3b3JkJyB8ICdzaWduSW5PQXV0aCcgfCAnc2lnbkluU3VjY2VzcycgfFxuICAgICdyZXNldFBhc3N3b3JkJyB8ICd1bmhhbmRsZWRFcnJvcicgPSAnd2FpdCc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfYWZBdXRoOiBBbmd1bGFyRmlyZUF1dGgsXG4gICAgcHJpdmF0ZSBfc3ZjOiBOZ3hGaXJlYmFzZUF1dGhTZXJ2aWNlLFxuICAgIHByaXZhdGUgX3JvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcbiAgKSB7fVxuXG4gIGdldCBhdXRoKCk6IGF1dGguQXV0aCB7XG4gICAgcmV0dXJuIHRoaXMuX2FmQXV0aC5hdXRoO1xuICB9XG5cbiAgZ2V0IGF1dGhTZXJ2aWNlKCk6IE5neEZpcmViYXNlQXV0aFNlcnZpY2Uge1xuICAgIHJldHVybiB0aGlzLl9zdmM7XG4gIH1cblxuICBnZXQgcm91dGVyKCk6IFJvdXRlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JvdXRlcjtcbiAgfVxuXG4gIGdldCByb3V0ZSgpOiBBY3RpdmF0ZWRSb3V0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3JvdXRlO1xuICB9XG5cbiAgZ2V0IHF1ZXJ5UGFyYW1zKCk6IE9ic2VydmFibGU8e1trZXk6IHN0cmluZ106IGFueX0+IHtcbiAgICByZXR1cm4gdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcztcbiAgfVxuXG4gIGdldCBzbmFwc2hvdFF1ZXJ5UGFyYW1zKCk6IHtba2V5OiBzdHJpbmddOiBhbnl9IHtcbiAgICByZXR1cm4gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcztcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgfVxuXG4gIGluaXQoKSB7XG4gICAgY29uc3QgcmVtZW1iZXJSZWNvcmQgPSB0aGlzLmF1dGhTZXJ2aWNlLmdldFJlbWVtYmVyZWQoKTtcbiAgICB0aGlzLnJlbWVtYmVyID0gcmVtZW1iZXJSZWNvcmQucmVtZW1iZXI7XG4gICAgdGhpcy5lbWFpbCA9IHJlbWVtYmVyUmVjb3JkLmVtYWlsO1xuICAgIHJldHVybiB0aGlzLm9uSW5pdEhhbmRsZVNpZ25PdXQoKVxuICAgICAgLnRoZW4oKGhhbmRsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKGhhbmRsZWQpIHtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5vbkluaXRIYW5kbGVPQXV0aFJlZGlyZWN0KCk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oKGhhbmRsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCEgaGFuZGxlZCkge1xuICAgICAgICAgIHRoaXMuc2hvd1NpZ25JbigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucXVlcnlQYXJhbXMucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKHBhcmFtcyA9PiB7XG4gICAgICAgICAgY29uc3QgYWN0aW9uID0gcGFyYW1zLmFjdGlvbiB8fCBudWxsO1xuICAgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICdzaWduT3V0JzpcbiAgICAgICAgICAgICAgdGhpcy5zaG93U2lnbk91dCgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3Jlc2V0UGFzc3dvcmQnOlxuICAgICAgICAgICAgICB0aGlzLnNob3dSZXNldFBhc3N3b3JkKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2lnbkluJzpcbiAgICAgICAgICAgICAgdGhpcy5zaG93U2lnbkluKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2lnbkluUGFzc3dvcmQnOlxuICAgICAgICAgICAgICB0aGlzLnNob3dTaWduSW5QYXNzd29yZCgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NpZ25VcFBhc3N3b3JkJzpcbiAgICAgICAgICAgICAgdGhpcy5zaG93U2lnblVwUGFzc3dvcmQoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzaWduSW5PQXV0aCc6XG4gICAgICAgICAgICAgIHRoaXMuc2hvd1NpZ25Jbk9BdXRoKHBhcmFtcy5wcm92aWRlcklkLCBudWxsKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgb25Jbml0SGFuZGxlU2lnbk91dCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5zbmFwc2hvdFF1ZXJ5UGFyYW1zLmFjdGlvbiAhPT0gJ3NpZ25PdXQnKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2hvd1NpZ25PdXQoKS50aGVuKCgpID0+IHRydWUpO1xuICB9XG4gIG9uSW5pdEhhbmRsZU9BdXRoUmVkaXJlY3QoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgY29uc3QgcmVtZW1iZXI6IGJvb2xlYW4gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zLnJlbWVtYmVyID09PSAndHJ1ZSc7XG4gICAgICByZXR1cm4gdGhpcy5hdXRoLmdldFJlZGlyZWN0UmVzdWx0KClcbiAgICAgICAgLnRoZW4oKGNyZWQ6IGF1dGguVXNlckNyZWRlbnRpYWwpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5hdXRoLmN1cnJlbnRVc2VyICYmIGNyZWQudXNlcikge1xuICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5zZXRSZW1lbWJlcmVkKHJlbWVtYmVyLCBjcmVkLnVzZXIuZW1haWwpXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dTaWduSW5TdWNjZXNzKGNyZWQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IGF1dGguRXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLnNob3dTaWduSW5PQXV0aChudWxsLCBlcnJvciApO1xuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cblxuXG5cbiAgc2hvd1NpZ25PdXQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLnNpZ25lZE91dCA9IGZhbHNlO1xuICAgIHRoaXMuc2NyZWVuID0gJ3dhaXQnO1xuICAgIHJldHVybiB0aGlzLmF1dGguc2lnbk91dCgpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuc2hvd1NpZ25Jbih0cnVlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgc2hvd1NpZ25JbihzaWduZWRPdXQ/OiBib29sZWFuKSB7XG4gICAgdGhpcy5tb2RlLmVtaXQoJ3NpZ25JbicpO1xuICAgIHRoaXMuc2lnbmVkT3V0ID0gc2lnbmVkT3V0ID09PSB0cnVlO1xuICAgIHRoaXMuc2NyZWVuID0gJ3NpZ25Jbic7XG4gIH1cblxuICBzaG93U2lnbkluUGFzc3dvcmQoKSB7XG4gICAgdGhpcy5tb2RlLmVtaXQoJ3NpZ25JbicpO1xuICAgIHRoaXMuc2lnbmVkT3V0ID0gZmFsc2U7XG4gICAgdGhpcy5zY3JlZW4gPSAnc2lnbkluUGFzc3dvcmQnO1xuICB9XG5cbiAgc2hvd1NpZ25VcFBhc3N3b3JkKCkge1xuICAgIHRoaXMubW9kZS5lbWl0KCdzaWduSW4nKTtcbiAgICB0aGlzLnNpZ25lZE91dCA9IGZhbHNlO1xuICAgIHRoaXMuc2NyZWVuID0gJ3NpZ25VcFBhc3N3b3JkJztcblxuICB9XG5cbiAgc2hvd1NpZ25Jbk9BdXRoKG9BdXRoUHJvdmlkZXJJZDogc3RyaW5nLCBlcnJvcjogYXV0aC5FcnJvcikge1xuICAgIHRoaXMubW9kZS5lbWl0KCdzaWduSW4nKTtcbiAgICB0aGlzLnNpZ25lZE91dCA9IGZhbHNlO1xuICAgIHRoaXMub0F1dGhQcm92aWRlcklkID0gb0F1dGhQcm92aWRlcklkO1xuICAgIHRoaXMuaW5pdGlhbE9BdXRoRXJyb3IgPSBlcnJvcjtcbiAgICB0aGlzLnNjcmVlbiA9ICdzaWduSW5PQXV0aCc7XG4gIH1cblxuICBzaG93U2lnbkluU3VjY2VzcyhjcmVkOiBhdXRoLlVzZXJDcmVkZW50aWFsKSB7XG4gICAgdGhpcy5tb2RlLmVtaXQoJ3NpZ25JbicpO1xuICAgIHRoaXMuc2lnbmVkT3V0ID0gZmFsc2U7XG4gICAgdGhpcy5jcmVkID0gY3JlZDtcbiAgICB0aGlzLnNjcmVlbiA9ICdzaWduSW5TdWNjZXNzJztcbiAgICB0aGlzLnN1Y2Nlc3MuZW1pdChjcmVkKTtcbiAgfVxuXG4gIHNob3dSZXNldFBhc3N3b3JkKCkge1xuICAgIHRoaXMubW9kZS5lbWl0KCdyZXNldFBhc3N3b3JkJyk7XG4gICAgdGhpcy5zaWduZWRPdXQgPSBmYWxzZTtcbiAgICB0aGlzLnNjcmVlbiA9ICdyZXNldFBhc3N3b3JkJztcbiAgfVxuXG4gIHNob3dVbmhhbmRsZWRFcnJvcihlcnJvcjogYXV0aC5FcnJvcikge1xuICAgIHRoaXMuc2lnbmVkT3V0ID0gZmFsc2U7XG4gICAgdGhpcy51bmhhbmRsZWRFcnJvciA9IGVycm9yO1xuICAgIHRoaXMuc2NyZWVuID0gJ3VuaGFuZGxlZEVycm9yJztcbiAgfVxufVxuIl19