From 52824ffd807f9aaa867c72351459d27584681b24 Mon Sep 17 00:00:00 2001 From: LingKa Date: Mon, 22 Apr 2024 14:17:59 +0800 Subject: [PATCH] feat: deploy github page --- zh-cn/assets/cover-ca6ff87c.webp | Bin 0 -> 17818 bytes zh-cn/assets/cover-fa6a1661.webp | Bin 0 -> 39170 bytes zh-cn/assets/image1-78435096.webp | Bin 0 -> 22636 bytes .../{index-867a5cbc.js => index-012cd7f5.js} | 8 +- .../{index-3a32ad00.js => index-043be87f.js} | 4 +- .../{index-28199dec.js => index-067c93db.js} | 4 +- .../{index-5238cd79.js => index-0f5b2c4d.js} | 26 +- .../{index-85fa6207.js => index-1dde53bb.js} | 8 +- .../{index-cf17c7a4.js => index-1e46583f.js} | 4 +- .../{index-602219d3.js => index-1f0dff83.js} | 6 +- .../{index-7cf6760e.js => index-213034fe.js} | 4 +- .../{index-ef7b41da.js => index-25c20c62.js} | 4 +- .../{index-b1ba4736.js => index-29c0b7ce.js} | 4 +- .../{index-2e5b8302.js => index-2a76e7d1.js} | 260 +++++++++--------- .../{index-1409afbf.js => index-31f22a4e.js} | 4 +- .../{index-b2db3117.js => index-40aedb60.js} | 12 +- .../{index-fd018bec.js => index-4820dca7.js} | 4 +- .../{index-015cf939.js => index-500d1a02.js} | 4 +- .../{index-17fcbde5.js => index-5e43e574.js} | 4 +- .../{index-6bc730f7.js => index-69ce89cf.js} | 6 +- .../{index-d7fb28df.js => index-6a884c2a.js} | 8 +- .../{index-9cbd4195.js => index-6f20c5b7.js} | 4 +- .../{index-28241c38.js => index-6f8e9292.js} | 6 +- .../{index-22d5e656.js => index-71801d47.js} | 4 +- .../{index-eb1ecfd7.js => index-78a34e98.js} | 4 +- .../{index-d543ad74.js => index-7e0a1d2c.js} | 4 +- .../{index-962501d1.js => index-87f0525d.js} | 6 +- .../{index-2a54f9b1.js => index-8a16857f.js} | 4 +- .../{index-866fab75.js => index-8bf3af0a.js} | 4 +- .../{index-557885ec.js => index-8cb7e806.js} | 6 +- .../{index-2645d3b0.js => index-8f0491cb.js} | 4 +- .../{index-2a0835cc.js => index-917f23ec.js} | 4 +- zh-cn/assets/index-9e270336.js | 153 +++++++++++ .../{index-d4dfb508.js => index-a59ad30d.js} | 4 +- .../{index-6618c0b5.js => index-a5e56ae7.js} | 6 +- .../{index-f6182a9f.js => index-af83501f.js} | 16 +- .../{index-50ad21f0.js => index-b5bb516b.js} | 8 +- .../{index-89698b14.js => index-b9ee750d.js} | 4 +- .../{index-fe8c6311.js => index-bccae718.js} | 8 +- .../{index-fa30bf44.js => index-be0587a7.js} | 4 +- zh-cn/assets/index-d70f9808.js | 95 +++++++ .../{index-5968a39d.js => index-da95a700.js} | 4 +- .../{index-4b956329.js => index-e197de7f.js} | 4 +- .../{index-fbe14e17.js => index-f533d09f.js} | 4 +- .../{index-37f93c7b.js => index-f5cc00ea.js} | 4 +- zh-cn/assets/index-f7c1c3db.js | 69 +++++ .../{index-0af18c24.js => index-f819e53e.js} | 8 +- zh-cn/assets/sect1-66de51dd.png | Bin 0 -> 211603 bytes zh-cn/assets/sect1-bad41865.png | Bin 194576 -> 0 bytes zh-cn/index.html | 2 +- 50 files changed, 567 insertions(+), 250 deletions(-) create mode 100644 zh-cn/assets/cover-ca6ff87c.webp create mode 100644 zh-cn/assets/cover-fa6a1661.webp create mode 100644 zh-cn/assets/image1-78435096.webp rename zh-cn/assets/{index-867a5cbc.js => index-012cd7f5.js} (98%) rename zh-cn/assets/{index-3a32ad00.js => index-043be87f.js} (94%) rename zh-cn/assets/{index-28199dec.js => index-067c93db.js} (94%) rename zh-cn/assets/{index-5238cd79.js => index-0f5b2c4d.js} (98%) rename zh-cn/assets/{index-85fa6207.js => index-1dde53bb.js} (97%) rename zh-cn/assets/{index-cf17c7a4.js => index-1e46583f.js} (97%) rename zh-cn/assets/{index-602219d3.js => index-1f0dff83.js} (86%) rename zh-cn/assets/{index-7cf6760e.js => index-213034fe.js} (95%) rename zh-cn/assets/{index-ef7b41da.js => index-25c20c62.js} (93%) rename zh-cn/assets/{index-b1ba4736.js => index-29c0b7ce.js} (98%) rename zh-cn/assets/{index-2e5b8302.js => index-2a76e7d1.js} (85%) rename zh-cn/assets/{index-1409afbf.js => index-31f22a4e.js} (94%) rename zh-cn/assets/{index-b2db3117.js => index-40aedb60.js} (98%) rename zh-cn/assets/{index-fd018bec.js => index-4820dca7.js} (98%) rename zh-cn/assets/{index-015cf939.js => index-500d1a02.js} (92%) rename zh-cn/assets/{index-17fcbde5.js => index-5e43e574.js} (94%) rename zh-cn/assets/{index-6bc730f7.js => index-69ce89cf.js} (93%) rename zh-cn/assets/{index-d7fb28df.js => index-6a884c2a.js} (99%) rename zh-cn/assets/{index-9cbd4195.js => index-6f20c5b7.js} (95%) rename zh-cn/assets/{index-28241c38.js => index-6f8e9292.js} (89%) rename zh-cn/assets/{index-22d5e656.js => index-71801d47.js} (96%) rename zh-cn/assets/{index-eb1ecfd7.js => index-78a34e98.js} (92%) rename zh-cn/assets/{index-d543ad74.js => index-7e0a1d2c.js} (96%) rename zh-cn/assets/{index-962501d1.js => index-87f0525d.js} (98%) rename zh-cn/assets/{index-2a54f9b1.js => index-8a16857f.js} (99%) rename zh-cn/assets/{index-866fab75.js => index-8bf3af0a.js} (99%) rename zh-cn/assets/{index-557885ec.js => index-8cb7e806.js} (98%) rename zh-cn/assets/{index-2645d3b0.js => index-8f0491cb.js} (94%) rename zh-cn/assets/{index-2a0835cc.js => index-917f23ec.js} (92%) create mode 100644 zh-cn/assets/index-9e270336.js rename zh-cn/assets/{index-d4dfb508.js => index-a59ad30d.js} (95%) rename zh-cn/assets/{index-6618c0b5.js => index-a5e56ae7.js} (98%) rename zh-cn/assets/{index-f6182a9f.js => index-af83501f.js} (96%) rename zh-cn/assets/{index-50ad21f0.js => index-b5bb516b.js} (93%) rename zh-cn/assets/{index-89698b14.js => index-b9ee750d.js} (86%) rename zh-cn/assets/{index-fe8c6311.js => index-bccae718.js} (96%) rename zh-cn/assets/{index-fa30bf44.js => index-be0587a7.js} (97%) create mode 100644 zh-cn/assets/index-d70f9808.js rename zh-cn/assets/{index-5968a39d.js => index-da95a700.js} (91%) rename zh-cn/assets/{index-4b956329.js => index-e197de7f.js} (97%) rename zh-cn/assets/{index-fbe14e17.js => index-f533d09f.js} (93%) rename zh-cn/assets/{index-37f93c7b.js => index-f5cc00ea.js} (96%) create mode 100644 zh-cn/assets/index-f7c1c3db.js rename zh-cn/assets/{index-0af18c24.js => index-f819e53e.js} (99%) create mode 100644 zh-cn/assets/sect1-66de51dd.png delete mode 100644 zh-cn/assets/sect1-bad41865.png diff --git a/zh-cn/assets/cover-ca6ff87c.webp b/zh-cn/assets/cover-ca6ff87c.webp new file mode 100644 index 0000000000000000000000000000000000000000..dab21fb7560040c4262227024567c0f5766b11f8 GIT binary patch literal 17818 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 z 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 L^Y1t-@Vo#3`Gydb literal 0 HcmV?d00001 diff --git a/zh-cn/assets/index-867a5cbc.js b/zh-cn/assets/index-012cd7f5.js similarity index 98% rename from zh-cn/assets/index-867a5cbc.js rename to zh-cn/assets/index-012cd7f5.js index aa1877e..0df1c5a 100644 --- a/zh-cn/assets/index-867a5cbc.js +++ b/zh-cn/assets/index-012cd7f5.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",d="/zh-cn/assets/image13-a48112ad.png",m="/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",P="/zh-cn/assets/image20-ef5a452f.png",b="/zh-cn/assets/image21-ebff1568.png",j="/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,_,d,m,u,h,k,f,g,P,b,j,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"},I=[{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}],y=`

数据流式编程的思想

+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",P="/zh-cn/assets/image20-ef5a452f.png",b="/zh-cn/assets/image21-ebff1568.png",j="/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,P,b,j,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=`

数据流式编程的思想

数据流式编程思想简介

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

图片

@@ -147,7 +147,7 @@ endinterface PipeOut #(b) pob ) (PipeOut #(c)); -

图片

+

图片

图 13 mkFork 与 mkJoin 节点的示意图

mkForkmkJoin 可以创建简单的并行结构,通过用户自己提供的函数 fork_fn 和 join_fn,由用户决定如何将一个输入数据流拆分成 2 个输出数据流,以及如何把两个输入数据流合并为一个输出数据流。对于 Join 操作而言,要求两个输入端口上均存在数据时,该 Node 才可以执行操作,如果两条路径上处理数据所需的时钟周期数不一致,则 Join 节点会进行等待,直到两个输入都有数据为止。此外,PAClib 中还提供了多种 Fork 节点的变种实现,可以自行了解。

条件分支操作

@@ -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 可以创建条件分支,其定义及示意图如下:

@@ -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,y as default,T as metadata,I 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,y as toc}; diff --git a/zh-cn/assets/index-3a32ad00.js b/zh-cn/assets/index-043be87f.js similarity index 94% rename from zh-cn/assets/index-3a32ad00.js rename to zh-cn/assets/index-043be87f.js index b08b9fe..cdbb6b7 100644 --- a/zh-cn/assets/index-3a32ad00.js +++ b/zh-cn/assets/index-043be87f.js @@ -1,4 +1,4 @@ -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}],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],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=`

嘉宾介绍

施继成

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

讨论内容

@@ -17,4 +17,4 @@ const s="/zh-cn/assets/cover-39643179.png",e="/zh-cn/assets/image1-a93ba076.jpg"

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

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

图片

-

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

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

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

`;export{a as assetURLs,n as default,c as metadata,l as toc}; diff --git a/zh-cn/assets/index-28199dec.js b/zh-cn/assets/index-067c93db.js similarity index 94% rename from zh-cn/assets/index-28199dec.js rename to zh-cn/assets/index-067c93db.js index f78ee0d..1445393 100644 --- a/zh-cn/assets/index-28199dec.js +++ b/zh-cn/assets/index-067c93db.js @@ -1,4 +1,4 @@ -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=`

封面

+const l="/zh-cn/assets/cover-6865ae02.png",i=[l],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=`

封面

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

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

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

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

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

`;export{i as assetURLs,n as default,t as metadata,e as toc}; diff --git a/zh-cn/assets/index-5238cd79.js b/zh-cn/assets/index-0f5b2c4d.js similarity index 98% rename from zh-cn/assets/index-5238cd79.js rename to zh-cn/assets/index-0f5b2c4d.js index 348f88f..9f1196f 100644 --- a/zh-cn/assets/index-5238cd79.js +++ b/zh-cn/assets/index-0f5b2c4d.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",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",g="/zh-cn/assets/image10-b3a0ad40.png",r="/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",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",z="/zh-cn/assets/image26-a854b9f0.png",v="/zh-cn/assets/image27-5b3ff402.png",I="/zh-cn/assets/image28-f02ef5c0.png",u="/zh-cn/assets/image29-44cafcf0.png",A=[l,p,i,a,e,o,n,t,s,c,g,r,D,h,H,L,S,m,V,C,b,y,d,P,f,z,v,I,u],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"},R=[{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}],B=`

封面

+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",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",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",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",R=[l,p,i,a,e,o,n,t,s,c,r,g,H,D,h,L,S,m,C,V,b,y,d,P,f,A,z,v,I],u={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"},w=[{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}],B=`

封面

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

引言

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

和类型、产品类型和私有类型构造器: 产品类型(在大多数编程语言中称为struct)是一种保存不同类型的零个或多个值的数据结构。在SpinalHDL中,产品类型用于表示信号的“Bundle”,例如:

图片

图8:从语义角度看,经典的RISC流水线由寄存器文件访问、缓存访问、指令获取/解码、算术运算和其他功能组成。

-

图片

-

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

图片

+

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

+

图片

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

-

图片

+

图片

表2:从SpinalHDL到Verilog的映射。

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

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

-

图片

+

图片

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

-

图片

+

图片

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

3.3 SpinalHDL之外

SpinalHDL成功地利用了Scala中的许多构造来提高硬件设计过程的效率,但是在从硬件中抽象出属性并在编译时进行验证方面还有更多的可能性。在本节中,我们介绍了来自不同软件编程语言的各种方法,我们认为这些方法也可以使硬件设计受益。

@@ -150,7 +150,7 @@ const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png"
  • 类型检查和IR编译。
  • 生成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,16 +187,16 @@ 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测试框架,来管理所有测试的执行。

    -

    图片

    +

    图片

    一些pytest命令来管理测试单元的执行:

    -

    图片

    +

    图片

    结论

    本文主要讨论了基于新兴的开源工具SpinalHDL和Cocotb的数字硬件设计和验证,我们相信这些工具可以改变传统芯片开发过程。硬件设计的需求越来越多样化,但设计语言和工具并未明显改进。SpinalHDL和Cocotb试图将一些先进和高效的软件设计概念和方法引入到硬件开发流程中。与基于System Verilog或VHDL的传统设计和验证方法相比,SpinalHDL和Cocotb可以显著提高硬件开发的效率和质量。

    值得注意的是,SpinalHDL不是一种新的高级综合(HLS)工具,而是与Verilog或VHDL具有相同的描述层次。结合我们使用Spinal的开发经验,总结了它相对于Verilog和VHDL的三个主要优势,包括可靠性、表达性和可重用性。关于可靠性,Spinal可以提供更精确的基本电路元素抽象,在编译过程中提前检查一些设计规则,并分离设计和仿真元素。在表达性方面,SpinalHDL建立在Scala上,这是一种高级编程语言。基于Scala的特性,包括面向对象、函数式编程、递归和丰富的集合类型,更容易让硬件开发人员实现和参数化他们的设计。在可重用性方面,SpinalHDL本身提供了对常用电路元素的丰富封装来实现重用。对于设计师来说,使用Scala及其相关工具链更容易生成更具可重用性的代码和构建自己的代码库。

    @@ -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{A as assetURLs,B as default,T as metadata,R as toc}; +“https://github.com/cocotb/cocotb.”

    `;export{R as assetURLs,B as default,u as metadata,w as toc}; diff --git a/zh-cn/assets/index-85fa6207.js b/zh-cn/assets/index-1dde53bb.js similarity index 97% rename from zh-cn/assets/index-85fa6207.js rename to zh-cn/assets/index-1dde53bb.js index 0272c47..23a48ca 100644 --- a/zh-cn/assets/index-85fa6207.js +++ b/zh-cn/assets/index-1dde53bb.js @@ -1,4 +1,4 @@ -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=`

    数据库隔离级别介绍

    +const e="/zh-cn/assets/image1-145af1bc.png",a="/zh-cn/assets/image2-b5b0ee19.png",l="/zh-cn/assets/image3-204919ac.png",p="/zh-cn/assets/image4-e50f112d.png",t="/zh-cn/assets/image5-cdb8d1de.png",i=[e,a,l,p,t],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,19 +8,19 @@ 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 隔离级别。在这个隔离级别中,在同一个事务中对同一条数据的多次读取保证会得到相同的值,即使这个过程中该数据被其他已经提交的事务修改掉。当然该隔离级别也有一些情况无法保证隔离性,比如下列情况:

    Table 4:

    -

    图片

    +

    图片

    在 repeatable read 的隔离级别下,Operation 2 的返回结果是 ["CC"] —— 只有 Key 3 的值被返回了,但是 Operation 5 的返回值是 ["CC", "DD"]。总结一下,repeatable read 的隔离级别仍然无法很好处理涉及多条数据的情况,特别是当有新的数据插入或者删除的情况。

    Serializable

    最严格的隔离级别叫做 Serializable,这个级别的定义也是最清晰明了的,在这种隔离级别下的执行结果,就“仿佛”是将所有事务串行起来一条一条执行的结果。上面这句话中值得强调的是 “仿佛” 二字,为了提高性能,几乎没有数据库是采用真正物理意义上的串行执行来保证 Serializable 的,仅仅达到类似效果即可,实现的方法是可以多种多样的。在 Serializable 级别下还有一个细致的分类,叫做 Snapshot,该分类与 Serializable 类似但约束能力上稍弱。正是因为 Snapshot 在约束上的放松,使得其实现起来具有更好的性能,也是绝大多数数据库默认支持的隔离级别。下面我们就来说说 Snapshot,以及引申出来的 MVCC 实现方法。

    Snapshot 隔离级别及 MVCC

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

    Table 5:

    -

    图片

    +

    图片

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

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

      diff --git a/zh-cn/assets/index-cf17c7a4.js b/zh-cn/assets/index-1e46583f.js similarity index 97% rename from zh-cn/assets/index-cf17c7a4.js rename to zh-cn/assets/index-1e46583f.js index 45a637e..d68d7c1 100644 --- a/zh-cn/assets/index-cf17c7a4.js +++ b/zh-cn/assets/index-1e46583f.js @@ -1,4 +1,4 @@ -const a="/zh-cn/assets/cover-12543354.png",s="/zh-cn/assets/image1-d12f17e8.jpg",n="/zh-cn/assets/image2-5cdbcaa2.png",t=[a,s,n],e={label:"Rust China Hackathon 2022 达坦科技组空中宣讲会来啦!",description:"Rust China Hackathon 2022 即将来袭! 本届Hackathon的主题为「Rust For Fun」,分为「社区组」与「企业组」。",cover:"./cover.png",location:"中国香港",date:"2022-11-24",title:"The Rust China Hackathon 2022 Datan Technology Group Air Presentation is here"},l=[{label:"赛事日程表",level:2},{label:"空中宣讲会",level:2},{label:"达坦科技 DatenLord 赛题",level:2}],o=`

      Rust China Hackathon 2022 即将来袭! 本届 Hackathon 的主题为「Rust For Fun」,分为「社区组」与「企业组」。

      +const a="/zh-cn/assets/cover-12543354.png",s="/zh-cn/assets/image1-d12f17e8.jpg",n="/zh-cn/assets/image2-5cdbcaa2.png",t=[a,s,n],e={label:"Rust China Hackathon 2022 达坦科技组空中宣讲会来啦!",description:"Rust China Hackathon 2022 即将来袭! 本届Hackathon的主题为「Rust For Fun」,分为「社区组」与「企业组」。",cover:"./cover.png",location:"中国香港",date:"2022-11-24",title:"The Rust China Hackathon 2022 Datan Technology Group Air Presentation is here"},l=[{label:"赛事日程表",level:2},{label:"空中宣讲会",level:2},{label:"达坦科技 DatenLord 赛题",level:2}],p=`

      Rust China Hackathon 2022 即将来袭! 本届 Hackathon 的主题为「Rust For Fun」,分为「社区组」与「企业组」。

      达坦科技作为本届 Hackathon 的协办方,赞助参与本次企业组赛道,将基于 Xline 这个开源项目,就 Concurrent Indexing,邀请你一起突破固有的思维限制。

      赛事日程表

      本次挑战赛于 11 月 15 日 开放报名。赛事日程表已经新鲜出炉:

      @@ -40,4 +40,4 @@ Xline 是达坦科技推出的分布式元数据 KV 存储器。在使用中, 你的实现应遵从上述 Trait 并满足上述要求。我们将使用一定基准测试来进行评估,并根据其结果评分。在基准测试中,我们将发送大量并发请求,因此你也可以创建自己的性能测试来帮助进行优化。

      欢迎预约报名 2022 年 12 月 4 日 16:00 的空中宣讲会! 腾讯会议二维码如下:

      -

      图片

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

      图片

      `;export{t as assetURLs,p as default,e as metadata,l as toc}; diff --git a/zh-cn/assets/index-602219d3.js b/zh-cn/assets/index-1f0dff83.js similarity index 86% rename from zh-cn/assets/index-602219d3.js rename to zh-cn/assets/index-1f0dff83.js index fed1736..6d0e7ca 100644 --- a/zh-cn/assets/index-602219d3.js +++ b/zh-cn/assets/index-1f0dff83.js @@ -1,4 +1,4 @@ -const s="/zh-cn/assets/cover-dcd7e2ce.jpeg",t="/zh-cn/assets/image1-3ae2277f.jpg",n="/zh-cn/assets/image1-0a18e154.png",o=[s,t,n],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 在天空计算的场景中有着更好的性能表现

      +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=[],i=`

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

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

      图片

      直播亮点:

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

      -

      图片

      +

      图片

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

      -

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

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

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

      `;export{e as assetURLs,i as default,o as metadata,r as toc}; diff --git a/zh-cn/assets/index-7cf6760e.js b/zh-cn/assets/index-213034fe.js similarity index 95% rename from zh-cn/assets/index-7cf6760e.js rename to zh-cn/assets/index-213034fe.js index b59b78e..e37ecd3 100644 --- a/zh-cn/assets/index-7cf6760e.js +++ b/zh-cn/assets/index-213034fe.js @@ -1,4 +1,4 @@ -const n="/zh-cn/assets/cover-99998007.jpg",t="/zh-cn/assets/image1-6f9cec09.jpg",e=[n,t],s={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",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"},a=[{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}],o=`

      封面

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

      芯片敏捷设计与验证之路

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

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

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

      -

      图片

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

      图片

      `;export{e as assetURLs,o as default,t as metadata,a as toc}; diff --git a/zh-cn/assets/index-ef7b41da.js b/zh-cn/assets/index-25c20c62.js similarity index 93% rename from zh-cn/assets/index-ef7b41da.js rename to zh-cn/assets/index-25c20c62.js index b6db4ca..3253389 100644 --- a/zh-cn/assets/index-ef7b41da.js +++ b/zh-cn/assets/index-25c20c62.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],t={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"},p=[{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,t as metadata,p as toc}; diff --git a/zh-cn/assets/index-b1ba4736.js b/zh-cn/assets/index-29c0b7ce.js similarity index 98% rename from zh-cn/assets/index-b1ba4736.js rename to zh-cn/assets/index-29c0b7ce.js index 17ef944..1b821d3 100644 --- a/zh-cn/assets/index-b1ba4736.js +++ b/zh-cn/assets/index-29c0b7ce.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"},c=[{label:"MIT Training Q & A",level:2},{label:"MIT Training 小贴士",level:2},{label:"Related Resources",level:2}],i=`

      图片

      +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=`

      图片

      在 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,i as default,r as metadata,c as toc}; +

      图片

      `;export{t as assetURLs,c as default,r as metadata,i as toc}; diff --git a/zh-cn/assets/index-2e5b8302.js b/zh-cn/assets/index-2a76e7d1.js similarity index 85% rename from zh-cn/assets/index-2e5b8302.js rename to zh-cn/assets/index-2a76e7d1.js index 5c23b57..0c43da0 100644 --- a/zh-cn/assets/index-2e5b8302.js +++ b/zh-cn/assets/index-2a76e7d1.js @@ -6,7 +6,7 @@ var CE=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var nQ=CE((sQ,ou) * * 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"),AE=Symbol.for("react.portal"),TE=Symbol.for("react.fragment"),RE=Symbol.for("react.strict_mode"),OE=Symbol.for("react.profiler"),PE=Symbol.for("react.provider"),ME=Symbol.for("react.context"),LE=Symbol.for("react.forward_ref"),IE=Symbol.for("react.suspense"),NE=Symbol.for("react.memo"),zE=Symbol.for("react.lazy"),Zv=Symbol.iterator;function YE(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(){}},j2=Object.assign,E2={};function Ys(e,t,r){this.props=e,this.context=t,this.refs=E2,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=E2,this.updater=r||D2}var a0=s0.prototype=new A2;a0.constructor=s0;j2(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()=>(t||e((t={exports:{}}).exports,t),t.exports);var nQ=CE((sQ,ou) * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var $E=I,BE=Symbol.for("react.element"),WE=Symbol.for("react.fragment"),GE=Object.prototype.hasOwnProperty,KE=$E.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,XE={key:!0,ref:!0,__self:!0,__source:!0};function P2(e,t,r){var n,i={},o=null,a=null;r!==void 0&&(o=""+r),t.key!==void 0&&(o=""+t.key),t.ref!==void 0&&(a=t.ref);for(n in t)GE.call(t,n)&&!XE.hasOwnProperty(n)&&(i[n]=t[n]);if(e&&e.defaultProps)for(n in t=e.defaultProps,t)i[n]===void 0&&(i[n]=t[n]);return{$$typeof:BE,type:e,key:o,ref:a,props:i,_owner:KE.current}}id.Fragment=WE;id.jsx=P2;id.jsxs=P2;(function(e){e.exports=id})(jE);var Cm={},su={},QE={get exports(){return su},set exports(e){su=e}},Sr={},Dm={},qE={get exports(){return Dm},set exports(e){Dm=e}},M2={};/** + */var $E=I,BE=Symbol.for("react.element"),WE=Symbol.for("react.fragment"),GE=Object.prototype.hasOwnProperty,KE=$E.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,XE={key:!0,ref:!0,__self:!0,__source:!0};function P2(e,t,r){var n,i={},o=null,a=null;r!==void 0&&(o=""+r),t.key!==void 0&&(o=""+t.key),t.ref!==void 0&&(a=t.ref);for(n in t)GE.call(t,n)&&!XE.hasOwnProperty(n)&&(i[n]=t[n]);if(e&&e.defaultProps)for(n in t=e.defaultProps,t)i[n]===void 0&&(i[n]=t[n]);return{$$typeof:BE,type:e,key:o,ref:a,props:i,_owner:KE.current}}id.Fragment=WE;id.jsx=P2;id.jsxs=P2;(function(e){e.exports=id})(jE);var Cm={},su={},QE={get exports(){return su},set exports(e){su=e}},Sr={},Dm={},qE={get exports(){return Dm},set exports(e){Dm=e}},L2={};/** * @license React * scheduler.production.min.js * @@ -22,7 +22,7 @@ var CE=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var nQ=CE((sQ,ou) * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */(function(e){function t($,le){var Q=$.length;$.push(le);e:for(;0>>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,_=3,k=!1,C=!1,D=!1,j=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 S($){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 E($){if(D=!1,S($),!C)if(r(d)!==null)C=!0,ze(T);else{var le=r(h);le!==null&&mt(E,le.startTime-$)}}function T($,le){C=!1,D&&(D=!1,y(O),O=-1),k=!0;var Q=_;try{for(S(le),v=r(d);v!==null&&(!(v.expirationTime>le)||$&&!ee());){var ue=v.callback;if(typeof ue=="function"){v.callback=null,_=v.priorityLevel;var he=ue(v.expirationTime<=le);le=e.unstable_now(),typeof he=="function"?v.callback=he:v===r(d)&&n(d),S(le)}else n(d);v=r(d)}if(v!==null)var st=!0;else{var Fe=r(h);Fe!==null&&mt(E,Fe.startTime-le),st=!1}return st}finally{v=null,_=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 _},e.unstable_getFirstCallbackNode=function(){return r(d)},e.unstable_next=function($){switch(_){case 1:case 2:case 3:var le=3;break;default:le=_}var Q=_;_=le;try{return $()}finally{_=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=_;_=$;try{return le()}finally{_=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(E,Q-ue))):($.sortIndex=he,t(d,$),C||k||(C=!0,ze(T))),$},e.unstable_shouldYield=ee,e.unstable_wrapCallback=function($){var le=_;return function(){var Q=_;_=le;try{return $.apply(this,arguments)}finally{_=Q}}}})(M2);(function(e){e.exports=M2})(qE);/** + */(function(e){function t($,le){var Q=$.length;$.push(le);e:for(;0>>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,_=3,k=!1,C=!1,D=!1,j=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 S($){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 E($){if(D=!1,S($),!C)if(r(d)!==null)C=!0,ze(T);else{var le=r(h);le!==null&&mt(E,le.startTime-$)}}function T($,le){C=!1,D&&(D=!1,y(O),O=-1),k=!0;var Q=_;try{for(S(le),v=r(d);v!==null&&(!(v.expirationTime>le)||$&&!ee());){var ue=v.callback;if(typeof ue=="function"){v.callback=null,_=v.priorityLevel;var he=ue(v.expirationTime<=le);le=e.unstable_now(),typeof he=="function"?v.callback=he:v===r(d)&&n(d),S(le)}else n(d);v=r(d)}if(v!==null)var st=!0;else{var Fe=r(h);Fe!==null&&mt(E,Fe.startTime-le),st=!1}return st}finally{v=null,_=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 _},e.unstable_getFirstCallbackNode=function(){return r(d)},e.unstable_next=function($){switch(_){case 1:case 2:case 3:var le=3;break;default:le=_}var Q=_;_=le;try{return $()}finally{_=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=_;_=$;try{return le()}finally{_=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(E,Q-ue))):($.sortIndex=he,t(d,$),C||k||(C=!0,ze(T))),$},e.unstable_shouldYield=ee,e.unstable_wrapCallback=function($){var le=_;return function(){var Q=_;_=le;try{return $.apply(this,arguments)}finally{_=Q}}}})(L2);(function(e){e.exports=L2})(qE);/** * @license React * react-dom.production.min.js * @@ -30,14 +30,14 @@ var CE=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var nQ=CE((sQ,ou) * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var L2=I,xr=Dm;function V(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"),jm=Object.prototype.hasOwnProperty,ZE=/^[: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 JE(e){return jm.call(ry,e)?!0:jm.call(ty,e)?!1:ZE.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||!(2"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),jm=Object.prototype.hasOwnProperty,ZE=/^[: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 JE(e){return jm.call(ry,e)?!0:jm.call(ty,e)?!1:ZE.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{Hf=!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=Vf(e.type,!1),e;case 11:return e=Vf(e.type.render,!1),e;case 1:return e=Vf(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 Em: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 H2(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function iA(e){var t=H2(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 V2(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var r=t.getValue(),n="";return e&&(n=H2(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")?Mm(e,t.type,r):t.hasOwnProperty("defaultValue")&&Mm(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 Mm(e,t,r){(t!=="number"||au(e.ownerDocument)!==e)&&(r==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+r&&(e.defaultValue=""+r))}var ja=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(V(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(V(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(V(61))}if(t.style!=null&&typeof t.style!="object")throw Error(V(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 Hm=null,ds=null,fs=null;function ly(e){if(e=jl(e)){if(typeof Hm!="function")throw Error(V(280));var t=e.stateNode;t&&(t=cd(t),Hm(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 Ea(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=Ea(c):(o&=a,o!==0&&(n=Ea(o)))}else a=r&~i,a!==0?n=Ea(a):o!==0&&(n=Ea(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 px(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 gx(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 gx(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&&px(e,t)?(e=hx(),Uc=_0=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 xx(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?xx(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&&xx(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,La=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}),La&&el(La,n)||(La=n,n=mu(Wm,"onSelect"),0es||(e.current=Jm[es],Jm[es]=null,es--)}function Ve(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(V(168));Ve(Bt,t),Ve(dr,r)}function Tx(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(V(108,nA(e)||"Unknown",i));return ot({},r,n)}function vu(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Ui,po=Bt.current,Ve(Bt,e),Ve(dr,dr.current),!0}function Oy(e,t,r){var n=e.stateNode;if(!n)throw Error(V(169));r?(e=Tx(e,t,po),n.__reactInternalMemoizedMergedChildContext=e,Ge(dr),Ge(Bt),Ve(Bt,e)):Ge(dr),Ve(dr,r)}var Un=null,ud=!1,th=!1;function Rx(e){Un===null?Un=[e]:Un.push(e)}function xT(e){ud=!0,Rx(e)}function Gi(){if(!th&&Un!==null){th=!0;var e=0,t=Le;try{var r=Un;for(Le=1;e>=a,i-=a,Bn=1<<32-Qr(t)+i|r<O?(z=P,P=null):z=P.sibling;var Y=_(y,P,S[O],E);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===S.length)return r(y,P),et&&eo(y,O),T;if(P===null){for(;OO?(z=P,P=null):z=P.sibling;var ee=_(y,P,Y.value,E);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=S.next())Y=v(y,Y.value,E),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=S.next())Y=k(P,y,O,Y.value,E),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 j(y,w,S,E){if(typeof S=="object"&&S!==null&&S.type===Xo&&S.key===null&&(S=S.props.children),typeof S=="object"&&S!==null){switch(S.$$typeof){case nc:e:{for(var T=S.key,R=w;R!==null;){if(R.key===T){if(T=S.type,T===Xo){if(R.tag===7){r(y,R.sibling),w=i(R,S.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,S.props),w.ref=ha(y,R,S),w.return=y,y=w;break e}r(y,R);break}else t(y,R);R=R.sibling}S.type===Xo?(w=uo(S.props.children,y.mode,E,S.key),w.return=y,y=w):(E=qc(S.type,S.key,S.props,null,y.mode,E),E.ref=ha(y,w,S),E.return=y,y=E)}return a(y);case Ko:e:{for(R=S.key;w!==null;){if(w.key===R)if(w.tag===4&&w.stateNode.containerInfo===S.containerInfo&&w.stateNode.implementation===S.implementation){r(y,w.sibling),w=i(w,S.children||[]),w.return=y,y=w;break e}else{r(y,w);break}else t(y,w);w=w.sibling}w=ch(S,y.mode,E),w.return=y,y=w}return a(y);case yi:return R=S._init,j(y,w,R(S._payload),E)}if(ja(S))return C(y,w,S,E);if(la(S))return D(y,w,S,E);mc(y,S)}return typeof S=="string"&&S!==""||typeof S=="number"?(S=""+S,w!==null&&w.tag===6?(r(y,w.sibling),w=i(w,S),w.return=y,y=w):(r(y,w),w=lh(S,y.mode,E),w.return=y,y=w),a(y)):r(y,w)}return j}var Ds=Yx(!0),Hx=Yx(!1),El={},vn=Wi(El),il=Wi(El),ol=Wi(El);function oo(e){if(e===El)throw Error(V(174));return e}function M0(e,t){switch(Ve(ol,t),Ve(il,e),Ve(vn,El),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),Ve(vn,t)}function js(){Ge(vn),Ge(il),Ge(ol)}function Vx(e){oo(ol.current);var t=oo(vn.current),r=Im(t,e.type);t!==r&&(Ve(il,e),Ve(vn,r))}function L0(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{Le=r,nh.transition=n}}function n_(){return Pr().memoizedState}function kT(e,t,r){var n=Mi(e);if(r={lane:n,action:r,hasEagerState:!1,eagerState:null,next:null},i_(e))o_(t,r);else if(r=Lx(e,t,r,n),r!==null){var i=Jt();qr(r,e,n,i),s_(r,t,n)}}function CT(e,t,r){var n=Mi(e),i={lane:n,action:r,hasEagerState:!1,eagerState:null,next:null};if(i_(e))o_(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=Lx(e,t,i,n),r!==null&&(i=Jt(),qr(r,e,n,i),s_(r,t,n))}}function i_(e){var t=e.alternate;return e===it||t!==null&&t===it}function o_(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 s_(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:Ht,useContext:Ht,useEffect:Ht,useImperativeHandle:Ht,useInsertionEffect:Ht,useLayoutEffect:Ht,useMemo:Ht,useReducer:Ht,useRef:Ht,useState:Ht,useDebugValue:Ht,useDeferredValue:Ht,useTransition:Ht,useMutableSource:Ht,useSyncExternalStore:Ht,useId:Ht,unstable_isNewReconciler:!1},DT={readContext:Or,useCallback:function(e,t){return hn().memoizedState=[e,t===void 0?null:t],e},useContext:Or,useEffect:Vy,useImperativeHandle:function(e,t,r){return r=r!=null?r.concat([e]):null,Gc(4194308,4,Zx.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:Hy,useDebugValue:V0,useDeferredValue:function(e){return hn().memoizedState=e},useTransition:function(){var e=Hy(!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(V(407));r=r()}else{if(r=t(),Pt===null)throw Error(V(349));vo&30||$x(n,t,r)}i.memoizedState=r;var o={value:r,getSnapshot:t};return i.queue=o,Vy(Wx.bind(null,n,o,e),[e]),n.flags|=2048,ll(9,Bx.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")&&(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 Em: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 ja=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=jl(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 Ea(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=Ea(c):(o&=a,o!==0&&(n=Ea(o)))}else a=r&~i,a!==0?n=Ea(a):o!==0&&(n=Ea(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 px(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 gx(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 gx(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&&px(e,t)?(e=hx(),Uc=_0=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 xx(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?xx(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&&xx(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 Tx(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=Tx(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 Rx(e){Un===null?Un=[e]:Un.push(e)}function xT(e){ud=!0,Rx(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=_(y,P,S[O],E);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===S.length)return r(y,P),et&&eo(y,O),T;if(P===null){for(;OO?(z=P,P=null):z=P.sibling;var ee=_(y,P,Y.value,E);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=S.next())Y=v(y,Y.value,E),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=S.next())Y=k(P,y,O,Y.value,E),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 j(y,w,S,E){if(typeof S=="object"&&S!==null&&S.type===Xo&&S.key===null&&(S=S.props.children),typeof S=="object"&&S!==null){switch(S.$$typeof){case nc:e:{for(var T=S.key,R=w;R!==null;){if(R.key===T){if(T=S.type,T===Xo){if(R.tag===7){r(y,R.sibling),w=i(R,S.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,S.props),w.ref=ha(y,R,S),w.return=y,y=w;break e}r(y,R);break}else t(y,R);R=R.sibling}S.type===Xo?(w=uo(S.props.children,y.mode,E,S.key),w.return=y,y=w):(E=qc(S.type,S.key,S.props,null,y.mode,E),E.ref=ha(y,w,S),E.return=y,y=E)}return a(y);case Ko:e:{for(R=S.key;w!==null;){if(w.key===R)if(w.tag===4&&w.stateNode.containerInfo===S.containerInfo&&w.stateNode.implementation===S.implementation){r(y,w.sibling),w=i(w,S.children||[]),w.return=y,y=w;break e}else{r(y,w);break}else t(y,w);w=w.sibling}w=ch(S,y.mode,E),w.return=y,y=w}return a(y);case yi:return R=S._init,j(y,w,R(S._payload),E)}if(ja(S))return C(y,w,S,E);if(la(S))return D(y,w,S,E);mc(y,S)}return typeof S=="string"&&S!==""||typeof S=="number"?(S=""+S,w!==null&&w.tag===6?(r(y,w.sibling),w=i(w,S),w.return=y,y=w):(r(y,w),w=lh(S,y.mode,E),w.return=y,y=w),a(y)):r(y,w)}return j}var Ds=Yx(!0),Vx=Yx(!1),El={},vn=Wi(El),il=Wi(El),ol=Wi(El);function oo(e){if(e===El)throw Error(H(174));return e}function L0(e,t){switch(He(ol,t),He(il,e),He(vn,El),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 js(){Ge(vn),Ge(il),Ge(ol)}function Hx(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 n_(){return Pr().memoizedState}function kT(e,t,r){var n=Li(e);if(r={lane:n,action:r,hasEagerState:!1,eagerState:null,next:null},i_(e))o_(t,r);else if(r=Mx(e,t,r,n),r!==null){var i=Jt();qr(r,e,n,i),s_(r,t,n)}}function CT(e,t,r){var n=Li(e),i={lane:n,action:r,hasEagerState:!1,eagerState:null,next:null};if(i_(e))o_(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=Mx(e,t,i,n),r!==null&&(i=Jt(),qr(r,e,n,i),s_(r,t,n))}}function i_(e){var t=e.alternate;return e===it||t!==null&&t===it}function o_(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 s_(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,Zx.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||$x(n,t,r)}i.memoizedState=r;var o={value:r,getSnapshot:t};return i.queue=o,Hy(Wx.bind(null,n,o,e),[e]),n.flags|=2048,ll(9,Bx.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,p_(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 Vt(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,Ve(nt,n?r&1|2:r&1),t):(Vt(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&&(Vt(t),t.subtreeFlags&6&&(t.flags|=8192)):Vt(t),null;case 24:return null;case 25:return null}throw Error(V(156,t.tag))}function MT(e,t){switch(j0(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 js(),Ge(dr),Ge(Bt),I0(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return L0(t),null;case 13:if(Ge(nt),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(V(340));Cs()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Ge(nt),null;case 4:return js(),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,LT=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,_=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;)_=v,v=k;for(;;){if(v===e)break t;if(_===r&&++h===i&&(c=a),_===o&&++g===n&&(d=a),(k=v.nextSibling)!==null)break;v=_,_=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,j=C.memoizedState,y=t.stateNode,w=y.getSnapshotBeforeUpdate(t.elementType===t.type?D:$r(t.type,D),j);y.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var S=t.stateNode.containerInfo;S.nodeType===1?S.textContent="":S.nodeType===9&&S.documentElement&&S.removeChild(S.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(V(163))}}catch(E){at(t,t.return,E)}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 y_(e){var t=e.alternate;t!==null&&(e.alternate=null,y_(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 w_(e){return e.tag===5||e.tag===3||e.tag===4}function qy(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||w_(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 Lt=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=Lt,i=Wr;Lt=null,gi(e,t,r),Lt=n,Wr=i,Lt!==null&&(Wr?(e=Lt,r=r.stateNode,e.nodeType===8?e.parentNode.removeChild(r):e.removeChild(r)):Lt.removeChild(r.stateNode));break;case 18:Lt!==null&&(Wr?(e=Lt,r=r.stateNode,e.nodeType===8?eh(e.parentNode,r):e.nodeType===1&&eh(e,r),Za(e)):eh(Lt,r.stateNode));break;case 4:n=Lt,i=Wr,Lt=r.stateNode.containerInfo,Wr=!0,gi(e,t,r),Lt=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 LT),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,Eu=0,je&6)throw Error(V(331));var i=je;for(je|=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 E_(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),E_(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(V(314))}n!==null&&n.delete(t),E_(e,r)}var A_;A_=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&&Ox(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(V(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(f_(t),e===null)throw Error(V(387));n=t.pendingProps,o=t.memoizedState,i=o.element,Ix(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=Es(Error(V(423)),t),t=Ky(e,t,n,r,i);break e}else if(n!==i){i=Es(Error(V(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=Hx(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 Vx(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),d_(e,t),qt(e,t,a,r),t.child;case 6:return e===null&&tp(t),null;case 13:return h_(e,t,r);case 4:return M0(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,Ve(xu,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(V(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 c_(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),zx(t,n,i),ip(t,n,i,r),ap(null,t,n,!0,e,r);case 19:return m_(e,t,r);case 22:return u_(e,t,r)}throw Error(V(156,t.tag))};function T_(e,t){return rx(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 Li(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 Em:return e=Tr(12,r,t,i|2),e.elementType=Em,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(V(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})(QE);var s1=su;Cm.createRoot=s1.createRoot,Cm.hydrateRoot=s1.hydrateRoot;/** +`+o.stack}return{value:e,source:t,stack:i,digest:null}}function sh(e,t,r){return{value:e,source:null,stack:r??null,digest:t??null}}function op(e,t){try{console.error(t.value)}catch(r){setTimeout(function(){throw r})}}var AT=typeof WeakMap=="function"?WeakMap:Map;function a_(e,t,r){r=Xn(-1,r),r.tag=3,r.payload={element:null};var n=t.value;return r.callback=function(){ju||(ju=!0,pp=n),op(e,t)},r}function l_(e,t,r){r=Xn(-1,r),r.tag=3;var n=e.type.getDerivedStateFromError;if(typeof n=="function"){var i=t.value;r.payload=function(){return n(i)},r.callback=function(){op(e,t)}}var o=e.stateNode;return o!==null&&typeof o.componentDidCatch=="function"&&(r.callback=function(){op(e,t),typeof n!="function"&&(Pi===null?Pi=new Set([this]):Pi.add(this));var a=t.stack;this.componentDidCatch(t.value,{componentStack:a!==null?a:""})}),r}function Fy(e,t,r){var n=e.pingCache;if(n===null){n=e.pingCache=new AT;var i=new Set;n.set(t,i)}else i=n.get(t),i===void 0&&(i=new Set,n.set(t,i));i.has(r)||(i.add(r),e=UT.bind(null,e,t,r),t.then(e,e))}function Uy(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function $y(e,t,r,n,i){return e.mode&1?(e.flags|=65536,e.lanes=i,e):(e===t?e.flags|=65536:(e.flags|=128,r.flags|=131072,r.flags&=-52805,r.tag===1&&(r.alternate===null?r.tag=17:(t=Xn(-1,1),t.tag=2,Oi(r,t,1))),r.lanes|=1),e)}var TT=ii.ReactCurrentOwner,ur=!1;function qt(e,t,r,n){t.child=e===null?Vx(t,null,r,n):Ds(t,e.child,r,n)}function By(e,t,r,n,i){r=r.render;var o=t.ref;return ms(t,i),n=z0(e,t,r,n,o,i),r=Y0(),e!==null&&!ur?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~i,ti(e,t,i)):(et&&r&&D0(t),t.flags|=1,qt(e,t,n,i),t.child)}function Wy(e,t,r,n,i){if(e===null){var o=r.type;return typeof o=="function"&&!X0(o)&&o.defaultProps===void 0&&r.compare===null&&r.defaultProps===void 0?(t.tag=15,t.type=o,c_(e,t,o,n,i)):(e=qc(r.type,null,n,t,t.mode,i),e.ref=t.ref,e.return=t,t.child=e)}if(o=e.child,!(e.lanes&i)){var a=o.memoizedProps;if(r=r.compare,r=r!==null?r:el,r(a,n)&&e.ref===t.ref)return ti(e,t,i)}return t.flags|=1,e=Mi(o,n),e.ref=t.ref,e.return=t,t.child=e}function c_(e,t,r,n,i){if(e!==null){var o=e.memoizedProps;if(el(o,n)&&e.ref===t.ref)if(ur=!1,t.pendingProps=n=o,(e.lanes&i)!==0)e.flags&131072&&(ur=!0);else return t.lanes=e.lanes,ti(e,t,i)}return sp(e,t,r,n,i)}function u_(e,t,r){var n=t.pendingProps,i=n.children,o=e!==null?e.memoizedState:null;if(n.mode==="hidden")if(!(t.mode&1))t.memoizedState={baseLanes:0,cachePool:null,transitions:null},He(os,gr),gr|=r;else{if(!(r&1073741824))return e=o!==null?o.baseLanes|r:r,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,He(os,gr),gr|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},n=o!==null?o.baseLanes:r,He(os,gr),gr|=n}else o!==null?(n=o.baseLanes|r,t.memoizedState=null):n=r,He(os,gr),gr|=n;return qt(e,t,i,r),t.child}function d_(e,t){var r=t.ref;(e===null&&r!==null||e!==null&&e.ref!==r)&&(t.flags|=512,t.flags|=2097152)}function sp(e,t,r,n,i){var o=fr(r)?po:Bt.current;return o=ks(t,o),ms(t,i),r=z0(e,t,r,n,o,i),n=Y0(),e!==null&&!ur?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~i,ti(e,t,i)):(et&&n&&D0(t),t.flags|=1,qt(e,t,r,i),t.child)}function Gy(e,t,r,n,i){if(fr(r)){var o=!0;vu(t)}else o=!1;if(ms(t,i),t.stateNode===null)Kc(e,t),zx(t,r,n),ip(t,r,n,i),n=!0;else if(e===null){var a=t.stateNode,c=t.memoizedProps;a.props=c;var d=a.context,h=r.contextType;typeof h=="object"&&h!==null?h=Or(h):(h=fr(r)?po:Bt.current,h=ks(t,h));var g=r.getDerivedStateFromProps,v=typeof g=="function"||typeof a.getSnapshotBeforeUpdate=="function";v||typeof a.UNSAFE_componentWillReceiveProps!="function"&&typeof a.componentWillReceiveProps!="function"||(c!==n||d!==h)&&zy(t,a,n,h),wi=!1;var _=t.memoizedState;a.state=_,Su(t,n,a,i),d=t.memoizedState,c!==n||_!==d||dr.current||wi?(typeof g=="function"&&(np(t,r,g,n),d=t.memoizedState),(c=wi||Ny(t,r,c,n,_,d,h))?(v||typeof a.UNSAFE_componentWillMount!="function"&&typeof a.componentWillMount!="function"||(typeof a.componentWillMount=="function"&&a.componentWillMount(),typeof a.UNSAFE_componentWillMount=="function"&&a.UNSAFE_componentWillMount()),typeof a.componentDidMount=="function"&&(t.flags|=4194308)):(typeof a.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=n,t.memoizedState=d),a.props=n,a.state=d,a.context=h,n=c):(typeof a.componentDidMount=="function"&&(t.flags|=4194308),n=!1)}else{a=t.stateNode,Ix(e,t),c=t.memoizedProps,h=t.type===t.elementType?c:$r(t.type,c),a.props=h,v=t.pendingProps,_=a.context,d=r.contextType,typeof d=="object"&&d!==null?d=Or(d):(d=fr(r)?po:Bt.current,d=ks(t,d));var k=r.getDerivedStateFromProps;(g=typeof k=="function"||typeof a.getSnapshotBeforeUpdate=="function")||typeof a.UNSAFE_componentWillReceiveProps!="function"&&typeof a.componentWillReceiveProps!="function"||(c!==v||_!==d)&&zy(t,a,n,d),wi=!1,_=t.memoizedState,a.state=_,Su(t,n,a,i);var C=t.memoizedState;c!==v||_!==C||dr.current||wi?(typeof k=="function"&&(np(t,r,k,n),C=t.memoizedState),(h=wi||Ny(t,r,h,n,_,C,d)||!1)?(g||typeof a.UNSAFE_componentWillUpdate!="function"&&typeof a.componentWillUpdate!="function"||(typeof a.componentWillUpdate=="function"&&a.componentWillUpdate(n,C,d),typeof a.UNSAFE_componentWillUpdate=="function"&&a.UNSAFE_componentWillUpdate(n,C,d)),typeof a.componentDidUpdate=="function"&&(t.flags|=4),typeof a.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof a.componentDidUpdate!="function"||c===e.memoizedProps&&_===e.memoizedState||(t.flags|=4),typeof a.getSnapshotBeforeUpdate!="function"||c===e.memoizedProps&&_===e.memoizedState||(t.flags|=1024),t.memoizedProps=n,t.memoizedState=C),a.props=n,a.state=C,a.context=d,n=h):(typeof a.componentDidUpdate!="function"||c===e.memoizedProps&&_===e.memoizedState||(t.flags|=4),typeof a.getSnapshotBeforeUpdate!="function"||c===e.memoizedProps&&_===e.memoizedState||(t.flags|=1024),n=!1)}return ap(e,t,r,n,o,i)}function ap(e,t,r,n,i,o){d_(e,t);var a=(t.flags&128)!==0;if(!n&&!a)return i&&Oy(t,r,!1),ti(e,t,o);n=t.stateNode,TT.current=t;var c=a&&typeof r.getDerivedStateFromError!="function"?null:n.render();return t.flags|=1,e!==null&&a?(t.child=Ds(t,e.child,null,o),t.child=Ds(t,null,c,o)):qt(e,t,c,o),t.memoizedState=n.state,i&&Oy(t,r,!0),t.child}function f_(e){var t=e.stateNode;t.pendingContext?Ry(e,t.pendingContext,t.pendingContext!==t.context):t.context&&Ry(e,t.context,!1),L0(e,t.containerInfo)}function Ky(e,t,r,n,i){return Cs(),E0(i),t.flags|=256,qt(e,t,r,n),t.child}var lp={dehydrated:null,treeContext:null,retryLane:0};function cp(e){return{baseLanes:e,cachePool:null,transitions:null}}function h_(e,t,r){var n=t.pendingProps,i=nt.current,o=!1,a=(t.flags&128)!==0,c;if((c=a)||(c=e!==null&&e.memoizedState===null?!1:(i&2)!==0),c?(o=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(i|=1),He(nt,i&1),e===null)return tp(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?(t.mode&1?e.data==="$!"?t.lanes=8:t.lanes=1073741824:t.lanes=1,null):(a=n.children,e=n.fallback,o?(n=t.mode,o=t.child,a={mode:"hidden",children:a},!(n&1)&&o!==null?(o.childLanes=0,o.pendingProps=a):o=pd(a,n,0,null),e=uo(e,n,r,null),o.return=t,e.return=t,o.sibling=e,t.child=o,t.child.memoizedState=cp(r),t.memoizedState=lp,e):F0(t,a));if(i=e.memoizedState,i!==null&&(c=i.dehydrated,c!==null))return RT(e,t,a,n,c,i,r);if(o){o=n.fallback,a=t.mode,i=e.child,c=i.sibling;var d={mode:"hidden",children:n.children};return!(a&1)&&t.child!==i?(n=t.child,n.childLanes=0,n.pendingProps=d,t.deletions=null):(n=Mi(i,d),n.subtreeFlags=i.subtreeFlags&14680064),c!==null?o=Mi(c,o):(o=uo(o,a,r,null),o.flags|=2),o.return=t,n.return=t,n.sibling=o,t.child=n,n=o,o=t.child,a=e.child.memoizedState,a=a===null?cp(r):{baseLanes:a.baseLanes|r,cachePool:null,transitions:a.transitions},o.memoizedState=a,o.childLanes=e.childLanes&~r,t.memoizedState=lp,n}return o=e.child,e=o.sibling,n=Mi(o,{mode:"visible",children:n.children}),!(t.mode&1)&&(n.lanes=r),n.return=t,n.sibling=null,e!==null&&(r=t.deletions,r===null?(t.deletions=[e],t.flags|=16):r.push(e)),t.child=n,t.memoizedState=null,n}function F0(e,t){return t=pd({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function pc(e,t,r,n){return n!==null&&E0(n),Ds(t,e.child,null,r),e=F0(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function RT(e,t,r,n,i,o,a){if(r)return t.flags&256?(t.flags&=-257,n=sh(Error(H(422))),pc(e,t,a,n)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(o=n.fallback,i=t.mode,n=pd({mode:"visible",children:n.children},i,0,null),o=uo(o,i,a,null),o.flags|=2,n.return=t,o.return=t,n.sibling=o,t.child=n,t.mode&1&&Ds(t,e.child,null,a),t.child.memoizedState=cp(a),t.memoizedState=lp,o);if(!(t.mode&1))return pc(e,t,a,null);if(i.data==="$!"){if(n=i.nextSibling&&i.nextSibling.dataset,n)var c=n.dgst;return n=c,o=Error(H(419)),n=sh(o,n,void 0),pc(e,t,a,n)}if(c=(a&e.childLanes)!==0,ur||c){if(n=Pt,n!==null){switch(a&-a){case 4:i=2;break;case 16:i=8;break;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:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:i=32;break;case 536870912:i=268435456;break;default:i=0}i=i&(n.suspendedLanes|a)?0:i,i!==0&&i!==o.retryLane&&(o.retryLane=i,ei(e,i),qr(n,e,i,-1))}return K0(),n=sh(Error(H(421))),pc(e,t,a,n)}return i.data==="$?"?(t.flags|=128,t.child=e.child,t=$T.bind(null,e),i._reactRetry=t,null):(e=o.treeContext,yr=Ri(i.nextSibling),wr=t,et=!0,Gr=null,e!==null&&(jr[Er++]=Bn,jr[Er++]=Wn,jr[Er++]=go,Bn=e.id,Wn=e.overflow,go=t),t=F0(t,n.children),t.flags|=4096,t)}function Xy(e,t,r){e.lanes|=t;var n=e.alternate;n!==null&&(n.lanes|=t),rp(e.return,t,r)}function ah(e,t,r,n,i){var o=e.memoizedState;o===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:n,tail:r,tailMode:i}:(o.isBackwards=t,o.rendering=null,o.renderingStartTime=0,o.last=n,o.tail=r,o.tailMode=i)}function m_(e,t,r){var n=t.pendingProps,i=n.revealOrder,o=n.tail;if(qt(e,t,n.children,r),n=nt.current,n&2)n=n&1|2,t.flags|=128;else{if(e!==null&&e.flags&128)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&Xy(e,r,t);else if(e.tag===19)Xy(e,r,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}n&=1}if(He(nt,n),!(t.mode&1))t.memoizedState=null;else switch(i){case"forwards":for(r=t.child,i=null;r!==null;)e=r.alternate,e!==null&&bu(e)===null&&(i=r),r=r.sibling;r=i,r===null?(i=t.child,t.child=null):(i=r.sibling,r.sibling=null),ah(t,!1,i,r,o);break;case"backwards":for(r=null,i=t.child,t.child=null;i!==null;){if(e=i.alternate,e!==null&&bu(e)===null){t.child=i;break}e=i.sibling,i.sibling=r,r=i,i=e}ah(t,!0,r,null,o);break;case"together":ah(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Kc(e,t){!(t.mode&1)&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function ti(e,t,r){if(e!==null&&(t.dependencies=e.dependencies),yo|=t.lanes,!(r&t.childLanes))return null;if(e!==null&&t.child!==e.child)throw Error(H(153));if(t.child!==null){for(e=t.child,r=Mi(e,e.pendingProps),t.child=r,r.return=t;e.sibling!==null;)e=e.sibling,r=r.sibling=Mi(e,e.pendingProps),r.return=t;r.sibling=null}return t.child}function OT(e,t,r){switch(t.tag){case 3:f_(t),Cs();break;case 5:Hx(t);break;case 1:fr(t.type)&&vu(t);break;case 4:L0(t,t.stateNode.containerInfo);break;case 10:var n=t.type._context,i=t.memoizedProps.value;He(xu,n._currentValue),n._currentValue=i;break;case 13:if(n=t.memoizedState,n!==null)return n.dehydrated!==null?(He(nt,nt.current&1),t.flags|=128,null):r&t.child.childLanes?h_(e,t,r):(He(nt,nt.current&1),e=ti(e,t,r),e!==null?e.sibling:null);He(nt,nt.current&1);break;case 19:if(n=(r&t.childLanes)!==0,e.flags&128){if(n)return m_(e,t,r);t.flags|=128}if(i=t.memoizedState,i!==null&&(i.rendering=null,i.tail=null,i.lastEffect=null),He(nt,nt.current),n)break;return null;case 22:case 23:return t.lanes=0,u_(e,t,r)}return ti(e,t,r)}var p_,up,g_,v_;p_=function(e,t){for(var r=t.child;r!==null;){if(r.tag===5||r.tag===6)e.appendChild(r.stateNode);else if(r.tag!==4&&r.child!==null){r.child.return=r,r=r.child;continue}if(r===t)break;for(;r.sibling===null;){if(r.return===null||r.return===t)return;r=r.return}r.sibling.return=r.return,r=r.sibling}};up=function(){};g_=function(e,t,r,n){var i=e.memoizedProps;if(i!==n){e=t.stateNode,oo(vn.current);var o=null;switch(r){case"input":i=Om(e,i),n=Om(e,n),o=[];break;case"select":i=ot({},i,{value:void 0}),n=ot({},n,{value:void 0}),o=[];break;case"textarea":i=Mm(e,i),n=Mm(e,n),o=[];break;default:typeof i.onClick!="function"&&typeof n.onClick=="function"&&(e.onclick=pu)}Nm(r,n);var a;r=null;for(h in i)if(!n.hasOwnProperty(h)&&i.hasOwnProperty(h)&&i[h]!=null)if(h==="style"){var c=i[h];for(a in c)c.hasOwnProperty(a)&&(r||(r={}),r[a]="")}else h!=="dangerouslySetInnerHTML"&&h!=="children"&&h!=="suppressContentEditableWarning"&&h!=="suppressHydrationWarning"&&h!=="autoFocus"&&(Ga.hasOwnProperty(h)?o||(o=[]):(o=o||[]).push(h,null));for(h in n){var d=n[h];if(c=i!=null?i[h]:void 0,n.hasOwnProperty(h)&&d!==c&&(d!=null||c!=null))if(h==="style")if(c){for(a in c)!c.hasOwnProperty(a)||d&&d.hasOwnProperty(a)||(r||(r={}),r[a]="");for(a in d)d.hasOwnProperty(a)&&c[a]!==d[a]&&(r||(r={}),r[a]=d[a])}else r||(o||(o=[]),o.push(h,r)),r=d;else h==="dangerouslySetInnerHTML"?(d=d?d.__html:void 0,c=c?c.__html:void 0,d!=null&&c!==d&&(o=o||[]).push(h,d)):h==="children"?typeof d!="string"&&typeof d!="number"||(o=o||[]).push(h,""+d):h!=="suppressContentEditableWarning"&&h!=="suppressHydrationWarning"&&(Ga.hasOwnProperty(h)?(d!=null&&h==="onScroll"&&Be("scroll",e),o||c===d||(o=[])):(o=o||[]).push(h,d))}r&&(o=o||[]).push("style",r);var h=o;(t.updateQueue=h)&&(t.flags|=4)}};v_=function(e,t,r,n){r!==n&&(t.flags|=4)};function ma(e,t){if(!et)switch(e.tailMode){case"hidden":t=e.tail;for(var r=null;t!==null;)t.alternate!==null&&(r=t),t=t.sibling;r===null?e.tail=null:r.sibling=null;break;case"collapsed":r=e.tail;for(var n=null;r!==null;)r.alternate!==null&&(n=r),r=r.sibling;n===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:n.sibling=null}}function Ht(e){var t=e.alternate!==null&&e.alternate.child===e.child,r=0,n=0;if(t)for(var i=e.child;i!==null;)r|=i.lanes|i.childLanes,n|=i.subtreeFlags&14680064,n|=i.flags&14680064,i.return=e,i=i.sibling;else for(i=e.child;i!==null;)r|=i.lanes|i.childLanes,n|=i.subtreeFlags,n|=i.flags,i.return=e,i=i.sibling;return e.subtreeFlags|=n,e.childLanes=r,t}function PT(e,t,r){var n=t.pendingProps;switch(j0(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Ht(t),null;case 1:return fr(t.type)&&gu(),Ht(t),null;case 3:return n=t.stateNode,js(),Ge(dr),Ge(Bt),I0(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),(e===null||e.child===null)&&(hc(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&!(t.flags&256)||(t.flags|=1024,Gr!==null&&(yp(Gr),Gr=null))),up(e,t),Ht(t),null;case 5:M0(t);var i=oo(ol.current);if(r=t.type,e!==null&&t.stateNode!=null)g_(e,t,r,n,i),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!n){if(t.stateNode===null)throw Error(H(166));return Ht(t),null}if(e=oo(vn.current),hc(t)){n=t.stateNode,r=t.type;var o=t.memoizedProps;switch(n[mn]=t,n[nl]=o,e=(t.mode&1)!==0,r){case"dialog":Be("cancel",n),Be("close",n);break;case"iframe":case"object":case"embed":Be("load",n);break;case"video":case"audio":for(i=0;i<\/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,p_(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(j0(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 js(),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 js(),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,_=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;)_=v,v=k;for(;;){if(v===e)break t;if(_===r&&++h===i&&(c=a),_===o&&++g===n&&(d=a),(k=v.nextSibling)!==null)break;v=_,_=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,j=C.memoizedState,y=t.stateNode,w=y.getSnapshotBeforeUpdate(t.elementType===t.type?D:$r(t.type,D),j);y.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var S=t.stateNode.containerInfo;S.nodeType===1?S.textContent="":S.nodeType===9&&S.documentElement&&S.removeChild(S.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(H(163))}}catch(E){at(t,t.return,E)}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 y_(e){var t=e.alternate;t!==null&&(e.alternate=null,y_(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 w_(e){return e.tag===5||e.tag===3||e.tag===4}function qy(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||w_(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,Eu=0,je&6)throw Error(H(331));var i=je;for(je|=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 E_(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),E_(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),E_(e,r)}var A_;A_=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&&Ox(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(f_(t),e===null)throw Error(H(387));n=t.pendingProps,o=t.memoizedState,i=o.element,Ix(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=Es(Error(H(423)),t),t=Ky(e,t,n,r,i);break e}else if(n!==i){i=Es(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=Vx(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 Hx(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),d_(e,t),qt(e,t,a,r),t.child;case 6:return e===null&&tp(t),null;case 13:return h_(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(xu,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 c_(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),zx(t,n,i),ip(t,n,i,r),ap(null,t,n,!0,e,r);case 19:return m_(e,t,r);case 22:return u_(e,t,r)}throw Error(H(156,t.tag))};function T_(e,t){return rx(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 Em:return e=Tr(12,r,t,i|2),e.elementType=Em,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})(QE);var s1=su;Cm.createRoot=s1.createRoot,Cm.hydrateRoot=s1.hydrateRoot;/** * @remix-run/router v1.6.1 * * Copyright (c) Remix Software Inc. @@ -46,7 +46,7 @@ Error generating stack: `+o.message+` * 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 xo(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"?_n(t):t,{state:r,key:t&&t.key||n||tR()})}function _o(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 _n(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 j=g(),y=j==null?null:j-h;h=j,d&&d({action:c,location:D.location,delta:y})}function _(j,y){c=vt.Push;let w=ul(D.location,j,y);r&&r(w,j),h=g()+1;let S=l1(w,h),E=D.createHref(w);try{a.pushState(S,"",E)}catch{i.location.assign(E)}o&&d&&d({action:c,location:D.location,delta:1})}function k(j,y){c=vt.Replace;let w=ul(D.location,j,y);r&&r(w,j),h=g();let S=l1(w,h),E=D.createHref(w);a.replaceState(S,"",E),o&&d&&d({action:c,location:D.location,delta:0})}function C(j){let y=i.location.origin!=="null"?i.location.origin:i.location.href,w=typeof j=="string"?j:_o(j);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(j){if(d)throw new Error("A history only accepts one active listener");return i.addEventListener(a1,v),d=j,()=>{i.removeEventListener(a1,v),d=null}},createHref(j){return t(i,j)},createURL:C,encodeLocation(j){let y=C(j);return{pathname:y.pathname,search:y.search,hash:y.hash}},push:_,replace:k,go(j){return a.go(j)}};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 M_(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=M_(i.children,t,a,n)),d}})}function ss(e,t,r){r===void 0&&(r="/");let n=typeof t=="string"?_n(t):t,i=Fs(n.pathname||"/",r);if(i==null)return null;let o=L_(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+'".')),L_(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 I_(o.path))i(o,a,d)}),t}function I_(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=I_(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 _=c[v]||"";a=o.slice(0,o.length-_.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),xo(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 xo(!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 xo(!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"?_n(e):e;return{pathname:r?r.startsWith("/")?r:xR(r,t):t,search:SR(n),hash:bR(i)}}function xR(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 xd(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=_n(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 _=a.split("/");for(;_[0]==="..";)_.shift(),v-=1;i.pathname=_.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,"/"),_R=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 N_(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const z_=["post","put","patch","delete"],kR=new Set(z_),CR=["get",...z_],DR=new Set(CR),jR=new Set([301,302,303,307,308]),ER=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},Y_=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,H_=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",TR=!H_,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 M=e.detectErrorBoundary;t=N=>({hasErrorBoundary:M(N)})}else t=RR;let r={},n=M_(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,_=e.hydrationData!=null,k=ss(n,e.history.location,o),C=null;if(k==null){let M=Br(404,{pathname:e.history.location.pathname}),{matches:N,route:H}=v1(n);k=N,C={[H.id]:M}}let D=!k.some(M=>M.route.lazy)&&(!k.some(M=>M.route.loader)||e.hydrationData!=null),j,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,S=!1,E,T=!1,R=!1,P=[],O=[],z=new Map,Y=0,ee=-1,te=new Map,G=new Set,lt=new Map,Ee=new Map,ze=new Map,mt=!1;function $(){return c=e.history.listen(M=>{let{action:N,location:H,delta:J}=M;if(mt){mt=!1;return}xo(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:H,historyAction:N});if(re&&J!=null){mt=!0,e.history.go(J*-1),di(re,{state:"blocked",location:H,proceed(){di(re,{state:"proceeding",proceed:void 0,reset:void 0,location:H}),e.history.go(J)},reset(){jt(re),ue({blockers:new Map(j.state.blockers)})}});return}return K(N,H)}),y.initialized||K(vt.Pop,y.location),j}function le(){c&&c(),d.clear(),E&&E.abort(),y.fetchers.forEach((M,N)=>Js(N)),y.blockers.forEach((M,N)=>jt(N))}function Q(M){return d.add(M),()=>d.delete(M)}function ue(M){y=Oe({},y,M),d.forEach(N=>N(y))}function he(M,N){var H,J;let re=y.actionData!=null&&y.navigation.formMethod!=null&&Vn(y.navigation.formMethod)&&y.navigation.state==="loading"&&((H=M.state)==null?void 0:H._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)jt(ne);let ce=S===!0||y.navigation.formMethod!=null&&Vn(y.navigation.formMethod)&&((J=M.state)==null?void 0:J._isRedirect)!==!0;i&&(n=i,i=void 0),ue(Oe({},N,{actionData:fe,loaderData:ie,historyAction:w,location:M,initialized:!0,navigation:dh,revalidation:"idle",restoreScrollPosition:Kt(M,N.matches||y.matches),preventScrollReset:ce,blockers:new Map(y.blockers)})),T||w===vt.Pop||(w===vt.Push?e.history.push(M,M.state):w===vt.Replace&&e.history.replace(M,M.state)),w=vt.Pop,S=!1,T=!1,R=!1,P=[],O=[]}async function st(M,N){if(typeof M=="number"){e.history.go(M);return}let H=wp(y.location,y.matches,o,a.v7_prependBasename,M,N==null?void 0:N.fromRouteId,N==null?void 0:N.relative),{path:J,submission:re,error:fe}=d1(a.v7_normalizeFormMethod,!1,H,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,xe=vt.Push;ne===!0?xe=vt.Replace:ne===!1||re!=null&&Vn(re.formMethod)&&re.formAction===y.location.pathname+y.location.search&&(xe=vt.Replace);let ae=N&&"preventScrollReset"in N?N.preventScrollReset===!0:void 0,xt=ea({currentLocation:ie,nextLocation:ce,historyAction:xe});if(xt){di(xt,{state:"blocked",location:ce,proceed(){di(xt,{state:"proceeding",proceed:void 0,reset:void 0,location:ce}),st(M,N)},reset(){jt(xt),ue({blockers:new Map(y.blockers)})}});return}return await K(xe,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(M,N,H){E&&E.abort(),E=null,w=M,T=(H&&H.startUninterruptedRevalidation)===!0,To(y.location,y.matches),S=(H&&H.preventScrollReset)===!0;let J=i||n,re=H&&H.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)&&!(H&&H.submission&&Vn(H.submission.formMethod))){he(N,{matches:fe});return}E=new AbortController;let ie=va(e.history,N,E.signal,H&&H.submission),ce,ne;if(H&&H.pendingError)ne={[as(fe).route.id]:H.pendingError};else if(H&&H.submission&&Vn(H.submission.formMethod)){let ct=await zt(ie,N,H.submission,fe,{replace:H.replace});if(ct.shortCircuited)return;ce=ct.pendingActionData,ne=ct.pendingActionError,re=Oe({state:"loading",location:N},H.submission),ie=new Request(ie.url,{signal:ie.signal})}let{shortCircuited:xe,loaderData:ae,errors:xt}=await rr(ie,N,fe,re,H&&H.submission,H&&H.fetcherSubmission,H&&H.replace,ce,ne);xe||(E=null,he(N,Oe({matches:fe},ce?{actionData:ce}:{},{loaderData:ae,errors:xt})))}async function zt(M,N,H,J,re){qs();let fe=Oe({state:"submitting",location:N},H);ue({navigation:fe});let ie,ce=xp(J,N);if(!ce.route.action&&!ce.route.lazy)ie={type:St.error,error:Br(405,{method:M.method,pathname:N.pathname,routeId:ce.route.id})};else if(ie=await ga("action",M,ce,J,r,t,o),M.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:H,replace:ne}),{shortCircuited:!0}}if(Ha(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(M,N,H,J,re,fe,ie,ce,ne){let xe=J;xe||(xe=Oe({state:"loading",location:N,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},re));let ae=re||fe?re||fe:xe.formMethod&&xe.formAction&&xe.formData&&xe.formEncType?{formMethod:xe.formMethod,formAction:xe.formAction,formData:xe.formData,formEncType:xe.formEncType}:void 0,xt=i||n,[ct,tt]=f1(e.history,y,H,ae,N,R,P,O,lt,xt,o,ce,ne);if(pt(Ue=>!(H&&H.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:H,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:xe},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));E&&E.signal.addEventListener("abort",Yt);let{results:nn,loaderResults:on,fetcherResults:Dn}=await pr(y.matches,H,ct,tt,M);if(M.signal.aborted)return{shortCircuited:!0};E&&E.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:jn,errors:ta}=p1(y,H,ct,on,ne,tt,Dn,Ee);Ee.forEach((Ue,nr)=>{Ue.subscribe(gt=>{(gt||Ue.done)&&Ee.delete(nr)})});let En=Fl(),fi=ui(ee),X=En||fi||tt.length>0;return Oe({loaderData:jn,errors:ta},X?{fetchers:new Map(y.fetchers)}:{})}function Yr(M){return y.fetchers.get(M)||AR}function Hr(M,N,H,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(M)&&ci(M);let re=i||n,fe=wp(y.location,y.matches,o,a.v7_prependBasename,H,N,J==null?void 0:J.relative),ie=ss(re,fe,o);if(!ie){Zs(M,N,Br(404,{pathname:fe}));return}let{path:ce,submission:ne}=d1(a.v7_normalizeFormMethod,!0,fe,J),xe=xp(ie,ce);if(S=(J&&J.preventScrollReset)===!0,ne&&Vn(ne.formMethod)){mr(M,N,ce,xe,ie,ne);return}lt.set(M,{routeId:N,path:ce}),Ki(M,N,ce,xe,ie,ne)}async function mr(M,N,H,J,re,fe){if(qs(),lt.delete(M),!J.route.action&&!J.route.lazy){let me=Br(405,{method:fe.formMethod,pathname:H,routeId:N});Zs(M,N,me);return}let ie=y.fetchers.get(M),ce=Oe({state:"submitting"},fe,{data:ie&&ie.data," _hasFetcherDoneAnything ":!0});y.fetchers.set(M,ce),ue({fetchers:new Map(y.fetchers)});let ne=new AbortController,xe=va(e.history,H,ne.signal,fe);z.set(M,ne);let ae=await ga("action",xe,J,re,r,t,o);if(xe.signal.aborted){z.get(M)===ne&&z.delete(M);return}if(gs(ae)){z.delete(M),G.add(M);let me=Oe({state:"loading"},fe,{data:void 0," _hasFetcherDoneAnything ":!0});return y.fetchers.set(M,me),ue({fetchers:new Map(y.fetchers)}),Dr(y,ae,{submission:fe,isFetchActionRedirect:!0})}if(Ha(ae)){Zs(M,N,ae.error);return}if(so(ae))throw Br(400,{type:"defer-action"});let xt=y.navigation.location||y.location,ct=va(e.history,xt,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(M,nn);let on=Oe({state:"loading",data:ae.data},fe,{" _hasFetcherDoneAnything ":!0});y.fetchers.set(M,on);let[Dn,sn]=f1(e.history,y,Yt,fe,xt,R,P,O,lt,tt,o,{[J.route.id]:ae.data},void 0);sn.filter(me=>me.key!==M).forEach(me=>{let An=me.key,Ul=y.fetchers.get(An),Et={state:"loading",data:Ul&&Ul.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};y.fetchers.set(An,Et),me.controller&&z.set(An,me.controller)}),ue({fetchers:new Map(y.fetchers)});let jn=()=>sn.forEach(me=>ci(me.key));ne.signal.addEventListener("abort",jn);let{results:ta,loaderResults:En,fetcherResults:fi}=await pr(y.matches,Yt,Dn,sn,ct);if(ne.signal.aborted)return;ne.signal.removeEventListener("abort",jn),te.delete(M),z.delete(M),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,En,void 0,sn,fi,Ee),gt={state:"idle",data:ae.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};y.fetchers.set(M,gt);let Xi=ui(nn);y.navigation.state==="loading"&&nn>ee?(be(w,"Expected pending action"),E&&E.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(M,N,H,J,re,fe){let ie=y.fetchers.get(M),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(M,ce),ue({fetchers:new Map(y.fetchers)});let ne=new AbortController,xe=va(e.history,H,ne.signal);z.set(M,ne);let ae=await ga("loader",xe,J,re,r,t,o);if(so(ae)&&(ae=await $_(ae,xe.signal,!0)||ae),z.get(M)===ne&&z.delete(M),xe.signal.aborted)return;if(gs(ae)){G.add(M),await Dr(y,ae);return}if(Ha(ae)){let ct=as(y.matches,N);y.fetchers.delete(M),ue({fetchers:new Map(y.fetchers),errors:{[ct.route.id]:ae.error}});return}be(!so(ae),"Unhandled fetcher deferred data");let xt={state:"idle",data:ae.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};y.fetchers.set(M,xt),ue({fetchers:new Map(y.fetchers)})}async function Dr(M,N,H){var J;let{submission:re,replace:fe,isFetchActionRedirect:ie}=H===void 0?{}:H;N.revalidate&&(R=!0);let ce=ul(M.location,N.location,Oe({_isRedirect:!0},ie?{_isFetchActionRedirect:!0}:{}));if(be(ce,"Expected a location on the redirect navigation"),Y_.test(N.location)&&H_&&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}}E=null;let ne=fe===!0?vt.Replace:vt.Push,{formMethod:xe,formAction:ae,formEncType:xt,formData:ct}=M.navigation;!re&&xe&&ae&&ct&&xt&&(re={formMethod:xe,formAction:ae,formEncType:xt,formData:ct}),ER.has(N.status)&&re&&Vn(re.formMethod)?await K(ne,ce,{submission:Oe({},re,{formAction:N.location}),preventScrollReset:S}):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:S}):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:S})}async function pr(M,N,H,J,re){let fe=await Promise.all([...H.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,H.length),ce=fe.slice(H.length);return await Promise.all([w1(M,H,ie,ie.map(()=>re.signal),!1,y.loaderData),w1(M,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((M,N)=>{z.has(N)&&(O.push(N),ci(N))})}function Zs(M,N,H){let J=as(y.matches,N);Js(M),ue({errors:{[J.route.id]:H},fetchers:new Map(y.fetchers)})}function Js(M){z.has(M)&&ci(M),lt.delete(M),te.delete(M),G.delete(M),y.fetchers.delete(M)}function ci(M){let N=z.get(M);be(N,"Expected fetch controller: "+M),N.abort(),z.delete(M)}function Vl(M){for(let N of M){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 M=[],N=!1;for(let H of G){let J=y.fetchers.get(H);be(J,"Expected fetcher: "+H),J.state==="loading"&&(G.delete(H),M.push(H),N=!0)}return Vl(M),N}function ui(M){let N=[];for(let[H,J]of te)if(J0}function Dt(M,N){let H=y.blockers.get(M)||u1;return ze.get(M)!==N&&ze.set(M,N),H}function jt(M){y.blockers.delete(M),ze.delete(M)}function di(M,N){let H=y.blockers.get(M)||u1;be(H.state==="unblocked"&&N.state==="blocked"||H.state==="blocked"&&N.state==="blocked"||H.state==="blocked"&&N.state==="proceeding"||H.state==="blocked"&&N.state==="unblocked"||H.state==="proceeding"&&N.state==="unblocked","Invalid blocker state transition: "+H.state+" -> "+N.state),y.blockers.set(M,N),ue({blockers:new Map(y.blockers)})}function ea(M){let{currentLocation:N,nextLocation:H,historyAction:J}=M;if(ze.size===0)return;ze.size>1&&xo(!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:H,historyAction:J}))return fe}function pt(M){let N=[];return Ee.forEach((H,J)=>{(!M||M(J))&&(H.cancel(),N.push(J),Ee.delete(J))}),N}function xf(M,N,H){if(h=M,v=N,g=H||(J=>J.key),!_&&y.navigation===dh){_=!0;let J=Kt(y.location,y.matches);J!=null&&ue({restoreScrollPosition:J})}return()=>{h=null,v=null,g=null}}function To(M,N){if(h&&g&&v){let H=N.map(re=>x1(re,y.loaderData)),J=g(M,H)||M.key;h[J]=v()}}function Kt(M,N){if(h&&g&&v){let H=N.map(fe=>x1(fe,y.loaderData)),J=g(M,H)||M.key,re=h[J];if(typeof re=="number")return re}return null}function ge(M){i=M}return j={get basename(){return o},get state(){return y},get routes(){return n},initialize:$,subscribe:Q,enableScrollRestoration:xf,navigate:st,fetch:Hr,revalidate:Fe,createHref:M=>e.history.createHref(M),encodeLocation:M=>e.history.encodeLocation(M),getFetcher:Yr,deleteFetcher:Js,dispose:le,getBlocker:Dt,deleteBlocker:jt,_internalFetchControllers:z,_internalActiveDeferreds:Ee,_internalSetRoutes:ge},j}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||".",xd(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])),_o(h)}function d1(e,t,r,n){if(!n||!PR(n))return{path:r};if(n.formMethod&&!HR(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:U_(r),formEncType:n&&n.formEncType||"application/x-www-form-urlencoded",formData:n.formData},Vn(i.formMethod))return{path:r,submission:i}}let o=_n(r),a=F_(n.formData);return t&&o.search&&rg(o.search)&&a.append("index",""),o.search="?"+a,{path:_o(o),submission:i}}function MR(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,_){let k=_?Object.values(_)[0]:v?Object.values(v)[0]:void 0,C=e.createURL(t.location),D=e.createURL(i),j=_?Object.keys(_)[0]:void 0,w=MR(r,j).filter((E,T)=>{if(E.route.lazy)return!0;if(E.route.loader==null)return!1;if(LR(t.loaderData,t.matches[T],E)||a.some(O=>O===E.route.id))return!0;let R=t.matches[T],P=E;return h1(E,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||V_(R,P)}))}),S=[];return d.forEach((E,T)=>{if(!r.some(z=>z.route.id===E.routeId))return;let R=ss(h,E.path,g);if(!R){S.push({key:T,routeId:E.routeId,path:E.path,matches:null,match:null,controller:null});return}let P=xp(R,E.path);if(c.includes(T)){S.push({key:T,routeId:E.routeId,path:E.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}))&&S.push({key:T,routeId:E.routeId,path:E.path,matches:R,match:P,controller:new AbortController})}),[w,S]}function LR(e,t,r){let n=!t||r.route.id!==t.route.id,i=e[r.route.id]===void 0;return n||i}function V_(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";xo(!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,_,k=j=>{let y,w=new Promise((S,E)=>y=E);return _=()=>y(),t.signal.addEventListener("abort",_),Promise.race([j({request:t,params:r.params,context:h}),w])};try{let j=r.route[e];if(r.route.lazy)if(j)v=(await Promise.all([k(j),m1(r.route,o,i)]))[0];else if(await m1(r.route,o,i),j=r.route[e],j)v=await k(j);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(j)v=await k(j);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(j){g=St.error,v=j}finally{_&&t.signal.removeEventListener("abort",_)}if(YR(v)){let j=v.status;if(jR.has(j)){let S=v.headers.get("Location");if(be(S,"Redirects returned/thrown from loaders/actions must have a Location header"),!Y_.test(S))S=wp(new URL(t.url),n.slice(0,n.indexOf(r)+1),a,!0,S);else if(!c){let E=new URL(t.url),T=S.startsWith("//")?new URL(E.protocol+S):new URL(S),R=Fs(T.pathname,a)!=null;T.origin===E.origin&&R&&(S=T.pathname+T.search+T.hash)}if(c)throw v.headers.set("Location",S),v;return{type:St.redirect,status:j,location:S,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(j,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(U_(t)).toString(),o={signal:r};if(n&&Vn(n.formMethod)){let{formMethod:a,formEncType:c,formData:d}=n;o.method=a.toUpperCase(),o.body=c==="application/x-www-form-urlencoded"?F_(d):d}return new Request(i,o)}function F_(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 _=t[v].route.id;if(be(!gs(g),"Cannot handle redirect results in processLoaderData"),Ha(g)){let k=as(e,_),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[_]=void 0,d||(d=!0,c=N_(g.error)?g.error.status:500),g.headers&&(h[_]=g.headers)}else so(g)?(i.set(_,g.deferredData),o[_]=g.deferredData.data):o[_]=g.data,g.statusCode!=null&&g.statusCode!==200&&!d&&(c=g.statusCode),g.headers&&(h[_]=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 U_(e){let t=typeof e=="string"?_n(e):e;return _o(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 Ha(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 HR(e){return DR.has(e.toLowerCase())}function Vn(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&&!V_(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 $_(c,v,i).then(_=>{_&&(r[a]=_||r[a])})}}}async function $_(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 x1(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 xp(e,t){let r=typeof t=="string"?_n(t).search:t.search;if(e[e.length-1].route.index&&rg(r||""))return e[e.length-1];let n=xd(e);return n[n.length-1]}/** + */function Oe(){return Oe=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u")throw new Error(t)}function xo(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"?_n(t):t,{state:r,key:t&&t.key||n||tR()})}function _o(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 _n(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 j=g(),y=j==null?null:j-h;h=j,d&&d({action:c,location:D.location,delta:y})}function _(j,y){c=vt.Push;let w=ul(D.location,j,y);r&&r(w,j),h=g()+1;let S=l1(w,h),E=D.createHref(w);try{a.pushState(S,"",E)}catch{i.location.assign(E)}o&&d&&d({action:c,location:D.location,delta:1})}function k(j,y){c=vt.Replace;let w=ul(D.location,j,y);r&&r(w,j),h=g();let S=l1(w,h),E=D.createHref(w);a.replaceState(S,"",E),o&&d&&d({action:c,location:D.location,delta:0})}function C(j){let y=i.location.origin!=="null"?i.location.origin:i.location.href,w=typeof j=="string"?j:_o(j);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(j){if(d)throw new Error("A history only accepts one active listener");return i.addEventListener(a1,v),d=j,()=>{i.removeEventListener(a1,v),d=null}},createHref(j){return t(i,j)},createURL:C,encodeLocation(j){let y=C(j);return{pathname:y.pathname,search:y.search,hash:y.hash}},push:_,replace:k,go(j){return a.go(j)}};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 L_(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=L_(i.children,t,a,n)),d}})}function ss(e,t,r){r===void 0&&(r="/");let n=typeof t=="string"?_n(t):t,i=Fs(n.pathname||"/",r);if(i==null)return null;let o=M_(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+'".')),M_(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 I_(o.path))i(o,a,d)}),t}function I_(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=I_(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 _=c[v]||"";a=o.slice(0,o.length-_.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),xo(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 xo(!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 xo(!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"?_n(e):e;return{pathname:r?r.startsWith("/")?r:xR(r,t):t,search:SR(n),hash:bR(i)}}function xR(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 xd(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=_n(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 _=a.split("/");for(;_[0]==="..";)_.shift(),v-=1;i.pathname=_.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,"/"),_R=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 N_(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const z_=["post","put","patch","delete"],kR=new Set(z_),CR=["get",...z_],DR=new Set(CR),jR=new Set([301,302,303,307,308]),ER=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},Y_=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,V_=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",TR=!V_,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=L_(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,_=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),j,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,S=!1,E,T=!1,R=!1,P=[],O=[],z=new Map,Y=0,ee=-1,te=new Map,G=new Set,lt=new Map,Ee=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}xo(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(){jt(re),ue({blockers:new Map(j.state.blockers)})}});return}return K(N,V)}),y.initialized||K(vt.Pop,y.location),j}function le(){c&&c(),d.clear(),E&&E.abort(),y.fetchers.forEach((L,N)=>Js(N)),y.blockers.forEach((L,N)=>jt(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)jt(ne);let ce=S===!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,S=!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,xe=vt.Push;ne===!0?xe=vt.Replace:ne===!1||re!=null&&Hn(re.formMethod)&&re.formAction===y.location.pathname+y.location.search&&(xe=vt.Replace);let ae=N&&"preventScrollReset"in N?N.preventScrollReset===!0:void 0,xt=ea({currentLocation:ie,nextLocation:ce,historyAction:xe});if(xt){di(xt,{state:"blocked",location:ce,proceed(){di(xt,{state:"proceeding",proceed:void 0,reset:void 0,location:ce}),st(L,N)},reset(){jt(xt),ue({blockers:new Map(y.blockers)})}});return}return await K(xe,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){E&&E.abort(),E=null,w=L,T=(V&&V.startUninterruptedRevalidation)===!0,To(y.location,y.matches),S=(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}E=new AbortController;let ie=va(e.history,N,E.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:xe,loaderData:ae,errors:xt}=await rr(ie,N,fe,re,V&&V.submission,V&&V.fetcherSubmission,V&&V.replace,ce,ne);xe||(E=null,he(N,Oe({matches:fe},ce?{actionData:ce}:{},{loaderData:ae,errors:xt})))}async function zt(L,N,V,J,re){qs();let fe=Oe({state:"submitting",location:N},V);ue({navigation:fe});let ie,ce=xp(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 xe=J;xe||(xe=Oe({state:"loading",location:N,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},re));let ae=re||fe?re||fe:xe.formMethod&&xe.formAction&&xe.formData&&xe.formEncType?{formMethod:xe.formMethod,formAction:xe.formAction,formData:xe.formData,formEncType:xe.formEncType}:void 0,xt=i||n,[ct,tt]=f1(e.history,y,V,ae,N,R,P,O,lt,xt,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:xe},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));E&&E.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};E&&E.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:jn,errors:ta}=p1(y,V,ct,on,ne,tt,Dn,Ee);Ee.forEach((Ue,nr)=>{Ue.subscribe(gt=>{(gt||Ue.done)&&Ee.delete(nr)})});let En=Fl(),fi=ui(ee),X=En||fi||tt.length>0;return Oe({loaderData:jn,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),xe=xp(ie,ce);if(S=(J&&J.preventScrollReset)===!0,ne&&Hn(ne.formMethod)){mr(L,N,ce,xe,ie,ne);return}lt.set(L,{routeId:N,path:ce}),Ki(L,N,ce,xe,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,xe=va(e.history,V,ne.signal,fe);z.set(L,ne);let ae=await ga("action",xe,J,re,r,t,o);if(xe.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 xt=y.navigation.location||y.location,ct=va(e.history,xt,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,xt,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),Et={state:"loading",data:Ul&&Ul.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};y.fetchers.set(An,Et),me.controller&&z.set(An,me.controller)}),ue({fetchers:new Map(y.fetchers)});let jn=()=>sn.forEach(me=>ci(me.key));ne.signal.addEventListener("abort",jn);let{results:ta,loaderResults:En,fetcherResults:fi}=await pr(y.matches,Yt,Dn,sn,ct);if(ne.signal.aborted)return;ne.signal.removeEventListener("abort",jn),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,En,void 0,sn,fi,Ee),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"),E&&E.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,xe=va(e.history,V,ne.signal);z.set(L,ne);let ae=await ga("loader",xe,J,re,r,t,o);if(so(ae)&&(ae=await $_(ae,xe.signal,!0)||ae),z.get(L)===ne&&z.delete(L),xe.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 xt={state:"idle",data:ae.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};y.fetchers.set(L,xt),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"),Y_.test(N.location)&&V_&&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}}E=null;let ne=fe===!0?vt.Replace:vt.Push,{formMethod:xe,formAction:ae,formEncType:xt,formData:ct}=L.navigation;!re&&xe&&ae&&ct&&xt&&(re={formMethod:xe,formAction:ae,formEncType:xt,formData:ct}),ER.has(N.status)&&re&&Hn(re.formMethod)?await K(ne,ce,{submission:Oe({},re,{formAction:N.location}),preventScrollReset:S}):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:S}):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:S})}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 jt(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&&xo(!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 Ee.forEach((V,J)=>{(!L||L(J))&&(V.cancel(),N.push(J),Ee.delete(J))}),N}function xf(L,N,V){if(h=L,v=N,g=V||(J=>J.key),!_&&y.navigation===dh){_=!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=>x1(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=>x1(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 j={get basename(){return o},get state(){return y},get routes(){return n},initialize:$,subscribe:Q,enableScrollRestoration:xf,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:jt,_internalFetchControllers:z,_internalActiveDeferreds:Ee,_internalSetRoutes:ge},j}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||".",xd(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])),_o(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:U_(r),formEncType:n&&n.formEncType||"application/x-www-form-urlencoded",formData:n.formData},Hn(i.formMethod))return{path:r,submission:i}}let o=_n(r),a=F_(n.formData);return t&&o.search&&rg(o.search)&&a.append("index",""),o.search="?"+a,{path:_o(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,_){let k=_?Object.values(_)[0]:v?Object.values(v)[0]:void 0,C=e.createURL(t.location),D=e.createURL(i),j=_?Object.keys(_)[0]:void 0,w=LR(r,j).filter((E,T)=>{if(E.route.lazy)return!0;if(E.route.loader==null)return!1;if(MR(t.loaderData,t.matches[T],E)||a.some(O=>O===E.route.id))return!0;let R=t.matches[T],P=E;return h1(E,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||H_(R,P)}))}),S=[];return d.forEach((E,T)=>{if(!r.some(z=>z.route.id===E.routeId))return;let R=ss(h,E.path,g);if(!R){S.push({key:T,routeId:E.routeId,path:E.path,matches:null,match:null,controller:null});return}let P=xp(R,E.path);if(c.includes(T)){S.push({key:T,routeId:E.routeId,path:E.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}))&&S.push({key:T,routeId:E.routeId,path:E.path,matches:R,match:P,controller:new AbortController})}),[w,S]}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 H_(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";xo(!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,_,k=j=>{let y,w=new Promise((S,E)=>y=E);return _=()=>y(),t.signal.addEventListener("abort",_),Promise.race([j({request:t,params:r.params,context:h}),w])};try{let j=r.route[e];if(r.route.lazy)if(j)v=(await Promise.all([k(j),m1(r.route,o,i)]))[0];else if(await m1(r.route,o,i),j=r.route[e],j)v=await k(j);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(j)v=await k(j);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(j){g=St.error,v=j}finally{_&&t.signal.removeEventListener("abort",_)}if(YR(v)){let j=v.status;if(jR.has(j)){let S=v.headers.get("Location");if(be(S,"Redirects returned/thrown from loaders/actions must have a Location header"),!Y_.test(S))S=wp(new URL(t.url),n.slice(0,n.indexOf(r)+1),a,!0,S);else if(!c){let E=new URL(t.url),T=S.startsWith("//")?new URL(E.protocol+S):new URL(S),R=Fs(T.pathname,a)!=null;T.origin===E.origin&&R&&(S=T.pathname+T.search+T.hash)}if(c)throw v.headers.set("Location",S),v;return{type:St.redirect,status:j,location:S,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(j,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(U_(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"?F_(d):d}return new Request(i,o)}function F_(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 _=t[v].route.id;if(be(!gs(g),"Cannot handle redirect results in processLoaderData"),Va(g)){let k=as(e,_),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[_]=void 0,d||(d=!0,c=N_(g.error)?g.error.status:500),g.headers&&(h[_]=g.headers)}else so(g)?(i.set(_,g.deferredData),o[_]=g.deferredData.data):o[_]=g.data,g.statusCode!=null&&g.statusCode!==200&&!d&&(c=g.statusCode),g.headers&&(h[_]=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 U_(e){let t=typeof e=="string"?_n(e):e;return _o(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&&!H_(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 $_(c,v,i).then(_=>{_&&(r[a]=_||r[a])})}}}async function $_(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 x1(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 xp(e,t){let r=typeof t=="string"?_n(t).search:t.search;if(e[e.length-1].route.index&&rg(r||""))return e[e.length-1];let n=xd(e);return n[n.length-1]}/** * React Router v6.11.1 * * Copyright (c) Remix Software Inc. @@ -55,7 +55,7 @@ Error generating stack: `+o.message+` * 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 G_(()=>{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 K_(e,t){let{relative:r}=t===void 0?{}:t,{matches:n}=I.useContext(oi),{pathname:i}=si(),o=JSON.stringify(xd(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"?_n(t):t;c==="/"||(g=D.pathname)!=null&&g.startsWith(c)||be(!1),h=D}else h=d;let v=h.pathname||"/",_=c==="/"?v:v.slice(c.length)||"/",k=ss(e,{pathname:_}),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(_d.Provider,{value:{location:Ru({pathname:"/",search:"",hash:"",state:null,key:"default"},h),navigationType:vt.Pop}},C):C}function WR(){let e=eO(),t=N_(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(W_.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 _=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:_,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:_,isDataRoute:!0}}):k()},null)}var _p;(function(e){e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate"})(_p||(_p={}));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(B_);return t||be(!1),t}function JR(e){let t=I.useContext(oi);return t||be(!1),t}function X_(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(W_),r=ZR(dl.UseRouteError),n=X_(dl.UseRouteError);return t||((e=r.errors)==null?void 0:e[n])}function tO(){let{router:e}=qR(_p.UseNavigateStable),t=X_(dl.UseNavigateStable),r=I.useRef(!1);return G_(()=>{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(B_.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=_n(n));let{pathname:h="/",search:g="",hash:v="",state:_=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:_,key:k},navigationType:i}},[c,h,g,v,_,k,i]);return C==null?null:I.createElement(Us.Provider,{value:d},I.createElement(_d.Provider,{children:r,value:C}))}var _1;(function(e){e[e.pending=0]="pending",e[e.success=1]="success",e[e.error=2]="error"})(_1||(_1={}));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}/** + */function Ru(){return Ru=Object.assign?Object.assign.bind():function(e){for(var t=1;tc.pathnameBase)),o=I.useRef(!1);return G_(()=>{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 K_(e,t){let{relative:r}=t===void 0?{}:t,{matches:n}=I.useContext(oi),{pathname:i}=si(),o=JSON.stringify(xd(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"?_n(t):t;c==="/"||(g=D.pathname)!=null&&g.startsWith(c)||be(!1),h=D}else h=d;let v=h.pathname||"/",_=c==="/"?v:v.slice(c.length)||"/",k=ss(e,{pathname:_}),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(_d.Provider,{value:{location:Ru({pathname:"/",search:"",hash:"",state:null,key:"default"},h),navigationType:vt.Pop}},C):C}function WR(){let e=eO(),t=N_(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(W_.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 _=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:_,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:_,isDataRoute:!0}}):k()},null)}var _p;(function(e){e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate"})(_p||(_p={}));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(B_);return t||be(!1),t}function JR(e){let t=I.useContext(oi);return t||be(!1),t}function X_(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(W_),r=ZR(dl.UseRouteError),n=X_(dl.UseRouteError);return t||((e=r.errors)==null?void 0:e[n])}function tO(){let{router:e}=qR(_p.UseNavigateStable),t=X_(dl.UseNavigateStable),r=I.useRef(!1);return G_(()=>{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(B_.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=_n(n));let{pathname:h="/",search:g="",hash:v="",state:_=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:_,key:k},navigationType:i}},[c,h,g,v,_,k,i]);return C==null?null:I.createElement(Us.Provider,{value:d},I.createElement(_d.Provider,{children:r,value:C}))}var _1;(function(e){e[e.pending=0]="pending",e[e.success=1]="success",e[e.error=2]="error"})(_1||(_1={}));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. @@ -64,10 +64,10 @@ Error generating stack: `+o.message+` * 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:_}=I.useContext(Us),k,C=!1;if(typeof h=="string"&&pO.test(h)&&(k=h,mO))try{let w=new URL(window.location.href),S=h.startsWith("//")?new URL(w.protocol+h):new URL(h),E=Fs(S.pathname,_);S.origin===w.origin&&E!=null?h=E+S.search+S.hash:C=!0}catch{}let D=VR(h,{relative:i}),j=gO(h,{replace:a,state:c,target:d,preventScrollReset:g,relative:i});function y(w){n&&n(w),w.defaultPrevented||j(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=K_(e,{relative:a});return I.useCallback(g=>{if(cO(g,r)){g.preventDefault();let v=n!==void 0?n:_o(d)===_o(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,--Mr):0,Rs--,yt===10&&(Rs=1,bd--),yt}function Zr(){return yt=Mr2||Sp(yt)>3?"":" "}function EO(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 Mr;case 34:case 39:e!==34&&e!==39&&bp(yt);break;case 40:e===41&&bp(e);break;case 92:Zr();break}return Mr}function AO(e,t){for(;Zr()&&e+yt!==47+10;)if(e+yt===42+42&&fo()===47)break;return"/*"+Cd(t,Mr-1)+"*"+og(e===47?e:Zr())}function TO(e){for(;!Sp(fo());)Zr();return Cd(e,Mr)}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,_=0,k=0,C=0,D=1,j=1,y=1,w=0,S="",E=i,T=o,R=n,P=S;j;)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+=jO(C);break;case 92:P+=EO(Jc()-1,7);continue;case 47:switch(fo()){case 42:case 47:xc(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:j=0;case 59+g:y==-1&&(P=ye(P,/\f/g,"")),k>0&&$n(P)-v&&xc(k>32?C1(P+";",n,r,v-1):C1(ye(P," ","")+";",n,r,v-2),d);break;case 59:P+=";";default:if(xc(R=k1(P,t,r,h,g,i,c,S,E=[],T=[],v),o),w===123)if(g===0)eu(P,t,R,R,E,o,v,c,T);else switch(_===99&&Tt(P,3)===110?100:_){case 100:case 108:case 109:case 115:eu(e,R,R,n&&xc(k1(e,R,R,0,0,i,c,S,i,E=[],v),T),i,T,v,c,n?E:T);break;default:eu(P,R,R,R,[""],T,0,c,T)}}h=g=k=0,D=y=1,S=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())),_=fo(),g=v=$n(S=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,_=i===0?o:[""],k=sg(_),C=0,D=0,j=0;C0?_[y]+" "+w:ye(w,/&\f/g,_[y])))&&(d[j++]=S);return kd(e,t,r,i===0?Sd:c,d,h,g)}function OO(e,t,r){return kd(e,t,r,Q_,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(_O(e,t)){case 5103:return Me+"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 Me+e+e;case 4789:return Va+e+e;case 5349:case 4246:case 4810:case 6968:case 2756:return Me+e+Va+e+We+e+e;case 5936:switch(Tt(e,t+11)){case 114:return Me+e+We+ye(e,/[svh]\w+-[tblr]{2}/,"tb")+e;case 108:return Me+e+We+ye(e,/[svh]\w+-[tblr]{2}/,"tb-rl")+e;case 45:return Me+e+We+ye(e,/[svh]\w+-[tblr]{2}/,"lr")+e}case 6828:case 4268:case 2903:return Me+e+We+e+e;case 6165:return Me+e+We+"flex-"+e+e;case 5187:return Me+e+ye(e,/(\w+).+(:[^]+)/,Me+"box-$1$2"+We+"flex-$1$2")+e;case 5443:return Me+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 Me+e+We+"flex-line-pack"+ye(e,/align-content|flex-|-self/g,"")+e;case 5548:return Me+e+We+ye(e,"shrink","negative")+e;case 5292:return Me+e+We+ye(e,"basis","preferred-size")+e;case 6060:return Me+"box-"+ye(e,"-grow","")+Me+e+We+ye(e,"grow","positive")+e;case 4554:return Me+ye(e,/([^-])(transform)/g,"$1"+Me+"$2")+e;case 6187:return ye(ye(ye(e,/(zoom-|grab)/,Me+"$1"),/(image-set)/,Me+"$1"),e,"")+e;case 5495:case 3959:return ye(e,/(image-set\([^]*)/,Me+"$1$`$1");case 4968:return ye(ye(e,/(.+:)(flex-)?(.*)/,Me+"box-pack:$3"+We+"flex-pack:$3"),/s.+-b[^;]+/,"justify")+Me+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(.+)/,Me+"$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"+Me+"$2-$3$1"+Va+(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,":",":"+Me)+e;break;case 6444:switch(Tt(e,Tt(e,14)===45?18:11)){case 120:return ye(e,/(.+:)([^;\s!]+)(;|(\s+)?!.+)?/,"$1"+Me+(Tt(e,14)===45?"inline-":"")+"box$3$1"+Me+"$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 q_:return Fa([ya(e,{value:ye(e.value,"@","@"+Me)})],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+)/,":"+Va+"$1")]})],n);case"::placeholder":return Fa([ya(e,{props:[ye(i,/:(plac\w+)/,":"+Me+"input-$1")]}),ya(e,{props:[ye(i,/:(plac\w+)/,":"+Va+"$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,HO=/(^-|-$)/g;function D1(e){return e.replace(YO,"-").replace(HO,"")}var VO=/(a)(d)/gi,j1=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=j1(t%52)+r;return(j1(t%52)+r).replace(VO,"$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 E1(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=E1(e),a=E1(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)&&(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:_}=I.useContext(Us),k,C=!1;if(typeof h=="string"&&pO.test(h)&&(k=h,mO))try{let w=new URL(window.location.href),S=h.startsWith("//")?new URL(w.protocol+h):new URL(h),E=Fs(S.pathname,_);S.origin===w.origin&&E!=null?h=E+S.search+S.hash:C=!0}catch{}let D=HR(h,{relative:i}),j=gO(h,{replace:a,state:c,target:d,preventScrollReset:g,relative:i});function y(w){n&&n(w),w.defaultPrevented||j(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=K_(e,{relative:a});return I.useCallback(g=>{if(cO(g,r)){g.preventDefault();let v=n!==void 0?n:_o(d)===_o(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 EO(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,_=0,k=0,C=0,D=1,j=1,y=1,w=0,S="",E=i,T=o,R=n,P=S;j;)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+=jO(C);break;case 92:P+=EO(Jc()-1,7);continue;case 47:switch(fo()){case 42:case 47:xc(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:j=0;case 59+g:y==-1&&(P=ye(P,/\f/g,"")),k>0&&$n(P)-v&&xc(k>32?C1(P+";",n,r,v-1):C1(ye(P," ","")+";",n,r,v-2),d);break;case 59:P+=";";default:if(xc(R=k1(P,t,r,h,g,i,c,S,E=[],T=[],v),o),w===123)if(g===0)eu(P,t,R,R,E,o,v,c,T);else switch(_===99&&Tt(P,3)===110?100:_){case 100:case 108:case 109:case 115:eu(e,R,R,n&&xc(k1(e,R,R,0,0,i,c,S,i,E=[],v),T),i,T,v,c,n?E:T);break;default:eu(P,R,R,R,[""],T,0,c,T)}}h=g=k=0,D=y=1,S=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())),_=fo(),g=v=$n(S=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,_=i===0?o:[""],k=sg(_),C=0,D=0,j=0;C0?_[y]+" "+w:ye(w,/&\f/g,_[y])))&&(d[j++]=S);return kd(e,t,r,i===0?Sd:c,d,h,g)}function OO(e,t,r){return kd(e,t,r,Q_,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(_O(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 q_: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,j1=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=j1(t%52)+r;return(j1(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 E1(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=E1(e),a=E1(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&&(_+="".concat(k,","))}),i+="".concat(g).concat(v,'{content:"').concat(_,'"}').concat(`/*!sc*/ -`)},a=0;a0?".".concat(t):_},g=d.slice();a.prefix&&g.unshift(LO),g.push(function(_){_.type===Sd&&_.value.includes("&")&&(_.props[0]=_.props[0].replace(lP,r).replace(n,h))},PO);var v=function(_,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 j=_.replace(cP,""),y=RO(C||k?"".concat(C," ").concat(k," { ").concat(j," }"):j);return a.namespace&&(y=uS(y,a.namespace)),function(w,S){for(var E=[],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,_=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 j=t.shouldForwardProp;C=function(T,R){return D(T,R)&&j(T,R)}}else C=D}var y=new pP(r,_,n?i.componentStyle:void 0),w=y.isStatic&&c.length===0;function S(T,R){return function(P,O,z,Y){var ee=P.attrs,te=P.componentStyle,G=P.defaultProps,lt=P.foldedComponentIds,Ee=P.styledComponentId,ze=P.target,mt=dg(),$=Ep(),le=P.shouldForwardProp||$.shouldForwardProp,Q=function(zt,rr,Yr){for(var Hr,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;r0?".".concat(t):_},g=d.slice();a.prefix&&g.unshift(MO),g.push(function(_){_.type===Sd&&_.value.includes("&")&&(_.props[0]=_.props[0].replace(lP,r).replace(n,h))},PO);var v=function(_,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 j=_.replace(cP,""),y=RO(C||k?"".concat(C," ").concat(k," { ").concat(j," }"):j);return a.namespace&&(y=uS(y,a.namespace)),function(w,S){for(var E=[],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,_=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 j=t.shouldForwardProp;C=function(T,R){return D(T,R)&&j(T,R)}}else C=D}var y=new pP(r,_,n?i.componentStyle:void 0),w=y.isStatic&&c.length===0;function S(T,R){return function(P,O,z,Y){var ee=P.attrs,te=P.componentStyle,G=P.defaultProps,lt=P.foldedComponentIds,Ee=P.styledComponentId,ze=P.target,mt=dg(),$=Ep(),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"?EP:jP;vS.useSyncExternalStore=Ps.useSyncExternalStore!==void 0?Ps.useSyncExternalStore:AP;(function(e){e.exports=vS})(xP);var L1={},TP={get exports(){return L1},set exports(e){L1=e}},yS={};/** + */var Ps=I;function _P(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var SP=typeof Object.is=="function"?Object.is:_P,bP=Ps.useState,kP=Ps.useEffect,CP=Ps.useLayoutEffect,DP=Ps.useDebugValue;function jP(e,t){var r=t(),n=bP({inst:{value:r,getSnapshot:t}}),i=n[0].inst,o=n[1];return CP(function(){i.value=r,i.getSnapshot=t,vh(i)&&o({inst:i})},[e,r,t]),kP(function(){return vh(i)&&o({inst:i}),e(function(){vh(i)&&o({inst:i})})},[e]),DP(r),r}function vh(e){var t=e.getSnapshot;e=e.value;try{var r=t();return!SP(e,r)}catch{return!0}}function EP(e,t){return t()}var AP=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?EP:jP;vS.useSyncExternalStore=Ps.useSyncExternalStore!==void 0?Ps.useSyncExternalStore:AP;(function(e){e.exports=vS})(xP);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 * @@ -83,14 +83,14 @@ Error generating stack: `+o.message+` * * 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,MP=RP.useSyncExternalStore,LP=Dd.useRef,IP=Dd.useEffect,NP=Dd.useMemo,zP=Dd.useDebugValue;yS.useSyncExternalStoreWithSelector=function(e,t,r,n,i){var o=LP(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,_=r===void 0?null:r;return[function(){return d(t())},_===null?void 0:function(){return d(_())}]},[t,r,n,i]);var c=MP(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 HP=e=>wS=e,VP=()=>wS,FP=I.createContext(null);var Rp={},UP={get exports(){return Rp},set exports(e){Rp=e}},Ie={};/** @license React v16.13.1 + */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,_=r===void 0?null:r;return[function(){return d(t())},_===null?void 0:function(){return d(_())}]},[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 Mt=typeof Symbol=="function"&&Symbol.for,fg=Mt?Symbol.for("react.element"):60103,hg=Mt?Symbol.for("react.portal"):60106,jd=Mt?Symbol.for("react.fragment"):60107,Ed=Mt?Symbol.for("react.strict_mode"):60108,Ad=Mt?Symbol.for("react.profiler"):60114,Td=Mt?Symbol.for("react.provider"):60109,Rd=Mt?Symbol.for("react.context"):60110,mg=Mt?Symbol.for("react.async_mode"):60111,Od=Mt?Symbol.for("react.concurrent_mode"):60111,Pd=Mt?Symbol.for("react.forward_ref"):60112,Md=Mt?Symbol.for("react.suspense"):60113,$P=Mt?Symbol.for("react.suspense_list"):60120,Ld=Mt?Symbol.for("react.memo"):60115,Id=Mt?Symbol.for("react.lazy"):60116,BP=Mt?Symbol.for("react.block"):60121,WP=Mt?Symbol.for("react.fundamental"):60117,GP=Mt?Symbol.for("react.responder"):60118,KP=Mt?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 jd:case Ad:case Ed:case Md:return e;default:switch(e=e&&e.$$typeof,e){case Rd:case Pd:case Id:case Ld:case Td:return e;default:return t}}case hg:return t}}}function xS(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=jd;Ie.Lazy=Id;Ie.Memo=Ld;Ie.Portal=hg;Ie.Profiler=Ad;Ie.StrictMode=Ed;Ie.Suspense=Md;Ie.isAsyncMode=function(e){return xS(e)||kr(e)===mg};Ie.isConcurrentMode=xS;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)===jd};Ie.isLazy=function(e){return kr(e)===Id};Ie.isMemo=function(e){return kr(e)===Ld};Ie.isPortal=function(e){return kr(e)===hg};Ie.isProfiler=function(e){return kr(e)===Ad};Ie.isStrictMode=function(e){return kr(e)===Ed};Ie.isSuspense=function(e){return kr(e)===Md};Ie.isValidElementType=function(e){return typeof e=="string"||typeof e=="function"||e===jd||e===Od||e===Ad||e===Ed||e===Md||e===$P||typeof e=="object"&&e!==null&&(e.$$typeof===Id||e.$$typeof===Ld||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 _S=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[_S.ForwardRef]=XP;SS[_S.Memo]=QP;var I1={},qP={get exports(){return I1},set exports(e){I1=e}},Ne={};/** + */var Lt=typeof Symbol=="function"&&Symbol.for,fg=Lt?Symbol.for("react.element"):60103,hg=Lt?Symbol.for("react.portal"):60106,jd=Lt?Symbol.for("react.fragment"):60107,Ed=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 jd:case Ad:case Ed: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 xS(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=jd;Ie.Lazy=Id;Ie.Memo=Md;Ie.Portal=hg;Ie.Profiler=Ad;Ie.StrictMode=Ed;Ie.Suspense=Ld;Ie.isAsyncMode=function(e){return xS(e)||kr(e)===mg};Ie.isConcurrentMode=xS;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)===jd};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)===Ed};Ie.isSuspense=function(e){return kr(e)===Ld};Ie.isValidElementType=function(e){return typeof e=="string"||typeof e=="function"||e===jd||e===Od||e===Ad||e===Ed||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 _S=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[_S.ForwardRef]=XP;SS[_S.Memo]=QP;var I1={},qP={get exports(){return I1},set exports(e){I1=e}},Ne={};/** * @license React * react-is.production.min.js * @@ -98,7 +98,7 @@ Error generating stack: `+o.message+` * * 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"),Hd=Symbol.for("react.provider"),Vd=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 Lr(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 Vd:case Fd:case Wd:case Bd:case Hd:return e;default:return t}}case gg:return t}}}Ne.ContextConsumer=Vd;Ne.ContextProvider=Hd;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 Lr(e)===Vd};Ne.isContextProvider=function(e){return Lr(e)===Hd};Ne.isElement=function(e){return typeof e=="object"&&e!==null&&e.$$typeof===pg};Ne.isForwardRef=function(e){return Lr(e)===Fd};Ne.isFragment=function(e){return Lr(e)===Nd};Ne.isLazy=function(e){return Lr(e)===Wd};Ne.isMemo=function(e){return Lr(e)===Bd};Ne.isPortal=function(e){return Lr(e)===gg};Ne.isProfiler=function(e){return Lr(e)===Yd};Ne.isStrictMode=function(e){return Lr(e)===zd};Ne.isSuspense=function(e){return Lr(e)===Ud};Ne.isSuspenseList=function(e){return Lr(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===Hd||e.$$typeof===Vd||e.$$typeof===Fd||e.$$typeof===bS||e.getModuleId!==void 0)};Ne.typeOf=Lr;(function(e){e.exports=Ne})(qP);function e4(){const e=VP();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)}HP(su.unstable_batchedUpdates);const o4=wP` + */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; } @@ -432,7 +432,7 @@ Error generating stack: `+o.message+` &: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(E4,{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(ES);return I.useEffect(()=>{c("false")},[d,o.pathname]),l.jsxs(j4,{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))}),jS="/zh-cn/assets/logo-light-4c8441f8.svg",M4=f.header` +`,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(E4,{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(ES);return I.useEffect(()=>{c("false")},[d,o.pathname]),l.jsxs(j4,{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))}),jS="/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"}; @@ -444,7 +444,7 @@ Error generating stack: `+o.message+` transition: all 0.3s; // - - - /* background-color: ${e=>e.theme.themeDark}; */ -`,L4=f.div` +`,M4=f.div` display: flex; align-items: center; height: 100%; @@ -467,7 +467,7 @@ Error generating stack: `+o.message+` border-radius: 0.24rem; border: 0.02rem solid #7680DD; margin-left: 0.24rem; -`,ES=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"]]),H4=({items:e,color:t="dark",mode:r="default"})=>{const n=ht(),i=si(),o=Y4.get(i.pathname.split("/")[1]);return l.jsx(ES.Provider,{value:{color:t,mode:r,activeId:o},children:l.jsx(M4,{color:t,mode:r,children:l.jsxs(L4,{children:[l.jsx(I4,{src:jS,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:V4}=Pe,{CNBodyLarge:TS}=V4,F4=f.footer` +`,ES=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(ES.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:jS,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` @@ -510,11 +510,11 @@ Error generating stack: `+o.message+` 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:jS}),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; -`,eM=()=>{const e=si(),[t,r]=I.useState("down"),[n,i]=I.useState(!1);I.useEffect(()=>{let d=window.scrollY,h=!1;const g=()=>{const _=window.scrollY;if(_>1e3?i(!0):i(!1),Math.abs(_-d)<0){h=!1;return}r(_>d?"down":"up"),d=_>0?_: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(H4,{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 tM="Expected a function",z1=0/0,rM="[object Symbol]",nM=/^\s+|\s+$/g,iM=/^[-+]0x[0-9a-f]+$/i,oM=/^0b[01]+$/i,sM=/^0o[0-7]+$/i,aM=parseInt,lM=typeof Go=="object"&&Go&&Go.Object===Object&&Go,cM=typeof self=="object"&&self&&self.Object===Object&&self,uM=lM||cM||Function("return this")(),dM=Object.prototype,fM=dM.toString,hM=Math.max,mM=Math.min,yh=function(){return uM.Date.now()};function pM(e,t,r){var n,i,o,a,c,d,h=0,g=!1,v=!1,_=!0;if(typeof e!="function")throw new TypeError(tM);t=Y1(t)||0,Op(r)&&(g=!!r.leading,v="maxWait"in r,o=v?hM(Y1(r.maxWait)||0,t):o,_="trailing"in r?!!r.trailing:_);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?mM(z,o-O):z}function j(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(j(R))return w(R);c=setTimeout(y,D(R))}function w(R){return c=void 0,_&&n?k(R):(n=i=void 0,a)}function S(){c!==void 0&&clearTimeout(c),h=0,n=d=i=c=void 0}function E(){return c===void 0?a:w(yh())}function T(){var R=yh(),P=j(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=S,T.flush=E,T}function Op(e){var t=typeof e;return!!e&&(t=="object"||t=="function")}function gM(e){return!!e&&typeof e=="object"}function vM(e){return typeof e=="symbol"||gM(e)&&fM.call(e)==rM}function Y1(e){if(typeof e=="number")return e;if(vM(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(nM,"");var r=oM.test(e);return r||sM.test(e)?aM(e.slice(2),r?2:8):iM.test(e)?z1:+e}var yM=pM,Ms={},wM={get exports(){return Ms},set exports(e){Ms=e}};/*! +`,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 _=window.scrollY;if(_>1e3?i(!0):i(!1),Math.abs(_-d)<0){h=!1;return}r(_>d?"down":"up"),d=_>0?_: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,_=!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,_="trailing"in r?!!r.trailing:_);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 j(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(j(R))return w(R);c=setTimeout(y,D(R))}function w(R){return c=void 0,_&&n?k(R):(n=i=void 0,a)}function S(){c!==void 0&&clearTimeout(c),h=0,n=d=i=c=void 0}function E(){return c===void 0?a:w(yh())}function T(){var R=yh(),P=j(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=S,T.flush=E,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=LS;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 Mu=function(t){return t&&t.offsetWidth||0};W.getWidth=Mu;var xg=function(t){return t&&t.offsetHeight||0};W.getHeight=xg;var _g=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=_g;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 kM=function(t,r){var n={};return r.forEach(function(i){return n[i]=t[i]}),n};W.extractObject=kM;var CM=function(t){var r=xM.default.Children.count(t.children),n=t.listRef,i=Math.ceil(Mu(n)),o=t.trackRef&&t.trackRef.node,a=Math.ceil(Mu(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&&xg(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 _=t.lazyLoadedList||[],k=vg(Ze(Ze({},t),{},{currentSlide:v,lazyLoadedList:_}));_=_.concat(k);var C={slideCount:r,slideWidth:c,listWidth:i,trackWidth:a,currentSlide:v,slideHeight:h,listHeight:g,lazyLoadedList:_};return t.autoplaying===null&&t.autoplay&&(C.autoplaying="playing"),C};W.initializedState=CM;var DM=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,_=t.slidesToShow,k=t.useCSS,C=t.lazyLoadedList;if(r&&n)return{};var D=a,j,y,w,S={},E={},T=o?a:MS(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)),S={animating:!0,currentSlide:D,lazyLoadedList:C,targetSlide:D},E={animating:!1,targetSlide:D}}else j=D,D<0?(j=D+c,o?c%v!==0&&(j=c-c%v):j=0):!Sg(t)&&D>h?D=j=h:g&&D>=c?(D=o?c:c-1,j=o?0:c-1):D>=c&&(j=D-c,o?c%v!==0&&(j=0):j=c-_),!o&&D+_>=c&&(j=c-_),y=gl(Ze(Ze({},t),{},{slideIndex:D})),w=gl(Ze(Ze({},t),{},{slideIndex:j})),o||(y===w&&(D=j),y=w),d&&(C=C.concat(vg(Ze(Ze({},t),{},{currentSlide:D})))),k?(S={animating:!0,currentSlide:j,trackStyle:bg(Ze(Ze({},t),{},{left:y})),lazyLoadedList:C,targetSlide:T},E={animating:!1,currentSlide:j,trackStyle:pl(Ze(Ze({},t),{},{left:w})),swipeLeft:null,targetSlide:T}):S={currentSlide:j,trackStyle:pl(Ze(Ze({},t),{},{left:w})),lazyLoadedList:C,targetSlide:T};return{state:S,nextState:E}};W.slideHandler=DM;var jM=function(t,r){var n,i,o,a,c,d=t.slidesToScroll,h=t.slidesToShow,g=t.slideCount,v=t.currentSlide,_=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=_-d);else if(r.message==="next")o=n===0?d:n,c=v+o,k&&!C&&(c=(v+d)%g+n),C||(c=_+d);else if(r.message==="dots")c=r.index*r.slidesToScroll;else if(r.message==="children"){if(c=r.index,C){var D=HS(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/j),te=_g(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&&_&&(_(te),P.edgeDragged=!0)),!k&&S&&(S(te),P.swiped=!0),o?R=O+G*(E/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=TM;var RM=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,_=r.onSwipe,k=r.targetSlide,C=r.currentSlide,D=r.infinite;if(!n)return i&&ho(t),{};var j=d?h/c:a/c,y=_g(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>j){ho(t),_&&_(y);var S,E,T=D?C:k;switch(y){case"left":case"up":E=T+Mp(r),S=g?Pp(r,E):E,w.currentDirection=0;break;case"right":case"down":E=T-Mp(r),S=g?Pp(r,E):E,w.currentDirection=1;break;default:S=T}w.triggerSlideHandler=S}else{var R=gl(r);w.trackStyle=bg(Ze(Ze({},r),{},{left:R}))}return w};W.swipeEnd=RM;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+Mu(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=Mp;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,_=t.slideHeight,k=t.fade,C=t.vertical,D=0,j,y,w=0;if(k||t.slideCount===1)return 0;var S=0;if(i?(S=-Ua(t),a%d!==0&&r+d>a&&(S=-(r>a?c-(r-a):a%d)),o&&(S+=parseInt(c/2))):(a%d!==0&&r+d>a&&(S=c-a%d),o&&(S=parseInt(c/2))),D=S*h,w=S*_,C?j=r*_*-1+w:j=r*h*-1+D,v===!0){var E,T=n&&n.node;if(E=r+Ua(t),y=T&&T.childNodes[E],j=y?y.offsetLeft*-1:0,o===!0){E=i?r+Ua(t):r,y=T&&T.children[E],j=0;for(var R=0;Rt.currentSlide?t.targetSlide>t.currentSlide+VS(t)?"left":"right":t.targetSlide0&&(a+=1),i&&r%2===0&&(a+=1),a}return i?0:r-1};W.slidesOnRight=VS;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 OM=function(){return!!(typeof window<"u"&&window.document&&window.document.createElement)};W.canUseDOM=OM;var Xd={};function Lp(e){return Lp=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},Lp(e)}Object.defineProperty(Xd,"__esModule",{value:!0});Xd.Track=void 0;var xi=US(I),wh=US(Ms),xh=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 Lu(e){return Lu=Object.setPrototypeOf?Object.getPrototypeOf:function(r){return r.__proto__||Object.getPrototypeOf(r)},Lu(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}},YM=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},HM=function(t){var r,n=[],i=[],o=[],a=xi.default.Children.count(t.children),c=(0,xh.lazyStartIndex)(t),d=(0,xh.lazyEndIndex)(t);return xi.default.Children.forEach(t.children,function(h,g){var v,_={message:"children",index:g,slidesToScroll:t.slidesToScroll,currentSlide:t.currentSlide};!t.lazyLoad||t.lazyLoad&&t.lazyLoadedList.indexOf(g)>=0?v=h:v=xi.default.createElement("div",null);var k=YM(ir(ir({},t),{},{index:g})),C=v.props.className||"",D=_h(ir(ir({},t),{},{index:g}));if(n.push(xi.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(_)}})),t.infinite&&t.fade===!1){var j=a-g;j<=(0,xh.getPreClones)(t)&&a!==t.slidesToShow&&(r=-j,r>=c&&(v=h),D=_h(ir(ir({},t),{},{index:r})),i.push(xi.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(_)}}))),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 ZM=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},JM=function(e){GM(r,e);var t=KM(r);function r(){return BM(this,r),t.apply(this,arguments)}return WM(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,_=i.currentSlide,k=ZM({slideCount:v,slidesToScroll:h,slidesToShow:g,infinite:d}),C={onMouseEnter:o,onMouseOver:a,onMouseLeave:c},D=[],j=0;j=E&&_<=w:_===E}),R={message:"dots",index:j,slidesToScroll:h,currentSlide:_},P=this.clickHandler.bind(this,R);D=D.concat(Sc.default.createElement("li",{key:j,className:T},Sc.default.cloneElement(this.props.customPaging(j),{onClick:P})))}return Sc.default.cloneElement(this.props.appendDots(D),UM({className:this.props.dotsClass},C))}}]),r}(Sc.default.PureComponent);Qd.Dots=JM;var Ls={};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(Ls,"__esModule",{value:!0});Ls.PrevArrow=Ls.NextArrow=void 0;var vs=WS(I),BS=WS(Ms),eL=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 oL=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);Ls.PrevArrow=oL;var sL=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,eL.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);Ls.NextArrow=sL;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),fL?(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=dL.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 _L(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 SL(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=hL.getInstance(),n=new bL(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 kL=function(){return typeof Hu.ResizeObserver<"u"?Hu.ResizeObserver:tb}();const CL=Object.freeze(Object.defineProperty({__proto__:null,default:kL},Symbol.toStringTag,{value:"Module"})),DL=DE(CL);Object.defineProperty(Gd,"__esModule",{value:!0});Gd.InnerSlider=void 0;var Qt=Rl(I),jL=Rl(PS),EL=Rl(yM),AL=Rl(Ms),rt=W,TL=Xd,RL=Qd,X1=Ls,OL=Rl(DL);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 ML(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 VL=function(e){NL(r,e);var t=zL(r);function r(n){var i;LL(this,r),i=t.call(this,n),Se(_e(i),"listRefHandler",function(a){return i.list=a}),Se(_e(i),"trackRefHandler",function(a){return i.track=a}),Se(_e(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(_e(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 OL.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(_e(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(_e(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(_e(i),"onWindowResized",function(a){i.debouncedResize&&i.debouncedResize.cancel(),i.debouncedResize=(0,EL.default)(function(){return i.resizeWindow(a)},50),i.debouncedResize()}),Se(_e(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(_e(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(_e(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(_e(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(_e(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,_=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})),j=D.state,y=D.nextState;if(j){g&&g(C,j.currentSlide);var w=j.lazyLoadedList.filter(function(S){return i.state.lazyLoadedList.indexOf(S)<0});v&&w.length>0&&v(w),!i.props.waitForAnimate&&i.animationEndCallback&&(clearTimeout(i.animationEndCallback),k&&k(C),delete i.animationEndCallback),i.setState(j,function(){h&&i.asNavForIndex!==a&&(i.asNavForIndex=a,h.innerSlider.slideHandler(a)),y&&(i.animationEndCallback=setTimeout(function(){var S=y.animating,E=PL(y,["animating"]);i.setState(E,function(){i.callbackTimers.push(setTimeout(function(){return i.setState({animating:S})},10)),k&&k(j.currentSlide),delete i.animationEndCallback})},_))})}}),Se(_e(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(_e(i),"clickHandler",function(a){i.clickable===!1&&(a.stopPropagation(),a.preventDefault()),i.clickable=!0}),Se(_e(i),"keyHandler",function(a){var c=(0,rt.keyHandler)(a,i.props.accessibility,i.props.rtl);c!==""&&i.changeSlide({message:c})}),Se(_e(i),"selectHandler",function(a){i.changeSlide(a)}),Se(_e(i),"disableBodyScroll",function(){var a=function(d){d=d||window.event,d.preventDefault&&d.preventDefault(),d.returnValue=!1};window.ontouchmove=a}),Se(_e(i),"enableBodyScroll",function(){window.ontouchmove=null}),Se(_e(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(_e(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(_e(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(_e(i),"touchEnd",function(a){i.swipeEnd(a),i.clickable=!0}),Se(_e(i),"slickPrev",function(){i.callbackTimers.push(setTimeout(function(){return i.changeSlide({message:"previous"})},0))}),Se(_e(i),"slickNext",function(){i.callbackTimers.push(setTimeout(function(){return i.changeSlide({message:"next"})},0))}),Se(_e(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(_e(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(_e(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(_e(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(_e(i),"onDotsOver",function(){return i.props.autoplay&&i.pause("hovered")}),Se(_e(i),"onDotsLeave",function(){return i.props.autoplay&&i.state.autoplaying==="hovered"&&i.autoPlay("leave")}),Se(_e(i),"onTrackOver",function(){return i.props.autoplay&&i.pause("hovered")}),Se(_e(i),"onTrackLeave",function(){return i.props.autoplay&&i.state.autoplaying==="hovered"&&i.autoPlay("leave")}),Se(_e(i),"onSlideFocus",function(){return i.props.autoplay&&i.pause("focused")}),Se(_e(i),"onSlideBlur",function(){return i.props.autoplay&&i.state.autoplaying==="focused"&&i.autoPlay("blur")}),Se(_e(i),"render",function(){var a=(0,AL.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"]),_=i.props.pauseOnDotsHover;v=de(de({},v),{},{clickHandler:i.changeSlide,onMouseEnter:_?i.onDotsLeave:null,onMouseOver:_?i.onDotsOver:null,onMouseLeave:_?i.onDotsLeave:null}),g=Qt.default.createElement(RL.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 j=null;i.props.vertical&&(j={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({},j),y),S=i.props.touchMove,E={className:"slick-list",style:w,onClick:i.clickHandler,onMouseDown:S?i.swipeStart:null,onMouseMove:i.state.dragging&&S?i.swipeMove:null,onMouseUp:S?i.swipeEnd:null,onMouseLeave:i.state.dragging&&S?i.swipeEnd:null,onTouchStart:S?i.swipeStart:null,onTouchMove:i.state.dragging&&S?i.swipeMove:null,onTouchEnd:S?i.touchEnd:null,onTouchCancel:i.state.dragging&&S?i.swipeEnd:null,onKeyDown:i.props.accessibility?i.keyHandler:null},T={className:a,dir:"ltr",style:i.props.style};return i.props.unslick&&(E={className:"slick-list"},T={className:a}),Qt.default.createElement("div",T,i.props.unslick?"":k,Qt.default.createElement("div",Uu({ref:i.listRefHandler},E),Qt.default.createElement(TL.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({},jL.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 IL(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 E(O){return E=Object.setPrototypeOf?Object.getPrototypeOf:function(Y){return Y.__proto__||Object.getPrototypeOf(Y)},E(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)()&&qL(),P=function(O){C(Y,O);var z=j(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(Ee){return Ee.breakpoint});G.sort(function(Ee,ze){return Ee-ze}),G.forEach(function(Ee,ze){var mt;ze===0?mt=(0,i.default)({minWidth:0,maxWidth:Ee}):mt=(0,i.default)({minWidth:G[ze-1]+1,maxWidth:Ee}),(0,a.canUseDOM)()&&te.media(mt,function(){te.setState({breakpoint:Ee})})});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 Ee=r.default.Children.toArray(this.props.children);Ee=Ee.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;$=Ee.length));he+=1)ue.push(r.default.cloneElement(Ee[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},Ee)}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 ZL=C2(RS),yn=f.button` +*/(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 xg=function(t){return t&&t.offsetHeight||0};W.getHeight=xg;var _g=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=_g;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=xL.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&&xg(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 _=t.lazyLoadedList||[],k=vg(Ze(Ze({},t),{},{currentSlide:v,lazyLoadedList:_}));_=_.concat(k);var C={slideCount:r,slideWidth:c,listWidth:i,trackWidth:a,currentSlide:v,slideHeight:h,listHeight:g,lazyLoadedList:_};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,_=t.slidesToShow,k=t.useCSS,C=t.lazyLoadedList;if(r&&n)return{};var D=a,j,y,w,S={},E={},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)),S={animating:!0,currentSlide:D,lazyLoadedList:C,targetSlide:D},E={animating:!1,targetSlide:D}}else j=D,D<0?(j=D+c,o?c%v!==0&&(j=c-c%v):j=0):!Sg(t)&&D>h?D=j=h:g&&D>=c?(D=o?c:c-1,j=o?0:c-1):D>=c&&(j=D-c,o?c%v!==0&&(j=0):j=c-_),!o&&D+_>=c&&(j=c-_),y=gl(Ze(Ze({},t),{},{slideIndex:D})),w=gl(Ze(Ze({},t),{},{slideIndex:j})),o||(y===w&&(D=j),y=w),d&&(C=C.concat(vg(Ze(Ze({},t),{},{currentSlide:D})))),k?(S={animating:!0,currentSlide:j,trackStyle:bg(Ze(Ze({},t),{},{left:y})),lazyLoadedList:C,targetSlide:T},E={animating:!1,currentSlide:j,trackStyle:pl(Ze(Ze({},t),{},{left:w})),swipeLeft:null,targetSlide:T}):S={currentSlide:j,trackStyle:pl(Ze(Ze({},t),{},{left:w})),lazyLoadedList:C,targetSlide:T};return{state:S,nextState:E}};W.slideHandler=DL;var jL=function(t,r){var n,i,o,a,c,d=t.slidesToScroll,h=t.slidesToShow,g=t.slideCount,v=t.currentSlide,_=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=_-d);else if(r.message==="next")o=n===0?d:n,c=v+o,k&&!C&&(c=(v+d)%g+n),C||(c=_+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/j),te=_g(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&&_&&(_(te),P.edgeDragged=!0)),!k&&S&&(S(te),P.swiped=!0),o?R=O+G*(E/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,_=r.onSwipe,k=r.targetSlide,C=r.currentSlide,D=r.infinite;if(!n)return i&&ho(t),{};var j=d?h/c:a/c,y=_g(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>j){ho(t),_&&_(y);var S,E,T=D?C:k;switch(y){case"left":case"up":E=T+Lp(r),S=g?Pp(r,E):E,w.currentDirection=0;break;case"right":case"down":E=T-Lp(r),S=g?Pp(r,E):E,w.currentDirection=1;break;default:S=T}w.triggerSlideHandler=S}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,_=t.slideHeight,k=t.fade,C=t.vertical,D=0,j,y,w=0;if(k||t.slideCount===1)return 0;var S=0;if(i?(S=-Ua(t),a%d!==0&&r+d>a&&(S=-(r>a?c-(r-a):a%d)),o&&(S+=parseInt(c/2))):(a%d!==0&&r+d>a&&(S=c-a%d),o&&(S=parseInt(c/2))),D=S*h,w=S*_,C?j=r*_*-1+w:j=r*h*-1+D,v===!0){var E,T=n&&n.node;if(E=r+Ua(t),y=T&&T.childNodes[E],j=y?y.offsetLeft*-1:0,o===!0){E=i?r+Ua(t):r,y=T&&T.children[E],j=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 xi=US(I),wh=US(Ls),xh=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=xi.default.Children.count(t.children),c=(0,xh.lazyStartIndex)(t),d=(0,xh.lazyEndIndex)(t);return xi.default.Children.forEach(t.children,function(h,g){var v,_={message:"children",index:g,slidesToScroll:t.slidesToScroll,currentSlide:t.currentSlide};!t.lazyLoad||t.lazyLoad&&t.lazyLoadedList.indexOf(g)>=0?v=h:v=xi.default.createElement("div",null);var k=YL(ir(ir({},t),{},{index:g})),C=v.props.className||"",D=_h(ir(ir({},t),{},{index:g}));if(n.push(xi.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(_)}})),t.infinite&&t.fade===!1){var j=a-g;j<=(0,xh.getPreClones)(t)&&a!==t.slidesToShow&&(r=-j,r>=c&&(v=h),D=_h(ir(ir({},t),{},{index:r})),i.push(xi.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(_)}}))),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,_=i.currentSlide,k=ZL({slideCount:v,slidesToScroll:h,slidesToShow:g,infinite:d}),C={onMouseEnter:o,onMouseOver:a,onMouseLeave:c},D=[],j=0;j=E&&_<=w:_===E}),R={message:"dots",index:j,slidesToScroll:h,currentSlide:_},P=this.clickHandler.bind(this,R);D=D.concat(Sc.default.createElement("li",{key:j,className:T},Sc.default.cloneElement(this.props.customPaging(j),{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 _M(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=DE(CM);Object.defineProperty(Gd,"__esModule",{value:!0});Gd.InnerSlider=void 0;var Qt=Rl(I),jM=Rl(PS),EM=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(_e(i),"listRefHandler",function(a){return i.list=a}),Se(_e(i),"trackRefHandler",function(a){return i.track=a}),Se(_e(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(_e(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(_e(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(_e(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(_e(i),"onWindowResized",function(a){i.debouncedResize&&i.debouncedResize.cancel(),i.debouncedResize=(0,EM.default)(function(){return i.resizeWindow(a)},50),i.debouncedResize()}),Se(_e(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(_e(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(_e(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(_e(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(_e(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,_=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})),j=D.state,y=D.nextState;if(j){g&&g(C,j.currentSlide);var w=j.lazyLoadedList.filter(function(S){return i.state.lazyLoadedList.indexOf(S)<0});v&&w.length>0&&v(w),!i.props.waitForAnimate&&i.animationEndCallback&&(clearTimeout(i.animationEndCallback),k&&k(C),delete i.animationEndCallback),i.setState(j,function(){h&&i.asNavForIndex!==a&&(i.asNavForIndex=a,h.innerSlider.slideHandler(a)),y&&(i.animationEndCallback=setTimeout(function(){var S=y.animating,E=PM(y,["animating"]);i.setState(E,function(){i.callbackTimers.push(setTimeout(function(){return i.setState({animating:S})},10)),k&&k(j.currentSlide),delete i.animationEndCallback})},_))})}}),Se(_e(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(_e(i),"clickHandler",function(a){i.clickable===!1&&(a.stopPropagation(),a.preventDefault()),i.clickable=!0}),Se(_e(i),"keyHandler",function(a){var c=(0,rt.keyHandler)(a,i.props.accessibility,i.props.rtl);c!==""&&i.changeSlide({message:c})}),Se(_e(i),"selectHandler",function(a){i.changeSlide(a)}),Se(_e(i),"disableBodyScroll",function(){var a=function(d){d=d||window.event,d.preventDefault&&d.preventDefault(),d.returnValue=!1};window.ontouchmove=a}),Se(_e(i),"enableBodyScroll",function(){window.ontouchmove=null}),Se(_e(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(_e(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(_e(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(_e(i),"touchEnd",function(a){i.swipeEnd(a),i.clickable=!0}),Se(_e(i),"slickPrev",function(){i.callbackTimers.push(setTimeout(function(){return i.changeSlide({message:"previous"})},0))}),Se(_e(i),"slickNext",function(){i.callbackTimers.push(setTimeout(function(){return i.changeSlide({message:"next"})},0))}),Se(_e(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(_e(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(_e(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(_e(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(_e(i),"onDotsOver",function(){return i.props.autoplay&&i.pause("hovered")}),Se(_e(i),"onDotsLeave",function(){return i.props.autoplay&&i.state.autoplaying==="hovered"&&i.autoPlay("leave")}),Se(_e(i),"onTrackOver",function(){return i.props.autoplay&&i.pause("hovered")}),Se(_e(i),"onTrackLeave",function(){return i.props.autoplay&&i.state.autoplaying==="hovered"&&i.autoPlay("leave")}),Se(_e(i),"onSlideFocus",function(){return i.props.autoplay&&i.pause("focused")}),Se(_e(i),"onSlideBlur",function(){return i.props.autoplay&&i.state.autoplaying==="focused"&&i.autoPlay("blur")}),Se(_e(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"]),_=i.props.pauseOnDotsHover;v=de(de({},v),{},{clickHandler:i.changeSlide,onMouseEnter:_?i.onDotsLeave:null,onMouseOver:_?i.onDotsOver:null,onMouseLeave:_?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 j=null;i.props.vertical&&(j={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({},j),y),S=i.props.touchMove,E={className:"slick-list",style:w,onClick:i.clickHandler,onMouseDown:S?i.swipeStart:null,onMouseMove:i.state.dragging&&S?i.swipeMove:null,onMouseUp:S?i.swipeEnd:null,onMouseLeave:i.state.dragging&&S?i.swipeEnd:null,onTouchStart:S?i.swipeStart:null,onTouchMove:i.state.dragging&&S?i.swipeMove:null,onTouchEnd:S?i.touchEnd:null,onTouchCancel:i.state.dragging&&S?i.swipeEnd:null,onKeyDown:i.props.accessibility?i.keyHandler:null},T={className:a,dir:"ltr",style:i.props.style};return i.props.unslick&&(E={className:"slick-list"},T={className:a}),Qt.default.createElement("div",T,i.props.unslick?"":k,Qt.default.createElement("div",Uu({ref:i.listRefHandler},E),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({},jM.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 E(O){return E=Object.setPrototypeOf?Object.getPrototypeOf:function(Y){return Y.__proto__||Object.getPrototypeOf(Y)},E(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=j(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(Ee){return Ee.breakpoint});G.sort(function(Ee,ze){return Ee-ze}),G.forEach(function(Ee,ze){var mt;ze===0?mt=(0,i.default)({minWidth:0,maxWidth:Ee}):mt=(0,i.default)({minWidth:G[ze-1]+1,maxWidth:Ee}),(0,a.canUseDOM)()&&te.media(mt,function(){te.setState({breakpoint:Ee})})});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 Ee=r.default.Children.toArray(this.props.children);Ee=Ee.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;$=Ee.length));he+=1)ue.push(r.default.cloneElement(Ee[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},Ee)}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; @@ -524,7 +524,7 @@ Error generating stack: `+o.message+` font-size: 0.18rem; line-height: 0.32rem; cursor: pointer; -`,iw="/zh-cn/assets/distributed-storage-bg-0c137d00.png",JL="/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 JL;case"metadata-management":return e3;case"hardware-acceleration":return t3;case"open-source":return r3;default:return iw}},d3=f.div` +`,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; @@ -588,7 +588,7 @@ Error generating stack: `+o.message+` 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(x3,{src:i3})]}),n.type==="ul"?null:l.jsx(_3,{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},j3=({items:e})=>l.jsx(C3,{children:l.jsx(ZL,{...D3,children:e.map(t=>l.jsx(k3,{items:t},t.key))})}),E3="/zh-cn/assets/map-37f53016.png",A3="/zh-cn/assets/infrastructure-9fd998b9.png",T3="/zh-cn/assets/pc-d09b6ade.png",R3=f.section` +`,D3={dots:!0,infinite:!0,speed:1e3,slidesToShow:1,slidesToScroll:1,arrows:!1,fade:!0,autoplay:!0,autoplaySpeed:6e3,pauseOnFocus:!0},j3=({items:e})=>l.jsx(C3,{children:l.jsx(ZM,{...D3,children:e.map(t=>l.jsx(k3,{items:t},t.key))})}),E3="/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; @@ -648,10 +648,10 @@ Error generating stack: `+o.message+` color: #7680DD; `,aw=f.img` width: 45%; -`,M3=f.img` +`,L3=f.img` width: 100%; margin-bottom: -0.24rem; -`,L3=()=>l.jsx(R3,{children:l.jsxs(O3,{children:[l.jsx(P3,{children:"DatenLord 存储+网络的融合方案解决 AI 算力资源问题"}),l.jsxs(Eh,{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:E3})]})]}),l.jsxs(Eh,{children:[l.jsx(Ah,{children:"AI 算力资源的分散和昂贵对云计算带来的新问题"}),l.jsx(M3,{src:A3})]}),l.jsxs(Eh,{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:H3}=z3,{CNBodyLarge:Jd}=Y3,V3=f.section` +`,M3=()=>l.jsx(R3,{children:l.jsxs(O3,{children:[l.jsx(P3,{children:"DatenLord 存储+网络的融合方案解决 AI 算力资源问题"}),l.jsxs(Eh,{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:E3})]})]}),l.jsxs(Eh,{children:[l.jsx(Ah,{children:"AI 算力资源的分散和昂贵对云计算带来的新问题"}),l.jsx(L3,{src:A3})]}),l.jsxs(Eh,{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; @@ -743,7 +743,7 @@ Error generating stack: `+o.message+` `,aI=f.ul` padding-bottom: 0.3rem; color: #7680dd; -`,cw=f(H3)` +`,cw=f(V3)` padding-bottom: 0.05rem; `,uw=f(Jd)` padding-bottom: 0.05rem; @@ -855,7 +855,7 @@ Error generating stack: `+o.message+` height: 0.22rem; background: #7680dd; border-radius: 50%; -`,Dg=()=>{const e=ht();return l.jsx(V3,{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(xI,{}),l.jsx(_I,{})]})]})]})})},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:jI}=CI,EI=f.section` +`,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(xI,{}),l.jsx(_I,{})]})]})]})})},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:jI}=CI,EI=f.section` background: #fff; `,AI=f.div` max-width: 1440px; @@ -888,7 +888,7 @@ Error generating stack: `+o.message+` `,PI=f(jI)` color: ${e=>e.theme.secondary01}; -`,MI=f(sb)` +`,LI=f(sb)` width: 90%; color: #000; text-align: center; @@ -896,7 +896,7 @@ Error generating stack: `+o.message+` padding-bottom: 0.12rem; border-bottom: 0.01rem solid ${e=>e.theme.secondary02}; cursor: pointer; -`,LI=f.div` +`,MI=f.div` position: relative; top: -0.6rem; display: flex; @@ -922,7 +922,7 @@ Error generating stack: `+o.message+` animation-delay: 2s; `,YI=f(tf)` animation-delay: 3s; -`,HI=f.div` +`,VI=f.div` z-index: 1; display: flex; justify-content: center; @@ -931,7 +931,7 @@ Error generating stack: `+o.message+` height: 0.9rem; background: ${e=>e.bg}; border-radius: 50%; -`,VI=f.img` +`,HI=f.img` width: 90%; height: 90%; `,FI=f.ul` @@ -945,7 +945,7 @@ Error generating stack: `+o.message+` 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(EI,{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(LI,{children:[l.jsx(HI,{bg:n,children:l.jsx(VI,{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(MI,{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` +`,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(EI,{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; @@ -1024,7 +1024,7 @@ Error generating stack: `+o.message+` `,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(j3,{items:u6}),l.jsx(L3,{}),l.jsx(Dg,{}),l.jsx(WI,{}),l.jsx(o6,{}),l.jsx(y6,{})]})),{Heading:x6}=Pe,{CNHead1:_6,CNTitleLarge:S6}=x6,b6=f.section` +`,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(j3,{items:u6}),l.jsx(M3,{}),l.jsx(Dg,{}),l.jsx(WI,{}),l.jsx(o6,{}),l.jsx(y6,{})]})),{Heading:x6}=Pe,{CNHead1:_6,CNTitleLarge:S6}=x6,b6=f.section` display: flex; flex-direction: column; justify-content: center; @@ -1045,13 +1045,13 @@ Error generating stack: `+o.message+` 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,{})]})},j6="/zh-cn/assets/cover-2bac0ff4.png",E6="/zh-cn/assets/image1-6c5a6b4b.png",{Heading:A6,Paragraph:T6}=Pe,{CNHead4:R6,CNHead5S:O6}=A6,{CNBodyLarge:cb}=T6,P6=f.div` background: #f7f7f9; -`,M6=f.div` +`,L6=f.div` max-width: 1440px; margin-inline: auto; padding-top: 1rem; padding-bottom: 1.49rem; padding-inline: 1.77rem; -`,L6=f.section` +`,M6=f.section` margin-bottom: 1.2rem; color: ${e=>e.theme.themeDark}; &:last-child { @@ -1070,7 +1070,7 @@ Error generating stack: `+o.message+` background: linear-gradient(270deg, #7b7ce340, #926cd3); `,Y6=f(R6)` padding-inline: 0.24rem; -`,H6=f(O6)``,V6=f(cb)` +`,V6=f(O6)``,H6=f(cb)` padding-bottom: 0.39rem; `,F6=f.ul` padding-left: 0.24rem; @@ -1080,7 +1080,7 @@ Error generating stack: `+o.message+` 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:E6}],W6=({item:e})=>{const{title:t,subTitle:r,img:n,main:i,url:o}=e;return l.jsxs(L6,{children:[l.jsxs(I6,{children:[l.jsx(N6,{}),l.jsx(Y6,{children:t}),l.jsx(z6,{})]}),l.jsx(H6,{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(V6,{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:j6,children:"RDMA"}),l.jsx(P6,{children:l.jsx(M6,{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` +`,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:E6}],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:j6,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,iVBORw0KGgoAAAANSUhEUgAAAD4AAABACAYAAABC6cT1AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAlrSURBVHgB7VrNbxvHFX8zuxQsO21pX5L6Uropeg1lIYeeRDeFLwVaGpaB3ES1lpEeClN/Aal/oKbRQwzLqOSbgSo2U/RUoBDdAinQ1CV1DeCYpwRBApsBHMSwdmfy3uwH92N2ucslfQj4O4irmdmZfR/zmzdvBmCBBRZYYIHvDxi8QtQb/TKceFE2LbMSrbMsc9DdXxnBK8JcBSdBTS4a0uBvcYCaBKikviCBBB9IJo6YFN2DO2/3YE6Yi+BXftdvSA4b2HsNCgAVNcSfnn0MO+gNQ5ghZir4+tVHTQDewl7LMGOgEvZnqYCZCL5+9eMaY+ZekitLkEf4t8dtPgADBscGhOZyyYayEFBhTFTxk6rA2BoW65UnoWNZSgGF+KCw4OvX+jfwY5qaqhH2ftPisN+9ld9Kl3/frzMm66iEjWgdTQG0/oUi1p9a8Hcb/YpVggf4WA2WSwZDKcXO/d3VfZgB3n0Px7FkW6cAkGL74M5qB6bAVIKT0HYJDiOurSx8cHulnfTela3/VsE2qkh83nujrB9OCrAFjikj00lC++DOyg7kRG7BdUKTlbmES3/dXRlE29P8l8zcYBLqGtIbWcdwLs98xanVRmFbocIphM8luNbSDAbWSZxvnfDH05KGRNYat5UPkeQGIYI7AaPoe1mAwjdR2Buhwpxun0vw9av9w9DaLOEuaroRbKPmvgl7bjuH4E5CZxoB03Blq19FpR5CkP0lXMDv6WV5n0NGoJZbIaHJ0q+F2ZzWcRS6T+0kiJvWKThHc37WQhNoWqHVtoNlOOX2VFicAZks7jL4k8AAQ5ujeweWKaUYnGtUxwRsJmk+SHC4dg/v/6UY+0fnPArURaVcmvReJsHXt/rkUrXASytBIgsKHVWIqk8hOCS300WDkej3ZXF5EyZAxd2BTsmFD3ZXB6H6BKGD811pmDkEB4L3GENGN2HY3S0+DUwDNi0bp9h4vpMH9NLemWhx1CZ1qIKUqHAeywvsJSq0E3kpocvE6PhyOyvxTIP1a4/Q5fl4mZtg9VSLk4tCIDLDuXu3e3ssnGViRAWsgpHaZvfWql9++Vqf3HofiNXVB5zvwZxhveQdswTXIaPVJ7C60Qh1biphFJRSMIykXVMwPFUbFhSavMMyYGWeVg5C8QQTN/0CnF5pDJ8qOHN2SQokYIi0mKncyjbAj5jI9WmXho8jHcnNGybn+6H/TdFIbJtUoZg4EKGhFe96z4q0nIxKSBme6wsIu360Xxx2Ded/FUmxTCRn2+LDossa4R5+C3JSD3wy5r/FP9poLmWO89CuK+iylinq5CwxZTDYIBe/fzsuhEpDLUHL28JK+sOcX27w+uWtfgvdTxvv5wITSKS85jyHd45BJAvOWM1/lsjKoTqlyZFOGbQl1XWHxHOIUlbfPHcKLr7zBrz509dU+dNnL+F/j57Cvz/6qvLtC7uPYfGFIrwgbTlg4wlcrr/3n0r31i+G0XYpc5z9xO+MyagVaijhUbi5owzdPlwFOLg6XPzl6/CHrZ/5QhPOnF6Ci796A7b/+HNYPmGQlR5kDTt1KJWM0LcaxyWt1dPIreI9oEsPvWfaHNBvgjIeRjtRQmCAc9oVMAmkgN/8+iw9lpGUmjAl7jmc4wdFSNAVXbs0wX2tY0ztdySlpcp1ygCIKQMMw67R78V3XodJeHv1jLK6ZHwDikDKrwP/ab1HK3jU1TD3FQsrdcoAgFg71LhSypnyEmTB2bPLxHkVXR0q+IGTyR2Dcn7RsizItC2VkvmKwFOQIWVNxRLveWV0CkJljI3LolheNqAocAVAAmX1UKGQl2JlGaBldYqCcD3UvnDPyWxWo+2jZR6Y4EOJMj/+9Dmc/fEyTMKzpy/pJ21JC3sVYz9Cy0Be8CwDcD79AcGxgC719fH/n01sS8va09FL2gHGSNLdN0CQR9wpWQadMsbQ7v6SBQ8QBAYlFZgSXgz92effwt/+/lliu2e4nv/jn184O0CDd+ItvIBqPJ1M04qRakAZTo2UQ914aRbveQ9M8regAA5ur7bxZ/Cvj76E93cfw+Mnz/26Fy9sJfCf/vyJsjZiWxfjI3/QzmsUDm7SlOHWcGMIGqSErKRFN4mPoR9pskimBDMtF4ySaKPQ19/ffR4fjVJWEjY/2I1HbW4ypEJ7g1CFs+yFlIFLYT2QZBglhcBpsXrwBQwqFHn1YEq4SmviwUDn2BZNBs4yh7w05IL1rB9CV5eUVK5rgHYniBulalQZDLi/o4xFlwEkCk5aRGanD1HzBc+sacnoQUG4kVXmdZc2Nur0ROJBYXwnqNs1+q4umNxP6jd1HUd29TtFTW4UiaGngZvEbFLmFA3R9spJQHWWhiFyeKMk28H3hZEcV6SmnpDUuijxdfdfL4Zuw5xBCi6VYE86WdnB8UnYDNZTno9+LZM1vDKV/2Ow5q/oUn7YvXV+mDRGqsVdbfb8AmTWeVqd+sZtaQv55ImK0tCNo8dT5AUqQRJ1/SXYCB9isk7aWBPTyzRA4ASFSI6IZhsKwrHqcUWFw4JX6Z5MIO9OSUo8C1sJfXwwf4/s3/bK1dyWY09063tp40+M1eNWhyZapQYFQUubhBIeN5mHYPAbOI8bOLeOsP8ddfSUIjTl84J1KncfAJ3kTBp/ssVBZYi20Y384N09oyp0I6GE0ZllCXLhkZR8aP8Aet3Oee1y5qWsUo6uav634fL2QYYMTubTUs3R7MByrmNMHdRMHDN0t0Y+tAzWCB1ajPP3CklHWDrkOyaOnFEp7e6uTHSrPFAWVmGn2fKPmpFnYq6v8vrmYejlHMfEuQRXhLQE/ch1DLL8pWncnhKB9Et5MSbxRCZMcM4VLyPM3oSopcFpvBNc6ych/1UQzV2UaW4hYdakjctjK16DeTuGIWzCZQLtLaucQhOmu/wzg4s46kaDFF7mJEBwes5wXZs4phoZM7fQhOmve9E1LFtz3QutL22xM4uTETWOOmpOuu4VX+uzYhYX/NqxW0jgKIDZ4qYleDfv/NcQXLjvlFtWWVFYcAIFNHh6sRdz/TEGlE6SNgw4F0PLtIbRBh7BMYOvSVqXE+7D0sUE+xQvfK9mppd4cd5i9OVuI2eO+DpeBPO5tr1FGRPZwO7XoBgK3YdNw1wE96DY38bjZCnrlLDEtMGk3B26rzyiezK0JZ7npYK5Ch5FvYkB0DeYO5MQOamBEd10fNUXCRZYYIEFFvi+4Dvi/dtd2V8yIgAAAABJRU5ErkJggg==",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; @@ -1140,7 +1140,7 @@ Error generating stack: `+o.message+` 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(xa,{children:"全新自研架构,实现内核旁路"}),l.jsx(_a,{children:"发挥出新一代存储硬件的高性能。"})]}),l.jsxs(Rh,{children:[l.jsx(wa,{src:q6}),l.jsx(xa,{children:"统一命名空间"}),l.jsx(_a,{children:"实现数据对多个存储接口的互通,满足不同场景需求。"})]}),l.jsxs(Rh,{children:[l.jsx(wa,{src:Z6}),l.jsx(xa,{children:"数据的自动化管理"}),l.jsx(_a,{children:"自动化实现数据迁移、备份,并对应用程序透明。"})]})]}),l.jsxs(yw,{children:[l.jsxs(ww,{children:[l.jsx(wa,{src:J6}),l.jsxs(xw,{children:[l.jsx(xa,{children:"支持多种自主体系架构"}),l.jsx(_a,{children:"能够适配更多样性的芯片架构,满足用户的多种需求。"})]})]}),l.jsxs(ww,{children:[l.jsx(wa,{src:eN}),l.jsxs(xw,{children:[l.jsx(xa,{children:"利用硬件加速存储相关的计算密集型任务"}),l.jsx(_a,{children:"诸如数据加密解密、数据压缩解压缩、音视频编解码、模式识别等场景,有力提升数据存储和处理的性能。"})]})]})]})]})})]})),cN="/zh-cn/assets/cover-b2ab63b7.png",uN="/zh-cn/assets/sect1-bad41865.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` +`,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(xa,{children:"全新自研架构,实现内核旁路"}),l.jsx(_a,{children:"发挥出新一代存储硬件的高性能。"})]}),l.jsxs(Rh,{children:[l.jsx(wa,{src:q6}),l.jsx(xa,{children:"统一命名空间"}),l.jsx(_a,{children:"实现数据对多个存储接口的互通,满足不同场景需求。"})]}),l.jsxs(Rh,{children:[l.jsx(wa,{src:Z6}),l.jsx(xa,{children:"数据的自动化管理"}),l.jsx(_a,{children:"自动化实现数据迁移、备份,并对应用程序透明。"})]})]}),l.jsxs(yw,{children:[l.jsxs(ww,{children:[l.jsx(wa,{src:J6}),l.jsxs(xw,{children:[l.jsx(xa,{children:"支持多种自主体系架构"}),l.jsx(_a,{children:"能够适配更多样性的芯片架构,满足用户的多种需求。"})]})]}),l.jsxs(ww,{children:[l.jsx(wa,{src:eN}),l.jsxs(xw,{children:[l.jsx(xa,{children:"利用硬件加速存储相关的计算密集型任务"}),l.jsx(_a,{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; @@ -1227,7 +1227,7 @@ Error generating stack: `+o.message+` border-radius: 0.04rem; margin-inline: -0.36rem; margin-bottom: 0.36rem; -`,Mg=f.div` +`,Lg=f.div` display: flex; justify-content: space-between; flex-wrap: wrap; @@ -1242,7 +1242,7 @@ Error generating stack: `+o.message+` font-size: 0.2rem; font-weight: 600; padding-bottom: 0.2rem; -`,Lg=f(vl)` +`,Mg=f(vl)` color: #8475DC; `,Zt=f.div` font-size: 0.14rem; @@ -1259,7 +1259,7 @@ Error generating stack: `+o.message+` width: 70%; margin-inline: auto; margin-top: 0.36rem; -`,TN=()=>l.jsxs(Eg,{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(Mg,{children:[l.jsxs(Ni,{style:{width:"46%"},children:[l.jsx(zi,{children:"问题"}),l.jsx(Lg,{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(Eg,{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(Mg,{children:[l.jsxs(Ni,{style:{width:"46%"},children:[l.jsx(zi,{children:"问题"}),l.jsx(Lg,{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(Eg,{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(Mg,{children:[l.jsxs(Ni,{style:{width:"46%"},children:[l.jsx(zi,{children:"问题"}),l.jsx(Lg,{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:"提供高可用性和弹性伸缩的解决方案"}),"      包括数据加密、身份验证等,确保大模型在跨云环境中的安全运行。"]})]})]})]})]}),_w=()=>{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(EN,{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(jN,{children:"相关资源"}),l.jsx(yn,{style:{background:"#FDCB6E",color:"#fff"},onClick:()=>e("/resources2"),children:"查看资源合集"})]})]})]})},PN="/zh-cn/assets/github-icon-35dda863.svg",MN="/zh-cn/assets/illustration-a72d48ba.png",{Heading:LN,Paragraph:IN}=Pe,{Heading3:NN,CNHead5S:mb}=LN,{CNBodyLarge:Ig,CNBodySmall:zN}=IN,YN=[{key:1,title:"社区—贡献意味着思考和学习",text:"开源不仅仅是在Github上贡献代码。在DatenLord,我们相信:贡献代码(给予)同样是一个思考和学习的过程。在不断收到开源社区反馈的过程中,我们能够构建彼此的信任与合作。我们也想借助于开源的社区平台吸引更多优秀的开发者参与到项目中来。"}],HN=[{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"}],VN=f.section` +`,TN=()=>l.jsxs(Eg,{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(Eg,{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(Eg,{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:"提供高可用性和弹性伸缩的解决方案"}),"      包括数据加密、身份验证等,确保大模型在跨云环境中的安全运行。"]})]})]})]})]}),_w=()=>{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(EN,{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(jN,{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}; @@ -1331,7 +1331,7 @@ Error generating stack: `+o.message+` `,n5=f.img` width: 0.32rem; height: 0.32rem; -`,i5=()=>l.jsxs(VN,{children:[l.jsx(FN,{children:"Open Source Community"}),l.jsx(UN,{children:"开源社区"}),l.jsxs($N,{children:[l.jsx(KN,{src:MN}),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:HN.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` +`,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; @@ -1418,24 +1418,24 @@ Error generating stack: `+o.message+` `,R5=f(d5)``,O5=f(c5)``,P5=f.div` display: flex; align-items: center; -`,M5=f.div` +`,L5=f.div` display: flex; flex-direction: column; align-items: center; padding-right: 0.91rem; -`,L5=f.div``,I5=f.img` +`,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; -`,H5=f(h5)` +`,V5=f(h5)` padding-bottom: 0.35rem; &:last-child { padding-bottom: 0; } -`,V5=f.div` +`,H5=f.div` width: 100%; text-align: center; font-size: 0.18rem; @@ -1444,7 +1444,7 @@ Error generating stack: `+o.message+` 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(x5,{children:[l.jsxs(b5,{children:[l.jsx(E5,{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(j5,{bg:n})]})]}),l.jsx(_5,{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(V5,{onClick:()=>e(c),children:"了解详情"})]},t))}),l.jsx(O5,{style:{paddingBottom:"1.42rem"},children:"学生故事"}),l.jsxs(P5,{children:[l.jsxs(M5,{children:[l.jsx(I5,{src:o5}),l.jsx(N5,{children:"郑昱笙"}),l.jsx(z5,{children:"浙江大学"})]}),l.jsx(L5,{children:l.jsx(Y5,{children:p5.map(({key:t,text:r})=>l.jsx(H5,{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` +`,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(x5,{children:[l.jsxs(b5,{children:[l.jsx(E5,{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(j5,{bg:n})]})]}),l.jsx(_5,{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; @@ -1562,14 +1562,14 @@ Error generating stack: `+o.message+` -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis; -`,M7=f(vb)` +`,L7=f(vb)` margin-bottom: 0.36rem; display: -webkit-box; -webkit-line-clamp: 6; -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis; -`,L7=f(vb)` +`,M7=f(vb)` margin-bottom: 0.25rem; display: -webkit-box; -webkit-line-clamp: 2; @@ -1597,7 +1597,7 @@ Error generating stack: `+o.message+` display: block; margin-inline: auto; color: #fff; -`,Ew=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>b(()=>import("./index-3a32ad00.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>b(()=>import("./index-17fcbde5.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>b(()=>import("./index-5968a39d.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>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":()=>b(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>b(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>b(()=>import("./index-7df3558a.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>b(()=>import("./index-4b956329.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>b(()=>import("./index-4bc11ad1.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>b(()=>import("./index-1179d885.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>b(()=>import("./index-602219d3.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>b(()=>import("./index-ffd93bc8.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>b(()=>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":()=>b(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>b(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>b(()=>import("./index-2a0835cc.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":()=>b(()=>import("./index-16f06676.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>b(()=>import("./index-89698b14.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>b(()=>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":()=>b(()=>import("./index-a154d453.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>b(()=>import("./index-1409afbf.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>b(()=>import("./index-8cb22688.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>b(()=>import("./index-6bc730f7.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>b(()=>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":()=>b(()=>import("./index-d543ad74.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>b(()=>import("./index-50ad21f0.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>b(()=>import("./index-cc4e4968.js"),[]),"/src/articles/events/2024-02-22-Recruitment-can't-stop-Dartan-Technology-2024-internship-positions-waiting-for-you/index.md":()=>b(()=>import("./index-db271263.js"),[]),"/src/articles/events/2024-02-29-A-Challenge-Letter-from-DatenLord-on-GSoC-2024/index.md":()=>b(()=>import("./index-d4dfb508.js"),[])}),Y7=()=>{const e=ht(),[t,r]=I.useState([]),n=async()=>{const i=await Promise.all(Object.keys(Ew).map(o=>Ew[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(E7,{src:h?o[0]:Cw}),l.jsxs(T7,{children:[l.jsx(O7,{children:g}),l.jsx(M7,{children:v})]}),l.jsxs(I7,{onClick:()=>{e(`/events/${d}-${c.split(" ").join("-")}`)},children:[l.jsx(Dw,{children:"详情"}),l.jsx(jw,{src:kw})]})]},c);if(a<5)return l.jsxs(j7,{children:[l.jsx(A7,{src:h?o[0]:Cw}),l.jsxs(R7,{children:[l.jsx(P7,{children:g}),l.jsx(L7,{children:v})]}),l.jsxs(N7,{onClick:()=>{e(`/events/${d}-${c.split(" ").join("-")}`)},children:[l.jsx(Dw,{children:"详情"}),l.jsx(jw,{src:kw})]})]},c)})}),l.jsx(z7,{onClick:()=>e("/events"),children:"了解更多"})]})})},H7="/zh-cn/assets/blog-test-image-c63d058c.png",{Heading:V7,Paragraph:F7}=Pe,{CNHead4:U7,TitleLarge:$7}=V7,{CNBodyMedium:Sb}=F7,B7=f.section` +`,Ew=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>b(()=>import("./index-043be87f.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>b(()=>import("./index-5e43e574.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>b(()=>import("./index-da95a700.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>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":()=>b(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>b(()=>import("./index-1e46583f.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>b(()=>import("./index-7df3558a.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>b(()=>import("./index-e197de7f.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>b(()=>import("./index-4bc11ad1.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>b(()=>import("./index-1179d885.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>b(()=>import("./index-1f0dff83.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>b(()=>import("./index-ffd93bc8.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>b(()=>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":()=>b(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>b(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>b(()=>import("./index-917f23ec.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":()=>b(()=>import("./index-16f06676.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>b(()=>import("./index-b9ee750d.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>b(()=>import("./index-71801d47.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":()=>b(()=>import("./index-a154d453.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>b(()=>import("./index-31f22a4e.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>b(()=>import("./index-8cb22688.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>b(()=>import("./index-69ce89cf.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>b(()=>import("./index-25c20c62.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":()=>b(()=>import("./index-7e0a1d2c.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>b(()=>import("./index-b5bb516b.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>b(()=>import("./index-cc4e4968.js"),[]),"/src/articles/events/2024-02-22-Recruitment-can't-stop-Dartan-Technology-2024-internship-positions-waiting-for-you/index.md":()=>b(()=>import("./index-db271263.js"),[]),"/src/articles/events/2024-02-29-A-Challenge-Letter-from-DatenLord-on-GSoC-2024/index.md":()=>b(()=>import("./index-a59ad30d.js"),[]),"/src/articles/events/2024-04-04-Come-and-get-your-own-mind-blowing-offer-from-Dartan-Technologies/index.md":()=>b(()=>import("./index-d70f9808.js"),[])}),Y7=()=>{const e=ht(),[t,r]=I.useState([]),n=async()=>{const i=await Promise.all(Object.keys(Ew).map(o=>Ew[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(E7,{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(jw,{src:kw})]})]},c);if(a<5)return l.jsxs(j7,{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(jw,{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; @@ -1661,7 +1661,7 @@ Error generating stack: `+o.message+` border-radius: 0.5rem; border: none; cursor: pointer; -`,Aw=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>b(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>b(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>b(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>b(()=>import("./index-9d285d88.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>b(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>b(()=>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":()=>b(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>b(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>b(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>b(()=>import("./index-b1ba4736.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>b(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>b(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>b(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>b(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>b(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>b(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>b(()=>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":()=>b(()=>import("./index-d7fb28df.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>b(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>b(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>import("./index-38e8d7df.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>b(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>b(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>b(()=>import("./index-4b85dcd8.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>b(()=>import("./index-28241c38.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>b(()=>import("./index-85fa6207.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-9cbd4195.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>b(()=>import("./index-0af18c24.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>b(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>b(()=>import("./index-015cf939.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>b(()=>import("./index-962501d1.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>b(()=>import("./index-86e42443.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>b(()=>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":()=>b(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-93097ad1.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>b(()=>import("./index-866fab75.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>b(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>b(()=>import("./index-b2db3117.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>b(()=>import("./index-fe8c6311.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>b(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>b(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>b(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>b(()=>import("./index-6618c0b5.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>b(()=>import("./index-867a5cbc.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>b(()=>import("./index-2a54f9b1.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-b73b42f4.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>b(()=>import("./index-1b00c887.js"),[]),"/src/articles/blogs/2024-01-11-Open-source-Bluespec-bsc-compiler-and-reusable-example-designs/index.md":()=>b(()=>import("./index-4da057d8.js"),[]),"/src/articles/blogs/2024-01-18-Xline-v0.6.1:-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-28199dec.js"),[]),"/src/articles/blogs/2024-01-25-Agile-Digital-Chip-Design-and-Verification-with-SpinalHDL-and-Cocotb/index.md":()=>b(()=>import("./index-5238cd79.js"),[]),"/src/articles/blogs/2024-02-01-Xline-Jepsen-test-analysis/index.md":()=>b(()=>import("./index-c0527a8b.js"),[]),"/src/articles/blogs/2024-03-07-Membership-Change-Source-Code-Interpretation/index.md":()=>b(()=>import("./index-836388b4.js"),[]),"/src/articles/blogs/2024-03-21-Early-Explorations-and-Practices-of-Xline-a-Stateful-Application-Managed-by-Karmada/index.md":()=>b(()=>import("./index-557885ec.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])||H7)},[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` +`,Aw=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>b(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>b(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>b(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>b(()=>import("./index-9d285d88.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>b(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>b(()=>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":()=>b(()=>import("./index-4820dca7.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>b(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>b(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>b(()=>import("./index-29c0b7ce.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>b(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>b(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>b(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>b(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>b(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>b(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>b(()=>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":()=>b(()=>import("./index-6a884c2a.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>b(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>b(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>import("./index-38e8d7df.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>b(()=>import("./index-be0587a7.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>b(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>b(()=>import("./index-4b85dcd8.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>b(()=>import("./index-6f8e9292.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>b(()=>import("./index-1dde53bb.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-6f20c5b7.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>b(()=>import("./index-f819e53e.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>b(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>b(()=>import("./index-500d1a02.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>b(()=>import("./index-87f0525d.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>b(()=>import("./index-86e42443.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>b(()=>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":()=>b(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-93097ad1.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>b(()=>import("./index-8bf3af0a.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>b(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>b(()=>import("./index-40aedb60.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>b(()=>import("./index-bccae718.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>b(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>b(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>b(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>b(()=>import("./index-a5e56ae7.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>b(()=>import("./index-012cd7f5.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>b(()=>import("./index-8a16857f.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-b73b42f4.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>b(()=>import("./index-1b00c887.js"),[]),"/src/articles/blogs/2024-01-11-Open-source-Bluespec-bsc-compiler-and-reusable-example-designs/index.md":()=>b(()=>import("./index-4da057d8.js"),[]),"/src/articles/blogs/2024-01-18-Xline-v0.6.1:-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-067c93db.js"),[]),"/src/articles/blogs/2024-01-25-Agile-Digital-Chip-Design-and-Verification-with-SpinalHDL-and-Cocotb/index.md":()=>b(()=>import("./index-0f5b2c4d.js"),[]),"/src/articles/blogs/2024-02-01-Xline-Jepsen-test-analysis/index.md":()=>b(()=>import("./index-c0527a8b.js"),[]),"/src/articles/blogs/2024-03-07-Membership-Change-Source-Code-Interpretation/index.md":()=>b(()=>import("./index-836388b4.js"),[]),"/src/articles/blogs/2024-03-21-Early-Explorations-and-Practices-of-Xline-a-Stateful-Application-Managed-by-Karmada/index.md":()=>b(()=>import("./index-8cb7e806.js"),[]),"/src/articles/blogs/2024-04-11-RDMA-Driver-Exploration-Series-for-Linux-1/index.md":()=>b(()=>import("./index-f7c1c3db.js"),[]),"/src/articles/blogs/2024-04-18-A-short-summary-of-the-implementation-of-interval-trees-in-Xline/index.md":()=>b(()=>import("./index-9e270336.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; @@ -1719,14 +1719,14 @@ Error generating stack: `+o.message+` `,P8=f.div` display: flex; justify-content: space-between; -`,M8=f.div` +`,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; */ -`,L8=f.ul` +`,M8=f.ul` width: 37%; list-style-type: none; `,Ol=f.img` @@ -1742,11 +1742,11 @@ Error generating stack: `+o.message+` width: 120%; transform: translateX(-10%); grid-area: 3/ 2 / 4 / 4; -`,H8=f(Ol)` +`,V8=f(Ol)` transform: translateX(5%); width: 90%; grid-area: 4 / 2 / 5 / 4; -`,V8=f.li` +`,H8=f.li` padding-bottom: 0.46rem; &:last-child { padding-bottom: 0; @@ -1757,7 +1757,7 @@ Error generating stack: `+o.message+` `,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(M8,{children:[l.jsx(I8,{src:w8}),l.jsx(N8,{src:x8}),l.jsx(z8,{src:_8}),l.jsx(Y8,{src:S8}),l.jsx(H8,{src:b8})]}),l.jsx(L8,{children:B8.map(({title:t,content:r},n)=>l.jsxs(V8,{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` +`,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:x8}),l.jsx(z8,{src:_8}),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; @@ -1848,19 +1848,19 @@ Error generating stack: `+o.message+` padding-top: 1rem; padding-bottom: 1.31rem; padding-inline: 1.6rem; -`,Mz=f(zg)` +`,Lz=f(zg)` padding-bottom: 1.57rem; color: ${e=>e.theme.secondary02}; text-align: center; -`,Lz=f.div` +`,Mz=f.div` padding-bottom: 1.04rem; display: flex; justify-content: space-between; -`,Hg=f.div` +`,Vg=f.div` width: 32%; -`,Iz=f(Hg)` +`,Iz=f(Vg)` padding-top: 1rem; -`,Nz=f(Hg)``,zz=f(Hg)` +`,Nz=f(Vg)``,zz=f(Vg)` padding-top: 0.79rem; `,$a=f.div` margin-bottom: 0.2rem; @@ -1873,9 +1873,9 @@ Error generating stack: `+o.message+` &:last-child { margin-bottom: 0; } -`,Mh=f($a)` +`,Lh=f($a)` padding-block: 0.34rem; -`,Lh=f(zg)` +`,Mh=f(zg)` color: #fff; padding-bottom: 0.2rem; `,Dc=f(Yg)` @@ -1886,9 +1886,9 @@ Error generating stack: `+o.message+` width: 80%; padding-block: 0.4rem; padding-inline: 0.46rem; -`,Hz=f(zg)` +`,Vz=f(zg)` padding-right: 1rem; -`,Vz=f.div` +`,Hz=f.div` display: flex; flex-direction: column; `,Ih=f.div` @@ -1904,7 +1904,7 @@ Error generating stack: `+o.message+` height: 0.58rem; `,zh=f.div``,Yh=f(Yg)` padding-bottom: 0.06rem; -`,Hh=f(Rz)``,Fz=f.img` +`,Vh=f(Rz)``,Fz=f.img` position: absolute; top: 2.22rem; right: 1.59rem; @@ -1928,7 +1928,7 @@ Error generating stack: `+o.message+` right: 0; bottom: 0.2rem; width: 3.5rem; -`,Wz=()=>l.jsx(Oz,{children:l.jsxs(Pz,{children:[l.jsx(Mz,{children:"愿景/使命/价值观"}),l.jsxs(Lz,{children:[l.jsx(Iz,{children:l.jsxs($a,{children:[l.jsx(Lh,{children:"愿景"}),l.jsx(No,{children:"使企业能够以高性能和高安全性的方式在全球多个云中读、写和提取数据。"})]})}),l.jsxs(Nz,{children:[l.jsxs($a,{children:[l.jsx(Lh,{children:"使命"}),l.jsx(No,{children:"通过使用DatenLord 跨云分布式的存储系统,打破跨云之间的隔阂。"})]}),l.jsxs($a,{children:[l.jsx(Lh,{children:"价值"}),l.jsx(Dc,{children:"开放和透明"}),l.jsx(No,{children:"我们努力保证信息和决策过程的透明度,从而创造一个包容性的社区,让每个成员都感到安全和自信,可以贡献不同的意见和多元化的视角。我们相信建设性的冲突可以带来反思和改进。"})]})]}),l.jsxs(zz,{children:[l.jsxs(Mh,{children:[l.jsx(Dc,{children:"敢于成为先锋"}),l.jsx(No,{children:"我们是一群具有成长型思维模式的人,我们不走捷径并且相信慢就是快。我们的目标是成为先锋,敢于标新立异,制定自己的模式,因此我们允许犯错,但更相信我们能够快速、持续地调整和完善。"})]}),l.jsxs(Mh,{children:[l.jsx(Dc,{children:"坚持交付卓越"}),l.jsx(No,{children:"我们相信结果与过程同样重要。我们以目标为导向,设定高标准,并发挥我们的聪明才智和努力拼搏的精神来实现它们。我们致力于通过关注自身的行动和外部的变化来获得想要的结果。"})]}),l.jsxs(Mh,{children:[l.jsx(Dc,{children:"专注于小而可控的步骤"}),l.jsx(No,{children:"大的里程碑固然值得庆祝,而每一跬步也很重要。我们相信在正确的方向上迈出的每一小步可以跨越难以想象的距离。我们相信不积跬步,无以至千里;不积小流,无以成江海。"})]})]})]}),l.jsxs(Yz,{children:[l.jsx(Hz,{children:"公司文化"}),l.jsxs(Vz,{children:[l.jsxs(Ih,{children:[l.jsx(Nh,{src:kz}),l.jsxs(zh,{children:[l.jsx(Yh,{children:"持续学习"}),l.jsx(Hh,{children:"持之以恒的自驱学习,求真求致;"})]})]}),l.jsxs(Ih,{children:[l.jsx(Nh,{src:Cz}),l.jsxs(zh,{children:[l.jsx(Yh,{children:"精益求精"}),l.jsx(Hh,{children:"对自己高标准严要求,勇于挑战自我,对创新有极致追求;"})]})]}),l.jsxs(Ih,{children:[l.jsx(Nh,{src:Dz}),l.jsxs(zh,{children:[l.jsx(Yh,{children:"积极主动"}),l.jsx(Hh,{children:"遇到问题主动踏出第一步,做先行者而不是追随者。"})]})]})]})]}),l.jsx(Fz,{src:Ez}),l.jsx(Uz,{src:Ow}),l.jsx($z,{src:Ow}),l.jsx(Bz,{src:jz})]})}),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` +`,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:Ez}),l.jsx(Uz,{src:Ow}),l.jsx($z,{src:Ow}),l.jsx(Bz,{src:jz})]})}),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; @@ -1988,9 +1988,9 @@ Error generating stack: `+o.message+` background-size: cover; `,RY=f(CY)` padding-bottom: 0.51rem; -`,OY=f(DY)``,PY=[{title:"创造性工作",text:"在DatenLord,你将有机会与一群才华横溢、积极进取的人一起创造性且高效率地工作。",bg:wY},{title:"归属感",text:"DatenLord重视社区文化不仅仅局限于开源社区,我们也希望我们的员工在这里有一种包容感和归属感。",bg:xY},{title:"远程工作",text:"DatenLord专注于研究和开发分布式存储系统,我们是一个分布式的团队,大多数成员都可以远程工作。",bg:_Y}],MY=()=>l.jsxs(jY,{children:[l.jsx(EY,{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:LY,Paragraph:IY}=Pe,{CNHead5S:NY}=LY,{CNBodyLarge:zY}=IY,YY=f.section` +`,OY=f(DY)``,PY=[{title:"创造性工作",text:"在DatenLord,你将有机会与一群才华横溢、积极进取的人一起创造性且高效率地工作。",bg:wY},{title:"归属感",text:"DatenLord重视社区文化不仅仅局限于开源社区,我们也希望我们的员工在这里有一种包容感和归属感。",bg:xY},{title:"远程工作",text:"DatenLord专注于研究和开发分布式存储系统,我们是一个分布式的团队,大多数成员都可以远程工作。",bg:_Y}],LY=()=>l.jsxs(jY,{children:[l.jsx(EY,{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; -`,HY=f(NY)``,VY=f.div` +`,VY=f(NY)``,HY=f.div` display: flex; flex-direction: column; padding-top: 0.94rem; @@ -2014,7 +2014,7 @@ Error generating stack: `+o.message+` color: #2e2f33; background: ${e=>e.theme.white00}; box-shadow: 0px 4px 20px 0px rgba(0, 0, 0, 0.11); -`,Vg=f(of)` +`,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); @@ -2026,53 +2026,53 @@ Error generating stack: `+o.message+` transform: translateX(calc(4.81rem - 2.03rem)); `,BY=f(Eb)` transform: translateY(calc(-0.46rem + 0.3rem)); -`,WY=f(Vg)` +`,WY=f(Hg)` transform: translateX(calc(0.99rem)); `,GY=f(UY)` transform: translateX(calc(3.7rem - 2.03rem)); -`,KY=f(Vg)` +`,KY=f(Hg)` transform: translateX(calc(3.1rem - 2.03rem)); -`,XY=f(Vg)` +`,XY=f(Hg)` transform: translate(3.31rem, calc(-0.43rem + 0.13rem)); `,QY=f(Eb)` transform: translateX(calc(6.56rem - 2.03rem)); -`,qY=()=>l.jsxs(YY,{children:[l.jsx(HY,{children:"我们在寻找什么样的人才?"}),l.jsxs(VY,{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:eH,CNTitleLarge:tH}=JY,rH=f.section` +`,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; -`,nH=f(eH)``,iH=f.div` +`,nV=f(eV)``,iV=f.div` display: flex; justify-content: center; padding-top: 1.67rem; padding-inline: 0.32rem; -`,Mw=f.div` +`,Lw=f.div` width: calc(2.42rem + 0.08rem + 0.12rem); -`,Ab=f(tH)` +`,Ab=f(tV)` padding-left: 0.08rem; color: ${e=>e.theme.themeDark02}; -`,Lw=f(Ab)` +`,Mw=f(Ab)` border-left: 0.12rem solid ${e=>e.theme.secondary08}; `,Iw=f(Ab)` border-left: 0.12rem solid ${e=>e.theme.secondary07}; -`,oH=f.img` +`,oV=f.img` padding-inline: 0.24rem; width: 4.55rem; -`,sH=()=>l.jsxs(rH,{children:[l.jsx(nH,{children:"我们能提供什么?"}),l.jsxs(iH,{children:[l.jsxs(Mw,{children:[l.jsx(Lw,{style:{marginTop:"0.64rem"},children:"灵活的工作内容,艰巨挑战,激发创新"}),l.jsx(Iw,{style:{marginTop:"1.28rem"},children:"每年可申请长达2周的学习假期,自由选择充电课题"})]}),l.jsx(oH,{src:ZY}),l.jsxs(Mw,{children:[l.jsx(Iw,{style:{marginTop:"0.64rem"},children:"丰富的软性素质及专业技能培训"}),l.jsx(Lw,{style:{marginTop:"1.28rem"},children:"诸多行业交流和展现自我的机会"})]})]})]}),Tb="/zh-cn/assets/avatar-icon-b12a4de6.svg",aH="/zh-cn/assets/image-534e9e5c.png",{Heading:lH,Paragraph:cH}=Pe,{CNHead5S:uH,CNTitleLarge:Rb,CNTitleMedium:dH}=lH,{CNBodyMedium:Pl,CNMarkMedium:fH}=cH,hH=[{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"}],mH=f.section``,pH=f(uH)``,gH=f.div` +`,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; -`,vH=f.div` +`,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); -`,yH=f.div` +`,yV=f.div` display: flex; justify-content: space-between; padding-bottom: 0.24rem; -`,wH=f.div` +`,wV=f.div` display: flex; justify-content: center; align-items: center; @@ -2080,10 +2080,10 @@ Error generating stack: `+o.message+` height: 0.48rem; background: ${e=>e.theme.secondary02}; border-radius: 50%; -`,xH=f.img` +`,xV=f.img` width: 0.32rem; height: 0.32rem; -`,_H=f(fH)` +`,_V=f(fV)` padding: 0.12rem 0.18rem; height: 0.46rem; color: ${e=>e.theme.gray007}; @@ -2091,12 +2091,12 @@ Error generating stack: `+o.message+` border: 0.01rem solid #dae0e6; box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.04); cursor: pointer; -`,SH=f(Rb)` +`,SV=f(Rb)` color: ${e=>e.theme.gray007}; padding-bottom: 0.08rem; -`,bH=f(Pl)``,kH=f(Pl)``,CH=f.ol` +`,bV=f(Pl)``,kV=f(Pl)``,CV=f.ol` padding-left: 0.2rem; -`,DH=f(Pl)``,jH=f.div` +`,DV=f(Pl)``,jV=f.div` display: flex; flex-direction: column; align-items: center; @@ -2134,32 +2134,32 @@ Error generating stack: `+o.message+` height: min-content; `;f.div` width: 46%; -`;f(dH)``;f.ul` +`;f(dV)``;f.ul` padding-block: 0.36rem; list-style-type: none; `;f(Pl)``;f(Pl)``;f.span` color: ${e=>e.theme.secondary01}; -`;const EH=f.img` +`;const EV=f.img` width: 2.44rem; padding-bottom: 0.16rem; -`,AH=f(yn)` +`,AV=f(yn)` color: #fff; -`,TH=()=>{const e=ht();return l.jsxs(mH,{children:[l.jsx(pH,{children:"公开招聘"}),l.jsxs(gH,{children:[hH.map(({title:t,text:r,items:n,url:i},o)=>l.jsxs(vH,{children:[l.jsxs(yH,{children:[l.jsx(wH,{children:l.jsx(xH,{src:Tb})}),l.jsx(_H,{onClick:()=>e(i),children:"岗位详情"})]}),l.jsx(SH,{children:t}),l.jsx(bH,{children:"【岗位职责】"}),r&&l.jsx(kH,{children:r}),l.jsx(CH,{children:n.map((a,c)=>l.jsx(DH,{as:"li",children:a},c))})]},o)),l.jsxs(jH,{children:[l.jsx(EH,{src:aH}),l.jsx(AH,{onClick:()=>e("/job-description"),children:"进入招聘岗位详情"})]})]})]})},{Heading:RH}=Pe,{CNHead4:OH}=RH,PH=f.section` +`,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(xV,{src:Tb})}),l.jsx(_V,{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(jV,{children:[l.jsx(EV,{src:aV}),l.jsx(AV,{onClick:()=>e("/job-description"),children:"进入招聘岗位详情"})]})]})]})},{Heading:RV}=Pe,{CNHead4:OV}=RV,PV=f.section` background: #fff; -`,MH=f.div` +`,LV=f.div` max-width: 1440px; margin-inline: auto; padding-top: 1rem; padding-bottom: 1.69rem; padding-inline: 1.93rem; -`,LH=f(OH)` +`,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:jb,subTitle:"达坦科技通过软硬件深度融合的方式,提供高性能存储和高性能网络,打造高性能 AI + Cloud 基础设施平台。",children:"公司"}),l.jsx(PH,{id:"join-us",children:l.jsxs(MH,{children:[l.jsx(LH,{children:"加入我们"}),l.jsx(MY,{}),l.jsx(qY,{}),l.jsx(sH,{}),l.jsx(TH,{})]})}),l.jsx(Db,{})]})},IH="/zh-cn/assets/video-demo-cover-6531bf08.png",jc="/zh-cn/assets/arrow-up-right-f6ca128c.svg",NH="/zh-cn/assets/cover1-0f766121.jpg",zH="/zh-cn/assets/cover2-6c924915.jpg",YH="/zh-cn/assets/cover3-a8cadd7b.jpg",HH="/zh-cn/assets/cover4-da59baaf.jpg",VH="/zh-cn/assets/cover5-55104208.jpg",FH="/zh-cn/assets/cover6-bf6d56c4.jpg",UH="/zh-cn/assets/cover7-461ad08e.jpg",$H="/zh-cn/assets/cover8-18bb5252.jpg",BH="/zh-cn/assets/cover9-0cfe7433.jpg",WH="/zh-cn/assets/cover10-7707f5f7.jpg",GH="/zh-cn/assets/cover11-18bf7e52.jpg",KH="/zh-cn/assets/cover12-2ec52bb9.jpg",XH="/zh-cn/assets/cover13-20980f41.jpg",QH="/zh-cn/assets/cover14-6dff9a13.jpg",qH="/zh-cn/assets/cover15-f2819b4b.jpg",ZH="/zh-cn/assets/cover16-6b3eea77.jpg",JH="/zh-cn/assets/cover17-2d99b802.jpg",eV="/zh-cn/assets/cover19-9503f8ee.jpg",tV="/zh-cn/assets/cover20-a198bfe8.jpg",rV="/zh-cn/assets/cover21-c1808615.jpg",nV="/zh-cn/assets/cover22-a24d3264.jpg",iV="/zh-cn/assets/cover23-91837162.jpg",oV="/zh-cn/assets/cover24-f34d429f.jpg",sV="/zh-cn/assets/cover25-11f1a4dd.jpg",aV="/zh-cn/assets/cover26-574c835d.jpg",lV="/zh-cn/assets/cover27-cab7b800.jpg",cV="/zh-cn/assets/cover28-61988539.jpg",uV="/zh-cn/assets/cover29-cfa296fc.jpg",dV="/zh-cn/assets/cover30-6bc9e17a.jpg",fV="/zh-cn/assets/cover31-de17416a.jpg",hV="/zh-cn/assets/cover32-64d8c4cf.jpg",mV="/zh-cn/assets/cover33-747e46a5.jpg",pV="/zh-cn/assets/cover34-b47433e8.jpg",gV="/zh-cn/assets/cover35-474e265e.jpg",vV="/zh-cn/assets/cover40-e2bf253f.jpg",yV="/zh-cn/assets/cover41-56007738.jpg",wV="/zh-cn/assets/cover42-075bcf74.jpg",xV="/zh-cn/assets/cover43-d1896502.jpg",_V="/zh-cn/assets/cover50-2dc33471.jpg",SV="/zh-cn/assets/cover51-235c2ee6.jpg",bV="/zh-cn/assets/cover52-06cc8093.jpg",kV="/zh-cn/assets/cover53-11208fe4.jpg",CV="/zh-cn/assets/cover55-a634f887.jpg",DV=[{key:1,image:NH,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:zH,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:YH,title:"Cocotb Workshop分享",text:"本场workshop由达坦科技DatenLord 翁万正进行内容分享,主要进行了cocotb相关知识介绍。",date:"2022.09.23",url:"https://www.bilibili.com/video/BV19e4y1k7EE/"},{key:4,image:HH,title:"使用Copilot在分布式系统中容忍暂时变慢的节点",text:"本场workshop由达坦科技DatenLord 田野进行内容分享,主要进行了“使用Copilot在分布式系统中容忍暂时变慢的节点“相关知识介绍。",date:"2022.09.30",url:"https://www.bilibili.com/video/BV15e411T7pX/"},{key:5,image:VH,title:"硬件设计的集合方法",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要进行了“硬件设计的集合方法”相关知识介绍。",date:"2022.10.09",url:"https://www.bilibili.com/video/BV1FK411Q7JV/"},{key:6,image:FH,title:"VLSI Sharing",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要进行了VLSI相关知识介绍。",date:"2022.10.15",url:"https://www.bilibili.com/video/BV1bK411Q7GB/"},{key:7,image:UH,title:"Corumdum介绍",text:"本场workshop由西安电子科技大学 ISN网络与交换团队 硕士研究生李钊进行内容分享,主要进行了Corumdum相关知识介绍。",date:"2022.10.16",url:"https://www.bilibili.com/video/BV1qG41177Pq/"},{key:8,image:$H,title:"可编程交换机:原理与使用",text:"本场workshop由上海交通大学IPADS实验室博士二年级 张汉泽进行内容分享,主要进行了“可编程交换机:原理与使用”相关知识分享。可编程交换机由安装包处理规则的控制面与负责高速包处理的数据面构成,两者由一根PCIe总线相连。控制面支持高级语言编程,而数据面逻辑需要用P4语言编写。在可编程交换机上设计系统主要面临数据面内存有限与P4编程模型受限两大挑战。",date:"2022.10.23",url:"https://www.bilibili.com/video/BV1jm4y1w7w3/"},{key:9,image:BH,title:"形式化验证入门",text:"本场workshop由达坦科技DatenLord王璞进行内容分享,主要进行了形式化验证入门相关知识介绍。",date:"2022.10.26",url:"https://www.bilibili.com/video/BV1DG411L78p/"},{key:10,image:WH,title:"利用RDMA加速FaaS服务",text:"本场workshop由达坦科技DatenLord李弘宇进行内容分享,主要进行了“利用RDMA加速FaaS服务”相关知识介绍。",date:"2022.11.06",url:"https://www.bilibili.com/video/BV1et4y1K7Sw/"},{key:11,image:GH,title:"Rust for Linux",text:"本场workshop由苏宇恒进行内容分享,主要进行了“Rust for Linux”相关知识介绍。",date:"2022.11.08",url:"https://www.bilibili.com/video/BV1G8411a7CE/"},{key:12,image:KH,title:"Intel用户态中断",text:"本场workshop由韩明聪进行内容分享,主要进行了“Intel用户态中断”相关知识介绍。",date:"2022.11.08",url:"https://www.bilibili.com/video/BV1tG4y1t7Lg/"},{key:13,image:XH,title:"VLSI DSP Sharing",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要进行了“VLSI DSP Intro”相关知识介绍。",date:"2022.11.11",url:"https://www.bilibili.com/video/BV18P4y1y7iP/"},{key:14,image:QH,title:"DSP Sharing Part2",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要就DSP相关知识进行第二次workshop分享",date:"2022.11.12",url:"https://www.bilibili.com/video/BV1bM411k7YP/"},{key:15,image:qH,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:ZH,title:"RDMA网络拥塞管理架构",text:"本场workshop由北京邮电大学网络与交换国家重点实验室、计算机学院,副研究员、博导:张乙然进行内容分享,主要内容围绕“RDMA网络拥塞管理架构”进行知识介绍。",date:"2022.11.27",url:"https://www.bilibili.com/video/BV1Ve4y1g7gx/"},{key:17,image:JH,title:"使用RDMA加速服务器无感知计算容器启动",text:"本场workshop由上海交通大学助理教授魏星达进行分享,主要内容围绕“使用RDMA加速服务器无感知计算容器启动”进行知识介绍。",date:"2022.12.04",url:"https://www.bilibili.com/video/BV1qG4y1G784/"},{key:19,image:eV,title:"基于智能网卡的数据处理系统",text:"本场workshop由浙江大学百人计划研究员 王则可进行分享,主要内容为“基于智能网卡的数据处理系统”介绍。",date:"2022.12.18",url:"https://www.bilibili.com/video/BV1Eg411J7fJ/"},{key:20,image:tV,title:"异步事件驱动的电路机制 & 基于RISC-V的全异步超标量CPU体系结构",text:"本场workshop由何安平副教授进行分享,主要内容为“异步事件驱动的电路机制 & 基于RISC-V的全异步超标量CPU体系结构”介绍。",date:"2022.12.25",url:"https://www.bilibili.com/video/BV1sA411D7on/"},{key:21,image:rV,title:"使用 TLA+ 为分布式算法验证正确性",text:"本场workshop由达坦科技DatenLord田野进行分享,主要内容为“使用 TLA+ 为分布式算法验证正确性”介绍。",date:"2023.01.09",url:"https://www.bilibili.com/video/BV1pG4y1y7an/"},{key:22,image:nV,title:"喷泉码技术简介",text:"本场workshop由兰州大学信息科学与工程学院副教授、通信工程专业系主任袁磊 进行分享,主要内容为“喷泉码技术简介”介绍。",date:"2023.01.15",url:"https://www.bilibili.com/video/BV1SM411b77k/"},{key:23,image:iV,title:"数据库隔离级别及MVCC",text:"本场workshop由达坦科技DatenLord施继成进行分享,主要内容为“数据库隔离级别及MVCC”介绍。",date:"2023.01.29",url:"https://www.bilibili.com/video/BV1sR4y1b7Cu/"},{key:24,image:oV,title:"互联网传输协议优化研究",text:"本场workshop由中国人民大学副教授李彤教授进行分享,主要内容为“互联网传输协议优化研究”介绍。",date:"2023.02.06",url:"https://www.bilibili.com/video/BV1X84y157vL/"},{key:25,image:sV,title:"高性能RDMA网络协议栈",text:"高性能RDMA网络协议栈是RDMA高性能网络的核心组成部分之一,它提供了支持RDMA技术的网络协议和驱动程序。在本周的前沿科技分享中,我们邀请到了湖南大学信息科学与工程学院的陈果教授来给我们分享高性能RDMA网络协议栈的话题。",date:"2023.02.28",url:"https://www.bilibili.com/video/BV1Y24y1n7Dk/"},{key:26,image:aV,title:"GPU抢占式任务调度",text:"GPU编程可以大幅提升计算速度和效率,从而使得许多计算任务得以在合理时间内完成。随着GPU硬件技术的发展和大规模数据处理需求的增加,GPU编程的应用范围不断扩大。在本周的前沿科技分享中,我们邀请到了上海交通大学并行与分布式研究所的韩明聪博士来给我们分享GPU抢占式任务调度。",date:"2023.03.05",url:"https://www.bilibili.com/video/BV1cY4y1y7ND/"},{key:27,image:lV,title:"聊聊RaptorQ纠错码",text:"喷泉码具有极高的纠错能力,且具有低延迟、地复杂度、高效率等优点,使其在冷存储、分布式存储、无线通信等领域得到广泛应用。达坦科技致力于软硬件融合的解决方案,喷泉码的高效实现在硬件上,作为公司长期的技术储备,在本周的前沿科技分享中,达坦科技的联合创始人兼CTO施继成将为大家分享聊聊 RaptorQ 纠错码 。",date:"2023.03.15",url:"https://www.bilibili.com/video/BV1wL411C7DL/"},{key:28,image:cV,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:uV,title:"新一代计算架构:超异构计算",text:"AGI带来的变化之一是算力将进一步从CPU转到GPU,在本周的前沿技术分享中,我们邀请到了上海矩向科技创始人兼CEO黄朝波为大家分享新一代计算架构:超异构计算。",date:"2023.04.04",url:"https://www.bilibili.com/video/BV1Rm4y1q7Dx/"},{key:30,image:dV,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:fV,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:hV,title:"Rust嵌入式开发生态介绍及入门",text:"在本周的前沿技术分享中,我们邀请到了一位爱好硬件的软件工程师米明恒,来为大家分享Rust嵌入式开发生态介绍及入门。",date:"2023.05.04",url:"https://www.bilibili.com/video/BV1J24y1T7EH/"},{key:33,image:mV,title:"RDMA赋能数据中心/超算中心间远程互联",text:"在本周的前沿技术分享中,我们邀请到了南京大学田臣教授,来为大家分享RDMA赋能数据中心/超算中心间远程互联。",date:"2023.06.04",url:"https://www.bilibili.com/video/BV1cz4y1B7cx/"},{key:34,image:pV,title:"Paper Reading: DPU任务卸载",text:"达坦科技一直在探索用硬件加速做分布式跨云存储,在本周的前沿技术分享中,我们邀请到了中南大学在读博士生卢军,来为大家分享DPU任务卸载的相关研究。",date:"2023.06.17",url:"https://www.bilibili.com/video/BV1R14y1S79T/"},{key:35,image:gV,title:"Rust在物理引擎研发中的应用",text:"在本周的前沿技术分享中,我们邀请到了Motphys CEO崔汉青,来为大家分享Rust在物理引擎研发中的应用。",date:"2023.06.27",url:"https://b23.tv/BZuSvyW"},{key:40,image:vV,title:"基于BSV的RTL仿真加速设计研究",text:"BSV的仿真加速可以提升硬件开发调试的效率。在本周的前沿技术分享中,我们邀请到了梁之杰,来为大家分享基于BSV的RTL仿真加速设计研究。",date:"2023.07.09",url:"https://www.bilibili.com/video/BV1ou411L7Yy/"},{key:41,image:yV,title:"RDMA网络的系统测试方案",text:"在本周的前沿技术分享中,我们邀请到了孔心皓,来为大家分享RDMA 网络的系统测试方案。",date:"2023.07.16",url:"https://www.bilibili.com/video/BV1tz4y147rw/"},{key:42,image:wV,title:"RapidWright技术分享会",text:"在本周的前沿技术分享中,我们邀请到了西南交通大学邸志雄副教授和他的学生向瀚章,来为大家分享开源FPGA设计工具RapidWright技术。",date:"2023.07.28",url:"https://www.bilibili.com/video/BV14z4y1x7a8/"},{key:43,image:xV,title:"基于Karmada实现Kubernetes应用跨集群故障转移",text:"在本周的前沿技术分享中,我们邀请到了开源爱好者,云兴科技软件研发工程师梁远鹏,来为大家分享基于Karmada实现Kubernetes应用跨集群故障转移。",date:"2023.08.01",url:"https://www.bilibili.com/video/BV1rN411Y7aZ/"},{key:50,image:_V,title:"大模型训练和基础设施",text:"在本周的前沿技术分享中,我们邀请到了范一呈,来为大家分享大模型训练和基础设施。",date:"2023.09.01",url:"https://www.bilibili.com/video/BV1ZN4y1R7HP/"},{key:51,image:SV,title:"RustBelt与Rust形式化方法",text:"在本周的前沿技术分享中,我们邀请到了王俊吉,来为大家分享RustBelt与Rust形式化方法。",date:"2023.09.04",url:"https://www.bilibili.com/video/BV1Vw411D7rT/"},{key:52,image:bV,title:"网络的智能该放在哪里:网卡、交换机还是xPU",text:"在本周的前沿技术分享中,我们邀请到了Logenic AI联合创始人、前华为天才少年李博杰,来为大家分享网络的智能该放在哪里:网卡、交换机还是xPU。",date:"2023.09.25",url:"https://www.bilibili.com/video/BV1Kw411Y7Cj/"},{key:53,image:kV,title:"以ARM为镜的RISC-V",text:"在本周的前沿技术分享中,我们邀请到了Logenic AI联合创始人、前华为天才少年李博杰,来为大家分享网络的智能该放在哪里:网卡、交换机还是xPU。",date:"2023.09.25",url:"https://www.bilibili.com/video/BV1Kw411Y7Cj/"},{key:55,image:CV,title:"让大模型在场景中真正落地的产品形态、技术堆栈、交付服务",text:"达坦科技始终致力于打造高性能 Al+ Cloud 基础设施平台,积极推动AI应用的落地。达坦科技通过软硬件深度融合的方式,提供高性能存储和高性能网络。为 AI 应用提供弹性、便利、经济的基础设施服务,以此满足不同行业客户对 AI+Cloud 的需求。在本周的前沿技术分享中,我们邀请到了猴子无限创始人兼CEO尹伯昊,来为大家分享让大模型在场景中真正落地的产品形态、技术堆栈、交付服务。",date:"2024.03.18",url:"https://www.bilibili.com/video/BV1KJ4m187gS/"}],jV="/zh-cn/assets/cover1-42e6189a.jpg",EV="/zh-cn/assets/cover2-af26ed46.jpg",AV="/zh-cn/assets/cover3-9c9d21fa.jpg",TV=[{key:1,image:jV,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:EV,title:"源码解读:Xline Curp共识协议的设计与实现",text:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源分布式KV存储Xline,针对多数据中心场景,可以实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性。",date:"2023.04.30",url:"https://www.bilibili.com/video/BV1dL411h7YK/"},{key:3,image:AV,title:"Xline的Lease机制与实现",text:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源分布式KV存储Xline,针对多数据中心场景,可以实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性。",date:"2023.06.09",url:"https://www.bilibili.com/video/BV1FX4y1h7X5/"}],RV="/zh-cn/assets/cover1-a1358db9.jpg",OV="/zh-cn/assets/cover2-b899ea12.jpg",PV="/zh-cn/assets/cover3-e0bf4798.jpg",MV="/zh-cn/assets/cover4-15b0b4f1.jpg",LV="/zh-cn/assets/cover5-7c4c2482.jpg",IV="/zh-cn/assets/cover6-1c4d5c5f.jpg",NV="/zh-cn/assets/cover7-4f7454c0.jpg",zV="/zh-cn/assets/cover8-7e30c0fc.jpg",YV="/zh-cn/assets/cover9-e8c86c60.jpg",HV="/zh-cn/assets/cover10-bb13b118.jpg",VV="/zh-cn/assets/cover11-c29e9692.jpg",FV="/zh-cn/assets/cover12-6877e246.jpg",UV="/zh-cn/assets/cover13-5a4d97b0.jpg",$V="/zh-cn/assets/cover14-052a8b36.jpg",BV=[{key:7,image:NV,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:zV,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:YV,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:RV,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:OV,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:PV,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:MV,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:LV,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:IV,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:HV,title:"如何用Rust写分布式系统",text:"分享会介绍分布式KV Store (Xline) 整体的组成,以及不同组件之间如何去交互。在广域网下的分布式系统如何高效地达成共识,以及分布式系统如何实现容错。",date:"2023.06.24",url:"https://www.bilibili.com/video/BV1Hs4y1r7dD/"},{key:11,image:VV,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:FV,title:"30分钟体验Rust for Linux内核模块开发",text:"本主题会提供构建好的docker开发环境,在30分钟内演示如何使用r4l开发一个简易内核模块,并介绍目前r4l的发展现状。可以自备好电脑现场体验。",date:"2023.06.24",url:"https://www.bilibili.com/video/BV12j411U78o/"},{key:13,image:UV,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:$V,title:"DatenLord Hackathon2023空中路演",text:"DatenLord Hackathon 2023已经顺利完赛。达坦科技基于其跨云分布式文件系统DatenLord项目,结合AI大模型时代背景,搭建了擂台。我们邀请参赛者为DatenLord的极端场景设计并实现缓存 p2p 传输和同步模块。本次空中路演邀请了最终获得优胜奖的两支队伍进行思路分享,包括他们的解题思路,碰到的难点和挑战,以及如何应对的方法和设计亮点。欢迎感兴趣的大家进行观看,有问题也欢迎在评论区进行交流~~不要忘记一键三连哦~~",date:"2024.01.07",url:"https://www.bilibili.com/video/BV1ic411t7Nf/"}],WV="/zh-cn/assets/cover1-b9371555.jpg",GV="/zh-cn/assets/cover2-41a903e3.jpg",KV="/zh-cn/assets/cover2-41a903e3.jpg",XV="/zh-cn/assets/cover2-41a903e3.jpg",QV="/zh-cn/assets/cover2-41a903e3.jpg",qV="/zh-cn/assets/cover2-41a903e3.jpg",ZV="/zh-cn/assets/cover2-41a903e3.jpg",JV="/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:WV,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:GV,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:KV,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:XV,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:QV,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:qV,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:ZV,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:JV,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:xF}=Pe,{CNHead4:_F,CNTitleLarge:SF}=wF,{CNMarkSmall:bF,CNBodySmall:kF}=xF,Ec=new Map([["tech-talk",{label:"前沿科技分享",description:"探索前沿技术,拥抱创新与改变",list:DV,recommend:27}],["oss-showcase",{label:"开源产品分享",description:"软硬件融合创新实践的观察与输出",list:TV,recommend:2}],["rust-showcase",{label:"Rust语言应用及案例分享",description:"Rust编程语言的应用、实践与探索",list:BV,recommend:12}],["hardware-acceleration",{label:"硬件加速",description:"硬件加速领域的实践、经验与挑战",list:yF,recommend:21}]]),CF=f.main``,DF=f.div` +`,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:jb,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",jc="/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",xH="/zh-cn/assets/cover43-d1896502.jpg",_H="/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:xH,title:"基于Karmada实现Kubernetes应用跨集群故障转移",text:"在本周的前沿技术分享中,我们邀请到了开源爱好者,云兴科技软件研发工程师梁远鹏,来为大家分享基于Karmada实现Kubernetes应用跨集群故障转移。",date:"2023.08.01",url:"https://www.bilibili.com/video/BV1rN411Y7aZ/"},{key:50,image:_H,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/"}],jH="/zh-cn/assets/cover1-42e6189a.jpg",EH="/zh-cn/assets/cover2-af26ed46.jpg",AH="/zh-cn/assets/cover3-9c9d21fa.jpg",TH=[{key:1,image:jH,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:EH,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:xF}=Pe,{CNHead4:_F,CNTitleLarge:SF}=wF,{CNMarkSmall:bF,CNBodySmall:kF}=xF,Ec=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; -`,Vh=f.section` +`,Hh=f.section` padding-bottom: 0.84rem; &:last-child { padding-bottom: 0; @@ -2204,7 +2204,7 @@ Error generating stack: `+o.message+` border-radius: 0.06rem; `,Yw=f.div` padding-top: 0.29rem; -`,MF=f.div` +`,LF=f.div` width: 47%; `,Ac=f(bF)` padding-bottom: 0.11rem; @@ -2223,16 +2223,16 @@ Error generating stack: `+o.message+` height: 0.215rem; `,Pc=f(kF)` color: #667085; -`,Mc=()=>{var a,c,d,h;const t=si().pathname.split("/").join(""),r=(a=Ec.get(t))==null?void 0:a.label,n=(c=Ec.get(t))==null?void 0:c.description,i=(d=Ec.get(t))==null?void 0:d.list.reverse(),o=(h=Ec.get(t))==null?void 0:h.recommend;return I.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsxs(Rt.Fragment,{children:[l.jsx(Ir,{cover:IH,subTitle:n,children:r}),l.jsx(CF,{children:l.jsxs(DF,{children:[l.jsxs(Vh,{children:[l.jsx(Fh,{children:"最新视频"}),l.jsx(jF,{children:i&&i.map(({key:g,image:v,date:_,title:k,text:C,url:D},j)=>j===0?l.jsxs(AF,{children:[l.jsx(zw,{src:v}),l.jsxs(Yw,{children:[l.jsx(Ac,{children:_}),l.jsxs(Tc,{as:wc,to:D,children:[l.jsx(Rc,{children:k}),l.jsx(Oc,{src:jc})]}),l.jsx(Pc,{children:C})]})]},g):j<3?l.jsxs(RF,{children:[l.jsx(PF,{src:v}),l.jsx(Ac,{children:_}),l.jsxs(Tc,{as:wc,to:D,children:[l.jsx(Rc,{children:k}),l.jsx(Oc,{src:jc})]}),l.jsx(Pc,{children:C})]},j):null)})]}),l.jsxs(Vh,{children:[l.jsx(Fh,{children:"推荐视频"}),i&&i.map(({key:g,image:v,date:_,title:k,text:C,url:D})=>{if(g===o)return l.jsxs(TF,{children:[l.jsx(OF,{src:v}),l.jsxs(MF,{children:[l.jsx(Ac,{children:_}),l.jsxs(Tc,{as:wc,to:D,children:[l.jsx(Rc,{children:k}),l.jsx(Oc,{src:jc})]}),l.jsx(Pc,{children:C})]})]},g)})]}),l.jsxs(Vh,{children:[l.jsx(Fh,{children:"全部视频"}),l.jsx(EF,{children:i&&i.map(({key:g,image:v,date:_,title:k,text:C,url:D})=>l.jsxs(Ob,{children:[l.jsx(zw,{src:v}),l.jsxs(Yw,{children:[l.jsx(Ac,{children:_}),l.jsxs(Tc,{as:wc,to:D,children:[l.jsx(Rc,{children:k}),l.jsx(Oc,{src:jc})]}),l.jsx(Pc,{children:C})]})]},g))})]})]})})]})};//! moment.js +`,Lc=()=>{var a,c,d,h;const t=si().pathname.split("/").join(""),r=(a=Ec.get(t))==null?void 0:a.label,n=(c=Ec.get(t))==null?void 0:c.description,i=(d=Ec.get(t))==null?void 0:d.list.reverse(),o=(h=Ec.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(jF,{children:i&&i.map(({key:g,image:v,date:_,title:k,text:C,url:D},j)=>j===0?l.jsxs(AF,{children:[l.jsx(zw,{src:v}),l.jsxs(Yw,{children:[l.jsx(Ac,{children:_}),l.jsxs(Tc,{as:wc,to:D,children:[l.jsx(Rc,{children:k}),l.jsx(Oc,{src:jc})]}),l.jsx(Pc,{children:C})]})]},g):j<3?l.jsxs(RF,{children:[l.jsx(PF,{src:v}),l.jsx(Ac,{children:_}),l.jsxs(Tc,{as:wc,to:D,children:[l.jsx(Rc,{children:k}),l.jsx(Oc,{src:jc})]}),l.jsx(Pc,{children:C})]},j):null)})]}),l.jsxs(Hh,{children:[l.jsx(Fh,{children:"推荐视频"}),i&&i.map(({key:g,image:v,date:_,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:_}),l.jsxs(Tc,{as:wc,to:D,children:[l.jsx(Rc,{children:k}),l.jsx(Oc,{src:jc})]}),l.jsx(Pc,{children:C})]})]},g)})]}),l.jsxs(Hh,{children:[l.jsx(Fh,{children:"全部视频"}),l.jsx(EF,{children:i&&i.map(({key:g,image:v,date:_,title:k,text:C,url:D})=>l.jsxs(Ob,{children:[l.jsx(zw,{src:v}),l.jsxs(Yw,{children:[l.jsx(Ac,{children:_}),l.jsxs(Tc,{as:wc,to:D,children:[l.jsx(Rc,{children:k}),l.jsx(Oc,{src:jc})]}),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 LF(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 Ml(e){return e instanceof Date||Object.prototype.toString.call(e)==="[object Date]"}function Mb(e,t){var r=[],n,i=e.length;for(n=0;n>>0,n;for(n=0;n0)for(r=0;r>>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,Lc=/(\[[^\[]*\])|(\\)?(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 xn(i.apply(this,arguments),t[1],t[2])}),r&&(ys[r]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function HF(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function VF(e){var t=e.match(Wg),r,n;for(r=0,n=t.length;r=0&&Lc.test(e);)e=e.replace(Lc,n),Lc.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 xU(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 _U(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 jU(e,t){return typeof e!="string"?e:isNaN(e)?(e=t.weekdaysParse(e),typeof e=="number"?e:null):parseInt(e,10)}function EU(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 MU(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 LU(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=jU(e,this.localeData()),this.add(e-t,"d")):t}function HU(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 VU(e){if(!this.isValid())return e!=null?this:NaN;if(e!=null){var t=EU(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)+xn(this.minutes(),2)});se("hmmss",0,0,function(){return""+Zg.apply(this)+xn(this.minutes(),2)+xn(this.seconds(),2)});se("Hmm",0,0,function(){return""+this.hours()+xn(this.minutes(),2)});se("Hmmss",0,0,function(){return""+this.hours()+xn(this.minutes(),2)+xn(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);He(["H","HH"],Ct);He(["k","kk"],function(e,t,r){var n=we(e);t[Ct]=n===24?0:n});He(["a","A"],function(e,t,r){r._isPm=r._locale.isPM(e),r._meridiem=e});He(["h","hh"],function(e,t,r){t[Ct]=we(e),pe(r).bigHour=!0});He("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});He("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});He("Hmm",function(e,t,r){var n=e.length-2;t[Ct]=we(e.substr(0,n)),t[Xr]=we(e.substr(n))});He("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={},xl;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 xl}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=xl._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?xl=r:typeof console<"u"&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),xl._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 xl;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:xU).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()&&E$(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 H$=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,V$=/^(-|\+)?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=H$.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=V$.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=j$;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)||Ml(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 xs(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-=xs(t+(this._isUTC?0:this.utcOffset()*ws),Qu);break;case"minute":t=this._d.valueOf(),t-=xs(t,ws);break;case"second":t=this._d.valueOf(),t-=xs(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-xs(t+(this._isUTC?0:this.utcOffset()*ws),Qu)-1;break;case"minute":t=this._d.valueOf(),t+=ws-xs(t,ws)-1;break;case"second":t=this._d.valueOf(),t+=Xu-xs(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 xB(){return this.isValid()?this.toISOString():null}function _B(){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",LB);q("NNNNN",IB);He(["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);He(["y","yy","yyy","yyyy"],$t);He(["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 jB(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 EB(){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",Hb);He("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});He(["D","DD"],pn);He("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",Vb);He(["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);He(["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);He(["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,Hb);q("SS",cf,Cr);q("SSS",cf,Vb);var ji,wk;for(ji="SSSS";ji.length<=9;ji+="S")q(ji,Ks);function XB(e,t){t[lo]=we(("0."+e)*1e3)}for(ji="S";ji.length<=9;ji+="S")He(ji,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=Ll.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=_B;U.lang=fk;U.locale=dk;U.localeData=hk;U.max=_$;U.min=x$;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=xB;U.toString=oB;U.unix=gB;U.valueOf=pB;U.creationData=kB;U.eraName=EB;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=HB;U.isoWeeksInISOWeekYear=VB;U.date=yk;U.day=U.days=YU;U.weekday=HU;U.isoWeekday=VU;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=M$;U.hasAlignedHourOffset=L$;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 xk(e){return e}var Re=Bg.prototype;Re.calendar=YF;Re.longDateFormat=UF;Re.invalidDate=BF;Re.ordinal=KF;Re.preparse=xk;Re.postformat=xk;Re.relativeTime=QF;Re.pastFuture=qF;Re.set=NF;Re.eras=CB;Re.erasParse=DB;Re.erasConvertYear=jB;Re.erasAbbrRegex=PB;Re.erasNameRegex=OB;Re.erasNarrowRegex=MB;Re.months=fU;Re.monthsShort=hU;Re.monthsParse=pU;Re.monthsRegex=yU;Re.monthsShortRegex=vU;Re.week=_U;Re.firstDayOfYear=kU;Re.firstDayOfWeek=bU;Re.weekdays=MU;Re.weekdaysMin=IU;Re.weekdaysShort=LU;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 _k(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 _k(e,t,"months")}function t9(e,t){return _k(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 x9(){return rn(this)}function _9(e){return e=zr(e),this.isValid()?this[e+"s"]():NaN}function Eo(e){return function(){return this.isValid()?this._data[e]:NaN}}var S9=Eo("milliseconds"),b9=Eo("seconds"),k9=Eo("minutes"),C9=Eo("hours"),D9=Eo("days"),j9=Eo("months"),E9=Eo("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")),_=o<=r.ss&&["s",o]||o0,_[4]=n,T9.apply(null,_)}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 M9(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=x9;De.get=_9;De.milliseconds=S9;De.seconds=b9;De.minutes=k9;De.hours=C9;De.days=D9;De.weeks=A9;De.months=j9;De.years=E9;De.humanize=M9;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);He("X",function(e,t,r){r._d=new Date(parseFloat(e)*1e3)});He("x",function(e,t,r){r._d=new Date(we(e))});//! moment.js -B.version="2.29.4";LF(Ke);B.fn=U;B.min=S$;B.max=b$;B.now=k$;B.utc=kn;B.unix=ZB;B.months=e9;B.isDate=Ml;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 L9="/zh-cn/assets/blog-cover-95d8a382.png",I9=new Map([["blogs","技术博客"],["events","活动预告"],["highlights","精彩回顾"],["news-honor-dynamic","新闻 / 荣誉"]]),N9=f.main` +`+new Error().stack),r=!1}return t.apply(this,arguments)},t)}var Hw={};function Ib(e,t){B.deprecationHandler!=null&&B.deprecationHandler(e,t),Hw[e]||(Mb(t),Hw[e]=!0)}B.suppressDeprecationWarnings=!1;B.deprecationHandler=null;function Cn(e){return typeof Function<"u"&&e instanceof Function||Object.prototype.toString.call(e)==="[object Function]"}function NF(e){var t,r;for(r in e)Te(e,r)&&(t=e[r],Cn(t)?this[r]=t:this["_"+r]=t);this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)}function Gp(e,t){var r=Di({},e),n;for(n in t)Te(t,n)&&(mo(e[n])&&mo(t[n])?(r[n]={},Di(r[n],e[n]),Di(r[n],t[n])):t[n]!=null?r[n]=t[n]:delete r[n]);for(n in e)Te(e,n)&&!Te(t,n)&&mo(e[n])&&(r[n]=Di({},r[n]));return r}function Bg(e){e!=null&&this.set(e)}var Kp;Object.keys?Kp=Object.keys:Kp=function(e){var t,r=[];for(t in e)Te(e,t)&&r.push(t);return r};var zF={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"};function YF(e,t,r){var n=this._calendar[e]||this._calendar.sameElse;return Cn(n)?n.call(t,r):n}function xn(e,t,r){var n=""+Math.abs(e),i=t-n.length,o=e>=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 xn(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 xU(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 _U(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 jU(e,t){return typeof e!="string"?e:isNaN(e)?(e=t.weekdaysParse(e),typeof e=="number"?e:null):parseInt(e,10)}function EU(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=jU(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=EU(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)+xn(this.minutes(),2)});se("hmmss",0,0,function(){return""+Zg.apply(this)+xn(this.minutes(),2)+xn(this.seconds(),2)});se("Hmm",0,0,function(){return""+this.hours()+xn(this.minutes(),2)});se("Hmmss",0,0,function(){return""+this.hours()+xn(this.minutes(),2)+xn(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={},xl;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 xl}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=xl._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?xl=r:typeof console<"u"&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),xl._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 xl;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:xU).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()&&E$(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=j$;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 xs(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-=xs(t+(this._isUTC?0:this.utcOffset()*ws),Qu);break;case"minute":t=this._d.valueOf(),t-=xs(t,ws);break;case"second":t=this._d.valueOf(),t-=xs(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-xs(t+(this._isUTC?0:this.utcOffset()*ws),Qu)-1;break;case"minute":t=this._d.valueOf(),t+=ws-xs(t,ws)-1;break;case"second":t=this._d.valueOf(),t+=Xu-xs(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 xB(){return this.isValid()?this.toISOString():null}function _B(){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 jB(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 EB(){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 ji,wk;for(ji="SSSS";ji.length<=9;ji+="S")q(ji,Ks);function XB(e,t){t[lo]=we(("0."+e)*1e3)}for(ji="S";ji.length<=9;ji+="S")Ve(ji,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=_B;U.lang=fk;U.locale=dk;U.localeData=hk;U.max=_$;U.min=x$;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=xB;U.toString=oB;U.unix=gB;U.valueOf=pB;U.creationData=kB;U.eraName=EB;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 xk(e){return e}var Re=Bg.prototype;Re.calendar=YF;Re.longDateFormat=UF;Re.invalidDate=BF;Re.ordinal=KF;Re.preparse=xk;Re.postformat=xk;Re.relativeTime=QF;Re.pastFuture=qF;Re.set=NF;Re.eras=CB;Re.erasParse=DB;Re.erasConvertYear=jB;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=_U;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 _k(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 _k(e,t,"months")}function t9(e,t){return _k(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 x9(){return rn(this)}function _9(e){return e=zr(e),this.isValid()?this[e+"s"]():NaN}function Eo(e){return function(){return this.isValid()?this._data[e]:NaN}}var S9=Eo("milliseconds"),b9=Eo("seconds"),k9=Eo("minutes"),C9=Eo("hours"),D9=Eo("days"),j9=Eo("months"),E9=Eo("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")),_=o<=r.ss&&["s",o]||o0,_[4]=n,T9.apply(null,_)}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=x9;De.get=_9;De.milliseconds=S9;De.seconds=b9;De.minutes=k9;De.hours=C9;De.days=D9;De.weeks=A9;De.months=j9;De.years=E9;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; @@ -2250,12 +2250,12 @@ B.version="2.29.4";LF(Ke);B.fn=U;B.min=S$;B.max=b$;B.now=k$;B.utc=kn;B.unix=ZB;B &:last-child { margin-bottom: 0; } -`,H9=f.img` +`,V9=f.img` padding-left: 0.47rem; width: 4.35rem; height: min-content; border-radius: 0.08rem; -`,V9=f.div` +`,H9=f.div` width: 56%; flex: 1; padding-top: calc(1.22rem - 0.96rem); @@ -2304,7 +2304,7 @@ B.version="2.29.4";LF(Ke);B.fn=U;B.min=S$;B.max=b$;B.now=k$;B.utc=kn;B.unix=ZB;B background: #d6e4ff; border-radius: 0.04rem; text-transform: capitalize; -`,G9=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>b(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>b(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>b(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>b(()=>import("./index-9d285d88.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>b(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>b(()=>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":()=>b(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>b(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>b(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>b(()=>import("./index-b1ba4736.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>b(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>b(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>b(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>b(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>b(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>b(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>b(()=>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":()=>b(()=>import("./index-d7fb28df.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>b(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>b(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>import("./index-38e8d7df.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>b(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>b(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>b(()=>import("./index-4b85dcd8.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>b(()=>import("./index-28241c38.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>b(()=>import("./index-85fa6207.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-9cbd4195.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>b(()=>import("./index-0af18c24.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>b(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>b(()=>import("./index-015cf939.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>b(()=>import("./index-962501d1.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>b(()=>import("./index-86e42443.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>b(()=>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":()=>b(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-93097ad1.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>b(()=>import("./index-866fab75.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>b(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>b(()=>import("./index-b2db3117.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>b(()=>import("./index-fe8c6311.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>b(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>b(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>b(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>b(()=>import("./index-6618c0b5.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>b(()=>import("./index-867a5cbc.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>b(()=>import("./index-2a54f9b1.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-b73b42f4.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>b(()=>import("./index-1b00c887.js"),[]),"/src/articles/blogs/2024-01-11-Open-source-Bluespec-bsc-compiler-and-reusable-example-designs/index.md":()=>b(()=>import("./index-4da057d8.js"),[]),"/src/articles/blogs/2024-01-18-Xline-v0.6.1:-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-28199dec.js"),[]),"/src/articles/blogs/2024-01-25-Agile-Digital-Chip-Design-and-Verification-with-SpinalHDL-and-Cocotb/index.md":()=>b(()=>import("./index-5238cd79.js"),[]),"/src/articles/blogs/2024-02-01-Xline-Jepsen-test-analysis/index.md":()=>b(()=>import("./index-c0527a8b.js"),[]),"/src/articles/blogs/2024-03-07-Membership-Change-Source-Code-Interpretation/index.md":()=>b(()=>import("./index-836388b4.js"),[]),"/src/articles/blogs/2024-03-21-Early-Explorations-and-Practices-of-Xline-a-Stateful-Application-Managed-by-Karmada/index.md":()=>b(()=>import("./index-557885ec.js"),[])}),Bw=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>b(()=>import("./index-3a32ad00.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>b(()=>import("./index-17fcbde5.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>b(()=>import("./index-5968a39d.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>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":()=>b(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>b(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>b(()=>import("./index-7df3558a.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>b(()=>import("./index-4b956329.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>b(()=>import("./index-4bc11ad1.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>b(()=>import("./index-1179d885.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>b(()=>import("./index-602219d3.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>b(()=>import("./index-ffd93bc8.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>b(()=>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":()=>b(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>b(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>b(()=>import("./index-2a0835cc.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":()=>b(()=>import("./index-16f06676.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>b(()=>import("./index-89698b14.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>b(()=>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":()=>b(()=>import("./index-a154d453.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>b(()=>import("./index-1409afbf.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>b(()=>import("./index-8cb22688.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>b(()=>import("./index-6bc730f7.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>b(()=>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":()=>b(()=>import("./index-d543ad74.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>b(()=>import("./index-50ad21f0.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>b(()=>import("./index-cc4e4968.js"),[]),"/src/articles/events/2024-02-22-Recruitment-can't-stop-Dartan-Technology-2024-internship-positions-waiting-for-you/index.md":()=>b(()=>import("./index-db271263.js"),[]),"/src/articles/events/2024-02-29-A-Challenge-Letter-from-DatenLord-on-GSoC-2024/index.md":()=>b(()=>import("./index-d4dfb508.js"),[])}),K9=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels:-RDMA's-Rust-safety-practices/index.md":()=>b(()=>import("./index-37f93c7b.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord:-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>b(()=>import("./index-2645d3b0.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>b(()=>import("./index-7cf6760e.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>import("./index-eb1ecfd7.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>b(()=>import("./index-f6182a9f.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>b(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>b(()=>import("./index-4ada4a0c.js"),[]),"/src/articles/highlights/2023-12-21-Highlights:-2023-SpinalHDL-Application-Prospect-Exploration-Workshop/index.md":()=>b(()=>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":()=>b(()=>import("./index-fbe14e17.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>b(()=>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:L9,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:_,description:k,author:C,editor:D,location:j,cover:y,tags:w}=d;return l.jsxs(Y9,{children:[y&&l.jsx(H9,{src:y&&h[0]}),l.jsxs(V9,{children:[l.jsx(F9,{children:B(g).format("YYYY.M.D")}),l.jsx(U9,{onClick:()=>{e(`${g}-${v.split(" ").join("-")}`)},children:_}),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:["发表于",j]}),w&&l.jsxs(l.Fragment,{children:[l.jsx(Kh,{}),w.map(S=>l.jsx(W9,{children:S},S))]})]})]})]},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,_)=>h(v.target.id)-h(_.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` +`,G9=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>b(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>b(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>b(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>b(()=>import("./index-9d285d88.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>b(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>b(()=>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":()=>b(()=>import("./index-4820dca7.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>b(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>b(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>b(()=>import("./index-29c0b7ce.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>b(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>b(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>b(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>b(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>b(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>b(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>b(()=>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":()=>b(()=>import("./index-6a884c2a.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>b(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>b(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>import("./index-38e8d7df.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>b(()=>import("./index-be0587a7.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>b(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>b(()=>import("./index-4b85dcd8.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>b(()=>import("./index-6f8e9292.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>b(()=>import("./index-1dde53bb.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-6f20c5b7.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>b(()=>import("./index-f819e53e.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>b(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>b(()=>import("./index-500d1a02.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>b(()=>import("./index-87f0525d.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>b(()=>import("./index-86e42443.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>b(()=>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":()=>b(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-93097ad1.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>b(()=>import("./index-8bf3af0a.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>b(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>b(()=>import("./index-40aedb60.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>b(()=>import("./index-bccae718.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>b(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>b(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>b(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>b(()=>import("./index-a5e56ae7.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>b(()=>import("./index-012cd7f5.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>b(()=>import("./index-8a16857f.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-b73b42f4.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>b(()=>import("./index-1b00c887.js"),[]),"/src/articles/blogs/2024-01-11-Open-source-Bluespec-bsc-compiler-and-reusable-example-designs/index.md":()=>b(()=>import("./index-4da057d8.js"),[]),"/src/articles/blogs/2024-01-18-Xline-v0.6.1:-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-067c93db.js"),[]),"/src/articles/blogs/2024-01-25-Agile-Digital-Chip-Design-and-Verification-with-SpinalHDL-and-Cocotb/index.md":()=>b(()=>import("./index-0f5b2c4d.js"),[]),"/src/articles/blogs/2024-02-01-Xline-Jepsen-test-analysis/index.md":()=>b(()=>import("./index-c0527a8b.js"),[]),"/src/articles/blogs/2024-03-07-Membership-Change-Source-Code-Interpretation/index.md":()=>b(()=>import("./index-836388b4.js"),[]),"/src/articles/blogs/2024-03-21-Early-Explorations-and-Practices-of-Xline-a-Stateful-Application-Managed-by-Karmada/index.md":()=>b(()=>import("./index-8cb7e806.js"),[]),"/src/articles/blogs/2024-04-11-RDMA-Driver-Exploration-Series-for-Linux-1/index.md":()=>b(()=>import("./index-f7c1c3db.js"),[]),"/src/articles/blogs/2024-04-18-A-short-summary-of-the-implementation-of-interval-trees-in-Xline/index.md":()=>b(()=>import("./index-9e270336.js"),[])}),Bw=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>b(()=>import("./index-043be87f.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>b(()=>import("./index-5e43e574.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>b(()=>import("./index-da95a700.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>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":()=>b(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>b(()=>import("./index-1e46583f.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>b(()=>import("./index-7df3558a.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>b(()=>import("./index-e197de7f.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>b(()=>import("./index-4bc11ad1.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>b(()=>import("./index-1179d885.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>b(()=>import("./index-1f0dff83.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>b(()=>import("./index-ffd93bc8.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>b(()=>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":()=>b(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>b(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>b(()=>import("./index-917f23ec.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":()=>b(()=>import("./index-16f06676.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>b(()=>import("./index-b9ee750d.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>b(()=>import("./index-71801d47.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":()=>b(()=>import("./index-a154d453.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>b(()=>import("./index-31f22a4e.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>b(()=>import("./index-8cb22688.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>b(()=>import("./index-69ce89cf.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>b(()=>import("./index-25c20c62.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":()=>b(()=>import("./index-7e0a1d2c.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>b(()=>import("./index-b5bb516b.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>b(()=>import("./index-cc4e4968.js"),[]),"/src/articles/events/2024-02-22-Recruitment-can't-stop-Dartan-Technology-2024-internship-positions-waiting-for-you/index.md":()=>b(()=>import("./index-db271263.js"),[]),"/src/articles/events/2024-02-29-A-Challenge-Letter-from-DatenLord-on-GSoC-2024/index.md":()=>b(()=>import("./index-a59ad30d.js"),[]),"/src/articles/events/2024-04-04-Come-and-get-your-own-mind-blowing-offer-from-Dartan-Technologies/index.md":()=>b(()=>import("./index-d70f9808.js"),[])}),K9=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels:-RDMA's-Rust-safety-practices/index.md":()=>b(()=>import("./index-f5cc00ea.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord:-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>b(()=>import("./index-8f0491cb.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>b(()=>import("./index-213034fe.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>import("./index-78a34e98.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>b(()=>import("./index-af83501f.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>b(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>b(()=>import("./index-4ada4a0c.js"),[]),"/src/articles/highlights/2023-12-21-Highlights:-2023-SpinalHDL-Application-Prospect-Exploration-Workshop/index.md":()=>b(()=>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":()=>b(()=>import("./index-f533d09f.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>b(()=>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:_,description:k,author:C,editor:D,location:j,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:_}),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:["发表于",j]}),w&&l.jsxs(l.Fragment,{children:[l.jsx(Kh,{}),w.map(S=>l.jsx(W9,{children:S},S))]})]})]})]},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,_)=>h(v.target.id)-h(_.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; @@ -2345,10 +2345,10 @@ B.version="2.29.4";LF(Ke);B.fn=U;B.min=S$;B.max=b$;B.now=k$;B.utc=kn;B.unix=ZB;B 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":()=>b(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>b(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>b(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>b(()=>import("./index-9d285d88.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>b(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>b(()=>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":()=>b(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>b(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>b(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>b(()=>import("./index-b1ba4736.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>b(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>b(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>b(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>b(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>b(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>b(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>b(()=>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":()=>b(()=>import("./index-d7fb28df.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>b(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>b(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>import("./index-38e8d7df.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>b(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>b(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>b(()=>import("./index-4b85dcd8.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>b(()=>import("./index-28241c38.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>b(()=>import("./index-85fa6207.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-9cbd4195.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>b(()=>import("./index-0af18c24.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>b(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>b(()=>import("./index-015cf939.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>b(()=>import("./index-962501d1.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>b(()=>import("./index-86e42443.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>b(()=>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":()=>b(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-93097ad1.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>b(()=>import("./index-866fab75.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>b(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>b(()=>import("./index-b2db3117.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>b(()=>import("./index-fe8c6311.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>b(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>b(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>b(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>b(()=>import("./index-6618c0b5.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>b(()=>import("./index-867a5cbc.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>b(()=>import("./index-2a54f9b1.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-b73b42f4.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>b(()=>import("./index-1b00c887.js"),[]),"/src/articles/blogs/2024-01-11-Open-source-Bluespec-bsc-compiler-and-reusable-example-designs/index.md":()=>b(()=>import("./index-4da057d8.js"),[]),"/src/articles/blogs/2024-01-18-Xline-v0.6.1:-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-28199dec.js"),[]),"/src/articles/blogs/2024-01-25-Agile-Digital-Chip-Design-and-Verification-with-SpinalHDL-and-Cocotb/index.md":()=>b(()=>import("./index-5238cd79.js"),[]),"/src/articles/blogs/2024-02-01-Xline-Jepsen-test-analysis/index.md":()=>b(()=>import("./index-c0527a8b.js"),[]),"/src/articles/blogs/2024-03-07-Membership-Change-Source-Code-Interpretation/index.md":()=>b(()=>import("./index-836388b4.js"),[]),"/src/articles/blogs/2024-03-21-Early-Explorations-and-Practices-of-Xline-a-Stateful-Application-Managed-by-Karmada/index.md":()=>b(()=>import("./index-557885ec.js"),[])}),aW=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>b(()=>import("./index-3a32ad00.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>b(()=>import("./index-17fcbde5.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>b(()=>import("./index-5968a39d.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>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":()=>b(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>b(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>b(()=>import("./index-7df3558a.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>b(()=>import("./index-4b956329.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>b(()=>import("./index-4bc11ad1.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>b(()=>import("./index-1179d885.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>b(()=>import("./index-602219d3.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>b(()=>import("./index-ffd93bc8.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>b(()=>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":()=>b(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>b(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>b(()=>import("./index-2a0835cc.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":()=>b(()=>import("./index-16f06676.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>b(()=>import("./index-89698b14.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>b(()=>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":()=>b(()=>import("./index-a154d453.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>b(()=>import("./index-1409afbf.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>b(()=>import("./index-8cb22688.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>b(()=>import("./index-6bc730f7.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>b(()=>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":()=>b(()=>import("./index-d543ad74.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>b(()=>import("./index-50ad21f0.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>b(()=>import("./index-cc4e4968.js"),[]),"/src/articles/events/2024-02-22-Recruitment-can't-stop-Dartan-Technology-2024-internship-positions-waiting-for-you/index.md":()=>b(()=>import("./index-db271263.js"),[]),"/src/articles/events/2024-02-29-A-Challenge-Letter-from-DatenLord-on-GSoC-2024/index.md":()=>b(()=>import("./index-d4dfb508.js"),[])}),lW=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels:-RDMA's-Rust-safety-practices/index.md":()=>b(()=>import("./index-37f93c7b.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord:-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>b(()=>import("./index-2645d3b0.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>b(()=>import("./index-7cf6760e.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>import("./index-eb1ecfd7.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>b(()=>import("./index-f6182a9f.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>b(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>b(()=>import("./index-4ada4a0c.js"),[]),"/src/articles/highlights/2023-12-21-Highlights:-2023-SpinalHDL-Application-Prospect-Exploration-Workshop/index.md":()=>b(()=>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":()=>b(()=>import("./index-fbe14e17.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>b(()=>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 _(s,u){var m=[],p,x=s.length;for(p=0;p>>0,p;for(p=0;p0)for(m=0;mb(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>b(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>b(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>b(()=>import("./index-9d285d88.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>b(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>b(()=>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":()=>b(()=>import("./index-4820dca7.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>b(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>b(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>b(()=>import("./index-29c0b7ce.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>b(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>b(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>b(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>b(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>b(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>b(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>b(()=>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":()=>b(()=>import("./index-6a884c2a.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>b(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>b(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>import("./index-38e8d7df.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>b(()=>import("./index-be0587a7.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>b(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>b(()=>import("./index-4b85dcd8.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>b(()=>import("./index-6f8e9292.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>b(()=>import("./index-1dde53bb.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-6f20c5b7.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>b(()=>import("./index-f819e53e.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>b(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>b(()=>import("./index-500d1a02.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>b(()=>import("./index-87f0525d.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>b(()=>import("./index-86e42443.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>b(()=>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":()=>b(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-93097ad1.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>b(()=>import("./index-8bf3af0a.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>b(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>b(()=>import("./index-40aedb60.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>b(()=>import("./index-bccae718.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>b(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>b(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>b(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>b(()=>import("./index-a5e56ae7.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>b(()=>import("./index-012cd7f5.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>b(()=>import("./index-8a16857f.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-b73b42f4.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>b(()=>import("./index-1b00c887.js"),[]),"/src/articles/blogs/2024-01-11-Open-source-Bluespec-bsc-compiler-and-reusable-example-designs/index.md":()=>b(()=>import("./index-4da057d8.js"),[]),"/src/articles/blogs/2024-01-18-Xline-v0.6.1:-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-067c93db.js"),[]),"/src/articles/blogs/2024-01-25-Agile-Digital-Chip-Design-and-Verification-with-SpinalHDL-and-Cocotb/index.md":()=>b(()=>import("./index-0f5b2c4d.js"),[]),"/src/articles/blogs/2024-02-01-Xline-Jepsen-test-analysis/index.md":()=>b(()=>import("./index-c0527a8b.js"),[]),"/src/articles/blogs/2024-03-07-Membership-Change-Source-Code-Interpretation/index.md":()=>b(()=>import("./index-836388b4.js"),[]),"/src/articles/blogs/2024-03-21-Early-Explorations-and-Practices-of-Xline-a-Stateful-Application-Managed-by-Karmada/index.md":()=>b(()=>import("./index-8cb7e806.js"),[]),"/src/articles/blogs/2024-04-11-RDMA-Driver-Exploration-Series-for-Linux-1/index.md":()=>b(()=>import("./index-f7c1c3db.js"),[]),"/src/articles/blogs/2024-04-18-A-short-summary-of-the-implementation-of-interval-trees-in-Xline/index.md":()=>b(()=>import("./index-9e270336.js"),[])}),aW=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>b(()=>import("./index-043be87f.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>b(()=>import("./index-5e43e574.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>b(()=>import("./index-da95a700.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>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":()=>b(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>b(()=>import("./index-1e46583f.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>b(()=>import("./index-7df3558a.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>b(()=>import("./index-e197de7f.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>b(()=>import("./index-4bc11ad1.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>b(()=>import("./index-1179d885.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>b(()=>import("./index-1f0dff83.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>b(()=>import("./index-ffd93bc8.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>b(()=>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":()=>b(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>b(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>b(()=>import("./index-917f23ec.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":()=>b(()=>import("./index-16f06676.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>b(()=>import("./index-b9ee750d.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>b(()=>import("./index-71801d47.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":()=>b(()=>import("./index-a154d453.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>b(()=>import("./index-31f22a4e.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>b(()=>import("./index-8cb22688.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>b(()=>import("./index-69ce89cf.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>b(()=>import("./index-25c20c62.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":()=>b(()=>import("./index-7e0a1d2c.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>b(()=>import("./index-b5bb516b.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>b(()=>import("./index-cc4e4968.js"),[]),"/src/articles/events/2024-02-22-Recruitment-can't-stop-Dartan-Technology-2024-internship-positions-waiting-for-you/index.md":()=>b(()=>import("./index-db271263.js"),[]),"/src/articles/events/2024-02-29-A-Challenge-Letter-from-DatenLord-on-GSoC-2024/index.md":()=>b(()=>import("./index-a59ad30d.js"),[]),"/src/articles/events/2024-04-04-Come-and-get-your-own-mind-blowing-offer-from-Dartan-Technologies/index.md":()=>b(()=>import("./index-d70f9808.js"),[])}),lW=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels:-RDMA's-Rust-safety-practices/index.md":()=>b(()=>import("./index-f5cc00ea.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord:-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>b(()=>import("./index-8f0491cb.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>b(()=>import("./index-213034fe.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>import("./index-78a34e98.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>b(()=>import("./index-af83501f.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>b(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>b(()=>import("./index-4ada4a0c.js"),[]),"/src/articles/highlights/2023-12-21-Highlights:-2023-SpinalHDL-Application-Prospect-Exploration-Workshop/index.md":()=>b(()=>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":()=>b(()=>import("./index-f533d09f.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>b(()=>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 _(s,u){var m=[],p,x=s.length;for(p=0;p>>0,p;for(p=0;p0)for(m=0;m=0;return(A?m?"+":"":"-")+Math.pow(10,Math.max(0,x)).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 x=p;typeof p=="string"&&(x=function(){return this[p]()}),s&&(Fe[s]=x),u&&(Fe[u[0]]=function(){return Q(x.apply(this,arguments),u[1],u[2])}),m&&(Fe[m]=function(){return this.localeData().ordinal(x.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 Vl(s,u,m,p){var x=this._relativeTime[m];return G(x)?x(s,u,m,p):x.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 jt(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=jt(p),m&&(u[m]=s[p]));return u}var ea={};function pt(s,u){ea[s]=u}function xf(s){var u=[],m;for(m in s)c(s,m)&&u.push({unit:m,priority:ea[m]});return u.sort(function(p,x){return p.priority-x.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 M(s,u){return function(m){return m!=null?(H(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 H(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=jt(s),G(this[s])?this[s]():this}function re(s,u){if(typeof s=="object"){s=di(s);var m=xf(s),p,x=m.length;for(p=0;p68?1900:2e3)};var xv=M("FullYear",!0);function cC(){return To(this.year())}function uC(s,u,m,p,x,A,L){var oe;return s<100&&s>=0?(oe=new Date(s+400,u,m,p,x,A,L),isFinite(oe.getFullYear())&&oe.setFullYear(s)):oe=new Date(s,u,m,p,x,A,L),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,x=(7+na(s,0,p).getUTCDay()-u)%7;return-x+p-1}function _v(s,u,m,p,x){var A=(7+m-p)%7,L=Bl(s,p,x),oe=1+7*(u-1)+A+L,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),x=Math.floor((s.dayOfYear()-p-1)/7)+1,A,L;return x<1?(L=s.year()-1,A=x+On(L,u,m)):x>On(s.year(),u,m)?(A=x-On(s.year(),u,m),L=s.year()+1):(L=s.year(),A=x),{week:A,year:L}}function On(s,u,m){var p=Bl(s,u,m),x=Bl(s+1,u,m);return(ra(s)-p+x)/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 x=m._locale.weekdaysParse(s,p,m._strict);x!=null?u.d=x:j(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 _f(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("_"),xC="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),_C=En,SC=En,bC=En;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?_f(m,this._week.dow):s?m[s.day()]:m}function CC(s){return s===!0?_f(this._weekdaysShort,this._week.dow):s?this._weekdaysShort[s.day()]:this._weekdaysShort}function DC(s){return s===!0?_f(this._weekdaysMin,this._week.dow):s?this._weekdaysMin[s.day()]:this._weekdaysMin}function jC(s,u,m){var p,x,A,L=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"?(x=ut.call(this._weekdaysParse,L),x!==-1?x:null):u==="ddd"?(x=ut.call(this._shortWeekdaysParse,L),x!==-1?x:null):(x=ut.call(this._minWeekdaysParse,L),x!==-1?x:null):u==="dddd"?(x=ut.call(this._weekdaysParse,L),x!==-1||(x=ut.call(this._shortWeekdaysParse,L),x!==-1)?x:(x=ut.call(this._minWeekdaysParse,L),x!==-1?x:null)):u==="ddd"?(x=ut.call(this._shortWeekdaysParse,L),x!==-1||(x=ut.call(this._weekdaysParse,L),x!==-1)?x:(x=ut.call(this._minWeekdaysParse,L),x!==-1?x:null)):(x=ut.call(this._minWeekdaysParse,L),x!==-1||(x=ut.call(this._weekdaysParse,L),x!==-1)?x:(x=ut.call(this._shortWeekdaysParse,L),x!==-1?x:null))}function EC(s,u,m){var p,x,A;if(this._weekdaysParseExact)return jC.call(this,s,u,m);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),p=0;p<7;p++){if(x=C([2e3,1]).day(p),m&&!this._fullWeekdaysParse[p]&&(this._fullWeekdaysParse[p]=new RegExp("^"+this.weekdays(x,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[p]=new RegExp("^"+this.weekdaysShort(x,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[p]=new RegExp("^"+this.weekdaysMin(x,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[p]||(A="^"+this.weekdays(x,"")+"|^"+this.weekdaysShort(x,"")+"|^"+this.weekdaysMin(x,""),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=_C),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 MC(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=[],x=[],A,L,oe,ve,Ye;for(A=0;A<7;A++)L=C([2e3,1]).day(A),oe=gt(this.weekdaysMin(L,"")),ve=gt(this.weekdaysShort(L,"")),Ye=gt(this.weekdays(L,"")),u.push(oe),m.push(ve),p.push(Ye),x.push(oe),x.push(ve),x.push(Ye);u.sort(s),m.sort(s),p.sort(s),x.sort(s),this._weekdaysRegex=new RegExp("^("+x.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 LC(){return this.hours()||24}K("H",["HH",2],0,"hour"),K("h",["hh",2],0,bf),K("k",["kk",2],0,LC),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",xt),X("hmmss",ct),X("Hmm",xt),X("Hmmss",ct),me(["H","HH"],_t),me(["k","kk"],function(s,u,m){var p=ge(s);u[_t]=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[_t]=ge(s),j(m).bigHour=!0}),me("hmm",function(s,u,m){var p=s.length-2;u[_t]=ge(s.substr(0,p)),u[Vr]=ge(s.substr(p)),j(m).bigHour=!0}),me("hmmss",function(s,u,m){var p=s.length-4,x=s.length-2;u[_t]=ge(s.substr(0,p)),u[Vr]=ge(s.substr(p,2)),u[Rn]=ge(s.substr(x)),j(m).bigHour=!0}),me("Hmm",function(s,u,m){var p=s.length-2;u[_t]=ge(s.substr(0,p)),u[Vr]=ge(s.substr(p))}),me("Hmmss",function(s,u,m){var p=s.length-4,x=s.length-2;u[_t]=ge(s.substr(0,p)),u[Vr]=ge(s.substr(p,2)),u[Rn]=ge(s.substr(x))});function IC(s){return(s+"").toLowerCase().charAt(0)==="p"}var NC=/[ap]\.?m?\.?/i,zC=M("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:xC,weekdaysShort:Sv,meridiemParse:NC},Qe={},oa={},sa;function HC(s,u){var m,p=Math.min(s.length,u.length);for(m=0;m0;){if(x=Wl(A.slice(0,m).join("-")),x)return x;if(p&&p.length>=m&&HC(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(Ee(p,u)),oa[s]&&oa[s].forEach(function(x){kf(x.name,x.config)}),hi(s),Qe[s]}else return delete Qe[s],null}function UC(s,u){if(u!=null){var m,p,x=Cv;Qe[s]!=null&&Qe[s].parentLocale!=null?Qe[s].set(Ee(Qe[s]._config,u)):(p=Wl(s),p!=null&&(x=p._config),u=Ee(x,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 VC(s)}function $C(){return mt(Qe)}function Cf(s){var u,m=s._a;return m&&j(s).overflow===-2&&(u=m[Tn]<0||m[Tn]>11?Tn:m[an]<1||m[an]>$l(m[Et],m[Tn])?an:m[_t]<0||m[_t]>24||m[_t]===24&&(m[Vr]!==0||m[Rn]!==0||m[Qi]!==0)?_t:m[Vr]<0||m[Vr]>59?Vr:m[Rn]<0||m[Rn]>59?Rn:m[Qi]<0||m[Qi]>999?Qi:-1,j(s)._overflowDayOfYear&&(uan)&&(u=an),j(s)._overflowWeeks&&u===-1&&(u=Qk),j(s)._overflowWeekday&&u===-1&&(u=qk),j(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 jv(s){var u,m,p=s._i,x=BC.exec(p)||WC.exec(p),A,L,oe,ve,Ye=Gl.length,Xt=Df.length;if(x){for(j(s).iso=!0,u=0,m=Ye;ura(L)||s._dayOfYear===0)&&(j(s)._overflowDayOfYear=!0),m=na(L,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]=x[u];for(;u<7;u++)s._a[u]=p[u]=s._a[u]==null?u===2?1:0:s._a[u];s._a[_t]===24&&s._a[Vr]===0&&s._a[Rn]===0&&s._a[Qi]===0&&(s._nextDay=!0,s._a[_t]=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[_t]=24),s._w&&typeof s._w.d<"u"&&s._w.d!==A&&(j(s).weekdayMismatch=!0)}}function iD(s){var u,m,p,x,A,L,oe,ve,Ye;u=s._w,u.GG!=null||u.W!=null||u.E!=null?(A=1,L=4,m=Ro(u.GG,s._a[Et],ia($e(),1,4).year),p=Ro(u.W,1),x=Ro(u.E,1),(x<1||x>7)&&(ve=!0)):(A=s._locale._week.dow,L=s._locale._week.doy,Ye=ia($e(),A,L),m=Ro(u.gg,s._a[Et],Ye.year),p=Ro(u.w,Ye.week),u.d!=null?(x=u.d,(x<0||x>6)&&(ve=!0)):u.e!=null?(x=u.e+A,(u.e<0||u.e>6)&&(ve=!0)):x=A),p<1||p>On(m,A,L)?j(s)._overflowWeeks=!0:ve!=null?j(s)._overflowWeekday=!0:(oe=_v(m,p,x,A,L),s._a[Et]=oe.year,s._dayOfYear=oe.dayOfYear)}n.ISO_8601=function(){},n.RFC_2822=function(){};function Ef(s){if(s._f===n.ISO_8601){jv(s);return}if(s._f===n.RFC_2822){Ev(s);return}s._a=[],j(s).empty=!0;var u=""+s._i,m,p,x,A,L,oe=u.length,ve=0,Ye,Xt;for(x=Hr(s._f,s._locale).match(ue)||[],Xt=x.length,m=0;m0&&j(s).unusedInput.push(L),u=u.slice(u.indexOf(p)+p.length),ve+=p.length),Fe[A]?(p?j(s).empty=!1:j(s).unusedTokens.push(A),Ul(A,p,s)):s._strict&&!p&&j(s).unusedTokens.push(A);j(s).charsLeftOver=oe-ve,u.length>0&&j(s).unusedInput.push(u),s._a[_t]<=12&&j(s).bigHour===!0&&s._a[_t]>0&&(j(s).bigHour=void 0),j(s).parsedDateParts=s._a.slice(0),j(s).meridiem=s._meridiem,s._a[_t]=oD(s._locale,s._a[_t],s._meridiem),Ye=j(s).era,Ye!==null&&(s._a[Et]=s._locale.erasConvertYear(Ye,s._a[Et])),jf(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,x,A,L,oe=!1,ve=s._f.length;if(ve===0){j(s).invalidFormat=!0,s._d=new Date(NaN);return}for(x=0;xthis?this:s:S()});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 jD(){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 ED(){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,x,A,L;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))?(x=p[1]==="-"?-1:1,m={y:0,d:ge(p[an])*x,h:ge(p[_t])*x,m:ge(p[Vr])*x,s:ge(p[Rn])*x,ms:ge(Af(p[Qi]*1e3))*x}):(p=RD.exec(s))?(x=p[1]==="-"?-1:1,m={y:qi(p[2],x),M:qi(p[3],x),w:qi(p[4],x),d:qi(p[5],x),h:qi(p[6],x),m:qi(p[7],x),s:qi(p[8],x)}):m==null?m={}:typeof m=="object"&&("from"in m||"to"in m)&&(L=OD($e(m.from),$e(m.to)),m={},m.ms=L.milliseconds,m.M=L.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 Mv(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=Mv(s,u):(m=Mv(u,s),m.milliseconds=-m.milliseconds,m.months=-m.months),m):{milliseconds:0,months:0}}function Lv(s,u){return function(m,p){var x,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),x=Fr(m,p),Iv(this,x,s),this}}function Iv(s,u,m,p){var x=u._milliseconds,A=Af(u._days),L=Af(u._months);s.isValid()&&(p=p??!0,L&&vv(s,N(s,"Month")+L*m),A&&H(s,"Date",N(s,"Date")+A*m),x&&s._d.setTime(s._d.valueOf()+x*m),p&&n.updateOffset(s,A||L))}var PD=Lv(1,"add"),MD=Lv(-1,"subtract");function Nv(s){return typeof s=="string"||s instanceof String}function LD(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"],x,A,L=p.length;for(x=0;xm.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,x,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",x="-MM-DD[T]HH:mm:ss.SSS",A=u+'[")]',this.format(m+p+x+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 ej(s){return this.from($e(),s)}function tj(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 rj(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 Hv(){return this._locale}var ql=1e3,Oo=60*ql,Zl=60*Oo,Vv=(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)-Vv:new Date(s,u,m).valueOf()}function Uv(s,u,m){return s<100&&s>=0?Date.UTC(s+400,u,m)-Vv:Date.UTC(s,u,m)}function nj(s){var u,m;if(s=jt(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 ij(s){var u,m;if(s=jt(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 oj(){return this._d.valueOf()-(this._offset||0)*6e4}function sj(){return Math.floor(this.valueOf()/1e3)}function aj(){return new Date(this.valueOf())}function lj(){var s=this;return[s.year(),s.month(),s.date(),s.hour(),s.minute(),s.second(),s.millisecond()]}function cj(){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 uj(){return this.isValid()?this.toISOString():null}function dj(){return w(this)}function fj(){return k({},j(this))}function hj(){return j(this).overflow}function mj(){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",Cj),X("NNNNN",Dj),me(["N","NN","NNN","NNNN","NNNNN"],function(s,u,m,p){var x=m._locale.erasParse(s,p,m._strict);x?j(m).era=x:j(m).invalidEra=s}),X("y",on),X("yy",on),X("yyy",on),X("yyyy",on),X("yo",jj),me(["y","yy","yyy","yyyy"],Et),me(["yo"],function(s,u,m,p){var x;m._locale._eraYearOrdinalRegex&&(x=s.match(m._locale._eraYearOrdinalRegex)),m._locale.eraYearOrdinalParse?u[Et]=m._locale.eraYearOrdinalParse(s,x):u[Et]=parseInt(s,10)});function pj(s,u){var m,p,x,A=this._eras||Pn("en")._eras;for(m=0,p=A.length;m=0)return A[p]}function vj(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 yj(){var s,u,m,p=this.localeData().eras();for(s=0,u=p.length;sA&&(u=A),Mj.call(this,s,u,m,p,x))}function Mj(s,u,m,p,x){var A=_v(s,u,m,p,x),L=na(A.year,0,A.dayOfYear);return this.year(L.getUTCFullYear()),this.month(L.getUTCMonth()),this.date(L.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 Lj(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=M("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 Ij(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"],Vr);var Nj=M("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 zj=M("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 Yj(s,u){u[Qi]=ge(("0."+s)*1e3)}for(mi="S";mi.length<=9;mi+="S")me(mi,Yj);Wv=M("Milliseconds",!1),K("z",0,0,"zoneAbbr"),K("zz",0,0,"zoneName");function Hj(){return this._isUTC?"UTC":""}function Vj(){return this._isUTC?"Coordinated Universal Time":""}var F=P.prototype;F.add=PD,F.calendar=HD,F.clone=VD,F.diff=KD,F.endOf=ij,F.format=ZD,F.from=JD,F.fromNow=ej,F.to=tj,F.toNow=rj,F.get=J,F.invalidAt=hj,F.isAfter=FD,F.isBefore=UD,F.isBetween=$D,F.isSame=BD,F.isSameOrAfter=WD,F.isSameOrBefore=GD,F.isValid=dj,F.lang=Yv,F.locale=zv,F.localeData=Hv,F.max=dD,F.min=uD,F.parsingFlags=fj,F.set=re,F.startOf=nj,F.subtract=MD,F.toArray=lj,F.toObject=cj,F.toDate=aj,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=uj,F.toString=XD,F.unix=sj,F.valueOf=oj,F.creationData=mj,F.eraName=yj,F.eraNarrow=wj,F.eraAbbr=xj,F.eraYear=_j,F.year=xv,F.isLeapYear=cC,F.weekYear=Ej,F.isoWeekYear=Aj,F.quarter=F.quarters=Lj,F.month=yv,F.daysInMonth=sC,F.week=F.weeks=pC,F.isoWeek=F.isoWeeks=gC,F.weeksInYear=Oj,F.weeksInWeekYear=Pj,F.isoWeeksInYear=Tj,F.isoWeeksInISOWeekYear=Rj,F.date=Bv,F.day=F.days=AC,F.weekday=TC,F.isoWeekday=RC,F.dayOfYear=Ij,F.hour=F.hours=zC,F.minute=F.minutes=Nj,F.second=F.seconds=zj,F.millisecond=F.milliseconds=Wv,F.utcOffset=xD,F.utc=SD,F.local=bD,F.parseZone=kD,F.hasAlignedHourOffset=CD,F.isDST=DD,F.isLocal=ED,F.isUtcOffset=AD,F.isUtc=Pv,F.isUTC=Pv,F.zoneAbbr=Hj,F.zoneName=Vj,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",xv),F.zone=Y("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",_D),F.isDSTShifted=Y("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",jD);function Fj(s){return $e(s*1e3)}function Uj(){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=Vl,Ae.pastFuture=Fl,Ae.set=lt,Ae.eras=pj,Ae.erasParse=gj,Ae.erasConvertYear=vj,Ae.erasAbbrRegex=bj,Ae.erasNameRegex=Sj,Ae.erasNarrowRegex=kj,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=EC,Ae.weekdaysRegex=OC,Ae.weekdaysShortRegex=PC,Ae.weekdaysMinRegex=MC,Ae.isPM=IC,Ae.meridiem=YC;function ec(s,u,m,p){var x=Pn(),A=C().set(p,u);return x[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,x=[];for(p=0;p<12;p++)x[p]=ec(s,p,m,"month");return x}function Lf(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 x=Pn(),A=s?x._week.dow:0,L,oe=[];if(m!=null)return ec(u,(m+A)%7,p,"day");for(L=0;L<7;L++)oe[L]=ec(u,(L+A)%7,p,"day");return oe}function $j(s,u){return Kv(s,u,"months")}function Bj(s,u){return Kv(s,u,"monthsShort")}function Wj(s,u,m){return Lf(s,u,m,"weekdays")}function Gj(s,u,m){return Lf(s,u,m,"weekdaysShort")}function Kj(s,u,m){return Lf(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 Mn=Math.abs;function Xj(){var s=this._data;return this._milliseconds=Mn(this._milliseconds),this._days=Mn(this._days),this._months=Mn(this._months),s.milliseconds=Mn(s.milliseconds),s.seconds=Mn(s.seconds),s.minutes=Mn(s.minutes),s.hours=Mn(s.hours),s.months=Mn(s.months),s.years=Mn(s.years),this}function Xv(s,u,m,p){var x=Fr(u,m);return s._milliseconds+=p*x._milliseconds,s._days+=p*x._days,s._months+=p*x._months,s._bubble()}function Qj(s,u){return Xv(this,s,u,1)}function qj(s,u){return Xv(this,s,u,-1)}function Qv(s){return s<0?Math.floor(s):Math.ceil(s)}function Zj(){var s=this._milliseconds,u=this._days,m=this._months,p=this._data,x,A,L,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,x=Kt(s/1e3),p.seconds=x%60,A=Kt(x/60),p.minutes=A%60,L=Kt(A/60),p.hours=L%24,u+=Kt(L/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 Jj(s){if(!this.isValid())return NaN;var u,m,p=this._milliseconds;if(s=jt(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 eE(){return this.isValid()?this._milliseconds+this._days*864e5+this._months%12*2592e6+ge(this._months/12)*31536e6:NaN}function Ln(s){return function(){return this.as(s)}}var tE=Ln("ms"),rE=Ln("s"),nE=Ln("m"),iE=Ln("h"),oE=Ln("d"),sE=Ln("w"),aE=Ln("M"),lE=Ln("Q"),cE=Ln("y");function uE(){return Fr(this)}function dE(s){return s=jt(s),this.isValid()?this[s+"s"]():NaN}function Zi(s){return function(){return this.isValid()?this._data[s]:NaN}}var fE=Zi("milliseconds"),hE=Zi("seconds"),mE=Zi("minutes"),pE=Zi("hours"),gE=Zi("days"),vE=Zi("months"),yE=Zi("years");function wE(){return Kt(this.days()/7)}var In=Math.round,Mo={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function xE(s,u,m,p,x){return x.relativeTime(u||1,!!m,s,p)}function _E(s,u,m,p){var x=Fr(s).abs(),A=In(x.as("s")),L=In(x.as("m")),oe=In(x.as("h")),ve=In(x.as("d")),Ye=In(x.as("M")),Xt=In(x.as("w")),Nn=In(x.as("y")),pi=A<=m.ss&&["s",A]||A0,pi[4]=p,xE.apply(null,pi)}function SE(s){return s===void 0?In:typeof s=="function"?(In=s,!0):!1}function bE(s,u){return Mo[s]===void 0?!1:u===void 0?Mo[s]:(Mo[s]=u,s==="s"&&(Mo.ss=u-1),!0)}function kE(s,u){if(!this.isValid())return this.localeData().invalidDate();var m=!1,p=Mo,x,A;return typeof s=="object"&&(u=s,s=!1),typeof s=="boolean"&&(m=s),typeof u=="object"&&(p=Object.assign({},Mo,u),u.s!=null&&u.ss==null&&(p.ss=u.s-1)),x=this.localeData(),A=_E(this,!m,p,x),m&&(A=x.pastFuture(+this,A)),x.postformat(A)}var Nf=Math.abs;function Lo(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,x,A,L,oe=this.asSeconds(),ve,Ye,Xt,Nn;return oe?(p=Kt(s/60),x=Kt(p/60),s%=60,p%=60,A=Kt(m/12),m%=12,L=s?s.toFixed(3).replace(/\.?0+$/,""):"",ve=oe<0?"-":"",Ye=Lo(this._months)!==Lo(oe)?"-":"",Xt=Lo(this._days)!==Lo(oe)?"-":"",Nn=Lo(this._milliseconds)!==Lo(oe)?"-":"",ve+"P"+(A?Ye+A+"Y":"")+(m?Ye+m+"M":"")+(u?Xt+u+"D":"")+(x||p||s?"T":"")+(x?Nn+x+"H":"")+(p?Nn+p+"M":"")+(s?Nn+L+"S":"")):"P0D"}var Ce=Kl.prototype;Ce.isValid=gD,Ce.abs=Xj,Ce.add=Qj,Ce.subtract=qj,Ce.as=Jj,Ce.asMilliseconds=tE,Ce.asSeconds=rE,Ce.asMinutes=nE,Ce.asHours=iE,Ce.asDays=oE,Ce.asWeeks=sE,Ce.asMonths=aE,Ce.asQuarters=lE,Ce.asYears=cE,Ce.valueOf=eE,Ce._bubble=Zj,Ce.clone=uE,Ce.get=dE,Ce.milliseconds=fE,Ce.seconds=hE,Ce.minutes=mE,Ce.hours=pE,Ce.days=gE,Ce.weeks=wE,Ce.months=vE,Ce.years=yE,Ce.humanize=kE,Ce.toISOString=tc,Ce.toString=tc,Ce.toJSON=tc,Ce.locale=zv,Ce.localeData=Hv,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 +`+new Error().stack),m=!1}return u.apply(this,arguments)},u)}var ee={};function te(s,u){n.deprecationHandler!=null&&n.deprecationHandler(s,u),ee[s]||(z(u),ee[s]=!0)}n.suppressDeprecationWarnings=!1,n.deprecationHandler=null;function G(s){return typeof Function<"u"&&s instanceof Function||Object.prototype.toString.call(s)==="[object Function]"}function lt(s){var u,m;for(m in s)c(s,m)&&(u=s[m],G(u)?this[m]=u:this["_"+m]=u);this._config=s,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)}function Ee(s,u){var m=k({},s),p;for(p in u)c(u,p)&&(a(s[p])&&a(u[p])?(m[p]={},k(m[p],s[p]),k(m[p],u[p])):u[p]!=null?m[p]=u[p]:delete m[p]);for(p in s)c(s,p)&&!c(u,p)&&a(s[p])&&(m[p]=k({},m[p]));return m}function ze(s){s!=null&&this.set(s)}var mt;Object.keys?mt=Object.keys:mt=function(s){var u,m=[];for(u in s)c(s,u)&&m.push(u);return m};var $={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"};function le(s,u,m){var p=this._calendar[s]||this._calendar.sameElse;return G(p)?p.call(u,m):p}function Q(s,u,m){var p=""+Math.abs(s),x=u-p.length,A=s>=0;return(A?m?"+":"":"-")+Math.pow(10,Math.max(0,x)).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 x=p;typeof p=="string"&&(x=function(){return this[p]()}),s&&(Fe[s]=x),u&&(Fe[u[0]]=function(){return Q(x.apply(this,arguments),u[1],u[2])}),m&&(Fe[m]=function(){return this.localeData().ordinal(x.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 x=this._relativeTime[m];return G(x)?x(s,u,m,p):x.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 jt(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=jt(p),m&&(u[m]=s[p]));return u}var ea={};function pt(s,u){ea[s]=u}function xf(s){var u=[],m;for(m in s)c(s,m)&&u.push({unit:m,priority:ea[m]});return u.sort(function(p,x){return p.priority-x.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=jt(s),G(this[s])?this[s]():this}function re(s,u){if(typeof s=="object"){s=di(s);var m=xf(s),p,x=m.length;for(p=0;p68?1900:2e3)};var xv=L("FullYear",!0);function cC(){return To(this.year())}function uC(s,u,m,p,x,A,M){var oe;return s<100&&s>=0?(oe=new Date(s+400,u,m,p,x,A,M),isFinite(oe.getFullYear())&&oe.setFullYear(s)):oe=new Date(s,u,m,p,x,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,x=(7+na(s,0,p).getUTCDay()-u)%7;return-x+p-1}function _v(s,u,m,p,x){var A=(7+m-p)%7,M=Bl(s,p,x),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),x=Math.floor((s.dayOfYear()-p-1)/7)+1,A,M;return x<1?(M=s.year()-1,A=x+On(M,u,m)):x>On(s.year(),u,m)?(A=x-On(s.year(),u,m),M=s.year()+1):(M=s.year(),A=x),{week:A,year:M}}function On(s,u,m){var p=Bl(s,u,m),x=Bl(s+1,u,m);return(ra(s)-p+x)/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 x=m._locale.weekdaysParse(s,p,m._strict);x!=null?u.d=x:j(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 _f(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("_"),xC="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),_C=En,SC=En,bC=En;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?_f(m,this._week.dow):s?m[s.day()]:m}function CC(s){return s===!0?_f(this._weekdaysShort,this._week.dow):s?this._weekdaysShort[s.day()]:this._weekdaysShort}function DC(s){return s===!0?_f(this._weekdaysMin,this._week.dow):s?this._weekdaysMin[s.day()]:this._weekdaysMin}function jC(s,u,m){var p,x,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"?(x=ut.call(this._weekdaysParse,M),x!==-1?x:null):u==="ddd"?(x=ut.call(this._shortWeekdaysParse,M),x!==-1?x:null):(x=ut.call(this._minWeekdaysParse,M),x!==-1?x:null):u==="dddd"?(x=ut.call(this._weekdaysParse,M),x!==-1||(x=ut.call(this._shortWeekdaysParse,M),x!==-1)?x:(x=ut.call(this._minWeekdaysParse,M),x!==-1?x:null)):u==="ddd"?(x=ut.call(this._shortWeekdaysParse,M),x!==-1||(x=ut.call(this._weekdaysParse,M),x!==-1)?x:(x=ut.call(this._minWeekdaysParse,M),x!==-1?x:null)):(x=ut.call(this._minWeekdaysParse,M),x!==-1||(x=ut.call(this._weekdaysParse,M),x!==-1)?x:(x=ut.call(this._shortWeekdaysParse,M),x!==-1?x:null))}function EC(s,u,m){var p,x,A;if(this._weekdaysParseExact)return jC.call(this,s,u,m);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),p=0;p<7;p++){if(x=C([2e3,1]).day(p),m&&!this._fullWeekdaysParse[p]&&(this._fullWeekdaysParse[p]=new RegExp("^"+this.weekdays(x,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[p]=new RegExp("^"+this.weekdaysShort(x,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[p]=new RegExp("^"+this.weekdaysMin(x,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[p]||(A="^"+this.weekdays(x,"")+"|^"+this.weekdaysShort(x,"")+"|^"+this.weekdaysMin(x,""),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=_C),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=[],x=[],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),x.push(oe),x.push(ve),x.push(Ye);u.sort(s),m.sort(s),p.sort(s),x.sort(s),this._weekdaysRegex=new RegExp("^("+x.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",xt),X("hmmss",ct),X("Hmm",xt),X("Hmmss",ct),me(["H","HH"],_t),me(["k","kk"],function(s,u,m){var p=ge(s);u[_t]=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[_t]=ge(s),j(m).bigHour=!0}),me("hmm",function(s,u,m){var p=s.length-2;u[_t]=ge(s.substr(0,p)),u[Hr]=ge(s.substr(p)),j(m).bigHour=!0}),me("hmmss",function(s,u,m){var p=s.length-4,x=s.length-2;u[_t]=ge(s.substr(0,p)),u[Hr]=ge(s.substr(p,2)),u[Rn]=ge(s.substr(x)),j(m).bigHour=!0}),me("Hmm",function(s,u,m){var p=s.length-2;u[_t]=ge(s.substr(0,p)),u[Hr]=ge(s.substr(p))}),me("Hmmss",function(s,u,m){var p=s.length-4,x=s.length-2;u[_t]=ge(s.substr(0,p)),u[Hr]=ge(s.substr(p,2)),u[Rn]=ge(s.substr(x))});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:xC,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(x=Wl(A.slice(0,m).join("-")),x)return x;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(Ee(p,u)),oa[s]&&oa[s].forEach(function(x){kf(x.name,x.config)}),hi(s),Qe[s]}else return delete Qe[s],null}function UC(s,u){if(u!=null){var m,p,x=Cv;Qe[s]!=null&&Qe[s].parentLocale!=null?Qe[s].set(Ee(Qe[s]._config,u)):(p=Wl(s),p!=null&&(x=p._config),u=Ee(x,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&&j(s).overflow===-2&&(u=m[Tn]<0||m[Tn]>11?Tn:m[an]<1||m[an]>$l(m[Et],m[Tn])?an:m[_t]<0||m[_t]>24||m[_t]===24&&(m[Hr]!==0||m[Rn]!==0||m[Qi]!==0)?_t:m[Hr]<0||m[Hr]>59?Hr:m[Rn]<0||m[Rn]>59?Rn:m[Qi]<0||m[Qi]>999?Qi:-1,j(s)._overflowDayOfYear&&(uan)&&(u=an),j(s)._overflowWeeks&&u===-1&&(u=Qk),j(s)._overflowWeekday&&u===-1&&(u=qk),j(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 jv(s){var u,m,p=s._i,x=BC.exec(p)||WC.exec(p),A,M,oe,ve,Ye=Gl.length,Xt=Df.length;if(x){for(j(s).iso=!0,u=0,m=Ye;ura(M)||s._dayOfYear===0)&&(j(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]=x[u];for(;u<7;u++)s._a[u]=p[u]=s._a[u]==null?u===2?1:0:s._a[u];s._a[_t]===24&&s._a[Hr]===0&&s._a[Rn]===0&&s._a[Qi]===0&&(s._nextDay=!0,s._a[_t]=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[_t]=24),s._w&&typeof s._w.d<"u"&&s._w.d!==A&&(j(s).weekdayMismatch=!0)}}function iD(s){var u,m,p,x,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[Et],ia($e(),1,4).year),p=Ro(u.W,1),x=Ro(u.E,1),(x<1||x>7)&&(ve=!0)):(A=s._locale._week.dow,M=s._locale._week.doy,Ye=ia($e(),A,M),m=Ro(u.gg,s._a[Et],Ye.year),p=Ro(u.w,Ye.week),u.d!=null?(x=u.d,(x<0||x>6)&&(ve=!0)):u.e!=null?(x=u.e+A,(u.e<0||u.e>6)&&(ve=!0)):x=A),p<1||p>On(m,A,M)?j(s)._overflowWeeks=!0:ve!=null?j(s)._overflowWeekday=!0:(oe=_v(m,p,x,A,M),s._a[Et]=oe.year,s._dayOfYear=oe.dayOfYear)}n.ISO_8601=function(){},n.RFC_2822=function(){};function Ef(s){if(s._f===n.ISO_8601){jv(s);return}if(s._f===n.RFC_2822){Ev(s);return}s._a=[],j(s).empty=!0;var u=""+s._i,m,p,x,A,M,oe=u.length,ve=0,Ye,Xt;for(x=Vr(s._f,s._locale).match(ue)||[],Xt=x.length,m=0;m0&&j(s).unusedInput.push(M),u=u.slice(u.indexOf(p)+p.length),ve+=p.length),Fe[A]?(p?j(s).empty=!1:j(s).unusedTokens.push(A),Ul(A,p,s)):s._strict&&!p&&j(s).unusedTokens.push(A);j(s).charsLeftOver=oe-ve,u.length>0&&j(s).unusedInput.push(u),s._a[_t]<=12&&j(s).bigHour===!0&&s._a[_t]>0&&(j(s).bigHour=void 0),j(s).parsedDateParts=s._a.slice(0),j(s).meridiem=s._meridiem,s._a[_t]=oD(s._locale,s._a[_t],s._meridiem),Ye=j(s).era,Ye!==null&&(s._a[Et]=s._locale.erasConvertYear(Ye,s._a[Et])),jf(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,x,A,M,oe=!1,ve=s._f.length;if(ve===0){j(s).invalidFormat=!0,s._d=new Date(NaN);return}for(x=0;xthis?this:s:S()});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 jD(){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 ED(){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,x,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))?(x=p[1]==="-"?-1:1,m={y:0,d:ge(p[an])*x,h:ge(p[_t])*x,m:ge(p[Hr])*x,s:ge(p[Rn])*x,ms:ge(Af(p[Qi]*1e3))*x}):(p=RD.exec(s))?(x=p[1]==="-"?-1:1,m={y:qi(p[2],x),M:qi(p[3],x),w:qi(p[4],x),d:qi(p[5],x),h:qi(p[6],x),m:qi(p[7],x),s:qi(p[8],x)}):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 x,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),x=Fr(m,p),Iv(this,x,s),this}}function Iv(s,u,m,p){var x=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),x&&s._d.setTime(s._d.valueOf()+x*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"],x,A,M=p.length;for(x=0;xm.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,x,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",x="-MM-DD[T]HH:mm:ss.SSS",A=u+'[")]',this.format(m+p+x+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 ej(s){return this.from($e(),s)}function tj(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 rj(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 nj(s){var u,m;if(s=jt(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 ij(s){var u,m;if(s=jt(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 oj(){return this._d.valueOf()-(this._offset||0)*6e4}function sj(){return Math.floor(this.valueOf()/1e3)}function aj(){return new Date(this.valueOf())}function lj(){var s=this;return[s.year(),s.month(),s.date(),s.hour(),s.minute(),s.second(),s.millisecond()]}function cj(){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 uj(){return this.isValid()?this.toISOString():null}function dj(){return w(this)}function fj(){return k({},j(this))}function hj(){return j(this).overflow}function mj(){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",Cj),X("NNNNN",Dj),me(["N","NN","NNN","NNNN","NNNNN"],function(s,u,m,p){var x=m._locale.erasParse(s,p,m._strict);x?j(m).era=x:j(m).invalidEra=s}),X("y",on),X("yy",on),X("yyy",on),X("yyyy",on),X("yo",jj),me(["y","yy","yyy","yyyy"],Et),me(["yo"],function(s,u,m,p){var x;m._locale._eraYearOrdinalRegex&&(x=s.match(m._locale._eraYearOrdinalRegex)),m._locale.eraYearOrdinalParse?u[Et]=m._locale.eraYearOrdinalParse(s,x):u[Et]=parseInt(s,10)});function pj(s,u){var m,p,x,A=this._eras||Pn("en")._eras;for(m=0,p=A.length;m=0)return A[p]}function vj(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 yj(){var s,u,m,p=this.localeData().eras();for(s=0,u=p.length;sA&&(u=A),Lj.call(this,s,u,m,p,x))}function Lj(s,u,m,p,x){var A=_v(s,u,m,p,x),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 Mj(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 Ij(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 Nj=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 zj=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 Yj(s,u){u[Qi]=ge(("0."+s)*1e3)}for(mi="S";mi.length<=9;mi+="S")me(mi,Yj);Wv=L("Milliseconds",!1),K("z",0,0,"zoneAbbr"),K("zz",0,0,"zoneName");function Vj(){return this._isUTC?"UTC":""}function Hj(){return this._isUTC?"Coordinated Universal Time":""}var F=P.prototype;F.add=PD,F.calendar=VD,F.clone=HD,F.diff=KD,F.endOf=ij,F.format=ZD,F.from=JD,F.fromNow=ej,F.to=tj,F.toNow=rj,F.get=J,F.invalidAt=hj,F.isAfter=FD,F.isBefore=UD,F.isBetween=$D,F.isSame=BD,F.isSameOrAfter=WD,F.isSameOrBefore=GD,F.isValid=dj,F.lang=Yv,F.locale=zv,F.localeData=Vv,F.max=dD,F.min=uD,F.parsingFlags=fj,F.set=re,F.startOf=nj,F.subtract=LD,F.toArray=lj,F.toObject=cj,F.toDate=aj,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=uj,F.toString=XD,F.unix=sj,F.valueOf=oj,F.creationData=mj,F.eraName=yj,F.eraNarrow=wj,F.eraAbbr=xj,F.eraYear=_j,F.year=xv,F.isLeapYear=cC,F.weekYear=Ej,F.isoWeekYear=Aj,F.quarter=F.quarters=Mj,F.month=yv,F.daysInMonth=sC,F.week=F.weeks=pC,F.isoWeek=F.isoWeeks=gC,F.weeksInYear=Oj,F.weeksInWeekYear=Pj,F.isoWeeksInYear=Tj,F.isoWeeksInISOWeekYear=Rj,F.date=Bv,F.day=F.days=AC,F.weekday=TC,F.isoWeekday=RC,F.dayOfYear=Ij,F.hour=F.hours=zC,F.minute=F.minutes=Nj,F.second=F.seconds=zj,F.millisecond=F.milliseconds=Wv,F.utcOffset=xD,F.utc=SD,F.local=bD,F.parseZone=kD,F.hasAlignedHourOffset=CD,F.isDST=DD,F.isLocal=ED,F.isUtcOffset=AD,F.isUtc=Pv,F.isUTC=Pv,F.zoneAbbr=Vj,F.zoneName=Hj,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",xv),F.zone=Y("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",_D),F.isDSTShifted=Y("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",jD);function Fj(s){return $e(s*1e3)}function Uj(){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=pj,Ae.erasParse=gj,Ae.erasConvertYear=vj,Ae.erasAbbrRegex=bj,Ae.erasNameRegex=Sj,Ae.erasNarrowRegex=kj,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=EC,Ae.weekdaysRegex=OC,Ae.weekdaysShortRegex=PC,Ae.weekdaysMinRegex=LC,Ae.isPM=IC,Ae.meridiem=YC;function ec(s,u,m,p){var x=Pn(),A=C().set(p,u);return x[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,x=[];for(p=0;p<12;p++)x[p]=ec(s,p,m,"month");return x}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 x=Pn(),A=s?x._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 $j(s,u){return Kv(s,u,"months")}function Bj(s,u){return Kv(s,u,"monthsShort")}function Wj(s,u,m){return Mf(s,u,m,"weekdays")}function Gj(s,u,m){return Mf(s,u,m,"weekdaysShort")}function Kj(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 Xj(){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 x=Fr(u,m);return s._milliseconds+=p*x._milliseconds,s._days+=p*x._days,s._months+=p*x._months,s._bubble()}function Qj(s,u){return Xv(this,s,u,1)}function qj(s,u){return Xv(this,s,u,-1)}function Qv(s){return s<0?Math.floor(s):Math.ceil(s)}function Zj(){var s=this._milliseconds,u=this._days,m=this._months,p=this._data,x,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,x=Kt(s/1e3),p.seconds=x%60,A=Kt(x/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 Jj(s){if(!this.isValid())return NaN;var u,m,p=this._milliseconds;if(s=jt(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 eE(){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 tE=Mn("ms"),rE=Mn("s"),nE=Mn("m"),iE=Mn("h"),oE=Mn("d"),sE=Mn("w"),aE=Mn("M"),lE=Mn("Q"),cE=Mn("y");function uE(){return Fr(this)}function dE(s){return s=jt(s),this.isValid()?this[s+"s"]():NaN}function Zi(s){return function(){return this.isValid()?this._data[s]:NaN}}var fE=Zi("milliseconds"),hE=Zi("seconds"),mE=Zi("minutes"),pE=Zi("hours"),gE=Zi("days"),vE=Zi("months"),yE=Zi("years");function wE(){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 xE(s,u,m,p,x){return x.relativeTime(u||1,!!m,s,p)}function _E(s,u,m,p){var x=Fr(s).abs(),A=In(x.as("s")),M=In(x.as("m")),oe=In(x.as("h")),ve=In(x.as("d")),Ye=In(x.as("M")),Xt=In(x.as("w")),Nn=In(x.as("y")),pi=A<=m.ss&&["s",A]||A0,pi[4]=p,xE.apply(null,pi)}function SE(s){return s===void 0?In:typeof s=="function"?(In=s,!0):!1}function bE(s,u){return Lo[s]===void 0?!1:u===void 0?Lo[s]:(Lo[s]=u,s==="s"&&(Lo.ss=u-1),!0)}function kE(s,u){if(!this.isValid())return this.localeData().invalidDate();var m=!1,p=Lo,x,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)),x=this.localeData(),A=_E(this,!m,p,x),m&&(A=x.pastFuture(+this,A)),x.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,x,A,M,oe=this.asSeconds(),ve,Ye,Xt,Nn;return oe?(p=Kt(s/60),x=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":"")+(x||p||s?"T":"")+(x?Nn+x+"H":"")+(p?Nn+p+"M":"")+(s?Nn+M+"S":"")):"P0D"}var Ce=Kl.prototype;Ce.isValid=gD,Ce.abs=Xj,Ce.add=Qj,Ce.subtract=qj,Ce.as=Jj,Ce.asMilliseconds=tE,Ce.asSeconds=rE,Ce.asMinutes=nE,Ce.asHours=iE,Ce.asDays=oE,Ce.asWeeks=sE,Ce.asMonths=aE,Ce.asQuarters=lE,Ce.asYears=cE,Ce.valueOf=eE,Ce._bubble=Zj,Ce.clone=uE,Ce.get=dE,Ce.milliseconds=fE,Ce.seconds=hE,Ce.minutes=mE,Ce.hours=pE,Ce.days=gE,Ce.weeks=wE,Ce.months=vE,Ce.years=yE,Ce.humanize=kE,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=Fj,n.months=$j,n.isDate=v,n.locale=hi,n.invalid=S,n.duration=Fr,n.isMoment=O,n.weekdays=Wj,n.parseZone=Uj,n.localeData=Pn,n.isDuration=Xl,n.monthsShort=Bj,n.weekdaysMin=Kj,n.defineLocale=kf,n.updateLocale=UC,n.locales=$C,n.weekdaysShort=Gj,n.normalizeUnits=jt,n.relativeTimeRounding=SE,n.relativeTimeThreshold=bE,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",jk="/zh-cn/assets/location-cf5a6f84.svg",Ek="/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; @@ -2473,10 +2473,10 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ height: min-content; width: 0.625rem; margin-right: 0.22rem; -`,MW=f.div` +`,LW=f.div` flex-grow: 1; position: relative; -`,LW=f(gW)` +`,MW=f(gW)` color: #7767a0; `,IW=f(vW)` margin-bottom: 0.07rem; @@ -2513,7 +2513,7 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ padding-bottom: 0.24rem; `,YW=f.ol` padding-left: 0.24rem; -`,HW=f(Ao)``,VW=f(Ao)` +`,VW=f(Ao)``,HW=f(Ao)` color: #7680dd; `,FW=f.div` width: 96%; @@ -2534,7 +2534,7 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ &: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(xW,{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(_W,{children:l.jsx(RW,{children:t.map(o=>{const{id:a,label:c,tag:d,workNature:h,workType:g,releaseTime:v,content:_}=o;return l.jsxs(OW,{onClick:()=>{e(a.split(" ").join("-"))},children:[l.jsx(PW,{src:Dk}),l.jsxs(MW,{children:[l.jsx(LW,{children:d.join(", ")}),l.jsx(FW,{children:l.jsx(IW,{children:c})}),l.jsxs(NW,{children:[l.jsx(Qh,{icon:jk,children:h}),l.jsx(Xh,{children:"·"}),l.jsx(Qh,{icon:Ek,children:UW.get(g)}),l.jsx(Xh,{children:"·"}),l.jsx(Xh,{children:"·"}),l.jsx(Qh,{icon:Ak,children:B(v,"YYYY-MM-DD").fromNow()})]}),_.map(({title:k,body:C})=>l.jsxs(zW,{children:[l.jsx(VW,{as:"p",children:k}),l.jsx(YW,{children:C.map(D=>l.jsx(HW,{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(jW,{children:"info@datenlord.com"})}),l.jsx("div",{style:{height:"0.24rem"}}),l.jsx(Kw,{children:"- 添加达坦科技小助手微信:"}),l.jsx(EW,{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:Mk}=WW,ZW=f.div` +`,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(xW,{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(_W,{children:l.jsx(RW,{children:t.map(o=>{const{id:a,label:c,tag:d,workNature:h,workType:g,releaseTime:v,content:_}=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:jk,children:h}),l.jsx(Xh,{children:"·"}),l.jsx(Qh,{icon:Ek,children:UW.get(g)}),l.jsx(Xh,{children:"·"}),l.jsx(Xh,{children:"·"}),l.jsx(Qh,{icon:Ak,children:B(v,"YYYY-MM-DD").fromNow()})]}),_.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(jW,{children:"info@datenlord.com"})}),l.jsx("div",{style:{height:"0.24rem"}}),l.jsx(Kw,{children:"- 添加达坦科技小助手微信:"}),l.jsx(EW,{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; @@ -2559,7 +2559,7 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ margin-left: 0; margin-bottom: 0.32rem; } -`,Lk=f.section` +`,Mk=f.section` padding: 0.16rem; margin-bottom: 0.12rem; min-height: 100px; @@ -2568,7 +2568,7 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ :last-child { margin-bottom: 0; } -`,rG=f(Lk)` +`,rG=f(Mk)` position: sticky; top: calc(84px + 48px); left: 0; @@ -2686,9 +2686,9 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ } `,i2=f.ol` padding-left: 0.24rem; -`,pG=f(Xs)``,gG=f(Mk)``,vG=f(Xs)` +`,pG=f(Xs)``,gG=f(Lk)``,vG=f(Xs)` color: #7680dd; -`,yG=f(Mk)``,wG=f.button` +`,yG=f(Lk)``,wG=f.button` padding-inline: 0.18rem; color: ${e=>e.theme.gray007}; font-size: 0.14rem; @@ -2720,7 +2720,7 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ `,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:jk,children:c}),l.jsx(qh,{children:"·"}),l.jsx(Zh,{icon:Ek,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:_})=>l.jsxs(n2,{children:[l.jsx(vG,{as:"p",children:v}),l.jsx(i2,{children:_.map(k=>l.jsx(pG,{as:"li",children:k},k))})]},v))]})]},i):null})}),l.jsxs(xG,{children:[l.jsx(_G,{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(Lk,{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})]})]})]})})},jG="/zh-cn/assets/cover-ab5b198b.png",EG="/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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",MG="/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=",LG="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",HG="/zh-cn/assets/foot-reg-qr-03a7d7e1.png",VG="/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` +`,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:jk,children:c}),l.jsx(qh,{children:"·"}),l.jsx(Zh,{icon:Ek,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:_})=>l.jsxs(n2,{children:[l.jsx(vG,{as:"p",children:v}),l.jsx(i2,{children:_.map(k=>l.jsx(pG,{as:"li",children:k},k))})]},v))]})]},i):null})}),l.jsxs(xG,{children:[l.jsx(_G,{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})]})]})]})})},jG="/zh-cn/assets/cover-ab5b198b.png",EG="/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; @@ -2755,7 +2755,7 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ width: 0.2rem; `,Yl=f.div` position: relative; -`,Hl=f.div` +`,Vl=f.div` /* min-height: 6.4rem; */ display: flex; flex-direction: column; @@ -2769,7 +2769,7 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ `,wf=f.div` font-size: 0.4rem; font-weight: 600; -`,ZG=f(Yl)``,JG=f(Hl)` +`,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; @@ -2806,7 +2806,7 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ #f9fcff 47.11%, #edf6fc 102.52% ); -`,aK=f(Hl)` +`,aK=f(Vl)` min-height: 6.4rem; padding-block: 0.7rem 1.49rem; `,lK=f(yf)` @@ -2954,7 +2954,7 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ background: #7680dd; `,CK=f(Yl)` background: linear-gradient(180deg, #f9fffe 4.64%, #fff 168.71%); -`,DK=f(Hl)` +`,DK=f(Vl)` padding-block: 0.7rem 1.45rem; `,jK=f(yf)``,EK=f(wf)``,AK=f.div` display: flex; @@ -2963,22 +2963,22 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ margin-top: 0.97rem; `,TK=f.img` width: 5.2021rem; -`,RK=f.div``,Ho=f.div` +`,RK=f.div``,Vo=f.div` display: flex; align-items: center; padding-bottom: 0.22rem; &:last-child { padding-bottom: 0; } -`,Vo=f.img` +`,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(Hl)` +`,PK=f(Vl)` padding-block: 0.7rem 2.06rem; -`,MK=f(yf)``,LK=f(wf)``,IK=f.div` +`,LK=f(yf)``,MK=f(wf)``,IK=f.div` display: grid; grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 1fr); @@ -2989,7 +2989,7 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ cursor: pointer; `,NK=f(Yl)` background: #fafafa; -`,zK=f(Hl)` +`,zK=f(Vl)` padding-block: 0.44rem 0.56rem; `,YK=f.div` display: grid; @@ -3006,18 +3006,18 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ color: #666; font-size: 0.16rem; line-height: 0.22rem; -`,HK=f.div` +`,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; -`,VK=f(zk)` +`,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:EG})]})]})},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(xK,{children:"序号"}),l.jsx(_K,{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(jK,{src:PG}),l.jsx(EK,{children:"项目课程亮点"}),l.jsxs(AK,{children:[l.jsx(TK,{src:MG}),l.jsxs(RK,{children:[l.jsxs(Ho,{children:[l.jsx(Vo,{src:Yo}),l.jsx(Fo,{children:"课程及实验安排由浅入深,并在最终到达相当的深度,既可作为“一生一芯”项目的补充课程,也可作为独立项目进行学习。"})]}),l.jsxs(Ho,{children:[l.jsx(Vo,{src:Yo}),l.jsx(Fo,{children:"采用Bluespec作为实验语言,具有更强的抽象表达能力,可以更高效的实现复杂功能,使得学生可以把精力更集中的放在架构设计上。"})]}),l.jsxs(Ho,{children:[l.jsx(Vo,{src:Yo}),l.jsx(Fo,{children:"注重软硬件联合开发,培养软硬通吃的复合型人才。"})]}),l.jsxs(Ho,{children:[l.jsx(Vo,{src:Yo}),l.jsx(Fo,{children:"课程时间安排紧凑,内容丰富,学生通常可以通过2~3个月的业余时间即可自学完成所有实验。"})]}),l.jsxs(Ho,{children:[l.jsx(Vo,{src:Yo}),l.jsx(Fo,{children:"主要课程资料均为英文,有助于锻炼国外文献阅读能力。"})]}),l.jsxs(Ho,{children:[l.jsx(Vo,{src:Yo}),l.jsx(Fo,{children:"全开源、社区化"})]})]})]})]})}),KK=()=>l.jsx(OK,{id:"supply",children:l.jsxs(PK,{children:[l.jsx(MK,{src:LG}),l.jsx(LK,{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(HK,{children:[l.jsx(a2,{src:HG}),l.jsx(a2,{src:VG})]}),l.jsxs(VK,{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` +`,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:EG})]})]})},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(xK,{children:"序号"}),l.jsx(_K,{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(jK,{src:PG}),l.jsx(EK,{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; @@ -3102,4 +3102,4 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ 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(eM,{}),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(_w,{})},{path:"solutions/:sectionId",element:l.jsx(_w,{})},{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(Mc,{})},{path:"oss-showcase",element:l.jsx(Mc,{})},{path:"rust-showcase",element:l.jsx(Mc,{})},{path:"hardware-acceleration",element:l.jsx(Mc,{})},{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 _s(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 Hk(e,t,r){var n=Qs(e);n===2?e.set(t,r):n===3?e.add(r):e[t]=r}function Vk(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 _l}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===_l&&(_l=e.l)}function u2(e){return _l={p:[],l:_l,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&&!_s(t.R,n)?o.concat(n):void 0);if(Hk(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 xm(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 _m(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,_=g.proxy;return c.k=_,c.j=v,_}(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||Hk(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&&!_s(a,g))return!0;var _=c[g],k=_&&_[Je];if(k?k.t!==v:!Vk(_,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),S=1;S1?g-1:0),_=1;_=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}(),_r=new wX,$k=_r.produce;_r.produceWithPatches.bind(_r);_r.setAutoFreeze.bind(_r);_r.setUseProxies.bind(_r);_r.applyPatches.bind(_r);_r.createDraft.bind(_r);_r.finishDraft.bind(_r);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 xX(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 _X(e){var t=xX(e,"string");return bl(t)==="symbol"?t:String(t)}function SX(e,t,r){return t=_X(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 j=!0;return h(),c.push(D),function(){if(j){if(d)throw new Error(Ft(6));j=!1,h();var w=c.indexOf(D);c.splice(w,1),a=null}}}function _(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 j=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]=j,g=g||j!==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(); +`,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(_w,{})},{path:"solutions/:sectionId",element:l.jsx(_w,{})},{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 _s(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 _l}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===_l&&(_l=e.l)}function u2(e){return _l={p:[],l:_l,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&&!_s(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 xm(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 _m(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,_=g.proxy;return c.k=_,c.j=v,_}(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&&!_s(a,g))return!0;var _=c[g],k=_&&_[Je];if(k?k.t!==v:!Hk(_,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),S=1;S1?g-1:0),_=1;_=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}(),_r=new wX,$k=_r.produce;_r.produceWithPatches.bind(_r);_r.setAutoFreeze.bind(_r);_r.setUseProxies.bind(_r);_r.applyPatches.bind(_r);_r.createDraft.bind(_r);_r.finishDraft.bind(_r);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 xX(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 _X(e){var t=xX(e,"string");return bl(t)==="symbol"?t:String(t)}function SX(e,t,r){return t=_X(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 j=!0;return h(),c.push(D),function(){if(j){if(d)throw new Error(Ft(6));j=!1,h();var w=c.indexOf(D);c.splice(w,1),a=null}}}function _(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 j=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]=j,g=g||j!==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-1409afbf.js b/zh-cn/assets/index-31f22a4e.js similarity index 94% rename from zh-cn/assets/index-1409afbf.js rename to zh-cn/assets/index-31f22a4e.js index 4727025..b1d4c18 100644 --- a/zh-cn/assets/index-1409afbf.js +++ b/zh-cn/assets/index-31f22a4e.js @@ -1,4 +1,4 @@ -const l="/zh-cn/assets/cover-f142cd17.jpg",e="/zh-cn/assets/image1-9d5b5029.jpg",s="/zh-cn/assets/image2-2129b7ac.jpg",t=[l,e,s],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}],p=`

      封面

      +const l="/zh-cn/assets/cover-f142cd17.jpg",e="/zh-cn/assets/image1-9d5b5029.jpg",s="/zh-cn/assets/image2-2129b7ac.jpg",t=[l,e,s],i={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"},o=[{label:"MIT 课程学习社区的源",level:2},{label:"MIT 课程学习新手上路宣讲",level:2},{label:"入门宣讲的目的",level:2},{label:"入门宣讲的要点",level:2},{label:"问卷调查",level:2}],n=`

      封面

      MIT 课程学习社区的源

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

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

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

      图片

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

      -

      图片

      `;export{t as assetURLs,p as default,o as metadata,i as toc}; +

      图片

      `;export{t as assetURLs,n as default,i as metadata,o as toc}; diff --git a/zh-cn/assets/index-b2db3117.js b/zh-cn/assets/index-40aedb60.js similarity index 98% rename from zh-cn/assets/index-b2db3117.js rename to zh-cn/assets/index-40aedb60.js index e24fdd1..7811479 100644 --- a/zh-cn/assets/index-b2db3117.js +++ b/zh-cn/assets/index-40aedb60.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",m="/zh-cn/assets/image16-73064f95.png",g="/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,c,i,r,C,o,h,d,u,m,g,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}],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",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",S="/zh-cn/assets/image22-e0049342.png",E="/zh-cn/assets/image23-989a38cf.png",f=[s,a,t,e,l,p,n,c,i,r,C,o,h,d,u,g,m,R,_,b,j,S,E],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 算法映射到组合逻辑电路上,这往往会导致较长的组合逻辑延时进而降低电路的整体工作频率,无法满足高吞吐率的需求。

        @@ -64,10 +64,10 @@ const s="/zh-cn/assets/image1-85650830.png",a="/zh-cn/assets/image2-d3ac686f.png

        的查找表,其中第图片张查找表的第

        image

        个表项的值即为

        -

        image

        +

        image

        的 CRC 校验和。

        虽然有了定理 1 我们可以在一个周期内并行处理多个字节数据,但基于此还不能够完成 CRC 的硬件实现。在实际电路中数据总线的位宽是有限的,对于较长的输入数据,需要根据总线位宽将其分成多个帧并分配到多个周期进行传输。因此,我们还需要基于定理 2 累加不同周期计算得到的 CRC 校验值进而获得最终结果。在 blue-crc 的实现中,数据以大端字节序进行传输,即高位数据先传入进行处理, 假设输入数据总线位宽为 256-bit, 当前周期输入数据对应的多项式为 A(x), 该周期之前已经输入的数据为 A'(x), 每个周期我们除了计算 CRC[A(x)],还需要将该值累加到已经计算好的中间校验和 CRC[A'(x)]上,得到数据

        -

        image

        +

        image

        的校验和。根据定理 1 和 2,可以推导出累加的计算公式如下:

        image

        即需要将中间校验和 CRC[A'(x)]左移 256-bit,对其再次计算 CRC 校验值后和 CRC[A(x)]相加。同样我们可以通过硬件查找表的方式完成这里校验和的计算。

        @@ -91,7 +91,7 @@ const s="/zh-cn/assets/image1-85650830.png",a="/zh-cn/assets/image2-d3ac686f.png

        CRC 硬件电路的实际性能和资源开销与具体的配置参数有关。大部分情况下,硬件电路的吞吐率随输入总线数据位宽增大而提升,硬件资源开销则同时和总线宽度以及 CRC 校验和宽度有关。以 IEEE 802-3 协议规定的 32 位 CRC 校验和为例,其在 256 位输入总线位宽的配置下,可在 Xilinx xcvu9p FPGA 器件上达到 500MHz 的工作频率,总吞吐率达 128Gb/s,实际的硬件资源开销如下。

        image

        相较于其他硬件实现方式,blue-crc 主要关注于计算性能上的提升,因此在硬件资源上的开销相对较大。其中最主要的开销来源于用于实现 CRC 计算的查找表,其容量大小随数据总线位宽以及校验和位宽的增大而增大,具体的查找表容量的计算方式如下(设总线字节宽度为 m, CRC 校验和字节宽度为 n):

        -

        image

        +

        image

        对于上文提到的 IEEE 802-3 协议规定的 32-bit CRC 校验,在 256-bit 输入总线位宽的配置下,理论上所需的查找表容量为 36KB.

        使用指南

        本文的最后一部分将介绍 blue-crc 项目的使用指南,包括 CRC 电路的配置参数、输入输出接口、面向 BlueSpec SystemVerilog 的使用接口,以及面向 Verilog 的使用接口。

        @@ -172,7 +172,7 @@ const s="/zh-cn/assets/image1-85650830.png",a="/zh-cn/assets/image2-d3ac686f.png );

        发起 CRC 计算时原始数据需要按照大端字节序进行传输,即高位字节需要优先传输。假设 CRC 电路输入 AXI-Stream 总线数据位宽为 32-bit (4-byte), 若要传输 80-bit (10-byte)的数据,那么每一帧需要传输的内容如下图所示:

        -

        image

        +

        image

        BSV 使用接口

        blue-crc 项目基于 Bluespec SystemVerilog 硬件描述语言实现,因此对于使用 BSV 的设计者,可以直接通过实例化的方式使用 CRC 模块。详细的使用步骤如下:

          @@ -266,4 +266,4 @@ CrcAxiStream#(32, 256 https://github.com/datenlord/blue-crc

          引用和链接

          [1] Y. Sun and M. S. Kim, "A Table-Based Algorithm for Pipelined CRC Calculation," 2010 IEEE International Conference on Communications, Cape Town, South Africa, 2010, pp. 1-5, doi: 10.1109/ICC.2010.5501903.

          -

          [2] Sun Y, Kim M S. A pipelined CRC calculation using lookup tables[C]//2010 7th IEEE Consumer Communications and Networking Conference. IEEE, 2010: 1-2.

          `;export{f as assetURLs,v as default,y as metadata,x as toc}; +

          [2] Sun Y, Kim M S. A pipelined CRC calculation using lookup tables[C]//2010 7th IEEE Consumer Communications and Networking Conference. IEEE, 2010: 1-2.

          `;export{f as assetURLs,F as default,y as metadata,x as toc}; diff --git a/zh-cn/assets/index-fd018bec.js b/zh-cn/assets/index-4820dca7.js similarity index 98% rename from zh-cn/assets/index-fd018bec.js rename to zh-cn/assets/index-4820dca7.js index ac5019f..2d4fc66 100644 --- a/zh-cn/assets/index-fd018bec.js +++ b/zh-cn/assets/index-4820dca7.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"},a=[{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}],n=`

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

          RDMA 操作简介

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

          图片

          @@ -148,4 +148,4 @@ epoll::epoll_ctl(

          上面代码有个要注意的地方,因为 epoll 是用边沿触发,所以每次有新 CQE 产生时,都要调用 ibv_poll_cq 把 CQ 队列读空。考虑如下场景,同时有多个新的 CQE 产生,但是 epoll 边沿触发只通知一次,如果用户程序收到通知后没有读空 CQ,那 epoll 也不会再产生新的通知,除非再有新的 CQE 产生,epoll 才会再次通知用户程序。

          总之,本文用 epoll 机制实现 RDMA 异步读取 CQE 的例子,展示了如何实现 RDMA 的异步操作。RDMA 还有类似的操作,都可以基于 epoll 机制实现异步操作。

          对Rust和RDMA感兴趣的朋友,可以关注我们的开源项目:
          -https://github.com/datenlord/async-rdma/

          `;export{l as assetURLs,o as default,c as metadata,n as toc}; +https://github.com/datenlord/async-rdma/

          `;export{l as assetURLs,n as default,c as metadata,a as toc}; diff --git a/zh-cn/assets/index-015cf939.js b/zh-cn/assets/index-500d1a02.js similarity index 92% rename from zh-cn/assets/index-015cf939.js rename to zh-cn/assets/index-500d1a02.js index ba84f0e..27ea28e 100644 --- a/zh-cn/assets/index-015cf939.js +++ b/zh-cn/assets/index-500d1a02.js @@ -1,4 +1,4 @@ -const n="/zh-cn/assets/cover-bc86e95c.jpg",t="/zh-cn/assets/image1-d4391053.jpg",e=[n,t],r={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"},o=[{label:"【源码解读】Xline Curp 共识协议的设计与实现",level:2}],l=`

          封面

          +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=`

          封面

          传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。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,r as metadata,o as toc}; +

          图片

          `;export{e as assetURLs,l as default,o as metadata,r as toc}; diff --git a/zh-cn/assets/index-17fcbde5.js b/zh-cn/assets/index-5e43e574.js similarity index 94% rename from zh-cn/assets/index-17fcbde5.js rename to zh-cn/assets/index-5e43e574.js index 10a4eb3..54df414 100644 --- a/zh-cn/assets/index-17fcbde5.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=[],a=`

          封面

          +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,a 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-6bc730f7.js b/zh-cn/assets/index-69ce89cf.js similarity index 93% rename from zh-cn/assets/index-6bc730f7.js rename to zh-cn/assets/index-69ce89cf.js index ca56099..dc1b8d9 100644 --- a/zh-cn/assets/index-6bc730f7.js +++ b/zh-cn/assets/index-69ce89cf.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",o="/zh-cn/assets/image2-29d090cb.png",a="/zh-cn/assets/image1-50beaba8.png",n=[t,o,a],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!无需犹豫,行动起来,抓住机遇,创造奇迹!

          主题

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

          图片

          如有任何问题欢迎联系达坦科技微信小助手: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-d7fb28df.js b/zh-cn/assets/index-6a884c2a.js similarity index 99% rename from zh-cn/assets/index-d7fb28df.js rename to zh-cn/assets/index-6a884c2a.js index 33dabc4..910fa6f 100644 --- a/zh-cn/assets/index-d7fb28df.js +++ b/zh-cn/assets/index-6a884c2a.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",m="/zh-cn/assets/image16-2de227b5.png",S="/zh-cn/assets/image17-ecbf7b1e.png",F="/zh-cn/assets/image18-88f5d1b8.png",D="/zh-cn/assets/image19-5df924ff.png",R="/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,F,D,R,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}],L=`

          本文主要介绍了 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",D="/zh-cn/assets/image19-5df924ff.png",F="/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,D,F,b],u={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}],T=`

          本文主要介绍了 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 与零知识证明

          @@ -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 左右。

          @@ -262,7 +262,7 @@ const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png
          1. C 语言程序测试结果:在 Xilinx 提供的 XDMA 驱动的基础上使用 C 语言编写简单的性能测试程序。该测试程序向 FPGA 加速器写入一定数量的输入数据,并记录加速器完成所有数据哈希运算所需要的时间。基于该测试程序,我们分别测试了 Poseidon 加速器在三种长度输入数据下的性能表现。当输入数据的大小为 arity2, 即中间状态向量元素个数 时,加速器在 0.877 秒内完成了 850000 次的哈希运算,数据吞吐率可达到 29.1651MB/s, 即每秒大约能够完成 1M 次哈希运算
          -

          图片

          +

          图片

          1. Lotus-Bench 测试结果:Lotus 中提供了计算机硬件在 Filecoin 计算负载下性能表现的基准测试程序 Lotus-Bench;与自己实现的 C 语言测试程序相比,Lotus-Bench 的测试更加接近实际的工作负载,能够得到更加准确的测试结果。在 Lotus-Bench 的基础上,我们分别测试了 CPU, GPU 和 FPGA 在 preCommit 阶段(该阶段主要完成 Poseidon 哈希函数的计算)处理 512MB 数据所需要的时间。FPGA 在 Lotus-Bench 测试下的算力可达到 15.65MB/s,大约是 AMD Ryzen 5900X CPU 实现的 2 倍,但和 RTX 3070 GPU 的加速性能相比仍有很大的提升空间.
          @@ -278,4 +278,4 @@ const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png
        1. 优化加速器架构:由于需要适配 Filecoin Poseidon 计算实例中不同大小的输入数据,目前在输入较小的情况下加速器中存在一些冗余的运算单元。通过进一步优化加速器的整体架构,使得在不同长度的输入数据下,所有运算单元都能得到更好的利用,能够进一步提升整体的加速性能。

        2. -
        `;export{A as assetURLs,L as default,T as metadata,u as toc}; +`;export{A as assetURLs,T as default,u as metadata,C as toc}; diff --git a/zh-cn/assets/index-9cbd4195.js b/zh-cn/assets/index-6f20c5b7.js similarity index 95% rename from zh-cn/assets/index-9cbd4195.js rename to zh-cn/assets/index-6f20c5b7.js index 34d9912..48c76f1 100644 --- a/zh-cn/assets/index-9cbd4195.js +++ b/zh-cn/assets/index-6f20c5b7.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 l="/zh-cn/assets/cover-eeda38bf.png",e=[l],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 旨在实现高性能的数据访问和跨数据中心场景下的强一致性。

        @@ -36,4 +36,4 @@ const e="/zh-cn/assets/cover-eeda38bf.png",l=[e],i={label:"Xline v0.2.0:一个
      • Curp 相关文章:
        https://medium.com/@datenlord/curp-revisit-the-consensus-protocol-384464be1600
      • Xline 官网:www.xline.cloud
      • -
      `;export{l as assetURLs,n as default,i as metadata,t as toc}; +
    `;export{e as assetURLs,n as default,i as metadata,t as toc}; diff --git a/zh-cn/assets/index-28241c38.js b/zh-cn/assets/index-6f8e9292.js similarity index 89% rename from zh-cn/assets/index-28241c38.js rename to zh-cn/assets/index-6f8e9292.js index 8bbab4b..44f0b15 100644 --- a/zh-cn/assets/index-28241c38.js +++ b/zh-cn/assets/index-6f8e9292.js @@ -1,4 +1,4 @@ -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"},n=[],i=`

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

    +const t="/zh-cn/assets/image1-3ae2277f.jpg",e="/zh-cn/assets/image1-0a18e154.png",a=[t,e],n={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"},s=[],i=`

    在 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",a="/zh-cn/assets/image1-0a18e154.png
  • Xline 接下来的优化方向。
  • 请添加分布式实验室小助手的微信,报名参与直播:

    -

    图片

    +

    图片

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

    -

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

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

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

    `;export{a as assetURLs,i as default,n as metadata,s as toc}; diff --git a/zh-cn/assets/index-22d5e656.js b/zh-cn/assets/index-71801d47.js similarity index 96% rename from zh-cn/assets/index-22d5e656.js rename to zh-cn/assets/index-71801d47.js index 99f8163..1fe4386 100644 --- a/zh-cn/assets/index-22d5e656.js +++ b/zh-cn/assets/index-71801d47.js @@ -1,4 +1,4 @@ -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=`

    图片

    +const t="/zh-cn/assets/cover-cf0f8eeb.png",o="/zh-cn/assets/image1-6485c4dd.jpg",s=[t,o],e={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,s as metadata,n as toc}; +

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

    `;export{s as assetURLs,r as default,e as metadata,n as toc}; diff --git a/zh-cn/assets/index-eb1ecfd7.js b/zh-cn/assets/index-78a34e98.js similarity index 92% rename from zh-cn/assets/index-eb1ecfd7.js rename to zh-cn/assets/index-78a34e98.js index ab04b63..aa88b97 100644 --- a/zh-cn/assets/index-eb1ecfd7.js +++ b/zh-cn/assets/index-78a34e98.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-3674aa81.jpg",e=[t],s={label:"Rust唠嗑室:Xline跨数据中心一致性管理",description:"2022年10月15日,达坦科技和Rust语言中文社区合作,在Rust唠嗑室活动中,由达坦科技(DatenLord)联合创始人施继成做了关于开源分布式存储技术的分享,着重介绍了达坦科技新的开源项目Xline,这一跨云的metadata(元数据)KV存储的产品是如何实现高性能跨数据中心的数据一致性管理的",cover:"./cover.jpg",location:"香港",date:"2022-10-20",title:"Rust Chatterbox: Xline Cross Data Center Consistency Management"},n=[{label:"内容介绍",level:2}],a=`

    封面

    +const t="/zh-cn/assets/cover-3674aa81.jpg",e=[t],s={label:"Rust唠嗑室:Xline跨数据中心一致性管理",description:"2022年10月15日,达坦科技和Rust语言中文社区合作,在Rust唠嗑室活动中,由达坦科技(DatenLord)联合创始人施继成做了关于开源分布式存储技术的分享,着重介绍了达坦科技新的开源项目Xline,这一跨云的metadata(元数据)KV存储的产品是如何实现高性能跨数据中心的数据一致性管理的",cover:"./cover.jpg",location:"香港",date:"2022-10-20",title:"Rust Chatterbox: Xline Cross Data Center Consistency Management"},a=[{label:"内容介绍",level:2}],n=`

    封面

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

    内容介绍

    -

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

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

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

    `;export{e as assetURLs,n as default,s as metadata,a as toc}; diff --git a/zh-cn/assets/index-d543ad74.js b/zh-cn/assets/index-7e0a1d2c.js similarity index 96% rename from zh-cn/assets/index-d543ad74.js rename to zh-cn/assets/index-7e0a1d2c.js index 808ad56..ec6d1be 100644 --- a/zh-cn/assets/index-d543ad74.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",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!"},s=[{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}],n=`

    图片

    +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!无需犹豫,行动起来,抓住机遇,创造奇迹!

    @@ -53,4 +53,4 @@ const l="/zh-cn/assets/cover-b206ef91.jpg",t="/zh-cn/assets/image1-e0f43926.jpg"

    图片

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

    -

    图片

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

    图片

    `;export{o as assetURLs,r as default,i as metadata,n as toc}; diff --git a/zh-cn/assets/index-962501d1.js b/zh-cn/assets/index-87f0525d.js similarity index 98% rename from zh-cn/assets/index-962501d1.js rename to zh-cn/assets/index-87f0525d.js index 5439c9a..6ec03d7 100644 --- a/zh-cn/assets/index-962501d1.js +++ b/zh-cn/assets/index-87f0525d.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",y="/zh-cn/assets/image19-fb1e5167.png",S="/zh-cn/assets/image20-a391e7d8.jpg",_=[e,l,s,i,a,t,p,n,o,c,r,h,d,m,u,b,g,f,R,y,S],M={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"},v=[{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=`

    图片

    +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",y="/zh-cn/assets/image20-a391e7d8.jpg",_=[e,l,s,i,a,t,p,n,o,c,r,h,d,m,u,b,g,f,R,S,y],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

    @@ -346,7 +346,7 @@ Memory Consistency → 内存连贯性

    具有两套完整的读写字线和读写位线。
    All the images in this section are cited from [宇芯电子].

    DRAM

    -

    图片

    +

    图片

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


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

    -

    图片

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

    图片

    `;export{_ as assetURLs,C as default,v as metadata,M as toc}; diff --git a/zh-cn/assets/index-2a54f9b1.js b/zh-cn/assets/index-8a16857f.js similarity index 99% rename from zh-cn/assets/index-2a54f9b1.js rename to zh-cn/assets/index-8a16857f.js index 0130661..124de29 100644 --- a/zh-cn/assets/index-2a54f9b1.js +++ b/zh-cn/assets/index-8a16857f.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",d="/zh-cn/assets/7ccbe7094043e218ad241cc3c2e3c871-e3e8431a.png",i="/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,d,i,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}],b=`

    +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",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,d,i,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}],C=`

    简介

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

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

    @@ -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,b as default,P as metadata,D as toc}; +

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

    `;export{I as assetURLs,C as default,P as metadata,D as toc}; diff --git a/zh-cn/assets/index-866fab75.js b/zh-cn/assets/index-8bf3af0a.js similarity index 99% rename from zh-cn/assets/index-866fab75.js rename to zh-cn/assets/index-8bf3af0a.js index ac415ea..65c7fd8 100644 --- a/zh-cn/assets/index-866fab75.js +++ b/zh-cn/assets/index-8bf3af0a.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",i="/zh-cn/assets/image3-8a8d1c33.png",a="/zh-cn/assets/image4-c1593056.png",p=[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"},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}],o=`

    封面

    +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",p=[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"},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=`

    封面

    Xline 是什么

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

    Xline 的整体架构

    @@ -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{p as assetURLs,o as default,s as metadata,n as toc}; +

    DatenLord | Xline Geo-distributed KV Storage

    `;export{p as assetURLs,r as default,s as metadata,n as toc}; diff --git a/zh-cn/assets/index-557885ec.js b/zh-cn/assets/index-8cb7e806.js similarity index 98% rename from zh-cn/assets/index-557885ec.js rename to zh-cn/assets/index-8cb7e806.js index 9f77b17..8594766 100644 --- a/zh-cn/assets/index-557885ec.js +++ b/zh-cn/assets/index-8cb7e806.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/cover-4e3a952e.webp",a="/zh-cn/assets/image1-d5c7d3eb.webp",l="/zh-cn/assets/image2-4eebd69c.webp",r="/zh-cn/assets/image3-11daa3fe.webp",i="/zh-cn/assets/image4-30403828.webp",t="/zh-cn/assets/image5-7c696faa.webp",m="/zh-cn/assets/image6-a778303e.webp",s="/zh-cn/assets/image7-ba335a80.webp",n="/zh-cn/assets/image8-6a8e4dea.webp",o="/zh-cn/assets/image9-9202db97.webp",p=[e,a,l,r,i,t,m,s,n,o],c={label:"Karmada 管理有状态应用 Xline 的早期探索与实践",description:"目前随着云原生技术和云市场的不断成熟,越来越多的 IT 厂商开始投入到跨云多集群的怀抱当中。以下是 flexera 在 2023 年中关于云原生市场对多云多集群管理的接受程度的调查报告(info.flexera.com)",cover:"./cover.webp",location:"中国香港",author:["赵佳炜"],date:"2024-03-21",title:"Early Explorations and Practices of Xline a Stateful Application Managed by Karmada"},d=[{label:"背景与动机",level:2},{label:"Karmada 管理有状态应用存在哪些挑战?",level:2},{label:"Xline 的一些早期尝试",level:2},{label:"部署",level:3},{label:"扩缩容",level:3},{label:"滚动更新",level:3},{label:"总结",level:2},{label:"Xline 社区会议",level:2}],b=`

    封面

    +const e="/zh-cn/assets/cover-4e3a952e.webp",a="/zh-cn/assets/image1-d5c7d3eb.webp",l="/zh-cn/assets/image2-4eebd69c.webp",r="/zh-cn/assets/image3-11daa3fe.webp",i="/zh-cn/assets/image4-30403828.webp",t="/zh-cn/assets/image5-7c696faa.webp",m="/zh-cn/assets/image6-a778303e.webp",s="/zh-cn/assets/image7-ba335a80.webp",n="/zh-cn/assets/image8-6a8e4dea.webp",p="/zh-cn/assets/image9-9202db97.webp",o=[e,a,l,r,i,t,m,s,n,p],c={label:"Karmada 管理有状态应用 Xline 的早期探索与实践",description:"目前随着云原生技术和云市场的不断成熟,越来越多的 IT 厂商开始投入到跨云多集群的怀抱当中。以下是 flexera 在 2023 年中关于云原生市场对多云多集群管理的接受程度的调查报告(info.flexera.com)",cover:"./cover.webp",location:"中国香港",author:["赵佳炜"],date:"2024-03-21",title:"Early Explorations and Practices of Xline a Stateful Application Managed by Karmada"},d=[{label:"背景与动机",level:2},{label:"Karmada 管理有状态应用存在哪些挑战?",level:2},{label:"Xline 的一些早期尝试",level:2},{label:"部署",level:3},{label:"扩缩容",level:3},{label:"滚动更新",level:3},{label:"总结",level:2},{label:"Xline 社区会议",level:2}],b=`

    封面

    背景与动机

    目前随着云原生技术和云市场的不断成熟,越来越多的 IT 厂商开始投入到跨云多集群的怀抱当中。以下是 flexera 在 2023 年中关于云原生市场对多云多集群管理的接受程度的调查报告(info.flexera.com)

    图片

    @@ -68,7 +68,7 @@ const e="/zh-cn/assets/cover-4e3a952e.webp",a="/zh-cn/assets/image1-d5c7d3eb.web

    目前,由于 scale in/out 不可避免地会涉及到 membership change 的过程,而在 Karmada 下不同 member cluster 之间缺少必要的同步机制,因此,scale 的过程还是存在局限性:一次水平 scale out 只能扩容一个集群,一次垂直扩容也只能在某个指定的 member cluster 上进行。

    滚动更新

    -

    图片

    +

    图片

    对于滚动更新而言,大致的过程如上图所示:

    1. 用户修改 Karmada 上的 Xline 资源,修改其中的 xline 镜像版本
    2. @@ -89,4 +89,4 @@ const e="/zh-cn/assets/cover-4e3a952e.webp",a="/zh-cn/assets/image1-d5c7d3eb.web 会议号: 813 0547 8985
      密码: 520159
      会议链接:
      -https://zoom.us/j/81305478985?pwd=PsnbMGQy1ZqxYyd67cAkaGROfnIoQa.1

      `;export{p as assetURLs,b as default,c as metadata,d as toc}; +https://zoom.us/j/81305478985?pwd=PsnbMGQy1ZqxYyd67cAkaGROfnIoQa.1

      `;export{o as assetURLs,b as default,c as metadata,d as toc}; diff --git a/zh-cn/assets/index-2645d3b0.js b/zh-cn/assets/index-8f0491cb.js similarity index 94% rename from zh-cn/assets/index-2645d3b0.js rename to zh-cn/assets/index-8f0491cb.js index 7bb11d7..53357c4 100644 --- a/zh-cn/assets/index-2645d3b0.js +++ b/zh-cn/assets/index-8f0491cb.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"},r=[{label:"专题演讲",level:2},{label:"线上 workshop",level:2},{label:"参与我们",level:2}],e=`

      封面

      +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=`

      封面

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

      今年以来陆续发声,将达坦科技开源项目 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,e as default,o as metadata,r as toc}; +

      封面

      `;export{n as assetURLs,r as default,o as metadata,e as toc}; diff --git a/zh-cn/assets/index-2a0835cc.js b/zh-cn/assets/index-917f23ec.js similarity index 92% rename from zh-cn/assets/index-2a0835cc.js rename to zh-cn/assets/index-917f23ec.js index b5606cf..12e3bf7 100644 --- a/zh-cn/assets/index-2a0835cc.js +++ b/zh-cn/assets/index-917f23ec.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",o=[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"},r=[],e=`

      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],r={label:"SpinalHDL的使用和开发经验研讨会",description:"SpinalHDL始于2014年,最初是作为VHDL/Verilog的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注。",cover:"./cover.png",location:"中国香港",date:"2023-07-03",title:"SpinalHDL usage and development experience workshop"},o=[],e=`

      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{o as assetURLs,e as default,a as metadata,r as toc}; +

      图片

      `;export{a as assetURLs,e as default,r as metadata,o as toc}; diff --git a/zh-cn/assets/index-9e270336.js b/zh-cn/assets/index-9e270336.js new file mode 100644 index 0000000..5ebb8c4 --- /dev/null +++ b/zh-cn/assets/index-9e270336.js @@ -0,0 +1,153 @@ +const s="/zh-cn/assets/cover-ca6ff87c.webp",e="/zh-cn/assets/image1-78435096.webp",n=[s,e],l={label:"Xline中区间树实现小结",description:"在Xline最近的一次重构中, 我们发现有两个在关键路径上的数据结构Speculative Pool和Uncommitted Pool导致了性能瓶颈。这两个数据结构用于在CURP中进行冲突检测。具体来说, 由于CURP协议的要求, 对于每个处理的command, 需要在已经接收的commands中找到所有与当前command相冲突的commands。",cover:"./cover.webp",location:"中国香港",author:["尹正皓"],date:"2024-04-18",title:"A short summary of the implementation of interval trees in Xline"},a=[{label:"实现区间树的起因",level:2},{label:"区间树实现简介",level:2},{label:"插入/删除",level:3},{label:"查询重叠操作",level:3},{label:"使用 Safe Rust 实现区间树",level:2},{label:"困难点",level:3},{label:"Rc封面

      +

      实现区间树的起因

      +

      在 Xline 最近的一次重构中, 我们发现有两个在关键路径上的数据结构 Speculative Pool 和 Uncommitted Pool 导致了性能瓶颈。这两个数据结构用于在 CURP 中进行冲突检测。具体来说, 由于 CURP 协议的要求, 对于每个处理的 command, 需要在已经接收的 commands 中找到所有与当前 command 相冲突的 commands。

      +

      例如对于 KV 操作 put/get_range/delete_range, 我们需要考虑这些操作之间可能的冲突情况。由于每个 KV 操作都会有一个 key 的范围, 所以问题就转化为要查询某一个 key 范围和某个 Pool 中所有 key 范围的集合是否有相交。采用朴素遍历整个集合的方法会导致每次查询的时间复杂度为 O(n),从而降低效率并导致性能瓶颈。

      +

      为了解决这一问题, 我们需要引入区间树这一数据结构。区间树能够高效支持重叠区间的插入,删除和查询操作, 这三种操作都可以在 O(log(n)) 的时间内完成。因此, 我们可以利用区间树维护 key 范围的集合, 从而解决性能瓶颈的问题。

      +

      区间树实现简介

      +

      Xline 中的区间树是基于 Introduction to Algorithms (3rd ed.) 实现的, 它是由二叉平衡树扩展而来。

      +

      区间树以一颗二叉平衡树为基础(例如使用红黑树实现), 将区间本身作为平衡树的 key。对于区间 [low, high] , 我们首先按照 low 值进行排序, 如果 low 值相同, 再按照 high 值进行排序, 这样对区间集合能够定义一个全序的关系(如果不处理重复区间则不需要对 high 排序)。同时, 对于平衡树的每一个节点, 我们在这个节点上记录以这个节点为根的子树中 high 的最大值, 记为 max 。

      +

      插入/删除

      +

      与红黑树的插入/删除相同, 最坏时间复杂度为 O(log(n))

      +

      查询重叠操作

      +

      给出一个区间 i , 我们需要查询当前树中是否有区间和 i 重合。在 Introduction to Algorithms 中给出的伪代码如下

      +

      图片

      +

      有了 max 的定义, 解决这个问题的思路就非常简单了: 对于以 x 为根的子树 T_x , 如果 i 不和 x_i 相交, 那么 i 一定是在 x_i 的左侧或者右侧。

      +
        +
      1. 如果 i 在 x_i 的左侧这时可以直接排除右子树, 因为这时 i.high 比 x_i.low 还要小
      2. +
      3. 如果 i 在 x_i 的右侧在这种情况下, 我们无法直接排除左子树, 因为左子树中的节点区间仍然可能和 i 相交。这时候 max 值就派上用场了:
      4. +
      +
        +
      • 如果 x 的左子树中 high 的最大值仍然小于 i.low 的话, 那么可以直接排除 x 的左子树。
      • +
      • 如果 x 的左子树中 high 的最大值大于或等于 i.low 的话, 那么左子树中一定存在和 i 相交的区间, 因为 x 左子树中所有的 low 都小于 x_i.low , 而 i 在 x_i 的右侧, 所以 x 左子树中所有的 low 也小于 i.low , 因此一定有相交。
      • +
      +

      通过以上两点可以验证上述伪代码的正确性, 并且从代码可以看出查询的最坏时间复杂度为 O(log(n)) 。

      +

      使用 Safe Rust 实现区间树

      +

      困难点

      +

      为了构建区间树, 我们首先需要实现一个红黑树。在红黑树中, 每个树节点需要指向父节点, 这就要求一个节点实例存在多个所有权。

      +

      Rc<RefCell>

      +

      最初我尝试使用了 Rust 最常见的多所有权的实现 Rc<RefCell> , 树节点结构类似于以下的代码:

      +
      struct Node<T, V> {
      +    left: Option<NodeRef<T, V>>,
      +    right: Option<NodeRef<T, V>>,
      +    parent: Option<NodeRef<T, V>>,
      +    ...
      +}
      +
      +struct NodeRef<T, V>(Rc<RefCell<Node<T, V>>>);
      +
      +

      从数据结构定义上看起来还算清晰, 但是实际使用起来相当繁琐, 因为 RefCell 要求用户明确地调用 borrow , 或者 borrow_mut , 我不得不构建很多 helper functions 来简化实现, 下面是一些例子:

      +
      impl<T, V> NodeRef<T, V> {
      +    fn left<F, R>(&self, op: F) -> R
      +    where
      +        F: FnOnce(&NodeRef<T, V>) -> R,
      +    {
      +        op(self.borrow().left())
      +    }
      +
      +    fn parent<F, R>(&self, op: F) -> R
      +    where
      +        F: FnOnce(&NodeRef<T, V>) -> R,
      +    {
      +        op(self.borrow().parent())
      +    }
      +
      +    fn set_right(&self, node: NodeRef<T, V>) {
      +        let _ignore = self.borrow_mut().right.replace(node);
      +    }
      +
      +    fn set_max(&self, max: T) {
      +        let _ignore = self.borrow_mut().max.replace(max);
      +    }
      +    ...
      +}
      +
      +

      RefCell 使用上不符合人体工程学是一点, 更糟糕的是我们在代码中需要使用大量的 Rc::clone , 因为在自上而下遍历树节点时, 我们需要持有一个节点的 owned type, 而不是一个引用。例如在之前提到的 INTERVAL-SEARCH 操作中, 每次 x = x.left 或者 x = x.right , 首先需要 borrow x 本身, 再赋值给 x。因此需要先取得左(或右)节点的 owned type, 再更新 x 到新值。这样导致大量的节点计数开销。

      +

      具体开销到底有多大?我尝试对于我们上面的实现进行 benchmark, 使用随机数据插入和删除。我本机环境为 Intel 13600KF 和 DDR4 内存。

      +
      test bench_interval_tree_insert_100           ... bench:       9,821 ns/iter (+/- 263)
      +test bench_interval_tree_insert_1000          ... bench:     215,362 ns/iter (+/- 6,536)
      +test bench_interval_tree_insert_10000         ... bench:   2,999,694 ns/iter (+/- 134,979)
      +test bench_interval_tree_insert_remove_100    ... bench:      18,395 ns/iter (+/- 750)
      +test bench_interval_tree_insert_remove_1000   ... bench:     385,858 ns/iter (+/- 7,659)
      +test bench_interval_tree_insert_remove_10000  ... bench:   5,465,355 ns/iter (+/- 114,735)
      +
      +

      使用相同数据和环境, 和 etcd 的 golang 区间树实现进行对比:

      +
      BenchmarkIntervalTreeInsert100-20                 123747             12250 ns/op
      +BenchmarkIntervalTreeInsert1000-20                  7119            189613 ns/op
      +BenchmarkIntervalTreeInsert10_000-20                 340           3237907 ns/op
      +BenchmarkIntervalTreeInsertRemove100-20            24584             45579 ns/op
      +BenchmarkIntervalTreeInsertRemove1000-20             344           3462977 ns/op
      +BenchmarkIntervalTreeInsertRemove10_000-20             3         358284695 ns/op
      +
      +

      可以看到我们的 Rust 实现并无优势, 甚至有时插入操作还会更慢。(注: 这里的 etcd 的节点删除实现似乎有问题, 观察节点数量从 1000->10000 时耗时的增长, 复杂度可能不是 O(log(n)))

      +

      线程安全问题

      +

      即使我们勉强接受以上的性能, 一个更严重的问题浮出水面: Rc<RefCell> 无法在多线程环境下使用! 由于 Xline 是在 Rust 的 Tokio runtime 之上构建, 需要在多个线程间共享一个区间树实例。可惜的是, Rc 本身是 !Send , 因为 Rc 内部的引用计数是以非原子的方式递增/减的。那么这就导致整个区间树的数据结构无法发送到其他线程。除非我们采用一个专用线程, 并且通过 channel 与这个线程进行通信, 我们无法在多线程环境下使用。

      +

      其他智能指针

      +

      于是我们需要考虑其他智能指针来解决这个问题。一个自然的想法是使用 Arc<RefCell> 。然而, RefCell 本身是 !Sync , 因为 RefCell 的 borrow checking 只能在单线程下使用, 无法同时由多个线程共享, 并且 Arc 是 Send 当且仅当 T 是 Sync , 因为 Arc 本身允许克隆。

      +

      Arc<Mutex>?

      +

      那么在多线程环境多所有权似乎只能够使用 Arc<mutex> 了。但是显然这对于我们的用例来说是一个 anti-pattern, 因为这样我们就需要对每一个节点都加上一把锁, 而树中可能有数十万乃至几百万的节点, 这是不可接受的。

      +

      QCell

      +

      在使用常规方法无果后, 我们尝试使用了 qcell 这个 crate, 其中 QCell 作为 RefCell 的多线程替代品。作者非常巧妙地解决了多所有权下借用检查的问题。

      +

      QCell 设计

      +

      由于 qcell 的设计在 GhostCell 的论文中有正式的证明, 这里我就介绍介绍一下 GhostCell 论文中的设计:

      +

      在 Rust 中, 对于数据操作的权限和数据本身是绑定在一起的, 也就是说, 你首先要拥有一个数据, 才能修改它的状态。具体一点, 想要修改数据 T , 你要么有一个 T 本身, 要么有一个 &mut T 。

      +

      GhostCell 的设计概念是将对数据操作的权限和数据本身分开, 那么对于一种数据, 数据 T 本身是一个类型, 而它的权限同样也是是一个具体的类型, 记为 P_t 。这种设计相比与 Rust 现有设计就更加灵活, 因为可以让一个权限类型的实例拥有对一个数据集合的权限, 即一个 P_t 拥有多个 T 。在这种设计下, 只要权限类型实例本身是线程安全的, 它所管理的这一个数据集合也是线程安全的。

      +

      在 qcell 中使用方法如下, 首先需要创建一个 QCellOwner 代表前述的权限, QCell 则表示储存的数据。

      +
      let mut owner = QCellOwner::new();
      +let item = Arc::new(QCell::new(&owner, Vec::<u8>::new()));
      +owner.rw(&item).push(0);
      +
      +

      QCellOwner 拥有注册到它这里的 QCell 的读写权限(通过 QCellOwner::rw 或者 QCellOwner::ro ), 所以只要 QCellOwner 是线程安全, QCell 中的数据也是线程安全的。在这里 QCellOwner 本身是 Send + Sync , QCell 也可以是 Send + Sync 只要 T 满足:

      +
      impl<T: ?Sized + Send> Send for QCell<T>
      +impl<T: ?Sized + Send + Sync> Sync for QCell<T>
      +
      +

      使用 QCell

      +

      得益于它的设计, QCell 本身开销非常小(这里的具体的开销不展开讲了), 因为它借助于 Rust 类型系统使得 borrow checking 是在编译期检查的, 而 RefCell 相比之下则是在运行时检查, 因此使用 QCell 不仅能在多线程环境下使用, 还能够提升一部分性能。

      +

      接下来就是应用 QCell 到我们的树实现上了。由于 QCell 只提供内部可变性, 要能够使用多重所有权, 我们还需要有 Arc , 结构大致看起来如下:

      +
      pub struct IntervalTree {
      +    node_owner: QCellOwner,
      +    ...
      +}
      +
      +struct NodeRef<T, V>(Arc<QCell<Node<T, V>>>);
      +
      +

      看起来不错, 那么性能如何呢?

      +
      test bench_interval_tree_insert_100           ... bench:      41,486 ns/iter (+/- 71)
      +test bench_interval_tree_insert_1000          ... bench:     586,854 ns/iter (+/- 13,947)
      +test bench_interval_tree_insert_10000         ... bench:   7,726,849 ns/iter (+/- 102,820)
      +test bench_interval_tree_insert_remove_100    ... bench:      75,569 ns/iter (+/- 325)
      +test bench_interval_tree_insert_remove_1000   ... bench:   1,135,232 ns/iter (+/- 7,539)
      +test bench_interval_tree_insert_remove_10000  ... bench:  15,686,474 ns/iter (+/- 194,385)
      +
      +

      比较之前的测试结果, 性能竟然下降了 1-3 倍。这说明最大的开销不是 Cell, 而是引用计数, 在我们的区间树用例中, 使用 Arc 比 Rc 慢了非常多。

      +

      一个不使用 Arc 的方法是使用 arena 分配, 即一次性对所有对象分配内存, 并且销毁也是一次性的, 但是这在树的数据结构中并不适用, 因为我们需要动态地分配和销毁节点的内存。

      +

      数组模拟指针

      +

      性能测试反映出我们的智能指针尝试是失败的。在 Rust 所有权模型下, 使用智能指针来实现树结构是非常糟糕的。

      +

      那么我们可不可以不使用指针来实现呢? 一个自然的想法是使用数组来模拟指针。

      +

      于是我们的树结构重新设计如下:

      +
      pub struct IntervalTree {
      +    nodes: Vec<Node>,
      +    ...
      +}
      +
      +pub struct Node {
      +    left: Option<u32>,
      +    right: Option<u32>,
      +    parent: Option<u32>,
      +    ...
      +}
      +
      +

      可以看出在 Rust 中数组模拟指针的优势是不需要某个节点的所有权, 只需要记录下某个节点在 Vec 中的位置即可。每次插入新节点即向 nodes 后面 push 一个节点, 它的模拟指针就是 nodes.len() - 1 。

      +

      对于插入操作非常简单, 但是如果我们需要删除节点呢? 如果使用朴素的删除方法: 更新树节点的指针后直接将 Vec 中的对应的节点置为空, 那么这样就会在我们的 Vec 中留下一个“空洞”。这样的话我们需要再额外维护一个链表结构来记录这个“空洞”的位置, 以便在下一次插入的时候能重新使用。而且这种方法会导致 nodes 这个 Vec 的空间难以回收, 即使大部分节点已经被删除。

      +

      那么如何解决这个问题呢? 接下来我参照了 petgraph 中的方法, 在删除一个节点时, 将这个节点与 Vec 中最后一个节点交换再移除, 这样就解决了之前的内存回收的问题。需要注意的是, 我们需要同时更新与最后一个节点有关节点的指针, 因为它的位置发生了变化。在 petgraph 的图实现中, 这个操作可能是很耗时的, 因为一个节点可能会连接多条边, 但是在我们的树用例中, 我们只需要更新这个节点的父亲/左孩子/右孩子总共 3 个节点, 因此这个操作是 O(1) 的, 这样就非常高效的解决了节点删除的问题。

      +

      我们再来对我们的新实现进行 benchmark:

      +
      test bench_interval_tree_insert_100           ... bench:       3,333 ns/iter (+/- 87)
      +test bench_interval_tree_insert_1000          ... bench:      85,477 ns/iter (+/- 3,552)
      +test bench_interval_tree_insert_10000         ... bench:   1,406,707 ns/iter (+/- 20,796)
      +test bench_interval_tree_insert_remove_100    ... bench:       7,157 ns/iter (+/- 69)
      +test bench_interval_tree_insert_remove_1000   ... bench:     189,277 ns/iter (+/- 3,014)
      +test bench_interval_tree_insert_remove_10000  ... bench:   3,060,029 ns/iter (+/- 50,829)
      +
      +

      从结构来看这次的性能提升非常之大, 对比之前的 Rc<RefCell> 或者是 etcd 的 golang 的实现大约快了 1-2 倍。

      +

      使用数组模拟指针不仅轻松解决了所有权的问题, 并且由于数组内存的连续性使其对于缓存更加友好, 比纯指针性能甚至会更高。

      +

      总结

      +

      至此, 我们成功完美解决了使用 safe Rust 实现区间树的问题。从之前所述的多种尝试来看, 在 Rust 中使用引用计数智能指针来实现树或者图的数据结构是失败的, 因为这些智能指针并不适用于大量的内存操作。将来如果需要使用 safe Rust 实现指针类数据结构, 我会优先考虑使用数组而不是智能指针。

      `;export{n as assetURLs,t as default,l as metadata,a as toc}; diff --git a/zh-cn/assets/index-d4dfb508.js b/zh-cn/assets/index-a59ad30d.js similarity index 95% rename from zh-cn/assets/index-d4dfb508.js rename to zh-cn/assets/index-a59ad30d.js index c3823f7..7cb6ff0 100644 --- a/zh-cn/assets/index-d4dfb508.js +++ b/zh-cn/assets/index-a59ad30d.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"},i=[{label:"为什么要参加 GSoC?",level:2},{label:"期待开源爱好者参与的项目",level:2},{label:"参与指南",level:2},{label:"活动重要时间点",level:2},{label:"联系方式",level:2}],r=`

      图片

      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,r as default,l as metadata,i as toc}; diff --git a/zh-cn/assets/index-6618c0b5.js b/zh-cn/assets/index-a5e56ae7.js similarity index 98% rename from zh-cn/assets/index-6618c0b5.js rename to zh-cn/assets/index-a5e56ae7.js index 2cde4b2..ce92d29 100644 --- a/zh-cn/assets/index-6618c0b5.js +++ b/zh-cn/assets/index-a5e56ae7.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],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=`

      +const e="/zh-cn/assets/e4031380f79f643b21d6bdfd37c46a1c-95e167c8.jpeg",s="/zh-cn/assets/8108518a82f752ddea6832ce7bc15560-3d5249bd.png",a="/zh-cn/assets/cf12e52cb9d0fbb7359c08e1cfc674bc-9774dac8.png",n="/zh-cn/assets/9d0ce540d5b4e7c3cb1a055c1413bdc9-a833a409.png",c="/zh-cn/assets/f7aae2cd2b075c3f567ff87285f738c2-476d6b84.png",t="/zh-cn/assets/bb02cb50b10cee5e7d575210aaeacd71-1661168b.png",l=[e,s,a,n,c,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 内部状态机状态转换。

      @@ -25,12 +25,12 @@ const e="/zh-cn/assets/e4031380f79f643b21d6bdfd37c46a1c-95e167c8.jpeg",s="/zh-cn

      针对第一个问题,我们可以将所有的命令都看成是一张有向无环图中的顶点,而将冲突关系视为图中顶点之间的有向边。假设命令 A 和命令 B 之间存在冲突(命令的抵达顺序为先 A 后 B),我们便可将冲突关系看成是 A 和 B 之间的一条弧<A, B>,其中弧头总是指向后进来的顶点(这一顺序性就保证了图中不会出现环形冲突)。

      一旦我们将冲突关系定义为一个有向无环的非连通图中的一条边,那么执行某个命令时所需要计算的冲突顺序问题,就转换成了一个求有向无环图中,该命令所在的连通分量的拓扑排序问题。针对每个命令,successors(也就是后继) 保存了哪些 cmd 与当前 cmd 冲突,successors 的长度就是该 顶点的出度。而 predecessor_cnt (前驱数)则代表了这个 cmd 与之前的多少个 cmd 存在冲突,也就是该顶点元素的入度。

      同样回到我们前面所提到的 A、B、C 的例子当中,当我们使用 DAG 来描述命令的冲突关系,其情况如下图所示。

      -

      +

      当 cmd_worker 从 channel 当中接收命令时,channel 只需要遍历这个有向无环图中的每一个连通分量,并找到第一个入度为 0 的顶点即可。只有当 command 执行完毕后,channel 才会更新 B 的 predecessor_cnt,以解决 A 与 B 之间的冲突关系。

      状态机引擎的架构

      正如我们在文章开头所说的那样,冲突检测队列和 command worker 共同组成了 Curp Server 的状态机引擎。冲突检测队列向 command worker 提供无冲突的命令,而 command worker 则负责执行这些命令,并根据结果推动更新冲突检测队列当中的冲突关系。

      从结构上来看,Curp Server 状态机引擎是由三对 channel 和一个 filter 构成,其中这三对 channel 分别为:(send_tx,filter_rx)、(filter_tx, recv_rx) 以及 (done_tx, done_rx)具体的结构可以参考下图。

      -

      +

      其数据流方向为:send_tx -> filter_rx -> filter -> filter_tx -> recv_rx -> done_tx -> done_rx

      其中,send_tx 为 RawCurp 对象所拥有,负责在 propose(对应了 curp 的 fast path)、以及应用日志 apply(对应了 curp 的 slow path) 时向冲突检测队列投递对应的 CEEvent。冲突检测队列则会在计算出冲突顺序后,将 CEEvent 转换成为 Task 并通过 (filter_tx, recv_rx) 投递到 command worker 当中执行。command worker 在执行完 Task 后将结果通过 (done_tx, done_rx) 反馈到冲突检测队列中,并更新队列中依赖图中的顶点信息。

      状态是如何转换的

      diff --git a/zh-cn/assets/index-f6182a9f.js b/zh-cn/assets/index-af83501f.js similarity index 96% rename from zh-cn/assets/index-f6182a9f.js rename to zh-cn/assets/index-af83501f.js index e8e89c3..e10ccf2 100644 --- a/zh-cn/assets/index-f6182a9f.js +++ b/zh-cn/assets/index-af83501f.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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",r="/zh-cn/assets/image5-184dc93a.png",o="/zh-cn/assets/image6-18c75b26.jpg",t="/zh-cn/assets/image7-6a4a9bfe.png",n="/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,t,n,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"},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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",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",g="/zh-cn/assets/image5-6a5e807d.png",p=[e,i,a,A,o,r,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

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

      演讲主题: Utilizing SpinalHDL to Accelerate Neuroscience

      演讲摘要: This presentation covers how LeafLabs leverages SpinalHDL to enable the rapid development of a devices used for Neuroscience research ranging from mixed-signal Electrophysiology ASICs to FPGA based designs for system control and USB3 connectivity.


      -

      图片

      +

      图片

      分享人:Teilraum

      演讲主题: A Network Attached Deep Learning Accelerator for FPGA Clusters

      演讲摘要: This presentation introduces a Layer parallel framework for DNN training on an FPGA cluster. All hardware description is done using SpinalHDL. It gives an overview of approaches and examples where SpinalHDL came in handy.


      复杂系统设计案例

      -

      图片

      +

      图片

      分享人:Saahm

      演讲主题: 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.


      硬件设计流程

      -

      图片

      +

      图片

      分享人:Readon

      演讲主题: Recent progress on formal verification support on SpinalHDL

      演讲摘要: The formal verification is a technology to verify design, which helps to find the corner cases. SpinalHDL have provided an integration of this tech with SymbiYosys easily. The brief introduction on how to verify a design would be presented by example. Some new build blocks helping to simplify the verification process would be introduced. At last, a short overview of the verification of some facilities in SpinalHDL's lib would also be summarized.


      -

      图片

      +

      图片

      分享人:Sebastien-riou

      演讲主题: SpinalHDL for ASIC

      演讲摘要: The presentation is a highlights of a ASIC done entirely in SpinalHDL, fabricated in GF22FDX. Focus on pads, RAMs and FPGA for ASIC verification.

      @@ -53,4 +53,4 @@ const e="/zh-cn/assets/image1-b974e0d0.png",i="/zh-cn/assets/image2-599a44cc.jpg https://github.com/datenlord/TRIDENT

      推荐阅读

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

      -

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

      `;export{p 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-50ad21f0.js b/zh-cn/assets/index-b5bb516b.js similarity index 93% rename from zh-cn/assets/index-50ad21f0.js rename to zh-cn/assets/index-b5bb516b.js index b5a596d..93c613d 100644 --- a/zh-cn/assets/index-50ad21f0.js +++ b/zh-cn/assets/index-b5bb516b.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],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=`

      封面

      +const e="/zh-cn/assets/cover-2326b9d3.jpg",i="/zh-cn/assets/image1-62ba36d5.png",t="/zh-cn/assets/image2-238eb6f5.jpg",l="/zh-cn/assets/image3-9644e0b1.png",s=[e,i,t,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~"},n=[{label:"为什么要发起设立 MIT 体系结构公开课学习社区?",level:2},{label:"学习社区运营十个月有什么成果?",level:2},{label:"为什么要升级 MIT 体系结构公开课学习社区 2.0 版?",level:2},{label:"MIT 体系结构公开课学习社区 2.0 版有什么改进?",level:2},{label:"欢迎报名",level:2}],c=`

      封面

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

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

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

      @@ -20,7 +20,7 @@ const e="/zh-cn/assets/cover-2326b9d3.jpg",t="/zh-cn/assets/image1-62ba36d5.png"
      • 课程内容重新规划,现分为三个阶段:
      -

      封面

      +

      封面