From c249ea578c7bb7f8ca75298a911f07a89a4b6e3d Mon Sep 17 00:00:00 2001 From: Lucas Quaresma <15186323+lrqnet@users.noreply.github.com> Date: Sat, 1 Aug 2026 09:46:00 -0500 Subject: [PATCH] Add dashboard preview to README --- README.md | 4 + config/netkeep.php | 3 + database/seeders/ReadmeDashboardSeeder.php | 149 ++++++++++++++++++++ docs/assets/netkeep-dashboard-preview.webp | Bin 0 -> 55296 bytes tests/Feature/ReadmeDashboardSeederTest.php | 54 +++++++ 5 files changed, 210 insertions(+) create mode 100644 database/seeders/ReadmeDashboardSeeder.php create mode 100644 docs/assets/netkeep-dashboard-preview.webp create mode 100644 tests/Feature/ReadmeDashboardSeederTest.php diff --git a/README.md b/README.md index cd7e9b5..794ad62 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,10 @@ It uses [Oxidized 0.37.0](https://github.com/ytti/oxidized) as its unmodified collection engine and adds inventory, authentication, audit logs, permanent Git history, notifications, and encrypted redundancy. +

+ NetKeep dashboard in dark mode with fictional example network data +

+ > [!IMPORTANT] > In safe mode, NetKeep collects, compares, and exports configurations without > applying changes to equipment. This guarantee is conditional on reviewed diff --git a/config/netkeep.php b/config/netkeep.php index 3c16ec5..99a9b9e 100644 --- a/config/netkeep.php +++ b/config/netkeep.php @@ -8,6 +8,9 @@ 'version' => env('NETKEEP_VERSION', 'dev'), 'source_url' => env('NETKEEP_SOURCE_URL', 'https://github.com/lrqnet/NetKeep'), + 'readme_preview' => [ + 'password' => env('NETKEEP_README_DEMO_PASSWORD'), + ], 'oxidized' => [ 'url' => env('OXIDIZED_URL', 'http://oxidized:8888'), 'token' => env('OXIDIZED_INTERNAL_TOKEN'), diff --git a/database/seeders/ReadmeDashboardSeeder.php b/database/seeders/ReadmeDashboardSeeder.php new file mode 100644 index 0000000..c933cb4 --- /dev/null +++ b/database/seeders/ReadmeDashboardSeeder.php @@ -0,0 +1,149 @@ +updateOrCreate( + ['email' => 'dashboard@example.test'], + [ + 'name' => 'Documentation Owner', + 'password' => Hash::make($password), + 'role' => UserRole::Owner, + 'locale' => 'en', + 'is_active' => true, + 'email_verified_at' => now(), + ], + ); + + Organization::query()->updateOrCreate( + ['slug' => 'example-network-operations'], + [ + 'name' => 'Example Network Operations', + 'locale' => 'en', + 'timezone' => 'UTC', + 'settings' => [ + 'default_backup_interval' => 3600, + 'default_timeout' => 20, + 'full_backup_retention_days' => 30, + ], + 'setup_completed_at' => now(), + ], + ); + + $core = DeviceGroup::query()->updateOrCreate( + ['name' => 'core'], + ['description' => 'Example core network devices'], + ); + $edge = DeviceGroup::query()->updateOrCreate( + ['name' => 'edge'], + ['description' => 'Example edge network devices'], + ); + $primary = Site::query()->updateOrCreate( + ['name' => 'Example Datacenter One'], + ['location' => 'Example City'], + ); + $secondary = Site::query()->updateOrCreate( + ['name' => 'Example Branch West'], + ['location' => 'Example Region'], + ); + + $this->seedDevice($owner, $primary, $core, 'Example-Core-01', '192.0.2.10', 'ios', DeviceStatus::Healthy, 12); + $this->seedDevice($owner, $primary, $core, 'Example-Core-02', '192.0.2.11', 'junos', DeviceStatus::Healthy, 18); + $this->seedDevice($owner, $secondary, $edge, 'Example-Edge-01', '192.0.2.12', 'routeros', DeviceStatus::Healthy, 24); + $this->seedDevice($owner, $secondary, $edge, 'Example-Edge-02', '192.0.2.13', 'routeros', DeviceStatus::Healthy, 31); + $this->seedDevice($owner, $primary, $core, 'Example-Firewall-01', '192.0.2.14', 'fortios', DeviceStatus::Healthy, 42); + $this->seedDevice($owner, $secondary, $edge, 'Example-Access-01', '192.0.2.15', 'iosxe', DeviceStatus::Healthy, 55); + $this->seedDevice($owner, $secondary, $edge, 'Example-Edge-03', '192.0.2.16', 'routeros', DeviceStatus::Failing, 125); + $this->seedDevice($owner, $primary, $edge, 'Example-Access-02', '192.0.2.17', 'ios', DeviceStatus::Pending, 30); + + Device::query() + ->whereIn('name', [ + 'Example-Core-01', + 'Example-Core-02', + 'Example-Edge-01', + 'Example-Firewall-01', + 'Example-Access-01', + ]) + ->get() + ->each(function (Device $device): void { + BackupRun::query()->updateOrCreate( + [ + 'device_id' => $device->id, + 'git_commit' => str_pad((string) $device->id, 40, '0', STR_PAD_LEFT), + ], + [ + 'status' => 'success', + 'started_at' => now()->subMinutes(20), + 'finished_at' => now()->subMinutes(10), + 'changed' => true, + ], + ); + }); + } + + private function seedDevice( + User $owner, + Site $site, + DeviceGroup $group, + string $name, + string $address, + string $model, + DeviceStatus $status, + int $minutesAgo, + ): void { + $device = Device::query()->updateOrCreate( + ['name' => $name], + [ + 'ip_address' => $address, + 'port' => 22, + 'transport' => 'ssh', + 'oxidized_model' => $model, + 'site_id' => $site->id, + 'device_group_id' => $group->id, + 'backup_interval' => 3600, + 'timeout' => 20, + 'enabled' => true, + 'status' => $status, + 'approval_status' => DeviceApprovalStatus::Approved, + 'approved_by' => $owner->id, + 'approved_at' => now()->subDays(7), + 'approved_resolved_addresses' => [$address], + 'ssh_host_key' => 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDocumentationOnlyKey', + 'ssh_host_key_fingerprint' => 'SHA256:documentation-only-key', + 'last_backup_at' => now()->subMinutes($minutesAgo), + 'last_success_at' => $status === DeviceStatus::Healthy + ? now()->subMinutes($minutesAgo) + : null, + 'next_collection_at' => now()->addDay(), + 'consecutive_failures' => $status === DeviceStatus::Failing ? 1 : 0, + ], + ); + + $device->update([ + 'approval_fingerprint' => app(DeviceApprovalService::class)->fingerprint($device), + ]); + } +} diff --git a/docs/assets/netkeep-dashboard-preview.webp b/docs/assets/netkeep-dashboard-preview.webp new file mode 100644 index 0000000000000000000000000000000000000000..a4be91a6a7b00fa8af5ed415620d45a388f75b2b GIT binary patch literal 55296 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

o<)| zye*?8)85v7BKGJXv`R|*&-j=;79-{`^d(u}+!`zWA!-)?AEAI6x1P5nkc(|@GziLy zmb*_EG48H2C<1EQlwedHTZ}-Xydzor@=g=IezfJ_T>DMkjZEz%lBA{Z3|;#oo{!WU z#|_!h9hL3>1engt@J;?(|H)sh)w24eM}efn>vVkhgtS!s1I|MR1L1mJS;A83VyH$J zJ)zC7Vu7jlJT_njBfqmY8XOa}iWG0TgH(?-UB0d@VK54;1LH#n7zt5NayvmdhH}!s*MNoyDwbnm z7Vb{p<|$Jyk3+#z6L;NSTvyeajG7%i+N^A==Twy;^`X{7x_JpPcCUbg&fKh$ZZclMj{FVCs0b+#hsOWU&02%n9ghLa8J0nQ?5NDKv z7J0UQN!RQH5vw(tI!6XGe#Q<0AqRDwGSp!Dl5(D%b0O7i7nn4qj|MMhK2&pYpMt`@ zss56y==cB&@+r767!c{%+UrzE7hD{cgZb60l*uPr+&+dG(21`L1F6IAO|O`&rgW}y z&Qx8!R28rFYJfJgH||lVs!o}yNyrDa)m$OIzzWj1fzDVSI1C*sMy=KGL+RB}mSfWE z)v`#$kQ6sSlP^+T)x=Yru@mTJU=EV#^Im<+jmDrn-A&h8-Lbnc4j?AiGJPk2X+tVw zXQY4yJ4T66EsZ>-Fct_p+1XMAVQb}gW28HsBeu3d0-v`n@1O3dXRR{mMAfIut{*qt zgU4KiaY!f_@wg?yV(3Sx$vkR z6VyZ4vuxLq)1~Z-7g_ykD-W`=Xy#!pAWXX2^s_SfRDu6h zBUGSN#!9Qy`LwE~&-Suo8KKE9xkvF^)}P1{C0ues{inh9aUD(cFC)1-Ik!K3p$bUj`BI2 z<%ZwqD@KMunB#?IwB;*(1z}&&`w1F_gJN|Gt$D?uvpKDb zPcEsz(p0<*tY9Q~`6^P$K#HUxo;FkB+v`&!I0q)I+)fvqZM2=eQTsik4ezEWt_$z` z_Z~p+0ibdehg%KbsN=m*%yIvdYzJilK{T=@6St@%5)aO~;Nq3r32RtBERnQu0@T1s zT*6xFnLX6hPa^*Jp;kvB*-tNk6DBp4x#bWJt#t@IKN3(KI(^~v;GMYdQ+-R9%oeID zl~_o(s53PnAmAP&FA#UP#7gOvvU5?YRJXG8GWE0~F1w32)%qTEu*zm3Iuz{{mYJ6Y zqg`^R{KPhq5*#YPC*}};b?2WQq+#<;s{l+TvNqY+8F4##%4U4Fp!-FNHxmSm z=wzuGV3pl*o01{q{K`#PVG=t>Dy%5?ec3Y4Zv|B`0dxoHtMpm>Y#9%aiQO>SY_M#$ z7{zi=_;E*!o85{$)P^2=wijT6F?laK-?jtS!Yha(T{0x_ht?&1$(q9PKJQ+qO0@P~s>+4YF^qy!wNnno7 zkhgrfYz&Q6CjorNa25EJZX!L@9KAzDppDkbw@vre#VMqWM#fDeE!XdhV~gjD@39}L zds}_=flD^Ge-b;V(h5BPiM8Nf7lV0Eo-Ez2@NOu&45|K)p+W=8Pw~bV?exZ!@otoT z&$l=&#LyAAU6@EbicY3Q&yShJTxZ>TxU6^bE^TuXg%{l|_QFfmn;VQ=PFmu&2qNdx zuY&n`*&yxh<@*n)aVifR$(+5`u}jd<3aUeeTzn;YJXIMxg2Eb0urQ+Z^Q$IE*srWd zl?9QUb@IXo7rIe!YXkRtY@hQrpTiE+?2xPh?IA{gJSM#jXmOcijWYW5G6qm7Y%I(c0&#=x8^;S`B z`p}G`7bz_eP1?31l?W&eyqj{To!{YR8nLrq+1bGF(rQgYy<*{Rg}lTCy7+6`ET`rTXB#XCXO|53?D70a#ed)< z-$2?asAp6{mo{+gq(PjTLPMvZ34^oASf?7p6dpTthC-Yfe`8o-lZLk^uS+Xn%p9v6 za;!8^#mDn8-Gd>6=3QAh{ISWD=Y(ZU!pQ> z^sPQn!>l>~+is1`zG3Uq=BR&dDit9|cnm;1vo<&-p)5enwUX=jrZo=Puc7 z7d+%DyFRO|lPDeuA!1#TG)Zh9cXY+n@zo>G?u;bVw;5o<g}yy&-P`DADq~mu(t~3G`aJrxXiAS2ep(R9gzwMfU+OsfQ4Pi6xH5hHJGI2N zm~1=Np&{Pj=-W~lD_27xx2?;mDY^0iVHp#+9-T=;?8KFR;M#hmpazxGmabBQ9>l6B z%#r^7Tk)B3-{B;V_`R2mlc_QF&$@*R_eeeW-Q1RLpg*r10o*h6UB_gkx$Wi#pvwpx zvo@y%u~zE72nQR5*SgJhzW*FlDgQ>pj_SI%)xyy6s|(?tyK}N)ho-FRtoA)S2@8** z1xkls=HMIQ{v`9GDLJHPp^%J+(rBw6tG9#i?U;5*#iE03DH)zS_|5(`GRy1BcXXqw zPxapeVcHk-e#PaXNGoZW3Zn}M`h$2HeLQye5vSX0$`(ked!g~r_f%pidrVp}AfjA8 zdrkQ4mP+m~D;05cOX_lgxKZESF8cM8*O8k=;8Rikf|(eiyK-xz*~BFiXey0&s~MuB z>n5ArDu|GpEj$`J+w}7CLN(PcI}Z2SU5IHyJ}+>dvv1WK8|1XnJyvt{mklREGK3`u z&+e|EKbdDjH~+Y~+~1hR;-X$7aNiU&pu>lfKA^9Cs6)-xX5K4MA2oo?B!af+u4Nj}%4(TJVc1RMW zM1q}#pbj4E{3_xK<|5}VUB}Q*?fAfVHQ3Z+a-orZT{3hyco=v4(UzUunVrjCKWwxl zj5zwlMC3}UYFRjACaF1PfY)N+SIo+2b8-M?t+J$zp++V7N-dg}_R%pRa%t5iqV%g2 zu8WY#dA7QqzhUiNE!xA|HFPa7NjGdFEy0oox>65PJ-AH z0ixI-vsH44W;?Ya-CdY??V2xzE_rIQuUa;CA4q`LK@-VQPjqqeLBSvJd zLW9bjk`fO5@dy$GG{~~{(wn2e; zn_x(?miErw)8~$xprA(1P;rXOhY9Jtzsq!vtu%=imH)8>?EyuNb))&a^gK%q)WwLM zQci-@PQiRSaF+%kv=8=?L37({p7Nm!F?%_m+3vCOUJ1{eV*<3_!lbej)VX~Hd)6IY z`WYADV>c}H+@|c3oAX(->iP>bwv`v3z8DlqrO6{p7p&j3g8XBp5hSRKoYzhGVks<% za~D%$%y+Z7!|;lO5)WmKqj1;NmS;NYU{kn(xx(dvg#l`t_(wNr55k) zWLZppsytMJsZB)Vt$Qv)%ix0_!~p@2--W=j^X%@vV(iNZdFT^N*&V?hF2>uZzSVeU zDz{euFzL)#jW2#L@@_cU)bd4nnF^4|>GO1jfh&R`73`zD53Nh38S7rxdd&S{nhn07 z?(FXUaK(2MkJW3ytK{}bdoU#n{lJJ{Y3?g8Q6tdpY60alnX;FkS{M7Y6EWIw3?VKO zD(BZ2%bNB0e1=p|zo|9f{x-t&Pzk%% z(6nZV3uS!E<1+SR8(i$d{hKmR`?YI$7-6R`H=Y(I zryN}aTPlkZ&IW3iK?1#2#=%=_!Ho! zH0i%88y$0N8H-hwJLs(;jmg-ID)U%_9dd?W;P#nQREXF3l=#KeUnHms_UchH_0ooA zEQwf(VxRcV1!N8sZbYq&vN_HqF$WM=EFN)j%VJ$pK%NAWL%LF|ZKsI$z1g1dd+E-r_zDKJyis9&}v7Hj0Pc&*&QDBIhOT zW&i}paNfbEW&Q)WgSM$RAr@@B>~7viNp_=w*G`Rj2;iiK-f6^DeD23(lPOKX;eftF zHM)uI{$lVUZ-dn~083_B>6``mRmM{AMYwn<#=SpCV&a@2yRw=?S-rjK%wh3N722%p zJ+j67y=IO@%)}8V6zVy?uKVQ6=0$T$^#y13uo~j6B!04w%6*TTl4W`DXmG-3laYyZ zRZ-fuK@SrF^U(8}zRueZ;QV{nrW88zeOHhdc(7ZCkx(1sy$6BVGrdtbZtsKFaCI^t{kYYj1XGrL|5n|(;HuS94l<2`m5t5{;`Z=A*wDLU4tEmE*ccY!vm zLUBS_Z)XxNeh=XKMtA2=IS%Fz@ys*t>A^F>c}y|xrx9%*SF&8E>NNhkbgW5U3>n=N zZ{Cb)y8Y0)Pg=TdCy~1FK*@dBKbbCqVIxN`3Ie%@I{rUjlnR<#RL97AF|qUer?ds* zP&FdIKu~q05VM&;+m8huY_)|0(Rw^jPDPjoK=FjvIeB%dA?;WCrLJD}lWkdOpV3y& zoYVuipToh!pC^Sg0$3rcqk@wITMo(`xr^HO+K{OfeaN7Wt8|~*&jVVQTTqrXVTfXy z$3x6kQTr4(~; zeX&siW45ZNr0lOJSxk|~Dma|Mb1BAjWBv55!%Pt$;Pql^=1gQtK}4%D%SZ1c(=P^E zeTN&Pe(7uO8}o$(mnCHfv`SpP(8?!MME~q#%z1Sr23CH=42DUAg_~nz8N;77gQLy% zBHwrF`m172jI5J_7RsXPqEil8DA725IO?It#i+k7#E&nct&I`;O=Tt=AzlZ- z@5MKib~G41;ndRtFm9dFO>}4*t&r8Pb^RFjM#e8+bGI1zX={sf5(>GOA4-zb(KYAa zDYG9RR<<1L9DF{Euq2%}Q}-SzVX)YbZOCSXZxv*3Ll5#10Y+Q&uq{UdH4E?_jBrPw z)UoRpRhXK0d^?N<*lrxF#m<60!L*srQxM(HPKz)&OR5gEgh^ji$&bd6oMbkI5Xex# z3R0}h*Lw(cjmch?n(h%hl2OMpOQZcdVe+N~76X1VpfCxx#~@a6BDTRBvygTaOYW9h z=Vu-&zew}Csm;ndz(al}G7L5M(Cq!Nt&mxood*Hbm(Qrv@+%TH!6f0%SLn~4PiZbFV3xzj%>w*Cpopo@!-^o2x_ zWZ{+651n?vhT1jUylQNGtw2&9bDCmrk787R%3BGfIL4 z`8vU{_h-l{uXT^rQJQmjQoZlt&vYE59MjJ@;vsKXB{tzHhuK$}T@Z;$9NJGkWeAx* z;3wIz>y+ph!^l36DkE3XYRlC#I=h(S7TmaG2w$EFM^_7E zjSenJ)rwEB751)t^Fkok=~X|#LJ>Zn}Tu*>7{G&^DNdvb%dS5h@LLkLZ#2kQ!~d;(z;5sMyy9f^RO16FUV=W0IB zO`=auCx)VjoiFGk1|=3nyrWpP?m1{ULh9D@@^rorKU;X#yrOOU}^~N zR-bD-SV!_oMkXe>@_M8Zi9QU(Rk zRZZaPg|NwiFQ)7pER)cuK0R|y$y-hT*u^JJn0;3y0qh^b7g8>uY((&O$2bCVp)hjxAMti`DVDyUC^*dXLU}P|MrJV1`ME_N7t1 zr*xM+ap^Wd*d{_BM=&$2eu4%UBqh6ABw8-x@yLRMGth*WbWgiQ=9xuNwd-AT?YN3&b}2WQ#3?ymJFTi zJ^u_Ns&yM5voU~ID}W`m9Pk)W4ZPPP;u#O28~L?o4SQy3wiJSF`Z4Argg(CG_b8oG zj~DB~-sqKKRK&1WXkdtg;-vj0^(b30T50s??Sd>%RFy_pWD1Gy2fr>r9D6Gr#t*D? zcv{N8=1voI)EX?~nCtr{!?I!d`mQ+C2(_jJ+gw5;6AEU6ObygXj+ry_R*)A1X7Vo( za$hFdjKbi;QC)oj>^PiNUCxC~LSbNf_A{M7(kEIJKR2)pJY8r*Cil>yEe$i7ci4}a zrMoq)eMvdL^qSfGu%J=WH1TJTmgA2)4upIl9#u0?58brKIDkpfi&8tO1`1I=O6OUJ z*LGvQ0?akoyh_WTEyOV5;PyxBIwcP4*JM*~Un$Y76*hJEAx?_OXRx*KWl~ePJFE^` z>G@oiNa=Gg;)G_}UmiuMW0qg&-dLvCW8|)9&-fY|)@O~|$0%h&RqVXcNzeWj4>GH3r)VTowkmo9G;+6Axbryt{~8ETT#eiYwGkhyVD ztf0E=SA>5CIg6D%aaVDoUnYL~e20Nx!!am(jGRX1+wj%KTLu84fj=I8uslCs${6Gy z^Eo)G14W8Na043rWdFwo>Q4a`r3ENb zO4u|LdM#mwMj^iG1Lp?QONgYekEq!BCa+3zilwovti?S0_m=fwOyVv_bg~#N7AGoL z`1)EV`Qyh3cll~l8U^_t&XHWdzV5k#KjE;tvV>u}1AEP1P(eViS(7586Bi4eDX!+h#YR*&x!NT#Ys6z zJDtn&Ho5pe(~M`T+s_l$Ml_+}l<(Ra4?|}A8{O}=^G~roVX$Mh&K<#LSJ?mSfk}03~A2Fqga!DMGM7DT{Qgy$60 zzaAaKsEo=8!m!waZLLuOvjt(}k5jTsYGZYxfC`AkgPz!1d9)HvlroRmrP{ArLRHFu z4#JST*g;sa9nKHKrqn^bd-1Rh$NCqVG zQPJxNO&^NT246ufslj2N^8>Su4LlRi4~P>rKjF#;7PTPcPm|X=ax#%vmd#JTN(mIb zMO_HN5j7djVT={(sH;ep|9Tj%F=KJeHXV9hfNxr!M+dls>b%d3UjyOYB)X4~s2Z+*hRPRDQE77!Q zds~eyyz)1sSM=a3exEZx3VuGi+~_guQQa?zboG7i@PIvgVo95*CiQermO|bPR&uXu z=zrPJ!TE~Bi1)?gz#9ab@loWt?w8smc2Iv7nV3%p_bjM|pVbjHogISs6QpPmZCvh% zFv=o!sjbLQw7i>m*D|c^dZSg+FN?Ml(}7N<#okoTUSeS$;H-4`%o|1#B$FHh<`7Vo(-6T@sh@SmltoyTdu|KgO5BvV$LGr@PhT`xi;6wi%8Y`Cm~mZs4syyv5kHrJ#h zj{m~s#W$PtluF=8b7|p~mR@^tJ~Z3HG8=irc+K?7w2V8*wGR|tW%y2Kd$dX^oEziF zIKHAG24}uL7hJlcz3&Y2VGE^1J(LTz7(G{;n9!o7*IwGqEebE;3$1u=;(?kR7{l0n zvsg1wRiZAeBEMwWvbupL?*%))A!p3RhLQdzs8-PMF=EpPGs`e5|S{&yGkWg6f%xi%#6d!C9GXA+0Ox5$pM5ZtT znt(X{b17Oc?G72rY~E2~F+BdfDfKx7LMVgoy!J7(4{&k1k0K$t0)X^c;5FdYqYBKv zze#aM0rO(nwDv*{pClQCL#){Jb73(rtN;k4Z9}glV=MyXPNQz}kKIo=75qzH+aYxO zfX&QmNJFAgD=~lP@a!-e-D?0#l!&1)pq_fdy=1XP&jOOKp&UdM@k5kn9N#J?>$CE< zL>1@CE&uoAL-p3)9_Ao&q8}sAj;#*d&`L?LX|SveP$FWhUv<%G);RcKL{cZyoquR9 zQESs>HuCP9hDhnu2Q-rsDsQ}q%N4L*(3Q}O0j++qN0+OlQkKSYf$HM&9hEODSddq? zoCkS-johhC%;QGMYF*z3oP7a10aV`!O=BC^N=%ZYQ#q_2KobYzU@|oVoLcwi_PBV8 zR7na6aC%9NkN{u>vEf`==eSM^W!e=J41Iau@jFFIuGi02W&>T2jUBQLW z*beWr6>h6kaKi#lp)0*P2i8s8$xa^Yo{aOq8g8DPzJ-MXz!LjYPBpd+?J?B*tZK&C zzIMCX2$Xc4Kwo5a-4=W=zk%fyAHu|p4c^Mi$*$OHcj+zPhQ!Q4u4eji7rggno-~T? z(Fsq0SZE^xz+q)h7p90c^ojfNdGMQw<{j|`Ol#w%yFpsOpxgEgg@1~4nkBhY`K_#s7 z7fl|GLWItKFnqy^C2&&VTGt=gto4vKMgSnHTQKNTM$N&{vz1-2GAA3Ln@|cR3gdKg zUdOc8PZl^H+QMBP@65BM=qQh4Gt^`ZM&$v;$20HDfjh(4m2H9EhMf?KL z6vUsloW0tvimJMmVG`EE#se2E9D^_hY{B4Q%b&O_{#37yITh$tfUjX{Ec21Ev)=4XTq9d! zLK5{_>3a(q)VV-y5M|+Bxb8Ko_NJgJA;4v78`=1dhayeaB-96y%t5EzHn`?M=!LnY zqE_CcEQtnNEaWnXfwPZS)9{0fLb)74jMcR)p{eSnc){b1I-z;K^rBe3Q=#~NA>#LM zW1;p#W!sR`8@lb2_4HM?Q>u;ooQyiK+pZMs<7p!F@m~W;5Q?-XAvW1sxzJo@{W~S~YNdQAfk?W5_GAJYoLuQix zY7bbv6dtj7kMP^hO{8A>PYM`1H-&bhWQ7ByQ_jC>r7o5K`thPCO&6`Bt+<^!*G>iO zi@mFdY|Y!+23j$h3?j|h&;Ub?LQI|g?#2`8_8Hf;9JNw8@2hG~jQ?=9_x%qLL@Mu0 zL8fe`E#HkecvP9)`t66`f8YXzT^)|Y1vM)&wNN}(=W2xljV0}5WHDC4pjH-S%Q#T<1V!vZ7*j28kH*yZ$DeKZ&{`ux?8!&G-S6{~o zP!Gjs($dU@#1#nD(XK?|#u_Wx8D@b40C9V~xJ=k(Y?)?`k+XT|)MukMyH}GH;RZk3 z)W8uYTDN5mGv1`}pa)ckET5W|K7PLjWA2uw>SSi-u^$jM{&C+5OR;{+>je$#K!-F3 zI|&9PCiZn~;@k+4NE!mQQtqD+SQ_0BZTRIm{}eky5*#@1iSFdxfY!Xq_?Y`OYN91* zGhch#dn7}wNqh@x4>Xw*=>#%%csYhe!R}B4If)!?cO8c4E#4AY@XppM8uxpX19f|N zByKdb-w&6->$kYW0yg(8m^uP@$okhUedbq2(#u~mq6)G%y@gF#WZlh62v~l`jP-P` zU|C5WZ_i7bHydeKZ{&j$`f7RZeI5GNcVsxwPy1U>~UXsa?>)c_-KD}W>V7<;7zSl}-=*_f!9d%{tT2U=sXqOn-Ru+b12g`35|SgO%DU==Z|p{T zr74F+Fcnr!SH1qC-}>D}K+H##TAl35^2mLrVr2$ubtG(9AesA_>rvVqXu~|0zEa%% zd?X1cfy~cG(Vn>cSUBRxZ)o5Z-hzc^68P|B<3ZG;tHj+%Ur_@?$%MQ4OY{Ij)<2ik zqz>ij^!>BJ6v%@QW#&L1H}a@!;-lrMuGaC!>_04MuBm;I=LVLh8O(V4oQ{r?mDm%~ zNIXsn9^cb}FXm8K+O`78N29%An8{~o;QtR$K(D`U!@+2({SL>Hk68ouUDRj#qBjkh zwrSsB8l&|M&zk2R2|w>r;n1@ZIBrJY%6(n9<*`Hk|~Pd}+I2jBts zAte+v^mfFTHNlNBX}3v0(bYRQ=jC{yxUPIN<+ff!YX<`arYD$UY36*|<1xVos!@Sp zK@$BhI54xxsILU|6}}a7mu0b(MdUcpkO*y(5%Rs5cR=i*8;NecKO-ZxRFY_f3~FFW zcocD&A}j4Kyp`G{r04+*neLoOruP^3;W&4cZbA>8wHDoyxS8G)(6j?){4ozyDzC=5 zE*e)TQ~=hbiBJN`rC{vX`C#1gA?5_gSluU(Aq3E(w99g9Kliul+Z(eg$KS3xrg&piBc`&_XmmVRjqK-qN7l9;UswZs}BqJT_^Z zc|ic3OaiySH_(k(V({k6V`d7UZ$;JCBdCd$uA44M{IPe7;!bb?Nz6c6nW;CPtuX&^9AK0AOAn<@^LGE8%-E70Gz* zh23ibQ$rv7%rWv51T8{c<_8T&XOq`|{J_SdG^k!4E|7WNnBYZ~to3}lB;62go4Rx%D~ zHP+!S`mWjo&9yr_aR)VVsx=NpfT{ z;{L3fAI5KL`HV=&i24L0lDVQKxMjT&fK~keM-5xZCB;lYxME1g*I zKc$V*rc}oKjvcf5f_6KSQnl=8w+4d|G& z-HuE3?!*+cgNW$^#HY2)Xy92m?*_r_OOC=wfkxcSv5 zXu}8{wy4`rIXrQS8r=y;oK{%0hkM0-v!RVN5!rAC-}FXnGca&+Ui$)tWL)t(=GHax zgP>B{aMTICIod&8qRrL)#dgO`l-YNO+PL8?9P?3m@f-F54a68iak@(Vqvg-BF85Mr zBiWf1e}jq4xCKuwx20&>H-?K#fybyizT>m6%%Ay`#&~80GJXYaw+3G!#n=aKL%Q@n zPUx|-#^LS418Ve*iFkW!L-@_@UoilaT?#L=fy-)Z!j=kQXnP4?)%?X(&b*`L`S#0! z5Sqju1t~U__FbKdZZ0&o22w=~|Z0$L?RN-=9cAmzyibgzu${tokolIZ9f>%X|0 zwi$i>MB!;MZ0XDZqn6!e18Dtm8 z_WZoB8Lqz1EO(R8BS}Cc&)k5mPllWdrO9-7D|U(Y19jAO3*j)mU${;uBrc(`#W$I~ zT^=!I!A!Xg1-Y|f2DCDI^&-~>Y+X6#*)o5lWhIvY4$UC_n^6p)>#*iBg2$}iUJWhc zmGBG!vW0^Kh(}M}?KobV4(x=l2$hdGS5eR^Mj_$gnTYla6l)P6PlV{57O8j;!}ol+P`AjLV=5dJKI!O|0;)<4+%{f=%*HD8p`;a6`gd9?6@Uo!^BrI}c6hec-8P9mj zmvPJa=8hx6@Zhim+H^WXGha16_Gfe1_S02_^iZO)4*jVmRhtiIlL0N;r?cl95u0aq z#E!ngY`NhozA?m>i}e!MTLHe8_c2p`2eM}?Y+2P z@wvzeDpDJ$lpnNo|0$)oDf~N6_+2Cf;*PVKDTs3guKmlaY71OSLeICpGU+Z6svCH? zeo9w%=RIZ%!nom4c2lstMYrBvdF+YH#&%58_$lyevRP~!w~)0MMS|x!ND71dc<~)| zc2?*hWpz;K4E<|{{geT)E?9e7rAaxh0Lh##D`{v)d{G7M|Krrj_hCt15iVDmZ z>(!wP6`yFJxSyzpUvq@Kz*a{l>rafWxBn#*oIIh1&(_o?aodYlt=n1f%(Y#^`(FJS$Ocu$mALuN^3tG1UzqI&v5 zL$Gby^9Ws@BX?f}vSb~JwY{7jL+H(8o|^GF7IhJOg`@P|5{x`SdJC7VMmmtWRrii* z_jV3yFP?Hu>@z`C|Cw-L1d0ze5pP!cKpdl(l*bZLfx zBJ;DewrQQ&d`((`(=Pl2gf{&?^>C;JdISSvg=w09ofs(2kO_Q~H&uq}0D>&_U8o_c zW6Yo^KuIo&=+m_TBKiO!0;=4c89yA0L-$*wRC!3^%`33RCxBgt52xOGrot&f05lC+ zp#a#RyZ|WT`+P~1ChGan0hAABvsj>XIg7-iQYV}S1O#;=%$!rQ>X{I*lBa9h9WbFH zUfv$$%9M!7o>O~^^`Z?{KR}`pHzM@&R_PPgU3z`iDeB1%T4A6N$8jLlx2iP|7&hiSx&VWK-@^{ z)LkfV5AN(D3HISbDFRd~MY=R_MfL3)ifVd{-7?`!v__m0KZEiQL}%;h&Z@DdAQ9lj zO)V>!=4R^+b8ctfl8~O!6b4OGi=Pn>^%75ADNC*yOO@TL8S`TO;a`T>3Q>Gq z4?TopF9;S9>vw?ly7Ca@Tp_H@YR>TTZ#&;#<|TnSky3x`3jUI;+`ogrBQrrDeF zdYl8JQatNsZVr{-OK#5*``%qoLW2ZBR+X@-_z`mi~EN`g28q+oy+1VI#Il{LY$hss;1EgnIz z8El1%FoF&PZuU~fIhw-4)TKOrUPOexUwLX*R75__7emAa(l&UQ?EI4z1>bx0^VF9N z+x)AG`55-`boP0qEKNF()LS0YJe- zAptYsIFJM|n9~XS8bJ#4!8Tcaf#HM!i(S5gtXbzqIKLe=G+&0&52{SV4m=9DU#fJ3x}Y zWf+0A38pZ9#W+!&JL3yeWfa=l|2H`Q<(x(ULgPSK7c2INCVKYx2G;9y0wy47uq8YD+$Ac2iq11i|HhkN&8LLIp+v9=m4;*JSO|}7j zQ-D$Ni{&4)KE1~1YSKe?7S*F3*0zK*LUhPCyi4IT%*(t>$8gnBFflS@bhbINlFli~ z&}HQqd;Ar{x?3Vt4C?R=4e%Y{_S=XL&I~c|B=BWD(G}OfB3$YJVxQ@RzH0HmgK1G1 zHa%SiEWk6xDJ#B$fy;ui$H;y#f8Oy-Dmn0SkU|(F$%+v)6gEHFpytl+uAo*5L@e_RNpA*>RgDK z%mKf$TC}Yg&yx#CNP1o>v|cv@6`>kM2UaaRgr(#_lAB5h7yJ3*hI|X#pZ{jA>>)PH zWoE`5USx8Ok{vTcv<$qgnmrsHoPW~OCzwxL%CTX*$hH-@bV3tuR!Au9y5^T^&>ypf zG|#31KL1BKN`oH!Lt7IHtxAk~y$)5b!S+goc0FNH!*YDVmHBWDpK5_DY4snU5ti2+ zoU?z^&2IXF9}hJh-4jlg>Y(_2J=H~fWYSD|#ego8O^l5mWS*Jz-qr!5JS^G)_1}Q5 zXv=;1l~VGQ${@ZTfNNXJ=@R;;hoUDg@8*A7GUb(`yeGh;`oDBM+@*W7sI%$FefD)I<3#p zGYneQc%qfXxT%TMBqprD#}p}agVcG}KkK+k<Y1z`EVzcT zCP>!mw{UgJrI1U3Wd=1Az5fYm5D$aA+JU>zLnW5Tq{Te-AGwJ=0#(0fw|e-Dfq}gc z+MqC_>I8%4McAvA^BD}h(O>IQP!c2R*_S&^bXD}t8dQA?#ak5;gaLV8UU9u9?#lx6 z)U; zJB9DXm<7waD=L+lzMdLGxeCE-31_Y!A8CNt>Nx2hfuNxcYu!w`(U((7yXQQ&3Eku63zn_W*(zOI3b=8eo-U2%6GVNY=-BCGg?pB^|JSY%jDsjkKR-*2uldW2i(W+j=h;e+oiP<@ffn(k;LB*7KQ=y z`+=vpzF~;xho1M?Mj+AS4C-8)U7kAd;yhK#?2aVIx=nyPgl5ws&9KsbJkm2GgF)K373>Ut^o*6Hy ztPuONqX<$^6*l$!U%U%DEDmQ_{)DPek`)G6ZYD ztrlPE6Q*=xFNO#BJD0NLk}iky^Ld8d_IXBZG{YI$@ zhdY>9{_Gfx8=4?fwkAd#?UK|??NfHF##N4qAdRyLbiLDvL%{g`CJll+NA z1k^bl1DOwz&P4ehOy5^n?aF~tv6-ar7e^qk+7+s{B2`c3z;u2gF7#lobD4aJ**Okh$5ecwG9fJoGxW-K@s7WBua2V+Dqdoo zbU4k&h$qfL=x}M1C-}Mu$T}bCBizp*hrbTi5*c@9MC|W|+s7Opa1T!+9~qR}D$c(x z;2>AIS&m$pU~C07zsOm+EVb!-wxOG0!_7R`%ZFOr<`&K#W%VN3qdJ5AQoH62v-63i z9~cN5ZbGtCFV=9dUfeXk1esW3_io$K>}k%>zXn)6zhYu7p$*+?avYvuGcf+b`VaWb z|5u@F@m?BMn;@315UKlJ>Y9#hC*x7_+YWcEZ#j-^vjeMDD`XX%HwMgR`f5%LUQ$pQ zZwCVYPuErW1$u6;D+stesj=1HY>R-dxyeC0xRKd&4mFkSdv|3oCBgo8mPWsSh&LV5 zz`Af>!X{$v3voC*&;G7vCj+?d`q|AVe-+Z$?JyQK;!_DSuvqzv_c)-ZgX9>@JJo#T zvLVa8V+8$I2AKY~cBA1pGZZiFqUPO?F4cjV2-$R~sFJ1`+Oj1-8fqX;cfxw|+%YPT zS%dBlS|kOb&szZv^hF}+@!&xggkEU0GFdo6P6ep4)OIeDQD=yMN3*#3?!d$bXKa#h5kvn z6my*b1|X(Jl@>?dm4%2KH9p~t>9k8omK3W7X(1+41nJB8&ag=nkz*GB?s5r;VprCD zV~B9? zR`?v%{px*naEPEJjTPre^wUgpw;m%rC_$zbpyM|3{P~*#OZWBM4Z2rBUW~f2I7Ng# zt^nC4x+$kHF+}|D0R?iDhqP8;8VC4W!Cm0dgI*U}tjqB{uE&db>gmeaK7|oqLYTMM zXQ@Vs_u|)WV{j1?=*1a~pyN2(O=#_Rp*k`hQ-9xvhhSr_lCUw(X#>E=j<;*k5%16% z7RfBuHrKJpZXxTg08e!zS}Gcn73EdMU;#1?(Hj;i7^yFt3cv&;=wOBo(Z#v2;v^Ea zmt_T7=MSu#-YG&Ly|dGV5rn^#3-vQ7R> zZZYsC3FHZa1RgHl^yQT$#YF?`-RaT-7ZufTs>r|$mf!#cvv>?bI}_teX1g>EuB0fH zq>C!{d(A3oNor&=qfu%Kr0z2nKbsvbmE(0}GKwxu_{&1)=WErXXgBy@ZkfxtMB7BH|C*N$iJ zjmW;~b^oM~LGEyFgTLt~fvfdJlb;ECl}O>>lL`7{0&c?gHsP`z;w`mEM-pup zJj$iXQ3iSwoixeJV;9luNAiYBa6AS?FnqO2KG;=32ba7T1kg4V)A+MKYKFs+p4y&o z{i(Hj2!Q3OrBDgX3z4L_--^zGtEcWBQ{w6#u^lazNP1-t6$(CO3tjW%oZ}nn(d+iC4L@lG)a6kI3MB|oY-xkhe;bGJJ&Q379As02%CZ)Fk zR88M*>leC$^43Y{wPBRI{n82>sn5)}*qyY5DW6~}puRlr>!YKCS?_&g$ZROXEiSJ_fbdNHr8`qEX@{7gEWHyP>BPB%hEmr`LU( zPHi+}0F?bCX$nK`Gu`B71w{R57Gi{dDiHKH?t3Sou8Ma))1p@seSM>tRZ$Gi%Ofxy zq}ea$L=sueyf{T#{R0R~j*Bl?3zcXdk89iCH5c3 zVR1s@&^O(Qlr&uAz2Txy}Z*f#PWh|h?PYGX4 zR&k>Z&qAKX3+SL)7atr5N=YbMYhkDSI56h)it^p!?x(FW^u1U) zBt378joSwQbYevnBTDXwF=fOz)3swSW@`X$I9{?-9qx2r=ssB>{gXY3>46>Ug+M!S zVRSYHd~RppQ7pf@Pin7qPxsLo$A-`(Rvp!O=m^qp;=lratki(624g7nwvY=_BO&!t z)`Ish!l8&6(NdG=#g_5JuE(KJO{Q)EAk|VSMzR2)&(W(9fiiKw^e|G#rIAH*f9 zmWua4&$SZA8W|59sa%5VDD(Br8emqTWdSdyniix7SD}E|Dqf}1s$TajI(+M3%d0uO zfZl$7a4<*)+RfzN`hwJM%NWg??auXHJ4*kdWQoV(pauJf{37u!hkWrqgM8=YNliF= zCZ8JBz)%8I6 zXw5oPS{YCyyi;gl*;QuQdtBt-v@P|Jx40H#k%h}MQ5^oVMj8HE>fNxKXK1^kDHA+K z`~c^9i<8P`MvqdxZ@I7x{*x=j36tSxYNo-Hp`;^`d=VRnM=Z)mzq%%pr5?M3Z?Q(F zxbIw!QWr6NOOFTA(!>f6Ga?NIh+m{?<R1!cAI#-izd+q?g~ymz>q^Q^E!a024_VF@RBKIqLJ@5=x5aHa(_v@i zea30mH$gDAHeDyA4`eK1UR#sXX2_Z&c6&o!JpUOy*tJuC>K-dv_a>g+#PSpy_7T8&AytVoFphpdOv`CqRfg?{an+y8H~$R0`7M!{wn(J-g5I? z%I=K(g4$e72hvTCm{4d|L5B%`RHtDaax?(s^HP?^@(_R@j|TS@>oy5;%-F*Vuein2QI{g4WBJJGe844_NW|G5tCuzmipf>egno)*t^Q zV3$*e(xs9gEir25cUmgpIHVCJEQU5|&1%YWjd~RE@shv#AU4iRH3eekX%q*0uH_X4 zjxxZ_R61BQ`8ra`W=gkf#C|+{b^=Iel&uJXO?~{I2+h14GMn?WC7i0y*r}IvEHWHY zO|%Hhy*vR`<~h;&F@+-QT>hfAmPzkG0{Y8T-psY0q^XjI=9Ym-;e zq0XR0)lFCy0o$@ockjK4A$)F4o^sIzdX~u_TCkjL%8%$Q0X|9*_FW14+uyZ@=PO&| z00A=~!3tkDMG11cx%^;%ZF7jzkQ1M_PRcJTHp$5G_lr#>Owj^U-IQ_=O4KMP66$A~ z`Q9f-F$nb=>FrOE-|il|Illm|k%EZrC{ z%}Odj0_MMpobzE9P>Q@325&3mVS?eTsD%_8fN3&@e4AW%p&B&zhhtvU|}3 z#>O+*H~d(}lOM*G_v49riKY2{5*;Zq&faSfxG=ks0%j;n;eSYouzJK4tnN~ zh_LmeM+l}l2Xs>@2e>P_nsjtp!t?{AAc#T3);W7^aDj^<1QtNwOHmv_5vwwrh`S5p z-xK!tM2OJtRc6c3**%4;E;`&f1@&k1Y7JI=uP2Oc?sL#__ZT%_JFHI5wAb=a!@1uIUGtS*O8pe5(MB7P4;HjTVe8ki)gmhO4w37wopO}@ z?s{a>H#*)|ew?5#-lAJlTx`)xyzTPnZ8cV@QQGPi|_P+(?7x?-8z$`BRx*uCNs^%1yH{1Rh9fM6@X3o#?3Sx&iK3D2pwFnAzV7;@1xp@4H`1?lOGy7+Yh6H|g4{8EfC! zam}~QdqGKw0+ccN61JzM|2WvY_LS&wi%2Ma7)F#WOaS@Mvho1-7!uF`O^hC1nVwc{ zkbYKMC(bH{IBFwi8nPycvZH^aM}{lcEWGwNwauZf02#%%f+b3YP>7f*ATXgOhiJ8_@4g&xbhDxVxs zvZgTENqTV%J5sSyNxCO|{@7UTlE&h zeZWzX-~~rdm$Wb_%WIER-h7!05v)Z4E3YHn4DBSXPyQjBx>cJ&%wiq&0Ya<3nEx-V z5Ol`a=j%;3uo+zWj`2Y%cfYf(NBmL`v0YC&p(6QOn5N zLQGu)s{nF-#cRevj$Q9#$Un>2hFP$rn(Fq4nbdrp!R5lQU`$_4EcivR?n{F;grZb9(X%-0)Dy$gJ>V0D;iW&m@yNKZ>$Y3WRK=a#o4qPEf^ zLRZyv4)CbwGZXj@oOta+#pt#g=7;i1^MM1LT4RWPMZwK9uO^Y%crC>?m6DkD2aI`6 zF_Cd8RSgO7M2#yP1?D4-(#0tLft&>8c+>~$AuD#;l|lV( zR}opk2x)yL463K+j)6<;K8Z(4+rmCFgE{jN)|B_K8jauUuaX@?B8z>WWMdKF# zCKZPFcn6+waB<*oV2Yft2~2wo+4-5-E}#1yFg+5dWwi=zKz$kSnQd;@eE1eq?M`xxZj(Kt*BvYbdF6gelQtVSIL z0hkq_eSkK>?FWOf1f_C^&U&F0uGrWq(is&q@`K}{`U<*zEod>D7U+>no1cyfFt&bI z{Q^saZ|N3lym2j@4~u(yfFDCi9qD*%nzu zD%(pZVgs)gSw5^nAx}ApZgR-ceiU2GAf#U&;W1B5Y*=1{}IJ_sNa4 z`gUNeAL_Q*be)%vgU#j}k?O4&`6<|{(hMtR4QSP)u3-bq>p%?Vi?AKCZ~;{_B!}HV zDlbkN8XC?-I?&`x66Wm~H55{QhPiWSb7q*-1-n(wbTCLfJgLyOBYnuA)t(!L_}O*D zM9Tn3Nb*})ANhGrCKob5Hyh|tEKRZ=TQNY+;`Cw&^nSnO_hBGA2WZ?;Wb@1Wd!tM z(CssrRa(XIzdWLekQyBWgqjI_xULkL&Tmj;_)l%VXn`+AaM;})@Y*tU8X0EtmpNmvJ~{N6F~Lj59wLp@rRd z{^aX>=r42*q`viCq94G>x%@hb~$oTc#1UV8)pu3t<&B?#jLh zV{yJ&D>>Ng@Z<`8)4M+7Qe3aTP)r-xVQ3ulgW||`5lhDwWG$f|Ph;o}iP-&aq1|I?Qk>K?1SgE`nsa| zO?=+XM)x!c~NOJeB#=WODY5L>3A$WrmC8CDa8 z68C6;b$^-5x@eX)Q9AtqqN$D`*-gOId*Jf?M;$%6fzWDlNdI#Bg2|+6Jai2PY=;7k|N0A^xA7(qVa<}9?XSDzw`wXWoM#aAhpCYRSb z|DXFm4c6Oan(Y?G!O9z{o4*!hu4MaRk|ryq_vz7a9H(BG3RuB%1kSIOrOM_$wHfGj zjW^2Jv|%!>HJ}+4TQ0k$uR`LE_!K&XIWtKZ%0n|2R#c?`4qODN-rxhylrrOh^bXq+ z6t{?Yu-B}YxI10M0C823c#)=@PamRDFV8h*JskY+sR!p`RyJ?@(!soxQsQ=Kfd}-l zG91h>)_miEve6|Sro|*#h^dzcX1O*(ao;Z4>G|3orgzFit>E$V`EV0UqCK{6qTbStr;a~ z$ty-lS~5z}l2(k8v}Bc|B&``GXvr&WrhKXsiCSQ}wZpc+w_D?8F|h_d{A~1k3|4~+ z@^!@uCGqD8Zer+ApiU7hfDGs%FOE~2TbDiMl0I*au236B%0s4N`1W%hJ>6MgVfDWF zSEaQshgL@pcF@KHuS9?` zh9jXUR*=qQ6vKijF7^oyGG2`YHyoFH?j_?mOjX0M29r6|b_?Vjt{w>lQyMgqK4AQ0 zUr}_NlkqQ%RD-gJ<>s%WV`*osdd4&8czLQ0Qo}4lea5?5rwvya3T@Dd$)CNmrCBBF zyqb`8Tv)|^93z&rtP`vg|V+@7hYdakr<4|2>)m#3XLs8oW zwnT-CjC6g{j9f$q)Fm{lF~*evFV7~@d@ufENWa68ER=_+(socaleEc@GhXp>bzS#W zN*`R6TJSMZe-owd1B70)HWyH_;xYD06tJ0&)gu*E6P$(0_ec$*qqUZT3CWXc zVTn@MKEI8I2>o#uFUGQvEU9`n;{3cW8)I4Z*)kXgX*As(8DW^{yS zwSdyX;QvWx33ye{&?`Mx7uAsb5I=skCXtP^NW*|&Z?xO^ZM-QNGJ}j~{2W3^6A{pU z0Gmx0_S@Sp)RyU^J%Zt3`Ml%r>lqGF-9UkB+&z!9c$W)LP&4DYFL+NhEV1*eVnPgH zpVng&)yMx`L?sed#ESO&L}x6zRfk4x9cTQe+$2^7$s0L&#TQaQBw=0)uKmPVp{RY@ zRaSTAI*AixB9p?P50;|UtMEA^d3q!+GU#r`r?YMV(qdnAd8De;B;IW#Rt3|O^=W|Z zW%pji=x6)8BlFH2L9XR7mYc&m20J(dPqNE3K$pU*O)bOs+5HXxtwl%g`&urOD<=Ts znXgpg$5<5$QWmt=Ki+W*wqg3uUL?#FP7|mFQ#Q^mQPe>zN+D9HcnPUefpUB{b_oTm+y-U~oG6oo|9&&`X&B}~sp*}RRKN8SYZQ5qEu%XEJaIlNw zSm1+hUa%cNu?&@r{m_w8cp=U}nw*uxO2N^`=|`xaxk`>_4i--GUy|!RoXkJi2~f>v zqU;ggBt9})?xdwKWWm27Ny>GD*e02AoT+Y+*8pO@L$As9237ljz6z45CY7<%207b` zb2;Pm#{4hgn|?zx1z2+avfXiB)!(QI%)>xlFR z5pFmZ7%@(86`O!Ok@2lvSujT5&QUdI(P$DxY~$NnZf5C|aeH0F7e_EWJelXREWc{o zhsLBe&e31BZRX`aI%nx^(Q;#yOw*Y8^U15N^+DmZ%&0w9fd`$Jbn3cL3qki5w~bh^c~Js!L3q+~a%jlHj7C)?^Iebdq;O^% zI&!FEKF-&@0=FK>VgFhr;b*a=!|gYm_#W+VO8CI@)5hf@OezMtzwwS%Yosq8`-# ziBoQ<`pH5@dmNp+sZ|bDi8bVQ6#(xj`sR%kd8NRTVFOGs z##WYqO_rUTksHN*+;Ef;GouM0g=AM#AvCosQFNO$@Ls?Ko(T6{pd++YpQvdIi-W;8 zBr?`_)!EmUi_plfX$2t52_PUI4G52ksLLttSAw5TWi2g!yh10=b5G4!8^k!qqyjno zXwhfF;wKPV20r->$f52W^(BMm4VNXm;JP12B}GT>8t}NkHkFIzPd>pXF;@NQ1D%q@ zOH%xYMqKBPT>PMW6+et$!#PtkA*q_%l$Cu_n>b*Tjo;PH|MJDmnY%(F>X>wKMt2Pk zW}2p-RdU}B(8VR1QDrfFUU&KG-T+WZNKxVvoExH?0YI%+*wL4I&ccWEmgoP;@Vjg5 z+EI%+5GC`+0^-ENgPJ3K$6FsA>I|IpKGpco5R6u>c3v`bW2Bf6~Xe*Ta9gsUf|h60Uld7;R&HSBHI|W3s@*}wRiU06eKe4 z4^Zh|9ihRRyspHgx;HZB4IFgLhN*B2x&yjP^+Lsmhh2*_m~J(@axj&o;yHT(y?qI2)~;FI_0$6yv#B~VrDuN7Y1KeC=CS|AHw9zXeszU0_(o-%5<^+$;lF3?B=Jb_l_+!su=rg)w2HEJVL_e2z zVz9q=Zo54&m~Sy53u0KxJ@lQX;_aW_@0!?ULQ~!F5smjjM#|j2*J`U&QnBKfU0VA| zz_$N*;trKZd-YrKsrE+-b>1IHi1&a7TaxN;dx&cL8cYcKqcBE0c?8wePIkoUPsnYr zB@Gij7feP`a7=iWt;5&)m;68n0bA#Y24T`=ct1`K(*Q0N=P)^+6lKAs%HjwJj6;N} z4&uyS*e+zOA2`LuU#_vRd)*?Pv;NAONAGl-zvFuf3h-(gr(=1`IAqa)-rt|Zg2a<> zDCar=3`4o)H7waBPDp+L3{Qwi+6)ypz-j@Me z3T2KZHuGGfN%UnB9>DTKYeZhbK2x5Fd5--)SeF(&@xRlXlmSd$+&l=OrdoaZI=_#{!i%v} z)1u|n)06wX;~W73(CN*JqI4-?!zez^%A~jM*m=%-F%i8oA%^4elB;%UpRnRd4_HlD zwh2U>u%(w%N)x!wejvMc30cZTjLjR7j0s57kT6bGtm0FuZ1Sf>WT}A|xEd>7Y)TZ$ zu=U_w@*hdA;WJYXt9HOoI`w*cMUf6haSnzreca`oqOIZpnrRHOfntzoOO#V~__R8{ zfqp6x0{%!ZQdL+i!z4mBPvG?kYK5R zKV~Qgd=^~>96;;g?;A;HX zp{)!mEj%zuwK9B8Blrl28_~uvb}T#GaW)^-4Rtx^DqRM9djV~8T$e_2qYrL=Q`Mfp zy+oZzwWW^JOLSlgy85vTI?W@j44|k(=l^FIURLCV>R~{h0RyL>{I@<2CLxs61rofc zjg=lEyv;Jh4g(QItB-oRT@b1DE?c~QCF=e#Z_RsumbpDkYryj%w%MGMooPxJE5Rq* z6&COoMbGNkHNp4*Cive3vfu=~B>UU23_ZLV+)FZ>?A_jR^@h)0T#e|v?sp9151rfQ z#oQGiYLQk-_RoD_W|@)PQT_Y*#vCF#h2JLZEEyGep2`D&qryIG{al{@AU!qDnOTSi zgp?5r0aX&*^y^8hnWLhlO^J!toC?YFd~&|HbD7;jB>AlN^;_IA5lkuOM;L1*lj-z$xhS%Pov-XA#w4?cTVo8 ztw^ah_9K=ojaqsB^|wE6##@#UOBRu&4U;+*)H>8^=`~ z11vH;zk0x|>7Fm&BwkEwQ#aiZH)qGPA-S)d2P9r=S6p2&{G!I(-)D`8WP?8qs73W6 z#b;Lt0|eqeI{k`^xepbSffmO%J<@J_=Ba(RUK=9$rM)9;sQmKdMa4u*S*8VHG=w6h z67|nn-wBzXhq@F*<7nd)0tKC3Eju%jlJnXRh}21z1dRT(71cxr)t@riq9mw>V!{|2$UE3O!8`Um>W6W{Jm-nEHJ zdjaMA+1&*AkX(ff1>MLy3-0+L54m=d#&2$4Ng%e^sG(xxIof-HbH{*riD&f#Hh3KU zAEOR4?A=kT25n>QpHc6@3OmyC6 zMaz3L;cM4BRPByMGJWPL#uVzHIV%44(#&w}vQHWBlf`*Hy5%R}l~%e!*J0_Nngvs| zXOB_7S=25H$LB6#R~_a?W@uy(`?Q~_wlCAs`=lBa7=Uip%r98}H z2mwn^toT?F8WE994Y*>UsxGc@!QX-g`=7GI@O%YQR3`AYi^aBD8^hGZ2d6J6*cv(3 z;DwtGgHNj=l*muz`GO;^opmvXvEJwX3P~wrP9sYlRDi^pml;}d)}+<#dl}`ZF>QW9O{+3z9c=^?u)P zE=9~K#AAk@*h&^xIqlkFY1c2&oW-iE<@u9pQQ{0?t3wW)a1`Crt&e6tFkh+<31!OM z%e~N;7Zy>?;3rWAbah-i`eU`9mUiH`Gn4e6g88Qdfsf|bxuU;+$ZBNR>)9kbbgL1Y zrvW4_N`60@*!ENJ3Q%#XyV{x%)W;0RQ=%gD>{IR(!akSF{%LD(i@u4at&Xa~H4thx zc?SS{3sKXMW1)an76JBOZ#&LcJHYtgof&5 zf3ZZPBFkla1?d84fwUP2sN+#)yayggA{8=7+5K=tatWC^_ffi1P^OZ&3yUXj$mNIaufMYE~qrW>4eBIZJ!>EIjJ9PsP&hbzadI4nXNwnMbMLX&4hVFOGp}VIm zVu)&wonfX)tN22KBU6KXM&fQk*8olxIA@!~%v<&0BahCIqN=k;-)_Y{LuiQeVzM$ znvmPTsr|Lw_zsArddb2cS=r{N8R~-JB2(1gYHlqT=|x*!`lZxKeonI<5v*6qeLBiu zkiZs~i!_C!@%+u-O@NG{?C{wSp;rR2P!%|*I%;MXO->Wo8jPGwIB)Ta))D>XCSP*j zb6I7(=uCd)TcRdH2w(&G(QZfv47{N?%{+D`9HSfr-x(Rsr7;XC2*44E;j=?MAR}$x zQ&Z+sOk|}-_!H_~@Tk7altGhjp2~CGyjw7ky-TYsA-fzP3u*)6Q*szf^@6%X`<-AD zrm6g0Lc~gwl^SkzeBj8V{Zg=PQYrE##cBY^;pkD|N!>n-+T%!}lm$jrI5K=muGtR@ z5@WoW5&U$>)X1C%%O=vPYR;1p$^JTCvcG%ba^MZ{j8Y>Bm9HNo;GZt71=&oreM-q9 zH5gu66s6g_b&YYRN96WUQ7?8h%n-xd6Yna&g%#KnrqcuU_jYvjaloanIoIy$)F**hyFM|BO*>3cyYsHHRD=Fy)`y?9n;-fACDt- zn~hb}T``7dh=%HQQbz#{^jQE{yXrG1znWC_+W#ZR-Fl)5z0m6`v*yPY6fXThaK$=s zhsHg-v2HnPjkba^H?D86NLREE9eGqeAcrF>dYW;iQs4pUq9T&~MkDJgftiiZiQrr) zkZF5#9S8&)`DfL2!FdeR{HXK!arS85fo#O^-)VY?N_eKC5F@VMjo9qGsQ13N$CQdx zAex`CX*zY@$0z~aS_!t16AneB#U5tBp%%aY>u)Lo5N$a?PA$bf&S3oIUg9v}3GG)n3m;OgWRf>JZz>uJIi$9lCJqf ziZTCjOfnZUnR#{1JHuLgN9f$hX>%sp30x`rxP1^UU8!Usjd6r4MAj%R=HvJEcvdIz zGK=3bZtoG>Q9Ye*{3<)?5eQSyM z?2f=&KLuxQ_7mJ^I0qTG$(`ilkiAhIW!DKhU7KNcK|`aU1K$8_@&m^`nuC?99}ft@ z!Vk;}{t*VfKj=O&?y)QeG-6|aGnaOwHx~R!03neGChJ>E8la!5Y=MVaxpJ@xH5zfj zoOv@3-G3!5?)3`-Ci{Q(;=ssW%mny)EmwPF8dDQmQ#4G}-?WfgotAq(Mls&4bciU> zNGsCgb>9Qw!iooIqn4q-nC$Fxl?gfy;0YU)`d7^GbWgkPi#wK}!xW!B9mMaiZQ>Wq zpHJ??NyE*o0nI4&iOzwlSMWZ0kSM=l~dQq~DTDMv;BWu(W! zaWVz-tME7cepuD1x`v~BSJhbQae}`pXJ*svt*P*A2gYK&eED=53vq55!$_XvPZ{%7ME537wbYF~0lK9TCfa!dNOu zsJX{62&5LY%^u9DnUM-&n=qsi_560xnbIr=fbRv;I#es7EW#QPI0}kRZ*z zaFexghH_rbP&|seIQnd@+#y+*`s|e&MN&dPm$$Jb0;ZJ133J7c$7&T+htXWa2CCp`A*&)mx0d|1oArtJc`2 zT8xbi?WGq|LAR-j{*olTL6>l~C~0MyrAD3=K_-x1yt~#f_!WFe$~=XrU!0W25kUt+ zhKip=V*a?;?EW3RiD@e}>;`;QwQ$k>Na)de0p2Ym-Ji2!Z6}XKx-l8hHde)WzfbCK z!C~bGLmD$^t$vSI>!=W~;*qI{aGPBaDY`+VT&WKu#O^oaC{N+iy|27d6Byz|u}O1@ zfpgnpVVk)9OoiFqxDIz{KN8p?W9MF43!sFNNcI(iSjP^|17wq!%t%G%%5k+Cu!kcN zw1jUH{6zr(Qd%#FL9C2dM;}#%NVR@0EE=53y{FzOJ(x1dJA7OC?wNdM(HTUjFGZhT z$s8h9{C*d@Z}(gSrFRn}+x&BO13sxXmG{r$!zV%0tZ4$);nrp)d3smZ2llv{h$hDn zt3TWT6+qLFHic3D?+iEpU5$`D{yV*ds{9grbbmw@mwS;ry*c2yo3A$!ZmeJHr|k%_!6A&qtEGt3xaup4+w)qI+CYnbkDa7{*XxwYe`Au z9*828qNWIlN@fzjMk{c?4-v7u8&a=x&R(BW38?a=0N%3qmMyqf`oF=X=eC*#1GTI0Ra48Cmw!&~JvJ*Xq^?1G4UZpI z5@@FyROa}d;b%W&Boom^N88=I7_PnAer(&tJCS~Ff&#Fw<8nbQRp}O4F4Efk^5dAw z`*J*HTvI9B&GKkx`@+gFf&_`O^FxT8z~e}xZ!aKyw64X8Ut*C;;*j@gF^HqEHVK0I z7p|sd`zmV{goW{ht)*DbZBYIOXgttN)AJ*(q zv$Dq;q>R{bw8X*{#WNe_Zxz7ZJY{s0mk5feruPJ3)z1&7rt$D*jD@Ykmk!VnY={Xi)@vh=uI987C}o!Sq66c zzH>&V#UI{kP^ILc_N*)&^6faoWG^or;VHBuVExl>+SG(6;1>U5Z)90<=#TwdWVcK{ z%&^N4riwzk*SnVZgXlw0O8O&T1O;P<4~Tg@rsXM!80c~Sn_!#;Yy^lo@vkKBqFcD& zH~+guLH7c!^`n#fag0@Ex6)-QfEz&^0LHdDipmCL9vp7=_H{okA>rT$Ex-+QxBxM7 zXQf^vL9mZBj21Ms!cff#6sh|$Lh}%d#35oq9YLmZX+qpwJ0LJ>BgBTK%;nrlTu!42 z`(d>B6s1wr#yVWneI2RgOF0Cp@B+z&DC*{dA<2=U2*XUOH?JW#0L(9oKi8;xn4+u+ zz)WVXE_W4-z@AIT!u+#^;j!eA^-lJO=Hg%eZ*jRXxQjH9E}P@<)X;tECo7Uks(Iqt zMfxHaQI<5s5hZO;5&&=rHuy&c8`IJw_H!G?E|K@@HtoKc!lfBAd5mWd90f@q!f|r) zK(s!V5sBUZXDVBXi))VsY#z??j5CURA?vuSqKdAMX|SD_K;1bzlJ(gG4A<%fchcNt zwbR!2I|!y^L0pIYw@kvE1D|-qQV7Vl&z^OuQs4pUq9US(dm!J#H%Ei#&wNA#I^mrl zkx>L<(?HS7APEgmh!W=VPn`rC0#{|_I`eW${I~nRn_DaUC1leb*)+G?eSW6BYjFQy z01i}aMD|6{d@AhACV}utruTystm-bogA!OUsst_noM~1ehYi&B7BW5WxZk@}H|xY+ z@U_inXxwj-v)49&Da2Q$<}x<&JmG?!8VtFsd5}Ec!*#^@Mn`D&#K~(lBL|lLoEg+9 zg%z@r2Dq9gVt*81i3Rn4QbS!iC?ndhu%~|Os>{6FaV3+xJW2xmLn5Jbc0QR(@I;#v z-2gF)xev2Iz~XaH>iH3UY3>kS9HPI$tC>mdBO|xQu9|ed5>Q@b8$|fzG%)kooR&oY z^SpUjQSv%?eILhyheo*Ev+3gJg0>Tay~liAXTNGLdg8oMN<+cMi#tDV$E3$Sk&D2W zXP*d72t~Oub;iCFA*xtC(u7!ga!*+1JO#E)6Ja04{r0lK3CZ9oUM#&Pjaz}XDuH!@ zxu$>iMi07KgFSt6NMuN(OudAUTgpW?#~q6TeTAaXiDA!{a|B0P%xmDeozbQwS8#L2 zQz&YJW*?^VtYvN7{6735GX+qCt-^l=ID^tlqrM$I`5?%}S64Ki*{x7}73_#ILSu}s zl6Nhus}hQyUa4ER>(HU^`CQO!j9IQ41CxZ=4Kh0zJSbev2Y(}#2+N9N{4o&|hVuEc z1x`QOJ+(i<2-9>m8K^lm+GrY5fD86&D&s?T6cbUNxC96JSmo!;;T2j%UYYwu>hL!c zN(OtYY?@MT_n)lhSQ4q?pKBs+pr++sh~X*!Hst} z0ca;Ccg=3`JFf<+XdA~8WU9Yo9K7e@blY?ev0JdvT3x`;|Q^y$+^&QFi9gFA`#}`<8Nx^}FrbLeU%>y*S3XG^G%e zHo7a@!j+lfaL;=0Ps0#Q5ziV(_jqPAh zK_ks$JFqeABVJQs`jt-PLd#rqh*+$4{bDcRqo->GV)oiBt<(dPq8~#LN|9)s>4N$h z7cZ`^Xmp~7LCD}3R=w59ML)IqV=Qia*%55fcPrGEZ)}JM$I^lWgO{KYmZiHu5Bw}= zEcECJDT>E5-`Nc-{gaHRP$C7dQ(>E_?%JT?qn|i{GnaYXet;2Z1bCDhvc8j&ve17N z?lsi^QbdH5rwetYMXAcLb}#hoMQlF|+4Aff)P+GKwVOMa&lBCXLM2~GDm;oOIHyPH zN3DZ)ai|`^XnxAy!)Sy1W@uIycn0LMEHc2i8O+J%Z;HKm(k_OW9Ny!XGOys#xM?0S zWjX7kd!^R@X2>mS`P7eaPk67CkO_>tvrTk&GxlFlmhV)8&t$wkR5`~96;*H|;mleC zOgx-*^I41Uu$;K|6g-(H@CMUmTmh-9EJ^3rr7n@AO~Y6WJ!nZx*a+$M=P{<5&h*L- z>eiuxcFK*$r#5g91#HE{tOgXx-dk?y193MG+!mDQ!DLr68 zA-r;Y$Z}7_uk0cGBY&t-_HJAG=gPmA1Jt5+jTsz+xeW@g-kN&Tux*)k3$86yZ3)OF zPfO>xy|e+=Ndv1D2K_tTF&woX1(#?as^V&7sdZ+uJL9(v8k#FJhjIr7AQqrKXeh1V z*yl;g53RwMHDO9?`rLD%>LThSqRfj|N}J4^EKbB|(>h){U?6GD*sE!v{9$<&0gG~3 zZ*vi}fA5;A)RjxL01u1CPa28QB1k7cvLW{rAa z4!m0>qBA-YsIh#3)e|V^)xdY)fc>a>AW=u6QOt3F`KxbEo4D-3G5dcn%y{}CmSAdHq+-{!1$a` zNj2q|E$9`5<$-H?Dn!{gh0tk!Bqu7R2_HzvOTA+f z$S?_t5nX(>ut?3;dK0jsIP_2cBeIt!?`GI#2$LlxN5#vk5{*->i1le17;Wc}9T5s3 zjq!g-!AIiVKPOcxm4ERbGLE&GdJDK^RE0!fXf`>^ox0l?!e_a0)6$(Z7k|g;h(T+| z9Ja1_WXrao#|U6I5!%TSOckh`-L9yHL-jm0dJcT>o_5DV2;BAKp-#58eJbX)ywL2X zWOpyHgaJEl!}4rdv6wD{!Pr4?Vw*#axW@lU$%uV=Fi0g+9F=xBBe0nY(AY(cGHWg% z0e0oi`P4)9AzIK2!r1>t<0R*H0#b}9k2@0MROgv5UccJGpnxGmqR&_C$#(5r^|eb4 zXc+EG%J0V~KVokXjW0NjzI(-cJ{Pzem$viaG`fbX8ltq zVR`ygwOuS;dS$tEyku7gl%+b>?A;J&&ny`kVN)muehelzkBU*CPeI8mHQEcJ37-~u zM#Sr_i2}==Ls3wGSIMAxJegF3fLUJ+8Fm6GSv{*FY8*zGFC1u1?dzzh0OmR%aDCBd!Zyvx7;Qryx_kQ8<`?eP;F0g0Bv$tLPY{4gHcmT@u z4F{HWkcN3x#9=QaSSnHqFOQ-ID>}q=OG_+_ckm zam}8Bq}kzbuUMtc1o(E>46F|*ZSleA3m*W18@lFMTeT+4JGdoK2_7AuY@|&f9{Lm? z0sI+7$J2&_(G|ra#`372cR4VENPUveQkPyCq5%dJvJ1D_jY9eB{(HapFCS`JHK&1@ z7t5DqfXjsZ_Hb_1Sv%AX?K|MrO7DxEvV^iHcDs2k?;PKFtU;{+0rBI8Lz{u@2nDki zxpdk6I|k6R^SCCtO*}$R-lq)+0-fTMrU_z9G_>9{wW4W8>+%+^G=r-4_A9hmDQG0f z5T-lEN=3dak(O}?$-E%vlI-adU)p7;z#M}Z#(@iqqCH{-^BGUIkA)}C{A&UCQq82# zjld)VqTlC=@Kx;6b|^U(A1Iot*ivmF|FC59&{P5Y$%M&eK!~5cH~$zrnxH9Q0b)Q{ z^alkh+8$o$egVv*_;!BWzjG!-p2}8wiS%N&aZ)PAxch=g@VF0yY-5?2k=wqhd^^SN zoKCA&S+>Pq{?@3q<$AW?7@DolcBjJ!wrPH5+XX>E1;{vdLI8=UITHOB?VoC2H<kHff|6iJ4f_3Iah$)y!s4A&eMVEk1Oqx(9FwTnGBA-797W=S7zc z1pr~ncouDFgvix7S3B!gat0u-?&9 z{BeFH;o;cM=MT>ea@!;$J`dDH=0RIr?gMI2j9ELGvtxL!d_9%E!@a=_J5~w?w33`@oSpUwLS-p+z#K=M1$bHdzA0kR2RkGlF08n!{(JSjq5L zu+amV8Lh)@2S;!pu@1R1AJBH#+encxQHw3hk38fK$MI-Jz~lE{Y?46lK|>)kWRzBA_t{R81c zS;-Cw3Zu~{(G7E#cWL z*99Gz#QmfDSX1<4T$(?bY>XO%k$_FzZx7Fw66 z`d&6if8XLEa@C>bxEI?(zFS~A<6*(CRwrT8f#N_YG{|R>VLP}h#V%lxPgV#0l_4!0 z{_fRU3AUaS4tg+P2CmEiSw^Tpj5#}L@AoE!-3~76mT+2P%`=lBQ-u@?A{riVbu*`z zGu*8oTb6Le5nr42{nT-y8T`h}|5`_^(Y;}~*j!oq_Yo8i_HW${Noi>~5;wT%6b!(I z(;FbE<>QCu@?xTm$ZA2u64p#x1A&w#;t|rThlHZ8kXe0ycE~U0-*z_>U_A0ava#5! zVyR~ZV~0CkC4^|yB&y53tGn056zUD?I-x2l?3`K}fOQoCwm93gCR@bFvi>xJNaIV~ zbTzq{zw05qFQ@5vOM|pmvS|{~7z*^zk51CY-%9xGbYp2uu~NWr&d^1QeVt^IIh3J{k7B5Pb@qWR5UsnxOeI2BaqD`c;S?5RClQ( zDf*4!73-t2;+l9OOg8TM!dCun-ypb`>v)9Yn`Y`0hp;jI4|f?QVvaCHqe9#02B!H* zXKQo($-D#Eh#{NXeTa%r6!Xv?G?Y?D&XSJuVLZQZS*Pr<`0n>rT}1zx2=n5V(kAjI z5+~qMD2N(tf&}H0pnMFa8a0;4Uf?0$^9H!d8oS%b9ea^4yzpex(uhB zk_3K3t{1b~dLiElK87TnRavV|fD9=zFTs%=t6D724~~r5Ztv(TM%&@rmy4GZpJMaU z`~VU;W2VAaK0WZ3yLMW8B6tgyvZ{-m1gQ(4v+jFsF;P>X8_Fe&fdHDGLUunwL|+=n zW0N{MmEKG zfxI$p(sa|Ge0|+2Z7^l)Rdw1)>wv!wBEvmj(%?W|?kJF6MnVN2Y*DxRUf;}_ex}lA zsxhXSo<4$DYjt-$6S%7A1#5~-EN=gY(2!~ZfKw)I{c~iq5~T7(C{YpLVsY7=H29qa zes9JmbPq#f`J(w#b(^RFWn0dUF{fX?&CkrEWJVB(uk(gNlntcQpXcCWMx!Y@dwr}o z?E18*Y3={Opx1*cE-WSmKZc$|msP>pj06m?2RB(TIamxF4O;{9-? zt}J_oAKn8>RX+Qy>W6cte{S zJqtc~N4p&%1n&BNU)LD(Z?XM4eZ{Ng6bJ=~mk4$(Tv2g($8hS7(&_Ao&C6?5!q0Ix z{(9pweM0*eNH~gSpgN{4W~r35FlkrP3|8oGJ4tIe4b|oQ#22yUj!F-p%RV^280}Ii zbOiUK+gQG}!%7}Gs$3F|RmSWk9q+Y;CB%t7h}aS0MB~56)qnPD`)F=H1we^D%K)gw z1H4m1uY4p&IM(P8f@}b4yNn(!dYg%-RzzvTYAKosIC~GzvgQsF=)rT zQV`r?9XjC5pE7+_O=!ba-o~G0!fGm6d~mStLYQ1We9Kb51(gbm>wmopT7mK*whxHd zrDWydb8d=phJHtSL~6z19{<&*I0iX(xtsg#DwMw~Pj+A}^q^Bm0-VNPoxbo)PD_7Y zB$wb_S-*8KFR#7pB2hzlEx3d8Y=svc9?(7~>sMvEH2aaD)Q0T_REje2o)X{=WX>6M zhrBzY)z+KGcg4pA8fZrbFUOV%jt8qwwN`wMEB><|4r~)eS*?I@KfvFKz+RCa207(`YLJz3i^LE_WnJ zJvUgV!_(f9yG-ILvNGSXvE3QMQ6gTOW%Qg&IdQP-RKCyc9H85+6+ubvoRtC_YOpp) zDF4C$KpeoxELg_H+FsTy@06+d(`|*w&ThD8b!M)E_?$5`OyCPz)@AW@TvRayx6vUn z-taOn@#=B|@@*FSC>b1J_OM2BGJtZk+l{}_DvUowe!$)xM|Ym@P5srWTNf;skv?Um5r8>z8|0u^^N+hVL1kC8J z!^)htSzd;TMf~N`&`?9~xTX-gEd;fI8(+WyM5}8m*wEGqcO#AGq_r20CyG!Adx0L@ zQgLrbjljG^e{QdhAV`MnuJUtP^Z)7LBtIY)-7usQVjz#3vfXgp7q^uGe zG17BCqR-w3mPAash6e`IVI@%o_p?W{U%H?V-anf_f{<$8* zfi?L@wI8R+u_-W!JjrtM!c|Msd4j~d5>5xYA{cCBM>vn_RB znt3kfYCG&f7#t%?oI+bnXS@L#WWjYFTKLTwPA70k|GZKOS4yo>2eH146?+%=JmMHB z=gw5*A%XB7bFtSl8G*G@ULmsZq?~dLcFoAp`^C{Dw01`-zBM^wzzDzrI*1X=eFo%V z8g0}M>8#ob;e}3?nvky~DwfN(%yr}XD&ztBOkE+L(Ud!qv58S|Xzc4oRVFHJ97YGGKq~vF|(GM?vmtdh_1b76NfT%%vYJ}e*QlnTSr5Ux{ z#kt7;SaWnp90HM(>&0pb!MKvnz!=>}stO4cYw+Ln2T`-)xTn@xPgg9Epw1GNn*ln= z2ztPJI|`2ZrfO30GHyW;LOB-Se%vkBhizV851u6oyW_vlJ)md>9~rz|s{gB`rIcsJ z2m(-Ay5d6v5eqR<2DZbfpo*@}VQ}9M>^tRcf#^W*QmcPO&zXQF$bV!_!M>!JXfQVq z^jVtfd=_@UdKPQa-zO&6Blz6-kIe=ax?FRK7DCxlYNxNsR+aXN_qN{kwHl)cqBt;r z4(k@pCLws(1-S*NPJ>#IC?=z&*cV$~k@PqTgSCG#(}#$w2eu^XL1terL|Z7q$-1Uu!wE_L~&FUG^6%{(cg1$*c0 z62KsV8*L$(J4B6+vW4d}*%rd&+qdS}KzEg2|0f77;K-`-OsBWr^%k=+qI}YajUhs* z1#uv0vBR|elwFS>l#uUP_nS>yI9~s}IWV&d>cE_oXo6gu2C_R1cc?{_;=Fs6-=P-O zG=|!xI3r@OY5N_+7{5QW&wezE9j*1S?5#Y2pQ5bo(8d?&0jQsZ zG7EveKDR}}EtVNk`7!d4a5q_yTs1C9Kr`gC~kq*%nl5FQvPris`eRp3(MQrLFnQ7=^ zRyv}oiL5Ljv~ill+WzvlYKr>#Y3ES^Xl%C`cgkYnOhvTS#e$lHzTvs+Cy6lH-|x!O z_w2UcP#6BCHCi33?g^K@6oDFW8u+}I4t}|r>_!LCIZi{HcTpU(qN~`{)~XYuirx%E z(1+pwpRdca*~L&nGRN|gvOT{dNX~XbZRmlt24{%y-{N3loE5|cVA-QEHo?X&%O4Gl zVh!5B*=zyAjdETwEp{af;8<=M$i2Y^a0eaVrw9#=;x)&gOQm+(!Hg`YZWyVOa+H}B zm0zfEW7%+(?D*@neZX-$CYmBdO)AaD(?|Yv8Ilo9EXg@`kLa>uK)w%j$wP4%T{Soy zQ?U{p(`t&uMYQ#1XzhL(Qy1-HkaOge+kA2-)P6z&zWibO%@_617KjaRSFB$`tjv18 z&T~t(omEQK&XwKWe5Nk&!>1LIqYj}C`L=MdQo@svx~S}}(aq1!_DutVVKREl%4W1# zki_oky5DQf+$mvlp*Le=#EeMR@M|QzR=qgicHWCg6`{@d`jEZO+S^F2^II!{PGLF1 z-LSA)Qyx$&&@w1(IHiPj*$6p{AL4*|-nq`;p*w<*TXh`4bs$FGo?5}pBq z7Sqs^3T;}5Gqtv`n!Fr;>=@}r4g{kxJgZ(me`^4$iLx)OIqk;|U?r+XjC=}^4bjv3 z@O?S^cDQa&?KZV8b$r;jd@IO->Z|Vu<6QgW8W@zrP-8@S;rhiVIe{`$N}$r$P5UND zd8X!G$S1|Wsi4%#n!mV8dugbgeeO9W%EY|tFd6J>_d_u=Q}cTxm~(FD_1xB9vOXI4 z=WT|)5yT1&Rw{ulfFxawL#RJ7Se{3=uD~jPR(_L)dc#Sx zrt>;St-c=u1;L*P5{(ynaUJ4{;MRb8&_*qJK>(j0a*#NrExC8YIUR}BE!Z&+5!u$C zje}S%@L-2&!lNQM=6pvZ2)v`ncEbHT2Ptm6-N;v6|D}HeJ2uzjY`8f9d`~4v?gl2a z-rCqzsXyqG&zOSvGvfh@S+b>c+D%X@n8{PC%TWDT7{_)0zavdrU{EjIEI}s+{^O>H zo9k6rd8oS%b9eb94yzpgnGC0#kp%vz@tkX?@hZyf@GFA)j~8kK2rC#uFn`+<=J4Cp zi5M0@&i(E{T7;L5pMI0CGZv)EBy_`^52KftP_j)f*T@*Wyp;O%iE?fNPXELNv-CF! zV<3R0XOP|Zf2NYik?IRqsF|WZvX;aO@}_arq7g!ILch%b4I!EjHXn=Qy!r}8F3NmS zFMkzjcM7{-hQRqt%ATf-kUjx+PNL}zS{er=p7aqjg??@+R)H;VGjkPdUXJ#6+PPL&4MJYV~ zbKpK#RaA{Jm!u_lBqSDs1RGjaTKD4r!)d8k5kpu9l%FetRT=t1_Ady)_rcC;Q4-j9 z_n52|44=S|1zC{Kftg^TVSqnl91Rsj%z}k>cvbZqX5TZ@0=Fz7X8c?)b0sM*>8McA zYhZY4kt|G*C|DHF4N&p7*?_r+j*)uUedojph7uk;3^PvItrl!)wcL)|qom;H&ga6~ zv^b8}n2iNogGM9>=T?mO;qw~}kDjFpHbl7Q1zS2w8kmnp+RtwRO$)B%l0T(ms-~?CmG}ybq0xzZJc@OJbEO?;niP#%pbDN|_bPp;)`didqyV@b^xV z)YL$LzZ0-yaQOm-y^+SF0Bw&>fV9nb6ykRXz2H+<*H}g`lYhbBkHhFAK{A6XCzRfQ ze{Bo1)HnpyIgr`M3PcEI8@@1`4cq$TE`woXUZpJ=nI^)jR$LD=L0-VV;IJX74xzdJ zTPQK_P;||ZmZHCZAi8cyOVK|#6x|^I{`61AIh>QopEcGlaCvE8M%kYNgiYGr+db%N zV}vOh6}nu?A4fNGM)Hkau(i3j#H-k|crqd#$MUY3(Z<}=qUc$3zAi70}?G942v`8uAc zB;h3>>|8faK4#Vh6_(wrKI!ncJKxEgd#NS0huU!|pw7x-k%z>bSIj#R75nTp7TE?g zSh#QU&V~p2x;DMO!g7CYvN@~hLgO=5wBl;DECReL?Ey^7OTGA!Krh*CXu>n)O(OSF z4r~#R%vYhK!J3jT|K^+^I^qJhx;0g`yDS2o|f~mUPgjDF)+op)t#6@eUUV2$BbjV@?(4-VI zJi#wYbzL2#*|q1R4zt1?iZG1!hK~=1lrm%V|6qkLUJB)2n&vVJ?(VgsF}V%aqSO%8 z27tZKvyTRAy<%x}a8HeL4CShTlj`qmX~yBUNFMS&c+``x>XiH-Rjo^C-S9Fm3RJnp zJYI0{eO;bpX`xX$tW#&qc56f@DEc1OF=d~0wQrPF={5z@qd6-DfA|UV3Ukor_h!w4 zpcp1xnDLgJN|ioQ@m7#DzM)xP`q98G z6Y~w<lDAxMDPRoK3guc`JmA zF6uAsKrKFN|Eq2L$|N)24g-%up3z*pPA10jn}}h1EUZ+_U)p!94{ugei=$f|0%iNh)u9v==&>_ZOTRGb!)8pSc+!g?|H+b(NJ z6SvH4FUSJLH3N0TDxxFe%PH*l045-Si7WmN1i;H@H;KBz0JUbAG7tPBEC^#iga)NH z(#&Rx8AB0QN#GbQQftQHy?pT~&4?7M7^L*6jKb(7lagHR*HPfD3ilr!Tx7Sj`-^*N z&l_L7yNOCy0$5PGwcjN+^(#(JpwDlNIjMV9uML_1?nb+{bGrYg%|Jk3d7_nDU3Jtl zqfT3;&=3@E#HgXC6qZA6T@qfV7u%K(Crb6}l8?8i#8d_L1^72&_M>uWa`5WH6>Mir z?}=3y^eESUouSsB%chI?lZ7!T)3jOm7|hBTfmfIb$<@au)VT^tW!Fg8F)Zr(Z^G^2 zu@)Y5q5k)1mFI!3kC}rET8Pz$K_O)?)&UB!(`AgFQk^Ts6jIOsP28WphjHn?#Cu(5 zhOPscnXB;F*kp~3Puol#QbWAODHCWCi@K~fqhNP&FK?eeNin=jF}X1-gGWz5*kkP| zlKF(rf+u2QkL>|742bq-?^$H`fvPga<&9nqlyMbGKf&@{?yMMig*hMe=ft!Lg5 zoc#k*%JA`P?KfUegN*47tU$>^*XeSJ6;CbKfedalGGkV6`i%mTBftGiduQ5Y^%1>3 zV}*bNpAIoh8}%XtqI0Usehv1ANxqdP$wwyZZ>UUz{O5EJ5jR{~JJ%v(AXv3sl{}L2 z5%?W@;G{(j`-=~y-cmQT?;$h^=eoHoLH7VC4--GbD|eXQT#ODXxvtS zF@RBR8^%inJIaNh0aHK8#rPJ&-b?yJdb!uXnZPh+uN8LRvRglZY*qGILH=Sm*<6Ps z4PFq4aSF=1Qd_A7jo`~DZ3^Vu97pT|Qo6r7i%|5nUr8cNl&ApI@Ks#qlDSt}dOgvW8jy49sQ2ZHMfgo4| z4J?bDdbci131ViYDuAl+h!wMg+zLO>vCrY+*F86IsO4m>BxCBjnTVfHK)A<#(OpNU zK2QT@vkfQ-lG_DhA`va_}5q;Bx= zBl5Vzon^HvI2680!&&cb+E5nYR}lf2cU);gk2OqMaR z2J$W?*3f@>tTwY7zg30Aw_V0;WspamkYpj(Y+ zgvCR&KL$%pTkCbo-G5I=7vW|C{ssrtyPGWrqSP7M_*Nsd+!|>MWNFKcyuW9{7ao2y zJi)PylO{+@1-iwRJC(t!$}vmc?c=#XM`#ef2|?x7wtEi>42PY$3V-R@BN+^R3!

l3abxM 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 literal 0 HcmV?d00001 diff --git a/tests/Feature/ReadmeDashboardSeederTest.php b/tests/Feature/ReadmeDashboardSeederTest.php new file mode 100644 index 0000000..df07a69 --- /dev/null +++ b/tests/Feature/ReadmeDashboardSeederTest.php @@ -0,0 +1,54 @@ +set('netkeep.readme_preview.password', null); + + $this->expectException(RuntimeException::class); + $this->expectExceptionMessage('NETKEEP_README_DEMO_PASSWORD is required.'); + + $this->seed(ReadmeDashboardSeeder::class); + } + + public function test_it_seeds_only_fictional_dashboard_data(): void + { + config()->set('netkeep.readme_preview.password', 'documentation-demo-password'); + + $this->seed(ReadmeDashboardSeeder::class); + + $this->assertDatabaseCount('devices', 8); + $this->assertDatabaseCount('backup_runs', 5); + $this->assertDatabaseHas('organizations', [ + 'slug' => 'example-network-operations', + ]); + $this->assertDatabaseHas('users', [ + 'email' => 'dashboard@example.test', + ]); + $this->assertSame(0, Device::query() + ->whereNot('ip_address', 'like', '192.0.2.%') + ->count()); + $this->assertSame(8, Device::query() + ->where('approval_status', DeviceApprovalStatus::Approved) + ->where('enabled', true) + ->count()); + $this->assertSame(1, User::query() + ->where('email', 'dashboard@example.test') + ->count()); + $this->assertSame(5, BackupRun::query()->count()); + } +}