From cdbd3496a128ccc5172b0a8d1bd7c5759f2a3219 Mon Sep 17 00:00:00 2001 From: inotia00 <108592928+inotia00@users.noreply.github.com> Date: Sat, 7 Sep 2024 03:37:25 +0900 Subject: [PATCH] feat(YouTube Music/Custom branding icon for YouTube Music): add patch option `RestoreOldSplashIcon` https://github.com/inotia00/ReVanced_Extended/issues/2368 --- .../branding/icon/CustomBrandingIconPatch.kt | 64 +++++++++++++++--- .../branding/icon/CustomBrandingIconPatch.kt | 7 +- .../kotlin/app/revanced/util/ResourceUtils.kt | 17 ++++- .../drawable-hdpi/action_bar_logo_release.png | Bin 0 -> 1987 bytes .../splash/drawable-hdpi/record.png | Bin 0 -> 1837 bytes .../splash/drawable-large-hdpi/record.png | Bin 0 -> 2701 bytes .../splash/drawable-large-mdpi/record.png | Bin 0 -> 1828 bytes .../splash/drawable-large-xhdpi/record.png | Bin 0 -> 3570 bytes .../splash/drawable-mdpi/record.png | Bin 0 -> 1285 bytes .../splash/drawable-xhdpi/record.png | Bin 0 -> 2398 bytes .../splash/drawable-xlarge-hdpi/record.png | Bin 0 -> 3545 bytes .../splash/drawable-xlarge-mdpi/record.png | Bin 0 -> 2398 bytes .../splash/drawable-xxhdpi/record.png | Bin 0 -> 3545 bytes 13 files changed, 71 insertions(+), 17 deletions(-) create mode 100644 src/main/resources/music/branding/youtube_music/splash/drawable-hdpi/action_bar_logo_release.png create mode 100644 src/main/resources/music/branding/youtube_music/splash/drawable-hdpi/record.png create mode 100644 src/main/resources/music/branding/youtube_music/splash/drawable-large-hdpi/record.png create mode 100644 src/main/resources/music/branding/youtube_music/splash/drawable-large-mdpi/record.png create mode 100644 src/main/resources/music/branding/youtube_music/splash/drawable-large-xhdpi/record.png create mode 100644 src/main/resources/music/branding/youtube_music/splash/drawable-mdpi/record.png create mode 100644 src/main/resources/music/branding/youtube_music/splash/drawable-xhdpi/record.png create mode 100644 src/main/resources/music/branding/youtube_music/splash/drawable-xlarge-hdpi/record.png create mode 100644 src/main/resources/music/branding/youtube_music/splash/drawable-xlarge-mdpi/record.png create mode 100644 src/main/resources/music/branding/youtube_music/splash/drawable-xxhdpi/record.png diff --git a/src/main/kotlin/app/revanced/patches/music/layout/branding/icon/CustomBrandingIconPatch.kt b/src/main/kotlin/app/revanced/patches/music/layout/branding/icon/CustomBrandingIconPatch.kt index e1f67deb89..e206022ddb 100644 --- a/src/main/kotlin/app/revanced/patches/music/layout/branding/icon/CustomBrandingIconPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/layout/branding/icon/CustomBrandingIconPatch.kt @@ -9,8 +9,10 @@ import app.revanced.patches.music.utils.settings.ResourceUtils.setIconType import app.revanced.util.ResourceGroup import app.revanced.util.Utils.trimIndentMultiline import app.revanced.util.copyResources +import app.revanced.util.getResourceGroup import app.revanced.util.patch.BaseResourcePatch import app.revanced.util.underBarOrThrow +import org.w3c.dom.Element import java.io.File import java.nio.file.Files @@ -71,17 +73,11 @@ object CustomBrandingIconPatch : BaseResourcePatch( "record" ).map { "$it.png" }.toTypedArray() - private val launcherIconResourceGroups = mipmapDirectories.map { directory -> - ResourceGroup( - directory, *launcherIconResourceFileNames - ) - } + private val launcherIconResourceGroups = + mipmapDirectories.getResourceGroup(launcherIconResourceFileNames) - private val splashIconResourceGroups = largeDrawableDirectories.map { directory -> - ResourceGroup( - directory, *splashIconResourceFileNames - ) - } + private val splashIconResourceGroups = + largeDrawableDirectories.getResourceGroup(splashIconResourceFileNames) private val AppIcon = stringPatchOption( key = "AppIcon", @@ -110,6 +106,20 @@ object CustomBrandingIconPatch : BaseResourcePatch( required = true ) + private val RestoreOldSplashIcon by booleanPatchOption( + key = "RestoreOldSplashIcon", + default = false, + title = "Restore old splash icon", + description = """ + Restore the old style splash icon. + + If you enable both the old style splash icon and the Cairo splash animation, + + Old style splash icon will appear first and then the Cairo splash animation will start. + """.trimIndentMultiline(), + required = true + ) + override fun execute(context: ResourceContext) { // Check patch options first. @@ -117,6 +127,7 @@ object CustomBrandingIconPatch : BaseResourcePatch( .underBarOrThrow() val appIconResourcePath = "music/branding/$appIcon" + val youtubeMusicIconResourcePath = "music/branding/youtube_music" // Check if a custom path is used in the patch options. if (!availableIcon.containsValue(appIcon)) { @@ -160,6 +171,39 @@ object CustomBrandingIconPatch : BaseResourcePatch( context.copyResources("$appIconResourcePath/monochrome", resourceGroup) } + // Change splash icon. + if (RestoreOldSplashIcon == true) { + var oldSplashIconNotExists: Boolean + + context.xmlEditor["res/drawable/splash_screen.xml"].use { editor -> + editor.file.apply { + val node = getElementsByTagName("layer-list").item(0) + oldSplashIconNotExists = (node as Element) + .getElementsByTagName("item") + .length == 1 + + if (oldSplashIconNotExists) { + createElement("item").also { itemNode -> + itemNode.appendChild( + createElement("bitmap").also { bitmapNode -> + bitmapNode.setAttribute("android:gravity", "center") + bitmapNode.setAttribute("android:src", "@drawable/record") + } + ) + node.appendChild(itemNode) + } + } + } + } + if (oldSplashIconNotExists) { + splashIconResourceGroups.let { resourceGroups -> + resourceGroups.forEach { + context.copyResources("$youtubeMusicIconResourcePath/splash", it, createDirectoryIfNotExist = true) + } + } + } + } + // Change splash icon. if (ChangeSplashIcon == true) { // Some resources have been removed in the latest YouTube Music. diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/branding/icon/CustomBrandingIconPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/icon/CustomBrandingIconPatch.kt index 1b32eb836e..956b6f3203 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/branding/icon/CustomBrandingIconPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/icon/CustomBrandingIconPatch.kt @@ -11,6 +11,7 @@ import app.revanced.util.Utils.trimIndentMultiline import app.revanced.util.copyFile import app.revanced.util.copyResources import app.revanced.util.copyXmlNode +import app.revanced.util.getResourceGroup import app.revanced.util.patch.BaseResourcePatch import app.revanced.util.underBarOrThrow @@ -73,12 +74,6 @@ object CustomBrandingIconPatch : BaseResourcePatch( "avd_anim" ).map { "$it.xml" }.toTypedArray() - private fun List.getResourceGroup(fileNames: Array) = map { directory -> - ResourceGroup( - directory, *fileNames - ) - } - private val launcherIconResourceGroups = mipmapDirectories.getResourceGroup(launcherIconResourceFileNames) diff --git a/src/main/kotlin/app/revanced/util/ResourceUtils.kt b/src/main/kotlin/app/revanced/util/ResourceUtils.kt index 6a7a21458d..38ddccbd3f 100644 --- a/src/main/kotlin/app/revanced/util/ResourceUtils.kt +++ b/src/main/kotlin/app/revanced/util/ResourceUtils.kt @@ -63,6 +63,12 @@ fun String.startsWithAny(vararg prefixes: String): Boolean { return false } +fun List.getResourceGroup(fileNames: Array) = map { directory -> + ResourceGroup( + directory, *fileNames + ) +} + fun ResourceContext.copyFile( resourceGroup: List, path: String, @@ -98,16 +104,25 @@ fun ResourceContext.copyFile( * * @param sourceResourceDirectory The source resource directory name. * @param resources The resources to copy. + * @param createDirectoryIfNotExist Whether to create a new directory if it does not exist. */ fun ResourceContext.copyResources( sourceResourceDirectory: String, vararg resources: ResourceGroup, + createDirectoryIfNotExist: Boolean = false, ) { val targetResourceDirectory = this["res"] for (resourceGroup in resources) { resourceGroup.resources.forEach { resource -> - val resourceFile = "${resourceGroup.resourceDirectoryName}/$resource" + val resourceDirectoryName = resourceGroup.resourceDirectoryName + + if (createDirectoryIfNotExist) { + val targetDirectory = targetResourceDirectory.resolve(resourceDirectoryName) + if (!targetDirectory.isDirectory) Files.createDirectories(targetDirectory.toPath()) + } + + val resourceFile = "$resourceDirectoryName/$resource" inputStreamFromBundledResource( sourceResourceDirectory, diff --git a/src/main/resources/music/branding/youtube_music/splash/drawable-hdpi/action_bar_logo_release.png b/src/main/resources/music/branding/youtube_music/splash/drawable-hdpi/action_bar_logo_release.png new file mode 100644 index 0000000000000000000000000000000000000000..59c91455af269db79943e281f61c84799a1c9d05 GIT binary patch literal 1987 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 TuGn|EJS4!v#0FJsj7|6#L=jnX literal 0 HcmV?d00001 diff --git a/src/main/resources/music/branding/youtube_music/splash/drawable-large-hdpi/record.png b/src/main/resources/music/branding/youtube_music/splash/drawable-large-hdpi/record.png new file mode 100644 index 0000000000000000000000000000000000000000..90472fa9f851d8986fd15ab696099f7a9602047e GIT binary patch literal 2701 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 P>=4MsiA-uH2BiHT=+aeg literal 0 HcmV?d00001 diff --git a/src/main/resources/music/branding/youtube_music/splash/drawable-large-xhdpi/record.png b/src/main/resources/music/branding/youtube_music/splash/drawable-large-xhdpi/record.png new file mode 100644 index 0000000000000000000000000000000000000000..711c10127217b869a4e578c7338ce0538e0f8842 GIT binary patch literal 3570 zcmb7{`9BkmAIG;`!`NJNu2NpmwfH5olNO}4FLH691f=&8q%RqIvP#KV(E2t^o|ZXjrMOpi00>B`Ezs07MiIj;K-wvGU0LoX~ETGuf|Ur2@97t>a9J-YrfDq5HzoiMyPR@G>pVDUHtBuIhR*N-PzF)!D%%{&sKHJO&AKAp9`!4Lio5s&e+XbW79K zyp`o%owiEIbZ3Z~3@sILyY;)$(+kg;h8%I@!KG|!q961el zD1IS8Lf=Qvcmy%sk(QXv>SvjFu2>bey7qumSXEZvE7YBu>_lQtx~1$|k?;0X;*iNR zW?OZKRYx#c)S3g`UAPA1oZ`WWgt8L)rNRuk=LGDzAN*8sX6;6d&H$yoS)@uBTY_!1 z;jDMTvaB3#QYA!-Gbr0-1=Ik;e+sBxh%lx5g?@JFI%9$VsC!gUuZB%$)yID2>~y}x z;d%+{&gkpE`p2)jhQeozU9@eU!^qg=`2FbKkdVDf(H^CO-3>hdQ^zdXDg{6evZ z`+E{=4@_kwPMbDuQXr4&#^c4w8T1t1Wr6VT7oz26#<+L5%}>yk187DO@t;|&#s)X=Q>mOQQSA$)BNbdn^_ry zl$m4H$L5m|OmZ$sHamyXG{AdfK*}c|mvVf3q~D)QzSXz*+jML=vKL^_dHC^Y^~|Wgan|oBk5&FB}(-YUVN! z7$vn8&9ir+bkfgKjE8j=!|)G!b*2%aDU`k_@yYhjVx{@BUxdrYwlLFG;(H7|MRAaX zzUy$17@DIn@PJ`S`3Th;sLR-tp>Fm(+tLQsIl?LKR&O>V49R_OG(8=C+|nSUygR^L z5>q(Sz)6&r2hX{C=hqtrC{PADyDD*|npTV@ z7;XiKSz*cTY4YFLBnkk=@3~MU+=nIytuG}RVvX9;!VyY0U|7RK5{VBnu3f)rS6mKt zPWSK-`OclDuluARZ)WPwwZs-S<5+TQ-z#^6(v25HV6p7g!xEP$C%Y-3=&K~mu*I$P&Lwkz?dQNOa=Z0?O-)`be6Y~Y7m*-2WI?38@3D%kw^+*b zYzn@;et=+3$DHovNnS2ckF^EsC;tMAh8~u>q^yREWPV&U-KBETz8?oQt_cc>&Kh)m zD%FU(2qNyD-JNb}>|b62wa~~eu8z%#J+jH9ewIafgLRd0grtw^KpC7FiLsebMLADN zU*xf1V-S1HGA#slE^Dt8`~&lGScBLq5un+<0|pQFd}5izTflpvcCvh50=5X9V7;bV8Hz^H(B-Thqz4*Lt{&3tHV#C?UUFxAIT zlS1HKsJ2=N05X@9yLmAmnkg06Y{@%t{>WtVgX-0qxyez#7N1CpgI9T<_5yQbnq_R7 zy49W@T??d&vl%%hG7P}y*Gw&w)Nxn>Um?}&GFP58WM!S z8CAF^ZyBw!h*9sEO)C>Hfo>2l8a6R_K9)#8 z9+P0#Q;uM>!-z>W&DzPml2~O7Zd16ZM$j5KqyIr%Mp0MG$x_>c`4Z%gjr9<-?_Lsi zE{!O=wl@j7eXsq}H!O<|^S7nRCXwRKKHHz-KwaEQCiQFtK)8;AQhY4m4Ugt_9lU_6 z9gWcoY4w)E#xoUwE+_DW`j0x${mMw4vGry46f==9y~ieC56xtN*n1kgjxoYnCLSOP zLtk{1zEkH>L<#IO7l6E7qJ(eG)G!o~^*+I)jdnpYTMQW4=rQ+Nhdpha%V{5eXj$wF>;yFd2YrlDL}SiCCJ ze5s-?I4F20GDzc(slJ2S7JL8<1z#x|GAY7c@|MsR)*7{wqWPHXgH-VjYf z8OOPknQ~U7SrrDhv`d4(X(r7?1EO>_Zx%}mX`l@n9C6=RMvBJEV>hj!7*p>ZJk!PH zu>Bn_T+=`X>0!v8Te@OQ#aqahmzDSCXEjVu7Gq$@6%7iR*K8hvdwAwotv-2cERXa- zTjy~NM9w?k3ikARxlz#K=6m=Z^UOmcu+{xR6YV1Q$QZwTW& zjJaaUs!v+{DrVs~<6g01;>J_8~OM8oo#H#10Pxr8Ac~VFE-0Q(R%d){b=vVISHXOOlFe zt%b1DEp=ASBpwgb4DH&RhF!1~FrPTlRJn8%(*=AxHP(f5KCGNiMP%v6&9MI-lekh=V4gY~yu|EeVqA6<_xQj;7oO zfOp5@CXY%od=@>D<0jTWg~@r4c(3ra5$9B1)P4C?k=Yo5YWtyF_Q1kKP{h-Z%W600 z8k_L}?+2}FlIfD~*J&QuvSh;8$h{Kopp3}hZiVYFRHL)(Pvi=N_05jD3FqFtqqn}a nnA<-PIjJTK;PyG}eskz_{J0X<-ckSes{&Y<+M3{vykh?c?P0dd literal 0 HcmV?d00001 diff --git a/src/main/resources/music/branding/youtube_music/splash/drawable-mdpi/record.png b/src/main/resources/music/branding/youtube_music/splash/drawable-mdpi/record.png new file mode 100644 index 0000000000000000000000000000000000000000..23d6fddd048ddb9482beef30138e913e4cf31963 GIT binary patch literal 1285 zcmV+g1^W7lP)cikdXfn5dSbR|IpC?|Ns9`Q2*fI{~#d$@bLejp#NZC|FE!`ddFx0000qm zQchC<5I|6Xa4@jY|M0+&U?8C2amvpOz5Jn020RaQZJ>dI4 ze=_Rvn^e!^BM%ooJef=sm8X zaiPcbE=gvnO2`7fi7F#I6c$vrWLRZihE?`uA=#y{Ux64{`XVOlxWE;WeG;)h29g1? ztm+51N;Y&%x;wHTCab-5{cpP4@X`R1l9r|%`#r{LB0b^B2sV}KA@g)Dib5N~AEtV) z7AfUW-D=fu+?q3mUl6A4ws_s-?+?oVpGfms%n4I&p_0UD=dEdk@l6Zk`^)YqDb4pk zbd6cVLR=Kxag3(=A)AaER$vv*JqxpH4H}l~RcfIlTBQ$T;A~uAuF&f;rcNunIvWWJ z4N&0_%mmohrydFnPyyLj7*V*3gUaaO!#HOO6l0=I97Li54b41L=LYunC##Lpj24Jk72JzvT-1Utl1h- zdn1tPyUj|y=uG|C8lNu5gsJ`?_db8$RE~U&h_l5@5vG3C&83`ZrIF=4f|VOvKs`~A zj%DmIsycb4A`;TuI$#>hhO~GN!#loC;f+(XqywTCucW5s$8AGBm+h;UQsPR6NGTgK z#D!Og*75D%!s28>e6mX{98B>!m0ej9I(mxFsqD#Opn@{{xdNsCk)PbSiTy4N5$StX z;W}sV?Z*!jruKh|g~?vZ+C@08ApFy|GVw vO~RmviIb$h>--6>=lfCmjqhjfslfdMP?wYSbB$#j00000NkvXXu0mjf!mE1s literal 0 HcmV?d00001 diff --git a/src/main/resources/music/branding/youtube_music/splash/drawable-xhdpi/record.png b/src/main/resources/music/branding/youtube_music/splash/drawable-xhdpi/record.png new file mode 100644 index 0000000000000000000000000000000000000000..ff4651b1709a3963faf8eb121ee514f8ea449ce9 GIT binary patch literal 2398 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/music/branding/youtube_music/splash/drawable-xlarge-mdpi/record.png b/src/main/resources/music/branding/youtube_music/splash/drawable-xlarge-mdpi/record.png new file mode 100644 index 0000000000000000000000000000000000000000..ff4651b1709a3963faf8eb121ee514f8ea449ce9 GIT binary patch literal 2398 zcmV-k38D6hP)u)X|A2u1z`+0i|Nrpt{~#d$prHTY;Qvri|IpC?U||1{kpD0+|FE#=4lREG000qm zQchC&&V!ZZi9xgxHpg z;$LQTLdo@sd+6AO%+?!jM;(^Jgca?ZFmMC5YLL}Jg*}aF>C$UB$ke?!?_6qWXmvOg}M<;ls(<~cNEj^N(C!5CkJp1 zi)Aqv6w8eywmKNhM6jjosWXh4V4*>bI0ccw5M{56fn7mn$lU_?42CFsgDr|6YX=@L z%PD9Lo+yHQD=F}BS!sftliO9WQ%CUiAo!RBTtQ(t{_I7$L29@N|4hBPEw>88P_(6K zCbwQpWNZiq{{Jh_^o5hsxV4r|X5!~$$inj0mgFd?%9p;T{#vHIVx%9fZ9$l`Sle7J zXRVwI;_dEysQkI@n%L^vv%l}rDv^FKaiS}-OSxpc{(zuvU6Zz4Tjyu3r1;A{O42o& z)rlz_gXQDTw~c#odwvE8$yqGIbDp^OLe# zF0Q!lbvKkd_}I3F_QvPA9-dZ_3N!qaw(*bej6cP4z;bw8q5c@VWf~gOzPC(l-ME5a zK&yUU{Ip=wH#sa`$eEk>qOQVB3nu0F7hIF!n^mr<Hxk3u(=Fc{A{P%a$GtPsaSZtz_lFTLUikXO|kwRQg?>+0uQ9TdQt=L zzJMkgOjgDL^#xf2#Ndes;4nW^VbY;u3?KxN0{TA>l?4v$ zBvPWVNViDaH%I_&lJ#vYKVBBe;0LLK+myJFA~T$t8JJi7u`(_tETqf~$0CDK>FrWT zvg)!NkX-W2d(iv#7h=}Cw32dOcFd8%NuRM!L@Pu|HMiDS!EMytiyesxucjg<%A*i` z)r!S5hlGZTk4PsHf|a(rl=$wXi7e}(UT6(&MQUIJsL1Hokec|Ul)zz5R+y@BfuyWK zDS{jD4B=GD8byE?+$+nF*)4G@WsOpkgEb2~e*~dwoEYVc9Cf|Uy=MlnDH8Py?! zN?oG>s&@_591Mtxny6kc?YpNJJ(Vp?)wpwlMAaIq&Hbt3HOk{rQ4@79Dp`Xn+UOk~ zn<_Flmj|Ybr>=WZO@s=&`00VwqV*4~fuK4@RMlOnKqsR#6*ro~6`fmZK*il{ZVQ8X zcF@cpDHZ7Ej`O%eL-h)3;R~e#o%ai>g`dEjQ79E?;|iEJexh#7M5#c_ePZ1h&<}Kg zicTLLxSsGlQ>mog11dHt_GB*i)n^AH7yuO;I|d+uZ%V2*@n8vTzr>GKtDK2cU`XZw z75jsh0}bhS<;4V_I3yE3HHeG>z4mIt0d#L$Mm2eO0k>D*&)R`uqa#${#-JnjRG+o~ z5Ev5-zy(3{pjJWE)tQ&| zJ@{kKNAatO5~(-fR!#qSJEPr(K^TfkTQ@05$y$O*%M$qizuZ$EP$ZWftoprGuk09T zxW~i+b44r2vr!el+WthgiUDydQ$w;sy*=toRYIQ4FV=0Jx~lVegZhSc=9l}izL6c2 z^9HzK&WvSOmaI)t)lcr(SgHnUR7x+Gk$`V}pC8SHtxAq0OWDYT)awf@)M0qTW?^|% zgO6^r*#=!Ajx&f$1fDPETZ;w2eOU>P0n`Vp@i2k{ge7=S#4QZ`f9Z}35MZ!9vGf8n za_OT>JKA{dZK(H+Th?!#&|Ybmg+<8-P0&Y7yi9aiTofqoOE-$7#CBOoR4g1u!m%-X zyDTJXw*bdDzE#tyYmfrBm_U9mJrIDnT0mZZ*T}I2b+6!zl|z=*<|#*A6oTu|T$WB< z0~9zS${j+K<_=_adGD8%i&C+-Gd;eGk*?miA9hG8Iz4na_Ym{$E) z>m!_PB?i0>z9MhaZ7RyeSuhS*;v58r)Hs6@?5s5^XJ=Vcc{?kpD%;r>Ru!<9^}pTc~0pEgmt2+_yaih zCIR=O61!qNB1r6~5R{dta1Hp#z_+k0P*!f2Bs|SY>l@|K!ct;GHK2`vCrNB! z^Jt4CKCLj6k*>l4U65F6QnZ?QpT0=B#G9>z0eFe`**IYkiMM!%Qg;l+<;_x(a*M>X zw!C9lVb8DQMXOI3T_Bbc|4Fh>m`0!_%NBoDr1I`Cr9{NcRYWoKP7aTH1I}}1GKeU1 QWB>pF07*qoM6N<$g4B82dUHku0U`5!pueEF;E}3_~;&QQ5Z{OUaU%lJ&Lk%2w904O3B( zHL}gvvb4ol(Ht$N(7% zT%Q6ll}hp$4a*9%^_?iSX{`vF0)LCoizR_orOPNP`)U;w{v)-Tn!ROezWqIvP1 zWg5TFoSJftd!HMwWrhiM{IJiL&(#DGsv>nbbduzZUpltnh_4y6n%uCMW^(-^z6$AJkgddi?^t@YjW#+PXcDg*&;EL*b z@c<}ff9y_oe)#1qb`ycC*#@%@VJ$z^VV`#kQ=zvTRBM-1Ix7!X_qXj?OI7a<=W_IV z$e!C?zP&2cn1wKFKm5?>cRKlt#}OZ9EOXV4*Y5G7OL2=dj)~YqFPW?6BE1h2>`79W z-J+syq`%p4GOu+>RkT9oC@pHTT8cnaVPw6hhew*rzwMTO1(F_ec-J@gM4kbSIl0XT z{<+vcfx&bFxkswzRXDm-R~u9)PL$6AIu;i6=CEA(zQuTXHMd<|%$Lr& zQ#BP0Y;)!h&+*hSz|`zwOIm_yjv2&=QRw&~&q9Kk`=9TwSn$l(ordWC?FdV+%~OTs z9>hi~WE&R$6h?MAe4F*@`Ne!Z@~G^28qq@dRl5^@*iVbizo6p;s$?V|EXLaqwa=wz z$`m&KeUT)1w@!iAP~LD<#q)T*>D;>uv*~+t5mEb2%vP)i?HKk35L_*JtIlgv+}h{8 zRth=d7!eHEuG6uwHb=V^_$mwJ$H zs|rHNyt{s4#*o{xo+am-x!GVyhO5=vN&Moq_XAh@Yj1AK4zA7?;j}oI=g7oWy?&I^ zwDh;RM&EZ;e!T~%lUr{fH>E;0jIT&UE8bw9Hp;0W6E!usyZ)|SQ1`1kH(Zl`LjWpV z5_fKupEfccq?n^6qat_9d%AfJV|-*p-CmU?5ZO6Hk>&mxQ%>pN_WQ!oPk01yF4w_2 z@Xr=3QNS;=NwDA=->e9$qa>er8E-z?*yrG2_}XG8it_PU^wQe->wuw=s?mv|(%?kS^yya;D7N0tv|gRp{mqzhn3)h{s72Tr#Wckgtb>_XhFIZVvYztoCaJ zI2UZ+3fhPAQD=Gkdk7A&ST~M%z;N$xVtRoA?ePOOhvq|nAI>;XnYg2BglWUYjDv;% z*H8%wYYHF(=Gs@+&g?lFVsiVe66`?ribzCkVfO`O4#86y{nid$mPoIjw zXd+o}Yh9k(^8AybJ{QLMc#ix2ubgf}#!?LJK2U!o=p#vq6SE_{==ogqvIOp+G5m|Y z>Tgs(m!Gp)p&*C*$@^>RG8$$7qKUVuV(T-ApyUpPeb%HemGvxCGsi4nYm-l8q$EJN z7*PDH4tc~n@V!VVoIP6d2Suu?vN zdg_|w2x-dikg`y5A-SB@r8OdG(>*N&O(W$gfNn2FSnFbnHi4(qw05v7^wsqEvp+#F zY<)vh4>;1W3ExDPtZTK4qxa(y!b#=+Dgs!#+10n;NKn{d9MS=R?V0qjzgH|v&_4C= zrn`S1Cw{;ohDN3@j0!K~A2rJcD}lzM(=LD0#Hwhwo>~oFq}VD?T?_TIFaB z@95if_w(Y{n7Vj(1}*k_cN0))&>`0AeO*%H3ROkP##JeR< z0f#-iA&8v`zdpC-jTLT>Q}Ml(tAWN3mJg@NSYV*qR!h^$pdZO?m9T}1am>&sW0yld zrZ_GaOnnnV-lE*-q9k%UNn?w&uwL&y-%riaeH1Hq=qwhBj*fE~D1E%u;kQlEeF<2z z;1IFip<~9G?R38s7d$`{1Hlz}#Ha_;?9kaLF+QMfy!E>NhSKW`I1BsP=(aa={;icU zm7MqK1?fK>U0j*4w#2g6eiFcW{{-?Ss?_}IGU?aAIR_0QP$mxRA2Ua`kj08s;)hx6**-7iygi)I05Or_r!w5D=BUh z-r6Af@6Nh3_u`MITv}o zDD8FeTF^d8h@ih_d-K}4#|Lh+Z^5}jN%}OCRj%m7<-|6|puM9|le<+h(GjX2=U-7e zH74ouI!Q|Hg)sH3M!SnZK-Imoya7vUsoVj6;LM%On)w&2kiub1Tg44<$(3qz%_`n! zYiB+Hhg!b^svlR$6V~Lc+$JX?Y*7G*_ejC4Z4mVAM=^rbPMGI86%mhFuwKf}P#QI&tUyWZHTm%GC6hMMq4#rPBR-7j;G|LVEKW}x zwGLOr5|G<~%)lxE!XY)nCRA^%clWkghlTxdSMFyB5m9ZXIor!e62+%tyB&1U5rfHN zqpF$%6x$*P~h}1)J%ZQ z9~P?n3Na^xnuL(kyw6%5vBN3@yF0HIaKBaaJ=y{Le(r10Hsdk!ul$p)xnMoKuUm>o z?k7d1@geB-7rg@Q0>QsKuIpILJdTBU_h?34Pi0!T)lcM*#lchbidYJx4EY8Nm#6ZH zGWSmsTQc#7(=pN0%gn)c@yA&|TVl-Ni6W9b7Oqt#fbE1}orXF3MEsenKqu;b;(jrHq|+dCqi^Pigf8u(lZVKnT-I`t$!1OVwQx45(g{8v*aIO&SyXRrmd`Vu@YwoYb=jV3w6F(t7%cR7tk}kCep(y z_u4Y~A~qbYMexlafTR?%OtNJ(0RJ#Al-u-xuKOLDUQ9%8 zhZ=6YMK?lC<((1EHow0h2b~e6M<@iRNamXPIzKB0qAR1_U-&d{v-cBPw3#|mXrnwJ;QPw%iw$!5pQgP@KU0%rWG1A{m-sFV zVYs@y!fSLjFx%-jG-wK{Cyprt5<=MW*G&lw$b%7 literal 0 HcmV?d00001