From 9cd66ff58bc493c00e630adaa28f68ff913c43a3 Mon Sep 17 00:00:00 2001 From: Chris Hines <chris.hines@monash.edu> Date: Thu, 23 Nov 2023 09:58:33 +1100 Subject: [PATCH] refactoring backend to use Authorization tokens rather than session cookies --- .gitignore | 17 + src/app/accountinfo/accountinfo.component.ts | 2 +- src/app/app-routing.module.ts | 3 - src/app/app.module.ts | 6 - src/app/authorisation.service.ts | 400 +++++++++--------- src/app/computesites.service.ts | 2 +- src/app/jobs.service.ts | 6 +- src/app/launcher/launcher.component.ts | 2 +- src/app/launchform/launchform.component.ts | 29 +- src/app/login/login.component.ts | 26 +- src/app/logout/logout.component.ts | 6 +- src/app/noaccount/noaccount.component.ts | 2 +- .../shareconnect/shareconnect.component.css | 3 - .../shareconnect/shareconnect.component.html | 38 -- .../shareconnect.component.spec.ts | 25 -- .../shareconnect/shareconnect.component.ts | 65 --- .../sv2-side-nav/sv2-side-nav.component.css | 0 .../sv2-side-nav/sv2-side-nav.component.html | 19 - .../sv2-side-nav.component.spec.ts | 25 -- .../sv2-side-nav/sv2-side-nav.component.ts | 30 -- src/app/tes.service.ts | 162 ++++--- src/app/transfer/transfer.component.css | 3 - src/app/transfer/transfer.component.html | 48 --- src/app/transfer/transfer.component.spec.ts | 25 -- src/app/transfer/transfer.component.ts | 171 -------- src/assets/config/apiservers.json | 4 +- src/assets/images/mlerp-dragon.png | Bin 0 -> 34056 bytes src/assets/mlerp-dragon.png | Bin 0 -> 34056 bytes .../mlerp/assets/images/mlerp-dragon.png | Bin 0 -> 34056 bytes 29 files changed, 377 insertions(+), 742 deletions(-) delete mode 100644 src/app/shareconnect/shareconnect.component.css delete mode 100644 src/app/shareconnect/shareconnect.component.html delete mode 100644 src/app/shareconnect/shareconnect.component.spec.ts delete mode 100644 src/app/shareconnect/shareconnect.component.ts delete mode 100644 src/app/sv2-side-nav/sv2-side-nav.component.css delete mode 100644 src/app/sv2-side-nav/sv2-side-nav.component.html delete mode 100644 src/app/sv2-side-nav/sv2-side-nav.component.spec.ts delete mode 100644 src/app/sv2-side-nav/sv2-side-nav.component.ts delete mode 100644 src/app/transfer/transfer.component.css delete mode 100644 src/app/transfer/transfer.component.html delete mode 100644 src/app/transfer/transfer.component.spec.ts delete mode 100644 src/app/transfer/transfer.component.ts create mode 100644 src/assets/images/mlerp-dragon.png create mode 100644 src/assets/mlerp-dragon.png create mode 100644 src/deployments/mlerp/assets/images/mlerp-dragon.png diff --git a/.gitignore b/.gitignore index 92ba930..fd006da 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,20 @@ app.key key.pem openssl.conf cert.pem + + +app.csr +ca.cnf +ca.crt +ca.key +junk/ +pytest.py +src/app/.tes.service.ts.swn +src/app/Why Strudel2.md +src/assets/config/computesites.json.bk +src/assets/params.json +src/assets/uischema.json +src/deployments/mlerp/assets/config/combined.json +ssl.cnf +yarnlist.local + diff --git a/src/app/accountinfo/accountinfo.component.ts b/src/app/accountinfo/accountinfo.component.ts index 06bd750..27e8d0f 100644 --- a/src/app/accountinfo/accountinfo.component.ts +++ b/src/app/accountinfo/accountinfo.component.ts @@ -25,7 +25,7 @@ export class AccountinfoComponent implements OnInit { } ngOnInit() { - this.identity.accountalerts.subscribe((v) => {console.log('account alerts',v)}); + //this.identity.accountalerts.subscribe((v) => {console.log('account alerts',v)}); } cssClass(h) { diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 6fd3388..d99e535 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -2,8 +2,6 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { LauncherComponent } from './launcher/launcher.component'; import { KeygenComponent } from './keygen/keygen.component'; -import { TransferComponent } from './transfer/transfer.component'; -import { ShareconnectComponent } from './shareconnect/shareconnect.component'; import { JoblistComponent } from './joblist/joblist.component'; import {LoginComponent} from './login/login.component'; @@ -33,7 +31,6 @@ const routes: Routes = [ //{ path: 'cancellaunch', component: LauncherComponent}, { path: 'sshauthz_callback', component: KeygenComponent}, { path: 'sshauthz_callback*', component: KeygenComponent}, - { path: 'transfer', component: TransferComponent }, { path: 'noaccount/:site', component: NoaccountComponent}, { path: '**', component: LauncherComponent}, //{ path: 'shareconnect', component: ShareconnectComponent } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 815b2b3..334a46e 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -57,9 +57,6 @@ import { MatChipsModule } from '@angular/material/chips'; import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { StrudelapplistComponent } from './strudelapplist/strudelapplist.component'; import { KeygenComponent } from './keygen/keygen.component'; -import { TransferComponent } from './transfer/transfer.component'; -import { Sv2SideNavComponent } from './sv2-side-nav/sv2-side-nav.component'; -import { ShareconnectComponent } from './shareconnect/shareconnect.component'; import { LaunchDialogComponent } from './launch-dialog/launch-dialog.component'; import { ModaldialogComponent } from './modaldialog/modaldialog.component' import {OverlayModule} from '@angular/cdk/overlay'; @@ -97,9 +94,6 @@ import { LaunchformComponent } from './launchform/launchform.component'; // LaunchdialogComponent, StrudelapplistComponent, KeygenComponent, - TransferComponent, - Sv2SideNavComponent, - ShareconnectComponent, LaunchDialogComponent, ModaldialogComponent, LoginComponent, diff --git a/src/app/authorisation.service.ts b/src/app/authorisation.service.ts index 5b4b4e2..25b0f45 100644 --- a/src/app/authorisation.service.ts +++ b/src/app/authorisation.service.ts @@ -1,7 +1,25 @@ +// Authoriations server +// On load checks for a session token +// if a sesiontoken exists get the loggedinauthz/loggedoutauthz observables +// +// exposes function updateFragment ... if the fragment is updated, +// 1. generate a new key +// 2. request a certificate +// 3. add the certificate to the agent +// 4. update the loggedin/loggedout data +// +// exposes function refresh() ... if called, recalculates loggedin/loggedout +// +// exposes storeSshAuthZServer ... if called adds a new entry to the possible loggedin/loggedout and stores in localStorage +// +// maintains behavioursubject loggedinauthz and loggedin (list and count of sites that we have logged in to/have a valid cert in the agent for) +// maintains behavioursubject loggedoutauthz and loggedout (list and count of sites that we could log in to) + + import { Injectable } from '@angular/core'; import { HttpClientModule, HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http'; import { ActivatedRoute, Router } from '@angular/router'; -import { Observable, Subject, BehaviorSubject, concat, forkJoin } from 'rxjs'; +import { Observable, Subject, BehaviorSubject, concat, forkJoin, ReplaySubject } from 'rxjs'; import { catchError, map, tap, take,filter,skip, switchMap, shareReplay } from 'rxjs/operators'; import {LocationStrategy, Location} from '@angular/common'; import { Identity, AuthToken, KeyCert, SshAuthzServer } from './identity'; @@ -20,136 +38,146 @@ export class SshauthzServer {} providedIn: 'root' }) export class AuthorisationService { - // public token: BehaviorSubject<AuthToken>; - //public readonly sshAuthzServers: BehaviorSubject<SshAuthzServer[]>; - //public readonly agentContents: BehaviorSubject<any>; - //public loggedInAuthZ: BehaviorSubject<SshAuthzServer[]>; - //public loggedOutAuthZ: BehaviorSubject<SshAuthzServer[]>; - public loggedInAuthZ$: Observable<SshAuthzServer[]>; - public loggedOutAuthZ$: Observable<SshAuthzServer[]>; - //public progress: Subject<string>; - // private keyCert: Subject<KeyCert>; - public backendURI: string; - public keys: KeyCert[]; - private fragment$: BehaviorSubject<string> = new BehaviorSubject(null); - public agentContents$: Observable<any>; - private backendURI$: Observable<string>; + + + public loggedInAuthZ$: BehaviorSubject<SshAuthzServer[]>; + public loggedOutAuthZ$: BehaviorSubject<SshAuthzServer[]>; public loggedin$: BehaviorSubject<number>; public loggedout$: BehaviorSubject<number>; - public sshAuthzServers$: Observable<SshAuthzServer[]>; - public refresh$: Subject<boolean> = new Subject(); - public reAdd$: Subject<any> = new Subject(); + public sessionToken: string | null = null + public availableKeys$: BehaviorSubject<any>; + + private backendURI: string; + private fragment$: BehaviorSubject<string> = new BehaviorSubject(null); + private sshAuthzServers$: BehaviorSubject<SshAuthzServer[]>; + private refresh$: Subject<boolean> = new Subject(); + + + constructor(private http: HttpClient, - private locationStrategy: LocationStrategy, private router: Router, private backendSelectionService: BackendSelectionService, - private location: Location, private notifications: NotificationsService, private ipcService: IpcService) { - - //this.sshAuthzServers = new BehaviorSubject<SshAuthzServer[]>([]); - //this.loggedInAuthZ = new BehaviorSubject<SshAuthzServer[]>(null); - //this.loggedOutAuthZ = new BehaviorSubject<SshAuthzServer[]>([]); - this.backendURI = null; - //this.agentContents = new BehaviorSubject(null); - this.keys = []; - //this.getSshAuthzServers(); - this.keys = []; - - this.sshAuthzServers$ = this.getSshAuthzServersObservable(); + + this.backendURI = null; + this.sshAuthzServers$ = new BehaviorSubject<SshAuthzServer[]>(null); this.loggedin$= new BehaviorSubject<number>(null); this.loggedout$= new BehaviorSubject<number>(null); - this.backendSelectionService.apiserver.pipe( - filter((v) => v !== null && v !== undefined), - ) - .subscribe((value) => { this.backendURI = value.tes }); // Once we have a value for backend, store that value locally + this.loggedInAuthZ$ = new BehaviorSubject<any>([]); + this.loggedOutAuthZ$ = new BehaviorSubject<any>([]); + this.availableKeys$ = new BehaviorSubject<any>([]); - // // Once we have backend server, check what our ssh agent has in it - // this.backendSelectionService.apiserver.pipe( - // filter((v) => v !== null && v !== undefined), - // tap(() => console.log('backendSelectionService fired causing agent contents to update')), - // switchMap((v) => this.updateAgentContents(v.tes)), - // ).subscribe((_) => { return }, (err) => console.error(err)); // An empty subscription is necessary for the observables to fire + + // Get the list of configured sshauthz servers + this.getSshAuthzServersObservable().subscribe((v) => this.sshAuthzServers$.next(v)) - this.backendURI$ = this.backendSelectionService.apiserver.pipe( + // every time the backend changes, refresh the list of certs in the agent + this.backendSelectionService.apiserver.pipe( filter((v) => v !== null && v !== undefined), - map((v) => (<APIServer>v).tes) ) - - this.agentContents$ = this.backendURI$.pipe( - tap((v) => console.log('backendURI changed, causing agent contents to update',v)), - switchMap((v) => this.updateAgentContents(v)), + .subscribe((value) => { this.backendURI = value.tes ; this.refresh() }); // Once we have a value for backend, store that value locally + this.backendSelectionService.apiserver.pipe( filter((v) => v !== null && v !== undefined), - shareReplay() - ) - - - /* Once we have a value for agent Conents, and a list of servers, we can figure out which ones we hav elogged into and which ones we haven't */ - - var authZ$: Observable<any>; - authZ$ = combineLatest([this.agentContents$,this.sshAuthzServers$.pipe(filter((v) => v !== null && v !== undefined))]).pipe( + take(1), + switchMap((v) => this.getSessionToken(v)) + ).subscribe((v) => { this.sessionToken = v; window.localStorage.setItem('strudel2_session', v); this.refresh() } ); + + // every time the list of certs/keys changes update the list of whats logged in and out + // sshAuthzServers$ won't really "change" except that it needs to be retrieved first time + combineLatest([this.availableKeys$, this.sshAuthzServers$.pipe(filter((v) => v !== null ))]).pipe( map(([agentContents,authzServers]) => { return this.updateLoggedAuthZ(agentContents,authzServers)}), - tap((v) => { this.loggedin$.next(v[0].length); this.loggedout$.next(v[1].length)} ), - catchError((e) => { console.error('errort getting values for logged in and out',e); return throwError(e) }), - tap((v) => console.log('authZ observable fired')), - shareReplay() - ); - //authZ$.subscribe(([loggedin,loggedout]) => { this.loggedInAuthZ.next(loggedin); this.loggedOutAuthZ.next(loggedout); }) - this.loggedInAuthZ$ = authZ$.pipe(map((v) => v[0])); - this.loggedOutAuthZ$ = authZ$.pipe(map((v) => v[1])); + ).subscribe((v) => {this.loggedInAuthZ$.next(v[0]); this.loggedin$.next(v[0].length) ; this.loggedOutAuthZ$.next(v[1]); this.loggedout$.next(v[1].length)}) + - const apiserver$: Observable<APIServer> = this.backendSelectionService.apiserver.pipe( - filter((v) => v !== undefined),filter((v) => v !== null), - ); - combineLatest([this.reAdd$.pipe( - filter((v) => v !== undefined && v !== null)), apiserver$]).subscribe( - ([id, apiserver]) => { this.addKeysFromStorage(apiserver)}) - this.initKeygenPipelines(); } - private addKeysFromStorage(apiserver: APIServer) { - var req: Observable<any>[] = [] - var keys: KeyCert[]; - keys = this.getKeys(); - if (keys.length>0) { - for (let k of this.getKeys()) { - console.log('addKeysFromStorage',k); - req.push(this.sshAdd(k,apiserver)) - } - forkJoin(req).subscribe((v) => { this.refresh$.next(true)}) +// private addKeysFromStorage(apiserver: APIServer) { +// var req: Observable<any>[] = [] +// var keys: KeyCert[]; +// keys = this.getKeys(); +// if (keys.length>0) { +// for (let k of this.getKeys()) { +// console.log('addKeysFromStorage',k); +// req.push(this.sshAdd(k,apiserver)) +// } +// forkJoin(req).subscribe((v) => { this.refresh$.next(true)}) +// } else { +// this.refresh$.next(true); +// } +// } + + + public refresh() { + this.refresh$.next(true); + if (this.backendURI !== null) { + this.updateAgentContents(this.backendURI).subscribe((v) => this.availableKeys$.next(v)); } else { - this.refresh$.next(true); + this.backendSelectionService.apiserver.pipe( + take(1) + ).subscribe((apiserver) => this.updateAgentContents(apiserver.tes).subscribe((v) => this.availableKeys$.next(v))) } } - - updateFragment(frag) { - this.fragment$.next(frag); - } - storeLocalAuthZ(authz: any) { + public storeLocalAuthZ(authz: any) { + // called from settings try { localStorage.setItem('localauthservers',JSON.stringify(authz)); } catch { } - //this.getSshAuthzServers(); } - removeLocalAuthZ() { + public removeLocalAuthZ() { localStorage.removeItem('localauthservers'); - //this.getSshAuthzServers(); } -/* getSshAuthzServers() { - let headers = new HttpHeaders(); - let options = { headers: headers, withCredentials: false}; - this.http.get<SshAuthzServer[]>('./assets/config/authservers.json',options) - .pipe(catchError(this.handleError('getSshAuthzServers'))) - .subscribe(resp => this.updateSshAuthzServers(resp)); - } */ - getSshAuthzServersObservable(): Observable<SshAuthzServer[]> { +public updateFragment(frag) { + // The second half of login. After we have returned from the authorization server + // called from keygen + this.fragment$.next(frag); + } + + +public logout() { + // clear the ssh agent and remove all keys + // remove the sessionToken from localstorage and memory + // get a new session token + sessionStorage.removeItem('keys'); + return this.killAgent().pipe( + tap((v)=>window.localStorage.removeItem('strudel2_session')), + tap((v) => this.sessionToken = null), + switchMap((v) => this.getSessionToken(this.backendURI)) + ). + subscribe((v) =>{ this.sessionToken = v ; window.localStorage.setItem('strudel2_session',v) ; this.refresh() } ) +} + +private getSessionToken(apiserver: any): Observable<any> { + console.log('getting the session token eithe rfrom loca sotrage or a new one') + + let access_token = window.localStorage.getItem('strudel2_session'); + if (access_token) { + let headers = new HttpHeaders({ + 'Authorization': `Bearer ${access_token}` + }) + let options = { headers: headers, withCredentials: true}; + let pipe = this.http.get<any>(apiserver.tes+'/authping', options).pipe( + tap((v) => console.log('found a token, refreshing it')), + switchMap((v) => this.http.get<any>(apiserver.tes+'/refreshsession', options)), + tap((v) => console.log('refreshed the token')), + catchError((e) => this.http.get<any>(apiserver.tes+'/newsession')) + ) + return pipe + } else { + console.log('getting a new token from', apiserver.tes) + return this.http.get<any>(apiserver.tes+'/newsession') + } +} + + + private getSshAuthzServersObservable(): Observable<SshAuthzServer[]> { let headers = new HttpHeaders(); let options = { headers: headers, withCredentials: false}; return this.http.get<SshAuthzServer[]>('./assets/config/authservers.json',options) @@ -203,69 +231,29 @@ export class AuthorisationService { return [loggedin, loggedout] } +// private getKeys(id?: Identity): KeyCert[] { +// try{ +// return JSON.parse(sessionStorage.getItem('keys')); +// } catch { +// return []; +// } +// } - updateSshAuthzServers(resp) { - var auths: SshAuthzServer[]; - var localauths: SshAuthzServer[] = []; - var server: SshAuthzServer; - auths = <SshAuthzServer[]>resp; - try { - localauths = JSON.parse(localStorage.getItem('localauthservers')) - } catch { - localauths = [] - } - if (localauths !== null) { - for (server of localauths) { - auths.push(server); - } - } - //this.sshAuthzServers.next(auths); - } -public getKeys(id?: Identity): KeyCert[] { - try{ - return JSON.parse(sessionStorage.getItem('keys')); - } catch { - return []; - } -} - /* makeKeyCert(key: string, resp, sshauthzservice: SshAuthzServer) { - let keyCert = new KeyCert() - keyCert.key = key; - keyCert.cert = resp['cert']; - var keys: KeyCert[] = []; - try{ - keys = JSON.parse(sessionStorage.getItem('keys')); - } catch { - keys = []; - } - if (keys === null) { - keys = []; - } - keys.push(keyCert); - sessionStorage.setItem('keys',JSON.stringify(keys)) - // this.tesService.keyCert.next(keyCert); - // As soon as the certificate has been generated, we log back out of the signing server - if (!(sshauthzservice.logout === null)) { - window.open(sshauthzservice.logout); - } - let path=sessionStorage.getItem('path'); - //skip1 because loggedInAuthZ is a behaviour subject and we don't want the current value but the value - this.loggedInAuthZ.pipe(skip(1),take(1)).subscribe( () => {this.readyToNavigate.next([true,path])}); - this.sshAdd(keyCert); - // only navigate once the agent contents has been refreshed - }*/ - - public querySshAgentError(error: any) { + private querySshAgentError(error: any) { //this.agentContents.next([]); if (error.status == 0) { this.notifications.notify("A network error occured. Are you connected to the internet?") } + if (error.stats == 401) { + this.sessionToken = null; + console.log('session expired, why hasnt it refreshed automatically?') + } this.notifications.notify("Error querying ssh agent"); } - public updateAgentContents(apiserver?: string): Observable<any> { + private updateAgentContents(apiserver: string): Observable<any> { /* Query ssh agent running on the apiserver * Tap the even stream to update the notifications */ @@ -282,24 +270,20 @@ public getKeys(id?: Identity): KeyCert[] { } } - let headers = new HttpHeaders(); + if (this.sessionToken === null) { + return of([]) + } + + let headers = new HttpHeaders({ + 'Authorization': `Bearer ${this.sessionToken}` + }); let options = { headers: headers, withCredentials: true}; - var anyvar: any; let agentquery$ = this.http.get<any>(apiserver+'/sshagent',options) let agentpipe$ = agentquery$.pipe( catchError((e) => { this.querySshAgentError(e); return of([])}), - switchMap((resp) => of(this.addExpiryField(resp))), - tap((resp) => { - // if (this.agentContents.value !== null && this.agentContents.value.length > resp.length) { - // this.notifications.notify("Your login expired. Please login again"); - // } else { - // this.notifications.notify(""); - // }; - this.notifications.notify(""); - //this.agentContents.next(resp) - }), + map((v) => this.addExpiryField(v)), + tap((resp) => { this.notifications.notify("");}), catchError((e) => { console.error('updateAgentContents error',e) ; return of([])}), - //tap((_) => this.notifications.notify("")) tap((v)=>console.log('agent contents',v)) ) return agentpipe$ @@ -320,41 +304,23 @@ public getKeys(id?: Identity): KeyCert[] { private killAgent() { this.notifications.notify("Logging out") - let headers = new HttpHeaders(); - let options = { headers: headers, withCredentials: true}; var anyvar: any; + if (this.sessionToken === null) { + return throwError('cant get the agent contents without a session'); + } + let headers = new HttpHeaders({ + 'Authorization': `Bearer ${this.sessionToken}` + }); + let options = { headers: headers, withCredentials: true}; + return this.http.delete<any>(this.backendURI+'/sshagent',options) .pipe( catchError(this.handleError(anyvar)), - switchMap((v) => this.updateAgentContents())) - + switchMap((v) => this.updateAgentContents(this.backendURI)), + catchError((e) => { return of([])})) } - public logout(): Observable<any> { - sessionStorage.removeItem('keys'); - return this.killAgent(); - } - public login(authservice: SshAuthzServer) { - let redirect_uri = window.location.origin+this.locationStrategy.getBaseHref()+"sshauthz_callback"; - if (redirect_uri.includes("file:///")) { - redirect_uri = "http://localhost:4200/sshauthz_callback"; - } - let nonce=Math.random().toString(36).substring(2, 15) - - sessionStorage.setItem('authservice', JSON.stringify([authservice,nonce])); - sessionStorage.setItem('path', '/launch'); - if (authservice.scope == null) { - window.location.assign(authservice.authorise+"?response_type=token&redirect_uri="+redirect_uri+"&state="+nonce+"&client_id="+authservice.client_id); - } else { - window.location.assign(authservice.authorise+"?response_type=token&redirect_uri="+redirect_uri+"&state="+nonce+"&client_id="+authservice.client_id+"&scope="+authservice.scope); - } - } - - private httperror(error: any) { - this.notifications.notify('There was an error logging in or generating crypto tokens'); - console.error(error); - } private handleError<T> (result?: T) { return (error: any): Observable<T> => { @@ -366,7 +332,10 @@ public getKeys(id?: Identity): KeyCert[] { }; } - initKeygenPipelines() { + private initKeygenPipelines() { + + // every time the fragment changes, extract the token + // every time the token changes, const token$: Observable<AuthToken> = this.fragment$.pipe( filter((v) => v !== null), @@ -397,8 +366,9 @@ public getKeys(id?: Identity): KeyCert[] { let agent$ = combineLatest([keycert$.pipe(filter((v) => v !== null)),apiserver$]).pipe( switchMap(([keycert,apiserver]) => this.addCert(keycert,apiserver)), + tap((v) => this.refresh()), tap((v)=>console.log('posted cert to agent',v)), - switchMap((_) => this.updateAgentContents()), + //switchMap((_) => this.updateAgentContents()), //switchMap((_) => this.loggedInAuthZ), switchMap((_) => of([null])), ); @@ -412,7 +382,7 @@ public getKeys(id?: Identity): KeyCert[] { } ) } - extractToken(frag: string) { + private extractToken(frag: string) { if (frag === undefined || frag == null) { return; } @@ -437,13 +407,13 @@ public getKeys(id?: Identity): KeyCert[] { } - logout_sshauthz(sshauthzserver) { + private logout_sshauthz(sshauthzserver) { if (sshauthzserver !== undefined && sshauthzserver.logout !== null) { window.open(sshauthzserver.logout); } } - getCert(token: AuthToken, key: any, apiserver: APIServer): Observable<any> { + private getCert(token: AuthToken, key: any, apiserver: APIServer): Observable<any> { let headers = new HttpHeaders({'Authorization':'Bearer '+token.token}); let options = { headers: headers, withCredentials: false}; var now = new Date() @@ -458,26 +428,32 @@ public getKeys(id?: Identity): KeyCert[] { ) } - addCert(kclist: any, apiserver: APIServer): Observable<any> { + private addCert(kclist: any, apiserver: APIServer): Observable<any> { let keyCert = new KeyCert() keyCert.key = kclist[0].private keyCert.cert = kclist[1] - return this.sshAdd(keyCert,apiserver); + this.storeKey(keyCert); + let data = {'key': keyCert.key, 'cert': keyCert.cert}; + if (this.ipcService.useIpc) { + return this.ipcService.addCert(data); + } else { + + if (this.sessionToken === null) { + throwError('Session token is null how is this possible') + } + + let headers = new HttpHeaders({ + 'Authorization': `Bearer ${this.sessionToken}` + }); + let options = { headers: headers, withCredentials: true}; + let data = {'key': keyCert.key, 'cert': keyCert.cert}; + return this.http.post<any>(apiserver.tes+'/sshagent',data,options); + + } } - public sshAdd(keyCert: KeyCert, apiserver): Observable<any> { - this.storeKey(keyCert); - let headers = new HttpHeaders(); - let options = { headers: headers, withCredentials: true}; - let data = {'key': keyCert.key, 'cert': keyCert.cert}; - if (this.ipcService.useIpc) { - return this.ipcService.addCert(data); - } else { - return this.http.post<any>(apiserver.tes+'/sshagent',data,options); - } - } - storeKey(keyCert: KeyCert) { + private storeKey(keyCert: KeyCert) { var keys: KeyCert[] = []; try{ keys = JSON.parse(sessionStorage.getItem('keys')); @@ -488,6 +464,10 @@ public getKeys(id?: Identity): KeyCert[] { keys = []; } keys.push(keyCert); + if (keys.length > 10) { + console.error('keys is growing too fast') + keys = keys.slice(-9) + } sessionStorage.setItem('keys',JSON.stringify(keys)) } diff --git a/src/app/computesites.service.ts b/src/app/computesites.service.ts index 10d5467..e457387 100644 --- a/src/app/computesites.service.ts +++ b/src/app/computesites.service.ts @@ -25,7 +25,7 @@ export class ComputesitesService { this.computesites = new BehaviorSubject<Computesite[]>([]); this.getComputeSites(); - this.identities$ = combineLatest([this.authorisationService.agentContents$,this.computesites.pipe(filter((v) => v.length !== 0))]) + this.identities$ = combineLatest([this.authorisationService.availableKeys$,this.computesites.pipe(filter((v) => v.length !== 0))]) .pipe( switchMap((v) => this.combine_cert_site(v[0],v[1])) ) diff --git a/src/app/jobs.service.ts b/src/app/jobs.service.ts index 680cf8e..5730879 100644 --- a/src/app/jobs.service.ts +++ b/src/app/jobs.service.ts @@ -75,13 +75,9 @@ export class JobsService { if (identity.expiry < Date.now() && (error.hasOwnProperty("status") && error.status == 401)) { console.error('login expired while refreshing job list expiry',identity.expiry,'current time',Date.now() ); this.cancelRequests$.next(true); - this.notifications.notify("Your login has expired. Please log in again", () => { this.authService.refresh$.next(true) } ); + this.notifications.notify("Your login has expired. Please log in again", () => { this.authService.refresh() } ); return throwError(error); } - if (identity.expiry > Date.now() && error.hasOwnProperty("status") && error.status == 401) { - this.authService.reAdd$.next(identity); - return of([]); - } if (error.hasOwnProperty("status") && error.status == 500) { this.notifications.notify("The Strudel2 API server had an error.\n Please report this via the contact us link.\nThe error message was"+emsg); diff --git a/src/app/launcher/launcher.component.ts b/src/app/launcher/launcher.component.ts index c6adc28..a1e469c 100644 --- a/src/app/launcher/launcher.component.ts +++ b/src/app/launcher/launcher.component.ts @@ -72,7 +72,7 @@ export class LauncherComponent implements OnInit { ngOnInit() { this.pipelines(); - this.sub = this.authService.refresh$.subscribe( () => {this.destroy$.next(true); this.pipelines()}) + this.sub = this.authService.loggedInAuthZ$.subscribe( () => {this.destroy$.next(true); this.pipelines()}) } pipelines() { diff --git a/src/app/launchform/launchform.component.ts b/src/app/launchform/launchform.component.ts index 2eb9444..39b9a89 100644 --- a/src/app/launchform/launchform.component.ts +++ b/src/app/launchform/launchform.component.ts @@ -1,13 +1,14 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; import { angularMaterialRenderers } from '@jsonforms/angular-material'; import { and, createAjv, isControl, optionIs, rankWith, schemaTypeIs, scopeEndsWith, Tester } from '@jsonforms/core'; -import { Observable } from 'rxjs'; -import { tap} from 'rxjs/operators'; +import { Observable, of, throwError } from 'rxjs'; +import { catchError, tap} from 'rxjs/operators'; import { TesService } from '../tes.service'; import { Strudelapp, AppAction } from '../strudelapp'; import { Job } from '../job'; import { BatchInterface } from '../batchinterface'; import { Identity } from '../identity'; +import { HttpErrorResponse } from '@angular/common/http'; @@ -47,9 +48,33 @@ export class LaunchformComponent { } + private handleLaunchFormError(e: HttpErrorResponse): Observable<any> { + const errordataschema: any = { + "properties": { + "msg": { + "default": "Something went wrong", + "title": "Msg", + "type": "string" + } + }, + "title": "ErrorMsg", + "type": "object" + }; + const erroruischema: any = { + "type": "Control", + "scope": "#" + }; + if (e.status == 500) { + return of({'schema': errordataschema, 'uischema': erroruischema, 'data': {'msg': e.message}}) + } + throwError(e) + } + ngOnInit(): void { + this.schemaObs$ = this.tes.runCommand(this.identity, this.app.submitcmd, {'input': ""}).pipe( tap((v) => console.log(v)), + catchError((e) => this.handleLaunchFormError(e)), tap((v) => { this.schema = v.schema ; this.uischema = v.uischema; this.data = v.data }), tap(() => {console.log('data for the form is set to ',this.data)}) ) diff --git a/src/app/login/login.component.ts b/src/app/login/login.component.ts index 7b00d4a..ee1f9f5 100644 --- a/src/app/login/login.component.ts +++ b/src/app/login/login.component.ts @@ -18,7 +18,7 @@ import { IpcService } from '../ipc.service'; import {DomSanitizer} from '@angular/platform-browser'; import {PipeTransform, Pipe} from "@angular/core"; -import { ThisReceiver } from '@angular/compiler'; +import { LocationStrategy } from '@angular/common'; @Pipe({ name: 'safeHtml'}) export class SafeHtmlPipe implements PipeTransform { @@ -52,6 +52,7 @@ export class LoginComponent implements OnInit { public overlayContainer: OverlayContainer, private router: Router, private ipcService: IpcService, + private locationStrategy: LocationStrategy, ) { @@ -90,9 +91,28 @@ export class LoginComponent implements OnInit { } */ - login () { +// login () { //localStorage.setItem('strudel-navlaunch','true'); - this.authService.login(this.selected); + //this.authService.login(this.selected); +// } + + public login() { + let authservice = this.selected; + // Initiate Login + let redirect_uri = window.location.origin+this.locationStrategy.getBaseHref()+"sshauthz_callback"; + if (redirect_uri.includes("file:///")) { + redirect_uri = "http://localhost:4200/sshauthz_callback"; + } + let nonce=Math.random().toString(36).substring(2, 15) + + sessionStorage.setItem('authservice', JSON.stringify([authservice,nonce])); + sessionStorage.setItem('path', '/launch'); + if (authservice.scope == null) { + window.location.assign(authservice.authorise+"?response_type=token&redirect_uri="+redirect_uri+"&state="+nonce+"&client_id="+authservice.client_id); + } else { + window.location.assign(authservice.authorise+"?response_type=token&redirect_uri="+redirect_uri+"&state="+nonce+"&client_id="+authservice.client_id+"&scope="+authservice.scope); + } } + } diff --git a/src/app/logout/logout.component.ts b/src/app/logout/logout.component.ts index d9e2f54..80d6476 100644 --- a/src/app/logout/logout.component.ts +++ b/src/app/logout/logout.component.ts @@ -2,6 +2,8 @@ import { Component, OnInit } from '@angular/core'; import { Router, NavigationStart } from '@angular/router'; import { AuthorisationService } from '../authorisation.service'; +import { catchError } from 'rxjs/operators'; +import { of } from 'rxjs'; @Component({ selector: 'app-logout', @@ -20,8 +22,8 @@ export class LogoutComponent implements OnInit { } logout() { - this.authService.logout().subscribe(() => this.router.navigate(['/login'])); - //this.router.navigate(['/login']); + this.authService.logout(); + this.authService.loggedInAuthZ$.subscribe(() => this.router.navigate(['/login'])); } } diff --git a/src/app/noaccount/noaccount.component.ts b/src/app/noaccount/noaccount.component.ts index 02be12e..3f53450 100644 --- a/src/app/noaccount/noaccount.component.ts +++ b/src/app/noaccount/noaccount.component.ts @@ -21,7 +21,7 @@ export class NoaccountComponent implements OnInit { } ngOnInit() { - this.subscription = combineLatest([ this.route.paramMap.pipe(filter((v) => v !== null)), this.authService.sshAuthzServers$.pipe(filter((v) => v !== null))]) + this.subscription = combineLatest([ this.route.paramMap.pipe(filter((v) => v !== null)), this.authService.loggedOutAuthZ$.pipe(filter((v) => v !== null))]) .subscribe(([m,s]) => this.setSite(m,s)); } diff --git a/src/app/shareconnect/shareconnect.component.css b/src/app/shareconnect/shareconnect.component.css deleted file mode 100644 index 683ae23..0000000 --- a/src/app/shareconnect/shareconnect.component.css +++ /dev/null @@ -1,3 +0,0 @@ -:host { - height: 100%; -} diff --git a/src/app/shareconnect/shareconnect.component.html b/src/app/shareconnect/shareconnect.component.html deleted file mode 100644 index c80d908..0000000 --- a/src/app/shareconnect/shareconnect.component.html +++ /dev/null @@ -1,38 +0,0 @@ -<div fxFlex style="flex: 1 1 0%; box-sizing: border-box"> -<div fxLayout="column" fxLayoutAlign="space-around stretch" style="height: 100%; width: 100%" > - <mat-toolbar color="primary"> - <mat-toolbar-row> - <!--<button mat-icon-button (click)=idSideNav.toggle()><mat-icon>menu</mat-icon></button>--> - - <span>Strudel v2.0</span> - <span class="fill-horizontal-space"></span> - </mat-toolbar-row> - </mat-toolbar> - -<mat-sidenav-container #idSideNav autosize style="height: 100%; width: 100%"> - <mat-sidenav #idSideNav mode="side" opened> - <app-sv2-side-nav></app-sv2-side-nav> - </mat-sidenav> - - <div fxLayout="column" fxLayoutAlign="none" style="height: 100%; width: 100%"> - - <!-- <div style="height: 600px"></div> --> - <form> - <mat-form-field style="width: 100%; height: 100%"> - <textarea fxFlex matInput placeholder="Paste the data sent via email" style="width: 100%; height: 100%" [(ngModel)]="data" name="data"></textarea> - </mat-form-field> - </form> - - <div style="width: 100%" fxLayout="row" fxLayoutAlign="none"> - <div fxFlex></div> - <button mat-button (click)="onSubmit()">Connect</button> - <div fxFlex></div> - </div> - </div> - - - - <!-- <mat-card style="width: 100%; box-sizing: border-box">Transfer tasks</mat-card> --> -</mat-sidenav-container> -</div> -</div> diff --git a/src/app/shareconnect/shareconnect.component.spec.ts b/src/app/shareconnect/shareconnect.component.spec.ts deleted file mode 100644 index faea16e..0000000 --- a/src/app/shareconnect/shareconnect.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - -import { ShareconnectComponent } from './shareconnect.component'; - -describe('ShareconnectComponent', () => { - let component: ShareconnectComponent; - let fixture: ComponentFixture<ShareconnectComponent>; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [ ShareconnectComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ShareconnectComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/shareconnect/shareconnect.component.ts b/src/app/shareconnect/shareconnect.component.ts deleted file mode 100644 index f1bea48..0000000 --- a/src/app/shareconnect/shareconnect.component.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Strudelapp } from '../strudelapp'; -import { TesService } from '../tes.service'; -import { AuthorisationService } from '../authorisation.service'; -import { Computesite } from '../computesite'; -import { ComputesitesService } from '../computesites.service'; -import { Router } from '@angular/router'; -import { Job } from '../job'; -import { Subscription } from 'rxjs'; -import {Identity, KeyCert} from '../identity'; - - -@Component({ - selector: 'app-shareconnect', - templateUrl: './shareconnect.component.html', - styleUrls: ['./shareconnect.component.css'] -}) -export class ShareconnectComponent implements OnInit { - - data: string = ""; - invalid: boolean = false; - subscription: Subscription; - constructor(private computesitesService: ComputesitesService, - private tesService: TesService, - private authService: AuthorisationService, - private router: Router) { } - - ngOnInit() { - setTimeout( () => this.authService.updateAgentContents() ) - } - - connect(jobdata: Job) { - //this.tesService.connect(jobdata); - } - - onSubmit() { - var dataobject: Object; - var jobdata: Job; - var site: Computesite; - var id: Identity; - try { - dataobject = JSON.parse(this.data); - jobdata = <Job>dataobject['job']; - site = <Computesite>dataobject['site']; - id = <Identity>dataobject['identity']; - id.site = site; - jobdata.identity = new Identity(id.username, site, id.expiry); - - let keycert = dataobject['keycert']; - if (keycert !== null) { - this.subscription = this.authService.agentContents$.subscribe(() => this.connect(jobdata)) - //this.authService.sshAdd(keycert); - } else { - this.connect(jobdata); - } - this.invalid=false; - } catch { - if (this.subscription !== undefined) { - this.subscription.unsubscribe(); - } - this.invalid=true; - } - } - -} diff --git a/src/app/sv2-side-nav/sv2-side-nav.component.css b/src/app/sv2-side-nav/sv2-side-nav.component.css deleted file mode 100644 index e69de29..0000000 diff --git a/src/app/sv2-side-nav/sv2-side-nav.component.html b/src/app/sv2-side-nav/sv2-side-nav.component.html deleted file mode 100644 index 3fd6edc..0000000 --- a/src/app/sv2-side-nav/sv2-side-nav.component.html +++ /dev/null @@ -1,19 +0,0 @@ -<!-- <mat-accordion> --> -<mat-expansion-panel> - <mat-expansion-panel-header> - <mat-panel-title> - More Services - </mat-panel-title> - </mat-expansion-panel-header> - <div *ngFor="let sshauthzserver of (authService.loggedInAuthZ$ | async)" style="width: 100%"> - <button mat-button (click) =logout()>Logout {{ sshauthzserver.name }}</button> - </div> - <div *ngFor="let sshauthzserver of (authService.loggedOutAuthZ$ | async)" style="width: 100%"> - <button mat-button (click)=login(sshauthzserver) fxFlex style="text-align: left"> Run on {{ sshauthzserver.name }}</button> - <button mat-icon-button *ngIf="sshauthzserver.userdefined === true"><mat-icon>remove</mat-icon></button> - </div> - <div style="width: 100%"> - <button mat-button (click) ="authService.updateAgentContents()"> Refresh </button> - </div> -</mat-expansion-panel> -<!-- </mat-accordion> --> diff --git a/src/app/sv2-side-nav/sv2-side-nav.component.spec.ts b/src/app/sv2-side-nav/sv2-side-nav.component.spec.ts deleted file mode 100644 index 97de6bd..0000000 --- a/src/app/sv2-side-nav/sv2-side-nav.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - -import { Sv2SideNavComponent } from './sv2-side-nav.component'; - -describe('Sv2SideNavComponent', () => { - let component: Sv2SideNavComponent; - let fixture: ComponentFixture<Sv2SideNavComponent>; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [ Sv2SideNavComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(Sv2SideNavComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/sv2-side-nav/sv2-side-nav.component.ts b/src/app/sv2-side-nav/sv2-side-nav.component.ts deleted file mode 100644 index 212c88c..0000000 --- a/src/app/sv2-side-nav/sv2-side-nav.component.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { MatDialog, MatDialogRef, MAT_DIALOG_DATA, MatDialogModule, MatDialogConfig } from '@angular/material/dialog'; - -import { AuthorisationService } from '../authorisation.service'; -import { LogoutdialogComponent } from '../logoutdialog/logoutdialog.component'; - - -@Component({ - selector: 'app-sv2-side-nav', - templateUrl: './sv2-side-nav.component.html', - styleUrls: ['./sv2-side-nav.component.css'] -}) -export class Sv2SideNavComponent implements OnInit { - - constructor(public authService: AuthorisationService, public dialog: MatDialog,) { } - - ngOnInit() { - } - logout() { - let dialogRef = this.dialog.open(LogoutdialogComponent, { - width: '250px', - height: '400px', - }); - } - - login (sshauthzserver) { - this.authService.login(sshauthzserver); - } - -} diff --git a/src/app/tes.service.ts b/src/app/tes.service.ts index 16b7668..9920712 100644 --- a/src/app/tes.service.ts +++ b/src/app/tes.service.ts @@ -76,7 +76,7 @@ public openWindow$: Subject<any>; private getUserHealthError(error: any, identity: Identity) { identity.accountalerts.next([]); if (identity.expiry < Date.now() || (error.hasOwnProperty("status") && error.status == 401)) { - this.notifications.notify("Your login to "+identity.site.name+ " has expired. Please log in again", () => { this.authorisationService.refresh$.next(true); }); + this.notifications.notify("Your login to "+identity.site.name+ " has expired. Please log in again", () => { this.authorisationService.refresh(); }); this.cancelHealthRequests(); return; @@ -87,7 +87,10 @@ public openWindow$: Subject<any>; getUserHealth(identity: Identity) { - let headers = new HttpHeaders(); + let headers = new HttpHeaders({ + 'Authorization': `Bearer ${this.authorisationService.sessionToken}` + }); + //let headers = new HttpHeaders(); let options = { headers: headers, withCredentials: true}; let params = new URLSearchParams(); if (identity === undefined || identity === null) { @@ -109,7 +112,10 @@ getUserHealth(identity: Identity) { } getUserHealthObservable(identity: Identity) { - let headers = new HttpHeaders(); + let headers = new HttpHeaders({ + 'Authorization': `Bearer ${this.authorisationService.sessionToken}` + }); + //let headers = new HttpHeaders(); let options = { headers: headers, withCredentials: true}; let params = new URLSearchParams(); if (identity === undefined || identity === null) { @@ -154,7 +160,10 @@ public getHealthAlertsObservable(identity: Identity) { } public getCachetIncidentsObservable(identity: Identity) { - let headers = new HttpHeaders(); + let headers = new HttpHeaders({ + 'Authorization': `Bearer ${this.authorisationService.sessionToken}` + }); + //let headers = new HttpHeaders(); let options = { headers: headers, withCredentials: false}; let params = new URLSearchParams(); if (identity.site.cacheturis === undefined || identity.site.cacheturis.length == 0) { @@ -209,7 +218,7 @@ public addUserHealth(identity,resp) { console.error(error); if (error.status == 401) { console.error('getCacheIncidentsError'); - this.notifications.notify("Your login has expired. Please log in again", () => { this.authorisationService.refresh$.next(true); } ); + this.notifications.notify("Your login has expired. Please log in again", () => { this.authorisationService.refresh(); } ); return } if (error.status == 400) { @@ -222,7 +231,9 @@ public addUserHealth(identity,resp) { submissionError(identity: Identity, error: any) { if (identity.expiry < Date.now()) { console.error('submissionError'); - this.notifications.notify("Your login has expired. Please log in again", () => { this.authorisationService.updateAgentContents().subscribe( () => {return} ) } ); + console.log(error); + //this.notifications.notify("Your login has expired. Please log in again", () => { this.authorisationService.updateAgentContents().subscribe( () => {return} ) } ); + this.notifications.notify("Your login has expired. Please log in again", () => this.authorisationService.refresh()) return; } if (error.status != 0) { @@ -249,7 +260,10 @@ public addUserHealth(identity,resp) { } submit(app: Strudelapp, identity: Identity, batchinterface: BatchInterface, ftidentities?: Identity[], appparams?: any) { - let headers = new HttpHeaders(); + let headers = new HttpHeaders({ + 'Authorization': `Bearer ${this.authorisationService.sessionToken}` + }); + //let headers = new HttpHeaders(); let options = { headers: headers, withCredentials: true}; this.notifications.notify('Submitting job'); //let keys = JSON.stringify(this.authorisationService.getKeys()); @@ -272,7 +286,10 @@ public addUserHealth(identity,resp) { cancel(job: Job) { - let headers = new HttpHeaders(); + let headers = new HttpHeaders({ + 'Authorization': `Bearer ${this.authorisationService.sessionToken}` + }); + //let headers = new HttpHeaders(); let options = { headers: headers, withCredentials: true}; let cmd = job.identity.site.cancelcmd.replace("{jobid}",job.jobid); @@ -299,25 +316,31 @@ public addUserHealth(identity,resp) { let username = job.identity.username; let loginhost = job.identity.site.host; let batchhost = job.batch_host; + let port = appinst.port; let params = new URLSearchParams; - let headers = new HttpHeaders(); + let headers = new HttpHeaders({ + 'Authorization': `Bearer ${this.authorisationService.sessionToken}` + }); + //let headers = new HttpHeaders(); job.connectionState = 2; + let body = { + 'user': username, + 'host': batchhost, + 'bastion': loginhost, + 'appinst': appinst, + 'port': port, + 'appname': job.appname + } if ((action.notunnel != undefined) && (action.notunnel == true)) { return of('') } let options = { headers: headers, withCredentials: true}; - let paramstr = params.toString(); if (this.ipcService.useIpc) { - let body = { - 'user': username, - 'host': batchhost, - 'bastion': loginhost, - 'appinst': appinst - } + return this.ipcService.createTunnel(body) } else { - return this.http.post<string>(apiserver.tes+'/createtunnel/'+username+'/'+loginhost+'/'+batchhost+'?'+paramstr, appinst, options) + return this.http.post<string>(apiserver.tes+'/createtunnel', body, options) } } @@ -339,31 +362,52 @@ public addUserHealth(identity,resp) { return of(url); } - public getAppUrl(job: Job, appinst: any, action: AppAction, apiserver: APIServer): Observable<any> { - let params = new URLSearchParams; - let headers = new HttpHeaders(); - let options = { headers: headers, withCredentials: true}; - console.log('in getAppUrl'); - if (this.ipcService.useIpc) { - console.log('try local'); - return this.getAppUrlLocal(job, appinst, action).pipe( - tap((v)=>console.log('try to open url',v)) - ) - } - let pseudoapp = {'client':{'redir':action.client.redir,'cmd':action.client.cmd}}; - params.set('app',JSON.stringify(pseudoapp)); - params.set('appinst',JSON.stringify(appinst)); - let paramstr = params.toString(); - job.connectionState = 3; - if (action.client.cmd !== undefined && action.client.cmd !== null) { - return this.http.get<string>(apiserver.tes+'/applaunch?'+paramstr,options) - } - console.log('getting appurl from the api server'); - return this.http.get<string>(apiserver.tes+'/appurl?'+paramstr,options) + private getAppUrl(job: Job, appinst: any, action: AppAction, apiserver: APIServer): string { + + console.log('in app urlLocal',appinst); + let url = apiserver.tws+'/'+action.client.redir; + for (let key in appinst) { + if (appinst.hasOwnProperty(key)) { + let value = appinst[key] + url = url.replace("{"+key+"}",value) + } + } + console.log('appUrlLocal will be',url); + return url; + } +// public getAppUrl(job: Job, appinst: any, action: AppAction, apiserver: APIServer): Observable<any> { +// let params = new URLSearchParams; +// let headers = new HttpHeaders({ +// 'Authorization': `Bearer ${this.authorisationService.sessionToken}` +// }); +// //let headers = new HttpHeaders(); +// let options = { headers: headers, withCredentials: true}; +// console.log('in getAppUrl'); +// if (this.ipcService.useIpc) { +// console.log('try local'); +// return this.getAppUrlLocal(job, appinst, action).pipe( +// tap((v)=>console.log('try to open url',v)) +// ) +// } +// let pseudoapp = {'client':{'redir':action.client.redir,'cmd':action.client.cmd}}; +// params.set('app',JSON.stringify(pseudoapp)); +// params.set('appinst',JSON.stringify(appinst)); +// let paramstr = params.toString(); +// job.connectionState = 3; +// if (action.client.cmd !== undefined && action.client.cmd !== null) { +// return this.http.get<string>(apiserver.tes+'/applaunch?'+paramstr,options) +// } +// console.log('getting appurl from the api server'); +// return this.http.get<string>(apiserver.tes+'/appurl?'+paramstr,options) +// } + public contactUs(form: any) { - let headers = new HttpHeaders(); + let headers = new HttpHeaders({ + 'Authorization': `Bearer ${this.authorisationService.sessionToken}` + }); + //let headers = new HttpHeaders(); let options = { headers: headers, withCredentials: true}; return this.backendSelectionService.apiserver.pipe( filter((v) => v !== undefined && v !== null), @@ -403,7 +447,9 @@ public addUserHealth(identity,resp) { public connect(job: Job, action: AppAction, appinst?: any) { - let headers = new HttpHeaders(); + let headers = new HttpHeaders({ + 'Authorization': `Bearer ${this.authorisationService.sessionToken}` + }); let options = { headers: headers, withCredentials: true}; job.connectionState=1 @@ -426,15 +472,19 @@ public addUserHealth(identity,resp) { catchError(err => this.handleTunnelError(job,action,err)), map((v) => { - appinst['localport'] = v['localport']; + if (v !== null && v.hasOwnProperty('localport')) { + appinst['localport'] = v['localport']; + } return [apiserver, appinst]; })) } ), tap((_) => job.connectionState=3), - switchMap(([apiserver,appinst]) => - { return this.getAppUrl(job,appinst,action,<APIServer>apiserver) - .pipe(map((url) => [apiserver, appinst, url])) - }), + + map( ([apiserver, appinst]) => { + let url = this.getAppUrl(job,appinst,action,<APIServer>apiserver); + return [apiserver, appinst, url] + }), + tap((_) => job.connectionState=4), ).subscribe(([apiserver,appinst,url]) => { if (url !== null) { this.openWindow$.next( {'job':job, @@ -448,7 +498,10 @@ public addUserHealth(identity,resp) { } public runCommand(identity: Identity, command: string, optional?: any): Observable<any> { - let headers = new HttpHeaders(); + let headers = new HttpHeaders({ + 'Authorization': `Bearer ${this.authorisationService.sessionToken}` + }); + //let headers = new HttpHeaders(); let options = { headers: headers, withCredentials: true}; if (identity === undefined || identity === null) { return @@ -481,7 +534,10 @@ public addUserHealth(identity,resp) { public postMkDir(id: Identity, path: string, name: string ) { - let headers = new HttpHeaders(); + let headers = new HttpHeaders({ + 'Authorization': `Bearer ${this.authorisationService.sessionToken}` + }); + //let headers = new HttpHeaders(); let options = { headers: headers, withCredentials: true}; let params = new URLSearchParams; params.set('identity',JSON.stringify(id)); @@ -491,7 +547,10 @@ public postMkDir(id: Identity, path: string, name: string ) { } public getSftpData(id: Identity, path: string, cd: string ) { - let headers = new HttpHeaders(); + let headers = new HttpHeaders({ + 'Authorization': `Bearer ${this.authorisationService.sessionToken}` + }); + //let headers = new HttpHeaders(); let options = { headers: headers, withCredentials: true}; let params = new URLSearchParams; params.set('identity',JSON.stringify(id)); @@ -559,13 +618,10 @@ private handleGenericError(job: Job, action: AppAction, error: HttpErrorResponse } if (job.identity.expiry < Date.now() && (error.hasOwnProperty("status") && error.status == 401)) { console.error('handleGenericError'); - this.notifications.notify("Your login has expired. Please log in again", () => { this.authorisationService.refresh$.next(true); } ); + this.notifications.notify("Your login has expired. Please log in again", () => { this.authorisationService.refresh(); } ); return throwError(error); } - if (job.identity.expiry > Date.now() && error.hasOwnProperty("status") && error.status == 401) { - this.authorisationService.reAdd$.next(job.identity); - this.notifications.notify("Your login expired. Logging you back in again automatically. Please rety what you were doing"); - } + if (error.hasOwnProperty("status") && error.status == 500) { this.notifications.notify("The Strudel2 API server had an error.\n Please report this via the contact us link.\nThe error message was"+emsg); diff --git a/src/app/transfer/transfer.component.css b/src/app/transfer/transfer.component.css deleted file mode 100644 index 683ae23..0000000 --- a/src/app/transfer/transfer.component.css +++ /dev/null @@ -1,3 +0,0 @@ -:host { - height: 100%; -} diff --git a/src/app/transfer/transfer.component.html b/src/app/transfer/transfer.component.html deleted file mode 100644 index 5f4163b..0000000 --- a/src/app/transfer/transfer.component.html +++ /dev/null @@ -1,48 +0,0 @@ - -<div fxLayout="column" fxLayoutAlign="flex-start stretch" style="height: 100%; width: 100%" > - - <!--<div fxLayout="row" fxLayout="space-around stretch" fxLayoutGap="1%" style="height: 90%">--> - <!--<div fxLayout="row" fxLayout="space-around stretch" fxLayoutGap="1%" style="height: 90%">--> - <div fxLayout="row" fxLayout="space-around stretch" fxLayoutGap="1%" style="height: 75%"> - - <div fxFlex *ngFor="let idx of [0,1]" style="height: 100%;"> - <!-- <div *ngFor="let idx of [0,1]" style="height: 100% " fxFlex>--> - <!--<div fxLayout="column" fxLayoutAlign="none stretch" style="width: 100%; height: 100%" >--> - <!--<div style="width: 100%; height: 100%" >--> - <mat-form-field style="width:100%"> - <mat-select (selectionChange)="setId(idx,$event)" placeholder="Choose a server"> - <mat-option *ngFor="let s of computesitesService.ftidentities | async" [value]="s"> - {{ s.username }}@{{s.site.name }} - </mat-option> - </mat-select> - </mat-form-field> - <span class="mat-body"> {{ path[idx] }}</span> - <div *ngIf="working[idx] | async"> - <mat-spinner></mat-spinner> - </div> - <!--<div *ngIf="!(working[idx] | async)" style="height: 100%; overflow-y: auto">--> - <div *ngIf="!(working[idx] | async)" style="height: 100%"> - <div style="height: 100%; width: 100%; overflow-y: auto"> - <file-explorer [fileElements]="fileElements[idx] | async" - [path]="pathSubject[idx] | async" - (navigatedDown)="navigateToFolder(idx,$event)" - (navigatedUp)="navigateUp(idx,$event)" - [canNavigateUp]="canNavigateUp[idx] | async" - (sendFile)="queueFile(idx,$event)" - (folderAdded)="newDirectory(idx,$event)"> - </file-explorer> - </div> - </div> - <!--</div>--> - </div> - </div> - <div style="height: 25%; overflow-y: auto"> - <h3>Transfer list</h3> - <mat-list> - <div *ngFor="let t of transferlist"> - <mat-list-item> - {{ t.srcpath }} {{ t.dstpath }} - </mat-list-item> - </div> - </mat-list> - </div> -</div> diff --git a/src/app/transfer/transfer.component.spec.ts b/src/app/transfer/transfer.component.spec.ts deleted file mode 100644 index 153d995..0000000 --- a/src/app/transfer/transfer.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - -import { TransferComponent } from './transfer.component'; - -describe('TransferComponent', () => { - let component: TransferComponent; - let fixture: ComponentFixture<TransferComponent>; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [ TransferComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(TransferComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/transfer/transfer.component.ts b/src/app/transfer/transfer.component.ts deleted file mode 100644 index bd75465..0000000 --- a/src/app/transfer/transfer.component.ts +++ /dev/null @@ -1,171 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { BehaviorSubject } from 'rxjs'; -import { FileElement } from '../file-explorer/model/element'; -import { TesService } from '../tes.service'; -import { ComputesitesService } from '../computesites.service'; -import { AuthorisationService } from '../authorisation.service'; -import { Computesite } from '../computesite'; -import { Identity } from '../identity'; -import { Router } from '@angular/router'; -import {NotificationsService } from '../notifications.service'; - - -export class Transfer { - srcpath: string; - dstpath: string; - name: string; - direction: number; - constructor(srcpath: string, dstpath: string, name: string, direction: number) { - this.srcpath = srcpath; - this.dstpath = dstpath; - this.name = name; - this.direction = direction; - } -} - - - -@Component({ - selector: 'app-transfer', - templateUrl: './transfer.component.html', - styleUrls: ['./transfer.component.css'] -}) -export class TransferComponent implements OnInit { - - fileElements: BehaviorSubject<FileElement[]>[]; - pathSubject: BehaviorSubject<string>[]; - path: string[]; - working: BehaviorSubject<Boolean>[]; - canNavigateUp: BehaviorSubject<Boolean>[]; - id: Identity[]; - site: Computesite[]; - disableSend: Boolean; - redirecturi: string; - appevent: any; - transferlist: Transfer[]; - - - constructor(public computesitesService: ComputesitesService, - private tesService: TesService, - private authService: AuthorisationService, - private router: Router, - private notifications: NotificationsService) { - this.path = ['','']; - this.fileElements = [new BehaviorSubject([]), new BehaviorSubject([])]; - this.working = [ new BehaviorSubject<Boolean>(false), new BehaviorSubject<Boolean>(false)]; - this.canNavigateUp = [ new BehaviorSubject<Boolean>(false), new BehaviorSubject<Boolean>(false)]; - this.pathSubject = [ new BehaviorSubject(""),new BehaviorSubject("")]; - this.id = [null,null]; - this.disableSend = true; - this.transferlist = []; - } - - ngOnInit() { - var fel: FileElement[] = [] - // this.fileElements = [new BehaviorSubject([]), new BehaviorSubject([])]; - // this.working = [ new BehaviorSubject<Boolean>(false), new BehaviorSubject<Boolean>(false)]; - // this.canNavigateUp = [ new BehaviorSubject<Boolean>(false), new BehaviorSubject<Boolean>(false)]; - // this.pathSubject = [ new BehaviorSubject(""),new BehaviorSubject("")]; - // this.id = [null,null]; - // this.disableSend = true; - setTimeout( () => this.authService.updateAgentContents() ) - } - -compareObjects(o1: any, o2: any) { - if(o1.name == o2.name) { - return true; - } else { - return false; - } -} - -processError(idx,error) { - this.working[idx].next(false); - this.notifications.notify(error.error.message); - -} - -newDirectory(idx: number, name: string) { - this.working[idx].next(true); - this.tesService.postMkDir(this.id[idx],this.path[idx],name).subscribe(resp => this.getSftpls(idx,'.'), error => this.processError(idx,error)); -} - -getSftpls(idx,cd) { - this.working[idx].next(true); - this.tesService.getSftpData(this.id[idx],this.path[idx],cd).subscribe(resp => this.updateSftpls(idx,resp), error => this.processError(idx,error)); -} - -makeFileElements(data) { - var rv: FileElement[] = []; - var fe: FileElement; - for (let f of data) { - fe = new FileElement(); - if (f.isdir !== undefined) { - fe.isFolder = f.isdir; - } else { - if (f.mode.indexOf('d')== 0) { - fe.isFolder=true; - } - } - fe.name = f.name; - fe.size = f.size; - fe.online = f.online; - rv.push(fe); - } - return rv; -} - - updateSftpls(idx,resp) { - let files = this.makeFileElements(resp.files); - if (resp.pwd.length > 1) { - this.canNavigateUp[idx].next(true); - } else { - this.canNavigateUp[idx].next(false); - - } - this.path[idx] = resp.pwd; - this.pathSubject[idx].next(this.path[idx]); - this.fileElements[idx].next(files); - this.working[idx].next(false); - - } - - - setId(idx,event) { - this.id[idx] = event.value; - if ((this.id[0] != null) && (this.id[1] != null)) { - this.disableSend = false; - } - this.path[idx]="."; - this.pathSubject[idx].next(this.id[idx].username+"@"+this.id[idx].site.name+":"+this.path[idx]); - this.getSftpls(idx,'.'); - - } - - navLaunch() { - this.router.navigate(['/launch']); - } - - navigateToFolder(idx,element: FileElement) { - this.getSftpls(idx,element.name); - } - - navigateUp(idx: number, event: any) { - this.getSftpls(idx,'..'); - } - - - queueFile(idx: number, element: FileElement) { - let src = idx; - let dest = (idx+1) % 2; - this.transferlist.push(new Transfer(this.path[0],this.path[1],element.name,idx)); - } - - postParams() { - let appparams = JSON.stringify( - {'sites':[this.id[0],this.id[1]], - 'files': this.transferlist }) - window.parent.postMessage({'appData':appparams},'*'); - } - -} diff --git a/src/assets/config/apiservers.json b/src/assets/config/apiservers.json index 0392248..4d694cd 100644 --- a/src/assets/config/apiservers.json +++ b/src/assets/config/apiservers.json @@ -16,8 +16,8 @@ }, { "name": "localhost", - "tes": "http://localhost:8080", - "tws": "http://localhost:8090" + "tes": "http://localhost:8000", + "tws": "http://localhost:9000" } ] diff --git a/src/assets/images/mlerp-dragon.png b/src/assets/images/mlerp-dragon.png new file mode 100644 index 0000000000000000000000000000000000000000..44255f075f01b1f5cc2313d64c31717ca9778a6f GIT binary patch literal 34056 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 literal 0 HcmV?d00001 diff --git a/src/assets/mlerp-dragon.png b/src/assets/mlerp-dragon.png new file mode 100644 index 0000000000000000000000000000000000000000..44255f075f01b1f5cc2313d64c31717ca9778a6f GIT binary patch literal 34056 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 literal 0 HcmV?d00001 diff --git a/src/deployments/mlerp/assets/images/mlerp-dragon.png b/src/deployments/mlerp/assets/images/mlerp-dragon.png new file mode 100644 index 0000000000000000000000000000000000000000..44255f075f01b1f5cc2313d64c31717ca9778a6f GIT binary patch literal 34056 zcmeF2^-m>D(C=|~IJmpJySux)FYXQpcXxN!#r>d*F0eQ(zAWwz3tXO?yg%MQ;3jW6 zJ;_XGlI}`%Pt~Ws6QimugN%TW00stzEGH|e4h9C!_+N*E`Fi3TnCSU+<7g)#p=xJg z0R~2!;+Znb0A)t_L*%U#zyOPq$_XpkfI%hG@EwP6g+6Zjd=00aWpTz~!!RRmBr~kb zN8lN?i(W^bPCYfRw==He#y?&^#>VgO)5)9Qj>+H)%5&AN^bks-M9H!4jjm>%3bSnq zO)eaUX^7KS^X$p`B-Cf)6G1?&F>0;x=gylu7fY2RWI)1jS)?7`FgvnFU1E)oM%UKF z$@K8sFuDQ^)_|(t)Pc;HUXlsGAm$nBSxbfKElfjXZ9)%vFKDk&e83@Ku55rZpZVvk z{6+d!gi=1P8mD@?9$C^z@lvVfW2f`+G>?RwU}T>Xz3%=*DyFmK(svIfh1uxBOd1ub z!w&%!0S@+aPgI$by&+E%Ke9IH_S&-`!Y-!^G>9h`?fN%`)Wx;D<K>=}R@jC!7dPWo z^-Y%^a3b$YrxO!((GHO`;E{!`ocJbylgUpnu*ls5F^20!Dyz8_G0<($^8^$5+!igP zU^D;A{_rlcdhTFghSL9aaIAC*F)%PvFgZyvO&{=cBj{p)6i(q=?B%7ZIGU!axTYw& znke0nXiIPK*yYz1eMnqNQd1Iov=|Dy92%OkqIcW>>2qMKU~B!&>3r6^Xa;!a<>h5R zS0Lp6cP58J+;$%8f7}0B;QxOMpdqflxpU&F%Yd7l*8bwMLnz0A205&KzKi-Y&4a9$ zA86D=X!*r8ME@U+^Z{!g^L}a3a5Y;TK~x1$-=Qe^_XfD422G*zI&M|ryy!8_37skp zRAi+OGoxyNF>+C-b*Wa+&0wr`8*PBEhhelHBO3LjbLsYMV#$Tbg@{lDN@SQJLvK05 z_@%JwkZn1Gq(s@9`9KjMNRX^5Iy?$2H&`m3HZ*%9M6+NsQZrODB`dCra4Sw1UKd0c z_JlutH=G0XCHQ4pigxx>{0_=*R7<>G;EO17E`(GnL=^tWX^e>-T(d7k5EDB>hHvx4 zcTxFo;SR+(k+zh|dnD}a?5r7kjX&O9b~*lgCl|s_99&)|UB8dK0=;zgUP@>ypzqA= zzacw0phr4bs$6w5hSkx}g7>Xn?<dcT4J}UFdC_!cqYc?X$4zcF_rHp4Ha`hlTo0sM zf<J>?uXl$61-#DJqHXg2g<w$0r{BK>;APNjZ5Y(+vPt-v3GT<U-`?Hbtuz>Px=*H3 zy%2Ca&_?xHsY!cM?qRVRg`^(2i^`Ycb3*@0gfJ7?ZTsf<4>>oET)%eA&}-dl|K<k? z4uC-$3)@+Zghr^(VV%9j<3znIh*fsw$fVcHaeGeWGr!&E#=OO9IupXNTD2sU*0`^W zR;Mw4VrmM*G_}-0@29lH$luvKZ^b<B3((U}unC_B{Q-Q%s5%IA;uP*c7Z^Zf{|&m2 zpo_VJ>uib>T3r^LopH6zaVnh-D;x!Ht;e%2c&*tih_%Z_W6MJ0IZsk!xj=SC3hjm9 zQk<6}7s5kd30Nu#o=ZFN^YUt|_lazz8o~riLn9A`Ua9^%#_qAqOU6I+gv7gCPr%ci z6B<Jvs6;#ap<1O<MEp!dqW&c0cfVHoO9H+Ma|FM!ZTjN^jfcpGzL{3Sg7d?7cN2sl z^&;i5nI-|g!Gu>ZV7FLFXQ7Nqt$1DJxuW;sf7$)xbK_f6Mg6ucp#Nr^fF4qH<OI|V zv)8Fl5zKNZZ_qUjlmfsM?@@#VLu%zF(bck)Zx#?DXzB<|NT3Q~o%kzHxYyIZo-Ngs zc`1Iv(-2-2@w%FePbF0)ueaLtZdA-yvEpeXw;cplFnv$R|JXugv=<HBl>o_!;$KcZ z!S^MOa(sCZH#9$~rFZI1&>K^s^OpNI5E6F7v-W`_;K|6wpP2>^p2u+mtJX1MteF_r zC^T@%guF1mzFL%o(}VZg*_0N4+NW~QJQPL=90!_tykJ4@duwaj%{vaQ`|mE-?;7~4 zz>2)C%k@I=tz5uFR&6w=xvowKcJTC$O!rUGE}UjsQ4!8t3sP@UtmlHTQAf$&kpH>0 z7~M6gc|xLQgMNGZb+|<$-}q%04R+JXj_Q;8=bHW2yUdYh$H97~pBBSQ@XKLVdYfDW zB{J^Hg3l-Xt+!gEFPsR3qBk!QG9k1F)8F0ghc}qt?!h#jqIT{`Xkrq!2y1>Rk;nwK zJC5qZbHZ=+b&EkJ{aHiJ6K&Bp>Gel`g^)E@6<Nme@&@7n{RyNqtACoz__|Mn2Y%wm zMJ@A1OEQSWkm@fa_3uGyzdB{oZ=qY=2_glTL%y~Ixw<KWIxf+9d73i912PTcfPQzZ zm(4)+Jvy^BRnAJmp}`wR_?+^O$NtyTI{0rA<)H{MW(84ChRnfnA!m7ADmuq;k!o3g zU;EGB)CU4f0~1Z!Ag~oVP+XZp@b}9>C2d*FrR7>>(g~KVbgKlgM$Fs}Je^CLGqlXa zHS<5Kk9zy-B)j9yOO@E%llyDV7xt_3r_8T2Ys|GSl__SIbxfE*wopxzk*QP?zU^}I zvuzxHus+(!zwA)GD3Yh&PoQLq*>u2bB%6$i&DPh}SCEQS4Z2k85=p#xR}i&bxxa}e zI@j^;ev({1Z-1?~v=oF;&MiGyRTRXZdX0W}_qFq%6|DKn&W#R}xXSAcrubg#>!v$g z<O~Owj*pu1w8pvEgP-@J*gDB_<MHtD8vU5?UFn2VT!awHQu%a^5Ycz&Q!>W%u)BG4 zW;9KkA77=m6bFxuhFOg3cX3!CS(pxStbV6{x6OZGxy=HzpT~-hfxt40N6A)%e$rD) zY!!IfTR(Id*QBXyBbu|@oymQ_u*oM^Zu0H;Y_50n%9YQUdck2f#6`Y}p<^m%>{XT{ zF~l5erqv3pNGH%;HSy8L$wrw6B<#|Y@C3qkr1{Ye@}fX4%;M@!lv8@a9v~?0R6J7) zuJ+KQQ7^dAHfa8l-6!(>lfs@oe@4S2%s9^cvdo;OAq;=!*3D}vE<6zR<js`QIo>X& zt;beBMOTVZnH)Zw*BQsqC_9ja;}-}A@el3*IyZ$8qR<RSbLvL{3<j<119W35dW1(m z%)?J;xAt3y;yhAh*26Os^=O)DL{~Ms=cM*FT3FH2RWBe>+Mu2)gvRKdd}G-CvaDgR zXIT8o>ZsbTs=4m5(qshew%<bIZumae*m?y@=M^O6An`K~t32myBPnr{Pao0e-Q4up z?&ikE(<I!VKWhPoOohgB7SONVFKEZc=nP4X9h=U97m=>V5watIq2bUx)f;nC9R`CQ zd^Kcc3l+#6zv_In&P?=D3J*<sM(CYDhbXk*`HMm5_GBB=8vij^fBR59$Bc#7TwR0- zl=L<A#n!fR_WItWD=O^El6kP5i2<aW><U{{DTEqJ)PNxCNtpc~_{gIZp1}l3g#q@J zwhQ~}u0s*du+&NuLixxr46vmViZ1YOLP+&?N0q3fZl>Db9IQNq3yqNejVq^ZfCbtb zfqSS(tqbT|A}$c$+s1sOeYO*!PE5{x!Ny3OFs5i^2;{^CT(odfra<Tq%Y(V%1l>0H z_`PO%$>C%Pi*o|o%Ec=bpA;>;2iW=R;L(HV-z+U2RHab|0>k%CG`DGP^;;`P4AR{? z8O&J3=(A+NC$$P7UiLb}p^jJ?GCjesF=5n^yo(2xK{6pItyADtrBDxW<uwcnQ8wCT zZ0~QfX4-h!n>>?#N{sxv1{`%u|8k=+M&$9OoL_fl%?EeVN%6&T9$e5)YNe^~Nf1<% z04R}K!cy~;q0K>oja~b{6h^3$Uhw*~p{C<r5^YRJKA;{u-P0j3i?^fVP3b8yV2LHK zA&<DJN*L6p)pyZMnR=y9^VSA_fU4KDmGwr32+;Ux=r|5j2Z)lt^T$$k>qJdg7ExtF zpa)fqYCoDVUd%FFVeP!P&IfU2v#ptN&2tjSZ_*ZfY1`e1MsRy2&izQhRQWx=u4rCj z-0ug3cH^&B_JJs>drGg~hTxA6S*-0X87Jp>R(}C0ynTrFz=ljlWHE$bf=}7}rjC8n zCcnpTMlVC!#cC&j2`zaRny8-W8XlrfHivtD`W>cRi!s1wo-_zf9^^*uNejT5M`A#s zKWbQKj2yVDHG+6h5dsc{z?3cwho~n=CZ#@HICu*_WaB;(dXC0~O=TdqO;ce+RG-+6 z&OsTQi)5)UYh`Pz**u(qJJ@JrLwmolbS_deTr0j{>$Y!_)>{9Kb9|8)6CU(GUBy%M zfWy^NnKA9Z|L1F}t^(9+;I6Q#Tfd6y|FA&gW(rGtVD9-{j5RO+RBU;J{qhXxjJASR z@>GF0$@FO!KL+%Bjn(xcBydut$Cxzz*7Gptk!BR?nvL$c|9d7md73fGca%?&HtNZw zH6^4aW!6i9B^&XeA<9^!HxIQHt?*$5V7`tUewun7z!G@pu)Ga7`DWvVRly-0-P^GW zo#uu!M;s)GtL4o~cZWv#bf@ZlP~7w?oq{&&@pN#jTFuBW{DP(Gr+dr5@CP5`wejN} zc8ma1q|*ex(L!<-Oeo_W4QRa%km_eVB8a-Fe&w~~MJxqf(;Gn{sa$Zb8v8|L3wSpM zlBk5xTtSKQMoLLP@X!0EG-exbg&1V$T|g~9Yos)Ky<Q<!Q>b+ouvO$i!5_o6JQwHb zxo#riEr<CGf@i-<jnr?C*6UhnuSdSGiE`?5)JeX(v1O*sC-IJRmy;U++EXRZOZ-dc z4$YT?G<b~oDGYwAHMZ+Z&9fTLtli`k{-v~b(*?zuW%NeV=Okl*89bh2;XD$V3di3$ zqeVtoH5aqOw0yP}xorG6+0nDkJNJR9WcZ~;w}UYH@8>ZTL{+&77>$|V%DR>lRa>0m zy(??&oe=Hf@(k>dZP9kj0W(&hR{PAwesPh=<(s`a5i=nIAwANxF~Z1tSWw|14oe?@ z%1#qJqypDaJk-=*xNDCwOv$_aSm{~~`K83<jrT4qWvUyWh=Yp>-|4Jq0;jH_fg~=p zKaAs|k)8-XXXfcU(~V&(JKka~%FzC-x+StYd;?8kR55IcguzhBNX=DsNczPlp>}i$ zLX(nl{%NL0R)VmTrz{m0v#qOf$i9au)`biO19Y7KcV3yz6V3Y-j}JtCYrnMC;|bC2 ztyp!1(rTZu2UpHnjBA(J)()CoH9<S7kF)}_(=7dz*i8DCJ2bS-T68w7!#ftU%`rr) zFkV`1A1FLy8}*Fr+Oz*Qe-fDN;#r!Y^ntXH9&GYcw~-tYI>r#@#J;QJUBrxO$9<Du zjcMmCVBy2!)x^zI5;{jqG&^o@jq|Kqjb5!v=%i?*T{OhHv)XtvhPa;DrP7<{^d4~t zePtCF{yqQOV^K+LaSYwgEze;`HvJ~t2&G1P(n=Mas=r_qMKy}5#M4U)FaE}lfU>WB z!k+`pT?mo(&<IFJmjlSr7QDuwWY9WV>0Z-!Rh}GYh0z*q@S&gg#gqa{B$@$TT-oYj zS^A0Tk?-;<x!xQP^{GxfuMK}*92W2ozCRk=jNzF0{3Ku_1Iz$8uy?6oH|**{$#x*d zMYoc1)|y!BF$UO-zhlWBjHEZUU6G8UMuh8(1Q`R2yhyXDEBeaB73D5Qi6K}*^_bK> zw25Nh8D29S5UeAt#F0;=ff6ZZV-ExYoMS1C%uI`nmETwXUSK1ljysJnHb@GI<*~qP zR4S$nRX6!RLRHthNs6>k?fAA(3}Ib{4b+-psmHTZgi}46sBxW+nlrWJ_ka<A51{q_ zYrp8Tn%A-u@f7jUyg0~yorIXw;6pa7XRSMM>i}&+<N%0mWn~Z~7Z4X)UJ5rg6)KTR zEi;qIjcJr}DLbxs9NlZp$DCB{46;brniS`ccACam-d6BB+pItP?7g!lLltpO^kI5h z%Rx?3{QT(F;76tvOvKerOpbnZWzv7oSb6&iJ2ai>vbFEt=MyE7n>>*3ASfA@o7<7I zmy6YBLG_wMg<0BXoOI=)r9Gkud4w8T3FcFPWV@fJ8W-6Vj6$hIdt}$ciQU|-=C{k; zy`u^Oe|;zPSSP{1U6B`sU)yQ1YH+eG>5NU+>zc6bS*Z%*(b>d!`s#FLYiY=OdyDoQ zVCPCcXy!5tB7)0XY5&04gtGR;%3hANl`UVaEQB!T*EluEc*ZZNks`GE<gh6z5WpUL z5ssLg2>qDiVmdtRUp-q1__0zW5Aa7{`t~?~(iP-F>>+u9K{?bvC{sWRQ}<*hxqaX# zYEa7oV#QpBX?Ky=uHAV^i~D4F&9p_fZr4|;966B#N+uYbym-MoEq^GXxYNND=`4tM zlP-2KAsob13d-AHoUSx5gx#13h_w*2lvRs0+Kl*mO%PQ_ZaRlJS&zL3wN=D+B475* z2=qj$UDWqrn;=>*%X8G3j>^w<9S`>02PCDp**}TdIO9E`NFyE%fi!#KQ+%}!yW`_L zwhrdnpRn04VrU9+>EfP_0GRVsnqj|U@v>lR`bhSz!Btv|mZ8!P<S9M1Cc$3+sBew5 z&FR5%Bw&9<LaAy6%p81J(I0gR$^x;HHQiJt8ZD&yn+(<rkl%bR5d-{>#MhjxqSMSS zwtN4WeV3hE<?&_)$q&{LI&ar^%O0oCyE6<^3SuwHIT2GkOjbS1R6bBUgExUSaf{!g zKK*kgP+~Xh<5&abjWB0R6T(<qak1wB&c0*HfzLLV7F(BLCIa?<z)L4KJ=Mog!qhSS zq@<Ka3?^J-%#_$^f8N!;IZYHfKd<t1562St-VB*RR*_;i%Wv8-3R|QZG{nT5Uca$6 zJ3Z7G7UUwk435N*(=3RS=Ud;=T&U!W^UXR#F_fms;px`(_LS~CRYU^PuN9p)O6AX? znI9S?qd|uv;X--M#4OL<(-`Tye1$SwI+ieE#+{%?hT>^e;5TIIF*{Sz`Tm>J<vJ<B zN_>;Rhm7NevM7!F^<)ozsu1A(Mgc6>Ib4Z*mC>qi^>o9P+eXU7JcllTa*-V<{jH$> zy2N8|O3~4j%9PbL^VeVXU3t@uVKN#sE9)MtVYPSGD3YMAF3)Sn|40bWZNhf{Z&PX- zKofND)c5B{d9#NtJji42m#g1IYo#5KAAcU>3e5g>wSu^Odq-dUgr3I%cBGPsXRA#t z+rCEyUD<%R?Oq<a)>8K3kwaa_aw@)yLe1S6P8)LoD}WVULo7<KWgJ#R&5>+H?53Zg zIbi}zM(le7>^pc)hEC{bT$_8y0Wg333Z@d-HWF~C!e%*vCMI{bs3OAU#?0F+g_eda z*wie2a$BmlNWI@>Top4E1{>#--Q;kU$pr4ma>8nuL;aUwtF3w_mY{MD8dG3n0eal9 zV>LdF=nmC#50-cR+X{JlqQ(WWsVb3FVYPFoKu3(E)*qUYv)J20;DB?^1h&dBmgFhv z#Xcg1%LH4!Po>H&?CYO2mC*#AZCYcWJ!rg)d4>v3{__LsBkhc{*ln9as>Fda^Ax>S zbMZ4XvoBn=i*qpp-mSx8ycTP>`{w`K|DN}u?33}dQysdf7}+5Xp1`$RdHWx1BTX#f zj^`S9aO4Dll#!G$tn|u{eCrbG?Q|VcmccV*QbNWsYZXpqThyp?cYPXe5Q>o#ZslJ5 zn<557hrc6vIY!6b%TW=|)3$$;&sG1^==pl<SdZtKi~gN8xHB4W*Kd}8-7m=@?2^k< zTBBwU1kw6j-(q49rxE?=XAKZ*BK<gjrl+r~FW&+r>qe5$+UvA=WK%qSkW)M@g(&jt zMW(Y@qDm*T*|W8-*Xn$BzbOvc3ODQcvYpmBfq0}?ifckM=JnopQyU9qmQ#*4YV1uM z9<KfS;XV4`@)q-Yv*YxMQ9Y?vq}+1j(D<aDAo7LpKnX7(WCU2j-6P>P9AH?;6T~2R zB_RqR61t%detkVAFYy{Iin7Z)MM-JWb0iY^corf2&b@+?0j->+Mx_{4BT$}Ajb0HO zffEMZ!l;Mu)RGuEvp#yXU0k3kEc9ORxGWZ^*PS;@F?DPnMX-EQ+k=~pNmX+TvW1Nq zQAKG%)in0#9tpGP9=1n)+1J%neqW*8WdgN>(uYchn^)vwFL$o+J+1D^{0oEwd-w{X zqaaK|_yS;SrcRc0<A$Ts>MyubHuy0~)-VDbP<~%R#c3WRu@=F)9#iFn=M9{GbAa5l z*)50xiWX2N0O_n!&~ID}mOq0`{T>F;e_?ip`36Sp=m_aT72c+_5xBrz!*dz1k6bQr z<!}L<)@6!cIo86%U{Pc7x$L7YlDOVP_qgj^z6HOYRE^mb1^&H+G-?k0fxdxQKbF4d z$w<DiEl+f>5-NZ0r`xdVg>z9c5nhf5<i2PoxF?$;%uROF(1Dvpp&b%L>erm@svVp8 zSq#ne&NrJE4W5^Zd2r^Nu0z}4`UFAMHCxOuXU_><AmstBF83+mBE(v=+hRlAj$A|A zM@O$$u03k;o!{%6Hc{|aR_zOoqW@uqQ7e^<$rd8}_jPzgLi;_OE-%|tM0#IsGj$A) zz*pLvUu?9Os+CEbzdc^?zWer1OirSY#R4z|bK@Q@F)RhIPMQYHMj{)J;%UkXd7KM% z+wC*5`P?g8rY4tvLV(heeL<3xyXj|dU^TI2J|^+w_uo}@L1~pW*E~SOIx?3CUjxdI zM{$N4hFYSM_I&z(7Uef)-?J~uOyc*+r?bL_M)J9duWiImk>4%UZ%faJQPdYeoJguB zdr#ijoY{F7dssJsZA!#1?~{66m_u)95Q5afGU#-2tfHZ))~HGx8lB+9Wj5%jzsY|J zXSbSyV=s8S>{Xe`<(l>hnr7<6eN^ToD^4{Y9teEig#@W?z>Z3}8#L&1sr7i+Wd&k8 zHmua^9W-Qf%=`LAn$YS-F8FfdhMwMp*r|ZtiWG*5llRo>$y9GS%y^k`4E9Q0x=9iO zNM$AL5Fa>PN+McaD<lt~Q6x$&TDDiw>%zBO%{{jua%w|d7q}by*P{>xQ2{sLuR#A? z+2DaBpxHJNy+Ys3S90EiHR{J;99lsyf`?jBuPKq^cR2QQh^z;?qShHQn{gK47dFJj zB3UDk5#wbds4)-aqP>9hT;*AGnT0bCI)lXT#(lbiAVG~zI_iMuZr=tUw16z`^G;Iy zhupmgM4Dl6$$eqN&GNgJO}sL$Hx=G*kGB0)(n-V)LZ^e3O`$6>!67_;+1o!Py#}ic zfgN%{`SbU$dTp$viPx{HkUAhTFcO0Bm%ebN<3No@75-n0Xcc}J{YfST*p4tVB1rZH zsurkIk!=vEh=6E~f(~n2L+RX;2N=6X$8xxei?75s7Vylptz}?YIZ@LaoCQk#yF8@> z3<q9Z%|0e=8zp6_c9%6Cz#-h}6zAVKVUv$TF3zs=Twqyn=;bEUmUba8o?Zp#aRt_# zoj6iO;T_I$xYB|PI~;%%Gj0lW3PL!Aq(VZMF#SpP0eyQ`!M2aFi(pEs${0k+%D!7D za&F1sMBK=P8}v5YIqIvWAH8qWj!sh)@I6~_U2&MsemA|vd@MF{JJ!InI<BmczS?Q3 zmhxJ>V6`ksn7*s(`UgocCyBfKL=72`za;5q<5ZnLquucFaieB7HTCm}>>p?1#k_Cz z^~fKc+-7`bF}d{e4~Rm<wt=AVRK#}Gf9{~5MtfUov7}aGSPK07FM3DDM>O|%Az8$S zVD)i9&-0TY$$|5y{x22*DMxd5GmZKP?|(iyYb}<!yw7LqY}PZl7E)=7vR2yfZ%;U= zBLA9gzYsXkemsGI#&|d<!cr96kNuwZDBG8rH=dABoiOlzArzy;Qdes=9abi??G{}! zaAU7pw1!?!xNga>6!~fx_JEZkR_~ycsWf>}Me_XzK%AiZw;+KmwXaAs{5&Tj86^4Q zt=l#Qaw5w}M_pC24QfzaSP&y7LDY7kZF*L*2p&AW430)JMEWqf*t{C2$Y#Fz1<6xg zi{H!NJZJo=0KK*Dqe2Gh1bjfc9-Go!q0m@3JZ5~xScp*6xg<<};NyBILk@D(ELJZu z3DegnkeVchNdffDw={mL-Zp>29c(d0ujR09-YX<5rD4Xc)RPtonl^zOdcd)Y>;Ml& zD`XRHHOP=u75P2$<B5nDd}uX)^I0O-Y)oZDmC7fjnYTaPG>)C`GgJ@kw(|lT)`khQ zfZr3tdGNiXTB|OT_q4if)N|E{<}SR?*!M6)dSme8b^4lFtS$h;=vUw4#<%^0BoXXQ z7GJS*0s)P4U(Y_?S~sFibkj>?T6McR3g99nF-%IdJD62Y%z#t5s?~^_Ksn@s`YyXA zE|`bcm<G>tkIY9f;k{n^Fi{uA5NHhQ$S%D^!c!iXD#u)YKxoQvDF!cDEYfV~qsb=j z+yWIRJ=(S+cnBIN8ij~Inp!Crcd`2*k%2ev`Qz<sjKI0iEWO$7P=4g^>6Z5n;H!SY zejet|f%HFGfS=E%t0QHjA2FJFVn6hI!YAqt#(b0~XP^t_U%K4VFGasO!>$O35yb)_ zNGMQoYPKOe*ly<}ipqmq8OW^MaU^()v6PK6TQ_&@D2q_@37PY<Y|!l=)x(w3ND)kN zImAwDCuC!b{7cdK0-jyiEXI*?BpLO-OWt2>t`1~@j~Doz)<kkrANU0B$Iv)fAMW&< zoco>$ytyhzRhn<K*)`rGyN`e$`$z%xZj=lmv{QEeIDB$P;67t|c0wmMZ-M}8IArfv z9>^$<7CNBWwJ!R(8nfRJsn)v8^fdR@;PRV<QZa@=PE+|O{?eH;NU02Hme_h}t}(7v zLki}BXLE@Z<rw*%iLdx7c(mDU#FG2JqNGzh+oc`t>%*!E0Yh}WZkJ2RTK8hU{i{3x zb4*!a{AXvG1qGWa2(0C+n8}eyU~Sh3V&axUpR$s)A~nP^VT*7i4)3{aIV(GXe9%t` z+3bZ8hrep3ZA3{(OlSJ#KHE&LM*Da~cz0n}7-jD8w}aKaik7W8tw5@An=N!kL5NDm zGpkJbNWaaNOj+dJBkOyiK@erS|AD^RWB0UVOYdte2k~bS=^e#0d&6>}2P;%Y!h@UE z#rTv>{wY<Q@<9$n68RyQ*J;JPGYmf3CTfPLg$qNc%{s?T`lB^l*vO|jv$zeC1ke^Y zv!Q&aZ4w1vO2d^IxG3Z&lpz}D18?|{CVCh^NxR)!!29xiF!t|7lO=ms1olzu_n%za z;&*Hw^2N?KFT*GB8<RhKNoBQn#svP1JO^%g1%+_YZ8Lv=++=9YO#QZx?iF>IAvx(c zEntU$HXd_VMu){anP~3Hph+!i(1;yT5FB^<as2G{hXlsM+pTPVBA9a|R<X=SomRn7 zEN&<@7Wtc1G(mxuD(Y-;=VFCI7Jial!FGiLjzEpQyH<%f^hk)NycQ=KvY<=5PLpxu zr98H(m8fIOjSuSnz)Z1m&AoB_YK8BRpNFcx&?2|JNVi5RxZw0!vy!xQr0iO*N>rdi z2#0SS85vd=Ttz-oy#=rBKe)g{w`vsfp|NcI?<U!Z6o8a}RJ(jB-=X~*tHOt>Q@eN# zQiw}sZQC7n=_G(iaoc#5zXR@O*=dhmL*r#3a?-<D2A+qTQ?s6cbup{P{tdVSUiAS; zuw-Ln<7uU)+HDS%J2fd2cdXh;m)lN}c6f7(8Qq<XfSFilQR1;AF?NRWL;PMqCFwmY z8jLtTh9vOq!mZ0YZCj2492TqFeOOTdEGzTB`TQ*9q)dYNrs^@vI_BP%>mcL|tTVF_ z4L0&%q5%5U>6lbVUV^Dy?_r_6;a<opUsU%Zz_j(2+ClBrR25=$Zh7UU)iXi$BN9~} z3&O#vG4S9CK6`tp_mEPTMMG)sw#H}<XO2J1=A`yBLk1HX6VzZG@zrv5z^9nG4fk)R z{u%C!s6!qBs(|Z&bB)RXSyK9Y)g&SRMR#W2Xm2b&<MC#r%Rdi<r>`vb-F##j$w=JN zhV(O;CF!W+VGmeK)Q!}&?9(I&`Ks8(u3Ut7IBw#5X)_sM6P8D!5YZF+{z3PbO7=&- z>OLYSqiS6!lOc##$W_K2sB26jU6}*7DdrrbGvTd?`Di{xUx+yw1NKm{47A60#@?ag z9S@osx4q|BZ|=e{cwmr|fKLI*b@7RC3L(yY+%G73!pwZvbxt2Eht82h7;vu<a?N}z zG#yUJ+3JaD9~mla<#i*YM=^aH2S5A{(Ip{ycMb|gUJuC$^9Lje^ZN~-QU44-w|3F` z`sxS>2?@>r18RuzIhIRGSM*<WL>katirOH0UXLa{U&ox$>O+IGSG<C#Rex!y&1vW% zU{16RY;@`{^2+8g8(L)U`=$*$oCX(P-uOg0jr&U;AYQ;%qn5L@Bej4V^wr5o#JPyr za~>YI4bg#WWO;9-taOo*!0=<Mt!Hy%pb@d5SO6^oPCl5M_Jk7Z)HA|8z-rdV%VgiK zN#9GuZ>E1vH#}|iS$VoOK;>Tv>Z}s!b#`MJTay5>Y^2VbXj7I*S%2GTW+4Q5ryYN4 zTT;Ga6`TYR@jCt;AcP&bpW-IXx=&JQIeM^4xLdoYdc++-i_IkdjPan60YN5-$rXcM z>7PWftc&lL+8xfRQj9_ihVs({fOha(9o3qHLE0TBh_rQI48tS%%twe7u^4K6L}k+q zFYgUu5gZ#RruIrvhJX^liYRN4^Z@D?h3ID0sp0(crj&^f{^syK`kcV=X|VAIV+&9- zDU!jwG)$l2V)>J=oqdWT=IuB2ZEK|A{&ar<Ssb?eB{U@4`y9RA)GxV?V9KBq;>r-a zWDD^RXa#!*4==h4m9cm^PrO^I0V{br0Z7hO&1{X-{S%%R;!i-El&hrj`X|@Fm{pwK z_u0_&VVr01XS!>nU8my6KWZWL@g34P9t9T>W^8N^xxXar5}T|h?f?m)Tfqn@i<d{Q z%)$r`l8;knvAg+A-S2&F<N6C7x=JHMBIFEOwUiJEvKMW{kaapu+}vF5n~C73wJ4}U zRAs4!<W@O`3kOqsC#DX@N#Uu!X`U5N(QN*!W}e@rlj(yb2y>R|M85^AC2R82FJSGa zCu>ODu_AVU!=vCoCV8EC-Nb15KB_EhU=>!0h*3jTPbw*AmOfJdRa1m6P&X=b;(v@X zLRU%sd%E2^Crsd;#@zh}!(wcKHbniGZ#IJRk2Yt)a{8k#>ec|^qqZb&4&$WP*lsH| z%Rh9yZCAq^7NU(UUBS@Lj-q`7O32XGrTA%P?+03MK*HKnj#U?0xiNvN3v}@BIg#R3 zqSNR9VO9(N5If!L*Rv)9r=-I`P93NCkIUYxe8%6@H*~^5`2MvsvE+WJif@IWLNj98 z6y}*&YOH%dJ9dU6p_z<j3-qCyHfwEqD|LcGC!J1kSO}kp&`LHMpV?ZxOdWYDhAlR} z)?JHZTAiD8m-<Qmq~p?|qiFQ>fwD0FtNztVRm2hes*uDa^2K~`?8{Iabhp<mWl<dJ zeE$08N)+qOpy5L-Q`B7t4*5?eNdy-)$WngOP7zF7D2fldi48>|-O>1Fp2uWq8aZs} zS{vqY5(jw%GoU{#EHXaj>-`Bu&|AW3?u5(JmbbvlE!NP<w5*V9DZoP$Rn*f3o3hpe zvg0np2xyHUF+Y<QlJ={iJIcpjd*h1bLETF-T2w4pUnWXck5vDx86lan1l<x)Qlb+x zA|YHJ4q!FC5k=T%`$0&t(dq2mrTjNz$`=A~)@FGmJbbc9WVdzrJ8|WxzvPF!jrR|h z5IwmA@q^jXf-XTPn1>zCGLU&&Rm}qRhjofzpeh2QVS+YJA$ecEwJtgw*3rQ=(zhZK zb7i06cK&z$1-zp0o#0O+G!x&5*T1wO9~~_80I5iES$>FDuI`<g`i~$(&Q|*HqG5}S zHpxn6H6hGjUC6I88Mg&uIdOEq_ikk71?9^NG3ZBS#aRUdJ4ID65sqb1K|;a5yA(Uw ze~fr*ErHCB!}8vs7Yp>>BbTS~L}3fXugQ+Iqkbhrj7J8R8GT}FDn~drt&dq@oKjPW zKcmu{dlir(L3b@hb?cx_G*f@^G&BTLU1ne*!Rx~rP0-6Bj)e%B4hk#^p)KK^)<A%- z*r4vH+u;-*x6W9sKwZ4F66dcngH6;HaaqVgj|i2gM)llB<l#=bC;se0tmkDXY`jc* zv2|2&sCuz=zf-xSimGrj+nf+vd=zLBG<LSRY1EN=T|T3aOEwus{9tbTr3qX0ulRoy zpkruOjE;UCl~>l<3UHz+((o3gP$PeW>=4EGi~n<K#t-`SyPwsxp^o!Vo2owSL;)B) z--ZmbANL|aNn93sr0WdV+MH&vk35W!Z>cB|FCeViZK7G%#VyRxBgf29ifp%l_3H8u zUvCwve_Vw5#*T}Vf)qCsCve#v)81^l4cwPsPH)7fed2#MDG4$E)WOz|B{De2VQ`Kb zhT<GSkjUpH2@L-SodZD32q4263FXvmu+(bNuIJ7bHDGK4DJ^nWGlz9AbQ4B$zP71X zm2!HM20;=uWMUuC$3xO;AJ!aP_`DH$6w|7LUM})guf483`2&{`f-=mYbFi@(#X0Ij zIprj0+G)!@Cqi$LW>Zz>*$VHuv;chx=LrUcyD_GY@do=}6}~^31~|~S;g}GCQd`Kq zbqeS|8bk)moE|)EDoc(a%>zB+9(C2qmon&+^UP*ngJiYZdkVu<L3)0bI_s37*19oN zmnXEBWTwl_W5m~a2WUc;7|38{vS3}f*i=-v40hD4FsU2u$s+=x=;(H+BaSSV#;3-t z`dOGKV<mJ`rhFbO5?9ER5L%~;1leg)hnDFI(-vuFt{|q2QQ^@2&p4zr+&-P)T^dnm z>pj_Qu-&9b@cBhULG?g9Jv?%eRZHt%7PjSr0nBqaoWFi;$>8h~u#QqPLTThj*N{A6 zVfaWc+QDI-n4HqEvOK7Qv$vTH%|xHaTN?f*Echv1H6C{&LRStl^D>glY}B0#PB1F~ zdgFtapFBl?^g)_pGMZTFdN-ixuN=I0L(DzgB1vdPccDzZfC2dO^74h*Fe0f0I`?Id z*HWaSVEt$uxBI$X3c4ifyc*XC<4(31S&4>ml5_FHZkEVk)py}W(NC<>6%#%>mzl7Z zKBws@JT1Oh7>omqC9ko|9OY?gm(~q-&0SSE#9FjHc#n#tszZD1Sh1_Ds7l=0s3sLJ z37{W7J@0_Nyw<#q*aZTXS~=e~-*zO7Ts~`@lMz8R2hh2#S)*PddP${_8NKN|Xrx#u zsCT~6K5gptyR<d%&5Net-iixun54?bu;dH0QLI^P!I)eQg(xO&%gzl+OcrMXeQPdL zee+k$N6`nxdtxURk@_<-?~PF?;Iy5IJf!4(sRhFn2z<+$?3BRW`6sCT)bQ$MNZN|U zAQ_=q(!IAEKLL?kU`+xT)yl;tPtu{`6}j=Ll@LibG5>)LOZ^3QhQCBSPJ}El^MC2l zGFeQV2z8tV4qGwigSAzQ?|-2x9&>%Om;F1YHRQCi#A-_|>9(9KOX^+<;0HY1mo-8# zJys;(1dc7rkydc!D$M_#Mx6f^KGK{hk;w+yHvWFf86gjD^QW~(er<(T-9O>fOamtH z*~C=W=-L`M6U*`@J<p@;^v8%c2%;G`2eyJjzq;s4PB|U~lGVD}8QfVTp;h@-nQ|<J zW28yCnW1BBCvf-`2o&0GwAJjUJS=%GAR{NpAcE!mh)Eu*sUn{T?yyDQovvg~d6NTs zZ*josd~a~w9>5lbk_WI!3!mwJWx|fsCY;z%cyP&^v;&__z<ieeO^!Xq$h}eGTtsl1 zK=?L5{^2ajzeOcQSWTwJ;vII1N<Y4cCIz<=(0`CfHd~HTd=QR@s%M#`MiY1-e`EFp z(pB4|T}u=vJ!(+MByu)ePNtS>H|U2RL1B;lDd1-+jF;GLG5FH@qkl<8(Uu(Liqo-? z{;(PK`#)h91wQ65Ov;c1V&$8$0jm5s-FJcDf9$Tz?4Lz!LOcLimysA)3%q0i96#1W zVNrP}pm2&0Ifv`Ou!T>xlpc9DUWz(yi=DPB8-qpcTFTBs?SMezHz3e`|1dfaG9M}c zy1L|=*3`><<;rR`yj0)zH(VfSqvCJ-%g{J~lP{u(k?W3b{H4}<viZE>g?F25D?*EF znJUkK@yMVL*LtFm|6{bs=Rb|@Sd!p>3n+C!$ITAB&YYZ_{S||-D`mUo+KgSgx%)IJ zJNjHLNmpvPhe|H4^6n9V-iWR>HHm7+8$u`8EkH^$p_TemJJy6n=L9Y!kQym38Y>$i z#8UfKjI`DKpBeV!m?xYIf3o5^3n{z+W;GcXmJ6=-uDG)4yN8HHPLt_xY%O|N>ga$Z zvxaE#tr-$fz5dinr`y|kKG^}{Ne}UZymf>LonJA_<0+Y?^{ekukXR#<oBZ=}SrUI# znRIRJqh>+IAzmZ#FJT5XP=-X0-avmn+MLDKfwZj4lFE$_t1{}riL3C?3nOm<qH4-9 zLLdG!W%A%V#4eX8@?@20U~jB!-Iyk(?)*6%UhJiOPW`c1l{rrg$)gAZLC~9{cpn!M z4J;r35yee>K}YkhrKTX8;UU#&7B-jt3K}3T1IM#=8GRau3G?o6ZXthl@9W#uAaq5& zD#+r@m%Xjl=cp}hQS}Y?m4>aq977PduYWUte9}h8l!`;^QESP4VYp}!Qh#^R))RI( zzG~2U@P<WlWWhAoKK=esOnh2GSfMSAWxt1cYzs&9XI@oz;c=d%YB3)|jx&~I*g{Dn zKZWgHlBr64d#l9+g|O?)g6`9aS(3>4Kc^N7S+bjWZ?RYfwWZ<TL*FZ59$LhM<L1n? z^~T{0vu9$J@<v4VOq~-T_nYo`V)WiKW7saJV|*2Ayg2qU4V>Vo>$B}aA>iZmmU-Nc zNO$n#t{Zk=$xC>c0vj^ty{dL;Qpwzgm3N^F-$8H(I+DGhHr)>F;vchW&3*T8C{H<i zp(d=Ht>zbJDW6S-=O|H-lFU%^u)>|_%agyu^MA6U#Br4W?en9*_TK#r!N-sRdU>g3 zNT4=K;}=qyvN7;ucB9;01<@-Lf|Bs@V#!BN$v$T5$V@J-0Bdcl+As6+)=-PN6Mt%Y zoW!KghP5j>^#XuNs~cGQolZusi%L8Zv-Bh#whQ7j*=!Q3S5g|V<j5*QBhXX@m~Pd$ z!M-*_@L5O0g4BdjCr7GF5|}XTRX!mILAeI1;sQ8VZZhjrye~AHrp7trpo+}I8$&^8 zL&yN)HLPkfVT62Zo1=kc7uMB1Wh0fb?mo2Ry}wEk4W~-gE^3-RCRoqx3_5gdV}btA zlyjUR0Nb!xUBot-^>$`!RW1v0)?S7e#-)t9L}UVPPU6Li?>5D95-hA;YRQdonz6!& z)@}+&3{lqbC7-|U_n2fg6B{yeGX0pG(D&htkoV}jeo53q@rP4zR6t3OkJ4EdQ&!_M zy4j2WT_$lilXo^OFof`ciO!{cg+Uw~e!wQJO2jWM0~65a5m2B+C5ip0{efpq@_y!g zBqPS>^k{{1j)El=d5F1XbtKRVYmJR*njZFHE78%M2|CXnM!2T1CHd~w{qIw#oPj}c z3!u^~N0%R7gM|mu$=olf3*cn!N02Zr4SB6OQl*}yqg-mswkl6#UaZr>Z~9(fY5m7> zD@-<nc3anQ7XmT?KojzlgKbKoC-2Zx=0k(*B;`1LfYYZ6bRlb>=s;*{dxV2P3vIwK zTu~g;^-rCH47*!Pw{bfhfk8sAn$ivsjFJt&!WLg@q8VMA3osvJ*YLIJWS{<VqRS8F zNnIjFOwC6?k^+5H;9ZC`9^fgb`>ZSk?kP$`V9AyC2}BuR%*2Ft7X7ZC13-<fsLRvM z25d@FXzHIlL6sql*F$V7T{X1bSE*<JsHyAe4M++5qY~?<*9zHs^45&y!q4zj8yOaX zYskp^fOTGWWD4<o=6q-WUU1ce=&G@VyP|h1q<m}|**s6(69R|w%)_@Qj{J__;ia6y zyS&Fa6I$2UBM)OSpj{270Rhjr!*D<LV@LbM$3s9u<oX7p0{@|pKUXjxwo*-3w3EM6 zoOQRhy2sJh%85aZ*#fl#%eAMPOc2^{-xZMp-p0EiV~AN-`0(j!X(1nleSM#*akSmg zo6IQ|e}rFd;77H}4Ap{x^HUtlplfu9yKUz*XGA~&K}XPOb5Ine1-KB;Qj>|v_IN;r zT^Mq0;Y=bDW*6FR5B-Dct3L{V!-X2_0BAqsr#)_#SIm4j<Q>gfAvNJs76*^xG=IlY zR!HK7uTRl#m8O#P**9<mL+c-e31W%-6RM&bfC^OEJ@W}n@LEFmDA{WD^XJmhW@X8` zZ&R5X&Rly2WQ9T4e!rnfW5c&zPD<ROI-ry`81uAt@vkMkPM2y#Q+3G=>%!eO@RY<> zMQ?2zWc8PDkiq5X=*A#UrBCoz3`sNHQd6S(i%^j5-sdjFF|_}1M;5H&D`GZfs=eB4 zfEgO+JMDO?zQz*OKy}e=zX}=<#@saLyf98|%sWu&Oqi;f>vE@5cOk;}zMqtO*kIa3 zIM}cSkY*YoEUFI2LKg<y%8mRo`g>?BMPQy0&kPRKD!?Xs=|}u{<Cj$+sJ0E!Fo7?L z*FC(O*NOI(gW_lHYmGlK6W4D2Q4|B1)Y(-y|Atr51Ot5uGSL|M2_9|CH!KSCP=bAb zc7TNN_B-rEMb@ob5$94rT^pXx49{h*KzN~s!fQY|vaNfV<?lN<_^!?iXBVc>o1Hx* zh1!;#SY0@60T&C2!G$6W+B8{>ipYB#uAon|+P}-K-m$Ncnc9%Q9(4Fwj0}%1SD>vF zZ&UQ8gw7lh3Ox@o)GNQ`_Y6TuL%OdCCMst-z3kG8!C*C80WL}<%q-&?@*=;EM+<m- zs)AfA!&1^Oa9Qsv{GBWbJxU~atqhnbBv8+lu_-hyakX#uOP7V~6)}5?z!OMDr@b6~ zk1#2AqWl-)E>ilyEfyh8Esbp)z%s?*iMDR;t^CdzFEG0o6+H<8tryD4^nKngIxiT1 zRUkQjcZmM0svwYtvD+Q7Wam1j>SsWjQ?*<6_e3BNw3LV>GK_!3Fh$<EKA7?)JybFh z5hA`)#NnkNRg;JJF*0W2^bmAmzn0%E0!g4p?pH7nu>7RhBY)9&1AiY4Ez?I(YijIc zXcp(4^TiOBOw_~LrDbKXkd4w%3e&4epk~7YV^Dyky~sn7_~DfaX2l&n5TYICzu<FA zCbK+_nO7F^rIv>G-Gx#K%v`zAs?+w2RS!VrOHqqF{y4OkCC&ma)Lu&1R$kLrMi+(T zL_j{&OK24Vm{o>sYA&kUHU?m=aqf#xBY)zO&`lRzBnnerCXN_<%mryQc1VX{2m+=; z?|y#SI$poSP?)U|z4QCzQq2Y2_m$%&nrTLLJDMxs0yfOYu%CImXBdG?M-gZr*o)Q5 zUj2N{16iOG7`5e#2^-?3EMvc#|2TTV>kupn7T34jGxXmEwqfLno31S|i9<j9afHn` z9BOV+WEOhK=zg(s;8ts&shh)RG7}xpA}>OT`x#jgyoZ)e{}5$-B4pnUoBYB1=E&z# zfN$206UXV_fLSsX5+3H<?oKdczexR7NOUwf)=aOBR`BPHNiVj5vS>H&$J6WS8SZn_ zecT(#?MPL(qM6~G$5zEP41vIqu$fSUcw;apW9@7a?N2*=qiG}p?iuFyP()@l@87Ob zfhtu&9l?x#62%(*k`TyT&d>+yfg}staZv`zu7QztwdYj^c<{A1)$s~X3<-)&ZIp^n z=-NCbCk(*ViZ_PQ<$)}Qr6Kzh>VK8X@ou!V4_wp&W^qgpbsR+JJ97mdQ%Q|)FO9u$ zJc))FWM*c<k$(?p^+fXBW8Hr~#R=QIeHFak#x}1+mz$M^+nWk5R8Jw&Q>uo4hnBVy z-0snln#^cX7<Ae>?#O3Ne1R%3s+yxh|DQn{tu`tnRNsk!V6*tj!Y`II@(UEaDXx(d z^_O6a<ahKX(XW<<g04r*tc_W0Mt@q&J)k8Dh=8%@wmNvT`4OL47}Wi(Jv=WfQX|Hr z=(hikVX%TI(&j^tynYVb*R<XTzy!H_q9JHgQNC@(dcJY#&;>%BR4K`bxPV$c#u%kS z&GuBY@qfNSqb{r#>{o{no%HR}rC}HlS13bwWL0$XOGn0k{p=?sHGVJHT9wUZk-1C9 z1Jx6e!)_HDKzPspRdl=oL87kBDf1m-{incPd$QjhMr84D@~td(YfHT&1t(KRjWUgt zMD(3Zw`{T0w$w)r@y*ca$?>}^Q8dtO{LQHRBRs(QA@EMpy>D1XbmF5_S<SZ~`obZf z3pFZ{S6=OM`cJP+NWC-PGzYK{4`KlNrZ-PYDa)?kaI1b!A#th7%!YMT`e%d+B>0CO z@?3BBNwOHx0#;)(|MO@BWDA&gjY*%tFQ;7<xB|-^Di+bh1s_udy|IQ)Q?m;RsoT2j z7A1#C8VyXEe4o(g6B%x$=+>Y7)7Jb(y<S`aJp`x_A72u~ndZe*8J~8iE&VUq3Il1z zTgTUM<QX1C=Jec6kC=AcQClWMgkW^&HfCu{^^r_4iSTPFN;)<lav=<V2o%D(=(F!` zpuFJ%;>sL8vZpvn@16%RP>k-4+cKnX(lEYdcY1EGVHe5Q#@Jo{MJo!r9ldwFfc)M_ z%~Th1As`GnMPsf|t$8w^+DV2-uMKxw{k3OwHZJ*z;Ot?&f!knD(kM|>tOz1+65^^? zCK~qYE(XKuT|C!p!Uj(luXv8W8~UjCY5>zx6T>#na~A~eI)cmtcUnp5aXddH;(4lh zFjiw&CGtFiBA_UY;&*6<CD`x-hJI#QOZW}=Lsa<JduUP`QEKm%+^jBHKFyNuG-G{$ zCS%f&Je}jx?`uRS7FcFC8605m6yDQN?{Juxf?dyWhB<2T`@OR3y#6^Kve8=}%ht}B zjtSyIS=M_(qj<`LAl5e;*DPz9Dy@)k4(Ym}-KU~}KbRvjra6B#2A>a5dBNABh2*jy zXhrSA{aEaKD<NdS=>~p47Np=Yp|>xK(;97ggsChwI=|DR(U#juwCgXAy)HY1LRu<* z>G%pU%_3}7#vnEK#5{I#xxP8@{R=}CUW1jk+`*ZsmL&W-HWDevFSy%GldzAY>^X&H zPbtNja6y%d^VjSyDtHxW#E{lRf~GpN7p#Il4}(y@dn9p$F2lIiIEujV-#erGF2`(- zSbH1p7l}{jjRaBv#ch*m*^JMQm78f(MbllXe{mEVUyS}o3oxht!D)uXoQOqZF=Duo z+ZGl1J)+lidbK#kq+XZKBGmZiAv_%4=hy16V^^xiZ)ibuA9ysb=m?NV18Y<APP~ty z!*RmAiz%>sR$~rCt$B#}Y)s{#+iGlSZL{xdmy(7IV-B8!IY+4pd=eZWHsz>t+Uj{n zwq6!h!lCc8+p$j3Qh)LFMbh!cI(#4$$5te$Gf8H_Eh7)Jhpv<mkv(793xRF^b%mp{ zP|_;o8Np^aP<mgF9Hc^Sq~zY?01^DhAGj4F5%N!T5f7%=6{WS52QeuXuna*pu#UI` zN!>Q|YjG^=r3DkZF`3Ejy7qEbW{OVRZ7$1&r1MBTHUC;6eMiWFNHfIE*_c?`1A!YM zjrI1Bf_mrb2PgGfRy(F$b{*Iq+ih-e$3ZB3l`ez>m>{~XsC36Qs{ibf|D*3<^Uvhu zBn-a_oX7$J@8NBv0$QZ&HoHPC-t!Uf(Se5VZ@PH4?LTK{Q$noaokP7Dde0LW1;-0h z(Y=rFzOrIqRM(1x@RPhjTSa-WpK_kvw%UBW1v&mFrHeTJ!03zZqHOX10eC=%zsVE0 zE8_+zjrp5<0ebb|MtJ~_*381stk_xwD*>HMR0nPh_Apdj481N?QAvx(GE@MNK~a%R zOXPYO=~WlG0ZFY}Bm&S)>#vxfEI7CuOYHK?#jg?(*oL+i+KGKAwP)W9-=GWpa46^# zUAloMn!lNy##l|FR6|2iGJ;43qqOxYjZRVwMJVU`afL7(v%31~tHt>7<HgFAE1kLn zLwtWqTCF(nhXB?|rKxHqPtyc$!zgI^9iosB(L8zjPyp(Dh#x}QqPGGEPC<}38A!%8 z9+(aQMTU6VZV260(_ffZX2tikm=()-^dX-ZJ;rbB^|i}HfJ{vJJ|-b5DrUv9Om50h zdO|}qYXQ)n78zE@^x5s@SnP1`M0+9HD5)Q2xs2VSLdGt!8%Iaw!sKJOKMVR7e%<JO zp<&FYKGEw;)1dX%!G5uNjg^)zOP;}Sqf(g+jZ>^Zy$-WvA|drb5^mgTE4O*jM5rx1 zJVEE<k3W{VoGZ)f2-5w7N~Kab+$tTFrS!-kH#@T=S~Sz|yN1{(K<j>PAeVbF-KBhj z+Z%xE-O(w%8-dy`uxq3V%H^fpURmvjK?2h-0KP{}iV4?VEyPRDn|+uH_9jiRhrR|* zaod5@Z=3pI!Xr}}C#19Ps6hETqRN+w#Gsm(4a6&3z!93qttSe|IA|-Rj1Gq6rkVh3 z%ReBV+POn)&95x0EdzP0B2XTF(YO)jiVI9qcI<+atA0ee1nM*f@ik%ui(&D6Lb<s) zSV@f<H4-#^Fn}^MkG`UAiAP@%s0ikna8eg_3YZW#E(gM+NJ9xr0%?7yNJa9UlXYbu zn}k794jfKB=zxaah!V~!Cpzh&mZ*UY<0!kPs$f=^L9+6?nmp&A$QZs$<U?>L&<pTS zlY_IAJMZy}$A_Bf@OKfgnSB>U04+>g_y{d?m=#YCP9(G9YjY}j6J~_+!)6>$LYCIy z6z3n^k)txJ`dzZbj*UL?^*Eo9juDprDa82~`o;7a3bSHa@p{*^yqx9b<r&7MEHW5W zu59yCOkBaFs3=w6iON$N{Yl`5vlJhY3bay}%!+-ED~g&~sT7JYOh5G8;={d(98erU zq#<Sfjq3-%=FX#}h3<vaKOLnz%!>OZ@4+bSm08gn?eN_;v#M1SjUO4DS@A92dDrzW z?mO3`@HbFSq$OO1R&ic!0;Pe|gGdDOdAwIjBWv-&%55V{F=X)mJAByI=)o!|NiCad zN>8vj5ZPdO-%m0t|6@Lqe{b4@88PgjWU}!9kN>hxc_|M~ChW0-mPTd#gb5SOXFLjv zc~n=&e8P`}R_1iZN8pHG5{#_2)dhG_H!u%?bj5`X4T+@yy;pE&0IyWaTfZ+VA+cKk zuYoe61D1g(>cVg*p>RG*8wKnSM2E28boA5nFhHS6p5S*dD>`(v#ylP)FzN%J2=JO> z7j^f2e({afJrTJP*vozxWguM{)-b$BHRD|}u?z1QD1+*7u9HOI$``k>&~^yC%Jzk% zR7tand+u^RVv4|X=3qLw)J#O<RU3Fp3zgOJzz(#9$5{dBppRY}f<gQC?ZxEDlO2US zZJ#&|<U6Ur(Q_7<7T=H7>71VMgW;(%+`dECH<F<>LVu>|f`;T!fc?1>7zGzt=ypfa zowfPJVffn@`!oj#pATY;cW(wE8rvH2!+?W<7-}t`Ck<M!(;=f*pot2Z71=3(yUV`7 z=~XA4Xx<0@<x1g&7h|mnW4{GY;yOj%M0@qhQ==_6p7cGDnInw}dEoogL8N2@zfDyE zZ`IfBG<YntW?Zx*`RsFdLp~qv6Fs`S;|!^VhaAKU?VOG@bLLDaE>(``E}RUjOP4NA zBn=tAgtAwKhWJSO2S}>48F~Wcz6e#y8mkvFkGfY*EklPBO9A?o;*n>Uf^qQoQDLwD z2<RQ(ficcrk>i_%M^6J!SCfPZ*TA#8kZ&%o%-hXQ%f3z(!9$n=M$=C@4IBw(#Q_gM zZ`|*{>k}Q0H}8Y}z2Rm*PA0dXtVHNR`!0q+Ix?(51>PfYdQ%`loDp0ddkS_W)(^qb zxCHyq{XQ`sx~gtno$`mj3yDMl-ZknQAjzouBPDIrK`KElLr*H*Uw!q}kVVksfm?m( z*w2P<Fs#XGu8gEd&6~@FUj^cB{KEr29+_WXlS2WTn$Q~rQ9T5NwdG=!{D7ZQ(k;NR zF@)~}6PtnX%fQ=#Hz`Qf_7A`{z(<jf%5?|iX+fL;L<1BWc<h_i{cG34Uf7=Cf;}J( zHt~z^Cl)O1i!Wi>!3n4Xk2=BFLcZ9tB`p_61rpk67fl16EuXXs11yt`dZ<ABVWLkQ zPQe^7`3IcI(AE5<;M`MegVJ4khPeLw;^L)?Af;H&$_%S-uUi?6(j)v)ET`$OefI3x zqCtZOVKcRC*%I59{xH+<L*VEg3`Ro&`vV=3f)({u<WbahX)}gk)N<lDjduISa-JnB zL|<mG95-B1M{~YpsQRf><swidm)61ZbIZ}!&YX_Sid*EazsWCV&2}=-w5M|?^V^s^ z&tzg!U4m5K15b5Q#};xJLu~mIo$GlNc!R4@>3hi)nZTQ&kgVu&AOPmi@!3Zb@loSu ze!;y^ghw9qiM#KFl6_T{=-L?_i;8XuH)4d0#R^>J54@63-UCB>tJ7k8j$t4gm`uGN zHENVN=bUq#C^FFcT4Hht5=V$q>o|PCG_IuiODZH$uHG&|A6*8W<KGCY4idw?3U!uT zP@-zVs}X2md2d2h0P_V2H6T)a4!c8cy`ck5PWcpLP?;?7$^woB&I^1H?LB9+=>#94 zF&G9EXbA~{L{An#S992|gQ9&~98HI+Hf}U4;-06jT^xSCc?&d!Kbp^${{^At>I`x0 z30Op2p)jknkttA|kGI`y0*(2sPD6XEfB*egbno6hWXVS!d8C*$X_8pAYL%IWhM<v7 zI0;!=iXYIVgsYkErT-K+B20B;R@8NJ#{%0)bw#{J%weiC9&u5Go=@4gXhX+uf=6so zY0lL~F78OIi*)?0xys9x^(JUvEYcwLnXh3ANJeSFF-HsW?RaM(KMpLYb4Q=C==9HO znJVb@1;maB`XtIo=ZlOoV-k`>W)Y7SD3?c@$7|12pip;2?q%ByBXjN|zvVWHH0Tp8 z&>v?z<iR4Hs8QFC{d{KLQf0Bgw!;h?f9cqa9ypT)JjI18G#1b&)~&bR>XxMBLtMv< z86*1i>Ep!E2URp1pPihk3vt`f+jvg`w*k?odb$C1Iq##5;8_MxQBJ+ne+de1DH7)n z2ybUK`3EjYnVX%bOu=Re>t_U6<^%CHB?iEr(*~{%+LCxyt7tDmOZNLPr6N*kD2*eP z$`0n6jOqMyok*T_sE!&uy!DRT6b7a;E81HnlUcD@JVstQw350k`nx*fh$9NPNoI2T zc5mAjVxt6lT}XGJSw*@79obz@TTctPV3UefY*}A2uQZgt7vG6{|D&P)2xk<^CUx$F zh34mAObzlV%!;G`&3v9HNEe3n8eXVQ(3gtEc#$?puYgg#1qMY|z4Yls<g)CO5Rn}B zA4Zj1_nVA}CuFJaTtE2G-J-khz$&m~8*D!81pUBSNtCSACh(w7TAw?7Q!HM*SPU98 zNStxT8P4_`E00T$MW=h|4m+gSf`+PYmD8==v<m08D+yDe*DA_D`$K*gl&lof9(eQJ zNwXd5Y`p*vg9$MEc>wvo_mbCZnsi`TXP~iHhHP-nDAjB<hI|s@4?PnE18zFz%9}DO zF5K#nfnE|Nd@|ac9?JVZ{oz7puDrvQD{$0Xr4qP3iD%}qZp=m`&{G4Yt@F=6-<S?E zzF)t7^0BKUI+1A>QU$CifA*BW39Z8=tU|+;{v@N*{z@NZ++&I@HtOk0*b%l1gY(+9 zZA2MvIinYnvE#zO&Bvd@4CoP8n$K|ekSituH|fwVCgMF{!4?2iCUUC9(@MMoJuuMY zp_kbY2Xo6^O4IWB;>7Bva<O4UpLp?Qn45rCty^a*;aeT;6MYBx1$Up@z)@D68rTm~ z5TJE585U1w-hzf&wpRH#>x||MTqPVaVg&qVA2i%48!h6#$#}O4CHvK=#FoaZTz#X$ zI9;I>egm4aNEHJmlcKWsax4}O-rbXjMS~2NXAaQ1eLFE9o<hs??Cz`5=WKjR_?G_u z8z*dhEX2%Tq0eva6O}8ue-s{y%E4Um#PAzZoZ?QEm^*K>USjGBR?2upc5^+T)X)b~ zgol%5UHLf8qvRA0_>r#yW8$hAS5Yjn{sb_qpL${nX~9+3`o-&S%DV!7e9})L%&9Kz zWCD#uomViA<9aHI_H1fhv4*+jgBJRP(=b?_nWCw-S!48nsb+W(Iv*(+a>IC{SBax< zRqz~ClT1b*nRy@|+t0vl9e^{C{L{OMO^-k7tAc}yZJyAxw_kkum6MJkNMD94CGP&< z*}V_ki#>#`{en7Q3pV3=5^$l6NaWRSTp|ngP*ydh84Gl@!j$zW@vx&tvxg15M@$E^ zQhZ4xCOCvy$(w%GPSLii?0Hz2gcv+=QjlV3#ZG@*=?Iii$h@ex3p~k&c36otXidiZ ze}Dmp2VD@jbtGDAY%^zS|Ef$jUUx!?ZaLiv{f@rCL0}QC0l*FX7Y{NQlemF782pM& zJ&zA9pqsLj(zrU{*!lDD@IyO6f&-LiQVmqB3<Wl@D?S>cKmG7TVxQ7$Co|IB?lMSA zoI+sm2nCI^%ZsH4x0#QvZy{LPGruh@o@uvNoPRieTmWrO3NS2MfJZu_J6PeVisQBm zxi^ew!%@*ri)ro_=!t<K-GR1666DSSd7rLVx{Q`mA$3`W37nQL!Ee4iPn2A9Q0!S1 z{KMc*jw>$n37+s23219I`eUE?WV8?uKZ=82=DTwQFspm<G-=F=HK&qcU4{BC1GZ+x zHk?-c07U=riYhA7X<;11BHb=0AV5ZSN4eJG<(-bKDyq9AVONfS_xePJ#V}7fEx^4i z4ew}H5X-g(S1l>Lp}s2Jbyk7okgjeRpRB`Q1M7_UUOoM1V~QCTJ$X=af_IK=xT-nG zDXIm*lp|z57Y_7^>#l(#+~*)M;6N981bzJ#pQu+?<_vy4yD!$4`uYqvF*9c3bNtry z|E8pV0pUlK`=kUD&9J(nmGyvp{TjeJzy{XUJ;dku@<rbg8E`Zgo>|ew>>Io6O_wMu zEVM3G6~bCG(Wew-RlxO|e{|9x7XEdgm|IMIHS~bn7c~z|paEmL8(lhYSu{hO4$^K; z0wqK08daCk@>x1vIhd6Iatcm<MbnH#TfXl^nUI<c{VVm9&`0?oP5G5+KiF1K;FPUX zNBCpB$VY{`4Lmf3uDn;Qgz$}X0_XjPcklr8Uh>!9(8A1cC8m1kMpsOdZo+@T-YdNw zNpAo`*z^EgVe1X=ar8zI38>RRUnl^aJ+Oli_!by!2<Mk-Y%{BA``5$WllfDY%PA(d zM_@X0S7wO0BbCbNCy2`VctEjh30Vv~c%puZkd>tA11_yk#%~;KgD<By>8iv|201wm z-hxiO9#=|B9IVNp=r1b(lwN8-f%06mI1(gl1xcZ{PtdOL>MQNXuE6o_dA6q+#c5t& ztnzW{7YSZ^1wsHeJuC1#!o8IHqy`i5nY@h_UJ|jDJT{0^DsHpk9w@J{%|#seazT^H zNQ@Of{Foepd48VdD|<U!uuE8YV2ccj3gt=&tmlLW`j4_0pJ01=Bvml`n*C^#<0;ZC zGZ%5py9=F*9gK{Mi2t5|7X2Kpxv7@A9PS;XbjMArkxvCO_k7V;5%pC(%8PE1(;2Am z;qPXh5-giq3~Ivt_!$h~F=IuIVX^zMf2hEI!9KAG?@XtRl$dzsCT5}x2V_%=2o~l> zWP15L;dr0nPrc(wW-1;xcl5DlVU&d49fm#;0Q3;r><A$qc-TxwgHIZM^3?KBK+mC% zJ??t?7w%4X#U%MAUWUcyUt+g0Q*07dGWUTYl@c{GD;OsMQ>x*|7t01r7R=41bI}V* zf{^r}sjkq;^X>S|f}NH`#oNUPx5{X-t^r2zfPK~WLm5zZr5ntK3?Nm&1qC8UR_Z2{ z?Gc&feIl<qXvp37v`?!BRCOn8BTwCxBQae&t8_}$J9w$*4@ga1URO5NG8@mbyZu(5 zu>t*mgUye~<psk_+3Aqx{)oe3)UD*%0gW4Be{*%Z<;KSQi+!+%!gy9Ecu}0@N%-_L zo?-*1vO%^x-hVF^lovUY77ag-Z-<3?Ds}?kf{Xm(y$@WGi*ZNEYJ)2_$v5#ZtPW@! zr-CL_&s-wzE!#xiChXcCOp4|X;aaLlAp86r&P@1m-&z?I`x`k-&5l$9WL6yc06s`5 z{$R&&sp&n2<#I8dh2~*^C6tB$#EvIn=S~P`PP1jSea)kkxee`8x7Uy!91JLN5~-i# z77M~0TnmF?aSF2nFG7P>PUTH<nr-5gZyqdJ*XAj2Za%7C4?KDa7Cpd+Xa8o#8Gpms zl_|**93;m<hZ7|{m&<`B0l+C7jWWrYNRuXw&7<DCoPw^2K2o!uAFi??kU=5~bvg~3 zLC1Pza7+J$$8QL+k3HcRLmmm<|0!wxxy&zqpJTqj)z|sOUrU{|Uyp}1%pHD%u_>=O z3t`lf`s2yi?PG=e?TqCz{xO&pPh#Qe%gQEQJ54-+NUc=%8?MQPf*$bE?mzMEfJ*>; zIPcHj1|Ly4pe>gL=lAoAy_lA4_}Bc=;myT>2K6E2)Pk@G9ela6__Z*${P>gkjD~b{ zV8&~M`lbsG`V5kc>DYFD`(xxr(w^PTeDd$WL4NW6hvwap%^?e7=DY^{cJpS_+E}Ku zuVipE=^)Been=<AQ&~+3Em59N?MlN0DBaO(D?i?G`$G9_D!{B*A|(R)8f((n)W6WR zk6|^<_aGBg%^kutAwiD{?z#w9Fc~zON$_QeJhVNNtIgPSVDusGnBe<Vtbo~l6|;X- zs%ZK`r=IDhSN!%S`<GwviGF>|vI75Z+(f_rW-M3fXn{_5NTGmA_B-x28}`Yk0t_ou zN*wb28ho;!Y+9=Sy~5N{-E*hU@Lcl2M+NdhW`n=^LIR9wF+pwQI@QiOuw)(a5*Wqv z=&-!fm@bvT)1NJvdtkF+cQs@i2LTiOt?`|NV|vu1aH?X#MHl+Sr=xtvC`Lu5grSd{ zao>FDGfoNN6h;D<h55sCB)j4=VfeY0%u1#Scip<pdCJcA>olKOyV582?KJCTxffjs z6(B}i9!wb&@ESHubQrK5m&^by?JY^eM?GE`;72)gs!z0Q>m+(>nDx~oiVWL^fT^P$ zpDqE~0$Ko{YWsI>@rfOqeS#l6nHCw=srb!S{pAz0XZXZ~uYAUFSoCZ#_*RT59b|6o z5}xSLz=<_Ohc$%D_XcJda;jk$6_`f7zZq+G99RkT-!^Ho84mWBN_w_e!ss#3I2`2{ z0nCaodMB{Zm=)U>E5qu~%m&oSJZN}7P%UX`NJp#dQ~`Bc7Gt4Q)oa67SX_ZD3@BC% z4<fnz<=!d_sJJ}kWb=lHPOMvJhRJ+Fjeat3JXgh0zkTQh%k!Zhu~XkM7-ze^<rCk* zf!YI#VwBSeivI<Gc1&`LSm0rDBmAiPux37kxvDkYejB9L)i6T*$R}tMM7tgdpO2Lx z=uz4`VT?Y?O&SIjhK1h=vQ%_%a%YDIKm8m&ugcuM9v_;yu@p*QUAs8tjd(A7`a5sO zPPOCAeC+dEwm5ka`T^Jm=vKKSBGnKp!|Gu-v^hRy#bC{j4_N)N<C78KTPR0bZO+GN zZ^8aPm<on-RYDJvN~gQ;Zl?orbd(?uO_le7SN_0nyagk?H-&ia1uWEE?-$Kl`bFCg zesNYGzcJEM@kzUwdGp|!Yq;qveyg)C5Ll$Ad+hx(PMx0mqp#o+_SX(0_EcCriO$Ej zO5K$OP3rp%=87HvHe^A{C4-f4%~j@fiTAXamOBf2oZ<Wi;xBN&bOs)&W`XLVR>noT z_U-MYpw20rF0*G3hb}+=;^Yez>VLMAUeY#LT5k3~`Z#|sH#c*tsQ`!T%YmJNzbo;D z7DN|{3EJAZ=uJWS;O%&?ey6F7<y0cxGyKkmj`SZ$t#V5TnH0U1S{@nfcBujCAGn3Z z0_v5hJ9&2`BmwBBHf{Eca^;|off^Q)j=yzVe?IgGzJtid9~R7pJ;LY}ocmvSjl$t% zp#fJaPw%<kovu_BD4cUyj2Zva&wg>i`9`q;xkKO5D6oAypRvMo_BnodYCu}jf(*GQ z=#UCH7Gfw@D*;odniclz;}bJxn(sCK8zBbWk|7$EL%RUf(@_fe{0lSf@DYAUw?0F{ z<#fi-*>E9*dOEKs5}QS(<}cf2`S9YAS5h*MrgARI)UJgiA=jA9ihK9?TLuG4__9B) z`o}chRHxN}dCuvNC48_O>SI|xR|ILwKv=MlgDdt3V){p2DIky+j6&RHK<IeV2Lc=E zrDd&=$P|5Ps=)0OG(8ApTKK3V!e^i)UBVDLVRVkiw-o(e-w*CWlK?a+;-L#<lJD%^ zkCiN2EEx9{zVENx%*1FL{(#Z=e*0ZcJY{TRuDdt7>wNQVFij{skA;ZdtuvgNc7xg3 zG2ZIp3einBz$MtzR(dMrJA*T%!eShL*eihfZpHg>ipvEF>fLU;!)y!aCo*Z9hM!5o zKrrUdzcAnbyNNQ^d|!Kt#MRMsWLOIiLM9T8*lIYta{-yLgaaHr!a#!tCPQJ8MT<i- zEIy~i`t5fNnb&X(i)q+zez69RQJ?rl4p!7hk8xH7nI-_f#{CfB&jImiaU08&u({oG zxq8DrYk?h#XWK;rdKQqt4~yF|;sq}6*N;#)O%|TnnTstBHnWPO+C9j-4EPIhlF0V` z1m-Z`E{`jil=O(*KqsCHNU8L2w2{W0WUfKr01Q*7{@@q)K^lW(C#ux+8`j8AJ%g=d ztK1AOF#FIUK1Z)b#yo~iObryP=X5DD9Il$uW=KMy7gtV+xOzsQRLf1agr@L8W<%g$ zXg?_Az$~orSimy?RFLn)xJc9f8r7Ygt5-YWV4)7}9lFe%6}}%ZzpCG)ofV~fX~LkC zzY*aVfDM6|XQU^yLc0oxfsBg;`0^}J?4QK7r7@&}>1+oPY0*v(43QwvBA5(}A9XT; z)1=pT9e`FIT*Czv^;QD;bz|Zt*cpkNfc!zX1F4GK0fcC1;96YqnJGY*9wjr*!}RWb zBbM8bA|0Z^P2JShU<0dh#5|Ys1GcL0$ZuLB)6u^Q{1`Zm<<hwdx7_3t^y_5+t@U}5 zN}|n8)C#Te`YQb0(SE>`pZxF#?i28}WS?KhO|$ph<$QEZ*X3mAz|BX8_{GTgOj{&A zGl1@L$av%N?=Q<r<aKL)O<CNDC%E5<wssOYB?|{-%Q{cD)9T&SGB}Y+h%0&$)~u1C zg4dDgeVk&4TOCBMAAuhNUn^Kbdd6fWtXb3<MXM{JgrT14=VjkrJPoGl!f;Fj_xV-H zY6Ob>1^7lhMZ5BD&#z|Rhg0~=MBD;IRDp{YTzUNySJH?dY!H|;7c;ENeq#^W8K;}p z;#BTmc{yB!eSo2oZ$|hCT<t++E@s9i{x8)7<H`FSBhdc+e1>Zh#&LQ=CMykU8F$qc zKAaG2z8|-h5D7WhmUMtpH%K6Oq7J3gbOG9k?e^D|&FOTK44Ky~MRJw~!|oK$9SvqB z&=evZsFE9vk=L#>={yI9pUal}#o{Gcgjs6pT|<<El;TU^>%i3^(xh#4z*pj_ozDDX zPw<b(Qz=Zu&aE=6GVW2zb2*U`(unfM{drK{vKy(r{$AWa5-EEO&mD#p>y{)QA4Mck z;-c?u2dD_O$8fGJQOqaO*&3C$)OGYe%O|Em;hhJ*XGm_eljA|J$pmi0qT~%plPjlG z=+dr=Q>J-;m=zDl5J5X33Gb>K&SfO72YANbMldSE3eezqGnf{CxtqWOZaC(?J{44n zH(=#WP3Adl=mdW@ZMDeY$k_f_4NXivPv78dRP;G;I1sstE}%z54L{g9IF;cP%Zt|q zJChQiM8-|9Jl?4WeuZcyG^HpzNLR3Qm(23`;ry^a7bfp~Pi4$ArhHc*?jt*2Vgn9W zNW?T|J~@sBC46(>%H$ZlTW>IhUWjcEY$P9ZG^bQ$N>=F1>MzWl2t3I**}mwh;NNO~ zNVL?a!#KJnkqnDU-<xlQ5#_h$_~~p(001BWNkl<ZIgnhvvLOd~Y3R$tLU-f0lzL9p z&d*L<hymr0lVGcZB^<?xpgo^g;6c7*PTx<WH0l@g7eLSkeXNx{S24y)uq(!O^AGMo zVMCJo)%BzZ->BW$>uZn@Gl3Yx0h1v9^CXv8fx53m0l$$UkVM?mr@(jo8maCELLNyH zWQc0^J~|#45iihdfrNZx`U+#O@)N|hTgO<@wQwC|VPl!pxGGtVd+wP`wy6V|js;{` z1Uilz`jpAU=t1C-$8ZGR1LnP%0)M$sa|!x`T+yUHP`bWWj{vhX6k>oT4Hl@zpE6Fh z+aqJ4wK?6m@IVLZ9Jhd>Q!lw?tMKE9NrFMN4@W`y`Jvw-pe!)-mAci{z{S8nft*l7 zQIH&;>L|BRA@F1N+L+-;XfiBLx2Ri?o)f&5kc@P+sd6(bwU!aMxgWSfjZ8|on6H}c zQ=QJ;;stfuyx$Mw3j<V%aSdX?0t{@5>zP3QJ}`_hoGId>0KK=?!B6jHVMNL1IjBs7 zX)i>efoqc^ajf}#Oi}TzyO<SuI;HDC52=)p*+a>6i95l-lBG64@t%Q>^Auz0GjUi0 z?W3s2!u0$AS<lj?#>#^sXHhyjyeaYo2UiEdRL^xEkcCVMY)?S$vYFD7fHeQ<+gKUa ztDwr&z!rwB<EI!hZgFNog+j5Hcg@D(3(5kz(TdghOR@MZ;4~v96@T)DLk#8Pjj3vy zU`V$yW&z(><?Ibn9y>J=r(Rd64JoV&LMOo5zbj5l>56G&j`8fn-O!O?c`DJ~F<E$7 z=bO9rULi)l?-yk%_{4f1*5U)VQomjLM&oHSp-fRKgD*?34V)IL2bdZ!QV4%&>lXkt zE*?A1h&1UN@H~cFG9pS!zX7KMX94k}9opdZtmx?gt%Uf-&USriQT?BTV*LViNUrSQ zzu^O`F?b>moupxBGGO|F#bVT+65@cro>Ke<gf9e=S*0GzXKaI60>)eb=ptZH88cA7 z$7wDh+qVr2r-FGC)8FRM<jug?4-Ns~6zm3vx5iXruuNZpmvS?7Bw&{qTHbUq94hSx z7!2h}Iy_+G3edB#fm3QqsRZnC1_Q>AB*Oj3{2IX0jHw%?VJt@&<}=V(iGP7xfky#Z z&c{HiE5MyK1X3VY35(@S0CG&}$(zHz*(H{92CV|WGp=w=JplIw7<eLCvQt+>9Sd!c zsL1CkB7Z`P-yCIWBEa(sInpjd+TRZR3+aPXAQh(KrZ<osp>W`UVm9H$tRY-0)x#Kk zVqLhT9-b|Lr`C_KDf&_)Ej=O7>u03j#Y4faB!MOxu7}DE-QPr-G9QCJAQ=`n)YFKR zMz@6thOLy<fR@?6W267Exa$gRt~6^c!qg{m@FauMkN^tA`^&$8HW&=60JBmXN98Fk z*%za;^})2Bj7S3QS?IglII&rsD<DCzQF;tUH<o8YRT;3Z58(P>KwRo?_gm90)=Zbj z@ql`CRK9<C)J45qAsf>|5ZHoW4_pSve^p_mYW!}-??Us5M7kobqpH_nU|TQi4V-v{ zwJ!tu;jj5&*L0<`9tT`#>`DeDt=;Ly`lcjEg#p!izAfp)yxIUt^MxbPTMalAE^&TM z;(HKjh9ngCEzxfij=B~L=K91dFZv9FM)};3l3v**#QPZ4DJ0V``a_VEhhb_?U5yuT zn3bCPbKIczG+<U>QIHBvx^g&(BtfWe5iG2(5ax;>f+YzXr!p&<a6{giaJ9Tt-U=QB zkw~Ca$t_7HlmN4O62S*7gnqyRuLtJ#z#u1qhP3Hq;*f1KEZIVRO(F&2Wms(5E3$pu z+)7_YJcN|H!g*o`j}PL3jamG7B~0BfvK|GaV#f<O%;C;E?-b+4jT7_d&lfXi&J+(m z7(`(5K^Nc?lTqCDz#72bK+gNq0UFtjh*zP_6;FDUaDdbB*x_Y5gty?Ztcwuhgxj=* zn}KP2BEik5G552fk{zONdN0rjoku+rl0NGT6X0XthUK{q1GXb|AXyafAd^R|dM;9Q z2i9WBZy*#O)xsy}AyGo-jy^#jM>K+?buJ;FQ$cRU!A#Luvc{!dyLRHk4?h%*8#jjE zq^fX7TuXH9*ir1-wM$H&KAkez97rr!=@NG${4Q`N5F%R|L1|wvENqh==7w;^M^x0U zq}NdD>IkKL8}QzP&6^niey!Mitj*&uQ5V?CD2=~E+Z-d9kUx`9pi>=H2UIMV0zPDw zpC|g_s5h^`skJ=8h&oNUy)HCeRwaBkJerKK(@%yq8d!KbQ?}y}0q-3qJVE#&8AJ5? z_0T?^;TPv#B=YDGOoHL&Vv0{ZJyaQ;sGo5<wP@3(jZE&kE?c$?4)C}pj%nXsztvM* zNz&&g%h$|qj3Ut3anS_0e@;S~j4xy`rt8ZUvS8*=&Xu=e)+qZvic_`iJkbZJoHijV z$`71U7QI|Z7!O^RVr?#?Q*xy#hTJw~R(L~7>eZFR>>@dkbUz^Ca-jW%ee{7plioHf zRP!IGT+4s3N^O5`qh@|ToraYxW!r(f%6Z|17vPO^o*lOpyJT;?@kTLr>{uB$1%W^1 zO<G>J<(IeH70vmJb|xzzw=Bu{^?CQnU`*F*w^CHg1k<8@mWlr>^9$nE8RgL!QZ-PG zsgj79DAAda>02X%p0AfdK$C~z@@-y)a7`16!hquy=4tl*PKD8oL#<8>TM2^^C}|1s zDc}jR)NNaZ{mX80gl0#w%QP&5zrnQdOy)W2sH4Pe>{V#hs+H*8y}Ot;ZJJS3@#4kT z?%TJohb%X3uRd{vZ5S#2g~ifX==p3Y=9_`TIU&2o3D<57TwdP;UEp%Gw}w&jYH$Jf z3SaCM@?cp9<PE2UCgdAaM0w}^%Hzvk1EZp3&QiIO{5@zz35-+PM6Py*YZa&Z+_UO1 z`InKrdAKb4S^N}8B*S8BxMFxB@H!wF5W~Thl0GbVSIeA%mBWjWW+m`PAkzy<T8$bt zvY8d*z^tyqCB5`jY*;~XriAod5G$yMc<lGT6KgRM^A-1Pwzm;+<9H%~e$J?)G=YV# zk~j7hb9_4-O@NGv#<(N)nEu0<mn+Pi9uhxBd~Kwm$pjVu{0S(HS!YffW+pAOu~d@) z^)2_%KE2ai@y0q6YIzCBzONxk6o})C3fm(7a73;SH3Uj2t0KZC;4DZmD|RIbuOnbE ztO*k)<c}Ub+L6M{9p~o82bnrOucu(tHyJdQ#Ia5ZX=^4o`}*KO&~NOxPtF^c^kvx$ z3*UP}U~QgS%v#*IBGiX5g}IIAzOvX013FR9r!rbHO1e~551kFH<O}2@<LiL#8P4Z_ zV7|b6wu25Q9ecrRkz@(*#lWQcJ~0$X7Q>RQgUl=z$(sn*_woEKVDa_q*Q?BG1>z`O z6$LoeZX|u(#{!&UsCH3)$802);v(kR<Nw!A<DSOZ(NPCBxFofIl>Cl_oG0oi@v#NZ zf_)Z|ZgY6}1wE5Gl3n;RY0pKZ75zZWROw7I7U+)pxsvPH%W*}N{on%N_E?J4c|ubl z*$gXm&B33{Ms$aOM-K+vr}M4Du((ez7WfQP8V7zu@P6ku38B4yh#Lt8xmnpPR%KX| z?3(=0_3icVz_bmbQk=m3szd@kwT=W0d6;XKZy~NrjrbhjMob4QVcS<j=)YhoXaSkl zGnm$0jcI1A`nxN@@SX!Nri*J6dg3w_*d4e6s3AcVh;dj+Q0)banH~_u4n8~}E?sY1 zpkb}-#<h~OU^^yqfIjglEjaLi6D&d@ZrFBUp%WCG9y${DxV?#&KsY_*{!7yvt{>~s zy~T?a27pOj0To1FT#rE;_&a@Iw~I&8jfle$0u6)*mx0s4Y`aJVsMBKqt))ilaC{U< zH-`0@@;WOJrdVB6pugQv?tP1P4<U_cxlhi4Q3$3&Z`aVSGG4neS&-X0|9cs2T|cq! zf7xF(@URX0S*(Hj%2a$uej|7asf@jpwz-W}EcRrG^Wj^|Q8iHS_PR4;jk<bzmc0^E zn){UT1}Mj2j8PY=GXzo~-5AzXG>{|UO~8|Y9FdC#WEs2l&9<uBNW8XwI7WD9n-br9 zkk_nnrfY8J_v&TA&JZNPDHd(I2$_bLf?v!V`!A=stBku`EXr{DmdL|LxIeK<hSdNp z_Ke@x$*wstu+#rKqVBe%=RpT1E!geIC<CWL3Ev;9hYqkG4{>gFC>{!=8^hwea8Ka# zKvnm__;iM*SUPWGH&C_6wj;v?c%qHlDcl`Mjrn2Hp(SdlW7LxK|Mso~+^VVypL5>; z4+P%>GeSk2bJj#ZDfN@oiujz8(muz?OnqcH;uj4L8CWTnK1(h50w*#klM)A%oD+#G z#i3+Sa6se<2*jIi|9|$~(|z~8bN0FSB3}3U-hOAFbJkw_oOSM5XRWo@UOUVxKTs*% za%Cb3HON0-7_^Y!Xx<NC8BT^DiKA_WC$|@-QtarqHLHwM2O0J5)t07fad4(OF$Y?1 zsn@_1NGuxoJjrVhC30X(6j&wR(udOgRMjhEuUtl)=EGWf+>%Yd0<GzaUS%uCEArdd zKw6Xm%qc!?+1W)X-j3rpTIZNPhEeN`Ybq7ibp0nWiRRW$q&zwY_-{vTILgSdl2U<M zmYqJwYgwi86z#phDgzTi;wVMN#T;a!!kN}uX^(-<`HEKMD<f4Gd)8rmz6@YH+#l(I z;srQ&Hp&7EhhZJh<-43LjQE|^U2nxB85pxRuEyTa)e(j|n6X{zgk!}_ixUK24tA<N z+L3}s&*Oj>Sa}R_+HGm72mU~m;i{d>!Vb5=Z?#UXkU}%&G)1TKm2J?4zHTn9RVq9U zK_e%#*G8E(pU=%(B%cbwZ*g!K%6<rMcuFByGF%-^T3L({LP$LYN!6w6(Bg%t6_mZQ zXjx3@%mEk)jTvgs9!lVV7g!}QFB*O79bTeHFj#aDN)ov7gZx}q7o*u5Nt%`k=R8Gc zJ6yAzRICoBs61nsww=MB4GMA6@Zazo<*QZcOw=VE&!b<)KS>ZmNbdE#oup24p;R+l zhC1O`8D_}pRh>IKw)W_G9Pk1wk0Fk`!|<X}&<NNo?!C<6F~h1ob>u3XnU*`dxi%-O zj$8)`R70b}-2F0*F%QcK{br=WYHp1Wa_SZ8L5u#;C?AH~QoxK2$Dvi<T+1cc&T^n~ z2PT6*sPOfa8+FLJVg?Ye>_Y5=hf+A;1y*|Q^+OuqS(qg!q!b<PoF)<njJ1-h84KJS zvEfkv=7iDcOoTJ=7htDKNp~IQz(KEYK8O?>AuL4yI|%6zu>f2a?Eo%Fm;z>CwDpZn zQ^mc^nMxMR*M-q^X|aIH+;obb>X%^_GW+VL$o&7bI_E3S9Pk3mnPpLf1_-Msk@95+ z)jY|{GfWwCzx4wA0qyC0-n<Y7-&GwlBEQs?eVCo$S;L~+l%;RV1@!f#)%Kp+)Ddu| zfCf6z$zNAkj0Oy=5n$ezJm$K!`O9EZ4=Fj|1(rMG_Cd;$e?eI7tD2q&%_?qmkRxAQ zd_%)OQ2naj-E1{xlsHWFc62(+OSNZZ7PLkgEGkk3-C~{ZdFN7`-X%g|wD@rewA6fh zD>2$SV*>)Z6#NY}(oF~1V6tk+QBRqgMjdpl=mk00FvSfz_E*K|USPRB+-3xVJOhJa zSJjNmtH-_c%tb!ca^oyVdzxh*27E_#$^~B2PWY8XIN|pROS9o<n+tGOg8-&`NwZS+ zwDnzhCQ=ZPw_leeQ*KwFoi=G-<gj50U<?$3N;-45gzl@UsTWwuo+h=aIVd+_GOcvz zVyzy$BXNE!PW6~>2`k139gjkX@aBf?(BUZ6>E|IJN`*f`yV9@_Rr=(T!mU6Y93fLs z+4Jy{(cqM(B^~DPm;%r(4y$la^uq~Y1_%#Z1P5%{zeQZq7IhKZ;%X+MoQ0xa3i>1% z$s8AR)qTnK*FooNC^QE@47doLif7Ic40A!-G*`oA+BpAC!_Razwnm}-EroRyG*!)E zb-2gM1MmlOrhtYUP@SoFOR8xNOQ($~iJ)&>ItM-u0_za4X?GN9GQftxf>~m&9-JRh zZt?$Oy9~tyzI-&FY&C>A!%u~<vi%ZfJ5i_RVXvR}3QnAW@^W|N3LN1=6G1QlAqA@y z^_pOe%Kdq$eOn60r9y$B;eJ%_(z~&>A1jPq@H70Pqc4pqq?tKX!)#P9)Vn3u{;nw4 z`MuQP#FbL#CMNEv`Vp&DVC{!TM`1$&u}z}Km_c^P+VC~x2X6)bJ}95G+R@iD5;Bj` z%W*)>$`)4CsE$Ng7uU4p^FmOO4DWlDqSrrj0n#ovM*IC>evK$mVA0fNW(Eyc>S}C_ zxa6_$=$tGf8lwFq{}|9YZ390%cqkFPfd9wl>gC!jfX3GW7eH;4#gv&e()ibSHShAf zsNmnK<}1z|s5XH$6dah0LP6yQUBT86RyqNnY|S{DBk^+Ev+w2E?pv;;Vg?+BSnO4d z%2~Ek_l6}L(LzcR86qocySD2jRZkl_APKC1tYAKM4R@oeH4=TiSnX_eg6UWoX`dA4 zK&!hi>RUEigQjOCZSI6u6Rr!ovXQD9Fv(wE*`)&&jxfp*)C^XL>Iz<UXzfw+I8aRj zi@}#1%I<63BfpBAc2bWmfs3{9+ss1XkEs<uD#j9-FaQn}j#_b%fuz9Y-nnXvgssA* z_&R?MyOt^<PnTueU09JUeP#3reF}5=_JdhSZSe>c0f&{SUEPU$lx9vQSc;eMbV)kF z_S?W29O3cV#0^@Q1SzN}ur$!z<;Q7(K2*k9Ewt|TKnpB8`$DpgmdGC((Cfpu)m+PD ztvyyA2dYJ2QBYlxcW+{ssyv0!P~7T)Fz4(Qdvy~oTuNUBWLLDtk86r!jwIQ_YBhw_ zL7-MSVI{7<F9Z^W^jSgg@C(@P3yrQ3#!`JGr0Hwx9k#0%g=u_UG#b%|{!hQrQsb7o zqQF<<fJQA+J5L>VSwnEv#`a+D|4e)QdC)lxh2~(TK%4M7xuRQNZy2oU6~3vSgBul( zo#Q~Y2rM|4dH|X*ERW#pOwEZe3Ii0WgGd+xEsP}%Fo!tj2g*zZ4dHqStHVJ`JG|4- zjc;=xgw^+fMlB<w`j_o=)&udPZw2Ay>MxSCxP1jLpXr<H8&1WPn)^(YnEI7Czkh^- zO9^NWCV?3n)+37D)SRD2Gx8UVuPD5)sOM|o>O@S%T=Hx{W<_LL#x(J#i*uk_1lCo! zMVc9dp;>$Y%|hJQ#_SLr<0v6t4*^Wa%a@MJLUHxpG_gOD7Pk~qOcO)1l8}Lp)`5KC zSab^Jm_14tA(ZJ~U3e4BvgX9pI6d#{c;{Vn&C3p$ABqb#<ZcsmRwEz#7<oFuc30qB zqVNs}@A>hFgQ@G6AwSlR2HHH-k3p%luwoC|zK6A+3f_|pL+h=>mr~L2jT8r}MPTuU z&W-MhKV#|Sj1EMrmW+m3G&<<W9t>fEHwD1Vk`!Doz!yHQUl36Ha0PyKnI^{kiZ+Ct z$a`;&lr||`Y4?PmK?Z{M?1>f%{VSXv#OweZC?L>`k-Xqa#~d9@3)CQ)aF9UZ_o<q* z)xJ0y_x~0kh~Yp^6i=e*{b<dTNTf#}poGUz86kHPZt1_f3T1Z#{~gqqp*)2$2L)fR z0?>|S$Ru=vmuWzL$k?`DW_}tHzK!NUH3=+zS9Wa$c7Fj)=oip<`UF?3xdva(acbcM zrbXe@5*Oz>>C?o#6~fBQOxX~A4?^N*)qQg-q+uDM1<TruZJh}%M~{NijQtYK+d|<M z1IpAlSCcVQA0N|eE=EHC=s^7>;C^1=$ITbyN9U?F%kzZQJREfuRs#@}umB&a?Ns00 zD->1~S`?`FTc;bszPaVXtiy?SDC4B>3o;s`&GYlpVJ9Z#5d{Z64gyO*>*m%C&<=K1 zBV6)~@bJjJWLwS;G=){Ka3ZvsiOCwL#2VXr3mocNSRDdi+?l3pCnepUnlS*@jAkEF zbAK?ZVU!iRA=>u|`h=%qRP8fx>hBgbWws3(!%YaVZ3`B*@1PbL{dC>i@F5QBsmtJo zb?<_=+Z#B)NBv}DKfc=16b4tXJsSflJqat)p~iiDRC<U1!L{Fu1wk&w$E^nbK}hNn zfU7}E#jGLRfaH#q_Gy-Iu^)}5(Ct44(9+Z&Kfbl_Z_R;r^+k2ZG)+dp@yj@?Lckar z{O0iTbwA78OER5FeRvyUxX$U0RMsOjd4HuSZVq8Z6L7*B)g_kCnu8$7k@^5?!|KOD zxQvGeHb}jk7DC?6`2IZ)Ztw*k+iEuYDR#!22OR1Ra0M)ac0JT;vm3tC{qRg*$HO&0 zIua>FSV$ITWF{C1ZI;@hm^T_X$z8UWTV}D)`LrIw;V;Njew&U1)vIB(G*NGAhoEA{ zOZp=2v4j;z3diKM6RPdhB3?sz6E7(p^GE=o9L$X4x)^@0Vv){m-O~G}dm6=Cq4VHs zb$U<S8U^h<STi(fdA)i>P@wTzMM#4X5Oi|8!poG_IiTq|zJGJXPjRR*7?`;a4)Mbz zO6->LUr9z{`5C3)Vj{h4YGK98*$82^6IQRe9NO;$42*2WgHeP&`(XOwQ&5<Ekk4Og zL)l;m&i)4b_YgfbP{Y#jS6%hBv>d2jfo1!Teg+1OR!rjP;Ar@L9){C>A%3V!tsj;` zQx%y)#hmXZf7}A86DC9>US>TEt{Ru6!t38AqO?`m5xmz~8(gdX!LdC&1q@CXx)j>Y zzyjK0ECC?21uJoXi*u;_7(5!h*L8r^l+J$q!EYqu-Y7`%7agNklSD(IAfce;=xa8j zbU2PYj*=eU?3{$glQ2+lF9iH?5g|T5PMl_1=QHr(8jbM){vH_oE5lQ=CFCpPz1vwH z=qK|~A_uBhU}?sD1=UN`?!ow?a>VCS$QHg##eqL*N`<W>6nml5d?EL01%(y+KRvnz z{`(*+=C-K=2`lSxJIo``=zSCTaz2fhlmdkr984Hw2)DNEK;zV{sN2GdCmD|>fy;Ff zIC{y<7NnmPxV9rRK?tA;np|Ls$bViqpRWB8d8_kyj0T?$Kjt;iwswffa}@7pxT;1% zW94-oiw_xdm%XU^kI;f44%g2XcBWEB;=e2i`TwPG!0{=R($$C7cB1NeC~lXt{M#st z@}NFkjN=c%>AD0z&KD7<^$;+IqdXd6n(OUx@~wO!1)14mQ<48yfGXakJP4zq_-Ao+ zAvBTyV!IM03$wKsMy6on1cTte84qn?FzP|jAMY>|_L)GFlA0IINoM;z9h!!jGRIs2 zXib;NG_!6}>|STcM+*ePw?UhxtO@k*FivTId_>H}8d%o?>tM4<Y@IFu{VD3M@qUn< z4mM2>_Nto{yxM*VjLw>95QY)_^l38X&iSw$nH`oXtqC+^cXxbMyg4X%SLXkYPod1c zSDxHu=wkP%n_7Hvms*M5=uCefulRJt6HSJ&S`y(gT!BTvJZ$i}#r#B0ex-w!KWcMw zGgh#}`DG}Tg3}5R{w1!PTBA?{81B%V3;2=4=+w%juwvZQIS?48IcPhCg&8yjf`u=u z6l`+-B`?4hQDfkcUWvsOJ^|r~Mi8ER*0n)czK#*LH;~12RIsdbFQgVe5?l`>f$$dy zCsSZ?k~pt{z`=`CAd}@BN848jY2g4u!=g6G5xFe*Qn>M=_Q&xoPr$R^BN|vC7Bws0 zC;J}@x8W#gT{P{AP3J01Sq#+J8u??zQ2lW?4ph6q`l@0_2VOA=jhT&D>t;Mgyl#|- zif+ST1%AXr=)DU;#+WTSx(OlN_?ch={#OdV0m9oD#PRk7XQ4n#FhB|`;}EJ^&<%su zKr>4MUrcj#<%X~ePU%c^A9q8uxPn$FK>BjTo^2y_1(&NBBc7KUQA-mW&xfF>0e{{S zP4S<Bs}h)l-CT@=LgFs;%aOZ6@no`HlC2O>?<rJXPjjm=)QJ_CgW$&~2X-4FltP(8 ze-Un%v3Y4`25<yf2JFIlfW96^@lXa1=$E(*#I`^Z+ZDK`Y51!4NhGY;xHinG0jP7B z-<(UA34V!}{G|eYl<Sb`H+mgJ>5sF8Rk5DJ;Irx!2N@*Xu+A1%jhR=W0Ud?Y)Fegj zCh33SEC2~LVPRFJrD<D<f`JEWdTUTtA?9cj1U*z004G~B=^=sUI0I4T!VWZ5CCtK$ zUT!djRb5El{RQQ~qTNs%rQdBh%+xf%nGe#G6zy+HL&mo$%mL%GTNvRZesl`1e*y|M zlP6KGL%A0vIn*NSfqZXgXxRk<^C7G*N=_&h=Fib;C<=$;FGqPBB_8&w8w?GBZN!Kh zGkOwk!pmeQ-J1y^JX)NLQVX9E)#<N01T}N5!FKrf3PE!#eP<FHQK2bD-_#M&mjC4H z#~r9&4}ocB@NCPTiLt;bkuQlRH+^b-4Ix%++KeKexH21pd6b1se;xg291!ROK~;+a zS(O^-DzF#Goda6@&3Pyj2dZ6QeII<f5`{(^g_b+CM-!+;JDCG243<NCIN6<8sup9N zTP<qOd5cxc{{_EW-&>h&;xNtO3!-XEQ!i*muPE$QU>8k1dszNjb-q|dr(@n5!eQqK zjRJtl56S(>5LV`3MML;Qm`>B+OB{|-yK^J_f1uybK#*uCtl8=FNoq5Jq=gk7=nP|U zNwdRIR%+Kf;)aT)#i1FgfjeXLuCJAY1Jy3D$Rq1l<jA!1@#TlN+JbcuR%hVI66@%e zy0ZyR@t>@H5CaJ`CnYc}K?o}zX>O%}Tfu4s^j+O!X_K>Y{H5I4B%6a2(vG>G7&WV< zRIzffU)@{;NqDwZ0009KNkl<ZYhE4gwRT+y<MEr|Yh9#$Ew(hQ*JP8F+iTEH-#Y_n z>EP$JaFmp$DQ-6ss2o_~gm#XaQos^uA~M{AF<U%O;68(iP2lLWJu=8X-!f5r-E*MQ z9Jm=B@aHT_7`%h}h)Q=_2KoclHH$p*`W`SgSA_nTRh#W=OnlZ4Ez+jgVQRI4#=-Sj zj85j$n+SgwJlY0ig1M@VY%8|I4J@~612S}&v<|A@80=fO99b(MeT?VoTEDPg7T0f= zU24sHyvyxEJ+|jSc{p$?$cP_eeK;TWq2(c4aVk_%%oj-3AMT-N3MGkWZYM--TAEzE z(03N0l|{VQ^+m4Xr`_7rhyN^soAmI@2F)c#-Ml~ddcMFK2LWdD?sG{m(Brvr;NxHt zx^cwDz5}~Yp!CJ))*}1V7QIK?WdVvd&BXpOJzTY6uPLmDP@_pjvyoa!QrMvzVqKUG zcCDQX-&nDM3Yw)hv}J!}A8^_`8rXXnEruF(R_Pmi9%VTS`NjKx6J;&RDwK8<!uBXf zpfKWI03GxaD5_>!qnqT}lk&9RdJcFFB;&wsKr_GmpN(lYEDs+}r(o}xHpNaqn@8(8 z?3==~P&@jw^!3(-)Y3|UAE2?OC+ZYNe?&RWkuco=f>v*YxtQkQPL?T1oWmSxdvwnM z&jE0N8i9OarzGGA%}6?l*<(ALcu-R#voUJso8Q+tJ1>N9wYsjCIeVT*aDl<Lp6iaq zaXn6pCNUjb*t=)Gr9cEfi}0`XX4&1GtKTnO@OE|u(1}kh9D?1BMXDxp&HZX}^U;=# zDqH$kF3s~4;FZ~>;bVNxV(O}{hX*3g>Ty22-KfHP?dyz5M<#mj)ZcFJ>2%^T$b<^M zkXg*1FEonyv~D|eKK$kC4_|EAZGcdy;KBI=nkp;g4u1^tdCn4BEi#!o<e)7`$CopV zZ7~H;HjAHfnzB4l!q$KOe0Grc$bgMqg%AEae_fTg{NT2e3_#%N>gTe~DWM4fTivD8 literal 0 HcmV?d00001 -- GitLab