From f4665a4c9fefb012a20ed5922ea2814d80b559ab Mon Sep 17 00:00:00 2001 From: xiangsilian Date: Mon, 29 Sep 2025 23:23:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=BE=E5=88=B0android=20=E5=8C=85=E9=87=8C?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shaders/texture_loading/glsl/bg.vert | 21 ++++------ .../shaders/texture_loading/glsl/bg.vert.spv | Bin 1592 -> 1836 bytes .../texture_loading/glsl/point_line.frag | 14 +++++++ .../texture_loading/glsl/point_line.frag.spv | Bin 1752 -> 2512 bytes .../texture_loading/glsl/point_line.vert | 11 ++++- .../texture_loading/glsl/point_line.vert.spv | Bin 2328 -> 2732 bytes .../texture_loading/glsl/pointcloud.vert | 14 ++++++- .../texture_loading/glsl/pointcloud.vert.spv | Bin 1784 -> 1936 bytes .../shaders/texture_loading/glsl/texture.frag | 39 ++++++------------ .../texture_loading/glsl/texture.frag.spv | Bin 2076 -> 1144 bytes .../shaders/texture_loading/glsl/texture.vert | 38 +++++------------ .../texture_loading/glsl/texture.vert.spv | Bin 3288 -> 2368 bytes 12 files changed, 65 insertions(+), 72 deletions(-) diff --git a/and_proj/app/src/main/assets/shaders/texture_loading/glsl/bg.vert b/and_proj/app/src/main/assets/shaders/texture_loading/glsl/bg.vert index 0769410..5ff8f1b 100644 --- a/and_proj/app/src/main/assets/shaders/texture_loading/glsl/bg.vert +++ b/and_proj/app/src/main/assets/shaders/texture_loading/glsl/bg.vert @@ -25,20 +25,6 @@ const vec2 positions[6] = vec2[6]( ); -//const float offset = (640-480)/(640.0*2); // 假设宽高比为4:3 -// const float offset = 0; - -// const vec2 positions[6] = vec2[6]( -// vec2( -1.0 - offset, 1.0), // 右上 -> 左上 -// vec2(-1.0 - offset, -1.0), // 左上 - 左下 -// vec2(1.0 + offset, -1.0), // 左下 - 右下 - -// vec2(1.0 + offset, -1.0), // 左下 - 右下 -// vec2( 1.0 + offset, 1.0), // 右下 - 右上 -// vec2( -1.0 - offset, 1.0) // 右上 - 左上 -// ); - - const vec2 texCoords[6] = vec2[6]( vec2(1.0, 1.0), // 右上 @@ -50,12 +36,19 @@ const vec2 texCoords[6] = vec2[6]( vec2(1.0, 1.0) // 右上 ); +// 定义 Push Constant,只有一个 float +layout(push_constant) uniform PushConstants { + float myValue; +} pushConstants; + + // 输出变量 layout(location = 0) out vec2 outTexCoord; void main() { // 获取顶点位置 vec2 position = positions[gl_VertexIndex]; + position = position * pushConstants.myValue; // 设置输出位置(Vulkan使用不同的坐标系) gl_Position = vec4(position, 0.0, 1.0); diff --git a/and_proj/app/src/main/assets/shaders/texture_loading/glsl/bg.vert.spv b/and_proj/app/src/main/assets/shaders/texture_loading/glsl/bg.vert.spv index 1d843ffbcb5c017dc74d90bb1ca2a92827688de1..9569f0bee7234b446fb51655775cd7dcc0f9d32b 100644 GIT binary patch literal 1836 zcmZ9N?M@R>5QYzwEeHZ40)8O2qN0NM1&AUPgQl7^p$5a>rnVd1WZ5?D)_}jf0xtwF z!o;ickBRTIyMv8~OwY_a@64Gqb6RqPi^I+hxG^{Gc3rxr+@KIAET8P<%0Xqd8#hOq8YS+XKom*n&}sQs77LvGZSE4A|ee!23d)@ZkD-S{N* zYhe)iwPw)q8*%W(hd0v43!+BYYxWa7G5XK*oafHzjCQLV#6c^m!Bg$j@hPkw`kmN6 zeit?UV<)EPt_cq?>mNfMCnWD~Xs`CVpZ8i(H?Bu~|69HIgMYl&YIT|k_EK2?-OK7EeHxQce_1)WGiSe5gx!BpHVZ#I^P{tf zXAuL&y};NFBL91k~#79coQ36K{l@u44IKV zn&A4-TFz|FBgee#^V;Ep;Rhd=IQOk&_Jph-r>8$xbT_z@5;)+-xgcGfl5wUo4!ChH zN>|>qJkzqk;8@(H3?ui7UN!a2NH~+6#31m%xZ|w$f`nevgSkux-^y%eZ2qg#xd*uy z)K6xd_H-!8!*>ac*n;+=1dMx-^QMHwS-cB;#50ejOlO|(>Hl5HfP{YE(+(GGK^kwx zV(=m4UDnRb@lyvjZyU_|xhkCn|A}^d7 z4*Bj#hy%BrV3zZNbaK8IpZJFoFqUEbg8>_mRF!o}`(p`Qd^Q{EV&+dJybJ2$OlQJ4K1bS4OvThPZ95!ha=BtN9$R_ZE`7z!rFzbv@-|M+>e8N?Zmqi#56$FT;E+8l=sN3Yq7nzjYTns#ALO)Jo0Z^)`>t_qvd>tUrnv8sGt z3LIFMzmW3!(%8v;_9MrZ{EM2=!V!mG5{&tI?EGbUzs}EpH*{XKD*_sLr@16snq#L~ z%{A~&b6K|XPV=nEgG1xiUCB9eH}vADZ(U$dansRzHI8J}9ohtKgJV4mjP@T$6EGub+t{CplOH z(80NyU&z*7A06mD@b2gvgS!5T@ibE}Z;}5DS3iB{f1&8}d&7SvJ^i^Ra92mlhL*d3 zt&HT_65!CFXWdN!9zA>EyVzaXa38e3qWQi6$8g*O*>E#LTN&y7Ljf%@dP5(nf#3g* pP#3sI_QXf;>VGcV)z8`Jr>lQoHXIsPEYZ7(x*X?1T(czNy@vtTsKG< zqdA;>D4w~51TJ|D<{HMZ#<+yD{U}P+Vl(Ri&)V%`wytMu#8UMTCokjSJP3KYi~pv$ zV-UDdlgihRb(eRcm`-p(PipIzySm;u0Rv^fg0)cdGdv0}^H^7T#K=2CfS0eAmx&Zp zB@!d?6VZiG+I)=QXX=wxiQ3Ulkkf-Cy2@`O*f<@oKw4%7&7!Rm<`m@J5=IU$q$?Ca zdnt%7G_@AA^zCOWKf=fbTH6Rx8_?B3CT60E&LwI}VDGf3`Bq|wsJqBb1lKg+65r-k XVl`8fYvANzW=~&6fI97E=7i2ax~5G$ delta 36 scmca0e1n&lnMs+Qfq{{Mn}L_Xc_Z&;#>q#R0ybB$WH4?nU`t>I0FKHCpa1{> diff --git a/and_proj/app/src/main/assets/shaders/texture_loading/glsl/point_line.vert b/and_proj/app/src/main/assets/shaders/texture_loading/glsl/point_line.vert index cc00794..9837258 100644 --- a/and_proj/app/src/main/assets/shaders/texture_loading/glsl/point_line.vert +++ b/and_proj/app/src/main/assets/shaders/texture_loading/glsl/point_line.vert @@ -16,9 +16,18 @@ layout(binding = 0) uniform UniformBufferObject { mat4 view; } ubo; +layout(push_constant) uniform PushConstants { + float myValue; +} pushConstants; + void main() { mat4 worldviewproj = ubo.proj * ubo.view * ubo.model; - gl_Position = worldviewproj * vec4(inPosition, 1.0); + //gl_Position = worldviewproj * vec4(inPosition, 1.0); + + vec2 position = vec2(inPosition.xy*2 -1); + //gl_Position = vec4(inPosition.xy*2 -1, 0.5, 1.0); + position = position * pushConstants.myValue; + gl_Position = vec4(position, 0.5, 1.0); fragColor = inColor; diff --git a/and_proj/app/src/main/assets/shaders/texture_loading/glsl/point_line.vert.spv b/and_proj/app/src/main/assets/shaders/texture_loading/glsl/point_line.vert.spv index eb72c72656fac0a17e64d8077c016b84f15ce403..a54c81cc2c7686fd1393585f381a0a6c7916cb3d 100644 GIT binary patch literal 2732 zcmZ9N*>e*|5XJ|~5@$HWP0SiY2r)PZM@R^^g)lN8A`t_xDq*c*sr9aEwc^MVRe4Vp z`IGpoc%h2#x0)7P8dq!j`}&yfnU-9cS=i~^4!75R69!RcBmL)5ax}+g_D0w8Q=x;{*M?OSFz62RcX8N_qa^J1qb%Iaqt_vRyGnjhvKf#1WrwOf$~9C~`yQR~Ce7mh>nMCP z$kJEBRku@pIrlV)w$g0-&S+~Z%-YXi=^RB=3!BW&yH7ZJ-A?;qtlj+Rfz;X*St)K} z^gNYbb>E2_q{AqW(&A3w0&!8&nXuG&NnB?%eA!5oVctvfp)mR3S=;ZP_2N+|rsfuf z2UEWASH-`GyPYt57G`<)mbjYd(XrW~HT91_{Sdj4&NWp7?@I0Kngn!KRkE&6!y0yXaEe?_Sl~eV+yqyOxgZBU*^F5I+yQTEc665YPK>=h96cCE z3|ytep~LaLqBh?3Yc1n91(OGR-P;W}JSI2xhf|n0B%X7QsA~M?g}~^?q}8+slH-c! zF2U4uLZ7>|!+`^R?)DgdPQ6k)x(Pn}gss`wTA53^!EN2SC6uRO#Y zlMn}QaVMk`$4pt=N$KzwcS<_3@XP9edg1Wr4(BC-q^+u%yK@pagtbHRpK8E%UV?o= z((&B)(wQ;jU(a2XjxRROVH35QRrV08v3iE-GRG?q+-wX}>hrOlouU3$IZO zm|QAEGpIaPx9sG=5Ah4Khq6~P65h(@WuIiLvYh_9wExio-KO6ZOO;}|TrBNWs*Oga znfwU6O5lfHrRK+8HSte9bbXG_5350|<_hvsxHaTed%x~Di{hYm>U(F6I64;2n_l&0 z%-7JbNAbyKt6ulw^5L=WQAR$EDQq%%hoje%sOAOQt&SczTAMO+=}WW@Bl$gMQruBc z+4JIWUYvN}(ez|IKC!6jCw>%)?M?OEk@9|+?E62}H974VcPX|N_>FD9nH+>wuM=Y$ z#9BeniBV5MJS(q1=HZ8(D^rg7)Z>Grttg1%RM(x(%MaTOeK0#TCCy_$If#=~mrv*E zhZih&Fkh?P32W&c%)70FF{Y@xcz^oY)x_{wdD*T$E!LOP+`Poi2(xS+@8#x!FXzFL zw=T1J-0kLpFXzFLcP=ZcPQK++GM2^DZJ74Nyvd;le3tFSa?}FHZaH$`n4#tH;rKpt z7qhcxf|;9(`Hg`&mpC(XF~2=9cM)e!E?&(r_YO;iZb}t_@kizLXfMddl+Rm%sc&4L zecIu`1$|!4F#KdTQ+#V^t_$1Vmov;8!;J_JXfMd%5b-9XEkHa?tj7LN&& z&w2N>7i28r;0YP=3E}(N=?QL99`9rOB!+SC1MR#Eaq0#aWN^IAw06z`qo2{v9q{PE z%oC0}&_0$KbH0ZDg*B^ zhhtgpy?i*gkEM)r`}iP^eDuWKK0XR_H=430#Tzcm;4v2Ga~^f`-6L-6UXkzCy_V`O yYFrnFW7)blXdp_sPY;&WlW5$e_Ni$_$nQYCNQ87kbA=RbwetEr{G}kvapW$)I zeEi0T{A}0=dd*=6PaeZHJ>#XFbfT_JY?Sr^M=v(44p>iTniE&;b-(UL zVK=FVNmsZaUwBsg^q?N}d@%(xFWfoj3%?@%D5zEa_`r`7|2uJoKF=PTD_SsPsXy~d zc^fAC_J>YMOlD&~vh4=8^U=~(!ynj~Hnv_63~Zie%8Xf@lUcXo`q6F_L~+XH)7jfF zV?5Q_5dS5#ttf7P=(SpYTsb_}yj90bZ8Doq937(_N6+o3=?6m`y`EVAo0KARW=pzv z7@3l8gn2Jv&??EsO!427rIvAem$zv*M{ zcto-$jPJBWYscZ46rOD_DGPU=)z7OJlYXOckC+BD7 zB>uhxj^(%q+QV_CsyboT4<-0wOOnR` literal 1784 zcmZ9M+fEZv6o$7wfv6xN2NmlSJfrml#>A*7nsU*k7^1fgv{SOlbf%e3@o>c}=p*@5 z-kA7*)7j00-K?(l|Le5(T7_a^eae_~=7PCow#@j9&8 zO)(85X3m^X?UKIx2Q~zFlG~Ce5)z8~6r}$sp=4%EquFk>T8-wXc4shX50f8(-wtf( zx4Sm>JBdBzBJw@U>M^4p{gZ(yng z>qX_%C$|~I(J|U_yr&;^{UFD2?-T2PlTv0;Q!-|B7|E`fs_dhnz30bY{W$Tz6I01} zY<$tsCN>JiPNnhmNO>D3`}U_^O3v6vFZp%?JNRga$wAohCq5>QZxjR*ANTRZbISTK za~n=trW`xy#Ro?_Q4qyxTq)g&4aZDFHJBB>cQsLLPFb?6Z-@0GF_+J9>%ttD$J_FG z;InyfF6OFiVwk^+S(FX`TXo1;l8^`Q@>XP%$DUl?HQDek@49Sq;os`U z+z-yh*JQ(inb92y^Zl&8y!l?nNlm!>8OO|A+=Gl`K6{z~Gk7Q=pLqQ2>6hx_+mO(k s7~aF)9!oq4v*NB`;@sVy$!1sh*ddr)cC;z+B+LRom_7c}W?xDE1D@7>n*aa+ diff --git a/and_proj/app/src/main/assets/shaders/texture_loading/glsl/texture.frag b/and_proj/app/src/main/assets/shaders/texture_loading/glsl/texture.frag index ccdb2fd..6943e81 100644 --- a/and_proj/app/src/main/assets/shaders/texture_loading/glsl/texture.frag +++ b/and_proj/app/src/main/assets/shaders/texture_loading/glsl/texture.frag @@ -1,41 +1,26 @@ #version 450 -/* Copyright (c) 2019-2024, Sascha Willems - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ layout (binding = 1) uniform sampler2D samplerColor; layout (location = 0) in vec2 inUV; -layout (location = 1) in float inLodBias; -layout (location = 2) in vec3 inNormal; -layout (location = 3) in vec3 inViewVec; -layout (location = 4) in vec3 inLightVec; +layout (location = 1) in vec3 inNormal; + layout (location = 0) out vec4 outFragColor; void main() { - vec4 color = texture(samplerColor, inUV, inLodBias); + vec4 color = texture(samplerColor, inUV); vec3 N = normalize(inNormal); - vec3 L = normalize(inLightVec); - vec3 V = normalize(inViewVec); - vec3 R = reflect(-L, N); - vec3 diffuse = max(dot(N, L), 0.0) * vec3(1.0); - float specular = pow(max(dot(R, V), 0.0), 16.0) * color.a; - outFragColor = vec4(diffuse * color.rgb + specular, 1.0); + vec4 textureColor = color; + if (textureColor.a < 0.1) { + //textureColor = vec4(0.2, 0.2, 0.2, 0.5); + discard; + } + + outFragColor = textureColor; + +// outFragColor = vec4(1, 0, 0, 1); } \ No newline at end of file diff --git a/and_proj/app/src/main/assets/shaders/texture_loading/glsl/texture.frag.spv b/and_proj/app/src/main/assets/shaders/texture_loading/glsl/texture.frag.spv index e0bc54e6d3f68f7021ab59468a846e8ea641c36c..dfcd42017eaac9658a8b5899a706db142cdecfd5 100644 GIT binary patch literal 1144 zcmYk4TWb?h6orq?#n^l8%~~&sZAC205 zrCg|HE!0ApZ1g+vz{Un~i+D_|qqWB&R3#>d@STn2uo#-HcJtz***a@?N2B&Q`fL^Jj~1a7K5S3{!H2H>{Ayo&G3^(zi1jzMS7P z9(?#n8(a!IsV#4hvnSgap)zBRI(v4<;*Wc$va zUj^Q0-VzOU?q8mXKVD?o$^Y*!L{`{&976y2ULIs6FQq**$7KN37R!FZdIDj~=?@ ze!*18YW39rtJv!s{BH_u-~U8>ieB$l34Igm%}qjIE}5!slTai7niHKbr(Q4i2z^-Q zMdI6po}3Z(+~XbO-Q&zVgmdh9AMqQ`)1x{er+4c0sX^3}0 literal 2076 zcmZ9NNl#Nz6vwZ;7Lged5OFA=IDj|-qR3Q)I#fW7xNMsCfiEd-(?R1(T)1`RC-PId zG4cPqeaAH1lC?YUP0071-?Q4a|PfvqLbm1yegXh;cf`y4UXM|t5lD#8alW{rMLolrMA{Fv=!5&P=K#9UlLCZh98TkSIf679vkGA?}>QJhn{?LGU--z(X9zDMy>?o}p-Cspm G7X1TxmVy`n diff --git a/and_proj/app/src/main/assets/shaders/texture_loading/glsl/texture.vert b/and_proj/app/src/main/assets/shaders/texture_loading/glsl/texture.vert index a836f8d..183bc7b 100644 --- a/and_proj/app/src/main/assets/shaders/texture_loading/glsl/texture.vert +++ b/and_proj/app/src/main/assets/shaders/texture_loading/glsl/texture.vert @@ -1,20 +1,5 @@ #version 450 -/* Copyright (c) 2019-2024, Sascha Willems - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 the "License"; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ + layout (location = 0) in vec3 inPos; layout (location = 1) in vec2 inUV; @@ -29,10 +14,11 @@ layout (binding = 0) uniform UBO } ubo; layout (location = 0) out vec2 outUV; -layout (location = 1) out float outLodBias; -layout (location = 2) out vec3 outNormal; -layout (location = 3) out vec3 outViewVec; -layout (location = 4) out vec3 outLightVec; +layout (location = 1) out vec3 outNormal; + +layout(push_constant) uniform PushConstants { + float myValue; +} pushConstants; out gl_PerVertex { @@ -42,16 +28,12 @@ out gl_PerVertex void main() { outUV = inUV; - outLodBias = ubo.lodBias; - vec3 worldPos = vec3(ubo.model * vec4(inPos, 1.0)); - - gl_Position = ubo.projection * ubo.model * vec4(inPos.xyz, 1.0); + vec2 position = vec2(inPos.xy*2 -1); + position = position * pushConstants.myValue; + gl_Position = vec4(position, 0.5, 1.0); vec4 pos = ubo.model * vec4(inPos, 1.0); outNormal = mat3(inverse(transpose(ubo.model))) * inNormal; - vec3 lightPos = vec3(0.0); - vec3 lPos = mat3(ubo.model) * lightPos.xyz; - outLightVec = lPos - pos.xyz; - outViewVec = ubo.viewPos.xyz - pos.xyz; + } diff --git a/and_proj/app/src/main/assets/shaders/texture_loading/glsl/texture.vert.spv b/and_proj/app/src/main/assets/shaders/texture_loading/glsl/texture.vert.spv index 4938ff8d5cb90df8d838193fc1fe75909863eab6..edeb674ca95c98df78aaafa192d0e03f5ef2d55b 100644 GIT binary patch literal 2368 zcmZ9MSyNL%5QPV_hzKGgi+do73yP?KD6)$|jU<-BYbugkdaWckl?COED&H;rOa3Zf ztnz#}w=tEWn(02h%$c6PiS?#WIoIRPxIve5?KSLrg*ai!aL;7lXJ;GD((L@g91&+- zEDR)ONKve~q*C;&=%*#1!;)#qnj|ZU>91G&ZzaZEzsqC`nOrWD-7Xx|YK2DgsO%NW ze$^|K{JMA0^bbAa`a0tL>Or|x>I_IIqVsHQ&JSA6y?yQ2aPh05DLWzl&eej3-}Hl! zFEMcStNEZ2<|N%E?fF*Y^Hxx8G>g?Hcv89Gtjf`TvE1^6B;6I+wXRt38^S-83wf`; z@70^$H}aAZj*ic0B-9&v#X^6eT^vLGq4d4YT$qc_s?~!p^oSe43!L|;1SPMm-7xxn z=zCwenPI$MIVf%V#diJ2vRfYmRY`hU$-MKEz&e#zr>rrPO ze7p0&$Xl0Kea;3u?!aOZ_ES4|rjL^nmf2HnGqm{*I(tN4v8g?x|Ll|M1$EKKq$Rbd zB;%?NPi%ZC*?roH1z(PAW*-cHzxE!9`LXFK82-V?hoAaG+Np2(^paR`>SOb+U^B9b zy&%zAH+w8JkJqlL3h&(JA9t6f!wrmD*nBr&qq47RPf4scw#^S*ugfNudT>ogdR#ka zF*9Jq-qg+=z&HzgI>LbR*M_`8A9UlqfZJ0C8 z#bzeJIF~!kOSmKFE@;O`9qd)@@UVVkGc#cDcoF%q?LC+w>MiO!pcWii#QYJ$tP{&y z^SfuWz#aLG!CsM{eL%u|tSXycW8;I*c?oZyQzWq?5eCkJ!w;Q?Z&ZSx*~mxOxO8R% z`5s{t(uu{#neYQMJ{P5fZ781iPf3^==7JddJ}F5_?CdG&IyK*^Ci!`nap4{-63!+DuFL?Kab1_*&2>W<_=kx5 zrgX3Yb&$JkN#I1E@xhI=wk7yjIsIC3&zBN#ghgJj#Bwsyt)AuV2m?o0-8rv>kwYEJ sc`Y3rVOdUIocWI4NZ>+kV(lH?O6QxRU+~?P5DQMf_#VOjs^XI5AI58*sQ>@~ literal 3288 zcmZ9NYj;ys5QYy;Q<1BPT)fp@yaNRl5JhfPOw~w>&}u~urHSpqG^t5i^c!pW2gIM` zui}eq`8?;G31?+k!=Cq@nZ0Lb?~_)>W}i!vJ<0y$V6vO!awHjpN#G{3wN}4VpX(2r zbLTIdGvZKE$pVcz3{u9?t+lkH{XDuK)iaHrMZZE<&`op;t?+M*^MH{*IFN>yDj7Pmg3URdV8l?4yY1Qu0w1s-JQX*XN#>X z?PL&K&1%G7?>6VtwZ1Wx> zTI%+PoYQI-2e|)H@Xmv7cK)l_kGj2f(*(pComtw+i7LCC0dKS$ORe5Yt2b!iowuTWjdh!??bSP=*IV7*)|xfTIhV9Eq%v+5uAOdd4oWrsBsav>>>iz) zVJofmEYEv|TcLfaq*ly-5?&EIf3dR@`$nGOeD=<80iQEgs^|j$2j;;hFN|=rU?uY0 zznmu?&66|lIvV?Xw%p?qS1Gu^S*_Xon?{wuGdaw#zGppGvU|#Vst)hWIVk3PFUA`q z_D;&!Z$|9f*6*Cf)^(ID^QJ*!?c-PztW)R-;_X|kZwkDZ)mZt<1@=3U)4z{(4;p^4 z^~&i#$ZD*6nlJVqKsf*oyI=vFeNbtJu~Wc%kq|En?q|InMYNt3Gkm>N_ge z`Xg95P36YkL*+uvbKgxg_7QItIO^_zos)HU3)?y`^2Nz}&x(6Ih4DLdZ|CptUA!xM z^!F*S{?!re?~eW}}f2hF5d)IzL#`^}0 z_uk(?<;Biu2AxK4ljDAG797ivd#m7_b;P}0aL!|i%AL% zH~KYrwAOFn1C1%+7uC=2?5>+{TXm zBImozZ%i(uId_U2_lcal*z&3pIZM>+Z`U$vE$(e>+{5?SE9et?u-+d~W96Nfzkzbv ztE~6XxaXg-M`!m7oP6}xz?M^@*8AA!*2>iDaec^l3> zjB|hgKFB%eF6%bxoc+5HXZ&99aYhd;rz&wq#P{LKH4VUWsuJ;0(+-?_8fQ)ZjgtG1 H$V=$|m1x+p