UNPKG

@knora/action

Version:
146 lines 19.7 kB
import * as tslib_1 from "tslib"; import { Component, EventEmitter, Inject, Input, Output } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { ApiResponseData, ApiResponseError, KnoraApiConnection, LoginResponse, LogoutResponse } from '@knora/api'; import { KnoraApiConnectionToken, Session, SessionService } from '@knora/core'; let LoginFormComponent = class LoginFormComponent { constructor(knoraApiConnection, _session, _fb) { this.knoraApiConnection = knoraApiConnection; this._session = _session; this._fb = _fb; /** * Emits true when the login process was successful and false in case of error on login or false after logout process * * @param {EventEmitter<boolean>} status * */ this.status = new EventEmitter(); // show progress indicator this.loading = false; // specific error messages this.loginErrorUser = false; this.loginErrorPw = false; this.loginErrorServer = false; // labels for the login form // TODO: should be handled by translation service (i18n) this.formLabel = { title: 'Login here', name: 'Username', pw: 'Password', submit: 'Login', retry: 'Retry', logout: 'LOGOUT', remember: 'Remember me', forgot_pw: 'Forgot password?', error: { failed: 'Password or username is wrong', server: 'There\'s an error with the server connection. Try it again later or inform the Knora Team' } }; // error definitions for the following form fields this.formErrors = { 'username': '', 'password': '' }; // error messages for the form fields defined in formErrors this.validationMessages = { 'username': { 'required': 'user name is required.' }, 'password': { 'required': 'password is required' } }; } ngOnInit() { // if session is valid (a user is logged-in) show a message, otherwise build the form if (this._session.validateSession()) { this.session = JSON.parse(localStorage.getItem('session')); } else { this.buildForm(); } } buildForm() { this.form = this._fb.group({ username: ['', Validators.required], password: ['', Validators.required] }); } /** * @ignore * * Login and set session */ login() { this.loading = true; // reset the error messages this.errorMessage = undefined; // Grab values from form const identifier = this.form.get('username').value; const password = this.form.get('password').value; const identifierType = (identifier.indexOf('@') > -1 ? 'email' : 'username'); this.knoraApiConnection.v2.auth.login(identifierType, identifier, password).subscribe((response) => { this._session.setSession(response.body.token, identifier, identifierType); setTimeout(() => { this.status.emit(true); this.loading = false; }, 2200); }, (error) => { // error handling this.loginErrorUser = (error.status === 404); this.loginErrorPw = (error.status === 401); this.loginErrorServer = (error.status === 0); this.errorMessage = error; this.loading = false; // TODO: update error handling similar to the old method (see commented code below) }); } /** * @ignore * * Logout and destroy session * */ logout() { this.loading = true; this.knoraApiConnection.v2.auth.logout().subscribe((response) => { this.status.emit(response.body.status === 0); this._session.destroySession(); this.loading = false; }, (error) => { console.error(error); this.loading = false; }); } }; LoginFormComponent.ctorParameters = () => [ { type: KnoraApiConnection, decorators: [{ type: Inject, args: [KnoraApiConnectionToken,] }] }, { type: SessionService }, { type: FormBuilder } ]; tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", String) ], LoginFormComponent.prototype, "navigate", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", String) ], LoginFormComponent.prototype, "color", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", EventEmitter) ], LoginFormComponent.prototype, "status", void 0); LoginFormComponent = tslib_1.__decorate([ Component({ selector: 'kui-login-form', template: "<div class=\"login-container\" *ngIf=\"!session\">\n\n <h2 class=\"login-form-title mat-title\">{{formLabel.title}}</h2>\n\n <!-- This is the login form -->\n <form [formGroup]=\"form\" (ngSubmit)=\"login()\" class=\"login-form\">\n\n <!-- Username -->\n <mat-form-field class=\"full-width login-field\">\n <!-- <mat-icon matPrefix>person</mat-icon> -->\n\n <input matInput autofocus [placeholder]=\"formLabel.name\" autocomplete=\"username\" formControlName=\"username\"\n #username cdkFocusInitial>\n\n </mat-form-field>\n\n <!-- Password -->\n <mat-form-field class=\"full-width login-field\">\n\n <!-- <mat-icon matPrefix>lock</mat-icon> -->\n\n <input matInput type=\"password\" [placeholder]=\"formLabel.pw\" autocomplete=\"current-password\"\n formControlName=\"password\">\n\n </mat-form-field>\n\n <br>\n\n <!-- Button: Login -->\n <button mat-raised-button type=\"submit\" [disabled]=\"!form.valid\" class=\"full-width submit-button\"\n [class.mat-primary]=\"!errorMessage\" [class.mat-warn]=\"errorMessage\">\n <kui-progress-indicator [color]=\"'white'\" [status]=\"0\" *ngIf=\"loading\" class=\"login-progress\">\n </kui-progress-indicator>\n <mat-icon *ngIf=\"errorMessage && !loading\">close</mat-icon>\n {{errorMessage ? formLabel.retry : formLabel.submit}}\n </button>\n\n <br><br>\n\n <!-- Error message as an answer from knora api request -->\n <p class=\"full-width login-error\" *ngIf=\"errorMessage\">\n {{loginErrorServer ? formLabel.error.server : formLabel.error.failed}}\n </p>\n </form>\n</div>\n\n\n<!-- a user is already logged in; show who it is and a logout button -->\n<div class=\"logout-container\" *ngIf=\"session\">\n <p>A user is already logged in:</p>\n <p>Username: <strong>{{session.user.name}}</strong></p>\n <br>\n <p>Please log out if it's not you.</p>\n <button mat-raised-button (click)=\"logout()\" class=\"full-width mat-warn logout-button\">\n <kui-progress-indicator [color]=\"'white'\" [status]=\"0\" *ngIf=\"loading\" class=\"login-progress\">\n </kui-progress-indicator>\n {{formLabel.logout}}\n </button>\n</div>\n", styles: [".full-width{width:100%}.login-form-title{text-align:center}.login-error{color:#ef5350;text-align:center}.login-progress{display:inline-block;margin-right:6px}.login-container,.logout-container{margin-left:auto;margin-right:auto;position:relative;width:280px}.logout-button,.submit-button{height:48px}.center{text-align:center}"] }), tslib_1.__param(0, Inject(KnoraApiConnectionToken)), tslib_1.__metadata("design:paramtypes", [KnoraApiConnection, SessionService, FormBuilder]) ], LoginFormComponent); export { LoginFormComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4tZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa25vcmEvYWN0aW9uLyIsInNvdXJjZXMiOlsibGliL2xvZ2luLWZvcm0vbG9naW4tZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNsSCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQU8vRSxJQUFhLGtCQUFrQixHQUEvQixNQUFhLGtCQUFrQjtJQTJFM0IsWUFDNkMsa0JBQXNDLEVBQ3ZFLFFBQXdCLEVBQ3hCLEdBQWdCO1FBRmlCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdkUsYUFBUSxHQUFSLFFBQVEsQ0FBZ0I7UUFDeEIsUUFBRyxHQUFILEdBQUcsQ0FBYTtRQTlENUI7Ozs7O1dBS0c7UUFDTyxXQUFNLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7UUFRdEUsMEJBQTBCO1FBQzFCLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFLekIsMEJBQTBCO1FBQzFCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUV6Qiw0QkFBNEI7UUFDNUIsd0RBQXdEO1FBQ3hELGNBQVMsR0FBRztZQUNSLEtBQUssRUFBRSxZQUFZO1lBQ25CLElBQUksRUFBRSxVQUFVO1lBQ2hCLEVBQUUsRUFBRSxV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QixXQUFXO0dBOUVuQixrQkFBa0IsQ0FrSzlCO1NBbEtZLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlRGF0YSwgQXBpUmVzcG9uc2VFcnJvciwgS25vcmFBcGlDb25uZWN0aW9uLCBMb2dpblJlc3BvbnNlLCBMb2dvdXRSZXNwb25zZSB9IGZyb20gJ0Brbm9yYS9hcGknO1xuaW1wb3J0IHsgS25vcmFBcGlDb25uZWN0aW9uVG9rZW4sIFNlc3Npb24sIFNlc3Npb25TZXJ2aWNlIH0gZnJvbSAnQGtub3JhL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2t1aS1sb2dpbi1mb3JtJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbG9naW4tZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vbG9naW4tZm9ybS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIExvZ2luRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgLyoqXG4gICAgICogTmF2aWdhdGUgdG8gdGhlIGRlZmluZWQgdXJsIChvciBwYXRoKSBhZnRlciBzdWNjZXNzZnVsIGxvZ2luXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IFtuYXZpZ2F0ZV1cbiAgICAgKi9cbiAgICBASW5wdXQoKSBuYXZpZ2F0ZT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFNldCB5b3VyIHRoZW1lIGNvbG9yIGhlcmUsXG4gICAgICogaXQgd2lsbCBiZSB1c2VkIGluIHRoZSBwcm9ncmVzcy1pbmRpY2F0b3IgYW5kIHRoZSBidXR0b25zXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yXVxuICAgICAqL1xuICAgIEBJbnB1dCgpIGNvbG9yPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgdHJ1ZSB3aGVuIHRoZSBsb2dpbiBwcm9jZXNzIHdhcyBzdWNjZXNzZnVsIGFuZCBmYWxzZSBpbiBjYXNlIG9mIGVycm9yIG9uIGxvZ2luIG9yIGZhbHNlIGFmdGVyIGxvZ291dCBwcm9jZXNzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtFdmVudEVtaXR0ZXI8Ym9vbGVhbj59IHN0YXR1c1xuICAgICAqXG4gICAgICovXG4gICAgQE91dHB1dCgpIHN0YXR1czogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgLy8gaXMgdGhlcmUgYWxyZWFkeSBhIHZhbGlkIHNlc3Npb24/XG4gICAgc2Vzc2lvbjogU2Vzc2lvbjtcblxuICAgIC8vIGZvcm1cbiAgICBmb3JtOiBGb3JtR3JvdXA7XG5cbiAgICAvLyBzaG93IHByb2dyZXNzIGluZGljYXRvclxuICAgIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8vIGdlbmVyYWwgZXJyb3IgbWVzc2FnZVxuICAgIGVycm9yTWVzc2FnZTogQXBpUmVzcG9uc2VFcnJvcjtcblxuICAgIC8vIHNwZWNpZmljIGVycm9yIG1lc3NhZ2VzXG4gICAgbG9naW5FcnJvclVzZXIgPSBmYWxzZTtcbiAgICBsb2dpbkVycm9yUHcgPSBmYWxzZTtcbiAgICBsb2dpbkVycm9yU2VydmVyID0gZmFsc2U7XG5cbiAgICAvLyBsYWJlbHMgZm9yIHRoZSBsb2dpbiBmb3JtXG4gICAgLy8gVE9ETzogc2hvdWxkIGJlIGhhbmRsZWQgYnkgdHJhbnNsYXRpb24gc2VydmljZSAoaTE4bilcbiAgICBmb3JtTGFiZWwgPSB7XG4gICAgICAgIHRpdGxlOiAnTG9naW4gaGVyZScsXG4gICAgICAgIG5hbWU6ICdVc2VybmFtZScsXG4gICAgICAgIHB3OiAnUGFzc3dvcmQnLFxuICAgICAgICBzdWJtaXQ6ICdMb2dpbicsXG4gICAgICAgIHJldHJ5OiAnUmV0cnknLFxuICAgICAgICBsb2dvdXQ6ICdMT0dPVVQnLFxuICAgICAgICByZW1lbWJlcjogJ1JlbWVtYmVyIG1lJyxcbiAgICAgICAgZm9yZ290X3B3OiAnRm9yZ290IHBhc3N3b3JkPycsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBmYWlsZWQ6ICdQYXNzd29yZCBvciB1c2VybmFtZSBpcyB3cm9uZycsXG4gICAgICAgICAgICBzZXJ2ZXI6ICdUaGVyZVxcJ3MgYW4gZXJyb3Igd2l0aCB0aGUgc2VydmVyIGNvbm5lY3Rpb24uIFRyeSBpdCBhZ2FpbiBsYXRlciBvciBpbmZvcm0gdGhlIEtub3JhIFRlYW0nXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gZXJyb3IgZGVmaW5pdGlvbnMgZm9yIHRoZSBmb2xsb3dpbmcgZm9ybSBmaWVsZHNcbiAgICBmb3JtRXJyb3JzID0ge1xuICAgICAgICAndXNlcm5hbWUnOiAnJyxcbiAgICAgICAgJ3Bhc3N3b3JkJzogJydcbiAgICB9O1xuXG4gICAgLy8gZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBmb3JtIGZpZWxkcyBkZWZpbmVkIGluIGZvcm1FcnJvcnNcbiAgICB2YWxpZGF0aW9uTWVzc2FnZXMgPSB7XG4gICAgICAgICd1c2VybmFtZSc6IHtcbiAgICAgICAgICAgICdyZXF1aXJlZCc6ICd1c2VyIG5hbWUgaXMgcmVxdWlyZWQuJ1xuICAgICAgICB9LFxuICAgICAgICAncGFzc3dvcmQnOiB7XG4gICAgICAgICAgICAncmVxdWlyZWQnOiAncGFzc3dvcmQgaXMgcmVxdWlyZWQnXG4gICAgICAgIH1cbiAgICB9O1xuXG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChLbm9yYUFwaUNvbm5lY3Rpb25Ub2tlbikgcHJpdmF0ZSBrbm9yYUFwaUNvbm5lY3Rpb246IEtub3JhQXBpQ29ubmVjdGlvbixcbiAgICAgICAgcHJpdmF0ZSBfc2Vzc2lvbjogU2Vzc2lvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX2ZiOiBGb3JtQnVpbGRlclxuICAgICkgeyB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgLy8gaWYgc2Vzc2lvbiBpcyB2YWxpZCAoYSB1c2VyIGlzIGxvZ2dlZC1pbikgc2hvdyBhIG1lc3NhZ2UsIG90aGVyd2lzZSBidWlsZCB0aGUgZm9ybVxuICAgICAgICBpZiAodGhpcy5fc2Vzc2lvbi52YWxpZGF0ZVNlc3Npb24oKSkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc2Vzc2lvbicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRGb3JtKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBidWlsZEZvcm0oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuX2ZiLmdyb3VwKHtcbiAgICAgICAgICAgIHVzZXJuYW1lOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqXG4gICAgICogTG9naW4gYW5kIHNldCBzZXNzaW9uXG4gICAgICovXG4gICAgbG9naW4oKSB7XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgICAvLyByZXNldCB0aGUgZXJyb3IgbWVzc2FnZXNcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gR3JhYiB2YWx1ZXMgZnJvbSBmb3JtXG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmZvcm0uZ2V0KCd1c2VybmFtZScpLnZhbHVlO1xuICAgICAgICBjb25zdCBwYXNzd29yZCA9IHRoaXMuZm9ybS5nZXQoJ3Bhc3N3b3JkJykudmFsdWU7XG5cbiAgICAgICAgY29uc3QgaWRlbnRpZmllclR5cGU6ICdpcmknIHwgJ2VtYWlsJyB8ICd1c2VybmFtZScgPSAoaWRlbnRpZmllci5pbmRleE9mKCdAJykgPiAtMSA/ICdlbWFpbCcgOiAndXNlcm5hbWUnKTtcblxuICAgICAgICB0aGlzLmtub3JhQXBpQ29ubmVjdGlvbi52Mi5hdXRoLmxvZ2luKGlkZW50aWZpZXJUeXBlLCBpZGVudGlmaWVyLCBwYXNzd29yZCkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgKHJlc3BvbnNlOiBBcGlSZXNwb25zZURhdGE8TG9naW5SZXNwb25zZT4pID0+IHtcblxuICAgICAgICAgICAgICAgIHRoaXMuX3Nlc3Npb24uc2V0U2Vzc2lvbihyZXNwb25zZS5ib2R5LnRva2VuLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyVHlwZSk7XG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMuZW1pdCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSwgMjIwMCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGVycm9yOiBBcGlSZXNwb25zZUVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gZXJyb3IgaGFuZGxpbmdcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2luRXJyb3JVc2VyID0gKGVycm9yLnN0YXR1cyA9PT0gNDA0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2luRXJyb3JQdyA9IChlcnJvci5zdGF0dXMgPT09IDQwMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dpbkVycm9yU2VydmVyID0gKGVycm9yLnN0YXR1cyA9PT0gMCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IGVycm9yO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogdXBkYXRlIGVycm9yIGhhbmRsaW5nIHNpbWlsYXIgdG8gdGhlIG9sZCBtZXRob2QgKHNlZSBjb21tZW50ZWQgY29kZSBiZWxvdylcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaWdub3JlXG4gICAgICpcbiAgICAgKiBMb2dvdXQgYW5kIGRlc3Ryb3kgc2Vzc2lvblxuICAgICAqXG4gICAgICovXG4gICAgbG9nb3V0KCkge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMua25vcmFBcGlDb25uZWN0aW9uLnYyLmF1dGgubG9nb3V0KCkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgKHJlc3BvbnNlOiBBcGlSZXNwb25zZURhdGE8TG9nb3V0UmVzcG9uc2U+KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMuZW1pdChyZXNwb25zZS5ib2R5LnN0YXR1cyA9PT0gMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbi5kZXN0cm95U2Vzc2lvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlcnJvcjogQXBpUmVzcG9uc2VFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgfVxuXG59XG4iXX0=