From f341265f425aede285dfaa355275c799d80771d9 Mon Sep 17 00:00:00 2001 From: Stevche Radevski Date: Thu, 25 Apr 2024 09:06:47 +0200 Subject: [PATCH] feat: Add s3-compatible plugin for the file module (#7143) --- .../api/__tests__/admin/upload.ts | 2 +- .../file-local/src/services/local-file.ts | 4 +- packages/file-s3/.gitignore | 4 + packages/file-s3/README.md | 0 .../__fixtures__/catphoto.jpg | Bin 0 -> 40670 bytes .../__tests__/services.spec.ts | 79 ++ packages/file-s3/jest.config.js | 16 + packages/file-s3/package.json | 43 + packages/file-s3/src/index.ts | 10 + packages/file-s3/src/services/s3-file.ts | 154 +++ packages/file-s3/tsconfig.json | 36 + packages/file-s3/tsconfig.spec.json | 5 + .../file/src/services/file-module-service.ts | 2 + packages/types/src/file/index.ts | 1 + packages/types/src/file/providers/index.ts | 2 + packages/types/src/file/providers/local.ts | 4 + packages/types/src/file/providers/s3.ts | 12 + yarn.lock | 1229 ++++++++++++++++- 18 files changed, 1599 insertions(+), 4 deletions(-) create mode 100644 packages/file-s3/.gitignore create mode 100644 packages/file-s3/README.md create mode 100644 packages/file-s3/integration-tests/__fixtures__/catphoto.jpg create mode 100644 packages/file-s3/integration-tests/__tests__/services.spec.ts create mode 100644 packages/file-s3/jest.config.js create mode 100644 packages/file-s3/package.json create mode 100644 packages/file-s3/src/index.ts create mode 100644 packages/file-s3/src/services/s3-file.ts create mode 100644 packages/file-s3/tsconfig.json create mode 100644 packages/file-s3/tsconfig.spec.json create mode 100644 packages/types/src/file/providers/index.ts create mode 100644 packages/types/src/file/providers/local.ts create mode 100644 packages/types/src/file/providers/s3.ts diff --git a/integration-tests/api/__tests__/admin/upload.ts b/integration-tests/api/__tests__/admin/upload.ts index 968a14dad1..c860326d54 100644 --- a/integration-tests/api/__tests__/admin/upload.ts +++ b/integration-tests/api/__tests__/admin/upload.ts @@ -42,7 +42,7 @@ medusaIntegrationTestRunner({ await createAdminUser(dbConnection, adminHeaders, appContainer) }) - describe("POST /admin/uploads with", () => { + describe("POST /admin/uploads", () => { beforeEach(async () => {}) it("uploads a single file successfully", async () => { diff --git a/packages/file-local/src/services/local-file.ts b/packages/file-local/src/services/local-file.ts index 6fe0937888..8b7dcbe598 100644 --- a/packages/file-local/src/services/local-file.ts +++ b/packages/file-local/src/services/local-file.ts @@ -1,4 +1,4 @@ -import { FileTypes } from "@medusajs/types" +import { FileTypes, LocalFileServiceOptions } from "@medusajs/types" import { AbstractFileProviderService, MedusaError } from "@medusajs/utils" import fs from "fs/promises" import path from "path" @@ -8,7 +8,7 @@ export class LocalFileService extends AbstractFileProviderService { protected uploadDir_: string protected backendUrl_: string - constructor(_, options) { + constructor(_, options: LocalFileServiceOptions) { super() this.uploadDir_ = options?.upload_dir || "uploads" this.backendUrl_ = options?.backend_url || "http://localhost:9000" diff --git a/packages/file-s3/.gitignore b/packages/file-s3/.gitignore new file mode 100644 index 0000000000..83cb36a41e --- /dev/null +++ b/packages/file-s3/.gitignore @@ -0,0 +1,4 @@ +dist +node_modules +.DS_store +yarn.lock diff --git a/packages/file-s3/README.md b/packages/file-s3/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/file-s3/integration-tests/__fixtures__/catphoto.jpg b/packages/file-s3/integration-tests/__fixtures__/catphoto.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9e4ee42861d1cfa0738df51dffda30e37328a056 GIT binary patch literal 40670 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

D zzG|*vZ|Ftx)TAg78DfM|;@FW{=Ri;C;7^Mzy-rOShIWfL)4N*OYQD|CN@O;pWNuOvjJrM=?sR@U$wN=|z-h{K^R68`!)D$z4 z#8uh1Kxz>{VsAXG9>rX2v|u_N7H2ZF5PbolOIA$2!-Th~?w4#b>fkRS$>ppNoId-2br!3icr4Ze_RO6UD zX5ah9l57#43Ouc*evx-Bz*L{{WA(N|ry8fc%C(LyWT@+68D2;X$5!<=$qswxZIvf5 zGp>u_f#a<=l+yfg0*MLe5S8U=i#BoZ{1L03{##Y?bArp=;q}g?DjFtV@zgiaB^iFT zU@zmki2?h}mHRNs_%GPlk($g6rdw@|&u@Fi5Zg~tS=I>j{mFs?S+)lFepF~7<&z7* zyXHH7uXp_u?3GvAz{dvAAOg$uYKd!Q8H`e47P2U2Wg>(VF1JYw>DkqyM5xf_J6h_w zTht1^eGHA#phB{Jc~+b-$5(ZF&SrSq{zR(6e;1+YK9N5Cu!wsUfRyHZ4o~;rU9*x` zOs$<9IeA_p+2dozE0!a0psy)|mu8XazQrMb(wCxukohr|h8xj3bJ35{$}6pWjrHvG z;%dXAC>wEXfe;LThx>8Vb_pV%YDIdVKJwmW0{kQW3FA%Ir|K_nJVZuUt?H%oPqYS` z6k1;snyXFG3mZHRe*a+Fui#t$FJ}$P${iV*rS6O`DzSa#6nfF{V0q~w^%`}@q>OT% zX0EGKH|u-S#hYd33d`%G+Nui&Q)m;twXC#ei+LmME&$i>XeC{Rb55ilyj}?0^wea# z8la=2dPv+xXNbs25UXx= zzf8Up_Tf%281??Vmdr4-U#A4pqZTrl6V4K4xEkPzH|qCBsFwE4zEP%N#jv{uC>0`r z{)clstqa{tY2{TW_J70GSN=SAxy$0=)!6k8Ni$7f2$MJfJdY9^I(t!@Zgyb0C*#(i zOWU;{L{sd_L&g1Zf$|CmVZ(>;Q2uPSvSnv}s-iV3yP*2h3L-~fl85}#fJQv8Pm_L5 zU)P4C*#)WDuS&&UE>@?a7l46aCd^H5we})yQ9Dah z-Fa^j6YmK$-X$)wsc)osY|VAo(n;r!1}lh~(VxycCMKNlPVUdjc2w{7_k3S4%WNam z_sS@c6dY#ZiqWYR(5Ysoa=$ABu%bfcU z+`G!8^20D}XXPm1H1CvfD^$Sw_UN^c-_A_F6$bnx1Q}^(6aKB@XY3KYz;qdwf^9-b z^32<`t7A`@(DW8&SYP^Q43r(n00hQ-4JW{tksx@PU;qucL6q-oi>p~&ZyJ+XmS{Xm z*U`qaov7l3oMxNN;9MKiVg;ChEa9_7_)1hGt$3)Qaf)FJqyi$ZGMmi9;Qv}Qo%oLZ zF}ue8PTu;7@osNFrwdZ;X@P8)2g`#KGnL*&)q@1)bk^?u212+IWHQjpCN=_CIj$;kj(1hesgS02xApd6CsGg43|z zY+dh6N&3FS8+CtM)%E$b2ssRja;>pjL38nYN01awfQb1aF}ZSF;g!z3w)WF)ImJBCUJ3oj>q*c4X1Tiar*c04#l=H5+Y)=J~$Wm!}hy zVHsA2;?(AncfbV%g*w{%aGZ|78l`(yIJ1SRhu^^)Q3~_|cqy8)Y42O7ag|sE7K;Yk zY0f0_e}?;{;bWEUK_CiwJ0$SLI5zjY=`|7I$0ydx9gkx3-|RI%=ddw<^18ER6z9t9 zdAlXL>R|2+F;LQ>@jj~jD1+EX{N)swvRoGvONA$n3G*s<^C;ES$YU%+e9)}jmL;np z<_iT%emnyRtNpZM3#HaIE!(S}29#)#AO;epq@tku;uUOv)&0}XoaMn%qR6OfxZu83 zKB6mKcV=6GRt-)}MxE*P9phO)fTX+@`sK*>%j!OleesQ@3mahZ@IOmEUrUe3VRY99 zq0rL))rSE;y3Yl2SA5^SsmNXkx_ulFQf}$Ln7oj_)}0GVc=|!J*-u}##?2sL2gE+W zE{*pd-|BZ>QErnPv`-FMNqw05T%*HCEjXcbDQ~t6nJ+Y%`uwp5A<%TbD&m={MNoW$3(6bkdl#}0IZw6jtns0K7{Rk17)HtHUtn7;l6+vj@D zzwp}QVIf!hJbJ#AL)bHvKlMlAfl=#tHHvUndGcb&Cnc}!{Fmy4Iq0p{kxAUbG{s8= z0_gX%1)0Ol+7XxC^x>twJ8N`%`q=&XCqxmK_0MS4`5+4}&Le6F$CK7zSYP+%ToD4F zb`T3IO{+aI_yg_tyPrS4iVi=wyDi)&7`eB!Dr-C*YO#BoU`TAplW0)DEl-t*RCIUx zcH5QT2|aYrd|x@LP3HAGah`c@_+{`~j^L@_xD8O)%d_TgQ?$kN8K`n2t>`1Vhk?du zeB^z>++bZ6<$Kizuk|Zso;_dc1433q`3aQ`CJUBt*%vPWvkRtNb+0b~-DdBNKwop8 zD}&^>1ATIzs1~|25H}neC~1}K`6hMM^f-MAw$F@ln}hvsMZAMddv{|WhW{+FoOy91 zk}$8i$7tnOS#dnzZQW%fxrkxkoR~$5@gRrtnlWe*r34OOY<#}>zy84ZIwjG0qY}%X z4ssWZE>92+k=gA-u}$`iiI$tGZli^Ny`f(s`@IymyJE>W!Y=H3H~fjqiOl1fmuE@( zuhPfGcD5PC9kIcjGv7a1R#T}=N%$ez6+ZkrVyE@rW63Ksbt}?MaI0sv@W_bz#&{i7 z+>qtqHI%g|2M@(gl@DV3gm+UY?+8Tb+Pzm^V zj-!$}&=YA2C!bGrh@e%WuQ1LDCGFT?fs}OUUTQ-}>l*VMcCq2fa&XFTVFZYQ03+Yh zq_qeugRfXm-KGVa9?k)=0xnxau-++E;$)6X#uM9D_uuIfzf+_u$s)IK;C!hDCm|*u zB2B4<#$(w}WVLUhGF%aA9Q`H{d*WwTz2Z2Q>r8vi&#d-A1)Kzp@>jS7M-m!|iy0sFINJK;y=~D01}K1pJX=d)f!>do-L3cE z-VH2;P;GbfR~|@JSQ%fbS}*kuOZru!)>GAO$;3{-Q5h{e{j6U-k73XWO$4d%awd*b z=h;+0MNL|Lo2=z9cbPw9aTA0DKLJ1Gj(@?}IE@4}7Nak>^yMr0*fk3@K}I1?S3>d#P?5wV>u1Ov_fgYKJL9+_Le&L5t2P(+(bl#Rz4Pg z2mj(M&uMdICG+g_zPDrGw$|k$j{k5tqz3{L)}!C}c*b5uPm1=w;n{~Lz|KO;T_mQm zZ_^-L^c>)M!v{!6f+tPgN~`kHD+z4sNwk1Q)=GKqBZgr?wN-=@kL7*O?(k@7v86SP zY_{QcD$G@iL0vLdg|U-LOb1tEyu~5U)Tp#Jn8%dQp2Sry7F#vZ#HG8aIM-3_@3~a~ z27NNs$KK=Vu1Q6e{f*~9%D!Ql?+-{>;C;4)MS+C$;pLfVpCac1wwRd&7LarLRz%TN z&!EF1xwxVi@!`e{jxGUIP*JIMR;jr@mebWh3jP$jO6K2-A+7uM zVcpYTXIMVKZt24mRbD*iZNS)c)>%W@``|BQ`Jv5`+*`Sd^lkd6&x}o{Ai>hvDyZ*L zmrljWW8&MiEH=I&vm_ySxk?ki0!gujcOt<#s8^G>>p?;HpRvfBv6?$yU00m{FtnfV zIkmHU&VOm_Rxz}OZMlUm@06z&_lEvy2;?RXIn~Ja`rBy~)5~K$i$(6t7=VSYpzQ7bfHQ7AIR?nqXh2&!j$Z=SFeHt+k5Np#vxuj9Ygj ziAq^3T8zhNRkyj9;PxG0P}k$+yefA=Y{l1mre8WfUZwlk;yol^+-83Mi z=K`>)SBBpCKEk$|=rwPq20u1Q+e=zY`JjgY<=9^Upl4#`>@DRz#?oS)Pj7hmhV|d< z-$7-;x=<64QtCggauO>Cq85I|FgY2^Lml=%1u5twnli%}JPo@t`vgK?m$A`bkaA z=w--d;uDdyDH_KN;)~s;ikS=REP4KP)z!$7P z?M~NE{*A5ifK*b)`)S{*Mp?2z9x_(xJY60;(6Q1F-V1&g0H)CnWpaDKSW3P7P0;Yp zxlh+bQBoc&TON_-Erwj`_Pv<^jvvT3ioe26^Ww!KMeIbheZ_E)2VccA#2BIXf~BxK z6f4H)_TDN@nA2c?rvW*d?@BG$Ha%1}34Q!++*0eT@PtdMc!b%fOL1Zm-E| zo_Ow^T>wg{Q+;PSPowK+>tk*TdAG1tO`ySK$+v~7F(XoMHhrZ+CQE0DAL9PQWf*Zu>=&YpDf+FCF#a$UIIEA;x-x zH(0*Wi=k|30}Vh0Yi&}U99wbc~|kYTdCwjHXcP&8^|!)k8QtutxSS`fg_5SzqVzNPz| zV2*3G_hZP_L6n`Hu%S6x{KU(O_YDH_tm{6<##vm|Oh7o-B7{@*^ zH(h0SO6OA8o^_TnK4J6PsLo#N6(x`02;EV7{T^mZ>1%`0t{+e-pM5S4bG(n+kN>O% z`KFma)@uIqsHO|w7X4^I?=vXI64Rtu?*-ST-k3t!)Ee#?@L|d4?;M!yxUN*h5xm&S z%f$8M3z%ejJUfE{*=BREtDrvILStFJMQ!_`rFYbAXGz_R_iep`ay@Uw{dCyoc(QpO zDYrLeme79z2xtEa3RYheDY?wgjnLwpe#_f}pmg{2%hSeEA-lyUit7^={kqn1zOWuYXj*0WTj*;Rtz$q8)sjBh5iccQhyjIQBhZ zYNndl{UO#$;ak+9{nKSV0G4Ly+y`tXr&}0losqL@bL|2^;(yWz+W(QUtuePjjevw> zWK*PaKAD}+2RkHqDg)t}hGocBCxP}29mbs0bVuY1=2 zug)Re&C8^TYv3~jFo*lP&D>)FkEU&}W={RxV(GZ!vR#=AK#sFi)#$z5y}L%-l}4 z>H>iWF|S@bbYA-VE$23uHhAJu?_XL%h$w0cMw+I)TVT4miu8C`=J`?KXZ+I;SGbwy z&gI;5jKNX|h2m}2HDS$pQ)e-S3$fO|)iR%Z3q1@qu<Jw<6vFU@zhSRE*|O8MMQZWs`uBFRIuVoy9R; z0Cf5n-u_f#iJgg)v%E|=y$m#Dw_zqIf?>;B@VqvmG~$prS)UB=TzXo-$_mE3aDFW- zharR627mL7d ztbR{2xKFAoBUd5HCV?p~QZ@EmO^AeB6LlJszFd!baM#Q(>a9@;CHR1l(EWX}+g*CL z`CFEYRZ@>+ON9DB0ayB{=Bt;txR8*|m^OvL03XKC>_r0VJ``N}eI9LU9sJH0uNl_& zxb6p$J=WyKs7*-sv^uJ~>lIR+8N@PMxM$P!eW{^)rXGBbq7t;L{@|Xoe-k0pez~x| zEqspaAhpw;!@G#CtqY_8F968RGb~HO+Rz2yiE~zs$iD5U6`PqHc-SliJOpcT7Odzg zu8|Y-RC;5AF^BGQSnXAWu6k|Zwv^U}j?=+5J;5g;Cv@09>op>-a_nY)!65DI_OcL0QF6OP@;vh-9M zN45R_`#?EO)|Y5{7+POk)IJUXeYFWVbHNA}HwPe(9QxhWzCZ<~j$dzq^`7~Fra(Du zXU@ZRMW!o9ePs-j%U0hJgg2!TwIHRdQU_6sHV}W)Xn(#6w5Lu`o@0)j){ix}Zid+|3cc-YtlM9%FGb*bR zW-_ty45~jB$^b~nmmNVx)A?rsLFr1@LI}kSPng6HSTHp0XZr4m5Cz)aqa5_|N7kw4_#e4Bd|GA^3$mJ zq-6c~&#~Yvv7|oQZW$KIdIcXA^VQL-KT7qkalak?oJWQRgb)KQEf0X+J5~PnW^P%b zqw(obY^meKs5YFFBmyhLgU`*YJ+gb>B({&N9<+bE+;sV8D2YJE2p5MnG}+pR!itl8 zP0-ID#jC#ffQoai$d9yb2i=>woD3HCg15T8%q+`#A?1PR>rTkUUf;5cqu|-Q<0BE>$#yu-v`0p3mA5`K6 zKt`JAvC`_R^~u&5j(?)~rp@#_AA5KIrt2r$DT-XkmW%G$_q$s+IPf|`t(8}ojyLFv9QLtVn{*ci=lx!rpEdc;OhW>^;>~_6Q4NdrD*Bka1x22F=A9yy zqkY~{tPn~bPHG9LFOhc_za$?>%YQh>T?KWa=|Rn9l*Z{jqZV^rjcGf<@!BD$0l~Bi zD}j6T(!qmP>@KKCWEqx;*nN1jl@-JSc!0 zyU7PR8Kl7IfaZXpABVwP&q^D#@Oi`ps~*nif$(=H{SS>Fbz3k4=`SNNTg%#E|L!z- zv+-hgNN)EG@&@5fzVJcJd&?UEO)Kf;^H!sKlDt~Jq2*gE2`Km6Xb7tvMQd9~h(mTr z&S*UW#5c%_DMMr5D9zki7*%<7wUd(qE+a#c!+suLdv3L7W=-pa zX#KI;;E1`&-e2Z8YtsF*o-2MX74r7d1;j@Vw8PFs`dvc!*Yk_&v#!;Bf1l|;<-K~1 znWbqutXuEVX+GhcYj+T`gvv4L**TkJL1^uJ&OJe|*c+$ueu9Pt0g=d$;5kf4umE9Z ze#mG9-?DRCtB`$kziE`RvF4-jV>l`Y^xGs0iS{8bSr$n*=m_25l~%gOo5X%EY5Q5M zxN`gc9MYSy7>GP_bF+T3&HKFxHvaWxdO6UQQ#vQ9P?ASsbhxZeZ0f++Bj{ne<~#SJz{^+T z5GU19l0$A?5VhEK=^C^br~a?Iri`bF*HaHqzlzRpIrNr2NahrFSB_HVqGBLn585%F z`I{FX-*hTy+({3unajuAYgjGCJulsdpWDC#O0%B{7r&$ zF*%^M?SdjXSo9O(dRqRd`B$f*S^M!?byw0{g3Ls#UgbCc_Lbm`F?G{$)0nj4$v&N^ zp-O!?7YPK2e$n8co+HCP0QR%*L4BM0Gw*vJa#JfWX_K^>zvfgv^a5Z3U+4y8CaxJV zEv(D3Cw2>dVOW*0{JNR@nhScs+;$wdS6B{Vg&u0OVzDmgEZ15O%IAH;f}e9mN1*P*kE0? zQFJ9CyD5k{ap|$Q&=5`E(GV(u$rK7dRV%1+mSHY_{8V0G&uqsGjx*Ul;}}*dA;MHjqTL_{=yT=p`r%>z2~YX4 zyo23h0j2DdBJ-6oR6l_w`ow#kFhU725}W@ee*1ab@y?k*P9%khFv4kVP`rbET}~^w zElVYiD~wP)LssaPzg{w)_E>2Cpki7jx0(DyWQANr`>QNxU%3Xudr$PC^%=CO$w>s1C*ulX~sybnUeqXj_7=IDZ)KaR$5AWCd(OG+SyOXYyUL{GHJKZGVBP}D~#4X26tb;vq` za$bIKF*i1=SF3(U`jFW>NKzCnRFCNQ?B8%Nb7YQM19=kdh9>8Yf>ov781pm?>*X87 zKM_>if91U5e>|c=U6E^^!caE54b7IcdjXP&b?<*3dc&1RbWRQ77FktJiSe181`GbZ zu5(hl-L$$6E}XHSK-)L1Z{ZwSM;v9t|HIb(J=NSJtE7>01sm62glj@-w_LcHqrEAB zh`zYh7jFP7K%;fsIViNXl@^C>JwOb3JsE+-fR~O+yx`q7kIR=|``uLJaoz>f4ogda z3i^e4ko%}*GGA8V!@Eb`S011pr?e#7qiIXvg&q?|G03~tz(^7J-29Y&-B#P5!Mlp# zd!|}#oxgg2u-3~2j2=8>;YN-3!$`PYO0M|rZ%r8=$4K4)NpFQSYPtAs;+z3fK%e)aY++^CPs_wa#CTQs!gYT0 z?A^ zf4;wkC%|_C$kaD0L$`#+HIqw)7^PF?*0A4r@-8O~qI; zS_`(L#Y?LSuvkD;hV^z?@mY6|R;@zI^mFc)V$6=um}%X~_9d_F3TV@YX04@Zu;ljp zodAhz?L!L=_BRWmEhfe$22a9Y0MvE2I)PqZFE8giiwTCXgr0{p}MWW+V)cJ@hXm@uuQ88qqK6$A46&@;}6KJbpl!@tOaLG693BgJ|PCNt*D} zL8;XGE!u{!>0+lWD^E|WM0RRg{TbD5L8$Xuz_~tY0Bc)P4XBlsRX-7QKi-(he&$H1 z2NY>`?GyB8v_Sc!V|)qj``TcGfOLs|BdEGH>Q>sS9s!~W(C0krNEX+(WplI!pGked z{KhUa7i#^wqx>7TE}&MGdOi-!6_^2RW^xPeS}qvR_E3v;a{t52y|;DTr-q_at3e9& zD6~#`5$h}h1Z4Rlj9tW;sQyrKWlv8e*@}B?AkYEM^Jm;rMta~a{b{Q@o$o;3nkb^{ z&PP)UAwN#aFVMk4#Ho2LxR?}0`)is4d8eYahN%0%BnExAou$nZX~)>ZeorW!p}mhT zseQdv@njsdXcoffB_*}4eS~s<6&rg(0G7POH#tWlL&&1gkia5~W=zD$@Y#{Mu?r&7 zA#|4Lbk3cK!4L%oju_Jp`UuB}ZbH-O$)>TR!+|cx1E#VMTF@g=JIXtnnoJyHYyE?Z zUye4ocBGeg#Djh+EhO2jeg-}NKC`iZ3<)gU&WmV=3*5rbeB`F~%?;n*ukGQD_avii zsAK;I4Ew4?M|Ud4Zkrlp%EM@L;IJ6KcjK*NGDnp7aYV-bUO(Ld%}gnCY@SiEp;CSS z#`bjmrOT!~Kq5WX*5{+O*nLKsG*RYQ8%FUe{c(w0wEkyxOXjaeroN2~w?+Y*rE#n(n$|~ZS_+@VH?U0>Bkc2=px>KQs7@Q?*mEN&lEX|xl;H{aP$eZL?N%aXzPuhHz0pVvueyfNoDW( zb^nR4Q2m|x8<|L%>uf)txjM(6PFMDOw1zGGJa{87)heap@ewmZ+5PBgEeMjXHTEj) zVyf^xa&{rx!j^#_|MErI&^9%S)eIxV@%_!!AEkCeFHb^-a9+mInjy9J>5E1GAL<@; z;tGZMEfd9&N>`HAe25Nxrn?X$6gN?jVD`+0_H-+yC9TxRk9Z4U`_n*#ne4#HW?h?~ zwS=QU#%GR>vI4V`om0NOJCAVGEaI$(8TbR?z+Tt9cU~o9qGE>H2YE$-K>7D-{Me`)5d|XGn&gQ8+ zOM3Tt;&;YG^l`a8D8-zl4G@0T`hL1TN4Byhch}2}w2c?>j8W#5nWi+&YEZiwgPKQf z!t{976BfQM$#8p?R7P3xn_aM>w1}xVjEydhidy8U;`5JNj;7@@(jGc(Ri|tQsBN1U z$EIScqP?;HP3Aa70A4_@)3~kMTpU`a%x-UIzK>WI#I@HO{HF)^46G$wdB5bz6du&7J#dhF{Xe-RWOi+fqSf?)ue=6`r0C&*Ly@@2^U`e2dc zG`El#mu$a*Ow_uYPE%6w$0`0HKnJ+r)=gy!HOFXY-}YT;>;=c{jWgE@=zchjowQ2F z7Swk)b995pw?CPfXVEy*yJn6!1qM$VbY254an)F0d+1u}EEUzf*ybUCh#{v6u;}@- zG$YLMGW8NKzHDb0nC56}cqK5x^K!8|+jpQ0Kt-ib$~hyVW@;`miYJef$=kZp^>R6b zYdeYY%uScw2g8Y;8K+V7>RWW#+evizb|3F?m;}`!$L;s_^)D9L4dxzZuJkOu@Y&R( z6`1(N)pU$lIub3nmytiXz>J^7l>N+n6RrF3Ia%V9=Pshu=p$TCQC$)eh5WVf_JDO;v3gYvg)cs;p#8K!*`b7HNHmD z9I^eXgn=tBjrW%ROz7@iSNan=Lb$9G*rJKJ8u}$`JHn9j#qTTav;lN$=d?axBGouz zy@q(&_(3P(bMKmlLu=oSQ0o5I={99&7Cj4kOVk@|F^m#C3nRs6rAum_w@yQ7g~!CoPBuuFYRtT=4qJeP8SkkDImB6DMX2&IwDn>P36Xbf7Y!}(|6 zAnuP$S!Er%c?lO%@`j@HU^>aL!pA>+8?m@J@z*IN?aR(*zv0{7j}yi|doynYUP-?` zNK(480Hs%Awao#;KH?xSI4a1GuBNAWNr9K9B-Cb3Du%RY2Vf?7G;}>Lx!x~+Zhewv z40xMK>$}2aQ>oZ>3z%8$2e`3iakO)u{_gxApd*g;L42tkdr}yNc|QFB2ic->pK9@xPru?NH%XMSr>0pLWL0^xrD~!!v+ZV(D~n zan_*k!W7b~XX=`$A^HGi8HYpC+CKV}k5-}-E^Q%s_irvQb!D>Bcywm21@AtuVXyz; zd6j5RKA$ZrYJ=XC^^MON7u}CDzZ~M+SK} zyEY^JMkI-t=IJIr!Z#hKPky?Q`-tHbDpvMIaYx@>F)zC59eW-_&v`8{`FInif2Pwa zKes5}J*w=^l8(gTMlmtEu)Lqe>zZ*;^7)UGJg_Jz_UTHz)nkRN-Y`1*1u|&^A(z}2 zMbe`}IRJ$g)&4jvmnr|XJ}1$DS^$>%GBb~>V%56&ZwoZ1w09RDe?#{T|Cgb_8WbHm zI_4Eul<$6(&9{e*I6}Ff-lH|!BDY}6&=#P~He^Mw@sUa0jlGm(vFR55``SNnC&N}+ zIqpJT*0W=xr$gztMuyI6PwxdnI`9OMr@1J^=*9zgxNd^mNy&Vi@-+Sn<#d~0ZFFgd zCHF#dV@n3xj>p;#{K~Bnz%pbq-I|+`?|S3BXQDprs4DI^zD2S1mA<;#N;eTech?zvhC&B6TW7RaE9QCk{lN6S z)sVT7+waI@O2e+$eVG&U%b97$o$(n71!>X~jI_bYHOoPaspNX&?a|>W@u`r8h8ave z@5clP1m{@1S-w#eoWdk+_r^HVI!n{I$~vGgd5Ew0E@wy=v6`nos#Pf=7f6Fu5oE~g z6Gv;SjJxM__K(NDnXA&rF^sbpbQ~w_t$W0#FbG zUUn7}E$J!oc5=@I!ka9qz25NVMe=n4_me1tl%-Rr;-y>=Is58L5wP`#_Kkd5&9N4F zJ#uV!9%3Yy~Dh6nx8&(i{ZuFo{K zmvtZTL#5G+A}%NUy>GY|)5o`>mxP)%8JV7L#fRhwLMr(G;FCPkcdvHP9LNSCeQ@?W z(i64od7+%>dFp)<78*&4SdZNACtc+lT&55|5y7k!Wflee*ID7Bcqhpy#!E6q_-Mo7 zt~saA@j($Fr=+f0em`KF%j`o$BC#^TB`B|E^{cdXysL)ummD0r1MS}~ngoj3hM4bP z-%>6b(IN+}!6M2pY!<0{YOvVnjO`45B$8-prXWC`q^rKiKfHYmZf$x{$GAVU{}0dQ zZg}TBQ;qAsdlbYxGSZ_(An!H#`=bh=yKVTSPFlSE;#oB`uf%DLYQlTY#M%?AEiHSl zaB?fH3y;K&7@GPA-CJPBspXw6%GhcZ>)bbn$phbTYw@ij`&D~gw|Cn7BQDfRwqZ#R z3Fruntgq?@t@ftohyt3{C5&?-@H$UXIo?3??>sD*hTmT|TKx}HhwM*^(D(FZDuw~| ztjgP~gEA^84*mXjbDMSch3{JAqqYbgC1UU~h^0#sa%})fUHUmKIu2PPgLzmK62j5C zFc8DT6BcQ?eFT-PL-M$`ed+%w>HcBVyI+a!+xp5i8nw|`?m2GM=Y!wGBjTGSPFj}y z8Og}w!iQ9UC-^s>ae0W(SLK_*vatp+ z!GT$t=)*~y;M5n-V3yTn%Ge9Kw|#o@SWT)q?eMNxx8!}s4Yd|l*X=n$)A8V8f?N%; z%e#~xFdoux{aN1M+86u3VeyfsgTi#tec7Y?v3Ww0Ab)$w zqEU@I{qBp|$g2y0V`YP4tK6Z#DblvUV|4YeA~E~b3G;lh?=8F%zI;`cws>WT(+?E{ zUy=SuChAfYjoi&22yvGU-UXRY#yeeV=AHk;YjFR+S$MGcg@8-Sk2kTKB9GrIT>3K} zKSzYTMXIJoAbO1|jlvyJquu1@UjlKF3u?utHk-AhYw!@;GQ;JzHHYCG-gzxQN$XQeN8K9VarWE*=!7Wa zr%l@UTtclRM7et`Zm#UAhZ_1h_)I>`r&lLfKL{OUoAAl8Egr{!bO~0|p8d$T#tfdH zUg`#d)AONF?2B3JctukT%(U6=@@*%I-qb;7$jpD#3RcfmPgrHxvC z!haje1El`c@kI*4TfA6-g9+|Gf)Xx3huj=h|L|f!r+5GGR!88{niIHhovK>*)UYo| zxB}>zL`ywq?|SU_jPY^y)jIC;_gAkWXk5)BZ@{x?w#G$8v!@Q=vU|_>x#|CiO2j|q z<-;uDU)~C~WhQ2$uc70OizOh9Nh}!aNisjj%0^&g%?kQC;wFHtZt`Muz6RbaT!Pt3!WI;T#1ps3jm`qH2Yyt{9Y$z*N&7TM4#hDzfsxJS#?qU(Y%#HgR@dt zDdE>(vk;a3t+Iv*kdOWb{hg3UNdAK5VbWL7>!R%SfY9io^~RUuz`+znL!_4jSU(!W zK5xRyl)Yjj4oX{MG|`jRbAlbF0h^^##ATdbs@jgUbX>%X`eq09;C@BQ@`XS#nUBLz zUmuJB5Uz-kZL4!VBAR048khH^A>GaP*f+9m6O$|{)*e2X3TmBLo!FOVpXPg$5!hBH z%6y^ui*DsI*b_+djhDXmb}6o)MPk^}->JX!y2{ z|6L)<_Qz)nC6*HjV50G%Sv>;mQ;%^P`0wZe??B+a4o0uKg0_$17n3KuGT}N$T3Yg& zxM=ky)IYPZ;kgHobr zVrX60nm1Uc=WwRDmYp5?V)ci^3(B^ZRNjSjL_apxrT0Q|ban)qH_%e@7kr0^q3hE0 zr!#fLbOmk~5yu?i=y%k_Aj`GnqjI!RBwPenTu4=)Gz{*|o4{*KQYGb7>Q~5s+J`9E zrED=QSOmRWOy9?iXUS#oBa11)Acb?-6}VW-Zjt>)(lwC(h5Re>1Cnn`1t9Ui`$N+& zbNOmL=T!mu+ImekY|gRn=GkBwes|3d$?^=-slyyLLFDC1wjxDh*Wd}g49uKvZ(FSz z>BakRS#q#9fjla>=j96`2lc?C_a0a-AL1&(rI0)<|XT4?BTX+IUGh@opTi z{8CyHa|=ao!FkBcX{F0h|G2U@^l$zV@d#&Z@8=P+Jm0Iz7 z^av6_XbYo(P6r8Zdps{8Ae6A7^OE!cp%{v@4c#!M>zUUDu4cPx$*q$|7H&@yg6ZL2 zh!Vo10U_f+?sA(Wtnl=mgdOl1ag1XcN!gIn&(kxet#zkk%xy~hFW7Ykge9C)9aubS z(DS7tF;B>uu7d3QH*%v`NM7xq!4U6&M?>X3LdXZs&v{_gQsj*#bRqBZBHT7=gn#*! zEWVrAi2If^8Xn<$YY5!H{Jz$0gKaZNoVB0%=*6EcvIVmIBzR@svfL|GcjF6aSslecN6W|@387MFkOed_W1Y5d0g;Xct&6#4ns^ zv<6?T=&#T48V0i8D02(a`;(6S%y@UvbjSGN9ml&r@FL!{6sgAV$fSXHdZn6Nz3{8FzR)Ek_#fVFh|0{nN*f%yxzsk@z!h2uiFTk=M}|dsd8%PbE*a_x zdR>H!U4$iSs-X?(;o()>pMEnE# z+6*(3@JJ%`Ow!`kX@=)qPZQKVG%nckAaw{dCodTd=OM7TRi53h8d))UcNdsQKu z6g>LwlX1<7BEyTTCneiD84C(%f0O|1I<*RUKV7%%@2E9x6szC| z;atfT0L`1Uh2?$vNpLi(e5YHVBroFR_8wLP1DpMxms?`ZdfT9Ed~fYAet?QGh7`Ot zNKQ9-h&2Yo-4=!2bdLU98@0e2_Zs4U8ZRIv5Q6(aZerS~uE+aWiP2+*A$Gr`B(0G%M{TC*_DEfB83KMU?OaqWVk6L`W-#vLco9mLJ^7AkIM>xUzWk`>OIILy% z5Ej3#dyCBpA{V>z|9t7{TY!MGc$n7Yt*$(#(V*{KVO%ud*W%~2b^l%J$yyvDFe)=V ziD6h~Zc$=3`xqN5$(&s+C3O%2F*1EU0vq?UY2ufrREwb|lp>~I7KnyUSSy;sn_z7) zY*f_DtHW#fg8vk^x7h@`X&P_|izzbw@QQ|sdP+kWJT(^!It%_ved(&d_y#+j3 z@53j2q_}oUee$}3ZwR2=VD5sXah31YQd{|0+Vw4#OvLy5u=Q(5yxyX&bLQM^3BUYo zYTN=Qp!d7qc5^;+o@TSD=;`;6yc@CFeHO2c-rCtd-qcKEx7p!{;G-lZ=8bP068^W~ z#YMrTRoM zX}YH4Fv`#f$b|Cq5>{<@0mjl%Nu{7GuhU9C!o}G|aqYOT>t6RO+^lM}N#upT(wn~pj8kr@(c!Z)# zavUj*xsteKn!{Qf<26Q&0)yth1~i=#rEtDgM!$U|x_&`h3@E18Rw|->GdpB!?-;-v5~GW;IecuuEm_#qeWZgYt(=kb22Wk z7e%|^TmdU@yJ=O70DLMguGrt(JQ?+k0zu92J+>A#b>{ofQUQmb8;u!?kXWJ zZm*%lo1=AlJ}7hQV-BcE!K94}y!tr%+u}k7p_BsQ4m%JT=yR^m8N7YXJDbSVY~B_h z&STz2wsB4f+S2Xe!g7Jd$5j@sn)hJ0S$&b;EZM&(;UC0$Y$t`IXM{S$n+%X#!$luV z`{(>QHCx|}4)V3xcq#M~p?|G@JuNpzPZ=9yC6~=Rii(kLZi4RWBzC@XOhl5*8BY#m zZCM(~lSRPnT+P-~C%%J0LV_{Z87V4tA4iCgMxr_}$#k2oc_ws`wz1W;Q>9-1^kGy4 zX;Ig!6pBt6zKPvFb9zU$Mkz>|kyn3F3BrHynR)L$6H%GK;1|+&AJG%jE!@&NA)Jyh zuY;wrJ=+H?*(6mYia4`Dj)s8J5GMHdb5389?*#Yp$6GJjMVqCH01CGMwSX=bNguG) zrv**TQVJ!`9t`UP0m9|H#>~d_80qJF4ajM z(Qz6egXO-y^H;-=`q)zM+a_%)a183=PI9nC5DZUytBl*~F6vR+HTqdKHTG+4=QQH) z6`(f1aBvn*sJYB5*0s1)iYH96M%XqsJjD7fU~$1-~KL%d~kJJCxn&dolTEaPM5UWKom&bb3u8Wx@8=n9j@> z8Q9mck2deAZQ@Xo{=7~z*rTRU`VZ_-ud3vU1KdtAAuWc9@WRdkC ztr?IS?u>>t#-z4!!fbk6T}D4sk13SbeQ8NcvlF-70^MRZ91!-JWPn5Cq7!0PItRW7L}kN4K#fHW|G1>!XPUzrO=M%G94 z!1n_klXeY_O)^hC1RB$I@jnNm?zR2HE3LJ`t}On@MK1RpwEy*c73=$Hke8WJTi|lq zeS|Be_2U^FCVX~u&Ud%$_JhUAm>CHqKn=><=eqFrI1SIOwl#2-(<&wUMUVN^7had( zE21)s;NYZS8i=zCOxTbu$x-Eve2odn`Py^Esz4jkN|E&U991+w``zIUyjd&t(_@A2 zPEf*%8kvjetca%J5SAg=bna8j9%!1`kg;2;8q(t$J`>@^Q z=!Ch!_6tq?m^SP7=y=7SY`^WLPjfq7U(a|A!BoMC9qb$DSnD4swQMx==}ko--$krD zaN+6)^udl&}6hvr<^q()t~Iv<@ZJcZg6%Ht6!DS>!8?dR)fd`c}Gm6>g^~PWElt zK`nf2&42JwF@}BnoR`aIWO;5`j^eJJH#V4RMRKT0{9@uF`KH}g#r*5E>-Nz}S);Z} zoR1S@ol&8GWQLc$2Ph^=HA*0f_o4W8ytEfsKcHf;aI=i}d!4v*4R0NlQTBxR(^Zn1 z{_g|>t}M4sIP=5v+xvPJj+bcUAk<*uPRh-J9`=+I=u_w`t`Xq!N|FEyOc> zU8dVN(ssLJEUA;ig^n$FD9T)lmR`7gIYFi>5xu}x-ZMx4Qu7dF^qc#>ev%+hf^eDp zdqn05s>IwVUb(VTL!?aSC3j_ipZXpNYqV_aAhok~TyOCA>8i+poH``gm1<1kq($b? zyTlqcKi4FCiAh^DVd+pTNV2qIeuJA`8SQ=O&=UT5p0633h6*vHtb(IXOd;MS84eKV+s1CCfIynq$6${*Nt;zQ*i^UQCsTdkB zhy%IVIQaKqw@Qhtc(pSB7HoNxz5ZwN9HV#YZ+G#H+`0}8$`GM z8dx+x;Qh*(hAs~{8j>bC{l|^Rln-fejd|zMz_ATo^L7xd@a828V{e~h454rxtgsE< zOcKRRKh+OB{d+gUKC2Qs5uxM zc&r2RaX?O|Dpk%YO&d<-nqGj4DV7)8Zz=$}?fmKc^F{JMxr_d|yjWX}YN|^D(8%6) z-<|}tp_YN6+j=M&PQE&H0i9QB+PS);|J%k;CZ*KhZzRoIvlIW~OKBeC>J0-ej6$kv zJ!r`zap+3N?<5$3=Ls&39gV{qL`WiPYnYJspW2HsA`;Jks3@x;E6+d`~ zf~K>kgqmU|PL?Ag9aZo-zQ!c(`2WKbZ$~;^Y}@;W2Uu$OGM8xk-r1j&8}Gc)Owo7Z zJO(&SAM@#_z7jp9jR~$tL6{ll=AQmB8%LjU_&p}-zMXy}H6(j_kOy%TI4n2uJ}muk zw4K~ES}1&x>|zS`(&RErJG^Om zSm2r_&Jgyp3zm!9`zQC?xbvM7WzNWK_lE?}qW3v&uN=GtS4_c;;E@?`1*I+g zP8rFk`&vS5j;+h;y`juHtYv>}UMtNBiL&eWD(>petV&NW8ZEt;kr@2B&zd<$L*1)j zL;83Tw+9YHP zkJMV~SD+x^YD`SL?)inFXSb=v2FTZreE!`MJ-r?ke%K{W1X+GOl<^O*SXON1n$MX4xg|F(t7AHTXlUqcW7OtH7%eaA_Z7j! zI1G(6s%++)uk!XDCl0V=?f4)%aDR(nV%x0bc``$;8|#v3QN@2BGLN|>8U_*c4q}XR z_bNZBdcZUm@+ioHnyYy7=Eqh~*0Va3RFPlfh;4O!EXjhKnUQ$zfaFH)uA(`i_Oy$L zo5Ojv;B|sCz+(`n%~6O96yREub8Q>Y{%WYRQK$P+N7L@X-(RmAbVg0vgDSX$Q@Qf9 z1`7RpEti%E*sC9WZX~AGy7)wq7t~zVy}<RH>Df$c7 zv9U>Fr|jlM-oT(g3v@SWdNy-)@e3@YyGwo4oLdr~^H^{0U}`p5Fo2s@fzZ&%mqgVy z5`qpY0*7^SON`+H?idK)`mDo*%khE1*hLUTamTcX|gJaCAde$qBAMr5IGbcKt>$%v=@ z9pjwX;pOdEdqrd9(ID0$t%Wu=_7mMNnHU1(f@dj;ex!HR%S-FUKRg=m6?Hy=()((k zpR@YEV4MtcYPwyTZufU{qQYiUPHN3d9vkovk0IWyF$WUP=Qc?g6UN$8LmJz>F07$b zKxm-pq{8&B<+}#Ew@L#?V#v4Kn;{T;@SM7Mh-F_dB+By1fh03$Q9G!}oQUQ~f;%$Q zg^GIH3{G{@)?vP*G#xwi;J?AP_mL-<29LkRDIU3#vW?zq+b`9WX}H}vhS#&8cM>IU zXE1$`p&AgCakZ@)mMH$~9X?iEU#LMNM_Uy`D*Vgk!QW@hssc>fmg)mx2c?7CSYV!i zRZ8yk)P;-D(#Po}u6q6$2iwI6wf5eE83w~0gX2!>qdcx&-yO)8k0Z0;Tuf0|6Upm& z&Q*T`OwyNvcs{+lz1yiY>}{q|P73%+{%h=ye3#>)5E|}_$GEP92$Ysbsi9oiW?u!c z^pUKpmzvt;+GR0&!Bk6#-U<5N?y&&9a$!?BcMu|QEN*X88CMQo8GPsVJX*ovnw%$5 zNMc%Cp;0%3$1X?({aE@{{?kspPT9Msh=JROPUC<%E|u+Lu}MxA{Ju63W#{PUNlTK} zo4vPqLQttGo+9wR{u5J4qA#)g&kBUU@Y9F!UfN{|CPvztjkGu0E;iMMJh~rywUVgg zHe0BC?!xEddj8Vn*#W`Zg{7Z#O{ov$7rRN_KbdReyT4ZhZz)oQ`Ls7jmv~%}(XX+oGpevKjbVOgcNCoSj$kV4w z=?OV2Pejn)Xj2D{8O*%sOD3iw>)gm4Et>jx&FNqP z+Gx14gu19^@ZJ*bfJyIBt!4Tqdi;$`ugQ8DUD)UJC`U{pV7PMF=#Ln0jINk>gd7hc=&##I5 zgAbDSghhhBEFh%tS);%Hv_=*I@)p7H$JS@4MdrB?t4A=A2G$RT2vS((`|fY^4>zUL zX=ru_5pC`pm2m6$Ab5*3Kn&`+&DN2FR3V0c5Dp+l$~x)r#|YM6 z;Yfs>o9}0k4Mt0oiQX7cZY#2iGzpM6Jg3b2H6z15gx9M+c3Y`lhQdhSUYYRv|D0=#N5#BU4Wu8zyn1j~fV z9CmF;Rae!T1$@+&sGx{{;MaLVq7W3UE3HrI)$q9%p8IHIF#gSFNqa1qb73nRe^jc^ z-ep-;`O>651G5%MT%7hqygy7b@!QBHL9W#IA^_K<_TZf6je_7_Wp$^a@*rOJMtXMW zj=+d99sF!h4_$eNqMTPO-AUj?Mml`+TXDG$LY0ixr(w&N)&uKOx@{8QV@K*RbN*EL zy5uN7=HH=u-51!3v>>KagBW?*f@jVW4Ki(1KT!?j+lC7wFVzYmgh_MQAS8`p0ukPa zFO}_n=LAesZ*YyC%d>HKY;n7MmmM)3(VMvnD9ok^omUelm0Z)#bPEzi+KJtZY)x6>0(?%EhX@eFnmh8AQ9bkdm7@ z6Qw&>(orl)^NT;Mtyxsa{kj$;S?K(~l6v_r)q0qe0LLot>z#G-JDZRZU6*VbuL^Dr zVXXIhS{>1CVit((EoPy=|2O1(*}7GBYAO0}{Zsa5I3`{r32iMRZDuZxO1{$Xxk_<> z5_bEzu~_5^Fx&qnJcH8Z04X7TJnjLdiRq^@KmOr46>Hb`k2K@1Q`Kk9rmba4a$28# zigmT}UC{i?ktPW!A<56Np52|lRbAy~66O=EiOJCYQ1ju>eBvly-lP7&i<0LZI<(u) z`}#a7&COJe#Y@wC)RWN0fl5`4>#WCL$?)c9@*acy$L+VkB_leBe%Bj;WjVV5_43_k zqbw}}Q7@N-x}GXff8En0D8}2tTcOCbuW-550%SeT5!39}ts%Nf{xf=rRdhGwF8h+juv2zCqb>DTBJ%6F6=4MUGK^ ziyDp1Q;9*?`5W1vVVKJhQlo|7#OlboCGI1s!o;SWc66RFr!S+p?Y_=9UrSbLJAsDM z>0o%*tYzbVqMaz(hvs~pV!w|CBYXmml#)hiUCh3TShwML?uUqRq4I?7GDix6l5r}Xv1Pi&z`lN}C+R$WA7d^tZ{_h&~J~TRg9*W0O zdUkZP!=LBOdJUZr&-f-KJj(r-GTxHbo|;U9kQq1GLYyZj#C*KNFhau(nclyE#4dn} z^duQwygl4b4v~FR1_2kla?7XLVcm*JHVTzr@`^`%A|hDEt(nmJGxPAFtZTT92BfqI z(wlZPkUw@^iZ!v=Q`Cxj#9*?uk*CrjiY?%H%~97lU9IW{d=9nERDjvIM#_`6@QYh^ z4qWMZ5J%5&6;uVNOtv?XbPkO!h2zCD%`#D2HC34ko#w+H>&j~PX z0&8P!IRBO-@>Q^Or6k)>i9`k4njB60-KnV`L@4#;@IBgq1?qjv?e@bSa(6t@V*;ji zJwH<%#0I%GYS&li40tRt4>lDr{JcEfnxVtp98S7u;jyjnqVM%+ZNx~bC@%~wids&E zj6s?r_C83hn~ z9llf|ET_}=p*m^0lqs`-JpZrj^#_1PpJ#Gbzo`8adcq8juK;}#9`kz5q|C5kCW_>U z?IY%7lRPqLu9xwjd*!?z(d;ijcwiOJg>nWRIn@@5nuHZ-?~{CiZLB4?O<_ z86N*Ca>GHr_5GLM#pmT9rXt-qP$SPWeu=eXc3AK|B9QX;|9rRwcR-Q)%kENv7xUq& zs(yEj8nw0}$#1!q#2#dP_B-j!P!K#Zs6S;R-Q*8|N{i)oqbM9W6!mI| z$kvJ&v!g_Nm@7)XojGa^ooRM0fjoHx6$-3SUTDiXt|EQ&p_mGV_e2Wsyr>6~%ze`H zvwOl|UQvR5=fxRBPz_CED7vJW?<$JYHl}~a*TGopYVQ6Ns;xTTn5mn~VOlx{8RXmVk4y?xC#r)Qe0B?0eJCd^$tB-)%;|@ zORG6R$$}%QgtUxbQnpvVECedG&l4vfx-0Q3eov)7m4Nf<2nFSzWK2jXmKZtI`TSPv z@4n1kH2HSn`iPNzg5ELLcwRWh$IIsrZ~I(U;uqI+#*USoYf#Bz=cQE@+g#CEY+Ei( zee){^Z9P~^Xf2s)PwEn3(-K**t{Y9gNsH}NfU=ugK!BzHuSEG4O1b1ny#?9Z)db+C zfYI!vPSA`nhRTsg5aY7qsqFH)QC-^R_Jq*A>Ga?*Y+~049eFr|l&qarGcsM^s#JAN z8exUzKkk28ZJnz0CrBXqYDx^aBykyYxO94uq?~M)rP12djcQ$Wz3AZ}`wWuxWAY+o z@~o`8wpMdXbNxPd@_7d9{KzpT@foG7u@yTd!yO&SBohU`J-eeq-=&X@)$jV+bH*R_ zeEG@C(fB|^b0BP#T$8W##{K?lkz{;lmt=LA{i1VC%dl}UE)^iE5}e{Hpew?%FJ&*N0eSMpl3ab0w4 zYboo?wa2w^W2E$Than3AH}Mx~v#G(!_}tyKg}$a%WAS|ks=(kNUxvVG53`w8p8GRr zYT&2t8q>|`lqP=Y-=A$4ww?Xke_Dc8?syBJCGMXT7rHDH_RcO&F;hnURH{szisuB05zh{S=!Ahy- zZ0uwjn!h&W)iQAh8eizQ7-Wvg31B~sHLbLW$$Zd*#B0kt!%0U3w3{bfvA?+9Mqe_p zWN1cm?R=*5vpi$GiE~8Q+Gf`f`&2IekxfRr9xhTB+TKr2Nxa8*-bHiC=rm8nzr&C8 zos!d^a^r?=wfcb#*E6UsPT29ar9kJ<47M0rI2**eqXo!(Py0)j!Aa*vaFgiOOQ^7X zC5&UX{h=KkAZ&9`eb6ZP{~9~x&wyji|Jz^u?4LV8G9Kcx^HjriU*O#)+Mm(<_fGl_e*ysqOxunVoLvg=zHSDujEAaT7n*H^_6t&N~nGCG!Ib z#_ZAwJE?5*tQNg2vXM7vHB?7cbAf4iahuwrYZqb?FG9A)&Ce#vFW4^H_Qm5t6Lx9-X*)tNvc( z3nP?8H`#r%I_kElWxI9Oj34>Wsz~vgfd{9VZcSFoA)TbLLAfJi%A%tPwO%AcVgA>+ zGRpgAz}5z|g_Ro)_56xDsa#X^ewBOkO8b2xvZmj;}-q^KNIJQo&2l5RRko`Z{_Os zoMFT|_+GpNdBjcxoDtyN_T+|`+EVF!_zF8WJ-oV(M!!YKdqrs;?ietQy~TnoA_`?0 z;Li}ufxjBk^Br}rE^ELC_R6Axrn*3Q^Twc|tIZxn`IbzUCkoCOxX6bpHBJT_n4Lsk z#y0t{u7}*P`IfA0_(^ZI_EXFf#nE&sySx6qR=Jyf9W8yI`ooADXO4u<9~Q*9Y!-oI z6@2?)A<8Q9YK$k(t<26gn#Cm*c?@~JQmWL^p%+z|R3=3tP{R6>ah4>go$WID(a$T4 zqU#bh-zvK`zCr>XUwVksM~A@&m{kR3zd_nDy0EZ5ClVNhE@+qc#+Zq9Gie=4HPHcw z6}$a+DH=hc9~qYx5)Tlt014}oj?=0X=x+n!h=X(EH|4@nf^piZtLl3u(y$(3(kkhN z=$!d*{L%u&N%yGfgsn^DO$&S*@M{~O^Qm$YXwz;*berXLo|loql0LGlIb4GVJAtw=MjmaNk7a0h@pw#TFSF zqI$NubmAiP{@Q*H$Xr*7bbeI!Q=8`2-6#omzasreNh=a)G{9=8YX%F%YoR<^(2G_(VC)8GMrY5zYYV~1$pa=@DCsLF$J?(nlr&Y>}G z-v#My{Js|&#E-)wef$3v@*Ex@5as!h2}bCN`iMq?ce(ISTdmlv@K%*rsc;8GHp{C&-RJ_UqJn zPpDQ51+mGA>uQlS_Io~lT0yAh$-y?U8RZuL7{U6&?d;n$U3g=dZYUnY&~H=O3UKy1 z^i@h|X0vrCpLA-MlgqYRI}HtfeYkZs%;M1#X^WW|O*8o7g=JKMO_jFc_bs{XjB@F5 zdZn69eDL;XNrk4Ky*5DfuN8Rho4z-^m+D*;1Qwvxv;HKxuPq!CJ8&&p=mhg>p#AmoX~>yrn0~K^VHS@c9AnTq_M3BD2+{>qWSuJECrnk_HZ;%<1|tdvKZhlnBAE3_i`mt} z9ur*WYTg_C+^d;)uWN$ICmk1X#HFT00A^y;bmXuPVfP7tgyT{4QhWRe?m|Y@Ap{mL zGB=S}P`WLv!1u_3-a(}@M_lqv%B}839k#g`M6~reu4(`fm6T+mH9;f&+%(T5C=^~Y z)@gpsuW!~assfaNehOGGskY6AiQOm6S<5KRPBi7QB6eFd=s#AH8FQd;r`m;JbJcT# z)%(a}0jNQ1*>>15`2<&#KB>+apki%cuiMUXy}!{_H|6OYwwqCnKeD0n^ZZM4pAjcp zJL26~Z+OtGgv()K;o}LsRQ3(1Ylv2P79r?a|CAlwr$;mzDXQo>h;_(y5lwFDc$2a( zM5kcSgP3^a9!^QbFfX3xMR8g#~ zM^@D?IX(Lx$(vi>q++yJu7T0K5rAC|Md3e^TZJ|X7t!@isp5iLmDA~o7+P;X(gWxi z5``?CxNbP6fvx{&Y=8dBe0}J6nI9#4F#ta98i8rDg%vB${(j;Pfm4U)3R}TyF{I+Rw?}Ee>5JK=%W@R0ckSA+ zLHMri{sWsQi|h-z*pHtVvUqOkq$wWN`#PHuso`5EeW9^(1*>&eXy2#`Qo3_2P9}1j zemaO{d%Yak0>Ie1NC=t5#Y)o3xx_r5RPltO*%~^3q1CUs6S~_8$H!~M4Ebs0mDaeG zU}Cs_!7<~Wf{bpY5aMP2n#4oN3-meedY5wmk_%1usr$sSd3&{O+Wp!XF^PBJ6Ao>E zF_CS&e5w{pWrI(4$PNS@XY1Hy9+AR38-MZ}&EE;rNAIP>0k3=PgIg6YF6PBljp8zQ zt)q^bS=)wk-l0-UU%-E4T<5wGjpPN!oXLgAY8o6mNi{^pqPr+bb<#YMaA6_!X@x}! zV~Ep)9xlGd{!TXNi+0MU@0&jj6cOZ0?LsxXr&inw?xfm>hKNji1`Sr9c^njQa9&Q(Q}DyNDDSK7yzV0d-w+dIxGhV#=1-@LTL6PFL+zTwiKj~pJ)gjs)Z zj~`E6#@F+n@*o~ou1Ebdd@}2@)xl26ajsxM@7rJ_byM=4J8$1WW!tpYI9Ism6qbaN z>!n`txnJ#@FB74^Wpra;W94`7pQF5J(@F=#Ao&k0rL5Z8w!KgS!z~judUSR2sp;?lAnJSxB_MtC=GKC! zQu(5#nz8~`l~dcU$Nb~4eYWY*LZr*z73m4`^AYpTEdA2ys=VM|QF7`r)j%77#QEk3 UxLwX#OvE6I`u{J>^Z$ { + let s3Service: S3FileService + let fixtureImagePath: string + beforeAll(() => { + fixtureImagePath = + process.cwd() + "/integration-tests/__fixtures__/catphoto.jpg" + + s3Service = new S3FileService( + { + logger: console as any, + }, + { + endpoint: process.env.S3_TEST_ENDPOINT ?? "", + file_url: process.env.S3_TEST_FILE_URL ?? "", + access_key_id: process.env.S3_TEST_ACCESS_KEY_ID ?? "", + secret_access_key: process.env.S3_TEST_SECRET_ACCESS_KEY ?? "", + region: process.env.S3_TEST_REGION ?? "", + bucket: process.env.S3_TEST_BUCKET ?? "", + prefix: "tests/", + additional_client_config: process.env.S3_TEST_ENDPOINT?.includes( + "localhost" + ) + ? { + sslEnabled: false, + s3ForcePathStyle: true, + } + : {}, + } + ) + }) + + it("uploads, reads, and then deletes a file successfully", async () => { + const fileContent = await fs.readFile(fixtureImagePath) + const fixtureAsBinary = fileContent.toString("binary") + + const resp = await s3Service.upload({ + filename: "catphoto.jpg", + mimeType: "image/jpeg", + content: fixtureAsBinary, + }) + + expect(resp).toEqual({ + key: expect.stringMatching(/tests\/catphoto.*\.jpg/), + url: expect.stringMatching(/https:\/\/.*\.jpg/), + }) + + const signedUrl = await s3Service.getPresignedDownloadUrl({ + fileKey: resp.key, + }) + + const signedUrlFile = Buffer.from( + await axios + .get(signedUrl, { responseType: "arraybuffer" }) + .then((r) => r.data) + ) + + expect(signedUrlFile.toString("binary")).toEqual(fixtureAsBinary) + + await s3Service.delete({ fileKey: resp.key }) + + // TODO: Currently the presignedURL will be returned even if the file doesn't exist. Should we check for existence first? + const deletedFileUrl = await s3Service.getPresignedDownloadUrl({ + fileKey: resp.key, + }) + + const { response } = await axios + .get(deletedFileUrl, { responseType: "arraybuffer" }) + .catch((e) => e) + + expect(response.status).toEqual(404) + }) +}) diff --git a/packages/file-s3/jest.config.js b/packages/file-s3/jest.config.js new file mode 100644 index 0000000000..bc24a517ac --- /dev/null +++ b/packages/file-s3/jest.config.js @@ -0,0 +1,16 @@ +module.exports = { + globals: { + "ts-jest": { + tsconfig: "tsconfig.spec.json", + isolatedModules: false, + }, + }, + transform: { + "^.+\\.[jt]s?$": "ts-jest", + }, + testEnvironment: `node`, + moduleNameMapper: { + "^axios$": "axios/dist/node/axios.cjs", + }, + moduleFileExtensions: [`js`, `jsx`, `ts`, `tsx`, `json`], +} diff --git a/packages/file-s3/package.json b/packages/file-s3/package.json new file mode 100644 index 0000000000..93412b5482 --- /dev/null +++ b/packages/file-s3/package.json @@ -0,0 +1,43 @@ +{ + "name": "@medusajs/file-s3", + "version": "0.0.2", + "description": "S3 protocol file storage for Medusa. Supports any S3-compatible storage provider", + "main": "dist/index.js", + "repository": { + "type": "git", + "url": "https://github.com/medusajs/medusa", + "directory": "packages/file-local" + }, + "files": [ + "dist" + ], + "engines": { + "node": ">=16" + }, + "author": "Medusa", + "license": "MIT", + "scripts": { + "prepublishOnly": "cross-env NODE_ENV=production tsc --build", + "test": "jest --passWithNoTests src", + "test:integration": "jest --forceExit -- integration-tests/**/__tests__/**/*.spec.ts", + "build": "rimraf dist && tsc -p ./tsconfig.json", + "watch": "tsc --watch" + }, + "devDependencies": { + "axios": "^1.6.8", + "cross-env": "^5.2.1", + "jest": "^25.5.4", + "rimraf": "^5.0.1", + "typescript": "^4.9.5" + }, + "dependencies": { + "@aws-sdk/client-s3": "^3.556.0", + "@aws-sdk/s3-request-presigner": "^3.556.0", + "@medusajs/utils": "^1.11.7", + "ulid": "^2.3.0" + }, + "keywords": [ + "medusa-plugin", + "medusa-plugin-s3" + ] +} diff --git a/packages/file-s3/src/index.ts b/packages/file-s3/src/index.ts new file mode 100644 index 0000000000..da9b468118 --- /dev/null +++ b/packages/file-s3/src/index.ts @@ -0,0 +1,10 @@ +import { ModuleProviderExports } from "@medusajs/types" +import { S3FileService } from "./services/s3-file" + +const services = [S3FileService] + +const providerExport: ModuleProviderExports = { + services, +} + +export default providerExport diff --git a/packages/file-s3/src/services/s3-file.ts b/packages/file-s3/src/services/s3-file.ts new file mode 100644 index 0000000000..aed705203f --- /dev/null +++ b/packages/file-s3/src/services/s3-file.ts @@ -0,0 +1,154 @@ +import { + DeleteObjectCommand, + GetObjectCommand, + PutObjectCommand, + S3Client, + S3ClientConfigType, +} from "@aws-sdk/client-s3" +import { getSignedUrl } from "@aws-sdk/s3-request-presigner" +import { FileTypes, Logger, S3FileServiceOptions } from "@medusajs/types" +import { AbstractFileProviderService, MedusaError } from "@medusajs/utils" +import path from "path" +import { ulid } from "ulid" + +type InjectedDependencies = { + logger: Logger +} + +interface S3FileServiceConfig { + // TODO: We probably don't need this as either the service should return it or we should be able to calculate it. + fileUrl: string + accessKeyId: string + secretAccessKey: string + region: string + bucket: string + prefix?: string + endpoint?: string + cacheControl?: string + downloadFileDuration?: number + additionalClientConfig?: Record +} + +// FUTURE: At one point we will probably need to support authenticating with IAM roles instead. +export class S3FileService extends AbstractFileProviderService { + static identifier = "s3" + protected config_: S3FileServiceConfig + protected logger_: Logger + protected client_: S3Client + + constructor({ logger }: InjectedDependencies, options: S3FileServiceOptions) { + super() + + this.config_ = { + fileUrl: options.file_url, + accessKeyId: options.access_key_id, + secretAccessKey: options.secret_access_key, + region: options.region, + bucket: options.bucket, + prefix: options.prefix ?? "", + endpoint: options.endpoint, + cacheControl: options.cache_control ?? "public, max-age=31536000", + downloadFileDuration: options.download_file_duration ?? 60 * 60, + additionalClientConfig: options.additional_client_config ?? {}, + } + this.logger_ = logger + this.client_ = this.getClient() + } + + protected getClient() { + const config: S3ClientConfigType = { + credentials: { + accessKeyId: this.config_.accessKeyId, + secretAccessKey: this.config_.secretAccessKey, + }, + region: this.config_.region, + endpoint: this.config_.endpoint, + ...this.config_.additionalClientConfig, + } + + return new S3Client(config) + } + + async upload( + file: FileTypes.ProviderUploadFileDTO + ): Promise { + if (!file) { + throw new MedusaError(MedusaError.Types.INVALID_DATA, `No file provided`) + } + + if (!file.filename) { + throw new MedusaError( + MedusaError.Types.INVALID_DATA, + `No filename provided` + ) + } + + const parsedFilename = path.parse(file.filename) + + // TODO: Allow passing a full path for storage per request, not as a global config. + const fileKey = `${this.config_.prefix}${parsedFilename.name}-${ulid()}${ + parsedFilename.ext + }` + + const content = Buffer.from(file.content, "binary") + const command = new PutObjectCommand({ + // TODO: Add support for private files + // We probably also want to support a separate bucket altogether for private files + // protected private_bucket_: string + // protected private_access_key_id_: string + // protected private_secret_access_key_: string + + // ACL: options.acl ?? (options.isProtected ? "private" : "public-read"), + Bucket: this.config_.bucket, + Body: content, + Key: fileKey, + ContentType: file.mimeType, + CacheControl: this.config_.cacheControl, + // Note: We could potentially set the content disposition when uploading, + // but storing the original filename as metadata should suffice. + Metadata: { + "x-amz-meta-original-filename": file.filename, + }, + }) + + try { + await this.client_.send(command) + } catch (e) { + this.logger_.error(e) + throw e + } + + return { + url: `${this.config_.fileUrl}/${fileKey}`, + key: fileKey, + } + } + + async delete(file: FileTypes.ProviderDeleteFileDTO): Promise { + const command = new DeleteObjectCommand({ + Bucket: this.config_.bucket, + Key: file.fileKey, + }) + + try { + await this.client_.send(command) + } catch (e) { + // TODO: Rethrow depending on the error (eg. a file not found error is fine, but a failed request should be rethrown) + this.logger_.error(e) + } + } + + async getPresignedDownloadUrl( + fileData: FileTypes.ProviderGetFileDTO + ): Promise { + // TODO: Allow passing content disposition when getting a presigned URL + const command = new GetObjectCommand({ + Bucket: this.config_.bucket, + Key: `${fileData.fileKey}`, + }) + + return await getSignedUrl(this.client_, command, { + expiresIn: this.config_.downloadFileDuration, + }) + } +} diff --git a/packages/file-s3/tsconfig.json b/packages/file-s3/tsconfig.json new file mode 100644 index 0000000000..65e5a4fd5b --- /dev/null +++ b/packages/file-s3/tsconfig.json @@ -0,0 +1,36 @@ +{ + "compilerOptions": { + "lib": [ + "es5", + "es6", + "es2019" + ], + "target": "es5", + "jsx": "react-jsx" /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */, + "outDir": "./dist", + "esModuleInterop": true, + "declaration": true, + "module": "commonjs", + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "noImplicitReturns": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "noImplicitThis": true, + "allowJs": true, + "skipLibCheck": true, + "downlevelIteration": true, // to use ES5 specific tooling + "inlineSourceMap": true /* Emit a single file with source maps instead of having a separate file. */ + }, + "include": ["src"], + "exclude": [ + "dist", + "build", + "src/**/__tests__", + "src/**/__mocks__", + "src/**/__fixtures__", + "node_modules", + ".eslintrc.js" + ] +} diff --git a/packages/file-s3/tsconfig.spec.json b/packages/file-s3/tsconfig.spec.json new file mode 100644 index 0000000000..9b62409191 --- /dev/null +++ b/packages/file-s3/tsconfig.spec.json @@ -0,0 +1,5 @@ +{ + "extends": "./tsconfig.json", + "include": ["src"], + "exclude": ["node_modules"] +} diff --git a/packages/file/src/services/file-module-service.ts b/packages/file/src/services/file-module-service.ts index 633ea77dcb..d6fd4606d9 100644 --- a/packages/file/src/services/file-module-service.ts +++ b/packages/file/src/services/file-module-service.ts @@ -33,6 +33,8 @@ export default class FileModuleService implements FileTypes.IFileModuleService { data: CreateFileDTO[] | CreateFileDTO ): Promise { const input = Array.isArray(data) ? data : [data] + // TODO: Validate file mime type, have config for allowed types + const files = await Promise.all( input.map((file) => this.fileProviderService_.upload(file)) ) diff --git a/packages/types/src/file/index.ts b/packages/types/src/file/index.ts index a8cf1df979..560a9ac922 100644 --- a/packages/types/src/file/index.ts +++ b/packages/types/src/file/index.ts @@ -2,3 +2,4 @@ export * from "./common" export * from "./mutations" export * from "./service" export * from "./provider" +export * from "./providers" diff --git a/packages/types/src/file/providers/index.ts b/packages/types/src/file/providers/index.ts new file mode 100644 index 0000000000..5616456f85 --- /dev/null +++ b/packages/types/src/file/providers/index.ts @@ -0,0 +1,2 @@ +export * from "./s3" +export * from "./local" diff --git a/packages/types/src/file/providers/local.ts b/packages/types/src/file/providers/local.ts new file mode 100644 index 0000000000..71b39706b9 --- /dev/null +++ b/packages/types/src/file/providers/local.ts @@ -0,0 +1,4 @@ +export interface LocalFileServiceOptions { + upload_dir?: string + backend_url?: string +} diff --git a/packages/types/src/file/providers/s3.ts b/packages/types/src/file/providers/s3.ts new file mode 100644 index 0000000000..750bdadcdb --- /dev/null +++ b/packages/types/src/file/providers/s3.ts @@ -0,0 +1,12 @@ +export interface S3FileServiceOptions { + file_url: string + access_key_id: string + secret_access_key: string + region: string + bucket: string + prefix?: string + endpoint?: string + cache_control?: string + download_file_duration?: number + additional_client_config?: Record +} diff --git a/yarn.lock b/yarn.lock index b5f8b7aca2..5c3986be4d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -445,6 +445,120 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/client-s3@npm:^3.556.0": + version: 3.556.0 + resolution: "@aws-sdk/client-s3@npm:3.556.0" + dependencies: + "@aws-crypto/sha1-browser": 3.0.0 + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/client-sts": 3.556.0 + "@aws-sdk/core": 3.556.0 + "@aws-sdk/credential-provider-node": 3.556.0 + "@aws-sdk/middleware-bucket-endpoint": 3.535.0 + "@aws-sdk/middleware-expect-continue": 3.535.0 + "@aws-sdk/middleware-flexible-checksums": 3.535.0 + "@aws-sdk/middleware-host-header": 3.535.0 + "@aws-sdk/middleware-location-constraint": 3.535.0 + "@aws-sdk/middleware-logger": 3.535.0 + "@aws-sdk/middleware-recursion-detection": 3.535.0 + "@aws-sdk/middleware-sdk-s3": 3.556.0 + "@aws-sdk/middleware-signing": 3.556.0 + "@aws-sdk/middleware-ssec": 3.537.0 + "@aws-sdk/middleware-user-agent": 3.540.0 + "@aws-sdk/region-config-resolver": 3.535.0 + "@aws-sdk/signature-v4-multi-region": 3.556.0 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.540.0 + "@aws-sdk/util-user-agent-browser": 3.535.0 + "@aws-sdk/util-user-agent-node": 3.535.0 + "@aws-sdk/xml-builder": 3.535.0 + "@smithy/config-resolver": ^2.2.0 + "@smithy/core": ^1.4.2 + "@smithy/eventstream-serde-browser": ^2.2.0 + "@smithy/eventstream-serde-config-resolver": ^2.2.0 + "@smithy/eventstream-serde-node": ^2.2.0 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/hash-blob-browser": ^2.2.0 + "@smithy/hash-node": ^2.2.0 + "@smithy/hash-stream-node": ^2.2.0 + "@smithy/invalid-dependency": ^2.2.0 + "@smithy/md5-js": ^2.2.0 + "@smithy/middleware-content-length": ^2.2.0 + "@smithy/middleware-endpoint": ^2.5.1 + "@smithy/middleware-retry": ^2.3.1 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.1 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-body-length-browser": ^2.2.0 + "@smithy/util-body-length-node": ^2.3.0 + "@smithy/util-defaults-mode-browser": ^2.2.1 + "@smithy/util-defaults-mode-node": ^2.3.1 + "@smithy/util-endpoints": ^1.2.0 + "@smithy/util-retry": ^2.2.0 + "@smithy/util-stream": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + "@smithy/util-waiter": ^2.2.0 + tslib: ^2.6.2 + checksum: 3755905c409f45e5772bb895be9efdb7d0bc4837f43417aa9952b4cdd944c6542d6df0b20b80a9ea5168a3d500e56b169f077c1fa4081cad4278a185c740d080 + languageName: node + linkType: hard + +"@aws-sdk/client-sso-oidc@npm:3.556.0": + version: 3.556.0 + resolution: "@aws-sdk/client-sso-oidc@npm:3.556.0" + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/client-sts": 3.556.0 + "@aws-sdk/core": 3.556.0 + "@aws-sdk/middleware-host-header": 3.535.0 + "@aws-sdk/middleware-logger": 3.535.0 + "@aws-sdk/middleware-recursion-detection": 3.535.0 + "@aws-sdk/middleware-user-agent": 3.540.0 + "@aws-sdk/region-config-resolver": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.540.0 + "@aws-sdk/util-user-agent-browser": 3.535.0 + "@aws-sdk/util-user-agent-node": 3.535.0 + "@smithy/config-resolver": ^2.2.0 + "@smithy/core": ^1.4.2 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/hash-node": ^2.2.0 + "@smithy/invalid-dependency": ^2.2.0 + "@smithy/middleware-content-length": ^2.2.0 + "@smithy/middleware-endpoint": ^2.5.1 + "@smithy/middleware-retry": ^2.3.1 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.1 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-body-length-browser": ^2.2.0 + "@smithy/util-body-length-node": ^2.3.0 + "@smithy/util-defaults-mode-browser": ^2.2.1 + "@smithy/util-defaults-mode-node": ^2.3.1 + "@smithy/util-endpoints": ^1.2.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-retry": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + peerDependencies: + "@aws-sdk/credential-provider-node": ^3.556.0 + checksum: 578c67922d31e88c5b7c1b45e73041dc8a3c8989992c37e87ce9f53aacb638730157fb4e981ca445945dd1ad1df5f46e2c76decd9ab26895e4b57fbc629b8fda + languageName: node + linkType: hard + "@aws-sdk/client-sso@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/client-sso@npm:3.398.0" @@ -486,6 +600,52 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/client-sso@npm:3.556.0": + version: 3.556.0 + resolution: "@aws-sdk/client-sso@npm:3.556.0" + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/core": 3.556.0 + "@aws-sdk/middleware-host-header": 3.535.0 + "@aws-sdk/middleware-logger": 3.535.0 + "@aws-sdk/middleware-recursion-detection": 3.535.0 + "@aws-sdk/middleware-user-agent": 3.540.0 + "@aws-sdk/region-config-resolver": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.540.0 + "@aws-sdk/util-user-agent-browser": 3.535.0 + "@aws-sdk/util-user-agent-node": 3.535.0 + "@smithy/config-resolver": ^2.2.0 + "@smithy/core": ^1.4.2 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/hash-node": ^2.2.0 + "@smithy/invalid-dependency": ^2.2.0 + "@smithy/middleware-content-length": ^2.2.0 + "@smithy/middleware-endpoint": ^2.5.1 + "@smithy/middleware-retry": ^2.3.1 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.1 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-body-length-browser": ^2.2.0 + "@smithy/util-body-length-node": ^2.3.0 + "@smithy/util-defaults-mode-browser": ^2.2.1 + "@smithy/util-defaults-mode-node": ^2.3.1 + "@smithy/util-endpoints": ^1.2.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-retry": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: f0666befa86731f602705b863a3d354188d4645d765f73f6adbce65e9d72b5a71d8bf8074f7d498d8d7c440518d728fd2418c29306de749b10d251d37525ca39 + languageName: node + linkType: hard + "@aws-sdk/client-sts@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/client-sts@npm:3.398.0" @@ -531,6 +691,69 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/client-sts@npm:3.556.0": + version: 3.556.0 + resolution: "@aws-sdk/client-sts@npm:3.556.0" + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/core": 3.556.0 + "@aws-sdk/middleware-host-header": 3.535.0 + "@aws-sdk/middleware-logger": 3.535.0 + "@aws-sdk/middleware-recursion-detection": 3.535.0 + "@aws-sdk/middleware-user-agent": 3.540.0 + "@aws-sdk/region-config-resolver": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.540.0 + "@aws-sdk/util-user-agent-browser": 3.535.0 + "@aws-sdk/util-user-agent-node": 3.535.0 + "@smithy/config-resolver": ^2.2.0 + "@smithy/core": ^1.4.2 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/hash-node": ^2.2.0 + "@smithy/invalid-dependency": ^2.2.0 + "@smithy/middleware-content-length": ^2.2.0 + "@smithy/middleware-endpoint": ^2.5.1 + "@smithy/middleware-retry": ^2.3.1 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.1 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-body-length-browser": ^2.2.0 + "@smithy/util-body-length-node": ^2.3.0 + "@smithy/util-defaults-mode-browser": ^2.2.1 + "@smithy/util-defaults-mode-node": ^2.3.1 + "@smithy/util-endpoints": ^1.2.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-retry": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + peerDependencies: + "@aws-sdk/credential-provider-node": ^3.556.0 + checksum: e100a9b4deddebc9873236060a036e903dac752f35eccc73446a23830901453b5d1c319dbea63e24a01843251e8bd135c221a297249cab63fc4ff81279639a2a + languageName: node + linkType: hard + +"@aws-sdk/core@npm:3.556.0": + version: 3.556.0 + resolution: "@aws-sdk/core@npm:3.556.0" + dependencies: + "@smithy/core": ^1.4.2 + "@smithy/protocol-http": ^3.3.0 + "@smithy/signature-v4": ^2.3.0 + "@smithy/smithy-client": ^2.5.1 + "@smithy/types": ^2.12.0 + fast-xml-parser: 4.2.5 + tslib: ^2.6.2 + checksum: b63102d87fe3dc3afda490071fba39bf71be8eadfad1f96dd28fdb28d2960375dda795d188bd88322a5baa7207a761fd03045fd5c880e9a5e0027bb9b16340cb + languageName: node + linkType: hard + "@aws-sdk/credential-provider-env@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/credential-provider-env@npm:3.398.0" @@ -543,6 +766,35 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-env@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/credential-provider-env@npm:3.535.0" + dependencies: + "@aws-sdk/types": 3.535.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 2d245d723fd3be302a173ac8e93948b7edc9af0f0698b95d8a205dfaa6446cb0fdfcfa1c16ca66f89baf289ba4a77b3bbdc05537d93ee3451715e47ab33b5031 + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-http@npm:3.552.0": + version: 3.552.0 + resolution: "@aws-sdk/credential-provider-http@npm:3.552.0" + dependencies: + "@aws-sdk/types": 3.535.0 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.1 + "@smithy/types": ^2.12.0 + "@smithy/util-stream": ^2.2.0 + tslib: ^2.6.2 + checksum: 3faf5a149647da222541d6c6da5462cc3caca3c545c2c99a99f7119a5cb7d41699780285cd71bda747feecb81857bab69884d5b32d45384c89f16b3d56822cab + languageName: node + linkType: hard + "@aws-sdk/credential-provider-ini@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/credential-provider-ini@npm:3.398.0" @@ -561,6 +813,25 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-ini@npm:3.556.0": + version: 3.556.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.556.0" + dependencies: + "@aws-sdk/client-sts": 3.556.0 + "@aws-sdk/credential-provider-env": 3.535.0 + "@aws-sdk/credential-provider-process": 3.535.0 + "@aws-sdk/credential-provider-sso": 3.556.0 + "@aws-sdk/credential-provider-web-identity": 3.556.0 + "@aws-sdk/types": 3.535.0 + "@smithy/credential-provider-imds": ^2.3.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 173a8ae85920430d45eb398d3516e527155dedb43fcb85ce5b3359149944cceca79941078f9cd8c12eed6e4479f113492bfc1d92e0caceaffdf1e1925e4495eb + languageName: node + linkType: hard + "@aws-sdk/credential-provider-node@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/credential-provider-node@npm:3.398.0" @@ -580,6 +851,26 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-node@npm:3.556.0": + version: 3.556.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.556.0" + dependencies: + "@aws-sdk/credential-provider-env": 3.535.0 + "@aws-sdk/credential-provider-http": 3.552.0 + "@aws-sdk/credential-provider-ini": 3.556.0 + "@aws-sdk/credential-provider-process": 3.535.0 + "@aws-sdk/credential-provider-sso": 3.556.0 + "@aws-sdk/credential-provider-web-identity": 3.556.0 + "@aws-sdk/types": 3.535.0 + "@smithy/credential-provider-imds": ^2.3.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 5faa4684bad86ba20413fa1428c83ac0d4fb3e6747f487997eae6f30f517fe59c7e8465262fa6a7026757657f1afcf8d25658952f97bcd8c2b2b3acf26b3307a + languageName: node + linkType: hard + "@aws-sdk/credential-provider-process@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/credential-provider-process@npm:3.398.0" @@ -593,6 +884,19 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-process@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/credential-provider-process@npm:3.535.0" + dependencies: + "@aws-sdk/types": 3.535.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 096a78241c0e76c614ee69d2f7e0169d4314e4dd0a43805164faa6d3381d5112587e26066c55e1b7aee763520b04cfaea83ae674eb76580c4fff0f45912de02f + languageName: node + linkType: hard + "@aws-sdk/credential-provider-sso@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/credential-provider-sso@npm:3.398.0" @@ -608,6 +912,21 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-sso@npm:3.556.0": + version: 3.556.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.556.0" + dependencies: + "@aws-sdk/client-sso": 3.556.0 + "@aws-sdk/token-providers": 3.556.0 + "@aws-sdk/types": 3.535.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: cad5d3b23a99b0e4c8d8ab879d90133e7309cd31883b9db38dc3275c726b041ab3e96be77d281aea688c2947e8378a9a79bba6fc25b5d4a364e3b4c64b3ae7ce + languageName: node + linkType: hard + "@aws-sdk/credential-provider-web-identity@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/credential-provider-web-identity@npm:3.398.0" @@ -620,6 +939,19 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-web-identity@npm:3.556.0": + version: 3.556.0 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.556.0" + dependencies: + "@aws-sdk/client-sts": 3.556.0 + "@aws-sdk/types": 3.535.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 1e50940eadf63c912cc95559f9c61bd595beb94cb7ee4b57dd436af08bca2e2f172386b4b8195e3b7eff727dfb8743760abeedf792f76daee480ad29f877dcb3 + languageName: node + linkType: hard + "@aws-sdk/lib-storage@npm:^3.400.0": version: 3.400.0 resolution: "@aws-sdk/lib-storage@npm:3.400.0" @@ -651,6 +983,21 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-bucket-endpoint@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.535.0" + dependencies: + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-arn-parser": 3.535.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/types": ^2.12.0 + "@smithy/util-config-provider": ^2.3.0 + tslib: ^2.6.2 + checksum: f19ef992d64642ea9cad78906dd58b5ca354f80003ae04c21d1b1357db7e16b05d04c0ac821ac5d0ed09ff80f42acb9165b5a8cd09e43bb99f1c5720de3c30b5 + languageName: node + linkType: hard + "@aws-sdk/middleware-expect-continue@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/middleware-expect-continue@npm:3.398.0" @@ -663,6 +1010,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-expect-continue@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-expect-continue@npm:3.535.0" + dependencies: + "@aws-sdk/types": 3.535.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: a2236c5cfa69e557bdcb0eb56282921d9cde8e50f5c3896cc97a15f150565920d88b8be6d16dae8b563001bc4b8afea1e435f71c1b181fe3abda9bba04cfb30f + languageName: node + linkType: hard + "@aws-sdk/middleware-flexible-checksums@npm:3.400.0": version: 3.400.0 resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.400.0" @@ -679,6 +1038,22 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-flexible-checksums@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.535.0" + dependencies: + "@aws-crypto/crc32": 3.0.0 + "@aws-crypto/crc32c": 3.0.0 + "@aws-sdk/types": 3.535.0 + "@smithy/is-array-buffer": ^2.2.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/types": ^2.12.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: 5e07de340bffc50fb5450f700664d8b3abd6bb399395de962a353734a68a2f88420b9b2a8ebb9286016e71978f0c653ed93875eeb7898f477737f471fc002b3f + languageName: node + linkType: hard + "@aws-sdk/middleware-host-header@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/middleware-host-header@npm:3.398.0" @@ -691,6 +1066,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-host-header@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-host-header@npm:3.535.0" + dependencies: + "@aws-sdk/types": 3.535.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 8b26adc069da04c3e6d1f66cb5ebe505373657ba5b85578fc09bd607fb6b25ef4168478f8acacaa69ec3f045ef619f522fafba9844c11835d5933a3f95ade4ea + languageName: node + linkType: hard + "@aws-sdk/middleware-location-constraint@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/middleware-location-constraint@npm:3.398.0" @@ -702,6 +1089,17 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-location-constraint@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-location-constraint@npm:3.535.0" + dependencies: + "@aws-sdk/types": 3.535.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: de9536d0d4e787f2eb04c2f693c1ac1860a3d519b009bbc73f7dc81c431a5abcde0d5cbdd139ec1969a05fe690ebaf1c2271953f3e8985114b469ef5ee6890e2 + languageName: node + linkType: hard + "@aws-sdk/middleware-logger@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/middleware-logger@npm:3.398.0" @@ -713,6 +1111,17 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-logger@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-logger@npm:3.535.0" + dependencies: + "@aws-sdk/types": 3.535.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: f0e01443203c30d8064d5a16968de20060cd4c0742a4eb2537443fe767135c08cda1a2d5a75db33c319b639d31c9340de9f128eefdf73bb50283e40569f68471 + languageName: node + linkType: hard + "@aws-sdk/middleware-recursion-detection@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/middleware-recursion-detection@npm:3.398.0" @@ -725,6 +1134,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-recursion-detection@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-recursion-detection@npm:3.535.0" + dependencies: + "@aws-sdk/types": 3.535.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 3bbb86ba971d2b034b7dea415fc6c3fb0c1a879c8153841849e9b2bfd9edd5a78e29a299ceaf74829007d96550420246b795721ac7d8cfb244e59e5f9dee54b3 + languageName: node + linkType: hard + "@aws-sdk/middleware-sdk-s3@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/middleware-sdk-s3@npm:3.398.0" @@ -738,6 +1159,23 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-sdk-s3@npm:3.556.0": + version: 3.556.0 + resolution: "@aws-sdk/middleware-sdk-s3@npm:3.556.0" + dependencies: + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-arn-parser": 3.535.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/signature-v4": ^2.3.0 + "@smithy/smithy-client": ^2.5.1 + "@smithy/types": ^2.12.0 + "@smithy/util-config-provider": ^2.3.0 + tslib: ^2.6.2 + checksum: 398837daac9a78be96d5364fdd79dbfb679050f06670ba377c1312c4cb6aada63ef21818fd04488c3b61234664d28d4c4272b462af0bdcf84e12c58e3ae0648c + languageName: node + linkType: hard + "@aws-sdk/middleware-sdk-sts@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/middleware-sdk-sts@npm:3.398.0" @@ -765,6 +1203,21 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-signing@npm:3.556.0": + version: 3.556.0 + resolution: "@aws-sdk/middleware-signing@npm:3.556.0" + dependencies: + "@aws-sdk/types": 3.535.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/signature-v4": ^2.3.0 + "@smithy/types": ^2.12.0 + "@smithy/util-middleware": ^2.2.0 + tslib: ^2.6.2 + checksum: 0fb90db7704f72ca0cc152580b60289194244c849c185bfd27710b02ce8c8ad536d19b2d7d6e1db8c11821164aca6cdfbf132c2dd07ce81c008562b6ec8c7944 + languageName: node + linkType: hard + "@aws-sdk/middleware-ssec@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/middleware-ssec@npm:3.398.0" @@ -776,6 +1229,17 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-ssec@npm:3.537.0": + version: 3.537.0 + resolution: "@aws-sdk/middleware-ssec@npm:3.537.0" + dependencies: + "@aws-sdk/types": 3.535.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 4c4ed67709d97fd3d614fb00052082ac4697e0c2ad9aafb6794a3bd04ca3a373b0fd06f950be0f4831787410823ea7daca206e631469c819a2e5eae54c268b5a + languageName: node + linkType: hard + "@aws-sdk/middleware-user-agent@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/middleware-user-agent@npm:3.398.0" @@ -789,6 +1253,33 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-user-agent@npm:3.540.0": + version: 3.540.0 + resolution: "@aws-sdk/middleware-user-agent@npm:3.540.0" + dependencies: + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.540.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 10a98b243c32db59beb794df62ff9468b1e83d277412698d7a9351fcb8abf5f62630648ee0aaa02eaec9d32f565c78e3c91d4e79836ef9177e7219f623180dd2 + languageName: node + linkType: hard + +"@aws-sdk/region-config-resolver@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/region-config-resolver@npm:3.535.0" + dependencies: + "@aws-sdk/types": 3.535.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/types": ^2.12.0 + "@smithy/util-config-provider": ^2.3.0 + "@smithy/util-middleware": ^2.2.0 + tslib: ^2.6.2 + checksum: 08d76cfc54f2d9fffb8a2fd873e19b95564842b78a2a923260b3100117100054bb95f15f723c1f7268d10ffc61150109dca6b512ac629d125a000550ecfd0146 + languageName: node + linkType: hard + "@aws-sdk/s3-request-presigner@npm:^3.400.0": version: 3.400.0 resolution: "@aws-sdk/s3-request-presigner@npm:3.400.0" @@ -805,6 +1296,22 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/s3-request-presigner@npm:^3.556.0": + version: 3.556.0 + resolution: "@aws-sdk/s3-request-presigner@npm:3.556.0" + dependencies: + "@aws-sdk/signature-v4-multi-region": 3.556.0 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-format-url": 3.535.0 + "@smithy/middleware-endpoint": ^2.5.1 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.1 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: b4e6516c2e8a6e1403f5dba54e5cd5bd639475248c443513a4dcde755c22071bba62dcaf7e452cfbb52dd3af5f80b0730b8b04aa5ee82fabf008e008190ec2c2 + languageName: node + linkType: hard + "@aws-sdk/signature-v4-multi-region@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/signature-v4-multi-region@npm:3.398.0" @@ -823,6 +1330,20 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/signature-v4-multi-region@npm:3.556.0": + version: 3.556.0 + resolution: "@aws-sdk/signature-v4-multi-region@npm:3.556.0" + dependencies: + "@aws-sdk/middleware-sdk-s3": 3.556.0 + "@aws-sdk/types": 3.535.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/signature-v4": ^2.3.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: d490ea8133725cf9b334ac6a4eb7eef752346117775f364d0abc70a6ba2507725386a3a1d784c75e409d7b83c8650b7dc2306b9f9deb3e087521e2352bb546f9 + languageName: node + linkType: hard + "@aws-sdk/token-providers@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/token-providers@npm:3.398.0" @@ -866,6 +1387,20 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/token-providers@npm:3.556.0": + version: 3.556.0 + resolution: "@aws-sdk/token-providers@npm:3.556.0" + dependencies: + "@aws-sdk/client-sso-oidc": 3.556.0 + "@aws-sdk/types": 3.535.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: cb8d6261dd082a536995c17836cb2f4a16a2e39b29bce3f7318e04dc01165f5ec9439d0373fd7af45faf2eb6ba96d3331ed084eebc3b3301be2ac9b18e9957cb + languageName: node + linkType: hard + "@aws-sdk/types@npm:3.398.0, @aws-sdk/types@npm:^3.222.0": version: 3.398.0 resolution: "@aws-sdk/types@npm:3.398.0" @@ -876,6 +1411,16 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/types@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/types@npm:3.535.0" + dependencies: + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 1c8ed3a76b508287ee840a9c37f9df7a382459dfe4d46aa0cf90eddacdf32eae9c0e0d274a18956095e567234d0b07c81ff7d4fbeed3ca3c9caf52ccadcea409 + languageName: node + linkType: hard + "@aws-sdk/util-arn-parser@npm:3.310.0": version: 3.310.0 resolution: "@aws-sdk/util-arn-parser@npm:3.310.0" @@ -885,6 +1430,15 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/util-arn-parser@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/util-arn-parser@npm:3.535.0" + dependencies: + tslib: ^2.6.2 + checksum: 0061dd01d95187826912903f7a08e5a6d377ce82fcfa91a5a6d1f4343bd51fb32d2cb942612e555f6b85a92e95d55873fce99daef43b2558243efdfe2b27d88a + languageName: node + linkType: hard + "@aws-sdk/util-endpoints@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/util-endpoints@npm:3.398.0" @@ -895,6 +1449,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/util-endpoints@npm:3.540.0": + version: 3.540.0 + resolution: "@aws-sdk/util-endpoints@npm:3.540.0" + dependencies: + "@aws-sdk/types": 3.535.0 + "@smithy/types": ^2.12.0 + "@smithy/util-endpoints": ^1.2.0 + tslib: ^2.6.2 + checksum: 9e08e764c22d81af819bb8c1ae975d724debbe4911a69acec34cb10fcc7e5d923eb430d3de0b50ad2f160f75a9839cb39320077f93964c9bd2cf13d2d92f0fc4 + languageName: node + linkType: hard + "@aws-sdk/util-format-url@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/util-format-url@npm:3.398.0" @@ -907,6 +1473,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/util-format-url@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/util-format-url@npm:3.535.0" + dependencies: + "@aws-sdk/types": 3.535.0 + "@smithy/querystring-builder": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: e54002828bef2f2dcf1f17bc782b7fc87e1298e8084dc465912215c0b909880421b0ae5b57aa9d1e1a55beb7b438437d37e9a213d4fba75605030d10931d5465 + languageName: node + linkType: hard + "@aws-sdk/util-locate-window@npm:^3.0.0": version: 3.310.0 resolution: "@aws-sdk/util-locate-window@npm:3.310.0" @@ -928,6 +1506,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/util-user-agent-browser@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/util-user-agent-browser@npm:3.535.0" + dependencies: + "@aws-sdk/types": 3.535.0 + "@smithy/types": ^2.12.0 + bowser: ^2.11.0 + tslib: ^2.6.2 + checksum: 347f92df14527a6a30baca22cec326ecae8109cdaa7c011b193275acd4a19e3dfe90194aa91629bb82aa62cf690b2bc2742117f78a8d0fb01570b6eac6cb87a7 + languageName: node + linkType: hard + "@aws-sdk/util-user-agent-node@npm:3.398.0": version: 3.398.0 resolution: "@aws-sdk/util-user-agent-node@npm:3.398.0" @@ -945,6 +1535,23 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/util-user-agent-node@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/util-user-agent-node@npm:3.535.0" + dependencies: + "@aws-sdk/types": 3.535.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + peerDependencies: + aws-crt: ">=1.0.0" + peerDependenciesMeta: + aws-crt: + optional: true + checksum: 144a92ca5745ed78159d05466698472d10e0529946bcba67cc350be03c2272be7a58c76caa5f8831bbc66438f635a5a10167182aab02be601648843c9c0347f9 + languageName: node + linkType: hard + "@aws-sdk/util-utf8-browser@npm:^3.0.0": version: 3.259.0 resolution: "@aws-sdk/util-utf8-browser@npm:3.259.0" @@ -963,6 +1570,16 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/xml-builder@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/xml-builder@npm:3.535.0" + dependencies: + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 8e45d10ef3e19c09c2f19aef1a4d8e6194b257a3a9a6b773e36899e85910006a62d3550fdd658be64df713f49b12402765e5afd4d601bacce11a944ec67f6b65 + languageName: node + linkType: hard + "@babel/cli@npm:7.14.3": version: 7.14.3 resolution: "@babel/cli@npm:7.14.3" @@ -8258,6 +8875,22 @@ __metadata: languageName: unknown linkType: soft +"@medusajs/file-s3@workspace:packages/file-s3": + version: 0.0.0-use.local + resolution: "@medusajs/file-s3@workspace:packages/file-s3" + dependencies: + "@aws-sdk/client-s3": ^3.556.0 + "@aws-sdk/s3-request-presigner": ^3.556.0 + "@medusajs/utils": ^1.11.7 + axios: ^1.6.8 + cross-env: ^5.2.1 + jest: ^25.5.4 + rimraf: ^5.0.1 + typescript: ^4.9.5 + ulid: ^2.3.0 + languageName: unknown + linkType: soft + "@medusajs/file@workspace:packages/file": version: 0.0.0-use.local resolution: "@medusajs/file@workspace:packages/file" @@ -12799,6 +13432,16 @@ __metadata: languageName: node linkType: hard +"@smithy/abort-controller@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/abort-controller@npm:2.2.0" + dependencies: + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 87bf79591d2b2b289dadf2ed04f082232b44e39bd92c188bae5fe3d11cdc4e4d54f0962a7865c159f4c7f914b8d093fe2744f5ab9de07a0b4cc13f9da4a6cf48 + languageName: node + linkType: hard + "@smithy/chunked-blob-reader-native@npm:^2.0.0": version: 2.0.0 resolution: "@smithy/chunked-blob-reader-native@npm:2.0.0" @@ -12809,6 +13452,16 @@ __metadata: languageName: node linkType: hard +"@smithy/chunked-blob-reader-native@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/chunked-blob-reader-native@npm:2.2.0" + dependencies: + "@smithy/util-base64": ^2.3.0 + tslib: ^2.6.2 + checksum: 72cea2e748d50ef0fb86e648830a80464b20090013a77c862e464dfa4b5a293498249115a6f3934ed73d76931b7db75f71aed022de73b0a3b004e32b99dc65e8 + languageName: node + linkType: hard + "@smithy/chunked-blob-reader@npm:^2.0.0": version: 2.0.0 resolution: "@smithy/chunked-blob-reader@npm:2.0.0" @@ -12818,6 +13471,15 @@ __metadata: languageName: node linkType: hard +"@smithy/chunked-blob-reader@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/chunked-blob-reader@npm:2.2.0" + dependencies: + tslib: ^2.6.2 + checksum: 96e08c563e78d53b917ae6ab225cc9c4d1894e237e54addb1023d6582b3e91cc03a3d7f758f79ce730da0e4acdcfbc7578846bdd13141a3125d22e577ea674f2 + languageName: node + linkType: hard + "@smithy/config-resolver@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/config-resolver@npm:2.0.5" @@ -12830,6 +13492,35 @@ __metadata: languageName: node linkType: hard +"@smithy/config-resolver@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/config-resolver@npm:2.2.0" + dependencies: + "@smithy/node-config-provider": ^2.3.0 + "@smithy/types": ^2.12.0 + "@smithy/util-config-provider": ^2.3.0 + "@smithy/util-middleware": ^2.2.0 + tslib: ^2.6.2 + checksum: 977c3bd383b72e0ab25238515fddfd9138855b7c24247e19c5d1490b6a61234bd737956f770539508d7f4c07a54efb917923e5642abf15c1803df43fe5079859 + languageName: node + linkType: hard + +"@smithy/core@npm:^1.4.2": + version: 1.4.2 + resolution: "@smithy/core@npm:1.4.2" + dependencies: + "@smithy/middleware-endpoint": ^2.5.1 + "@smithy/middleware-retry": ^2.3.1 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.1 + "@smithy/types": ^2.12.0 + "@smithy/util-middleware": ^2.2.0 + tslib: ^2.6.2 + checksum: d7a130743c7e92900e2c65c598e77c259c014204f03051e194ab49bcf8a5fc161811d60241f162f52305c27c0bbc1f5217c8ed5ad4c5dc842c95d84d48dfa3a5 + languageName: node + linkType: hard + "@smithy/credential-provider-imds@npm:^2.0.0, @smithy/credential-provider-imds@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/credential-provider-imds@npm:2.0.5" @@ -12843,6 +13534,19 @@ __metadata: languageName: node linkType: hard +"@smithy/credential-provider-imds@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/credential-provider-imds@npm:2.3.0" + dependencies: + "@smithy/node-config-provider": ^2.3.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + tslib: ^2.6.2 + checksum: 62d0416c667349ad493fe27eab9fb3dc8b67d87d6e20d25a02034234e0a2a5da6e7c02341bbfa055c92a0ad170aa6ab9191aa0dc728ad57c87da3f45236fc2c2 + languageName: node + linkType: hard + "@smithy/eventstream-codec@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/eventstream-codec@npm:2.0.5" @@ -12855,6 +13559,18 @@ __metadata: languageName: node linkType: hard +"@smithy/eventstream-codec@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/eventstream-codec@npm:2.2.0" + dependencies: + "@aws-crypto/crc32": 3.0.0 + "@smithy/types": ^2.12.0 + "@smithy/util-hex-encoding": ^2.2.0 + tslib: ^2.6.2 + checksum: b2b45542d81b56be382a40866af378a66579c76a8a099e8025b96b97bc4944662cbbd9fafef1ce88a3c8181c7bebb33470a9a064772ecc3b378b0e8e6899681d + languageName: node + linkType: hard + "@smithy/eventstream-serde-browser@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/eventstream-serde-browser@npm:2.0.5" @@ -12866,6 +13582,17 @@ __metadata: languageName: node linkType: hard +"@smithy/eventstream-serde-browser@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/eventstream-serde-browser@npm:2.2.0" + dependencies: + "@smithy/eventstream-serde-universal": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 686ff9e934929feb029600827b061d849e32b649c149908d158d03919bbab1317d053955e4f806b70fef9dab9af69b2d87d71fb39b4f9d750176f9332c5e0e70 + languageName: node + linkType: hard + "@smithy/eventstream-serde-config-resolver@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/eventstream-serde-config-resolver@npm:2.0.5" @@ -12876,6 +13603,16 @@ __metadata: languageName: node linkType: hard +"@smithy/eventstream-serde-config-resolver@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/eventstream-serde-config-resolver@npm:2.2.0" + dependencies: + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 5b5b7c5204801129cf687d633ab345900c092d5a8631ac0b110536d5a5cbfef6294f105a6e6234b918d1ceadf428c6b5a9db18390af38f63ab6bf7a54c35e5b5 + languageName: node + linkType: hard + "@smithy/eventstream-serde-node@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/eventstream-serde-node@npm:2.0.5" @@ -12887,6 +13624,17 @@ __metadata: languageName: node linkType: hard +"@smithy/eventstream-serde-node@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/eventstream-serde-node@npm:2.2.0" + dependencies: + "@smithy/eventstream-serde-universal": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 7ed29869ed62f4c5ff1d7adfd46c2f0a3893c567651e55c9acefc03b987a8781afc1962bb6fc874c7a6bb312793c4f2da99b9af3b478a4d636856a0ce0a90f94 + languageName: node + linkType: hard + "@smithy/eventstream-serde-universal@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/eventstream-serde-universal@npm:2.0.5" @@ -12898,6 +13646,17 @@ __metadata: languageName: node linkType: hard +"@smithy/eventstream-serde-universal@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/eventstream-serde-universal@npm:2.2.0" + dependencies: + "@smithy/eventstream-codec": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: bd2e429000d610b4399b82ec82ea3deb09d6b2c75965489f17c449fbc63011722bd835b9e73e69765f6ac9f8e371eed2cff373cc9f442bd78e239fb1209a1e6c + languageName: node + linkType: hard + "@smithy/fetch-http-handler@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/fetch-http-handler@npm:2.0.5" @@ -12911,6 +13670,19 @@ __metadata: languageName: node linkType: hard +"@smithy/fetch-http-handler@npm:^2.5.0": + version: 2.5.0 + resolution: "@smithy/fetch-http-handler@npm:2.5.0" + dependencies: + "@smithy/protocol-http": ^3.3.0 + "@smithy/querystring-builder": ^2.2.0 + "@smithy/types": ^2.12.0 + "@smithy/util-base64": ^2.3.0 + tslib: ^2.6.2 + checksum: 850162a4660d7b363d135da4b6b1975401cae9a3c7df652ada49b5aba8af6cd723719f893b2938918d9d80263a60fd5dfda75e7f96577d381efbc4085ffd0820 + languageName: node + linkType: hard + "@smithy/hash-blob-browser@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/hash-blob-browser@npm:2.0.5" @@ -12923,6 +13695,18 @@ __metadata: languageName: node linkType: hard +"@smithy/hash-blob-browser@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/hash-blob-browser@npm:2.2.0" + dependencies: + "@smithy/chunked-blob-reader": ^2.2.0 + "@smithy/chunked-blob-reader-native": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 8e96fe570439a245e177bcbaef1dc1005f431a8cd4d329d0889ef63091337e626f0e9339bac03c68a9bb5fe204ba0cd60241046e4922687a3f534bf5337e1ca8 + languageName: node + linkType: hard + "@smithy/hash-node@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/hash-node@npm:2.0.5" @@ -12935,6 +13719,18 @@ __metadata: languageName: node linkType: hard +"@smithy/hash-node@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/hash-node@npm:2.2.0" + dependencies: + "@smithy/types": ^2.12.0 + "@smithy/util-buffer-from": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: e9fccd5aa44f8a9b1fa4e9142e6c4c6c6390f86db358b51c7a68e174b0de6b34d1d9bbc41c3a1b4cb0c382ee002f685c9989e028b7b04b02818115edf42f1145 + languageName: node + linkType: hard + "@smithy/hash-stream-node@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/hash-stream-node@npm:2.0.5" @@ -12946,6 +13742,17 @@ __metadata: languageName: node linkType: hard +"@smithy/hash-stream-node@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/hash-stream-node@npm:2.2.0" + dependencies: + "@smithy/types": ^2.12.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: 3dfdff21b636d467e99b0bb79e169918a40b388acfdf3128aeb0b3d4a9867ee05326f2ddbb73d6c518cd9e7a66ea0d3b752e3b340db7b8a023a7c6f64fe0a928 + languageName: node + linkType: hard + "@smithy/invalid-dependency@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/invalid-dependency@npm:2.0.5" @@ -12956,6 +13763,16 @@ __metadata: languageName: node linkType: hard +"@smithy/invalid-dependency@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/invalid-dependency@npm:2.2.0" + dependencies: + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 79c64faf59389743b438487986fc2798dad033cef1c0fa6c7c91fbce268db75a36d94b1bf0580d8973745ce902d3f04c715375cb52350c16c395f4ba0120b051 + languageName: node + linkType: hard + "@smithy/is-array-buffer@npm:^2.0.0": version: 2.0.0 resolution: "@smithy/is-array-buffer@npm:2.0.0" @@ -12965,6 +13782,15 @@ __metadata: languageName: node linkType: hard +"@smithy/is-array-buffer@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/is-array-buffer@npm:2.2.0" + dependencies: + tslib: ^2.6.2 + checksum: 2f2523cd8cc4538131e408eb31664983fecb0c8724956788b015aaf3ab85a0c976b50f4f09b176f1ed7bbe79f3edf80743be7a80a11f22cd9ce1285d77161aaf + languageName: node + linkType: hard + "@smithy/md5-js@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/md5-js@npm:2.0.5" @@ -12976,6 +13802,17 @@ __metadata: languageName: node linkType: hard +"@smithy/md5-js@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/md5-js@npm:2.2.0" + dependencies: + "@smithy/types": ^2.12.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: f1f18b95b821f0b90e13bb795b64e063ec86d342a7d92d22fb49fb4c0a3793a082874377a3c8df2349c4348382615a673f33a06c0865cf9a315ac10f8d106ee9 + languageName: node + linkType: hard + "@smithy/middleware-content-length@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/middleware-content-length@npm:2.0.5" @@ -12987,6 +13824,17 @@ __metadata: languageName: node linkType: hard +"@smithy/middleware-content-length@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/middleware-content-length@npm:2.2.0" + dependencies: + "@smithy/protocol-http": ^3.3.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: b9f260bda60448158b85aa53304463360d96f4066e6ff6b44aaa6df65468c45558512d5abdbea87592a5b6e879bb52b763ad15f12fff813d1ee68e081618328f + languageName: node + linkType: hard + "@smithy/middleware-endpoint@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/middleware-endpoint@npm:2.0.5" @@ -13000,6 +13848,21 @@ __metadata: languageName: node linkType: hard +"@smithy/middleware-endpoint@npm:^2.5.1": + version: 2.5.1 + resolution: "@smithy/middleware-endpoint@npm:2.5.1" + dependencies: + "@smithy/middleware-serde": ^2.3.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-middleware": ^2.2.0 + tslib: ^2.6.2 + checksum: 7a7621d46f232971bfb1b484e6fa7eaf5c07d102dfa55339c29dff30779e436dc80b922f674dc948fe22e40697dd338c24e425dac5169fecf7bb78b3e00d419f + languageName: node + linkType: hard + "@smithy/middleware-retry@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/middleware-retry@npm:2.0.5" @@ -13015,6 +13878,23 @@ __metadata: languageName: node linkType: hard +"@smithy/middleware-retry@npm:^2.3.1": + version: 2.3.1 + resolution: "@smithy/middleware-retry@npm:2.3.1" + dependencies: + "@smithy/node-config-provider": ^2.3.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/service-error-classification": ^2.1.5 + "@smithy/smithy-client": ^2.5.1 + "@smithy/types": ^2.12.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-retry": ^2.2.0 + tslib: ^2.6.2 + uuid: ^9.0.1 + checksum: f07ff3909c8e6378b59c781a7025a3feaced4bca3bb95ac2e06bfeeb5f1ec95bb35bb0df39052a468c2629640b93b51cc3a4f3da9a142e4deab4f3c373d1619a + languageName: node + linkType: hard + "@smithy/middleware-serde@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/middleware-serde@npm:2.0.5" @@ -13025,6 +13905,16 @@ __metadata: languageName: node linkType: hard +"@smithy/middleware-serde@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/middleware-serde@npm:2.3.0" + dependencies: + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 4ac7ea24a69c2a071a3c3ac560a4ac368021fd9f7008ac338adcb912df403787040148b2999e7e041826d4fcf48c0b39d2b884044da94205287a7129c5e7e59e + languageName: node + linkType: hard + "@smithy/middleware-stack@npm:^2.0.0": version: 2.0.0 resolution: "@smithy/middleware-stack@npm:2.0.0" @@ -13034,6 +13924,16 @@ __metadata: languageName: node linkType: hard +"@smithy/middleware-stack@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/middleware-stack@npm:2.2.0" + dependencies: + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: ce21595c5ad7d3e101965ee85ed790e1260d013901c8be80be8833dc2fcd556b00de2a56b95cfeb694a0d64909df343c3864a7d96fb35c6e5eb0652353c844a2 + languageName: node + linkType: hard + "@smithy/node-config-provider@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/node-config-provider@npm:2.0.5" @@ -13046,6 +13946,18 @@ __metadata: languageName: node linkType: hard +"@smithy/node-config-provider@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/node-config-provider@npm:2.3.0" + dependencies: + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 92b87bcb8e5fd38f6a2b0f3512fc3f2439bbf9270ddeaaeb32331716c283907ae315bb9de25b6facb4377056c3ae7aaac66f2a7739632207654a8aad877f59f7 + languageName: node + linkType: hard + "@smithy/node-http-handler@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/node-http-handler@npm:2.0.5" @@ -13059,6 +13971,19 @@ __metadata: languageName: node linkType: hard +"@smithy/node-http-handler@npm:^2.5.0": + version: 2.5.0 + resolution: "@smithy/node-http-handler@npm:2.5.0" + dependencies: + "@smithy/abort-controller": ^2.2.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/querystring-builder": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 5f9688549ac9b374b2837db24b955e265eef77f76354fc676a78741613f6c60feee49908c4883e25e2e20fb3083d45723bb690070d0a6f7cc0682e74287fbad7 + languageName: node + linkType: hard + "@smithy/property-provider@npm:^2.0.0, @smithy/property-provider@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/property-provider@npm:2.0.5" @@ -13069,6 +13994,16 @@ __metadata: languageName: node linkType: hard +"@smithy/property-provider@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/property-provider@npm:2.2.0" + dependencies: + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 023b6c29bd2aa48eefce8329611719097efdd271a8207f6b01624c6f82245b56d5d81741a4f64ad56a6b240352f6d083af85232420cf1fd92ae0f08a338976a0 + languageName: node + linkType: hard + "@smithy/protocol-http@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/protocol-http@npm:2.0.5" @@ -13079,6 +14014,16 @@ __metadata: languageName: node linkType: hard +"@smithy/protocol-http@npm:^3.3.0": + version: 3.3.0 + resolution: "@smithy/protocol-http@npm:3.3.0" + dependencies: + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: a32895fc7318d964e53069ae185f03b26fe9c76560451578e21b09c09e7b443a16a2dda348c1a8cde18bddf4b5ba1f72a715c57239ceb93a7539dd1f9f44a7b9 + languageName: node + linkType: hard + "@smithy/querystring-builder@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/querystring-builder@npm:2.0.5" @@ -13090,6 +14035,17 @@ __metadata: languageName: node linkType: hard +"@smithy/querystring-builder@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/querystring-builder@npm:2.2.0" + dependencies: + "@smithy/types": ^2.12.0 + "@smithy/util-uri-escape": ^2.2.0 + tslib: ^2.6.2 + checksum: 45f33a053314c68541fa8571fec7398b4d67d98d3f846fda905f75489e08b0581405eb0bc0a8fe55177996e820df301ee275ab9529e9cdc3ea8e33cbb1a2abf4 + languageName: node + linkType: hard + "@smithy/querystring-parser@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/querystring-parser@npm:2.0.5" @@ -13100,6 +14056,16 @@ __metadata: languageName: node linkType: hard +"@smithy/querystring-parser@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/querystring-parser@npm:2.2.0" + dependencies: + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: e2f1a3dd60d59915a2dc24a58c2bc9da6b5ca7940067ce20f6205647dc53c1abc951081e92af680637a8c5e33b2f853d9988e8bade672862e463f6944a6c9bc9 + languageName: node + linkType: hard + "@smithy/service-error-classification@npm:^2.0.0": version: 2.0.0 resolution: "@smithy/service-error-classification@npm:2.0.0" @@ -13107,6 +14073,15 @@ __metadata: languageName: node linkType: hard +"@smithy/service-error-classification@npm:^2.1.5": + version: 2.1.5 + resolution: "@smithy/service-error-classification@npm:2.1.5" + dependencies: + "@smithy/types": ^2.12.0 + checksum: e3fb24af5a3a60bf6479bc057bc832f89a0b427650ea2f262220a9627d60d2ab455ad766a2fcceb55fba1b15eddb82b25775fb781c254d2031768f5f8e131e15 + languageName: node + linkType: hard + "@smithy/shared-ini-file-loader@npm:^2.0.0, @smithy/shared-ini-file-loader@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/shared-ini-file-loader@npm:2.0.5" @@ -13117,6 +14092,16 @@ __metadata: languageName: node linkType: hard +"@smithy/shared-ini-file-loader@npm:^2.4.0": + version: 2.4.0 + resolution: "@smithy/shared-ini-file-loader@npm:2.4.0" + dependencies: + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 890fe084a616cb5d2d7aa5e1b7c0ab585b744ad44fb2e2c5042747bc44aea9bac72f62448a78198a3d5eba4281ad79d5c44ec929b24b70263a2fc02e268c8542 + languageName: node + linkType: hard + "@smithy/signature-v4@npm:^2.0.0": version: 2.0.5 resolution: "@smithy/signature-v4@npm:2.0.5" @@ -13133,6 +14118,21 @@ __metadata: languageName: node linkType: hard +"@smithy/signature-v4@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/signature-v4@npm:2.3.0" + dependencies: + "@smithy/is-array-buffer": ^2.2.0 + "@smithy/types": ^2.12.0 + "@smithy/util-hex-encoding": ^2.2.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-uri-escape": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: b8a0c312352a863a875e723098ae2dcedcd586cc323b4cb16a03ff056c3f9d2c09cefffccb19426a25a1450de8612af17ccecda025e47269c6f8c4c514640063 + languageName: node + linkType: hard + "@smithy/smithy-client@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/smithy-client@npm:2.0.5" @@ -13145,6 +14145,29 @@ __metadata: languageName: node linkType: hard +"@smithy/smithy-client@npm:^2.5.1": + version: 2.5.1 + resolution: "@smithy/smithy-client@npm:2.5.1" + dependencies: + "@smithy/middleware-endpoint": ^2.5.1 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/types": ^2.12.0 + "@smithy/util-stream": ^2.2.0 + tslib: ^2.6.2 + checksum: 15b10658662e8b56db2527aa09dfbbd9d7fa54c5aaffe0681c547f85c3e346c661a2bc018d05974f77da70e8adcdc71c08a56221f569bcc7174eeb9f4843d23e + languageName: node + linkType: hard + +"@smithy/types@npm:^2.12.0": + version: 2.12.0 + resolution: "@smithy/types@npm:2.12.0" + dependencies: + tslib: ^2.6.2 + checksum: 3530ba5b4f4e52a4028679f73e133af928cf6ea22a16d29669b8c67ea540ed46ab15dc6d391598fbdfd476884cdc57881c480168e2dbe7c5bb007f5afad01531 + languageName: node + linkType: hard + "@smithy/types@npm:^2.2.2": version: 2.2.2 resolution: "@smithy/types@npm:2.2.2" @@ -13165,6 +14188,17 @@ __metadata: languageName: node linkType: hard +"@smithy/url-parser@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/url-parser@npm:2.2.0" + dependencies: + "@smithy/querystring-parser": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 566d85f2d876d75d8a65bfd17fe00155e3f2cae79ca4ca4d979c56910fc5cde3d623efef07f5b37d7108c5eb9d5ec8e694705ac9b60bdf569e24ebf77c4c8215 + languageName: node + linkType: hard + "@smithy/util-base64@npm:^2.0.0": version: 2.0.0 resolution: "@smithy/util-base64@npm:2.0.0" @@ -13175,6 +14209,17 @@ __metadata: languageName: node linkType: hard +"@smithy/util-base64@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/util-base64@npm:2.3.0" + dependencies: + "@smithy/util-buffer-from": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: 50e7f04793c5c31684802454bc2cdb5b3d969857afe6474a6eef75e43c5191391634a774ae240976c83a5d5fc49b141dd2ca224638076189580e7f50392ef2ea + languageName: node + linkType: hard + "@smithy/util-body-length-browser@npm:^2.0.0": version: 2.0.0 resolution: "@smithy/util-body-length-browser@npm:2.0.0" @@ -13184,6 +14229,15 @@ __metadata: languageName: node linkType: hard +"@smithy/util-body-length-browser@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-body-length-browser@npm:2.2.0" + dependencies: + tslib: ^2.6.2 + checksum: 7fff2451f8d8f558b0e8f7fb829e88370515da518330406a1fa6b493eb023b1256fd9321ae10bd6dded41c659f8df7d3e791c647d9638e44d28b039c4d6eb1c3 + languageName: node + linkType: hard + "@smithy/util-body-length-node@npm:^2.1.0": version: 2.1.0 resolution: "@smithy/util-body-length-node@npm:2.1.0" @@ -13193,6 +14247,15 @@ __metadata: languageName: node linkType: hard +"@smithy/util-body-length-node@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/util-body-length-node@npm:2.3.0" + dependencies: + tslib: ^2.6.2 + checksum: c9aba7f426d45dde4123d60330ccf907a7078c3e8baeba55b4edeadfcfc1ce880e3a1b1c842450871f69b3d73b2ccd05029f018087e1373602d0e8284606b42d + languageName: node + linkType: hard + "@smithy/util-buffer-from@npm:^2.0.0": version: 2.0.0 resolution: "@smithy/util-buffer-from@npm:2.0.0" @@ -13203,6 +14266,16 @@ __metadata: languageName: node linkType: hard +"@smithy/util-buffer-from@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-buffer-from@npm:2.2.0" + dependencies: + "@smithy/is-array-buffer": ^2.2.0 + tslib: ^2.6.2 + checksum: 223d6a508b52ff236eea01cddc062b7652d859dd01d457a4e50365af3de1e24a05f756e19433f6ccf1538544076b4215469e21a4ea83dc1d58d829725b0dbc5a + languageName: node + linkType: hard + "@smithy/util-config-provider@npm:^2.0.0": version: 2.0.0 resolution: "@smithy/util-config-provider@npm:2.0.0" @@ -13212,6 +14285,15 @@ __metadata: languageName: node linkType: hard +"@smithy/util-config-provider@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/util-config-provider@npm:2.3.0" + dependencies: + tslib: ^2.6.2 + checksum: cb3021c4b9711ed3849a2268f1ee76febcb0a74bfc3fb9f5bf311c11e862490fb95f42892b65bd8e2dd7a4fe18e6522d22a1f73b13ec1c6ccbdb518754669e4c + languageName: node + linkType: hard + "@smithy/util-defaults-mode-browser@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/util-defaults-mode-browser@npm:2.0.5" @@ -13224,6 +14306,19 @@ __metadata: languageName: node linkType: hard +"@smithy/util-defaults-mode-browser@npm:^2.2.1": + version: 2.2.1 + resolution: "@smithy/util-defaults-mode-browser@npm:2.2.1" + dependencies: + "@smithy/property-provider": ^2.2.0 + "@smithy/smithy-client": ^2.5.1 + "@smithy/types": ^2.12.0 + bowser: ^2.11.0 + tslib: ^2.6.2 + checksum: d9d2ea99b6eb547a91699162f2d47a4c0c50e1ff9513c9569d172811186cb6ec95e4bd80649a8824a06964811f7f1a9b02bd2662815c486d0370950017b65e06 + languageName: node + linkType: hard + "@smithy/util-defaults-mode-node@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/util-defaults-mode-node@npm:2.0.5" @@ -13238,6 +14333,32 @@ __metadata: languageName: node linkType: hard +"@smithy/util-defaults-mode-node@npm:^2.3.1": + version: 2.3.1 + resolution: "@smithy/util-defaults-mode-node@npm:2.3.1" + dependencies: + "@smithy/config-resolver": ^2.2.0 + "@smithy/credential-provider-imds": ^2.3.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/smithy-client": ^2.5.1 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 7c6907f73a1e0b28a55f97850272ef9beab45a09e4463edd79950680f7603264b09ce32469bad5bc6de58315bae7411d7a8a2e8622eeb345728aa760aa5b3f06 + languageName: node + linkType: hard + +"@smithy/util-endpoints@npm:^1.2.0": + version: 1.2.0 + resolution: "@smithy/util-endpoints@npm:1.2.0" + dependencies: + "@smithy/node-config-provider": ^2.3.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 5c0e292917ff48715b900f348ad34100956769b73bf401706fac05cb6339e650ce2481b179a1bf74670d6396b8b1afad0e120473ad6cabf33048d805ec750c9d + languageName: node + linkType: hard + "@smithy/util-hex-encoding@npm:^2.0.0": version: 2.0.0 resolution: "@smithy/util-hex-encoding@npm:2.0.0" @@ -13247,6 +14368,15 @@ __metadata: languageName: node linkType: hard +"@smithy/util-hex-encoding@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-hex-encoding@npm:2.2.0" + dependencies: + tslib: ^2.6.2 + checksum: 35b23bb3e654464f4e621407d27a7b6eb8a813ca69156e805126514954e21478fbe26bbd7b90f0911d1ca179e6b2a4c2e7ce6d879d9b31b74462541d3092ea83 + languageName: node + linkType: hard + "@smithy/util-middleware@npm:^2.0.0": version: 2.0.0 resolution: "@smithy/util-middleware@npm:2.0.0" @@ -13256,6 +14386,16 @@ __metadata: languageName: node linkType: hard +"@smithy/util-middleware@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-middleware@npm:2.2.0" + dependencies: + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 30227e6c561469cec52985bf5997b65bbe35e565a77d9e775af9d673ef6d4a297a9ad24cb54c076565d62b60a68750f0a34eeab008c02f66c979816bf629cf39 + languageName: node + linkType: hard + "@smithy/util-retry@npm:^2.0.0": version: 2.0.0 resolution: "@smithy/util-retry@npm:2.0.0" @@ -13266,6 +14406,17 @@ __metadata: languageName: node linkType: hard +"@smithy/util-retry@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-retry@npm:2.2.0" + dependencies: + "@smithy/service-error-classification": ^2.1.5 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: d71932a7a74e2218d1123a6d0966a470066c73f68537db6783a3c2a3142c4cc019abdae1c5f637f43fe411ecab451788abcf750d7b4919f563403a710e922190 + languageName: node + linkType: hard + "@smithy/util-stream@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/util-stream@npm:2.0.5" @@ -13282,6 +14433,22 @@ __metadata: languageName: node linkType: hard +"@smithy/util-stream@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-stream@npm:2.2.0" + dependencies: + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-buffer-from": ^2.2.0 + "@smithy/util-hex-encoding": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: 65e4cb0ea3fc26263bb5bd4ee1425d76761741a627b350da00e565ae22b307c6b95417ff1edd7c9b846be91a72fa27ee054b80924071d65e2edc9ae35cdf29de + languageName: node + linkType: hard + "@smithy/util-uri-escape@npm:^2.0.0": version: 2.0.0 resolution: "@smithy/util-uri-escape@npm:2.0.0" @@ -13291,6 +14458,15 @@ __metadata: languageName: node linkType: hard +"@smithy/util-uri-escape@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-uri-escape@npm:2.2.0" + dependencies: + tslib: ^2.6.2 + checksum: a2b33c698dd894d1b9a3ff6a660ddc7ffb3adf1f2a9c66fbf9a8ee5960f4fa74f832b87dfedb7ca4992fd9f1853af8547f545b4185590dff6fe2509c7e97d7dc + languageName: node + linkType: hard + "@smithy/util-utf8@npm:^2.0.0": version: 2.0.0 resolution: "@smithy/util-utf8@npm:2.0.0" @@ -13301,6 +14477,16 @@ __metadata: languageName: node linkType: hard +"@smithy/util-utf8@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/util-utf8@npm:2.3.0" + dependencies: + "@smithy/util-buffer-from": ^2.2.0 + tslib: ^2.6.2 + checksum: e18840c58cc507ca57fdd624302aefd13337ee982754c9aa688463ffcae598c08461e8620e9852a424d662ffa948fc64919e852508028d09e89ced459bd506ab + languageName: node + linkType: hard + "@smithy/util-waiter@npm:^2.0.5": version: 2.0.5 resolution: "@smithy/util-waiter@npm:2.0.5" @@ -13312,6 +14498,17 @@ __metadata: languageName: node linkType: hard +"@smithy/util-waiter@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-waiter@npm:2.2.0" + dependencies: + "@smithy/abort-controller": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: a9554c79eaeaf9dfbe213986ff79bbae1055e0d4fedee6c6026cb2d42eddf778b103bb027585919cd1263a7d77df2eabe26ef8d574d40416c019f645c0064591 + languageName: node + linkType: hard + "@socket.io/component-emitter@npm:~3.1.0": version: 3.1.0 resolution: "@socket.io/component-emitter@npm:3.1.0" @@ -21169,6 +22366,17 @@ __metadata: languageName: node linkType: hard +"axios@npm:^1.6.8": + version: 1.6.8 + resolution: "axios@npm:1.6.8" + dependencies: + follow-redirects: ^1.15.6 + form-data: ^4.0.0 + proxy-from-env: ^1.1.0 + checksum: 0f22da6f490335479a89878bc7d5a1419484fbb437b564a80c34888fc36759ae4f56ea28d55a191695e5ed327f0bad56e7ff60fb6770c14d1be6501505d47ab9 + languageName: node + linkType: hard + "axobject-query@npm:^3.1.1": version: 3.2.1 resolution: "axobject-query@npm:3.2.1" @@ -29012,6 +30220,16 @@ __metadata: languageName: node linkType: hard +"follow-redirects@npm:^1.15.6": + version: 1.15.6 + resolution: "follow-redirects@npm:1.15.6" + peerDependenciesMeta: + debug: + optional: true + checksum: 9ff767f0d7be6aa6870c82ac79cf0368cd73e01bbc00e9eb1c2a16fbb198ec105e3c9b6628bb98e9f3ac66fe29a957b9645bcb9a490bb7aa0d35f908b6b85071 + languageName: node + linkType: hard + "for-each@npm:^0.3.3": version: 0.3.3 resolution: "for-each@npm:0.3.3" @@ -49992,7 +51210,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.6.1": +"tslib@npm:^2.6.1, tslib@npm:^2.6.2": version: 2.6.2 resolution: "tslib@npm:2.6.2" checksum: e03a8a4271152c8b26604ed45535954c0a45296e32445b4b87f8a5abdb2421f40b59b4ca437c4346af0f28179780d604094eb64546bee2019d903d01c6c19bdb @@ -51402,6 +52620,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^9.0.1": + version: 9.0.1 + resolution: "uuid@npm:9.0.1" + bin: + uuid: dist/bin/uuid + checksum: 1607dd32ac7fc22f2d8f77051e6a64845c9bce5cd3dd8aa0070c074ec73e666a1f63c7b4e0f4bf2bc8b9d59dc85a15e17807446d9d2b17c8485fbc2147b27f9b + languageName: node + linkType: hard + "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1"