From 29db6be66da9800305513859eb6eb9fd5b028813 Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Mon, 20 Jul 2026 16:34:31 +0800 Subject: [PATCH] feat: device detail page shows real model/resource status with SHA256 comparison; filter unavailable features on console --- internal/web/ui.go | 24 ++++++++++++++++ internal/web/ui/templates/device.html | 27 +++++++++++++++++- .../face_gallery/face_gallery.db | Bin 0 -> 81920 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 627 -> 638 bytes .../__pycache__/aggregate.cpython-311.pyc | Bin 1465 -> 1476 bytes .../__pycache__/align.cpython-311.pyc | Bin 2332 -> 2343 bytes .../__pycache__/dataset.cpython-311.pyc | Bin 3986 -> 3997 bytes .../__pycache__/db.cpython-311.pyc | Bin 7182 -> 7193 bytes .../__pycache__/detector.cpython-311.pyc | Bin 36320 -> 36331 bytes .../__pycache__/recognizer.cpython-311.pyc | Bin 3730 -> 3741 bytes .../__pycache__/report.cpython-311.pyc | Bin 4142 -> 4153 bytes .../__pycache__/types.cpython-311.pyc | Bin 4243 -> 4254 bytes 12 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 resources/standard_resources/face_gallery/face_gallery.db diff --git a/internal/web/ui.go b/internal/web/ui.go index b508adb..7d9a3b1 100644 --- a/internal/web/ui.go +++ b/internal/web/ui.go @@ -119,6 +119,8 @@ type PageData struct { ConsoleUnassignedUnits []service.RecognitionUnitAsset FaceGalleryPersons []storage.PersonRecord FaceGalleryQuality map[string]string + DeviceModelStatuses []service.InstalledModelStatus + DeviceResourceStatuses []service.InstalledResourceStatus Templates []service.Template Template *service.Template AssetTab string @@ -1721,6 +1723,28 @@ func (u *UI) deviceDetailPageData(dev *models.Device) PageData { data.SelectedProfile = assignment.ProfileName } } + // Load device model and resource status vs management standards. + if dev.Online && u.agent != nil { + if items, err := service.FetchInstalledModelStatuses(u.agent, dev); err == nil { + data.DeviceModelStatuses = items + } + if items, err := service.FetchInstalledResourceStatuses(u.agent, dev); err == nil { + data.DeviceResourceStatuses = items + } + } + if strings.TrimSpace(u.dbPath) != "" { + if store, err := storage.OpenSQLite(u.dbPath); err == nil { + modelsRepo := storage.NewModelsRepo(store.DB()) + if items, err := modelsRepo.List(); err == nil { + data.StandardModels = items + } + resourcesRepo := storage.NewResourcesRepo(store.DB()) + if items, err := resourcesRepo.List(); err == nil { + data.StandardResources = items + } + store.Close() + } + } return data } diff --git a/internal/web/ui/templates/device.html b/internal/web/ui/templates/device.html index e873573..01c3bff 100644 --- a/internal/web/ui/templates/device.html +++ b/internal/web/ui/templates/device.html @@ -166,12 +166,37 @@

{{icon "assets"}}模型与资源

- 进入模型管理 + 模型管理 + + {{if .StandardModels}} +
+ {{range $m := .StandardModels}} + {{$status := "missing"}} + {{range $d := $.DeviceModelStatuses}}{{if eq $d.Name $m.Name}}{{if eq $d.SHA256 $m.SHA256}}{{$status = "ok"}}{{else}}{{$status = "mismatch"}}{{end}}{{end}}{{end}} +
{{$m.Name}} + {{if eq $status "ok"}}一致{{else if eq $status "mismatch"}}不一致{{else}}缺失{{end}}
+ {{end}} +
+ {{end}} + + {{if .StandardResources}} +
+ {{range $r := .StandardResources}} + {{$status := "missing"}} + {{range $d := $.DeviceResourceStatuses}}{{if eq $d.Name $r.Name}}{{if eq $d.SHA256 $r.SHA256}}{{$status = "ok"}}{{else}}{{$status = "mismatch"}}{{end}}{{end}}{{end}} +
{{$r.Name}} ({{resourceTypeLabel $r.ResourceType}}) + {{if eq $status "ok"}}一致{{else if eq $status "mismatch"}}不一致{{else}}缺失{{end}}
+ {{end}} +
+ {{end}} + + {{if not (or .StandardModels .StandardResources)}}
模型入口通过模型管理页上传到设备
人脸库通过资源管理与基础配置维护
+ {{end}}
diff --git a/resources/standard_resources/face_gallery/face_gallery.db b/resources/standard_resources/face_gallery/face_gallery.db new file mode 100644 index 0000000000000000000000000000000000000000..2c198a91fcaddd8dd63857de39feaca446b32bdc GIT binary patch literal 81920 zcmeFac|2C%_y294GGvH^kV=L^iCkwbN~BUWiBf5x(ws^flrdyXB1A-*N0nS>EzPBQ z(mboAd7d=gSMSgF^S$riANT#=_xE_*zt6QF&a#|yoU`}SdARoL?6ub(K6Fsz{0OVb zv!iBCm~YiXp|ygdqC#&gD+L7w71?Ga+x}gYWzOGy|1OIEcK$!Ut0;7fPSer*rl6ub zOhIpg-dSCiIr1VWASWOvASWOvASWOvASWOvASWOvASdvD0D(vqbrZo-F>;seMBGcLB9X@C9Jw=Sy}z}Wn}jr;p^u+ z%qk#ogjGP$ph1qZqq0j_{i}En3iSS84)qHh<~zVIz{=lu)c>O{R>OSz`4009=<7TD zzb@S+GTctfZmOcXiK(e#yu&|L{MSwYWtIMy%KdBKKQ)UCm)-f_l^QZ^z~DZ^M*Y3p z-+IlOFf+nxgl~wfrvFu2tDt}ZLxX&^>>QNTOuS4L75?EqZ|)44t`D2AVE*iXe*QOl zmw(;oua?*N`>^TAHZ8qe1-;LDFZ3ShHRzqztJAC2+pJe2+bJ({0&)U!0&)U!0&)U! z0&)U!0&)U!0&)U!0&)WXLj*Lnlod>$=k9rOFiulb<~Hx&|1^1rriRRYmX-cQny0D$ zUv6!Qrkc!cD%t!rGhS2mA2;i1aj~X~%za8_PY$MOD*ttN6h4t=Xe#}6S8aZBFi}(S zubZ>)Y4SELSu3>kRx9Xz(R-=)Q16=F8NEY#`}DTxmCAO?i=2R*fSiDwfSiDwfSiDw zfSiDwfSiDwfSiDw!2c8hEoD>1f9Zd%zwUqO|G)0P^uNZx-P#iMzwW>EzuLdtzxrSG zulq0kukw%kkN#Kw$NfkDD`_g5YW_?AtIArTt0(>279+hMvbO;5^c(`(ebr*~8D zs@?@zJiu|;8-agL_@8R9{JL@iasqM!asqM!asvOG2;`_Js%VyJ`}epEQQ7C=a`JAn zUZjIwv!Z#Z?kw)P$D1z?&gO+J`q;QML*lgQoMi8(Xs*riMh&Z4y0v>8M@+4!yk~Kg zaqhS<;?oTZa*Bt~t-9cD%T!Q__C+VrkmsH%<=EUqw9lXtCF^%d4Da`V+Tr@>XEznJ zmkom(g)#W%=qm0#eHgizDu9JX4r%n##3zru1jT44=GN+5YpKc=Z#GE>`iv!$4$08) zDUG}y9f1IqTG+MO4I1ZXi2;3)vnE_8FRv6-{;UNXXI_9c8AoxfO*Yw7KBn{s!DM-Q z4_fU|L4R{4e*U5gr<|yOWI-8I3f#D@!Zy6o#u~ef9wRh&j7JwG3%((B!K`}1Ew8o< zv5K3em+rh2&kv15vxg4o(N_tL98QsUR5Hed4i~J04&t^kniLo81PP7bMF;C`0=XCC ztf6i3XVrLKb}t@s?ugubaG-c9HGpRntMR+@nRI)Q1&Up>$;)IswZxj@>Ek63d^uR` zvMgVWNm_?~WIPR02lB~T3&AuYooDPYhc^jnxa`IvwwUEh3h!*V z@4yhS>i34qPIZ^;vhZi)mzLs_#&a}lz&Ge`UCh6=JM-$@ZP?qWJs%ru3X671c|~Vq zJg%PsDVthBFF!zI#aiLx2OVshsD~M@7Vz78FVrSxh*EcNC_D3xY&Cz-T*XV$Rz}It z?eS?=$PFS3I>|k&&#}u*U)(;{2Y1}>L4Ve!vC@c_!qjmic@`Q=!lUDHUS0<(zkQPY z^8$oXbGyTwg@%&agYN}Zy?N9te;cjtR6x!)!`NqEFfR-7CexpjDgFlu>T2^5Tk??{ zhSJyDv)JL(dcL$|8pNjhBA;u|i>~f~sBcLys%tj*cW;fw$9nM#yHV)skxClvX0hXe z$1tYUhScX@VdXm~VO_o-D9tJres#-5>-}1SyTcEd08e4>#jfyU8?r^CCeQbNOd~_n z@IY57`d`e3dA+ZaX~z|mS5XF;EnP9nB@}}S^ho`?9bTHhnisu%N3n|%MD=ES{GIbj zSWW|I_wCcvEw7FT?YNANcPrug+ROYSvMY8uG8MmJka()Z84nowQMcjI~4AHG^rH8?JUBRfw zIhw4lP}h57AN*`Q39VY5!nAdP@J#0d^y#94IaSxF$E(S>K4USK*nWcS10^uwbRF(> zUWo_ijpo`88aO4?mVN}r;@GtUeSH@JXXoN@G zhGO_NS8UxN;R78VY2(r)fAakKSn5Q!%z808oj=IhAcvI`FR@PPSrvZ&ByWdZT2)FM!@0yHKZT)N5ZEu=5%?q14oZM3oFz$ znG-j_M3w8HYx@qCStd%^aVyp>UB)BMl|s9LRg}8)1|=+8guO26@W%VC@N52MGMLy8 zvjSJsx}o+E(yo}b^ZKyL@fPX*^`mjnw_oIGn#T%<(=pxYD3;EB1P!}#;rLHS4yisR z_Kz7ROi8*7M>Rgw=GA7>6`vZ(+>ejNec;OKmd#`oVt_AJ8&@)p62{m^k5`=?cmjFM*kldXVeGqv8pTL!w1+0c*KMNqQOo7KfgH zgJ!S@7lkX+p55mBC2kkh9d_Xf(Z$%RzzNIqJ_$c``oVC&n~=EbfTYPUm5=K!$B^IF zTshs6n>^I9ZRd5^==hEj6#cVDLbujrlAJE?bAPb!NA*eN?KFLDBM0&)U!0&)U!0&)U! z0&)U!0&)U!0&)U!0{$1R^^ev1Yt>})02CEfHU3%^ z^?$6|KUVdxRaW`OD*v@gO3KQbntxv&D5`%~kbTLEoPeBwoPeBwoPeCb|LFweoeEeTN{x2W@myiGd|8V@@7J8oYf+*E=u(fWX2S2}g)X#S1+u0fL$fXoc+*al2 zQ!d=KY?Ab&hX##07fGYnNodbZV_s|Qfc;H0xN^#C`j`Iyrl9`q|MU)zynS*4asqM! zasqM!asoN3N-BzF+Dc$}6)I2u0Zs3r{5|3?DRholVtFBz_R!V*; zOQHV!cC6mjmM-mG!B0N-q9aTXW9*?HK7_hqFzl)2&KP9CO75uk4vF>0odIR*hD`8S$Yw zHs~=v4M?V+?{)dq(@cIosF@x=i^ts)Y%x&#vgqd7f#X#Yxa3bYXiY808V7%N7dwch zsbgq6tb%ftW2E}zD!MOBhvBwybaGx%sO*XWT>#k zIFPdXIr3Cih=!h2IBQbmhkf37kS4s*-bSY@|f5VMB@#hch!QX7_7%t=K5@tWWr~s+2G9TTX6V}8jm&}z!g<_ z*jSs#HyZsUrAs5&QnH2qoUNlzJ=*a2h(;=LRA48+skryTS?M`xAt=N;vAN9@Zngd{ zIXCs@2)zP~$g@X9yY*mSmjS`w_lgcDfzPkk#Y;!3;ijH@sxunUnT?k?uZ`PIqM zHq@0Jjucbn`**apT!hMjqwv7pbo33I3L#gssCp{Ug5(=w^ED+QztNL>_q+mS%Z733 z+P6(d(Qlhn9smpBvtTwCvyG8b7EZY&baPOC#;Nk4>P8ruo zXpW6{JUj|{4X@o}P#5s~5h(Ty!eJ?fJU{&sq+a+{yLj+R=~<&Vwsn{!R@lno^X>Gw zNG+TD-Rwmv9~If6`wp1d;fWA^Q<00duLrXZ@2K={Fqk@LVZk)nzGt&pi0MfKCw1l# zOV-lXE0HjM%372hx(1i>s)f3mj&!;1D@5-43HLslvRm3Ch#S!Z)%8{i&q^e0F})W0 z<=Kb}OEl_ExAtYDMOx&jIF5hx8Hy^5qE5Rwu8LHm~@~}Z}I9#C%yzObm_SuE(X3`mx?;e+C zSY-0vRRgHqn$2*oIalHmrOyNAuY?%&@i_YNmf9uTj#6avOdjpHkyjO8@c1<0IpsEG zi#^Z=mqd*dc1@B(_~tx5w5SUgj|X`AHJe`Q`p~iwF?d?4%zq3vP|A`x{`UB~BvF4M zr;hQ!OY63xN?8^?z=-4y_-uL( z8G59EG%uD7%!0^1G=f6bl;Gt7qcLMl1zb67D5i}XCq7j2!|e?^TyLr-#*2gCkW&<@ z^^M~hHyY`D?s4j!Y%ivD?Zt+N>@hz(8Gr8BhIdQv2q|hI!nXO!o}JRiqpfBt{Th}k zKF)tdi!OJe-m{J2XwFus)pw_HYaY`zeOvx;v6>8b?}z091E9xLp5T%B_(}CC)_a$sSbSLeVxci< zo30X$ylcxjM+5M#&we_nu>cSIjmCjT){BRWe7NfvOL{e1oqH`9%Gg%+iPFXtio`f! z{m5i$ZB!xz{@lt31FylojqbzX>5gSKRkUmPDRRxOL@lhMa??4uVZIKlCWOPwMRPgF-&XKW&*x!H9jMdt zb5etVk=QfBUT`m1g{oWj(e^>_$bFIrVT{V(qe$_dB`$O*^^$O-)C z5Xezg{;U6$Cx-2W!XhJ%*!P5=w%n)0SPfp4(FGrvw3&U-Dmpza!w>(yjqSImAVU;l(J#utzeEn9?wlKvuITh38t=i zCiW`7N1waCBAss!!93pugM0U&cZ*vIGs;7x2anX#>}6S^(vM0QZS28)ssMDqSHPLw zpM}_G?RZpaYYH8s5JToo6MGojRio2YVNDGywHle-AHI3neg z7;9pL5hphYk`QxVtF@0aKMcWB@ntZmM>}!Fodk|wa0?WTyx`32k7WBhl8>i&vTnQ; z)`hlV{|({1Z**&3q5X{7pJVB86^vY_U`JyKWX(#TWg5EZaZL?6Bt0YZZ$@<< zL1+2qu{fCA>LqC^8nN|DfZgh%FwNkN`0M5vIQ?h|t~h=adRjGzNqgKm{?t}!WU@W( z-2RGwEEp}WPu)g4i_2ii%00r}ar0bZxsd9u8bPoq#v>U&sIhc6UjnuILbK1(d7qjwcs1{_&l6V)6!Yo7=t;JKVsVaEbzY=O=lpU zr|lVxVS~m}LR%}$`rM6c%G@OfBA3wgi3VI(*+IA~o55Q);}pqO*%IcrS|z-_a8j7n z$Aw*^-q5on9Z)RH07C-_Y^tpmClo2*Zm&NyY2pM_Yq}yvjtPSh?PFjTw3QV@meN4G z9C7K30Q7jB!F671p-skZDxR#uy^kFr1)WvAbk16d`;Rk_dNqyOT)vKX4z1%wJMB>` zVIcOOH63opEyXsW3DmKpA{{l?ughYoUSO`@Hr^9 zNL=CJkL}d*HUY1uNziWQXS!CEhzVmilBd5J*beE52F6ybd9(q3`j!fZW*1?v%T_Qo zVhS1mI)dfr_EN!z!<=Zp7J8hpfQ#V?xIn)X7d{ujWVjZG6&w%_`#gtxA?h%+=_@5w zY-7FUCBl{82XV8)I==mSEWA{&ND?y&gEY3%)}gDgjootGg-$%-w?FU7 zQsFqg^^&PNhTMN-B8(0@%3JO0!DI1E7&2=s6zzQ@sNT@2do!w#T{4@*KQ(v6jx%qQ z?)!nbulBuY<30;@2j+?=cJ`CKL)swAgD?iVUbYZVyO+_2rm^_LZ>8uLHi2J{-%E4% zO{TX>hE%%yKF#2Eo(8{f(V&VQ;@Me$=wjA#K{}e@;L%LU$1}EUc~6tKTIQ1d<0+`@ z_pnyAwIlcLvkAj_QAS@?I6rN+@UAQoJ#LQY2eHm*vFD(WIOPV^rnf=w=b_v! z#2P-;8sVYFUsSkaCk!^$MUw?zCEll1Vfoz!5({ZA8ZKSO)8DUTw=SLN%32BEUY7#< z`)w7<)@Y%#8F(z1F;w_GSP2e!l~9k@)6qVD8b0tep<4GuviVgk;;9hqK2wE*uivLX zdwSDm{jWg54d`&uQ@k1DO>PaZ*iEyUzA9Hy&l`ReH{J>@m#LwtotiMK>^bRv{4Dvk zM_`k*6GTxdIBn2Vw%I1-BUhE_?z|MfUbhZr`Xve8r8%%WZWSyXkjWie_hjQs?r71u zyEv{{MLe#d&PlS*hGkc_Ny{8`z8yK99n9=gc-zHVIIAdo&bDh)-*mvAPi5~{f-mFrdJQgf z@#TSSPZN~s^PT4t{KBBjdD1gI)iDAjo{XIDqJoYMB!bc z@y^1|SoCHRXEdkqlZId(_#J6g_;CJ}>CPig59Kd+Dp50C4=zO(pj`j|=k)pHEtM0H z6Oa>-6Oa?gQC0az|GOWUfmxMi{K+?gS5Nih`W$0E9?=ow6^l^uqaE7)R>e6}^1!_4 z56{0ejNer(!=%GQsiy7?r3mN2qT#9Fr}SK$Shb7d6Zb;)x9&Iv58$3zM(E#vBZr1H zfLX;(e8}hM`_|T=R`FeU*ff)pJ5?!F<=MvEil5kj8vy2q6OQatD8M~ z_W>-=pCIV`ybqcs`-H?z&R8(-Af@TbBzQ>4B{$FXmoELYvlA2`^$69#x*<}o+iu>Ysd?5ZD1 zd!H&|x7R1(zH=7LUVe;rZ7qlQN0VUN{)v!(d$$jKe!aycPT|T=VX4U-%2T4XjXm^@l=sT#y@^-2W0yk&Uk zxjQ(eM}6*ZafgL#h>xz(*5FljF|WzmRd6F<@IoIr_RdInai z?SSsD{(#Myu2}Uzi@VM&0`+kl$$RcDxRnvlWA^`n#%;Y&-$SMD(}8Ms&GEk+j)z_oR{f^!+tpa zRw#VCP>RNLs`#pZPp-JI6%1Z{qRR2}Fr&baTP_3%*W$g%)?J77;`-B&wuaE*OgFyz zWCC1j-x>RL0LsUwBth$KL55D4eutP{nuAiJ4FfmYk$IqZ&Hjs zZ;E|JI169*hw=)`Uy$U~h9f`vV)0o!JTrHOc+2K9%t@E<(&X-7r>e`Px3Xku;ogB+ zq?hQkOr(hQ>fE?7l?obOijC4#lIB09ZcTm2?dw%(Pknp%+}=l~4V7@XpDz?v?xdbp zqgd_b81_6iRya656t}^Ki+U!N@1<(a%6R?b*Ed zYB&z)yiFp33lRHyD0Z4Kg{S6vQ{YTP2ufT|mLvVJHZu-ZhGwImwJFWHZHD(gb%gXy zzacK6H||ZhqZ?MQ$V>MfL`|~id9(KmeTUBzC%Y!|h`xJ7E3b+8b6-4h?0C%fzJ#9> z`tsJT-MFG;8Ln>oh?IT>@`k836qYfBXSlY&*aQ=9dwu~o+&_Vnn|HG0-94)9+?RFl z#&D`Zd*1zO4jQZLu*Sn8 zP4ips!_w1hSfx3SFL=4rm>*rlJ(`)MYp_PNn5@qaA1ZL|z-yG{J(|_@wxCVs39&l% z6ji(U!0Eh3P(ODD>VrOrE60@5q@{+`!&Me{bNxC*#U6uOL(d5HomL?qalsh|nc~5o zL$EI4C=LsoD?~lCN3UObpcvyOdyjIH)~%=}i=K;dQQ&f+YE%s!7lNpV4|88xKD|%_ zN0{nsj26pH(OcJs5;hM5!vkw6V45c>ZcT^%D>l+q;}DEf??*kAJEMR20yZnqfa;oQ z@ZCNQFL+47Yiyw~w)=K*um5rWxVZod-P_CBVv6@H%<+_9At>!X0|Tlii(bnHVSA$( zKGZi5IW@h2X(dsC+&KKH;ssc9o z@r$+wJk4t@`(6beU3eBg{1(|Q+KRV7K$^6u7TqHyIInTKT>s0vf^q_K0&)U!0&)WX zK?HJCRsZULl~gN7Tx36*JBLX5OWmWGcWVn^-SF+u)Vh#d?@oZ|4<^FiyY*t9{CFJQ>a+0u+;Co4yqk8E z97Qk3uDs^HBb4hIbLLAo_VEi8W;m~@RX(*3BOf-C`Qo)uJkx}Sh6d4w&DUs!b}0{A zbQNQUM{`B36-Os1u;vN{S$woA#UC9-y_BYc*@$>98XYK_b>1K@&M%POX`cbo84lp8 zK8L1R%@8Ku=*Zt*c#+KpW1R7{9bStWigg7`Icm#pG%;#`$&dZm;~EPEy$?~)j08CJ z(;uu)S)g#}nD|0APSujz8EmT7g4>B}lz03x4IVs}_h;r|>gfw;H*qR|XcteNj;};b zMMs`{RR=@L^ZDbYBRu8keR?}E0S?Znm3*;`;U<}G9ie`SMoyAQPv*7fS?*38^&^R* zJBGl_gu688&u1F-LY+Hyxj=$Ch7&oregnUKU4~hI0>w!M-T2G~ z7v6tQx31=L2fUVERU0_FGrzgoC^}@!qfe(S*s0Sf&`FzzzxwpY79%TOnWVtC=6{8( zt4jFUzzNRX^c7XglxTvt0*;i-^SEB^#NW!c@$ooy7&l`-w13$hY&s!U-B%Jner=7n z$^ffER#0-Y3tH!Ig3&Rm?D}C6+DPY8-gz6Cx^o0(s+@&=ONY>*;ZkUuca$2FBE?`$ z9a`v_$XmvY#7?c_$kSSpH!s~mOC}~!QLY7E(`kig{8UdYlJ{o7{NY59p1?kpIG0)2s*Nbs*D0)1O+t?cQ2Y#aq z-GkU^%u&itT`Ae}`YYXQvsg?H%jYBg*3paaR(xP?qmZe+OHc{3sf$ev=PmYLv{^Tg z_bF*o($1H#I()gXe1?FPe&JMc|FocU#>lg^#}=Xgtgd|ET`o1)^u}qm4luQIH5bM7 zCYRmA*f!#!WNxB9hY#2B?3}V6d<{dXAo7-Q?M@7hk&UCPhP3CFpV5M1*FE$yW)6Al z*y7h06WP$F6Spg~#J#}}dDiY^9GjX8uD^n5c`R{r%oX^wWdNrtrlQ*&D>jvk<8DWM zM1w4M(Ia66rS<86qYfrfMRX@RUB4YqPYysOn*>lVUc=WS8-?;{Mf! zSd_U1e+;z(_ruRKx(=-EDZO(OPt~-vmBuehW{;F|fP%Db%UV=U|t1 z7!;KNA7t?tb*GS;dN+&9D`Kf4Hi!C$9)c%&k6`S?9kf2Bg$}D*i+2Y5@L0bM^g`pM zIIh|pYrbjmpH0um?}`B115Dt-Aa8Jq`3b$ptq|1eDxvX#A$Rd|#k$Iw)at-CGMRi? zm~Q!nUf5>hz~z4=1*b%)`mDisO}`1x2DWFr4#*Bxy%AD6QcHFs#n2?$`|(R{?^P4n z>EIH{`X33n=58hL*fyL0NX*dYc@OcDt238sRzpkl5O|V!k-qAD74($WP^TqD(Ejc{ zA!FZaR6eW1UsXJKZHf;?P8tV&wwdD@r%8Cy`>aRT!{^A~syi#1bit3Qt+489v-JAa zPH1yA5xm|#5LRZ+f>7J`+#KGHGjdK)l-6Oa>-6Ub3j`$zvLE$r@j<4zqnYDe=@!#TWu;12QRiN5&0{R-*WC~NGSYXPSU zI&jFB_1v(qJuCL=kM&>P!iKy-=yk>uf83eFL$hq9>WUduu%$Z~pAW;sC%jR4TD91+ zN0ZwoYg3L(4NPh%71b`8K-&}dXz$!~kP3*?2OfeQhcAKUrI)nt%N+W-D}}Rcb@@$& zBSn3_3L{r5h)<$ViWLJ6!Qt-hKtKLFm>!6e4sCiPw0qTqV}@Oo2+6BNk1I70Bvs%& z`tPY*%61BCWdk-#PYU%{l=-5PC5>))j4P^E3&Uq>da`Uz?7+wp%zhSwL8D^$aIQWY zS8U;lCOu_wthVTQM3WmXAEmLon#k6s2z^Ua;D(JM8-A%Hhu7so*DcxN^vk}ue0~ON z_1wU^YQ|tPPk~pQoQ;3ftAzZf8T|a2Gk&m(7oWZ?5K6;lip$&d*O9_4JaFoXWsHE`ymU0{1Q1PymB#4S#@Koap=Ty=jC8r)im z+Z+4f<$gLmr{*KgJ0362e)kBb%>M}Hj~ZZlS`qEpq{bJrd^mdAZlJJA+@HLjqy~{V z<)j35emMXzYL5tGwRqF1^Q1DpkS`yb29*{bbn>k~N8a=X?Tj=SYf=Nzs~>Q>q>`>` z-xR*=IKUl0-QYo23fVux3!gkr5E8z(;|W$FJhQ6=zAaCctzp$w_;O_}=d2km4!>o= zA-A*Xd7iGg`N(LjPwdBgpC5G(Sn-5*r>kJq1`C>=rh{)CgUNVGGdPYv0Iqg5qQkFa zFhDI{>~^<5&A$EtzEzmepZ!rdEhPclDC^)nucz4E!ylEpCeX!>YlWL#E%~MOM{sNN zK{(LmIUW0uL~aukS*5O+e(zn11%0B)zVf&5B~FPJWi6pjX3_M^OdA@bR7A;QJ)ST> z6i3Y7kFkR_Fw`iC7UyK}>mU^tU(43B^bN!3PYiLvT*PC_!$@2@oTKl2g(n^a-|}Zj zJ&r!7gG;CLDvvhMKW{LNx9&_16DDA6c>>t}v|+V###FUy87@=S!$^-7;cPHLPD2{~ zF{_5d&vbd=*EV&wxlLlcQ5<;nb!N}c-uNqIC-nSWFE)oa!s~<4l9ivXQM`FKRNH2X zM>}4_{hj*2))6~#fW!l{Wn0tiwOACTj^VO7|Ng}Z{8e=&N4=Xa6wI6krkz#UeVG|( zls>0d&n4m-aUlPybHIfUpHQ^fNgDp~k7)3sROnaYh5gdI}=pR~7iIdMm zVa;rD$Z~x=9ePn3I%z6Nn$#gWZy!JSW=me%F2iE?F+9ill8~CE&RbTQqOP_t@0aEG zxZ^bu1}v?@4_oZHeodNi&Qc3M8CHYGP8B-iQ%JwND)Zq7J7Ivs4)QWf2D-bON1Msk z;9Qr8KX<2d;QV?Dd)QT~5Z>QovGF|qTDFQSO`}-#skNlXy?EOGMz$to{!9#Adz`fc zQaJZZAD*N*7h22aUPRTm!Y&%AsIHX?d#vAGbsXEO~QF^`JHdeDDXfDa_5 ztaDjWvaowBR~g!7Wt(-Y$^NXXWLJ@FzEY+;rUq%$1@;aBMdvao+9eTN+QmSd_OdlFC)SBZJAd(p z_#|s_f}2J9sGqR zzSHJs@1wEa^`>z8qyy&^sj$Cg4KIDvg^xXS#BS!!U>>$s2;DOfiNw}n0~eIe+(1@tTHNDkWF zA@lPDd^u?VOP|W}HjGU|=RaRS*r1IkRC|dZ^4&$hk^oex@6IoDhYEAlj?wCbIdI5A zk+PGU`0%2~!k}~;yyj@f2VJD1MfF7b)6@!8LOb$<2}kIgayT{i*u>|L>EnelYuPE^ z9{N=DW|J4btT4rej;&K;vwkOW^!d!%i*5T0VGG{y)Cox-shz?nlT>h^&o#l?p#<(O z-U~O@eW&NOVc0x*C1-}#O9TFlL65i;Hh$2Pv!ACN4ESzx&IX2wCf5$4U8 zUaZ1J!XCI|unl51KZl(sI`Po^-Gs=Oqp4%WWa__i7Z?tE%^Gc5#5M!=LrVv1XuhRO zCdxK){V(qd$_dB`$O*^^$O-%h5y(+h|40AlX;|R(F%hKuy@is+Exa@YxMQdiR_}i% z%q|;QEnpL%TSk z=1|#u>&))>cJClQ;_y>EbZ`wGc%aIyUnt?(KCxolr(=AwZU)Xw=}J9UpTeDOzfgbK zjW@5)XRX8v91~Cly|<0QnkiA}p*w>;!tRSRhi-=S+1dD5ql`Cd9;Nw?q429sPhMC$ z2cM+IVrxktr>d_7t`s3{keV3zb_=|nCD1*skv!9$q0CSX77WnwRGIQr2t0TS+bLON zgziheb^WsVZMqM4$-IpDLraA+qn|>cNd~mcrLH~?2orcrtzShw%GIeQcC(2 zhznSSami{}XtxvEr`q$|zLvByb~|0t=>hkZYlPY1B#qt^1J{)Maa3bRj%d9dRKF=w zqT5Pla)Bm4J6zLhHP7g}kQWZus&i0oftYc!yl;hhJiz@ar8{jA_GNUS#>m^W>CZE< z?)X{Bv?1Mi&3YGE&O!|wt7wI**G>U#s{-z4n?jYrUbuMn9I_gAk)%!;j^PmQn+r&W0K^yG+r2{|lR72A2$Ojb%(y85!XuIhItn4-!+pL-=1bMDu zVb2LT_A;L0^bl3!vZeh@ddk*!zfJS5=g^HvR}A%^gdQn}=zY{dq1Bio?%%%?O?Y;i zUbQYJ&AFN!JmrP>*ini_8=k_SC2eS3)H4oKHN^FacHsJRoVf4C9xA^+9+G3O3Rde6 zK&|0xQ1jjb>9#BR`tY&5ELg&J3$(DdBo|srWNU;ED}}+E>m znMw@y$QKVseuwk@8!1*J8-G4IMjPvmkZVtY)%IEFs_%xkO#0*gbA($K76`BA=}}+1 zc4$04jT0|#0ox^mcz8-7^vo}WC8xYF?o1u1tvX8>V9XC=9@EzZlAst{38xsv>xCat@!8<>_mxaFuxfE~AZsTUlb< z2Hz-c7q5Ms#}79T#jh7t(SehBRaq7nPmZG_(<*6x_CeTVvJY$<8%VTNuUr4a4KfsU z;O-*XGrr}ipmJJY_&jn2C4Fz^w!;U5$_stI;V-}lY^25wpT*IyR#V4zouNdUO_#6B z{(e`BL8?|p4^(c$j7x@iIp&n8YF;c3+FHXFbItMTaa}xIJq&tJ8pAUO1=50eXZSMD zo{wT8cWPe=&G$XIPuuQryQ>=;RceB@T|SDLzOeS^2#n1j7+({E1=gjU>$n%f>ooC_ z-cJbK^a4)zy#?ptJjI&lN_K8hq|-MJ;+fXgjI#MIXI|@L`xRcI>&D@DzRnH8j@=Wx zex4~NEDl6e%uM?G4Apw7l+UwD1JH>(O3p9q-C> zo+seR>tX1*@Bk=0GvOI;I`UE%5}p=MgKe+3h%>xwHj?53(GQW4BO5)N1L%zUAC$bRHJIT*)iUOStr+I;&4i6+fm`@jB^M@a|&DM#1HKR4iDPUvY44Tw*kj&AC@QRm zX*HKg|ACGyhf5M9`NqDi*wdq+ zcBGILEVohbUtXB_B#BGuME|RS2=|mkK-jii@Vs-Ie2sje^-LvHeUk#O;&!8I zxDSVFjm5Z|r=Z|_Yx1`pB#d7X#8-Fbfa$DqoclXUrkm5CeB@f5X1PcCE_v=f)*jpj&WDJ@=Ph?}qaGmh`gAJ43yn0u3@UGj!faP8*=@Jr|Hf>7nt7G`ybNhP@M} z^5_{W=uNMF*!8O$zSTd3eitm@=aE&YJ5B)#?zHA5@B6S%Tnbuj74USChtR5P7{9pl z6TBMSq3!JfSWyAkeY6o;*2M9%=I)g9W(+5EcHyfFPr;kwwWwBeoL*100adMF3h1EB zm;3;O3Y0l}wF)1OH0GVvKcs_I2Jqg>T*#w`lT^4TtGSeFRT_f1e^-p2+g)y(Gi*DcI^$7QEb@$QK`-BiAl%@dT%W zf3FHL;ld~Jx$h&`w=;-~TB_LMM=rekJ(jyY%mlGCT)g)u$Kybo^WddC6nfqo2UBEu z5~gm9r`&1rT>UnVbBwy+0-IKz?baO;vz>O*Eo}pKJ3j`@Rytzr^+h1+^tW#k(z~_BpKm+ia*I?>Ui_3k1mA*J z8kXp)Z3k$kj-PFe(LX8|UjA7L{ua|YXtY^Ad<=wy@WF-ZVP)g4?@Uk zGvQ&573n`$q9r35K=I3TC@V|BM9)@rlSX^O{+*vN^dVxu3Inum>;rWp?!s4T9uI6m z_S$g~qPMzn@23$`oyo@7ea2vF8mq~;U^RaKoJQK8BgOA3etf%MxUk^$a;Q3*Dp63a z7mTHUNKfHBoObZShA>B*f8a5O+BArf5f|y@fF0bbOc!ms&%`kEC@fVTN&(S~+PPi0 z`%N3M(j}2d>nV5mWsW=4gRq0HDs~!lg|aj|laHl}XSLocdSKLDR9n%R8fU&0EOK5_ z+lE=(cTW#qy>K|e=rpiWO#to4)qtO@dH1YKqE@&Az7H6HOWwJ0ldBo-A9I_Pt#pND z!O4=A^gNtc^-}t~+gdb<(4lV$4RALgo(CS91S!4kp)h-xa9KGNA56;NLEdJ#e7_sK zsd)rC$txkb%R0Ul=)<2{b;pX8b9qS1bfk!`vN884v<_9lrJAx_eXF!l^Th&CaX&!~ zf9fd2H-+a{I-$1VH|W*W8}&zQP$`E$(b|#Hmr$q(l3aoi_ z1m1?E;_uoZ&ROltA9u*u%)a+ktW%Qb6UU|5b=f4*>0T6@CM$D(*99t;<@k=daB9AJ`!3kL7Q@s~rXtYSVa*nOI?HjT7wdt>|59eh=85#~vU za-`2nT;pcX7Hh&;N%N|3>Fiy6c}WU&*S-X$MNNWxN{cvmRx9-h+sUJUog|MFi|}#6 z8pu%bghNgiVwX2d$arx&owW`Y1G^W;5z6j9WYm07=7P7_bb2c9zR?rs9e*nv z>))L(tlmp?@!Gtpxg7`qO%1#CtGq+;*#Fx9`E_O($rE^akNVhc4%T zRL7N)GuOFy;ryrhR+Yi8?liS_DQ3Y!3|v!2lM|)s*DtwKsmwjJcxuIoL-bkPATMeMHGuu(*>o>Nmrrj< zNBmF$GK$6&vYwrGF%B!PQ6{(Mx3Zt2?CIBX0r zKkd)Mhg;&9hpzb8r5^=~>YSIo4rhNhW#`B)_+sR8SW&SCWgYgC^ThseaAFsFC!5Ze z10^PdxZ8r}@quu*X%u_DNrwfhiv`Yq0vj!BsJHB4k}g{%G;HZ>IGlk7Lgj{c+~bOu7$6Ja(E2%Z%+t$?}8f7N4b(lHU@B;3}cLU4hrvmI%vt zc0uj9l@(J029vknbFwb(hDBnWcxGHV%^Grnf84tdU(X(*f#EJHVNZ@`C-zIH`b2rpGD<22gL8Aet`ek!{YHZaY9hl18Cx4@Z2x*r~C)j zhdNrxaB(wj4==`nUb$=>r^>1`CbItRr=+$flbbGo6>4c4_Z_H@ubyk*l=3EMH@yNw zb>hh*Cq{giF&YDWyWzfwFl=ni7RsZ8!L+|5Tkw27jB>dGx$+zEyrK&Zaoo)BF6|cQ zq)%euwhPt9MG3<%cg1y!+vw%;JdpMn!fPkY#nU0j!C{gk|6Dx{ZNj{vGyDT}ExW<> zjyW9AGL)MA2MJ}NT?C^FbH4E`hCbN*AVr5|e7^Sy>!()pan`tEE0e~-_^D1oSXw_H z9xthcgMZy|+?aj5dC^CeD~hu|?WoU#0iFmYNl4PUx}znxLWr`~pKsW*iZTnu^Pr6_dqoz8c+D)Q_RvN-pH z9E3YNaA!;wT^llno=Lfi->>xJoL|QH`t=TRXq-sT->;;8pI^bX>cgy>cTbq zW7#{N)T4X^%H5bleRlo@%{GbO`&bE8Cf|WYUESGDrByI6-HL^cK6tiAF>KCt2hG9Z zEO?gl^w6HxmT`V!$^FfkirH{y#zdTWJB;VaM@X6%XYeWc23V()Yk4*GJE;dv5&N$G zO#|nA6rEm>b?nwGn6r|(`M@Yl)6+)JGm_E2^B|YioQKtZ&fxrLNL5t7bLG~Bt7x%@ zJ4xFf08L2_pzQS=oa3^W-esQP_3jZk&L>pzelS79A5*Br?Hj%E%_JlJ4Z@9BPaODl zDdpd+MCbFt_`CWwS4=%F>b%+^g3k;|b7u(F^ywtm*TANondCd4*>kG0&705B_)_{Q ztsfkVTJD4SuE&>^(mxdat~{dxHyw6RQ^9aSgB}LWLaHVF)p`IP#z>RZjVNxHIVs7*T%!Xk zZ_%Z;uVP|XIrd!;30s|)!OPBtpoEH`w4s2eY^s72n}+hT=lifNei&bRuFX4?TPx?8 zhl^XZbWzT%e|Nl#ezJJg9Pl105 z{8Qkc0{?jhV&#4VED9kI+6xO}4!vRa;X?)%{ zI?^Fw`DuUWmbIhdL-Sq=we#iv6W$0~-K_+*Kox$m+?Y;11UPu+E_goe239{bu*7^N zd$fI`Ka~&h)}KtCl>1VW4ef!eZ(6a--=6gAFbH8Yo}ty^9B7VyC~mpEM||>Yg^*}l zDLTugLClU_kT#%^hQ03;E-BoxmW>{V7H*4qNl_Hd@R!C3AJ5b7uR|r>SPl}e<^+Ch zd=8`nVxg|rD~P-?7rK0%%4sKtL3Do~aooq&s*zfmD8bjm+$rIBasDngkWit{FN=Vp z2V>ZILK7&K?W{5s4^}A^s`BQNuO#zL8D!=c!NIFN(V}QDmlzj_7gbxJtKv_*`Z9wL z#|pe!G{TJ6GqJs3KbY4&7K_F%V|SxW*4R87$6D&4ufkbMxw=-Q0^Pq0IuJsqVKm{8t@>5Ehg2AU3_J^L*k>3^qWVuHKTD; z(n2t~tHbB4Blz3KXrAk`McC+&COlJF2Q}Yp*|<1Gm=<_kD1IABTb8be#SY0;Th_lN zJLeXOcO(K$e)-_IAum9GrU@q>>dw#l*y7(g@5HusqhVTy16MR{!{3!IaDI(Hep)Ys z3v9-6%Am2FRG@+9cZ}l1q)XiRF8n;M8M=t$cwi~u_FwW< z&yQWD8@1Pn%fq4BVj`PNy^rcE?m^1-7-}!+3X{iuri5W{z|>I_gFngfeaAg)+ou|x z=BJ{vgpIw-$O)3Il30K7XV_lfjU8%-;`tgSh&l0`wrrbE9v$6yiJ=CLU))4-E$Tx1 zns+eom<~VfI)s~IoG{jP4X5qsii3A=!!FT3#gWhJ=>D!H60X7$J}^<6PLy=V{Vvn3 zvpi1Y@r*FOon*w}%7?40UUkBXv>jx;$(py1@&F-FQ;hp7>6TYFg10BM;ePiOFmY`+ z;ns{mywW3)dv;BNgeY^=$~cPVhIgzA&ne<2-AD?YDql6WGlEhjbNHA5du+Nt6uX;` ztTJf0Bx?OEq^%0eSRC(58r~IJL3VPPVc6%2|?v`|gi){yKrSnDM$2VOz_m82kANykNWeNYh+?kv_ZV3zZ<+mWg3JX_{LA>I!fltIvmg%Oe%jTqBlB_ z%3MjW<(O5X-^cFg`yvA-_jrin;V|lc^9cP?2!*3PhhnRF3eWBnjEN@&-ugL~J{d+p zNkc5u?)ye}-Frh++aM5XQ}7UM;Vk)hzWi=Kt}R!=NB0Oq(^rUnXR2`Or*i(`kw!1t z`o33m_r!oIEFVd_p1_UqmR zpISTibuxv4KO(uWWnPs_R1CiM{Uj`}su#bS?W#)EUCJsNMX;|Sk`uN2NPHWOH1vx? zwN)ny(k;8hzc+MY=uK6gI(LB>t6oY;lTFz-Ns?i50=ko8!)dOja6d?Z{Pm|ne{8VO z_nkRbD(xgwA0xc0)(vf3BQV2fJauUHtaeoD&)RG63aM(LoZWH;N0yCczbQrH`rDU< z>+63CvwZsT)NLEZ4{QA}dMJ-*Qy}r=)(RwTs@1Sy?r_Kcj$#t{x%DAgVx}>}*Nj za(C|TEyJ1De{sUeGPYef0Efii7mD>1`Ay>&vU_Yy){Z$M+-EY%@Ii+?R+R6u8-6#N zz}<`t>QnigOp_yF$Tn{-Iwb|MJ+4ss%6&XWGYL)CKNe3o9KspuNemL6d0O5uc5RQv z>)^-}?FLA=P)Yc3wpe9g(Vbl1J_L&`G5B%p4fx2jt>l*!VS`l^2zqb8sxTZhTl(?X zV@WXCRR^z)l`ztd=2S&oG2|;B+M(>+LrjgCPq*~kz;S>arw3ysdJ%M))KYoYu3%&N@Gel%ct17tr<;C)}t@YsafBdeNlH{>c@HN8>vkbbl@&z?je}#RaqtU%J zN|={u!q!?IqW$S=QW}tepFOp4rfv|&Pe05j`=eGCaQ+1%N4jdi<2teCPYjl1vM z%B2xewCQ^^+Ps|uM!piJUc@&LH+R9MIwqpW;5&kYNdq6TPlVrDvN(U^9YG=9N!;`z zgW~n9@ZjtgkY0FJyt!6O%=)z#`Z)KZ=st;6B`sQb_4OAxT%15Cr^GhbCu6UKzI^wp z18+GMilcVrP-EU;4(;54Tbl4}Eyrt{mZRy^c7S@`P;~2E1_MH{g0TObMEg@sgf{ zNX^CkS?L+Ib^8Mz4Q^yn5Fq)U{4r@#oG|fqJWQ-f;8W7y;ZB1V3T@|LPxKymU-b^e zAx3yw{UaU8{Yf22`P(c^xL~Wo^K6CLw*9;1a zx=y1)`tcB{bwX48A!LUNN52WjeyPA_5Bzzy@hV8!(jUc?uEK^V1su6L zjRM$z9w{eK~?vrWorW4V(MO2*aD_qXqUv zQPM-(SwTFCoTd6`$#S8>99rbAR=xr`jDHFzokT@ChBs zOYWL=Ql7FqZ1hbwi@gKE(ymEXT zmcKPZ_2=*Dc=17TWcSzNazTzZXgnoD-AXua^9QzQrSOWGyJ6b%MKH3j6z-bkL`5^x z*i~*e#V8)3C%-MJvG+bcR`D17r!Ar0j-SD8q9N*zR0V3=L%WA5!*S^#+P5r;&wFeT zg{f0`(uDCaLnjKS*HyuW0hj4YsWVzSN_soJTX0BL67O02o4le0u~KIk+n9Qx!rU-; zKKMCY8m>)7S=yYpR0$6R__K|4o|v_64Gov>0wdFQ!mZ>W9yX!?`j)H$heuJEr+d5d zl>Iq0>{o(1l70GsTgG@$wSh(ku9ajeX7OVSQQTrT4!@->!7**|V#=cezPkR8@Z-QC zzIZ8DIPlmG?pW7ROv`lMYmft$6C~b&(Qahi{<*5_!bZ_&_cU>B!+O|qC7RMt^g?TN z#KG5!VO!-k>N!i&e^GNzIG*MvbgFraj~@1=gWa0Q+dPkE#6E=wnZ2+_-$&Njxr;F8 zygH^kDbhaoQxts72>r4L(j>zc@yPBCe16Cr7`rl09Pws18NT@m??&gLd~7$qROQ2F zHHEOzcBP)yiZKiDz%gv_;@M`3rp1`w7*9BmT|*|D{9Uzi0iY zz&{24DezB$|GWaRa^3zn|0}$F_lj;>r}3Gb48H9w@EO5HSRK6x|1`eDMXJl8#W#Yy zZ|(*MsbOSz$ChObw6VU~xYFsX1#5L&CfmL%a9Op3*fymr+*zoACbE9me};oFv-t#^ z8C1yw@5s@M6y)B+TtL|}A0}-|q{r{$Xpz@C-mvqe^%&b>SaWbADK#YuT?gy)x0-o$ z^PVnWl6hLC+Z2ZnYxcpyjVrlidIWsZUyN#>Ca|D78hSj?!JX<(LPm!HEp!W_C(E4K z@Y-N_pScsZj(iA8B|)Ojy$5uB)G%t8bpzz=2h!+wj4@s-IPR{ljoG(>7{5D%*Dncy zTFYxBE5T}AkCu3pm+i*;7gkA_Rfl-(C|O+Gkpm}WDj@HqE%!OPR!o_4&Dvb`171pR z;N>xKJa^U^aP|eN86^itI|lOhm;!EnmBbC(6F}x+h$!0j;J}D%;p+IG)bp4F51H=C zpXB9u)wCN_XlxFbd?oBO&AT+^$QsZ;6H0%y6TxCrf1KDLIm2%3kKZY*+uBzL6r+eI%2Au z8W+v{0~WPwg-cz}P}cNrm@R=4+{(0u^3M%)MtDX&`q|Q*79AYF!kE3^ZKl$!ZP;tg zN643!aI+?rLsa$Js;FtEc+X`77C%0ZKQ9}SPp%GTt=vbJE5DN0Y!%!Yxr<+ShVnso z6|_A$1(v6b=O1rctTjLbpSLPtk0YwAeRCXXjJ1J{o_9p$sJ^iM;!ki4*$ba47sF%g zS9ENeFBhaXlkLF@xYVEl=cX&O%oj~^(+t4w?HjBw+=;^x4U%lQmL@O$qJ-t%L$KuH zBk|kj1paZ`o&v&y@WvKfJk?tZ)kAaejG`*vH%sQ-DN;Ose->Q$0pR?l59FVn3R*du zJn#1x`eUa|i-!B)(~L#fvHdQWdNm4bcgzulXi3 z$<4+Gx0JAB=}&QU^;8beFU0Zlx8jSt=jgk>96j2;l8-O9!1`Wm!No+Gm9OPid97G3 zp4wrEoy$|L<12@-nZ$#VnKzzIm-XkAFf(419SHHA6_{HWEljqp!;6#V^N_?^@uRsC z{y4h^H@DYQn%f_0=_o^-A9B)r*((s77P^DLnW@6Kwi385{dehi;BKe7uV(mcO^66fIpoFf@{O$|u7! zsXb&I8xNcBIMdu`rFf@0g8qcNa`%u^s5>}VSh?Q-~iC+WqU0;8JeajtI!9uF&|GW9;(Z}&+2QnMa9 zHZ0}EQa9j7V+L+8>Hveh49dE8mIfAhl6{>%EtT2<7wwN=ZC}94@}gj7@ruls4`JPI zXIcOJEpfN<1lS&WfGgc5u$9qis!yBCYdcMOrA#oqZtu$$*SkXM^I-m&d6plB=EG|z zeY}#i0o`2>33iHOIpXSdvUwhed1DPk{pYV?{Vqp7ePA4h_R_(*=5nZ$`xEY)HN&8g zy=YOfUKrOioKOE z3wg~yL1m*A`0kO<^wf48jyLJc!%UtCQ(v@*cg)Nw$Xeh@?=9)ml&jRa#SragHjz?L zhiKFN3~^8b^|RbV%h#Jjak4VWcRpnAY@!)AMM{&|g|0Z5pUrHgfBe7y{88|q0RI&D zr@%i2{weSuQXp2Y`~T*D#quso@msecP$1zn#k&f8%0Cj+`t)O|$+v~x=5jVxYqyYn z=tIg(_T#znKdIa0Lr@wrTkGk4RI-s{*r6tO2=_u)+f1nV|%VcZeP5Nfi8}JNP z^}I}<{Pqh28iUa0MUI%-UPXr6Qz@a*9$L=~<4(1a-1}MvlpafF5eXPwA{@SRuINa})@VIFa2U{-WeIJ}~=Cd&JTr!tVEx1n6A-%D~A{rZF1KDb7 z4Y-t*(RX(%%uvfE{c~zC<*WlIMjYV8)z+v`p1@TKarc>pz;E~bJ%r+9YvY#w!K2k*HQ12wPT!JOz2 zTJ7mebw>u;_ypBJ?vbI`R8t1(kAi8Eb0ti?tjQZQzJrBxy_o-SlGuG-U1g{84C3?s z$+aQ^W~?is#va9J@hccF>~V%qUV)-n!v?tX1Ic1TBmGb_fKq)Y91~Ix2@+4m=LK0f zW|J*8>VLJqGdY0YDQDxkfuE|ZW>3QQuXPmWDB*O6ex`#rq-ag~93d1fz;jNpb@I|2 z__A3J7bf;%-yKqD1(SK#?Vk82;{bUM`Uww0rqbf2YoM&cS{OZ92@l^G2dgr#iHlNd zVaKXXygOqiU+bBJxfw&z_oEFg$S9<5Q_`x2nZ~j~`)GdICzKP``0$`P%^(%&fmUlm z5oL$-$Qvd!&#VHyOP^5D>V0^=IG=O%&xl@=WBFXv0F-rh;t`Tgc;8wte15)~c3ob= zlPA}R_B~qYN3$yiN#($XH!G^*TBh*P#9~_U_nDX(@Ebn`hTy|dS8#5bo%Mqd8Jkwc zC!kPrfLq$fLc_Fq;sYZSF=yomtl#zo-`!N9A6tG41=*U|qwpHIKAMAdT1oWBHWE_3 z3{WobD!9GbN9q$JgoFAmk{)y|?q7!7MSl<6t{K7GeDA}e4;A9yGsnTadsp6Ppi8R< zY=bf9s$kG1#Mf7Cu<42!);Q;Y`GdGRo*;x+6(eGO(inxWp~ z^=vqH5B&VIp4DpQaAmJ}wm?;z#t?40I;j$zW(8aFSI`IUJjdoqZ3nMSbc#t;m;I-7G1JF5l^R^#xY zI{Ylmog=57r8lGO>0{GXchTKy|^TRMfs0uc(swndmo0U(1ZNWuBck*bizFR}iH#&GkLkev5 z3dVqXH{PPFg>mUd1Ect7?owT1OI<#6=SCR&(05a)doaC6&G zwk?)0WILkxno|nSt5f0}yZ$irk1M~Cvc?c~J@%gZ8o|0NYzfk3O_i>EQ#4?5`%GF9 zZ-wng(($jw5G?&&4z@S1!>Q|gge?E}!nh^T;O1)w9X>lD$hQagzc&^ST%3;?gZ5F; z6n&H$%VLW5UYwu)8tU7}1UkF_@Zdhs-#J4Fg3C9IMkRzD!kHc04tu!I(xN04m4Tn@1F#$N0DlhL&yqFkgQ zHgs$gS363WorhP7Z{F;M@dLeCaoctrD&ga-$e)fU=MN#5@+I8kYO?j@$-jjmPp(jg zl#O8g_bo+--6n_YWBFIhWwC76Bl2>!K=o^{sMoS&{B&QyxZ$nBp%d3&-N7Jn=kiWI z@Sqj<+%-hY-b}N7*YYasY96v{7Jl&C2aXAG6xD47`+rx!(=VRU!!s}b?f?HnXTE=r z`cHv>3j9;xp923Bh?P_M-~6xSDf+{S<>73bR=}~jZ|H-n9pn`rhoYq5Q#X;=`~ zmlt)r3=cM1U|+X<*yeA@r#p=)+F=_Hm9XsATe`qe>CbpfHkmKF7h=E8S5W^lhhLdr z6g^dyxwmR9KI?CVu7&{+J>d*2Uvq`Gdw+$um(^+Vm2z?Ausy829H}@@iDTw9;LPM? z9<7|q*(Y_-yQ5wtjZo31xuQzCHF6|RT>BpGDQV#tvmoK^))2~W z=!>^6id8E<6;a9Ha@Ki%l-0G?(D?2QI(w(H$*(H<(N;;5{6=%znpv==PzmQNe*;sy zwS0cgQ_`644#wZcV~azX@YPU`Hw|s2+lp1Ncb}`!{^mEG=y{SuTG)k<;u&b#obG>?5;{P@_n zT$~<}g)*L|=w&kn>J_{2ibIkaWaT}uJG~Guyi%6TFeczl;k#7vepI)xwnY2yjTLg!$8+Ly&2;7{5XdkMdj%LHqm z8sR(3=iJmLx$_F!g?eC*16MiWem{VOWq-t+ukjpO&_%o~d;)XBSnDVKn}n7@^7yNE zBo{t^4w-@N;;jSb)U;Yk=(plLZZOOh6{En^zg-;Tk;2gmtFdcdDVD44=dnJ+Vc_Q>>~qkGmY?sWx<3Y3u=5D55mw@n z`p3{cYbJ%H$Ft)7$$~=p4{=$<6jC(a3)$aNxV}JgXJ+(CJhnp~7T=iwPZhJ--9y5- znABC+*D1*y*?37fAA8U(Hx^Bup2O6>nlu=9(h0eE>>00yNyfIU7?y9nc%&OzN2}u0 zqh(^1YCb!U(xR2K-C)wkY&x>}Jq9OrgOdSG)KIpBP47gL;;3d&dS6U=qg`1zr$Ig) zJ~YuN5Pbf6a_Qq^;^7QQ&-=Dryjsx&qxbsbt+BUZ=;}UJr zo~-aMX^!zjwT~ls*|nW$GI<^Cj9v+KaU1E|izZkfWyyy~4ukqR!eW;_LZz!q)&3P> zyisSe1htw7G7UlGa;X$oHAjK-rM+}(`Qx&Ox4W`kT^c%=#PN*Goz!$PpB_(6VDE{B zd^4lBcsFJf)=tklh2l$LFW5hf70&RF%DHd+`A%vOe=!<` zES(KqrNRXj*VP1z)7c@Dum{d3 zj>IF_Oc*}VZPlFf2s$mbR+&q%;(ZVR)JmWa& zCx~==xGEbCE2OSsy;xe@2@@{Ku!-bzAHVaMiX)AL>?;#s-k8ngv~efpH>hFDn!S7= zZ~~@%PXt9tUu}N30eri^H5UxON{h0e@y`A4B^kIv+Op$3dU$l>*wYT;zy1Hev*14k z{weTJfqx48Q{ca&K&+hV|Ihz(3#)OdB%?m-lq2un>&(&;KeGAhGFlDvemZSTH~Jz8(V9Ftol<1~$3PC0;?Y!%(|a|HX({X}#9FdXk#2W3mNFb6d` z?0P?rEKcFn zuCuQQrAMqVuIZl8q-07@6#c3DmT7Ez^CP}(yaDEF6Ht5FE$)5dr}g&p$G}K9%d*?1 z3X_!fP{))IczQ?ymyVhOlT=)=yZhU!k7k+B=(>R(J*|aFdpEFi@&LB4G@#fYY1n(M z5(mCJ&w(Dgp#05K7`<#eUNCVdpP*Wv`?5{w_-calDt-%7|1^rG=dXj=w!P3|qAecW z)}I&MKS5tsT%d|ojS#;fk9(U<;0?PEKzpthXZ!8IWk+XxG|5CgQwA2i!Au5LLBI#L7{1bnHR8_*HE(PdPn^55^UP|H&C}Bg_zU9hd{V zjKssoRk^u%6}PJOsxCCj;zN4vV0A^FuCG|aNlt;141yA>Bumk@a(Q}i(SWCEq9CPd z!6*05XFID>>rJti=wJMfq*k_(>O(zhT=rIkuj2)~=gaXfNLQP-O#_>}ktnl?V8ry{ z*ma0IFOGW;v*zq<&CyBp>z%RzjE63lJuxk+DJsC7kyK?e8n#`$dV8OvTU%!V*Ly>&uPwsU<-KrAmOHBd9!|e|?X4`FqRqFI{8`ia5g1?F55MFDmd?nd zl^;tXIA9^iZ8G3R_VV<*{IwY1{EL5RPvFYec^E&U1{xkVfw{>v@pZTLZpF4mNGqqo`x_<6-) z(2MBKr#~9;huj6UA>^_6EkaXpNY~>V4l}vOMJrm6*dc_T@#2-mO=SHiiEAUa(16?y zYFwMcu^!S@J3hzIt*+KsCX)cOzKszNP9G+`3aQ4%nQ>yvgDbRm!2-xqEI{nhA-XRM z=kA(WTsnFfe=d3p$6n~sh{k9fdhrUSJDjA^HNmt)u8g~V^~RfTU69QjK+gMPRwl>K(=levTe19`KM&q|3%)B<;vrUw;@>!b;dsR!oYb(ImEQ|D+LPCd zH*ZbmIOm6yHgy|sUZ5ftX0?b$f0lt~RXPWUah z>*j+67B0f*T`#O=cbUQWCXR-Rih($LgB8lehYD>^ufgpgRnBB@ZY)uzy+7@7L**Zs zwkH&|4_$!Ot4~+mdN%=Qs7ABar!^$IS;EF~wnaIru>QJEiQaychn5weFyupFm1$d7 z?);;|Zydb%rGpzkeEo%@=Z5eA8xwAuxd0+Z2hj)nOCbFygs!ZRh1P|AdHZiAlAa&U y`^+`Sct!+zw?ztXdmfc!KqUPJ31{e*+!a3A_J{l`8b~$C0$({I3^@DCnq;GCb6KPIHou;Ewwl^ VJ);D{(oN3KD=Es)nY@beBmmAP8{Pl_ delta 64 zcmeyz@|lHaIWI340}x#F_?x+rr-D(<-PtN8v^ce>I3^@DCnq;GCb6KPIL6r2!oo2n SH#5&EF*!RmFJ_cW8kPV6 delta 64 zcmZ23G)IVMIWI340}x#F_?x+qhfU4J*(xTqIJKxaCL}c{CpR@Fv7n$h#@N)t!Z9T` SGtVh8IXg8kWwR~YD<%Me{uMj` diff --git a/tools/gallery_builder/__pycache__/dataset.cpython-311.pyc b/tools/gallery_builder/__pycache__/dataset.cpython-311.pyc index 94000c23602ed54110739d907c06b7dc25369930..6a0f27ac971db1b9ca28108c81928ca2264bda6b 100644 GIT binary patch delta 76 zcmbOvKUbb-IWI340}x!A6PdM<=K`Z)ptDs>XmM&$aZE^RPEKxWOkzPnaZGVyT554- WdPWI?rJJ0eS5lOpvzdu$0xtm3${O|n delta 65 zcmbO$KS`cvIWI340}x#F_?x+r=K`aeo3m9+XmM&$aZE^RPEKxWOkzPnag4F4g@t2E TZf2fSVsdtBUdm=(rU|?NuP+sx diff --git a/tools/gallery_builder/__pycache__/db.cpython-311.pyc b/tools/gallery_builder/__pycache__/db.cpython-311.pyc index e82b44231a70d55113c253e47b16611285a0e272..0354b9867be65c46259847b4f713f48f78a4a40b 100644 GIT binary patch delta 76 zcmeCPm}$YYoR^o20SGS5iOkx_78e=_cprl@#UYY_4IRBmn@yY#Sc{ delta 65 zcmbPf(PzQ4oR^o20SGR7{LS3RNb22}ZsDQDlg@t2EZf2fSVsdtBUdm>BrZ^q| DJMIlz diff --git a/tools/gallery_builder/__pycache__/report.cpython-311.pyc b/tools/gallery_builder/__pycache__/report.cpython-311.pyc index 041bd8b81b4ff8b2dda6d59cae39cec80c3ed8b7..d5bea37b391cd2b8a3be5d39286325a6ab5ed55b 100644 GIT binary patch delta 76 zcmZ3duv39&IWI340}x!A6PdM<$CA@9z}YG$v^ce>I3^@DCnq;GCb6KPIHou;Ewwl^ WJ);D{(oN3KD=Es)*__RJm<<5L$s0TX delta 65 zcmdm~uug$zIWI340}x#F_?x+r$C6Xc)!8a0v^ce>I3^@DCnq;GCb6KPIL6r2!oo2n TH#5&EF*!RmFJ*HX=V3MgrQj9f diff --git a/tools/gallery_builder/__pycache__/types.cpython-311.pyc b/tools/gallery_builder/__pycache__/types.cpython-311.pyc index f21968cfc6e0bce9f5c9ca66c1c6910a1e995200..a47f7ea46ec711c8865cfbe5150f96ea4ad13d20 100644 GIT binary patch delta 76 zcmbQNI8TvhIWI340}x!A6PdMI3^@DCnq;GCb6KPIHou;Ewwl^ WJ);D{(oN3KD=Es)+1$y*#RmYnbQ**J delta 65 zcmbQII9ZWrIWI340}x#F_?x+rC!9&m#n~z*v^ce>I3^@DCnq;GCb6KPIL6r2!oo2n TH#5&EF*!RmFJ