From aa9b9846ca91825af8c6eb4250b92b5918f5f5a2 Mon Sep 17 00:00:00 2001 From: hesukastro Date: Fri, 8 May 2026 15:09:54 +0800 Subject: [PATCH] allow single files in base64 scanner --- hpl-toolbox-0.1.1.vsix | Bin 62163 -> 63350 bytes src/tools/base64Scanner.ts | 73 ++++++++++++++++++++++++++++++++----- src/tools/dailyUpdate.ts | 1 + 3 files changed, 64 insertions(+), 10 deletions(-) diff --git a/hpl-toolbox-0.1.1.vsix b/hpl-toolbox-0.1.1.vsix index 6347af2d6d0301d16ca4bf6fae018ca93a9975ad..d837217183ce2cf3ca0800c49b46d8b43980b808 100644 GIT binary patch delta 11251 zcmZX)V{~TC7A^e5wr$(CZ5y3*Y^U?YPCB-2v(vFVR>!t&-R}20=Nsp}xBgU(wP&r` zW7QrtYVJAb_Q4)5z~GhTz`)S~0BC3cvsXQQKPV`(SK|!mD-tN9S0ZyJapMK5BFLX{ zqaZpT$ z_S)z~6^Q;+k#A4VD8BJ~q`7@opM@O=T>8n-_rZvgSkR_RvM8id9A5|@lr{6F#vFLH z#kw>6C|Ty0aKT7I2{QNL%z85H;)9g-;DK?a_9!EM@qoFy7VTYV&n@&$qPbmfA~cxW zbcdT=PSo;9_)`B_1Xb(Q*FX8b+@8*sk&b!LNRvug<5e7yZG86iQAk-13R?QRD*7NK z06>8Z0Q`SthW=CLR?o6ToFEQhGtR0rUh93fk<++qQwM8%5&_jNJyXU~0#&vX>i2W@ zx%?yWH3%7TIb%3uiG~D=7o>A}qZ_y9gh`OP4(&+Qv!?qXiJP@rZf@gKQE7x>VRZd+ zb#rt~)hd!Yqd=1|FKoE|Jh)~kns7rNY(Lw)#XM}I19iBMP{)k^YOyFFl(hu;M4(A& zB5VyiH3PZA7A~x~e3sz#cUQl`qaoEz0F#S3tNqm(Q@>)Eeawi&sM-WLl#234Aoa_B zqX*4))~~Blbw`EP9~ORH3rTd8PjYbKTR*^z@0~!sd*(e{&CFZuU}A;@pfx2v48wgH zTdvnqvF?cLV0#v2RS*_{mos%>J($RXtUt-()Ke3X_z3DmcVn7)4UgRr&9qhDV+;@T zNo>ua{e~J^*^AF2{p6BK<#17(cWHucnxl>RSvYmP{tWJG@|X#~lf)&NcMv;Y{kn(= zblT62iA${@E`K~u9$}+hu;Ld;M<5_+*eDBC8KgCn?e3k&&V&a>08ygD@Gw#n2H`^D z2*Jb61!kG`%F^u9XHV8+OHBqT0}IKt%e1WuR{hh;*(j|lLe@g!Ye%{|VDnw~OKgOV z$dT!z6&$p^Wg7D=T@`Tm9R&96`93!F^4bfa`1R`UW_eFyec;F-hJ-nTk5^`*EltrX zlb3vrl>LUJ8B>7yhe~~$Gg&1o?Lr_7aw~iQOCAjvdg&U(fNlz352(nHn~d@LG|(tW z#b?-3CyuCdRuej5u$F8*?&U3>Po&x7;Vx8t>MO3YQQt36_qoE2Qu za49xq_qc%$8^BjyX=7Yts-Dn>*;8Z4RwAr)?o!`~kXxYDjL0|LUKI`39S)j4)J)mq z0`zabY3j01+0e`C(!y4wPpI~JdpHKn_64DLm?le<4fd_ zf-O&lu69OiL&KOP+7V+a5BJ`dt~Dd#$r%s9*USJdX@}G>zuAcOIcH(Zc6wgqdST>i z(^C(}nmI>UZo+W&rag;<#9o8^iY_Om;=^79;cK?6DdL$qiwwPZ%weGl%*2Bm&gIdW zoBqhcuAAC?W@D6XhNa8pbrRT}*FB{Ts9#a?ZvKu}sVhZOBwkvX@(Ky2oLc3dP`Eh4 zU-}5l`U#|8w|*W07us~^y>DBpY41ctTR=GZvFjF+(z}3t7j4{LlsF-L6$ypc3lm&&tV4%;-t{LV`c2@Y{~oF7^Q+RxFz z)TYr*%_!FQ(a{cBrI-$IIN}_CMNQ~nMM|VnKm^KwnbNR&?)b}JQ3fWxkG_vb8&td|Y z5Z>)tR7#1?Hl$2rphNy;^+ghjsY{C zUCP5ITv>icld**t3do8=;ElV~;gE8g906{i4#zjXdRY!uFU?8jhZnyMt%7ZU_-M2< zEbFuEO(jw&{J7r{{5mXTBhoQzN|h`fy6}xas^+p zo8$aQv<5JZP{r?OY#3b@Pz0WkYhcEjrR~`#5=XS27(-rTtAE%jbmm(D5nvJD4`&J+ zFO9lBPcvQSSShnr?!yvnXK|{_DdTFw)z!au2>k>u05?KIB0`n7box_a_`P&(!#ulo{5z$Hk5wZREN7;R#OVhiYbr+> z10)n%#k3Ph0}e-m_iRUjukv%vvc$#uYCHp)ZRS6PuymuE#l$V5v5Iqc@HvM%SK!^I zjyVIUa-63k8GIwqT@nm+4IYx%ZC?<$d2OR4Y;@SMX7%ZE(e;!`Etf@xAV-&ln3^%y zs^0nEtH3TbrcvL!LJ=?XBJ~}4gPW3IM`3%bZ1A!ZlG_SUYk*ongrLX1#bQ|7O~oFh z!B);!tNM_{ZLoGpwvv!FIi6dE`tCW}-#g?6m z>(6e-XJCt5C*RI)2j4206!Fa!S&^DNKL!&mjd+k_$G)*e>i0{IR0*XfZ4DxQ-pSJ@QMn^>$zHy0 z$$n#Z6ab+kqysj2^YS!_6C!9TA@G}N#T|&3J84BKc$mJtjgWKK*{(G&9@n&^$8>1N z7%-!a{Q?XbbnJmL0I=AJX-Y^t3Z5Bb&E~@3rL>4fP(4I|>!WZqoRL2?Oz?*b10;B& z9UxyX2G*`84xwn26EDCO?wurqq74=#@%S4>%mO{=h`4J#sG#CFW{P>iogVvf_axh8 z1i0FU<5}YF94Hd+m`;jEjus&rEt^;AHeBEa89MOJ-m@2Z5W&)=$2j(R4OPG8sJ%Uz zJ|5D$(y0Q0+D#`y@?V^MX)Ra!%@-7wQ#HLFJis--reIpibHKCfAiUQvDsWA zEOu)nw1=wxk}~im#d2>w?90yz&oEV5nwfcyX6BKlkj`7nn@VOxT9Fg^6K3oKy&EwJg#iS|QeZC6pE!?D zpCEs!04H}H#Vi~E;7|5nD$r;b(~IzzP%&q2|0P(7g6PDF%9%)wqS;Gef8+T1IS_y2 z%$bylKdulOFH6W#{>CxdhCtaLyP}zaD2Rs^JuC0z)DkT05kNK6*GHniYuS$R2A6;W z0IV?oUF$FH_>&2#gA;h_vdW42S<`LWKPF)=tJ1J~;G9s#f40YHr|M(+XwTbnD!ivF z3JyvSIB}}@c*Fw~NsrF%SxgeiTNy3ApM%MHg@`Ka&Wig4{mznZ>sBI1jd7q+qRAD8 z@5)hyn92$8lJt24e7vE(MO|yjyY6vc!M=qBQf0tiL?JgITL4MM6~VMy0e~a0r$)8# zU2NE#9kBg0NMmYdJZ+d=sYu!YY}qlic`P_T8i`od+DR3PgacjaO>87cy$+?S45!h| zya#`0%Oec_(SlbW^;~gX=HM<0DL5Gp95!~`lsM=QVX6@JfjnnyTFc-5KS!pWU-P~M zkjN`Pn&8<3Y=CiPaHAw0>FWr_V0ee?Lmy22PAXd4*l`x6`2rN!O`ITipGM$=6K8jb zribD-Xy6*o7}ij|Jc4n7$6(LvSkFYN{I&dixVfpkW`>@~gFGe>4L^@gA>1F zBkb+XD@VSjz?Ijs$3vM`q%&sx;(bcCG83nNnrc%;<^n3#Mgef&g1$V%jVj~ZHs2H6 zpJ1PEPplh~Q!Q~1px0=< z9E@%ndXw_ygrFMTTcDgJoj%*YU!_$9P0Ap;*-Zl+z9W41T0zXW`yPDbbNf(71@1FS z!0rpQ3Wi}xx{ySp911qD0viBt-t?yrc6SSmA=TaTRCGd7a2q1#TpSj18+r@f4%!LK zox5YBlsQF&sEDzflVGjFCHEWhb2F3)b0g=myi<^=13S?XevW zzcm)|qQ#8Qh#Z8vFwG0pGD&K8rxGT0j->et(mZu8(1`e$RH09OhbQk5vIvt=-S zv;K|R^QG!rrJUpwsx>^Zi{@p!*n{ zzq>;tQMel$$VA}z!y=Oj;X+HKeY0yHgYwIaS}bLFX7yI8OF=!7(juep?Zgxrm{Z*| z>TgrZ&Jfl>ucEU<0(YIOSR+a=sjWt^>dn05G~Pag^^OIQnvG337_3FUd;7xh8&QS# zhtu2vT9GH|wrS+P)2R_?rR@Yo_Ry;rghjPpEl0_5Abou>3@hko9QiV0w8E{m>rm#E zKm`gMs)lK+IBR(RYX>m12Dk)HaLZqvtJHzQ$WpHxLz8^2M4cylwl;5+Q`49^*P*b; z-_4Xu<&nw6=a(-l9qZ7P(pB-37NP9NO^zECNmFh-JyBCo#u?8IQOGpkU4CJs!O4gU zRp^ghV1NE|D_9&RjgAOBK9(^FJSl^qzJb1#72`FrYBc3n#^6N5I=H^8(dWVCdxzA^ z9{5!io3ECPWWK0ABLZT=39-8U@Eif=vPGfu zw9?QMPBacxnKP>Rxqi3BR(>liGzYa~H^H-Ym5<)0#7HwMyd7gCn)zlc z(e!+987Edme*EV+ku;8yLnFor7Wk|UC;e#=<`zZ!!8fs(UPOwDF--ynGoQv1$UHJ- zK*Rfdtj@O?okD&lS7=xqO5UbN#CYjnzNw|TciupP9&P##{Evl)$agV0vffpW&>}pbjGr(x^#E-Z! zFHPX>t0k#l7CdyiYydRKz;O1nX=X>&fsfmloNB1qefY&CFeZqrPWjDS6iIx?UiDye zW4<~G38J)Uo{ZFs)ZHLijh}XVvh9V_=_%Z}t!fuagZLCx-N(_%KC5?M=WyM}VsYHZ zE;wV%aKCa3xMgGeAm;iZd6$Ieaa~DHWIHZp=jg^HP0}T=nCWe3xIGqhBmA661{&0^ zdFKl&)n`4g(BoNj%z|nb#Kkn5Eh!xP&a;-bQTiaWK8zm^VeJM{=yBN^1S}uO!sJ=q zk9KhkY|J$iB;oO~KSckCn!#&dZL?Z(D`?h)SvE(IurFzxiNl>UX?^SJ|CwY;s#4y+ z_L!u`AyDEoMD2`liK3RcM@D%@0o>R_=$PDXK$AZgzeiu4pHj3)h{F!$WiV znA57|qT&V5oxo<^8ezTD6mi{$i#+1n+-oW?8co+|`KqH@JUWi^Yt#^5DDYr+bs=ni zvx{4tTw!w}{`9-L)gJY`d*4@9o3I0_r1Mp&_QXR`JC7Y}FgBPYhfVQ{kQ)8#*BA+g z=8k=p?`v{;<}PZrAr))v-=Rz)2S!8&ln`a6ilu6myHF6zl%}GBgdfc(30Pk)+!aZ@%O~ z7M__rY#vNm9bc>%Z}e?S$%u$snh z%64i@@;Vp2z>m0blcHK`z+s%AZY@j~bSxz(1*mPtX6owQnesJkc#0!4gny5)G+^lW z7dxciTl97hx`sEVv>=*!f}LOlVD93SfxI9(TU{Bg20e3P7z+F5_Qg9U-H53MyLd5A z0q1t*dt>JuJ>L{d>Q2@RxpfL%IYY7;^wqx7W_%N&y3=9s^^Pa4c5Wu&Ix!Y|(U-Za zB(po}NNpm~Bi>@0Z41zd0Ro+}LI(3olJW)ME|n=6P8AAr1UmSt4NtPk6V%!3Wxu9C z9Wg1r?Q`(@d(D4IQgg+Q$j)9tpjc660ZxNXCX@MB6QT-3Vr|T%W4I2=jw@@u+8jrc zM1vR+M}uLJ*;N!W0T#qnqVjsx^P)yk-<-2fUA7{PF}9h-{qw7aC|_b4IEpsu+Xjs7 z^0Xpqr|eGJcmhnM&|t-C7S-{YzD>p|Wx!I<)+t*>;1jvJnr^r7bcrF07|EoQ0Bg5f z0>}7?q??HHC-@f!)2D42&6ThkY(_HH^ql;RbrE$QU^Zt@;rJe$6=mLkQ-MDPE2M7? zOfX(g#Ev>TE0?;-Tf`t+;t0R5Mb8dg?WA?ju8T@auqCx{OB~o;XIy+Z^0pumrH_iH z(}OiDyn$boj4@#q#&KVpYX0Qu0jlqEe}cw7TnM;3&yRKU#fee~e`ROiaS3&t)~D+E zX`sqpq1Bu%x)VIET;xHBEu6h#qT3;u48^r+2~dkEXb(U|Qwd}1V&ZU53%QZ_7KK)d z;>KONbZ6e2MQ5j2;L+^}r)+AI62zYr%hU7@SNN3#EPp*|_2RUx>M3mXPBsHi@7=wcoeQNiHQnj%4_KMz!zU;~{Ibd9vHr$%Vdzfe-@)(pVw+?B6s_-y->m_NB|B-Gxa zkzhTN3yhXwD^=4S>=`$m9W=%X9aXmL-}g00+3*5cYQtGg3?MbK(~<$iQyg!MgqSM(WXFp`Ynxn_-VJS6!s@+#XD{gOwt$8!q& zc@l*4&ZLC6Kwcj=PQmnYX!Q5I&A?6Lm4E;MaIyb=-j?YD{-=@u8GrFiqz{5lBwT?_ ztiDDDcH-K&thQZu00$+HgNw-2>X|$e3(0*LomdyG3=^gJ2y{k8$jM1aVK4y{l`WPp zL@Vij?M5EmMU8-`1nT9{^?4#&m=5hTybd@IXBiRNUeSePBKipbsa!FUhyo=Y+O4o~?K7j6V6cSge#yJMT=nc`Y%jsN*p8pMEeeBAcy^1u{H}}eWlsztAI)y z?<>(+-^nfM!j1cg=TC#RMd})$I3{3c?jujxwqu>G0#r0V7ZxISs_GoR^$$lu@spoR z&-hNKMD16lg{s1^sZPW&4}0W{r;6DxN>`6cxBwxhiAI>;g+{orGfo#2AhiHAp)Ssw z_1x5mi3*(TBq{R3_i-zRmpiz+Vr0hdD->kL?&*_VhkCfmS6MS17;<#ru6mnX9k;D9 z$&dQ!2EyfuLA9!)EcMueZs}hnwxh!Lt_bAt9^+!67h&7WgCLfr=R=KjiVQ`6}m3(vS5 z5I089nvBSsIW)r-jo5h{w=V5d)mP3|XG@sno~D%APquHND0=1DD=$c`a1<09RXqYt ztUZRcXZ|2^ljHOqoz;=YP}(HTI6O)0*cxwq0z148HhM{XVNt}wcVPs+kyB_WS1mH( zeoJZHhJvhVzt(bXFn8Ub(m?G;zKqD#KYtnVn#e|k7T5)bFCx?A&Z!ooG6{=dJAP5yraclJ+^odpiLXL3^)^!&6C6BTwMRJ< z={Qj2ZSxcK{1UiL@1_Nuor1V6MI|wCL>|3<(Ibz0Qh&KikfGSDottJD@k)~@nN5u> zqwKM~$%4V9W&B;UIJDGa%EqXXKTRhb1F=mKQ&_um+XP&BbuGf!_qI6r9nX z#T+xI*T=@VWL7F^_a}+NFsWcimm}-C+0UxoFlQIABtKwl9Yh6^e^WBUrL~dt$-d|{ zV@U>)m!W^m?<76;ros%}mt*aXbA#vAM#*f;j1)iDb|T`h3;a$PvkL!QElD4ti?p`0 zZKDu&@*<>j!I`N&w{B`|*6v=!*>45Xs!~d?nNdmS==X7TQjFF!(kma@?o@+n3D0HZ zVCSO*tQ?GA4DAJeF>w+iNzXLP7_Z*%+%)sXNpKBYh*>rH!eH6;JnJAPW(Y_Bwk94~ z4k|GaO}nfLON!1^ zml%{ms?2MkhxiL1xyz_b(gxilvIwE-iH!AIrbJ$PzsZpAzMvpmXV>nb&A>onKcS~o zIio_N*R*q2lY`v#KG}3ZFj)|jpv>Kj1Jg_*x$-!%<+O{mw^S{|v~P|vU9z^F;o7yB z!oX+15EliQs3ZTInf~0{LKa!XtY9hOhkIvb$Zvw&&|PO))RT;T;h(!)IqULvaUPq2 zOW~mnyH>4ih8F@VFTTlF>0}9(67xByliEri$i%3L(jlfNzpI|J+v9}D=1i0Tl?Zrf zih2r(-aABFE;^9q{;&x}J+x#NI2w1>akd4wQI?h7J17ntTXM19XUW_F7Y#WS2`oub z+ZrigxS+jssR)CI97=GSB7))&Tk8Qs8GQzA@5$nZyL~;i24_TC9Y%MLpXcB_zQl9g zWMp6IAdN=|A|-0dK@&oE3Wl3(Q`TAAbv;A%BX@?tNg-SFJpbJT=V0EppPGFUe?cyq z0CXH8WhL))F3Y}WwT_A2z|L?6gbP+fcOxn=@FgZXtFX&pJ@B5<_0apFl<*cK`Iqw= zE%MX?0b)n_gh-T^S`98u@wuchV}@TAa{UM!HfW%)NMl;?{5it7@{=j+iz}}nKY_tW z)Z=b{W3R*%K+%WoH^i`2u+O`o>@npK6?vlFM1Rc1DvjjK1ZgnOtomEAQa zJg3xB+XAx%$G=^;)irTu6nk=#80TB*CvWT_U2lT7@JWCKqv>S|vTA?*RiAX}{q)L|bhNtGT*nW9r4VQ`m9Mw|iCrkKY2zCsogNg=B2-vk- zzxjbwa}u~g#YIA|$={~Qj`)+e^7UZ_<0l6$YO+gPiLM{c8XxfXtbcP;a8YOf&RF>^ zpPW|!n_L|Q`cPcDA~gFuks-dovGC=cG4TR#NhuTnjj(zfwuE0pN-d$zlVGc8Re+bZ zFrW~3;8ZO1(SR3j>xsPMZ1)}*qtG`5DPkFTXtj6W4D}RPyH!Cg29`E-*MP*90C5E# z5tlYGOIGrg6b#y`qU^}5C9D4KYhUtCgoL;${e&||-;F~!*#gTA;oKM?)@EE_l5rbq zjfG^p@2a7uMC9#`mfL-AKk-Z=Ck;3sLN)Xs%MF3s6;~U zuedR3JEr~ncU+?%GH|7HQf9I93!1@bO}oR;Jwf01^y^$vlAx-oGbc3u)I-XhX*gRm z{job!(eLdeK15zx9ZUh3>kE8)l7j2od6UNC)~eef<;{SW#RNGLk|K{~$gwJ-r9}WC zdj%i&d?~PJIX!2|uITZ+=pr-EAqR(>GtJ%6$;Z!$k1KZre1D?~7d%>4Cc3j#>4wNIyMpNH07we-}caYAWRkXx3yc5l^FRXrpN5+Om!TA?ke4 z;UQwpevhHF;fQFSxTR27kfX#HT;!LM@}H|FII>c7j|>FbavQ=GGfPTi<=&39HhjaZ z?Hto?%-r-*YN-VQ&R=J&tSfSX9rF?Db8nZ(xN4dnk3W7ZEsL+(eTKiqKzy+QJG2h` zEO7hvQ%QKD4yQX=%zIZr0tz^X-()YpC|5f3eFqPtt)}w43aiHbSBJyK3E#Wv4_)^% zkNDwf+Anp$6h1)RrQj;2EIdsUiiGrpa!Y3NlaeOxfti&dP4_ePjOSHF)%1MQw?7sH ziTrABb}sczXYuopV%~h5SBPilrp7_xdq5qZknJl5Ke&|MNOI1)G}$3$=va|9tKQa8 z{;S}nr+w+o6|(G`T`n`Fs($>^FGKjy^X@G6buLO^W4a$&mDvgxRzPSsm2cM-Cub@> zXF;7IM-o>_IX&q_%QoynNvrnyGp?p%pt7wzj9h)V0PA~Bw#w@PEyF~!5CQv;1?aE^ z2TALzwXKGAYQpm(Ugo?$mFd_EU%(cfQPhj>RA*25$@YqkD#!b>n2rT`b)w`QrJVvG zd9MJ-vIURd<#@GiEm}~Wtx!wD`Sx(yeIL8&_kM{9v~cyX{6Ov;HPRvC!_&_E$!^4? z97aC&6;~j$k$big$$`t$%(vX7!hLecwr{ehOOy~Wi$466F*mRTJ+%38Ph^K;66MGC zb+GjSa$f;Q`joxRd6&0ls}i*%quls`5dBu7H%MeE=`JY8{sY+CD^lx0L_Q@UZ4^&$ zc6_$mk=j4h4fkwxr`G@Z$9?!m7G&a2j70zdRP>V7U~%d>Pj7$Tt?b> zj;RFsr{5@q%@6n2`V&S%LSLzu0TnQa8cB)IjG>uxN*mDw&S3%Pt3n3ySn&H8e!`R} z2XAFOl5txG;z@@T z@I&SE87{fA{q722RjUR+t4G*j9oH0~7$vJ}P@Qy=S2j1Q8X-Du^G1g+>f#z052y{oK*?`<0&}$MBdgc5{tj-6^%qi9v%U4rZuz;4gvxK9RlKC zp+)!;T8f-fAXO+A0IciiO!OJ^t;U#53+<<&wjPzOUU4N}k*vWtkrg;uzai0deLHW; zdZT3h6hD6c-q%R}&F-6}+pokCyER@^KLgtWqAaJ7tv^nqSPuv2%2;j^XGAn9Sw^s` zyCDWYQysSW#G980dX}Kk!g3%h7bW^1Gubfj^Aggnvj+1904^O|m02?S84p|Z%CT31 zxYbOdT2#=@x6h&hy+>I)!?GK}I(x+ytq1NKH~LJgD-_lY$%M?XqfkT0C0C8s7i!cn z6_+C#NTK@bbUmwt*je&da~R~Uj*vY5FOVdgPx`CN9NFDri`ySyV#xt4mO^R2eDs7_ z4n;Omf>^#u0igHpReNB2tSlohLtGlj)R>6{gvARYSx*c}%ei&+XbU zcpJyM4FHPd63Fz4d zBQ@?qPWh&na2K!s7W0F@07#t3iFMh0@4v1&mA9Xtd-?t8q`+1dH!KK z%k%(YHqS$`z-Uhjp5!tQ6JMDxNKQ6QO|H>%*HJYe1D)%>28DOkG{q^2@$MN7Lbn;Ltnf5gyUUCMV8 z10YIS-)Yr3lGO2YoJi~k5p+u>YK+VkCWIIA(M_vPmRq1kUbd=}HMSJ1ejv4^Hsmxo zzZKcIgwhHTu$(8pDE|mx0##hgA_l&Fw`=n=77UP1E-2>Q+mk}XE)BEep;uA^n~&R zWOXSc!CZkQp&0g>7mj>B7i1zQ+}(?3!{Ba_^FF>-S|nm-t=7l}j2-UYS6^w*@Td5v zP^-idojNM+amw{~dR}(fRw!zV2w`T+=5bYcjhN#>pJ_#Ok_?4+feh>ei-m5zbHEAZ zPmzqUyR%cnpAp;J&VnC_7KVR)XH~43q)U5FvQG<-(Q$mx4ECm%JnGdu)$D6TYok*C zTnQD?TsVjn3j*Wc!SQK!vTDy?-P*Vb5gH#=dIPUx`!r`Tq`G)7L^j8VUE9!GgS~A6 zk`ns~i8!RXhIpM!5xOdEeUfd`)&We|)91ACs%w^$bv0VH9^jcs?I!_;$eokBT>-ld z*sTY?43M|3<~48ij${5p!aKYpm^|K_WR1(FY~~ zhqYD=Ig>#`p3>$vRQitc=?rO1-hwm(pa`&Og#q^o7UKuW)5_?QTj(*>JiZiaN#4(_wq5y@1zEmj=2f+K=#Q8P%jZ}3ocL%XFQ&9P&*8+yDX*)+VVE2(Zm`mNX<>cwg zDIW8-AiqUw63gfJx8=K|K(Nudh{%?~SlVb|H)^!b80zXAw(4%2-#KwhU`8W(@Ii6d zUI26Z>ZTe^QXy;ElLpd(fk){ae%no4aa^pK-dsxP_^e`*%L$5!ohggqu z!2!Q*VG`7HQcWs#y_g&P*?Nfu*;3i&o%d8-0LyW6D&8;8sb%qd{kGR{%l$iV(De}n zpVdghK(C6|05bxQI~)3_=J_!j6Tjba2p%rlEZBITWj(*c0UiTPY0s`FC*)FYOupQV zIXpdQN=Gg=9^$0&$9mc?Y z-JW=gf3%r#wZg<}LnA5Bo}eo7s!Qc)pzTYBm2dk=b;bt%`6W}JUmTW3>aiBRR`)+jcF&Ncl^Jm?eRb=zoOr+!ZF!yqTr77Y-Gf_^T zOnyB!wi@kkuKf<41V@qv!oV*{a)bfDityx|IEP&Y4tZDDDCis#N4NQA^1ohrT6XMl zOjddLdnjCqOGy4!TrBgOeZ_S_V0^V4!g(|7NhSEA>H@frdGZ_*EJCUV222>{^|2gf zPFu9=6|!CtPgy41Tn(L{Fy3?o`4JsV0(8c&7QmhMXt8NK8W!G;_YJf0Fc^Y&U+uB? zxt8E;gYk=bRr$~taqZDe)%0O}O;+FUpDncs0GGRbqnx;O0&m~4mj(~Z(YCBi z4^tyflZz5&tH%>C^!TX4FfjKJ%D^RDN#LOc{j&nw8X)1X@<6QRuqBpM8x%(AN&jYb z%}LEHxsM&#euqNLuZsvm5i#$Vd~z3YoQ(HcX#jro&rzR0i#39#4!ods4?tI|`A9gX zUL|I}SR@GA)Z8@UbFMU;$b22+QZt>!bG}%Cad4(Rj zD*$vGH!{;s+=~saFF4|$%a9qu8HkWNL&=b4G@Qyb5O9HeoqOJX$-Ug201{8#e}xM> ze5(I^R!JDT8Fca;*UZ6eGzLoY&aLlyQpsobb$3{4NSloaM3WwOs{8=mn|0o*gPcVS zKlbpe=gr(%;?Zfu5pb9&F!j0nqa-Li zyLlu0mp*p*Xn7(cK|qWWHS#5nq5g}6Qv+RYP#bx2YW@;&pb$1GF#itj&lqAOUfweF zUs8Tmm<#*YCYNbr{I$nz!%&wdHX(ib>eF5s2&-b7Hu2Xob#9jgg z0l|j&pEUK4ceDWFlrBPmqx&!JzcjUeYmb~AO#9Q(omW<49kdEov{OD^R~+$jj53gq z5($D8=>k=}e}N9drqj(@oqP;?;f1EAO* z{N!*1{NeTq&aR*zu9YumMvU2JlXrReP6gacUlQBBsMAo9^RXOzei z%xQgM&{E9_g9>^bOsEuy=_+8%Xql8%@>m|iv3cdX_{7s>vh2wM%?0os&V=gis41O8 zR-ngo3bZdNW6#f30o(4W$YnJ9l)On$e~5hH(q&cU8T52ZIL3(DUfgB?>5Hri?uG^WqOebujQCdhSseu`~pmi)7_QEXuRmI6@u1_aMZa{5)bB zWR6;-MyMFjEF*!jeh@(_K?7ZMkG{JMUeh-eJ^Ge&?1#gvg0QqqKJC|)L-5!b891M1 zobF3CkH=ZHB|WKO`I44q9W|6!g&JpaOAUs+$1%XV4gmZOVZLvEVw^CRi5SnQt-dJJ zc5(f}cE?RzD05uGY(q^cNx;}0wtkzKB23~`~^`Csjr z6+I2~(N$yFPv&DxST~YC)xZ*C)$`*LD+-fgSbmcT^o)+V2 z>G_q-HemtgqFAXuL?G9XP~rG~(D|%kx|z2Shu#~!n^sFVxVeL_hTeT|7T1Od1<_0} zMd%C30_PzmK9>kQBda0Jh%YAJ`BqU{Il*OOmv$fr?NmV%!v1DaI{awjM}h)}Tl?Is z^;pwHb{nb?22}U7sD;by+jIGsqI}H2nR-DEWDuY;3p4s?4RNpzC#F5&*b&U!4SK(M zTl=v#a{&m&UzrCPBK8fN5r91rFev1VWlS-hoX_mZW)r4BE*63QWpKHUWM@>{G$Hl| z#}&<>Of^B6iZ6Yz4hsJF{f;-ug#rC4$X`qcp*Gr46D3zZ6gV1+J$Cu}>!9_mZ+#%F z=LF1!;g7o%A!3>LGdDq+g{(M>;EHwpHffB)<;hhykWkNIi<-K z4MCja{UQY(g$XRw5`Yv|2SRMmei5#awUCPFqFSlIx7KL6FHM#o-!-wyO(K|0b1ljP z;$Ri)p6@3zB2>pPi3ufQN?q5JvNzq+83DG`p6~F{j!62eTuOVO^#^(~0jMU;=7W-T z`2skxGKxdn6yCfleU+T!jb0x~F?fftzXkE_-{tB?`paoDV?Uvmbo8CUYHD9H+dMk$ zB_I#0WIvN9Qd&t&FD&X6yGb=|bS2k1`Lxuu(NeTsaQGK8retuWPCnaEl_a?6-#hK~ z{&a{;`MkmsY|$Bfj~+%h>e=$6e?VHt;E-oD z4T7n}(68et>)?Lxde_Un2MezvZ1+LR{-~0^VlJqH;X>CNQw;D-F!o!N zzicd*;$0P?OZ*cb-!E_iv8P!XKO1otfFHs(IR$61*A)`CpLA|}XYUc5zK@AUK4cTJ zFUE5O+d+zw2g>Q`cskn_%rND*Lp__c3{y5kYqLg>nNzjTD4Z z7m`0UJBE$%ncO|;K&-C42)9?Km_cVCbhG_hgne8quu=9gCxIv|2aX0`gghfDk&;rW znAV37g_NdTH}uKnH@Wc#Qi_S`kP^R@$WO}t5oSoBWHxr4P=d&~swV)e6?rCsEpI_* zk>q+LP@TfDi{a^06#_X8;*Uz9o5HWceDSFK%qPS725C=cRb!BrqRB`T;t9V2d4m{HnnqFj}oec{j=0(bv9|l z6K6Q{y>)Jim2VMi4d#EI4#k}eI6@_5Lz>~-fzpl8TsrbYR6wVyI}Nc{X{iuZj7HDF_xmQkR zY-~CWr~`{Q8ICon5LsGzr~2Zjf`-3D+v>&5XUaP8yOKNNvm*>?^z74;1gi>0r#!d` z)y(-$(>J^`@BnHGl=Pk%&%tgLB_kedudBPL9n2ZhvtRv#KhxJnn)l*^NLbV0mM5&~ zbz<1>Dw=YDRfzgKm=5cr@WG7UJkA>DR8uO=O!nkuFy0go_o+5AwsvxmYFFb#s2yop z*P7h*f@u0`nzpDN30!tf5$EHqO7}+3GG@lxZ{YQ4Y{16u0#j|dObklfYyGyM`1RG< zvH7v{1|oS%$;H9wElmZdTk02nQ_jpL@#~Y(yP-mZ7WabY6Q?GFOz1;rWA+Ne>ecn< zcoN1Y`<>aS)n^@xnUeJfjW&so%7aJ(T9cKxzss!XRLj%(J(qQASKoYB#pqlI`>9vE zIa=QboWwl+25Pe92WkwJPOTQt-e6N{Ekg2SbJc|&ZzoDyAJbnoGhyF){xTU-3#a+7 z2oMlWIR6imSsvm8RBJ0b|KdS^Wog%{1D4oeKHtccH_W1{aWQoc7sCIzZTBJ>O9PSG z*1re#6%3M%uyg;^f;W|L>)x1D5iWYRT&t>NC(Id|-8ea8CzQ;KwR(K|F;z%AVJW!G zsY=ZC!>~)IyS5^bGiKErEB-A8E_BO;)!}%^#aQ!~6~5aAAp20AIBkfDqBI1#ibOy@CAztwj_NH;%dP*0J=(}Q>#~R)(-^Srn{kT!VJeRVJGEK!`PrR zF~x0a2`mf(U|AkXK`K@TeN!%&n9M5XZ+3M`FoIs%p_^0F)&1s(%OuHIoVmE1M|V?~ zx2FZ!5_9Xbh-GQCL;N)Nb$UEXk~UkNo=0F%EN{>odR4~`Oxv5F-WiwgxDAfbtirzG zXW)Q$!#gXtCRAn2Mzx+;rlsLhkTUm;QLli;5+`mp~skAbrgPzi;~Sgj?@sTfl8KgB&Xd!x%`~Ar;A`Yw?Xqg~-WFpMX|hux?`w=o zTr#T$z?9w!bGF7J;KkiQf|s@8XBw-5|7$0!YfbB?%UFMT=O6m`o%N_rA71;~fI85! zd=zy!T(J^xl|q(*nX}0TTY`%>;;F_5614 zO+I`x$N%{4q5JY0?w(XC*<=UL+dMZZAOSY49&qKB&dUd3CQ0&?4b@#YEe|MSh(p1pgG`B^XMD_MI&wsI~`Rv)>@wjM6iZW17Vu@XtAVIO-f4Ezg14 zYLR6cN~t_cOVA+mUlP+P6eSM$JXor%5pn{T9^mVr3?%g8J+_{j?f@4G6RdwW8(5j1&4oUxz6iJuH6 ze&ZbRMd-E7!e5EZhgQX0t%|bI1kE;Y%sgG1)Tp_Ark!BF>hH4_+lU*^8aOVB>}PY= zPSu2};$iY!$qo`46=s4Q*hmX{&&#YG1F~O#yUeRFMi!RVChe%)gQtq+t+TZn1UUSP z;R4ip%fZPmLmhH3St8-5Ed1VNNx3M1s(2X-G;qOQ+uX}DKOcf=YKC66A62DEsQ1QW z$*l@{BY$;xAG^hqe_f{;iRE-{Kda_>IxznG$3XzE&d9<*Kr~|f_aCRs;Lo-HzZ>PB z9x!}@5>Tz{2>jKI@mEZhdWijIRJ|J-<4N`Sd?inv`Q-RArzB0&fsQC!C-X;49W8WZ z9|3HvpQw76dx{$&Xj3pfz2;UUfrEyOUU`9iWWKXK%; zb_e|tR%6%!uUwnftjx)?89})NEYIG>_-bhom&%6++I(3h@h!H zJg6~>Ma_H=Iaw|8`!^%iZobJAOVE;RRp zjN)nS$Q2#EtvDW#G`bI06q+m&YQ@;(*F38-C1Z@>)_#E~*t|wbvMW;+dK57Gl87%L zSyen82#m zr0q^w*D-Q3=L9K4qV^leTqd{o=i>ysHvFRgDu&!OW!p+w(QJwjxGG)*&6eybnkiEu8Qvh}x-_+DB zi!RzrB?ZXHCV6C}?s_ zwbskD|NgqJ6tBY8EmMyB!qouV{j&{zon3hYF?o7Wlc&;o=eD=;xgUTgr;56F{UmCB zhjh2yI~UKr6*0XS=hP3LR>R-ny#h|F3ES*oywJ(7f6r*(3KUHvM?S`C+GBgj)PrFa z+L+;PLZ~Or;OGUWQtCVREaA$~k(e$UI`JFLA6$r}4Hh9j|+>05msjDr{n{ z-EeCe2c=hmL`)_q7UCJ}yfIf24q{E%+1k8&$^^1Q{mxe~TL5QUIrFpC!-RSM2OT+0 z826Nlj%6eCZo%1JS-n-^7mf(nVKN06HW8Fs(VZ?)E<5fH?4~wz>e>Y)8$f^Y&{zc+M

bK_P+)m#@Vb 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 CDi@sq diff --git a/src/tools/base64Scanner.ts b/src/tools/base64Scanner.ts index 66959ee..2741be1 100644 --- a/src/tools/base64Scanner.ts +++ b/src/tools/base64Scanner.ts @@ -29,19 +29,39 @@ export function openBase64Scanner(_context: vscode.ExtensionContext) { if (picked && picked[0]) { panel.webview.postMessage({ type: 'folderPicked', path: picked[0].fsPath }); } + } else if (msg.type === 'pickFiles') { + const picked = await vscode.window.showOpenDialog({ + canSelectFolders: false, + canSelectFiles: true, + canSelectMany: true, + openLabel: 'Select Files', + filters: { 'HTML': ['html', 'htm'] }, + }); + if (picked && picked.length) { + panel.webview.postMessage({ type: 'filesPicked', paths: picked.map(u => u.fsPath) }); + } } else if (msg.type === 'scan') { - const folder: string = msg.folder; - if (!folder || !fs.existsSync(folder)) { - panel.webview.postMessage({ type: 'results', results: [], error: 'Invalid folder' }); + const folder: string | undefined = msg.folder; + const files: string[] | undefined = msg.files; + let targets: string[] = []; + let baseDir = ''; + if (files && files.length) { + targets = files.filter(f => fs.existsSync(f)); + baseDir = targets.length ? commonBaseDir(targets) : ''; + } else if (folder && fs.existsSync(folder)) { + targets = await collectHtmlFiles(folder); + baseDir = folder; + } else { + panel.webview.postMessage({ type: 'results', results: [], error: 'Pick a folder or files first' }); return; } - const htmlFiles = await collectHtmlFiles(folder); const results: { file: string; ok: boolean; assets: string[] }[] = []; - for (const file of htmlFiles) { + for (const file of targets) { try { const content = fs.readFileSync(file, 'utf8'); const offenders = findNonBase64Assets(content); - results.push({ file: path.relative(folder, file), ok: offenders.length === 0, assets: offenders }); + const display = baseDir ? path.relative(baseDir, file) || path.basename(file) : file; + results.push({ file: display, ok: offenders.length === 0, assets: offenders }); } catch { // skip unreadable } @@ -51,6 +71,16 @@ export function openBase64Scanner(_context: vscode.ExtensionContext) { }); } +function commonBaseDir(files: string[]): string { + if (files.length === 0) return ''; + if (files.length === 1) return path.dirname(files[0]); + const split = files.map(f => path.dirname(f).split(path.sep)); + const first = split[0]; + let i = 0; + while (i < first.length && split.every(parts => parts[i] === first[i])) i++; + return first.slice(0, i).join(path.sep); +} + async function collectHtmlFiles(root: string): Promise { const out: string[] = []; const stack: string[] = [root]; @@ -132,9 +162,11 @@ function getHtml(): string {

Base64 Asset Scanner

- + +
+