From 57a04decd61fd91618a9eccda4a7988248497276 Mon Sep 17 00:00:00 2001 From: Francisco Gindre Date: Mon, 22 Jun 2020 11:40:48 -0300 Subject: [PATCH] Splash Screen --- Zircles.xcodeproj/project.pbxproj | 4 ++ Zircles/Components/ZcashButton.swift | 2 +- Zircles/Components/ZircleProgress.swift | 6 +-- Zircles/Info.plist | 4 ++ Zircles/Neumorphic/Card.swift | 2 +- Zircles/Neumorphic/NeumorphicButtons.swift | 12 ++--- Zircles/Neumorphic/Pie.swift | 22 +++++++-- Zircles/SplashScreen.swift | 55 ++++++++++++++++----- Zircles/Zboto.otf | Bin 0 -> 13096 bytes 9 files changed, 82 insertions(+), 25 deletions(-) create mode 100644 Zircles/Zboto.otf diff --git a/Zircles.xcodeproj/project.pbxproj b/Zircles.xcodeproj/project.pbxproj index 9fa1551..97f9187 100644 --- a/Zircles.xcodeproj/project.pbxproj +++ b/Zircles.xcodeproj/project.pbxproj @@ -23,6 +23,7 @@ 0D1366B824991A6100F0EB54 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0D1366B624991A6100F0EB54 /* LaunchScreen.storyboard */; }; 0D1366C324991A6200F0EB54 /* ZirclesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D1366C224991A6200F0EB54 /* ZirclesTests.swift */; }; 0D1366CE24991A6200F0EB54 /* ZirclesUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D1366CD24991A6200F0EB54 /* ZirclesUITests.swift */; }; + 0D5142C324A0F0B800F9AE2E /* Zboto.otf in Resources */ = {isa = PBXBuildFile; fileRef = 0D5142C224A0F0B800F9AE2E /* Zboto.otf */; }; 0D6A22C0249A9C3000B4E946 /* Colors+Zircles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D6A22BF249A9C3000B4E946 /* Colors+Zircles.swift */; }; 0D6A22C5249AB1FC00B4E946 /* ZcashSymbol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D6A22C4249AB1FC00B4E946 /* ZcashSymbol.swift */; }; 0D6A22C7249AB36100B4E946 /* ZcashButtonBackground.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D6A22C6249AB36100B4E946 /* ZcashButtonBackground.swift */; }; @@ -70,6 +71,7 @@ 0D1366C924991A6200F0EB54 /* ZirclesUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ZirclesUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 0D1366CD24991A6200F0EB54 /* ZirclesUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZirclesUITests.swift; sourceTree = ""; }; 0D1366CF24991A6200F0EB54 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 0D5142C224A0F0B800F9AE2E /* Zboto.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Zboto.otf; sourceTree = ""; }; 0D6A22BF249A9C3000B4E946 /* Colors+Zircles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Colors+Zircles.swift"; sourceTree = ""; }; 0D6A22C4249AB1FC00B4E946 /* ZcashSymbol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZcashSymbol.swift; sourceTree = ""; }; 0D6A22C6249AB36100B4E946 /* ZcashButtonBackground.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZcashButtonBackground.swift; sourceTree = ""; }; @@ -135,6 +137,7 @@ 0D1366AA24991A6000F0EB54 /* Zircles */ = { isa = PBXGroup; children = ( + 0D5142C224A0F0B800F9AE2E /* Zboto.otf */, 0D11D3D5249D2E0400223146 /* Utils */, 0D6A22CC249ACD6C00B4E946 /* Neumorphic */, 0D6A22C1249AB12200B4E946 /* Components */, @@ -313,6 +316,7 @@ files = ( 0D1366B824991A6100F0EB54 /* LaunchScreen.storyboard in Resources */, 0D1366B524991A6100F0EB54 /* Preview Assets.xcassets in Resources */, + 0D5142C324A0F0B800F9AE2E /* Zboto.otf in Resources */, 0D1366B224991A6100F0EB54 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Zircles/Components/ZcashButton.swift b/Zircles/Components/ZcashButton.swift index b9d6e7e..7a3fe47 100644 --- a/Zircles/Components/ZcashButton.swift +++ b/Zircles/Components/ZcashButton.swift @@ -160,7 +160,7 @@ struct ZcashChamferedButtonBackground: Shape { struct ZcashButton_Previews: PreviewProvider { static var previews: some View { ZStack { - Color.black + Color.background VStack { ZcashButton(color: Color.buttonBlue, fill: Color.clear, text: "Create New Wallet") .frame(width: 300, height: 60) diff --git a/Zircles/Components/ZircleProgress.swift b/Zircles/Components/ZircleProgress.swift index c93254b..96e66d9 100644 --- a/Zircles/Components/ZircleProgress.swift +++ b/Zircles/Components/ZircleProgress.swift @@ -9,12 +9,12 @@ import SwiftUI struct ZircleProgress: View { var progress: Double = 0 - + var stroke: StrokeStyle var body: some View { Wedge(startAngle: Angle(radians: 0), endAngle: Angle(radians: 2 * Double.pi * progress), clockwise: false) - .stroke(style: .init(lineWidth: 40, lineCap: .round)) + .stroke(style: stroke) .fill(LinearGradient.zButtonGradient) .rotationEffect(Angle(radians: -Double.pi / 2)) } @@ -26,7 +26,7 @@ struct Wedge_Previews: PreviewProvider { ZStack { Color.background VStack { - ZircleProgress(progress: progress) + ZircleProgress(progress: progress, stroke: .init(lineWidth: 40, lineCap: .round)) .glow(vibe: .heavy, soul: .split(left: Color.gradientPink, right: Color.gradientOrange)) .animation(.easeIn) Button(action: { diff --git a/Zircles/Info.plist b/Zircles/Info.plist index 9742bf0..495e095 100644 --- a/Zircles/Info.plist +++ b/Zircles/Info.plist @@ -56,5 +56,9 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + UIAppFonts + + Zboto.otf + diff --git a/Zircles/Neumorphic/Card.swift b/Zircles/Neumorphic/Card.swift index 2b68ba9..efe9662 100644 --- a/Zircles/Neumorphic/Card.swift +++ b/Zircles/Neumorphic/Card.swift @@ -23,7 +23,7 @@ struct Card: View { Toggle(isOn: $isToggled) { content } - .toggleStyle(SimpleToggleStyle(cornerRadius: cornerRadius, padding: padding)) + .toggleStyle(SimpleToggleStyle(shape: RoundedRectangle(cornerRadius: cornerRadius), padding: padding)) } } diff --git a/Zircles/Neumorphic/NeumorphicButtons.swift b/Zircles/Neumorphic/NeumorphicButtons.swift index 23e9498..a06d1a7 100644 --- a/Zircles/Neumorphic/NeumorphicButtons.swift +++ b/Zircles/Neumorphic/NeumorphicButtons.swift @@ -167,19 +167,19 @@ struct ColorfulButtonStyle: ButtonStyle { .animation(nil) } } -struct SimpleToggleStyle: ToggleStyle { - var cornerRadius: CGFloat = 5 +struct SimpleToggleStyle: ToggleStyle { + let shape: S var padding: CGFloat = 30 func makeBody(configuration: Self.Configuration) -> some View { Button(action: { configuration.isOn.toggle() }) { configuration.label - .contentShape(RoundedRectangle(cornerRadius: cornerRadius)) + .contentShape(shape) .padding(padding) } .background( - SimpleBackground(isHighlighted: configuration.isOn, shape: RoundedRectangle(cornerRadius: cornerRadius)) + SimpleBackground(isHighlighted: configuration.isOn, shape: shape) ) } } @@ -240,9 +240,9 @@ struct NeumorphicContentView: View { Toggle(isOn: $isToggled) { Image(systemName: "heart.fill") .foregroundColor(.gray) - .frame(width: 200, height: 200) + } - .toggleStyle(SimpleToggleStyle(cornerRadius: 50)) + .toggleStyle(SimpleToggleStyle(shape: RoundedRectangle(cornerRadius: 5))) } } } diff --git a/Zircles/Neumorphic/Pie.swift b/Zircles/Neumorphic/Pie.swift index 6c420b2..469cf12 100644 --- a/Zircles/Neumorphic/Pie.swift +++ b/Zircles/Neumorphic/Pie.swift @@ -23,14 +23,30 @@ struct Pie: View { Toggle(isOn: $isToggled) { content } - .toggleStyle(SimpleToggleStyle(cornerRadius: cornerRadius, padding: padding)) + .toggleStyle(SimpleToggleStyle(shape: Circle(), padding: padding)) } } struct Pie_Previews: PreviewProvider { static var previews: some View { - Pie(isOn: .constant(false)) { - Text("hello") + ZStack { + Color.background + VStack(spacing: 20) { + Pie(isOn: .constant(true)) { + Text("hello") + .padding() + } + Pie(isOn: .constant(false)) { + Text("good bye") + .padding() + } + Pie(isOn: .constant(true)) { + Pie(isOn: .constant(false)) { + Text("good bye") + .padding() + } + } + } } } } diff --git a/Zircles/SplashScreen.swift b/Zircles/SplashScreen.swift index 34c197a..96c7e2c 100644 --- a/Zircles/SplashScreen.swift +++ b/Zircles/SplashScreen.swift @@ -15,8 +15,24 @@ struct SplashScreen: View { ZStack { Color.background .edgesIgnoringSafeArea(.all) - FancyLogo() - .frame(width: 100, height: 200) + VStack { + Spacer() + FancyLogo() + .frame(width: 200, height: 200) + Spacer() + Button(action: {}) { + Text("Create New") + .font(.system(size: 20, weight: .bold, design: .default)) + .shadow(color:Color(red: 0.2, green: 0.2, blue: 0.2).opacity(0.2), radius: 1, x: 0, y: 2) + .foregroundColor(Color.background) + .modifier(ZcashButtonBackground(buttonShape: .roundedCorners(fillStyle: .solid(color: Color.buttonBlue)))) + + .shadow(color: Color(red: 0.2, green: 0.2, blue: 0.2).opacity(0.5), radius: 25, x: 10, y: 10) + .frame(height: 50) + } + }.padding(30) + + }.navigationBarTitle(Text("Welcome to Zircles")) } @@ -25,16 +41,33 @@ struct SplashScreen: View { struct FancyLogo: View { var body: some View { - GeometryReader { geometry in - - ZStack { - - ZcashSymbol().path(in: geometry.frame(in: .local)) - .fill(Color.gray) - - ZircleProgress(progress: 0.75) - .glow(vibe: .heavy, soul: .split(left: Color.gradientPink, right: Color.gradientOrange)) + + ZStack { + Pie(isOn: .constant(false),padding: 16) { + Pie(isOn: .constant(true), padding: 40) { + Pie(isOn: .constant(false)) { + + Text("") + .padding(40) + + } + + } + .overlay( + ZircleProgress(progress: 0.75, stroke: .init(lineWidth: 40, lineCap: .round)) + .padding(23) + + ) + } + Text("$") + .foregroundColor(.buttonGray) + .font( + .custom("Zboto", size: 200) + ).padding() + .frame(alignment: .center) + .contentShape(Circle()) + .offset(x: 0, y: 50) } } } diff --git a/Zircles/Zboto.otf b/Zircles/Zboto.otf new file mode 100644 index 0000000000000000000000000000000000000000..e963a366b58fa5396f9872e33e16317e87cbc90c GIT binary patch literal 13096 zcmd6OcUYB2)A!yqktl)+q6i|Wh#*o##a^&$RO}j~2#2D;LBQTkG>I5vi7~Mzv1=@` zL=&S?vG=anP(j6phy^f)d4IF_-l%!L=lcG9-{W--b9Q!TXJ)7FeeBk&S2tlNrU*;n z(WYHH54yK~hY&Wkh46jTt!KTU*fmjJLTC;`h#`>)5lK$-ofivX*Wuvk+>l#?lF z5OBZX-5?eN)@`*7fV1(g5u1=Y#;3B?Bq6M~<9ljC#F!-EhNVKY#fMFTDK(;bqs=FT z2&#cG%fyHTljp-Bs{tqBeKX0Nk_x`?vi=qy9zw$>-oZY@Zx1fl^p&u*%wg;`r_o*B z{iPxcFN??cZYeC}3c1E2ml}cR-aHSVOzHiXn-Jg&pTbHrX>)`%X3ezNjqkJczgngU z)GXd#0$B29jP=7yw8Xb(YOlwllrcwJZ}BJi_rP}{9K_)gzOaviEil_!!Iq-DXrW*$ zjFwTbweSRwI`1|ZbyTne=JZgoBk1%2XPQ-MjM#}m3bqjTB1XZMqK3GxU@OcSsbFgn zCKf8#M!1N{3UAKtNEFcIL#? z6jOY(N7snqreu#`|N8y`I_CW~@55q%7%I#n74L9i0@EW!yoeCV?~VVr8GSH6S)_gqJ!utI)TBVB2q+w z$!I7d7J>~EKZ=cFpV%)Bh;(sK91=&wQE^Nh7bnC?aY~#PXT)uBN8A-z@WOlIfyfaL z#Ut@pJP}Vtu6RZyx%|Jvi$;a?nzHE*U8O7kkAG+BKmTo^|NJ+e%+!OrQ#bmUx>6VX zF--VcPuC5EzA~ zX=Oj~R1A0*x{AW87KK$U3*D^JJ}cZ=G}#()R1@X+Gt@B+e|+DR7u7V)t9HHm4O)bC z>fWpGfWeV5!_28;#*Q05VdA98Q>IRvx8(mHH{RddKXGJye3y2S2rtRz_%`7wNfD8z zD04g_Qj#e-&Kxz)lx#L9no>ubQ)81&rfBoX!lm zd)gG*+1PC=bGTe&xos78IR=9%runGA? zI7!c?f5MOuiPNn7Zmo~<1ZyfDfl+$GbG4L`3Dgc?G4iZ6(Mz6y^yox{q)EjWc$80= zEc#1uKac(;cl({elalUifIJIx4*}FV$_XeHNb@hD@Xrc>_G$88!BYEzY|`8Z#gWC- z|vuHTIK1Pp@JNf=7f9JW&8hZ61 zuy&e4l&iVQb+!yvks#31i;3Pm0=mHN4$-TJ>wq>uqQA$x5xt0Ore^2moU>Kn^RbB} ztUk{M`d%Oj+gI+`wP|OdZC_QBAc?Z$EI^{dc@mDr_toAdAkZs%g2a^>Bucm6hmWg+ zu)1{n{SpLb6HcIvjkms`u%9tc?Jdex@(0}>P(zvT(%%VdYhSp5v`xRxB8$`u8nkfZ zjT?!2DZPn~C2u29>GuspJ05pboY0N|o0KreJRFD~L^|tB==8PA&;qXpcnRv7yOU`9 zaYr?K(WzI47SbA@$2n=8W)dxLUXMiirkO-LLoSl=>NkVvOrK+zX@DdebnA(IegdJ6 z<`Iew(J7|CPFOVfZ5audXR}CnK5s%I@VFVP4G>D4mQSKf-79K#bj(vjAtNF_gJDor zs4mi~jXK|sfuo6T+8>fCfIPPnil}&TlXNJCY+Z;874X!5^y)5X8fxAoI)b6~hqJ zV0f0rJ?KrWYD=PRfjdlfUS|@)S#wBKoZN#%_1!$v07-Z(s!qb;<}W1tj_K5Zu3Hs4 zlHTp{1Xl2@>;^13_X0w=_U6?(*ayU8-w++QG?<13C^jf*Qx$9bLWCH<)fOrOl68N0 z#7_^NFnPbG7_#qVd&P#R(d3X$ zSh$s~iEJ?P6bYvtK|~Kl7*-n~P9-~+=x!R0T&nqoMTk-X-3#eTRMZu&a^K}^gs4Sp z06p-85C+Ij1dq)e_Z8gqPcKMU)D~#Rtw*T1pxa<21nu{{hCG&DMfZ3^wDx^^;E;YH z?MOljY2Mq8z#$&@9Yn(Q0OI`JV`(HRTq^^8dzT~e(ep`Qt9tBCgsVGUNmLmFJyra> zE#`dcLZYfuGoTF+fopRa3>Ho>RFD^`gc8ksd*EEBBbwDaR7iB)y#T81j6ebqy7lb* z8t3W*g*t{65dBs9ccoA|Fs-ao(W&roka&`eBlX1LUVr*ERvRFavSSyb^Q%s%*$8>q z``_p4_1zQ*)g=^MuF4?c{Mj*_N!ne^G(ZyW{!oV9S;$!PDk2VEKzAPkarvY~?Eom} z%4(P(f2GY`+bJ38hVw0)c*6@sS&3(eat6SY9$g;>E)7s7PXvZ~2tAiK{fS64U^mcv zyM36LckS(m(`vP)zT5+#e|S|n7cpk)73}f+01WZVRv^DL3A-C0%(34wqC2f@6mwUy zmm17n-h@409!(;;J?JRRan+aj$eM=T4G_$&Kp>PM@zRNjk_6CKJLf2Bw>xsEV!LH| z*p`7dKwWZa^}3$m2|%wc{f{ApRM+9L}zXGFJezXHd2d6!If39dh>nI+ zU5B!?Ujx#D?E^`;{J{1BCrcF$~B1r?D{+x_~HilL31&b>Q+z3$uGWg_gN=@Zz+jh6NF zLYvOk90G1@z(NjIL(IbqBJJXJN(;QN5)}`< zh{&1N5(U~(oYt{iSmhq;R$$HmakvG@fXjWpP`pkJt-*R=tGJa=sL0cnwspY+Y9`uy z;x8~){4>%>^xw><0!iwd?(aE=h?+57k^s8p>vlRd5&Q>w1*fhs&{}K0gxbFs0fZ#EU*58j2dcsQXU(m|=u5tS{W zXKowl>av-N4a&F}uY|f?e-x5m{~z@xOL%T$ZE(NEAi9hePf+sxVps(j0+&+59`1Fa zjne5mkip%0t1?+;v&wbB5n2z-G(gPx0p$Ro zdn*`d14QZ^iBdn~FUZV$)7c$wnGF~xowHre`Na%}D<2KHW4^)a{2MS%q}YFT*tDxM z$Iet#VoV3IChNv>`e)&2?ga<#D^jDHn`=k1nA~XuMtM6CSko6la1&`q(OGF8Kb(Pr zA6xB)C`A}2w4>n7^@uT`oI98K=&lf zUa(ee5*vhN!)HCQj?bDVWcEL;%NM(B0e%`50&g zB2v0|yi#g#pNiFaIp;xK)*^Y|)q`3tyW%*SH^ZFuK;JEglE46$ARk`BAUsO#4W^8} z4<4KZ^UvLmWBv)T%=;!Hp%Qtd5j&gcf#76Ogp|J@&jlO%53%5zd%)R-NE zpuQTBUDln_k)1+YfRF*|m94Pby%gs*WSPOGENWTbaET5u-RJwUWJfS`Rp`sBWzk-U zP$?^(tVCTrsNjv8;!Tn2YR?8rSTE}=?0w;q4;4oZya>WM8-G+WMz*Riw;e(5b1tQ1M2!jOU>Rj6 zD?VyCM^Bf+dB7NO$(fTuNFPxX*1s2p2G17WUgMRF48rYiTq03zOb&9wX*5Qa3RVJb zfWZ9RNVW2}J7E!1PzbGU?@t!ywO65qt4ENOgB~La9q$c^Di5EGelWYV;)E{MYN%*m z8~dw%H=}pnj<88$X zCqcR~4}K`~A%oEKest;C-+mW@VeAB^CwcEno(3UF?L3SIq4;<;pk=d$y;bm~9s7#_a*Sh+01mra8(Dv;ABk?+HDCl^&(Y(7 zXtoC3s0CU+o zdRCD6S-8jd1)5VegV+Xcq?Z7aOaFohgW-TyPhjcWpzK;_(LYuS=i^M}dnyGcsgz@X za2DpEI%GkCHi}_(qX#qLL0q_Tko4 z_@ym-rve)?;5e~Lz}f>5!)DJ~(X!Eo<}%UEwQs5$B^J_CmxV#kj0 z4T9V>S1we;F|*7x+&;_8J-%lVcD+#ay9VlR1+=TVKoREjsQ0V#p7(J)cLK6QlC3Kj z>XhkyUom|?>#$;j)}}wkmG}=Nj{mTRwDlFOpqrTJ{s;lvKW6^e1qVO5@QcrV-EN0qEV3pJpE%7 z;ej>lC;@z$E>SFr>P4vLrC+hAs_PoI7JAitF|)aG~zKlfE!4Dl%aP8 zlIcg)Cjc$MXIl}s{=OT763ssw*(3vLFYm7@SZIK{6G`)7#mLVLV5&Y}uV}@!>rfGYt@#F**=)z8Z+bB;87Y4tNltgwhL=(J)|n zTJj-?4&n@n3eOFO7FQ3!8O=s^f8o3cTq+QD`J@|4xS~-j(X*XLlR)3^0QyQ%J4wwr zxQkQr0oJzp!x*jF95#!&Dz5USudsi56IS(<&&L39UQyq;-^~J-2e^diwc3p<3oK86>Udl&#tSCKEF5eW-Zcc4fv77{Cy5iI{TV) z&lkukN5ZfJUI4>}jHKe5bDJ5G++MsN;NA>G204L0iI#1gkI{bxMiCL?gwe+Tx?yKe zBr5yhoTPw_C)kcAv7Z)TuDo6OXl5`#NjGRzC_*)nR%tzAZhrQ5c&&7z%B}t3Icp)F z4F1MN0aSnQ+I+QGR{ur$KOn13L4AxTkx&UI2$39i06VNpgB#$bHWPuN7r>ZL8xJ+A zmj(68&&CAKSM|e7bbQea^)Q0YUMUU0G?&xy8*&}f676STs#Rz ziwd3B0WI@}B=I!8Iuz^a0Fw`fcbBPh2I%}?M0(j;6eRoUjXu3Sgjgn<7do{PDIPC~ zYuR{!egP)Rnvf&qHA1BrkkAvZ4nn`O8rSo2O*;_B3qtsuLhpkYp3+SpgB?-6>9wHC zHSX19SqKmc<*Jd>pg!Bz4=TVOeew9H(g77iajo#~`1QK4imwle7xvb$i$@J=Lgnkm zqUyR8jIAExp5^)?-H<`cFcFx|{VuSEUf+UN)-*(Wn#aWlJ$1VQVG_8N zz)T%1`VMpOJXBc6dMQtpY?LHA435hHm(^w>yuU&#o7;l#-T9FogYZx5Zn^{NOlJk~ zF92i@F1xRy8Wuo5MxHa|hH+NV@AdThQeTJK8$92=0%ySsRuTU97ApSom)00HuCxJe z{PqcH(>;a)#0yb9FAAlLC22l=@on>lw@|RW@Z{?`nRMlkC5RKTC_SPASTBEy!C)6X zNvhJtz6JEq)d6U3SQvy#CY-?Rm37osvNq9omA^~ij#5+=>?*h-6BXC4fZ%#b$`8=* z)@Tb=_X>xj1uvH*fWG!>l}=5fWkk^LJ0G{^tk0_npkD71Vx5|eN3~#$C6;J;T6&vp zw|fa3V{0DJ1_;4WoGLYdeR_Q|2gGG9@_Gdtv)pV1EBUbF#k_A|hUutx^&*(#Ar;-s z!#3!R^bNt3u{R!^!ndj*+-C(KUb}Q^53+n~rNC5o_*Q!aTYgL_YKQHRB!KqLFRxP* z9_|RK%&8tWoJNQ8YEIPvK^!+avO(1qU88#fSd*bnUV;=YN24V#?d2iM8)|C5c{GU` zBSyd&Swq6P?HL61)NQKnEK^(#bRU|qkMwEz;gH`4bG||>miM|?2ed3|B?GMAKl1{X%MZ$$gY`sEgqJ3;+6mpef@o7eH_ zaAz(_@MW(oHuV#fwP*>5(_t0xqi#7H%`nbZOv(J4$T|^^AnEx@&So5AWUDIu@BZJg zWW2Bs7kzT2tUHCxk=|Is-3NYC1T<$(-D6~*QhwJ3wGVy*q-4}@@6ZO|inl&OCSM|` z-x%SSMgSK#Q5ZP~NmK33`BPD=kc?aR!uipdoe_dvn{b3RK*W^zMPNVkuHrQ3ds(pY zvx1z@yQ`f4bl@cx7O5k@gEe9b9=tl8`Hr;l-!Fs~a@-Ih+~2|vGfkNYc9X`vyMKe2 z_nv`Ayx?*^aNswkT46ujAaRojv;p#!_&Ifyulkq8>^ZlAmbV{VYTPbCj1>v=H`gWXgDsIPQJ_HC?kwNrXgSR-(M@V;a?-Ec3e4RDn60%J0fYq`U zVa|m^esBEL%N7Zlr4zP}+*y^2L+QxZiK1-xEpW8eFA&i@bMTd~{pg?jw{a(rM|n{>bX4la5CVEWe2boeT2%yNzl9^uGPeX;-(eK@n zf)UwFjmkcUgDxsJ0P*hz&QJdOK>jK(?;o5tzG5aGX#jLB&&9(sX!A2zTW%datO6}N zTHcqQ{(zvtKcSPp!$}Wlb|XFiu^Z_nfaDTC0WlbM8w?*PRk;x8RhVNR3>DxwftJM* zpRAs8_}6`cOF|YDpGGkZJ$bn6Ov=YidK;@iPFtlGAacmsQgVuZ$<`jf;Y_neosHol*ov9{EW6;L}aQt*|Tw@0RIM|jRHgJ z2M0C`4Qkk+0cPO$x|reFc)VwVIm(2!_!Vx%$oN#Oj*3W)V1ycJZHh>iQ$qqKPW1DP zNJ@&2i;PIc|1rR-j$OL+?%6B6Rj+R0SUGfLTzph`L}HXV0l1J*Q&1#E@gEQHOW&CG v$>xzsDNH!t6rGB{AePKO17;9#LR?A;rnQMkG4&idG$l1Ib)>#Y;6(91Zs3Jn literal 0 HcmV?d00001