@schoolbelle/common
Version:
Demo library to showcase Angular packaging format
265 lines (259 loc) • 21.1 kB
JavaScript
import { Injectable, Inject, NgModule } from '@angular/core';
import { REST_SERVER_HOST } from '@schoolbelle/common/tokens';
import { HttpClient, HttpClientModule } from '@angular/common/http';
import { StorageService, StorageServiceModule } from '@schoolbelle/common/services/storage';
import 'rxjs/add/operator/toPromise';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class AuthService {
/**
* @param {?} http
* @param {?} storageService
* @param {?} serverHost
*/
constructor(http, storageService, serverHost) {
this.http = http;
this.storageService = storageService;
this.serverHost = serverHost;
let /** @type {?} */ type = /** @type {?} */ (this.storageService.get('sbe-auth.session.type', 'session'));
let /** @type {?} */ intltel = this.storageService.get('sbe-auth.session.intltel', 'session');
let /** @type {?} */ verificationCode = this.storageService.get('sbe-auth.session.verificationCode', 'session');
if (type)
this.type = type;
if (intltel)
this.intltel = intltel;
if (verificationCode)
this.verificationCode = verificationCode;
}
/**
* @return {?}
*/
get type() {
return this._type;
}
/**
* @param {?} v
* @return {?}
*/
set type(v) {
this._type = v;
if (v) {
this.storageService.set('sbe-auth.session.type', v, 'session');
}
else {
this.storageService.remove('sbe-auth.session.type', 'session');
}
}
/**
* @return {?}
*/
get intltel() {
return this._intltel;
}
/**
* @param {?} v
* @return {?}
*/
set intltel(v) {
this._intltel = v;
if (v) {
this.storageService.set('sbe-auth.session.intltel', v, 'session');
}
else {
this.storageService.remove('sbe-auth.session.intltel', 'session');
}
}
/**
* @return {?}
*/
get verificationCode() {
return this._verificationCode;
}
/**
* @param {?} v
* @return {?}
*/
set verificationCode(v) {
this._verificationCode = v;
if (v) {
this.storageService.set('sbe-auth.session.verificationCode', v, 'session');
}
else {
this.storageService.remove('sbe-auth.session.verificationCode', 'session');
}
}
/**
* @return {?}
*/
clear() {
this.type = undefined;
this.intltel = undefined;
this.verificationCode = undefined;
}
/**
* @param {?} idtoken
* @return {?}
*/
saveToken(idtoken) {
if (idtoken) {
this.storageService.set(AuthService.localStorageIdTokenKey, idtoken, 'local');
}
else {
this.storageService.remove(AuthService.localStorageIdTokenKey, 'local');
}
}
/**
* @param {?=} type
* @param {?=} countryDialCode
* @param {?=} tel
* @return {?}
*/
requestCode(type = 'register', countryDialCode, tel) {
const /** @type {?} */ url = `${this.serverHost}/verification/request_code`;
return this.http
.post(url, { type: type, countryDialCode: countryDialCode, tel: tel }, { responseType: 'text' })
.toPromise();
}
/**
* @param {?=} type
* @param {?=} countryDialCode
* @param {?=} tel
* @param {?=} verificationCode
* @param {?=} callback_url
* @return {?}
*/
verifyCode(type = 'register', countryDialCode, tel, verificationCode, callback_url = undefined) {
const /** @type {?} */ url = `${this.serverHost}/verification/verify_code`;
return this.http
.post(url, {
type: type,
countryDialCode: countryDialCode,
tel: tel,
code: verificationCode,
callback_url: callback_url
}, { responseType: 'text' })
.toPromise()
.then(token => {
if (type === 'tmp' && token) {
this.saveToken(token);
}
return token;
});
}
/**
* @param {?} countryDialCode
* @param {?} tel
* @param {?} password
* @param {?=} callback_url
* @return {?}
*/
login(countryDialCode, tel, password, callback_url = undefined) {
const /** @type {?} */ url = `${this.serverHost}/login`;
return this.http
.post(url, {
countryDialCode: countryDialCode,
tel: tel,
password: password,
callback_url: callback_url
}, { responseType: 'text' })
.toPromise()
.then(token => {
this.saveToken(token);
return token;
});
}
/**
* @param {?} countryDialCode
* @param {?} tel
* @param {?} verificationCode
* @param {?} name
* @param {?} password
* @param {?=} callback_url
* @return {?}
*/
register(countryDialCode, tel, verificationCode, name, password, callback_url = undefined) {
const /** @type {?} */ url = `${this.serverHost}/register`;
return this.http
.post(url, {
countryDialCode: countryDialCode,
tel: tel,
code: verificationCode,
name: name,
password: password
})
.toPromise()
.then(() => this.login(countryDialCode, tel, password, callback_url));
}
/**
* @return {?}
*/
getTermsOfUse() {
const /** @type {?} */ url = `${this.serverHost}/legal/user_agreement`;
return this.http.get(url, { responseType: 'text' }).toPromise();
}
/**
* @return {?}
*/
getPrivacyPolicy() {
const /** @type {?} */ url = `${this.serverHost}/legal/privacy_policy`;
return this.http.get(url, { responseType: 'text' }).toPromise();
}
/**
* @param {?} countryDialCode
* @param {?} tel
* @param {?} password
* @return {?}
*/
agreeToTerms(countryDialCode, tel, password) {
const /** @type {?} */ url = `${this.serverHost}/legal/agree_to_terms`;
return this.http
.post(url, {
countryDialCode: countryDialCode,
tel: tel,
password: password
})
.toPromise();
}
}
AuthService.localStorageIdTokenKey = 'sbe-auth.idToken';
AuthService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
AuthService.ctorParameters = () => [
{ type: HttpClient, },
{ type: StorageService, },
{ type: undefined, decorators: [{ type: Inject, args: [REST_SERVER_HOST,] },] },
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class AuthServiceModule {
/**
* @return {?}
*/
static forRoot() {
return {
ngModule: AuthServiceModule,
providers: [AuthService]
};
}
}
AuthServiceModule.decorators = [
{ type: NgModule, args: [{
imports: [HttpClientModule, StorageServiceModule]
},] },
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
export { AuthService, AuthServiceModule };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nob29sYmVsbGUtY29tbW9uLXNlcnZpY2VzLWF1dGguanMubWFwIiwic291cmNlcyI6WyJuZzovL0BzY2hvb2xiZWxsZS9jb21tb24vc2VydmljZXMvYXV0aC9hdXRoLnNlcnZpY2UudHMiLCJuZzovL0BzY2hvb2xiZWxsZS9jb21tb24vc2VydmljZXMvYXV0aC9hdXRoLXNlcnZpY2UubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUkVTVF9TRVJWRVJfSE9TVCB9IGZyb20gJ0BzY2hvb2xiZWxsZS9jb21tb24vdG9rZW5zJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJ0BzY2hvb2xiZWxsZS9jb21tb24vc2VydmljZXMvc3RvcmFnZSc7XG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL3RvUHJvbWlzZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBdXRoU2VydmljZSB7XG4gIHN0YXRpYyBsb2NhbFN0b3JhZ2VJZFRva2VuS2V5ID0gJ3NiZS1hdXRoLmlkVG9rZW4nO1xuXG4gIHByaXZhdGUgX3R5cGU6ICdyZWdpc3RlcicgfCAnZmluZHBhc3N3b3JkJyB8ICd0bXAnO1xuICBwcml2YXRlIF9pbnRsdGVsO1xuICBwcml2YXRlIF92ZXJpZmljYXRpb25Db2RlO1xuICBnZXQgdHlwZSgpOiAncmVnaXN0ZXInIHwgJ2ZpbmRwYXNzd29yZCcgfCAndG1wJyB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cbiAgc2V0IHR5cGUodjogJ3JlZ2lzdGVyJyB8ICdmaW5kcGFzc3dvcmQnIHwgJ3RtcCcpIHtcbiAgICB0aGlzLl90eXBlID0gdjtcbiAgICBpZiAodikge1xuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQoJ3NiZS1hdXRoLnNlc3Npb24udHlwZScsIHYsICdzZXNzaW9uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UucmVtb3ZlKCdzYmUtYXV0aC5zZXNzaW9uLnR5cGUnLCAnc2Vzc2lvbicpO1xuICAgIH1cbiAgfVxuICBnZXQgaW50bHRlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5faW50bHRlbDtcbiAgfVxuICBzZXQgaW50bHRlbCh2KSB7XG4gICAgdGhpcy5faW50bHRlbCA9IHY7XG4gICAgaWYgKHYpIHtcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KCdzYmUtYXV0aC5zZXNzaW9uLmludGx0ZWwnLCB2LCAnc2Vzc2lvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnJlbW92ZSgnc2JlLWF1dGguc2Vzc2lvbi5pbnRsdGVsJywgJ3Nlc3Npb24nKTtcbiAgICB9XG4gIH1cbiAgZ2V0IHZlcmlmaWNhdGlvbkNvZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcmlmaWNhdGlvbkNvZGU7XG4gIH1cbiAgc2V0IHZlcmlmaWNhdGlvbkNvZGUodikge1xuICAgIHRoaXMuX3ZlcmlmaWNhdGlvbkNvZGUgPSB2O1xuICAgIGlmICh2KSB7XG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldChcbiAgICAgICAgJ3NiZS1hdXRoLnNlc3Npb24udmVyaWZpY2F0aW9uQ29kZScsXG4gICAgICAgIHYsXG4gICAgICAgICdzZXNzaW9uJ1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmUoXG4gICAgICAgICdzYmUtYXV0aC5zZXNzaW9uLnZlcmlmaWNhdGlvbkNvZGUnLFxuICAgICAgICAnc2Vzc2lvbidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy50eXBlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaW50bHRlbCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnZlcmlmaWNhdGlvbkNvZGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHVibGljIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSxcbiAgICBASW5qZWN0KFJFU1RfU0VSVkVSX0hPU1QpIHByaXZhdGUgc2VydmVySG9zdDogc3RyaW5nXG4gICkge1xuICAgIGxldCB0eXBlID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXQoJ3NiZS1hdXRoLnNlc3Npb24udHlwZScsICdzZXNzaW9uJykgYXNcbiAgICAgIHwgJ3JlZ2lzdGVyJ1xuICAgICAgfCAnZmluZHBhc3N3b3JkJ1xuICAgICAgfCAndG1wJztcbiAgICBsZXQgaW50bHRlbCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0KFxuICAgICAgJ3NiZS1hdXRoLnNlc3Npb24uaW50bHRlbCcsXG4gICAgICAnc2Vzc2lvbidcbiAgICApO1xuICAgIGxldCB2ZXJpZmljYXRpb25Db2RlID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXQoXG4gICAgICAnc2JlLWF1dGguc2Vzc2lvbi52ZXJpZmljYXRpb25Db2RlJyxcbiAgICAgICdzZXNzaW9uJ1xuICAgICk7XG4gICAgaWYgKHR5cGUpIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgaWYgKGludGx0ZWwpIHRoaXMuaW50bHRlbCA9IGludGx0ZWw7XG4gICAgaWYgKHZlcmlmaWNhdGlvbkNvZGUpIHRoaXMudmVyaWZpY2F0aW9uQ29kZSA9IHZlcmlmaWNhdGlvbkNvZGU7XG4gIH1cblxuICBwcml2YXRlIHNhdmVUb2tlbihpZHRva2VuKSB7XG4gICAgaWYgKGlkdG9rZW4pIHtcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KFxuICAgICAgICBBdXRoU2VydmljZS5sb2NhbFN0b3JhZ2VJZFRva2VuS2V5LFxuICAgICAgICBpZHRva2VuLFxuICAgICAgICAnbG9jYWwnXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnJlbW92ZShBdXRoU2VydmljZS5sb2NhbFN0b3JhZ2VJZFRva2VuS2V5LCAnbG9jYWwnKTtcbiAgICB9XG4gIH1cbiAgcmVxdWVzdENvZGUoXG4gICAgdHlwZTogJ3JlZ2lzdGVyJyB8ICdmaW5kcGFzc3dvcmQnIHwgJ3RtcCcgPSAncmVnaXN0ZXInLFxuICAgIGNvdW50cnlEaWFsQ29kZSxcbiAgICB0ZWw6IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnNlcnZlckhvc3R9L3ZlcmlmaWNhdGlvbi9yZXF1ZXN0X2NvZGVgO1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0KFxuICAgICAgICB1cmwsXG4gICAgICAgIHsgdHlwZTogdHlwZSwgY291bnRyeURpYWxDb2RlOiBjb3VudHJ5RGlhbENvZGUsIHRlbDogdGVsIH0sXG4gICAgICAgIHsgcmVzcG9uc2VUeXBlOiAndGV4dCcgfVxuICAgICAgKVxuICAgICAgLnRvUHJvbWlzZSgpO1xuICB9XG4gIHZlcmlmeUNvZGUoXG4gICAgdHlwZTogJ3JlZ2lzdGVyJyB8ICdmaW5kcGFzc3dvcmQnIHwgJ3RtcCcgPSAncmVnaXN0ZXInLFxuICAgIGNvdW50cnlEaWFsQ29kZSxcbiAgICB0ZWw6IHN0cmluZyxcbiAgICB2ZXJpZmljYXRpb25Db2RlOiBzdHJpbmcsXG4gICAgY2FsbGJhY2tfdXJsOiBzdHJpbmcgPSB1bmRlZmluZWRcbiAgKSB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5zZXJ2ZXJIb3N0fS92ZXJpZmljYXRpb24vdmVyaWZ5X2NvZGVgO1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0KFxuICAgICAgICB1cmwsXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgIGNvdW50cnlEaWFsQ29kZTogY291bnRyeURpYWxDb2RlLFxuICAgICAgICAgIHRlbDogdGVsLFxuICAgICAgICAgIGNvZGU6IHZlcmlmaWNhdGlvbkNvZGUsXG4gICAgICAgICAgY2FsbGJhY2tfdXJsOiBjYWxsYmFja191cmxcbiAgICAgICAgfSxcbiAgICAgICAgeyByZXNwb25zZVR5cGU6ICd0ZXh0JyB9XG4gICAgICApXG4gICAgICAudG9Qcm9taXNlKClcbiAgICAgIC50aGVuKHRva2VuID0+IHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICd0bXAnICYmIHRva2VuKSB7XG4gICAgICAgICAgdGhpcy5zYXZlVG9rZW4odG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgIH0pO1xuICB9XG4gIGxvZ2luKFxuICAgIGNvdW50cnlEaWFsQ29kZSxcbiAgICB0ZWwsXG4gICAgcGFzc3dvcmQsXG4gICAgY2FsbGJhY2tfdXJsOiBzdHJpbmcgPSB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnNlcnZlckhvc3R9L2xvZ2luYDtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdChcbiAgICAgICAgdXJsLFxuICAgICAgICB7XG4gICAgICAgICAgY291bnRyeURpYWxDb2RlOiBjb3VudHJ5RGlhbENvZGUsXG4gICAgICAgICAgdGVsOiB0ZWwsXG4gICAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgICAgICAgIGNhbGxiYWNrX3VybDogY2FsbGJhY2tfdXJsXG4gICAgICAgIH0sXG4gICAgICAgIHsgcmVzcG9uc2VUeXBlOiAndGV4dCcgfVxuICAgICAgKVxuICAgICAgLnRvUHJvbWlzZSgpXG4gICAgICAudGhlbih0b2tlbiA9PiB7XG4gICAgICAgIHRoaXMuc2F2ZVRva2VuKHRva2VuKTtcbiAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgfSk7XG4gIH1cbiAgcmVnaXN0ZXIoXG4gICAgY291bnRyeURpYWxDb2RlLFxuICAgIHRlbCxcbiAgICB2ZXJpZmljYXRpb25Db2RlLFxuICAgIG5hbWUsXG4gICAgcGFzc3dvcmQsXG4gICAgY2FsbGJhY2tfdXJsOiBzdHJpbmcgPSB1bmRlZmluZWRcbiAgKSB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5zZXJ2ZXJIb3N0fS9yZWdpc3RlcmA7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3QodXJsLCB7XG4gICAgICAgIGNvdW50cnlEaWFsQ29kZTogY291bnRyeURpYWxDb2RlLFxuICAgICAgICB0ZWw6IHRlbCxcbiAgICAgICAgY29kZTogdmVyaWZpY2F0aW9uQ29kZSxcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkXG4gICAgICB9KVxuICAgICAgLnRvUHJvbWlzZSgpXG4gICAgICAudGhlbigoKSA9PiB0aGlzLmxvZ2luKGNvdW50cnlEaWFsQ29kZSwgdGVsLCBwYXNzd29yZCwgY2FsbGJhY2tfdXJsKSk7XG4gIH1cblxuICBnZXRUZXJtc09mVXNlKCkge1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuc2VydmVySG9zdH0vbGVnYWwvdXNlcl9hZ3JlZW1lbnRgO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHVybCwgeyByZXNwb25zZVR5cGU6ICd0ZXh0JyB9KS50b1Byb21pc2UoKTtcbiAgfVxuICBnZXRQcml2YWN5UG9saWN5KCkge1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuc2VydmVySG9zdH0vbGVnYWwvcHJpdmFjeV9wb2xpY3lgO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHVybCwgeyByZXNwb25zZVR5cGU6ICd0ZXh0JyB9KS50b1Byb21pc2UoKTtcbiAgfVxuICBhZ3JlZVRvVGVybXMoY291bnRyeURpYWxDb2RlLCB0ZWwsIHBhc3N3b3JkKSB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5zZXJ2ZXJIb3N0fS9sZWdhbC9hZ3JlZV90b190ZXJtc2A7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3QodXJsLCB7XG4gICAgICAgIGNvdW50cnlEaWFsQ29kZTogY291bnRyeURpYWxDb2RlLFxuICAgICAgICB0ZWw6IHRlbCxcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkXG4gICAgICB9KVxuICAgICAgLnRvUHJvbWlzZSgpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2VNb2R1bGUgfSBmcm9tICdAc2Nob29sYmVsbGUvY29tbW9uL3NlcnZpY2VzL3N0b3JhZ2UnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbSHR0cENsaWVudE1vZHVsZSwgU3RvcmFnZVNlcnZpY2VNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIEF1dGhTZXJ2aWNlTW9kdWxlIHtcbiAgc3RhdGljIGZvclJvb3QoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBBdXRoU2VydmljZU1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW0F1dGhTZXJ2aWNlXVxuICAgIH07XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7Ozs7OztJQTJERSxZQUNTLE1BQ0EsZ0JBQzJCO1FBRjNCLFNBQUksR0FBSixJQUFJO1FBQ0osbUJBQWMsR0FBZCxjQUFjO1FBQ2EsZUFBVSxHQUFWLFVBQVU7UUFFNUMscUJBQUksSUFBSSxxQkFBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsRUFBRSxTQUFTLENBRzVELENBQUEsQ0FBQztRQUNWLHFCQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FDbkMsMEJBQTBCLEVBQzFCLFNBQVMsQ0FDVixDQUFDO1FBQ0YscUJBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQzVDLG1DQUFtQyxFQUNu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