From 848e18e05772a12a8d06989e1eb8b391ef9d5b2f Mon Sep 17 00:00:00 2001 From: nanxun Date: Mon, 13 Oct 2025 17:07:12 +0800 Subject: [PATCH] Init --- .gitignore | 0 backend/IM_API/.dockerignore | 30 + ...31857466-161e-4d34-a7d1-f5b63df60933.vsidx | Bin 0 -> 24521 bytes backend/IM_API/.vs/IM_API/v17/.futdcache.v2 | Bin 0 -> 122 bytes backend/IM_API/.vs/IM_API/v17/.suo | Bin 0 -> 22528 bytes .../.vs/IM_API/v17/DocumentLayout.backup.json | 12 + .../IM_API/.vs/IM_API/v17/DocumentLayout.json | 12 + .../ProjectEvaluation/im_api.metadata.v9.bin | Bin 0 -> 1847 bytes .../ProjectEvaluation/im_api.projects.v9.bin | Bin 0 -> 36260 bytes .../ProjectEvaluation/im_api.strings.v9.bin | Bin 0 -> 172070 bytes .../Controllers/WeatherForecastController.cs | 33 + backend/IM_API/Dockerfile | 30 + backend/IM_API/IM_API.csproj | 17 + backend/IM_API/IM_API.csproj.user | 9 + backend/IM_API/IM_API.http | 6 + backend/IM_API/IM_API.sln | 25 + backend/IM_API/Program.cs | 36 + backend/IM_API/Properties/launchSettings.json | 52 + backend/IM_API/WeatherForecast.cs | 13 + backend/IM_API/appsettings.Development.json | 8 + backend/IM_API/appsettings.json | 9 + .../Container/ContainerDevelopmentMode.cache | 0 .../IM_API/obj/Container/ContainerId.cache | 0 .../IM_API/obj/Container/ContainerName.cache | 0 .../obj/Container/ContainerRunContext.cache | 0 ...CoreApp,Version=v8.0.AssemblyAttributes.cs | 4 + .../obj/Debug/net8.0/IM_API.AssemblyInfo.cs | 24 + .../net8.0/IM_API.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 21 + .../obj/Debug/net8.0/IM_API.GlobalUsings.g.cs | 17 + .../obj/Debug/net8.0/IM_API.assets.cache | Bin 0 -> 3834 bytes .../IM_API.csproj.AssemblyReference.cache | Bin 0 -> 2462 bytes .../obj/Debug/net8.0/rpswa.dswa.cache.json | 1 + .../Debug/net8.0/staticwebassets.removed.txt | 0 .../obj/IM_API.csproj.nuget.dgspec.json | 87 + .../IM_API/obj/IM_API.csproj.nuget.g.props | 25 + .../IM_API/obj/IM_API.csproj.nuget.g.targets | 7 + backend/IM_API/obj/project.assets.json | 620 ++ backend/IM_API/obj/project.nuget.cache | 16 + ER图.drawio => docs/ER图.drawio | 0 .../IM 系统消息存储与推送策略文档.md | 280 +- .../IM 系统鉴权与 Token 安全规范文档.md | 230 +- .../接口文档(REST API) — 聊天系统.md | 800 +-- 数据字典.md => docs/数据字典.md | 438 +- 系统架构设计.md => docs/系统架构设计.md | 0 .../需求规格说明书(SRS).md | 126 +- .../📘 WebSocket 通讯协议设计文档.md | 568 +- .../📘 接口响应 Code 设计文档.md | 0 frontend/web/.editorconfig | 8 + frontend/web/.gitattributes | 1 + frontend/web/.gitignore | 30 + frontend/web/.prettierrc.json | 6 + frontend/web/.vscode/extensions.json | 9 + frontend/web/README.md | 50 + frontend/web/eslint.config.js | 32 + frontend/web/index.html | 13 + frontend/web/jsconfig.json | 8 + frontend/web/package-lock.json | 6334 +++++++++++++++++ frontend/web/package.json | 37 + frontend/web/public/favicon.ico | Bin 0 -> 4286 bytes frontend/web/src/App.vue | 11 + frontend/web/src/__tests__/App.spec.js | 11 + frontend/web/src/main.js | 12 + frontend/web/src/router/index.js | 8 + frontend/web/src/stores/counter.js | 12 + frontend/web/vite.config.js | 18 + frontend/web/vitest.config.js | 14 + 67 files changed, 8950 insertions(+), 1221 deletions(-) create mode 100644 .gitignore create mode 100644 backend/IM_API/.dockerignore create mode 100644 backend/IM_API/.vs/IM_API/FileContentIndex/31857466-161e-4d34-a7d1-f5b63df60933.vsidx create mode 100644 backend/IM_API/.vs/IM_API/v17/.futdcache.v2 create mode 100644 backend/IM_API/.vs/IM_API/v17/.suo create mode 100644 backend/IM_API/.vs/IM_API/v17/DocumentLayout.backup.json create mode 100644 backend/IM_API/.vs/IM_API/v17/DocumentLayout.json create mode 100644 backend/IM_API/.vs/ProjectEvaluation/im_api.metadata.v9.bin create mode 100644 backend/IM_API/.vs/ProjectEvaluation/im_api.projects.v9.bin create mode 100644 backend/IM_API/.vs/ProjectEvaluation/im_api.strings.v9.bin create mode 100644 backend/IM_API/Controllers/WeatherForecastController.cs create mode 100644 backend/IM_API/Dockerfile create mode 100644 backend/IM_API/IM_API.csproj create mode 100644 backend/IM_API/IM_API.csproj.user create mode 100644 backend/IM_API/IM_API.http create mode 100644 backend/IM_API/IM_API.sln create mode 100644 backend/IM_API/Program.cs create mode 100644 backend/IM_API/Properties/launchSettings.json create mode 100644 backend/IM_API/WeatherForecast.cs create mode 100644 backend/IM_API/appsettings.Development.json create mode 100644 backend/IM_API/appsettings.json create mode 100644 backend/IM_API/obj/Container/ContainerDevelopmentMode.cache create mode 100644 backend/IM_API/obj/Container/ContainerId.cache create mode 100644 backend/IM_API/obj/Container/ContainerName.cache create mode 100644 backend/IM_API/obj/Container/ContainerRunContext.cache create mode 100644 backend/IM_API/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs create mode 100644 backend/IM_API/obj/Debug/net8.0/IM_API.AssemblyInfo.cs create mode 100644 backend/IM_API/obj/Debug/net8.0/IM_API.AssemblyInfoInputs.cache create mode 100644 backend/IM_API/obj/Debug/net8.0/IM_API.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 backend/IM_API/obj/Debug/net8.0/IM_API.GlobalUsings.g.cs create mode 100644 backend/IM_API/obj/Debug/net8.0/IM_API.assets.cache create mode 100644 backend/IM_API/obj/Debug/net8.0/IM_API.csproj.AssemblyReference.cache create mode 100644 backend/IM_API/obj/Debug/net8.0/rpswa.dswa.cache.json create mode 100644 backend/IM_API/obj/Debug/net8.0/staticwebassets.removed.txt create mode 100644 backend/IM_API/obj/IM_API.csproj.nuget.dgspec.json create mode 100644 backend/IM_API/obj/IM_API.csproj.nuget.g.props create mode 100644 backend/IM_API/obj/IM_API.csproj.nuget.g.targets create mode 100644 backend/IM_API/obj/project.assets.json create mode 100644 backend/IM_API/obj/project.nuget.cache rename ER图.drawio => docs/ER图.drawio (100%) rename IM 系统消息存储与推送策略文档.md => docs/IM 系统消息存储与推送策略文档.md (96%) rename IM 系统鉴权与 Token 安全规范文档.md => docs/IM 系统鉴权与 Token 安全规范文档.md (95%) rename 接口文档(REST API) — 聊天系统.md => docs/接口文档(REST API) — 聊天系统.md (94%) rename 数据字典.md => docs/数据字典.md (98%) rename 系统架构设计.md => docs/系统架构设计.md (100%) rename 需求规格说明书(SRS).md => docs/需求规格说明书(SRS).md (94%) rename 📘 WebSocket 通讯协议设计文档.md => docs/📘 WebSocket 通讯协议设计文档.md (94%) rename 📘 接口响应 Code 设计文档.md => docs/📘 接口响应 Code 设计文档.md (100%) create mode 100644 frontend/web/.editorconfig create mode 100644 frontend/web/.gitattributes create mode 100644 frontend/web/.gitignore create mode 100644 frontend/web/.prettierrc.json create mode 100644 frontend/web/.vscode/extensions.json create mode 100644 frontend/web/README.md create mode 100644 frontend/web/eslint.config.js create mode 100644 frontend/web/index.html create mode 100644 frontend/web/jsconfig.json create mode 100644 frontend/web/package-lock.json create mode 100644 frontend/web/package.json create mode 100644 frontend/web/public/favicon.ico create mode 100644 frontend/web/src/App.vue create mode 100644 frontend/web/src/__tests__/App.spec.js create mode 100644 frontend/web/src/main.js create mode 100644 frontend/web/src/router/index.js create mode 100644 frontend/web/src/stores/counter.js create mode 100644 frontend/web/vite.config.js create mode 100644 frontend/web/vitest.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/backend/IM_API/.dockerignore b/backend/IM_API/.dockerignore new file mode 100644 index 0000000..fe1152b --- /dev/null +++ b/backend/IM_API/.dockerignore @@ -0,0 +1,30 @@ +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md +!**/.gitignore +!.git/HEAD +!.git/config +!.git/packed-refs +!.git/refs/heads/** \ No newline at end of file diff --git a/backend/IM_API/.vs/IM_API/FileContentIndex/31857466-161e-4d34-a7d1-f5b63df60933.vsidx b/backend/IM_API/.vs/IM_API/FileContentIndex/31857466-161e-4d34-a7d1-f5b63df60933.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..694240830bba9e30c8043d944be72f698880348b GIT binary patch literal 24521 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 literal 0 HcmV?d00001 diff --git a/backend/IM_API/.vs/IM_API/v17/.futdcache.v2 b/backend/IM_API/.vs/IM_API/v17/.futdcache.v2 new file mode 100644 index 0000000000000000000000000000000000000000..e1a444d548d8d7bd88d96c15a07e338b771f1dc5 GIT binary patch literal 122 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 C+iySs literal 0 HcmV?d00001 diff --git a/backend/IM_API/.vs/IM_API/v17/DocumentLayout.backup.json b/backend/IM_API/.vs/IM_API/v17/DocumentLayout.backup.json new file mode 100644 index 0000000..a8a1bc0 --- /dev/null +++ b/backend/IM_API/.vs/IM_API/v17/DocumentLayout.backup.json @@ -0,0 +1,12 @@ +{ + "Version": 1, + "WorkspaceRootPath": "C:\\Users\\nanxun\\Documents\\IM\\backend\\IM_API\\", + "Documents": [], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [] + } + ] +} \ No newline at end of file diff --git a/backend/IM_API/.vs/IM_API/v17/DocumentLayout.json b/backend/IM_API/.vs/IM_API/v17/DocumentLayout.json new file mode 100644 index 0000000..a8a1bc0 --- /dev/null +++ b/backend/IM_API/.vs/IM_API/v17/DocumentLayout.json @@ -0,0 +1,12 @@ +{ + "Version": 1, + "WorkspaceRootPath": "C:\\Users\\nanxun\\Documents\\IM\\backend\\IM_API\\", + "Documents": [], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [] + } + ] +} \ No newline at end of file diff --git a/backend/IM_API/.vs/ProjectEvaluation/im_api.metadata.v9.bin b/backend/IM_API/.vs/ProjectEvaluation/im_api.metadata.v9.bin new file mode 100644 index 0000000000000000000000000000000000000000..b7d05e14e53643d7588a239eda3bcf712b55bf75 GIT binary patch literal 1847 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 HkDC4;#VvV= literal 0 HcmV?d00001 diff --git a/backend/IM_API/.vs/ProjectEvaluation/im_api.strings.v9.bin b/backend/IM_API/.vs/ProjectEvaluation/im_api.strings.v9.bin new file mode 100644 index 0000000000000000000000000000000000000000..aa715ce51ceca20a783f738dd999b410fc4b4429 GIT binary patch literal 172070 zcmd44TX3Aok{+fxyv=Y(4)3?&kl<~|<`6wVH!jVCowEx9AO|xf!9#$Y**(3&X>|Vp zdf4dh(|W&PLgA82r9ch3;OUsYLISy@?GnORwXdi<~bwFh%QEx+`=j$dw8ns0l}@_eh> z+wz)Szr6UgyjH2c_L?>Px;p!OQGVpBe!J89?%2Gy*4y}l+2+pN^Op|+=6R>J(Wz{W zJgPT5zg%l|n_jo<*It(&?X_QiTCa9mervs(f3~oa$EW-^-WnAhk!t4> zYdjgg1L`CX%-jA4`r9`{f?cU}HayUZ04{r-ZLh;Ue4Njh)5?Cf_dcngQ!)B{IUGPo zm%knZqh9q>+IlBrIs z$wYZ{>#kH>c-!@we!bQ7pI5q@xw00lv|0`S71$AFxfC$Jh+&zT*J!B3?z5e4eZ5lc z`b)iTyVoTo7{%+i?#}i6Zfk3Hz3X-6>m9G!ZFP3c=)m7?Kle3y&%9t-Yu|+zO}^O! zzvMT#x8Krn1NL|5DngfNF|Djz{vJ2}llP*SFz|94i?*_XCAg(a%~N{kEA4vC^Q)bD zy9*lUvGl>TGwse)y@4tU9S!z zf&ZrBZ?5&KuNz*z;)+XgpsijZGP5(m~$Y^a?6XL;vxT| z_Y%hJrt`-@sXJ(v_W?aa2_^*7;Z*EP=LbMT=Z2B^DDt;qp71`at95r0dU31W>R{v2 z=J}wcE_3liZ=F_)tMjzi=+>V%DqVcv%Fk8Wm9=`K-mQB+_z|TM<&QO^=7U0#?QZ8 z%zsvE3KG4r^}1;3r6v1H64pNS_uII6gw59nAt#o zFNQ*P{lQ9GoiWv7&GdYs{J*kU_o+8kA#%_N2ejUJCy32^>lG~9#jdv{tMpbJ`*@{i zS&#_M)~i<3T~Sb-s=N~8vsG!(0EhwV^w%f%)Mr;5>T%%psl&~>~n zBN1Q9`@tK$48Cb~UN>5mno#6Uhc zBE5Gk(%<~od5h6(uiN6j4HcfWsugIxsS~oxj>`@_%gd9|55GIq5GOFi@kw*MjCGZ| z)}v#nFD)CwK|{njbalK0b(sFiKPZeRgC=zV3`wv5hwmCi zFioRgt#_YQwmcu>_Lz%=!)N-U+rRBzCay#iM_VWTlP^scisrl*<+i;{TmtCbOx#{3 zVpmF*m`UfFq)-Ly-m?Bbym=C7Lr}vFB6F|RfV(zNT{={6% zDxscMs&kcYrLp68cPXd;R$NJzJv}O@v-J_DZnRxoa8D;n!oltS{0GOq|8&h|8b^N^ z!%Vr69D^nNP*a}J$6lsk%w?5XaexXka>X+tqis>$)hZTV^TO-g`)hw|fNV~Nn>7LcKjn7uX`^Ss)M zu?0VZ6V7{s!=|X=qmhGO|JwDm!TJL|d1>|y+o3fa3SOV4;1#L1v+oFr*$T71Y*Ay% zMS7kJBbc?Bx9>P_)s_A@nw@lI;Jxd$AL6AaD*AB^?5-i^5$BISJ6 z|7CxR81xB;Yy?2I4jOwHNr0AYR*ZEOtHGnG?P4@B5Lr7JazvP#FMDhKI^!Bcjc9kB z3_qeLl|dsyjbTT$i%$MvIIc5}xEEf#mAsMytP`%uBkb;t3&WuLF-W*3cl!NsBYs%# zk{cGj?cPEd1Ix}YBcI)p1FN~BTBOH1^+ZB4T=5P0oWnMG@1VX&-w%UCr zI$V*-+U|pQJ`dCG=kaL|!}(k^^MMt)!@rYiJQ&OQS*v}hGqK-wAtSO zNm_>G$lJ1g<+-!jCM-(dQ!s^Dlee-|+KcG7%Q!rr*%|1Y=Z_e}dxME-tHy)5hCOEp z_Ke9?A9fBS8EQ5^#LT{^eBbKOnd(Bg15$8JStg$)Y6rb$c4`zjb-+U$2HbKN9>^*} z8)toA0tBzev5wSA^|<*1&tCZmD0B4Gk^FiHsz(7^^8f*ll;tJDEAh_fu74zuRX* z2amKL86TZd%&QCYm>3 zNO2$Y;)~+3^>l15c8bIE()ze{H`u2JX1fkD^!l59WzhZ;8h5?T>6qgoSvqQs;-X26 z!+12r2%h)W8g+k@c>GelKPeq%4F@_fTa#HtL&P!VEx>e2OAThKg+2uCyI?|4hS9Y! zX(~bl=?_6}8ycM&U6f6rB;DhXUOvJ2R^m56r1WnL!8I{qqI*T0ho~+`>PiT&^gr2` z`f07c+B??KNq7gY1k7sEP@n9T2a|y9#abzwK*}tML?NwnYptM=lftDp6Wh8 zel^6L39|&`xZTj;VS`smRw-2Fb%e88v==j@O$)Ifr2WU8SEPEuKy43~lB#>aeGsJA z`%ZV6WOpq|FL-3%$I@ZEGko|$C$KYMm24C*aE5JQ~SO>5 zke>S>MPqo;gCTRvTdcu$TVJnxotO^$bsrriyvGlQwf`E(LaPx`omB(Le%|Q=WC-g< z3dPNZ!KL-}2Ci1mRjQkMSa_J3(5WEe*y;>rGXUDG3J>eea%HPFH4#uiB`~1NR*2KL z?mnqBH+s1KFWOWte%oaqdxtKCu4-~7w;I)iqZwUMk60M<$&KP+e*1{0P$}$nvgn>g z&IfaGRY+#=jYnw?fzFGT-`Hu!XU!xUkg2<9v7nDZOyURR{lvshMi7;&+JVkhu=sBd zZP5-gbc{A3jKVXfQY4>(VM_Icz;p$WZ3$}iunk^tjn6DXMCu#O6$o+5W$@xKm${tyTx-oM;836QNr zSIfqdWXm`p-10N1+nH1LaH=cGah2~OKMq!|To;EClw#2y^%@PcNtoielBwusTev}K z7~S5<7Hb?jXB4RMRhe&pI`lLs(6Crz*Ww(~IG6w_za9*j34XSWcAi#+t1W9I7q>NN zhr^S`WSo#0zNb@U_&KU^1gla2l5kN#Y=h2awHTMT=}LKVtT_H4P$dYYsQqc9fgQ(V zaQ2ZHbT(OUwBDEydbil^`~)rwBxz&=T2qp=J&|kxT$c~5KNSan`J;Ec3|73#)(VWB z0amb|EP2m?9ek=|n80%Xo;B}1q&ksxfOTk&AuoW7QzLT;k)V6zJ#7}*kY#@|S<{f7 zrD=0i8G=|cxu7G*p}bUeIhp!dwp4#|L)Le?~zkElNCGZLJK<~qEyH6PS*|v zjwImot`D##O{|WP{>m>dF3SZ@JDDz#sN=kdG8oo$?J*bN0{oH;{Ga_;JOFffA4Pgf zn4^=Z|IUsAk-o!33SlL3tdc6nbn?Peu(M4p z_G-6C>VHQ2?{BO~YWw&0ykliF1&Gj-zC-7am?Pqku)uyH2F>69=}(ck+YnR}l@<$k zb2*A~$lXRk|Sp2Rj~a1ZDj&+q6Dys?$yWDe|_zpdO9zm)*G zi`WThTXez+w6DGs$5rU@ zWgn_JWHSJIH<9TQc*~h~1?6ax8z@dm)%KT^mRUkQk&7FydciB26ex;UxOUv%Hq1<0 z^i+_(@FYY#KIM@dJhTL|GB0V zckt})Hdl|Jy4Gg}^M2zH-eVX2;%U>U9-s+}xR|jnR>Ll&x4Rfo3<&HMtL`Iace%HQ zjX3!7i7SpA>h=;G9|I=iT*NCb^-81uy~j03-Rra(!BpBZf%mdk9daTvrx+5<*7r6M zyX|K9QDsXrH1w!;)lJ+@Fjxcxm?@kvsNdoV*R+dhdv9|W2DbZd_mavZFzQg=pnkoF zD%vscF^f|O)~-8^JD~^9vuqqGO6h#vudFpZBt&S|DxF$jbB=0n%Y7!8>3L5g`@PfsWsf|~t)V>*myS!fxW5{kp6Lx8-X zGS{dZg9gWlCB3m?Yrv9$6g$7n(jnjnElB;vzrDmSYq*qIOhy{+KU-;XIzcTvTSZ&$ z|0Y8{h|P}X&vJhDO(q4v{$E9T-tl~TB9KHu9S?uu%|JRFcyGHF>Fifg2E*F_1q@_y zsiWGBTNbh};B*-AXpvzBwwP>ae&HOlJue}y7a=})W=)uRG9(qONoi24cViU^UqNwp z^0;L)j5NuyaNB-2ZqttL{lydY;gb9b@tiL)3yQJk`KDDq5{329-iu(h(XzZ6T9mI_|l`oGUE{wds?-4 zIPS2r+V%7bwzC?JVj_SoW|2g#1MBy@G9O-y92OR|kW$yev&n@PDTHL23Z}8i=1xsl z_yS=rQ?ew|0QeEw*eW4$%xJkvtep;6@@)NejdlS!9^R5Lv%7^X%!R#T)io6=k%>0E zm&JxG&7bdmuaFET*uhL%F9A4A;=M@H%4oW#AtYxs5vbaVX#b6L8_jVj1H%=LNJX@j z*e3}H7wYH!e%zg&FyUyPaEys!qnL*0GYRiy7%LibH50$u_4HuRE%#!66m@5aVFj30tbHxCP%bBF0NYMj%Mvi zSk2)E36U;81l9{%YhJD9)g-U4Fm7ou-IE(8+$i}WMnU_qrF`IqbIOv>2dn?xA7_m& zS6gkbHs|ZPG$Gl0M5^awZGI%&zgk9oS+C*F)ERJ(wMmG({vkMp6m}S9d{|>F!$d3s zN%B0Q)eu^GB*PkY_<|C&r|j<|X<3Zzu0F&`G=fTe*$ZN@1=Tlt@Re=m!UGB-a}#z9Ml`L#Fj}X9JdmQ+ z>yqRrOW2wj-F}S{u2W`T^x1HJx?P=Z)7#31SD#lpT^~--Y72J29ZTxpN@1~lmc|Ln zk%G&1CqS!*uXFJDv`|9_nXIfW1oL8C61m_?tUwqd0MlF#5(7JD_m3WS5-tsApF_GI z6oxL`pAfJat81svUHD71=cUzZ%#ZW^4@H3aSl0=MhW+6H8zBvDcGGB98LwMPS7sU8`2gu^7u%Ki zMv%Q{nbPpZ5XKTY`$d=e5V_5Ekq2Ek@v%<)E?0Eq;5v*_X6Ya(mE~_pD@xz&;}Z9J zrPt`@+r727TMb;QSdG*m+t#hS;g8SoplD8-45jf3SlzNoBkgrL|tA@scg}kaI0;K<>XzdW3p-#5Z zQOVzf$3!T|lSW;ZzKBq=%RJL)g6qHAs|ak7DFz~aT%l?f5#(iD z4HfhqSg582adKI%mk_~7#2uB~Pky8MKBZBlZ->6$9G!c194-KNbUZZgt@SnzQRplS{`>Y7xku`+VWW;?sp^E3;2lzg${g zS$#gc^5u=_1eI&8F7hzTkG%KRd$|joMF`m3bI@H()Y3Nc$BaKHjXx+(O-~ldnfl$` zK$#4bJh@-C{I1NK%<3VNTl|6vwACeo0iivV^K%PLirqFxb9^B`C*;yGBi@#Gw$_lm z^=wkpGv*_Mv0|q@lST}GaAX2HCmE?vK)ClW*mrz&u7`wHTjoxuPNk8IV4b!P*K+>~ zxqeYe{W`wKnNA+=d{b}Ks)%pr2P2e}ysQlpxoA~`ZBor?u1P#-9y@@Y&(G4sRNr=~ z-Cg2l33MCV4Rcb8hRY8tzPAW2>1=tmIszWtM7dL+tY+;mhg(kR?Q&PbD^-Pr$s7Fp zxT`F>%;FL}9^Fk`Sq9P9u<_l!qvx$ymv`=u#7e`Eb9ZvNkC`&kTFcFJp1|6psOjZi zwF*o7D8XBJTW$1e2nIGKef+cSf#%F>3MfXK9nl7nH@6G7PN6>6*^@i zb(?cd<}2p?(EN9Pt9eQgWiJ;=;HROh+|Qu$noC?nCp^0uCajx}`>@5wK;?3|ktmMQ z92qCgP-NUBN3Y#7k`%z!femhrH+vfpe{H6WUp^CT@Tk?OAw4Mtxr8VYZ4?tEyzRLo zRm7IXmoCe}uKZK{7t_#0Xff_IAtD+NPnoUp+7j*?BQnPtd{sMJYLlD5znE5jn>Zq^ z5Zv$uxZ%!7I{2oMUk7QfF9{g!TjvVFI(?STnJ+882B(MuJo^0gh6aAMEKRYJdb-!0>_}yNu-pW_Lha!`&YDAKGUqfvKkRLy4*`e*f)OF!# zL+d4Q=aN|oQY(nQa800E-T>tdYWPfcI%hW3CbH@@#0H7?2gV)y>l@aoNpK-M5bXc* zP1{gdAxjR=mx~0NBN(xA+deYVh^R;>iL_;;QYf=0G~;)S6yL}?FN_rm$St|G)x&Mo zowA@@-nP0ts{l3^y+X0qW(`qBxKjEq?yT}rS_JMWLWuav58-Z=l-2~8i<=-7wY?3H zGg~N-(D<$e^dPMfP*R>Ne!CnVcdD&*bnda(KrawW4?VBRJEK=S_RZ7fua?1Tq=|p< z%~$f@gVWw2t7qM-(G>a*GB?6jjJK+dch|Jc-W@yAO{3{7-G%9D+LdVa`Te>y{Sud(8#cO|im@QfwIcrn{iZ=B{&915o_XOlJe-t1u%(z@JuCJj!P&GPoRAckEPBR5uW7X9rEhU zI@q-OKIy_+$PRIhR(oi~g1s5`ospGa&w)}V6y9P+!|;DI^Xo6`%`UBHlFKx;_{5r@ z-WXT8j-nTpH`I`@`^^~(YT2uFs+$DFzjffh)TAQ zv&6NHZI5NMoMX-|zpl4ga5|a&apa?+yePA0>=7|=0Qtn(h!b!+pN#3L*#@$@zij%I zb?;#VxrF_5D;*f`zNvI*lk;bN!xZ4J4&~4(7LXnQ$3*)58HCF=Oe$Mb6UUapMz&K7 zx>4DoFX!z_l}%uYk0jUR&lldWda!#wL0YvYY%@3pw{gk8>Rp=K^s28PwK{YwjgrnA zsZGD+W_z&Gpx#D27q`UIV!9R?B?+PjIRP+^&{ZiWMh~D%-*SXcgbmioNkm6v62(eR_t*Sjb zgB0QuxtA;x<%{*sRginjw%lkP&-#pK5548E==*nQCGN$vdHhf!I!JWlPHsTG44YV- zG>y*$V-6$JCuzO3!PNdm>52sh*qB(I`h`6$(CV_zJI9Se-IK6)oBN%3S>=hh?KO_jpo(K-AG@kCfJffco1<^1 zCT_Yq&t=n!)g30fZFehOWNa`~6jYP8A76s;nr8KX+lQ!`R(~8WOPykp9EevoNLYz* z?kO}LtQe^#({+TrXodXPIpL6Ssr9i<-DGbH{3@7UXbZ+G8)jbLx}~J5JPa#4Q72&0 zPOf0_ybg_^*Cw6Ct0k|ygX3fQv7gCsf~RL06SnVxFb>hUr}lD7$>>6PbGa~&1Y2^K z57XHt(@7aFvUNIIzQOq230dw9YO8#$(YT?zjHp-sYaamZo^5o*{tUF+9PJYvGMVfQ3VZ; zNJT&80`;%2yqKL^n3-RA`10`#7C8M^S{69EjXTYQP8eDB^&^lw!8&Tnt6wt2#RsuTNw zN^7k*urXD^aIGekbW<(7Rc{&T3-E{`8Ktwg-99RAv@X4Lx{-QGbm44p4_xU~Z zXdC}_4|DS!|B6r>{pBtHw(a|VwMxI|=a*Ma3Z*kbCnAD41O1z3AyQCf@M|vA?!%ck zZ{BpE)qw;!2bvH}@Kk`@7TRYDEx9}wfHV=F%Y|mG-NGqb;6Eh~t$E9qx`7n?(!+~I zolmwZZ%5&_{GvEDHgaL% zgNvcxOTm#9nBKvqq$OagUkkCf`D71IhQ&wXozkyJZE2i2@xO(PsRECKO zqK~SPRl~oC3N!f*!Nw2Ie>;N@o87I(^_f-E&d4DOt(a>;R90bE=vFt)@Gh_?A@&{H zM@k6<^#GW+l4b*Z4&g`kDt7d%Rl;S0rtw^0hvnl+XU!zWG3a8mIl72I0cTZic~>yaPvaCN^w3>^*cqQCzPF?s<|VuS8d|*+DFd#W^ATMXi_W9oul~9HFC$T%DGbSHoPO?s9LYuJ!TK7)a*l; zb&(;90*`a&h2W@1qXE^7u6`R>C6@q64IlZ?T2yd6zZ97lcXACICdgl8bP}CGSCftv zkwUT-e3$guU~y*zNBWV3W)7wjwbda~N5DrYpF6k>UOJy#X%>#vfTbfo5CN8eP7Yx{ zgNFuI2339w*BJ5mlGd?nzrznNuAQK5>t3~N^E<6G$M(mxpv<$WOX-$oj z{{Q}794R+q={3MWjA@7v0{$@>lD*E#W~I5*S@;!&R3K<5d6IJXM<(-Q2obW3VV{{7 zddz+H*_{z)g;f@UqUAfp7n`rvC$EXR$43v$PaJ> zv@ntgItYZC2$c}{%M8R)KG^yMh1NJ=2T5DJZXiY@5oMGH-&0QEWEoi&&kZ4jhbA0A zc%~z`=T}-!NZDO%ZsVCI9OLMzjekuuim8r7KL-0GvL8P>(&zsGVj#7GR5ufeMiB(1 zQ)U_zucjLb%w`ir@|4rPg)rxnLj|!clM6Bu?5LZ8Q^IDB=*L4da0O$CRS`Pek?=p2 zm{@6#zGZ^=CvkYKde5*4ir)I66ws$nlyJV32I+8o*=wxZ{k68Nb+w++nyk8 zSnw!uOS?_szSo53<+skB+o^ zYmK_UdC4tbkrPr-KI$4Eved0<$OTtoG_>-ku_#d+d*7(9bt;{m(Kb#6{xz6ZDT;Tt zR)cG>h3t#MLaavnv$%cUzXsXMRxRP5Fl>@2ux?Q}Ypy`*kAw+W>QK^q-B;kkpFwGWA^y$*Fy{>^?qlnOIYzq<4x<&UzZWc) z5lj&Eoo!gbdP1%E*pH$!u`yrmZ~euIBNcUxA-R*M*!w#Sh@U%jJTy1wv>A!?e$Dhqb;-()Ci{CzkmI&kt+}_M#sY^!BfZWe?L+%l%7eQcX#b9{ivDTW0&mUQ#Q~Ts&2`)! z?0!F)yLp^fg=kVoBs0a$*~Xj7jt^FR1`*Mr2&CoSI_yD!|4%EO*S$8wFj6?sW(JY4CL04RuM2MxI0#=3ft7LXAS%*? z)&(y%2qw1NCU2TmQFP?9Hq*a7ITVIj2GuJLqEqNn1BSt zFcN0GX!(tuX5d@!N{C2!YGozJX+g1r3pla~AH|CofPss-6StY$DdGnZ$?nVj zT(Ql1waaARwQww1jG5m@7#z=k__I@<4^rsD1%v`AG+Jna$;VI;Qi^gP2I^fKZJ^OM zu5Uq!{wYBm8Lb)J>8HkX{VA~6f=)zHv$LHIa{W5SS%7z`XSfAEoop3z3f>$~gO2aq z$4q1gKQI@+NEJ~kJHyF`M0~_IX$Rg;BptO4A|yVfT~Hv99E+Bd>=8k7God&tY|iQ& z@%)ic@lV6nJpsKcI_#!AU~+B=wMha!^LpJ*rD0_v(xS=Le6X_BkYdl; ze2$T3fnf(8f4NaH%(nGv^<-{CQVE2V`{hppNX18l_gwmx=gKFHt9t`mNTagd>U<=7 zk^P#-uwjUD@##5S^|F@G+?_AJxMOPm0Vj&M^WW;WAu`3Sfj+WZC8~(`uv41uC%XQl zbp_u@6RjoA$8a%U^9Z2E692wbww_R9Gck2tRox~2dmSke$hZx3Sl0=pvH!wmd?4WfZcmmz* zv#w~`tgbloq(QL4wcpyR)(AB{ZgW<34} zI~#QT57yn?@juvdSI7Tg!_%bE;MO0-dtvif2TvZ{>~`BffLXwxVRgY2vp^8leKZS% zx_9_s=X4>i92)zO9?0gmE@gzDI{eOL0ZG;uL%d+cBVkj3#ahl$o$t6W6qv>{LA{r<^sh^ws&65{=e^$ zbvXhhkrqm+h=m`_HP`4Av>5xY8l*X+`?ee--!g;z$Z>4{iF9NK1MU07_}<@vMYu@crscIo2cna zuK^<+k`N(I$u20ckuBB$8e0~iIi=lUGT1_kTrT(Chy;4sA~@UHxTZ<^)!!Z(y8y7g zB4{!{v9eAS`=;VcT)$U?wh}nv5yl9#3w_HSMoTO_+)_1xo>b>3lY)M=$5zrX>F?M@ zW-7>$eUzd^Az&}7v~}M&H%-pwaD;36gz%g|MWS)nrAC?nTJE%XdPtEIfZ(`QXxxp~ z4#j82%VEnQ+i&i)q`-se&L(TW!o6^7oZpQJ*A9(DFD??$by6B>4ykms;bpr3@n&oF z^%8E{+SdMA=jPIHx#KY0abGke2gb+7#56t!%y3)qy?b9knv!z{H*PA;w>`wki~B1n z^<>N|FP?tP+ut-C$al-Z`U`%w()Pef@zh*c6;^!Q{bf=GXtwCcqe8LP2*p({=YDyA z1f|R|xnJh!f4SV_p@t%}1f~$SBZ?unl1!CJdCb4tiOPMwn+{`Ye`G$>-6Plz8(!l)#i+cYoDVN>D}v6s1k%3@_S8ntT64H( z>p#V6#S%IfM)+mBKxS8)xRdSzkZ**p-EVoA2*Ee}J(rhew4W!}kZ7qhDg&&0y52!# zoBJbo4r8Rmbgj-Tk|JOrRa)~0xBPnJ7l58vY7hQa`GAn7q_Q2m>C93Zm^e^rW=y?z zGPb#v2niiXg!DC8ZZ>ja))#t+U+;vtvTeW=h9vPP;2~s&0iJYGFc4>@8bBBjF`Ep4 zB-5QSivc5`{RXLMLvk8B@J-#!(BO<<8w7G3IMRN_rrE=oQ0ye1;I@M@n2nTGzu(6R zrOQ8mV!QyKCX_w#HY(Mfg>3-FD#LR|UPEpDl5LNjpr`DnBVQNZUR`djcX83rbLWe4 zK&v~a3e*d41M9N0L$R`-Cp1!-V`nm;@!UwLuWHta(c~}lG*}u3d;4N=YumYP9_Ty% zP^#;hPhKOO7^<9-S4^g~3>j9AkdM;M!Ki&H@|krW5+pwjiCPM2r*IJ6;)(@|`;D{~ zpnv?{uOkJNF@-_@G3yDJ``sykZet(80frrzADsl$LG65Ssjvgnwg>Dy7LxF!YRZ5*f$ z=!ybu*VY^qJd@!5Xm{%F4|FDz=Dwj%`Nq&LlhDx>Z%0F$g#Qs}f_2-2nbpKnUlPIP z?g@)i&;I~Hyynhv?ucA9wkeWbUCsk@CgGa#~x>gQecz}MWj`^jgOt=iN? z*`!e~Utz;0`SIfJF1IJfvuWHiky1uwF5hLBIZ+R{8UvXJqF(d=LVXWZ*F0GJO{Lz2 zZyIFV;xLAWM;=n0Kdp!yI&DZt)HRxeR(~n7|kFiQ6d{?dM4a#^p`< ze!^5$OaI?`2lykOC>$I$?ZdfQl2M{;Dy9WCn0N~Mpl0x|4_ex+8sD2G9ffZ`YZ(|i zd|T6eCG89QENx-F)<~m2zMDp7)6?4G?9z1>gQMIQZSu9Z!|bF5U{Q*v(Z8V#;O-Xu z@3qz&|LHu5cP)F_+`=R18y*tZb$Fi)2gO)D7&gW_W#%=dA_NfUqi{IhXBjf70r!HJ zP{TsfsLoVXi)l9@s)ixj4k|69gohtm4;Ehwb^ro89Ay)SlMD`DllJp z&8pF-6+oztsC3{r=NLBHHv>kzjLfkz=|9zlFqpN-^bl?Dm^_5YJ|Nq(oV*HC63c`a z@J(Qa>DXf5$spCP+|RS=0!efpxy)ozPig1_Kfqb_W|Mjf7A z=X9ajV$AUX+!L;ng~YaE_QYaBC!^#lj!6dfazckPF$SIP#_!;@nDE_8^BuZBUW_2O zUe2{BPA0c7-;-OU^iibmi7g5#EzI{oi(@(tKsw7qfKp`VDTHYFdjQBsS|9p6n%s<2 zg9`#}VCjmmgHF`>kbu|EBPzMVl2$AH*#SGl_NQHMCgxCC&B6L_?I3HgE5Gl8dAfbk3^{6>T5lyS`vW;}7)5Dv!;I_VVB9o|1tPR+nL=wUNFK<%edMlUUcPQwtEe8mke?J7 zN=nQ8yaQNFBBEMb3TBWi3c#^1^fd&cCY43oYm5!uG6s`FBeP1YR$Wa`{VH{|s$j(v zL7N~#cxYT*i`xyUVF&Aw*Xj7i4qX>WpUUxtVs@dVt}h1ZVT~*lbbNiFk%eAm3^@@X zPGI`1l*#AS2v{J{g&(_>m*~H}6vRe%F+%4N4tfMu`Ur$p8*`Bhg8^4k{!ODd77NjO zpCoaJ68Te0WN@Hni2_R2i6^p7(h7LQOQHSY0#C6i2wMCurkPzoLkLx`Q6mHK93uR2 z5)BdnNnAxGrjyX^eyd7{FcuhsvQeT4kilF@SQZNHhJ}_yHZHrV?W497XF$1b!6aB^ zxacob*rX;3wlH*AC1eh^b^2rw)+(0Sf11GP0fVQpd)>E-P0gggacBfn66@FK+SrwY zjd8Ru3A<1~i-nnu9@!_H(arylvy+fyh-}RySDm=nFOuH6tID4xGnt9|SomQ3v!e?c zsNqD4d|!BrHOH5B{oJ5wuogwg5;@h}cjO!_b$?;GWth!Mx>1tL!n+hyvN(bQ=Xc_s11ZVsSx>EfoDA zTRM$cuQX{PzCx4LKjq+w1k`T>_5m3lL*{=kMW7;RnYMIXlG?Ed>@$h=7-8=aqBzsq+b$?)Zv?b)^ub+8jQHJ%UFDrPr&F8 zMh8<&@3C#F4+yRL5g=p!^zWC{6LfsLvfa{{NgJCU+K3Oxki#Hn#1ul{&$!Rp(=FOG z6}YRQx$*S1AK_jFT?SK|qk+fFH_NN@D9sJwa@lwX-z$?wAByL%RkrQUbV!=*? zQ|h%Xo@K(xA(Fm*P@^n^cRgUx6mM>C&awGKi+KWs4*GSKGEE>-Y^$A89s$a9BQu~$ zK&WtN>e6AGNsbmLd{l6&%$raa$qyX;3`pV6r0#w9hQ0-l87HMjo$I+*ID&33z;`Wjwf@o_EoJ}+3^gyqy1uS?_oGYaDA_m*Bt zbjh9jZ~-KDluJO%+}ESnC>zwzOHMZ!$~;C%mQo-}oSt4+ja1X&pIQdX;aGw-^mfNM z$Ul@XUwdBr3jNMXx8+Q0g7-TAqsm@8(T;PpcEl8qYY_Cfj8-JZz$64omc@FXP=|2{ z0Pfh^0$ytE8_f3!<;ujruww%gn|-2RWyjXEK+|XddCEXP&o+9+MRvrI5yr%dKa!KG z12E)s3y8JBrHNWd&} z8`$bxrBUsXJDa>TP{(j1rMZGTMR>WXv!mmX${Ffd#-TwOwaca`(lKz28Q>DU%5B?O z{gW)Y;zC7DWrjIhuiyApy<)m(W8tLFnUTIko@#Ovkky8;bvbnm-izxPt+~fklqF!E zw5?Y&wfV19JBK(8>qbgcI~1-VhO&^UK&xi6APQwI+$4)&L?9;V5YJm}!w}4X#7pGI z#_mT%ip?fDC}d&JfPxX$v)mppvgw9>bAYh*KJD9$P9$O=vsKK+JN9i~@uFm$uB!7O z==M}x{s&!>m^uy<2z%x1bcpUlQHeUQ3OekU&~l^kgjyKbsy14`L11g4+7jr;XJiG& zx)7Cz80CZkspFZp_@)d8I|6~w`d0d@SRljvalvtbB|U|LId%7z=sTD}l=E-O}& z69St?Iz9TbkV6VEMRr?hzS2S3YlHdB z*VuUOs_sAEKvFUeOAb&(!9B;7ID7CJP&H?Jf-K|J8(}Nc^QV0HGwN8Meyz7wVZ~G~ z3Ol#?g!+x(6FT^r?vlp$iE+Es5YL=c3TwGBSA~2tGwS!yE!)?vNm+0A%QH4Yg(X(Ul z1)6D@BOkLibJXoW35-!OiyVm{_SzCKn-q$)-W`4unFK+ki-tpRFU@y}VJ0D&j^SRK z?+(LUx-g2MRS6I-Re(j>><*XDRGyF~WPI$#2%01as}7r8wAvj$|E21OwlkFqu@66( zm{1fn^_)%R0pVaWPN&y^je~M)v#LTnkXFrjN_h+$ttVO2ybe-=Al_KDRsmMB_(*Ta zqDh7xoLb3C+-HY%839RlkUaw-UXl$wD-1Wme^to?*HF!~4=b{vgx*P$`wwb@Hklbh zK_l66GX$Z#xR-qJbH2+tSAKV|Hz-!T%9dm>U`q^guvHp6cqmf7-VAofRcsA4&>>6V zE9Cd~>HRZ`s>ziHg000Ociag3-z^#lx=cwP$sX%p4dO1TA1%_bF2A6S(@kK!0_EZk z)<_vXvS`>I&n)_!Q)sF4%04r6b`g(m(#5$TsLyOhy?7DUKH_Yl7uV#r%~h-%L-X%( zFO<_GJi*!CP6IC0B=nlQ5N~A!+X;N1YqxFdkMQSHf4ge`Mw*Inh1{OA?G2o%M~Jy- zm*Eg|lR%pUo}%3?J252atPT=c*|G6#kZk~g350${v&$xD=6jt+CetJ|S^UIkaanfP{Qjh}t8AN$}gd$)?-DzcyW zv}io|+CrSVY`@Y3PlbmSVWm`nA+B8RAu()cC-jY?30l4Gf$_pvsB;ci7d0ltDR8He zlb03=64E(741tBie68hs?;~);xa}{J;0(}LPk4B;F|8X(TjST;iI z;uE|FXrebLK?>zgll~U1nvG$mRB;Ml-!49~kOZTTWAHGe66`)|>n8N-YT1tQ=8peb z!XSRhC&+OACVxcFPfZ2 z_Wp=5yjCs1FQNc1g#g;sMtt}xRN}g#&<4dC?`93^k?UIoa#slK3-4Dw>@_|!GAs8L z-!B+!C@o@(o;V3&0|8-po@bZv!=@RldC}I2f;bl%j17cF+L_RIBe+hBI*mABS*iYi zN~zjHG2-@cos?)MoJgaG{4_Irmf(U*Ie4+1FC6P_|2z%B>gC07=Tu~s2%{d5)QjdJ zIV-hDlu$Vl*AGRan=}t7$(gGD1;c1~yC+UVtZ;Hc zE&n&xkHVS09Y{LyrAbnH=SestpDgNLIJk=k{%v@kvP zaD43H+~j-_YUH?WC6XuU-2s|xNUH^k_HJ%`n>y`7qLO`VW5ubtv4_Z6J3dhw$2+El z;%I5UFg99xG&wsz_pnf$e^9{KCbEysg<|i1cp0(DKD@~X#p%k_^w{W_H#IgoF*ZFt zTAH3-8(p6+6vk_nVy#vg$MA~Thex^@9OGVR_oK^*%yOJDXXgrY*bra$rQ$qGvNIC4~M2+ zP@lnL=lnm2P`LJ{%Zu|1W&YjqiNn79tOtuT|7+*^jQIx7BE5wth;L-cQM3%rr7|Q=(KAdk6ysEs_p3+YycQI z4@m>SiB?kI=OVp8jKp_{2=zKg4HmOKY_=b{U!Qo}UgH4NrxWfQJ{!lPJr-uc+C>upZ@qfZnw)`Q=`S zmg*b~kV(xZ-&uTjN76{`zFpXfaM1&{PsRHOpi!jHT!ch?>o|!*o3>?S%z?TtYD0qZ zIH)MF2*B$k1SMH!I6%tM=U@Dl;-L|?qWGI8mN+n2CI^(T!0;r}Em~E%%q@>hL{z?r z)E?B0rQ`tIe_Te?!7(8pgb1lp-vlg~ERDue6rjHn_3f@0Q@f4ObT>T;cmL_ost^(@ z1#|PmvV<(Fd3-IeQJy8zjk=UwF}Qbd9V01JeYnUi-A8)>pHp=*o_8)Q@GA^F*-=k!4GbYVbcr$XLU_({Zqo@sgF=Ss3TPwcJh#$F== ztcg=m7X^QOIzJX1IBETMB90j?ZWmgZsb5ZclR|sWn`*WbigCzn^ot&1c|e)KV{G64&Ry62vbRC;LU42Ka`M_7Hk_}Rj5cPPuJK@DCJJN@G$M#SV7bJO zO_CI{nA2M88mE2kFZWS!;Hn^HY9y;S-Up#YQpy*`11m);=`{vG!(9C@RCbPdm(UTV|=7CjPLF`tR<@VRoZ>2K|(Pm-p=#vesG{Y)t-BMfvJ zZF_;$42j#|Kh}ZxQTOYi`c|b~KN+gHQrT#`3*{@`+io7W>u~R|<5G+G^vQdRCnFHd z(5O^BdQm3|B}ebY|KhJ#M!%mO{k^f#2fwfH$3HB}%xbCtR_y0-JhcHQq) z8l!#}mXy{^xLT+zFOqY#2?NX*>~j-cRA?SR$qNG-zP~6VkXbu-nh8U*%pAY8j4(6) zXg}m|&rhiH%Aa3DHnZ;LF$x5e-*fOKOZhw*k6LZoS4fB+d;~l4P0Vy!1^WyEy<`?r zAo9)L227W2Hh}qMM|h?v6FXn|9u{iKvdxp{^Ge9`67wmxDG^d~Va~z16b4&vm~7B_#EIc0 z3h7}PPn5SeVYek|LbEU$pln(X4iExt1W@#Zfsg?yftR$tzJm)q9f~_ZmJ1ecogCPMWDj*+q2(hV~KKEiA)T6*PczSVseNDOMAxq9YL7+yJJc6?ZIgd+f+ z_h6tP!QeQTVJXJHJtR{90jV+Xnxhkrq==n^EaK-3U@8^D`sU#({A&&9AG;#+%^r4$ zv0nCB4MX(E+pMlRGb1cv{G%_s>m{~ToWoNq9KO;)NN=-d?)9&oGzNZL>9*l0bUTnY z^OuVhgY{c(|KVUbNwAG~FwFxvkY8pA_m?dgguhNlXfn~KfzVd z^Zb*HvYJ2qCzxlnq6~y1L_NP;YjtrJE&DJ_JV2OIacrUtr7CEYAk7k=%2rG%Rd1?( zX%D4lc9duo!F?;s^jt~?wDRcbVLm6*DQDl%mZSHzHv=5( zvdGH=@US-#zu}TGX?_v*JdTno8duuwLcVav=v?Ww?QZ-$D!U-*d$gw~#c9AU>!R+%p?-gL`efE7ED;j`Izvu$6L7h5aip~ zf!B`muhk~N0+}mYe!z_})7rWt&Hl=F(BShnf>Srn|3lpo(#Xz(!%J<-ks9Wn16`y@ ztDtjh1Z}jI_;3kHCZMa(qnNW=uL_@}xjP&w7oC5lQ<1<}VK0X=+sse1)6*{5F0!Ru z3Vo8T%gox1P>IcEL_?-bN2bd8P!)1do6kpQX71hlJb&-=d-twNUkh)|!38&Y1T{`s zfLq%AD^R?70NoTYIqgpp-9Et;7r(0n?N&EQiD&kXmsvKs#me2&3hIL?BO*<>l}^DC zA?3X80*M4Ai9ATWJGk^zqc_sz$uA337nPeMG}bp&Pl$$#*L^%_-(Lej_>0BazJC@? z+b`HsI_*}k`wG>6hNnd#-tOEGOspIZV1h+ra8T;ei1rt`EbOL& zFxL+dF7lXMXfkpm7+8>+1^XfTc~P%DMjDOH^O%vqpLRNENa(V!Hud>)#6VDLcR|^) zkAci)JsBTWWE zecORwN#qM0r>Q5}xBHb_ASWe^w}vaKh74!y^vRu78XEQ`*%Ia5QLX)SH`{*d{gSl4 zX|y-&+6S?r=Otj5yCh@ig!uJ4cmb|Rbs;9N93l^m3XsF2ino8YAH$1-O+||a4C@;U zyU>6WN07TBOa3X6g3C}Bo7h*4UHqobzic3~K7&ceUx7{Jv-Cj0n8F++NbZa*4SYYE zL@3E$6*_mWrgSZRd=e#V-X4G`!t7&`Ef~!@=1CeX(|01yr{-l{qyF}(m2<2wL#ME- zrRKwW6Bi$#e{5B{&~gCbKYK5@P6kxAYsPK>yV{d*Fh%~CfbJ^W#lo*}`1bW-Wu>7M zBP`o&A-UXfM8ef;v$&M#ck9)Qz&rH8BA1Jj9;1Yo3X+;Pr08)xRww*>Q3V4vSto;H z`x0(7EEn@QWUC2H)@&`pV?LgHTWqpMM61d1++9{rUN-&8x)&k$a_||e|Aq*kwKB%0 z+w{onv-w>=XijaCi2vAFWIHR!y|~oLFca_xApz+ba3w{;Lt)V!Aoi%Vmh8{t!+06+ zD7wXNxdl$bjlrOd2#GPQ5PmF%lM~afryh#jB~TsH3@s_}_NjTAm7Zdn?QHOw4fb5< zDxI!=paTeUYre#zdC-;dc7f4I{XcteW_7WNzQ4lGoe%)wAh#EVhra&gZdhW7UM0t+f>OE__ z4fd+Zj_pU%s4LAKO?FJ@u%w2vW0=*C#G9Pg+W`q2G8B|P&F!kScRKZr&8}9t6@`ST zvudZ_rW7OTm56k*<7uVQC?uj0ZQX!WX+&$sPy;8|;QZ*kR)8@|VJ2|GcetzCVu!a< z@4^~nlV-=-M{&^hMvT?z0XHluZLeGNGrm5mJF%T_tr;7PealX3_@Bv^%sleKgO3Yz zS;YUxiKKI4SQEtaVe_wJV_0c9fY&U!c@^5wZ>^v})D6D09IJHC0+AE1=x;C|`J1pQ zVaHT>xwN&$*7%o{%)!rZgjQRyh*;*Y?{c*T+vhh1uD4Ir08pvn$}k3ly>qUEyuce? zvrxghibyPXu9U?UGE0yOh&F?S7uyYrP&F>c`lq$sA{X1|u_B-*)FyM*5*FN+cr@s} zrQ5Ok&%Mq%e1ohF3n%|7!&y3uXM%i2WZR8L*TIL8w-lsn8K0`Dn=AlAT5k!|nYUB09zY6nQ((G(52ah;`j34}ROfDh3Wzh?GMJwf$%P$G6+w=-u7^ z9oplq0+yP1JER$E@30w1(qqQ!T($zt6y zbp9W!jatousdZg&xM1ZBj8}gLXsygp4+^a#AJ{ev>;izwq$oaBA2IzVfc1li$^+0okK3F{<~9?ILxbe>`Gxg$1R@4_TaIX@>NAOkaIaJ!H=fq(4Z>}TTS zv66LS(wvDeERfzo-jW)gdf6eHfRPZP6e|=Mvsm;0 zIl)yXxXJ`0I3YE;he>WQ$qgnM^dvW!sroqIx zX)rNv8cY;SM-xoliGo3QlG{y=$zP_w$uR?ElDnPcZYR0hN$z%%yPf1oog6nD zLt#!XF(;RplS`94B4+3kGc=Ot7%ELN6z1#FBtv2LE-`zTn7vEP-X&)560>)S*}KH- zU1IhwO)(T^@6xp4&(buF2)s_Lh#&G7^^U)24ERCq3S)*t@Pn(EX~bW&EbxN}i64YK zesFWc?D&hDn@KHNQSQDD#o!##z9;U4@j=oSq36bgn>@WYI#U|0ixakpmr(b`~LFw>8}xTcwY z{Kde`^y4o>x`LU0bjL$6(~rLxiVV|CKRy}?7R>bHFYeY%KmIZlESTvB(mZxE{rHQR z2tODXGyR1kldj05EAphW=)x!sE-a<+m%*jTq$~2|6nS!rOr9c>r)U;ep=cIYp=cHt zh{V8nU_~BSkq1`fffadRMIKm@kuMtLfhG+FKL`o@prPOg4Fx}lAoxLK#SbC~eh^vl zg9w7*QSbP{P|Q$@W2OfPXl_2u&8JQCaWgrSj5U5xJNzJ+_(3oyi-ySf!DR+d{6(1I z2VsUE1R6gGG=30h{9q_%jZGHK8p98UV%8Y`VkpxL#UO}}48-=Bi`tV9uelh!(4p24Cr#pierTf6OIXKp}3{Ha6hMy4$X9fDXnp zAvnm%vN1fJ|iN+LDt3UGzOd|r(<#J(X7vA~& zy}biAj{0=Sxj%~EO|rhu!NHy|7D)0AzB*?#YKh3DJ|#*$xiH`5i%6GEu`{VqLp}%k zFjkB6H_@sBt3xvAO#PC1EWK;X*w&qgBOXFD((BWdf*isQ>o8#=#35s&O9m{D+wm`% z0d8Z6aw|GzsI&@j7EFbZ8~Fm>?>ip|3oO=-;+6yA(O`?sofQj*IqNpzF{MiGRTgU; zsC-Y)Yq9xVINBcD>`!Ydp-kP?Z@e{HgI#3zslGNw2(>DhS)N&?{3xc76323l5n3b> zYo+7}m>F69rqX!5fT&BZ0L!5INKlA|GCE^9nXxZ0Fme|x>d$(9+pFrD`r6{2VVKT8 z5dk9Cz)ws60awBq`9yi(tb5_KkjYSi%^4R0zsu-b4cyc_(5SDSm3aw%_s>>2+z)qh zOxT|p@@-Hd=+&XVXVe?OIM0k6r_Vb6hX@Dqa3n_9LiKen695=Wf)H|N*mg!AD;t!N z5x$S(KAX#M*`@t@0~y^-ECjMC;xqcjs&T>%Rr=Q zI5XoRW8goptxPGUBzl7|4EGr^2(HaBTEV6dd|t?6^;htIAUQ~7*Ic@RF*Z{H7Kq)m*yxV*71WDI#tBwK{i zz$ELsqJIVmZ57Yy0DggDo_V?ovTRnPod<(C39?IK<5$=!t2gXk1s8$v4EAtbY6GXr zX0BVT81A(qegSi9@#@^BSADIeW{-yO<_^x`c`@^zmvB8q`qS;|9}l4-<`Je7R0+sA zXL6db?ni${tKfbUQW`e9GBB$q-ibg$%Wy^BCVj+@M+mI$f*iD|?yfr~bA86Xt)om!clo$U{fuQA#UHprE{~yDW*dY0yx-40K6(7sM@uKYiA10>7qm@cXGLkD}}W= z-`Ft7SLv;ry_Bs-}Gr@S7c~*`V_gx4y{2|bNxE} zuVYVd@u){e`2B?iN|%Y%ASaJVU%F4qq=Am~J~`U)o} z8`Rq2^_2`E)=*Ysa_yVxoT$@Ow$y}Si9;F^_*QFM-Wj2^r4;{Q#X&Lx|3-rtBGoOo zB(b-SkukIQrDLZJtYqo8474)Cl|Kczu1L0bm_n|1+tvuHKWsix@@UG*y$n|;AVSMX zA7Y|tMd)HEX=O3urNekeMy=Bqsg`IB;*RY7O4ARntU=61J4q!&M%8XnVt?Mk0Z54RfJS#(eX`jN4z_~}1eO8Jtdg-&-wzQx46R4hpc zZnZ}n@?y7asXa>OZ%XyNR}gkBjEqG4)Ki$usUSN)uwH_Y6A*R)Gsq^Cur*69J*w+C zd;8I6iawCqX-jKptA{FfjegK?h+GTQ9Wdvq;IK77Fnd!NT<0m~7s>lb)lX`mBYc=6!N}E5E-6^1U zSSlL$TG7(x-JyEXGC*`QnX??3R>5#;gg_r&7>PZmgsJ!y!9Qo#_Gn%3MFR z-S@}7-)v8(&GrBc{$QA{(`S4@uQKjKGaKL6+Z-cd)hpPIInuy~OV}*VcuCH*J7)f! zS?jdAjk3uSuj=kDJ5!#|*pJNlq8(c%Ec>y%D$W@Z`1L;Y>^MGS zr!wl_wtZV7M_6*uoQ?^#1~t=J?d-Wjo!88L$rz&%SA*L3n_GQ&aS#w4@ZYcl&Pb`` z-rf9W?pQ`YM3%?Aao8of&P_pz!~7HWXZ2-^m&2USGV}%=Ua^c9hS7)X*H-E0j*j$sfv$K{v?$;C7g5&goHQQ;4(AbP zf-pr^=;>npU!o>4Q!RN(%6bj~iZ~`Pay()ds=;1y3LUej%aIX#abK0Vi$NS zQ7RmFngRwr{7j#!|JC@Tl)B0vs}}!kqjd*?L4Za7*HA5@Vw*Cf8_)f7WU>jlM+w6G|?1#T82n6MG1OgM9hNDO>h3ZZ6Pk&9x7!{GP*;xyAXtJ_SK-bI0g` z3FNIY_ln;CesdJa_~mMpwgIX#2f-6ZkN=eEaycG5+1kQ;$laZ?(9=~9GaP(t2q&-Q zaS5z^PU_-!;a}3XF&O!tk%xmI&(HepXLuO^5}p!7f~52&Pve7nv(3(rv#tUM#*vsi z9sT&KQ2znO4_ePXE1$=UU=7+*j1H(9HWG3s7v##+S%sipss!?W9}wi;({-HmpUJ1ccU z=a+fRC3Kh$QhHUIZ+p%1uHJS4#Fedf`D1|`+&x#2Qk+=!FWyU|R}Vo%r~vx(c@YU( zQWDzK5W8|T*^d1z$7X0keQ|U&&$}E6A2+P>)g@y|j*Hr|%s^q6fqA188z4$5pxjK(QPFxHnPNK`W z30S*PNvq3_W2L&P1OH03pIdj+Yq`VFUxCr!oj7`7DmoH%oXK@hUV%zC5~b2azs;`0 zdlCNl?;o`Kk^PAgqt+HK$w4O2i^k^^y-%b11D38>Cu;1?)-d znn1;~I#3zcT0YJKJ|4!Q+of24{t;-^^d884+hEzNbgG+#<0^2R!_3xeh`zSPh8CaN zzrvNjtmDNXG&K1sNI6KZ#>$*ZVpVCbCs%(_c|)C&UU85Z6USqI0B9BJBj~8g4&M&Qf_rAF_6!wEW@IN_7q?NgGg*4sBJcOUnnl+xU!M zab`2057b*eKDPWL@GifB>T&Q*#jhWDIs5!Wq?YF^!(Qze9k&pVV4i$CPJbxPOp$%` z+-INts>DB3#68cHhrd+M|S6Srrwu6j3Ht-WR zH4bBP;O*4J0h~t<%)WSf2>(q@9G-3N%(Z(*7BS`Z-qwLiXX{|SGBshJ*RlL=l65?) zG#YD&t>bgq^+-ZU;c1G86O}3o#LO0BVnJPt08wtkK>#bkKLN|v@@A#u)l5L2xh-CA z_F6q$C+d1Q9#iIOv!;lD@IEy0jeREiDECF1{09)7d~^Mj)wK1?5o9rFfnyJ@Lp6RM z{wA+h^J=G|dO=KlgZ}OL_Bfs2kc5$$!{&~C>riE@HZ^ew!lhU^xLwGP9o&X>lKz=IxIIC?P2?vbme~bxLInR_f+)EX`$jj??K)rsrfyEb#z$$5G;n=%u7TH)`e5Rp3KqXwUVhy> zBF`tE5eh(aQP#Q22YrbF75j)khw19j>|Zy_X5p>3{JP%8PH72Xl9n1X$`#pW%^JoI zyk+!QrlEh$6>^A}dGu&u8&6;wzQ09ad1uCvt$niWN!!o}r7UUT&2G6a8Q?!anrdVV2frQ>#yIknGnx_&T!Lw2>DNY10{~8G{0D@GEA9knR@b)XksrxE9ZZoMdjR`;9@2)+{X zI1v57I=)Ey!%W^|SbPwtBmgUoo3KM0>#GPy@=qDvFmQOj6R86x5%#7e%kGeU8KjK5 zo@ilsZ@Z^aR5k2iRvD4&V@B1PLIZ4i-hB<)PY*tBwQ3`wAwqhQiU8hG{qrhUp#1@p zPUeLTOuw9iTAiC*9O4r^0aODBt#h0ofEF#`xOL$g!W?>rm%ux428xW-C1co8*d%vE zemSSb>}KQ7=V!3#2y}p1$CgL1$8X=|#YU`x$9j#6kB`i_NS@T*q{*dmOPfUJ5T2gwY6g*ayY58J6(v*9#pvOfLt8G|4BH0xFCL^(;UX%g?q zR3QhneBc+e7n`q^aTgji6O`t$YLL5K?5T8+@!OTEcaQ|}F~|iP56y>vc7CT>*{VyH zF|0Exp`<}9nIK~5!!tARjgx#-=Hy36>gZvu7()un2#6)mJHZ$UtN53nwU|{Kwyo)5 zvD#{WERFGlIB3Tl3aXxY*W{GYLs`;?MVy0y+^2th$e#9NX}IwrUSEv_N!0}z2fc4? z2)h?68S65yndJ8x-jIaB$ZSJi4$j;n=sEkwYc!0HCv$6eq)=(nAHjLA+8|||o)~pG>NPlTvt@e+3gDQ-Gl9@1@Ud)X|SgN+Q5w=%e;ZS0r}XsnQTe4(x8HJ8(_+7 zu0IK$Qzk+Z)z;ZaPl15qOY6cwGpAyl^ihOcjs<7vT;i->A2_pTlV%T2ir5U18Wfy` zi)oa`^AUWeic|Aye~MinNR{JrOHbW$InGB&*;P(KtrFVHmy<+PW-`_){;k@!lNQb# z3DS1o85fUS-#R!UP)a`{7&=*pg+mjf= zh;HT_hfH)VDq{Z|HSH5?WFNHn`PovJ2;G#Xt-wZ~C=JYPUD{=awt=k7!JPyT&y`2TP3 z%bw#rlKf(3M2X^kfCNtwq(~6}2OojPK}npM6$BoF#A^vqQrJCaG`c?kE%r5C-8i&b zuf4nW9&a1raQMX$j_||2`N{jfe}E(GzrbPt0sbHS%dD*HJGvVr8ao>?iV)aeRc2OJ zRaRD3R#sI3$+Oc)E+AQF7NSotxUyZ%sdxZ^Oip&K_I@Mod=^cQz{eHPU0XVW_ZRBJXH8ziBYqcsec zYT2ufOGv`FY6uKGctRJR;e|Qufvm&sT2mEf&;0gzX;)Qw%hKi6%1H9Kq|2R2il`gp zr?a=!71xzoJ(JcX{{xA{Sg%ZymtXb<2<72oveoIEs|GKq6i)8u-lf8^{0nj}Lw&5n znw{v$fly_a!7=~Ct9CdtsaE5TW->FZ(ck`@s^ANfkxWmZT%V^z+hw5{L=ODEHV7=I zI)e)EL3)ekz6q5lPyS%>l1F3@L$bAe-|}Qn7FOx^ztthUFBDC`Pk(1V`-eYhhn=at zYlnaQ**|wtq)87i2p_`#5C-~NnEtQ-#KPbWykzrwBb)~B-o~YyA%fu&jBFzVR@a+^ zQe98H8m63%VQrH5^i_$=B3xZRKYzcp5q0zeIvW3@qv`ML!vFl4Ew4w(wkZ-- zApiPmC^S5-^;rH`GIp~bdKwpu}rN)-6TSBmgRT(3Hi*h9Bh-QU3LPhy-|_Nztawv za8VD~iw-Rz!RNvp5nkN2ret@fo()IoP$U;1iaAR_B5H45tg{v3gHVsqn{s@A*Mb!)b> zlBm`cawmE8GYKE25rP-9CwP8}Yf`ryu)Sc6eIz&`Fk)eZL3e@qa`fCUl7n<}yYhUQ zaacxZ{oJs-jpC$#b&hY4-M2w{CV-E+=SgWTuBpl1orFE&rs<#mgLjDb-BIW`<~pE# zOV4yJ3M+bf>@FF#L~y5M13&$-eBZB8M)xe>uc{ zN!l(Dp+6`Vj%sHIxu;l8ipln*+Q3PI@|#P+i~w7WGW14KuMtGff8vh>mKIZRT_)Z7y z3j+354Qo%U4VVyh*d8I3!a@O#0inVl^Y^3xyo>A#;18QMJv#@FxM1;z$(s3Wdd?Em zA2timUt{}GW6kh~&ANAQ0jqAw;*a@zLZ0h6KmQ9j<0M71Id8s*&3W^snUOCk-+bvJ z&6h64;Boy53%`J`N$4`A!h-(Nl6r^YbS#1m^`1C_og@nL0s^+Y18PV*9#xv};!(L% zW3$s~(QzJ$0Vvi=-9~xS9EIZN0zdv@{552Zf(fywYESG;{RS}@ICog?j89CQ6E6Zq zG`cvDvxvK_(>eWWr?#u(Nh>#G`#r9Rc?-{k-k!CQbQjDfH?mxSE(r@|;A-@CJch5M zD8E%J?ULuibIc&;&|P$8gNuw*9zMRtxUwKG=NpSrHNVz2yf|3f^ zv}p`DhVYdK=Cc5&UN#tH`7l$%k8B8xDGh-i*$|Lv4S^ro5ZLqA5cqMCiZh8 zBPNUb*>|AfGZ%Fxg*p?W&g7yNQmBOxwUCQCn?jupQD<{e=TfM1A?jQ%>U;`yK17|* zMO{dtE`+EHIj9iy1S(Q|RD9;5COZei;S%+<9rR8JK;{e!fz2C3(jknv!gL-EMnDn= zNrW@o17|*sGtW5ldF3EBBZ-3~!kNo02S-`bI9$%${FR(G08TVBl4u1^q#cjB`I%mb zg)GE^Ml9slY$46%0@rLIzp#ZYE|JKEE%e}WALPuCT=)abV|V+-fQ+7G<8=s;VxISn^FO1pL94>Zk})ekIl<(`q*_Y%_4|y&g*(%~- z%@!T8Ve|9D$;sj*|2pM^(L>gWmo7x$D2@|nAzPsK zVU@y0@2=Hbcu^KZ!h1*cVWZM&RvQSM=I6Da#+7P`ugW4SFwDO~@8O}wL!5SKG6D@8 zpW@)Z!!K~45|1J79?|4~XvG`vgGKxUz#m$s*p2EszVY|ChErP`cktvk((p@IYc&W5 ze}&d|yw(CO`seUEIJw*G5E1-6!k^pC_4UFB0HA+A+^SaM=G}U04j}cpt&{p2XFJPp zC|ZtEn_H)K>dutfs7~R#8UvsIJ!0^g@p`L32(3AkkH1^|QR2TbCkYhQwcgq)oG^6j za40L{vZ2bt68aV2=I@pigj&^gNeV$D%W?Ag1^#g<*J%0H!GCJ ze=F6sV+OWb#_*kt@Q*ZSH6}jrSID(Y->h?A;A_<2(lIrP>qneYr(S9St+iIakjllX zYFDy1>S^Rs!{j#VM56Iy8m3j<5elvP8B;*H-koY=u@|?2h9Bp3##W;ewHs5=9kq3Y ze{a5rOjDVisrJSiL2s;~6(K`EN-N?H1*$gwK{|a%DMW0$)QYwtywvXa=cFlr$5wl1 zt?p7SuRE>!Sqlp%5RUj)x^-%%o$bm|-Sx8@EtZ+tjRMHys~{as8Gyt;I-NeWh?Er7 zx1@GNR(GcAiiuI`R@IlO$`*m*uavekwO%8k#9y0I-J*&wfBVQH)=DCbH5SR5B5A76 zY>jG`sYxoeMhOxeZ%lPM3Jlf@9ffxOT?c5b$GwPK~&frVRCc;uRb#Am1H z@}7ByPojvc(rUXuk`JYa4Y;tA}DiMu_p-VU|Qow5c{0jC%H_5PunsMU` z0gza=eXywSexbWwaHET!F4QTsTLilbyV01ZVNqUs(WKP@ZcNc~=}3%v0w*I5 zo|#dG)4Pjnxb14{H@9z%KawlrCT{ya$En{y_pISkj`7<;A-5+c&ZA&DJ)^?nui9j} zzJh;g+9<1r~aO($yt#qY|QgHV}$--iDYD_ku~CZM@GxD{!A};2>_P zru*!oJ|%6&*}ip|Uq;wveonf}{M_65RgQePK3(R64%lTr%HF!n$9(%P^QqkA_2FW< zjMMu10vftd-`xH{TSQm`dHYkiMdZOZ5hL+H_tt=cT3D$yw{a;*+$n9Q^}1ChV;ToG z%iCXdS~ORxVk3eUlYBULrMwx}OVJLl{>0)<&P(Rp>6wG~2J#^rBl`TiGZFTMZ8CnK zyqL$?fX8QXm#$o)djP^aODBAs_ek~qo1YDtOVhZfWPM){Zuvq>GwYuPtoPtKg?Y?R z`L_pE5yN5Rm(Df8P076lB_DP8vZ6g>B+rA(io-cTG0}yl8g~FO$-(RlS;Ea7Ber*` zk?E3T7?QY2nUqHUfXqbxn}d?&ROzW^|1zkDsiHEL((Xim66w{)aMZUxMb9JgPCu?a z*wds2@B0-QC%Y_tQj_DrN#it)bIUM}W=uLJ1DO^RQ019sqb zKpOSWhAi-ALXx>K#rmg#%x4VOJjA~`C~f1e?#Y(jFZ$J>AAtkYn`nGm1ZP*Huios5 zeNbW~Dl=u-^cAB##G#K~DcI=jxRT->4{!}+>h!0CD;ISnLs-hN?KfXCun)H<`z;Ii zuZKOf5e9C8j?hV4l8ny?kmzA47@GvQbE92%hsPcTAkpqm7704;)-WS9`|HBm)vxs#mgk`%NHw8OCOB z^xIOkmF}8;g8~sIa&cx*+noclsr@@Wxyxqy)h~r{U<)tPvMCPwF1&Iv4{Ddr4*GC> z^xdV)!5jJnlN<{hG^e_#IXr#BB=8KpQLSQ(`-4{S8(_=d1+`j3Vztb-p7SzHW08nUnt z%tVsF%dp-1n@E{x2X75!vN5(p%MFbUIhklsmo$1h1wmm z`JW0VW!pb&@%+uBZ0rLY1?l2b{?NXoU;rBI?$9x@Ciu0{MR;$qrDqXUtXIqJrfRNt zqTs}xIbmmmgFCnfKt&xL99-1F!NoOtsI5qErzr~N!<*fC{$&J)Fqn&9$pyXtg9HR;qnP7?{(- zV4V6WLyKR?VYI`qw~HejmuWEHi+kZalfuwuqEs~~)RRy1c<)!4dQd#s0Fu&+#NQ3e zMA(|a?GZ)y5J%BQ2D>ydU+|CIS;D>Zq(`laH^=!wjabK=P4uI6e`qe${Q6}WWn|2e z>d)(}WVLcg+#i~!JHIxrg-y^gRi>BZB`cFn;r_4V!wr$oeNW6`I~To5$oR{y0anI2HRy>p z7Ib*ESQIIZy*FY3FhJ5z?rxr3tt2nQLg&J`BxmF zr+A19ST<{umm;sxQMh@5P2cM`$MF;#nsLIuKM4T3U~589FXK`8JnAF-U?QFfuj0*6 zv*85A<0tEv=ID`1TLhCg<-tImc)6FF=kZfkEkyT3uUZAX-4^3~b8GiiYqd!qPfKlF zhStXUSeaXY`}yb3@U&;ChWD3QlyQ+%zLJpr7M4qmVESm}*UW1Tt$0(oJe2F)~Ns4ZbTa1a@6C+vFuk@E{sM@{6~1 zb)|ChAHS0{xW*VGrQVUzp{0=@6#XXN)nA{45@O^yaiDhsZ%12{MiASU_fP|}` z24EHv-5^DNYuq{kFeXo@-Zw?eoO_V|0iIvSrhcitdxXpvj1=6Lla}Y=YFuwEEgC%r zo(?V5;!-1D`5O$=rn5tHWBYA(ghQE^fkr=SjG$H&GxsYS~ou4hEgU8;D?t_ z!3~FRVuQaY4l&TNl00fmfQQ#{@V*6UKhf-VV7;x22pu**ZcE$6ayxzCMk6-x>^kt& z#RP|ZrxLUIkzmp-Q33XIes$SgruBF!qPUW{eF@h%@sG!)_8L6Y?wYQNhjO8oxhWrT zxM-mIqxR|Pmo;BCRB1g%vq7NgJw3k9DFB3fa!}BT_vqF8)Y)>}wW@D0fw>SDf1+0w ze=7deS+DPp-y;mCKhy@Us6 zCv;hRK_ITi@@A)UO;sznxajZ_{dihxVda}M>~4++avd4ew80}<>-)&e-e+FM8;|f@ zB*u`L{BS&Wz;Ya!Tdr;O{AYtSmK*C$G%go^QgQK4ClA8OeJ&9XgzokzciU~Otp*?%E!XS% zY2Ke^=rPhXe?DoPkYg=SEe}GPTaNAQN@3$!JA8P_o7v&Juf=VjAV(&&(Sz1heGsg`h4Ggf6~zKahx36wjz{rtcK z=DA`Js-%1+VwuLrASf6^G@A?piktSzZ&tx|JP7nE%qpye@6ddX~7jzfXW3?QKvd#m0%#I0}fd&GKmP)YFDy4RAr2?9fH7j!Am!Ibq zy!@P`u+>JN!uA;qD*6}I7Ku&|Xv)@VY#^ZMK^u;qUNQ(i9nArTYzY5dse^k&a)k-N z%LtGq-A_|4EQ%gnKaK0~0AM0)#T8+uNs&DQCvk6UFl$bUC%3!cR4(TP zvx3*+>Bh}oe67$O_r1x$yRYx{bTe2U#pirKO3yh6)!TyPM5NJaz9uyt7?XLlVOrGS zPU_Km4kCI8W1&AG2E(%xZZ$I~&XelKW@kI5zk{IcKsl4b$n7qV_5S_u0n^;tU!U1+ z7l@6H27=Xyag;m4`{-!1S{R^Yd2{V6yaLi=>>Gk?!8Tivhpj5+&D^FHstIs2wUA<@ zWlAqm5eiS5bYX43a-MbTSQnN1@)O8$WY3TVP65yW))B*F z0g5N{+5^m?_D=7-ezE`&tpsaqDfEXWPgHIvIFbxDNTtlp^ z9DreldjaEn09f2ZovW4D=d{{w&psDQ zUYec-5va?Tpx4IVKRua~G}{sfySXmfgS zN$wRiKEM9A7BeOPvRjU)bQcq%5a)hRluPw~EX{!f7uF3(p4^E&(m7>>f>tslq9+&E zu>=R%7u~g5Rc)So9Cuc_8yhgq;|e*mYcMd>elfFR~m(% zJ!|SWOKCfl!>~AR{gx4^P^k4IQRr2L7qdI+rh($4!RAWK1ki*5GThMkfysoSlYqPg zC!u+eDv^bkjcJ3^xFC&jN#dq1@oHxa;_iBeVnA^N$_d&Pfva7H?BkWqY8^JMb{tZx zs_!=A26Ex;(KS^Mnz4G;?7V6~r%^2{7G8P;`wZ7im1HY98Q?qKCto`@VTyj-2aw*< zy5=@Aw1rgyz>1-HDXl1K4*Qevbi^TyN&>hqTVMVIr2wjzo zXI%`SMO=!CQPi@_bCdg`-ECml@!hNr7q7x$rp7ALj645AR%%BM>Rhg^YT8A|$ zSR{w5O)1v|WRNy-pf{4TEXxCL9d%Ui-Z2YDSm*K24@p${*KrN-GG3#g_G1hpA0rH4 zq+O2|btNkiu1r{fDn7=UG6Xcbd>Dui83OK^H>d3{lLu3vwTof=u(4HbHyiXO3J4Qk|aS`e1CWl#WA5a`o6#KWg1yuNv)m17?Q4xS04&lr1*SX%S~z8#QXW zi4VBD^z+hTiR6!#`SHWAOIxLta=Y56-~b!cL4?g%TKT?2)EI?WDZ8hf%y`wJEjqn5Mloz) zVwubYC_AbhnHJeJ^_UQu}xMucAw}<29WA`(+^-LY1N-Sr})GHO@z>wyGz|#r`wLNi&eljw~-A4#^m3}7kd7f9lQ8AY6dKR z9nhB-A)Xxg8d{C9vhr0 zs#{dOl%!R?d{`6AECX4(q~kDHFY3CkfNTwoVd5Q;bJ-M^kp}~&j)(|sc)-?{6;KA) zC8%`XEH;hklmrH!u8hfYZEyCPoY3w81D?EN+QuDRkIgleOXdKS-Dn-gw zMq4;@82j9H37fgbbzxU^)|HSLnv3)>?^!tgk|mC?x~@P%JT`7*x46G__&BHaeVEDK zJ>i4i>C@@~Y@Z(VVaKvs*$2Q(E~`cwYP?QnJI!m2yIPmWG+gO*H(JT+F+}rTS_Wv` z+Hm>g3R2y~uvl7T!Pc|3XJdX_Lg*Bh&*~hCGOKsD_Pvf&gv4OB*88Aoh)aNY8n-tP zLrZb|{=)g1n~`YkOaaneM7xlv@<_mH6jdS5eli=&C8cJ@c)$lhW_0V-=O-yV@*f5; zf=Mu1aX z@kq4W%{GS|t~LpZy|fA|XtI4ASjfUdMmm$Gc21PeDx6MsK;RuAiX}z8c0|vdCCTQs zGb~3vLevL9rJy-$SjzWf+R7o$%*uNSvkn~MLQ0kwi3{w}l7w(Ba# zmUu?}sa*3y1NUiFVcV{}`CX|^XH;$@u%jlE3F%{;Tw!0E{SBF42b0$^I^J}etuGNp zM$wI;3Op?^mVl^J-IND__-2oUl*x0k4}=zk`a#4wjdPhHY}GWNnhq%07GO>7=5mkf z2s9#AkkX0hF!D%$tP{2QPV&`M@wdv3CT9OifS8ywgn$tZK6q}Kk^VcQ2?%+XHep6O z6jmJV!$yWTYYEy)+s0C8#mi&3%0V^?cf>9#+Xg{u2k)y zA2CSldJ?L|G?$WT{Jlb-Rbt5L5%+TxKSds_+>p4OvJdLFgM(1*(yDaj8G*iR@2a+4%haDAv;`b+NsnmE1M*A(;AFd)_H-THIh^A&j~U zj@1>hSFk^da5H`!*svU{t0oglxDJOJoSSB67Hj^``}>_AwVQRlW~0H2$M>)prNE^H zXnga84|hTy;46+Wdn2)j6IryR!B{FesPR?1rq0{8V80J}WvQGg3q|jwch?AXxe-wH zyygKkUU2UXJ!feL@45Fznzcy&3+}yfZbN=F%P(VGTLay_+Vr?C)kF`_W~NBMuJsG4 zN$tZi?PD)VB?|iFian`<*~ z@?Y9*joVLQB%Thw5qR1@&MBfk+ULFe7jb(XaRG#Uf|L0G9geiN&pTI-U)WVj1`3Fg z<%|*L=bq0_#x@UourSnVY_r6!Hn}|O`MH>zW5%nGcA404g)u3kAJ|DnXMyTekE3X^ zC0tTO*5i5IceM1vrVujN$gq30E}i&=xVIG_iP8=)87H?g>mr%9HkZBHB=gP*1*wl@ zzrXy1M%i`Al+M!2$knC*(IV9NWYP3rb}6jT8fbd=fXM0$EatTWHyjv~f_nfga;F$Q zf;n~*PB6A);j-a8W)W4vu@%b$>NqL{lPiSFXi{NZAe;t0Op^|oij#&bwi}Jw}pQitgyU<&It<{zrqabRn(1O=dnnVCNItcDg9 zG0hUuucquTHXg5SSn%1>&1Rh5@TKa1^0nqaAaU*9|-b_mwL6dR)y<(_vJp& zBxOgdVj;O7U4jhFm~G93*C!3f7=BgiF}2qr;#hP%JVuoqq@cEuO;%gV!P%vrAA;7&Y>&t8fYr zGYu;TGO5_7LTA8uCP3+7j@ApOM44Fxvn99E!GJ5{fPhv_8d~0^f}U#aCIC{~B-h#X zm4FJODk%IYk#9C6*p3M}c-W}4nivy`wWxu+lE8NpJ6iRcUV9}#v}Rhx+RR2%Nz+uA zbOPM%dj;$$!+}}UkUf+@HH(@=vhH@XB<3dk?-(<06R-SDAjb(HJW(8Uv1>b#3A;!#?IY<4JPVdc7iiN^*QGYpP}ziRopiumf}Dv$65Q-2 z85c7##~pP!1&Ou2j~pbdu1CYMC8O2XAaO0o3CMrd7s}5fE!yWeqGV_@*Im zWK>?Sa@d5QtbH)wt$ zWR1~kUQeDG4%Qc``Sfi;*vTV`jEZFiWk@>xrD%(+pi+fM7?Dosbzc zSiqfsq70+5vZQ!BNzwX~!aY_@s_x@dvYuYx9M;plQjB0Ck}S3i1(U8hVulc`uS{o8^;DIJ~*6jEaZyLHjTs`7Rc5w zO|yTU1)3mx$1v~?up$8g6Hy)$nc||Ra@fd*HnB>kf{8la5@OOc`jm3YUa%8!Z?M8Z z#Dcot78KhqIULwH?0$fA0}>3lFoSEgwDDD3!+ML)4w!Dya(|lBeCHG#G|p4Sxmrh) zoY&XjdWX{rI-B8B3v}Nc}YMw?-WEr#p4{vo1q_Lb2VRbWVpNf}nYVKv5 zA!!)2%0GjzL_OK{p*c3@AtM>>PIAQ2d!qp@H^Yww>9*+|z@0pRG7iD9)4{<)Thcy0 zZR6^oS@Cc}Wz&8@r@7W$*NT<(B|qe@5C6-6IIcJH7*qLJyx8I+H}nA$oBR&-PDDihom62tTsFK8c6|v>em6< zNTwwD(phCC7`(4{-Vlnm5urNuhPFNdrzN5ttDO&6Ov>uh)M+;BF&)$APq1>vIhJOz zFkL7Vp;GEym^!<~&9_CAQ%&yBThTw~QiNfI)qBNVPJ1_1kaymW0}vk}yoRo_)N)7{ zh+_P@^Lb}*kg?S<3(-d zjIrZcRh6XDVrUG?PZf2v+{+l_AK@A}pvmi`s7=Q+<4!$UE5~>5eo9u`cCV>!hgW}L zg};B>()!g`y)EHnHTKYZWt2&mtf`{h^Gm7=r&5XtZYb4UJHCsAe3PtKj?ndKeGZ1N zC22Vp_qD6Ju;#lKW@{7<Olfx9}c#1EZ zso2tB_CkXQLil0T((d_hG5rwJi z0Mu5H-GIU6FznS-+T=~Yd0>uN%gx7Z7=Lc*h&5%yh;ae5y;0tk!R|R-z$Kt2GeiNC zkssJ-j%pHvxu7O-8DTwcr)VYWA!UwPI7dlyD*(T;0DGybAkX(ib|r?q7Y4-gTJ_gG zQOp(pc?G7Qu&|94ayFA+jH4Yi-$xcB3BX<0yQ+q7T&PT^3gBmeV{^_@%<7P2Dbf)= z%5fNBT`!;hnM6*&KAW4i zU`JoAJbd}$ _logger; + + public WeatherForecastController(ILogger logger) + { + _logger = logger; + } + + [HttpGet(Name = "GetWeatherForecast")] + public IEnumerable Get() + { + return Enumerable.Range(1, 5).Select(index => new WeatherForecast + { + Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), + TemperatureC = Random.Shared.Next(-20, 55), + Summary = Summaries[Random.Shared.Next(Summaries.Length)] + }) + .ToArray(); + } + } +} diff --git a/backend/IM_API/Dockerfile b/backend/IM_API/Dockerfile new file mode 100644 index 0000000..3d03d53 --- /dev/null +++ b/backend/IM_API/Dockerfile @@ -0,0 +1,30 @@ +# 请参阅 https://aka.ms/customizecontainer 以了解如何自定义调试容器,以及 Visual Studio 如何使用此 Dockerfile 生成映像以更快地进行调试。 + +# 此阶段用于在快速模式(默认为调试配置)下从 VS 运行时 +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +USER $APP_UID +WORKDIR /app +EXPOSE 8080 +EXPOSE 8081 + + +# 此阶段用于生成服务项目 +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +ARG BUILD_CONFIGURATION=Release +WORKDIR /src +COPY ["IM_API.csproj", "."] +RUN dotnet restore "./IM_API.csproj" +COPY . . +WORKDIR "/src/." +RUN dotnet build "./IM_API.csproj" -c $BUILD_CONFIGURATION -o /app/build + +# 此阶段用于发布要复制到最终阶段的服务项目 +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "./IM_API.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false + +# 此阶段在生产中使用,或在常规模式下从 VS 运行时使用(在不使用调试配置时为默认值) +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "IM_API.dll"] \ No newline at end of file diff --git a/backend/IM_API/IM_API.csproj b/backend/IM_API/IM_API.csproj new file mode 100644 index 0000000..56c794c --- /dev/null +++ b/backend/IM_API/IM_API.csproj @@ -0,0 +1,17 @@ + + + + net8.0 + enable + enable + 3f396849-59bd-435f-a0cb-351ec0559e70 + Linux + . + + + + + + + + diff --git a/backend/IM_API/IM_API.csproj.user b/backend/IM_API/IM_API.csproj.user new file mode 100644 index 0000000..983ecfc --- /dev/null +++ b/backend/IM_API/IM_API.csproj.user @@ -0,0 +1,9 @@ + + + + http + + + ProjectDebugger + + \ No newline at end of file diff --git a/backend/IM_API/IM_API.http b/backend/IM_API/IM_API.http new file mode 100644 index 0000000..f9d5b75 --- /dev/null +++ b/backend/IM_API/IM_API.http @@ -0,0 +1,6 @@ +@IM_API_HostAddress = http://localhost:5202 + +GET {{IM_API_HostAddress}}/weatherforecast/ +Accept: application/json + +### diff --git a/backend/IM_API/IM_API.sln b/backend/IM_API/IM_API.sln new file mode 100644 index 0000000..206e91f --- /dev/null +++ b/backend/IM_API/IM_API.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36408.4 d17.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IM_API", "IM_API.csproj", "{F001642C-3E66-4C2C-9A25-1AE5EE76CE97}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F001642C-3E66-4C2C-9A25-1AE5EE76CE97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F001642C-3E66-4C2C-9A25-1AE5EE76CE97}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F001642C-3E66-4C2C-9A25-1AE5EE76CE97}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F001642C-3E66-4C2C-9A25-1AE5EE76CE97}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {EC36B0B9-6176-4BC7-BF88-33F923E3E777} + EndGlobalSection +EndGlobal diff --git a/backend/IM_API/Program.cs b/backend/IM_API/Program.cs new file mode 100644 index 0000000..96341b4 --- /dev/null +++ b/backend/IM_API/Program.cs @@ -0,0 +1,36 @@ + +namespace IM_API +{ + public class Program + { + public static void Main(string[] args) + { + var builder = WebApplication.CreateBuilder(args); + + // Add services to the container. + + builder.Services.AddControllers(); + // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle + builder.Services.AddEndpointsApiExplorer(); + builder.Services.AddSwaggerGen(); + + var app = builder.Build(); + + // Configure the HTTP request pipeline. + if (app.Environment.IsDevelopment()) + { + app.UseSwagger(); + app.UseSwaggerUI(); + } + + app.UseHttpsRedirection(); + + app.UseAuthorization(); + + + app.MapControllers(); + + app.Run(); + } + } +} diff --git a/backend/IM_API/Properties/launchSettings.json b/backend/IM_API/Properties/launchSettings.json new file mode 100644 index 0000000..758bd87 --- /dev/null +++ b/backend/IM_API/Properties/launchSettings.json @@ -0,0 +1,52 @@ +{ + "profiles": { + "http": { + "commandName": "Project", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "dotnetRunMessages": true, + "applicationUrl": "http://localhost:5202" + }, + "https": { + "commandName": "Project", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "dotnetRunMessages": true, + "applicationUrl": "https://localhost:7157;http://localhost:5202" + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Container (Dockerfile)": { + "commandName": "Docker", + "launchBrowser": true, + "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger", + "environmentVariables": { + "ASPNETCORE_HTTPS_PORTS": "8081", + "ASPNETCORE_HTTP_PORTS": "8080" + }, + "publishAllPorts": true, + "useSSL": true + } + }, + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:39786", + "sslPort": 44308 + } + } +} \ No newline at end of file diff --git a/backend/IM_API/WeatherForecast.cs b/backend/IM_API/WeatherForecast.cs new file mode 100644 index 0000000..57624ef --- /dev/null +++ b/backend/IM_API/WeatherForecast.cs @@ -0,0 +1,13 @@ +namespace IM_API +{ + public class WeatherForecast + { + public DateOnly Date { get; set; } + + public int TemperatureC { get; set; } + + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + + public string? Summary { get; set; } + } +} diff --git a/backend/IM_API/appsettings.Development.json b/backend/IM_API/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/backend/IM_API/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/backend/IM_API/appsettings.json b/backend/IM_API/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/backend/IM_API/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/backend/IM_API/obj/Container/ContainerDevelopmentMode.cache b/backend/IM_API/obj/Container/ContainerDevelopmentMode.cache new file mode 100644 index 0000000..e69de29 diff --git a/backend/IM_API/obj/Container/ContainerId.cache b/backend/IM_API/obj/Container/ContainerId.cache new file mode 100644 index 0000000..e69de29 diff --git a/backend/IM_API/obj/Container/ContainerName.cache b/backend/IM_API/obj/Container/ContainerName.cache new file mode 100644 index 0000000..e69de29 diff --git a/backend/IM_API/obj/Container/ContainerRunContext.cache b/backend/IM_API/obj/Container/ContainerRunContext.cache new file mode 100644 index 0000000..e69de29 diff --git a/backend/IM_API/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/backend/IM_API/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs new file mode 100644 index 0000000..2217181 --- /dev/null +++ b/backend/IM_API/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/backend/IM_API/obj/Debug/net8.0/IM_API.AssemblyInfo.cs b/backend/IM_API/obj/Debug/net8.0/IM_API.AssemblyInfo.cs new file mode 100644 index 0000000..1f84fa2 --- /dev/null +++ b/backend/IM_API/obj/Debug/net8.0/IM_API.AssemblyInfo.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: Microsoft.Extensions.Configuration.UserSecrets.UserSecretsIdAttribute("3f396849-59bd-435f-a0cb-351ec0559e70")] +[assembly: System.Reflection.AssemblyCompanyAttribute("IM_API")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+5ac2a859f072f36c9a26b6a0ae100926ce361737")] +[assembly: System.Reflection.AssemblyProductAttribute("IM_API")] +[assembly: System.Reflection.AssemblyTitleAttribute("IM_API")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// 由 MSBuild WriteCodeFragment 类生成。 + diff --git a/backend/IM_API/obj/Debug/net8.0/IM_API.AssemblyInfoInputs.cache b/backend/IM_API/obj/Debug/net8.0/IM_API.AssemblyInfoInputs.cache new file mode 100644 index 0000000..f3a9377 --- /dev/null +++ b/backend/IM_API/obj/Debug/net8.0/IM_API.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +ecdfe90ee262639f8d7c4eb34d36c17cf3984ff8a0ebd0c562bbe56091dd7da2 diff --git a/backend/IM_API/obj/Debug/net8.0/IM_API.GeneratedMSBuildEditorConfig.editorconfig b/backend/IM_API/obj/Debug/net8.0/IM_API.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..9bcdab2 --- /dev/null +++ b/backend/IM_API/obj/Debug/net8.0/IM_API.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,21 @@ +is_global = true +build_property.TargetFramework = net8.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = true +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = IM_API +build_property.RootNamespace = IM_API +build_property.ProjectDir = C:\Users\nanxun\Documents\IM\backend\IM_API\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.RazorLangVersion = 8.0 +build_property.SupportLocalizedComponentNames = +build_property.GenerateRazorMetadataSourceChecksumAttributes = +build_property.MSBuildProjectDirectory = C:\Users\nanxun\Documents\IM\backend\IM_API +build_property._RazorSourceGeneratorDebug = +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/backend/IM_API/obj/Debug/net8.0/IM_API.GlobalUsings.g.cs b/backend/IM_API/obj/Debug/net8.0/IM_API.GlobalUsings.g.cs new file mode 100644 index 0000000..025530a --- /dev/null +++ b/backend/IM_API/obj/Debug/net8.0/IM_API.GlobalUsings.g.cs @@ -0,0 +1,17 @@ +// +global using global::Microsoft.AspNetCore.Builder; +global using global::Microsoft.AspNetCore.Hosting; +global using global::Microsoft.AspNetCore.Http; +global using global::Microsoft.AspNetCore.Routing; +global using global::Microsoft.Extensions.Configuration; +global using global::Microsoft.Extensions.DependencyInjection; +global using global::Microsoft.Extensions.Hosting; +global using global::Microsoft.Extensions.Logging; +global using global::System; +global using global::System.Collections.Generic; +global using global::System.IO; +global using global::System.Linq; +global using global::System.Net.Http; +global using global::System.Net.Http.Json; +global using global::System.Threading; +global using global::System.Threading.Tasks; diff --git a/backend/IM_API/obj/Debug/net8.0/IM_API.assets.cache b/backend/IM_API/obj/Debug/net8.0/IM_API.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..a3bab2f450c8af02a5d90cbc7d5712b3bc5de788 GIT binary patch literal 3834 zcmd59@DJcYvF9 zm}Xj5PcYj7xE=)HJ9LX)CsE!7p(k!wGzIJUUDCn3+sI0^W~~;GgmJ#Gr_V^H zv~*faVKyBE3;~V-jsu1PBY;uB3BVX&955NJDA~xS&4Eq=5eLFmiW+DF`cZYFU3vme zEDxljYgb%SO)N2sio|R>Q_sxLrmu!YBjGPz!e2eTv_V{I>dRi9%3@HBaI6j_o_f{# z9}6(N ztU>jHN_fb(-h)LVHwrvRiWk6$Cx18M$*__rM!Zc$>usd}OTlPhrjyZSqFDjaB(|@B zb2}a{u)=N2Wpc+O`bIXsOsaHm7NIZv-?7Gy7DS=ySj=G3+FGRRU@FYsC1MHMf0qi| zs!=n(;(9cW>!Y`;i`DJJQmtWHgl}3%!?YNoX^{=nB7M^Whc8s}58txTZcd>bkHX`W ze?S<>3PI({mP7kok4sji13BB-x@8;0ic9#c5%6S^ae|(#)5OU$b%&5O~?D@{)=i77}-&Q45EEsn{}OfJeV&QB}R z%P&aHODxEYG1N2DGc<|G$xMpLOD!obNz6-0EJ`ubGl=nptMvz}bu7r#OUcP$WCYs7 z@TPJ0H`_ZLjEsze7^=W3*no=oKq`R%qyvoWfee-gC?_*5GbhzbUtizZN+0ZGeTb9w zAx_qZIawdW$@&l{>jRyvkLqN7499?-ynq1+R3LUw0W#T`ApD?UM?(f+xG@6Z)S4~L z?VFZ<^^bWxDfDB%+GQ=vnY^27zO}d|S3RTcgCgr5z0K zY+9cFXlD71o^x$pykh$gZr-<>@BaKptsnXSA6OAT`C7^^*7fYa7O%SW)Kx-ve?^`B zW$myvD`P({KJq;FjhL6cluxSdbZN%_hv#iR!pH%1lYO}Jl;pAxPK==#9??+<14e6R zex5DF_j(383eKfDC8b5Fwt1%#`Pr#?w#I3u<|f9LCT7Ow zW@!c{MnD^YfRU@rM9)Ca*udD(l7X>^P>LxoPb|(zDoxJLN!3d%E&v92a(+>&9#A+v zJ+&yt448b3V5!Ffm}-KN)H@az_@$OOgVY0sLFy4n=wS@+)=F>^lEbfs5tNod7!+$D zfIU4`5u2WXF2~~`eXxgMX$$Bfef+K?I)QOFTwwa(Ts7s$x9hckG|z?H7jXENTynZl z=}qjd%@e9}|0T>~|9@rntYyXWkAK|rT|Ry8z2$aO=Cr;4(`H*byjuf?AUkQa_UYJUB~+%vLT;kqh6 zTxYep%{vNCU`eU9B_$I|Co?AE_Z1?wfrEpX#Aaq>W@?^dZeng?X<%+@X$*}kl*Cp+ zSz=31%_B9vxu@nKlH629A!w3Q#P5BeE+SK110!{k9nfo}raYL}7Jx#UKCU2dDh#mlpTV@YK3=NUu5`>U{p@9FCO&qE?M>wVr9QY>xCkd3Dq0aEbc!dp_{7 zExpB65EQj|W#OBeC%i%zLyErseIX_D^BFkt-SD0Ho6$6wi!p^@=#!EDQY=hTEG^TL z3=EA;O^po_v8BH<%F56jE#~l REe(y#lZ=y%Oii#PJOBVUM@#?! literal 0 HcmV?d00001 diff --git a/backend/IM_API/obj/Debug/net8.0/rpswa.dswa.cache.json b/backend/IM_API/obj/Debug/net8.0/rpswa.dswa.cache.json new file mode 100644 index 0000000..852d9fb --- /dev/null +++ b/backend/IM_API/obj/Debug/net8.0/rpswa.dswa.cache.json @@ -0,0 +1 @@ +{"GlobalPropertiesHash":"CTgS+cWYTbcaEAEp0gp2B6cHTV0srRdQzYydcF2wY5A=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["o/KWD0aNxlAqF51Di\u002BQMhbth5dV2eE0GsWviN/A7C5M=","1Co80OYN1AHERXdYjGVBC4OME7Ab4Ta6mjxvn8WvY5M="],"CachedAssets":{},"CachedCopyCandidates":{}} \ No newline at end of file diff --git a/backend/IM_API/obj/Debug/net8.0/staticwebassets.removed.txt b/backend/IM_API/obj/Debug/net8.0/staticwebassets.removed.txt new file mode 100644 index 0000000..e69de29 diff --git a/backend/IM_API/obj/IM_API.csproj.nuget.dgspec.json b/backend/IM_API/obj/IM_API.csproj.nuget.dgspec.json new file mode 100644 index 0000000..d59c2a0 --- /dev/null +++ b/backend/IM_API/obj/IM_API.csproj.nuget.dgspec.json @@ -0,0 +1,87 @@ +{ + "format": 1, + "restore": { + "C:\\Users\\nanxun\\Documents\\IM\\backend\\IM_API\\IM_API.csproj": {} + }, + "projects": { + "C:\\Users\\nanxun\\Documents\\IM\\backend\\IM_API\\IM_API.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\nanxun\\Documents\\IM\\backend\\IM_API\\IM_API.csproj", + "projectName": "IM_API", + "projectPath": "C:\\Users\\nanxun\\Documents\\IM\\backend\\IM_API\\IM_API.csproj", + "packagesPath": "C:\\Users\\nanxun\\.nuget\\packages\\", + "outputPath": "C:\\Users\\nanxun\\Documents\\IM\\backend\\IM_API\\obj\\", + "projectStyle": "PackageReference", + "fallbackFolders": [ + "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" + ], + "configFilePaths": [ + "C:\\Users\\nanxun\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" + ], + "originalTargetFrameworks": [ + "net8.0" + ], + "sources": { + "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, + "C:\\Program Files\\dotnet\\library-packs": {}, + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "9.0.300" + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "dependencies": { + "Microsoft.VisualStudio.Azure.Containers.Tools.Targets": { + "target": "Package", + "version": "[1.22.1, )" + }, + "Swashbuckle.AspNetCore": { + "target": "Package", + "version": "[6.6.2, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.AspNetCore.App": { + "privateAssets": "none" + }, + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.304/PortableRuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/backend/IM_API/obj/IM_API.csproj.nuget.g.props b/backend/IM_API/obj/IM_API.csproj.nuget.g.props new file mode 100644 index 0000000..4b0bab5 --- /dev/null +++ b/backend/IM_API/obj/IM_API.csproj.nuget.g.props @@ -0,0 +1,25 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\nanxun\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages + PackageReference + 6.14.1 + + + + + + + + + + + + C:\Users\nanxun\.nuget\packages\microsoft.extensions.apidescription.server\6.0.5 + C:\Users\nanxun\.nuget\packages\microsoft.visualstudio.azure.containers.tools.targets\1.22.1 + + \ No newline at end of file diff --git a/backend/IM_API/obj/IM_API.csproj.nuget.g.targets b/backend/IM_API/obj/IM_API.csproj.nuget.g.targets new file mode 100644 index 0000000..4fea887 --- /dev/null +++ b/backend/IM_API/obj/IM_API.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/backend/IM_API/obj/project.assets.json b/backend/IM_API/obj/project.assets.json new file mode 100644 index 0000000..5c785c4 --- /dev/null +++ b/backend/IM_API/obj/project.assets.json @@ -0,0 +1,620 @@ +{ + "version": 3, + "targets": { + "net8.0": { + "Microsoft.Extensions.ApiDescription.Server/6.0.5": { + "type": "package", + "build": { + "build/Microsoft.Extensions.ApiDescription.Server.props": {}, + "build/Microsoft.Extensions.ApiDescription.Server.targets": {} + }, + "buildMultiTargeting": { + "buildMultiTargeting/Microsoft.Extensions.ApiDescription.Server.props": {}, + "buildMultiTargeting/Microsoft.Extensions.ApiDescription.Server.targets": {} + } + }, + "Microsoft.OpenApi/1.6.14": { + "type": "package", + "compile": { + "lib/netstandard2.0/Microsoft.OpenApi.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netstandard2.0/Microsoft.OpenApi.dll": { + "related": ".pdb;.xml" + } + } + }, + "Microsoft.VisualStudio.Azure.Containers.Tools.Targets/1.22.1": { + "type": "package", + "build": { + "build/Microsoft.VisualStudio.Azure.Containers.Tools.Targets.props": {}, + "build/Microsoft.VisualStudio.Azure.Containers.Tools.Targets.targets": {} + } + }, + "Swashbuckle.AspNetCore/6.6.2": { + "type": "package", + "dependencies": { + "Microsoft.Extensions.ApiDescription.Server": "6.0.5", + "Swashbuckle.AspNetCore.Swagger": "6.6.2", + "Swashbuckle.AspNetCore.SwaggerGen": "6.6.2", + "Swashbuckle.AspNetCore.SwaggerUI": "6.6.2" + }, + "build": { + "build/Swashbuckle.AspNetCore.props": {} + } + }, + "Swashbuckle.AspNetCore.Swagger/6.6.2": { + "type": "package", + "dependencies": { + "Microsoft.OpenApi": "1.6.14" + }, + "compile": { + "lib/net8.0/Swashbuckle.AspNetCore.Swagger.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/net8.0/Swashbuckle.AspNetCore.Swagger.dll": { + "related": ".pdb;.xml" + } + }, + "frameworkReferences": [ + "Microsoft.AspNetCore.App" + ] + }, + "Swashbuckle.AspNetCore.SwaggerGen/6.6.2": { + "type": "package", + "dependencies": { + "Swashbuckle.AspNetCore.Swagger": "6.6.2" + }, + "compile": { + "lib/net8.0/Swashbuckle.AspNetCore.SwaggerGen.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/net8.0/Swashbuckle.AspNetCore.SwaggerGen.dll": { + "related": ".pdb;.xml" + } + } + }, + "Swashbuckle.AspNetCore.SwaggerUI/6.6.2": { + "type": "package", + "compile": { + "lib/net8.0/Swashbuckle.AspNetCore.SwaggerUI.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/net8.0/Swashbuckle.AspNetCore.SwaggerUI.dll": { + "related": ".pdb;.xml" + } + }, + "frameworkReferences": [ + "Microsoft.AspNetCore.App" + ] + } + } + }, + "libraries": { + "Microsoft.Extensions.ApiDescription.Server/6.0.5": { + "sha512": "Ckb5EDBUNJdFWyajfXzUIMRkhf52fHZOQuuZg/oiu8y7zDCVwD0iHhew6MnThjHmevanpxL3f5ci2TtHQEN6bw==", + "type": "package", + "path": "microsoft.extensions.apidescription.server/6.0.5", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "build/Microsoft.Extensions.ApiDescription.Server.props", + "build/Microsoft.Extensions.ApiDescription.Server.targets", + "buildMultiTargeting/Microsoft.Extensions.ApiDescription.Server.props", + "buildMultiTargeting/Microsoft.Extensions.ApiDescription.Server.targets", + "microsoft.extensions.apidescription.server.6.0.5.nupkg.sha512", + "microsoft.extensions.apidescription.server.nuspec", + "tools/Newtonsoft.Json.dll", + "tools/dotnet-getdocument.deps.json", + "tools/dotnet-getdocument.dll", + "tools/dotnet-getdocument.runtimeconfig.json", + "tools/net461-x86/GetDocument.Insider.exe", + "tools/net461-x86/GetDocument.Insider.exe.config", + "tools/net461-x86/Microsoft.Win32.Primitives.dll", + "tools/net461-x86/System.AppContext.dll", + "tools/net461-x86/System.Buffers.dll", + "tools/net461-x86/System.Collections.Concurrent.dll", + "tools/net461-x86/System.Collections.NonGeneric.dll", + "tools/net461-x86/System.Collections.Specialized.dll", + "tools/net461-x86/System.Collections.dll", + "tools/net461-x86/System.ComponentModel.EventBasedAsync.dll", + "tools/net461-x86/System.ComponentModel.Primitives.dll", + "tools/net461-x86/System.ComponentModel.TypeConverter.dll", + "tools/net461-x86/System.ComponentModel.dll", + "tools/net461-x86/System.Console.dll", + "tools/net461-x86/System.Data.Common.dll", + "tools/net461-x86/System.Diagnostics.Contracts.dll", + "tools/net461-x86/System.Diagnostics.Debug.dll", + "tools/net461-x86/System.Diagnostics.DiagnosticSource.dll", + "tools/net461-x86/System.Diagnostics.FileVersionInfo.dll", + "tools/net461-x86/System.Diagnostics.Process.dll", + "tools/net461-x86/System.Diagnostics.StackTrace.dll", + "tools/net461-x86/System.Diagnostics.TextWriterTraceListener.dll", + "tools/net461-x86/System.Diagnostics.Tools.dll", + "tools/net461-x86/System.Diagnostics.TraceSource.dll", + "tools/net461-x86/System.Diagnostics.Tracing.dll", + "tools/net461-x86/System.Drawing.Primitives.dll", + "tools/net461-x86/System.Dynamic.Runtime.dll", + "tools/net461-x86/System.Globalization.Calendars.dll", + "tools/net461-x86/System.Globalization.Extensions.dll", + "tools/net461-x86/System.Globalization.dll", + "tools/net461-x86/System.IO.Compression.ZipFile.dll", + "tools/net461-x86/System.IO.Compression.dll", + "tools/net461-x86/System.IO.FileSystem.DriveInfo.dll", + "tools/net461-x86/System.IO.FileSystem.Primitives.dll", + "tools/net461-x86/System.IO.FileSystem.Watcher.dll", + "tools/net461-x86/System.IO.FileSystem.dll", + "tools/net461-x86/System.IO.IsolatedStorage.dll", + "tools/net461-x86/System.IO.MemoryMappedFiles.dll", + "tools/net461-x86/System.IO.Pipes.dll", + "tools/net461-x86/System.IO.UnmanagedMemoryStream.dll", + "tools/net461-x86/System.IO.dll", + "tools/net461-x86/System.Linq.Expressions.dll", + "tools/net461-x86/System.Linq.Parallel.dll", + "tools/net461-x86/System.Linq.Queryable.dll", + "tools/net461-x86/System.Linq.dll", + "tools/net461-x86/System.Memory.dll", + "tools/net461-x86/System.Net.Http.dll", + "tools/net461-x86/System.Net.NameResolution.dll", + "tools/net461-x86/System.Net.NetworkInformation.dll", + "tools/net461-x86/System.Net.Ping.dll", + "tools/net461-x86/System.Net.Primitives.dll", + "tools/net461-x86/System.Net.Requests.dll", + "tools/net461-x86/System.Net.Security.dll", + "tools/net461-x86/System.Net.Sockets.dll", + "tools/net461-x86/System.Net.WebHeaderCollection.dll", + "tools/net461-x86/System.Net.WebSockets.Client.dll", + "tools/net461-x86/System.Net.WebSockets.dll", + "tools/net461-x86/System.Numerics.Vectors.dll", + "tools/net461-x86/System.ObjectModel.dll", + "tools/net461-x86/System.Reflection.Extensions.dll", + "tools/net461-x86/System.Reflection.Primitives.dll", + "tools/net461-x86/System.Reflection.dll", + "tools/net461-x86/System.Resources.Reader.dll", + "tools/net461-x86/System.Resources.ResourceManager.dll", + "tools/net461-x86/System.Resources.Writer.dll", + "tools/net461-x86/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net461-x86/System.Runtime.CompilerServices.VisualC.dll", + "tools/net461-x86/System.Runtime.Extensions.dll", + "tools/net461-x86/System.Runtime.Handles.dll", + "tools/net461-x86/System.Runtime.InteropServices.RuntimeInformation.dll", + "tools/net461-x86/System.Runtime.InteropServices.dll", + "tools/net461-x86/System.Runtime.Numerics.dll", + "tools/net461-x86/System.Runtime.Serialization.Formatters.dll", + "tools/net461-x86/System.Runtime.Serialization.Json.dll", + "tools/net461-x86/System.Runtime.Serialization.Primitives.dll", + "tools/net461-x86/System.Runtime.Serialization.Xml.dll", + "tools/net461-x86/System.Runtime.dll", + "tools/net461-x86/System.Security.Claims.dll", + "tools/net461-x86/System.Security.Cryptography.Algorithms.dll", + "tools/net461-x86/System.Security.Cryptography.Csp.dll", + "tools/net461-x86/System.Security.Cryptography.Encoding.dll", + "tools/net461-x86/System.Security.Cryptography.Primitives.dll", + "tools/net461-x86/System.Security.Cryptography.X509Certificates.dll", + "tools/net461-x86/System.Security.Principal.dll", + "tools/net461-x86/System.Security.SecureString.dll", + "tools/net461-x86/System.Text.Encoding.Extensions.dll", + "tools/net461-x86/System.Text.Encoding.dll", + "tools/net461-x86/System.Text.RegularExpressions.dll", + "tools/net461-x86/System.Threading.Overlapped.dll", + "tools/net461-x86/System.Threading.Tasks.Parallel.dll", + "tools/net461-x86/System.Threading.Tasks.dll", + "tools/net461-x86/System.Threading.Thread.dll", + "tools/net461-x86/System.Threading.ThreadPool.dll", + "tools/net461-x86/System.Threading.Timer.dll", + "tools/net461-x86/System.Threading.dll", + "tools/net461-x86/System.ValueTuple.dll", + "tools/net461-x86/System.Xml.ReaderWriter.dll", + "tools/net461-x86/System.Xml.XDocument.dll", + "tools/net461-x86/System.Xml.XPath.XDocument.dll", + "tools/net461-x86/System.Xml.XPath.dll", + "tools/net461-x86/System.Xml.XmlDocument.dll", + "tools/net461-x86/System.Xml.XmlSerializer.dll", + "tools/net461-x86/netstandard.dll", + "tools/net461/GetDocument.Insider.exe", + "tools/net461/GetDocument.Insider.exe.config", + "tools/net461/Microsoft.Win32.Primitives.dll", + "tools/net461/System.AppContext.dll", + "tools/net461/System.Buffers.dll", + "tools/net461/System.Collections.Concurrent.dll", + "tools/net461/System.Collections.NonGeneric.dll", + "tools/net461/System.Collections.Specialized.dll", + "tools/net461/System.Collections.dll", + "tools/net461/System.ComponentModel.EventBasedAsync.dll", + "tools/net461/System.ComponentModel.Primitives.dll", + "tools/net461/System.ComponentModel.TypeConverter.dll", + "tools/net461/System.ComponentModel.dll", + "tools/net461/System.Console.dll", + "tools/net461/System.Data.Common.dll", + "tools/net461/System.Diagnostics.Contracts.dll", + "tools/net461/System.Diagnostics.Debug.dll", + "tools/net461/System.Diagnostics.DiagnosticSource.dll", + "tools/net461/System.Diagnostics.FileVersionInfo.dll", + "tools/net461/System.Diagnostics.Process.dll", + "tools/net461/System.Diagnostics.StackTrace.dll", + "tools/net461/System.Diagnostics.TextWriterTraceListener.dll", + "tools/net461/System.Diagnostics.Tools.dll", + "tools/net461/System.Diagnostics.TraceSource.dll", + "tools/net461/System.Diagnostics.Tracing.dll", + "tools/net461/System.Drawing.Primitives.dll", + "tools/net461/System.Dynamic.Runtime.dll", + "tools/net461/System.Globalization.Calendars.dll", + "tools/net461/System.Globalization.Extensions.dll", + "tools/net461/System.Globalization.dll", + "tools/net461/System.IO.Compression.ZipFile.dll", + "tools/net461/System.IO.Compression.dll", + "tools/net461/System.IO.FileSystem.DriveInfo.dll", + "tools/net461/System.IO.FileSystem.Primitives.dll", + "tools/net461/System.IO.FileSystem.Watcher.dll", + "tools/net461/System.IO.FileSystem.dll", + "tools/net461/System.IO.IsolatedStorage.dll", + "tools/net461/System.IO.MemoryMappedFiles.dll", + "tools/net461/System.IO.Pipes.dll", + "tools/net461/System.IO.UnmanagedMemoryStream.dll", + "tools/net461/System.IO.dll", + "tools/net461/System.Linq.Expressions.dll", + "tools/net461/System.Linq.Parallel.dll", + "tools/net461/System.Linq.Queryable.dll", + "tools/net461/System.Linq.dll", + "tools/net461/System.Memory.dll", + "tools/net461/System.Net.Http.dll", + "tools/net461/System.Net.NameResolution.dll", + "tools/net461/System.Net.NetworkInformation.dll", + "tools/net461/System.Net.Ping.dll", + "tools/net461/System.Net.Primitives.dll", + "tools/net461/System.Net.Requests.dll", + "tools/net461/System.Net.Security.dll", + "tools/net461/System.Net.Sockets.dll", + "tools/net461/System.Net.WebHeaderCollection.dll", + "tools/net461/System.Net.WebSockets.Client.dll", + "tools/net461/System.Net.WebSockets.dll", + "tools/net461/System.Numerics.Vectors.dll", + "tools/net461/System.ObjectModel.dll", + "tools/net461/System.Reflection.Extensions.dll", + "tools/net461/System.Reflection.Primitives.dll", + "tools/net461/System.Reflection.dll", + "tools/net461/System.Resources.Reader.dll", + "tools/net461/System.Resources.ResourceManager.dll", + "tools/net461/System.Resources.Writer.dll", + "tools/net461/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net461/System.Runtime.CompilerServices.VisualC.dll", + "tools/net461/System.Runtime.Extensions.dll", + "tools/net461/System.Runtime.Handles.dll", + "tools/net461/System.Runtime.InteropServices.RuntimeInformation.dll", + "tools/net461/System.Runtime.InteropServices.dll", + "tools/net461/System.Runtime.Numerics.dll", + "tools/net461/System.Runtime.Serialization.Formatters.dll", + "tools/net461/System.Runtime.Serialization.Json.dll", + "tools/net461/System.Runtime.Serialization.Primitives.dll", + "tools/net461/System.Runtime.Serialization.Xml.dll", + "tools/net461/System.Runtime.dll", + "tools/net461/System.Security.Claims.dll", + "tools/net461/System.Security.Cryptography.Algorithms.dll", + "tools/net461/System.Security.Cryptography.Csp.dll", + "tools/net461/System.Security.Cryptography.Encoding.dll", + "tools/net461/System.Security.Cryptography.Primitives.dll", + "tools/net461/System.Security.Cryptography.X509Certificates.dll", + "tools/net461/System.Security.Principal.dll", + "tools/net461/System.Security.SecureString.dll", + "tools/net461/System.Text.Encoding.Extensions.dll", + "tools/net461/System.Text.Encoding.dll", + "tools/net461/System.Text.RegularExpressions.dll", + "tools/net461/System.Threading.Overlapped.dll", + "tools/net461/System.Threading.Tasks.Parallel.dll", + "tools/net461/System.Threading.Tasks.dll", + "tools/net461/System.Threading.Thread.dll", + "tools/net461/System.Threading.ThreadPool.dll", + "tools/net461/System.Threading.Timer.dll", + "tools/net461/System.Threading.dll", + "tools/net461/System.ValueTuple.dll", + "tools/net461/System.Xml.ReaderWriter.dll", + "tools/net461/System.Xml.XDocument.dll", + "tools/net461/System.Xml.XPath.XDocument.dll", + "tools/net461/System.Xml.XPath.dll", + "tools/net461/System.Xml.XmlDocument.dll", + "tools/net461/System.Xml.XmlSerializer.dll", + "tools/net461/netstandard.dll", + "tools/netcoreapp2.1/GetDocument.Insider.deps.json", + "tools/netcoreapp2.1/GetDocument.Insider.dll", + "tools/netcoreapp2.1/GetDocument.Insider.runtimeconfig.json", + "tools/netcoreapp2.1/System.Diagnostics.DiagnosticSource.dll" + ] + }, + "Microsoft.OpenApi/1.6.14": { + "sha512": "tTaBT8qjk3xINfESyOPE2rIellPvB7qpVqiWiyA/lACVvz+xOGiXhFUfohcx82NLbi5avzLW0lx+s6oAqQijfw==", + "type": "package", + "path": "microsoft.openapi/1.6.14", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "lib/netstandard2.0/Microsoft.OpenApi.dll", + "lib/netstandard2.0/Microsoft.OpenApi.pdb", + "lib/netstandard2.0/Microsoft.OpenApi.xml", + "microsoft.openapi.1.6.14.nupkg.sha512", + "microsoft.openapi.nuspec" + ] + }, + "Microsoft.VisualStudio.Azure.Containers.Tools.Targets/1.22.1": { + "sha512": "EfYANhAWqmWKoLwN6bxoiPZSOfJSO9lzX+UrU6GVhLhPub1Hd+5f0zL0/tggIA6mRz6Ebw2xCNcIsM4k+7NPng==", + "type": "package", + "path": "microsoft.visualstudio.azure.containers.tools.targets/1.22.1", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "CHANGELOG.md", + "EULA.md", + "ThirdPartyNotices.txt", + "build/Container.props", + "build/Container.targets", + "build/Microsoft.VisualStudio.Azure.Containers.Tools.Targets.props", + "build/Microsoft.VisualStudio.Azure.Containers.Tools.Targets.targets", + "build/Rules/GeneralBrowseObject.xaml", + "build/Rules/cs-CZ/GeneralBrowseObject.xaml", + "build/Rules/de-DE/GeneralBrowseObject.xaml", + "build/Rules/es-ES/GeneralBrowseObject.xaml", + "build/Rules/fr-FR/GeneralBrowseObject.xaml", + "build/Rules/it-IT/GeneralBrowseObject.xaml", + "build/Rules/ja-JP/GeneralBrowseObject.xaml", + "build/Rules/ko-KR/GeneralBrowseObject.xaml", + "build/Rules/pl-PL/GeneralBrowseObject.xaml", + "build/Rules/pt-BR/GeneralBrowseObject.xaml", + "build/Rules/ru-RU/GeneralBrowseObject.xaml", + "build/Rules/tr-TR/GeneralBrowseObject.xaml", + "build/Rules/zh-CN/GeneralBrowseObject.xaml", + "build/Rules/zh-TW/GeneralBrowseObject.xaml", + "build/ToolsTarget.props", + "build/ToolsTarget.targets", + "icon.png", + "microsoft.visualstudio.azure.containers.tools.targets.1.22.1.nupkg.sha512", + "microsoft.visualstudio.azure.containers.tools.targets.nuspec", + "tools/Microsoft.VisualStudio.Containers.Tools.Common.dll", + "tools/Microsoft.VisualStudio.Containers.Tools.Shared.dll", + "tools/Microsoft.VisualStudio.Containers.Tools.Tasks.dll", + "tools/Newtonsoft.Json.dll", + "tools/System.Security.Principal.Windows.dll", + "tools/cs/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll", + "tools/cs/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll", + "tools/cs/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll", + "tools/de/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll", + "tools/de/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll", + "tools/de/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll", + "tools/es/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll", + "tools/es/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll", + "tools/es/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll", + "tools/fr/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll", + "tools/fr/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll", + "tools/fr/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll", + "tools/it/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll", + "tools/it/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll", + "tools/it/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll", + "tools/ja/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll", + "tools/ja/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll", + "tools/ja/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll", + "tools/ko/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll", + "tools/ko/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll", + "tools/ko/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll", + "tools/pl/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll", + "tools/pl/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll", + "tools/pl/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll", + "tools/pt-BR/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll", + "tools/pt-BR/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll", + "tools/pt-BR/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll", + "tools/ru/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll", + "tools/ru/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll", + "tools/ru/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll", + "tools/tr/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll", + "tools/tr/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll", + "tools/tr/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll", + "tools/zh-Hans/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll", + "tools/zh-Hans/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll", + "tools/zh-Hans/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll", + "tools/zh-Hant/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll", + "tools/zh-Hant/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll", + "tools/zh-Hant/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll" + ] + }, + "Swashbuckle.AspNetCore/6.6.2": { + "sha512": "+NB4UYVYN6AhDSjW0IJAd1AGD8V33gemFNLPaxKTtPkHB+HaKAKf9MGAEUPivEWvqeQfcKIw8lJaHq6LHljRuw==", + "type": "package", + "path": "swashbuckle.aspnetcore/6.6.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/Swashbuckle.AspNetCore.props", + "swashbuckle.aspnetcore.6.6.2.nupkg.sha512", + "swashbuckle.aspnetcore.nuspec" + ] + }, + "Swashbuckle.AspNetCore.Swagger/6.6.2": { + "sha512": "ovgPTSYX83UrQUWiS5vzDcJ8TEX1MAxBgDFMK45rC24MorHEPQlZAHlaXj/yth4Zf6xcktpUgTEBvffRQVwDKA==", + "type": "package", + "path": "swashbuckle.aspnetcore.swagger/6.6.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net5.0/Swashbuckle.AspNetCore.Swagger.dll", + "lib/net5.0/Swashbuckle.AspNetCore.Swagger.pdb", + "lib/net5.0/Swashbuckle.AspNetCore.Swagger.xml", + "lib/net6.0/Swashbuckle.AspNetCore.Swagger.dll", + "lib/net6.0/Swashbuckle.AspNetCore.Swagger.pdb", + "lib/net6.0/Swashbuckle.AspNetCore.Swagger.xml", + "lib/net7.0/Swashbuckle.AspNetCore.Swagger.dll", + "lib/net7.0/Swashbuckle.AspNetCore.Swagger.pdb", + "lib/net7.0/Swashbuckle.AspNetCore.Swagger.xml", + "lib/net8.0/Swashbuckle.AspNetCore.Swagger.dll", + "lib/net8.0/Swashbuckle.AspNetCore.Swagger.pdb", + "lib/net8.0/Swashbuckle.AspNetCore.Swagger.xml", + "lib/netcoreapp3.0/Swashbuckle.AspNetCore.Swagger.dll", + "lib/netcoreapp3.0/Swashbuckle.AspNetCore.Swagger.pdb", + "lib/netcoreapp3.0/Swashbuckle.AspNetCore.Swagger.xml", + "lib/netstandard2.0/Swashbuckle.AspNetCore.Swagger.dll", + "lib/netstandard2.0/Swashbuckle.AspNetCore.Swagger.pdb", + "lib/netstandard2.0/Swashbuckle.AspNetCore.Swagger.xml", + "package-readme.md", + "swashbuckle.aspnetcore.swagger.6.6.2.nupkg.sha512", + "swashbuckle.aspnetcore.swagger.nuspec" + ] + }, + "Swashbuckle.AspNetCore.SwaggerGen/6.6.2": { + "sha512": "zv4ikn4AT1VYuOsDCpktLq4QDq08e7Utzbir86M5/ZkRaLXbCPF11E1/vTmOiDzRTl0zTZINQU2qLKwTcHgfrA==", + "type": "package", + "path": "swashbuckle.aspnetcore.swaggergen/6.6.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net5.0/Swashbuckle.AspNetCore.SwaggerGen.dll", + "lib/net5.0/Swashbuckle.AspNetCore.SwaggerGen.pdb", + "lib/net5.0/Swashbuckle.AspNetCore.SwaggerGen.xml", + "lib/net6.0/Swashbuckle.AspNetCore.SwaggerGen.dll", + "lib/net6.0/Swashbuckle.AspNetCore.SwaggerGen.pdb", + "lib/net6.0/Swashbuckle.AspNetCore.SwaggerGen.xml", + "lib/net7.0/Swashbuckle.AspNetCore.SwaggerGen.dll", + "lib/net7.0/Swashbuckle.AspNetCore.SwaggerGen.pdb", + "lib/net7.0/Swashbuckle.AspNetCore.SwaggerGen.xml", + "lib/net8.0/Swashbuckle.AspNetCore.SwaggerGen.dll", + "lib/net8.0/Swashbuckle.AspNetCore.SwaggerGen.pdb", + "lib/net8.0/Swashbuckle.AspNetCore.SwaggerGen.xml", + "lib/netcoreapp3.0/Swashbuckle.AspNetCore.SwaggerGen.dll", + "lib/netcoreapp3.0/Swashbuckle.AspNetCore.SwaggerGen.pdb", + "lib/netcoreapp3.0/Swashbuckle.AspNetCore.SwaggerGen.xml", + "lib/netstandard2.0/Swashbuckle.AspNetCore.SwaggerGen.dll", + "lib/netstandard2.0/Swashbuckle.AspNetCore.SwaggerGen.pdb", + "lib/netstandard2.0/Swashbuckle.AspNetCore.SwaggerGen.xml", + "package-readme.md", + "swashbuckle.aspnetcore.swaggergen.6.6.2.nupkg.sha512", + "swashbuckle.aspnetcore.swaggergen.nuspec" + ] + }, + "Swashbuckle.AspNetCore.SwaggerUI/6.6.2": { + "sha512": "mBBb+/8Hm2Q3Wygag+hu2jj69tZW5psuv0vMRXY07Wy+Rrj40vRP8ZTbKBhs91r45/HXT4aY4z0iSBYx1h6JvA==", + "type": "package", + "path": "swashbuckle.aspnetcore.swaggerui/6.6.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net5.0/Swashbuckle.AspNetCore.SwaggerUI.dll", + "lib/net5.0/Swashbuckle.AspNetCore.SwaggerUI.pdb", + "lib/net5.0/Swashbuckle.AspNetCore.SwaggerUI.xml", + "lib/net6.0/Swashbuckle.AspNetCore.SwaggerUI.dll", + "lib/net6.0/Swashbuckle.AspNetCore.SwaggerUI.pdb", + "lib/net6.0/Swashbuckle.AspNetCore.SwaggerUI.xml", + "lib/net7.0/Swashbuckle.AspNetCore.SwaggerUI.dll", + "lib/net7.0/Swashbuckle.AspNetCore.SwaggerUI.pdb", + "lib/net7.0/Swashbuckle.AspNetCore.SwaggerUI.xml", + "lib/net8.0/Swashbuckle.AspNetCore.SwaggerUI.dll", + "lib/net8.0/Swashbuckle.AspNetCore.SwaggerUI.pdb", + "lib/net8.0/Swashbuckle.AspNetCore.SwaggerUI.xml", + "lib/netcoreapp3.0/Swashbuckle.AspNetCore.SwaggerUI.dll", + "lib/netcoreapp3.0/Swashbuckle.AspNetCore.SwaggerUI.pdb", + "lib/netcoreapp3.0/Swashbuckle.AspNetCore.SwaggerUI.xml", + "lib/netstandard2.0/Swashbuckle.AspNetCore.SwaggerUI.dll", + "lib/netstandard2.0/Swashbuckle.AspNetCore.SwaggerUI.pdb", + "lib/netstandard2.0/Swashbuckle.AspNetCore.SwaggerUI.xml", + "package-readme.md", + "swashbuckle.aspnetcore.swaggerui.6.6.2.nupkg.sha512", + "swashbuckle.aspnetcore.swaggerui.nuspec" + ] + } + }, + "projectFileDependencyGroups": { + "net8.0": [ + "Microsoft.VisualStudio.Azure.Containers.Tools.Targets >= 1.22.1", + "Swashbuckle.AspNetCore >= 6.6.2" + ] + }, + "packageFolders": { + "C:\\Users\\nanxun\\.nuget\\packages\\": {}, + "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\nanxun\\Documents\\IM\\backend\\IM_API\\IM_API.csproj", + "projectName": "IM_API", + "projectPath": "C:\\Users\\nanxun\\Documents\\IM\\backend\\IM_API\\IM_API.csproj", + "packagesPath": "C:\\Users\\nanxun\\.nuget\\packages\\", + "outputPath": "C:\\Users\\nanxun\\Documents\\IM\\backend\\IM_API\\obj\\", + "projectStyle": "PackageReference", + "fallbackFolders": [ + "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" + ], + "configFilePaths": [ + "C:\\Users\\nanxun\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" + ], + "originalTargetFrameworks": [ + "net8.0" + ], + "sources": { + "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, + "C:\\Program Files\\dotnet\\library-packs": {}, + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "9.0.300" + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "dependencies": { + "Microsoft.VisualStudio.Azure.Containers.Tools.Targets": { + "target": "Package", + "version": "[1.22.1, )" + }, + "Swashbuckle.AspNetCore": { + "target": "Package", + "version": "[6.6.2, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.AspNetCore.App": { + "privateAssets": "none" + }, + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.304/PortableRuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/backend/IM_API/obj/project.nuget.cache b/backend/IM_API/obj/project.nuget.cache new file mode 100644 index 0000000..4d472fe --- /dev/null +++ b/backend/IM_API/obj/project.nuget.cache @@ -0,0 +1,16 @@ +{ + "version": 2, + "dgSpecHash": "sPkaomFyhxE=", + "success": true, + "projectFilePath": "C:\\Users\\nanxun\\Documents\\IM\\backend\\IM_API\\IM_API.csproj", + "expectedPackageFiles": [ + "C:\\Users\\nanxun\\.nuget\\packages\\microsoft.extensions.apidescription.server\\6.0.5\\microsoft.extensions.apidescription.server.6.0.5.nupkg.sha512", + "C:\\Users\\nanxun\\.nuget\\packages\\microsoft.openapi\\1.6.14\\microsoft.openapi.1.6.14.nupkg.sha512", + "C:\\Users\\nanxun\\.nuget\\packages\\microsoft.visualstudio.azure.containers.tools.targets\\1.22.1\\microsoft.visualstudio.azure.containers.tools.targets.1.22.1.nupkg.sha512", + "C:\\Users\\nanxun\\.nuget\\packages\\swashbuckle.aspnetcore\\6.6.2\\swashbuckle.aspnetcore.6.6.2.nupkg.sha512", + "C:\\Users\\nanxun\\.nuget\\packages\\swashbuckle.aspnetcore.swagger\\6.6.2\\swashbuckle.aspnetcore.swagger.6.6.2.nupkg.sha512", + "C:\\Users\\nanxun\\.nuget\\packages\\swashbuckle.aspnetcore.swaggergen\\6.6.2\\swashbuckle.aspnetcore.swaggergen.6.6.2.nupkg.sha512", + "C:\\Users\\nanxun\\.nuget\\packages\\swashbuckle.aspnetcore.swaggerui\\6.6.2\\swashbuckle.aspnetcore.swaggerui.6.6.2.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/ER图.drawio b/docs/ER图.drawio similarity index 100% rename from ER图.drawio rename to docs/ER图.drawio diff --git a/IM 系统消息存储与推送策略文档.md b/docs/IM 系统消息存储与推送策略文档.md similarity index 96% rename from IM 系统消息存储与推送策略文档.md rename to docs/IM 系统消息存储与推送策略文档.md index b76cd49..e50bc50 100644 --- a/IM 系统消息存储与推送策略文档.md +++ b/docs/IM 系统消息存储与推送策略文档.md @@ -1,141 +1,141 @@ -# IM 系统消息存储与推送策略文档 - -## 1. 概述 - -本策略文档定义了 **消息在系统中的存储、读取和推送流程**,目标是: - -- 保证 **消息实时性** -- 支持 **离线消息存储与同步** -- 支持 **多端登录同步** -- 支持 **单聊、群聊及系统消息** - ------- - -## 2. 消息存储策略 - -### 2.1 消息表设计 - -表结构参考前期设计: - -| 表名 | 作用 | -| ------------ | ------------------------------------------------------------ | -| Messages | 存储所有聊天消息(单聊/群聊) | -| Conversation | 缓存用户最近会话信息(last_message_id, target_id, unread_count) | -| Files | 附件 / 图片 / 语音存储URL | - ------- - -### 2.2 消息存储规则 - -1. **单聊消息** - - 写入 `Messages` 表 - - 更新发送者和接收者 `Conversation` 表 - - 更新 `UnreadCount` -2. **群聊消息** - - 写入 `Messages` 表 - - 更新群成员对应的 `Conversation` 表(except 发送者) - - 更新每个成员的 `UnreadCount` -3. **文件消息** - - 文件存储到对象存储(OSS/S3/MinIO) - - `Messages.Content` 存文件 URL + metadata -4. **消息撤回** - - 消息允许撤回时,修改 `message.status = 1 - - 更新 `Conversation.LastMessageId`(如撤回的是最后一条消息) - ------- - -## 3. 消息推送策略 - -### 3.1 推送原则 - -- **实时性**:在线用户立即通过 WebSocket 推送 -- **可靠性**:离线用户存储消息,登录时同步 -- **顺序保证**:消息按 `timestamp` 或 `messageId` 顺序发送 -- **幂等性**:客户端可根据 `messageId` 去重 - ------- - -### 3.2 单聊推送流程 - -1. 发送者通过 WebSocket 或 HTTP API 发送消息 -2. 服务端写入 `Messages` 表 -3. 查询接收者是否在线 - - **在线**:通过 WebSocket 推送 - - **离线**:存储到 Redis 或 `Conversation.UnreadCount` -4. 接收者收到消息后发送 `MESSAGE_ACK` -5. //暂不要求:更新消息状态(已送达 / 已读) - ------- - -### 3.3 群聊推送流程 - -1. 发送者发送群消息 -2. 服务端写入 `Message`s 表 -3. 查询群成员列表(`GroupMember` 表) -4. 遍历成员: - - **在线成员**:WebSocket 推送 - - **离线成员**:增加 `UnreadCount`,保存在 Redis/数据库 -5. //暂不要求:接收者回 ACK 后更新 `message_receipt`(已读) - ------- - -### 3.4 离线消息处理 - -- 离线消息存储位置: - 1. 数据库 `Messages` 表(长期保存) - 2. Redis 缓存(短期加速推送) -- 客户端上线时: - 1. 请求 `/syncMessages` 接口 - 2. 返回未读消息 + 未读计数 -- 消息同步完成后清除缓存或更新状态 - ------- - -### 3.5 多端同步策略 - -- 每个设备维护独立的 `deviceId` -- WebSocket 推送时: - - 排除发送设备 - - 推送给同账号其他设备 -- //暂不要求:消息回执: - - 每端发送 ACK - - 服务端更新 `Voncers` 和 `message_receipt` - ------- - -## 4. 消息可靠性保障 - -| 场景 | 解决方案 | -| ------------------ | ---------------------------------- | -| 消息丢失 | 发送端生成 `requestId`,服务端去重 | -| 消息顺序错乱 | 按 `messageId` 或 `timestamp` 排序 | -| WebSocket 异常断开 | 客户端重连后同步离线消息 | -| 群聊大消息量 | 异步推送 + 批量 ACK | - ------- - -## 5. //暂不要求:高性能优化策略 - -1. **消息表索引**:`(chat_type, to_id, created_at)` -2. **会话表缓存**:`conversation` 表避免全表查询 -3. **Redis 缓存**:用户在线状态、未读消息数 -4. **分表/分库**:按月或按用户分表 -5. **异步推送队列**:消息通过 MQ(Kafka/RabbitMQ)推送,保证高并发 - ------- - -## 6. 消息撤回与删除策略 - -1. **撤回条件**:超时限制( 2 分钟内可撤回) -2. **撤回操作**: - - 更新 `message.status = 1` - - 更新 `Conversation.LastMessageId` - - 推送撤回事件到在线用户 - ------- - -## 7. 系统消息与通知策略 - -- 系统消息(好友申请、群邀请、公告)走 **同样的消息推送流程** -- 保留在 `Notification` 表 +# IM 系统消息存储与推送策略文档 + +## 1. 概述 + +本策略文档定义了 **消息在系统中的存储、读取和推送流程**,目标是: + +- 保证 **消息实时性** +- 支持 **离线消息存储与同步** +- 支持 **多端登录同步** +- 支持 **单聊、群聊及系统消息** + +------ + +## 2. 消息存储策略 + +### 2.1 消息表设计 + +表结构参考前期设计: + +| 表名 | 作用 | +| ------------ | ------------------------------------------------------------ | +| Messages | 存储所有聊天消息(单聊/群聊) | +| Conversation | 缓存用户最近会话信息(last_message_id, target_id, unread_count) | +| Files | 附件 / 图片 / 语音存储URL | + +------ + +### 2.2 消息存储规则 + +1. **单聊消息** + - 写入 `Messages` 表 + - 更新发送者和接收者 `Conversation` 表 + - 更新 `UnreadCount` +2. **群聊消息** + - 写入 `Messages` 表 + - 更新群成员对应的 `Conversation` 表(except 发送者) + - 更新每个成员的 `UnreadCount` +3. **文件消息** + - 文件存储到对象存储(OSS/S3/MinIO) + - `Messages.Content` 存文件 URL + metadata +4. **消息撤回** + - 消息允许撤回时,修改 `message.status = 1 + - 更新 `Conversation.LastMessageId`(如撤回的是最后一条消息) + +------ + +## 3. 消息推送策略 + +### 3.1 推送原则 + +- **实时性**:在线用户立即通过 WebSocket 推送 +- **可靠性**:离线用户存储消息,登录时同步 +- **顺序保证**:消息按 `timestamp` 或 `messageId` 顺序发送 +- **幂等性**:客户端可根据 `messageId` 去重 + +------ + +### 3.2 单聊推送流程 + +1. 发送者通过 WebSocket 或 HTTP API 发送消息 +2. 服务端写入 `Messages` 表 +3. 查询接收者是否在线 + - **在线**:通过 WebSocket 推送 + - **离线**:存储到 Redis 或 `Conversation.UnreadCount` +4. 接收者收到消息后发送 `MESSAGE_ACK` +5. //暂不要求:更新消息状态(已送达 / 已读) + +------ + +### 3.3 群聊推送流程 + +1. 发送者发送群消息 +2. 服务端写入 `Message`s 表 +3. 查询群成员列表(`GroupMember` 表) +4. 遍历成员: + - **在线成员**:WebSocket 推送 + - **离线成员**:增加 `UnreadCount`,保存在 Redis/数据库 +5. //暂不要求:接收者回 ACK 后更新 `message_receipt`(已读) + +------ + +### 3.4 离线消息处理 + +- 离线消息存储位置: + 1. 数据库 `Messages` 表(长期保存) + 2. Redis 缓存(短期加速推送) +- 客户端上线时: + 1. 请求 `/syncMessages` 接口 + 2. 返回未读消息 + 未读计数 +- 消息同步完成后清除缓存或更新状态 + +------ + +### 3.5 多端同步策略 + +- 每个设备维护独立的 `deviceId` +- WebSocket 推送时: + - 排除发送设备 + - 推送给同账号其他设备 +- //暂不要求:消息回执: + - 每端发送 ACK + - 服务端更新 `Voncers` 和 `message_receipt` + +------ + +## 4. 消息可靠性保障 + +| 场景 | 解决方案 | +| ------------------ | ---------------------------------- | +| 消息丢失 | 发送端生成 `requestId`,服务端去重 | +| 消息顺序错乱 | 按 `messageId` 或 `timestamp` 排序 | +| WebSocket 异常断开 | 客户端重连后同步离线消息 | +| 群聊大消息量 | 异步推送 + 批量 ACK | + +------ + +## 5. //暂不要求:高性能优化策略 + +1. **消息表索引**:`(chat_type, to_id, created_at)` +2. **会话表缓存**:`conversation` 表避免全表查询 +3. **Redis 缓存**:用户在线状态、未读消息数 +4. **分表/分库**:按月或按用户分表 +5. **异步推送队列**:消息通过 MQ(Kafka/RabbitMQ)推送,保证高并发 + +------ + +## 6. 消息撤回与删除策略 + +1. **撤回条件**:超时限制( 2 分钟内可撤回) +2. **撤回操作**: + - 更新 `message.status = 1` + - 更新 `Conversation.LastMessageId` + - 推送撤回事件到在线用户 + +------ + +## 7. 系统消息与通知策略 + +- 系统消息(好友申请、群邀请、公告)走 **同样的消息推送流程** +- 保留在 `Notification` 表 - 支持离线同步 \ No newline at end of file diff --git a/IM 系统鉴权与 Token 安全规范文档.md b/docs/IM 系统鉴权与 Token 安全规范文档.md similarity index 95% rename from IM 系统鉴权与 Token 安全规范文档.md rename to docs/IM 系统鉴权与 Token 安全规范文档.md index 92aa5b3..2ece4d2 100644 --- a/IM 系统鉴权与 Token 安全规范文档.md +++ b/docs/IM 系统鉴权与 Token 安全规范文档.md @@ -1,115 +1,115 @@ -# IM 系统鉴权与 Token 安全规范文档 - -## 1. 概述 - -本规范用于确保系统用户身份验证、消息安全和多端同步安全。 - 鉴权体系采用 **Token(JWT 或自定义) + HTTPS/WebSocket** 方式。 - ------- - -## 2. 鉴权方式选择 - -| 方法 | -| -------------------------------------- | -| JWT(JSON Web Token)+ Redis黑名单机制 | - ------- - -## 3. Token 生成规则 - -### 3.1 Token 内容结构(JWT 示例) - -``` -{ - "userId": 1001, // 用户ID - "iat": 1700000000, // 签发时间(Unix时间戳) - "exp": 1700003600, // 过期时间 - "deviceId": "uuid-xxxx", // 设备ID,用于多端区分 - "role": "user" // 角色 -} -``` - -- **签名算法**:HMAC-SHA256 或 RSA -- **签名秘钥**:服务端统一管理,不暴露给客户端 - ------- - -### 3.2 Token 生成流程 - -1. 用户登录(用户名/密码) -2. 验证用户名与密码正确 -3. 生成 Token,写入 Redis(可选) -4. 返回 Token 给客户端 - -**响应示例**: - -``` -{ - "code": 0, - "message": "登录成功", - "data": { - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." - } -} -``` - ------- - -## 4. Token 使用 - -### 4.1 HTTP 接口鉴权 - -- 客户端请求带上 Header: - -``` -Authorization: Bearer -``` - -- 后端解析 Token: - 1. 校验签名 - 2. 校验 exp 是否过期 - 3. 校验 Redis 黑名单(可选) -- 不通过返回 401 / code 1006 - ------- - -### 4.2 WebSocket 鉴权 - -- 建立连接时通过 Query 或 Header 传 Token: - -``` -ws://example.com/ws?token=xxxx&deviceId=uuid-001 -``` - -- 握手阶段: - 1. 服务器验证 Token - 2. 成功返回 AUTH_SUCCESS - 3. 失败返回 AUTH_FAIL 并关闭连接 - ------- - -## 5. Token 过期策略 - -| 类型 | 建议值 | 说明 | -| ------------------ | ---------------------- | ---------------------------------------- | -| 短期 Token | 30 分钟 ~ 1 小时 | 防止长时间泄露 | -| 长期 Refresh Token | 7 ~ 30 天 | 用于获取新 Token,安全性高 | -| WebSocket 长连接 | Token 与短期有效期一致 | 客户端定期刷新 Token(心跳或重连时验证) | - -### 5.1 Token 刷新流程 - -1. 客户端 Token 快过期时,调用刷新接口 -2. 服务端验证 Refresh Token -3. 返回新 Token,更新 Redis / 黑名单 - ------- - -## 6. 多端登录处理 - -- **每个设备对应一个 deviceId** -- Token 中绑定 deviceId -- 多端策略: - 1. **允许多端同时登录**:每端单独维护 Token - 2. **限制单端登录**:新登录覆盖旧设备 Token - 3. **设备列表管理**:可查看在线设备并强制下线 - +# IM 系统鉴权与 Token 安全规范文档 + +## 1. 概述 + +本规范用于确保系统用户身份验证、消息安全和多端同步安全。 + 鉴权体系采用 **Token(JWT 或自定义) + HTTPS/WebSocket** 方式。 + +------ + +## 2. 鉴权方式选择 + +| 方法 | +| -------------------------------------- | +| JWT(JSON Web Token)+ Redis黑名单机制 | + +------ + +## 3. Token 生成规则 + +### 3.1 Token 内容结构(JWT 示例) + +``` +{ + "userId": 1001, // 用户ID + "iat": 1700000000, // 签发时间(Unix时间戳) + "exp": 1700003600, // 过期时间 + "deviceId": "uuid-xxxx", // 设备ID,用于多端区分 + "role": "user" // 角色 +} +``` + +- **签名算法**:HMAC-SHA256 或 RSA +- **签名秘钥**:服务端统一管理,不暴露给客户端 + +------ + +### 3.2 Token 生成流程 + +1. 用户登录(用户名/密码) +2. 验证用户名与密码正确 +3. 生成 Token,写入 Redis(可选) +4. 返回 Token 给客户端 + +**响应示例**: + +``` +{ + "code": 0, + "message": "登录成功", + "data": { + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." + } +} +``` + +------ + +## 4. Token 使用 + +### 4.1 HTTP 接口鉴权 + +- 客户端请求带上 Header: + +``` +Authorization: Bearer +``` + +- 后端解析 Token: + 1. 校验签名 + 2. 校验 exp 是否过期 + 3. 校验 Redis 黑名单(可选) +- 不通过返回 401 / code 1006 + +------ + +### 4.2 WebSocket 鉴权 + +- 建立连接时通过 Query 或 Header 传 Token: + +``` +ws://example.com/ws?token=xxxx&deviceId=uuid-001 +``` + +- 握手阶段: + 1. 服务器验证 Token + 2. 成功返回 AUTH_SUCCESS + 3. 失败返回 AUTH_FAIL 并关闭连接 + +------ + +## 5. Token 过期策略 + +| 类型 | 建议值 | 说明 | +| ------------------ | ---------------------- | ---------------------------------------- | +| 短期 Token | 30 分钟 ~ 1 小时 | 防止长时间泄露 | +| 长期 Refresh Token | 7 ~ 30 天 | 用于获取新 Token,安全性高 | +| WebSocket 长连接 | Token 与短期有效期一致 | 客户端定期刷新 Token(心跳或重连时验证) | + +### 5.1 Token 刷新流程 + +1. 客户端 Token 快过期时,调用刷新接口 +2. 服务端验证 Refresh Token +3. 返回新 Token,更新 Redis / 黑名单 + +------ + +## 6. 多端登录处理 + +- **每个设备对应一个 deviceId** +- Token 中绑定 deviceId +- 多端策略: + 1. **允许多端同时登录**:每端单独维护 Token + 2. **限制单端登录**:新登录覆盖旧设备 Token + 3. **设备列表管理**:可查看在线设备并强制下线 + diff --git a/接口文档(REST API) — 聊天系统.md b/docs/接口文档(REST API) — 聊天系统.md similarity index 94% rename from 接口文档(REST API) — 聊天系统.md rename to docs/接口文档(REST API) — 聊天系统.md index 8c9dfac..0bc3315 100644 --- a/接口文档(REST API) — 聊天系统.md +++ b/docs/接口文档(REST API) — 聊天系统.md @@ -1,401 +1,401 @@ -# 接口文档(REST API) — 聊天系统 - -> 统一响应格式(JSON) - -``` -{ - "code": 0, - "message": "请求成功", - "data": {} -} -``` - -- `code`:参照响应 Code 规范(0 成功,非 0 为错误)。 -- `message`:提示文本。 -- `data`:返回主体。 - ------- - -## 通用约定 - -- 所有需要登录的接口必须在 Header 中带 `Authorization: Bearer `。 -- 时间戳统一使用 Unix 秒。 -- 分页统一采用 `page`(第几页,从1开始)与 `limit`(每页大小)或基于时间/消息ID的 `afterMessageId` / `beforeTimestamp`。 -- 幂等性:对于可能重试的写操作,请求体中带 `requestId`。 -- Content-Type: `application/json`(文件上传除外)。 -- 返回错误码请参考前面的响应 Code 文档。 - ------- - -## 目录 - -1. 鉴权(Auth) -2. 用户(User) -3. 好友(Friend) -4. 会话(Conversation) -5. 消息(Message) -6. 文件/上传(File) -7. 群组(Group) -8. 通知(Notification) -9. 管理后台(Admin) -10. 常见错误与限流 - ------- - -## 1. 鉴权(Auth) - -### 1.1 注册 - -- URL: `POST /api/v1/auth/register` -- 请求: - -``` -{ - "username": "alice", - "password": "password123", - "phone": "13800000000", - "email":"admin@admin.com", - "nickname":"测试用户", - "avatar": "https://cdn.example.com/avatar/1001.png", -} -``` - -- 成功响应: - -``` -{ - "code": 0, - "message": "注册成功", - "data": { "userId": 1001 } -} -``` - -### 1.2 登录(返回 Token) - -- URL: `POST /api/v1/auth/login` -- 请求: - -``` -{ - "username": "alice", - "password": "password123", - "deviceId": "uuid-device-001" -} -``` - -- 成功响应: - -``` -{ - "code": 0, - "message": "登录成功", - "data": { - "token": "eyJ....", - "expires_in": 3600, - "refreshToken": "rft-xxxx" - } -} -``` - -### 1.3 刷新 Token - -- URL: `POST /api/v1/auth/refresh` -- 请求: - -``` -{ "refreshToken": "rft-xxxx", "deviceId": "uuid-device-001" } -``` - -- 响应同登录(返回新 token)。 - ------- - -## 2. 用户(User) - -### 2.1 获取当前用户信息 - -- URL: `GET /api/v1/user/me` -- Header: `Authorization: Bearer ` -- 响应 data 示例: - -``` -{ - "id": 1001, - "username": "alice", - "nickname": "Alice", - "avatar": "https://cdn.example.com/avatar/1001.png", - "status": 1 -} -``` - -### 2.2 修改用户资料 - -- URL: `PUT /api/v1/user/profile` -- 请求: - -``` -{ - "nickname": "小艾", - "olinestatus": "0", - "avatar": "https://..." -} -``` - -### 2.3 根据 id 查询用户(用于搜索/加好友) - -- URL: `GET /api/v1/user/{userId}` -- 响应含基本公开信息(不含敏感字段)。 - ------- - -## 3. 好友(Friend) - -### 3.1 发送好友申请 - -- URL: `POST /api/v1/friend/request` -- 请求: - -``` -{ - "toUserId": 1002, - "Description": "我们在项目中认识,申请加好友", - "requestId": "uuid-req-001" // 幂等字段 -} -``` - -- 成功返回 `requestId` 或新记录 id。 - -### 3.2 列出好友申请(收/发) - -- URL: `GET /api/v1/friend/requests?type=received|sent&page=1&limit=20` - -### 3.3 处理好友申请(同意/拒绝) - -- URL: `POST /api/v1/friend/request/{requestId}/handle` -- 请求: - -``` -{ "action": "accept" } // accept | reject -``` - -### 3.4 获取好友列表 - -- URL: `GET /api/v1/friend/list?page=1&limit=50` -- 返回:好友数组(id, nickname, avatar, remark) - -### 3.5 删除好友 / 拉黑 - -- URL: `DELETE /api/v1/friend/{friendId}` -- URL: `POST /api/v1/friend/{friendId}/block` - ------- - -## 4. 会话(Conversation) - -### 4.1 获取会话列表(聊天列表) - -- URL: `GET /api/v1/conversations?page=1&limit=50` -- 返回每条会话示例: - -``` -{ - "targetId": 1002, - "chatType": "single", - "lastMessage": { "messageId": 50001, "contentType":"text", "content":"你好", "timestamp": 1700000000 }, - "unreadCount": 3, - "updatedAt": 1700000000 -} -``` - -### 4.2 删除会话(清空会话/历史) - -- URL: `DELETE /api/v1/conversation/{chatType}/{targetId}` -- 注:chatType 为 `single` 或 `group`。删除会影响客户端显示/未读计数,历史消息视策略保留或软删除。 - ------- - -## 5. 消息(Message) - -> 说明:即时消息优先通过 WebSocket 发送/接收;REST 接口用于历史消息读取、离线发送(备用)、ACK、撤回等。 - -### 5.1 发送消息(HTTP 版备用) - -- URL: `POST /api/v1/message/send` -- 请求: - -``` -{ - "requestId": "uuid-msg-001", - "from": 1001, - "to": 1002, - "chatType": "single", - "contentType": "text", - "content": "你好", - "timestamp": 1700000000 -} -``` - -- 响应: - -``` -{ "code": 0, "data": { "messageId": 50001, "status": "sent" } } -``` - -- 注意:若用户在线,后端可同时通过 WebSocket 推送到接收端。 - -### 5.2 拉取历史消息(分页或基于消息ID) - -- URL: `GET /api/v1/messages/history?chatType=single&targetId=1002&beforeMessageId=50000&limit=50` -- 返回消息数组(按时间倒序或正序,双方约定)。 - -### 5.3 同步未读/离线消息(登录/重连时) - -- URL: `GET /api/v1/messages/sync?since=1700000000` 或 `afterMessageId=xxxxx` -- 返回:所有未读/未同步消息(或给定时间段内消息)。 - -### 5.4 消息已读/送达回执(HTTP) - -- URL: `POST /api/v1/message/ack` -- 请求: - -``` -{ - "messageId": 50001, - "status": "read", // delivered | read - "chatType": "single", - "from": 1002, // ack 发送者(接收方) - "to": 1001 -} -``` - -### 5.5 撤回消息 - -- URL: `POST /api/v1/message/{messageId}/recall` -- 请求: - -``` -{ "requestId": "uuid-recall-001" } -``` - -- 响应成功后,服务器会向相关在线端推送 `MESSAGE_RECALL` 事件,更新 message.status。 - -### 5.6 删除单条消息(客户端侧删除/服务端删除) - -- URL: `DELETE /api/v1/message/{messageId}` -- 注意区分“仅自己删除”与“全局删除(撤回)”。 - ------- - -## 6. 文件/上传(File) - -### 6.1 上传文件(图片/语音/文档) - -- URL: `POST /api/v1/file/upload` -- Content-Type: `multipart/form-data` -- 字段:`file`,可选 `type`、`attachedMessageRequestId` -- 成功响应: - -``` -{ - "code": 0, - "data": { - "fileId": 9001, - "fileUrl": "https://oss.example.com/xxx.jpg", - "fileName": "xxx.jpg", - "fileSize": 12345 - } -} -``` - -- 建议:文件先上传到对象存储(OSS/S3/MinIO),返回 URL,消息发送时引用该 URL(message.content)。 - -### 6.2 下载文件 - -- 直接访问 `fileUrl` 或通过后端代理下载(带鉴权)。 - ------- - -## 7. 群组(Group) - -### 7.1 创建群 - -- URL: `POST /api/v1/group/create` -- 请求: - -``` -{ - "name": "项目群", - "ownerId": 1001, - "memberIds": [1002,1003], - "maxMembers": 500, - "needApproval": true // 加群是否需要审批 -} -``` - -- 响应返回 `groupId`。 - -### 7.2 获取群信息 - -- URL: `GET /api/v1/group/{groupId}` - -### 7.3 邀请入群 - -- URL: `POST /api/v1/group/{groupId}/invite` -- 请求: - -``` -{ "inviter":1001, "invitees":[1004,1005], "message":"来加入我们吧" } -``` - -- 若群需要审批,发送 `group_join_request`;否则直接加入并更新 group_member。 - -### 7.4 加群申请(用户申请) - -- URL: `POST /api/v1/group/{groupId}/join-request` -- 管理员/群主处理:`POST /api/v1/group/join-request/{requestId}/handle` - -### 7.5 群成员管理(踢人/设管理员/退出群) - -- 踢人:`POST /api/v1/group/{groupId}/kick` -- 退出:`POST /api/v1/group/{groupId}/leave` -- 设管理员:`POST /api/v1/group/{groupId}/role` - ------- - -## 8. 通知(Notification) - -### 8.1 获取通知列表 - -- URL: `GET /api/v1/notifications?page=1&limit=50` -- 类型包含:好友请求、群邀请、系统公告等。 - -### 8.2 标记通知为已读 - -- URL: `POST /api/v1/notification/{notificationId}/read` - ------- - -## 9. 管理后台(Admin) - -> 仅管理员或具备权限的账号访问(需在 token 中包含角色或额外权限校验) - -### 9.1 管理员登录(同 auth) - -- URL: `POST /api/v1/admin/login` - -### 9.2 查询用户列表 - -- URL: `GET /api/v1/admin/users?page=1&limit=50&keyword=alice` - -### 9.3 禁用/启用用户 - -- URL: `POST /api/v1/admin/user/{userId}/ban` -- 请求: - -``` -{ "action": "ban", "reason": "违规传播" } // action: ban | unban -``` - -### 9.4 查询操作日志 - +# 接口文档(REST API) — 聊天系统 + +> 统一响应格式(JSON) + +``` +{ + "code": 0, + "message": "请求成功", + "data": {} +} +``` + +- `code`:参照响应 Code 规范(0 成功,非 0 为错误)。 +- `message`:提示文本。 +- `data`:返回主体。 + +------ + +## 通用约定 + +- 所有需要登录的接口必须在 Header 中带 `Authorization: Bearer `。 +- 时间戳统一使用 Unix 秒。 +- 分页统一采用 `page`(第几页,从1开始)与 `limit`(每页大小)或基于时间/消息ID的 `afterMessageId` / `beforeTimestamp`。 +- 幂等性:对于可能重试的写操作,请求体中带 `requestId`。 +- Content-Type: `application/json`(文件上传除外)。 +- 返回错误码请参考前面的响应 Code 文档。 + +------ + +## 目录 + +1. 鉴权(Auth) +2. 用户(User) +3. 好友(Friend) +4. 会话(Conversation) +5. 消息(Message) +6. 文件/上传(File) +7. 群组(Group) +8. 通知(Notification) +9. 管理后台(Admin) +10. 常见错误与限流 + +------ + +## 1. 鉴权(Auth) + +### 1.1 注册 + +- URL: `POST /api/v1/auth/register` +- 请求: + +``` +{ + "username": "alice", + "password": "password123", + "phone": "13800000000", + "email":"admin@admin.com", + "nickname":"测试用户", + "avatar": "https://cdn.example.com/avatar/1001.png", +} +``` + +- 成功响应: + +``` +{ + "code": 0, + "message": "注册成功", + "data": { "userId": 1001 } +} +``` + +### 1.2 登录(返回 Token) + +- URL: `POST /api/v1/auth/login` +- 请求: + +``` +{ + "username": "alice", + "password": "password123", + "deviceId": "uuid-device-001" +} +``` + +- 成功响应: + +``` +{ + "code": 0, + "message": "登录成功", + "data": { + "token": "eyJ....", + "expires_in": 3600, + "refreshToken": "rft-xxxx" + } +} +``` + +### 1.3 刷新 Token + +- URL: `POST /api/v1/auth/refresh` +- 请求: + +``` +{ "refreshToken": "rft-xxxx", "deviceId": "uuid-device-001" } +``` + +- 响应同登录(返回新 token)。 + +------ + +## 2. 用户(User) + +### 2.1 获取当前用户信息 + +- URL: `GET /api/v1/user/me` +- Header: `Authorization: Bearer ` +- 响应 data 示例: + +``` +{ + "id": 1001, + "username": "alice", + "nickname": "Alice", + "avatar": "https://cdn.example.com/avatar/1001.png", + "status": 1 +} +``` + +### 2.2 修改用户资料 + +- URL: `PUT /api/v1/user/profile` +- 请求: + +``` +{ + "nickname": "小艾", + "olinestatus": "0", + "avatar": "https://..." +} +``` + +### 2.3 根据 id 查询用户(用于搜索/加好友) + +- URL: `GET /api/v1/user/{userId}` +- 响应含基本公开信息(不含敏感字段)。 + +------ + +## 3. 好友(Friend) + +### 3.1 发送好友申请 + +- URL: `POST /api/v1/friend/request` +- 请求: + +``` +{ + "toUserId": 1002, + "Description": "我们在项目中认识,申请加好友", + "requestId": "uuid-req-001" // 幂等字段 +} +``` + +- 成功返回 `requestId` 或新记录 id。 + +### 3.2 列出好友申请(收/发) + +- URL: `GET /api/v1/friend/requests?type=received|sent&page=1&limit=20` + +### 3.3 处理好友申请(同意/拒绝) + +- URL: `POST /api/v1/friend/request/{requestId}/handle` +- 请求: + +``` +{ "action": "accept" } // accept | reject +``` + +### 3.4 获取好友列表 + +- URL: `GET /api/v1/friend/list?page=1&limit=50` +- 返回:好友数组(id, nickname, avatar, remark) + +### 3.5 删除好友 / 拉黑 + +- URL: `DELETE /api/v1/friend/{friendId}` +- URL: `POST /api/v1/friend/{friendId}/block` + +------ + +## 4. 会话(Conversation) + +### 4.1 获取会话列表(聊天列表) + +- URL: `GET /api/v1/conversations?page=1&limit=50` +- 返回每条会话示例: + +``` +{ + "targetId": 1002, + "chatType": "single", + "lastMessage": { "messageId": 50001, "contentType":"text", "content":"你好", "timestamp": 1700000000 }, + "unreadCount": 3, + "updatedAt": 1700000000 +} +``` + +### 4.2 删除会话(清空会话/历史) + +- URL: `DELETE /api/v1/conversation/{chatType}/{targetId}` +- 注:chatType 为 `single` 或 `group`。删除会影响客户端显示/未读计数,历史消息视策略保留或软删除。 + +------ + +## 5. 消息(Message) + +> 说明:即时消息优先通过 WebSocket 发送/接收;REST 接口用于历史消息读取、离线发送(备用)、ACK、撤回等。 + +### 5.1 发送消息(HTTP 版备用) + +- URL: `POST /api/v1/message/send` +- 请求: + +``` +{ + "requestId": "uuid-msg-001", + "from": 1001, + "to": 1002, + "chatType": "single", + "contentType": "text", + "content": "你好", + "timestamp": 1700000000 +} +``` + +- 响应: + +``` +{ "code": 0, "data": { "messageId": 50001, "status": "sent" } } +``` + +- 注意:若用户在线,后端可同时通过 WebSocket 推送到接收端。 + +### 5.2 拉取历史消息(分页或基于消息ID) + +- URL: `GET /api/v1/messages/history?chatType=single&targetId=1002&beforeMessageId=50000&limit=50` +- 返回消息数组(按时间倒序或正序,双方约定)。 + +### 5.3 同步未读/离线消息(登录/重连时) + +- URL: `GET /api/v1/messages/sync?since=1700000000` 或 `afterMessageId=xxxxx` +- 返回:所有未读/未同步消息(或给定时间段内消息)。 + +### 5.4 消息已读/送达回执(HTTP) + +- URL: `POST /api/v1/message/ack` +- 请求: + +``` +{ + "messageId": 50001, + "status": "read", // delivered | read + "chatType": "single", + "from": 1002, // ack 发送者(接收方) + "to": 1001 +} +``` + +### 5.5 撤回消息 + +- URL: `POST /api/v1/message/{messageId}/recall` +- 请求: + +``` +{ "requestId": "uuid-recall-001" } +``` + +- 响应成功后,服务器会向相关在线端推送 `MESSAGE_RECALL` 事件,更新 message.status。 + +### 5.6 删除单条消息(客户端侧删除/服务端删除) + +- URL: `DELETE /api/v1/message/{messageId}` +- 注意区分“仅自己删除”与“全局删除(撤回)”。 + +------ + +## 6. 文件/上传(File) + +### 6.1 上传文件(图片/语音/文档) + +- URL: `POST /api/v1/file/upload` +- Content-Type: `multipart/form-data` +- 字段:`file`,可选 `type`、`attachedMessageRequestId` +- 成功响应: + +``` +{ + "code": 0, + "data": { + "fileId": 9001, + "fileUrl": "https://oss.example.com/xxx.jpg", + "fileName": "xxx.jpg", + "fileSize": 12345 + } +} +``` + +- 建议:文件先上传到对象存储(OSS/S3/MinIO),返回 URL,消息发送时引用该 URL(message.content)。 + +### 6.2 下载文件 + +- 直接访问 `fileUrl` 或通过后端代理下载(带鉴权)。 + +------ + +## 7. 群组(Group) + +### 7.1 创建群 + +- URL: `POST /api/v1/group/create` +- 请求: + +``` +{ + "name": "项目群", + "ownerId": 1001, + "memberIds": [1002,1003], + "maxMembers": 500, + "needApproval": true // 加群是否需要审批 +} +``` + +- 响应返回 `groupId`。 + +### 7.2 获取群信息 + +- URL: `GET /api/v1/group/{groupId}` + +### 7.3 邀请入群 + +- URL: `POST /api/v1/group/{groupId}/invite` +- 请求: + +``` +{ "inviter":1001, "invitees":[1004,1005], "message":"来加入我们吧" } +``` + +- 若群需要审批,发送 `group_join_request`;否则直接加入并更新 group_member。 + +### 7.4 加群申请(用户申请) + +- URL: `POST /api/v1/group/{groupId}/join-request` +- 管理员/群主处理:`POST /api/v1/group/join-request/{requestId}/handle` + +### 7.5 群成员管理(踢人/设管理员/退出群) + +- 踢人:`POST /api/v1/group/{groupId}/kick` +- 退出:`POST /api/v1/group/{groupId}/leave` +- 设管理员:`POST /api/v1/group/{groupId}/role` + +------ + +## 8. 通知(Notification) + +### 8.1 获取通知列表 + +- URL: `GET /api/v1/notifications?page=1&limit=50` +- 类型包含:好友请求、群邀请、系统公告等。 + +### 8.2 标记通知为已读 + +- URL: `POST /api/v1/notification/{notificationId}/read` + +------ + +## 9. 管理后台(Admin) + +> 仅管理员或具备权限的账号访问(需在 token 中包含角色或额外权限校验) + +### 9.1 管理员登录(同 auth) + +- URL: `POST /api/v1/admin/login` + +### 9.2 查询用户列表 + +- URL: `GET /api/v1/admin/users?page=1&limit=50&keyword=alice` + +### 9.3 禁用/启用用户 + +- URL: `POST /api/v1/admin/user/{userId}/ban` +- 请求: + +``` +{ "action": "ban", "reason": "违规传播" } // action: ban | unban +``` + +### 9.4 查询操作日志 + - URL: `GET /api/v1/admin/logs?page=1&limit=50` \ No newline at end of file diff --git a/数据字典.md b/docs/数据字典.md similarity index 98% rename from 数据字典.md rename to docs/数据字典.md index 9ad0612..519a51b 100644 --- a/数据字典.md +++ b/docs/数据字典.md @@ -1,220 +1,220 @@ -# 数据字典 - -### 表名:Users - -#### 表说明:储存用户个人信息 - -| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | -| ----------- | ----------- | -------- | -------- | ------- | --------- | ------------------------------------------------ | --------- | -| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | -| Username | VARCHAR(50) | 是 | / | / | 唯一 | 唯一用户名 | admin | -| Password | VARCHAR(50) | 是 | / | / | / | 用户密码 | 123456 | -| NickName | VARCHAR(50) | 是 | / | / | / | 用户昵称 | / | -| OlineStatus | TINYINT | 是 | 0 | / | / | 用户在线状态
0(默认):不在线
1:在线 | 0 | -| Created | DATETIME | 是 | 1970/1/1 | / | / | 账户创建时间 | 2025/9/29 | -| Updated | DATETIME | 否 | / | / | / | 账户修改时间 | 2024/9/29 | -| Status | TINYINT | 是 | 1 | / | / | 账户状态
(0:未激活,1:正常,2:封禁) | 1 | -| IsDeleted | TINYINT | 是 | 0 | / | / | 软删除标识
0:账号正常
1:账号已删除 | 0 | - -### 表名:Friends - -#### 表说明:好友关系映射 - -| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | -| -------- | -------- | -------- | -------- | ---------------- | --------- | ------------------------------------------------------------ | --------- | -| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | -| UserId | INT | 是 | / | 外键(Users.Id) | 索引 | 用户ID | 1 | -| FriendId | INT | 是 | / | 外键(Users.Id) | 索引 | 用户2ID | 2 | -| Status | TINYINT | 是 | 0 | / | / | 当前好友关系状态
(0:待通过,1:已添加,2:已拒绝,3:已拉黑) | 0 | -| Created | DATETIME | 是 | 1970/1/1 | / | / | 好友关系创建时间 | 2025/9/29 | - -### 表名:Groups - -#### 表说明:群聊 - -| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | -| ---------------- | ------------- | -------- | -------- | ---------------- | --------- | ------------------------------------------------------------ | ------------------ | -| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | -| Name | VARCHAT(20) | 是 | / | / | / | 群聊名称 | 测试群聊1 | -| GroupMaster | INT | 是 | / | 外键(Users.Id) | 索引 | 群主 | 1 | -| Auhority | TINYINT | 是 | 0 | / | / | 群权限
(0:需管理员同意,1:任意人可加群,2:不允许任何人加入) | 0 | -| AllMembersBanned | TINYINT | 是 | 0 | / | / | 全员禁言(0允许发言,2全员禁言) | 0 | -| Status | TINYINT | 是 | 1 | / | / | 群聊状态
(1:正常,2:封禁) | 1 | -| Announcement | TEXT | 否 | null | / | / | 群公告 | 这是一条测试群公告 | -| Created | DATETIME | 是 | 1970/1/1 | / | / | 群聊创建时间 | 2025/9/29 | - -### 表名:GroupMember - -#### 表说明:群成员 - -| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | -| ------- | -------- | -------- | -------- | --------------- | --------- | -------------------------------------- | -------- | -| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | -| UserId | INT | 是 | / | 外键(Users.Id) | 索引 | 用户编号 | 1 | -| GroupId | INT | 是 | / | 外键(Groups.Id) | 索引 | 群聊编号 | 1 | -| Role | TINYINT | 是 | 0 | / | / | 成员角色(0:普通成员,1:管理员,2:群主) | 1 | -| Created | DATETIME | 是 | 1970/1/1 | / | / | 加入群聊时间 | 1970/1/1 | - -### 表名:GroupInvite - -#### 表说明:群聊邀请 - -| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | -| ----------- | -------- | -------- | -------- | --------------- | --------- | ------------------------------------------------ | -------- | -| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | -| GroupId | INT | 是 | / | 外键(Groups.Id) | 索引 | 群聊编号 | 1 | -| InvitedUser | INT | 是 | / | 外键(Users.Id) | 索引 | 被邀请用户 | 1 | -| InviteUser | INT | 是 | / | 外键(Users.Id) | 索引 | 邀请用户 | 1 | -| State | TINYINT | 是 | 0 | / | / | 当前状态(0:待被邀请人同意
1:被邀请人已同意) | 1 | -| Created | DATETIME | 是 | 1970/1/1 | / | / | 创建时间 | 1970/1/1 | - -### 表名:GroupRequest - -#### 表说明:群聊入群申请 - -| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | -| ----------- | -------- | -------- | --------------- | --------------- | --------- | --------------------------------------------- | ------ | -| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | -| GroupId | INT | 是 | / | 外键(Groups.Id) | 索引 | 群聊编号 | 1 | -| UserId | INT | 是 | / | 外键(Users.Id) | 索引 | 申请人 | 1 | -| State | TINYINT | 是 | 0 | / | / | 申请状态(0:待管理员同意,1:已拒绝,2:已同意) | 1 | -| Description | TEXT | 是 | xxx申请加入群聊 | / | / | 入群附言 | / | -| Created | DATETIME | 是 | 1970/1/1 | / | / | 创建时间 | / | - -### 表名:Messages - -#### 表说明:用户消息 - -| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | -| --------- | -------- | -------- | -------- | -------------- | --------- | ------------------------------------------------------------ | ------ | -| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | -| ChatType | TINYINT | 是 | 0 | / | / | 聊天类型
(0:私聊,1:群聊) | 0 | -| MsgType | TINYINT | 是 | 0 | / | / | 消息类型
(0:文本,1:图片,2:语音,3:视频,4:文件,5:语音聊天,6:视频聊天) | 0 | -| Content | TEXT | 是 | / | / | / | 消息内容 | / | -| Sender | INT | 是 | / | 外键(Users.Id) | 索引 | 发送者 | / | -| Recipient | INT | 是 | / | / | / | 接收者(私聊为用户ID,群聊为群聊ID) | / | -| State | TINYINT | 是 | 0 | / | / | 消息状态(0:已发送,1:已撤回) | / | -| Created | DATETIME | 是 | 1970/1/1 | / | / | 发送时间 | 、 | - -### 表名:Files - -#### 表说明:文件 - -| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | -| --------- | ------------ | -------- | -------- | ------------------- | --------- | -------------------- | ----------------------- | -| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | -| Name | VARCHAR(50) | 是 | / | / | / | 文件名 | 测试文件.txt | -| URL | VARCHAR(100) | 是 | / | / | / | 文件储存URL | https://baidu.com/1.txt | -| Size | INT | 是 | / | / | / | 文件大小(单位:KB) | 1024 | -| Type | VARCHAT(10) | 是 | / | / | / | 文件类型 | txt | -| MessageId | INT | 是 | / | 外键(Messages.Id) | 索引 | 关联消息ID | 1 | -| Created | DATETIME | 是 | 1970/1/1 | / | / | 创建时间 | 2025/9/29 | - -### 表名:Notifications - -#### 表说明:系统通知消息 - -| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | -| ------- | ------------ | -------- | -------- | -------------- | --------- | ------------------------ | ------ | -| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | -| UserId | INT | 否 | / | 外键(Users.Id) | 索引 | 接收人(为空为全体通知) | 1 | -| NType | TINYINT | 是 | 0 | / | / | 通知类型(0:文本) | 0 | -| Title | NVARCHAR(20) | 是 | / | / | / | 通知标题 | 1 | -| Content | TEXT | 是 | / | / | / | 通知内容 | 1 | -| Created | DATETIME | 是 | 1970/1/1 | / | / | 创建时间 | / | - -### 表名:Conversations - -#### 表说明:用户会话 - -| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | -| ------------- | -------- | -------- | ------ | ----------------- | --------- | ------------------------------------ | ------ | -| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | -| UserId | INT | 是 | / | 外键(Users.Id) | 索引 | 用户 | 1 | -| TargetId | INT | 是 | / | / | / | 对方ID(群聊为群聊ID,单聊为单聊ID) | 1 | -| MsgType | INT | 是 | / | / | / | 消息类型(同Messages.MsgType) | / | -| lastMessageId | INT | 是 | / | 外键(Messages.Id) | 索引 | 最后一条消息ID | 1 | -| unreadCount | INT | 是 | / | / | / | 未读消息数 | / | - -### 表名:FriendRequest - -#### 表说明:好友申请 - -| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | -| ------------ | -------- | -------- | ------------------- | ---------------- | --------- | ------------------------------------------- | ------ | -| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | -| RequestUser | INT | 是 | / | 外键(Users.Id) | 索引 | 申请人 | / | -| ResponseUser | INT | 是 | / | 外键(Users.Id) | 索引 | 被申请人 | / | -| Created | DATETIME | 是 | 1970/1/1 | / | / | 申请时间 | / | -| Description | TEXT | 否 | xxx申请添加你为好友 | / | / | 申请附言 | / | -| State | TINYINT | 是 | 0 | / | / | 申请状态(0:待通过,1:拒绝,2:同意,3:拉黑) | / | - -### 表名:Devices - -#### 表说明:用户设备 - -| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | -| --------- | -------- | -------- | -------- | -------------- | --------- | ---------------------------------------------------- | ------ | -| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | -| UserId | INT | 是 | / | 外键(Users.Id) | 索引 | 设备所属用户 | / | -| DType | TINYINT | 是 | / | / | / | 设备类型(
0:Android,1:Ios,2:PC,3:Pad,4:未知) | 0 | -| LastLogin | DATETIME | 是 | 1970/1/1 | / | / | 最后一次登录 | / | - -### 表名:Login_Log - -#### 表说明:登录日志 - -| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | -| ------- | -------- | -------- | -------- | -------------- | --------- | ---------------------------------------- | ------ | -| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | -| DType | TINYINT | 是 | / | / | / | 设备类型(通Devices/DType) | / | -| Logined | DATETIME | 是 | 1970/1/1 | / | / | 登录时间 | / | -| UserId | INT | 是 | / | 外键(Users.Id) | / | 登录用户 | / | -| State | TINYINT | 是 | 0 | / | / | 登录状态(0:登陆成功,1:未验证,2:已被拒绝) | / | - -### 表名:Admins - -#### 表说明:系统管理员 - -| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | -| -------- | ----------- | -------- | -------- | ---------------- | --------- | ----------------------- | ------ | -| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | -| Username | VARCHAR(50) | 是 | / | / | / | 用户名 | / | -| Password | VARCHAR(50) | 是 | / | / | / | 密码 | / | -| RoleId | INT | 是 | / | 外键(Roles.Id) | 索引 | 角色 | / | -| State | TINYINT | 是 | 0 | / | / | 状态(0:正常,2:封禁) | / | -| Created | DATETIME | 是 | 1970/1/1 | / | / | 创建时间 | / | -| Updated | DATETIME | 是 | 1970/1/1 | / | / | 更新时间 | / | - -### 表名:Roles - -#### 表说明:角色 - -| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | -| ----------- | ----------- | -------- | -------- | ------- | --------- | -------- | ------ | -| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | -| Name | VARCHAR(20) | 是 | / | / | / | 角色名称 | / | -| Description | TEXT | 是 | 空字符串 | / | / | 角色描述 | / | -| Created | DATETIME | 是 | 1970/1/1 | / | / | 创建时间 | / | - -### 表名:Permissions - -#### 表说明:权限 - -| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | -| ------- | ----------- | -------- | ------ | ------- | --------- | ----------------------------- | ------ | -| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | -| PType | INT | 是 | 0 | / | / | 权限类型(0:增,1:删,2:改,3:查) | / | -| Name | VARCHAR(50) | 是 | / | / | / | 权限名称 | / | -| Code | INT | 是 | / | / | / | 权限编码 | / | -| Created | DATETIME | 是 | / | / | / | 创建时间 | / | - -### 表名:PermissionARole - -#### 表说明:权限角色关联 - -| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | -| ------------ | -------- | -------- | ------ | ---------------------- | --------- | -------- | ------ | -| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | -| RoleId | INT | 是 | / | 外键(Roles.Id) | 索引 | 角色 | / | +# 数据字典 + +### 表名:Users + +#### 表说明:储存用户个人信息 + +| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | +| ----------- | ----------- | -------- | -------- | ------- | --------- | ------------------------------------------------ | --------- | +| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | +| Username | VARCHAR(50) | 是 | / | / | 唯一 | 唯一用户名 | admin | +| Password | VARCHAR(50) | 是 | / | / | / | 用户密码 | 123456 | +| NickName | VARCHAR(50) | 是 | / | / | / | 用户昵称 | / | +| OlineStatus | TINYINT | 是 | 0 | / | / | 用户在线状态
0(默认):不在线
1:在线 | 0 | +| Created | DATETIME | 是 | 1970/1/1 | / | / | 账户创建时间 | 2025/9/29 | +| Updated | DATETIME | 否 | / | / | / | 账户修改时间 | 2024/9/29 | +| Status | TINYINT | 是 | 1 | / | / | 账户状态
(0:未激活,1:正常,2:封禁) | 1 | +| IsDeleted | TINYINT | 是 | 0 | / | / | 软删除标识
0:账号正常
1:账号已删除 | 0 | + +### 表名:Friends + +#### 表说明:好友关系映射 + +| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | +| -------- | -------- | -------- | -------- | ---------------- | --------- | ------------------------------------------------------------ | --------- | +| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | +| UserId | INT | 是 | / | 外键(Users.Id) | 索引 | 用户ID | 1 | +| FriendId | INT | 是 | / | 外键(Users.Id) | 索引 | 用户2ID | 2 | +| Status | TINYINT | 是 | 0 | / | / | 当前好友关系状态
(0:待通过,1:已添加,2:已拒绝,3:已拉黑) | 0 | +| Created | DATETIME | 是 | 1970/1/1 | / | / | 好友关系创建时间 | 2025/9/29 | + +### 表名:Groups + +#### 表说明:群聊 + +| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | +| ---------------- | ------------- | -------- | -------- | ---------------- | --------- | ------------------------------------------------------------ | ------------------ | +| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | +| Name | VARCHAT(20) | 是 | / | / | / | 群聊名称 | 测试群聊1 | +| GroupMaster | INT | 是 | / | 外键(Users.Id) | 索引 | 群主 | 1 | +| Auhority | TINYINT | 是 | 0 | / | / | 群权限
(0:需管理员同意,1:任意人可加群,2:不允许任何人加入) | 0 | +| AllMembersBanned | TINYINT | 是 | 0 | / | / | 全员禁言(0允许发言,2全员禁言) | 0 | +| Status | TINYINT | 是 | 1 | / | / | 群聊状态
(1:正常,2:封禁) | 1 | +| Announcement | TEXT | 否 | null | / | / | 群公告 | 这是一条测试群公告 | +| Created | DATETIME | 是 | 1970/1/1 | / | / | 群聊创建时间 | 2025/9/29 | + +### 表名:GroupMember + +#### 表说明:群成员 + +| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | +| ------- | -------- | -------- | -------- | --------------- | --------- | -------------------------------------- | -------- | +| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | +| UserId | INT | 是 | / | 外键(Users.Id) | 索引 | 用户编号 | 1 | +| GroupId | INT | 是 | / | 外键(Groups.Id) | 索引 | 群聊编号 | 1 | +| Role | TINYINT | 是 | 0 | / | / | 成员角色(0:普通成员,1:管理员,2:群主) | 1 | +| Created | DATETIME | 是 | 1970/1/1 | / | / | 加入群聊时间 | 1970/1/1 | + +### 表名:GroupInvite + +#### 表说明:群聊邀请 + +| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | +| ----------- | -------- | -------- | -------- | --------------- | --------- | ------------------------------------------------ | -------- | +| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | +| GroupId | INT | 是 | / | 外键(Groups.Id) | 索引 | 群聊编号 | 1 | +| InvitedUser | INT | 是 | / | 外键(Users.Id) | 索引 | 被邀请用户 | 1 | +| InviteUser | INT | 是 | / | 外键(Users.Id) | 索引 | 邀请用户 | 1 | +| State | TINYINT | 是 | 0 | / | / | 当前状态(0:待被邀请人同意
1:被邀请人已同意) | 1 | +| Created | DATETIME | 是 | 1970/1/1 | / | / | 创建时间 | 1970/1/1 | + +### 表名:GroupRequest + +#### 表说明:群聊入群申请 + +| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | +| ----------- | -------- | -------- | --------------- | --------------- | --------- | --------------------------------------------- | ------ | +| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | +| GroupId | INT | 是 | / | 外键(Groups.Id) | 索引 | 群聊编号 | 1 | +| UserId | INT | 是 | / | 外键(Users.Id) | 索引 | 申请人 | 1 | +| State | TINYINT | 是 | 0 | / | / | 申请状态(0:待管理员同意,1:已拒绝,2:已同意) | 1 | +| Description | TEXT | 是 | xxx申请加入群聊 | / | / | 入群附言 | / | +| Created | DATETIME | 是 | 1970/1/1 | / | / | 创建时间 | / | + +### 表名:Messages + +#### 表说明:用户消息 + +| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | +| --------- | -------- | -------- | -------- | -------------- | --------- | ------------------------------------------------------------ | ------ | +| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | +| ChatType | TINYINT | 是 | 0 | / | / | 聊天类型
(0:私聊,1:群聊) | 0 | +| MsgType | TINYINT | 是 | 0 | / | / | 消息类型
(0:文本,1:图片,2:语音,3:视频,4:文件,5:语音聊天,6:视频聊天) | 0 | +| Content | TEXT | 是 | / | / | / | 消息内容 | / | +| Sender | INT | 是 | / | 外键(Users.Id) | 索引 | 发送者 | / | +| Recipient | INT | 是 | / | / | / | 接收者(私聊为用户ID,群聊为群聊ID) | / | +| State | TINYINT | 是 | 0 | / | / | 消息状态(0:已发送,1:已撤回) | / | +| Created | DATETIME | 是 | 1970/1/1 | / | / | 发送时间 | 、 | + +### 表名:Files + +#### 表说明:文件 + +| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | +| --------- | ------------ | -------- | -------- | ------------------- | --------- | -------------------- | ----------------------- | +| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | +| Name | VARCHAR(50) | 是 | / | / | / | 文件名 | 测试文件.txt | +| URL | VARCHAR(100) | 是 | / | / | / | 文件储存URL | https://baidu.com/1.txt | +| Size | INT | 是 | / | / | / | 文件大小(单位:KB) | 1024 | +| Type | VARCHAT(10) | 是 | / | / | / | 文件类型 | txt | +| MessageId | INT | 是 | / | 外键(Messages.Id) | 索引 | 关联消息ID | 1 | +| Created | DATETIME | 是 | 1970/1/1 | / | / | 创建时间 | 2025/9/29 | + +### 表名:Notifications + +#### 表说明:系统通知消息 + +| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | +| ------- | ------------ | -------- | -------- | -------------- | --------- | ------------------------ | ------ | +| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | +| UserId | INT | 否 | / | 外键(Users.Id) | 索引 | 接收人(为空为全体通知) | 1 | +| NType | TINYINT | 是 | 0 | / | / | 通知类型(0:文本) | 0 | +| Title | NVARCHAR(20) | 是 | / | / | / | 通知标题 | 1 | +| Content | TEXT | 是 | / | / | / | 通知内容 | 1 | +| Created | DATETIME | 是 | 1970/1/1 | / | / | 创建时间 | / | + +### 表名:Conversations + +#### 表说明:用户会话 + +| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | +| ------------- | -------- | -------- | ------ | ----------------- | --------- | ------------------------------------ | ------ | +| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | +| UserId | INT | 是 | / | 外键(Users.Id) | 索引 | 用户 | 1 | +| TargetId | INT | 是 | / | / | / | 对方ID(群聊为群聊ID,单聊为单聊ID) | 1 | +| MsgType | INT | 是 | / | / | / | 消息类型(同Messages.MsgType) | / | +| lastMessageId | INT | 是 | / | 外键(Messages.Id) | 索引 | 最后一条消息ID | 1 | +| unreadCount | INT | 是 | / | / | / | 未读消息数 | / | + +### 表名:FriendRequest + +#### 表说明:好友申请 + +| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | +| ------------ | -------- | -------- | ------------------- | ---------------- | --------- | ------------------------------------------- | ------ | +| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | +| RequestUser | INT | 是 | / | 外键(Users.Id) | 索引 | 申请人 | / | +| ResponseUser | INT | 是 | / | 外键(Users.Id) | 索引 | 被申请人 | / | +| Created | DATETIME | 是 | 1970/1/1 | / | / | 申请时间 | / | +| Description | TEXT | 否 | xxx申请添加你为好友 | / | / | 申请附言 | / | +| State | TINYINT | 是 | 0 | / | / | 申请状态(0:待通过,1:拒绝,2:同意,3:拉黑) | / | + +### 表名:Devices + +#### 表说明:用户设备 + +| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | +| --------- | -------- | -------- | -------- | -------------- | --------- | ---------------------------------------------------- | ------ | +| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | +| UserId | INT | 是 | / | 外键(Users.Id) | 索引 | 设备所属用户 | / | +| DType | TINYINT | 是 | / | / | / | 设备类型(
0:Android,1:Ios,2:PC,3:Pad,4:未知) | 0 | +| LastLogin | DATETIME | 是 | 1970/1/1 | / | / | 最后一次登录 | / | + +### 表名:Login_Log + +#### 表说明:登录日志 + +| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | +| ------- | -------- | -------- | -------- | -------------- | --------- | ---------------------------------------- | ------ | +| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | +| DType | TINYINT | 是 | / | / | / | 设备类型(通Devices/DType) | / | +| Logined | DATETIME | 是 | 1970/1/1 | / | / | 登录时间 | / | +| UserId | INT | 是 | / | 外键(Users.Id) | / | 登录用户 | / | +| State | TINYINT | 是 | 0 | / | / | 登录状态(0:登陆成功,1:未验证,2:已被拒绝) | / | + +### 表名:Admins + +#### 表说明:系统管理员 + +| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | +| -------- | ----------- | -------- | -------- | ---------------- | --------- | ----------------------- | ------ | +| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | +| Username | VARCHAR(50) | 是 | / | / | / | 用户名 | / | +| Password | VARCHAR(50) | 是 | / | / | / | 密码 | / | +| RoleId | INT | 是 | / | 外键(Roles.Id) | 索引 | 角色 | / | +| State | TINYINT | 是 | 0 | / | / | 状态(0:正常,2:封禁) | / | +| Created | DATETIME | 是 | 1970/1/1 | / | / | 创建时间 | / | +| Updated | DATETIME | 是 | 1970/1/1 | / | / | 更新时间 | / | + +### 表名:Roles + +#### 表说明:角色 + +| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | +| ----------- | ----------- | -------- | -------- | ------- | --------- | -------- | ------ | +| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | +| Name | VARCHAR(20) | 是 | / | / | / | 角色名称 | / | +| Description | TEXT | 是 | 空字符串 | / | / | 角色描述 | / | +| Created | DATETIME | 是 | 1970/1/1 | / | / | 创建时间 | / | + +### 表名:Permissions + +#### 表说明:权限 + +| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | +| ------- | ----------- | -------- | ------ | ------- | --------- | ----------------------------- | ------ | +| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | +| PType | INT | 是 | 0 | / | / | 权限类型(0:增,1:删,2:改,3:查) | / | +| Name | VARCHAR(50) | 是 | / | / | / | 权限名称 | / | +| Code | INT | 是 | / | / | / | 权限编码 | / | +| Created | DATETIME | 是 | / | / | / | 创建时间 | / | + +### 表名:PermissionARole + +#### 表说明:权限角色关联 + +| 字段名 | 数据类型 | 是否必填 | 默认值 | 主/外键 | 约束/索引 | 字段说明 | 示例值 | +| ------------ | -------- | -------- | ------ | ---------------------- | --------- | -------- | ------ | +| Id | INT | 是 | / | 主键 | 索引 | 主键自增 | 1 | +| RoleId | INT | 是 | / | 外键(Roles.Id) | 索引 | 角色 | / | | PermissionId | INT | 是 | / | 外键(Permissions.Id) | 索引 | 权限 | / | \ No newline at end of file diff --git a/系统架构设计.md b/docs/系统架构设计.md similarity index 100% rename from 系统架构设计.md rename to docs/系统架构设计.md diff --git a/需求规格说明书(SRS).md b/docs/需求规格说明书(SRS).md similarity index 94% rename from 需求规格说明书(SRS).md rename to docs/需求规格说明书(SRS).md index 9cf0165..fcc80dc 100644 --- a/需求规格说明书(SRS).md +++ b/docs/需求规格说明书(SRS).md @@ -1,64 +1,64 @@ -# 需求规格说明书(SRS) - -## 1. 项目背景 -- #### 项目目标: - - 本项目旨在实现一个类似 QQ 的即时通讯系统,提供用户注册、好友聊天、群聊、文件传输等核心功能。 - - - 使用场景:学习练手 + 内部小团队沟通工具。 - -- #### 项目范围: - - 学习项目 - -- #### 业务价值: - - 学习项目 - -## 2. 用户需求 -- 普通用户:注册、登录、聊天、加好友 -- 管理员:封禁违规账号、管理群聊 -- 使用场景:1v1 聊天、群聊、发送文件、发送表情/图片等 - -## 3. 功能需求 -- ##### 3.1 账号系统 - - F-1 用户注册:支持手机号/邮箱注册,需验证唯一性。 - - F-2 用户登录:支持账号+密码、Token 鉴权。 - - F-3 用户资料:可修改头像、昵称、个性签名。 - - ##### 3.2 好友系统 - - F-4 添加好友:通过账号/手机号搜索并申请。 - - F-5 好友请求:系统通知对方,同意/拒绝。 - - F-6 删除好友、拉黑。 - - ##### 3.3 消息系统 - - F-7 单聊:支持文本、表情、图片、文件。 - - F-8 群聊:支持多人实时消息。 - - F-9 消息状态:已发送、已送达、已读(暂时只在数据库层面标记已读,不显示在客户端)。 - - F-10 消息管理:撤回、删除、搜索历史记录。 - - ##### 3.4 群聊功能 - - F-11 创建群聊:指定群名称,邀请成员。 - - F-12 群管理:踢人、设管理员、发布公告。 - - F-13 群人数上限:本期 500 人。 - - ##### 3.5 系统通知 - - F-14 好友申请通知。 - - F-15 群邀请通知。 - - F-16 新消息推送(WebSocket)。 - -## 4. 非功能需求 -- 实时性:消息延迟 ≤ 1 秒 -- 并发性:单群支持 ≥ 500 人在线聊天 -- 安全性:消息加密传输(WebSocket + TLS) -- 可扩展性:后端支持水平扩展(分布式 IM 服务器) ***此条暂不要求*** - -## 5. 约束与假设 -- 本期仅支持 Web 端(PC + H5),移动端后续开发 -- 音视频通话仅提供基础功能,不做美颜、录屏 - -## 6.验收标准 - -- 两个用户能互加好友并聊天。 -- 群聊消息在 500 人场景下稳定传递。 +# 需求规格说明书(SRS) + +## 1. 项目背景 +- #### 项目目标: + + 本项目旨在实现一个类似 QQ 的即时通讯系统,提供用户注册、好友聊天、群聊、文件传输等核心功能。 + + - 使用场景:学习练手 + 内部小团队沟通工具。 + +- #### 项目范围: + + 学习项目 + +- #### 业务价值: + + 学习项目 + +## 2. 用户需求 +- 普通用户:注册、登录、聊天、加好友 +- 管理员:封禁违规账号、管理群聊 +- 使用场景:1v1 聊天、群聊、发送文件、发送表情/图片等 + +## 3. 功能需求 +- ##### 3.1 账号系统 + - F-1 用户注册:支持手机号/邮箱注册,需验证唯一性。 + - F-2 用户登录:支持账号+密码、Token 鉴权。 + - F-3 用户资料:可修改头像、昵称、个性签名。 + + ##### 3.2 好友系统 + - F-4 添加好友:通过账号/手机号搜索并申请。 + - F-5 好友请求:系统通知对方,同意/拒绝。 + - F-6 删除好友、拉黑。 + + ##### 3.3 消息系统 + - F-7 单聊:支持文本、表情、图片、文件。 + - F-8 群聊:支持多人实时消息。 + - F-9 消息状态:已发送、已送达、已读(暂时只在数据库层面标记已读,不显示在客户端)。 + - F-10 消息管理:撤回、删除、搜索历史记录。 + + ##### 3.4 群聊功能 + - F-11 创建群聊:指定群名称,邀请成员。 + - F-12 群管理:踢人、设管理员、发布公告。 + - F-13 群人数上限:本期 500 人。 + + ##### 3.5 系统通知 + - F-14 好友申请通知。 + - F-15 群邀请通知。 + - F-16 新消息推送(WebSocket)。 + +## 4. 非功能需求 +- 实时性:消息延迟 ≤ 1 秒 +- 并发性:单群支持 ≥ 500 人在线聊天 +- 安全性:消息加密传输(WebSocket + TLS) +- 可扩展性:后端支持水平扩展(分布式 IM 服务器) ***此条暂不要求*** + +## 5. 约束与假设 +- 本期仅支持 Web 端(PC + H5),移动端后续开发 +- 音视频通话仅提供基础功能,不做美颜、录屏 + +## 6.验收标准 + +- 两个用户能互加好友并聊天。 +- 群聊消息在 500 人场景下稳定传递。 - 消息能在弱网环境下重试并成功送达。 \ No newline at end of file diff --git a/📘 WebSocket 通讯协议设计文档.md b/docs/📘 WebSocket 通讯协议设计文档.md similarity index 94% rename from 📘 WebSocket 通讯协议设计文档.md rename to docs/📘 WebSocket 通讯协议设计文档.md index d7e3946..2111fba 100644 --- a/📘 WebSocket 通讯协议设计文档.md +++ b/docs/📘 WebSocket 通讯协议设计文档.md @@ -1,285 +1,285 @@ -# 📘 WebSocket 通讯协议设计文档 - -## 1. 概述 - -本协议用于实现 **即时聊天(IM)系统的实时消息传输**。 - 客户端通过 WebSocket 连接后与服务器保持长连接,实现消息推送、状态同步、群聊与单聊。 - -**支持功能**: - -- 用户登录鉴权 -- 单聊消息发送/接收 -- 群聊消息发送/接收 -- 消息撤回、已读回执 -- 心跳保活与断线重连 -- 系统通知(好友请求、群邀请) - ------- - -## 2. 消息传输格式 - -### 2.1 基础消息结构(JSON) - -``` -{ - "type": "MESSAGE_TYPE", - "requestId": "string", // 客户端生成的请求ID,便于幂等 - "from": 1001, // 发送者ID - "to": 1002, // 接收者ID(单聊)或群ID(群聊) - "chatType": "single", // "single" | "group" - "contentType": "text", // "text" | "image" | "file" | "voice" | "system" - "content": "消息内容或文件URL", - "timestamp": 1700000000 // Unix时间戳 -} -``` - ------- - -### 2.2 常用 type 枚举 - -| type | 说明 | -| -------------- | ------------------------- | -| AUTH | 握手鉴权 | -| HEARTBEAT | 心跳保活 | -| MESSAGE | 普通聊天消息(单聊/群聊) | -| MESSAGE_ACK | 消息已读/送达回执 | -| MESSAGE_RECALL | 消息撤回 | -| FRIEND_REQUEST | 好友申请通知 | -| GROUP_INVITE | 群邀请通知 | -| SYSTEM_NOTICE | 系统公告/通知 | -| ERROR | 错误消息 | - ------- - -## 3. 握手与鉴权 - -### 3.1 客户端连接 - -``` -ws://example.com/ws?token=xxxx -``` - -- 客户端通过 Token 鉴权 -- 服务器验证 Token 后,返回 AUTH_SUCCESS 或 AUTH_FAIL - -### 3.2 服务端响应示例 - -**成功:** - -``` -{ - "type": "AUTH", - "status": "success", - "userId": 1001, - "timestamp": 1700000000 -} -``` - -**失败:** - -``` -{ - "type": "AUTH", - "status": "fail", - "code": 1006, - "message": "Token无效或过期" -} -``` - ------- - -## 4. 心跳机制 - -### 4.1 客户端发送 - -``` -{ - "type": "HEARTBEAT", - "timestamp": 1700000000 -} -``` - -### 4.2 服务器响应 - -``` -{ - "type": "HEARTBEAT", - "timestamp": 1700000000 -} -``` - -- **客户端**:每隔 30 秒发送一次心跳 -- **服务器**:若 2 倍心跳时间未收到消息,则断开连接 - ------- - -## 5. 消息传输 - -### 5.1 单聊消息 - -客户端发送: - -``` -{ - "type": "MESSAGE", - "requestId": "uuid-001", - "from": 1001, - "to": 1002, - "chatType": "single", - "contentType": "text", - "content": "你好", - "timestamp": 1700000000 -} -``` - -服务器推送给接收者: - -``` -{ - "type": "MESSAGE", - "messageId": 50001, - "from": 1001, - "to": 1002, - "chatType": "single", - "contentType": "text", - "content": "你好", - "timestamp": 1700000000 -} -``` - ------- - -### 5.2 群聊消息 - -``` -{ - "type": "MESSAGE", - "requestId": "uuid-002", - "from": 1001, - "to": 3001, // 群ID - "chatType": "group", - "contentType": "image", - "content": "http://img.example.com/xxx.jpg", - "timestamp": 1700000000 -} -``` - -服务器会 **推送到群成员列表(除了自己)**。 - ------- - -### 5.3 消息回执(MESSAGE_ACK) - -客户端收到消息后发送: - -``` -{ - "type": "MESSAGE_ACK", - "messageId": 50001, - "from": 1002, - "to": 1001, - "chatType": "single", - "status": "read", - "timestamp": 1700000000 -} -``` - -服务器更新消息状态,并可推送给发送方。 - ------- - -### 5.4 消息撤回(MESSAGE_RECALL) - -客户端请求撤回消息: - -``` -{ - "type": "MESSAGE_RECALL", - "messageId": 50001, - "from": 1001, - "to": 1002, - "chatType": "single", - "timestamp": 1700000010 -} -``` - -服务器验证是否允许撤回(时间限制、权限等),允许则推送给接收方: - -``` -{ - "type": "MESSAGE_RECALL", - "messageId": 50001, - "from": 1001, - "chatType": "single", - "status": "success", - "timestamp": 1700000010 -} -``` - ------- - -## 6. 好友 / 群邀请通知 - -### 6.1 好友申请(FRIEND_REQUEST) - -``` -{ - "type": "FRIEND_REQUEST", - "requestId": "uuid-003", - "from": 1001, - "to": 1002, - "content": "加个好友吧", - "timestamp": 1700000020 -} -``` - -### 6.2 群邀请(GROUP_INVITE) - -``` -{ - "type": "GROUP_INVITE", - "inviteId": "uuid-004", - "groupId": 3001, - "inviter": 1001, - "invitee": 1003, - "content": "邀请你加入群聊", - "timestamp": 1700000030 -} -``` - ------- - -## 7. 错误处理(ERROR) - -``` -{ - "type": "ERROR", - "code": 2300, - "message": "消息发送失败", - "requestId": "uuid-001", - "timestamp": 1700000040 -} -``` - -- **code** 对应响应 Code 规范 -- **requestId** 可帮助客户端确认失败的具体请求 - ------- - -## 8. 断线重连 - -- 客户端断线后,尝试每隔 5 秒重连一次 -- 重连成功后,重新发送 AUTH 消息进行鉴权 -- 重连后可请求 **未读消息同步**(message 表或 Redis 缓存) - ------- - -## 9. 附录:contentType 示例 - -| contentType | content 示例 | 描述 | -| ----------- | ---------------------------------- | ----------------- | -| text | "你好" | 文本消息 | -| image | "http://img.example.com/xxx.jpg" | 图片 URL | -| file | "http://file.example.com/xxx.pdf" | 文件 URL + 文件名 | -| voice | "http://audio.example.com/xxx.mp3" | 语音 URL + 时长 | +# 📘 WebSocket 通讯协议设计文档 + +## 1. 概述 + +本协议用于实现 **即时聊天(IM)系统的实时消息传输**。 + 客户端通过 WebSocket 连接后与服务器保持长连接,实现消息推送、状态同步、群聊与单聊。 + +**支持功能**: + +- 用户登录鉴权 +- 单聊消息发送/接收 +- 群聊消息发送/接收 +- 消息撤回、已读回执 +- 心跳保活与断线重连 +- 系统通知(好友请求、群邀请) + +------ + +## 2. 消息传输格式 + +### 2.1 基础消息结构(JSON) + +``` +{ + "type": "MESSAGE_TYPE", + "requestId": "string", // 客户端生成的请求ID,便于幂等 + "from": 1001, // 发送者ID + "to": 1002, // 接收者ID(单聊)或群ID(群聊) + "chatType": "single", // "single" | "group" + "contentType": "text", // "text" | "image" | "file" | "voice" | "system" + "content": "消息内容或文件URL", + "timestamp": 1700000000 // Unix时间戳 +} +``` + +------ + +### 2.2 常用 type 枚举 + +| type | 说明 | +| -------------- | ------------------------- | +| AUTH | 握手鉴权 | +| HEARTBEAT | 心跳保活 | +| MESSAGE | 普通聊天消息(单聊/群聊) | +| MESSAGE_ACK | 消息已读/送达回执 | +| MESSAGE_RECALL | 消息撤回 | +| FRIEND_REQUEST | 好友申请通知 | +| GROUP_INVITE | 群邀请通知 | +| SYSTEM_NOTICE | 系统公告/通知 | +| ERROR | 错误消息 | + +------ + +## 3. 握手与鉴权 + +### 3.1 客户端连接 + +``` +ws://example.com/ws?token=xxxx +``` + +- 客户端通过 Token 鉴权 +- 服务器验证 Token 后,返回 AUTH_SUCCESS 或 AUTH_FAIL + +### 3.2 服务端响应示例 + +**成功:** + +``` +{ + "type": "AUTH", + "status": "success", + "userId": 1001, + "timestamp": 1700000000 +} +``` + +**失败:** + +``` +{ + "type": "AUTH", + "status": "fail", + "code": 1006, + "message": "Token无效或过期" +} +``` + +------ + +## 4. 心跳机制 + +### 4.1 客户端发送 + +``` +{ + "type": "HEARTBEAT", + "timestamp": 1700000000 +} +``` + +### 4.2 服务器响应 + +``` +{ + "type": "HEARTBEAT", + "timestamp": 1700000000 +} +``` + +- **客户端**:每隔 30 秒发送一次心跳 +- **服务器**:若 2 倍心跳时间未收到消息,则断开连接 + +------ + +## 5. 消息传输 + +### 5.1 单聊消息 + +客户端发送: + +``` +{ + "type": "MESSAGE", + "requestId": "uuid-001", + "from": 1001, + "to": 1002, + "chatType": "single", + "contentType": "text", + "content": "你好", + "timestamp": 1700000000 +} +``` + +服务器推送给接收者: + +``` +{ + "type": "MESSAGE", + "messageId": 50001, + "from": 1001, + "to": 1002, + "chatType": "single", + "contentType": "text", + "content": "你好", + "timestamp": 1700000000 +} +``` + +------ + +### 5.2 群聊消息 + +``` +{ + "type": "MESSAGE", + "requestId": "uuid-002", + "from": 1001, + "to": 3001, // 群ID + "chatType": "group", + "contentType": "image", + "content": "http://img.example.com/xxx.jpg", + "timestamp": 1700000000 +} +``` + +服务器会 **推送到群成员列表(除了自己)**。 + +------ + +### 5.3 消息回执(MESSAGE_ACK) + +客户端收到消息后发送: + +``` +{ + "type": "MESSAGE_ACK", + "messageId": 50001, + "from": 1002, + "to": 1001, + "chatType": "single", + "status": "read", + "timestamp": 1700000000 +} +``` + +服务器更新消息状态,并可推送给发送方。 + +------ + +### 5.4 消息撤回(MESSAGE_RECALL) + +客户端请求撤回消息: + +``` +{ + "type": "MESSAGE_RECALL", + "messageId": 50001, + "from": 1001, + "to": 1002, + "chatType": "single", + "timestamp": 1700000010 +} +``` + +服务器验证是否允许撤回(时间限制、权限等),允许则推送给接收方: + +``` +{ + "type": "MESSAGE_RECALL", + "messageId": 50001, + "from": 1001, + "chatType": "single", + "status": "success", + "timestamp": 1700000010 +} +``` + +------ + +## 6. 好友 / 群邀请通知 + +### 6.1 好友申请(FRIEND_REQUEST) + +``` +{ + "type": "FRIEND_REQUEST", + "requestId": "uuid-003", + "from": 1001, + "to": 1002, + "content": "加个好友吧", + "timestamp": 1700000020 +} +``` + +### 6.2 群邀请(GROUP_INVITE) + +``` +{ + "type": "GROUP_INVITE", + "inviteId": "uuid-004", + "groupId": 3001, + "inviter": 1001, + "invitee": 1003, + "content": "邀请你加入群聊", + "timestamp": 1700000030 +} +``` + +------ + +## 7. 错误处理(ERROR) + +``` +{ + "type": "ERROR", + "code": 2300, + "message": "消息发送失败", + "requestId": "uuid-001", + "timestamp": 1700000040 +} +``` + +- **code** 对应响应 Code 规范 +- **requestId** 可帮助客户端确认失败的具体请求 + +------ + +## 8. 断线重连 + +- 客户端断线后,尝试每隔 5 秒重连一次 +- 重连成功后,重新发送 AUTH 消息进行鉴权 +- 重连后可请求 **未读消息同步**(message 表或 Redis 缓存) + +------ + +## 9. 附录:contentType 示例 + +| contentType | content 示例 | 描述 | +| ----------- | ---------------------------------- | ----------------- | +| text | "你好" | 文本消息 | +| image | "http://img.example.com/xxx.jpg" | 图片 URL | +| file | "http://file.example.com/xxx.pdf" | 文件 URL + 文件名 | +| voice | "http://audio.example.com/xxx.mp3" | 语音 URL + 时长 | | system | "用户xxx加入群" | 系统消息 | \ No newline at end of file diff --git a/📘 接口响应 Code 设计文档.md b/docs/📘 接口响应 Code 设计文档.md similarity index 100% rename from 📘 接口响应 Code 设计文档.md rename to docs/📘 接口响应 Code 设计文档.md diff --git a/frontend/web/.editorconfig b/frontend/web/.editorconfig new file mode 100644 index 0000000..3b510aa --- /dev/null +++ b/frontend/web/.editorconfig @@ -0,0 +1,8 @@ +[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue,css,scss,sass,less,styl}] +charset = utf-8 +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true +end_of_line = lf +max_line_length = 100 diff --git a/frontend/web/.gitattributes b/frontend/web/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/frontend/web/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/frontend/web/.gitignore b/frontend/web/.gitignore new file mode 100644 index 0000000..8ee54e8 --- /dev/null +++ b/frontend/web/.gitignore @@ -0,0 +1,30 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo diff --git a/frontend/web/.prettierrc.json b/frontend/web/.prettierrc.json new file mode 100644 index 0000000..29a2402 --- /dev/null +++ b/frontend/web/.prettierrc.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://json.schemastore.org/prettierrc", + "semi": false, + "singleQuote": true, + "printWidth": 100 +} diff --git a/frontend/web/.vscode/extensions.json b/frontend/web/.vscode/extensions.json new file mode 100644 index 0000000..a06a8c6 --- /dev/null +++ b/frontend/web/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "Vue.volar", + "vitest.explorer", + "dbaeumer.vscode-eslint", + "EditorConfig.EditorConfig", + "esbenp.prettier-vscode" + ] +} diff --git a/frontend/web/README.md b/frontend/web/README.md new file mode 100644 index 0000000..d3b2938 --- /dev/null +++ b/frontend/web/README.md @@ -0,0 +1,50 @@ +# web + +This template should help get you started developing with Vue 3 in Vite. + +## Recommended IDE Setup + +[VS Code](https://code.visualstudio.com/) + [Vue (Official)](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur). + +## Recommended Browser Setup + +- Chromium-based browsers (Chrome, Edge, Brave, etc.): + - [Vue.js devtools](https://chromewebstore.google.com/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd) + - [Turn on Custom Object Formatter in Chrome DevTools](http://bit.ly/object-formatters) +- Firefox: + - [Vue.js devtools](https://addons.mozilla.org/en-US/firefox/addon/vue-js-devtools/) + - [Turn on Custom Object Formatter in Firefox DevTools](https://fxdx.dev/firefox-devtools-custom-object-formatters/) + +## Customize configuration + +See [Vite Configuration Reference](https://vite.dev/config/). + +## Project Setup + +```sh +npm install +``` + +### Compile and Hot-Reload for Development + +```sh +npm run dev +``` + +### Compile and Minify for Production + +```sh +npm run build +``` + +### Run Unit Tests with [Vitest](https://vitest.dev/) + +```sh +npm run test:unit +``` + +### Lint with [ESLint](https://eslint.org/) + +```sh +npm run lint +``` diff --git a/frontend/web/eslint.config.js b/frontend/web/eslint.config.js new file mode 100644 index 0000000..3867729 --- /dev/null +++ b/frontend/web/eslint.config.js @@ -0,0 +1,32 @@ +import { defineConfig, globalIgnores } from 'eslint/config' +import globals from 'globals' +import js from '@eslint/js' +import pluginVue from 'eslint-plugin-vue' +import pluginVitest from '@vitest/eslint-plugin' +import skipFormatting from '@vue/eslint-config-prettier/skip-formatting' + +export default defineConfig([ + { + name: 'app/files-to-lint', + files: ['**/*.{js,mjs,jsx,vue}'], + }, + + globalIgnores(['**/dist/**', '**/dist-ssr/**', '**/coverage/**']), + + { + languageOptions: { + globals: { + ...globals.browser, + }, + }, + }, + + js.configs.recommended, + ...pluginVue.configs['flat/essential'], + + { + ...pluginVitest.configs.recommended, + files: ['src/**/__tests__/*'], + }, + skipFormatting, +]) diff --git a/frontend/web/index.html b/frontend/web/index.html new file mode 100644 index 0000000..b19040a --- /dev/null +++ b/frontend/web/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite App + + +
+ + + diff --git a/frontend/web/jsconfig.json b/frontend/web/jsconfig.json new file mode 100644 index 0000000..5a1f2d2 --- /dev/null +++ b/frontend/web/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "paths": { + "@/*": ["./src/*"] + } + }, + "exclude": ["node_modules", "dist"] +} diff --git a/frontend/web/package-lock.json b/frontend/web/package-lock.json new file mode 100644 index 0000000..8837169 --- /dev/null +++ b/frontend/web/package-lock.json @@ -0,0 +1,6334 @@ +{ + "name": "web", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "web", + "version": "0.0.0", + "dependencies": { + "pinia": "^3.0.3", + "vue": "^3.5.22", + "vue-router": "^4.5.1" + }, + "devDependencies": { + "@eslint/js": "^9.33.0", + "@vitejs/plugin-vue": "^6.0.1", + "@vitest/eslint-plugin": "^1.3.13", + "@vue/eslint-config-prettier": "^10.2.0", + "@vue/test-utils": "^2.4.6", + "eslint": "^9.33.0", + "eslint-plugin-vue": "~10.4.0", + "globals": "^16.3.0", + "jsdom": "^27.0.0", + "prettier": "3.6.2", + "vite": "^7.1.7", + "vite-plugin-vue-devtools": "^8.0.2", + "vitest": "^3.2.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.0.5.tgz", + "integrity": "sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "lru-cache": "^11.2.1" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.6.2.tgz", + "integrity": "sha512-+AG0jN9HTwfDLBhjhX1FKi6zlIAc/YGgEHlN/OMaHD1pOPFsC5CpYQpLkPX0aFjyaVmoq9330cQDCU4qnSL1qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.1.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.2.2" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", + "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-decorators": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", + "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", + "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.14.tgz", + "integrity": "sha512-zSlIxa20WvMojjpCSy8WrNpcZ61RqfTfX3XTaOeVlGJrt/8HF3YbzgFZa01yTbT4GWQLwfTcC3EB8i3XnB647Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", + "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", + "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", + "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz", + "integrity": "sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", + "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", + "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", + "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", + "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", + "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", + "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", + "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", + "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", + "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", + "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", + "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", + "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", + "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", + "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", + "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", + "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", + "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", + "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", + "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", + "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", + "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", + "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@types/chai": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", + "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz", + "integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.46.0", + "@typescript-eslint/types": "^8.46.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz", + "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz", + "integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz", + "integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz", + "integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.46.0", + "@typescript-eslint/tsconfig-utils": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz", + "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz", + "integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz", + "integrity": "sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-beta.29" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitest/eslint-plugin": { + "version": "1.3.17", + "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.3.17.tgz", + "integrity": "sha512-MyziaQ3Z3r5Z0aNV2Q4yWVQtJgtculZlGb03HLDYMnvj/5xyGYzPoQO1ZzRFh1LR8KFf4ppTmLQJ/W1CvluLTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "^8.41.0", + "@typescript-eslint/utils": "^8.24.1" + }, + "peerDependencies": { + "eslint": ">= 8.57.0", + "typescript": ">= 5.0.0", + "vitest": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.2.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz", + "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz", + "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@vue/babel-helper-vue-transform-on": "1.5.0", + "@vue/babel-plugin-resolve-type": "1.5.0", + "@vue/shared": "^3.5.18" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz", + "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.0", + "@vue/compiler-sfc": "^3.5.18" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.22.tgz", + "integrity": "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "@vue/shared": "3.5.22", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz", + "integrity": "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.22.tgz", + "integrity": "sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "@vue/compiler-core": "3.5.22", + "@vue/compiler-dom": "3.5.22", + "@vue/compiler-ssr": "3.5.22", + "@vue/shared": "3.5.22", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.19", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.22.tgz", + "integrity": "sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.7.tgz", + "integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.7" + } + }, + "node_modules/@vue/devtools-core": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-8.0.2.tgz", + "integrity": "sha512-V7eKTTHoS6KfK8PSGMLZMhGv/9yNDrmv6Qc3r71QILulnzPnqK2frsTyx3e2MrhdUZnENPEm6hcb4z0GZOqNhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.0.2", + "@vue/devtools-shared": "^8.0.2", + "mitt": "^3.0.1", + "nanoid": "^5.1.5", + "pathe": "^2.0.3", + "vite-hot-client": "^2.1.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-core/node_modules/@vue/devtools-kit": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.0.2.tgz", + "integrity": "sha512-yjZKdEmhJzQqbOh4KFBfTOQjDPMrjjBNCnHBvnTGJX+YLAqoUtY2J+cg7BE+EA8KUv8LprECq04ts75wCoIGWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.0.2", + "birpc": "^2.5.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^2.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-core/node_modules/@vue/devtools-shared": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.0.2.tgz", + "integrity": "sha512-mLU0QVdy5Lp40PMGSixDw/Kbd6v5dkQXltd2r+mdVQV7iUog2NlZuLxFZApFZ/mObUBDhoCpf0T3zF2FWWdeHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/devtools-core/node_modules/nanoid": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", + "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@vue/devtools-core/node_modules/perfect-debounce": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.0.0.tgz", + "integrity": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz", + "integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.7", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz", + "integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/eslint-config-prettier": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-10.2.0.tgz", + "integrity": "sha512-GL3YBLwv/+b86yHcNNfPJxOTtVFJ4Mbc9UU3zR+KVoG7SwGTjPT+32fXamscNumElhcpXW3mT0DgzS9w32S7Bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-prettier": "^5.2.2" + }, + "peerDependencies": { + "eslint": ">= 8.21.0", + "prettier": ">= 3.0.0" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.22.tgz", + "integrity": "sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.22.tgz", + "integrity": "sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.22.tgz", + "integrity": "sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.22", + "@vue/runtime-core": "3.5.22", + "@vue/shared": "3.5.22", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.22.tgz", + "integrity": "sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.22", + "@vue/shared": "3.5.22" + }, + "peerDependencies": { + "vue": "3.5.22" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.22.tgz", + "integrity": "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==", + "license": "MIT" + }, + "node_modules/@vue/test-utils": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.6.tgz", + "integrity": "sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-beautify": "^1.14.9", + "vue-component-type-helpers": "^2.0.0" + } + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz", + "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.16", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.16.tgz", + "integrity": "sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/birpc": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.6.1.tgz", + "integrity": "sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001750", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001750.tgz", + "integrity": "sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssstyle": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.1.tgz", + "integrity": "sha512-g5PC9Aiph9eiczFpcgUhd9S4UUO3F+LHGRIi5NUMZ+4xtoIYbHNZwZnWA2JsFGe8OU8nl4WyaEFiZuGuxlutJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^4.0.3", + "@csstools/css-syntax-patches-for-csstree": "^1.0.14", + "css-tree": "^3.1.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-6.0.0.tgz", + "integrity": "sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^15.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/editorconfig": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", + "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/editorconfig/node_modules/minimatch": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.234", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.234.tgz", + "integrity": "sha512-RXfEp2x+VRYn8jbKfQlRImzoJU01kyDvVPBmG39eU2iuRVhuS6vQNocB8J0/8GrIMLnPzgz4eW6WiRnJkTuNWg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", + "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.4.0", + "@eslint/core": "^0.16.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.37.0", + "@eslint/plugin-kit": "^0.4.0", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", + "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.11.7" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vue": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.4.0.tgz", + "integrity": "sha512-K6tP0dW8FJVZLQxa2S7LcE1lLw3X8VvB3t887Q6CLrFVxHYBXGANbXvwNzYIu6Ughx1bSJ5BDT0YB3ybPT39lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.15", + "semver": "^7.6.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "vue-eslint-parser": "^10.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/parser": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.0.tgz", + "integrity": "sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/expect-type": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", + "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-beautify": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz", + "integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.4", + "glob": "^10.4.2", + "js-cookie": "^3.0.5", + "nopt": "^7.2.1" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.0.0.tgz", + "integrity": "sha512-lIHeR1qlIRrIN5VMccd8tI2Sgw6ieYXSVktcSHaNe3Z5nE/tcPQYQWOq00wxMvYOsz+73eAkNenVvmPC6bba9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/dom-selector": "^6.5.4", + "cssstyle": "^5.3.0", + "data-urls": "^6.0.0", + "decimal.js": "^10.5.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "parse5": "^7.3.0", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^15.0.0", + "ws": "^8.18.2", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", + "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pinia": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.3.tgz", + "integrity": "sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^7.7.2" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.4.4", + "vue": "^2.7.0 || ^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-ms": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", + "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true, + "license": "ISC" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", + "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.4", + "@rollup/rollup-android-arm64": "4.52.4", + "@rollup/rollup-darwin-arm64": "4.52.4", + "@rollup/rollup-darwin-x64": "4.52.4", + "@rollup/rollup-freebsd-arm64": "4.52.4", + "@rollup/rollup-freebsd-x64": "4.52.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", + "@rollup/rollup-linux-arm-musleabihf": "4.52.4", + "@rollup/rollup-linux-arm64-gnu": "4.52.4", + "@rollup/rollup-linux-arm64-musl": "4.52.4", + "@rollup/rollup-linux-loong64-gnu": "4.52.4", + "@rollup/rollup-linux-ppc64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-musl": "4.52.4", + "@rollup/rollup-linux-s390x-gnu": "4.52.4", + "@rollup/rollup-linux-x64-gnu": "4.52.4", + "@rollup/rollup-linux-x64-musl": "4.52.4", + "@rollup/rollup-openharmony-arm64": "4.52.4", + "@rollup/rollup-win32-arm64-msvc": "4.52.4", + "@rollup/rollup-win32-ia32-msvc": "4.52.4", + "@rollup/rollup-win32-x64-gnu": "4.52.4", + "@rollup/rollup-win32-x64-msvc": "4.52.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "license": "MIT", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/synckit": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.17.tgz", + "integrity": "sha512-Y1KQBgDd/NUc+LfOtKS6mNsC9CCaH+m2P1RoIZy7RAPo3C3/t8X45+zgut31cRZtZ3xKPjfn3TkGTrctC2TQIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.17" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.17.tgz", + "integrity": "sha512-DieYoGrP78PWKsrXr8MZwtQ7GLCUeLxihtjC1jZsW1DnvSMdKPitJSe8OSYDM2u5H6g3kWJZpePqkp43TfLh0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", + "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unplugin-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.1.tgz", + "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/unplugin-utils/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", + "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-dev-rpc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vite-dev-rpc/-/vite-dev-rpc-1.1.0.tgz", + "integrity": "sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==", + "dev": true, + "license": "MIT", + "dependencies": { + "birpc": "^2.4.0", + "vite-hot-client": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0" + } + }, + "node_modules/vite-hot-client": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-2.1.0.tgz", + "integrity": "sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" + } + }, + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-plugin-inspect": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-11.3.3.tgz", + "integrity": "sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansis": "^4.1.0", + "debug": "^4.4.1", + "error-stack-parser-es": "^1.0.5", + "ohash": "^2.0.11", + "open": "^10.2.0", + "perfect-debounce": "^2.0.0", + "sirv": "^3.0.1", + "unplugin-utils": "^0.3.0", + "vite-dev-rpc": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/vite-plugin-inspect/node_modules/perfect-debounce": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.0.0.tgz", + "integrity": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite-plugin-vue-devtools": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-8.0.2.tgz", + "integrity": "sha512-1069qvMBcyAu3yXQlvYrkwoyLOk0lSSR/gTKy/vy+Det7TXnouGei6ZcKwr5TIe938v/14oLlp0ow6FSJkkORA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-core": "^8.0.2", + "@vue/devtools-kit": "^8.0.2", + "@vue/devtools-shared": "^8.0.2", + "execa": "^9.6.0", + "sirv": "^3.0.2", + "vite-plugin-inspect": "^11.3.3", + "vite-plugin-vue-inspector": "^5.3.2" + }, + "engines": { + "node": ">=v14.21.3" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0-0" + } + }, + "node_modules/vite-plugin-vue-devtools/node_modules/@vue/devtools-kit": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.0.2.tgz", + "integrity": "sha512-yjZKdEmhJzQqbOh4KFBfTOQjDPMrjjBNCnHBvnTGJX+YLAqoUtY2J+cg7BE+EA8KUv8LprECq04ts75wCoIGWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.0.2", + "birpc": "^2.5.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^2.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/vite-plugin-vue-devtools/node_modules/@vue/devtools-shared": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.0.2.tgz", + "integrity": "sha512-mLU0QVdy5Lp40PMGSixDw/Kbd6v5dkQXltd2r+mdVQV7iUog2NlZuLxFZApFZ/mObUBDhoCpf0T3zF2FWWdeHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/vite-plugin-vue-devtools/node_modules/perfect-debounce": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.0.0.tgz", + "integrity": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite-plugin-vue-inspector": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.3.2.tgz", + "integrity": "sha512-YvEKooQcSiBTAs0DoYLfefNja9bLgkFM7NI2b07bE2SruuvX0MEa9cMaxjKVMkeCp5Nz9FRIdcN1rOdFVBeL6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.0", + "@babel/plugin-proposal-decorators": "^7.23.0", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.22.15", + "@vue/babel-plugin-jsx": "^1.1.5", + "@vue/compiler-dom": "^3.3.4", + "kolorist": "^1.8.0", + "magic-string": "^0.30.4" + }, + "peerDependencies": { + "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vitest": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vue": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.22.tgz", + "integrity": "sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.22", + "@vue/compiler-sfc": "3.5.22", + "@vue/runtime-dom": "3.5.22", + "@vue/server-renderer": "3.5.22", + "@vue/shared": "3.5.22" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-component-type-helpers": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.2.12.tgz", + "integrity": "sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue-eslint-parser": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.2.0.tgz", + "integrity": "sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "^4.4.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.6.0", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-router": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.1.tgz", + "integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.0.tgz", + "integrity": "sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-15.1.0.tgz", + "integrity": "sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/frontend/web/package.json b/frontend/web/package.json new file mode 100644 index 0000000..65de14c --- /dev/null +++ b/frontend/web/package.json @@ -0,0 +1,37 @@ +{ + "name": "web", + "version": "0.0.0", + "private": true, + "type": "module", + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "test:unit": "vitest", + "lint": "eslint . --fix", + "format": "prettier --write src/" + }, + "dependencies": { + "pinia": "^3.0.3", + "vue": "^3.5.22", + "vue-router": "^4.5.1" + }, + "devDependencies": { + "@eslint/js": "^9.33.0", + "@vitejs/plugin-vue": "^6.0.1", + "@vitest/eslint-plugin": "^1.3.13", + "@vue/eslint-config-prettier": "^10.2.0", + "@vue/test-utils": "^2.4.6", + "eslint": "^9.33.0", + "eslint-plugin-vue": "~10.4.0", + "globals": "^16.3.0", + "jsdom": "^27.0.0", + "prettier": "3.6.2", + "vite": "^7.1.7", + "vite-plugin-vue-devtools": "^8.0.2", + "vitest": "^3.2.4" + } +} diff --git a/frontend/web/public/favicon.ico b/frontend/web/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/frontend/web/src/App.vue b/frontend/web/src/App.vue new file mode 100644 index 0000000..6ec9f60 --- /dev/null +++ b/frontend/web/src/App.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/web/src/__tests__/App.spec.js b/frontend/web/src/__tests__/App.spec.js new file mode 100644 index 0000000..5b17801 --- /dev/null +++ b/frontend/web/src/__tests__/App.spec.js @@ -0,0 +1,11 @@ +import { describe, it, expect } from 'vitest' + +import { mount } from '@vue/test-utils' +import App from '../App.vue' + +describe('App', () => { + it('mounts renders properly', () => { + const wrapper = mount(App) + expect(wrapper.text()).toContain('You did it!') + }) +}) diff --git a/frontend/web/src/main.js b/frontend/web/src/main.js new file mode 100644 index 0000000..fda1e6e --- /dev/null +++ b/frontend/web/src/main.js @@ -0,0 +1,12 @@ +import { createApp } from 'vue' +import { createPinia } from 'pinia' + +import App from './App.vue' +import router from './router' + +const app = createApp(App) + +app.use(createPinia()) +app.use(router) + +app.mount('#app') diff --git a/frontend/web/src/router/index.js b/frontend/web/src/router/index.js new file mode 100644 index 0000000..e1eab52 --- /dev/null +++ b/frontend/web/src/router/index.js @@ -0,0 +1,8 @@ +import { createRouter, createWebHistory } from 'vue-router' + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes: [], +}) + +export default router diff --git a/frontend/web/src/stores/counter.js b/frontend/web/src/stores/counter.js new file mode 100644 index 0000000..b6757ba --- /dev/null +++ b/frontend/web/src/stores/counter.js @@ -0,0 +1,12 @@ +import { ref, computed } from 'vue' +import { defineStore } from 'pinia' + +export const useCounterStore = defineStore('counter', () => { + const count = ref(0) + const doubleCount = computed(() => count.value * 2) + function increment() { + count.value++ + } + + return { count, doubleCount, increment } +}) diff --git a/frontend/web/vite.config.js b/frontend/web/vite.config.js new file mode 100644 index 0000000..4217010 --- /dev/null +++ b/frontend/web/vite.config.js @@ -0,0 +1,18 @@ +import { fileURLToPath, URL } from 'node:url' + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import vueDevTools from 'vite-plugin-vue-devtools' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + vueDevTools(), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + }, + }, +}) diff --git a/frontend/web/vitest.config.js b/frontend/web/vitest.config.js new file mode 100644 index 0000000..c328717 --- /dev/null +++ b/frontend/web/vitest.config.js @@ -0,0 +1,14 @@ +import { fileURLToPath } from 'node:url' +import { mergeConfig, defineConfig, configDefaults } from 'vitest/config' +import viteConfig from './vite.config' + +export default mergeConfig( + viteConfig, + defineConfig({ + test: { + environment: 'jsdom', + exclude: [...configDefaults.exclude, 'e2e/**'], + root: fileURLToPath(new URL('./', import.meta.url)), + }, + }), +)