From cfbbe092d74d05e8174b31b4b3546e23fa03e8d0 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Mon, 15 Apr 2024 11:34:29 +0200 Subject: [PATCH] customization mprovements --- .../customization_background.png | Bin 0 -> 2884 bytes .../res/drawable-hdpi/customization_mix.png | Bin 0 -> 5698 bytes .../customization_background.png | Bin 0 -> 1855 bytes .../res/drawable-mdpi/customization_mix.png | Bin 0 -> 3916 bytes .../customization_background.png | Bin 0 -> 3698 bytes .../res/drawable-xhdpi/customization_mix.png | Bin 0 -> 7220 bytes .../customization_background.png | Bin 0 -> 5455 bytes .../res/drawable-xxhdpi/customization_mix.png | Bin 0 -> 10304 bytes Habitica/res/values/strings.xml | 4 + .../data/implementation/UserRepositoryImpl.kt | 3 +- .../AvatarCustomizationFragment.kt | 120 +++++++++++++----- version.properties | 2 +- 12 files changed, 96 insertions(+), 33 deletions(-) create mode 100644 Habitica/res/drawable-hdpi/customization_background.png create mode 100644 Habitica/res/drawable-hdpi/customization_mix.png create mode 100644 Habitica/res/drawable-mdpi/customization_background.png create mode 100644 Habitica/res/drawable-mdpi/customization_mix.png create mode 100644 Habitica/res/drawable-xhdpi/customization_background.png create mode 100644 Habitica/res/drawable-xhdpi/customization_mix.png create mode 100644 Habitica/res/drawable-xxhdpi/customization_background.png create mode 100644 Habitica/res/drawable-xxhdpi/customization_mix.png diff --git a/Habitica/res/drawable-hdpi/customization_background.png b/Habitica/res/drawable-hdpi/customization_background.png new file mode 100644 index 0000000000000000000000000000000000000000..898b3976f186cbd8ec35e79148dd0227bac3359f GIT binary patch literal 2884 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 literal 0 HcmV?d00001 diff --git a/Habitica/res/drawable-mdpi/customization_background.png b/Habitica/res/drawable-mdpi/customization_background.png new file mode 100644 index 0000000000000000000000000000000000000000..5e7dcae614bb08911df8a99154bc50ef40d60930 GIT binary patch literal 1855 zcmV-F2f+A=P)EZY*ateRlGXy+Ke36Ep{( zZ;Bau`Ro7}vtAK7@t6TcCk7}WxJ>pp`mCT5%?e)^L$93Uxtw?gz>tEM!#?ZKz!@*7 zfCV(fl*xT6=0(r=EHHD(4~fkVFcO`YV&FSF50*%Vc6pPO-LUk5yWhLSUI)6F2^Fe*KU(N9!IMo%PEIM-_9?x*NIFToK_p#zZP`sDt=QQ-)QC9C}bnm ze7qEkNo2M{jb2An3Al9sU)c53v*5KkVX%LJMLyY%9s{6x<*F51*2S5xljs!b=kH#Z zwo}rUAp4;SR}VBTph_9^`=Ajr*&N(nh}BFX$3spgJcvU~mWOnlnXK4mtch>bNp z&`tOa9yc@!<@ckrk*a;jK5n7-WF_S3Ub_?C*tngEp2lN(d%V6=dxJ#N8O425d69)I z$3!Re7M;+xa&3?s^AC%YDrGm(^io~tlgObt8?zoGq>_YgmFrY&QBgmtNXv8jMj+uk zoq}e?lX&<&DdQXdR#qe3JieAkw;HmVYg3KSD-FO`JE)uRMuW1f9>?gFJ#%EeZN;`t_PkycR<81; zrG{p*tVYmHc(;&Z0#Z9Ta{;DpUGUx7H{o2*V8wIRr03wH$sgD`<@6^)tnGU+%C7an zbMM1{w(jC_5`A~zNzjh!iHCkx(~ql*i^*)WL}fgMHWQDjet zBs#I!Q9aVjp~$B@1lboJg?ga7tXarj3PqG0m4pxGn|_f0uX7cx2YgA~Ux2!JAe}3h z1y!OjiMIeAsyK(N)m+@UMUw{`iXiKuL72vMbDS{2i+8{+-*PrnjU}m1Uq08b#lh(d za3nOce3z++B|nMs`TbzI=(Ub(0!_S>{RCsUlf|bT576)3MJs8R74<>4`fK#A-5MgOOwi$SSopHmv>rm0at)rw$4*^U{7 z37{}e3(NU&kr-gxEDnTSDy9}OQiYNU*de8bw;Yo29w7;vk|Ef!Fo|vAQSYZH_d6u< zTR=kvR3V2ql<1`ttS5qzKbMkx-<$VkDx%2SDFgCI>-I09z^7SFQ0Da{vd=DE&#G;L zXS_UKDI`=MMySt5f7?-9dSLeAeDn!badIW0JIvCcxp9CT=9Wcxy|n+bFbx1jEVY~n zkjzTkthjufEQ*@dIAu#E;e*hQQ1rUmBbJPx$3LdD*4y+2V6RX1O#H#Q*u`0Yy zXf1rO@Z#o#AB@WHqa{fl2VHcQPIR5fcB`2QFQKr8ln@rtPl+ioZ~rj tmj0K)i>2RvH3&hGEKv}SQ=ouK{13$Xx+U!V{B-~T002ovPDHLkV1ldPc?|#n literal 0 HcmV?d00001 diff --git a/Habitica/res/drawable-mdpi/customization_mix.png b/Habitica/res/drawable-mdpi/customization_mix.png new file mode 100644 index 0000000000000000000000000000000000000000..0dd5aa4cfe41e2b44f28326cc53af628348c8d21 GIT binary patch literal 3916 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 a6#oa8CrNaNt#m8^0000fiRt+kI?eM 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 Q3jhEB07*qoM6N<$f}{sM{r~^~ literal 0 HcmV?d00001 diff --git a/Habitica/res/drawable-xhdpi/customization_mix.png b/Habitica/res/drawable-xhdpi/customization_mix.png new file mode 100644 index 0000000000000000000000000000000000000000..e2f14931dce6055a9c1afc5371299a8b389db730 GIT binary patch literal 7220 zcmV-49LwX0P)ZV|hiyoDg^RMTN~Ii5h%4QxxuarDDz&{f39hR4T3v;? zf2wlQ0VQp9YHKf-v}vzW4FN8>LrRQVk~B4VQzZu^ZP-Ho5Dwx6jQ{P<%)Q^+T{AQL z=I_q#%$oT~E8DZP6`r2q=IV zB@==oW30^$B&}qSi+#OYe16@*s3?;i^w+4_xdcdD3JW^}K~x^4^AWCRjI~(HAQ$_3 z7ueQuXcra1OJG3+2puV6BrTrV)^T_T1XL7NP%nuJ_I!k7#6ekx zHgJGUeBCx&2Ts1O2Y zSpk|tGJ);jDxuiG@dtv6TAvdL0j`@uW}|>yTLshY^B^5*qQ8fLOo~u_Y80wRE*iZo zC5J=pfdlPtJQsr3^AXS#l0X=szZzD)rdPMXweAQLgBBq*1#<>YgD^U!_ws}+raR+_ z?vna80nWLh=OdsgL`5(NCL$PrU>S@(atBugh}2vISH5%?NG&ybmuMrQ@E`>EmK$kf^W`2+a|KJ|%(UW1qc){nQ~EIM4p&hO0ic8WloQ=*r)I48%qCU=_Kp ziam6nr;(%>P0&FFff;o=a&G^8g}raPc<&>;c2ZXUeeB-VC3{a+qe5s3Ss4YCRG%D$ z`oSc1pfhHtCaLq>>1XE|8$P{Ho9VCES!hS;q1jkgazhBgYE%eKA@l|8i~>mg^Jk&v zl@IN_WN6@cS10%kcAwHBX3`@zUX~<45+KV*1wl^yX!yY)s6c!mg#R5?lu{(A5L&@S z+=vS4A*80E@!7W_^uf5|8 z$H681U<%RRa=#=__vE5RQRQ>gXXuRkpa*qX1U!5{YRt-nnqN#ID#G6Qa2E>+$J*$7 z3KcXq&;5m5b**U#xdaT+QE{InP4D+Zer47P!4IZTb+{HHi&hSOb8xB355R~K$yT!} z@yuVqa4tr&z*~F~JeXBN@PjGTJZC;ETf7oNLKWWJzQ>-Kqw)i&82U(de!~nzhTi@Y zU1duqvQYrYF0&DH^TJcmKKDGFotO)!$L7J=$+>Wj{$2t+7sIR&f?rIbTjocSix%7# zQ68f=xRZ)uNO`Ph?IG^=YIbcD!RCdh3yzPAVI~L^#;I%bnK1B}3wRnyt9T(;HHF%nK7hMFJ_+Bw@2|ir zHljjFStQ+S+SaE+V)!NM6h>yAAtV_Ng*v|!uS@0+75ED@!ZI-2)eaWP+4TcZBIj05 z1bUz_+!!_JsL<-ws8GU*Ii)9CD`aj8J+k->*f{?WaAC}Pr)xJV#2mf^z}_uaduU?h zx*tGAL3?9tv@^Y3Jn=x1ilLKKi39ZYDJf%pegz6Y=iItZeJBmvmX1IN?KJGLtoAZ{ z{CUe+_P5hfLlC7X{SgNbsK^n)swp(TdK|uT+iS3_?()pBEt~%yu2E;!2s;TfUOr&Y zmaBc)kg(!Bj=x}+T$pnNN)X{$*?18iT{6P%nTj>EBbcJ^{!|E@g7FIh`OM+j&NHGTh0Q-1(WA<#@ArK7?CHdN)Y zOjV`_{R8DO$>Jga-2aOspo=~M-W&7-o?LZ=nT;wMsR%Ys1Kgeyz(Of242S$?@oLrI zRcEg9PD^>2T&xHm!Rlmso++fIHFdt=n4JXK!0@KsoO}TG)+#@sH{O!e`U`}}NpJuQ z3mbfPG;7cXH*-?){@}SQ8!j*ebsg59W4Jh6#=S=e(?G3?aj1K4~6rN4k-)4f}+ zbW1>@R0N5~pKgkSO>#*u-GBgoZXEscTuj%)#c6eT7zI!-q>b+l_V{aPV_&5c99S)8 z{e)?IZYBB$Xd30I(z)04st3SBd@TgKQ6Vebd~KBdw3#4luC1<3#T9)P6+<7*2iy+| zb0_C7990hSk3G|brqq6LKsGe2pZUcGj^bAx3y-shWl#Xv$g#&aGJo(n2cyCp3)D4~ z;ZvjB^XTXFbVTr_k6?8M88!rTh^>kMX-H4P{O8_+hG&0oDuN{omqY84yD&@KOhcf9 zyJDlNQArj*7P-38C1ikP&D$^t~MgaoF@V$;hp%_bj++$;<)z^|yt^uqq^q`2ac!^k`li zf!f-lgkU8?guakE$^%*ZzD3S9a_wWOm~F`GsBk_rm3>$hz|8;1jS4of zi_MOjMTqe87jyu$V`n{l*VOffu6#t(SrMQZ8k|Rf*y|guz5YT&i^@L;pSi+4j}UdJ z*$aFl1S^%0PD~->+4t{;r;;Bx&2G{!WOx7ZP2Ksj;7pacy&wci`qXb|176q5{w~`t&rE1$3HU zH+G!&uKNtU80nb#d+x5^@iNMe3J$fb82PuYl1O&b&MZX)q3^BsC-&KSz2_qW+QVid zD5WW+p-re#`vG76X=4J2q$-U-e?iDp^?{3^Z)9{IcoCukJ``++Hywli#d2eRL1`AD zf1tAfnk)W+ERjC?qnYMgB9bWCE@}5%2tr!YUF)aRrVu8`=nqxTL2u;tp0&@b{D8-w zp1WJ?FVGve23*3`2+?R62l@3mpM!%{|A3m4jzY_Y*HQUYwu2R(3W1FVAjf#moU9$%MEaO`_{Z< zfxl3yB^t94BK^!c3c$`Ru^Gn7|CQF)rD5q}e(3~On%2Jb9``x7`~x@e)>$SxcClb? z64^UW|6Wwn(%TY0;EjQQ!N|TCBZh5Fa$oqTOr86 zwX>B@7Y{p8Axw~c=Y{rUNQ7HF%SHyPU^X60RKPuEzFTVICc!3Nhfn{=J9uuQiF>k*s1V!gHNUtPqL&XS zs2`&K0%nJ)Ali$~66--t!iTxXYpdYuwv|i_2k%@DU-*l!u`pyMU}PR?VIrW}cyJNg z_JCOM4unML2Ux88xyR6;e~Uf7#wGSK=}dm46_}B=(h` zG}_8U7DLb4L)>DW$YqShh;{-y z{jkiX7Eeb6y&80E><2EaocY_TDFhbt0R{C#0`A&VR=6f1&XTLq?8kPYz8SvysV~FN zKlVwm#7z=-g^_uL6Y~d#yL_?MD-Tb@r+8Cn?>GdUxx7dIZ#i?CN3JZgQYOJ>kO9?+ zm3#or1$2u7xIPiyI+&$qAzT%>Ibr?a8MY^zc4YV&6#~xo+V=W?8DF{qJR@%&o&Lkk z1<%QnjH7TIERwGs0-f&&%^)i^MOLrld5MLlgjvOb4_8?(o5pFB%)XZk>_eUUA-R{0 z421U1V(Ip6<{^t!hP5!YFTKxJ)4=*1C1!rZxD}y|b-!vgWxaerVf|23{PCw7TOWUVPRrvzZHz-1VH0{}b)rrS z&g7cYf2v?c7n(}nzW-5G9Z#ME=U2k9lM%Q$>fNwlU>-Ho4k-o}q4&pBG+1fs)^&U_ zAAw)*qmME{W;q|g@fW-V1uKK34AmBZCK8SewXdjG-r)HS7)i@V(~b>Cz$=WRN3>CH z28$@7Kzdk;4q3g9FXkg4v3m};Y3zG0XbSzw%1=Z?LfCMA0PlK)nqmDehwX|*XWxVZ zaP@BV8??K2KKS;_@X+uOOD^Vv2`iUhfNy;9CGZNP=n?ItTKu@*v~Omp>Dc!w@(Hp~ zC}b@kpt+tT2}$r7%uHhW3gc>4j40s(WLm%B(9(~?*UopTB5LTY`qVrEJLXY2@ztDV zo_(KVrfeGj;LQ)vs~=)>4%nPnc~AU=H|uJefj#8F@dvjX1r882mC$d%rD*chz4RWp zplvpoM|QyI&>h3OM(;en>&%LgJzMR*-gm25==clGP%Eg0Q|t4IyLMyz8XFq;95(lv zX0*Y?Z@{H!Pyj6NptC~XDNYEpoESupqHZjAqov|!sA*Bu`>5)Ia`}Ln8;JgZUi}bM zFxe81P$z)#gcS_2;!>4*cx4{FAufmh>CN!(cWf>2XY!Q7JgVp!YI@kq2Nc#1?fR^G zRH!u2Zx}e<)ox}gnNcqDDBt+EO#UN$d-_XoP`nSuY8oNEn%^EvWgZoS6f)ME=5B!howK_EG9H&1t_MS=o5H*)DKL9Qeiw-u|PS!S0)=s9h+cA}kSjXWQ zjdo!@mhE1yl+hz>{I7|3!;8{7xF*+e&%wC}a|TXvpL2V69O@sa>bHKsuGd!Ec3xs3 zvU>Vv_Q(ptbs?a?Ktf@h#THTgW6TE}Ro=wMo@t7G_j6Z!OIfbB~r3tL%* z=v8Q*qG@N64x=bjG;}*ehnxfbWpujH!KWeCAuAzPEqU{3e#1Sfu!q5Npcc8`Gtb@hl(Y)FBzI%Q46P+eHTddk7%cW9geMt z$mUPK0h>3z2~M%w__Z_)z5~@Gmv~RPx_Mx+BZBWY3eoo$s$7Wzp#X4~OEJ6OLDb^Q zaOH_J+d2-FEfSRtv3A9%Bi)LLK_ZYiKCn~+%?!Ofgp=qI&*pa`0%WRff!yMQ=!bg8QKe@*{vKJKx2I<|uYiF+e%@NY2gb>eC*Ntvk4%$WTzxYSla{ zw&&-8CQ(>tnMbftCu9@69*?F{0hA=cd>Bt=OTn%AEVu#q^t2QOL5k#$;fCR2IGiZP@7T8PV4tks#fPDc9+j%` zSAB2|YF_=2MvBHv_nkm+(PTeO(y6F@mUCu7(#~rfjsPk8MeTu1W_P}E=farS$ReEc zBRQX?Pw#>liWRPeW4QDER9cL(E=aMunT+LxX%V)qJsg+9!cHfGkf;Ny-PRUC^XPjQ zy5W_k4%Zq#g3CB!&mTT{*;3=rBV)OX&t|Gs)QDgQha*6N0F>k^Mfv+26B-2>=0`zt z?_~gNIEcLco2@|2qcgn!!@@y7OawkGcd4im!3u7T06cI+qW(a) zW=Bm!a3L>IHeT(U2d;ZWUki4{Ku4{8Jo89zZvrb6+xUSwvh;ls*gqTREGrx{b@7`Q zFw^5|^)A}zVm4l8NdQXp=2`QccZ~g;EqQMQZ*xL3^vom7@?yarE)`>i8=>(laV`Y( z(pk?VHv`EORTJX|R0IQh>jiPJEdV9dG43Xzsy^EN-p{TjOMBucI17P=t0N#4u}u@q zY);r-tWXhLA;ZW#!p4syM|I+o-dd$*R8-?v;#de|(~&sXSe2lZVD?#-tc!q#+IChE zVd#erGt;?7X>RAHr;`v0b3>ZIoPPNL&X=X8Oa$~Z#t|V@js8V9ScIBKN9i@A+T%R) z2uBGNNHL9{CieDAvb3+#8ov@>Ik--twls~#$O8^unxwIs1lA9QLXh}j36?02(d@Hk zm2I{Yr?%0UP1&T$vR(2(Px4YSDbJ(WTjEdL>h^!tOWA#`lrq25J0ChOjE+u*!rD_bt* zvfGE2(&AnfeCyx6cSe5ah&< ziio0coNOhQYnx(gpL>{qfY*r>Jeggc`l!<|@@%5wg`npjd?og4=(y`W-PfTo&c4?I zBX2G)sW9jxK_fl~oCrhD;YFxOcJ~i=^@0W1q6b3t!-Pm}L=fgmqWn5khxV6qVv*nR z^_*oha$B=^;NnMN7}hp{|0*~unPQ6Wls&O4(I30uZuJrf1UkfRw{VbBDaKqEptVVKzYw#vT)^eLv+D5Ch? zeq_Q0WFka>Q^8<$3nMLKq!#v6e+r%tXOm8_f{qj`>L4>O3=8*NfD(ZBEs9xS5nu;3 zh49#rQW!XSpN3T1bV90h#0Xu}6(gkO}Od{!-xl7C~hT0av#sg|^Yf z(MHpko+r()r{+`etEv@-=b>*0S_o2zI+~ol^DyFrjZQCWWMl?uX?$JZ%)0Q=d+dSK)izR7X&y|c`8!%Z z`OSkY8g=gdW;pTYtt`RkvM}0k&a&V3f2b5HdqmJFbH)aCX>wf8$Eq2mW!~YBbj>0=EYpc%;c@<1URDN=PVmd zO~e)6Ui{ZNP}N0~VV|@n1YumFBf%)Nyr`d}qT$UR5Tqn^)+03LAEk#h3l*zz63#_F zSek*ocZT3(2sZ=y5E|aCf#%b7aQlDqmr;~hs5QU|vtrJ&EQWgYN)dz!2^Rd~A~SO) z?yQ5WYZ_pJCdtzC)E^!Ffu>ilG6A3%bpIFIf~qU7IK+N8$^hG4jrt0yf`6{P6@D3> zr#gOZ$rOOW6zHJb!a1{IswQHqxufVXRL9YPt$!{I9EQWaX z&9Jv-5fuY}x0zdCY=+x^&KVI5)>R5H$M>sYTLnuI?Cdau4ZrTK38;B@%7zF+#!J!b zENpxBee(*G--PDCLk+9xNU%g#1jyXebvpk#@DGY%)(8P%oAG6Lw0E}%4d?1I5tw9d zW#E=Vpu?*NnnB;FyA8H9+(~@_^W_*D&+*qK3jBlOm{meR*p{+ls6D%-Z1JE^AZOC% zA^CO!v46!`Nu}H%Kq}R!*F856dMWbQcFjId%hLnK8Je)^bZHsr^Rr? z2tf;5{UVcz&_q$GF`I>x0AABx&`QS!wR94 zn5<0%m)fpTL0p2drRKBVa3uKH_ZP8b8V>>_-hX^k4+Ip&telVFHMzBka8vCF@A-L& z2KJbomxhnp#+We1XtFF*e?5%b{8k+emDa;znl~^it&l{)^97h^1Hp(;BFrY<^O%~K zE$|CXgiPy-5X_szgR*N^2!v2Vatn3ggqaAqj9+)2sZ;_Xlo+#BuALBwzdTdjN5DBLnE*A1f>5d31VShy+2!G-C=ui*baEN`V1h3b>IuT6r6CZ4N908z2(Vd} zWfVn3bISDuU$8c5$q9tu6WIEswY4)5reJB7^78)>&J8%VEeNLo0000cp z_jfV!&CGYsyO_muo@h;VMLcW(HWCsNp0bjhHWCst;B_B^iSau76hc6+3zoZ*krxsY zgXsSbWchSH%hy9>FKtC2QuP$|(QAQbF9VW6LaIx|d9*@DLL%K&mXp!-M?T9nai`V` z9O&sV@{U$cDHWB(W zQd5~cR&g2RVWI6i3P4T6c_&PZs5dAkxR6@}zC4+PIl+=Jw@C{cGCj6n<2>l1zep0^$UZlX2rvd=Egm7*^x zR7?XG^0gSq!V9=P%iIqk&o7~W<6t>xx(>9oDJL3>t#yC?tGJD8L?_v>0o0o)4FUVc zG?YFo&;RPKN8ucPOF&mLsw-8J(WUV2uEYE~6Q?cV8+QCfz`u=~eATSsi+O|_!ve6S zK<}AX1WY^j$KnT+XOAh+TN1V5U_~{7^Ni%$Hu+yNLX?RJsVE^XBw( z%qJ|=ber$qaQ(;ta%C5S;3Yj^ujyX zNl$5*)+uSs6~wK}!JtsxtgbRDXzU&if2fhlK4(A}5B_acV zB;l!6ULkZ%!2|29fXIT$>M}u5{eG90(Vypxq6f;757nVGsT|NvZ;CLw1aWLun>R0k zRk+f#>Pc9lj1sG0rI7R~-n{aEhIl<^+?qN%4FhAXNx4;?*UwR~@vWG9E~{K|dI0v4 zB)1+eWEfrB`m~lR#Zbq&P4#xR6entM-tlgK6KglgPXC({V)pWc`IaHx zXSMQ-Zx|7LLeg2b7Hzd%#-JO)81DW8n781fs*Y=wkBLaMuFAF-7G+)@(L4USrZFjA z7yX;KCrj*j$IeRN-NXrrS^#J~^6aa_{(j)BOk=nD`N?Um+^}=W{=uH6ixLaTA8iEF z&jEF)k1837($d(mgiVQgdLtPL#gE{=WuI@y`{|Y1+gFxLc(z2D#UnTUF;@ca`AVTE zCWo8#t;IHc^mr2(t7*!iRZmdX{Ly5EZHU6gPO%^@&yq*iJE?4#4`|!O(!XjH^?tSG7t~QKI7>b$RJKFbS%_E!A;n(3U`GlXMflMjrJ%6Cw!a3i z;1|1iiJMMuE=@O_({^S-wH7jSZ2&$(-Xsawdxc$DXG|;irJl5Igufjvz>ysn$|RIV zP4bWsNJnIiAt9IJiREsqbcRj2^vY0!x8|aPJp$B@ov?e{T-;ofu8E$I=iTEwmKqTv z2MG`Jiy591KPkl|OKX&pNui;!7(+hH(h5XF{(ItXnPEN={cS*zn(`pHsrTg;pijP@ zs)1#@(;jy=*0;b&%hZ5Po?<8Mq*aDdSgcBN3Uz6!>e#APjY=F&6MuG;RX?0^MKX#X z6uNU1wAp}%nR5#_8LBZP>lQgK<4pjm8&&602?^;V)Na1aQ_#~kM8kr8N{oUSHcNV> zZ6)kB43|y4c!nu`CXO^{cPr zGeVF(R=SVMt467N9&?%bw|1B1PcDK57g%kBru9|^|Eq(e=`J>q?%Z{@CWxZC&8<@n zzdsqMKEyBdbb-`veUzv}X8TvP<*%q|1}_~5VWQsxD~bbvJ70Jrr`T}pcu!vFg)djw zSGwIIzR2G7Y!gzuWLzW0GVZ?>sRYZIF#R$FV{qq`6~q z{MB{o)$Usfo&ay$V#(QZ@NwGL;F_GL=8g_399NA%mI*Jubt!p%7Soh`zjvblrcW%G z!+P}`*^OAvE@%mwV?)oyHZLJLuav}&N(xB+8b4mnF5>PnljkL@L5cjeCfY@bxE(YyTHbExVuW@xyy@aTAq_!%;dr7J1tJ8|`97g7-h(l;Zf`=kNochAUo9jh9qH-{~Q7WfJss z9R5sZ4Mj=e`}!}bKuCvL1x((q572TJK&(4iMKHX0q6c z1yq+*ejFRGuyX%bz!3gsyI73dj;RlJ_W;#k&laqp*h z`gO3%j!p0jn4x@duX_rA1aG37IGLbb{YxbhUJo`Ar8U8(a^mvMwRvW#V`|^Mu-I&) zdbimE^QN%xn7?ZgT6D*V#@KLKhD%mwX{ZHkf48wRo5ngOQ7pZOJKyc zF@fS~Hsk@4FdP^YH}QM@ZxpSMr*SFC_3T9KgGPA@;p#}0U+J0pB_rY25vcUnH`^A< ze;(t`{4q5Yf@$AA{JfXcTBVOH^c#Oev)UAezs(N%W$akS*%fPUkkTMbIw(e(#gB^I z|8IE@`HacbYFE^+SK?z`N4b-g2O9haDds!VS^(4U$f0SvGw{xW?Zs}j7=5v-^Zv3|L!S+Oited<=@M(mYdc!rM#i%x(qEh=k`$xNh4zsrqSQ0snORYCF4V|#XPmKRuw_t_J5I;a3 z<9x=lVH7q2>bBYo?h!vj#cOdhb^u7UN?;>SMjdL}a9HWk3B9*7hF;WWZ~2 zU*{ximTj~g9x=Icx%Uda1x1N-)c#>yi`Mu`y6Elh52#oi#E$iDhwbsfJwQx`iXPYZ z!ttdU>ij2!Q4Hl}XWLqaRmdiaMInBYgFfdMr!W<(0s&g};K-ZSMahd8;xH-pFzp2S zrLk!+8XP{9q>7GwWRO`DTuu5M3CPT$@AmAJtr-Ppm=HFWt<~UJ@5~EP=jC}c>S;&( ztIWO3S-%itPbE&!tDkv1vLCq#e)*IbU)=KXAGQY_=G6VZH!f?=3uA;&gsy+J?j=u8 z0JC2_uDXBD?a-iA%n)&QbB=Wc*Zj0b4}%+W(&e8(y)+eN;Gd`I?iJ^ZL-zKW8ND&CB5a8diTaX``B(6*3I{`?T)1SxfcE!ZgxDEZ9<5hj;mcNzxb$w|Iy}5%#u8 z60*3wi(2vVU9%1mn6uFf$T#HAOkL6VHa_#%?5HLa`pa0>CK(bZv7jBPz6QTC) z7T)rbD-@5+{9+`tW#FeaoUq&Pwd^V89QKxb{^ROJQ@peovOeMy9==Hms|4Vf*_31r z69xNh5}vO|aW|v0T{*%Nb7?Moul4OEr>Lp^%%AaQ64$L#{@z6GL2#H<@uh5z8R9 zmWhZIL3<9W^Kn?>Vwr-l(}y5r+Ry7u8JZ3p$b)WfX0B9hQ{zT-fNvCxMt-uq6MPi0 zsrV-j9OzNFb6XJ{w-U$h`$GJZJ5pSmBVPUFZK1})HUp^P$BPt9txVh=>Tv9IU-45y zkzYGvK!bXUO-Wu~-A4tmvK>$9p*itapiXq-0=$Y!!T|dR(qeopPup6?lw4Ks$Mckh zfrD%Vrr*2f#7krgWatM z%7I0-In1bFN@gqs>!*=xUj3-H#^;C`eO+5P>8l9NJ-$(n0(pq5xTG$W@&cK$v2#I| zJLV&D!Na98mS|N=IH%7N^F@QU(4M0v#1L1Uu&^evYP6RI0#UjmR%r=z9|qz?_0K%r zei!7w7WSoiv|L{c7+Xc@q3(z3eeem-lk9oElCO9Vc~9un>1Xw+)jt%<2dH1}BY4jW zb>$bYb^E!HVaU`~AFl36N@QN?^(orYko&OXlx-Qu0Ba9rHpX~g{vx?`CFa~yON}q@ ze1w(zb71y0e)UYP8w_KlYyzDpGCu73* z48p6ESyi`>x!Y~DEP6);=YipLre$A1n&h7&@Ty7cb=>AR=m~QM3dL6DnIR}Ady0&x zS6hd({j9bM$8$#Q*oi~#%BI@1TeQ9X9<3ScLVYspcyjR6`)r4QJ65@@tWOT~TvTwI zt1x16Ltc5rEi`+60~Si4r2LzP>5hHA9of*HiYgGPD4Yz<9@u962Yo*K8$_Ob=E0wt zFm0-hZ$;EcCXj{4xPML{q~I1sqSH=IuBuT~jgsBSfjssSDfXNrebTc_onMENP;kmn z49V;3j0;Zng14yI9S)x{`+x44nwdH1hJr`(d)xXS0Z|j;EhXr^pB>AJdL6zo70B>y zTru-k6?Sl9BH@&&!7|4&6G;4=*a;Jp*>mHz!dhc$ z;yC*#^Hb_0ep0l`V}fh&y~_WiESMqm8$*lNQSoOv_))k6DMlr7ECo#~DdvL>xk$-3 zUr8@8Oo#{zE`n5$sm$%hu49{%e20#isMP>-=)GSiOvr+SG~u-H1p&7E_3^r)K-o@) zPI}U$TG(+!Gc$vn#A`UhLYnFmxmP}1@_F})iYMYkz{UYf-q%Y~05Hn;l@AHeG#xM* ze!ivwHp&(-{2xz3ps%gic>j-w!;B>*E2-JKJfr|WQ5%u1E5ioZ_^#>X>~^Kzx@tCX z2Lt-__3-yBH$&RkOTMwQ^eBw+e}%?cub^~2mFL#Z>Y44~zo}+(Cg- z)^{1pfH$Pv;jr=TvnM~cmew)f9QJ*gGHW(LZkP(9iy1%I-Ske1=8#;Qa;w2R_)>|5 z;8oi&eg`Muc1wBrEm>6QG$TTMZ3yVPu%6r3LQiU8mi$5_>6?$f6-{D&ghih=e@TBb zD}P(vbw*sm@bT5<9Dq+(A1+cgq#qaqZo^4Dvx##|+K0c~QbkSd&DwF6e%hLGUEEYx zW|rkqO0&WAh=*T<+%R9KixX36)AVKqT>qhyey@jbBgk#da_}%H1Hvlg0}7MRmk+#dIAavOfTI-qW?6pWBP-ggFa0CXn5 zBEZ{jF>1aJv;J}y%>?c7S>XKkyHuD8Lp9UB(7dLW<<%<{XS{kdh2j#sNQPm2zPPGm z?N-p4@4S6jYOcVdTF8&b(ZR>&`8AVKLF~Fc0<9kNSka7A<*H5A z#gNo)Qm#q>_J9G&9rvzu)^K5CR^3KoNW~0urBojK)DA5Cn=4h><`b z2m?Zl1OkCC5Mm?{2z-GMBY{BR3xpU61Oi_W0x_c5>BmSG1Oh>z2)q~(O7=`U2J(Io z2n2y5@DT7{OAP@)ymI#GqB)H4BzI-%MzCYeHo=p#J74b7c zAP`~{U{cA0ap^`Z1%#}jlqT6fsgQo7^#f`(Zb4j5Vya-SEQH= zCgtQ^6zH>HpA3yfHVR8g;1~Rn+E*C^qIs&7@gQ!0e-GH+`SP-!0HB z>+TvnLkV!Xm{y?_dbV{Q=?8(JhWI9ceYbE?JHTwGpwaE`?=43~!m~kf?C0-e zf$g0j5YzyX+V>&ombq;WX+c5Wnm+ZlLm&`%j1VIqfo>Ve7Y;H-Xa|eXrYO+nh;m;V znE(r9S(dFsWZ48>69s`UP~5Uy!IE1h#~We%EAt_@IcjXk{tCYTTz(QxJ}G!K2kZ7mT3yZ4>kEcVX{JVWeF zt08vWGPHn3pL-Ar_qT9AN6JpX%>K9e1&KoMzSEm`gFxT`VsBcFC>JqW5u)7cHn{Nz zUoa&^h$3LW^C0*6%v#%(>KaIbK;QvlZ(0qoQ^bgF8CpabsI~$M7=904Si1jUs$vp= zK;RZ4fbAh=w~Tt^mT7@8rdZ~N65Qqh1KJo^-v|PMiwH6D2s_y_bjxmSO<1;us%bbk z!m?|lW}cG7mJt!qE~51F;kXtG$0HFK{_{6B4THco!4F`+evYagKe2wbZ+N9rMd)!B_ZZ5z=7+^l zJM#!JauKhyWqL^2NoYOrE<`>Z0~^#$L8S7xD_XKiu*NU}GAyhoeuSIm5`J^bS`KEE zB1oImMf_-c=g}9~-wsO}>?A_kDbRLyxliR~fbPygVLcfT0?X((Bhxc#Bzt20sy3(* zVR6f}2y;PXsX_T5c!RK>DhRw7J@(qUKK8+%G9Ziq-Sf-!U+}!qG(>J$hQ&zsFwxPR za}>t-QE8m7D|4ebscY*=>`ikBJ0m~*(!J&CS;2MABL40_Wir?!8vSjREY4&n~=pV}Pw_z|Y+apENegVMGavR`hHhQgFg z5MpG5u()LrDVELW@*C5`)33Uz_JeT}iJf706Kc;5a{Q>c>ZyTUNN5TIN|*-X2{E!r zSlqJs%(<{+!9x(0q8nfQ>C7RubFe>+z3Go>eUBiGoT(n z@_qeL$t8P<-lRR0n73v(v|VCi^tN(;Nz-+BjQtxKE5sC0LUB5OYpx@YjE&HvNkG4l5(S+LL5+S?4^OIK9H?%?gD8qu;%fKO& zHVj#Moc)K}DOHLGGnn!wl(N(}$ws5m%zx3a#87ye#+%}klX4Oyx~6pTNPgf3vMs-N#rc_C4yf&JDdo&D%I zX+5z(c3Thw*+Ps|us13u@YlA2|iC@V2un&IwR_FgB!iA-Mwz(UX%!%jgv* zMwi{2+KlfNe9u&ZmT~KW_YBugF*hxcpX(6Jz;*^Z1M=}|+P7jz+pK3KvY!Gk=$75{ zr)M1zB1CVFwIVb`*0g@u$L=6nP~Z}1h1Ob#P=J20>Q#LqT3!IyG*J{HWR2}{EV`&& zxG)=w7b#r`3_(B}S9Ox@9xi)z9MWp^V1yavhK=|MDlZ zc4Lf4>$%Z!!($cbzj3u0t+>VS0TSm&ept=jP;;&?E$m>}@JITb|* zGh`cPf2b5M>VjgE%oT-4jaAHA`a5?%LTZ*#G-JFKn2Gx#2q<+cMs_AK8U{I4xcAnG z=3`D~%Tiqf-CBKQOmutLGaN4@E`EQ=p?Pm3QBl6mnbtwZ1-coC3wEVXJ-`0;mM zPJx@rGU4B7F}q-(@L(&)su@@Lo`?d3)=;aC^|P9Z(fNqufo!eVVvIwKAfFHHh>^M! zqoP~pY_`mZ8M$$|cPtB6TBd5B-6F>RlbfcD{6L{etsU&u>LV+~k5v1}Fn+Z6`5Vl_ zA}_I^cY>Xp$wzYC;2;&5GwzGPHYWU)B7$OcHP@niE#E3Z@j?;8+uWE*OB1c3HB4ky z<@wHC%-%`wN5Dz2E=`T-g&Vrh!+4SCO$!KKx@BrSeB}eUl31(Ux7%B`c>ap?A01x0 zTkUZ>ePl2G^d22Af#UQqwY#EOHSoJ_B+%t1_idiwwYMn<5IcDK# z2DFv<5qON*%$XCd7+j!B_S9rCKGbS5D2>n6iYZwDYtgL6i)09HCJm_zG4di?#skKU z>}1PuEJ3C1{%9-j}5x6Q|gG)8_PIQ9cYR<%LZD1IbS z3Fn3nfy z`rb(@jge--Y*|};&a&p_nHjam*~h8aL27UrC39Bn@#6x8=z9;G z(6&U&AN;a=G=omRwb5ey2haOrsYd9ZP5^vkqUeg@ai?p9@O2#co@(_)SaEF}FM`7m za6)Mrp-W)3hQ(^OOp61bJOZy?T@F^L%$EJW`>Q_JfO9$(*4zih`ueqxM~9$H7>W&AKCu7pb{v*q3Gmd%p)ZrC%m=mJt)8ek+?E z@B@I>kW)g0Zdu>ENvlGHMT{Mln>zl*|7ac7Z`&}49~B}Saput7^XVSDo%TkU&79$d zz|a~Ukz8+3wG76N+N@hgTJ=R7@uF-PcG!hVjEdd%<~Kd~$t^>Qvy7*2>L|5sXr$w;|`r+?huUYdcCJxN}Ei7fuKJxk7c6GkkDq;d0z^5igvCIv_=gNc(fd?=l zLTk4Vpfui>y-y!}V^<$IL@30l6eQ)wZ*G|ygk_+##(o&ZkAO%!+#LI%h2xnsEk;T4 z=4ZNcrfQci%(_qYI7hK#Htp5QYYM4p#|XRx4iR`UVlF`nOa@7vDq=*?E&EaCOO{52 zVzvxZ_Zkml+lFQg$S8gU<4vB5k!zVVEiMP(t&3#@oB?gMcoC-aIovcaTR`HR$1D+e zF=8&k4xaP;nk~bQd(dv%XxD4o!1xh%)lYkX9qav>`Y?Srz|}xz$HsDH&h+>^0B>Ck zWN)6}a@pRx_kn50c-n%!T_Tz>Ag=gPr63W= z5-NMT$PYKPg30Dr+ZTnA;7nE>dl;baViNXVTn{Hk7AqIBN-$njJmfVS;nnO%ne~>ep>l6oOH*qSexZI2wry z$$}BZLQ(@KIK<9nq2=HOnDw9DWVgRlW?dOUDGBU|Sv3MHMyYo7w0AY!V@5TwlP#+r z`GJ)B$W&uMT=63h$9`zxdFD(Dzo+*rKq2aQb^FLz41kG_W&m0;w}ajlJkOkI;nyBD4bW9{kWj^okWdd- zYqsbTIFT*e@$&K>%Y9@lexzN0L_7;lt6{dTYxyG+j<(xOVG;s`o~vdS=A!L{kP%oh z$`i@(LwRko14m`KqPW z-i8DyW`vk=)eOkEJ#j&UEax#x1lKak8H>@?$rf%=aeCwj!qZ2l8$ZIa9{~GtiXS0p zagmMKeGfI__lohV1kbs0yb*3~EuK2C;!*hSliyM5Y3dyZT($E1!h0y}nSKZyn~4>y zOG_2qor72vrW-`XjiE+CY;?=^eYn<=HB=%?V-eN$KgbWidA$dyq-6zVW6@~Gx6|HL zOj~7J*FYb04-73M6r!8k9#Xzmf~%TdeB*z?BY%GZ907-!t@GiaH66xo$KZSaev9(e z0?M*Zwed1uvHavNY(siM`3DoH_ty3HfkOm6W@PwBIehsc-N)^?Wfj=!Bh!l?1(DI` z9-Jmb2v!+?|MBhc^Dq2kaD;|n)EHG_(N)9c3OlvtTzSd+UA;Z;b@jF>HwT3X3A7jy zV!S8n?a{f+@|ixG!O4*yC9L(4K{0-`=lPp`5E6{q7=FgY$dNcw0|XLYS4~NVu*@nG zp=IflTl#{$ppl0_ixKahsC^%HOz8)*n=R9N%+4Gl787~_{EjSTcus3N_K8xor#D32 zkvP(9pAJ|vVAb*~Tv;^=@-kejkhT1-G@bSx*aM+a-NR;unJ2n_koGp5_HwD=c@Ub{)f*@ z90^_SpJjdvE`1W*QUP99t+Z&<9%>UBd9X6Y(Z*{9-c3Vrt`U)`sa`1_u(#~q*$cO7 z?ISC_u4WrL^ZB=?Pkk*^&5Q`f#Yk~oxG4(vx3Emx3PZQ;-yQ$4vI<-aOgvz`@3D0k zVB6PUhoIt>tM=f@U4|tvTCa^+Gc!-H^ID;32PyS)IaVHzBR^Ix>jdmAv(rbWH^(~2 zpunQgg30PzoLo3_-+A2$hGn-+Ylqn3%d74r9!|ft$ZEZgFW`06B9TZE?4VMt$oDi0 z1&uadD>S`n25}s2Do1{l4_WUc(~lno8AXr^5e&Fz%sfwtBmLP~UAIjuj)Ymz%DOQW zqIz)EWRPqPy~lbW_F+en;JtWcnL6ymnj$cXo!1J5n^vZj?U}a5nV0+KCNlTWTbfXN zOd@2r);=<$*JVNWjbYgMsYdB%$H2bn*v721q`?S4XutFFu zK(OGpVH~O9oOZza#%p7m1*-Mps!^HxzbMuwp`2&L8$YTZ`GMHlXU|@@%0kF0g_1Sw zwD%HpMN1v!88gpAL7H*kJ=Hi8ij+}Vz^_gvAjoX!;wtz|qDu@l1`8T7W2W4&rpQ4; zJ6z464hSuxboI!OGIr(=DHcK@*T&qoj$%)d`fG$06kg`Gu~Zl}omDBfk(Avw{M!6~ zjAxkFiK_-uG?s!IBGy}5#BiQ8(3G8h_FD0y@@u2pRxdq8YV@Dl(qqP5E`x*V(QQK^ zQiN$_!tgnDEg3u;Rm%j?ReP(j z9DbgA3Vwh5-@r)wBA%zz+Eo+lt?l4OA6failli>qI*fV)-L_I3X$V{-D6U$i0DXV* z+wimeQ*ed0!Q?7F%dXb0nwx}Pj1X7$*@N=SGh8AmxD!X(XeIs6i=SOJEdi<|zig&% zy;Yf-yJ{}tni$a|Pwk+CPmUCCPt|n!pdhP%dx_TYa5tqd1Nwv=1EZO{O&F$!IoktF8?6XIPnLD95 z;A~fFBoWO=+9`o}AyPPmRui}cZsI5uhu^n@agZ>>;$lN`Oxmd>rhdat8;Ks@`_?ff zJLMI21*n?%pPbg6kXd2~-CppRpo)>|f0~I=&3oaD`pB5&w0qyl%{7}XR3So1umILi z1xl2<2Korc#t~k;=v8xCfGTM@dP!-MF#>DZye=JaTa4-=fL)25_>r5S2;m4_CPZ9g zbhW_xDO^8|vz8zL6pKWa^uOM?iYyjU@>JEkl~pUpfWANRZ6ywbF(9Xf2;t4Df!(np zJ|wtvJ8gjVM=XBSs}(=O`XkUz={ri<5-L#Z0;EC$hrV@p9!>S1dfKridu~x`mq{_J zwMQAVDwB2=3sYQEW$8jbuN06nD=NvXDBTN1IjiP`tLCN!q(wQaX5^|#QY3Ui?7DN) zD$$D{v0(NxH(edO?ifFjKnM~qJc~Q+xN5Z!ph}c6z06f>IHSLKv=(D&G^RM3o(8E! zU0OzEu>Od}kIRt=}<^Bi{fH<<|$DotVFj30bRA<*>Z+Et5$0PLSh$g zK*R7=h@HF61SxO)1R{AFFH*oMjs$j0J>=Ya>$(;r#q?iyWNY>OY&VMYyceOnFxTc_ z>dQwvf)do$gJm)g5vt!0#p9~^MSx=Gv&;&*#wS2`$zZ4fJO-yYE|Ub)`-eFwM7 z*0q~f2J2p=XgaM;Nq`rf%?hB%rI{??a|Ci3}wqVib2mBn_3+|Te>b=3kc zKzG24Wx57+Ms6d-$R!*XAp%1zzI9yL>PiY(7G%d**W+NKaL`Vi0gErC8x1e9?~w%k z+NWWb7#NbHkv(o%V%?nsyNz76asec5io#(2w*xOg6)3%aVVsdA#K>WA3V@W8cj**X znxiN}JGDf_WSx#_>&T9%x>fU3%BmeRI&bdwnegt?RZt61fTEe3EDm&yYYYl6VV$kZ~fj3KtKM%VnXkn z$&NX2YwH8x6*&3?x92)7Kqayi4@^<_v@wAx0K)T!b(dz$}RLDQgx41~i$qfH9<`?uq%lZWcxnBA~m$ zVVEHGF+l>S1PO~FnVGFCMp&~G{qz>(mfZtRg5MVfD0Y6tH33pCN-`Vjv2O^bmM}AG=@|JT{+#4U|CS%*kFa3InZB8m}_K{RC!h zLD~JLTyvKyaHeMtCmn!6oXjYzRu-(Lp-&+4>1`)!fz&7p5Q}w%H8pP+Ax50A;47|h z?gwWWVyXCH3Fu+3s+M^%7(S;P*DzW0q&r!Ymu>7dja)T!(XM}Y%@kLyEI_9E!OVlB zPxfOAix41VgcxyR_#w52Z^Wr&9ig>RJr4=DvVuZu$>vuqO-8KM>so=Q$j(6&aUxVcUYJ=Js)aZe zMMZ8Wk~B-E@3FdD=C~5DLBfPTSkM%j2ra@kYfO5(4C3i0bfsvsf6mU#r)( zf)nu~n<)KWwG=0_FoD3|S3Ae4w%xUDU4yv2*6R&4St5}`OsMw@0dfYGO>>}qfl#~( z_JJvC^}6Pf3V=iSYe_r%u(eZ=ddN))Kj^*}Ct8SXWtlD%BqOW0yhyVHEF$M~EUOmt zLX5H)w8sj0EFSGYRln=Y-GFFp@-U0(%^$UTT`RD7QNLq7XYMe}GIi`$I9!OuhW(N* zHq$d_cM$@Qt7eg+0Lf%O$diZau^7=SqN)XoX0cMxSgY5y^fJoW3|$s47=aIKx6zbY zO%yFB9L8U?oO~co*fYoeFSr3UX>_i#2%&4>uvM3bSz_IsmKYy(UJYFfiUI6_Cw7+# z6wL>cZ4@-t>UGUfs=B^lbY5TYD=>HVC|vru4bGfhpiCNk`~7>tC)7-wN(&o#MIu8B zIm^}ACNp`{5du_GL~7pvp8BG>vv0u<{%}zBvGYuj-u_@-@vDEtNm=^HOuplCgEZu} zIGGU%EDYUuYEw5@1lLRvP&WT2xSk*c$TtWvGJq#u)bYs2@Zt-<1Rm;DoS3_o2JY># z_Nuc>)>t3Ai!S1Hi>%xaW};j{;66f(4CwA+DQc>pqTc?E*I+|e2CPsiP8f4?V*#NB zP@IO@&wV%&f#E-QVEDVyCf_O?sm@kjw`(9--oqy2$X*eI_ARc7QAI%`cwM0A6lUT@ zOBV3Abm>tPr8t~EyD)U(#5*pwL{0X|3u=c;V`o(g8a*mdbdv2X{vd;NQ12WZ{QjeV z`&Zx=C{C|`wiJ&3=3!|3Xab}$8GL|caq_x4TM!)Fnt`pldD4rTASdBz!ZZ^vGRr7w zg1?BZga65HH`#rp<(=D#D7C&h2F>igPcS7;CaSZ6N~EI}JHiCs84nv!)y$TiLAKqSx|%5~BnQ2q)O3?b*Dnh)uQ_5U0l@5i(RQ zPA00efynfrQ^VK<{zlBe)@P~F33J+Rfs=ej;_$~zgw8~k=$_Z~(IohoxH92D5hto5 zPEQY~)(-CEtj9)*e6|Gph1|m`v zM#r+sZEXA&Oy=ak#_eaj{(p2O>}`B2uNOgxfY! z@4PNqH8b8cb`4t^XQ&=WVZvMX=G9t?krf=9oh|Su5(splhF9TBpO}x!qf3VF*gu=` z2d0GxX?fS!MVrV?zy}|lh0m^L;QHv*Y3|wWaSlOicE$yD3bdxStsU$EK`0THkq(4P z!<6W6M>}!y0eJ3f{F!I7E?G4(mPKp)&^UOF;)A#A%mONdZrhyrd?k*=6Fchb{lCiB zV(ZF0c>9BU;p*ozpq5YqJD9sB`p80v5F;Jr2n-X08bhp*#t*Aeir=bBR?VCvpMzD( zfovX@EXcy#Ql{{+t_#WyxjHhV*5VYGqEWPt`alpWgc#|7#deta0fUUsftTB1XYVVj zkD1Am8G%;OJ->Esm)8^)YqYnZKvj#=rH|uq=IlbnW%XjF6QzW!U{Vk)gcuouyRP)x z7w`jk;N=eHu1y`2{l8;hguM;_f^%aP9$U{jd>cu$yTj zAbQn8h+AT$7H0`;_Jd{Ab`naGJm;SOtJ!ehr&r+GrrD62WAE3C9s2kF>q%yzcLrOXWyh5veg8>E-Ap!fRA%CYE}1hd|0hB&*;8E%Ef zYld}OSsaQnO zYy7o7C`9Sgo6^lZyGbO57Dj^iIb~6jTO_!>q8VGGa{rwU?_cRx)34hVP#@s4-=)`gozUGJRv7|Eix1KHr=Ou zHKLWnWy5`OAP6O{#f-?7zs6dS&{WG}kzJ~5pxeZx!aJb5g)JQAHVzc0iA9Z59*=#V zvokm?L-P^CA@(Rr+twa2EaY?objkKM-lteZJfOSA6F-s(83I8l5$zx*KzEH&`=cyS zbTBhkzS*4Mn56}>wPgJmLP){5#pPpr87~x|jja!J3lV~GBMwBoD8vXcG6^mw#DF&V z0~Df->0$m4XhDi(jLyM~mzCMu=!!i*V+H(i)1qmyAtT~EVnjq1EzAfpvH-J?`brj3 zEi;6sg-9VcnK3#Ah3JxrdLVSkP=HW~cw$3p%zCHA@Eihg7zCk3h>=AU3#kz4V0Sa% zJsEs$(?SHr*cXq5@#-&E0uNSPvTC^FML>mR6k>!J*#P4-{iilBE4ghM@Bj*QPjLmb zjh$kY8m7n3ytPnq*R-(Xl2yYUFA|d;LyZt42TqJ&#e3#21`YDmjk+ivPFn>$n{tuo zo;d?gKK71sU#oD@4o%l$u;B4a)nTytc za&rd=LX8lkIwrODNQw~J&wKtSPh{cZ=4(nnnO(Sr2$Y_?Znd5}LAVfNROfVe4q|&t zlK1@aIXSqr`E$6|K59vnFpdAfU(C}BT34fFEI|-@M9iqpVOhX#-c{2G2Ao&!pU)yr z^NZc~YewPvLt{*&^19DM5nA}yZLr{P;>vyQ|6ge&iXi+5%SZsJ&X=DhARPo7pv823 zQff^Z-#BY`d@E2)p&eF5Ad z%S3MvHXDPWt`TA+;G*1PMK5}3w9^Y2}76bjJekk9Y- zst->P41^d7Y?E4dq#X*-PKeBI(o!ZiN;NmLd~m8{7N~qtmZglFQwRjX=N|wx+M2U> SBg-TJ0000Beards Standard Backgrounds Hair Colors + Looking for more? + Check out the Customization Shop for even more ways to customize your avatar! + You don’t own any of these items + Head over to the Customization Shop to browse the many ways you can customize your avatar! diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt index 0b1c0f755..d7b6b99cb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt @@ -53,7 +53,8 @@ class UserRepositoryImpl( override suspend fun syncUserStats(): User? { val user = apiClient.syncUserStats() - if (user?.stats?.toNextLevel != null) { + if (user != null && (user.stats?.toNextLevel ?: 0) > 1 + && (user.stats?.maxMP ?: 0) > 1) { localRepository.saveUser(user) } else { retrieveUser(false, true) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt index 967cbda67..3ad1ff41c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt @@ -17,7 +17,10 @@ import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.grid.GridCells @@ -28,6 +31,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.Alignment @@ -41,6 +45,7 @@ import androidx.compose.ui.platform.rememberNestedScrollInteropConnection import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -55,11 +60,13 @@ import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.databinding.BottomSheetBackgroundsFilterBinding import com.habitrpg.android.habitica.databinding.FragmentComposeBinding import com.habitrpg.android.habitica.helpers.Analytics +import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.models.CustomizationFilter import com.habitrpg.android.habitica.models.inventory.Customization import com.habitrpg.android.habitica.models.user.OwnedCustomization import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment +import com.habitrpg.android.habitica.ui.helpers.ToolbarColorHelper import com.habitrpg.android.habitica.ui.theme.colors import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.android.habitica.ui.views.PixelArtView @@ -67,8 +74,11 @@ import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaBottomSheetDialog import com.habitrpg.common.habitica.extensions.getThemeColor import com.habitrpg.common.habitica.extensions.setTintWith import com.habitrpg.common.habitica.helpers.ExceptionHandler +import com.habitrpg.common.habitica.helpers.MainNavigationController import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.theme.HabiticaTheme +import com.habitrpg.common.habitica.views.ComposableAvatarView +import com.habitrpg.shared.habitica.models.Avatar import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine @@ -124,6 +134,9 @@ class AvatarCustomizationFragment : return FragmentComposeBinding.inflate(inflater, container, false) } + @Inject + lateinit var configManager: AppConfigManager + @Inject lateinit var customizationRepository: CustomizationRepository @@ -146,6 +159,7 @@ class AvatarCustomizationFragment : savedInstanceState: Bundle? ): View? { showsBackButton = true + hidesToolbar = true val view = super.onCreateView(inflater, container, savedInstanceState) binding?.composeView?.apply { @@ -155,7 +169,8 @@ class AvatarCustomizationFragment : val userSize by viewModel.userSize val hairColor by viewModel.hairColor val activeCustomization by viewModel.activeCustomization - AvatarCustomizationView(viewModel.customizations, userSize, hairColor, stringResource(viewModel.typeNameId), activeCustomization) { customization -> + val avatar by userViewModel.user.observeAsState() + AvatarCustomizationView(avatar = avatar, configManager = configManager, viewModel.customizations, userSize, hairColor, type, stringResource(viewModel.typeNameId), activeCustomization) { customization -> lifecycleScope.launchCatching { if (customization.identifier?.isNotBlank() != true) { userRepository.useCustomization(type ?: "", category, activeCustomization ?: "") @@ -217,6 +232,12 @@ class AvatarCustomizationFragment : } else { filterMenuItem?.isVisible = false } + + mainActivity?.toolbar?.let { + val color = ContextCompat.getColor(requireContext(), R.color.window_background) + ToolbarColorHelper.colorizeToolbar(it, mainActivity, backgroundColor = color) + requireActivity().window.statusBarColor = color + } } private fun updateFilterIcon() { @@ -397,43 +418,80 @@ class AvatarCustomizationFragment : } @Composable -private fun AvatarCustomizationView(customizations: List, userSize: String, hairColor: String?, typeName: String, activeCustomization: String?, onSelect: (Customization) -> Unit) { +private fun AvatarCustomizationView(avatar: Avatar?, configManager: AppConfigManager, customizations: List, userSize: String, hairColor: String?, type: String?, typeName: String, activeCustomization: String?, onSelect: (Customization) -> Unit) { val nestedScrollInterop = rememberNestedScrollInteropConnection() val totalWidth = LocalConfiguration.current.screenWidthDp.dp val horizontalPadding = (totalWidth - (84.dp * 3)) / 2 - LazyVerticalGrid( - columns = GridCells.Adaptive(76.dp), - horizontalArrangement = Arrangement.Center, - contentPadding = PaddingValues(horizontal = horizontalPadding), - modifier = Modifier.nestedScroll(nestedScrollInterop) - ) { - item(span = { GridItemSpan(3) }) { - Text( - typeName.uppercase(), - fontSize = 12.sp, - color = colorResource(id = R.color.text_ternary), - textAlign = TextAlign.Center, - modifier = Modifier.padding(10.dp) + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Column(horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.background(colorResource(R.color.window_background))) { + ComposableAvatarView( + avatar = avatar, configManager = configManager, modifier = Modifier + .padding(vertical = 24.dp) + .size(140.dp, 147.dp) + ) + Box( + Modifier + .background(colorResource(R.color.content_background), RoundedCornerShape(topStart = 22.dp, topEnd = 22.dp)) + .fillMaxWidth() + .height(22.dp) ) } - items(customizations) { customization -> - Box( - contentAlignment = Alignment.Center, - modifier = Modifier - .padding(4.dp) - .border(if (activeCustomization == customization.identifier) 2.dp else 0.dp, if (activeCustomization == customization.identifier) HabiticaTheme.colors.tintedUiMain else colorResource(R.color.transparent), RoundedCornerShape(8.dp)) - .clip(RoundedCornerShape(8.dp)) - .clickable { - onSelect(customization) + LazyVerticalGrid( + columns = GridCells.Adaptive(76.dp), + horizontalArrangement = Arrangement.Center, + contentPadding = PaddingValues(horizontal = horizontalPadding), + modifier = Modifier + .nestedScroll(nestedScrollInterop) + .background(colorResource(R.color.content_background)) + ) { + item(span = { GridItemSpan(3) }) { + Text( + typeName.uppercase(), + fontSize = 12.sp, + fontWeight = FontWeight.Medium, + color = colorResource(id = R.color.text_ternary), + textAlign = TextAlign.Center, + modifier = Modifier.padding(10.dp) + ) + } + if (customizations.size > 1) { + items(customizations) { customization -> + Box( + contentAlignment = Alignment.Center, + modifier = Modifier + .padding(4.dp) + .border(if (activeCustomization == customization.identifier) 2.dp else 0.dp, if (activeCustomization == customization.identifier) HabiticaTheme.colors.tintedUiMain else colorResource(R.color.transparent), RoundedCornerShape(8.dp)) + .clip(RoundedCornerShape(8.dp)) + .clickable { + onSelect(customization) + } + .background(colorResource(id = R.color.window_background))) { + if (customization.identifier.isNullOrBlank() || customization.identifier == "0") { + Image(painterResource(R.drawable.empty_slot), contentDescription = null, contentScale = ContentScale.None, modifier = Modifier.size(68.dp)) + } else { + PixelArtView( + imageName = customization.getImageName(userSize, hairColor), + Modifier.size(68.dp) + ) + } } - .background(colorResource(id = R.color.window_background))) { - if (customization.identifier.isNullOrBlank() || customization.identifier == "0") { - Image(painterResource(R.drawable.empty_slot), contentDescription = null, contentScale = ContentScale.None, modifier = Modifier.size(68.dp)) - } else { - PixelArtView( - imageName = customization.getImageName(userSize, hairColor), - Modifier.size(68.dp) + } + } + item(span = { GridItemSpan(3) }) { + Column(horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.padding(top = 40.dp).clickable { + MainNavigationController.navigate(R.id.customizationsShopFragment) + }) { + Image( + painterResource(if (type == "backgrounds") R.drawable.customization_background else R.drawable.customization_mix), + null, modifier = Modifier.padding(bottom = 12.dp) ) + if (customizations.size <= 1) { + Text(stringResource(R.string.customizations_no_owned), fontSize = 13.sp, fontWeight = FontWeight.SemiBold, color = colorResource(R.color.text_secondary)) + Text(stringResource(R.string.customization_shop_check_out), fontSize = 13.sp, color = colorResource(R.color.text_ternary), textAlign = TextAlign.Center) + } else { + Text(stringResource(R.string.looking_for_more), fontSize = 13.sp, fontWeight = FontWeight.SemiBold, color = colorResource(R.color.text_secondary)) + Text(stringResource(R.string.customization_shop_more), fontSize = 13.sp, color = colorResource(R.color.text_ternary), textAlign = TextAlign.Center) + } } } } diff --git a/version.properties b/version.properties index a25009fd3..f0b3b37ea 100644 --- a/version.properties +++ b/version.properties @@ -1,2 +1,2 @@ NAME=4.3.6 -CODE=7101 \ No newline at end of file +CODE=7181 \ No newline at end of file