From 2b06b41ffd962d1df3192e59019fd48a2e6c760c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=82=E3=81=8F?= Date: Wed, 7 Dec 2022 18:34:36 +0900 Subject: [PATCH 1/8] Dolphin: new animation L2_Wake_up_128x64 (#2099) --- .../external/L2_Wake_up_128x64/frame_0.png | Bin 0 -> 4779 bytes .../external/L2_Wake_up_128x64/frame_1.png | Bin 0 -> 4782 bytes .../external/L2_Wake_up_128x64/frame_10.png | Bin 0 -> 4835 bytes .../external/L2_Wake_up_128x64/frame_11.png | Bin 0 -> 4838 bytes .../external/L2_Wake_up_128x64/frame_12.png | Bin 0 -> 4775 bytes .../external/L2_Wake_up_128x64/frame_13.png | Bin 0 -> 4783 bytes .../external/L2_Wake_up_128x64/frame_14.png | Bin 0 -> 4722 bytes .../external/L2_Wake_up_128x64/frame_15.png | Bin 0 -> 4742 bytes .../external/L2_Wake_up_128x64/frame_16.png | Bin 0 -> 4639 bytes .../external/L2_Wake_up_128x64/frame_17.png | Bin 0 -> 3796 bytes .../external/L2_Wake_up_128x64/frame_18.png | Bin 0 -> 3834 bytes .../external/L2_Wake_up_128x64/frame_19.png | Bin 0 -> 4664 bytes .../external/L2_Wake_up_128x64/frame_2.png | Bin 0 -> 4785 bytes .../external/L2_Wake_up_128x64/frame_20.png | Bin 0 -> 4779 bytes .../external/L2_Wake_up_128x64/frame_3.png | Bin 0 -> 4793 bytes .../external/L2_Wake_up_128x64/frame_4.png | Bin 0 -> 4815 bytes .../external/L2_Wake_up_128x64/frame_5.png | Bin 0 -> 1743 bytes .../external/L2_Wake_up_128x64/frame_6.png | Bin 0 -> 1630 bytes .../external/L2_Wake_up_128x64/frame_7.png | Bin 0 -> 4722 bytes .../external/L2_Wake_up_128x64/frame_8.png | Bin 0 -> 4731 bytes .../external/L2_Wake_up_128x64/frame_9.png | Bin 0 -> 4656 bytes .../external/L2_Wake_up_128x64/meta.txt | 14 ++++ assets/dolphin/external/manifest.txt | 73 ++++++++++-------- 23 files changed, 54 insertions(+), 33 deletions(-) create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/frame_0.png create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/frame_1.png create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/frame_10.png create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/frame_11.png create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/frame_12.png create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/frame_13.png create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/frame_14.png create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/frame_15.png create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/frame_16.png create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/frame_17.png create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/frame_18.png create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/frame_19.png create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/frame_2.png create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/frame_20.png create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/frame_3.png create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/frame_4.png create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/frame_5.png create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/frame_6.png create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/frame_7.png create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/frame_8.png create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/frame_9.png create mode 100644 assets/dolphin/external/L2_Wake_up_128x64/meta.txt diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_0.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..91209003253eb30c6c3ad6945a5dc1515bbe858a GIT binary patch literal 4779 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�?vbazMY@}04#AnHVzaAb2BWSL{!54 zmQe~L1~Rk(Ktnq$5Qq08P$2FEFP{KSDE(yv6yoEd3AM+VBg_N!3En;?;bg*@a0?rJ zxF25K1FEeB(Fnsb3=jzv93+hB9}t8M(}ezI7t2`xCc~kSzeFg0n$W*NIhb2P^hsm_ zL{$j|!y^y~h^o30(p?3EQ&o3ID?(5R6bg<|fg_b+C=?cfWW11n9w@^h*~1fSZD90| zJH}2E>P?{pV&U-6&`_mNWhD~X3yxG*SBE1|a1;v0kbnhI11PvKSU`~U9}5PAAUxS8 zkm5rMfc&XtO@@Q zO&@T#6F7>wEgs4cLp>BmPZ^0ps_FjGH4O-&-~#Z3KfZk!zW>oR{GYm5eKG+@A(3rJ zB>z8!VC7Askb=BPfe@6k5(Xk~j>G!|{H7@UKBd2dHXx9FLI@s4WD*hbSDLXt{{;e? zfKgW`AaO9f8V&(Nt0FyM>Sz=OhV)d%s}pbtPrND$`j5WHf28m4N@Y+OVFdm`gT<&2 z)KySuJj_##fP|@H(2Qi_acG#QI!+b!n}bnNgTfgQ;lC^AKPu@DiBX=vm;bf~WAkrw z5ds(;MP{^)oW-F8M%y8*%xnx9^RHjOc6N5Qx3}5Z*%{llwKc}Lva+(VvBAvD%)-K= zqN1|9yE`>CwZFfwaVS+609X;G2D&z3Lko`J#9_pNkM9jXzx?%Uar&_g53eKGN|4Rh zO*OtYhGUV`j7=FxN7)fxQD+?f{!nP>+ZOO}Se@%piKatSp1)iX8DKBuqkH(S1av)7$w zIU~UZ`rsBst`~;1RntRp_(#~O(E8$a@Jl^n%5fk79wVsdHp$EB79z37ast@wE8ckh zTEQ1cUdfiz0vE9s2b8*ftpsWd+i6${NJ}SmC6&ozkWb$@jkn-nX*7?#vD@ce320vb zl8)E`;SZ3bU7$}2z*BeHfZ{26JjaWdx8%ngqt`)+!ws$ua?*NZvHmZY!ha%f5MOf^@#XrS6ovESv96cPu$5$Bs++0tQ`=+s5KVMGT+9=wQpHpj!pMB6N|du`Z%mId*?o!ydZ zd2>QL?{U?HteCv~Y%I+}VXJjjB{skGNhFh7v^JB5U78Jtz!eZv4OA!7$z-~(htQqE zV;;{TbiY2q^lP|ypC!*h@eTb%7U)LLQezig+}Se5W>jWnrV%5$9BcZ9GJ%kL+|)BN z65NPQI*LLAu`S;h&S{=s_LpLdmfjrUjqa5NjKD3Q>n&cu!qGNuJcahrcdv(Xcc(CU zm@LUvX${#bycYmxWvj8zPPe^FAe4)7`paDSSc5Mjw*-9;k~x1g{f5q`OyLVbY_-Wx zawE}6M6+>c3?;o_=XkC3vvBz~vK)<8hYB55{9%`Q$h$GWl@Iiwuc^V8xg?)Xzt zwL<9m;Oma3iUXg4;=I%1MWY=Kl+TXgd#7_{8|=QU2ia|egg99WK^pSDZ%fAB)835cW6Efdbl#|l z){F3N{1K2VV!v{AfUmHOV_Ytu=B&sZS<3&y_N~BowN%mf_jl9ZKDFyld4KJ~tBK%~ zuI<%5UR`8$Dc!!X!HQ{FAom=_>*O7blZ1|UoC=_0zslKUQf&VtO;Da6;9|{6jEsf= z*CMozI0eyJ(H~(PZ7`B#d&cy&t3^}nSPt;n#I@5?%yPN$=TAxtn8zd+L3-E{aB7y3 z;~GspF1J=R7u*%NV0c$9<`Dx(uhHfnWT~ZjTmqOf@D>tbXY&J0<>N|@+HpE;=5e<_ z$F@i9d*?AX$U)fdiwSzWb9QCki>W)_P)GwAYAV>8tDOQ5rrj$S_LuV1x40zsK?g9<&j=>G$&h-8TX literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_1.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_1.png new file mode 100644 index 0000000000000000000000000000000000000000..0b99a32ff9c04baa54b66b8e0504ec39ff75ace7 GIT binary patch literal 4782 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_11.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_11.png new file mode 100644 index 0000000000000000000000000000000000000000..8d54da6c61b0b1ba2b876bef8fe1d023ec958909 GIT binary patch literal 4838 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 VFrQLE34ShsqrHn=g^k~-{{y`aaz_9F literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_12.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_12.png new file mode 100644 index 0000000000000000000000000000000000000000..84046a46c8fd13e533bd2181f088fb726946fa98 GIT binary patch literal 4775 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 U`qrQ19t(hl=`oX1Bag`c1AMVsMF0Q* literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_14.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_14.png new file mode 100644 index 0000000000000000000000000000000000000000..f4f6ccd661ebca010fcfe407427402ee65958efc GIT binary patch literal 4722 zcmaJ_c{o(<`#*L=#AK(8L8~!l7|ew1OOc&Xlrd(kVH7r-dhJo*@8K zx|Fk(&n}G~18csCh~lyl5aiD`v~CXV=Q7NR`j&UR+C}SD)P-nkd(~f(!$r@o z17sWZ4CV(PP5hqk4xlX})G(hU<4p~l+viG16cIJ{2bo3j?3>C5kzLSSBFjxPc6_=1aiQI>bVbx$zZ{ zSE>n>XKgHJ3buQWG++*{V*`BSun7k>9f9BsZMhBrqRI^D968j<0x@REQ|N0LExt^N zs5WE*8rxGk)6VrN3RI``i1{rojDC~)_R8~#Hct2i9}zSG%}&dbK4dt>V%&8A0K_(X zoAy-CBussu82e6~@|<6JlfUP&K!$2aEspHf#xS!2eCNC82QN=f4zN&Km>&Bycobg* z25kV>kxd81AyD20uAYF+Xu9f-=8@dHX02+6CAhe`=VYDk)+vlfYwRnIkw>G0))?Hq zp@0S8N~UH;Sz|%i?iHMuZ@ER>R6DCS!fSm>daoto`fl8b-fv1z?BxV+En;t0n?X%l z=r1f1b*0);zJaH&BNru8cR@*hJV5CU)5i19Ii9t9HU|A-Vvgp;_W1&uLCdfhG44cw z&qWDIUk8AshRt}*Q%pc-TH!bV)cz2$e~>I}{FV~{bn`+^KGxzm&?HdW$eZ1CxVBN4 z8ON@xc|fL7jZd3>B3Od!u1Knus8u886YI0bEMj^5nPYsFO$b$ zl}POk5UW-z=OLUFCW_xF?h~|&Q#d1z6^b)dx*c2ynT`@LhrVg`E@Up&c29ILlwN{) z3!r1|HMbImS|P|=JGW{L5Xm7G<}4qWeKcP@kQBT1Hjmm%Q#$AnoSN^^D^__#J@|Qk zQSZ4QJ~ZIktvGyeFM^jC^BHF!6RGET6DxMKMF>BMMcKro@Q1M~zJlV7xwv^w8RqEV zL$jQh!uei#h9)E!V2!al4`gShE5S9KwxFCse8kRhzlvQVRs&n?^d=u85s?dt?*MQ|x3 zEwL)$V1nuG?Y7qwRRWkdQQwR~`7#!T$>6gn!kJ0ddv}o98F?k3ePaU&-Okoqt!~`BT_uWCH-JJ*&2It?PQ=};yZ8(CdDQt zC}pa|%9?6@rk`HIZS~Ol;KNHc*Y4|EKQ$XK27M5E*k63u`em_ld6$KsMZ8(J`Q?K8 z%e$dlc%F(I5&C&I3=6FARc}ROrG(xh35!_m0dE_Y899%16Q_$6o3qBgY}?|#@TbKY}8 zb2EeUK9n5I9J!oT3<C^0^xdRHM)}iK$qjl|99Wff}gsrY=7LB(W%y$CrMAqN0hmNS%O9u@EWdw2T zsf$~TFOGR}ddU5`x35d7yQhUGem1K* zxVoe|#6NOFZ!rx_J0t^|yE)PPsagHzIF)(IGgC2pBGW3BhA*ES&VM2NeY&eX*H6t3 zWtR}B8j%i8t2i?m2GKTyib&Ms_*kw5oBs{ik>KX`-SwfiH+{S*V69KS3bkg$=S)-1r|JRsgG9{im zmBcea|4w=*o)r0ReL{MZx;!N48DZR8P-#(a#w%nDe{jnGqR2)6YQs9i3m+6mhhHO+z*8o^7&|F`nRNCm?QVek zYFuY!=etf86b?0avEzB^(9&Jyg0+C0>kjQUyJZin>OUVH9BBCBcXgRJ?6BbJuk*>X zwa-rZ+j`XLU0e0)`xW{nUd&0nrr~?gmudq)(>J;CSMOcrSks%Iai@_zhaWXGRDehp z%CScbF_g)yVDezrT&CYM%7v4>ue2tcj*Z+8ygF|7<8IgM;n$rb8P}^;IcE&%r}{7r zKBce%Ql9$Vy7?b51v!T=9X6=1+7FsXjN^S;Q1Q08c{#_`7dIzDlg5jji*j?$pHcsi zF-%`K-pTNAFn6eP(do`TBTV~cTy=T9ZTag|yu(5*Wd*wKG$dPfu1vjL-5`jvJ7)Ok zB6)_e-acomR!&M#t{gb_eHqL6Nz8$@}jk$NCI94Em+@ zrDNlBBqhap#OjuuyOPF=DvAzuzYDV2r_WFyPL1q-+dkKg-TAb@y&2uzP);vi_MU%O z{0P$`-6C1rMOR8j^>`(a_<(trKrbrU1KV6ZwI~}zPufb zmgQ%hDn)5}Sehl7Nb|#a696q|vJ(MfM8dfcEC@Jf`js|<8UV1|aI?bFuqMVBJeeeq z`;C$JCs7#E0HAippMt}C5NHr5f{UA%I&}VJ0~F%stPZtBnJAc0bO^3)h5_CL%YgG% z_y7+)+8KIA1ES`SVJILGXgG*J$VAUb4k z0z^d~3BxNWC_q%u@(3qo6ix;0q$CGHDj<6|X{6Mxj*y==pE*+9)JiM+L2? ztg3@RAoO&#(P$-YJ#8dPTM>amsA~O@HS(g;a9()AAKPvW+yBVw{!dwqjyC~EBYRts z$)0}-!OWFRBU4?;6bMpL9tAmWg2TIc{idAwy-R-wtxNEB^CdXzdy`3!ztW6x`!6mi z5m0C}0fB?zRdEV1B^87-46TGj!4O16Jeq)0AmUY!(0}Be|08{WS1N)F<|4~VQNR0CQJ^i;e7>j?K zi{QoRC~rpV*rDnBjJESMGq%!WjQjih+uPgI)6*Uv9wj9uF)=aP+S<&_%v)PqTwGkd zyu1v|&dyF%RTUc>+wSfz3k!>+q@1tW|56;?s_7Xtw(M*_KeFa0onw^5oJNsvD z=d@poulwA1PCwE2yzPrGX{RFgmd!7LYQe5_(Eg3!gDkYsf;np%IBE=%n>iEB7bW8O zcHC4jsG}~n(bh%8%4{KeGtvKQ0Qfe!DwyL;!P4@mog*tNs|5S9JuIpw6xt{^jsWJs ze3CEIxf12-v0~xn{8(UMqZ!9mU&$moVnt=213&&%KrCBmQnwhN`8=8?lUFUzPs|RY zQpe-KkM(cbN0EFtNJy#ISQ}0;SuNh`^cjNHc(Pt8@=4F4%csoShxL!KUtZBX{#ISH zwQM-DUav>uWTA93cyvSePHr48c((t28uUg)8o7#xsUB#5C-JNI+OQ;jLgwDx4gL~~ zpHt&cSaw<#{UM^MS8ykvH(N6guN|z4T>Sp}$XaAp*2|%bS;9UNEv)I>s$GE}!J%8c z)X?43n8-!DkkP>L`xT0yZ0ZWXS^rc8>xJxudr`uWQ3N`yQLuMta=r6?_v+HzOGVIu z*>njXjTcHGOyjD0ucB}wEjW8gVe6abr@x+O=4TVS5!^}F6LFNk`9&z*>v9q6&y6rO zt|qJ3UXremM(;A?K)sb)9@nRcua-GKwDHZP7z+fejJBHe7-_PG#708H$WQyu@g>O8 z=Qutvqr$ZW*ybvun@9S~$ci=z-@4@>)VkaDe%e%WWT>U)LZW53?opXzY7u934!B{A zc2Y8$FO&?NUJ1Cfb%4ZWGGW{S%b-R6dhH%oxtmTW&HHol?D}_#49lFwde_pTtj-~j z%6S4KUweAB9w>6d%vAI$;ct~(RW2y!50YK_6IR2f_s!Qtu*=48ASYU$;VoHbf6%XL zb_Hn09!bWh8_VI#jNt339NxMHQg%FMD#wK$nUt+ZU~FP+v&tto9sw-Cse5zsUq<3DoT-!19{{ZNmPJ;jd literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_15.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_15.png new file mode 100644 index 0000000000000000000000000000000000000000..5dc1a652563722b09ff28efbf1ba62efb97e79a8 GIT binary patch literal 4742 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_16.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_16.png new file mode 100644 index 0000000000000000000000000000000000000000..bec472921c88739c9ca5d1290680fe4b1d0f1cf6 GIT binary patch literal 4639 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_17.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_17.png new file mode 100644 index 0000000000000000000000000000000000000000..82e5176c89130ca2f5def41a7b5888fcfe921d8d GIT binary patch literal 3796 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 YnPB0-mm!6Y0yuz;)gj9wbI)`C0T05Vk^lez literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_18.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_18.png new file mode 100644 index 0000000000000000000000000000000000000000..3b5e60dfdb933468706d6c1749f1cc2e862b544a GIT binary patch literal 3834 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 U-yOBsn5_<&7@apP)^`d2KOwkMcK`qY literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_2.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_2.png new file mode 100644 index 0000000000000000000000000000000000000000..84d6aaf3533941c61a9f82147f1bd62f5b17b52b GIT binary patch literal 4785 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_20.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_20.png new file mode 100644 index 0000000000000000000000000000000000000000..2f8394fd5185736cbc37b773ae64a7b76fef5f1e GIT binary patch literal 4779 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_5.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_5.png new file mode 100644 index 0000000000000000000000000000000000000000..7f980f57f8a6c7e10c63406770e7abfad0f3d1a7 GIT binary patch literal 1743 zcmV;=1~B=FP)-v7)F}{?eze9D8=ovX3bk|_{w`TxGp{WR*FqD)rsaGWH4hPeCya!kZQrWzWN-1YD zm7nKnu2IDkMvkyG1MJwWm!9vc-?CgSAZtq}(hg-mc2j24wIze63d z(|<(#dVO!d(m6VMFn~)yRXOWW9WJ8A-R;G8|n96n78t!EZubgxvpXJ}$ z18Cz!hW8@YGyal+7&xP0YCGcuS((sIhsa0PWw6x&^kGkz$zjUthW z{z&g^&z7!J**3#A2hep9RW74LYCCH%mY*pr?7r`e{^K}~FUH%DK0v3vswY>kh22JK zN?uh5)^W22G{Y;Zf6Vnp^Gq7T(#MmnOF;#QjA>^>*7r(er*S-w;0GaIT}1D)9py5I zv<{|nTj=m-4lsGG^oCI#<6qYmJAlgsW`<5JMjNT*%W))RGgO8(LzK znZ$XX`vyUi=@BVYNUDs0%q22CrhAV}5B*uvqK>gO19%FeyplhQ^lsgckU5#YE?T?{ zJbB$Ak%esz(BWb0T{rqQ(CD*hI!4pyG*Ra>&?SJW>yy!lPVy!rkdZT00;JJ*8h&Bx z%OLH|%!Z<=93c zgyT)=n#pOv!{oARdQpwN9m^;)}Nm8Xs^syt~1KwhF~500)qQOcYeF=u*cy6E{ov-9Gl zF55Q}{ZkFH#QB$oAJwu^AEjsAv3oOqWE8CVP@TGRqp}v=ESMWgq-T}>VB&?`l zHtA)8DB2>uy!1K&c32ZdGn(<({-{F#{rPZS2BEb{^RS+1DTb5@_I^K2XQl5wR58u({W;qoJ4^A_i}Z{5&PzO<^02I4M-jE;u?}L% z(b&nCWr9c!(@a|WcKF;9kO`?=S-fV@YXZG%rsUDzThBZ?mLBN`vOPq`u3l+dd{^Z9 zMR*aQpIh`xF-?a$&aNoWbj-4qmk~A`KZP&@R8o`X&(i&pA4PW7gk`iIJ@U+wix^td zYI^ydhiYVN9V3_y&^7#$5vA~N1%fE3mIF%{Z!IJ>BeJ{<5ba6p;H}rSL$t=1CSD76 zJWnbuH(X73Sx39p^z_ksc+Vpp{Er7abDMT?KHfkv49>(_0Y2Q8Ci%Eb!nLWjM(icTmz+$&Y>~U z@N~C~0M&WI36}h>6O{gXxUTb)kTt8qy92F3%O;(c{C0nE5E+0?J#6$xb)HG%li7li z$LK$m1+;vYkNSrqcY5@s;ih!#>J&At)2L=n>L+0gZFj@F59}^X40Cq!wSE#-RU#Xr zbg-*8nSh>&L=ii&4@8Dp0(Lfe8mRGET_!TnR7twC6i6UV;y(`XRINwWyUPhGd~)(> z@q1Iqr+b4RlfcE$1)Bb?`F;qVx{{YB1Bc{%Al|KLg002ovPDHLkV1j9fOVt1X literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_6.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_6.png new file mode 100644 index 0000000000000000000000000000000000000000..497136000858840374438aa4481a4f3fd1a9a368 GIT binary patch literal 1630 zcmV-k2BG@qkp5sX{Bpbv;FsfZ_X2h>#%KC+p6Ao|DoDELd6x6I6EEih5G9T= zjxolQGUWFPXv&|we+pm&*x9r)@NWoGGG<91IkOHa~X=gQC3M!?QL z58^H$=&&p=^Uc#!3EJNGbyBh+m@&~PD(ZyvId1nYf zu)8nK=+T54<>MxSNb(ZRXG<&w*%ESx2Rk>Lh$2ZRQnhIG*D-BXK-cwb#PcV>YIaR% z{RBA{HH8$rqd(DLrC(_g`}LkU&g)=IQ{0Jg1}xou>5BEM%l zqgk-6^D3kb09`C{8Z(LII@cPPX)IaqDKNa{_*Xpn6PI{^-6V&74*+>yaZgco7g2E) zoW-MB5Z*ZLE)Q=AXV3Qtcu~AN-U1C_4zay}!WHW2Xa*VYv%M+q}S1{g8j(@C+ zL1B%Llw#dwFD+hQg12f6aIu9`d%i57-()x`B8}77u zo`+)A#~v_do+fKK?~y%mtYEZ-$$4_o7M)CA04-I$XPMGfDnZ*@l>BDaVm*`d+z=qK z>z=)N>vPQrBBMapZ9PX%l%(mobJRPrhG4BFGtcbzl!4xY zydHpeN?1=2&54>QUS5HCFLZD0`nvHH0yF9!kE%HVdI`njoF-E82*D)Gc*NM=y=tMw` z05M8yU(vb{U6dNa0aO7V5hg>Hh~m9Ao>^N4i~<;1Ojttqxf>RaBl$u|g#}7_$ceoo zQL5yD?kfwltn@&=7S5K1jO)*!$^g6hSxK=4MlNjGCqezA$V@+=6BRBH#je42uQS^_ z2tz=%yMLn>Y*+|8f!R~fX8t?4;&fHSakRlSpYQNN*Q^@A8tc1pXBX@$R2n-2q^$j7 z0Nt^^TH)Wtc(irC!XZ;%3(p8O)3K{GhAvOiK^LXT^hgkB^B;3TyFd~Tw9A)8wX&*D zCv#6C$5gLp^8Hh(d=%9orX$8??*=SdUoK&a6KfXJ=q~?v@!AQf#BL6gt*4_kUD>lh zah_++05V-CP4OMc;Mx^q1uo}y80Wh0)yuGJt&(556+FMMK>PV}Ojjn4dV`Kr9|7fM za3?;8iI#v zL+vb0Egq~fKp{X16lGFb!!nQpVM4&wjU^dUnOjzQ7&D##z6_EKSDZk>2q|Mm cvDpsmUs4|T-E1YKJOBUy07*qoM6N<$g3kE=fdBvi literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_7.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_7.png new file mode 100644 index 0000000000000000000000000000000000000000..03d67134aacbae8d562009acb4482172150a1019 GIT binary patch literal 4722 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 LY)vbTPsRQpgF-@k literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_8.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_8.png new file mode 100644 index 0000000000000000000000000000000000000000..9f523caceed6287320d581b76312d2036b6ad27e GIT binary patch literal 4731 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 JNdM~1{{w%hGqC^w literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/L2_Wake_up_128x64/meta.txt b/assets/dolphin/external/L2_Wake_up_128x64/meta.txt new file mode 100644 index 000000000..06c710f03 --- /dev/null +++ b/assets/dolphin/external/L2_Wake_up_128x64/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 10 +Active frames: 18 +Frames order: 0 1 0 1 0 1 0 2 3 4 0 5 6 7 8 9 10 11 10 12 13 14 15 16 17 18 19 20 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 0 \ No newline at end of file diff --git a/assets/dolphin/external/manifest.txt b/assets/dolphin/external/manifest.txt index a6c7ca694..7f03d6595 100644 --- a/assets/dolphin/external/manifest.txt +++ b/assets/dolphin/external/manifest.txt @@ -36,19 +36,12 @@ Min level: 1 Max level: 1 Weight: 3 -Name: L2_Furippa2_128x64 +Name: L2_Wake_up_128x64 Min butthurt: 0 -Max butthurt: 6 +Max butthurt: 12 Min level: 2 -Max level: 2 -Weight: 3 - -Name: L3_Furippa3_128x64 -Min butthurt: 0 -Max butthurt: 6 -Min level: 3 Max level: 3 -Weight: 3 +Weight: 4 Name: L1_Read_books_128x64 Min butthurt: 0 @@ -57,13 +50,6 @@ Min level: 1 Max level: 1 Weight: 3 -Name: L2_Hacking_pc_128x64 -Min butthurt: 0 -Max butthurt: 8 -Min level: 2 -Max level: 2 -Weight: 3 - Name: L1_Cry_128x64 Min butthurt: 8 Max butthurt: 13 @@ -90,14 +76,49 @@ Min butthurt: 0 Max butthurt: 9 Min level: 1 Max level: 3 -Weight: 5 +Weight: 4 Name: L1_Painting_128x64 Min butthurt: 0 Max butthurt: 7 Min level: 1 Max level: 3 -Weight: 4 +Weight: 3 + +Name: L1_Leaving_sad_128x64 +Min butthurt: 14 +Max butthurt: 14 +Min level: 1 +Max level: 3 +Weight: 3 + +Name: L2_Furippa2_128x64 +Min butthurt: 0 +Max butthurt: 6 +Min level: 2 +Max level: 2 +Weight: 3 + +Name: L2_Hacking_pc_128x64 +Min butthurt: 0 +Max butthurt: 8 +Min level: 2 +Max level: 2 +Weight: 3 + +Name: L2_Soldering_128x64 +Min butthurt: 0 +Max butthurt: 10 +Min level: 2 +Max level: 2 +Weight: 3 + +Name: L3_Furippa3_128x64 +Min butthurt: 0 +Max butthurt: 6 +Min level: 3 +Max level: 3 +Weight: 3 Name: L3_Hijack_radio_128x64 Min butthurt: 0 @@ -112,17 +133,3 @@ Max butthurt: 10 Min level: 3 Max level: 3 Weight: 3 - -Name: L2_Soldering_128x64 -Min butthurt: 0 -Max butthurt: 10 -Min level: 2 -Max level: 2 -Weight: 3 - -Name: L1_Leaving_sad_128x64 -Min butthurt: 14 -Max butthurt: 14 -Min level: 1 -Max level: 3 -Weight: 3 From cbc5e3fa92b6efcf1dcae643a2640bcacad9c7fe Mon Sep 17 00:00:00 2001 From: Dmitry Zinin Date: Wed, 7 Dec 2022 12:50:44 +0300 Subject: [PATCH 2/8] IR TV Universal: Toshiba TV (#2084) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From Toshiba TV 32W1534DG (C) Co-authored-by: あく --- assets/resources/infrared/assets/tv.ir | 36 ++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/assets/resources/infrared/assets/tv.ir b/assets/resources/infrared/assets/tv.ir index 8945465c7..3965013da 100755 --- a/assets/resources/infrared/assets/tv.ir +++ b/assets/resources/infrared/assets/tv.ir @@ -1620,3 +1620,39 @@ type: raw frequency: 38000 duty_cycle: 0.33 data: 7847 3931 470 1448 467 495 472 1443 472 490 467 1451 464 491 466 499 468 491 466 4413 467 1455 470 486 471 1449 466 495 472 1441 464 501 466 492 465 494 463 22093 7851 3934 467 1454 471 490 467 1446 469 496 471 1446 469 489 468 494 473 484 473 4410 470 1449 466 489 468 1455 470 489 468 1449 466 496 471 486 471 490 467 +# +name: Power +type: parsed +protocol: RC5 +address: 01 00 00 00 +command: 0C 00 00 00 +# +name: Mute +type: parsed +protocol: RC5 +address: 01 00 00 00 +command: 0D 00 00 00 +# +name: Vol_up +type: parsed +protocol: RC5 +address: 01 00 00 00 +command: 10 00 00 00 +# +name: Vol_dn +type: parsed +protocol: RC5 +address: 01 00 00 00 +command: 11 00 00 00 +# +name: Ch_next +type: parsed +protocol: RC5 +address: 01 00 00 00 +command: 20 00 00 00 +# +name: Ch_prev +type: parsed +protocol: RC5 +address: 01 00 00 00 +command: 21 00 00 00 From c43ec414bb8943d84582a2c5e396bff3071019f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=82=E3=81=8F?= Date: Wed, 7 Dec 2022 19:43:40 +0900 Subject: [PATCH 3/8] FuriHal: add i2c unit tests (#2089) * FuriHal: add i2c unit tests * FuriHal: restructure unit tests Co-authored-by: Sergey Gavrilov --- .../unit_tests/furi_hal/furi_hal_tests.c | 116 ++++++++++++++++++ applications/debug/unit_tests/test_index.c | 2 + 2 files changed, 118 insertions(+) create mode 100644 applications/debug/unit_tests/furi_hal/furi_hal_tests.c diff --git a/applications/debug/unit_tests/furi_hal/furi_hal_tests.c b/applications/debug/unit_tests/furi_hal/furi_hal_tests.c new file mode 100644 index 000000000..e942c5933 --- /dev/null +++ b/applications/debug/unit_tests/furi_hal/furi_hal_tests.c @@ -0,0 +1,116 @@ +#include +#include +#include +#include +#include "../minunit.h" + +#define DATA_SIZE 4 + +static void furi_hal_i2c_int_setup() { + furi_hal_i2c_acquire(&furi_hal_i2c_handle_power); +} + +static void furi_hal_i2c_int_teardown() { + furi_hal_i2c_release(&furi_hal_i2c_handle_power); +} + +MU_TEST(furi_hal_i2c_int_1b) { + bool ret = false; + uint8_t data_one = 0; + + // 1 byte: read, write, read + ret = furi_hal_i2c_read_reg_8( + &furi_hal_i2c_handle_power, + LP5562_ADDRESS, + LP5562_CHANNEL_BLUE_CURRENT_REGISTER, + &data_one, + LP5562_I2C_TIMEOUT); + mu_assert(ret, "0 read_reg_8 failed"); + mu_assert(data_one != 0, "0 invalid data"); + ret = furi_hal_i2c_write_reg_8( + &furi_hal_i2c_handle_power, + LP5562_ADDRESS, + LP5562_CHANNEL_BLUE_CURRENT_REGISTER, + data_one, + LP5562_I2C_TIMEOUT); + mu_assert(ret, "1 write_reg_8 failed"); + ret = furi_hal_i2c_read_reg_8( + &furi_hal_i2c_handle_power, + LP5562_ADDRESS, + LP5562_CHANNEL_BLUE_CURRENT_REGISTER, + &data_one, + LP5562_I2C_TIMEOUT); + mu_assert(ret, "2 read_reg_8 failed"); + mu_assert(data_one != 0, "2 invalid data"); +} + +MU_TEST(furi_hal_i2c_int_3b) { + bool ret = false; + uint8_t data_many[DATA_SIZE] = {0}; + + // 3 byte: read, write, read + data_many[0] = LP5562_CHANNEL_BLUE_CURRENT_REGISTER; + ret = furi_hal_i2c_tx( + &furi_hal_i2c_handle_power, LP5562_ADDRESS, data_many, 1, LP5562_I2C_TIMEOUT); + mu_assert(ret, "3 tx failed"); + ret = furi_hal_i2c_rx( + &furi_hal_i2c_handle_power, + LP5562_ADDRESS, + data_many + 1, + DATA_SIZE - 1, + LP5562_I2C_TIMEOUT); + mu_assert(ret, "4 rx failed"); + for(size_t i = 0; i < DATA_SIZE; i++) mu_assert(data_many[i] != 0, "4 invalid data_many"); + + ret = furi_hal_i2c_tx( + &furi_hal_i2c_handle_power, LP5562_ADDRESS, data_many, DATA_SIZE, LP5562_I2C_TIMEOUT); + mu_assert(ret, "5 tx failed"); + + ret = furi_hal_i2c_tx( + &furi_hal_i2c_handle_power, LP5562_ADDRESS, data_many, 1, LP5562_I2C_TIMEOUT); + mu_assert(ret, "6 tx failed"); + ret = furi_hal_i2c_rx( + &furi_hal_i2c_handle_power, + LP5562_ADDRESS, + data_many + 1, + DATA_SIZE - 1, + LP5562_I2C_TIMEOUT); + mu_assert(ret, "7 rx failed"); + for(size_t i = 0; i < DATA_SIZE; i++) mu_assert(data_many[i] != 0, "7 invalid data_many"); +} + +MU_TEST(furi_hal_i2c_int_1b_fail) { + bool ret = false; + uint8_t data_one = 0; + + // 1 byte: fail, read, fail, write, fail, read + data_one = 0; + ret = furi_hal_i2c_read_reg_8( + &furi_hal_i2c_handle_power, + LP5562_ADDRESS + 0x10, + LP5562_CHANNEL_BLUE_CURRENT_REGISTER, + &data_one, + LP5562_I2C_TIMEOUT); + mu_assert(!ret, "8 read_reg_8 failed"); + mu_assert(data_one == 0, "8 invalid data"); + ret = furi_hal_i2c_read_reg_8( + &furi_hal_i2c_handle_power, + LP5562_ADDRESS, + LP5562_CHANNEL_BLUE_CURRENT_REGISTER, + &data_one, + LP5562_I2C_TIMEOUT); + mu_assert(ret, "9 read_reg_8 failed"); + mu_assert(data_one != 0, "9 invalid data"); +} + +MU_TEST_SUITE(furi_hal_i2c_int_suite) { + MU_SUITE_CONFIGURE(&furi_hal_i2c_int_setup, &furi_hal_i2c_int_teardown); + MU_RUN_TEST(furi_hal_i2c_int_1b); + MU_RUN_TEST(furi_hal_i2c_int_3b); + MU_RUN_TEST(furi_hal_i2c_int_1b_fail); +} + +int run_minunit_test_furi_hal() { + MU_RUN_SUITE(furi_hal_i2c_int_suite); + return MU_EXIT_CODE; +} diff --git a/applications/debug/unit_tests/test_index.c b/applications/debug/unit_tests/test_index.c index 2009d4a5b..b8760b1f0 100644 --- a/applications/debug/unit_tests/test_index.c +++ b/applications/debug/unit_tests/test_index.c @@ -9,6 +9,7 @@ #define TAG "UnitTests" int run_minunit_test_furi(); +int run_minunit_test_furi_hal(); int run_minunit_test_furi_string(); int run_minunit_test_infrared(); int run_minunit_test_rpc(); @@ -32,6 +33,7 @@ typedef struct { const UnitTest unit_tests[] = { {.name = "furi", .entry = run_minunit_test_furi}, + {.name = "furi_hal", .entry = run_minunit_test_furi_hal}, {.name = "furi_string", .entry = run_minunit_test_furi_string}, {.name = "storage", .entry = run_minunit_test_storage}, {.name = "stream", .entry = run_minunit_test_stream}, From 9a21dae29c8d28799cc31748bf825622f0b762bc Mon Sep 17 00:00:00 2001 From: gornekich Date: Wed, 7 Dec 2022 14:52:44 +0400 Subject: [PATCH 4/8] [FL-3008], [FL-2734], [FL-2766], [FL-2898] NFC bug fixes (#2098) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * nfc: rework mf classic update * nfc: rename cache folder to .cache * nfc: fix ATQA order bytes in nfc files * file browser: add hide dot files option * nfc: fix iso-14443-4 uid cards emulation * nfc: fix unit tests Co-authored-by: あく --- applications/debug/unit_tests/nfc/nfc_test.c | 2 +- .../main/archive/helpers/archive_browser.c | 10 +++-- applications/services/dialogs/dialogs.h | 2 + applications/services/dialogs/dialogs_api.c | 1 + .../services/dialogs/dialogs_message.h | 1 + .../dialogs/dialogs_module_file_browser.c | 7 +++- .../services/gui/modules/file_browser.c | 6 ++- .../services/gui/modules/file_browser.h | 1 + .../gui/modules/file_browser_worker.c | 20 +++++++-- .../gui/modules/file_browser_worker.h | 10 +++-- firmware/targets/f7/api_symbols.csv | 8 ++-- firmware/targets/f7/furi_hal/furi_hal_nfc.c | 3 ++ lib/nfc/nfc_device.c | 35 ++++++++++++---- lib/nfc/protocols/mifare_classic.c | 42 +++---------------- 14 files changed, 88 insertions(+), 60 deletions(-) diff --git a/applications/debug/unit_tests/nfc/nfc_test.c b/applications/debug/unit_tests/nfc/nfc_test.c index 07ec73a03..4218482c7 100644 --- a/applications/debug/unit_tests/nfc/nfc_test.c +++ b/applications/debug/unit_tests/nfc/nfc_test.c @@ -393,7 +393,7 @@ static void mf_classic_generator_test(uint8_t uid_len, MfClassicType type) { "nfc_device_save == true assert failed\r\n"); // Verify that key cache is saved FuriString* key_cache_name = furi_string_alloc(); - furi_string_set_str(key_cache_name, "/ext/nfc/cache/"); + furi_string_set_str(key_cache_name, "/ext/nfc/.cache/"); for(size_t i = 0; i < uid_len; i++) { furi_string_cat_printf(key_cache_name, "%02X", uid[i]); } diff --git a/applications/main/archive/helpers/archive_browser.c b/applications/main/archive/helpers/archive_browser.c index 149b39089..fa705189f 100644 --- a/applications/main/archive/helpers/archive_browser.c +++ b/applications/main/archive/helpers/archive_browser.c @@ -80,10 +80,11 @@ static void archive_file_browser_set_path( ArchiveBrowserView* browser, FuriString* path, const char* filter_ext, - bool skip_assets) { + bool skip_assets, + bool hide_dot_files) { furi_assert(browser); if(!browser->worker_running) { - browser->worker = file_browser_worker_alloc(path, filter_ext, skip_assets); + browser->worker = file_browser_worker_alloc(path, filter_ext, skip_assets, hide_dot_files); file_browser_worker_set_callback_context(browser->worker, browser); file_browser_worker_set_folder_callback(browser->worker, archive_folder_open_cb); file_browser_worker_set_list_callback(browser->worker, archive_list_load_cb); @@ -92,7 +93,8 @@ static void archive_file_browser_set_path( browser->worker_running = true; } else { furi_assert(browser->worker); - file_browser_worker_set_config(browser->worker, path, filter_ext, skip_assets); + file_browser_worker_set_config( + browser->worker, path, filter_ext, skip_assets, hide_dot_files); } } @@ -473,7 +475,7 @@ void archive_switch_tab(ArchiveBrowserView* browser, InputKey key) { if(archive_is_dir_exists(browser->path)) { bool skip_assets = (strcmp(archive_get_tab_ext(tab), "*") == 0) ? false : true; archive_file_browser_set_path( - browser, browser->path, archive_get_tab_ext(tab), skip_assets); + browser, browser->path, archive_get_tab_ext(tab), skip_assets, false); tab_empty = false; // Empty check will be performed later } } diff --git a/applications/services/dialogs/dialogs.h b/applications/services/dialogs/dialogs.h index 4e836e365..97783eb0d 100644 --- a/applications/services/dialogs/dialogs.h +++ b/applications/services/dialogs/dialogs.h @@ -19,6 +19,7 @@ typedef struct DialogsApp DialogsApp; * File browser dialog extra options * @param extension file extension to be offered for selection * @param skip_assets true - do not show assets folders + * @param hide_dot_files true - hide dot files * @param icon file icon pointer, NULL for default icon * @param hide_ext true - hide extensions for files * @param item_loader_callback callback function for providing custom icon & entry name @@ -27,6 +28,7 @@ typedef struct DialogsApp DialogsApp; typedef struct { const char* extension; bool skip_assets; + bool hide_dot_files; const Icon* icon; bool hide_ext; FileBrowserLoadItemCallback item_loader_callback; diff --git a/applications/services/dialogs/dialogs_api.c b/applications/services/dialogs/dialogs_api.c index c1de59993..91b3a1d04 100644 --- a/applications/services/dialogs/dialogs_api.c +++ b/applications/services/dialogs/dialogs_api.c @@ -20,6 +20,7 @@ bool dialog_file_browser_show( .file_icon = options ? options->icon : NULL, .hide_ext = options ? options->hide_ext : true, .skip_assets = options ? options->skip_assets : true, + .hide_dot_files = options ? options->hide_dot_files : true, .preselected_filename = path, .item_callback = options ? options->item_loader_callback : NULL, .item_callback_context = options ? options->item_loader_context : NULL, diff --git a/applications/services/dialogs/dialogs_message.h b/applications/services/dialogs/dialogs_message.h index d01c5aa9c..45d36ba17 100644 --- a/applications/services/dialogs/dialogs_message.h +++ b/applications/services/dialogs/dialogs_message.h @@ -11,6 +11,7 @@ typedef struct { const char* extension; bool skip_assets; bool hide_ext; + bool hide_dot_files; const Icon* file_icon; FuriString* result_path; FuriString* preselected_filename; diff --git a/applications/services/dialogs/dialogs_module_file_browser.c b/applications/services/dialogs/dialogs_module_file_browser.c index 7e67d6c60..e03434cf5 100644 --- a/applications/services/dialogs/dialogs_module_file_browser.c +++ b/applications/services/dialogs/dialogs_module_file_browser.c @@ -38,7 +38,12 @@ bool dialogs_app_process_module_file_browser(const DialogsAppMessageDataFileBrow file_browser_set_callback( file_browser, dialogs_app_file_browser_callback, file_browser_context); file_browser_configure( - file_browser, data->extension, data->skip_assets, data->file_icon, data->hide_ext); + file_browser, + data->extension, + data->skip_assets, + data->hide_dot_files, + data->file_icon, + data->hide_ext); file_browser_set_item_callback(file_browser, data->item_callback, data->item_callback_context); file_browser_start(file_browser, data->preselected_filename); diff --git a/applications/services/gui/modules/file_browser.c b/applications/services/gui/modules/file_browser.c index 203be23ed..f20f950fa 100644 --- a/applications/services/gui/modules/file_browser.c +++ b/applications/services/gui/modules/file_browser.c @@ -84,6 +84,7 @@ struct FileBrowser { BrowserWorker* worker; const char* ext_filter; bool skip_assets; + bool hide_dot_files; bool hide_ext; FileBrowserCallback callback; @@ -163,6 +164,7 @@ void file_browser_configure( FileBrowser* browser, const char* extension, bool skip_assets, + bool hide_dot_files, const Icon* file_icon, bool hide_ext) { furi_assert(browser); @@ -170,6 +172,7 @@ void file_browser_configure( browser->ext_filter = extension; browser->skip_assets = skip_assets; browser->hide_ext = hide_ext; + browser->hide_dot_files = hide_dot_files; with_view_model( browser->view, @@ -183,7 +186,8 @@ void file_browser_configure( void file_browser_start(FileBrowser* browser, FuriString* path) { furi_assert(browser); - browser->worker = file_browser_worker_alloc(path, browser->ext_filter, browser->skip_assets); + browser->worker = file_browser_worker_alloc( + path, browser->ext_filter, browser->skip_assets, browser->hide_dot_files); file_browser_worker_set_callback_context(browser->worker, browser); file_browser_worker_set_folder_callback(browser->worker, browser_folder_open_cb); file_browser_worker_set_list_callback(browser->worker, browser_list_load_cb); diff --git a/applications/services/gui/modules/file_browser.h b/applications/services/gui/modules/file_browser.h index c9fdddb55..377d4d9bc 100644 --- a/applications/services/gui/modules/file_browser.h +++ b/applications/services/gui/modules/file_browser.h @@ -30,6 +30,7 @@ void file_browser_configure( FileBrowser* browser, const char* extension, bool skip_assets, + bool hide_dot_files, const Icon* file_icon, bool hide_ext); diff --git a/applications/services/gui/modules/file_browser_worker.c b/applications/services/gui/modules/file_browser_worker.c index a85a14b75..fb45a384e 100644 --- a/applications/services/gui/modules/file_browser_worker.c +++ b/applications/services/gui/modules/file_browser_worker.c @@ -42,6 +42,7 @@ struct BrowserWorker { uint32_t load_offset; uint32_t load_count; bool skip_assets; + bool hide_dot_files; idx_last_array_t idx_last; void* cb_ctx; @@ -76,6 +77,13 @@ static bool browser_path_trim(FuriString* path) { } static bool browser_filter_by_name(BrowserWorker* browser, FuriString* name, bool is_folder) { + // Skip dot files if enabled + if(browser->hide_dot_files) { + if(furi_string_start_with_str(name, ".")) { + return false; + } + } + if(is_folder) { // Skip assets folders (if enabled) if(browser->skip_assets) { @@ -361,14 +369,18 @@ static int32_t browser_worker(void* context) { return 0; } -BrowserWorker* - file_browser_worker_alloc(FuriString* path, const char* filter_ext, bool skip_assets) { +BrowserWorker* file_browser_worker_alloc( + FuriString* path, + const char* filter_ext, + bool skip_assets, + bool hide_dot_files) { BrowserWorker* browser = malloc(sizeof(BrowserWorker)); //-V773 idx_last_array_init(browser->idx_last); browser->filter_extension = furi_string_alloc_set(filter_ext); browser->skip_assets = skip_assets; + browser->hide_dot_files = hide_dot_files; browser->path_start = furi_string_alloc_set(path); browser->path_current = furi_string_alloc_set(path); browser->path_next = furi_string_alloc_set(path); @@ -437,11 +449,13 @@ void file_browser_worker_set_config( BrowserWorker* browser, FuriString* path, const char* filter_ext, - bool skip_assets) { + bool skip_assets, + bool hide_dot_files) { furi_assert(browser); furi_string_set(browser->path_next, path); furi_string_set(browser->filter_extension, filter_ext); browser->skip_assets = skip_assets; + browser->hide_dot_files = hide_dot_files; furi_thread_flags_set(furi_thread_get_id(browser->thread), WorkerEvtConfigChange); } diff --git a/applications/services/gui/modules/file_browser_worker.h b/applications/services/gui/modules/file_browser_worker.h index 2f8155401..ca143d660 100644 --- a/applications/services/gui/modules/file_browser_worker.h +++ b/applications/services/gui/modules/file_browser_worker.h @@ -21,8 +21,11 @@ typedef void (*BrowserWorkerListItemCallback)( bool is_last); typedef void (*BrowserWorkerLongLoadCallback)(void* context); -BrowserWorker* - file_browser_worker_alloc(FuriString* path, const char* filter_ext, bool skip_assets); +BrowserWorker* file_browser_worker_alloc( + FuriString* path, + const char* filter_ext, + bool skip_assets, + bool hide_dot_files); void file_browser_worker_free(BrowserWorker* browser); @@ -48,7 +51,8 @@ void file_browser_worker_set_config( BrowserWorker* browser, FuriString* path, const char* filter_ext, - bool skip_assets); + bool skip_assets, + bool hide_dot_files); void file_browser_worker_folder_enter(BrowserWorker* browser, FuriString* path, int32_t item_idx); diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 0f00ca908..38f21902d 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,8.1,, +Version,+,9.0,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/cli/cli.h,, Header,+,applications/services/cli/cli_vcp.h,, @@ -806,14 +806,14 @@ Function,-,fgetpos,int,"FILE*, fpos_t*" Function,-,fgets,char*,"char*, int, FILE*" Function,-,fgets_unlocked,char*,"char*, int, FILE*" Function,+,file_browser_alloc,FileBrowser*,FuriString* -Function,+,file_browser_configure,void,"FileBrowser*, const char*, _Bool, const Icon*, _Bool" +Function,+,file_browser_configure,void,"FileBrowser*, const char*, _Bool, _Bool, const Icon*, _Bool" Function,+,file_browser_free,void,FileBrowser* Function,+,file_browser_get_view,View*,FileBrowser* Function,+,file_browser_set_callback,void,"FileBrowser*, FileBrowserCallback, void*" Function,+,file_browser_set_item_callback,void,"FileBrowser*, FileBrowserLoadItemCallback, void*" Function,+,file_browser_start,void,"FileBrowser*, FuriString*" Function,+,file_browser_stop,void,FileBrowser* -Function,+,file_browser_worker_alloc,BrowserWorker*,"FuriString*, const char*, _Bool" +Function,+,file_browser_worker_alloc,BrowserWorker*,"FuriString*, const char*, _Bool, _Bool" Function,+,file_browser_worker_folder_enter,void,"BrowserWorker*, FuriString*, int32_t" Function,+,file_browser_worker_folder_exit,void,BrowserWorker* Function,+,file_browser_worker_folder_refresh,void,"BrowserWorker*, int32_t" @@ -821,7 +821,7 @@ Function,+,file_browser_worker_free,void,BrowserWorker* Function,+,file_browser_worker_is_in_start_folder,_Bool,BrowserWorker* Function,+,file_browser_worker_load,void,"BrowserWorker*, uint32_t, uint32_t" Function,+,file_browser_worker_set_callback_context,void,"BrowserWorker*, void*" -Function,+,file_browser_worker_set_config,void,"BrowserWorker*, FuriString*, const char*, _Bool" +Function,+,file_browser_worker_set_config,void,"BrowserWorker*, FuriString*, const char*, _Bool, _Bool" Function,+,file_browser_worker_set_folder_callback,void,"BrowserWorker*, BrowserWorkerFolderOpenCallback" Function,+,file_browser_worker_set_item_callback,void,"BrowserWorker*, BrowserWorkerListItemCallback" Function,+,file_browser_worker_set_list_callback,void,"BrowserWorker*, BrowserWorkerListLoadCallback" diff --git a/firmware/targets/f7/furi_hal/furi_hal_nfc.c b/firmware/targets/f7/furi_hal/furi_hal_nfc.c index 2d27313ae..75c695afb 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_nfc.c +++ b/firmware/targets/f7/furi_hal/furi_hal_nfc.c @@ -244,6 +244,9 @@ bool furi_hal_nfc_listen( params.lmConfigPA.SEL_RES = sak; rfalNfcDiscover(¶ms); + // Disable EMD suppression. + st25r3916ModifyRegister(ST25R3916_REG_EMD_SUP_CONF, ST25R3916_REG_EMD_SUP_CONF_emd_emv, 0); + uint32_t start = DWT->CYCCNT; while(state != RFAL_NFC_STATE_ACTIVATED) { rfalNfcWorker(); diff --git a/lib/nfc/nfc_device.c b/lib/nfc/nfc_device.c index dc1faa34c..e18f09459 100644 --- a/lib/nfc/nfc_device.c +++ b/lib/nfc/nfc_device.c @@ -8,11 +8,11 @@ #include #define TAG "NfcDevice" -#define NFC_DEVICE_KEYS_FOLDER EXT_PATH("nfc/cache") +#define NFC_DEVICE_KEYS_FOLDER EXT_PATH("nfc/.cache") #define NFC_DEVICE_KEYS_EXTENSION ".keys" static const char* nfc_file_header = "Flipper NFC device"; -static const uint32_t nfc_file_version = 2; +static const uint32_t nfc_file_version = 3; static const char* nfc_keys_file_header = "Flipper NFC keys"; static const uint32_t nfc_keys_file_version = 1; @@ -27,6 +27,11 @@ NfcDevice* nfc_device_alloc() { nfc_dev->dialogs = furi_record_open(RECORD_DIALOGS); nfc_dev->load_path = furi_string_alloc(); nfc_dev->dev_data.parsed_data = furi_string_alloc(); + + // Rename cache folder name for backward compatibility + if(storage_common_stat(nfc_dev->storage, "/ext/nfc/cache", NULL) == FSE_OK) { + storage_common_rename(nfc_dev->storage, "/ext/nfc/cache", NFC_DEVICE_KEYS_FOLDER); + } return nfc_dev; } @@ -1041,7 +1046,9 @@ bool nfc_device_save(NfcDevice* dev, const char* dev_name) { if(!flipper_format_write_comment_cstr(file, "UID, ATQA and SAK are common for all formats")) break; if(!flipper_format_write_hex(file, "UID", data->uid, data->uid_len)) break; - if(!flipper_format_write_hex(file, "ATQA", data->atqa, 2)) break; + // Save ATQA in MSB order for correct companion apps display + uint8_t atqa[2] = {data->atqa[1], data->atqa[0]}; + if(!flipper_format_write_hex(file, "ATQA", atqa, 2)) break; if(!flipper_format_write_hex(file, "SAK", &data->sak, 1)) break; // Save more data if necessary if(dev->format == NfcDeviceSaveFormatMifareUl) { @@ -1089,6 +1096,9 @@ static bool nfc_device_load_data(NfcDevice* dev, FuriString* path, bool show_dia temp_str = furi_string_alloc(); bool deprecated_version = false; + // Version 2 of file format had ATQA bytes swapped + uint32_t version_with_lsb_atqa = 2; + if(dev->loading_cb) { dev->loading_cb(dev->loading_cb_ctx, true); } @@ -1107,9 +1117,12 @@ static bool nfc_device_load_data(NfcDevice* dev, FuriString* path, bool show_dia // Read and verify file header uint32_t version = 0; if(!flipper_format_read_header(file, temp_str, &version)) break; - if(furi_string_cmp_str(temp_str, nfc_file_header) || (version != nfc_file_version)) { - deprecated_version = true; - break; + if(furi_string_cmp_str(temp_str, nfc_file_header)) break; + if(version != nfc_file_version) { + if(version < version_with_lsb_atqa) { + deprecated_version = true; + break; + } } // Read Nfc device type if(!flipper_format_read_string(file, "Device type", temp_str)) break; @@ -1119,7 +1132,14 @@ static bool nfc_device_load_data(NfcDevice* dev, FuriString* path, bool show_dia if(!(data_cnt == 4 || data_cnt == 7)) break; data->uid_len = data_cnt; if(!flipper_format_read_hex(file, "UID", data->uid, data->uid_len)) break; - if(!flipper_format_read_hex(file, "ATQA", data->atqa, 2)) break; + if(version == version_with_lsb_atqa) { + if(!flipper_format_read_hex(file, "ATQA", data->atqa, 2)) break; + } else { + uint8_t atqa[2] = {}; + if(!flipper_format_read_hex(file, "ATQA", atqa, 2)) break; + data->atqa[0] = atqa[1]; + data->atqa[1] = atqa[0]; + } if(!flipper_format_read_hex(file, "SAK", &data->sak, 1)) break; // Load CUID uint8_t* cuid_start = data->uid; @@ -1187,6 +1207,7 @@ bool nfc_file_select(NfcDevice* dev) { const DialogsFileBrowserOptions browser_options = { .extension = NFC_APP_EXTENSION, .skip_assets = true, + .hide_dot_files = true, .icon = &I_Nfc_10px, .hide_ext = true, .item_loader_callback = NULL, diff --git a/lib/nfc/protocols/mifare_classic.c b/lib/nfc/protocols/mifare_classic.c index b7a52bc01..f4c7353a8 100644 --- a/lib/nfc/protocols/mifare_classic.c +++ b/lib/nfc/protocols/mifare_classic.c @@ -712,46 +712,16 @@ uint8_t mf_classic_update_card(FuriHalNfcTxRxContext* tx_rx, MfClassicData* data furi_assert(tx_rx); furi_assert(data); - uint8_t sectors_read = 0; - Crypto1 crypto = {}; uint8_t total_sectors = mf_classic_get_total_sectors_num(data->type); - uint64_t key_a = 0; - uint64_t key_b = 0; - MfClassicSectorReader sec_reader = {}; - MfClassicSector temp_sector = {}; for(size_t i = 0; i < total_sectors; i++) { - MfClassicSectorTrailer* sec_tr = mf_classic_get_sector_trailer_by_sector(data, i); - // Load key A - if(mf_classic_is_key_found(data, i, MfClassicKeyA)) { - sec_reader.key_a = nfc_util_bytes2num(sec_tr->key_a, 6); - } else { - sec_reader.key_a = MF_CLASSIC_NO_KEY; - } - // Load key B - if(mf_classic_is_key_found(data, i, MfClassicKeyB)) { - sec_reader.key_b = nfc_util_bytes2num(sec_tr->key_b, 6); - } else { - sec_reader.key_b = MF_CLASSIC_NO_KEY; - } - if((key_a != MF_CLASSIC_NO_KEY) || (key_b != MF_CLASSIC_NO_KEY)) { - sec_reader.sector_num = i; - if(mf_classic_read_sector_with_reader(tx_rx, &crypto, &sec_reader, &temp_sector)) { - uint8_t first_block = mf_classic_get_first_block_num_of_sector(i); - for(uint8_t j = 0; j < temp_sector.total_blocks; j++) { - mf_classic_set_block_read(data, first_block + j, &temp_sector.block[j]); - } - sectors_read++; - } else { - // Invalid key, set it to not found - if(key_a != MF_CLASSIC_NO_KEY) { - mf_classic_set_key_not_found(data, i, MfClassicKeyA); - } else { - mf_classic_set_key_not_found(data, i, MfClassicKeyB); - } - } - } + mf_classic_read_sector(tx_rx, data, i); } + uint8_t sectors_read = 0; + uint8_t keys_found = 0; + mf_classic_get_read_sectors_and_keys(data, §ors_read, &keys_found); + FURI_LOG_D(TAG, "Read %d sectors and %d keys", sectors_read, keys_found); + return sectors_read; } From e42dda7cfb43a561b66bd60f9798ec864cc3f6fc Mon Sep 17 00:00:00 2001 From: 0xchocolate <109879152+0xchocolate@users.noreply.github.com> Date: Wed, 7 Dec 2022 03:46:50 -0800 Subject: [PATCH 5/8] UART echo: fix race conditions causing null pointer dereference (#2092) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 0xchocolate <0xchocolate@users.noreply.github.com> Co-authored-by: あく --- applications/debug/uart_echo/uart_echo.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/applications/debug/uart_echo/uart_echo.c b/applications/debug/uart_echo/uart_echo.c index 16996ba8c..dc1327529 100644 --- a/applications/debug/uart_echo/uart_echo.c +++ b/applications/debug/uart_echo/uart_echo.c @@ -215,26 +215,26 @@ static UartEchoApp* uart_echo_app_alloc() { view_dispatcher_add_view(app->view_dispatcher, 0, app->view); view_dispatcher_switch_to_view(app->view_dispatcher, 0); + app->worker_thread = furi_thread_alloc_ex("UsbUartWorker", 1024, uart_echo_worker, app); + furi_thread_start(app->worker_thread); + // Enable uart listener furi_hal_console_disable(); furi_hal_uart_set_br(FuriHalUartIdUSART1, 115200); furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, uart_echo_on_irq_cb, app); - app->worker_thread = furi_thread_alloc_ex("UsbUartWorker", 1024, uart_echo_worker, app); - furi_thread_start(app->worker_thread); - return app; } static void uart_echo_app_free(UartEchoApp* app) { furi_assert(app); + furi_hal_console_enable(); // this will also clear IRQ callback so thread is no longer referenced + furi_thread_flags_set(furi_thread_get_id(app->worker_thread), WorkerEventStop); furi_thread_join(app->worker_thread); furi_thread_free(app->worker_thread); - furi_hal_console_enable(); - // Free views view_dispatcher_remove_view(app->view_dispatcher, 0); From 741ad34b2c6c7ad08056e1d4f83026a21c4b8fa2 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Wed, 7 Dec 2022 16:28:18 +0300 Subject: [PATCH 6/8] WS: Oregon2 - add support for temp sensor RTHN129 (#2088) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: あく --- .../weather_station/protocols/oregon2.c | 37 ++++++++++++++----- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/applications/plugins/weather_station/protocols/oregon2.c b/applications/plugins/weather_station/protocols/oregon2.c index d294548e6..8779e9596 100644 --- a/applications/plugins/weather_station/protocols/oregon2.c +++ b/applications/plugins/weather_station/protocols/oregon2.c @@ -52,6 +52,11 @@ static const SubGhzBlockConst ws_oregon2_const = { #define ID_UV800 0xd874 #define ID_THN129 0xcc43 // THN129 Temp only #define ID_RTHN129 0x0cd3 // RTHN129 Temp, clock sensors +#define ID_RTHN129_1 0x9cd3 +#define ID_RTHN129_2 0xacd3 +#define ID_RTHN129_3 0xbcd3 +#define ID_RTHN129_4 0xccd3 +#define ID_RTHN129_5 0xdcd3 #define ID_BTHGN129 0x5d53 // Baro, Temp, Hygro sensor #define ID_UVR128 0xec70 #define ID_THGR328N 0xcc23 // Temp & Hygro sensor similar to THR228N with 5 channel instead of 3 @@ -137,11 +142,19 @@ static ManchesterEvent level_and_duration_to_event(bool level, uint32_t duration // From sensor id code return amount of bits in variable section // https://temofeev.ru/info/articles/o-dekodirovanii-protokola-pogodnykh-datchikov-oregon-scientific static uint8_t oregon2_sensor_id_var_bits(uint16_t sensor_id) { - if(sensor_id == ID_THR228N) return 16; - - if(sensor_id == ID_THGR122N) return 24; - - return 0; + switch(sensor_id) { + case ID_THR228N: + case ID_RTHN129_1: + case ID_RTHN129_2: + case ID_RTHN129_3: + case ID_RTHN129_4: + case ID_RTHN129_5: + return 16; + case ID_THGR122N: + return 24; + default: + return 0; + } } static void ws_oregon2_decode_const_data(WSBlockGeneric* ws_block) { @@ -171,16 +184,22 @@ static float ws_oregon2_decode_temp(uint32_t data) { } static void ws_oregon2_decode_var_data(WSBlockGeneric* ws_b, uint16_t sensor_id, uint32_t data) { - if(sensor_id == ID_THR228N) { + switch(sensor_id) { + case ID_THR228N: + case ID_RTHN129_1: + case ID_RTHN129_2: + case ID_RTHN129_3: + case ID_RTHN129_4: + case ID_RTHN129_5: ws_b->temp = ws_oregon2_decode_temp(data); ws_b->humidity = WS_NO_HUMIDITY; return; - } - - if(sensor_id == ID_THGR122N) { + case ID_THGR122N: ws_b->humidity = bcd_decode_short(data); ws_b->temp = ws_oregon2_decode_temp(data >> 8); return; + default: + break; } } From 2daf39018bcbdc62d4b34ecffd75d22d365a3334 Mon Sep 17 00:00:00 2001 From: Nikolay Minaylov Date: Wed, 7 Dec 2022 17:17:41 +0300 Subject: [PATCH 7/8] [FL-3001] File browser base folder (#2091) * File browser base folder * Format sources * FuriHal: bump api version Co-authored-by: Aleksandr Kutuzov --- applications/debug/file_browser_test/file_browser_app.c | 2 +- applications/main/archive/helpers/archive_browser.c | 3 ++- .../main/bad_usb/scenes/bad_usb_scene_file_select.c | 2 ++ applications/main/fap_loader/fap_loader_app.c | 1 + applications/main/ibutton/ibutton.c | 1 + .../main/infrared/scenes/infrared_scene_remote_list.c | 1 + applications/main/lfrfid/lfrfid.c | 1 + applications/main/subghz/subghz_i.c | 1 + applications/plugins/music_player/music_player.c | 1 + applications/plugins/picopass/picopass_device.c | 1 + applications/services/dialogs/dialogs.c | 1 + applications/services/dialogs/dialogs.h | 2 ++ applications/services/dialogs/dialogs_api.c | 1 + applications/services/dialogs/dialogs_message.h | 1 + .../services/dialogs/dialogs_module_file_browser.c | 1 + applications/services/gui/modules/file_browser.c | 9 ++++++++- applications/services/gui/modules/file_browser.h | 1 + applications/services/gui/modules/file_browser_worker.c | 8 +++++--- applications/services/gui/modules/file_browser_worker.h | 1 + .../scenes/desktop_settings_scene_favorite.c | 1 + firmware/targets/f7/api_symbols.csv | 6 +++--- lib/nfc/nfc_device.c | 1 + 22 files changed, 38 insertions(+), 9 deletions(-) diff --git a/applications/debug/file_browser_test/file_browser_app.c b/applications/debug/file_browser_test/file_browser_app.c index 6cb50d385..996cb2bd2 100644 --- a/applications/debug/file_browser_test/file_browser_app.c +++ b/applications/debug/file_browser_test/file_browser_app.c @@ -48,7 +48,7 @@ FileBrowserApp* file_browser_app_alloc(char* arg) { app->file_path = furi_string_alloc(); app->file_browser = file_browser_alloc(app->file_path); - file_browser_configure(app->file_browser, "*", true, &I_badusb_10px, true); + file_browser_configure(app->file_browser, "*", NULL, true, &I_badusb_10px, true); view_dispatcher_add_view( app->view_dispatcher, FileBrowserAppViewStart, widget_get_view(app->widget)); diff --git a/applications/main/archive/helpers/archive_browser.c b/applications/main/archive/helpers/archive_browser.c index fa705189f..a216705b7 100644 --- a/applications/main/archive/helpers/archive_browser.c +++ b/applications/main/archive/helpers/archive_browser.c @@ -84,7 +84,8 @@ static void archive_file_browser_set_path( bool hide_dot_files) { furi_assert(browser); if(!browser->worker_running) { - browser->worker = file_browser_worker_alloc(path, filter_ext, skip_assets, hide_dot_files); + browser->worker = + file_browser_worker_alloc(path, NULL, filter_ext, skip_assets, hide_dot_files); file_browser_worker_set_callback_context(browser->worker, browser); file_browser_worker_set_folder_callback(browser->worker, archive_folder_open_cb); file_browser_worker_set_list_callback(browser->worker, archive_list_load_cb); diff --git a/applications/main/bad_usb/scenes/bad_usb_scene_file_select.c b/applications/main/bad_usb/scenes/bad_usb_scene_file_select.c index c562fc2de..9264eb976 100644 --- a/applications/main/bad_usb/scenes/bad_usb_scene_file_select.c +++ b/applications/main/bad_usb/scenes/bad_usb_scene_file_select.c @@ -1,12 +1,14 @@ #include "../bad_usb_app_i.h" #include "furi_hal_power.h" #include "furi_hal_usb.h" +#include static bool bad_usb_file_select(BadUsbApp* bad_usb) { furi_assert(bad_usb); DialogsFileBrowserOptions browser_options; dialog_file_browser_set_basic_options(&browser_options, BAD_USB_APP_EXTENSION, &I_badusb_10px); + browser_options.base_path = BAD_USB_APP_PATH_FOLDER; // Input events and views are managed by file_browser bool res = dialog_file_browser_show( diff --git a/applications/main/fap_loader/fap_loader_app.c b/applications/main/fap_loader/fap_loader_app.c index 10cec086a..901866746 100644 --- a/applications/main/fap_loader/fap_loader_app.c +++ b/applications/main/fap_loader/fap_loader_app.c @@ -148,6 +148,7 @@ static bool fap_loader_select_app(FapLoader* loader) { .hide_ext = true, .item_loader_callback = fap_loader_item_callback, .item_loader_context = loader, + .base_path = EXT_PATH("apps"), }; return dialog_file_browser_show( diff --git a/applications/main/ibutton/ibutton.c b/applications/main/ibutton/ibutton.c index b6d8361b3..b7c8223b0 100644 --- a/applications/main/ibutton/ibutton.c +++ b/applications/main/ibutton/ibutton.c @@ -218,6 +218,7 @@ void ibutton_free(iButton* ibutton) { bool ibutton_file_select(iButton* ibutton) { DialogsFileBrowserOptions browser_options; dialog_file_browser_set_basic_options(&browser_options, IBUTTON_APP_EXTENSION, &I_ibutt_10px); + browser_options.base_path = IBUTTON_APP_FOLDER; bool success = dialog_file_browser_show( ibutton->dialogs, ibutton->file_path, ibutton->file_path, &browser_options); diff --git a/applications/main/infrared/scenes/infrared_scene_remote_list.c b/applications/main/infrared/scenes/infrared_scene_remote_list.c index 1667352d1..55f14416b 100644 --- a/applications/main/infrared/scenes/infrared_scene_remote_list.c +++ b/applications/main/infrared/scenes/infrared_scene_remote_list.c @@ -7,6 +7,7 @@ void infrared_scene_remote_list_on_enter(void* context) { DialogsFileBrowserOptions browser_options; dialog_file_browser_set_basic_options(&browser_options, INFRARED_APP_EXTENSION, &I_ir_10px); + browser_options.base_path = INFRARED_APP_FOLDER; bool success = dialog_file_browser_show( infrared->dialogs, infrared->file_path, infrared->file_path, &browser_options); diff --git a/applications/main/lfrfid/lfrfid.c b/applications/main/lfrfid/lfrfid.c index d391c5e89..2207e7e07 100644 --- a/applications/main/lfrfid/lfrfid.c +++ b/applications/main/lfrfid/lfrfid.c @@ -230,6 +230,7 @@ bool lfrfid_load_key_from_file_select(LfRfid* app) { DialogsFileBrowserOptions browser_options; dialog_file_browser_set_basic_options(&browser_options, LFRFID_APP_EXTENSION, &I_125_10px); + browser_options.base_path = LFRFID_APP_FOLDER; // Input events and views are managed by file_browser bool result = diff --git a/applications/main/subghz/subghz_i.c b/applications/main/subghz/subghz_i.c index d9070ba8c..736bcf360 100644 --- a/applications/main/subghz/subghz_i.c +++ b/applications/main/subghz/subghz_i.c @@ -454,6 +454,7 @@ bool subghz_load_protocol_from_file(SubGhz* subghz) { DialogsFileBrowserOptions browser_options; dialog_file_browser_set_basic_options(&browser_options, SUBGHZ_APP_EXTENSION, &I_sub1_10px); + browser_options.base_path = SUBGHZ_APP_FOLDER; // Input events and views are managed by file_select bool res = dialog_file_browser_show( diff --git a/applications/plugins/music_player/music_player.c b/applications/plugins/music_player/music_player.c index 28872284b..07d4e2df4 100644 --- a/applications/plugins/music_player/music_player.c +++ b/applications/plugins/music_player/music_player.c @@ -313,6 +313,7 @@ int32_t music_player_app(void* p) { dialog_file_browser_set_basic_options( &browser_options, MUSIC_PLAYER_APP_EXTENSION, &I_music_10px); browser_options.hide_ext = false; + browser_options.base_path = MUSIC_PLAYER_APP_PATH_FOLDER; DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); bool res = dialog_file_browser_show(dialogs, file_path, file_path, &browser_options); diff --git a/applications/plugins/picopass/picopass_device.c b/applications/plugins/picopass/picopass_device.c index 199b79e97..fd8ddbfbd 100644 --- a/applications/plugins/picopass/picopass_device.c +++ b/applications/plugins/picopass/picopass_device.c @@ -231,6 +231,7 @@ bool picopass_file_select(PicopassDevice* dev) { DialogsFileBrowserOptions browser_options; dialog_file_browser_set_basic_options(&browser_options, PICOPASS_APP_EXTENSION, &I_Nfc_10px); + browser_options.base_path = PICOPASS_APP_FOLDER; bool res = dialog_file_browser_show( dev->dialogs, dev->load_path, picopass_app_folder, &browser_options); diff --git a/applications/services/dialogs/dialogs.c b/applications/services/dialogs/dialogs.c index 3c6588889..3908ca31b 100644 --- a/applications/services/dialogs/dialogs.c +++ b/applications/services/dialogs/dialogs.c @@ -14,6 +14,7 @@ void dialog_file_browser_set_basic_options( options->hide_ext = true; options->item_loader_callback = NULL; options->item_loader_context = NULL; + options->base_path = NULL; } static DialogsApp* dialogs_app_alloc() { diff --git a/applications/services/dialogs/dialogs.h b/applications/services/dialogs/dialogs.h index 97783eb0d..4c1b675a6 100644 --- a/applications/services/dialogs/dialogs.h +++ b/applications/services/dialogs/dialogs.h @@ -18,6 +18,7 @@ typedef struct DialogsApp DialogsApp; /** * File browser dialog extra options * @param extension file extension to be offered for selection + * @param base_path root folder path for navigation with back key * @param skip_assets true - do not show assets folders * @param hide_dot_files true - hide dot files * @param icon file icon pointer, NULL for default icon @@ -27,6 +28,7 @@ typedef struct DialogsApp DialogsApp; */ typedef struct { const char* extension; + const char* base_path; bool skip_assets; bool hide_dot_files; const Icon* icon; diff --git a/applications/services/dialogs/dialogs_api.c b/applications/services/dialogs/dialogs_api.c index 91b3a1d04..5e2b0683e 100644 --- a/applications/services/dialogs/dialogs_api.c +++ b/applications/services/dialogs/dialogs_api.c @@ -24,6 +24,7 @@ bool dialog_file_browser_show( .preselected_filename = path, .item_callback = options ? options->item_loader_callback : NULL, .item_callback_context = options ? options->item_loader_context : NULL, + .base_path = options ? options->base_path : NULL, }}; DialogsAppReturn return_data; diff --git a/applications/services/dialogs/dialogs_message.h b/applications/services/dialogs/dialogs_message.h index 45d36ba17..1c8c4fb50 100644 --- a/applications/services/dialogs/dialogs_message.h +++ b/applications/services/dialogs/dialogs_message.h @@ -17,6 +17,7 @@ typedef struct { FuriString* preselected_filename; FileBrowserLoadItemCallback item_callback; void* item_callback_context; + const char* base_path; } DialogsAppMessageDataFileBrowser; typedef struct { diff --git a/applications/services/dialogs/dialogs_module_file_browser.c b/applications/services/dialogs/dialogs_module_file_browser.c index e03434cf5..8d486dbaf 100644 --- a/applications/services/dialogs/dialogs_module_file_browser.c +++ b/applications/services/dialogs/dialogs_module_file_browser.c @@ -40,6 +40,7 @@ bool dialogs_app_process_module_file_browser(const DialogsAppMessageDataFileBrow file_browser_configure( file_browser, data->extension, + data->base_path, data->skip_assets, data->hide_dot_files, data->file_icon, diff --git a/applications/services/gui/modules/file_browser.c b/applications/services/gui/modules/file_browser.c index f20f950fa..a5daa91ec 100644 --- a/applications/services/gui/modules/file_browser.c +++ b/applications/services/gui/modules/file_browser.c @@ -83,6 +83,7 @@ struct FileBrowser { View* view; BrowserWorker* worker; const char* ext_filter; + const char* base_path; bool skip_assets; bool hide_dot_files; bool hide_ext; @@ -163,6 +164,7 @@ View* file_browser_get_view(FileBrowser* browser) { void file_browser_configure( FileBrowser* browser, const char* extension, + const char* base_path, bool skip_assets, bool hide_dot_files, const Icon* file_icon, @@ -172,6 +174,7 @@ void file_browser_configure( browser->ext_filter = extension; browser->skip_assets = skip_assets; browser->hide_ext = hide_ext; + browser->base_path = base_path; browser->hide_dot_files = hide_dot_files; with_view_model( @@ -187,7 +190,11 @@ void file_browser_configure( void file_browser_start(FileBrowser* browser, FuriString* path) { furi_assert(browser); browser->worker = file_browser_worker_alloc( - path, browser->ext_filter, browser->skip_assets, browser->hide_dot_files); + path, + browser->base_path, + browser->ext_filter, + browser->skip_assets, + browser->hide_dot_files); file_browser_worker_set_callback_context(browser->worker, browser); file_browser_worker_set_folder_callback(browser->worker, browser_folder_open_cb); file_browser_worker_set_list_callback(browser->worker, browser_list_load_cb); diff --git a/applications/services/gui/modules/file_browser.h b/applications/services/gui/modules/file_browser.h index 377d4d9bc..879d62c4e 100644 --- a/applications/services/gui/modules/file_browser.h +++ b/applications/services/gui/modules/file_browser.h @@ -29,6 +29,7 @@ View* file_browser_get_view(FileBrowser* browser); void file_browser_configure( FileBrowser* browser, const char* extension, + const char* base_path, bool skip_assets, bool hide_dot_files, const Icon* file_icon, diff --git a/applications/services/gui/modules/file_browser_worker.c b/applications/services/gui/modules/file_browser_worker.c index fb45a384e..d8b515d03 100644 --- a/applications/services/gui/modules/file_browser_worker.c +++ b/applications/services/gui/modules/file_browser_worker.c @@ -371,6 +371,7 @@ static int32_t browser_worker(void* context) { BrowserWorker* file_browser_worker_alloc( FuriString* path, + const char* base_path, const char* filter_ext, bool skip_assets, bool hide_dot_files) { @@ -381,12 +382,13 @@ BrowserWorker* file_browser_worker_alloc( browser->filter_extension = furi_string_alloc_set(filter_ext); browser->skip_assets = skip_assets; browser->hide_dot_files = hide_dot_files; - browser->path_start = furi_string_alloc_set(path); + browser->path_current = furi_string_alloc_set(path); browser->path_next = furi_string_alloc_set(path); - if(browser_path_is_file(browser->path_start)) { - browser_path_trim(browser->path_start); + browser->path_start = furi_string_alloc(); + if(base_path) { + furi_string_set_str(browser->path_start, base_path); } browser->thread = furi_thread_alloc_ex("BrowserWorker", 2048, browser_worker, browser); diff --git a/applications/services/gui/modules/file_browser_worker.h b/applications/services/gui/modules/file_browser_worker.h index ca143d660..3b4be6aa7 100644 --- a/applications/services/gui/modules/file_browser_worker.h +++ b/applications/services/gui/modules/file_browser_worker.h @@ -23,6 +23,7 @@ typedef void (*BrowserWorkerLongLoadCallback)(void* context); BrowserWorker* file_browser_worker_alloc( FuriString* path, + const char* base_path, const char* filter_ext, bool skip_assets, bool hide_dot_files); diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c index bdd9589ed..cf474c546 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c @@ -106,6 +106,7 @@ bool desktop_settings_scene_favorite_on_event(void* context, SceneManagerEvent e .hide_ext = true, .item_loader_callback = favorite_fap_selector_item_callback, .item_loader_context = app, + .base_path = EXT_PATH("apps"), }; if(primary_favorite) { // Select favorite fap in file browser diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 38f21902d..1ce768450 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,9.0,, +Version,+,10.0,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/cli/cli.h,, Header,+,applications/services/cli/cli_vcp.h,, @@ -806,14 +806,14 @@ Function,-,fgetpos,int,"FILE*, fpos_t*" Function,-,fgets,char*,"char*, int, FILE*" Function,-,fgets_unlocked,char*,"char*, int, FILE*" Function,+,file_browser_alloc,FileBrowser*,FuriString* -Function,+,file_browser_configure,void,"FileBrowser*, const char*, _Bool, _Bool, const Icon*, _Bool" +Function,+,file_browser_configure,void,"FileBrowser*, const char*, const char*, _Bool, _Bool, const Icon*, _Bool" Function,+,file_browser_free,void,FileBrowser* Function,+,file_browser_get_view,View*,FileBrowser* Function,+,file_browser_set_callback,void,"FileBrowser*, FileBrowserCallback, void*" Function,+,file_browser_set_item_callback,void,"FileBrowser*, FileBrowserLoadItemCallback, void*" Function,+,file_browser_start,void,"FileBrowser*, FuriString*" Function,+,file_browser_stop,void,FileBrowser* -Function,+,file_browser_worker_alloc,BrowserWorker*,"FuriString*, const char*, _Bool, _Bool" +Function,+,file_browser_worker_alloc,BrowserWorker*,"FuriString*, const char*, const char*, _Bool, _Bool" Function,+,file_browser_worker_folder_enter,void,"BrowserWorker*, FuriString*, int32_t" Function,+,file_browser_worker_folder_exit,void,BrowserWorker* Function,+,file_browser_worker_folder_refresh,void,"BrowserWorker*, int32_t" diff --git a/lib/nfc/nfc_device.c b/lib/nfc/nfc_device.c index e18f09459..3ab10a4f6 100644 --- a/lib/nfc/nfc_device.c +++ b/lib/nfc/nfc_device.c @@ -1212,6 +1212,7 @@ bool nfc_file_select(NfcDevice* dev) { .hide_ext = true, .item_loader_callback = NULL, .item_loader_context = NULL, + .base_path = NFC_APP_FOLDER, }; bool res = From c535b8f4ceef1cae1f30a6754a0b59a36055e1e5 Mon Sep 17 00:00:00 2001 From: gornekich Date: Wed, 7 Dec 2022 20:47:55 +0400 Subject: [PATCH 8/8] [FL-3017], [FL-3018] Change NFC emulation screens (#2102) * nfc: fix emulate uid view * archive: hide dot files in apps * nfc: fix other emulation scenes view --- .../main/archive/helpers/archive_browser.c | 4 +++- .../main/nfc/scenes/nfc_scene_emulate_uid.c | 6 +++--- .../nfc/scenes/nfc_scene_mf_classic_emulate.c | 9 +++++---- .../nfc/scenes/nfc_scene_mf_ultralight_emulate.c | 14 ++++++++++---- applications/main/nfc/scenes/nfc_scene_rpc.c | 2 +- assets/icons/NFC/NFC_dolphin_emulation_47x61.png | Bin 0 -> 1541 bytes 6 files changed, 22 insertions(+), 13 deletions(-) create mode 100644 assets/icons/NFC/NFC_dolphin_emulation_47x61.png diff --git a/applications/main/archive/helpers/archive_browser.c b/applications/main/archive/helpers/archive_browser.c index a216705b7..6c8c9633a 100644 --- a/applications/main/archive/helpers/archive_browser.c +++ b/applications/main/archive/helpers/archive_browser.c @@ -475,8 +475,10 @@ void archive_switch_tab(ArchiveBrowserView* browser, InputKey key) { tab = archive_get_tab(browser); if(archive_is_dir_exists(browser->path)) { bool skip_assets = (strcmp(archive_get_tab_ext(tab), "*") == 0) ? false : true; + // Hide dot files everywhere except Browser + bool hide_dot_files = (strcmp(archive_get_tab_ext(tab), "*") == 0) ? false : true; archive_file_browser_set_path( - browser, browser->path, archive_get_tab_ext(tab), skip_assets, false); + browser, browser->path, archive_get_tab_ext(tab), skip_assets, hide_dot_files); tab_empty = false; // Empty check will be performed later } } diff --git a/applications/main/nfc/scenes/nfc_scene_emulate_uid.c b/applications/main/nfc/scenes/nfc_scene_emulate_uid.c index 5ddb60992..f90197679 100644 --- a/applications/main/nfc/scenes/nfc_scene_emulate_uid.c +++ b/applications/main/nfc/scenes/nfc_scene_emulate_uid.c @@ -37,8 +37,8 @@ static void nfc_scene_emulate_uid_widget_config(Nfc* nfc, bool data_received) { FuriString* info_str; info_str = furi_string_alloc(); - widget_add_icon_element(widget, 0, 3, &I_RFIDDolphinSend_97x61); - widget_add_string_element(widget, 89, 32, AlignCenter, AlignTop, FontPrimary, "Emulating UID"); + widget_add_icon_element(widget, 0, 3, &I_NFC_dolphin_emulation_47x61); + widget_add_string_element(widget, 57, 13, AlignLeft, AlignTop, FontPrimary, "Emulating UID"); if(strcmp(nfc->dev->dev_name, "")) { furi_string_printf(info_str, "%s", nfc->dev->dev_name); } else { @@ -48,7 +48,7 @@ static void nfc_scene_emulate_uid_widget_config(Nfc* nfc, bool data_received) { } furi_string_trim(info_str); widget_add_text_box_element( - widget, 56, 43, 70, 21, AlignCenter, AlignTop, furi_string_get_cstr(info_str), true); + widget, 57, 28, 67, 25, AlignCenter, AlignTop, furi_string_get_cstr(info_str), true); furi_string_free(info_str); if(data_received) { widget_add_button_element( diff --git a/applications/main/nfc/scenes/nfc_scene_mf_classic_emulate.c b/applications/main/nfc/scenes/nfc_scene_mf_classic_emulate.c index 68eda7040..1bd9a85a8 100644 --- a/applications/main/nfc/scenes/nfc_scene_mf_classic_emulate.c +++ b/applications/main/nfc/scenes/nfc_scene_mf_classic_emulate.c @@ -17,13 +17,14 @@ void nfc_scene_mf_classic_emulate_on_enter(void* context) { // Setup view Popup* popup = nfc->popup; + popup_set_header(popup, "Emulating", 67, 13, AlignLeft, AlignTop); if(strcmp(nfc->dev->dev_name, "")) { - nfc_text_store_set(nfc, "Emulating\n%s", nfc->dev->dev_name); + nfc_text_store_set(nfc, "%s", nfc->dev->dev_name); } else { - nfc_text_store_set(nfc, "Emulating\nMf Classic", nfc->dev->dev_name); + nfc_text_store_set(nfc, "MIFARE\nClassic"); } - popup_set_icon(popup, 0, 3, &I_RFIDDolphinSend_97x61); - popup_set_header(popup, nfc->text_store, 56, 31, AlignLeft, AlignTop); + popup_set_icon(popup, 0, 3, &I_NFC_dolphin_emulation_47x61); + popup_set_text(popup, nfc->text_store, 90, 28, AlignCenter, AlignTop); // Setup and start worker view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewPopup); diff --git a/applications/main/nfc/scenes/nfc_scene_mf_ultralight_emulate.c b/applications/main/nfc/scenes/nfc_scene_mf_ultralight_emulate.c index adcadaaf2..c9c617cbe 100644 --- a/applications/main/nfc/scenes/nfc_scene_mf_ultralight_emulate.c +++ b/applications/main/nfc/scenes/nfc_scene_mf_ultralight_emulate.c @@ -16,14 +16,20 @@ void nfc_scene_mf_ultralight_emulate_on_enter(void* context) { Nfc* nfc = context; // Setup view + MfUltralightType type = nfc->dev->dev_data.mf_ul_data.type; + bool is_ultralight = (type == MfUltralightTypeUL11) || (type == MfUltralightTypeUL21) || + (type == MfUltralightTypeUnknown); Popup* popup = nfc->popup; + popup_set_header(popup, "Emulating", 67, 13, AlignLeft, AlignTop); if(strcmp(nfc->dev->dev_name, "")) { - nfc_text_store_set(nfc, "Emulating\n%s", nfc->dev->dev_name); + nfc_text_store_set(nfc, "%s", nfc->dev->dev_name); + } else if(is_ultralight) { + nfc_text_store_set(nfc, "MIFARE\nUltralight"); } else { - nfc_text_store_set(nfc, "Emulating\nMf Ultralight", nfc->dev->dev_name); + nfc_text_store_set(nfc, "MIFARE\nNTAG"); } - popup_set_icon(popup, 0, 3, &I_RFIDDolphinSend_97x61); - popup_set_header(popup, nfc->text_store, 56, 31, AlignLeft, AlignTop); + popup_set_icon(popup, 0, 3, &I_NFC_dolphin_emulation_47x61); + popup_set_text(popup, nfc->text_store, 90, 28, AlignCenter, AlignTop); // Setup and start worker view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewPopup); diff --git a/applications/main/nfc/scenes/nfc_scene_rpc.c b/applications/main/nfc/scenes/nfc_scene_rpc.c index e5128a52f..60d01a30d 100644 --- a/applications/main/nfc/scenes/nfc_scene_rpc.c +++ b/applications/main/nfc/scenes/nfc_scene_rpc.c @@ -7,7 +7,7 @@ void nfc_scene_rpc_on_enter(void* context) { popup_set_header(popup, "NFC", 89, 42, AlignCenter, AlignBottom); popup_set_text(popup, "RPC mode", 89, 44, AlignCenter, AlignTop); - popup_set_icon(popup, 0, 12, &I_RFIDDolphinSend_97x61); + popup_set_icon(popup, 0, 12, &I_NFC_dolphin_emulation_47x61); view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewPopup); diff --git a/assets/icons/NFC/NFC_dolphin_emulation_47x61.png b/assets/icons/NFC/NFC_dolphin_emulation_47x61.png new file mode 100644 index 0000000000000000000000000000000000000000..1783531285bed514517fc0821501e718359dd765 GIT binary patch literal 1541 zcmaJ>eM}Q)7{3ZaLqs>76Ex1V5{uLJ`hl&zQLyxiR4J5Flue0VuU9zXKDZvVFu$in zjZPV|k*WB>lBo=wab{s;0v4vrHgq6yL6|@s=rj(*ZALe`w+OgD#xD2qyib0=-}CW4 z_wKW%tO^gC8wNp8xH$>4fiD6cy*LQG!v-3sLy!oej7F>3XoNYQby0aF1bI7aN-wPT zSzjw@m}hD^wN~8M!%5Suc^yp$% z;LAJvZZ<7U;$}9n&swkday_9{j$6k|(n<`UWz^qKx;6aE!&&NN(Msv}w)zef+FQ1w zPdX)Tbt_@>_j_ z1g4yN$-3nhg@rScIaE?HPo@{A*oop?Lg$pk$HB2)6bR6yfWuxok8z`3y<}7u1$MxV zNZ?V3kgJ!xNGj7}g^esv!dkgfMko{tSgVthPF&?syKrI|tWv0yh!WgdnNo|Y)TmMi zk6jWFkaxOJ8D8>lEl2;>9^cDOUul8V6b|{|}|<3A9_V zkuUT8Phq#ch$9gj>1GRf0_>e@Q6LnD8hH{ISl-UEdE_v6wo9ijB}kYxrRx(fq|eo5E&zRs*rRh@+=LHR*h1V=c1idZ;b1lJeL)dauJXW z64={+?e(||3{b$F7+$cL7=MxhGtYzJp6B{075o?>)?~ZM@Am^U<4XHBa7ryUV+Omo z^NSB}*9I*Vo3i}=cBw9McHOY`cJjO|@#%;8vhG*t42yEl!M7sbnHFlhs_u%cu{BLw zhaGH~)>1i`aAdfxzb-yDYp8axDf-aUrDb=dji35@J+L(5s-gM3W`<^_YQ(SZsXOZ| z+MW^|z2V5B)@@rgjw-Cq(dw%_ar$zq^bB!0SN!Wu`o1~8yPWDctj)SpoN(-94Cmev zzx{^qT>j%Hhc_onj|mkQqEx+SO=({jC(e}(-Mu#TV*2AZM;fP!-l&6{t3IlprLTNH zu7%|!`|gA}!?~;;lRx5Kde1<}Db&?0+p;8mU68o-2TkKA6-h@we_Yd@SR^HGPk zTw<~x)L!ghDi?=TUtd5z8164@t6%c>#|vtn#`%LIpusI7pJ(MpaIQm;*_49SCT!aE E4{AO|uK)l5 literal 0 HcmV?d00001