diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..b905291 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "datenlord.github.io", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/zh-cn/assets/cover-07c14bd5.jpg b/zh-cn/assets/cover-07c14bd5.jpg deleted file mode 100644 index cbb7255..0000000 Binary files a/zh-cn/assets/cover-07c14bd5.jpg and /dev/null differ diff --git a/zh-cn/assets/cover-5856255d.png b/zh-cn/assets/cover-5856255d.png new file mode 100644 index 0000000..f102e37 Binary files /dev/null and b/zh-cn/assets/cover-5856255d.png differ diff --git a/zh-cn/assets/cover-7357bfdb.png b/zh-cn/assets/cover-7357bfdb.png new file mode 100644 index 0000000..88a98fe Binary files /dev/null and b/zh-cn/assets/cover-7357bfdb.png differ diff --git a/zh-cn/assets/cover-b2241eaf.png b/zh-cn/assets/cover-b2241eaf.png new file mode 100644 index 0000000..80b1fa3 Binary files /dev/null and b/zh-cn/assets/cover-b2241eaf.png differ diff --git a/zh-cn/assets/image-3a1a0ef6.png b/zh-cn/assets/image-3a1a0ef6.png new file mode 100644 index 0000000..3b2dd6e Binary files /dev/null and b/zh-cn/assets/image-3a1a0ef6.png differ diff --git a/zh-cn/assets/image-8a82c950.png b/zh-cn/assets/image-8a82c950.png new file mode 100644 index 0000000..7646b96 Binary files /dev/null and b/zh-cn/assets/image-8a82c950.png differ diff --git a/zh-cn/assets/image-8e31ea63.png b/zh-cn/assets/image-8e31ea63.png new file mode 100644 index 0000000..0bc8807 Binary files /dev/null and b/zh-cn/assets/image-8e31ea63.png differ diff --git a/zh-cn/assets/image-d0c27c17.png b/zh-cn/assets/image-d0c27c17.png new file mode 100644 index 0000000..26d95db Binary files /dev/null and b/zh-cn/assets/image-d0c27c17.png differ diff --git a/zh-cn/assets/image-ee9f9238.png b/zh-cn/assets/image-ee9f9238.png new file mode 100644 index 0000000..f006a6c Binary files /dev/null and b/zh-cn/assets/image-ee9f9238.png differ diff --git a/zh-cn/assets/image-f331755a.png b/zh-cn/assets/image-f331755a.png new file mode 100644 index 0000000..1747713 Binary files /dev/null and b/zh-cn/assets/image-f331755a.png differ diff --git a/zh-cn/assets/image1-3fca9c88.png b/zh-cn/assets/image1-3fca9c88.png new file mode 100644 index 0000000..59c9acc Binary files /dev/null and b/zh-cn/assets/image1-3fca9c88.png differ diff --git a/zh-cn/assets/image1-57ced994.png b/zh-cn/assets/image1-57ced994.png new file mode 100644 index 0000000..d0f940a Binary files /dev/null and b/zh-cn/assets/image1-57ced994.png differ diff --git a/zh-cn/assets/image1-6caf9701.png b/zh-cn/assets/image1-6caf9701.png new file mode 100644 index 0000000..e238d29 Binary files /dev/null and b/zh-cn/assets/image1-6caf9701.png differ diff --git a/zh-cn/assets/image1-a156153e.png b/zh-cn/assets/image1-a156153e.png new file mode 100644 index 0000000..434634b Binary files /dev/null and b/zh-cn/assets/image1-a156153e.png differ diff --git a/zh-cn/assets/image1-a88ec652.jpg b/zh-cn/assets/image1-a88ec652.jpg deleted file mode 100644 index a9cee69..0000000 Binary files a/zh-cn/assets/image1-a88ec652.jpg and /dev/null differ diff --git a/zh-cn/assets/image1-b94c1c7d.png b/zh-cn/assets/image1-b94c1c7d.png new file mode 100644 index 0000000..218b78d Binary files /dev/null and b/zh-cn/assets/image1-b94c1c7d.png differ diff --git a/zh-cn/assets/image1-c15bea92.png b/zh-cn/assets/image1-c15bea92.png deleted file mode 100644 index cac0154..0000000 Binary files a/zh-cn/assets/image1-c15bea92.png and /dev/null differ diff --git a/zh-cn/assets/image1-cce42aaf.png b/zh-cn/assets/image1-cce42aaf.png new file mode 100644 index 0000000..4b0db7e Binary files /dev/null and b/zh-cn/assets/image1-cce42aaf.png differ diff --git a/zh-cn/assets/image10-0e887e18.png b/zh-cn/assets/image10-0e887e18.png new file mode 100644 index 0000000..7a78426 Binary files /dev/null and b/zh-cn/assets/image10-0e887e18.png differ diff --git a/zh-cn/assets/image10-20f4aa92.png b/zh-cn/assets/image10-20f4aa92.png new file mode 100644 index 0000000..6a2bced Binary files /dev/null and b/zh-cn/assets/image10-20f4aa92.png differ diff --git a/zh-cn/assets/image2-064a4792.png b/zh-cn/assets/image2-064a4792.png new file mode 100644 index 0000000..ff5a038 Binary files /dev/null and b/zh-cn/assets/image2-064a4792.png differ diff --git a/zh-cn/assets/image2-0d688c12.png b/zh-cn/assets/image2-0d688c12.png deleted file mode 100644 index 54bbfc0..0000000 Binary files a/zh-cn/assets/image2-0d688c12.png and /dev/null differ diff --git a/zh-cn/assets/image2-4b4682e9.png b/zh-cn/assets/image2-4b4682e9.png new file mode 100644 index 0000000..1320dd7 Binary files /dev/null and b/zh-cn/assets/image2-4b4682e9.png differ diff --git a/zh-cn/assets/image2-9e714392.png b/zh-cn/assets/image2-9e714392.png new file mode 100644 index 0000000..c2be699 Binary files /dev/null and b/zh-cn/assets/image2-9e714392.png differ diff --git a/zh-cn/assets/image2-b0a4a464.png b/zh-cn/assets/image2-b0a4a464.png new file mode 100644 index 0000000..47de0ca Binary files /dev/null and b/zh-cn/assets/image2-b0a4a464.png differ diff --git a/zh-cn/assets/image2-d15c91e1.png b/zh-cn/assets/image2-d15c91e1.png new file mode 100644 index 0000000..171c92d Binary files /dev/null and b/zh-cn/assets/image2-d15c91e1.png differ diff --git a/zh-cn/assets/image2-fedcb560.png b/zh-cn/assets/image2-fedcb560.png new file mode 100644 index 0000000..c3ed917 Binary files /dev/null and b/zh-cn/assets/image2-fedcb560.png differ diff --git a/zh-cn/assets/image3-647653da.png b/zh-cn/assets/image3-647653da.png new file mode 100644 index 0000000..ceac5dd Binary files /dev/null and b/zh-cn/assets/image3-647653da.png differ diff --git a/zh-cn/assets/image3-71513577.png b/zh-cn/assets/image3-71513577.png new file mode 100644 index 0000000..c1ff6d0 Binary files /dev/null and b/zh-cn/assets/image3-71513577.png differ diff --git a/zh-cn/assets/image3-9e47728d.png b/zh-cn/assets/image3-9e47728d.png new file mode 100644 index 0000000..c600f55 Binary files /dev/null and b/zh-cn/assets/image3-9e47728d.png differ diff --git a/zh-cn/assets/image3-bf4f8777.png b/zh-cn/assets/image3-bf4f8777.png new file mode 100644 index 0000000..3ba5f84 Binary files /dev/null and b/zh-cn/assets/image3-bf4f8777.png differ diff --git a/zh-cn/assets/image3-e10b812e.png b/zh-cn/assets/image3-e10b812e.png new file mode 100644 index 0000000..e4450f8 Binary files /dev/null and b/zh-cn/assets/image3-e10b812e.png differ diff --git a/zh-cn/assets/image3-e7a83351.png b/zh-cn/assets/image3-e7a83351.png new file mode 100644 index 0000000..a3f4321 Binary files /dev/null and b/zh-cn/assets/image3-e7a83351.png differ diff --git a/zh-cn/assets/image4-97f5ce33.png b/zh-cn/assets/image4-97f5ce33.png new file mode 100644 index 0000000..72035de Binary files /dev/null and b/zh-cn/assets/image4-97f5ce33.png differ diff --git a/zh-cn/assets/image4-bfeb3386.png b/zh-cn/assets/image4-bfeb3386.png new file mode 100644 index 0000000..8c8d96e Binary files /dev/null and b/zh-cn/assets/image4-bfeb3386.png differ diff --git a/zh-cn/assets/image4-d81e7808.png b/zh-cn/assets/image4-d81e7808.png new file mode 100644 index 0000000..cdd7b06 Binary files /dev/null and b/zh-cn/assets/image4-d81e7808.png differ diff --git a/zh-cn/assets/image5-114ef16c.png b/zh-cn/assets/image5-114ef16c.png new file mode 100644 index 0000000..442cbaa Binary files /dev/null and b/zh-cn/assets/image5-114ef16c.png differ diff --git a/zh-cn/assets/image5-518dd716.png b/zh-cn/assets/image5-518dd716.png new file mode 100644 index 0000000..21b2c61 Binary files /dev/null and b/zh-cn/assets/image5-518dd716.png differ diff --git a/zh-cn/assets/image5-e5e2653f.png b/zh-cn/assets/image5-e5e2653f.png new file mode 100644 index 0000000..d8b1cc0 Binary files /dev/null and b/zh-cn/assets/image5-e5e2653f.png differ diff --git a/zh-cn/assets/image6-06237b2e.png b/zh-cn/assets/image6-06237b2e.png new file mode 100644 index 0000000..863777b Binary files /dev/null and b/zh-cn/assets/image6-06237b2e.png differ diff --git a/zh-cn/assets/image6-a1ac5aed.png b/zh-cn/assets/image6-a1ac5aed.png new file mode 100644 index 0000000..f0f3955 Binary files /dev/null and b/zh-cn/assets/image6-a1ac5aed.png differ diff --git a/zh-cn/assets/image6-f738e012.png b/zh-cn/assets/image6-f738e012.png new file mode 100644 index 0000000..ccfcad0 Binary files /dev/null and b/zh-cn/assets/image6-f738e012.png differ diff --git a/zh-cn/assets/image7-638b9fb3.png b/zh-cn/assets/image7-638b9fb3.png new file mode 100644 index 0000000..7579ac9 Binary files /dev/null and b/zh-cn/assets/image7-638b9fb3.png differ diff --git a/zh-cn/assets/image7-c22e37fd.png b/zh-cn/assets/image7-c22e37fd.png new file mode 100644 index 0000000..e648d65 Binary files /dev/null and b/zh-cn/assets/image7-c22e37fd.png differ diff --git a/zh-cn/assets/image7-f5df505b.png b/zh-cn/assets/image7-f5df505b.png new file mode 100644 index 0000000..53add0d Binary files /dev/null and b/zh-cn/assets/image7-f5df505b.png differ diff --git a/zh-cn/assets/image8-2ec67807.png b/zh-cn/assets/image8-2ec67807.png new file mode 100644 index 0000000..c5bcdc2 Binary files /dev/null and b/zh-cn/assets/image8-2ec67807.png differ diff --git a/zh-cn/assets/image8-82d6772e.png b/zh-cn/assets/image8-82d6772e.png new file mode 100644 index 0000000..888bd1d Binary files /dev/null and b/zh-cn/assets/image8-82d6772e.png differ diff --git a/zh-cn/assets/image9-19a1cf33.png b/zh-cn/assets/image9-19a1cf33.png new file mode 100644 index 0000000..0c9a466 Binary files /dev/null and b/zh-cn/assets/image9-19a1cf33.png differ diff --git a/zh-cn/assets/image9-9d5cd850.png b/zh-cn/assets/image9-9d5cd850.png new file mode 100644 index 0000000..6b540ee Binary files /dev/null and b/zh-cn/assets/image9-9d5cd850.png differ diff --git a/zh-cn/assets/index-63a73b24.js b/zh-cn/assets/index-0b4fd2ad.js similarity index 92% rename from zh-cn/assets/index-63a73b24.js rename to zh-cn/assets/index-0b4fd2ad.js index 4212568..9311f36 100644 --- a/zh-cn/assets/index-63a73b24.js +++ b/zh-cn/assets/index-0b4fd2ad.js @@ -1,4 +1,4 @@ -const p="/zh-cn/assets/cover-9e502538.png",n="/zh-cn/assets/image1-09ca1c97.jpg",s="/zh-cn/assets/image2-f93efd4a.jpg",t="/zh-cn/assets/image1-50beaba8.png",r=[p,n,s,t],a={label:"SpinalHDL的使用和开发经验研讨会",description:"SpinalHDL始于2014年,最初是作为VHDL/Verilog的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注。",cover:"./cover.png",location:"中国香港",date:"2023-07-03",title:"SpinalHDL usage and development experience workshop"},o=[],g=`

SpinalHDL 始于 2014 年,最初是作为 VHDL/Verilog 的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注。

+const p="/zh-cn/assets/cover-9e502538.png",n="/zh-cn/assets/image1-09ca1c97.jpg",s="/zh-cn/assets/image2-f93efd4a.jpg",t="/zh-cn/assets/image1-50beaba8.png",a=[p,n,s,t],o={label:"SpinalHDL的使用和开发经验研讨会",description:"SpinalHDL始于2014年,最初是作为VHDL/Verilog的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注。",cover:"./cover.png",location:"中国香港",date:"2023-07-03",title:"SpinalHDL usage and development experience workshop"},r=[],g=`

SpinalHDL 始于 2014 年,最初是作为 VHDL/Verilog 的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注。

达坦科技(DatenLord) 致力于打造高性能跨云存储,其通过软硬件深度融合的方式打破云之间的壁垒,实现高性能跨云数据访问,提供海量异地、异构数据的统一存储访问机制,为云上应用提供高性能安全存储支持。

达坦科技采用硬件加速提升存储性能,目前采用 FPGA、ASIC 实现存储相关场景的性能加速。SpinalHDL 是达坦科技在产品中使用的硬件描述语言之一,达坦科技也一直热心于推广 SpinalHDL 在业界的落地应用。在 2022 年 12 月,达坦科技曾联合 SpinalHDL 社区举办一场题为《SpinalHDL 应用前景探索》的线上研讨会,收获海内外 SpinalHDL 爱好者的欢迎。

而在北京时间 2023 年 7 月 7 日下午 14:00-17:00,达坦科技将联合 SpinalHDL 社区,以及四川芯测电子技术有限公司举办一场题为 SpinalHDL 的使用和开发经验研讨会,旨在和大家分享 SpinalHDL 最新的实践、挑战和经验的分享。

@@ -13,4 +13,4 @@ const p="/zh-cn/assets/cover-9e502538.png",n="/zh-cn/assets/image1-09ca1c97.jpg" 474-6575-9473

图片

对开源硬件感兴趣的朋友,可以添加小助手微信,加入达坦科技硬件群

-

图片

`;export{r as assetURLs,g as default,a as metadata,o as toc}; +

图片

`;export{a as assetURLs,g as default,o as metadata,r as toc}; diff --git a/zh-cn/assets/index-5fe92975.js b/zh-cn/assets/index-0c908ba4.js similarity index 99% rename from zh-cn/assets/index-5fe92975.js rename to zh-cn/assets/index-0c908ba4.js index c09ae19..c6f3108 100644 --- a/zh-cn/assets/index-5fe92975.js +++ b/zh-cn/assets/index-0c908ba4.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/cover-1329fc54.png",l="/zh-cn/assets/image1-03c3323d.png",s="/zh-cn/assets/image2-19f32eff.png",i="/zh-cn/assets/image3-7a5e2db9.png",a="/zh-cn/assets/image4-a055bd84.png",t="/zh-cn/assets/image5-b8622f96.png",p="/zh-cn/assets/image6-5093ee75.png",n="/zh-cn/assets/image7-9fa09d91.png",o="/zh-cn/assets/image8-84dd6aec.png",c="/zh-cn/assets/image9-2f762488.png",r="/zh-cn/assets/image10-f2b55246.png",h="/zh-cn/assets/image11-c5d501bb.png",d="/zh-cn/assets/image12-56434254.png",m="/zh-cn/assets/image13-1c12a6c5.png",u="/zh-cn/assets/image14-69943dbe.png",b="/zh-cn/assets/image15-45a7b638.png",g="/zh-cn/assets/image16-5b765721.jpg",f="/zh-cn/assets/image17-8fb19d7c.jpg",R="/zh-cn/assets/image18-c8c4d5a1.jpg",S="/zh-cn/assets/image19-fb1e5167.png",_="/zh-cn/assets/image20-a391e7d8.jpg",y=[e,l,s,i,a,t,p,n,o,c,r,h,d,m,u,b,g,f,R,S,_],v={label:"计算机体系结构|MIT6.175和MIT6.375学习笔记",description:"在2023年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。现在,完成第一期学习的同学整理了MIT6.175和MIT6.375的关键内容以及Lab实践的学习笔记。",cover:"./cover.png",location:"中国香港",author:["kazutoiris"],tags:["硬件加速"],date:"2023-05-17",title:"Computer Architecture|MIT6.175 and MIT6.375 Study Notes"},C=[{label:"MIT 6.175",level:2},{label:"环境搭建",level:3},{label:"四种 FIFO (Lab 4)",level:3},{label:"Ready 和 Valid 握手",level:3},{label:"EHR 寄存器 (Lab4)",level:3},{label:"RISC-V (Lab5)",level:3},{label:"Branch Prediction (Lab6)",level:3},{label:"DDR3 Memory (Lab7)",level:3},{label:"Cache Coherence (Project)",level:3},{label:"MIT 6.375",level:2},{label:"Bluespec 中的一些特性",level:3},{label:"CORDIC 算法",level:3},{label:"一些常用的概念",level:2},{label:"Setup Time 、Hold Time 和 Clock-to-Q Time",level:3},{label:"SRAM",level:3},{label:"DRAM",level:3},{label:"References",level:2}],M=`

图片

+const e="/zh-cn/assets/cover-1329fc54.png",l="/zh-cn/assets/image1-03c3323d.png",s="/zh-cn/assets/image2-19f32eff.png",i="/zh-cn/assets/image3-7a5e2db9.png",a="/zh-cn/assets/image4-a055bd84.png",t="/zh-cn/assets/image5-b8622f96.png",p="/zh-cn/assets/image6-5093ee75.png",n="/zh-cn/assets/image7-9fa09d91.png",o="/zh-cn/assets/image8-84dd6aec.png",c="/zh-cn/assets/image9-2f762488.png",r="/zh-cn/assets/image10-f2b55246.png",h="/zh-cn/assets/image11-c5d501bb.png",d="/zh-cn/assets/image12-56434254.png",m="/zh-cn/assets/image13-1c12a6c5.png",u="/zh-cn/assets/image14-69943dbe.png",b="/zh-cn/assets/image15-45a7b638.png",g="/zh-cn/assets/image16-5b765721.jpg",f="/zh-cn/assets/image17-8fb19d7c.jpg",R="/zh-cn/assets/image18-c8c4d5a1.jpg",S="/zh-cn/assets/image19-fb1e5167.png",_="/zh-cn/assets/image20-a391e7d8.jpg",y=[e,l,s,i,a,t,p,n,o,c,r,h,d,m,u,b,g,f,R,S,_],v={label:"计算机体系结构|MIT6.175和MIT6.375学习笔记",description:"在2023年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。现在,完成第一期学习的同学整理了MIT6.175和MIT6.375的关键内容以及Lab实践的学习笔记。",cover:"./cover.png",location:"中国香港",author:["kazutoiris"],tags:["硬件加速"],date:"2023-05-17",title:"Computer Architecture|MIT6.175 and MIT6.375 Study Notes"},M=[{label:"MIT 6.175",level:2},{label:"环境搭建",level:3},{label:"四种 FIFO (Lab 4)",level:3},{label:"Ready 和 Valid 握手",level:3},{label:"EHR 寄存器 (Lab4)",level:3},{label:"RISC-V (Lab5)",level:3},{label:"Branch Prediction (Lab6)",level:3},{label:"DDR3 Memory (Lab7)",level:3},{label:"Cache Coherence (Project)",level:3},{label:"MIT 6.375",level:2},{label:"Bluespec 中的一些特性",level:3},{label:"CORDIC 算法",level:3},{label:"一些常用的概念",level:2},{label:"Setup Time 、Hold Time 和 Clock-to-Q Time",level:3},{label:"SRAM",level:3},{label:"DRAM",level:3},{label:"References",level:2}],C=`

图片

在 2023 年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。现在,完成第一期学习的同学整理了 MIT6.175 和 MIT6.375 的关键内容以及 Lab 实践的学习笔记

6.175 和 6.375 的课程和 Lab 学习都有一定的难度,要求采用 Bluespec 语言实现 RISC-V 处理器,并支持多级流水、分支预测、缓存、异常处理、缓存一致性等功能。此外,Lab 环节还涉及软硬件联合开发,要求基于所实现的 RISC-V 处理器运行真实的 RISC-V 程序,并给出性能评估。希望第一期学员(GitHub:kazutoiris )的学习笔记对想从事数字芯片设计的工程师有所帮助。

MIT 6.175

@@ -380,4 +380,4 @@ All the images in this section are cited from [宇芯电子].


达坦科技硬件设计学习社区持续开放,点击原文了解社区学习详情。若想询问加入细节,请添加下方小助手微信号或info@datenlord.com

-

图片

`;export{y as assetURLs,M as default,v as metadata,C as toc}; +

图片

`;export{y as assetURLs,C as default,v as metadata,M as toc}; diff --git a/zh-cn/assets/index-674b00c3.js b/zh-cn/assets/index-12a2a854.js similarity index 91% rename from zh-cn/assets/index-674b00c3.js rename to zh-cn/assets/index-12a2a854.js index 0f9a28a..aff611b 100644 --- a/zh-cn/assets/index-674b00c3.js +++ b/zh-cn/assets/index-12a2a854.js @@ -1,4 +1,4 @@ -const o="/zh-cn/assets/cover-9c53ea5f.png",t="/zh-cn/assets/imgae1-084eb861.jpg",e=[o,t],s={label:"硬件敏捷开发与验证方法学研讨",description:"作为2022年第二届RISC-V中国峰会的同期活动,8月27日下午,达坦科技将在线上举办硬件敏捷开发与验证方法学研讨。",cover:"./cover.png",location:"新加坡",date:"2022-08-23",title:"Hardware Agile Development and Verification Methodology Workshop"},n=[],c=`

作为 2022 年第二届 RISC-V 中国峰会的同期活动,8 月 27 日下午,达坦科技将在线上举办硬件敏捷开发与验证方法学研讨。

+const o="/zh-cn/assets/cover-9c53ea5f.png",t="/zh-cn/assets/imgae1-084eb861.jpg",e=[o,t],n={label:"硬件敏捷开发与验证方法学研讨",description:"作为2022年第二届RISC-V中国峰会的同期活动,8月27日下午,达坦科技将在线上举办硬件敏捷开发与验证方法学研讨。",cover:"./cover.png",location:"新加坡",date:"2022-08-23",title:"Hardware Agile Development and Verification Methodology Workshop"},s=[],r=`

作为 2022 年第二届 RISC-V 中国峰会的同期活动,8 月 27 日下午,达坦科技将在线上举办硬件敏捷开发与验证方法学研讨。

如何提升数字芯片的开发和验证效率一直是业界关注的焦点。近年来随着 Chisel、SpinalHDL 等等一众新一代 HDL 的推出,业界逐步感受到新一代 HDL 在数字芯片设计效率方面的提升。相比 Verilog 和 VHDL,这些新一代 HDL 在语法表达能力、代码简洁程度、错误检查等方面有不小的提升;相比高阶综合 HLS,这些新一代 HDL 支持 RTL 级描述能力,在芯片性能的把控方面远超 HLS。此外,基于 Python,以 Cocotb 和 pyuvm 为代表的新一代验证框架的推出,使得验证的周期得到一定程度的缩减,特别是基于 Python 的验证框架可以复用 Python 生态丰富的已有工具和模型,大大减少了 Golden Reference 的工作量。

更重要的是,这些新一代 HDL 打开了全新的数字芯片敏捷设计和验证的方法学大门。本次研讨将邀请业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。

参与本次研讨的听众可以深入了解业界关于硬件敏捷开发与验证的最前沿探索,诸如:

@@ -11,4 +11,4 @@ const o="/zh-cn/assets/cover-9c53ea5f.png",t="/zh-cn/assets/imgae1-084eb861.jpg"

活动时间:8 月 27 日,13:15-17:15
活动链接:https://t.elecfans.com/live/2113.html
感兴趣的听众可以添加海报中的群主二维码加入讨论群,添加时请注明硬件敏捷开发和验证方法学研讨。

-

图片

`;export{e as assetURLs,c as default,s as metadata,n as toc}; +

图片

`;export{e as assetURLs,r as default,n as metadata,s as toc}; diff --git a/zh-cn/assets/index-28613687.js b/zh-cn/assets/index-15895cd6.js similarity index 93% rename from zh-cn/assets/index-28613687.js rename to zh-cn/assets/index-15895cd6.js index e1be927..0cdacf3 100644 --- a/zh-cn/assets/index-28613687.js +++ b/zh-cn/assets/index-15895cd6.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-9c53ea5f.png",n="/zh-cn/assets/image1-52cf1c3c.jpg",s="/zh-cn/assets/image1-0a18e154.png",o=[t,n,s],a={label:"SpinalHDL应用前景探索线上研讨会",description:"新一代硬件描述语言SpinalHDL的发明人Charles Papon说,SpinalHDL始于2014年,最初是作为VHDL/Verilog的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注,那么SpinalHDL有哪些最新的进展和落地实践呢?",cover:"./cover.png",location:"中国香港",date:"2022-12-08",title:"SpinalHDL Application Prospect Exploration Online Seminar"},r=[{label:"线上研讨会",level:2}],p=`

新一代硬件描述语言 SpinalHDL 的发明人 Charles Papon 说,SpinalHDL 始于 2014 年,最初是作为 VHDL/Verilog 的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注,那么 SpinalHDL 有哪些最新的进展和落地实践呢?

+const o="/zh-cn/assets/cover-9c53ea5f.png",n="/zh-cn/assets/image1-52cf1c3c.jpg",t="/zh-cn/assets/image1-0a18e154.png",s=[o,n,t],a={label:"SpinalHDL应用前景探索线上研讨会",description:"新一代硬件描述语言SpinalHDL的发明人Charles Papon说,SpinalHDL始于2014年,最初是作为VHDL/Verilog的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注,那么SpinalHDL有哪些最新的进展和落地实践呢?",cover:"./cover.png",location:"中国香港",date:"2022-12-08",title:"SpinalHDL Application Prospect Exploration Online Seminar"},r=[{label:"线上研讨会",level:2}],p=`

新一代硬件描述语言 SpinalHDL 的发明人 Charles Papon 说,SpinalHDL 始于 2014 年,最初是作为 VHDL/Verilog 的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注,那么 SpinalHDL 有哪些最新的进展和落地实践呢?

线上研讨会

达坦科技(DatenLord) 致力于打造高性能跨云存储,其通过软硬件深度融合的方式打破云之间的壁垒,实现高性能跨云数据访问,提供海量异地、异构数据的统一存储访问机制,为云上应用提供高性能安全存储支持。达坦科技采用硬件加速提升存储性能,目前采用 FPGA、ASIC 实现存储相关场景的性能加速。SpinalHDL 是达坦科技在产品中使用的硬件描述语言之一,达坦科技也一直热心于推广 SpinalHDL 在业界的落地应用。

为了让对开源硬件感兴趣的朋友进一步了解 SpinalHDL,在北京时间 2022 年 12 月 16 日下午 17:00-21:00,达坦科技联合 SpinalHDL 社区举办一场题为《SpinalHDL 应用前景探索》的线上研讨会(Webinar),本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程 (Flow)。

@@ -11,4 +11,4 @@ const t="/zh-cn/assets/cover-9c53ea5f.png",n="/zh-cn/assets/image1-52cf1c3c.jpg" 会议号:830 6630 7799
密码:1216

对开源硬件感兴趣的朋友,可以添加小助手微信,加入达坦科技硬件群

-

图片

`;export{o as assetURLs,p as default,a as metadata,r as toc}; +

图片

`;export{s as assetURLs,p as default,a as metadata,r as toc}; diff --git a/zh-cn/assets/index-26ca6215.js b/zh-cn/assets/index-1959a67e.js similarity index 95% rename from zh-cn/assets/index-26ca6215.js rename to zh-cn/assets/index-1959a67e.js index 0902777..f909e8b 100644 --- a/zh-cn/assets/index-26ca6215.js +++ b/zh-cn/assets/index-1959a67e.js @@ -1,4 +1,4 @@ -const o="/zh-cn/assets/cover-964a3e23.png",e="/zh-cn/assets/image1-c300ce2e.png",n="/zh-cn/assets/image2-b3df764b.png",l="/zh-cn/assets/image3-6b1d2584.png",s="/zh-cn/assets/image4-034a33e9.png",t="/zh-cn/assets/image5-6a5e807d.png",i=[o,e,n,l,s,t],p={label:"达坦科技2023开源毕业设计实习招募中",description:"自1984年Richard Stallman发起GMU和Free Software Foundation,开源作为一种全新的软件开发和使用模式正式诞生。One for All, All for One的理念传播开后,之后的40年里在开源软件社区被无数开发者实践和传承。开源软件因其节省费用(不需要购买许可证,大大降低了IT投入成本)、安全稳定(安全漏洞少)、技术成熟、个性化定制、自主知识产权等优势获得喜人的发展,由此我们也见证了无数开源软件项目的成长和成熟",cover:"./cover.png",location:"海南",date:"2023-01-06",title:"Datan Technology 2023 Open Source Graduation Design Internship Recruitment"},a=[{label:"毕设项目的背景",level:2},{label:"细分方向",level:2},{label:"开源毕设导师组",level:2},{label:"开源毕设项目的流程",level:2},{label:"申请流程",level:2}],r=`

自 1984 年 Richard Stallman 发起 GMU 和 Free Software Foundation,开源作为一种全新的软件开发和使用模式正式诞生。One for All, All for One 的理念传播开后,之后的 40 年里在开源软件社区被无数开发者实践和传承。开源软件因其节省费用(不需要购买许可证,大大降低了 IT 投入成本)、安全稳定(安全漏洞少)、技术成熟、个性化定制、自主知识产权等优势获得喜人的发展,由此我们也见证了无数开源软件项目的成长和成熟

+const i="/zh-cn/assets/cover-964a3e23.png",e="/zh-cn/assets/image1-c300ce2e.png",n="/zh-cn/assets/image2-b3df764b.png",l="/zh-cn/assets/image3-6b1d2584.png",s="/zh-cn/assets/image4-034a33e9.png",t="/zh-cn/assets/image5-6a5e807d.png",o=[i,e,n,l,s,t],r={label:"达坦科技2023开源毕业设计实习招募中",description:"自1984年Richard Stallman发起GMU和Free Software Foundation,开源作为一种全新的软件开发和使用模式正式诞生。One for All, All for One的理念传播开后,之后的40年里在开源软件社区被无数开发者实践和传承。开源软件因其节省费用(不需要购买许可证,大大降低了IT投入成本)、安全稳定(安全漏洞少)、技术成熟、个性化定制、自主知识产权等优势获得喜人的发展,由此我们也见证了无数开源软件项目的成长和成熟",cover:"./cover.png",location:"海南",date:"2023-01-06",title:"Datan Technology 2023 Open Source Graduation Design Internship Recruitment"},a=[{label:"毕设项目的背景",level:2},{label:"细分方向",level:2},{label:"开源毕设导师组",level:2},{label:"开源毕设项目的流程",level:2},{label:"申请流程",level:2}],p=`

自 1984 年 Richard Stallman 发起 GMU 和 Free Software Foundation,开源作为一种全新的软件开发和使用模式正式诞生。One for All, All for One 的理念传播开后,之后的 40 年里在开源软件社区被无数开发者实践和传承。开源软件因其节省费用(不需要购买许可证,大大降低了 IT 投入成本)、安全稳定(安全漏洞少)、技术成熟、个性化定制、自主知识产权等优势获得喜人的发展,由此我们也见证了无数开源软件项目的成长和成熟

图片

相比而言,硬件开源之路更为崎岖。因为对物理器件的依赖度更高,复杂度更高,修改难度大,硬件开源之路走得比较缓慢。虽然是一条少有人走的路,但其正确性毋庸置疑。开源芯片生态(Open Source Chip Ecosystem-OSCE)的优势,包括可以节约市场化时间,以及知识产权的成本,EDA 工具、设施和劳动力。硬件开发者也期盼硬件设计可以像软件设计一样简单。

图片

@@ -46,4 +46,4 @@ const o="/zh-cn/assets/cover-964a3e23.png",e="/zh-cn/assets/image1-c300ce2e.png"

欢迎您预约直播,或者登陆腾讯会议观看直播:

图片

对开源毕设感兴趣的朋友,欢迎添加小助手微信,加入达坦科技开源毕设群。

-

图片

`;export{i as assetURLs,r as default,p as metadata,a as toc}; +

图片

`;export{o as assetURLs,p as default,r as metadata,a as toc}; diff --git a/zh-cn/assets/index-0cf6ee95.js b/zh-cn/assets/index-1a975ae4.js similarity index 97% rename from zh-cn/assets/index-0cf6ee95.js rename to zh-cn/assets/index-1a975ae4.js index f03b4d5..4cc7fc8 100644 --- a/zh-cn/assets/index-0cf6ee95.js +++ b/zh-cn/assets/index-1a975ae4.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/cover-c17c52cc.png",s="/zh-cn/assets/image1-0dff4570.png",c="/zh-cn/assets/image2-e09cfdc8.png",o="/zh-cn/assets/image3-2b589463.png",a="/zh-cn/assets/image4-5841c9d6.png",p="/zh-cn/assets/image5-92344f1d.png",d="/zh-cn/assets/image6-b429f851.png",r="/zh-cn/assets/image7-97920b5a.png",t="/zh-cn/assets/image8-ecf5c6f3.png",i="/zh-cn/assets/image9-f47bad66.png",n="/zh-cn/assets/image10-b50adc27.png",l="/zh-cn/assets/image11-99ec2a51.png",m=[e,s,c,o,a,p,d,r,t,i,n,l],h={label:"从数学角度思考程序与验证正确性",description:"本文旨在为没有接触过形式化方法的读者提供一种新的视角看待计算机系统与算法,而非形式化方法或 TLA+ 教程。因此本文的重点是如何从数学角度思考程序,不会使用大篇幅讲解 TLA+ 的语法。",cover:"./cover.png",location:"中国香港",author:["田野"],tags:["Xline"],date:"2023-03-02",title:"Thinking about programs mathematically and verifying correctness"},g=[{label:"我们该如何写出正确的程序?",level:2},{label:"程序中会有什么样错误?",level:3},{label:"经验",level:3},{label:"形式化方法",level:3},{label:"TLA+",level:2},{label:"简单的例子",level:3},{label:"Two-Phase Commit",level:2},{label:"总结",level:2},{label:"我们的项目:Xline",level:2}],A=`

封面

+const e="/zh-cn/assets/cover-c17c52cc.png",s="/zh-cn/assets/image1-0dff4570.png",c="/zh-cn/assets/image2-e09cfdc8.png",o="/zh-cn/assets/image3-2b589463.png",p="/zh-cn/assets/image4-5841c9d6.png",a="/zh-cn/assets/image5-92344f1d.png",d="/zh-cn/assets/image6-b429f851.png",i="/zh-cn/assets/image7-97920b5a.png",r="/zh-cn/assets/image8-ecf5c6f3.png",t="/zh-cn/assets/image9-f47bad66.png",n="/zh-cn/assets/image10-b50adc27.png",l="/zh-cn/assets/image11-99ec2a51.png",m=[e,s,c,o,p,a,d,i,r,t,n,l],g={label:"从数学角度思考程序与验证正确性",description:"本文旨在为没有接触过形式化方法的读者提供一种新的视角看待计算机系统与算法,而非形式化方法或 TLA+ 教程。因此本文的重点是如何从数学角度思考程序,不会使用大篇幅讲解 TLA+ 的语法。",cover:"./cover.png",location:"中国香港",author:["田野"],tags:["Xline"],date:"2023-03-02",title:"Thinking about programs mathematically and verifying correctness"},h=[{label:"我们该如何写出正确的程序?",level:2},{label:"程序中会有什么样错误?",level:3},{label:"经验",level:3},{label:"形式化方法",level:3},{label:"TLA+",level:2},{label:"简单的例子",level:3},{label:"Two-Phase Commit",level:2},{label:"总结",level:2},{label:"我们的项目:Xline",level:2}],A=`

封面

本文旨在为没有接触过形式化方法的读者提供一种新的视角看待计算机系统与算法,而非形式化方法或 TLA+ 教程。因此本文的重点是如何从数学角度思考程序,不会使用大篇幅讲解 TLA+ 的语法。

我们该如何写出正确的程序?

程序设计的目标永远是写出正确的程序。随着时间的推移,我们的程序越来越复杂,其中可能存在的错误也越来越多。想要写出正确的程序,首先应该了解程序中可能出现的错误有哪些。

@@ -67,7 +67,7 @@ const e="/zh-cn/assets/cover-c17c52cc.png",s="/zh-cn/assets/image1-0dff4570.png"

在其中用到了"或"连接两个状态,我们可以用布尔逻辑中的逻辑或 来表示。这样,我们就可以清晰地表示出程序的状态转换关系了。为了美观,在 TLA+ 中,首句前也可以补上相同的布尔逻辑符号:

图片

我们最终得到了这个简单程序在初始状态后的两个状态,下面我们将初始状态补全,并按照 TLA+ 语言的要求补全整个 specification:

-

图片

+

图片

下面我们来定义系统做可能发生的动作。

-

图片

+

图片

TM 的状态为 init,且在消息池中存在来自 rPrepared 消息,tmPrepared 在下一个状态的值会是 tmPrepared{r} 的并集。

-

图片

+

图片

上面的两个动作分别是 Transaction Manager 进行 Commit 与 Abort。

-

图片

+

图片

上述 4 个 Resource Manager 动作分别是 Resource Manager 选择 Prepare 与 Abort,以及处理由 Transaction Manager 决定的 Commit 与 Abort。

其中,存在语法如 rmState' = [rmState except ![r] = "prepared"],意为"在下一个状态中,rmState[r] 的值变为 prepared,其它部分不变"。

如果我们用形如 rmState[r]' = "prepared" 的形式来表示,我们并没有显式地说明 rmState 的其它部分在下一个状态的值,因此是不正确的。

@@ -149,4 +149,4 @@ Next 用于定义状态转换关系。

我们的项目:Xline

TLA+被广泛用于分布式系统算法的研究和开发中。在我们的项目 Xline 中,TLA+被用来在设计阶段验证共识算法的正确性。

Xline 是一个用于元数据管理的分布式 KV 存储。我们在 Xline 中使用 CURP 协议(https://www.usenix.org/system/files/nsdi19-park.pdf)的修改版作为共识协议,TLA+将被用于其正确性验证中。

-

如果你想了解更多关于 Xline 的信息,请参考我们的 Github:https://github.com/datenlord/Xline

`;export{m as assetURLs,A as default,h as metadata,g as toc}; +

如果你想了解更多关于 Xline 的信息,请参考我们的 Github:https://github.com/datenlord/Xline

`;export{m as assetURLs,A as default,g as metadata,h as toc}; diff --git a/zh-cn/assets/index-a154d453.js b/zh-cn/assets/index-1ab49176.js similarity index 97% rename from zh-cn/assets/index-a154d453.js rename to zh-cn/assets/index-1ab49176.js index 0e9d7ef..3a4d13b 100644 --- a/zh-cn/assets/index-a154d453.js +++ b/zh-cn/assets/index-1ab49176.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-cf0f8eeb.png",e=[t],a={label:"第二届硬件敏捷开发与方法学研讨会 l 2023 RISC-V中国峰会同期活动顺利举办",description:"作为2023RISC-V中国峰会的同期活动,8月25日下午,达坦科技成功在线上举办第二届硬件敏捷开发与验证方法学研讨。长达三小时的就新一代HDL在数字芯片设计开发和验证效率方面的实践经验分享,究竟碰撞出了什么新的火花呢?下面我们一起来回顾研讨会的精彩内容。",cover:"./cover.png",location:"中国香港",date:"2023-09-07",title:"The 2nd Hardware Agile Development and Methodology Workshop l 2023 RISC V China Summit Concurrent Events Successfully Held"},l=[{label:"Part.1",level:2},{label:"Part.2",level:2},{label:"Part.3",level:2},{label:"Part.4",level:2},{label:"Part.5",level:2},{label:"Part.6",level:2},{label:"结束语",level:2}],p=`

图片

+const t="/zh-cn/assets/cover-cf0f8eeb.png",e=[t],a={label:"第二届硬件敏捷开发与方法学研讨会 l 2023 RISC-V中国峰会同期活动顺利举办",description:"作为2023RISC-V中国峰会的同期活动,8月25日下午,达坦科技成功在线上举办第二届硬件敏捷开发与验证方法学研讨。长达三小时的就新一代HDL在数字芯片设计开发和验证效率方面的实践经验分享,究竟碰撞出了什么新的火花呢?下面我们一起来回顾研讨会的精彩内容。",cover:"./cover.png",location:"中国香港",date:"2023-09-07",title:"The 2nd Hardware Agile Development and Methodology Workshop l 2023 RISC V China Summit Concurrent Events Successfully Held"},p=[{label:"Part.1",level:2},{label:"Part.2",level:2},{label:"Part.3",level:2},{label:"Part.4",level:2},{label:"Part.5",level:2},{label:"Part.6",level:2},{label:"结束语",level:2}],l=`

图片

作为2023RISC-V中国峰会的同期活动,8月25日下午,达坦科技成功在线上举办第二届硬件敏捷开发与验证方法学研讨会。长达三小时的就新一代HDL在数字芯片设计开发和验证效率方面的实践经验分享,究竟碰撞出了什么新的火花呢?下面我们一起来回顾研讨会的精彩内容。

Part.1

《RISC-V敏捷硬件开发-软件定义芯片》

@@ -19,4 +19,4 @@ const t="/zh-cn/assets/cover-cf0f8eeb.png",e=[t],a={label:"第二届硬件敏捷

《MetaHVL硬件敏捷验证与协同仿真》

华南理工大学计算机学院副教授赖晓铮的分享主题是《MetaHVL硬件敏捷验证与协同仿真》。赖老师从芯片设计的规模和芯片设计的成本是不成比例(规模是线性提升,成本是指数提升)的现状出发,提出硬件设计的流程有更敏捷的需求。而敏捷是包含设计和验证两个维度的全流程敏捷。他分享了运用创新EDA方法学和工具以进一步分离设计与实现;此外,提高设计抽象层次的同时,也需要提高验证的抽象层次。赖老师介绍了他在Meta-HVL项目研究的中期结论,即小规模设计的加速比明显,规模越大,DUT运行时间占比越大,则验证加速起到的作用越小。因此,时间应该花在提高验证的效率上,而不是把时间和资源花在加速验证代码的运行上。

结束语

-

如何提升数字芯片的开发和验证效率一直是业界关注的焦点。新一代HDL打开了全新的数字芯片敏捷设计和验证的方法学大门。在本次研讨会上,业界和学界的各位专家分享了他们在各自领域的硬件敏捷开发与验证实践经验,希望这些前沿的探索可以为关注该领域的学习者和实践者提供一次深入探讨和交流的机会,以此进一步促进硬件敏捷开发与验证方法学的发展与落地。

`;export{e as assetURLs,p as default,a as metadata,l as toc}; +

如何提升数字芯片的开发和验证效率一直是业界关注的焦点。新一代HDL打开了全新的数字芯片敏捷设计和验证的方法学大门。在本次研讨会上,业界和学界的各位专家分享了他们在各自领域的硬件敏捷开发与验证实践经验,希望这些前沿的探索可以为关注该领域的学习者和实践者提供一次深入探讨和交流的机会,以此进一步促进硬件敏捷开发与验证方法学的发展与落地。

`;export{e as assetURLs,l as default,a as metadata,p as toc}; diff --git a/zh-cn/assets/index-c1edd0b5.js b/zh-cn/assets/index-1c3a6017.js similarity index 99% rename from zh-cn/assets/index-c1edd0b5.js rename to zh-cn/assets/index-1c3a6017.js index cee79b2..d20445b 100644 --- a/zh-cn/assets/index-c1edd0b5.js +++ b/zh-cn/assets/index-1c3a6017.js @@ -1,4 +1,4 @@ -const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png",e="/zh-cn/assets/image3-b15b4acb.png",n="/zh-cn/assets/image4-e5ed8af3.png",l="/zh-cn/assets/image5-74f0a1a0.png",t="/zh-cn/assets/image6-5ab2a1df.png",a="/zh-cn/assets/image7-bfc65522.png",p="/zh-cn/assets/image8-462cfa81.png",s="/zh-cn/assets/image9-ecae19a3.png",d="/zh-cn/assets/image10-1092617f.png",P="/zh-cn/assets/image11-2508217f.png",c="/zh-cn/assets/image12-69f6226d.png",r="/zh-cn/assets/image13-62fe53ff.png",h="/zh-cn/assets/image14-048f6e24.png",g="/zh-cn/assets/image15-c04accbc.png",S="/zh-cn/assets/image16-2de227b5.png",R="/zh-cn/assets/image17-ecbf7b1e.png",m="/zh-cn/assets/image18-88f5d1b8.png",F="/zh-cn/assets/image19-5df924ff.png",D="/zh-cn/assets/image20-5dfde1d6.png",b="/zh-cn/assets/image21-90c388d7.png",u=[i,o,e,n,l,t,a,p,s,d,P,c,r,h,g,S,R,m,F,D,b],T={label:"万字长文,详述TRIDENT:Poseidon 哈希算法的硬件加速与实现!",description:"本文主要介绍了DatenLord团队在今年的Xilinx全球自适应计算挑战赛上获得 Big Data Analytics赛道一等奖的作品——TRIDENT:Poseidon哈希算法的硬件实现与加速。该项目基于Xilinx Varium C1100 FPGA加速卡,为 Filecoin 区块链应用中的Poseidon哈希算法提供了一套完整的硬件加速方案。在硬件方面,TRIDENT基于 SpinalHDL 设计了Poseidon加速器 IP 并基于 Vivado中Block Design 工具搭建完整的FPGA硬件系统。在软件方面,我们为 Filecoin 软件实现 Lotus 提供了访问 FPGA 硬件加速器的接口。最终,TRIDENT 能够为Filecoin应用提供两倍于 AMD Ryzen 5900X 处理器的 Poseidon 计算加速效果。下文将主要从Poseidon哈希算法概述、基于SpinalHDL和Cocotb的硬件设计、总体方案设计、加速器 IP 设计和性能测试等方面对整个TRIDENT项目进行详细的介绍。",location:"中国香港",author:["翁万正"],tags:["硬件加速"],date:"2022-06-30",title:"Ten thousand words long article, detailing the hardware acceleration and implementation of TRIDENT: Poseidon hash algorithm!"},C=[{label:"引言",level:2},{label:"0.1 Poseidon 与零知识证明",level:3},{label:"0.2 Filecoin 分布式存储网络",level:3},{label:"Poseidon 哈希算法概述",level:2},{label:"1.1Poseidon 参数",level:3},{label:"1.2 Poseidon 详细计算流程",level:3},{label:"1.3Poseidon 算法特点",level:3},{label:"基于 SpinalHDL 和 Cocotb 的硬件设计与验证",level:2},{label:"2.1 SpinalHDL 和 Cocotb 概述",level:3},{label:"2.2 SpinalHDL 在硬件设计中的优势",level:3},{label:"2.3Cocotb 在验证中的优势",level:3},{label:"总体方案设计",level:2},{label:"3.1 开发平台",level:3},{label:"3.2 加速系统设计",level:3},{label:"加速器 IP 设计",level:2},{label:"4.1 模加电路的设计",level:3},{label:"4.2 模乘电路的设计",level:3},{label:"4.3 加速器架构设计",level:3},{label:"性能测试",level:2},{label:"5.1 Vivado Implementation 报告",level:3},{label:"总结",level:2}],A=`

本文主要介绍了 DatenLord 团队在今年的 Xilinx 全球自适应计算挑战赛上获得 Big Data Analytics 赛道一等奖的作品——TRIDENT: Poseidon 哈希算法的硬件实现与加速。该项目基于 Xilinx Varium C1100 FPGA 加速卡,为 Filecoin 区块链应用中的 Poseidon 哈希算法提供了一套完整的硬件加速方案。在硬件方面,TRIDENT 基于 SpinalHDL 设计了 Poseidon 加速器 IP 并基于 Vivado 中 Block Design 工具搭建完整的 FPGA 硬件系统。在软件方面,我们为 Filecoin 软件实现 Lotus 提供了访问 FPGA 硬件加速器的接口。最终,TRIDENT 能够为 Filecoin 应用提供两倍于 AMD Ryzen 5900X 处理器的 Poseidon 计算加速效果。下文将主要从 Poseidon 哈希算法概述、基于 SpinalHDL 和 Cocotb 的硬件设计、总体方案设计、加速器 IP 设计和性能测试等方面对整个 TRIDENT 项目进行详细的介绍。

+const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png",e="/zh-cn/assets/image3-b15b4acb.png",n="/zh-cn/assets/image4-e5ed8af3.png",l="/zh-cn/assets/image5-74f0a1a0.png",t="/zh-cn/assets/image6-5ab2a1df.png",a="/zh-cn/assets/image7-bfc65522.png",p="/zh-cn/assets/image8-462cfa81.png",s="/zh-cn/assets/image9-ecae19a3.png",d="/zh-cn/assets/image10-1092617f.png",P="/zh-cn/assets/image11-2508217f.png",c="/zh-cn/assets/image12-69f6226d.png",r="/zh-cn/assets/image13-62fe53ff.png",h="/zh-cn/assets/image14-048f6e24.png",g="/zh-cn/assets/image15-c04accbc.png",m="/zh-cn/assets/image16-2de227b5.png",S="/zh-cn/assets/image17-ecbf7b1e.png",R="/zh-cn/assets/image18-88f5d1b8.png",F="/zh-cn/assets/image19-5df924ff.png",D="/zh-cn/assets/image20-5dfde1d6.png",b="/zh-cn/assets/image21-90c388d7.png",A=[i,o,e,n,l,t,a,p,s,d,P,c,r,h,g,m,S,R,F,D,b],T={label:"万字长文,详述TRIDENT:Poseidon 哈希算法的硬件加速与实现!",description:"本文主要介绍了DatenLord团队在今年的Xilinx全球自适应计算挑战赛上获得 Big Data Analytics赛道一等奖的作品——TRIDENT:Poseidon哈希算法的硬件实现与加速。该项目基于Xilinx Varium C1100 FPGA加速卡,为 Filecoin 区块链应用中的Poseidon哈希算法提供了一套完整的硬件加速方案。在硬件方面,TRIDENT基于 SpinalHDL 设计了Poseidon加速器 IP 并基于 Vivado中Block Design 工具搭建完整的FPGA硬件系统。在软件方面,我们为 Filecoin 软件实现 Lotus 提供了访问 FPGA 硬件加速器的接口。最终,TRIDENT 能够为Filecoin应用提供两倍于 AMD Ryzen 5900X 处理器的 Poseidon 计算加速效果。下文将主要从Poseidon哈希算法概述、基于SpinalHDL和Cocotb的硬件设计、总体方案设计、加速器 IP 设计和性能测试等方面对整个TRIDENT项目进行详细的介绍。",location:"中国香港",author:["翁万正"],tags:["硬件加速"],date:"2022-06-30",title:"Ten thousand words long article, detailing the hardware acceleration and implementation of TRIDENT_ Poseidon hash algorithm!"},u=[{label:"引言",level:2},{label:"0.1 Poseidon 与零知识证明",level:3},{label:"0.2 Filecoin 分布式存储网络",level:3},{label:"Poseidon 哈希算法概述",level:2},{label:"1.1Poseidon 参数",level:3},{label:"1.2 Poseidon 详细计算流程",level:3},{label:"1.3Poseidon 算法特点",level:3},{label:"基于 SpinalHDL 和 Cocotb 的硬件设计与验证",level:2},{label:"2.1 SpinalHDL 和 Cocotb 概述",level:3},{label:"2.2 SpinalHDL 在硬件设计中的优势",level:3},{label:"2.3Cocotb 在验证中的优势",level:3},{label:"总体方案设计",level:2},{label:"3.1 开发平台",level:3},{label:"3.2 加速系统设计",level:3},{label:"加速器 IP 设计",level:2},{label:"4.1 模加电路的设计",level:3},{label:"4.2 模乘电路的设计",level:3},{label:"4.3 加速器架构设计",level:3},{label:"性能测试",level:2},{label:"5.1 Vivado Implementation 报告",level:3},{label:"总结",level:2}],C=`

本文主要介绍了 DatenLord 团队在今年的 Xilinx 全球自适应计算挑战赛上获得 Big Data Analytics 赛道一等奖的作品——TRIDENT: Poseidon 哈希算法的硬件实现与加速。该项目基于 Xilinx Varium C1100 FPGA 加速卡,为 Filecoin 区块链应用中的 Poseidon 哈希算法提供了一套完整的硬件加速方案。在硬件方面,TRIDENT 基于 SpinalHDL 设计了 Poseidon 加速器 IP 并基于 Vivado 中 Block Design 工具搭建完整的 FPGA 硬件系统。在软件方面,我们为 Filecoin 软件实现 Lotus 提供了访问 FPGA 硬件加速器的接口。最终,TRIDENT 能够为 Filecoin 应用提供两倍于 AMD Ryzen 5900X 处理器的 Poseidon 计算加速效果。下文将主要从 Poseidon 哈希算法概述、基于 SpinalHDL 和 Cocotb 的硬件设计、总体方案设计、加速器 IP 设计和性能测试等方面对整个 TRIDENT 项目进行详细的介绍。

引言

Poseidon 是一种全新的面向零知识证明(ZKP: Zero-Knowledge Proof)密码学协议设计的哈希算法。相比同类算法,包括经典的 SHA-256、SHA-3 以及 Pedersen 哈希函数,在零知识证明的应用场景下,Poseidon 能够显著地降低证明生成和验证的计算复杂度,极大地提升零知识证明系统整体的运行效率。基于上述优点,Poseidon 目前已被广泛应用在了各种区块链项目当中,包括去中心化存储系统 Filecoin、加密货币 Mina Protocol 和 Dusk Network 等,主要用于加速其中的零知识证明系统。

0.1 Poseidon 与零知识证明

@@ -210,9 +210,9 @@ const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png

在上述单元运算电路的基础上,实现高性能算法加速器的另一个关键在于设计一个高效的电路架构,即如何组织好每一个运算器,最大化每个单元的利用率

由本文第二部分的介绍可知,TRIDENT 所加速的 Filecoin Poseidon 哈希实例的输入为个有限域元素,每个元素的位宽为 255 比特。具体的计算流程由

RF 次 Full Round 循环和 RP 次 Partial Round 循环组成。两种循环的计算流程基本相似,都依次包括 AddRoundConstant、SBox 和 MDSMixing 三个阶段,在这三个阶段分别完成常数模加、五次方模幂和向量—矩阵乘法,两者唯一的区别在于 Partial Round 在 Sbox 阶段只需要完成中间状态第一个元素的计算。Full Round 和 Partial Round 每次循环/迭代的计算流程如下图(a)和(b)所示。如果将 Poseidon 哈希函数的所有循环都依次展开,可以将其看成是一条单向的数据流,在该数据流上不断地进行模加、模幂和矩阵运算。

-

图片

+

图片

基于上述算法流程的定义,本次课题中实现的 Poseidon 加速器的具体硬件架构如下图所示。在 Poseidon 单次迭代的算法流程的基础上, 加速器的实现针对具体的 FPGA 架构特点和硬件资源限制做了如下几点优化:

-

图片

+

图片

@@ -252,7 +252,7 @@ const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png

在上文中介绍的 FPGA 硬件系统和其中 Poseidon 加速器 IP 的基础上,我们通过 Vivado 集成开发环境将其实现在了 Varium C1100 FPGA 加速卡上,该板卡搭载了 Xilinx Virtex UltraScale+系列的 FPGA 芯片,具体芯片型号为具体型号为 XCU55N-FSVH2892-2L-E。整个硬件系统实现(Implementation)后的报告以及计算性能的测试结果如下:

5.1 Vivado Implementation 报告

整体硬件加速系统综合实现后逻辑资源消耗情况如下表所示:

-

图片

+

图片

各项 FPGA 资源中 DSP Slices(70.01%)和 LUT(61.15%)的消耗最多, 主要用于 255-Bit Montgomery 模乘电路的实现上。这两项资源的不足也限制了在加速器中配置更多模乘器来提升计算并行度和整体的加速性能。

在时序上,实现(Implementation)后 Poseidon 加速器刚好能够满足 100MHz 工作频率的要求。关键路径上,建立(set up)时间的余量为 0.069ns,保持(hold)时间的余量为 0.01ns。

除了资源和时序外,FPGA 实现后的功耗信息如下图所示。由下图可见,在运行我们设计的加速器硬件时,FPGA 芯片的整体功耗在 24.7W 左右。而我们在性能测试中使用的 RTX 3070 GPU 加速卡的运行功耗在 120W 左右。

@@ -278,4 +278,4 @@ const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png
  • 优化加速器架构:由于需要适配 Filecoin Poseidon 计算实例中不同大小的输入数据,目前在输入较小的情况下加速器中存在一些冗余的运算单元。通过进一步优化加速器的整体架构,使得在不同长度的输入数据下,所有运算单元都能得到更好的利用,能够进一步提升整体的加速性能。

  • -`;export{u as assetURLs,A as default,T as metadata,C as toc}; +`;export{A as assetURLs,C as default,T as metadata,u as toc}; diff --git a/zh-cn/assets/index-ee7da202.js b/zh-cn/assets/index-1f712296.js similarity index 92% rename from zh-cn/assets/index-ee7da202.js rename to zh-cn/assets/index-1f712296.js index 282e74e..966fd1e 100644 --- a/zh-cn/assets/index-ee7da202.js +++ b/zh-cn/assets/index-1f712296.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-0645adbc.jpg",o="/zh-cn/assets/image1-4a25d469.jpg",e="/zh-cn/assets/image2-ee430ce0.png",a=[t,o,e],n={label:"达坦科技受邀在2022中国计算机学会芯片大会做硬件加速研究分享",description:"2022年7月29日至7月30日,由中国计算机学会(CCF)集成电路设计专业委员会、容错计算专业委员会、体系结构专业委员会和信息存储技术专业委员会联合举办的学术大会中国计算机学会芯片大会在江苏南京如期圆满举行。",cover:"./cover.jpg",location:"新加坡",date:"2022-08-04",title:"Dartan Technology Invited to Do Hardware Acceleration Research Sharing at 2022 China Computer Society Chip Conference"},s=[],i=`

    封面

    +const t="/zh-cn/assets/cover-0645adbc.jpg",o="/zh-cn/assets/image1-4a25d469.jpg",e="/zh-cn/assets/image2-ee430ce0.png",s=[t,o,e],a={label:"达坦科技受邀在2022中国计算机学会芯片大会做硬件加速研究分享",description:"2022年7月29日至7月30日,由中国计算机学会(CCF)集成电路设计专业委员会、容错计算专业委员会、体系结构专业委员会和信息存储技术专业委员会联合举办的学术大会中国计算机学会芯片大会在江苏南京如期圆满举行。",cover:"./cover.jpg",location:"新加坡",date:"2022-08-04",title:"Dartan Technology Invited to Do Hardware Acceleration Research Sharing at 2022 China Computer Society Chip Conference"},n=[],i=`

    封面

    2022 年 7 月 29 日至 7 月 30 日,由中国计算机学会(CCF)集成电路设计专业委员会、容错计算专业委员会、体系结构专业委员会和信息存储技术专业委员会联合举办的学术大会中国计算机学会芯片大会在江苏南京如期圆满举行。

    2022 年 CCF 芯片大会由中科院计算所孙凝晖院士、中科院微电子所刘明院士担任大会主席,集结国内外知名专家学者,围绕智能化时代的芯片技术主题,论述芯片领域国际最前沿、权威和新颖的学术观点,包括芯片设计与 EDA、新型体系架构、前沿存储技术、容错计算应用等方面的关键技术和应用前景。

    达坦科技致力于软硬件深度融合的跨云存储平台,其硬件负责人吴迪带领研发团队在今年的Xilinx 全球自适应计算挑战赛上刚获得Big Data Analytics 赛道一等奖。此次,达坦科技提交的论文“基于 SpinalHDL 和 Cocotb 的 Poseidon 哈希算法硬件加速器的敏捷开发”也成功入选,并受邀在大会做分享。达坦科技的翁万正在 30 日下午领域专用架构与敏捷设计论文分组,向与会者介绍了研究背景、方法技术和实验结果。

    @@ -6,4 +6,4 @@ const t="/zh-cn/assets/cover-0645adbc.jpg",o="/zh-cn/assets/image1-4a25d469.jpg"

    Poseidon 是一种全新的面向零知识证明的(ZKP:Zero-Knowledge Proof)密码学协议设计的哈希算法。相比经典的 SHA-256 和 Keccak 哈希函数, 在零知识证明的应用场景下, Poseidon 能够显著地减少哈希函数的约束条件进而降低证明的计算复杂度, 极大提升零知识证明系统的运行效率。Poseidon 哈希函数的计算涉及高位宽模乘和矩阵乘法运算, 需要消耗大量计算资源。为了提升哈希计算的效率, 达坦基于流水线和折叠技术提出了一种面向 FPGA 平台的 Poseidon 硬件加速器架构。

    在该整体架构下, 针对高位宽模乘, 达坦科技基于 Karatsuba 乘法拆分算法实现了一种高性能蒙哥马利模乘器。针对函数中的向量—矩阵乘法计算, 达坦科技基于脉动矩阵结构提出了一种高吞吐率的硬件实现。最终, 在搭载有 Xilinx Virtex Ultrascale+ FPGA 芯片的 Varium C1100 加速卡上, 硬件加速器每秒最高能完成 0.99M 次哈希计算, 达到 AMD Ryzen 5900X 处理器 Poseidon 计算速度的两倍。

    图片

    -

    除了打造全新的广域网共识算法,达坦科技专注于自研面向存储网络的硬件加速,以期软硬件的深度融合能提升存储的性能。目前达坦科技的硬件项目 TRIDENT,已经在 Github 上开源,欢迎参与讨论:https://github.com/datenlord/TRIDENT。

    `;export{a as assetURLs,i as default,n as metadata,s as toc}; +

    除了打造全新的广域网共识算法,达坦科技专注于自研面向存储网络的硬件加速,以期软硬件的深度融合能提升存储的性能。目前达坦科技的硬件项目 TRIDENT,已经在 Github 上开源,欢迎参与讨论:https://github.com/datenlord/TRIDENT。

    `;export{s as assetURLs,i as default,a as metadata,n as toc}; diff --git a/zh-cn/assets/index-6a3ed4c3.js b/zh-cn/assets/index-22d5e656.js similarity index 95% rename from zh-cn/assets/index-6a3ed4c3.js rename to zh-cn/assets/index-22d5e656.js index 434a40f..99f8163 100644 --- a/zh-cn/assets/index-6a3ed4c3.js +++ b/zh-cn/assets/index-22d5e656.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-cf0f8eeb.png",o="/zh-cn/assets/image1-6485c4dd.jpg",e=[t,o],n={label:"活动预告 | 第二届硬件敏捷开发与验证方法学研讨会",description:"2023年8月23日至25日, 2023 RISC-V中国峰会将在北京香格里拉饭店举办。本届峰会采用“主会议+主题活动+展览展示+同期活动”的会议组织方式,将邀请RISC-V国际基金会、业界专家、企业代表及社区伙伴等共同探讨RISC-V发展趋势与机遇。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技将在线上举办第二届硬件敏捷开发与验证方法学研讨会。",cover:"./cover.png",location:"新加坡",date:"2023-08-20",title:"Upcoming Events l 2nd Hardware Agile Development and Verification Methodology Workshop"},s=[{label:"2023 RISC-V中国峰会",level:2},{label:"活动信息",level:2}],r=`

    图片

    +const t="/zh-cn/assets/cover-cf0f8eeb.png",o="/zh-cn/assets/image1-6485c4dd.jpg",e=[t,o],s={label:"活动预告 | 第二届硬件敏捷开发与验证方法学研讨会",description:"2023年8月23日至25日, 2023 RISC-V中国峰会将在北京香格里拉饭店举办。本届峰会采用“主会议+主题活动+展览展示+同期活动”的会议组织方式,将邀请RISC-V国际基金会、业界专家、企业代表及社区伙伴等共同探讨RISC-V发展趋势与机遇。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技将在线上举办第二届硬件敏捷开发与验证方法学研讨会。",cover:"./cover.png",location:"新加坡",date:"2023-08-20",title:"Upcoming Events l 2nd Hardware Agile Development and Verification Methodology Workshop"},n=[{label:"2023 RISC-V中国峰会",level:2},{label:"活动信息",level:2}],r=`

    图片

    2023 RISC-V中国峰会

    2023年8月23日至25日, 2023 RISC-V中国峰会将在北京香格里拉饭店举办。本届峰会采用“主会议+主题活动+展览展示+同期活动”的会议组织方式,将邀请RISC-V国际基金会、业界专家、企业代表及社区伙伴等共同探讨RISC-V发展趋势与机遇。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技将在线上举办第二届硬件敏捷开发与验证方法学研讨会

    随着数字芯片的设计规模和复杂度越来越大,加之芯片市场的竞争越来越激烈,如何提升数字芯片的开发和验证效率成为业界关注的焦点。虽然各种设计工具、验证方法学层出不穷,但是一直没有得到业界广泛认可。目前业界普遍采用的还是基于Verilog、SystemVerilog、VHDL和UVM的工具和方法。

    @@ -16,4 +16,4 @@ const t="/zh-cn/assets/cover-cf0f8eeb.png",o="/zh-cn/assets/image1-6485c4dd.jpg"

    收看链接:
    https://wx.vzan.com/live/tvchat-904511107?v=1691984417574
    或欢迎点击下方链接预约公众号直播。

    -

    感兴趣的观众可以添加海报中的达坦科技小助手二维码加入讨论群,添加时请注明硬件敏捷开发和验证方法学研讨

    `;export{e as assetURLs,r as default,n as metadata,s as toc}; +

    感兴趣的观众可以添加海报中的达坦科技小助手二维码加入讨论群,添加时请注明硬件敏捷开发和验证方法学研讨

    `;export{e as assetURLs,r as default,s as metadata,n as toc}; diff --git a/zh-cn/assets/index-405a2dbf.js b/zh-cn/assets/index-284b9c1c.js similarity index 98% rename from zh-cn/assets/index-405a2dbf.js rename to zh-cn/assets/index-284b9c1c.js index b354475..a651103 100644 --- a/zh-cn/assets/index-405a2dbf.js +++ b/zh-cn/assets/index-284b9c1c.js @@ -1,4 +1,4 @@ -const n="/zh-cn/assets/cover-99998007.jpg",s="/zh-cn/assets/image1-6f9cec09.jpg",e=[n,s],t={label:"精彩回顾|硬件敏捷开发与验证方法学研讨",description:"8月27日,作为2022年第二届RISC-V中国峰会的同期活动,达坦科技成功举办硬件敏捷开发与验证方法学研讨。虽然是线上分享活动,但大家热情依旧,会后在“硬件敏捷开发和验证方法学讨论群”中积极互动提问。长达四小时的就新一代HDL在数字芯片设计方面的实践经验分享,究竟碰撞出了什么新的火花呢?下面我们一起来回顾研讨会的精彩内容。",cover:"./cover.jpg",location:"中国香港",date:"2022-09-08",title:"Discussion on Hardware Agile Development and Verification Methodology"},o=[{label:"芯片敏捷设计与验证之路",level:2},{label:"香山处理器敏捷开发与验证实践",level:2},{label:"通过 Chainsaw 实现硬件算子敏捷开发",level:2},{label:"Scala 在 IC 开发中的应用",level:2},{label:"NaxRiscv CPU: Introduction and Extension Demonstration",level:2},{label:"结束语",level:2}],a=`

    封面

    +const n="/zh-cn/assets/cover-99998007.jpg",s="/zh-cn/assets/image1-6f9cec09.jpg",t=[n,s],e={label:"精彩回顾|硬件敏捷开发与验证方法学研讨",description:"8月27日,作为2022年第二届RISC-V中国峰会的同期活动,达坦科技成功举办硬件敏捷开发与验证方法学研讨。虽然是线上分享活动,但大家热情依旧,会后在“硬件敏捷开发和验证方法学讨论群”中积极互动提问。长达四小时的就新一代HDL在数字芯片设计方面的实践经验分享,究竟碰撞出了什么新的火花呢?下面我们一起来回顾研讨会的精彩内容。",cover:"./cover.jpg",location:"中国香港",date:"2022-09-08",title:"Discussion on Hardware Agile Development and Verification Methodology"},o=[{label:"芯片敏捷设计与验证之路",level:2},{label:"香山处理器敏捷开发与验证实践",level:2},{label:"通过 Chainsaw 实现硬件算子敏捷开发",level:2},{label:"Scala 在 IC 开发中的应用",level:2},{label:"NaxRiscv CPU: Introduction and Extension Demonstration",level:2},{label:"结束语",level:2}],a=`

    封面

    8 月 27 日,作为 2022 年第二届 RISC-V 中国峰会的同期活动,达坦科技成功举办硬件敏捷开发与验证方法学研讨。虽然是线上分享活动,但大家热情依旧,会后在“硬件敏捷开发和验证方法学讨论群”中积极互动提问。长达四小时的就新一代 HDL 在数字芯片设计方面的实践经验分享,究竟碰撞出了什么新的火花呢?下面我们一起来回顾研讨会的精彩内容。

    芯片敏捷设计与验证之路

    华南理工大学计算机科学与工程学院赖晓铮副教授首先分享了 “让硬件设计像软件设计一样简单”的愿景,即开发人员编写的代码只占工作量的 10%,剩下 90%由开源芯片生态系统提供。

    @@ -23,4 +23,4 @@ const n="/zh-cn/assets/cover-99998007.jpg",s="/zh-cn/assets/image1-6f9cec09.jpg"

    请点击如下链接:
    https://t.elecfans.com/live/2113.html收看本次研讨会的回放。
    也欢迎添加小助手微信,加入“硬件敏捷开发和验证方法学讨论群”,进行延伸讨论与互动,并第一时间获得后续相关活动的讯息。

    -

    图片

    `;export{e as assetURLs,a as default,t as metadata,o as toc}; +

    图片

    `;export{t as assetURLs,a as default,e as metadata,o as toc}; diff --git a/zh-cn/assets/index-8e06495a.js b/zh-cn/assets/index-2aee5161.js similarity index 98% rename from zh-cn/assets/index-8e06495a.js rename to zh-cn/assets/index-2aee5161.js index d1bcade..16f23fb 100644 --- a/zh-cn/assets/index-8e06495a.js +++ b/zh-cn/assets/index-2aee5161.js @@ -1,4 +1,4 @@ -const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png",i="/zh-cn/assets/image2-1161bb88.png",a="/zh-cn/assets/image3-136f9458.png",e="/zh-cn/assets/image4-75f70bf1.png",o="/zh-cn/assets/image5-64f0abbf.png",t="/zh-cn/assets/image6-29b079bb.png",n="/zh-cn/assets/image7-f8d2626b.png",s="/zh-cn/assets/image8-d242f7b7.png",c="/zh-cn/assets/image9-5e691a52.png",r="/zh-cn/assets/image10-b3a0ad40.png",g="/zh-cn/assets/image11-98ffaf6b.png",H="/zh-cn/assets/image13-d816729e.png",D="/zh-cn/assets/image14-20340934.png",h="/zh-cn/assets/image15-512cff4d.png",L="/zh-cn/assets/image16-ee33a0ea.png",S="/zh-cn/assets/image17-e2c28396.png",m="/zh-cn/assets/image18-69fe4409.png",V="/zh-cn/assets/image19-dfed79f8.png",C="/zh-cn/assets/image20-a636b8b5.png",b="/zh-cn/assets/image21-487e6dd2.png",y="/zh-cn/assets/image22-27167bbd.png",d="/zh-cn/assets/image23-8660cc2c.png",P="/zh-cn/assets/image24-4d2461fd.png",f="/zh-cn/assets/image25-3af02a99.png",A="/zh-cn/assets/image26-a854b9f0.png",z="/zh-cn/assets/image27-5b3ff402.png",v="/zh-cn/assets/image28-f02ef5c0.png",I="/zh-cn/assets/image29-44cafcf0.png",w=[l,p,i,a,e,o,t,n,s,c,r,g,H,D,h,L,S,m,V,C,b,y,d,P,f,A,z,v,I],R={label:"使用SpinalHDL和Cocotb进行敏捷数字芯片设计和验证",description:"领域特定架构已成为计算机发展的一种趋势。在提供更高效算力的同时,它也给底层硬件的开发带来了更大的挑战。传统的芯片设计和验证技术已越来越无法应对这些新的要求和挑战。在芯片设计上,本文将介绍如何使用SpinalHDL,一种基于Scala的新型硬件描述语言(HDL),或者更准确地说是硬件构造语言,提高硬件设计的效率和质量。对于SpinalHDL,本文还介绍了如何利用Scala的类型系统高效地进行复杂硬件的设计。对于验证,本文将介绍基于Python的验证环境Cocotb,以及如何利用Python简洁高效的语言特性及其繁荣的开源社区,提升芯片验证的效率。",cover:"./cover.jpg",location:"新疆",author:["翁万正等"],date:"2024-01-25",title:"Agile Digital Chip Design and Verification with SpinalHDL and Cocotb"},u=[{label:"引言",level:2},{label:"1.1 背景",level:3},{label:"1.2 HDL的演变",level:3},{label:"SpinalHDL",level:2},{label:"2.1 SpinalHDL简介",level:3},{label:"2.2 与传统HDL相同的描述粒度",level:3},{label:"2.3 SpinalHDL相比传统HDL的优势",level:3},{label:"基于元语言构建数字逻辑电路",level:2},{label:"3.1 元语言的概念",level:3},{label:"3.2 硬件设计中的高级类型系统",level:3},{label:"3.3 SpinalHDL之外",level:3},{label:"3.4 HCL的编译流程",level:3},{label:"基于Cocotb的验证",level:2},{label:"4.1 Cocotb简介",level:3},{label:"4.2 基于Cocotb硬件验证的优势",level:3},{label:"4.3 基于Cocotb的验证示例",level:3},{label:"4.3.3 启动仿真",level:3},{label:"结论",level:2},{label:"参考文章",level:2}],E=`

    封面

    +const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png",i="/zh-cn/assets/image2-1161bb88.png",a="/zh-cn/assets/image3-136f9458.png",e="/zh-cn/assets/image4-75f70bf1.png",o="/zh-cn/assets/image5-64f0abbf.png",n="/zh-cn/assets/image6-29b079bb.png",t="/zh-cn/assets/image7-f8d2626b.png",s="/zh-cn/assets/image8-d242f7b7.png",c="/zh-cn/assets/image9-5e691a52.png",r="/zh-cn/assets/image10-b3a0ad40.png",g="/zh-cn/assets/image11-98ffaf6b.png",D="/zh-cn/assets/image13-d816729e.png",H="/zh-cn/assets/image14-20340934.png",h="/zh-cn/assets/image15-512cff4d.png",L="/zh-cn/assets/image16-ee33a0ea.png",S="/zh-cn/assets/image17-e2c28396.png",m="/zh-cn/assets/image18-69fe4409.png",C="/zh-cn/assets/image19-dfed79f8.png",V="/zh-cn/assets/image20-a636b8b5.png",b="/zh-cn/assets/image21-487e6dd2.png",y="/zh-cn/assets/image22-27167bbd.png",d="/zh-cn/assets/image23-8660cc2c.png",P="/zh-cn/assets/image24-4d2461fd.png",f="/zh-cn/assets/image25-3af02a99.png",z="/zh-cn/assets/image26-a854b9f0.png",A="/zh-cn/assets/image27-5b3ff402.png",v="/zh-cn/assets/image28-f02ef5c0.png",I="/zh-cn/assets/image29-44cafcf0.png",u=[l,p,i,a,e,o,n,t,s,c,r,g,D,H,h,L,S,m,C,V,b,y,d,P,f,z,A,v,I],T={label:"使用SpinalHDL和Cocotb进行敏捷数字芯片设计和验证",description:"领域特定架构已成为计算机发展的一种趋势。在提供更高效算力的同时,它也给底层硬件的开发带来了更大的挑战。传统的芯片设计和验证技术已越来越无法应对这些新的要求和挑战。在芯片设计上,本文将介绍如何使用SpinalHDL,一种基于Scala的新型硬件描述语言(HDL),或者更准确地说是硬件构造语言,提高硬件设计的效率和质量。对于SpinalHDL,本文还介绍了如何利用Scala的类型系统高效地进行复杂硬件的设计。对于验证,本文将介绍基于Python的验证环境Cocotb,以及如何利用Python简洁高效的语言特性及其繁荣的开源社区,提升芯片验证的效率。",cover:"./cover.jpg",location:"新疆",author:["翁万正等"],date:"2024-01-25",title:"Agile Digital Chip Design and Verification with SpinalHDL and Cocotb"},G=[{label:"引言",level:2},{label:"1.1 背景",level:3},{label:"1.2 HDL的演变",level:3},{label:"SpinalHDL",level:2},{label:"2.1 SpinalHDL简介",level:3},{label:"2.2 与传统HDL相同的描述粒度",level:3},{label:"2.3 SpinalHDL相比传统HDL的优势",level:3},{label:"基于元语言构建数字逻辑电路",level:2},{label:"3.1 元语言的概念",level:3},{label:"3.2 硬件设计中的高级类型系统",level:3},{label:"3.3 SpinalHDL之外",level:3},{label:"3.4 HCL的编译流程",level:3},{label:"基于Cocotb的验证",level:2},{label:"4.1 Cocotb简介",level:3},{label:"4.2 基于Cocotb硬件验证的优势",level:3},{label:"4.3 基于Cocotb的验证示例",level:3},{label:"4.3.3 启动仿真",level:3},{label:"结论",level:2},{label:"参考文章",level:2}],M=`

    封面

    摘要:
    领域特定架构已成为计算机发展的一种趋势。在提供更高效算力的同时,它也给底层硬件的开发带来了更大的挑战。传统的芯片设计和验证技术已越来越无法应对这些新的要求和挑战。在芯片设计上,本文将介绍如何使用SpinalHDL,一种基于Scala的新型硬件描述语言(HDL),或者更准确地说是硬件构造语言,提高硬件设计的效率和质量。对于SpinalHDL,本文还介绍了如何利用Scala的类型系统高效地进行复杂硬件的设计。对于验证,本文将介绍基于Python的验证环境Cocotb,以及如何利用Python简洁高效的语言特性及其繁荣的开源社区,提升芯片验证的效率。

    引言

    @@ -70,7 +70,7 @@ const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png"
  • 使用复杂条件和递归来处理不同大小的问题。
  • 重用现有的Scala甚至Java代码,以减少开发时间并增强设计可靠性。
  • -

    图片

    +

    图片

    图5:Benes网络硬件:开关、路由和控制字ROM。

    在图5中,我们以Benes网络的硬件结构为例,说明了这些特性带来的好处:在此硬件的设计中,上述每种语言特性的特定应用被指定:

      @@ -85,7 +85,7 @@ const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png"

      一些基本设计元素的良好封装:SpinalHDL本身为我们提供了一些基本且频繁使用的元素的良好封装,例如StateMachine、Stream、Flow和多种类型的总线。通过使用这些良好封装,你不必从头开始构建设计,这可以提高效率并减少错误的可能性。

      例如,SpinalHDL提供了方便的控制路径和数据路径的抽象,通过将它们建模为Stream,你可以将控制路径和数据路径视为从SoC输入端口到输出端口的一个或多个流:(1)每个模块的数据路径是将其输入流的有效负载数据转换并再次作为流发送到其输出端口;(2)对于控制路径,通过SpinalHDL对流模型提供的丰富功能,例如暂停/阻塞、继续、丢弃、分叉、合并等,可以非常容易地操作模块的输入流,例如具有背压/流量控制的流水线,再定时等。Stream是Scala提供的一个类,控制路径的不同操作被封装为类的方法。

      这里以Stream的m2sPipe()方法为例,它帮助用户更轻松地处理流水线中易出错的valid和ready信号的操作。通过使用m2sPipe,你可以更容易地实现带有背压的流水线,以解决时序问题。m2sPipe()生成的相应硬件结构如图6所示:

      -

      图片

      +

      图片

      图6:带有背压的流水线

      另一个例子是SpinalHDL为许多总线提供了非常好的封装,例如AXI、APB等。特别是AXI非常流行且难以实现。SpinalHDL基于前面提到的流模型实现了AXI接口,并提供了许多有用的与总线相关的功能,例如交叉开关、带/不带事务锁的总线仲裁器、总线解复用器、控制寄存器的总线驱动器等等。最重要的是,SpinalHDL提供的总线接口是防错的,因为SpinalHDL可以检查信号类型、信号宽度匹配、输入/输出方向、时钟域跨界等。通过SpinalHDL提供的这些方便的组件,它极大地促进了SoC的集成。

      Scala语言特性带来的可重用性:硬件设计所面临的问题通常是高度定制的。但是通过参数/泛型在Verilog/VHDL中提供的定制能力是不足的,而Verilog的代码很难应对许多情况。同时,Verilog/VHDL的自解释性很差,在许多情况下,即使有源代码可用,很难理解和使用其他人开发的源代码。传统HDL中代码难以理解的主要原因有两点:1)Verilog/VHDL中的描述是过于底层;2)不同团队使用的设计规则不一致。

      @@ -118,11 +118,11 @@ const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png"

      和类型,也称为标记联合,是一种可以容纳来自固定数量的不同类型之一的单个值并保留所容纳值的类型的数据结构。虽然Verilog和传统软件编程语言如C都没有直接支持和类型,但我们可以在C中模拟其行为:

      图片

      一个简单但广为人知的和类型的例子是'Option'类型:

      -

      图片

      +

      图片

      表2:从SpinalHDL到Verilog的映射。

      当存在和类型和产品类型时,可以对可表示值的集合施加约束。例如,在深度嵌入式HCL中,由“VALID”信号门控的数据信号可以使用“Option”类型表示,这样在检查“VALID”是否为“高”之前,无法读取该值。

      在浅度嵌入式HCL中,和类型只能用于电路结构而不能用于数据,但我们仍然可以使用新类型模式模拟“Option[T]”的行为。我们创建一个函数:

      -

      图片

      +

      图片

      根据值选择onSome或onNone。由于DynamicOption类型构造器是私有的,所以只需要保护值免受未经意访问的影响而不必检查VALID。

      图片

      子类型和参数化多态:子类型(最常见的形式是继承)是一种构建类型层级结构的机制。参数化多态,也称为泛型,是一种编写以类型为输入并以单态类型或函数为输出的类型级别函数的机制。

      @@ -150,7 +150,7 @@ const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png"
    1. 类型检查和IR编译。
    2. 生成IR到Verilog代码。(一些深度嵌入式HCL,如Clash,也可以通过面向软件的编译器编译为模拟电路行为的可执行程序)。
    -

    图片

    +

    图片

    图11:基于Scala的浅嵌入式HCL需要,而基于Haskell的深嵌入式HCL Clash

    基于Cocotb的验证

    4.1 Cocotb简介

    @@ -160,7 +160,7 @@ const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png"

    除了支持不同类型的模拟器外,Cocotb相对于使用Verilog、System Verilog或VHDL进行验证具有各种优势,这些优势可以加速整个硬件设计过程。以下是Cocotb的一些显著优势:

    4.2.1 简洁高效的语言特性

    比传统的用于验证的语言如Verilog、VHDL和System Verilog更高效、更具表现力和更简洁。与使用这些传统语言编码相比,使用Python来实现复杂功能需要更少的代码。

    -

    图片

    +

    图片

    图12: 基于Cocotb的验证框架

    与此同时,Python拥有简单的语法和丰富的在线学习资料,使初学者更容易掌握。此外,Python是一种高级编程语言,具有诸多高级特性,如面向对象编程,可以帮助程序员编写更可重用的代码。

    在大多数硬件验证的情况下,C/C++被用于构建DUT的参考模型,参考模型的代码通过DPI集成到SV(System Verilog)的测试代码中。Python比其他语言(如C/C++)在构建参考模型方面更高效的一个编程场景是涉及超过64位的大整数的算术运算。密码学算法如ECC和RSA以及哈希函数通常涉及128位到2048位范围内宽度的大整数运算。C/C++中的原始类型仅支持最大64位的数字。如果使用C/C++构建您的参考模型,处理这些大整数将会很麻烦。下面的C程序实现了两个超过64位宽度的大整数的加法运算:

    @@ -187,10 +187,10 @@ const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png"

    表4:被测试矩阵乘法器的接口

    4.3.1 构建参考模型

    矩阵乘法器的参考模型可以基于numpy实现,它是一个广泛应用的Python包,提供了丰富的矩阵运算功能。利用numpy,可以直接使用方法“matmul”来实现矩阵乘法,无需使用循环语法。参考模型的具体Python实现如下:

    -

    图片

    +

    图片

    4.3.2 搭建验证平台

    基于Cocotb构建的简单验证平台结构如下图所示。验证平台主要包括四个部分:1)驱动器;2)监控器;3)参考模型;4)缓冲区。驱动器使用Python包random生成随机的输入信号,包括“valid i”、“a i”和“b i”。当“valid i”为高电平时,生成的“a i”和“b i”被发送到参考模型,并获取相应的参考输出。参考输出通过Python包Queue实现的缓冲区存储,一旦输出信号“valid o”为高电平,监控器会抓取DUT的输出端口,并将其值与从缓冲区中取出的参考输出进行比较。驱动器和监控器的功能都是通过Python的协程实现的,类似于多线程,并且可以并行执行。

    -

    图片

    +

    图片

    图14:基于Cocotb的验证平台结构

    4.3.3 启动仿真

    基于Cocotb的验证代码可以通过Makefile在仿真器上启动,而无需直接与仿真器进行交互。此外,使用cocotb-test包中提供的“simulator.run”方法,可以直接在Python函数中启动验证过程。然后可以直接运行该函数,或者使用pytest,一个成熟的Python测试框架,来管理所有测试的执行。

    @@ -209,4 +209,4 @@ const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png" [4] B. J. Rosser, “Cocotb: a python-based digital logic verification framework,” 2018. [5] Cocotb, -“https://github.com/cocotb/cocotb.”

    `;export{w as assetURLs,E as default,R as metadata,u as toc}; +“https://github.com/cocotb/cocotb.”

    `;export{u as assetURLs,M as default,T as metadata,G as toc}; diff --git a/zh-cn/assets/index-0c25eea3.js b/zh-cn/assets/index-2b1c59a2.js similarity index 97% rename from zh-cn/assets/index-0c25eea3.js rename to zh-cn/assets/index-2b1c59a2.js index 25c7558..88f473f 100644 --- a/zh-cn/assets/index-0c25eea3.js +++ b/zh-cn/assets/index-2b1c59a2.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-ae42e606.jpg",s="/zh-cn/assets/image1-4de20ee3.jpg",n="/zh-cn/assets/image2-9ad061db.jpg",o=[t,s,n],r={label:"Rust X DatenLord l Rust China Conf 2023 倒计时!",description:"Rust语言作为一种强调性能、安全和并发性的新的编程语言,吸引了越来越多的程序员想要尝试学习和使用Rust。达坦科技(DatenLord)旗下的开源项目Xline (用于元数据管理的分布式KV存储)就是用Rust写就的,我们也一直坚定地做Rust语言在中国的布道。",cover:"./cover.jpg",location:"中国香港",date:"2023-06-11",title:"Countdown to Rust X DatenLord l Rust China Conf 2023"},e=[{label:"倒计时",level:2},{label:"主会场",level:2},{label:"分论坛:Rust 语言与高性能实践",level:2},{label:"Workshop:Rust in System",level:2},{label:"报名注意事项",level:2}],g=`

    封面

    +const t="/zh-cn/assets/cover-ae42e606.jpg",s="/zh-cn/assets/image1-4de20ee3.jpg",n="/zh-cn/assets/image2-9ad061db.jpg",o=[t,s,n],r={label:"Rust X DatenLord l Rust China Conf 2023 倒计时!",description:"Rust语言作为一种强调性能、安全和并发性的新的编程语言,吸引了越来越多的程序员想要尝试学习和使用Rust。达坦科技(DatenLord)旗下的开源项目Xline (用于元数据管理的分布式KV存储)就是用Rust写就的,我们也一直坚定地做Rust语言在中国的布道。",cover:"./cover.jpg",location:"中国香港",date:"2023-06-11",title:"Countdown to Rust X DatenLord l Rust China Conf 2023"},e=[{label:"倒计时",level:2},{label:"主会场",level:2},{label:"分论坛:Rust 语言与高性能实践",level:2},{label:"Workshop:Rust in System",level:2},{label:"报名注意事项",level:2}],p=`

    封面

    倒计时

    Rust 语言作为一种强调性能、安全和并发性的新的编程语言,吸引了越来越多的程序员想要尝试学习和使用 Rust。达坦科技(DatenLord)旗下的开源项目 Xline (用于元数据管理的分布式 KV 存储)就是用 Rust 写就的,我们也一直坚定地做 Rust 语言在中国的布道。

    因此,2023 年 6 月 17-18 日 我们也将奔赴上海,支持 Rust 语言中文社区在疫情之后首次举办的大型线下 Rust 开发者大会。达坦科技的两位创始人将在 Rust China Conf 2023 上分别做主题演讲,在 6 月 17 日晚,达坦科技还将赞助举办一场干货满满的 workshop。

    @@ -31,4 +31,4 @@ const t="/zh-cn/assets/cover-ae42e606.jpg",s="/zh-cn/assets/image1-4de20ee3.jpg"

    添加小助手微信,进入达坦科技 Rust 前沿技术交流群

    封面

    更多关于 Rust China Conf 2023 官方信息,请查阅
    --https://rustcc.cn/2023rustchinaconf/

    `;export{o as assetURLs,g as default,r as metadata,e as toc}; +-https://rustcc.cn/2023rustchinaconf/

    `;export{o as assetURLs,p as default,r as metadata,e as toc}; diff --git a/zh-cn/assets/index-494dac65.js b/zh-cn/assets/index-2bc875c0.js similarity index 95% rename from zh-cn/assets/index-494dac65.js rename to zh-cn/assets/index-2bc875c0.js index 803af9c..dc7fde2 100644 --- a/zh-cn/assets/index-494dac65.js +++ b/zh-cn/assets/index-2bc875c0.js @@ -1,4 +1,4 @@ -const l="/zh-cn/assets/cover-6865ae02.png",e=[l],i={label:"Xline v0.4.0:一个用于元数据管理的分布式KV存储",description:"Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。",cover:"./cover.png",location:"中国香港",author:["期待你贡献的"],tags:["Xline"],date:"2023-05-11",title:"Xline v0.4.0: A distributed KV store for metadata management"},t=[{label:"Xline 是什么?我们为什么要做 Xline?",level:2},{label:"V0.4.0 版本有什么新功能?",level:3},{label:"欢迎参与到 Xline 项目中",level:2},{label:"相关链接",level:2}],n=`

    封面

    +const l="/zh-cn/assets/cover-6865ae02.png",e=[l],i={label:"Xline v0.4.0:一个用于元数据管理的分布式KV存储",description:"Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。",cover:"./cover.png",location:"中国香港",author:["期待你贡献的"],tags:["Xline"],date:"2023-05-11",title:"Xline v0.4.0_ A distributed KV store for metadata management"},t=[{label:"Xline 是什么?我们为什么要做 Xline?",level:2},{label:"V0.4.0 版本有什么新功能?",level:3},{label:"欢迎参与到 Xline 项目中",level:2},{label:"相关链接",level:2}],s=`

    封面

    Xline 是什么?我们为什么要做 Xline?

    Xline 是一个基于 Curp 协议的,用于管理元数据的分布式 KV 存储。 现有的分布式 KV 存储大多采用 Raft 共识协议,需要两次 RTT 才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。

    但是,当跨数据中心部署时,节点之间的延迟可能是几十或几百毫秒,此时 Raft 协议将成为性能瓶颈。Curp 协议就是为了解决这个问题而设计的。它可以在命令不冲突的情况下减少一个 RTT,从而提高性能。因此,Xline 旨在实现高性能的数据访问和跨数据中心场景下的强一致性。

    @@ -37,4 +37,4 @@ Xline 的建设需要每一位对此感兴趣且愿意付出的你们的参与
  • Curp 相关文章:
    https://medium.com/@datenlord/curp-revisit-the-consensus-protocol-384464be1600
  • Xline 官网:www.xline.cloud
  • -`;export{e as assetURLs,n as default,i as metadata,t as toc}; +`;export{e as assetURLs,s as default,i as metadata,t as toc}; diff --git a/zh-cn/assets/index-b73b42f4.js b/zh-cn/assets/index-2cc15fbf.js similarity index 98% rename from zh-cn/assets/index-b73b42f4.js rename to zh-cn/assets/index-2cc15fbf.js index d5c4a7a..04ba6cb 100644 --- a/zh-cn/assets/index-b73b42f4.js +++ b/zh-cn/assets/index-2cc15fbf.js @@ -1,4 +1,4 @@ -const l="/zh-cn/assets/cover-eeda38bf.png",i=[l],e={label:"Xline v0.6.0:一个用于元数据管理的分布式KV存储",description:"Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。但是,当跨数据中心部署时,节点之间的延迟可能是几十或几百毫秒,此时 Raft 协议将成为性能瓶颈。Curp 协议就是为了解决这个问题而设计的。它可以在命令不冲突的情况下减少一个RTT,从而提高性能。因此,Xline旨在实现高性能的数据访问和跨数据中心场景下的强一致性。",cover:"./cover.png",location:"中国香港",author:["更新版本的"],tags:["Xline"],date:"2023-11-23",title:"Xline v0.6.0: a distributed KV store for metadata management"},t=[{label:"Xline 是什么?我们为什么要做 Xline?",level:2},{label:"V0.6.0 版本有什么新功能?",level:2}],n=`

    封面

    +const l="/zh-cn/assets/cover-eeda38bf.png",i=[l],e={label:"Xline v0.6.0:一个用于元数据管理的分布式KV存储",description:"Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。但是,当跨数据中心部署时,节点之间的延迟可能是几十或几百毫秒,此时 Raft 协议将成为性能瓶颈。Curp 协议就是为了解决这个问题而设计的。它可以在命令不冲突的情况下减少一个RTT,从而提高性能。因此,Xline旨在实现高性能的数据访问和跨数据中心场景下的强一致性。",cover:"./cover.png",location:"中国香港",author:["更新版本的"],tags:["Xline"],date:"2023-11-23",title:"Xline v0.6.0_ a distributed KV store for metadata management"},t=[{label:"Xline 是什么?我们为什么要做 Xline?",level:2},{label:"V0.6.0 版本有什么新功能?",level:2}],n=`

    封面

    Xline 是什么?我们为什么要做 Xline?

    Xline 是一个基于 Curp 协议的,用于管理元数据的分布式 KV 存储。 现有的分布式 KV 存储大多采用 Raft 共识协议,需要两次 RTT 才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。

    但是,当跨数据中心部署时,节点之间的延迟可能是几十或几百毫秒,此时 Raft 协议将成为性能瓶颈。Curp 协议就是为了解决这个问题而设计的。它可以在命令不冲突的情况下减少一个 RTT,从而提高性能。因此,Xline 旨在实现高性能的数据访问和跨数据中心场景下的强一致性。

    diff --git a/zh-cn/assets/index-30613c55.js b/zh-cn/assets/index-34b313c2.js similarity index 97% rename from zh-cn/assets/index-30613c55.js rename to zh-cn/assets/index-34b313c2.js index 10dedc0..4c27ed2 100644 --- a/zh-cn/assets/index-30613c55.js +++ b/zh-cn/assets/index-34b313c2.js @@ -1,4 +1,4 @@ -const p="/zh-cn/assets/cover-266fa864.png",t=[p],o={label:"从云计算到天空计算(一)",description:"2021年,UC Berkeley的Ion Stoica和Scott Shenker,在运行系统热点话题的研讨会上,发布了“从云计算到天空计算”的论文。不同于我们都熟知的Cloud Computing(“云计算”),Sky Computing (“天空计算”),是云计算的未来,是指天空中有很多的云,如何解决跨云的问题,打破不同云之间的隔阂,最大化地利用跨云数据。",cover:"./cover.png",location:"海南",author:["达坦科技"],tags:["Xline"],date:"2023-01-19",title:"From Cloud Computing to Sky Computing (1)"},e=[{label:"简介",level:2},{label:"历史的回顾",level:2},{label:"从因特网获得的启示",level:2},{label:"兼容层",level:2},{label:"未完待续……",level:2}],n=`

    封面

    +const t="/zh-cn/assets/cover-266fa864.png",p=[t],o={label:"从云计算到天空计算(一)",description:"2021年,UC Berkeley的Ion Stoica和Scott Shenker,在运行系统热点话题的研讨会上,发布了“从云计算到天空计算”的论文。不同于我们都熟知的Cloud Computing(“云计算”),Sky Computing (“天空计算”),是云计算的未来,是指天空中有很多的云,如何解决跨云的问题,打破不同云之间的隔阂,最大化地利用跨云数据。",cover:"./cover.png",location:"海南",author:["达坦科技"],tags:["Xline"],date:"2023-01-19",title:"From Cloud Computing to Sky Computing (1)"},n=[{label:"简介",level:2},{label:"历史的回顾",level:2},{label:"从因特网获得的启示",level:2},{label:"兼容层",level:2},{label:"未完待续……",level:2}],e=`

    封面

    2021 年,UC Berkeley 的 Ion Stoica 和 Scott Shenker,在运行系统热点话题的研讨会上,发布了“从云计算到天空计算”的论文。不同于我们都熟知的 Cloud Computing(“云计算”),Sky Computing (“天空计算”),是云计算的未来,是指天空中有很多的云,如何解决跨云的问题,打破不同云之间的隔阂,最大化地利用跨云数据。

    达坦科技的使命正如同论文中描述的“天空计算”的愿景:打造下一代云计算平台,让云之间没有隔阂。为此,新年伊始,我们翻译了这篇论文,将分两期发布。如下是“从云计算到天空计算”的第一部分。

    简介

    @@ -24,4 +24,4 @@ const p="/zh-cn/assets/cover-266fa864.png",t=[p],o={label:"从云计算到天空

    虽然开源软件解决了天空计算中的绝大多数问题, 但是还有一个问题没有解决, 那就是存储问题, 因为每一家云厂商都会提供自己的存储接口。幸运的是已经有一个方案提供 S3 兼容的接口, 甚至一些云厂商自己也会提供 S3 兼容的接口。更进一步, 云平台之间的数据访问应该是可行的, 不会受到阻碍。

    未完待续……

    达坦科技(DatenLord)推出的开源分布式 KV 存储 Xline,就是针对多数据中心场景,实现数据的高性能跨云、跨数据中心共享访问,并保证数据的一致性,方便业务系统实现多地多中心多活部署。

    -

    GitHub 链接:Https://github.com/datenlord/Xline

    `;export{t as assetURLs,n as default,o as metadata,e as toc}; +

    GitHub 链接:Https://github.com/datenlord/Xline

    `;export{p as assetURLs,e as default,o as metadata,n as toc}; diff --git a/zh-cn/assets/index-484500d8.js b/zh-cn/assets/index-39390118.js similarity index 91% rename from zh-cn/assets/index-484500d8.js rename to zh-cn/assets/index-39390118.js index 5ee14c2..e7636fd 100644 --- a/zh-cn/assets/index-484500d8.js +++ b/zh-cn/assets/index-39390118.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/image1-3ae2277f.jpg",e="/zh-cn/assets/image1-0a18e154.png",s=[t,e],a={label:"分布式实验室直播 | 共识算法与跨数据中心一致性的元数据管理",description:"在 2021 年时,UC Berkeley 提出了天空计算(Sky Computing)的概念。所谓天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。Xline 是一款开源分布式 kv 存储系统,基于 curp 共识算法实现,旨在提供跨云元数据管理功能。相比于传统共识协议 Raft 或 Paxos,curp 在天空计算的场景中有着更好的性能表现。",location:"中国海南",tags:["Xline"],date:"2023-02-01",title:"Distributed laboratory live broadcast l Consensus algorithm and consistent metadata management across data centers"},i=[],n=`

    在 2021 年时,UC Berkeley 提出了天空计算(Sky Computing)的概念。所谓天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。Xline 是一款开源分布式 kv 存储系统,基于 curp 共识算法实现,旨在提供跨云元数据管理功能。相比于传统共识协议 Raft 或 Paxos,curp 在天空计算的场景中有着更好的性能表现。

    +const t="/zh-cn/assets/image1-3ae2277f.jpg",a="/zh-cn/assets/image1-0a18e154.png",e=[t,a],s={label:"分布式实验室直播 | 共识算法与跨数据中心一致性的元数据管理",description:"在 2021 年时,UC Berkeley 提出了天空计算(Sky Computing)的概念。所谓天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。Xline 是一款开源分布式 kv 存储系统,基于 curp 共识算法实现,旨在提供跨云元数据管理功能。相比于传统共识协议 Raft 或 Paxos,curp 在天空计算的场景中有着更好的性能表现。",location:"中国海南",tags:["Xline"],date:"2023-02-01",title:"Distributed laboratory live broadcast l Consensus algorithm and consistent metadata management across data centers"},i=[],n=`

    在 2021 年时,UC Berkeley 提出了天空计算(Sky Computing)的概念。所谓天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。Xline 是一款开源分布式 kv 存储系统,基于 curp 共识算法实现,旨在提供跨云元数据管理功能。相比于传统共识协议 Raft 或 Paxos,curp 在天空计算的场景中有着更好的性能表现。

    本周四(2 月 2 日)晚上 8 点,达坦科技和分布式实验室合作,由达坦科技 Rust 分布式存储工程师赵佳炜讲述共识算法与跨数据中心一致性的元数据管理,并介绍 Xline 是如何实现高性能跨数据中心的数据一致性管理。

    图片

    直播亮点:

    @@ -9,6 +9,6 @@ const t="/zh-cn/assets/image1-3ae2277f.jpg",e="/zh-cn/assets/image1-0a18e154.png
  • Xline 接下来的优化方向。
  • 请添加分布式实验室小助手的微信,报名参与直播:

    -

    图片

    +

    图片

    达坦科技(DatenLord)推出的开源分布式 KV 存储 Xline,针对多数据中心场景,实现数据的高性能跨云、跨数据中心共享访问,并保证数据的一致性,方便业务系统实现多地多中心多活部署。

    -

    GitHub 链接:https:github.com/datenlord/Xline

    `;export{s as assetURLs,n as default,a as metadata,i as toc}; +

    GitHub 链接:https:github.com/datenlord/Xline

    `;export{e as assetURLs,n as default,s as metadata,i as toc}; diff --git a/zh-cn/assets/index-67a528fa.js b/zh-cn/assets/index-3da8d133.js similarity index 98% rename from zh-cn/assets/index-67a528fa.js rename to zh-cn/assets/index-3da8d133.js index fe2d357..f765125 100644 --- a/zh-cn/assets/index-67a528fa.js +++ b/zh-cn/assets/index-3da8d133.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/image1-50beaba8.png",t=[e],i={label:"精彩回顾:2023 SpinalHDL 应用前景探索研讨会",description:"达坦科技通过软硬件深度融合的方式打通云间壁垒,实现数据高效跨云访问。其采用硬件加速提升存储性能,目前采用FPGA实现存储相关场景的性能加速。SpinalHDL是达坦科技在产品中使用的硬件描述语言之一,因此,达坦科技一直热心于推广SpinalHDL在业界的落地应用。达坦科技此次联合SpinalHDL社区及该语言的创建者 Charles Papon 举办了 《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。",location:"中国新疆",date:"2023-12-21",title:"Highlights: 2023 SpinalHDL Application Prospect Exploration Workshop"},n=[{label:"Tooling and flow",level:2},{label:"Projects",level:2},{label:"Related Resources",level:2}],o=`

    达坦科技通过软硬件深度融合的方式打通云间壁垒,实现数据高效跨云访问。其采用硬件加速提升存储性能,目前采用 FPGA 实现存储相关场景的性能加速。SpinalHDL 是达坦科技在产品中使用的硬件描述语言之一,因此,达坦科技一直热心于推广 SpinalHDL 在业界的落地应用。

    +const e="/zh-cn/assets/image1-50beaba8.png",t=[e],i={label:"精彩回顾:2023 SpinalHDL 应用前景探索研讨会",description:"达坦科技通过软硬件深度融合的方式打通云间壁垒,实现数据高效跨云访问。其采用硬件加速提升存储性能,目前采用FPGA实现存储相关场景的性能加速。SpinalHDL是达坦科技在产品中使用的硬件描述语言之一,因此,达坦科技一直热心于推广SpinalHDL在业界的落地应用。达坦科技此次联合SpinalHDL社区及该语言的创建者 Charles Papon 举办了 《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。",location:"中国新疆",date:"2023-12-21",title:"Highlights_ 2023 SpinalHDL Application Prospect Exploration Workshop"},n=[{label:"Tooling and flow",level:2},{label:"Projects",level:2},{label:"Related Resources",level:2}],o=`

    达坦科技通过软硬件深度融合的方式打通云间壁垒,实现数据高效跨云访问。其采用硬件加速提升存储性能,目前采用 FPGA 实现存储相关场景的性能加速。SpinalHDL 是达坦科技在产品中使用的硬件描述语言之一,因此,达坦科技一直热心于推广 SpinalHDL 在业界的落地应用。

    达坦科技此次联合 SpinalHDL 社区及该语言的创建者 Charles Papon 举办了《2023 SpinalHDL 应用前景探索》** 的线上研讨会,分为两个 Track。

    Tooling and flow

    Track 1: Tooling and flow

    diff --git a/zh-cn/assets/index-9cbd4195.js b/zh-cn/assets/index-404f0d83.js similarity index 98% rename from zh-cn/assets/index-9cbd4195.js rename to zh-cn/assets/index-404f0d83.js index 34d9912..a0df1b5 100644 --- a/zh-cn/assets/index-9cbd4195.js +++ b/zh-cn/assets/index-404f0d83.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/cover-eeda38bf.png",l=[e],i={label:"Xline v0.2.0:一个用于元数据管理的分布式KV存储",description:"Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。",cover:"./cover.png",location:"中国香港",tags:["Xline"],date:"2023-02-16",title:"Xline v0.2.0: A distributed KV store for metadata management"},t=[{label:"Xline 是什么?我们为什么要做 Xline?",level:2},{label:"V0.2.0 版本有什么新功能?",level:3},{label:"欢迎参与到 Xline 项目中",level:2},{label:"相关链接",level:2}],n=`

    封面

    +const e="/zh-cn/assets/cover-eeda38bf.png",l=[e],i={label:"Xline v0.2.0:一个用于元数据管理的分布式KV存储",description:"Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。",cover:"./cover.png",location:"中国香港",tags:["Xline"],date:"2023-02-16",title:"Xline v0.2.0_ A distributed KV store for metadata management"},t=[{label:"Xline 是什么?我们为什么要做 Xline?",level:2},{label:"V0.2.0 版本有什么新功能?",level:3},{label:"欢迎参与到 Xline 项目中",level:2},{label:"相关链接",level:2}],n=`

    封面

    Xline 是什么?我们为什么要做 Xline?

    Xline 是一个基于 Curp 协议的,用于管理元数据的分布式 KV 存储。 现有的分布式 KV 存储大多采用 Raft 共识协议,需要两次 RTT 才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。

    但是,当跨数据中心部署时,节点之间的延迟可能是几十或几百毫秒,此时 Raft 协议将成为性能瓶颈。Curp 协议就是为了解决这个问题而设计的。它可以在命令不冲突的情况下减少一个 RTT,从而提高性能。因此,Xline 旨在实现高性能的数据访问和跨数据中心场景下的强一致性。

    diff --git a/zh-cn/assets/index-90e44649.js b/zh-cn/assets/index-40bc588f.js similarity index 98% rename from zh-cn/assets/index-90e44649.js rename to zh-cn/assets/index-40bc588f.js index c939e70..432f949 100644 --- a/zh-cn/assets/index-90e44649.js +++ b/zh-cn/assets/index-40bc588f.js @@ -1,4 +1,4 @@ -const s="/zh-cn/assets/image1-85650830.png",a="/zh-cn/assets/image2-d3ac686f.png",t="/zh-cn/assets/image3-d19685f7.png",e="/zh-cn/assets/image4-22c90bed.png",l="/zh-cn/assets/image5-060ec542.png",p="/zh-cn/assets/image6-e95accb5.png",n="/zh-cn/assets/image7-39b0aa47.png",c="/zh-cn/assets/image8-f5342e9f.png",i="/zh-cn/assets/image9-f8fdd108.png",r="/zh-cn/assets/image10-fea0520f.png",C="/zh-cn/assets/image11-3896bab5.png",o="/zh-cn/assets/image12-5d3c96d7.png",h="/zh-cn/assets/image13-56596c1a.png",d="/zh-cn/assets/image14-1cff1399.png",u="/zh-cn/assets/image15-f50d9208.png",g="/zh-cn/assets/image16-73064f95.png",m="/zh-cn/assets/image17-8fbf2614.png",R="/zh-cn/assets/image18-04a62cf7.png",_="/zh-cn/assets/image19-b4bc01e2.png",b="/zh-cn/assets/image20-41386794.png",j="/zh-cn/assets/image21-453c426e.png",y="/zh-cn/assets/image22-e0049342.png",E="/zh-cn/assets/image23-989a38cf.png",S=[s,a,t,e,l,p,n,c,i,r,C,o,h,d,u,g,m,R,_,b,j,y,E],f={label:"基于BSV的高性能并行CRC硬件电路生成器",description:"循环冗余校验码,即Cyclic Redundancy Check (CRC), 是一种在各种通信系统中广泛应用的检错机制。CRC算法的工作原理和哈希函数类似,具体来说,其对任意长度的数据计算出一段唯一的标识(校验和), 然后根据这个标识来判断该数据在传输过程中是否发生变化。CRC检错码在实际生活中有着广泛的应用,诸如网络通信,存储系统等场景下都需要CRC来保证数据传输的正确性。而不同的应用场景往往需要采用不同的CRC配置参数,同时对计算的性能也有不同的需求。例如,在基于Ethernet协议的网络传输中需要采用IEEE802-3协议所规定的CRC参数,同时需要高吞吐率的CRC实现以和网络带宽相匹配。",location:"中国香港",author:["翁万正"],tags:["硬件加速"],date:"2023-07-27",title:"BSV based high performance parallel CRC hardware circuit generator"},x=[{label:"引 言",level:2},{label:"算法原理",level:2},{label:"CRC 计算的定义",level:3},{label:"电路架构与性能",level:2},{label:"架构设计",level:3},{label:"性能与面积",level:3},{label:"使用指南",level:2},{label:"配置参数",level:3},{label:"输入输出接口",level:3},{label:"BSV 使用接口",level:3},{label:"Verilog 使用接口",level:3},{label:"引用和链接",level:2}],v=`

    引 言

    +const s="/zh-cn/assets/image1-85650830.png",a="/zh-cn/assets/image2-d3ac686f.png",t="/zh-cn/assets/image3-d19685f7.png",e="/zh-cn/assets/image4-22c90bed.png",l="/zh-cn/assets/image5-060ec542.png",p="/zh-cn/assets/image6-e95accb5.png",n="/zh-cn/assets/image7-39b0aa47.png",i="/zh-cn/assets/image8-f5342e9f.png",c="/zh-cn/assets/image9-f8fdd108.png",r="/zh-cn/assets/image10-fea0520f.png",C="/zh-cn/assets/image11-3896bab5.png",o="/zh-cn/assets/image12-5d3c96d7.png",h="/zh-cn/assets/image13-56596c1a.png",d="/zh-cn/assets/image14-1cff1399.png",u="/zh-cn/assets/image15-f50d9208.png",g="/zh-cn/assets/image16-73064f95.png",m="/zh-cn/assets/image17-8fbf2614.png",R="/zh-cn/assets/image18-04a62cf7.png",_="/zh-cn/assets/image19-b4bc01e2.png",b="/zh-cn/assets/image20-41386794.png",j="/zh-cn/assets/image21-453c426e.png",E="/zh-cn/assets/image22-e0049342.png",S="/zh-cn/assets/image23-989a38cf.png",f=[s,a,t,e,l,p,n,i,c,r,C,o,h,d,u,g,m,R,_,b,j,E,S],y={label:"基于BSV的高性能并行CRC硬件电路生成器",description:"循环冗余校验码,即Cyclic Redundancy Check (CRC), 是一种在各种通信系统中广泛应用的检错机制。CRC算法的工作原理和哈希函数类似,具体来说,其对任意长度的数据计算出一段唯一的标识(校验和), 然后根据这个标识来判断该数据在传输过程中是否发生变化。CRC检错码在实际生活中有着广泛的应用,诸如网络通信,存储系统等场景下都需要CRC来保证数据传输的正确性。而不同的应用场景往往需要采用不同的CRC配置参数,同时对计算的性能也有不同的需求。例如,在基于Ethernet协议的网络传输中需要采用IEEE802-3协议所规定的CRC参数,同时需要高吞吐率的CRC实现以和网络带宽相匹配。",location:"中国香港",author:["翁万正"],tags:["硬件加速"],date:"2023-07-27",title:"BSV based high performance parallel CRC hardware circuit generator"},x=[{label:"引 言",level:2},{label:"算法原理",level:2},{label:"CRC 计算的定义",level:3},{label:"电路架构与性能",level:2},{label:"架构设计",level:3},{label:"性能与面积",level:3},{label:"使用指南",level:2},{label:"配置参数",level:3},{label:"输入输出接口",level:3},{label:"BSV 使用接口",level:3},{label:"Verilog 使用接口",level:3},{label:"引用和链接",level:2}],F=`

    引 言

    循环冗余校验码,即 Cyclic Redundancy Check (CRC), 是一种在各种通信系统中广泛应用的检错机制。CRC 算法的工作原理和哈希函数类似,具体来说,其对任意长度的数据计算出一段唯一的标识(校验和), 然后根据这个标识来判断该数据在传输过程中是否发生变化。CRC 检错码在实际生活中有着广泛的应用,诸如网络通信,存储系统等场景下都需要 CRC 来保证数据传输的正确性。而不同的应用场景往往需要采用不同的 CRC 配置参数,同时对计算的性能也有不同的需求。例如,在基于 Ethernet 协议的网络传输中需要采用 IEEE802-3 协议所规定的 CRC 参数,同时需要高吞吐率的 CRC 实现以和网络带宽相匹配。

    对于一个具体的通信系统,CRC 既可以通过软件编程也可以硬件电路的形态来实现。相较于网络上丰富的软件库,开源的 CRC 硬件实现却相对落后,尤其是面向高性能的应用场景。例如,下述链接都提供了参数可配置的 CRC 硬件电路生成器,但这些实现方式都是直接将 CRC 算法映射到组合逻辑电路上,这往往会导致较长的组合逻辑延时进而降低电路的整体工作频率,无法满足高吞吐率的需求。

    原文链接: -https://woset-workshop.github.io/PDFs/2021/a02.pdf

    `;export{i as assetURLs,s as default,l as metadata,t as toc}; +https://woset-workshop.github.io/PDFs/2021/a02.pdf

    `;export{l as assetURLs,s as default,i as metadata,t as toc}; diff --git a/zh-cn/assets/index-ef7b41da.js b/zh-cn/assets/index-4dde8fa0.js similarity index 93% rename from zh-cn/assets/index-ef7b41da.js rename to zh-cn/assets/index-4dde8fa0.js index b6db4ca..f95efaf 100644 --- a/zh-cn/assets/index-ef7b41da.js +++ b/zh-cn/assets/index-4dde8fa0.js @@ -1,4 +1,4 @@ -const n="/zh-cn/assets/image1-b917417e.jpg",o="/zh-cn/assets/image1-50beaba8.png",p=[n,o],a={label:"倒计时5天:SpinalHDL应用前景探索线上研讨会",description:"SpinalHDL是一种开源的高级硬件描述语言,它可以作为VHDL或Verilog的替代,Charles Papon 在2014年创建后,伴随着数年来开源硬件设计的蓬勃发展,在多方面显露出优势,譬如:它专注于高效的硬件描述,而不是事件驱动;作为一种基于Scala的DSL,能够借助现有的Scala语言特性和开发工具提供强大、易用、高效的硬件设计能力。达坦科技采用硬件加速提升存储性能,目前采用FPGA实现存储相关场景的性能加速。SpinalHDL是达坦科技在产品中使用的硬件描述语言之一,因此,达坦科技也一直热心于推广SpinalHDL在业界的落地应用。在2023年12月10日,我们将联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。",location:"中国香港",date:"2023-12-05",title:"Countdown to 5 days: SpinalHDL application prospect exploration online seminar"},t=[{label:"Tooling and flow:",level:2},{label:"Projects :",level:2}],s=`

    SpinalHDL 是一种开源的高级硬件描述语言,它可以作为 VHDL 或 Verilog 的替代,Charles Papon 在 2014 年创建后,伴随着数年来开源硬件设计的蓬勃发展,在多方面显露出优势,譬如:它专注于高效的硬件描述,而不是事件驱动;作为一种基于 Scala 的 DSL,能够借助现有的 Scala 语言特性和开发工具提供强大、易用、高效的硬件设计能力。

    +const n="/zh-cn/assets/image1-b917417e.jpg",o="/zh-cn/assets/image1-50beaba8.png",a=[n,o],p={label:"倒计时5天:SpinalHDL应用前景探索线上研讨会",description:"SpinalHDL是一种开源的高级硬件描述语言,它可以作为VHDL或Verilog的替代,Charles Papon 在2014年创建后,伴随着数年来开源硬件设计的蓬勃发展,在多方面显露出优势,譬如:它专注于高效的硬件描述,而不是事件驱动;作为一种基于Scala的DSL,能够借助现有的Scala语言特性和开发工具提供强大、易用、高效的硬件设计能力。达坦科技采用硬件加速提升存储性能,目前采用FPGA实现存储相关场景的性能加速。SpinalHDL是达坦科技在产品中使用的硬件描述语言之一,因此,达坦科技也一直热心于推广SpinalHDL在业界的落地应用。在2023年12月10日,我们将联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。",location:"中国香港",date:"2023-12-05",title:"Countdown to 5 days_ SpinalHDL application prospect exploration online seminar"},t=[{label:"Tooling and flow:",level:2},{label:"Projects :",level:2}],s=`

    SpinalHDL 是一种开源的高级硬件描述语言,它可以作为 VHDL 或 Verilog 的替代,Charles Papon 在 2014 年创建后,伴随着数年来开源硬件设计的蓬勃发展,在多方面显露出优势,譬如:它专注于高效的硬件描述,而不是事件驱动;作为一种基于 Scala 的 DSL,能够借助现有的 Scala 语言特性和开发工具提供强大、易用、高效的硬件设计能力。

    达坦科技采用硬件加速提升存储性能,目前采用 FPGA 实现存储相关场景的性能加速。SpinalHDL 是达坦科技在产品中使用的硬件描述语言之一,因此,达坦科技也一直热心于推广 SpinalHDL 在业界的落地应用

    在 2023 年 12 月 10 日,我们将联合 SpinalHDL 社区及该语言的创建者 Charles Papon 举办 《2023 SpinalHDL 应用前景探索》 的线上研讨会,分为两个 Track。

    Tooling and flow:

    @@ -21,4 +21,4 @@ Explore the SpinalHDL Landscape

    会议链接:
    https://zoom.us/j/82302372789?pwd=OYsFCbiW06KqC4U83ZKsZwefM75gJr.1

    开源硬件和敏捷开发感兴趣的朋友,可以添加达坦科技小助手的微信,加入达坦科技硬件群。

    -

    图片

    `;export{p as assetURLs,s as default,a as metadata,t as toc}; +

    图片

    `;export{a as assetURLs,s as default,p as metadata,t as toc}; diff --git a/zh-cn/assets/index-4e044280.js b/zh-cn/assets/index-4e044280.js new file mode 100644 index 0000000..323785e --- /dev/null +++ b/zh-cn/assets/index-4e044280.js @@ -0,0 +1,60 @@ +const e="/zh-cn/assets/image-8a82c950.png",l="/zh-cn/assets/image1-3fca9c88.png",p="/zh-cn/assets/image2-4b4682e9.png",a="/zh-cn/assets/image3-9e47728d.png",t="/zh-cn/assets/image4-bfeb3386.png",C="/zh-cn/assets/image5-114ef16c.png",c="/zh-cn/assets/image7-f5df505b.png",i="/zh-cn/assets/image6-f738e012.png",I=[e,l,p,a,t,C,c,i],s={label:"规模弹性: 管理谷歌的TPUv4机器学习超级计算机(二)",description:"我由于字数过长,文章分为两期发布,本片涵盖原文后半部分4~9节,前三章节请参考文章:规模弹性:管理谷歌的TPUv4机器学习超级计算机。",location:"中国香港",cover:"./image.png",author:["达坦科技"],date:"2024-06-20",title:"Managing Google's TPUv4 Machine Learning Supercomputer (ll)"},n=[{label:"ICI 路由",level:2},{label:"无故障路由",level:3},{label:"容错路由",level:3},{label:"离线路由优化",level:3},{label:"机群统计数据",level:2},{label:"Cube重新配置",level:3},{label:"硬件维护自动化",level:3},{label:"容错工作",level:3},{label:"相关工作",level:2},{label:"未来工作",level:2},{label:"结论",level:2},{label:"致谢",level:2}],P=`

    图片 +由于字数过长,文章分为两期发布,本片涵盖原文后半部分4~9节,前三章节请参考文章:规模弹性:管理谷歌的TPUv4机器学习超级计算机

    +

    ICI 路由

    +

    我们在高带宽 ICI 链路上使用多跳数据包路由,以提供快速的 TPU RDMA 和集合。ICI 路由允许在 pod 中任意一对 TPU 之间发送 RDMA 数据包,并能绕过某些 ICI 故障。libtpunet 会在作业启动时对 ICI 转发表进行一次编程,并在作业生命周期内保持不变。每个源-目的配对会沿着 ICI 拓扑中的一条预定路径发送数据包。

    +

    这种方法虽然简单,但足以在 ML 模型并行分解过程中出现的典型集体通信模式(如all-gather, reduce-scatter, all-reduce, all-to-all)上实现高性能[33]。

    +

    在本节描述的两种情况下,libtpunet 必须在多个候选路径中谨慎地选择一条路径,以满足 ICI 转发表的约束条件:平局破译和容错 wild-first路由。我们使用整数线性规划方法进行离线路径选择,并将优化结果缓存起来。这样,libtpunet 就能在 ICI 网络设置过程中快速加载预先计算出的解决方案。 +图片 +图 10:沿 4x4x8 环形的 X 维不可用 OCS 影响 ICI 链路的示例。不可用的 OCS 导致环的一个 XZ 平面上有两个 X 链路不可用,其他 XZ 平面则不受影响。不可用链接用红色虚线标出。OCS 的连通性产生了周期性故障模式,即沿 Z 每 4 跳重复出现不可用链接。

    +

    无故障路由

    +

    为常规环形拓扑配置时,ICI 使用维序路由(DOR)[11]:所有数据包按照环形中从源点到目的地的最短路径,以固定顺序(如先 X 后 Y 再 Z)一次路由一个维度。如 [8] 所述,选择的维度顺序是环中较长的维度先路由。DOR 足以平衡 ML 作业常见流量模式的负载。只需两个虚拟通道[10],它就能实现无死锁,因此实施成本很低。

    +

    当数据包需要在一个维度上走完全部路程时,就会出现一个复杂问题,因为在这种情况下,有两条最短路径可供选择。例如,在一个 8x8x8 的环中,将一个数据包从源点(x = 1,y = 0,z = 0)路由到目的地(x = 5,y = 0,z = 0),在 X + 或 X - 方向上可以走 4 跳。

    +

    我们通过算法来处理这种平局的情况:当相关源节点坐标沿该维度为偶数时,数据包会沿正向移动,否则会沿负向移动。在我们的例子中,源节点(x = 1,y = 0,z = 0)的 X 坐标为奇数,因此断线选择 X -。这种方案可以平衡常见的全对全流量模式的负载。

    +

    扭转环中的路由也使用 DOR,并通过两个虚拟通道实现无死锁。不过,在扭曲环中打破平局更为复杂,因为其维度不像常规环那样可分离:图 9 使用两个维度进行了简单说明。我们决定将处理扭曲环形中的平分问题纳入一个更通用的整数线性编程框架,该框架还能处理容错路由(第 4.3 节)。这样就无需在这种情况下开发明确的平局打破算法。

    +

    容错路由

    +

    由于具有动态cube选择能力,可重新配置的 ICI 架构本身就能抵御机器故障。在 libtpunet 中,通过支持容错路由,可进一步抵御 OCS 不可用事件。如果 OCS 不可用,一组稀疏的链接也会变得不可用。如图 10 所示,由于cube与 OCS 的连通性,不可用链接的模式与cube粒度高度对称。只需少量路由灵活性,数据包就能避开断开的链接。我们针对这些情况离线优化路由算法。

    +

    通过维序路由(DOR)选择的源-目的地对之间的路径,如果穿过不可用的链路,就会变得不可用。在这种情况下,可使用 wild-first路由(WFR)创建替代路径。在 WFR 中,允许数据包沿每个维度最多进行一次容错跳转,然后再返回到使用 DOR 的目的地。 +图片 +图 11:源 S 和目的地 D 之间的路由示例(虚线路径)。XY 维顺序路由(A)与不可用链路(红色虚线)交叉,因此无法使用。两条可能的 yXY wild-first 路由(B 和 C)先在 Y 方向走一跳,然后再继续走 XY DOR,从而避免了故障。

    +

    图 11 显示了一个在二维环中的 WFR 路由示例。在这个例子中,维度顺序是先 X 后 Y,只有沿 Y(Y + 或 Y -)的任意跳才有助于避免不可用链接。我们使用简称 yXY 来表示 wild-first路由算法,即在继续 XY 维顺序路由之前,先沿着 Y 进行一次容错跳转。yXY 算法可以避开 X 维上的任何一条不可用链路。

    +

    有一条 “三明治 ”规则体现了 WFR 的容错性:要避免一个维度上的故障,路由算法中必须在其前后出现另一个维度上的跳转。同样,xYX算法可以避免 Y 维的故障。扩展到三维,xyZY X 算法可以避免 Y 维和 Z 维的单一故障。

    +

    WFR 的开发受到 ICI 交换机微体系结构的影响。虽然超出了本文的讨论范围,但 WFR 可以通过两个虚拟通道实现无死锁,但有一个限制条件:野跳顺序必须与维度顺序相反。例如,xyZY X 在两个虚拟通道下无死锁,但 yxZY X 则不然。

    +

    离线路由优化

    +

    前几节介绍了由于平局或 wild-first路由算法而产生多条候选路径的情况。而 ICI 交换机的实现使用的是静态转发表,它为每个源-目的配对设定了一条路径。如前所述,我们将路径选择编程为整数线性程序(ILP),离线计算解决方案,并将其缓存起来,供运行时使用。

    +

    ILP 的目标是通过解决最大并发流量问题,最大化预定义流量模式的吞吐量[27]。通常选择 All-to-all 作为流量模式,并通过补充约束确保其他集合(如 all-reduce)性能良好。为了遵守静态路由约束,每个路径变量都被限制为布尔值,每个源-目的对只有一条路径。

    +

    在无故障和容错情况下,ILP 的设计都是为了利用平移对称性来减少变量数量 [30]。这使得为实际网络规模寻找最优解变得容易。环面和扭曲环面都是顶点对称的,因此可以对一个典型源使用单组路径变量,然后将其转换为所有其他源。如图 10 所示,当 OCS 不可用时,故障模式是周期性的,粒度为cube。虽然由此产生的拓扑结构不如无故障情况下那么对称,但 ILP 仍然可以限制在一组典型源上。这也使得单个典型案例可以离线求解和缓存。典型故障模式可从实际故障模式转化而来,并在网络设置过程中初始化。 +图片 +表 2:在 (a) 所有 OCS 均正常和 (b) 一个 OCS 不可用的情况下测得的全对全吞吐量。最后一列显示了单故障情况与健康情况下的吞吐量。

    +

    表 2 比较了使用这种方法优化转发表时,在无故障和单 OCS 故障情况下测得的全对全吞吐量。对于常规环形网络,单个不可用的 OCS 会将理想的全对全性能降低到无故障网络的 15/16 ≈ 93.4%。这相当于在连接 OCS 的 4x4x4 cube的一个面上失去了 16 个链路中的一个。有趣的是,扭曲环显示出更好的恢复能力,在出现不可用 OCS 的情况下,4x4x8 的性能略有提高。这是因为平分所提供的灵活性:通过平衡不同的平分路径,流量可以从一个维度转移到另一个维度。这种平衡在普通环中是不可能实现的。4x4x8 情况下的微小改进很好地说明了 ILP 方案只能代表实际性能。

    +

    机群统计数据

    +

    在本节中,我们将介绍谷歌在过去两年中运行 TPUv4 超级计算机的机队经验。我们将重点关注软件堆栈对 OCS xconnect、故障和整体系统可用性的自动管理。

    +

    Cube重新配置

    +

    每天都有成千上万的训练任务提交给谷歌的 TPUv4 超级计算机。图 13 显示了一台超级计算机在两个月内的 OCS xconnect 操作样本,与该 pod 接受的作业数量相关。由于 Pod 管理器会在每个作业到达时更新 ICI 端口 xconnect,因此作业数量越多,OCS xconnect 变化也就越多。当有大型和/或长时间运行的培训作业时,我们也会看到 OCS xconnect 的变化,因为这些作业需要重新安排时间来处理维护和故障。总体而言,TPUv4 超级计算机在每个 pod 每天进行数万次 OCS xconnect 更改的情况下仍能可靠运行。 +图片] +图 13:TPUv4 超级计算机在两个抽样月中的 OCS xconnect 操作和接受的作业。

    +

    硬件维护自动化

    +

    TPUv4 的可重构性和容错路由允许对机器和 OCS 故障进行恢复。图 12 显示了每台超级计算机不同硬件组件的平均故障率。

    +

    TPUv4 的计算资源以多机器cube的粒度组织。每个 TPU 机器都有一个 CPU 盘和一个 TPU 盘,通过 PCIe 链接。每个 TPU 托盘有 4 个 TPUv4 芯片,以 2x2x1 ICI 网格排列;16 台 TPU 机器组合成一个数据中心机架;机架内的 ICI 链接通过 ICI 互联,形成 4x4x4 网格。这个组合就是一个cube。

    +

    alt text

    +

    图 12:超级计算机硬件故障和恢复的每周统计,包括 TPU 机器、ICI 电缆和 OCS。

    +

    故障在 TPU 机器、ICI 链路和 OCS 层面进行诊断。Pod 管理器和 healthd 自动执行修复和恢复过程。在一台普通超级计算机中,每天会有 0.08% 的 TPU 机器、0.005% 的 ICI 电缆和 0.04% 的 OCS 出现故障。虽然这些数值很小,但由于每台超级计算机都有大量的机器、ICI 和 OCS,因此受硬件故障影响的工作数量并不少。通过重新配置作业以使用备用的健康cube,可以自动容忍机器和 ICI 中断。OCS 中断的影响半径更大,因为它会影响超级计算机中的所有cube。容错 ICI 路由允许我们容忍 OCS 中断,但会对性能造成一定影响;与其他组件相比,我们优先考虑 OCS 组件的恢复时间,以尽量减少这种影响。

    +

    容错工作

    +

    根据我们迄今为止的经验,95% 的 TPUv4 训练任务都选择了容错 ICI 路由,这样它们就能抵御 OCS 中断;其余的任务则选择了退出,以排除不同路由策略造成的性能不确定性。图 14 显示了在为期 8 个月的样本期间,整个舰队所有正在运行的容错路由作业的比例。一般来说,任何时候都只有不到 2% 的工作在运行容错路由。这一比例与 OCS 维护事件和每次事件的恢复时间高度相关。第 60 天左右的峰值是由于计划对整个机队的 OCS 部件进行升级,以提高可靠性。 +alt text

    +

    图 14:8 个月内使用容错路由(OCS 故障恢复能力)的作业百分比。

    +

    容错 ICI 路由会带来性能损失,因为故障链路周围的流量会更加拥挤。负载不平衡会影响包括 allto-all 和 all-reduce 在内的集体操作。我们测量了一系列关键 Google 工作负载对性能的影响,包括推荐模型 (RM)、大型语言模型 (LLM) 和基于 BERT [13] 的模型。表 3 总结了我们的结果。 +alt text +表 3:容错 ICI 路由对性能的影响。

    +

    对于全对全的繁重工作负载,步进时间的下降并不明显,因为离线路由优化器已经将全对全性能降至最低,甚至有所提高。这一点对于重嵌入的扭弦图形尤为明显。全还原工作负载会受到更高的性能影响,因为最近邻通信模式会受到 50% 吞吐量的影响。通过更智能的计算和通信重叠,可以改善对全还原操作的影响。总体而言,所有工作负载的步进时间都略有减慢。

    +

    相关工作

    +

    文献[18]讨论了 TPUv4 使用 OCS 的架构决策,文献[20]和[19]评估了上一代静态 TPU pod 的设计。本文介绍了 TPUv4 的软件生态系统及其如何实现大规模弹性。文献[25]介绍了 OCS 在生产规模数据中心网络中的应用,讨论了可扩展性、成本和拓扑工程方面的注意事项。本文重点讨论 OCS 在 TPUv4 超级计算机中的应用。

    +

    之前的工作涉及超级计算机的电路交换 [28],并提出了用于 ML 训练的拓扑工程 [32]。Nvidia 在 NVlink 上使用基于 NVswitch 的两层胖树网络,用于 GPU 之间的集群。这代表了与我们不同的设计点:与引入分组交换机相比,OCS 简化了 ICI 网络设计,因为它建立了专用物理通道,无需控制共享流量,同时较低的采购价格和待机功率也降低了运营成本[20]。

    +

    扭曲环是由文献[6, 26]提出的;TPUv4 支持的具体(4k,4k,8k)和(4k,8k,8k)扭曲环形状与文献[7]一致。最后,软件定义的数据中心网络在文献中已有大量描述(如 [14, 16, 25, 29])。据我们所知,我们是第一个为超大规模超级计算机描述这种方法的人。

    +

    未来工作

    +

    我们的短期工作重点是提高 TPU pod 的性能和恢复开销:ML 超级计算硬件的需求量很大,每一点帮助都很重要。今后,除了支持提高 ICI 链路的线路速率外,我们还计划为 ICI 交换机引入随机路由功能,以便在出现故障时更好地平衡环形拓扑和扭曲环形拓扑的负载,特别是最近邻通信模式。

    +

    我们还计划将基于 OCS 的可配置性与工作负载重新配置更紧密地结合起来,让工作在大部分情况下不受故障影响地继续进行。我们的方法是针对故障事件提供热备用cube,并直接将加速器状态迁移到新的 TPU,而无需写入持久检查点。这项工作涉及对 Borg 调度器(按需调配)、libtpunet(动态调整已构建的 ICI 会话)和 Pathways ML 运行时[5](管理状态转移)的更改。

    +

    结论

    +

    TPUv4 超级计算机是一个超大规模的 4096 芯片计算系统,可应对快速发展的 ML 模型在可用性和可扩展性方面的挑战。TPUv4 的性能约为上一代产品的 2.1 倍,还具有基于光路交换的cube级可重构性,并使用容错 ICI 路由,以便在交换机发生故障时仍能运行。

    +

    本文介绍了 TPUv4 的端到端软件基础设施,为拓扑、路由、调度、中断、监控和硬件健康管理提供了灵活性。TPUv4 的软件定义 ICI 网络方法可在大规模机器和交换机故障时提供强大的故障恢复能力。自2020年以来,该软件一直在生产中运行,为谷歌云计算集群和内部用户运行TPUv4超级计算机,并保持99.98%的系统可用性。

    +

    致谢

    +

    我们要感谢我们的合作者:董翔宇、萨巴斯蒂安-穆加赞比 (Sabastian Mugazambi)、萨迈尔-库马尔 (Sameer Kumar)、安迪-科赫 (Andy Koch)、刘建桥参与了项目的启动,赵文博、李宏基、拉金德拉-戈蒂帕蒂 (Rajendra Gottipati)、潘越超、段晧辰、彼得-加文 (Peter Gavin) 在持续测量和监控方面做出了贡献。我们还要感谢 Kais Belgaied 和 Varinder Singh 在软件基础设施的设计和开发过程中提供的支持。最后,特别感谢罗伯特-亨特(Robert Hundt)、诺姆-尤比(Norm Jouppi)、阿默-马哈茂德(Aamer Mahmood)和匿名 NSDI 评审员对本文提出的反馈和建议。

    `;export{I as assetURLs,P as default,s as metadata,n as toc}; diff --git a/zh-cn/assets/index-3fb2c654.js b/zh-cn/assets/index-50ad21f0.js similarity index 97% rename from zh-cn/assets/index-3fb2c654.js rename to zh-cn/assets/index-50ad21f0.js index 0c56372..b5a596d 100644 --- a/zh-cn/assets/index-3fb2c654.js +++ b/zh-cn/assets/index-50ad21f0.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/cover-2326b9d3.jpg",t="/zh-cn/assets/image1-62ba36d5.png",i="/zh-cn/assets/image2-238eb6f5.jpg",l="/zh-cn/assets/image3-9644e0b1.png",s=[e,t,i,l],c={label:"MIT体系结构公开课学习社区2.0版正式上线啦~",description:"随着芯片技术自主可控成为国家重要的战略发展规划,对芯片设计相关领域的人才需求也在快速增长。体系结构课程相对于硬件设计的重要性可以类比于设计模式相对于软件设计的重要性,扎实的体系结构基础是设计复杂硬件的基石。然而现实情况是,虽然国内大专院校计算机学科、电子工程学科、微电子等都有开设体系结构或组成原理等相关课程,但由于前些年对相关教学重视度不够,导致教学实践环节存在诸多缺失,毕业生掌握的技能与工业界的期望之间存在较大差距。由此,在2023年伊始,达坦科技发起成立了MIT体系结构公开课学习社区,邀请所有对硬件敏捷开发设计感兴趣的同学加入我们,组成拥有共同学习目标的互助自学小组,一起系统地学习计算机体系结构相关知识,并且通过动手项目来验证学习的成果。",cover:"./cover.jpg",location:"中国香港",date:"2023-12-14",title:"MIT Architecture Open Course Learning Community Version 2.0 is officially launched~"},a=[{label:"为什么要发起设立 MIT 体系结构公开课学习社区?",level:2},{label:"学习社区运营十个月有什么成果?",level:2},{label:"为什么要升级 MIT 体系结构公开课学习社区 2.0 版?",level:2},{label:"MIT 体系结构公开课学习社区 2.0 版有什么改进?",level:2},{label:"欢迎报名",level:2}],n=`

    封面

    +const e="/zh-cn/assets/cover-2326b9d3.jpg",t="/zh-cn/assets/image1-62ba36d5.png",i="/zh-cn/assets/image2-238eb6f5.jpg",l="/zh-cn/assets/image3-9644e0b1.png",s=[e,t,i,l],a={label:"MIT体系结构公开课学习社区2.0版正式上线啦~",description:"随着芯片技术自主可控成为国家重要的战略发展规划,对芯片设计相关领域的人才需求也在快速增长。体系结构课程相对于硬件设计的重要性可以类比于设计模式相对于软件设计的重要性,扎实的体系结构基础是设计复杂硬件的基石。然而现实情况是,虽然国内大专院校计算机学科、电子工程学科、微电子等都有开设体系结构或组成原理等相关课程,但由于前些年对相关教学重视度不够,导致教学实践环节存在诸多缺失,毕业生掌握的技能与工业界的期望之间存在较大差距。由此,在2023年伊始,达坦科技发起成立了MIT体系结构公开课学习社区,邀请所有对硬件敏捷开发设计感兴趣的同学加入我们,组成拥有共同学习目标的互助自学小组,一起系统地学习计算机体系结构相关知识,并且通过动手项目来验证学习的成果。",cover:"./cover.jpg",location:"中国香港",date:"2023-12-14",title:"MIT Architecture Open Course Learning Community Version 2.0 is officially launched~"},c=[{label:"为什么要发起设立 MIT 体系结构公开课学习社区?",level:2},{label:"学习社区运营十个月有什么成果?",level:2},{label:"为什么要升级 MIT 体系结构公开课学习社区 2.0 版?",level:2},{label:"MIT 体系结构公开课学习社区 2.0 版有什么改进?",level:2},{label:"欢迎报名",level:2}],n=`

    封面

    为什么要发起设立 MIT 体系结构公开课学习社区?

    随着芯片技术自主可控成为国家重要的战略发展规划,对芯片设计相关领域的人才需求也在快速增长。体系结构课程相对于硬件设计的重要性可以类比于设计模式相对于软件设计的重要性,扎实的体系结构基础是设计复杂硬件的基石。然而现实情况是,虽然国内大专院校计算机学科、电子工程学科、微电子等都有开设体系结构或组成原理等相关课程,但由于前些年对相关教学重视度不够,导致教学实践环节存在诸多缺失,毕业生掌握的技能与工业界的期望之间存在较大差距。

    由此,在 2023 年伊始,达坦科技发起成立了 MIT 体系结构公开课学习社区,邀请所有对硬件敏捷开发设计感兴趣的同学加入我们,组成拥有共同学习目标的互助自学小组,一起系统地学习计算机体系结构相关知识,并且通过动手项目来验证学习的成果。

    @@ -46,4 +46,4 @@ const e="/zh-cn/assets/cover-2326b9d3.jpg",t="/zh-cn/assets/image1-62ba36d5.png"

    报名成功后,将收到邮件确认及学号。

    图片

    关于 MIT 体系结构公开课学习社区项目有任何问题或疑问,可以邮件:ta@datenlord.com或添加DatenLord 小助手微信咨询。

    -

    图片

    `;export{s as assetURLs,n as default,c as metadata,a as toc}; +

    图片

    `;export{s as assetURLs,n as default,a as metadata,c as toc}; diff --git a/zh-cn/assets/index-8bcfd31b.js b/zh-cn/assets/index-5689e7f4.js similarity index 92% rename from zh-cn/assets/index-8bcfd31b.js rename to zh-cn/assets/index-5689e7f4.js index 2b93648..2586269 100644 --- a/zh-cn/assets/index-8bcfd31b.js +++ b/zh-cn/assets/index-5689e7f4.js @@ -1,4 +1,4 @@ -const n="/zh-cn/assets/cover-dcd7e2ce.jpeg",t="/zh-cn/assets/image1-3ae2277f.jpg",s="/zh-cn/assets/image1-0a18e154.png",e=[n,t,s],o={label:"分布式实验室直播 | 共识算法与跨数据中心一致性的元数据管理",description:"在 2021 年时,UC Berkeley 提出了天空计算(Sky Computing)的概念。所谓天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。Xline 是一款开源分布式 kv 存储系统,基于 curp 共识算法实现,旨在提供跨云元数据管理功能。相比于传统共识协议 Raft 或 Paxos,curp 在天空计算的场景中有着更好的性能表现。",cover:"./cover.jpeg",location:"海南",date:"2023-02-01",title:"Consensus Algorithms and Metadata Management for Cross Data Center Consistency"},r=[],a=`

    在 2021 年时,UC Berkeley 提出了 天空计算(Sky Computing) 的概念。所谓天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。 Xline 是一款开源分布式 kv 存储系统, 基于 curp 共识算法实现,旨在提供跨云元数据管理功能。相比于传统共识协议 Raft 或 Paxos,curp 在天空计算的场景中有着更好的性能表现

    +const n="/zh-cn/assets/cover-dcd7e2ce.jpeg",t="/zh-cn/assets/image1-3ae2277f.jpg",s="/zh-cn/assets/image1-0a18e154.png",o=[n,t,s],e={label:"分布式实验室直播 | 共识算法与跨数据中心一致性的元数据管理",description:"在 2021 年时,UC Berkeley 提出了天空计算(Sky Computing)的概念。所谓天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。Xline 是一款开源分布式 kv 存储系统,基于 curp 共识算法实现,旨在提供跨云元数据管理功能。相比于传统共识协议 Raft 或 Paxos,curp 在天空计算的场景中有着更好的性能表现。",cover:"./cover.jpeg",location:"海南",date:"2023-02-01",title:"Consensus Algorithms and Metadata Management for Cross Data Center Consistency"},r=[],a=`

    在 2021 年时,UC Berkeley 提出了 天空计算(Sky Computing) 的概念。所谓天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。 Xline 是一款开源分布式 kv 存储系统, 基于 curp 共识算法实现,旨在提供跨云元数据管理功能。相比于传统共识协议 Raft 或 Paxos,curp 在天空计算的场景中有着更好的性能表现

    本周四(2 月 2 日)晚上 8 点,达坦科技和分布式实验室合作,由达坦科技 Rust 分布式存储工程师赵佳炜讲述共识算法与跨数据中心一致性的元数据管理,并介绍 Xline 是如何实现高性能跨数据中心的数据一致性管理。

    图片

    直播亮点:

    @@ -11,4 +11,4 @@ const n="/zh-cn/assets/cover-dcd7e2ce.jpeg",t="/zh-cn/assets/image1-3ae2277f.jpg

    请添加分布式实验室小助手的微信,报名参与直播:

    图片

    达坦科技(DatenLord)推出的开源分布式 KV 存储 Xline,针对多数据中心场景,实现数据的高性能跨云、跨数据中心共享访问,并保证数据的一致性,方便业务系统实现多地多中心多活部署。

    -

    GitHub 链接:https://github.com/xline-kv/

    `;export{e as assetURLs,a as default,o as metadata,r as toc}; +

    GitHub 链接:https://github.com/xline-kv/

    `;export{o as assetURLs,a as default,e as metadata,r as toc}; diff --git a/zh-cn/assets/index-581fb095.js b/zh-cn/assets/index-581fb095.js new file mode 100644 index 0000000..c355829 --- /dev/null +++ b/zh-cn/assets/index-581fb095.js @@ -0,0 +1,3106 @@ +var Kj=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var HQ=Kj(($Q,wu)=>{function J_(e,t){for(var r=0;rn[i]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const a of o.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&n(a)}).observe(document,{childList:!0,subtree:!0});function r(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=r(i);fetch(i.href,o)}})();var fs=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function C0(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function Qj(e){if(e.__esModule)return e;var t=e.default;if(typeof t=="function"){var r=function n(){return this instanceof n?Reflect.construct(t,arguments,this.constructor):t.apply(this,arguments)};r.prototype=t.prototype}else r={};return Object.defineProperty(r,"__esModule",{value:!0}),Object.keys(e).forEach(function(n){var i=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(r,n,i.get?i:{enumerable:!0,get:function(){return e[n]}})}),r}var e2={exports:{}},vd={},t2={exports:{}},ke={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Nl=Symbol.for("react.element"),qj=Symbol.for("react.portal"),Zj=Symbol.for("react.fragment"),Jj=Symbol.for("react.strict_mode"),eT=Symbol.for("react.profiler"),tT=Symbol.for("react.provider"),rT=Symbol.for("react.context"),nT=Symbol.for("react.forward_ref"),iT=Symbol.for("react.suspense"),oT=Symbol.for("react.memo"),sT=Symbol.for("react.lazy"),yy=Symbol.iterator;function aT(e){return e===null||typeof e!="object"?null:(e=yy&&e[yy]||e["@@iterator"],typeof e=="function"?e:null)}var r2={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},n2=Object.assign,i2={};function Js(e,t,r){this.props=e,this.context=t,this.refs=i2,this.updater=r||r2}Js.prototype.isReactComponent={};Js.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Js.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function o2(){}o2.prototype=Js.prototype;function D0(e,t,r){this.props=e,this.context=t,this.refs=i2,this.updater=r||r2}var E0=D0.prototype=new o2;E0.constructor=D0;n2(E0,Js.prototype);E0.isPureReactComponent=!0;var wy=Array.isArray,s2=Object.prototype.hasOwnProperty,j0={current:null},a2={key:!0,ref:!0,__self:!0,__source:!0};function l2(e,t,r){var n,i={},o=null,a=null;if(t!=null)for(n in t.ref!==void 0&&(a=t.ref),t.key!==void 0&&(o=""+t.key),t)s2.call(t,n)&&!a2.hasOwnProperty(n)&&(i[n]=t[n]);var c=arguments.length-2;if(c===1)i.children=r;else if(1>>1,pe=W[ge];if(0>>1;gei(te,ee))pti(Mt,te)?(W[ge]=Mt,W[pt]=ee,ge=pt):(W[ge]=te,W[Ae]=ee,ge=Ae);else if(pti(Mt,ee))W[ge]=Mt,W[pt]=ee,ge=pt;else break e}}return ue}function i(W,ue){var ee=W.sortIndex-ue.sortIndex;return ee!==0?ee:W.id-ue.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var a=Date,c=a.now();e.unstable_now=function(){return a.now()-c}}var d=[],h=[],g=1,v=null,y=3,S=!1,C=!1,D=!1,T=typeof setTimeout=="function"?setTimeout:null,b=typeof clearTimeout=="function"?clearTimeout:null,w=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function k(W){for(var ue=r(h);ue!==null;){if(ue.callback===null)n(h);else if(ue.startTime<=W)n(h),ue.sortIndex=ue.expirationTime,t(d,ue);else break;ue=r(h)}}function A(W){if(D=!1,k(W),!C)if(r(d)!==null)C=!0,it(M);else{var ue=r(h);ue!==null&&Ee(A,ue.startTime-W)}}function M(W,ue){C=!1,D&&(D=!1,b(P),P=-1),S=!0;var ee=y;try{for(k(ue),v=r(d);v!==null&&(!(v.expirationTime>ue)||W&&!K());){var ge=v.callback;if(typeof ge=="function"){v.callback=null,y=v.priorityLevel;var pe=ge(v.expirationTime<=ue);ue=e.unstable_now(),typeof pe=="function"?v.callback=pe:v===r(d)&&n(d),k(ue)}else n(d);v=r(d)}if(v!==null)var Ke=!0;else{var Ae=r(h);Ae!==null&&Ee(A,Ae.startTime-ue),Ke=!1}return Ke}finally{v=null,y=ee,S=!1}}var E=!1,I=null,P=-1,z=5,Y=-1;function K(){return!(e.unstable_now()-YW||125ge?(W.sortIndex=ee,t(h,W),r(d)===null&&W===r(h)&&(D?(b(P),P=-1):D=!0,Ee(A,ee-ge))):(W.sortIndex=pe,t(d,W),C||S||(C=!0,it(M))),W},e.unstable_shouldYield=K,e.unstable_wrapCallback=function(W){var ue=y;return function(){var ee=y;y=ue;try{return W.apply(this,arguments)}finally{y=ee}}}})(h2);f2.exports=h2;var wT=f2.exports;/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var _T=N,Sr=wT;function F(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=1;r"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Gm=Object.prototype.hasOwnProperty,xT=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,xy={},Sy={};function ST(e){return Gm.call(Sy,e)?!0:Gm.call(xy,e)?!1:xT.test(e)?Sy[e]=!0:(xy[e]=!0,!1)}function bT(e,t,r,n){if(r!==null&&r.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return n?!1:r!==null?!r.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function kT(e,t,r,n){if(t===null||typeof t>"u"||bT(e,t,r,n))return!0;if(n)return!1;if(r!==null)switch(r.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function Jt(e,t,r,n,i,o,a){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=n,this.attributeNamespace=i,this.mustUseProperty=r,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=a}var Yt={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Yt[e]=new Jt(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Yt[t]=new Jt(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){Yt[e]=new Jt(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Yt[e]=new Jt(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Yt[e]=new Jt(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){Yt[e]=new Jt(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){Yt[e]=new Jt(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){Yt[e]=new Jt(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){Yt[e]=new Jt(e,5,!1,e.toLowerCase(),null,!1,!1)});var R0=/[\-:]([a-z])/g;function A0(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(R0,A0);Yt[t]=new Jt(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(R0,A0);Yt[t]=new Jt(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(R0,A0);Yt[t]=new Jt(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){Yt[e]=new Jt(e,1,!1,e.toLowerCase(),null,!1,!1)});Yt.xlinkHref=new Jt("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){Yt[e]=new Jt(e,1,!1,e.toLowerCase(),null,!0,!0)});function P0(e,t,r,n){var i=Yt.hasOwnProperty(t)?Yt[t]:null;(i!==null?i.type!==0:n||!(2c||i[a]!==o[c]){var d=` +`+i[a].replace(" at new "," at ");return e.displayName&&d.includes("")&&(d=d.replace("",e.displayName)),d}while(1<=a&&0<=c);break}}}finally{oh=!1,Error.prepareStackTrace=r}return(e=e?e.displayName||e.name:"")?Va(e):""}function CT(e){switch(e.tag){case 5:return Va(e.type);case 16:return Va("Lazy");case 13:return Va("Suspense");case 19:return Va("SuspenseList");case 0:case 2:case 15:return e=sh(e.type,!1),e;case 11:return e=sh(e.type.render,!1),e;case 1:return e=sh(e.type,!0),e;default:return""}}function qm(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case ms:return"Fragment";case hs:return"Portal";case Xm:return"Profiler";case O0:return"StrictMode";case Km:return"Suspense";case Qm:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case g2:return(e.displayName||"Context")+".Consumer";case p2:return(e._context.displayName||"Context")+".Provider";case L0:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case M0:return t=e.displayName||null,t!==null?t:qm(e.type)||"Memo";case _i:t=e._payload,e=e._init;try{return qm(e(t))}catch{}}return null}function DT(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return qm(t);case 8:return t===O0?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Wi(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function y2(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function ET(e){var t=y2(e)?"checked":"value",r=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),n=""+e[t];if(!e.hasOwnProperty(t)&&typeof r<"u"&&typeof r.get=="function"&&typeof r.set=="function"){var i=r.get,o=r.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(a){n=""+a,o.call(this,a)}}),Object.defineProperty(e,t,{enumerable:r.enumerable}),{getValue:function(){return n},setValue:function(a){n=""+a},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function vc(e){e._valueTracker||(e._valueTracker=ET(e))}function w2(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var r=t.getValue(),n="";return e&&(n=y2(e)?e.checked?"true":"false":e.value),e=n,e!==r?(t.setValue(e),!0):!1}function _u(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Zm(e,t){var r=t.checked;return mt({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:r??e._wrapperState.initialChecked})}function ky(e,t){var r=t.defaultValue==null?"":t.defaultValue,n=t.checked!=null?t.checked:t.defaultChecked;r=Wi(t.value!=null?t.value:r),e._wrapperState={initialChecked:n,initialValue:r,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function _2(e,t){t=t.checked,t!=null&&P0(e,"checked",t,!1)}function Jm(e,t){_2(e,t);var r=Wi(t.value),n=t.type;if(r!=null)n==="number"?(r===0&&e.value===""||e.value!=r)&&(e.value=""+r):e.value!==""+r&&(e.value=""+r);else if(n==="submit"||n==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?ep(e,t.type,r):t.hasOwnProperty("defaultValue")&&ep(e,t.type,Wi(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Cy(e,t,r){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var n=t.type;if(!(n!=="submit"&&n!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,r||t===e.value||(e.value=t),e.defaultValue=t}r=e.name,r!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,r!==""&&(e.name=r)}function ep(e,t,r){(t!=="number"||_u(e.ownerDocument)!==e)&&(r==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+r&&(e.defaultValue=""+r))}var Ya=Array.isArray;function Es(e,t,r,n){if(e=e.options,t){t={};for(var i=0;i"+t.valueOf().toString()+"",t=yc.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function ol(e,t){if(t){var r=e.firstChild;if(r&&r===e.lastChild&&r.nodeType===3){r.nodeValue=t;return}}e.textContent=t}var Ba={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},jT=["Webkit","ms","Moz","O"];Object.keys(Ba).forEach(function(e){jT.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Ba[t]=Ba[e]})});function k2(e,t,r){return t==null||typeof t=="boolean"||t===""?"":r||typeof t!="number"||t===0||Ba.hasOwnProperty(e)&&Ba[e]?(""+t).trim():t+"px"}function C2(e,t){e=e.style;for(var r in t)if(t.hasOwnProperty(r)){var n=r.indexOf("--")===0,i=k2(r,t[r],n);r==="float"&&(r="cssFloat"),n?e.setProperty(r,i):e[r]=i}}var TT=mt({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function np(e,t){if(t){if(TT[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(F(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(F(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(F(61))}if(t.style!=null&&typeof t.style!="object")throw Error(F(62))}}function ip(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var op=null;function I0(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var sp=null,js=null,Ts=null;function jy(e){if(e=zl(e)){if(typeof sp!="function")throw Error(F(280));var t=e.stateNode;t&&(t=Sd(t),sp(e.stateNode,e.type,t))}}function D2(e){js?Ts?Ts.push(e):Ts=[e]:js=e}function E2(){if(js){var e=js,t=Ts;if(Ts=js=null,jy(e),t)for(e=0;e>>=0,e===0?32:31-(zT(e)/HT|0)|0}var wc=64,_c=4194304;function za(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function ku(e,t){var r=e.pendingLanes;if(r===0)return 0;var n=0,i=e.suspendedLanes,o=e.pingedLanes,a=r&268435455;if(a!==0){var c=a&~i;c!==0?n=za(c):(o&=a,o!==0&&(n=za(o)))}else a=r&~i,a!==0?n=za(a):o!==0&&(n=za(o));if(n===0)return 0;if(t!==0&&t!==n&&!(t&i)&&(i=n&-n,o=t&-t,i>=o||i===16&&(o&4194240)!==0))return t;if(n&4&&(n|=r&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=n;0r;r++)t.push(e);return t}function Vl(e,t,r){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-en(t),e[t]=r}function BT(e,t){var r=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var n=e.eventTimes;for(e=e.expirationTimes;0=Ga),Ny=String.fromCharCode(32),Vy=!1;function G2(e,t){switch(e){case"keyup":return wR.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function X2(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var ps=!1;function xR(e,t){switch(e){case"compositionend":return X2(t);case"keypress":return t.which!==32?null:(Vy=!0,Ny);case"textInput":return e=t.data,e===Ny&&Vy?null:e;default:return null}}function SR(e,t){if(ps)return e==="compositionend"||!$0&&G2(e,t)?(e=B2(),ru=H0=Di=null,ps=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=Fy(r)}}function Z2(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Z2(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function J2(){for(var e=window,t=_u();t instanceof e.HTMLIFrameElement;){try{var r=typeof t.contentWindow.location.href=="string"}catch{r=!1}if(r)e=t.contentWindow;else break;t=_u(e.document)}return t}function B0(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function AR(e){var t=J2(),r=e.focusedElem,n=e.selectionRange;if(t!==r&&r&&r.ownerDocument&&Z2(r.ownerDocument.documentElement,r)){if(n!==null&&B0(r)){if(t=n.start,e=n.end,e===void 0&&(e=t),"selectionStart"in r)r.selectionStart=t,r.selectionEnd=Math.min(e,r.value.length);else if(e=(t=r.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var i=r.textContent.length,o=Math.min(n.start,i);n=n.end===void 0?o:Math.min(n.end,i),!e.extend&&o>n&&(i=n,n=o,o=i),i=Uy(r,o);var a=Uy(r,n);i&&a&&(e.rangeCount!==1||e.anchorNode!==i.node||e.anchorOffset!==i.offset||e.focusNode!==a.node||e.focusOffset!==a.offset)&&(t=t.createRange(),t.setStart(i.node,i.offset),e.removeAllRanges(),o>n?(e.addRange(t),e.extend(a.node,a.offset)):(t.setEnd(a.node,a.offset),e.addRange(t)))}}for(t=[],e=r;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof r.focus=="function"&&r.focus(),r=0;r=document.documentMode,gs=null,fp=null,Ka=null,hp=!1;function $y(e,t,r){var n=r.window===r?r.document:r.nodeType===9?r:r.ownerDocument;hp||gs==null||gs!==_u(n)||(n=gs,"selectionStart"in n&&B0(n)?n={start:n.selectionStart,end:n.selectionEnd}:(n=(n.ownerDocument&&n.ownerDocument.defaultView||window).getSelection(),n={anchorNode:n.anchorNode,anchorOffset:n.anchorOffset,focusNode:n.focusNode,focusOffset:n.focusOffset}),Ka&&dl(Ka,n)||(Ka=n,n=Eu(fp,"onSelect"),0ws||(e.current=wp[ws],wp[ws]=null,ws--)}function Xe(e,t){ws++,wp[ws]=e.current,e.current=t}var Gi={},Bt=Qi(Gi),ur=Qi(!1),Co=Gi;function zs(e,t){var r=e.type.contextTypes;if(!r)return Gi;var n=e.stateNode;if(n&&n.__reactInternalMemoizedUnmaskedChildContext===t)return n.__reactInternalMemoizedMaskedChildContext;var i={},o;for(o in r)i[o]=t[o];return n&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=i),i}function dr(e){return e=e.childContextTypes,e!=null}function Tu(){tt(ur),tt(Bt)}function qy(e,t,r){if(Bt.current!==Gi)throw Error(F(168));Xe(Bt,t),Xe(ur,r)}function lx(e,t,r){var n=e.stateNode;if(t=t.childContextTypes,typeof n.getChildContext!="function")return r;n=n.getChildContext();for(var i in n)if(!(i in t))throw Error(F(108,DT(e)||"Unknown",i));return mt({},r,n)}function Ru(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Gi,Co=Bt.current,Xe(Bt,e),Xe(ur,ur.current),!0}function Zy(e,t,r){var n=e.stateNode;if(!n)throw Error(F(169));r?(e=lx(e,t,Co),n.__reactInternalMemoizedMergedChildContext=e,tt(ur),tt(Bt),Xe(Bt,e)):tt(ur),Xe(ur,r)}var Un=null,bd=!1,_h=!1;function cx(e){Un===null?Un=[e]:Un.push(e)}function UR(e){bd=!0,cx(e)}function qi(){if(!_h&&Un!==null){_h=!0;var e=0,t=He;try{var r=Un;for(He=1;e>=a,i-=a,$n=1<<32-en(t)+i|r<P?(z=I,I=null):z=I.sibling;var Y=y(b,I,k[P],A);if(Y===null){I===null&&(I=z);break}e&&I&&Y.alternate===null&&t(b,I),w=o(Y,w,P),E===null?M=Y:E.sibling=Y,E=Y,I=z}if(P===k.length)return r(b,I),ut&&co(b,P),M;if(I===null){for(;PP?(z=I,I=null):z=I.sibling;var K=y(b,I,Y.value,A);if(K===null){I===null&&(I=z);break}e&&I&&K.alternate===null&&t(b,I),w=o(K,w,P),E===null?M=K:E.sibling=K,E=K,I=z}if(Y.done)return r(b,I),ut&&co(b,P),M;if(I===null){for(;!Y.done;P++,Y=k.next())Y=v(b,Y.value,A),Y!==null&&(w=o(Y,w,P),E===null?M=Y:E.sibling=Y,E=Y);return ut&&co(b,P),M}for(I=n(b,I);!Y.done;P++,Y=k.next())Y=S(I,b,P,Y.value,A),Y!==null&&(e&&Y.alternate!==null&&I.delete(Y.key===null?P:Y.key),w=o(Y,w,P),E===null?M=Y:E.sibling=Y,E=Y);return e&&I.forEach(function(Q){return t(b,Q)}),ut&&co(b,P),M}function T(b,w,k,A){if(typeof k=="object"&&k!==null&&k.type===ms&&k.key===null&&(k=k.props.children),typeof k=="object"&&k!==null){switch(k.$$typeof){case gc:e:{for(var M=k.key,E=w;E!==null;){if(E.key===M){if(M=k.type,M===ms){if(E.tag===7){r(b,E.sibling),w=i(E,k.props.children),w.return=b,b=w;break e}}else if(E.elementType===M||typeof M=="object"&&M!==null&&M.$$typeof===_i&&t1(M)===E.type){r(b,E.sibling),w=i(E,k.props),w.ref=Ca(b,E,k),w.return=b,b=w;break e}r(b,E);break}else t(b,E);E=E.sibling}k.type===ms?(w=So(k.props.children,b.mode,A,k.key),w.return=b,b=w):(A=uu(k.type,k.key,k.props,null,b.mode,A),A.ref=Ca(b,w,k),A.return=b,b=A)}return a(b);case hs:e:{for(E=k.key;w!==null;){if(w.key===E)if(w.tag===4&&w.stateNode.containerInfo===k.containerInfo&&w.stateNode.implementation===k.implementation){r(b,w.sibling),w=i(w,k.children||[]),w.return=b,b=w;break e}else{r(b,w);break}else t(b,w);w=w.sibling}w=jh(k,b.mode,A),w.return=b,b=w}return a(b);case _i:return E=k._init,T(b,w,E(k._payload),A)}if(Ya(k))return C(b,w,k,A);if(_a(k))return D(b,w,k,A);Ec(b,k)}return typeof k=="string"&&k!==""||typeof k=="number"?(k=""+k,w!==null&&w.tag===6?(r(b,w.sibling),w=i(w,k),w.return=b,b=w):(r(b,w),w=Eh(k,b.mode,A),w.return=b,b=w),a(b)):r(b,w)}return T}var Fs=hx(!0),mx=hx(!1),Ou=Qi(null),Lu=null,Ss=null,K0=null;function Q0(){K0=Ss=Lu=null}function q0(e){var t=Ou.current;tt(Ou),e._currentValue=t}function Sp(e,t,r){for(;e!==null;){var n=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,n!==null&&(n.childLanes|=t)):n!==null&&(n.childLanes&t)!==t&&(n.childLanes|=t),e===r)break;e=e.return}}function As(e,t){Lu=e,K0=Ss=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(cr=!0),e.firstContext=null)}function Lr(e){var t=e._currentValue;if(K0!==e)if(e={context:e,memoizedValue:t,next:null},Ss===null){if(Lu===null)throw Error(F(308));Ss=e,Lu.dependencies={lanes:0,firstContext:e}}else Ss=Ss.next=e;return t}var go=null;function Z0(e){go===null?go=[e]:go.push(e)}function px(e,t,r,n){var i=t.interleaved;return i===null?(r.next=r,Z0(t)):(r.next=i.next,i.next=r),t.interleaved=r,ei(e,n)}function ei(e,t){e.lanes|=t;var r=e.alternate;for(r!==null&&(r.lanes|=t),r=e,e=e.return;e!==null;)e.childLanes|=t,r=e.alternate,r!==null&&(r.childLanes|=t),r=e,e=e.return;return r.tag===3?r.stateNode:null}var xi=!1;function J0(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function gx(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Xn(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Ii(e,t,r){var n=e.updateQueue;if(n===null)return null;if(n=n.shared,Pe&2){var i=n.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),n.pending=t,ei(e,r)}return i=n.interleaved,i===null?(t.next=t,Z0(n)):(t.next=i.next,i.next=t),n.interleaved=t,ei(e,r)}function iu(e,t,r){if(t=t.updateQueue,t!==null&&(t=t.shared,(r&4194240)!==0)){var n=t.lanes;n&=e.pendingLanes,r|=n,t.lanes=r,V0(e,r)}}function r1(e,t){var r=e.updateQueue,n=e.alternate;if(n!==null&&(n=n.updateQueue,r===n)){var i=null,o=null;if(r=r.firstBaseUpdate,r!==null){do{var a={eventTime:r.eventTime,lane:r.lane,tag:r.tag,payload:r.payload,callback:r.callback,next:null};o===null?i=o=a:o=o.next=a,r=r.next}while(r!==null);o===null?i=o=t:o=o.next=t}else i=o=t;r={baseState:n.baseState,firstBaseUpdate:i,lastBaseUpdate:o,shared:n.shared,effects:n.effects},e.updateQueue=r;return}e=r.lastBaseUpdate,e===null?r.firstBaseUpdate=t:e.next=t,r.lastBaseUpdate=t}function Mu(e,t,r,n){var i=e.updateQueue;xi=!1;var o=i.firstBaseUpdate,a=i.lastBaseUpdate,c=i.shared.pending;if(c!==null){i.shared.pending=null;var d=c,h=d.next;d.next=null,a===null?o=h:a.next=h,a=d;var g=e.alternate;g!==null&&(g=g.updateQueue,c=g.lastBaseUpdate,c!==a&&(c===null?g.firstBaseUpdate=h:c.next=h,g.lastBaseUpdate=d))}if(o!==null){var v=i.baseState;a=0,g=h=d=null,c=o;do{var y=c.lane,S=c.eventTime;if((n&y)===y){g!==null&&(g=g.next={eventTime:S,lane:0,tag:c.tag,payload:c.payload,callback:c.callback,next:null});e:{var C=e,D=c;switch(y=t,S=r,D.tag){case 1:if(C=D.payload,typeof C=="function"){v=C.call(S,v,y);break e}v=C;break e;case 3:C.flags=C.flags&-65537|128;case 0:if(C=D.payload,y=typeof C=="function"?C.call(S,v,y):C,y==null)break e;v=mt({},v,y);break e;case 2:xi=!0}}c.callback!==null&&c.lane!==0&&(e.flags|=64,y=i.effects,y===null?i.effects=[c]:y.push(c))}else S={eventTime:S,lane:y,tag:c.tag,payload:c.payload,callback:c.callback,next:null},g===null?(h=g=S,d=v):g=g.next=S,a|=y;if(c=c.next,c===null){if(c=i.shared.pending,c===null)break;y=c,c=y.next,y.next=null,i.lastBaseUpdate=y,i.shared.pending=null}}while(1);if(g===null&&(d=v),i.baseState=d,i.firstBaseUpdate=h,i.lastBaseUpdate=g,t=i.shared.interleaved,t!==null){i=t;do a|=i.lane,i=i.next;while(i!==t)}else o===null&&(i.shared.lanes=0);jo|=a,e.lanes=a,e.memoizedState=v}}function n1(e,t,r){if(e=t.effects,t.effects=null,e!==null)for(t=0;tr?r:4,e(!0);var n=Sh.transition;Sh.transition={};try{e(!1),t()}finally{He=r,Sh.transition=n}}function Ox(){return Mr().memoizedState}function GR(e,t,r){var n=Vi(e);if(r={lane:n,action:r,hasEagerState:!1,eagerState:null,next:null},Lx(e))Mx(t,r);else if(r=px(e,t,r,n),r!==null){var i=qt();tn(r,e,n,i),Ix(r,t,n)}}function XR(e,t,r){var n=Vi(e),i={lane:n,action:r,hasEagerState:!1,eagerState:null,next:null};if(Lx(e))Mx(t,i);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var a=t.lastRenderedState,c=o(a,r);if(i.hasEagerState=!0,i.eagerState=c,nn(c,a)){var d=t.interleaved;d===null?(i.next=i,Z0(t)):(i.next=d.next,d.next=i),t.interleaved=i;return}}catch{}finally{}r=px(e,t,i,n),r!==null&&(i=qt(),tn(r,e,n,i),Ix(r,t,n))}}function Lx(e){var t=e.alternate;return e===ht||t!==null&&t===ht}function Mx(e,t){Qa=Nu=!0;var r=e.pending;r===null?t.next=t:(t.next=r.next,r.next=t),e.pending=t}function Ix(e,t,r){if(r&4194240){var n=t.lanes;n&=e.pendingLanes,r|=n,t.lanes=r,V0(e,r)}}var Vu={readContext:Lr,useCallback:zt,useContext:zt,useEffect:zt,useImperativeHandle:zt,useInsertionEffect:zt,useLayoutEffect:zt,useMemo:zt,useReducer:zt,useRef:zt,useState:zt,useDebugValue:zt,useDeferredValue:zt,useTransition:zt,useMutableSource:zt,useSyncExternalStore:zt,useId:zt,unstable_isNewReconciler:!1},KR={readContext:Lr,useCallback:function(e,t){return mn().memoizedState=[e,t===void 0?null:t],e},useContext:Lr,useEffect:o1,useImperativeHandle:function(e,t,r){return r=r!=null?r.concat([e]):null,su(4194308,4,jx.bind(null,t,e),r)},useLayoutEffect:function(e,t){return su(4194308,4,e,t)},useInsertionEffect:function(e,t){return su(4,2,e,t)},useMemo:function(e,t){var r=mn();return t=t===void 0?null:t,e=e(),r.memoizedState=[e,t],e},useReducer:function(e,t,r){var n=mn();return t=r!==void 0?r(t):t,n.memoizedState=n.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},n.queue=e,e=e.dispatch=GR.bind(null,ht,e),[n.memoizedState,e]},useRef:function(e){var t=mn();return e={current:e},t.memoizedState=e},useState:i1,useDebugValue:ag,useDeferredValue:function(e){return mn().memoizedState=e},useTransition:function(){var e=i1(!1),t=e[0];return e=WR.bind(null,e[1]),mn().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,r){var n=ht,i=mn();if(ut){if(r===void 0)throw Error(F(407));r=r()}else{if(r=t(),Ot===null)throw Error(F(349));Eo&30||_x(n,t,r)}i.memoizedState=r;var o={value:r,getSnapshot:t};return i.queue=o,o1(Sx.bind(null,n,o,e),[e]),n.flags|=2048,wl(9,xx.bind(null,n,o,r,t),void 0,null),r},useId:function(){var e=mn(),t=Ot.identifierPrefix;if(ut){var r=Bn,n=$n;r=(n&~(1<<32-en(n)-1)).toString(32)+r,t=":"+t+"R"+r,r=vl++,0<\/script>",e=e.removeChild(e.firstChild)):typeof n.is=="string"?e=a.createElement(r,{is:n.is}):(e=a.createElement(r),r==="select"&&(a=e,n.multiple?a.multiple=!0:n.size&&(a.size=n.size))):e=a.createElementNS(e,r),e[pn]=t,e[ml]=n,Wx(e,t,!1,!1),t.stateNode=e;e:{switch(a=ip(r,n),r){case"dialog":Je("cancel",e),Je("close",e),i=n;break;case"iframe":case"object":case"embed":Je("load",e),i=n;break;case"video":case"audio":for(i=0;iBs&&(t.flags|=128,n=!0,Da(o,!1),t.lanes=4194304)}else{if(!n)if(e=Iu(a),e!==null){if(t.flags|=128,n=!0,r=e.updateQueue,r!==null&&(t.updateQueue=r,t.flags|=4),Da(o,!0),o.tail===null&&o.tailMode==="hidden"&&!a.alternate&&!ut)return Ht(t),null}else 2*xt()-o.renderingStartTime>Bs&&r!==1073741824&&(t.flags|=128,n=!0,Da(o,!1),t.lanes=4194304);o.isBackwards?(a.sibling=t.child,t.child=a):(r=o.last,r!==null?r.sibling=a:t.child=a,o.last=a)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=xt(),t.sibling=null,r=ft.current,Xe(ft,n?r&1|2:r&1),t):(Ht(t),null);case 22:case 23:return hg(),n=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==n&&(t.flags|=8192),n&&t.mode&1?yr&1073741824&&(Ht(t),t.subtreeFlags&6&&(t.flags|=8192)):Ht(t),null;case 24:return null;case 25:return null}throw Error(F(156,t.tag))}function nA(e,t){switch(G0(t),t.tag){case 1:return dr(t.type)&&Tu(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Us(),tt(ur),tt(Bt),rg(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return tg(t),null;case 13:if(tt(ft),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(F(340));Hs()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return tt(ft),null;case 4:return Us(),null;case 10:return q0(t.type._context),null;case 22:case 23:return hg(),null;case 24:return null;default:return null}}var Tc=!1,Ut=!1,iA=typeof WeakSet=="function"?WeakSet:Set,ae=null;function bs(e,t){var r=e.ref;if(r!==null)if(typeof r=="function")try{r(null)}catch(n){vt(e,t,n)}else r.current=null}function Ap(e,t,r){try{r()}catch(n){vt(e,t,n)}}var g1=!1;function oA(e,t){if(mp=Cu,e=J2(),B0(e)){if("selectionStart"in e)var r={start:e.selectionStart,end:e.selectionEnd};else e:{r=(r=e.ownerDocument)&&r.defaultView||window;var n=r.getSelection&&r.getSelection();if(n&&n.rangeCount!==0){r=n.anchorNode;var i=n.anchorOffset,o=n.focusNode;n=n.focusOffset;try{r.nodeType,o.nodeType}catch{r=null;break e}var a=0,c=-1,d=-1,h=0,g=0,v=e,y=null;t:for(;;){for(var S;v!==r||i!==0&&v.nodeType!==3||(c=a+i),v!==o||n!==0&&v.nodeType!==3||(d=a+n),v.nodeType===3&&(a+=v.nodeValue.length),(S=v.firstChild)!==null;)y=v,v=S;for(;;){if(v===e)break t;if(y===r&&++h===i&&(c=a),y===o&&++g===n&&(d=a),(S=v.nextSibling)!==null)break;v=y,y=v.parentNode}v=S}r=c===-1||d===-1?null:{start:c,end:d}}else r=null}r=r||{start:0,end:0}}else r=null;for(pp={focusedElem:e,selectionRange:r},Cu=!1,ae=t;ae!==null;)if(t=ae,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,ae=e;else for(;ae!==null;){t=ae;try{var C=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(C!==null){var D=C.memoizedProps,T=C.memoizedState,b=t.stateNode,w=b.getSnapshotBeforeUpdate(t.elementType===t.type?D:Gr(t.type,D),T);b.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var k=t.stateNode.containerInfo;k.nodeType===1?k.textContent="":k.nodeType===9&&k.documentElement&&k.removeChild(k.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(F(163))}}catch(A){vt(t,t.return,A)}if(e=t.sibling,e!==null){e.return=t.return,ae=e;break}ae=t.return}return C=g1,g1=!1,C}function qa(e,t,r){var n=t.updateQueue;if(n=n!==null?n.lastEffect:null,n!==null){var i=n=n.next;do{if((i.tag&e)===e){var o=i.destroy;i.destroy=void 0,o!==void 0&&Ap(t,r,o)}i=i.next}while(i!==n)}}function Dd(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var r=t=t.next;do{if((r.tag&e)===e){var n=r.create;r.destroy=n()}r=r.next}while(r!==t)}}function Pp(e){var t=e.ref;if(t!==null){var r=e.stateNode;switch(e.tag){case 5:e=r;break;default:e=r}typeof t=="function"?t(e):t.current=e}}function Kx(e){var t=e.alternate;t!==null&&(e.alternate=null,Kx(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[pn],delete t[ml],delete t[yp],delete t[HR],delete t[FR])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Qx(e){return e.tag===5||e.tag===3||e.tag===4}function v1(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Qx(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Op(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.nodeType===8?r.parentNode.insertBefore(e,t):r.insertBefore(e,t):(r.nodeType===8?(t=r.parentNode,t.insertBefore(e,r)):(t=r,t.appendChild(e)),r=r._reactRootContainer,r!=null||t.onclick!==null||(t.onclick=ju));else if(n!==4&&(e=e.child,e!==null))for(Op(e,t,r),e=e.sibling;e!==null;)Op(e,t,r),e=e.sibling}function Lp(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.insertBefore(e,t):r.appendChild(e);else if(n!==4&&(e=e.child,e!==null))for(Lp(e,t,r),e=e.sibling;e!==null;)Lp(e,t,r),e=e.sibling}var Nt=null,Xr=!1;function vi(e,t,r){for(r=r.child;r!==null;)qx(e,t,r),r=r.sibling}function qx(e,t,r){if(vn&&typeof vn.onCommitFiberUnmount=="function")try{vn.onCommitFiberUnmount(yd,r)}catch{}switch(r.tag){case 5:Ut||bs(r,t);case 6:var n=Nt,i=Xr;Nt=null,vi(e,t,r),Nt=n,Xr=i,Nt!==null&&(Xr?(e=Nt,r=r.stateNode,e.nodeType===8?e.parentNode.removeChild(r):e.removeChild(r)):Nt.removeChild(r.stateNode));break;case 18:Nt!==null&&(Xr?(e=Nt,r=r.stateNode,e.nodeType===8?wh(e.parentNode,r):e.nodeType===1&&wh(e,r),cl(e)):wh(Nt,r.stateNode));break;case 4:n=Nt,i=Xr,Nt=r.stateNode.containerInfo,Xr=!0,vi(e,t,r),Nt=n,Xr=i;break;case 0:case 11:case 14:case 15:if(!Ut&&(n=r.updateQueue,n!==null&&(n=n.lastEffect,n!==null))){i=n=n.next;do{var o=i,a=o.destroy;o=o.tag,a!==void 0&&(o&2||o&4)&&Ap(r,t,a),i=i.next}while(i!==n)}vi(e,t,r);break;case 1:if(!Ut&&(bs(r,t),n=r.stateNode,typeof n.componentWillUnmount=="function"))try{n.props=r.memoizedProps,n.state=r.memoizedState,n.componentWillUnmount()}catch(c){vt(r,t,c)}vi(e,t,r);break;case 21:vi(e,t,r);break;case 22:r.mode&1?(Ut=(n=Ut)||r.memoizedState!==null,vi(e,t,r),Ut=n):vi(e,t,r);break;default:vi(e,t,r)}}function y1(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var r=e.stateNode;r===null&&(r=e.stateNode=new iA),t.forEach(function(n){var i=mA.bind(null,e,n);r.has(n)||(r.add(n),n.then(i,i))})}}function Wr(e,t){var r=t.deletions;if(r!==null)for(var n=0;ni&&(i=a),n&=~o}if(n=i,n=xt()-n,n=(120>n?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*aA(n/1960))-n,10e?16:e,Ei===null)var n=!1;else{if(e=Ei,Ei=null,Hu=0,Pe&6)throw Error(F(331));var i=Pe;for(Pe|=4,ae=e.current;ae!==null;){var o=ae,a=o.child;if(ae.flags&16){var c=o.deletions;if(c!==null){for(var d=0;dxt()-dg?xo(e,0):ug|=r),fr(e,t)}function oS(e,t){t===0&&(e.mode&1?(t=_c,_c<<=1,!(_c&130023424)&&(_c=4194304)):t=1);var r=qt();e=ei(e,t),e!==null&&(Vl(e,t,r),fr(e,r))}function hA(e){var t=e.memoizedState,r=0;t!==null&&(r=t.retryLane),oS(e,r)}function mA(e,t){var r=0;switch(e.tag){case 13:var n=e.stateNode,i=e.memoizedState;i!==null&&(r=i.retryLane);break;case 19:n=e.stateNode;break;default:throw Error(F(314))}n!==null&&n.delete(t),oS(e,r)}var sS;sS=function(e,t,r){if(e!==null)if(e.memoizedProps!==t.pendingProps||ur.current)cr=!0;else{if(!(e.lanes&r)&&!(t.flags&128))return cr=!1,tA(e,t,r);cr=!!(e.flags&131072)}else cr=!1,ut&&t.flags&1048576&&ux(t,Pu,t.index);switch(t.lanes=0,t.tag){case 2:var n=t.type;au(e,t),e=t.pendingProps;var i=zs(t,Bt.current);As(t,r),i=ig(null,t,n,e,i,r);var o=og();return t.flags|=1,typeof i=="object"&&i!==null&&typeof i.render=="function"&&i.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,dr(n)?(o=!0,Ru(t)):o=!1,t.memoizedState=i.state!==null&&i.state!==void 0?i.state:null,J0(t),i.updater=Cd,t.stateNode=i,i._reactInternals=t,kp(t,n,e,r),t=Ep(null,t,n,!0,o,r)):(t.tag=0,ut&&o&&W0(t),Kt(null,t,i,r),t=t.child),t;case 16:n=t.elementType;e:{switch(au(e,t),e=t.pendingProps,i=n._init,n=i(n._payload),t.type=n,i=t.tag=gA(n),e=Gr(n,e),i){case 0:t=Dp(null,t,n,e,r);break e;case 1:t=h1(null,t,n,e,r);break e;case 11:t=d1(null,t,n,e,r);break e;case 14:t=f1(null,t,n,Gr(n.type,e),r);break e}throw Error(F(306,n,""))}return t;case 0:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:Gr(n,i),Dp(e,t,n,i,r);case 1:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:Gr(n,i),h1(e,t,n,i,r);case 3:e:{if(Ux(t),e===null)throw Error(F(387));n=t.pendingProps,o=t.memoizedState,i=o.element,gx(e,t),Mu(t,n,null,r);var a=t.memoizedState;if(n=a.element,o.isDehydrated)if(o={element:n,isDehydrated:!1,cache:a.cache,pendingSuspenseBoundaries:a.pendingSuspenseBoundaries,transitions:a.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){i=$s(Error(F(423)),t),t=m1(e,t,n,r,i);break e}else if(n!==i){i=$s(Error(F(424)),t),t=m1(e,t,n,r,i);break e}else for(_r=Mi(t.stateNode.containerInfo.firstChild),xr=t,ut=!0,qr=null,r=mx(t,null,n,r),t.child=r;r;)r.flags=r.flags&-3|4096,r=r.sibling;else{if(Hs(),n===i){t=ti(e,t,r);break e}Kt(e,t,n,r)}t=t.child}return t;case 5:return vx(t),e===null&&xp(t),n=t.type,i=t.pendingProps,o=e!==null?e.memoizedProps:null,a=i.children,gp(n,i)?a=null:o!==null&&gp(n,o)&&(t.flags|=32),Fx(e,t),Kt(e,t,a,r),t.child;case 6:return e===null&&xp(t),null;case 13:return $x(e,t,r);case 4:return eg(t,t.stateNode.containerInfo),n=t.pendingProps,e===null?t.child=Fs(t,null,n,r):Kt(e,t,n,r),t.child;case 11:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:Gr(n,i),d1(e,t,n,i,r);case 7:return Kt(e,t,t.pendingProps,r),t.child;case 8:return Kt(e,t,t.pendingProps.children,r),t.child;case 12:return Kt(e,t,t.pendingProps.children,r),t.child;case 10:e:{if(n=t.type._context,i=t.pendingProps,o=t.memoizedProps,a=i.value,Xe(Ou,n._currentValue),n._currentValue=a,o!==null)if(nn(o.value,a)){if(o.children===i.children&&!ur.current){t=ti(e,t,r);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var c=o.dependencies;if(c!==null){a=o.child;for(var d=c.firstContext;d!==null;){if(d.context===n){if(o.tag===1){d=Xn(-1,r&-r),d.tag=2;var h=o.updateQueue;if(h!==null){h=h.shared;var g=h.pending;g===null?d.next=d:(d.next=g.next,g.next=d),h.pending=d}}o.lanes|=r,d=o.alternate,d!==null&&(d.lanes|=r),Sp(o.return,r,t),c.lanes|=r;break}d=d.next}}else if(o.tag===10)a=o.type===t.type?null:o.child;else if(o.tag===18){if(a=o.return,a===null)throw Error(F(341));a.lanes|=r,c=a.alternate,c!==null&&(c.lanes|=r),Sp(a,r,t),a=o.sibling}else a=o.child;if(a!==null)a.return=o;else for(a=o;a!==null;){if(a===t){a=null;break}if(o=a.sibling,o!==null){o.return=a.return,a=o;break}a=a.return}o=a}Kt(e,t,i.children,r),t=t.child}return t;case 9:return i=t.type,n=t.pendingProps.children,As(t,r),i=Lr(i),n=n(i),t.flags|=1,Kt(e,t,n,r),t.child;case 14:return n=t.type,i=Gr(n,t.pendingProps),i=Gr(n.type,i),f1(e,t,n,i,r);case 15:return zx(e,t,t.type,t.pendingProps,r);case 17:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:Gr(n,i),au(e,t),t.tag=1,dr(n)?(e=!0,Ru(t)):e=!1,As(t,r),Nx(t,n,i),kp(t,n,i,r),Ep(null,t,n,!0,e,r);case 19:return Bx(e,t,r);case 22:return Hx(e,t,r)}throw Error(F(156,t.tag))};function aS(e,t){return L2(e,t)}function pA(e,t,r,n){this.tag=e,this.key=r,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=n,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Pr(e,t,r,n){return new pA(e,t,r,n)}function pg(e){return e=e.prototype,!(!e||!e.isReactComponent)}function gA(e){if(typeof e=="function")return pg(e)?1:0;if(e!=null){if(e=e.$$typeof,e===L0)return 11;if(e===M0)return 14}return 2}function Yi(e,t){var r=e.alternate;return r===null?(r=Pr(e.tag,t,e.key,e.mode),r.elementType=e.elementType,r.type=e.type,r.stateNode=e.stateNode,r.alternate=e,e.alternate=r):(r.pendingProps=t,r.type=e.type,r.flags=0,r.subtreeFlags=0,r.deletions=null),r.flags=e.flags&14680064,r.childLanes=e.childLanes,r.lanes=e.lanes,r.child=e.child,r.memoizedProps=e.memoizedProps,r.memoizedState=e.memoizedState,r.updateQueue=e.updateQueue,t=e.dependencies,r.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},r.sibling=e.sibling,r.index=e.index,r.ref=e.ref,r}function uu(e,t,r,n,i,o){var a=2;if(n=e,typeof e=="function")pg(e)&&(a=1);else if(typeof e=="string")a=5;else e:switch(e){case ms:return So(r.children,i,o,t);case O0:a=8,i|=8;break;case Xm:return e=Pr(12,r,t,i|2),e.elementType=Xm,e.lanes=o,e;case Km:return e=Pr(13,r,t,i),e.elementType=Km,e.lanes=o,e;case Qm:return e=Pr(19,r,t,i),e.elementType=Qm,e.lanes=o,e;case v2:return jd(r,i,o,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case p2:a=10;break e;case g2:a=9;break e;case L0:a=11;break e;case M0:a=14;break e;case _i:a=16,n=null;break e}throw Error(F(130,e==null?e:typeof e,""))}return t=Pr(a,r,t,i),t.elementType=e,t.type=n,t.lanes=o,t}function So(e,t,r,n){return e=Pr(7,e,n,t),e.lanes=r,e}function jd(e,t,r,n){return e=Pr(22,e,n,t),e.elementType=v2,e.lanes=r,e.stateNode={isHidden:!1},e}function Eh(e,t,r){return e=Pr(6,e,null,t),e.lanes=r,e}function jh(e,t,r){return t=Pr(4,e.children!==null?e.children:[],e.key,t),t.lanes=r,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function vA(e,t,r,n,i){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=lh(0),this.expirationTimes=lh(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=lh(0),this.identifierPrefix=n,this.onRecoverableError=i,this.mutableSourceEagerHydrationData=null}function gg(e,t,r,n,i,o,a,c,d){return e=new vA(e,t,r,c,d),t===1?(t=1,o===!0&&(t|=8)):t=0,o=Pr(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:n,isDehydrated:r,cache:null,transitions:null,pendingSuspenseBoundaries:null},J0(o),e}function yA(e,t,r){var n=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(dS)}catch(e){console.error(e)}}dS(),d2.exports=kr;var Od=d2.exports;const bA=C0(Od),kA=J_({__proto__:null,default:bA},[Od]);var D1=Od;Wm.createRoot=D1.createRoot,Wm.hydrateRoot=D1.hydrateRoot;/** + * @remix-run/router v1.20.0 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function ct(){return ct=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u")throw new Error(t)}function Ro(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function DA(){return Math.random().toString(36).substr(2,8)}function j1(e,t){return{usr:e.state,key:e.key,idx:t}}function xl(e,t,r,n){return r===void 0&&(r=null),ct({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?Sn(t):t,{state:r,key:t&&t.key||n||DA()})}function Ao(e){let{pathname:t="/",search:r="",hash:n=""}=e;return r&&r!=="?"&&(t+=r.charAt(0)==="?"?r:"?"+r),n&&n!=="#"&&(t+=n.charAt(0)==="#"?n:"#"+n),t}function Sn(e){let t={};if(e){let r=e.indexOf("#");r>=0&&(t.hash=e.substr(r),e=e.substr(0,r));let n=e.indexOf("?");n>=0&&(t.search=e.substr(n),e=e.substr(0,n)),e&&(t.pathname=e)}return t}function EA(e,t,r,n){n===void 0&&(n={});let{window:i=document.defaultView,v5Compat:o=!1}=n,a=i.history,c=wt.Pop,d=null,h=g();h==null&&(h=0,a.replaceState(ct({},a.state,{idx:h}),""));function g(){return(a.state||{idx:null}).idx}function v(){c=wt.Pop;let T=g(),b=T==null?null:T-h;h=T,d&&d({action:c,location:D.location,delta:b})}function y(T,b){c=wt.Push;let w=xl(D.location,T,b);r&&r(w,T),h=g()+1;let k=j1(w,h),A=D.createHref(w);try{a.pushState(k,"",A)}catch(M){if(M instanceof DOMException&&M.name==="DataCloneError")throw M;i.location.assign(A)}o&&d&&d({action:c,location:D.location,delta:1})}function S(T,b){c=wt.Replace;let w=xl(D.location,T,b);r&&r(w,T),h=g();let k=j1(w,h),A=D.createHref(w);a.replaceState(k,"",A),o&&d&&d({action:c,location:D.location,delta:0})}function C(T){let b=i.location.origin!=="null"?i.location.origin:i.location.href,w=typeof T=="string"?T:Ao(T);return w=w.replace(/ $/,"%20"),be(b,"No window.location.(origin|href) available to create URL for href: "+w),new URL(w,b)}let D={get action(){return c},get location(){return e(i,a)},listen(T){if(d)throw new Error("A history only accepts one active listener");return i.addEventListener(E1,v),d=T,()=>{i.removeEventListener(E1,v),d=null}},createHref(T){return t(i,T)},createURL:C,encodeLocation(T){let b=C(T);return{pathname:b.pathname,search:b.search,hash:b.hash}},push:y,replace:S,go(T){return a.go(T)}};return D}var $e;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})($e||($e={}));const jA=new Set(["lazy","caseSensitive","path","id","index","children"]);function TA(e){return e.index===!0}function $u(e,t,r,n){return r===void 0&&(r=[]),n===void 0&&(n={}),e.map((i,o)=>{let a=[...r,String(o)],c=typeof i.id=="string"?i.id:a.join("-");if(be(i.index!==!0||!i.children,"Cannot specify children on an index route"),be(!n[c],'Found a route id collision on id "'+c+`". Route id's must be globally unique within Data Router usages`),TA(i)){let d=ct({},i,t(i),{id:c});return n[c]=d,d}else{let d=ct({},i,t(i),{id:c,children:void 0});return n[c]=d,i.children&&(d.children=$u(i.children,t,a,n)),d}})}function ho(e,t,r){return r===void 0&&(r="/"),du(e,t,r,!1)}function du(e,t,r,n){let i=typeof t=="string"?Sn(t):t,o=ra(i.pathname||"/",r);if(o==null)return null;let a=fS(e);AA(a);let c=null;for(let d=0;c==null&&d{let d={relativePath:c===void 0?o.path||"":c,caseSensitive:o.caseSensitive===!0,childrenIndex:a,route:o};d.relativePath.startsWith("/")&&(be(d.relativePath.startsWith(n),'Absolute route path "'+d.relativePath+'" nested under path '+('"'+n+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),d.relativePath=d.relativePath.slice(n.length));let h=Kn([n,d.relativePath]),g=r.concat(d);o.children&&o.children.length>0&&(be(o.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+h+'".')),fS(o.children,t,g,h)),!(o.path==null&&!o.index)&&t.push({path:h,score:VA(h,o.index),routesMeta:g})};return e.forEach((o,a)=>{var c;if(o.path===""||!((c=o.path)!=null&&c.includes("?")))i(o,a);else for(let d of hS(o.path))i(o,a,d)}),t}function hS(e){let t=e.split("/");if(t.length===0)return[];let[r,...n]=t,i=r.endsWith("?"),o=r.replace(/\?$/,"");if(n.length===0)return i?[o,""]:[o];let a=hS(n.join("/")),c=[];return c.push(...a.map(d=>d===""?o:[o,d].join("/"))),i&&c.push(...a),c.map(d=>e.startsWith("/")&&d===""?"/":d)}function AA(e){e.sort((t,r)=>t.score!==r.score?r.score-t.score:YA(t.routesMeta.map(n=>n.childrenIndex),r.routesMeta.map(n=>n.childrenIndex)))}const PA=/^:[\w-]+$/,OA=3,LA=2,MA=1,IA=10,NA=-2,T1=e=>e==="*";function VA(e,t){let r=e.split("/"),n=r.length;return r.some(T1)&&(n+=NA),t&&(n+=LA),r.filter(i=>!T1(i)).reduce((i,o)=>i+(PA.test(o)?OA:o===""?MA:IA),n)}function YA(e,t){return e.length===t.length&&e.slice(0,-1).every((n,i)=>n===t[i])?e[e.length-1]-t[t.length-1]:0}function zA(e,t,r){r===void 0&&(r=!1);let{routesMeta:n}=e,i={},o="/",a=[];for(let c=0;c{let{paramName:y,isOptional:S}=g;if(y==="*"){let D=c[v]||"";a=o.slice(0,o.length-D.length).replace(/(.)\/+$/,"$1")}const C=c[v];return S&&!C?h[y]=void 0:h[y]=(C||"").replace(/%2F/g,"/"),h},{}),pathname:o,pathnameBase:a,pattern:e}}function HA(e,t,r){t===void 0&&(t=!1),r===void 0&&(r=!0),Ro(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let n=[],i="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(a,c,d)=>(n.push({paramName:c,isOptional:d!=null}),d?"/?([^\\/]+)?":"/([^\\/]+)"));return e.endsWith("*")?(n.push({paramName:"*"}),i+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?i+="\\/*$":e!==""&&e!=="/"&&(i+="(?:(?=\\/|$))"),[new RegExp(i,t?void 0:"i"),n]}function FA(e){try{return e.split("/").map(t=>decodeURIComponent(t).replace(/\//g,"%2F")).join("/")}catch(t){return Ro(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function ra(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let r=t.endsWith("/")?t.length-1:t.length,n=e.charAt(r);return n&&n!=="/"?null:e.slice(r)||"/"}function UA(e,t){t===void 0&&(t="/");let{pathname:r,search:n="",hash:i=""}=typeof e=="string"?Sn(e):e;return{pathname:r?r.startsWith("/")?r:$A(r,t):t,search:WA(n),hash:GA(i)}}function $A(e,t){let r=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(i=>{i===".."?r.length>1&&r.pop():i!=="."&&r.push(i)}),r.length>1?r.join("/"):"/"}function Th(e,t,r,n){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(n)+"]. Please separate it out to the ")+("`to."+r+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function mS(e){return e.filter((t,r)=>r===0||t.route.path&&t.route.path.length>0)}function _g(e,t){let r=mS(e);return t?r.map((n,i)=>i===r.length-1?n.pathname:n.pathnameBase):r.map(n=>n.pathnameBase)}function xg(e,t,r,n){n===void 0&&(n=!1);let i;typeof e=="string"?i=Sn(e):(i=ct({},e),be(!i.pathname||!i.pathname.includes("?"),Th("?","pathname","search",i)),be(!i.pathname||!i.pathname.includes("#"),Th("#","pathname","hash",i)),be(!i.search||!i.search.includes("#"),Th("#","search","hash",i)));let o=e===""||i.pathname==="",a=o?"/":i.pathname,c;if(a==null)c=r;else{let v=t.length-1;if(!n&&a.startsWith("..")){let y=a.split("/");for(;y[0]==="..";)y.shift(),v-=1;i.pathname=y.join("/")}c=v>=0?t[v]:"/"}let d=UA(i,c),h=a&&a!=="/"&&a.endsWith("/"),g=(o||a===".")&&r.endsWith("/");return!d.pathname.endsWith("/")&&(h||g)&&(d.pathname+="/"),d}const Kn=e=>e.join("/").replace(/\/\/+/g,"/"),BA=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),WA=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,GA=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;class Bu{constructor(t,r,n,i){i===void 0&&(i=!1),this.status=t,this.statusText=r||"",this.internal=i,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}}function Ld(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const pS=["post","put","patch","delete"],XA=new Set(pS),KA=["get",...pS],QA=new Set(KA),qA=new Set([301,302,303,307,308]),ZA=new Set([307,308]),Rh={state:"idle",location:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},JA={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},ja={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},Sg=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,eP=e=>({hasErrorBoundary:!!e.hasErrorBoundary}),gS="remix-router-transitions";function tP(e){const t=e.window?e.window:typeof window<"u"?window:void 0,r=typeof t<"u"&&typeof t.document<"u"&&typeof t.document.createElement<"u",n=!r;be(e.routes.length>0,"You must provide a non-empty routes array to createRouter");let i;if(e.mapRouteProperties)i=e.mapRouteProperties;else if(e.detectErrorBoundary){let j=e.detectErrorBoundary;i=O=>({hasErrorBoundary:j(O)})}else i=eP;let o={},a=$u(e.routes,i,void 0,o),c,d=e.basename||"/",h=e.dataStrategy||oP,g=e.patchRoutesOnNavigation,v=ct({v7_fetcherPersist:!1,v7_normalizeFormMethod:!1,v7_partialHydration:!1,v7_prependBasename:!1,v7_relativeSplatPath:!1,v7_skipActionErrorRevalidation:!1},e.future),y=null,S=new Set,C=null,D=null,T=null,b=e.hydrationData!=null,w=ho(a,e.history.location,d),k=null;if(w==null&&!g){let j=ar(404,{pathname:e.history.location.pathname}),{matches:O,route:L}=H1(a);w=O,k={[L.id]:j}}w&&!e.hydrationData&&Wo(w,a,e.history.location.pathname).active&&(w=null);let A;if(w)if(w.some(j=>j.route.lazy))A=!1;else if(!w.some(j=>j.route.loader))A=!0;else if(v.v7_partialHydration){let j=e.hydrationData?e.hydrationData.loaderData:null,O=e.hydrationData?e.hydrationData.errors:null;if(O){let L=w.findIndex(H=>O[H.route.id]!==void 0);A=w.slice(0,L+1).every(H=>!zp(H.route,j,O))}else A=w.every(L=>!zp(L.route,j,O))}else A=e.hydrationData!=null;else if(A=!1,w=[],v.v7_partialHydration){let j=Wo(null,a,e.history.location.pathname);j.active&&j.matches&&(w=j.matches)}let M,E={historyAction:e.history.action,location:e.history.location,matches:w,initialized:A,navigation:Rh,restoreScrollPosition:e.hydrationData!=null?!1:null,preventScrollReset:!1,revalidation:"idle",loaderData:e.hydrationData&&e.hydrationData.loaderData||{},actionData:e.hydrationData&&e.hydrationData.actionData||null,errors:e.hydrationData&&e.hydrationData.errors||k,fetchers:new Map,blockers:new Map},I=wt.Pop,P=!1,z,Y=!1,K=new Map,Q=null,G=!1,Oe=!1,Ne=[],it=new Set,Ee=new Map,W=0,ue=-1,ee=new Map,ge=new Set,pe=new Map,Ke=new Map,Ae=new Set,te=new Map,pt=new Map,Mt;function ln(){if(y=e.history.listen(j=>{let{action:O,location:L,delta:H}=j;if(Mt){Mt(),Mt=void 0;return}Ro(pt.size===0||H!=null,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.");let ie=no({currentLocation:E.location,nextLocation:L,historyAction:O});if(ie&&H!=null){let ce=new Promise(le=>{Mt=le});e.history.go(H*-1),Uo(ie,{state:"blocked",location:L,proceed(){Uo(ie,{state:"proceeding",proceed:void 0,reset:void 0,location:L}),ce.then(()=>e.history.go(H))},reset(){let le=new Map(E.blockers);le.set(ie,ja),yt({blockers:le})}});return}return En(O,L)}),r){wP(t,K);let j=()=>_P(t,K);t.addEventListener("pagehide",j),Q=()=>t.removeEventListener("pagehide",j)}return E.initialized||En(wt.Pop,E.location,{initialHydration:!0}),M}function Hr(){y&&y(),Q&&Q(),S.clear(),z&&z.abort(),E.fetchers.forEach((j,O)=>ze(O)),E.blockers.forEach((j,O)=>ro(O))}function hr(j){return S.add(j),()=>S.delete(j)}function yt(j,O){O===void 0&&(O={}),E=ct({},E,j);let L=[],H=[];v.v7_fetcherPersist&&E.fetchers.forEach((ie,ce)=>{ie.state==="idle"&&(Ae.has(ce)?H.push(ce):L.push(ce))}),[...S].forEach(ie=>ie(E,{deletedFetchers:H,viewTransitionOpts:O.viewTransitionOpts,flushSync:O.flushSync===!0})),v.v7_fetcherPersist&&(L.forEach(ie=>E.fetchers.delete(ie)),H.forEach(ie=>ze(ie)))}function mr(j,O,L){var H,ie;let{flushSync:ce}=L===void 0?{}:L,le=E.actionData!=null&&E.navigation.formMethod!=null&&Kr(E.navigation.formMethod)&&E.navigation.state==="loading"&&((H=j.state)==null?void 0:H._isRedirect)!==!0,q;O.actionData?Object.keys(O.actionData).length>0?q=O.actionData:q=null:le?q=E.actionData:q=null;let Z=O.loaderData?Y1(E.loaderData,O.loaderData,O.matches||[],O.errors):E.loaderData,B=E.blockers;B.size>0&&(B=new Map(B),B.forEach((ve,Ct)=>B.set(Ct,ja)));let oe=P===!0||E.navigation.formMethod!=null&&Kr(E.navigation.formMethod)&&((ie=j.state)==null?void 0:ie._isRedirect)!==!0;c&&(a=c,c=void 0),G||I===wt.Pop||(I===wt.Push?e.history.push(j,j.state):I===wt.Replace&&e.history.replace(j,j.state));let he;if(I===wt.Pop){let ve=K.get(E.location.pathname);ve&&ve.has(j.pathname)?he={currentLocation:E.location,nextLocation:j}:K.has(j.pathname)&&(he={currentLocation:j,nextLocation:E.location})}else if(Y){let ve=K.get(E.location.pathname);ve?ve.add(j.pathname):(ve=new Set([j.pathname]),K.set(E.location.pathname,ve)),he={currentLocation:E.location,nextLocation:j}}yt(ct({},O,{actionData:q,loaderData:Z,historyAction:I,location:j,initialized:!0,navigation:Rh,revalidation:"idle",restoreScrollPosition:re(j,O.matches||E.matches),preventScrollReset:oe,blockers:B}),{viewTransitionOpts:he,flushSync:ce===!0}),I=wt.Pop,P=!1,Y=!1,G=!1,Oe=!1,Ne=[]}async function pr(j,O){if(typeof j=="number"){e.history.go(j);return}let L=Yp(E.location,E.matches,d,v.v7_prependBasename,j,v.v7_relativeSplatPath,O==null?void 0:O.fromRouteId,O==null?void 0:O.relative),{path:H,submission:ie,error:ce}=A1(v.v7_normalizeFormMethod,!1,L,O),le=E.location,q=xl(E.location,H,O&&O.state);q=ct({},q,e.history.encodeLocation(q));let Z=O&&O.replace!=null?O.replace:void 0,B=wt.Push;Z===!0?B=wt.Replace:Z===!1||ie!=null&&Kr(ie.formMethod)&&ie.formAction===E.location.pathname+E.location.search&&(B=wt.Replace);let oe=O&&"preventScrollReset"in O?O.preventScrollReset===!0:void 0,he=(O&&O.flushSync)===!0,ve=no({currentLocation:le,nextLocation:q,historyAction:B});if(ve){Uo(ve,{state:"blocked",location:q,proceed(){Uo(ve,{state:"proceeding",proceed:void 0,reset:void 0,location:q}),pr(j,O)},reset(){let Ct=new Map(E.blockers);Ct.set(ve,ja),yt({blockers:Ct})}});return}return await En(B,q,{submission:ie,pendingError:ce,preventScrollReset:oe,replace:O&&O.replace,enableViewTransition:O&&O.viewTransition,flushSync:he})}function Mf(){if(It(),yt({revalidation:"loading"}),E.navigation.state!=="submitting"){if(E.navigation.state==="idle"){En(E.historyAction,E.location,{startUninterruptedRevalidation:!0});return}En(I||E.historyAction,E.navigation.location,{overrideNavigation:E.navigation,enableViewTransition:Y===!0})}}async function En(j,O,L){z&&z.abort(),z=null,I=j,G=(L&&L.startUninterruptedRevalidation)===!0,Bo(E.location,E.matches),P=(L&&L.preventScrollReset)===!0,Y=(L&&L.enableViewTransition)===!0;let H=c||a,ie=L&&L.overrideNavigation,ce=ho(H,O,d),le=(L&&L.flushSync)===!0,q=Wo(ce,H,O.pathname);if(q.active&&q.matches&&(ce=q.matches),!ce){let{error:Ue,notFoundMatches:_e,route:Qe}=ha(O.pathname);mr(O,{matches:_e,loaderData:{},errors:{[Qe.id]:Ue}},{flushSync:le});return}if(E.initialized&&!Oe&&dP(E.location,O)&&!(L&&L.submission&&Kr(L.submission.formMethod))){mr(O,{matches:ce},{flushSync:le});return}z=new AbortController;let Z=es(e.history,O,z.signal,L&&L.submission),B;if(L&&L.pendingError)B=[mo(ce).route.id,{type:$e.error,error:L.pendingError}];else if(L&&L.submission&&Kr(L.submission.formMethod)){let Ue=await If(Z,O,L.submission,ce,q.active,{replace:L.replace,flushSync:le});if(Ue.shortCircuited)return;if(Ue.pendingActionResult){let[_e,Qe]=Ue.pendingActionResult;if(wr(Qe)&&Ld(Qe.error)&&Qe.error.status===404){z=null,mr(O,{matches:Ue.matches,loaderData:{},errors:{[_e]:Qe.error}});return}}ce=Ue.matches||ce,B=Ue.pendingActionResult,ie=Ah(O,L.submission),le=!1,q.active=!1,Z=es(e.history,Z.url,Z.signal)}let{shortCircuited:oe,matches:he,loaderData:ve,errors:Ct}=await Nf(Z,O,ce,q.active,ie,L&&L.submission,L&&L.fetcherSubmission,L&&L.replace,L&&L.initialHydration===!0,le,B);oe||(z=null,mr(O,ct({matches:he||ce},z1(B),{loaderData:ve,errors:Ct})))}async function If(j,O,L,H,ie,ce){ce===void 0&&(ce={}),It();let le=vP(O,L);if(yt({navigation:le},{flushSync:ce.flushSync===!0}),ie){let B=await Go(H,O.pathname,j.signal);if(B.type==="aborted")return{shortCircuited:!0};if(B.type==="error"){let oe=mo(B.partialMatches).route.id;return{matches:B.partialMatches,pendingActionResult:[oe,{type:$e.error,error:B.error}]}}else if(B.matches)H=B.matches;else{let{notFoundMatches:oe,error:he,route:ve}=ha(O.pathname);return{matches:oe,pendingActionResult:[ve.id,{type:$e.error,error:he}]}}}let q,Z=Fa(H,O);if(!Z.route.action&&!Z.route.lazy)q={type:$e.error,error:ar(405,{method:j.method,pathname:O.pathname,routeId:Z.route.id})};else if(q=(await Zi("action",E,j,[Z],H,null))[Z.route.id],j.signal.aborted)return{shortCircuited:!0};if(yo(q)){let B;return ce&&ce.replace!=null?B=ce.replace:B=I1(q.response.headers.get("Location"),new URL(j.url),d)===E.location.pathname+E.location.search,await jn(j,q,!0,{submission:L,replace:B}),{shortCircuited:!0}}if(ji(q))throw ar(400,{type:"defer-action"});if(wr(q)){let B=mo(H,Z.route.id);return(ce&&ce.replace)!==!0&&(I=wt.Push),{matches:H,pendingActionResult:[B.route.id,q]}}return{matches:H,pendingActionResult:[Z.route.id,q]}}async function Nf(j,O,L,H,ie,ce,le,q,Z,B,oe){let he=ie||Ah(O,ce),ve=ce||le||U1(he),Ct=!G&&(!v.v7_partialHydration||!Z);if(H){if(Ct){let qe=ec(oe);yt(ct({navigation:he},qe!==void 0?{actionData:qe}:{}),{flushSync:B})}let je=await Go(L,O.pathname,j.signal);if(je.type==="aborted")return{shortCircuited:!0};if(je.type==="error"){let qe=mo(je.partialMatches).route.id;return{matches:je.partialMatches,loaderData:{},errors:{[qe]:je.error}}}else if(je.matches)L=je.matches;else{let{error:qe,notFoundMatches:An,route:oo}=ha(O.pathname);return{matches:An,loaderData:{},errors:{[oo.id]:qe}}}}let Ue=c||a,[_e,Qe]=O1(e.history,E,L,ve,O,v.v7_partialHydration&&Z===!0,v.v7_skipActionErrorRevalidation,Oe,Ne,it,Ae,pe,ge,Ue,d,oe);if(Tn(je=>!(L&&L.some(qe=>qe.route.id===je))||_e&&_e.some(qe=>qe.route.id===je)),ue=++W,_e.length===0&&Qe.length===0){let je=Fo();return mr(O,ct({matches:L,loaderData:{},errors:oe&&wr(oe[1])?{[oe[0]]:oe[1].error}:null},z1(oe),je?{fetchers:new Map(E.fetchers)}:{}),{flushSync:B}),{shortCircuited:!0}}if(Ct){let je={};if(!H){je.navigation=he;let qe=ec(oe);qe!==void 0&&(je.actionData=qe)}Qe.length>0&&(je.fetchers=Vf(Qe)),yt(je,{flushSync:B})}Qe.forEach(je=>{Ur(je.key),je.controller&&Ee.set(je.key,je.controller)});let di=()=>Qe.forEach(je=>Ur(je.key));z&&z.signal.addEventListener("abort",di);let{loaderResults:jr,fetcherResults:Wt}=await fa(E,L,_e,Qe,j);if(j.signal.aborted)return{shortCircuited:!0};z&&z.signal.removeEventListener("abort",di),Qe.forEach(je=>Ee.delete(je.key));let vr=Pc(jr);if(vr)return await jn(j,vr.result,!0,{replace:q}),{shortCircuited:!0};if(vr=Pc(Wt),vr)return ge.add(vr.key),await jn(j,vr.result,!0,{replace:q}),{shortCircuited:!0};let{loaderData:ma,errors:io}=V1(E,L,jr,oe,Qe,Wt,te);te.forEach((je,qe)=>{je.subscribe(An=>{(An||je.done)&&te.delete(qe)})}),v.v7_partialHydration&&Z&&E.errors&&(io=ct({},E.errors,io));let Rn=Fo(),Ge=to(ue),fi=Rn||Ge||Qe.length>0;return ct({matches:L,loaderData:ma,errors:io},fi?{fetchers:new Map(E.fetchers)}:{})}function ec(j){if(j&&!wr(j[1]))return{[j[0]]:j[1].data};if(E.actionData)return Object.keys(E.actionData).length===0?null:E.actionData}function Vf(j){return j.forEach(O=>{let L=E.fetchers.get(O.key),H=Ta(void 0,L?L.data:void 0);E.fetchers.set(O.key,H)}),new Map(E.fetchers)}function tc(j,O,L,H){if(n)throw new Error("router.fetch() was called during the server render, but it shouldn't be. You are likely calling a useFetcher() method in the body of your component. Try moving it to a useEffect or a callback.");Ur(j);let ie=(H&&H.flushSync)===!0,ce=c||a,le=Yp(E.location,E.matches,d,v.v7_prependBasename,L,v.v7_relativeSplatPath,O,H==null?void 0:H.relative),q=ho(ce,le,d),Z=Wo(q,ce,le);if(Z.active&&Z.matches&&(q=Z.matches),!q){gr(j,O,ar(404,{pathname:le}),{flushSync:ie});return}let{path:B,submission:oe,error:he}=A1(v.v7_normalizeFormMethod,!0,le,H);if(he){gr(j,O,he,{flushSync:ie});return}let ve=Fa(q,B),Ct=(H&&H.preventScrollReset)===!0;if(oe&&Kr(oe.formMethod)){er(j,O,B,ve,q,Z.active,ie,Ct,oe);return}pe.set(j,{routeId:O,path:B}),da(j,O,B,ve,q,Z.active,ie,Ct,oe)}async function er(j,O,L,H,ie,ce,le,q,Z){It(),pe.delete(j);function B(gt){if(!gt.route.action&&!gt.route.lazy){let hi=ar(405,{method:Z.formMethod,pathname:L,routeId:O});return gr(j,O,hi,{flushSync:le}),!0}return!1}if(!ce&&B(H))return;let oe=E.fetchers.get(j);Fr(j,yP(Z,oe),{flushSync:le});let he=new AbortController,ve=es(e.history,L,he.signal,Z);if(ce){let gt=await Go(ie,L,ve.signal);if(gt.type==="aborted")return;if(gt.type==="error"){gr(j,O,gt.error,{flushSync:le});return}else if(gt.matches){if(ie=gt.matches,H=Fa(ie,L),B(H))return}else{gr(j,O,ar(404,{pathname:L}),{flushSync:le});return}}Ee.set(j,he);let Ct=W,_e=(await Zi("action",E,ve,[H],ie,j))[H.route.id];if(ve.signal.aborted){Ee.get(j)===he&&Ee.delete(j);return}if(v.v7_fetcherPersist&&Ae.has(j)){if(yo(_e)||wr(_e)){Fr(j,yi(void 0));return}}else{if(yo(_e))if(Ee.delete(j),ue>Ct){Fr(j,yi(void 0));return}else return ge.add(j),Fr(j,Ta(Z)),jn(ve,_e,!1,{fetcherSubmission:Z,preventScrollReset:q});if(wr(_e)){gr(j,O,_e.error);return}}if(ji(_e))throw ar(400,{type:"defer-action"});let Qe=E.navigation.location||E.location,di=es(e.history,Qe,he.signal),jr=c||a,Wt=E.navigation.state!=="idle"?ho(jr,E.navigation.location,d):E.matches;be(Wt,"Didn't find any matches after fetcher action");let vr=++W;ee.set(j,vr);let ma=Ta(Z,_e.data);E.fetchers.set(j,ma);let[io,Rn]=O1(e.history,E,Wt,Z,Qe,!1,v.v7_skipActionErrorRevalidation,Oe,Ne,it,Ae,pe,ge,jr,d,[H.route.id,_e]);Rn.filter(gt=>gt.key!==j).forEach(gt=>{let hi=gt.key,nc=E.fetchers.get(hi),Yf=Ta(void 0,nc?nc.data:void 0);E.fetchers.set(hi,Yf),Ur(hi),gt.controller&&Ee.set(hi,gt.controller)}),yt({fetchers:new Map(E.fetchers)});let Ge=()=>Rn.forEach(gt=>Ur(gt.key));he.signal.addEventListener("abort",Ge);let{loaderResults:fi,fetcherResults:je}=await fa(E,Wt,io,Rn,di);if(he.signal.aborted)return;he.signal.removeEventListener("abort",Ge),ee.delete(j),Ee.delete(j),Rn.forEach(gt=>Ee.delete(gt.key));let qe=Pc(fi);if(qe)return jn(di,qe.result,!1,{preventScrollReset:q});if(qe=Pc(je),qe)return ge.add(qe.key),jn(di,qe.result,!1,{preventScrollReset:q});let{loaderData:An,errors:oo}=V1(E,Wt,fi,void 0,Rn,je,te);if(E.fetchers.has(j)){let gt=yi(_e.data);E.fetchers.set(j,gt)}to(vr),E.navigation.state==="loading"&&vr>ue?(be(I,"Expected pending action"),z&&z.abort(),mr(E.navigation.location,{matches:Wt,loaderData:An,errors:oo,fetchers:new Map(E.fetchers)})):(yt({errors:oo,loaderData:Y1(E.loaderData,An,Wt,oo),fetchers:new Map(E.fetchers)}),Oe=!1)}async function da(j,O,L,H,ie,ce,le,q,Z){let B=E.fetchers.get(j);Fr(j,Ta(Z,B?B.data:void 0),{flushSync:le});let oe=new AbortController,he=es(e.history,L,oe.signal);if(ce){let _e=await Go(ie,L,he.signal);if(_e.type==="aborted")return;if(_e.type==="error"){gr(j,O,_e.error,{flushSync:le});return}else if(_e.matches)ie=_e.matches,H=Fa(ie,L);else{gr(j,O,ar(404,{pathname:L}),{flushSync:le});return}}Ee.set(j,oe);let ve=W,Ue=(await Zi("loader",E,he,[H],ie,j))[H.route.id];if(ji(Ue)&&(Ue=await bg(Ue,he.signal,!0)||Ue),Ee.get(j)===oe&&Ee.delete(j),!he.signal.aborted){if(Ae.has(j)){Fr(j,yi(void 0));return}if(yo(Ue))if(ue>ve){Fr(j,yi(void 0));return}else{ge.add(j),await jn(he,Ue,!1,{preventScrollReset:q});return}if(wr(Ue)){gr(j,O,Ue.error);return}be(!ji(Ue),"Unhandled fetcher deferred data"),Fr(j,yi(Ue.data))}}async function jn(j,O,L,H){let{submission:ie,fetcherSubmission:ce,preventScrollReset:le,replace:q}=H===void 0?{}:H;O.response.headers.has("X-Remix-Revalidate")&&(Oe=!0);let Z=O.response.headers.get("Location");be(Z,"Expected a Location header on the redirect Response"),Z=I1(Z,new URL(j.url),d);let B=xl(E.location,Z,{_isRedirect:!0});if(r){let _e=!1;if(O.response.headers.has("X-Remix-Reload-Document"))_e=!0;else if(Sg.test(Z)){const Qe=e.history.createURL(Z);_e=Qe.origin!==t.location.origin||ra(Qe.pathname,d)==null}if(_e){q?t.location.replace(Z):t.location.assign(Z);return}}z=null;let oe=q===!0||O.response.headers.has("X-Remix-Replace")?wt.Replace:wt.Push,{formMethod:he,formAction:ve,formEncType:Ct}=E.navigation;!ie&&!ce&&he&&ve&&Ct&&(ie=U1(E.navigation));let Ue=ie||ce;if(ZA.has(O.response.status)&&Ue&&Kr(Ue.formMethod))await En(oe,B,{submission:ct({},Ue,{formAction:Z}),preventScrollReset:le||P,enableViewTransition:L?Y:void 0});else{let _e=Ah(B,ie);await En(oe,B,{overrideNavigation:_e,fetcherSubmission:ce,preventScrollReset:le||P,enableViewTransition:L?Y:void 0})}}async function Zi(j,O,L,H,ie,ce){let le,q={};try{le=await sP(h,j,O,L,H,ie,ce,o,i)}catch(Z){return H.forEach(B=>{q[B.route.id]={type:$e.error,error:Z}}),q}for(let[Z,B]of Object.entries(le))if(fP(B)){let oe=B.result;q[Z]={type:$e.redirect,response:cP(oe,L,Z,ie,d,v.v7_relativeSplatPath)}}else q[Z]=await lP(B);return q}async function fa(j,O,L,H,ie){let ce=j.matches,le=Zi("loader",j,ie,L,O,null),q=Promise.all(H.map(async oe=>{if(oe.matches&&oe.match&&oe.controller){let ve=(await Zi("loader",j,es(e.history,oe.path,oe.controller.signal),[oe.match],oe.matches,oe.key))[oe.match.route.id];return{[oe.key]:ve}}else return Promise.resolve({[oe.key]:{type:$e.error,error:ar(404,{pathname:oe.path})}})})),Z=await le,B=(await q).reduce((oe,he)=>Object.assign(oe,he),{});return await Promise.all([pP(O,Z,ie.signal,ce,j.loaderData),gP(O,B,H)]),{loaderResults:Z,fetcherResults:B}}function It(){Oe=!0,Ne.push(...Tn()),pe.forEach((j,O)=>{Ee.has(O)&&it.add(O),Ur(O)})}function Fr(j,O,L){L===void 0&&(L={}),E.fetchers.set(j,O),yt({fetchers:new Map(E.fetchers)},{flushSync:(L&&L.flushSync)===!0})}function gr(j,O,L,H){H===void 0&&(H={});let ie=mo(E.matches,O);ze(j),yt({errors:{[ie.route.id]:L},fetchers:new Map(E.fetchers)},{flushSync:(H&&H.flushSync)===!0})}function Ji(j){return v.v7_fetcherPersist&&(Ke.set(j,(Ke.get(j)||0)+1),Ae.has(j)&&Ae.delete(j)),E.fetchers.get(j)||JA}function ze(j){let O=E.fetchers.get(j);Ee.has(j)&&!(O&&O.state==="loading"&&ee.has(j))&&Ur(j),pe.delete(j),ee.delete(j),ge.delete(j),Ae.delete(j),it.delete(j),E.fetchers.delete(j)}function rc(j){if(v.v7_fetcherPersist){let O=(Ke.get(j)||0)-1;O<=0?(Ke.delete(j),Ae.add(j)):Ke.set(j,O)}else ze(j);yt({fetchers:new Map(E.fetchers)})}function Ur(j){let O=Ee.get(j);O&&(O.abort(),Ee.delete(j))}function eo(j){for(let O of j){let L=Ji(O),H=yi(L.data);E.fetchers.set(O,H)}}function Fo(){let j=[],O=!1;for(let L of ge){let H=E.fetchers.get(L);be(H,"Expected fetcher: "+L),H.state==="loading"&&(ge.delete(L),j.push(L),O=!0)}return eo(j),O}function to(j){let O=[];for(let[L,H]of ee)if(H0}function ci(j,O){let L=E.blockers.get(j)||ja;return pt.get(j)!==O&&pt.set(j,O),L}function ro(j){E.blockers.delete(j),pt.delete(j)}function Uo(j,O){let L=E.blockers.get(j)||ja;be(L.state==="unblocked"&&O.state==="blocked"||L.state==="blocked"&&O.state==="blocked"||L.state==="blocked"&&O.state==="proceeding"||L.state==="blocked"&&O.state==="unblocked"||L.state==="proceeding"&&O.state==="unblocked","Invalid blocker state transition: "+L.state+" -> "+O.state);let H=new Map(E.blockers);H.set(j,O),yt({blockers:H})}function no(j){let{currentLocation:O,nextLocation:L,historyAction:H}=j;if(pt.size===0)return;pt.size>1&&Ro(!1,"A router only supports one blocker at a time");let ie=Array.from(pt.entries()),[ce,le]=ie[ie.length-1],q=E.blockers.get(ce);if(!(q&&q.state==="proceeding")&&le({currentLocation:O,nextLocation:L,historyAction:H}))return ce}function ha(j){let O=ar(404,{pathname:j}),L=c||a,{matches:H,route:ie}=H1(L);return Tn(),{notFoundMatches:H,route:ie,error:O}}function Tn(j){let O=[];return te.forEach((L,H)=>{(!j||j(H))&&(L.cancel(),O.push(H),te.delete(H))}),O}function ui(j,O,L){if(C=j,T=O,D=L||null,!b&&E.navigation===Rh){b=!0;let H=re(E.location,E.matches);H!=null&&yt({restoreScrollPosition:H})}return()=>{C=null,T=null,D=null}}function $o(j,O){return D&&D(j,O.map(H=>RA(H,E.loaderData)))||j.key}function Bo(j,O){if(C&&T){let L=$o(j,O);C[L]=T()}}function re(j,O){if(C){let L=$o(j,O),H=C[L];if(typeof H=="number")return H}return null}function Wo(j,O,L){if(g)if(j){if(Object.keys(j[0].params).length>0)return{active:!0,matches:du(O,L,d,!0)}}else return{active:!0,matches:du(O,L,d,!0)||[]};return{active:!1,matches:null}}async function Go(j,O,L){if(!g)return{type:"success",matches:j};let H=j;for(;;){let ie=c==null,ce=c||a,le=o;try{await g({path:O,matches:H,patch:(B,oe)=>{L.aborted||M1(B,oe,ce,le,i)}})}catch(B){return{type:"error",error:B,partialMatches:H}}finally{ie&&!L.aborted&&(a=[...a])}if(L.aborted)return{type:"aborted"};let q=ho(ce,O,d);if(q)return{type:"success",matches:q};let Z=du(ce,O,d,!0);if(!Z||H.length===Z.length&&H.every((B,oe)=>B.route.id===Z[oe].route.id))return{type:"success",matches:null};H=Z}}function $r(j){o={},c=$u(j,i,void 0,o)}function tr(j,O){let L=c==null;M1(j,O,c||a,o,i),L&&(a=[...a],yt({}))}return M={get basename(){return d},get future(){return v},get state(){return E},get routes(){return a},get window(){return t},initialize:ln,subscribe:hr,enableScrollRestoration:ui,navigate:pr,fetch:tc,revalidate:Mf,createHref:j=>e.history.createHref(j),encodeLocation:j=>e.history.encodeLocation(j),getFetcher:Ji,deleteFetcher:rc,dispose:Hr,getBlocker:ci,deleteBlocker:ro,patchRoutes:tr,_internalFetchControllers:Ee,_internalActiveDeferreds:te,_internalSetRoutes:$r},M}function rP(e){return e!=null&&("formData"in e&&e.formData!=null||"body"in e&&e.body!==void 0)}function Yp(e,t,r,n,i,o,a,c){let d,h;if(a){d=[];for(let v of t)if(d.push(v),v.route.id===a){h=v;break}}else d=t,h=t[t.length-1];let g=xg(i||".",_g(d,o),ra(e.pathname,r)||e.pathname,c==="path");if(i==null&&(g.search=e.search,g.hash=e.hash),(i==null||i===""||i===".")&&h){let v=kg(g.search);if(h.route.index&&!v)g.search=g.search?g.search.replace(/^\?/,"?index&"):"?index";else if(!h.route.index&&v){let y=new URLSearchParams(g.search),S=y.getAll("index");y.delete("index"),S.filter(D=>D).forEach(D=>y.append("index",D));let C=y.toString();g.search=C?"?"+C:""}}return n&&r!=="/"&&(g.pathname=g.pathname==="/"?r:Kn([r,g.pathname])),Ao(g)}function A1(e,t,r,n){if(!n||!rP(n))return{path:r};if(n.formMethod&&!mP(n.formMethod))return{path:r,error:ar(405,{method:n.formMethod})};let i=()=>({path:r,error:ar(400,{type:"invalid-body"})}),o=n.formMethod||"get",a=e?o.toUpperCase():o.toLowerCase(),c=wS(r);if(n.body!==void 0){if(n.formEncType==="text/plain"){if(!Kr(a))return i();let y=typeof n.body=="string"?n.body:n.body instanceof FormData||n.body instanceof URLSearchParams?Array.from(n.body.entries()).reduce((S,C)=>{let[D,T]=C;return""+S+D+"="+T+` +`},""):String(n.body);return{path:r,submission:{formMethod:a,formAction:c,formEncType:n.formEncType,formData:void 0,json:void 0,text:y}}}else if(n.formEncType==="application/json"){if(!Kr(a))return i();try{let y=typeof n.body=="string"?JSON.parse(n.body):n.body;return{path:r,submission:{formMethod:a,formAction:c,formEncType:n.formEncType,formData:void 0,json:y,text:void 0}}}catch{return i()}}}be(typeof FormData=="function","FormData is not available in this environment");let d,h;if(n.formData)d=Hp(n.formData),h=n.formData;else if(n.body instanceof FormData)d=Hp(n.body),h=n.body;else if(n.body instanceof URLSearchParams)d=n.body,h=N1(d);else if(n.body==null)d=new URLSearchParams,h=new FormData;else try{d=new URLSearchParams(n.body),h=N1(d)}catch{return i()}let g={formMethod:a,formAction:c,formEncType:n&&n.formEncType||"application/x-www-form-urlencoded",formData:h,json:void 0,text:void 0};if(Kr(g.formMethod))return{path:r,submission:g};let v=Sn(r);return t&&v.search&&kg(v.search)&&d.append("index",""),v.search="?"+d,{path:Ao(v),submission:g}}function P1(e,t,r){r===void 0&&(r=!1);let n=e.findIndex(i=>i.route.id===t);return n>=0?e.slice(0,r?n+1:n):e}function O1(e,t,r,n,i,o,a,c,d,h,g,v,y,S,C,D){let T=D?wr(D[1])?D[1].error:D[1].data:void 0,b=e.createURL(t.location),w=e.createURL(i),k=r;o&&t.errors?k=P1(r,Object.keys(t.errors)[0],!0):D&&wr(D[1])&&(k=P1(r,D[0]));let A=D?D[1].statusCode:void 0,M=a&&A&&A>=400,E=k.filter((P,z)=>{let{route:Y}=P;if(Y.lazy)return!0;if(Y.loader==null)return!1;if(o)return zp(Y,t.loaderData,t.errors);if(nP(t.loaderData,t.matches[z],P)||d.some(G=>G===P.route.id))return!0;let K=t.matches[z],Q=P;return L1(P,ct({currentUrl:b,currentParams:K.params,nextUrl:w,nextParams:Q.params},n,{actionResult:T,actionStatus:A,defaultShouldRevalidate:M?!1:c||b.pathname+b.search===w.pathname+w.search||b.search!==w.search||vS(K,Q)}))}),I=[];return v.forEach((P,z)=>{if(o||!r.some(Oe=>Oe.route.id===P.routeId)||g.has(z))return;let Y=ho(S,P.path,C);if(!Y){I.push({key:z,routeId:P.routeId,path:P.path,matches:null,match:null,controller:null});return}let K=t.fetchers.get(z),Q=Fa(Y,P.path),G=!1;y.has(z)?G=!1:h.has(z)?(h.delete(z),G=!0):K&&K.state!=="idle"&&K.data===void 0?G=c:G=L1(Q,ct({currentUrl:b,currentParams:t.matches[t.matches.length-1].params,nextUrl:w,nextParams:r[r.length-1].params},n,{actionResult:T,actionStatus:A,defaultShouldRevalidate:M?!1:c})),G&&I.push({key:z,routeId:P.routeId,path:P.path,matches:Y,match:Q,controller:new AbortController})}),[E,I]}function zp(e,t,r){if(e.lazy)return!0;if(!e.loader)return!1;let n=t!=null&&t[e.id]!==void 0,i=r!=null&&r[e.id]!==void 0;return!n&&i?!1:typeof e.loader=="function"&&e.loader.hydrate===!0?!0:!n&&!i}function nP(e,t,r){let n=!t||r.route.id!==t.route.id,i=e[r.route.id]===void 0;return n||i}function vS(e,t){let r=e.route.path;return e.pathname!==t.pathname||r!=null&&r.endsWith("*")&&e.params["*"]!==t.params["*"]}function L1(e,t){if(e.route.shouldRevalidate){let r=e.route.shouldRevalidate(t);if(typeof r=="boolean")return r}return t.defaultShouldRevalidate}function M1(e,t,r,n,i){var o;let a;if(e){let h=n[e];be(h,"No route found to patch children into: routeId = "+e),h.children||(h.children=[]),a=h.children}else a=r;let c=t.filter(h=>!a.some(g=>yS(h,g))),d=$u(c,i,[e||"_","patch",String(((o=a)==null?void 0:o.length)||"0")],n);a.push(...d)}function yS(e,t){return"id"in e&&"id"in t&&e.id===t.id?!0:e.index===t.index&&e.path===t.path&&e.caseSensitive===t.caseSensitive?(!e.children||e.children.length===0)&&(!t.children||t.children.length===0)?!0:e.children.every((r,n)=>{var i;return(i=t.children)==null?void 0:i.some(o=>yS(r,o))}):!1}async function iP(e,t,r){if(!e.lazy)return;let n=await e.lazy();if(!e.lazy)return;let i=r[e.id];be(i,"No route found in manifest");let o={};for(let a in n){let d=i[a]!==void 0&&a!=="hasErrorBoundary";Ro(!d,'Route "'+i.id+'" has a static property "'+a+'" defined but its lazy function is also returning a value for this property. '+('The lazy route property "'+a+'" will be ignored.')),!d&&!jA.has(a)&&(o[a]=n[a])}Object.assign(i,o),Object.assign(i,ct({},t(i),{lazy:void 0}))}async function oP(e){let{matches:t}=e,r=t.filter(i=>i.shouldLoad);return(await Promise.all(r.map(i=>i.resolve()))).reduce((i,o,a)=>Object.assign(i,{[r[a].route.id]:o}),{})}async function sP(e,t,r,n,i,o,a,c,d,h){let g=o.map(S=>S.route.lazy?iP(S.route,d,c):void 0),v=o.map((S,C)=>{let D=g[C],T=i.some(w=>w.route.id===S.route.id);return ct({},S,{shouldLoad:T,resolve:async w=>(w&&n.method==="GET"&&(S.route.lazy||S.route.loader)&&(T=!0),T?aP(t,n,S,D,w,h):Promise.resolve({type:$e.data,result:void 0}))})}),y=await e({matches:v,request:n,params:o[0].params,fetcherKey:a,context:h});try{await Promise.all(g)}catch{}return y}async function aP(e,t,r,n,i,o){let a,c,d=h=>{let g,v=new Promise((C,D)=>g=D);c=()=>g(),t.signal.addEventListener("abort",c);let y=C=>typeof h!="function"?Promise.reject(new Error("You cannot call the handler for a route which defines a boolean "+('"'+e+'" [routeId: '+r.route.id+"]"))):h({request:t,params:r.params,context:o},...C!==void 0?[C]:[]),S=(async()=>{try{return{type:"data",result:await(i?i(D=>y(D)):y())}}catch(C){return{type:"error",result:C}}})();return Promise.race([S,v])};try{let h=r.route[e];if(n)if(h){let g,[v]=await Promise.all([d(h).catch(y=>{g=y}),n]);if(g!==void 0)throw g;a=v}else if(await n,h=r.route[e],h)a=await d(h);else if(e==="action"){let g=new URL(t.url),v=g.pathname+g.search;throw ar(405,{method:t.method,pathname:v,routeId:r.route.id})}else return{type:$e.data,result:void 0};else if(h)a=await d(h);else{let g=new URL(t.url),v=g.pathname+g.search;throw ar(404,{pathname:v})}be(a.result!==void 0,"You defined "+(e==="action"?"an action":"a loader")+" for route "+('"'+r.route.id+"\" but didn't return anything from your `"+e+"` ")+"function. Please return a value or `null`.")}catch(h){return{type:$e.error,result:h}}finally{c&&t.signal.removeEventListener("abort",c)}return a}async function lP(e){let{result:t,type:r}=e;if(_S(t)){let h;try{let g=t.headers.get("Content-Type");g&&/\bapplication\/json\b/.test(g)?t.body==null?h=null:h=await t.json():h=await t.text()}catch(g){return{type:$e.error,error:g}}return r===$e.error?{type:$e.error,error:new Bu(t.status,t.statusText,h),statusCode:t.status,headers:t.headers}:{type:$e.data,data:h,statusCode:t.status,headers:t.headers}}if(r===$e.error){if(F1(t)){var n;if(t.data instanceof Error){var i;return{type:$e.error,error:t.data,statusCode:(i=t.init)==null?void 0:i.status}}t=new Bu(((n=t.init)==null?void 0:n.status)||500,void 0,t.data)}return{type:$e.error,error:t,statusCode:Ld(t)?t.status:void 0}}if(hP(t)){var o,a;return{type:$e.deferred,deferredData:t,statusCode:(o=t.init)==null?void 0:o.status,headers:((a=t.init)==null?void 0:a.headers)&&new Headers(t.init.headers)}}if(F1(t)){var c,d;return{type:$e.data,data:t.data,statusCode:(c=t.init)==null?void 0:c.status,headers:(d=t.init)!=null&&d.headers?new Headers(t.init.headers):void 0}}return{type:$e.data,data:t}}function cP(e,t,r,n,i,o){let a=e.headers.get("Location");if(be(a,"Redirects returned/thrown from loaders/actions must have a Location header"),!Sg.test(a)){let c=n.slice(0,n.findIndex(d=>d.route.id===r)+1);a=Yp(new URL(t.url),c,i,!0,a,o),e.headers.set("Location",a)}return e}function I1(e,t,r){if(Sg.test(e)){let n=e,i=n.startsWith("//")?new URL(t.protocol+n):new URL(n),o=ra(i.pathname,r)!=null;if(i.origin===t.origin&&o)return i.pathname+i.search+i.hash}return e}function es(e,t,r,n){let i=e.createURL(wS(t)).toString(),o={signal:r};if(n&&Kr(n.formMethod)){let{formMethod:a,formEncType:c}=n;o.method=a.toUpperCase(),c==="application/json"?(o.headers=new Headers({"Content-Type":c}),o.body=JSON.stringify(n.json)):c==="text/plain"?o.body=n.text:c==="application/x-www-form-urlencoded"&&n.formData?o.body=Hp(n.formData):o.body=n.formData}return new Request(i,o)}function Hp(e){let t=new URLSearchParams;for(let[r,n]of e.entries())t.append(r,typeof n=="string"?n:n.name);return t}function N1(e){let t=new FormData;for(let[r,n]of e.entries())t.append(r,n);return t}function uP(e,t,r,n,i){let o={},a=null,c,d=!1,h={},g=r&&wr(r[1])?r[1].error:void 0;return e.forEach(v=>{if(!(v.route.id in t))return;let y=v.route.id,S=t[y];if(be(!yo(S),"Cannot handle redirect results in processLoaderData"),wr(S)){let C=S.error;if(g!==void 0&&(C=g,g=void 0),a=a||{},i)a[y]=C;else{let D=mo(e,y);a[D.route.id]==null&&(a[D.route.id]=C)}o[y]=void 0,d||(d=!0,c=Ld(S.error)?S.error.status:500),S.headers&&(h[y]=S.headers)}else ji(S)?(n.set(y,S.deferredData),o[y]=S.deferredData.data,S.statusCode!=null&&S.statusCode!==200&&!d&&(c=S.statusCode),S.headers&&(h[y]=S.headers)):(o[y]=S.data,S.statusCode&&S.statusCode!==200&&!d&&(c=S.statusCode),S.headers&&(h[y]=S.headers))}),g!==void 0&&r&&(a={[r[0]]:g},o[r[0]]=void 0),{loaderData:o,errors:a,statusCode:c||200,loaderHeaders:h}}function V1(e,t,r,n,i,o,a){let{loaderData:c,errors:d}=uP(t,r,n,a,!1);return i.forEach(h=>{let{key:g,match:v,controller:y}=h,S=o[g];if(be(S,"Did not find corresponding fetcher result"),!(y&&y.signal.aborted))if(wr(S)){let C=mo(e.matches,v==null?void 0:v.route.id);d&&d[C.route.id]||(d=ct({},d,{[C.route.id]:S.error})),e.fetchers.delete(g)}else if(yo(S))be(!1,"Unhandled fetcher revalidation redirect");else if(ji(S))be(!1,"Unhandled fetcher deferred data");else{let C=yi(S.data);e.fetchers.set(g,C)}}),{loaderData:c,errors:d}}function Y1(e,t,r,n){let i=ct({},t);for(let o of r){let a=o.route.id;if(t.hasOwnProperty(a)?t[a]!==void 0&&(i[a]=t[a]):e[a]!==void 0&&o.route.loader&&(i[a]=e[a]),n&&n.hasOwnProperty(a))break}return i}function z1(e){return e?wr(e[1])?{actionData:{}}:{actionData:{[e[0]]:e[1].data}}:{}}function mo(e,t){return(t?e.slice(0,e.findIndex(n=>n.route.id===t)+1):[...e]).reverse().find(n=>n.route.hasErrorBoundary===!0)||e[0]}function H1(e){let t=e.length===1?e[0]:e.find(r=>r.index||!r.path||r.path==="/")||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:t}],route:t}}function ar(e,t){let{pathname:r,routeId:n,method:i,type:o,message:a}=t===void 0?{}:t,c="Unknown Server Error",d="Unknown @remix-run/router error";return e===400?(c="Bad Request",i&&r&&n?d="You made a "+i+' request to "'+r+'" but '+('did not provide a `loader` for route "'+n+'", ')+"so there is no way to handle the request.":o==="defer-action"?d="defer() is not supported in actions":o==="invalid-body"&&(d="Unable to encode submission body")):e===403?(c="Forbidden",d='Route "'+n+'" does not match URL "'+r+'"'):e===404?(c="Not Found",d='No route matches URL "'+r+'"'):e===405&&(c="Method Not Allowed",i&&r&&n?d="You made a "+i.toUpperCase()+' request to "'+r+'" but '+('did not provide an `action` for route "'+n+'", ')+"so there is no way to handle the request.":i&&(d='Invalid request method "'+i.toUpperCase()+'"')),new Bu(e||500,c,new Error(d),!0)}function Pc(e){let t=Object.entries(e);for(let r=t.length-1;r>=0;r--){let[n,i]=t[r];if(yo(i))return{key:n,result:i}}}function wS(e){let t=typeof e=="string"?Sn(e):e;return Ao(ct({},t,{hash:""}))}function dP(e,t){return e.pathname!==t.pathname||e.search!==t.search?!1:e.hash===""?t.hash!=="":e.hash===t.hash?!0:t.hash!==""}function fP(e){return _S(e.result)&&qA.has(e.result.status)}function ji(e){return e.type===$e.deferred}function wr(e){return e.type===$e.error}function yo(e){return(e&&e.type)===$e.redirect}function F1(e){return typeof e=="object"&&e!=null&&"type"in e&&"data"in e&&"init"in e&&e.type==="DataWithResponseInit"}function hP(e){let t=e;return t&&typeof t=="object"&&typeof t.data=="object"&&typeof t.subscribe=="function"&&typeof t.cancel=="function"&&typeof t.resolveData=="function"}function _S(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.headers=="object"&&typeof e.body<"u"}function mP(e){return QA.has(e.toLowerCase())}function Kr(e){return XA.has(e.toLowerCase())}async function pP(e,t,r,n,i){let o=Object.entries(t);for(let a=0;a(y==null?void 0:y.route.id)===c);if(!h)continue;let g=n.find(y=>y.route.id===h.route.id),v=g!=null&&!vS(g,h)&&(i&&i[h.route.id])!==void 0;ji(d)&&v&&await bg(d,r,!1).then(y=>{y&&(t[c]=y)})}}async function gP(e,t,r){for(let n=0;n(h==null?void 0:h.route.id)===o)&&ji(c)&&(be(a,"Expected an AbortController for revalidating fetcher deferred result"),await bg(c,a.signal,!0).then(h=>{h&&(t[i]=h)}))}}async function bg(e,t,r){if(r===void 0&&(r=!1),!await e.deferredData.resolveData(t)){if(r)try{return{type:$e.data,data:e.deferredData.unwrappedData}}catch(i){return{type:$e.error,error:i}}return{type:$e.data,data:e.deferredData.data}}}function kg(e){return new URLSearchParams(e).getAll("index").some(t=>t==="")}function Fa(e,t){let r=typeof t=="string"?Sn(t).search:t.search;if(e[e.length-1].route.index&&kg(r||""))return e[e.length-1];let n=mS(e);return n[n.length-1]}function U1(e){let{formMethod:t,formAction:r,formEncType:n,text:i,formData:o,json:a}=e;if(!(!t||!r||!n)){if(i!=null)return{formMethod:t,formAction:r,formEncType:n,formData:void 0,json:void 0,text:i};if(o!=null)return{formMethod:t,formAction:r,formEncType:n,formData:o,json:void 0,text:void 0};if(a!==void 0)return{formMethod:t,formAction:r,formEncType:n,formData:void 0,json:a,text:void 0}}}function Ah(e,t){return t?{state:"loading",location:e,formMethod:t.formMethod,formAction:t.formAction,formEncType:t.formEncType,formData:t.formData,json:t.json,text:t.text}:{state:"loading",location:e,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0}}function vP(e,t){return{state:"submitting",location:e,formMethod:t.formMethod,formAction:t.formAction,formEncType:t.formEncType,formData:t.formData,json:t.json,text:t.text}}function Ta(e,t){return e?{state:"loading",formMethod:e.formMethod,formAction:e.formAction,formEncType:e.formEncType,formData:e.formData,json:e.json,text:e.text,data:t}:{state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:t}}function yP(e,t){return{state:"submitting",formMethod:e.formMethod,formAction:e.formAction,formEncType:e.formEncType,formData:e.formData,json:e.json,text:e.text,data:t?t.data:void 0}}function yi(e){return{state:"idle",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:e}}function wP(e,t){try{let r=e.sessionStorage.getItem(gS);if(r){let n=JSON.parse(r);for(let[i,o]of Object.entries(n||{}))o&&Array.isArray(o)&&t.set(i,new Set(o||[]))}}catch{}}function _P(e,t){if(t.size>0){let r={};for(let[n,i]of t)r[n]=[...i];try{e.sessionStorage.setItem(gS,JSON.stringify(r))}catch(n){Ro(!1,"Failed to save applied view transitions in sessionStorage ("+n+").")}}}/** + * React Router v6.27.0 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function Sl(){return Sl=Object.assign?Object.assign.bind():function(e){for(var t=1;t{c.current=!0}),N.useCallback(function(h,g){if(g===void 0&&(g={}),!c.current)return;if(typeof h=="number"){n.go(h);return}let v=xg(h,JSON.parse(a),o,g.relative==="path");e==null&&t!=="/"&&(v.pathname=v.pathname==="/"?t:Kn([t,v.pathname])),(g.replace?n.replace:n.push)(v,g.state,g)},[t,n,a,o,e])}const bP=N.createContext(null);function kP(e){let t=N.useContext(oi).outlet;return t&&N.createElement(bP.Provider,{value:e},t)}function bn(){let{matches:e}=N.useContext(oi),t=e[e.length-1];return t?t.params:{}}function kS(e,t){let{relative:r}=t===void 0?{}:t,{future:n}=N.useContext(Yo),{matches:i}=N.useContext(oi),{pathname:o}=si(),a=JSON.stringify(_g(i,n.v7_relativeSplatPath));return N.useMemo(()=>xg(e,JSON.parse(a),o,r==="path"),[e,a,o,r])}function CP(e,t,r,n){Fl()||be(!1);let{navigator:i}=N.useContext(Yo),{matches:o}=N.useContext(oi),a=o[o.length-1],c=a?a.params:{};a&&a.pathname;let d=a?a.pathnameBase:"/";a&&a.route;let h=si(),g;if(t){var v;let T=typeof t=="string"?Sn(t):t;d==="/"||(v=T.pathname)!=null&&v.startsWith(d)||be(!1),g=T}else g=h;let y=g.pathname||"/",S=y;if(d!=="/"){let T=d.replace(/^\//,"").split("/");S="/"+y.replace(/^\//,"").split("/").slice(T.length).join("/")}let C=ho(e,{pathname:S}),D=RP(C&&C.map(T=>Object.assign({},T,{params:Object.assign({},c,T.params),pathname:Kn([d,i.encodeLocation?i.encodeLocation(T.pathname).pathname:T.pathname]),pathnameBase:T.pathnameBase==="/"?d:Kn([d,i.encodeLocation?i.encodeLocation(T.pathnameBase).pathname:T.pathnameBase])})),o,r,n);return t&&D?N.createElement(Id.Provider,{value:{location:Sl({pathname:"/",search:"",hash:"",state:null,key:"default"},g),navigationType:wt.Pop}},D):D}function DP(){let e=LP(),t=Ld(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),r=e instanceof Error?e.stack:null,i={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"},o=null;return N.createElement(N.Fragment,null,N.createElement("h2",null,"Unexpected Application Error!"),N.createElement("h3",{style:{fontStyle:"italic"}},t),r?N.createElement("pre",{style:i},r):null,o)}const EP=N.createElement(DP,null);class jP extends N.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,r){return r.location!==t.location||r.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error!==void 0?t.error:r.error,location:r.location,revalidation:t.revalidation||r.revalidation}}componentDidCatch(t,r){console.error("React Router caught the following error during render",t,r)}render(){return this.state.error!==void 0?N.createElement(oi.Provider,{value:this.props.routeContext},N.createElement(SS.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function TP(e){let{routeContext:t,match:r,children:n}=e,i=N.useContext(Md);return i&&i.static&&i.staticContext&&(r.route.errorElement||r.route.ErrorBoundary)&&(i.staticContext._deepestRenderedBoundaryId=r.route.id),N.createElement(oi.Provider,{value:t},n)}function RP(e,t,r,n){var i;if(t===void 0&&(t=[]),r===void 0&&(r=null),n===void 0&&(n=null),e==null){var o;if(!r)return null;if(r.errors)e=r.matches;else if((o=n)!=null&&o.v7_partialHydration&&t.length===0&&!r.initialized&&r.matches.length>0)e=r.matches;else return null}let a=e,c=(i=r)==null?void 0:i.errors;if(c!=null){let g=a.findIndex(v=>v.route.id&&(c==null?void 0:c[v.route.id])!==void 0);g>=0||be(!1),a=a.slice(0,Math.min(a.length,g+1))}let d=!1,h=-1;if(r&&n&&n.v7_partialHydration)for(let g=0;g=0?a=a.slice(0,h+1):a=[a[0]];break}}}return a.reduceRight((g,v,y)=>{let S,C=!1,D=null,T=null;r&&(S=c&&v.route.id?c[v.route.id]:void 0,D=v.route.errorElement||EP,d&&(h<0&&y===0?(IP("route-fallback",!1),C=!0,T=null):h===y&&(C=!0,T=v.route.hydrateFallbackElement||null)));let b=t.concat(a.slice(0,y+1)),w=()=>{let k;return S?k=D:C?k=T:v.route.Component?k=N.createElement(v.route.Component,null):v.route.element?k=v.route.element:k=g,N.createElement(TP,{match:v,routeContext:{outlet:g,matches:b,isDataRoute:r!=null},children:k})};return r&&(v.route.ErrorBoundary||v.route.errorElement||y===0)?N.createElement(jP,{location:r.location,revalidation:r.revalidation,component:D,error:S,children:w(),routeContext:{outlet:null,matches:b,isDataRoute:!0}}):w()},null)}var CS=function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e}(CS||{}),Wu=function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e}(Wu||{});function AP(e){let t=N.useContext(Md);return t||be(!1),t}function PP(e){let t=N.useContext(xS);return t||be(!1),t}function OP(e){let t=N.useContext(oi);return t||be(!1),t}function DS(e){let t=OP(),r=t.matches[t.matches.length-1];return r.route.id||be(!1),r.route.id}function LP(){var e;let t=N.useContext(SS),r=PP(Wu.UseRouteError),n=DS(Wu.UseRouteError);return t!==void 0?t:(e=r.errors)==null?void 0:e[n]}function MP(){let{router:e}=AP(CS.UseNavigateStable),t=DS(Wu.UseNavigateStable),r=N.useRef(!1);return bS(()=>{r.current=!0}),N.useCallback(function(i,o){o===void 0&&(o={}),r.current&&(typeof i=="number"?e.navigate(i):e.navigate(i,Sl({fromRouteId:t},o)))},[e,t])}const $1={};function IP(e,t,r){!t&&!$1[e]&&($1[e]=!0)}function NP(e){return kP(e.context)}function VP(e){let{basename:t="/",children:r=null,location:n,navigationType:i=wt.Pop,navigator:o,static:a=!1,future:c}=e;Fl()&&be(!1);let d=t.replace(/^\/*/,"/"),h=N.useMemo(()=>({basename:d,navigator:o,static:a,future:Sl({v7_relativeSplatPath:!1},c)}),[d,c,o,a]);typeof n=="string"&&(n=Sn(n));let{pathname:g="/",search:v="",hash:y="",state:S=null,key:C="default"}=n,D=N.useMemo(()=>{let T=ra(g,d);return T==null?null:{location:{pathname:T,search:v,hash:y,state:S,key:C},navigationType:i}},[d,g,v,y,S,C,i]);return D==null?null:N.createElement(Yo.Provider,{value:h},N.createElement(Id.Provider,{children:r,value:D}))}new Promise(()=>{});function YP(e){let t={hasErrorBoundary:e.ErrorBoundary!=null||e.errorElement!=null};return e.Component&&Object.assign(t,{element:N.createElement(e.Component),Component:void 0}),e.HydrateFallback&&Object.assign(t,{hydrateFallbackElement:N.createElement(e.HydrateFallback),HydrateFallback:void 0}),e.ErrorBoundary&&Object.assign(t,{errorElement:N.createElement(e.ErrorBoundary),ErrorBoundary:void 0}),t}/** + * React Router DOM v6.27.0 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function bl(){return bl=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&(r[i]=e[i]);return r}function HP(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function FP(e,t){return e.button===0&&(!t||t==="_self")&&!HP(e)}const UP=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],$P="6";try{window.__reactRouterVersion=$P}catch{}function BP(e,t){return tP({basename:t==null?void 0:t.basename,future:bl({},t==null?void 0:t.future,{v7_prependBasename:!0}),history:CA({window:t==null?void 0:t.window}),hydrationData:(t==null?void 0:t.hydrationData)||WP(),routes:e,mapRouteProperties:YP,dataStrategy:t==null?void 0:t.dataStrategy,patchRoutesOnNavigation:t==null?void 0:t.patchRoutesOnNavigation,window:t==null?void 0:t.window}).initialize()}function WP(){var e;let t=(e=window)==null?void 0:e.__staticRouterHydrationData;return t&&t.errors&&(t=bl({},t,{errors:GP(t.errors)})),t}function GP(e){if(!e)return null;let t=Object.entries(e),r={};for(let[n,i]of t)if(i&&i.__type==="RouteErrorResponse")r[n]=new Bu(i.status,i.statusText,i.data,i.internal===!0);else if(i&&i.__type==="Error"){if(i.__subType){let o=window[i.__subType];if(typeof o=="function")try{let a=new o(i.message);a.stack="",r[n]=a}catch{}}if(r[n]==null){let o=new Error(i.message);o.stack="",r[n]=o}}else r[n]=i;return r}const XP=N.createContext({isTransitioning:!1}),KP=N.createContext(new Map),QP="startTransition",B1=fT[QP],qP="flushSync",W1=kA[qP];function ZP(e){B1?B1(e):e()}function Ra(e){W1?W1(e):e()}class JP{constructor(){this.status="pending",this.promise=new Promise((t,r)=>{this.resolve=n=>{this.status==="pending"&&(this.status="resolved",t(n))},this.reject=n=>{this.status==="pending"&&(this.status="rejected",r(n))}})}}function eO(e){let{fallbackElement:t,router:r,future:n}=e,[i,o]=N.useState(r.state),[a,c]=N.useState(),[d,h]=N.useState({isTransitioning:!1}),[g,v]=N.useState(),[y,S]=N.useState(),[C,D]=N.useState(),T=N.useRef(new Map),{v7_startTransition:b}=n||{},w=N.useCallback(P=>{b?ZP(P):P()},[b]),k=N.useCallback((P,z)=>{let{deletedFetchers:Y,flushSync:K,viewTransitionOpts:Q}=z;Y.forEach(Oe=>T.current.delete(Oe)),P.fetchers.forEach((Oe,Ne)=>{Oe.data!==void 0&&T.current.set(Ne,Oe.data)});let G=r.window==null||r.window.document==null||typeof r.window.document.startViewTransition!="function";if(!Q||G){K?Ra(()=>o(P)):w(()=>o(P));return}if(K){Ra(()=>{y&&(g&&g.resolve(),y.skipTransition()),h({isTransitioning:!0,flushSync:!0,currentLocation:Q.currentLocation,nextLocation:Q.nextLocation})});let Oe=r.window.document.startViewTransition(()=>{Ra(()=>o(P))});Oe.finished.finally(()=>{Ra(()=>{v(void 0),S(void 0),c(void 0),h({isTransitioning:!1})})}),Ra(()=>S(Oe));return}y?(g&&g.resolve(),y.skipTransition(),D({state:P,currentLocation:Q.currentLocation,nextLocation:Q.nextLocation})):(c(P),h({isTransitioning:!0,flushSync:!1,currentLocation:Q.currentLocation,nextLocation:Q.nextLocation}))},[r.window,y,g,T,w]);N.useLayoutEffect(()=>r.subscribe(k),[r,k]),N.useEffect(()=>{d.isTransitioning&&!d.flushSync&&v(new JP)},[d]),N.useEffect(()=>{if(g&&a&&r.window){let P=a,z=g.promise,Y=r.window.document.startViewTransition(async()=>{w(()=>o(P)),await z});Y.finished.finally(()=>{v(void 0),S(void 0),c(void 0),h({isTransitioning:!1})}),S(Y)}},[w,a,g,r.window]),N.useEffect(()=>{g&&a&&i.location.key===a.location.key&&g.resolve()},[g,y,i.location,a]),N.useEffect(()=>{!d.isTransitioning&&C&&(c(C.state),h({isTransitioning:!0,flushSync:!1,currentLocation:C.currentLocation,nextLocation:C.nextLocation}),D(void 0))},[d.isTransitioning,C]),N.useEffect(()=>{},[]);let A=N.useMemo(()=>({createHref:r.createHref,encodeLocation:r.encodeLocation,go:P=>r.navigate(P),push:(P,z,Y)=>r.navigate(P,{state:z,preventScrollReset:Y==null?void 0:Y.preventScrollReset}),replace:(P,z,Y)=>r.navigate(P,{replace:!0,state:z,preventScrollReset:Y==null?void 0:Y.preventScrollReset})}),[r]),M=r.basename||"/",E=N.useMemo(()=>({router:r,navigator:A,static:!1,basename:M}),[r,A,M]),I=N.useMemo(()=>({v7_relativeSplatPath:r.future.v7_relativeSplatPath}),[r.future.v7_relativeSplatPath]);return N.createElement(N.Fragment,null,N.createElement(Md.Provider,{value:E},N.createElement(xS.Provider,{value:i},N.createElement(KP.Provider,{value:T.current},N.createElement(XP.Provider,{value:d},N.createElement(VP,{basename:M,location:i.location,navigationType:i.historyAction,navigator:A,future:I},i.initialized||r.future.v7_partialHydration?N.createElement(tO,{routes:r.routes,future:r.future,state:i}):t))))),null)}const tO=N.memo(rO);function rO(e){let{routes:t,future:r,state:n}=e;return CP(t,void 0,n,r)}const nO=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",iO=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Oc=N.forwardRef(function(t,r){let{onClick:n,relative:i,reloadDocument:o,replace:a,state:c,target:d,to:h,preventScrollReset:g,viewTransition:v}=t,y=zP(t,UP),{basename:S}=N.useContext(Yo),C,D=!1;if(typeof h=="string"&&iO.test(h)&&(C=h,nO))try{let k=new URL(window.location.href),A=h.startsWith("//")?new URL(k.protocol+h):new URL(h),M=ra(A.pathname,S);A.origin===k.origin&&M!=null?h=M+A.search+A.hash:D=!0}catch{}let T=xP(h,{relative:i}),b=oO(h,{replace:a,state:c,target:d,preventScrollReset:g,relative:i,viewTransition:v});function w(k){n&&n(k),k.defaultPrevented||b(k)}return N.createElement("a",bl({},y,{href:C||T,onClick:D||o?n:w,ref:r,target:d}))});var G1;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(G1||(G1={}));var X1;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(X1||(X1={}));function oO(e,t){let{target:r,replace:n,state:i,preventScrollReset:o,relative:a,viewTransition:c}=t===void 0?{}:t,d=St(),h=si(),g=kS(e,{relative:a});return N.useCallback(v=>{if(FP(v,r)){v.preventDefault();let y=n!==void 0?n:Ao(h)===Ao(g);d(e,{replace:y,state:i,preventScrollReset:o,relative:a,viewTransition:c})}},[h,d,g,n,i,r,e,o,a,c])}var Pt=function(){return Pt=Object.assign||function(t){for(var r,n=1,i=arguments.length;n0?Rt(na,--Ir):0,Ws--,bt===10&&(Ws=1,Vd--),bt}function rn(){return bt=Ir2||Cl(bt)>3?"":" "}function pO(e,t){for(;--t&&rn()&&!(bt<48||bt>102||bt>57&&bt<65||bt>70&&bt<97););return zd(e,hu()+(t<6&&Ti()==32&&rn()==32))}function Up(e){for(;rn();)switch(bt){case e:return Ir;case 34:case 39:e!==34&&e!==39&&Up(bt);break;case 40:e===41&&Up(e);break;case 92:rn();break}return Ir}function gO(e,t){for(;rn()&&e+bt!==47+10;)if(e+bt===42+42&&Ti()===47)break;return"/*"+zd(t,Ir-1)+"*"+Dg(e===47?e:rn())}function vO(e){for(;!Cl(Ti());)rn();return zd(e,Ir)}function yO(e){return hO(mu("",null,null,null,[""],e=fO(e),0,[0],e))}function mu(e,t,r,n,i,o,a,c,d){for(var h=0,g=0,v=a,y=0,S=0,C=0,D=1,T=1,b=1,w=0,k="",A=i,M=o,E=n,I=k;T;)switch(C=w,w=rn()){case 40:if(C!=108&&Rt(I,v-1)==58){fu(I+=we(Ph(w),"&","&\f"),"&\f",TS(h?c[h-1]:0))!=-1&&(b=-1);break}case 34:case 39:case 91:I+=Ph(w);break;case 9:case 10:case 13:case 32:I+=mO(C);break;case 92:I+=pO(hu()-1,7);continue;case 47:switch(Ti()){case 42:case 47:Ua(wO(gO(rn(),hu()),t,r,d),d),(Cl(C||1)==5||Cl(Ti()||1)==5)&&Qr(I)&&Po(I,-1,void 0)!==" "&&(I+=" ");break;default:I+="/"}break;case 123*D:c[h++]=Qr(I)*b;case 125*D:case 59:case 0:switch(w){case 0:case 125:T=0;case 59+g:b==-1&&(I=we(I,/\f/g,"")),S>0&&(Qr(I)-v||D===0&&C===47)&&Ua(S>32?q1(I+";",n,r,v-1,d):q1(we(I," ","")+";",n,r,v-2,d),d);break;case 59:I+=";";default:if(Ua(E=Q1(I,t,r,h,g,i,c,k,A=[],M=[],v,o),o),w===123)if(g===0)mu(I,t,E,E,A,o,v,c,M);else switch(y===99&&Rt(I,3)===110?100:y){case 100:case 108:case 109:case 115:mu(e,E,E,n&&Ua(Q1(e,E,E,0,0,i,c,k,i,A=[],v,M),M),i,M,v,c,n?A:M);break;default:mu(I,E,E,E,[""],M,0,c,M)}}h=g=S=0,D=b=1,k=I="",v=a;break;case 58:v=1+Qr(I),S=C;default:if(D<1){if(w==123)--D;else if(w==125&&D++==0&&dO()==125)continue}switch(I+=Dg(w),w*D){case 38:b=g>0?1:(I+="\f",-1);break;case 44:c[h++]=(Qr(I)-1)*b,b=1;break;case 64:Ti()===45&&(I+=Ph(rn())),y=Ti(),g=v=Qr(k=I+=vO(hu())),w++;break;case 45:C===45&&Qr(I)==2&&(D=0)}}return o}function Q1(e,t,r,n,i,o,a,c,d,h,g,v){for(var y=i-1,S=i===0?o:[""],C=AS(S),D=0,T=0,b=0;D0?S[w]+" "+k:we(k,/&\f/g,S[w])))&&(d[b++]=A);return Yd(e,t,r,i===0?Nd:c,d,h,g,v)}function wO(e,t,r,n){return Yd(e,t,r,ES,Dg(uO()),Po(e,2,-2),0,n)}function q1(e,t,r,n,i){return Yd(e,t,r,Cg,Po(e,0,n),Po(e,n+1,-1),n,i)}function OS(e,t,r){switch(lO(e,t)){case 5103:return Ve+"print-"+e+e;case 5737:case 4201:case 3177:case 3433:case 1641:case 4457:case 2921:case 5572:case 6356:case 5844:case 3191:case 6645:case 3005:case 4215:case 6389:case 5109:case 5365:case 5621:case 3829:case 6391:case 5879:case 5623:case 6135:case 4599:return Ve+e+e;case 4855:return Ve+e.replace("add","source-over").replace("substract","source-out").replace("intersect","source-in").replace("exclude","xor")+e;case 4789:return el+e+e;case 5349:case 4246:case 4810:case 6968:case 2756:return Ve+e+el+e+et+e+e;case 5936:switch(Rt(e,t+11)){case 114:return Ve+e+et+we(e,/[svh]\w+-[tblr]{2}/,"tb")+e;case 108:return Ve+e+et+we(e,/[svh]\w+-[tblr]{2}/,"tb-rl")+e;case 45:return Ve+e+et+we(e,/[svh]\w+-[tblr]{2}/,"lr")+e}case 6828:case 4268:case 2903:return Ve+e+et+e+e;case 6165:return Ve+e+et+"flex-"+e+e;case 5187:return Ve+e+we(e,/(\w+).+(:[^]+)/,Ve+"box-$1$2"+et+"flex-$1$2")+e;case 5443:return Ve+e+et+"flex-item-"+we(e,/flex-|-self/g,"")+(Hn(e,/flex-|baseline/)?"":et+"grid-row-"+we(e,/flex-|-self/g,""))+e;case 4675:return Ve+e+et+"flex-line-pack"+we(e,/align-content|flex-|-self/g,"")+e;case 5548:return Ve+e+et+we(e,"shrink","negative")+e;case 5292:return Ve+e+et+we(e,"basis","preferred-size")+e;case 6060:return Ve+"box-"+we(e,"-grow","")+Ve+e+et+we(e,"grow","positive")+e;case 4554:return Ve+we(e,/([^-])(transform)/g,"$1"+Ve+"$2")+e;case 6187:return we(we(we(e,/(zoom-|grab)/,Ve+"$1"),/(image-set)/,Ve+"$1"),e,"")+e;case 5495:case 3959:return we(e,/(image-set\([^]*)/,Ve+"$1$`$1");case 4968:return we(we(e,/(.+:)(flex-)?(.*)/,Ve+"box-pack:$3"+et+"flex-pack:$3"),/space-between/,"justify")+Ve+e+e;case 4200:if(!Hn(e,/flex-|baseline/))return et+"grid-column-align"+Po(e,t)+e;break;case 2592:case 3360:return et+we(e,"template-","")+e;case 4384:case 3616:return r&&r.some(function(n,i){return t=i,Hn(n.props,/grid-\w+-end/)})?~fu(e+(r=r[t].value),"span",0)?e:et+we(e,"-start","")+e+et+"grid-row-span:"+(~fu(r,"span",0)?Hn(r,/\d+/):+Hn(r,/\d+/)-+Hn(e,/\d+/))+";":et+we(e,"-start","")+e;case 4896:case 4128:return r&&r.some(function(n){return Hn(n.props,/grid-\w+-start/)})?e:et+we(we(e,"-end","-span"),"span ","")+e;case 4095:case 3583:case 4068:case 2532:return we(e,/(.+)-inline(.+)/,Ve+"$1$2")+e;case 8116:case 7059:case 5753:case 5535:case 5445:case 5701:case 4933:case 4677:case 5533:case 5789:case 5021:case 4765:if(Qr(e)-1-t>6)switch(Rt(e,t+1)){case 109:if(Rt(e,t+4)!==45)break;case 102:return we(e,/(.+:)(.+)-([^]+)/,"$1"+Ve+"$2-$3$1"+el+(Rt(e,t+3)==108?"$3":"$2-$3"))+e;case 115:return~fu(e,"stretch",0)?OS(we(e,"stretch","fill-available"),t,r)+e:e}break;case 5152:case 5920:return we(e,/(.+?):(\d+)(\s*\/\s*(span)?\s*(\d+))?(.*)/,function(n,i,o,a,c,d,h){return et+i+":"+o+h+(a?et+i+"-span:"+(c?d:+d-+o)+h:"")+e});case 4949:if(Rt(e,t+6)===121)return we(e,":",":"+Ve)+e;break;case 6444:switch(Rt(e,Rt(e,14)===45?18:11)){case 120:return we(e,/(.+:)([^;\s!]+)(;|(\s+)?!.+)?/,"$1"+Ve+(Rt(e,14)===45?"inline-":"")+"box$3$1"+Ve+"$2$3$1"+et+"$2box$3")+e;case 100:return we(e,":",":"+et)+e}break;case 5719:case 2647:case 2135:case 3927:case 2391:return we(e,"scroll-","scroll-snap-")+e}return e}function $p(e,t){for(var r="",n=0;n-1&&!e.return)switch(e.type){case Cg:e.return=OS(e.value,e.length,r);return;case jS:return $p([wi(e,{value:we(e.value,"@","@"+Ve)})],n);case Nd:if(e.length)return cO(r=e.props,function(i){switch(Hn(i,n=/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":ts(wi(e,{props:[we(i,/:(read-\w+)/,":"+el+"$1")]})),ts(wi(e,{props:[i]})),Fp(e,{props:K1(r,n)});break;case"::placeholder":ts(wi(e,{props:[we(i,/:(plac\w+)/,":"+Ve+"input-$1")]})),ts(wi(e,{props:[we(i,/:(plac\w+)/,":"+el+"$1")]})),ts(wi(e,{props:[we(i,/:(plac\w+)/,et+"input-$1")]})),ts(wi(e,{props:[i]})),Fp(e,{props:K1(r,n)});break}return""})}}var bO={animationIterationCount:1,aspectRatio:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1},Gs=typeof process<"u"&&process.env!==void 0&&({}.REACT_APP_SC_ATTR||{}.SC_ATTR)||"data-styled",Eg=typeof window<"u"&&"HTMLElement"in window,kO=!!(typeof SC_DISABLE_SPEEDY=="boolean"?SC_DISABLE_SPEEDY:typeof process<"u"&&process.env!==void 0&&{}.REACT_APP_SC_DISABLE_SPEEDY!==void 0&&{}.REACT_APP_SC_DISABLE_SPEEDY!==""?{}.REACT_APP_SC_DISABLE_SPEEDY!=="false"&&{}.REACT_APP_SC_DISABLE_SPEEDY:typeof process<"u"&&process.env!==void 0&&{}.SC_DISABLE_SPEEDY!==void 0&&{}.SC_DISABLE_SPEEDY!==""&&{}.SC_DISABLE_SPEEDY!=="false"&&{}.SC_DISABLE_SPEEDY),CO={},jg=Object.freeze([]),Oo=Object.freeze({});function LS(e,t,r){return r===void 0&&(r=Oo),e.theme!==r.theme&&e.theme||t||r.theme}var MS=new Set(["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","u","ul","use","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","marker","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"]),DO=/[!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~-]+/g,EO=/(^-|-$)/g;function Z1(e){return e.replace(DO,"-").replace(EO,"")}var jO=/(a)(d)/gi,J1=function(e){return String.fromCharCode(e+(e>25?39:97))};function Bp(e){var t,r="";for(t=Math.abs(e);t>52;t=t/52|0)r=J1(t%52)+r;return(J1(t%52)+r).replace(jO,"$1-$2")}var Oh,Cs=function(e,t){for(var r=t.length;r;)e=33*e^t.charCodeAt(--r);return e},IS=function(e){return Cs(5381,e)};function NS(e){return Bp(IS(e)>>>0)}function TO(e){return e.displayName||e.name||"Component"}function Lh(e){return typeof e=="string"&&!0}var VS=typeof Symbol=="function"&&Symbol.for,YS=VS?Symbol.for("react.memo"):60115,RO=VS?Symbol.for("react.forward_ref"):60112,AO={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},PO={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},zS={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},OO=((Oh={})[RO]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},Oh[YS]=zS,Oh);function ew(e){return("type"in(t=e)&&t.type.$$typeof)===YS?zS:"$$typeof"in e?OO[e.$$typeof]:AO;var t}var LO=Object.defineProperty,MO=Object.getOwnPropertyNames,tw=Object.getOwnPropertySymbols,IO=Object.getOwnPropertyDescriptor,NO=Object.getPrototypeOf,rw=Object.prototype;function HS(e,t,r){if(typeof t!="string"){if(rw){var n=NO(t);n&&n!==rw&&HS(e,n,r)}var i=MO(t);tw&&(i=i.concat(tw(t)));for(var o=ew(e),a=ew(t),c=0;c0?" Args: ".concat(t.join(", ")):""))}var VO=function(){function e(t){this.groupSizes=new Uint32Array(512),this.length=512,this.tag=t}return e.prototype.indexOfGroup=function(t){for(var r=0,n=0;n=this.groupSizes.length){for(var n=this.groupSizes,i=n.length,o=i;t>=o;)if((o<<=1)<0)throw Mo(16,"".concat(t));this.groupSizes=new Uint32Array(o),this.groupSizes.set(n),this.length=o;for(var a=i;a=this.length||this.groupSizes[t]===0)return r;for(var n=this.groupSizes[t],i=this.indexOfGroup(t),o=i+n,a=i;a=0;h--){var g=d[h];if(g&&g.nodeType===1&&g.hasAttribute(Gs))return g}}(r),o=i!==void 0?i.nextSibling:null;n.setAttribute(Gs,"active"),n.setAttribute("data-styled-version","6.0.0-rc.1");var a=$O();return a&&n.setAttribute("nonce",a),r.insertBefore(n,o),n},BO=function(){function e(t){this.element=FS(t),this.element.appendChild(document.createTextNode("")),this.sheet=function(r){if(r.sheet)return r.sheet;for(var n=document.styleSheets,i=0,o=n.length;i=0){var n=document.createTextNode(r);return this.element.insertBefore(n,this.nodes[t]||null),this.length++,!0}return!1},e.prototype.deleteRule=function(t){this.element.removeChild(this.nodes[t]),this.length--},e.prototype.getRule=function(t){return t0&&(y+="".concat(S,","))}),i+="".concat(g).concat(v,'{content:"').concat(y,'"}').concat(`/*!sc*/ +`)},a=0;a0?".".concat(t):y},g=d.slice();a.prefix&&g.unshift(SO),g.push(function(y){y.type===Nd&&y.value.includes("&")&&(y.props[0]=y.props[0].replace(KO,r).replace(n,h))},_O);var v=function(y,S,C,D){S===void 0&&(S=""),C===void 0&&(C=""),D===void 0&&(D="&"),t=D,r=S,n=new RegExp("\\".concat(r,"\\b"),"g");var T=y.replace(QO,""),b=yO(C||S?"".concat(C," ").concat(S," { ").concat(T," }"):T);return a.namespace&&(b=US(b,a.namespace)),function(w,k){for(var A=[],M=0,E=void 0;M="A"&&e<="Z"};function iw(e){for(var t="",r=0;r>>0);if(!r.hasNameForId(this.componentId,a)){var c=n(o,".".concat(a),void 0,this.componentId);r.insertRules(this.componentId,a,c)}i=wo(i,a),this.staticRulesId=a}else{for(var d=Cs(this.baseHash,n.hash),h="",g=0;g>>0);r.hasNameForId(this.componentId,S)||r.insertRules(this.componentId,S,n(h,".".concat(S),void 0,this.componentId)),i=wo(i,S)}}return i},e}(),Rg=At.createContext(void 0);Rg.Consumer;function Ag(){return N.useContext(Rg)}function n4(e){var t=Ag(),r=N.useMemo(function(){return function(n,i){if(!n)throw Mo(14);if(Lo(n)){var o=n(i);return o}if(Array.isArray(n)||typeof n!="object")throw Mo(8);return i?Pt(Pt({},i),n):n}(e.theme,t)},[e.theme,t]);return e.children?At.createElement(Rg.Provider,{value:r},e.children):null}var Ih={};function i4(e,t,r){var n=Tg(e),i=e,o=!Lh(e),a=t.attrs,c=a===void 0?jg:a,d=t.componentId,h=d===void 0?function(M,E){var I=typeof M!="string"?"sc":Z1(M);Ih[I]=(Ih[I]||0)+1;var P="".concat(I,"-").concat(NS("6.0.0-rc.1"+I+Ih[I]));return E?"".concat(E,"-").concat(P):P}(t.displayName,t.parentComponentId):d,g=t.displayName,v=g===void 0?function(M){return Lh(M)?"styled.".concat(M):"Styled(".concat(TO(M),")")}(e):g,y=t.displayName&&t.componentId?"".concat(Z1(t.displayName),"-").concat(t.componentId):t.componentId||h,S=n&&i.attrs?i.attrs.concat(c).filter(Boolean):c,C=t.shouldForwardProp;if(n&&i.shouldForwardProp){var D=i.shouldForwardProp;if(t.shouldForwardProp){var T=t.shouldForwardProp;C=function(M,E){return D(M,E)&&T(M,E)}}else C=D}var b=new r4(r,y,n?i.componentStyle:void 0),w=b.isStatic&&c.length===0;function k(M,E){return function(I,P,z,Y){var K=I.attrs,Q=I.componentStyle,G=I.defaultProps,Oe=I.foldedComponentIds,Ne=I.styledComponentId,it=I.target,Ee=Ag(),W=Kp(),ue=I.shouldForwardProp||W.shouldForwardProp,ee=function(pt,Mt,ln){for(var Hr,hr=Pt(Pt({},Mt),{className:void 0,theme:ln}),yt=0;yt2&&Xu.registerId(this.componentId+t),this.removeStyles(t,n),this.createStyles(t,r,n,i)},e}();function s4(e){for(var t=[],r=1;r"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?m4:h4;qS.useSyncExternalStore=Xs.useSyncExternalStore!==void 0?Xs.useSyncExternalStore:p4;QS.exports=qS;var g4=QS.exports,v4={};/** + * @license React + * use-sync-external-store-shim/with-selector.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Hd=N,y4=g4;function w4(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var _4=typeof Object.is=="function"?Object.is:w4,x4=y4.useSyncExternalStore,S4=Hd.useRef,b4=Hd.useEffect,k4=Hd.useMemo,C4=Hd.useDebugValue;v4.useSyncExternalStoreWithSelector=function(e,t,r,n,i){var o=S4(null);if(o.current===null){var a={hasValue:!1,value:null};o.current=a}else a=o.current;o=k4(function(){function d(S){if(!h){if(h=!0,g=S,S=n(S),i!==void 0&&a.hasValue){var C=a.value;if(i(C,S))return v=C}return v=S}if(C=v,_4(g,S))return C;var D=n(S);return i!==void 0&&i(C,D)?C:(g=S,v=D)}var h=!1,g,v,y=r===void 0?null:r;return[function(){return d(t())},y===null?void 0:function(){return d(y())}]},[t,r,n,i]);var c=x4(e,o[0],o[1]);return b4(function(){a.hasValue=!0,a.value=c},[c]),C4(c),c};function D4(e){e()}let ZS=D4;const E4=e=>ZS=e,j4=()=>ZS,aw=Symbol.for("react-redux-context"),lw=typeof globalThis<"u"?globalThis:{};function T4(){var e;if(!N.createContext)return{};const t=(e=lw[aw])!=null?e:lw[aw]=new Map;let r=t.get(N.createContext);return r||(r=N.createContext(null),t.set(N.createContext,r)),r}const R4=T4();var JS={exports:{}},Fe={};/** @license React v16.13.1 + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Lt=typeof Symbol=="function"&&Symbol.for,Pg=Lt?Symbol.for("react.element"):60103,Og=Lt?Symbol.for("react.portal"):60106,Fd=Lt?Symbol.for("react.fragment"):60107,Ud=Lt?Symbol.for("react.strict_mode"):60108,$d=Lt?Symbol.for("react.profiler"):60114,Bd=Lt?Symbol.for("react.provider"):60109,Wd=Lt?Symbol.for("react.context"):60110,Lg=Lt?Symbol.for("react.async_mode"):60111,Gd=Lt?Symbol.for("react.concurrent_mode"):60111,Xd=Lt?Symbol.for("react.forward_ref"):60112,Kd=Lt?Symbol.for("react.suspense"):60113,A4=Lt?Symbol.for("react.suspense_list"):60120,Qd=Lt?Symbol.for("react.memo"):60115,qd=Lt?Symbol.for("react.lazy"):60116,P4=Lt?Symbol.for("react.block"):60121,O4=Lt?Symbol.for("react.fundamental"):60117,L4=Lt?Symbol.for("react.responder"):60118,M4=Lt?Symbol.for("react.scope"):60119;function Dr(e){if(typeof e=="object"&&e!==null){var t=e.$$typeof;switch(t){case Pg:switch(e=e.type,e){case Lg:case Gd:case Fd:case $d:case Ud:case Kd:return e;default:switch(e=e&&e.$$typeof,e){case Wd:case Xd:case qd:case Qd:case Bd:return e;default:return t}}case Og:return t}}}function eb(e){return Dr(e)===Gd}Fe.AsyncMode=Lg;Fe.ConcurrentMode=Gd;Fe.ContextConsumer=Wd;Fe.ContextProvider=Bd;Fe.Element=Pg;Fe.ForwardRef=Xd;Fe.Fragment=Fd;Fe.Lazy=qd;Fe.Memo=Qd;Fe.Portal=Og;Fe.Profiler=$d;Fe.StrictMode=Ud;Fe.Suspense=Kd;Fe.isAsyncMode=function(e){return eb(e)||Dr(e)===Lg};Fe.isConcurrentMode=eb;Fe.isContextConsumer=function(e){return Dr(e)===Wd};Fe.isContextProvider=function(e){return Dr(e)===Bd};Fe.isElement=function(e){return typeof e=="object"&&e!==null&&e.$$typeof===Pg};Fe.isForwardRef=function(e){return Dr(e)===Xd};Fe.isFragment=function(e){return Dr(e)===Fd};Fe.isLazy=function(e){return Dr(e)===qd};Fe.isMemo=function(e){return Dr(e)===Qd};Fe.isPortal=function(e){return Dr(e)===Og};Fe.isProfiler=function(e){return Dr(e)===$d};Fe.isStrictMode=function(e){return Dr(e)===Ud};Fe.isSuspense=function(e){return Dr(e)===Kd};Fe.isValidElementType=function(e){return typeof e=="string"||typeof e=="function"||e===Fd||e===Gd||e===$d||e===Ud||e===Kd||e===A4||typeof e=="object"&&e!==null&&(e.$$typeof===qd||e.$$typeof===Qd||e.$$typeof===Bd||e.$$typeof===Wd||e.$$typeof===Xd||e.$$typeof===O4||e.$$typeof===L4||e.$$typeof===M4||e.$$typeof===P4)};Fe.typeOf=Dr;JS.exports=Fe;var I4=JS.exports,tb=I4,N4={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},V4={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},rb={};rb[tb.ForwardRef]=N4;rb[tb.Memo]=V4;var Be={};/** + * @license React + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Mg=Symbol.for("react.element"),Ig=Symbol.for("react.portal"),Zd=Symbol.for("react.fragment"),Jd=Symbol.for("react.strict_mode"),ef=Symbol.for("react.profiler"),tf=Symbol.for("react.provider"),rf=Symbol.for("react.context"),Y4=Symbol.for("react.server_context"),nf=Symbol.for("react.forward_ref"),of=Symbol.for("react.suspense"),sf=Symbol.for("react.suspense_list"),af=Symbol.for("react.memo"),lf=Symbol.for("react.lazy"),z4=Symbol.for("react.offscreen"),nb;nb=Symbol.for("react.module.reference");function Nr(e){if(typeof e=="object"&&e!==null){var t=e.$$typeof;switch(t){case Mg:switch(e=e.type,e){case Zd:case ef:case Jd:case of:case sf:return e;default:switch(e=e&&e.$$typeof,e){case Y4:case rf:case nf:case lf:case af:case tf:return e;default:return t}}case Ig:return t}}}Be.ContextConsumer=rf;Be.ContextProvider=tf;Be.Element=Mg;Be.ForwardRef=nf;Be.Fragment=Zd;Be.Lazy=lf;Be.Memo=af;Be.Portal=Ig;Be.Profiler=ef;Be.StrictMode=Jd;Be.Suspense=of;Be.SuspenseList=sf;Be.isAsyncMode=function(){return!1};Be.isConcurrentMode=function(){return!1};Be.isContextConsumer=function(e){return Nr(e)===rf};Be.isContextProvider=function(e){return Nr(e)===tf};Be.isElement=function(e){return typeof e=="object"&&e!==null&&e.$$typeof===Mg};Be.isForwardRef=function(e){return Nr(e)===nf};Be.isFragment=function(e){return Nr(e)===Zd};Be.isLazy=function(e){return Nr(e)===lf};Be.isMemo=function(e){return Nr(e)===af};Be.isPortal=function(e){return Nr(e)===Ig};Be.isProfiler=function(e){return Nr(e)===ef};Be.isStrictMode=function(e){return Nr(e)===Jd};Be.isSuspense=function(e){return Nr(e)===of};Be.isSuspenseList=function(e){return Nr(e)===sf};Be.isValidElementType=function(e){return typeof e=="string"||typeof e=="function"||e===Zd||e===ef||e===Jd||e===of||e===sf||e===z4||typeof e=="object"&&e!==null&&(e.$$typeof===lf||e.$$typeof===af||e.$$typeof===tf||e.$$typeof===rf||e.$$typeof===nf||e.$$typeof===nb||e.getModuleId!==void 0)};Be.typeOf=Nr;function H4(){const e=j4();let t=null,r=null;return{clear(){t=null,r=null},notify(){e(()=>{let n=t;for(;n;)n.callback(),n=n.next})},get(){let n=[],i=t;for(;i;)n.push(i),i=i.next;return n},subscribe(n){let i=!0,o=r={callback:n,next:null,prev:r};return o.prev?o.prev.next=o:t=o,function(){!i||t===null||(i=!1,o.next?o.next.prev=o.prev:r=o.prev,o.prev?o.prev.next=o.next:t=o.next)}}}}const cw={notify(){},get:()=>[]};function F4(e,t){let r,n=cw,i=0,o=!1;function a(D){g();const T=n.subscribe(D);let b=!1;return()=>{b||(b=!0,T(),v())}}function c(){n.notify()}function d(){C.onStateChange&&C.onStateChange()}function h(){return o}function g(){i++,r||(r=t?t.addNestedSub(d):e.subscribe(d),n=H4())}function v(){i--,r&&i===0&&(r(),r=void 0,n.clear(),n=cw)}function y(){o||(o=!0,g())}function S(){o&&(o=!1,v())}const C={addNestedSub:a,notifyNestedSubs:c,handleChangeWrapper:d,isSubscribed:h,trySubscribe:y,tryUnsubscribe:S,getListeners:()=>n};return C}const U4=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",$4=U4?N.useLayoutEffect:N.useEffect;function B4({store:e,context:t,children:r,serverState:n,stabilityCheck:i="once",noopCheck:o="once"}){const a=N.useMemo(()=>{const h=F4(e);return{store:e,subscription:h,getServerState:n?()=>n:void 0,stabilityCheck:i,noopCheck:o}},[e,n,i,o]),c=N.useMemo(()=>e.getState(),[e]);$4(()=>{const{subscription:h}=a;return h.onStateChange=h.notifyNestedSubs,h.trySubscribe(),c!==e.getState()&&h.notifyNestedSubs(),()=>{h.tryUnsubscribe(),h.onStateChange=void 0}},[a,c]);const d=t||R4;return N.createElement(d.Provider,{value:a},r)}E4(Od.unstable_batchedUpdates);const W4=s4` + *{ + box-sizing: border-box; + } + body { + margin: 0; + } + :root { + font-family: sans-serif; + font-family: PingFang SC, Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + font-size: 100px; + + color: black; + background-color: white; + + box-sizing: border-box; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; + + @media screen and (max-width: 1399px) { + font-size: 85px; + } + @media screen and (max-width: 1023px) { + font-size: 70px; + } + @media screen and (max-width: 767px) { + font-size: 55px; + } + @media screen and (max-width: 424px) { + font-size: 40px; + } + + } + p { + margin-block: 0; + } + ul, ol { + margin-block: 0; + padding-inline-start: 0; + } + h1, h2, h3, h4, h5, h6 { + margin-block: 0; + } + a { + text-decoration: none; + } + @keyframes opac { + from { + opacity: 1; + width: 0; + height: 0; + top: 50%; + left: 50%; + } + + to { + opacity: 0; + width: 100%; + height: 100%; + top: 0; + left: 0; + } +} + +.content { + font-weight: 400; + font-size: 0.18rem; + line-height: 0.28rem; + h1 { + margin-block: 0.48rem; + font-weight: 700; + font-size: 0.36rem; + line-height: 0.52rem; + } + h2 { + margin-block: 0.48rem; + font-weight: 700; + font-size: 0.28rem; + line-height: 0.44rem; + } + h3 { + margin-block: 0.4rem; + font-weight: 700; + font-size: 0.24rem; + line-height: 0.36rem; + } + h4 { + margin-block: 0.32rem; + font-weight: 700; + font-size: 0.24rem; + line-height: 0.32rem; + } + h5 { + margin-block: 0.32rem; + font-weight: 700; + font-size: 0.22rem; + line-height: 0.28rem; + } + h6 { + margin-block: 0.24rem; + font-weight: 700; + font-size: 0.2rem; + line-height: 0.24rem; + } + p { + margin-block: 0.32rem; + font-weight: 400; + font-size: 0.18rem; + line-height: 0.28rem; + } + a { + display: inline; + text-decoration: underline; + color: #0052D9; + } + img { + margin-block: 0.64rem; + display: block; + margin-inline: auto; + max-width: 80%; + /* max-height: 7.2rem; */ + border-radius: 0.08rem; + } + ol, ul { + margin-block: 0.16rem; + padding-inline-start: 20px; + } + blockquote { + margin-block: 0.32rem; + margin-inline: 0; + padding-left: 10px; + color: #8c8c8c; + border-left: 4px solid #8c8c8c + } + hr { + margin-block: 0.48rem; + } + pre { + padding: 12px; + background: #f0f0f0; + border-radius: 4px; + overflow-x: scroll; + code { + white-space: pre-wrap; + padding: 0; + } + } + code { + padding: 4px; + border-radius: 4px; + background: #f0f0f0; + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + } + table { + width: 100%; + border-collapse: collapse; + th { + padding: 0.12rem; + border: 1px solid #000; + } + td { + padding: 0.12rem; + border: 1px solid #000; + } + } + .hljs-comment, + .hljs-quote { + color: #998; + font-style: italic; + } + .hljs-keyword, + .hljs-selector-tag, + .hljs-subst { + color: #333; + font-weight: 700; + } + .hljs-literal, + .hljs-number, + .hljs-tag .hljs-attr, + .hljs-template-variable, + .hljs-variable { + color: teal; + } + .hljs-doctag, + .hljs-string { + color: #d14; + } + .hljs-section, + .hljs-selector-id, + .hljs-title { + color: #900; + font-weight: 700; + } + .hljs-subst { + font-weight: 400; + } + .hljs-class .hljs-title, + .hljs-type { + color: #458; + font-weight: 700; + } + .hljs-attribute, + .hljs-name, + .hljs-tag { + color: navy; + font-weight: 400; + } + .hljs-link, + .hljs-regexp { + color: #009926; + } + .hljs-bullet, + .hljs-symbol { + color: #990073; + } + .hljs-built_in, + .hljs-builtin-name { + color: #0086b3; + } + .hljs-meta { + color: #999; + font-weight: 700; + } + .hljs-deletion { + background: #fdd; + } + .hljs-addition { + background: #dfd; + } + .hljs-emphasis { + font-style: italic; + } + .hljs-strong { + font-weight: 700; + } + } +`,ib=f.p` + margin-block: 0; + font-family: PingFang SC; +`,Ul=f(ib)` + font-weight: 400; + font-size: 0.16rem; + line-height: 0.28rem; +`,kn=f(ib)` + font-weight: 600; + font-size: 0.64rem; + line-height: 0.72rem; +`,G4=f(kn)``,X4=f(kn)` + font-size: 0.32rem; + line-height: 0.352rem; +`,K4=f(kn)` + font-size: 0.3rem; + line-height: 0.444rem; +`,Q4=f(kn)` + font-size: 0.28rem; + line-height: 0.56rem; +`,q4=f(kn)` + font-size: 0.24rem; + line-height: 0.44rem; +`,ob=f(kn)` + font-size: 0.24rem; + line-height: 0.32rem; +`,Z4=f(kn)` + font-size: 0.2rem; + line-height: 0.28rem; +`,J4=f(kn)` + font-size: 0.2rem; + line-height: 0.4rem; +`,eL=f(kn)` + font-size: 0.16rem; + line-height: 0.24rem; +`,tL=f(kn)` + font-size: 0.14rem; + line-height: 0.22rem; +`,rL=f(Ul)` + font-size: 0.18rem; + line-height: 0.32rem; +`,nL=f(Ul)``,iL=f(Ul)` + font-size: 0.14rem; + line-height: 0.2rem; +`,oL=f(Ul)` + font-size: 0.14rem; + line-height: 0.22rem; +`,sL=f(Ul)` + font-size: 0.12rem; + line-height: 0.2rem; +`,aL=f.div` + margin-left: -0.31rem; + display: flex; +`,lL=f(ob)` + padding-left: 0.15rem; +`,cL=f.div` + width: 0.166rem; + background: linear-gradient(90deg, #767ee5, #9966cc); +`,uL=({children:e,extra:t,style:r})=>l.jsxs(aL,{style:r,children:[l.jsx(cL,{}),l.jsx(lL,{children:e}),t]}),Ye={Heading:{CNHead1:G4,Heading2:X4,Heading3:K4,CNHead4:Q4,Heading6:q4,CNHead5:ob,CNTitleLarge:Z4,TitleLarge:J4,CNTitleMedium:eL,CNHead5S:uL,CNTitleSmall:tL},Paragraph:{CNBodyLarge:rL,CNBodyMedium:nL,CNBodySmall:iL,CNMarkMedium:oL,CNMarkSmall:sL}},{Paragraph:dL}=Ye,{CNBodyMedium:fL}=dL,hL=f.ul` + display: flex; + height: 100%; + @media screen and (max-width: 425px) { + display: none; + } +`,mL=f.li` + position: relative; + display: flex; + align-items: center; + padding-inline: 0.24rem; + border-bottom: ${e=>e.isdropdown==="true"?"0.04rem solid hsla(234, 60%, 66%, 1)":"none"}; + transition: all 0.05s; + cursor: pointer; + color: ${e=>e.isactive==="true"?e.theme.secondary08:e.theme.white00}; +`,pL=f.ul` + position: absolute; + top: 0.72rem; + right: -0.6rem; + display: ${e=>e.isdropdown==="true"?"block":"none"}; + padding: 0.16rem 0.2rem; + background: ${e=>e.theme.themeDark}; + border-radius: 0.08rem; + transition: all 0s ease 0.1s; + width: 2rem; +`,gL=f.li` + display: block; + padding-block: 0.08rem; + color: hsl(0, 0%, 88%); + font-weight: 400; + font-size: 0.14rem; + &:hover { + color: ${e=>e.theme.secondary01}; + } +`,sb=(e,t)=>{t&&(t.startsWith("http")||t.startsWith("https")?window.location.href=t:e(t))},vL=({label:e,url:t,setDropdown:r})=>{const n=St();return l.jsx(gL,{onClick:()=>{r("false"),sb(n,t)},children:e})},yL=({subNavItems:e,isdropdown:t,setDropdown:r})=>l.jsx(pL,{isdropdown:t,children:e==null?void 0:e.map(({key:n,label:i,url:o})=>l.jsx(vL,{label:i,url:o,setDropdown:r},n))}),wL=({id:e,label:t,subNavItems:r,url:n})=>{const i=St(),o=si(),[a,c]=N.useState("false"),{mode:d,activeId:h}=N.useContext(lb);return N.useEffect(()=>{c("false")},[d,o.pathname]),l.jsxs(mL,{isactive:h===e?"true":"false",isdropdown:a,onMouseOver:()=>c("true"),onMouseOut:()=>c("false"),onClick:()=>sb(i,n),children:[l.jsx(fL,{children:t}),r&&l.jsx(yL,{subNavItems:r,isdropdown:a,setDropdown:c})]})},_L=({items:e})=>l.jsx(hL,{children:e.map(({key:t,label:r,url:n,children:i})=>l.jsx(wL,{id:t,label:r,url:n,subNavItems:i},t))}),ab="/zh-cn/assets/logo-light-4c8441f8.svg",xL=f.header` + z-index: 1000; + position: ${e=>e.mode==="fixed"?"fixed":"sticky"}; + top: ${e=>e.mode==="fixed"?"0":"-0.72rem"}; + left: 0; + height: 0.72rem; + width: 100%; + background-color: ${e=>e.color==="transparent"?"transparent":e.theme.themeDark}; + color: ${e=>e.theme.white00}; + transition: all 0.3s; + // - - - + /* background-color: ${e=>e.theme.themeDark}; */ +`,SL=f.div` + display: flex; + align-items: center; + height: 100%; + max-width: 1440px; + margin-inline: auto; + padding-inline: 1.4rem; +`,bL=f.img` + height: 0.47rem; + + font-size: 0.3rem; +`,kL=f.div` + flex: 1; + min-width: 32px; +`,CL=f.div` + font-size: 0.14rem; + line-height: 0.2rem; + font-weight: 600; + color: #7680DD; + padding: 0.08rem 0.24rem; + border-radius: 0.24rem; + border: 0.02rem solid #7680DD; + margin-left: 0.24rem; +`,lb=N.createContext({color:"dark",mode:"default",activeId:"home"}),DL=new Map([["products","product"],["rdma","product"],["solutions","solution"],["resources1","resource"],["resources2","resource"],["news-honor-dynamic","resource"],["tech-talk","resource"],["events","resource"],["blogs","resource"],["clients","client"],["company1","company"],["company2","company"],["job-description","company"]]),EL=({items:e,color:t="dark",mode:r="default"})=>{const n=St(),i=si(),o=DL.get(i.pathname.split("/")[1]);return l.jsx(lb.Provider,{value:{color:t,mode:r,activeId:o},children:l.jsx(xL,{color:t,mode:r,children:l.jsxs(SL,{children:[l.jsx(bL,{src:ab,alt:"达坦科技",onClick:()=>n("/")}),l.jsx(kL,{}),window.innerWidth>425?l.jsx(_L,{items:e}):null,l.jsx(CL,{onClick:()=>window.location.href="https://datenlord.github.io/",children:"中/英"})]})})})},cb=[{key:"product",label:"产品",children:[{key:"service",label:"DatenLord Cloud Service",url:"/service"},{key:"app",label:"DatenLord Appliance",url:"/app"}]},{key:"solution",label:"解决方案",children:[{key:"ai",label:"AI 推理",url:"/solutions/ai"},{key:"storage",label:"高性能存储",url:"/solutions/storage"},{key:"networks",label:"高性能网络",url:"/solutions/networks"}]},{key:"resource",label:"资源",children:[{key:"tech-share",label:"技术分享",url:"/resources2/tech-share"},{key:"dynamics",label:"达坦动态",url:"/resources2/dynamics"},{key:"blog",label:"技术博客",url:"/resources2/blog"}]},{key:"community",label:"社区",children:[{key:"open-source-community",label:"开源社区",url:"/community"},{key:"open-source-project",label:"开源项目",url:"/community"},{key:"learning-community",label:"学习社区",url:"/community"}]},{key:"company",label:"公司",children:[{key:"about-us",label:"关于我们",url:"/company1/about-us"},{key:"join-us",label:"加入我们",url:"/company2/join-us"},{key:"contact-us",label:"联系我们",url:"/company2/contact-us"}]}],{Paragraph:jL}=Ye,{CNBodyLarge:ub}=jL,TL=f.footer` + color: #fff; + background-color: ${e=>e.theme.themeDark}; +`,RL=f.div` + max-width: 1440px; + margin-inline: auto; + padding-inline: 1.22rem; + padding-block: 0.64rem; +`,AL=f.img` + height: 0.58rem; + padding-inline: 0.16rem 0.16rem; +`,PL=f.div` + width: 100%; + display: flex; + flex-wrap: wrap; + justify-content: space-around; +`,OL=f.div` + padding-inline: 0.16rem; + padding-bottom: 0.64rem; + color: white; + width: 1.8rem; +`,LL=f.h2` + padding-bottom: 0.16rem; + margin-bottom: 0.24rem; + font-weight: 500; + font-size: 0.2rem; + line-height: 0.4rem; + text-transform: capitalize; + border-bottom: 1px solid white; + cursor: default; +`,ML=f.ul``,IL=f.li` + margin-bottom: 0.15rem; + text-transform: capitalize; + list-style-type: none; + cursor: pointer; +`,NL=f.div` + display: flex; + align-items: center; + border-bottom: 1px solid #fff; +`,VL=f(ub)` + padding-top: 0.14rem; +`,YL=()=>{const e=St();return l.jsx(l.Fragment,{children:l.jsx(TL,{children:l.jsxs(RL,{children:[l.jsxs(NL,{children:[l.jsx(AL,{src:ab}),l.jsx(PL,{children:cb.map(({key:t,label:r,children:n})=>l.jsxs(OL,{children:[l.jsx(LL,{children:r}),l.jsx(ML,{children:(n||[]).map(({key:i,label:o,url:a})=>l.jsx(IL,{onClick:()=>{a&&e(a)},children:l.jsx(ub,{children:o})},i))})]},t))})]}),l.jsx(VL,{style:{textAlign:"center"},children:"北京达坦科技有限公司©2023版权所有"})]})})})},zL=f.div` + height: 0.72rem; +`,HL=()=>{const e=si(),[t,r]=N.useState("down"),[n,i]=N.useState(!1);N.useEffect(()=>{let d=window.scrollY,h=!1;const g=()=>{const y=window.scrollY;if(y>1e3?i(!0):i(!1),Math.abs(y-d)<0){h=!1;return}r(y>d?"down":"up"),d=y>0?y:0,h=!1},v=()=>{h||(window.requestAnimationFrame(g),h=!0)};return window.addEventListener("scroll",v),()=>window.removeEventListener("scroll",v)},[t]);const o=()=>n&&t==="up"?"fixed":"default",a=()=>e.pathname.split("/")[1]==="job-description"||(e.pathname.split("/")[1]==="blogs"||e.pathname.split("/")[1]==="events"||e.pathname.split("/")[1]==="highlights"||e.pathname.split("/")[1]==="news-honor-dynamic")&&e.pathname.split("/")[2]||n&&t==="up"?"dark":"transparent";return l.jsxs(l.Fragment,{children:[l.jsx(EL,{items:cb,mode:o(),color:a()}),o()==="fixed"&&l.jsx(zL,{}),l.jsx(NP,{}),l.jsx(YL,{})]})};var db={},fb={},cf={},hb={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={animating:!1,autoplaying:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,dragging:!1,edgeDragged:!1,initialized:!1,lazyLoadedList:[],listHeight:null,listWidth:null,scrolling:!1,slideCount:null,slideHeight:null,slideWidth:null,swipeLeft:null,swiped:!1,swiping:!1,touchObject:{startX:0,startY:0,curX:0,curY:0},trackStyle:{},trackWidth:0,targetSlide:0},r=t;e.default=r})(hb);var FL="Expected a function",uw=0/0,UL="[object Symbol]",$L=/^\s+|\s+$/g,BL=/^[-+]0x[0-9a-f]+$/i,WL=/^0b[01]+$/i,GL=/^0o[0-7]+$/i,XL=parseInt,KL=typeof fs=="object"&&fs&&fs.Object===Object&&fs,QL=typeof self=="object"&&self&&self.Object===Object&&self,qL=KL||QL||Function("return this")(),ZL=Object.prototype,JL=ZL.toString,eM=Math.max,tM=Math.min,Vh=function(){return qL.Date.now()};function rM(e,t,r){var n,i,o,a,c,d,h=0,g=!1,v=!1,y=!0;if(typeof e!="function")throw new TypeError(FL);t=dw(t)||0,qp(r)&&(g=!!r.leading,v="maxWait"in r,o=v?eM(dw(r.maxWait)||0,t):o,y="trailing"in r?!!r.trailing:y);function S(E){var I=n,P=i;return n=i=void 0,h=E,a=e.apply(P,I),a}function C(E){return h=E,c=setTimeout(b,t),g?S(E):a}function D(E){var I=E-d,P=E-h,z=t-I;return v?tM(z,o-P):z}function T(E){var I=E-d,P=E-h;return d===void 0||I>=t||I<0||v&&P>=o}function b(){var E=Vh();if(T(E))return w(E);c=setTimeout(b,D(E))}function w(E){return c=void 0,y&&n?S(E):(n=i=void 0,a)}function k(){c!==void 0&&clearTimeout(c),h=0,n=d=i=c=void 0}function A(){return c===void 0?a:w(Vh())}function M(){var E=Vh(),I=T(E);if(n=arguments,i=this,d=E,I){if(c===void 0)return C(d);if(v)return c=setTimeout(b,t),S(d)}return c===void 0&&(c=setTimeout(b,t)),a}return M.cancel=k,M.flush=A,M}function qp(e){var t=typeof e;return!!e&&(t=="object"||t=="function")}function nM(e){return!!e&&typeof e=="object"}function iM(e){return typeof e=="symbol"||nM(e)&&JL.call(e)==UL}function dw(e){if(typeof e=="number")return e;if(iM(e))return uw;if(qp(e)){var t=typeof e.valueOf=="function"?e.valueOf():e;e=qp(t)?t+"":t}if(typeof e!="string")return e===0?e:+e;e=e.replace($L,"");var r=WL.test(e);return r||GL.test(e)?XL(e.slice(2),r?2:8):BL.test(e)?uw:+e}var oM=rM,mb={exports:{}};/*! + Copyright (c) 2018 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/(function(e){(function(){var t={}.hasOwnProperty;function r(){for(var o="",a=0;a0?1:0):0};J.lazySlidesOnLeft=gb;var vb=function(t){return t.centerMode?Math.floor((t.slidesToShow-1)/2)+1+(parseInt(t.centerPadding)>0?1:0):t.slidesToShow};J.lazySlidesOnRight=vb;var Ku=function(t){return t&&t.offsetWidth||0};J.getWidth=Ku;var zg=function(t){return t&&t.offsetHeight||0};J.getHeight=zg;var Hg=function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,n,i,o,a;return n=t.startX-t.curX,i=t.startY-t.curY,o=Math.atan2(i,n),a=Math.round(o*180/Math.PI),a<0&&(a=360-Math.abs(a)),a<=45&&a>=0||a<=360&&a>=315?"left":a>=135&&a<=225?"right":r===!0?a>=35&&a<=135?"up":"down":"vertical"};J.getSwipeDirection=Hg;var Fg=function(t){var r=!0;return t.infinite||(t.centerMode&&t.currentSlide>=t.slideCount-1||t.slideCount<=t.slidesToShow||t.currentSlide>=t.slideCount-t.slidesToShow)&&(r=!1),r};J.canGoNext=Fg;var uM=function(t,r){var n={};return r.forEach(function(i){return n[i]=t[i]}),n};J.extractObject=uM;var dM=function(t){var r=sM.default.Children.count(t.children),n=t.listRef,i=Math.ceil(Ku(n)),o=t.trackRef&&t.trackRef.node,a=Math.ceil(Ku(o)),c;if(t.vertical)c=i;else{var d=t.centerMode&&parseInt(t.centerPadding)*2;typeof t.centerPadding=="string"&&t.centerPadding.slice(-1)==="%"&&(d*=i/100),c=Math.ceil((i-d)/t.slidesToShow)}var h=n&&zg(n.querySelector('[data-index="0"]')),g=h*t.slidesToShow,v=t.currentSlide===void 0?t.initialSlide:t.currentSlide;t.rtl&&t.currentSlide===void 0&&(v=r-1-t.initialSlide);var y=t.lazyLoadedList||[],S=Ng(at(at({},t),{},{currentSlide:v,lazyLoadedList:y}));y=y.concat(S);var C={slideCount:r,slideWidth:c,listWidth:i,trackWidth:a,currentSlide:v,slideHeight:h,listHeight:g,lazyLoadedList:y};return t.autoplaying===null&&t.autoplay&&(C.autoplaying="playing"),C};J.initializedState=dM;var fM=function(t){var r=t.waitForAnimate,n=t.animating,i=t.fade,o=t.infinite,a=t.index,c=t.slideCount,d=t.lazyLoad,h=t.currentSlide,g=t.centerMode,v=t.slidesToScroll,y=t.slidesToShow,S=t.useCSS,C=t.lazyLoadedList;if(r&&n)return{};var D=a,T,b,w,k={},A={},M=o?a:pb(a,0,c-1);if(i){if(!o&&(a<0||a>=c))return{};a<0?D=a+c:a>=c&&(D=a-c),d&&C.indexOf(D)<0&&(C=C.concat(D)),k={animating:!0,currentSlide:D,lazyLoadedList:C,targetSlide:D},A={animating:!1,targetSlide:D}}else T=D,D<0?(T=D+c,o?c%v!==0&&(T=c-c%v):T=0):!Fg(t)&&D>h?D=T=h:g&&D>=c?(D=o?c:c-1,T=o?0:c-1):D>=c&&(T=D-c,o?c%v!==0&&(T=0):T=c-y),!o&&D+y>=c&&(T=c-y),b=jl(at(at({},t),{},{slideIndex:D})),w=jl(at(at({},t),{},{slideIndex:T})),o||(b===w&&(D=T),b=w),d&&(C=C.concat(Ng(at(at({},t),{},{currentSlide:D})))),S?(k={animating:!0,currentSlide:T,trackStyle:Ug(at(at({},t),{},{left:b})),lazyLoadedList:C,targetSlide:M},A={animating:!1,currentSlide:T,trackStyle:El(at(at({},t),{},{left:w})),swipeLeft:null,targetSlide:M}):k={currentSlide:T,trackStyle:El(at(at({},t),{},{left:w})),lazyLoadedList:C,targetSlide:M};return{state:k,nextState:A}};J.slideHandler=fM;var hM=function(t,r){var n,i,o,a,c,d=t.slidesToScroll,h=t.slidesToShow,g=t.slideCount,v=t.currentSlide,y=t.targetSlide,S=t.lazyLoad,C=t.infinite;if(a=g%d!==0,n=a?0:(g-v)%d,r.message==="previous")o=n===0?d:h-n,c=v-o,S&&!C&&(i=v-o,c=i===-1?g-1:i),C||(c=y-d);else if(r.message==="next")o=n===0?d:n,c=v+o,S&&!C&&(c=(v+d)%g+n),C||(c=y+d);else if(r.message==="dots")c=r.index*r.slidesToScroll;else if(r.message==="children"){if(c=r.index,C){var D=xb(at(at({},t),{},{targetSlide:c}));c>r.currentSlide&&D==="left"?c=c-g:c10)return{scrolling:!0};c&&(w.swipeLength=z);var Y=(d?-1:1)*(w.curX>w.startX?1:-1);c&&(Y=w.curY>w.startY?1:-1);var K=Math.ceil(D/T),Q=Hg(r.touchObject,c),G=w.swipeLength;return b||(h===0&&(Q==="right"||Q==="down")||h+1>=K&&(Q==="left"||Q==="up")||!Fg(r)&&(Q==="left"||Q==="up"))&&(G=w.swipeLength*g,v===!1&&y&&(y(Q),I.edgeDragged=!0)),!S&&k&&(k(Q),I.swiped=!0),o?E=P+G*(A/M)*Y:d?E=P-G*Y:E=P+G*Y,c&&(E=P+G*Y),I=at(at({},I),{},{touchObject:w,swipeLeft:E,trackStyle:El(at(at({},r),{},{left:E}))}),Math.abs(w.curX-w.startX)10&&(I.swiping=!0,bo(t)),I}};J.swipeMove=gM;var vM=function(t,r){var n=r.dragging,i=r.swipe,o=r.touchObject,a=r.listWidth,c=r.touchThreshold,d=r.verticalSwiping,h=r.listHeight,g=r.swipeToSlide,v=r.scrolling,y=r.onSwipe,S=r.targetSlide,C=r.currentSlide,D=r.infinite;if(!n)return i&&bo(t),{};var T=d?h/c:a/c,b=Hg(o,d),w={dragging:!1,edgeDragged:!1,scrolling:!1,swiping:!1,swiped:!1,swipeLeft:null,touchObject:{}};if(v||!o.swipeLength)return w;if(o.swipeLength>T){bo(t),y&&y(b);var k,A,M=D?C:S;switch(b){case"left":case"up":A=M+Jp(r),k=g?Zp(r,A):A,w.currentDirection=0;break;case"right":case"down":A=M-Jp(r),k=g?Zp(r,A):A,w.currentDirection=1;break;default:k=M}w.triggerSlideHandler=k}else{var E=jl(r);w.trackStyle=Ug(at(at({},r),{},{left:E}))}return w};J.swipeEnd=vM;var yb=function(t){for(var r=t.infinite?t.slideCount*2:t.slideCount,n=t.infinite?t.slidesToShow*-1:0,i=t.infinite?t.slidesToShow*-1:0,o=[];nn[n.length-1])r=n[n.length-1];else for(var o in n){if(rt.swipeLeft*-1)return n=d,!1}else if(d.offsetLeft-r+Ku(d)/2>t.swipeLeft*-1)return n=d,!1;return!0}),!n)return 0;var a=t.rtl===!0?t.slideCount-t.currentSlide:t.currentSlide,c=Math.abs(n.dataset.index-a)||1;return c}else return t.slidesToScroll};J.getSlideCount=Jp;var df=function(t,r){return r.reduce(function(n,i){return n&&t.hasOwnProperty(i)},!0)?null:console.error("Keys Missing:",t)};J.checkSpecKeys=df;var El=function(t){df(t,["left","variableWidth","slideCount","slidesToShow","slideWidth"]);var r,n,i=t.slideCount+2*t.slidesToShow;t.vertical?n=i*t.slideHeight:r=_b(t)*t.slideWidth;var o={opacity:1,transition:"",WebkitTransition:""};if(t.useTransform){var a=t.vertical?"translate3d(0px, "+t.left+"px, 0px)":"translate3d("+t.left+"px, 0px, 0px)",c=t.vertical?"translate3d(0px, "+t.left+"px, 0px)":"translate3d("+t.left+"px, 0px, 0px)",d=t.vertical?"translateY("+t.left+"px)":"translateX("+t.left+"px)";o=at(at({},o),{},{WebkitTransform:a,transform:c,msTransform:d})}else t.vertical?o.top=t.left:o.left=t.left;return t.fade&&(o={opacity:1}),r&&(o.width=r),n&&(o.height=n),window&&!window.addEventListener&&window.attachEvent&&(t.vertical?o.marginTop=t.left+"px":o.marginLeft=t.left+"px"),o};J.getTrackCSS=El;var Ug=function(t){df(t,["left","variableWidth","slideCount","slidesToShow","slideWidth","speed","cssEase"]);var r=El(t);return t.useTransform?(r.WebkitTransition="-webkit-transform "+t.speed+"ms "+t.cssEase,r.transition="transform "+t.speed+"ms "+t.cssEase):t.vertical?r.transition="top "+t.speed+"ms "+t.cssEase:r.transition="left "+t.speed+"ms "+t.cssEase,r};J.getTrackAnimateCSS=Ug;var jl=function(t){if(t.unslick)return 0;df(t,["slideIndex","trackRef","infinite","centerMode","slideCount","slidesToShow","slidesToScroll","slideWidth","listWidth","variableWidth","slideHeight"]);var r=t.slideIndex,n=t.trackRef,i=t.infinite,o=t.centerMode,a=t.slideCount,c=t.slidesToShow,d=t.slidesToScroll,h=t.slideWidth,g=t.listWidth,v=t.variableWidth,y=t.slideHeight,S=t.fade,C=t.vertical,D=0,T,b,w=0;if(S||t.slideCount===1)return 0;var k=0;if(i?(k=-tl(t),a%d!==0&&r+d>a&&(k=-(r>a?c-(r-a):a%d)),o&&(k+=parseInt(c/2))):(a%d!==0&&r+d>a&&(k=c-a%d),o&&(k=parseInt(c/2))),D=k*h,w=k*y,C?T=r*y*-1+w:T=r*h*-1+D,v===!0){var A,M=n&&n.node;if(A=r+tl(t),b=M&&M.childNodes[A],T=b?b.offsetLeft*-1:0,o===!0){A=i?r+tl(t):r,b=M&&M.children[A],T=0;for(var E=0;Et.currentSlide?t.targetSlide>t.currentSlide+Sb(t)?"left":"right":t.targetSlide0&&(a+=1),i&&r%2===0&&(a+=1),a}return i?0:r-1};J.slidesOnRight=Sb;var bb=function(t){var r=t.slidesToShow,n=t.centerMode,i=t.rtl,o=t.centerPadding;if(n){var a=(r-1)/2+1;return parseInt(o)>0&&(a+=1),!i&&r%2===0&&(a+=1),a}return i?r-1:0};J.slidesOnLeft=bb;var yM=function(){return!!(typeof window<"u"&&window.document&&window.document.createElement)};J.canUseDOM=yM;var ff={};function e0(e){"@babel/helpers - typeof";return e0=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},e0(e)}Object.defineProperty(ff,"__esModule",{value:!0});ff.Track=void 0;var Si=kb(N),Yh=kb(uf),zh=J;function kb(e){return e&&e.__esModule?e:{default:e}}function t0(){return t0=Object.assign||function(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function Qu(e){return Qu=Object.setPrototypeOf?Object.getPrototypeOf:function(r){return r.__proto__||Object.getPrototypeOf(r)},Qu(e)}function mw(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function rr(e){for(var t=1;t=t.slideCount,t.centerMode?(o=Math.floor(t.slidesToShow/2),n=(a-t.currentSlide)%t.slideCount===0,a>t.currentSlide-o-1&&a<=t.currentSlide+o&&(r=!0)):r=t.currentSlide<=a&&a=t.slideCount?c=t.targetSlide-t.slideCount:c=t.targetSlide;var d=a===c;return{"slick-slide":!0,"slick-active":r,"slick-center":n,"slick-cloned":i,"slick-current":d}},CM=function(t){var r={};return(t.variableWidth===void 0||t.variableWidth===!1)&&(r.width=t.slideWidth),t.fade&&(r.position="relative",t.vertical?r.top=-t.index*parseInt(t.slideHeight):r.left=-t.index*parseInt(t.slideWidth),r.opacity=t.currentSlide===t.index?1:0,t.useCSS&&(r.transition="opacity "+t.speed+"ms "+t.cssEase+", visibility "+t.speed+"ms "+t.cssEase)),r},Fh=function(t,r){return t.key||r},DM=function(t){var r,n=[],i=[],o=[],a=Si.default.Children.count(t.children),c=(0,zh.lazyStartIndex)(t),d=(0,zh.lazyEndIndex)(t);return Si.default.Children.forEach(t.children,function(h,g){var v,y={message:"children",index:g,slidesToScroll:t.slidesToScroll,currentSlide:t.currentSlide};!t.lazyLoad||t.lazyLoad&&t.lazyLoadedList.indexOf(g)>=0?v=h:v=Si.default.createElement("div",null);var S=CM(rr(rr({},t),{},{index:g})),C=v.props.className||"",D=Hh(rr(rr({},t),{},{index:g}));if(n.push(Si.default.cloneElement(v,{key:"original"+Fh(v,g),"data-index":g,className:(0,Yh.default)(D,C),tabIndex:"-1","aria-hidden":!D["slick-active"],style:rr(rr({outline:"none"},v.props.style||{}),S),onClick:function(w){v.props&&v.props.onClick&&v.props.onClick(w),t.focusOnSelect&&t.focusOnSelect(y)}})),t.infinite&&t.fade===!1){var T=a-g;T<=(0,zh.getPreClones)(t)&&a!==t.slidesToShow&&(r=-T,r>=c&&(v=h),D=Hh(rr(rr({},t),{},{index:r})),i.push(Si.default.cloneElement(v,{key:"precloned"+Fh(v,r),"data-index":r,tabIndex:"-1",className:(0,Yh.default)(D,C),"aria-hidden":!D["slick-active"],style:rr(rr({},v.props.style||{}),S),onClick:function(w){v.props&&v.props.onClick&&v.props.onClick(w),t.focusOnSelect&&t.focusOnSelect(y)}}))),a!==t.slidesToShow&&(r=a+g,r"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function qu(e){return qu=Object.setPrototypeOf?Object.getPrototypeOf:function(r){return r.__proto__||Object.getPrototypeOf(r)},qu(e)}var VM=function(t){var r;return t.infinite?r=Math.ceil(t.slideCount/t.slidesToScroll):r=Math.ceil((t.slideCount-t.slidesToShow)/t.slidesToScroll)+1,r},YM=function(e){OM(r,e);var t=LM(r);function r(){return AM(this,r),t.apply(this,arguments)}return PM(r,[{key:"clickHandler",value:function(i,o){o.preventDefault(),this.props.clickHandler(i)}},{key:"render",value:function(){for(var i=this.props,o=i.onMouseEnter,a=i.onMouseOver,c=i.onMouseLeave,d=i.infinite,h=i.slidesToScroll,g=i.slidesToShow,v=i.slideCount,y=i.currentSlide,S=VM({slideCount:v,slidesToScroll:h,slidesToShow:g,infinite:d}),C={onMouseEnter:o,onMouseOver:a,onMouseLeave:c},D=[],T=0;T=A&&y<=w:y===A}),E={message:"dots",index:T,slidesToScroll:h,currentSlide:y},I=this.clickHandler.bind(this,E);D=D.concat(Mc.default.createElement("li",{key:T,className:M},Mc.default.cloneElement(this.props.customPaging(T),{onClick:I})))}return Mc.default.cloneElement(this.props.appendDots(D),TM({className:this.props.dotsClass},C))}}]),r}(Mc.default.PureComponent);hf.Dots=YM;var Ks={};function a0(e){"@babel/helpers - typeof";return a0=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a0(e)}Object.defineProperty(Ks,"__esModule",{value:!0});Ks.PrevArrow=Ks.NextArrow=void 0;var Os=Eb(N),Db=Eb(uf),zM=J;function Eb(e){return e&&e.__esModule?e:{default:e}}function Zu(){return Zu=Object.assign||function(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function ed(e){return ed=Object.setPrototypeOf?Object.getPrototypeOf:function(r){return r.__proto__||Object.getPrototypeOf(r)},ed(e)}var BM=function(e){Rb(r,e);var t=Ab(r);function r(){return jb(this,r),t.apply(this,arguments)}return Tb(r,[{key:"clickHandler",value:function(i,o){o&&o.preventDefault(),this.props.clickHandler(i,o)}},{key:"render",value:function(){var i={"slick-arrow":!0,"slick-prev":!0},o=this.clickHandler.bind(this,{message:"previous"});!this.props.infinite&&(this.props.currentSlide===0||this.props.slideCount<=this.props.slidesToShow)&&(i["slick-disabled"]=!0,o=null);var a={key:"0","data-role":"none",className:(0,Db.default)(i),style:{display:"block"},onClick:o},c={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount},d;return this.props.prevArrow?d=Os.default.cloneElement(this.props.prevArrow,Ju(Ju({},a),c)):d=Os.default.createElement("button",Zu({key:"0",type:"button"},a)," ","Previous"),d}}]),r}(Os.default.PureComponent);Ks.PrevArrow=BM;var WM=function(e){Rb(r,e);var t=Ab(r);function r(){return jb(this,r),t.apply(this,arguments)}return Tb(r,[{key:"clickHandler",value:function(i,o){o&&o.preventDefault(),this.props.clickHandler(i,o)}},{key:"render",value:function(){var i={"slick-arrow":!0,"slick-next":!0},o=this.clickHandler.bind(this,{message:"next"});(0,zM.canGoNext)(this.props)||(i["slick-disabled"]=!0,o=null);var a={key:"1","data-role":"none",className:(0,Db.default)(i),style:{display:"block"},onClick:o},c={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount},d;return this.props.nextArrow?d=Os.default.cloneElement(this.props.nextArrow,Ju(Ju({},a),c)):d=Os.default.createElement("button",Zu({key:"1",type:"button"},a)," ","Next"),d}}]),r}(Os.default.PureComponent);Ks.NextArrow=WM;var Pb=function(){if(typeof Map<"u")return Map;function e(t,r){var n=-1;return t.some(function(i,o){return i[0]===r?(n=o,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),i=this.__entries__[n];return i&&i[1]},t.prototype.set=function(r,n){var i=e(this.__entries__,r);~i?this.__entries__[i][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,i=e(n,r);~i&&n.splice(i,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var i=0,o=this.__entries__;i0},e.prototype.connect_=function(){!c0||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),ZM?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!c0||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,i=qM.some(function(o){return!!~n.indexOf(o)});i&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),Ob=function(e,t){for(var r=0,n=Object.keys(t);r"u"||!(Element instanceof Object))){if(!(t instanceof Qs(t).Element))throw new TypeError('parameter 1 is not of type "Element".');var r=this.observations_;r.has(t)||(r.set(t,new a3(t)),this.controller_.addObserver(this),this.controller_.refresh())}},e.prototype.unobserve=function(t){if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");if(!(typeof Element>"u"||!(Element instanceof Object))){if(!(t instanceof Qs(t).Element))throw new TypeError('parameter 1 is not of type "Element".');var r=this.observations_;r.has(t)&&(r.delete(t),r.size||this.controller_.removeObserver(this))}},e.prototype.disconnect=function(){this.clearActive(),this.observations_.clear(),this.controller_.removeObserver(this)},e.prototype.gatherActive=function(){var t=this;this.clearActive(),this.observations_.forEach(function(r){r.isActive()&&t.activeObservations_.push(r)})},e.prototype.broadcastActive=function(){if(this.hasActive()){var t=this.callbackCtx_,r=this.activeObservations_.map(function(n){return new l3(n.target,n.broadcastRect())});this.callback_.call(t,r,t),this.clearActive()}},e.prototype.clearActive=function(){this.activeObservations_.splice(0)},e.prototype.hasActive=function(){return this.activeObservations_.length>0},e}(),Mb=typeof WeakMap<"u"?new WeakMap:new Pb,Ib=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=JM.getInstance(),n=new c3(t,r,this);Mb.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){Ib.prototype[e]=function(){var t;return(t=Mb.get(this))[e].apply(t,arguments)}});var u3=function(){return typeof td.ResizeObserver<"u"?td.ResizeObserver:Ib}();const d3=Object.freeze(Object.defineProperty({__proto__:null,default:u3},Symbol.toStringTag,{value:"Module"})),f3=Qj(d3);Object.defineProperty(cf,"__esModule",{value:!0});cf.InnerSlider=void 0;var Xt=$l(N),h3=$l(hb),m3=$l(oM),p3=$l(uf),dt=J,g3=ff,v3=hf,xw=Ks,y3=$l(f3);function $l(e){return e&&e.__esModule?e:{default:e}}function nd(e){"@babel/helpers - typeof";return nd=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},nd(e)}function id(){return id=Object.assign||function(e){for(var t=1;t=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function _3(e,t){if(e==null)return{};var r={},n=Object.keys(e),i,o;for(o=0;o=0)&&(r[i]=e[i]);return r}function Sw(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function fe(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function od(e){return od=Object.setPrototypeOf?Object.getPrototypeOf:function(r){return r.__proto__||Object.getPrototypeOf(r)},od(e)}function Se(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var E3=function(e){b3(r,e);var t=k3(r);function r(n){var i;x3(this,r),i=t.call(this,n),Se(xe(i),"listRefHandler",function(a){return i.list=a}),Se(xe(i),"trackRefHandler",function(a){return i.track=a}),Se(xe(i),"adaptHeight",function(){if(i.props.adaptiveHeight&&i.list){var a=i.list.querySelector('[data-index="'.concat(i.state.currentSlide,'"]'));i.list.style.height=(0,dt.getHeight)(a)+"px"}}),Se(xe(i),"componentDidMount",function(){if(i.props.onInit&&i.props.onInit(),i.props.lazyLoad){var a=(0,dt.getOnDemandLazySlides)(fe(fe({},i.props),i.state));a.length>0&&(i.setState(function(d){return{lazyLoadedList:d.lazyLoadedList.concat(a)}}),i.props.onLazyLoad&&i.props.onLazyLoad(a))}var c=fe({listRef:i.list,trackRef:i.track},i.props);i.updateState(c,!0,function(){i.adaptHeight(),i.props.autoplay&&i.autoPlay("update")}),i.props.lazyLoad==="progressive"&&(i.lazyLoadTimer=setInterval(i.progressiveLazyLoad,1e3)),i.ro=new y3.default(function(){i.state.animating?(i.onWindowResized(!1),i.callbackTimers.push(setTimeout(function(){return i.onWindowResized()},i.props.speed))):i.onWindowResized()}),i.ro.observe(i.list),document.querySelectorAll&&Array.prototype.forEach.call(document.querySelectorAll(".slick-slide"),function(d){d.onfocus=i.props.pauseOnFocus?i.onSlideFocus:null,d.onblur=i.props.pauseOnFocus?i.onSlideBlur:null}),window.addEventListener?window.addEventListener("resize",i.onWindowResized):window.attachEvent("onresize",i.onWindowResized)}),Se(xe(i),"componentWillUnmount",function(){i.animationEndCallback&&clearTimeout(i.animationEndCallback),i.lazyLoadTimer&&clearInterval(i.lazyLoadTimer),i.callbackTimers.length&&(i.callbackTimers.forEach(function(a){return clearTimeout(a)}),i.callbackTimers=[]),window.addEventListener?window.removeEventListener("resize",i.onWindowResized):window.detachEvent("onresize",i.onWindowResized),i.autoplayTimer&&clearInterval(i.autoplayTimer),i.ro.disconnect()}),Se(xe(i),"componentDidUpdate",function(a){if(i.checkImagesLoad(),i.props.onReInit&&i.props.onReInit(),i.props.lazyLoad){var c=(0,dt.getOnDemandLazySlides)(fe(fe({},i.props),i.state));c.length>0&&(i.setState(function(g){return{lazyLoadedList:g.lazyLoadedList.concat(c)}}),i.props.onLazyLoad&&i.props.onLazyLoad(c))}i.adaptHeight();var d=fe(fe({listRef:i.list,trackRef:i.track},i.props),i.state),h=i.didPropsChange(a);h&&i.updateState(d,h,function(){i.state.currentSlide>=Xt.default.Children.count(i.props.children)&&i.changeSlide({message:"index",index:Xt.default.Children.count(i.props.children)-i.props.slidesToShow,currentSlide:i.state.currentSlide}),i.props.autoplay?i.autoPlay("update"):i.pause("paused")})}),Se(xe(i),"onWindowResized",function(a){i.debouncedResize&&i.debouncedResize.cancel(),i.debouncedResize=(0,m3.default)(function(){return i.resizeWindow(a)},50),i.debouncedResize()}),Se(xe(i),"resizeWindow",function(){var a=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0,c=!!(i.track&&i.track.node);if(c){var d=fe(fe({listRef:i.list,trackRef:i.track},i.props),i.state);i.updateState(d,a,function(){i.props.autoplay?i.autoPlay("update"):i.pause("paused")}),i.setState({animating:!1}),clearTimeout(i.animationEndCallback),delete i.animationEndCallback}}),Se(xe(i),"updateState",function(a,c,d){var h=(0,dt.initializedState)(a);a=fe(fe(fe({},a),h),{},{slideIndex:h.currentSlide});var g=(0,dt.getTrackLeft)(a);a=fe(fe({},a),{},{left:g});var v=(0,dt.getTrackCSS)(a);(c||Xt.default.Children.count(i.props.children)!==Xt.default.Children.count(a.children))&&(h.trackStyle=v),i.setState(h,d)}),Se(xe(i),"ssrInit",function(){if(i.props.variableWidth){var a=0,c=0,d=[],h=(0,dt.getPreClones)(fe(fe(fe({},i.props),i.state),{},{slideCount:i.props.children.length})),g=(0,dt.getPostClones)(fe(fe(fe({},i.props),i.state),{},{slideCount:i.props.children.length}));i.props.children.forEach(function(I){d.push(I.props.style.width),a+=I.props.style.width});for(var v=0;v=c&&i.onWindowResized()};if(!h.onclick)h.onclick=function(){return h.parentNode.focus()};else{var v=h.onclick;h.onclick=function(){v(),h.parentNode.focus()}}h.onload||(i.props.lazyLoad?h.onload=function(){i.adaptHeight(),i.callbackTimers.push(setTimeout(i.onWindowResized,i.props.speed))}:(h.onload=g,h.onerror=function(){g(),i.props.onLazyLoadError&&i.props.onLazyLoadError()}))})}),Se(xe(i),"progressiveLazyLoad",function(){for(var a=[],c=fe(fe({},i.props),i.state),d=i.state.currentSlide;d=-(0,dt.getPreClones)(c);h--)if(i.state.lazyLoadedList.indexOf(h)<0){a.push(h);break}a.length>0?(i.setState(function(g){return{lazyLoadedList:g.lazyLoadedList.concat(a)}}),i.props.onLazyLoad&&i.props.onLazyLoad(a)):i.lazyLoadTimer&&(clearInterval(i.lazyLoadTimer),delete i.lazyLoadTimer)}),Se(xe(i),"slideHandler",function(a){var c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,d=i.props,h=d.asNavFor,g=d.beforeChange,v=d.onLazyLoad,y=d.speed,S=d.afterChange,C=i.state.currentSlide,D=(0,dt.slideHandler)(fe(fe(fe({index:a},i.props),i.state),{},{trackRef:i.track,useCSS:i.props.useCSS&&!c})),T=D.state,b=D.nextState;if(T){g&&g(C,T.currentSlide);var w=T.lazyLoadedList.filter(function(k){return i.state.lazyLoadedList.indexOf(k)<0});v&&w.length>0&&v(w),!i.props.waitForAnimate&&i.animationEndCallback&&(clearTimeout(i.animationEndCallback),S&&S(C),delete i.animationEndCallback),i.setState(T,function(){h&&i.asNavForIndex!==a&&(i.asNavForIndex=a,h.innerSlider.slideHandler(a)),b&&(i.animationEndCallback=setTimeout(function(){var k=b.animating,A=w3(b,["animating"]);i.setState(A,function(){i.callbackTimers.push(setTimeout(function(){return i.setState({animating:k})},10)),S&&S(T.currentSlide),delete i.animationEndCallback})},y))})}}),Se(xe(i),"changeSlide",function(a){var c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,d=fe(fe({},i.props),i.state),h=(0,dt.changeSlide)(d,a);if(!(h!==0&&!h)&&(c===!0?i.slideHandler(h,c):i.slideHandler(h),i.props.autoplay&&i.autoPlay("update"),i.props.focusOnSelect)){var g=i.list.querySelectorAll(".slick-current");g[0]&&g[0].focus()}}),Se(xe(i),"clickHandler",function(a){i.clickable===!1&&(a.stopPropagation(),a.preventDefault()),i.clickable=!0}),Se(xe(i),"keyHandler",function(a){var c=(0,dt.keyHandler)(a,i.props.accessibility,i.props.rtl);c!==""&&i.changeSlide({message:c})}),Se(xe(i),"selectHandler",function(a){i.changeSlide(a)}),Se(xe(i),"disableBodyScroll",function(){var a=function(d){d=d||window.event,d.preventDefault&&d.preventDefault(),d.returnValue=!1};window.ontouchmove=a}),Se(xe(i),"enableBodyScroll",function(){window.ontouchmove=null}),Se(xe(i),"swipeStart",function(a){i.props.verticalSwiping&&i.disableBodyScroll();var c=(0,dt.swipeStart)(a,i.props.swipe,i.props.draggable);c!==""&&i.setState(c)}),Se(xe(i),"swipeMove",function(a){var c=(0,dt.swipeMove)(a,fe(fe(fe({},i.props),i.state),{},{trackRef:i.track,listRef:i.list,slideIndex:i.state.currentSlide}));c&&(c.swiping&&(i.clickable=!1),i.setState(c))}),Se(xe(i),"swipeEnd",function(a){var c=(0,dt.swipeEnd)(a,fe(fe(fe({},i.props),i.state),{},{trackRef:i.track,listRef:i.list,slideIndex:i.state.currentSlide}));if(c){var d=c.triggerSlideHandler;delete c.triggerSlideHandler,i.setState(c),d!==void 0&&(i.slideHandler(d),i.props.verticalSwiping&&i.enableBodyScroll())}}),Se(xe(i),"touchEnd",function(a){i.swipeEnd(a),i.clickable=!0}),Se(xe(i),"slickPrev",function(){i.callbackTimers.push(setTimeout(function(){return i.changeSlide({message:"previous"})},0))}),Se(xe(i),"slickNext",function(){i.callbackTimers.push(setTimeout(function(){return i.changeSlide({message:"next"})},0))}),Se(xe(i),"slickGoTo",function(a){var c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;if(a=Number(a),isNaN(a))return"";i.callbackTimers.push(setTimeout(function(){return i.changeSlide({message:"index",index:a,currentSlide:i.state.currentSlide},c)},0))}),Se(xe(i),"play",function(){var a;if(i.props.rtl)a=i.state.currentSlide-i.props.slidesToScroll;else if((0,dt.canGoNext)(fe(fe({},i.props),i.state)))a=i.state.currentSlide+i.props.slidesToScroll;else return!1;i.slideHandler(a)}),Se(xe(i),"autoPlay",function(a){i.autoplayTimer&&clearInterval(i.autoplayTimer);var c=i.state.autoplaying;if(a==="update"){if(c==="hovered"||c==="focused"||c==="paused")return}else if(a==="leave"){if(c==="paused"||c==="focused")return}else if(a==="blur"&&(c==="paused"||c==="hovered"))return;i.autoplayTimer=setInterval(i.play,i.props.autoplaySpeed+50),i.setState({autoplaying:"playing"})}),Se(xe(i),"pause",function(a){i.autoplayTimer&&(clearInterval(i.autoplayTimer),i.autoplayTimer=null);var c=i.state.autoplaying;a==="paused"?i.setState({autoplaying:"paused"}):a==="focused"?(c==="hovered"||c==="playing")&&i.setState({autoplaying:"focused"}):c==="playing"&&i.setState({autoplaying:"hovered"})}),Se(xe(i),"onDotsOver",function(){return i.props.autoplay&&i.pause("hovered")}),Se(xe(i),"onDotsLeave",function(){return i.props.autoplay&&i.state.autoplaying==="hovered"&&i.autoPlay("leave")}),Se(xe(i),"onTrackOver",function(){return i.props.autoplay&&i.pause("hovered")}),Se(xe(i),"onTrackLeave",function(){return i.props.autoplay&&i.state.autoplaying==="hovered"&&i.autoPlay("leave")}),Se(xe(i),"onSlideFocus",function(){return i.props.autoplay&&i.pause("focused")}),Se(xe(i),"onSlideBlur",function(){return i.props.autoplay&&i.state.autoplaying==="focused"&&i.autoPlay("blur")}),Se(xe(i),"render",function(){var a=(0,p3.default)("slick-slider",i.props.className,{"slick-vertical":i.props.vertical,"slick-initialized":!0}),c=fe(fe({},i.props),i.state),d=(0,dt.extractObject)(c,["fade","cssEase","speed","infinite","centerMode","focusOnSelect","currentSlide","lazyLoad","lazyLoadedList","rtl","slideWidth","slideHeight","listHeight","vertical","slidesToShow","slidesToScroll","slideCount","trackStyle","variableWidth","unslick","centerPadding","targetSlide","useCSS"]),h=i.props.pauseOnHover;d=fe(fe({},d),{},{onMouseEnter:h?i.onTrackOver:null,onMouseLeave:h?i.onTrackLeave:null,onMouseOver:h?i.onTrackOver:null,focusOnSelect:i.props.focusOnSelect&&i.clickable?i.selectHandler:null});var g;if(i.props.dots===!0&&i.state.slideCount>=i.props.slidesToShow){var v=(0,dt.extractObject)(c,["dotsClass","slideCount","slidesToShow","currentSlide","slidesToScroll","clickHandler","children","customPaging","infinite","appendDots"]),y=i.props.pauseOnDotsHover;v=fe(fe({},v),{},{clickHandler:i.changeSlide,onMouseEnter:y?i.onDotsLeave:null,onMouseOver:y?i.onDotsOver:null,onMouseLeave:y?i.onDotsLeave:null}),g=Xt.default.createElement(v3.Dots,v)}var S,C,D=(0,dt.extractObject)(c,["infinite","centerMode","currentSlide","slideCount","slidesToShow","prevArrow","nextArrow"]);D.clickHandler=i.changeSlide,i.props.arrows&&(S=Xt.default.createElement(xw.PrevArrow,D),C=Xt.default.createElement(xw.NextArrow,D));var T=null;i.props.vertical&&(T={height:i.state.listHeight});var b=null;i.props.vertical===!1?i.props.centerMode===!0&&(b={padding:"0px "+i.props.centerPadding}):i.props.centerMode===!0&&(b={padding:i.props.centerPadding+" 0px"});var w=fe(fe({},T),b),k=i.props.touchMove,A={className:"slick-list",style:w,onClick:i.clickHandler,onMouseDown:k?i.swipeStart:null,onMouseMove:i.state.dragging&&k?i.swipeMove:null,onMouseUp:k?i.swipeEnd:null,onMouseLeave:i.state.dragging&&k?i.swipeEnd:null,onTouchStart:k?i.swipeStart:null,onTouchMove:i.state.dragging&&k?i.swipeMove:null,onTouchEnd:k?i.touchEnd:null,onTouchCancel:i.state.dragging&&k?i.swipeEnd:null,onKeyDown:i.props.accessibility?i.keyHandler:null},M={className:a,dir:"ltr",style:i.props.style};return i.props.unslick&&(A={className:"slick-list"},M={className:a}),Xt.default.createElement("div",M,i.props.unslick?"":S,Xt.default.createElement("div",id({ref:i.listRefHandler},A),Xt.default.createElement(g3.Track,id({ref:i.trackRefHandler},d),i.props.children)),i.props.unslick?"":C,i.props.unslick?"":g)}),i.list=null,i.track=null,i.state=fe(fe({},h3.default),{},{currentSlide:i.props.initialSlide,slideCount:Xt.default.Children.count(i.props.children)}),i.callbackTimers=[],i.clickable=!0,i.debouncedResize=null;var o=i.ssrInit();return i.state=fe(fe({},i.state),o),i}return S3(r,[{key:"didPropsChange",value:function(i){for(var o=!1,a=0,c=Object.keys(this.props);a"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function A(P){return A=Object.setPrototypeOf?Object.getPrototypeOf:function(Y){return Y.__proto__||Object.getPrototypeOf(Y)},A(P)}function M(P,z,Y){return z in P?Object.defineProperty(P,z,{value:Y,enumerable:!0,configurable:!0,writable:!0}):P[z]=Y,P}var E=(0,a.canUseDOM)()&&N3(),I=function(P){C(Y,P);var z=T(Y);function Y(K){var Q;return v(this,Y),Q=z.call(this,K),M(w(Q),"innerSliderRefHandler",function(G){return Q.innerSlider=G}),M(w(Q),"slickPrev",function(){return Q.innerSlider.slickPrev()}),M(w(Q),"slickNext",function(){return Q.innerSlider.slickNext()}),M(w(Q),"slickGoTo",function(G){var Oe=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;return Q.innerSlider.slickGoTo(G,Oe)}),M(w(Q),"slickPause",function(){return Q.innerSlider.pause("paused")}),M(w(Q),"slickPlay",function(){return Q.innerSlider.autoPlay("play")}),Q.state={breakpoint:null},Q._responsiveMediaHandlers=[],Q}return S(Y,[{key:"media",value:function(Q,G){E.register(Q,G),this._responsiveMediaHandlers.push({query:Q,handler:G})}},{key:"componentDidMount",value:function(){var Q=this;if(this.props.responsive){var G=this.props.responsive.map(function(Ne){return Ne.breakpoint});G.sort(function(Ne,it){return Ne-it}),G.forEach(function(Ne,it){var Ee;it===0?Ee=(0,i.default)({minWidth:0,maxWidth:Ne}):Ee=(0,i.default)({minWidth:G[it-1]+1,maxWidth:Ne}),(0,a.canUseDOM)()&&Q.media(Ee,function(){Q.setState({breakpoint:Ne})})});var Oe=(0,i.default)({minWidth:G.slice(-1)[0]});(0,a.canUseDOM)()&&this.media(Oe,function(){Q.setState({breakpoint:null})})}}},{key:"componentWillUnmount",value:function(){this._responsiveMediaHandlers.forEach(function(Q){E.unregister(Q.query,Q.handler)})}},{key:"render",value:function(){var Q=this,G,Oe;this.state.breakpoint?(Oe=this.props.responsive.filter(function(Ae){return Ae.breakpoint===Q.state.breakpoint}),G=Oe[0].settings==="unslick"?"unslick":g(g(g({},o.default),this.props),Oe[0].settings)):G=g(g({},o.default),this.props),G.centerMode&&(G.slidesToScroll>1,G.slidesToScroll=1),G.fade&&(G.slidesToShow>1,G.slidesToScroll>1,G.slidesToShow=1,G.slidesToScroll=1);var Ne=r.default.Children.toArray(this.props.children);Ne=Ne.filter(function(Ae){return typeof Ae=="string"?!!Ae.trim():!!Ae}),G.variableWidth&&(G.rows>1||G.slidesPerRow>1)&&(console.warn("variableWidth is not supported in case of rows > 1 or slidesPerRow > 1"),G.variableWidth=!1);for(var it=[],Ee=null,W=0;W=Ne.length));pe+=1)ge.push(r.default.cloneElement(Ne[pe],{key:100*W+10*ee+pe,tabIndex:-1,style:{width:"".concat(100/G.slidesPerRow,"%"),display:"inline-block"}}));ue.push(r.default.createElement("div",{key:10*W+ee},ge))}G.variableWidth?it.push(r.default.createElement("div",{key:W,style:{width:Ee}},ue)):it.push(r.default.createElement("div",{key:W},ue))}if(G==="unslick"){var Ke="regular slider "+(this.props.className||"");return r.default.createElement("div",{className:Ke},Ne)}else it.length<=G.slidesToShow&&(G.unslick=!0);return r.default.createElement(n.InnerSlider,d({style:this.props.style,ref:this.innerSliderRefHandler},G),it)}}]),Y}(r.default.Component);e.default=I})(fb);(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=r(fb);function r(i){return i&&i.__esModule?i:{default:i}}var n=t.default;e.default=n})(db);const V3=C0(db),wn=f.button` + padding-block: 0.12rem; + padding-inline: 0.34rem; + color: inherit; + background: linear-gradient(90deg, #767ee5, #9966cc); + border-radius: 0.5rem; + border: none; + font-size: 0.18rem; + line-height: 0.32rem; + cursor: pointer; +`,Rw="/zh-cn/assets/distributed-storage-bg-0c137d00.png",Y3="/zh-cn/assets/data-access-bg-16d9313d.png",z3="/zh-cn/assets/metadata-management-bg-208ca887.png",H3="/zh-cn/assets/hardware-acceleration-bg-0f801c4e.png",F3="/zh-cn/assets/open-source-bg-83537308.png",U3="/zh-cn/assets/fox-icon-09b1199e.svg",$3="/zh-cn/assets/right-arrow-2ae8803b.svg",B3=[{key:"new-honors",label:"新闻/荣誉",url:"/news-honor-dynamic",content:{type:"text",content:"达坦科技所获荣誉及相关新闻"}},{key:"event-preview",label:"活动预告",url:"/events",content:{type:"text",content:"Virtual Meetings & Meetups 线上会议及分享的预告"}},{key:"highlight-review",label:"精彩回顾",url:"/highlights",content:{type:"text",content:"直播分享或Meetups精彩回顾"}}],{Heading:W3,Paragraph:G3}=Ye,{CNHead1:X3}=W3,{CNBodyLarge:K3}=G3,Q3=e=>{switch(e){case"distributed-storage":return Rw;case"data-access":return Y3;case"metadata-management":return z3;case"hardware-acceleration":return H3;case"open-source":return F3;default:return Rw}},q3=f.div` + color: #fff; + background-size: cover; + padding-top: 0.72rem; + background-image: url(${({bg:e})=>Q3(e)}); +`,Z3=f.div` + display: flex; + flex-direction: column; + align-items: center; + max-width: 1440px; + margin-inline: auto; + padding-top: calc(2.7rem - 0.72rem); + padding-inline: 2.15rem; +`,J3=f.div` + display: flex; + justify-content: center; + width: 100%; + margin-bottom: 0.95rem; + background: rgba(0, 0, 0, 0.09); + backdrop-filter: blur(8.5px); + border: 0.01rem solid transparent; + border-image: linear-gradient(180deg, #ffffff, #ffffff40) 1; + clip-path: inset(0 round 0.14rem); + :last-child div { + border: none; + } + + /* border: 0.01rem solid #fff; */ + /* border-radius: 0.12rem; */ +`,eI=f.div` + width: 33.33%; + padding-block: 0.32rem; +`,tI=f.div` + display: flex; + flex-direction: column; + height: 100%; + padding-inline: 0.52rem; + border-right: 1px solid #d9dbef; +`,rI=f.div` + display: flex; + align-items: center; + margin-bottom: 0.22rem; +`,nI=f.div` + margin-right: 0.15rem; + font-size: 0.2rem; + line-height: 0.3rem; + letter-spacing: -2%; +`,iI=f.img` + height: 0.3rem; + margin-right: 0.27rem; +`,oI=f.p` + margin-right: 0.1rem; + font-size: 0.14rem; + line-height: 0.26rem; + color: ${e=>e.theme.secondary08}; + cursor: pointer; +`,sI=f.img` + width: 0.14rem; + cursor: pointer; +`,aI=f.p` + font-size: 0.16rem; + line-height: 0.3rem; +`,lI=new Map([["distributed-storage","/solutions/ai"],["data-access","/solutions/storage"],["hardware-acceleration","/solutions/networks"],["open-source","/community"]]),cI=()=>{const e=St();return l.jsx(J3,{children:B3.map(({key:t,label:r,content:n,url:i})=>l.jsx(eI,{children:l.jsxs(tI,{children:[l.jsxs(rI,{children:[l.jsx(nI,{children:r}),l.jsx(iI,{src:U3}),l.jsx(oI,{onClick:()=>{e(i)},children:"更多"}),l.jsx(sI,{src:$3})]}),n.type==="ul"?null:l.jsx(aI,{children:n.content})]})},t))})},uI=({items:e})=>{const t=St(),{key:r,title:n,description:i}=e;return l.jsx(q3,{bg:r,children:l.jsxs(Z3,{children:[l.jsx(X3,{style:{marginBottom:"0.32rem"},children:n}),l.jsx(K3,{style:{maxWidth:"6.12rem",textAlign:"center",marginBottom:"0.7rem"},children:i}),l.jsx(wn,{style:{marginBottom:"1.49rem"},onClick:()=>{t(lI.get(r))},children:"了解更多"}),l.jsx(cI,{})]})})},dI=f.div` + background-color: #000; +`,fI={dots:!0,infinite:!0,speed:1e3,slidesToShow:1,slidesToScroll:1,arrows:!1,fade:!0,autoplay:!0,autoplaySpeed:6e3,pauseOnFocus:!0},hI=({items:e})=>l.jsx(dI,{children:l.jsx(V3,{...fI,children:e.map(t=>l.jsx(uI,{items:t},t.key))})}),mI="/zh-cn/assets/map-37f53016.png",pI="/zh-cn/assets/infrastructure-9fd998b9.png",gI="/zh-cn/assets/pc-d09b6ade.png",vI=f.section` + background: #fff; +`,yI=f.div` + display: flex; + flex-direction: column; + align-items: center; + max-width: 1440px; + margin-inline: auto; + padding-inline: 1.64rem; + padding-block: 0.94rem; + padding-bottom: 1.8rem; +`,wI=f.div` + color: #7680DD; + font-size: 0.42rem; + line-height: 0.56rem; + font-weight: 600; + text-align: center; + max-width: 72vw; + padding-inline: 6vw; + padding-bottom: 0.36rem; + border-bottom: 0.01rem solid #D9DBEF; + margin-bottom: 0.64rem; +`,Xh=f.div` + padding-bottom: 0.56rem; + text-align: left; + width: 100%; + height: min-content; + &:last-child { + padding-bottom: 0; + } +`,Kh=f.div` + font-size: 0.32rem; + line-height: 0.58rem; + font-weight: 600; + color: #42424A; +`,Aw=f.div` + display: flex; + gap: 0.56rem; +`,Pw=f.div` + display: flex; + flex-direction: column; + justify-content: center; +`,Ic=f.div` + font-size: 0.16rem; + line-height: 0.28rem; + padding-block: 0.24rem; + &::before { + content: ''; + display: inline-block; + width: 0.12rem; + height: 0.12rem; + background: #7680DD; + border-radius: 50%; + margin-left: -0.22rem; + margin-right: 0.1rem; + } +`,Nc=f.span` + color: #7680DD; +`,Ow=f.img` + width: 45%; +`,_I=f.img` + width: 100%; + margin-bottom: -0.24rem; +`,xI=()=>l.jsx(vI,{children:l.jsxs(yI,{children:[l.jsx(wI,{children:"DatenLord 存储+网络的融合方案解决 AI 算力资源问题"}),l.jsxs(Xh,{children:[l.jsx(Kh,{children:"AI 的发展引起算力资源的紧张、分散和昂贵"}),l.jsxs(Aw,{children:[l.jsxs(Pw,{children:[l.jsxs(Ic,{children:[l.jsx(Nc,{children:"AI 大模型对高性能 GPU 算力资源需求大爆发。"}),"GPU 算力供不应求,供需极度不平衡。这进一步",l.jsx(Nc,{children:"推高"}),"了原本因设计和制造成本以及市场垄断等因素就",l.jsx(Nc,{children:"已经高企不下的GPU 算力价格"}),"。"]}),l.jsxs(Ic,{children:["GPU 算力资源优先满足 AI 训练场景,这造成 ",l.jsx(Nc,{children:"AI 推断场景的 GPU 算力资源具有分散或碎片化"}),"的特点。"]})]}),l.jsx(Ow,{src:mI})]})]}),l.jsxs(Xh,{children:[l.jsx(Kh,{children:"AI 算力资源的分散和昂贵对云计算带来的新问题"}),l.jsx(_I,{src:pI})]}),l.jsxs(Xh,{children:[l.jsx(Kh,{children:"将云计算资源复用的方式引入 AI 算力资源分配管理"}),l.jsxs(Aw,{children:[l.jsx(Ow,{src:gI}),l.jsxs(Pw,{children:[l.jsx(Ic,{children:"优化缓存技术,实现数据预加载、异步持久化,进而提升数据访问的性能; "}),l.jsx(Ic,{children:" 高性能RDMA网络,实现多节点内存共享,加速大模型的分发、加载。"})]})]})]})]})}),SI="/zh-cn/assets/logo-dark-027b6609.svg",bI="/zh-cn/assets/xline-logo-126dc1a3.svg",Lw="/zh-cn/assets/cone-62ca8bad.png",{Heading:kI,Paragraph:CI}=Ye,{CNHead4:pf,CNTitleLarge:DI}=kI,{CNBodyLarge:gf}=CI,EI=f.section` + background: #ededf6; +`,jI=f.div` + display: flex; + flex-direction: column; + align-items: center; + max-width: 1440px; + margin-inline: auto; + padding-inline: 2.56rem; + padding-block: 0.94rem; + padding-bottom: 1.8rem; +`,TI=f(pf)` + padding-bottom: 1.08rem; + color: ${e=>e.theme.gray04}; +`,$g=f.div` + padding: 0.06rem; + border: 0.03rem solid transparent; + border-radius: 0.18rem; +`,RI=f($g)` + position: relative; + width: 100%; + border-left: 0.03rem solid #767ee5; +`,AI=f($g)` + position: relative; + width: 80%; + border-right: 0.03rem solid #767ee5; + border-top: none; +`,PI=f($g)` + position: relative; + width: 100%; + border-left: 0.03rem solid #767ee5; + border-top: none; +`,Bg=f.div` + display: flex; + padding-block: 0.32rem; + padding-inline: 0.64rem; + color: #42424a; + border-radius: 0.18rem; +`,OI=f(Bg)` + flex-direction: column; + background: linear-gradient(90deg, #ffffff95, #ffffff00); +`,LI=f(Bg)` + align-items: end; + padding-top: 0.96rem; +`,MI=f(Bg)` + flex-direction: column; + padding-right: 1.24rem; + background: linear-gradient(90deg, #ffffff95, #ffffff00); +`,II=f.img` + height: 0.58rem; + align-self: flex-end; +`,NI=f(pf)` + color: #000; +`,VI=f(gf)` + width: 90%; + padding-bottom: 0.14rem; +`,YI=f(pf)` + color: #000; + padding-bottom: 0.14rem; +`,zI=f(gf)` + width: 70%; + text-align: right; + padding-bottom: 0.14rem; +`,HI=f.img` + height: 0.42rem; +`,FI=f.div` + display: flex; + flex: 1; + flex-direction: column; + align-items: end; +`,UI=f.img` + z-index: 100; + position: absolute; + top: -5%; + left: -35%; + width: 4rem; + height: 4rem; +`,$I=f.img` + z-index: 100; + position: absolute; + top: 0; + left: 0; + width: 1.2rem; + height: 1.2rem; + transform: rotate(80deg); +`,BI=f(pf)` + color: #000; +`,WI=f(gf)` + padding-bottom: 0.35rem; +`,GI=f.ul` + padding-bottom: 0.3rem; + color: #7680dd; +`,Mw=f(DI)` + padding-bottom: 0.05rem; +`,Iw=f(gf)` + padding-bottom: 0.05rem; + color: ${e=>e.theme.themeDark}; +`,Qh=f.div``,vf=f.div` + position: absolute; + width: 0.36rem; + height: 0.36rem; + background-color: transparent; + border-radius: 0.18rem; +`,Nw=f(vf)` + top: -0.02rem; + left: -0.02rem; + border-left: 0.03rem solid #767ee5; + transform: rotate(45deg); +`,Vw=f(vf)` + bottom: -0.02rem; + left: -0.02rem; + border-left: 0.03rem solid #767ee5; + transform: rotate(-45deg); +`,XI=f(vf)` + top: -0.02rem; + right: -0.02rem; + border-right: 0.03rem solid #767ee5; + transform: rotate(-45deg); +`,KI=f(vf)` + bottom: -0.02rem; + right: -0.02rem; + border-right: 0.03rem solid #767ee5; + transform: rotate(45deg); +`,ia=f.div` + position: absolute; + height: 0.03rem; +`,QI=f(ia)` + top: -0.03rem; + left: 0.13rem; + width: 93%; + background: linear-gradient(90deg, #767ee5, #9966cc); +`,qI=f(ia)` + top: -0.03rem; + right: 0.13rem; + width: 10%; + background: #767ee5; +`,ZI=f(ia)` + top: -0.03rem; + left: 0.13rem; + width: 10%; + background: #767ee5; +`,JI=f(ia)` + bottom: -0.03rem; + left: 0.13rem; + width: 70%; + background: linear-gradient(90deg, #767ee5, #9966cc); +`,eN=f(ia)` + bottom: -0.03rem; + right: 0.13rem; + width: 90%; + background: linear-gradient(90deg, #9966cc, #767ee5); +`,tN=f(ia)` + bottom: -0.03rem; + left: 0.13rem; + width: 100%; + background: linear-gradient(90deg, #9966cc, #767ee5); +`,oa=f.div` + position: absolute; + width: 0.16rem; + height: 0.16rem; + border-radius: 50%; +`,rN=f(oa)` + top: calc(-0.08rem - 0.02rem); + right: 5%; + background: #9966cc; +`,nN=f(oa)` + bottom: calc(-0.08rem - 0.02rem); + right: 28%; + background: #9966cc; +`,iN=f(oa)` + top: calc(-0.08rem - 0.01rem); + right: 10%; + background: #767ee5; +`,oN=f(oa)` + bottom: calc(-0.08rem - 0.01rem); + left: 8%; + background: #9966cc; +`,sN=f(oa)` + top: calc(-0.08rem - 0.02rem); + left: 10%; + background: #767ee5; +`,aN=f(oa)` + bottom: calc(-0.08rem - 0.01rem); + right: -2%; + background: #767ee5; +`,lN=f.div` + position: relative; + bottom: 0.32rem; + left: 30%; + align-self: center; + display: flex; + flex-direction: column; + align-items: center; +`,Yw=f.div` + width: 0.16rem; + height: 0.16rem; + background: #d9dbef; + border-radius: 50%; +`,cN=f.div` + margin-block: 0.18rem; + width: 0.22rem; + height: 0.22rem; + background: #7680dd; + border-radius: 50%; +`,Wg=()=>{const e=St();return l.jsx(EI,{children:l.jsxs(jI,{children:[l.jsx(TI,{children:"开源产品"}),l.jsxs(RI,{id:"datenlord",children:[l.jsxs(OI,{children:[l.jsx(II,{src:SI}),l.jsx(NI,{children:"DatenLord 高性能分布式存储"}),l.jsx(VI,{children:"DatenLord 是开源高性能分布式存储平台,帮助企业实现在 AI + Cloud 场景下的高效数据访问需求。该平台为用户提供了丰富的系统结构,包括 Posix 文件接口, KV接口和面向对象存储接口等,用户可以根据需求选择适合自己的方式。DatenLord 使用了软硬件融合的方式,充分发挥软硬件的性能潜力,实现了极致的数据传输和读写性能。"}),l.jsx(wn,{style:{width:"max-content",color:"#fff"},onClick:()=>window.location.href="https://github.com/datenlord/datenlord",children:"了解更多"})]}),l.jsxs(Qh,{children:[l.jsx(QI,{}),l.jsx(JI,{}),l.jsx(Nw,{}),l.jsx(Vw,{}),l.jsx(rN,{}),l.jsx(nN,{})]})]}),l.jsxs(AI,{id:"xline",children:[l.jsxs(LI,{children:[l.jsx(HI,{src:bI}),l.jsxs(FI,{children:[l.jsx(YI,{children:"Xline 开源分布式KV存储系统"}),l.jsx(zI,{children:"保证数据在跨数据中心,跨云访问时的一致性, 方便业务系统实现多地多中心多活部署。"}),l.jsx(wn,{style:{width:"max-content",color:"#fff"},onClick:()=>window.location.href="https://xline.cloud/",children:"了解更多"})]}),l.jsxs(lN,{children:[l.jsx(Yw,{}),l.jsx(cN,{}),l.jsx(Yw,{})]})]}),l.jsxs(Qh,{children:[l.jsx(qI,{}),l.jsx(eN,{}),l.jsx(XI,{}),l.jsx(KI,{}),l.jsx(iN,{}),l.jsx(oN,{}),l.jsx(UI,{src:Lw}),l.jsx($I,{src:Lw})]})]}),l.jsxs(PI,{id:"rdma",children:[l.jsxs(MI,{children:[l.jsx(BI,{children:"RDMA 高性能网络"}),l.jsx(WI,{children:"跨云场景下,网络对数据访问的性能影响最为突出,DatenLord采用高性能网络RDMA来降低延迟并提高带宽。RDMA方面我们有多个相关的开源项目:"}),l.jsxs(GI,{children:[l.jsx(Mw,{as:"li",children:"async-rdma"}),l.jsx(Iw,{children:"是用Rust封装的RDMA异步API库,它为编写RDMA应用程序提供高级抽象和异步API接口。"}),l.jsx(Mw,{as:"li",children:"open-rdma"}),l.jsx(Iw,{children:"是RDMA协议的开源硬件实现,采用Bluespec和SpinalHDL实现,目前主要实现了RoCEv2协议,此外,我们还进行一些特定功能的拓展来提升RDMA的传输效率。"})]}),l.jsx(wn,{style:{width:"max-content",color:"#fff"},onClick:()=>{e("/rdma")},children:"了解更多"})]}),l.jsxs(Qh,{children:[l.jsx(ZI,{}),l.jsx(tN,{}),l.jsx(Nw,{}),l.jsx(Vw,{}),l.jsx(sN,{}),l.jsx(aN,{})]})]})]})})},Yb="/zh-cn/assets/icon-cpu-f816a729.svg",zb="/zh-cn/assets/icon-inbox-c658ae9a.svg",{Heading:uN,Paragraph:dN}=Ye,{CNHead4:Hb}=uN,{CNBodyLarge:fN,CNMarkSmall:hN}=dN,mN=f.section` + background: #fff; +`,pN=f.div` + max-width: 1440px; + margin-inline: auto; + padding-inline: 1.87rem; + padding-top: 1rem; + padding-bottom: 1.4rem; +`,gN=f(Hb)` + text-align: center; + padding-bottom: 1.6rem; +`,vN=f.div` + display: flex; + justify-content: space-between; +`,yN=f.div` + display: flex; + flex-direction: column; + align-items: center; + width: 48%; + color: ${e=>e.theme.themeDark02}; + background: #f7f7f9; + border-radius: 0.18rem; + padding-top: 0; + padding-bottom: 0.48rem; + padding-inline: 0.32rem; + + &:hover { + background: #fff; + border: 0.01rem solid ${e=>e.theme.secondary01} + } + +`,wN=f(hN)` + color: ${e=>e.theme.secondary01}; +`,_N=f(Hb)` + width: 90%; + color: #000; + text-align: center; + margin-bottom: 0.65rem; + padding-bottom: 0.12rem; + border-bottom: 0.01rem solid ${e=>e.theme.secondary02}; + cursor: pointer; +`,xN=f.div` + position: relative; + top: -0.6rem; + display: flex; + justify-content: center; + align-items: center; + margin-bottom: -0.36rem; + width: 1.56rem; + height: 1.56rem; +`,SN=f.div` + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +`,yf=f.div` + background: ${e=>e.bg}; + position: absolute; + border-radius: 50%; + animation: opac 4s infinite; +`,bN=f(yf)` + animation-delay: 1s; +`,kN=f(yf)` + animation-delay: 2s; +`,CN=f(yf)` + animation-delay: 3s; +`,DN=f.div` + z-index: 1; + display: flex; + justify-content: center; + align-items: center; + width: 0.9rem; + height: 0.9rem; + background: ${e=>e.bg}; + border-radius: 50%; +`,EN=f.img` + width: 90%; + height: 90%; +`,jN=f.ul` + padding-left: 0.18rem; +`,TN=f(fN)``,RN=f.div` + width: 100%; + text-align: center; + font-size: 0.18rem; + color: #9966CC; + border: 1px solid #9966CC; + border-radius: 0.16rem; + padding-block: 0.04rem; + margin-top: 0.18rem; +`,AN=[{key:"hardware-design-learning-community",icon:zb,iconBg:"#7680DD",label_en:"Hardware Design Learning Community",label_zh:"硬件设计学习社区",url:"/mit",content:[{key:"first",label:"理解数字芯片设计的精髓,提升设计能力,是能否胜任数字芯片设计工作的关键。"},{key:"second",label:"系统学习计算机体系结构相关知识,为将来走上数字芯片设计岗位打下坚实的基础。"},{key:"third",label:"学习社区的课程考核以Lab实践的完成度作为标准,要求所有Lab和Project实现既定功能并通过仿真验证。"},{key:"forth",label:"通过动手项目来验证学习的成果,培养出兼具理论和实操能力的数字芯片设计人才。"}]},{key:"open-source-diploma-internship",icon:Yb,iconBg:"#FDCB6E",label_en:"Open Source Project Internship",label_zh:"开源毕业设计",url:"",content:[{key:"first",label:"体验透明开源和知识共享带来的乐趣,并在社区的反馈中获得技术成长。"},{key:"second",label:"弥合学校和工业界实践的脱节和差距,系统梳理学校的知识结构,并运用到具有影响力的时间项目中。"},{key:"third",label:"手把手获得行业内专家、教授、学者的点评以及前沿科研项目的合作机会。"},{key:"forth",label:"在硬核的开源技术社区自我展示的机会是同学升学以及就业最佳、最强有力的背书。"}]}],PN=()=>{const e=St();return l.jsx(mN,{children:l.jsxs(pN,{children:[l.jsx(gN,{children:"学习社区"}),l.jsx(vN,{children:AN.map(({key:t,icon:r,iconBg:n,label_en:i,label_zh:o,url:a,content:c})=>l.jsxs(yN,{children:[l.jsxs(xN,{children:[l.jsx(DN,{bg:n,children:l.jsx(EN,{src:r})}),l.jsxs(SN,{children:[l.jsx(yf,{bg:n}),l.jsx(bN,{bg:n}),l.jsx(kN,{bg:n}),l.jsx(CN,{bg:n})]})]}),l.jsx(wN,{children:i}),l.jsx(_N,{children:o}),l.jsx(jN,{children:c.map(({key:d,label:h})=>l.jsx(TN,{as:"li",children:h},d))}),a&&l.jsx(RN,{onClick:()=>e("/mit",{replace:!0}),children:"了解详情"})]},t))})]})})},ON="/zh-cn/assets/bg-explore-0e46a645.png",LN="/zh-cn/assets/icon-arrow-right-black-87133825.svg",MN="/zh-cn/assets/icon-arrow-right-white-84c4ff12.svg",{Heading:IN}=Ye,{CNHead4:Fb}=IN,NN=[{key:"first",content:"我们致力于探索前沿科技,拥抱创新与改变,并做持续的技术分享与思考。",url:"/tech-talk"},{key:"second",content:"我们一直深耕科学前沿技术的研究和软硬件融合创新的实践,并对外持续输出我们的创新观察。",url:"/blogs"}],VN=f.section` + background: ${e=>e.theme.themeDark}; + background-image: url(${ON}); + background-size: cover; +`,YN=f.div` + max-width: 1440px; + margin-inline: auto; + padding-top: 1rem; + padding-bottom: 1.33rem; + padding-inline: 2.28rem; +`,zN=f(Fb)` + padding-bottom: 1.67rem; + color: ${e=>e.theme.secondary02}; + text-align: center; +`,HN=f.div` + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 0.1rem; + padding-block: 0.34rem; + padding-inline: 0.38rem; + border: 0.015rem solid transparent; + border-image: linear-gradient(90deg, transparent, transparent) 1; + transition: all 0.5s; + &:hover { + background: #07070850; + border: 0.015rem solid transparent; + border-image: linear-gradient(90deg, #ffffff, #ffffff00) 1; + clip-path: inset(0 round 0.14rem); + } + &:last-child { + margin-bottom: 0; + } +`,FN=f(Fb)` + max-width: 80%; + color: #fff; +`,Ub=f.div` + display: flex; + justify-content: center; + align-items: center; + width: 0.6rem; + height: 0.6rem; + background: #fff; + border-radius: 50%; + cursor: pointer; +`,UN=f(Ub)` + background: ${e=>e.theme.secondary08}; +`,zw=f.img` + width: 0.42rem; + height: 0.42rem; +`,$N=({item:e})=>{const t=St(),[r,n]=N.useState(!1),i=o=>{t(o)};return l.jsxs(HN,{onMouseEnter:()=>n(!0),onMouseLeave:()=>n(!1),children:[l.jsx(FN,{children:e.content}),r?l.jsx(UN,{onClick:()=>i(e.url),children:l.jsx(zw,{src:MN})}):l.jsx(Ub,{onClick:()=>i(e.url),children:l.jsx(zw,{src:LN})})]})},BN=()=>l.jsx(VN,{children:l.jsxs(YN,{children:[l.jsx(zN,{children:"前沿探索"}),NN.map(e=>l.jsx($N,{item:e},e.key))]})}),{Heading:WN,Paragraph:GN}=Ye,{Heading6:XN}=WN,{CNBodyMedium:KN}=GN,QN=[{key:"distributed-storage",title:"高性能 AI+Cloud 基础设施提供商",description:"通过软硬件深度融合的方式,提供高性能存储和高性能网络,为 AI+Cloud 应用提供弹性、便利、经济的基础设施服务",url:""},{key:"data-access",title:"高性能跨云分布式存储",description:"建立一个统一的存储访问层,为跨云的应用提供高性能和高安全性的存储支持,从而打破跨云之间的隔阂",url:""},{key:"hardware-acceleration",title:"RDMA 高性能网络",description:"采用软硬件深度融合的方式,实现高性能RDMA网络",url:""},{key:"open-source",title:"相信开源的力量",description:"吸引分布式系统、Linux内核、开源硬件等相关的,来自开源社区的全球人才。 ",url:""}],qN=f.div` + margin-top: -72px; +`,ZN=f.section` + background: ${e=>e.theme.secondary02}; +`,JN=f.div` + display: flex; + justify-content: space-between; + align-items: center; + max-width: 1440px; + margin-inline: auto; + padding-top: 0.64rem; + padding-bottom: 0.56rem; + padding-inline: 1.4rem; +`,e6=f(XN)` + width: 50%; +`,t6=f.div` + margin-right: 0.18rem; + padding: 0.01rem; + border-radius: 50vh; + background: linear-gradient(90deg, #767ee5, #9966cc); + cursor: pointer; +`,r6=f(KN)` + padding: 0.12rem 0.34rem; + border-radius: 50vh; + background: ${e=>e.theme.secondary02}; + color: ${e=>e.theme.themeDark}; +`,n6=f.div` + display: flex; + align-items: center; +`,i6=()=>{const e=St();return l.jsx(ZN,{children:l.jsxs(JN,{children:[l.jsx(e6,{children:"通过软硬件深度融合的方式,提供高性能存储和高性能网络,满足不同行业客户对高性能 AI+Cloud 的需求。"}),l.jsxs(n6,{children:[l.jsx(t6,{children:l.jsx(r6,{onClick:()=>window.location.href="https://github.com/datenlord",children:"立即体验"})}),l.jsx(wn,{style:{color:"#fff",height:"0.52rem"},onClick:()=>e("company2/contact-us"),children:"联系我们"})]})]})})},o6=()=>(N.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsxs(qN,{children:[l.jsx(hI,{items:QN}),l.jsx(xI,{}),l.jsx(Wg,{}),l.jsx(PN,{}),l.jsx(BN,{}),l.jsx(i6,{})]})),{Heading:s6}=Ye,{CNHead1:a6,CNTitleLarge:l6}=s6,c6=f.section` + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin-top: -0.72rem; + padding-top: 0.72rem; + height: 6.6rem; + background-color: #000; + background-image: url(${e=>e.cover}); + background-size: cover; +`,u6=f(a6)` + color: #fff; +`,d6=f(l6)` + max-width: 10rem; + padding-top: 0.5rem; + font-weight: 400; + color: #fff; + text-align: center; +`,Vr=({cover:e,children:t,subTitle:r})=>l.jsxs(c6,{cover:e,children:[l.jsx(u6,{children:t}),r&&l.jsx(d6,{children:r})]}),f6="/zh-cn/assets/cover-51a016b7.png",Hw=()=>{const{sectionId:e}=bn();return N.useEffect(()=>{const t=document.querySelector(`#${e}`);t?(t==null||t.scrollIntoView(),window.scrollBy(0,-32)):window.scrollTo(0,0)},[e]),l.jsxs(l.Fragment,{children:[l.jsx(Vr,{cover:f6,children:"开源产品"}),l.jsx(Wg,{})]})},h6="/zh-cn/assets/cover-2bac0ff4.png",m6="/zh-cn/assets/image1-6c5a6b4b.png",{Heading:p6,Paragraph:g6}=Ye,{CNHead4:v6,CNHead5S:y6}=p6,{CNBodyLarge:$b}=g6,w6=f.div` + background: #f7f7f9; +`,_6=f.div` + max-width: 1440px; + margin-inline: auto; + padding-top: 1rem; + padding-bottom: 1.49rem; + padding-inline: 1.77rem; +`,x6=f.section` + margin-bottom: 1.2rem; + color: ${e=>e.theme.themeDark}; + &:last-child { + margin-bottom: 0; + } +`,S6=f.div` + display: flex; + align-items: center; + padding-bottom: 0.87rem; +`,Bb=f.div` + flex: 1; + height: 0.01rem; +`,b6=f(Bb)` + background: linear-gradient(90deg, #7b7ce340, #926cd3); +`,k6=f(Bb)` + background: linear-gradient(270deg, #7b7ce340, #926cd3); +`,C6=f(v6)` + padding-inline: 0.24rem; +`,D6=f(y6)``,E6=f($b)` + padding-bottom: 0.39rem; +`,j6=f.ul` + padding-left: 0.24rem; + padding-bottom: 0.39rem; +`,T6=f($b)``,R6=f.img` + padding-left: 0.58rem; + padding-bottom: 0.58rem; + width: 4.18rem; + float: right; +`,A6=[{key:"Async-RDMA",title:"Async-RDMA",subTitle:"Async-RDMA是一个框架,为编写远程Remote Direct Memory Access(RDMA)应用程序提供高级抽象和异步API。",main:[{key:1,type:"text",content:"RDMA可以实现从一台机器到另一台机器对内存的直接访问。这可以提高需要低延迟和高吞吐量的应用程序的性能。RDMA支持内核旁路和零拷贝,无需CPU的参与。"},{key:2,type:"text",content:"然而,用低级别的C语言库编写RDMA应用程序往往很困难,而且容易出错。为了让事情变得更简单,我们开发了Async-RDMA,它提供了易于使用的API,隐藏了底层RDMA操作的复杂性。有了Async-RDMA,大多数RDMA操作只需一行代码就能完成。它提供了以下几点主要的功能:"},{key:3,type:"list",items:[{key:1,text:"作为与RDMA端点建立连接的工具。"},{key:2,text:"作为在端点之间传输数据的高级异步API。"},{key:3,text:"作为管理RDMA内存区域的高级API。"},{key:4,text:"作为一个在幕后工作的框架来管理内存区域并异步执行RDMA请求。"}]}],url:"https://github.com/datenlord/async-rdma"},{key:"Open-RDMA",title:"Open-RDMA",subTitle:"Open-RDMA 是一个开源的、基于 RoCE v2 协议扩展优化的软硬件实现套件",main:[{key:1,type:"text",content:"RoCE v2(RDMA over Converged Ethernet version 2)是一个网络协议来在以太网上实现远程直接内存访问(RDMA)。它是对于原始RoCE标准的改进,为在以太网上执行RDMA提供了一种更有效且可扩展的方式。"},{key:2,type:"text",content:"Open-RDMA 套件的核心部分是基于 RoCE v2 协议进行再次扩展优化后的软硬件实现,充分发挥软硬件协同设计开发的优势,通过硬件加速实现高吞吐低延迟,通过软件用户态协议栈实现集中管理且高度可配置的传输策略,从而实现在不同网络环境下都可以发挥极致性能。项目采用 Bluespec SystemVerilog、C 和 Rust 来实现硬件及软件逻辑,从而确保开源项目的正确性和可维护性。"},{key:3,type:"text",content:"在测试及验证方面,我们积极采用开源验证工具,同时也开发了自己的验证工具。Open-RDMA 套件通过 Bluesim、Cocotb 工具来进行RTL级别的验证,通过自研的 RoCE-Sim 工具进行协议数据包级别的验证,通过 Distro-Sim 工具进行软硬件联合仿真验证和调试。"},{key:4,type:"text",content:"目前,我们已经实现了整个开源套件的基本框架,并正在逐步加入更多功能。"}],url:"https://github.com/datenlord/open-rdma",img:m6}],P6=({item:e})=>{const{title:t,subTitle:r,img:n,main:i,url:o}=e;return l.jsxs(x6,{children:[l.jsxs(S6,{children:[l.jsx(b6,{}),l.jsx(C6,{children:t}),l.jsx(k6,{})]}),l.jsx(D6,{style:{paddingBottom:"0.41rem",color:"#000"},children:r}),n&&l.jsx(R6,{src:n}),i.map(({key:a,type:c,content:d,items:h})=>c==="text"?l.jsx(E6,{children:d},a):c==="list"?l.jsx(j6,{children:h==null?void 0:h.map(({key:g,text:v})=>l.jsx(T6,{as:"li",children:v},g))},a):null),l.jsx(wn,{style:{color:"#fff",display:"block"},onClick:()=>{window.location.href=`${o}`},children:"了解更多"})]})},O6=()=>(N.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsxs(l.Fragment,{children:[l.jsx(Vr,{cover:h6,children:"RDMA"}),l.jsx(w6,{children:l.jsx(_6,{children:A6.map(e=>l.jsx(P6,{item:e},e.key))})})]})),L6="/zh-cn/assets/cover-4e87a707.png",M6="/zh-cn/assets/image-4f8ee5fd.png",I6="data:image/png;base64,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",N6="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAABACAYAAABFqxrgAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATiSURBVHgB7ZrfTyNVFMe/Z2a6cdVod6NPPjD7akzsQDRRo3affaBxIeFtC4LhbctfAPwF4BuxzdJNfFhDWetfQHky0cXiu8okJvgmNdFgls5cz51CGWBK57altOR+kmbm/pi53C/33nPm3gNoNBrNKRSnUiZbTVpWPRVVViq8V8GQY8WplDCQEWStR5VNzlWdjbyziyEmlgjC8G3AkONmmepwG3kiDaKHQiCJISeWCE18VDYeOxV5OzlThTDxEDcAA5rLR8Lk3I8pISgpyBhprKB+amL2p8Yd+SkKNGzk1euWWy46LrokM/+DnfDMpGyXSNQ28u9f+XrT0jpMfFldhMASVBD+QqkwtgpFGtYHj4iQFYB98b2o+L7/5NnjsSKugNbTQSADRXjEvAtFJmZ3cizAHv87liIFkBDShmmsP5ir7rFgNnrMJSKIO7hi2Lyug4wV7mQsC8PD1jYT2OLnUughsazDxx+9gU8+fDOybP0bF/t/HkIVnm4rbF6zZ3PFNnlUPLqFSvDH1WEL8jMGGeNc15Z5UggeMVs8IpxerEFBO3Eq3X7JxJ07t6LLbptQhc1rljuVO0kLgks+pkuF0cq5qi7/KlPz1dUjz8/xQvzoOD9pJfAdXx30gOsxkSYWQ6maZ+B+qdDwP6J4uua4m/mxnID/VSg79fnMThY9oO8iPPjieSa8APrwF8pr8Ya1d2QssQVp1jUMoyfOWt9FIDKaVkdOg2f5+GaP14Ca8EOjga2GNK/okv5PB6KR5q0vfoEilmWUw2nT9NLokv6LIMS9UELZG3x6bupIzxJdor8doEUI0CIgprP0/OcD/Lb3b2TZ/r66tzhoxBLhr4MXwe+m0no6EDr4jvf/xhDSciRYJuXYX3cRMkFENM6XIC0dHfhiu1lmkOu9bCjvJQwCLUU4tse5cN7EXHWLL+kgwRsdm4XRadwAtHWAFiFAiwAtQoAWAVqEAC0CtAgBageyfebkGPCyOrzPOMLHgOnz+SpxEwMrwsRslXeXsdI2jITkUeHFbrB3u1vKO7G25Ad3OhDG0R0pebgbp6JeEzDga8IJ77z9GsY/e6ttvV9//wffbv4BVYZCBHnU1+oYMMzdu+3rRKGnA7QIAYoiiOb2GXUav0D0eihVwwCgJIKAcJsJok+hyHFwRdP5ESL0vmtESQQSZ84Bk+zQpKEAd/rMdp3nmZU4zx0e+jiovWj7k/U6IVZYbxj2xA5wstkKuN4RZMRI22E9la3a9QT2TtL8bHEz70xf0s7pfmaH1M3/7pXXPnDb1VNfGAnLp7ewrUQQOmNf9shktpryuF44zzNP33PdKItQ+tqR2+qVUFZKBlPJqJHzsQIyzVNmUVjYOhOZJrDcNjCD8D26QB4JxBkFjaY6YGq+ans+d0xEhtztcidrREGA1cVygSelgpNFDORCGsROG34awliUcZL8f4s+FKJgpMm2F7jt2tErLMKqE8v6dCSCRApR9yAj39Nxn5ExRzL2CIoEgV4mtyVaxzbxGsLGS2yXCqNpKNKxsyQPZ/hT9T6rOB2OI4qGT6q4A50I0A+6/nbYyDtFvhQb5tJP8Vy0g6M7EjUScOuWUS6vjbroATKmcXJmx44sQ+f07APqeJhWcIXIOEahHjYZ471DQhzHrP4qduMuhhqNRqPRaDRx+B8VV8ixBtVqHgAAAABJRU5ErkJggg==",V6="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAABACAYAAABFqxrgAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARySURBVHgB7Zo/b9tGGMafO1KGMtXO0qZdNHQqOshpUKBT6KLIGrWRgWxRXLtIp7qfoP4EjdOlRpwiDLoUiIOqn8DK1CF1mKFAgQKBNblbrAIBIjjkXd6zJJuyRYqk+U8Kf4BMUryzyId879577oCCgoKCgiFYkEK1hjWr63YVKcOY7Dzc/PQZEmasCIsNqyp1bFPJWWSBxPrWvfnvkSB8bIkSfs9MAAXD6ldLOw0kiK8I129ZFQlUkDFM45eRIHqo0hIL9Gq2kAL1FWubNgZSYHw4BIQaz4r6YAKJRYRr31g39BJ2tRJ+wARyZhGUAEzCpN0O/bM7mEDOJIJbAOprFx5uzifepydBZBGmRQBFJBGmSQBFaBFUCj1NAihCi9A059XN35wWARThkqU+dPMmpojYkqVJphABhQiHRGoTglJffmJA8CpJHXooTg2vGsEO9qv15Z21QBUFOrbgTWrA2whIYiLQKNCiTRUaIiGHD6tgPJizRb+na7hNuUzj0d35B0GqJBIOi0tWA+rCM4RymfWgZUO9CUKISu3Wn5Vx5aQjawPnrlzWcK6cTtPzqivQ7TqDw1l1rc2Nz9rj6oUSgWv8PnfKYarggwtlfLvyIdLg+e5L/Lz5HGHxfUTOQbLOjnpqf//zP7LGVwSp4QYSYn//AD/+9C/MX9vY7xwgSzzD4TpZZbbL45MQd5jkTQSByVX6c9XrtBJAvbYv6OavfP4u5mZnkCWeIti6qLlfFEfj682NYH1vfflpw2tG46QAV754D1njKQJj/LujvlrKx82Ni+3B4eKKtRvFis+jAIqRItBNVt03KZg03eelFA8kWAUecM4uSzksUl4FUIwUQUqKaXb8PovXw23B1r1P1uADhYNJ9Svu7548fZFLARQjRWCMnmR/n7amMlJwRi5dPI/3L5zDxx+9g7xxSoRrX/9Vc4cCpZ+B8u9xnJ+bOfzkkVMi0FswnPMzbNNgCNPMiGSJt/CWcUqEwwnXmEJgUhjZMJIQjfqyZTIRbVq+n24bmBA8k6WzTMFTF2m4u9i8U3iMSNhjVCijQ43z02Bvr4soJC7C3n+vIhkdaZJIOKiMEzlAt2dqQcrFLsLJjDNb+NUgpWIPBxqCH6kvGdoOxwJSRLcFeRm8t2yIwQhitsYqgpq2px8+tuQkWm4jJohTHYluuTMY5NE1rOuutVMUEg3arPlVj1WEEkfNPWniXsNUX9pZhcNvIwlKUALMqV0lBo11Wugna5Jx9VDW/KrHKoLbmFWhsHX3eP2CPsObrx1RoROxr45lYMPrJKT4g0LC6J1DhbJfwy/5i02Ek8YsE2JoJdtvvbBYRQrYNjf7IXEouGTKL0XLq3xsvUPPmHUfB3SmE6DXPsjHg2MG7jt1EFuCfzQB2+OZrXW/RIaUDsoGhef9oy98liTH2Sa4zZiq7pR3kSHy1Gy4MOAREnEmSy3kGDKPPReZxSaCruEmjZ7byCNkEj365ZJnGxX7oF91R8gR9GA607LUsKCgoKCgIGXeAELkjKtKm1m6AAAAAElFTkSuQmCC",Y6="data:image/png;base64,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",z6="data:image/png;base64,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",{Heading:H6}=Ye,{CNHead4:F6}=H6,Fw=f.div` + background: #fff; +`,Uw=f.div` + max-width: 1440px; + margin-inline: auto; + padding-top: 1rem; + padding-bottom: 1.49rem; + padding-inline: 1.77rem; +`,U6=f.div` + display: flex; + align-items: center; + padding-bottom: 0.87rem; +`,Wb=f.div` + flex: 1; + height: 0.01rem; +`,$6=f(Wb)` + background: linear-gradient(90deg, #7b7ce340, #926cd3); +`,B6=f(Wb)` + background: linear-gradient(270deg, #7b7ce340, #926cd3); +`,W6=f(F6)` + font-size: 0.36rem; + color: #7680DD; + padding-inline: 0.24rem; +`,G6=f.img` + width: 100%; +`,$w=f.div` + display: flex; + gap: 0.42rem; + margin-bottom: 0.42rem; +`,qh=f.div` + display: flex; + flex-direction: column; + padding: 0.24rem 0.36rem; + padding-bottom: 0.84rem; + border-radius: 0.1rem; + background: #fff; + `,Bw=f.div` + display: flex; + padding: 0.24rem 0.36rem; + border-radius: 0.1rem; + background: #fff; + `,Aa=f.img` + width: 0.56rem; + height: 0.56rem; + margin-bottom: 0.28rem; + `,Ww=f.div` + display: flex; + flex-direction: column; + margin-left: 0.24rem; +`,Pa=f.div` + font-size: 0.18rem; + line-height: 0.24rem; + font-weight: 600; + color: #333333; + margin-bottom: 0.12rem; +`,Oa=f.div` + font-size: 0.14rem; + line-height: 0.24rem; + font-weight: 400; + color: #999999; +`,X6=()=>(N.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsxs(l.Fragment,{children:[l.jsx(Vr,{cover:L6,children:"DatenLord Cloud Service"}),l.jsx(Fw,{children:l.jsx(Uw,{children:l.jsx(G6,{src:M6})})}),l.jsx(Fw,{style:{background:"#F7F7F9"},children:l.jsxs(Uw,{children:[l.jsxs(U6,{children:[l.jsx($6,{}),l.jsx(W6,{children:"DatenLord 技术创新点"}),l.jsx(B6,{})]}),l.jsxs($w,{children:[l.jsxs(qh,{children:[l.jsx(Aa,{src:I6}),l.jsx(Pa,{children:"全新自研架构,实现内核旁路"}),l.jsx(Oa,{children:"发挥出新一代存储硬件的高性能。"})]}),l.jsxs(qh,{children:[l.jsx(Aa,{src:N6}),l.jsx(Pa,{children:"统一命名空间"}),l.jsx(Oa,{children:"实现数据对多个存储接口的互通,满足不同场景需求。"})]}),l.jsxs(qh,{children:[l.jsx(Aa,{src:V6}),l.jsx(Pa,{children:"数据的自动化管理"}),l.jsx(Oa,{children:"自动化实现数据迁移、备份,并对应用程序透明。"})]})]}),l.jsxs($w,{children:[l.jsxs(Bw,{children:[l.jsx(Aa,{src:Y6}),l.jsxs(Ww,{children:[l.jsx(Pa,{children:"支持多种自主体系架构"}),l.jsx(Oa,{children:"能够适配更多样性的芯片架构,满足用户的多种需求。"})]})]}),l.jsxs(Bw,{children:[l.jsx(Aa,{src:z6}),l.jsxs(Ww,{children:[l.jsx(Pa,{children:"利用硬件加速存储相关的计算密集型任务"}),l.jsx(Oa,{children:"诸如数据加密解密、数据压缩解压缩、音视频编解码、模式识别等场景,有力提升数据存储和处理的性能。"})]})]})]})]})})]})),K6="/zh-cn/assets/cover-b2ab63b7.png",Q6="/zh-cn/assets/sect1-66de51dd.png",q6="/zh-cn/assets/sect2-070b2110.png",Z6="/zh-cn/assets/sect3-fc90d06f.png",J6="/zh-cn/assets/sect4-35a84b18.png",e5=f.div` + background: #fff; +`,t5=f.div` + max-width: 1440px; + margin-inline: auto; + padding-top: 1rem; + padding-bottom: 1.49rem; + padding-inline: 1.77rem; +`,Vc=f.img` + width: 100%; +`;f.div` + display: flex; + align-items: end; + gap: 0.24rem; +`;f.div` + font-size: 0.58rem; + font-weight: 600; + color: #7680dd; +`;f.div` + font-size: 0.32rem; + font-weight: 600; + line-height: 2; +`;const r5=()=>(N.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsxs(l.Fragment,{children:[l.jsx(Vr,{cover:K6,children:"DatenLord Appliance"}),l.jsx(e5,{children:l.jsxs(t5,{children:[l.jsx(Vc,{src:Q6}),l.jsx(Vc,{src:q6,style:{marginBottom:"0.82rem"}}),l.jsx(Vc,{src:Z6,style:{marginBottom:"0.64rem"}}),l.jsx(Vc,{src:J6})]})})]})),n5="/zh-cn/assets/cover-e1b3c9e5.png",i5="/zh-cn/assets/image-4b1d6d29.png",o5="/zh-cn/assets/image1-5e136811.jpeg",{Heading:s5,Paragraph:UQ}=Ye,{CNHead4:Gg,Heading2:a5}=s5,l5=f.main` + background: #EDEDF6; +`,c5=f.div` + max-width: 1440px; + margin-inline: auto; + padding-top: 1rem; + padding-bottom: 1.57rem; + padding-inline: 1.22rem; +`,u5=f(Gg)` + text-align: center; + padding-bottom: 0.58rem; +`,d5=f.section` + display: flex; + flex-direction: column; + align-items: center; + padding-block: 0.48rem; + color: ${e=>e.theme.secondary02}; + background: linear-gradient(90deg, #767ee5, #9966cc); +`,f5=f(a5)` + padding-bottom: 0.06rem; +`,h5=f(Gg)` + padding-bottom: 0.4rem; +`,m5=f.img` + display: block; + width: 5.36rem; + margin-inline: auto; + margin-bottom: 0.58rem; +`,Xg=f.div` + background: #fff; + border-radius: 0.24rem; + min-height: 400px; + overflow: hidden; + box-shadow: 0.1rem 0.1rem 1rem 0.06rem rgba(0, 0, 0, 0.08); + margin-bottom: 0.72rem; + &:last-child { + margin-bottom: 0; + } +`,Kg=f.div` + display: flex; + align-items: center; + background: ${e=>e.theme.secondary01}; + min-height: 50px; + width: 100%; + padding: 0.24rem 0.48rem; +`,Qg=f(Gg)` + color: ${e=>e.theme.white00}; + padding-inline: 0.96rem; +`,Gb=f.div` + flex: 1; + height: 0.02rem; +`,qg=f(Gb)` + background: linear-gradient(270deg, #fff, #7B7CE340); +`,Zg=f(Gb)` + background: linear-gradient(90deg, #fff, #7B7CE340); +`,Jg=f.div` + padding: 0.24rem 0.64rem; + padding-bottom: 0.84rem; +`,Xb=f.div` + font-size: 0.16rem; + padding: 0.12rem 0.36rem; + background: #D9DBEF; + text-align: center; + border-radius: 0.04rem; + margin-inline: -0.36rem; + margin-bottom: 0.36rem; +`,ev=f.div` + display: flex; + justify-content: space-between; + flex-wrap: wrap; + gap: 0.52rem; +`,Hi=f.div` + +`,Fi=f.div` + font-size: 0.24rem; + font-weight: 600; + padding-bottom: 0.36rem; +`,Tl=f.div` + font-size: 0.2rem; + font-weight: 600; + padding-bottom: 0.2rem; +`,tv=f(Tl)` + color: #8475DC; +`,Qt=f.div` + font-size: 0.14rem; + color: #42424A; + line-height: 0.26rem; + padding-bottom: 0.04rem; +`,qs=f(Qt)` + border-left: 0.08rem solid #767EE5; + padding-left: 0.16rem; +`,sd=f(Qt)` + +`,p5=f.img` + display: block; + width: 70%; + margin-inline: auto; + margin-top: 0.36rem; +`,g5=()=>l.jsxs(Xg,{style:{background:"#EDEDF6"},id:"ai",children:[l.jsxs(Kg,{children:[l.jsx(qg,{}),l.jsx(Qg,{children:"AI 推理"}),l.jsx(Zg,{})]}),l.jsxs(Jg,{children:[l.jsx(Xb,{children:"用云计算的方式整合GPU算力,解决AI算力资源昂贵和分散的问题。用存储和网络来改善用户使用的体验,实现秒级启动、恢复"}),l.jsxs(ev,{children:[l.jsxs(Hi,{style:{width:"46%"},children:[l.jsx(Fi,{children:"问题"}),l.jsx(tv,{children:"GPU 算力供不应求,供需极度不平衡"}),l.jsx(Qt,{children:"AI 大模型对高性能 GPU 算力资源需求大爆发。GPU 算力供不应求,供需极度不平衡。这进一步推高了原本因设计和制造成本以及市场垄断等因素就已经高企不下的 GPU 算力价格。GPU 算力资源优先满足 AI 训练场景,这造成 AI 推断场景的 GPU 算力资源具有分散或碎片化的特点。"})]}),l.jsxs(Hi,{style:{width:"46%"},children:[l.jsx(Fi,{children:"解决方案"}),l.jsx(qs,{style:{marginBottom:"0.36rem"},children:"优化缓存技术,实现数据预加载、异步持久化,进而提升数据访问的性能"}),l.jsx(qs,{children:"高性能网络 RDMA 实现多节点内存共享,加速大模型的分发、加载"})]}),l.jsxs(Hi,{style:{width:"100%"},children:[l.jsx(Fi,{children:"案例"}),l.jsx(Tl,{children:"客户的需求和问题是什么?"}),l.jsx(sd,{children:"· 客户是一家主营海外直播卖货的公司,运用大模型技术进行人工智能主播,实现业务的低成本横向拓展。"}),l.jsx(sd,{style:{paddingBottom:"0.3rem"},children:"· 该客户计划对直播场景进行大模型定制,形成自主可控的“直播场景大模型”。"}),l.jsx(Tl,{children:"客户的需求和问题是什么?"}),l.jsx(Qt,{style:{color:"#7680DD"},children:"DatenLord Cloud Service 通过跨云技术,帮助客户落地“大模型”业务场景"}),l.jsxs(Qt,{children:[l.jsx("b",{children:"高效的数据同步机制"}),"      确保大模型在不同数据中心之间的实时性和一致性。"]}),l.jsxs(Qt,{children:[l.jsx("b",{children:"高效的数据分发机制"}),"      确保大模型能够及时获取和处理最新的数据,提高业务的响应速度。"]}),l.jsxs(Qt,{children:[l.jsx("b",{children:"灵活的管理和调整工具"}),"      使客户能自主控制大模型,根据业务变化灵活调整。"]}),l.jsxs(Qt,{children:[l.jsx("b",{children:"高级的安全措施"}),"      包括数据加密、身份验证等,确保大模型在跨云环境中的安全运行。"]}),l.jsx(p5,{src:o5})]})]})]})]}),v5=()=>l.jsxs(Xg,{id:"networks",style:{background:"#EDEDF6"},children:[l.jsxs(Kg,{children:[l.jsx(qg,{}),l.jsx(Qg,{children:"高性能网络"}),l.jsx(Zg,{})]}),l.jsx(Jg,{children:l.jsxs(ev,{children:[l.jsxs(Hi,{style:{width:"46%"},children:[l.jsx(Fi,{children:"问题"}),l.jsx(tv,{children:"大模型时代对高性能网络的能力诉求不断提高"}),l.jsx(Qt,{children:"随着大模型时代的到来,无论是模型训练环节中训练数据与 Checkpoint 的传输迁移,还是推理过程中多个模型之间的动态调度加载,都希望能够极限压榨网络以及总线上每一比特的带宽,从而换取更短的训练时间以及更小的请求响应延迟。随着训练推理集群规模的扩大以及业务复杂度的增加,网络中偶发的拥塞或故障不可避免,此外,每次网络拓扑发生变化后对网卡进行重新调参都是一项繁重的工作。能够迅速自主适应网络拓扑变化,并连续提供稳定数据传输能力的高性能网络,已然成为大模型时代必不可少的基础设施。"})]}),l.jsxs(Hi,{style:{width:"46%"},children:[l.jsx(Fi,{children:"解决方案"}),l.jsx(qs,{style:{marginBottom:"0.36rem"},children:"基于经过优化的 RoCE v2 协议以及硬件加速的纠错编码技术,可以在恶劣的网络环境下提供高效的数据恢复以及重传机制。"}),l.jsx(qs,{children:"通过深度的软硬件融合套件,实现全网流量的动态感知,智能决策系统可以针对各种网络环境迅速、自动地调整各节点软硬件参数,保持全网维持最佳吞吐。"})]})]})})]}),y5=()=>l.jsxs(Xg,{id:"storage",children:[l.jsxs(Kg,{children:[l.jsx(qg,{}),l.jsx(Qg,{children:"高性能存储"}),l.jsx(Zg,{})]}),l.jsxs(Jg,{children:[l.jsx(Xb,{children:"统一的高性能跨云数据访问和跨云分布式元数据管理"}),l.jsxs(ev,{children:[l.jsxs(Hi,{style:{width:"46%"},children:[l.jsx(Fi,{children:"问题"}),l.jsx(tv,{children:"云之间的隔阂导致数据隔离和数据碎片化,在跨云访问数据时,访问速度和一致性将会受到影响。"}),l.jsx(Qt,{children:"随着AI应用的快速落地,多云架构成为企业级IT的主流选择。但是,云之间的隔阂导致数据隔离和数据碎片化。由于数据往往被绑定在一个特定的云厂商/数据中心里,无法自由访问。此外,跨云数据访问具有高延迟的特性,然而现有的分布式共识协议只限于在单个数据中心使用。因此,在跨云访问数据时,访问速度和一致性将会受到影响。"})]}),l.jsxs(Hi,{style:{width:"46%"},children:[l.jsx(Fi,{children:"解决方案"}),l.jsx(qs,{style:{marginBottom:"0.36rem"},children:"无论数据存储在哪里,DatenLord 都可以通过缓存来加速跨云的数据访问,并提供统一的数据管理来实现数据的自动迁移和备份。"}),l.jsx(qs,{children:"DatenLord 采用内核旁路架构,实现存储 IO 自行调度管理,以提升性能。再次,低延迟的跨云分布式共识协议保证了广域网场景下的高速和强一致性,同时保证系统中没有单点瓶颈。"})]}),l.jsxs(Hi,{style:{width:"100%"},children:[l.jsx(Fi,{children:"案例"}),l.jsx(Tl,{children:"客户的需求和问题是什么?"}),l.jsx(sd,{children:"· 客户是一家主要做中东、欧洲地区教育、社交和短剧的内容型娱乐公司。"}),l.jsx(sd,{style:{paddingBottom:"0.3rem"},children:"· 客户需要解决多国多数据中心间的数据同步、迁移、备份和自动化管理的问题。"}),l.jsx(Tl,{children:"客户的需求和问题是什么?"}),l.jsx(Qt,{style:{color:"#7680DD"},children:"DatenLord Cloud Service 提供一体化的解决方案,帮助客户有效管理多国多数据中心的复杂性,提高业务的可用性和稳定性"}),l.jsxs(Qt,{children:[l.jsx("b",{children:"多国多数据中心的数据实时同步"}),"      确保大模型在不同数据中心之间的实时性和一致性。"]}),l.jsxs(Qt,{children:[l.jsx("b",{children:"提供高效的数据迁移和备份工具"}),"      确保大模型能够及时获取和处理最新的数据,提高业务的响应速度。"]}),l.jsxs(Qt,{children:[l.jsx("b",{children:"提供自动化的管理工具"}),"      使客户能自主控制大模型,根据业务变化灵活调整。"]}),l.jsxs(Qt,{children:[l.jsx("b",{children:"提供高可用性和弹性伸缩的解决方案"}),"      包括数据加密、身份验证等,确保大模型在跨云环境中的安全运行。"]})]})]})]})]}),Gw=()=>{const e=St(),{sectionId:t}=bn();return N.useEffect(()=>{const r=document.querySelector(`#${t}`);r?(r==null||r.scrollIntoView(),window.scrollBy(0,-32)):window.scrollTo(0,0)},[t]),l.jsxs(l.Fragment,{children:[l.jsx(Vr,{cover:n5,children:"解决方案"}),l.jsxs(l5,{children:[l.jsxs(c5,{children:[l.jsx(u5,{children:"解决方案"}),l.jsx(m5,{src:i5}),l.jsx(g5,{}),l.jsx(y5,{}),l.jsx(v5,{})]}),l.jsxs(d5,{id:"related-resource",children:[l.jsx(f5,{children:"· Related Resources ·"}),l.jsx(h5,{children:"相关资源"}),l.jsx(wn,{style:{background:"#FDCB6E",color:"#fff"},onClick:()=>e("/resources2"),children:"查看资源合集"})]})]})]})},w5="/zh-cn/assets/github-icon-35dda863.svg",_5="/zh-cn/assets/illustration-a72d48ba.png",{Heading:x5,Paragraph:S5}=Ye,{Heading3:b5,CNHead5S:Kb}=x5,{CNBodyLarge:rv,CNBodySmall:k5}=S5,C5=[{key:1,title:"社区—贡献意味着思考和学习",text:"开源不仅仅是在Github上贡献代码。在DatenLord,我们相信:贡献代码(给予)同样是一个思考和学习的过程。在不断收到开源社区反馈的过程中,我们能够构建彼此的信任与合作。我们也想借助于开源的社区平台吸引更多优秀的开发者参与到项目中来。"}],D5=[{key:1,text:"王恒宇是一名主修计算机科学的研究生。基于在软硬件融合方面的学术兴趣,他加入了async-rdma项目。在社区导师的指导下,他也随着项目的发展而逐步成长,并被邀请在一些实践研讨会上分享他使用Rust开发RDMA的实践经验。",quote:"“我在Async-rdma项目中收获了一段难忘的经历。DatenLord社区氛围很友好,我的导师是一位经验丰富的工程师,他鼓励我在验证我对项目的想法和假设的同时也要关注工程规范。这让我的视角从一个只关注实现产品原型的学生转变为一个同时也关注产品的可维护性和稳定性的专业工程师。”",link_text:"GitHub ID: GTwhy",url:"https://github.com/GTwhy"},{key:2,text:"李弘宇热衷于参与开源社区和Rust相关项目,所以参加了DatenLord的特别项目,想为Rust并入Linux内核添砖加瓦。在社区导师的指导下,他在贡献代码、编写文档和回复上游意见的过程中磨练了自己的Rust技能。",quote:"“在DatenLord中参与Rust for Linux项目的工作很有意义。这是一个友好互助的社区。即使在修改一个很小的bug时,我的导师也鼓励我认真权衡不同的选择。教导我不仅仅是要能够写出代码,更重要的是写出优雅的代码。我在社区中收获到的不仅是理论上的,更是极具实操价值的。”",link_text:"GitHub ID: Richardhongyu",url:"https://github.com/Richardhongyu"}],E5=f.section` + padding-bottom: 1.29rem; +`,j5=f.div` + color: ${e=>e.theme.secondary02}; + font-weight: 400; + font-family: Bodoni Bd BT serif; + font-size: 0.67rem; + line-height: 0.804rem; + text-transform: capitalize; +`,T5=f(b5)` + margin-top: -0.22rem; + padding-left: 0.16rem; + padding-bottom: 0.71rem; + font-family: Avenir Next sans-serif; +`,R5=f.div` + height: 4.6rem; + margin-bottom: 0.61rem; +`,A5=f.div` + padding-bottom: 0.56rem; + &:last-child { + padding-bottom: 0; + } +`,P5=f(Kb)``,O5=f(rv)``,L5=f.img` + float: right; + margin-left: 0.33rem; + margin-right: -0.33rem; + margin-bottom: 0.33rem; + width: 4.93rem; +`;f.div` + display: flex; + justify-content: space-between; + align-items: center; + margin-left: 0.64rem; +`;f.img` + width: 0.3rem; + height: 0.3rem; + margin-right: 0.14rem; +`;f.div` + color: ${e=>e.theme.themeDark}; + font-weight: 600; + font-size: 0.255rem; + line-height: 1; + text-transform: capitalize; +`;const M5=f.div` + padding-top: 0.38rem; + padding-bottom: 0.46rem; + padding-inline: 0.63rem; + background: #ffffff78; + border-radius: 0.18rem; +`,I5=f(Kb)``,N5=f.div` + display: flex; + justify-content: space-between; +`,V5=f.div` + width: 47%; +`,Y5=f(rv)` + padding-bottom: 0.26rem; +`,z5=f(k5)` + margin-left: -0.14rem; + margin-bottom: 0.33rem; + padding-inline: 0.11rem; + color: ${e=>e.theme.gray03}; + border-left: 0.02rem solid; + border-image: linear-gradient(to right, #767ee5, #9966cc) 1; +`,H5=f.div` + display: flex; +`,F5=f(rv)` + padding-right: 0.2rem; + color: ${e=>e.theme.secondary01}; + text-decoration-line: underline; +`,U5=f.img` + width: 0.32rem; + height: 0.32rem; +`,$5=()=>l.jsxs(E5,{children:[l.jsx(j5,{children:"Open Source Community"}),l.jsx(T5,{children:"开源社区"}),l.jsxs(R5,{children:[l.jsx(L5,{src:_5}),C5.map(({key:e,title:t,text:r})=>l.jsxs(A5,{children:[l.jsx(P5,{style:{paddingBottom:"0.23rem"},children:t}),l.jsx(O5,{children:r})]},e))]}),l.jsxs(M5,{children:[l.jsx(I5,{style:{paddingBottom:"0.39rem"},children:"社区高光时刻"}),l.jsx(N5,{children:D5.map(({key:e,text:t,quote:r,link_text:n,url:i})=>l.jsxs(V5,{children:[l.jsx(Y5,{children:t}),l.jsx(z5,{children:r}),l.jsxs(H5,{children:[l.jsx(F5,{as:"a",href:i,children:n}),l.jsx(U5,{src:w5})]})]},e))})]})]}),B5="/zh-cn/assets/avatar-783be77c.png",{Heading:W5,Paragraph:G5}=Ye,{Heading3:Qb,CNHead4:X5,CNHead5S:K5,CNHead5:Q5}=W5,{CNBodyLarge:q5,CNMarkSmall:Z5,CNBodyMedium:J5}=G5,e7=[{key:"hardware-design-learning-community",icon:zb,iconBg:"#7680DD",label_en:"Hardware Design Learning Community",label_zh:"硬件设计学习社区",url:"mit",content:[{key:"first",label:"理解数字芯片设计的精髓,提升设计能力,是能否胜任数字芯片设计工作的关键。"},{key:"second",label:"系统学习计算机体系结构相关知识,为将来走上数字芯片设计岗位打下坚实的基础。"},{key:"third",label:"学习社区的课程考核以Lab实践的完成度作为标准,要求所有Lab和Project实现既定功能并通过仿真验证。"},{key:"forth",label:"通过动手项目来验证学习的成果,培养出兼具理论和实操能力的数字芯片设计人才。"}]},{key:"open-source-diploma-internship",icon:Yb,iconBg:"#FDCB6E",label_en:"Open Source Diploma Internship",label_zh:"开源毕业设计",content:[{key:"first",label:"体验透明开源和知识共享带来的乐趣,并在社区的反馈中获得技术成长。"},{key:"second",label:"弥合学校和工业界实践的脱节和差距,系统梳理学校的知识结构,并运用到具有影响力的时间项目中。"},{key:"third",label:"手把手获得行业内专家、教授、学者的点评以及前沿科研项目的合作机会。"},{key:"forth",label:"在硬核的开源技术社区自我展示的机会是同学升学以及就业最佳、最强有力的背书。"}]}],t7=[{key:1,text:"参加开源毕设项目是我人生中一段难忘的经历。在这里,我不仅提升了自己的技能,学会与团队成员协同合作,而且有机会投身于实际项目中,亲身体验如何解决实际问题,感受开源精神的力量,并且深入开源社区,与志同道合的同伴们共同探讨世界上最前沿、最具挑战性的工程问题。"},{key:2,text:"参加开源项目的过程中,我有机会在GitHub上积累宝贵的贡献记录。每一次提交代码、每一个解决的问题都会在我的GitHub主页上清晰地呈现出来,成为我技术实力的有力证明。这不仅有助于建立我的个人品牌,还能让潜在雇主一目了然地了解我的能力和成就。"},{key:3,text:"我还结识了我所热爱的行业的专家,拓展人脉资源,为未来的职业发展创造更多机会。我相信,在我的简历上出现丰富的开源项目经验,必将成为我未来求职过程中的一大亮点。欢迎更多的学生朋友和我一起加入开源毕设项目,让我们共同成长,开启一段精彩的技术之旅!"}],r7=f.section` +`,n7=f.div` + color: ${e=>e.theme.secondary02}; + font-weight: 400; + font-family: Bodoni Bd BT serif; + font-size: 0.67rem; + line-height: 0.804rem; + text-align: right; + text-transform: capitalize; +`,i7=f(Qb)` + margin-top: -0.22rem; + padding-left: 0.16rem; + padding-bottom: 1.4rem; + font-family: Avenir Next sans-serif; + text-align: right; +`,o7=f.div` + padding-bottom: 1rem; + display: flex; + justify-content: space-between; +`,s7=f.div` + display: flex; + flex-direction: column; + align-items: center; + width: 48%; + color: ${e=>e.theme.themeDark02}; + background: #f7f7f9; + border-radius: 0.18rem; + padding-top: 0; + padding-bottom: 0.75rem; + padding-inline: 0.32rem; + + &:hover { + background: #fff; + border: 0.01rem solid ${e=>e.theme.secondary01}; + } +`,a7=f(Z5)` + color: ${e=>e.theme.secondary01}; +`,l7=f(X5)` + width: 90%; + color: #000; + text-align: center; + margin-bottom: 0.65rem; + padding-bottom: 0.12rem; + border-bottom: 0.01rem solid ${e=>e.theme.secondary02}; +`,c7=f.div` + position: relative; + top: -0.6rem; + display: flex; + justify-content: center; + align-items: center; + margin-bottom: -0.36rem; + width: 1.56rem; + height: 1.56rem; +`,u7=f.div` + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +`,wf=f.div` + background: ${e=>e.bg}; + position: absolute; + border-radius: 50%; + animation: opac 4s infinite; +`,d7=f(wf)` + animation-delay: 1s; +`,f7=f(wf)` + animation-delay: 2s; +`,h7=f(wf)` + animation-delay: 3s; +`,m7=f.div` + z-index: 1; + display: flex; + justify-content: center; + align-items: center; + width: 0.9rem; + height: 0.9rem; + background: ${e=>e.bg}; + border-radius: 50%; +`,p7=f.img` + width: 90%; + height: 90%; +`,g7=f.ul` + padding-left: 0.18rem; +`,v7=f(q5)``,y7=f(K5)``,w7=f.div` + display: flex; + align-items: center; +`,_7=f.div` + display: flex; + flex-direction: column; + align-items: center; + padding-right: 0.91rem; +`,x7=f.div``,S7=f.img` + width: 1.8rem; + padding-bottom: 0.22rem; +`,b7=f(Qb)` + padding-bottom: 0.06rem; +`,k7=f(Q5)``,C7=f.ul` + padding-left: 0.3rem; +`,D7=f(J5)` + padding-bottom: 0.35rem; + &:last-child { + padding-bottom: 0; + } +`,E7=f.div` + width: 100%; + text-align: center; + font-size: 0.18rem; + color: #9966CC; + border: 1px solid #9966CC; + border-radius: 0.16rem; + padding-block: 0.04rem; + margin-top: 0.18rem; +`,j7=()=>{const e=St();return l.jsxs(r7,{children:[l.jsx(n7,{children:"Learning Community"}),l.jsx(i7,{children:"学习社区"}),l.jsx(o7,{children:e7.map(({key:t,icon:r,iconBg:n,label_en:i,label_zh:o,content:a,url:c})=>l.jsxs(s7,{children:[l.jsxs(c7,{children:[l.jsx(m7,{bg:n,children:l.jsx(p7,{src:r})}),l.jsxs(u7,{children:[l.jsx(wf,{bg:n}),l.jsx(d7,{bg:n}),l.jsx(f7,{bg:n}),l.jsx(h7,{bg:n})]})]}),l.jsx(a7,{children:i}),l.jsx(l7,{children:o}),l.jsx(g7,{children:a.map(({key:d,label:h})=>l.jsx(v7,{as:"li",children:h},d))}),c&&l.jsx(E7,{onClick:()=>e(c),children:"了解详情"})]},t))}),l.jsx(y7,{style:{paddingBottom:"1.42rem"},children:"学生故事"}),l.jsxs(w7,{children:[l.jsxs(_7,{children:[l.jsx(S7,{src:B5}),l.jsx(b7,{children:"郑昱笙"}),l.jsx(k7,{children:"浙江大学"})]}),l.jsx(x7,{children:l.jsx(C7,{children:t7.map(({key:t,text:r})=>l.jsx(D7,{as:"li",children:r},t))})})]})]})},qb="/zh-cn/assets/cover-53180b58.png",T7="/zh-cn/assets/cloud-757dcd86.png",{Heading:R7}=Ye,{CNHead4:A7}=R7,P7=f.div` + z-index: 1; + position: relative; + background: #ededf6; + overflow: hidden; +`,O7=f.div` + max-width: 1440px; + margin-inline: auto; + padding-top: 1rem; + padding-bottom: 1.4rem; + padding-inline: 2.04rem; +`,L7=f(A7)` + padding-bottom: 0.98rem; + text-align: center; +`,M7=f.img` + z-index: -1; + position: absolute; + left: 0; + bottom: 0; + width: 20.14rem; + height: 5.42rem; +`,Xw=()=>{const{sectionId:e}=bn();return N.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t==null||t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(At.Fragment,{children:[l.jsx(Vr,{cover:qb,children:"社区"}),l.jsxs(P7,{children:[l.jsxs(O7,{id:"community",children:[l.jsx(L7,{children:"社区"}),l.jsx($5,{}),l.jsx("div",{style:{marginInline:"-2.04rem"},children:l.jsx(Wg,{})}),l.jsx(j7,{})]}),l.jsx(M7,{src:T7})]})]})},I7="/zh-cn/assets/tech-talk-cover-10b6e35c.png",N7="/zh-cn/assets/oss-showcase-cover-2a511b0a.png",V7="/zh-cn/assets/rust-showcase-cover-78294f4f.png",Y7="/zh-cn/assets/hardware-acceleration-cover-67e9ecca.png",z7=[{key:1,cover:I7,title:"前沿科技分享",text:"探索前沿技术,拥抱创新与改变",url:"/tech-talk"},{key:2,cover:N7,title:"开源产品分享",text:"软硬件融合创新实践的观察与输出",url:"/oss-showcase"},{key:3,cover:V7,title:"Rust语言应用及案例分享",text:"Rust编程语言的应用、实践与探索",url:"/rust-showcase"},{key:4,cover:Y7,title:"硬件加速",text:"硬件加速领域的实践、经验与挑战",url:"/hardware-acceleration"}],{Heading:H7}=Ye,{CNHead4:F7}=H7,U7=f.section` + background: ${e=>e.theme.themeDark}; +`,$7=f.div` + max-width: 1440px; + margin-inline: auto; + padding-top: 1rem; + padding-bottom: 1.8rem; + padding-inline: 1.22rem; +`,B7=f(F7)` + padding-bottom: 1.35rem; + color: ${e=>e.theme.secondary02}; + text-align: center; +`,W7=f.div` + display: flex; + justify-content: space-between; +`,G7=f.div` + display: flex; + width: 24%; + padding: 0.01rem; + background: linear-gradient(45deg, #ffffff90, #ffffff00 60%); + border-radius: 0.12rem; + overflow: hidden; + cursor: pointer; +`,X7=f.div` + width: 100%; + background: #070708; + border-radius: 0.12rem; +`,K7=f.img` + display: block; + width: 100%; + border-radius: 0.12rem; +`,Q7=f.div` + padding-block: 0.26rem; + padding-inline: 0.2rem; +`,q7=f.div` + padding-bottom: 0.08rem; + font-size: 0.226rem; + font-weight: 600; + color: #fff; +`,Z7=f.div` + font-size: 0.145rem; + line-height: 0.258rem; + color: ${e=>e.theme.secondary02}; +`,J7=()=>{const e=St();return l.jsx(U7,{id:"tech-share",children:l.jsxs($7,{children:[l.jsx(B7,{children:"技术分享"}),l.jsx(W7,{children:z7.map(({key:t,cover:r,title:n,text:i,url:o})=>l.jsx(G7,{children:l.jsxs(X7,{onClick:()=>{e(o)},children:[l.jsx(K7,{src:r}),l.jsxs(Q7,{children:[l.jsx(q7,{children:n}),l.jsx(Z7,{children:i})]})]})},t))})]})})},eV="modulepreload",tV=function(e){return"/zh-cn/"+e},Kw={},x=function(t,r,n){if(!r||r.length===0)return t();const i=document.getElementsByTagName("link");return Promise.all(r.map(o=>{if(o=tV(o),o in Kw)return;Kw[o]=!0;const a=o.endsWith(".css"),c=a?'[rel="stylesheet"]':"";if(!!n)for(let g=i.length-1;g>=0;g--){const v=i[g];if(v.href===o&&(!a||v.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${o}"]${c}`))return;const h=document.createElement("link");if(h.rel=a?"stylesheet":eV,a||(h.as="script",h.crossOrigin=""),h.href=o,document.head.appendChild(h),a)return new Promise((g,v)=>{h.addEventListener("load",g),h.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${o}`)))})})).then(()=>t()).catch(o=>{const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=o,window.dispatchEvent(a),!a.defaultPrevented)throw o})},Qw="/zh-cn/assets/right-arrow-98730871.svg",qw="/zh-cn/assets/dynamics-test-image-29ac43b9.png",{Heading:rV,Paragraph:nV}=Ye,{CNHead4:iV,CNTitleLarge:oV,CNTitleMedium:sV}=rV,{CNBodySmall:Zb,CNMarkSmall:aV}=nV,lV=f.section` + background: ${e=>e.theme.white00}; +`,cV=f.div` + max-width: 1440px; + margin-inline: auto; + padding-top: 1rem; + padding-bottom: 1.29rem; + padding-inline: 1.22rem; +`,uV=f(iV)` + padding-bottom: 1.22rem; + color: ${e=>e.theme.themeDark02}; + text-align: center; +`,dV=f.div` + display: grid; + grid-template-columns: repeat(4, 1fr); + grid-template-rows: repeat(2, 1fr); + grid-gap: 0.21rem 0.32rem; +`,Jb=f.div` + position: relative; + background: ${e=>e.theme.white00}; + overflow: hidden; + cursor: pointer; +`,fV=f(Jb)` + grid-area: 1 / 1 / 3 / 3; + border-radius: 0.156rem; + box-shadow: 0.234rem 0.156rem 0.781rem rgba(0, 0, 0, 0.1); +`,hV=f(Jb)` + border-radius: 0.081rem; + box-shadow: 0.121rem 0.08rem 0.403rem rgba(0, 0, 0, 0.1); +`,ek=f.img` + display: block; + width: 100%; +`,mV=f(ek)` + /* height: 4.14rem; */ +`,pV=f(ek)` + /* height: 1.4rem; */ +`,tk=f.div``,gV=f(tk)` + padding: 0.24rem 0.28rem 0.33rem; +`,vV=f(tk)` + padding: 0.13rem 0.12rem 0.23rem; +`,yV=f(oV)` + margin-bottom: 0.09rem; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; +`,wV=f(sV)` + margin-bottom: 0.13rem; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; +`,_V=f(Zb)` + margin-bottom: 0.36rem; + display: -webkit-box; + -webkit-line-clamp: 6; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; +`,xV=f(Zb)` + margin-bottom: 0.25rem; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; +`,rk=f.div` + position: absolute; + display: flex; + align-items: center; + color: ${e=>e.theme.secondary01}; +`,SV=f(rk)` + bottom: 0.28rem; + left: 0.28rem; +`,bV=f(rk)` + bottom: 0.12rem; + left: 0.12rem; +`,Zw=f(aV)` + padding-right: 0.04rem; +`,Jw=f.img` + width: 0.12rem; + height: 0.12rem; +`,kV=f(wn)` + margin-top: 0.64rem; + display: block; + margin-inline: auto; + color: #fff; +`,e_=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>x(()=>import("./index-9a2c4ece.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>x(()=>import("./index-5e43e574.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>x(()=>import("./index-12a2a854.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>x(()=>import("./index-a179aa93.js"),[]),"/src/articles/events/2022-11-11-Datan-Technology-invites-you-who-love-challenges-to-participate-in-Rust-China-Hackathon-2022/index.md":()=>x(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>x(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>x(()=>import("./index-15895cd6.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>x(()=>import("./index-e197de7f.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>x(()=>import("./index-1959a67e.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>x(()=>import("./index-3480f851.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>x(()=>import("./index-5689e7f4.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>x(()=>import("./index-d2a8186a.js"),[]),"/src/articles/events/2023-05-04-Meet-this-summer|Datan-Technology-invites-you-to-participate-in-the-2023-Open-Source-Summer/index.md":()=>x(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>x(()=>import("./index-2b1c59a2.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>x(()=>import("./index-0b4fd2ad.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>x(()=>import("./index-16f06676.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>x(()=>import("./index-d72e9e88.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>x(()=>import("./index-22d5e656.js"),[]),"/src/articles/events/2023-09-07-The-2nd-Hardware-Agile-Development-and-Methodology-Workshop-l-2023-RISC-V-China-Summit-Concurrent-Events-Successfully-Held/index.md":()=>x(()=>import("./index-1ab49176.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>x(()=>import("./index-5e5c42fa.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>x(()=>import("./index-8cb22688.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>x(()=>import("./index-6454a1e4.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days_-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>x(()=>import("./index-4dde8fa0.js"),[]),"/src/articles/events/2023-12-05-Ding!-2023-hackathon-tips-fresh-from-the-oven!-Last-week-to-sign-up-before-it's-too-late!/index.md":()=>x(()=>import("./index-7e0a1d2c.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>x(()=>import("./index-50ad21f0.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>x(()=>import("./index-cc4e4968.js"),[]),"/src/articles/events/2024-02-22-Recruitment-can't-stop-Dartan-Technology-2024-internship-positions-waiting-for-you/index.md":()=>x(()=>import("./index-db271263.js"),[]),"/src/articles/events/2024-02-29-A-Challenge-Letter-from-DatenLord-on-GSoC-2024/index.md":()=>x(()=>import("./index-778a40a0.js"),[]),"/src/articles/events/2024-04-04-Come-and-get-your-own-mind-blowing-offer-from-Dartan-Technologies/index.md":()=>x(()=>import("./index-464785f1.js"),[]),"/src/articles/events/2024-05-09-DartanLord-@-you-and-invited-you-to-the-2024-Summer-of-Open-Source!/index.md":()=>x(()=>import("./index-68779906.js"),[]),"/src/articles/events/2024-05-23-Xline-Community-Meeting-Call-Up-Securing-Joint-Consensus-in-CURP-Algorithm/index.md":()=>x(()=>import("./index-63ad8b5a.js"),[]),"/src/articles/events/2024-06-27-GLCC-Student-Registration-Extended!-Hurry-Up-and-Secure-Your-Spot!/index.md":()=>x(()=>import("./index-9ef15c87.js"),[]),"/src/articles/events/2024-06-27-Latest-Recruitment-3-2-1-Offer-Link/index.md":()=>x(()=>import("./index-ef64e907.js"),[]),"/src/articles/events/2024-07-25-Xline-Community-Meeting-Call-Up-Revealing-Xline-0.7-Version-Update/index.md":()=>x(()=>import("./index-6d1ca60f.js"),[]),"/src/articles/events/2024-08-16-RISC-V-China-Summit-Simultaneous-Event-Preview-l-Hardware-Agile-Development-and-Verification-Methodology-Seminar/index.md":()=>x(()=>import("./index-9e32b6fa.js"),[])}),CV=()=>{const e=St(),[t,r]=N.useState([]),n=async()=>{const i=await Promise.all(Object.keys(e_).map(o=>e_[o]()));r(i.reverse())};return N.useEffect(()=>{n()},[]),l.jsx(lV,{id:"dynamics",children:l.jsxs(cV,{children:[l.jsx(uV,{children:"达坦动态"}),l.jsx(dV,{children:t.map(({metadata:i,assetURLs:o},a)=>{const{title:c,date:d,cover:h,label:g,description:v}=i;if(a===0)return l.jsxs(fV,{children:[l.jsx(mV,{src:h?o[0]:qw}),l.jsxs(gV,{children:[l.jsx(yV,{children:g}),l.jsx(_V,{children:v})]}),l.jsxs(SV,{onClick:()=>{e(`/events/${d}-${c.split(" ").join("-")}`)},children:[l.jsx(Zw,{children:"详情"}),l.jsx(Jw,{src:Qw})]})]},c);if(a<5)return l.jsxs(hV,{children:[l.jsx(pV,{src:h?o[0]:qw}),l.jsxs(vV,{children:[l.jsx(wV,{children:g}),l.jsx(xV,{children:v})]}),l.jsxs(bV,{onClick:()=>{e(`/events/${d}-${c.split(" ").join("-")}`)},children:[l.jsx(Zw,{children:"详情"}),l.jsx(Jw,{src:Qw})]})]},c)})}),l.jsx(kV,{onClick:()=>e("/events"),children:"了解更多"})]})})},DV="/zh-cn/assets/blog-test-image-c63d058c.png",{Heading:EV,Paragraph:jV}=Ye,{CNHead4:TV,TitleLarge:RV}=EV,{CNBodyMedium:nk}=jV,AV=f.section` + background: #f7f7f9; +`,PV=f.div` + max-width: 1440px; + margin-inline: auto; + padding-top: 1rem; + padding-bottom: 0.32rem; + padding-inline: 1.22rem; +`,OV=f(TV)` + padding-bottom: 1.22rem; + color: ${e=>e.theme.themeDark02}; + text-align: center; +`,LV=f.div` + padding-block: 0.59rem; + padding-inline: 0.3rem; +`,MV=f.div` + padding-bottom: 0.59rem; + display: grid; + grid-auto-flow: column; + grid-template-columns: repeat(2, 1fr); + grid-template-rows: repeat(3, 1fr); + grid-gap: 0.36rem; + padding-inline: 0.29rem; + height: min-content; +`,IV=f.img` + width: 100%; + /* height: 100%; */ + grid-area: 1 / 1 / 3 / 2; + border-top-left-radius: 0.12rem; + border-top-right-radius: 0.12rem; +`,NV=f.div` + padding-bottom: 0.22rem; + border-bottom: 0.01rem solid #a4a4a4; +`,VV=f(RV)` + margin-bottom: 0.15rem; + color: ${e=>e.theme.gray007}; + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; + cursor: pointer; + &:hover { + color: #722ed1; + } +`,YV=f(nk)` + margin-bottom: 0.07rem; + color: #383838; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; +`,zV=f(nk)` + color: #fff; + margin-inline: auto; + padding-block: 0.12rem; + padding-inline: 0.34rem; + width: min-content; + white-space: nowrap; + background: linear-gradient(90deg, #767ee5, #9966cc); + border-radius: 0.5rem; + border: none; + cursor: pointer; +`,t_=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>x(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>x(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>x(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>x(()=>import("./index-fe9ae8f0.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>x(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>x(()=>import("./index-9d5e23a7.js"),[]),"/src/articles/blogs/2022-05-27-Rust-implementation-of-RDMA-asynchronous-programming-(I)_-epoll-based-implementation-of-RDMA-asynchronous-operation/index.md":()=>x(()=>import("./index-71928cce.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>x(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>x(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>x(()=>import("./index-b1ba4736.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>x(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>x(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>x(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>x(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>x(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>x(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>x(()=>import("./index-1bdc26aa.js"),[]),"/src/articles/blogs/2022-06-30-Ten-thousand-words-long-article,-detailing-the-hardware-acceleration-and-implementation-of-TRIDENT_-Poseidon-hash-algorithm!/index.md":()=>x(()=>import("./index-1c3a6017.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>x(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room_-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>x(()=>import("./index-dac1acc4.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room_-Xline-cross-data-center-consistency-management/index.md":()=>x(()=>import("./index-b2bc16dd.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>x(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>x(()=>import("./index-34b313c2.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>x(()=>import("./index-39390118.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>x(()=>import("./index-85fa6207.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0_-A-distributed-KV-store-for-metadata-management/index.md":()=>x(()=>import("./index-404f0d83.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>x(()=>import("./index-1a975ae4.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0_-A-distributed-KV-store-for-metadata-management/index.md":()=>x(()=>import("./index-64a98ea7.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>x(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>x(()=>import("./index-64a7ffe1.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0_-A-distributed-KV-store-for-metadata-management/index.md":()=>x(()=>import("./index-2bc875c0.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>x(()=>import("./index-0c908ba4.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>x(()=>import("./index-86e42443.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>x(()=>import("./index-7a966399.js"),[]),"/src/articles/blogs/2023-06-21-The-first-cross-cloud-metadata-KV-storage-Xline-officially-entered-the-CNCF-sandbox/index.md":()=>x(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1_-A-distributed-KV-store-for-metadata-management/index.md":()=>x(()=>import("./index-5a50192e.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>x(()=>import("./index-821ce5ea.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>x(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>x(()=>import("./index-40bc588f.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>x(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>x(()=>import("./index-96aee43d.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>x(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>x(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>x(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>x(()=>import("./index-6618c0b5.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>x(()=>import("./index-f210af05.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>x(()=>import("./index-a4c077ba.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0_-a-distributed-KV-store-for-metadata-management/index.md":()=>x(()=>import("./index-2cc15fbf.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>x(()=>import("./index-1b00c887.js"),[]),"/src/articles/blogs/2024-01-11-Open-source-Bluespec-bsc-compiler-and-reusable-example-designs/index.md":()=>x(()=>import("./index-4da057d8.js"),[]),"/src/articles/blogs/2024-01-18-Xline-v0.6.1_-a-distributed-KV-store-for-metadata-management/index.md":()=>x(()=>import("./index-e5377dbd.js"),[]),"/src/articles/blogs/2024-01-25-Agile-Digital-Chip-Design-and-Verification-with-SpinalHDL-and-Cocotb/index.md":()=>x(()=>import("./index-2aee5161.js"),[]),"/src/articles/blogs/2024-02-01-Xline-Jepsen-test-analysis/index.md":()=>x(()=>import("./index-c0527a8b.js"),[]),"/src/articles/blogs/2024-03-07-Membership-Change-Source-Code-Interpretation/index.md":()=>x(()=>import("./index-836388b4.js"),[]),"/src/articles/blogs/2024-03-21-Early-Explorations-and-Practices-of-Xline-a-Stateful-Application-Managed-by-Karmada/index.md":()=>x(()=>import("./index-8cb7e806.js"),[]),"/src/articles/blogs/2024-03-28-A-short-summary-of-the-implementation-of-interval-trees-in-Xline copy/index.md":()=>x(()=>import("./index-81d1e484.js"),[]),"/src/articles/blogs/2024-04-11-RDMA-Driver-Exploration-Series-for-Linux-1/index.md":()=>x(()=>import("./index-f7c1c3db.js"),[]),"/src/articles/blogs/2024-04-18-A-short-summary-of-the-implementation-of-interval-trees-in-Xline/index.md":()=>x(()=>import("./index-9e270336.js"),[]),"/src/articles/blogs/2024-04-25-Common-Design-Patterns-and-Their-Rust-Implementations/index.md":()=>x(()=>import("./index-5130399c.js"),[]),"/src/articles/blogs/2024-05-16-Xline-0.7-Refactoring-Performance-Analysis-Overview/index.md":()=>x(()=>import("./index-3deb6102.js"),[]),"/src/articles/blogs/2024-05-30-Full-Scale-File-System-Acceleration-on-GPUs/index.md":()=>x(()=>import("./index-900d632b.js"),[]),"/src/articles/blogs/2024-06-13-Managing-Google's-TPUv4-Machine-Learning-Supercomputer/index.md":()=>x(()=>import("./index-740bc59b.js"),[]),"/src/articles/blogs/2024-06-20-Managing-Google's-TPUv4-Machine-Learning-Supercomputer-(ll)/index.md":()=>x(()=>import("./index-4e044280.js"),[]),"/src/articles/blogs/2024-07-11-Asynchronous-Runtime-IO-Issue-Analysis/index.md":()=>x(()=>import("./index-4743c99a.js"),[]),"/src/articles/blogs/2024-07-18-Exploring-RDMA-Driver-in-Linux-Series2/index.md":()=>x(()=>import("./index-65fd7bbd.js"),[]),"/src/articles/blogs/2024-08-29-Xline-v-0.7.0---A-Distributed-KV-Store-for-Metadata-Management/index.md":()=>x(()=>import("./index-8cea61b2.js"),[]),"/src/articles/blogs/2024-09-12-A-Review-of-Debugging-a-RDMA-User-Space-Driver/index.md":()=>x(()=>import("./index-455c7bc3.js"),[])}),HV=()=>{const e=St(),[t,r]=N.useState([]),[n,i]=N.useState(""),o=async()=>{const a=await Promise.all(Object.keys(t_).map(c=>t_[c]()));r(a.reverse())};return N.useEffect(()=>{o()},[]),N.useEffect(()=>{var a;console.log(t),i(((a=t[0])==null?void 0:a.assetURLs[0])||DV)},[t]),l.jsx(AV,{id:"blog",children:l.jsxs(PV,{children:[l.jsx(OV,{children:"技术博客"}),l.jsxs(LV,{children:[l.jsxs(MV,{children:[l.jsx(IV,{src:n}),t.map(({metadata:a},c)=>{const{title:d,date:h,label:g,description:v}=a;return c<4&&l.jsxs(NV,{children:[l.jsx(VV,{onClick:()=>{e(`/blogs/${h}-${d.split(" ").join("-")}`)},children:g}),l.jsx(YV,{children:v})]},d)})]}),l.jsx(zV,{onClick:()=>e("/blogs"),children:"了解更多"})]})]})})},r_=()=>{const{sectionId:e}=bn();return N.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(At.Fragment,{children:[l.jsx(Vr,{cover:qb,children:"资源"}),l.jsx(J7,{}),l.jsx(CV,{}),l.jsx(HV,{})]})},FV="/zh-cn/assets/andreas-0ee099e2.png",UV="/zh-cn/assets/bruno-thethe-4458e86e.png",$V="/zh-cn/assets/mahdi-bafande-9bcc200e.png",{Heading:BV,Paragraph:WV}=Ye,{Heading3:GV,CNHead4:XV}=BV,{CNBodyLarge:KV}=WV,QV=f.section` + background: #f7f7f9; +`,qV=f.div` + max-width: 1440px; + margin-inline: auto; + padding-top: 1rem; + padding-bottom: 1.84rem; + padding-inline: 2.24rem; +`,ZV=f(XV)` + text-align: center; + padding-bottom: 1.1rem; +`,JV=f.div` + display: grid; + grid-template-columns: repeat(2, 1fr); + grid-template-rows: repeat(2, 1fr); + grid-gap: 0.17rem 0.26rem; + height: 4.5rem; +`,nv=f.div` + display: flex; + flex-direction: column; + justify-content: center; + padding-inline: 0.48rem; + background-size: cover; + border-radius: 0.18rem; +`,e8=f(nv)` + background-image: url(${FV}); + grid-area: 1 / 1 / 2 / 2; +`,t8=f(nv)` + background-image: url(${UV}); + grid-area: 2 / 1 / 3 / 2; +`,r8=f(nv)` + background-image: url(${$V}); + grid-area: 1 / 2 / 3 / 3; +`,Zh=f(GV)` + padding-bottom: 0.06rem; + color: #fff; +`,Jh=f(KV)` + color: #d9dbef; +`,n8=()=>l.jsx(QV,{id:"usage-scenarios",children:l.jsxs(qV,{children:[l.jsx(ZV,{children:"使用场景"}),l.jsxs(JV,{children:[l.jsxs(e8,{children:[l.jsx(Zh,{children:"跨云数据实时备份"}),l.jsx(Jh,{children:"尤其针对关键业务应用场景,如数据库。"})]}),l.jsxs(t8,{children:[l.jsx(Zh,{children:"跨云数据加载"}),l.jsx(Jh,{children:"特别针对人工智能、大数据训练场景。"})]}),l.jsxs(r8,{children:[l.jsx(Zh,{children:"跨云应用迁移"}),l.jsx(Jh,{children:"尤其针对具有高并发性和业务弹性要求高的场景的应用,如中国的双十一促销活动。"})]})]})]})}),i8="/zh-cn/assets/cover-2eaea155.png",o8="/zh-cn/assets/SJTU-logo-a938b527.png",s8="/zh-cn/assets/BUPT-logo-4d861e45.png",a8="/zh-cn/assets/HNU-logo-a704fb8b.png",l8="/zh-cn/assets/SCUT-logo-aa4c3285.png",c8="/zh-cn/assets/SBU-logo-a0084f17.png",u8="/zh-cn/assets/image-cd6390ff.png",{Heading:d8,Paragraph:f8}=Ye,{CNHead4:h8,CNHead5:m8}=d8,{CNBodyLarge:ik}=f8,p8=f.section` + background: ${e=>e.theme.white00}; + background: linear-gradient(180deg, #BFC5FB, #BFC5FB00 50%); +`,g8=f.div` + padding-top: 1.48rem; + max-width: 1440px; + margin-inline: auto; + padding-bottom: 0.79rem; + padding-inline: 2.03rem; +`,v8=f(h8)` + padding-bottom: 0.5rem; + text-align: center; +`,y8=f(ik)` + padding-bottom: 0.52rem; + margin-bottom: 1rem; + border-bottom: 0.01rem solid ${e=>e.theme.secondary02}; + text-align: center; +`,w8=f.div` + display: flex; + justify-content: space-between; +`,_8=f.div` + display: grid; + grid-gap: 0.3rem 0.2rem; + grid-template-columns: repeat(4, 1fr); + grid-template-rows: repeat(4, 1fr); + width: 57%; + /* height: 11rem; */ +`,x8=f.ul` + width: 37%; + list-style-type: none; +`,Bl=f.img` + width: 100%; + /* height: 100%; */ +`,S8=f(Bl)` + grid-area: 1 / 2 / 2 / 4; +`,b8=f(Bl)` + grid-area: 2 / 1 / 3 / 3; +`,k8=f(Bl)` + grid-area: 2 / 3 / 3 / 5; +`,C8=f(Bl)` + width: 120%; + transform: translateX(-10%); + grid-area: 3/ 2 / 4 / 4; +`,D8=f(Bl)` + transform: translateX(5%); + width: 90%; + grid-area: 4 / 2 / 5 / 4; +`,E8=f.li` + padding-bottom: 0.46rem; + &:last-child { + padding-bottom: 0; + } +`,j8=f(m8)` + padding-bottom: 0.16rem; + color: ${e=>e.theme.secondary01}; +`,T8=f(ik)``,R8=f.img` + width: 100%; + padding-bottom: 1.18rem; +`,A8=[{title:"高性能跨云SaaS服务基础",content:[{text:"上海交通大学"},{text:" 合作项目:利用RDMA加速serverless的性能"}]},{title:"高性能跨云网络基础",content:[{text:"北京邮电大学 合作项目:RDMA的流量控制"},{text:"湖南大学 合作项目:RDMA QoS"}]},{title:"高性能网络硬件支持",content:[{text:"华南理工大学"},{text:"合作项目:硬件敏捷开发和验证"}]},{title:"高性能跨云一致性算法",content:[{text:"美国石溪大学"},{text:"合作项目:分布式一致性"}]}],n_=()=>{const{sectionId:e}=bn();return N.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t==null||t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(At.Fragment,{children:[l.jsx(Vr,{cover:i8,subTitle:"通过实现跨云、跨数据中心的数据高速访问,DatenLord将大大提升存储系统的可扩展性,同时大大降低企业级IT业务系统在实现高可用性、多活方面的复杂性。随着多云、多数据中心成为企业级IT的主流架构,跨云分布式存储将在互联网、金融、电信、能源等不同行业得到广泛应用。",children:"客 户"}),l.jsx(n8,{}),l.jsx(p8,{id:"project-cooperation",children:l.jsxs(g8,{children:[l.jsx(R8,{src:u8}),l.jsx(v8,{children:"产学研项目合作"}),l.jsx(y8,{children:"DatenLord积极推动产学研合作,与国内外各大高校的顶尖实验室合作,在高性能跨云SaaS服务基础、高性能跨云网络基础、高性能网络硬件支持和高性能跨云网络一致性算法领域共同进行深入的前瞻研究和实践落地。"}),l.jsxs(w8,{children:[l.jsxs(_8,{children:[l.jsx(S8,{src:o8}),l.jsx(b8,{src:s8}),l.jsx(k8,{src:a8}),l.jsx(C8,{src:l8}),l.jsx(D8,{src:c8})]}),l.jsx(x8,{children:A8.map(({title:t,content:r},n)=>l.jsxs(E8,{children:[l.jsx(j8,{children:t}),r.map(({text:i},o)=>l.jsx(T8,{children:i},o))]},n))})]})]})})]})},P8="/zh-cn/assets/logo-theme-dark-9478769d.svg",O8="/zh-cn/assets/founding-image-1a5d82c0.png",L8="/zh-cn/assets/shi-jicheng-avatar-b016e3a2.png",M8="/zh-cn/assets/wang-pu-avatar-5d318600.png",{Heading:I8,Paragraph:N8}=Ye,{CNHead4:V8,CNHead5S:Y8,CNHead5:z8}=I8,{CNBodyLarge:_f,CNBodySmall:ok}=N8,H8=[{key:"wang-pu",avatar:M8,name:"王璞",position:"达坦科技创始人兼CEO",text:"达坦科技创始人兼CEO,美国George Mason大学计算机博士、北大硕士、北航本科,拥有多年云计算和大数据领域的经验和积累,擅长分布式系统研发、海量数据处理、云计算产品设计及大规模机器学习等。2014年回国创业,创立数人云科技公司,专注容器技术在国内的落地和推广,2018年被上市公司收购。曾发表十余篇论文,共计被引用上千次,拥有多项云计算专利、软著,并于2020年被评选为腾讯云TVP(最有价值专家)。",quote:"“我读大学的时候玩乐队,弹奏最多的就是Guns N' Roses(枪花)乐队的歌曲。枪花1987年发行的第一张专辑叫《Appetite for Destruction》。虽然我不至于有毁灭欲,但都说创新的本质其实是‘创造性地破坏’,创业亦然。离开大公司后我连续投身科技创业,想要静心做底层技术的颠覆性创新。想来也算是年轻时追求的摇滚精神跨时空的延续”。",inscription:"——王璞 达坦科技创始人兼CEO"},{key:"shi-ji-cheng",avatar:L8,name:"施继成",position:"达坦科技联合创始人兼 CTO",text:"DatenLord 联合创始人兼 CTO,复旦大学软件工程本硕,师从华为基础软件首席科学家、鸿蒙实验室主任陈海波教授。擅长操作系统内核开发、分布式系统、嵌入式系统,对分布式数据一致性有钻深的研究,发表多篇操作系统内核相关论文,累计数百次引用。毕业后曾在谷歌中国、微软亚太和阿里巴巴等公司从事分布式计算和存储等相关工作。入选2022年度36氪S级创业者名册,荣获中国“企业工具与底层软件”领域 “36位36岁以下创业者“称号。",quote:"“魂系游戏和创业很相似,前者大量的离散叙事遍布于各个物件和NPC上,寻找主线剧情就好比创业时把客户的需求、公司的技术优势、VUCA时代瞬息万变的市场变化和趋势等都链接起来,形成完整的产品叙事并落地。两者的难度系数都很高,创业中的踩坑、犯错对应的是游戏中的“死亡”,所以,‘不死精神’或者说‘Grit’(坚毅)是魂系游戏和投身创业企业玩家的必备素质。”",inscription:"——施继成 达坦科技联合创始人兼CTO"}],F8=f.section` + background: #f7f7f9; +`,U8=f.section` + max-width: 1440px; + margin-inline: auto; + padding-top: 1rem; + padding-bottom: 1.16rem; + padding-inline: 1.22rem; +`,$8=f(V8)` + padding-bottom: 1.56rem; + color: ${e=>e.theme.themeDark02}; + text-align: center; +`,B8=f.div` + padding-inline: 0.34rem; + padding-bottom: 0.73rem; + display: flex; + justify-content: space-between; + align-items: center; +`,W8=f.img` + width: 36%; +`,G8=f(_f)` + width: 54%; +`,X8=f.div` + display: flex; + justify-content: space-between; + align-items: center; + padding-inline: 0.34rem; + padding-bottom: 0.65rem; +`,K8=f.img` + width: 36%; +`,Q8=f.div` + width: 54%; +`,q8=f(Y8)``,Z8=f(_f)` + padding-left: 0.16rem; +`,J8=f.div` + display: flex; + flex-direction: ${e=>e.name=="wang-pu"?"row":"row-reverse"}; + justify-content: space-between; + align-items: center; + margin-bottom: 0.39rem; + padding-top: 0.64rem; + padding-bottom: 0.6rem; + padding-inline: 0.48rem; + border-radius: 0.18rem; + background: #fff; + &:last-child { + margin-top: 0; + } +`,eY=f.div` + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 12%; + text-align: center; +`,tY=f.div` + width: 80%; +`,rY=f.img` + width: 1.2rem; + height: 1.2rem; + margin-bottom: 0.13rem; + border-radius: 50%; + border: 0.01rem solid #000; +`,nY=f(z8)` + margin-bottom: 0.04rem; +`,iY=f(_f)``,oY=f(_f)` + padding-bottom: 0.39rem; +`,sY=f(ok)` + margin-bottom: 0.3rem; + padding-left: 0.1rem; + border-left: 0.02rem solid transparent; + border-image: linear-gradient(90deg, #767ee5, #9966cc) 1; + color: ${e=>e.theme.gray03}; +`,aY=f(ok)` + color: ${e=>e.theme.gray03}; + text-align: right; +`,La=f.span` + color: ${e=>e.theme.secondary01}; + font-weight: 600; +`,lY=()=>l.jsx(F8,{id:"about-us",children:l.jsxs(U8,{children:[l.jsx($8,{children:"关于我们"}),l.jsxs(B8,{children:[l.jsx(W8,{src:P8}),l.jsxs(G8,{children:["达坦科技始终致力于打造高性能 ",l.jsx(La,{children:"AI+ Cloud 基础设施平台"}),",积极推动AI应用的落地。达坦科技通过",l.jsx(La,{children:"软硬件深度融合的方式"}),",提供高性能存储和高性能网络。为 AI + Cloud 应用提供",l.jsx(La,{children:"弹性、便利、经济"}),"的基础设施服务,以此满足不同行业客户对 AI + Cloud 的需求。"]})]}),l.jsxs(X8,{children:[l.jsxs(Q8,{children:[l.jsx(q8,{style:{paddingLeft:"0.16rem",paddingBottom:"0.39rem"},children:"创始团队"}),l.jsxs(Z8,{children:["达坦科技",l.jsx(La,{children:"专注底层硬核技术"}),",通过软硬件深度融合的方式,涉及分布式系统、Linux 内核、 InfiniBand/RDMA、 SoC、硬件加速等多个前沿技术领域。公司创始团队和核心成员大部分来自谷歌, 微软、阿里巴巴等国际知名科技公司的顶尖人才,拥有",l.jsx(La,{children:"深厚的软硬件技术和丰富的行业经验"}),"。"]})]}),l.jsx(K8,{src:O8})]}),H8.map(({key:e,name:t,avatar:r,position:n,text:i,quote:o,inscription:a})=>l.jsxs(J8,{name:e,children:[l.jsxs(eY,{children:[l.jsx(rY,{src:r}),l.jsx(nY,{children:t}),l.jsx(iY,{children:n})]}),l.jsxs(tY,{children:[l.jsx(oY,{children:i}),l.jsx(sY,{children:o}),l.jsx(aY,{children:a})]})]},e))]})}),cY="/zh-cn/assets/VMV-section-bg-fde7914e.png",uY="/zh-cn/assets/book-9274cf2e.svg",dY="/zh-cn/assets/bulb-e5b82e48.svg",fY="/zh-cn/assets/target-c78d4e77.svg",hY="/zh-cn/assets/HollowSphere4-3d92727b.png",mY="/zh-cn/assets/HollowSphere5-971b228b.png",i_="/zh-cn/assets/Pipe4-0ba2713b.png",{Heading:pY,Paragraph:gY}=Ye,{CNHead4:iv}=pY,{CNBodyLarge:ov,CNBodyMedium:vY}=gY,yY=f.section` + color: ${e=>e.theme.secondary02}; + background: ${e=>e.theme.themeDark}; + background-image: url(${cY}); + background-size: cover; +`,wY=f.section` + position: relative; + max-width: 1440px; + margin-inline: auto; + padding-top: 1rem; + padding-bottom: 1.31rem; + padding-inline: 1.6rem; +`,_Y=f(iv)` + padding-bottom: 1.57rem; + color: ${e=>e.theme.secondary02}; + text-align: center; +`,xY=f.div` + padding-bottom: 1.04rem; + display: flex; + justify-content: space-between; +`,sv=f.div` + width: 32%; +`,SY=f(sv)` + padding-top: 1rem; +`,bY=f(sv)``,kY=f(sv)` + padding-top: 0.79rem; +`,rl=f.div` + margin-bottom: 0.2rem; + padding-top: 0.51rem; + padding-bottom: 0.67rem; + padding-inline: 0.26rem; + border-radius: 0.12rem; + background: #ffffff10; + border: 0.01rem solid #ffffff80; + &:last-child { + margin-bottom: 0; + } +`,em=f(rl)` + padding-block: 0.34rem; +`,tm=f(iv)` + color: #fff; + padding-bottom: 0.2rem; +`,Yc=f(ov)` + color: #fff; + padding-bottom: 0.06rem; +`,rs=f(ov)``,CY=f(rl)` + display: flex; + width: 80%; + padding-block: 0.4rem; + padding-inline: 0.46rem; +`,DY=f(iv)` + padding-right: 1rem; +`,EY=f.div` + display: flex; + flex-direction: column; +`,rm=f.div` + display: flex; + align-items: center; + padding-bottom: 0.32rem; + &:last-child { + padding-bottom: 0; + } +`,nm=f.img` + margin-right: 0.16rem; + width: 0.58rem; + height: 0.58rem; +`,im=f.div``,om=f(ov)` + padding-bottom: 0.06rem; +`,sm=f(vY)``,jY=f.img` + position: absolute; + top: 2.22rem; + right: 1.59rem; + width: 1.5rem; + height: 1.5rem; +`,sk=f.img` + position: absolute; +`,TY=f(sk)` + left: 2.64rem; + top: 9.13rem; + width: 3.31rem; + height: 3.31rem; +`,RY=f(sk)` + left: 2.94rem; + top: 8.97rem; + width: 1.37rem; + height: 1.37rem; + transform: rotate(-80deg); +`,AY=f.img` + position: absolute; + right: 0; + bottom: 0.2rem; + width: 3.5rem; +`,PY=()=>l.jsx(yY,{children:l.jsxs(wY,{children:[l.jsx(_Y,{children:"愿景/使命/价值观"}),l.jsxs(xY,{children:[l.jsx(SY,{children:l.jsxs(rl,{children:[l.jsx(tm,{children:"愿景"}),l.jsx(rs,{children:"使企业能够以高性能和高安全性的方式在全球多个云中读、写和提取数据。"})]})}),l.jsxs(bY,{children:[l.jsxs(rl,{children:[l.jsx(tm,{children:"使命"}),l.jsx(rs,{children:"通过使用DatenLord 跨云分布式的存储系统,打破跨云之间的隔阂。"})]}),l.jsxs(rl,{children:[l.jsx(tm,{children:"价值"}),l.jsx(Yc,{children:"开放和透明"}),l.jsx(rs,{children:"我们努力保证信息和决策过程的透明度,从而创造一个包容性的社区,让每个成员都感到安全和自信,可以贡献不同的意见和多元化的视角。我们相信建设性的冲突可以带来反思和改进。"})]})]}),l.jsxs(kY,{children:[l.jsxs(em,{children:[l.jsx(Yc,{children:"敢于成为先锋"}),l.jsx(rs,{children:"我们是一群具有成长型思维模式的人,我们不走捷径并且相信慢就是快。我们的目标是成为先锋,敢于标新立异,制定自己的模式,因此我们允许犯错,但更相信我们能够快速、持续地调整和完善。"})]}),l.jsxs(em,{children:[l.jsx(Yc,{children:"坚持交付卓越"}),l.jsx(rs,{children:"我们相信结果与过程同样重要。我们以目标为导向,设定高标准,并发挥我们的聪明才智和努力拼搏的精神来实现它们。我们致力于通过关注自身的行动和外部的变化来获得想要的结果。"})]}),l.jsxs(em,{children:[l.jsx(Yc,{children:"专注于小而可控的步骤"}),l.jsx(rs,{children:"大的里程碑固然值得庆祝,而每一跬步也很重要。我们相信在正确的方向上迈出的每一小步可以跨越难以想象的距离。我们相信不积跬步,无以至千里;不积小流,无以成江海。"})]})]})]}),l.jsxs(CY,{children:[l.jsx(DY,{children:"公司文化"}),l.jsxs(EY,{children:[l.jsxs(rm,{children:[l.jsx(nm,{src:uY}),l.jsxs(im,{children:[l.jsx(om,{children:"持续学习"}),l.jsx(sm,{children:"持之以恒的自驱学习,求真求致;"})]})]}),l.jsxs(rm,{children:[l.jsx(nm,{src:dY}),l.jsxs(im,{children:[l.jsx(om,{children:"精益求精"}),l.jsx(sm,{children:"对自己高标准严要求,勇于挑战自我,对创新有极致追求;"})]})]}),l.jsxs(rm,{children:[l.jsx(nm,{src:fY}),l.jsxs(im,{children:[l.jsx(om,{children:"积极主动"}),l.jsx(sm,{children:"遇到问题主动踏出第一步,做先行者而不是追随者。"})]})]})]})]}),l.jsx(jY,{src:mY}),l.jsx(TY,{src:i_}),l.jsx(RY,{src:i_}),l.jsx(AY,{src:hY})]})}),OY="/zh-cn/assets/public-ebe954c4.svg",LY="/zh-cn/assets/mail-63c82f9f.svg",MY="/zh-cn/assets/wechat-c8587d4a.svg",IY="/zh-cn/assets/bilibili-b4f04177.svg",NY="/zh-cn/assets/zhihu-6dedfed7.svg",VY="/zh-cn/assets/wechat-public-qrcode1-2f1a7fe8.png",YY="/zh-cn/assets/email-qrcode1-86dcc594.png",zY="/zh-cn/assets/wechat-qrcode1-72234ee7.png",HY="/zh-cn/assets/bilibili-qrcode1-27289e6d.png",FY="/zh-cn/assets/zhihu-qrcode1-6f12e2dc.png",{Heading:UY,Paragraph:$Y}=Ye,{CNHead4:BY,CNTitleMedium:WY}=UY,{CNBodySmall:GY}=$Y,XY=f.section` + background: #f7f7f9; +`,KY=f.div` + max-width: 1440px; + margin-inline: auto; + padding: 1rem 1.64rem 1.94rem; +`,QY=f(BY)` + padding-bottom: 1.54rem; + color: ${e=>e.theme.themeDark02}; + text-align: center; +`,qY=f.div` + display: grid; + grid-template-columns: repeat(5, 1fr); + grid-template-rows: repeat(1, 1fr); + justify-items: center; +`,ZY=f.div` + display: flex; + flex-direction: column; + align-items: center; + width: 100%; +`,JY=f.div` + width: 100%; + margin-bottom: 0.31rem; + padding-top: calc(1.63rem - 1.54rem); + padding-bottom: calc(0.4rem - 0.31rem); + border-right: 0.01rem solid ${e=>e.theme.secondary02}; + &.icon:last-of-type { + border: none; + } +`,ez=f.img` + display: block; + margin-inline: auto; + margin-bottom: 0.13rem; + width: 0.9rem; + height: 0.9rem; +`,tz=f(WY)` + text-align: center; +`,rz=f.img` + width: 1.6rem; + padding-bottom: 0.16rem; + display: block; +`,nz=f(GY)``,iz=[{title:"公众号",icon:OY,qrCode:VY,text:"达坦科技DatenLord"},{title:"邮箱",icon:LY,qrCode:YY,text:"info@datenlord.com"},{title:"微信",icon:MY,qrCode:zY,text:"DatenLord小助手"},{title:"B站",icon:IY,qrCode:HY,text:"达坦科技DatenLord"},{title:"知乎",icon:NY,qrCode:FY,text:"达坦科技DatenLord"}],ak=()=>l.jsx(XY,{id:"contact-us",children:l.jsxs(KY,{children:[l.jsx(QY,{children:"联系我们"}),l.jsx(qY,{children:iz.map(({title:e,icon:t,qrCode:r,text:n},i)=>l.jsxs(ZY,{children:[l.jsxs(JY,{className:"icon",children:[l.jsx(ez,{src:t}),l.jsx(tz,{children:e})]}),r&&l.jsx(rz,{src:r}),l.jsx(nz,{children:n})]},i))})]})}),lk="/zh-cn/assets/cover-ab5c0f66.png",o_=()=>{const{sectionId:e}=bn();return N.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t==null||t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(At.Fragment,{children:[l.jsx(Vr,{cover:lk,subTitle:"达坦科技通过软硬件深度融合的方式,提供高性能存储和高性能网络,打造高性能 AI + Cloud 基础设施平台。",children:"公司"}),l.jsx(lY,{}),l.jsx(PY,{}),l.jsx(ak,{})]})},oz="/zh-cn/assets/card-bg1-242750c8.png",sz="/zh-cn/assets/card-bg2-603ed811.png",az="/zh-cn/assets/card-bg3-14a8311e.png",{Heading:lz,Paragraph:cz}=Ye,{CNHead5S:uz,CNHead4:dz}=lz,{CNBodyLarge:fz}=cz,hz=f.section` + padding-bottom: 0.63rem; +`,mz=f(uz)``,pz=f.div` + display: grid; + grid-template-columns: repeat(3, 1fr); + grid-template-rows: repeat(1, 1fr); + grid-gap: 0.23rem; +`,gz=f.div` + padding-top: 0.79rem; + padding-bottom: 0.9rem; + padding-inline: 0.25rem; + border-radius: 0.1rem; + color: ${e=>e.theme.themeDark02}; + text-align: center; + background: #00000015; + background-image: url(${e=>e.bg}); + background-size: cover; +`,vz=f(dz)` + padding-bottom: 0.51rem; +`,yz=f(fz)``,wz=[{title:"创造性工作",text:"在DatenLord,你将有机会与一群才华横溢、积极进取的人一起创造性且高效率地工作。",bg:oz},{title:"归属感",text:"DatenLord重视社区文化不仅仅局限于开源社区,我们也希望我们的员工在这里有一种包容感和归属感。",bg:sz},{title:"远程工作",text:"DatenLord专注于研究和开发分布式存储系统,我们是一个分布式的团队,大多数成员都可以远程工作。",bg:az}],_z=()=>l.jsxs(hz,{children:[l.jsx(mz,{style:{paddingBottom:".63rem"},children:"为什么选择达坦科技?"}),l.jsx(pz,{children:wz.map(({title:e,text:t,bg:r},n)=>l.jsxs(gz,{bg:r,children:[l.jsx(vz,{children:e}),l.jsx(yz,{children:t})]},n))})]}),{Heading:xz,Paragraph:Sz}=Ye,{CNHead5S:bz}=xz,{CNBodyLarge:kz}=Sz,Cz=f.section` + padding-bottom: 0.63rem; +`,Dz=f(bz)``,Ez=f.div` + display: flex; + flex-direction: column; + padding-top: 0.94rem; + padding-inline: 0.48rem; +`,Ma=f.div` + display: flex; + padding-bottom: 0.46rem; + &:last-child { + padding-bottom: 0; + } +`,xf=f(kz)` + border-radius: 50vh; + padding-block: 0.16rem; + padding-inline: 0.34rem; + white-space: nowrap; +`,jz=f(xf)` + color: #fff; + background: ${e=>e.theme.secondary08}; + box-shadow: 0px 4px 20px 0px rgba(251, 170, 48, 0.51); +`,ck=f(xf)` + color: #2e2f33; + background: ${e=>e.theme.white00}; + box-shadow: 0px 4px 20px 0px rgba(0, 0, 0, 0.11); +`,av=f(xf)` + color: ${e=>e.theme.white00}; + background: ${e=>e.theme.secondary01}; + box-shadow: 0px 4px 20px 0px rgba(54, 84, 255, 0.45); +`,Tz=f(xf)` + color: #2e2f33; + background: ${e=>e.theme.secondary02}; + box-shadow: 0px 4px 20px 0px rgba(0, 0, 0, 0.11); +`,Rz=f(jz)` + transform: translateX(calc(4.81rem - 2.03rem)); +`,Az=f(ck)` + transform: translateY(calc(-0.46rem + 0.3rem)); +`,Pz=f(av)` + transform: translateX(calc(0.99rem)); +`,Oz=f(Tz)` + transform: translateX(calc(3.7rem - 2.03rem)); +`,Lz=f(av)` + transform: translateX(calc(3.1rem - 2.03rem)); +`,Mz=f(av)` + transform: translate(3.31rem, calc(-0.43rem + 0.13rem)); +`,Iz=f(ck)` + transform: translateX(calc(6.56rem - 2.03rem)); +`,Nz=()=>l.jsxs(Cz,{children:[l.jsx(Dz,{children:"我们在寻找什么样的人才?"}),l.jsxs(Ez,{children:[l.jsx(Ma,{children:l.jsx(Rz,{children:"对行业内的最新技术发展保持敏锐的洞察力"})}),l.jsxs(Ma,{style:{paddingBottom:"0.27rem"},children:[l.jsx(Az,{children:"对于以创新的方式做有意义的事情饱含热情"}),l.jsx(Pz,{children:"具有好奇心,养成良好的学习习惯和方法"})]}),l.jsx(Ma,{style:{paddingBottom:"0.43rem"},children:l.jsx(Oz,{children:"对于以创新的方式做有意义的事情饱含热情"})}),l.jsxs(Ma,{style:{paddingBottom:"0.14rem"},children:[l.jsx(Lz,{children:"始终以终为始"}),l.jsx(Mz,{children:"热衷于开放且有意识地分享知识"})]}),l.jsx(Ma,{children:l.jsx(Iz,{children:"坦率而直接地进行沟通"})})]})]}),Vz="/zh-cn/assets/react-718251fb.svg",{Heading:Yz}=Ye,{CNHead5S:zz,CNTitleLarge:Hz}=Yz,Fz=f.section` + padding-bottom: 1.83rem; +`,Uz=f(zz)``,$z=f.div` + display: flex; + justify-content: center; + padding-top: 1.67rem; + padding-inline: 0.32rem; +`,s_=f.div` + width: calc(2.42rem + 0.08rem + 0.12rem); +`,uk=f(Hz)` + padding-left: 0.08rem; + color: ${e=>e.theme.themeDark02}; +`,a_=f(uk)` + border-left: 0.12rem solid ${e=>e.theme.secondary08}; +`,l_=f(uk)` + border-left: 0.12rem solid ${e=>e.theme.secondary07}; +`,Bz=f.img` + padding-inline: 0.24rem; + width: 4.55rem; +`,Wz=()=>l.jsxs(Fz,{children:[l.jsx(Uz,{children:"我们能提供什么?"}),l.jsxs($z,{children:[l.jsxs(s_,{children:[l.jsx(a_,{style:{marginTop:"0.64rem"},children:"灵活的工作内容,艰巨挑战,激发创新"}),l.jsx(l_,{style:{marginTop:"1.28rem"},children:"每年可申请长达2周的学习假期,自由选择充电课题"})]}),l.jsx(Bz,{src:Vz}),l.jsxs(s_,{children:[l.jsx(l_,{style:{marginTop:"0.64rem"},children:"丰富的软性素质及专业技能培训"}),l.jsx(a_,{style:{marginTop:"1.28rem"},children:"诸多行业交流和展现自我的机会"})]})]})]}),dk="/zh-cn/assets/avatar-icon-b12a4de6.svg",Gz="/zh-cn/assets/image-534e9e5c.png",{Heading:Xz,Paragraph:Kz}=Ye,{CNHead5S:Qz,CNTitleLarge:fk,CNTitleMedium:qz}=Xz,{CNBodyMedium:Wl,CNMarkMedium:Zz}=Kz,Jz=[{title:"Rust分布式存储开发(远程实习)",avatar:"",text:"参与高性能分布式存储系统研发,涉及的开发内容包括但不限于:",items:["分布式数据一致性协议;","高速网络传输接口、驱动;","分布式缓存、数据管理服务;","对象存储接口;","文件存储接口;","块存储接口。"],url:"/job-description/rust-distributed-storage-development"},{title:"Rust高性能网络系统开发(远程实习)",avatar:"",text:"参与研发高性能网络系统开发,涉及的工作包括但不限于:",items:["网络硬件Linux驱动开发;","网络流量控制算法设计与实现;","网络仿真系统开发与测试。"],url:"/job-description/rust-high-performance-web-systems-development"},{title:"AI平台研发 (远程实习)",avatar:"",items:["负责大模型平台后端的开发研发,根据产品和项目计划按时完成功能模块的架构设计、编码、测试的全流程工作。","负责持续优化系统架构,提供高并发的数据请求分析的处理能力,提高系统的容灾容错能力,保证系统的可运维、高可用性、高可靠性。"],url:"/job-description/ai-platform-development"},{title:"FPGA开发(远程实习)",avatar:"",items:["负责基于FPGA实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","实现常用外设接口IP的RTL设计、集成和验证;","参与SoC集成设计与验证;","撰写相关设计文档。"],url:"/job-description/fpga-development"},{title:"软硬件联合研发(远程实习)",avatar:"",text:"参与高性能存储SoC芯片的软硬件开发:",items:["负责网络IO加速的RTL实现;","负责加密、压缩、编码等算法加速的设计与RTL实现;","负责SoC芯片的Linux驱动开发;","负责实现软硬件联合调试与自动化测试。"],url:"/job-description/joint-research-and-development-of-hardware-and-software"},{title:"数字IC前端设计(远程实习)",avatar:"",text:"参与高性能存储SoC芯片开发:",items:["负责实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现; ","负责实现SoC的集成、综合与原型验证;","负责实现常用外设接口IP的RTL设计、集成;","撰写相关设计文档。"],url:"/job-description/digital-ic-front-end-design"}],eH=f.section``,tH=f(Qz)``,rH=f.div` + display: grid; + grid-template-rows: repeat(2, 1fr); + grid-template-columns: repeat(3, 1fr); + grid-gap: 0.58rem 0.32rem; + margin-inline: calc(1.48rem - 1.93rem); + padding-block: 0.82rem 0; +`,nH=f.div` + padding: 0.24rem; + color: ${e=>e.theme.themeDark02}; + border: 0.01rem solid #eaebf0; + border-radius: 0.05rem; + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.04); +`,iH=f.div` + display: flex; + justify-content: space-between; + padding-bottom: 0.24rem; +`,oH=f.div` + display: flex; + justify-content: center; + align-items: center; + width: 0.48rem; + height: 0.48rem; + background: ${e=>e.theme.secondary02}; + border-radius: 50%; +`,sH=f.img` + width: 0.32rem; + height: 0.32rem; +`,aH=f(Zz)` + padding: 0.12rem 0.18rem; + height: 0.46rem; + color: ${e=>e.theme.gray007}; + background: ${({theme:e})=>e.white00}; + border: 0.01rem solid #dae0e6; + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.04); + cursor: pointer; +`,lH=f(fk)` + color: ${e=>e.theme.gray007}; + padding-bottom: 0.08rem; +`,cH=f(Wl)``,uH=f(Wl)``,dH=f.ol` + padding-left: 0.2rem; +`,fH=f(Wl)``,hH=f.div` + display: flex; + flex-direction: column; + align-items: center; + background: #d8dcfa; + border-radius: 0.05rem; + padding: 0.72rem 0.64rem 0.59rem; +`;f.div` + width: 1.28rem; + height: 1.28rem; + margin-bottom: 0.3rem; + padding: 0.21rem; + background: ${e=>e.theme.secondary02}; + border-radius: 50%; +`;f.img` + display: block; + width: 100%; + height: 100%; +`;f(fk)` + padding-bottom: 0.07rem; + color: ${e=>e.theme.secondary08}; +`;f.div` + font-size: 0.2rem; + line-height: 0.28rem; + font-weight: 600; + color: #fff; + text-decoration: underline; + text-align: center; + cursor: pointer; +`;f.div` + display: flex; + justify-content: space-between; + align-items: center; +`;f.img` + width: 50%; + height: min-content; +`;f.div` + width: 46%; +`;f(qz)``;f.ul` + padding-block: 0.36rem; + list-style-type: none; +`;f(Wl)``;f(Wl)``;f.span` + color: ${e=>e.theme.secondary01}; +`;const mH=f.img` + width: 2.44rem; + padding-bottom: 0.16rem; +`,pH=f(wn)` + color: #fff; +`,gH=()=>{const e=St();return l.jsxs(eH,{children:[l.jsx(tH,{children:"公开招聘"}),l.jsxs(rH,{children:[Jz.map(({title:t,text:r,items:n,url:i},o)=>l.jsxs(nH,{children:[l.jsxs(iH,{children:[l.jsx(oH,{children:l.jsx(sH,{src:dk})}),l.jsx(aH,{onClick:()=>e(i),children:"岗位详情"})]}),l.jsx(lH,{children:t}),l.jsx(cH,{children:"【岗位职责】"}),r&&l.jsx(uH,{children:r}),l.jsx(dH,{children:n.map((a,c)=>l.jsx(fH,{as:"li",children:a},c))})]},o)),l.jsxs(hH,{children:[l.jsx(mH,{src:Gz}),l.jsx(pH,{onClick:()=>e("/job-description"),children:"进入招聘岗位详情"})]})]})]})},{Heading:vH}=Ye,{CNHead4:yH}=vH,wH=f.section` + background: #fff; +`,_H=f.div` + max-width: 1440px; + margin-inline: auto; + padding-top: 1rem; + padding-bottom: 1.69rem; + padding-inline: 1.93rem; +`,xH=f(yH)` + padding-bottom: 1.23rem; + text-align: center; +`,c_=()=>{const{sectionId:e}=bn();return N.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t==null||t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(At.Fragment,{children:[l.jsx(Vr,{cover:lk,subTitle:"达坦科技通过软硬件深度融合的方式,提供高性能存储和高性能网络,打造高性能 AI + Cloud 基础设施平台。",children:"公司"}),l.jsx(wH,{id:"join-us",children:l.jsxs(_H,{children:[l.jsx(xH,{children:"加入我们"}),l.jsx(_z,{}),l.jsx(Nz,{}),l.jsx(Wz,{}),l.jsx(gH,{})]})}),l.jsx(ak,{})]})},SH="/zh-cn/assets/video-demo-cover-6531bf08.png",zc="/zh-cn/assets/arrow-up-right-f6ca128c.svg",bH="/zh-cn/assets/cover1-0f766121.jpg",kH="/zh-cn/assets/cover2-6c924915.jpg",CH="/zh-cn/assets/cover3-a8cadd7b.jpg",DH="/zh-cn/assets/cover4-da59baaf.jpg",EH="/zh-cn/assets/cover5-55104208.jpg",jH="/zh-cn/assets/cover6-bf6d56c4.jpg",TH="/zh-cn/assets/cover7-461ad08e.jpg",RH="/zh-cn/assets/cover8-18bb5252.jpg",AH="/zh-cn/assets/cover9-0cfe7433.jpg",PH="/zh-cn/assets/cover10-7707f5f7.jpg",OH="/zh-cn/assets/cover11-18bf7e52.jpg",LH="/zh-cn/assets/cover12-2ec52bb9.jpg",MH="/zh-cn/assets/cover13-20980f41.jpg",IH="/zh-cn/assets/cover14-6dff9a13.jpg",NH="/zh-cn/assets/cover15-f2819b4b.jpg",VH="/zh-cn/assets/cover16-6b3eea77.jpg",YH="/zh-cn/assets/cover17-2d99b802.jpg",zH="/zh-cn/assets/cover19-9503f8ee.jpg",HH="/zh-cn/assets/cover20-a198bfe8.jpg",FH="/zh-cn/assets/cover21-c1808615.jpg",UH="/zh-cn/assets/cover22-a24d3264.jpg",$H="/zh-cn/assets/cover23-91837162.jpg",BH="/zh-cn/assets/cover24-f34d429f.jpg",WH="/zh-cn/assets/cover25-11f1a4dd.jpg",GH="/zh-cn/assets/cover26-574c835d.jpg",XH="/zh-cn/assets/cover27-cab7b800.jpg",KH="/zh-cn/assets/cover28-61988539.jpg",QH="/zh-cn/assets/cover29-cfa296fc.jpg",qH="/zh-cn/assets/cover30-6bc9e17a.jpg",ZH="/zh-cn/assets/cover31-de17416a.jpg",JH="/zh-cn/assets/cover32-64d8c4cf.jpg",eF="/zh-cn/assets/cover33-747e46a5.jpg",tF="/zh-cn/assets/cover34-b47433e8.jpg",rF="/zh-cn/assets/cover35-474e265e.jpg",nF="/zh-cn/assets/cover40-e2bf253f.jpg",iF="/zh-cn/assets/cover41-56007738.jpg",oF="/zh-cn/assets/cover42-075bcf74.jpg",sF="/zh-cn/assets/cover43-d1896502.jpg",aF="/zh-cn/assets/cover50-2dc33471.jpg",lF="/zh-cn/assets/cover51-235c2ee6.jpg",cF="/zh-cn/assets/cover52-06cc8093.jpg",uF="/zh-cn/assets/cover53-11208fe4.jpg",dF="/zh-cn/assets/cover55-a634f887.jpg",fF=[{key:1,image:bH,title:"Virtio-net相关知识介绍与Rust-for-Linux基本知识",text:"本场workshop由达坦科技李弘宇进行内容分享,主要介绍了Virtio-net相关知识介绍与Rust-for-Linux基本知识。欢迎参加达坦科技DatenLord相关开源项目:https://github.com/datenlord/linux/tree/rust_virtio",date:"2022.08.17",url:"https://www.bilibili.com/video/BV17G4y1a7Bv/"},{key:2,image:kH,title:"roce-sim Workshop分享",text:"本场workshop由达坦科技王恒宇进行内容分享,主要介绍了roce-sim相关知识分享,如果您对这方面有兴趣,欢迎参与达坦科技开源项目:Github链接:https://github.com/datenlord/roce-sim",date:"2022.08.25",url:"https://www.bilibili.com/video/BV1UB4y137Tn/"},{key:3,image:CH,title:"Cocotb Workshop分享",text:"本场workshop由达坦科技DatenLord 翁万正进行内容分享,主要进行了cocotb相关知识介绍。",date:"2022.09.23",url:"https://www.bilibili.com/video/BV19e4y1k7EE/"},{key:4,image:DH,title:"使用Copilot在分布式系统中容忍暂时变慢的节点",text:"本场workshop由达坦科技DatenLord 田野进行内容分享,主要进行了“使用Copilot在分布式系统中容忍暂时变慢的节点“相关知识介绍。",date:"2022.09.30",url:"https://www.bilibili.com/video/BV15e411T7pX/"},{key:5,image:EH,title:"硬件设计的集合方法",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要进行了“硬件设计的集合方法”相关知识介绍。",date:"2022.10.09",url:"https://www.bilibili.com/video/BV1FK411Q7JV/"},{key:6,image:jH,title:"VLSI Sharing",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要进行了VLSI相关知识介绍。",date:"2022.10.15",url:"https://www.bilibili.com/video/BV1bK411Q7GB/"},{key:7,image:TH,title:"Corumdum介绍",text:"本场workshop由西安电子科技大学 ISN网络与交换团队 硕士研究生李钊进行内容分享,主要进行了Corumdum相关知识介绍。",date:"2022.10.16",url:"https://www.bilibili.com/video/BV1qG41177Pq/"},{key:8,image:RH,title:"可编程交换机:原理与使用",text:"本场workshop由上海交通大学IPADS实验室博士二年级 张汉泽进行内容分享,主要进行了“可编程交换机:原理与使用”相关知识分享。可编程交换机由安装包处理规则的控制面与负责高速包处理的数据面构成,两者由一根PCIe总线相连。控制面支持高级语言编程,而数据面逻辑需要用P4语言编写。在可编程交换机上设计系统主要面临数据面内存有限与P4编程模型受限两大挑战。",date:"2022.10.23",url:"https://www.bilibili.com/video/BV1jm4y1w7w3/"},{key:9,image:AH,title:"形式化验证入门",text:"本场workshop由达坦科技DatenLord王璞进行内容分享,主要进行了形式化验证入门相关知识介绍。",date:"2022.10.26",url:"https://www.bilibili.com/video/BV1DG411L78p/"},{key:10,image:PH,title:"利用RDMA加速FaaS服务",text:"本场workshop由达坦科技DatenLord李弘宇进行内容分享,主要进行了“利用RDMA加速FaaS服务”相关知识介绍。",date:"2022.11.06",url:"https://www.bilibili.com/video/BV1et4y1K7Sw/"},{key:11,image:OH,title:"Rust for Linux",text:"本场workshop由苏宇恒进行内容分享,主要进行了“Rust for Linux”相关知识介绍。",date:"2022.11.08",url:"https://www.bilibili.com/video/BV1G8411a7CE/"},{key:12,image:LH,title:"Intel用户态中断",text:"本场workshop由韩明聪进行内容分享,主要进行了“Intel用户态中断”相关知识介绍。",date:"2022.11.08",url:"https://www.bilibili.com/video/BV1tG4y1t7Lg/"},{key:13,image:MH,title:"VLSI DSP Sharing",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要进行了“VLSI DSP Intro”相关知识介绍。",date:"2022.11.11",url:"https://www.bilibili.com/video/BV18P4y1y7iP/"},{key:14,image:IH,title:"DSP Sharing Part2",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要就DSP相关知识进行第二次workshop分享",date:"2022.11.12",url:"https://www.bilibili.com/video/BV1bM411k7YP/"},{key:15,image:NH,title:"eunomia-bpf: 结合 wasm 的 ebpf 轻量级开发框架",text:"本场workshop由浙江大学学生/eunomia-bpf 开发者 郑昱笙进行内容分享,主要内容围绕“eunomia-bpf: 结合 wasm 的 ebpf 轻量级开发框架”相关知识。",date:"2022.11.20",url:"https://www.bilibili.com/video/BV1u84y1C7pQ/"},{key:16,image:VH,title:"RDMA网络拥塞管理架构",text:"本场workshop由北京邮电大学网络与交换国家重点实验室、计算机学院,副研究员、博导:张乙然进行内容分享,主要内容围绕“RDMA网络拥塞管理架构”进行知识介绍。",date:"2022.11.27",url:"https://www.bilibili.com/video/BV1Ve4y1g7gx/"},{key:17,image:YH,title:"使用RDMA加速服务器无感知计算容器启动",text:"本场workshop由上海交通大学助理教授魏星达进行分享,主要内容围绕“使用RDMA加速服务器无感知计算容器启动”进行知识介绍。",date:"2022.12.04",url:"https://www.bilibili.com/video/BV1qG4y1G784/"},{key:19,image:zH,title:"基于智能网卡的数据处理系统",text:"本场workshop由浙江大学百人计划研究员 王则可进行分享,主要内容为“基于智能网卡的数据处理系统”介绍。",date:"2022.12.18",url:"https://www.bilibili.com/video/BV1Eg411J7fJ/"},{key:20,image:HH,title:"异步事件驱动的电路机制 & 基于RISC-V的全异步超标量CPU体系结构",text:"本场workshop由何安平副教授进行分享,主要内容为“异步事件驱动的电路机制 & 基于RISC-V的全异步超标量CPU体系结构”介绍。",date:"2022.12.25",url:"https://www.bilibili.com/video/BV1sA411D7on/"},{key:21,image:FH,title:"使用 TLA+ 为分布式算法验证正确性",text:"本场workshop由达坦科技DatenLord田野进行分享,主要内容为“使用 TLA+ 为分布式算法验证正确性”介绍。",date:"2023.01.09",url:"https://www.bilibili.com/video/BV1pG4y1y7an/"},{key:22,image:UH,title:"喷泉码技术简介",text:"本场workshop由兰州大学信息科学与工程学院副教授、通信工程专业系主任袁磊 进行分享,主要内容为“喷泉码技术简介”介绍。",date:"2023.01.15",url:"https://www.bilibili.com/video/BV1SM411b77k/"},{key:23,image:$H,title:"数据库隔离级别及MVCC",text:"本场workshop由达坦科技DatenLord施继成进行分享,主要内容为“数据库隔离级别及MVCC”介绍。",date:"2023.01.29",url:"https://www.bilibili.com/video/BV1sR4y1b7Cu/"},{key:24,image:BH,title:"互联网传输协议优化研究",text:"本场workshop由中国人民大学副教授李彤教授进行分享,主要内容为“互联网传输协议优化研究”介绍。",date:"2023.02.06",url:"https://www.bilibili.com/video/BV1X84y157vL/"},{key:25,image:WH,title:"高性能RDMA网络协议栈",text:"高性能RDMA网络协议栈是RDMA高性能网络的核心组成部分之一,它提供了支持RDMA技术的网络协议和驱动程序。在本周的前沿科技分享中,我们邀请到了湖南大学信息科学与工程学院的陈果教授来给我们分享高性能RDMA网络协议栈的话题。",date:"2023.02.28",url:"https://www.bilibili.com/video/BV1Y24y1n7Dk/"},{key:26,image:GH,title:"GPU抢占式任务调度",text:"GPU编程可以大幅提升计算速度和效率,从而使得许多计算任务得以在合理时间内完成。随着GPU硬件技术的发展和大规模数据处理需求的增加,GPU编程的应用范围不断扩大。在本周的前沿科技分享中,我们邀请到了上海交通大学并行与分布式研究所的韩明聪博士来给我们分享GPU抢占式任务调度。",date:"2023.03.05",url:"https://www.bilibili.com/video/BV1cY4y1y7ND/"},{key:27,image:XH,title:"聊聊RaptorQ纠错码",text:"喷泉码具有极高的纠错能力,且具有低延迟、地复杂度、高效率等优点,使其在冷存储、分布式存储、无线通信等领域得到广泛应用。达坦科技致力于软硬件融合的解决方案,喷泉码的高效实现在硬件上,作为公司长期的技术储备,在本周的前沿科技分享中,达坦科技的联合创始人兼CTO施继成将为大家分享聊聊 RaptorQ 纠错码 。",date:"2023.03.15",url:"https://www.bilibili.com/video/BV1wL411C7DL/"},{key:28,image:KH,title:"Buddy Compiler 简介和愿景",text:"在本次分享中,中国科学院软件研究所博士生张洪滨将介绍Buddy Compiler 编译流程、协同设计、硬件支持。Buddy Compiler 是领域特定的编译器框架,致力于打造基于 MLIR 和 RISC-V 的软硬件协同设计生态。其目标是实现从 DSL 到 DSA 的编译流程和协同设计,愿景是让领域特定的协同设计不再困难。",date:"2023.03.21",url:"https://www.bilibili.com/video/BV1YT41167GB/"},{key:29,image:QH,title:"新一代计算架构:超异构计算",text:"AGI带来的变化之一是算力将进一步从CPU转到GPU,在本周的前沿技术分享中,我们邀请到了上海矩向科技创始人兼CEO黄朝波为大家分享新一代计算架构:超异构计算。",date:"2023.04.04",url:"https://www.bilibili.com/video/BV1Rm4y1q7Dx/"},{key:30,image:qH,title:"通过Chainsaw设计DSP电路",text:"DSP在数据压缩、编码和加密方面都发挥了重要的作用;SpinalHDL具有更高的抽象层次和更强的表达能力,可以大大简化DSP电路设计的复杂度和提高开发效率;而Chainsaw框架可以在不同的FPGA平台上运行,提高了设计的灵活性和可移植性。在本周的前沿技术分享中,我们邀请到了中山大学在读博士李天瑞为大家分享通过Chainsaw设计DSP电路。",date:"2023.04.18",url:"https://www.bilibili.com/video/BV14o4y1j7bH/"},{key:31,image:ZH,title:"Something About Cache Security",text:"在本周的前沿技术分享中,我们邀请到了浙江大学在读硕士研究生缪晨露为大家分享她在MICRO和HPCA上发表的两篇论文的精华,演讲主题是Something About Cache Security。",date:"2023.04.25",url:"https://www.bilibili.com/video/BV1p24y1F7fN/"},{key:32,image:JH,title:"Rust嵌入式开发生态介绍及入门",text:"在本周的前沿技术分享中,我们邀请到了一位爱好硬件的软件工程师米明恒,来为大家分享Rust嵌入式开发生态介绍及入门。",date:"2023.05.04",url:"https://www.bilibili.com/video/BV1J24y1T7EH/"},{key:33,image:eF,title:"RDMA赋能数据中心/超算中心间远程互联",text:"在本周的前沿技术分享中,我们邀请到了南京大学田臣教授,来为大家分享RDMA赋能数据中心/超算中心间远程互联。",date:"2023.06.04",url:"https://www.bilibili.com/video/BV1cz4y1B7cx/"},{key:34,image:tF,title:"Paper Reading: DPU任务卸载",text:"达坦科技一直在探索用硬件加速做分布式跨云存储,在本周的前沿技术分享中,我们邀请到了中南大学在读博士生卢军,来为大家分享DPU任务卸载的相关研究。",date:"2023.06.17",url:"https://www.bilibili.com/video/BV1R14y1S79T/"},{key:35,image:rF,title:"Rust在物理引擎研发中的应用",text:"在本周的前沿技术分享中,我们邀请到了Motphys CEO崔汉青,来为大家分享Rust在物理引擎研发中的应用。",date:"2023.06.27",url:"https://b23.tv/BZuSvyW"},{key:40,image:nF,title:"基于BSV的RTL仿真加速设计研究",text:"BSV的仿真加速可以提升硬件开发调试的效率。在本周的前沿技术分享中,我们邀请到了梁之杰,来为大家分享基于BSV的RTL仿真加速设计研究。",date:"2023.07.09",url:"https://www.bilibili.com/video/BV1ou411L7Yy/"},{key:41,image:iF,title:"RDMA网络的系统测试方案",text:"在本周的前沿技术分享中,我们邀请到了孔心皓,来为大家分享RDMA 网络的系统测试方案。",date:"2023.07.16",url:"https://www.bilibili.com/video/BV1tz4y147rw/"},{key:42,image:oF,title:"RapidWright技术分享会",text:"在本周的前沿技术分享中,我们邀请到了西南交通大学邸志雄副教授和他的学生向瀚章,来为大家分享开源FPGA设计工具RapidWright技术。",date:"2023.07.28",url:"https://www.bilibili.com/video/BV14z4y1x7a8/"},{key:43,image:sF,title:"基于Karmada实现Kubernetes应用跨集群故障转移",text:"在本周的前沿技术分享中,我们邀请到了开源爱好者,云兴科技软件研发工程师梁远鹏,来为大家分享基于Karmada实现Kubernetes应用跨集群故障转移。",date:"2023.08.01",url:"https://www.bilibili.com/video/BV1rN411Y7aZ/"},{key:50,image:aF,title:"大模型训练和基础设施",text:"在本周的前沿技术分享中,我们邀请到了范一呈,来为大家分享大模型训练和基础设施。",date:"2023.09.01",url:"https://www.bilibili.com/video/BV1ZN4y1R7HP/"},{key:51,image:lF,title:"RustBelt与Rust形式化方法",text:"在本周的前沿技术分享中,我们邀请到了王俊吉,来为大家分享RustBelt与Rust形式化方法。",date:"2023.09.04",url:"https://www.bilibili.com/video/BV1Vw411D7rT/"},{key:52,image:cF,title:"网络的智能该放在哪里:网卡、交换机还是xPU",text:"在本周的前沿技术分享中,我们邀请到了Logenic AI联合创始人、前华为天才少年李博杰,来为大家分享网络的智能该放在哪里:网卡、交换机还是xPU。",date:"2023.09.25",url:"https://www.bilibili.com/video/BV1Kw411Y7Cj/"},{key:53,image:uF,title:"以ARM为镜的RISC-V",text:"在本周的前沿技术分享中,我们邀请到了Logenic AI联合创始人、前华为天才少年李博杰,来为大家分享网络的智能该放在哪里:网卡、交换机还是xPU。",date:"2023.09.25",url:"https://www.bilibili.com/video/BV1Kw411Y7Cj/"},{key:55,image:dF,title:"让大模型在场景中真正落地的产品形态、技术堆栈、交付服务",text:"达坦科技始终致力于打造高性能 Al+ Cloud 基础设施平台,积极推动AI应用的落地。达坦科技通过软硬件深度融合的方式,提供高性能存储和高性能网络。为 AI 应用提供弹性、便利、经济的基础设施服务,以此满足不同行业客户对 AI+Cloud 的需求。在本周的前沿技术分享中,我们邀请到了猴子无限创始人兼CEO尹伯昊,来为大家分享让大模型在场景中真正落地的产品形态、技术堆栈、交付服务。",date:"2024.03.18",url:"https://www.bilibili.com/video/BV1KJ4m187gS/"}],hF="/zh-cn/assets/cover1-42e6189a.jpg",mF="/zh-cn/assets/cover2-af26ed46.jpg",pF="/zh-cn/assets/cover3-9c9d21fa.jpg",gF=[{key:1,image:hF,title:"Xline-跨数据中心一致性的元数据管理",text:"天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。Xline是一款开源分布式KV存储系统,基于Curp共识算法实现,旨在提供跨云元数据管理的功能。相比于传统共识协议Raft或Paxos,Curp在天空计算的场景中有着更好的性能表现。本次分享将聚焦于共识算法,从天空计算的背景和挑战出发,介绍Curp共识算法,以及Revision机制与Curp无序性语义之间的冲突,最后,简述下Xline未来的优化方向。欢迎了解更多关于Xline的信息:Https://github.com/datenlord/Xline",date:"2023.02.09",url:"https://www.bilibili.com/video/BV1XY411q7X8/"},{key:2,image:mF,title:"源码解读:Xline Curp共识协议的设计与实现",text:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源分布式KV存储Xline,针对多数据中心场景,可以实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性。",date:"2023.04.30",url:"https://www.bilibili.com/video/BV1dL411h7YK/"},{key:3,image:pF,title:"Xline的Lease机制与实现",text:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源分布式KV存储Xline,针对多数据中心场景,可以实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性。",date:"2023.06.09",url:"https://www.bilibili.com/video/BV1FX4y1h7X5/"}],vF="/zh-cn/assets/cover1-a1358db9.jpg",yF="/zh-cn/assets/cover2-b899ea12.jpg",wF="/zh-cn/assets/cover3-e0bf4798.jpg",_F="/zh-cn/assets/cover4-15b0b4f1.jpg",xF="/zh-cn/assets/cover5-7c4c2482.jpg",u_="/zh-cn/assets/cover6-1c4d5c5f.jpg",SF="/zh-cn/assets/cover7-4f7454c0.jpg",bF="/zh-cn/assets/cover8-7e30c0fc.jpg",kF="/zh-cn/assets/cover9-e8c86c60.jpg",CF="/zh-cn/assets/cover10-bb13b118.jpg",DF="/zh-cn/assets/cover11-c29e9692.jpg",EF="/zh-cn/assets/cover12-6877e246.jpg",jF="/zh-cn/assets/cover13-5a4d97b0.jpg",TF="/zh-cn/assets/cover14-052a8b36.jpg",RF=[{key:7,image:SF,title:"2022年Rust开发者大会Workshop One:用Rust实现RDMA高性能编程",text:"2022年7月31日,北京达坦科技有限公司获邀参加Rust China大会,并做公司专题workshop。这是本场workshop的第一部分,将为大家介绍如何用Rust实现RDMA高性能编程。",date:"2022.08.03",url:"https://www.bilibili.com/video/BV13e4y1D7Ch/"},{key:8,image:bF,title:"2022年Rust开发者大会Workshop Two:Async RDMA",text:"2022年7月31日,北京达坦科技有限公司获邀参加Rust China大会,并做公司专题workshop。这是第二部分workshop,将为大家介绍Async RDMA。",date:"2022.08.04",url:"https://www.bilibili.com/video/BV1Rh411M7EP/"},{key:9,image:kF,title:"2022年Rust开发者大会Workshop Three:Workshop动手实验环节",text:"2022年7月31日,北京达坦科技有限公司获邀参加Rust China大会,并做公司专题Workshop。这是本场Worshop的第三个部分:workshop动手环节 方便大家体验用Rust构建RDMA应用。",date:"2022.08.04",url:"https://www.bilibili.com/video/BV1oN4y1V7Hn/"},{key:1,image:vF,title:"Rust China Hackathon2022空中路演",text:"由Rust中文社区举办的题为「Rust For Fun」的首届Rust China Hackathon已经顺利完赛。达坦科技作为本届Hackathon的协办方,赞助参与本次企业组赛道。最终获得优胜奖的两支队伍在线上了举办一场空中路演。分享了:他们是如何思考拆解赛题的?在着手设计时碰到哪些难点和挑战?以及最终提交的代码设计思路和亮点。欢迎对Concurrent Indexing感兴趣的伙伴观看本条视频。",date:"2023.01.15",url:"https://www.bilibili.com/video/BV1xY41197Za/"},{key:2,image:yF,title:"4.8 Beijing Rust Meetup|张汉东《理解 Unsafe Rust》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由《Rust 编程之道》作者、Rust 中文社区布道者张汉东老师进行,主题为《理解 Unsafe Rust》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1c24y1A7aK/"},{key:3,image:wF,title:"4.8 Beijing Rust Meetup|冯洋《RUFES》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场由南京大学计算机科学与技术系助理研究员冯洋老师进行《基于实际场景应用分析的Rust库模糊测试技术报告》的演讲分享。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Qo4y1n7tS/"},{key:4,image:_F,title:"4.8 Beijing Rust Meetup|施继成《Rust for Linux 6.2》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由达坦科技联合创始人兼CTO施继成进行,演讲主题是《Rust for Linux 6.2》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Bs4y117Ze/"},{key:5,image:xF,title:"4.8 Beijing Rust Meetup|叶天星《用Rust实现Git传输协议、Git对象解析和数据库存储》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由达坦科技联合创始人兼CTO施继成进行,演讲主题是《Rust for Linux 6.2》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Bs4y117Ze/"},{key:6,image:u_,title:"4.8 Beijing Rust Meetup|茌海《Monoio:一个基于 io-uring 的 Rust Runtime》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由达坦科技联合创始人兼CTO施继成进行,演讲主题是《Rust for Linux 6.2》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Rh411M7EP/"},{key:10,image:CF,title:"如何用Rust写分布式系统",text:"分享会介绍分布式KV Store (Xline) 整体的组成,以及不同组件之间如何去交互。在广域网下的分布式系统如何高效地达成共识,以及分布式系统如何实现容错。",date:"2023.06.24",url:"https://www.bilibili.com/video/BV1Hs4y1r7dD/"},{key:11,image:DF,title:"Building microsecond-scale system with modern networking in Rust",text:"随着新型网络技术,如RDMA的普及,现代分布式应用的延迟降到了毫秒甚至微秒级别。这为构建系统软件带来了新的挑战。Rust的zero-cost抽象及内存管理能力能够为构建新型分布式应用带来新的机遇。我将分享利用Rust在用户态及内核态构建新型系统软件的相关经验,包括如何利用Rust抽象RDMA硬件的底层抽象及如何在内核构建一个毫秒级的容器启动机制。",date:"2023.06.24",url:"https://www.bilibili.com/video/BV1Zo4y1P7Sg/"},{key:12,image:EF,title:"30分钟体验Rust for Linux内核模块开发",text:"本主题会提供构建好的docker开发环境,在30分钟内演示如何使用r4l开发一个简易内核模块,并介绍目前r4l的发展现状。可以自备好电脑现场体验。",date:"2023.06.24",url:"https://www.bilibili.com/video/BV12j411U78o/"},{key:13,image:jF,title:"DatenLord 2023 Hackathon赛题宣讲会",text:"达坦科技基于其跨云分布式文件系统DatenLord项目,结合AI大模型时代背景,搭建了擂台,在此正式向您发出邀约!本次大赛主题为 Explore the Possibilities 赛题深刻有趣,奖品丰厚多样,借此机会您不仅可以尽情施展才华、与来自全国各地优秀的青年才俊们同台PK,更将有机会与优秀的评委教师对话交流。Clock is Ticking!无需犹豫,行动起来吧!",date:"2023.11.25",url:"https://www.bilibili.com/video/BV1su4y157iB/"},{key:14,image:TF,title:"DatenLord Hackathon2023空中路演",text:"DatenLord Hackathon 2023已经顺利完赛。达坦科技基于其跨云分布式文件系统DatenLord项目,结合AI大模型时代背景,搭建了擂台。我们邀请参赛者为DatenLord的极端场景设计并实现缓存 p2p 传输和同步模块。本次空中路演邀请了最终获得优胜奖的两支队伍进行思路分享,包括他们的解题思路,碰到的难点和挑战,以及如何应对的方法和设计亮点。欢迎感兴趣的大家进行观看,有问题也欢迎在评论区进行交流~~不要忘记一键三连哦~~",date:"2024.01.07",url:"https://www.bilibili.com/video/BV1ic411t7Nf/"},{key:15,image:u_,title:"Rust For IC design & Verification: vfw, vhost, terminus",text:"达坦科技始终致力于打造高性能 Al+ Cloud 基础设施平台,积极推动AI应用的落地。达坦科技通过软硬件深度融合的方式,提供高性能存储和高性能网络。为 AI 应用提供弹性、便利、经济的基础设施服务,以此满足不同行业客户对 AI+Cloud 的需求。",date:"2024.08.16",url:"https://www.bilibili.com/video/BV1qPe3ezE94/"}],AF="/zh-cn/assets/cover1-b9371555.jpg",PF="/zh-cn/assets/cover2-41a903e3.jpg",OF="/zh-cn/assets/cover2-41a903e3.jpg",LF="/zh-cn/assets/cover2-41a903e3.jpg",MF="/zh-cn/assets/cover2-41a903e3.jpg",IF="/zh-cn/assets/cover2-41a903e3.jpg",NF="/zh-cn/assets/cover2-41a903e3.jpg",VF="/zh-cn/assets/cover2-41a903e3.jpg",YF="/zh-cn/assets/cover2-41a903e3.jpg",zF="/zh-cn/assets/cover13-a69a12b0.jpg",HF="/zh-cn/assets/cover14-3a97e013.jpg",FF="/zh-cn/assets/cover14-3a97e013.jpg",UF="/zh-cn/assets/cover14-3a97e013.jpg",$F="/zh-cn/assets/cover14-3a97e013.jpg",BF="/zh-cn/assets/cover14-3a97e013.jpg",WF="/zh-cn/assets/cover14-3a97e013.jpg",GF="/zh-cn/assets/cover20-c97bc11b.jpg",XF="/zh-cn/assets/cover21-9f52ba13.jpg",KF="/zh-cn/assets/cover22-187b655a.jpg",QF="/zh-cn/assets/cover23-1e515665.jpg",qF="/zh-cn/assets/cover24-020d0c34.jpg",ZF="/zh-cn/assets/cover25-cb84d871.jpg",JF="/zh-cn/assets/cover26-7a726e97.jpg",eU="/zh-cn/assets/cover27-401eea81.jpg",tU="/zh-cn/assets/cover28-6ddc6bee.jpg",rU="/zh-cn/assets/cover29-0d2deb11.jpg",nU=[{key:1,image:AF,title:"Utilizing SpinalHDL for Large-scale Datapath Design",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的一个workshop:Utilizing SpinalHDL for Large-scale Datapath Design,由李天瑞进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1PM411m7DB/"},{key:2,image:PF,title:"A Network Attached Deep Learning Accelerator for FPGA Clusters",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的三个workshop:A Network Attached Deep Learning Accelerator for FPGA Clusters,由Philipp Kreowsky Justin Knapheide进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1HM411m7mS/"},{key:3,image:OF,title:"Coding a microprogrammed protocol receiver in SpinalHDL",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的五个workshop:Coding a microprogrammed protocol receiver in SpinalHDL,由Michael Meier进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1oK411z7VD/"},{key:4,image:LF,title:"Utilizing SpinalHDL to Accelerate Neuroscience",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的二个workshop:Utilizing SpinalHDL to Accelerate Neuroscience,由Jeff-Ciesielski进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1GG4y1J7gU/"},{key:5,image:MF,title:"SpinalHDL in Computer Architecture Research",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的四个workshop:SpinalHDL in Computer Architecture Research,由Sallar Ahmadi-Pour ( saahm)进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1gA411X7f8/"},{key:6,image:IF,title:"NaxRiscv: A Pipeline/Plugins/SpinalHDL/Scala mix",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第六个workshop:NaxRiscv: A Pipeline/Plugins/SpinalHDL/Scala mix,由Dolu1990进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV13K41167q5/"},{key:7,image:NF,title:"Recent progress on formal verification support on SpinalHDL",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第七个workshop:Recent progress on formal verification support on SpinalHDL,由Xiao Yindong (Readon)进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV1bG411N7fk/"},{key:8,image:VF,title:"SpinalHDL for ASIC",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第八个workshop:SpinalHDL for ASIC,由Sebastien-riou进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV16e4y1L7dV/"},{key:9,image:YF,title:"From Peripheral Plugins to Product documentation",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第九个workshop:From Peripheral Plugins to Product documentation,由Andreas Wallner进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV12v4y1Q7cg/"},{key:13,image:zF,title:"Coroutines Applied to a Tilelink Interconnect Elaboration",text:"SpinalHDL始于2014年,最初是作为VHDL/Verilog的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注。达坦科技联合了SpinalHDL社区,以及四川芯测电子技术有限公司举办了一场题为SpinalHDL的使用和开发经验研讨会,旨在和大家分享SpinalHDL最新的实践、挑战和经验的分享。本视频为Workshop的第一部分,由Charles Popen进行分享。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1Vz4y1J7ck/"},{key:14,image:HF,title:"RISC-V敏捷硬件开发-软件定义芯片",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第一个分享《RISC-V敏捷硬件开发-软件定义芯片》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV1Qh4y1K7pH/"},{key:15,image:FF,title:"香山处理器与敏捷开发工具链的最新进展",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第二个分享《香山处理器与敏捷开发工具链的最新进展》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV1Dz4y1T7V6/"},{key:16,image:UF,title:"数据流式编程在硬件设计中的应用",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第三个分享《数据流式编程在硬件设计中的应用》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV12N411B7TN/"},{key:17,image:$F,title:"EDA创新推动敏捷芯片设计",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第四个分享《EDA创新推动敏捷芯片设计》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV1Tz4y1M7vt/"},{key:18,image:BF,title:"Automated CPU design with AI",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第五个分享《Automated CPU design with AI》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV13w411Q7zi/"},{key:19,image:WF,title:"MetaHVL硬件敏捷验证与协同仿真",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第六个分享《MetaHVL硬件敏捷验证与协同仿》。",date:"2023.08.26",url:"https://www.bilibili.com/video/BV1DN4y197Pm/"},{key:20,image:GF,title:"计算机体系结构MIT课程学习社区经验分享",text:"在2023年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。本场分享主题为【计算机体系结构MIT课程学习社区经验分享】,旨在了解学习社区各位同学学习的状态和面临的挑战,邀请已完成课程的学员分享学习和动手操作LAB的经验和教训,以此更好地辅助大家完成课程。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1cs4y1r7T3/"},{key:21,image:XF,title:"计算机体系结构 l MIT课程学习新手上路宣讲",text:"达坦科技在2023年始,发起成立计算机体系结构- MIT课程学习社区,号召感兴趣的工程师和同学系统地学习计算机体系结构相关知识,并且通过动手项目来验证学习的成果。为此,达坦科技软硬件联合开发工程师米明恒在2023年9月23日(周六)上午10:30为大家带来了一场计算机体系结构 l MIT课程学习新手上路宣讲。",date:"2023.09.24",url:"https://www.bilibili.com/video/BV1u8411i7Qw/"},{key:22,image:KF,title:"Stream Transaction Extender设计与验证",text:"达坦科技联合了SpinalHDL社区,以及四川芯测电子技术有限公司举办了一场题为SpinalHDL的使用和开发经验研讨会,旨在和大家分享SpinalHDL最新的实践、挑战和经验的分享。本视频为Workshop的第二部分,由电子科技大学副教授肖寅东(Readon)进行分享。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1pM4y1j7Lm/"},{key:23,image:QF,title:"面向Multi-Die FPGA的设计与部署自动化方法探索",text:"达坦科技联合了SpinalHDL社区,以及四川芯测电子技术有限公司举办了一场题为SpinalHDL的使用和开发经验研讨会,旨在和大家分享SpinalHDL最新的实践、挑战和经验的分享。本视频为Workshop的第三部分,由西安交通大学副教授邸志雄进行分享。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1og4y1c7RS/"},{key:24,image:qF,title:"Get Started with SpinalHDL with a Simplified Setup",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办了 《2023 SpinalHDL应用前景探索》的线上研讨会,这是研讨会第一个视频,Get Started with SpinalHDL with a Simplified Setup",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1TW4y1F7uQ/"},{key:25,image:ZF,title:"Some Tips on Using Memory Black Box in SpinalHDL",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第二个视频,由yportne13带来“Some Tips on Using Memory Black Box in SpinalHDL”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1LC4y1g7c7/"},{key:26,image:JF,title:"Pipelining API Introduction",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第三个视频,由Charles Papon带来“Pipelining API Introduction”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Zj411n7SC/"},{key:27,image:eU,title:"SpinalHDL Intro for New Users",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第四个视频,由Andreas Wallner带来“SpinalHDL Intro for New Users”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Mw41147aS/"},{key:28,image:tU,title:"Pcie Brief Introduction",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第五个视频,由Chenbo带来“Pcie Brief Introduction”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Mw41147aS/"},{key:29,image:rU,title:"The J1Sc Family",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第六个视频,由Christopher Lozinsk带来“The J1Sc Family”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Jc411o7A6/"}],{Heading:iU,Paragraph:oU}=Ye,{CNHead4:sU,CNTitleLarge:aU}=iU,{CNMarkSmall:lU,CNBodySmall:cU}=oU,Hc=new Map([["tech-talk",{label:"前沿科技分享",description:"探索前沿技术,拥抱创新与改变",list:fF,recommend:27}],["oss-showcase",{label:"开源产品分享",description:"软硬件融合创新实践的观察与输出",list:gF,recommend:2}],["rust-showcase",{label:"Rust语言应用及案例分享",description:"Rust编程语言的应用、实践与探索",list:RF,recommend:12}],["hardware-acceleration",{label:"硬件加速",description:"硬件加速领域的实践、经验与挑战",list:nU,recommend:21}]]),uU=f.main``,dU=f.div` + max-width: 1440px; + margin-inline: auto; + padding: 1rem 1.76rem 1.68rem; +`,am=f.section` + padding-bottom: 0.84rem; + &:last-child { + padding-bottom: 0; + } +`,lm=f(sU)` + padding-bottom: 0.48rem; + text-align: center; +`,fU=f.div` + display: grid; + grid-template-rows: repeat(2, 1fr); + grid-template-columns: repeat(2, 1fr); + grid-gap: 0.29rem; +`,hU=f.div` + display: grid; + grid-template-columns: repeat(3, 1fr); + grid-gap: 0.43rem 0.29rem; +`,hk=f.div` + display: flex; + flex-direction: column; +`,mU=f(hk)` + display: flex; + flex-direction: column; + grid-area: 1 / 1 / 3 / 2; +`,pU=f.div` + display: flex; + justify-content: space-between; + height: 100%; +`,gU=f.div``,d_=f.img` + display: block; + width: 100%; + border-radius: 0.06rem; +`,vU=f.img` + display: block; + width: 50%; + height: min-content; + border-radius: 0.06rem; +`,yU=f.img` + float: left; + width: 50%; + padding-right: 0.21rem; + padding-bottom: 0.21rem; + border-radius: 0.06rem; +`,f_=f.div` + padding-top: 0.29rem; +`,wU=f.div` + width: 47%; +`,Fc=f(lU)` + padding-bottom: 0.11rem; + color: ${e=>e.theme.secondary01}; +`,Uc=f.div` + display: flex; + justify-content: space-between; + align-items: center; + padding-bottom: 0.11rem; + color: #1a1a1a; + &:hover { + color: #531dab; + } +`,$c=f(aU)``,Bc=f.img` + width: 0.215rem; + height: 0.215rem; +`,Wc=f(cU)` + color: #667085; +`,Gc=()=>{var a,c,d,h;const t=si().pathname.split("/").join(""),r=(a=Hc.get(t))==null?void 0:a.label,n=(c=Hc.get(t))==null?void 0:c.description,i=(d=Hc.get(t))==null?void 0:d.list.reverse(),o=(h=Hc.get(t))==null?void 0:h.recommend;return N.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsxs(At.Fragment,{children:[l.jsx(Vr,{cover:SH,subTitle:n,children:r}),l.jsx(uU,{children:l.jsxs(dU,{children:[l.jsxs(am,{children:[l.jsx(lm,{children:"最新视频"}),l.jsx(fU,{children:i&&i.map(({key:g,image:v,date:y,title:S,text:C,url:D},T)=>T===0?l.jsxs(mU,{children:[l.jsx(d_,{src:v}),l.jsxs(f_,{children:[l.jsx(Fc,{children:y}),l.jsxs(Uc,{as:Oc,to:D,children:[l.jsx($c,{children:S}),l.jsx(Bc,{src:zc})]}),l.jsx(Wc,{children:C})]})]},g):T<3?l.jsxs(gU,{children:[l.jsx(yU,{src:v}),l.jsx(Fc,{children:y}),l.jsxs(Uc,{as:Oc,to:D,children:[l.jsx($c,{children:S}),l.jsx(Bc,{src:zc})]}),l.jsx(Wc,{children:C})]},T):null)})]}),l.jsxs(am,{children:[l.jsx(lm,{children:"推荐视频"}),i&&i.map(({key:g,image:v,date:y,title:S,text:C,url:D})=>{if(g===o)return l.jsxs(pU,{children:[l.jsx(vU,{src:v}),l.jsxs(wU,{children:[l.jsx(Fc,{children:y}),l.jsxs(Uc,{as:Oc,to:D,children:[l.jsx($c,{children:S}),l.jsx(Bc,{src:zc})]}),l.jsx(Wc,{children:C})]})]},g)})]}),l.jsxs(am,{children:[l.jsx(lm,{children:"全部视频"}),l.jsx(hU,{children:i&&i.map(({key:g,image:v,date:y,title:S,text:C,url:D})=>l.jsxs(hk,{children:[l.jsx(d_,{src:v}),l.jsxs(f_,{children:[l.jsx(Fc,{children:y}),l.jsxs(Uc,{as:Oc,to:D,children:[l.jsx($c,{children:S}),l.jsx(Bc,{src:zc})]}),l.jsx(Wc,{children:C})]})]},g))})]})]})})]})};//! moment.js +//! version : 2.30.1 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com +var mk;function X(){return mk.apply(null,arguments)}function _U(e){mk=e}function on(e){return e instanceof Array||Object.prototype.toString.call(e)==="[object Array]"}function ko(e){return e!=null&&Object.prototype.toString.call(e)==="[object Object]"}function Me(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function lv(e){if(Object.getOwnPropertyNames)return Object.getOwnPropertyNames(e).length===0;var t;for(t in e)if(Me(e,t))return!1;return!0}function sr(e){return e===void 0}function ri(e){return typeof e=="number"||Object.prototype.toString.call(e)==="[object Number]"}function Gl(e){return e instanceof Date||Object.prototype.toString.call(e)==="[object Date]"}function pk(e,t){var r=[],n,i=e.length;for(n=0;n>>0,n;for(n=0;n0)for(r=0;r=0;return(o?r?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+n}var fv=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,Xc=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,um={},Ls={};function de(e,t,r,n){var i=n;typeof n=="string"&&(i=function(){return this[n]()}),e&&(Ls[e]=i),t&&(Ls[t[0]]=function(){return xn(i.apply(this,arguments),t[1],t[2])}),r&&(Ls[r]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function CU(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function DU(e){var t=e.match(fv),r,n;for(r=0,n=t.length;r=0&&Xc.test(e);)e=e.replace(Xc,n),Xc.lastIndex=0,r-=1;return e}var EU={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function jU(e){var t=this._longDateFormat[e],r=this._longDateFormat[e.toUpperCase()];return t||!r?t:(this._longDateFormat[e]=r.match(fv).map(function(n){return n==="MMMM"||n==="MM"||n==="DD"||n==="dddd"?n.slice(1):n}).join(""),this._longDateFormat[e])}var TU="Invalid date";function RU(){return this._invalidDate}var AU="%d",PU=/\d{1,2}/;function OU(e){return this._ordinal.replace("%d",e)}var LU={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function MU(e,t,r,n){var i=this._relativeTime[r];return Dn(i)?i(e,t,r,n):i.replace(/%d/i,e)}function IU(e,t){var r=this._relativeTime[e>0?"future":"past"];return Dn(r)?r(t):r.replace(/%s/i,t)}var p_={D:"date",dates:"date",date:"date",d:"day",days:"day",day:"day",e:"weekday",weekdays:"weekday",weekday:"weekday",E:"isoWeekday",isoweekdays:"isoWeekday",isoweekday:"isoWeekday",DDD:"dayOfYear",dayofyears:"dayOfYear",dayofyear:"dayOfYear",h:"hour",hours:"hour",hour:"hour",ms:"millisecond",milliseconds:"millisecond",millisecond:"millisecond",m:"minute",minutes:"minute",minute:"minute",M:"month",months:"month",month:"month",Q:"quarter",quarters:"quarter",quarter:"quarter",s:"second",seconds:"second",second:"second",gg:"weekYear",weekyears:"weekYear",weekyear:"weekYear",GG:"isoWeekYear",isoweekyears:"isoWeekYear",isoweekyear:"isoWeekYear",w:"week",weeks:"week",week:"week",W:"isoWeek",isoweeks:"isoWeek",isoweek:"isoWeek",y:"year",years:"year",year:"year"};function zr(e){return typeof e=="string"?p_[e]||p_[e.toLowerCase()]:void 0}function hv(e){var t={},r,n;for(n in e)Me(e,n)&&(r=zr(n),r&&(t[r]=e[n]));return t}var NU={date:9,day:11,weekday:11,isoWeekday:11,dayOfYear:4,hour:13,millisecond:16,minute:14,month:8,quarter:7,second:15,weekYear:1,isoWeekYear:1,week:5,isoWeek:5,year:1};function VU(e){var t=[],r;for(r in e)Me(e,r)&&t.push({unit:r,priority:NU[r]});return t.sort(function(n,i){return n.priority-i.priority}),t}var wk=/\d/,Er=/\d\d/,_k=/\d{3}/,mv=/\d{4}/,bf=/[+-]?\d{6}/,nt=/\d\d?/,xk=/\d\d\d\d?/,Sk=/\d\d\d\d\d\d?/,kf=/\d{1,3}/,pv=/\d{1,4}/,Cf=/[+-]?\d{1,6}/,sa=/\d+/,Df=/[+-]?\d+/,YU=/Z|[+-]\d\d:?\d\d/gi,Ef=/Z|[+-]\d\d(?::?\d\d)?/gi,zU=/[+-]?\d+(\.\d{1,3})?/,Kl=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,aa=/^[1-9]\d?/,gv=/^([1-9]\d|\d)/,ad;ad={};function se(e,t,r){ad[e]=Dn(t)?t:function(n,i){return n&&r?r:t}}function HU(e,t){return Me(ad,e)?ad[e](t._strict,t._locale):new RegExp(FU(e))}function FU(e){return Qn(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,r,n,i,o){return r||n||i||o}))}function Qn(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function Ar(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function Ce(e){var t=+e,r=0;return t!==0&&isFinite(t)&&(r=Ar(t)),r}var m0={};function We(e,t){var r,n=t,i;for(typeof e=="string"&&(e=[e]),ri(t)&&(n=function(o,a){a[t]=Ce(o)}),i=e.length,r=0;r68?1900:2e3)};var bk=la("FullYear",!0);function WU(){return jf(this.year())}function la(e,t){return function(r){return r!=null?(kk(this,e,r),X.updateOffset(this,t),this):Rl(this,e)}}function Rl(e,t){if(!e.isValid())return NaN;var r=e._d,n=e._isUTC;switch(t){case"Milliseconds":return n?r.getUTCMilliseconds():r.getMilliseconds();case"Seconds":return n?r.getUTCSeconds():r.getSeconds();case"Minutes":return n?r.getUTCMinutes():r.getMinutes();case"Hours":return n?r.getUTCHours():r.getHours();case"Date":return n?r.getUTCDate():r.getDate();case"Day":return n?r.getUTCDay():r.getDay();case"Month":return n?r.getUTCMonth():r.getMonth();case"FullYear":return n?r.getUTCFullYear():r.getFullYear();default:return NaN}}function kk(e,t,r){var n,i,o,a,c;if(!(!e.isValid()||isNaN(r))){switch(n=e._d,i=e._isUTC,t){case"Milliseconds":return void(i?n.setUTCMilliseconds(r):n.setMilliseconds(r));case"Seconds":return void(i?n.setUTCSeconds(r):n.setSeconds(r));case"Minutes":return void(i?n.setUTCMinutes(r):n.setMinutes(r));case"Hours":return void(i?n.setUTCHours(r):n.setHours(r));case"Date":return void(i?n.setUTCDate(r):n.setDate(r));case"FullYear":break;default:return}o=r,a=e.month(),c=e.date(),c=c===29&&a===1&&!jf(o)?28:c,i?n.setUTCFullYear(o,a,c):n.setFullYear(o,a,c)}}function GU(e){return e=zr(e),Dn(this[e])?this[e]():this}function XU(e,t){if(typeof e=="object"){e=hv(e);var r=VU(e),n,i=r.length;for(n=0;n=0?(c=new Date(e+400,t,r,n,i,o,a),isFinite(c.getFullYear())&&c.setFullYear(e)):c=new Date(e,t,r,n,i,o,a),c}function Al(e){var t,r;return e<100&&e>=0?(r=Array.prototype.slice.call(arguments),r[0]=e+400,t=new Date(Date.UTC.apply(null,r)),isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e)):t=new Date(Date.UTC.apply(null,arguments)),t}function ld(e,t,r){var n=7+t-r,i=(7+Al(e,0,n).getUTCDay()-t)%7;return-i+n-1}function Rk(e,t,r,n,i){var o=(7+r-n)%7,a=ld(e,n,i),c=1+7*(t-1)+o+a,d,h;return c<=0?(d=e-1,h=nl(d)+c):c>nl(e)?(d=e+1,h=c-nl(e)):(d=e,h=c),{year:d,dayOfYear:h}}function Pl(e,t,r){var n=ld(e.year(),t,r),i=Math.floor((e.dayOfYear()-n-1)/7)+1,o,a;return i<1?(a=e.year()-1,o=i+qn(a,t,r)):i>qn(e.year(),t,r)?(o=i-qn(e.year(),t,r),a=e.year()+1):(a=e.year(),o=i),{week:o,year:a}}function qn(e,t,r){var n=ld(e,t,r),i=ld(e+1,t,r);return(nl(e)-n+i)/7}de("w",["ww",2],"wo","week");de("W",["WW",2],"Wo","isoWeek");se("w",nt,aa);se("ww",nt,Er);se("W",nt,aa);se("WW",nt,Er);Ql(["w","ww","W","WW"],function(e,t,r,n){t[n.substr(0,1)]=Ce(e)});function a$(e){return Pl(e,this._week.dow,this._week.doy).week}var l$={dow:0,doy:6};function c$(){return this._week.dow}function u$(){return this._week.doy}function d$(e){var t=this.localeData().week(this);return e==null?t:this.add((e-t)*7,"d")}function f$(e){var t=Pl(this,1,4).week;return e==null?t:this.add((e-t)*7,"d")}de("d",0,"do","day");de("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)});de("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)});de("dddd",0,0,function(e){return this.localeData().weekdays(this,e)});de("e",0,0,"weekday");de("E",0,0,"isoWeekday");se("d",nt);se("e",nt);se("E",nt);se("dd",function(e,t){return t.weekdaysMinRegex(e)});se("ddd",function(e,t){return t.weekdaysShortRegex(e)});se("dddd",function(e,t){return t.weekdaysRegex(e)});Ql(["dd","ddd","dddd"],function(e,t,r,n){var i=r._locale.weekdaysParse(e,n,r._strict);i!=null?t.d=i:ye(r).invalidWeekday=e});Ql(["d","e","E"],function(e,t,r,n){t[n]=Ce(e)});function h$(e,t){return typeof e!="string"?e:isNaN(e)?(e=t.weekdaysParse(e),typeof e=="number"?e:null):parseInt(e,10)}function m$(e,t){return typeof e=="string"?t.weekdaysParse(e)%7||7:isNaN(e)?null:e}function yv(e,t){return e.slice(t,7).concat(e.slice(0,t))}var p$="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Ak="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),g$="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),v$=Kl,y$=Kl,w$=Kl;function _$(e,t){var r=on(this._weekdays)?this._weekdays:this._weekdays[e&&e!==!0&&this._weekdays.isFormat.test(t)?"format":"standalone"];return e===!0?yv(r,this._week.dow):e?r[e.day()]:r}function x$(e){return e===!0?yv(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort}function S$(e){return e===!0?yv(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin}function b$(e,t,r){var n,i,o,a=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],n=0;n<7;++n)o=Cn([2e3,1]).day(n),this._minWeekdaysParse[n]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[n]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[n]=this.weekdays(o,"").toLocaleLowerCase();return r?t==="dddd"?(i=_t.call(this._weekdaysParse,a),i!==-1?i:null):t==="ddd"?(i=_t.call(this._shortWeekdaysParse,a),i!==-1?i:null):(i=_t.call(this._minWeekdaysParse,a),i!==-1?i:null):t==="dddd"?(i=_t.call(this._weekdaysParse,a),i!==-1||(i=_t.call(this._shortWeekdaysParse,a),i!==-1)?i:(i=_t.call(this._minWeekdaysParse,a),i!==-1?i:null)):t==="ddd"?(i=_t.call(this._shortWeekdaysParse,a),i!==-1||(i=_t.call(this._weekdaysParse,a),i!==-1)?i:(i=_t.call(this._minWeekdaysParse,a),i!==-1?i:null)):(i=_t.call(this._minWeekdaysParse,a),i!==-1||(i=_t.call(this._weekdaysParse,a),i!==-1)?i:(i=_t.call(this._shortWeekdaysParse,a),i!==-1?i:null))}function k$(e,t,r){var n,i,o;if(this._weekdaysParseExact)return b$.call(this,e,t,r);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),n=0;n<7;n++){if(i=Cn([2e3,1]).day(n),r&&!this._fullWeekdaysParse[n]&&(this._fullWeekdaysParse[n]=new RegExp("^"+this.weekdays(i,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[n]=new RegExp("^"+this.weekdaysShort(i,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[n]=new RegExp("^"+this.weekdaysMin(i,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[n]||(o="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[n]=new RegExp(o.replace(".",""),"i")),r&&t==="dddd"&&this._fullWeekdaysParse[n].test(e))return n;if(r&&t==="ddd"&&this._shortWeekdaysParse[n].test(e))return n;if(r&&t==="dd"&&this._minWeekdaysParse[n].test(e))return n;if(!r&&this._weekdaysParse[n].test(e))return n}}function C$(e){if(!this.isValid())return e!=null?this:NaN;var t=Rl(this,"Day");return e!=null?(e=h$(e,this.localeData()),this.add(e-t,"d")):t}function D$(e){if(!this.isValid())return e!=null?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return e==null?t:this.add(e-t,"d")}function E$(e){if(!this.isValid())return e!=null?this:NaN;if(e!=null){var t=m$(e,this.localeData());return this.day(this.day()%7?t:t-7)}else return this.day()||7}function j$(e){return this._weekdaysParseExact?(Me(this,"_weekdaysRegex")||wv.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(Me(this,"_weekdaysRegex")||(this._weekdaysRegex=v$),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)}function T$(e){return this._weekdaysParseExact?(Me(this,"_weekdaysRegex")||wv.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(Me(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=y$),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function R$(e){return this._weekdaysParseExact?(Me(this,"_weekdaysRegex")||wv.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(Me(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=w$),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function wv(){function e(g,v){return v.length-g.length}var t=[],r=[],n=[],i=[],o,a,c,d,h;for(o=0;o<7;o++)a=Cn([2e3,1]).day(o),c=Qn(this.weekdaysMin(a,"")),d=Qn(this.weekdaysShort(a,"")),h=Qn(this.weekdays(a,"")),t.push(c),r.push(d),n.push(h),i.push(c),i.push(d),i.push(h);t.sort(e),r.sort(e),n.sort(e),i.sort(e),this._weekdaysRegex=new RegExp("^("+i.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+n.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+r.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+t.join("|")+")","i")}function _v(){return this.hours()%12||12}function A$(){return this.hours()||24}de("H",["HH",2],0,"hour");de("h",["hh",2],0,_v);de("k",["kk",2],0,A$);de("hmm",0,0,function(){return""+_v.apply(this)+xn(this.minutes(),2)});de("hmmss",0,0,function(){return""+_v.apply(this)+xn(this.minutes(),2)+xn(this.seconds(),2)});de("Hmm",0,0,function(){return""+this.hours()+xn(this.minutes(),2)});de("Hmmss",0,0,function(){return""+this.hours()+xn(this.minutes(),2)+xn(this.seconds(),2)});function Pk(e,t){de(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}Pk("a",!0);Pk("A",!1);function Ok(e,t){return t._meridiemParse}se("a",Ok);se("A",Ok);se("H",nt,gv);se("h",nt,aa);se("k",nt,aa);se("HH",nt,Er);se("hh",nt,Er);se("kk",nt,Er);se("hmm",xk);se("hmmss",Sk);se("Hmm",xk);se("Hmmss",Sk);We(["H","HH"],jt);We(["k","kk"],function(e,t,r){var n=Ce(e);t[jt]=n===24?0:n});We(["a","A"],function(e,t,r){r._isPm=r._locale.isPM(e),r._meridiem=e});We(["h","hh"],function(e,t,r){t[jt]=Ce(e),ye(r).bigHour=!0});We("hmm",function(e,t,r){var n=e.length-2;t[jt]=Ce(e.substr(0,n)),t[Jr]=Ce(e.substr(n)),ye(r).bigHour=!0});We("hmmss",function(e,t,r){var n=e.length-4,i=e.length-2;t[jt]=Ce(e.substr(0,n)),t[Jr]=Ce(e.substr(n,2)),t[Gn]=Ce(e.substr(i)),ye(r).bigHour=!0});We("Hmm",function(e,t,r){var n=e.length-2;t[jt]=Ce(e.substr(0,n)),t[Jr]=Ce(e.substr(n))});We("Hmmss",function(e,t,r){var n=e.length-4,i=e.length-2;t[jt]=Ce(e.substr(0,n)),t[Jr]=Ce(e.substr(n,2)),t[Gn]=Ce(e.substr(i))});function P$(e){return(e+"").toLowerCase().charAt(0)==="p"}var O$=/[ap]\.?m?\.?/i,L$=la("Hours",!0);function M$(e,t,r){return e>11?r?"pm":"PM":r?"am":"AM"}var Lk={calendar:bU,longDateFormat:EU,invalidDate:TU,ordinal:AU,dayOfMonthOrdinalParse:PU,relativeTime:LU,months:QU,monthsShort:Ck,week:l$,weekdays:p$,weekdaysMin:g$,weekdaysShort:Ak,meridiemParse:O$},st={},Ia={},Ol;function I$(e,t){var r,n=Math.min(e.length,t.length);for(r=0;r0;){if(i=Tf(o.slice(0,r).join("-")),i)return i;if(n&&n.length>=r&&I$(o,n)>=r-1)break;r--}t++}return Ol}function V$(e){return!!(e&&e.match("^[^/\\\\]*$"))}function Tf(e){var t=null,r;if(st[e]===void 0&&typeof wu<"u"&&wu&&wu.exports&&V$(e))try{t=Ol._abbr,r=require,r("./locale/"+e),Ui(t)}catch{st[e]=null}return st[e]}function Ui(e,t){var r;return e&&(sr(t)?r=ai(e):r=xv(e,t),r?Ol=r:typeof console<"u"&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),Ol._abbr}function xv(e,t){if(t!==null){var r,n=Lk;if(t.abbr=e,st[e]!=null)vk("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),n=st[e]._config;else if(t.parentLocale!=null)if(st[t.parentLocale]!=null)n=st[t.parentLocale]._config;else if(r=Tf(t.parentLocale),r!=null)n=r._config;else return Ia[t.parentLocale]||(Ia[t.parentLocale]=[]),Ia[t.parentLocale].push({name:e,config:t}),null;return st[e]=new dv(f0(n,t)),Ia[e]&&Ia[e].forEach(function(i){xv(i.name,i.config)}),Ui(e),st[e]}else return delete st[e],null}function Y$(e,t){if(t!=null){var r,n,i=Lk;st[e]!=null&&st[e].parentLocale!=null?st[e].set(f0(st[e]._config,t)):(n=Tf(e),n!=null&&(i=n._config),t=f0(i,t),n==null&&(t.abbr=e),r=new dv(t),r.parentLocale=st[e],st[e]=r),Ui(e)}else st[e]!=null&&(st[e].parentLocale!=null?(st[e]=st[e].parentLocale,e===Ui()&&Ui(e)):st[e]!=null&&delete st[e]);return st[e]}function ai(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return Ol;if(!on(e)){if(t=Tf(e),t)return t;e=[e]}return N$(e)}function z$(){return h0(st)}function Sv(e){var t,r=e._a;return r&&ye(e).overflow===-2&&(t=r[Wn]<0||r[Wn]>11?Wn:r[gn]<1||r[gn]>vv(r[$t],r[Wn])?gn:r[jt]<0||r[jt]>24||r[jt]===24&&(r[Jr]!==0||r[Gn]!==0||r[_o]!==0)?jt:r[Jr]<0||r[Jr]>59?Jr:r[Gn]<0||r[Gn]>59?Gn:r[_o]<0||r[_o]>999?_o:-1,ye(e)._overflowDayOfYear&&(t<$t||t>gn)&&(t=gn),ye(e)._overflowWeeks&&t===-1&&(t=$U),ye(e)._overflowWeekday&&t===-1&&(t=BU),ye(e).overflow=t),e}var H$=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,F$=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,U$=/Z|[+-]\d\d(?::?\d\d)?/,Kc=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],dm=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],$$=/^\/?Date\((-?\d+)/i,B$=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,W$={UT:0,GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function Mk(e){var t,r,n=e._i,i=H$.exec(n)||F$.exec(n),o,a,c,d,h=Kc.length,g=dm.length;if(i){for(ye(e).iso=!0,t=0,r=h;tnl(a)||e._dayOfYear===0)&&(ye(e)._overflowDayOfYear=!0),r=Al(a,0,e._dayOfYear),e._a[Wn]=r.getUTCMonth(),e._a[gn]=r.getUTCDate()),t=0;t<3&&e._a[t]==null;++t)e._a[t]=n[t]=i[t];for(;t<7;t++)e._a[t]=n[t]=e._a[t]==null?t===2?1:0:e._a[t];e._a[jt]===24&&e._a[Jr]===0&&e._a[Gn]===0&&e._a[_o]===0&&(e._nextDay=!0,e._a[jt]=0),e._d=(e._useUTC?Al:s$).apply(null,n),o=e._useUTC?e._d.getUTCDay():e._d.getDay(),e._tzm!=null&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[jt]=24),e._w&&typeof e._w.d<"u"&&e._w.d!==o&&(ye(e).weekdayMismatch=!0)}}function eB(e){var t,r,n,i,o,a,c,d,h;t=e._w,t.GG!=null||t.W!=null||t.E!=null?(o=1,a=4,r=ds(t.GG,e._a[$t],Pl(rt(),1,4).year),n=ds(t.W,1),i=ds(t.E,1),(i<1||i>7)&&(d=!0)):(o=e._locale._week.dow,a=e._locale._week.doy,h=Pl(rt(),o,a),r=ds(t.gg,e._a[$t],h.year),n=ds(t.w,h.week),t.d!=null?(i=t.d,(i<0||i>6)&&(d=!0)):t.e!=null?(i=t.e+o,(t.e<0||t.e>6)&&(d=!0)):i=o),n<1||n>qn(r,o,a)?ye(e)._overflowWeeks=!0:d!=null?ye(e)._overflowWeekday=!0:(c=Rk(r,n,i,o,a),e._a[$t]=c.year,e._dayOfYear=c.dayOfYear)}X.ISO_8601=function(){};X.RFC_2822=function(){};function kv(e){if(e._f===X.ISO_8601){Mk(e);return}if(e._f===X.RFC_2822){Ik(e);return}e._a=[],ye(e).empty=!0;var t=""+e._i,r,n,i,o,a,c=t.length,d=0,h,g;for(i=yk(e._f,e._locale).match(fv)||[],g=i.length,r=0;r0&&ye(e).unusedInput.push(a),t=t.slice(t.indexOf(n)+n.length),d+=n.length),Ls[o]?(n?ye(e).empty=!1:ye(e).unusedTokens.push(o),UU(o,n,e)):e._strict&&!n&&ye(e).unusedTokens.push(o);ye(e).charsLeftOver=c-d,t.length>0&&ye(e).unusedInput.push(t),e._a[jt]<=12&&ye(e).bigHour===!0&&e._a[jt]>0&&(ye(e).bigHour=void 0),ye(e).parsedDateParts=e._a.slice(0),ye(e).meridiem=e._meridiem,e._a[jt]=tB(e._locale,e._a[jt],e._meridiem),h=ye(e).era,h!==null&&(e._a[$t]=e._locale.erasConvertYear(h,e._a[$t])),bv(e),Sv(e)}function tB(e,t,r){var n;return r==null?t:e.meridiemHour!=null?e.meridiemHour(t,r):(e.isPM!=null&&(n=e.isPM(r),n&&t<12&&(t+=12),!n&&t===12&&(t=0)),t)}function rB(e){var t,r,n,i,o,a,c=!1,d=e._f.length;if(d===0){ye(e).invalidFormat=!0,e._d=new Date(NaN);return}for(i=0;ithis?this:e:Sf()});function Yk(e,t){var r,n;if(t.length===1&&on(t[0])&&(t=t[0]),!t.length)return rt();for(r=t[0],n=1;nthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function bB(){if(!sr(this._isDSTShifted))return this._isDSTShifted;var e={},t;return uv(e,this),e=Nk(e),e._a?(t=e._isUTC?Cn(e._a):rt(e._a),this._isDSTShifted=this.isValid()&&mB(e._a,t.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function kB(){return this.isValid()?!this._isUTC:!1}function CB(){return this.isValid()?this._isUTC:!1}function Hk(){return this.isValid()?this._isUTC&&this._offset===0:!1}var DB=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,EB=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function an(e,t){var r=e,n=null,i,o,a;return vu(e)?r={ms:e._milliseconds,d:e._days,M:e._months}:ri(e)||!isNaN(+e)?(r={},t?r[t]=+e:r.milliseconds=+e):(n=DB.exec(e))?(i=n[1]==="-"?-1:1,r={y:0,d:Ce(n[gn])*i,h:Ce(n[jt])*i,m:Ce(n[Jr])*i,s:Ce(n[Gn])*i,ms:Ce(p0(n[_o]*1e3))*i}):(n=EB.exec(e))?(i=n[1]==="-"?-1:1,r={y:lo(n[2],i),M:lo(n[3],i),w:lo(n[4],i),d:lo(n[5],i),h:lo(n[6],i),m:lo(n[7],i),s:lo(n[8],i)}):r==null?r={}:typeof r=="object"&&("from"in r||"to"in r)&&(a=jB(rt(r.from),rt(r.to)),r={},r.ms=a.milliseconds,r.M=a.months),o=new Rf(r),vu(e)&&Me(e,"_locale")&&(o._locale=e._locale),vu(e)&&Me(e,"_isValid")&&(o._isValid=e._isValid),o}an.fn=Rf.prototype;an.invalid=hB;function lo(e,t){var r=e&&parseFloat(e.replace(",","."));return(isNaN(r)?0:r)*t}function v_(e,t){var r={};return r.months=t.month()-e.month()+(t.year()-e.year())*12,e.clone().add(r.months,"M").isAfter(t)&&--r.months,r.milliseconds=+t-+e.clone().add(r.months,"M"),r}function jB(e,t){var r;return e.isValid()&&t.isValid()?(t=Dv(t,e),e.isBefore(t)?r=v_(e,t):(r=v_(t,e),r.milliseconds=-r.milliseconds,r.months=-r.months),r):{milliseconds:0,months:0}}function Fk(e,t){return function(r,n){var i,o;return n!==null&&!isNaN(+n)&&(vk(t,"moment()."+t+"(period, number) is deprecated. Please use moment()."+t+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),o=r,r=n,n=o),i=an(r,n),Uk(this,i,e),this}}function Uk(e,t,r,n){var i=t._milliseconds,o=p0(t._days),a=p0(t._months);e.isValid()&&(n=n??!0,a&&Ek(e,Rl(e,"Month")+a*r),o&&kk(e,"Date",Rl(e,"Date")+o*r),i&&e._d.setTime(e._d.valueOf()+i*r),n&&X.updateOffset(e,o||a))}var TB=Fk(1,"add"),RB=Fk(-1,"subtract");function $k(e){return typeof e=="string"||e instanceof String}function AB(e){return sn(e)||Gl(e)||$k(e)||ri(e)||OB(e)||PB(e)||e===null||e===void 0}function PB(e){var t=ko(e)&&!lv(e),r=!1,n=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],i,o,a=n.length;for(i=0;ir.valueOf():r.valueOf()9999?gu(r,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):Dn(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+this.utcOffset()*60*1e3).toISOString().replace("Z",gu(r,"Z")):gu(r,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function GB(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e="moment",t="",r,n,i,o;return this.isLocal()||(e=this.utcOffset()===0?"moment.utc":"moment.parseZone",t="Z"),r="["+e+'("]',n=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",i="-MM-DD[T]HH:mm:ss.SSS",o=t+'[")]',this.format(r+n+i+o)}function XB(e){e||(e=this.isUtc()?X.defaultFormatUtc:X.defaultFormat);var t=gu(this,e);return this.localeData().postformat(t)}function KB(e,t){return this.isValid()&&(sn(e)&&e.isValid()||rt(e).isValid())?an({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function QB(e){return this.from(rt(),e)}function qB(e,t){return this.isValid()&&(sn(e)&&e.isValid()||rt(e).isValid())?an({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function ZB(e){return this.to(rt(),e)}function Bk(e){var t;return e===void 0?this._locale._abbr:(t=ai(e),t!=null&&(this._locale=t),this)}var Wk=Yr("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return e===void 0?this.localeData():this.locale(e)});function Gk(){return this._locale}var cd=1e3,Ms=60*cd,ud=60*Ms,Xk=(365*400+97)*24*ud;function Is(e,t){return(e%t+t)%t}function Kk(e,t,r){return e<100&&e>=0?new Date(e+400,t,r)-Xk:new Date(e,t,r).valueOf()}function Qk(e,t,r){return e<100&&e>=0?Date.UTC(e+400,t,r)-Xk:Date.UTC(e,t,r)}function JB(e){var t,r;if(e=zr(e),e===void 0||e==="millisecond"||!this.isValid())return this;switch(r=this._isUTC?Qk:Kk,e){case"year":t=r(this.year(),0,1);break;case"quarter":t=r(this.year(),this.month()-this.month()%3,1);break;case"month":t=r(this.year(),this.month(),1);break;case"week":t=r(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":t=r(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":t=r(this.year(),this.month(),this.date());break;case"hour":t=this._d.valueOf(),t-=Is(t+(this._isUTC?0:this.utcOffset()*Ms),ud);break;case"minute":t=this._d.valueOf(),t-=Is(t,Ms);break;case"second":t=this._d.valueOf(),t-=Is(t,cd);break}return this._d.setTime(t),X.updateOffset(this,!0),this}function eW(e){var t,r;if(e=zr(e),e===void 0||e==="millisecond"||!this.isValid())return this;switch(r=this._isUTC?Qk:Kk,e){case"year":t=r(this.year()+1,0,1)-1;break;case"quarter":t=r(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":t=r(this.year(),this.month()+1,1)-1;break;case"week":t=r(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":t=r(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":t=r(this.year(),this.month(),this.date()+1)-1;break;case"hour":t=this._d.valueOf(),t+=ud-Is(t+(this._isUTC?0:this.utcOffset()*Ms),ud)-1;break;case"minute":t=this._d.valueOf(),t+=Ms-Is(t,Ms)-1;break;case"second":t=this._d.valueOf(),t+=cd-Is(t,cd)-1;break}return this._d.setTime(t),X.updateOffset(this,!0),this}function tW(){return this._d.valueOf()-(this._offset||0)*6e4}function rW(){return Math.floor(this.valueOf()/1e3)}function nW(){return new Date(this.valueOf())}function iW(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]}function oW(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}}function sW(){return this.isValid()?this.toISOString():null}function aW(){return cv(this)}function lW(){return Ri({},ye(this))}function cW(){return ye(this).overflow}function uW(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}de("N",0,0,"eraAbbr");de("NN",0,0,"eraAbbr");de("NNN",0,0,"eraAbbr");de("NNNN",0,0,"eraName");de("NNNNN",0,0,"eraNarrow");de("y",["y",1],"yo","eraYear");de("y",["yy",2],0,"eraYear");de("y",["yyy",3],0,"eraYear");de("y",["yyyy",4],0,"eraYear");se("N",Ev);se("NN",Ev);se("NNN",Ev);se("NNNN",xW);se("NNNNN",SW);We(["N","NN","NNN","NNNN","NNNNN"],function(e,t,r,n){var i=r._locale.erasParse(e,n,r._strict);i?ye(r).era=i:ye(r).invalidEra=e});se("y",sa);se("yy",sa);se("yyy",sa);se("yyyy",sa);se("yo",bW);We(["y","yy","yyy","yyyy"],$t);We(["yo"],function(e,t,r,n){var i;r._locale._eraYearOrdinalRegex&&(i=e.match(r._locale._eraYearOrdinalRegex)),r._locale.eraYearOrdinalParse?t[$t]=r._locale.eraYearOrdinalParse(e,i):t[$t]=parseInt(e,10)});function dW(e,t){var r,n,i,o=this._eras||ai("en")._eras;for(r=0,n=o.length;r=0)return o[n]}function hW(e,t){var r=e.since<=e.until?1:-1;return t===void 0?X(e.since).year():X(e.since).year()+(t-e.offset)*r}function mW(){var e,t,r,n=this.localeData().eras();for(e=0,t=n.length;eo&&(t=o),RW.call(this,e,t,r,n,i))}function RW(e,t,r,n,i){var o=Rk(e,t,r,n,i),a=Al(o.year,0,o.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}de("Q",0,"Qo","quarter");se("Q",wk);We("Q",function(e,t){t[Wn]=(Ce(e)-1)*3});function AW(e){return e==null?Math.ceil((this.month()+1)/3):this.month((e-1)*3+this.month()%3)}de("D",["DD",2],"Do","date");se("D",nt,aa);se("DD",nt,Er);se("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient});We(["D","DD"],gn);We("Do",function(e,t){t[gn]=Ce(e.match(nt)[0])});var Zk=la("Date",!0);de("DDD",["DDDD",3],"DDDo","dayOfYear");se("DDD",kf);se("DDDD",_k);We(["DDD","DDDD"],function(e,t,r){r._dayOfYear=Ce(e)});function PW(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return e==null?t:this.add(e-t,"d")}de("m",["mm",2],0,"minute");se("m",nt,gv);se("mm",nt,Er);We(["m","mm"],Jr);var OW=la("Minutes",!1);de("s",["ss",2],0,"second");se("s",nt,gv);se("ss",nt,Er);We(["s","ss"],Gn);var LW=la("Seconds",!1);de("S",0,0,function(){return~~(this.millisecond()/100)});de(0,["SS",2],0,function(){return~~(this.millisecond()/10)});de(0,["SSS",3],0,"millisecond");de(0,["SSSS",4],0,function(){return this.millisecond()*10});de(0,["SSSSS",5],0,function(){return this.millisecond()*100});de(0,["SSSSSS",6],0,function(){return this.millisecond()*1e3});de(0,["SSSSSSS",7],0,function(){return this.millisecond()*1e4});de(0,["SSSSSSSS",8],0,function(){return this.millisecond()*1e5});de(0,["SSSSSSSSS",9],0,function(){return this.millisecond()*1e6});se("S",kf,wk);se("SS",kf,Er);se("SSS",kf,_k);var Ai,Jk;for(Ai="SSSS";Ai.length<=9;Ai+="S")se(Ai,sa);function MW(e,t){t[_o]=Ce(("0."+e)*1e3)}for(Ai="S";Ai.length<=9;Ai+="S")We(Ai,MW);Jk=la("Milliseconds",!1);de("z",0,0,"zoneAbbr");de("zz",0,0,"zoneName");function IW(){return this._isUTC?"UTC":""}function NW(){return this._isUTC?"Coordinated Universal Time":""}var $=Xl.prototype;$.add=TB;$.calendar=IB;$.clone=NB;$.diff=$B;$.endOf=eW;$.format=XB;$.from=KB;$.fromNow=QB;$.to=qB;$.toNow=ZB;$.get=GU;$.invalidAt=cW;$.isAfter=VB;$.isBefore=YB;$.isBetween=zB;$.isSame=HB;$.isSameOrAfter=FB;$.isSameOrBefore=UB;$.isValid=aW;$.lang=Wk;$.locale=Bk;$.localeData=Gk;$.max=aB;$.min=sB;$.parsingFlags=lW;$.set=XU;$.startOf=JB;$.subtract=RB;$.toArray=iW;$.toObject=oW;$.toDate=nW;$.toISOString=WB;$.inspect=GB;typeof Symbol<"u"&&Symbol.for!=null&&($[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"});$.toJSON=sW;$.toString=BB;$.unix=rW;$.valueOf=tW;$.creationData=uW;$.eraName=mW;$.eraNarrow=pW;$.eraAbbr=gW;$.eraYear=vW;$.year=bk;$.isLeapYear=WU;$.weekYear=kW;$.isoWeekYear=CW;$.quarter=$.quarters=AW;$.month=jk;$.daysInMonth=n$;$.week=$.weeks=d$;$.isoWeek=$.isoWeeks=f$;$.weeksInYear=jW;$.weeksInWeekYear=TW;$.isoWeeksInYear=DW;$.isoWeeksInISOWeekYear=EW;$.date=Zk;$.day=$.days=C$;$.weekday=D$;$.isoWeekday=E$;$.dayOfYear=PW;$.hour=$.hours=L$;$.minute=$.minutes=OW;$.second=$.seconds=LW;$.millisecond=$.milliseconds=Jk;$.utcOffset=gB;$.utc=yB;$.local=wB;$.parseZone=_B;$.hasAlignedHourOffset=xB;$.isDST=SB;$.isLocal=kB;$.isUtcOffset=CB;$.isUtc=Hk;$.isUTC=Hk;$.zoneAbbr=IW;$.zoneName=NW;$.dates=Yr("dates accessor is deprecated. Use date instead.",Zk);$.months=Yr("months accessor is deprecated. Use month instead",jk);$.years=Yr("years accessor is deprecated. Use year instead",bk);$.zone=Yr("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",vB);$.isDSTShifted=Yr("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",bB);function VW(e){return rt(e*1e3)}function YW(){return rt.apply(null,arguments).parseZone()}function eC(e){return e}var Ie=dv.prototype;Ie.calendar=kU;Ie.longDateFormat=jU;Ie.invalidDate=RU;Ie.ordinal=OU;Ie.preparse=eC;Ie.postformat=eC;Ie.relativeTime=MU;Ie.pastFuture=IU;Ie.set=SU;Ie.eras=dW;Ie.erasParse=fW;Ie.erasConvertYear=hW;Ie.erasAbbrRegex=wW;Ie.erasNameRegex=yW;Ie.erasNarrowRegex=_W;Ie.months=JU;Ie.monthsShort=e$;Ie.monthsParse=r$;Ie.monthsRegex=o$;Ie.monthsShortRegex=i$;Ie.week=a$;Ie.firstDayOfYear=u$;Ie.firstDayOfWeek=c$;Ie.weekdays=_$;Ie.weekdaysMin=S$;Ie.weekdaysShort=x$;Ie.weekdaysParse=k$;Ie.weekdaysRegex=j$;Ie.weekdaysShortRegex=T$;Ie.weekdaysMinRegex=R$;Ie.isPM=P$;Ie.meridiem=M$;function dd(e,t,r,n){var i=ai(),o=Cn().set(n,t);return i[r](o,e)}function tC(e,t,r){if(ri(e)&&(t=e,e=void 0),e=e||"",t!=null)return dd(e,t,r,"month");var n,i=[];for(n=0;n<12;n++)i[n]=dd(e,n,r,"month");return i}function Tv(e,t,r,n){typeof e=="boolean"?(ri(t)&&(r=t,t=void 0),t=t||""):(t=e,r=t,e=!1,ri(t)&&(r=t,t=void 0),t=t||"");var i=ai(),o=e?i._week.dow:0,a,c=[];if(r!=null)return dd(t,(r+o)%7,n,"day");for(a=0;a<7;a++)c[a]=dd(t,(a+o)%7,n,"day");return c}function zW(e,t){return tC(e,t,"months")}function HW(e,t){return tC(e,t,"monthsShort")}function FW(e,t,r){return Tv(e,t,r,"weekdays")}function UW(e,t,r){return Tv(e,t,r,"weekdaysShort")}function $W(e,t,r){return Tv(e,t,r,"weekdaysMin")}Ui("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10,r=Ce(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+r}});X.lang=Yr("moment.lang is deprecated. Use moment.locale instead.",Ui);X.langData=Yr("moment.langData is deprecated. Use moment.localeData instead.",ai);var Vn=Math.abs;function BW(){var e=this._data;return this._milliseconds=Vn(this._milliseconds),this._days=Vn(this._days),this._months=Vn(this._months),e.milliseconds=Vn(e.milliseconds),e.seconds=Vn(e.seconds),e.minutes=Vn(e.minutes),e.hours=Vn(e.hours),e.months=Vn(e.months),e.years=Vn(e.years),this}function rC(e,t,r,n){var i=an(t,r);return e._milliseconds+=n*i._milliseconds,e._days+=n*i._days,e._months+=n*i._months,e._bubble()}function WW(e,t){return rC(this,e,t,1)}function GW(e,t){return rC(this,e,t,-1)}function y_(e){return e<0?Math.floor(e):Math.ceil(e)}function XW(){var e=this._milliseconds,t=this._days,r=this._months,n=this._data,i,o,a,c,d;return e>=0&&t>=0&&r>=0||e<=0&&t<=0&&r<=0||(e+=y_(v0(r)+t)*864e5,t=0,r=0),n.milliseconds=e%1e3,i=Ar(e/1e3),n.seconds=i%60,o=Ar(i/60),n.minutes=o%60,a=Ar(o/60),n.hours=a%24,t+=Ar(a/24),d=Ar(nC(t)),r+=d,t-=y_(v0(d)),c=Ar(r/12),r%=12,n.days=t,n.months=r,n.years=c,this}function nC(e){return e*4800/146097}function v0(e){return e*146097/4800}function KW(e){if(!this.isValid())return NaN;var t,r,n=this._milliseconds;if(e=zr(e),e==="month"||e==="quarter"||e==="year")switch(t=this._days+n/864e5,r=this._months+nC(t),e){case"month":return r;case"quarter":return r/3;case"year":return r/12}else switch(t=this._days+Math.round(v0(this._months)),e){case"week":return t/7+n/6048e5;case"day":return t+n/864e5;case"hour":return t*24+n/36e5;case"minute":return t*1440+n/6e4;case"second":return t*86400+n/1e3;case"millisecond":return Math.floor(t*864e5)+n;default:throw new Error("Unknown unit "+e)}}function li(e){return function(){return this.as(e)}}var iC=li("ms"),QW=li("s"),qW=li("m"),ZW=li("h"),JW=li("d"),e9=li("w"),t9=li("M"),r9=li("Q"),n9=li("y"),i9=iC;function o9(){return an(this)}function s9(e){return e=zr(e),this.isValid()?this[e+"s"]():NaN}function zo(e){return function(){return this.isValid()?this._data[e]:NaN}}var a9=zo("milliseconds"),l9=zo("seconds"),c9=zo("minutes"),u9=zo("hours"),d9=zo("days"),f9=zo("months"),h9=zo("years");function m9(){return Ar(this.days()/7)}var Fn=Math.round,Ds={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function p9(e,t,r,n,i){return i.relativeTime(t||1,!!r,e,n)}function g9(e,t,r,n){var i=an(e).abs(),o=Fn(i.as("s")),a=Fn(i.as("m")),c=Fn(i.as("h")),d=Fn(i.as("d")),h=Fn(i.as("M")),g=Fn(i.as("w")),v=Fn(i.as("y")),y=o<=r.ss&&["s",o]||o0,y[4]=n,p9.apply(null,y)}function v9(e){return e===void 0?Fn:typeof e=="function"?(Fn=e,!0):!1}function y9(e,t){return Ds[e]===void 0?!1:t===void 0?Ds[e]:(Ds[e]=t,e==="s"&&(Ds.ss=t-1),!0)}function w9(e,t){if(!this.isValid())return this.localeData().invalidDate();var r=!1,n=Ds,i,o;return typeof e=="object"&&(t=e,e=!1),typeof e=="boolean"&&(r=e),typeof t=="object"&&(n=Object.assign({},Ds,t),t.s!=null&&t.ss==null&&(n.ss=t.s-1)),i=this.localeData(),o=g9(this,!r,n,i),r&&(o=i.pastFuture(+this,o)),i.postformat(o)}var fm=Math.abs;function ns(e){return(e>0)-(e<0)||+e}function Pf(){if(!this.isValid())return this.localeData().invalidDate();var e=fm(this._milliseconds)/1e3,t=fm(this._days),r=fm(this._months),n,i,o,a,c=this.asSeconds(),d,h,g,v;return c?(n=Ar(e/60),i=Ar(n/60),e%=60,n%=60,o=Ar(r/12),r%=12,a=e?e.toFixed(3).replace(/\.?0+$/,""):"",d=c<0?"-":"",h=ns(this._months)!==ns(c)?"-":"",g=ns(this._days)!==ns(c)?"-":"",v=ns(this._milliseconds)!==ns(c)?"-":"",d+"P"+(o?h+o+"Y":"")+(r?h+r+"M":"")+(t?g+t+"D":"")+(i||n||e?"T":"")+(i?v+i+"H":"")+(n?v+n+"M":"")+(e?v+a+"S":"")):"P0D"}var Re=Rf.prototype;Re.isValid=fB;Re.abs=BW;Re.add=WW;Re.subtract=GW;Re.as=KW;Re.asMilliseconds=iC;Re.asSeconds=QW;Re.asMinutes=qW;Re.asHours=ZW;Re.asDays=JW;Re.asWeeks=e9;Re.asMonths=t9;Re.asQuarters=r9;Re.asYears=n9;Re.valueOf=i9;Re._bubble=XW;Re.clone=o9;Re.get=s9;Re.milliseconds=a9;Re.seconds=l9;Re.minutes=c9;Re.hours=u9;Re.days=d9;Re.weeks=m9;Re.months=f9;Re.years=h9;Re.humanize=w9;Re.toISOString=Pf;Re.toString=Pf;Re.toJSON=Pf;Re.locale=Bk;Re.localeData=Gk;Re.toIsoString=Yr("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Pf);Re.lang=Wk;de("X",0,0,"unix");de("x",0,0,"valueOf");se("x",Df);se("X",zU);We("X",function(e,t,r){r._d=new Date(parseFloat(e)*1e3)});We("x",function(e,t,r){r._d=new Date(Ce(e))});//! moment.js +X.version="2.30.1";_U(rt);X.fn=$;X.min=lB;X.max=cB;X.now=uB;X.utc=Cn;X.unix=VW;X.months=zW;X.isDate=Gl;X.locale=Ui;X.invalid=Sf;X.duration=an;X.isMoment=sn;X.weekdays=FW;X.parseZone=YW;X.localeData=ai;X.isDuration=vu;X.monthsShort=HW;X.weekdaysMin=$W;X.defineLocale=xv;X.updateLocale=Y$;X.locales=z$;X.weekdaysShort=UW;X.normalizeUnits=zr;X.relativeTimeRounding=v9;X.relativeTimeThreshold=y9;X.calendarFormat=MB;X.prototype=$;X.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"};const _9="/zh-cn/assets/blog-cover-95d8a382.png",x9=new Map([["blogs","技术博客"],["events","活动预告"],["highlights","精彩回顾"],["news-honor-dynamic","新闻 / 荣誉"]]),S9=f.main` + background: #fff; +`,b9=f.div` + max-width: 1440px; + margin-inline: auto; + padding: 0.96rem 1.65rem 1.56rem; +`,k9=f.div` + display: flex; + flex-direction: row-reverse; + justify-content: space-between; + align-items: center; + margin-bottom: 0.27rem; + padding-bottom: 0.27rem; + padding-inline: calc(1.79rem - 1.65rem); + border-bottom: 0.01rem solid #9a9a9a; + &:last-child { + margin-bottom: 0; + } +`,C9=f.img` + padding-left: 0.47rem; + width: 4.35rem; + height: min-content; + border-radius: 0.08rem; +`,D9=f.div` + width: 56%; + flex: 1; + padding-top: calc(1.22rem - 0.96rem); + padding-bottom: calc(0.53rem - 0.27rem); +`,E9=f.div` + padding-bottom: 0.05rem; + font-size: 0.15rem; + line-height: 0.3rem; + font-weight: 500; + color: #1c5cff; +`,j9=f.div` + padding-bottom: 0.26rem; + font-size: 0.27rem; + line-height: 0.33rem; + font-weight: 600; + color: #1e1e1e; + cursor: pointer; + &:hover { + color: #531dab; + } +`,T9=f.div` + padding-bottom: 0.13rem; + font-size: 0.135rem; + line-height: 0.24rem; + font-weight: 400; + color: #7d7d7d; +`,R9=f.div` + display: flex; + align-items: center; + font-size: 0.12rem; + line-height: 0.18rem; + font-weight: 500; + font-weight: 500; +`,hm=f.div` + color: #797979; +`,mm=f.div` + margin-inline: 0.12rem; + width: 0.08rem; + height: 0.08rem; + background: #797979; + border-radius: 50%; +`,A9=f.div` + padding-inline: 0.08rem; + color: #2f54eb; + border: 0.01rem solid #2f54eb; + background: #d6e4ff; + border-radius: 0.04rem; + text-transform: capitalize; +`,P9=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>x(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>x(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>x(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>x(()=>import("./index-fe9ae8f0.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>x(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>x(()=>import("./index-9d5e23a7.js"),[]),"/src/articles/blogs/2022-05-27-Rust-implementation-of-RDMA-asynchronous-programming-(I)_-epoll-based-implementation-of-RDMA-asynchronous-operation/index.md":()=>x(()=>import("./index-71928cce.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>x(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>x(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>x(()=>import("./index-b1ba4736.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>x(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>x(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>x(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>x(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>x(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>x(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>x(()=>import("./index-1bdc26aa.js"),[]),"/src/articles/blogs/2022-06-30-Ten-thousand-words-long-article,-detailing-the-hardware-acceleration-and-implementation-of-TRIDENT_-Poseidon-hash-algorithm!/index.md":()=>x(()=>import("./index-1c3a6017.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>x(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room_-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>x(()=>import("./index-dac1acc4.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room_-Xline-cross-data-center-consistency-management/index.md":()=>x(()=>import("./index-b2bc16dd.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>x(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>x(()=>import("./index-34b313c2.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>x(()=>import("./index-39390118.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>x(()=>import("./index-85fa6207.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0_-A-distributed-KV-store-for-metadata-management/index.md":()=>x(()=>import("./index-404f0d83.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>x(()=>import("./index-1a975ae4.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0_-A-distributed-KV-store-for-metadata-management/index.md":()=>x(()=>import("./index-64a98ea7.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>x(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>x(()=>import("./index-64a7ffe1.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0_-A-distributed-KV-store-for-metadata-management/index.md":()=>x(()=>import("./index-2bc875c0.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>x(()=>import("./index-0c908ba4.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>x(()=>import("./index-86e42443.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>x(()=>import("./index-7a966399.js"),[]),"/src/articles/blogs/2023-06-21-The-first-cross-cloud-metadata-KV-storage-Xline-officially-entered-the-CNCF-sandbox/index.md":()=>x(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1_-A-distributed-KV-store-for-metadata-management/index.md":()=>x(()=>import("./index-5a50192e.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>x(()=>import("./index-821ce5ea.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>x(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>x(()=>import("./index-40bc588f.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>x(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>x(()=>import("./index-96aee43d.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>x(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>x(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>x(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>x(()=>import("./index-6618c0b5.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>x(()=>import("./index-f210af05.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>x(()=>import("./index-a4c077ba.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0_-a-distributed-KV-store-for-metadata-management/index.md":()=>x(()=>import("./index-2cc15fbf.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>x(()=>import("./index-1b00c887.js"),[]),"/src/articles/blogs/2024-01-11-Open-source-Bluespec-bsc-compiler-and-reusable-example-designs/index.md":()=>x(()=>import("./index-4da057d8.js"),[]),"/src/articles/blogs/2024-01-18-Xline-v0.6.1_-a-distributed-KV-store-for-metadata-management/index.md":()=>x(()=>import("./index-e5377dbd.js"),[]),"/src/articles/blogs/2024-01-25-Agile-Digital-Chip-Design-and-Verification-with-SpinalHDL-and-Cocotb/index.md":()=>x(()=>import("./index-2aee5161.js"),[]),"/src/articles/blogs/2024-02-01-Xline-Jepsen-test-analysis/index.md":()=>x(()=>import("./index-c0527a8b.js"),[]),"/src/articles/blogs/2024-03-07-Membership-Change-Source-Code-Interpretation/index.md":()=>x(()=>import("./index-836388b4.js"),[]),"/src/articles/blogs/2024-03-21-Early-Explorations-and-Practices-of-Xline-a-Stateful-Application-Managed-by-Karmada/index.md":()=>x(()=>import("./index-8cb7e806.js"),[]),"/src/articles/blogs/2024-03-28-A-short-summary-of-the-implementation-of-interval-trees-in-Xline copy/index.md":()=>x(()=>import("./index-81d1e484.js"),[]),"/src/articles/blogs/2024-04-11-RDMA-Driver-Exploration-Series-for-Linux-1/index.md":()=>x(()=>import("./index-f7c1c3db.js"),[]),"/src/articles/blogs/2024-04-18-A-short-summary-of-the-implementation-of-interval-trees-in-Xline/index.md":()=>x(()=>import("./index-9e270336.js"),[]),"/src/articles/blogs/2024-04-25-Common-Design-Patterns-and-Their-Rust-Implementations/index.md":()=>x(()=>import("./index-5130399c.js"),[]),"/src/articles/blogs/2024-05-16-Xline-0.7-Refactoring-Performance-Analysis-Overview/index.md":()=>x(()=>import("./index-3deb6102.js"),[]),"/src/articles/blogs/2024-05-30-Full-Scale-File-System-Acceleration-on-GPUs/index.md":()=>x(()=>import("./index-900d632b.js"),[]),"/src/articles/blogs/2024-06-13-Managing-Google's-TPUv4-Machine-Learning-Supercomputer/index.md":()=>x(()=>import("./index-740bc59b.js"),[]),"/src/articles/blogs/2024-06-20-Managing-Google's-TPUv4-Machine-Learning-Supercomputer-(ll)/index.md":()=>x(()=>import("./index-4e044280.js"),[]),"/src/articles/blogs/2024-07-11-Asynchronous-Runtime-IO-Issue-Analysis/index.md":()=>x(()=>import("./index-4743c99a.js"),[]),"/src/articles/blogs/2024-07-18-Exploring-RDMA-Driver-in-Linux-Series2/index.md":()=>x(()=>import("./index-65fd7bbd.js"),[]),"/src/articles/blogs/2024-08-29-Xline-v-0.7.0---A-Distributed-KV-Store-for-Metadata-Management/index.md":()=>x(()=>import("./index-8cea61b2.js"),[]),"/src/articles/blogs/2024-09-12-A-Review-of-Debugging-a-RDMA-User-Space-Driver/index.md":()=>x(()=>import("./index-455c7bc3.js"),[])}),w_=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>x(()=>import("./index-9a2c4ece.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>x(()=>import("./index-5e43e574.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>x(()=>import("./index-12a2a854.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>x(()=>import("./index-a179aa93.js"),[]),"/src/articles/events/2022-11-11-Datan-Technology-invites-you-who-love-challenges-to-participate-in-Rust-China-Hackathon-2022/index.md":()=>x(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>x(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>x(()=>import("./index-15895cd6.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>x(()=>import("./index-e197de7f.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>x(()=>import("./index-1959a67e.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>x(()=>import("./index-3480f851.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>x(()=>import("./index-5689e7f4.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>x(()=>import("./index-d2a8186a.js"),[]),"/src/articles/events/2023-05-04-Meet-this-summer|Datan-Technology-invites-you-to-participate-in-the-2023-Open-Source-Summer/index.md":()=>x(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>x(()=>import("./index-2b1c59a2.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>x(()=>import("./index-0b4fd2ad.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>x(()=>import("./index-16f06676.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>x(()=>import("./index-d72e9e88.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>x(()=>import("./index-22d5e656.js"),[]),"/src/articles/events/2023-09-07-The-2nd-Hardware-Agile-Development-and-Methodology-Workshop-l-2023-RISC-V-China-Summit-Concurrent-Events-Successfully-Held/index.md":()=>x(()=>import("./index-1ab49176.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>x(()=>import("./index-5e5c42fa.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>x(()=>import("./index-8cb22688.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>x(()=>import("./index-6454a1e4.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days_-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>x(()=>import("./index-4dde8fa0.js"),[]),"/src/articles/events/2023-12-05-Ding!-2023-hackathon-tips-fresh-from-the-oven!-Last-week-to-sign-up-before-it's-too-late!/index.md":()=>x(()=>import("./index-7e0a1d2c.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>x(()=>import("./index-50ad21f0.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>x(()=>import("./index-cc4e4968.js"),[]),"/src/articles/events/2024-02-22-Recruitment-can't-stop-Dartan-Technology-2024-internship-positions-waiting-for-you/index.md":()=>x(()=>import("./index-db271263.js"),[]),"/src/articles/events/2024-02-29-A-Challenge-Letter-from-DatenLord-on-GSoC-2024/index.md":()=>x(()=>import("./index-778a40a0.js"),[]),"/src/articles/events/2024-04-04-Come-and-get-your-own-mind-blowing-offer-from-Dartan-Technologies/index.md":()=>x(()=>import("./index-464785f1.js"),[]),"/src/articles/events/2024-05-09-DartanLord-@-you-and-invited-you-to-the-2024-Summer-of-Open-Source!/index.md":()=>x(()=>import("./index-68779906.js"),[]),"/src/articles/events/2024-05-23-Xline-Community-Meeting-Call-Up-Securing-Joint-Consensus-in-CURP-Algorithm/index.md":()=>x(()=>import("./index-63ad8b5a.js"),[]),"/src/articles/events/2024-06-27-GLCC-Student-Registration-Extended!-Hurry-Up-and-Secure-Your-Spot!/index.md":()=>x(()=>import("./index-9ef15c87.js"),[]),"/src/articles/events/2024-06-27-Latest-Recruitment-3-2-1-Offer-Link/index.md":()=>x(()=>import("./index-ef64e907.js"),[]),"/src/articles/events/2024-07-25-Xline-Community-Meeting-Call-Up-Revealing-Xline-0.7-Version-Update/index.md":()=>x(()=>import("./index-6d1ca60f.js"),[]),"/src/articles/events/2024-08-16-RISC-V-China-Summit-Simultaneous-Event-Preview-l-Hardware-Agile-Development-and-Verification-Methodology-Seminar/index.md":()=>x(()=>import("./index-9e32b6fa.js"),[])}),O9=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels_-RDMA's-Rust-safety-practices/index.md":()=>x(()=>import("./index-4261cc2a.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord_-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>x(()=>import("./index-a1d21a3b.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>x(()=>import("./index-284b9c1c.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox_-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>x(()=>import("./index-4a0da0fc.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>x(()=>import("./index-d7149101.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>x(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>x(()=>import("./index-4ada4a0c.js"),[]),"/src/articles/highlights/2023-12-21-Highlights_-2023-SpinalHDL-Application-Prospect-Exploration-Workshop/index.md":()=>x(()=>import("./index-3da8d133.js"),[])}),L9=Object.assign({"/src/articles/news-honor-dynamic/2022-08-04-Dartan-Technology-Invited-to-Do-Hardware-Acceleration-Research-Sharing-at-2022-China-Computer-Society-Chip-Conference/index.md":()=>x(()=>import("./index-1f712296.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>x(()=>import("./index-012df9e2.js"),[])}),M9=()=>{const e=St(),t=si(),{title:r}=bn();N.useEffect(()=>{window.scrollTo(0,0)},[]);const i=(()=>{switch(r){case"blogs":return P9;case"events":return w_;case"highlights":return O9;case"news-honor-dynamic":return L9;default:return w_}})(),[o,a]=N.useState([]),c=async()=>{a(await Promise.all(Object.keys(i).map(d=>i[d]())))};return N.useEffect(()=>{c()},[t.pathname]),l.jsxs(l.Fragment,{children:[l.jsx(Vr,{cover:_9,children:r&&x9.get(r)}),l.jsx(S9,{children:l.jsx(b9,{children:o.reverse().map(({metadata:d,assetURLs:h})=>{const{date:g,title:v,label:y,description:S,author:C,editor:D,location:T,cover:b,tags:w}=d;return l.jsxs(k9,{children:[b&&l.jsx(C9,{src:b&&h[0]}),l.jsxs(D9,{children:[l.jsx(E9,{children:X(g).format("YYYY.M.D")}),l.jsx(j9,{onClick:()=>{e(`${g}-${v.split(" ").join("-")}`)},children:y}),l.jsx(T9,{children:S}),l.jsxs(R9,{children:[C&&l.jsxs(l.Fragment,{children:[l.jsxs(hm,{children:["嘉宾:",C[0]]}),l.jsx(mm,{})]}),D&&l.jsxs(l.Fragment,{children:[l.jsxs(hm,{children:["编辑:",D[0]]}),l.jsx(mm,{})]}),l.jsxs(hm,{children:["发表于",T]}),w&&l.jsxs(l.Fragment,{children:[l.jsx(mm,{}),w.map(k=>l.jsx(A9,{children:k},k))]})]})]})]},v)})})})]})},I9=(e,t)=>{const r=N.useRef({});N.useEffect(()=>{const n=c=>{r.current=c.reduce((g,v)=>(g[v.target.innerHTML]=v,g),r.current);const d=[];Object.keys(r.current).forEach(g=>{const v=r.current[g];v.isIntersecting&&d.push(v)});const h=g=>a.findIndex(v=>v.id===g);if(d.length===1)e(d[0].target.id);else if(d.length>1){const g=d.sort((v,y)=>h(v.target.id)-h(y.target.id));e(g[0].target.id)}},i={rootMargin:"0px 0px -40% 0px"},o=new IntersectionObserver(n,i),a=Array.from(document.querySelectorAll("h2, h3"));return a.forEach(c=>o.observe(c)),()=>o.disconnect()},[t])},N9=f.div``,V9=f.div` + display: flex; + max-width: 1440px; + margin-inline: auto; + padding-block: 0.64rem; + padding-inline: 1.22rem; + padding-top: 1.2rem; +`,Y9=f.div` + flex-grow: 1; + padding-inline: 0.64rem; +`,z9=f.h1` + margin-bottom: 0.96rem; + color: #1e1e1e; + font-size: 0.4rem; + line-height: 0.48rem; + font-weight: 600; +`,H9=f.div` + background: #fff; + border-radius: 0.08rem; +`,F9=f.div` + flex-shrink: 0; + width: 300px; +`,U9=f.div` + position: sticky; + top: 1.2rem; + left: 0; + padding: 0.32rem; + background: #ffffff; + border-radius: 0.08rem; + max-height: 60vh; + overflow-y: scroll; +`,$9=f.div` + display: block; + margin-block: 0.16rem; + padding-left: ${({level:e})=>e===3?"48px":"16px"}; + color: ${({isActive:e})=>e?"#722ed1":"inherit"}; + border-left: ${({isActive:e})=>e?"8px solid #722ed1":"8px solid transparent"}; + font-weight: 700; + font-size: 0.18rem; + line-height: 1.5; + cursor: pointer; +`,B9=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>x(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>x(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>x(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>x(()=>import("./index-fe9ae8f0.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>x(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>x(()=>import("./index-9d5e23a7.js"),[]),"/src/articles/blogs/2022-05-27-Rust-implementation-of-RDMA-asynchronous-programming-(I)_-epoll-based-implementation-of-RDMA-asynchronous-operation/index.md":()=>x(()=>import("./index-71928cce.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>x(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>x(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>x(()=>import("./index-b1ba4736.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>x(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>x(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>x(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>x(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>x(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>x(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>x(()=>import("./index-1bdc26aa.js"),[]),"/src/articles/blogs/2022-06-30-Ten-thousand-words-long-article,-detailing-the-hardware-acceleration-and-implementation-of-TRIDENT_-Poseidon-hash-algorithm!/index.md":()=>x(()=>import("./index-1c3a6017.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>x(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room_-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>x(()=>import("./index-dac1acc4.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room_-Xline-cross-data-center-consistency-management/index.md":()=>x(()=>import("./index-b2bc16dd.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>x(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>x(()=>import("./index-34b313c2.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>x(()=>import("./index-39390118.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>x(()=>import("./index-85fa6207.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0_-A-distributed-KV-store-for-metadata-management/index.md":()=>x(()=>import("./index-404f0d83.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>x(()=>import("./index-1a975ae4.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0_-A-distributed-KV-store-for-metadata-management/index.md":()=>x(()=>import("./index-64a98ea7.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>x(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>x(()=>import("./index-64a7ffe1.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0_-A-distributed-KV-store-for-metadata-management/index.md":()=>x(()=>import("./index-2bc875c0.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>x(()=>import("./index-0c908ba4.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>x(()=>import("./index-86e42443.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>x(()=>import("./index-7a966399.js"),[]),"/src/articles/blogs/2023-06-21-The-first-cross-cloud-metadata-KV-storage-Xline-officially-entered-the-CNCF-sandbox/index.md":()=>x(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1_-A-distributed-KV-store-for-metadata-management/index.md":()=>x(()=>import("./index-5a50192e.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>x(()=>import("./index-821ce5ea.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>x(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>x(()=>import("./index-40bc588f.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>x(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>x(()=>import("./index-96aee43d.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>x(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>x(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>x(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>x(()=>import("./index-6618c0b5.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>x(()=>import("./index-f210af05.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>x(()=>import("./index-a4c077ba.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0_-a-distributed-KV-store-for-metadata-management/index.md":()=>x(()=>import("./index-2cc15fbf.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>x(()=>import("./index-1b00c887.js"),[]),"/src/articles/blogs/2024-01-11-Open-source-Bluespec-bsc-compiler-and-reusable-example-designs/index.md":()=>x(()=>import("./index-4da057d8.js"),[]),"/src/articles/blogs/2024-01-18-Xline-v0.6.1_-a-distributed-KV-store-for-metadata-management/index.md":()=>x(()=>import("./index-e5377dbd.js"),[]),"/src/articles/blogs/2024-01-25-Agile-Digital-Chip-Design-and-Verification-with-SpinalHDL-and-Cocotb/index.md":()=>x(()=>import("./index-2aee5161.js"),[]),"/src/articles/blogs/2024-02-01-Xline-Jepsen-test-analysis/index.md":()=>x(()=>import("./index-c0527a8b.js"),[]),"/src/articles/blogs/2024-03-07-Membership-Change-Source-Code-Interpretation/index.md":()=>x(()=>import("./index-836388b4.js"),[]),"/src/articles/blogs/2024-03-21-Early-Explorations-and-Practices-of-Xline-a-Stateful-Application-Managed-by-Karmada/index.md":()=>x(()=>import("./index-8cb7e806.js"),[]),"/src/articles/blogs/2024-03-28-A-short-summary-of-the-implementation-of-interval-trees-in-Xline copy/index.md":()=>x(()=>import("./index-81d1e484.js"),[]),"/src/articles/blogs/2024-04-11-RDMA-Driver-Exploration-Series-for-Linux-1/index.md":()=>x(()=>import("./index-f7c1c3db.js"),[]),"/src/articles/blogs/2024-04-18-A-short-summary-of-the-implementation-of-interval-trees-in-Xline/index.md":()=>x(()=>import("./index-9e270336.js"),[]),"/src/articles/blogs/2024-04-25-Common-Design-Patterns-and-Their-Rust-Implementations/index.md":()=>x(()=>import("./index-5130399c.js"),[]),"/src/articles/blogs/2024-05-16-Xline-0.7-Refactoring-Performance-Analysis-Overview/index.md":()=>x(()=>import("./index-3deb6102.js"),[]),"/src/articles/blogs/2024-05-30-Full-Scale-File-System-Acceleration-on-GPUs/index.md":()=>x(()=>import("./index-900d632b.js"),[]),"/src/articles/blogs/2024-06-13-Managing-Google's-TPUv4-Machine-Learning-Supercomputer/index.md":()=>x(()=>import("./index-740bc59b.js"),[]),"/src/articles/blogs/2024-06-20-Managing-Google's-TPUv4-Machine-Learning-Supercomputer-(ll)/index.md":()=>x(()=>import("./index-4e044280.js"),[]),"/src/articles/blogs/2024-07-11-Asynchronous-Runtime-IO-Issue-Analysis/index.md":()=>x(()=>import("./index-4743c99a.js"),[]),"/src/articles/blogs/2024-07-18-Exploring-RDMA-Driver-in-Linux-Series2/index.md":()=>x(()=>import("./index-65fd7bbd.js"),[]),"/src/articles/blogs/2024-08-29-Xline-v-0.7.0---A-Distributed-KV-Store-for-Metadata-Management/index.md":()=>x(()=>import("./index-8cea61b2.js"),[]),"/src/articles/blogs/2024-09-12-A-Review-of-Debugging-a-RDMA-User-Space-Driver/index.md":()=>x(()=>import("./index-455c7bc3.js"),[])}),W9=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>x(()=>import("./index-9a2c4ece.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>x(()=>import("./index-5e43e574.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>x(()=>import("./index-12a2a854.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>x(()=>import("./index-a179aa93.js"),[]),"/src/articles/events/2022-11-11-Datan-Technology-invites-you-who-love-challenges-to-participate-in-Rust-China-Hackathon-2022/index.md":()=>x(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>x(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>x(()=>import("./index-15895cd6.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>x(()=>import("./index-e197de7f.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>x(()=>import("./index-1959a67e.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>x(()=>import("./index-3480f851.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>x(()=>import("./index-5689e7f4.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>x(()=>import("./index-d2a8186a.js"),[]),"/src/articles/events/2023-05-04-Meet-this-summer|Datan-Technology-invites-you-to-participate-in-the-2023-Open-Source-Summer/index.md":()=>x(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>x(()=>import("./index-2b1c59a2.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>x(()=>import("./index-0b4fd2ad.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>x(()=>import("./index-16f06676.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>x(()=>import("./index-d72e9e88.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>x(()=>import("./index-22d5e656.js"),[]),"/src/articles/events/2023-09-07-The-2nd-Hardware-Agile-Development-and-Methodology-Workshop-l-2023-RISC-V-China-Summit-Concurrent-Events-Successfully-Held/index.md":()=>x(()=>import("./index-1ab49176.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>x(()=>import("./index-5e5c42fa.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>x(()=>import("./index-8cb22688.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>x(()=>import("./index-6454a1e4.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days_-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>x(()=>import("./index-4dde8fa0.js"),[]),"/src/articles/events/2023-12-05-Ding!-2023-hackathon-tips-fresh-from-the-oven!-Last-week-to-sign-up-before-it's-too-late!/index.md":()=>x(()=>import("./index-7e0a1d2c.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>x(()=>import("./index-50ad21f0.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>x(()=>import("./index-cc4e4968.js"),[]),"/src/articles/events/2024-02-22-Recruitment-can't-stop-Dartan-Technology-2024-internship-positions-waiting-for-you/index.md":()=>x(()=>import("./index-db271263.js"),[]),"/src/articles/events/2024-02-29-A-Challenge-Letter-from-DatenLord-on-GSoC-2024/index.md":()=>x(()=>import("./index-778a40a0.js"),[]),"/src/articles/events/2024-04-04-Come-and-get-your-own-mind-blowing-offer-from-Dartan-Technologies/index.md":()=>x(()=>import("./index-464785f1.js"),[]),"/src/articles/events/2024-05-09-DartanLord-@-you-and-invited-you-to-the-2024-Summer-of-Open-Source!/index.md":()=>x(()=>import("./index-68779906.js"),[]),"/src/articles/events/2024-05-23-Xline-Community-Meeting-Call-Up-Securing-Joint-Consensus-in-CURP-Algorithm/index.md":()=>x(()=>import("./index-63ad8b5a.js"),[]),"/src/articles/events/2024-06-27-GLCC-Student-Registration-Extended!-Hurry-Up-and-Secure-Your-Spot!/index.md":()=>x(()=>import("./index-9ef15c87.js"),[]),"/src/articles/events/2024-06-27-Latest-Recruitment-3-2-1-Offer-Link/index.md":()=>x(()=>import("./index-ef64e907.js"),[]),"/src/articles/events/2024-07-25-Xline-Community-Meeting-Call-Up-Revealing-Xline-0.7-Version-Update/index.md":()=>x(()=>import("./index-6d1ca60f.js"),[]),"/src/articles/events/2024-08-16-RISC-V-China-Summit-Simultaneous-Event-Preview-l-Hardware-Agile-Development-and-Verification-Methodology-Seminar/index.md":()=>x(()=>import("./index-9e32b6fa.js"),[])}),G9=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels_-RDMA's-Rust-safety-practices/index.md":()=>x(()=>import("./index-4261cc2a.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord_-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>x(()=>import("./index-a1d21a3b.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>x(()=>import("./index-284b9c1c.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox_-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>x(()=>import("./index-4a0da0fc.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>x(()=>import("./index-d7149101.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>x(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>x(()=>import("./index-4ada4a0c.js"),[]),"/src/articles/highlights/2023-12-21-Highlights_-2023-SpinalHDL-Application-Prospect-Exploration-Workshop/index.md":()=>x(()=>import("./index-3da8d133.js"),[])}),X9=Object.assign({"/src/articles/news-honor-dynamic/2022-08-04-Dartan-Technology-Invited-to-Do-Hardware-Acceleration-Research-Sharing-at-2022-China-Computer-Society-Chip-Conference/index.md":()=>x(()=>import("./index-1f712296.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>x(()=>import("./index-012df9e2.js"),[])}),K9=()=>{const{section:e,title:t}=bn(),[r,n]=N.useState(),[i,o]=N.useState("");I9(o,r);const a=async()=>{console.log(`/src/articles/${e}/${t}/index.md`);const h=await(async()=>{switch(e){case"blogs":return await B9[`/src/articles/${e}/${t}/index.md`]();case"events":return await W9[`/src/articles/${e}/${t}/index.md`]();case"highlights":return await G9[`/src/articles/${e}/${t}/index.md`]();case"news-honor-dynamic":return await X9[`/src/articles/${e}/${t}/index.md`]()}})();n(h)};N.useEffect(()=>{console.log(r)},[]),N.useEffect(()=>{a(),window.scrollTo(0,0)},[]);const c=d=>{var h;(h=document.querySelector(`#${d}`))==null||h.scrollIntoView({})};return l.jsx(N9,{children:l.jsxs(V9,{children:[(r==null?void 0:r.toc.length)!==0&&l.jsx(F9,{children:l.jsx(U9,{children:((r==null?void 0:r.toc)||[]).map(({label:d,level:h})=>{const g=d.split(" ").join("-").toLowerCase();return l.jsx($9,{level:h,isActive:i===g,onClick:()=>c(g),children:d},d)})})}),l.jsxs(Y9,{children:[l.jsx(z9,{children:r==null?void 0:r.metadata.label}),l.jsx(H9,{className:"content",dangerouslySetInnerHTML:{__html:(r==null?void 0:r.default)||""}})]})]})})};function oC(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var pm={exports:{}},__;function Q9(){return __||(__=1,function(e,t){(function(r,n){e.exports=n()})(fs,function(){var r;function n(){return r.apply(null,arguments)}function i(s){r=s}function o(s){return s instanceof Array||Object.prototype.toString.call(s)==="[object Array]"}function a(s){return s!=null&&Object.prototype.toString.call(s)==="[object Object]"}function c(s,u){return Object.prototype.hasOwnProperty.call(s,u)}function d(s){if(Object.getOwnPropertyNames)return Object.getOwnPropertyNames(s).length===0;var u;for(u in s)if(c(s,u))return!1;return!0}function h(s){return s===void 0}function g(s){return typeof s=="number"||Object.prototype.toString.call(s)==="[object Number]"}function v(s){return s instanceof Date||Object.prototype.toString.call(s)==="[object Date]"}function y(s,u){var m=[],p,_=s.length;for(p=0;p<_;++p)m.push(u(s[p],p));return m}function S(s,u){for(var m in u)c(u,m)&&(s[m]=u[m]);return c(u,"toString")&&(s.toString=u.toString),c(u,"valueOf")&&(s.valueOf=u.valueOf),s}function C(s,u,m,p){return Kv(s,u,m,p,!0).utc()}function D(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidEra:null,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],era:null,meridiem:null,rfc2822:!1,weekdayMismatch:!1}}function T(s){return s._pf==null&&(s._pf=D()),s._pf}var b;Array.prototype.some?b=Array.prototype.some:b=function(s){var u=Object(this),m=u.length>>>0,p;for(p=0;p0)for(m=0;m=0;return(R?m?"+":"":"-")+Math.pow(10,Math.max(0,_)).toString().substr(1)+p}var ge=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,pe=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Ke={},Ae={};function te(s,u,m,p){var _=p;typeof p=="string"&&(_=function(){return this[p]()}),s&&(Ae[s]=_),u&&(Ae[u[0]]=function(){return ee(_.apply(this,arguments),u[1],u[2])}),m&&(Ae[m]=function(){return this.localeData().ordinal(_.apply(this,arguments),s)})}function pt(s){return s.match(/\[[\s\S]/)?s.replace(/^\[|\]$/g,""):s.replace(/\\/g,"")}function Mt(s){var u=s.match(ge),m,p;for(m=0,p=u.length;m=0&&pe.test(s);)s=s.replace(pe,p),pe.lastIndex=0,m-=1;return s}var hr={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function yt(s){var u=this._longDateFormat[s],m=this._longDateFormat[s.toUpperCase()];return u||!m?u:(this._longDateFormat[s]=m.match(ge).map(function(p){return p==="MMMM"||p==="MM"||p==="DD"||p==="dddd"?p.slice(1):p}).join(""),this._longDateFormat[s])}var mr="Invalid date";function pr(){return this._invalidDate}var Mf="%d",En=/\d{1,2}/;function If(s){return this._ordinal.replace("%d",s)}var Nf={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function ec(s,u,m,p){var _=this._relativeTime[m];return G(_)?_(s,u,m,p):_.replace(/%d/i,s)}function Vf(s,u){var m=this._relativeTime[s>0?"future":"past"];return G(m)?m(u):m.replace(/%s/i,u)}var tc={D:"date",dates:"date",date:"date",d:"day",days:"day",day:"day",e:"weekday",weekdays:"weekday",weekday:"weekday",E:"isoWeekday",isoweekdays:"isoWeekday",isoweekday:"isoWeekday",DDD:"dayOfYear",dayofyears:"dayOfYear",dayofyear:"dayOfYear",h:"hour",hours:"hour",hour:"hour",ms:"millisecond",milliseconds:"millisecond",millisecond:"millisecond",m:"minute",minutes:"minute",minute:"minute",M:"month",months:"month",month:"month",Q:"quarter",quarters:"quarter",quarter:"quarter",s:"second",seconds:"second",second:"second",gg:"weekYear",weekyears:"weekYear",weekyear:"weekYear",GG:"isoWeekYear",isoweekyears:"isoWeekYear",isoweekyear:"isoWeekYear",w:"week",weeks:"week",week:"week",W:"isoWeek",isoweeks:"isoWeek",isoweek:"isoWeek",y:"year",years:"year",year:"year"};function er(s){return typeof s=="string"?tc[s]||tc[s.toLowerCase()]:void 0}function da(s){var u={},m,p;for(p in s)c(s,p)&&(m=er(p),m&&(u[m]=s[p]));return u}var jn={date:9,day:11,weekday:11,isoWeekday:11,dayOfYear:4,hour:13,millisecond:16,minute:14,month:8,quarter:7,second:15,weekYear:1,isoWeekYear:1,week:5,isoWeek:5,year:1};function Zi(s){var u=[],m;for(m in s)c(s,m)&&u.push({unit:m,priority:jn[m]});return u.sort(function(p,_){return p.priority-_.priority}),u}var fa=/\d/,It=/\d\d/,Fr=/\d{3}/,gr=/\d{4}/,Ji=/[+-]?\d{6}/,ze=/\d\d?/,rc=/\d\d\d\d?/,Ur=/\d\d\d\d\d\d?/,eo=/\d{1,3}/,Fo=/\d{1,4}/,to=/[+-]?\d{1,6}/,ci=/\d+/,ro=/[+-]?\d+/,Uo=/Z|[+-]\d\d:?\d\d/gi,no=/Z|[+-]\d\d(?::?\d\d)?/gi,ha=/[+-]?\d+(\.\d{1,3})?/,Tn=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,ui=/^[1-9]\d?/,$o=/^([1-9]\d|\d)/,Bo;Bo={};function re(s,u,m){Bo[s]=G(u)?u:function(p,_){return p&&m?m:u}}function Wo(s,u){return c(Bo,s)?Bo[s](u._strict,u._locale):new RegExp(Go(s))}function Go(s){return $r(s.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(u,m,p,_,R){return m||p||_||R}))}function $r(s){return s.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function tr(s){return s<0?Math.ceil(s)||0:Math.floor(s)}function j(s){var u=+s,m=0;return u!==0&&isFinite(u)&&(m=tr(u)),m}var O={};function L(s,u){var m,p=u,_;for(typeof s=="string"&&(s=[s]),g(u)&&(p=function(R,V){V[u]=j(R)}),_=s.length,m=0;m<_;m++)O[s[m]]=p}function H(s,u){L(s,function(m,p,_,R){_._w=_._w||{},u(m,_._w,_,R)})}function ie(s,u,m){u!=null&&c(O,s)&&O[s](u,m._a,m,s)}function ce(s){return s%4===0&&s%100!==0||s%400===0}var le=0,q=1,Z=2,B=3,oe=4,he=5,ve=6,Ct=7,Ue=8;te("Y",0,0,function(){var s=this.year();return s<=9999?ee(s,4):"+"+s}),te(0,["YY",2],0,function(){return this.year()%100}),te(0,["YYYY",4],0,"year"),te(0,["YYYYY",5],0,"year"),te(0,["YYYYYY",6,!0],0,"year"),re("Y",ro),re("YY",ze,It),re("YYYY",Fo,gr),re("YYYYY",to,Ji),re("YYYYYY",to,Ji),L(["YYYYY","YYYYYY"],le),L("YYYY",function(s,u){u[le]=s.length===2?n.parseTwoDigitYear(s):j(s)}),L("YY",function(s,u){u[le]=n.parseTwoDigitYear(s)}),L("Y",function(s,u){u[le]=parseInt(s,10)});function _e(s){return ce(s)?366:365}n.parseTwoDigitYear=function(s){return j(s)+(j(s)>68?1900:2e3)};var Qe=jr("FullYear",!0);function di(){return ce(this.year())}function jr(s,u){return function(m){return m!=null?(vr(this,s,m),n.updateOffset(this,u),this):Wt(this,s)}}function Wt(s,u){if(!s.isValid())return NaN;var m=s._d,p=s._isUTC;switch(u){case"Milliseconds":return p?m.getUTCMilliseconds():m.getMilliseconds();case"Seconds":return p?m.getUTCSeconds():m.getSeconds();case"Minutes":return p?m.getUTCMinutes():m.getMinutes();case"Hours":return p?m.getUTCHours():m.getHours();case"Date":return p?m.getUTCDate():m.getDate();case"Day":return p?m.getUTCDay():m.getDay();case"Month":return p?m.getUTCMonth():m.getMonth();case"FullYear":return p?m.getUTCFullYear():m.getFullYear();default:return NaN}}function vr(s,u,m){var p,_,R,V,ne;if(!(!s.isValid()||isNaN(m))){switch(p=s._d,_=s._isUTC,u){case"Milliseconds":return void(_?p.setUTCMilliseconds(m):p.setMilliseconds(m));case"Seconds":return void(_?p.setUTCSeconds(m):p.setSeconds(m));case"Minutes":return void(_?p.setUTCMinutes(m):p.setMinutes(m));case"Hours":return void(_?p.setUTCHours(m):p.setHours(m));case"Date":return void(_?p.setUTCDate(m):p.setDate(m));case"FullYear":break;default:return}R=m,V=s.month(),ne=s.date(),ne=ne===29&&V===1&&!ce(R)?28:ne,_?p.setUTCFullYear(R,V,ne):p.setFullYear(R,V,ne)}}function ma(s){return s=er(s),G(this[s])?this[s]():this}function io(s,u){if(typeof s=="object"){s=da(s);var m=Zi(s),p,_=m.length;for(p=0;p<_;p++)this[m[p].unit](s[m[p].unit])}else if(s=er(s),G(this[s]))return this[s](u);return this}function Rn(s,u){return(s%u+u)%u}var Ge;Array.prototype.indexOf?Ge=Array.prototype.indexOf:Ge=function(s){var u;for(u=0;u=0?(ne=new Date(s+400,u,m,p,_,R,V),isFinite(ne.getFullYear())&&ne.setFullYear(s)):ne=new Date(s,u,m,p,_,R,V),ne}function pa(s){var u,m;return s<100&&s>=0?(m=Array.prototype.slice.call(arguments),m[0]=s+400,u=new Date(Date.UTC.apply(null,m)),isFinite(u.getUTCFullYear())&&u.setUTCFullYear(s)):u=new Date(Date.UTC.apply(null,arguments)),u}function ic(s,u,m){var p=7+u-m,_=(7+pa(s,0,p).getUTCDay()-u)%7;return-_+p-1}function zv(s,u,m,p,_){var R=(7+m-p)%7,V=ic(s,p,_),ne=1+7*(u-1)+R+V,me,De;return ne<=0?(me=s-1,De=_e(me)+ne):ne>_e(s)?(me=s+1,De=ne-_e(s)):(me=s,De=ne),{year:me,dayOfYear:De}}function ga(s,u,m){var p=ic(s.year(),u,m),_=Math.floor((s.dayOfYear()-p-1)/7)+1,R,V;return _<1?(V=s.year()-1,R=_+Pn(V,u,m)):_>Pn(s.year(),u,m)?(R=_-Pn(s.year(),u,m),V=s.year()+1):(V=s.year(),R=_),{week:R,year:V}}function Pn(s,u,m){var p=ic(s,u,m),_=ic(s+1,u,m);return(_e(s)-p+_)/7}te("w",["ww",2],"wo","week"),te("W",["WW",2],"Wo","isoWeek"),re("w",ze,ui),re("ww",ze,It),re("W",ze,ui),re("WW",ze,It),H(["w","ww","W","WW"],function(s,u,m,p){u[p.substr(0,1)]=j(s)});function IC(s){return ga(s,this._week.dow,this._week.doy).week}var NC={dow:0,doy:6};function VC(){return this._week.dow}function YC(){return this._week.doy}function zC(s){var u=this.localeData().week(this);return s==null?u:this.add((s-u)*7,"d")}function HC(s){var u=ga(this,1,4).week;return s==null?u:this.add((s-u)*7,"d")}te("d",0,"do","day"),te("dd",0,0,function(s){return this.localeData().weekdaysMin(this,s)}),te("ddd",0,0,function(s){return this.localeData().weekdaysShort(this,s)}),te("dddd",0,0,function(s){return this.localeData().weekdays(this,s)}),te("e",0,0,"weekday"),te("E",0,0,"isoWeekday"),re("d",ze),re("e",ze),re("E",ze),re("dd",function(s,u){return u.weekdaysMinRegex(s)}),re("ddd",function(s,u){return u.weekdaysShortRegex(s)}),re("dddd",function(s,u){return u.weekdaysRegex(s)}),H(["dd","ddd","dddd"],function(s,u,m,p){var _=m._locale.weekdaysParse(s,p,m._strict);_!=null?u.d=_:T(m).invalidWeekday=s}),H(["d","e","E"],function(s,u,m,p){u[p]=j(s)});function FC(s,u){return typeof s!="string"?s:isNaN(s)?(s=u.weekdaysParse(s),typeof s=="number"?s:null):parseInt(s,10)}function UC(s,u){return typeof s=="string"?u.weekdaysParse(s)%7||7:isNaN(s)?null:s}function zf(s,u){return s.slice(u,7).concat(s.slice(0,u))}var $C="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Hv="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),BC="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),WC=Tn,GC=Tn,XC=Tn;function KC(s,u){var m=o(this._weekdays)?this._weekdays:this._weekdays[s&&s!==!0&&this._weekdays.isFormat.test(u)?"format":"standalone"];return s===!0?zf(m,this._week.dow):s?m[s.day()]:m}function QC(s){return s===!0?zf(this._weekdaysShort,this._week.dow):s?this._weekdaysShort[s.day()]:this._weekdaysShort}function qC(s){return s===!0?zf(this._weekdaysMin,this._week.dow):s?this._weekdaysMin[s.day()]:this._weekdaysMin}function ZC(s,u,m){var p,_,R,V=s.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],p=0;p<7;++p)R=C([2e3,1]).day(p),this._minWeekdaysParse[p]=this.weekdaysMin(R,"").toLocaleLowerCase(),this._shortWeekdaysParse[p]=this.weekdaysShort(R,"").toLocaleLowerCase(),this._weekdaysParse[p]=this.weekdays(R,"").toLocaleLowerCase();return m?u==="dddd"?(_=Ge.call(this._weekdaysParse,V),_!==-1?_:null):u==="ddd"?(_=Ge.call(this._shortWeekdaysParse,V),_!==-1?_:null):(_=Ge.call(this._minWeekdaysParse,V),_!==-1?_:null):u==="dddd"?(_=Ge.call(this._weekdaysParse,V),_!==-1||(_=Ge.call(this._shortWeekdaysParse,V),_!==-1)?_:(_=Ge.call(this._minWeekdaysParse,V),_!==-1?_:null)):u==="ddd"?(_=Ge.call(this._shortWeekdaysParse,V),_!==-1||(_=Ge.call(this._weekdaysParse,V),_!==-1)?_:(_=Ge.call(this._minWeekdaysParse,V),_!==-1?_:null)):(_=Ge.call(this._minWeekdaysParse,V),_!==-1||(_=Ge.call(this._weekdaysParse,V),_!==-1)?_:(_=Ge.call(this._shortWeekdaysParse,V),_!==-1?_:null))}function JC(s,u,m){var p,_,R;if(this._weekdaysParseExact)return ZC.call(this,s,u,m);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),p=0;p<7;p++){if(_=C([2e3,1]).day(p),m&&!this._fullWeekdaysParse[p]&&(this._fullWeekdaysParse[p]=new RegExp("^"+this.weekdays(_,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[p]=new RegExp("^"+this.weekdaysShort(_,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[p]=new RegExp("^"+this.weekdaysMin(_,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[p]||(R="^"+this.weekdays(_,"")+"|^"+this.weekdaysShort(_,"")+"|^"+this.weekdaysMin(_,""),this._weekdaysParse[p]=new RegExp(R.replace(".",""),"i")),m&&u==="dddd"&&this._fullWeekdaysParse[p].test(s))return p;if(m&&u==="ddd"&&this._shortWeekdaysParse[p].test(s))return p;if(m&&u==="dd"&&this._minWeekdaysParse[p].test(s))return p;if(!m&&this._weekdaysParse[p].test(s))return p}}function eD(s){if(!this.isValid())return s!=null?this:NaN;var u=Wt(this,"Day");return s!=null?(s=FC(s,this.localeData()),this.add(s-u,"d")):u}function tD(s){if(!this.isValid())return s!=null?this:NaN;var u=(this.day()+7-this.localeData()._week.dow)%7;return s==null?u:this.add(s-u,"d")}function rD(s){if(!this.isValid())return s!=null?this:NaN;if(s!=null){var u=UC(s,this.localeData());return this.day(this.day()%7?u:u-7)}else return this.day()||7}function nD(s){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||Hf.call(this),s?this._weekdaysStrictRegex:this._weekdaysRegex):(c(this,"_weekdaysRegex")||(this._weekdaysRegex=WC),this._weekdaysStrictRegex&&s?this._weekdaysStrictRegex:this._weekdaysRegex)}function iD(s){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||Hf.call(this),s?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(c(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=GC),this._weekdaysShortStrictRegex&&s?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function oD(s){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||Hf.call(this),s?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(c(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=XC),this._weekdaysMinStrictRegex&&s?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Hf(){function s(Gt,Nn){return Nn.length-Gt.length}var u=[],m=[],p=[],_=[],R,V,ne,me,De;for(R=0;R<7;R++)V=C([2e3,1]).day(R),ne=$r(this.weekdaysMin(V,"")),me=$r(this.weekdaysShort(V,"")),De=$r(this.weekdays(V,"")),u.push(ne),m.push(me),p.push(De),_.push(ne),_.push(me),_.push(De);u.sort(s),m.sort(s),p.sort(s),_.sort(s),this._weekdaysRegex=new RegExp("^("+_.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+p.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+m.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+u.join("|")+")","i")}function Ff(){return this.hours()%12||12}function sD(){return this.hours()||24}te("H",["HH",2],0,"hour"),te("h",["hh",2],0,Ff),te("k",["kk",2],0,sD),te("hmm",0,0,function(){return""+Ff.apply(this)+ee(this.minutes(),2)}),te("hmmss",0,0,function(){return""+Ff.apply(this)+ee(this.minutes(),2)+ee(this.seconds(),2)}),te("Hmm",0,0,function(){return""+this.hours()+ee(this.minutes(),2)}),te("Hmmss",0,0,function(){return""+this.hours()+ee(this.minutes(),2)+ee(this.seconds(),2)});function Fv(s,u){te(s,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),u)})}Fv("a",!0),Fv("A",!1);function Uv(s,u){return u._meridiemParse}re("a",Uv),re("A",Uv),re("H",ze,$o),re("h",ze,ui),re("k",ze,ui),re("HH",ze,It),re("hh",ze,It),re("kk",ze,It),re("hmm",rc),re("hmmss",Ur),re("Hmm",rc),re("Hmmss",Ur),L(["H","HH"],B),L(["k","kk"],function(s,u,m){var p=j(s);u[B]=p===24?0:p}),L(["a","A"],function(s,u,m){m._isPm=m._locale.isPM(s),m._meridiem=s}),L(["h","hh"],function(s,u,m){u[B]=j(s),T(m).bigHour=!0}),L("hmm",function(s,u,m){var p=s.length-2;u[B]=j(s.substr(0,p)),u[oe]=j(s.substr(p)),T(m).bigHour=!0}),L("hmmss",function(s,u,m){var p=s.length-4,_=s.length-2;u[B]=j(s.substr(0,p)),u[oe]=j(s.substr(p,2)),u[he]=j(s.substr(_)),T(m).bigHour=!0}),L("Hmm",function(s,u,m){var p=s.length-2;u[B]=j(s.substr(0,p)),u[oe]=j(s.substr(p))}),L("Hmmss",function(s,u,m){var p=s.length-4,_=s.length-2;u[B]=j(s.substr(0,p)),u[oe]=j(s.substr(p,2)),u[he]=j(s.substr(_))});function aD(s){return(s+"").toLowerCase().charAt(0)==="p"}var lD=/[ap]\.?m?\.?/i,cD=jr("Hours",!0);function uD(s,u,m){return s>11?m?"pm":"PM":m?"am":"AM"}var $v={calendar:W,longDateFormat:hr,invalidDate:mr,ordinal:Mf,dayOfMonthOrdinalParse:En,relativeTime:Nf,months:je,monthsShort:qe,week:NC,weekdays:$C,weekdaysMin:BC,weekdaysShort:Hv,meridiemParse:lD},ot={},va={},ya;function dD(s,u){var m,p=Math.min(s.length,u.length);for(m=0;m0;){if(_=oc(R.slice(0,m).join("-")),_)return _;if(p&&p.length>=m&&dD(R,p)>=m-1)break;m--}u++}return ya}function hD(s){return!!(s&&s.match("^[^/\\\\]*$"))}function oc(s){var u=null,m;if(ot[s]===void 0&&e&&e.exports&&hD(s))try{u=ya._abbr,m=oC,m("./locale/"+s),mi(u)}catch{ot[s]=null}return ot[s]}function mi(s,u){var m;return s&&(h(u)?m=On(s):m=Uf(s,u),m?ya=m:typeof console<"u"&&console.warn&&console.warn("Locale "+s+" not found. Did you forget to load it?")),ya._abbr}function Uf(s,u){if(u!==null){var m,p=$v;if(u.abbr=s,ot[s]!=null)Q("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),p=ot[s]._config;else if(u.parentLocale!=null)if(ot[u.parentLocale]!=null)p=ot[u.parentLocale]._config;else if(m=oc(u.parentLocale),m!=null)p=m._config;else return va[u.parentLocale]||(va[u.parentLocale]=[]),va[u.parentLocale].push({name:s,config:u}),null;return ot[s]=new it(Ne(p,u)),va[s]&&va[s].forEach(function(_){Uf(_.name,_.config)}),mi(s),ot[s]}else return delete ot[s],null}function mD(s,u){if(u!=null){var m,p,_=$v;ot[s]!=null&&ot[s].parentLocale!=null?ot[s].set(Ne(ot[s]._config,u)):(p=oc(s),p!=null&&(_=p._config),u=Ne(_,u),p==null&&(u.abbr=s),m=new it(u),m.parentLocale=ot[s],ot[s]=m),mi(s)}else ot[s]!=null&&(ot[s].parentLocale!=null?(ot[s]=ot[s].parentLocale,s===mi()&&mi(s)):ot[s]!=null&&delete ot[s]);return ot[s]}function On(s){var u;if(s&&s._locale&&s._locale._abbr&&(s=s._locale._abbr),!s)return ya;if(!o(s)){if(u=oc(s),u)return u;s=[s]}return fD(s)}function pD(){return Ee(ot)}function $f(s){var u,m=s._a;return m&&T(s).overflow===-2&&(u=m[q]<0||m[q]>11?q:m[Z]<1||m[Z]>fi(m[le],m[q])?Z:m[B]<0||m[B]>24||m[B]===24&&(m[oe]!==0||m[he]!==0||m[ve]!==0)?B:m[oe]<0||m[oe]>59?oe:m[he]<0||m[he]>59?he:m[ve]<0||m[ve]>999?ve:-1,T(s)._overflowDayOfYear&&(uZ)&&(u=Z),T(s)._overflowWeeks&&u===-1&&(u=Ct),T(s)._overflowWeekday&&u===-1&&(u=Ue),T(s).overflow=u),s}var gD=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,vD=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,yD=/Z|[+-]\d\d(?::?\d\d)?/,sc=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],Bf=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],wD=/^\/?Date\((-?\d+)/i,_D=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,xD={UT:0,GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function Wv(s){var u,m,p=s._i,_=gD.exec(p)||vD.exec(p),R,V,ne,me,De=sc.length,Gt=Bf.length;if(_){for(T(s).iso=!0,u=0,m=De;u_e(V)||s._dayOfYear===0)&&(T(s)._overflowDayOfYear=!0),m=pa(V,0,s._dayOfYear),s._a[q]=m.getUTCMonth(),s._a[Z]=m.getUTCDate()),u=0;u<3&&s._a[u]==null;++u)s._a[u]=p[u]=_[u];for(;u<7;u++)s._a[u]=p[u]=s._a[u]==null?u===2?1:0:s._a[u];s._a[B]===24&&s._a[oe]===0&&s._a[he]===0&&s._a[ve]===0&&(s._nextDay=!0,s._a[B]=0),s._d=(s._useUTC?pa:MC).apply(null,p),R=s._useUTC?s._d.getUTCDay():s._d.getDay(),s._tzm!=null&&s._d.setUTCMinutes(s._d.getUTCMinutes()-s._tzm),s._nextDay&&(s._a[B]=24),s._w&&typeof s._w.d<"u"&&s._w.d!==R&&(T(s).weekdayMismatch=!0)}}function TD(s){var u,m,p,_,R,V,ne,me,De;u=s._w,u.GG!=null||u.W!=null||u.E!=null?(R=1,V=4,m=Xo(u.GG,s._a[le],ga(Ze(),1,4).year),p=Xo(u.W,1),_=Xo(u.E,1),(_<1||_>7)&&(me=!0)):(R=s._locale._week.dow,V=s._locale._week.doy,De=ga(Ze(),R,V),m=Xo(u.gg,s._a[le],De.year),p=Xo(u.w,De.week),u.d!=null?(_=u.d,(_<0||_>6)&&(me=!0)):u.e!=null?(_=u.e+R,(u.e<0||u.e>6)&&(me=!0)):_=R),p<1||p>Pn(m,R,V)?T(s)._overflowWeeks=!0:me!=null?T(s)._overflowWeekday=!0:(ne=zv(m,p,_,R,V),s._a[le]=ne.year,s._dayOfYear=ne.dayOfYear)}n.ISO_8601=function(){},n.RFC_2822=function(){};function Gf(s){if(s._f===n.ISO_8601){Wv(s);return}if(s._f===n.RFC_2822){Gv(s);return}s._a=[],T(s).empty=!0;var u=""+s._i,m,p,_,R,V,ne=u.length,me=0,De,Gt;for(_=Hr(s._f,s._locale).match(ge)||[],Gt=_.length,m=0;m0&&T(s).unusedInput.push(V),u=u.slice(u.indexOf(p)+p.length),me+=p.length),Ae[R]?(p?T(s).empty=!1:T(s).unusedTokens.push(R),ie(R,p,s)):s._strict&&!p&&T(s).unusedTokens.push(R);T(s).charsLeftOver=ne-me,u.length>0&&T(s).unusedInput.push(u),s._a[B]<=12&&T(s).bigHour===!0&&s._a[B]>0&&(T(s).bigHour=void 0),T(s).parsedDateParts=s._a.slice(0),T(s).meridiem=s._meridiem,s._a[B]=RD(s._locale,s._a[B],s._meridiem),De=T(s).era,De!==null&&(s._a[le]=s._locale.erasConvertYear(De,s._a[le])),Wf(s),$f(s)}function RD(s,u,m){var p;return m==null?u:s.meridiemHour!=null?s.meridiemHour(u,m):(s.isPM!=null&&(p=s.isPM(m),p&&u<12&&(u+=12),!p&&u===12&&(u=0)),u)}function AD(s){var u,m,p,_,R,V,ne=!1,me=s._f.length;if(me===0){T(s).invalidFormat=!0,s._d=new Date(NaN);return}for(_=0;_this?this:s:k()});function Qv(s,u){var m,p;if(u.length===1&&o(u[0])&&(u=u[0]),!u.length)return Ze();for(m=u[0],p=1;pthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function ZD(){if(!h(this._isDSTShifted))return this._isDSTShifted;var s={},u;return E(s,this),s=Xv(s),s._a?(u=s._isUTC?C(s._a):Ze(s._a),this._isDSTShifted=this.isValid()&&UD(s._a,u.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function JD(){return this.isValid()?!this._isUTC:!1}function eE(){return this.isValid()?this._isUTC:!1}function Zv(){return this.isValid()?this._isUTC&&this._offset===0:!1}var tE=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,rE=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function Br(s,u){var m=s,p=null,_,R,V;return lc(s)?m={ms:s._milliseconds,d:s._days,M:s._months}:g(s)||!isNaN(+s)?(m={},u?m[u]=+s:m.milliseconds=+s):(p=tE.exec(s))?(_=p[1]==="-"?-1:1,m={y:0,d:j(p[Z])*_,h:j(p[B])*_,m:j(p[oe])*_,s:j(p[he])*_,ms:j(Xf(p[ve]*1e3))*_}):(p=rE.exec(s))?(_=p[1]==="-"?-1:1,m={y:so(p[2],_),M:so(p[3],_),w:so(p[4],_),d:so(p[5],_),h:so(p[6],_),m:so(p[7],_),s:so(p[8],_)}):m==null?m={}:typeof m=="object"&&("from"in m||"to"in m)&&(V=nE(Ze(m.from),Ze(m.to)),m={},m.ms=V.milliseconds,m.M=V.months),R=new ac(m),lc(s)&&c(s,"_locale")&&(R._locale=s._locale),lc(s)&&c(s,"_isValid")&&(R._isValid=s._isValid),R}Br.fn=ac.prototype,Br.invalid=FD;function so(s,u){var m=s&&parseFloat(s.replace(",","."));return(isNaN(m)?0:m)*u}function Jv(s,u){var m={};return m.months=u.month()-s.month()+(u.year()-s.year())*12,s.clone().add(m.months,"M").isAfter(u)&&--m.months,m.milliseconds=+u-+s.clone().add(m.months,"M"),m}function nE(s,u){var m;return s.isValid()&&u.isValid()?(u=Qf(u,s),s.isBefore(u)?m=Jv(s,u):(m=Jv(u,s),m.milliseconds=-m.milliseconds,m.months=-m.months),m):{milliseconds:0,months:0}}function ey(s,u){return function(m,p){var _,R;return p!==null&&!isNaN(+p)&&(Q(u,"moment()."+u+"(period, number) is deprecated. Please use moment()."+u+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),R=m,m=p,p=R),_=Br(m,p),ty(this,_,s),this}}function ty(s,u,m,p){var _=u._milliseconds,R=Xf(u._days),V=Xf(u._months);s.isValid()&&(p=p??!0,V&&Nv(s,Wt(s,"Month")+V*m),R&&vr(s,"Date",Wt(s,"Date")+R*m),_&&s._d.setTime(s._d.valueOf()+_*m),p&&n.updateOffset(s,R||V))}var iE=ey(1,"add"),oE=ey(-1,"subtract");function ry(s){return typeof s=="string"||s instanceof String}function sE(s){return P(s)||v(s)||ry(s)||g(s)||lE(s)||aE(s)||s===null||s===void 0}function aE(s){var u=a(s)&&!d(s),m=!1,p=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],_,R,V=p.length;for(_=0;_m.valueOf():m.valueOf()9999?ln(m,u?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):G(Date.prototype.toISOString)?u?this.toDate().toISOString():new Date(this.valueOf()+this.utcOffset()*60*1e3).toISOString().replace("Z",ln(m,"Z")):ln(m,u?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function SE(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var s="moment",u="",m,p,_,R;return this.isLocal()||(s=this.utcOffset()===0?"moment.utc":"moment.parseZone",u="Z"),m="["+s+'("]',p=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",_="-MM-DD[T]HH:mm:ss.SSS",R=u+'[")]',this.format(m+p+_+R)}function bE(s){s||(s=this.isUtc()?n.defaultFormatUtc:n.defaultFormat);var u=ln(this,s);return this.localeData().postformat(u)}function kE(s,u){return this.isValid()&&(P(s)&&s.isValid()||Ze(s).isValid())?Br({to:this,from:s}).locale(this.locale()).humanize(!u):this.localeData().invalidDate()}function CE(s){return this.from(Ze(),s)}function DE(s,u){return this.isValid()&&(P(s)&&s.isValid()||Ze(s).isValid())?Br({from:this,to:s}).locale(this.locale()).humanize(!u):this.localeData().invalidDate()}function EE(s){return this.to(Ze(),s)}function ny(s){var u;return s===void 0?this._locale._abbr:(u=On(s),u!=null&&(this._locale=u),this)}var iy=Y("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(s){return s===void 0?this.localeData():this.locale(s)});function oy(){return this._locale}var uc=1e3,Ko=60*uc,dc=60*Ko,sy=(365*400+97)*24*dc;function Qo(s,u){return(s%u+u)%u}function ay(s,u,m){return s<100&&s>=0?new Date(s+400,u,m)-sy:new Date(s,u,m).valueOf()}function ly(s,u,m){return s<100&&s>=0?Date.UTC(s+400,u,m)-sy:Date.UTC(s,u,m)}function jE(s){var u,m;if(s=er(s),s===void 0||s==="millisecond"||!this.isValid())return this;switch(m=this._isUTC?ly:ay,s){case"year":u=m(this.year(),0,1);break;case"quarter":u=m(this.year(),this.month()-this.month()%3,1);break;case"month":u=m(this.year(),this.month(),1);break;case"week":u=m(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":u=m(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":u=m(this.year(),this.month(),this.date());break;case"hour":u=this._d.valueOf(),u-=Qo(u+(this._isUTC?0:this.utcOffset()*Ko),dc);break;case"minute":u=this._d.valueOf(),u-=Qo(u,Ko);break;case"second":u=this._d.valueOf(),u-=Qo(u,uc);break}return this._d.setTime(u),n.updateOffset(this,!0),this}function TE(s){var u,m;if(s=er(s),s===void 0||s==="millisecond"||!this.isValid())return this;switch(m=this._isUTC?ly:ay,s){case"year":u=m(this.year()+1,0,1)-1;break;case"quarter":u=m(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":u=m(this.year(),this.month()+1,1)-1;break;case"week":u=m(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":u=m(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":u=m(this.year(),this.month(),this.date()+1)-1;break;case"hour":u=this._d.valueOf(),u+=dc-Qo(u+(this._isUTC?0:this.utcOffset()*Ko),dc)-1;break;case"minute":u=this._d.valueOf(),u+=Ko-Qo(u,Ko)-1;break;case"second":u=this._d.valueOf(),u+=uc-Qo(u,uc)-1;break}return this._d.setTime(u),n.updateOffset(this,!0),this}function RE(){return this._d.valueOf()-(this._offset||0)*6e4}function AE(){return Math.floor(this.valueOf()/1e3)}function PE(){return new Date(this.valueOf())}function OE(){var s=this;return[s.year(),s.month(),s.date(),s.hour(),s.minute(),s.second(),s.millisecond()]}function LE(){var s=this;return{years:s.year(),months:s.month(),date:s.date(),hours:s.hours(),minutes:s.minutes(),seconds:s.seconds(),milliseconds:s.milliseconds()}}function ME(){return this.isValid()?this.toISOString():null}function IE(){return w(this)}function NE(){return S({},T(this))}function VE(){return T(this).overflow}function YE(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}te("N",0,0,"eraAbbr"),te("NN",0,0,"eraAbbr"),te("NNN",0,0,"eraAbbr"),te("NNNN",0,0,"eraName"),te("NNNNN",0,0,"eraNarrow"),te("y",["y",1],"yo","eraYear"),te("y",["yy",2],0,"eraYear"),te("y",["yyy",3],0,"eraYear"),te("y",["yyyy",4],0,"eraYear"),re("N",Zf),re("NN",Zf),re("NNN",Zf),re("NNNN",QE),re("NNNNN",qE),L(["N","NN","NNN","NNNN","NNNNN"],function(s,u,m,p){var _=m._locale.erasParse(s,p,m._strict);_?T(m).era=_:T(m).invalidEra=s}),re("y",ci),re("yy",ci),re("yyy",ci),re("yyyy",ci),re("yo",ZE),L(["y","yy","yyy","yyyy"],le),L(["yo"],function(s,u,m,p){var _;m._locale._eraYearOrdinalRegex&&(_=s.match(m._locale._eraYearOrdinalRegex)),m._locale.eraYearOrdinalParse?u[le]=m._locale.eraYearOrdinalParse(s,_):u[le]=parseInt(s,10)});function zE(s,u){var m,p,_,R=this._eras||On("en")._eras;for(m=0,p=R.length;m=0)return R[p]}function FE(s,u){var m=s.since<=s.until?1:-1;return u===void 0?n(s.since).year():n(s.since).year()+(u-s.offset)*m}function UE(){var s,u,m,p=this.localeData().eras();for(s=0,u=p.length;sR&&(u=R),oj.call(this,s,u,m,p,_))}function oj(s,u,m,p,_){var R=zv(s,u,m,p,_),V=pa(R.year,0,R.dayOfYear);return this.year(V.getUTCFullYear()),this.month(V.getUTCMonth()),this.date(V.getUTCDate()),this}te("Q",0,"Qo","quarter"),re("Q",fa),L("Q",function(s,u){u[q]=(j(s)-1)*3});function sj(s){return s==null?Math.ceil((this.month()+1)/3):this.month((s-1)*3+this.month()%3)}te("D",["DD",2],"Do","date"),re("D",ze,ui),re("DD",ze,It),re("Do",function(s,u){return s?u._dayOfMonthOrdinalParse||u._ordinalParse:u._dayOfMonthOrdinalParseLenient}),L(["D","DD"],Z),L("Do",function(s,u){u[Z]=j(s.match(ze)[0])});var uy=jr("Date",!0);te("DDD",["DDDD",3],"DDDo","dayOfYear"),re("DDD",eo),re("DDDD",Fr),L(["DDD","DDDD"],function(s,u,m){m._dayOfYear=j(s)});function aj(s){var u=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return s==null?u:this.add(s-u,"d")}te("m",["mm",2],0,"minute"),re("m",ze,$o),re("mm",ze,It),L(["m","mm"],oe);var lj=jr("Minutes",!1);te("s",["ss",2],0,"second"),re("s",ze,$o),re("ss",ze,It),L(["s","ss"],he);var cj=jr("Seconds",!1);te("S",0,0,function(){return~~(this.millisecond()/100)}),te(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),te(0,["SSS",3],0,"millisecond"),te(0,["SSSS",4],0,function(){return this.millisecond()*10}),te(0,["SSSSS",5],0,function(){return this.millisecond()*100}),te(0,["SSSSSS",6],0,function(){return this.millisecond()*1e3}),te(0,["SSSSSSS",7],0,function(){return this.millisecond()*1e4}),te(0,["SSSSSSSS",8],0,function(){return this.millisecond()*1e5}),te(0,["SSSSSSSSS",9],0,function(){return this.millisecond()*1e6}),re("S",eo,fa),re("SS",eo,It),re("SSS",eo,Fr);var pi,dy;for(pi="SSSS";pi.length<=9;pi+="S")re(pi,ci);function uj(s,u){u[ve]=j(("0."+s)*1e3)}for(pi="S";pi.length<=9;pi+="S")L(pi,uj);dy=jr("Milliseconds",!1),te("z",0,0,"zoneAbbr"),te("zz",0,0,"zoneName");function dj(){return this._isUTC?"UTC":""}function fj(){return this._isUTC?"Coordinated Universal Time":""}var U=I.prototype;U.add=iE,U.calendar=dE,U.clone=fE,U.diff=wE,U.endOf=TE,U.format=bE,U.from=kE,U.fromNow=CE,U.to=DE,U.toNow=EE,U.get=ma,U.invalidAt=VE,U.isAfter=hE,U.isBefore=mE,U.isBetween=pE,U.isSame=gE,U.isSameOrAfter=vE,U.isSameOrBefore=yE,U.isValid=IE,U.lang=iy,U.locale=ny,U.localeData=oy,U.max=ID,U.min=MD,U.parsingFlags=NE,U.set=io,U.startOf=jE,U.subtract=oE,U.toArray=OE,U.toObject=LE,U.toDate=PE,U.toISOString=xE,U.inspect=SE,typeof Symbol<"u"&&Symbol.for!=null&&(U[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),U.toJSON=ME,U.toString=_E,U.unix=AE,U.valueOf=RE,U.creationData=YE,U.eraName=UE,U.eraNarrow=$E,U.eraAbbr=BE,U.eraYear=WE,U.year=Qe,U.isLeapYear=di,U.weekYear=JE,U.isoWeekYear=ej,U.quarter=U.quarters=sj,U.month=Vv,U.daysInMonth=PC,U.week=U.weeks=zC,U.isoWeek=U.isoWeeks=HC,U.weeksInYear=nj,U.weeksInWeekYear=ij,U.isoWeeksInYear=tj,U.isoWeeksInISOWeekYear=rj,U.date=uy,U.day=U.days=eD,U.weekday=tD,U.isoWeekday=rD,U.dayOfYear=aj,U.hour=U.hours=cD,U.minute=U.minutes=lj,U.second=U.seconds=cj,U.millisecond=U.milliseconds=dy,U.utcOffset=BD,U.utc=GD,U.local=XD,U.parseZone=KD,U.hasAlignedHourOffset=QD,U.isDST=qD,U.isLocal=JD,U.isUtcOffset=eE,U.isUtc=Zv,U.isUTC=Zv,U.zoneAbbr=dj,U.zoneName=fj,U.dates=Y("dates accessor is deprecated. Use date instead.",uy),U.months=Y("months accessor is deprecated. Use month instead",Vv),U.years=Y("years accessor is deprecated. Use year instead",Qe),U.zone=Y("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",WD),U.isDSTShifted=Y("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",ZD);function hj(s){return Ze(s*1e3)}function mj(){return Ze.apply(null,arguments).parseZone()}function fy(s){return s}var Le=it.prototype;Le.calendar=ue,Le.longDateFormat=yt,Le.invalidDate=pr,Le.ordinal=If,Le.preparse=fy,Le.postformat=fy,Le.relativeTime=ec,Le.pastFuture=Vf,Le.set=Oe,Le.eras=zE,Le.erasParse=HE,Le.erasConvertYear=FE,Le.erasAbbrRegex=XE,Le.erasNameRegex=GE,Le.erasNarrowRegex=KE,Le.months=hi,Le.monthsShort=nc,Le.monthsParse=AC,Le.monthsRegex=LC,Le.monthsShortRegex=OC,Le.week=IC,Le.firstDayOfYear=YC,Le.firstDayOfWeek=VC,Le.weekdays=KC,Le.weekdaysMin=qC,Le.weekdaysShort=QC,Le.weekdaysParse=JC,Le.weekdaysRegex=nD,Le.weekdaysShortRegex=iD,Le.weekdaysMinRegex=oD,Le.isPM=aD,Le.meridiem=uD;function hc(s,u,m,p){var _=On(),R=C().set(p,u);return _[m](R,s)}function hy(s,u,m){if(g(s)&&(u=s,s=void 0),s=s||"",u!=null)return hc(s,u,m,"month");var p,_=[];for(p=0;p<12;p++)_[p]=hc(s,p,m,"month");return _}function eh(s,u,m,p){typeof s=="boolean"?(g(u)&&(m=u,u=void 0),u=u||""):(u=s,m=u,s=!1,g(u)&&(m=u,u=void 0),u=u||"");var _=On(),R=s?_._week.dow:0,V,ne=[];if(m!=null)return hc(u,(m+R)%7,p,"day");for(V=0;V<7;V++)ne[V]=hc(u,(V+R)%7,p,"day");return ne}function pj(s,u){return hy(s,u,"months")}function gj(s,u){return hy(s,u,"monthsShort")}function vj(s,u,m){return eh(s,u,m,"weekdays")}function yj(s,u,m){return eh(s,u,m,"weekdaysShort")}function wj(s,u,m){return eh(s,u,m,"weekdaysMin")}mi("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(s){var u=s%10,m=j(s%100/10)===1?"th":u===1?"st":u===2?"nd":u===3?"rd":"th";return s+m}}),n.lang=Y("moment.lang is deprecated. Use moment.locale instead.",mi),n.langData=Y("moment.langData is deprecated. Use moment.localeData instead.",On);var Ln=Math.abs;function _j(){var s=this._data;return this._milliseconds=Ln(this._milliseconds),this._days=Ln(this._days),this._months=Ln(this._months),s.milliseconds=Ln(s.milliseconds),s.seconds=Ln(s.seconds),s.minutes=Ln(s.minutes),s.hours=Ln(s.hours),s.months=Ln(s.months),s.years=Ln(s.years),this}function my(s,u,m,p){var _=Br(u,m);return s._milliseconds+=p*_._milliseconds,s._days+=p*_._days,s._months+=p*_._months,s._bubble()}function xj(s,u){return my(this,s,u,1)}function Sj(s,u){return my(this,s,u,-1)}function py(s){return s<0?Math.floor(s):Math.ceil(s)}function bj(){var s=this._milliseconds,u=this._days,m=this._months,p=this._data,_,R,V,ne,me;return s>=0&&u>=0&&m>=0||s<=0&&u<=0&&m<=0||(s+=py(th(m)+u)*864e5,u=0,m=0),p.milliseconds=s%1e3,_=tr(s/1e3),p.seconds=_%60,R=tr(_/60),p.minutes=R%60,V=tr(R/60),p.hours=V%24,u+=tr(V/24),me=tr(gy(u)),m+=me,u-=py(th(me)),ne=tr(m/12),m%=12,p.days=u,p.months=m,p.years=ne,this}function gy(s){return s*4800/146097}function th(s){return s*146097/4800}function kj(s){if(!this.isValid())return NaN;var u,m,p=this._milliseconds;if(s=er(s),s==="month"||s==="quarter"||s==="year")switch(u=this._days+p/864e5,m=this._months+gy(u),s){case"month":return m;case"quarter":return m/3;case"year":return m/12}else switch(u=this._days+Math.round(th(this._months)),s){case"week":return u/7+p/6048e5;case"day":return u+p/864e5;case"hour":return u*24+p/36e5;case"minute":return u*1440+p/6e4;case"second":return u*86400+p/1e3;case"millisecond":return Math.floor(u*864e5)+p;default:throw new Error("Unknown unit "+s)}}function Mn(s){return function(){return this.as(s)}}var vy=Mn("ms"),Cj=Mn("s"),Dj=Mn("m"),Ej=Mn("h"),jj=Mn("d"),Tj=Mn("w"),Rj=Mn("M"),Aj=Mn("Q"),Pj=Mn("y"),Oj=vy;function Lj(){return Br(this)}function Mj(s){return s=er(s),this.isValid()?this[s+"s"]():NaN}function ao(s){return function(){return this.isValid()?this._data[s]:NaN}}var Ij=ao("milliseconds"),Nj=ao("seconds"),Vj=ao("minutes"),Yj=ao("hours"),zj=ao("days"),Hj=ao("months"),Fj=ao("years");function Uj(){return tr(this.days()/7)}var In=Math.round,qo={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function $j(s,u,m,p,_){return _.relativeTime(u||1,!!m,s,p)}function Bj(s,u,m,p){var _=Br(s).abs(),R=In(_.as("s")),V=In(_.as("m")),ne=In(_.as("h")),me=In(_.as("d")),De=In(_.as("M")),Gt=In(_.as("w")),Nn=In(_.as("y")),gi=R<=m.ss&&["s",R]||R0,gi[4]=p,$j.apply(null,gi)}function Wj(s){return s===void 0?In:typeof s=="function"?(In=s,!0):!1}function Gj(s,u){return qo[s]===void 0?!1:u===void 0?qo[s]:(qo[s]=u,s==="s"&&(qo.ss=u-1),!0)}function Xj(s,u){if(!this.isValid())return this.localeData().invalidDate();var m=!1,p=qo,_,R;return typeof s=="object"&&(u=s,s=!1),typeof s=="boolean"&&(m=s),typeof u=="object"&&(p=Object.assign({},qo,u),u.s!=null&&u.ss==null&&(p.ss=u.s-1)),_=this.localeData(),R=Bj(this,!m,p,_),m&&(R=_.pastFuture(+this,R)),_.postformat(R)}var rh=Math.abs;function Zo(s){return(s>0)-(s<0)||+s}function mc(){if(!this.isValid())return this.localeData().invalidDate();var s=rh(this._milliseconds)/1e3,u=rh(this._days),m=rh(this._months),p,_,R,V,ne=this.asSeconds(),me,De,Gt,Nn;return ne?(p=tr(s/60),_=tr(p/60),s%=60,p%=60,R=tr(m/12),m%=12,V=s?s.toFixed(3).replace(/\.?0+$/,""):"",me=ne<0?"-":"",De=Zo(this._months)!==Zo(ne)?"-":"",Gt=Zo(this._days)!==Zo(ne)?"-":"",Nn=Zo(this._milliseconds)!==Zo(ne)?"-":"",me+"P"+(R?De+R+"Y":"")+(m?De+m+"M":"")+(u?Gt+u+"D":"")+(_||p||s?"T":"")+(_?Nn+_+"H":"")+(p?Nn+p+"M":"")+(s?Nn+V+"S":"")):"P0D"}var Te=ac.prototype;Te.isValid=HD,Te.abs=_j,Te.add=xj,Te.subtract=Sj,Te.as=kj,Te.asMilliseconds=vy,Te.asSeconds=Cj,Te.asMinutes=Dj,Te.asHours=Ej,Te.asDays=jj,Te.asWeeks=Tj,Te.asMonths=Rj,Te.asQuarters=Aj,Te.asYears=Pj,Te.valueOf=Oj,Te._bubble=bj,Te.clone=Lj,Te.get=Mj,Te.milliseconds=Ij,Te.seconds=Nj,Te.minutes=Vj,Te.hours=Yj,Te.days=zj,Te.weeks=Uj,Te.months=Hj,Te.years=Fj,Te.humanize=Xj,Te.toISOString=mc,Te.toString=mc,Te.toJSON=mc,Te.locale=ny,Te.localeData=oy,Te.toIsoString=Y("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",mc),Te.lang=iy,te("X",0,0,"unix"),te("x",0,0,"valueOf"),re("x",ro),re("X",ha),L("X",function(s,u,m){m._d=new Date(parseFloat(s)*1e3)}),L("x",function(s,u,m){m._d=new Date(j(s))});//! moment.js +return n.version="2.30.1",i(Ze),n.fn=U,n.min=ND,n.max=VD,n.now=YD,n.utc=C,n.unix=hj,n.months=pj,n.isDate=v,n.locale=mi,n.invalid=k,n.duration=Br,n.isMoment=P,n.weekdays=vj,n.parseZone=mj,n.localeData=On,n.isDuration=lc,n.monthsShort=gj,n.weekdaysMin=wj,n.defineLocale=Uf,n.updateLocale=mD,n.locales=pD,n.weekdaysShort=yj,n.normalizeUnits=er,n.relativeTimeRounding=Wj,n.relativeTimeThreshold=Gj,n.calendarFormat=uE,n.prototype=U,n.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},n})}(pm)),pm.exports}(function(e,t){(function(r,n){n(typeof oC=="function"?Q9():r.moment)})(fs,function(r){//! moment.js locale configuration +var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(i,o){return i===12&&(i=0),o==="凌晨"||o==="早上"||o==="上午"?i:o==="下午"||o==="晚上"?i+12:i>=11?i:i+12},meridiem:function(i,o,a){var c=i*100+o;return c<600?"凌晨":c<900?"早上":c<1130?"上午":c<1230?"中午":c<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:function(i){return i.week()!==this.week()?"[下]dddLT":"[本]dddLT"},lastDay:"[昨天]LT",lastWeek:function(i){return this.week()!==i.week()?"[上]dddLT":"[本]dddLT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(i,o){switch(o){case"d":case"D":case"DDD":return i+"日";case"M":return i+"月";case"w":case"W":return i+"周";default:return i}},relativeTime:{future:"%s后",past:"%s前",s:"几秒",ss:"%d 秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",w:"1 周",ww:"%d 周",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},week:{dow:1,doy:4}});return n})})();const sC="/zh-cn/assets/wechat-qrcode-8dca7947.png",aC="/zh-cn/assets/logo-image-91f154f1.svg",lC="/zh-cn/assets/location-cf5a6f84.svg",cC="/zh-cn/assets/clock-718648c0.svg",uC="/zh-cn/assets/calendar-cd5a76f0.svg";X.locale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY年MM月DD日",LLL:"YYYY年MM月DD日Ah点mm分",LLLL:"YYYY年MM月DD日ddddAh点mm分",l:"YYYY-M-D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){return e===12&&(e=0),t==="凌晨"||t==="早上"||t==="上午"?e:t==="下午"||t==="晚上"?e+12:e>=11?e:e+12},meridiem:function(e,t){const r=e*100+t;return r<600?"凌晨":r<900?"早上":r<1130?"上午":r<1230?"中午":r<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"周";default:return e}},relativeTime:{future:"%s内",past:"%s前",s:"几秒",ss:"%d秒",m:"1分钟",mm:"%d分钟",h:"1小时",hh:"%d小时",d:"1天",dd:"%d天",M:"1个月",MM:"%d个月",y:"1年",yy:"%d年"},week:{dow:1,doy:4}});const{Heading:q9,Paragraph:Z9}=Ye,{CNTitleMedium:dC,CNTitleSmall:J9}=q9,{CNBodySmall:Ho,CNMarkSmall:eG,CNBodyLarge:tG,CNMarkMedium:fC}=Z9,rG=f.div` + background: #fafafa; +`,nG=f.div` + display: flex; + max-width: 1440px; + margin-inline: auto; + padding-block: 0.87rem; + padding-inline: 1.28rem; + @media screen and (max-width: 1024px) { + flex-direction: column; + } +`,iG=f.aside` + display: block; + width: 250px; + margin-right: 0.48rem; + @media screen and (max-width: 1024px) { + order: 2; + width: 100%; + margin-right: 0; + margin-bottom: 0.32rem; + } +`,oG=f.main` + flex-grow: 1; + @media screen and (max-width: 1024px) { + order: 3; + } +`,sG=f.aside` + width: 200px; + margin-left: 0.48rem; + @media screen and (max-width: 1024px) { + order: 1; + width: 100%; + margin-left: 0; + margin-bottom: 0.32rem; + } +`,aG=f.section` + position: sticky; + top: calc(0.84rem + 0.48rem); + left: 0; + padding: 0.22rem; + color: #141414; + background: #fff; + border-radius: 0.07rem; + box-shadow: 0 0.01rem 0.02rem 0 rgba(0, 0, 0, 0.03); +`,hC=f.section` + padding: 0.16rem; + margin-bottom: 0.12rem; + min-height: 100px; + background: #fff; + color: rgba(20, 20, 20, 0.8); + :last-child { + margin-bottom: 0; + } +`,lG=f(hC)` + position: sticky; + top: calc(84px + 48px); + left: 0; +`,x_=f(J9)` + padding-bottom: 0.11rem; + color: #7680dd; +`,un=f.div` + padding-bottom: 0.06rem; + font-size: 0.14rem; + line-height: 0.2rem; + font-weight: 400; + color: ${e=>e.theme.themeDark}; + &:last-child { + padding-bottom: 0; + } +`,dn=f.span` + font-weight: 600; +`,cG=f(Ho)` + font-weight: 600; + padding-bottom: 0.11rem; + position: relative; + padding-left: 0.24rem; + &::before { + position: absolute; + top: -0.03rem; + left: 0; + content: '📨'; + } +`,S_=f(Ho)` + font-weight: 600; + /* padding-bottom: 0.04rem; */ +`,b_=f(fC)` + font-weight: 600; + font-size: 0.16rem; + padding-bottom: 0.12rem; +`;f(fC)` + padding-bottom: 0.11rem; +`;const uG=f(Ho)` + font-weight: 400; +`,dG=f.span` + color: #7680dd; +`,fG=f.img` + display: block; + width: 0.8rem; + margin-inline: auto; + padding-top: 0.12rem; +`,hG=f(dC)` + padding-bottom: 0.14rem; +`,mG=f(dC)` + margin-bottom: 0.11rem; +`,pG=f.section` + min-height: 200px; + color: rgba(20, 20, 20, 0.7); +`,gG=f.div` + display: flex; + min-height: 200px; + margin-bottom: 0.16rem; + padding: 0.22rem; + background: #fff; + border-radius: 0.12rem; + cursor: pointer; + box-shadow: 0 0.01rem 0.018rem rgba(0, 0, 0, 0.03); + :last-child { + margin-bottom: 0; + } +`,vG=f.img` + height: min-content; + width: 0.625rem; + margin-right: 0.22rem; +`,yG=f.div` + flex-grow: 1; + position: relative; +`,wG=f(eG)` + color: #7767a0; +`,_G=f(tG)` + margin-bottom: 0.07rem; + color: #141414; +`,xG=f.div` + display: flex; + margin-bottom: 0.13rem; + @media screen and (max-width: 1024px) { + flex-direction: column; + } +`,gm=f.div` + font-size: 0.15rem; + font-weight: 400; + padding-right: 0.22rem; + @media screen and (max-width: 1024px) { + display: none; + } +`,vm=f(Ho)` + position: relative; + padding-left: 0.2rem; + padding-right: 0.22rem; + &::before { + position: absolute; + top: 0.035rem; + left: 0; + display: inline-block; + content: ''; + width: 0.14rem; + height: 0.14rem; + background-image: url(${e=>e.icon}); + background-size: cover; + } +`,SG=f.div` + padding-bottom: 0.24rem; +`,bG=f.ol` + padding-left: 0.24rem; +`,kG=f(Ho)``,CG=f(Ho)` + color: #7680dd; +`,DG=f.div` + width: 96%; + display: flex; + align-items: center; + justify-content: space-between; +`,k_=f(Ho)` + display: flex; + align-items: center; + margin-bottom: 0.07rem; + color: #393f47; +`,C_=f.input` + margin: 0; + margin-right: 0.07rem; + height: 0.145rem; + width: 0.145rem; + cursor: pointer; + &:checked { + accent-color: ${e=>e.theme.secondary01}; + } +`,EG=new Map([["fullTime","全职"],["internship","实习"]]),D_=[{id:"Rust Distributed Storage Development".split(" ").join("-").toLowerCase(),label:"Rust分布式存储开发",tag:["实习"],workNature:"远程实习",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能分布式存储系统研发,涉及的开发内容包括但不限于:","分布式数据一致性协议;","高速网络传输接口、驱动;","分布式缓存、数据管理服务;","对象存储接口;","文件存储接口;","块存储接口。"]},{title:"【岗位要求】",body:["熟悉Rust和C语言;","熟悉多线程、高并发编程;","熟悉Docker和K8S等容器相关工具;","熟悉Linux操作系统;","具有很强的学习能力,自我驱动以及团队合作意识。"]}]},{id:"Rust High Performance Web Systems Development".split(" ").join("-").toLowerCase(),label:"Rust高性能网络系统开发",tag:["实习"],workNature:"远程实习",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与研发高性能网络系统开发,涉及的工作包括但不限于:","网络硬件Linux驱动开发;","网络流量控制算法设计与实现;","网络仿真系统开发与测试。"]},{title:"【岗位要求】",body:["熟悉Rust和C语言;","熟悉多线程、高并发编程;","熟悉Docker、KVM等容器和虚拟化相关工具;","熟悉Linux操作系统网络管理相关功能;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["熟悉Rust异步编程、有tokio或async-std使用经验优先;","熟悉Linux内核IO相关功能,有eBPF、XDP相关开发经验优先;","有Linux内核网络模块相关开发经验优先;","有无损以太网流量控制相关的开发经验优先;","熟悉常见流量控制算法优先,诸如BBR、CUBIC、QCN等;","有DPDK或RDMA等高性能网络编程经验优先;","有P4、OpenFlow、NS3、SONiC等相关编程经验优先;","有K8S的CNI接口编程经验优先;","能长期实习优先。"]}]},{id:"AI platform development".split(" ").join("-").toLowerCase(),label:"AI平台研发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["负责大模型平台后端的开发研发,根据产品和项目计划按时完成功能模块的架构设计、编码、测试的全流程工作。","负责持续优化系统架构,提供高并发的数据请求分析的处理能力,提高系统的容灾容错能力,保证系统的可运维、高可用性、高可靠性。"]},{title:"【岗位要求】",body:["具备全面的软件知识结构,基础扎实,熟悉常用数据结构与算法。","熟练使用Python语言,熟悉使用常用模块,完成过基于Python的中大型项目。","熟练使用MySQL、Redis、Nginx、Flask、MongoDB等。","熟悉Linux操作,了解Shell脚本,有Linux下的多线程编程经验,有性能调优经验。","有开源项目贡献经验者优先。","熟悉机器学习,能够使用PyTorch、TensorFlow等框架者优先。","熟悉网络编程的基本模型和方法,有实际项目的开发经验者优先。"]}]},{id:"FPGA Development".split(" ").join("-").toLowerCase(),label:"FPGA开发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["负责基于FPGA实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","实现常用外设接口IP的RTL设计、集成和验证;","3.参与SoC集成设计与验证;","撰写相关设计文档。"]},{title:"【岗位要求】",body:["熟悉基于FPGA的设计流程,熟悉Xilinx的FPGA芯片架构,熟练掌握Xilinx的FPGA开发工具;","熟悉Bluespec、SpinalHDL、Chisel或Clash等新一代HDL语言;","熟练掌握Verilog、SystemVerilog或VHDL语言;","熟悉SystemVerilog Assertion的使用;","熟练掌握TCL脚本语言;","具有很强的学习能力,自我驱动以及团队合作意识;"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉PCIe、DMA、NVMe、DDR3/4、SerDes等相关接口开发优先;","有DSP领域相关经验、熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","熟悉AXI、ACE、CHI等AMBA总线协议;","熟悉基于Python的仿真测试工具Cocotb优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先。","能长期实习(6个月以上)优先。"]}]},{id:"Joint research and development of hardware and software".split(" ").join("-").toLowerCase(),label:"软硬件联合研发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能存储SoC芯片的软硬件开发:","负责网络IO加速的RTL实现;","负责加密、压缩、编码等算法加速的设计与RTL实现;","负责SoC芯片的Linux驱动开发;","负责实现软硬件联合调试与自动化测试。"]},{title:"【岗位要求】",body:["熟悉IC设计流程,熟悉常用的仿真、综合等EDA工具;","熟悉Xilinx的FPGA设计流程,熟练掌握Xilinx的FPGA开发工具;","熟悉Bluespec、SpinalHDL、Chisel或Clash等新一代HDL语言;","熟练掌握Verilog、SystemVerilog和SystemC语言;","熟悉Linux开发内核模块、驱动;","熟悉基于QEMU的软硬件联合调试工具链;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先;","熟悉CXL、PCIe、AXI、ACE、CHI、NVMe等协议接口开发优先;","有DSP领域相关经验,熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","有Linux内核网络、文件、存储相关开发经验优先;","熟悉Rust for Linux开发内核模块、驱动开发经验优先;","能长期实习(6个月以上)优先。"]}]},{id:"Digital IC front-end design".split(" ").join("-").toLowerCase(),label:"数字IC前端设计",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能存储SoC芯片的软硬件开发:","负责实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","负责实现SoC的集成、综合与原型验证;","负责实现常用外设接口IP的RTL设计、集成;","撰写相关设计文档。"]},{title:"【岗位要求】",body:["熟悉数字IC的开发工具链;","熟悉Bluespec、SpinalHDL或Chisel等新一代HDL语言;","熟练掌握Verilog、SystemVerilog、SystemC语言;","熟悉SystemVerilog Assertion的使用;","熟练掌握TCL脚本语言;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先;","熟悉CXL、PCIe、AXI、ACE、CHI、NVMe等协议接口开发优先;","有加密和编码领域相关经验,熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","熟悉基于Python的仿真测试工具Cocotb优先;","有形式化验证相关经验优先;","能长期实习优先。"]}]}],jG=()=>{const e=St(),[t,r]=N.useState(D_),[n,i]=N.useState({fullTime:!0,internship:!0});return N.useEffect(()=>{r(D_.filter(o=>n[o.workType]===!0))},[n]),N.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsx(rG,{children:l.jsxs(nG,{children:[l.jsx(iG,{children:l.jsxs(aG,{children:[l.jsx(hG,{children:"筛选"}),l.jsx(mG,{children:"工作类型"}),l.jsxs(k_,{as:"div",children:[l.jsx(C_,{type:"checkbox",id:"full-time",checked:n.fullTime,onChange:()=>{const o={...n};o.fullTime=!o.fullTime,i(o)}}),l.jsx("label",{htmlFor:"full-time",children:"全职"})]}),l.jsxs(k_,{as:"div",children:[l.jsx(C_,{type:"checkbox",id:"internship",checked:n.internship,onChange:()=>{const o={...n};o.internship=!o.internship,i(o)}}),l.jsx("label",{htmlFor:"internship",children:"兼职"})]})]})}),l.jsx(oG,{children:l.jsx(pG,{children:t.map(o=>{const{id:a,label:c,tag:d,workNature:h,workType:g,releaseTime:v,content:y}=o;return l.jsxs(gG,{onClick:()=>{e(a.split(" ").join("-"))},children:[l.jsx(vG,{src:aC}),l.jsxs(yG,{children:[l.jsx(wG,{children:d.join(", ")}),l.jsx(DG,{children:l.jsx(_G,{children:c})}),l.jsxs(xG,{children:[l.jsx(vm,{icon:lC,children:h}),l.jsx(gm,{children:"·"}),l.jsx(vm,{icon:cC,children:EG.get(g)}),l.jsx(gm,{children:"·"}),l.jsx(gm,{children:"·"}),l.jsx(vm,{icon:uC,children:X(v,"YYYY-MM-DD").fromNow()})]}),y.map(({title:S,body:C})=>l.jsxs(SG,{children:[l.jsx(CG,{as:"p",children:S}),l.jsx(bG,{children:C.map(D=>l.jsx(kG,{as:"li",children:D},D))})]},S))]})]},a)})})}),l.jsxs(sG,{children:[l.jsxs(hC,{children:[l.jsx(b_,{children:"面试流程"}),l.jsx(x_,{children:"实习岗位:"}),l.jsxs(un,{children:[l.jsx(dn,{children:"项目笔试"}),"- 两天"]}),l.jsxs(un,{children:[l.jsx(dn,{children:"思路 review"})," - 交流指导"]}),l.jsxs(un,{children:[l.jsx(dn,{children:"性能优化"})," - 不超过一周"]}),l.jsx(un,{children:l.jsx(dn,{children:"交叉面试"})}),l.jsx("div",{style:{paddingBlock:"0.06rem"}}),l.jsx(x_,{children:"校招 / 社招岗位:"}),l.jsxs(un,{children:[l.jsx(dn,{children:"项目笔试"})," - 两天"]}),l.jsxs(un,{children:[l.jsx(dn,{children:"思路 review"})," - 交流指导"]}),l.jsxs(un,{children:[l.jsx(dn,{children:"性能优化"})," - 不超过一周"]}),l.jsx(un,{children:l.jsx(dn,{children:"技术 open talk 评审"})}),l.jsx(b_,{style:{marginTop:"0.2rem"},children:"薪资待遇"}),l.jsxs(un,{children:[l.jsx(dn,{children:"实习生:"}),"入职初期为 300/天,如能力和产出优秀将予以薪资调增,最高 500/天。"]}),l.jsxs(un,{children:[l.jsx(dn,{children:"正式员工:"}),"对标国内一线大厂的薪资+期权,待面试通过后根据能力情况而定。"]})]}),l.jsxs(lG,{children:[l.jsx(cG,{children:"投递简历"}),l.jsx(S_,{children:"- 投递至邮箱:"}),l.jsx(uG,{style:{paddingTop:"0.04rem"},children:l.jsx(dG,{children:"info@datenlord.com"})}),l.jsx("div",{style:{height:"0.24rem"}}),l.jsx(S_,{children:"- 添加达坦科技小助手微信:"}),l.jsx(fG,{src:sC})]})]})]})})};X.updateLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY年MM月DD日",LLL:"YYYY年MM月DD日Ah点mm分",LLLL:"YYYY年MM月DD日ddddAh点mm分",l:"YYYY-M-D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){return e===12&&(e=0),t==="凌晨"||t==="早上"||t==="上午"?e:t==="下午"||t==="晚上"?e+12:e>=11?e:e+12},meridiem:function(e,t){const r=e*100+t;return r<600?"凌晨":r<900?"早上":r<1130?"上午":r<1230?"中午":r<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"周";default:return e}},relativeTime:{future:"%s内",past:"%s前",s:"几秒",ss:"%d秒",m:"1分钟",mm:"%d分钟",h:"1小时",hh:"%d小时",d:"1天",dd:"%d天",M:"1个月",MM:"%d个月",y:"1年",yy:"%d年"},week:{dow:1,doy:4}});const{Heading:TG,Paragraph:RG}=Ye,{CNTitleSmall:AG,CNHead5S:PG,CNTitleLarge:OG}=TG,{CNBodySmall:ca,CNMarkSmall:LG,CNBodyLarge:MG,CNMarkMedium:mC,CNBodyMedium:pC}=RG,IG=f.div` + background: #fafafa; +`,NG=f.div` + display: flex; + max-width: 1440px; + margin-inline: auto; + padding-block: 0.87rem; + padding-inline: 1.64rem; + @media screen and (max-width: 1024px) { + flex-direction: column; + } +`,VG=f.main` + flex-grow: 1; + @media screen and (max-width: 1024px) { + order: 3; + } +`,YG=f.aside` + width: 250px; + margin-left: 0.48rem; + @media screen and (max-width: 1024px) { + order: 1; + width: 100%; + margin-left: 0; + margin-bottom: 0.32rem; + } +`,gC=f.section` + padding: 0.16rem; + margin-bottom: 0.12rem; + min-height: 100px; + background: #fff; + color: rgba(20, 20, 20, 0.8); + :last-child { + margin-bottom: 0; + } +`,zG=f(gC)` + position: sticky; + top: calc(84px + 48px); + left: 0; +`,E_=f(AG)` + padding-bottom: 0.11rem; + color: #7680dd; +`,fn=f.div` + padding-bottom: 0.11rem; + font-size: 0.14rem; + line-height: 0.2rem; + font-weight: 400; + color: ${e=>e.theme.themeDark}; + &:last-child { + padding-bottom: 0; + } +`,hn=f.span` + font-weight: 600; +`,HG=f(ca)` + padding-bottom: 0.11rem; + position: relative; + padding-left: 0.24rem; + &::before { + position: absolute; + top: -0.03rem; + left: 0; + content: '📨'; + } +`,j_=f(ca)` + font-weight: 600; + padding-bottom: 0.24rem; +`,T_=f(mC)` + font-weight: 600; +`;f(mC)` + padding-bottom: 0.11rem; +`;const FG=f(ca)` + font-weight: 400; +`,UG=f.span` + color: #7680dd; +`,$G=f.img` + display: block; + width: 0.8rem; + padding-top: 0.12rem; + margin-inline: auto; +`,BG=f.section` + padding-bottom: 0.96rem; + min-height: 200px; + color: rgba(20, 20, 20, 0.7); +`,vC=f.div` + display: flex; + min-height: 200px; + margin-bottom: 0.16rem; + padding: 0.22rem; + background: #fff; + border-radius: 0.12rem; + box-shadow: 0 0.01rem 0.018rem rgba(0, 0, 0, 0.03); + :last-child { + margin-bottom: 0; + } +`,WG=f(vC)` + flex-direction: column; +`,GG=f.div` + display: flex; + justify-content: space-between; + padding-bottom: 0.24rem; +`,XG=f.img` + height: min-content; + width: 0.625rem; + margin-right: 0.22rem; +`;f.img` + display: block; + width: 0.48rem; +`;const R_=f.div` + flex-grow: 1; + position: relative; +`,KG=f(LG)` + color: #7767a0; +`,QG=f(MG)` + margin-bottom: 0.07rem; + color: #141414; +`,qG=f(OG)` + padding-bottom: 0.08rem; + color: ${e=>e.theme.gray007}; +`,ZG=f.div` + display: flex; + margin-bottom: 0.13rem; + @media screen and (max-width: 1024px) { + flex-direction: column; + } +`,ym=f.div` + font-size: 0.15rem; + font-weight: 400; + padding-right: 0.22rem; + @media screen and (max-width: 1024px) { + display: none; + } +`,wm=f(ca)` + position: relative; + padding-left: 0.2rem; + padding-right: 0.22rem; + &::before { + position: absolute; + top: 0.035rem; + left: 0; + display: inline-block; + content: ''; + width: 0.14rem; + height: 0.14rem; + background-image: url(${e=>e.icon}); + background-size: cover; + } +`,A_=f.div` + padding-bottom: 0.24rem; + &:last-of-type { + padding-bottom: 0; + } +`,P_=f.ol` + padding-left: 0.24rem; +`,JG=f(ca)``,eX=f(pC)``,tX=f(ca)` + color: #7680dd; +`,rX=f(pC)``,nX=f.button` + padding-inline: 0.18rem; + color: ${e=>e.theme.gray007}; + font-size: 0.14rem; + font-weight: 600; + line-height: 1; + background: ${e=>e.theme.white00}; + border: 0.01rem solid #dae0e6; + border-radius: 0.06rem; + cursor: pointer; +`,O_=f.div` + width: 96%; + display: flex; + align-items: center; + justify-content: space-between; +`,iX=f.div``,oX=f(PG)``,sX=f.div` + padding-top: 0.5rem; + display: grid; + grid-template-columns: repeat(2, 1fr); + grid-template-rows: repeat(1, 1fr); + grid-gap: 0.26rem; +`,aX=f.div` + display: flex; + justify-content: center; + align-items: center; + width: 0.48rem; + height: 0.48rem; + background: ${e=>e.theme.secondary02}; + border-radius: 50%; +`,lX=f.img` + width: 0.32rem; + height: 0.32rem; +`,cX=new Map([["fullTime","全职"],["internship","实习"]]),L_=[{id:"Rust Distributed Storage Development".split(" ").join("-").toLowerCase(),label:"Rust分布式存储开发",tag:["实习"],workNature:"远程实习",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能分布式存储系统研发,涉及的开发内容包括但不限于:","分布式数据一致性协议;","高速网络传输接口、驱动;","分布式缓存、数据管理服务;","对象存储接口;","文件存储接口;","块存储接口。"]},{title:"【岗位要求】",body:["熟悉Rust和C语言;","熟悉多线程、高并发编程;","熟悉Docker和K8S等容器相关工具;","熟悉Linux操作系统;","具有很强的学习能力,自我驱动以及团队合作意识。"]}]},{id:"Rust High Performance Web Systems Development".split(" ").join("-").toLowerCase(),label:"Rust高性能网络系统开发",tag:["实习"],workNature:"远程实习",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与研发高性能网络系统开发,涉及的工作包括但不限于:","网络硬件Linux驱动开发;","网络流量控制算法设计与实现;","网络仿真系统开发与测试。"]},{title:"【岗位要求】",body:["熟悉Rust和C语言;","熟悉多线程、高并发编程;","熟悉Docker、KVM等容器和虚拟化相关工具;","熟悉Linux操作系统网络管理相关功能;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["熟悉Rust异步编程、有tokio或async-std使用经验优先;","熟悉Linux内核IO相关功能,有eBPF、XDP相关开发经验优先;","有Linux内核网络模块相关开发经验优先;","有无损以太网流量控制相关的开发经验优先;","熟悉常见流量控制算法优先,诸如BBR、CUBIC、QCN等;","有DPDK或RDMA等高性能网络编程经验优先;","有P4、OpenFlow、NS3、SONiC等相关编程经验优先;","有K8S的CNI接口编程经验优先;","能长期实习优先。"]}]},{id:"AI platform development".split(" ").join("-").toLowerCase(),label:"AI平台研发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["负责大模型平台后端的开发研发,根据产品和项目计划按时完成功能模块的架构设计、编码、测试的全流程工作。","负责持续优化系统架构,提供高并发的数据请求分析的处理能力,提高系统的容灾容错能力,保证系统的可运维、高可用性、高可靠性。"]},{title:"【岗位要求】",body:["具备全面的软件知识结构,基础扎实,熟悉常用数据结构与算法。","熟练使用Python语言,熟悉使用常用模块,完成过基于Python的中大型项目。","熟练使用MySQL、Redis、Nginx、Flask、MongoDB等。","熟悉Linux操作,了解Shell脚本,有Linux下的多线程编程经验,有性能调优经验。","有开源项目贡献经验者优先。","熟悉机器学习,能够使用PyTorch、TensorFlow等框架者优先。","熟悉网络编程的基本模型和方法,有实际项目的开发经验者优先。"]}]},{id:"FPGA Development".split(" ").join("-").toLowerCase(),label:"FPGA开发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["负责基于FPGA实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","实现常用外设接口IP的RTL设计、集成和验证;","3.参与SoC集成设计与验证;","撰写相关设计文档。"]},{title:"【岗位要求】",body:["熟悉基于FPGA的设计流程,熟悉Xilinx的FPGA芯片架构,熟练掌握Xilinx的FPGA开发工具;","熟悉Bluespec、SpinalHDL、Chisel或Clash等新一代HDL语言;","熟练掌握Verilog、SystemVerilog或VHDL语言;","熟悉SystemVerilog Assertion的使用;","熟练掌握TCL脚本语言;","具有很强的学习能力,自我驱动以及团队合作意识;"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉PCIe、DMA、NVMe、DDR3/4、SerDes等相关接口开发优先;","有DSP领域相关经验、熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","熟悉AXI、ACE、CHI等AMBA总线协议;","熟悉基于Python的仿真测试工具Cocotb优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先。","能长期实习(6个月以上)优先。"]}]},{id:"Joint research and development of hardware and software".split(" ").join("-").toLowerCase(),label:"软硬件联合研发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能存储SoC芯片的软硬件开发:","负责网络IO加速的RTL实现;","负责加密、压缩、编码等算法加速的设计与RTL实现;","负责SoC芯片的Linux驱动开发;","负责实现软硬件联合调试与自动化测试。"]},{title:"【岗位要求】",body:["熟悉IC设计流程,熟悉常用的仿真、综合等EDA工具;","熟悉Xilinx的FPGA设计流程,熟练掌握Xilinx的FPGA开发工具;","熟悉Bluespec、SpinalHDL、Chisel或Clash等新一代HDL语言;","熟练掌握Verilog、SystemVerilog和SystemC语言;","熟悉Linux开发内核模块、驱动;","熟悉基于QEMU的软硬件联合调试工具链;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先;","熟悉CXL、PCIe、AXI、ACE、CHI、NVMe等协议接口开发优先;","有DSP领域相关经验,熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","有Linux内核网络、文件、存储相关开发经验优先;","熟悉Rust for Linux开发内核模块、驱动开发经验优先;","能长期实习(6个月以上)优先。"]}]},{id:"Digital IC front-end design".split(" ").join("-").toLowerCase(),label:"数字IC前端设计",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能存储SoC芯片的软硬件开发:","负责实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","负责实现SoC的集成、综合与原型验证;","负责实现常用外设接口IP的RTL设计、集成;","撰写相关设计文档。"]},{title:"【岗位要求】",body:["熟悉数字IC的开发工具链;","熟悉Bluespec、SpinalHDL或Chisel等新一代HDL语言;","熟练掌握Verilog、SystemVerilog、SystemC语言;","熟悉SystemVerilog Assertion的使用;","熟练掌握TCL脚本语言;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先;","熟悉CXL、PCIe、AXI、ACE、CHI、NVMe等协议接口开发优先;","有加密和编码领域相关经验,熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","熟悉基于Python的仿真测试工具Cocotb优先;","有形式化验证相关经验优先;","能长期实习优先。"]}]}],uX=()=>{const e=St(),{key:t}=bn();N.useEffect(()=>{window.scrollTo(0,0)},[t]);const r=L_.filter(({id:n})=>n!==t);return l.jsx(IG,{children:l.jsxs(NG,{children:[l.jsxs(VG,{children:[l.jsx(BG,{children:L_.map(n=>{const{id:i,label:o,tag:a,workNature:c,workType:d,releaseTime:h,content:g}=n;return t===i?l.jsxs(vC,{children:[l.jsx(XG,{src:aC}),l.jsxs(R_,{children:[l.jsx(KG,{children:a.join(", ")}),l.jsx(O_,{children:l.jsx(QG,{children:o})}),l.jsxs(ZG,{children:[l.jsx(wm,{icon:lC,children:c}),l.jsx(ym,{children:"·"}),l.jsx(wm,{icon:cC,children:cX.get(d)}),l.jsx(ym,{children:"·"}),l.jsx(ym,{children:"·"}),l.jsx(wm,{icon:uC,children:X(h,"YYYY-MM-DD").fromNow()})]}),g.map(({title:v,body:y})=>l.jsxs(A_,{children:[l.jsx(tX,{as:"p",children:v}),l.jsx(P_,{children:y.map(S=>l.jsx(JG,{as:"li",children:S},S))})]},v))]})]},i):null})}),l.jsxs(iX,{children:[l.jsx(oX,{children:"相关岗位"}),l.jsx(sX,{children:r.map((n,i)=>{const{id:o,label:a,content:c}=n;return i<2?l.jsxs(WG,{children:[l.jsxs(GG,{children:[l.jsx(aX,{children:l.jsx(lX,{src:dk})}),l.jsx(nX,{onClick:()=>e(`/job-description/${o}`),children:"岗位详情"})]}),l.jsxs(R_,{children:[l.jsx(O_,{children:l.jsx(qG,{children:a})}),c.map(({title:d,body:h},g)=>{if(g===0)return l.jsxs(A_,{children:[l.jsx(rX,{as:"p",children:d}),l.jsx(P_,{children:h.map(v=>l.jsx(eX,{as:"li",children:v},v))})]},d)})]})]},o):null})})]})]}),l.jsxs(YG,{children:[l.jsxs(gC,{children:[l.jsx(T_,{children:"面试流程"}),l.jsx(E_,{children:"实习岗位:"}),l.jsxs(fn,{children:[l.jsx(hn,{children:"项目笔试"}),"- 两天"]}),l.jsxs(fn,{children:[l.jsx(hn,{children:"思路 review"})," - 交流指导"]}),l.jsxs(fn,{children:[l.jsx(hn,{children:"性能优化"})," - 不超过一周"]}),l.jsx(fn,{children:l.jsx(hn,{children:"交叉面试"})}),l.jsx("div",{style:{paddingBlock:"0.06rem"}}),l.jsx(E_,{children:"校招 / 社招岗位:"}),l.jsxs(fn,{children:[l.jsx(hn,{children:"项目笔试"})," - 两天"]}),l.jsxs(fn,{children:[l.jsx(hn,{children:"思路 review"})," - 交流指导"]}),l.jsxs(fn,{children:[l.jsx(hn,{children:"性能优化"})," - 不超过一周"]}),l.jsx(fn,{children:l.jsx(hn,{children:"技术 open talk 评审"})}),l.jsx(T_,{style:{marginTop:"0.2rem"},children:"薪资待遇"}),l.jsxs(fn,{children:[l.jsx(hn,{children:"实习生:"}),"入职初期为 300/天,如能力和产出优秀将予以薪资调增,最高 500/天。"]}),l.jsxs(fn,{children:[l.jsx(hn,{children:"正式员工:"}),"对标国内一线大厂的薪资+期权,待面试通过后根据能力情况而定。"]})]}),l.jsxs(zG,{children:[l.jsx(HG,{children:"投递简历"}),l.jsx(j_,{children:"- 投递至邮箱:"}),l.jsx(FG,{style:{paddingTop:"0.04rem"},children:l.jsx(UG,{children:"info@datenlord.com"})}),l.jsx("div",{style:{height:"0.24rem"}}),l.jsx(j_,{children:"- 添加达坦科技小助手微信:"}),l.jsx($G,{src:sC})]})]})]})})},dX="/zh-cn/assets/cover-ab5b198b.png",fX="/zh-cn/assets/right-arrow-32ec3014.svg",hX="data:image/png;base64,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",mX="/zh-cn/assets/bg-bg-3abf4aa0.png",pX="data:image/png;base64,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",gX="/zh-cn/assets/cont-del-ill-f7f1f3a0.png",vX="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI0AAAAfCAYAAADa8E7tAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAArbSURBVHgB5Vtdchu5EW5gKPshjpe5QDSzFJXap8gnEH0CKyewdAJJVclW3jR626o8WDpB6BNYPoHlE4j7tFXWD0c5wXjXW5VaiUC6MQMSwjRmhjS90ma/KokkBgQaQKN/PoACviDOz8cDIcUuCOgKLU56vdVj+A3i7GzcffpU7mqhB6Ahv/lF73/zTZLB7xTC/fCP9MMGvmz4lW7g55Oj9Fnulv09PR8I0LFf91/p+pBeLy/He1rIV+4zPVGH/X6SwpLwww/jOFqBgV8+uYHTtovapo2Lq+sxvsTO4/ynjyp59izJYUm4uBhvKYCuW6axn7+sJSfwwNDxPr5CRRgw9SqCC4gOuLp76ZlRMFSY3cp3IvkSX1JYEh49gi1fMQ1W1A7+H7ZoAlZWcJNI+W+/XDxSh/iSfrgYb8NdhSF0//BH2GrbRxsIlEF6SoMgpZxbacbjceyXJcnyLKO880mrxK9A2u5bGYJgLJKtWwodV54rfQ1LhGb6MLJpyKAlhODb0GUboefz9NEEnK+urioMzdf3MCc+fBhvTLQc+3/naPlhSbijNEKIVb+CAJHxX9Xdal1lBklaLYpd4j3XQ1gmpPgrV9zptF/QJsWT7DggQzd7CkvCzQ0vA45vbvcnVqrKZ8qXqORTpflnWjVpBSYf/ZIy9qlAgzNIDYd3nk3gcG0tGcISgcE1O0HzmGKtZcyWdwplkRKGqCSjaZ+oMFKo57BEhBZaK5XBnJAK2LVR0fKUZhrT3MJtLD1vRUBFGDFlXcG3l9k3mCkdodk9ucWdjJ2Mkv7ygkYHMdTI0AaoFKuaKV9PEjNuVECS+xmOZaP8PIIlgxZaMxOKrjGDOUHBNLc2P+dfQGm4TIigtc78sqa6FDxGkdzEARg1xNeXl+Nr+DFX+37GUWYve5iab6IrRN+uc7Qgo59+VPtPu9UgV92qa8rAKA6YaDYOMHHT5eX1gUmRQcS2zZtf1CGTVcXMUKZ1UG4TJKvZZ5hM1Pt1xmrSuKUQL3C1y92us4nShmboRPKFX39yo47X15NRaKGx05GdHynt93WmlH7t92/lxFhswDVFc0myE/x1IErhyVPYxvnfnMk+7et7zCSP3HlzlEbEXGc4CZlf1lRXRuIlJ3y3a1zWVFgcxAHWS7226d/Gk6/kBj6rmloh3tMLxQGywwqRX1xl79B6DCyjYNtceSy3MFB8TgtF5U2KR0ElyrBdEUHKP4GTOdHCdh7LN9XkQMSRFAOUZcSNBa3cWyDXp+UG8KZ7gDJTFtp125TY5sXlfzbXen/eccaxDTVwx4EKs2Pfl9TIAQDnIou+5GPYxU2YovcwIYd0K3CdSdylFQFABGKawge3iTVQiFe+wtwRF3jfbINDnPA48L1N/D8AHl3ZkW9oZ9GHpgA01Adq1dRFkcLgwr4Lygvhsdg4Q0T6K/Z7ka8w7kO9jeRpSm+D4+CR2TdmDQrKotv0JXSfqc3ApntVg1wVUPXuCuSbb9NLX3HYTpAEzIq22EnK7Bsy4yjEYilguWCUCmu+RtMExE+eGPlOm5Qi1Id2MhFSGIC5Fm0KG2fgJttYZCyW9wqOg8HUii6wBgItEm64YcdpLaFZYtCFNpo442jIVAaFJaB/PoDFkZf9xbAoZKE0NYpX24dNXwPEX1vkNq7QLeY3gNjIEx5HFaUVjSQeizCPMS69RtOYmfimii5tuKl74jiaeWD5nNuAKcY4h6j42onGHXyoMZ1FWU4gBFWkv6FUmVJiEOpvoNQOxxWVMIsUVLyGPmbpOK/8bWRAq57RK8VNEIBScNw4H1DQApFQiVJqh3uO87pPz+mvI9S2KWPWCZVv2O/Fcf/reKBraAVjaYijUdP8YFEUfI6Y4IJUM3ecAGUsjQC5xX2beJx+fzWl92itMKOQA5YlnfEnbKpMHIqNnS6uxgMseVlpo7QUpBSccbV9mFiDyYUpHS8XO/afWR7HyoBxQCxEVbkUiGI+iKPhLDPA2/W1VeM+aD4m/LwZOUtaIMcNCSyUGiW9WTxJjD3rDTB5QXlTpTFwv8E5WqkqDhKnI6M0IY5mHlg+pykOwMXe5J53Ompo39MknF9mH3GHVZRmfcaTxEwz+R1iD0+kuaxEzGSp5WgCsUZ9kCzg1JWBxs0qZknchTgarHAKDfCPGUJHHp8+zchJAsl3eXWdM5vSKHhE8pA6mMHrUz/Fl8U/EfCp+rUE9dz9w8JDtmbJ0dTFAaEzFjTVo8RjcTF95zIKs2Ctz2qajxniRfvAhWbdCnE40AKWuFPQTPu3PWYIKE3OncYrrVpeU8GUGw9Tz6+uz2zWWQbCegN4ouDku7R/6hZ8m54PgLFKUz6HForZnrRQIW4FffedowpKY+sWrI6jcT9S6s9ZElLQGo6mVR+hXe2fVcmAck2VIsDRaD1rJ2TVKscMFJd6A7axk49+L0kvLq+7WGEXWoBoAwyCyV2m5eqLmKvIcTRNdRc5DxKeReDutxSd1PMn/iTWpf5Nu3fR8yDtK5OoMsGmnnbiJgauSwmetHvHDNzc+xvSxVpvdY+CYxzUMbLm72sSh6L9IsUvLE2Io8HHmV8Sqvtf+FQXa2T0b2UF8gmfG3bPkWjCEb5FU7gZ4g/sgoXiJncSm1L/JsVb9DwIY4JdDEgpXsgjEeEk80cuVilCcZPrUpqyPKcewzqLVbLc7jGAPXIomiC9xteJGvbW4qEJkie4aZk7RhZGaQRzzYHwXVq1DqG6DkcTpOVrAjBajD0kD/bq+Aa7YG0mkVJ/1uE67kV/Rh+CMgwBL5kasZxOeHA0tRyN71KasjxCMCNCeZCAHF9cXYOxKmA27rZfD2UeIMOc4VsM3CWbIEw3XPk5aMYZMHWLzOm2gfo3HWv1GhZFS/7ESDQJEGYl2/v5HI25MlFrzkNo4mh8l0JZHlfPPbm+bUEy5rnJLvOA3DG6n3d0YYuODICXe2jkCd+jKXgVF013bpoWihBJOBJzXl+YNtOpjwPcSWy6kdekFE19GG5E85lkE6xSBOMmzCa9opipdseFdZrndFZfiFOYE7RmUVRcPZXE0fCV5NgvC9V1ORr2uZM+kosi8osCL76tcEDm8ifM41ZxgM1ampSiTR90Z4hYbG4TFGPgF8cqBRKaMfcc59F1O63ohaS4LZlBAK7LkzDZmWfj0iW0krA0cnVCHA1ORuV+apjPgVqT7181LDOpgfHD6NJUaaFWIhhhEBZrKd5U2nB23+fEAZaj0QoS/zlN5DyxBqHfMyx2ej4eD6wSyAhy9PunNxN5JBnOlJ6Z9sL3j11Lw865PZa5U4YLi+4lxXG88OV3XV65+MkFHVpKsYdHQCyfZTaw0hgg3727w8aKvwbMBegJ5Daqn/22yGROTOqojpGV3IMHCPp9l3tnuPi9V7SLq7/F1aeANFnirwM4kIUCZx7r+qO6bjxaurrcWhYf96Y0mEWdlSliXv7FdfV/jYleBGRhhDbXIwgZNNwKoEPBXrK6A79hdOCe4HAKtZNs6uJhZtJ/mL9o9PicuK4uxTl4FLNQ8PyQ8HmnlAui7jqAD/TFr+3p90OE0nLQph4pDBKHOw/RWs6Le1GaNjfNzCRr2F9fW92GB4xQFuaCAkoKUtce4E9sF8G9uKe6m2bm5hiIYSTVUe/rL/Kzl6WCy8IIpPQKMC0WOu0ny/th3UPAvQXCTMROCpKFIvaHDPpN1K0Tl3WKcWTwf4r/AYvOogspeHhsAAAAAElFTkSuQmCC",yX="/zh-cn/assets/hl-ill-ab994ba5.png",is="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAuCAYAAABXuSs3AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVDSURBVHgB7Vm9bxxFFH9v9j7sKLEJJAVgSGRRQBpTUpqGliY9CEUCKUqUihICXSSkGEcUNBGU/AOpKUBJgcCRUChxYSJAoAQbiH13Oy/va/bD8Z1zt1e4uOcbz97u7OzvvfnN7z2vAWY2s5kdScNRF4lolbu3uS3uG0sj5iHYP2/Uzz9EsNFq4VcwBRsKnEF//Odfvav3f+/BYEDQyPz206fa8PLS3AYivImID6GBHQicQZ/d+Xfw650ftmES48gCg9N+//nlM/Nw5qXuJ91udhUaWBhyflUiPYklsDGSHhP3chxz0uOt+7uQD2gFGlpr2IX+GPR4IrICmheTFLld1yH8i0HDoE/PQENrwRRMaREFl0dZWxnxdE6BZwC7uzlCQ2sMPEW7BjoaVfhjFKkAD0zO3i413O0NgRegqWwxGljp85xKrnv0kbfVo/+PRMSpBlo4LIDz3KMeU9RJV0KW4eGD/gI0tGGqIjpJowHXj2OeAJPq/qAfoS+tF6EnbY+8z+HBH/1Xr125d+vapbtLMG3gdEhWTYCLaBMWkVbg3Pq91Az83h633Qj/MVXYzoWs8931Sz+fhwksQBMrNqJH3AEr6L61nkYeFLw4YVGPxQTM9o8mifzEwE2bybntNIkW7aoDrNlKG+vNGemTIeBCBtl7MKZNBLyqJpGokL6S41CCTg6kPaAUKvKRtgA0Nl0aRJxK+YslaAXOoc8H9XNJbWIu500OsdxHi+tj0mVs4NUNWUs4OTgo7ys1il7zpJS7RLLjBh6FLYH+hkdjVXSNNmc14lXNrmp4mf5Nx1MGTVPYT9w+BvNjafuEHKcaoAQyd64nkLGS+otCS+5H5A8WPOe4L3QJv1+/ePez9QtPR5kJI45FtG2D2iYtahQF61GmfamMtG4scgQGZTp7oY6cxw7dWn//x3OHIZiQ4yUS56uBLniP9T3gsmlIK45E95qgqo8L7Mw36xfuLE0VeOkAVWQR66UsVHiBVIu4hjoYTSTa6VJALDzjoxNZq3MFpgW8Gm1dcKhw3U6WtUK1YEAstc8P0x6t0sYfIlMLsLdgWsANgz0HFTqaC7h/RtRxijf1FU9CZrf5jOI6FstnU8oGXhhFl2a1Cj8hhBKkHAe0PxZq3/2cfuc+y3R8IppuzFhO6eAJOnlnqEQ2qMexeBIWwBwcRzQrd6ORwfmf8XUGrozz9aLgPohG6qxRb8be8d4WTBt4AoveJIqxZZptXLdViGjKY2wgaPG4VlulxUlhkPW4KlcYbl++8cb2VICndyVGjTLSWWZpXkApYH5vJdckg3I4C70XmDKm01EukRbxpuyke0YiIBOxhRg/HYVlLODpRU9yQmkRZfn5WjGTkVQd8rqFYqnp7RZCtxuSwgjBn/iLhR24/sGXK/dgWsCrb6dMMUQh6o8VPQ7BK8GM/IUQ+msKNOBzwdSTyCXFjKm9zbFYu/jFys3DsDTiuFBGc4lokzyeZ8uFQr5JrQRAz6zWd9oBjh0PO7wwO3z/CR7OPKbfmDm3ea6bl2+8vvU0z58IeMH1YMsckvi6LEYutyl4dRhTZvWItxFOv9D55cO111ahgY0NvEw2VnMINQSkltWJPgi1IoxcZQR8mzfm3FzzF2jDEtDmycXDJzegpi4YoEguWcu432oFbmitbe3Us23ozuMGNLRwMCD89sXnu18vn53Thw4D7WM9I2ItCakDmTvi7TkG/crysc12l9agoY18d8JL+y537xxwT5mYOeAxUuUWFmX5qv+FkMwTKMoO1THhJ+z3Pp8/Ob8JM5vZzGZ2pOwx917POGoSrr0AAAAASUVORK5CYII=",wX="data:image/png;base64,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",_X="/zh-cn/assets/spy-bg1-ba75fb2e.png",xX="/zh-cn/assets/spy-bg2-d3211011.png",SX="/zh-cn/assets/spy-bg3-a41ded57.png",bX="/zh-cn/assets/spy-bg4-5446dcc4.png",kX="/zh-cn/assets/foot-reg-qr-03a7d7e1.png",CX="/zh-cn/assets/foot-ass-qr-e467649e.png",{Heading:DX,Paragraph:EX}=Ye,{CNHead1:jX,CNHead5:yC,CNTitleLarge:wC}=DX,{CNBodyLarge:ql,CNBodyMedium:TX}=EX,RX=f.div` + display: flex; + flex-direction: column; + align-items: center; + margin-top: -0.72rem; + padding-top: 0.72rem; + background-image: url(${dX}); + background-size: cover; +`,AX=f(jX)` + padding-top: 1.68rem; + color: #fff; +`,PX=f(wn)` + margin-top: 0.46rem; + color: #fff; +`,OX=f.div` + display: flex; + align-items: center; + margin-top: 0.91rem; + margin-bottom: 0.48rem; + padding: 0.13rem 2rem; + background: rgba(0, 0, 0, 0.09); + border: 0.01rem solid #fff; + border-radius: 0.12rem; + cursor: pointer; +`,LX=f.div` + padding-right: 0.12rem; + font-size: 0.2rem; + font-weight: 400; + line-height: 1; + color: #fff; +`,MX=f.img` + height: 0.2rem; + width: 0.2rem; +`,Zl=f.div` + position: relative; +`,Jl=f.div` + /* min-height: 6.4rem; */ + display: flex; + flex-direction: column; + padding-inline: 1.2rem; + color: #252931; + max-width: 1440px; + margin-inline: auto; +`,Of=f.img` + height: 0.38rem; + width: min-content; +`,Lf=f.div` + font-size: 0.4rem; + font-weight: 600; +`,IX=f(Zl)``,NX=f(Jl)` + padding-block: 0.7rem 1.17rem; +`,VX=f(Of)``,YX=f(Lf)``,zX=f(ql)` + padding-top: 0.61rem; +`,HX=f.div` + display: flex; + gap: 0.39rem; + padding-top: 0.59rem; +`,_m=f.div` + padding: 0.12rem 0.23rem 0.16rem; + background: #fff; + border-radius: 0.16rem; + box-shadow: 0px 6px 32px 0px rgba(37, 41, 49, 0.06); +`,xm=f.div` + font-size: 0.38rem; + font-weight: 600; + color: #7680dd; +`,Sm=f.div` + padding-top: 0.07rem; + color: #626262; + font-size: 0.16rem; + line-height: 0.2956rem; +`,FX=f(ql)` + padding-top: 0.87rem; +`,UX=f.img` + position: absolute; + z-index: -100; + top: 0; + width: 100%; + height: 100%; +`,$X=f(Zl)` + background: linear-gradient( + 106deg, + #e4f4ff -1.1%, + #f9fcff 47.11%, + #edf6fc 102.52% + ); +`,BX=f(Jl)` + min-height: 6.4rem; + padding-block: 0.7rem 1.49rem; +`,WX=f(Of)` + height: 0.26rem; +`,GX=f(Lf)``,XX=f.div` + display: flex; + margin-top: 0.8rem; + background: #fff; + border-radius: 0.16rem; +`,KX=f.div` + padding: 0.49rem 0.38rem 0.82rem; +`,QX=f(yC)` + color: #000; +`,Qc=f(ql)` + padding-top: 0.32rem; + color: #565960; +`,qX=f.div` + position: relative; + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.21rem; + padding-top: 0.48rem; +`,ZX=f.div` + position: absolute; + bottom: 0.6rem; + left: 0; + width: 100%; + height: 0.01rem; + background: #565960; +`,bm=f.div` + display: flex; + flex-direction: column; + align-items: center; + color: ${e=>e.isActive?"#fff":"#565960"}; +`,km=f(wC)` + padding: 0.2rem 0.44rem; + background: ${e=>e.isActive?"#7680DD":"#fff"}; + border-radius: 0.08rem; + box-shadow: 0px 4px 9px 0px + ${e=>e.isActive?"rgba(30, 25, 255, 0.31)":"transparent"}; + border: ${e=>e.isActive?"none":"0.01rem solid #1966FF"}; +`,Cm=f.div` + margin-top: -0.14rem; + width: 0.48rem; + height: 0.48rem; + transform: rotate(45deg); + background: ${e=>e.isActive?"linear-gradient(-45deg,rgba(25, 102, 255, 0.5) 0,rgba(25, 102, 255, 0) 50%)":"linear-gradient(-45deg,rgba(86, 89, 96, 0.5) 0,rgba(25, 102, 255, 0) 50%)"}; +`,Dm=f.div` + margin-top: 0.02rem; + width: 0.1rem; + height: 0.1rem; + border-radius: 50%; + background: ${e=>e.isActive?"#7680dd":"#565960"}; +`,Em=f(ql)` + padding-top: 0.23rem; + color: #000; + font-weight: 600; +`,JX=f.img` + margin-top: -0.13rem; + width: 4.2rem; + border-radius: 0.16rem; +`,eK=f.div` + margin-top: 0.8rem; + padding-inline: 0.36rem; +`,tK=f(yC)` + color: #000; +`,rK=f.div` + margin-top: calc(1.12rem - 0.8rem); + width: min-content; + margin-inline: auto; +`,nK=f.div` + display: flex; + align-items: center; + font-size: 0.2rem; + color: #fff; +`,_C=f.div` + background: #7680dd; + padding-block: 0.14rem; + border-radius: 0.08rem; + margin-bottom: 0.38rem; +`,iK=f(_C)` + margin-left: 0.8533rem; + width: 2.24rem; + text-align: center; +`,oK=f(_C)` + margin-left: 0.96rem; + padding-inline: 1.97rem; +`,sK=f.div` + position: relative; +`,jm=f.div` + display: flex; + background: #fff; + border-radius: 0.16rem; + font-size: 0.2rem; + font-weight: 700; + margin-bottom: 0.34rem; +`,Tm=f.div` + display: flex; + flex-direction: column; + justify-content: center; + width: 0.8533rem; + padding-inline: 0.2rem; + background: rgba(118, 128, 221, 0.22); + border-radius: 0.08rem; +`,Rm=f.div` + white-space: nowrap; + padding-block: 0.2rem; +`,nr=f.div` + display: flex; + padding-block: 0.15rem; +`,ir=f.div` + position: relative; + width: 2.24rem; + height: min-content; + padding-left: 1.17rem; + color: #222; + &::after { + content: ''; + position: absolute; + right: 0; + top: 50%; + display: inline-block; + width: 0.09rem; + height: 0.09rem; + background: #7680dd; + border-radius: 50%; + transform: translate(50%, -50%); + } +`,or=f.div` + padding-inline: 0.96rem; +`,Yn=f.div` + color: #222; +`,aK=f.div` + padding-top: 0.11rem; +`,qc=f.div` + font-size: 0.16rem; + color: #444; +`,lK=f.div` + position: absolute; + left: calc(2.24rem + 0.85rem); + bottom: 2%; + width: 0.01rem; + height: 96%; + background: #7680dd; +`,cK=f(Zl)` + background: linear-gradient(180deg, #f9fffe 4.64%, #fff 168.71%); +`,uK=f(Jl)` + padding-block: 0.7rem 1.45rem; +`,dK=f(Of)``,fK=f(Lf)``,hK=f.div` + display: flex; + align-items: center; + gap: 0.32rem; + margin-top: 0.97rem; +`,mK=f.img` + width: 5.2021rem; +`,pK=f.div``,os=f.div` + display: flex; + align-items: center; + padding-bottom: 0.22rem; + &:last-child { + padding-bottom: 0; + } +`,ss=f.img` + margin-right: 0.07rem; + width: 0.44954rem; + height: 0.44954rem; +`,as=f(ql)``,gK=f(Zl)` + background: linear-gradient(180deg, #f9fffe 4.64%, #fff 168.71%); +`,vK=f(Jl)` + padding-block: 0.7rem 2.06rem; +`,yK=f(Of)``,wK=f(Lf)``,_K=f.div` + display: grid; + grid-template-columns: repeat(2, 1fr); + grid-template-columns: repeat(2, 1fr); + grid-gap: 0.34rem 0.21rem; + padding-top: 1rem; +`,Zc=f.img` + width: 100%; + cursor: pointer; +`,xK=f(Zl)` + background: #fafafa; +`,SK=f(Jl)` + padding-block: 0.44rem 0.56rem; +`,bK=f.div` + display: grid; + grid-template-columns: repeat(2, 1fr); + grid-template-rows: repeat(2, 1fr); + grid-gap: 0.46rem 0.49rem; +`,Am=f.div``,Pm=f.div` + color: #333; + font-size: 0.2rem; + line-height: 0.28rem; + height: min-content; +`,Om=f(TX)` + padding-top: 0.16rem; + color: #666; + font-size: 0.16rem; + line-height: 0.22rem; +`,kK=f.div` + display: grid; + grid-template-columns: repeat(2, 1fr); + grid-gap: 0.49rem; + padding-top: 0.42rem; +`,M_=f.img` + width: 2.17809rem; +`,CK=f(wC)` + padding-top: 0.41rem; + color: #333; + cursor: pointer; +`,I_=()=>(N.useEffect(()=>{window.scrollTo(0,0)}),l.jsxs(At.Fragment,{children:[l.jsx(DK,{}),l.jsx(EK,{}),l.jsx(jK,{}),l.jsx(AK,{}),l.jsx(PK,{}),l.jsx(OK,{})]})),DK=()=>{const e=St();return l.jsxs(RX,{children:[l.jsx(AX,{children:"MIT体系结构公开课学习社区"}),l.jsx(PX,{onClick:()=>{const t=document.getElementById("supply");console.log(t),t&&t.scrollIntoView({behavior:"smooth"})},children:"立即报名"}),l.jsxs(OX,{onClick:()=>e("rank"),children:[l.jsx(LX,{children:"点击查看荣誉榜单"}),l.jsx(MX,{src:fX})]})]})},EK=()=>l.jsxs(IX,{children:[l.jsxs(NX,{children:[l.jsx(VX,{src:hX}),l.jsx(YX,{children:"项目背景"}),l.jsx(zX,{children:"随着芯片技术自主可控成为国家重要的战略发展规划,对芯片设计相关领域的人才需求也在快速增长。体系结构课程相对于硬件设计的重要性可以类比于设计模式相对于软件设计的重要性,扎实的体系结构基础是设计复杂硬件的基石。然而现实情况是,虽然国内大专院校计算机学科、电子工程学科、微电子等都有开设体系结构或组成原理等相关课程,但由于前些年对相关教学重视度不够,导致教学实践环节存在诸多缺失,毕业生掌握的技能与工业界的期望之间存在较大差距,例如:"}),l.jsxs(HX,{children:[l.jsxs(_m,{children:[l.jsx(xm,{children:"01"}),l.jsx(Sm,{children:"教学内容局限在基础知识,而对于业界所需的诸多技术(例如异常处理、缓存技术、内存管理、多核一致性等)往往在教学中一笔带过。"})]}),l.jsxs(_m,{children:[l.jsx(xm,{children:"02"}),l.jsx(Sm,{children:"实验、大作业、课程设计等实操环节过于简单,很少有系统级别的实验项目,学生在动手实践环节投入的精力有限,通常只需要编写HDL代码即可顺利完成相关考核,而对于前期开发环境搭建、后期验证调试、性能调优等基本不会涉及。"})]}),l.jsxs(_m,{children:[l.jsx(xm,{children:"03"}),l.jsx(Sm,{children:"学科领域泾渭分明,软硬件结合部分训练缺失。软件相关专业课程对硬件相关知识经常快速略过,而硬件相关专业课程也较少涉及上层软件相关的知识。"})]})]}),l.jsx(FX,{children:"为了解决上述问题,我们很高兴看到已经有类似“一生一芯”这样的项目启动并取得了很好的成果,但“一生一芯”项目主要解决了上述的问题2和问题3,而对于工业界实际需要的技能,如多核处理器技术及多核下的数据一致性问题等,依旧存在覆盖上的缺失。"})]}),l.jsx(UX,{src:mX})]}),jK=()=>l.jsx($X,{children:l.jsxs(BX,{children:[l.jsx(WX,{src:pX}),l.jsx(GX,{children:"课程内容"}),l.jsx(TK,{}),l.jsx(RK,{})]})}),TK=()=>l.jsxs(XX,{children:[l.jsxs(KX,{children:[l.jsx(QX,{children:"详情说明"}),l.jsx(Qc,{children:"为了进一步缩小学生能力与业界期望之间的差距,我们找到了MIT体系结构方面的3门公开课及其对应的课程实验,希望通过学习公开课并亲自动手完成实验的方式,进一步增加学生的动手实践能力以及解决实际问题的能力。对这些公开课的说明如下:"}),l.jsx(Qc,{children:"三门公开课难度级别分别对应本科必修课(6.004)、硕士必修课(6.175)以及实践选修课(6.375)"}),l.jsxs(qX,{children:[l.jsx(ZX,{}),l.jsxs(bm,{isActive:!0,children:[l.jsx(km,{isActive:!0,children:"MIT6.004"}),l.jsx(Cm,{isActive:!0}),l.jsx(Dm,{isActive:!0}),l.jsx(Em,{children:"第一阶段"})]}),l.jsxs(bm,{isActive:!1,children:[l.jsx(km,{isActive:!1,children:"MIT6.375"}),l.jsx(Cm,{isActive:!1}),l.jsx(Dm,{isActive:!1}),l.jsx(Em,{children:"第二阶段"})]}),l.jsxs(bm,{isActive:!1,children:[l.jsx(km,{isActive:!1,children:"MIT6.175"}),l.jsx(Cm,{isActive:!1}),l.jsx(Dm,{isActive:!1}),l.jsx(Em,{children:"第三阶段"})]})]}),l.jsx(Qc,{children:"内容涵盖了组合逻辑、简单时序逻辑、流水线及流式数据处理、RISC-V指令集架构、RISC-V处理器实现、Cache、中断异常、Non-Blocking Cache、多核处理器、Cache Coherence等。该课程及实验的授课老师为MIT的Arvind教授,他也是新一代开源HDL语言Bluespec SystemVerilog的发明人,因此该课程的全部实验也采用Bluespec进行RTL的编写。"}),l.jsx(Qc,{children:"在学习三门公开课的同时,我们也自己加入了一些专项训练内容,例如AXI协议握手、流式编程在控制通路上的应用等,从而进一步提升参与者的能力,加深对硬件设计中并发性和流水线的理解。"})]}),l.jsx(JX,{src:gX})]}),RK=()=>l.jsxs(eK,{children:[l.jsx(tK,{children:"培训内容"}),l.jsxs(rK,{children:[l.jsxs(nK,{children:[l.jsx(iK,{children:"序号"}),l.jsx(oK,{children:"实验内容"})]}),l.jsxs(sK,{children:[l.jsxs(jm,{children:[l.jsx(Tm,{children:"第一阶段"}),l.jsxs(Rm,{children:[l.jsxs(nr,{children:[l.jsx(ir,{children:"Lab0"}),l.jsx(or,{children:"实验环境搭建"})]}),l.jsxs(nr,{children:[l.jsx(ir,{children:"Lab1"}),l.jsx(or,{children:"多路复用器和加法器"})]}),l.jsxs(nr,{children:[l.jsx(ir,{children:"Lab2"}),l.jsx(or,{children:"乘法器"})]}),l.jsxs(nr,{children:[l.jsx(ir,{children:"Lab3"}),l.jsx(or,{children:"流水线"})]}),l.jsxs(nr,{children:[l.jsx(ir,{children:"Lab4"}),l.jsx(or,{children:"FIFO(Bypass/Pass through/Concurrent)"})]})]})]}),l.jsxs(jm,{children:[l.jsx(Tm,{children:"第二阶段"}),l.jsxs(Rm,{children:[l.jsxs(nr,{children:[l.jsx(ir,{children:"专项1"}),l.jsx(or,{children:l.jsx(Yn,{children:"AXI总线握手打拍与反压机制"})})]}),l.jsxs(nr,{children:[l.jsx(ir,{children:"专项2"}),l.jsxs(or,{children:[l.jsx(Yn,{children:"流式数据处理"}),l.jsxs(aK,{children:[l.jsx(qc,{children:"简单音频处理流水线"}),l.jsx(qc,{children:"音频处理扩展:FFT"}),l.jsx(qc,{children:"音频处理扩展:Pitch Shifting"}),l.jsx(qc,{children:"流水线的软硬件联调仿真"})]})]})]}),l.jsxs(nr,{children:[l.jsx(ir,{children:"专项3"}),l.jsx(or,{children:l.jsx(Yn,{children:"网络设备中的流式数据包处理"})})]})]})]}),l.jsxs(jm,{children:[l.jsx(Tm,{children:"第三阶段"}),l.jsxs(Rm,{children:[l.jsxs(nr,{children:[l.jsx(ir,{children:"Lab5"}),l.jsx(or,{children:l.jsx(Yn,{children:"单周期及多周期RISC-V处理器"})})]}),l.jsxs(nr,{children:[l.jsx(ir,{children:"Lab6"}),l.jsx(or,{children:l.jsx(Yn,{children:"支持分支预测及6级流水的RISC-V处理器"})})]}),l.jsxs(nr,{children:[l.jsx(ir,{children:"Lab7"}),l.jsx(or,{children:l.jsx(Yn,{children:"具备ICache和DCache的RISC-V处理器"})})]}),l.jsxs(nr,{children:[l.jsx(ir,{children:"Lab8"}),l.jsx(or,{children:l.jsx(Yn,{children:"支持异常处理的RISC-V处理器"})})]}),l.jsxs(nr,{children:[l.jsx(ir,{children:"Project1"}),l.jsx(or,{children:l.jsx(Yn,{children:"支持乱序执行的RISC-V处理器(Store Queue)"})})]}),l.jsxs(nr,{children:[l.jsx(ir,{children:"Project2"}),l.jsx(or,{children:l.jsx(Yn,{children:"多核处理器及缓存一致性(基于MSI协议)"})})]})]})]}),l.jsx(lK,{})]})]})]}),AK=()=>l.jsx(cK,{children:l.jsxs(uK,{children:[l.jsx(dK,{src:vX}),l.jsx(fK,{children:"项目课程亮点"}),l.jsxs(hK,{children:[l.jsx(mK,{src:yX}),l.jsxs(pK,{children:[l.jsxs(os,{children:[l.jsx(ss,{src:is}),l.jsx(as,{children:"课程及实验安排由浅入深,并在最终到达相当的深度,既可作为“一生一芯”项目的补充课程,也可作为独立项目进行学习。"})]}),l.jsxs(os,{children:[l.jsx(ss,{src:is}),l.jsx(as,{children:"采用Bluespec作为实验语言,具有更强的抽象表达能力,可以更高效的实现复杂功能,使得学生可以把精力更集中的放在架构设计上。"})]}),l.jsxs(os,{children:[l.jsx(ss,{src:is}),l.jsx(as,{children:"注重软硬件联合开发,培养软硬通吃的复合型人才。"})]}),l.jsxs(os,{children:[l.jsx(ss,{src:is}),l.jsx(as,{children:"课程时间安排紧凑,内容丰富,学生通常可以通过2~3个月的业余时间即可自学完成所有实验。"})]}),l.jsxs(os,{children:[l.jsx(ss,{src:is}),l.jsx(as,{children:"主要课程资料均为英文,有助于锻炼国外文献阅读能力。"})]}),l.jsxs(os,{children:[l.jsx(ss,{src:is}),l.jsx(as,{children:"全开源、社区化"})]})]})]})]})}),PK=()=>l.jsx(gK,{id:"supply",children:l.jsxs(vK,{children:[l.jsx(yK,{src:wX}),l.jsx(wK,{children:"新手上路补给站"}),l.jsxs(_K,{children:[l.jsx(Zc,{src:_X,onClick:()=>window.location.href="https://www.bilibili.com/video/BV1u8411i7Qw/"}),l.jsx(Zc,{src:xX,onClick:()=>window.location.href="https://www.bilibili.com/video/BV1cs4y1r7T3/"}),l.jsx(Zc,{src:SX,onClick:()=>window.location.href="https://mp.weixin.qq.com/s/-MnRFCXHy5v-tt4MujfqtQ"}),l.jsx(Zc,{src:bX,onClick:()=>window.location.href="https://mp.weixin.qq.com/s/I5bPw_AUWTh2VgzAm4SHhg"})]})]})}),OK=()=>l.jsx(xK,{children:l.jsxs(SK,{children:[l.jsxs(bK,{children:[l.jsxs(Am,{style:{gridColumnStart:"span 2"},children:[l.jsx(Pm,{children:"申明"}),l.jsx(Om,{children:"MIT体系结构公开课学习社区项目以学习者自学开源的MIT三门公开课为主,社区内大家互相监督和交流,社区有助教在线答疑,帮助有志于从事数字芯片设计的同学强化体系结构基础知识,提升数字芯片设计的能力。"})]}),l.jsxs(Am,{children:[l.jsx(Pm,{children:"报名表"}),l.jsx(Om,{children:"请扫描二维码,填写报名表,加入MIT体系结构公开课学习社区项目。报名成功后,将收到邮件确认。"})]}),l.jsxs(Am,{children:[l.jsx(Pm,{children:"咨询"}),l.jsx(Om,{children:"关于MIT体系结构公开课学习社区项目有任何问题或疑问,可以邮件:ta@datenlord.com或添加DatenLord小助手微信咨询。"})]})]}),l.jsxs(kK,{children:[l.jsx(M_,{src:kX}),l.jsx(M_,{src:CX})]}),l.jsxs(CK,{onClick:()=>window.location.href="https://datenlord.feishu.cn/wiki/CNwFwKXPaiy0cfkNYrqcLNdCnTf",children:["往届学员",">>"]})]})}),LK="/zh-cn/assets/title-6364f1d7.png",MK="/zh-cn/assets/stage1-5eb61c6d.png",IK="/zh-cn/assets/stage2-586e5a56.png",NK="/zh-cn/assets/stage3-021de657.png",VK="/zh-cn/assets/github-6b99dc67.svg",YK=f.div` + display: flex; + flex-direction: column; + align-items: center; + margin-top: -0.72rem; + padding-block: calc(0.72rem + 0.53rem) 0.8rem; + background: #1a1a1a; +`,zK=f.img` + padding-top: 0.53rem; + width: 4.6rem; +`,HK=f.div` + padding-top: 0.41rem; + color: #fff; + font-size: 0.44rem; + line-height: 0.56rem; +`,FK=f.div` + color: #fff; + font-size: 0.2rem; + line-height: 0.56rem; +`,UK=f.main` + background: #000; +`,$K=f.div` + display: flex; + flex-direction: column; + gap: 0.46rem; + max-width: 1440px; + margin-inline: auto; + padding: 0.9rem 1.23rem 1.5rem; +`,Lm=f.div` + padding: 0.01rem; + border-radius: 0.16rem; + background: linear-gradient(90deg, #fff, #000); +`,Mm=f.div` + display: flex; + border-radius: 0.16rem; + padding: 0.21rem 0.29rem 0.25rem; + background: #000; +`,Im=f.img` + display: inline-block; +`,Nm=f.div` + width: 100%; + height: 100%; + margin: 0.27rem 0.84rem 0.23rem; + margin-right: 0; + overflow: hidden; +`,Vm=f.ul` + display: flex; + gap: 0.32rem; + animation: 20s move infinite linear; + @keyframes move { + 0% { + transform: translateX(0); + } + 100% { + transform: translateX(-7.56rem); + } + } +`,ls=f.li` + display: flex; + flex-shrink: 0; + flex-direction: column; + align-items: center; + width: 0.76rem; + cursor: pointer; +`,cs=f.img` + width: 0.62432rem; + height: 0.62432rem; + border-radius: 50%; +`,us=f.div` + display: flex; + align-items: center; + color: #fff; + padding-top: 0.04rem; + font-size: 0.14rem; + line-height: 0.31216rem; + + &::after { + content: ''; + display: inline-block; + width: 0.18rem; + height: 0.18rem; + background-image: url(${VK}); + background-size: cover; + margin-left: 0.06rem; + } +`,y0=[{avatar:"https://avatars.githubusercontent.com/u/11474381?v=4",name:"myrfy001",url:"https://github.com/myrfy001"},{avatar:"https://avatars.githubusercontent.com/u/32484423?v=4",name:"GTwhy",url:"https://github.com/GTwhy"},{avatar:"https://avatars.githubusercontent.com/u/78157415?v=4",name:"kazutoiris",url:"https://github.com/kazutoiris"},{avatar:"https://avatars.githubusercontent.com/u/55951109?v=4",name:"wengwz",url:"https://github.com/wengwz"},{avatar:"https://avatars.githubusercontent.com/u/111745697?v=4",name:"Huihaojia",url:"https://github.com/Huihaojia"},{avatar:"https://avatars.githubusercontent.com/u/108394891?v=4",name:"李琦彬",url:"https://github.com/androny1012"},{avatar:"https://avatars.githubusercontent.com/u/94814217?v=4",name:"李金东",url:"https://github.com/adamgallas"}],w0=y0,N_=w0,BK=()=>l.jsxs(At.Fragment,{children:[l.jsxs(YK,{children:[l.jsx(zK,{src:LK}),l.jsx(HK,{children:"恭喜所有完成MIT体系结构公开课学习的同学!"}),l.jsx(FK,{children:"(排名不分先后)"})]}),l.jsx(UK,{children:l.jsxs($K,{children:[l.jsx(Lm,{children:l.jsxs(Mm,{children:[l.jsx(Im,{src:MK}),l.jsx(Nm,{children:l.jsxs(Vm,{children:[y0.map(({avatar:e,name:t,url:r})=>l.jsxs(ls,{onClick:()=>window.open(r),children:[l.jsx(cs,{src:e}),l.jsx(us,{children:t})]},t)),y0.map(({avatar:e,name:t,url:r})=>l.jsxs(ls,{onClick:()=>window.open(r),children:[l.jsx(cs,{src:e}),l.jsx(us,{children:t})]},t))]})})]})}),l.jsx(Lm,{children:l.jsxs(Mm,{children:[l.jsx(Im,{src:IK}),l.jsx(Nm,{children:l.jsxs(Vm,{children:[w0.map(e=>l.jsxs(ls,{children:[l.jsx(cs,{src:e.avatar}),l.jsx(us,{children:e.name})]},e.name)),w0.map(e=>l.jsxs(ls,{children:[l.jsx(cs,{src:e.avatar}),l.jsx(us,{children:e.name})]},e.name))]})})]})}),l.jsx(Lm,{children:l.jsxs(Mm,{children:[l.jsx(Im,{src:NK}),l.jsx(Nm,{children:l.jsxs(Vm,{children:[N_.map(e=>l.jsxs(ls,{children:[l.jsx(cs,{src:e.avatar}),l.jsx(us,{children:e.name})]},e.name)),N_.map(e=>l.jsxs(ls,{children:[l.jsx(cs,{src:e.avatar}),l.jsx(us,{children:e.name})]},e.name))]})})]})})]})})]}),WK=BP([{path:"/",element:l.jsx(HL,{}),children:[{path:"",element:l.jsx(o6,{})},{path:"products",element:l.jsx(Hw,{})},{path:"products/:sectionId",element:l.jsx(Hw,{})},{path:"rdma",element:l.jsx(O6,{})},{path:"service",element:l.jsx(X6,{})},{path:"app",element:l.jsx(r5,{})},{path:"solutions",element:l.jsx(Gw,{})},{path:"solutions/:sectionId",element:l.jsx(Gw,{})},{path:"community",element:l.jsx(Xw,{})},{path:"community",element:l.jsx(Xw,{})},{path:"resources2",element:l.jsx(r_,{})},{path:"resources2/:sectionId",element:l.jsx(r_,{})},{path:"clients",element:l.jsx(n_,{})},{path:"clients/:sectionId",element:l.jsx(n_,{})},{path:"company1",element:l.jsx(o_,{})},{path:"company1/:sectionId",element:l.jsx(o_,{})},{path:"company2",element:l.jsx(c_,{})},{path:"company2/:sectionId",element:l.jsx(c_,{})},{path:"tech-talk",element:l.jsx(Gc,{})},{path:"oss-showcase",element:l.jsx(Gc,{})},{path:"rust-showcase",element:l.jsx(Gc,{})},{path:"hardware-acceleration",element:l.jsx(Gc,{})},{path:":title",element:l.jsx(M9,{})},{path:":section/:title",element:l.jsx(K9,{})},{path:"job-description",element:l.jsx(jG,{})},{path:"job-description/:key",element:l.jsx(uX,{})},{path:"MIT",element:l.jsx(I_,{})},{path:"community/mit",element:l.jsx(I_,{})},{path:"MIT/rank",element:l.jsx(BK,{})}]}]),GK={themeDark:"#0A061F",themeDark02:"#42424A",secondary01:"#7680DD",secondary02:"#D9DBEF",secondary07:"#F2994A",secondary08:"#FDCB6E",gray03:"#828282",gray04:"#4F4F4F",gray007:"#272D37",white00:"#fff"};function Zr(e){for(var t=arguments.length,r=Array(t>1?t-1:0),n=1;n3?t.i-4:t.i:Array.isArray(e)?1:Rv(e)?2:Av(e)?3:0}function Ns(e,t){return ua(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function XK(e,t){return ua(e)===2?e.get(t):e[t]}function xC(e,t,r){var n=ua(e);n===2?e.set(t,r):n===3?e.add(r):e[t]=r}function SC(e,t){return e===t?e!==0||1/e==1/t:e!=e&&t!=t}function Rv(e){return eQ&&e instanceof Map}function Av(e){return tQ&&e instanceof Set}function fo(e){return e.o||e.t}function Pv(e){if(Array.isArray(e))return Array.prototype.slice.call(e);var t=kC(e);delete t[lt];for(var r=Vs(t),n=0;n1&&(e.set=e.add=e.clear=e.delete=KK),Object.freeze(e),t&&Io(e,function(r,n){return Ov(n,!0)},!0)),e}function KK(){Zr(2)}function Lv(e){return e==null||typeof e!="object"||Object.isFrozen(e)}function _n(e){var t=b0[e];return t||Zr(18,e),t}function QK(e,t){b0[e]||(b0[e]=t)}function _0(){return Ll}function Ym(e,t){t&&(_n("Patches"),e.u=[],e.s=[],e.v=t)}function fd(e){x0(e),e.p.forEach(qK),e.p=null}function x0(e){e===Ll&&(Ll=e.l)}function V_(e){return Ll={p:[],l:Ll,h:e,m:!0,_:0}}function qK(e){var t=e[lt];t.i===0||t.i===1?t.j():t.g=!0}function zm(e,t){t._=t.p.length;var r=t.p[0],n=e!==void 0&&e!==r;return t.h.O||_n("ES5").S(t,e,n),n?(r[lt].P&&(fd(t),Zr(4)),ni(e)&&(e=hd(t,e),t.l||md(t,e)),t.u&&_n("Patches").M(r[lt].t,e,t.u,t.s)):e=hd(t,r,[]),fd(t),t.u&&t.v(t.u,t.s),e!==bC?e:void 0}function hd(e,t,r){if(Lv(t))return t;var n=t[lt];if(!n)return Io(t,function(c,d){return Y_(e,n,t,c,d,r)},!0),t;if(n.A!==e)return t;if(!n.P)return md(e,n.t,!0),n.t;if(!n.I){n.I=!0,n.A._--;var i=n.i===4||n.i===5?n.o=Pv(n.k):n.o,o=i,a=!1;n.i===3&&(o=new Set(i),i.clear(),a=!0),Io(o,function(c,d){return Y_(e,n,i,c,d,r,a)}),md(e,i,!1),r&&e.u&&_n("Patches").N(n,r,e.u,e.s)}return n.o}function Y_(e,t,r,n,i,o,a){if(Xi(i)){var c=hd(e,i,o&&t&&t.i!==3&&!Ns(t.R,n)?o.concat(n):void 0);if(xC(r,n,c),!Xi(c))return;e.m=!1}else a&&r.add(i);if(ni(i)&&!Lv(i)){if(!e.h.D&&e._<1)return;hd(e,i),t&&t.A.l||md(e,i)}}function md(e,t,r){r===void 0&&(r=!1),!e.l&&e.h.D&&e.m&&Ov(t,r)}function Hm(e,t){var r=e[lt];return(r?fo(r):e)[t]}function z_(e,t){if(t in e)for(var r=Object.getPrototypeOf(e);r;){var n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=Object.getPrototypeOf(r)}}function Ci(e){e.P||(e.P=!0,e.l&&Ci(e.l))}function Fm(e){e.o||(e.o=Pv(e.t))}function S0(e,t,r){var n=Rv(t)?_n("MapSet").F(t,r):Av(t)?_n("MapSet").T(t,r):e.O?function(i,o){var a=Array.isArray(i),c={i:a?1:0,A:o?o.A:_0(),P:!1,I:!1,R:{},l:o,t:i,k:null,o:null,j:null,C:!1},d=c,h=Ml;a&&(d=[c],h=$a);var g=Proxy.revocable(d,h),v=g.revoke,y=g.proxy;return c.k=y,c.j=v,y}(t,r):_n("ES5").J(t,r);return(r?r.A:_0()).p.push(n),n}function ZK(e){return Xi(e)||Zr(22,e),function t(r){if(!ni(r))return r;var n,i=r[lt],o=ua(r);if(i){if(!i.P&&(i.i<4||!_n("ES5").K(i)))return i.t;i.I=!0,n=H_(r,o),i.I=!1}else n=H_(r,o);return Io(n,function(a,c){i&&XK(i.t,a)===c||xC(n,a,t(c))}),o===3?new Set(n):n}(e)}function H_(e,t){switch(t){case 2:return new Map(e);case 3:return Array.from(e)}return Pv(e)}function JK(){function e(o,a){var c=i[o];return c?c.enumerable=a:i[o]=c={configurable:!0,enumerable:a,get:function(){var d=this[lt];return Ml.get(d,o)},set:function(d){var h=this[lt];Ml.set(h,o,d)}},c}function t(o){for(var a=o.length-1;a>=0;a--){var c=o[a][lt];if(!c.P)switch(c.i){case 5:n(c)&&Ci(c);break;case 4:r(c)&&Ci(c)}}}function r(o){for(var a=o.t,c=o.k,d=Vs(c),h=d.length-1;h>=0;h--){var g=d[h];if(g!==lt){var v=a[g];if(v===void 0&&!Ns(a,g))return!0;var y=c[g],S=y&&y[lt];if(S?S.t!==v:!SC(y,v))return!0}}var C=!!a[lt];return d.length!==Vs(a).length+(C?0:1)}function n(o){var a=o.k;if(a.length!==o.t.length)return!0;var c=Object.getOwnPropertyDescriptor(a,a.length-1);if(c&&!c.get)return!0;for(var d=0;d1?b-1:0),k=1;k1?g-1:0),y=1;y=0;i--){var o=n[i];if(o.path.length===0&&o.op==="replace"){r=o.value;break}}i>-1&&(n=n.slice(i+1));var a=_n("Patches").$;return Xi(r)?a(r,n):this.produce(r,function(c){return a(c,n)})},e}(),br=new nQ,CC=br.produce;br.produceWithPatches.bind(br);br.setAutoFreeze.bind(br);br.setUseProxies.bind(br);br.applyPatches.bind(br);br.createDraft.bind(br);br.finishDraft.bind(br);function Il(e){"@babel/helpers - typeof";return Il=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Il(e)}function iQ(e,t){if(Il(e)!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t||"default");if(Il(n)!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function oQ(e){var t=iQ(e,"string");return Il(t)=="symbol"?t:t+""}function sQ(e,t,r){return(t=oQ(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function B_(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function W_(e){for(var t=1;t"u"&&(r=t,t=void 0),typeof r<"u"){if(typeof r!="function")throw new Error(Ft(1));return r(DC)(e,t)}if(typeof e!="function")throw new Error(Ft(2));var i=e,o=t,a=[],c=a,d=!1;function h(){c===a&&(c=a.slice())}function g(){if(d)throw new Error(Ft(3));return o}function v(D){if(typeof D!="function")throw new Error(Ft(4));if(d)throw new Error(Ft(5));var T=!0;return h(),c.push(D),function(){if(T){if(d)throw new Error(Ft(6));T=!1,h();var w=c.indexOf(D);c.splice(w,1),a=null}}}function y(D){if(!aQ(D))throw new Error(Ft(7));if(typeof D.type>"u")throw new Error(Ft(8));if(d)throw new Error(Ft(9));try{d=!0,o=i(o,D)}finally{d=!1}for(var T=a=c,b=0;b"u")throw new Error(Ft(12));if(typeof r(void 0,{type:pd.PROBE_UNKNOWN_ACTION()})>"u")throw new Error(Ft(13))})}function cQ(e){for(var t=Object.keys(e),r={},n=0;n"u")throw h&&h.type,new Error(Ft(14));v[S]=T,g=g||T!==D}return g=g||o.length!==Object.keys(d).length,g?v:d}}function gd(){for(var e=arguments.length,t=new Array(e),r=0;r0&&o[o.length-1])&&(h[0]===6||h[0]===2)){r=0;continue}if(h[0]===3&&(!o||h[1]>o[0]&&h[1]{e.value+=1},decrement:e=>{e.value-=1},incrementByAmount:(e,t)=>{e.value+=t.payload}}}),YQ=VQ.reducer,zQ=DQ({reducer:{counter:YQ}});Wm.createRoot(document.getElementById("root")).render(l.jsx(B4,{store:zQ,children:l.jsxs(n4,{theme:GK,children:[l.jsx(W4,{}),l.jsx(eO,{router:WK})]})}))});export default HQ(); diff --git a/zh-cn/assets/index-93097ad1.js b/zh-cn/assets/index-5a50192e.js similarity index 98% rename from zh-cn/assets/index-93097ad1.js rename to zh-cn/assets/index-5a50192e.js index a90e605..fa6da29 100644 --- a/zh-cn/assets/index-93097ad1.js +++ b/zh-cn/assets/index-5a50192e.js @@ -1,4 +1,4 @@ -const i="/zh-cn/assets/cover-6865ae02.png",e=[i],l={label:"Xline v0.4.1:一个用于元数据管理的分布式KV存储",description:"Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。",cover:"./cover.png",location:"中国香港",author:["达坦科技"],tags:["Xline"],date:"2023-06-21",title:"Xline v0.4.1: A distributed KV store for metadata management"},t=[{label:"Xline 是什么?我们为什么要做 Xline?",level:2},{label:"V0.4.0 版本有什么新功能?",level:3},{label:"欢迎参与到 Xline 项目中",level:2},{label:"相关链接",level:2}],s=`

    封面

    +const i="/zh-cn/assets/cover-6865ae02.png",e=[i],l={label:"Xline v0.4.1:一个用于元数据管理的分布式KV存储",description:"Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。",cover:"./cover.png",location:"中国香港",author:["达坦科技"],tags:["Xline"],date:"2023-06-21",title:"Xline v0.4.1_ A distributed KV store for metadata management"},t=[{label:"Xline 是什么?我们为什么要做 Xline?",level:2},{label:"V0.4.0 版本有什么新功能?",level:3},{label:"欢迎参与到 Xline 项目中",level:2},{label:"相关链接",level:2}],s=`

    封面

    Xline 是什么?我们为什么要做 Xline?

    Xline 是一个基于 Curp 协议的,用于管理元数据的分布式 KV 存储。 现有的分布式 KV 存储大多采用 Raft 共识协议,需要两次 RTT 才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。

    但是,当跨数据中心部署时,节点之间的延迟可能是几十或几百毫秒,此时 Raft 协议将成为性能瓶颈。Curp 协议就是为了解决这个问题而设计的。它可以在命令不冲突的情况下减少一个 RTT,从而提高性能。因此,Xline 旨在实现高性能的数据访问和跨数据中心场景下的强一致性。

    diff --git a/zh-cn/assets/index-102c2147.js b/zh-cn/assets/index-5e43e574.js similarity index 92% rename from zh-cn/assets/index-102c2147.js rename to zh-cn/assets/index-5e43e574.js index e7459aa..54df414 100644 --- a/zh-cn/assets/index-102c2147.js +++ b/zh-cn/assets/index-5e43e574.js @@ -1,4 +1,4 @@ -const s="/zh-cn/assets/cover-48216986.png",t="/zh-cn/assets/image1-02771bf0.jpg",n="/zh-cn/assets/image1-f46bfcc6.jpg",o=[s,t,n],p={label:"当RDMA遇到Rust",description:"2022年8月5日-6日,一年一度的中国开源基础设施活动日(OpenInfra Days China)即将在线上举行。本次会议没有限定一个统一的主题,主要聚焦云计算基础设施、云原生技术与应用实践、开源治理、5G、算力网络与边缘计算五大主题方向。",cover:"./cover.png",location:"新加坡",date:"2022-08-04",title:"When RDMA meets Rust"},r=[],g=`

    封面

    +const s="/zh-cn/assets/cover-48216986.png",t="/zh-cn/assets/image1-02771bf0.jpg",n="/zh-cn/assets/image1-f46bfcc6.jpg",o=[s,t,n],r={label:"当RDMA遇到Rust",description:"2022年8月5日-6日,一年一度的中国开源基础设施活动日(OpenInfra Days China)即将在线上举行。本次会议没有限定一个统一的主题,主要聚焦云计算基础设施、云原生技术与应用实践、开源治理、5G、算力网络与边缘计算五大主题方向。",cover:"./cover.png",location:"新加坡",date:"2022-08-04",title:"When RDMA meets Rust"},p=[],a=`

    封面

    2022 年 8 月 5 日-6 日,**一年一度的中国开源基础设施活动日(OpenInfra Days China)**即将在线上举行。本次会议没有限定一个统一的主题,主要聚焦云计算基础设施、云原生技术与应用实践、开源治理、5G、算力网络与边缘计算五大主题方向。

    云计算基础设施分论坛主要聚焦云计算基础设施领域的前沿技术和优秀实践,围绕多硬件架构和多操作系统支持、人工智能技术应用、网络与存储,数据处理 DPU 及其他加速硬件、硬件自动化和智能运维等方面展开技术分享和探讨。达坦科技联合创始人施继成将在这一分论坛做题为当 RDMA 遇到 Rust 的专题分享。

    图片

    @@ -10,4 +10,4 @@ const s="/zh-cn/assets/cover-48216986.png",t="/zh-cn/assets/image1-02771bf0.jpg"

    参会方式

    想要了解更多达坦科技为什么选择 Rust 做 RDMA 库,以及开发设计背后的理念、逻辑、和实践经验,欢迎扫描海报二维码,免费注册报名。

    有意加入 Rust 前沿交流讨论群,请添加小助手微信:

    -

    图片

    `;export{o as assetURLs,g as default,p as metadata,r as toc}; +

    图片

    `;export{o as assetURLs,a as default,r as metadata,p as toc}; diff --git a/zh-cn/assets/index-b5cbc6b1.js b/zh-cn/assets/index-5e5c42fa.js similarity index 95% rename from zh-cn/assets/index-b5cbc6b1.js rename to zh-cn/assets/index-5e5c42fa.js index b206036..b7b778f 100644 --- a/zh-cn/assets/index-b5cbc6b1.js +++ b/zh-cn/assets/index-5e5c42fa.js @@ -1,4 +1,4 @@ -const l="/zh-cn/assets/cover-f142cd17.jpg",e="/zh-cn/assets/image1-9d5b5029.jpg",t="/zh-cn/assets/image2-2129b7ac.jpg",s=[l,e,t],o={label:"计算机体系结构 l MIT课程学习新手上路宣讲",description:"MIT课程学习社区是一个兴趣导向的学习社区,大家或是想要补缺体系结构的基础知识,或是提升自己的实践和工程能力。MIT 6.175与MIT6.375的课程和Lab都有相当的难度,要求采用Bluespec语言实现RISC-V32位处理器,并支持多级流水、分支预测、异常处理、缓存一致性等功能。此外,Lab环节还涉及软硬件联合开发,要求基于所实现的RISC-V处理器运行真实的RISC-V程序,并给出性能评估。当真正着手开始学习MIT的这两门课程,会发现不要说坚持下来,能入门也不是一件容易的事情。为此,达坦科技软硬件联合开发工程师米明恒将在2023年9月23日(周六)上午10:30为大家带来一场计算机体系结构 l MIT课程学习新手上路宣讲。",cover:"./cover.jpg",location:"中国香港",date:"2023-09-19",title:"MIT Coursework Orientation for Newcomers"},i=[{label:"MIT 课程学习社区的源",level:2},{label:"MIT 课程学习新手上路宣讲",level:2},{label:"入门宣讲的目的",level:2},{label:"入门宣讲的要点",level:2},{label:"问卷调查",level:2}],a=`

    封面

    +const l="/zh-cn/assets/cover-f142cd17.jpg",s="/zh-cn/assets/image1-9d5b5029.jpg",e="/zh-cn/assets/image2-2129b7ac.jpg",t=[l,s,e],o={label:"计算机体系结构 l MIT课程学习新手上路宣讲",description:"MIT课程学习社区是一个兴趣导向的学习社区,大家或是想要补缺体系结构的基础知识,或是提升自己的实践和工程能力。MIT 6.175与MIT6.375的课程和Lab都有相当的难度,要求采用Bluespec语言实现RISC-V32位处理器,并支持多级流水、分支预测、异常处理、缓存一致性等功能。此外,Lab环节还涉及软硬件联合开发,要求基于所实现的RISC-V处理器运行真实的RISC-V程序,并给出性能评估。当真正着手开始学习MIT的这两门课程,会发现不要说坚持下来,能入门也不是一件容易的事情。为此,达坦科技软硬件联合开发工程师米明恒将在2023年9月23日(周六)上午10:30为大家带来一场计算机体系结构 l MIT课程学习新手上路宣讲。",cover:"./cover.jpg",location:"中国香港",date:"2023-09-19",title:"MIT Coursework Orientation for Newcomers"},i=[{label:"MIT 课程学习社区的源",level:2},{label:"MIT 课程学习新手上路宣讲",level:2},{label:"入门宣讲的目的",level:2},{label:"入门宣讲的要点",level:2},{label:"问卷调查",level:2}],a=`

    封面

    MIT 课程学习社区的源

    无论用哪一种语言,Bluespec、Chisel、SpinalHDL 来进行硬件设计,背后扎实的硬件设计基础知识都是必不可少的,特别是体系结构,因为体系结构的主要研究对象是指令集架构、处理器架构、存储器层次结构、总线和 IO 等,而 CPU 作为当今最复杂的数字芯片之一,非常适合作为学习实践相关知识的一只“麻雀”。

    虽然国内大专院校计算机科学和电子工程专业都有开设体系结构或组成原理等相关课程,但是在实操环节缺失很多内容,特别是 CPU 缓存、内存管理、异常处理相关的部分,基本上都不涉及。当达坦科技做校招或招募在校实习生的时候,看到了潜在求职者在理论和实践之间的脱节。

    @@ -19,7 +19,7 @@ const l="/zh-cn/assets/cover-f142cd17.jpg",e="/zh-cn/assets/image1-9d5b5029.jpg"

    问卷调查

    请各位已经或即将参加体系结构 MIT 课程培训的社区成员,或有意参加入门宣讲的观众,在参会前提前完成以下调查问卷。扫描下方二维码或点击阅读原文进行填写)

    -

    图片

    +

    图片

    欢迎您预约直播,或者登陆腾讯会议观看直播:
    会议号:474-6575-9473

    -

    图片

    `;export{s as assetURLs,a as default,o as metadata,i as toc}; +

    图片

    `;export{t as assetURLs,a as default,o as metadata,i as toc}; diff --git a/zh-cn/assets/index-11e00e16.js b/zh-cn/assets/index-63ad8b5a.js similarity index 96% rename from zh-cn/assets/index-11e00e16.js rename to zh-cn/assets/index-63ad8b5a.js index 55e2ce5..eba591d 100644 --- a/zh-cn/assets/index-11e00e16.js +++ b/zh-cn/assets/index-63ad8b5a.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/cover-4f6768e5.png",n=[e],c={label:"Xline社区会议Call Up|在 CURP 算法中实现联合共识的安全性",description:"为了更全面地向大家介绍Xline的进展,同时促进Xline社区的发展,我们将于2024年5月31日北京时间11:00 p.m.召开Xline社区会议。",cover:"./cover.png",location:"中国香港",date:"2024-05-23",title:"Xline Community Meeting Call Up Securing Joint Consensus in CURP Algorithm"},i=[{label:"社区会议主题",level:2},{label:"会议摘要",level:2},{label:"欢迎参与到 Xline 项目中:",level:2},{label:"目前 Xline 提供如下 Good First Issue:",level:2},{label:"Xline 近期文章参考:",level:2}],t=`

    图片

    +const e="/zh-cn/assets/cover-4f6768e5.png",n=[e],i={label:"Xline社区会议Call Up|在 CURP 算法中实现联合共识的安全性",description:"为了更全面地向大家介绍Xline的进展,同时促进Xline社区的发展,我们将于2024年5月31日北京时间11:00 p.m.召开Xline社区会议。",cover:"./cover.png",location:"中国香港",date:"2024-05-23",title:"Xline Community Meeting Call Up Securing Joint Consensus in CURP Algorithm"},c=[{label:"社区会议主题",level:2},{label:"会议摘要",level:2},{label:"欢迎参与到 Xline 项目中:",level:2},{label:"目前 Xline 提供如下 Good First Issue:",level:2},{label:"Xline 近期文章参考:",level:2}],t=`

    图片

    为了更全面地向大家介绍 Xline 的进展,同时促进 Xline 社区的发展,我们将于 2024 年 5 月 31 日北京时间 11:00 p.m. 召开 Xline 社区会议

    欢迎您届时登陆 zoom 观看直播,或点击“阅读原文”链接加入会议:
    会议号: 832 1086 6737
    @@ -26,4 +26,4 @@ Refactor the LogEntryVecDeque in the log.rs

    Xline command 去重机制(一)—— RIFL 介绍
    本文前半部分从 command 去重机制的契机开始,介绍了去重的必要性以及目前 Xline 的去重机制存在的一些问题。后半部分详细讲解了 RIFL 的工作原理,并对其进行了一些性能分析。

    Xline command 去重机制(二)—— RIFL 实现
    -在 Xline 的 CURP 系统中,本文深入探讨了 RIFL 作为基础设施,为 RPC 提供 Exactly-Once 语义的实现及相关问题的解决方案

    `;export{n as assetURLs,t as default,c as metadata,i as toc}; +在 Xline 的 CURP 系统中,本文深入探讨了 RIFL 作为基础设施,为 RPC 提供 Exactly-Once 语义的实现及相关问题的解决方案

    `;export{n as assetURLs,t as default,i as metadata,c as toc}; diff --git a/zh-cn/assets/index-6bc730f7.js b/zh-cn/assets/index-6454a1e4.js similarity index 92% rename from zh-cn/assets/index-6bc730f7.js rename to zh-cn/assets/index-6454a1e4.js index ca56099..8d0a284 100644 --- a/zh-cn/assets/index-6bc730f7.js +++ b/zh-cn/assets/index-6454a1e4.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/image1-b170e804.jpg",o="/zh-cn/assets/image2-29d090cb.png",n="/zh-cn/assets/image1-50beaba8.png",a=[t,o,n],e={label:"叮!您收到了一封来自达坦科技的Hackthon邀请函",description:"DatenLord Hackathon 2023正式启动!达坦科技基于其跨云分布式文件系统DatenLord项目,结合AI大模型时代背景,搭建了擂台,在此正式向您发出邀约!本次大赛赛题深刻有趣,奖品丰厚多样,借此机会您不仅可以尽情施展才华、与来自全国各地优秀的青年才俊们同台PK,更将有机会与优秀的评委教师对话交流。Clock is Ticking!无需犹豫,行动起来,抓住机遇,创造奇迹!",location:"中国香港",date:"2023-11-17",title:"Ding! You've received a Hackthon invitation from Dartan Technologies!"},l=[{label:"Hackathon2023",level:2},{label:"主题",level:2},{label:"大赛时间线",level:2},{label:"背景介绍",level:2},{label:"赛题介绍",level:2},{label:"评估标准",level:2},{label:"赛题宣讲会",level:2}],s=`

    Hackathon2023

    +const t="/zh-cn/assets/image1-b170e804.jpg",a="/zh-cn/assets/image2-29d090cb.png",o="/zh-cn/assets/image1-50beaba8.png",n=[t,a,o],e={label:"叮!您收到了一封来自达坦科技的Hackthon邀请函",description:"DatenLord Hackathon 2023正式启动!达坦科技基于其跨云分布式文件系统DatenLord项目,结合AI大模型时代背景,搭建了擂台,在此正式向您发出邀约!本次大赛赛题深刻有趣,奖品丰厚多样,借此机会您不仅可以尽情施展才华、与来自全国各地优秀的青年才俊们同台PK,更将有机会与优秀的评委教师对话交流。Clock is Ticking!无需犹豫,行动起来,抓住机遇,创造奇迹!",location:"中国香港",date:"2023-11-17",title:"Ding! You've received a Hackthon invitation from Dartan Technologies!"},s=[{label:"Hackathon2023",level:2},{label:"主题",level:2},{label:"大赛时间线",level:2},{label:"背景介绍",level:2},{label:"赛题介绍",level:2},{label:"评估标准",level:2},{label:"赛题宣讲会",level:2}],l=`

    Hackathon2023

    DatenLord Hackathon 2023 正式启动! 达坦科技基于其跨云分布式文件系统 DatenLord 项目,结合 AI 大模型时代背景,搭建了擂台,在此正式向您发出邀约!

    本次大赛赛题深刻有趣,奖品丰厚多样,借此机会您不仅可以尽情施展才华、与来自全国各地优秀的青年才俊们同台 PK,更将有机会与优秀的评委教师对话交流。Clock is Ticking!无需犹豫,行动起来,抓住机遇,创造奇迹!

    主题

    @@ -27,8 +27,8 @@ const t="/zh-cn/assets/image1-b170e804.jpg",o="/zh-cn/assets/image2-29d090cb.png

    赛题宣讲会

    为了进一步宣传以及讲解 DatenLord Hackathon2023 赛题以及背景,我们将于 2023 年 11 月 25 日(周六)下午一点安排一场空中宣讲会。欲了解更多关于本次 Hackathon 的赛制、参赛规则、日程安排,以及达坦科技赛题的介绍、相关资源,欢迎预约报名,我们在空中宣讲会等你,不见不散~

    腾讯会议号码:708-101-213

    -

    图片

    +

    图片

    如有任何问题欢迎联系达坦科技微信小助手:DatenLord_Tech 或发送邮件至
    info@datenlord.com

    -

    图片

    -

    让我们一起在 Hackathon2023 的舞台上尽情释放创意的火花,期待与优秀的你碰撞出新的想法!

    `;export{a as assetURLs,s as default,e as metadata,l as toc}; +

    图片

    +

    让我们一起在 Hackathon2023 的舞台上尽情释放创意的火花,期待与优秀的你碰撞出新的想法!

    `;export{n as assetURLs,l as default,e as metadata,s as toc}; diff --git a/zh-cn/assets/index-500d1a02.js b/zh-cn/assets/index-64a7ffe1.js similarity index 89% rename from zh-cn/assets/index-500d1a02.js rename to zh-cn/assets/index-64a7ffe1.js index 27ea28e..5d97021 100644 --- a/zh-cn/assets/index-500d1a02.js +++ b/zh-cn/assets/index-64a7ffe1.js @@ -1,4 +1,4 @@ -const n="/zh-cn/assets/cover-bc86e95c.jpg",t="/zh-cn/assets/image1-d4391053.jpg",e=[n,t],o={label:"DatenLord开源产品技术分享 | Xline源码解读",description:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源分布式KV存储Xline,针对多数据中心场景,可以实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性。本期源码解读将聚焦Xline的Curp共识协议,DatenLord分布式存储工程师赵佳炜将与大家分享在Xline中应用的Curp共识协议的设计与代码实现。",cover:"./cover.jpg",location:"中国香港",author:["赵佳炜"],tags:["Xline"],date:"2023-04-24",title:"DatenLord open source product technology sharing l Xline source code interpretation"},r=[{label:"【源码解读】Xline Curp 共识协议的设计与实现",level:2}],l=`

    封面

    +const t="/zh-cn/assets/cover-bc86e95c.jpg",n="/zh-cn/assets/image1-d4391053.jpg",e=[t,n],o={label:"DatenLord开源产品技术分享 | Xline源码解读",description:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源分布式KV存储Xline,针对多数据中心场景,可以实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性。本期源码解读将聚焦Xline的Curp共识协议,DatenLord分布式存储工程师赵佳炜将与大家分享在Xline中应用的Curp共识协议的设计与代码实现。",cover:"./cover.jpg",location:"中国香港",author:["赵佳炜"],tags:["Xline"],date:"2023-04-24",title:"DatenLord open source product technology sharing l Xline source code interpretation"},r=[{label:"【源码解读】Xline Curp 共识协议的设计与实现",level:2}],l=`

    封面

    传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord 推出开源分布式 KV 存储 Xline,针对多数据中心场景,可以实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性。

    本期源码解读将聚焦 Xline 的 Curp 共识协议,DatenLord 分布式存储工程师赵佳炜将与大家分享在 Xline 中应用的 Curp 共识协议的设计与代码实现

    【源码解读】Xline Curp 共识协议的设计与实现

    @@ -17,4 +17,4 @@ const n="/zh-cn/assets/cover-bc86e95c.jpg",t="/zh-cn/assets/image1-d4391053.jpg"

    【直播预约】 欢迎您预约直播,或者登陆腾讯会议观看直播:
    会议号:955-6910-3992

    -

    图片

    `;export{e as assetURLs,l as default,o as metadata,r as toc}; +

    图片

    `;export{e as assetURLs,l as default,o as metadata,r as toc}; diff --git a/zh-cn/assets/index-72b88898.js b/zh-cn/assets/index-64a98ea7.js similarity index 98% rename from zh-cn/assets/index-72b88898.js rename to zh-cn/assets/index-64a98ea7.js index 43f6e02..e64a8d6 100644 --- a/zh-cn/assets/index-72b88898.js +++ b/zh-cn/assets/index-64a98ea7.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/cover-6865ae02.png",l=[e],t={label:"Xline v0.3.0:一个用于元数据管理的分布式KV存储",description:"Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。",cover:"./cover.png",location:"中国香港",author:["达坦科技"],tags:["Xline"],date:"2023-03-23",title:"Xline v0.3.0: A distributed KV store for metadata management"},i=[{label:"Xline 是什么?我们为什么要做 Xline?",level:2},{label:"V0.3.0 版本有什么新功能?",level:3},{label:"欢迎参与到 Xline 项目中",level:2},{label:"相关链接",level:2}],n=`

    封面

    +const e="/zh-cn/assets/cover-6865ae02.png",l=[e],t={label:"Xline v0.3.0:一个用于元数据管理的分布式KV存储",description:"Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。",cover:"./cover.png",location:"中国香港",author:["达坦科技"],tags:["Xline"],date:"2023-03-23",title:"Xline v0.3.0_ A distributed KV store for metadata management"},i=[{label:"Xline 是什么?我们为什么要做 Xline?",level:2},{label:"V0.3.0 版本有什么新功能?",level:3},{label:"欢迎参与到 Xline 项目中",level:2},{label:"相关链接",level:2}],n=`

    封面

    Xline 是什么?我们为什么要做 Xline?

    Xline 是一个基于 Curp 协议的,用于管理元数据的分布式 KV 存储。 现有的分布式 KV 存储大多采用 Raft 共识协议,需要两次 RTT 才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。

    但是,当跨数据中心部署时,节点之间的延迟可能是几十或几百毫秒,此时 Raft 协议将成为性能瓶颈。Curp 协议就是为了解决这个问题而设计的。它可以在命令不冲突的情况下减少一个 RTT,从而提高性能。因此,Xline 旨在实现高性能的数据访问和跨数据中心场景下的强一致性。

    diff --git a/zh-cn/assets/index-65fd7bbd.js b/zh-cn/assets/index-65fd7bbd.js new file mode 100644 index 0000000..8c77874 --- /dev/null +++ b/zh-cn/assets/index-65fd7bbd.js @@ -0,0 +1,69 @@ +const e="/zh-cn/assets/image-8e31ea63.png",t=[e],r={label:"Linux下RDMA驱动程序探索系列-2",description:"本系列文章将带领读者逐步了解Linux操作系统下的RDMA子系统。本篇文章作为系列的第二篇,将深入内核态驱动程序的代码,主要介绍如下内容:Driver的初始化流程和几个重要verbs回调函数的简介",location:"中国香港",cover:"./image.png",author:["达坦科技"],date:"2024-07-18",title:"Exploring RDMA Driver in Linux Series2"},l=[{label:"Kernel Driver的初始化流程",level:2},{label:"驱动的加载与激活",level:3},{label:"RDMA设备注册",level:3},{label:"几个重要verbs回调函数的简介",level:2},{label:"query_device 回调",level:3},{label:"query_port 回调",level:3},{label:"dtld_get_link_layer回调",level:3},{label:"alloc_ucontext回调",level:3}],_=`

    图片 +本系列文章将带领读者逐步了解Linux操作系统下的RDMA子系统。本篇文章作为系列的第二篇,将深入内核态驱动程序的代码,主要介绍如下内容:

    +

    Driver的初始化流程

    +

    几个重要verbs回调函数的简介

    +

    Kernel Driver的初始化流程

    +

    由于不同厂商的驱动程序千差万别,在此不以具体厂商的驱动程序进行介绍,而是以Kernel中核心的API调用为锚点进行介绍。读者在阅读完本篇文章后,可以在自己感兴趣的厂商驱动代码中搜索这些API,从而快速梳理出这些驱动程序的框架。

    +

    驱动的加载与激活

    +

    作为一个Linux Kernel Driver,其入口点的位置和普通的Driver程序一样,都是通过module_init来指定一个函数作为入口点。

    +

    由于基本上所有RDMA网卡都是PCIe设备,因此在驱动程序入口执行后,首先要做的是初始化PCIe设备相关的操作,典型的就是调用pci_register_driver向Kernel注册自己所感兴趣的PCIe设备,提供probe回调函数,这样kernel在匹配到驱动所对应的硬件后,就会调用probe函数。所以,从某种角度上来说,PCIe设备的probe回调函数才是绝大多数RDMA驱动的主入口,因为如果没有硬件插入主板的话,驱动可以处于静默状态,只有检测到PCIe硬件以后,整个驱动才开始活跃起来。(当然,上述流程是针对RDMA硬件设备的驱动而言的,对于一些例外情况,例如Linux在drivers/infiniband/sw目录中提供的rxe驱动等,是通过软件来模拟硬件行为的,不涉及到真实的硬件,则初始化流程必然会有所差异)。

    +

    RDMA设备注册

    +

    驱动程序的核心部分被激活以后,接下来的操作就主要是在Kernel的RDMA框架下进行工作了。该框架提供了一系列以ib_开头的系统调用,在接下的文章中将介绍为了让操作系统可以识别到一个RDMA设备所需要的最少的ib_API调用。

    +

    首先,我们需要调用ib_alloc_device来申请一个用来描述RDMA设备的结构体,一个例子如下:

    +
    struct dtld_dev {
    +    struct ib_device ib_dev;
    +    // Other custom fields
    +};
    +
    +struct dtld_dev *dtld = NULL;
    +
    +dtld = ib_alloc_device(dtld_dev, ib_dev);
    +
    +

    不出意外的,上述代码中使用了Kernel中经典的通过结构体嵌套和container_of来实现类似“面向对象”风格变成的写法。其中dtld_dev结构体是用来表述一块RDMA网卡的顶层结构,其中必须放入一个ib_device类型的成员,从而使得该结构体可以被Kernel的RDMA框架所识别。这个结构体定义好之后,就可以调用ib_alloc_device来申请一块Kernel中的内存用于存放这个设备的描述符了。

    +

    拿到设备描述符以后,接下来要调用的是ib_set_device_ops,这个API需要传入一个ib_device_ops类型的结构体,该结构体中定义了RDMA设备可以支持的各种回调函数,一个简单的例子如下所示:

    +
    static const struct ib_device_ops dtld_dev_ops = {
    +    .owner = THIS_MODULE,
    +    .driver_id = RDMA_DRIVER_UNKNOWN,
    +    .uverbs_abi_ver = DTLD_UVERBS_ABI_VERSION,
    +    
    +    // all kinds of callback functions
    +    .alloc_ucontext = dtld_alloc_ucontext,
    +    .get_port_immutable = dtld_port_immutable,
    +    .query_port = dtld_query_port,
    +    .query_device = dtld_query_device,
    +    .dealloc_ucontext = dtld_dealloc_ucontext,
    +    .get_link_layer = dtld_get_link_layer,
    +    .mmap = dtld_mmap,
    +    .mmap_free = dtld_mmap_free
    +    // a lot more callbacks, not listed here
    +};
    +
    +

    可以看到这个结构体的前三个字段定义了一些元信息,此后的数十个字段都是Kernel中RDMA框架所支持的各种回调函数的挂载点。上述列出的是一些必要的回调函数,有了这些回调函数的支持,上层应用便可以通过API函数查询到一个可用的RDMA设备了(虽然这个设备现在还只是一个空壳子)。具体这些回调函数的作用,将在下一小节中进行介绍。

    +

    上述两个API的调用都是正式将RDMA设备注册给操作系统之前的准备工作。打个比方,就像去一些单位线下办理业务,在正式办理之前需要填好各种申请表格,上面第一个API的作用类似于找人要一张申请表(分配一块内存给设备描述符),第二个API的作用相当于把申请表填好(准备好各种回调函数),接下来的这个API是真正办理业务的API了(向操作系统正式注册这个RDMA设备):ib_register_device。

    +

    在调用ib_register_device以后,如果上层用户态驱动安装正常,则可以通过rdma link show命令行指令观察到一块可以使用RDMA网卡出现在列表中,说明操作系统已经接受了上面的注册申请。

    +

    几个重要verbs回调函数的简介

    +

    在上面第二步填写申请表的操作中,最重要的就是那些回调函数了,很多用户态的管理类API操作,都会最终调用到这些回调函数上来。接下来我们来看几个重要的回调函数,这些回调函数支撑了用户态的rdma link show命令行指令。

    +

    query_device 回调

    +

    该回调的主要作用是返回设备的必要信息,原型如下:

    +
    static int dtld_query_device(
    +    struct ib_device *dev, 
    +    struct ib_device_attr *attr,
    +    struct ib_udata *uhw);
    +
    +

    从原型声明中可以看到,核心是要通过*attr将设备的各种属性信息返回给Kernel的RDMA框架。这个ib_device_attr类型的结构体是一个拥有40多个字段的结构体,其中主要包含了设备所支持的各种极限参数,例如最大的QP数量、最大的MR数量、最大的PD数量等等这些东西。

    +

    query_port 回调

    +

    这个回调的作用是返回端口的必要信息,原型如下:

    +
    static int dtld_query_port(
    +    struct ib_device *dev, 
    +    u32 port_num,
    +    struct ib_port_attr *attr);
    +
    +

    从名字就可以看出,这个回调的作用和query_device回调是很类似的,只不过这个要返回端口的属性,而不是设备的属性。其中的ib_port_attr结构体主要包含了端口的速率信息、链路是否通常、MTU配置等,对于一个空壳驱动程序而言,可以通过直接返回如下的属性来让上层应用看到一个可用的接口:

    +
    attr->state = IB_PORT_ACTIVE;
    +attr->phys_state = IB_PORT_PHYS_STATE_LINK_UP;
    +
    + +

    该函数主要用于返回链路层的类型,例如对于一个RoCE设备,则该回调需要返回IB_LINK_LAYER_ETHERNET

    +

    alloc_ucontext回调

    +

    这个回调函数会在上层应用打开设备时被调用,可以在这里完成一些对设备使用前的一些初始化工作,例如将下发WQE的环形缓冲区地址映射到用户态等操作,都可以在这个回调中完成。

    +

    提到内存地址的映射,由于RDMA的使用过程中需要很多用户态跳过内核直接操作硬件的操作,因此将硬件上的CSR或Buffer映射到用户态是一个常见的操作。RDMA框架也为此提供了一套映射机制。关于这套映射机制的介绍,我们将在后面单独列出一篇文章进行介绍。对于前文中提到的mmap回调函数的使用,我们也将放到这篇文章中一同进行介绍,敬请期待。

    `;export{t as assetURLs,_ as default,r as metadata,l as toc}; diff --git a/zh-cn/assets/index-a294a248.js b/zh-cn/assets/index-6618c0b5.js similarity index 98% rename from zh-cn/assets/index-a294a248.js rename to zh-cn/assets/index-6618c0b5.js index 4d93c80..2cde4b2 100644 --- a/zh-cn/assets/index-a294a248.js +++ b/zh-cn/assets/index-6618c0b5.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/e4031380f79f643b21d6bdfd37c46a1c-95e167c8.jpeg",s="/zh-cn/assets/8108518a82f752ddea6832ce7bc15560-3d5249bd.png",a="/zh-cn/assets/cf12e52cb9d0fbb7359c08e1cfc674bc-9774dac8.png",c="/zh-cn/assets/9d0ce540d5b4e7c3cb1a055c1413bdc9-a833a409.png",n="/zh-cn/assets/f7aae2cd2b075c3f567ff87285f738c2-476d6b84.png",t="/zh-cn/assets/bb02cb50b10cee5e7d575210aaeacd71-1661168b.png",l=[e,s,a,c,n,t],p={label:"Xline 源码解读(四)—— CURP 状态机引擎",description:"在上一篇源码解读的文章(Xline 源码解读(三) —— CURP Server 的实现)中,我们简单阐述了Xline 的 Curp Server 是如何实现的。接下来,就让我们话接上回,继续深入地来了解 Curp Server 中的一些核心的数据结构,特别是 conflict_checked_channel 和 command worker,它们相互协作,共同推动着 CURP Server 内部状态机状态转换。",cover:"./e4031380f79f643b21d6bdfd37c46a1c.jpeg",location:"中国香港",author:["赵佳炜"],tags:["Xline"],date:"2023-10-19",title:"Xline Source Code Interpretation (IV) CURP state machine engine"},r=[{label:"为什么我们需要冲突检测队列?",level:2},{label:"冲突检测队列是如何工作的?",level:2},{label:"状态机引擎的架构",level:2},{label:"状态是如何转换的",level:2},{label:"Summary",level:2}],o=`

    +const e="/zh-cn/assets/e4031380f79f643b21d6bdfd37c46a1c-95e167c8.jpeg",s="/zh-cn/assets/8108518a82f752ddea6832ce7bc15560-3d5249bd.png",a="/zh-cn/assets/cf12e52cb9d0fbb7359c08e1cfc674bc-9774dac8.png",c="/zh-cn/assets/9d0ce540d5b4e7c3cb1a055c1413bdc9-a833a409.png",n="/zh-cn/assets/f7aae2cd2b075c3f567ff87285f738c2-476d6b84.png",t="/zh-cn/assets/bb02cb50b10cee5e7d575210aaeacd71-1661168b.png",l=[e,s,a,c,n,t],r={label:"Xline 源码解读(四)—— CURP 状态机引擎",description:"在上一篇源码解读的文章(Xline 源码解读(三) —— CURP Server 的实现)中,我们简单阐述了Xline 的 Curp Server 是如何实现的。接下来,就让我们话接上回,继续深入地来了解 Curp Server 中的一些核心的数据结构,特别是 conflict_checked_channel 和 command worker,它们相互协作,共同推动着 CURP Server 内部状态机状态转换。",cover:"./e4031380f79f643b21d6bdfd37c46a1c.jpeg",location:"中国香港",author:["赵佳炜"],tags:["Xline"],date:"2023-10-19",title:"Xline Source Code Interpretation (IV) CURP state machine engine"},p=[{label:"为什么我们需要冲突检测队列?",level:2},{label:"冲突检测队列是如何工作的?",level:2},{label:"状态机引擎的架构",level:2},{label:"状态是如何转换的",level:2},{label:"Summary",level:2}],o=`

    在上一篇源码解读的文章(
    Xline 源码解读(三) —— CURP Server 的实现

    )中,我们简单阐述了 Xline 的 Curp Server 是如何实现的。接下来,就让我们话接上回,继续深入地来了解 Curp Server 中的一些核心的数据结构,特别是 conflict_checked_channel 和 command worker,它们相互协作,共同推动着 CURP Server 内部状态机状态转换。

    @@ -144,4 +144,4 @@ const e="/zh-cn/assets/e4031380f79f643b21d6bdfd37c46a1c-95e167c8.jpeg",s="/zh-cn 来判断命令是否冲突是显然不够的。因为  spec_pool 
    只能判断新的命令是否与正在  execute 
    但还没有  after_sync
    -的命令冲突,但它不能起到动态维护命令冲突关系的作用。为了解决冲突关系的动态维护,我们引入了冲突检测队列,并通过冲突检测队列和 command worker 共同构造 Curp Server 的状态机引擎。通过 command worker 的执行,使得来自不同路径(fast path 和 slow path)的命令能够根据自身的状态,进行状态转移,并向用户返回相应的结果。

    `;export{l as assetURLs,o as default,p as metadata,r as toc}; +的命令冲突,但它不能起到动态维护命令冲突关系的作用。为了解决冲突关系的动态维护,我们引入了冲突检测队列,并通过冲突检测队列和 command worker 共同构造 Curp Server 的状态机引擎。通过 command worker 的执行,使得来自不同路径(fast path 和 slow path)的命令能够根据自身的状态,进行状态转移,并向用户返回相应的结果。

    `;export{l as assetURLs,o as default,r as metadata,p as toc}; diff --git a/zh-cn/assets/index-6d1ca60f.js b/zh-cn/assets/index-6d1ca60f.js new file mode 100644 index 0000000..e5f379a --- /dev/null +++ b/zh-cn/assets/index-6d1ca60f.js @@ -0,0 +1,24 @@ +const e="/zh-cn/assets/cover-b2241eaf.png",n="/zh-cn/assets/image-ee9f9238.png",t=[e,n],i={label:"Xline社区会议Call Up:揭秘Xline 0.7版本更新",description:"为了更全面地向大家介绍Xline的进展,同时促进Xline社区的发展,我们将于2024年7月31日北京时间11:00 p.m.召开Xline社区会议。",cover:"./cover.png",location:"中国香港",date:"2024-07-25",title:"Xline Community Meeting Call Up Revealing Xline 0.7 Version Update"},l=[{label:"1",level:2},{label:"2",level:2},{label:"3",level:2}],p=`

    Xline /Community Meeting +为了更全面地向大家介绍Xline的进展,同时促进Xline社区的发展,我们将于2024年7月31日北京时间11:00 p.m. 召开Xline社区会议

    +

    欢迎您届时登陆zoom观看直播:

    +

    会议号: 975-8012-1637

    +

    会议链接:

    +

    https://zoom-lfx.platform.linuxfoundation.org/meeting/97580121637?password=8f9543a5-54bb-48dc-ab90-99d8b75938e4

    +

    1

    +

    在Xline 0.7中,我们完成了对Xline代码库中进行了一次较大的重构。这次重构在某些性能测试中甚至使得Xline获得了近20倍的性能提升。

    +

    本次Xline社区会议主要围绕Xline 0.7版本的更新展开,以下是会议的主要内容:

    +

    性能优化: 我们对curp命令执行流程进行了大幅重构,并对Xline状态机的异步代码进行了一系列优化,提升了系统的整体性能。

    +

    基于RIFL的命令去重(deduplication): 我们基于RIFL实现了一套去重机制,解决了客户端自动重试导致的一致性问题。同时,基于去重机制重新实现了Xline中的命令垃圾回收流程。

    +

    2

    +

    欢迎参与到Xline项目中:

    +

    我们欢迎任何对于Xline的积极贡献。目前在GitHub上有些任务并不需要深入了解Curp协议或Xline这个项目,只需要了解API和Rust语言即可。即使您现处于入门阶段,并想要在开源项目中使用Rust语言,社区也会提供指导和帮助,来引导您更好地参与项目。

    +

    3

    +

    Xline近期文章参考:

    +

    Xline 0.7重构性能分析总述

    +

    本文讲解了Xline中重构后命令执行流程的新设计,以及我们是如何优化Xline的性能的。

    +

    异步运行时IO问题分析

    +

    在本篇文章中,我们主要会通过Xline开发中的几个例子,讨论Rust的异步运行时中有关于IO的问题,以及在代码实现中如何正确使用Tokio runtime以实现最佳性能。图片 +Xline于2023年6月加入CNCF 沙箱计划,是一个用于元数据管理的分布式KV存储。Xline项目以Rust语言写就。感谢每一位参与的社区伙伴对Xline的帮助和支持,也欢迎更多使用者和开发者参与体验和使用Xline。

    +

    GitHub链接https://github.com/xline-kv/Xline

    +

    Xline官网www.xline.cloud

    +

    Xline Discord: https://discord.gg/TT6azpTHZS

    `;export{t as assetURLs,p as default,i as metadata,l as toc}; diff --git a/zh-cn/assets/index-fd018bec.js b/zh-cn/assets/index-71928cce.js similarity index 99% rename from zh-cn/assets/index-fd018bec.js rename to zh-cn/assets/index-71928cce.js index ac5019f..bfa84e8 100644 --- a/zh-cn/assets/index-fd018bec.js +++ b/zh-cn/assets/index-71928cce.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/image1-abdba371.png",s="/zh-cn/assets/image2-c99b8752.png",l=[e,s],c={label:"Rust实现RDMA异步编程(一):基于epoll实现RDMA异步操作",description:"RDMA是一套高性能网络协议栈,多用于高性能计算、高性能存储领域。RDMA的library是用C实现的,但是没有很好用的Rust的binding,不方便Rust开发者使用。于是我们正在封装一层符合Rust风格、便于Rust开发者使用的RDMA Rust binding。特别的,异步编程是近几年很受关注的编程方式,用Rust异步编程来实现IO操作,可以避免操作系统的进程上下文切换,提高性能,而且Rust的异步编程框架也在逐步成熟和完善。本系列文章探讨下如何用异步的方式实现RDMA的操作。本文先讨论下如何基于Linux的epoll机制实现RDMA异步操作,后续的文章再探讨如何用Rust异步编程来实现RDMA异步操作。",location:"河南",author:["王璞"],editor:["张汉东"],tags:["RDMA"],date:"2022-05-27",title:"Rust implementation of RDMA asynchronous programming (I): epoll based implementation of RDMA asynchronous operation"},n=[{label:"RDMA 操作简介",level:2},{label:"Linux epoll 异步机制简介",level:2},{label:"RDMA 完成队列 CQ 读取 CQE 的同步和异步方法",level:2},{label:"RDMA 轮询方式读取 CQE",level:3},{label:"RDMA 完成事件通道方式读取 CQE",level:3},{label:"基于 epoll 异步读取 CQE",level:3}],o=`

    RDMA 是一套高性能网络协议栈,多用于高性能计算、高性能存储领域。RDMA 的 library 是用 C 实现的,但是没有很好用的 Rust 的 binding,不方便 Rust 开发者使用。于是我们正在封装一层符合 Rust 风格、便于 Rust 开发者使用的 RDMA Rust binding。特别的,异步编程是近几年很受关注的编程方式,用 Rust 异步编程来实现 IO 操作,可以避免操作系统的进程上下文切换,提高性能,而且 Rust 的异步编程框架也在逐步成熟和完善。本系列文章探讨下如何用异步的方式实现 RDMA 的操作。本文先讨论下如何基于 Linux 的 epoll 机制实现 RDMA 异步操作,后续的文章再探讨如何用 Rust 异步编程来实现 RDMA 异步操作。

    +const e="/zh-cn/assets/image1-abdba371.png",s="/zh-cn/assets/image2-c99b8752.png",l=[e,s],c={label:"Rust实现RDMA异步编程(一):基于epoll实现RDMA异步操作",description:"RDMA是一套高性能网络协议栈,多用于高性能计算、高性能存储领域。RDMA的library是用C实现的,但是没有很好用的Rust的binding,不方便Rust开发者使用。于是我们正在封装一层符合Rust风格、便于Rust开发者使用的RDMA Rust binding。特别的,异步编程是近几年很受关注的编程方式,用Rust异步编程来实现IO操作,可以避免操作系统的进程上下文切换,提高性能,而且Rust的异步编程框架也在逐步成熟和完善。本系列文章探讨下如何用异步的方式实现RDMA的操作。本文先讨论下如何基于Linux的epoll机制实现RDMA异步操作,后续的文章再探讨如何用Rust异步编程来实现RDMA异步操作。",location:"河南",author:["王璞"],editor:["张汉东"],tags:["RDMA"],date:"2022-05-27",title:"Rust implementation of RDMA asynchronous programming (I)_ epoll based implementation of RDMA asynchronous operation"},n=[{label:"RDMA 操作简介",level:2},{label:"Linux epoll 异步机制简介",level:2},{label:"RDMA 完成队列 CQ 读取 CQE 的同步和异步方法",level:2},{label:"RDMA 轮询方式读取 CQE",level:3},{label:"RDMA 完成事件通道方式读取 CQE",level:3},{label:"基于 epoll 异步读取 CQE",level:3}],o=`

    RDMA 是一套高性能网络协议栈,多用于高性能计算、高性能存储领域。RDMA 的 library 是用 C 实现的,但是没有很好用的 Rust 的 binding,不方便 Rust 开发者使用。于是我们正在封装一层符合 Rust 风格、便于 Rust 开发者使用的 RDMA Rust binding。特别的,异步编程是近几年很受关注的编程方式,用 Rust 异步编程来实现 IO 操作,可以避免操作系统的进程上下文切换,提高性能,而且 Rust 的异步编程框架也在逐步成熟和完善。本系列文章探讨下如何用异步的方式实现 RDMA 的操作。本文先讨论下如何基于 Linux 的 epoll 机制实现 RDMA 异步操作,后续的文章再探讨如何用 Rust 异步编程来实现 RDMA 异步操作。

    RDMA 操作简介

    RDMA 的编程模型是基于消息的方式来实现网络传输,并且用队列来管理待发送的消息和接收到的消息。RDMA 的网络传输相关操作基本上都是跟队列相关的操作:比如把要发送的消息放入发送队列,消息发送完成后在完成队列里放一个发送完成消息,以供用户程序查询消息发送状态;再比如接收队列里收到消息,也要在完成队列里放个接收完成消息,以供用户程序查询有新消息要处理。

    图片

    diff --git a/zh-cn/assets/index-740bc59b.js b/zh-cn/assets/index-740bc59b.js new file mode 100644 index 0000000..eb33f2a --- /dev/null +++ b/zh-cn/assets/index-740bc59b.js @@ -0,0 +1,161 @@ +const e="/zh-cn/assets/image-8a82c950.png",p="/zh-cn/assets/image2-fedcb560.png",c="/zh-cn/assets/image3-e10b812e.png",I="/zh-cn/assets/image4-97f5ce33.png",P="/zh-cn/assets/image5-518dd716.png",o="/zh-cn/assets/image6-06237b2e.png",C="/zh-cn/assets/image7-c22e37fd.png",l="/zh-cn/assets/image8-82d6772e.png",n="/zh-cn/assets/image9-9d5cd850.png",t="/zh-cn/assets/image10-20f4aa92.png",i=[e,p,c,I,P,o,C,l,n,t],T={label:"规模弹性: 管理谷歌的TPUv4机器学习超级计算机",description:"我们采用软件定义网络(SDN)方法来管理 TPUv4 的高带宽芯片间互连(ICI)结构,利用光路交换来动态配置路由,以应对机器、芯片和链路故障。我们的基础设施可检测故障并自动触发重新配置,以最大限度地减少对运行工作负载的干扰,同时启动受影响组件的补救和修复工作流程。",location:"中国香港",cover:"./image1.png",author:["达坦科技"],date:"2024-06-13",title:"Managing Google's TPUv4 Machine Learning Supercomputer"},U=[{label:"引言",level:2},{label:"可重构的 ML 超级计算机系统架构",level:2},{label:"静态 pod 架构的经验教训",level:3},{label:"TPUv4:基于 OCS 的可重构性",level:3},{label:"可编程 ICI 协议",level:3},{label:"超级计算机管理自动化",level:2},{label:"概述",level:3},{label:"超级计算机建模",level:3},{label:"集群调度",level:3},{label:"光点管理器",level:3},{label:"libtpunet",level:3},{label:"硬件维护和恢复",level:3}],b=`

    图片 +TPUv4(张量处理单元)是谷歌用于机器学习训练的第三代加速器,采用定制的三维环形互连,部署为 4096 节点的超级计算机。在本文中,我们将介绍设计和运行软件基础设施的经验,这些软件基础设施使 +TPUv4 超级计算机能够大规模运行,包括自动故障恢复和硬件恢复功能。 +我们采用软件定义网络(SDN)方法来管理 TPUv4 的高带宽芯片间互连(ICI)结构,利用光路交换来动态配置路由,以应对机器、芯片和链路故障。我们的基础设施可检测故障并自动触发重新配置,以最大限 +度地减少对运行工作负载的干扰,同时启动受影响组件的补救和修复工作流程。类似的技术还可与硬件和软件的维护和升级工作流程对接。我们的动态重新配置方法使我们的 TPUv4 超级计算机实现了 99.98% +的系统可用性,能够从容应对约 1% 的训练任务所遇到的硬件中断。

    +

    引言

    +

    机器学习(ML)模型的规模和复杂性不断增长[9, 24],这得益于异构超级计算机的大规模计算能力,其中 CPU 负责运行时任务协调和 I/O,而 TPU [18-20] 和 GPU 等加速器则提供模型训练所需的计算性 +能。扩大超级计算机的节点数能使模型功能更强,因为训练过程可以在批次、张量和流水线维度上有效地并行化[17, 33]。

    +

    大规模 ML 超级计算机的硬件/软件生态系统面临两个挑战:第一,有效并行化模型训练工作负载;第二,也是本文的重点--保持计算资源的高可用性,从而为 ML 训练工作提供高产出。近年来,后者变得越来 +越困难,因为

    +
      +
    • +

      松耦合分布式应用(如 Map-Reduce[12])可以有效地容忍动态变化的资源分配,而 ML 训练作业则不同,它更多地使用静态(编译时)分片策略和帮派式计划执行,要求所有计算资源同时处于健康状态;

      +
    • +
    • +

      现代 ML 模型(如大型语言模型 (LLM))需要前所未有的大量硬件(传统计算、加速器、网络和存储)[2],从而将预期 MTBF 降至数小时甚至数分钟[15];

      +
    • +
    • +

      在云或共享集群环境中,许多用户都在争夺超级计算机资源的不同子集,这使得能够随着时间的推移重新配置或重新平衡资源分配变得格外重要。

      +
    • +
    +

    谷歌的 TPUv4 机器学习超级计算基础设施旨在应对这些挑战。它包括以下硬件和软件组件:

    +
      +
    • +

      多个cubes:一个cube是一个硬件单元,包含 64 个 TPU 芯片,以 4x4x4 的三维网格排列;每个超级计算机或 pod 有 64 个cube,共计 4096 个 TPU。

      +
    • +
    • +

      专有的芯片间互联(ICI):这是一种高速网络结构,可直接与 TPU 互联,从而实现设备与设备之间的直接通信(即 RDMA),而无需涉及 CPU。

      +
    • +
    • +

      光路交换机(OCSes)[25]:用于动态交叉连接(xconnect)不同cube的 ICI,以形成用户要求的环形拓扑结构。

      +
    • +
    +

    Borg [31]:集群管理服务,用于受理、调度和管理 TPUv4 作业(及其他作业)。

    +

    Pod 管理器:集群级软件服务,根据 Borg 的调度决定启动 OCS xconnect 设置,从而管理多cube连接。 +图片

    +

    可重构的 ML 超级计算机系统架构

    +

    TPUv4 可重构超级计算机是专为可扩展性、可用性、弹性和成本而设计的[18]。它的核心是一个可重新配置的 ICI 结构拓扑,连接不同的 TPUv4 芯片,每个 pod 都有一组可编程的 OCS。如果没有 TPUv4 基于 OCS 的可重构性,随着计算资源规模的扩大,作业可用性会迅速下降。图 1 利用已部署的 TPUv3 静态 pod 和 TPUv4 可重构 pod 的测量数据显示了这种效果。

    +

    对于像 TPUv3 [19]这样计算资源静态互连的传统超级计算机,当所需计算资源增加到 1024 个芯片时,作业的整体可用性会急剧下降。这是因为在静态 pod 中,一组连续节点中的所有资源必须同时处于健康状态,才能分配给用户,而随着系统规模的扩大,这种可能性越来越小。利用 TPUv4 的cube级可配置性,可用性可保持在 94% 左右的高水平,相当于约 50 个cube或 3200 个 TPUv4 芯片。

    +

    之后可用性下降的原因是不同cube之间偶尔会出现机器故障和 ICI 链路故障。正如我们将在第 4 节中展示的那样,利用容错路由来容忍偶尔发生的 OCS 故障或维护事件,可将可用性进一步提高到 99.98%,因为即使在这些罕见的事件中,用户仍可访问各个cube。 +图片

    +

    静态 pod 架构的经验教训

    +

    在 TPUv4 ML 超级计算机之前,最先进的是 TPUv2 和 TPUv3 静态 pod [19]--“静态 ”是因为它们具有不可重新配置的固定 ICI 网格。TPUv2 pod 有 256 个 TPU,连接在一个 16x16 ICI 环上,而 TPVv3 有 1024 个 TPU,连接在一个 32x32 环上。TPUv3 还有一个扩展变体,它将 4 个 pod 组合成一个 128x32 网格,但 ICI 路由能力有限。这种所谓的多节点版本是与应用集体模式共同设计的,用于探索大型模型的扩展策略[21]。

    +

    图 1 和图 2 介绍了随着模型规模在静态 pod 中扩大,可用性面临的挑战。要训练一个模型,所有 TPU 进程必须同时启动,通过 ICI 集体同步更新权重。一个失败或中断的进程将中断整个训练过程。

    +

    为用户的工作寻找合适的计算资源面临着以下挑战:

    +
      +
    1. +

      硬件中断:在 ICI 链路、TPU 芯片和 CPU 主机层面对硬件、固件和软件进行定期计划维护,会从可调度池中移除资源[22]。对于拥有数千个 TPU 的超级计算机来说,影响任何一个组件的事件都会相对频繁地发生,因此很难找到可用的资源集。此外,随着系统和应用规模和复杂性的增加,意外故障发生的频率也会增加。如果没有可重新配置性,要为一项需要 1024 台主机的工作提供良好的可用性,就意味着每台主机都必须保持 99.9% 的可用性;而引入可重新配置的 OCS 后,主机可用性要求将降至 99%。

      +
    2. +
    3. +

      工作负载碎片整理:许多工作争夺 pod 可调度资源的不同子集是很常见的。由于这些工作来来去去的时间无法预测,有时 Borg 必须移动(抢占)较小的工作,以腾出连续的 TPU,用于等待较大的训练工作。当用户优先级混合在一起时,调度的复杂性就会增加。有了基于 OCS 的可重构性,Borg 就不需要担心 TPU 资源的物理连续性。相反,任何一组空闲的cube都可以通过 OCS 交叉连接,供用户作业使用。

      +
    4. +
    5. +

      部署准备时间:由于计算和网络资源的紧密耦合性,静态 pod 在所有硬件安装完毕之前无法使用。有了可重新配置的 pod,一旦 OCS 的足迹安装完毕,cube就可以立即部署和使用。

      +
    6. +
    +

    上述挑战促使我们对 TPUv4 pod 架构进行重新思考。

    +

    TPUv4:基于 OCS 的可重构性

    +

    TPUv4 采用可重构架构,利用 Palomar 光路开关(OCS)[25] 解决静态系统的问题。通过采用这种架构,我们能够有效地扩展到 4096 个 TPU 节点,并支持按任务选择三维环形或三维扭曲环形拓扑结构[7]。

    +

    OCS 是一种可动态配置的 N ×N 交换机,基于微机电系统 (MEMS) 镜阵列,可在毫秒内完成切换。每个 OCS 允许在交换机(逻辑)北侧的任意一对端口与(逻辑)南侧的任意一对端口之间创建可编程的交叉连接(xconnect)。一旦在 Ni 端口与 Sj 端口之间建立了连接,就会建立一个专用的 ICI 链路连接,这样 Ni 端口的光信号就只能路由到 Sj 端口,反之亦然,直到这些端口被重新配置成不同的排列方式。 +图片 +图 3:4x4x4 cube由 16 台 TPUv4 机器组成,每台机器以 2x2x1 网格组织 4 个 TPU。cube中的 TPU 沿着 X/Y/Z 维度通过 ICI 相互连接,每个cube面有 16 个用于 OCS xconnect 的光链路。

    +

    TPUv4 的计算资源以多机器cube的粒度组织。每个 TPU 机器都有一个 CPU 盘和一个 TPU 盘,通过 PCIe 链接。每个 TPU 托盘有 4 个 TPUv4 芯片,以 2x2x1 ICI 网格排列;16 台 TPU 机器组合成一个数据中心机架;机架内的 ICI 链接通过 ICI 互联,形成 4x4x4 网格。这个组合就是一个cube。

    +

    光交换机将多个cube互连起来,形成更大的 ICI 拓扑形状,在三个维度中的每个维度都有一个或多个cube。每个三维cube在 X/Y/Z 维的每个面上都有 16 个 ICI 接口,每个cube共有 96 个 ICI 接口。TPUv4 超级计算机由 64 个cube组成,共有 6144 个光 ICI 链路连接到 48 个不同的光路交换机。带宽较低的 CPU 端数据中心网络单独管理 [25, 29]。

    +

    TPUv4 的 OCS 可配置性大大提高了可用性。训练任务可以使用任何cube,即使这些cube在物理上并不毗连,这就减少了竞争任务造成的资源碎片。硬件故障会将受影响的cube从资源池中移除,但允许使用健康的cube继续运行。选择 16 台机器的容错粒度是为了兼顾便利性(每个机架的部署、电源和网络),同时在发生故障时保留相对较小的爆炸半径。

    +

    可重构性由配套的软件基础设施管理。根据所需的拓扑结构和cube选择,每次任务启动都会诱导软件建立独特的 OCS xconnect。大量的芯片、链路和交换机也需要自动故障诊断、恢复、作业重新安排和容错 ICI 路由。

    +

    使用 OCS 可以以较低的成本扩展 TPUv4 pod:OCS 和光纤成本小于 TPUv4 pod 总资本成本的 5%,其运行功率小于 pod 总功率的 3%。TPUv4 OCS 超级计算机的资本和运营成本大大低于使用 Infiniband 等分组交换机的替代方案[18]。

    +

    可编程 ICI 协议

    +

    TPUv4 的 ICI 协议设计为可编程,这样软件就能解决可重新配置性和弹性等操作复杂性问题。一个 TPUv4 pod 就是一个 ICI 域,其中任何一对 TPU 都可以相互进行 RDMA。每个 ICI 链路可承载 50GBps 的单向带宽。TPUv4 采用三维 ICI 网络拓扑结构,可实现高分段吞吐量、大系统规模和低延迟,同时保持低成本,并通过集合支持工作负载并行化。 +图片 +图 4:TPUv4 的 ICI 交换机实现了分层的可编程 ICI 协议。

    +

    如图 4 所示,每个 TPUv4 芯片都有一些计算、一些高带宽内存和一个实现各种 ICI 协议层的 ICI 交换机。ICI 协议有利于按任务进行网络分区,为每个任务设置连接、寻址、路由和流量控制,用户会话不会跨越任务边界。这样,每个任务都能独占其使用的所有链路,从而提高了安全性,并消除了网络共享和拥塞控制所带来的额外系统复杂性。表 1 显示了协议层及其相应的软件代理。从下往上依次为: +图片 +表1: ICP协议层

    +
      +
    • +

      物理层:SERDES、PCS 和链路自动建立模块建立高速链路,尽管不可避免地存在传输错误。Pod 管理器通过旋转 OCS MEMS 镜像控制物理通道的 xconnect,片上管理器自动初始化和配置物理链路。在每个 TPU 机器的 Linux 系统容器中运行的 healthd 守护进程会持续读取链路质量和连接信号,以跟踪硬件健康状况。

      +
    • +
    • +

      可靠的数据层:当数据在物理层丢失时,数据包按顺序传送,并自动重新传输,从而隐藏了物理层的不可靠特性。执行链路级基于信用的流量控制。启用数据层表示 ICI 用户会话已准备就绪;在准备就绪之前,系统会清除所有数据缓冲区,以确保消除先前 ICI 会话的任何架构状态污染。如果启用数据层的一端出现故障,我们会自动关闭链路的另一端,以确保会话正常运行。libtpunet 会发出会话启动/停止命令,并调整最佳流量控制缓冲区大小。权限为健康机器守护进程(healthd machine daemon)可以明确禁用数据层链路,禁止任何用户会话在链路在线恢复时使用该链路(§3.6.3)。

      +
    • +
    • +

      路由层: 数据包转发表由 libtpunet 编程,具有全局负载平衡功能。RDMA 指令中的每个数据包从源 TPU 到目标 TPU,按目标芯片 ID 索引到每个芯片中的转发表。尽管 libtpunet 库可以向编译器提供提示,帮助指导程序优化,但详细的路由策略是隐藏在 ISA 抽象之外的。

      +
    • +
    • +

      事务层: 编译器生成的 RDMA 指令会启动以硬件为媒介的传输,从内存读取数据并馈送到 ICI 交换机。跨越一组单独 RDMA 的事务构成一个集体通信操作。

      +
    • +
    +

    使用软件可编程 ICI 协议栈,我们可以灵活应对 4096 节点超级计算机的复杂性,同时允许硬件处理链路的实时控制,并提供高带宽、低延迟的数据传输。

    +

    超级计算机管理自动化

    +

    在下文中,我们将简单介绍端到端软件基础架构,该基础架构用于启动 TPUv4 ML 训练作业,并随后监控和管理其生命周期(总结另见图 5)。 +图片 +图 5:TPUv4 作业的生命周期:Pod 管理器与 Borg 调度器合作,要求 OCS xconnect cube,然后运行 healthd 预检,libtpunet 建立 ICI 网络。XLA 采用分布式共享内存系统抽象编译程序。一旦检测到故障,运行中的工作会自动中断并重新调度。

    +

    概述

    +

    当用户希望在 TPUv4 超级计算机上启动大型作业1 时,他们会以 (4x,4y,4z) 的形式指定所需的三维切片拓扑结构以及其他元数据。博格集群调度程序[31]会接收所有此类请求,并将其排成队列,等待资源分配。一旦作业符合调度条件,Borg 将选择一组预期的cube,然后发布 xconnect 请求。

    +

    Pod 管理器会定期轮询 Borg,以了解任何待处理的 xconnect 请求。对于每个请求,它都会指示相关的 OCS 交换机旋转其 MEMS 镜像,以建立光 ICI 物理通道。假设所有 OCS xconnects 都正确完成,Pod 管理器就会向 Borg 发送确认信息。经 Pod 管理器批准后,Borg 将任务二进制文件分派到选定的一组 TPU 机器上。首先要进行预检,以确保每个 TPU 机器的硬件完全健康(任何故障都会导致 Borg 重新安排到不同的立方体上)。随后,libtpunet 将建立 ICI 网络(即验证物理层和链路层,并编制转发表)。

    +

    XLA TPU 编译器[3]采用 libtpunet 建立的切片拓扑抽象,为分布式训练生成自动并行化的 TPU 程序。在每台机器上,编译好的 TPU 二进制程序将通过 PCIe 发送到 TPU,然后即可执行。上述工作流程适用于所有 ML 框架,包括 TensorFlow [4]、Jax [1] 和 Pathways [5]。

    +

    在训练过程中,机群维护服务会持续监控所有 TPU 机器的硬件和软件健康状况。任何检测到的异常都会向 Borg 发出通知,Borg 会反过来通知任何受影响的运行作业,以便它们能写入最新的模型检查点(如果可能)。作业一旦被重新安排,就会从最新的模型检查点重新开始。有故障的硬件会被识别出来,并被发送到维修工作流中进行诊断和维修。

    +

    下文将详细介绍这一软件基础设施。

    +

    超级计算机建模

    +

    超级计算机软件栈的基础是数据中心模型[23],它反映了 TPUv4 机器和所有相关组件。该模型存储在一个专用数据库中,其模式允许我们表示包括机架、交换机、RPC 端点等在内的实体图。为支持 TPUv4 超级计算机,一些关键实体包括 TPUv4 立方体(即 16 台机器及其托盘、芯片和静态 ICI 互联拓扑),以及从cube到 OCS 的 ICI 布线和附加光学元数据。一旦构建完成,模型就会为cube部署、作业调度、OCS xconnect、网络设置和健康检查设置意图。该模型由 Borg 和 Pod Manager 使用,作为每个特定超级计算机配置的真实来源。

    +

    TPUv4 拓扑的静态建模最大可达cube大小,因为更大的形状需要动态cube xconnect。例如,一台机器是 2x2x1,两台相邻的机器可以组合成 2x2x2,依此类推,直到 4x4x4。

    +

    集群调度

    +

    Borg 集群调度程序[31]负责为每个 TPUv4 作业分配合适的机器。在谷歌遍布全球的数据中心中有许多 Borg 单元,每个单元可能包括多台 TPUv4 超级计算机。每个单元由 N 个复制的 Borg 服务实例管理,这些服务实例组合起来提供一个逻辑 Borg 实例,我们称之为 Borg Prime,其中包括一个群集调度器。

    +

    集群调度器将预期配置(来自数据中心模型)与当前的实际状态相结合,将其负责的所有 TPUv4 资源组织到可调度的机器组中。用户通常会选择一个单元来启动他们的工作,并指明使用哪种三维拓扑来训练他们的模型。Borg 会将每个用户请求与一组可行(可用)的机器相匹配,并创建建议分配。如果是多cube作业,Borg会将建议的立方体集发布给 Pod 管理器,并等待它发出 xconnect 成功的信号,然后再继续作业。

    +

    每台 TPU 机器都运行一个 borglet 守护进程,与 Borg Prime 合作处理作业生命周期管理。经 Pod 管理器批准后,Borg Prime 会指示指定cube中的每个 borglet 创建一个任务容器,并在任务容器中公开机器的 TPUv4 设备2。然后,borglet 在容器中启动一系列二进制文件,从预检查程序开始,到用户二进制文件结束。

    +

    Borg Prime 和 borglet 共同管理对计划维护(如固件或软件升级)或突发硬件故障等事件的响应。这些事件由不同来源汇总,例如,borglet 会收到 healthd 守护进程发出的有关本地机器重大故障的通知,并将详情传递给 Borg Prime;Pod 管理器同样会转发有关任何重大 OCS 问题的详情。

    +

    Borg Prime 还会收到来自修复自动化系统和软件包管理器的非关键事件通知。在所有情况下,受影响的 TPU 机器都会被标记为不可用,在发出通知后驱逐任何正在运行的作业,并禁止接受新的等待执行的任务,直到问题得到解决。Borg Prime 实现了优先级调度(针对优先级较高和较低的作业)。为了帮助解决碎片化问题,Borg Prime 还可以选择抢先处理正在运行的工作负载(例如,将多个子cube工作负载迁移到更少的cube中,或将多cube工作负载迁移到不同的 pod 中,以便容纳非常大的工作负载)。这将以可控的方式进行,确保作业受到最小和公平的影响。 +图片 +图 6:64 个cube中的每个cube都有两个光 ICI 链路,分别从一个环的两个相对侧连接到 48 个 OCS 中的每个 OCS。每个维度需要 16 个 OCS。

    +

    光点管理器

    +

    Pod 管理器是对 TPUv4 系统至关重要的高可用性服务。它运行在独立于 Borg 的专用网络控制服务器上,并通过谷歌控制平面网络与 Borg 和 OCS 交换机等客户端进行交互。Pod 管理器有两个主要功能:创建 OCS xconnects 以配置用户要求的 TPU 拓扑,以及实时监控 Pod 的健康状况。

    +

    Pod 管理器完全依赖模型数据(第 3.2 节)来配置其服务。它会定期轮询网络模型服务,获取其服务的特定 TPUv4 的最新信息,如 OCS 端点和计划部署的机器。每个任务的 OCS xconnect 计划和持续健康检查都来自模型。使用模型驱动的 Pod 管理器设计,可以逐步部署完整的 TPUv4 超级计算机,同时在早期向客户提供一部分cube。

    +

    Pod 管理器通过复制实现高可用性:一个主实例为外部请求提供服务,其余实例以热备用模式运行,以便在必要时迅速选出一个主实例。我们的备用方案依赖于每个跟随者持续接收检查点副本(也从外部持久化),这意味着故障切换通常非常快。我们依靠这一点进行无中断软件升级,并容忍硬件和软件崩溃。

    +

    Pod 管理器还是 TPUv4 超级计算机健康监控的中心枢纽。该服务通过 RPC 查询 OCS 硬件,定期检查所有光交换机的硬件健康状况。这些遥测数据被导出到谷歌的全机群健康管理系统(§3.6),并实时用于指导容错 ICI 路由优化(§4.2)。 +图片 +图 7:8 cube 8x8x8 环形的 xconnect。每个 OCS 需要配对 16 个南北向 OCS 端口。颜色相同的cube面相互连接,形成多cube环形拓扑结构。

    +

    环形 xconnect

    +

    每个三维cube在 X、Y、Z 三个维度的 6 个面上各有 16 个光学 ICI,共计 96 个 ICI 链接。Pod 管理器为每个链路分配一个唯一标识符 {cube_id,dim,index,polarity},其中 cube_id 是 Google 范围内的立方体 UID,index 范围为 0-15,表示cube面内的位置,polarity 可以是 in 或 out。48 个 OCS 用于 xconnect 这些 ICI,每个维度 16 个。Pod 管理器为每个 OCS 赋予与 ICI 光缆匹配的唯一标识符 {dim,index}。

    +

    图 6 展示了这种光缆连接方案。每个 OCS 提供 128 个端口,用于从cube连接 ICI 光缆,允许所有 64 个cube的单个端口完全连接。这种方案允许形成任何 (4x,4y,4z) TPU 拓扑形状,包括 4x4x4 单cube全环形。需要注意的是,由于连接的 ICI 和 OCS 具有相同的 {dim,index} 参数,如果一个 OCS 不可用,每个cube都会观察到一个具有相同 {dim,index} 参数的 ICI 链接断开。

    +

    为了执行任务的cube xconnect,Pod 管理器会利用其对光 ICI 和 OCS 的内部表示。图 7 展示了 8x8x8 环形的流程:

    +
      +
    • +

      步骤1:Borg 发布一组 UID 和所需拓扑。Pod 管理器根据拓扑结构为每个cube分配一个 3D 坐标;由于 Pod 管理器可以指示交换机应用任意端口-端口 xconnect,因此可以为任何坐标选择任何cube。对于每个(4x、4y、4z)形状,都有 x - y -z cube坐标。

      +
    • +
    • +

      步骤2:Pod 管理器根据分配的坐标计算cube之间的相邻信息;例如,(0,0,0)沿 Xout 和 Xin 与(1,0,0)相邻。

      +
    • +
    • +

      步骤3:Pod 管理器告诉 OCS 在每对相邻cube之间 xconnect ICI {cubeA,dim,index,in} 和 {cubeB,dim,index,out} 。对于任何拓扑结构,所有 48 个 OCS 都需要执行 xconnect ICI 链路的命令,因为所有 16 个 ICI 端口都必须沿着所有 3 个维度和极性连接到它们的远程邻居。根据拓扑结构的不同,每个 OCS 可执行的命令数量也不同,但单个维度的 OCS 总是执行相同数量的命令。以 8x8x8 为例,共有 8 个cube,沿 x、y、z 维度的每个 OCS 必须连接 8 对端口才能形成环(每个cube一个)。

      +
    • +
    • +

      步骤4:将所需连接与当前配置(缓存在 Pod 管理器中)进行比较,然后过滤掉保持不变的连接。发送 RPC 以 xconnect 新连接。

      +
    • +
    +

    在上述任何步骤中,如果 Pod 管理器确定任何端口连接不可行(例如,由于硬件问题),Pod 管理器将向 Borg 说明,并拒绝接受分派给他的cube集合。然后,Borg 可以为用户的工作提出一组新的cube。 +图片] +图 8:(a) 2 Cube 4x4x8 扭合-torus 的 xconnect 和 (b) 4 Cube 4x8x8 扭合-torus 的 xconnect。具有相同颜色的Cube面通过 OCS 相互连接,形成扭曲的环形 ICI。扭曲尺寸的环尺寸总是相较更短的。

    +

    扭转环 xconnect

    +

    除了常规的环形拓扑结构外,如果用户提出要求,我们还支持使用扭曲环形拓扑结构 [7]。在 TPUv4 扭转环形拓扑中[18],环绕链路会根据作业的整体形状以矢量偏移的方式移动。TPUv4 支持两个系列的扭角拓扑:(4k,4k,8k) 和 (4k,8k,8k)。图 8 展示了它们的构建过程。

    +

    对于(4k,4k,8k)形状,不对称沿 Z 维增长,X 维和 Y 维尺寸相同(即 Z 维的一半)。X 和 Y 环绕链接通过 (0,0,4k) 矢量偏移进行移动。

    +

    对于 (4k,4k,8k),不对称沿 Y 和 Z 两个维度增长,而 X 维度的尺寸较小(即 Y 和 Z 维度的一半)。X 环绕链接的偏移量为 (0,4k,4k)。

    +

    规则环和扭曲环的Cube坐标是相同的,但扭曲环会改变相邻的cube面,最终导致 Pod 管理器指示每个 OCS xconnect 不同的南北端口。

    +

    libtpunet

    +

    xconnect 完成后,一旦 ICI 物理通道稳定下来,Borg 就会向主机发送作业二进制文件。libtpunet 库在用户作业中运行,以建立 ICI 网络(数据层和路由层)。

    +

    第一步是拓扑发现。发现是一个自下而上的过程,它扫描每个 TPU 的本地邻居 ICI 连接信息,并运行广度优先搜索,以确保配置的全局拓扑与用户请求相匹配。在此过程中,任务中的每个 TPU 都会被分配一个唯一的芯片 ID;该 ID 将作为 RDMA 指令 ISA 接口的一部分公开。发现过程还能识别可能需要绕过的故障,或在系统抽象中暴露给用户的故障。拓扑发现是对网络意图驱动建模的补充。

    +

    libtpunet 会根据拓扑发现过程中收集到的信息,计算每个 TPU 的转发表并对其进行编程。转发表是作业的全局优化路由解决方案的一部分(更多详情见第 4 节)。

    +

    除了 ICI 路由编程,libtpunet 还根据链路 RTT 的比例设置链路层流量控制缓冲区的大小。时钟配置使用最小生成树生成,并将任何 ICI 路径的最长 RTT 考虑在内。使用一致的时钟可以为性能跟踪和调试提供精确的时间戳。

    +

    最后,libtpunet 会启动 ICI 会话,允许使用各种编译器生成的 RDMA 集体操作。这是通过同步启用每个 ICI 链接两端的数据层来实现的。ICI 握手会在硬件中进行,以确认可靠的数据链路启用请求是从链路两端发起的。

    +

    libtpunet 会在作业生命周期内保持激活状态,以监控 ICI 会话的健康状况。如果任何 TPU 发现错误、链路层瘫痪或驱动程序崩溃,就会向 libtpunet 发出 PCIe MSI-X 中断,由 libtpunet 通知 Borg 启动重新安排。

    +

    硬件维护和恢复

    +

    在全球范围内,破坏性维护事件(如硬件维修或更换,或关键软件/固件升级)发生的频率相对较高。为了最大限度地提高整体维护效率,谷歌运行了一个机队自动化系统。其职责包括硬件故障诊断、硬件恢复工作流程和系统软件包安装(如主机内核或设备固件)。

    +

    由机群维护自动化系统生成的事件会向 Borg 发送通知,以驱逐受影响机器上正在运行的作业;任何被驱逐的作业都会排队等待重新安排。如果出现疑似故障,受影响的硬件将被发送到维修工作流程,该流程将自动诊断与技术人员的必要输入相结合。硬件恢复后,在重新加入资源池之前,会经过自动质量保证流程。对于 TPUv4 超级计算机,我们通过持续的 TPU 硬件健康状况遥测、作业启动前的明确预检以及在线 ICI 链路修复方案对该系统进行了扩展。

    +

    healthd

    +

    我们在每台 TPUv4 机器上都添加了一个 healthd 守护进程,对硬件部分进行实时监控,包括 24 个单向 ICI 链路、TPU 和 CPU 之间的 PCIe 通道以及 4 个 TPU ASIC 本身。healthd 使用与 Pod Manager 相同的模型,后者提供了有关监控端点、固件和 ICI 线缆元数据的必要详细信息。

    +

    对于每个 ICI 链路,将根据建模值和一组预定义阈值持续检查电缆连接和相关链路质量。任何检测到的症状都会按其严重程度进行排序,症状严重时,healthd 会通知 Borg 驱逐并重新安排受影响的作业。

    +

    预检

    +

    每个用户作业前都会进行预检,以确保硬件健康。我们目前有两种不同的检查器:端到端检查器通过运行一个小型样本工作负载来验证 TPU 硬件,而意图驱动检查器则根据一组 “符合规格 ”的黄金阈值来验证物理级硬件指标。前者广泛覆盖硬件和软件组件,包括与底层芯片和 ICI 交互的 TPU 驱动程序、固件和 libtpunet;后者可检测不太明显的问题,如不达标的链路质量指标。如果预检查失败,borglet 会向 Borg Prime 指示应重新安排任务。

    +

    在线 ICI 链路修复

    +

    对于 TPUv4,可在线进行 ICI 链路修复,在链路两端自动协调,以便可靠地验证恢复情况。两个端点可以跨越两台不同的机器,或一台机器和一台 OCS 交换机。Pod 管理器通过 ICI 链路耗尽来协调所有 ICI 网络维护。虽然 TPU 计算资源不会受到影响(也就是说,只要不使用损坏的 ICI,作业仍可在 TPU 机器上执行),但 ICI 链接耗尽时,用户应用程序将自动被排除在外。

    `;export{i as assetURLs,b as default,T as metadata,U as toc}; diff --git a/zh-cn/assets/index-d4dfb508.js b/zh-cn/assets/index-778a40a0.js similarity index 97% rename from zh-cn/assets/index-d4dfb508.js rename to zh-cn/assets/index-778a40a0.js index c3823f7..2375385 100644 --- a/zh-cn/assets/index-d4dfb508.js +++ b/zh-cn/assets/index-778a40a0.js @@ -1,4 +1,4 @@ -const o="/zh-cn/assets/cover-85e5394f.jpg",e="/zh-cn/assets/image1-ec71eac6.webp",t=[o,e],l={label:"一封来自 DatenLord 关于GSoC 2024的挑战书",description:"Google Summer of Code 是一项全球性的在线计划,致力于将新的contributor引入开源软件开发领域。GSoC 参与者在导师的指导下,与开源组织合作开展为期 12 周以上的编程项目。今年,达坦科技入选作为开源社区组织,携CNCF Sandbox项目Xline下众多有趣、创新且有挑战性的题目参与本次活动。",cover:"./cover.jpg",location:"中国香港",date:"2024-02-29",title:"A Challenge Letter from DatenLord on GSoC 2024"},r=[{label:"为什么要参加 GSoC?",level:2},{label:"期待开源爱好者参与的项目",level:2},{label:"参与指南",level:2},{label:"活动重要时间点",level:2},{label:"联系方式",level:2}],s=`

    图片

    +const o="/zh-cn/assets/cover-85e5394f.jpg",e="/zh-cn/assets/image1-ec71eac6.webp",t=[o,e],l={label:"一封来自 DatenLord 关于GSoC 2024的挑战书",description:"Google Summer of Code 是一项全球性的在线计划,致力于将新的contributor引入开源软件开发领域。GSoC 参与者在导师的指导下,与开源组织合作开展为期 12 周以上的编程项目。今年,达坦科技入选作为开源社区组织,携CNCF Sandbox项目Xline下众多有趣、创新且有挑战性的题目参与本次活动。",cover:"./cover.jpg",location:"中国香港",date:"2024-02-29",title:"A Challenge Letter from DatenLord on GSoC 2024"},r=[{label:"为什么要参加 GSoC?",level:2},{label:"期待开源爱好者参与的项目",level:2},{label:"参与指南",level:2},{label:"活动重要时间点",level:2},{label:"联系方式",level:2}],i=`

    图片

    Google Summer of Code 是一项全球性的在线计划,致力于将新的 contributor 引入开源软件开发领域。GSoC 参与者在导师的指导下,与开源组织合作开展为期 12 周以上的编程项目。今年,达坦科技入选作为开源社区组织,携 CNCF Sandbox 项目 Xline 下众多有趣、创新且有挑战性的题目参与本次活动。
    https://summerofcode.withgoogle.com/programs/2024/organizations/datenlord-6z

    期待志同道合的,敢于挑战自我的小伙伴积极加入我们~

    @@ -57,4 +57,4 @@ GSoC 初步结果公示

    对于报名方式有任何疑问,或者对某一个项目非常感兴趣,并且想要深入了解的同学,欢迎加入 Xline Discord 进行提问或与项目导师进行进一步沟通:
    https://discord.com/invite/hqDRtYkWzm

    您也可以扫码添加小助手微信,或发邮件至info@datenlord.com 进行咨询。

    -

    图片

    `;export{t as assetURLs,s as default,l as metadata,r as toc}; +

    图片

    `;export{t as assetURLs,i as default,l as metadata,r as toc}; diff --git a/zh-cn/assets/index-75e09dc1.js b/zh-cn/assets/index-7e0a1d2c.js similarity index 94% rename from zh-cn/assets/index-75e09dc1.js rename to zh-cn/assets/index-7e0a1d2c.js index eb15614..ec6d1be 100644 --- a/zh-cn/assets/index-75e09dc1.js +++ b/zh-cn/assets/index-7e0a1d2c.js @@ -1,4 +1,4 @@ -const l="/zh-cn/assets/cover-b206ef91.jpg",t="/zh-cn/assets/image1-e0f43926.jpg",a="/zh-cn/assets/image2-d20c4e0b.jpg",e="/zh-cn/assets/image1-50beaba8.png",o=[l,t,a,e],i={label:"2023 hackathon攻略新鲜出炉!最后一周还不速来报名!",description:"DatenLord Hackathon 2023正式启动!达坦科技基于其跨云分布式文件系统DatenLord项目,结合AI大模型时代背景,搭建了擂台,在此正式向您发出邀约!本次大赛赛题深刻有趣,奖品丰厚多样,借此机会您不仅可以尽情施展才华、与来自全国各地优秀的青年才俊们同台PK,更将有机会与优秀的评委教师对话交流。Clock is Ticking!无需犹豫,行动起来,抓住机遇,创造奇迹!",cover:"./cover.jpg",location:"中国香港",date:"2023-12-05",title:"Ding! 2023 hackathon tips fresh from the oven! Last week to sign up before it's too late!"},n=[{label:"Hackathon2023",level:2},{label:"大赛时间线",level:3},{label:"达坦科技 DatenLord 赛题",level:2},{label:"主题",level:3},{label:"背景介绍",level:3},{label:"赛题介绍",level:3},{label:"项目目标",level:3},{label:"项目假设",level:3},{label:"评估标准",level:3},{label:"注意事项",level:3}],s=`

    图片

    +const l="/zh-cn/assets/cover-b206ef91.jpg",t="/zh-cn/assets/image1-e0f43926.jpg",e="/zh-cn/assets/image2-d20c4e0b.jpg",a="/zh-cn/assets/image1-50beaba8.png",o=[l,t,e,a],i={label:"2023 hackathon攻略新鲜出炉!最后一周还不速来报名!",description:"DatenLord Hackathon 2023正式启动!达坦科技基于其跨云分布式文件系统DatenLord项目,结合AI大模型时代背景,搭建了擂台,在此正式向您发出邀约!本次大赛赛题深刻有趣,奖品丰厚多样,借此机会您不仅可以尽情施展才华、与来自全国各地优秀的青年才俊们同台PK,更将有机会与优秀的评委教师对话交流。Clock is Ticking!无需犹豫,行动起来,抓住机遇,创造奇迹!",cover:"./cover.jpg",location:"中国香港",date:"2023-12-05",title:"Ding! 2023 hackathon tips fresh from the oven! Last week to sign up before it's too late!"},n=[{label:"Hackathon2023",level:2},{label:"大赛时间线",level:3},{label:"达坦科技 DatenLord 赛题",level:2},{label:"主题",level:3},{label:"背景介绍",level:3},{label:"赛题介绍",level:3},{label:"项目目标",level:3},{label:"项目假设",level:3},{label:"评估标准",level:3},{label:"注意事项",level:3}],r=`

    图片

    Hackathon2023

    DatenLord Hackathon 2023 正式启动! 达坦科技基于其跨云分布式文件系统 DatenLord 项目,结合 AI 大模型时代背景,搭建了擂台,在此正式向您发出邀约!

    本次大赛赛题深刻有趣,奖品丰厚多样,借此机会您不仅可以尽情施展才华、与来自全国各地优秀的青年才俊们同台 PK,更将有机会与优秀的评委教师对话交流。Clock is Ticking!无需犹豫,行动起来,抓住机遇,创造奇迹!

    @@ -50,7 +50,7 @@ const l="/zh-cn/assets/cover-b206ef91.jpg",t="/zh-cn/assets/image1-e0f43926.jpg" 报名链接:
    https://www.wjx.cn/vm/rm8zjUu.aspx#
    报名二维码:

    -

    图片

    +

    图片

    如有任何问题欢迎联系达坦科技微信小助手:DatenLord_Tech或发送邮件至 info@datenlord.com

    -

    图片

    `;export{o as assetURLs,s as default,i as metadata,n as toc}; +

    图片

    `;export{o as assetURLs,r as default,i as metadata,n as toc}; diff --git a/zh-cn/assets/index-d9f0be8c.js b/zh-cn/assets/index-821ce5ea.js similarity index 97% rename from zh-cn/assets/index-d9f0be8c.js rename to zh-cn/assets/index-821ce5ea.js index c8a184e..00460ae 100644 --- a/zh-cn/assets/index-d9f0be8c.js +++ b/zh-cn/assets/index-821ce5ea.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/cover-6865ae02.png",l="/zh-cn/assets/image1-1421d5c3.png",t="/zh-cn/assets/image2-03115587.png",a="/zh-cn/assets/image3-8a8d1c33.png",i="/zh-cn/assets/image4-c1593056.png",s=[e,l,t,a,i],p={label:"Xline 源码解读(一) —— 初识 CURP 协议",description:"Xline 是一款开源的分布式 KV 存储引擎,其核心目的是实现高性能的跨数据中心强一致性,提供跨数据中心的meatdata 管理。那么 Xline 是怎么实现这种高性能的跨数据中心强一致性的呢?这篇文章就将带领大家一起来一探究竟。",cover:"./cover.png",location:"中国香港",author:["赵佳炜"],tags:["Xline"],date:"2023-07-13",title:"Interpretation of Xline source code (1)——Introduction to CURP protocol"},n=[{label:"Xline 是什么",level:2},{label:"Xline 的整体架构",level:2},{label:"CURP 协议简介",level:2},{label:"CURP 是什么?",level:3},{label:"为什么选择 CURP 协议",level:3},{label:"fast path 与 slow path",level:3},{label:"Summary",level:2}],r=`

    封面

    +const e="/zh-cn/assets/cover-6865ae02.png",l="/zh-cn/assets/image1-1421d5c3.png",t="/zh-cn/assets/image2-03115587.png",i="/zh-cn/assets/image3-8a8d1c33.png",a="/zh-cn/assets/image4-c1593056.png",n=[e,l,t,i,a],s={label:"Xline 源码解读(一) —— 初识 CURP 协议",description:"Xline 是一款开源的分布式 KV 存储引擎,其核心目的是实现高性能的跨数据中心强一致性,提供跨数据中心的meatdata 管理。那么 Xline 是怎么实现这种高性能的跨数据中心强一致性的呢?这篇文章就将带领大家一起来一探究竟。",cover:"./cover.png",location:"中国香港",author:["赵佳炜"],tags:["Xline"],date:"2023-07-13",title:"Interpretation of Xline source code (1)——Introduction to CURP protocol"},p=[{label:"Xline 是什么",level:2},{label:"Xline 的整体架构",level:2},{label:"CURP 协议简介",level:2},{label:"CURP 是什么?",level:3},{label:"为什么选择 CURP 协议",level:3},{label:"fast path 与 slow path",level:3},{label:"Summary",level:2}],r=`

    封面

    Xline 是什么

    Xline 是一款开源的分布式 KV 存储引擎,其核心目的是实现高性能的跨数据中心强一致性,提供跨数据中心的 meatdata 管理。那么 Xline 是怎么实现这种高性能的跨数据中心强一致性的呢?这篇文章就将带领大家一起来一探究竟。

    Xline 的整体架构

    @@ -30,7 +30,7 @@ const e="/zh-cn/assets/cover-6865ae02.png",l="/zh-cn/assets/image1-1421d5c3.png"
  • leader 统计所收到的成功响应的数量,如果超过集群节点数量的一半以上,则认为共识已达成,提案成功,否则认为提案失败,并将结果返回给 client。
  • 下图是 Multi-Paxos 协议达成共识的一个时序流程:

    -

    图片

    +

    图片

    在这个时序图中,我们可以了解到 Multi-Paxos 协议达成共识的流程:

    1. client 向 leader 发起一个提案请求。
    2. @@ -46,7 +46,7 @@ const e="/zh-cn/assets/cover-6865ae02.png",l="/zh-cn/assets/image1-1421d5c3.png"

      那读者可能就会有疑问了,这里面的冲突究竟指的是什么呢?让我们用简单的 KV 操作来举个例子。在分布式系统的节点上,我们对状态机所做的操作无非就是读和写,在考虑对状态机的并发操作的情况下,总共可以有读后读,读后写,写后读,写后写四种场景。显然,对于读后读这种无副作用的只读操作而言,任何情况下都不存在冲突,无论是先读还是后读,最终读出来的结果总是一致的。当操作不同的 Key 时,例如 PUT A=1, PUT B=2,那么对于状态机的最终状态而言,不论是先执行 PUT A=1,再执行 PUT B=2,还是反过来,最终从状态机上读出来的结果都是 A=1,B=2。读写混合的场景也是同理,因此当对状态机并发执行的多个操作之间的 key 不存在交集时,我们称这些操作都是无冲突的。反之,如果并发多个操作之间包含了至少一个写操作,同时其操作的 Key 存在交集,这些操作都是冲突的。

      fast path 与 slow path

      那么 CURP 是如何实现 fast path 和 slow path 的呢?下图是 CURP 算法中集群拓扑的一个简图

      -

      图片

      +

      图片

      让我们先来看看这张图中都有哪些内容:

      1. Client:向集群发起请求的 client。
      2. @@ -77,4 +77,4 @@ b. follower 接收到请求后,由于 z = 9 与 witness 中的 z = 7 相冲突

        Xline 是一款提供跨数据中心强一致性的分布式 KV 存储,其核心问题之一便是如何在跨数据中心这种高延迟的广域网环境中提供高性能的强一致性保证。传统的分布式共识算法,如 Raft 和 Multi-Paxos,通过让所有操作都满足持久化存储和有序性前提来保证状态机一致性。而 CURP 协议则是对达成共识的场景做了更细粒度的划分,将协议分割成了前端(fast path)和后端(slow path),前端只保证了提案会被持久化到集群当中,而后端不仅保证了持久化,也保证了所有保存了该提案的节点会按照相同的顺序执行命令,保证了状态机的一致性。

        关于 CURP 协议的简介就到这里,更多的细节欢迎参考我们的其他文章和分享,如下:
        Curp 共识协议的重新思考

        -

        DatenLord | Xline Geo-distributed KV Storage

        `;export{s as assetURLs,r as default,p as metadata,n as toc}; +

        DatenLord | Xline Geo-distributed KV Storage

        `;export{n as assetURLs,r as default,s as metadata,p as toc}; diff --git a/zh-cn/assets/index-1ea2a101.js b/zh-cn/assets/index-85fa6207.js similarity index 96% rename from zh-cn/assets/index-1ea2a101.js rename to zh-cn/assets/index-85fa6207.js index 3ea9a0f..0272c47 100644 --- a/zh-cn/assets/index-1ea2a101.js +++ b/zh-cn/assets/index-85fa6207.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/image1-145af1bc.png",a="/zh-cn/assets/image2-b5b0ee19.png",p="/zh-cn/assets/image3-204919ac.png",l="/zh-cn/assets/image4-e50f112d.png",t="/zh-cn/assets/image5-cdb8d1de.png",i=[e,a,p,l,t],o={label:"数据库隔离级别及MVCC",description:"数据库在同时处理多个事务时需要决定事务之间能否看到对方的修改,能看到多少等等。根据隔离的严格程度,从严到松可以分为 Serializable, Repeatable reads, Read committed, Read uncommitted。我们用下面这个 KV 存储的例子来解释这四个隔离级别。KV 存储的初始状态如下:",location:"中国香港",tags:["Xline"],date:"2023-02-16",title:"Database isolation level and MVCC"},n=[{label:"数据库隔离级别介绍",level:2},{label:"Read uncommitted",level:3},{label:"Repeatable read",level:3},{label:"Serializable",level:3},{label:"Snapshot 隔离级别及 MVCC",level:2},{label:"一点联想",level:2},{label:"总结",level:2}],s=`

        数据库隔离级别介绍

        +const e="/zh-cn/assets/image1-145af1bc.png",a="/zh-cn/assets/image2-b5b0ee19.png",t="/zh-cn/assets/image3-204919ac.png",l="/zh-cn/assets/image4-e50f112d.png",p="/zh-cn/assets/image5-cdb8d1de.png",i=[e,a,t,l,p],n={label:"数据库隔离级别及MVCC",description:"数据库在同时处理多个事务时需要决定事务之间能否看到对方的修改,能看到多少等等。根据隔离的严格程度,从严到松可以分为 Serializable, Repeatable reads, Read committed, Read uncommitted。我们用下面这个 KV 存储的例子来解释这四个隔离级别。KV 存储的初始状态如下:",location:"中国香港",tags:["Xline"],date:"2023-02-16",title:"Database isolation level and MVCC"},o=[{label:"数据库隔离级别介绍",level:2},{label:"Read uncommitted",level:3},{label:"Repeatable read",level:3},{label:"Serializable",level:3},{label:"Snapshot 隔离级别及 MVCC",level:2},{label:"一点联想",level:2},{label:"总结",level:2}],s=`

        数据库隔离级别介绍

        数据库在同时处理多个事务时需要决定事务之间能否看到对方的修改,能看到多少等等。根据隔离的严格程度,从严到松可以分为 Serializable, Repeatable reads, Read committed, Read uncommitted。我们用下面这个 KV 存储的例子来解释这四个隔离级别。KV 存储的初始状态如下:

        Table 1:

        图片

        @@ -8,7 +8,7 @@ const e="/zh-cn/assets/image1-145af1bc.png",a="/zh-cn/assets/image2-b5b0ee19.png

        图片

        在 Read uncommitted 的隔离级别中,多个同时执行的事务是能够互相看到互相没有 commit 的写操作,因此可以认为这种隔离级别几乎没有作用。在上述例子中,Operation 2 读到的内容是 “AA”,Operation 4 读到的内容则是“DD”,即使第二个事务最终 Rollback 了。Read committed 有两个事务同时被执行,自上而下是执行顺序。

        Table 3:

        -

        图片

        +

        图片

        在 Read committed 的隔离级别中,只有被 Commit 后的结果可以被看到,因此在 Table 2 的执行顺序中,Operation 2 和 4 都能够读取到 “AA” 的值,即 Key 1 的值没有改变。如果按照 Table 3 中的情况执行两个事务,Operation 2 读到的值为 “AA”,Operation 5 读到的值为 “DD”,因为此时事务 2 已经执行成功。

        Repeatable read

        如果在 Table 3 中的事务 1 两次连续读操作,用户想要保证读到相同的值,那就需要使用 repeatable read 隔离级别。在这个隔离级别中,在同一个事务中对同一条数据的多次读取保证会得到相同的值,即使这个过程中该数据被其他已经提交的事务修改掉。当然该隔离级别也有一些情况无法保证隔离性,比如下列情况:

        @@ -20,7 +20,7 @@ const e="/zh-cn/assets/image1-145af1bc.png",a="/zh-cn/assets/image2-b5b0ee19.png

        Snapshot 隔离级别及 MVCC

        想要区分最严格的 Serializable 和 Snapshot,我们还是从例子来看,看下列两个事务的操作:

        Table 5:

        -

        图片

        +

        图片

        如果按照严格的 Serializable 的隔离级别,无论 Transaction 1 和 2 哪个先执行,最终 Key 1 和 2 的值都是相同的,有可能是 “AA”, 也有可能是 “BB”。但是在 Snapshot 的级别下执行,执行结果则是 Key 1 和 2 的值进行互换。很明显在这种情况下 Snapshot 的隔离能力明显更弱。Isolation 对于存在读写交集的事务的先后顺序无能为力,只能保证存在写冲突的事务间的先后顺序。

        上述例子中,我们虽然具体地看了 Snapshot 隔离级别和 Serializable 之间的差异,但是我们还没有完整介绍过 Snapshot 的特性:

          @@ -43,4 +43,4 @@ const e="/zh-cn/assets/image1-145af1bc.png",a="/zh-cn/assets/image2-b5b0ee19.png

          本文为大家介绍了数据库的四种隔离级别,分别用例子介绍了不同隔离级别之间的区别。然后详细介绍了 Snapshot 这个使用最广泛的隔离级别,并且说明了其最长用的实现方式 MVCC。最后结合了 MVCC 和 无锁数据结构的内存管理机制进行了对比和探讨。

          达坦科技 Xline 项目专注于跨云元数据管理 KV 存储,并且目前正在实践应用 MVCC 做数据库隔离。如果您想了解更多相关信息,请参考 Xline GitHub 链接:
          https://github.com/datenlord/Xline

          -

          本周次条是 Xline 最新版本的发布,请阅读《Xline v.0.2.0:一个用于元数据管理的分布式 KV 存储》。

          `;export{i as assetURLs,s as default,o as metadata,n as toc}; +

          本周次条是 Xline 最新版本的发布,请阅读《Xline v.0.2.0:一个用于元数据管理的分布式 KV 存储》。

          `;export{i as assetURLs,s as default,n as metadata,o as toc}; diff --git a/zh-cn/assets/index-dfd283a0.js b/zh-cn/assets/index-8cb22688.js similarity index 95% rename from zh-cn/assets/index-dfd283a0.js rename to zh-cn/assets/index-8cb22688.js index 3bca56e..067cc07 100644 --- a/zh-cn/assets/index-dfd283a0.js +++ b/zh-cn/assets/index-8cb22688.js @@ -1,4 +1,4 @@ -const l="/zh-cn/assets/image1-50beaba8.png",a=[l],n={label:"2023年SpinalHDL应用前景探索线上研讨会----征集演讲嘉宾",description:"SpinalHDL是一种开源的高级硬件描述语言,它可以作为VHDL或Verilog的替代,Charles Papon 在2014年创建后,伴随着数年来开源硬件设计的蓬勃发展,在多方面显露出优势,譬如:它专注于高效的硬件描述,而不是事件驱动;作为一种基于Scala的DSL,能够借助现有的Scala语言特性和开发工具提供强大、易用、高效的硬件设计能力。",location:"中国香港",date:"2023-11-09",title:"Exploring the Future of SpinalHDL Applications in 2023 Online Workshop"},p=[{label:"SpinalHDL 是什么?",level:2},{label:"达坦科技是谁?",level:2},{label:"为什么达坦科技要推广 SpinalHDL?",level:2},{label:"Call For Presenter",level:2}],i=`

          SpinalHDL 是什么?

          +const l="/zh-cn/assets/image1-50beaba8.png",a=[l],n={label:"2023年SpinalHDL应用前景探索线上研讨会----征集演讲嘉宾",description:"SpinalHDL是一种开源的高级硬件描述语言,它可以作为VHDL或Verilog的替代,Charles Papon 在2014年创建后,伴随着数年来开源硬件设计的蓬勃发展,在多方面显露出优势,譬如:它专注于高效的硬件描述,而不是事件驱动;作为一种基于Scala的DSL,能够借助现有的Scala语言特性和开发工具提供强大、易用、高效的硬件设计能力。",location:"中国香港",date:"2023-11-09",title:"Exploring the Future of SpinalHDL Applications in 2023 Online Workshop"},i=[{label:"SpinalHDL 是什么?",level:2},{label:"达坦科技是谁?",level:2},{label:"为什么达坦科技要推广 SpinalHDL?",level:2},{label:"Call For Presenter",level:2}],p=`

          SpinalHDL 是什么?

          SpinalHDL 是一种开源的高级硬件描述语言,它可以作为 VHDL 或 Verilog 的替代,Charles Papon 在 2014 年创建后,伴随着数年来开源硬件设计的蓬勃发展,在多方面显露出优势,譬如:它专注于高效的硬件描述,而不是事件驱动;作为一种基于 Scala 的 DSL,能够借助现有的 Scala 语言特性和开发工具提供强大、易用、高效的硬件设计能力。

          达坦科技是谁?

          达坦科技(DatenLord)致力于打造高性能跨云存储,其通过软硬件深度融合的方式打破云之间的壁垒,实现高性能跨云数据访问,提供海量异地、异构数据的统一存储访问机制,为云上应用提供高性能安全存储支持。

          @@ -18,4 +18,4 @@ const l="/zh-cn/assets/image1-50beaba8.png",a=[l],n={label:"2023年SpinalHDL应

          如您有意向社区,以及 SpinalHDL 的爱好者做分享,请于 2023 年 11 月 30 日之前,直接将姓名(或 GitHub 昵称)+ 议题摘要提交至以下 GitHub 链接:
          https://github.com/SpinalHDL/SpinalHDL/discussions/1235

          图片

          -

          对开源硬件感兴趣的朋友可以添加达坦科技小助手微信加入达坦科技硬件群。

          `;export{a as assetURLs,i as default,n as metadata,p as toc}; +

          对开源硬件感兴趣的朋友可以添加达坦科技小助手微信加入达坦科技硬件群。

          `;export{a as assetURLs,p as default,n as metadata,i as toc}; diff --git a/zh-cn/assets/index-8cea61b2.js b/zh-cn/assets/index-8cea61b2.js new file mode 100644 index 0000000..8c44982 --- /dev/null +++ b/zh-cn/assets/index-8cea61b2.js @@ -0,0 +1,48 @@ +const p="/zh-cn/assets/cover-b2241eaf.png",e=[p],t={label:"Xline v0.7.0: 一个用于元数据管理的分布式KV存储",description:"Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。Curp 协议可以在命令不冲突的情况下减少一个RTT,从而提高性能。Xline旨在实现高性能的数据访问和跨数据中心场景下的强一致性。",location:"新疆",cover:"./image.png",author:["达坦科技"],date:"2024-08-29",title:"Xline v 0.7.0 A Distributed KV Store for Metadata Management"},a=[],o=`

          图片 +Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。

          +

          但是,当跨数据中心部署时,节点之间的延迟可能是几十或几百毫秒,此时 Raft 协议将成为性能瓶颈。Curp 协议就是为了解决这个问题而设计的。它可以在命令不冲突的情况下减少一个RTT,从而提高性能。因此,Xline旨在实现高性能的数据访问和跨数据中心场景下的强一致性。

          +

          V0.7.0版本有什么新功能?

          +

          v0.7.0新版本修复问题以及重构如下:

          +

          ⭐ 新功能

          +

          [Feature]CURP WAL (Write-Ahead-Log) 实现:我们设计了一个 Write-Ahead-Log 来保存 curp 的日志条目。

          +

          [Feature]重复数据删除:使用RIFL论文中的exactly-once语义实现命令重复数据删除。

          +

          [Feature]:快照恢复 #630

          +

          [Feature]:维护服务器接口#543

          +

          [Feature]:支持使用 tls 运行 #328

          +

          🛠️ 重构

          +

          [Refactor]:为自动更新lock lease添加会话结构#684

          +

          [Refactor]:启动流程#629

          +

          [Refactor]:重构speculative pool的GC #439

          +

          [Refactor]:新的命令执行逻辑:我们删除了cmd workers和相关的命令执行逻辑。现在,Xline 将使用串行执行(通过批处理)来防止锁争用。

          +

          [Refactor]:Garbage Collection:我们在dedup实现的基础上重构了garbage collection logic。

          +

          [Refactor]:客户端Proposal优化:我们重构了 curp 客户端,以使用 gRPC 流向集群发送提议。这降低了 gRPC 服务器的负载并提高了整体性能。

          +

          [Refactor]:冲突检测:我们删除了冲突检查的 mpmc。现在Xline将使用conflict pools(speculative pool和uncommitted pool)来检测命令冲突。

          +

          [Refactor]:Read Index:我们实现了 Raft 论文中的 Read Index 机制,用于只读命令。替换了之前的读取状态实现。

          +

          [Refactor]:xline-client 重构:我们为 xline-client crate 切换到更直观的用户界面。

          +

          [Refactor]:各种性能优化

          +

          🪲 错误修复

          +

          [Bug]:实现 ReadIndex #870

          +

          [etcdapi] [Bug]:重复revision #848

          +

          [Bug]:测试用例 curp::it server::shutdown_rpc_should_shutdown_the_cluster 失败 #774

          +

          [Bug]:Xline 在使用watch功能时会丢失事件#677

          +

          [Bug]:xlinectl 不会续订锁定密钥的lease #664

          +

          [Bug]:无法将新成员node4添加到三节点xline集群#661

          +

          [Refactor]:revision生成期间的只读命令#502

          +

          [Bug]:在读取状态期间执行时读取不同的值#501

          +

          [Bug]:sync txn 请求未按照子请求的顺序执行 #498

          +

          [Bug]:读取状态#497

          +

          [Bug]:revision生成#491、#848

          +

          [Bug]:单个 txn 中的请求不按顺序执行 #471

          +

          [Bug]:raw_curp中的batch_index最终会溢出#368

          +

          [Bug]:修复 GC 可能会破坏 CURP 持久性的问题 #159

          +

          ✍️已知问题

          +

          在基准测试期间,如果集群处于高负载下,集群有时可能会由于重复数据删除机制而无法取得进展。

          +

          💥 重大变化

          +

          etcd 兼容 API 现在将使用 2-RTT 操作来防止revision生成问题。

          +

          ❤️ 贡献者

          +

          我们要感谢所有参与此版本发布的贡献者!

          +

          @themanforfree

          +

          @iGxnon

          +

          @Phoenix500526

          +

          @bsbds

          +

          相关链接

          `;export{e as assetURLs,o as default,t as metadata,a as toc}; diff --git a/zh-cn/assets/index-bccae718.js b/zh-cn/assets/index-96aee43d.js similarity index 98% rename from zh-cn/assets/index-bccae718.js rename to zh-cn/assets/index-96aee43d.js index b0e677f..750a395 100644 --- a/zh-cn/assets/index-bccae718.js +++ b/zh-cn/assets/index-96aee43d.js @@ -1,4 +1,4 @@ -const p="/zh-cn/assets/image1-f1a8209b.jpg",o="/zh-cn/assets/image2-f5de5635.jpg",t=[p,o],l={label:"喷泉码浅谈",description:"喷泉码(Fountain Code)是一种在无线通信、数据传输和网络编码领域中使用的错误纠正技术。它与传统的纠错码和编码方法有所不同,喷泉码被设计用于在不确定信道条件下的高效数据传输。",location:"新疆",author:["施继成"],tags:["RDMA"],date:"2023-08-31",title:"Fountain Code"},a=[{label:"喷泉码简介",level:2},{label:"LT 编码",level:2},{label:"Raptor 算法",level:2},{label:"总结",level:2}],r=`

          喷泉码简介

          +const p="/zh-cn/assets/image1-f1a8209b.jpg",o="/zh-cn/assets/image2-f5de5635.jpg",t=[p,o],l={label:"喷泉码浅谈",description:"喷泉码(Fountain Code)是一种在无线通信、数据传输和网络编码领域中使用的错误纠正技术。它与传统的纠错码和编码方法有所不同,喷泉码被设计用于在不确定信道条件下的高效数据传输。",location:"新疆",author:["施继成"],tags:["RDMA"],date:"2023-08-31",title:"Fountain Code"},a=[{label:"喷泉码简介",level:2},{label:"LT 编码",level:2},{label:"Raptor 算法",level:2},{label:"总结",level:2}],i=`

          喷泉码简介

          **喷泉码(Fountain Code)**是一种在无线通信、数据传输和网络编码领域中使用的错误纠正技术。它与传统的纠错码和编码方法有所不同,喷泉码被设计用于在不确定信道条件下的高效数据传输。

          传统的纠错码(如海明码、RS 码等)通常需要在发送方对数据进行编码,接收方则使用相同的编码进行解码和纠错。这些方法一般具有固定的码率(Code Rate),即针对一定长度的原始数据,编码后的长度是固定的,这些方法在面对不稳定的信道或严重的信道丢失时可能效果不佳。相比之下,喷泉码通过在发送方生成随机的冗余数据,然后将其注入到原始数据中,以创造出一个“喷泉”流——相应的码率也也就不固定了。接收方可以从这个流中采样任意数量的数据包,并将它们合并以恢复原始数据。

          喷泉码的一种常见应用是在无线传感器网络中,其中网络节点之间的通信可能受到弱信号、干扰和多径传播等因素的影响。通过使用喷泉码,节点可以在较差的通信条件下实现可靠的数据传输。

          @@ -37,4 +37,4 @@ const p="/zh-cn/assets/image1-f1a8209b.jpg",o="/zh-cn/assets/image2-f5de5635.jpg

          针对 Raptor 编码的解码方式一般有两种。第一种和编码方式完全相反,首先利用 LT 编码的解码方式恢复出部分的中间编码块,然后利用固定编码的解码方式恢复出原始的数据块。第二种方式则是将上述所有的多层编码方式都变成一种矩阵运算,针对收到数据后利用矩阵的高斯消元方法解出原始的数据块。

          现有为人所熟知的 Raptor 编码主要有 RFC 5053 和 RFC 6330 RaptorQ 编码。两者的实现细节有诸多区别,但是内在的思路和上述的方法是类似的,有兴趣的读者可以进一步进行阅读和学习。

          总结

          -

          喷泉码是一种无固定码率的编码方式,其中比较著名的有 LT 编码和 Raptor 编码。LT 编码算法简单,实现也简单,但是算法效率不高。Raptor 算法结合了 LT 编码和一些固定码率编码,利用混合编码的方式实现了高效的喷泉码。

          `;export{t as assetURLs,r as default,l as metadata,a as toc}; +

          喷泉码是一种无固定码率的编码方式,其中比较著名的有 LT 编码和 Raptor 编码。LT 编码算法简单,实现也简单,但是算法效率不高。Raptor 算法结合了 LT 编码和一些固定码率编码,利用混合编码的方式实现了高效的喷泉码。

          `;export{t as assetURLs,i as default,l as metadata,a as toc}; diff --git a/zh-cn/assets/index-12e593c9.js b/zh-cn/assets/index-9a2c4ece.js similarity index 81% rename from zh-cn/assets/index-12e593c9.js rename to zh-cn/assets/index-9a2c4ece.js index 0402f08..8b67fc7 100644 --- a/zh-cn/assets/index-12e593c9.js +++ b/zh-cn/assets/index-9a2c4ece.js @@ -1,4 +1,4 @@ -const p="/zh-cn/assets/cover-39643179.png",e="/zh-cn/assets/image1-a93ba076.jpg",s="/zh-cn/assets/image2-4624885a.gif",a="/zh-cn/assets/image3-ea54df7e.jpg",t=[p,e,s,a],c={label:"直播预告 | RDMA软件接口高层封装",description:"RDMA 作为高速通信协议被数据中心广泛使用,但是因为底层接口设计得过于繁复,对使用者造成了很大的不便,因此我们使用 Rust 语言对 RDMA 进行了一层高层封装。这次分享将介绍这层封装的做法和原理。",cover:"./cover.png",location:"香港",date:"2022-05-17",title:"RDMA Software Interface High Level Package"},l=[{label:"嘉宾介绍",level:2},{label:"讨论内容",level:2},{label:"观看方式",level:2},{label:"特别鸣谢",level:2}],n=`

          嘉宾介绍

          +const s="/zh-cn/assets/cover-39643179.png",e="/zh-cn/assets/image1-a93ba076.jpg",t="/zh-cn/assets/image2-4624885a.gif",p="/zh-cn/assets/image3-ea54df7e.jpg",a=[s,e,t,p],l={label:"直播预告 | RDMA软件接口高层封装",description:"RDMA 作为高速通信协议被数据中心广泛使用,但是因为底层接口设计得过于繁复,对使用者造成了很大的不便,因此我们使用 Rust 语言对 RDMA 进行了一层高层封装。这次分享将介绍这层封装的做法和原理。",cover:"./cover.png",location:"香港",date:"2022-05-17",title:"RDMA Software Interface High Level Package"},c=[{label:"嘉宾介绍",level:2},{label:"讨论内容",level:2},{label:"观看方式",level:2},{label:"特别鸣谢",level:2}],o=`

          嘉宾介绍

          施继成

          达坦科技联合创始人兼 CTO,复旦大学软件工程本硕,师从华为基础软件首席科学家、鸿蒙实验室主任陈海波教授。擅长操作系统内核开发、分布式系统、嵌入式系统,对分布式数据一致性有钻深的研究,发表多篇操作系统内核相关论文,累计数百次引用。毕业后曾在谷歌中国、微软亚太和阿里巴巴等公司从事分布式计算和存储等相关工作。入选 2022 年度 6 氪 S 级创业者名册,荣获中国“企业工具与底层软件”领域 “36 位 36 岁以下创业者“称号。

          讨论内容

          @@ -13,8 +13,8 @@ const p="/zh-cn/assets/cover-39643179.png",e="/zh-cn/assets/image1-a93ba076.jpg"

          本次直播我们将在【腾讯会议】进行,欢迎大家观看,没时间观看直播的同学可以关注回放,会议结束后回放在阅码场官网上传,年卡阅码场会员和其他阅码场训练营专业群资深用户免费点播。

          图片

          特别鸣谢

          -

          图片

          +

          图片

          转发本文,文末留言提问、加群提问、或者现场提问,我们将赠送 1 本书,数量有限,送完为止。

          ↓ 扫码加入本次直播交流群;

          -

          图片

          -

          咨询的小伙伴,可添加小月@阅码场的微信 Linuxer2016 咨询

          `;export{t as assetURLs,n as default,c as metadata,l as toc}; +

          图片

          +

          咨询的小伙伴,可添加小月@阅码场的微信 Linuxer2016 咨询

          `;export{a as assetURLs,o as default,l as metadata,c as toc}; diff --git a/zh-cn/assets/index-9cd4971b.js b/zh-cn/assets/index-9cd4971b.js deleted file mode 100644 index 056e5a9..0000000 --- a/zh-cn/assets/index-9cd4971b.js +++ /dev/null @@ -1,82 +0,0 @@ -const e="/zh-cn/assets/cover-07c14bd5.jpg",s="/zh-cn/assets/image1-c15bea92.png",a=[e,s],n={label:"DatenLord | Xline Geo-distributed KV Storage",description:"随着分布式业务从单数据中心向多数据中心发展,多地多活部署的需求也越来越普遍。这带来最大的挑战就是跨数据中心跨地域的metadata管理,metadata对数据的稳定性和强一致性有极高要求。在单数据中心场景下,metadata的管理已经有很多成熟的解决方案,etcd就是其中的佼佼者,但是在多数据中心场景下,etcd的性能受Raft共识协议的限制,它的性能和稳定性都大打折扣。DatenLord作为高性能跨云跨数据中心的存储,对metadata管理有了跨云跨数据中心的要求。DatenLord目前使用etcd作为metadata的管理引擎,但是考虑到etcd无法完全满足DatenLord的跨云跨数据中心的场景,我们决定实现自己的metadata管理引擎。Xline应运而生,Xline是一个分布式的KV存储,用来管理少量的关键性数据,并在跨云跨数据中心的场景下仍然保证高性能和数据强一致性。考虑到兼容性问题,Xline会兼容etcd接口,让用户使用和迁移更加流畅。",cover:"./cover.jpg",location:"新加坡",author:["潘政"],tags:["Xline"],date:"2022-08-11",title:"DatenLord | Xline Geo distributed KV Storage"},o=[{label:"简介和背景",level:2},{label:"Xline 的架构",level:2},{label:"Xline 的核心:CURP 共识协议",level:2},{label:"Storage 和 Revision",level:2},{label:"CURP 共识协议带来的挑战",level:2},{label:"解决方案",level:2},{label:"总结",level:2},{label:"推荐阅读",level:2}],l=`

          图片

          -

          简介和背景

          -

          随着分布式业务从单数据中心向多数据中心发展,多地多活部署的需求也越来越普遍。这带来最大的挑战就是跨数据中心跨地域的 metadata 管理,metadata 对数据的稳定性和强一致性有极高要求。在单数据中心场景下,metadata 的管理已经有很多成熟的解决方案,etcd 就是其中的佼佼者,但是在多数据中心场景下,etcd 的性能受 Raft 共识协议的限制,它的性能和稳定性都大打折扣。DatenLord 作为高性能跨云跨数据中心的存储,对 metadata 管理有了跨云跨数据中心的要求。DatenLord 目前使用 etcd 作为 metadata 的管理引擎,但是考虑到 etcd 无法完全满足 DatenLord 的跨云跨数据中心的场景,我们决定实现自己的 metadata 管理引擎。Xline 应运而生,Xline 是一个分布式的 KV 存储,用来管理少量的关键性数据,并在跨云跨数据中心的场景下仍然保证高性能和数据强一致性。考虑到兼容性问题,Xline 会兼容 etcd 接口,让用户使用和迁移更加流畅。

          -

          Xline 的架构

          -

          图片

          -
            -
          • Xline 的架构主要分为 RPC server,KV server,其他 server,CURP 共识协议模块和 Storage 模块
          • -
          • RPC server:主要负责接受用户的请求并转发到相应的模块进行处理,并回复用户请求。
          • -
          • KV server 和其他 server:主要业务逻辑模块,如处理 KV 相关请求的 KV server,处理 watch 请求的 watch server 等。
          • -
          • CURP 共识协议模块: 采用 CURP 共识协议,负责对用户的请求进行仲裁,保证数据强一致性。
          • -
          • Storage:存储模块,存储了 key value 的相关信息。
          • -
          -

          一次写请求的操作流程如下:

          -
            -
          • RPC server 接收到用户写请求,确定是 KV 操作,将请求转发到 KV server。
          • -
          • KV server 做基本请求做验证,然后将请求封装为一个 proposal 提交给 CURP 模块。
          • -
          • CURP 模块执行 CURP 共识协议,当达成共识后,CURP 模块会调用 Storage 模块提供的 callback 将写操作持久化到 Storage 中。最后通知 KV server 写请求已经 commit。
          • -
          • KV server 得知请求已经被 commit,就会封装请求回复,并通过 RPC server 返回给用户。
          • -
          -

          Xline 的核心:CURP 共识协议

          -

          CURP 共识协议的细节介绍请参考 DatenLord | Curp 共识协议的重新思考。CURP 协议的优势是将非冲突的 proposal 达成共识所需要的 RTT 从 2 个降为 1,对于冲突的 proposal 仍然需要两个 RTT,而 etcd 等主流分布式系统采用的 Raft 协议在任何情况下都需要两个 RTT。从两个 RTT 降为一个 RTT 所带来的性能提升在单数据中心场景下体现的并不明显,但是在多数据中心或者跨云场景下,RTT 一般在几十到几百 ms 的数量级上,这时一个 RTT 的性能提升则相当明显。

          -

          Storage 和 Revision

          -

          Xline 作为一个兼容 etcd 接口的分布式 KV 存储,etcd 重要的 revision 特性需要完全兼容。简单介绍一下 etcd 的 revision 特性,etcd 维护了一个全局单调递增的 64bit 的 revision,每当 etcd 存储的内容发生改变,revision 就会加一,也就是说每一次修改操作就会对应一个新的 revision,旧的 revision 不会立马删除,会按需延时回收。一个简单的例子,两个写操作 A -> 1,A -> 2,假设最初的 revision 是 1,etcd 会为 A = 1 生成 revision 2,为 A = 2 生成 revision 3。revision 的设计使 etcd 对外提供了更加丰富的功能,如支持历史 revision 的查找,如查询 revision 是 2 的时候 A 的值,通过比较 revision 可以得到修改的先后顺序等。以下是 etcd 对一个 KeyValue 的 proto 定义

          -
          message KeyValue {
          -  bytes key = 1;
          -  int64 create_revision = 2;
          -  int64 mod_revision = 3;
          -  int64 version = 4;
          -  bytes value = 5;
          -  int64 lease = 6;
          -}
          -
          -

          一个 KeyValue 关联了三个版本号,

          -
            -
          • create_revision: 该 key 被创建时的 revision
          • -
          • mod_revision:该 key 最后一次被修改时候的 revision
          • -
          • version:该 key 在最近一次被创建后经历了多少个版本,每一次修改 version 会加一
          • -
          -

          因为需要支持 revision 特性,Xline 的 Storage 模块参考了 etcd 的设计,分为 Index 和 DB 两个子模块。Index 模块存储的是一个 key 到其对应的所有 revision 数组的 mapping,因为需要支持范围查找,Index 采用了 BTreeMap,并会放在内存中。DB 模块存储的是从 revision 到真实 KeyValue 的 mapping,因为有持久化和存储大量的历史 revision 的数据的需求,DB 模块会将数据存到磁盘(目前 prototype 阶段 DB 仍然存在内存当中,在未来会对接持久化的 DB)。那么一次查找流程是先从 Index 中找到对应的 key,然后找到需要的 revision,再用 revision 作为 key 到 DB 中查找 KeyValue 从而拿到完整数据。这样的设计可以支持历史 revision 的存取,分离 Index 和 DB 可以将 Index 放在内存当中加速存取速度,并且可以利用 revision 的存储特性即每一次修改都会产生一个新的 revision 不会修改旧的 revision,可以方便 DB 实现高并发读写。

          -

          CURP 共识协议带来的挑战

          -

          CURP 协议的全称是 Consistent Unordered Replication Protocal。从名字可以看出 CURP 协议是不保证顺序的,什么意思呢?比如两条不冲突的 proposal,A -> 1,B-> 2,在 CURP 协议中,因为这两条 proposal 是不冲突的,所以它们可以并发乱序执行,核心思想是执行的顺序并不会影响各个 replica 状态机的最终状态,不会影响一致性。这也是 CURP 协议用一个 RTT 就可以达成共识的关键。但是对于冲突的 proposal,如 A -> 1, A -> 2,CURP 协议就需要一个额外的 RTT 来确定这两条 proposal 的执行顺序,否则在各个 replica 上 A 最终的值会不一样,一致性被打破。

          -

          解决方案

          -

          解决这个问题的思路是将达成共识和确定顺序即 revision 分成两个阶段,即通过一个 RTT 来达成共识,这时候就可以返回用户请求已经 commit,然后再通过一个异步的 RTT 来确定请求的 revision。这样既可以保证一个 RTT 就可以达成共识并返回给用户,又可以保证为每一个修改请求生成全局统一的 revision。确定 revision 用异步 batching 的方式来实现,这一个额外的 RTT 会平摊到一段时间内的所有请求上并不会影响系统的性能。

          -

          Storage 模块会实现如下两个 callback 接口供 CURP 模块调用,execute() 会在共识达成后调用,通知 proposal 可以执行了,after_sync() 会在 proposal 的顺序确定下来后再调用,以通知 proposal 的顺序,after_sync() 接口会按照确定好的 proposal 顺序依次调用。

          -
          /// Command executor which actually executes the command.
          -/// It usually defined by the protocol user.
          -#[async_trait]
          -pub trait CommandExecutor<C>: Sync + Send + Clone + std::fmt::Debug
          -where
          -    C: Command,
          -{
          -    /// Execute the command
          -    async fn execute(&self, cmd: &C) -> Result<C::ER, ExecuteError>;
          -
          -    /// Execute the after_sync callback
          -    async fn after_sync(&self, cmd: &C, index: LogIndex) -> Result<C::ASR, ExecuteError>;
          -}
          -
          -

          为了配合 CURP 模块的两阶段操作,Storage 模块的设计如下:

          -
          /// KV store inner
          -#[derive(Debug)]
          -struct KvStoreInner {
          -    /// Key Index
          -    index: Index,
          -    /// DB to store key value
          -    db: DB,
          -    /// Revision
          -    revision: Mutex<i64>,
          -    /// Speculative execution pool. Mapping from propose id to request
          -    sp_exec_pool: Mutex<HashMap<ProposeId, Vec<Request>>>,
          -}
          -
          -

          execute() 回调被调用时,修改 Request 会被预执行并存到 sp_exec_pool 中,它存储了 ProposeId 到具体 Request 的 mapping,这个时候该操作的 revision 并没有确定,但是可以通知用户操作已经 commit,此时只需一个 RTT。当操作顺序被确定后,after_sync() 会被调用,Storage 模块会从 sp_exec_pool 找到对应的 Request 并将它持久化,并把全局 revision 加 1 作为该操作的 revision。

          -

          接下来我们用一次写请求 A -> 1 和一次读请求 Read A 来讲解整个流程。假设当前的 revision 是

          -
            -
          1. 当 KV server 请求收到写请求,它会生成一个 proposal 发给 CURP 模块,CURP 模块通过一个 RTT 达成共识后会调用 execute() callback 接口,Storage 模块会将该请求放到 sp_exec_pool 中,这时候 CURP 模块会通知 KV server 请求已经 commit,KV server 就会返回给用户说操作已完成。同时 CURP 会异步的用一个额外的 RTT 来确定该写请求的顺序后调用 after_sync() callback 接口,Storage 会把全局 revision 加 1,然后从 sp_exec_pool 中讲写请求读出来并绑定 revision
          2. -
          3. 然后更新 Index 并持久化到 DB 当中,这时候 DB 存储的内容是 revision 2:{key: A, value:1, create_revision: 2, mod_revision: 2, version: 1}。当读请求到达时,就可以从 Storage 模块中读到 A = 1,并且 create_revision = 2,mod_revision = 2。
          4. -
          -

          总结

          -

          本文主要介绍了 Geo-distributed KV Storage Xline 的架构设计,以及为了兼容 etcd 的 revision 特性,我们对 CURP 共识协议和 Storage 模块做的设计,从而实现了在跨数据中心跨地域场景下的高性能分布式 KV 存储。详细代码请参考https://github.com/datenlord/Xline,欢迎大家来讨论。

          -

          推荐阅读

          -

          Etcd 客户端缓存实践

          `;export{a as assetURLs,l as default,n as metadata,o as toc}; diff --git a/zh-cn/assets/index-9e32b6fa.js b/zh-cn/assets/index-9e32b6fa.js new file mode 100644 index 0000000..74b2d24 --- /dev/null +++ b/zh-cn/assets/index-9e32b6fa.js @@ -0,0 +1,23 @@ +const t="/zh-cn/assets/cover-5856255d.png",o="/zh-cn/assets/image1-a156153e.png",s="/zh-cn/assets/image2-b0a4a464.png",n="/zh-cn/assets/image3-bf4f8777.png",r="/zh-cn/assets/image-d0c27c17.png",e=[t,o,s,n,r],a={label:"2024 RISC-V中国峰会同期活动预告 l 硬件敏捷开发与验证方法学研讨会",description:"2024 RISC-V 中国峰会将于8月19日至25日在杭州黄龙饭店隆重举行。峰会采用“主会议+技术研讨会+展览展示+同期活动”的创新形式,将有超过20场同期活动在8月19日至25日期间同步进行。RISC-V 中国峰会至今已成功举办四届,现已成为中国大陆规格最高、规模最大、影响力最强的专业会议之一。作为本届RISC-V中国峰会的同期活动,8月22日上午,达坦科技将举办第三届硬件敏捷开发与验证方法学研讨会。",cover:"./cover.png",location:"新疆",date:"2024-08-16",title:"RISC V China Summit Simultaneous Event Preview l Hardware Agile Development and Verification Methodology Seminar"},g=[{label:"活动信息",level:2}],i=`

          图片 +2024 RISC-V中国峰会 +2024 RISC-V 中国峰会将于8月19日至25日在杭州黄龙饭店隆重举行。峰会采用“主会议+技术研讨会+展览展示+同期活动”的创新形式,将有超过20场同期活动在8月19日至25日期间同步进行。 +RISC-V 中国峰会至今已成功举办四届,现已成为中国大陆规格最高、规模最大、影响力最强的专业会议之一。作为本届RISC-V中国峰会的同期活动,8月22日上午,达坦科技将举办第三届硬件敏捷开发与验证方法学研讨会。 +在数字化转型浪潮的推动下,数字芯片作为信息技术的核心载体,其设计与验证的复杂度与日俱增,市场竞争亦趋于白热化。面对这一挑战,如何有效提升数字芯片的开发与验证效率,成为了摆在整个行业面前的重大课题。传统基于Verilog、SystemVerilog、VHDL及UVM的设计与验证方法虽已根深蒂固,但面对新时代的需求,其局限性日益凸显。

          +

          近年来,一股新兴力量正悄然改变着这一现状——以Chisel、SpinalHDL为代表的新一代硬件描述语言(HDL)以及Cocotb、pyuvm等新一代验证框架的崛起,为数字芯片的设计与验证领域注入了新的活力。这些新兴技术不仅在语法表达、代码简洁性及错误检查等方面展现出显著优势,更重要的是,它们为硬件敏捷设计与验证开辟了全新的路径,为业界带来了前所未有的灵活性和效率提升。

          +

          为了深入探讨这一领域的最新进展,促进技术交流与创新,本次研讨会特邀来自顶尖学术机构与科研前沿的几位专家,共同分享他们在硬件敏捷设计与验证方面的实践经验与前沿思考 +图片

          +

          活动信息

          +

          活动时间: 2024年8月22日,上午9:30-11:45

          +

          活动地点:杭州黄龙饭店 珍珠厅1

          +

          观众报名链接: +图片 +第二届硬件敏捷开发与方法学研讨会 l 2023 RISC-V中国峰会同期活动顺利举办 +图片 +达坦科技始终致力于打造高性能 Al+ Cloud 基础设施平台,积极推动 AI 应用的落地。达坦科技通过软硬件深度融合的方式,提供高性能存储和高性能网络。为 AI 应用提供弹性、便利、经济的基础设施服务,以此满足不同行业客户对 AI+Cloud 的需求。

          +

          公众号: 达坦科技DatenLord

          +

          DatenLord官网: https://datenlord.github.io/zh-cn/

          +

          知乎账号: https://www.zhihu.com/org/da-tan-ke-ji

          +

          B站: https://space.bilibili.com/2017027518

          +

          邮箱: info@datenlord.com

          +

          如果您有兴趣加入达坦科技Rust前沿技术交流群或硬件相关的群 ,请添加小助手微信:DatenLord_Tech +图片

          `;export{e as assetURLs,i as default,a as metadata,g as toc}; diff --git a/zh-cn/assets/index-9ef15c87.js b/zh-cn/assets/index-9ef15c87.js new file mode 100644 index 0000000..71ffb21 --- /dev/null +++ b/zh-cn/assets/index-9ef15c87.js @@ -0,0 +1,91 @@ +const p="/zh-cn/assets/image3-e7a83351.png",e="/zh-cn/assets/image1-6caf9701.png",l="/zh-cn/assets/image2-d15c91e1.png",t="/zh-cn/assets/image4-d81e7808.png",s="/zh-cn/assets/image5-e5e2653f.png",a="/zh-cn/assets/image6-a1ac5aed.png",n="/zh-cn/assets/image7-638b9fb3.png",c="/zh-cn/assets/image8-2ec67807.png",i="/zh-cn/assets/image9-19a1cf33.png",g="/zh-cn/assets/image10-0e887e18.png",h="/zh-cn/assets/image-3a1a0ef6.png",C=[p,e,l,t,s,a,n,c,i,g,h],o={label:"【转发】GLCC学生报名延期!速来抢位!",description:"达坦科技此次参与GitLink“确实开源”编程夏令营(GLCC),我们的开源项目题目为:为开源RDMA网卡编写测试工具。课题简介:为了对RDMA网卡进行功能测试,需要在line-rate的条件下创建出数据包乱序、丢包、重复等情况。目前已有的解决方案大多需要昂贵的P4交换机来实现。本项目要求使用HDL语言在FPGA上实现指定模式的数据包收发功能。",cover:"./image3.png",location:"中国香港",date:"2024-06-27",title:"GLCC Student Registration Extended! Hurry Up and Secure Your Spot!"},r=[{label:"报名方式",level:2},{label:"关于GLCC",level:2},{label:"为什么加入GLCC",level:2},{label:"01深入开源实践",level:3},{label:"02灵活远程实习",level:3},{label:"03导师一对一指导",level:3},{label:"04拓宽人脉网络",level:3},{label:"05丰厚奖励与认证",level:3},{label:"06名企实习机会",level:3},{label:"参与社区",level:2},{label:"GLCC学生时刻表",level:2},{label:"高校学生如何参与",level:2},{label:"01报名时间:",level:3},{label:"02申请步骤:",level:3},{label:"03注意事项:",level:3},{label:"04学生申请指南:",level:3},{label:"协同举办体系",level:2}],d=`

          达坦科技始终致力于打造高性能 Al+ Cloud 基础设施平台,积极推动 AI 应用的落地。达坦科技通过软硬件深度融合的方式,提供高性能存储和高性能网络。为 AI 应用提供弹性、便利、经济的基础设施服务,以此满足不同行业客户对 AI+Cloud 的需求。

          +

          达坦科技此次参与GitLink“确实开源”编程夏令营(GLCC),我们的开源项目题目为:为开源RDMA网卡编写测试工具。

          +

          课题简介:为了对RDMA网卡进行功能测试,需要在line-rate的条件下创建出数据包乱序、丢包、重复等情况。目前已有的解决方案大多需要昂贵的P4交换机来实现。本项目要求使用HDL语言在FPGA上实现指定模式的数据包收发功能。

          +

          课题链接:https://www.gitlink.org.cn/datenlord/open-rdma/issues/1

          +

          导师信息:米明恒

          +

          联络方式:mingheng.mi@datenlord.com

          +

          图片

          +

          报名方式

          +

          现在,让我们再来复习一下报名的细节:

          +

          报名截止时间:

          +

          2024年7月4日17:00,别错过哦!

          +

          报名方式:

          +

          1.登录GLCC官网(GitLink确实开源)查看课题列表:

          +

          https://www.gitlink.org.cn/GLCC

          +
            +
          1. +

            点击最下方【阅读原文】即可跳转官网

            +
          2. +
          3. +

            扫码进入官网报名 +图片

            +
          4. +
          +

          关于GLCC

          +

          第三届GitLink“确实开源”编程夏令营(GLCC)是由中国计算机学会(CCF)主办,CCF 开源发展委员会与之江实验室承办的面向全国高校学生的暑期编程活动。GLCC致力于激励青年学子通过参与真实的开源软件开发实践,锤炼自身技术实力,为开源社区注入新鲜血液,共同推动国内开源社区的蓬勃发展。 +图片 +第三届GLCC将于活动官网(GitLink |确实开源)和公众号(CCF 开源发展委员会)陆续发布入选课题介绍,敬请期待! +图片 +扫码关注公众号获取GLCC最新内容

          +

          为什么加入GLCC

          +

          01深入开源实践

          +

          直接投身开源项目,深入了解社区运作,提升代码编写与协作能力。

          +

          02灵活远程实习

          +

          提供远程实习机会,让你能自由安排工作时间,兼顾学业与职业发展。

          +

          03导师一对一指导

          +

          每位学生配备资深导师,全程一对一指导支持和经验分享。

          +

          04拓宽人脉网络

          +

          与志同道合的伙伴以及开源社区技术大咖深入交流,拓宽职业视野。

          +

          05丰厚奖励与认证

          +

          完成开源任务即可获得税前6000至12000元不等的奖金及结项证书,还有机会获得赛事周边与项目认证等。

          +

          06名企实习机会

          +

          表现优秀的同学将有机会进入知名企业实习,为职业生涯开启新篇章。 +众多开源社区参加GLCC

          +

          目前GLCC已经进入学生申请题目阶段,覆盖大模型、人工智能、操作系统、云原生、编程语言、大数据、运维监控、系统工具等30多个技术领域,课题难度分级,等你来挑选。

          +

          参与社区

          +

          图片

          +

          GLCC学生时刻表

          +

          1. 5月31日-7月4日

          +

          学生报名,提交proposal。

          +

          2. 7月8日

          +

          公示入选学生名单。

          +

          (7月6日进行二次报名,第一次落选的同学不要灰心哦)

          +

          3. 7月9日-8月18日

          +

          项目开发第一阶段。

          +

          4. 8月30日

          +

          项目中期考核,公示考核结果。

          +

          5. 8月31日-10月20日

          +

          项目开发第二阶段。

          +

          6. 10月31日

          +

          结项审核,公示考核结果。

          +

          7. 11月初

          +

          公布优秀项目/学生颁奖典礼。

          +

          高校学生如何参与

          +

          01报名时间:

          +

          2024.5.31-2024.7.4

          +

          02申请步骤:

          +

          图片 +www.gitlink.org.cn/glcc/2024/subjects +同学们根据个人专业情况,技术爱好以及所选开源组织的技术类型和参与门槛及奖金等情况筛选出自己喜欢的课题; +图片 +②点击“课题列表”中每个课题后的“申请课题”,进入报名信息页面填写“个人基本信息”和“课题申请书”,并提交; +图片 +③组委会收到申请后,审核通过后推荐给该课题所属项目导师,提交后的信息可再次更新。建议同学们同时也发送邮件跟导师联系;

          +

          ④加入GLCC官方QQ交流群,或发邮件到glcc@ccf.org.cn,关注活动进展和咨询; +图片 +扫码加入GLCC官方QQ交流群 +⑤7月8日公布学生中选情况并通过邮件通知,也可再次登陆官网查看。

          +

          03注意事项:

          +

          ①GLCC面向18岁以上的在校学生,请诚实提交在校学生证明材料组委会会对提交材料进行审核;

          +

          ②申请阶段,GLCC允许每个学生同时提交最多2个课题申请。申请结束后,经过与课题导师双向沟通,每个学生最终只能选择完成一个课题;

          +

          ③GLCC的每个课题都公布了导师的姓名/ID和邮箱地址,建议提前通过邮件方式和导师建立联系,反复沟通后再提交申请材料,你有充足的时间去了解你将要承担的课题;

          +

          ④ 建议在截止日期前三天完成提交,避免因最后大量学生提交申请导致网络拥堵;

          +

          ⑤CCF中国计算机学会学生会员申请优先推荐。

          +

          04学生申请指南:

          +

          GLCC为同学们申请过程中遇到的问题提供了丰富的辅导文档,可在官网查看“帮助文档-学生指南”获取。

          +

          官网链接:

          +

          https://www.gitlink.org.cn/glcc/help +图片 +扫码进入【学生指南】页面

          +

          协同举办体系

          +

          图片

          `;export{C as assetURLs,d as default,o as metadata,r as toc}; diff --git a/zh-cn/assets/index-a1a1a279.js b/zh-cn/assets/index-a1a1a279.js deleted file mode 100644 index 6149306..0000000 --- a/zh-cn/assets/index-a1a1a279.js +++ /dev/null @@ -1,34 +0,0 @@ -const e="/zh-cn/assets/cover-c938ebe8.png",t="/zh-cn/assets/image1-a88ec652.jpg",s="/zh-cn/assets/image2-0d688c12.png",r=[e,t,s],n={label:"4.8 Beijing Rust Meetup | Call For Presenters",description:"如果你有兴趣参与探讨Rust作为一种强调性能、安全和并发性的编程语言的各种应用、实践和无限可能性的头脑风暴,就一定不能错过这场来自达坦科技、南京大学、CloudWeGo、华为等技术专家带来的关于Rust编程语言相关应用的线下Meetup。我们的主题是Rust💡X,意在探讨用Rust编程语言“点亮”的任何应用、实践和探索。",cover:"./cover.png",location:"中国香港",date:"2023-03-31",title:"4.8 Beijing Rust Meetup | Call For Presenters"},i=[{label:"嘉宾演讲 (Presenter & Topic)",level:2},{label:"提交议题 (Call for Presenters)",level:2},{label:"Meetup 报名方式 (Registration)",level:2}],o=`

          如果你有兴趣参与探讨 Rust 作为一种强调性能、安全和并发性的编程语言的各种应用、实践和无限可能性的头脑风暴,就一定不能错过这场来自达坦科技、南京大学、CloudWeGo、华为等技术专家带来的关于 Rust 编程语言相关应用的线下 Meetup。我们的主题是 Rust💡X,意在探讨用 Rust 编程语言“点亮”的任何应用、实践和探索

          -

          时间: 2023 年 4 月 8 日 14:00 -地点: 环球财讯中心 M 层 北京市西城区宣武门外大街甲 1 号

          -

          嘉宾演讲 (Presenter & Topic)

          -

          目前已经锁定的分享嘉宾和演讲主题有:

          -

          嘉宾:冯洋 南京大学计算机科学与技术系助理研究员
          -议题:基于实际场景应用分析的 Rust 库模糊测试技术报告
          -摘要: Rust 是一种诺内存安全和并发安全的语言,而各类 Rust 库中 API 的漏洞与缺陷可能会对所有使用该库的程序产生影响。因此,保障 Rust 库的安全性与可靠性是一个极为重要的问题。为了进一步保障 Rust 库的安全,通过模糊测试来对 Rust 的库进行测试是一个可行方法。在本报告中,我们提出了一种依靠现有 Rust 生态系统来生成模糊测试目标的方法,该方法利用 MIR 解析待测库所在生态系统中的项目,找到现实中 API 之间的调用和依赖关系,从而从中提取出待测库的 API 序列,依此生成 Rust 库的模糊测试目标。

          -

          嘉宾:施继成 达坦科技联合创始人兼 CTO
          -议题:在 Linux 6.2 中用 Rust 语言写驱动
          -摘要: Linux 在 6.1 中加入了 rust 语言的支持,自此开发者可以使用 Rust 语言进行 Linux 内核驱动开发。因为 Rust 语言的安全性,未来驱动的开发工作使用 Rust 语言将成为必然趋势。虽然 Rust 语言的支持还有许多不完善的地方,但不妨碍我们“吃螃蟹”——使用 Rust 语言写一个 Linux 驱动。
          -本次分享将:

          -
            -
          1. 介绍 Linux 系统的 Rust 语言支持。
          2. -
          3. 以 Linux 上的简单 Driver 举例,说明如何用 Rust 写驱动。
          4. -
          5. 分析 Rust 在 Linux 中工作的原理
          6. -
          7. 列举 Rust 进行驱动编写时的限制。
          8. -
          9. 给出使用 Rust 编写驱动的 Guideline。
          10. -
          -

          嘉宾:叶天星 华为技术有限公司 -议题:用 Rust 实现 Git 传输协议、Git 对象解析和数据库存储 -摘要: 本次分享将包含:

          -
            -
          1. 使用 Rust 实现 Git 传输协议 - Git 传输协议是一种用于 Git 客户端和服务器之间进行通信的协议,有两种实现方式:HTTP 和 SSH。Git 传输协议可以确保数据传输的安全性和可靠性,并且能够高效地处理大量的数据。通过使用 Rust,可以轻松地实现 Git 客户端和服务器之间的数据传输,并确保高效的网络通信和数据安全性。
          2. -
          3. Git 存储结构介绍 - Git 使用了一种称为对象存储的方式来存储代码版本信息。Git 对象有四种类型:blob、tree、commit 和 tag。
          4. -
          -

          提交议题 (Call for Presenters)

          -

          无论是您正在用 Rust 编写安全性要求高的系统级软件,还是高效的并发程序,或是游戏、Web/移动应用程序等,只要是有关 Rust 应用的有趣、有意义的想法和实践,欢迎提交议题,和更多的同行分享交流。

          -

          请将姓名、公司、议题、摘要,联系方式等信息,发送至tianwei.wang@datenlord.com

          -

          图片

          -

          Meetup 报名方式 (Registration)

          -

          欢迎扫描下方二维码或点击阅读原文,即可报名。

          -

          阅读原文

          -

          图片

          `;export{r as assetURLs,o as default,n as metadata,i as toc}; diff --git a/zh-cn/assets/index-8f0491cb.js b/zh-cn/assets/index-a1d21a3b.js similarity index 92% rename from zh-cn/assets/index-8f0491cb.js rename to zh-cn/assets/index-a1d21a3b.js index 53357c4..4e7fab3 100644 --- a/zh-cn/assets/index-8f0491cb.js +++ b/zh-cn/assets/index-a1d21a3b.js @@ -1,4 +1,4 @@ -const s="/zh-cn/assets/cover-78606c04.png",t="/zh-cn/assets/image1-f46bfcc6.jpg",n=[s,t],o={label:"Rust X Datenlord:第二届中国Rust开发者大会回顾",description:"达坦科技自成立以来积极探索软硬件深度融合,专注于打造新一代的开源跨云存储平台,以满足不同行业客户对数据跨云、跨数据中心高性能访问的需求。",cover:"./cover.png",location:"新加坡",date:"2022-08-04",title:"Rust X Datenlord: Review of the Second China Rust Developer Conference"},e=[{label:"专题演讲",level:2},{label:"线上 workshop",level:2},{label:"参与我们",level:2}],r=`

          封面

          +const s="/zh-cn/assets/cover-78606c04.png",t="/zh-cn/assets/image1-f46bfcc6.jpg",n=[s,t],o={label:"Rust X Datenlord:第二届中国Rust开发者大会回顾",description:"达坦科技自成立以来积极探索软硬件深度融合,专注于打造新一代的开源跨云存储平台,以满足不同行业客户对数据跨云、跨数据中心高性能访问的需求。",cover:"./cover.png",location:"新加坡",date:"2022-08-04",title:"Rust X Datenlord_ Review of the Second China Rust Developer Conference"},r=[{label:"专题演讲",level:2},{label:"线上 workshop",level:2},{label:"参与我们",level:2}],e=`

          封面

          达坦科技自成立以来积极探索软硬件深度融合,专注于打造新一代的开源跨云存储平台,以满足不同行业客户对数据跨云、跨数据中心高性能访问的需求。

          今年以来陆续发声,将达坦科技开源项目 async-rdma 的技术实践和案例对外输出,坚定地做 Rust 语言的布道,也将达坦科技探索的新一代硬件敏捷开发的研究成果在各硬件技术大会上做分享(本周的次条为达坦科技的团队在南京参加中国计算机学会芯片大会的回顾)。

          专题演讲

          @@ -12,4 +12,4 @@ const s="/zh-cn/assets/cover-78606c04.png",t="/zh-cn/assets/image1-f46bfcc6.jpg"

          参与我们

          目前,我们将整个库放在了 Github.com/datenlord/async-rdma 上,并且也在持续迭代中,欢迎感兴趣用 Rust 语言实现高性能编程的你前来讨论。

          有意加入 Rust 前沿交流讨论群,请添加小助手微信:

          -

          封面

          `;export{n as assetURLs,r as default,o as metadata,e as toc}; +

          封面

          `;export{n as assetURLs,e as default,o as metadata,r as toc}; diff --git a/zh-cn/assets/index-69f9dfbf.js b/zh-cn/assets/index-a4c077ba.js similarity index 98% rename from zh-cn/assets/index-69f9dfbf.js rename to zh-cn/assets/index-a4c077ba.js index c42f625..1534891 100644 --- a/zh-cn/assets/index-69f9dfbf.js +++ b/zh-cn/assets/index-a4c077ba.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/07123c0a1614c5c0256c2c44fccab7ad-82d2cfc4.jpeg",a="/zh-cn/assets/dbb615367665aefe1e8dc131faf7135d-ab0138b7.png",t="/zh-cn/assets/7e55ab5e49360b59ae14ad51bd9f8266-a3540f96.png",p="/zh-cn/assets/50e844cef87960be41630d431f7dba76-74a09282.png",s="/zh-cn/assets/da011de83bcdac4720de4265f06487fa-a09f8943.png",r="/zh-cn/assets/ab91fcebd0198e3ba3e68a1f0ede0dcb-2954efad.png",n="/zh-cn/assets/d6753cc7dafac128a184192d73a671d0-cbc3aa8e.png",l="/zh-cn/assets/8140b483b2b9992795a40af43149d92e-6324a4f1.png",c="/zh-cn/assets/261faba035c5925dd1bf0052673a2819-65bae75e.png",i="/zh-cn/assets/7ccbe7094043e218ad241cc3c2e3c871-e3e8431a.png",d="/zh-cn/assets/7a18e9fc6512a89b6e74a92a92580823-5ee6182a.png",o="/zh-cn/assets/3df9c5c4ff35c6cde20f54a80ed5bb0d-6b5bfe86.png",m="/zh-cn/assets/03beb98ee570de53f1aa4b866838924b-60f7cb4e.jpeg",u="/zh-cn/assets/13065eb252d78f86c7d84a7537e730d7-9522963a.png",h="/zh-cn/assets/0f55765329135bae263d77175baf52b7-2df179ec.png",I=[e,a,t,p,s,r,n,l,c,i,d,o,m,u,h],P={label:"blue-ethernet 高性能FPGA网络数据包处理项目详解",description:"blue-ethernet项目使用Bluespec SystemVerilog(BSV)硬件描述语言实现了一系列在FPGA上加速网络数据包处理的硬件模块。具体来说,其提供了用于生成和解析Ethernet/IP/UDP网络报文的硬件模块。此外,还提供了一个具有非阻塞高速缓存的APR报文处理单元,用于自动解析设备的物理MAC地址。",cover:"./07123c0a1614c5c0256c2c44fccab7ad.jpeg",location:"中国香港",author:["翁万正"],tags:["硬件加速"],date:"2023-11-02",title:"blue ethernet High Performance FPGA Network Packet Processing Project Details"},D=[{label:"简介",level:2},{label:"文件目录概览",level:2},{label:"组件",level:2},{label:"数据流处理模块",level:3},{label:"UdpIpLayer",level:3},{label:"UdpIpLayerForRdma",level:3},{label:"MacLayer",level:2},{label:"ARP Processor",level:3},{label:"UdpIpEthRx",level:3},{label:"UdpIpEthTx",level:3},{label:"UdpIpArpEthRxTx",level:3},{label:"PriorityFlowContro",level:3},{label:"性能和面积",level:2},{label:"入门教程",level:2},{label:"仿真测试",level:3},{label:"使用方法",level:3},{label:"相关链接",level:2}],A=`

          +const e="/zh-cn/assets/07123c0a1614c5c0256c2c44fccab7ad-82d2cfc4.jpeg",a="/zh-cn/assets/dbb615367665aefe1e8dc131faf7135d-ab0138b7.png",t="/zh-cn/assets/7e55ab5e49360b59ae14ad51bd9f8266-a3540f96.png",p="/zh-cn/assets/50e844cef87960be41630d431f7dba76-74a09282.png",s="/zh-cn/assets/da011de83bcdac4720de4265f06487fa-a09f8943.png",r="/zh-cn/assets/ab91fcebd0198e3ba3e68a1f0ede0dcb-2954efad.png",n="/zh-cn/assets/d6753cc7dafac128a184192d73a671d0-cbc3aa8e.png",l="/zh-cn/assets/8140b483b2b9992795a40af43149d92e-6324a4f1.png",c="/zh-cn/assets/261faba035c5925dd1bf0052673a2819-65bae75e.png",d="/zh-cn/assets/7ccbe7094043e218ad241cc3c2e3c871-e3e8431a.png",i="/zh-cn/assets/7a18e9fc6512a89b6e74a92a92580823-5ee6182a.png",o="/zh-cn/assets/3df9c5c4ff35c6cde20f54a80ed5bb0d-6b5bfe86.png",u="/zh-cn/assets/03beb98ee570de53f1aa4b866838924b-60f7cb4e.jpeg",m="/zh-cn/assets/13065eb252d78f86c7d84a7537e730d7-9522963a.png",h="/zh-cn/assets/0f55765329135bae263d77175baf52b7-2df179ec.png",I=[e,a,t,p,s,r,n,l,c,d,i,o,u,m,h],P={label:"blue-ethernet 高性能FPGA网络数据包处理项目详解",description:"blue-ethernet项目使用Bluespec SystemVerilog(BSV)硬件描述语言实现了一系列在FPGA上加速网络数据包处理的硬件模块。具体来说,其提供了用于生成和解析Ethernet/IP/UDP网络报文的硬件模块。此外,还提供了一个具有非阻塞高速缓存的APR报文处理单元,用于自动解析设备的物理MAC地址。",cover:"./07123c0a1614c5c0256c2c44fccab7ad.jpeg",location:"中国香港",author:["翁万正"],tags:["硬件加速"],date:"2023-11-02",title:"blue ethernet High Performance FPGA Network Packet Processing Project Details"},D=[{label:"简介",level:2},{label:"文件目录概览",level:2},{label:"组件",level:2},{label:"数据流处理模块",level:3},{label:"UdpIpLayer",level:3},{label:"UdpIpLayerForRdma",level:3},{label:"MacLayer",level:2},{label:"ARP Processor",level:3},{label:"UdpIpEthRx",level:3},{label:"UdpIpEthTx",level:3},{label:"UdpIpArpEthRxTx",level:3},{label:"PriorityFlowContro",level:3},{label:"性能和面积",level:2},{label:"入门教程",level:2},{label:"仿真测试",level:3},{label:"使用方法",level:3},{label:"相关链接",level:2}],b=`

          简介

          blue-ethernet 项目使用 Bluespec SystemVerilog(BSV)硬件描述语言实现了一系列在 FPGA 上加速网络数据包处理的硬件模块。具体来说,其提供了用于生成和解析 Ethernet/IP/UDP 网络报文的硬件模块。此外,还提供了一个具有非阻塞高速缓存的 APR 报文处理单元,用于自动解析设备的物理 MAC 地址。

          除了构建标准的 UDP/IP/Ethernet 协议栈,blue-ethernet 还增加了对 RoCE(RDMA over Converged Ethernet)协议的支持,具体包括:

          @@ -201,7 +201,7 @@ module mkMacMetaDataAndUdpIpStream#(

          mkArpProcessor

          mkArpProcessor 集成了 MAC 地址信息缓存单元 mkArpCache 以及对 ARP 报文的解析和生成模块。在处理 ARP 请求和响应时,mkArpProcessor 既可作为请求端,在 Cache Miss 时发出 ARP 请求报文并接收从目标设备返回的 ARP 响应报文。同时也可作为被请求端,接收其他设备发出的 ARP 请求报文并将自己的 MAC 地址信息通过 ARP 响应返回给请求端。

          -

          +

          interface ArpProcessor;
               interface PipeOut#(DataStream) arpStreamOut;
               interface PipeOut#(MacMetaData) macMetaDataOut;
          @@ -231,7 +231,7 @@ endinterface
           
           module mkGenericUdpIpEthRx#(Bool isSupportRdma)(UdpIpEthRx)
           
          -

          +

          • mkGenericRawUdpIpEthRx 模块使用 blue-wrapper 中提供的组件对 mkGenericUdpIpEthRx 进行封装,目的是为了在生成的 Verilog 代码里提供直接可用的接口。
          @@ -269,7 +269,7 @@ endinterface module mkGenericUdpIpEthTx#(Bool isSupportRdma)(UdpIpEthTx); -

          +

          • mkGenericRawUdpIpArpEthRxTx 模块使用 blue-wrapper 中提供的组件对 mkGenericUdpIpArpEthRxTx 进行封装,从而生成方便对接的 Verilog 接口。
          @@ -289,7 +289,7 @@ module mkPriorityFlowControlTx#( Vector#(VIRTUAL_CHANNEL_NUM, UdpIpMetaDataPipeOut) udpIpMetaDataInVec )(PriorityFlowControlTx); -

          +

          • mkPriorityFlowControlRx 负责报文接收端的 PFC 控制。其接收报头信息流 udpIpMetaDataIn 和发送信息数据流 dataStreamIn,然后根据报头信息中包含的通道索引值分别路由至 udpIpMetaDataOutVec 和 dataStreamOutVec 中的某个输出通道。此外,该模块需要监控每个通道的中间缓冲区中存储的报文数量。当某个通道缓冲区内的报文数量达到阈值 pfcThreshold 时,就会发送 PFC 报文至发送端以暂停该通道的报文传输。
          @@ -413,4 +413,4 @@ make verilog TARGET=UdpIpEthTx SUPPORT_RDMA=TRUE
        • blue-wrapper: https://github.com/wengwz/blue-wrapper

        关于项目更多的详细信息可关注链接:

        -

        https://github.com/wengwz/blue-ethernet

        `;export{I as assetURLs,A as default,P as metadata,D as toc}; +

        https://github.com/wengwz/blue-ethernet

        `;export{I as assetURLs,b as default,P as metadata,D as toc}; diff --git a/zh-cn/assets/index-29c0b7ce.js b/zh-cn/assets/index-b1ba4736.js similarity index 98% rename from zh-cn/assets/index-29c0b7ce.js rename to zh-cn/assets/index-b1ba4736.js index 1b821d3..17ef944 100644 --- a/zh-cn/assets/index-29c0b7ce.js +++ b/zh-cn/assets/index-b1ba4736.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/cover-1329fc54.png",a="/zh-cn/assets/image1-b7df4899.png",s="/zh-cn/assets/image2-a77c94e1.jpg",t=[e,a,s],r={label:"计算机体系结构 | MIT Training Q&A及小贴士",description:"在2023年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。6.175和6.375的课程和Lab学习都有一定的难度,要求采用Bluespec语言实现RISC-V处理器,并支持多级流水、分支预测、缓存、异常处理、缓存一致性等功能。此外,Lab环节还涉及软硬件联合开发,要求基于所实现的RISC-V处理器运行真实的RISC-V程序,并给出性能评估。",cover:"./cover.png",location:"中国香港",author:["达坦科技"],tags:["硬件加速"],date:"2022-06-11",title:"Computer Architecture l MIT Training Q&A and Tips"},i=[{label:"MIT Training Q & A",level:2},{label:"MIT Training 小贴士",level:2},{label:"Related Resources",level:2}],c=`

        图片

        +const e="/zh-cn/assets/cover-1329fc54.png",a="/zh-cn/assets/image1-b7df4899.png",s="/zh-cn/assets/image2-a77c94e1.jpg",t=[e,a,s],r={label:"计算机体系结构 | MIT Training Q&A及小贴士",description:"在2023年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。6.175和6.375的课程和Lab学习都有一定的难度,要求采用Bluespec语言实现RISC-V处理器,并支持多级流水、分支预测、缓存、异常处理、缓存一致性等功能。此外,Lab环节还涉及软硬件联合开发,要求基于所实现的RISC-V处理器运行真实的RISC-V程序,并给出性能评估。",cover:"./cover.png",location:"中国香港",author:["达坦科技"],tags:["硬件加速"],date:"2022-06-11",title:"Computer Architecture l MIT Training Q&A and Tips"},c=[{label:"MIT Training Q & A",level:2},{label:"MIT Training 小贴士",level:2},{label:"Related Resources",level:2}],i=`

        图片

        在 2023 年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。6.175 和 6.375 的课程和 Lab 学习都有一定的难度,要求采用 Bluespec 语言实现 RISC-V 处理器,并支持多级流水、分支预测、缓存、异常处理、缓存一致性等功能。此外,Lab 环节还涉及软硬件联合开发,要求基于所实现的 RISC-V 处理器运行真实的 RISC-V 程序,并给出性能评估。

        继 MIT6.175 和 MIT6.375 学习笔记之后,我们又整理了到目前为止,硬件设计学习社区里大家碰到的一些共同问题,希望我们的回复以及学习贴士对于想啃下这两门高难度课程,并想从事数字芯片设计的工程师或同学有所帮助。

        MIT Training Q & A

        @@ -76,4 +76,4 @@ A:我目前是用 docker 做的实验,6175 的 lab1-6 和 6375 的 lab1-4

        计算机体系结构| MIT6.175 和 MIT6.375 学习笔记

        达坦科技硬件设计学习社区持续开放,若想询问加入细节,请添加下方小助手微信号或邮件info@datenlord.com

        -

        图片

        `;export{t as assetURLs,c as default,r as metadata,i as toc}; +

        图片

        `;export{t as assetURLs,i as default,r as metadata,c as toc}; diff --git a/zh-cn/assets/index-fa30bf44.js b/zh-cn/assets/index-b2bc16dd.js similarity index 98% rename from zh-cn/assets/index-fa30bf44.js rename to zh-cn/assets/index-b2bc16dd.js index c56b464..d651906 100644 --- a/zh-cn/assets/index-fa30bf44.js +++ b/zh-cn/assets/index-b2bc16dd.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-3674aa81.jpg",e="/zh-cn/assets/image1-af3445c2.png",n=[t,e],s={label:"精彩回顾 | Rust唠嗑室:Xline跨数据中心一致性管理",description:"2022年10月15日,达坦科技和Rust语言中文社区合作,在Rust唠嗑室活动中,由达坦科技(DatenLord)联合创始人施继成做了关于开源分布式存储技术的分享,着重介绍了达坦科技新的开源项目Xline,这一跨云的metadata(元数据)KV存储的产品是如何实现高性能跨数据中心的数据一致性管理的。",cover:"./cover.jpg",location:"中国香港",tags:["Xline"],date:"2022-10-20",title:"Wonderful review l Rust chat room: Xline cross data center consistency management"},o=[{label:"内容介绍",level:2},{label:"我们的产品:Xline",level:2}],r=`

        图片

        +const t="/zh-cn/assets/cover-3674aa81.jpg",e="/zh-cn/assets/image1-af3445c2.png",n=[t,e],s={label:"精彩回顾 | Rust唠嗑室:Xline跨数据中心一致性管理",description:"2022年10月15日,达坦科技和Rust语言中文社区合作,在Rust唠嗑室活动中,由达坦科技(DatenLord)联合创始人施继成做了关于开源分布式存储技术的分享,着重介绍了达坦科技新的开源项目Xline,这一跨云的metadata(元数据)KV存储的产品是如何实现高性能跨数据中心的数据一致性管理的。",cover:"./cover.jpg",location:"中国香港",tags:["Xline"],date:"2022-10-20",title:"Wonderful review l Rust chat room_ Xline cross data center consistency management"},o=[{label:"内容介绍",level:2},{label:"我们的产品:Xline",level:2}],r=`

        图片

        2022 年 10 月 15 日,达坦科技和 Rust 语言中文社区合作,在 Rust 唠嗑室活动中,由达坦科技(DatenLord)联合创始人施继成做了关于开源分布式存储技术的分享,着重介绍了达坦科技新的开源项目 Xline,这一跨云的 metadata(元数据)KV 存储的产品是如何实现高性能跨数据中心的数据一致性管理的。

        内容介绍

        施继成首先介绍了做 Xline 这个产品的动机。最初 2021 年 UCBerkeley 提出了 Sky Computing(“天空计算”) 的概念。与我们都熟知的 cloud computing(“云计算”)不同的是,sky computing,如其表面意义所讲,是天空中有很多的云,是解决跨云的问题。如何打破不同云之间的隔阂,或者打通和最大化利用跨云数据是当前面临的一个难题,也是我们的目标所在。如今谈论云计算时,我们不需要考虑云资源的部署,可扩展性等问题,因为云厂商已经都帮忙做了。但是,一旦跨云,则无论算力的迁移,或数据的迁移,都是摆在我们眼前要攻克的难题。达坦科技在做的就是解决“如何做跨云数据交互”的问题,我们致力于将分布式系统从数据中心范围扩散至全球范围,这样即使单个数据中心宕机,却仍不影响用户使用数据。

        diff --git a/zh-cn/assets/index-d26fda9b.js b/zh-cn/assets/index-d26fda9b.js deleted file mode 100644 index 262d7eb..0000000 --- a/zh-cn/assets/index-d26fda9b.js +++ /dev/null @@ -1,3105 +0,0 @@ -var Cj=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var nQ=Cj((sQ,ou)=>{(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const a of o.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&n(a)}).observe(document,{childList:!0,subtree:!0});function r(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=r(i);fetch(i.href,o)}})();var Go=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function C2(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function Dj(e){if(e.__esModule)return e;var t=e.default;if(typeof t=="function"){var r=function n(){if(this instanceof n){var i=[null];i.push.apply(i,arguments);var o=Function.bind.apply(t,i);return new o}return t.apply(this,arguments)};r.prototype=t.prototype}else r={};return Object.defineProperty(r,"__esModule",{value:!0}),Object.keys(e).forEach(function(n){var i=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(r,n,i.get?i:{enumerable:!0,get:function(){return e[n]}})}),r}var l={},Ej={get exports(){return l},set exports(e){l=e}},id={},I={},jj={get exports(){return I},set exports(e){I=e}},ke={};/** - * @license React - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var kl=Symbol.for("react.element"),Aj=Symbol.for("react.portal"),Tj=Symbol.for("react.fragment"),Rj=Symbol.for("react.strict_mode"),Oj=Symbol.for("react.profiler"),Pj=Symbol.for("react.provider"),Lj=Symbol.for("react.context"),Mj=Symbol.for("react.forward_ref"),Ij=Symbol.for("react.suspense"),Nj=Symbol.for("react.memo"),zj=Symbol.for("react.lazy"),Zv=Symbol.iterator;function Yj(e){return e===null||typeof e!="object"?null:(e=Zv&&e[Zv]||e["@@iterator"],typeof e=="function"?e:null)}var D2={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},E2=Object.assign,j2={};function Ys(e,t,r){this.props=e,this.context=t,this.refs=j2,this.updater=r||D2}Ys.prototype.isReactComponent={};Ys.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Ys.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function A2(){}A2.prototype=Ys.prototype;function s0(e,t,r){this.props=e,this.context=t,this.refs=j2,this.updater=r||D2}var a0=s0.prototype=new A2;a0.constructor=s0;E2(a0,Ys.prototype);a0.isPureReactComponent=!0;var Jv=Array.isArray,T2=Object.prototype.hasOwnProperty,l0={current:null},R2={key:!0,ref:!0,__self:!0,__source:!0};function O2(e,t,r){var n,i={},o=null,a=null;if(t!=null)for(n in t.ref!==void 0&&(a=t.ref),t.key!==void 0&&(o=""+t.key),t)T2.call(t,n)&&!R2.hasOwnProperty(n)&&(i[n]=t[n]);var c=arguments.length-2;if(c===1)i.children=r;else if(1>>1,he=$[ue];if(0>>1;uei(K,Q))zti(rr,K)?($[ue]=rr,$[zt]=Q,ue=zt):($[ue]=K,$[Fe]=Q,ue=Fe);else if(zti(rr,Q))$[ue]=rr,$[zt]=Q,ue=zt;else break e}}return le}function i($,le){var Q=$.sortIndex-le.sortIndex;return Q!==0?Q:$.id-le.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var a=Date,c=a.now();e.unstable_now=function(){return a.now()-c}}var d=[],h=[],g=1,v=null,x=3,k=!1,C=!1,D=!1,E=typeof setTimeout=="function"?setTimeout:null,y=typeof clearTimeout=="function"?clearTimeout:null,w=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function b($){for(var le=r(h);le!==null;){if(le.callback===null)n(h);else if(le.startTime<=$)n(h),le.sortIndex=le.expirationTime,t(d,le);else break;le=r(h)}}function j($){if(D=!1,b($),!C)if(r(d)!==null)C=!0,ze(T);else{var le=r(h);le!==null&&mt(j,le.startTime-$)}}function T($,le){C=!1,D&&(D=!1,y(O),O=-1),k=!0;var Q=x;try{for(b(le),v=r(d);v!==null&&(!(v.expirationTime>le)||$&&!ee());){var ue=v.callback;if(typeof ue=="function"){v.callback=null,x=v.priorityLevel;var he=ue(v.expirationTime<=le);le=e.unstable_now(),typeof he=="function"?v.callback=he:v===r(d)&&n(d),b(le)}else n(d);v=r(d)}if(v!==null)var st=!0;else{var Fe=r(h);Fe!==null&&mt(j,Fe.startTime-le),st=!1}return st}finally{v=null,x=Q,k=!1}}var R=!1,P=null,O=-1,z=5,Y=-1;function ee(){return!(e.unstable_now()-Y$||125<$?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):z=0<$?Math.floor(1e3/$):5},e.unstable_getCurrentPriorityLevel=function(){return x},e.unstable_getFirstCallbackNode=function(){return r(d)},e.unstable_next=function($){switch(x){case 1:case 2:case 3:var le=3;break;default:le=x}var Q=x;x=le;try{return $()}finally{x=Q}},e.unstable_pauseExecution=function(){},e.unstable_requestPaint=function(){},e.unstable_runWithPriority=function($,le){switch($){case 1:case 2:case 3:case 4:case 5:break;default:$=3}var Q=x;x=$;try{return le()}finally{x=Q}},e.unstable_scheduleCallback=function($,le,Q){var ue=e.unstable_now();switch(typeof Q=="object"&&Q!==null?(Q=Q.delay,Q=typeof Q=="number"&&0ue?($.sortIndex=Q,t(h,$),r(d)===null&&$===r(h)&&(D?(y(O),O=-1):D=!0,mt(j,Q-ue))):($.sortIndex=he,t(d,$),C||k||(C=!0,ze(T))),$},e.unstable_shouldYield=ee,e.unstable_wrapCallback=function($){var le=x;return function(){var Q=x;x=le;try{return $.apply(this,arguments)}finally{x=Q}}}})(L2);(function(e){e.exports=L2})(qj);/** - * @license React - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var M2=I,_r=Dm;function H(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=1;r"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Em=Object.prototype.hasOwnProperty,Zj=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,ty={},ry={};function Jj(e){return Em.call(ry,e)?!0:Em.call(ty,e)?!1:Zj.test(e)?ry[e]=!0:(ty[e]=!0,!1)}function eA(e,t,r,n){if(r!==null&&r.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return n?!1:r!==null?!r.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function tA(e,t,r,n){if(t===null||typeof t>"u"||eA(e,t,r,n))return!0;if(n)return!1;if(r!==null)switch(r.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function tr(e,t,r,n,i,o,a){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=n,this.attributeNamespace=i,this.mustUseProperty=r,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=a}var Nt={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Nt[e]=new tr(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Nt[t]=new tr(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){Nt[e]=new tr(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Nt[e]=new tr(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Nt[e]=new tr(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){Nt[e]=new tr(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){Nt[e]=new tr(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){Nt[e]=new tr(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){Nt[e]=new tr(e,5,!1,e.toLowerCase(),null,!1,!1)});var u0=/[\-:]([a-z])/g;function d0(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(u0,d0);Nt[t]=new tr(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(u0,d0);Nt[t]=new tr(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(u0,d0);Nt[t]=new tr(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){Nt[e]=new tr(e,1,!1,e.toLowerCase(),null,!1,!1)});Nt.xlinkHref=new tr("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){Nt[e]=new tr(e,1,!1,e.toLowerCase(),null,!0,!0)});function f0(e,t,r,n){var i=Nt.hasOwnProperty(t)?Nt[t]:null;(i!==null?i.type!==0:n||!(2c||i[a]!==o[c]){var d=` -`+i[a].replace(" at new "," at ");return e.displayName&&d.includes("")&&(d=d.replace("",e.displayName)),d}while(1<=a&&0<=c);break}}}finally{Vf=!1,Error.prepareStackTrace=r}return(e=e?e.displayName||e.name:"")?Da(e):""}function rA(e){switch(e.tag){case 5:return Da(e.type);case 16:return Da("Lazy");case 13:return Da("Suspense");case 19:return Da("SuspenseList");case 0:case 2:case 15:return e=Hf(e.type,!1),e;case 11:return e=Hf(e.type.render,!1),e;case 1:return e=Hf(e.type,!0),e;default:return""}}function Rm(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Xo:return"Fragment";case Ko:return"Portal";case jm:return"Profiler";case h0:return"StrictMode";case Am:return"Suspense";case Tm:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case z2:return(e.displayName||"Context")+".Consumer";case N2:return(e._context.displayName||"Context")+".Provider";case m0:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case p0:return t=e.displayName||null,t!==null?t:Rm(e.type)||"Memo";case yi:t=e._payload,e=e._init;try{return Rm(e(t))}catch{}}return null}function nA(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Rm(t);case 8:return t===h0?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Fi(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function V2(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function iA(e){var t=V2(e)?"checked":"value",r=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),n=""+e[t];if(!e.hasOwnProperty(t)&&typeof r<"u"&&typeof r.get=="function"&&typeof r.set=="function"){var i=r.get,o=r.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(a){n=""+a,o.call(this,a)}}),Object.defineProperty(e,t,{enumerable:r.enumerable}),{getValue:function(){return n},setValue:function(a){n=""+a},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function ic(e){e._valueTracker||(e._valueTracker=iA(e))}function H2(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var r=t.getValue(),n="";return e&&(n=V2(e)?e.checked?"true":"false":e.value),e=n,e!==r?(t.setValue(e),!0):!1}function au(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Om(e,t){var r=t.checked;return ot({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:r??e._wrapperState.initialChecked})}function iy(e,t){var r=t.defaultValue==null?"":t.defaultValue,n=t.checked!=null?t.checked:t.defaultChecked;r=Fi(t.value!=null?t.value:r),e._wrapperState={initialChecked:n,initialValue:r,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function F2(e,t){t=t.checked,t!=null&&f0(e,"checked",t,!1)}function Pm(e,t){F2(e,t);var r=Fi(t.value),n=t.type;if(r!=null)n==="number"?(r===0&&e.value===""||e.value!=r)&&(e.value=""+r):e.value!==""+r&&(e.value=""+r);else if(n==="submit"||n==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Lm(e,t.type,r):t.hasOwnProperty("defaultValue")&&Lm(e,t.type,Fi(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function oy(e,t,r){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var n=t.type;if(!(n!=="submit"&&n!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,r||t===e.value||(e.value=t),e.defaultValue=t}r=e.name,r!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,r!==""&&(e.name=r)}function Lm(e,t,r){(t!=="number"||au(e.ownerDocument)!==e)&&(r==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+r&&(e.defaultValue=""+r))}var Ea=Array.isArray;function us(e,t,r,n){if(e=e.options,t){t={};for(var i=0;i"+t.valueOf().toString()+"",t=oc.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Ka(e,t){if(t){var r=e.firstChild;if(r&&r===e.lastChild&&r.nodeType===3){r.nodeValue=t;return}}e.textContent=t}var Ra={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},oA=["Webkit","ms","Moz","O"];Object.keys(Ra).forEach(function(e){oA.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Ra[t]=Ra[e]})});function W2(e,t,r){return t==null||typeof t=="boolean"||t===""?"":r||typeof t!="number"||t===0||Ra.hasOwnProperty(e)&&Ra[e]?(""+t).trim():t+"px"}function G2(e,t){e=e.style;for(var r in t)if(t.hasOwnProperty(r)){var n=r.indexOf("--")===0,i=W2(r,t[r],n);r==="float"&&(r="cssFloat"),n?e.setProperty(r,i):e[r]=i}}var sA=ot({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Nm(e,t){if(t){if(sA[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(H(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(H(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(H(61))}if(t.style!=null&&typeof t.style!="object")throw Error(H(62))}}function zm(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ym=null;function g0(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Vm=null,ds=null,fs=null;function ly(e){if(e=El(e)){if(typeof Vm!="function")throw Error(H(280));var t=e.stateNode;t&&(t=cd(t),Vm(e.stateNode,e.type,t))}}function K2(e){ds?fs?fs.push(e):fs=[e]:ds=e}function X2(){if(ds){var e=ds,t=fs;if(fs=ds=null,ly(e),t)for(e=0;e>>=0,e===0?32:31-(vA(e)/yA|0)|0}var sc=64,ac=4194304;function ja(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function du(e,t){var r=e.pendingLanes;if(r===0)return 0;var n=0,i=e.suspendedLanes,o=e.pingedLanes,a=r&268435455;if(a!==0){var c=a&~i;c!==0?n=ja(c):(o&=a,o!==0&&(n=ja(o)))}else a=r&~i,a!==0?n=ja(a):o!==0&&(n=ja(o));if(n===0)return 0;if(t!==0&&t!==n&&!(t&i)&&(i=n&-n,o=t&-t,i>=o||i===16&&(o&4194240)!==0))return t;if(n&4&&(n|=r&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=n;0r;r++)t.push(e);return t}function Cl(e,t,r){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Qr(t),e[t]=r}function SA(e,t){var r=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var n=e.eventTimes;for(e=e.expirationTimes;0=Pa),vy=String.fromCharCode(32),yy=!1;function p_(e,t){switch(e){case"keyup":return QA.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function g_(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Qo=!1;function ZA(e,t){switch(e){case"compositionend":return g_(t);case"keypress":return t.which!==32?null:(yy=!0,vy);case"textInput":return e=t.data,e===vy&&yy?null:e;default:return null}}function JA(e,t){if(Qo)return e==="compositionend"||!k0&&p_(e,t)?(e=h_(),Uc=x0=ki=null,Qo=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=Sy(r)}}function __(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?__(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function x_(){for(var e=window,t=au();t instanceof e.HTMLIFrameElement;){try{var r=typeof t.contentWindow.location.href=="string"}catch{r=!1}if(r)e=t.contentWindow;else break;t=au(e.document)}return t}function C0(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function lT(e){var t=x_(),r=e.focusedElem,n=e.selectionRange;if(t!==r&&r&&r.ownerDocument&&__(r.ownerDocument.documentElement,r)){if(n!==null&&C0(r)){if(t=n.start,e=n.end,e===void 0&&(e=t),"selectionStart"in r)r.selectionStart=t,r.selectionEnd=Math.min(e,r.value.length);else if(e=(t=r.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var i=r.textContent.length,o=Math.min(n.start,i);n=n.end===void 0?o:Math.min(n.end,i),!e.extend&&o>n&&(i=n,n=o,o=i),i=by(r,o);var a=by(r,n);i&&a&&(e.rangeCount!==1||e.anchorNode!==i.node||e.anchorOffset!==i.offset||e.focusNode!==a.node||e.focusOffset!==a.offset)&&(t=t.createRange(),t.setStart(i.node,i.offset),e.removeAllRanges(),o>n?(e.addRange(t),e.extend(a.node,a.offset)):(t.setEnd(a.node,a.offset),e.addRange(t)))}}for(t=[],e=r;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof r.focus=="function"&&r.focus(),r=0;r=document.documentMode,qo=null,Wm=null,Ma=null,Gm=!1;function ky(e,t,r){var n=r.window===r?r.document:r.nodeType===9?r:r.ownerDocument;Gm||qo==null||qo!==au(n)||(n=qo,"selectionStart"in n&&C0(n)?n={start:n.selectionStart,end:n.selectionEnd}:(n=(n.ownerDocument&&n.ownerDocument.defaultView||window).getSelection(),n={anchorNode:n.anchorNode,anchorOffset:n.anchorOffset,focusNode:n.focusNode,focusOffset:n.focusOffset}),Ma&&el(Ma,n)||(Ma=n,n=mu(Wm,"onSelect"),0es||(e.current=Jm[es],Jm[es]=null,es--)}function He(e,t){es++,Jm[es]=e.current,e.current=t}var Ui={},Bt=Wi(Ui),dr=Wi(!1),po=Ui;function ks(e,t){var r=e.type.contextTypes;if(!r)return Ui;var n=e.stateNode;if(n&&n.__reactInternalMemoizedUnmaskedChildContext===t)return n.__reactInternalMemoizedMaskedChildContext;var i={},o;for(o in r)i[o]=t[o];return n&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=i),i}function fr(e){return e=e.childContextTypes,e!=null}function gu(){Ge(dr),Ge(Bt)}function Ry(e,t,r){if(Bt.current!==Ui)throw Error(H(168));He(Bt,t),He(dr,r)}function T_(e,t,r){var n=e.stateNode;if(t=t.childContextTypes,typeof n.getChildContext!="function")return r;n=n.getChildContext();for(var i in n)if(!(i in t))throw Error(H(108,nA(e)||"Unknown",i));return ot({},r,n)}function vu(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Ui,po=Bt.current,He(Bt,e),He(dr,dr.current),!0}function Oy(e,t,r){var n=e.stateNode;if(!n)throw Error(H(169));r?(e=T_(e,t,po),n.__reactInternalMemoizedMergedChildContext=e,Ge(dr),Ge(Bt),He(Bt,e)):Ge(dr),He(dr,r)}var Un=null,ud=!1,th=!1;function R_(e){Un===null?Un=[e]:Un.push(e)}function _T(e){ud=!0,R_(e)}function Gi(){if(!th&&Un!==null){th=!0;var e=0,t=Me;try{var r=Un;for(Me=1;e>=a,i-=a,Bn=1<<32-Qr(t)+i|r<O?(z=P,P=null):z=P.sibling;var Y=x(y,P,b[O],j);if(Y===null){P===null&&(P=z);break}e&&P&&Y.alternate===null&&t(y,P),w=o(Y,w,O),R===null?T=Y:R.sibling=Y,R=Y,P=z}if(O===b.length)return r(y,P),et&&eo(y,O),T;if(P===null){for(;OO?(z=P,P=null):z=P.sibling;var ee=x(y,P,Y.value,j);if(ee===null){P===null&&(P=z);break}e&&P&&ee.alternate===null&&t(y,P),w=o(ee,w,O),R===null?T=ee:R.sibling=ee,R=ee,P=z}if(Y.done)return r(y,P),et&&eo(y,O),T;if(P===null){for(;!Y.done;O++,Y=b.next())Y=v(y,Y.value,j),Y!==null&&(w=o(Y,w,O),R===null?T=Y:R.sibling=Y,R=Y);return et&&eo(y,O),T}for(P=n(y,P);!Y.done;O++,Y=b.next())Y=k(P,y,O,Y.value,j),Y!==null&&(e&&Y.alternate!==null&&P.delete(Y.key===null?O:Y.key),w=o(Y,w,O),R===null?T=Y:R.sibling=Y,R=Y);return e&&P.forEach(function(te){return t(y,te)}),et&&eo(y,O),T}function E(y,w,b,j){if(typeof b=="object"&&b!==null&&b.type===Xo&&b.key===null&&(b=b.props.children),typeof b=="object"&&b!==null){switch(b.$$typeof){case nc:e:{for(var T=b.key,R=w;R!==null;){if(R.key===T){if(T=b.type,T===Xo){if(R.tag===7){r(y,R.sibling),w=i(R,b.props.children),w.return=y,y=w;break e}}else if(R.elementType===T||typeof T=="object"&&T!==null&&T.$$typeof===yi&&Yy(T)===R.type){r(y,R.sibling),w=i(R,b.props),w.ref=ha(y,R,b),w.return=y,y=w;break e}r(y,R);break}else t(y,R);R=R.sibling}b.type===Xo?(w=uo(b.props.children,y.mode,j,b.key),w.return=y,y=w):(j=qc(b.type,b.key,b.props,null,y.mode,j),j.ref=ha(y,w,b),j.return=y,y=j)}return a(y);case Ko:e:{for(R=b.key;w!==null;){if(w.key===R)if(w.tag===4&&w.stateNode.containerInfo===b.containerInfo&&w.stateNode.implementation===b.implementation){r(y,w.sibling),w=i(w,b.children||[]),w.return=y,y=w;break e}else{r(y,w);break}else t(y,w);w=w.sibling}w=ch(b,y.mode,j),w.return=y,y=w}return a(y);case yi:return R=b._init,E(y,w,R(b._payload),j)}if(Ea(b))return C(y,w,b,j);if(la(b))return D(y,w,b,j);mc(y,b)}return typeof b=="string"&&b!==""||typeof b=="number"?(b=""+b,w!==null&&w.tag===6?(r(y,w.sibling),w=i(w,b),w.return=y,y=w):(r(y,w),w=lh(b,y.mode,j),w.return=y,y=w),a(y)):r(y,w)}return E}var Ds=Y_(!0),V_=Y_(!1),jl={},vn=Wi(jl),il=Wi(jl),ol=Wi(jl);function oo(e){if(e===jl)throw Error(H(174));return e}function L0(e,t){switch(He(ol,t),He(il,e),He(vn,jl),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:Im(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=Im(t,e)}Ge(vn),He(vn,t)}function Es(){Ge(vn),Ge(il),Ge(ol)}function H_(e){oo(ol.current);var t=oo(vn.current),r=Im(t,e.type);t!==r&&(He(il,e),He(vn,r))}function M0(e){il.current===e&&(Ge(vn),Ge(il))}var nt=Wi(0);function bu(e){for(var t=e;t!==null;){if(t.tag===13){var r=t.memoizedState;if(r!==null&&(r=r.dehydrated,r===null||r.data==="$?"||r.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var rh=[];function I0(){for(var e=0;er?r:4,e(!0);var n=nh.transition;nh.transition={};try{e(!1),t()}finally{Me=r,nh.transition=n}}function nx(){return Pr().memoizedState}function kT(e,t,r){var n=Li(e);if(r={lane:n,action:r,hasEagerState:!1,eagerState:null,next:null},ix(e))ox(t,r);else if(r=M_(e,t,r,n),r!==null){var i=Jt();qr(r,e,n,i),sx(r,t,n)}}function CT(e,t,r){var n=Li(e),i={lane:n,action:r,hasEagerState:!1,eagerState:null,next:null};if(ix(e))ox(t,i);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var a=t.lastRenderedState,c=o(a,r);if(i.hasEagerState=!0,i.eagerState=c,Jr(c,a)){var d=t.interleaved;d===null?(i.next=i,O0(t)):(i.next=d.next,d.next=i),t.interleaved=i;return}}catch{}finally{}r=M_(e,t,i,n),r!==null&&(i=Jt(),qr(r,e,n,i),sx(r,t,n))}}function ix(e){var t=e.alternate;return e===it||t!==null&&t===it}function ox(e,t){Ia=ku=!0;var r=e.pending;r===null?t.next=t:(t.next=r.next,r.next=t),e.pending=t}function sx(e,t,r){if(r&4194240){var n=t.lanes;n&=e.pendingLanes,r|=n,t.lanes=r,y0(e,r)}}var Cu={readContext:Or,useCallback:Vt,useContext:Vt,useEffect:Vt,useImperativeHandle:Vt,useInsertionEffect:Vt,useLayoutEffect:Vt,useMemo:Vt,useReducer:Vt,useRef:Vt,useState:Vt,useDebugValue:Vt,useDeferredValue:Vt,useTransition:Vt,useMutableSource:Vt,useSyncExternalStore:Vt,useId:Vt,unstable_isNewReconciler:!1},DT={readContext:Or,useCallback:function(e,t){return hn().memoizedState=[e,t===void 0?null:t],e},useContext:Or,useEffect:Hy,useImperativeHandle:function(e,t,r){return r=r!=null?r.concat([e]):null,Gc(4194308,4,Z_.bind(null,t,e),r)},useLayoutEffect:function(e,t){return Gc(4194308,4,e,t)},useInsertionEffect:function(e,t){return Gc(4,2,e,t)},useMemo:function(e,t){var r=hn();return t=t===void 0?null:t,e=e(),r.memoizedState=[e,t],e},useReducer:function(e,t,r){var n=hn();return t=r!==void 0?r(t):t,n.memoizedState=n.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},n.queue=e,e=e.dispatch=kT.bind(null,it,e),[n.memoizedState,e]},useRef:function(e){var t=hn();return e={current:e},t.memoizedState=e},useState:Vy,useDebugValue:H0,useDeferredValue:function(e){return hn().memoizedState=e},useTransition:function(){var e=Vy(!1),t=e[0];return e=bT.bind(null,e[1]),hn().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,r){var n=it,i=hn();if(et){if(r===void 0)throw Error(H(407));r=r()}else{if(r=t(),Pt===null)throw Error(H(349));vo&30||$_(n,t,r)}i.memoizedState=r;var o={value:r,getSnapshot:t};return i.queue=o,Hy(W_.bind(null,n,o,e),[e]),n.flags|=2048,ll(9,B_.bind(null,n,o,r,t),void 0,null),r},useId:function(){var e=hn(),t=Pt.identifierPrefix;if(et){var r=Wn,n=Bn;r=(n&~(1<<32-Qr(n)-1)).toString(32)+r,t=":"+t+"R"+r,r=sl++,0<\/script>",e=e.removeChild(e.firstChild)):typeof n.is=="string"?e=a.createElement(r,{is:n.is}):(e=a.createElement(r),r==="select"&&(a=e,n.multiple?a.multiple=!0:n.size&&(a.size=n.size))):e=a.createElementNS(e,r),e[mn]=t,e[nl]=n,px(e,t,!1,!1),t.stateNode=e;e:{switch(a=zm(r,n),r){case"dialog":Be("cancel",e),Be("close",e),i=n;break;case"iframe":case"object":case"embed":Be("load",e),i=n;break;case"video":case"audio":for(i=0;iAs&&(t.flags|=128,n=!0,ma(o,!1),t.lanes=4194304)}else{if(!n)if(e=bu(a),e!==null){if(t.flags|=128,n=!0,r=e.updateQueue,r!==null&&(t.updateQueue=r,t.flags|=4),ma(o,!0),o.tail===null&&o.tailMode==="hidden"&&!a.alternate&&!et)return Ht(t),null}else 2*ft()-o.renderingStartTime>As&&r!==1073741824&&(t.flags|=128,n=!0,ma(o,!1),t.lanes=4194304);o.isBackwards?(a.sibling=t.child,t.child=a):(r=o.last,r!==null?r.sibling=a:t.child=a,o.last=a)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=ft(),t.sibling=null,r=nt.current,He(nt,n?r&1|2:r&1),t):(Ht(t),null);case 22:case 23:return G0(),n=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==n&&(t.flags|=8192),n&&t.mode&1?gr&1073741824&&(Ht(t),t.subtreeFlags&6&&(t.flags|=8192)):Ht(t),null;case 24:return null;case 25:return null}throw Error(H(156,t.tag))}function LT(e,t){switch(E0(t),t.tag){case 1:return fr(t.type)&&gu(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Es(),Ge(dr),Ge(Bt),I0(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return M0(t),null;case 13:if(Ge(nt),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(H(340));Cs()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Ge(nt),null;case 4:return Es(),null;case 10:return R0(t.type._context),null;case 22:case 23:return G0(),null;case 24:return null;default:return null}}var gc=!1,Ut=!1,MT=typeof WeakSet=="function"?WeakSet:Set,Z=null;function is(e,t){var r=e.ref;if(r!==null)if(typeof r=="function")try{r(null)}catch(n){at(e,t,n)}else r.current=null}function dp(e,t,r){try{r()}catch(n){at(e,t,n)}}var Qy=!1;function IT(e,t){if(Km=fu,e=x_(),C0(e)){if("selectionStart"in e)var r={start:e.selectionStart,end:e.selectionEnd};else e:{r=(r=e.ownerDocument)&&r.defaultView||window;var n=r.getSelection&&r.getSelection();if(n&&n.rangeCount!==0){r=n.anchorNode;var i=n.anchorOffset,o=n.focusNode;n=n.focusOffset;try{r.nodeType,o.nodeType}catch{r=null;break e}var a=0,c=-1,d=-1,h=0,g=0,v=e,x=null;t:for(;;){for(var k;v!==r||i!==0&&v.nodeType!==3||(c=a+i),v!==o||n!==0&&v.nodeType!==3||(d=a+n),v.nodeType===3&&(a+=v.nodeValue.length),(k=v.firstChild)!==null;)x=v,v=k;for(;;){if(v===e)break t;if(x===r&&++h===i&&(c=a),x===o&&++g===n&&(d=a),(k=v.nextSibling)!==null)break;v=x,x=v.parentNode}v=k}r=c===-1||d===-1?null:{start:c,end:d}}else r=null}r=r||{start:0,end:0}}else r=null;for(Xm={focusedElem:e,selectionRange:r},fu=!1,Z=t;Z!==null;)if(t=Z,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Z=e;else for(;Z!==null;){t=Z;try{var C=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(C!==null){var D=C.memoizedProps,E=C.memoizedState,y=t.stateNode,w=y.getSnapshotBeforeUpdate(t.elementType===t.type?D:$r(t.type,D),E);y.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var b=t.stateNode.containerInfo;b.nodeType===1?b.textContent="":b.nodeType===9&&b.documentElement&&b.removeChild(b.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(H(163))}}catch(j){at(t,t.return,j)}if(e=t.sibling,e!==null){e.return=t.return,Z=e;break}Z=t.return}return C=Qy,Qy=!1,C}function Na(e,t,r){var n=t.updateQueue;if(n=n!==null?n.lastEffect:null,n!==null){var i=n=n.next;do{if((i.tag&e)===e){var o=i.destroy;i.destroy=void 0,o!==void 0&&dp(t,r,o)}i=i.next}while(i!==n)}}function hd(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var r=t=t.next;do{if((r.tag&e)===e){var n=r.create;r.destroy=n()}r=r.next}while(r!==t)}}function fp(e){var t=e.ref;if(t!==null){var r=e.stateNode;switch(e.tag){case 5:e=r;break;default:e=r}typeof t=="function"?t(e):t.current=e}}function yx(e){var t=e.alternate;t!==null&&(e.alternate=null,yx(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[mn],delete t[nl],delete t[Zm],delete t[yT],delete t[wT])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function wx(e){return e.tag===5||e.tag===3||e.tag===4}function qy(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||wx(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function hp(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.nodeType===8?r.parentNode.insertBefore(e,t):r.insertBefore(e,t):(r.nodeType===8?(t=r.parentNode,t.insertBefore(e,r)):(t=r,t.appendChild(e)),r=r._reactRootContainer,r!=null||t.onclick!==null||(t.onclick=pu));else if(n!==4&&(e=e.child,e!==null))for(hp(e,t,r),e=e.sibling;e!==null;)hp(e,t,r),e=e.sibling}function mp(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.insertBefore(e,t):r.appendChild(e);else if(n!==4&&(e=e.child,e!==null))for(mp(e,t,r),e=e.sibling;e!==null;)mp(e,t,r),e=e.sibling}var Mt=null,Wr=!1;function gi(e,t,r){for(r=r.child;r!==null;)_x(e,t,r),r=r.sibling}function _x(e,t,r){if(gn&&typeof gn.onCommitFiberUnmount=="function")try{gn.onCommitFiberUnmount(od,r)}catch{}switch(r.tag){case 5:Ut||is(r,t);case 6:var n=Mt,i=Wr;Mt=null,gi(e,t,r),Mt=n,Wr=i,Mt!==null&&(Wr?(e=Mt,r=r.stateNode,e.nodeType===8?e.parentNode.removeChild(r):e.removeChild(r)):Mt.removeChild(r.stateNode));break;case 18:Mt!==null&&(Wr?(e=Mt,r=r.stateNode,e.nodeType===8?eh(e.parentNode,r):e.nodeType===1&&eh(e,r),Za(e)):eh(Mt,r.stateNode));break;case 4:n=Mt,i=Wr,Mt=r.stateNode.containerInfo,Wr=!0,gi(e,t,r),Mt=n,Wr=i;break;case 0:case 11:case 14:case 15:if(!Ut&&(n=r.updateQueue,n!==null&&(n=n.lastEffect,n!==null))){i=n=n.next;do{var o=i,a=o.destroy;o=o.tag,a!==void 0&&(o&2||o&4)&&dp(r,t,a),i=i.next}while(i!==n)}gi(e,t,r);break;case 1:if(!Ut&&(is(r,t),n=r.stateNode,typeof n.componentWillUnmount=="function"))try{n.props=r.memoizedProps,n.state=r.memoizedState,n.componentWillUnmount()}catch(c){at(r,t,c)}gi(e,t,r);break;case 21:gi(e,t,r);break;case 22:r.mode&1?(Ut=(n=Ut)||r.memoizedState!==null,gi(e,t,r),Ut=n):gi(e,t,r);break;default:gi(e,t,r)}}function Zy(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var r=e.stateNode;r===null&&(r=e.stateNode=new MT),t.forEach(function(n){var i=BT.bind(null,e,n);r.has(n)||(r.add(n),n.then(i,i))})}}function Ur(e,t){var r=t.deletions;if(r!==null)for(var n=0;ni&&(i=a),n&=~o}if(n=i,n=ft()-n,n=(120>n?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*zT(n/1960))-n,10e?16:e,Ci===null)var n=!1;else{if(e=Ci,Ci=null,ju=0,Ee&6)throw Error(H(331));var i=Ee;for(Ee|=4,Z=e.current;Z!==null;){var o=Z,a=o.child;if(Z.flags&16){var c=o.deletions;if(c!==null){for(var d=0;dft()-B0?co(e,0):$0|=r),hr(e,t)}function jx(e,t){t===0&&(e.mode&1?(t=ac,ac<<=1,!(ac&130023424)&&(ac=4194304)):t=1);var r=Jt();e=ei(e,t),e!==null&&(Cl(e,t,r),hr(e,r))}function $T(e){var t=e.memoizedState,r=0;t!==null&&(r=t.retryLane),jx(e,r)}function BT(e,t){var r=0;switch(e.tag){case 13:var n=e.stateNode,i=e.memoizedState;i!==null&&(r=i.retryLane);break;case 19:n=e.stateNode;break;default:throw Error(H(314))}n!==null&&n.delete(t),jx(e,r)}var Ax;Ax=function(e,t,r){if(e!==null)if(e.memoizedProps!==t.pendingProps||dr.current)ur=!0;else{if(!(e.lanes&r)&&!(t.flags&128))return ur=!1,OT(e,t,r);ur=!!(e.flags&131072)}else ur=!1,et&&t.flags&1048576&&O_(t,wu,t.index);switch(t.lanes=0,t.tag){case 2:var n=t.type;Kc(e,t),e=t.pendingProps;var i=ks(t,Bt.current);ms(t,r),i=z0(null,t,n,e,i,r);var o=Y0();return t.flags|=1,typeof i=="object"&&i!==null&&typeof i.render=="function"&&i.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,fr(n)?(o=!0,vu(t)):o=!1,t.memoizedState=i.state!==null&&i.state!==void 0?i.state:null,P0(t),i.updater=dd,t.stateNode=i,i._reactInternals=t,ip(t,n,e,r),t=ap(null,t,n,!0,o,r)):(t.tag=0,et&&o&&D0(t),qt(null,t,i,r),t=t.child),t;case 16:n=t.elementType;e:{switch(Kc(e,t),e=t.pendingProps,i=n._init,n=i(n._payload),t.type=n,i=t.tag=GT(n),e=$r(n,e),i){case 0:t=sp(null,t,n,e,r);break e;case 1:t=Gy(null,t,n,e,r);break e;case 11:t=By(null,t,n,e,r);break e;case 14:t=Wy(null,t,n,$r(n.type,e),r);break e}throw Error(H(306,n,""))}return t;case 0:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:$r(n,i),sp(e,t,n,i,r);case 1:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:$r(n,i),Gy(e,t,n,i,r);case 3:e:{if(fx(t),e===null)throw Error(H(387));n=t.pendingProps,o=t.memoizedState,i=o.element,I_(e,t),Su(t,n,null,r);var a=t.memoizedState;if(n=a.element,o.isDehydrated)if(o={element:n,isDehydrated:!1,cache:a.cache,pendingSuspenseBoundaries:a.pendingSuspenseBoundaries,transitions:a.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){i=js(Error(H(423)),t),t=Ky(e,t,n,r,i);break e}else if(n!==i){i=js(Error(H(424)),t),t=Ky(e,t,n,r,i);break e}else for(yr=Ri(t.stateNode.containerInfo.firstChild),wr=t,et=!0,Gr=null,r=V_(t,null,n,r),t.child=r;r;)r.flags=r.flags&-3|4096,r=r.sibling;else{if(Cs(),n===i){t=ti(e,t,r);break e}qt(e,t,n,r)}t=t.child}return t;case 5:return H_(t),e===null&&tp(t),n=t.type,i=t.pendingProps,o=e!==null?e.memoizedProps:null,a=i.children,Qm(n,i)?a=null:o!==null&&Qm(n,o)&&(t.flags|=32),dx(e,t),qt(e,t,a,r),t.child;case 6:return e===null&&tp(t),null;case 13:return hx(e,t,r);case 4:return L0(t,t.stateNode.containerInfo),n=t.pendingProps,e===null?t.child=Ds(t,null,n,r):qt(e,t,n,r),t.child;case 11:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:$r(n,i),By(e,t,n,i,r);case 7:return qt(e,t,t.pendingProps,r),t.child;case 8:return qt(e,t,t.pendingProps.children,r),t.child;case 12:return qt(e,t,t.pendingProps.children,r),t.child;case 10:e:{if(n=t.type._context,i=t.pendingProps,o=t.memoizedProps,a=i.value,He(_u,n._currentValue),n._currentValue=a,o!==null)if(Jr(o.value,a)){if(o.children===i.children&&!dr.current){t=ti(e,t,r);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var c=o.dependencies;if(c!==null){a=o.child;for(var d=c.firstContext;d!==null;){if(d.context===n){if(o.tag===1){d=Xn(-1,r&-r),d.tag=2;var h=o.updateQueue;if(h!==null){h=h.shared;var g=h.pending;g===null?d.next=d:(d.next=g.next,g.next=d),h.pending=d}}o.lanes|=r,d=o.alternate,d!==null&&(d.lanes|=r),rp(o.return,r,t),c.lanes|=r;break}d=d.next}}else if(o.tag===10)a=o.type===t.type?null:o.child;else if(o.tag===18){if(a=o.return,a===null)throw Error(H(341));a.lanes|=r,c=a.alternate,c!==null&&(c.lanes|=r),rp(a,r,t),a=o.sibling}else a=o.child;if(a!==null)a.return=o;else for(a=o;a!==null;){if(a===t){a=null;break}if(o=a.sibling,o!==null){o.return=a.return,a=o;break}a=a.return}o=a}qt(e,t,i.children,r),t=t.child}return t;case 9:return i=t.type,n=t.pendingProps.children,ms(t,r),i=Or(i),n=n(i),t.flags|=1,qt(e,t,n,r),t.child;case 14:return n=t.type,i=$r(n,t.pendingProps),i=$r(n.type,i),Wy(e,t,n,i,r);case 15:return cx(e,t,t.type,t.pendingProps,r);case 17:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:$r(n,i),Kc(e,t),t.tag=1,fr(n)?(e=!0,vu(t)):e=!1,ms(t,r),z_(t,n,i),ip(t,n,i,r),ap(null,t,n,!0,e,r);case 19:return mx(e,t,r);case 22:return ux(e,t,r)}throw Error(H(156,t.tag))};function Tx(e,t){return r_(e,t)}function WT(e,t,r,n){this.tag=e,this.key=r,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=n,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Tr(e,t,r,n){return new WT(e,t,r,n)}function X0(e){return e=e.prototype,!(!e||!e.isReactComponent)}function GT(e){if(typeof e=="function")return X0(e)?1:0;if(e!=null){if(e=e.$$typeof,e===m0)return 11;if(e===p0)return 14}return 2}function Mi(e,t){var r=e.alternate;return r===null?(r=Tr(e.tag,t,e.key,e.mode),r.elementType=e.elementType,r.type=e.type,r.stateNode=e.stateNode,r.alternate=e,e.alternate=r):(r.pendingProps=t,r.type=e.type,r.flags=0,r.subtreeFlags=0,r.deletions=null),r.flags=e.flags&14680064,r.childLanes=e.childLanes,r.lanes=e.lanes,r.child=e.child,r.memoizedProps=e.memoizedProps,r.memoizedState=e.memoizedState,r.updateQueue=e.updateQueue,t=e.dependencies,r.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},r.sibling=e.sibling,r.index=e.index,r.ref=e.ref,r}function qc(e,t,r,n,i,o){var a=2;if(n=e,typeof e=="function")X0(e)&&(a=1);else if(typeof e=="string")a=5;else e:switch(e){case Xo:return uo(r.children,i,o,t);case h0:a=8,i|=8;break;case jm:return e=Tr(12,r,t,i|2),e.elementType=jm,e.lanes=o,e;case Am:return e=Tr(13,r,t,i),e.elementType=Am,e.lanes=o,e;case Tm:return e=Tr(19,r,t,i),e.elementType=Tm,e.lanes=o,e;case Y2:return pd(r,i,o,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case N2:a=10;break e;case z2:a=9;break e;case m0:a=11;break e;case p0:a=14;break e;case yi:a=16,n=null;break e}throw Error(H(130,e==null?e:typeof e,""))}return t=Tr(a,r,t,i),t.elementType=e,t.type=n,t.lanes=o,t}function uo(e,t,r,n){return e=Tr(7,e,n,t),e.lanes=r,e}function pd(e,t,r,n){return e=Tr(22,e,n,t),e.elementType=Y2,e.lanes=r,e.stateNode={isHidden:!1},e}function lh(e,t,r){return e=Tr(6,e,null,t),e.lanes=r,e}function ch(e,t,r){return t=Tr(4,e.children!==null?e.children:[],e.key,t),t.lanes=r,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function KT(e,t,r,n,i){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Uf(0),this.expirationTimes=Uf(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Uf(0),this.identifierPrefix=n,this.onRecoverableError=i,this.mutableSourceEagerHydrationData=null}function Q0(e,t,r,n,i,o,a,c,d){return e=new KT(e,t,r,c,d),t===1?(t=1,o===!0&&(t|=8)):t=0,o=Tr(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:n,isDehydrated:r,cache:null,transitions:null,pendingSuspenseBoundaries:null},P0(o),e}function XT(e,t,r){var n=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(r){console.error(r)}}t(),e.exports=Sr})(Qj);var s1=su;Cm.createRoot=s1.createRoot,Cm.hydrateRoot=s1.hydrateRoot;/** - * @remix-run/router v1.6.1 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function Oe(){return Oe=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u")throw new Error(t)}function _o(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function tR(){return Math.random().toString(36).substr(2,8)}function l1(e,t){return{usr:e.state,key:e.key,idx:t}}function ul(e,t,r,n){return r===void 0&&(r=null),Oe({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?xn(t):t,{state:r,key:t&&t.key||n||tR()})}function xo(e){let{pathname:t="/",search:r="",hash:n=""}=e;return r&&r!=="?"&&(t+=r.charAt(0)==="?"?r:"?"+r),n&&n!=="#"&&(t+=n.charAt(0)==="#"?n:"#"+n),t}function xn(e){let t={};if(e){let r=e.indexOf("#");r>=0&&(t.hash=e.substr(r),e=e.substr(0,r));let n=e.indexOf("?");n>=0&&(t.search=e.substr(n),e=e.substr(0,n)),e&&(t.pathname=e)}return t}function rR(e,t,r,n){n===void 0&&(n={});let{window:i=document.defaultView,v5Compat:o=!1}=n,a=i.history,c=vt.Pop,d=null,h=g();h==null&&(h=0,a.replaceState(Oe({},a.state,{idx:h}),""));function g(){return(a.state||{idx:null}).idx}function v(){c=vt.Pop;let E=g(),y=E==null?null:E-h;h=E,d&&d({action:c,location:D.location,delta:y})}function x(E,y){c=vt.Push;let w=ul(D.location,E,y);r&&r(w,E),h=g()+1;let b=l1(w,h),j=D.createHref(w);try{a.pushState(b,"",j)}catch{i.location.assign(j)}o&&d&&d({action:c,location:D.location,delta:1})}function k(E,y){c=vt.Replace;let w=ul(D.location,E,y);r&&r(w,E),h=g();let b=l1(w,h),j=D.createHref(w);a.replaceState(b,"",j),o&&d&&d({action:c,location:D.location,delta:0})}function C(E){let y=i.location.origin!=="null"?i.location.origin:i.location.href,w=typeof E=="string"?E:xo(E);return be(y,"No window.location.(origin|href) available to create URL for href: "+w),new URL(w,y)}let D={get action(){return c},get location(){return e(i,a)},listen(E){if(d)throw new Error("A history only accepts one active listener");return i.addEventListener(a1,v),d=E,()=>{i.removeEventListener(a1,v),d=null}},createHref(E){return t(i,E)},createURL:C,encodeLocation(E){let y=C(E);return{pathname:y.pathname,search:y.search,hash:y.hash}},push:x,replace:k,go(E){return a.go(E)}};return D}var St;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(St||(St={}));const nR=new Set(["lazy","caseSensitive","path","id","index","children"]);function iR(e){return e.index===!0}function Lx(e,t,r,n){return r===void 0&&(r=[]),n===void 0&&(n={}),e.map((i,o)=>{let a=[...r,o],c=typeof i.id=="string"?i.id:a.join("-");if(be(i.index!==!0||!i.children,"Cannot specify children on an index route"),be(!n[c],'Found a route id collision on id "'+c+`". Route id's must be globally unique within Data Router usages`),iR(i)){let d=Oe({},i,t(i),{id:c});return n[c]=d,d}else{let d=Oe({},i,t(i),{id:c,children:void 0});return n[c]=d,i.children&&(d.children=Lx(i.children,t,a,n)),d}})}function ss(e,t,r){r===void 0&&(r="/");let n=typeof t=="string"?xn(t):t,i=Fs(n.pathname||"/",r);if(i==null)return null;let o=Mx(e);oR(o);let a=null;for(let c=0;a==null&&c{let d={relativePath:c===void 0?o.path||"":c,caseSensitive:o.caseSensitive===!0,childrenIndex:a,route:o};d.relativePath.startsWith("/")&&(be(d.relativePath.startsWith(n),'Absolute route path "'+d.relativePath+'" nested under path '+('"'+n+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),d.relativePath=d.relativePath.slice(n.length));let h=Qn([n,d.relativePath]),g=r.concat(d);o.children&&o.children.length>0&&(be(o.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+h+'".')),Mx(o.children,t,g,h)),!(o.path==null&&!o.index)&&t.push({path:h,score:fR(h,o.index),routesMeta:g})};return e.forEach((o,a)=>{var c;if(o.path===""||!((c=o.path)!=null&&c.includes("?")))i(o,a);else for(let d of Ix(o.path))i(o,a,d)}),t}function Ix(e){let t=e.split("/");if(t.length===0)return[];let[r,...n]=t,i=r.endsWith("?"),o=r.replace(/\?$/,"");if(n.length===0)return i?[o,""]:[o];let a=Ix(n.join("/")),c=[];return c.push(...a.map(d=>d===""?o:[o,d].join("/"))),i&&c.push(...a),c.map(d=>e.startsWith("/")&&d===""?"/":d)}function oR(e){e.sort((t,r)=>t.score!==r.score?r.score-t.score:hR(t.routesMeta.map(n=>n.childrenIndex),r.routesMeta.map(n=>n.childrenIndex)))}const sR=/^:\w+$/,aR=3,lR=2,cR=1,uR=10,dR=-2,c1=e=>e==="*";function fR(e,t){let r=e.split("/"),n=r.length;return r.some(c1)&&(n+=dR),t&&(n+=lR),r.filter(i=>!c1(i)).reduce((i,o)=>i+(sR.test(o)?aR:o===""?cR:uR),n)}function hR(e,t){return e.length===t.length&&e.slice(0,-1).every((n,i)=>n===t[i])?e[e.length-1]-t[t.length-1]:0}function mR(e,t){let{routesMeta:r}=e,n={},i="/",o=[];for(let a=0;a{if(g==="*"){let x=c[v]||"";a=o.slice(0,o.length-x.length).replace(/(.)\/+$/,"$1")}return h[g]=yR(c[v]||"",g),h},{}),pathname:o,pathnameBase:a,pattern:e}}function gR(e,t,r){t===void 0&&(t=!1),r===void 0&&(r=!0),_o(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let n=[],i="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^$?{}|()[\]]/g,"\\$&").replace(/\/:(\w+)/g,(a,c)=>(n.push(c),"/([^\\/]+)"));return e.endsWith("*")?(n.push("*"),i+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?i+="\\/*$":e!==""&&e!=="/"&&(i+="(?:(?=\\/|$))"),[new RegExp(i,t?void 0:"i"),n]}function vR(e){try{return decodeURI(e)}catch(t){return _o(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function yR(e,t){try{return decodeURIComponent(e)}catch(r){return _o(!1,'The value for the URL param "'+t+'" will not be decoded because'+(' the string "'+e+'" is a malformed URL segment. This is probably')+(" due to a bad percent encoding ("+r+").")),e}}function Fs(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let r=t.endsWith("/")?t.length-1:t.length,n=e.charAt(r);return n&&n!=="/"?null:e.slice(r)||"/"}function wR(e,t){t===void 0&&(t="/");let{pathname:r,search:n="",hash:i=""}=typeof e=="string"?xn(e):e;return{pathname:r?r.startsWith("/")?r:_R(r,t):t,search:SR(n),hash:bR(i)}}function _R(e,t){let r=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(i=>{i===".."?r.length>1&&r.pop():i!=="."&&r.push(i)}),r.length>1?r.join("/"):"/"}function uh(e,t,r,n){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(n)+"]. Please separate it out to the ")+("`to."+r+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function _d(e){return e.filter((t,r)=>r===0||t.route.path&&t.route.path.length>0)}function eg(e,t,r,n){n===void 0&&(n=!1);let i;typeof e=="string"?i=xn(e):(i=Oe({},e),be(!i.pathname||!i.pathname.includes("?"),uh("?","pathname","search",i)),be(!i.pathname||!i.pathname.includes("#"),uh("#","pathname","hash",i)),be(!i.search||!i.search.includes("#"),uh("#","search","hash",i)));let o=e===""||i.pathname==="",a=o?"/":i.pathname,c;if(n||a==null)c=r;else{let v=t.length-1;if(a.startsWith("..")){let x=a.split("/");for(;x[0]==="..";)x.shift(),v-=1;i.pathname=x.join("/")}c=v>=0?t[v]:"/"}let d=wR(i,c),h=a&&a!=="/"&&a.endsWith("/"),g=(o||a===".")&&r.endsWith("/");return!d.pathname.endsWith("/")&&(h||g)&&(d.pathname+="/"),d}const Qn=e=>e.join("/").replace(/\/\/+/g,"/"),xR=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),SR=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,bR=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;class tg{constructor(t,r,n,i){i===void 0&&(i=!1),this.status=t,this.statusText=r||"",this.internal=i,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}}function Nx(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const zx=["post","put","patch","delete"],kR=new Set(zx),CR=["get",...zx],DR=new Set(CR),ER=new Set([301,302,303,307,308]),jR=new Set([307,308]),dh={state:"idle",location:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},AR={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},u1={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},Yx=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Vx=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",TR=!Vx,RR=e=>({hasErrorBoundary:!!e.hasErrorBoundary});function OR(e){be(e.routes.length>0,"You must provide a non-empty routes array to createRouter");let t;if(e.mapRouteProperties)t=e.mapRouteProperties;else if(e.detectErrorBoundary){let L=e.detectErrorBoundary;t=N=>({hasErrorBoundary:L(N)})}else t=RR;let r={},n=Lx(e.routes,t,void 0,r),i,o=e.basename||"/",a=Oe({v7_normalizeFormMethod:!1,v7_prependBasename:!1},e.future),c=null,d=new Set,h=null,g=null,v=null,x=e.hydrationData!=null,k=ss(n,e.history.location,o),C=null;if(k==null){let L=Br(404,{pathname:e.history.location.pathname}),{matches:N,route:V}=v1(n);k=N,C={[V.id]:L}}let D=!k.some(L=>L.route.lazy)&&(!k.some(L=>L.route.loader)||e.hydrationData!=null),E,y={historyAction:e.history.action,location:e.history.location,matches:k,initialized:D,navigation:dh,restoreScrollPosition:e.hydrationData!=null?!1:null,preventScrollReset:!1,revalidation:"idle",loaderData:e.hydrationData&&e.hydrationData.loaderData||{},actionData:e.hydrationData&&e.hydrationData.actionData||null,errors:e.hydrationData&&e.hydrationData.errors||C,fetchers:new Map,blockers:new Map},w=vt.Pop,b=!1,j,T=!1,R=!1,P=[],O=[],z=new Map,Y=0,ee=-1,te=new Map,G=new Set,lt=new Map,je=new Map,ze=new Map,mt=!1;function $(){return c=e.history.listen(L=>{let{action:N,location:V,delta:J}=L;if(mt){mt=!1;return}_o(ze.size===0||J!=null,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.");let re=ea({currentLocation:y.location,nextLocation:V,historyAction:N});if(re&&J!=null){mt=!0,e.history.go(J*-1),di(re,{state:"blocked",location:V,proceed(){di(re,{state:"proceeding",proceed:void 0,reset:void 0,location:V}),e.history.go(J)},reset(){Et(re),ue({blockers:new Map(E.state.blockers)})}});return}return K(N,V)}),y.initialized||K(vt.Pop,y.location),E}function le(){c&&c(),d.clear(),j&&j.abort(),y.fetchers.forEach((L,N)=>Js(N)),y.blockers.forEach((L,N)=>Et(N))}function Q(L){return d.add(L),()=>d.delete(L)}function ue(L){y=Oe({},y,L),d.forEach(N=>N(y))}function he(L,N){var V,J;let re=y.actionData!=null&&y.navigation.formMethod!=null&&Hn(y.navigation.formMethod)&&y.navigation.state==="loading"&&((V=L.state)==null?void 0:V._isRedirect)!==!0,fe;N.actionData?Object.keys(N.actionData).length>0?fe=N.actionData:fe=null:re?fe=y.actionData:fe=null;let ie=N.loaderData?g1(y.loaderData,N.loaderData,N.matches||[],N.errors):y.loaderData;for(let[ne]of ze)Et(ne);let ce=b===!0||y.navigation.formMethod!=null&&Hn(y.navigation.formMethod)&&((J=L.state)==null?void 0:J._isRedirect)!==!0;i&&(n=i,i=void 0),ue(Oe({},N,{actionData:fe,loaderData:ie,historyAction:w,location:L,initialized:!0,navigation:dh,revalidation:"idle",restoreScrollPosition:Kt(L,N.matches||y.matches),preventScrollReset:ce,blockers:new Map(y.blockers)})),T||w===vt.Pop||(w===vt.Push?e.history.push(L,L.state):w===vt.Replace&&e.history.replace(L,L.state)),w=vt.Pop,b=!1,T=!1,R=!1,P=[],O=[]}async function st(L,N){if(typeof L=="number"){e.history.go(L);return}let V=wp(y.location,y.matches,o,a.v7_prependBasename,L,N==null?void 0:N.fromRouteId,N==null?void 0:N.relative),{path:J,submission:re,error:fe}=d1(a.v7_normalizeFormMethod,!1,V,N),ie=y.location,ce=ul(y.location,J,N&&N.state);ce=Oe({},ce,e.history.encodeLocation(ce));let ne=N&&N.replace!=null?N.replace:void 0,_e=vt.Push;ne===!0?_e=vt.Replace:ne===!1||re!=null&&Hn(re.formMethod)&&re.formAction===y.location.pathname+y.location.search&&(_e=vt.Replace);let ae=N&&"preventScrollReset"in N?N.preventScrollReset===!0:void 0,_t=ea({currentLocation:ie,nextLocation:ce,historyAction:_e});if(_t){di(_t,{state:"blocked",location:ce,proceed(){di(_t,{state:"proceeding",proceed:void 0,reset:void 0,location:ce}),st(L,N)},reset(){Et(_t),ue({blockers:new Map(y.blockers)})}});return}return await K(_e,ce,{submission:re,pendingError:fe,preventScrollReset:ae,replace:N&&N.replace})}function Fe(){if(qs(),ue({revalidation:"loading"}),y.navigation.state!=="submitting"){if(y.navigation.state==="idle"){K(y.historyAction,y.location,{startUninterruptedRevalidation:!0});return}K(w||y.historyAction,y.navigation.location,{overrideNavigation:y.navigation})}}async function K(L,N,V){j&&j.abort(),j=null,w=L,T=(V&&V.startUninterruptedRevalidation)===!0,To(y.location,y.matches),b=(V&&V.preventScrollReset)===!0;let J=i||n,re=V&&V.overrideNavigation,fe=ss(J,N,o);if(!fe){let ct=Br(404,{pathname:N.pathname}),{matches:tt,route:Yt}=v1(J);pt(),he(N,{matches:tt,loaderData:{},errors:{[Yt.id]:ct}});return}if(NR(y.location,N)&&!(V&&V.submission&&Hn(V.submission.formMethod))){he(N,{matches:fe});return}j=new AbortController;let ie=va(e.history,N,j.signal,V&&V.submission),ce,ne;if(V&&V.pendingError)ne={[as(fe).route.id]:V.pendingError};else if(V&&V.submission&&Hn(V.submission.formMethod)){let ct=await zt(ie,N,V.submission,fe,{replace:V.replace});if(ct.shortCircuited)return;ce=ct.pendingActionData,ne=ct.pendingActionError,re=Oe({state:"loading",location:N},V.submission),ie=new Request(ie.url,{signal:ie.signal})}let{shortCircuited:_e,loaderData:ae,errors:_t}=await rr(ie,N,fe,re,V&&V.submission,V&&V.fetcherSubmission,V&&V.replace,ce,ne);_e||(j=null,he(N,Oe({matches:fe},ce?{actionData:ce}:{},{loaderData:ae,errors:_t})))}async function zt(L,N,V,J,re){qs();let fe=Oe({state:"submitting",location:N},V);ue({navigation:fe});let ie,ce=_p(J,N);if(!ce.route.action&&!ce.route.lazy)ie={type:St.error,error:Br(405,{method:L.method,pathname:N.pathname,routeId:ce.route.id})};else if(ie=await ga("action",L,ce,J,r,t,o),L.signal.aborted)return{shortCircuited:!0};if(gs(ie)){let ne;return re&&re.replace!=null?ne=re.replace:ne=ie.location===y.location.pathname+y.location.search,await Dr(y,ie,{submission:V,replace:ne}),{shortCircuited:!0}}if(Va(ie)){let ne=as(J,ce.route.id);return(re&&re.replace)!==!0&&(w=vt.Push),{pendingActionData:{},pendingActionError:{[ne.route.id]:ie.error}}}if(so(ie))throw Br(400,{type:"defer-action"});return{pendingActionData:{[ce.route.id]:ie.data}}}async function rr(L,N,V,J,re,fe,ie,ce,ne){let _e=J;_e||(_e=Oe({state:"loading",location:N,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},re));let ae=re||fe?re||fe:_e.formMethod&&_e.formAction&&_e.formData&&_e.formEncType?{formMethod:_e.formMethod,formAction:_e.formAction,formData:_e.formData,formEncType:_e.formEncType}:void 0,_t=i||n,[ct,tt]=f1(e.history,y,V,ae,N,R,P,O,lt,_t,o,ce,ne);if(pt(Ue=>!(V&&V.some(nr=>nr.route.id===Ue))||ct&&ct.some(nr=>nr.route.id===Ue)),ct.length===0&&tt.length===0){let Ue=Fl();return he(N,Oe({matches:V,loaderData:{},errors:ne||null},ce?{actionData:ce}:{},Ue?{fetchers:new Map(y.fetchers)}:{})),{shortCircuited:!0}}if(!T){tt.forEach(nr=>{let gt=y.fetchers.get(nr.key),Xi={state:"loading",data:gt&>.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};y.fetchers.set(nr.key,Xi)});let Ue=ce||y.actionData;ue(Oe({navigation:_e},Ue?Object.keys(Ue).length===0?{actionData:null}:{actionData:Ue}:{},tt.length>0?{fetchers:new Map(y.fetchers)}:{}))}ee=++Y,tt.forEach(Ue=>{Ue.controller&&z.set(Ue.key,Ue.controller)});let Yt=()=>tt.forEach(Ue=>ci(Ue.key));j&&j.signal.addEventListener("abort",Yt);let{results:nn,loaderResults:on,fetcherResults:Dn}=await pr(y.matches,V,ct,tt,L);if(L.signal.aborted)return{shortCircuited:!0};j&&j.signal.removeEventListener("abort",Yt),tt.forEach(Ue=>z.delete(Ue.key));let sn=y1(nn);if(sn)return await Dr(y,sn,{replace:ie}),{shortCircuited:!0};let{loaderData:En,errors:ta}=p1(y,V,ct,on,ne,tt,Dn,je);je.forEach((Ue,nr)=>{Ue.subscribe(gt=>{(gt||Ue.done)&&je.delete(nr)})});let jn=Fl(),fi=ui(ee),X=jn||fi||tt.length>0;return Oe({loaderData:En,errors:ta},X?{fetchers:new Map(y.fetchers)}:{})}function Yr(L){return y.fetchers.get(L)||AR}function Vr(L,N,V,J){if(TR)throw new Error("router.fetch() was called during the server render, but it shouldn't be. You are likely calling a useFetcher() method in the body of your component. Try moving it to a useEffect or a callback.");z.has(L)&&ci(L);let re=i||n,fe=wp(y.location,y.matches,o,a.v7_prependBasename,V,N,J==null?void 0:J.relative),ie=ss(re,fe,o);if(!ie){Zs(L,N,Br(404,{pathname:fe}));return}let{path:ce,submission:ne}=d1(a.v7_normalizeFormMethod,!0,fe,J),_e=_p(ie,ce);if(b=(J&&J.preventScrollReset)===!0,ne&&Hn(ne.formMethod)){mr(L,N,ce,_e,ie,ne);return}lt.set(L,{routeId:N,path:ce}),Ki(L,N,ce,_e,ie,ne)}async function mr(L,N,V,J,re,fe){if(qs(),lt.delete(L),!J.route.action&&!J.route.lazy){let me=Br(405,{method:fe.formMethod,pathname:V,routeId:N});Zs(L,N,me);return}let ie=y.fetchers.get(L),ce=Oe({state:"submitting"},fe,{data:ie&&ie.data," _hasFetcherDoneAnything ":!0});y.fetchers.set(L,ce),ue({fetchers:new Map(y.fetchers)});let ne=new AbortController,_e=va(e.history,V,ne.signal,fe);z.set(L,ne);let ae=await ga("action",_e,J,re,r,t,o);if(_e.signal.aborted){z.get(L)===ne&&z.delete(L);return}if(gs(ae)){z.delete(L),G.add(L);let me=Oe({state:"loading"},fe,{data:void 0," _hasFetcherDoneAnything ":!0});return y.fetchers.set(L,me),ue({fetchers:new Map(y.fetchers)}),Dr(y,ae,{submission:fe,isFetchActionRedirect:!0})}if(Va(ae)){Zs(L,N,ae.error);return}if(so(ae))throw Br(400,{type:"defer-action"});let _t=y.navigation.location||y.location,ct=va(e.history,_t,ne.signal),tt=i||n,Yt=y.navigation.state!=="idle"?ss(tt,y.navigation.location,o):y.matches;be(Yt,"Didn't find any matches after fetcher action");let nn=++Y;te.set(L,nn);let on=Oe({state:"loading",data:ae.data},fe,{" _hasFetcherDoneAnything ":!0});y.fetchers.set(L,on);let[Dn,sn]=f1(e.history,y,Yt,fe,_t,R,P,O,lt,tt,o,{[J.route.id]:ae.data},void 0);sn.filter(me=>me.key!==L).forEach(me=>{let An=me.key,Ul=y.fetchers.get(An),jt={state:"loading",data:Ul&&Ul.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};y.fetchers.set(An,jt),me.controller&&z.set(An,me.controller)}),ue({fetchers:new Map(y.fetchers)});let En=()=>sn.forEach(me=>ci(me.key));ne.signal.addEventListener("abort",En);let{results:ta,loaderResults:jn,fetcherResults:fi}=await pr(y.matches,Yt,Dn,sn,ct);if(ne.signal.aborted)return;ne.signal.removeEventListener("abort",En),te.delete(L),z.delete(L),sn.forEach(me=>z.delete(me.key));let X=y1(ta);if(X)return Dr(y,X);let{loaderData:Ue,errors:nr}=p1(y,y.matches,Dn,jn,void 0,sn,fi,je),gt={state:"idle",data:ae.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};y.fetchers.set(L,gt);let Xi=ui(nn);y.navigation.state==="loading"&&nn>ee?(be(w,"Expected pending action"),j&&j.abort(),he(y.navigation.location,{matches:Yt,loaderData:Ue,errors:nr,fetchers:new Map(y.fetchers)})):(ue(Oe({errors:nr,loaderData:g1(y.loaderData,Ue,Yt,nr)},Xi?{fetchers:new Map(y.fetchers)}:{})),R=!1)}async function Ki(L,N,V,J,re,fe){let ie=y.fetchers.get(L),ce=Oe({state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},fe,{data:ie&&ie.data," _hasFetcherDoneAnything ":!0});y.fetchers.set(L,ce),ue({fetchers:new Map(y.fetchers)});let ne=new AbortController,_e=va(e.history,V,ne.signal);z.set(L,ne);let ae=await ga("loader",_e,J,re,r,t,o);if(so(ae)&&(ae=await $x(ae,_e.signal,!0)||ae),z.get(L)===ne&&z.delete(L),_e.signal.aborted)return;if(gs(ae)){G.add(L),await Dr(y,ae);return}if(Va(ae)){let ct=as(y.matches,N);y.fetchers.delete(L),ue({fetchers:new Map(y.fetchers),errors:{[ct.route.id]:ae.error}});return}be(!so(ae),"Unhandled fetcher deferred data");let _t={state:"idle",data:ae.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};y.fetchers.set(L,_t),ue({fetchers:new Map(y.fetchers)})}async function Dr(L,N,V){var J;let{submission:re,replace:fe,isFetchActionRedirect:ie}=V===void 0?{}:V;N.revalidate&&(R=!0);let ce=ul(L.location,N.location,Oe({_isRedirect:!0},ie?{_isFetchActionRedirect:!0}:{}));if(be(ce,"Expected a location on the redirect navigation"),Yx.test(N.location)&&Vx&&typeof((J=window)==null?void 0:J.location)<"u"){let tt=e.history.createURL(N.location),Yt=Fs(tt.pathname,o)==null;if(window.location.origin!==tt.origin||Yt){fe?window.location.replace(N.location):window.location.assign(N.location);return}}j=null;let ne=fe===!0?vt.Replace:vt.Push,{formMethod:_e,formAction:ae,formEncType:_t,formData:ct}=L.navigation;!re&&_e&&ae&&ct&&_t&&(re={formMethod:_e,formAction:ae,formEncType:_t,formData:ct}),jR.has(N.status)&&re&&Hn(re.formMethod)?await K(ne,ce,{submission:Oe({},re,{formAction:N.location}),preventScrollReset:b}):ie?await K(ne,ce,{overrideNavigation:{state:"loading",location:ce,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},fetcherSubmission:re,preventScrollReset:b}):await K(ne,ce,{overrideNavigation:{state:"loading",location:ce,formMethod:re?re.formMethod:void 0,formAction:re?re.formAction:void 0,formEncType:re?re.formEncType:void 0,formData:re?re.formData:void 0},preventScrollReset:b})}async function pr(L,N,V,J,re){let fe=await Promise.all([...V.map(ne=>ga("loader",re,ne,N,r,t,o)),...J.map(ne=>ne.matches&&ne.match&&ne.controller?ga("loader",va(e.history,ne.path,ne.controller.signal),ne.match,ne.matches,r,t,o):{type:St.error,error:Br(404,{pathname:ne.path})})]),ie=fe.slice(0,V.length),ce=fe.slice(V.length);return await Promise.all([w1(L,V,ie,ie.map(()=>re.signal),!1,y.loaderData),w1(L,J.map(ne=>ne.match),ce,J.map(ne=>ne.controller?ne.controller.signal:null),!0)]),{results:fe,loaderResults:ie,fetcherResults:ce}}function qs(){R=!0,P.push(...pt()),lt.forEach((L,N)=>{z.has(N)&&(O.push(N),ci(N))})}function Zs(L,N,V){let J=as(y.matches,N);Js(L),ue({errors:{[J.route.id]:V},fetchers:new Map(y.fetchers)})}function Js(L){z.has(L)&&ci(L),lt.delete(L),te.delete(L),G.delete(L),y.fetchers.delete(L)}function ci(L){let N=z.get(L);be(N,"Expected fetch controller: "+L),N.abort(),z.delete(L)}function Hl(L){for(let N of L){let J={state:"idle",data:Yr(N).data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};y.fetchers.set(N,J)}}function Fl(){let L=[],N=!1;for(let V of G){let J=y.fetchers.get(V);be(J,"Expected fetcher: "+V),J.state==="loading"&&(G.delete(V),L.push(V),N=!0)}return Hl(L),N}function ui(L){let N=[];for(let[V,J]of te)if(J0}function Dt(L,N){let V=y.blockers.get(L)||u1;return ze.get(L)!==N&&ze.set(L,N),V}function Et(L){y.blockers.delete(L),ze.delete(L)}function di(L,N){let V=y.blockers.get(L)||u1;be(V.state==="unblocked"&&N.state==="blocked"||V.state==="blocked"&&N.state==="blocked"||V.state==="blocked"&&N.state==="proceeding"||V.state==="blocked"&&N.state==="unblocked"||V.state==="proceeding"&&N.state==="unblocked","Invalid blocker state transition: "+V.state+" -> "+N.state),y.blockers.set(L,N),ue({blockers:new Map(y.blockers)})}function ea(L){let{currentLocation:N,nextLocation:V,historyAction:J}=L;if(ze.size===0)return;ze.size>1&&_o(!1,"A router only supports one blocker at a time");let re=Array.from(ze.entries()),[fe,ie]=re[re.length-1],ce=y.blockers.get(fe);if(!(ce&&ce.state==="proceeding")&&ie({currentLocation:N,nextLocation:V,historyAction:J}))return fe}function pt(L){let N=[];return je.forEach((V,J)=>{(!L||L(J))&&(V.cancel(),N.push(J),je.delete(J))}),N}function _f(L,N,V){if(h=L,v=N,g=V||(J=>J.key),!x&&y.navigation===dh){x=!0;let J=Kt(y.location,y.matches);J!=null&&ue({restoreScrollPosition:J})}return()=>{h=null,v=null,g=null}}function To(L,N){if(h&&g&&v){let V=N.map(re=>_1(re,y.loaderData)),J=g(L,V)||L.key;h[J]=v()}}function Kt(L,N){if(h&&g&&v){let V=N.map(fe=>_1(fe,y.loaderData)),J=g(L,V)||L.key,re=h[J];if(typeof re=="number")return re}return null}function ge(L){i=L}return E={get basename(){return o},get state(){return y},get routes(){return n},initialize:$,subscribe:Q,enableScrollRestoration:_f,navigate:st,fetch:Vr,revalidate:Fe,createHref:L=>e.history.createHref(L),encodeLocation:L=>e.history.encodeLocation(L),getFetcher:Yr,deleteFetcher:Js,dispose:le,getBlocker:Dt,deleteBlocker:Et,_internalFetchControllers:z,_internalActiveDeferreds:je,_internalSetRoutes:ge},E}function PR(e){return e!=null&&"formData"in e}function wp(e,t,r,n,i,o,a){let c,d;if(o!=null&&a!=="path"){c=[];for(let g of t)if(c.push(g),g.route.id===o){d=g;break}}else c=t,d=t[t.length-1];let h=eg(i||".",_d(c).map(g=>g.pathnameBase),Fs(e.pathname,r)||e.pathname,a==="path");return i==null&&(h.search=e.search,h.hash=e.hash),(i==null||i===""||i===".")&&d&&d.route.index&&!rg(h.search)&&(h.search=h.search?h.search.replace(/^\?/,"?index&"):"?index"),n&&r!=="/"&&(h.pathname=h.pathname==="/"?r:Qn([r,h.pathname])),xo(h)}function d1(e,t,r,n){if(!n||!PR(n))return{path:r};if(n.formMethod&&!VR(n.formMethod))return{path:r,error:Br(405,{method:n.formMethod})};let i;if(n.formData){let c=n.formMethod||"get";if(i={formMethod:e?c.toUpperCase():c.toLowerCase(),formAction:Ux(r),formEncType:n&&n.formEncType||"application/x-www-form-urlencoded",formData:n.formData},Hn(i.formMethod))return{path:r,submission:i}}let o=xn(r),a=Fx(n.formData);return t&&o.search&&rg(o.search)&&a.append("index",""),o.search="?"+a,{path:xo(o),submission:i}}function LR(e,t){let r=e;if(t){let n=e.findIndex(i=>i.route.id===t);n>=0&&(r=e.slice(0,n))}return r}function f1(e,t,r,n,i,o,a,c,d,h,g,v,x){let k=x?Object.values(x)[0]:v?Object.values(v)[0]:void 0,C=e.createURL(t.location),D=e.createURL(i),E=x?Object.keys(x)[0]:void 0,w=LR(r,E).filter((j,T)=>{if(j.route.lazy)return!0;if(j.route.loader==null)return!1;if(MR(t.loaderData,t.matches[T],j)||a.some(O=>O===j.route.id))return!0;let R=t.matches[T],P=j;return h1(j,Oe({currentUrl:C,currentParams:R.params,nextUrl:D,nextParams:P.params},n,{actionResult:k,defaultShouldRevalidate:o||C.pathname+C.search===D.pathname+D.search||C.search!==D.search||Hx(R,P)}))}),b=[];return d.forEach((j,T)=>{if(!r.some(z=>z.route.id===j.routeId))return;let R=ss(h,j.path,g);if(!R){b.push({key:T,routeId:j.routeId,path:j.path,matches:null,match:null,controller:null});return}let P=_p(R,j.path);if(c.includes(T)){b.push({key:T,routeId:j.routeId,path:j.path,matches:R,match:P,controller:new AbortController});return}h1(P,Oe({currentUrl:C,currentParams:t.matches[t.matches.length-1].params,nextUrl:D,nextParams:r[r.length-1].params},n,{actionResult:k,defaultShouldRevalidate:o}))&&b.push({key:T,routeId:j.routeId,path:j.path,matches:R,match:P,controller:new AbortController})}),[w,b]}function MR(e,t,r){let n=!t||r.route.id!==t.route.id,i=e[r.route.id]===void 0;return n||i}function Hx(e,t){let r=e.route.path;return e.pathname!==t.pathname||r!=null&&r.endsWith("*")&&e.params["*"]!==t.params["*"]}function h1(e,t){if(e.route.shouldRevalidate){let r=e.route.shouldRevalidate(t);if(typeof r=="boolean")return r}return t.defaultShouldRevalidate}async function m1(e,t,r){if(!e.lazy)return;let n=await e.lazy();if(!e.lazy)return;let i=r[e.id];be(i,"No route found in manifest");let o={};for(let a in n){let d=i[a]!==void 0&&a!=="hasErrorBoundary";_o(!d,'Route "'+i.id+'" has a static property "'+a+'" defined but its lazy function is also returning a value for this property. '+('The lazy route property "'+a+'" will be ignored.')),!d&&!nR.has(a)&&(o[a]=n[a])}Object.assign(i,o),Object.assign(i,Oe({},t(i),{lazy:void 0}))}async function ga(e,t,r,n,i,o,a,c,d,h){c===void 0&&(c=!1),d===void 0&&(d=!1);let g,v,x,k=E=>{let y,w=new Promise((b,j)=>y=j);return x=()=>y(),t.signal.addEventListener("abort",x),Promise.race([E({request:t,params:r.params,context:h}),w])};try{let E=r.route[e];if(r.route.lazy)if(E)v=(await Promise.all([k(E),m1(r.route,o,i)]))[0];else if(await m1(r.route,o,i),E=r.route[e],E)v=await k(E);else if(e==="action"){let y=new URL(t.url),w=y.pathname+y.search;throw Br(405,{method:t.method,pathname:w,routeId:r.route.id})}else return{type:St.data,data:void 0};else if(E)v=await k(E);else{let y=new URL(t.url),w=y.pathname+y.search;throw Br(404,{pathname:w})}be(v!==void 0,"You defined "+(e==="action"?"an action":"a loader")+" for route "+('"'+r.route.id+"\" but didn't return anything from your `"+e+"` ")+"function. Please return a value or `null`.")}catch(E){g=St.error,v=E}finally{x&&t.signal.removeEventListener("abort",x)}if(YR(v)){let E=v.status;if(ER.has(E)){let b=v.headers.get("Location");if(be(b,"Redirects returned/thrown from loaders/actions must have a Location header"),!Yx.test(b))b=wp(new URL(t.url),n.slice(0,n.indexOf(r)+1),a,!0,b);else if(!c){let j=new URL(t.url),T=b.startsWith("//")?new URL(j.protocol+b):new URL(b),R=Fs(T.pathname,a)!=null;T.origin===j.origin&&R&&(b=T.pathname+T.search+T.hash)}if(c)throw v.headers.set("Location",b),v;return{type:St.redirect,status:E,location:b,revalidate:v.headers.get("X-Remix-Revalidate")!==null}}if(d)throw{type:g||St.data,response:v};let y,w=v.headers.get("Content-Type");return w&&/\bapplication\/json\b/.test(w)?y=await v.json():y=await v.text(),g===St.error?{type:g,error:new tg(E,v.statusText,y),headers:v.headers}:{type:St.data,data:y,statusCode:v.status,headers:v.headers}}if(g===St.error)return{type:g,error:v};if(zR(v)){var C,D;return{type:St.deferred,deferredData:v,statusCode:(C=v.init)==null?void 0:C.status,headers:((D=v.init)==null?void 0:D.headers)&&new Headers(v.init.headers)}}return{type:St.data,data:v}}function va(e,t,r,n){let i=e.createURL(Ux(t)).toString(),o={signal:r};if(n&&Hn(n.formMethod)){let{formMethod:a,formEncType:c,formData:d}=n;o.method=a.toUpperCase(),o.body=c==="application/x-www-form-urlencoded"?Fx(d):d}return new Request(i,o)}function Fx(e){let t=new URLSearchParams;for(let[r,n]of e.entries())t.append(r,n instanceof File?n.name:n);return t}function IR(e,t,r,n,i){let o={},a=null,c,d=!1,h={};return r.forEach((g,v)=>{let x=t[v].route.id;if(be(!gs(g),"Cannot handle redirect results in processLoaderData"),Va(g)){let k=as(e,x),C=g.error;n&&(C=Object.values(n)[0],n=void 0),a=a||{},a[k.route.id]==null&&(a[k.route.id]=C),o[x]=void 0,d||(d=!0,c=Nx(g.error)?g.error.status:500),g.headers&&(h[x]=g.headers)}else so(g)?(i.set(x,g.deferredData),o[x]=g.deferredData.data):o[x]=g.data,g.statusCode!=null&&g.statusCode!==200&&!d&&(c=g.statusCode),g.headers&&(h[x]=g.headers)}),n&&(a=n,o[Object.keys(n)[0]]=void 0),{loaderData:o,errors:a,statusCode:c||200,loaderHeaders:h}}function p1(e,t,r,n,i,o,a,c){let{loaderData:d,errors:h}=IR(t,r,n,i,c);for(let g=0;gn.route.id===t)+1):[...e]).reverse().find(n=>n.route.hasErrorBoundary===!0)||e[0]}function v1(e){let t=e.find(r=>r.index||!r.path||r.path==="/")||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:t}],route:t}}function Br(e,t){let{pathname:r,routeId:n,method:i,type:o}=t===void 0?{}:t,a="Unknown Server Error",c="Unknown @remix-run/router error";return e===400?(a="Bad Request",i&&r&&n?c="You made a "+i+' request to "'+r+'" but '+('did not provide a `loader` for route "'+n+'", ')+"so there is no way to handle the request.":o==="defer-action"&&(c="defer() is not supported in actions")):e===403?(a="Forbidden",c='Route "'+n+'" does not match URL "'+r+'"'):e===404?(a="Not Found",c='No route matches URL "'+r+'"'):e===405&&(a="Method Not Allowed",i&&r&&n?c="You made a "+i.toUpperCase()+' request to "'+r+'" but '+('did not provide an `action` for route "'+n+'", ')+"so there is no way to handle the request.":i&&(c='Invalid request method "'+i.toUpperCase()+'"')),new tg(e||500,a,new Error(c),!0)}function y1(e){for(let t=e.length-1;t>=0;t--){let r=e[t];if(gs(r))return r}}function Ux(e){let t=typeof e=="string"?xn(e):e;return xo(Oe({},t,{hash:""}))}function NR(e,t){return e.pathname!==t.pathname||e.search!==t.search?!1:e.hash===""?t.hash!=="":e.hash===t.hash?!0:t.hash!==""}function so(e){return e.type===St.deferred}function Va(e){return e.type===St.error}function gs(e){return(e&&e.type)===St.redirect}function zR(e){let t=e;return t&&typeof t=="object"&&typeof t.data=="object"&&typeof t.subscribe=="function"&&typeof t.cancel=="function"&&typeof t.resolveData=="function"}function YR(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.headers=="object"&&typeof e.body<"u"}function VR(e){return DR.has(e.toLowerCase())}function Hn(e){return kR.has(e.toLowerCase())}async function w1(e,t,r,n,i,o){for(let a=0;av.route.id===d.route.id),g=h!=null&&!Hx(h,d)&&(o&&o[d.route.id])!==void 0;if(so(c)&&(i||g)){let v=n[a];be(v,"Expected an AbortSignal for revalidating fetcher deferred result"),await $x(c,v,i).then(x=>{x&&(r[a]=x||r[a])})}}}async function $x(e,t,r){if(r===void 0&&(r=!1),!await e.deferredData.resolveData(t)){if(r)try{return{type:St.data,data:e.deferredData.unwrappedData}}catch(i){return{type:St.error,error:i}}return{type:St.data,data:e.deferredData.data}}}function rg(e){return new URLSearchParams(e).getAll("index").some(t=>t==="")}function _1(e,t){let{route:r,pathname:n,params:i}=e;return{id:r.id,pathname:n,params:i,data:t[r.id],handle:r.handle}}function _p(e,t){let r=typeof t=="string"?xn(t).search:t.search;if(e[e.length-1].route.index&&rg(r||""))return e[e.length-1];let n=_d(e);return n[n.length-1]}/** - * React Router v6.11.1 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function Ru(){return Ru=Object.assign?Object.assign.bind():function(e){for(var t=1;tc.pathnameBase)),o=I.useRef(!1);return Gx(()=>{o.current=!0}),I.useCallback(function(c,d){if(d===void 0&&(d={}),!o.current)return;if(typeof c=="number"){t.go(c);return}let h=eg(c,JSON.parse(i),n,d.relative==="path");e!=="/"&&(h.pathname=h.pathname==="/"?e:Qn([e,h.pathname])),(d.replace?t.replace:t.push)(h,d.state,d)},[e,t,i,n])}const UR=I.createContext(null);function $R(e){let t=I.useContext(oi).outlet;return t&&I.createElement(UR.Provider,{value:e},t)}function Sn(){let{matches:e}=I.useContext(oi),t=e[e.length-1];return t?t.params:{}}function Kx(e,t){let{relative:r}=t===void 0?{}:t,{matches:n}=I.useContext(oi),{pathname:i}=si(),o=JSON.stringify(_d(n).map(a=>a.pathnameBase));return I.useMemo(()=>eg(e,JSON.parse(o),i,r==="path"),[e,o,i,r])}function BR(e,t,r){Al()||be(!1);let{navigator:n}=I.useContext(Us),{matches:i}=I.useContext(oi),o=i[i.length-1],a=o?o.params:{};o&&o.pathname;let c=o?o.pathnameBase:"/";o&&o.route;let d=si(),h;if(t){var g;let D=typeof t=="string"?xn(t):t;c==="/"||(g=D.pathname)!=null&&g.startsWith(c)||be(!1),h=D}else h=d;let v=h.pathname||"/",x=c==="/"?v:v.slice(c.length)||"/",k=ss(e,{pathname:x}),C=QR(k&&k.map(D=>Object.assign({},D,{params:Object.assign({},a,D.params),pathname:Qn([c,n.encodeLocation?n.encodeLocation(D.pathname).pathname:D.pathname]),pathnameBase:D.pathnameBase==="/"?c:Qn([c,n.encodeLocation?n.encodeLocation(D.pathnameBase).pathname:D.pathnameBase])})),i,r);return t&&C?I.createElement(xd.Provider,{value:{location:Ru({pathname:"/",search:"",hash:"",state:null,key:"default"},h),navigationType:vt.Pop}},C):C}function WR(){let e=eO(),t=Nx(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),r=e instanceof Error?e.stack:null,i={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"},o=null;return I.createElement(I.Fragment,null,I.createElement("h2",null,"Unexpected Application Error!"),I.createElement("h3",{style:{fontStyle:"italic"}},t),r?I.createElement("pre",{style:i},r):null,o)}const GR=I.createElement(WR,null);class KR extends I.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,r){return r.location!==t.location||r.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error||r.error,location:r.location,revalidation:t.revalidation||r.revalidation}}componentDidCatch(t,r){console.error("React Router caught the following error during render",t,r)}render(){return this.state.error?I.createElement(oi.Provider,{value:this.props.routeContext},I.createElement(Wx.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function XR(e){let{routeContext:t,match:r,children:n}=e,i=I.useContext(ng);return i&&i.static&&i.staticContext&&(r.route.errorElement||r.route.ErrorBoundary)&&(i.staticContext._deepestRenderedBoundaryId=r.route.id),I.createElement(oi.Provider,{value:t},n)}function QR(e,t,r){var n;if(t===void 0&&(t=[]),r===void 0&&(r=null),e==null){var i;if((i=r)!=null&&i.errors)e=r.matches;else return null}let o=e,a=(n=r)==null?void 0:n.errors;if(a!=null){let c=o.findIndex(d=>d.route.id&&(a==null?void 0:a[d.route.id]));c>=0||be(!1),o=o.slice(0,Math.min(o.length,c+1))}return o.reduceRight((c,d,h)=>{let g=d.route.id?a==null?void 0:a[d.route.id]:null,v=null;r&&(v=d.route.errorElement||GR);let x=t.concat(o.slice(0,h+1)),k=()=>{let C;return g?C=v:d.route.Component?C=I.createElement(d.route.Component,null):d.route.element?C=d.route.element:C=c,I.createElement(XR,{match:d,routeContext:{outlet:c,matches:x,isDataRoute:r!=null},children:C})};return r&&(d.route.ErrorBoundary||d.route.errorElement||h===0)?I.createElement(KR,{location:r.location,revalidation:r.revalidation,component:v,error:g,children:k(),routeContext:{outlet:null,matches:x,isDataRoute:!0}}):k()},null)}var xp;(function(e){e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate"})(xp||(xp={}));var dl;(function(e){e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId"})(dl||(dl={}));function qR(e){let t=I.useContext(ng);return t||be(!1),t}function ZR(e){let t=I.useContext(Bx);return t||be(!1),t}function JR(e){let t=I.useContext(oi);return t||be(!1),t}function Xx(e){let t=JR(),r=t.matches[t.matches.length-1];return r.route.id||be(!1),r.route.id}function eO(){var e;let t=I.useContext(Wx),r=ZR(dl.UseRouteError),n=Xx(dl.UseRouteError);return t||((e=r.errors)==null?void 0:e[n])}function tO(){let{router:e}=qR(xp.UseNavigateStable),t=Xx(dl.UseNavigateStable),r=I.useRef(!1);return Gx(()=>{r.current=!0}),I.useCallback(function(i,o){o===void 0&&(o={}),r.current&&(typeof i=="number"?e.navigate(i):e.navigate(i,Ru({fromRouteId:t},o)))},[e,t])}function rO(e){let{fallbackElement:t,router:r}=e,[n,i]=I.useState(r.state);I.useLayoutEffect(()=>r.subscribe(i),[r,i]);let o=I.useMemo(()=>({createHref:r.createHref,encodeLocation:r.encodeLocation,go:d=>r.navigate(d),push:(d,h,g)=>r.navigate(d,{state:h,preventScrollReset:g==null?void 0:g.preventScrollReset}),replace:(d,h,g)=>r.navigate(d,{replace:!0,state:h,preventScrollReset:g==null?void 0:g.preventScrollReset})}),[r]),a=r.basename||"/",c=I.useMemo(()=>({router:r,navigator:o,static:!1,basename:a}),[r,o,a]);return I.createElement(I.Fragment,null,I.createElement(ng.Provider,{value:c},I.createElement(Bx.Provider,{value:n},I.createElement(oO,{basename:r.basename,location:r.state.location,navigationType:r.state.historyAction,navigator:o},r.state.initialized?I.createElement(nO,{routes:r.routes,state:n}):t))),null)}function nO(e){let{routes:t,state:r}=e;return BR(t,void 0,r)}function iO(e){return $R(e.context)}function oO(e){let{basename:t="/",children:r=null,location:n,navigationType:i=vt.Pop,navigator:o,static:a=!1}=e;Al()&&be(!1);let c=t.replace(/^\/*/,"/"),d=I.useMemo(()=>({basename:c,navigator:o,static:a}),[c,o,a]);typeof n=="string"&&(n=xn(n));let{pathname:h="/",search:g="",hash:v="",state:x=null,key:k="default"}=n,C=I.useMemo(()=>{let D=Fs(h,c);return D==null?null:{location:{pathname:D,search:g,hash:v,state:x,key:k},navigationType:i}},[c,h,g,v,x,k,i]);return C==null?null:I.createElement(Us.Provider,{value:d},I.createElement(xd.Provider,{children:r,value:C}))}var x1;(function(e){e[e.pending=0]="pending",e[e.success=1]="success",e[e.error=2]="error"})(x1||(x1={}));new Promise(()=>{});function sO(e){let t={hasErrorBoundary:e.ErrorBoundary!=null||e.errorElement!=null};return e.Component&&Object.assign(t,{element:I.createElement(e.Component),Component:void 0}),e.ErrorBoundary&&Object.assign(t,{errorElement:I.createElement(e.ErrorBoundary),ErrorBoundary:void 0}),t}/** - * React Router DOM v6.11.1 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function fl(){return fl=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&(r[i]=e[i]);return r}function lO(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function cO(e,t){return e.button===0&&(!t||t==="_self")&&!lO(e)}const uO=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset"];function dO(e,t){return OR({basename:t==null?void 0:t.basename,future:fl({},t==null?void 0:t.future,{v7_prependBasename:!0}),history:eR({window:t==null?void 0:t.window}),hydrationData:(t==null?void 0:t.hydrationData)||fO(),routes:e,mapRouteProperties:sO}).initialize()}function fO(){var e;let t=(e=window)==null?void 0:e.__staticRouterHydrationData;return t&&t.errors&&(t=fl({},t,{errors:hO(t.errors)})),t}function hO(e){if(!e)return null;let t=Object.entries(e),r={};for(let[n,i]of t)if(i&&i.__type==="RouteErrorResponse")r[n]=new tg(i.status,i.statusText,i.data,i.internal===!0);else if(i&&i.__type==="Error"){let o=new Error(i.message);o.stack="",r[n]=o}else r[n]=i;return r}const mO=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",pO=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,wc=I.forwardRef(function(t,r){let{onClick:n,relative:i,reloadDocument:o,replace:a,state:c,target:d,to:h,preventScrollReset:g}=t,v=aO(t,uO),{basename:x}=I.useContext(Us),k,C=!1;if(typeof h=="string"&&pO.test(h)&&(k=h,mO))try{let w=new URL(window.location.href),b=h.startsWith("//")?new URL(w.protocol+h):new URL(h),j=Fs(b.pathname,x);b.origin===w.origin&&j!=null?h=j+b.search+b.hash:C=!0}catch{}let D=HR(h,{relative:i}),E=gO(h,{replace:a,state:c,target:d,preventScrollReset:g,relative:i});function y(w){n&&n(w),w.defaultPrevented||E(w)}return I.createElement("a",fl({},v,{href:k||D,onClick:C||o?n:y,ref:r,target:d}))});var S1;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmitImpl="useSubmitImpl",e.UseFetcher="useFetcher"})(S1||(S1={}));var b1;(function(e){e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(b1||(b1={}));function gO(e,t){let{target:r,replace:n,state:i,preventScrollReset:o,relative:a}=t===void 0?{}:t,c=ht(),d=si(),h=Kx(e,{relative:a});return I.useCallback(g=>{if(cO(g,r)){g.preventDefault();let v=n!==void 0?n:xo(d)===xo(h);c(e,{replace:v,state:i,preventScrollReset:o,relative:a})}},[d,c,h,n,i,r,e,o,a])}var Ot=function(){return Ot=Object.assign||function(t){for(var r,n=1,i=arguments.length;n0?Tt($s,--Lr):0,Rs--,yt===10&&(Rs=1,bd--),yt}function Zr(){return yt=Lr2||Sp(yt)>3?"":" "}function jO(e,t){for(;--t&&Zr()&&!(yt<48||yt>102||yt>57&&yt<65||yt>70&&yt<97););return Cd(e,Jc()+(t<6&&fo()==32&&Zr()==32))}function bp(e){for(;Zr();)switch(yt){case e:return Lr;case 34:case 39:e!==34&&e!==39&&bp(yt);break;case 40:e===41&&bp(e);break;case 92:Zr();break}return Lr}function AO(e,t){for(;Zr()&&e+yt!==47+10;)if(e+yt===42+42&&fo()===47)break;return"/*"+Cd(t,Lr-1)+"*"+og(e===47?e:Zr())}function TO(e){for(;!Sp(fo());)Zr();return Cd(e,Lr)}function RO(e){return DO(eu("",null,null,null,[""],e=CO(e),0,[0],e))}function eu(e,t,r,n,i,o,a,c,d){for(var h=0,g=0,v=a,x=0,k=0,C=0,D=1,E=1,y=1,w=0,b="",j=i,T=o,R=n,P=b;E;)switch(C=w,w=Zr()){case 40:if(C!=108&&Tt(P,v-1)==58){Zc(P+=ye(fh(w),"&","&\f"),"&\f")!=-1&&(y=-1);break}case 34:case 39:case 91:P+=fh(w);break;case 9:case 10:case 13:case 32:P+=EO(C);break;case 92:P+=jO(Jc()-1,7);continue;case 47:switch(fo()){case 42:case 47:_c(OO(AO(Zr(),Jc()),t,r),d);break;default:P+="/"}break;case 123*D:c[h++]=$n(P)*y;case 125*D:case 59:case 0:switch(w){case 0:case 125:E=0;case 59+g:y==-1&&(P=ye(P,/\f/g,"")),k>0&&$n(P)-v&&_c(k>32?C1(P+";",n,r,v-1):C1(ye(P," ","")+";",n,r,v-2),d);break;case 59:P+=";";default:if(_c(R=k1(P,t,r,h,g,i,c,b,j=[],T=[],v),o),w===123)if(g===0)eu(P,t,R,R,j,o,v,c,T);else switch(x===99&&Tt(P,3)===110?100:x){case 100:case 108:case 109:case 115:eu(e,R,R,n&&_c(k1(e,R,R,0,0,i,c,b,i,j=[],v),T),i,T,v,c,n?j:T);break;default:eu(P,R,R,R,[""],T,0,c,T)}}h=g=k=0,D=y=1,b=P="",v=a;break;case 58:v=1+$n(P),k=C;default:if(D<1){if(w==123)--D;else if(w==125&&D++==0&&kO()==125)continue}switch(P+=og(w),w*D){case 38:y=g>0?1:(P+="\f",-1);break;case 44:c[h++]=($n(P)-1)*y,y=1;break;case 64:fo()===45&&(P+=fh(Zr())),x=fo(),g=v=$n(b=P+=TO(Jc())),w++;break;case 45:C===45&&$n(P)==2&&(D=0)}}return o}function k1(e,t,r,n,i,o,a,c,d,h,g){for(var v=i-1,x=i===0?o:[""],k=sg(x),C=0,D=0,E=0;C0?x[y]+" "+w:ye(w,/&\f/g,x[y])))&&(d[E++]=b);return kd(e,t,r,i===0?Sd:c,d,h,g)}function OO(e,t,r){return kd(e,t,r,Qx,og(bO()),Ts(e,2,-2),0)}function C1(e,t,r,n){return kd(e,t,r,ig,Ts(e,0,n),Ts(e,n+1,-1),n)}function eS(e,t,r){switch(xO(e,t)){case 5103:return Le+"print-"+e+e;case 5737:case 4201:case 3177:case 3433:case 1641:case 4457:case 2921:case 5572:case 6356:case 5844:case 3191:case 6645:case 3005:case 6391:case 5879:case 5623:case 6135:case 4599:case 4855:case 4215:case 6389:case 5109:case 5365:case 5621:case 3829:return Le+e+e;case 4789:return Ha+e+e;case 5349:case 4246:case 4810:case 6968:case 2756:return Le+e+Ha+e+We+e+e;case 5936:switch(Tt(e,t+11)){case 114:return Le+e+We+ye(e,/[svh]\w+-[tblr]{2}/,"tb")+e;case 108:return Le+e+We+ye(e,/[svh]\w+-[tblr]{2}/,"tb-rl")+e;case 45:return Le+e+We+ye(e,/[svh]\w+-[tblr]{2}/,"lr")+e}case 6828:case 4268:case 2903:return Le+e+We+e+e;case 6165:return Le+e+We+"flex-"+e+e;case 5187:return Le+e+ye(e,/(\w+).+(:[^]+)/,Le+"box-$1$2"+We+"flex-$1$2")+e;case 5443:return Le+e+We+"flex-item-"+ye(e,/flex-|-self/g,"")+(vi(e,/flex-|baseline/)?"":We+"grid-row-"+ye(e,/flex-|-self/g,""))+e;case 4675:return Le+e+We+"flex-line-pack"+ye(e,/align-content|flex-|-self/g,"")+e;case 5548:return Le+e+We+ye(e,"shrink","negative")+e;case 5292:return Le+e+We+ye(e,"basis","preferred-size")+e;case 6060:return Le+"box-"+ye(e,"-grow","")+Le+e+We+ye(e,"grow","positive")+e;case 4554:return Le+ye(e,/([^-])(transform)/g,"$1"+Le+"$2")+e;case 6187:return ye(ye(ye(e,/(zoom-|grab)/,Le+"$1"),/(image-set)/,Le+"$1"),e,"")+e;case 5495:case 3959:return ye(e,/(image-set\([^]*)/,Le+"$1$`$1");case 4968:return ye(ye(e,/(.+:)(flex-)?(.*)/,Le+"box-pack:$3"+We+"flex-pack:$3"),/s.+-b[^;]+/,"justify")+Le+e+e;case 4200:if(!vi(e,/flex-|baseline/))return We+"grid-column-align"+Ts(e,t)+e;break;case 2592:case 3360:return We+ye(e,"template-","")+e;case 4384:case 3616:return r&&r.some(function(n,i){return t=i,vi(n.props,/grid-\w+-end/)})?~Zc(e+(r=r[t].value),"span")?e:We+ye(e,"-start","")+e+We+"grid-row-span:"+(~Zc(r,"span")?vi(r,/\d+/):+vi(r,/\d+/)-+vi(e,/\d+/))+";":We+ye(e,"-start","")+e;case 4896:case 4128:return r&&r.some(function(n){return vi(n.props,/grid-\w+-start/)})?e:We+ye(ye(e,"-end","-span"),"span ","")+e;case 4095:case 3583:case 4068:case 2532:return ye(e,/(.+)-inline(.+)/,Le+"$1$2")+e;case 8116:case 7059:case 5753:case 5535:case 5445:case 5701:case 4933:case 4677:case 5533:case 5789:case 5021:case 4765:if($n(e)-1-t>6)switch(Tt(e,t+1)){case 109:if(Tt(e,t+4)!==45)break;case 102:return ye(e,/(.+:)(.+)-([^]+)/,"$1"+Le+"$2-$3$1"+Ha+(Tt(e,t+3)==108?"$3":"$2-$3"))+e;case 115:return~Zc(e,"stretch")?eS(ye(e,"stretch","fill-available"),t,r)+e:e}break;case 5152:case 5920:return ye(e,/(.+?):(\d+)(\s*\/\s*(span)?\s*(\d+))?(.*)/,function(n,i,o,a,c,d,h){return We+i+":"+o+h+(a?We+i+"-span:"+(c?d:+d-+o)+h:"")+e});case 4949:if(Tt(e,t+6)===121)return ye(e,":",":"+Le)+e;break;case 6444:switch(Tt(e,Tt(e,14)===45?18:11)){case 120:return ye(e,/(.+:)([^;\s!]+)(;|(\s+)?!.+)?/,"$1"+Le+(Tt(e,14)===45?"inline-":"")+"box$3$1"+Le+"$2$3$1"+We+"$2box$3")+e;case 100:return ye(e,":",":"+We)+e}break;case 5719:case 2647:case 2135:case 3927:case 2391:return ye(e,"scroll-","scroll-snap-")+e}return e}function Fa(e,t){for(var r="",n=sg(e),i=0;i-1&&!e.return)switch(e.type){case ig:e.return=eS(e.value,e.length,r);return;case qx:return Fa([ya(e,{value:ye(e.value,"@","@"+Le)})],n);case Sd:if(e.length)return SO(e.props,function(i){switch(vi(i,/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":return Fa([ya(e,{props:[ye(i,/:(read-\w+)/,":"+Ha+"$1")]})],n);case"::placeholder":return Fa([ya(e,{props:[ye(i,/:(plac\w+)/,":"+Le+"input-$1")]}),ya(e,{props:[ye(i,/:(plac\w+)/,":"+Ha+"$1")]}),ya(e,{props:[ye(i,/:(plac\w+)/,We+"input-$1")]})],n)}return""})}}var IO={animationIterationCount:1,aspectRatio:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1},Os=typeof process<"u"&&process.env!==void 0&&({}.REACT_APP_SC_ATTR||{}.SC_ATTR)||"data-styled",ag=typeof window<"u"&&"HTMLElement"in window,NO=!!(typeof SC_DISABLE_SPEEDY=="boolean"?SC_DISABLE_SPEEDY:typeof process<"u"&&process.env!==void 0&&{}.REACT_APP_SC_DISABLE_SPEEDY!==void 0&&{}.REACT_APP_SC_DISABLE_SPEEDY!==""?{}.REACT_APP_SC_DISABLE_SPEEDY!=="false"&&{}.REACT_APP_SC_DISABLE_SPEEDY:typeof process<"u"&&process.env!==void 0&&{}.SC_DISABLE_SPEEDY!==void 0&&{}.SC_DISABLE_SPEEDY!==""&&{}.SC_DISABLE_SPEEDY!=="false"&&{}.SC_DISABLE_SPEEDY),zO={},lg=Object.freeze([]),So=Object.freeze({});function tS(e,t,r){return r===void 0&&(r=So),e.theme!==r.theme&&e.theme||t||r.theme}var rS=new Set(["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","u","ul","use","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","marker","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"]),YO=/[!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~-]+/g,VO=/(^-|-$)/g;function D1(e){return e.replace(YO,"-").replace(VO,"")}var HO=/(a)(d)/gi,E1=function(e){return String.fromCharCode(e+(e>25?39:97))};function kp(e){var t,r="";for(t=Math.abs(e);t>52;t=t/52|0)r=E1(t%52)+r;return(E1(t%52)+r).replace(HO,"$1-$2")}var hh,ls=function(e,t){for(var r=t.length;r;)e=33*e^t.charCodeAt(--r);return e},nS=function(e){return ls(5381,e)};function iS(e){return kp(nS(e)>>>0)}function FO(e){return e.displayName||e.name||"Component"}function mh(e){return typeof e=="string"&&!0}var oS=typeof Symbol=="function"&&Symbol.for,sS=oS?Symbol.for("react.memo"):60115,UO=oS?Symbol.for("react.forward_ref"):60112,$O={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},BO={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},aS={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},WO=((hh={})[UO]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},hh[sS]=aS,hh);function j1(e){return("type"in(t=e)&&t.type.$$typeof)===sS?aS:"$$typeof"in e?WO[e.$$typeof]:$O;var t}var GO=Object.defineProperty,KO=Object.getOwnPropertyNames,A1=Object.getOwnPropertySymbols,XO=Object.getOwnPropertyDescriptor,QO=Object.getPrototypeOf,T1=Object.prototype;function lS(e,t,r){if(typeof t!="string"){if(T1){var n=QO(t);n&&n!==T1&&lS(e,n,r)}var i=KO(t);A1&&(i=i.concat(A1(t)));for(var o=j1(e),a=j1(t),c=0;c0?" Args: ".concat(t.join(", ")):""))}var qO=function(){function e(t){this.groupSizes=new Uint32Array(512),this.length=512,this.tag=t}return e.prototype.indexOfGroup=function(t){for(var r=0,n=0;n=this.groupSizes.length){for(var n=this.groupSizes,i=n.length,o=i;t>=o;)if((o<<=1)<0)throw ko(16,"".concat(t));this.groupSizes=new Uint32Array(o),this.groupSizes.set(n),this.length=o;for(var a=i;a=this.length||this.groupSizes[t]===0)return r;for(var n=this.groupSizes[t],i=this.indexOfGroup(t),o=i+n,a=i;a=0;h--){var g=d[h];if(g&&g.nodeType===1&&g.hasAttribute(Os))return g}}(r),o=i!==void 0?i.nextSibling:null;n.setAttribute(Os,"active"),n.setAttribute("data-styled-version","6.0.0-rc.1");var a=nP();return a&&n.setAttribute("nonce",a),r.insertBefore(n,o),n},iP=function(){function e(t){this.element=cS(t),this.element.appendChild(document.createTextNode("")),this.sheet=function(r){if(r.sheet)return r.sheet;for(var n=document.styleSheets,i=0,o=n.length;i=0){var n=document.createTextNode(r);return this.element.insertBefore(n,this.nodes[t]||null),this.length++,!0}return!1},e.prototype.deleteRule=function(t){this.element.removeChild(this.nodes[t]),this.length--},e.prototype.getRule=function(t){return t0&&(x+="".concat(k,","))}),i+="".concat(g).concat(v,'{content:"').concat(x,'"}').concat(`/*!sc*/ -`)},a=0;a0?".".concat(t):x},g=d.slice();a.prefix&&g.unshift(MO),g.push(function(x){x.type===Sd&&x.value.includes("&")&&(x.props[0]=x.props[0].replace(lP,r).replace(n,h))},PO);var v=function(x,k,C,D){k===void 0&&(k=""),C===void 0&&(C=""),D===void 0&&(D="&"),t=D,r=k,n=new RegExp("\\".concat(r,"\\b"),"g");var E=x.replace(cP,""),y=RO(C||k?"".concat(C," ").concat(k," { ").concat(E," }"):E);return a.namespace&&(y=uS(y,a.namespace)),function(w,b){for(var j=[],T=0,R=void 0;T="A"&&e<="Z"};function O1(e){for(var t="",r=0;r>>0);if(!r.hasNameForId(this.componentId,a)){var c=n(o,".".concat(a),void 0,this.componentId);r.insertRules(this.componentId,a,c)}i=ao(i,a),this.staticRulesId=a}else{for(var d=ls(this.baseHash,n.hash),h="",g=0;g>>0);r.hasNameForId(this.componentId,k)||r.insertRules(this.componentId,k,n(h,".".concat(k),void 0,this.componentId)),i=ao(i,k)}}return i},e}(),ug=Rt.createContext(void 0);ug.Consumer;function dg(){return I.useContext(ug)}function gP(e){var t=dg(),r=I.useMemo(function(){return function(n,i){if(!n)throw ko(14);if(bo(n)){var o=n(i);return o}if(Array.isArray(n)||typeof n!="object")throw ko(8);return i?Ot(Ot({},i),n):n}(e.theme,t)},[e.theme,t]);return e.children?Rt.createElement(ug.Provider,{value:r},e.children):null}var gh={};function vP(e,t,r){var n=cg(e),i=e,o=!mh(e),a=t.attrs,c=a===void 0?lg:a,d=t.componentId,h=d===void 0?function(T,R){var P=typeof T!="string"?"sc":D1(T);gh[P]=(gh[P]||0)+1;var O="".concat(P,"-").concat(iS("6.0.0-rc.1"+P+gh[P]));return R?"".concat(R,"-").concat(O):O}(t.displayName,t.parentComponentId):d,g=t.displayName,v=g===void 0?function(T){return mh(T)?"styled.".concat(T):"Styled(".concat(FO(T),")")}(e):g,x=t.displayName&&t.componentId?"".concat(D1(t.displayName),"-").concat(t.componentId):t.componentId||h,k=n&&i.attrs?i.attrs.concat(c).filter(Boolean):c,C=t.shouldForwardProp;if(n&&i.shouldForwardProp){var D=i.shouldForwardProp;if(t.shouldForwardProp){var E=t.shouldForwardProp;C=function(T,R){return D(T,R)&&E(T,R)}}else C=D}var y=new pP(r,x,n?i.componentStyle:void 0),w=y.isStatic&&c.length===0;function b(T,R){return function(P,O,z,Y){var ee=P.attrs,te=P.componentStyle,G=P.defaultProps,lt=P.foldedComponentIds,je=P.styledComponentId,ze=P.target,mt=dg(),$=jp(),le=P.shouldForwardProp||$.shouldForwardProp,Q=function(zt,rr,Yr){for(var Vr,mr=Ot(Ot({},rr),{className:void 0,theme:Yr}),Ki=0;Ki2&&Pu.registerId(this.componentId+t),this.removeStyles(t,n),this.createStyles(t,r,n,i)},e}();function wP(e){for(var t=[],r=1;r"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?jP:EP;vS.useSyncExternalStore=Ps.useSyncExternalStore!==void 0?Ps.useSyncExternalStore:AP;(function(e){e.exports=vS})(_P);var M1={},TP={get exports(){return M1},set exports(e){M1=e}},yS={};/** - * @license React - * use-sync-external-store-shim/with-selector.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Dd=I,RP=Tp;function OP(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var PP=typeof Object.is=="function"?Object.is:OP,LP=RP.useSyncExternalStore,MP=Dd.useRef,IP=Dd.useEffect,NP=Dd.useMemo,zP=Dd.useDebugValue;yS.useSyncExternalStoreWithSelector=function(e,t,r,n,i){var o=MP(null);if(o.current===null){var a={hasValue:!1,value:null};o.current=a}else a=o.current;o=NP(function(){function d(k){if(!h){if(h=!0,g=k,k=n(k),i!==void 0&&a.hasValue){var C=a.value;if(i(C,k))return v=C}return v=k}if(C=v,PP(g,k))return C;var D=n(k);return i!==void 0&&i(C,D)?C:(g=k,v=D)}var h=!1,g,v,x=r===void 0?null:r;return[function(){return d(t())},x===null?void 0:function(){return d(x())}]},[t,r,n,i]);var c=LP(e,o[0],o[1]);return IP(function(){a.hasValue=!0,a.value=c},[c]),zP(c),c};(function(e){e.exports=yS})(TP);function YP(e){e()}let wS=YP;const VP=e=>wS=e,HP=()=>wS,FP=I.createContext(null);var Rp={},UP={get exports(){return Rp},set exports(e){Rp=e}},Ie={};/** @license React v16.13.1 - * react-is.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Lt=typeof Symbol=="function"&&Symbol.for,fg=Lt?Symbol.for("react.element"):60103,hg=Lt?Symbol.for("react.portal"):60106,Ed=Lt?Symbol.for("react.fragment"):60107,jd=Lt?Symbol.for("react.strict_mode"):60108,Ad=Lt?Symbol.for("react.profiler"):60114,Td=Lt?Symbol.for("react.provider"):60109,Rd=Lt?Symbol.for("react.context"):60110,mg=Lt?Symbol.for("react.async_mode"):60111,Od=Lt?Symbol.for("react.concurrent_mode"):60111,Pd=Lt?Symbol.for("react.forward_ref"):60112,Ld=Lt?Symbol.for("react.suspense"):60113,$P=Lt?Symbol.for("react.suspense_list"):60120,Md=Lt?Symbol.for("react.memo"):60115,Id=Lt?Symbol.for("react.lazy"):60116,BP=Lt?Symbol.for("react.block"):60121,WP=Lt?Symbol.for("react.fundamental"):60117,GP=Lt?Symbol.for("react.responder"):60118,KP=Lt?Symbol.for("react.scope"):60119;function kr(e){if(typeof e=="object"&&e!==null){var t=e.$$typeof;switch(t){case fg:switch(e=e.type,e){case mg:case Od:case Ed:case Ad:case jd:case Ld:return e;default:switch(e=e&&e.$$typeof,e){case Rd:case Pd:case Id:case Md:case Td:return e;default:return t}}case hg:return t}}}function _S(e){return kr(e)===Od}Ie.AsyncMode=mg;Ie.ConcurrentMode=Od;Ie.ContextConsumer=Rd;Ie.ContextProvider=Td;Ie.Element=fg;Ie.ForwardRef=Pd;Ie.Fragment=Ed;Ie.Lazy=Id;Ie.Memo=Md;Ie.Portal=hg;Ie.Profiler=Ad;Ie.StrictMode=jd;Ie.Suspense=Ld;Ie.isAsyncMode=function(e){return _S(e)||kr(e)===mg};Ie.isConcurrentMode=_S;Ie.isContextConsumer=function(e){return kr(e)===Rd};Ie.isContextProvider=function(e){return kr(e)===Td};Ie.isElement=function(e){return typeof e=="object"&&e!==null&&e.$$typeof===fg};Ie.isForwardRef=function(e){return kr(e)===Pd};Ie.isFragment=function(e){return kr(e)===Ed};Ie.isLazy=function(e){return kr(e)===Id};Ie.isMemo=function(e){return kr(e)===Md};Ie.isPortal=function(e){return kr(e)===hg};Ie.isProfiler=function(e){return kr(e)===Ad};Ie.isStrictMode=function(e){return kr(e)===jd};Ie.isSuspense=function(e){return kr(e)===Ld};Ie.isValidElementType=function(e){return typeof e=="string"||typeof e=="function"||e===Ed||e===Od||e===Ad||e===jd||e===Ld||e===$P||typeof e=="object"&&e!==null&&(e.$$typeof===Id||e.$$typeof===Md||e.$$typeof===Td||e.$$typeof===Rd||e.$$typeof===Pd||e.$$typeof===WP||e.$$typeof===GP||e.$$typeof===KP||e.$$typeof===BP)};Ie.typeOf=kr;(function(e){e.exports=Ie})(UP);var xS=Rp,XP={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},QP={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},SS={};SS[xS.ForwardRef]=XP;SS[xS.Memo]=QP;var I1={},qP={get exports(){return I1},set exports(e){I1=e}},Ne={};/** - * @license React - * react-is.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var pg=Symbol.for("react.element"),gg=Symbol.for("react.portal"),Nd=Symbol.for("react.fragment"),zd=Symbol.for("react.strict_mode"),Yd=Symbol.for("react.profiler"),Vd=Symbol.for("react.provider"),Hd=Symbol.for("react.context"),ZP=Symbol.for("react.server_context"),Fd=Symbol.for("react.forward_ref"),Ud=Symbol.for("react.suspense"),$d=Symbol.for("react.suspense_list"),Bd=Symbol.for("react.memo"),Wd=Symbol.for("react.lazy"),JP=Symbol.for("react.offscreen"),bS;bS=Symbol.for("react.module.reference");function Mr(e){if(typeof e=="object"&&e!==null){var t=e.$$typeof;switch(t){case pg:switch(e=e.type,e){case Nd:case Yd:case zd:case Ud:case $d:return e;default:switch(e=e&&e.$$typeof,e){case ZP:case Hd:case Fd:case Wd:case Bd:case Vd:return e;default:return t}}case gg:return t}}}Ne.ContextConsumer=Hd;Ne.ContextProvider=Vd;Ne.Element=pg;Ne.ForwardRef=Fd;Ne.Fragment=Nd;Ne.Lazy=Wd;Ne.Memo=Bd;Ne.Portal=gg;Ne.Profiler=Yd;Ne.StrictMode=zd;Ne.Suspense=Ud;Ne.SuspenseList=$d;Ne.isAsyncMode=function(){return!1};Ne.isConcurrentMode=function(){return!1};Ne.isContextConsumer=function(e){return Mr(e)===Hd};Ne.isContextProvider=function(e){return Mr(e)===Vd};Ne.isElement=function(e){return typeof e=="object"&&e!==null&&e.$$typeof===pg};Ne.isForwardRef=function(e){return Mr(e)===Fd};Ne.isFragment=function(e){return Mr(e)===Nd};Ne.isLazy=function(e){return Mr(e)===Wd};Ne.isMemo=function(e){return Mr(e)===Bd};Ne.isPortal=function(e){return Mr(e)===gg};Ne.isProfiler=function(e){return Mr(e)===Yd};Ne.isStrictMode=function(e){return Mr(e)===zd};Ne.isSuspense=function(e){return Mr(e)===Ud};Ne.isSuspenseList=function(e){return Mr(e)===$d};Ne.isValidElementType=function(e){return typeof e=="string"||typeof e=="function"||e===Nd||e===Yd||e===zd||e===Ud||e===$d||e===JP||typeof e=="object"&&e!==null&&(e.$$typeof===Wd||e.$$typeof===Bd||e.$$typeof===Vd||e.$$typeof===Hd||e.$$typeof===Fd||e.$$typeof===bS||e.getModuleId!==void 0)};Ne.typeOf=Mr;(function(e){e.exports=Ne})(qP);function e4(){const e=HP();let t=null,r=null;return{clear(){t=null,r=null},notify(){e(()=>{let n=t;for(;n;)n.callback(),n=n.next})},get(){let n=[],i=t;for(;i;)n.push(i),i=i.next;return n},subscribe(n){let i=!0,o=r={callback:n,next:null,prev:r};return o.prev?o.prev.next=o:t=o,function(){!i||t===null||(i=!1,o.next?o.next.prev=o.prev:r=o.prev,o.prev?o.prev.next=o.next:t=o.next)}}}}const N1={notify(){},get:()=>[]};function t4(e,t){let r,n=N1;function i(v){return d(),n.subscribe(v)}function o(){n.notify()}function a(){g.onStateChange&&g.onStateChange()}function c(){return!!r}function d(){r||(r=t?t.addNestedSub(a):e.subscribe(a),n=e4())}function h(){r&&(r(),r=void 0,n.clear(),n=N1)}const g={addNestedSub:i,notifyNestedSubs:o,handleChangeWrapper:a,isSubscribed:c,trySubscribe:d,tryUnsubscribe:h,getListeners:()=>n};return g}const r4=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",n4=r4?I.useLayoutEffect:I.useEffect;function i4({store:e,context:t,children:r,serverState:n}){const i=I.useMemo(()=>{const c=t4(e);return{store:e,subscription:c,getServerState:n?()=>n:void 0}},[e,n]),o=I.useMemo(()=>e.getState(),[e]);n4(()=>{const{subscription:c}=i;return c.onStateChange=c.notifyNestedSubs,c.trySubscribe(),o!==e.getState()&&c.notifyNestedSubs(),()=>{c.tryUnsubscribe(),c.onStateChange=void 0}},[i,o]);const a=t||FP;return Rt.createElement(a.Provider,{value:i},r)}VP(su.unstable_batchedUpdates);const o4=wP` - *{ - box-sizing: border-box; - } - body { - margin: 0; - } - :root { - font-family: sans-serif; - font-family: PingFang SC, Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - font-size: 100px; - - color: black; - background-color: white; - - box-sizing: border-box; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; - - @media screen and (max-width: 1399px) { - font-size: 85px; - } - @media screen and (max-width: 1023px) { - font-size: 70px; - } - @media screen and (max-width: 767px) { - font-size: 55px; - } - @media screen and (max-width: 424px) { - font-size: 40px; - } - - } - p { - margin-block: 0; - } - ul, ol { - margin-block: 0; - padding-inline-start: 0; - } - h1, h2, h3, h4, h5, h6 { - margin-block: 0; - } - a { - text-decoration: none; - } - @keyframes opac { - from { - opacity: 1; - width: 0; - height: 0; - top: 50%; - left: 50%; - } - - to { - opacity: 0; - width: 100%; - height: 100%; - top: 0; - left: 0; - } -} - -.content { - font-weight: 400; - font-size: 0.18rem; - line-height: 0.28rem; - h1 { - margin-block: 0.48rem; - font-weight: 700; - font-size: 0.36rem; - line-height: 0.52rem; - } - h2 { - margin-block: 0.48rem; - font-weight: 700; - font-size: 0.28rem; - line-height: 0.44rem; - } - h3 { - margin-block: 0.4rem; - font-weight: 700; - font-size: 0.24rem; - line-height: 0.36rem; - } - h4 { - margin-block: 0.32rem; - font-weight: 700; - font-size: 0.24rem; - line-height: 0.32rem; - } - h5 { - margin-block: 0.32rem; - font-weight: 700; - font-size: 0.22rem; - line-height: 0.28rem; - } - h6 { - margin-block: 0.24rem; - font-weight: 700; - font-size: 0.2rem; - line-height: 0.24rem; - } - p { - margin-block: 0.32rem; - font-weight: 400; - font-size: 0.18rem; - line-height: 0.28rem; - } - a { - display: inline; - text-decoration: underline; - color: #0052D9; - } - img { - margin-block: 0.64rem; - display: block; - margin-inline: auto; - max-width: 80%; - /* max-height: 7.2rem; */ - border-radius: 0.08rem; - } - ol, ul { - margin-block: 0.16rem; - padding-inline-start: 20px; - } - blockquote { - margin-block: 0.32rem; - margin-inline: 0; - padding-left: 10px; - color: #8c8c8c; - border-left: 4px solid #8c8c8c - } - hr { - margin-block: 0.48rem; - } - pre { - padding: 12px; - background: #f0f0f0; - border-radius: 4px; - overflow-x: scroll; - code { - white-space: pre-wrap; - padding: 0; - } - } - code { - padding: 4px; - border-radius: 4px; - background: #f0f0f0; - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - } - table { - width: 100%; - border-collapse: collapse; - th { - padding: 0.12rem; - border: 1px solid #000; - } - td { - padding: 0.12rem; - border: 1px solid #000; - } - } - .hljs-comment, - .hljs-quote { - color: #998; - font-style: italic; - } - .hljs-keyword, - .hljs-selector-tag, - .hljs-subst { - color: #333; - font-weight: 700; - } - .hljs-literal, - .hljs-number, - .hljs-tag .hljs-attr, - .hljs-template-variable, - .hljs-variable { - color: teal; - } - .hljs-doctag, - .hljs-string { - color: #d14; - } - .hljs-section, - .hljs-selector-id, - .hljs-title { - color: #900; - font-weight: 700; - } - .hljs-subst { - font-weight: 400; - } - .hljs-class .hljs-title, - .hljs-type { - color: #458; - font-weight: 700; - } - .hljs-attribute, - .hljs-name, - .hljs-tag { - color: navy; - font-weight: 400; - } - .hljs-link, - .hljs-regexp { - color: #009926; - } - .hljs-bullet, - .hljs-symbol { - color: #990073; - } - .hljs-built_in, - .hljs-builtin-name { - color: #0086b3; - } - .hljs-meta { - color: #999; - font-weight: 700; - } - .hljs-deletion { - background: #fdd; - } - .hljs-addition { - background: #dfd; - } - .hljs-emphasis { - font-style: italic; - } - .hljs-strong { - font-weight: 700; - } - } -`,kS=f.p` - margin-block: 0; - font-family: PingFang SC; -`,Tl=f(kS)` - font-weight: 400; - font-size: 0.16rem; - line-height: 0.28rem; -`,bn=f(kS)` - font-weight: 600; - font-size: 0.64rem; - line-height: 0.72rem; -`,s4=f(bn)``,a4=f(bn)` - font-size: 0.32rem; - line-height: 0.352rem; -`,l4=f(bn)` - font-size: 0.3rem; - line-height: 0.444rem; -`,c4=f(bn)` - font-size: 0.28rem; - line-height: 0.56rem; -`,u4=f(bn)` - font-size: 0.24rem; - line-height: 0.44rem; -`,CS=f(bn)` - font-size: 0.24rem; - line-height: 0.32rem; -`,d4=f(bn)` - font-size: 0.2rem; - line-height: 0.28rem; -`,f4=f(bn)` - font-size: 0.2rem; - line-height: 0.4rem; -`,h4=f(bn)` - font-size: 0.16rem; - line-height: 0.24rem; -`,m4=f(bn)` - font-size: 0.14rem; - line-height: 0.22rem; -`,p4=f(Tl)` - font-size: 0.18rem; - line-height: 0.32rem; -`,g4=f(Tl)``,v4=f(Tl)` - font-size: 0.14rem; - line-height: 0.2rem; -`,y4=f(Tl)` - font-size: 0.14rem; - line-height: 0.22rem; -`,w4=f(Tl)` - font-size: 0.12rem; - line-height: 0.2rem; -`,_4=f.div` - margin-left: -0.31rem; - display: flex; -`,x4=f(CS)` - padding-left: 0.15rem; -`,S4=f.div` - width: 0.166rem; - background: linear-gradient(90deg, #767ee5, #9966cc); -`,b4=({children:e,extra:t,style:r})=>l.jsxs(_4,{style:r,children:[l.jsx(S4,{}),l.jsx(x4,{children:e}),t]}),Pe={Heading:{CNHead1:s4,Heading2:a4,Heading3:l4,CNHead4:c4,Heading6:u4,CNHead5:CS,CNTitleLarge:d4,TitleLarge:f4,CNTitleMedium:h4,CNHead5S:b4,CNTitleSmall:m4},Paragraph:{CNBodyLarge:p4,CNBodyMedium:g4,CNBodySmall:v4,CNMarkMedium:y4,CNMarkSmall:w4}},{Paragraph:k4}=Pe,{CNBodyMedium:C4}=k4,D4=f.ul` - display: flex; - height: 100%; - @media screen and (max-width: 425px) { - display: none; - } -`,E4=f.li` - position: relative; - display: flex; - align-items: center; - padding-inline: 0.24rem; - border-bottom: ${e=>e.isdropdown==="true"?"0.04rem solid hsla(234, 60%, 66%, 1)":"none"}; - transition: all 0.05s; - cursor: pointer; - color: ${e=>e.isactive==="true"?e.theme.secondary08:e.theme.white00}; -`,j4=f.ul` - position: absolute; - top: 0.72rem; - right: -0.6rem; - display: ${e=>e.isdropdown==="true"?"block":"none"}; - padding: 0.16rem 0.2rem; - background: ${e=>e.theme.themeDark}; - border-radius: 0.08rem; - transition: all 0s ease 0.1s; - width: 2rem; -`,A4=f.li` - display: block; - padding-block: 0.08rem; - color: hsl(0, 0%, 88%); - font-weight: 400; - font-size: 0.14rem; - &:hover { - color: ${e=>e.theme.secondary01}; - } -`,DS=(e,t)=>{t&&(t.startsWith("http")||t.startsWith("https")?window.location.href=t:e(t))},T4=({label:e,url:t,setDropdown:r})=>{const n=ht();return l.jsx(A4,{onClick:()=>{r("false"),DS(n,t)},children:e})},R4=({subNavItems:e,isdropdown:t,setDropdown:r})=>l.jsx(j4,{isdropdown:t,children:e==null?void 0:e.map(({key:n,label:i,url:o})=>l.jsx(T4,{label:i,url:o,setDropdown:r},n))}),O4=({id:e,label:t,subNavItems:r,url:n})=>{const i=ht(),o=si(),[a,c]=I.useState("false"),{mode:d,activeId:h}=I.useContext(jS);return I.useEffect(()=>{c("false")},[d,o.pathname]),l.jsxs(E4,{isactive:h===e?"true":"false",isdropdown:a,onMouseOver:()=>c("true"),onMouseOut:()=>c("false"),onClick:()=>DS(i,n),children:[l.jsx(C4,{children:t}),r&&l.jsx(R4,{subNavItems:r,isdropdown:a,setDropdown:c})]})},P4=({items:e})=>l.jsx(D4,{children:e.map(({key:t,label:r,url:n,children:i})=>l.jsx(O4,{id:t,label:r,url:n,subNavItems:i},t))}),ES="/zh-cn/assets/logo-light-4c8441f8.svg",L4=f.header` - z-index: 1000; - position: ${e=>e.mode==="fixed"?"fixed":"sticky"}; - top: ${e=>e.mode==="fixed"?"0":"-0.72rem"}; - left: 0; - height: 0.72rem; - width: 100%; - background-color: ${e=>e.color==="transparent"?"transparent":e.theme.themeDark}; - color: ${e=>e.theme.white00}; - transition: all 0.3s; - // - - - - /* background-color: ${e=>e.theme.themeDark}; */ -`,M4=f.div` - display: flex; - align-items: center; - height: 100%; - max-width: 1440px; - margin-inline: auto; - padding-inline: 1.4rem; -`,I4=f.img` - height: 0.47rem; - - font-size: 0.3rem; -`,N4=f.div` - flex: 1; - min-width: 32px; -`,z4=f.div` - font-size: 0.14rem; - line-height: 0.2rem; - font-weight: 600; - color: #7680DD; - padding: 0.08rem 0.24rem; - border-radius: 0.24rem; - border: 0.02rem solid #7680DD; - margin-left: 0.24rem; -`,jS=I.createContext({color:"dark",mode:"default",activeId:"home"}),Y4=new Map([["products","product"],["rdma","product"],["solutions","solution"],["resources1","resource"],["resources2","resource"],["news-honor-dynamic","resource"],["tech-talk","resource"],["events","resource"],["blogs","resource"],["clients","client"],["company1","company"],["company2","company"],["job-description","company"]]),V4=({items:e,color:t="dark",mode:r="default"})=>{const n=ht(),i=si(),o=Y4.get(i.pathname.split("/")[1]);return l.jsx(jS.Provider,{value:{color:t,mode:r,activeId:o},children:l.jsx(L4,{color:t,mode:r,children:l.jsxs(M4,{children:[l.jsx(I4,{src:ES,alt:"达坦科技",onClick:()=>n("/")}),l.jsx(N4,{}),window.innerWidth>425?l.jsx(P4,{items:e}):null,l.jsx(z4,{onClick:()=>window.location.href="https://datenlord.github.io/",children:"中/英"})]})})})},AS=[{key:"product",label:"产品",children:[{key:"service",label:"DatenLord Cloud Service",url:"/service"},{key:"app",label:"DatenLord Appliance",url:"/app"}]},{key:"solution",label:"解决方案",children:[{key:"ai",label:"AI 推理",url:"/solutions/ai"},{key:"storage",label:"高性能存储",url:"/solutions/storage"},{key:"networks",label:"高性能网络",url:"/solutions/networks"}]},{key:"resource",label:"资源",children:[{key:"tech-share",label:"技术分享",url:"/resources2/tech-share"},{key:"dynamics",label:"达坦动态",url:"/resources2/dynamics"},{key:"blog",label:"技术博客",url:"/resources2/blog"}]},{key:"community",label:"社区",children:[{key:"open-source-community",label:"开源社区",url:"/community"},{key:"open-source-project",label:"开源项目",url:"/community"},{key:"learning-community",label:"学习社区",url:"/community"}]},{key:"company",label:"公司",children:[{key:"about-us",label:"关于我们",url:"/company1/about-us"},{key:"join-us",label:"加入我们",url:"/company2/join-us"},{key:"contact-us",label:"联系我们",url:"/company2/contact-us"}]}],{Paragraph:H4}=Pe,{CNBodyLarge:TS}=H4,F4=f.footer` - color: #fff; - background-color: ${e=>e.theme.themeDark}; -`,U4=f.div` - max-width: 1440px; - margin-inline: auto; - padding-inline: 1.22rem; - padding-block: 0.64rem; -`,$4=f.img` - height: 0.58rem; - padding-inline: 0.16rem 0.16rem; -`,B4=f.div` - width: 100%; - display: flex; - flex-wrap: wrap; - justify-content: space-around; -`,W4=f.div` - padding-inline: 0.16rem; - padding-bottom: 0.64rem; - color: white; - width: 1.8rem; -`,G4=f.h2` - padding-bottom: 0.16rem; - margin-bottom: 0.24rem; - font-weight: 500; - font-size: 0.2rem; - line-height: 0.4rem; - text-transform: capitalize; - border-bottom: 1px solid white; - cursor: default; -`,K4=f.ul``,X4=f.li` - margin-bottom: 0.15rem; - text-transform: capitalize; - list-style-type: none; - cursor: pointer; -`,Q4=f.div` - display: flex; - align-items: center; - border-bottom: 1px solid #fff; -`,q4=f(TS)` - padding-top: 0.14rem; -`,Z4=()=>{const e=ht();return l.jsx(l.Fragment,{children:l.jsx(F4,{children:l.jsxs(U4,{children:[l.jsxs(Q4,{children:[l.jsx($4,{src:ES}),l.jsx(B4,{children:AS.map(({key:t,label:r,children:n})=>l.jsxs(W4,{children:[l.jsx(G4,{children:r}),l.jsx(K4,{children:(n||[]).map(({key:i,label:o,url:a})=>l.jsx(X4,{onClick:()=>{a&&e(a)},children:l.jsx(TS,{children:o})},i))})]},t))})]}),l.jsx(q4,{style:{textAlign:"center"},children:"北京达坦科技有限公司©2023版权所有"})]})})})},J4=f.div` - height: 0.72rem; -`,eL=()=>{const e=si(),[t,r]=I.useState("down"),[n,i]=I.useState(!1);I.useEffect(()=>{let d=window.scrollY,h=!1;const g=()=>{const x=window.scrollY;if(x>1e3?i(!0):i(!1),Math.abs(x-d)<0){h=!1;return}r(x>d?"down":"up"),d=x>0?x:0,h=!1},v=()=>{h||(window.requestAnimationFrame(g),h=!0)};return window.addEventListener("scroll",v),()=>window.removeEventListener("scroll",v)},[t]);const o=()=>n&&t==="up"?"fixed":"default",a=()=>e.pathname.split("/")[1]==="job-description"||(e.pathname.split("/")[1]==="blogs"||e.pathname.split("/")[1]==="events"||e.pathname.split("/")[1]==="highlights"||e.pathname.split("/")[1]==="news-honor-dynamic")&&e.pathname.split("/")[2]||n&&t==="up"?"dark":"transparent";return l.jsxs(l.Fragment,{children:[l.jsx(V4,{items:AS,mode:o(),color:a()}),o()==="fixed"&&l.jsx(J4,{}),l.jsx(iO,{}),l.jsx(Z4,{})]})};var RS={},OS={},Gd={},PS={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={animating:!1,autoplaying:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,dragging:!1,edgeDragged:!1,initialized:!1,lazyLoadedList:[],listHeight:null,listWidth:null,scrolling:!1,slideCount:null,slideHeight:null,slideWidth:null,swipeLeft:null,swiped:!1,swiping:!1,touchObject:{startX:0,startY:0,curX:0,curY:0},trackStyle:{},trackWidth:0,targetSlide:0},r=t;e.default=r})(PS);var tL="Expected a function",z1=0/0,rL="[object Symbol]",nL=/^\s+|\s+$/g,iL=/^[-+]0x[0-9a-f]+$/i,oL=/^0b[01]+$/i,sL=/^0o[0-7]+$/i,aL=parseInt,lL=typeof Go=="object"&&Go&&Go.Object===Object&&Go,cL=typeof self=="object"&&self&&self.Object===Object&&self,uL=lL||cL||Function("return this")(),dL=Object.prototype,fL=dL.toString,hL=Math.max,mL=Math.min,yh=function(){return uL.Date.now()};function pL(e,t,r){var n,i,o,a,c,d,h=0,g=!1,v=!1,x=!0;if(typeof e!="function")throw new TypeError(tL);t=Y1(t)||0,Op(r)&&(g=!!r.leading,v="maxWait"in r,o=v?hL(Y1(r.maxWait)||0,t):o,x="trailing"in r?!!r.trailing:x);function k(R){var P=n,O=i;return n=i=void 0,h=R,a=e.apply(O,P),a}function C(R){return h=R,c=setTimeout(y,t),g?k(R):a}function D(R){var P=R-d,O=R-h,z=t-P;return v?mL(z,o-O):z}function E(R){var P=R-d,O=R-h;return d===void 0||P>=t||P<0||v&&O>=o}function y(){var R=yh();if(E(R))return w(R);c=setTimeout(y,D(R))}function w(R){return c=void 0,x&&n?k(R):(n=i=void 0,a)}function b(){c!==void 0&&clearTimeout(c),h=0,n=d=i=c=void 0}function j(){return c===void 0?a:w(yh())}function T(){var R=yh(),P=E(R);if(n=arguments,i=this,d=R,P){if(c===void 0)return C(d);if(v)return c=setTimeout(y,t),k(d)}return c===void 0&&(c=setTimeout(y,t)),a}return T.cancel=b,T.flush=j,T}function Op(e){var t=typeof e;return!!e&&(t=="object"||t=="function")}function gL(e){return!!e&&typeof e=="object"}function vL(e){return typeof e=="symbol"||gL(e)&&fL.call(e)==rL}function Y1(e){if(typeof e=="number")return e;if(vL(e))return z1;if(Op(e)){var t=typeof e.valueOf=="function"?e.valueOf():e;e=Op(t)?t+"":t}if(typeof e!="string")return e===0?e:+e;e=e.replace(nL,"");var r=oL.test(e);return r||sL.test(e)?aL(e.slice(2),r?2:8):iL.test(e)?z1:+e}var yL=pL,Ls={},wL={get exports(){return Ls},set exports(e){Ls=e}};/*! - Copyright (c) 2018 Jed Watson. - Licensed under the MIT License (MIT), see - http://jedwatson.github.io/classnames -*/(function(e){(function(){var t={}.hasOwnProperty;function r(){for(var n=[],i=0;i0?1:0):0};W.lazySlidesOnLeft=MS;var IS=function(t){return t.centerMode?Math.floor((t.slidesToShow-1)/2)+1+(parseInt(t.centerPadding)>0?1:0):t.slidesToShow};W.lazySlidesOnRight=IS;var Lu=function(t){return t&&t.offsetWidth||0};W.getWidth=Lu;var _g=function(t){return t&&t.offsetHeight||0};W.getHeight=_g;var xg=function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,n,i,o,a;return n=t.startX-t.curX,i=t.startY-t.curY,o=Math.atan2(i,n),a=Math.round(o*180/Math.PI),a<0&&(a=360-Math.abs(a)),a<=45&&a>=0||a<=360&&a>=315?"left":a>=135&&a<=225?"right":r===!0?a>=35&&a<=135?"up":"down":"vertical"};W.getSwipeDirection=xg;var Sg=function(t){var r=!0;return t.infinite||(t.centerMode&&t.currentSlide>=t.slideCount-1||t.slideCount<=t.slidesToShow||t.currentSlide>=t.slideCount-t.slidesToShow)&&(r=!1),r};W.canGoNext=Sg;var kL=function(t,r){var n={};return r.forEach(function(i){return n[i]=t[i]}),n};W.extractObject=kL;var CL=function(t){var r=_L.default.Children.count(t.children),n=t.listRef,i=Math.ceil(Lu(n)),o=t.trackRef&&t.trackRef.node,a=Math.ceil(Lu(o)),c;if(t.vertical)c=i;else{var d=t.centerMode&&parseInt(t.centerPadding)*2;typeof t.centerPadding=="string"&&t.centerPadding.slice(-1)==="%"&&(d*=i/100),c=Math.ceil((i-d)/t.slidesToShow)}var h=n&&_g(n.querySelector('[data-index="0"]')),g=h*t.slidesToShow,v=t.currentSlide===void 0?t.initialSlide:t.currentSlide;t.rtl&&t.currentSlide===void 0&&(v=r-1-t.initialSlide);var x=t.lazyLoadedList||[],k=vg(Ze(Ze({},t),{},{currentSlide:v,lazyLoadedList:x}));x=x.concat(k);var C={slideCount:r,slideWidth:c,listWidth:i,trackWidth:a,currentSlide:v,slideHeight:h,listHeight:g,lazyLoadedList:x};return t.autoplaying===null&&t.autoplay&&(C.autoplaying="playing"),C};W.initializedState=CL;var DL=function(t){var r=t.waitForAnimate,n=t.animating,i=t.fade,o=t.infinite,a=t.index,c=t.slideCount,d=t.lazyLoad,h=t.currentSlide,g=t.centerMode,v=t.slidesToScroll,x=t.slidesToShow,k=t.useCSS,C=t.lazyLoadedList;if(r&&n)return{};var D=a,E,y,w,b={},j={},T=o?a:LS(a,0,c-1);if(i){if(!o&&(a<0||a>=c))return{};a<0?D=a+c:a>=c&&(D=a-c),d&&C.indexOf(D)<0&&(C=C.concat(D)),b={animating:!0,currentSlide:D,lazyLoadedList:C,targetSlide:D},j={animating:!1,targetSlide:D}}else E=D,D<0?(E=D+c,o?c%v!==0&&(E=c-c%v):E=0):!Sg(t)&&D>h?D=E=h:g&&D>=c?(D=o?c:c-1,E=o?0:c-1):D>=c&&(E=D-c,o?c%v!==0&&(E=0):E=c-x),!o&&D+x>=c&&(E=c-x),y=gl(Ze(Ze({},t),{},{slideIndex:D})),w=gl(Ze(Ze({},t),{},{slideIndex:E})),o||(y===w&&(D=E),y=w),d&&(C=C.concat(vg(Ze(Ze({},t),{},{currentSlide:D})))),k?(b={animating:!0,currentSlide:E,trackStyle:bg(Ze(Ze({},t),{},{left:y})),lazyLoadedList:C,targetSlide:T},j={animating:!1,currentSlide:E,trackStyle:pl(Ze(Ze({},t),{},{left:w})),swipeLeft:null,targetSlide:T}):b={currentSlide:E,trackStyle:pl(Ze(Ze({},t),{},{left:w})),lazyLoadedList:C,targetSlide:T};return{state:b,nextState:j}};W.slideHandler=DL;var EL=function(t,r){var n,i,o,a,c,d=t.slidesToScroll,h=t.slidesToShow,g=t.slideCount,v=t.currentSlide,x=t.targetSlide,k=t.lazyLoad,C=t.infinite;if(a=g%d!==0,n=a?0:(g-v)%d,r.message==="previous")o=n===0?d:h-n,c=v-o,k&&!C&&(i=v-o,c=i===-1?g-1:i),C||(c=x-d);else if(r.message==="next")o=n===0?d:n,c=v+o,k&&!C&&(c=(v+d)%g+n),C||(c=x+d);else if(r.message==="dots")c=r.index*r.slidesToScroll;else if(r.message==="children"){if(c=r.index,C){var D=VS(Ze(Ze({},t),{},{targetSlide:c}));c>r.currentSlide&&D==="left"?c=c-g:c10)return{scrolling:!0};c&&(w.swipeLength=z);var Y=(d?-1:1)*(w.curX>w.startX?1:-1);c&&(Y=w.curY>w.startY?1:-1);var ee=Math.ceil(D/E),te=xg(r.touchObject,c),G=w.swipeLength;return y||(h===0&&(te==="right"||te==="down")||h+1>=ee&&(te==="left"||te==="up")||!Sg(r)&&(te==="left"||te==="up"))&&(G=w.swipeLength*g,v===!1&&x&&(x(te),P.edgeDragged=!0)),!k&&b&&(b(te),P.swiped=!0),o?R=O+G*(j/T)*Y:d?R=O-G*Y:R=O+G*Y,c&&(R=O+G*Y),P=Ze(Ze({},P),{},{touchObject:w,swipeLeft:R,trackStyle:pl(Ze(Ze({},r),{},{left:R}))}),Math.abs(w.curX-w.startX)10&&(P.swiping=!0,ho(t)),P}};W.swipeMove=TL;var RL=function(t,r){var n=r.dragging,i=r.swipe,o=r.touchObject,a=r.listWidth,c=r.touchThreshold,d=r.verticalSwiping,h=r.listHeight,g=r.swipeToSlide,v=r.scrolling,x=r.onSwipe,k=r.targetSlide,C=r.currentSlide,D=r.infinite;if(!n)return i&&ho(t),{};var E=d?h/c:a/c,y=xg(o,d),w={dragging:!1,edgeDragged:!1,scrolling:!1,swiping:!1,swiped:!1,swipeLeft:null,touchObject:{}};if(v||!o.swipeLength)return w;if(o.swipeLength>E){ho(t),x&&x(y);var b,j,T=D?C:k;switch(y){case"left":case"up":j=T+Lp(r),b=g?Pp(r,j):j,w.currentDirection=0;break;case"right":case"down":j=T-Lp(r),b=g?Pp(r,j):j,w.currentDirection=1;break;default:b=T}w.triggerSlideHandler=b}else{var R=gl(r);w.trackStyle=bg(Ze(Ze({},r),{},{left:R}))}return w};W.swipeEnd=RL;var NS=function(t){for(var r=t.infinite?t.slideCount*2:t.slideCount,n=t.infinite?t.slidesToShow*-1:0,i=t.infinite?t.slidesToShow*-1:0,o=[];nn[n.length-1])r=n[n.length-1];else for(var o in n){if(rt.swipeLeft*-1)return n=d,!1}else if(d.offsetLeft-r+Lu(d)/2>t.swipeLeft*-1)return n=d,!1;return!0}),!n)return 0;var a=t.rtl===!0?t.slideCount-t.currentSlide:t.currentSlide,c=Math.abs(n.dataset.index-a)||1;return c}else return t.slidesToScroll};W.getSlideCount=Lp;var Kd=function(t,r){return r.reduce(function(n,i){return n&&t.hasOwnProperty(i)},!0)?null:console.error("Keys Missing:",t)};W.checkSpecKeys=Kd;var pl=function(t){Kd(t,["left","variableWidth","slideCount","slidesToShow","slideWidth"]);var r,n,i=t.slideCount+2*t.slidesToShow;t.vertical?n=i*t.slideHeight:r=YS(t)*t.slideWidth;var o={opacity:1,transition:"",WebkitTransition:""};if(t.useTransform){var a=t.vertical?"translate3d(0px, "+t.left+"px, 0px)":"translate3d("+t.left+"px, 0px, 0px)",c=t.vertical?"translate3d(0px, "+t.left+"px, 0px)":"translate3d("+t.left+"px, 0px, 0px)",d=t.vertical?"translateY("+t.left+"px)":"translateX("+t.left+"px)";o=Ze(Ze({},o),{},{WebkitTransform:a,transform:c,msTransform:d})}else t.vertical?o.top=t.left:o.left=t.left;return t.fade&&(o={opacity:1}),r&&(o.width=r),n&&(o.height=n),window&&!window.addEventListener&&window.attachEvent&&(t.vertical?o.marginTop=t.left+"px":o.marginLeft=t.left+"px"),o};W.getTrackCSS=pl;var bg=function(t){Kd(t,["left","variableWidth","slideCount","slidesToShow","slideWidth","speed","cssEase"]);var r=pl(t);return t.useTransform?(r.WebkitTransition="-webkit-transform "+t.speed+"ms "+t.cssEase,r.transition="transform "+t.speed+"ms "+t.cssEase):t.vertical?r.transition="top "+t.speed+"ms "+t.cssEase:r.transition="left "+t.speed+"ms "+t.cssEase,r};W.getTrackAnimateCSS=bg;var gl=function(t){if(t.unslick)return 0;Kd(t,["slideIndex","trackRef","infinite","centerMode","slideCount","slidesToShow","slidesToScroll","slideWidth","listWidth","variableWidth","slideHeight"]);var r=t.slideIndex,n=t.trackRef,i=t.infinite,o=t.centerMode,a=t.slideCount,c=t.slidesToShow,d=t.slidesToScroll,h=t.slideWidth,g=t.listWidth,v=t.variableWidth,x=t.slideHeight,k=t.fade,C=t.vertical,D=0,E,y,w=0;if(k||t.slideCount===1)return 0;var b=0;if(i?(b=-Ua(t),a%d!==0&&r+d>a&&(b=-(r>a?c-(r-a):a%d)),o&&(b+=parseInt(c/2))):(a%d!==0&&r+d>a&&(b=c-a%d),o&&(b=parseInt(c/2))),D=b*h,w=b*x,C?E=r*x*-1+w:E=r*h*-1+D,v===!0){var j,T=n&&n.node;if(j=r+Ua(t),y=T&&T.childNodes[j],E=y?y.offsetLeft*-1:0,o===!0){j=i?r+Ua(t):r,y=T&&T.children[j],E=0;for(var R=0;Rt.currentSlide?t.targetSlide>t.currentSlide+HS(t)?"left":"right":t.targetSlide0&&(a+=1),i&&r%2===0&&(a+=1),a}return i?0:r-1};W.slidesOnRight=HS;var FS=function(t){var r=t.slidesToShow,n=t.centerMode,i=t.rtl,o=t.centerPadding;if(n){var a=(r-1)/2+1;return parseInt(o)>0&&(a+=1),!i&&r%2===0&&(a+=1),a}return i?r-1:0};W.slidesOnLeft=FS;var OL=function(){return!!(typeof window<"u"&&window.document&&window.document.createElement)};W.canUseDOM=OL;var Xd={};function Mp(e){return Mp=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Mp(e)}Object.defineProperty(Xd,"__esModule",{value:!0});Xd.Track=void 0;var _i=US(I),wh=US(Ls),_h=W;function US(e){return e&&e.__esModule?e:{default:e}}function Ip(){return Ip=Object.assign||function(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function Mu(e){return Mu=Object.setPrototypeOf?Object.getPrototypeOf:function(r){return r.__proto__||Object.getPrototypeOf(r)},Mu(e)}function F1(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function ir(e){for(var t=1;t=t.slideCount,t.centerMode?(o=Math.floor(t.slidesToShow/2),n=(a-t.currentSlide)%t.slideCount===0,a>t.currentSlide-o-1&&a<=t.currentSlide+o&&(r=!0)):r=t.currentSlide<=a&&a=t.slideCount?c=t.targetSlide-t.slideCount:c=t.targetSlide;var d=a===c;return{"slick-slide":!0,"slick-active":r,"slick-center":n,"slick-cloned":i,"slick-current":d}},YL=function(t){var r={};return(t.variableWidth===void 0||t.variableWidth===!1)&&(r.width=t.slideWidth),t.fade&&(r.position="relative",t.vertical?r.top=-t.index*parseInt(t.slideHeight):r.left=-t.index*parseInt(t.slideWidth),r.opacity=t.currentSlide===t.index?1:0,t.useCSS&&(r.transition="opacity "+t.speed+"ms "+t.cssEase+", visibility "+t.speed+"ms "+t.cssEase)),r},Sh=function(t,r){return t.key||r},VL=function(t){var r,n=[],i=[],o=[],a=_i.default.Children.count(t.children),c=(0,_h.lazyStartIndex)(t),d=(0,_h.lazyEndIndex)(t);return _i.default.Children.forEach(t.children,function(h,g){var v,x={message:"children",index:g,slidesToScroll:t.slidesToScroll,currentSlide:t.currentSlide};!t.lazyLoad||t.lazyLoad&&t.lazyLoadedList.indexOf(g)>=0?v=h:v=_i.default.createElement("div",null);var k=YL(ir(ir({},t),{},{index:g})),C=v.props.className||"",D=xh(ir(ir({},t),{},{index:g}));if(n.push(_i.default.cloneElement(v,{key:"original"+Sh(v,g),"data-index":g,className:(0,wh.default)(D,C),tabIndex:"-1","aria-hidden":!D["slick-active"],style:ir(ir({outline:"none"},v.props.style||{}),k),onClick:function(w){v.props&&v.props.onClick&&v.props.onClick(w),t.focusOnSelect&&t.focusOnSelect(x)}})),t.infinite&&t.fade===!1){var E=a-g;E<=(0,_h.getPreClones)(t)&&a!==t.slidesToShow&&(r=-E,r>=c&&(v=h),D=xh(ir(ir({},t),{},{index:r})),i.push(_i.default.cloneElement(v,{key:"precloned"+Sh(v,r),"data-index":r,tabIndex:"-1",className:(0,wh.default)(D,C),"aria-hidden":!D["slick-active"],style:ir(ir({},v.props.style||{}),k),onClick:function(w){v.props&&v.props.onClick&&v.props.onClick(w),t.focusOnSelect&&t.focusOnSelect(x)}}))),a!==t.slidesToShow&&(r=a+g,r"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function Iu(e){return Iu=Object.setPrototypeOf?Object.getPrototypeOf:function(r){return r.__proto__||Object.getPrototypeOf(r)},Iu(e)}var ZL=function(t){var r;return t.infinite?r=Math.ceil(t.slideCount/t.slidesToScroll):r=Math.ceil((t.slideCount-t.slidesToShow)/t.slidesToScroll)+1,r},JL=function(e){GL(r,e);var t=KL(r);function r(){return BL(this,r),t.apply(this,arguments)}return WL(r,[{key:"clickHandler",value:function(i,o){o.preventDefault(),this.props.clickHandler(i)}},{key:"render",value:function(){for(var i=this.props,o=i.onMouseEnter,a=i.onMouseOver,c=i.onMouseLeave,d=i.infinite,h=i.slidesToScroll,g=i.slidesToShow,v=i.slideCount,x=i.currentSlide,k=ZL({slideCount:v,slidesToScroll:h,slidesToShow:g,infinite:d}),C={onMouseEnter:o,onMouseOver:a,onMouseLeave:c},D=[],E=0;E=j&&x<=w:x===j}),R={message:"dots",index:E,slidesToScroll:h,currentSlide:x},P=this.clickHandler.bind(this,R);D=D.concat(Sc.default.createElement("li",{key:E,className:T},Sc.default.cloneElement(this.props.customPaging(E),{onClick:P})))}return Sc.default.cloneElement(this.props.appendDots(D),UL({className:this.props.dotsClass},C))}}]),r}(Sc.default.PureComponent);Qd.Dots=JL;var Ms={};function Fp(e){return Fp=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Fp(e)}Object.defineProperty(Ms,"__esModule",{value:!0});Ms.PrevArrow=Ms.NextArrow=void 0;var vs=WS(I),BS=WS(Ls),eM=W;function WS(e){return e&&e.__esModule?e:{default:e}}function Nu(){return Nu=Object.assign||function(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function Yu(e){return Yu=Object.setPrototypeOf?Object.getPrototypeOf:function(r){return r.__proto__||Object.getPrototypeOf(r)},Yu(e)}var oM=function(e){XS(r,e);var t=QS(r);function r(){return GS(this,r),t.apply(this,arguments)}return KS(r,[{key:"clickHandler",value:function(i,o){o&&o.preventDefault(),this.props.clickHandler(i,o)}},{key:"render",value:function(){var i={"slick-arrow":!0,"slick-prev":!0},o=this.clickHandler.bind(this,{message:"previous"});!this.props.infinite&&(this.props.currentSlide===0||this.props.slideCount<=this.props.slidesToShow)&&(i["slick-disabled"]=!0,o=null);var a={key:"0","data-role":"none",className:(0,BS.default)(i),style:{display:"block"},onClick:o},c={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount},d;return this.props.prevArrow?d=vs.default.cloneElement(this.props.prevArrow,zu(zu({},a),c)):d=vs.default.createElement("button",Nu({key:"0",type:"button"},a)," ","Previous"),d}}]),r}(vs.default.PureComponent);Ms.PrevArrow=oM;var sM=function(e){XS(r,e);var t=QS(r);function r(){return GS(this,r),t.apply(this,arguments)}return KS(r,[{key:"clickHandler",value:function(i,o){o&&o.preventDefault(),this.props.clickHandler(i,o)}},{key:"render",value:function(){var i={"slick-arrow":!0,"slick-next":!0},o=this.clickHandler.bind(this,{message:"next"});(0,eM.canGoNext)(this.props)||(i["slick-disabled"]=!0,o=null);var a={key:"1","data-role":"none",className:(0,BS.default)(i),style:{display:"block"},onClick:o},c={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount},d;return this.props.nextArrow?d=vs.default.cloneElement(this.props.nextArrow,zu(zu({},a),c)):d=vs.default.createElement("button",Nu({key:"1",type:"button"},a)," ","Next"),d}}]),r}(vs.default.PureComponent);Ms.NextArrow=sM;var qS=function(){if(typeof Map<"u")return Map;function e(t,r){var n=-1;return t.some(function(i,o){return i[0]===r?(n=o,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),i=this.__entries__[n];return i&&i[1]},t.prototype.set=function(r,n){var i=e(this.__entries__,r);~i?this.__entries__[i][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,i=e(n,r);~i&&n.splice(i,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var i=0,o=this.__entries__;i0},e.prototype.connect_=function(){!$p||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),fM?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!$p||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,i=dM.some(function(o){return!!~n.indexOf(o)});i&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),ZS=function(e,t){for(var r=0,n=Object.keys(t);r"u"||!(Element instanceof Object))){if(!(t instanceof Is(t).Element))throw new TypeError('parameter 1 is not of type "Element".');var r=this.observations_;r.has(t)||(r.set(t,new xM(t)),this.controller_.addObserver(this),this.controller_.refresh())}},e.prototype.unobserve=function(t){if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");if(!(typeof Element>"u"||!(Element instanceof Object))){if(!(t instanceof Is(t).Element))throw new TypeError('parameter 1 is not of type "Element".');var r=this.observations_;r.has(t)&&(r.delete(t),r.size||this.controller_.removeObserver(this))}},e.prototype.disconnect=function(){this.clearActive(),this.observations_.clear(),this.controller_.removeObserver(this)},e.prototype.gatherActive=function(){var t=this;this.clearActive(),this.observations_.forEach(function(r){r.isActive()&&t.activeObservations_.push(r)})},e.prototype.broadcastActive=function(){if(this.hasActive()){var t=this.callbackCtx_,r=this.activeObservations_.map(function(n){return new SM(n.target,n.broadcastRect())});this.callback_.call(t,r,t),this.clearActive()}},e.prototype.clearActive=function(){this.activeObservations_.splice(0)},e.prototype.hasActive=function(){return this.activeObservations_.length>0},e}(),eb=typeof WeakMap<"u"?new WeakMap:new qS,tb=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=hM.getInstance(),n=new bM(t,r,this);eb.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){tb.prototype[e]=function(){var t;return(t=eb.get(this))[e].apply(t,arguments)}});var kM=function(){return typeof Vu.ResizeObserver<"u"?Vu.ResizeObserver:tb}();const CM=Object.freeze(Object.defineProperty({__proto__:null,default:kM},Symbol.toStringTag,{value:"Module"})),DM=Dj(CM);Object.defineProperty(Gd,"__esModule",{value:!0});Gd.InnerSlider=void 0;var Qt=Rl(I),EM=Rl(PS),jM=Rl(yL),AM=Rl(Ls),rt=W,TM=Xd,RM=Qd,X1=Ms,OM=Rl(DM);function Rl(e){return e&&e.__esModule?e:{default:e}}function Fu(e){return Fu=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Fu(e)}function Uu(){return Uu=Object.assign||function(e){for(var t=1;t=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function LM(e,t){if(e==null)return{};var r={},n=Object.keys(e),i,o;for(o=0;o=0)&&(r[i]=e[i]);return r}function Q1(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function de(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function $u(e){return $u=Object.setPrototypeOf?Object.getPrototypeOf:function(r){return r.__proto__||Object.getPrototypeOf(r)},$u(e)}function Se(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var HM=function(e){NM(r,e);var t=zM(r);function r(n){var i;MM(this,r),i=t.call(this,n),Se(xe(i),"listRefHandler",function(a){return i.list=a}),Se(xe(i),"trackRefHandler",function(a){return i.track=a}),Se(xe(i),"adaptHeight",function(){if(i.props.adaptiveHeight&&i.list){var a=i.list.querySelector('[data-index="'.concat(i.state.currentSlide,'"]'));i.list.style.height=(0,rt.getHeight)(a)+"px"}}),Se(xe(i),"componentDidMount",function(){if(i.props.onInit&&i.props.onInit(),i.props.lazyLoad){var a=(0,rt.getOnDemandLazySlides)(de(de({},i.props),i.state));a.length>0&&(i.setState(function(d){return{lazyLoadedList:d.lazyLoadedList.concat(a)}}),i.props.onLazyLoad&&i.props.onLazyLoad(a))}var c=de({listRef:i.list,trackRef:i.track},i.props);i.updateState(c,!0,function(){i.adaptHeight(),i.props.autoplay&&i.autoPlay("update")}),i.props.lazyLoad==="progressive"&&(i.lazyLoadTimer=setInterval(i.progressiveLazyLoad,1e3)),i.ro=new OM.default(function(){i.state.animating?(i.onWindowResized(!1),i.callbackTimers.push(setTimeout(function(){return i.onWindowResized()},i.props.speed))):i.onWindowResized()}),i.ro.observe(i.list),document.querySelectorAll&&Array.prototype.forEach.call(document.querySelectorAll(".slick-slide"),function(d){d.onfocus=i.props.pauseOnFocus?i.onSlideFocus:null,d.onblur=i.props.pauseOnFocus?i.onSlideBlur:null}),window.addEventListener?window.addEventListener("resize",i.onWindowResized):window.attachEvent("onresize",i.onWindowResized)}),Se(xe(i),"componentWillUnmount",function(){i.animationEndCallback&&clearTimeout(i.animationEndCallback),i.lazyLoadTimer&&clearInterval(i.lazyLoadTimer),i.callbackTimers.length&&(i.callbackTimers.forEach(function(a){return clearTimeout(a)}),i.callbackTimers=[]),window.addEventListener?window.removeEventListener("resize",i.onWindowResized):window.detachEvent("onresize",i.onWindowResized),i.autoplayTimer&&clearInterval(i.autoplayTimer),i.ro.disconnect()}),Se(xe(i),"componentDidUpdate",function(a){if(i.checkImagesLoad(),i.props.onReInit&&i.props.onReInit(),i.props.lazyLoad){var c=(0,rt.getOnDemandLazySlides)(de(de({},i.props),i.state));c.length>0&&(i.setState(function(g){return{lazyLoadedList:g.lazyLoadedList.concat(c)}}),i.props.onLazyLoad&&i.props.onLazyLoad(c))}i.adaptHeight();var d=de(de({listRef:i.list,trackRef:i.track},i.props),i.state),h=i.didPropsChange(a);h&&i.updateState(d,h,function(){i.state.currentSlide>=Qt.default.Children.count(i.props.children)&&i.changeSlide({message:"index",index:Qt.default.Children.count(i.props.children)-i.props.slidesToShow,currentSlide:i.state.currentSlide}),i.props.autoplay?i.autoPlay("update"):i.pause("paused")})}),Se(xe(i),"onWindowResized",function(a){i.debouncedResize&&i.debouncedResize.cancel(),i.debouncedResize=(0,jM.default)(function(){return i.resizeWindow(a)},50),i.debouncedResize()}),Se(xe(i),"resizeWindow",function(){var a=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0,c=!!(i.track&&i.track.node);if(c){var d=de(de({listRef:i.list,trackRef:i.track},i.props),i.state);i.updateState(d,a,function(){i.props.autoplay?i.autoPlay("update"):i.pause("paused")}),i.setState({animating:!1}),clearTimeout(i.animationEndCallback),delete i.animationEndCallback}}),Se(xe(i),"updateState",function(a,c,d){var h=(0,rt.initializedState)(a);a=de(de(de({},a),h),{},{slideIndex:h.currentSlide});var g=(0,rt.getTrackLeft)(a);a=de(de({},a),{},{left:g});var v=(0,rt.getTrackCSS)(a);(c||Qt.default.Children.count(i.props.children)!==Qt.default.Children.count(a.children))&&(h.trackStyle=v),i.setState(h,d)}),Se(xe(i),"ssrInit",function(){if(i.props.variableWidth){var a=0,c=0,d=[],h=(0,rt.getPreClones)(de(de(de({},i.props),i.state),{},{slideCount:i.props.children.length})),g=(0,rt.getPostClones)(de(de(de({},i.props),i.state),{},{slideCount:i.props.children.length}));i.props.children.forEach(function(P){d.push(P.props.style.width),a+=P.props.style.width});for(var v=0;v=c&&i.onWindowResized()};if(!h.onclick)h.onclick=function(){return h.parentNode.focus()};else{var v=h.onclick;h.onclick=function(){v(),h.parentNode.focus()}}h.onload||(i.props.lazyLoad?h.onload=function(){i.adaptHeight(),i.callbackTimers.push(setTimeout(i.onWindowResized,i.props.speed))}:(h.onload=g,h.onerror=function(){g(),i.props.onLazyLoadError&&i.props.onLazyLoadError()}))})}),Se(xe(i),"progressiveLazyLoad",function(){for(var a=[],c=de(de({},i.props),i.state),d=i.state.currentSlide;d=-(0,rt.getPreClones)(c);h--)if(i.state.lazyLoadedList.indexOf(h)<0){a.push(h);break}a.length>0?(i.setState(function(g){return{lazyLoadedList:g.lazyLoadedList.concat(a)}}),i.props.onLazyLoad&&i.props.onLazyLoad(a)):i.lazyLoadTimer&&(clearInterval(i.lazyLoadTimer),delete i.lazyLoadTimer)}),Se(xe(i),"slideHandler",function(a){var c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,d=i.props,h=d.asNavFor,g=d.beforeChange,v=d.onLazyLoad,x=d.speed,k=d.afterChange,C=i.state.currentSlide,D=(0,rt.slideHandler)(de(de(de({index:a},i.props),i.state),{},{trackRef:i.track,useCSS:i.props.useCSS&&!c})),E=D.state,y=D.nextState;if(E){g&&g(C,E.currentSlide);var w=E.lazyLoadedList.filter(function(b){return i.state.lazyLoadedList.indexOf(b)<0});v&&w.length>0&&v(w),!i.props.waitForAnimate&&i.animationEndCallback&&(clearTimeout(i.animationEndCallback),k&&k(C),delete i.animationEndCallback),i.setState(E,function(){h&&i.asNavForIndex!==a&&(i.asNavForIndex=a,h.innerSlider.slideHandler(a)),y&&(i.animationEndCallback=setTimeout(function(){var b=y.animating,j=PM(y,["animating"]);i.setState(j,function(){i.callbackTimers.push(setTimeout(function(){return i.setState({animating:b})},10)),k&&k(E.currentSlide),delete i.animationEndCallback})},x))})}}),Se(xe(i),"changeSlide",function(a){var c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,d=de(de({},i.props),i.state),h=(0,rt.changeSlide)(d,a);if(!(h!==0&&!h)&&(c===!0?i.slideHandler(h,c):i.slideHandler(h),i.props.autoplay&&i.autoPlay("update"),i.props.focusOnSelect)){var g=i.list.querySelectorAll(".slick-current");g[0]&&g[0].focus()}}),Se(xe(i),"clickHandler",function(a){i.clickable===!1&&(a.stopPropagation(),a.preventDefault()),i.clickable=!0}),Se(xe(i),"keyHandler",function(a){var c=(0,rt.keyHandler)(a,i.props.accessibility,i.props.rtl);c!==""&&i.changeSlide({message:c})}),Se(xe(i),"selectHandler",function(a){i.changeSlide(a)}),Se(xe(i),"disableBodyScroll",function(){var a=function(d){d=d||window.event,d.preventDefault&&d.preventDefault(),d.returnValue=!1};window.ontouchmove=a}),Se(xe(i),"enableBodyScroll",function(){window.ontouchmove=null}),Se(xe(i),"swipeStart",function(a){i.props.verticalSwiping&&i.disableBodyScroll();var c=(0,rt.swipeStart)(a,i.props.swipe,i.props.draggable);c!==""&&i.setState(c)}),Se(xe(i),"swipeMove",function(a){var c=(0,rt.swipeMove)(a,de(de(de({},i.props),i.state),{},{trackRef:i.track,listRef:i.list,slideIndex:i.state.currentSlide}));c&&(c.swiping&&(i.clickable=!1),i.setState(c))}),Se(xe(i),"swipeEnd",function(a){var c=(0,rt.swipeEnd)(a,de(de(de({},i.props),i.state),{},{trackRef:i.track,listRef:i.list,slideIndex:i.state.currentSlide}));if(c){var d=c.triggerSlideHandler;delete c.triggerSlideHandler,i.setState(c),d!==void 0&&(i.slideHandler(d),i.props.verticalSwiping&&i.enableBodyScroll())}}),Se(xe(i),"touchEnd",function(a){i.swipeEnd(a),i.clickable=!0}),Se(xe(i),"slickPrev",function(){i.callbackTimers.push(setTimeout(function(){return i.changeSlide({message:"previous"})},0))}),Se(xe(i),"slickNext",function(){i.callbackTimers.push(setTimeout(function(){return i.changeSlide({message:"next"})},0))}),Se(xe(i),"slickGoTo",function(a){var c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;if(a=Number(a),isNaN(a))return"";i.callbackTimers.push(setTimeout(function(){return i.changeSlide({message:"index",index:a,currentSlide:i.state.currentSlide},c)},0))}),Se(xe(i),"play",function(){var a;if(i.props.rtl)a=i.state.currentSlide-i.props.slidesToScroll;else if((0,rt.canGoNext)(de(de({},i.props),i.state)))a=i.state.currentSlide+i.props.slidesToScroll;else return!1;i.slideHandler(a)}),Se(xe(i),"autoPlay",function(a){i.autoplayTimer&&clearInterval(i.autoplayTimer);var c=i.state.autoplaying;if(a==="update"){if(c==="hovered"||c==="focused"||c==="paused")return}else if(a==="leave"){if(c==="paused"||c==="focused")return}else if(a==="blur"&&(c==="paused"||c==="hovered"))return;i.autoplayTimer=setInterval(i.play,i.props.autoplaySpeed+50),i.setState({autoplaying:"playing"})}),Se(xe(i),"pause",function(a){i.autoplayTimer&&(clearInterval(i.autoplayTimer),i.autoplayTimer=null);var c=i.state.autoplaying;a==="paused"?i.setState({autoplaying:"paused"}):a==="focused"?(c==="hovered"||c==="playing")&&i.setState({autoplaying:"focused"}):c==="playing"&&i.setState({autoplaying:"hovered"})}),Se(xe(i),"onDotsOver",function(){return i.props.autoplay&&i.pause("hovered")}),Se(xe(i),"onDotsLeave",function(){return i.props.autoplay&&i.state.autoplaying==="hovered"&&i.autoPlay("leave")}),Se(xe(i),"onTrackOver",function(){return i.props.autoplay&&i.pause("hovered")}),Se(xe(i),"onTrackLeave",function(){return i.props.autoplay&&i.state.autoplaying==="hovered"&&i.autoPlay("leave")}),Se(xe(i),"onSlideFocus",function(){return i.props.autoplay&&i.pause("focused")}),Se(xe(i),"onSlideBlur",function(){return i.props.autoplay&&i.state.autoplaying==="focused"&&i.autoPlay("blur")}),Se(xe(i),"render",function(){var a=(0,AM.default)("slick-slider",i.props.className,{"slick-vertical":i.props.vertical,"slick-initialized":!0}),c=de(de({},i.props),i.state),d=(0,rt.extractObject)(c,["fade","cssEase","speed","infinite","centerMode","focusOnSelect","currentSlide","lazyLoad","lazyLoadedList","rtl","slideWidth","slideHeight","listHeight","vertical","slidesToShow","slidesToScroll","slideCount","trackStyle","variableWidth","unslick","centerPadding","targetSlide","useCSS"]),h=i.props.pauseOnHover;d=de(de({},d),{},{onMouseEnter:h?i.onTrackOver:null,onMouseLeave:h?i.onTrackLeave:null,onMouseOver:h?i.onTrackOver:null,focusOnSelect:i.props.focusOnSelect&&i.clickable?i.selectHandler:null});var g;if(i.props.dots===!0&&i.state.slideCount>=i.props.slidesToShow){var v=(0,rt.extractObject)(c,["dotsClass","slideCount","slidesToShow","currentSlide","slidesToScroll","clickHandler","children","customPaging","infinite","appendDots"]),x=i.props.pauseOnDotsHover;v=de(de({},v),{},{clickHandler:i.changeSlide,onMouseEnter:x?i.onDotsLeave:null,onMouseOver:x?i.onDotsOver:null,onMouseLeave:x?i.onDotsLeave:null}),g=Qt.default.createElement(RM.Dots,v)}var k,C,D=(0,rt.extractObject)(c,["infinite","centerMode","currentSlide","slideCount","slidesToShow","prevArrow","nextArrow"]);D.clickHandler=i.changeSlide,i.props.arrows&&(k=Qt.default.createElement(X1.PrevArrow,D),C=Qt.default.createElement(X1.NextArrow,D));var E=null;i.props.vertical&&(E={height:i.state.listHeight});var y=null;i.props.vertical===!1?i.props.centerMode===!0&&(y={padding:"0px "+i.props.centerPadding}):i.props.centerMode===!0&&(y={padding:i.props.centerPadding+" 0px"});var w=de(de({},E),y),b=i.props.touchMove,j={className:"slick-list",style:w,onClick:i.clickHandler,onMouseDown:b?i.swipeStart:null,onMouseMove:i.state.dragging&&b?i.swipeMove:null,onMouseUp:b?i.swipeEnd:null,onMouseLeave:i.state.dragging&&b?i.swipeEnd:null,onTouchStart:b?i.swipeStart:null,onTouchMove:i.state.dragging&&b?i.swipeMove:null,onTouchEnd:b?i.touchEnd:null,onTouchCancel:i.state.dragging&&b?i.swipeEnd:null,onKeyDown:i.props.accessibility?i.keyHandler:null},T={className:a,dir:"ltr",style:i.props.style};return i.props.unslick&&(j={className:"slick-list"},T={className:a}),Qt.default.createElement("div",T,i.props.unslick?"":k,Qt.default.createElement("div",Uu({ref:i.listRefHandler},j),Qt.default.createElement(TM.Track,Uu({ref:i.trackRefHandler},d),i.props.children)),i.props.unslick?"":C,i.props.unslick?"":g)}),i.list=null,i.track=null,i.state=de(de({},EM.default),{},{currentSlide:i.props.initialSlide,slideCount:Qt.default.Children.count(i.props.children)}),i.callbackTimers=[],i.clickable=!0,i.debouncedResize=null;var o=i.ssrInit();return i.state=de(de({},i.state),o),i}return IM(r,[{key:"didPropsChange",value:function(i){for(var o=!1,a=0,c=Object.keys(this.props);a"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function j(O){return j=Object.setPrototypeOf?Object.getPrototypeOf:function(Y){return Y.__proto__||Object.getPrototypeOf(Y)},j(O)}function T(O,z,Y){return z in O?Object.defineProperty(O,z,{value:Y,enumerable:!0,configurable:!0,writable:!0}):O[z]=Y,O}var R=(0,a.canUseDOM)()&&qM(),P=function(O){C(Y,O);var z=E(Y);function Y(ee){var te;return v(this,Y),te=z.call(this,ee),T(w(te),"innerSliderRefHandler",function(G){return te.innerSlider=G}),T(w(te),"slickPrev",function(){return te.innerSlider.slickPrev()}),T(w(te),"slickNext",function(){return te.innerSlider.slickNext()}),T(w(te),"slickGoTo",function(G){var lt=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;return te.innerSlider.slickGoTo(G,lt)}),T(w(te),"slickPause",function(){return te.innerSlider.pause("paused")}),T(w(te),"slickPlay",function(){return te.innerSlider.autoPlay("play")}),te.state={breakpoint:null},te._responsiveMediaHandlers=[],te}return k(Y,[{key:"media",value:function(te,G){R.register(te,G),this._responsiveMediaHandlers.push({query:te,handler:G})}},{key:"componentDidMount",value:function(){var te=this;if(this.props.responsive){var G=this.props.responsive.map(function(je){return je.breakpoint});G.sort(function(je,ze){return je-ze}),G.forEach(function(je,ze){var mt;ze===0?mt=(0,i.default)({minWidth:0,maxWidth:je}):mt=(0,i.default)({minWidth:G[ze-1]+1,maxWidth:je}),(0,a.canUseDOM)()&&te.media(mt,function(){te.setState({breakpoint:je})})});var lt=(0,i.default)({minWidth:G.slice(-1)[0]});(0,a.canUseDOM)()&&this.media(lt,function(){te.setState({breakpoint:null})})}}},{key:"componentWillUnmount",value:function(){this._responsiveMediaHandlers.forEach(function(te){R.unregister(te.query,te.handler)})}},{key:"render",value:function(){var te=this,G,lt;this.state.breakpoint?(lt=this.props.responsive.filter(function(Fe){return Fe.breakpoint===te.state.breakpoint}),G=lt[0].settings==="unslick"?"unslick":g(g(g({},o.default),this.props),lt[0].settings)):G=g(g({},o.default),this.props),G.centerMode&&(G.slidesToScroll>1,G.slidesToScroll=1),G.fade&&(G.slidesToShow>1,G.slidesToScroll>1,G.slidesToShow=1,G.slidesToScroll=1);var je=r.default.Children.toArray(this.props.children);je=je.filter(function(Fe){return typeof Fe=="string"?!!Fe.trim():!!Fe}),G.variableWidth&&(G.rows>1||G.slidesPerRow>1)&&(console.warn("variableWidth is not supported in case of rows > 1 or slidesPerRow > 1"),G.variableWidth=!1);for(var ze=[],mt=null,$=0;$=je.length));he+=1)ue.push(r.default.cloneElement(je[he],{key:100*$+10*Q+he,tabIndex:-1,style:{width:"".concat(100/G.slidesPerRow,"%"),display:"inline-block"}}));le.push(r.default.createElement("div",{key:10*$+Q},ue))}G.variableWidth?ze.push(r.default.createElement("div",{key:$,style:{width:mt}},le)):ze.push(r.default.createElement("div",{key:$},le))}if(G==="unslick"){var st="regular slider "+(this.props.className||"");return r.default.createElement("div",{className:st},je)}else ze.length<=G.slidesToShow&&(G.unslick=!0);return r.default.createElement(n.InnerSlider,d({style:this.props.style,ref:this.innerSliderRefHandler},G),ze)}}]),Y}(r.default.Component);e.default=P})(OS);(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=r(OS);function r(i){return i&&i.__esModule?i:{default:i}}var n=t.default;e.default=n})(RS);const ZM=C2(RS),yn=f.button` - padding-block: 0.12rem; - padding-inline: 0.34rem; - color: inherit; - background: linear-gradient(90deg, #767ee5, #9966cc); - border-radius: 0.5rem; - border: none; - font-size: 0.18rem; - line-height: 0.32rem; - cursor: pointer; -`,iw="/zh-cn/assets/distributed-storage-bg-0c137d00.png",JM="/zh-cn/assets/data-access-bg-16d9313d.png",e3="/zh-cn/assets/metadata-management-bg-208ca887.png",t3="/zh-cn/assets/hardware-acceleration-bg-0f801c4e.png",r3="/zh-cn/assets/open-source-bg-83537308.png",n3="/zh-cn/assets/fox-icon-09b1199e.svg",i3="/zh-cn/assets/right-arrow-2ae8803b.svg",o3=[{key:"new-honors",label:"新闻/荣誉",url:"/news-honor-dynamic",content:{type:"text",content:"达坦科技所获荣誉及相关新闻"}},{key:"event-preview",label:"活动预告",url:"/events",content:{type:"text",content:"Virtual Meetings & Meetups 线上会议及分享的预告"}},{key:"highlight-review",label:"精彩回顾",url:"/highlights",content:{type:"text",content:"直播分享或Meetups精彩回顾"}}],{Heading:s3,Paragraph:a3}=Pe,{CNHead1:l3}=s3,{CNBodyLarge:c3}=a3,u3=e=>{switch(e){case"distributed-storage":return iw;case"data-access":return JM;case"metadata-management":return e3;case"hardware-acceleration":return t3;case"open-source":return r3;default:return iw}},d3=f.div` - color: #fff; - background-size: cover; - padding-top: 0.72rem; - background-image: url(${({bg:e})=>u3(e)}); -`,f3=f.div` - display: flex; - flex-direction: column; - align-items: center; - max-width: 1440px; - margin-inline: auto; - padding-top: calc(2.7rem - 0.72rem); - padding-inline: 2.15rem; -`,h3=f.div` - display: flex; - justify-content: center; - width: 100%; - margin-bottom: 0.95rem; - background: rgba(0, 0, 0, 0.09); - backdrop-filter: blur(8.5px); - border: 0.01rem solid transparent; - border-image: linear-gradient(180deg, #ffffff, #ffffff40) 1; - clip-path: inset(0 round 0.14rem); - :last-child div { - border: none; - } - - /* border: 0.01rem solid #fff; */ - /* border-radius: 0.12rem; */ -`,m3=f.div` - width: 33.33%; - padding-block: 0.32rem; -`,p3=f.div` - display: flex; - flex-direction: column; - height: 100%; - padding-inline: 0.52rem; - border-right: 1px solid #d9dbef; -`,g3=f.div` - display: flex; - align-items: center; - margin-bottom: 0.22rem; -`,v3=f.div` - margin-right: 0.15rem; - font-size: 0.2rem; - line-height: 0.3rem; - letter-spacing: -2%; -`,y3=f.img` - height: 0.3rem; - margin-right: 0.27rem; -`,w3=f.p` - margin-right: 0.1rem; - font-size: 0.14rem; - line-height: 0.26rem; - color: ${e=>e.theme.secondary08}; - cursor: pointer; -`,_3=f.img` - width: 0.14rem; - cursor: pointer; -`,x3=f.p` - font-size: 0.16rem; - line-height: 0.3rem; -`,S3=new Map([["distributed-storage","/solutions/ai"],["data-access","/solutions/storage"],["hardware-acceleration","/solutions/networks"],["open-source","/community"]]),b3=()=>{const e=ht();return l.jsx(h3,{children:o3.map(({key:t,label:r,content:n,url:i})=>l.jsx(m3,{children:l.jsxs(p3,{children:[l.jsxs(g3,{children:[l.jsx(v3,{children:r}),l.jsx(y3,{src:n3}),l.jsx(w3,{onClick:()=>{e(i)},children:"更多"}),l.jsx(_3,{src:i3})]}),n.type==="ul"?null:l.jsx(x3,{children:n.content})]})},t))})},k3=({items:e})=>{const t=ht(),{key:r,title:n,description:i}=e;return l.jsx(d3,{bg:r,children:l.jsxs(f3,{children:[l.jsx(l3,{style:{marginBottom:"0.32rem"},children:n}),l.jsx(c3,{style:{maxWidth:"6.12rem",textAlign:"center",marginBottom:"0.7rem"},children:i}),l.jsx(yn,{style:{marginBottom:"1.49rem"},onClick:()=>{t(S3.get(r))},children:"了解更多"}),l.jsx(b3,{})]})})},C3=f.div` - background-color: #000; -`,D3={dots:!0,infinite:!0,speed:1e3,slidesToShow:1,slidesToScroll:1,arrows:!1,fade:!0,autoplay:!0,autoplaySpeed:6e3,pauseOnFocus:!0},E3=({items:e})=>l.jsx(C3,{children:l.jsx(ZM,{...D3,children:e.map(t=>l.jsx(k3,{items:t},t.key))})}),j3="/zh-cn/assets/map-37f53016.png",A3="/zh-cn/assets/infrastructure-9fd998b9.png",T3="/zh-cn/assets/pc-d09b6ade.png",R3=f.section` - background: #fff; -`,O3=f.div` - display: flex; - flex-direction: column; - align-items: center; - max-width: 1440px; - margin-inline: auto; - padding-inline: 1.64rem; - padding-block: 0.94rem; - padding-bottom: 1.8rem; -`,P3=f.div` - color: #7680DD; - font-size: 0.42rem; - line-height: 0.56rem; - font-weight: 600; - text-align: center; - max-width: 72vw; - padding-inline: 6vw; - padding-bottom: 0.36rem; - border-bottom: 0.01rem solid #D9DBEF; - margin-bottom: 0.64rem; -`,jh=f.div` - padding-bottom: 0.56rem; - text-align: left; - width: 100%; - height: min-content; - &:last-child { - padding-bottom: 0; - } -`,Ah=f.div` - font-size: 0.32rem; - line-height: 0.58rem; - font-weight: 600; - color: #42424A; -`,ow=f.div` - display: flex; - gap: 0.56rem; -`,sw=f.div` - display: flex; - flex-direction: column; - justify-content: center; -`,bc=f.div` - font-size: 0.16rem; - line-height: 0.28rem; - padding-block: 0.24rem; - &::before { - content: ''; - display: inline-block; - width: 0.12rem; - height: 0.12rem; - background: #7680DD; - border-radius: 50%; - margin-left: -0.22rem; - margin-right: 0.1rem; - } -`,kc=f.span` - color: #7680DD; -`,aw=f.img` - width: 45%; -`,L3=f.img` - width: 100%; - margin-bottom: -0.24rem; -`,M3=()=>l.jsx(R3,{children:l.jsxs(O3,{children:[l.jsx(P3,{children:"DatenLord 存储+网络的融合方案解决 AI 算力资源问题"}),l.jsxs(jh,{children:[l.jsx(Ah,{children:"AI 的发展引起算力资源的紧张、分散和昂贵"}),l.jsxs(ow,{children:[l.jsxs(sw,{children:[l.jsxs(bc,{children:[l.jsx(kc,{children:"AI 大模型对高性能 GPU 算力资源需求大爆发。"}),"GPU 算力供不应求,供需极度不平衡。这进一步",l.jsx(kc,{children:"推高"}),"了原本因设计和制造成本以及市场垄断等因素就",l.jsx(kc,{children:"已经高企不下的GPU 算力价格"}),"。"]}),l.jsxs(bc,{children:["GPU 算力资源优先满足 AI 训练场景,这造成 ",l.jsx(kc,{children:"AI 推断场景的 GPU 算力资源具有分散或碎片化"}),"的特点。"]})]}),l.jsx(aw,{src:j3})]})]}),l.jsxs(jh,{children:[l.jsx(Ah,{children:"AI 算力资源的分散和昂贵对云计算带来的新问题"}),l.jsx(L3,{src:A3})]}),l.jsxs(jh,{children:[l.jsx(Ah,{children:"将云计算资源复用的方式引入 AI 算力资源分配管理"}),l.jsxs(ow,{children:[l.jsx(aw,{src:T3}),l.jsxs(sw,{children:[l.jsx(bc,{children:"优化缓存技术,实现数据预加载、异步持久化,进而提升数据访问的性能; "}),l.jsx(bc,{children:" 高性能RDMA网络,实现多节点内存共享,加速大模型的分发、加载。"})]})]})]})]})}),I3="/zh-cn/assets/logo-dark-027b6609.svg",N3="/zh-cn/assets/xline-logo-126dc1a3.svg",lw="/zh-cn/assets/cone-62ca8bad.png",{Heading:z3,Paragraph:Y3}=Pe,{CNHead4:Zd,CNTitleLarge:V3}=z3,{CNBodyLarge:Jd}=Y3,H3=f.section` - background: #ededf6; -`,F3=f.div` - display: flex; - flex-direction: column; - align-items: center; - max-width: 1440px; - margin-inline: auto; - padding-inline: 2.56rem; - padding-block: 0.94rem; - padding-bottom: 1.8rem; -`,U3=f(Zd)` - padding-bottom: 1.08rem; - color: ${e=>e.theme.gray04}; -`,kg=f.div` - padding: 0.06rem; - border: 0.03rem solid transparent; - border-radius: 0.18rem; -`,$3=f(kg)` - position: relative; - width: 100%; - border-left: 0.03rem solid #767ee5; -`,B3=f(kg)` - position: relative; - width: 80%; - border-right: 0.03rem solid #767ee5; - border-top: none; -`,W3=f(kg)` - position: relative; - width: 100%; - border-left: 0.03rem solid #767ee5; - border-top: none; -`,Cg=f.div` - display: flex; - padding-block: 0.32rem; - padding-inline: 0.64rem; - color: #42424a; - border-radius: 0.18rem; -`,G3=f(Cg)` - flex-direction: column; - background: linear-gradient(90deg, #ffffff95, #ffffff00); -`,K3=f(Cg)` - align-items: end; - padding-top: 0.96rem; -`,X3=f(Cg)` - flex-direction: column; - padding-right: 1.24rem; - background: linear-gradient(90deg, #ffffff95, #ffffff00); -`,Q3=f.img` - height: 0.58rem; - align-self: flex-end; -`,q3=f(Zd)` - color: #000; -`,Z3=f(Jd)` - width: 90%; - padding-bottom: 0.14rem; -`,J3=f(Zd)` - color: #000; - padding-bottom: 0.14rem; -`,eI=f(Jd)` - width: 70%; - text-align: right; - padding-bottom: 0.14rem; -`,tI=f.img` - height: 0.42rem; -`,rI=f.div` - display: flex; - flex: 1; - flex-direction: column; - align-items: end; -`,nI=f.img` - z-index: 100; - position: absolute; - top: -5%; - left: -35%; - width: 4rem; - height: 4rem; -`,iI=f.img` - z-index: 100; - position: absolute; - top: 0; - left: 0; - width: 1.2rem; - height: 1.2rem; - transform: rotate(80deg); -`,oI=f(Zd)` - color: #000; -`,sI=f(Jd)` - padding-bottom: 0.35rem; -`,aI=f.ul` - padding-bottom: 0.3rem; - color: #7680dd; -`,cw=f(V3)` - padding-bottom: 0.05rem; -`,uw=f(Jd)` - padding-bottom: 0.05rem; - color: ${e=>e.theme.themeDark}; -`,Th=f.div``,ef=f.div` - position: absolute; - width: 0.36rem; - height: 0.36rem; - background-color: transparent; - border-radius: 0.18rem; -`,dw=f(ef)` - top: -0.02rem; - left: -0.02rem; - border-left: 0.03rem solid #767ee5; - transform: rotate(45deg); -`,fw=f(ef)` - bottom: -0.02rem; - left: -0.02rem; - border-left: 0.03rem solid #767ee5; - transform: rotate(-45deg); -`,lI=f(ef)` - top: -0.02rem; - right: -0.02rem; - border-right: 0.03rem solid #767ee5; - transform: rotate(-45deg); -`,cI=f(ef)` - bottom: -0.02rem; - right: -0.02rem; - border-right: 0.03rem solid #767ee5; - transform: rotate(45deg); -`,Bs=f.div` - position: absolute; - height: 0.03rem; -`,uI=f(Bs)` - top: -0.03rem; - left: 0.13rem; - width: 93%; - background: linear-gradient(90deg, #767ee5, #9966cc); -`,dI=f(Bs)` - top: -0.03rem; - right: 0.13rem; - width: 10%; - background: #767ee5; -`,fI=f(Bs)` - top: -0.03rem; - left: 0.13rem; - width: 10%; - background: #767ee5; -`,hI=f(Bs)` - bottom: -0.03rem; - left: 0.13rem; - width: 70%; - background: linear-gradient(90deg, #767ee5, #9966cc); -`,mI=f(Bs)` - bottom: -0.03rem; - right: 0.13rem; - width: 90%; - background: linear-gradient(90deg, #9966cc, #767ee5); -`,pI=f(Bs)` - bottom: -0.03rem; - left: 0.13rem; - width: 100%; - background: linear-gradient(90deg, #9966cc, #767ee5); -`,Ws=f.div` - position: absolute; - width: 0.16rem; - height: 0.16rem; - border-radius: 50%; -`,gI=f(Ws)` - top: calc(-0.08rem - 0.02rem); - right: 5%; - background: #9966cc; -`,vI=f(Ws)` - bottom: calc(-0.08rem - 0.02rem); - right: 28%; - background: #9966cc; -`,yI=f(Ws)` - top: calc(-0.08rem - 0.01rem); - right: 10%; - background: #767ee5; -`,wI=f(Ws)` - bottom: calc(-0.08rem - 0.01rem); - left: 8%; - background: #9966cc; -`,_I=f(Ws)` - top: calc(-0.08rem - 0.02rem); - left: 10%; - background: #767ee5; -`,xI=f(Ws)` - bottom: calc(-0.08rem - 0.01rem); - right: -2%; - background: #767ee5; -`,SI=f.div` - position: relative; - bottom: 0.32rem; - left: 30%; - align-self: center; - display: flex; - flex-direction: column; - align-items: center; -`,hw=f.div` - width: 0.16rem; - height: 0.16rem; - background: #d9dbef; - border-radius: 50%; -`,bI=f.div` - margin-block: 0.18rem; - width: 0.22rem; - height: 0.22rem; - background: #7680dd; - border-radius: 50%; -`,Dg=()=>{const e=ht();return l.jsx(H3,{children:l.jsxs(F3,{children:[l.jsx(U3,{children:"开源产品"}),l.jsxs($3,{id:"datenlord",children:[l.jsxs(G3,{children:[l.jsx(Q3,{src:I3}),l.jsx(q3,{children:"DatenLord 高性能分布式存储"}),l.jsx(Z3,{children:"DatenLord 是开源高性能分布式存储平台,帮助企业实现在 AI + Cloud 场景下的高效数据访问需求。该平台为用户提供了丰富的系统结构,包括 Posix 文件接口, KV接口和面向对象存储接口等,用户可以根据需求选择适合自己的方式。DatenLord 使用了软硬件融合的方式,充分发挥软硬件的性能潜力,实现了极致的数据传输和读写性能。"}),l.jsx(yn,{style:{width:"max-content",color:"#fff"},onClick:()=>window.location.href="https://github.com/datenlord/datenlord",children:"了解更多"})]}),l.jsxs(Th,{children:[l.jsx(uI,{}),l.jsx(hI,{}),l.jsx(dw,{}),l.jsx(fw,{}),l.jsx(gI,{}),l.jsx(vI,{})]})]}),l.jsxs(B3,{id:"xline",children:[l.jsxs(K3,{children:[l.jsx(tI,{src:N3}),l.jsxs(rI,{children:[l.jsx(J3,{children:"Xline 开源分布式KV存储系统"}),l.jsx(eI,{children:"保证数据在跨数据中心,跨云访问时的一致性, 方便业务系统实现多地多中心多活部署。"}),l.jsx(yn,{style:{width:"max-content",color:"#fff"},onClick:()=>window.location.href="https://xline.cloud/",children:"了解更多"})]}),l.jsxs(SI,{children:[l.jsx(hw,{}),l.jsx(bI,{}),l.jsx(hw,{})]})]}),l.jsxs(Th,{children:[l.jsx(dI,{}),l.jsx(mI,{}),l.jsx(lI,{}),l.jsx(cI,{}),l.jsx(yI,{}),l.jsx(wI,{}),l.jsx(nI,{src:lw}),l.jsx(iI,{src:lw})]})]}),l.jsxs(W3,{id:"rdma",children:[l.jsxs(X3,{children:[l.jsx(oI,{children:"RDMA 高性能网络"}),l.jsx(sI,{children:"跨云场景下,网络对数据访问的性能影响最为突出,DatenLord采用高性能网络RDMA来降低延迟并提高带宽。RDMA方面我们有多个相关的开源项目:"}),l.jsxs(aI,{children:[l.jsx(cw,{as:"li",children:"async-rdma"}),l.jsx(uw,{children:"是用Rust封装的RDMA异步API库,它为编写RDMA应用程序提供高级抽象和异步API接口。"}),l.jsx(cw,{as:"li",children:"open-rdma"}),l.jsx(uw,{children:"是RDMA协议的开源硬件实现,采用Bluespec和SpinalHDL实现,目前主要实现了RoCEv2协议,此外,我们还进行一些特定功能的拓展来提升RDMA的传输效率。"})]}),l.jsx(yn,{style:{width:"max-content",color:"#fff"},onClick:()=>{e("/rdma")},children:"了解更多"})]}),l.jsxs(Th,{children:[l.jsx(fI,{}),l.jsx(pI,{}),l.jsx(dw,{}),l.jsx(fw,{}),l.jsx(_I,{}),l.jsx(xI,{})]})]})]})})},ib="/zh-cn/assets/icon-cpu-f816a729.svg",ob="/zh-cn/assets/icon-inbox-c658ae9a.svg",{Heading:kI,Paragraph:CI}=Pe,{CNHead4:sb}=kI,{CNBodyLarge:DI,CNMarkSmall:EI}=CI,jI=f.section` - background: #fff; -`,AI=f.div` - max-width: 1440px; - margin-inline: auto; - padding-inline: 1.87rem; - padding-top: 1rem; - padding-bottom: 1.4rem; -`,TI=f(sb)` - text-align: center; - padding-bottom: 1.6rem; -`,RI=f.div` - display: flex; - justify-content: space-between; -`,OI=f.div` - display: flex; - flex-direction: column; - align-items: center; - width: 48%; - color: ${e=>e.theme.themeDark02}; - background: #f7f7f9; - border-radius: 0.18rem; - padding-top: 0; - padding-bottom: 0.48rem; - padding-inline: 0.32rem; - - &:hover { - background: #fff; - border: 0.01rem solid ${e=>e.theme.secondary01} - } - -`,PI=f(EI)` - color: ${e=>e.theme.secondary01}; -`,LI=f(sb)` - width: 90%; - color: #000; - text-align: center; - margin-bottom: 0.65rem; - padding-bottom: 0.12rem; - border-bottom: 0.01rem solid ${e=>e.theme.secondary02}; - cursor: pointer; -`,MI=f.div` - position: relative; - top: -0.6rem; - display: flex; - justify-content: center; - align-items: center; - margin-bottom: -0.36rem; - width: 1.56rem; - height: 1.56rem; -`,II=f.div` - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; -`,tf=f.div` - background: ${e=>e.bg}; - position: absolute; - border-radius: 50%; - animation: opac 4s infinite; -`,NI=f(tf)` - animation-delay: 1s; -`,zI=f(tf)` - animation-delay: 2s; -`,YI=f(tf)` - animation-delay: 3s; -`,VI=f.div` - z-index: 1; - display: flex; - justify-content: center; - align-items: center; - width: 0.9rem; - height: 0.9rem; - background: ${e=>e.bg}; - border-radius: 50%; -`,HI=f.img` - width: 90%; - height: 90%; -`,FI=f.ul` - padding-left: 0.18rem; -`,UI=f(DI)``,$I=f.div` - width: 100%; - text-align: center; - font-size: 0.18rem; - color: #9966CC; - border: 1px solid #9966CC; - border-radius: 0.16rem; - padding-block: 0.04rem; - margin-top: 0.18rem; -`,BI=[{key:"hardware-design-learning-community",icon:ob,iconBg:"#7680DD",label_en:"Hardware Design Learning Community",label_zh:"硬件设计学习社区",url:"/mit",content:[{key:"first",label:"理解数字芯片设计的精髓,提升设计能力,是能否胜任数字芯片设计工作的关键。"},{key:"second",label:"系统学习计算机体系结构相关知识,为将来走上数字芯片设计岗位打下坚实的基础。"},{key:"third",label:"学习社区的课程考核以Lab实践的完成度作为标准,要求所有Lab和Project实现既定功能并通过仿真验证。"},{key:"forth",label:"通过动手项目来验证学习的成果,培养出兼具理论和实操能力的数字芯片设计人才。"}]},{key:"open-source-diploma-internship",icon:ib,iconBg:"#FDCB6E",label_en:"Open Source Project Internship",label_zh:"开源毕业设计",url:"",content:[{key:"first",label:"体验透明开源和知识共享带来的乐趣,并在社区的反馈中获得技术成长。"},{key:"second",label:"弥合学校和工业界实践的脱节和差距,系统梳理学校的知识结构,并运用到具有影响力的时间项目中。"},{key:"third",label:"手把手获得行业内专家、教授、学者的点评以及前沿科研项目的合作机会。"},{key:"forth",label:"在硬核的开源技术社区自我展示的机会是同学升学以及就业最佳、最强有力的背书。"}]}],WI=()=>{const e=ht();return l.jsx(jI,{children:l.jsxs(AI,{children:[l.jsx(TI,{children:"学习社区"}),l.jsx(RI,{children:BI.map(({key:t,icon:r,iconBg:n,label_en:i,label_zh:o,url:a,content:c})=>l.jsxs(OI,{children:[l.jsxs(MI,{children:[l.jsx(VI,{bg:n,children:l.jsx(HI,{src:r})}),l.jsxs(II,{children:[l.jsx(tf,{bg:n}),l.jsx(NI,{bg:n}),l.jsx(zI,{bg:n}),l.jsx(YI,{bg:n})]})]}),l.jsx(PI,{children:i}),l.jsx(LI,{children:o}),l.jsx(FI,{children:c.map(({key:d,label:h})=>l.jsx(UI,{as:"li",children:h},d))}),a&&l.jsx($I,{onClick:()=>e("/mit",{replace:!0}),children:"了解详情"})]},t))})]})})},GI="/zh-cn/assets/bg-explore-0e46a645.png",KI="/zh-cn/assets/icon-arrow-right-black-87133825.svg",XI="/zh-cn/assets/icon-arrow-right-white-84c4ff12.svg",{Heading:QI}=Pe,{CNHead4:ab}=QI,qI=[{key:"first",content:"我们致力于探索前沿科技,拥抱创新与改变,并做持续的技术分享与思考。",url:"/tech-talk"},{key:"second",content:"我们一直深耕科学前沿技术的研究和软硬件融合创新的实践,并对外持续输出我们的创新观察。",url:"/blogs"}],ZI=f.section` - background: ${e=>e.theme.themeDark}; - background-image: url(${GI}); - background-size: cover; -`,JI=f.div` - max-width: 1440px; - margin-inline: auto; - padding-top: 1rem; - padding-bottom: 1.33rem; - padding-inline: 2.28rem; -`,e6=f(ab)` - padding-bottom: 1.67rem; - color: ${e=>e.theme.secondary02}; - text-align: center; -`,t6=f.div` - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: 0.1rem; - padding-block: 0.34rem; - padding-inline: 0.38rem; - border: 0.015rem solid transparent; - border-image: linear-gradient(90deg, transparent, transparent) 1; - transition: all 0.5s; - &:hover { - background: #07070850; - border: 0.015rem solid transparent; - border-image: linear-gradient(90deg, #ffffff, #ffffff00) 1; - clip-path: inset(0 round 0.14rem); - } - &:last-child { - margin-bottom: 0; - } -`,r6=f(ab)` - max-width: 80%; - color: #fff; -`,lb=f.div` - display: flex; - justify-content: center; - align-items: center; - width: 0.6rem; - height: 0.6rem; - background: #fff; - border-radius: 50%; - cursor: pointer; -`,n6=f(lb)` - background: ${e=>e.theme.secondary08}; -`,mw=f.img` - width: 0.42rem; - height: 0.42rem; -`,i6=({item:e})=>{const t=ht(),[r,n]=I.useState(!1),i=o=>{t(o)};return l.jsxs(t6,{onMouseEnter:()=>n(!0),onMouseLeave:()=>n(!1),children:[l.jsx(r6,{children:e.content}),r?l.jsx(n6,{onClick:()=>i(e.url),children:l.jsx(mw,{src:XI})}):l.jsx(lb,{onClick:()=>i(e.url),children:l.jsx(mw,{src:KI})})]})},o6=()=>l.jsx(ZI,{children:l.jsxs(JI,{children:[l.jsx(e6,{children:"前沿探索"}),qI.map(e=>l.jsx(i6,{item:e},e.key))]})}),{Heading:s6,Paragraph:a6}=Pe,{Heading6:l6}=s6,{CNBodyMedium:c6}=a6,u6=[{key:"distributed-storage",title:"高性能 AI+Cloud 基础设施提供商",description:"通过软硬件深度融合的方式,提供高性能存储和高性能网络,为 AI+Cloud 应用提供弹性、便利、经济的基础设施服务",url:""},{key:"data-access",title:"高性能跨云分布式存储",description:"建立一个统一的存储访问层,为跨云的应用提供高性能和高安全性的存储支持,从而打破跨云之间的隔阂",url:""},{key:"hardware-acceleration",title:"RDMA 高性能网络",description:"采用软硬件深度融合的方式,实现高性能RDMA网络",url:""},{key:"open-source",title:"相信开源的力量",description:"吸引分布式系统、Linux内核、开源硬件等相关的,来自开源社区的全球人才。 ",url:""}],d6=f.div` - margin-top: -72px; -`,f6=f.section` - background: ${e=>e.theme.secondary02}; -`,h6=f.div` - display: flex; - justify-content: space-between; - align-items: center; - max-width: 1440px; - margin-inline: auto; - padding-top: 0.64rem; - padding-bottom: 0.56rem; - padding-inline: 1.4rem; -`,m6=f(l6)` - width: 50%; -`,p6=f.div` - margin-right: 0.18rem; - padding: 0.01rem; - border-radius: 50vh; - background: linear-gradient(90deg, #767ee5, #9966cc); - cursor: pointer; -`,g6=f(c6)` - padding: 0.12rem 0.34rem; - border-radius: 50vh; - background: ${e=>e.theme.secondary02}; - color: ${e=>e.theme.themeDark}; -`,v6=f.div` - display: flex; - align-items: center; -`,y6=()=>{const e=ht();return l.jsx(f6,{children:l.jsxs(h6,{children:[l.jsx(m6,{children:"通过软硬件深度融合的方式,提供高性能存储和高性能网络,满足不同行业客户对高性能 AI+Cloud 的需求。"}),l.jsxs(v6,{children:[l.jsx(p6,{children:l.jsx(g6,{onClick:()=>window.location.href="https://github.com/datenlord",children:"立即体验"})}),l.jsx(yn,{style:{color:"#fff",height:"0.52rem"},onClick:()=>e("company2/contact-us"),children:"联系我们"})]})]})})},w6=()=>(I.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsxs(d6,{children:[l.jsx(E3,{items:u6}),l.jsx(M3,{}),l.jsx(Dg,{}),l.jsx(WI,{}),l.jsx(o6,{}),l.jsx(y6,{})]})),{Heading:_6}=Pe,{CNHead1:x6,CNTitleLarge:S6}=_6,b6=f.section` - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - margin-top: -0.72rem; - padding-top: 0.72rem; - height: 6.6rem; - background-color: #000; - background-image: url(${e=>e.cover}); - background-size: cover; -`,k6=f(x6)` - color: #fff; -`,C6=f(S6)` - max-width: 10rem; - padding-top: 0.5rem; - font-weight: 400; - color: #fff; - text-align: center; -`,Ir=({cover:e,children:t,subTitle:r})=>l.jsxs(b6,{cover:e,children:[l.jsx(k6,{children:t}),r&&l.jsx(C6,{children:r})]}),D6="/zh-cn/assets/cover-51a016b7.png",pw=()=>{const{sectionId:e}=Sn();return I.useEffect(()=>{const t=document.querySelector(`#${e}`);t?(t==null||t.scrollIntoView(),window.scrollBy(0,-32)):window.scrollTo(0,0)},[e]),l.jsxs(l.Fragment,{children:[l.jsx(Ir,{cover:D6,children:"开源产品"}),l.jsx(Dg,{})]})},E6="/zh-cn/assets/cover-2bac0ff4.png",j6="/zh-cn/assets/image1-6c5a6b4b.png",{Heading:A6,Paragraph:T6}=Pe,{CNHead4:R6,CNHead5S:O6}=A6,{CNBodyLarge:cb}=T6,P6=f.div` - background: #f7f7f9; -`,L6=f.div` - max-width: 1440px; - margin-inline: auto; - padding-top: 1rem; - padding-bottom: 1.49rem; - padding-inline: 1.77rem; -`,M6=f.section` - margin-bottom: 1.2rem; - color: ${e=>e.theme.themeDark}; - &:last-child { - margin-bottom: 0; - } -`,I6=f.div` - display: flex; - align-items: center; - padding-bottom: 0.87rem; -`,ub=f.div` - flex: 1; - height: 0.01rem; -`,N6=f(ub)` - background: linear-gradient(90deg, #7b7ce340, #926cd3); -`,z6=f(ub)` - background: linear-gradient(270deg, #7b7ce340, #926cd3); -`,Y6=f(R6)` - padding-inline: 0.24rem; -`,V6=f(O6)``,H6=f(cb)` - padding-bottom: 0.39rem; -`,F6=f.ul` - padding-left: 0.24rem; - padding-bottom: 0.39rem; -`,U6=f(cb)``,$6=f.img` - padding-left: 0.58rem; - padding-bottom: 0.58rem; - width: 4.18rem; - float: right; -`,B6=[{key:"Async-RDMA",title:"Async-RDMA",subTitle:"Async-RDMA是一个框架,为编写远程Remote Direct Memory Access(RDMA)应用程序提供高级抽象和异步API。",main:[{key:1,type:"text",content:"RDMA可以实现从一台机器到另一台机器对内存的直接访问。这可以提高需要低延迟和高吞吐量的应用程序的性能。RDMA支持内核旁路和零拷贝,无需CPU的参与。"},{key:2,type:"text",content:"然而,用低级别的C语言库编写RDMA应用程序往往很困难,而且容易出错。为了让事情变得更简单,我们开发了Async-RDMA,它提供了易于使用的API,隐藏了底层RDMA操作的复杂性。有了Async-RDMA,大多数RDMA操作只需一行代码就能完成。它提供了以下几点主要的功能:"},{key:3,type:"list",items:[{key:1,text:"作为与RDMA端点建立连接的工具。"},{key:2,text:"作为在端点之间传输数据的高级异步API。"},{key:3,text:"作为管理RDMA内存区域的高级API。"},{key:4,text:"作为一个在幕后工作的框架来管理内存区域并异步执行RDMA请求。"}]}],url:"https://github.com/datenlord/async-rdma"},{key:"Open-RDMA",title:"Open-RDMA",subTitle:"Open-RDMA 是一个开源的、基于 RoCE v2 协议扩展优化的软硬件实现套件",main:[{key:1,type:"text",content:"RoCE v2(RDMA over Converged Ethernet version 2)是一个网络协议来在以太网上实现远程直接内存访问(RDMA)。它是对于原始RoCE标准的改进,为在以太网上执行RDMA提供了一种更有效且可扩展的方式。"},{key:2,type:"text",content:"Open-RDMA 套件的核心部分是基于 RoCE v2 协议进行再次扩展优化后的软硬件实现,充分发挥软硬件协同设计开发的优势,通过硬件加速实现高吞吐低延迟,通过软件用户态协议栈实现集中管理且高度可配置的传输策略,从而实现在不同网络环境下都可以发挥极致性能。项目采用 Bluespec SystemVerilog、C 和 Rust 来实现硬件及软件逻辑,从而确保开源项目的正确性和可维护性。"},{key:3,type:"text",content:"在测试及验证方面,我们积极采用开源验证工具,同时也开发了自己的验证工具。Open-RDMA 套件通过 Bluesim、Cocotb 工具来进行RTL级别的验证,通过自研的 RoCE-Sim 工具进行协议数据包级别的验证,通过 Distro-Sim 工具进行软硬件联合仿真验证和调试。"},{key:4,type:"text",content:"目前,我们已经实现了整个开源套件的基本框架,并正在逐步加入更多功能。"}],url:"https://github.com/datenlord/open-rdma",img:j6}],W6=({item:e})=>{const{title:t,subTitle:r,img:n,main:i,url:o}=e;return l.jsxs(M6,{children:[l.jsxs(I6,{children:[l.jsx(N6,{}),l.jsx(Y6,{children:t}),l.jsx(z6,{})]}),l.jsx(V6,{style:{paddingBottom:"0.41rem",color:"#000"},children:r}),n&&l.jsx($6,{src:n}),i.map(({key:a,type:c,content:d,items:h})=>c==="text"?l.jsx(H6,{children:d},a):c==="list"?l.jsx(F6,{children:h==null?void 0:h.map(({key:g,text:v})=>l.jsx(U6,{as:"li",children:v},g))},a):null),l.jsx(yn,{style:{color:"#fff",display:"block"},onClick:()=>{window.location.href=`${o}`},children:"了解更多"})]})},G6=()=>(I.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsxs(l.Fragment,{children:[l.jsx(Ir,{cover:E6,children:"RDMA"}),l.jsx(P6,{children:l.jsx(L6,{children:B6.map(e=>l.jsx(W6,{item:e},e.key))})})]})),K6="/zh-cn/assets/cover-4e87a707.png",X6="/zh-cn/assets/image-4f8ee5fd.png",Q6="data:image/png;base64,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",q6="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAABACAYAAABFqxrgAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATiSURBVHgB7ZrfTyNVFMe/Z2a6cdVod6NPPjD7akzsQDRRo3affaBxIeFtC4LhbctfAPwF4BuxzdJNfFhDWetfQHky0cXiu8okJvgmNdFgls5cz51CGWBK57altOR+kmbm/pi53C/33nPm3gNoNBrNKRSnUiZbTVpWPRVVViq8V8GQY8WplDCQEWStR5VNzlWdjbyziyEmlgjC8G3AkONmmepwG3kiDaKHQiCJISeWCE18VDYeOxV5OzlThTDxEDcAA5rLR8Lk3I8pISgpyBhprKB+amL2p8Yd+SkKNGzk1euWWy46LrokM/+DnfDMpGyXSNQ28u9f+XrT0jpMfFldhMASVBD+QqkwtgpFGtYHj4iQFYB98b2o+L7/5NnjsSKugNbTQSADRXjEvAtFJmZ3cizAHv87liIFkBDShmmsP5ir7rFgNnrMJSKIO7hi2Lyug4wV7mQsC8PD1jYT2OLnUughsazDxx+9gU8+fDOybP0bF/t/HkIVnm4rbF6zZ3PFNnlUPLqFSvDH1WEL8jMGGeNc15Z5UggeMVs8IpxerEFBO3Eq3X7JxJ07t6LLbptQhc1rljuVO0kLgks+pkuF0cq5qi7/KlPz1dUjz8/xQvzoOD9pJfAdXx30gOsxkSYWQ6maZ+B+qdDwP6J4uua4m/mxnID/VSg79fnMThY9oO8iPPjieSa8APrwF8pr8Ya1d2QssQVp1jUMoyfOWt9FIDKaVkdOg2f5+GaP14Ca8EOjga2GNK/okv5PB6KR5q0vfoEilmWUw2nT9NLokv6LIMS9UELZG3x6bupIzxJdor8doEUI0CIgprP0/OcD/Lb3b2TZ/r66tzhoxBLhr4MXwe+m0no6EDr4jvf/xhDSciRYJuXYX3cRMkFENM6XIC0dHfhiu1lmkOu9bCjvJQwCLUU4tse5cN7EXHWLL+kgwRsdm4XRadwAtHWAFiFAiwAtQoAWAVqEAC0CtAgBageyfebkGPCyOrzPOMLHgOnz+SpxEwMrwsRslXeXsdI2jITkUeHFbrB3u1vKO7G25Ad3OhDG0R0pebgbp6JeEzDga8IJ77z9GsY/e6ttvV9//wffbv4BVYZCBHnU1+oYMMzdu+3rRKGnA7QIAYoiiOb2GXUav0D0eihVwwCgJIKAcJsJok+hyHFwRdP5ESL0vmtESQQSZ84Bk+zQpKEAd/rMdp3nmZU4zx0e+jiovWj7k/U6IVZYbxj2xA5wstkKuN4RZMRI22E9la3a9QT2TtL8bHEz70xf0s7pfmaH1M3/7pXXPnDb1VNfGAnLp7ewrUQQOmNf9shktpryuF44zzNP33PdKItQ+tqR2+qVUFZKBlPJqJHzsQIyzVNmUVjYOhOZJrDcNjCD8D26QB4JxBkFjaY6YGq+ans+d0xEhtztcidrREGA1cVygSelgpNFDORCGsROG34awliUcZL8f4s+FKJgpMm2F7jt2tErLMKqE8v6dCSCRApR9yAj39Nxn5ExRzL2CIoEgV4mtyVaxzbxGsLGS2yXCqNpKNKxsyQPZ/hT9T6rOB2OI4qGT6q4A50I0A+6/nbYyDtFvhQb5tJP8Vy0g6M7EjUScOuWUS6vjbroATKmcXJmx44sQ+f07APqeJhWcIXIOEahHjYZ471DQhzHrP4qduMuhhqNRqPRaDRx+B8VV8ixBtVqHgAAAABJRU5ErkJggg==",Z6="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAABACAYAAABFqxrgAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARySURBVHgB7Zo/b9tGGMafO1KGMtXO0qZdNHQqOshpUKBT6KLIGrWRgWxRXLtIp7qfoP4EjdOlRpwiDLoUiIOqn8DK1CF1mKFAgQKBNblbrAIBIjjkXd6zJJuyRYqk+U8Kf4BMUryzyId879577oCCgoKCgiFYkEK1hjWr63YVKcOY7Dzc/PQZEmasCIsNqyp1bFPJWWSBxPrWvfnvkSB8bIkSfs9MAAXD6ldLOw0kiK8I129ZFQlUkDFM45eRIHqo0hIL9Gq2kAL1FWubNgZSYHw4BIQaz4r6YAKJRYRr31g39BJ2tRJ+wARyZhGUAEzCpN0O/bM7mEDOJIJbAOprFx5uzifepydBZBGmRQBFJBGmSQBFaBFUCj1NAihCi9A059XN35wWARThkqU+dPMmpojYkqVJphABhQiHRGoTglJffmJA8CpJHXooTg2vGsEO9qv15Z21QBUFOrbgTWrA2whIYiLQKNCiTRUaIiGHD6tgPJizRb+na7hNuUzj0d35B0GqJBIOi0tWA+rCM4RymfWgZUO9CUKISu3Wn5Vx5aQjawPnrlzWcK6cTtPzqivQ7TqDw1l1rc2Nz9rj6oUSgWv8PnfKYarggwtlfLvyIdLg+e5L/Lz5HGHxfUTOQbLOjnpqf//zP7LGVwSp4QYSYn//AD/+9C/MX9vY7xwgSzzD4TpZZbbL45MQd5jkTQSByVX6c9XrtBJAvbYv6OavfP4u5mZnkCWeIti6qLlfFEfj682NYH1vfflpw2tG46QAV754D1njKQJj/LujvlrKx82Ni+3B4eKKtRvFis+jAIqRItBNVt03KZg03eelFA8kWAUecM4uSzksUl4FUIwUQUqKaXb8PovXw23B1r1P1uADhYNJ9Svu7548fZFLARQjRWCMnmR/n7amMlJwRi5dPI/3L5zDxx+9g7xxSoRrX/9Vc4cCpZ+B8u9xnJ+bOfzkkVMi0FswnPMzbNNgCNPMiGSJt/CWcUqEwwnXmEJgUhjZMJIQjfqyZTIRbVq+n24bmBA8k6WzTMFTF2m4u9i8U3iMSNhjVCijQ43z02Bvr4soJC7C3n+vIhkdaZJIOKiMEzlAt2dqQcrFLsLJjDNb+NUgpWIPBxqCH6kvGdoOxwJSRLcFeRm8t2yIwQhitsYqgpq2px8+tuQkWm4jJohTHYluuTMY5NE1rOuutVMUEg3arPlVj1WEEkfNPWniXsNUX9pZhcNvIwlKUALMqV0lBo11Wugna5Jx9VDW/KrHKoLbmFWhsHX3eP2CPsObrx1RoROxr45lYMPrJKT4g0LC6J1DhbJfwy/5i02Ek8YsE2JoJdtvvbBYRQrYNjf7IXEouGTKL0XLq3xsvUPPmHUfB3SmE6DXPsjHg2MG7jt1EFuCfzQB2+OZrXW/RIaUDsoGhef9oy98liTH2Sa4zZiq7pR3kSHy1Gy4MOAREnEmSy3kGDKPPReZxSaCruEmjZ7byCNkEj365ZJnGxX7oF91R8gR9GA607LUsKCgoKCgIGXeAELkjKtKm1m6AAAAAElFTkSuQmCC",J6="data:image/png;base64,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",eN="data:image/png;base64,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",{Heading:tN}=Pe,{CNHead4:rN}=tN,gw=f.div` - background: #fff; -`,vw=f.div` - max-width: 1440px; - margin-inline: auto; - padding-top: 1rem; - padding-bottom: 1.49rem; - padding-inline: 1.77rem; -`,nN=f.div` - display: flex; - align-items: center; - padding-bottom: 0.87rem; -`,db=f.div` - flex: 1; - height: 0.01rem; -`,iN=f(db)` - background: linear-gradient(90deg, #7b7ce340, #926cd3); -`,oN=f(db)` - background: linear-gradient(270deg, #7b7ce340, #926cd3); -`,sN=f(rN)` - font-size: 0.36rem; - color: #7680DD; - padding-inline: 0.24rem; -`,aN=f.img` - width: 100%; -`,yw=f.div` - display: flex; - gap: 0.42rem; - margin-bottom: 0.42rem; -`,Rh=f.div` - display: flex; - flex-direction: column; - padding: 0.24rem 0.36rem; - padding-bottom: 0.84rem; - border-radius: 0.1rem; - background: #fff; - `,ww=f.div` - display: flex; - padding: 0.24rem 0.36rem; - border-radius: 0.1rem; - background: #fff; - `,wa=f.img` - width: 0.56rem; - height: 0.56rem; - margin-bottom: 0.28rem; - `,_w=f.div` - display: flex; - flex-direction: column; - margin-left: 0.24rem; -`,_a=f.div` - font-size: 0.18rem; - line-height: 0.24rem; - font-weight: 600; - color: #333333; - margin-bottom: 0.12rem; -`,xa=f.div` - font-size: 0.14rem; - line-height: 0.24rem; - font-weight: 400; - color: #999999; -`,lN=()=>(I.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsxs(l.Fragment,{children:[l.jsx(Ir,{cover:K6,children:"DatenLord Cloud Service"}),l.jsx(gw,{children:l.jsx(vw,{children:l.jsx(aN,{src:X6})})}),l.jsx(gw,{style:{background:"#F7F7F9"},children:l.jsxs(vw,{children:[l.jsxs(nN,{children:[l.jsx(iN,{}),l.jsx(sN,{children:"DatenLord 技术创新点"}),l.jsx(oN,{})]}),l.jsxs(yw,{children:[l.jsxs(Rh,{children:[l.jsx(wa,{src:Q6}),l.jsx(_a,{children:"全新自研架构,实现内核旁路"}),l.jsx(xa,{children:"发挥出新一代存储硬件的高性能。"})]}),l.jsxs(Rh,{children:[l.jsx(wa,{src:q6}),l.jsx(_a,{children:"统一命名空间"}),l.jsx(xa,{children:"实现数据对多个存储接口的互通,满足不同场景需求。"})]}),l.jsxs(Rh,{children:[l.jsx(wa,{src:Z6}),l.jsx(_a,{children:"数据的自动化管理"}),l.jsx(xa,{children:"自动化实现数据迁移、备份,并对应用程序透明。"})]})]}),l.jsxs(yw,{children:[l.jsxs(ww,{children:[l.jsx(wa,{src:J6}),l.jsxs(_w,{children:[l.jsx(_a,{children:"支持多种自主体系架构"}),l.jsx(xa,{children:"能够适配更多样性的芯片架构,满足用户的多种需求。"})]})]}),l.jsxs(ww,{children:[l.jsx(wa,{src:eN}),l.jsxs(_w,{children:[l.jsx(_a,{children:"利用硬件加速存储相关的计算密集型任务"}),l.jsx(xa,{children:"诸如数据加密解密、数据压缩解压缩、音视频编解码、模式识别等场景,有力提升数据存储和处理的性能。"})]})]})]})]})})]})),cN="/zh-cn/assets/cover-b2ab63b7.png",uN="/zh-cn/assets/sect1-66de51dd.png",dN="/zh-cn/assets/sect2-070b2110.png",fN="/zh-cn/assets/sect3-fc90d06f.png",hN="/zh-cn/assets/sect4-35a84b18.png",mN=f.div` - background: #fff; -`,pN=f.div` - max-width: 1440px; - margin-inline: auto; - padding-top: 1rem; - padding-bottom: 1.49rem; - padding-inline: 1.77rem; -`,Cc=f.img` - width: 100%; -`;f.div` - display: flex; - align-items: end; - gap: 0.24rem; -`;f.div` - font-size: 0.58rem; - font-weight: 600; - color: #7680dd; -`;f.div` - font-size: 0.32rem; - font-weight: 600; - line-height: 2; -`;const gN=()=>(I.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsxs(l.Fragment,{children:[l.jsx(Ir,{cover:cN,children:"DatenLord Appliance"}),l.jsx(mN,{children:l.jsxs(pN,{children:[l.jsx(Cc,{src:uN}),l.jsx(Cc,{src:dN,style:{marginBottom:"0.82rem"}}),l.jsx(Cc,{src:fN,style:{marginBottom:"0.64rem"}}),l.jsx(Cc,{src:hN})]})})]})),vN="/zh-cn/assets/cover-e1b3c9e5.png",yN="/zh-cn/assets/image-4b1d6d29.png",wN="/zh-cn/assets/image1-5e136811.jpeg",{Heading:_N,Paragraph:oQ}=Pe,{CNHead4:Eg,Heading2:xN}=_N,SN=f.main` - background: #EDEDF6; -`,bN=f.div` - max-width: 1440px; - margin-inline: auto; - padding-top: 1rem; - padding-bottom: 1.57rem; - padding-inline: 1.22rem; -`,kN=f(Eg)` - text-align: center; - padding-bottom: 0.58rem; -`,CN=f.section` - display: flex; - flex-direction: column; - align-items: center; - padding-block: 0.48rem; - color: ${e=>e.theme.secondary02}; - background: linear-gradient(90deg, #767ee5, #9966cc); -`,DN=f(xN)` - padding-bottom: 0.06rem; -`,EN=f(Eg)` - padding-bottom: 0.4rem; -`,jN=f.img` - display: block; - width: 5.36rem; - margin-inline: auto; - margin-bottom: 0.58rem; -`,jg=f.div` - background: #fff; - border-radius: 0.24rem; - min-height: 400px; - overflow: hidden; - box-shadow: 0.1rem 0.1rem 1rem 0.06rem rgba(0, 0, 0, 0.08); - margin-bottom: 0.72rem; - &:last-child { - margin-bottom: 0; - } -`,Ag=f.div` - display: flex; - align-items: center; - background: ${e=>e.theme.secondary01}; - min-height: 50px; - width: 100%; - padding: 0.24rem 0.48rem; -`,Tg=f(Eg)` - color: ${e=>e.theme.white00}; - padding-inline: 0.96rem; -`,fb=f.div` - flex: 1; - height: 0.02rem; -`,Rg=f(fb)` - background: linear-gradient(270deg, #fff, #7B7CE340); -`,Og=f(fb)` - background: linear-gradient(90deg, #fff, #7B7CE340); -`,Pg=f.div` - padding: 0.24rem 0.64rem; - padding-bottom: 0.84rem; -`,hb=f.div` - font-size: 0.16rem; - padding: 0.12rem 0.36rem; - background: #D9DBEF; - text-align: center; - border-radius: 0.04rem; - margin-inline: -0.36rem; - margin-bottom: 0.36rem; -`,Lg=f.div` - display: flex; - justify-content: space-between; - flex-wrap: wrap; - gap: 0.52rem; -`,Ni=f.div` - -`,zi=f.div` - font-size: 0.24rem; - font-weight: 600; - padding-bottom: 0.36rem; -`,vl=f.div` - font-size: 0.2rem; - font-weight: 600; - padding-bottom: 0.2rem; -`,Mg=f(vl)` - color: #8475DC; -`,Zt=f.div` - font-size: 0.14rem; - color: #42424A; - line-height: 0.26rem; - padding-bottom: 0.04rem; -`,Ns=f(Zt)` - border-left: 0.08rem solid #767EE5; - padding-left: 0.16rem; -`,Bu=f(Zt)` - -`,AN=f.img` - display: block; - width: 70%; - margin-inline: auto; - margin-top: 0.36rem; -`,TN=()=>l.jsxs(jg,{style:{background:"#EDEDF6"},id:"ai",children:[l.jsxs(Ag,{children:[l.jsx(Rg,{}),l.jsx(Tg,{children:"AI 推理"}),l.jsx(Og,{})]}),l.jsxs(Pg,{children:[l.jsx(hb,{children:"用云计算的方式整合GPU算力,解决AI算力资源昂贵和分散的问题。用存储和网络来改善用户使用的体验,实现秒级启动、恢复"}),l.jsxs(Lg,{children:[l.jsxs(Ni,{style:{width:"46%"},children:[l.jsx(zi,{children:"问题"}),l.jsx(Mg,{children:"GPU 算力供不应求,供需极度不平衡"}),l.jsx(Zt,{children:"AI 大模型对高性能 GPU 算力资源需求大爆发。GPU 算力供不应求,供需极度不平衡。这进一步推高了原本因设计和制造成本以及市场垄断等因素就已经高企不下的 GPU 算力价格。GPU 算力资源优先满足 AI 训练场景,这造成 AI 推断场景的 GPU 算力资源具有分散或碎片化的特点。"})]}),l.jsxs(Ni,{style:{width:"46%"},children:[l.jsx(zi,{children:"解决方案"}),l.jsx(Ns,{style:{marginBottom:"0.36rem"},children:"优化缓存技术,实现数据预加载、异步持久化,进而提升数据访问的性能"}),l.jsx(Ns,{children:"高性能网络 RDMA 实现多节点内存共享,加速大模型的分发、加载"})]}),l.jsxs(Ni,{style:{width:"100%"},children:[l.jsx(zi,{children:"案例"}),l.jsx(vl,{children:"客户的需求和问题是什么?"}),l.jsx(Bu,{children:"· 客户是一家主营海外直播卖货的公司,运用大模型技术进行人工智能主播,实现业务的低成本横向拓展。"}),l.jsx(Bu,{style:{paddingBottom:"0.3rem"},children:"· 该客户计划对直播场景进行大模型定制,形成自主可控的“直播场景大模型”。"}),l.jsx(vl,{children:"客户的需求和问题是什么?"}),l.jsx(Zt,{style:{color:"#7680DD"},children:"DatenLord Cloud Service 通过跨云技术,帮助客户落地“大模型”业务场景"}),l.jsxs(Zt,{children:[l.jsx("b",{children:"高效的数据同步机制"}),"      确保大模型在不同数据中心之间的实时性和一致性。"]}),l.jsxs(Zt,{children:[l.jsx("b",{children:"高效的数据分发机制"}),"      确保大模型能够及时获取和处理最新的数据,提高业务的响应速度。"]}),l.jsxs(Zt,{children:[l.jsx("b",{children:"灵活的管理和调整工具"}),"      使客户能自主控制大模型,根据业务变化灵活调整。"]}),l.jsxs(Zt,{children:[l.jsx("b",{children:"高级的安全措施"}),"      包括数据加密、身份验证等,确保大模型在跨云环境中的安全运行。"]}),l.jsx(AN,{src:wN})]})]})]})]}),RN=()=>l.jsxs(jg,{id:"networks",style:{background:"#EDEDF6"},children:[l.jsxs(Ag,{children:[l.jsx(Rg,{}),l.jsx(Tg,{children:"高性能网络"}),l.jsx(Og,{})]}),l.jsx(Pg,{children:l.jsxs(Lg,{children:[l.jsxs(Ni,{style:{width:"46%"},children:[l.jsx(zi,{children:"问题"}),l.jsx(Mg,{children:"大模型时代对高性能网络的能力诉求不断提高"}),l.jsx(Zt,{children:"随着大模型时代的到来,无论是模型训练环节中训练数据与 Checkpoint 的传输迁移,还是推理过程中多个模型之间的动态调度加载,都希望能够极限压榨网络以及总线上每一比特的带宽,从而换取更短的训练时间以及更小的请求响应延迟。随着训练推理集群规模的扩大以及业务复杂度的增加,网络中偶发的拥塞或故障不可避免,此外,每次网络拓扑发生变化后对网卡进行重新调参都是一项繁重的工作。能够迅速自主适应网络拓扑变化,并连续提供稳定数据传输能力的高性能网络,已然成为大模型时代必不可少的基础设施。"})]}),l.jsxs(Ni,{style:{width:"46%"},children:[l.jsx(zi,{children:"解决方案"}),l.jsx(Ns,{style:{marginBottom:"0.36rem"},children:"基于经过优化的 RoCE v2 协议以及硬件加速的纠错编码技术,可以在恶劣的网络环境下提供高效的数据恢复以及重传机制。"}),l.jsx(Ns,{children:"通过深度的软硬件融合套件,实现全网流量的动态感知,智能决策系统可以针对各种网络环境迅速、自动地调整各节点软硬件参数,保持全网维持最佳吞吐。"})]})]})})]}),ON=()=>l.jsxs(jg,{id:"storage",children:[l.jsxs(Ag,{children:[l.jsx(Rg,{}),l.jsx(Tg,{children:"高性能存储"}),l.jsx(Og,{})]}),l.jsxs(Pg,{children:[l.jsx(hb,{children:"统一的高性能跨云数据访问和跨云分布式元数据管理"}),l.jsxs(Lg,{children:[l.jsxs(Ni,{style:{width:"46%"},children:[l.jsx(zi,{children:"问题"}),l.jsx(Mg,{children:"云之间的隔阂导致数据隔离和数据碎片化,在跨云访问数据时,访问速度和一致性将会受到影响。"}),l.jsx(Zt,{children:"随着AI应用的快速落地,多云架构成为企业级IT的主流选择。但是,云之间的隔阂导致数据隔离和数据碎片化。由于数据往往被绑定在一个特定的云厂商/数据中心里,无法自由访问。此外,跨云数据访问具有高延迟的特性,然而现有的分布式共识协议只限于在单个数据中心使用。因此,在跨云访问数据时,访问速度和一致性将会受到影响。"})]}),l.jsxs(Ni,{style:{width:"46%"},children:[l.jsx(zi,{children:"解决方案"}),l.jsx(Ns,{style:{marginBottom:"0.36rem"},children:"无论数据存储在哪里,DatenLord 都可以通过缓存来加速跨云的数据访问,并提供统一的数据管理来实现数据的自动迁移和备份。"}),l.jsx(Ns,{children:"DatenLord 采用内核旁路架构,实现存储 IO 自行调度管理,以提升性能。再次,低延迟的跨云分布式共识协议保证了广域网场景下的高速和强一致性,同时保证系统中没有单点瓶颈。"})]}),l.jsxs(Ni,{style:{width:"100%"},children:[l.jsx(zi,{children:"案例"}),l.jsx(vl,{children:"客户的需求和问题是什么?"}),l.jsx(Bu,{children:"· 客户是一家主要做中东、欧洲地区教育、社交和短剧的内容型娱乐公司。"}),l.jsx(Bu,{style:{paddingBottom:"0.3rem"},children:"· 客户需要解决多国多数据中心间的数据同步、迁移、备份和自动化管理的问题。"}),l.jsx(vl,{children:"客户的需求和问题是什么?"}),l.jsx(Zt,{style:{color:"#7680DD"},children:"DatenLord Cloud Service 提供一体化的解决方案,帮助客户有效管理多国多数据中心的复杂性,提高业务的可用性和稳定性"}),l.jsxs(Zt,{children:[l.jsx("b",{children:"多国多数据中心的数据实时同步"}),"      确保大模型在不同数据中心之间的实时性和一致性。"]}),l.jsxs(Zt,{children:[l.jsx("b",{children:"提供高效的数据迁移和备份工具"}),"      确保大模型能够及时获取和处理最新的数据,提高业务的响应速度。"]}),l.jsxs(Zt,{children:[l.jsx("b",{children:"提供自动化的管理工具"}),"      使客户能自主控制大模型,根据业务变化灵活调整。"]}),l.jsxs(Zt,{children:[l.jsx("b",{children:"提供高可用性和弹性伸缩的解决方案"}),"      包括数据加密、身份验证等,确保大模型在跨云环境中的安全运行。"]})]})]})]})]}),xw=()=>{const e=ht(),{sectionId:t}=Sn();return I.useEffect(()=>{const r=document.querySelector(`#${t}`);r?(r==null||r.scrollIntoView(),window.scrollBy(0,-32)):window.scrollTo(0,0)},[t]),l.jsxs(l.Fragment,{children:[l.jsx(Ir,{cover:vN,children:"解决方案"}),l.jsxs(SN,{children:[l.jsxs(bN,{children:[l.jsx(kN,{children:"解决方案"}),l.jsx(jN,{src:yN}),l.jsx(TN,{}),l.jsx(ON,{}),l.jsx(RN,{})]}),l.jsxs(CN,{id:"related-resource",children:[l.jsx(DN,{children:"· Related Resources ·"}),l.jsx(EN,{children:"相关资源"}),l.jsx(yn,{style:{background:"#FDCB6E",color:"#fff"},onClick:()=>e("/resources2"),children:"查看资源合集"})]})]})]})},PN="/zh-cn/assets/github-icon-35dda863.svg",LN="/zh-cn/assets/illustration-a72d48ba.png",{Heading:MN,Paragraph:IN}=Pe,{Heading3:NN,CNHead5S:mb}=MN,{CNBodyLarge:Ig,CNBodySmall:zN}=IN,YN=[{key:1,title:"社区—贡献意味着思考和学习",text:"开源不仅仅是在Github上贡献代码。在DatenLord,我们相信:贡献代码(给予)同样是一个思考和学习的过程。在不断收到开源社区反馈的过程中,我们能够构建彼此的信任与合作。我们也想借助于开源的社区平台吸引更多优秀的开发者参与到项目中来。"}],VN=[{key:1,text:"王恒宇是一名主修计算机科学的研究生。基于在软硬件融合方面的学术兴趣,他加入了async-rdma项目。在社区导师的指导下,他也随着项目的发展而逐步成长,并被邀请在一些实践研讨会上分享他使用Rust开发RDMA的实践经验。",quote:"“我在Async-rdma项目中收获了一段难忘的经历。DatenLord社区氛围很友好,我的导师是一位经验丰富的工程师,他鼓励我在验证我对项目的想法和假设的同时也要关注工程规范。这让我的视角从一个只关注实现产品原型的学生转变为一个同时也关注产品的可维护性和稳定性的专业工程师。”",link_text:"GitHub ID: GTwhy",url:"https://github.com/GTwhy"},{key:2,text:"李弘宇热衷于参与开源社区和Rust相关项目,所以参加了DatenLord的特别项目,想为Rust并入Linux内核添砖加瓦。在社区导师的指导下,他在贡献代码、编写文档和回复上游意见的过程中磨练了自己的Rust技能。",quote:"“在DatenLord中参与Rust for Linux项目的工作很有意义。这是一个友好互助的社区。即使在修改一个很小的bug时,我的导师也鼓励我认真权衡不同的选择。教导我不仅仅是要能够写出代码,更重要的是写出优雅的代码。我在社区中收获到的不仅是理论上的,更是极具实操价值的。”",link_text:"GitHub ID: Richardhongyu",url:"https://github.com/Richardhongyu"}],HN=f.section` - padding-bottom: 1.29rem; -`,FN=f.div` - color: ${e=>e.theme.secondary02}; - font-weight: 400; - font-family: Bodoni Bd BT serif; - font-size: 0.67rem; - line-height: 0.804rem; - text-transform: capitalize; -`,UN=f(NN)` - margin-top: -0.22rem; - padding-left: 0.16rem; - padding-bottom: 0.71rem; - font-family: Avenir Next sans-serif; -`,$N=f.div` - height: 4.6rem; - margin-bottom: 0.61rem; -`,BN=f.div` - padding-bottom: 0.56rem; - &:last-child { - padding-bottom: 0; - } -`,WN=f(mb)``,GN=f(Ig)``,KN=f.img` - float: right; - margin-left: 0.33rem; - margin-right: -0.33rem; - margin-bottom: 0.33rem; - width: 4.93rem; -`;f.div` - display: flex; - justify-content: space-between; - align-items: center; - margin-left: 0.64rem; -`;f.img` - width: 0.3rem; - height: 0.3rem; - margin-right: 0.14rem; -`;f.div` - color: ${e=>e.theme.themeDark}; - font-weight: 600; - font-size: 0.255rem; - line-height: 1; - text-transform: capitalize; -`;const XN=f.div` - padding-top: 0.38rem; - padding-bottom: 0.46rem; - padding-inline: 0.63rem; - background: #ffffff78; - border-radius: 0.18rem; -`,QN=f(mb)``,qN=f.div` - display: flex; - justify-content: space-between; -`,ZN=f.div` - width: 47%; -`,JN=f(Ig)` - padding-bottom: 0.26rem; -`,e5=f(zN)` - margin-left: -0.14rem; - margin-bottom: 0.33rem; - padding-inline: 0.11rem; - color: ${e=>e.theme.gray03}; - border-left: 0.02rem solid; - border-image: linear-gradient(to right, #767ee5, #9966cc) 1; -`,t5=f.div` - display: flex; -`,r5=f(Ig)` - padding-right: 0.2rem; - color: ${e=>e.theme.secondary01}; - text-decoration-line: underline; -`,n5=f.img` - width: 0.32rem; - height: 0.32rem; -`,i5=()=>l.jsxs(HN,{children:[l.jsx(FN,{children:"Open Source Community"}),l.jsx(UN,{children:"开源社区"}),l.jsxs($N,{children:[l.jsx(KN,{src:LN}),YN.map(({key:e,title:t,text:r})=>l.jsxs(BN,{children:[l.jsx(WN,{style:{paddingBottom:"0.23rem"},children:t}),l.jsx(GN,{children:r})]},e))]}),l.jsxs(XN,{children:[l.jsx(QN,{style:{paddingBottom:"0.39rem"},children:"社区高光时刻"}),l.jsx(qN,{children:VN.map(({key:e,text:t,quote:r,link_text:n,url:i})=>l.jsxs(ZN,{children:[l.jsx(JN,{children:t}),l.jsx(e5,{children:r}),l.jsxs(t5,{children:[l.jsx(r5,{as:"a",href:i,children:n}),l.jsx(n5,{src:PN})]})]},e))})]})]}),o5="/zh-cn/assets/avatar-783be77c.png",{Heading:s5,Paragraph:a5}=Pe,{Heading3:pb,CNHead4:l5,CNHead5S:c5,CNHead5:u5}=s5,{CNBodyLarge:d5,CNMarkSmall:f5,CNBodyMedium:h5}=a5,m5=[{key:"hardware-design-learning-community",icon:ob,iconBg:"#7680DD",label_en:"Hardware Design Learning Community",label_zh:"硬件设计学习社区",url:"mit",content:[{key:"first",label:"理解数字芯片设计的精髓,提升设计能力,是能否胜任数字芯片设计工作的关键。"},{key:"second",label:"系统学习计算机体系结构相关知识,为将来走上数字芯片设计岗位打下坚实的基础。"},{key:"third",label:"学习社区的课程考核以Lab实践的完成度作为标准,要求所有Lab和Project实现既定功能并通过仿真验证。"},{key:"forth",label:"通过动手项目来验证学习的成果,培养出兼具理论和实操能力的数字芯片设计人才。"}]},{key:"open-source-diploma-internship",icon:ib,iconBg:"#FDCB6E",label_en:"Open Source Diploma Internship",label_zh:"开源毕业设计",content:[{key:"first",label:"体验透明开源和知识共享带来的乐趣,并在社区的反馈中获得技术成长。"},{key:"second",label:"弥合学校和工业界实践的脱节和差距,系统梳理学校的知识结构,并运用到具有影响力的时间项目中。"},{key:"third",label:"手把手获得行业内专家、教授、学者的点评以及前沿科研项目的合作机会。"},{key:"forth",label:"在硬核的开源技术社区自我展示的机会是同学升学以及就业最佳、最强有力的背书。"}]}],p5=[{key:1,text:"参加开源毕设项目是我人生中一段难忘的经历。在这里,我不仅提升了自己的技能,学会与团队成员协同合作,而且有机会投身于实际项目中,亲身体验如何解决实际问题,感受开源精神的力量,并且深入开源社区,与志同道合的同伴们共同探讨世界上最前沿、最具挑战性的工程问题。"},{key:2,text:"参加开源项目的过程中,我有机会在GitHub上积累宝贵的贡献记录。每一次提交代码、每一个解决的问题都会在我的GitHub主页上清晰地呈现出来,成为我技术实力的有力证明。这不仅有助于建立我的个人品牌,还能让潜在雇主一目了然地了解我的能力和成就。"},{key:3,text:"我还结识了我所热爱的行业的专家,拓展人脉资源,为未来的职业发展创造更多机会。我相信,在我的简历上出现丰富的开源项目经验,必将成为我未来求职过程中的一大亮点。欢迎更多的学生朋友和我一起加入开源毕设项目,让我们共同成长,开启一段精彩的技术之旅!"}],g5=f.section` -`,v5=f.div` - color: ${e=>e.theme.secondary02}; - font-weight: 400; - font-family: Bodoni Bd BT serif; - font-size: 0.67rem; - line-height: 0.804rem; - text-align: right; - text-transform: capitalize; -`,y5=f(pb)` - margin-top: -0.22rem; - padding-left: 0.16rem; - padding-bottom: 1.4rem; - font-family: Avenir Next sans-serif; - text-align: right; -`,w5=f.div` - padding-bottom: 1rem; - display: flex; - justify-content: space-between; -`,_5=f.div` - display: flex; - flex-direction: column; - align-items: center; - width: 48%; - color: ${e=>e.theme.themeDark02}; - background: #f7f7f9; - border-radius: 0.18rem; - padding-top: 0; - padding-bottom: 0.75rem; - padding-inline: 0.32rem; - - &:hover { - background: #fff; - border: 0.01rem solid ${e=>e.theme.secondary01}; - } -`,x5=f(f5)` - color: ${e=>e.theme.secondary01}; -`,S5=f(l5)` - width: 90%; - color: #000; - text-align: center; - margin-bottom: 0.65rem; - padding-bottom: 0.12rem; - border-bottom: 0.01rem solid ${e=>e.theme.secondary02}; -`,b5=f.div` - position: relative; - top: -0.6rem; - display: flex; - justify-content: center; - align-items: center; - margin-bottom: -0.36rem; - width: 1.56rem; - height: 1.56rem; -`,k5=f.div` - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; -`,rf=f.div` - background: ${e=>e.bg}; - position: absolute; - border-radius: 50%; - animation: opac 4s infinite; -`,C5=f(rf)` - animation-delay: 1s; -`,D5=f(rf)` - animation-delay: 2s; -`,E5=f(rf)` - animation-delay: 3s; -`,j5=f.div` - z-index: 1; - display: flex; - justify-content: center; - align-items: center; - width: 0.9rem; - height: 0.9rem; - background: ${e=>e.bg}; - border-radius: 50%; -`,A5=f.img` - width: 90%; - height: 90%; -`,T5=f.ul` - padding-left: 0.18rem; -`,R5=f(d5)``,O5=f(c5)``,P5=f.div` - display: flex; - align-items: center; -`,L5=f.div` - display: flex; - flex-direction: column; - align-items: center; - padding-right: 0.91rem; -`,M5=f.div``,I5=f.img` - width: 1.8rem; - padding-bottom: 0.22rem; -`,N5=f(pb)` - padding-bottom: 0.06rem; -`,z5=f(u5)``,Y5=f.ul` - padding-left: 0.3rem; -`,V5=f(h5)` - padding-bottom: 0.35rem; - &:last-child { - padding-bottom: 0; - } -`,H5=f.div` - width: 100%; - text-align: center; - font-size: 0.18rem; - color: #9966CC; - border: 1px solid #9966CC; - border-radius: 0.16rem; - padding-block: 0.04rem; - margin-top: 0.18rem; -`,F5=()=>{const e=ht();return l.jsxs(g5,{children:[l.jsx(v5,{children:"Learning Community"}),l.jsx(y5,{children:"学习社区"}),l.jsx(w5,{children:m5.map(({key:t,icon:r,iconBg:n,label_en:i,label_zh:o,content:a,url:c})=>l.jsxs(_5,{children:[l.jsxs(b5,{children:[l.jsx(j5,{bg:n,children:l.jsx(A5,{src:r})}),l.jsxs(k5,{children:[l.jsx(rf,{bg:n}),l.jsx(C5,{bg:n}),l.jsx(D5,{bg:n}),l.jsx(E5,{bg:n})]})]}),l.jsx(x5,{children:i}),l.jsx(S5,{children:o}),l.jsx(T5,{children:a.map(({key:d,label:h})=>l.jsx(R5,{as:"li",children:h},d))}),c&&l.jsx(H5,{onClick:()=>e(c),children:"了解详情"})]},t))}),l.jsx(O5,{style:{paddingBottom:"1.42rem"},children:"学生故事"}),l.jsxs(P5,{children:[l.jsxs(L5,{children:[l.jsx(I5,{src:o5}),l.jsx(N5,{children:"郑昱笙"}),l.jsx(z5,{children:"浙江大学"})]}),l.jsx(M5,{children:l.jsx(Y5,{children:p5.map(({key:t,text:r})=>l.jsx(V5,{as:"li",children:r},t))})})]})]})},gb="/zh-cn/assets/cover-53180b58.png",U5="/zh-cn/assets/cloud-757dcd86.png",{Heading:$5}=Pe,{CNHead4:B5}=$5,W5=f.div` - z-index: 1; - position: relative; - background: #ededf6; - overflow: hidden; -`,G5=f.div` - max-width: 1440px; - margin-inline: auto; - padding-top: 1rem; - padding-bottom: 1.4rem; - padding-inline: 2.04rem; -`,K5=f(B5)` - padding-bottom: 0.98rem; - text-align: center; -`,X5=f.img` - z-index: -1; - position: absolute; - left: 0; - bottom: 0; - width: 20.14rem; - height: 5.42rem; -`,Sw=()=>{const{sectionId:e}=Sn();return I.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t==null||t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(Rt.Fragment,{children:[l.jsx(Ir,{cover:gb,children:"社区"}),l.jsxs(W5,{children:[l.jsxs(G5,{id:"community",children:[l.jsx(K5,{children:"社区"}),l.jsx(i5,{}),l.jsx("div",{style:{marginInline:"-2.04rem"},children:l.jsx(Dg,{})}),l.jsx(F5,{})]}),l.jsx(X5,{src:U5})]})]})},Q5="/zh-cn/assets/tech-talk-cover-10b6e35c.png",q5="/zh-cn/assets/oss-showcase-cover-2a511b0a.png",Z5="/zh-cn/assets/rust-showcase-cover-78294f4f.png",J5="/zh-cn/assets/hardware-acceleration-cover-67e9ecca.png",e7=[{key:1,cover:Q5,title:"前沿科技分享",text:"探索前沿技术,拥抱创新与改变",url:"/tech-talk"},{key:2,cover:q5,title:"开源产品分享",text:"软硬件融合创新实践的观察与输出",url:"/oss-showcase"},{key:3,cover:Z5,title:"Rust语言应用及案例分享",text:"Rust编程语言的应用、实践与探索",url:"/rust-showcase"},{key:4,cover:J5,title:"硬件加速",text:"硬件加速领域的实践、经验与挑战",url:"/hardware-acceleration"}],{Heading:t7}=Pe,{CNHead4:r7}=t7,n7=f.section` - background: ${e=>e.theme.themeDark}; -`,i7=f.div` - max-width: 1440px; - margin-inline: auto; - padding-top: 1rem; - padding-bottom: 1.8rem; - padding-inline: 1.22rem; -`,o7=f(r7)` - padding-bottom: 1.35rem; - color: ${e=>e.theme.secondary02}; - text-align: center; -`,s7=f.div` - display: flex; - justify-content: space-between; -`,a7=f.div` - display: flex; - width: 24%; - padding: 0.01rem; - background: linear-gradient(45deg, #ffffff90, #ffffff00 60%); - border-radius: 0.12rem; - overflow: hidden; - cursor: pointer; -`,l7=f.div` - width: 100%; - background: #070708; - border-radius: 0.12rem; -`,c7=f.img` - display: block; - width: 100%; - border-radius: 0.12rem; -`,u7=f.div` - padding-block: 0.26rem; - padding-inline: 0.2rem; -`,d7=f.div` - padding-bottom: 0.08rem; - font-size: 0.226rem; - font-weight: 600; - color: #fff; -`,f7=f.div` - font-size: 0.145rem; - line-height: 0.258rem; - color: ${e=>e.theme.secondary02}; -`,h7=()=>{const e=ht();return l.jsx(n7,{id:"tech-share",children:l.jsxs(i7,{children:[l.jsx(o7,{children:"技术分享"}),l.jsx(s7,{children:e7.map(({key:t,cover:r,title:n,text:i,url:o})=>l.jsx(a7,{children:l.jsxs(l7,{onClick:()=>{e(o)},children:[l.jsx(c7,{src:r}),l.jsxs(u7,{children:[l.jsx(d7,{children:n}),l.jsx(f7,{children:i})]})]})},t))})]})})},m7="modulepreload",p7=function(e){return"/zh-cn/"+e},bw={},S=function(t,r,n){if(!r||r.length===0)return t();const i=document.getElementsByTagName("link");return Promise.all(r.map(o=>{if(o=p7(o),o in bw)return;bw[o]=!0;const a=o.endsWith(".css"),c=a?'[rel="stylesheet"]':"";if(!!n)for(let g=i.length-1;g>=0;g--){const v=i[g];if(v.href===o&&(!a||v.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${o}"]${c}`))return;const h=document.createElement("link");if(h.rel=a?"stylesheet":m7,a||(h.as="script",h.crossOrigin=""),h.href=o,document.head.appendChild(h),a)return new Promise((g,v)=>{h.addEventListener("load",g),h.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${o}`)))})})).then(()=>t())},kw="/zh-cn/assets/right-arrow-98730871.svg",Cw="/zh-cn/assets/dynamics-test-image-29ac43b9.png",{Heading:g7,Paragraph:v7}=Pe,{CNHead4:y7,CNTitleLarge:w7,CNTitleMedium:_7}=g7,{CNBodySmall:vb,CNMarkSmall:x7}=v7,S7=f.section` - background: ${e=>e.theme.white00}; -`,b7=f.div` - max-width: 1440px; - margin-inline: auto; - padding-top: 1rem; - padding-bottom: 1.29rem; - padding-inline: 1.22rem; -`,k7=f(y7)` - padding-bottom: 1.22rem; - color: ${e=>e.theme.themeDark02}; - text-align: center; -`,C7=f.div` - display: grid; - grid-template-columns: repeat(4, 1fr); - grid-template-rows: repeat(2, 1fr); - grid-gap: 0.21rem 0.32rem; -`,yb=f.div` - position: relative; - background: ${e=>e.theme.white00}; - overflow: hidden; - cursor: pointer; -`,D7=f(yb)` - grid-area: 1 / 1 / 3 / 3; - border-radius: 0.156rem; - box-shadow: 0.234rem 0.156rem 0.781rem rgba(0, 0, 0, 0.1); -`,E7=f(yb)` - border-radius: 0.081rem; - box-shadow: 0.121rem 0.08rem 0.403rem rgba(0, 0, 0, 0.1); -`,wb=f.img` - display: block; - width: 100%; -`,j7=f(wb)` - /* height: 4.14rem; */ -`,A7=f(wb)` - /* height: 1.4rem; */ -`,_b=f.div``,T7=f(_b)` - padding: 0.24rem 0.28rem 0.33rem; -`,R7=f(_b)` - padding: 0.13rem 0.12rem 0.23rem; -`,O7=f(w7)` - margin-bottom: 0.09rem; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - overflow: hidden; - text-overflow: ellipsis; -`,P7=f(_7)` - margin-bottom: 0.13rem; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - overflow: hidden; - text-overflow: ellipsis; -`,L7=f(vb)` - margin-bottom: 0.36rem; - display: -webkit-box; - -webkit-line-clamp: 6; - -webkit-box-orient: vertical; - overflow: hidden; - text-overflow: ellipsis; -`,M7=f(vb)` - margin-bottom: 0.25rem; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - overflow: hidden; - text-overflow: ellipsis; -`,xb=f.div` - position: absolute; - display: flex; - align-items: center; - color: ${e=>e.theme.secondary01}; -`,I7=f(xb)` - bottom: 0.28rem; - left: 0.28rem; -`,N7=f(xb)` - bottom: 0.12rem; - left: 0.12rem; -`,Dw=f(x7)` - padding-right: 0.04rem; -`,Ew=f.img` - width: 0.12rem; - height: 0.12rem; -`,z7=f(yn)` - margin-top: 0.64rem; - display: block; - margin-inline: auto; - color: #fff; -`,jw=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>S(()=>import("./index-12e593c9.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>S(()=>import("./index-102c2147.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>S(()=>import("./index-674b00c3.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>S(()=>import("./index-a179aa93.js"),[]),"/src/articles/events/2022-11-11-Datan-Technology-invites-you-who-love-challenges-to-participate-in-Rust-China-Hackathon-2022/index.md":()=>S(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>S(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>S(()=>import("./index-28613687.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>S(()=>import("./index-4b956329.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>S(()=>import("./index-26ca6215.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>S(()=>import("./index-3480f851.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>S(()=>import("./index-8bcfd31b.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>S(()=>import("./index-a1a1a279.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>S(()=>import("./index-d2a8186a.js"),[]),"/src/articles/events/2023-05-04-Meet-this-summer|Datan-Technology-invites-you-to-participate-in-the-2023-Open-Source-Summer/index.md":()=>S(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>S(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>S(()=>import("./index-63a73b24.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>S(()=>import("./index-16f06676.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>S(()=>import("./index-c86a9a07.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>S(()=>import("./index-6a3ed4c3.js"),[]),"/src/articles/events/2023-09-07-The-2nd-Hardware-Agile-Development-and-Methodology-Workshop-l-2023-RISC-V-China-Summit-Concurrent-Events-Successfully-Held/index.md":()=>S(()=>import("./index-a154d453.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>S(()=>import("./index-b5cbc6b1.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>S(()=>import("./index-dfd283a0.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>S(()=>import("./index-6bc730f7.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>S(()=>import("./index-ef7b41da.js"),[]),"/src/articles/events/2023-12-05-Ding!-2023-hackathon-tips-fresh-from-the-oven!-Last-week-to-sign-up-before-it's-too-late!/index.md":()=>S(()=>import("./index-75e09dc1.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>S(()=>import("./index-3fb2c654.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>S(()=>import("./index-cc4e4968.js"),[]),"/src/articles/events/2024-02-22-Recruitment-can't-stop-Dartan-Technology-2024-internship-positions-waiting-for-you/index.md":()=>S(()=>import("./index-db271263.js"),[]),"/src/articles/events/2024-02-29-A-Challenge-Letter-from-DatenLord-on-GSoC-2024/index.md":()=>S(()=>import("./index-d4dfb508.js"),[]),"/src/articles/events/2024-04-04-Come-and-get-your-own-mind-blowing-offer-from-Dartan-Technologies/index.md":()=>S(()=>import("./index-14d00f8c.js"),[]),"/src/articles/events/2024-05-09-DartanLord-@-you-and-invited-you-to-the-2024-Summer-of-Open-Source!/index.md":()=>S(()=>import("./index-68779906.js"),[]),"/src/articles/events/2024-05-23-Xline-Community-Meeting-Call-Up-Securing-Joint-Consensus-in-CURP-Algorithm/index.md":()=>S(()=>import("./index-11e00e16.js"),[])}),Y7=()=>{const e=ht(),[t,r]=I.useState([]),n=async()=>{const i=await Promise.all(Object.keys(jw).map(o=>jw[o]()));r(i.reverse())};return I.useEffect(()=>{n()},[]),l.jsx(S7,{id:"dynamics",children:l.jsxs(b7,{children:[l.jsx(k7,{children:"达坦动态"}),l.jsx(C7,{children:t.map(({metadata:i,assetURLs:o},a)=>{const{title:c,date:d,cover:h,label:g,description:v}=i;if(a===0)return l.jsxs(D7,{children:[l.jsx(j7,{src:h?o[0]:Cw}),l.jsxs(T7,{children:[l.jsx(O7,{children:g}),l.jsx(L7,{children:v})]}),l.jsxs(I7,{onClick:()=>{e(`/events/${d}-${c.split(" ").join("-")}`)},children:[l.jsx(Dw,{children:"详情"}),l.jsx(Ew,{src:kw})]})]},c);if(a<5)return l.jsxs(E7,{children:[l.jsx(A7,{src:h?o[0]:Cw}),l.jsxs(R7,{children:[l.jsx(P7,{children:g}),l.jsx(M7,{children:v})]}),l.jsxs(N7,{onClick:()=>{e(`/events/${d}-${c.split(" ").join("-")}`)},children:[l.jsx(Dw,{children:"详情"}),l.jsx(Ew,{src:kw})]})]},c)})}),l.jsx(z7,{onClick:()=>e("/events"),children:"了解更多"})]})})},V7="/zh-cn/assets/blog-test-image-c63d058c.png",{Heading:H7,Paragraph:F7}=Pe,{CNHead4:U7,TitleLarge:$7}=H7,{CNBodyMedium:Sb}=F7,B7=f.section` - background: #f7f7f9; -`,W7=f.div` - max-width: 1440px; - margin-inline: auto; - padding-top: 1rem; - padding-bottom: 0.32rem; - padding-inline: 1.22rem; -`,G7=f(U7)` - padding-bottom: 1.22rem; - color: ${e=>e.theme.themeDark02}; - text-align: center; -`,K7=f.div` - padding-block: 0.59rem; - padding-inline: 0.3rem; -`,X7=f.div` - padding-bottom: 0.59rem; - display: grid; - grid-auto-flow: column; - grid-template-columns: repeat(2, 1fr); - grid-template-rows: repeat(3, 1fr); - grid-gap: 0.36rem; - padding-inline: 0.29rem; - height: min-content; -`,Q7=f.img` - width: 100%; - /* height: 100%; */ - grid-area: 1 / 1 / 3 / 2; - border-top-left-radius: 0.12rem; - border-top-right-radius: 0.12rem; -`,q7=f.div` - padding-bottom: 0.22rem; - border-bottom: 0.01rem solid #a4a4a4; -`,Z7=f($7)` - margin-bottom: 0.15rem; - color: ${e=>e.theme.gray007}; - display: -webkit-box; - -webkit-line-clamp: 1; - -webkit-box-orient: vertical; - overflow: hidden; - text-overflow: ellipsis; - cursor: pointer; - &:hover { - color: #722ed1; - } -`,J7=f(Sb)` - margin-bottom: 0.07rem; - color: #383838; - display: -webkit-box; - -webkit-line-clamp: 3; - -webkit-box-orient: vertical; - overflow: hidden; - text-overflow: ellipsis; -`,e8=f(Sb)` - color: #fff; - margin-inline: auto; - padding-block: 0.12rem; - padding-inline: 0.34rem; - width: min-content; - white-space: nowrap; - background: linear-gradient(90deg, #767ee5, #9966cc); - border-radius: 0.5rem; - border: none; - cursor: pointer; -`,Aw=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>S(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>S(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>S(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>S(()=>import("./index-fe9ae8f0.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>S(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>S(()=>import("./index-9d5e23a7.js"),[]),"/src/articles/blogs/2022-05-27-Rust-implementation-of-RDMA-asynchronous-programming-(I):-epoll-based-implementation-of-RDMA-asynchronous-operation/index.md":()=>S(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>S(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>S(()=>import("./index-7df91a5f.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>S(()=>import("./index-29c0b7ce.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>S(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>S(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>S(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>S(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>S(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>S(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>S(()=>import("./index-1bdc26aa.js"),[]),"/src/articles/blogs/2022-06-30-Ten-thousand-words-long-article,-detailing-the-hardware-acceleration-and-implementation-of-TRIDENT:-Poseidon-hash-algorithm!/index.md":()=>S(()=>import("./index-c1edd0b5.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>S(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>S(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>S(()=>import("./index-38e8d7df.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>S(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>S(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>S(()=>import("./index-30613c55.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>S(()=>import("./index-484500d8.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>S(()=>import("./index-1ea2a101.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-9cbd4195.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>S(()=>import("./index-0cf6ee95.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>S(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>S(()=>import("./index-500d1a02.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>S(()=>import("./index-5fe92975.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>S(()=>import("./index-86e42443.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>S(()=>import("./index-7a966399.js"),[]),"/src/articles/blogs/2023-06-21-The-first-cross-cloud-metadata-KV-storage-Xline-officially-entered-the-CNCF-sandbox/index.md":()=>S(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-93097ad1.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>S(()=>import("./index-d9f0be8c.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>S(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>S(()=>import("./index-90e44649.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>S(()=>import("./index-bccae718.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>S(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>S(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>S(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>S(()=>import("./index-a294a248.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>S(()=>import("./index-9edebc8f.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>S(()=>import("./index-69f9dfbf.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-b73b42f4.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>S(()=>import("./index-1b00c887.js"),[]),"/src/articles/blogs/2024-01-11-Open-source-Bluespec-bsc-compiler-and-reusable-example-designs/index.md":()=>S(()=>import("./index-1407e949.js"),[]),"/src/articles/blogs/2024-01-18-Xline-v0.6.1:-a-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-9a698271.js"),[]),"/src/articles/blogs/2024-01-25-Agile-Digital-Chip-Design-and-Verification-with-SpinalHDL-and-Cocotb/index.md":()=>S(()=>import("./index-8e06495a.js"),[]),"/src/articles/blogs/2024-02-01-Xline-Jepsen-test-analysis/index.md":()=>S(()=>import("./index-c0527a8b.js"),[]),"/src/articles/blogs/2024-03-07-Membership-Change-Source-Code-Interpretation/index.md":()=>S(()=>import("./index-836388b4.js"),[]),"/src/articles/blogs/2024-03-21-Early-Explorations-and-Practices-of-Xline-a-Stateful-Application-Managed-by-Karmada/index.md":()=>S(()=>import("./index-8cb7e806.js"),[]),"/src/articles/blogs/2024-03-28-A-short-summary-of-the-implementation-of-interval-trees-in-Xline copy/index.md":()=>S(()=>import("./index-81d1e484.js"),[]),"/src/articles/blogs/2024-04-11-RDMA-Driver-Exploration-Series-for-Linux-1/index.md":()=>S(()=>import("./index-f7c1c3db.js"),[]),"/src/articles/blogs/2024-04-18-A-short-summary-of-the-implementation-of-interval-trees-in-Xline/index.md":()=>S(()=>import("./index-9e270336.js"),[]),"/src/articles/blogs/2024-04-25-Common-Design-Patterns-and-Their-Rust-Implementations/index.md":()=>S(()=>import("./index-5130399c.js"),[]),"/src/articles/blogs/2024-05-16-Xline-0.7-Refactoring-Performance-Analysis-Overview/index.md":()=>S(()=>import("./index-3deb6102.js"),[]),"/src/articles/blogs/2024-05-30-Full-Scale-File-System-Acceleration-on-GPUs/index.md":()=>S(()=>import("./index-900d632b.js"),[])}),t8=()=>{const e=ht(),[t,r]=I.useState([]),[n,i]=I.useState(""),o=async()=>{const a=await Promise.all(Object.keys(Aw).map(c=>Aw[c]()));r(a.reverse())};return I.useEffect(()=>{o()},[]),I.useEffect(()=>{var a;console.log(t),i(((a=t[0])==null?void 0:a.assetURLs[0])||V7)},[t]),l.jsx(B7,{id:"blog",children:l.jsxs(W7,{children:[l.jsx(G7,{children:"技术博客"}),l.jsxs(K7,{children:[l.jsxs(X7,{children:[l.jsx(Q7,{src:n}),t.map(({metadata:a},c)=>{const{title:d,date:h,label:g,description:v}=a;return c<4&&l.jsxs(q7,{children:[l.jsx(Z7,{onClick:()=>{e(`/blogs/${h}-${d.split(" ").join("-")}`)},children:g}),l.jsx(J7,{children:v})]},d)})]}),l.jsx(e8,{onClick:()=>e("/blogs"),children:"了解更多"})]})]})})},Tw=()=>{const{sectionId:e}=Sn();return I.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(Rt.Fragment,{children:[l.jsx(Ir,{cover:gb,children:"资源"}),l.jsx(h7,{}),l.jsx(Y7,{}),l.jsx(t8,{})]})},r8="/zh-cn/assets/andreas-0ee099e2.png",n8="/zh-cn/assets/bruno-thethe-4458e86e.png",i8="/zh-cn/assets/mahdi-bafande-9bcc200e.png",{Heading:o8,Paragraph:s8}=Pe,{Heading3:a8,CNHead4:l8}=o8,{CNBodyLarge:c8}=s8,u8=f.section` - background: #f7f7f9; -`,d8=f.div` - max-width: 1440px; - margin-inline: auto; - padding-top: 1rem; - padding-bottom: 1.84rem; - padding-inline: 2.24rem; -`,f8=f(l8)` - text-align: center; - padding-bottom: 1.1rem; -`,h8=f.div` - display: grid; - grid-template-columns: repeat(2, 1fr); - grid-template-rows: repeat(2, 1fr); - grid-gap: 0.17rem 0.26rem; - height: 4.5rem; -`,Ng=f.div` - display: flex; - flex-direction: column; - justify-content: center; - padding-inline: 0.48rem; - background-size: cover; - border-radius: 0.18rem; -`,m8=f(Ng)` - background-image: url(${r8}); - grid-area: 1 / 1 / 2 / 2; -`,p8=f(Ng)` - background-image: url(${n8}); - grid-area: 2 / 1 / 3 / 2; -`,g8=f(Ng)` - background-image: url(${i8}); - grid-area: 1 / 2 / 3 / 3; -`,Oh=f(a8)` - padding-bottom: 0.06rem; - color: #fff; -`,Ph=f(c8)` - color: #d9dbef; -`,v8=()=>l.jsx(u8,{id:"usage-scenarios",children:l.jsxs(d8,{children:[l.jsx(f8,{children:"使用场景"}),l.jsxs(h8,{children:[l.jsxs(m8,{children:[l.jsx(Oh,{children:"跨云数据实时备份"}),l.jsx(Ph,{children:"尤其针对关键业务应用场景,如数据库。"})]}),l.jsxs(p8,{children:[l.jsx(Oh,{children:"跨云数据加载"}),l.jsx(Ph,{children:"特别针对人工智能、大数据训练场景。"})]}),l.jsxs(g8,{children:[l.jsx(Oh,{children:"跨云应用迁移"}),l.jsx(Ph,{children:"尤其针对具有高并发性和业务弹性要求高的场景的应用,如中国的双十一促销活动。"})]})]})]})}),y8="/zh-cn/assets/cover-2eaea155.png",w8="/zh-cn/assets/SJTU-logo-a938b527.png",_8="/zh-cn/assets/BUPT-logo-4d861e45.png",x8="/zh-cn/assets/HNU-logo-a704fb8b.png",S8="/zh-cn/assets/SCUT-logo-aa4c3285.png",b8="/zh-cn/assets/SBU-logo-a0084f17.png",k8="/zh-cn/assets/image-cd6390ff.png",{Heading:C8,Paragraph:D8}=Pe,{CNHead4:E8,CNHead5:j8}=C8,{CNBodyLarge:bb}=D8,A8=f.section` - background: ${e=>e.theme.white00}; - background: linear-gradient(180deg, #BFC5FB, #BFC5FB00 50%); -`,T8=f.div` - padding-top: 1.48rem; - max-width: 1440px; - margin-inline: auto; - padding-bottom: 0.79rem; - padding-inline: 2.03rem; -`,R8=f(E8)` - padding-bottom: 0.5rem; - text-align: center; -`,O8=f(bb)` - padding-bottom: 0.52rem; - margin-bottom: 1rem; - border-bottom: 0.01rem solid ${e=>e.theme.secondary02}; - text-align: center; -`,P8=f.div` - display: flex; - justify-content: space-between; -`,L8=f.div` - display: grid; - grid-gap: 0.3rem 0.2rem; - grid-template-columns: repeat(4, 1fr); - grid-template-rows: repeat(4, 1fr); - width: 57%; - /* height: 11rem; */ -`,M8=f.ul` - width: 37%; - list-style-type: none; -`,Ol=f.img` - width: 100%; - /* height: 100%; */ -`,I8=f(Ol)` - grid-area: 1 / 2 / 2 / 4; -`,N8=f(Ol)` - grid-area: 2 / 1 / 3 / 3; -`,z8=f(Ol)` - grid-area: 2 / 3 / 3 / 5; -`,Y8=f(Ol)` - width: 120%; - transform: translateX(-10%); - grid-area: 3/ 2 / 4 / 4; -`,V8=f(Ol)` - transform: translateX(5%); - width: 90%; - grid-area: 4 / 2 / 5 / 4; -`,H8=f.li` - padding-bottom: 0.46rem; - &:last-child { - padding-bottom: 0; - } -`,F8=f(j8)` - padding-bottom: 0.16rem; - color: ${e=>e.theme.secondary01}; -`,U8=f(bb)``,$8=f.img` - width: 100%; - padding-bottom: 1.18rem; -`,B8=[{title:"高性能跨云SaaS服务基础",content:[{text:"上海交通大学"},{text:" 合作项目:利用RDMA加速serverless的性能"}]},{title:"高性能跨云网络基础",content:[{text:"北京邮电大学 合作项目:RDMA的流量控制"},{text:"湖南大学 合作项目:RDMA QoS"}]},{title:"高性能网络硬件支持",content:[{text:"华南理工大学"},{text:"合作项目:硬件敏捷开发和验证"}]},{title:"高性能跨云一致性算法",content:[{text:"美国石溪大学"},{text:"合作项目:分布式一致性"}]}],Rw=()=>{const{sectionId:e}=Sn();return I.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t==null||t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(Rt.Fragment,{children:[l.jsx(Ir,{cover:y8,subTitle:"通过实现跨云、跨数据中心的数据高速访问,DatenLord将大大提升存储系统的可扩展性,同时大大降低企业级IT业务系统在实现高可用性、多活方面的复杂性。随着多云、多数据中心成为企业级IT的主流架构,跨云分布式存储将在互联网、金融、电信、能源等不同行业得到广泛应用。",children:"客 户"}),l.jsx(v8,{}),l.jsx(A8,{id:"project-cooperation",children:l.jsxs(T8,{children:[l.jsx($8,{src:k8}),l.jsx(R8,{children:"产学研项目合作"}),l.jsx(O8,{children:"DatenLord积极推动产学研合作,与国内外各大高校的顶尖实验室合作,在高性能跨云SaaS服务基础、高性能跨云网络基础、高性能网络硬件支持和高性能跨云网络一致性算法领域共同进行深入的前瞻研究和实践落地。"}),l.jsxs(P8,{children:[l.jsxs(L8,{children:[l.jsx(I8,{src:w8}),l.jsx(N8,{src:_8}),l.jsx(z8,{src:x8}),l.jsx(Y8,{src:S8}),l.jsx(V8,{src:b8})]}),l.jsx(M8,{children:B8.map(({title:t,content:r},n)=>l.jsxs(H8,{children:[l.jsx(F8,{children:t}),r.map(({text:i},o)=>l.jsx(U8,{children:i},o))]},n))})]})]})})]})},W8="/zh-cn/assets/logo-theme-dark-9478769d.svg",G8="/zh-cn/assets/founding-image-1a5d82c0.png",K8="/zh-cn/assets/shi-jicheng-avatar-b016e3a2.png",X8="/zh-cn/assets/wang-pu-avatar-5d318600.png",{Heading:Q8,Paragraph:q8}=Pe,{CNHead4:Z8,CNHead5S:J8,CNHead5:ez}=Q8,{CNBodyLarge:nf,CNBodySmall:kb}=q8,tz=[{key:"wang-pu",avatar:X8,name:"王璞",position:"达坦科技创始人兼CEO",text:"达坦科技创始人兼CEO,美国George Mason大学计算机博士、北大硕士、北航本科,拥有多年云计算和大数据领域的经验和积累,擅长分布式系统研发、海量数据处理、云计算产品设计及大规模机器学习等。2014年回国创业,创立数人云科技公司,专注容器技术在国内的落地和推广,2018年被上市公司收购。曾发表十余篇论文,共计被引用上千次,拥有多项云计算专利、软著,并于2020年被评选为腾讯云TVP(最有价值专家)。",quote:"“我读大学的时候玩乐队,弹奏最多的就是Guns N' Roses(枪花)乐队的歌曲。枪花1987年发行的第一张专辑叫《Appetite for Destruction》。虽然我不至于有毁灭欲,但都说创新的本质其实是‘创造性地破坏’,创业亦然。离开大公司后我连续投身科技创业,想要静心做底层技术的颠覆性创新。想来也算是年轻时追求的摇滚精神跨时空的延续”。",inscription:"——王璞 达坦科技创始人兼CEO"},{key:"shi-ji-cheng",avatar:K8,name:"施继成",position:"达坦科技联合创始人兼 CTO",text:"DatenLord 联合创始人兼 CTO,复旦大学软件工程本硕,师从华为基础软件首席科学家、鸿蒙实验室主任陈海波教授。擅长操作系统内核开发、分布式系统、嵌入式系统,对分布式数据一致性有钻深的研究,发表多篇操作系统内核相关论文,累计数百次引用。毕业后曾在谷歌中国、微软亚太和阿里巴巴等公司从事分布式计算和存储等相关工作。入选2022年度36氪S级创业者名册,荣获中国“企业工具与底层软件”领域 “36位36岁以下创业者“称号。",quote:"“魂系游戏和创业很相似,前者大量的离散叙事遍布于各个物件和NPC上,寻找主线剧情就好比创业时把客户的需求、公司的技术优势、VUCA时代瞬息万变的市场变化和趋势等都链接起来,形成完整的产品叙事并落地。两者的难度系数都很高,创业中的踩坑、犯错对应的是游戏中的“死亡”,所以,‘不死精神’或者说‘Grit’(坚毅)是魂系游戏和投身创业企业玩家的必备素质。”",inscription:"——施继成 达坦科技联合创始人兼CTO"}],rz=f.section` - background: #f7f7f9; -`,nz=f.section` - max-width: 1440px; - margin-inline: auto; - padding-top: 1rem; - padding-bottom: 1.16rem; - padding-inline: 1.22rem; -`,iz=f(Z8)` - padding-bottom: 1.56rem; - color: ${e=>e.theme.themeDark02}; - text-align: center; -`,oz=f.div` - padding-inline: 0.34rem; - padding-bottom: 0.73rem; - display: flex; - justify-content: space-between; - align-items: center; -`,sz=f.img` - width: 36%; -`,az=f(nf)` - width: 54%; -`,lz=f.div` - display: flex; - justify-content: space-between; - align-items: center; - padding-inline: 0.34rem; - padding-bottom: 0.65rem; -`,cz=f.img` - width: 36%; -`,uz=f.div` - width: 54%; -`,dz=f(J8)``,fz=f(nf)` - padding-left: 0.16rem; -`,hz=f.div` - display: flex; - flex-direction: ${e=>e.name=="wang-pu"?"row":"row-reverse"}; - justify-content: space-between; - align-items: center; - margin-bottom: 0.39rem; - padding-top: 0.64rem; - padding-bottom: 0.6rem; - padding-inline: 0.48rem; - border-radius: 0.18rem; - background: #fff; - &:last-child { - margin-top: 0; - } -`,mz=f.div` - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - width: 12%; - text-align: center; -`,pz=f.div` - width: 80%; -`,gz=f.img` - width: 1.2rem; - height: 1.2rem; - margin-bottom: 0.13rem; - border-radius: 50%; - border: 0.01rem solid #000; -`,vz=f(ez)` - margin-bottom: 0.04rem; -`,yz=f(nf)``,wz=f(nf)` - padding-bottom: 0.39rem; -`,_z=f(kb)` - margin-bottom: 0.3rem; - padding-left: 0.1rem; - border-left: 0.02rem solid transparent; - border-image: linear-gradient(90deg, #767ee5, #9966cc) 1; - color: ${e=>e.theme.gray03}; -`,xz=f(kb)` - color: ${e=>e.theme.gray03}; - text-align: right; -`,Sa=f.span` - color: ${e=>e.theme.secondary01}; - font-weight: 600; -`,Sz=()=>l.jsx(rz,{id:"about-us",children:l.jsxs(nz,{children:[l.jsx(iz,{children:"关于我们"}),l.jsxs(oz,{children:[l.jsx(sz,{src:W8}),l.jsxs(az,{children:["达坦科技始终致力于打造高性能 ",l.jsx(Sa,{children:"AI+ Cloud 基础设施平台"}),",积极推动AI应用的落地。达坦科技通过",l.jsx(Sa,{children:"软硬件深度融合的方式"}),",提供高性能存储和高性能网络。为 AI + Cloud 应用提供",l.jsx(Sa,{children:"弹性、便利、经济"}),"的基础设施服务,以此满足不同行业客户对 AI + Cloud 的需求。"]})]}),l.jsxs(lz,{children:[l.jsxs(uz,{children:[l.jsx(dz,{style:{paddingLeft:"0.16rem",paddingBottom:"0.39rem"},children:"创始团队"}),l.jsxs(fz,{children:["达坦科技",l.jsx(Sa,{children:"专注底层硬核技术"}),",通过软硬件深度融合的方式,涉及分布式系统、Linux 内核、 InfiniBand/RDMA、 SoC、硬件加速等多个前沿技术领域。公司创始团队和核心成员大部分来自谷歌, 微软、阿里巴巴等国际知名科技公司的顶尖人才,拥有",l.jsx(Sa,{children:"深厚的软硬件技术和丰富的行业经验"}),"。"]})]}),l.jsx(cz,{src:G8})]}),tz.map(({key:e,name:t,avatar:r,position:n,text:i,quote:o,inscription:a})=>l.jsxs(hz,{name:e,children:[l.jsxs(mz,{children:[l.jsx(gz,{src:r}),l.jsx(vz,{children:t}),l.jsx(yz,{children:n})]}),l.jsxs(pz,{children:[l.jsx(wz,{children:i}),l.jsx(_z,{children:o}),l.jsx(xz,{children:a})]})]},e))]})}),bz="/zh-cn/assets/VMV-section-bg-fde7914e.png",kz="/zh-cn/assets/book-9274cf2e.svg",Cz="/zh-cn/assets/bulb-e5b82e48.svg",Dz="/zh-cn/assets/target-c78d4e77.svg",Ez="/zh-cn/assets/HollowSphere4-3d92727b.png",jz="/zh-cn/assets/HollowSphere5-971b228b.png",Ow="/zh-cn/assets/Pipe4-0ba2713b.png",{Heading:Az,Paragraph:Tz}=Pe,{CNHead4:zg}=Az,{CNBodyLarge:Yg,CNBodyMedium:Rz}=Tz,Oz=f.section` - color: ${e=>e.theme.secondary02}; - background: ${e=>e.theme.themeDark}; - background-image: url(${bz}); - background-size: cover; -`,Pz=f.section` - position: relative; - max-width: 1440px; - margin-inline: auto; - padding-top: 1rem; - padding-bottom: 1.31rem; - padding-inline: 1.6rem; -`,Lz=f(zg)` - padding-bottom: 1.57rem; - color: ${e=>e.theme.secondary02}; - text-align: center; -`,Mz=f.div` - padding-bottom: 1.04rem; - display: flex; - justify-content: space-between; -`,Vg=f.div` - width: 32%; -`,Iz=f(Vg)` - padding-top: 1rem; -`,Nz=f(Vg)``,zz=f(Vg)` - padding-top: 0.79rem; -`,$a=f.div` - margin-bottom: 0.2rem; - padding-top: 0.51rem; - padding-bottom: 0.67rem; - padding-inline: 0.26rem; - border-radius: 0.12rem; - background: #ffffff10; - border: 0.01rem solid #ffffff80; - &:last-child { - margin-bottom: 0; - } -`,Lh=f($a)` - padding-block: 0.34rem; -`,Mh=f(zg)` - color: #fff; - padding-bottom: 0.2rem; -`,Dc=f(Yg)` - color: #fff; - padding-bottom: 0.06rem; -`,No=f(Yg)``,Yz=f($a)` - display: flex; - width: 80%; - padding-block: 0.4rem; - padding-inline: 0.46rem; -`,Vz=f(zg)` - padding-right: 1rem; -`,Hz=f.div` - display: flex; - flex-direction: column; -`,Ih=f.div` - display: flex; - align-items: center; - padding-bottom: 0.32rem; - &:last-child { - padding-bottom: 0; - } -`,Nh=f.img` - margin-right: 0.16rem; - width: 0.58rem; - height: 0.58rem; -`,zh=f.div``,Yh=f(Yg)` - padding-bottom: 0.06rem; -`,Vh=f(Rz)``,Fz=f.img` - position: absolute; - top: 2.22rem; - right: 1.59rem; - width: 1.5rem; - height: 1.5rem; -`,Cb=f.img` - position: absolute; -`,Uz=f(Cb)` - left: 2.64rem; - top: 9.13rem; - width: 3.31rem; - height: 3.31rem; -`,$z=f(Cb)` - left: 2.94rem; - top: 8.97rem; - width: 1.37rem; - height: 1.37rem; - transform: rotate(-80deg); -`,Bz=f.img` - position: absolute; - right: 0; - bottom: 0.2rem; - width: 3.5rem; -`,Wz=()=>l.jsx(Oz,{children:l.jsxs(Pz,{children:[l.jsx(Lz,{children:"愿景/使命/价值观"}),l.jsxs(Mz,{children:[l.jsx(Iz,{children:l.jsxs($a,{children:[l.jsx(Mh,{children:"愿景"}),l.jsx(No,{children:"使企业能够以高性能和高安全性的方式在全球多个云中读、写和提取数据。"})]})}),l.jsxs(Nz,{children:[l.jsxs($a,{children:[l.jsx(Mh,{children:"使命"}),l.jsx(No,{children:"通过使用DatenLord 跨云分布式的存储系统,打破跨云之间的隔阂。"})]}),l.jsxs($a,{children:[l.jsx(Mh,{children:"价值"}),l.jsx(Dc,{children:"开放和透明"}),l.jsx(No,{children:"我们努力保证信息和决策过程的透明度,从而创造一个包容性的社区,让每个成员都感到安全和自信,可以贡献不同的意见和多元化的视角。我们相信建设性的冲突可以带来反思和改进。"})]})]}),l.jsxs(zz,{children:[l.jsxs(Lh,{children:[l.jsx(Dc,{children:"敢于成为先锋"}),l.jsx(No,{children:"我们是一群具有成长型思维模式的人,我们不走捷径并且相信慢就是快。我们的目标是成为先锋,敢于标新立异,制定自己的模式,因此我们允许犯错,但更相信我们能够快速、持续地调整和完善。"})]}),l.jsxs(Lh,{children:[l.jsx(Dc,{children:"坚持交付卓越"}),l.jsx(No,{children:"我们相信结果与过程同样重要。我们以目标为导向,设定高标准,并发挥我们的聪明才智和努力拼搏的精神来实现它们。我们致力于通过关注自身的行动和外部的变化来获得想要的结果。"})]}),l.jsxs(Lh,{children:[l.jsx(Dc,{children:"专注于小而可控的步骤"}),l.jsx(No,{children:"大的里程碑固然值得庆祝,而每一跬步也很重要。我们相信在正确的方向上迈出的每一小步可以跨越难以想象的距离。我们相信不积跬步,无以至千里;不积小流,无以成江海。"})]})]})]}),l.jsxs(Yz,{children:[l.jsx(Vz,{children:"公司文化"}),l.jsxs(Hz,{children:[l.jsxs(Ih,{children:[l.jsx(Nh,{src:kz}),l.jsxs(zh,{children:[l.jsx(Yh,{children:"持续学习"}),l.jsx(Vh,{children:"持之以恒的自驱学习,求真求致;"})]})]}),l.jsxs(Ih,{children:[l.jsx(Nh,{src:Cz}),l.jsxs(zh,{children:[l.jsx(Yh,{children:"精益求精"}),l.jsx(Vh,{children:"对自己高标准严要求,勇于挑战自我,对创新有极致追求;"})]})]}),l.jsxs(Ih,{children:[l.jsx(Nh,{src:Dz}),l.jsxs(zh,{children:[l.jsx(Yh,{children:"积极主动"}),l.jsx(Vh,{children:"遇到问题主动踏出第一步,做先行者而不是追随者。"})]})]})]})]}),l.jsx(Fz,{src:jz}),l.jsx(Uz,{src:Ow}),l.jsx($z,{src:Ow}),l.jsx(Bz,{src:Ez})]})}),Gz="/zh-cn/assets/public-ebe954c4.svg",Kz="/zh-cn/assets/mail-63c82f9f.svg",Xz="/zh-cn/assets/wechat-c8587d4a.svg",Qz="/zh-cn/assets/bilibili-b4f04177.svg",qz="/zh-cn/assets/zhihu-6dedfed7.svg",Zz="/zh-cn/assets/wechat-public-qrcode1-2f1a7fe8.png",Jz="/zh-cn/assets/email-qrcode1-86dcc594.png",eY="/zh-cn/assets/wechat-qrcode1-72234ee7.png",tY="/zh-cn/assets/bilibili-qrcode1-27289e6d.png",rY="/zh-cn/assets/zhihu-qrcode1-6f12e2dc.png",{Heading:nY,Paragraph:iY}=Pe,{CNHead4:oY,CNTitleMedium:sY}=nY,{CNBodySmall:aY}=iY,lY=f.section` - background: #f7f7f9; -`,cY=f.div` - max-width: 1440px; - margin-inline: auto; - padding: 1rem 1.64rem 1.94rem; -`,uY=f(oY)` - padding-bottom: 1.54rem; - color: ${e=>e.theme.themeDark02}; - text-align: center; -`,dY=f.div` - display: grid; - grid-template-columns: repeat(5, 1fr); - grid-template-rows: repeat(1, 1fr); - justify-items: center; -`,fY=f.div` - display: flex; - flex-direction: column; - align-items: center; - width: 100%; -`,hY=f.div` - width: 100%; - margin-bottom: 0.31rem; - padding-top: calc(1.63rem - 1.54rem); - padding-bottom: calc(0.4rem - 0.31rem); - border-right: 0.01rem solid ${e=>e.theme.secondary02}; - &.icon:last-of-type { - border: none; - } -`,mY=f.img` - display: block; - margin-inline: auto; - margin-bottom: 0.13rem; - width: 0.9rem; - height: 0.9rem; -`,pY=f(sY)` - text-align: center; -`,gY=f.img` - width: 1.6rem; - padding-bottom: 0.16rem; - display: block; -`,vY=f(aY)``,yY=[{title:"公众号",icon:Gz,qrCode:Zz,text:"达坦科技DatenLord"},{title:"邮箱",icon:Kz,qrCode:Jz,text:"info@datenlord.com"},{title:"微信",icon:Xz,qrCode:eY,text:"DatenLord小助手"},{title:"B站",icon:Qz,qrCode:tY,text:"达坦科技DatenLord"},{title:"知乎",icon:qz,qrCode:rY,text:"达坦科技DatenLord"}],Db=()=>l.jsx(lY,{id:"contact-us",children:l.jsxs(cY,{children:[l.jsx(uY,{children:"联系我们"}),l.jsx(dY,{children:yY.map(({title:e,icon:t,qrCode:r,text:n},i)=>l.jsxs(fY,{children:[l.jsxs(hY,{className:"icon",children:[l.jsx(mY,{src:t}),l.jsx(pY,{children:e})]}),r&&l.jsx(gY,{src:r}),l.jsx(vY,{children:n})]},i))})]})}),Eb="/zh-cn/assets/cover-ab5c0f66.png",Pw=()=>{const{sectionId:e}=Sn();return I.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t==null||t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(Rt.Fragment,{children:[l.jsx(Ir,{cover:Eb,subTitle:"达坦科技通过软硬件深度融合的方式,提供高性能存储和高性能网络,打造高性能 AI + Cloud 基础设施平台。",children:"公司"}),l.jsx(Sz,{}),l.jsx(Wz,{}),l.jsx(Db,{})]})},wY="/zh-cn/assets/card-bg1-242750c8.png",_Y="/zh-cn/assets/card-bg2-603ed811.png",xY="/zh-cn/assets/card-bg3-14a8311e.png",{Heading:SY,Paragraph:bY}=Pe,{CNHead5S:kY,CNHead4:CY}=SY,{CNBodyLarge:DY}=bY,EY=f.section` - padding-bottom: 0.63rem; -`,jY=f(kY)``,AY=f.div` - display: grid; - grid-template-columns: repeat(3, 1fr); - grid-template-rows: repeat(1, 1fr); - grid-gap: 0.23rem; -`,TY=f.div` - padding-top: 0.79rem; - padding-bottom: 0.9rem; - padding-inline: 0.25rem; - border-radius: 0.1rem; - color: ${e=>e.theme.themeDark02}; - text-align: center; - background: #00000015; - background-image: url(${e=>e.bg}); - background-size: cover; -`,RY=f(CY)` - padding-bottom: 0.51rem; -`,OY=f(DY)``,PY=[{title:"创造性工作",text:"在DatenLord,你将有机会与一群才华横溢、积极进取的人一起创造性且高效率地工作。",bg:wY},{title:"归属感",text:"DatenLord重视社区文化不仅仅局限于开源社区,我们也希望我们的员工在这里有一种包容感和归属感。",bg:_Y},{title:"远程工作",text:"DatenLord专注于研究和开发分布式存储系统,我们是一个分布式的团队,大多数成员都可以远程工作。",bg:xY}],LY=()=>l.jsxs(EY,{children:[l.jsx(jY,{style:{paddingBottom:".63rem"},children:"为什么选择达坦科技?"}),l.jsx(AY,{children:PY.map(({title:e,text:t,bg:r},n)=>l.jsxs(TY,{bg:r,children:[l.jsx(RY,{children:e}),l.jsx(OY,{children:t})]},n))})]}),{Heading:MY,Paragraph:IY}=Pe,{CNHead5S:NY}=MY,{CNBodyLarge:zY}=IY,YY=f.section` - padding-bottom: 0.63rem; -`,VY=f(NY)``,HY=f.div` - display: flex; - flex-direction: column; - padding-top: 0.94rem; - padding-inline: 0.48rem; -`,ba=f.div` - display: flex; - padding-bottom: 0.46rem; - &:last-child { - padding-bottom: 0; - } -`,of=f(zY)` - border-radius: 50vh; - padding-block: 0.16rem; - padding-inline: 0.34rem; - white-space: nowrap; -`,FY=f(of)` - color: #fff; - background: ${e=>e.theme.secondary08}; - box-shadow: 0px 4px 20px 0px rgba(251, 170, 48, 0.51); -`,jb=f(of)` - color: #2e2f33; - background: ${e=>e.theme.white00}; - box-shadow: 0px 4px 20px 0px rgba(0, 0, 0, 0.11); -`,Hg=f(of)` - color: ${e=>e.theme.white00}; - background: ${e=>e.theme.secondary01}; - box-shadow: 0px 4px 20px 0px rgba(54, 84, 255, 0.45); -`,UY=f(of)` - color: #2e2f33; - background: ${e=>e.theme.secondary02}; - box-shadow: 0px 4px 20px 0px rgba(0, 0, 0, 0.11); -`,$Y=f(FY)` - transform: translateX(calc(4.81rem - 2.03rem)); -`,BY=f(jb)` - transform: translateY(calc(-0.46rem + 0.3rem)); -`,WY=f(Hg)` - transform: translateX(calc(0.99rem)); -`,GY=f(UY)` - transform: translateX(calc(3.7rem - 2.03rem)); -`,KY=f(Hg)` - transform: translateX(calc(3.1rem - 2.03rem)); -`,XY=f(Hg)` - transform: translate(3.31rem, calc(-0.43rem + 0.13rem)); -`,QY=f(jb)` - transform: translateX(calc(6.56rem - 2.03rem)); -`,qY=()=>l.jsxs(YY,{children:[l.jsx(VY,{children:"我们在寻找什么样的人才?"}),l.jsxs(HY,{children:[l.jsx(ba,{children:l.jsx($Y,{children:"对行业内的最新技术发展保持敏锐的洞察力"})}),l.jsxs(ba,{style:{paddingBottom:"0.27rem"},children:[l.jsx(BY,{children:"对于以创新的方式做有意义的事情饱含热情"}),l.jsx(WY,{children:"具有好奇心,养成良好的学习习惯和方法"})]}),l.jsx(ba,{style:{paddingBottom:"0.43rem"},children:l.jsx(GY,{children:"对于以创新的方式做有意义的事情饱含热情"})}),l.jsxs(ba,{style:{paddingBottom:"0.14rem"},children:[l.jsx(KY,{children:"始终以终为始"}),l.jsx(XY,{children:"热衷于开放且有意识地分享知识"})]}),l.jsx(ba,{children:l.jsx(QY,{children:"坦率而直接地进行沟通"})})]})]}),ZY="/zh-cn/assets/react-718251fb.svg",{Heading:JY}=Pe,{CNHead5S:eV,CNTitleLarge:tV}=JY,rV=f.section` - padding-bottom: 1.83rem; -`,nV=f(eV)``,iV=f.div` - display: flex; - justify-content: center; - padding-top: 1.67rem; - padding-inline: 0.32rem; -`,Lw=f.div` - width: calc(2.42rem + 0.08rem + 0.12rem); -`,Ab=f(tV)` - padding-left: 0.08rem; - color: ${e=>e.theme.themeDark02}; -`,Mw=f(Ab)` - border-left: 0.12rem solid ${e=>e.theme.secondary08}; -`,Iw=f(Ab)` - border-left: 0.12rem solid ${e=>e.theme.secondary07}; -`,oV=f.img` - padding-inline: 0.24rem; - width: 4.55rem; -`,sV=()=>l.jsxs(rV,{children:[l.jsx(nV,{children:"我们能提供什么?"}),l.jsxs(iV,{children:[l.jsxs(Lw,{children:[l.jsx(Mw,{style:{marginTop:"0.64rem"},children:"灵活的工作内容,艰巨挑战,激发创新"}),l.jsx(Iw,{style:{marginTop:"1.28rem"},children:"每年可申请长达2周的学习假期,自由选择充电课题"})]}),l.jsx(oV,{src:ZY}),l.jsxs(Lw,{children:[l.jsx(Iw,{style:{marginTop:"0.64rem"},children:"丰富的软性素质及专业技能培训"}),l.jsx(Mw,{style:{marginTop:"1.28rem"},children:"诸多行业交流和展现自我的机会"})]})]})]}),Tb="/zh-cn/assets/avatar-icon-b12a4de6.svg",aV="/zh-cn/assets/image-534e9e5c.png",{Heading:lV,Paragraph:cV}=Pe,{CNHead5S:uV,CNTitleLarge:Rb,CNTitleMedium:dV}=lV,{CNBodyMedium:Pl,CNMarkMedium:fV}=cV,hV=[{title:"Rust分布式存储开发(远程实习)",avatar:"",text:"参与高性能分布式存储系统研发,涉及的开发内容包括但不限于:",items:["分布式数据一致性协议;","高速网络传输接口、驱动;","分布式缓存、数据管理服务;","对象存储接口;","文件存储接口;","块存储接口。"],url:"/job-description/rust-distributed-storage-development"},{title:"Rust高性能网络系统开发(远程实习)",avatar:"",text:"参与研发高性能网络系统开发,涉及的工作包括但不限于:",items:["网络硬件Linux驱动开发;","网络流量控制算法设计与实现;","网络仿真系统开发与测试。"],url:"/job-description/rust-high-performance-web-systems-development"},{title:"AI平台研发 (远程实习)",avatar:"",items:["负责大模型平台后端的开发研发,根据产品和项目计划按时完成功能模块的架构设计、编码、测试的全流程工作。","负责持续优化系统架构,提供高并发的数据请求分析的处理能力,提高系统的容灾容错能力,保证系统的可运维、高可用性、高可靠性。"],url:"/job-description/ai-platform-development"},{title:"FPGA开发(远程实习)",avatar:"",items:["负责基于FPGA实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","实现常用外设接口IP的RTL设计、集成和验证;","参与SoC集成设计与验证;","撰写相关设计文档。"],url:"/job-description/fpga-development"},{title:"软硬件联合研发(远程实习)",avatar:"",text:"参与高性能存储SoC芯片的软硬件开发:",items:["负责网络IO加速的RTL实现;","负责加密、压缩、编码等算法加速的设计与RTL实现;","负责SoC芯片的Linux驱动开发;","负责实现软硬件联合调试与自动化测试。"],url:"/job-description/joint-research-and-development-of-hardware-and-software"},{title:"数字IC前端设计(远程实习)",avatar:"",text:"参与高性能存储SoC芯片开发:",items:["负责实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现; ","负责实现SoC的集成、综合与原型验证;","负责实现常用外设接口IP的RTL设计、集成;","撰写相关设计文档。"],url:"/job-description/digital-ic-front-end-design"}],mV=f.section``,pV=f(uV)``,gV=f.div` - display: grid; - grid-template-rows: repeat(2, 1fr); - grid-template-columns: repeat(3, 1fr); - grid-gap: 0.58rem 0.32rem; - margin-inline: calc(1.48rem - 1.93rem); - padding-block: 0.82rem 0; -`,vV=f.div` - padding: 0.24rem; - color: ${e=>e.theme.themeDark02}; - border: 0.01rem solid #eaebf0; - border-radius: 0.05rem; - box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.04); -`,yV=f.div` - display: flex; - justify-content: space-between; - padding-bottom: 0.24rem; -`,wV=f.div` - display: flex; - justify-content: center; - align-items: center; - width: 0.48rem; - height: 0.48rem; - background: ${e=>e.theme.secondary02}; - border-radius: 50%; -`,_V=f.img` - width: 0.32rem; - height: 0.32rem; -`,xV=f(fV)` - padding: 0.12rem 0.18rem; - height: 0.46rem; - color: ${e=>e.theme.gray007}; - background: ${({theme:e})=>e.white00}; - border: 0.01rem solid #dae0e6; - box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.04); - cursor: pointer; -`,SV=f(Rb)` - color: ${e=>e.theme.gray007}; - padding-bottom: 0.08rem; -`,bV=f(Pl)``,kV=f(Pl)``,CV=f.ol` - padding-left: 0.2rem; -`,DV=f(Pl)``,EV=f.div` - display: flex; - flex-direction: column; - align-items: center; - background: #d8dcfa; - border-radius: 0.05rem; - padding: 0.72rem 0.64rem 0.59rem; -`;f.div` - width: 1.28rem; - height: 1.28rem; - margin-bottom: 0.3rem; - padding: 0.21rem; - background: ${e=>e.theme.secondary02}; - border-radius: 50%; -`;f.img` - display: block; - width: 100%; - height: 100%; -`;f(Rb)` - padding-bottom: 0.07rem; - color: ${e=>e.theme.secondary08}; -`;f.div` - font-size: 0.2rem; - line-height: 0.28rem; - font-weight: 600; - color: #fff; - text-decoration: underline; - text-align: center; - cursor: pointer; -`;f.div` - display: flex; - justify-content: space-between; - align-items: center; -`;f.img` - width: 50%; - height: min-content; -`;f.div` - width: 46%; -`;f(dV)``;f.ul` - padding-block: 0.36rem; - list-style-type: none; -`;f(Pl)``;f(Pl)``;f.span` - color: ${e=>e.theme.secondary01}; -`;const jV=f.img` - width: 2.44rem; - padding-bottom: 0.16rem; -`,AV=f(yn)` - color: #fff; -`,TV=()=>{const e=ht();return l.jsxs(mV,{children:[l.jsx(pV,{children:"公开招聘"}),l.jsxs(gV,{children:[hV.map(({title:t,text:r,items:n,url:i},o)=>l.jsxs(vV,{children:[l.jsxs(yV,{children:[l.jsx(wV,{children:l.jsx(_V,{src:Tb})}),l.jsx(xV,{onClick:()=>e(i),children:"岗位详情"})]}),l.jsx(SV,{children:t}),l.jsx(bV,{children:"【岗位职责】"}),r&&l.jsx(kV,{children:r}),l.jsx(CV,{children:n.map((a,c)=>l.jsx(DV,{as:"li",children:a},c))})]},o)),l.jsxs(EV,{children:[l.jsx(jV,{src:aV}),l.jsx(AV,{onClick:()=>e("/job-description"),children:"进入招聘岗位详情"})]})]})]})},{Heading:RV}=Pe,{CNHead4:OV}=RV,PV=f.section` - background: #fff; -`,LV=f.div` - max-width: 1440px; - margin-inline: auto; - padding-top: 1rem; - padding-bottom: 1.69rem; - padding-inline: 1.93rem; -`,MV=f(OV)` - padding-bottom: 1.23rem; - text-align: center; -`,Nw=()=>{const{sectionId:e}=Sn();return I.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t==null||t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(Rt.Fragment,{children:[l.jsx(Ir,{cover:Eb,subTitle:"达坦科技通过软硬件深度融合的方式,提供高性能存储和高性能网络,打造高性能 AI + Cloud 基础设施平台。",children:"公司"}),l.jsx(PV,{id:"join-us",children:l.jsxs(LV,{children:[l.jsx(MV,{children:"加入我们"}),l.jsx(LY,{}),l.jsx(qY,{}),l.jsx(sV,{}),l.jsx(TV,{})]})}),l.jsx(Db,{})]})},IV="/zh-cn/assets/video-demo-cover-6531bf08.png",Ec="/zh-cn/assets/arrow-up-right-f6ca128c.svg",NV="/zh-cn/assets/cover1-0f766121.jpg",zV="/zh-cn/assets/cover2-6c924915.jpg",YV="/zh-cn/assets/cover3-a8cadd7b.jpg",VV="/zh-cn/assets/cover4-da59baaf.jpg",HV="/zh-cn/assets/cover5-55104208.jpg",FV="/zh-cn/assets/cover6-bf6d56c4.jpg",UV="/zh-cn/assets/cover7-461ad08e.jpg",$V="/zh-cn/assets/cover8-18bb5252.jpg",BV="/zh-cn/assets/cover9-0cfe7433.jpg",WV="/zh-cn/assets/cover10-7707f5f7.jpg",GV="/zh-cn/assets/cover11-18bf7e52.jpg",KV="/zh-cn/assets/cover12-2ec52bb9.jpg",XV="/zh-cn/assets/cover13-20980f41.jpg",QV="/zh-cn/assets/cover14-6dff9a13.jpg",qV="/zh-cn/assets/cover15-f2819b4b.jpg",ZV="/zh-cn/assets/cover16-6b3eea77.jpg",JV="/zh-cn/assets/cover17-2d99b802.jpg",eH="/zh-cn/assets/cover19-9503f8ee.jpg",tH="/zh-cn/assets/cover20-a198bfe8.jpg",rH="/zh-cn/assets/cover21-c1808615.jpg",nH="/zh-cn/assets/cover22-a24d3264.jpg",iH="/zh-cn/assets/cover23-91837162.jpg",oH="/zh-cn/assets/cover24-f34d429f.jpg",sH="/zh-cn/assets/cover25-11f1a4dd.jpg",aH="/zh-cn/assets/cover26-574c835d.jpg",lH="/zh-cn/assets/cover27-cab7b800.jpg",cH="/zh-cn/assets/cover28-61988539.jpg",uH="/zh-cn/assets/cover29-cfa296fc.jpg",dH="/zh-cn/assets/cover30-6bc9e17a.jpg",fH="/zh-cn/assets/cover31-de17416a.jpg",hH="/zh-cn/assets/cover32-64d8c4cf.jpg",mH="/zh-cn/assets/cover33-747e46a5.jpg",pH="/zh-cn/assets/cover34-b47433e8.jpg",gH="/zh-cn/assets/cover35-474e265e.jpg",vH="/zh-cn/assets/cover40-e2bf253f.jpg",yH="/zh-cn/assets/cover41-56007738.jpg",wH="/zh-cn/assets/cover42-075bcf74.jpg",_H="/zh-cn/assets/cover43-d1896502.jpg",xH="/zh-cn/assets/cover50-2dc33471.jpg",SH="/zh-cn/assets/cover51-235c2ee6.jpg",bH="/zh-cn/assets/cover52-06cc8093.jpg",kH="/zh-cn/assets/cover53-11208fe4.jpg",CH="/zh-cn/assets/cover55-a634f887.jpg",DH=[{key:1,image:NV,title:"Virtio-net相关知识介绍与Rust-for-Linux基本知识",text:"本场workshop由达坦科技李弘宇进行内容分享,主要介绍了Virtio-net相关知识介绍与Rust-for-Linux基本知识。欢迎参加达坦科技DatenLord相关开源项目:https://github.com/datenlord/linux/tree/rust_virtio",date:"2022.08.17",url:"https://www.bilibili.com/video/BV17G4y1a7Bv/"},{key:2,image:zV,title:"roce-sim Workshop分享",text:"本场workshop由达坦科技王恒宇进行内容分享,主要介绍了roce-sim相关知识分享,如果您对这方面有兴趣,欢迎参与达坦科技开源项目:Github链接:https://github.com/datenlord/roce-sim",date:"2022.08.25",url:"https://www.bilibili.com/video/BV1UB4y137Tn/"},{key:3,image:YV,title:"Cocotb Workshop分享",text:"本场workshop由达坦科技DatenLord 翁万正进行内容分享,主要进行了cocotb相关知识介绍。",date:"2022.09.23",url:"https://www.bilibili.com/video/BV19e4y1k7EE/"},{key:4,image:VV,title:"使用Copilot在分布式系统中容忍暂时变慢的节点",text:"本场workshop由达坦科技DatenLord 田野进行内容分享,主要进行了“使用Copilot在分布式系统中容忍暂时变慢的节点“相关知识介绍。",date:"2022.09.30",url:"https://www.bilibili.com/video/BV15e411T7pX/"},{key:5,image:HV,title:"硬件设计的集合方法",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要进行了“硬件设计的集合方法”相关知识介绍。",date:"2022.10.09",url:"https://www.bilibili.com/video/BV1FK411Q7JV/"},{key:6,image:FV,title:"VLSI Sharing",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要进行了VLSI相关知识介绍。",date:"2022.10.15",url:"https://www.bilibili.com/video/BV1bK411Q7GB/"},{key:7,image:UV,title:"Corumdum介绍",text:"本场workshop由西安电子科技大学 ISN网络与交换团队 硕士研究生李钊进行内容分享,主要进行了Corumdum相关知识介绍。",date:"2022.10.16",url:"https://www.bilibili.com/video/BV1qG41177Pq/"},{key:8,image:$V,title:"可编程交换机:原理与使用",text:"本场workshop由上海交通大学IPADS实验室博士二年级 张汉泽进行内容分享,主要进行了“可编程交换机:原理与使用”相关知识分享。可编程交换机由安装包处理规则的控制面与负责高速包处理的数据面构成,两者由一根PCIe总线相连。控制面支持高级语言编程,而数据面逻辑需要用P4语言编写。在可编程交换机上设计系统主要面临数据面内存有限与P4编程模型受限两大挑战。",date:"2022.10.23",url:"https://www.bilibili.com/video/BV1jm4y1w7w3/"},{key:9,image:BV,title:"形式化验证入门",text:"本场workshop由达坦科技DatenLord王璞进行内容分享,主要进行了形式化验证入门相关知识介绍。",date:"2022.10.26",url:"https://www.bilibili.com/video/BV1DG411L78p/"},{key:10,image:WV,title:"利用RDMA加速FaaS服务",text:"本场workshop由达坦科技DatenLord李弘宇进行内容分享,主要进行了“利用RDMA加速FaaS服务”相关知识介绍。",date:"2022.11.06",url:"https://www.bilibili.com/video/BV1et4y1K7Sw/"},{key:11,image:GV,title:"Rust for Linux",text:"本场workshop由苏宇恒进行内容分享,主要进行了“Rust for Linux”相关知识介绍。",date:"2022.11.08",url:"https://www.bilibili.com/video/BV1G8411a7CE/"},{key:12,image:KV,title:"Intel用户态中断",text:"本场workshop由韩明聪进行内容分享,主要进行了“Intel用户态中断”相关知识介绍。",date:"2022.11.08",url:"https://www.bilibili.com/video/BV1tG4y1t7Lg/"},{key:13,image:XV,title:"VLSI DSP Sharing",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要进行了“VLSI DSP Intro”相关知识介绍。",date:"2022.11.11",url:"https://www.bilibili.com/video/BV18P4y1y7iP/"},{key:14,image:QV,title:"DSP Sharing Part2",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要就DSP相关知识进行第二次workshop分享",date:"2022.11.12",url:"https://www.bilibili.com/video/BV1bM411k7YP/"},{key:15,image:qV,title:"eunomia-bpf: 结合 wasm 的 ebpf 轻量级开发框架",text:"本场workshop由浙江大学学生/eunomia-bpf 开发者 郑昱笙进行内容分享,主要内容围绕“eunomia-bpf: 结合 wasm 的 ebpf 轻量级开发框架”相关知识。",date:"2022.11.20",url:"https://www.bilibili.com/video/BV1u84y1C7pQ/"},{key:16,image:ZV,title:"RDMA网络拥塞管理架构",text:"本场workshop由北京邮电大学网络与交换国家重点实验室、计算机学院,副研究员、博导:张乙然进行内容分享,主要内容围绕“RDMA网络拥塞管理架构”进行知识介绍。",date:"2022.11.27",url:"https://www.bilibili.com/video/BV1Ve4y1g7gx/"},{key:17,image:JV,title:"使用RDMA加速服务器无感知计算容器启动",text:"本场workshop由上海交通大学助理教授魏星达进行分享,主要内容围绕“使用RDMA加速服务器无感知计算容器启动”进行知识介绍。",date:"2022.12.04",url:"https://www.bilibili.com/video/BV1qG4y1G784/"},{key:19,image:eH,title:"基于智能网卡的数据处理系统",text:"本场workshop由浙江大学百人计划研究员 王则可进行分享,主要内容为“基于智能网卡的数据处理系统”介绍。",date:"2022.12.18",url:"https://www.bilibili.com/video/BV1Eg411J7fJ/"},{key:20,image:tH,title:"异步事件驱动的电路机制 & 基于RISC-V的全异步超标量CPU体系结构",text:"本场workshop由何安平副教授进行分享,主要内容为“异步事件驱动的电路机制 & 基于RISC-V的全异步超标量CPU体系结构”介绍。",date:"2022.12.25",url:"https://www.bilibili.com/video/BV1sA411D7on/"},{key:21,image:rH,title:"使用 TLA+ 为分布式算法验证正确性",text:"本场workshop由达坦科技DatenLord田野进行分享,主要内容为“使用 TLA+ 为分布式算法验证正确性”介绍。",date:"2023.01.09",url:"https://www.bilibili.com/video/BV1pG4y1y7an/"},{key:22,image:nH,title:"喷泉码技术简介",text:"本场workshop由兰州大学信息科学与工程学院副教授、通信工程专业系主任袁磊 进行分享,主要内容为“喷泉码技术简介”介绍。",date:"2023.01.15",url:"https://www.bilibili.com/video/BV1SM411b77k/"},{key:23,image:iH,title:"数据库隔离级别及MVCC",text:"本场workshop由达坦科技DatenLord施继成进行分享,主要内容为“数据库隔离级别及MVCC”介绍。",date:"2023.01.29",url:"https://www.bilibili.com/video/BV1sR4y1b7Cu/"},{key:24,image:oH,title:"互联网传输协议优化研究",text:"本场workshop由中国人民大学副教授李彤教授进行分享,主要内容为“互联网传输协议优化研究”介绍。",date:"2023.02.06",url:"https://www.bilibili.com/video/BV1X84y157vL/"},{key:25,image:sH,title:"高性能RDMA网络协议栈",text:"高性能RDMA网络协议栈是RDMA高性能网络的核心组成部分之一,它提供了支持RDMA技术的网络协议和驱动程序。在本周的前沿科技分享中,我们邀请到了湖南大学信息科学与工程学院的陈果教授来给我们分享高性能RDMA网络协议栈的话题。",date:"2023.02.28",url:"https://www.bilibili.com/video/BV1Y24y1n7Dk/"},{key:26,image:aH,title:"GPU抢占式任务调度",text:"GPU编程可以大幅提升计算速度和效率,从而使得许多计算任务得以在合理时间内完成。随着GPU硬件技术的发展和大规模数据处理需求的增加,GPU编程的应用范围不断扩大。在本周的前沿科技分享中,我们邀请到了上海交通大学并行与分布式研究所的韩明聪博士来给我们分享GPU抢占式任务调度。",date:"2023.03.05",url:"https://www.bilibili.com/video/BV1cY4y1y7ND/"},{key:27,image:lH,title:"聊聊RaptorQ纠错码",text:"喷泉码具有极高的纠错能力,且具有低延迟、地复杂度、高效率等优点,使其在冷存储、分布式存储、无线通信等领域得到广泛应用。达坦科技致力于软硬件融合的解决方案,喷泉码的高效实现在硬件上,作为公司长期的技术储备,在本周的前沿科技分享中,达坦科技的联合创始人兼CTO施继成将为大家分享聊聊 RaptorQ 纠错码 。",date:"2023.03.15",url:"https://www.bilibili.com/video/BV1wL411C7DL/"},{key:28,image:cH,title:"Buddy Compiler 简介和愿景",text:"在本次分享中,中国科学院软件研究所博士生张洪滨将介绍Buddy Compiler 编译流程、协同设计、硬件支持。Buddy Compiler 是领域特定的编译器框架,致力于打造基于 MLIR 和 RISC-V 的软硬件协同设计生态。其目标是实现从 DSL 到 DSA 的编译流程和协同设计,愿景是让领域特定的协同设计不再困难。",date:"2023.03.21",url:"https://www.bilibili.com/video/BV1YT41167GB/"},{key:29,image:uH,title:"新一代计算架构:超异构计算",text:"AGI带来的变化之一是算力将进一步从CPU转到GPU,在本周的前沿技术分享中,我们邀请到了上海矩向科技创始人兼CEO黄朝波为大家分享新一代计算架构:超异构计算。",date:"2023.04.04",url:"https://www.bilibili.com/video/BV1Rm4y1q7Dx/"},{key:30,image:dH,title:"通过Chainsaw设计DSP电路",text:"DSP在数据压缩、编码和加密方面都发挥了重要的作用;SpinalHDL具有更高的抽象层次和更强的表达能力,可以大大简化DSP电路设计的复杂度和提高开发效率;而Chainsaw框架可以在不同的FPGA平台上运行,提高了设计的灵活性和可移植性。在本周的前沿技术分享中,我们邀请到了中山大学在读博士李天瑞为大家分享通过Chainsaw设计DSP电路。",date:"2023.04.18",url:"https://www.bilibili.com/video/BV14o4y1j7bH/"},{key:31,image:fH,title:"Something About Cache Security",text:"在本周的前沿技术分享中,我们邀请到了浙江大学在读硕士研究生缪晨露为大家分享她在MICRO和HPCA上发表的两篇论文的精华,演讲主题是Something About Cache Security。",date:"2023.04.25",url:"https://www.bilibili.com/video/BV1p24y1F7fN/"},{key:32,image:hH,title:"Rust嵌入式开发生态介绍及入门",text:"在本周的前沿技术分享中,我们邀请到了一位爱好硬件的软件工程师米明恒,来为大家分享Rust嵌入式开发生态介绍及入门。",date:"2023.05.04",url:"https://www.bilibili.com/video/BV1J24y1T7EH/"},{key:33,image:mH,title:"RDMA赋能数据中心/超算中心间远程互联",text:"在本周的前沿技术分享中,我们邀请到了南京大学田臣教授,来为大家分享RDMA赋能数据中心/超算中心间远程互联。",date:"2023.06.04",url:"https://www.bilibili.com/video/BV1cz4y1B7cx/"},{key:34,image:pH,title:"Paper Reading: DPU任务卸载",text:"达坦科技一直在探索用硬件加速做分布式跨云存储,在本周的前沿技术分享中,我们邀请到了中南大学在读博士生卢军,来为大家分享DPU任务卸载的相关研究。",date:"2023.06.17",url:"https://www.bilibili.com/video/BV1R14y1S79T/"},{key:35,image:gH,title:"Rust在物理引擎研发中的应用",text:"在本周的前沿技术分享中,我们邀请到了Motphys CEO崔汉青,来为大家分享Rust在物理引擎研发中的应用。",date:"2023.06.27",url:"https://b23.tv/BZuSvyW"},{key:40,image:vH,title:"基于BSV的RTL仿真加速设计研究",text:"BSV的仿真加速可以提升硬件开发调试的效率。在本周的前沿技术分享中,我们邀请到了梁之杰,来为大家分享基于BSV的RTL仿真加速设计研究。",date:"2023.07.09",url:"https://www.bilibili.com/video/BV1ou411L7Yy/"},{key:41,image:yH,title:"RDMA网络的系统测试方案",text:"在本周的前沿技术分享中,我们邀请到了孔心皓,来为大家分享RDMA 网络的系统测试方案。",date:"2023.07.16",url:"https://www.bilibili.com/video/BV1tz4y147rw/"},{key:42,image:wH,title:"RapidWright技术分享会",text:"在本周的前沿技术分享中,我们邀请到了西南交通大学邸志雄副教授和他的学生向瀚章,来为大家分享开源FPGA设计工具RapidWright技术。",date:"2023.07.28",url:"https://www.bilibili.com/video/BV14z4y1x7a8/"},{key:43,image:_H,title:"基于Karmada实现Kubernetes应用跨集群故障转移",text:"在本周的前沿技术分享中,我们邀请到了开源爱好者,云兴科技软件研发工程师梁远鹏,来为大家分享基于Karmada实现Kubernetes应用跨集群故障转移。",date:"2023.08.01",url:"https://www.bilibili.com/video/BV1rN411Y7aZ/"},{key:50,image:xH,title:"大模型训练和基础设施",text:"在本周的前沿技术分享中,我们邀请到了范一呈,来为大家分享大模型训练和基础设施。",date:"2023.09.01",url:"https://www.bilibili.com/video/BV1ZN4y1R7HP/"},{key:51,image:SH,title:"RustBelt与Rust形式化方法",text:"在本周的前沿技术分享中,我们邀请到了王俊吉,来为大家分享RustBelt与Rust形式化方法。",date:"2023.09.04",url:"https://www.bilibili.com/video/BV1Vw411D7rT/"},{key:52,image:bH,title:"网络的智能该放在哪里:网卡、交换机还是xPU",text:"在本周的前沿技术分享中,我们邀请到了Logenic AI联合创始人、前华为天才少年李博杰,来为大家分享网络的智能该放在哪里:网卡、交换机还是xPU。",date:"2023.09.25",url:"https://www.bilibili.com/video/BV1Kw411Y7Cj/"},{key:53,image:kH,title:"以ARM为镜的RISC-V",text:"在本周的前沿技术分享中,我们邀请到了Logenic AI联合创始人、前华为天才少年李博杰,来为大家分享网络的智能该放在哪里:网卡、交换机还是xPU。",date:"2023.09.25",url:"https://www.bilibili.com/video/BV1Kw411Y7Cj/"},{key:55,image:CH,title:"让大模型在场景中真正落地的产品形态、技术堆栈、交付服务",text:"达坦科技始终致力于打造高性能 Al+ Cloud 基础设施平台,积极推动AI应用的落地。达坦科技通过软硬件深度融合的方式,提供高性能存储和高性能网络。为 AI 应用提供弹性、便利、经济的基础设施服务,以此满足不同行业客户对 AI+Cloud 的需求。在本周的前沿技术分享中,我们邀请到了猴子无限创始人兼CEO尹伯昊,来为大家分享让大模型在场景中真正落地的产品形态、技术堆栈、交付服务。",date:"2024.03.18",url:"https://www.bilibili.com/video/BV1KJ4m187gS/"}],EH="/zh-cn/assets/cover1-42e6189a.jpg",jH="/zh-cn/assets/cover2-af26ed46.jpg",AH="/zh-cn/assets/cover3-9c9d21fa.jpg",TH=[{key:1,image:EH,title:"Xline-跨数据中心一致性的元数据管理",text:"天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。Xline是一款开源分布式KV存储系统,基于Curp共识算法实现,旨在提供跨云元数据管理的功能。相比于传统共识协议Raft或Paxos,Curp在天空计算的场景中有着更好的性能表现。本次分享将聚焦于共识算法,从天空计算的背景和挑战出发,介绍Curp共识算法,以及Revision机制与Curp无序性语义之间的冲突,最后,简述下Xline未来的优化方向。欢迎了解更多关于Xline的信息:Https://github.com/datenlord/Xline",date:"2023.02.09",url:"https://www.bilibili.com/video/BV1XY411q7X8/"},{key:2,image:jH,title:"源码解读:Xline Curp共识协议的设计与实现",text:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源分布式KV存储Xline,针对多数据中心场景,可以实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性。",date:"2023.04.30",url:"https://www.bilibili.com/video/BV1dL411h7YK/"},{key:3,image:AH,title:"Xline的Lease机制与实现",text:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源分布式KV存储Xline,针对多数据中心场景,可以实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性。",date:"2023.06.09",url:"https://www.bilibili.com/video/BV1FX4y1h7X5/"}],RH="/zh-cn/assets/cover1-a1358db9.jpg",OH="/zh-cn/assets/cover2-b899ea12.jpg",PH="/zh-cn/assets/cover3-e0bf4798.jpg",LH="/zh-cn/assets/cover4-15b0b4f1.jpg",MH="/zh-cn/assets/cover5-7c4c2482.jpg",IH="/zh-cn/assets/cover6-1c4d5c5f.jpg",NH="/zh-cn/assets/cover7-4f7454c0.jpg",zH="/zh-cn/assets/cover8-7e30c0fc.jpg",YH="/zh-cn/assets/cover9-e8c86c60.jpg",VH="/zh-cn/assets/cover10-bb13b118.jpg",HH="/zh-cn/assets/cover11-c29e9692.jpg",FH="/zh-cn/assets/cover12-6877e246.jpg",UH="/zh-cn/assets/cover13-5a4d97b0.jpg",$H="/zh-cn/assets/cover14-052a8b36.jpg",BH=[{key:7,image:NH,title:"2022年Rust开发者大会Workshop One:用Rust实现RDMA高性能编程",text:"2022年7月31日,北京达坦科技有限公司获邀参加Rust China大会,并做公司专题workshop。这是本场workshop的第一部分,将为大家介绍如何用Rust实现RDMA高性能编程。",date:"2022.08.03",url:"https://www.bilibili.com/video/BV13e4y1D7Ch/"},{key:8,image:zH,title:"2022年Rust开发者大会Workshop Two:Async RDMA",text:"2022年7月31日,北京达坦科技有限公司获邀参加Rust China大会,并做公司专题workshop。这是第二部分workshop,将为大家介绍Async RDMA。",date:"2022.08.04",url:"https://www.bilibili.com/video/BV1Rh411M7EP/"},{key:9,image:YH,title:"2022年Rust开发者大会Workshop Three:Workshop动手实验环节",text:"2022年7月31日,北京达坦科技有限公司获邀参加Rust China大会,并做公司专题Workshop。这是本场Worshop的第三个部分:workshop动手环节 方便大家体验用Rust构建RDMA应用。",date:"2022.08.04",url:"https://www.bilibili.com/video/BV1oN4y1V7Hn/"},{key:1,image:RH,title:"Rust China Hackathon2022空中路演",text:"由Rust中文社区举办的题为「Rust For Fun」的首届Rust China Hackathon已经顺利完赛。达坦科技作为本届Hackathon的协办方,赞助参与本次企业组赛道。最终获得优胜奖的两支队伍在线上了举办一场空中路演。分享了:他们是如何思考拆解赛题的?在着手设计时碰到哪些难点和挑战?以及最终提交的代码设计思路和亮点。欢迎对Concurrent Indexing感兴趣的伙伴观看本条视频。",date:"2023.01.15",url:"https://www.bilibili.com/video/BV1xY41197Za/"},{key:2,image:OH,title:"4.8 Beijing Rust Meetup|张汉东《理解 Unsafe Rust》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由《Rust 编程之道》作者、Rust 中文社区布道者张汉东老师进行,主题为《理解 Unsafe Rust》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1c24y1A7aK/"},{key:3,image:PH,title:"4.8 Beijing Rust Meetup|冯洋《RUFES》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场由南京大学计算机科学与技术系助理研究员冯洋老师进行《基于实际场景应用分析的Rust库模糊测试技术报告》的演讲分享。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Qo4y1n7tS/"},{key:4,image:LH,title:"4.8 Beijing Rust Meetup|施继成《Rust for Linux 6.2》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由达坦科技联合创始人兼CTO施继成进行,演讲主题是《Rust for Linux 6.2》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Bs4y117Ze/"},{key:5,image:MH,title:"4.8 Beijing Rust Meetup|叶天星《用Rust实现Git传输协议、Git对象解析和数据库存储》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由达坦科技联合创始人兼CTO施继成进行,演讲主题是《Rust for Linux 6.2》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Bs4y117Ze/"},{key:6,image:IH,title:"4.8 Beijing Rust Meetup|茌海《Monoio:一个基于 io-uring 的 Rust Runtime》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由达坦科技联合创始人兼CTO施继成进行,演讲主题是《Rust for Linux 6.2》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Rh411M7EP/"},{key:10,image:VH,title:"如何用Rust写分布式系统",text:"分享会介绍分布式KV Store (Xline) 整体的组成,以及不同组件之间如何去交互。在广域网下的分布式系统如何高效地达成共识,以及分布式系统如何实现容错。",date:"2023.06.24",url:"https://www.bilibili.com/video/BV1Hs4y1r7dD/"},{key:11,image:HH,title:"Building microsecond-scale system with modern networking in Rust",text:"随着新型网络技术,如RDMA的普及,现代分布式应用的延迟降到了毫秒甚至微秒级别。这为构建系统软件带来了新的挑战。Rust的zero-cost抽象及内存管理能力能够为构建新型分布式应用带来新的机遇。我将分享利用Rust在用户态及内核态构建新型系统软件的相关经验,包括如何利用Rust抽象RDMA硬件的底层抽象及如何在内核构建一个毫秒级的容器启动机制。",date:"2023.06.24",url:"https://www.bilibili.com/video/BV1Zo4y1P7Sg/"},{key:12,image:FH,title:"30分钟体验Rust for Linux内核模块开发",text:"本主题会提供构建好的docker开发环境,在30分钟内演示如何使用r4l开发一个简易内核模块,并介绍目前r4l的发展现状。可以自备好电脑现场体验。",date:"2023.06.24",url:"https://www.bilibili.com/video/BV12j411U78o/"},{key:13,image:UH,title:"DatenLord 2023 Hackathon赛题宣讲会",text:"达坦科技基于其跨云分布式文件系统DatenLord项目,结合AI大模型时代背景,搭建了擂台,在此正式向您发出邀约!本次大赛主题为 Explore the Possibilities 赛题深刻有趣,奖品丰厚多样,借此机会您不仅可以尽情施展才华、与来自全国各地优秀的青年才俊们同台PK,更将有机会与优秀的评委教师对话交流。Clock is Ticking!无需犹豫,行动起来吧!",date:"2023.11.25",url:"https://www.bilibili.com/video/BV1su4y157iB/"},{key:14,image:$H,title:"DatenLord Hackathon2023空中路演",text:"DatenLord Hackathon 2023已经顺利完赛。达坦科技基于其跨云分布式文件系统DatenLord项目,结合AI大模型时代背景,搭建了擂台。我们邀请参赛者为DatenLord的极端场景设计并实现缓存 p2p 传输和同步模块。本次空中路演邀请了最终获得优胜奖的两支队伍进行思路分享,包括他们的解题思路,碰到的难点和挑战,以及如何应对的方法和设计亮点。欢迎感兴趣的大家进行观看,有问题也欢迎在评论区进行交流~~不要忘记一键三连哦~~",date:"2024.01.07",url:"https://www.bilibili.com/video/BV1ic411t7Nf/"}],WH="/zh-cn/assets/cover1-b9371555.jpg",GH="/zh-cn/assets/cover2-41a903e3.jpg",KH="/zh-cn/assets/cover2-41a903e3.jpg",XH="/zh-cn/assets/cover2-41a903e3.jpg",QH="/zh-cn/assets/cover2-41a903e3.jpg",qH="/zh-cn/assets/cover2-41a903e3.jpg",ZH="/zh-cn/assets/cover2-41a903e3.jpg",JH="/zh-cn/assets/cover2-41a903e3.jpg",eF="/zh-cn/assets/cover2-41a903e3.jpg",tF="/zh-cn/assets/cover13-a69a12b0.jpg",rF="/zh-cn/assets/cover14-3a97e013.jpg",nF="/zh-cn/assets/cover14-3a97e013.jpg",iF="/zh-cn/assets/cover14-3a97e013.jpg",oF="/zh-cn/assets/cover14-3a97e013.jpg",sF="/zh-cn/assets/cover14-3a97e013.jpg",aF="/zh-cn/assets/cover14-3a97e013.jpg",lF="/zh-cn/assets/cover20-c97bc11b.jpg",cF="/zh-cn/assets/cover21-9f52ba13.jpg",uF="/zh-cn/assets/cover22-187b655a.jpg",dF="/zh-cn/assets/cover23-1e515665.jpg",fF="/zh-cn/assets/cover24-020d0c34.jpg",hF="/zh-cn/assets/cover25-cb84d871.jpg",mF="/zh-cn/assets/cover26-7a726e97.jpg",pF="/zh-cn/assets/cover27-401eea81.jpg",gF="/zh-cn/assets/cover28-6ddc6bee.jpg",vF="/zh-cn/assets/cover29-0d2deb11.jpg",yF=[{key:1,image:WH,title:"Utilizing SpinalHDL for Large-scale Datapath Design",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的一个workshop:Utilizing SpinalHDL for Large-scale Datapath Design,由李天瑞进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1PM411m7DB/"},{key:2,image:GH,title:"A Network Attached Deep Learning Accelerator for FPGA Clusters",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的三个workshop:A Network Attached Deep Learning Accelerator for FPGA Clusters,由Philipp Kreowsky Justin Knapheide进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1HM411m7mS/"},{key:3,image:KH,title:"Coding a microprogrammed protocol receiver in SpinalHDL",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的五个workshop:Coding a microprogrammed protocol receiver in SpinalHDL,由Michael Meier进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1oK411z7VD/"},{key:4,image:XH,title:"Utilizing SpinalHDL to Accelerate Neuroscience",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的二个workshop:Utilizing SpinalHDL to Accelerate Neuroscience,由Jeff-Ciesielski进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1GG4y1J7gU/"},{key:5,image:QH,title:"SpinalHDL in Computer Architecture Research",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的四个workshop:SpinalHDL in Computer Architecture Research,由Sallar Ahmadi-Pour ( saahm)进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1gA411X7f8/"},{key:6,image:qH,title:"NaxRiscv: A Pipeline/Plugins/SpinalHDL/Scala mix",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第六个workshop:NaxRiscv: A Pipeline/Plugins/SpinalHDL/Scala mix,由Dolu1990进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV13K41167q5/"},{key:7,image:ZH,title:"Recent progress on formal verification support on SpinalHDL",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第七个workshop:Recent progress on formal verification support on SpinalHDL,由Xiao Yindong (Readon)进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV1bG411N7fk/"},{key:8,image:JH,title:"SpinalHDL for ASIC",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第八个workshop:SpinalHDL for ASIC,由Sebastien-riou进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV16e4y1L7dV/"},{key:9,image:eF,title:"From Peripheral Plugins to Product documentation",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第九个workshop:From Peripheral Plugins to Product documentation,由Andreas Wallner进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV12v4y1Q7cg/"},{key:13,image:tF,title:"Coroutines Applied to a Tilelink Interconnect Elaboration",text:"SpinalHDL始于2014年,最初是作为VHDL/Verilog的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注。达坦科技联合了SpinalHDL社区,以及四川芯测电子技术有限公司举办了一场题为SpinalHDL的使用和开发经验研讨会,旨在和大家分享SpinalHDL最新的实践、挑战和经验的分享。本视频为Workshop的第一部分,由Charles Popen进行分享。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1Vz4y1J7ck/"},{key:14,image:rF,title:"RISC-V敏捷硬件开发-软件定义芯片",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第一个分享《RISC-V敏捷硬件开发-软件定义芯片》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV1Qh4y1K7pH/"},{key:15,image:nF,title:"香山处理器与敏捷开发工具链的最新进展",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第二个分享《香山处理器与敏捷开发工具链的最新进展》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV1Dz4y1T7V6/"},{key:16,image:iF,title:"数据流式编程在硬件设计中的应用",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第三个分享《数据流式编程在硬件设计中的应用》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV12N411B7TN/"},{key:17,image:oF,title:"EDA创新推动敏捷芯片设计",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第四个分享《EDA创新推动敏捷芯片设计》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV1Tz4y1M7vt/"},{key:18,image:sF,title:"Automated CPU design with AI",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第五个分享《Automated CPU design with AI》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV13w411Q7zi/"},{key:19,image:aF,title:"MetaHVL硬件敏捷验证与协同仿真",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第六个分享《MetaHVL硬件敏捷验证与协同仿》。",date:"2023.08.26",url:"https://www.bilibili.com/video/BV1DN4y197Pm/"},{key:20,image:lF,title:"计算机体系结构MIT课程学习社区经验分享",text:"在2023年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。本场分享主题为【计算机体系结构MIT课程学习社区经验分享】,旨在了解学习社区各位同学学习的状态和面临的挑战,邀请已完成课程的学员分享学习和动手操作LAB的经验和教训,以此更好地辅助大家完成课程。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1cs4y1r7T3/"},{key:21,image:cF,title:"计算机体系结构 l MIT课程学习新手上路宣讲",text:"达坦科技在2023年始,发起成立计算机体系结构- MIT课程学习社区,号召感兴趣的工程师和同学系统地学习计算机体系结构相关知识,并且通过动手项目来验证学习的成果。为此,达坦科技软硬件联合开发工程师米明恒在2023年9月23日(周六)上午10:30为大家带来了一场计算机体系结构 l MIT课程学习新手上路宣讲。",date:"2023.09.24",url:"https://www.bilibili.com/video/BV1u8411i7Qw/"},{key:22,image:uF,title:"Stream Transaction Extender设计与验证",text:"达坦科技联合了SpinalHDL社区,以及四川芯测电子技术有限公司举办了一场题为SpinalHDL的使用和开发经验研讨会,旨在和大家分享SpinalHDL最新的实践、挑战和经验的分享。本视频为Workshop的第二部分,由电子科技大学副教授肖寅东(Readon)进行分享。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1pM4y1j7Lm/"},{key:23,image:dF,title:"面向Multi-Die FPGA的设计与部署自动化方法探索",text:"达坦科技联合了SpinalHDL社区,以及四川芯测电子技术有限公司举办了一场题为SpinalHDL的使用和开发经验研讨会,旨在和大家分享SpinalHDL最新的实践、挑战和经验的分享。本视频为Workshop的第三部分,由西安交通大学副教授邸志雄进行分享。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1og4y1c7RS/"},{key:24,image:fF,title:"Get Started with SpinalHDL with a Simplified Setup",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办了 《2023 SpinalHDL应用前景探索》的线上研讨会,这是研讨会第一个视频,Get Started with SpinalHDL with a Simplified Setup",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1TW4y1F7uQ/"},{key:25,image:hF,title:"Some Tips on Using Memory Black Box in SpinalHDL",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第二个视频,由yportne13带来“Some Tips on Using Memory Black Box in SpinalHDL”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1LC4y1g7c7/"},{key:26,image:mF,title:"Pipelining API Introduction",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第三个视频,由Charles Papon带来“Pipelining API Introduction”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Zj411n7SC/"},{key:27,image:pF,title:"SpinalHDL Intro for New Users",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第四个视频,由Andreas Wallner带来“SpinalHDL Intro for New Users”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Mw41147aS/"},{key:28,image:gF,title:"Pcie Brief Introduction",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第五个视频,由Chenbo带来“Pcie Brief Introduction”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Mw41147aS/"},{key:29,image:vF,title:"The J1Sc Family",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第六个视频,由Christopher Lozinsk带来“The J1Sc Family”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Jc411o7A6/"}],{Heading:wF,Paragraph:_F}=Pe,{CNHead4:xF,CNTitleLarge:SF}=wF,{CNMarkSmall:bF,CNBodySmall:kF}=_F,jc=new Map([["tech-talk",{label:"前沿科技分享",description:"探索前沿技术,拥抱创新与改变",list:DH,recommend:27}],["oss-showcase",{label:"开源产品分享",description:"软硬件融合创新实践的观察与输出",list:TH,recommend:2}],["rust-showcase",{label:"Rust语言应用及案例分享",description:"Rust编程语言的应用、实践与探索",list:BH,recommend:12}],["hardware-acceleration",{label:"硬件加速",description:"硬件加速领域的实践、经验与挑战",list:yF,recommend:21}]]),CF=f.main``,DF=f.div` - max-width: 1440px; - margin-inline: auto; - padding: 1rem 1.76rem 1.68rem; -`,Hh=f.section` - padding-bottom: 0.84rem; - &:last-child { - padding-bottom: 0; - } -`,Fh=f(xF)` - padding-bottom: 0.48rem; - text-align: center; -`,EF=f.div` - display: grid; - grid-template-rows: repeat(2, 1fr); - grid-template-columns: repeat(2, 1fr); - grid-gap: 0.29rem; -`,jF=f.div` - display: grid; - grid-template-columns: repeat(3, 1fr); - grid-gap: 0.43rem 0.29rem; -`,Ob=f.div` - display: flex; - flex-direction: column; -`,AF=f(Ob)` - display: flex; - flex-direction: column; - grid-area: 1 / 1 / 3 / 2; -`,TF=f.div` - display: flex; - justify-content: space-between; - height: 100%; -`,RF=f.div``,zw=f.img` - display: block; - width: 100%; - border-radius: 0.06rem; -`,OF=f.img` - display: block; - width: 50%; - height: min-content; - border-radius: 0.06rem; -`,PF=f.img` - float: left; - width: 50%; - padding-right: 0.21rem; - padding-bottom: 0.21rem; - border-radius: 0.06rem; -`,Yw=f.div` - padding-top: 0.29rem; -`,LF=f.div` - width: 47%; -`,Ac=f(bF)` - padding-bottom: 0.11rem; - color: ${e=>e.theme.secondary01}; -`,Tc=f.div` - display: flex; - justify-content: space-between; - align-items: center; - padding-bottom: 0.11rem; - color: #1a1a1a; - &:hover { - color: #531dab; - } -`,Rc=f(SF)``,Oc=f.img` - width: 0.215rem; - height: 0.215rem; -`,Pc=f(kF)` - color: #667085; -`,Lc=()=>{var a,c,d,h;const t=si().pathname.split("/").join(""),r=(a=jc.get(t))==null?void 0:a.label,n=(c=jc.get(t))==null?void 0:c.description,i=(d=jc.get(t))==null?void 0:d.list.reverse(),o=(h=jc.get(t))==null?void 0:h.recommend;return I.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsxs(Rt.Fragment,{children:[l.jsx(Ir,{cover:IV,subTitle:n,children:r}),l.jsx(CF,{children:l.jsxs(DF,{children:[l.jsxs(Hh,{children:[l.jsx(Fh,{children:"最新视频"}),l.jsx(EF,{children:i&&i.map(({key:g,image:v,date:x,title:k,text:C,url:D},E)=>E===0?l.jsxs(AF,{children:[l.jsx(zw,{src:v}),l.jsxs(Yw,{children:[l.jsx(Ac,{children:x}),l.jsxs(Tc,{as:wc,to:D,children:[l.jsx(Rc,{children:k}),l.jsx(Oc,{src:Ec})]}),l.jsx(Pc,{children:C})]})]},g):E<3?l.jsxs(RF,{children:[l.jsx(PF,{src:v}),l.jsx(Ac,{children:x}),l.jsxs(Tc,{as:wc,to:D,children:[l.jsx(Rc,{children:k}),l.jsx(Oc,{src:Ec})]}),l.jsx(Pc,{children:C})]},E):null)})]}),l.jsxs(Hh,{children:[l.jsx(Fh,{children:"推荐视频"}),i&&i.map(({key:g,image:v,date:x,title:k,text:C,url:D})=>{if(g===o)return l.jsxs(TF,{children:[l.jsx(OF,{src:v}),l.jsxs(LF,{children:[l.jsx(Ac,{children:x}),l.jsxs(Tc,{as:wc,to:D,children:[l.jsx(Rc,{children:k}),l.jsx(Oc,{src:Ec})]}),l.jsx(Pc,{children:C})]})]},g)})]}),l.jsxs(Hh,{children:[l.jsx(Fh,{children:"全部视频"}),l.jsx(jF,{children:i&&i.map(({key:g,image:v,date:x,title:k,text:C,url:D})=>l.jsxs(Ob,{children:[l.jsx(zw,{src:v}),l.jsxs(Yw,{children:[l.jsx(Ac,{children:x}),l.jsxs(Tc,{as:wc,to:D,children:[l.jsx(Rc,{children:k}),l.jsx(Oc,{src:Ec})]}),l.jsx(Pc,{children:C})]})]},g))})]})]})})]})};//! moment.js -//! version : 2.29.4 -//! authors : Tim Wood, Iskren Chernev, Moment.js contributors -//! license : MIT -//! momentjs.com -var Pb;function B(){return Pb.apply(null,arguments)}function MF(e){Pb=e}function en(e){return e instanceof Array||Object.prototype.toString.call(e)==="[object Array]"}function mo(e){return e!=null&&Object.prototype.toString.call(e)==="[object Object]"}function Te(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function Fg(e){if(Object.getOwnPropertyNames)return Object.getOwnPropertyNames(e).length===0;var t;for(t in e)if(Te(e,t))return!1;return!0}function lr(e){return e===void 0}function ri(e){return typeof e=="number"||Object.prototype.toString.call(e)==="[object Number]"}function Ll(e){return e instanceof Date||Object.prototype.toString.call(e)==="[object Date]"}function Lb(e,t){var r=[],n,i=e.length;for(n=0;n>>0,n;for(n=0;n0)for(r=0;r=0;return(o?r?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+n}var Wg=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,Mc=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,$h={},ys={};function se(e,t,r,n){var i=n;typeof n=="string"&&(i=function(){return this[n]()}),e&&(ys[e]=i),t&&(ys[t[0]]=function(){return _n(i.apply(this,arguments),t[1],t[2])}),r&&(ys[r]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function VF(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function HF(e){var t=e.match(Wg),r,n;for(r=0,n=t.length;r=0&&Mc.test(e);)e=e.replace(Mc,n),Mc.lastIndex=0,r-=1;return e}var FF={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function UF(e){var t=this._longDateFormat[e],r=this._longDateFormat[e.toUpperCase()];return t||!r?t:(this._longDateFormat[e]=r.match(Wg).map(function(n){return n==="MMMM"||n==="MM"||n==="DD"||n==="dddd"?n.slice(1):n}).join(""),this._longDateFormat[e])}var $F="Invalid date";function BF(){return this._invalidDate}var WF="%d",GF=/\d{1,2}/;function KF(e){return this._ordinal.replace("%d",e)}var XF={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function QF(e,t,r,n){var i=this._relativeTime[r];return Cn(i)?i(e,t,r,n):i.replace(/%d/i,e)}function qF(e,t){var r=this._relativeTime[e>0?"future":"past"];return Cn(r)?r(t):r.replace(/%s/i,t)}var Ba={};function Wt(e,t){var r=e.toLowerCase();Ba[r]=Ba[r+"s"]=Ba[t]=e}function zr(e){return typeof e=="string"?Ba[e]||Ba[e.toLowerCase()]:void 0}function Gg(e){var t={},r,n;for(n in e)Te(e,n)&&(r=zr(n),r&&(t[r]=e[n]));return t}var zb={};function Gt(e,t){zb[e]=t}function ZF(e){var t=[],r;for(r in e)Te(e,r)&&t.push({unit:r,priority:zb[r]});return t.sort(function(n,i){return n.priority-i.priority}),t}function af(e){return e%4===0&&e%100!==0||e%400===0}function Ar(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function we(e){var t=+e,r=0;return t!==0&&isFinite(t)&&(r=Ar(t)),r}function Gs(e,t){return function(r){return r!=null?(Yb(this,e,r),B.updateOffset(this,t),this):Wu(this,e)}}function Wu(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function Yb(e,t,r){e.isValid()&&!isNaN(r)&&(t==="FullYear"&&af(e.year())&&e.month()===1&&e.date()===29?(r=we(r),e._d["set"+(e._isUTC?"UTC":"")+t](r,e.month(),hf(r,e.month()))):e._d["set"+(e._isUTC?"UTC":"")+t](r))}function JF(e){return e=zr(e),Cn(this[e])?this[e]():this}function eU(e,t){if(typeof e=="object"){e=Gg(e);var r=ZF(e),n,i=r.length;for(n=0;n68?1900:2e3)};var Xb=Gs("FullYear",!0);function wU(){return af(this.year())}function _U(e,t,r,n,i,o,a){var c;return e<100&&e>=0?(c=new Date(e+400,t,r,n,i,o,a),isFinite(c.getFullYear())&&c.setFullYear(e)):c=new Date(e,t,r,n,i,o,a),c}function yl(e){var t,r;return e<100&&e>=0?(r=Array.prototype.slice.call(arguments),r[0]=e+400,t=new Date(Date.UTC.apply(null,r)),isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e)):t=new Date(Date.UTC.apply(null,arguments)),t}function Ku(e,t,r){var n=7+t-r,i=(7+yl(e,0,n).getUTCDay()-t)%7;return-i+n-1}function Qb(e,t,r,n,i){var o=(7+r-n)%7,a=Ku(e,n,i),c=1+7*(t-1)+o+a,d,h;return c<=0?(d=e-1,h=Wa(d)+c):c>Wa(e)?(d=e+1,h=c-Wa(e)):(d=e,h=c),{year:d,dayOfYear:h}}function wl(e,t,r){var n=Ku(e.year(),t,r),i=Math.floor((e.dayOfYear()-n-1)/7)+1,o,a;return i<1?(a=e.year()-1,o=i+qn(a,t,r)):i>qn(e.year(),t,r)?(o=i-qn(e.year(),t,r),a=e.year()+1):(a=e.year(),o=i),{week:o,year:a}}function qn(e,t,r){var n=Ku(e,t,r),i=Ku(e+1,t,r);return(Wa(e)-n+i)/7}se("w",["ww",2],"wo","week");se("W",["WW",2],"Wo","isoWeek");Wt("week","w");Wt("isoWeek","W");Gt("week",5);Gt("isoWeek",5);q("w",Xe);q("ww",Xe,Cr);q("W",Xe);q("WW",Xe,Cr);Nl(["w","ww","W","WW"],function(e,t,r,n){t[n.substr(0,1)]=we(e)});function xU(e){return wl(e,this._week.dow,this._week.doy).week}var SU={dow:0,doy:6};function bU(){return this._week.dow}function kU(){return this._week.doy}function CU(e){var t=this.localeData().week(this);return e==null?t:this.add((e-t)*7,"d")}function DU(e){var t=wl(this,1,4).week;return e==null?t:this.add((e-t)*7,"d")}se("d",0,"do","day");se("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)});se("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)});se("dddd",0,0,function(e){return this.localeData().weekdays(this,e)});se("e",0,0,"weekday");se("E",0,0,"isoWeekday");Wt("day","d");Wt("weekday","e");Wt("isoWeekday","E");Gt("day",11);Gt("weekday",11);Gt("isoWeekday",11);q("d",Xe);q("e",Xe);q("E",Xe);q("dd",function(e,t){return t.weekdaysMinRegex(e)});q("ddd",function(e,t){return t.weekdaysShortRegex(e)});q("dddd",function(e,t){return t.weekdaysRegex(e)});Nl(["dd","ddd","dddd"],function(e,t,r,n){var i=r._locale.weekdaysParse(e,n,r._strict);i!=null?t.d=i:pe(r).invalidWeekday=e});Nl(["d","e","E"],function(e,t,r,n){t[n]=we(e)});function EU(e,t){return typeof e!="string"?e:isNaN(e)?(e=t.weekdaysParse(e),typeof e=="number"?e:null):parseInt(e,10)}function jU(e,t){return typeof e=="string"?t.weekdaysParse(e)%7||7:isNaN(e)?null:e}function Qg(e,t){return e.slice(t,7).concat(e.slice(0,t))}var AU="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),qb="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),TU="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),RU=Il,OU=Il,PU=Il;function LU(e,t){var r=en(this._weekdays)?this._weekdays:this._weekdays[e&&e!==!0&&this._weekdays.isFormat.test(t)?"format":"standalone"];return e===!0?Qg(r,this._week.dow):e?r[e.day()]:r}function MU(e){return e===!0?Qg(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort}function IU(e){return e===!0?Qg(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin}function NU(e,t,r){var n,i,o,a=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],n=0;n<7;++n)o=kn([2e3,1]).day(n),this._minWeekdaysParse[n]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[n]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[n]=this.weekdays(o,"").toLocaleLowerCase();return r?t==="dddd"?(i=dt.call(this._weekdaysParse,a),i!==-1?i:null):t==="ddd"?(i=dt.call(this._shortWeekdaysParse,a),i!==-1?i:null):(i=dt.call(this._minWeekdaysParse,a),i!==-1?i:null):t==="dddd"?(i=dt.call(this._weekdaysParse,a),i!==-1||(i=dt.call(this._shortWeekdaysParse,a),i!==-1)?i:(i=dt.call(this._minWeekdaysParse,a),i!==-1?i:null)):t==="ddd"?(i=dt.call(this._shortWeekdaysParse,a),i!==-1||(i=dt.call(this._weekdaysParse,a),i!==-1)?i:(i=dt.call(this._minWeekdaysParse,a),i!==-1?i:null)):(i=dt.call(this._minWeekdaysParse,a),i!==-1||(i=dt.call(this._weekdaysParse,a),i!==-1)?i:(i=dt.call(this._shortWeekdaysParse,a),i!==-1?i:null))}function zU(e,t,r){var n,i,o;if(this._weekdaysParseExact)return NU.call(this,e,t,r);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),n=0;n<7;n++){if(i=kn([2e3,1]).day(n),r&&!this._fullWeekdaysParse[n]&&(this._fullWeekdaysParse[n]=new RegExp("^"+this.weekdays(i,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[n]=new RegExp("^"+this.weekdaysShort(i,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[n]=new RegExp("^"+this.weekdaysMin(i,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[n]||(o="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[n]=new RegExp(o.replace(".",""),"i")),r&&t==="dddd"&&this._fullWeekdaysParse[n].test(e))return n;if(r&&t==="ddd"&&this._shortWeekdaysParse[n].test(e))return n;if(r&&t==="dd"&&this._minWeekdaysParse[n].test(e))return n;if(!r&&this._weekdaysParse[n].test(e))return n}}function YU(e){if(!this.isValid())return e!=null?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return e!=null?(e=EU(e,this.localeData()),this.add(e-t,"d")):t}function VU(e){if(!this.isValid())return e!=null?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return e==null?t:this.add(e-t,"d")}function HU(e){if(!this.isValid())return e!=null?this:NaN;if(e!=null){var t=jU(e,this.localeData());return this.day(this.day()%7?t:t-7)}else return this.day()||7}function FU(e){return this._weekdaysParseExact?(Te(this,"_weekdaysRegex")||qg.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(Te(this,"_weekdaysRegex")||(this._weekdaysRegex=RU),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)}function UU(e){return this._weekdaysParseExact?(Te(this,"_weekdaysRegex")||qg.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(Te(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=OU),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function $U(e){return this._weekdaysParseExact?(Te(this,"_weekdaysRegex")||qg.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(Te(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=PU),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function qg(){function e(g,v){return v.length-g.length}var t=[],r=[],n=[],i=[],o,a,c,d,h;for(o=0;o<7;o++)a=kn([2e3,1]).day(o),c=vr(this.weekdaysMin(a,"")),d=vr(this.weekdaysShort(a,"")),h=vr(this.weekdays(a,"")),t.push(c),r.push(d),n.push(h),i.push(c),i.push(d),i.push(h);t.sort(e),r.sort(e),n.sort(e),i.sort(e),this._weekdaysRegex=new RegExp("^("+i.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+n.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+r.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+t.join("|")+")","i")}function Zg(){return this.hours()%12||12}function BU(){return this.hours()||24}se("H",["HH",2],0,"hour");se("h",["hh",2],0,Zg);se("k",["kk",2],0,BU);se("hmm",0,0,function(){return""+Zg.apply(this)+_n(this.minutes(),2)});se("hmmss",0,0,function(){return""+Zg.apply(this)+_n(this.minutes(),2)+_n(this.seconds(),2)});se("Hmm",0,0,function(){return""+this.hours()+_n(this.minutes(),2)});se("Hmmss",0,0,function(){return""+this.hours()+_n(this.minutes(),2)+_n(this.seconds(),2)});function Zb(e,t){se(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}Zb("a",!0);Zb("A",!1);Wt("hour","h");Gt("hour",13);function Jb(e,t){return t._meridiemParse}q("a",Jb);q("A",Jb);q("H",Xe);q("h",Xe);q("k",Xe);q("HH",Xe,Cr);q("hh",Xe,Cr);q("kk",Xe,Cr);q("hmm",Fb);q("hmmss",Ub);q("Hmm",Fb);q("Hmmss",Ub);Ve(["H","HH"],Ct);Ve(["k","kk"],function(e,t,r){var n=we(e);t[Ct]=n===24?0:n});Ve(["a","A"],function(e,t,r){r._isPm=r._locale.isPM(e),r._meridiem=e});Ve(["h","hh"],function(e,t,r){t[Ct]=we(e),pe(r).bigHour=!0});Ve("hmm",function(e,t,r){var n=e.length-2;t[Ct]=we(e.substr(0,n)),t[Xr]=we(e.substr(n)),pe(r).bigHour=!0});Ve("hmmss",function(e,t,r){var n=e.length-4,i=e.length-2;t[Ct]=we(e.substr(0,n)),t[Xr]=we(e.substr(n,2)),t[Kn]=we(e.substr(i)),pe(r).bigHour=!0});Ve("Hmm",function(e,t,r){var n=e.length-2;t[Ct]=we(e.substr(0,n)),t[Xr]=we(e.substr(n))});Ve("Hmmss",function(e,t,r){var n=e.length-4,i=e.length-2;t[Ct]=we(e.substr(0,n)),t[Xr]=we(e.substr(n,2)),t[Kn]=we(e.substr(i))});function WU(e){return(e+"").toLowerCase().charAt(0)==="p"}var GU=/[ap]\.?m?\.?/i,KU=Gs("Hours",!0);function XU(e,t,r){return e>11?r?"pm":"PM":r?"am":"AM"}var ek={calendar:zF,longDateFormat:FF,invalidDate:$F,ordinal:WF,dayOfMonthOrdinalParse:GF,relativeTime:XF,months:cU,monthsShort:$b,week:SU,weekdays:AU,weekdaysMin:TU,weekdaysShort:qb,meridiemParse:GU},qe={},ka={},_l;function QU(e,t){var r,n=Math.min(e.length,t.length);for(r=0;r0;){if(i=mf(o.slice(0,r).join("-")),i)return i;if(n&&n.length>=r&&QU(o,n)>=r-1)break;r--}t++}return _l}function ZU(e){return e.match("^[^/\\\\]*$")!=null}function mf(e){var t=null,r;if(qe[e]===void 0&&typeof ou<"u"&&ou&&ou.exports&&ZU(e))try{t=_l._abbr,r=require,r("./locale/"+e),Yi(t)}catch{qe[e]=null}return qe[e]}function Yi(e,t){var r;return e&&(lr(t)?r=ai(e):r=Jg(e,t),r?_l=r:typeof console<"u"&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),_l._abbr}function Jg(e,t){if(t!==null){var r,n=ek;if(t.abbr=e,qe[e]!=null)Ib("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),n=qe[e]._config;else if(t.parentLocale!=null)if(qe[t.parentLocale]!=null)n=qe[t.parentLocale]._config;else if(r=mf(t.parentLocale),r!=null)n=r._config;else return ka[t.parentLocale]||(ka[t.parentLocale]=[]),ka[t.parentLocale].push({name:e,config:t}),null;return qe[e]=new Bg(Gp(n,t)),ka[e]&&ka[e].forEach(function(i){Jg(i.name,i.config)}),Yi(e),qe[e]}else return delete qe[e],null}function JU(e,t){if(t!=null){var r,n,i=ek;qe[e]!=null&&qe[e].parentLocale!=null?qe[e].set(Gp(qe[e]._config,t)):(n=mf(e),n!=null&&(i=n._config),t=Gp(i,t),n==null&&(t.abbr=e),r=new Bg(t),r.parentLocale=qe[e],qe[e]=r),Yi(e)}else qe[e]!=null&&(qe[e].parentLocale!=null?(qe[e]=qe[e].parentLocale,e===Yi()&&Yi(e)):qe[e]!=null&&delete qe[e]);return qe[e]}function ai(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return _l;if(!en(e)){if(t=mf(e),t)return t;e=[e]}return qU(e)}function e$(){return Kp(qe)}function ev(e){var t,r=e._a;return r&&pe(e).overflow===-2&&(t=r[Gn]<0||r[Gn]>11?Gn:r[pn]<1||r[pn]>hf(r[$t],r[Gn])?pn:r[Ct]<0||r[Ct]>24||r[Ct]===24&&(r[Xr]!==0||r[Kn]!==0||r[lo]!==0)?Ct:r[Xr]<0||r[Xr]>59?Xr:r[Kn]<0||r[Kn]>59?Kn:r[lo]<0||r[lo]>999?lo:-1,pe(e)._overflowDayOfYear&&(t<$t||t>pn)&&(t=pn),pe(e)._overflowWeeks&&t===-1&&(t=sU),pe(e)._overflowWeekday&&t===-1&&(t=aU),pe(e).overflow=t),e}var t$=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,r$=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,n$=/Z|[+-]\d\d(?::?\d\d)?/,Ic=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],Bh=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],i$=/^\/?Date\((-?\d+)/i,o$=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,s$={UT:0,GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function tk(e){var t,r,n=e._i,i=t$.exec(n)||r$.exec(n),o,a,c,d,h=Ic.length,g=Bh.length;if(i){for(pe(e).iso=!0,t=0,r=h;tWa(a)||e._dayOfYear===0)&&(pe(e)._overflowDayOfYear=!0),r=yl(a,0,e._dayOfYear),e._a[Gn]=r.getUTCMonth(),e._a[pn]=r.getUTCDate()),t=0;t<3&&e._a[t]==null;++t)e._a[t]=n[t]=i[t];for(;t<7;t++)e._a[t]=n[t]=e._a[t]==null?t===2?1:0:e._a[t];e._a[Ct]===24&&e._a[Xr]===0&&e._a[Kn]===0&&e._a[lo]===0&&(e._nextDay=!0,e._a[Ct]=0),e._d=(e._useUTC?yl:_U).apply(null,n),o=e._useUTC?e._d.getUTCDay():e._d.getDay(),e._tzm!=null&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[Ct]=24),e._w&&typeof e._w.d<"u"&&e._w.d!==o&&(pe(e).weekdayMismatch=!0)}}function m$(e){var t,r,n,i,o,a,c,d,h;t=e._w,t.GG!=null||t.W!=null||t.E!=null?(o=1,a=4,r=Wo(t.GG,e._a[$t],wl(Ke(),1,4).year),n=Wo(t.W,1),i=Wo(t.E,1),(i<1||i>7)&&(d=!0)):(o=e._locale._week.dow,a=e._locale._week.doy,h=wl(Ke(),o,a),r=Wo(t.gg,e._a[$t],h.year),n=Wo(t.w,h.week),t.d!=null?(i=t.d,(i<0||i>6)&&(d=!0)):t.e!=null?(i=t.e+o,(t.e<0||t.e>6)&&(d=!0)):i=o),n<1||n>qn(r,o,a)?pe(e)._overflowWeeks=!0:d!=null?pe(e)._overflowWeekday=!0:(c=Qb(r,n,i,o,a),e._a[$t]=c.year,e._dayOfYear=c.dayOfYear)}B.ISO_8601=function(){};B.RFC_2822=function(){};function rv(e){if(e._f===B.ISO_8601){tk(e);return}if(e._f===B.RFC_2822){rk(e);return}e._a=[],pe(e).empty=!0;var t=""+e._i,r,n,i,o,a,c=t.length,d=0,h,g;for(i=Nb(e._f,e._locale).match(Wg)||[],g=i.length,r=0;r0&&pe(e).unusedInput.push(a),t=t.slice(t.indexOf(n)+n.length),d+=n.length),ys[o]?(n?pe(e).empty=!1:pe(e).unusedTokens.push(o),oU(o,n,e)):e._strict&&!n&&pe(e).unusedTokens.push(o);pe(e).charsLeftOver=c-d,t.length>0&&pe(e).unusedInput.push(t),e._a[Ct]<=12&&pe(e).bigHour===!0&&e._a[Ct]>0&&(pe(e).bigHour=void 0),pe(e).parsedDateParts=e._a.slice(0),pe(e).meridiem=e._meridiem,e._a[Ct]=p$(e._locale,e._a[Ct],e._meridiem),h=pe(e).era,h!==null&&(e._a[$t]=e._locale.erasConvertYear(h,e._a[$t])),tv(e),ev(e)}function p$(e,t,r){var n;return r==null?t:e.meridiemHour!=null?e.meridiemHour(t,r):(e.isPM!=null&&(n=e.isPM(r),n&&t<12&&(t+=12),!n&&t===12&&(t=0)),t)}function g$(e){var t,r,n,i,o,a,c=!1,d=e._f.length;if(d===0){pe(e).invalidFormat=!0,e._d=new Date(NaN);return}for(i=0;ithis?this:e:sf()});function ok(e,t){var r,n;if(t.length===1&&en(t[0])&&(t=t[0]),!t.length)return Ke();for(r=t[0],n=1;nthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function N$(){if(!lr(this._isDSTShifted))return this._isDSTShifted;var e={},t;return $g(e,this),e=nk(e),e._a?(t=e._isUTC?kn(e._a):Ke(e._a),this._isDSTShifted=this.isValid()&&j$(e._a,t.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function z$(){return this.isValid()?!this._isUTC:!1}function Y$(){return this.isValid()?this._isUTC:!1}function ak(){return this.isValid()?this._isUTC&&this._offset===0:!1}var V$=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,H$=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function rn(e,t){var r=e,n=null,i,o,a;return nu(e)?r={ms:e._milliseconds,d:e._days,M:e._months}:ri(e)||!isNaN(+e)?(r={},t?r[t]=+e:r.milliseconds=+e):(n=V$.exec(e))?(i=n[1]==="-"?-1:1,r={y:0,d:we(n[pn])*i,h:we(n[Ct])*i,m:we(n[Xr])*i,s:we(n[Kn])*i,ms:we(Qp(n[lo]*1e3))*i}):(n=H$.exec(e))?(i=n[1]==="-"?-1:1,r={y:Ji(n[2],i),M:Ji(n[3],i),w:Ji(n[4],i),d:Ji(n[5],i),h:Ji(n[6],i),m:Ji(n[7],i),s:Ji(n[8],i)}):r==null?r={}:typeof r=="object"&&("from"in r||"to"in r)&&(a=F$(Ke(r.from),Ke(r.to)),r={},r.ms=a.milliseconds,r.M=a.months),o=new pf(r),nu(e)&&Te(e,"_locale")&&(o._locale=e._locale),nu(e)&&Te(e,"_isValid")&&(o._isValid=e._isValid),o}rn.fn=pf.prototype;rn.invalid=E$;function Ji(e,t){var r=e&&parseFloat(e.replace(",","."));return(isNaN(r)?0:r)*t}function Uw(e,t){var r={};return r.months=t.month()-e.month()+(t.year()-e.year())*12,e.clone().add(r.months,"M").isAfter(t)&&--r.months,r.milliseconds=+t-+e.clone().add(r.months,"M"),r}function F$(e,t){var r;return e.isValid()&&t.isValid()?(t=iv(t,e),e.isBefore(t)?r=Uw(e,t):(r=Uw(t,e),r.milliseconds=-r.milliseconds,r.months=-r.months),r):{milliseconds:0,months:0}}function lk(e,t){return function(r,n){var i,o;return n!==null&&!isNaN(+n)&&(Ib(t,"moment()."+t+"(period, number) is deprecated. Please use moment()."+t+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),o=r,r=n,n=o),i=rn(r,n),ck(this,i,e),this}}function ck(e,t,r,n){var i=t._milliseconds,o=Qp(t._days),a=Qp(t._months);e.isValid()&&(n=n??!0,a&&Wb(e,Wu(e,"Month")+a*r),o&&Yb(e,"Date",Wu(e,"Date")+o*r),i&&e._d.setTime(e._d.valueOf()+i*r),n&&B.updateOffset(e,o||a))}var U$=lk(1,"add"),$$=lk(-1,"subtract");function uk(e){return typeof e=="string"||e instanceof String}function B$(e){return tn(e)||Ll(e)||uk(e)||ri(e)||G$(e)||W$(e)||e===null||e===void 0}function W$(e){var t=mo(e)&&!Fg(e),r=!1,n=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],i,o,a=n.length;for(i=0;ir.valueOf():r.valueOf()9999?ru(r,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):Cn(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+this.utcOffset()*60*1e3).toISOString().replace("Z",ru(r,"Z")):ru(r,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function aB(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e="moment",t="",r,n,i,o;return this.isLocal()||(e=this.utcOffset()===0?"moment.utc":"moment.parseZone",t="Z"),r="["+e+'("]',n=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",i="-MM-DD[T]HH:mm:ss.SSS",o=t+'[")]',this.format(r+n+i+o)}function lB(e){e||(e=this.isUtc()?B.defaultFormatUtc:B.defaultFormat);var t=ru(this,e);return this.localeData().postformat(t)}function cB(e,t){return this.isValid()&&(tn(e)&&e.isValid()||Ke(e).isValid())?rn({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function uB(e){return this.from(Ke(),e)}function dB(e,t){return this.isValid()&&(tn(e)&&e.isValid()||Ke(e).isValid())?rn({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function fB(e){return this.to(Ke(),e)}function dk(e){var t;return e===void 0?this._locale._abbr:(t=ai(e),t!=null&&(this._locale=t),this)}var fk=Nr("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return e===void 0?this.localeData():this.locale(e)});function hk(){return this._locale}var Xu=1e3,ws=60*Xu,Qu=60*ws,mk=(365*400+97)*24*Qu;function _s(e,t){return(e%t+t)%t}function pk(e,t,r){return e<100&&e>=0?new Date(e+400,t,r)-mk:new Date(e,t,r).valueOf()}function gk(e,t,r){return e<100&&e>=0?Date.UTC(e+400,t,r)-mk:Date.UTC(e,t,r)}function hB(e){var t,r;if(e=zr(e),e===void 0||e==="millisecond"||!this.isValid())return this;switch(r=this._isUTC?gk:pk,e){case"year":t=r(this.year(),0,1);break;case"quarter":t=r(this.year(),this.month()-this.month()%3,1);break;case"month":t=r(this.year(),this.month(),1);break;case"week":t=r(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":t=r(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":t=r(this.year(),this.month(),this.date());break;case"hour":t=this._d.valueOf(),t-=_s(t+(this._isUTC?0:this.utcOffset()*ws),Qu);break;case"minute":t=this._d.valueOf(),t-=_s(t,ws);break;case"second":t=this._d.valueOf(),t-=_s(t,Xu);break}return this._d.setTime(t),B.updateOffset(this,!0),this}function mB(e){var t,r;if(e=zr(e),e===void 0||e==="millisecond"||!this.isValid())return this;switch(r=this._isUTC?gk:pk,e){case"year":t=r(this.year()+1,0,1)-1;break;case"quarter":t=r(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":t=r(this.year(),this.month()+1,1)-1;break;case"week":t=r(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":t=r(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":t=r(this.year(),this.month(),this.date()+1)-1;break;case"hour":t=this._d.valueOf(),t+=Qu-_s(t+(this._isUTC?0:this.utcOffset()*ws),Qu)-1;break;case"minute":t=this._d.valueOf(),t+=ws-_s(t,ws)-1;break;case"second":t=this._d.valueOf(),t+=Xu-_s(t,Xu)-1;break}return this._d.setTime(t),B.updateOffset(this,!0),this}function pB(){return this._d.valueOf()-(this._offset||0)*6e4}function gB(){return Math.floor(this.valueOf()/1e3)}function vB(){return new Date(this.valueOf())}function yB(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]}function wB(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}}function _B(){return this.isValid()?this.toISOString():null}function xB(){return Ug(this)}function SB(){return Di({},pe(this))}function bB(){return pe(this).overflow}function kB(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}se("N",0,0,"eraAbbr");se("NN",0,0,"eraAbbr");se("NNN",0,0,"eraAbbr");se("NNNN",0,0,"eraName");se("NNNNN",0,0,"eraNarrow");se("y",["y",1],"yo","eraYear");se("y",["yy",2],0,"eraYear");se("y",["yyy",3],0,"eraYear");se("y",["yyyy",4],0,"eraYear");q("N",ov);q("NN",ov);q("NNN",ov);q("NNNN",MB);q("NNNNN",IB);Ve(["N","NN","NNN","NNNN","NNNNN"],function(e,t,r,n){var i=r._locale.erasParse(e,n,r._strict);i?pe(r).era=i:pe(r).invalidEra=e});q("y",Ks);q("yy",Ks);q("yyy",Ks);q("yyyy",Ks);q("yo",NB);Ve(["y","yy","yyy","yyyy"],$t);Ve(["yo"],function(e,t,r,n){var i;r._locale._eraYearOrdinalRegex&&(i=e.match(r._locale._eraYearOrdinalRegex)),r._locale.eraYearOrdinalParse?t[$t]=r._locale.eraYearOrdinalParse(e,i):t[$t]=parseInt(e,10)});function CB(e,t){var r,n,i,o=this._eras||ai("en")._eras;for(r=0,n=o.length;r=0)return o[n]}function EB(e,t){var r=e.since<=e.until?1:-1;return t===void 0?B(e.since).year():B(e.since).year()+(t-e.offset)*r}function jB(){var e,t,r,n=this.localeData().eras();for(e=0,t=n.length;eo&&(t=o),$B.call(this,e,t,r,n,i))}function $B(e,t,r,n,i){var o=Qb(e,t,r,n,i),a=yl(o.year,0,o.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}se("Q",0,"Qo","quarter");Wt("quarter","Q");Gt("quarter",7);q("Q",Vb);Ve("Q",function(e,t){t[Gn]=(we(e)-1)*3});function BB(e){return e==null?Math.ceil((this.month()+1)/3):this.month((e-1)*3+this.month()%3)}se("D",["DD",2],"Do","date");Wt("date","D");Gt("date",9);q("D",Xe);q("DD",Xe,Cr);q("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient});Ve(["D","DD"],pn);Ve("Do",function(e,t){t[pn]=we(e.match(Xe)[0])});var yk=Gs("Date",!0);se("DDD",["DDDD",3],"DDDo","dayOfYear");Wt("dayOfYear","DDD");Gt("dayOfYear",4);q("DDD",cf);q("DDDD",Hb);Ve(["DDD","DDDD"],function(e,t,r){r._dayOfYear=we(e)});function WB(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return e==null?t:this.add(e-t,"d")}se("m",["mm",2],0,"minute");Wt("minute","m");Gt("minute",14);q("m",Xe);q("mm",Xe,Cr);Ve(["m","mm"],Xr);var GB=Gs("Minutes",!1);se("s",["ss",2],0,"second");Wt("second","s");Gt("second",15);q("s",Xe);q("ss",Xe,Cr);Ve(["s","ss"],Kn);var KB=Gs("Seconds",!1);se("S",0,0,function(){return~~(this.millisecond()/100)});se(0,["SS",2],0,function(){return~~(this.millisecond()/10)});se(0,["SSS",3],0,"millisecond");se(0,["SSSS",4],0,function(){return this.millisecond()*10});se(0,["SSSSS",5],0,function(){return this.millisecond()*100});se(0,["SSSSSS",6],0,function(){return this.millisecond()*1e3});se(0,["SSSSSSS",7],0,function(){return this.millisecond()*1e4});se(0,["SSSSSSSS",8],0,function(){return this.millisecond()*1e5});se(0,["SSSSSSSSS",9],0,function(){return this.millisecond()*1e6});Wt("millisecond","ms");Gt("millisecond",16);q("S",cf,Vb);q("SS",cf,Cr);q("SSS",cf,Hb);var Ei,wk;for(Ei="SSSS";Ei.length<=9;Ei+="S")q(Ei,Ks);function XB(e,t){t[lo]=we(("0."+e)*1e3)}for(Ei="S";Ei.length<=9;Ei+="S")Ve(Ei,XB);wk=Gs("Milliseconds",!1);se("z",0,0,"zoneAbbr");se("zz",0,0,"zoneName");function QB(){return this._isUTC?"UTC":""}function qB(){return this._isUTC?"Coordinated Universal Time":""}var U=Ml.prototype;U.add=U$;U.calendar=Q$;U.clone=q$;U.diff=iB;U.endOf=mB;U.format=lB;U.from=cB;U.fromNow=uB;U.to=dB;U.toNow=fB;U.get=JF;U.invalidAt=bB;U.isAfter=Z$;U.isBefore=J$;U.isBetween=eB;U.isSame=tB;U.isSameOrAfter=rB;U.isSameOrBefore=nB;U.isValid=xB;U.lang=fk;U.locale=dk;U.localeData=hk;U.max=x$;U.min=_$;U.parsingFlags=SB;U.set=eU;U.startOf=hB;U.subtract=$$;U.toArray=yB;U.toObject=wB;U.toDate=vB;U.toISOString=sB;U.inspect=aB;typeof Symbol<"u"&&Symbol.for!=null&&(U[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"});U.toJSON=_B;U.toString=oB;U.unix=gB;U.valueOf=pB;U.creationData=kB;U.eraName=jB;U.eraNarrow=AB;U.eraAbbr=TB;U.eraYear=RB;U.year=Xb;U.isLeapYear=wU;U.weekYear=zB;U.isoWeekYear=YB;U.quarter=U.quarters=BB;U.month=Gb;U.daysInMonth=gU;U.week=U.weeks=CU;U.isoWeek=U.isoWeeks=DU;U.weeksInYear=FB;U.weeksInWeekYear=UB;U.isoWeeksInYear=VB;U.isoWeeksInISOWeekYear=HB;U.date=yk;U.day=U.days=YU;U.weekday=VU;U.isoWeekday=HU;U.dayOfYear=WB;U.hour=U.hours=KU;U.minute=U.minutes=GB;U.second=U.seconds=KB;U.millisecond=U.milliseconds=wk;U.utcOffset=T$;U.utc=O$;U.local=P$;U.parseZone=L$;U.hasAlignedHourOffset=M$;U.isDST=I$;U.isLocal=z$;U.isUtcOffset=Y$;U.isUtc=ak;U.isUTC=ak;U.zoneAbbr=QB;U.zoneName=qB;U.dates=Nr("dates accessor is deprecated. Use date instead.",yk);U.months=Nr("months accessor is deprecated. Use month instead",Gb);U.years=Nr("years accessor is deprecated. Use year instead",Xb);U.zone=Nr("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",R$);U.isDSTShifted=Nr("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",N$);function ZB(e){return Ke(e*1e3)}function JB(){return Ke.apply(null,arguments).parseZone()}function _k(e){return e}var Re=Bg.prototype;Re.calendar=YF;Re.longDateFormat=UF;Re.invalidDate=BF;Re.ordinal=KF;Re.preparse=_k;Re.postformat=_k;Re.relativeTime=QF;Re.pastFuture=qF;Re.set=NF;Re.eras=CB;Re.erasParse=DB;Re.erasConvertYear=EB;Re.erasAbbrRegex=PB;Re.erasNameRegex=OB;Re.erasNarrowRegex=LB;Re.months=fU;Re.monthsShort=hU;Re.monthsParse=pU;Re.monthsRegex=yU;Re.monthsShortRegex=vU;Re.week=xU;Re.firstDayOfYear=kU;Re.firstDayOfWeek=bU;Re.weekdays=LU;Re.weekdaysMin=IU;Re.weekdaysShort=MU;Re.weekdaysParse=zU;Re.weekdaysRegex=FU;Re.weekdaysShortRegex=UU;Re.weekdaysMinRegex=$U;Re.isPM=WU;Re.meridiem=XU;function qu(e,t,r,n){var i=ai(),o=kn().set(n,t);return i[r](o,e)}function xk(e,t,r){if(ri(e)&&(t=e,e=void 0),e=e||"",t!=null)return qu(e,t,r,"month");var n,i=[];for(n=0;n<12;n++)i[n]=qu(e,n,r,"month");return i}function av(e,t,r,n){typeof e=="boolean"?(ri(t)&&(r=t,t=void 0),t=t||""):(t=e,r=t,e=!1,ri(t)&&(r=t,t=void 0),t=t||"");var i=ai(),o=e?i._week.dow:0,a,c=[];if(r!=null)return qu(t,(r+o)%7,n,"day");for(a=0;a<7;a++)c[a]=qu(t,(a+o)%7,n,"day");return c}function e9(e,t){return xk(e,t,"months")}function t9(e,t){return xk(e,t,"monthsShort")}function r9(e,t,r){return av(e,t,r,"weekdays")}function n9(e,t,r){return av(e,t,r,"weekdaysShort")}function i9(e,t,r){return av(e,t,r,"weekdaysMin")}Yi("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10,r=we(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+r}});B.lang=Nr("moment.lang is deprecated. Use moment.locale instead.",Yi);B.langData=Nr("moment.langData is deprecated. Use moment.localeData instead.",ai);var zn=Math.abs;function o9(){var e=this._data;return this._milliseconds=zn(this._milliseconds),this._days=zn(this._days),this._months=zn(this._months),e.milliseconds=zn(e.milliseconds),e.seconds=zn(e.seconds),e.minutes=zn(e.minutes),e.hours=zn(e.hours),e.months=zn(e.months),e.years=zn(e.years),this}function Sk(e,t,r,n){var i=rn(t,r);return e._milliseconds+=n*i._milliseconds,e._days+=n*i._days,e._months+=n*i._months,e._bubble()}function s9(e,t){return Sk(this,e,t,1)}function a9(e,t){return Sk(this,e,t,-1)}function $w(e){return e<0?Math.floor(e):Math.ceil(e)}function l9(){var e=this._milliseconds,t=this._days,r=this._months,n=this._data,i,o,a,c,d;return e>=0&&t>=0&&r>=0||e<=0&&t<=0&&r<=0||(e+=$w(Zp(r)+t)*864e5,t=0,r=0),n.milliseconds=e%1e3,i=Ar(e/1e3),n.seconds=i%60,o=Ar(i/60),n.minutes=o%60,a=Ar(o/60),n.hours=a%24,t+=Ar(a/24),d=Ar(bk(t)),r+=d,t-=$w(Zp(d)),c=Ar(r/12),r%=12,n.days=t,n.months=r,n.years=c,this}function bk(e){return e*4800/146097}function Zp(e){return e*146097/4800}function c9(e){if(!this.isValid())return NaN;var t,r,n=this._milliseconds;if(e=zr(e),e==="month"||e==="quarter"||e==="year")switch(t=this._days+n/864e5,r=this._months+bk(t),e){case"month":return r;case"quarter":return r/3;case"year":return r/12}else switch(t=this._days+Math.round(Zp(this._months)),e){case"week":return t/7+n/6048e5;case"day":return t+n/864e5;case"hour":return t*24+n/36e5;case"minute":return t*1440+n/6e4;case"second":return t*86400+n/1e3;case"millisecond":return Math.floor(t*864e5)+n;default:throw new Error("Unknown unit "+e)}}function u9(){return this.isValid()?this._milliseconds+this._days*864e5+this._months%12*2592e6+we(this._months/12)*31536e6:NaN}function li(e){return function(){return this.as(e)}}var d9=li("ms"),f9=li("s"),h9=li("m"),m9=li("h"),p9=li("d"),g9=li("w"),v9=li("M"),y9=li("Q"),w9=li("y");function _9(){return rn(this)}function x9(e){return e=zr(e),this.isValid()?this[e+"s"]():NaN}function jo(e){return function(){return this.isValid()?this._data[e]:NaN}}var S9=jo("milliseconds"),b9=jo("seconds"),k9=jo("minutes"),C9=jo("hours"),D9=jo("days"),E9=jo("months"),j9=jo("years");function A9(){return Ar(this.days()/7)}var Fn=Math.round,cs={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function T9(e,t,r,n,i){return i.relativeTime(t||1,!!r,e,n)}function R9(e,t,r,n){var i=rn(e).abs(),o=Fn(i.as("s")),a=Fn(i.as("m")),c=Fn(i.as("h")),d=Fn(i.as("d")),h=Fn(i.as("M")),g=Fn(i.as("w")),v=Fn(i.as("y")),x=o<=r.ss&&["s",o]||o0,x[4]=n,T9.apply(null,x)}function O9(e){return e===void 0?Fn:typeof e=="function"?(Fn=e,!0):!1}function P9(e,t){return cs[e]===void 0?!1:t===void 0?cs[e]:(cs[e]=t,e==="s"&&(cs.ss=t-1),!0)}function L9(e,t){if(!this.isValid())return this.localeData().invalidDate();var r=!1,n=cs,i,o;return typeof e=="object"&&(t=e,e=!1),typeof e=="boolean"&&(r=e),typeof t=="object"&&(n=Object.assign({},cs,t),t.s!=null&&t.ss==null&&(n.ss=t.s-1)),i=this.localeData(),o=R9(this,!r,n,i),r&&(o=i.pastFuture(+this,o)),i.postformat(o)}var Wh=Math.abs;function zo(e){return(e>0)-(e<0)||+e}function vf(){if(!this.isValid())return this.localeData().invalidDate();var e=Wh(this._milliseconds)/1e3,t=Wh(this._days),r=Wh(this._months),n,i,o,a,c=this.asSeconds(),d,h,g,v;return c?(n=Ar(e/60),i=Ar(n/60),e%=60,n%=60,o=Ar(r/12),r%=12,a=e?e.toFixed(3).replace(/\.?0+$/,""):"",d=c<0?"-":"",h=zo(this._months)!==zo(c)?"-":"",g=zo(this._days)!==zo(c)?"-":"",v=zo(this._milliseconds)!==zo(c)?"-":"",d+"P"+(o?h+o+"Y":"")+(r?h+r+"M":"")+(t?g+t+"D":"")+(i||n||e?"T":"")+(i?v+i+"H":"")+(n?v+n+"M":"")+(e?v+a+"S":"")):"P0D"}var De=pf.prototype;De.isValid=D$;De.abs=o9;De.add=s9;De.subtract=a9;De.as=c9;De.asMilliseconds=d9;De.asSeconds=f9;De.asMinutes=h9;De.asHours=m9;De.asDays=p9;De.asWeeks=g9;De.asMonths=v9;De.asQuarters=y9;De.asYears=w9;De.valueOf=u9;De._bubble=l9;De.clone=_9;De.get=x9;De.milliseconds=S9;De.seconds=b9;De.minutes=k9;De.hours=C9;De.days=D9;De.weeks=A9;De.months=E9;De.years=j9;De.humanize=L9;De.toISOString=vf;De.toString=vf;De.toJSON=vf;De.locale=dk;De.localeData=hk;De.toIsoString=Nr("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",vf);De.lang=fk;se("X",0,0,"unix");se("x",0,0,"valueOf");q("x",df);q("X",rU);Ve("X",function(e,t,r){r._d=new Date(parseFloat(e)*1e3)});Ve("x",function(e,t,r){r._d=new Date(we(e))});//! moment.js -B.version="2.29.4";MF(Ke);B.fn=U;B.min=S$;B.max=b$;B.now=k$;B.utc=kn;B.unix=ZB;B.months=e9;B.isDate=Ll;B.locale=Yi;B.invalid=sf;B.duration=rn;B.isMoment=tn;B.weekdays=r9;B.parseZone=JB;B.localeData=ai;B.isDuration=nu;B.monthsShort=t9;B.weekdaysMin=i9;B.defineLocale=Jg;B.updateLocale=JU;B.locales=e$;B.weekdaysShort=n9;B.normalizeUnits=zr;B.relativeTimeRounding=O9;B.relativeTimeThreshold=P9;B.calendarFormat=X$;B.prototype=U;B.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"};const M9="/zh-cn/assets/blog-cover-95d8a382.png",I9=new Map([["blogs","技术博客"],["events","活动预告"],["highlights","精彩回顾"],["news-honor-dynamic","新闻 / 荣誉"]]),N9=f.main` - background: #fff; -`,z9=f.div` - max-width: 1440px; - margin-inline: auto; - padding: 0.96rem 1.65rem 1.56rem; -`,Y9=f.div` - display: flex; - flex-direction: row-reverse; - justify-content: space-between; - align-items: center; - margin-bottom: 0.27rem; - padding-bottom: 0.27rem; - padding-inline: calc(1.79rem - 1.65rem); - border-bottom: 0.01rem solid #9a9a9a; - &:last-child { - margin-bottom: 0; - } -`,V9=f.img` - padding-left: 0.47rem; - width: 4.35rem; - height: min-content; - border-radius: 0.08rem; -`,H9=f.div` - width: 56%; - flex: 1; - padding-top: calc(1.22rem - 0.96rem); - padding-bottom: calc(0.53rem - 0.27rem); -`,F9=f.div` - padding-bottom: 0.05rem; - font-size: 0.15rem; - line-height: 0.3rem; - font-weight: 500; - color: #1c5cff; -`,U9=f.div` - padding-bottom: 0.26rem; - font-size: 0.27rem; - line-height: 0.33rem; - font-weight: 600; - color: #1e1e1e; - cursor: pointer; - &:hover { - color: #531dab; - } -`,$9=f.div` - padding-bottom: 0.13rem; - font-size: 0.135rem; - line-height: 0.24rem; - font-weight: 400; - color: #7d7d7d; -`,B9=f.div` - display: flex; - align-items: center; - font-size: 0.12rem; - line-height: 0.18rem; - font-weight: 500; - font-weight: 500; -`,Gh=f.div` - color: #797979; -`,Kh=f.div` - margin-inline: 0.12rem; - width: 0.08rem; - height: 0.08rem; - background: #797979; - border-radius: 50%; -`,W9=f.div` - padding-inline: 0.08rem; - color: #2f54eb; - border: 0.01rem solid #2f54eb; - background: #d6e4ff; - border-radius: 0.04rem; - text-transform: capitalize; -`,G9=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>S(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>S(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>S(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>S(()=>import("./index-fe9ae8f0.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>S(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>S(()=>import("./index-9d5e23a7.js"),[]),"/src/articles/blogs/2022-05-27-Rust-implementation-of-RDMA-asynchronous-programming-(I):-epoll-based-implementation-of-RDMA-asynchronous-operation/index.md":()=>S(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>S(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>S(()=>import("./index-7df91a5f.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>S(()=>import("./index-29c0b7ce.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>S(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>S(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>S(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>S(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>S(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>S(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>S(()=>import("./index-1bdc26aa.js"),[]),"/src/articles/blogs/2022-06-30-Ten-thousand-words-long-article,-detailing-the-hardware-acceleration-and-implementation-of-TRIDENT:-Poseidon-hash-algorithm!/index.md":()=>S(()=>import("./index-c1edd0b5.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>S(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>S(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>S(()=>import("./index-38e8d7df.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>S(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>S(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>S(()=>import("./index-30613c55.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>S(()=>import("./index-484500d8.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>S(()=>import("./index-1ea2a101.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-9cbd4195.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>S(()=>import("./index-0cf6ee95.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>S(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>S(()=>import("./index-500d1a02.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>S(()=>import("./index-5fe92975.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>S(()=>import("./index-86e42443.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>S(()=>import("./index-7a966399.js"),[]),"/src/articles/blogs/2023-06-21-The-first-cross-cloud-metadata-KV-storage-Xline-officially-entered-the-CNCF-sandbox/index.md":()=>S(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-93097ad1.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>S(()=>import("./index-d9f0be8c.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>S(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>S(()=>import("./index-90e44649.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>S(()=>import("./index-bccae718.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>S(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>S(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>S(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>S(()=>import("./index-a294a248.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>S(()=>import("./index-9edebc8f.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>S(()=>import("./index-69f9dfbf.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-b73b42f4.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>S(()=>import("./index-1b00c887.js"),[]),"/src/articles/blogs/2024-01-11-Open-source-Bluespec-bsc-compiler-and-reusable-example-designs/index.md":()=>S(()=>import("./index-1407e949.js"),[]),"/src/articles/blogs/2024-01-18-Xline-v0.6.1:-a-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-9a698271.js"),[]),"/src/articles/blogs/2024-01-25-Agile-Digital-Chip-Design-and-Verification-with-SpinalHDL-and-Cocotb/index.md":()=>S(()=>import("./index-8e06495a.js"),[]),"/src/articles/blogs/2024-02-01-Xline-Jepsen-test-analysis/index.md":()=>S(()=>import("./index-c0527a8b.js"),[]),"/src/articles/blogs/2024-03-07-Membership-Change-Source-Code-Interpretation/index.md":()=>S(()=>import("./index-836388b4.js"),[]),"/src/articles/blogs/2024-03-21-Early-Explorations-and-Practices-of-Xline-a-Stateful-Application-Managed-by-Karmada/index.md":()=>S(()=>import("./index-8cb7e806.js"),[]),"/src/articles/blogs/2024-03-28-A-short-summary-of-the-implementation-of-interval-trees-in-Xline copy/index.md":()=>S(()=>import("./index-81d1e484.js"),[]),"/src/articles/blogs/2024-04-11-RDMA-Driver-Exploration-Series-for-Linux-1/index.md":()=>S(()=>import("./index-f7c1c3db.js"),[]),"/src/articles/blogs/2024-04-18-A-short-summary-of-the-implementation-of-interval-trees-in-Xline/index.md":()=>S(()=>import("./index-9e270336.js"),[]),"/src/articles/blogs/2024-04-25-Common-Design-Patterns-and-Their-Rust-Implementations/index.md":()=>S(()=>import("./index-5130399c.js"),[]),"/src/articles/blogs/2024-05-16-Xline-0.7-Refactoring-Performance-Analysis-Overview/index.md":()=>S(()=>import("./index-3deb6102.js"),[]),"/src/articles/blogs/2024-05-30-Full-Scale-File-System-Acceleration-on-GPUs/index.md":()=>S(()=>import("./index-900d632b.js"),[])}),Bw=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>S(()=>import("./index-12e593c9.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>S(()=>import("./index-102c2147.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>S(()=>import("./index-674b00c3.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>S(()=>import("./index-a179aa93.js"),[]),"/src/articles/events/2022-11-11-Datan-Technology-invites-you-who-love-challenges-to-participate-in-Rust-China-Hackathon-2022/index.md":()=>S(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>S(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>S(()=>import("./index-28613687.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>S(()=>import("./index-4b956329.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>S(()=>import("./index-26ca6215.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>S(()=>import("./index-3480f851.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>S(()=>import("./index-8bcfd31b.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>S(()=>import("./index-a1a1a279.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>S(()=>import("./index-d2a8186a.js"),[]),"/src/articles/events/2023-05-04-Meet-this-summer|Datan-Technology-invites-you-to-participate-in-the-2023-Open-Source-Summer/index.md":()=>S(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>S(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>S(()=>import("./index-63a73b24.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>S(()=>import("./index-16f06676.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>S(()=>import("./index-c86a9a07.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>S(()=>import("./index-6a3ed4c3.js"),[]),"/src/articles/events/2023-09-07-The-2nd-Hardware-Agile-Development-and-Methodology-Workshop-l-2023-RISC-V-China-Summit-Concurrent-Events-Successfully-Held/index.md":()=>S(()=>import("./index-a154d453.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>S(()=>import("./index-b5cbc6b1.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>S(()=>import("./index-dfd283a0.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>S(()=>import("./index-6bc730f7.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>S(()=>import("./index-ef7b41da.js"),[]),"/src/articles/events/2023-12-05-Ding!-2023-hackathon-tips-fresh-from-the-oven!-Last-week-to-sign-up-before-it's-too-late!/index.md":()=>S(()=>import("./index-75e09dc1.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>S(()=>import("./index-3fb2c654.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>S(()=>import("./index-cc4e4968.js"),[]),"/src/articles/events/2024-02-22-Recruitment-can't-stop-Dartan-Technology-2024-internship-positions-waiting-for-you/index.md":()=>S(()=>import("./index-db271263.js"),[]),"/src/articles/events/2024-02-29-A-Challenge-Letter-from-DatenLord-on-GSoC-2024/index.md":()=>S(()=>import("./index-d4dfb508.js"),[]),"/src/articles/events/2024-04-04-Come-and-get-your-own-mind-blowing-offer-from-Dartan-Technologies/index.md":()=>S(()=>import("./index-14d00f8c.js"),[]),"/src/articles/events/2024-05-09-DartanLord-@-you-and-invited-you-to-the-2024-Summer-of-Open-Source!/index.md":()=>S(()=>import("./index-68779906.js"),[]),"/src/articles/events/2024-05-23-Xline-Community-Meeting-Call-Up-Securing-Joint-Consensus-in-CURP-Algorithm/index.md":()=>S(()=>import("./index-11e00e16.js"),[])}),K9=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels:-RDMA's-Rust-safety-practices/index.md":()=>S(()=>import("./index-37f93c7b.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord:-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>S(()=>import("./index-8f0491cb.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>S(()=>import("./index-405a2dbf.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>S(()=>import("./index-eb1ecfd7.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>S(()=>import("./index-9d58af8c.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>S(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>S(()=>import("./index-4ada4a0c.js"),[]),"/src/articles/highlights/2023-12-21-Highlights:-2023-SpinalHDL-Application-Prospect-Exploration-Workshop/index.md":()=>S(()=>import("./index-67a528fa.js"),[])}),X9=Object.assign({"/src/articles/news-honor-dynamic/2022-08-04-Dartan-Technology-Invited-to-Do-Hardware-Acceleration-Research-Sharing-at-2022-China-Computer-Society-Chip-Conference/index.md":()=>S(()=>import("./index-ee7da202.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>S(()=>import("./index-012df9e2.js"),[])}),Q9=()=>{const e=ht(),t=si(),{title:r}=Sn();I.useEffect(()=>{window.scrollTo(0,0)},[]);const i=(()=>{switch(r){case"blogs":return G9;case"events":return Bw;case"highlights":return K9;case"news-honor-dynamic":return X9;default:return Bw}})(),[o,a]=I.useState([]),c=async()=>{a(await Promise.all(Object.keys(i).map(d=>i[d]())))};return I.useEffect(()=>{c()},[t.pathname]),l.jsxs(l.Fragment,{children:[l.jsx(Ir,{cover:M9,children:r&&I9.get(r)}),l.jsx(N9,{children:l.jsx(z9,{children:o.reverse().map(({metadata:d,assetURLs:h})=>{const{date:g,title:v,label:x,description:k,author:C,editor:D,location:E,cover:y,tags:w}=d;return l.jsxs(Y9,{children:[y&&l.jsx(V9,{src:y&&h[0]}),l.jsxs(H9,{children:[l.jsx(F9,{children:B(g).format("YYYY.M.D")}),l.jsx(U9,{onClick:()=>{e(`${g}-${v.split(" ").join("-")}`)},children:x}),l.jsx($9,{children:k}),l.jsxs(B9,{children:[C&&l.jsxs(l.Fragment,{children:[l.jsxs(Gh,{children:["嘉宾:",C[0]]}),l.jsx(Kh,{})]}),D&&l.jsxs(l.Fragment,{children:[l.jsxs(Gh,{children:["编辑:",D[0]]}),l.jsx(Kh,{})]}),l.jsxs(Gh,{children:["发表于",E]}),w&&l.jsxs(l.Fragment,{children:[l.jsx(Kh,{}),w.map(b=>l.jsx(W9,{children:b},b))]})]})]})]},v)})})})]})},q9=(e,t)=>{const r=I.useRef({});I.useEffect(()=>{const n=c=>{r.current=c.reduce((g,v)=>(g[v.target.innerHTML]=v,g),r.current);const d=[];Object.keys(r.current).forEach(g=>{const v=r.current[g];v.isIntersecting&&d.push(v)});const h=g=>a.findIndex(v=>v.id===g);if(d.length===1)e(d[0].target.id);else if(d.length>1){const g=d.sort((v,x)=>h(v.target.id)-h(x.target.id));e(g[0].target.id)}},i={rootMargin:"0px 0px -40% 0px"},o=new IntersectionObserver(n,i),a=Array.from(document.querySelectorAll("h2, h3"));return a.forEach(c=>o.observe(c)),()=>o.disconnect()},[t])},Z9=f.div``,J9=f.div` - display: flex; - max-width: 1440px; - margin-inline: auto; - padding-block: 0.64rem; - padding-inline: 1.22rem; - padding-top: 1.2rem; -`,eW=f.div` - flex-grow: 1; - padding-inline: 0.64rem; -`,tW=f.h1` - margin-bottom: 0.96rem; - color: #1e1e1e; - font-size: 0.4rem; - line-height: 0.48rem; - font-weight: 600; -`,rW=f.div` - background: #fff; - border-radius: 0.08rem; -`,nW=f.div` - flex-shrink: 0; - width: 300px; -`,iW=f.div` - position: sticky; - top: 1.2rem; - left: 0; - padding: 0.32rem; - background: #ffffff; - border-radius: 0.08rem; - max-height: 60vh; - overflow-y: scroll; -`,oW=f.div` - display: block; - margin-block: 0.16rem; - padding-left: ${({level:e})=>e===3?"48px":"16px"}; - color: ${({isActive:e})=>e?"#722ed1":"inherit"}; - border-left: ${({isActive:e})=>e?"8px solid #722ed1":"8px solid transparent"}; - font-weight: 700; - font-size: 0.18rem; - line-height: 1.5; - cursor: pointer; -`,sW=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>S(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>S(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>S(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>S(()=>import("./index-fe9ae8f0.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>S(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>S(()=>import("./index-9d5e23a7.js"),[]),"/src/articles/blogs/2022-05-27-Rust-implementation-of-RDMA-asynchronous-programming-(I):-epoll-based-implementation-of-RDMA-asynchronous-operation/index.md":()=>S(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>S(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>S(()=>import("./index-7df91a5f.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>S(()=>import("./index-29c0b7ce.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>S(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>S(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>S(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>S(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>S(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>S(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>S(()=>import("./index-1bdc26aa.js"),[]),"/src/articles/blogs/2022-06-30-Ten-thousand-words-long-article,-detailing-the-hardware-acceleration-and-implementation-of-TRIDENT:-Poseidon-hash-algorithm!/index.md":()=>S(()=>import("./index-c1edd0b5.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>S(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>S(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>S(()=>import("./index-38e8d7df.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>S(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>S(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>S(()=>import("./index-30613c55.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>S(()=>import("./index-484500d8.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>S(()=>import("./index-1ea2a101.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-9cbd4195.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>S(()=>import("./index-0cf6ee95.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>S(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>S(()=>import("./index-500d1a02.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>S(()=>import("./index-5fe92975.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>S(()=>import("./index-86e42443.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>S(()=>import("./index-7a966399.js"),[]),"/src/articles/blogs/2023-06-21-The-first-cross-cloud-metadata-KV-storage-Xline-officially-entered-the-CNCF-sandbox/index.md":()=>S(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-93097ad1.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>S(()=>import("./index-d9f0be8c.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>S(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>S(()=>import("./index-90e44649.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>S(()=>import("./index-bccae718.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>S(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>S(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>S(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>S(()=>import("./index-a294a248.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>S(()=>import("./index-9edebc8f.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>S(()=>import("./index-69f9dfbf.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-b73b42f4.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>S(()=>import("./index-1b00c887.js"),[]),"/src/articles/blogs/2024-01-11-Open-source-Bluespec-bsc-compiler-and-reusable-example-designs/index.md":()=>S(()=>import("./index-1407e949.js"),[]),"/src/articles/blogs/2024-01-18-Xline-v0.6.1:-a-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-9a698271.js"),[]),"/src/articles/blogs/2024-01-25-Agile-Digital-Chip-Design-and-Verification-with-SpinalHDL-and-Cocotb/index.md":()=>S(()=>import("./index-8e06495a.js"),[]),"/src/articles/blogs/2024-02-01-Xline-Jepsen-test-analysis/index.md":()=>S(()=>import("./index-c0527a8b.js"),[]),"/src/articles/blogs/2024-03-07-Membership-Change-Source-Code-Interpretation/index.md":()=>S(()=>import("./index-836388b4.js"),[]),"/src/articles/blogs/2024-03-21-Early-Explorations-and-Practices-of-Xline-a-Stateful-Application-Managed-by-Karmada/index.md":()=>S(()=>import("./index-8cb7e806.js"),[]),"/src/articles/blogs/2024-03-28-A-short-summary-of-the-implementation-of-interval-trees-in-Xline copy/index.md":()=>S(()=>import("./index-81d1e484.js"),[]),"/src/articles/blogs/2024-04-11-RDMA-Driver-Exploration-Series-for-Linux-1/index.md":()=>S(()=>import("./index-f7c1c3db.js"),[]),"/src/articles/blogs/2024-04-18-A-short-summary-of-the-implementation-of-interval-trees-in-Xline/index.md":()=>S(()=>import("./index-9e270336.js"),[]),"/src/articles/blogs/2024-04-25-Common-Design-Patterns-and-Their-Rust-Implementations/index.md":()=>S(()=>import("./index-5130399c.js"),[]),"/src/articles/blogs/2024-05-16-Xline-0.7-Refactoring-Performance-Analysis-Overview/index.md":()=>S(()=>import("./index-3deb6102.js"),[]),"/src/articles/blogs/2024-05-30-Full-Scale-File-System-Acceleration-on-GPUs/index.md":()=>S(()=>import("./index-900d632b.js"),[])}),aW=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>S(()=>import("./index-12e593c9.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>S(()=>import("./index-102c2147.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>S(()=>import("./index-674b00c3.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>S(()=>import("./index-a179aa93.js"),[]),"/src/articles/events/2022-11-11-Datan-Technology-invites-you-who-love-challenges-to-participate-in-Rust-China-Hackathon-2022/index.md":()=>S(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>S(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>S(()=>import("./index-28613687.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>S(()=>import("./index-4b956329.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>S(()=>import("./index-26ca6215.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>S(()=>import("./index-3480f851.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>S(()=>import("./index-8bcfd31b.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>S(()=>import("./index-a1a1a279.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>S(()=>import("./index-d2a8186a.js"),[]),"/src/articles/events/2023-05-04-Meet-this-summer|Datan-Technology-invites-you-to-participate-in-the-2023-Open-Source-Summer/index.md":()=>S(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>S(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>S(()=>import("./index-63a73b24.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>S(()=>import("./index-16f06676.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>S(()=>import("./index-c86a9a07.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>S(()=>import("./index-6a3ed4c3.js"),[]),"/src/articles/events/2023-09-07-The-2nd-Hardware-Agile-Development-and-Methodology-Workshop-l-2023-RISC-V-China-Summit-Concurrent-Events-Successfully-Held/index.md":()=>S(()=>import("./index-a154d453.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>S(()=>import("./index-b5cbc6b1.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>S(()=>import("./index-dfd283a0.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>S(()=>import("./index-6bc730f7.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>S(()=>import("./index-ef7b41da.js"),[]),"/src/articles/events/2023-12-05-Ding!-2023-hackathon-tips-fresh-from-the-oven!-Last-week-to-sign-up-before-it's-too-late!/index.md":()=>S(()=>import("./index-75e09dc1.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>S(()=>import("./index-3fb2c654.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>S(()=>import("./index-cc4e4968.js"),[]),"/src/articles/events/2024-02-22-Recruitment-can't-stop-Dartan-Technology-2024-internship-positions-waiting-for-you/index.md":()=>S(()=>import("./index-db271263.js"),[]),"/src/articles/events/2024-02-29-A-Challenge-Letter-from-DatenLord-on-GSoC-2024/index.md":()=>S(()=>import("./index-d4dfb508.js"),[]),"/src/articles/events/2024-04-04-Come-and-get-your-own-mind-blowing-offer-from-Dartan-Technologies/index.md":()=>S(()=>import("./index-14d00f8c.js"),[]),"/src/articles/events/2024-05-09-DartanLord-@-you-and-invited-you-to-the-2024-Summer-of-Open-Source!/index.md":()=>S(()=>import("./index-68779906.js"),[]),"/src/articles/events/2024-05-23-Xline-Community-Meeting-Call-Up-Securing-Joint-Consensus-in-CURP-Algorithm/index.md":()=>S(()=>import("./index-11e00e16.js"),[])}),lW=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels:-RDMA's-Rust-safety-practices/index.md":()=>S(()=>import("./index-37f93c7b.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord:-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>S(()=>import("./index-8f0491cb.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>S(()=>import("./index-405a2dbf.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>S(()=>import("./index-eb1ecfd7.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>S(()=>import("./index-9d58af8c.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>S(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>S(()=>import("./index-4ada4a0c.js"),[]),"/src/articles/highlights/2023-12-21-Highlights:-2023-SpinalHDL-Application-Prospect-Exploration-Workshop/index.md":()=>S(()=>import("./index-67a528fa.js"),[])}),cW=Object.assign({"/src/articles/news-honor-dynamic/2022-08-04-Dartan-Technology-Invited-to-Do-Hardware-Acceleration-Research-Sharing-at-2022-China-Computer-Society-Chip-Conference/index.md":()=>S(()=>import("./index-ee7da202.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>S(()=>import("./index-012df9e2.js"),[])}),uW=()=>{const{section:e,title:t}=Sn(),[r,n]=I.useState(),[i,o]=I.useState("");q9(o,r);const a=async()=>{console.log(`/src/articles/${e}/${t}/index.md`);const h=await(async()=>{switch(e){case"blogs":return await sW[`/src/articles/${e}/${t}/index.md`]();case"events":return await aW[`/src/articles/${e}/${t}/index.md`]();case"highlights":return await lW[`/src/articles/${e}/${t}/index.md`]();case"news-honor-dynamic":return await cW[`/src/articles/${e}/${t}/index.md`]()}})();n(h)};I.useEffect(()=>{console.log(r)},[]),I.useEffect(()=>{a(),window.scrollTo(0,0)},[]);const c=d=>{var h;(h=document.querySelector(`#${d}`))==null||h.scrollIntoView({})};return l.jsx(Z9,{children:l.jsxs(J9,{children:[(r==null?void 0:r.toc.length)!==0&&l.jsx(nW,{children:l.jsx(iW,{children:((r==null?void 0:r.toc)||[]).map(({label:d,level:h})=>{const g=d.split(" ").join("-").toLowerCase();return l.jsx(oW,{level:h,isActive:i===g,onClick:()=>c(g),children:d},d)})})}),l.jsxs(eW,{children:[l.jsx(tW,{children:r==null?void 0:r.metadata.label}),l.jsx(rW,{className:"content",dangerouslySetInnerHTML:{__html:(r==null?void 0:r.default)||""}})]})]})})};function kk(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var Zu={},dW={get exports(){return Zu},set exports(e){Zu=e}},Ww;function fW(){return Ww||(Ww=1,function(e,t){(function(r,n){e.exports=n()})(Go,function(){var r;function n(){return r.apply(null,arguments)}function i(s){r=s}function o(s){return s instanceof Array||Object.prototype.toString.call(s)==="[object Array]"}function a(s){return s!=null&&Object.prototype.toString.call(s)==="[object Object]"}function c(s,u){return Object.prototype.hasOwnProperty.call(s,u)}function d(s){if(Object.getOwnPropertyNames)return Object.getOwnPropertyNames(s).length===0;var u;for(u in s)if(c(s,u))return!1;return!0}function h(s){return s===void 0}function g(s){return typeof s=="number"||Object.prototype.toString.call(s)==="[object Number]"}function v(s){return s instanceof Date||Object.prototype.toString.call(s)==="[object Date]"}function x(s,u){var m=[],p,_=s.length;for(p=0;p<_;++p)m.push(u(s[p],p));return m}function k(s,u){for(var m in u)c(u,m)&&(s[m]=u[m]);return c(u,"toString")&&(s.toString=u.toString),c(u,"valueOf")&&(s.valueOf=u.valueOf),s}function C(s,u,m,p){return Tv(s,u,m,p,!0).utc()}function D(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidEra:null,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],era:null,meridiem:null,rfc2822:!1,weekdayMismatch:!1}}function E(s){return s._pf==null&&(s._pf=D()),s._pf}var y;Array.prototype.some?y=Array.prototype.some:y=function(s){var u=Object(this),m=u.length>>>0,p;for(p=0;p0)for(m=0;m=0;return(A?m?"+":"":"-")+Math.pow(10,Math.max(0,_)).toString().substr(1)+p}var ue=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,he=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,st={},Fe={};function K(s,u,m,p){var _=p;typeof p=="string"&&(_=function(){return this[p]()}),s&&(Fe[s]=_),u&&(Fe[u[0]]=function(){return Q(_.apply(this,arguments),u[1],u[2])}),m&&(Fe[m]=function(){return this.localeData().ordinal(_.apply(this,arguments),s)})}function zt(s){return s.match(/\[[\s\S]/)?s.replace(/^\[|\]$/g,""):s.replace(/\\/g,"")}function rr(s){var u=s.match(ue),m,p;for(m=0,p=u.length;m=0&&he.test(s);)s=s.replace(he,p),he.lastIndex=0,m-=1;return s}var mr={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function Ki(s){var u=this._longDateFormat[s],m=this._longDateFormat[s.toUpperCase()];return u||!m?u:(this._longDateFormat[s]=m.match(ue).map(function(p){return p==="MMMM"||p==="MM"||p==="DD"||p==="dddd"?p.slice(1):p}).join(""),this._longDateFormat[s])}var Dr="Invalid date";function pr(){return this._invalidDate}var qs="%d",Zs=/\d{1,2}/;function Js(s){return this._ordinal.replace("%d",s)}var ci={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function Hl(s,u,m,p){var _=this._relativeTime[m];return G(_)?_(s,u,m,p):_.replace(/%d/i,s)}function Fl(s,u){var m=this._relativeTime[s>0?"future":"past"];return G(m)?m(u):m.replace(/%s/i,u)}var ui={};function Dt(s,u){var m=s.toLowerCase();ui[m]=ui[m+"s"]=ui[u]=s}function Et(s){return typeof s=="string"?ui[s]||ui[s.toLowerCase()]:void 0}function di(s){var u={},m,p;for(p in s)c(s,p)&&(m=Et(p),m&&(u[m]=s[p]));return u}var ea={};function pt(s,u){ea[s]=u}function _f(s){var u=[],m;for(m in s)c(s,m)&&u.push({unit:m,priority:ea[m]});return u.sort(function(p,_){return p.priority-_.priority}),u}function To(s){return s%4===0&&s%100!==0||s%400===0}function Kt(s){return s<0?Math.ceil(s)||0:Math.floor(s)}function ge(s){var u=+s,m=0;return u!==0&&isFinite(u)&&(m=Kt(u)),m}function L(s,u){return function(m){return m!=null?(V(this,s,m),n.updateOffset(this,u),this):N(this,s)}}function N(s,u){return s.isValid()?s._d["get"+(s._isUTC?"UTC":"")+u]():NaN}function V(s,u,m){s.isValid()&&!isNaN(m)&&(u==="FullYear"&&To(s.year())&&s.month()===1&&s.date()===29?(m=ge(m),s._d["set"+(s._isUTC?"UTC":"")+u](m,s.month(),$l(m,s.month()))):s._d["set"+(s._isUTC?"UTC":"")+u](m))}function J(s){return s=Et(s),G(this[s])?this[s]():this}function re(s,u){if(typeof s=="object"){s=di(s);var m=_f(s),p,_=m.length;for(p=0;p<_;p++)this[m[p].unit](s[m[p].unit])}else if(s=Et(s),G(this[s]))return this[s](u);return this}var fe=/\d/,ie=/\d\d/,ce=/\d{3}/,ne=/\d{4}/,_e=/[+-]?\d{6}/,ae=/\d\d?/,_t=/\d\d\d\d?/,ct=/\d\d\d\d\d\d?/,tt=/\d{1,3}/,Yt=/\d{1,4}/,nn=/[+-]?\d{1,6}/,on=/\d+/,Dn=/[+-]?\d+/,sn=/Z|[+-]\d\d:?\d\d/gi,En=/Z|[+-]\d\d(?::?\d\d)?/gi,ta=/[+-]?\d+(\.\d{1,3})?/,jn=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,fi;fi={};function X(s,u,m){fi[s]=G(u)?u:function(p,_){return p&&m?m:u}}function Ue(s,u){return c(fi,s)?fi[s](u._strict,u._locale):new RegExp(nr(s))}function nr(s){return gt(s.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(u,m,p,_,A){return m||p||_||A}))}function gt(s){return s.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var Xi={};function me(s,u){var m,p=u,_;for(typeof s=="string"&&(s=[s]),g(u)&&(p=function(A,M){M[u]=ge(A)}),_=s.length,m=0;m<_;m++)Xi[s[m]]=p}function An(s,u){me(s,function(m,p,_,A){_._w=_._w||{},u(m,_._w,_,A)})}function Ul(s,u,m){u!=null&&c(Xi,s)&&Xi[s](u,m._a,m,s)}var jt=0,Tn=1,an=2,xt=3,Hr=4,Rn=5,Qi=6,Qk=7,qk=8;function Zk(s,u){return(s%u+u)%u}var ut;Array.prototype.indexOf?ut=Array.prototype.indexOf:ut=function(s){var u;for(u=0;u68?1900:2e3)};var _v=L("FullYear",!0);function cC(){return To(this.year())}function uC(s,u,m,p,_,A,M){var oe;return s<100&&s>=0?(oe=new Date(s+400,u,m,p,_,A,M),isFinite(oe.getFullYear())&&oe.setFullYear(s)):oe=new Date(s,u,m,p,_,A,M),oe}function na(s){var u,m;return s<100&&s>=0?(m=Array.prototype.slice.call(arguments),m[0]=s+400,u=new Date(Date.UTC.apply(null,m)),isFinite(u.getUTCFullYear())&&u.setUTCFullYear(s)):u=new Date(Date.UTC.apply(null,arguments)),u}function Bl(s,u,m){var p=7+u-m,_=(7+na(s,0,p).getUTCDay()-u)%7;return-_+p-1}function xv(s,u,m,p,_){var A=(7+m-p)%7,M=Bl(s,p,_),oe=1+7*(u-1)+A+M,ve,Ye;return oe<=0?(ve=s-1,Ye=ra(ve)+oe):oe>ra(s)?(ve=s+1,Ye=oe-ra(s)):(ve=s,Ye=oe),{year:ve,dayOfYear:Ye}}function ia(s,u,m){var p=Bl(s.year(),u,m),_=Math.floor((s.dayOfYear()-p-1)/7)+1,A,M;return _<1?(M=s.year()-1,A=_+On(M,u,m)):_>On(s.year(),u,m)?(A=_-On(s.year(),u,m),M=s.year()+1):(M=s.year(),A=_),{week:A,year:M}}function On(s,u,m){var p=Bl(s,u,m),_=Bl(s+1,u,m);return(ra(s)-p+_)/7}K("w",["ww",2],"wo","week"),K("W",["WW",2],"Wo","isoWeek"),Dt("week","w"),Dt("isoWeek","W"),pt("week",5),pt("isoWeek",5),X("w",ae),X("ww",ae,ie),X("W",ae),X("WW",ae,ie),An(["w","ww","W","WW"],function(s,u,m,p){u[p.substr(0,1)]=ge(s)});function dC(s){return ia(s,this._week.dow,this._week.doy).week}var fC={dow:0,doy:6};function hC(){return this._week.dow}function mC(){return this._week.doy}function pC(s){var u=this.localeData().week(this);return s==null?u:this.add((s-u)*7,"d")}function gC(s){var u=ia(this,1,4).week;return s==null?u:this.add((s-u)*7,"d")}K("d",0,"do","day"),K("dd",0,0,function(s){return this.localeData().weekdaysMin(this,s)}),K("ddd",0,0,function(s){return this.localeData().weekdaysShort(this,s)}),K("dddd",0,0,function(s){return this.localeData().weekdays(this,s)}),K("e",0,0,"weekday"),K("E",0,0,"isoWeekday"),Dt("day","d"),Dt("weekday","e"),Dt("isoWeekday","E"),pt("day",11),pt("weekday",11),pt("isoWeekday",11),X("d",ae),X("e",ae),X("E",ae),X("dd",function(s,u){return u.weekdaysMinRegex(s)}),X("ddd",function(s,u){return u.weekdaysShortRegex(s)}),X("dddd",function(s,u){return u.weekdaysRegex(s)}),An(["dd","ddd","dddd"],function(s,u,m,p){var _=m._locale.weekdaysParse(s,p,m._strict);_!=null?u.d=_:E(m).invalidWeekday=s}),An(["d","e","E"],function(s,u,m,p){u[p]=ge(s)});function vC(s,u){return typeof s!="string"?s:isNaN(s)?(s=u.weekdaysParse(s),typeof s=="number"?s:null):parseInt(s,10)}function yC(s,u){return typeof s=="string"?u.weekdaysParse(s)%7||7:isNaN(s)?null:s}function xf(s,u){return s.slice(u,7).concat(s.slice(0,u))}var wC="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Sv="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),_C="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),xC=jn,SC=jn,bC=jn;function kC(s,u){var m=o(this._weekdays)?this._weekdays:this._weekdays[s&&s!==!0&&this._weekdays.isFormat.test(u)?"format":"standalone"];return s===!0?xf(m,this._week.dow):s?m[s.day()]:m}function CC(s){return s===!0?xf(this._weekdaysShort,this._week.dow):s?this._weekdaysShort[s.day()]:this._weekdaysShort}function DC(s){return s===!0?xf(this._weekdaysMin,this._week.dow):s?this._weekdaysMin[s.day()]:this._weekdaysMin}function EC(s,u,m){var p,_,A,M=s.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],p=0;p<7;++p)A=C([2e3,1]).day(p),this._minWeekdaysParse[p]=this.weekdaysMin(A,"").toLocaleLowerCase(),this._shortWeekdaysParse[p]=this.weekdaysShort(A,"").toLocaleLowerCase(),this._weekdaysParse[p]=this.weekdays(A,"").toLocaleLowerCase();return m?u==="dddd"?(_=ut.call(this._weekdaysParse,M),_!==-1?_:null):u==="ddd"?(_=ut.call(this._shortWeekdaysParse,M),_!==-1?_:null):(_=ut.call(this._minWeekdaysParse,M),_!==-1?_:null):u==="dddd"?(_=ut.call(this._weekdaysParse,M),_!==-1||(_=ut.call(this._shortWeekdaysParse,M),_!==-1)?_:(_=ut.call(this._minWeekdaysParse,M),_!==-1?_:null)):u==="ddd"?(_=ut.call(this._shortWeekdaysParse,M),_!==-1||(_=ut.call(this._weekdaysParse,M),_!==-1)?_:(_=ut.call(this._minWeekdaysParse,M),_!==-1?_:null)):(_=ut.call(this._minWeekdaysParse,M),_!==-1||(_=ut.call(this._weekdaysParse,M),_!==-1)?_:(_=ut.call(this._shortWeekdaysParse,M),_!==-1?_:null))}function jC(s,u,m){var p,_,A;if(this._weekdaysParseExact)return EC.call(this,s,u,m);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),p=0;p<7;p++){if(_=C([2e3,1]).day(p),m&&!this._fullWeekdaysParse[p]&&(this._fullWeekdaysParse[p]=new RegExp("^"+this.weekdays(_,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[p]=new RegExp("^"+this.weekdaysShort(_,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[p]=new RegExp("^"+this.weekdaysMin(_,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[p]||(A="^"+this.weekdays(_,"")+"|^"+this.weekdaysShort(_,"")+"|^"+this.weekdaysMin(_,""),this._weekdaysParse[p]=new RegExp(A.replace(".",""),"i")),m&&u==="dddd"&&this._fullWeekdaysParse[p].test(s))return p;if(m&&u==="ddd"&&this._shortWeekdaysParse[p].test(s))return p;if(m&&u==="dd"&&this._minWeekdaysParse[p].test(s))return p;if(!m&&this._weekdaysParse[p].test(s))return p}}function AC(s){if(!this.isValid())return s!=null?this:NaN;var u=this._isUTC?this._d.getUTCDay():this._d.getDay();return s!=null?(s=vC(s,this.localeData()),this.add(s-u,"d")):u}function TC(s){if(!this.isValid())return s!=null?this:NaN;var u=(this.day()+7-this.localeData()._week.dow)%7;return s==null?u:this.add(s-u,"d")}function RC(s){if(!this.isValid())return s!=null?this:NaN;if(s!=null){var u=yC(s,this.localeData());return this.day(this.day()%7?u:u-7)}else return this.day()||7}function OC(s){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||Sf.call(this),s?this._weekdaysStrictRegex:this._weekdaysRegex):(c(this,"_weekdaysRegex")||(this._weekdaysRegex=xC),this._weekdaysStrictRegex&&s?this._weekdaysStrictRegex:this._weekdaysRegex)}function PC(s){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||Sf.call(this),s?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(c(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=SC),this._weekdaysShortStrictRegex&&s?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function LC(s){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||Sf.call(this),s?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(c(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=bC),this._weekdaysMinStrictRegex&&s?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Sf(){function s(Xt,Nn){return Nn.length-Xt.length}var u=[],m=[],p=[],_=[],A,M,oe,ve,Ye;for(A=0;A<7;A++)M=C([2e3,1]).day(A),oe=gt(this.weekdaysMin(M,"")),ve=gt(this.weekdaysShort(M,"")),Ye=gt(this.weekdays(M,"")),u.push(oe),m.push(ve),p.push(Ye),_.push(oe),_.push(ve),_.push(Ye);u.sort(s),m.sort(s),p.sort(s),_.sort(s),this._weekdaysRegex=new RegExp("^("+_.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+p.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+m.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+u.join("|")+")","i")}function bf(){return this.hours()%12||12}function MC(){return this.hours()||24}K("H",["HH",2],0,"hour"),K("h",["hh",2],0,bf),K("k",["kk",2],0,MC),K("hmm",0,0,function(){return""+bf.apply(this)+Q(this.minutes(),2)}),K("hmmss",0,0,function(){return""+bf.apply(this)+Q(this.minutes(),2)+Q(this.seconds(),2)}),K("Hmm",0,0,function(){return""+this.hours()+Q(this.minutes(),2)}),K("Hmmss",0,0,function(){return""+this.hours()+Q(this.minutes(),2)+Q(this.seconds(),2)});function bv(s,u){K(s,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),u)})}bv("a",!0),bv("A",!1),Dt("hour","h"),pt("hour",13);function kv(s,u){return u._meridiemParse}X("a",kv),X("A",kv),X("H",ae),X("h",ae),X("k",ae),X("HH",ae,ie),X("hh",ae,ie),X("kk",ae,ie),X("hmm",_t),X("hmmss",ct),X("Hmm",_t),X("Hmmss",ct),me(["H","HH"],xt),me(["k","kk"],function(s,u,m){var p=ge(s);u[xt]=p===24?0:p}),me(["a","A"],function(s,u,m){m._isPm=m._locale.isPM(s),m._meridiem=s}),me(["h","hh"],function(s,u,m){u[xt]=ge(s),E(m).bigHour=!0}),me("hmm",function(s,u,m){var p=s.length-2;u[xt]=ge(s.substr(0,p)),u[Hr]=ge(s.substr(p)),E(m).bigHour=!0}),me("hmmss",function(s,u,m){var p=s.length-4,_=s.length-2;u[xt]=ge(s.substr(0,p)),u[Hr]=ge(s.substr(p,2)),u[Rn]=ge(s.substr(_)),E(m).bigHour=!0}),me("Hmm",function(s,u,m){var p=s.length-2;u[xt]=ge(s.substr(0,p)),u[Hr]=ge(s.substr(p))}),me("Hmmss",function(s,u,m){var p=s.length-4,_=s.length-2;u[xt]=ge(s.substr(0,p)),u[Hr]=ge(s.substr(p,2)),u[Rn]=ge(s.substr(_))});function IC(s){return(s+"").toLowerCase().charAt(0)==="p"}var NC=/[ap]\.?m?\.?/i,zC=L("Hours",!0);function YC(s,u,m){return s>11?m?"pm":"PM":m?"am":"AM"}var Cv={calendar:$,longDateFormat:mr,invalidDate:Dr,ordinal:qs,dayOfMonthOrdinalParse:Zs,relativeTime:ci,months:Jk,monthsShort:pv,week:fC,weekdays:wC,weekdaysMin:_C,weekdaysShort:Sv,meridiemParse:NC},Qe={},oa={},sa;function VC(s,u){var m,p=Math.min(s.length,u.length);for(m=0;m0;){if(_=Wl(A.slice(0,m).join("-")),_)return _;if(p&&p.length>=m&&VC(A,p)>=m-1)break;m--}u++}return sa}function FC(s){return s.match("^[^/\\\\]*$")!=null}function Wl(s){var u=null,m;if(Qe[s]===void 0&&e&&e.exports&&FC(s))try{u=sa._abbr,m=kk,m("./locale/"+s),hi(u)}catch{Qe[s]=null}return Qe[s]}function hi(s,u){var m;return s&&(h(u)?m=Pn(s):m=kf(s,u),m?sa=m:typeof console<"u"&&console.warn&&console.warn("Locale "+s+" not found. Did you forget to load it?")),sa._abbr}function kf(s,u){if(u!==null){var m,p=Cv;if(u.abbr=s,Qe[s]!=null)te("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),p=Qe[s]._config;else if(u.parentLocale!=null)if(Qe[u.parentLocale]!=null)p=Qe[u.parentLocale]._config;else if(m=Wl(u.parentLocale),m!=null)p=m._config;else return oa[u.parentLocale]||(oa[u.parentLocale]=[]),oa[u.parentLocale].push({name:s,config:u}),null;return Qe[s]=new ze(je(p,u)),oa[s]&&oa[s].forEach(function(_){kf(_.name,_.config)}),hi(s),Qe[s]}else return delete Qe[s],null}function UC(s,u){if(u!=null){var m,p,_=Cv;Qe[s]!=null&&Qe[s].parentLocale!=null?Qe[s].set(je(Qe[s]._config,u)):(p=Wl(s),p!=null&&(_=p._config),u=je(_,u),p==null&&(u.abbr=s),m=new ze(u),m.parentLocale=Qe[s],Qe[s]=m),hi(s)}else Qe[s]!=null&&(Qe[s].parentLocale!=null?(Qe[s]=Qe[s].parentLocale,s===hi()&&hi(s)):Qe[s]!=null&&delete Qe[s]);return Qe[s]}function Pn(s){var u;if(s&&s._locale&&s._locale._abbr&&(s=s._locale._abbr),!s)return sa;if(!o(s)){if(u=Wl(s),u)return u;s=[s]}return HC(s)}function $C(){return mt(Qe)}function Cf(s){var u,m=s._a;return m&&E(s).overflow===-2&&(u=m[Tn]<0||m[Tn]>11?Tn:m[an]<1||m[an]>$l(m[jt],m[Tn])?an:m[xt]<0||m[xt]>24||m[xt]===24&&(m[Hr]!==0||m[Rn]!==0||m[Qi]!==0)?xt:m[Hr]<0||m[Hr]>59?Hr:m[Rn]<0||m[Rn]>59?Rn:m[Qi]<0||m[Qi]>999?Qi:-1,E(s)._overflowDayOfYear&&(uan)&&(u=an),E(s)._overflowWeeks&&u===-1&&(u=Qk),E(s)._overflowWeekday&&u===-1&&(u=qk),E(s).overflow=u),s}var BC=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,WC=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,GC=/Z|[+-]\d\d(?::?\d\d)?/,Gl=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],Df=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],KC=/^\/?Date\((-?\d+)/i,XC=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,QC={UT:0,GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function Ev(s){var u,m,p=s._i,_=BC.exec(p)||WC.exec(p),A,M,oe,ve,Ye=Gl.length,Xt=Df.length;if(_){for(E(s).iso=!0,u=0,m=Ye;ura(M)||s._dayOfYear===0)&&(E(s)._overflowDayOfYear=!0),m=na(M,0,s._dayOfYear),s._a[Tn]=m.getUTCMonth(),s._a[an]=m.getUTCDate()),u=0;u<3&&s._a[u]==null;++u)s._a[u]=p[u]=_[u];for(;u<7;u++)s._a[u]=p[u]=s._a[u]==null?u===2?1:0:s._a[u];s._a[xt]===24&&s._a[Hr]===0&&s._a[Rn]===0&&s._a[Qi]===0&&(s._nextDay=!0,s._a[xt]=0),s._d=(s._useUTC?na:uC).apply(null,p),A=s._useUTC?s._d.getUTCDay():s._d.getDay(),s._tzm!=null&&s._d.setUTCMinutes(s._d.getUTCMinutes()-s._tzm),s._nextDay&&(s._a[xt]=24),s._w&&typeof s._w.d<"u"&&s._w.d!==A&&(E(s).weekdayMismatch=!0)}}function iD(s){var u,m,p,_,A,M,oe,ve,Ye;u=s._w,u.GG!=null||u.W!=null||u.E!=null?(A=1,M=4,m=Ro(u.GG,s._a[jt],ia($e(),1,4).year),p=Ro(u.W,1),_=Ro(u.E,1),(_<1||_>7)&&(ve=!0)):(A=s._locale._week.dow,M=s._locale._week.doy,Ye=ia($e(),A,M),m=Ro(u.gg,s._a[jt],Ye.year),p=Ro(u.w,Ye.week),u.d!=null?(_=u.d,(_<0||_>6)&&(ve=!0)):u.e!=null?(_=u.e+A,(u.e<0||u.e>6)&&(ve=!0)):_=A),p<1||p>On(m,A,M)?E(s)._overflowWeeks=!0:ve!=null?E(s)._overflowWeekday=!0:(oe=xv(m,p,_,A,M),s._a[jt]=oe.year,s._dayOfYear=oe.dayOfYear)}n.ISO_8601=function(){},n.RFC_2822=function(){};function jf(s){if(s._f===n.ISO_8601){Ev(s);return}if(s._f===n.RFC_2822){jv(s);return}s._a=[],E(s).empty=!0;var u=""+s._i,m,p,_,A,M,oe=u.length,ve=0,Ye,Xt;for(_=Vr(s._f,s._locale).match(ue)||[],Xt=_.length,m=0;m0&&E(s).unusedInput.push(M),u=u.slice(u.indexOf(p)+p.length),ve+=p.length),Fe[A]?(p?E(s).empty=!1:E(s).unusedTokens.push(A),Ul(A,p,s)):s._strict&&!p&&E(s).unusedTokens.push(A);E(s).charsLeftOver=oe-ve,u.length>0&&E(s).unusedInput.push(u),s._a[xt]<=12&&E(s).bigHour===!0&&s._a[xt]>0&&(E(s).bigHour=void 0),E(s).parsedDateParts=s._a.slice(0),E(s).meridiem=s._meridiem,s._a[xt]=oD(s._locale,s._a[xt],s._meridiem),Ye=E(s).era,Ye!==null&&(s._a[jt]=s._locale.erasConvertYear(Ye,s._a[jt])),Ef(s),Cf(s)}function oD(s,u,m){var p;return m==null?u:s.meridiemHour!=null?s.meridiemHour(u,m):(s.isPM!=null&&(p=s.isPM(m),p&&u<12&&(u+=12),!p&&u===12&&(u=0)),u)}function sD(s){var u,m,p,_,A,M,oe=!1,ve=s._f.length;if(ve===0){E(s).invalidFormat=!0,s._d=new Date(NaN);return}for(_=0;_this?this:s:b()});function Rv(s,u){var m,p;if(u.length===1&&o(u[0])&&(u=u[0]),!u.length)return $e();for(m=u[0],p=1;pthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function ED(){if(!h(this._isDSTShifted))return this._isDSTShifted;var s={},u;return R(s,this),s=Av(s),s._a?(u=s._isUTC?C(s._a):$e(s._a),this._isDSTShifted=this.isValid()&&yD(s._a,u.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function jD(){return this.isValid()?!this._isUTC:!1}function AD(){return this.isValid()?this._isUTC:!1}function Pv(){return this.isValid()?this._isUTC&&this._offset===0:!1}var TD=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,RD=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function Fr(s,u){var m=s,p=null,_,A,M;return Xl(s)?m={ms:s._milliseconds,d:s._days,M:s._months}:g(s)||!isNaN(+s)?(m={},u?m[u]=+s:m.milliseconds=+s):(p=TD.exec(s))?(_=p[1]==="-"?-1:1,m={y:0,d:ge(p[an])*_,h:ge(p[xt])*_,m:ge(p[Hr])*_,s:ge(p[Rn])*_,ms:ge(Af(p[Qi]*1e3))*_}):(p=RD.exec(s))?(_=p[1]==="-"?-1:1,m={y:qi(p[2],_),M:qi(p[3],_),w:qi(p[4],_),d:qi(p[5],_),h:qi(p[6],_),m:qi(p[7],_),s:qi(p[8],_)}):m==null?m={}:typeof m=="object"&&("from"in m||"to"in m)&&(M=OD($e(m.from),$e(m.to)),m={},m.ms=M.milliseconds,m.M=M.months),A=new Kl(m),Xl(s)&&c(s,"_locale")&&(A._locale=s._locale),Xl(s)&&c(s,"_isValid")&&(A._isValid=s._isValid),A}Fr.fn=Kl.prototype,Fr.invalid=vD;function qi(s,u){var m=s&&parseFloat(s.replace(",","."));return(isNaN(m)?0:m)*u}function Lv(s,u){var m={};return m.months=u.month()-s.month()+(u.year()-s.year())*12,s.clone().add(m.months,"M").isAfter(u)&&--m.months,m.milliseconds=+u-+s.clone().add(m.months,"M"),m}function OD(s,u){var m;return s.isValid()&&u.isValid()?(u=Rf(u,s),s.isBefore(u)?m=Lv(s,u):(m=Lv(u,s),m.milliseconds=-m.milliseconds,m.months=-m.months),m):{milliseconds:0,months:0}}function Mv(s,u){return function(m,p){var _,A;return p!==null&&!isNaN(+p)&&(te(u,"moment()."+u+"(period, number) is deprecated. Please use moment()."+u+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),A=m,m=p,p=A),_=Fr(m,p),Iv(this,_,s),this}}function Iv(s,u,m,p){var _=u._milliseconds,A=Af(u._days),M=Af(u._months);s.isValid()&&(p=p??!0,M&&vv(s,N(s,"Month")+M*m),A&&V(s,"Date",N(s,"Date")+A*m),_&&s._d.setTime(s._d.valueOf()+_*m),p&&n.updateOffset(s,A||M))}var PD=Mv(1,"add"),LD=Mv(-1,"subtract");function Nv(s){return typeof s=="string"||s instanceof String}function MD(s){return O(s)||v(s)||Nv(s)||g(s)||ND(s)||ID(s)||s===null||s===void 0}function ID(s){var u=a(s)&&!d(s),m=!1,p=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],_,A,M=p.length;for(_=0;_m.valueOf():m.valueOf()9999?Yr(m,u?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):G(Date.prototype.toISOString)?u?this.toDate().toISOString():new Date(this.valueOf()+this.utcOffset()*60*1e3).toISOString().replace("Z",Yr(m,"Z")):Yr(m,u?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function qD(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var s="moment",u="",m,p,_,A;return this.isLocal()||(s=this.utcOffset()===0?"moment.utc":"moment.parseZone",u="Z"),m="["+s+'("]',p=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",_="-MM-DD[T]HH:mm:ss.SSS",A=u+'[")]',this.format(m+p+_+A)}function ZD(s){s||(s=this.isUtc()?n.defaultFormatUtc:n.defaultFormat);var u=Yr(this,s);return this.localeData().postformat(u)}function JD(s,u){return this.isValid()&&(O(s)&&s.isValid()||$e(s).isValid())?Fr({to:this,from:s}).locale(this.locale()).humanize(!u):this.localeData().invalidDate()}function eE(s){return this.from($e(),s)}function tE(s,u){return this.isValid()&&(O(s)&&s.isValid()||$e(s).isValid())?Fr({from:this,to:s}).locale(this.locale()).humanize(!u):this.localeData().invalidDate()}function rE(s){return this.to($e(),s)}function zv(s){var u;return s===void 0?this._locale._abbr:(u=Pn(s),u!=null&&(this._locale=u),this)}var Yv=Y("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(s){return s===void 0?this.localeData():this.locale(s)});function Vv(){return this._locale}var ql=1e3,Oo=60*ql,Zl=60*Oo,Hv=(365*400+97)*24*Zl;function Po(s,u){return(s%u+u)%u}function Fv(s,u,m){return s<100&&s>=0?new Date(s+400,u,m)-Hv:new Date(s,u,m).valueOf()}function Uv(s,u,m){return s<100&&s>=0?Date.UTC(s+400,u,m)-Hv:Date.UTC(s,u,m)}function nE(s){var u,m;if(s=Et(s),s===void 0||s==="millisecond"||!this.isValid())return this;switch(m=this._isUTC?Uv:Fv,s){case"year":u=m(this.year(),0,1);break;case"quarter":u=m(this.year(),this.month()-this.month()%3,1);break;case"month":u=m(this.year(),this.month(),1);break;case"week":u=m(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":u=m(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":u=m(this.year(),this.month(),this.date());break;case"hour":u=this._d.valueOf(),u-=Po(u+(this._isUTC?0:this.utcOffset()*Oo),Zl);break;case"minute":u=this._d.valueOf(),u-=Po(u,Oo);break;case"second":u=this._d.valueOf(),u-=Po(u,ql);break}return this._d.setTime(u),n.updateOffset(this,!0),this}function iE(s){var u,m;if(s=Et(s),s===void 0||s==="millisecond"||!this.isValid())return this;switch(m=this._isUTC?Uv:Fv,s){case"year":u=m(this.year()+1,0,1)-1;break;case"quarter":u=m(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":u=m(this.year(),this.month()+1,1)-1;break;case"week":u=m(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":u=m(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":u=m(this.year(),this.month(),this.date()+1)-1;break;case"hour":u=this._d.valueOf(),u+=Zl-Po(u+(this._isUTC?0:this.utcOffset()*Oo),Zl)-1;break;case"minute":u=this._d.valueOf(),u+=Oo-Po(u,Oo)-1;break;case"second":u=this._d.valueOf(),u+=ql-Po(u,ql)-1;break}return this._d.setTime(u),n.updateOffset(this,!0),this}function oE(){return this._d.valueOf()-(this._offset||0)*6e4}function sE(){return Math.floor(this.valueOf()/1e3)}function aE(){return new Date(this.valueOf())}function lE(){var s=this;return[s.year(),s.month(),s.date(),s.hour(),s.minute(),s.second(),s.millisecond()]}function cE(){var s=this;return{years:s.year(),months:s.month(),date:s.date(),hours:s.hours(),minutes:s.minutes(),seconds:s.seconds(),milliseconds:s.milliseconds()}}function uE(){return this.isValid()?this.toISOString():null}function dE(){return w(this)}function fE(){return k({},E(this))}function hE(){return E(this).overflow}function mE(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}K("N",0,0,"eraAbbr"),K("NN",0,0,"eraAbbr"),K("NNN",0,0,"eraAbbr"),K("NNNN",0,0,"eraName"),K("NNNNN",0,0,"eraNarrow"),K("y",["y",1],"yo","eraYear"),K("y",["yy",2],0,"eraYear"),K("y",["yyy",3],0,"eraYear"),K("y",["yyyy",4],0,"eraYear"),X("N",Pf),X("NN",Pf),X("NNN",Pf),X("NNNN",CE),X("NNNNN",DE),me(["N","NN","NNN","NNNN","NNNNN"],function(s,u,m,p){var _=m._locale.erasParse(s,p,m._strict);_?E(m).era=_:E(m).invalidEra=s}),X("y",on),X("yy",on),X("yyy",on),X("yyyy",on),X("yo",EE),me(["y","yy","yyy","yyyy"],jt),me(["yo"],function(s,u,m,p){var _;m._locale._eraYearOrdinalRegex&&(_=s.match(m._locale._eraYearOrdinalRegex)),m._locale.eraYearOrdinalParse?u[jt]=m._locale.eraYearOrdinalParse(s,_):u[jt]=parseInt(s,10)});function pE(s,u){var m,p,_,A=this._eras||Pn("en")._eras;for(m=0,p=A.length;m=0)return A[p]}function vE(s,u){var m=s.since<=s.until?1:-1;return u===void 0?n(s.since).year():n(s.since).year()+(u-s.offset)*m}function yE(){var s,u,m,p=this.localeData().eras();for(s=0,u=p.length;sA&&(u=A),LE.call(this,s,u,m,p,_))}function LE(s,u,m,p,_){var A=xv(s,u,m,p,_),M=na(A.year,0,A.dayOfYear);return this.year(M.getUTCFullYear()),this.month(M.getUTCMonth()),this.date(M.getUTCDate()),this}K("Q",0,"Qo","quarter"),Dt("quarter","Q"),pt("quarter",7),X("Q",fe),me("Q",function(s,u){u[Tn]=(ge(s)-1)*3});function ME(s){return s==null?Math.ceil((this.month()+1)/3):this.month((s-1)*3+this.month()%3)}K("D",["DD",2],"Do","date"),Dt("date","D"),pt("date",9),X("D",ae),X("DD",ae,ie),X("Do",function(s,u){return s?u._dayOfMonthOrdinalParse||u._ordinalParse:u._dayOfMonthOrdinalParseLenient}),me(["D","DD"],an),me("Do",function(s,u){u[an]=ge(s.match(ae)[0])});var Bv=L("Date",!0);K("DDD",["DDDD",3],"DDDo","dayOfYear"),Dt("dayOfYear","DDD"),pt("dayOfYear",4),X("DDD",tt),X("DDDD",ce),me(["DDD","DDDD"],function(s,u,m){m._dayOfYear=ge(s)});function IE(s){var u=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return s==null?u:this.add(s-u,"d")}K("m",["mm",2],0,"minute"),Dt("minute","m"),pt("minute",14),X("m",ae),X("mm",ae,ie),me(["m","mm"],Hr);var NE=L("Minutes",!1);K("s",["ss",2],0,"second"),Dt("second","s"),pt("second",15),X("s",ae),X("ss",ae,ie),me(["s","ss"],Rn);var zE=L("Seconds",!1);K("S",0,0,function(){return~~(this.millisecond()/100)}),K(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),K(0,["SSS",3],0,"millisecond"),K(0,["SSSS",4],0,function(){return this.millisecond()*10}),K(0,["SSSSS",5],0,function(){return this.millisecond()*100}),K(0,["SSSSSS",6],0,function(){return this.millisecond()*1e3}),K(0,["SSSSSSS",7],0,function(){return this.millisecond()*1e4}),K(0,["SSSSSSSS",8],0,function(){return this.millisecond()*1e5}),K(0,["SSSSSSSSS",9],0,function(){return this.millisecond()*1e6}),Dt("millisecond","ms"),pt("millisecond",16),X("S",tt,fe),X("SS",tt,ie),X("SSS",tt,ce);var mi,Wv;for(mi="SSSS";mi.length<=9;mi+="S")X(mi,on);function YE(s,u){u[Qi]=ge(("0."+s)*1e3)}for(mi="S";mi.length<=9;mi+="S")me(mi,YE);Wv=L("Milliseconds",!1),K("z",0,0,"zoneAbbr"),K("zz",0,0,"zoneName");function VE(){return this._isUTC?"UTC":""}function HE(){return this._isUTC?"Coordinated Universal Time":""}var F=P.prototype;F.add=PD,F.calendar=VD,F.clone=HD,F.diff=KD,F.endOf=iE,F.format=ZD,F.from=JD,F.fromNow=eE,F.to=tE,F.toNow=rE,F.get=J,F.invalidAt=hE,F.isAfter=FD,F.isBefore=UD,F.isBetween=$D,F.isSame=BD,F.isSameOrAfter=WD,F.isSameOrBefore=GD,F.isValid=dE,F.lang=Yv,F.locale=zv,F.localeData=Vv,F.max=dD,F.min=uD,F.parsingFlags=fE,F.set=re,F.startOf=nE,F.subtract=LD,F.toArray=lE,F.toObject=cE,F.toDate=aE,F.toISOString=QD,F.inspect=qD,typeof Symbol<"u"&&Symbol.for!=null&&(F[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),F.toJSON=uE,F.toString=XD,F.unix=sE,F.valueOf=oE,F.creationData=mE,F.eraName=yE,F.eraNarrow=wE,F.eraAbbr=_E,F.eraYear=xE,F.year=_v,F.isLeapYear=cC,F.weekYear=jE,F.isoWeekYear=AE,F.quarter=F.quarters=ME,F.month=yv,F.daysInMonth=sC,F.week=F.weeks=pC,F.isoWeek=F.isoWeeks=gC,F.weeksInYear=OE,F.weeksInWeekYear=PE,F.isoWeeksInYear=TE,F.isoWeeksInISOWeekYear=RE,F.date=Bv,F.day=F.days=AC,F.weekday=TC,F.isoWeekday=RC,F.dayOfYear=IE,F.hour=F.hours=zC,F.minute=F.minutes=NE,F.second=F.seconds=zE,F.millisecond=F.milliseconds=Wv,F.utcOffset=_D,F.utc=SD,F.local=bD,F.parseZone=kD,F.hasAlignedHourOffset=CD,F.isDST=DD,F.isLocal=jD,F.isUtcOffset=AD,F.isUtc=Pv,F.isUTC=Pv,F.zoneAbbr=VE,F.zoneName=HE,F.dates=Y("dates accessor is deprecated. Use date instead.",Bv),F.months=Y("months accessor is deprecated. Use month instead",yv),F.years=Y("years accessor is deprecated. Use year instead",_v),F.zone=Y("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",xD),F.isDSTShifted=Y("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",ED);function FE(s){return $e(s*1e3)}function UE(){return $e.apply(null,arguments).parseZone()}function Gv(s){return s}var Ae=ze.prototype;Ae.calendar=le,Ae.longDateFormat=Ki,Ae.invalidDate=pr,Ae.ordinal=Js,Ae.preparse=Gv,Ae.postformat=Gv,Ae.relativeTime=Hl,Ae.pastFuture=Fl,Ae.set=lt,Ae.eras=pE,Ae.erasParse=gE,Ae.erasConvertYear=vE,Ae.erasAbbrRegex=bE,Ae.erasNameRegex=SE,Ae.erasNarrowRegex=kE,Ae.months=rC,Ae.monthsShort=nC,Ae.monthsParse=oC,Ae.monthsRegex=lC,Ae.monthsShortRegex=aC,Ae.week=dC,Ae.firstDayOfYear=mC,Ae.firstDayOfWeek=hC,Ae.weekdays=kC,Ae.weekdaysMin=DC,Ae.weekdaysShort=CC,Ae.weekdaysParse=jC,Ae.weekdaysRegex=OC,Ae.weekdaysShortRegex=PC,Ae.weekdaysMinRegex=LC,Ae.isPM=IC,Ae.meridiem=YC;function ec(s,u,m,p){var _=Pn(),A=C().set(p,u);return _[m](A,s)}function Kv(s,u,m){if(g(s)&&(u=s,s=void 0),s=s||"",u!=null)return ec(s,u,m,"month");var p,_=[];for(p=0;p<12;p++)_[p]=ec(s,p,m,"month");return _}function Mf(s,u,m,p){typeof s=="boolean"?(g(u)&&(m=u,u=void 0),u=u||""):(u=s,m=u,s=!1,g(u)&&(m=u,u=void 0),u=u||"");var _=Pn(),A=s?_._week.dow:0,M,oe=[];if(m!=null)return ec(u,(m+A)%7,p,"day");for(M=0;M<7;M++)oe[M]=ec(u,(M+A)%7,p,"day");return oe}function $E(s,u){return Kv(s,u,"months")}function BE(s,u){return Kv(s,u,"monthsShort")}function WE(s,u,m){return Mf(s,u,m,"weekdays")}function GE(s,u,m){return Mf(s,u,m,"weekdaysShort")}function KE(s,u,m){return Mf(s,u,m,"weekdaysMin")}hi("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(s){var u=s%10,m=ge(s%100/10)===1?"th":u===1?"st":u===2?"nd":u===3?"rd":"th";return s+m}}),n.lang=Y("moment.lang is deprecated. Use moment.locale instead.",hi),n.langData=Y("moment.langData is deprecated. Use moment.localeData instead.",Pn);var Ln=Math.abs;function XE(){var s=this._data;return this._milliseconds=Ln(this._milliseconds),this._days=Ln(this._days),this._months=Ln(this._months),s.milliseconds=Ln(s.milliseconds),s.seconds=Ln(s.seconds),s.minutes=Ln(s.minutes),s.hours=Ln(s.hours),s.months=Ln(s.months),s.years=Ln(s.years),this}function Xv(s,u,m,p){var _=Fr(u,m);return s._milliseconds+=p*_._milliseconds,s._days+=p*_._days,s._months+=p*_._months,s._bubble()}function QE(s,u){return Xv(this,s,u,1)}function qE(s,u){return Xv(this,s,u,-1)}function Qv(s){return s<0?Math.floor(s):Math.ceil(s)}function ZE(){var s=this._milliseconds,u=this._days,m=this._months,p=this._data,_,A,M,oe,ve;return s>=0&&u>=0&&m>=0||s<=0&&u<=0&&m<=0||(s+=Qv(If(m)+u)*864e5,u=0,m=0),p.milliseconds=s%1e3,_=Kt(s/1e3),p.seconds=_%60,A=Kt(_/60),p.minutes=A%60,M=Kt(A/60),p.hours=M%24,u+=Kt(M/24),ve=Kt(qv(u)),m+=ve,u-=Qv(If(ve)),oe=Kt(m/12),m%=12,p.days=u,p.months=m,p.years=oe,this}function qv(s){return s*4800/146097}function If(s){return s*146097/4800}function JE(s){if(!this.isValid())return NaN;var u,m,p=this._milliseconds;if(s=Et(s),s==="month"||s==="quarter"||s==="year")switch(u=this._days+p/864e5,m=this._months+qv(u),s){case"month":return m;case"quarter":return m/3;case"year":return m/12}else switch(u=this._days+Math.round(If(this._months)),s){case"week":return u/7+p/6048e5;case"day":return u+p/864e5;case"hour":return u*24+p/36e5;case"minute":return u*1440+p/6e4;case"second":return u*86400+p/1e3;case"millisecond":return Math.floor(u*864e5)+p;default:throw new Error("Unknown unit "+s)}}function ej(){return this.isValid()?this._milliseconds+this._days*864e5+this._months%12*2592e6+ge(this._months/12)*31536e6:NaN}function Mn(s){return function(){return this.as(s)}}var tj=Mn("ms"),rj=Mn("s"),nj=Mn("m"),ij=Mn("h"),oj=Mn("d"),sj=Mn("w"),aj=Mn("M"),lj=Mn("Q"),cj=Mn("y");function uj(){return Fr(this)}function dj(s){return s=Et(s),this.isValid()?this[s+"s"]():NaN}function Zi(s){return function(){return this.isValid()?this._data[s]:NaN}}var fj=Zi("milliseconds"),hj=Zi("seconds"),mj=Zi("minutes"),pj=Zi("hours"),gj=Zi("days"),vj=Zi("months"),yj=Zi("years");function wj(){return Kt(this.days()/7)}var In=Math.round,Lo={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function _j(s,u,m,p,_){return _.relativeTime(u||1,!!m,s,p)}function xj(s,u,m,p){var _=Fr(s).abs(),A=In(_.as("s")),M=In(_.as("m")),oe=In(_.as("h")),ve=In(_.as("d")),Ye=In(_.as("M")),Xt=In(_.as("w")),Nn=In(_.as("y")),pi=A<=m.ss&&["s",A]||A0,pi[4]=p,_j.apply(null,pi)}function Sj(s){return s===void 0?In:typeof s=="function"?(In=s,!0):!1}function bj(s,u){return Lo[s]===void 0?!1:u===void 0?Lo[s]:(Lo[s]=u,s==="s"&&(Lo.ss=u-1),!0)}function kj(s,u){if(!this.isValid())return this.localeData().invalidDate();var m=!1,p=Lo,_,A;return typeof s=="object"&&(u=s,s=!1),typeof s=="boolean"&&(m=s),typeof u=="object"&&(p=Object.assign({},Lo,u),u.s!=null&&u.ss==null&&(p.ss=u.s-1)),_=this.localeData(),A=xj(this,!m,p,_),m&&(A=_.pastFuture(+this,A)),_.postformat(A)}var Nf=Math.abs;function Mo(s){return(s>0)-(s<0)||+s}function tc(){if(!this.isValid())return this.localeData().invalidDate();var s=Nf(this._milliseconds)/1e3,u=Nf(this._days),m=Nf(this._months),p,_,A,M,oe=this.asSeconds(),ve,Ye,Xt,Nn;return oe?(p=Kt(s/60),_=Kt(p/60),s%=60,p%=60,A=Kt(m/12),m%=12,M=s?s.toFixed(3).replace(/\.?0+$/,""):"",ve=oe<0?"-":"",Ye=Mo(this._months)!==Mo(oe)?"-":"",Xt=Mo(this._days)!==Mo(oe)?"-":"",Nn=Mo(this._milliseconds)!==Mo(oe)?"-":"",ve+"P"+(A?Ye+A+"Y":"")+(m?Ye+m+"M":"")+(u?Xt+u+"D":"")+(_||p||s?"T":"")+(_?Nn+_+"H":"")+(p?Nn+p+"M":"")+(s?Nn+M+"S":"")):"P0D"}var Ce=Kl.prototype;Ce.isValid=gD,Ce.abs=XE,Ce.add=QE,Ce.subtract=qE,Ce.as=JE,Ce.asMilliseconds=tj,Ce.asSeconds=rj,Ce.asMinutes=nj,Ce.asHours=ij,Ce.asDays=oj,Ce.asWeeks=sj,Ce.asMonths=aj,Ce.asQuarters=lj,Ce.asYears=cj,Ce.valueOf=ej,Ce._bubble=ZE,Ce.clone=uj,Ce.get=dj,Ce.milliseconds=fj,Ce.seconds=hj,Ce.minutes=mj,Ce.hours=pj,Ce.days=gj,Ce.weeks=wj,Ce.months=vj,Ce.years=yj,Ce.humanize=kj,Ce.toISOString=tc,Ce.toString=tc,Ce.toJSON=tc,Ce.locale=zv,Ce.localeData=Vv,Ce.toIsoString=Y("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",tc),Ce.lang=Yv,K("X",0,0,"unix"),K("x",0,0,"valueOf"),X("x",Dn),X("X",ta),me("X",function(s,u,m){m._d=new Date(parseFloat(s)*1e3)}),me("x",function(s,u,m){m._d=new Date(ge(s))});//! moment.js -return n.version="2.29.4",i($e),n.fn=F,n.min=fD,n.max=hD,n.now=mD,n.utc=C,n.unix=FE,n.months=$E,n.isDate=v,n.locale=hi,n.invalid=b,n.duration=Fr,n.isMoment=O,n.weekdays=WE,n.parseZone=UE,n.localeData=Pn,n.isDuration=Xl,n.monthsShort=BE,n.weekdaysMin=KE,n.defineLocale=kf,n.updateLocale=UC,n.locales=$C,n.weekdaysShort=GE,n.normalizeUnits=Et,n.relativeTimeRounding=Sj,n.relativeTimeThreshold=bj,n.calendarFormat=YD,n.prototype=F,n.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},n})}(dW)),Zu}(function(e,t){(function(r,n){n(typeof kk=="function"?fW():r.moment)})(Go,function(r){//! moment.js locale configuration -var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(i,o){return i===12&&(i=0),o==="凌晨"||o==="早上"||o==="上午"?i:o==="下午"||o==="晚上"?i+12:i>=11?i:i+12},meridiem:function(i,o,a){var c=i*100+o;return c<600?"凌晨":c<900?"早上":c<1130?"上午":c<1230?"中午":c<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:function(i){return i.week()!==this.week()?"[下]dddLT":"[本]dddLT"},lastDay:"[昨天]LT",lastWeek:function(i){return this.week()!==i.week()?"[上]dddLT":"[本]dddLT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(i,o){switch(o){case"d":case"D":case"DDD":return i+"日";case"M":return i+"月";case"w":case"W":return i+"周";default:return i}},relativeTime:{future:"%s后",past:"%s前",s:"几秒",ss:"%d 秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",w:"1 周",ww:"%d 周",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},week:{dow:1,doy:4}});return n})})();const Ck="/zh-cn/assets/wechat-qrcode-8dca7947.png",Dk="/zh-cn/assets/logo-image-91f154f1.svg",Ek="/zh-cn/assets/location-cf5a6f84.svg",jk="/zh-cn/assets/clock-718648c0.svg",Ak="/zh-cn/assets/calendar-cd5a76f0.svg";B.locale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY年MM月DD日",LLL:"YYYY年MM月DD日Ah点mm分",LLLL:"YYYY年MM月DD日ddddAh点mm分",l:"YYYY-M-D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){return e===12&&(e=0),t==="凌晨"||t==="早上"||t==="上午"?e:t==="下午"||t==="晚上"?e+12:e>=11?e:e+12},meridiem:function(e,t){const r=e*100+t;return r<600?"凌晨":r<900?"早上":r<1130?"上午":r<1230?"中午":r<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"周";default:return e}},relativeTime:{future:"%s内",past:"%s前",s:"几秒",ss:"%d秒",m:"1分钟",mm:"%d分钟",h:"1小时",hh:"%d小时",d:"1天",dd:"%d天",M:"1个月",MM:"%d个月",y:"1年",yy:"%d年"},week:{dow:1,doy:4}});const{Heading:hW,Paragraph:mW}=Pe,{CNTitleMedium:Tk,CNTitleSmall:pW}=hW,{CNBodySmall:Ao,CNMarkSmall:gW,CNBodyLarge:vW,CNMarkMedium:Rk}=mW,yW=f.div` - background: #fafafa; -`,wW=f.div` - display: flex; - max-width: 1440px; - margin-inline: auto; - padding-block: 0.87rem; - padding-inline: 1.28rem; - @media screen and (max-width: 1024px) { - flex-direction: column; - } -`,_W=f.aside` - display: block; - width: 250px; - margin-right: 0.48rem; - @media screen and (max-width: 1024px) { - order: 2; - width: 100%; - margin-right: 0; - margin-bottom: 0.32rem; - } -`,xW=f.main` - flex-grow: 1; - @media screen and (max-width: 1024px) { - order: 3; - } -`,SW=f.aside` - width: 200px; - margin-left: 0.48rem; - @media screen and (max-width: 1024px) { - order: 1; - width: 100%; - margin-left: 0; - margin-bottom: 0.32rem; - } -`,bW=f.section` - position: sticky; - top: calc(0.84rem + 0.48rem); - left: 0; - padding: 0.22rem; - color: #141414; - background: #fff; - border-radius: 0.07rem; - box-shadow: 0 0.01rem 0.02rem 0 rgba(0, 0, 0, 0.03); -`,Ok=f.section` - padding: 0.16rem; - margin-bottom: 0.12rem; - min-height: 100px; - background: #fff; - color: rgba(20, 20, 20, 0.8); - :last-child { - margin-bottom: 0; - } -`,kW=f(Ok)` - position: sticky; - top: calc(84px + 48px); - left: 0; -`,Gw=f(pW)` - padding-bottom: 0.11rem; - color: #7680dd; -`,cn=f.div` - padding-bottom: 0.06rem; - font-size: 0.14rem; - line-height: 0.2rem; - font-weight: 400; - color: ${e=>e.theme.themeDark}; - &:last-child { - padding-bottom: 0; - } -`,un=f.span` - font-weight: 600; -`,CW=f(Ao)` - font-weight: 600; - padding-bottom: 0.11rem; - position: relative; - padding-left: 0.24rem; - &::before { - position: absolute; - top: -0.03rem; - left: 0; - content: '📨'; - } -`,Kw=f(Ao)` - font-weight: 600; - /* padding-bottom: 0.04rem; */ -`,Xw=f(Rk)` - font-weight: 600; - font-size: 0.16rem; - padding-bottom: 0.12rem; -`;f(Rk)` - padding-bottom: 0.11rem; -`;const DW=f(Ao)` - font-weight: 400; -`,EW=f.span` - color: #7680dd; -`,jW=f.img` - display: block; - width: 0.8rem; - margin-inline: auto; - padding-top: 0.12rem; -`,AW=f(Tk)` - padding-bottom: 0.14rem; -`,TW=f(Tk)` - margin-bottom: 0.11rem; -`,RW=f.section` - min-height: 200px; - color: rgba(20, 20, 20, 0.7); -`,OW=f.div` - display: flex; - min-height: 200px; - margin-bottom: 0.16rem; - padding: 0.22rem; - background: #fff; - border-radius: 0.12rem; - cursor: pointer; - box-shadow: 0 0.01rem 0.018rem rgba(0, 0, 0, 0.03); - :last-child { - margin-bottom: 0; - } -`,PW=f.img` - height: min-content; - width: 0.625rem; - margin-right: 0.22rem; -`,LW=f.div` - flex-grow: 1; - position: relative; -`,MW=f(gW)` - color: #7767a0; -`,IW=f(vW)` - margin-bottom: 0.07rem; - color: #141414; -`,NW=f.div` - display: flex; - margin-bottom: 0.13rem; - @media screen and (max-width: 1024px) { - flex-direction: column; - } -`,Xh=f.div` - font-size: 0.15rem; - font-weight: 400; - padding-right: 0.22rem; - @media screen and (max-width: 1024px) { - display: none; - } -`,Qh=f(Ao)` - position: relative; - padding-left: 0.2rem; - padding-right: 0.22rem; - &::before { - position: absolute; - top: 0.035rem; - left: 0; - display: inline-block; - content: ''; - width: 0.14rem; - height: 0.14rem; - background-image: url(${e=>e.icon}); - background-size: cover; - } -`,zW=f.div` - padding-bottom: 0.24rem; -`,YW=f.ol` - padding-left: 0.24rem; -`,VW=f(Ao)``,HW=f(Ao)` - color: #7680dd; -`,FW=f.div` - width: 96%; - display: flex; - align-items: center; - justify-content: space-between; -`,Qw=f(Ao)` - display: flex; - align-items: center; - margin-bottom: 0.07rem; - color: #393f47; -`,qw=f.input` - margin: 0; - margin-right: 0.07rem; - height: 0.145rem; - width: 0.145rem; - cursor: pointer; - &:checked { - accent-color: ${e=>e.theme.secondary01}; - } -`,UW=new Map([["fullTime","全职"],["internship","实习"]]),Zw=[{id:"Rust Distributed Storage Development".split(" ").join("-").toLowerCase(),label:"Rust分布式存储开发",tag:["实习"],workNature:"远程实习",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能分布式存储系统研发,涉及的开发内容包括但不限于:","分布式数据一致性协议;","高速网络传输接口、驱动;","分布式缓存、数据管理服务;","对象存储接口;","文件存储接口;","块存储接口。"]},{title:"【岗位要求】",body:["熟悉Rust和C语言;","熟悉多线程、高并发编程;","熟悉Docker和K8S等容器相关工具;","熟悉Linux操作系统;","具有很强的学习能力,自我驱动以及团队合作意识。"]}]},{id:"Rust High Performance Web Systems Development".split(" ").join("-").toLowerCase(),label:"Rust高性能网络系统开发",tag:["实习"],workNature:"远程实习",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与研发高性能网络系统开发,涉及的工作包括但不限于:","网络硬件Linux驱动开发;","网络流量控制算法设计与实现;","网络仿真系统开发与测试。"]},{title:"【岗位要求】",body:["熟悉Rust和C语言;","熟悉多线程、高并发编程;","熟悉Docker、KVM等容器和虚拟化相关工具;","熟悉Linux操作系统网络管理相关功能;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["熟悉Rust异步编程、有tokio或async-std使用经验优先;","熟悉Linux内核IO相关功能,有eBPF、XDP相关开发经验优先;","有Linux内核网络模块相关开发经验优先;","有无损以太网流量控制相关的开发经验优先;","熟悉常见流量控制算法优先,诸如BBR、CUBIC、QCN等;","有DPDK或RDMA等高性能网络编程经验优先;","有P4、OpenFlow、NS3、SONiC等相关编程经验优先;","有K8S的CNI接口编程经验优先;","能长期实习优先。"]}]},{id:"AI platform development".split(" ").join("-").toLowerCase(),label:"AI平台研发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["负责大模型平台后端的开发研发,根据产品和项目计划按时完成功能模块的架构设计、编码、测试的全流程工作。","负责持续优化系统架构,提供高并发的数据请求分析的处理能力,提高系统的容灾容错能力,保证系统的可运维、高可用性、高可靠性。"]},{title:"【岗位要求】",body:["具备全面的软件知识结构,基础扎实,熟悉常用数据结构与算法。","熟练使用Python语言,熟悉使用常用模块,完成过基于Python的中大型项目。","熟练使用MySQL、Redis、Nginx、Flask、MongoDB等。","熟悉Linux操作,了解Shell脚本,有Linux下的多线程编程经验,有性能调优经验。","有开源项目贡献经验者优先。","熟悉机器学习,能够使用PyTorch、TensorFlow等框架者优先。","熟悉网络编程的基本模型和方法,有实际项目的开发经验者优先。"]}]},{id:"FPGA Development".split(" ").join("-").toLowerCase(),label:"FPGA开发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["负责基于FPGA实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","实现常用外设接口IP的RTL设计、集成和验证;","3.参与SoC集成设计与验证;","撰写相关设计文档。"]},{title:"【岗位要求】",body:["熟悉基于FPGA的设计流程,熟悉Xilinx的FPGA芯片架构,熟练掌握Xilinx的FPGA开发工具;","熟悉Bluespec、SpinalHDL、Chisel或Clash等新一代HDL语言;","熟练掌握Verilog、SystemVerilog或VHDL语言;","熟悉SystemVerilog Assertion的使用;","熟练掌握TCL脚本语言;","具有很强的学习能力,自我驱动以及团队合作意识;"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉PCIe、DMA、NVMe、DDR3/4、SerDes等相关接口开发优先;","有DSP领域相关经验、熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","熟悉AXI、ACE、CHI等AMBA总线协议;","熟悉基于Python的仿真测试工具Cocotb优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先。","能长期实习(6个月以上)优先。"]}]},{id:"Joint research and development of hardware and software".split(" ").join("-").toLowerCase(),label:"软硬件联合研发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能存储SoC芯片的软硬件开发:","负责网络IO加速的RTL实现;","负责加密、压缩、编码等算法加速的设计与RTL实现;","负责SoC芯片的Linux驱动开发;","负责实现软硬件联合调试与自动化测试。"]},{title:"【岗位要求】",body:["熟悉IC设计流程,熟悉常用的仿真、综合等EDA工具;","熟悉Xilinx的FPGA设计流程,熟练掌握Xilinx的FPGA开发工具;","熟悉Bluespec、SpinalHDL、Chisel或Clash等新一代HDL语言;","熟练掌握Verilog、SystemVerilog和SystemC语言;","熟悉Linux开发内核模块、驱动;","熟悉基于QEMU的软硬件联合调试工具链;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先;","熟悉CXL、PCIe、AXI、ACE、CHI、NVMe等协议接口开发优先;","有DSP领域相关经验,熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","有Linux内核网络、文件、存储相关开发经验优先;","熟悉Rust for Linux开发内核模块、驱动开发经验优先;","能长期实习(6个月以上)优先。"]}]},{id:"Digital IC front-end design".split(" ").join("-").toLowerCase(),label:"数字IC前端设计",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能存储SoC芯片的软硬件开发:","负责实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","负责实现SoC的集成、综合与原型验证;","负责实现常用外设接口IP的RTL设计、集成;","撰写相关设计文档。"]},{title:"【岗位要求】",body:["熟悉数字IC的开发工具链;","熟悉Bluespec、SpinalHDL或Chisel等新一代HDL语言;","熟练掌握Verilog、SystemVerilog、SystemC语言;","熟悉SystemVerilog Assertion的使用;","熟练掌握TCL脚本语言;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先;","熟悉CXL、PCIe、AXI、ACE、CHI、NVMe等协议接口开发优先;","有加密和编码领域相关经验,熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","熟悉基于Python的仿真测试工具Cocotb优先;","有形式化验证相关经验优先;","能长期实习优先。"]}]}],$W=()=>{const e=ht(),[t,r]=I.useState(Zw),[n,i]=I.useState({fullTime:!0,internship:!0});return I.useEffect(()=>{r(Zw.filter(o=>n[o.workType]===!0))},[n]),I.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsx(yW,{children:l.jsxs(wW,{children:[l.jsx(_W,{children:l.jsxs(bW,{children:[l.jsx(AW,{children:"筛选"}),l.jsx(TW,{children:"工作类型"}),l.jsxs(Qw,{as:"div",children:[l.jsx(qw,{type:"checkbox",id:"full-time",checked:n.fullTime,onChange:()=>{const o={...n};o.fullTime=!o.fullTime,i(o)}}),l.jsx("label",{htmlFor:"full-time",children:"全职"})]}),l.jsxs(Qw,{as:"div",children:[l.jsx(qw,{type:"checkbox",id:"internship",checked:n.internship,onChange:()=>{const o={...n};o.internship=!o.internship,i(o)}}),l.jsx("label",{htmlFor:"internship",children:"兼职"})]})]})}),l.jsx(xW,{children:l.jsx(RW,{children:t.map(o=>{const{id:a,label:c,tag:d,workNature:h,workType:g,releaseTime:v,content:x}=o;return l.jsxs(OW,{onClick:()=>{e(a.split(" ").join("-"))},children:[l.jsx(PW,{src:Dk}),l.jsxs(LW,{children:[l.jsx(MW,{children:d.join(", ")}),l.jsx(FW,{children:l.jsx(IW,{children:c})}),l.jsxs(NW,{children:[l.jsx(Qh,{icon:Ek,children:h}),l.jsx(Xh,{children:"·"}),l.jsx(Qh,{icon:jk,children:UW.get(g)}),l.jsx(Xh,{children:"·"}),l.jsx(Xh,{children:"·"}),l.jsx(Qh,{icon:Ak,children:B(v,"YYYY-MM-DD").fromNow()})]}),x.map(({title:k,body:C})=>l.jsxs(zW,{children:[l.jsx(HW,{as:"p",children:k}),l.jsx(YW,{children:C.map(D=>l.jsx(VW,{as:"li",children:D},D))})]},k))]})]},a)})})}),l.jsxs(SW,{children:[l.jsxs(Ok,{children:[l.jsx(Xw,{children:"面试流程"}),l.jsx(Gw,{children:"实习岗位:"}),l.jsxs(cn,{children:[l.jsx(un,{children:"项目笔试"}),"- 两天"]}),l.jsxs(cn,{children:[l.jsx(un,{children:"思路 review"})," - 交流指导"]}),l.jsxs(cn,{children:[l.jsx(un,{children:"性能优化"})," - 不超过一周"]}),l.jsx(cn,{children:l.jsx(un,{children:"交叉面试"})}),l.jsx("div",{style:{paddingBlock:"0.06rem"}}),l.jsx(Gw,{children:"校招 / 社招岗位:"}),l.jsxs(cn,{children:[l.jsx(un,{children:"项目笔试"})," - 两天"]}),l.jsxs(cn,{children:[l.jsx(un,{children:"思路 review"})," - 交流指导"]}),l.jsxs(cn,{children:[l.jsx(un,{children:"性能优化"})," - 不超过一周"]}),l.jsx(cn,{children:l.jsx(un,{children:"技术 open talk 评审"})}),l.jsx(Xw,{style:{marginTop:"0.2rem"},children:"薪资待遇"}),l.jsxs(cn,{children:[l.jsx(un,{children:"实习生:"}),"入职初期为 300/天,如能力和产出优秀将予以薪资调增,最高 500/天。"]}),l.jsxs(cn,{children:[l.jsx(un,{children:"正式员工:"}),"对标国内一线大厂的薪资+期权,待面试通过后根据能力情况而定。"]})]}),l.jsxs(kW,{children:[l.jsx(CW,{children:"投递简历"}),l.jsx(Kw,{children:"- 投递至邮箱:"}),l.jsx(DW,{style:{paddingTop:"0.04rem"},children:l.jsx(EW,{children:"info@datenlord.com"})}),l.jsx("div",{style:{height:"0.24rem"}}),l.jsx(Kw,{children:"- 添加达坦科技小助手微信:"}),l.jsx(jW,{src:Ck})]})]})]})})};B.updateLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY年MM月DD日",LLL:"YYYY年MM月DD日Ah点mm分",LLLL:"YYYY年MM月DD日ddddAh点mm分",l:"YYYY-M-D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){return e===12&&(e=0),t==="凌晨"||t==="早上"||t==="上午"?e:t==="下午"||t==="晚上"?e+12:e>=11?e:e+12},meridiem:function(e,t){const r=e*100+t;return r<600?"凌晨":r<900?"早上":r<1130?"上午":r<1230?"中午":r<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"周";default:return e}},relativeTime:{future:"%s内",past:"%s前",s:"几秒",ss:"%d秒",m:"1分钟",mm:"%d分钟",h:"1小时",hh:"%d小时",d:"1天",dd:"%d天",M:"1个月",MM:"%d个月",y:"1年",yy:"%d年"},week:{dow:1,doy:4}});const{Heading:BW,Paragraph:WW}=Pe,{CNTitleSmall:GW,CNHead5S:KW,CNTitleLarge:XW}=BW,{CNBodySmall:Xs,CNMarkSmall:QW,CNBodyLarge:qW,CNMarkMedium:Pk,CNBodyMedium:Lk}=WW,ZW=f.div` - background: #fafafa; -`,JW=f.div` - display: flex; - max-width: 1440px; - margin-inline: auto; - padding-block: 0.87rem; - padding-inline: 1.64rem; - @media screen and (max-width: 1024px) { - flex-direction: column; - } -`,eG=f.main` - flex-grow: 1; - @media screen and (max-width: 1024px) { - order: 3; - } -`,tG=f.aside` - width: 250px; - margin-left: 0.48rem; - @media screen and (max-width: 1024px) { - order: 1; - width: 100%; - margin-left: 0; - margin-bottom: 0.32rem; - } -`,Mk=f.section` - padding: 0.16rem; - margin-bottom: 0.12rem; - min-height: 100px; - background: #fff; - color: rgba(20, 20, 20, 0.8); - :last-child { - margin-bottom: 0; - } -`,rG=f(Mk)` - position: sticky; - top: calc(84px + 48px); - left: 0; -`,Jw=f(GW)` - padding-bottom: 0.11rem; - color: #7680dd; -`,dn=f.div` - padding-bottom: 0.11rem; - font-size: 0.14rem; - line-height: 0.2rem; - font-weight: 400; - color: ${e=>e.theme.themeDark}; - &:last-child { - padding-bottom: 0; - } -`,fn=f.span` - font-weight: 600; -`,nG=f(Xs)` - padding-bottom: 0.11rem; - position: relative; - padding-left: 0.24rem; - &::before { - position: absolute; - top: -0.03rem; - left: 0; - content: '📨'; - } -`,e2=f(Xs)` - font-weight: 600; - padding-bottom: 0.24rem; -`,t2=f(Pk)` - font-weight: 600; -`;f(Pk)` - padding-bottom: 0.11rem; -`;const iG=f(Xs)` - font-weight: 400; -`,oG=f.span` - color: #7680dd; -`,sG=f.img` - display: block; - width: 0.8rem; - padding-top: 0.12rem; - margin-inline: auto; -`,aG=f.section` - padding-bottom: 0.96rem; - min-height: 200px; - color: rgba(20, 20, 20, 0.7); -`,Ik=f.div` - display: flex; - min-height: 200px; - margin-bottom: 0.16rem; - padding: 0.22rem; - background: #fff; - border-radius: 0.12rem; - box-shadow: 0 0.01rem 0.018rem rgba(0, 0, 0, 0.03); - :last-child { - margin-bottom: 0; - } -`,lG=f(Ik)` - flex-direction: column; -`,cG=f.div` - display: flex; - justify-content: space-between; - padding-bottom: 0.24rem; -`,uG=f.img` - height: min-content; - width: 0.625rem; - margin-right: 0.22rem; -`;f.img` - display: block; - width: 0.48rem; -`;const r2=f.div` - flex-grow: 1; - position: relative; -`,dG=f(QW)` - color: #7767a0; -`,fG=f(qW)` - margin-bottom: 0.07rem; - color: #141414; -`,hG=f(XW)` - padding-bottom: 0.08rem; - color: ${e=>e.theme.gray007}; -`,mG=f.div` - display: flex; - margin-bottom: 0.13rem; - @media screen and (max-width: 1024px) { - flex-direction: column; - } -`,qh=f.div` - font-size: 0.15rem; - font-weight: 400; - padding-right: 0.22rem; - @media screen and (max-width: 1024px) { - display: none; - } -`,Zh=f(Xs)` - position: relative; - padding-left: 0.2rem; - padding-right: 0.22rem; - &::before { - position: absolute; - top: 0.035rem; - left: 0; - display: inline-block; - content: ''; - width: 0.14rem; - height: 0.14rem; - background-image: url(${e=>e.icon}); - background-size: cover; - } -`,n2=f.div` - padding-bottom: 0.24rem; - &:last-of-type { - padding-bottom: 0; - } -`,i2=f.ol` - padding-left: 0.24rem; -`,pG=f(Xs)``,gG=f(Lk)``,vG=f(Xs)` - color: #7680dd; -`,yG=f(Lk)``,wG=f.button` - padding-inline: 0.18rem; - color: ${e=>e.theme.gray007}; - font-size: 0.14rem; - font-weight: 600; - line-height: 1; - background: ${e=>e.theme.white00}; - border: 0.01rem solid #dae0e6; - border-radius: 0.06rem; - cursor: pointer; -`,o2=f.div` - width: 96%; - display: flex; - align-items: center; - justify-content: space-between; -`,_G=f.div``,xG=f(KW)``,SG=f.div` - padding-top: 0.5rem; - display: grid; - grid-template-columns: repeat(2, 1fr); - grid-template-rows: repeat(1, 1fr); - grid-gap: 0.26rem; -`,bG=f.div` - display: flex; - justify-content: center; - align-items: center; - width: 0.48rem; - height: 0.48rem; - background: ${e=>e.theme.secondary02}; - border-radius: 50%; -`,kG=f.img` - width: 0.32rem; - height: 0.32rem; -`,CG=new Map([["fullTime","全职"],["internship","实习"]]),s2=[{id:"Rust Distributed Storage Development".split(" ").join("-").toLowerCase(),label:"Rust分布式存储开发",tag:["实习"],workNature:"远程实习",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能分布式存储系统研发,涉及的开发内容包括但不限于:","分布式数据一致性协议;","高速网络传输接口、驱动;","分布式缓存、数据管理服务;","对象存储接口;","文件存储接口;","块存储接口。"]},{title:"【岗位要求】",body:["熟悉Rust和C语言;","熟悉多线程、高并发编程;","熟悉Docker和K8S等容器相关工具;","熟悉Linux操作系统;","具有很强的学习能力,自我驱动以及团队合作意识。"]}]},{id:"Rust High Performance Web Systems Development".split(" ").join("-").toLowerCase(),label:"Rust高性能网络系统开发",tag:["实习"],workNature:"远程实习",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与研发高性能网络系统开发,涉及的工作包括但不限于:","网络硬件Linux驱动开发;","网络流量控制算法设计与实现;","网络仿真系统开发与测试。"]},{title:"【岗位要求】",body:["熟悉Rust和C语言;","熟悉多线程、高并发编程;","熟悉Docker、KVM等容器和虚拟化相关工具;","熟悉Linux操作系统网络管理相关功能;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["熟悉Rust异步编程、有tokio或async-std使用经验优先;","熟悉Linux内核IO相关功能,有eBPF、XDP相关开发经验优先;","有Linux内核网络模块相关开发经验优先;","有无损以太网流量控制相关的开发经验优先;","熟悉常见流量控制算法优先,诸如BBR、CUBIC、QCN等;","有DPDK或RDMA等高性能网络编程经验优先;","有P4、OpenFlow、NS3、SONiC等相关编程经验优先;","有K8S的CNI接口编程经验优先;","能长期实习优先。"]}]},{id:"AI platform development".split(" ").join("-").toLowerCase(),label:"AI平台研发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["负责大模型平台后端的开发研发,根据产品和项目计划按时完成功能模块的架构设计、编码、测试的全流程工作。","负责持续优化系统架构,提供高并发的数据请求分析的处理能力,提高系统的容灾容错能力,保证系统的可运维、高可用性、高可靠性。"]},{title:"【岗位要求】",body:["具备全面的软件知识结构,基础扎实,熟悉常用数据结构与算法。","熟练使用Python语言,熟悉使用常用模块,完成过基于Python的中大型项目。","熟练使用MySQL、Redis、Nginx、Flask、MongoDB等。","熟悉Linux操作,了解Shell脚本,有Linux下的多线程编程经验,有性能调优经验。","有开源项目贡献经验者优先。","熟悉机器学习,能够使用PyTorch、TensorFlow等框架者优先。","熟悉网络编程的基本模型和方法,有实际项目的开发经验者优先。"]}]},{id:"FPGA Development".split(" ").join("-").toLowerCase(),label:"FPGA开发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["负责基于FPGA实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","实现常用外设接口IP的RTL设计、集成和验证;","3.参与SoC集成设计与验证;","撰写相关设计文档。"]},{title:"【岗位要求】",body:["熟悉基于FPGA的设计流程,熟悉Xilinx的FPGA芯片架构,熟练掌握Xilinx的FPGA开发工具;","熟悉Bluespec、SpinalHDL、Chisel或Clash等新一代HDL语言;","熟练掌握Verilog、SystemVerilog或VHDL语言;","熟悉SystemVerilog Assertion的使用;","熟练掌握TCL脚本语言;","具有很强的学习能力,自我驱动以及团队合作意识;"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉PCIe、DMA、NVMe、DDR3/4、SerDes等相关接口开发优先;","有DSP领域相关经验、熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","熟悉AXI、ACE、CHI等AMBA总线协议;","熟悉基于Python的仿真测试工具Cocotb优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先。","能长期实习(6个月以上)优先。"]}]},{id:"Joint research and development of hardware and software".split(" ").join("-").toLowerCase(),label:"软硬件联合研发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能存储SoC芯片的软硬件开发:","负责网络IO加速的RTL实现;","负责加密、压缩、编码等算法加速的设计与RTL实现;","负责SoC芯片的Linux驱动开发;","负责实现软硬件联合调试与自动化测试。"]},{title:"【岗位要求】",body:["熟悉IC设计流程,熟悉常用的仿真、综合等EDA工具;","熟悉Xilinx的FPGA设计流程,熟练掌握Xilinx的FPGA开发工具;","熟悉Bluespec、SpinalHDL、Chisel或Clash等新一代HDL语言;","熟练掌握Verilog、SystemVerilog和SystemC语言;","熟悉Linux开发内核模块、驱动;","熟悉基于QEMU的软硬件联合调试工具链;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先;","熟悉CXL、PCIe、AXI、ACE、CHI、NVMe等协议接口开发优先;","有DSP领域相关经验,熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","有Linux内核网络、文件、存储相关开发经验优先;","熟悉Rust for Linux开发内核模块、驱动开发经验优先;","能长期实习(6个月以上)优先。"]}]},{id:"Digital IC front-end design".split(" ").join("-").toLowerCase(),label:"数字IC前端设计",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能存储SoC芯片的软硬件开发:","负责实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","负责实现SoC的集成、综合与原型验证;","负责实现常用外设接口IP的RTL设计、集成;","撰写相关设计文档。"]},{title:"【岗位要求】",body:["熟悉数字IC的开发工具链;","熟悉Bluespec、SpinalHDL或Chisel等新一代HDL语言;","熟练掌握Verilog、SystemVerilog、SystemC语言;","熟悉SystemVerilog Assertion的使用;","熟练掌握TCL脚本语言;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先;","熟悉CXL、PCIe、AXI、ACE、CHI、NVMe等协议接口开发优先;","有加密和编码领域相关经验,熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","熟悉基于Python的仿真测试工具Cocotb优先;","有形式化验证相关经验优先;","能长期实习优先。"]}]}],DG=()=>{const e=ht(),{key:t}=Sn();I.useEffect(()=>{window.scrollTo(0,0)},[t]);const r=s2.filter(({id:n})=>n!==t);return l.jsx(ZW,{children:l.jsxs(JW,{children:[l.jsxs(eG,{children:[l.jsx(aG,{children:s2.map(n=>{const{id:i,label:o,tag:a,workNature:c,workType:d,releaseTime:h,content:g}=n;return t===i?l.jsxs(Ik,{children:[l.jsx(uG,{src:Dk}),l.jsxs(r2,{children:[l.jsx(dG,{children:a.join(", ")}),l.jsx(o2,{children:l.jsx(fG,{children:o})}),l.jsxs(mG,{children:[l.jsx(Zh,{icon:Ek,children:c}),l.jsx(qh,{children:"·"}),l.jsx(Zh,{icon:jk,children:CG.get(d)}),l.jsx(qh,{children:"·"}),l.jsx(qh,{children:"·"}),l.jsx(Zh,{icon:Ak,children:B(h,"YYYY-MM-DD").fromNow()})]}),g.map(({title:v,body:x})=>l.jsxs(n2,{children:[l.jsx(vG,{as:"p",children:v}),l.jsx(i2,{children:x.map(k=>l.jsx(pG,{as:"li",children:k},k))})]},v))]})]},i):null})}),l.jsxs(_G,{children:[l.jsx(xG,{children:"相关岗位"}),l.jsx(SG,{children:r.map((n,i)=>{const{id:o,label:a,content:c}=n;return i<2?l.jsxs(lG,{children:[l.jsxs(cG,{children:[l.jsx(bG,{children:l.jsx(kG,{src:Tb})}),l.jsx(wG,{onClick:()=>e(`/job-description/${o}`),children:"岗位详情"})]}),l.jsxs(r2,{children:[l.jsx(o2,{children:l.jsx(hG,{children:a})}),c.map(({title:d,body:h},g)=>{if(g===0)return l.jsxs(n2,{children:[l.jsx(yG,{as:"p",children:d}),l.jsx(i2,{children:h.map(v=>l.jsx(gG,{as:"li",children:v},v))})]},d)})]})]},o):null})})]})]}),l.jsxs(tG,{children:[l.jsxs(Mk,{children:[l.jsx(t2,{children:"面试流程"}),l.jsx(Jw,{children:"实习岗位:"}),l.jsxs(dn,{children:[l.jsx(fn,{children:"项目笔试"}),"- 两天"]}),l.jsxs(dn,{children:[l.jsx(fn,{children:"思路 review"})," - 交流指导"]}),l.jsxs(dn,{children:[l.jsx(fn,{children:"性能优化"})," - 不超过一周"]}),l.jsx(dn,{children:l.jsx(fn,{children:"交叉面试"})}),l.jsx("div",{style:{paddingBlock:"0.06rem"}}),l.jsx(Jw,{children:"校招 / 社招岗位:"}),l.jsxs(dn,{children:[l.jsx(fn,{children:"项目笔试"})," - 两天"]}),l.jsxs(dn,{children:[l.jsx(fn,{children:"思路 review"})," - 交流指导"]}),l.jsxs(dn,{children:[l.jsx(fn,{children:"性能优化"})," - 不超过一周"]}),l.jsx(dn,{children:l.jsx(fn,{children:"技术 open talk 评审"})}),l.jsx(t2,{style:{marginTop:"0.2rem"},children:"薪资待遇"}),l.jsxs(dn,{children:[l.jsx(fn,{children:"实习生:"}),"入职初期为 300/天,如能力和产出优秀将予以薪资调增,最高 500/天。"]}),l.jsxs(dn,{children:[l.jsx(fn,{children:"正式员工:"}),"对标国内一线大厂的薪资+期权,待面试通过后根据能力情况而定。"]})]}),l.jsxs(rG,{children:[l.jsx(nG,{children:"投递简历"}),l.jsx(e2,{children:"- 投递至邮箱:"}),l.jsx(iG,{style:{paddingTop:"0.04rem"},children:l.jsx(oG,{children:"info@datenlord.com"})}),l.jsx("div",{style:{height:"0.24rem"}}),l.jsx(e2,{children:"- 添加达坦科技小助手微信:"}),l.jsx(sG,{src:Ck})]})]})]})})},EG="/zh-cn/assets/cover-ab5b198b.png",jG="/zh-cn/assets/right-arrow-32ec3014.svg",AG="data:image/png;base64,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",TG="/zh-cn/assets/bg-bg-3abf4aa0.png",RG="data:image/png;base64,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",OG="/zh-cn/assets/cont-del-ill-f7f1f3a0.png",PG="data:image/png;base64,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",LG="/zh-cn/assets/hl-ill-ab994ba5.png",Yo="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAuCAYAAABXuSs3AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVDSURBVHgB7Vm9bxxFFH9v9j7sKLEJJAVgSGRRQBpTUpqGliY9CEUCKUqUihICXSSkGEcUNBGU/AOpKUBJgcCRUChxYSJAoAQbiH13Oy/va/bD8Z1zt1e4uOcbz97u7OzvvfnN7z2vAWY2s5kdScNRF4lolbu3uS3uG0sj5iHYP2/Uzz9EsNFq4VcwBRsKnEF//Odfvav3f+/BYEDQyPz206fa8PLS3AYivImID6GBHQicQZ/d+Xfw650ftmES48gCg9N+//nlM/Nw5qXuJ91udhUaWBhyflUiPYklsDGSHhP3chxz0uOt+7uQD2gFGlpr2IX+GPR4IrICmheTFLld1yH8i0HDoE/PQENrwRRMaREFl0dZWxnxdE6BZwC7uzlCQ2sMPEW7BjoaVfhjFKkAD0zO3i413O0NgRegqWwxGljp85xKrnv0kbfVo/+PRMSpBlo4LIDz3KMeU9RJV0KW4eGD/gI0tGGqIjpJowHXj2OeAJPq/qAfoS+tF6EnbY+8z+HBH/1Xr125d+vapbtLMG3gdEhWTYCLaBMWkVbg3Pq91Az83h633Qj/MVXYzoWs8931Sz+fhwksQBMrNqJH3AEr6L61nkYeFLw4YVGPxQTM9o8mifzEwE2bybntNIkW7aoDrNlKG+vNGemTIeBCBtl7MKZNBLyqJpGokL6S41CCTg6kPaAUKvKRtgA0Nl0aRJxK+YslaAXOoc8H9XNJbWIu500OsdxHi+tj0mVs4NUNWUs4OTgo7ys1il7zpJS7RLLjBh6FLYH+hkdjVXSNNmc14lXNrmp4mf5Nx1MGTVPYT9w+BvNjafuEHKcaoAQyd64nkLGS+otCS+5H5A8WPOe4L3QJv1+/ePez9QtPR5kJI45FtG2D2iYtahQF61GmfamMtG4scgQGZTp7oY6cxw7dWn//x3OHIZiQ4yUS56uBLniP9T3gsmlIK45E95qgqo8L7Mw36xfuLE0VeOkAVWQR66UsVHiBVIu4hjoYTSTa6VJALDzjoxNZq3MFpgW8Gm1dcKhw3U6WtUK1YEAstc8P0x6t0sYfIlMLsLdgWsANgz0HFTqaC7h/RtRxijf1FU9CZrf5jOI6FstnU8oGXhhFl2a1Cj8hhBKkHAe0PxZq3/2cfuc+y3R8IppuzFhO6eAJOnlnqEQ2qMexeBIWwBwcRzQrd6ORwfmf8XUGrozz9aLgPohG6qxRb8be8d4WTBt4AoveJIqxZZptXLdViGjKY2wgaPG4VlulxUlhkPW4KlcYbl++8cb2VICndyVGjTLSWWZpXkApYH5vJdckg3I4C70XmDKm01EukRbxpuyke0YiIBOxhRg/HYVlLODpRU9yQmkRZfn5WjGTkVQd8rqFYqnp7RZCtxuSwgjBn/iLhR24/sGXK/dgWsCrb6dMMUQh6o8VPQ7BK8GM/IUQ+msKNOBzwdSTyCXFjKm9zbFYu/jFys3DsDTiuFBGc4lokzyeZ8uFQr5JrQRAz6zWd9oBjh0PO7wwO3z/CR7OPKbfmDm3ea6bl2+8vvU0z58IeMH1YMsckvi6LEYutyl4dRhTZvWItxFOv9D55cO111ahgY0NvEw2VnMINQSkltWJPgi1IoxcZQR8mzfm3FzzF2jDEtDmycXDJzegpi4YoEguWcu432oFbmitbe3Us23ozuMGNLRwMCD89sXnu18vn53Thw4D7WM9I2ItCakDmTvi7TkG/crysc12l9agoY18d8JL+y537xxwT5mYOeAxUuUWFmX5qv+FkMwTKMoO1THhJ+z3Pp8/Ob8JM5vZzGZ2pOwx917POGoSrr0AAAAASUVORK5CYII=",MG="data:image/png;base64,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",IG="/zh-cn/assets/spy-bg1-ba75fb2e.png",NG="/zh-cn/assets/spy-bg2-d3211011.png",zG="/zh-cn/assets/spy-bg3-a41ded57.png",YG="/zh-cn/assets/spy-bg4-5446dcc4.png",VG="/zh-cn/assets/foot-reg-qr-03a7d7e1.png",HG="/zh-cn/assets/foot-ass-qr-e467649e.png",{Heading:FG,Paragraph:UG}=Pe,{CNHead1:$G,CNHead5:Nk,CNTitleLarge:zk}=FG,{CNBodyLarge:zl,CNBodyMedium:BG}=UG,WG=f.div` - display: flex; - flex-direction: column; - align-items: center; - margin-top: -0.72rem; - padding-top: 0.72rem; - background-image: url(${EG}); - background-size: cover; -`,GG=f($G)` - padding-top: 1.68rem; - color: #fff; -`,KG=f(yn)` - margin-top: 0.46rem; - color: #fff; -`,XG=f.div` - display: flex; - align-items: center; - margin-top: 0.91rem; - margin-bottom: 0.48rem; - padding: 0.13rem 2rem; - background: rgba(0, 0, 0, 0.09); - border: 0.01rem solid #fff; - border-radius: 0.12rem; - cursor: pointer; -`,QG=f.div` - padding-right: 0.12rem; - font-size: 0.2rem; - font-weight: 400; - line-height: 1; - color: #fff; -`,qG=f.img` - height: 0.2rem; - width: 0.2rem; -`,Yl=f.div` - position: relative; -`,Vl=f.div` - /* min-height: 6.4rem; */ - display: flex; - flex-direction: column; - padding-inline: 1.2rem; - color: #252931; - max-width: 1440px; - margin-inline: auto; -`,yf=f.img` - height: 0.38rem; - width: min-content; -`,wf=f.div` - font-size: 0.4rem; - font-weight: 600; -`,ZG=f(Yl)``,JG=f(Vl)` - padding-block: 0.7rem 1.17rem; -`,eK=f(yf)``,tK=f(wf)``,rK=f(zl)` - padding-top: 0.61rem; -`,nK=f.div` - display: flex; - gap: 0.39rem; - padding-top: 0.59rem; -`,Jh=f.div` - padding: 0.12rem 0.23rem 0.16rem; - background: #fff; - border-radius: 0.16rem; - box-shadow: 0px 6px 32px 0px rgba(37, 41, 49, 0.06); -`,em=f.div` - font-size: 0.38rem; - font-weight: 600; - color: #7680dd; -`,tm=f.div` - padding-top: 0.07rem; - color: #626262; - font-size: 0.16rem; - line-height: 0.2956rem; -`,iK=f(zl)` - padding-top: 0.87rem; -`,oK=f.img` - position: absolute; - z-index: -100; - top: 0; - width: 100%; - height: 100%; -`,sK=f(Yl)` - background: linear-gradient( - 106deg, - #e4f4ff -1.1%, - #f9fcff 47.11%, - #edf6fc 102.52% - ); -`,aK=f(Vl)` - min-height: 6.4rem; - padding-block: 0.7rem 1.49rem; -`,lK=f(yf)` - height: 0.26rem; -`,cK=f(wf)``,uK=f.div` - display: flex; - margin-top: 0.8rem; - background: #fff; - border-radius: 0.16rem; -`,dK=f.div` - padding: 0.49rem 0.38rem 0.82rem; -`,fK=f(Nk)` - color: #000; -`,Nc=f(zl)` - padding-top: 0.32rem; - color: #565960; -`,hK=f.div` - position: relative; - display: flex; - align-items: center; - justify-content: space-between; - gap: 0.21rem; - padding-top: 0.48rem; -`,mK=f.div` - position: absolute; - bottom: 0.6rem; - left: 0; - width: 100%; - height: 0.01rem; - background: #565960; -`,rm=f.div` - display: flex; - flex-direction: column; - align-items: center; - color: ${e=>e.isActive?"#fff":"#565960"}; -`,nm=f(zk)` - padding: 0.2rem 0.44rem; - background: ${e=>e.isActive?"#7680DD":"#fff"}; - border-radius: 0.08rem; - box-shadow: 0px 4px 9px 0px - ${e=>e.isActive?"rgba(30, 25, 255, 0.31)":"transparent"}; - border: ${e=>e.isActive?"none":"0.01rem solid #1966FF"}; -`,im=f.div` - margin-top: -0.14rem; - width: 0.48rem; - height: 0.48rem; - transform: rotate(45deg); - background: ${e=>e.isActive?"linear-gradient(-45deg,rgba(25, 102, 255, 0.5) 0,rgba(25, 102, 255, 0) 50%)":"linear-gradient(-45deg,rgba(86, 89, 96, 0.5) 0,rgba(25, 102, 255, 0) 50%)"}; -`,om=f.div` - margin-top: 0.02rem; - width: 0.1rem; - height: 0.1rem; - border-radius: 50%; - background: ${e=>e.isActive?"#7680dd":"#565960"}; -`,sm=f(zl)` - padding-top: 0.23rem; - color: #000; - font-weight: 600; -`,pK=f.img` - margin-top: -0.13rem; - width: 4.2rem; - border-radius: 0.16rem; -`,gK=f.div` - margin-top: 0.8rem; - padding-inline: 0.36rem; -`,vK=f(Nk)` - color: #000; -`,yK=f.div` - margin-top: calc(1.12rem - 0.8rem); - width: min-content; - margin-inline: auto; -`,wK=f.div` - display: flex; - align-items: center; - font-size: 0.2rem; - color: #fff; -`,Yk=f.div` - background: #7680dd; - padding-block: 0.14rem; - border-radius: 0.08rem; - margin-bottom: 0.38rem; -`,_K=f(Yk)` - margin-left: 0.8533rem; - width: 2.24rem; - text-align: center; -`,xK=f(Yk)` - margin-left: 0.96rem; - padding-inline: 1.97rem; -`,SK=f.div` - position: relative; -`,am=f.div` - display: flex; - background: #fff; - border-radius: 0.16rem; - font-size: 0.2rem; - font-weight: 700; - margin-bottom: 0.34rem; -`,lm=f.div` - display: flex; - flex-direction: column; - justify-content: center; - width: 0.8533rem; - padding-inline: 0.2rem; - background: rgba(118, 128, 221, 0.22); - border-radius: 0.08rem; -`,cm=f.div` - white-space: nowrap; - padding-block: 0.2rem; -`,or=f.div` - display: flex; - padding-block: 0.15rem; -`,sr=f.div` - position: relative; - width: 2.24rem; - height: min-content; - padding-left: 1.17rem; - color: #222; - &::after { - content: ''; - position: absolute; - right: 0; - top: 50%; - display: inline-block; - width: 0.09rem; - height: 0.09rem; - background: #7680dd; - border-radius: 50%; - transform: translate(50%, -50%); - } -`,ar=f.div` - padding-inline: 0.96rem; -`,Yn=f.div` - color: #222; -`,bK=f.div` - padding-top: 0.11rem; -`,zc=f.div` - font-size: 0.16rem; - color: #444; -`,kK=f.div` - position: absolute; - left: calc(2.24rem + 0.85rem); - bottom: 2%; - width: 0.01rem; - height: 96%; - background: #7680dd; -`,CK=f(Yl)` - background: linear-gradient(180deg, #f9fffe 4.64%, #fff 168.71%); -`,DK=f(Vl)` - padding-block: 0.7rem 1.45rem; -`,EK=f(yf)``,jK=f(wf)``,AK=f.div` - display: flex; - align-items: center; - gap: 0.32rem; - margin-top: 0.97rem; -`,TK=f.img` - width: 5.2021rem; -`,RK=f.div``,Vo=f.div` - display: flex; - align-items: center; - padding-bottom: 0.22rem; - &:last-child { - padding-bottom: 0; - } -`,Ho=f.img` - margin-right: 0.07rem; - width: 0.44954rem; - height: 0.44954rem; -`,Fo=f(zl)``,OK=f(Yl)` - background: linear-gradient(180deg, #f9fffe 4.64%, #fff 168.71%); -`,PK=f(Vl)` - padding-block: 0.7rem 2.06rem; -`,LK=f(yf)``,MK=f(wf)``,IK=f.div` - display: grid; - grid-template-columns: repeat(2, 1fr); - grid-template-columns: repeat(2, 1fr); - grid-gap: 0.34rem 0.21rem; - padding-top: 1rem; -`,Yc=f.img` - width: 100%; - cursor: pointer; -`,NK=f(Yl)` - background: #fafafa; -`,zK=f(Vl)` - padding-block: 0.44rem 0.56rem; -`,YK=f.div` - display: grid; - grid-template-columns: repeat(2, 1fr); - grid-template-rows: repeat(2, 1fr); - grid-gap: 0.46rem 0.49rem; -`,um=f.div``,dm=f.div` - color: #333; - font-size: 0.2rem; - line-height: 0.28rem; - height: min-content; -`,fm=f(BG)` - padding-top: 0.16rem; - color: #666; - font-size: 0.16rem; - line-height: 0.22rem; -`,VK=f.div` - display: grid; - grid-template-columns: repeat(2, 1fr); - grid-gap: 0.49rem; - padding-top: 0.42rem; -`,a2=f.img` - width: 2.17809rem; -`,HK=f(zk)` - padding-top: 0.41rem; - color: #333; - cursor: pointer; -`,l2=()=>(I.useEffect(()=>{window.scrollTo(0,0)}),l.jsxs(Rt.Fragment,{children:[l.jsx(FK,{}),l.jsx(UK,{}),l.jsx($K,{}),l.jsx(GK,{}),l.jsx(KK,{}),l.jsx(XK,{})]})),FK=()=>{const e=ht();return l.jsxs(WG,{children:[l.jsx(GG,{children:"MIT体系结构公开课学习社区"}),l.jsx(KG,{onClick:()=>{const t=document.getElementById("supply");console.log(t),t&&t.scrollIntoView({behavior:"smooth"})},children:"立即报名"}),l.jsxs(XG,{onClick:()=>e("rank"),children:[l.jsx(QG,{children:"点击查看荣誉榜单"}),l.jsx(qG,{src:jG})]})]})},UK=()=>l.jsxs(ZG,{children:[l.jsxs(JG,{children:[l.jsx(eK,{src:AG}),l.jsx(tK,{children:"项目背景"}),l.jsx(rK,{children:"随着芯片技术自主可控成为国家重要的战略发展规划,对芯片设计相关领域的人才需求也在快速增长。体系结构课程相对于硬件设计的重要性可以类比于设计模式相对于软件设计的重要性,扎实的体系结构基础是设计复杂硬件的基石。然而现实情况是,虽然国内大专院校计算机学科、电子工程学科、微电子等都有开设体系结构或组成原理等相关课程,但由于前些年对相关教学重视度不够,导致教学实践环节存在诸多缺失,毕业生掌握的技能与工业界的期望之间存在较大差距,例如:"}),l.jsxs(nK,{children:[l.jsxs(Jh,{children:[l.jsx(em,{children:"01"}),l.jsx(tm,{children:"教学内容局限在基础知识,而对于业界所需的诸多技术(例如异常处理、缓存技术、内存管理、多核一致性等)往往在教学中一笔带过。"})]}),l.jsxs(Jh,{children:[l.jsx(em,{children:"02"}),l.jsx(tm,{children:"实验、大作业、课程设计等实操环节过于简单,很少有系统级别的实验项目,学生在动手实践环节投入的精力有限,通常只需要编写HDL代码即可顺利完成相关考核,而对于前期开发环境搭建、后期验证调试、性能调优等基本不会涉及。"})]}),l.jsxs(Jh,{children:[l.jsx(em,{children:"03"}),l.jsx(tm,{children:"学科领域泾渭分明,软硬件结合部分训练缺失。软件相关专业课程对硬件相关知识经常快速略过,而硬件相关专业课程也较少涉及上层软件相关的知识。"})]})]}),l.jsx(iK,{children:"为了解决上述问题,我们很高兴看到已经有类似“一生一芯”这样的项目启动并取得了很好的成果,但“一生一芯”项目主要解决了上述的问题2和问题3,而对于工业界实际需要的技能,如多核处理器技术及多核下的数据一致性问题等,依旧存在覆盖上的缺失。"})]}),l.jsx(oK,{src:TG})]}),$K=()=>l.jsx(sK,{children:l.jsxs(aK,{children:[l.jsx(lK,{src:RG}),l.jsx(cK,{children:"课程内容"}),l.jsx(BK,{}),l.jsx(WK,{})]})}),BK=()=>l.jsxs(uK,{children:[l.jsxs(dK,{children:[l.jsx(fK,{children:"详情说明"}),l.jsx(Nc,{children:"为了进一步缩小学生能力与业界期望之间的差距,我们找到了MIT体系结构方面的3门公开课及其对应的课程实验,希望通过学习公开课并亲自动手完成实验的方式,进一步增加学生的动手实践能力以及解决实际问题的能力。对这些公开课的说明如下:"}),l.jsx(Nc,{children:"三门公开课难度级别分别对应本科必修课(6.004)、硕士必修课(6.175)以及实践选修课(6.375)"}),l.jsxs(hK,{children:[l.jsx(mK,{}),l.jsxs(rm,{isActive:!0,children:[l.jsx(nm,{isActive:!0,children:"MIT6.004"}),l.jsx(im,{isActive:!0}),l.jsx(om,{isActive:!0}),l.jsx(sm,{children:"第一阶段"})]}),l.jsxs(rm,{isActive:!1,children:[l.jsx(nm,{isActive:!1,children:"MIT6.375"}),l.jsx(im,{isActive:!1}),l.jsx(om,{isActive:!1}),l.jsx(sm,{children:"第二阶段"})]}),l.jsxs(rm,{isActive:!1,children:[l.jsx(nm,{isActive:!1,children:"MIT6.175"}),l.jsx(im,{isActive:!1}),l.jsx(om,{isActive:!1}),l.jsx(sm,{children:"第三阶段"})]})]}),l.jsx(Nc,{children:"内容涵盖了组合逻辑、简单时序逻辑、流水线及流式数据处理、RISC-V指令集架构、RISC-V处理器实现、Cache、中断异常、Non-Blocking Cache、多核处理器、Cache Coherence等。该课程及实验的授课老师为MIT的Arvind教授,他也是新一代开源HDL语言Bluespec SystemVerilog的发明人,因此该课程的全部实验也采用Bluespec进行RTL的编写。"}),l.jsx(Nc,{children:"在学习三门公开课的同时,我们也自己加入了一些专项训练内容,例如AXI协议握手、流式编程在控制通路上的应用等,从而进一步提升参与者的能力,加深对硬件设计中并发性和流水线的理解。"})]}),l.jsx(pK,{src:OG})]}),WK=()=>l.jsxs(gK,{children:[l.jsx(vK,{children:"培训内容"}),l.jsxs(yK,{children:[l.jsxs(wK,{children:[l.jsx(_K,{children:"序号"}),l.jsx(xK,{children:"实验内容"})]}),l.jsxs(SK,{children:[l.jsxs(am,{children:[l.jsx(lm,{children:"第一阶段"}),l.jsxs(cm,{children:[l.jsxs(or,{children:[l.jsx(sr,{children:"Lab0"}),l.jsx(ar,{children:"实验环境搭建"})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Lab1"}),l.jsx(ar,{children:"多路复用器和加法器"})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Lab2"}),l.jsx(ar,{children:"乘法器"})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Lab3"}),l.jsx(ar,{children:"流水线"})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Lab4"}),l.jsx(ar,{children:"FIFO(Bypass/Pass through/Concurrent)"})]})]})]}),l.jsxs(am,{children:[l.jsx(lm,{children:"第二阶段"}),l.jsxs(cm,{children:[l.jsxs(or,{children:[l.jsx(sr,{children:"专项1"}),l.jsx(ar,{children:l.jsx(Yn,{children:"AXI总线握手打拍与反压机制"})})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"专项2"}),l.jsxs(ar,{children:[l.jsx(Yn,{children:"流式数据处理"}),l.jsxs(bK,{children:[l.jsx(zc,{children:"简单音频处理流水线"}),l.jsx(zc,{children:"音频处理扩展:FFT"}),l.jsx(zc,{children:"音频处理扩展:Pitch Shifting"}),l.jsx(zc,{children:"流水线的软硬件联调仿真"})]})]})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"专项3"}),l.jsx(ar,{children:l.jsx(Yn,{children:"网络设备中的流式数据包处理"})})]})]})]}),l.jsxs(am,{children:[l.jsx(lm,{children:"第三阶段"}),l.jsxs(cm,{children:[l.jsxs(or,{children:[l.jsx(sr,{children:"Lab5"}),l.jsx(ar,{children:l.jsx(Yn,{children:"单周期及多周期RISC-V处理器"})})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Lab6"}),l.jsx(ar,{children:l.jsx(Yn,{children:"支持分支预测及6级流水的RISC-V处理器"})})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Lab7"}),l.jsx(ar,{children:l.jsx(Yn,{children:"具备ICache和DCache的RISC-V处理器"})})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Lab8"}),l.jsx(ar,{children:l.jsx(Yn,{children:"支持异常处理的RISC-V处理器"})})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Project1"}),l.jsx(ar,{children:l.jsx(Yn,{children:"支持乱序执行的RISC-V处理器(Store Queue)"})})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Project2"}),l.jsx(ar,{children:l.jsx(Yn,{children:"多核处理器及缓存一致性(基于MSI协议)"})})]})]})]}),l.jsx(kK,{})]})]})]}),GK=()=>l.jsx(CK,{children:l.jsxs(DK,{children:[l.jsx(EK,{src:PG}),l.jsx(jK,{children:"项目课程亮点"}),l.jsxs(AK,{children:[l.jsx(TK,{src:LG}),l.jsxs(RK,{children:[l.jsxs(Vo,{children:[l.jsx(Ho,{src:Yo}),l.jsx(Fo,{children:"课程及实验安排由浅入深,并在最终到达相当的深度,既可作为“一生一芯”项目的补充课程,也可作为独立项目进行学习。"})]}),l.jsxs(Vo,{children:[l.jsx(Ho,{src:Yo}),l.jsx(Fo,{children:"采用Bluespec作为实验语言,具有更强的抽象表达能力,可以更高效的实现复杂功能,使得学生可以把精力更集中的放在架构设计上。"})]}),l.jsxs(Vo,{children:[l.jsx(Ho,{src:Yo}),l.jsx(Fo,{children:"注重软硬件联合开发,培养软硬通吃的复合型人才。"})]}),l.jsxs(Vo,{children:[l.jsx(Ho,{src:Yo}),l.jsx(Fo,{children:"课程时间安排紧凑,内容丰富,学生通常可以通过2~3个月的业余时间即可自学完成所有实验。"})]}),l.jsxs(Vo,{children:[l.jsx(Ho,{src:Yo}),l.jsx(Fo,{children:"主要课程资料均为英文,有助于锻炼国外文献阅读能力。"})]}),l.jsxs(Vo,{children:[l.jsx(Ho,{src:Yo}),l.jsx(Fo,{children:"全开源、社区化"})]})]})]})]})}),KK=()=>l.jsx(OK,{id:"supply",children:l.jsxs(PK,{children:[l.jsx(LK,{src:MG}),l.jsx(MK,{children:"新手上路补给站"}),l.jsxs(IK,{children:[l.jsx(Yc,{src:IG,onClick:()=>window.location.href="https://www.bilibili.com/video/BV1u8411i7Qw/"}),l.jsx(Yc,{src:NG,onClick:()=>window.location.href="https://www.bilibili.com/video/BV1cs4y1r7T3/"}),l.jsx(Yc,{src:zG,onClick:()=>window.location.href="https://mp.weixin.qq.com/s/-MnRFCXHy5v-tt4MujfqtQ"}),l.jsx(Yc,{src:YG,onClick:()=>window.location.href="https://mp.weixin.qq.com/s/I5bPw_AUWTh2VgzAm4SHhg"})]})]})}),XK=()=>l.jsx(NK,{children:l.jsxs(zK,{children:[l.jsxs(YK,{children:[l.jsxs(um,{style:{gridColumnStart:"span 2"},children:[l.jsx(dm,{children:"申明"}),l.jsx(fm,{children:"MIT体系结构公开课学习社区项目以学习者自学开源的MIT三门公开课为主,社区内大家互相监督和交流,社区有助教在线答疑,帮助有志于从事数字芯片设计的同学强化体系结构基础知识,提升数字芯片设计的能力。"})]}),l.jsxs(um,{children:[l.jsx(dm,{children:"报名表"}),l.jsx(fm,{children:"请扫描二维码,填写报名表,加入MIT体系结构公开课学习社区项目。报名成功后,将收到邮件确认。"})]}),l.jsxs(um,{children:[l.jsx(dm,{children:"咨询"}),l.jsx(fm,{children:"关于MIT体系结构公开课学习社区项目有任何问题或疑问,可以邮件:ta@datenlord.com或添加DatenLord小助手微信咨询。"})]})]}),l.jsxs(VK,{children:[l.jsx(a2,{src:VG}),l.jsx(a2,{src:HG})]}),l.jsxs(HK,{onClick:()=>window.location.href="https://datenlord.feishu.cn/wiki/CNwFwKXPaiy0cfkNYrqcLNdCnTf",children:["往届学员",">>"]})]})}),QK="/zh-cn/assets/title-6364f1d7.png",qK="/zh-cn/assets/stage1-5eb61c6d.png",ZK="/zh-cn/assets/stage2-586e5a56.png",JK="/zh-cn/assets/stage3-021de657.png",eX="/zh-cn/assets/github-6b99dc67.svg",tX=f.div` - display: flex; - flex-direction: column; - align-items: center; - margin-top: -0.72rem; - padding-block: calc(0.72rem + 0.53rem) 0.8rem; - background: #1a1a1a; -`,rX=f.img` - padding-top: 0.53rem; - width: 4.6rem; -`,nX=f.div` - padding-top: 0.41rem; - color: #fff; - font-size: 0.44rem; - line-height: 0.56rem; -`,iX=f.div` - color: #fff; - font-size: 0.2rem; - line-height: 0.56rem; -`,oX=f.main` - background: #000; -`,sX=f.div` - display: flex; - flex-direction: column; - gap: 0.46rem; - max-width: 1440px; - margin-inline: auto; - padding: 0.9rem 1.23rem 1.5rem; -`,hm=f.div` - padding: 0.01rem; - border-radius: 0.16rem; - background: linear-gradient(90deg, #fff, #000); -`,mm=f.div` - display: flex; - border-radius: 0.16rem; - padding: 0.21rem 0.29rem 0.25rem; - background: #000; -`,pm=f.img` - display: inline-block; -`,gm=f.div` - width: 100%; - height: 100%; - margin: 0.27rem 0.84rem 0.23rem; - margin-right: 0; - overflow: hidden; -`,vm=f.ul` - display: flex; - gap: 0.32rem; - animation: 20s move infinite linear; - @keyframes move { - 0% { - transform: translateX(0); - } - 100% { - transform: translateX(-7.56rem); - } - } -`,Uo=f.li` - display: flex; - flex-shrink: 0; - flex-direction: column; - align-items: center; - width: 0.76rem; - cursor: pointer; -`,$o=f.img` - width: 0.62432rem; - height: 0.62432rem; - border-radius: 50%; -`,Bo=f.div` - display: flex; - align-items: center; - color: #fff; - padding-top: 0.04rem; - font-size: 0.14rem; - line-height: 0.31216rem; - - &::after { - content: ''; - display: inline-block; - width: 0.18rem; - height: 0.18rem; - background-image: url(${eX}); - background-size: cover; - margin-left: 0.06rem; - } -`,Jp=[{avatar:"https://avatars.githubusercontent.com/u/11474381?v=4",name:"myrfy001",url:"https://github.com/myrfy001"},{avatar:"https://avatars.githubusercontent.com/u/32484423?v=4",name:"GTwhy",url:"https://github.com/GTwhy"},{avatar:"https://avatars.githubusercontent.com/u/78157415?v=4",name:"kazutoiris",url:"https://github.com/kazutoiris"},{avatar:"https://avatars.githubusercontent.com/u/55951109?v=4",name:"wengwz",url:"https://github.com/wengwz"},{avatar:"https://avatars.githubusercontent.com/u/111745697?v=4",name:"Huihaojia",url:"https://github.com/Huihaojia"},{avatar:"https://avatars.githubusercontent.com/u/108394891?v=4",name:"李琦彬",url:"https://github.com/androny1012"},{avatar:"https://avatars.githubusercontent.com/u/94814217?v=4",name:"李金东",url:"https://github.com/adamgallas"}],e0=Jp,c2=e0,aX=()=>l.jsxs(Rt.Fragment,{children:[l.jsxs(tX,{children:[l.jsx(rX,{src:QK}),l.jsx(nX,{children:"恭喜所有完成MIT体系结构公开课学习的同学!"}),l.jsx(iX,{children:"(排名不分先后)"})]}),l.jsx(oX,{children:l.jsxs(sX,{children:[l.jsx(hm,{children:l.jsxs(mm,{children:[l.jsx(pm,{src:qK}),l.jsx(gm,{children:l.jsxs(vm,{children:[Jp.map(({avatar:e,name:t,url:r})=>l.jsxs(Uo,{onClick:()=>window.open(r),children:[l.jsx($o,{src:e}),l.jsx(Bo,{children:t})]},t)),Jp.map(({avatar:e,name:t,url:r})=>l.jsxs(Uo,{onClick:()=>window.open(r),children:[l.jsx($o,{src:e}),l.jsx(Bo,{children:t})]},t))]})})]})}),l.jsx(hm,{children:l.jsxs(mm,{children:[l.jsx(pm,{src:ZK}),l.jsx(gm,{children:l.jsxs(vm,{children:[e0.map(e=>l.jsxs(Uo,{children:[l.jsx($o,{src:e.avatar}),l.jsx(Bo,{children:e.name})]},e.name)),e0.map(e=>l.jsxs(Uo,{children:[l.jsx($o,{src:e.avatar}),l.jsx(Bo,{children:e.name})]},e.name))]})})]})}),l.jsx(hm,{children:l.jsxs(mm,{children:[l.jsx(pm,{src:JK}),l.jsx(gm,{children:l.jsxs(vm,{children:[c2.map(e=>l.jsxs(Uo,{children:[l.jsx($o,{src:e.avatar}),l.jsx(Bo,{children:e.name})]},e.name)),c2.map(e=>l.jsxs(Uo,{children:[l.jsx($o,{src:e.avatar}),l.jsx(Bo,{children:e.name})]},e.name))]})})]})})]})})]}),lX=dO([{path:"/",element:l.jsx(eL,{}),children:[{path:"",element:l.jsx(w6,{})},{path:"products",element:l.jsx(pw,{})},{path:"products/:sectionId",element:l.jsx(pw,{})},{path:"rdma",element:l.jsx(G6,{})},{path:"service",element:l.jsx(lN,{})},{path:"app",element:l.jsx(gN,{})},{path:"solutions",element:l.jsx(xw,{})},{path:"solutions/:sectionId",element:l.jsx(xw,{})},{path:"community",element:l.jsx(Sw,{})},{path:"community",element:l.jsx(Sw,{})},{path:"resources2",element:l.jsx(Tw,{})},{path:"resources2/:sectionId",element:l.jsx(Tw,{})},{path:"clients",element:l.jsx(Rw,{})},{path:"clients/:sectionId",element:l.jsx(Rw,{})},{path:"company1",element:l.jsx(Pw,{})},{path:"company1/:sectionId",element:l.jsx(Pw,{})},{path:"company2",element:l.jsx(Nw,{})},{path:"company2/:sectionId",element:l.jsx(Nw,{})},{path:"tech-talk",element:l.jsx(Lc,{})},{path:"oss-showcase",element:l.jsx(Lc,{})},{path:"rust-showcase",element:l.jsx(Lc,{})},{path:"hardware-acceleration",element:l.jsx(Lc,{})},{path:":title",element:l.jsx(Q9,{})},{path:":section/:title",element:l.jsx(uW,{})},{path:"job-description",element:l.jsx($W,{})},{path:"job-description/:key",element:l.jsx(DG,{})},{path:"MIT",element:l.jsx(l2,{})},{path:"community/mit",element:l.jsx(l2,{})},{path:"MIT/rank",element:l.jsx(aX,{})}]}]),cX={themeDark:"#0A061F",themeDark02:"#42424A",secondary01:"#7680DD",secondary02:"#D9DBEF",secondary07:"#F2994A",secondary08:"#FDCB6E",gray03:"#828282",gray04:"#4F4F4F",gray007:"#272D37",white00:"#fff"};function Kr(e){for(var t=arguments.length,r=Array(t>1?t-1:0),n=1;n3?t.i-4:t.i:Array.isArray(e)?1:lv(e)?2:cv(e)?3:0}function xs(e,t){return Qs(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function uX(e,t){return Qs(e)===2?e.get(t):e[t]}function Vk(e,t,r){var n=Qs(e);n===2?e.set(t,r):n===3?e.add(r):e[t]=r}function Hk(e,t){return e===t?e!==0||1/e==1/t:e!=e&&t!=t}function lv(e){return gX&&e instanceof Map}function cv(e){return vX&&e instanceof Set}function ro(e){return e.o||e.t}function uv(e){if(Array.isArray(e))return Array.prototype.slice.call(e);var t=Uk(e);delete t[Je];for(var r=Ss(t),n=0;n1&&(e.set=e.add=e.clear=e.delete=dX),Object.freeze(e),t&&Co(e,function(r,n){return dv(n,!0)},!0)),e}function dX(){Kr(2)}function fv(e){return e==null||typeof e!="object"||Object.isFrozen(e)}function wn(e){var t=i0[e];return t||Kr(18,e),t}function fX(e,t){i0[e]||(i0[e]=t)}function t0(){return xl}function ym(e,t){t&&(wn("Patches"),e.u=[],e.s=[],e.v=t)}function Ju(e){r0(e),e.p.forEach(hX),e.p=null}function r0(e){e===xl&&(xl=e.l)}function u2(e){return xl={p:[],l:xl,h:e,m:!0,_:0}}function hX(e){var t=e[Je];t.i===0||t.i===1?t.j():t.g=!0}function wm(e,t){t._=t.p.length;var r=t.p[0],n=e!==void 0&&e!==r;return t.h.O||wn("ES5").S(t,e,n),n?(r[Je].P&&(Ju(t),Kr(4)),ni(e)&&(e=ed(t,e),t.l||td(t,e)),t.u&&wn("Patches").M(r[Je].t,e,t.u,t.s)):e=ed(t,r,[]),Ju(t),t.u&&t.v(t.u,t.s),e!==Fk?e:void 0}function ed(e,t,r){if(fv(t))return t;var n=t[Je];if(!n)return Co(t,function(c,d){return d2(e,n,t,c,d,r)},!0),t;if(n.A!==e)return t;if(!n.P)return td(e,n.t,!0),n.t;if(!n.I){n.I=!0,n.A._--;var i=n.i===4||n.i===5?n.o=uv(n.k):n.o,o=i,a=!1;n.i===3&&(o=new Set(i),i.clear(),a=!0),Co(o,function(c,d){return d2(e,n,i,c,d,r,a)}),td(e,i,!1),r&&e.u&&wn("Patches").N(n,r,e.u,e.s)}return n.o}function d2(e,t,r,n,i,o,a){if($i(i)){var c=ed(e,i,o&&t&&t.i!==3&&!xs(t.R,n)?o.concat(n):void 0);if(Vk(r,n,c),!$i(c))return;e.m=!1}else a&&r.add(i);if(ni(i)&&!fv(i)){if(!e.h.D&&e._<1)return;ed(e,i),t&&t.A.l||td(e,i)}}function td(e,t,r){r===void 0&&(r=!1),!e.l&&e.h.D&&e.m&&dv(t,r)}function _m(e,t){var r=e[Je];return(r?ro(r):e)[t]}function f2(e,t){if(t in e)for(var r=Object.getPrototypeOf(e);r;){var n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=Object.getPrototypeOf(r)}}function bi(e){e.P||(e.P=!0,e.l&&bi(e.l))}function xm(e){e.o||(e.o=uv(e.t))}function n0(e,t,r){var n=lv(t)?wn("MapSet").F(t,r):cv(t)?wn("MapSet").T(t,r):e.O?function(i,o){var a=Array.isArray(i),c={i:a?1:0,A:o?o.A:t0(),P:!1,I:!1,R:{},l:o,t:i,k:null,o:null,j:null,C:!1},d=c,h=Sl;a&&(d=[c],h=Ta);var g=Proxy.revocable(d,h),v=g.revoke,x=g.proxy;return c.k=x,c.j=v,x}(t,r):wn("ES5").J(t,r);return(r?r.A:t0()).p.push(n),n}function mX(e){return $i(e)||Kr(22,e),function t(r){if(!ni(r))return r;var n,i=r[Je],o=Qs(r);if(i){if(!i.P&&(i.i<4||!wn("ES5").K(i)))return i.t;i.I=!0,n=h2(r,o),i.I=!1}else n=h2(r,o);return Co(n,function(a,c){i&&uX(i.t,a)===c||Vk(n,a,t(c))}),o===3?new Set(n):n}(e)}function h2(e,t){switch(t){case 2:return new Map(e);case 3:return Array.from(e)}return uv(e)}function pX(){function e(o,a){var c=i[o];return c?c.enumerable=a:i[o]=c={configurable:!0,enumerable:a,get:function(){var d=this[Je];return Sl.get(d,o)},set:function(d){var h=this[Je];Sl.set(h,o,d)}},c}function t(o){for(var a=o.length-1;a>=0;a--){var c=o[a][Je];if(!c.P)switch(c.i){case 5:n(c)&&bi(c);break;case 4:r(c)&&bi(c)}}}function r(o){for(var a=o.t,c=o.k,d=Ss(c),h=d.length-1;h>=0;h--){var g=d[h];if(g!==Je){var v=a[g];if(v===void 0&&!xs(a,g))return!0;var x=c[g],k=x&&x[Je];if(k?k.t!==v:!Hk(x,v))return!0}}var C=!!a[Je];return d.length!==Ss(a).length+(C?0:1)}function n(o){var a=o.k;if(a.length!==o.t.length)return!0;var c=Object.getOwnPropertyDescriptor(a,a.length-1);if(c&&!c.get)return!0;for(var d=0;d1?y-1:0),b=1;b1?g-1:0),x=1;x=0;i--){var o=n[i];if(o.path.length===0&&o.op==="replace"){r=o.value;break}}i>-1&&(n=n.slice(i+1));var a=wn("Patches").$;return $i(r)?a(r,n):this.produce(r,function(c){return a(c,n)})},e}(),xr=new wX,$k=xr.produce;xr.produceWithPatches.bind(xr);xr.setAutoFreeze.bind(xr);xr.setUseProxies.bind(xr);xr.applyPatches.bind(xr);xr.createDraft.bind(xr);xr.finishDraft.bind(xr);function bl(e){return bl=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},bl(e)}function _X(e,t){if(bl(e)!=="object"||e===null)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t||"default");if(bl(n)!=="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function xX(e){var t=_X(e,"string");return bl(t)==="symbol"?t:String(t)}function SX(e,t,r){return t=xX(t),t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function v2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function y2(e){for(var t=1;t"u"&&(r=t,t=void 0),typeof r<"u"){if(typeof r!="function")throw new Error(Ft(1));return r(Bk)(e,t)}if(typeof e!="function")throw new Error(Ft(2));var i=e,o=t,a=[],c=a,d=!1;function h(){c===a&&(c=a.slice())}function g(){if(d)throw new Error(Ft(3));return o}function v(D){if(typeof D!="function")throw new Error(Ft(4));if(d)throw new Error(Ft(5));var E=!0;return h(),c.push(D),function(){if(E){if(d)throw new Error(Ft(6));E=!1,h();var w=c.indexOf(D);c.splice(w,1),a=null}}}function x(D){if(!bX(D))throw new Error(Ft(7));if(typeof D.type>"u")throw new Error(Ft(8));if(d)throw new Error(Ft(9));try{d=!0,o=i(o,D)}finally{d=!1}for(var E=a=c,y=0;y"u")throw new Error(Ft(12));if(typeof r(void 0,{type:rd.PROBE_UNKNOWN_ACTION()})>"u")throw new Error(Ft(13))})}function CX(e){for(var t=Object.keys(e),r={},n=0;n"u")throw h&&h.type,new Error(Ft(14));v[k]=E,g=g||E!==D}return g=g||o.length!==Object.keys(d).length,g?v:d}}function nd(){for(var e=arguments.length,t=new Array(e),r=0;r0&&o[o.length-1])&&(h[0]===6||h[0]===2)){r=0;continue}if(h[0]===3&&(!o||h[1]>o[0]&&h[1]{e.value+=1},decrement:e=>{e.value-=1},incrementByAmount:(e,t)=>{e.value+=t.payload}}}),tQ=eQ.reducer,rQ=FX({reducer:{counter:tQ}});Cm.createRoot(document.getElementById("root")).render(l.jsx(i4,{store:rQ,children:l.jsxs(gP,{theme:cX,children:[l.jsx(o4,{}),l.jsx(rO,{router:lX})]})}))});export default nQ(); diff --git a/zh-cn/assets/index-9d58af8c.js b/zh-cn/assets/index-d7149101.js similarity index 96% rename from zh-cn/assets/index-9d58af8c.js rename to zh-cn/assets/index-d7149101.js index d2babfb..c16ae0f 100644 --- a/zh-cn/assets/index-9d58af8c.js +++ b/zh-cn/assets/index-d7149101.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/image1-b974e0d0.png",i="/zh-cn/assets/image2-599a44cc.jpg",a="data:image/png;base64,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",A="data:image/png;base64,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",o="/zh-cn/assets/image5-184dc93a.png",r="/zh-cn/assets/image6-18c75b26.jpg",n="/zh-cn/assets/image7-6a4a9bfe.png",t="/zh-cn/assets/image8-1849dbeb.png",s="/zh-cn/assets/image9-14a6fe14.jpg",p="/zh-cn/assets/image5-6a5e807d.png",g=[e,i,a,A,o,r,n,t,s,p],l={label:"精彩回顾 l SpinalHDL应用前景探索线上研讨会",description:"2022年12月16日,达坦科技联合SpinalHDL社区,举办了SpinalHDL Webinar 2022。在题为《SpinalHDL应用前景探索》的线上研讨会上,九位分享人在三个讨论分主题下做了各自领域内应用Spinal HDL的实践、挑战和经验的分享。",location:"中国香港",date:"2022-12-12",title:"SpinalHDL Application Prospect Exploration Online Seminar"},C=[{label:"数据通路加速",level:2},{label:"复杂系统设计案例",level:2},{label:"硬件设计流程",level:2},{label:"推荐阅读",level:2}],h=`

        2022 年 12 月 16 日,达坦科技联合 SpinalHDL 社区,举办了 SpinalHDL Webinar 2022。在题为《SpinalHDL 应用前景探索》的线上研讨会上,九位分享人在三个讨论分主题下做了各自领域内应用 Spinal HDL 的实践、挑战和经验的分享。

        +const e="/zh-cn/assets/image1-b974e0d0.png",i="/zh-cn/assets/image2-599a44cc.jpg",a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaQAAAGkCAMAAABJkqEHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAB6VBMVEXw8PBMutP8/Pzx8fH9/f3u7u7v7+/p6eny8vL5+fn19fX6+vrt7e339/f09PT4+Pj7+/v+/v5lZWV4eHiJiYm2trbo6OhtbW329vbk5OScnJz///+zs7NxcXHExMSampp7e3tRUVHq6urX19fU1NTr6+vd3d3T09PMzMywsLDi4uKTk5NQUFBJSUlaWlpHR0egoKBNTU25ubnn5+fm5uZjY2POzs7f39+pqanj4+NTU1OlpaWnp6e8vLzs7Ox9fX3V1dXCwsKYmJhFRUXb29vl5eXz8/O9vb26urqxsbHLy8tZWVleXl5UVFRKSkq3t7fc3NzW1taOjo51dXXAwMBSUlKtra2VlZVwcHDe3t6KiorR0dGRkZHGxsZiYmKsrKx2dnafn5+/v795eXlubm6jo6NkZGSFhYW+vr6bm5uWlpbNzc2UlJRfX1+mpqbKyspLS0tISEjIyMjh4eGNjY27u7tzc3N3d3ehoaG4uLjg4OBycnLJycnQ0NCZmZmkpKRMTExPT090dHRhYWHZ2dmQkJCenp7a2tpGRkZ/f39mZmaDg4N8fHy1tbXPz8/BwcGvr6+rq6tOTk7S0tJXV1eysrKBgYHFxcWqqqpWVlZVVVVnZ2ddXV2AgICLi4udnZ1sbGyMjIyIiIjnvf5nAAAAAWJLR0QbAmDUpAAACEpJREFUeNrtl/t/09Udhz9LDmnyzfWArYGDrQVLpRhiSbErl8gMjYpuIm4gMJwydG4ThpMNwW1axqbC5i6oc25zur90r/TCym6v1zr18D4+zw9pe9K0T97PK9+mZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwf/Il+CwhkgBEEoBIAhBJACIJQCQBiCQAkQQgkgBEEoBIAhBJACIJQCQBiCQAkQQgkgBEEoBIAhBJACIJQCQBiCQAkQQgkgBEEoBIAhBJACIJQCQBiCQAkQQgkgBEEoBIAhBJACIJQCQBiCQAkQQgkgBEEoBIAhBJACIJQCQBiCQAkQQgkgBEEoBIAhBJACIJQCQBiCQAkQQgkgBEEoBIAhBJACIJQCQBiCQAkQQgkgBEEoBIAhBJACIJQCQBPp1IpBaYl0hE0iX2pEQiUhrEnpRIREqD2JMSiUhpEHtSIhEpDWJPSiQipUHsSYlEpDSIPSmRiJQGsSclEpHSIPakRCJSGsSelEhESoPYkxKJSGkQe1IiESkNYk9KJCKlQexJiUSkNIg9KZGIlAaxJyUSkdIg9qREIlIaxJ6USERKg9iTEolIaRB7UiIRKQ1iT0okIqVB7EmJRKQ0iD0pkYiUBrEnJRKR0iD2pEQiUhrEnpRIREqD2JMSiUhpEHtSIhEpDWJPSiQipUHsSYlEpDSIPSmRiJQGsSclEpHSIPakRCJSGsSeNPF5byeIJACRBCCSAEQSgEgCEEkAIglAJAGIJACRBCCSAEQSgEgCEEkAIglAJAGIJACRBCCSAEQSgEgCEEkAIglAJAGIJACRBCCSAEQSgEgCEEkAIglAJAGIJACRBCCSAEQSgEgCEEkAIglAJAGIJACRBCCSAEQSgEgCEEkAIglAJAGIJACRBCCSAEQSgEgCEEkAIglAJAGIJACRBCCSAEQSgEgCEEkAIglAJAGIJACRBCCSAEQSgEgCEEmA2yoSLkT6YrvcVjK4CMjgIiCDi4AMLgIyuAjI4CIgg4uADC4CMrgIyOAiIIOLgAwuAjK4CMjgIiCDi4AMLgIyuAjI4CIgg4uADC4CMrgIyOAiIIOLgAwuAjK4CMjgIiCDi4AMLgIyuAjI4CIgg4uADC4CMrgIyOAiIIOLgAwuAjK4CMjgIiCDi4AMLgIyuAjI4CIgg4uADC4CMrgIyOAiIIOLgAwuAjK4CMjgIiCDi4AMLgIyuAjI4CIgg4uADC4CMrgIyOAiIIOLgAwuAjK4CMjgIiCDi4AMLgIyuAjI4CIgg4uADC4CMrgIyOAiIIOLgAwuAjK4CMjgIiCDi4AMLgIyuAjI4CIgg4uADC4CMrgIyOAiIIOLgAwuAjK4CMjgIiCDi4AMLgIyuAjI4CIgg4uADC4CMrgIyOAiIIOLgAwuAjK4CMjgIiCDi4AMLgIyuAjI4CIgg4uADC4CMrgIyOAiIIOLgAwuAjK4CMjgIiCDi4AMLgIyuAjI4CIgg4uADC4CMrgIyOAiIIOLgAwuAjK4CMjgIiCDi4AMLgIyuAjI4CIgg4uADC4CMrgIyOAiIIOLgAwuAjK4CMjgIiCDi4AMLgIyuAjI4AIAAAAAAHD7kMvHNoD/jltiXWwP+I8U3ApDq06LJTPLypXBbXXlsFZvFPNWzyqWlc3Mr+G31Yqxn68kzrn1zrkNdzi3+rg0XLBs5E4za27cFLz3warlsPmu8lB9dMyyobvNwvgWK4bg6jcfVL31qlkM/3IVzW29J/YTFmTCudwg1LZJ5+5dfcf2kvfB+Xq+OrUj3NfaGdqV+8P0rk5nZnSs5LMt3oeybxbDzt0PzM4sP8Z/eW71jyiGPVP/9Otye/fFfsaC7F+52HUfPFBYfS36ykPjw9t77fbBELrhvvl8aJd8cM3+5MOPjNmjhx57/Kvha63WE2HP4SfdESs517dcCAVrOpdZ35V8eTlS5lxzcOAGdzkirYHh5UZPLX3oLx+XQ84sV7rfzHZ9/Ruh7H1oV46GY0/XjlcHl7vu5uB9wy91aJw42f3m3tlT+fBM+1tu87PVR/rhubH6cza4s+8f3pCd7odHd3zb77/Lxoj0vzO/FOeMc4NcTZctnz9/+IW+2zs/aVbc9p3ly50LteGTL24b/W6Wc/cePNr+3vdb84MO7qXtnXvqjfX5cPZA1RUb/tmO751r7vjB4M564fyhwvBJ//Kxbr71w+YmIq2Bxsr1zpw79crNdw+14tO5jeNTD8xbvTQRqs6Hdq0cLjw4O7SuPNWfmmwfa2x3P/rx4JWU9xdH3dwT5fP5cHZrdfbl8fHeAd+23KuXFiNdfs3KP9nne936K2f4m7Q2Jtyt/HTpuFabaT7zM8u/Xg6Xd5/tnX/jfK90KUyvqxye2bVw5dDBKzYRLu85VQw7Z8rN9oj9/GquZbmLV4u5X+Qz6w8iPX8pPD5n/fKFov/lOd+2Wv2OvifSmnjz1kinFw/zrvTmxQ0T+YmnZo++9drhpe98O0x3rl2ZHL4wkY1cr/q5dfsHb8EblV9dKc4Xs1zLsub83OxII/v1SqQQQvdqt7xx4R3fNjveb2b8TVoT7lrlN/tuXvTcyOJhfWj9b4ecd42pd47sK/kBJRsJ0x2z+uhY1Z08Xvzd7x96ctvQjV7v3RMd23pmz/WW2abpE/beYwvvV/7QNnvhgxu9Xq93+oM/fnjOBgeFHQt/2k2ktbD4r8zBlUavLp8eObfxpT9PtxY+PFIxu7s94C/W6XXM7KMx++u7ez++fsNevPOT2PZfKFbeiheWv54o/JtvKmwZnHYri5/bP27hc6Ly0bW/nX3dfQo/CT5jeGUAAAAAAAAAAMDnwN8BwcoFWcUDpPsAAAAASUVORK5CYII=",A="data:image/png;base64,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",r="/zh-cn/assets/image5-184dc93a.png",o="/zh-cn/assets/image6-18c75b26.jpg",n="/zh-cn/assets/image7-6a4a9bfe.png",t="/zh-cn/assets/image8-1849dbeb.png",s="/zh-cn/assets/image9-14a6fe14.jpg",g="/zh-cn/assets/image5-6a5e807d.png",p=[e,i,a,A,r,o,n,t,s,g],l={label:"精彩回顾 l SpinalHDL应用前景探索线上研讨会",description:"2022年12月16日,达坦科技联合SpinalHDL社区,举办了SpinalHDL Webinar 2022。在题为《SpinalHDL应用前景探索》的线上研讨会上,九位分享人在三个讨论分主题下做了各自领域内应用Spinal HDL的实践、挑战和经验的分享。",location:"中国香港",date:"2022-12-12",title:"SpinalHDL Application Prospect Exploration Online Seminar"},h=[{label:"数据通路加速",level:2},{label:"复杂系统设计案例",level:2},{label:"硬件设计流程",level:2},{label:"推荐阅读",level:2}],C=`

        2022 年 12 月 16 日,达坦科技联合 SpinalHDL 社区,举办了 SpinalHDL Webinar 2022。在题为《SpinalHDL 应用前景探索》的线上研讨会上,九位分享人在三个讨论分主题下做了各自领域内应用 Spinal HDL 的实践、挑战和经验的分享。

        数据通路加速

        图片

        分享人:Tianrui Li

        @@ -21,12 +21,12 @@ const e="/zh-cn/assets/image1-b974e0d0.png",i="/zh-cn/assets/image2-599a44cc.jpg

        演讲主题: SpinalHDL in Computer Architecture Research. A) MicroRV32 Platform and B) FPGA-based Heterogeneous Real-Time Systems with RISC-V

        演讲摘要: The presentation covers two topics in which SpinalHDL aided in the Research of Computer Architecture. MicroRV32 is a RISC-V SoC Platform built with SpinalHDL for research and education aligned along a RISC-V Virtual Prototype in SystemC TLM. The second topic covers a topic on Task Mapping and Scheduling in FPGA-based Heterogeneous Real-time Systems. There the VexRiscv-based Murax SoC was used on an FPGA as a Heterogeneous Real-time System for a Case-Study.


        -

        图片

        +

        图片

        分享人:Distributed

        演讲主题: Title: Coding a microprogrammed protocol receiver in SpinalHDL

        演讲摘要: This presentation introduces a microcode-like approach to coding a communications protocol receiver used in flying, handheld and stationary 3D scanners. Decoding the protocol in random logic leads to unattractively high resource usage. Therefore, a microprogrammed approach was chosen where data out of preprogrammed memories controls the rather regularly organized data path. The talk highlights the construction of the microinstructions and their physical representation, showing how code evaluated at Scala runtime can be elegantly intertwined with Spinal code representing hardware.


        -

        图片

        +

        图片

        分享人:Dolu1990

        演讲主题: NaxRiscv : A Pipeline / Plugins / SpinalHDL / Scala mix

        演讲摘要: This presentation / live demo shows how the NaxRiscv project (Out-of-order / superscalar RISC-V CPU) mix Scala and the SpinalHDL API to describe its hardware. By many aspect, it goes beyond the VexRiscv project, and should provide some usefull / interresting design patterns for the public.

        @@ -48,9 +48,9 @@ const e="/zh-cn/assets/image1-b974e0d0.png",i="/zh-cn/assets/image2-599a44cc.jpg

        演讲摘要: The presentation shows how we can go from a simple plugin system for bus peripherals using register file generators to documentation using custom Sphinx plugins. Also shows some insight into ongoing development of a lab communication device for in-the-loop testing.


        对开源硬件感兴趣的朋友,欢迎添加小助手微信,加入达坦科技硬件群。

        -

        图片

        +

        图片

        目前达坦科技的硬件项目 TRIDENT,已经在 GitHub 上开源,欢迎参与讨论:
        https://github.com/datenlord/TRIDENT

        推荐阅读

        万字长文,详述 TRIDENT: Poseidon 哈希算法的硬件加速与实现!

        -

        精彩回顾|硬件敏捷开发与验证方法学研讨

        `;export{g as assetURLs,h as default,l as metadata,C as toc}; +

        精彩回顾|硬件敏捷开发与验证方法学研讨

        `;export{p as assetURLs,C as default,l as metadata,h as toc}; diff --git a/zh-cn/assets/index-c86a9a07.js b/zh-cn/assets/index-d72e9e88.js similarity index 86% rename from zh-cn/assets/index-c86a9a07.js rename to zh-cn/assets/index-d72e9e88.js index 81f5753..e6a2a97 100644 --- a/zh-cn/assets/index-c86a9a07.js +++ b/zh-cn/assets/index-d72e9e88.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-ccfdc2fa.jpg",e="/zh-cn/assets/image1-9be7272d.jpg",a="/zh-cn/assets/image2-20a7bcaa.jpg",n=[t,e,a],s={label:"DatenLord X Segmentfault直播预告 | CURP协议的工业化实践",description:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源的分布式KV存储Xline,针对多数据中心场景,实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性,方便业务系统实现多地多中心多活部署。",cover:"./cover.jpg",location:"新加坡",date:"2023-08-15",title:"DatenLord X Segmentfault Live Stream Preview l CURP Protocol in Industrial Practice"},o=[{label:"CURP 协议",level:2}],c=`

        图片

        +const t="/zh-cn/assets/cover-ccfdc2fa.jpg",e="/zh-cn/assets/image1-9be7272d.jpg",n="/zh-cn/assets/image2-20a7bcaa.jpg",a=[t,e,n],o={label:"DatenLord X Segmentfault直播预告 | CURP协议的工业化实践",description:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源的分布式KV存储Xline,针对多数据中心场景,实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性,方便业务系统实现多地多中心多活部署。",cover:"./cover.jpg",location:"新加坡",date:"2023-08-15",title:"DatenLord X Segmentfault Live Stream Preview l CURP Protocol in Industrial Practice"},s=[{label:"CURP 协议",level:2}],r=`

        图片

        CURP 协议

        传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord 推出开源的分布式 KV 存储 Xline,针对多数据中心场景,实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性,方便业务系统实现多地多中心多活部署。

        Xline 中所使用的共识协议,即非 Paxos ,也非 Raft,而是一种新的名为 Curp 的共识协议,其全称为 “Consistent Unordered Replication Protocol”。CURP 协议发表于 2019 年,其协议主要论述的是主从备份的场景,共识场景仅仅在附录中有简单表述,缺乏严肃验证。

        @@ -6,4 +6,4 @@ const t="/zh-cn/assets/cover-ccfdc2fa.jpg",e="/zh-cn/assets/image1-9be7272d.jpg"

        本次直播分享,达坦科技联合思否,邀请达坦科技的联合创始人兼 CTO 施继成做一个关于 CURP 协议的工业化实践的直播,分享将论述 CURP 协议的正确性,同时以 KV 存储软件 Xline 为例子讲述如何在工业产品中使用该共识算法。

        图片

        会议号:474-6575-9473

        -

        图片

        `;export{n as assetURLs,c as default,s as metadata,o as toc}; +

        图片

        `;export{a as assetURLs,r as default,o as metadata,s as toc}; diff --git a/zh-cn/assets/index-38e8d7df.js b/zh-cn/assets/index-dac1acc4.js similarity index 97% rename from zh-cn/assets/index-38e8d7df.js rename to zh-cn/assets/index-dac1acc4.js index 1f4cf8f..391d370 100644 --- a/zh-cn/assets/index-38e8d7df.js +++ b/zh-cn/assets/index-dac1acc4.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-3674aa81.jpg",s="/zh-cn/assets/image1-b73fb0ee.jpg",e=[t,s],n={label:"Rust唠嗑室:Xline-跨数据中心一致性管理",description:"随着互联网和云计算的业务规模越来越大,单个数据中心已经无法满足业务的需求,业务系统从单数据中心向多数据中心发展,多地多中心多活部署的需求也越来越普遍。多数据中心架构最大的挑战是,如何保证数据跨数据中心访问的一致性和性能。比如索引、权限、配置等这类需要跨数据中心共享访问的元数据,如何在多中心竞争修改的场景下,仍然能保持一致性,并且保证访问性能。",cover:"./cover.jpg",location:"中国香港",tags:["Xline"],date:"2022-10-11",title:"Rust Chat Room: Xline Cross Data Center Consistency Management"},o=[{label:"内容简介",level:2}],a=`

        图片

        +const t="/zh-cn/assets/cover-3674aa81.jpg",s="/zh-cn/assets/image1-b73fb0ee.jpg",e=[t,s],n={label:"Rust唠嗑室:Xline-跨数据中心一致性管理",description:"随着互联网和云计算的业务规模越来越大,单个数据中心已经无法满足业务的需求,业务系统从单数据中心向多数据中心发展,多地多中心多活部署的需求也越来越普遍。多数据中心架构最大的挑战是,如何保证数据跨数据中心访问的一致性和性能。比如索引、权限、配置等这类需要跨数据中心共享访问的元数据,如何在多中心竞争修改的场景下,仍然能保持一致性,并且保证访问性能。",cover:"./cover.jpg",location:"中国香港",tags:["Xline"],date:"2022-10-11",title:"Rust Chat Room_ Xline Cross Data Center Consistency Management"},o=[{label:"内容简介",level:2}],a=`

        图片

        内容简介

        随着互联网和云计算的业务规模越来越大,单个数据中心已经无法满足业务的需求,业务系统从单数据中心向多数据中心发展,多地多中心多活部署的需求也越来越普遍。多数据中心架构最大的挑战是,如何保证数据跨数据中心访问的一致性和性能。比如索引、权限、配置等这类需要跨数据中心共享访问的元数据,如何在多中心竞争修改的场景下,仍然能保持一致性,并且保证访问性能。

        传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord 推出开源的分布式 KV 存储 Xline,就是针对多数据中心场景,实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性,方便业务系统实现多地多中心多活部署。

        diff --git a/zh-cn/assets/index-4b956329.js b/zh-cn/assets/index-e197de7f.js similarity index 97% rename from zh-cn/assets/index-4b956329.js rename to zh-cn/assets/index-e197de7f.js index 9794106..2565054 100644 --- a/zh-cn/assets/index-4b956329.js +++ b/zh-cn/assets/index-e197de7f.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-12543354.png",s="/zh-cn/assets/image1-0a18e154.png",n="/zh-cn/assets/image2-e7e1943c.png",a="/zh-cn/assets/image3-5eef7eef.jpg",e=[t,s,n,a],l={label:"欢迎报名Rust China Hackathon 2022 达坦科技组",description:"12月4日下午,DatenLord就2022Rust China Hackathon大赛活动企业组(达坦科技组)的赛题进行了空中宣讲会。不仅对赛事流程进行了全面的讲解,同时对赛题背景以及完赛标准和要点进行了深入的剖析。会后更是设置问答环节,细致、详尽地解答了大家所提的各种问题,以便大家对赛题有更加充分的理解。",cover:"./cover.png",location:"中国香港",date:"2022-12-08",title:"Welcome to sign up for the Rust China Hackathon 2022 Datan Technology Group"},p=[{label:"赛事日程表",level:2},{label:"参赛福利",level:2},{label:"赛题评审",level:2},{label:"参赛及代码提交",level:2},{label:"赛题剖析",level:2},{label:"达坦科技 DatenLord 赛题",level:2}],o=`

        12 月 4 日下午,DatenLord 就 2022Rust China Hackathon 大赛活动企业组(达坦科技组)的赛题进行了空中宣讲会。不仅对赛事流程进行了全面的讲解,同时对赛题背景以及完赛标准和要点进行了深入的剖析。会后更是设置问答环节,细致、详尽地解答了大家所提的各种问题,以便大家对赛题有更加充分的理解。

        +const t="/zh-cn/assets/cover-12543354.png",s="/zh-cn/assets/image1-0a18e154.png",n="/zh-cn/assets/image2-e7e1943c.png",a="/zh-cn/assets/image3-5eef7eef.jpg",e=[t,s,n,a],l={label:"欢迎报名Rust China Hackathon 2022 达坦科技组",description:"12月4日下午,DatenLord就2022Rust China Hackathon大赛活动企业组(达坦科技组)的赛题进行了空中宣讲会。不仅对赛事流程进行了全面的讲解,同时对赛题背景以及完赛标准和要点进行了深入的剖析。会后更是设置问答环节,细致、详尽地解答了大家所提的各种问题,以便大家对赛题有更加充分的理解。",cover:"./cover.png",location:"中国香港",date:"2022-12-08",title:"Welcome to sign up for the Rust China Hackathon 2022 Datan Technology Group"},o=[{label:"赛事日程表",level:2},{label:"参赛福利",level:2},{label:"赛题评审",level:2},{label:"参赛及代码提交",level:2},{label:"赛题剖析",level:2},{label:"达坦科技 DatenLord 赛题",level:2}],p=`

        12 月 4 日下午,DatenLord 就 2022Rust China Hackathon 大赛活动企业组(达坦科技组)的赛题进行了空中宣讲会。不仅对赛事流程进行了全面的讲解,同时对赛题背景以及完赛标准和要点进行了深入的剖析。会后更是设置问答环节,细致、详尽地解答了大家所提的各种问题,以便大家对赛题有更加充分的理解。

        本届 Hackathon 为 Rust 中文社区举办的第一届的线上黑客马拉松,大赛主题为「RustForFun」,分为「社区组」与「企业组」。达坦科技作为本届 Hackathon 的协办方,赞助参与本次企业组赛道。希望借此机会激发大家对 Rust 语言的学习热情,提高应用 Rust 的能力,同时结识志趣相投的好友,一起进行思维的碰撞。

        赛事日程表

          @@ -62,4 +62,4 @@ Xline 是达坦科技推出的分布式元数据 KV 存储器。在使用中, }

          评估标准
          -你的实现应遵从上述 Trait 并满足上述要求。我们将使用一定基准测试来进行评估,并根据其结果评分。在基准测试中,我们将发送大量并发请求,因此你也可以创建自己的性能测试来帮助进行优化。

          `;export{e as assetURLs,o as default,l as metadata,p as toc}; +你的实现应遵从上述 Trait 并满足上述要求。我们将使用一定基准测试来进行评估,并根据其结果评分。在基准测试中,我们将发送大量并发请求,因此你也可以创建自己的性能测试来帮助进行优化。

          `;export{e as assetURLs,p as default,l as metadata,o as toc}; diff --git a/zh-cn/assets/index-9a698271.js b/zh-cn/assets/index-e5377dbd.js similarity index 91% rename from zh-cn/assets/index-9a698271.js rename to zh-cn/assets/index-e5377dbd.js index a5ae4d5..d72e177 100644 --- a/zh-cn/assets/index-9a698271.js +++ b/zh-cn/assets/index-e5377dbd.js @@ -1,4 +1,4 @@ -const i="/zh-cn/assets/cover-6865ae02.png",l=[i],t={label:"Xline v0.6.1: 一个用于元数据管理的分布式KV存储",description:"Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。但是,当跨数据中心部署时,节点之间的延迟可能是几十或几百毫秒,此时 Raft 协议将成为性能瓶颈。Curp 协议就是为了解决这个问题而设计的。它可以在命令不冲突的情况下减少一个RTT,从而提高性能。因此,Xline旨在实现高性能的数据访问和跨数据中心场景下的强一致性。",cover:"./cover.png",location:"新疆",author:["准备开社区会议的"],tags:["Xline"],date:"2024-01-18",title:"Xline v0.6.1: a distributed KV store for metadata management"},e=[{label:"Xline是什么?我们为什么要做Xline?",level:2},{label:"V0.6.1版本有什么新功能?",level:2},{label:"社区会议",level:2}],n=`

          封面

          +const l="/zh-cn/assets/cover-6865ae02.png",i=[l],e={label:"Xline v0.6.1: 一个用于元数据管理的分布式KV存储",description:"Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。但是,当跨数据中心部署时,节点之间的延迟可能是几十或几百毫秒,此时 Raft 协议将成为性能瓶颈。Curp 协议就是为了解决这个问题而设计的。它可以在命令不冲突的情况下减少一个RTT,从而提高性能。因此,Xline旨在实现高性能的数据访问和跨数据中心场景下的强一致性。",cover:"./cover.png",location:"新疆",author:["准备开社区会议的"],tags:["Xline"],date:"2024-01-18",title:"Xline v0.6.1_ a distributed KV store for metadata management"},t=[{label:"Xline是什么?我们为什么要做Xline?",level:2},{label:"V0.6.1版本有什么新功能?",level:2},{label:"社区会议",level:2}],n=`

          封面

          Xline是什么?我们为什么要做Xline?

          Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。 现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。

          但是,当跨数据中心部署时,节点之间的延迟可能是几十或几百毫秒,此时 Raft 协议将成为性能瓶颈。Curp 协议就是为了解决这个问题而设计的。它可以在命令不冲突的情况下减少一个RTT,从而提高性能。因此,Xline旨在实现高性能的数据访问和跨数据中心场景下的强一致性。

          @@ -36,4 +36,4 @@ const i="/zh-cn/assets/cover-6865ae02.png",l=[i],t={label:"Xline v0.6.1: 一 会议号: 874 4309 5241 密码: 124294 会议链接: -https://zoom.us/j/87443095241?pwd=r3uJhJ9cb0caovHRsi1ay2pFuhBA1Q.1

          `;export{l as assetURLs,n as default,t as metadata,e as toc}; +https://zoom.us/j/87443095241?pwd=r3uJhJ9cb0caovHRsi1ay2pFuhBA1Q.1

          `;export{i as assetURLs,n as default,e as metadata,t as toc}; diff --git a/zh-cn/assets/index-7df91a5f.js b/zh-cn/assets/index-e7093119.js similarity index 98% rename from zh-cn/assets/index-7df91a5f.js rename to zh-cn/assets/index-e7093119.js index fc0ec2a..9a572d6 100644 --- a/zh-cn/assets/index-7df91a5f.js +++ b/zh-cn/assets/index-e7093119.js @@ -1,4 +1,4 @@ -const s="/zh-cn/assets/image1-9c4bd64f.png",a="/zh-cn/assets/image2-ce452a63.png",n="/zh-cn/assets/image3-a687fa21.png",r=[s,a,n],e={label:"io_uring Rust 异步库实现方法",description:"io_uring 是 Linux 最新的异步 I/O 接口,采用两个用户和内核共享的 ring buffer 进行交互,性能优于之前的接口且限制更少。虽然 io_uring 仍然处于开发迭代中,但是基本的 I/O 接口已经基本定型,作为高效系统语言的 Rust 则成为使用该接口的不二之选。现在已经有许多针对 io_uring 的 Rust 封装,但是有的存在soundness问题,有的存在性能问题,都不是安全高效 I/O 的好选项。我们团队(DatenLord)也进行了自己的尝试,本文就是介绍我们的 io_uring 异步库实现方法。",location:"河南",author:["施继成"],editor:["张汉东"],tags:["Rust"],date:"2022-05-27",title:"io_uring Rust Asynchronous Library Implementation"},o=[{label:"简介",level:2},{label:"Rust 现有异步模式",level:2},{label:"io_uring Rust 底层封装",level:2},{label:"io_uring 异步模式",level:2},{label:"io_uring Proactor 设计",level:2},{label:"内存安全",level:2},{label:"总结",level:2}],i=`

          简介

          +const s="/zh-cn/assets/image1-9c4bd64f.png",a="/zh-cn/assets/image2-ce452a63.png",n="/zh-cn/assets/image3-a687fa21.png",r=[s,a,n],e={label:"io_uring Rust 异步库实现方法",description:"io_uring 是 Linux 最新的异步 I/O 接口,采用两个用户和内核共享的 ring buffer 进行交互,性能优于之前的接口且限制更少。虽然 io_uring 仍然处于开发迭代中,但是基本的 I/O 接口已经基本定型,作为高效系统语言的 Rust 则成为使用该接口的不二之选。现在已经有许多针对 io_uring 的 Rust 封装,但是有的存在soundness问题,有的存在性能问题,都不是安全高效 I/O 的好选项。我们团队(DatenLord)也进行了自己的尝试,本文就是介绍我们的 io_uring 异步库实现方法。",location:"河南",author:["施继成"],editor:["张汉东"],tags:["Rust"],date:"2022-05-27",title:"io_uring Rust Asynchronous Library Implementation"},o=[{label:"简介",level:2},{label:"Rust 现有异步模式",level:2},{label:"io_uring Rust 底层封装",level:2},{label:"io_uring 异步模式",level:2},{label:"io_uring Proactor 设计",level:2},{label:"内存安全",level:2},{label:"总结",level:2}],t=`

          简介

          io_uring 是 Linux 最新的异步 I/O 接口,采用两个用户和内核共享的 ring buffer 进行交互,性能优于之前的接口且限制更少。虽然 io_uring 仍然处于开发迭代中,但是基本的 I/O 接口已经基本定型,作为高效系统语言的 Rust 则成为使用该接口的不二之选。现在已经有许多针对 io_uring 的 Rust 封装,但是有的存在 soundness 问题,有的存在性能问题,都不是安全高效 I/O 的好选项。我们团队(DatenLord)也进行了自己的尝试,本文就是介绍我们的 io_uring 异步库实现方法。

          Rust 现有异步模式

          Rust 的异步库都有自己的异步 I/O 实现方法,但是内部原理大同小异,都是 Reactor 模式,如下图所示:

          @@ -32,4 +32,4 @@ const s="/zh-cn/assets/image1-9c4bd64f.png",a="/zh-cn/assets/image2-ce452a63.png

          在该接口中用户会在 I/O 操作过程中交出 buffer 所有权,在任务完成时返还 buffer 所有权。

          总结

          现有的 Rust 异步 I/O 模型(Reactor)其实分为两步,第一步由操作系统通知用户哪些 fd 可以使用,第二步再由用户完成 I/O 操作,操作系统仅仅负责通知,真正干活的还是用户自己。区别于该 I/O 模型,io_uring 的 I/O 模型为 Proactor,所有的异步 I/O 请求都是操作系统来完成,用户仅仅需要发送请求和接收结果。

          -

          我们 DatenLord 团队在充分考虑了 io_uring 特点和 Rust 语言的需求后实现了一个 io_uring 的异步库。这个库同时照顾到性能和易用性,方便用户迁移现有代码,同时该库不依赖于任何一部框架,可以和绝大多数已知的异步框架一起使用。

          `;export{r as assetURLs,i as default,e as metadata,o as toc}; +

          我们 DatenLord 团队在充分考虑了 io_uring 特点和 Rust 语言的需求后实现了一个 io_uring 的异步库。这个库同时照顾到性能和易用性,方便用户迁移现有代码,同时该库不依赖于任何一部框架,可以和绝大多数已知的异步框架一起使用。

          `;export{r as assetURLs,t as default,e as metadata,o as toc}; diff --git a/zh-cn/assets/index-ef64e907.js b/zh-cn/assets/index-ef64e907.js new file mode 100644 index 0000000..48135a3 --- /dev/null +++ b/zh-cn/assets/index-ef64e907.js @@ -0,0 +1,100 @@ +const p="/zh-cn/assets/cover-7357bfdb.png",l="/zh-cn/assets/image1-cce42aaf.png",t="/zh-cn/assets/image-f331755a.png",i=[p,l,t],o={label:"【最新招聘】3!2!1!Offer上链接!",description:"我们是谁?达坦科技始终致力于打造高性能Al+ Cloud 基础设施平台DatenLord,积极推动AI应用的落地。DatenLord通过软硬件深度融合的方式,提供高性能存储和高性能网络。为AI 应用提供弹性、便利、经济的基础设施服务,以此满足不同行业客户对AI+Cloud 的需求。",cover:"./cover.png",location:"中国香港",date:"2024-06-27",title:"Latest Recruitment 3 2 1 Offer Link"},n=[{label:"我们是怎样一群人",level:2},{label:"我们的公司文化是怎样的",level:2},{label:"达坦科技最新开放招聘岗位",level:2},{label:"面试流程及薪资待遇",level:2}],s=`

          我们是谁?

          +

          达坦科技始终致力于打造高性能Al+ Cloud 基础设施平台DatenLord,积极推动AI应用的落地。DatenLord通过软硬件深度融合的方式,提供高性能存储和高性能网络。为AI 应用提供弹性、便利、经济的基础设施服务,以此满足不同行业客户对AI+Cloud 的需求。 +图片

          +

          我们是怎样一群人

          +

          达坦科技创始团队均来自谷歌、微软、阿里等知名科技公司,团队成员都是一群喜欢并勇于探索前沿技术的同学,大家因为对技术的热爱而聚到一起。 +在这里我们不局限于工作职责本身,更鼓励大家能勤于思考学习,找到自己感兴趣的事情,创造更多价值。

          +

          我们的公司文化是怎样的

          +

          持续学习 持之以恒的自驱学习,求真求致

          +

          积极主动 遇到问题主动踏出第一步,做先行者而不是追随者

          +

          精益求精 对自己高标准严要求,对创新有极致追求 +与一群真正热爱自己所做的事情并追求挑战的人为伍!

          +

          达坦科技最新开放招聘岗位

          +

          职位名称:机器学习实习工程师

          +

          职位类型:实习

          +

          工作时间:全职/兼职

          +

          职位描述

          +

          我们正在寻找一位充满热情并有志于在机器学习领域发展的实习工程师,加入我们的技术团队。作为机器学习实习工程师,你将有机会参与实际项目,应用最新的机器学习技术,并在资深工程师的指导下不断提升自己的技能。

          +

          主要职责

          +
            +
          • +

            参与机器学习模型的设计、开发和优化

            +
          • +
          • +

            参与数据预处理、特征工程和数据可视化

            +
          • +
          • +

            参与收集、清洗和分析大型数据集

            +
          • +
          • +

            实施和评估机器学习算法和模型

            +
          • +
          • +

            编写高质量、可维护的代码

            +
          • +
          • +

            参与团队讨论,分享研究成果和技术难点

            +
          • +
          • +

            撰写技术文档和报告

            +
          • +
          +

          职位要求:

          +
            +
          • +

            计算机科学、数据科学、人工智能或相关专业的本科或研究生在读

            +
          • +
          • +

            对机器学习和数据科学有浓厚的兴趣,并有相关课程或项目经验

            +
          • +
          • +

            熟悉Python编程语言及相关数据科学库(如NumPy、Pandas、Scikit-learn等)

            +
          • +
          • +

            了解常见的机器学习算法(如线性回归、决策树、SVM、神经网络等)

            +
          • +
          • +

            良好的数据处理和分析能力

            +
          • +
          • +

            较强的逻辑思维和问题解决能力

            +
          • +
          • +

            良好的团队合作和沟通能力

            +
          • +
          • +

            有相关实习或项目经验者优先

            +
          • +
          +

          加分项:

          +
            +
          • +

            熟悉深度学习框架(如TensorFlow、PyTorch等)

            +
          • +
          • +

            了解自然语言处理、计算机视觉或强化学习等领域的相关知识

            +
          • +
          • +

            有Kaggle竞赛经验或公开发布的机器学习项目

            +
          • +
          +

          面试流程及薪资待遇

          +

          【如何申请】

          +

          有意向的同学可以发送简历至:info@datenlord.com

          +

          或者添加达坦科技小助手微信:DatenLord_Tech +【面试流程】

          +

          简历评估合格后,面试流程为: +图片 +具体面试流程会根据候选人的情况略有调整。

          +

          【薪资待遇】

          +

          **实习生:**入职初期为300元/天,如能力和产出优秀将予以薪资调增,最高500元/天。

          +

          **正式员工:**对标国内一线大厂的薪资+期权,待面试通过后根据能力情况确定。

          +

          【更多官方信息】

          +

          【公众号】达坦科技DatenLord

          +

          【知乎账号】

          +

          https://www.zhihu.com/org/da-tan-ke-ji

          +

          【B站】

          +

          https://space.bilibili.com/2017027518

          +

          我们相信物以类聚、人以群分,希望找到同样富有激情的你,一起成长~

          +

          更多信息,可扫描下方二维码加微信咨询: +图片

          `;export{i as assetURLs,s as default,o as metadata,n as toc}; diff --git a/zh-cn/assets/index-9edebc8f.js b/zh-cn/assets/index-f210af05.js similarity index 98% rename from zh-cn/assets/index-9edebc8f.js rename to zh-cn/assets/index-f210af05.js index 5b7b69e..82a4c53 100644 --- a/zh-cn/assets/index-9edebc8f.js +++ b/zh-cn/assets/index-f210af05.js @@ -1,4 +1,4 @@ -const v="/zh-cn/assets/cover-92745c95.jpg",e="/zh-cn/assets/image1-638abd39.png",s="/zh-cn/assets/image2-2a8f796e.gif",p="/zh-cn/assets/image3-ae1841b7.png",a="/zh-cn/assets/image4-5bf432ec.png",n="/zh-cn/assets/image5-81eb5b8d.png",l="/zh-cn/assets/image6-537c8738.png",o="/zh-cn/assets/image7-b58de99e.png",i="/zh-cn/assets/image8-c6334c83.png",t="/zh-cn/assets/image9-6340ddaa.png",c="/zh-cn/assets/image10-ac1b70de.png",r="/zh-cn/assets/image11-1f1870d2.png",_="/zh-cn/assets/image12-01c249ea.png",m="/zh-cn/assets/image13-a48112ad.png",u="/zh-cn/assets/image14-d780d4f2.png",d="/zh-cn/assets/image15-f58a4d86.png",h="/zh-cn/assets/image16-79c3985b.png",k="/zh-cn/assets/image17-863e7adb.png",f="/zh-cn/assets/image18-931263d9.png",g="/zh-cn/assets/image19-8f35c101.png",P="/zh-cn/assets/image20-ef5a452f.png",j="/zh-cn/assets/image21-ebff1568.png",b="/zh-cn/assets/image22-b3b3dbaa.png",F="/zh-cn/assets/image23-12fff2c5.png",w=[v,e,s,p,a,n,l,o,i,t,c,r,_,m,u,d,h,k,f,g,P,j,b,F],T={label:"数据流式编程在硬件设计中的应用",description:"数据流式编程(Dataflow Programming)是一种存在已久的程序设计范式,可以追溯到19世纪60年代,由MIT的Jack Dennis教授开创。",cover:"./cover.jpg",location:"中国香港",author:["米明恒"],tags:["硬件加速"],date:"2023-10-26",title:"Application of data flow programming in hardware design"},y=[{label:"数据流式编程的思想",level:2},{label:"数据流式编程思想简介",level:3},{label:"软件开发中的数据流式编程思想",level:3},{label:"软件数据流 vs 硬件数据流",level:3},{label:"数据流思想与状态机思想的对比",level:3},{label:"Bluespec 语言及其流式编程框架 PAClib",level:2},{label:"Bluespec SystemVerilog(BSV)和 PAClib 简介",level:3},{label:"PAClib 中的基础开发组件",level:3},{label:"IFFT 应用实例",level:2},{label:"需求背景",level:3},{label:"代码实现",level:3},{label:"写在最后",level:2}],I=`

          数据流式编程的思想

          +const v="/zh-cn/assets/cover-92745c95.jpg",e="/zh-cn/assets/image1-638abd39.png",s="/zh-cn/assets/image2-2a8f796e.gif",p="/zh-cn/assets/image3-ae1841b7.png",a="/zh-cn/assets/image4-5bf432ec.png",n="/zh-cn/assets/image5-81eb5b8d.png",l="/zh-cn/assets/image6-537c8738.png",o="/zh-cn/assets/image7-b58de99e.png",i="/zh-cn/assets/image8-c6334c83.png",t="/zh-cn/assets/image9-6340ddaa.png",c="/zh-cn/assets/image10-ac1b70de.png",r="/zh-cn/assets/image11-1f1870d2.png",_="/zh-cn/assets/image12-01c249ea.png",m="/zh-cn/assets/image13-a48112ad.png",d="/zh-cn/assets/image14-d780d4f2.png",u="/zh-cn/assets/image15-f58a4d86.png",h="/zh-cn/assets/image16-79c3985b.png",k="/zh-cn/assets/image17-863e7adb.png",f="/zh-cn/assets/image18-931263d9.png",g="/zh-cn/assets/image19-8f35c101.png",b="/zh-cn/assets/image20-ef5a452f.png",j="/zh-cn/assets/image21-ebff1568.png",P="/zh-cn/assets/image22-b3b3dbaa.png",F="/zh-cn/assets/image23-12fff2c5.png",w=[v,e,s,p,a,n,l,o,i,t,c,r,_,m,d,u,h,k,f,g,b,j,P,F],T={label:"数据流式编程在硬件设计中的应用",description:"数据流式编程(Dataflow Programming)是一种存在已久的程序设计范式,可以追溯到19世纪60年代,由MIT的Jack Dennis教授开创。",cover:"./cover.jpg",location:"中国香港",author:["米明恒"],tags:["硬件加速"],date:"2023-10-26",title:"Application of data flow programming in hardware design"},S=[{label:"数据流式编程的思想",level:2},{label:"数据流式编程思想简介",level:3},{label:"软件开发中的数据流式编程思想",level:3},{label:"软件数据流 vs 硬件数据流",level:3},{label:"数据流思想与状态机思想的对比",level:3},{label:"Bluespec 语言及其流式编程框架 PAClib",level:2},{label:"Bluespec SystemVerilog(BSV)和 PAClib 简介",level:3},{label:"PAClib 中的基础开发组件",level:3},{label:"IFFT 应用实例",level:2},{label:"需求背景",level:3},{label:"代码实现",level:3},{label:"写在最后",level:2}],I=`

          数据流式编程的思想

          数据流式编程思想简介

          数据流式编程(Dataflow Programming)是一种存在已久的程序设计范式,可以追溯到 19 世纪 60 年代,由 MIT 的 Jack Dennis 教授开创。

          图片

          @@ -158,7 +158,7 @@ endinterface PipeOut #(Tuple2 #(a, Bool)) poa) (PipeOut #(b)); -

          图片

          +

          图片

          图 14 mkIfThenElse 节点示意图

          mkIfThenElse 可以实现分支逻辑。输入数据是一个 Tuple2#(a, Bool)类型,该节点会根据 Bool 类型的取值将数据包路由到 pipeT 或者 pipeF 子节点。其内部具有一个 FIFO 结构用于存储 Token,从而实现在 pipeT 和 pipeF 两个节点所需处理周期不一致时起到保序的作用。

          此外,PAClib 中还提供了 mkIfThenElse_unordered 变种实现,当对输入和输出之间的数据没有严格的顺序要求时,可以使用这个变种来简化设计。For 循环 使用 mkForLoop 可以创建条件分支,其定义及示意图如下:

          @@ -170,7 +170,7 @@ endinterface (PipeOut #(b)) provisos (Bits #(a, sa)); -

          图片

          +

          图片

          图 15 mkForLoop 节点示意图

          mkForLoop 需要通过 n_iters 参数传入循环次数。在实现逻辑上,Loop Control Logic 内部有一个共享队列,外部进入的新数据和经过循环体执行过一次处理的数据,都会被放到这个队列中。每个新进入的数据都会被打上一个 Tag,Tag 的值为循环次数,这个 Tag 伴随着数据在循环中流动,每流动一次,Tag 减一,Loop Control Logic 在从共享队列中取出数据时,会根据 Tag 的计数值决定将其送入 mkLoopBody 节点还是 mkFinal 节点。内部有两条 Rule,分别独立负责把新数据和正在循环的数据放入 FIFO 中,为循环提供了内在动力(图中 Pump 标注路径)。

          注意,由于 mkLoopBody 也可能是一个需要多拍才能完成的节点,因此可以有多个数据包同时在流水线中进行循环。

          @@ -261,7 +261,7 @@ endfunction f_radix4 (stagenum), param_buf_unfunnel); -

          图片

          +

          图片

          如上述代码片段和图 20 所示,通过 mkMap_fn_with_funnel_indexed 函数的第一个参数来决定实例化多少个 f_radix4 计算单元,从而改变计算的并行度。

              let permuter = mkFn_to_Pipe_Buffered (False, f_permute,
                                                       param_buf_permuter_output);
          @@ -273,7 +273,7 @@ endfunction
                                   mkCompose (mapper,
                                               mkCompose (ungrouper, permuter)));
           
          -

          图片

          +

          图片

          图 22 节点的串联

          如上述代码片段和图 22 所示,通过 mkCompose 可以实现多个 Node 之间的顺序连接。

          图片

          @@ -286,4 +286,4 @@ endfunction

          参考资料:

          [1] https://en.wikipedia.org/wiki/Dataflow_programming

          [2] Rishiyur S. Nikhil. Two uses of FP techniques in HW design[EB/OL]. 2010[].

          -

          http://www.cs.ox.ac.uk/ralf.hinze/WG2.8/27/slides/rishiyur2.pdf.

          `;export{w as assetURLs,I as default,T as metadata,y as toc}; +

          http://www.cs.ox.ac.uk/ralf.hinze/WG2.8/27/slides/rishiyur2.pdf.

          `;export{w as assetURLs,I as default,T as metadata,S as toc}; diff --git a/zh-cn/index.html b/zh-cn/index.html index 26875ab..7f5b06e 100644 --- a/zh-cn/index.html +++ b/zh-cn/index.html @@ -5,7 +5,7 @@ 达坦科技 - +