From 3c119d425e40ab9fa6f48e1351861c035cd279a7 Mon Sep 17 00:00:00 2001 From: Josep Piguillem Date: Mon, 12 Oct 2026 20:21:38 +0200 Subject: [PATCH] Open a TaskStream board for a project that has none yet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The project form gets «Crear en TaskStream» while the project has no board, and `taskstream: true` on a PATCH does the same through the API. A refusal leaves the edit unsaved; a project with a board keeps it, and `taskstream_key` without the flag is still ignored. Co-Authored-By: Claude Opus 5.5 --- README.md | 8 +- app/Actions/Projects/OpenInTaskStream.php | 6 +- .../Resources/Projects/Pages/EditProject.php | 70 ++++++++++++++++++ .../Controllers/Api/V1/ProjectController.php | 15 +++- app/Http/Requests/Api/V1/ProjectRequest.php | 13 ++-- docs/manual-de-uso.html | 5 +- docs/manual-de-uso.pdf | Bin 530718 -> 530774 bytes lang/ca/panel.php | 2 + lang/en/panel.php | 2 + lang/es/panel.php | 2 + public/openapi.yaml | 13 +++- tests/Feature/Api/TaskStreamProjectTest.php | 57 ++++++++++++-- tests/Feature/Panel/TaskStreamPanelTest.php | 42 ++++++++++- 13 files changed, 207 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index cb2d382..4a14a49 100644 --- a/README.md +++ b/README.md @@ -553,8 +553,12 @@ POST /api/v1/projects que esta API, y se le pasa el de quien llama (en el panel, el de su sesión). Un token de máquina (`pmt_…`) allí no significa nada, así que esas peticiones usan `TASKSTREAM_TOKEN`; sin él, no pueden pedir tablero. -- Solo al crear: en una edición los dos campos se ignoran, y un proyecto - duplicado no hereda el tablero del original. +- **Después**: un proyecto que se creó sin tablero puede tenerlo luego, con + «Crear en TaskStream» en su ficha o `taskstream: true` en un `PATCH` (si + TaskStream lo rechaza, la edición tampoco se guarda). Uno que ya tiene tablero + lo conserva, y `taskstream_key` sin la casilla se ignora, así que un cliente + puede devolver tal cual lo que leyó. Un proyecto duplicado no hereda el + tablero del original. ```dotenv TASKSTREAM_API_URL=https://api.taskstream.pireon.dev # por defecto diff --git a/app/Actions/Projects/OpenInTaskStream.php b/app/Actions/Projects/OpenInTaskStream.php index c8eb396..c2e7fcd 100644 --- a/app/Actions/Projects/OpenInTaskStream.php +++ b/app/Actions/Projects/OpenInTaskStream.php @@ -13,11 +13,11 @@ use Illuminate\Validation\ValidationException; use Symfony\Component\HttpKernel\Exception\HttpException; /** - * Opens a board in TaskStream for a project that is about to be created - * here, and points the project at it. + * Opens a board in TaskStream for a project, new or one without a board + * yet, and points the project at it. * * It runs before the project is saved: if TaskStream says no, nothing is - * created here either, and the caller gets the reason to fix and retry. + * saved here either, and the caller gets the reason to fix and retry. * The board is public, like the project it tracks is meant to be. */ class OpenInTaskStream diff --git a/app/Filament/Resources/Projects/Pages/EditProject.php b/app/Filament/Resources/Projects/Pages/EditProject.php index f0cddeb..d5f0ed0 100644 --- a/app/Filament/Resources/Projects/Pages/EditProject.php +++ b/app/Filament/Resources/Projects/Pages/EditProject.php @@ -4,15 +4,22 @@ declare(strict_types=1); namespace App\Filament\Resources\Projects\Pages; +use App\Actions\Projects\OpenInTaskStream; use App\Filament\Concerns\WarnsOfConcurrentEditing; use App\Filament\Resources\Projects\ProjectResource; use App\Filament\Support\DuplicateAction; use App\Filament\Support\PreviewAction; use App\Filament\Support\TranslateAction; +use App\Services\Pireon\TokenStore; use App\Services\TaskStream\TaskStreamClient; use Filament\Actions\Action; use Filament\Actions\DeleteAction; +use Filament\Forms\Components\TextInput; +use Filament\Notifications\Notification; use Filament\Resources\Pages\EditRecord; +use Illuminate\Support\Facades\Auth; +use Illuminate\Validation\ValidationException; +use Symfony\Component\HttpKernel\Exception\HttpException; class EditProject extends EditRecord { @@ -32,9 +39,72 @@ class EditProject extends EditRecord ->url(fn () => app(TaskStreamClient::class)->projectUrl((string) $this->record->taskstream_key)) ->openUrlInNewTab() ->visible(fn () => filled($this->record->taskstream_key)), + $this->createInTaskStream(), DuplicateAction::make(), TranslateAction::make(), DeleteAction::make(), ]; } + + /** + * For a project made without a board: opens one now, as the person + * signed in, and saves only the link (whatever is being edited in the + * form stays as it is, unsaved). + */ + protected function createInTaskStream(): Action + { + return Action::make('createInTaskStream') + ->label(__('panel.projects.taskstream.create')) + ->icon('heroicon-o-plus') + ->color('gray') + ->visible(fn () => blank($this->record->taskstream_key)) + ->authorize('update') + ->modalHeading(__('panel.projects.taskstream.create_heading')) + ->modalDescription(__('panel.projects.taskstream.section_hint')) + ->modalSubmitActionLabel(__('panel.projects.taskstream.create')) + ->schema([ + TextInput::make('key') + ->label(__('panel.projects.taskstream.key')) + ->helperText(__('panel.projects.taskstream.key_hint')) + ->placeholder(fn () => app(OpenInTaskStream::class) + ->keyFrom((string) $this->record->getTranslation('slug', (string) config('locales.default'), false))) + ->maxLength(10) + ->regex('/^[A-Za-z][A-Za-z0-9]{1,9}$/'), + ]) + ->action(function (array $data, Action $action): void { + $project = $this->record; + + try { + app(OpenInTaskStream::class)->handle( + $project, + Auth::user(), + app(TokenStore::class)->accessToken(), + filled($data['key'] ?? null) ? $data['key'] : null, + ); + } catch (ValidationException|HttpException $e) { + // The modal stays open, to change the key and try again. + Notification::make() + ->danger() + ->title($e instanceof ValidationException ? collect($e->errors())->flatten()->first() : $e->getMessage()) + ->send(); + + $action->halt(); + } + + $project->save(); + + $url = app(TaskStreamClient::class)->projectUrl((string) $project->taskstream_key); + + Notification::make() + ->success() + ->title(__('panel.projects.taskstream.created', ['url' => $url])) + ->actions([ + Action::make('taskstream') + ->label(__('panel.projects.taskstream.open')) + ->url($url, shouldOpenInNewTab: true), + ]) + ->persistent() + ->send(); + }); + } } diff --git a/app/Http/Controllers/Api/V1/ProjectController.php b/app/Http/Controllers/Api/V1/ProjectController.php index 365551f..f7515ce 100644 --- a/app/Http/Controllers/Api/V1/ProjectController.php +++ b/app/Http/Controllers/Api/V1/ProjectController.php @@ -72,11 +72,22 @@ class ProjectController extends Controller return ProjectResource::make($project->load(self::WITH)); } - public function update(ProjectRequest $request, Project $project): ProjectResource + /** + * `taskstream: true` opens a board for a project that has none yet, as on + * creation (and nothing is saved if that fails); one that has a board + * keeps it. + */ + public function update(ProjectRequest $request, Project $project, OpenInTaskStream $openInTaskStream): ProjectResource { $this->authorize('update', $project); - return ProjectResource::make($this->persist($this->fill($project, $request), $request)); + $project = $this->fill($project, $request); + + if ($request->boolean('taskstream') && $project->taskstream_project_id === null) { + $openInTaskStream->handle($project, $request->user(), $request->bearerToken(), $request->validated('taskstream_key')); + } + + return ProjectResource::make($this->persist($project, $request)); } public function destroy(Project $project): JsonResponse diff --git a/app/Http/Requests/Api/V1/ProjectRequest.php b/app/Http/Requests/Api/V1/ProjectRequest.php index ff53595..a836ff7 100644 --- a/app/Http/Requests/Api/V1/ProjectRequest.php +++ b/app/Http/Requests/Api/V1/ProjectRequest.php @@ -20,8 +20,9 @@ use Illuminate\Validation\Validator; * Relations travel as ids and are replaced whole when sent: `technology_ids`, * `service_ids`, and `members` with each one's role on the project. * - * `taskstream` (on creation only) opens a public board in TaskStream for the - * project, keyed `taskstream_key` or one derived from the slug. + * `taskstream` opens a public board in TaskStream for the project, keyed + * `taskstream_key` or one derived from the slug; on an update, only when the + * project has none yet. */ class ProjectRequest extends FormRequest { @@ -78,10 +79,10 @@ class ProjectRequest extends FormRequest 'members.*.id' => ['required', 'integer', 'distinct', Rule::exists('members', 'id')->whereNull('deleted_at')], 'members.*.role' => ['nullable', 'string', 'max:120'], - // Only when creating; a client PATCHing back what it read sends - // the key it got, which is ignored rather than refused. - 'taskstream' => [$creating ? 'sometimes' : 'exclude', 'boolean'], - 'taskstream_key' => [$creating ? 'sometimes' : 'exclude', 'nullable', 'string', 'regex:/^[A-Za-z][A-Za-z0-9]{1,9}$/'], + // The key is only read along with `taskstream`: a client PATCHing + // back what it read sends the key it got, which changes nothing. + 'taskstream' => ['sometimes', 'boolean'], + 'taskstream_key' => ['sometimes', 'nullable', 'string', 'regex:/^[A-Za-z][A-Za-z0-9]{1,9}$/'], ]; } diff --git a/docs/manual-de-uso.html b/docs/manual-de-uso.html index 7c6c73d..6fe560f 100644 --- a/docs/manual-de-uso.html +++ b/docs/manual-de-uso.html @@ -383,8 +383,9 @@ catalán /ca/projectes/gestor-de-socis

Si TaskStream no lo acepta (porque esa clave ya existe, por ejemplo), el proyecto - tampoco se guarda aquí: cambia la clave y vuelve a guardar. Solo se puede hacer al - crearlo. + tampoco se guarda aquí: cambia la clave y vuelve a guardar. Si lo creaste sin tablero, + el botón Crear en TaskStream de su ficha se lo abre después, con la + misma clave a elegir.

Decisiones y postmortem

diff --git a/docs/manual-de-uso.pdf b/docs/manual-de-uso.pdf index 3565a50cedf410e929916b81e959b650b6300247..3b14fcd1f01c116094b8d7e9ce0cf520c3af50f4 100644 GIT binary patch delta 84511 zcmZsDcRbba`+v@{_uhN&d6pE}A%#RXW$%%YI4wkoj8~!%LX?%QkV=S%5TzuU6`^7N z?(;fF@A`ayf4sx%-1mK5*YjG>*L9!A`&PB^aJ6t{5E-?KstQh7SrwZWLB{vzkD45^ zqU(4xPEA!)Q#j;Qu$zk?ZFtTX2fM4&b*a%>tvXkm$sSMMly_D>aO7uVO`H39U&`k- zYE=)LuLlh$BNtyfu}c^i79J5j(zE|GvsU=wqaTaz%X5|)>+l)xFa)P`1n4h&JTOiX zP3Y)+Suf;o>orN~huCr2E0xZ8F*W&8;+bE|+4%9?XtlHWjY;=QuN0Fo+q@fFR{BM^ zsgtSL#uk*R?>%P{O&RXMN27iD@S9(M%*&~r{aHU=_I_@1ZNa(~zgb_b%@{Dz5_P7f zt3CC0do!+ZuJs{J@GVMh$7kAR{fZ3DUYpC!`@02FJ zuMXPCOj@Y_*mpc=f2Nho3TOSjiQqFEnS;B}2E2*SqBk;ErtQA8q^E2P;kUN0YHj`c zc~z_Tay{F}_t6ax&s2mTd%Q8(fv?A+6UcX_4t7s=%#8cUydKAP#O*Xb+z4bdp4XN( z3S#c&PLp)3pNx1n*D`iln4!l^rIp4j+D$*Py%G0(vcoBM#A2^8(`_?zSqqb9Ar0=y zW2XvVY(D8(j%V$=&Rw3JJKDJ%&naTe!J%+Ou%8VpDtXztE7FIT^Mjzf{SCZ$kz_cQ z+Q+l-;~kchgVv*~7pos@Sh)u28qcW8nm)Up_9@4)0!LfsJJi?5^l7w%mM4dyXCvs$ z`!tpI_33u8>n=Kh%qpI8TW`pJ?B|vGdi5ktx%B83qyHxgu?IDWBUxdHK}}Hp}d;z5-S4#G4k&2#*1#h^+zjg!X$~-^h8C+(hWvoW(8iC_M>3 z(Qsvk>6pWrpE-+%DXqrjx+Gjq=6Qb$oIU@t0f~!$ZIw^uhQ(ER$FRv9Qr5dsSN$<3 zfA;jH0XcoWY*RF?7yq*21J=$j7i|Vo8TIb8C6I?S6vq!XAfJXmdP}qXP4mz`R%Oi= zE){ayMRGU6yM2bw6N6u?zx35RRE$rIxsVpG`}q0+c8vFP8htC{#u}H3{Om(H!YDhW zx7am^85yi&Rdbj^wDfCxW3c1%*%M1Yg&ioe&UA(p3I*O`$QSmsj;( zdWwkb(eBwo`Fdd&O0_qZZeKoyVcOOnPnz|)7a3WZuhOOJ<}^w3NUtMk7<(1*=1e%F zoeMJ$J$uu?x_m8iHN+x0lgu+Ix{R&N>&Q-)#6{|r=#|YIUWb%optwfp+IWnZ*_Y;p z<9mW61!+qg-kcsgSrdQD*pGVbYTrlgbc>iR4$C+)X}m))mA5Q$apCUCc`X?fUWYWxvr6c*5FZWCSsocYVPs&UaMX1`On=}xBEfeh zMZDBl)^#c8wIy{-msF1My^yDG@$1Wp`q_c5fv#m^~zgTyfq~Soo zrikP59*^@59Ct^UJj$!s^5!#&Y0gSw_#CP=lCq1JwOL|x$UQPg_N7kD4txnOM))KL z*;cP74rkqK!LmPeJTiloGxU6Volj`Cmpv`1G3wk5WrMcQjii{h8y`-DTHV1vlTNrV zIWu%+Ogravjl#$Y-{~X+8AHoOsjpRRGT{juz$MN)pOpIKH z*x-ln?76y-HZA4iNg0H(uY?7A-sZUzj=Ra{L7?L0#gGSUgVVU zy_D0>E?+9=(<|8)UJP7`5$_xi{+9Y#hwdw5_BW3i`^1uB=BN0MglGt@jX!*+Ay@acEi=;pt@#FL<%buisG6zeBD={8( zO5w6`8u*H!0WGv9(+lQTpYPv8>_2!nGU>`u_s*0oDa&g}3z_ugik`g1bxK=_@+=BD zdj-C*66fkV0h{+Uon-do;S;B~&Qp`4U0boiP4yF+=M-(reP1eHYT4R?u$g z6KC!Pd!JV7zSA+GLb3TQ2>m^_QV$JWc1~>6 zvbiRxJ@RdJmOmacTt6%$I&uN^;6Qnk$Q6gO?Da2;{twC3??l#r!=RcPv$x29xyBp| z*qKOt_v0Pqo>OV|pUJ&xD+ZDv+h=_S%x2#^A8DK_d+k?nfNxo+c~0I}uinX9A^c)A z{;Ebxc-)4))X9gJgnl)JOq;*hb7^zr6Ke!bQlcgO+eaVR-wiKlk;_CU4bY9{evYzH zk2|T5B{X10pS`s1m(1~ExSNssgF$3qcb&caxr6?qRxaLeFebeb%2WvC zk@MI3`VUIhxESl#Woul#DHAL#XN}FXphV$kgAQovCCjm`FY+kGPUQ%G)}QhzrlaY) zu$|*e%fGn4bFlui;A*GK&*EHZa;oI+xbvSq8?8Npp1%mAQs+rx>Ki`W<|s9nW6Y;* z8?@J_%R}k%6PiEv2FAH%S7cM(Zsprian9MplIb#^fhW<<&PCAD&+ox}$n+EbAvG zLhM~PR|i?hPE*b3x>}&}xve=ZYKbuMg4>0KC1l3yljn@?ZoN4+A|)N%eraYHsrvo+ zSPuQ;in=r#!#5?D7Z20KzhgL6m{6U)xT-INzxP7;I(1~exmsC)$M7xXdGb_y)&s?^ zUn$bIPWQ*~G$?2Mz?m?**L-Ywtj@IECVg6DM&Y#7H;0nB`=83E=vTJcpVBc=q*%OL z=YL5S!}WQK>ydw0duslUYkzLU)i`hCX8)c?5BncARGxVfL#1?G((#4)%t0u1PQYmF zdz2=g-c!kK)Is~CW0cAFstJ`04TB4wGU1oycsb~UN=_k&ppS=}rt97=ChxesjY5VfrW5(DE zDTmMSj{D{f73Nq)`@VWMIw^Kl?17qQt*y4ojaB>|k^5ZN$8`EjyYwM>8K2)XLs;^H zsnO>qA0-n$y%;UL`MFjvKPhyOy}LB%H-o6=!Z>+j2W5f?OOf_7Xoa(hz-`;$p zmF4e!CVuCXt@n-2_)>*%k5jkIvr)0E7DiK_YX{o=Y$GeUm>are%TCb9V$YOba5Q^t z+J5F99sWg--2<1ie$Q0uuSpzZ7DM0jbiXHP)V+W8;Ovq5@1|Nhn(4?hl&v>L)s_a8 zdsrW`UQ=jiWz9Wj&G9^XQ+=(kVYzhhm;1B)nfAsukMn-HnfZnZy{DF2>=or~Q~IPT z-zr-SFFavIZEv2EQx|Eq2|grP_3575*K2euvL^1m`2KYJhiwkk_-AG^l00ce2NZBh z5&?y#GPzk7YQ*s^TU=ZQQFqoHsT{Ab)fQ(Mdwx%K3A5++Z9MFZy`Mg2)Rka*vk{xP zUsFoF@08?CHuvmbFMdVbKl1{5G~87#*qLjz-`2#=Jmgw@`ZUU@Fzt}(LskbVws)oM z!BQjhso8kUd@7$c_+@y0U~g@KVB>2_#yFcHvHB{rQKJ?0{bh!#HD|<+mKv%W(MOdE zc2%~yXJow=dm}z}*Yc`s){X#&aEj>#i;KpY65X8$30Iq+CA1-~HhL@f(}ND32IqO1 zss-1aIizK{cDzNstn);h(SA-guKB9tAIk;l4!Yylj-RtH=|o^_&d3Mi$~qC_F=ymw zRm(aroC3SjP3MCO!z`{!NWBQ))SntRYvKRx2rj*j--77&_P`A|T?b7_Qs zbjTU+P%*!+_7=;PJsE!W+s#FCSGYqXsqZU3KHd3nBIiov2R>T$cG{7A?~>|T(dQ26 z+h1jpte;%=FE#}H*i#d1zwZU!)|=`&XZ?nEOSjKV_Z1H_W@bk8 zF_xdA`cYjDLPOrcpIk3VklS^O4C@QYWsIXNO&&ga&ELO6HQ-nsrp&O;E?N~F|Fz*( zUC+J8r&}IG1`ats$<(->A;skHS=ldDobc^2Y5{=dTZ9T`@R_rA01~NPFSYOaA z{r!#*S-i)bZqz-qDV~*2q5M{pZDW+@+sa2_fhzMU*AVM(k>KViXB^Wo{ePH{MyS! z@l++ib+Rr(H!$_`CSzrG35s1lt~In@!13qHk_U7J_*XA%?nPINMz!2^z5?N%zm2-2 z(d9MKXZZEC z?~VsW#NnSt%vMKRH5^_rl)g3m=rr@5n!4X3bOBe|&Kurp;aUE{(fhUD)BAEA%hhRf z=EFny!_hQYI?XF`dS;^q(??m>!jzjXW)1n$`WWV~=4wiL|G2e+O59sPeQez+@f}5f zs)Dy@#i)ok+ax^wg2pH$~4KNxbG z+{b=t{Ba*%uB>RI!1_3s?!(wROJ8!q=#quxrCC!ee>W@Cr>E#Mn^o_dhiozw_9(b| zn&pr4ZD!TYOf#;%f4WCWabi)31M*wzUt+?jjw zus_~sttzeCB>U(Uu4myaN?*Ufi|rEL_oGiVGKevK{X4#IOrv1I@iE;RVs5N8MTvQW zW%gCB+Gy^%XqQo*AG&Rx4RJ+wIZaWG7u!;yMd4Bg)iY^M_uey~+biiun-N7n5}H&d{er>~edo=?y;X8t7nFMcCl>MBuKgiDxgm1|*XCiQ6UnUOvooHR| zqcQ1SZLVu77*~?#IsL78aXhA02FIutJ=b)vg^D5U!aaPQcACDE-z-Db*?YNqPJ7ON zmKs=Qe<^ci=nQh?%MBZ+MbwF3SzH=^r&S)&F8o-XJQw<0_uXsuTQUJ06|0n=rk1+5 z8=J-6zMOk7PM_q0@f>J<<{h4C9~ z)CAdfIfZ2_{=`=oZG6LTKNxLL-_T&xl*XRDMcWX(Dubo&jW0gWcA<9A+czZPEwjZ_ za<1M{j6_MSrAoV<|LRFepMw-^zJ*l^ZY`9D<6b9R5eytp=i{?zzx3hV=#6Sm-EL~h zvS)SaehWw2$-foX$taD47*whRd7JXI+`8EEi%$T}5A&&L;jCm;NH`u%7^*yRb!bHR$?Lz!pKv-a^|+mActDY`*E zaz6aU`&OL|#g7arv%Nl{UAwH#bxc}lOh%}M|4Fjf)U>jS`zA|^wLF@C(EvJJS*oZRxI=u*OoZTR&+vAY$mv% z;I0;p!&T91t9z50*AsvC-J?3)s&$SEcWP@jym2ly^xJ3gB!B$=rTsKFHus^zqK=Wt zJv)(}H?8x0(#!)wQE4WorJtEzW%M|(+QQKDTl&xuKE{=IR6}(kgDW|oxH4@P!;JYO zOI)(_TOJfFe+|@n=dveiKzhVU#_elEp*qdh+z&bS?*sGJ=hTaqP*t)Q`*~4_UI%uw zz|hSu7vH7%zT2v0_>(SHb~UPH_ukxiJ?z`--BT1$e!tgSQCGan(!I9Uu4Zg(f6Z9( zT7)e4H}ov{_fCSAi<{NBCC@=?_gVo3?*%K)+Ixv}Z)+-7GG&Y}Dl6SV@vq!AVGALv zKpCis8W*6&%25GaFEURD-qH3_@~};MY5nZMYkK8l;NMbwvf2Kd6E$}lN3B2IFq7Dm zFjKm<-LbS8v=8p%v2(F;GpR3(BV{#7 z=8X4}=PAEkeFI0kh&Em&;Dz4@R=#1x4<~t-_>^C1@zJlMg@Jy(+`Qdsu{rfG2 zuApnLaZmR0CO4)VS{dIh|M1JbBlsC}&C_4wkD$5p3{!?3zp+{&w~!Q_twO!ODpXAH z(P8hxwj<|z@WrRMH4f#<7pw14i99!A!t{zJpa?rX_PQfTNFwG?(R6}l3ujT!^`rgR zFEM4m-`ab4-=5n+lIKXp&ZkA!?Zso%RQ?%+zjJV?_>A#?gvZAyjZ;{OS-d~M{Nd~i z-^eP8YK=C>;^N<)DruM+n>?-7Jl~#lx3SEZ8fk@%&vUHn#1jgi7_#fjp=5Tjv)W8} z%SDd|d8~!(anRNJ+yLs5x924LcWOgumFW$d3r{_n91N=mFWD}?=6~ zwphq?UQj3r1<2a8X%}5u#m@{bL0Sxclf^>*0o$&zLfg^EY06xFMxjovf|ZUqKI!cE zq*UXa@4TCPy0c0gjQ!>HE(h(IZr2&YaM^MQv@HcAr_(UD#Z^NFC#lRt^o1_+^t4Iv zACO2(G`iKDh))n1o1Bg{j!S2Ke0=^I6H@lU<*|mU7njm0Ejb-%hm+kdt62ZoOR@0y zc*(_1vSUMeC%Kz>Ui^C5)7xCtIEmaUJw)qLj_H5NTf z!g(l?i(S~c{FzaaRlyX0zA96f@DzVW%pO5m!J}R}Yz%C8Lq!uA8%gZ9kJ8q6Sq;7L z4OQ4QUEU_X<5w&>brM>>eWF)sGmSc8X;F%#Lh>jGh23WPs24HGoMFo#Hez64 zks8O1>nN4KRP|M!Th_$Wz{d1;kDHBdXXa%qwe97}XAkmPIv*50=p6E%gXWw>Qs%sP zs0KYTC+=*-;IY2R?1JCto{aVuJEqd-7V2Me(`j?Thuq5k=~3W!hVdTusu-}&$D$6rbZi97m*@{VVFo-V9=w!Zlpr8v`~V^UL1ugR5^ zp17Drdr(wu=XmX7kKwba2lWr83Wzm6zs_*)6`e&{xk5&{rj_gum*FBEPu+-P8y#Od zYs7J+5X#C?VEJqKZ1EaHaN0hyk-(A%%B(>*G;Lmt@ilprc|6z zW8U$`qSU9n-@hijv7faqU(ne(5%>Eb*OiA$u2qY4-#F>p8e8&W^o8l}9v3$>h9opT zUX>3>)+#xNf2O%a`A|yC<^VM@zcF|NIp(H~BB`2-z$U9#V+^ascK^CGK@0^EF2 z;#0{StzPXF10ZBCdwsZ8P|XuXz9ds{b(6|as3+3i=JSsR+l=VO?OyWW{Wm+?(Pwy6 zMz*rBXOmy-E5CDe@-%wIz0oq{)HSE9Ual&tl>F}v*V*v>Rx^lX%>&sb50;&|H~0AE zB+M$P`cRE=XI#5-A0eE_AiIP{koh^=zc=hb?YK+3Dt^SdmSXHeC(e-VK}%4`1>U7A z`7o7TX*k(|Fr=-(36fnZVXnSsw^w_p`$W>gJuDo1%S=lZFb}Xc19C&b=f4h zY4*AQiB%=m7qF!#kpWWFs@h+upFq$KKG5@Sno{ zf>-GKArnmQn;wrt{V%9f2$;2B5Hc2{_o)2JdB9@!L_-m%gp7PL9Xc^m^lBUvDuGWM zUN|3Tq1N@$59WEHp6hOJ`2Bw1&7b~Xth?RhS}pKP6ZO$W_Du$-E$a+U-!d2#){u1& z(U7$j(~zapZl)bGpX{zeWpa4VMDgbfY?*5}e-|8tUI`ACS50v|kYiUprhs%Y?u~sh z)T$h3n)X;vvw*wx_oCeG$(0AsD-X?G`M{_0EJzKq=%+xr$?=AlDhYs$LT^HL<$ zL(mlWat1jv%T`NXE5v?Q)h#zgU+-Wxr#PA7(uj=D_%WK2tvT#poK>haA8~{J{mj}v zukW7H7yB4!F9@A?IQsnDyVk9rNAO$IgIbQ!G9S7ReVAX~`qHZ*eC~cr&%%eL?G3)f znQ-L;mU(!#<(GpAJKIxVKx_m zr{51`Z?;LNp}2)IdCk4&z0NrIQ&gG>{z93%C8D2YO=&I}mAD9grW*FLo#?*Ux!IN$ zYCJm`{^|RkwbeEX<%u`b=X;qB$lc_pgfgY9e+ycw;+-FuE}X|@*y||w^ap*~82>3I z8o<$Mm7qI5r2Ev!%PJ>z^3%X@@}Zr#Wg%=g$DVw8`&fccDmIQ?K{=M|(cXiY*&>+@ z;i16j`HPvjf-gZc{{G$0#seGE?P-=L3u%v$e`%}H6r>|NkZsCGU+^aBL^W-DjPpB4 zAbOxa<%B5yiS^i-Yh%VozsbZNyr%Wlfi987P`cWJze(QEYc}|(+nqV*$5n6j55MW` zjeYX-o1ytww3DTo`GIQ(-MWm%Q0J;}5>0 zmOJGBb}!}GVn-5fJ0ql7js@M+V(zpKW%TcOf|;6Xa*o2E(Lee_;AltN^pl}(1F3TM z*Lx)N%SU87sYI6@hFG(tj!Bu*WtLbx{Tg%EBJQZ`&FfSKKGaLJc!tMgp8ED%=RO_{m_mm*(+9wk2-Jczf3+3S!iD{8{EJA z{bYXP9j8^w9Oce3Z_(9J$|GDK>|5A!(ju9&){cL6GLvaYxu#`aW+xSS{?4ebRykW3 z^81n=yX=1E()rgc5euT)RdiSK$;Os(ujtXK3|G2JN9X8 zFzJ)NyMyw`+oSpB%$L7Rm;`6$sP^#Z$KTFan-3kQR$K{Ls+`{!x}c*)&wkAETH0mz zjg5wx#Chwor{VYZxP=|PohOU5QCW6=IN#yX*<1vn{Iw2e8FFWt!tXEI_=i+czfwIhXF4x(^;H!9<}G*6kDj* zT=PrTg((l(5~`)ww)t^+wWUnCvn{d*jL$ml8~5eYHEvrpy@40J^ufaS-P)-jiNeBc z1)~k;6FwFP^0}Iphw7OmA7(OHo(;`AL0Q@RA*qzf?0{T9J8f0fJk>njr1-?6m`={0 zsj22X3^MD_B6Y3LO3Pokm$CxrIlEpvC*MQg&GO&_`+O`_P)w4{uLcHC+*w)qCnWD@ z@zfgM=)1&oM5@mZzvOb~v3lC9@f#5nKlWM07Duea2zSf}cJZ>%=CuHyL%tK?!mm?0 zMP4&UNcglWTUM9)8}?>TXX0hQiNy4JeLz2uTYZL9e6uHMk}n>gV0T?fa)>)?k5Cpa zXWa5h)5_GbaKq{nyUK|l3VkS>XwkBdDj_~r@llsNyv|bWqc(|nTYrV!9pf)NYU_wu z_rYA*#MUu09ey>E)ToeU_vVhoo#*V28&3Q%5Mqk)?|;Sn(A-aOo>%mF$RXQy*H?=z z>{2HD7p-#jea3uZ>hL^j%RG55rz&esd=ZwNabMW6k9~u5kYsuZR9*ldUXD%Hq#B{}}y%uFsQ;UD(dW_RN+$KLe z`A6+s1hl?YC2&7xRrvbn7p3TZLoEC@iKkl95=tiwB#XSbBHX+13sxWKG?dI2p2SPv zy(<2d?#e@4adT)ro`oG-u=V4}+5Uj(tFDR*(z9Cvvd1e_?|7kK_dmVfpMwd=^Yt28 zk-gk7W@8k2otDq~=FfoQr&~`&AQ!yMfkau!FAN^56w`}N1^QE)m2tX?&X=OuM*|j% z)*gZ(+evAi6oL4U+xQlh>z0?#wa%1=%*vA2R18bnatIGE#K{NJIKMM5UH>wu+0ZIx z+oJrg6?}~YW5MMdi_6!K4C@R!)lu{jfiM{n;1lYPRlUqTa}(7TeOJ$PF)ZxLyqJz^ zd~+N(Pt&&ma^XdPOZADX3oaZ6lIE}RRCzl(qm7k!qBC=vbtGeL zjH8~L2JJuPp{J-X;?%G-Tp@lYZL^!cO*%G+F8@|~ zdHTJSI&T=$gKw?VukhNpcV5Nf+AcagZohf)s7qAv(UUo*w+l^XJF@Kh#?__}^J$pt z!9yRXBb5w%7%r%5g|@CFV`W}`5xdAPi&yM!e(&EivhT?_#A@?hHsZ5nSm^!>N1~y_ z_HwgSlCKRYvugMMsJMjhIBs=GdE@Avf}@thvEEy^3U;n7+uF4X8uN8~_rzp`ZkA>X zqRgwPSjy6G_9ng$EJ5|$kH2}pC?z*&#ksgN(1m%$zdx0$551>HCP4V{9{Cen_x2Rh)Li_?y^EoE^8$E_XX@+jcyOR(T|MaQYzF)C4c${0TsaOYTZ zuD?%LQ6zDAqq`)4(yd}9ujPVg{6-+d#ZKYTw;(iG{E`K0|09@v! zInyuP!bO_&vWl$L+%?h8t&Tgcb$Jtpx$II}`p@JS-(0m)xbl4tk9!imcH3-@JkUxQPPSXZT3sPX-wOkUS7-&IiXlzsHKfx0aj z>iqBby&{hu%#_6Cy-ql*R^cys!6-I#T|BW&eEIO+u?H$N$ndf(yycRERGe$3;L~uI zn|Ba0l2ImSIcN0daK&FPs}#;+7`MwM#A5Yid36tsTVehU*Ub}2+k@Wj=Z)Do-_c#w*EoL5xCEYVli^2zQYqZoSMmw2y@3UDg z{FEKACr0m4F)IBx4p`pdcsnkXSm5Nn=R`4Cp2y^q2ijYvp2jt1U#O%D7{L*`YBw7 zV?--r=;4Cqc;p>}>B9`l)mOFCnbr4HRE3fYy*QPNc{{A}u`*OpLlIxRcedQu==|8l z2P`U8`n-0&yu$}it?1G&avy7V@oX{hwb+xa<||huX>qh6mE*pMY0eY3-gw)StX5wo z4|{YL#-u&(?C>3MHxzlL=pvRiZX58_&7%68$>MmORQ?y8yMeF$7nkI2#q5c3!5u-1 z7{1vreBh_|zTRqv&8C-A%lLvk-;mLO{HCD!M*`O>U*uPpCk0}Izs0`xbxKxv(v-d2 zG-dFi-oxyw^@AyUmcuXAPb6lKd>)aSoBesXEBSsjzH!!V;dI(_$Ib0i+)f{D{pv3s z{81mDh5i~&d0Mh#VE=uD6SZiQkki+2J=E_HXB0!iHaxWK7PUtc$o==G;*a_(Bvuqi z_r)B%NmmhWYCrg>_5J+vl{h}u&xOZ&oYy`)Nf^_=F`7Cgn9Uk`_fa&a!UFetEByKk z=Vu$m)pQ2hy^cKW;<1QZv@SQCrwzy9r#DEzabMX-&pcQ9_|_ejh!+^)22(@3`-=ea$m? z$BVzL-PymqbgDlar61=><<{S*jn`gM#77s&q_?)7m}ma3oFaEpOX{LYQ!;8zcC_TT z!-wgENHGC#`4azI-RCGpn@hxokMDbCbkXIlN{s>5=}~Syj?&>nX^!!wRFz@w`uqV? zp_MZ(<%2hR52;lsE1p~SRm^66>e}Y%p4nsV+eoK~aSw0h*cew_0`@(cZ~MvZ8vH^pBeyE2WC z>*+U4*&DBaEL_=WddSZ4exp|YaK($~l6@!V(!97-&07>D#tqgBFosVX>4mL~vqKbP z(tqh6lTqr5VOld*ul|(I%i36RC;`vf_eov@>-2QheqW|J0HtcJJ%2_Kkv1!2(8NKU*~;I}h209qN!2Nk3XQi4Ub- zM_k)5eQd(=a21)qF?V8TVm4Xh=JvOd9$p2D*GUYK`PIHE;oItu_KBY63ltIal(6`mNMF)V(X$2@7ZwgMwpq|`Q-elE85wj}8GiX4gK8p5ld zQ{>W<9-xhij>HYsI1J_BDQ<3h<1lQq@B38UT`w*iQ78C67$w}2Dgv?vu}W#NE}!aeoEJ!Jc?KtFvE67^YD2%{WGVg(Tl9cV((B2j1@ zl(&N5gXmWg!cfWtf)Q%_j^KoLRuJ^i$L|Ogb~_YW9UNpKjKV0BeyT#2KM^YMY6M0N z8W=^eL5ZtiYx4>?Bw!9n3Ef;lFp!}jtyP3F@l=;JaO%V=f&sd;1{U?xBAJmW3g125SF~;2=XoeQOAL;;zLXVAmOLayoF9OFu#cR+<%s!4Wi}RWcDqVF^}R zK;Az{TgZr~Kw}Q%bkOxxgeVl4h@ezLVX(Vf>`)kzL0FPOSXIJj4w{+-5Mk(`NiK2` zSS=(9OR`WV20#+=3!F%Ri3|&APb1hN{$IfEH$Q<%1Uy;6>RmY~ECyCh@E1aZjC6({ zVYS2$u$rKi_&-`HfOtH5f=>^C@R*O&ANoGK){j?jY0sKIAZ>%foSN0AE9yG`IAqY4DUK~+^qqJsob zxc^YV!6^KVZBQL>Btauw+)Q?v5g3V;{btDhXQsG{29-HPNWq;Q+DX( z4uTG<-TKd1b=Wv?JkhUcWmvpJh6oZkh78F>ra~~0Jwq7D0A1Muw(h!w4vAJ)&2U4K zTq08o?BO9phQRU#(8_;2fL8t=51=7)F@oLTbb<#sAmcos)YuM5DRw)wGSLHQWugbr z%2)_VgH$0Z1TZH9F<|@|I2{eK7=fey=tPB9hGB%_5k&nNf&S-zBiIqDs?cF_!ZTVV z3#$qoZU4mtS_LwXLnt88Dk$RNi{!xEYmb1rZAc_F94C}^%ED+BG^BkK;RzX&BblKR za-<&gfdZ`jO%5C(d=o)|04EV5l+sQGECwkG7Bi{h&@z9?f+imUS5;CXsd!aj9~0_` z9S{wt9a@E$wT;vux&cIt2o-grPGeFaPH#{kMKk4)l#FPVKQV?@Rfa?;k^ay-N~At? zMi(q2!;{0yfJHdyI295D3BO0^KnoN|F{si7Nx_f)M>H|?(5f&j4p1u%2|R=<36DoK zz{*!tNMWLE)&HEUiiTyAsX{>xNPwU!hN!K2H}GjV&91h8@4ymv$PqOXq5l7Bq)Gxq z6$Zlr!V%o*T!Ns1_R}DF#E2=O3Lqv$E%Erjk^=+=9Wlljp(I+QD+KW%m56nUS^-Iq zK&wG4_Yn$^JUx;Dl+v~y5F+52%M?-qTA~39)KsA_{s5|6HVogIpMq zT4d_Pb^Q!TdWeGw#I7(S_|1(8#P0h+1SJx!rVd?YLh?cDOyCeW_P`UMfiU!L_gK+C z$J(J$Bx~SCZy}6E!Jj!mD$K~e2o#Da&4vkRb(e4;AxT-$YJUzuqhOPu^UTO2&=(hVf1GUGKD*;uB&_L&yfeDnXzyw%dQ1;AOKym12J?Rh zqG7F}2)14P2+7X^1lO{FQ~r;VXgEco53GNds}V(LJSMn`6}aku;6|e$aW()qD02i= zl39UeV{8EK_k`c%*nucQs}?|`VfzW$k4D1*@}HGxDD^u+5eb$M57|p7+gZE9{&oTy zjt6i8v5upOWXS>g$qt-=Q6_E|WCti+OCnXuf1H3J@|S}gNHd657%WTRL`we!7Y0TS zn&;THA0Q9gC0h$r!f_&1b`7vcKLh?dSxsW26 zT%fgpPeFJ?QJhFdsEC8)`@fCDkc=Z`9hyj-Ksn&q)ds5!pFt?^UR>be|M4G*pXGA@ z*`Z35TB=7*4^eUdU;hDSGsO-3M+)FW+(0`DKA;^T!k}IiP+spcB59$UgbyyMlHAFP zCh{lPomkizkPRmmZjcCC_=(?NYHcD zP*6|>ITs75K%z(pp>R-X1-T?Ii6f&iMD~Ejkk$e0X)4M2p`(1j&mbr1Azgmpm~(uf z{1ONd0`PG2R1hF-^hinsRvlsyAr&4R93aAI9DJe!^nxEC3HC8TDpG*dsY5e-1Zep{ zl93o6h-V^&f?NbhYk{l5fyBIoV)y~*|GNRU19B1G-GC)-=-~%B!!H0pCU}++y~`>I zGQgXI08$y&1*id^?<@e8rwbCC^{+xiRt3=sgRbh_K`3_Ws>Cf{30uBjCnr@rbrkWj zmLPcik#G{stHE+YdxpJBWMa@af^h^I&5u@xF(USH5?@0TiJt@1Bt(Em07;DiO#)U@ zSO^^bQzz#fc%M&0N9Wu!jKRp5=o6DiIjmoq@zH_GC&GK;3$~S|Emb8 zB9NFJhQ#ck1A;&y0-xvl3r#zcfx>8TG$8gENRFThvnrC2Od0kx1T(yO5%6>g3tpF$ zVf@%A0Mh|wW)g|?f@VZPM(BzG5~4)-EmI6cnArgkPk+{`64t6bM|zQ~so`WG6;a?0 zn2%tT|AP=iEEh)kh9A$iH@}K&ktYatP2UMcyN{q08bVQX=)QTEs4n zA$Iq_5)=bf>XU;PJxwGv5@1SjCurIjWnvDh0j*#K9Uw!gT|-oe=t2CFKqX&E0Mx$$ zi%}ug-SPi+z=6pIRZ0SAVQNaq2*JO6h*5#@`mc*%REVSuqXLHu8+7nKNc?oE|C4?g z6=J~(lqTs16-WbK{zeLjn#u*KK`g8PB_BqG7?D2my9R**OfVbrmj(u*Wq?71D1lsM zkQ|hDC}E7M8WeN@>BWdr|BDL)wQ>=PP>U?+7iVO^MgqnBdm|cbM8g}w+lCAjDMN}E zK8z~d#^IF1s1kw35LqLXrwCTT;i3vx5jF_d4Z`KT92_px^ndaSql$x;^^vmBEoBfc zPvw!ikP!sB0=oiI7Q9kv0XmC718z--iC1!@nD`&j#3aM067d*TCW>YPd>DoUkWB`t zK>@(wtc;|l{}bdG&_@3gy`c!`!4_fZAtj{r->cB@sy|v#E0VO}`Ue0t5&)n%Bb zkr==UVey(uz=Myi0jRL}|11ZgzAIi2(q05k5Ksk9ki`Sugn^ce!Mm8SA(E1TNH^is zLMi{F3s}a21r6hz0g{UGZ*KtELTX5ENLHF)HQ?-jazfA!Lwv;$#sI&<$_Rt6$HMPD z7&Qz;bqwgfn?O+b0ti-&8gd`RCxWDbW_y7Tht>XX>=J1wRLYA~C-q32GL%$FE@(`8 zr6yHHkcK2t#CIQI4C$2%qz6$2(%S?HT44-{*kVwskSGe!^++|~A=a-5&_YmvtoIQ9 zyodteYK?%7f&rA5429%oB%OvLCA~cws)MBL!vTy@dx7n6BO$FN2Ymzs5qb`}8Wtl1y~L5~f)s|xe~ER0$Zf$= zxR(A?uwhyXV+Rg`@une=-`9JIErpKwz6U!7a&aS+qa9iVm1U1YE@GWPqx(e(R?4T^y{9)!=wsuI(+ zWj|0LOAEjOY^`wcj0jV4j`f3~5BDN9ldq%1tdB&4k5-#`&bvM`1?Jp31^ zc+f-xO_78F8^KK+7!t(Oy{1G~WlQXdW`&~d=T5CoGq0`Lrs4q&|s z+5p@%o!w9(tt1C621g1doVpC8sQo9D{%d!37!nJ{5C@C@AOw#S;ZVYnLaAv3=!DWG z`GYt{gx!e468sSWh3f$~nq-0rai<jG)&qw6=#!#|$b4b(fbs(I{?I)GkXe=bU=?9zNgzWAb!AA}5R8dnvCaDb zU$I1%D~usBT&UHUB$mKN;S_?KXPzO+ZX!)43Wn|Who%k!!8Bn00-=nMGT^1a(P&rZ zvLQ*P6y|SJ)k&rjN$g*^Vo8KDARVDhGTy-igsw#c zX+(x4a#x~!*m^$%ND~ovq#}XD!f+899GE?U38oZC+CRkvEF*B(-5>xfn8N|PB+%r4 zu)z}Ns=&VgePINpu>yqoUsO7bxnuu_>Lg&;3;lCu9bM=X)i z{AHyoG#LVB$ymUMZ-7k%CJ4S~Pkev(apB12H1mFm{6p2)X=&eB~kvR&g%xxSMD^y93%6I5^<6fqRkdmNB4bsLcR zFq|Yo@U>E%Eh$=2U|vZOfBiU!`Pt*ZafHM9{`d?_q)mT?5hPNC1jz!h0vp*Oc^j}X z3J4(v60m2NW?{j_rL`@%hsn1F>)HtGL>)-J1@lmN_uVa^?zjsnuK0=66m~Ij9QwE1 zsswUH1Qu99IPR`3sA_=n67?1NBh(IyBEAh{Q6%pW876ed38?_%02n4LI#L3(IZk^Z z8eFANLi+YdPQvX77K}FG+YywS>R)e!z=iDOa9l#U4#17}_Q0ISz#RB`g|u50>?Yo= zkfYSpWFQB7V$Y_OB+^@gVRl$FtSndxw~&8Y$N6OvK4=&p5y;JPw{852gv^#Bk?CBH4*aG}5&jIkg_s(FOF5w}#38KgTwGHN~NB{~^t$AmX zTAY8YMVbj>0rTCo1+)!*N83#hJ^&m{mxa{;bR-{>2s9*c5~%^1xs$H!5Lhf^9*P`wGr6EUeaA3p&aO4wjLI8UMHRpOkiR17A6wiAReBkZ_JPcoJVb#^33?HO1 zaT%=-_;Af1F3U`yd$@Q5huQf6-R^||hrw-^NN@?Nf&aTDq0B;3ez1#~;4{Fk)7}6y zf*t$*v4c4C6~^vTDiV9el18vtb)tPZBAIl6mO!KtN3nl}A%KH8R3a!2k78wlfGvUH z2u23t#W?&m3GmLZG6p)zf*<&hP+E~VWi`m&56KO9HGD}u;}0&W^#cH{Q1%D*Wdx9_ zC_h+8Y#yMO6YD?h1{GlLZdpZxS0NSu-B%$Tag+(K!Vz@d;s|6;kr79{g5OnA zmf2$vk#9%)p0S*t?>oCE#y`dlg{yWe+iNo<>N%zrMwOtxOB4=P$7F0tnNK0%u!k`I2lQrZ@lEn8o5=O!} z(x?qb92^Sch$CDFi2e-8SORU11F8A-Gzi@vVW1ene`b-vqN-efbs_6K=}{( zNJ_>3*u5Q&#F}v=){G;vW?>wW=7FDJIvNj39UPxv!U~iDy$`TDz+24~36~FZND83E zAA*J>ItE(!qXl?Tf_L4(fC|_Y1*!%?i@)A6aKsCJ=rev-all&PE%T8;@kvK8?InE4 z1)4aEv zaK!m4v8oWKxZp^*EkS%2z$(~SaI*>Pa5x(1@CqI8BH z$nP9z4+O48AoVfejTP+pe{G$2oR!7(@ISlv*}asdE=Y$31Bf8(ExY$#L<4s0z2W|% zF&dRb)Tpt=6?;L7g|VTcF|l`D6-8o+iS3mn8hg~(Vqzh&VKlzqGc(V<&ok%dk9e7# za^}pL)8{-HMwo|A!`*Otugn(wVbCWC$)gNeI4Lmv}mCYFos|+K#uvfauE-ApAb9TJ2 z-F~Zi@N_0S;ta=-`jwr{WLX&ATM2ow{jJR{XYzlyp8*&B_RP$bzE+OdPMs3r+8ASH zVJ{$i@QnH}_{}>HpLyh5U|4e&j%&O5R`cnZz>x2ZJX3TrW;cCp^IMv?1rn>5<<4Qv zygA^U8rtVv;L$!RxqGKzww0YnvCF)69wca&_S?6StG}G%@ZPUn%cjKVR^2{&ljx(F zGA(QUZQ4Iwqd$(J?wjl1_hZV>Y?kUFHh8N>*8p+0LYS zaY_R_b5C2fwOc*VVTYRcnN-kRf~aQ<#COhm}{57`ui^7pO4Gl zoOpq{<}4wk<1dEOPoadRF^9x&N{3b}SxnPXx0`G|H6%$rM5`0>5kj&ql?!o|zD zgqO>&cb9o|WypLWcBplT~4prm%_3t{#;ImI`?1B{&&3= zhgwaotT=CyS-Ct@tno=!wA`eR;j-b>1jby>&2-Ijj;r&s%tnpvC3E0qgoY*U662qx zY(DEzD;t{w;2ha7g$3@1S2^HNN&UX(-prh@T*kgFbWUlM!>xF|aopvZVjr)p)9SQU z3*67HU=%xLGJn)#E(eMCU4ghMm^ZJe!Dp^AY+pm?Rn&_2lsemC8(>aJ&>=67-OOP=qe8#+~1PNl~)2>VMS)Lq_ZBdA_3jVD?D_g zQwQr6!-~)BG>=>hncDpl)VD2f5{HiLqwklR~?GUbE_2vRqwu>x={om{;+M0~N1sR-EdZFt|x(DMd3H-Nsst zjci?i9eA-vfg)=0x&3lt)eX`tOrysADg?6LxXz}Y+I}NHZfr46{#wv_4~c*~EJ146 z+>GlUr_J60$GGjToM<(pek~aCC)a*GC%5Nyo;^*d9{RkB&ql3yj$d&KWtVw)u@@RU zl)YVD_U;8ZuH4JEvd@7pd-L4WVH@bPf3LVC2>$JaO9fyC-GJ~o;@4b|rr!Vz+ZkYX zy8%A$jO9lEPc@xq6j2G2p-(h4V5JZS3Oa=AFFxeH}M_7__rgh8+zN{FhbaS|4Ol{|5r$B9sgU&C&;_5i+%%Or~ekg^Sb={ z^KVIb>c}s@F*Db98E^Kv8L;ia;$CI`A?BN30?`e(`okGrQ+F$2#wwKgZy`Ci+z|7l z8)3Yc{RTE5dr1a&Zo4rvY*1Upd;KeM!swro+-CS{#xG8T2u3c?VTij3;r|ZhFc@>{D zS@GIv#XCwXE)6wxE7q=MXC7LQE9V@(1taaWTR@$A5OEteiGAL%=j|Zznm;x6Vta%a z9?A^uQ)#O>zi5}a>ozvet_H~1p=Q>t?DV=@gs=c|S{g_%RJ@0@;yt95*h4x{@F?kh zLle}%-aIXv@gt+M$=nW@`CGT&3b{qZWgcGjDidV8KUahP+wX(~+bcde+f?p^&`t){|B>L}z8VP_axEM#? zDUQ;1*VR62IPp%<`OS@-`_p%Nnv@P-+zAoK9gn<|Iqln^#dkq8tM3HLyYE8q(BZYa zT*qa1u{d#P?BKhZ@sH0iW8Zt2(K-w(^z67N(G#C%3n2e)ax}3e0pmP#?%kQmquVOp zeOYmQB}FH9iU0HYdosh8-viwZdZ2OA;KU3S$AL`gUJzq>h%gJ6`E=I39FhH}%Y3>Q zK&@wU@_p8j+xi9O`n$@}Vuw#J8kEGKCs5$yK+Q5J;d3`p#To&|GdPiBr==llDi zl-)NZdvNxP{F?p%r}4_^joiKmGBYr3PJ1A;lk53e4-oDDAR9Pu7=q;12RR8bAtGih zn!i5C4t~5wJT1&aHmcq92lFCQWqRl-yJ)NOy?KnWqP2}5PEzxuY-T@!jknE1qLwgA zBk^m?K(Bd_rCT4SS$5N!+Ko@a++npSMs^VSGs34|>0<51RhbEw-Wg?0epP0JEZ&e@ zyMORwG7o14nL{5&h1^))?Dag%(rX%`X4|zHe+XU8pfcG@9p&5@W!HZ#>+{#a&PbMxxV*5K^3 z)dZ{B&E!Y<52367Be~>`M_{6|?8d2OeTH7HUA?KH$-F&ID1k>l7JyGybFkMx3ca27 zbf#DTnl43Gd{ih?=8DHS)=$=ei&xHWYypI2QzU7S?u}%2&i`Evp8q`R;TfKWCq6`y zHMf5`^FxRNwZ<;L?-JaTO7WI?m=o|$W0L1ID{D`U2E!t(~|2htc zR|xX%*b|M-`_!t6Nm=R!2kC@$=@!Rh0l`Dg=WHToMyuhyJDA_`}@phV%WS0x!>|6 z9JS#oj_^DAwZ~I(iQM%>6FT)NuIHFPGp(gfTI`@Je$Q$T3Z`ejo5>Dvilr5^xpo-H z%9k@6G<2D_pYnIhZ14v_?DIPq@dJP4x^NqNjjau0j748frbFcRb&p*XAE90JZ%?t= zTmFz~lZ%;Y$Kxl>5^iP!d*jT_eD(IK|9<1Aeu*v4G)JpZ@kIq>np^O=oXs&2y^$xUL^RpGeexw>#TGNreRmOb*P7!F=% zTU5OAJO{J*|Hb#N<~d|c4Hes%mjxQDNKILb8!T`3UR%S0BqNFYaQWkzUSn!WJe-AB z*!W=)(PiHHbIh}eKUfIHtObHUt@RM}t2q!El)%JUe{m9GAe_pM+yD0*qWQDOU`ukG z^&wVKGvQAjH3=6DbH}KOorsHt;^7y4;tM!SXvtka;TPU}$dC9+daabXY)eWsn}v5v zsP{!^I`<@+!<&DGfbw<^+`7TZ3*>l;IrK$`nSn@PHpr8l^^nLje}PrVo$H?((qV3U zF*Ao~z4YvtFits%w(=Am%^}Y1Zta_@i(lbv+CRjc z-2X)sI;$Q2>0{bFD9)MaKyi*l^WMvu&D;!Pdo}vGAI@#a4=atj z%uP>VRlaae)H1f+TZinzg&;Z3xHp+Ow>}t6=dJb!>xIS-_I<1RSxIfOs{^4 zyNris{%ag30Wj%kWyGY{xp4cPkJfd<>mn`O@znz0tY~*^n%>|%-g=$m_QTh_2C2C> z@2oSix(?**9g_U8=L%Ij3!7Nx-{M*DP74q}d!1RV1t8E4s?Nd?i%qjm)?NAzDx2t` zuamg8&l`?bdnfjWofVa`zjx(i*lmHjQLw;hicag z--NK%|BbFTOKR?0RobDeH~=i|aCX*-_wrjF9vFmO>D0f0@0$cB*+HM`4(6G)e}gEu z_#`v9U-HhPyU4pFwj?}e)B{dDVXFEPI!A#M+g0$n|t2=&V0`xf$gtA{T47IUfn; zPyYJwQBm1+m)Y-Kk7{$;d)N*zs($AB_cUSW$fTV89@diB;~X%0C6G)o7foTO!#`lB z1fyEarXR=|LEvrDrFO8+U6|acdpmB4&dueshVFb9(!e6`H7OCTU^1_v=3L-erng(^ zGH<-k4m?zN7cG7^e;<0h|3im039UgzL+z`5kc!XmwanDkTtYF;IZe~-{UQ9*&oScz zP_e`NphBSOn}BBdD$70B3+iwJG>>SnrRU6x_YH(Vv-a$$B-Ih{6rxj;nm*@45cKLt z9XcOB~pGk8JD~f?!gatOB{pioRr}S@n;alY2Tx0I8D@@ zm4Eef+`9OzNV2qJ5IFtKn*z_cu~D!7$ua1;53hqP#PcW9TZ#0`e`Al@qN!@kIDv;1=i_lPfQgy7tT4jIlXXTJI(hR}~* z@j1ls%)h~f;ID52Li5?@jvD-vQ*gdF)3Uxg z#;hhTlXINf{OYUf7#!2G*Ck)F&bwcFXj3PLpYDmTGP6+v4_pWLN73(R zCVh=nbIMozI_c}oCgOOz>FdmnahH*sqHvzRo-RN8nrZ*|4b%E7@9bQMIj3ovvEO)L z;^BSPgZIv_K)1qN*LsIJ|H1*$Vnu0}Is6+=*6-zyGJe8;A+0gr0O6tE)();#wg+Kk zg^+ppzcDVjfEE|TVFs9&*Lz${N}L?)#Uji{7?{T2ryEF+rJp(Wzy8XNPc0m4T)9}|$`Jrw{~Zpt z`Rj0dNZiFvWHl{CD_+(5^plv|B9p_VOH<&8gg>F&b!YYmBz;msE|&c{`aLEPQ;u{1|+Ed8E0F z8Pv(UvgER8eWFLLiK5=4EM|q^=h5G8RR&t3F)uZvzc}c~1{dV~@lK4S8k=4-)lS==jT zc^3}Gv6Us0%C62?+STpr(hr+zt6OTfx0Sap;wO;Rw=usSfrrnHBz05Zp3xkMqp~3r zP3e~$L|zeIkVb5D3)`&b`mn`5w7ky}yfg=BVnZh=3vzOo42XgCf2h5z{n?_Zckw@XRCce2ht(!7RN_ ziep*zHjiu5B6WnQ>GS(ScYump@wvK*oW?F$IjkYj zO-w@P1H-7;UdhPE1&DT#c?2Y|MY5z|>z2M?tEpd%t+xK){CjEZ7?6OdX5Qp|!r|rp zVr=<|u4-W$4}oHV$Enx;j`(y_mW;9G)Vw6NB-`^BTriI>GE%|U1hZ9tE`=?kbxD6h z+B84eKiX0L%b$l>4P3$kYd>k6ZXOyK4KwR+6z2eWsFEotXFU#8t7Z}Aod+;+v(4#E`N4?iz z5NpF%#}9^>JsH+gf*EKTwRwI}eAaHJRwJ(@WluIOGCXYmNSxtzmq6#<&~%v*gA+h` zW_02p4(Tt0Iay18pR@whbAveT!9!}NU8`}#WX^*AX=@cIKhqI|nd#g??zo*{=#Sf1 zH)5=%8iB~6DS`F83+MXNmPb3na%|A-h#{cI-HxH$4m5d8^`W5AqpTME#fY;gTRt=f zE}p3Oe6gGJW}&56ABtwijva0e zv`p8RM@D1JcBB0Ms}oZylQ%0s5Z;mbBcf^M@6)2e_yeEs1rEfb-8aFug?+}`^rl&# zVzartQ)iP)A~+|ZBj!;~?da8`S$D`7RuT!Y&-@bK0az?XhoW|7)5pc!MJFSS-TPFJAW)QUoWmV?%)s1>+;X*wymoBd8f5H zQg5vVD_igH*g6*UHL`q8Z@G zB4N#VwlG8{lr5ytTku(nTW=_vo)}4Rdr%vQvs&oQ6Y41{1-#~qHjL(A&d6?Bl4__q zaE-{HiR_hU+mo0`>fo7ee^3 zKy3ZaNp9PdfbHj#IX`h}0_#UDi@N{t=J8_m8Z+Nka}oae>Nj0d6Zt(yc>-*F?*G5DIg8zFYSa0(kKIck(j zRvCPJW_&B!{?9jtc}PS?&Oi!SilE}pdGpZ5(O5Hjn%mWYM#Afsm|vO#%08FP3X+3u z!N$(tgo}6TRQ}#J9kOuO*HHVezxnIN{)|(KZ~;&rnCfouP%~z#Y~*BY;1k=iK1a1h zeawQXEIGI&OIrQ6PsQY6Dk;L`cGqqsRDoiI5|m9^!D7h5XVrc3MQ<& z%k26;Z;Mv)zVZSJeyoDVc^%$@K`V$|VENb=nw@}ZgCXK>zYW`H}1%E$<6B#pO$nM?s6W^Ou+WXbfX zX>{ymEI4VC<~{4Wp-iTcpotwqa7K>yZ4}T<0mq~5z%bb*B5bwapn{gdcZ}7HDo;yYI;3no@`DhpoO@(MC@XRhmJH>muGY?&~ z7SSPuiI|@ht9-RUM0`n+>VuLZ$R*{UcH`EdJUs6KnO@rsUHn-WVhykmYk-9~VQ^80 zzp8jC-k#1Czq}KMb5qezH>f&YuHe)(GqE$i+`P%K5PVjII=Ald8%+&y8uX*JAvh@H z)X(n_CM6HQLhMmv@uG90&DkI?t8HKF4f|y$h!8xcrg!(`wopOthDSP?_W#QM zWXB|dx4#oop8(u%Ax2(b3@wV|px{$qW5Q|UhrLGf!w%+0tlJCn`>csJYN8Fh`<5~! z|GyGgIJm;v?G?E9n-!3`YdMm_xHTtE0S#$RC2F+^BL)ASf)IekQa82_vnO z;+B~lgPm>4rf>nuIQBJjH>J(OJ|IXSt4Qv{P2->mDy9px{i`3n#y^+LhDWfo*Ga27``Sh6`OgiE9rqPcam zXpjU!H<2;KVPuTRHi}NA$KX|B%$z?m=Hbn)Mk7)qQ{d@`9b|>v)0@i;s4av;1dcU( zMdRV-*&njd-J~RD3WSU85Q2Rz=CvOt*U3_^k0Cr*ky6*M&t}Zr?ZAQ6P?)I_4TS@| zH5*(fmg%s|*!O_{ngbObvjq~`roKMD1$=Z3`EL>*a+~k8on`X_d61s;j=^au(L{;| z6^vc@-SM}-u8G>4?ZJ1MTegai89(I0ZNZjJVmM+;c0sC5wtvBCla7P(*km8ROcAY3Mj;LNm6_BKf=dlYM@N~Pwt;Sr+Lq0{y*)&1qlgD=?H3u4T%?FE^XNT! zN&J61Mq8od#^daTuy5D)+=f$;m4b0pH8cv9akciU&1K zpj(2{K`wHgK(-LYC7bIv}V7A*m#t_IBLfCFs zhJ06d2fsh8~Q!G(1#+?)C5?h_MFvO8BlM(EaN@qRIpLx~KcnD;)2lii*Y=_|CF8flK& z6E1-4Wy#8X91K!IH#A5Ey%vQeXKIU1TkHCCH~HJMjPF z^GFTz{L!NIPY1@s?6u&7DE-aZGL^+?YM5n@o~=IdQ$Gw_(C+Nn9|7jy|Ls{-urqrv zcG;PoeR5E=4Tf~bkE0GkDD!`uz^A01YOea8pwqIiE;IQjF;^uA@~#6x&bj12oA-ar zL0E7TIgmwiAdfy6#>xhzaQ3>%5q?Zda*VLW zqojb2;07g9b_mB9F<&kR3nV+^SvWf8p-22&Xly~u4Ud@53O1=QgbK-AL*@a;#-l_u zNcKbDpZkT9J3)_R%mQ=vksNr}&zbtwBjKP<4|bbHZIo$a4tnFk# z7r35pI;px~$ql^o7zY027t*XiwRhr3v-VgS`3w3@Iu8C>HoF{`AW=TlQ;&b1^H?;! zSJ8#fyG-9-g3%XFjA>xlaomfik7J-!`#NgRmPz!Xvd<~e0=Ns`oe@`|RSgCn4=q1= zJYd!tVU+``Lv3k#oye?qCGG%e^S=b_)xWGi&U3=mr=oi`o&-u|9Q%9wM5_Vcd;&mQ z4LA*;(+@rowe&xy$>z^%L_s9&mtp4H6WE$fSkxo=0FK;>J5GaE$DJH)4eLDQWH@NM zx$WEGt)$W+S)iA4~CSAuUdq;fE8z{D^~L z@u$S#q~0IlX{;^hA;p$E-5;_ko`DB8XLdM)2HYjR2G`7OHf$#_E6#{^G+&(#e!n~e zY;1o9zviB4%RnA`X7p3@k2ApHKh6Zbv(Dt#th2~|sF*{~;!m$h!)s^pr|D<$Yx>#t zPy3!7O*XyH0W&UEC*Q!an0;0{&Doc)nUv2VusQB*5Z!eSh$iDQJGP@%?q?p!G9D)# zJ{E1hmQ4|?%J!}8VV+rab~F;Vi!4E?sbVId8*OU-wLKnzozG#hr_Tin@phy(?lT|1 zFGV)rykFlqEv!Hi*qSxb@Sz=X2+RY;3aIzP&%?1Z|6JycE&yt|4`#pfAnHe??UeIm z$N!@&P6t)Xmo4#boeuv*nHjuRxWClXv6qQAHY=~bxT*teuHWGEu_3Nq9QB%5of;I! z?yHVCG~E%0rWY^r5VF9+r2uH%o1b66EFpj$o#w?w*7a`T+jJ2-;j1`Xn+q3#llKK4 z@e*;rNOK&x7#OJ>ic?1Z$%r9l>V@>1yNG@QVE+_=W%KCuHiXc!1b|Lk0+S^vMn+M; zy|3ALu?J{Sbrgw~R=qK1X*|N7g)8i29+wfaPHKczR?Pb98YJn;8hw`l**j}A;~+_HO7Nd1|V zI!xEa(N6A=pSy^Dtlfkjarw` z;g{AqV4wDQ&GHz5Xm)myJ1=FC=H-AaC!AWu@y4&06C&UlzCc8-V1IcRvb9+uzoN@H zd3k&;K)Wve=D{{{{;Mxt=4V$_*Yi_QY6y-Y>#1{(vm4_ND=>}I)6ILAxoPBek>wUP zOJ(k5b&kE#VK%xPy5w^+!dC1X?DH-BBUjjDoX$AZ zl5ZRKKz@09H+m_Scp~+FLNNU#bCo^azw`tUF ze5dN36(0Kun(6c@h8tbW{??o?s$Ic+umURCS)d8Hj{i`GIrW-q?+(*_HN8KO-T^)O z&uN&Ku7Ms)X1IJm#)fER9kcpc;QG}yVDZiC_=6+LPTYD2u8f9I37`Dz*n(c^S8H)8 ziMF658lB{rmag&qXj~FS@lz82bsCw=9DM`VVbMwwzR2lYb1g6vm)*p)Tt|g*8y%l< zU9^e(jrB*E6RwN4kbexk4wAI7aQN#K9FLs@TxpzO&X@|1^-#M}LxzJ)mU8aY1fSrz zC4|eiMHJX6U$_oIh$GPIi%4GC^bC?>`8A!s(KYRX(Xs|i#iD)#e;Mymm;VqqU*i;B^*ptzQ?un92oTq|GblFec z(*8q2eD%aZ;0sk!n$i8+*Nvf!iHFd?+T(SXudBlA0KW?#g=ifI(4>g+Ew?=(>?!Pe_)nHcK8ujjZ^(H>I+feLz|K@03gW2g0^rP)> zjrM5h?78~ZX#WOtT;I%q0Y1$s{*<-h*#J~g$& zKgK{Yx91q^WU)%t;qpTHj3dwW?~X={;yZ4xqYr_1crCgEf8|2H?>5&TihK6Vw-x<* zKCp)p<%WB8$ZJD<2GDQS<=XLYlE;~Dj$h5A4QcO&dkNm*mC6nm&1>^Al>ho=DGl83 zo@m6Tu~-Z~(N+7jj>khx#_^|gsB>VR%4a5f$>HS%9~<-N^5#W{ufXHKRmQXqZXw-I z^O@ZVsb|3!o@i8HX7QU|J+C6qVecEWJ*VH?G)V>q<>_PWNBX*!9y&K>Y z`urzj_)d6Rgu;F;dB0yDweT=@b7uJpwyD0{P~J?Z>Ar{D0j+mVAfXfuwcZewYH1N0@6;EyC2FS;$=lRbg@Oc4uDdbBAAKx7f>vBX@@`q6JsTJ`T z01{IPaBeDpKtZu~Dvx{k{k5P}zd7h0uBC5|d6Y+gwHUp>7A0>kP-Nb1-zN{0e1V0M zKZlY}|0|&+uVs3(-|=vF^V3Yf7K%}O)Zu*_e{Zx^OI!?^|K`kh_eUe<1*MSrg9ESZ zE09o5*)Cu9MswNMX()RnmpvEp)p}vI4xwcb`Wkf|2rWDK%gzdntE1M+8hRm7_A-KU zh$eR*7VS2RGXr+_#9sEuDtly=y`5h6NTPD7gVGag+0%U4--WVEX{C^5r`csO?6Y9j z-WQGQc2}+JDb<&Fq-LZAxhrwn(qKEx;mxw+4*YPlNc|2!o%@R~6^6`3m{T@ugd17$ zC*_N9QA?|07WG7v=XhXLX()$AUm}XKB7PO0KjG^$(Oxm1_n=p=zmM0&J3J7L?BfPf zK&N09JP=Lmj{oi11^_z>=Z8-;Y4<4Q?X+8kA90`fg#*=DJO-Q;OrlBpS~T&VK1NTR z&C)(F&g5I*UeYq>-g=*nZc%ORfOXLT`iu_vD)Mr$j00m;0SWy;sY_)e3u!C8}}ie7@Lni zXR7yCMWf6!w3@xw^Ga~~!~8QVkJ!s$MofwgA>L%UX?SQA|L`m1@#{WE-!YzlCSKY2n+@7>=7*2SPFk=< ze)Pw22+n?xfTv6#k^ z^4IFIT!?R5f&9`P_`^hx9P&9GauUgw9{nU+nsrY^BX>w7kj10o`&5XveV>R31o4ZN zT9R3OD+?6=`&2S3FW|$F&|)EegHS-fS@dKyoTA|c!iIlZ6Lrk>_sJ*u&^bscla{zo zeCK?k7k`Sc8Y0qkt%;`gjj61_$H>mxj_4SE=opQ~_KJCNXV(_LB`ae6jF&tF@nCxt z70E;RIni@z^9+U`W%J-ct}QuG0&IZUTRR1%2^}bSpBkKe73S;eEVd{SfGh( zB)*KYXe{6G;>A`7xZ$_I-LkM3oX|YK-NLAtJa~7y8=^YbxwYqUcp&(LVgTFK_JG&>w8n)!S%pN@4N8`{1$!NN_`zHgmhu6i*T0H}_Z;?Nbf!ejYHJMpGP*QtDT*at z9ncgn(b4namr+9l4y}WhHBast^mTM!!$x)&;q(^MNf%{jx#yGh(N{yw#zUI=nup)T zRc*I3aA4Eo!In~zy?JypE<4Q3KB0MF2A@UGs{@;6HkivNH?^4mp4Tv@XS2agPd1El z(V$>yCr!-1HfkE)(=nv!iovGOR91ZEgLuVnCN*8y%ZVCxcg~J(cS9NqJx@$->S!?M z??iXI%J?Zwk2P#$@enRzPdWv0XHVa$P3Md^D;H&lx~)C3W7Ddv#SZJtJ2qaY)N}7n zO+RkHZMyEfhRHpf@6z;e!$uYZ;UbnSlZ%wwdnWAGwB?5KiG=fZ84WLtYC-qJLCV{_NLc)&x-u@7H{3l_>TtHT$boDfRrL zU-O&>Grip0*UVqmJho?#0nInoCk*F%OKgKrsyf7V4r-n{DZ@8p6T4YlYF=cHn$3C-4$<3C^yUkG-W+T&ZV)JK& zu$w*C7y?)m-KSdhO2eZLvB&w7(ZCr zJPWGmfgS#tP=cR0WDcbq4~K-V7hK%@-6V7Vqs)HmqO9kD=Aq`rRf_oi>+$5Jo`Y63 zf6!o_d&8k^Y|qh;H2=E+Q%<07c5V=J>zmNnrH?jmI;N4Vpc)B(`+D%i<_TuZo6T35xnDB1Wdd)#+5CEg#G~xoE=FXo{))LjeXIE_$%m>G^UGxS2E7 zTrn!!k~r-N!?O<#3^hna4(DuQPKe0-9{wTrfI&s(HS|KU_^vS)N6*YY7$5!+r`snN zD7N=}w`unB)#3M;oMS1t=ZTYE_=pibXlMEykv3W9MVC51RXq<72olUEpa$%93sQi|p!HY2c)q z8_bO3vPU}(Fr-y6fMU7l565NuZ;+4x4U4jiH8qTvFWow7C{}u&S(KgC&`64&l{@W= zvoG*3M-ii(?NNjOgkuglv=7z_{(sZHG&>{0gVt^iUYeb>yM(Ode{Dy$^^yM;Cc66Nh0Lgn#VpY6LF&?2ZIUwQO{%>{fgqvO}4dnLS4Z|=x0Afo9f5Mwnc1L+gP9a-^7}O!T5`d zA|0w7UB9B(W63sZ#OA}}kPI|&J|+8+o!%}sM6!)Yd}nuvetbOC2n;$B;YdNvEcC+> zmF|bc3wO{sWx$12iT&Yb%mw- zL6v$w`_Z^sKkyIkZNZpYqwJ0-TR_NCEM|HguJ0qba;eyp_t8HVaTK z9-iWNL@!FlFLUckXNYBW z7gwmGxQlMH-m(A~n{Higv&^QG@TDGXgQwMw{2(g~zDVJ5rEMQ3UK-p*630JzhP%nz*vfI++6M4tIh8QP%<*QItrr%au>@%E_Zb`IBZ?2PH zC}^`ORB7$0v!s+5Je2n1<-uT^1QN8_uV|&)$VO7gCq*Z@ku4dK>m;K{p|ey+s-Q3` zY#~F(U(IP&#C;sB-zkBjpsl23Tgm3r1pO+Sxg#vp8hriS?k9Cs#4iX;n{{gDfDxex zmvkRRbz~t8x<-gpDKX@Ph57~T4&QgURWdk3^rN(gif@jbve1U24a-XAO9?!(UKC+g zaHEF{^R2hA4cC}N&C)m~K_vvRlaFg9+q}TDnODJJn-!C4!&@d9SwR~S3e}dEl$oHP zCYDlrpqXY}v4;!Z2 zT;a)}joTfLMWsny8StMYM^JG^+7u5bPtciU38_)a@hS6g5p2@bBC-aR`4k2z^VFRr z2EeByG1YKFjOCCMLR!l1AVX2|m(p0Ea+JbgzN$ENSG8i&9F-`co01KvH0mnij8gh2 zz$j*hgDUV&bhBfOX+^CV4~htRw5R*oviRv8bBooE(E=1!(O){up3R_r1x=l+W909xPb4B}A6py~ICM2&xp_S?bD{nxwXl`D@ z38cH*Wb^cC5!z4}6V*eJ5S{})pUt#QipgebVp_#X8_S$rEG}kYjVB zs`HI4cvoUZy)NolpElKtRwbzV0GAvC7IIis#*$$sW7-My?$$r9Pa zYIzhdg?C6s?EsC!j!kMM@-TSeZ$+h$C{3_Fx}R#(<~rtxq^G3D;%$|*%2Zp4%dB9p zcugsFoB0~G?pTzx++aeReU@s&AEx;thLA!ADoV0#Z)Sn9XzP)K(HKV`(E!>+?-Vek z(jItIc1U+V;NPTQa8*K5MC2$fRpUpTA`jIGbbGCIiJkMcwh+Qp(wuOq@gNhW;ZPc_pUCQ0c6!tR=X(%XosE~k5SCJ+8 zl?$1oyC`{d!4w_pUX{rW)%~=0uZ*&yp|y_+(rX~#EJ!JWEL4;atBhYn(LmAWoCXsX zloP#Nv~RwGezrD3waw}eTq0$8@bh?ND)+b3dKsbq4X$HL=8=~f&Uz~ zaGj3c%1sz7Wt@!)TV!#jCS*QjzQz{zox&C>)xmngj+97(QUFlMXVHF zT6YH*4OdEd(NI{D%+W4YDk|d*%|hA9I2DwdR~9uYT!RNt7C)(rhB#HgFr#j(Lpp?O z6(Z$i)WSA1I=E<+I-Cffi8=)QBMOm~oMxE3DpJ7kX-lgEKX!L^@NPDHxk?j4@Vx(0ED+68F?|kIX@C@@ z<|(46^2#At!JQCNPz6_JNaDCf)PYM3C%i{!&HBIzH(RndJ@=s6X>S{zI_302u~YYq z2(U6;DwNV!_~yxpA`%LA+kV6gs}2zsuCs`JDV;_>50mEH2Lh>J6P_c|MIiyNw(eI_ zIy7(clx>9+Qa2C}yd%;ibE?$wl@PAi1X0vZA12fUj=)z$TC{ohRa~$>lvuRIQ>u-w z4OSUqrdU$0Dx{y{sN%a-B*>$7)rJcS1aEMiwpe)8T$zMQlpaffThemVzz~;F>;ccO zIyxM13WKF$Ag&LG`iY?E!K8etg@Gn)BhsQUgK?cYW4U2uFW>cm7#*7Bmv!C=$rBop zXsK#>VAF>{&Fgg!vLEdYL+mS0iRc0v zb`=qzVu!7{pInMI`_49KBfu}9C)g()Rh|`Xq=cpSNE=UCRGW`~*6>3=mFgm6Q{qL~ zCymO2r%fgGNL#46^5)b&77lg?I|%`FUvW(L%jIT;9EJ&T>#D&jMo2&M*H?)E4278d zDHMRTDPc#O5_YuNck=<9cxx0$K2nxCK|b)NIzoTJ?L@W6g_^jug$@VW@}cQLn|&2l z1<;*fUPZC!Xdl8QN1dQZ#jqdWRZ#u# zChNAMCOe!Zjycu@AUjc-9&P22NyvfJVG@aCCMqAf}(+H zKOOC%pk_W2-PBmG!lW(>`i~+VoD6!ft=p0YkQcXsx`IOud7u_fi@_NdlRQ9GHEAa#*oR6%|WSe7B__q}g!11oA3KyILhN3JA7-Ao) z4d;%!VP(>J6XRtFYeN_F>Ad8X+tM*ig(z>r#h z*JF?lWD#PQ8y2=9hC_pux23kISZXP$C=xCu&s@Vppm2yYSd*lKSEEix7+nA$Wjz#0 zPz)qA1bO7Dc?xOFDLH6Khw5mdLB{TU$TOkxP~byxcKCJZixE*9>YcQammY2;SLhCX zzjU-Uo6=|{uTC9Fz8LD@>{zQy+zO>GNv#bBOhUfVsJNc^dlcRA8BPt1tw@vxn)Eky z?!3cK(Fgb^Vx-a@X;ZEncBec&^iz>k+Ef-f$*s1;O&UNlH`u?l)h-bJgfM``geohG zHkC5MBDQE+dOqSuNnXVt=?Brcb&J)TOSC|vl^{$CT{4(gI^%yYOkW9Xp0kARIo49) z1!)W8XH3f@i4YeZ>C0kary8~;oz%^xrd`Ogc!&`O^9TXuLxYut>s%Jz$A>(c z%{k2$F;&8(G&Eu-Aep zvt^5<*C_OpI;i-u&IM&c<$0j3&bi}_2mzF2J;fHGU)2#SQxg)doRAi<xLmN#wrOwP7aE(LLu3ginuUlRU3IJ>f8yD)M-=p2B9EA6yz!K zzp8A;>!(y1Xj&PB`J%b@IWmg0`Isjd6JA^#wVFyuI@Mq*PdUdDc*-rly`#Ke67-@u z>IFd3Ob1O}X{qRxnn;VJON8`@YarC^@|gOnjXXr#mK12>Vp0=Ad%Dfmqe-6xReIA` zRlHd0?WB-nm6(N=tw1B9m$Dm~nU3lm4s8VX!yQvBN&$#EquY3Jti~3*l~RdEpw1#F zL&0EDj`cN1D_2C{S?6+)-s$=!1R6ImjD>M4akB>t(@&XRxQmraK>SyU0hIEzE+PUA zmZOYaIx2kvyFn8ia!;LmsiNfy5MKeoKVG4be9RCS z9J@*h!fMkTn&?JHD9{iMFsa~3(C0&73V0M$8>}Kc5=rzAv5H)-dflo5jraJVb@5?BVq!Isi9QpqsBN(-zpSac%KGZy^Ek<`YEd+F-V0U!T^e=p!;fIct;S@07VAW!JsavvFJGAV=I8Er~nP0?^b?rGJC>g z5Ij3N#6_F(U7)1KCPhuK;Sj4cVMTM>k}UzAK4W~@YIkHPsv{x4JbhyjY!ZW0!U>Ol zcqGMoC`9Bd^b`K5)24J6NrcKN!A8jmb@_NTq|TG@zG|!Rq$Z>VDN>`_Y7hNuf{l!| zIvw@Gl&w&^BgH92)k4%nEJO6euR^o28%rdo>LH}^*e*Ons?;b(0{e9Oe^Q!=Z&y#K-W($3 zbv}l?^$!Vvg_V&3(@*ILBHfv=sMtQLgvJ{MjMc%S4Tszcmz459@ojIV-{Eys^=$AO z5S$FimX7*P;yzIe%T~g%BF|ss_0gQ4bt8if`es$1aNvCs9 z7xZI2CW$E-e;d@t$P;6Q4ghyg(5dw6I?68?q zbOio!#Hi;=cyVCWAX_NnRMkW z%L;fSu2ccu4Jt*L?=mY*jO6LS-vMn?w;|k!Bou|TjWOG;%mEtJ5mII?D=p>6U5~ z_J9W~~HCBN5P+1xbR`P=a%NYQu&h3t!z?zBi|M3soBH>`q6k z(ed?>Adb=tvu=@6fuRkTBEb1b$kYEz68nY!K%zE zz|`3>fdoaLxYryDN-{|}f!?uBh{gA#MF3icLNzK%sNRqclja1%B;hv7#NvpRqlZ^9 z8Z&4aiWN{SKm()G?|9!+QjQ*SWb}Uu0XjAD|c zfP}IKV_VrhQvOpfT+xiCQdSDTl=_S}Ty^x|n^3+L+LTU=?Wb%jSU`N9Ro#RXDs}A$ zV23(PcOL5_mY9jbl$8mX59)bZzmS_lkV;`ovP#3T$l4HF%!k`X_+P>&O@&Uyza>K~ zMprCSFd*sxh^sPOnEbMEEP3iRS<>xY*?iPU*+L9WGYi=cX@T2s~sl>?O~ z*A2r|)XE}?(NJbc6DBM`?HDyAq<$YOA97owF%4r&ns84A?| zNJ1t>#69tzGG{A_gMvEO4kbnnF1DLNpNnm!2_9oz!HFspvJsp?%HE<)BTbj>%uBwZ z-8X2fAr19L!x;;>WIu8PLqw7Xtu6~1qUwjYKDjwLHu80J{voy7lp;?*70u$QodyP_ zOr0tvtaTf@y@r~Pm4v$^?vRAq0j(8zUR0&SFS5C~IA;>mumX4a5^4h~hrTRaX9WzW zq-X&$(*5iwqtk4Oq>j{v!M|jBDBm&B9DVIcXH=JpkU%JGrC?~CHszWlCacv3)>SG3 zsStX1#C_C`i5V#ZCT670z2?2BsSWb%R_%^DT)It_lp(sT-T?Cz0aAxUI--t28bH(r zJUPlk$+yBZ3Q6@)=Po5+)FL`S0ZA)=H;;2EMi~yKphJp4gg&IMf$C?!%bq4K;>rp@ zvN{wGNMv=?)CN*Q^CI!5V8NVO#00M2O99Ux=tsb`%#)5j+KBlo}+To(ONGTvCNJ z{O6%kP?D!6vhSp*KmaJUmSUnRK|)@3rwN{S4&?WTBmpO=YLZpe2;We0tQ8eJK2fR% zgVklBaH!&6pjfKg6XG(@det7%>0B^W+VoO4>z(G0Xl7GC+&2uGX_+&~5I~k5HUXzk26s}Vn zhhHly!B7vePdrNlgBM7R#Tkm&-1A|;M01-%oL48<{c_Mm`9tR@$+%mL>~h(Ua7 z-AZ1PMy%{S3Y9C8kWgR9fruR{)<QF-C;)dl=e#)8-2Vo>o>*$Q|Vl{Wy&>QFw*avcFon=+}X zC8sQ9GP)EKM`Ks!J#DehSd%E26p9f`Wf_H5G9f}@rTo8Ae=t`S5yF`RZ3T&fouSkf zIH^*xr9h@4ILRsq(T}qs+T1NR0O+GqwCn z3Oa_24r@=-9TH0QLrqpBhN7TItWM$t9F4*b;Rzxf6TyCY@(s`4?Fa3a#>Kv~YL$;}u%v8(ylP zj;0e=P!|$eub)8@TU0kv%1?$zLWZk~)6u4a)g*>0qZ|^9{k%2)#Ty`{v(u*35n7Zb z#OpD2J;^Fn`XOz>^@M-nnoxQluTYc=9Dc2c5Dh^IU_#JJ08>><31IS7^s5ol8=Q8bQUEdOJAiw^;(~*%3PSP+ zm1=||L0>dz1t5h56nRC8 z)E5X*jY38`X&@@dE>V^X1g4Zh+O+*x){hvaZlT+7La<^2XpvIKF5^jG9iY?tioNwT zDJ)3A+2rP$g*{aAW?^5HJpFDI-+?krkUz?OPo*GDcXi~j)HhT#i@B$15ql#L_DFh# zAllR>X^ZpesedLkT z=k?p$gxfw4?DAST)Y;h@v>v!UX;hysqYZ;AJUd+Afjr__lq$wSo2necBjB1RFIMts zR0*84QQ9b6xTH$Q(2v3=VLuY8bejrP5g~`^sYQ4nrrKb)x=lHM#s8remRy^V`q9oY zcZL5YxEWb1p(=wXU-{If;&^D<(niW%fCczbO7shTNXeAyM!b?oqlyXgxSIFh;e@1M zgo_Yl3RMIoo^s{z>{-3UE8yf%xrp|SbI1b-*MyEL`l%;2yoFXT9(c2?%qZIIMJdUo5y8aMz3SI`lz5V}6-r#_=V z@_;H?NS-ogMKE8TyhxmcxGlqlC1E#&TH?duxfA160*m-;sIw#6dHfjwgIC95TJT>* zKej?>5#oNpA`b`iUNr;;179u71=IZ?!o=q6`J->CRCY-WQ`!q9m(<-x)lZzKJ5FjY zgboAA>JFI{ZG5gYI47KHs>nQT96%Zi_%l@U5}`n9K!p8BWe#o={d}G)`;XC2Y*9VO zrA^tzlqpwA32iDnRQ#-=(kk2|bxeYP8dYWsZK%z`PKdyV#*#dW3)weqaRuSp=1@t( z!~x`FiRf9l2nE3d;v!_I64Yqp!UtpFN8xQEm`dub>K8xnt$m-H?;NO?)OefAX3j;J ztSWHAw-S`!hBoywf~%)WzSE{Y0z{ko-VdfE1x^I^B$=Rbgl~m-U8p=?v?)CmgQXfC zsFEElEo~o(n~#G|9)cwk{Oszo;M)vC@r0ID`8)h1NT1*osPPgS`1Dii1(mEjHdeGF w##g|Xh;!r7GS3X}HM(C%zR!%^7c4loO}usH^WnY5_byiYOq{s&F5C3^|KF(vLI3~& delta 85118 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 'De 2 a 10 lletres o xifres, començant per lletra. Si la deixes buida, es treu de l\'slug.', 'created' => 'Tauler creat a TaskStream: :url', 'open' => 'Obrir a TaskStream', + 'create' => 'Crear a TaskStream', + 'create_heading' => 'Obrir un tauler a TaskStream', ], 'filters' => ['unpublished' => 'Sense publicar'], 'actions' => ['publish' => 'Publica'], diff --git a/lang/en/panel.php b/lang/en/panel.php index 4f31def..ad7d92c 100644 --- a/lang/en/panel.php +++ b/lang/en/panel.php @@ -527,6 +527,8 @@ return [ 'key_hint' => '2 to 10 letters or digits, starting with a letter. Left empty, it is made from the slug.', 'created' => 'Board created in TaskStream: :url', 'open' => 'Open in TaskStream', + 'create' => 'Create in TaskStream', + 'create_heading' => 'Open a board in TaskStream', ], 'filters' => ['unpublished' => 'Unpublished'], 'actions' => ['publish' => 'Publish'], diff --git a/lang/es/panel.php b/lang/es/panel.php index a0048fd..30e63f3 100644 --- a/lang/es/panel.php +++ b/lang/es/panel.php @@ -529,6 +529,8 @@ return [ 'key_hint' => 'De 2 a 10 letras o cifras, empezando por letra. Si la dejas vacía, se saca del slug.', 'created' => 'Tablero creado en TaskStream: :url', 'open' => 'Abrir en TaskStream', + 'create' => 'Crear en TaskStream', + 'create_heading' => 'Abrir un tablero en TaskStream', ], 'filters' => ['unpublished' => 'Sin publicar'], 'actions' => ['publish' => 'Publicar'], diff --git a/public/openapi.yaml b/public/openapi.yaml index 375da4e..2605010 100644 --- a/public/openapi.yaml +++ b/public/openapi.yaml @@ -1621,7 +1621,14 @@ paths: patch: tags: [Projects] summary: Update a project - description: Partial update. Translatable fields merge into the existing map. + description: | + Partial update. Translatable fields merge into the existing map. + + `taskstream: true` opens a TaskStream board for a project that has none + yet, as on creation (`taskstream_key`, or one made from the slug); if + TaskStream refuses, the update is not saved either. A project that + already has a board keeps it, and `taskstream_key` without the flag is + ignored, so a client can PATCH back what it read. requestBody: required: true content: @@ -5574,12 +5581,12 @@ components: demo_url: { type: string, format: uri, nullable: true } taskstream: type: boolean - description: On creation only. Also open a public board for it in TaskStream; see `POST /v1/projects`. + description: Also open a public board for it in TaskStream, on creation or when it has none yet; see `POST /v1/projects`. taskstream_key: type: string nullable: true pattern: "^[A-Za-z][A-Za-z0-9]{1,9}$" - description: On creation only, with `taskstream`. The key in TaskStream; made from the slug when left out. + description: Only read with `taskstream`. The key in TaskStream; made from the slug when left out. cover_image: { type: string, nullable: true, description: A path from `POST /v1/media` with `for=projects`. } started_at: { type: string, format: date, nullable: true } ended_at: { type: string, format: date, nullable: true } diff --git a/tests/Feature/Api/TaskStreamProjectTest.php b/tests/Feature/Api/TaskStreamProjectTest.php index 04862bd..d20e157 100644 --- a/tests/Feature/Api/TaskStreamProjectTest.php +++ b/tests/Feature/Api/TaskStreamProjectTest.php @@ -18,8 +18,8 @@ use Tests\FakesPireon; use Tests\TestCase; /** - * `taskstream: true` on a new project opens its board in TaskStream too, and - * the answer carries the link. + * `taskstream: true` on a new project, or on one without a board yet, opens + * its board in TaskStream too, and the answer carries the link. */ class TaskStreamProjectTest extends TestCase { @@ -211,23 +211,64 @@ class TaskStreamProjectTest extends TestCase } #[Test] - public function an_update_ignores_the_flag(): void + public function an_update_opens_a_board_for_a_project_without_one(): void + { + $this->fakeTaskStream(); + $this->withHeaders($this->apiHeadersFor($this->editor())); + $project = Project::factory()->create(['slug' => ['es' => 'catalogo']]); + + $this->patchJson("/api/v1/projects/{$project->id}", ['taskstream' => true, 'needs_help' => true]) + ->assertOk() + ->assertJsonPath('data.taskstream_key', 'CATALOGO') + ->assertJsonPath('data.taskstream_url', 'https://taskstream.test/p/CATALOGO') + ->assertJsonPath('data.needs_help', true); + + $this->assertSame('ts-1', $project->fresh()->taskstream_project_id); + } + + #[Test] + public function a_project_with_a_board_keeps_it(): void + { + $this->fakeTaskStream(); + $this->withHeaders($this->apiHeadersFor($this->editor())); + $project = Project::factory()->create(['taskstream_project_id' => 'ts-0', 'taskstream_key' => 'CAT']); + + $this->patchJson("/api/v1/projects/{$project->id}", ['taskstream' => true, 'taskstream_key' => 'OTRA']) + ->assertOk() + ->assertJsonPath('data.taskstream_key', 'CAT'); + + $this->assertSame(0, $this->sentToTaskStream()); + } + + #[Test] + public function an_update_without_the_flag_ignores_the_key(): void { $this->fakeTaskStream(); $this->withHeaders($this->apiHeadersFor($this->editor())); $project = Project::factory()->create(); - $this->patchJson("/api/v1/projects/{$project->id}", [ - 'taskstream' => true, - 'taskstream_key' => 'OTRA', - 'needs_help' => true, - ]) + // What a client sends back after reading a project. + $this->patchJson("/api/v1/projects/{$project->id}", ['taskstream_key' => 'OTRA', 'needs_help' => true]) ->assertOk() ->assertJsonPath('data.taskstream_key', null); $this->assertSame(0, $this->sentToTaskStream()); } + #[Test] + public function a_refused_board_leaves_the_update_unsaved(): void + { + $this->fakeTaskStream(409, ['statusCode' => 409, 'message' => 'Project key WEB is already in use']); + $this->withHeaders($this->apiHeadersFor($this->editor())); + $project = Project::factory()->create(['needs_help' => false]); + + $this->patchJson("/api/v1/projects/{$project->id}", ['taskstream' => true, 'taskstream_key' => 'WEB', 'needs_help' => true]) + ->assertUnprocessable() + ->assertJsonValidationErrors('taskstream_key'); + + $this->assertFalse($project->fresh()->needs_help); + } + #[Test] public function keys_are_made_from_the_slug_in_taskstreams_style(): void { diff --git a/tests/Feature/Panel/TaskStreamPanelTest.php b/tests/Feature/Panel/TaskStreamPanelTest.php index e9c27d5..609cfc5 100644 --- a/tests/Feature/Panel/TaskStreamPanelTest.php +++ b/tests/Feature/Panel/TaskStreamPanelTest.php @@ -19,8 +19,9 @@ use Tests\FakesPireon; use Tests\TestCase; /** - * The panel's way to open a project's board in TaskStream: a toggle on the - * create form, as the person signed in. + * The panel's way to open a project's board in TaskStream, as the person + * signed in: a toggle on the create form, or an action on a project that + * has none yet. */ class TaskStreamPanelTest extends TestCase { @@ -131,4 +132,41 @@ class TaskStreamPanelTest extends TestCase $this->assertSame(0, Project::withTrashed()->count()); } + + #[Test] + public function a_project_without_a_board_can_get_one_later(): void + { + $this->fakeTaskStream(); + $project = Project::factory()->create(['slug' => ['es' => 'catalogo']]); + + Livewire::test(EditProject::class, ['record' => $project->getRouteKey()]) + ->assertActionHidden('taskstream') + ->assertActionVisible('createInTaskStream') + ->callAction('createInTaskStream', data: ['key' => 'cat']) + ->assertHasNoActionErrors() + ->assertNotified(); + + Http::assertSent(fn (Request $request) => $request->hasHeader('Authorization', 'Bearer session-token') + && $request['key'] === 'CAT' + && $request['isPublic'] === true); + + $this->assertSame('CAT', $project->fresh()->taskstream_key); + + Livewire::test(EditProject::class, ['record' => $project->getRouteKey()]) + ->assertActionVisible('taskstream') + ->assertActionHidden('createInTaskStream'); + } + + #[Test] + public function a_refusal_later_keeps_the_project_without_a_board(): void + { + $this->fakeTaskStream(409, ['statusCode' => 409, 'message' => 'Project key WEB is already in use']); + $project = Project::factory()->create(); + + Livewire::test(EditProject::class, ['record' => $project->getRouteKey()]) + ->callAction('createInTaskStream', data: ['key' => 'WEB']) + ->assertNotified(__('rules.taskstream.refused', ['reason' => 'Project key WEB is already in use'])); + + $this->assertNull($project->fresh()->taskstream_key); + } }