From 5ae27f4745a156e0e39b73178d68fed135044e75 Mon Sep 17 00:00:00 2001 From: LingKa Date: Thu, 16 May 2024 15:06:41 +0800 Subject: [PATCH] feat: deploy github page --- zh-cn/assets/cover-1ac6df35.webp | Bin 0 -> 23514 bytes zh-cn/assets/cover-bb683e66.webp | Bin 0 -> 39432 bytes zh-cn/assets/image1-67dc5aad.webp | Bin 0 -> 32108 bytes zh-cn/assets/image2-5e5cc8ab.webp | Bin 0 -> 9130 bytes .../{index-6a884c2a.js => index-02cd55c8.js} | 8 +- .../{index-bccae718.js => index-0850e6f5.js} | 6 +- .../{index-8a16857f.js => index-0c28844a.js} | 4 +- .../{index-012cd7f5.js => index-0e3994dc.js} | 10 +- .../{index-4da057d8.js => index-1407e949.js} | 4 +- .../{index-7df3558a.js => index-17cb538a.js} | 4 +- .../{index-5e43e574.js => index-192ae9c1.js} | 4 +- .../{index-0f5b2c4d.js => index-22038a3d.js} | 24 +- .../{index-25c20c62.js => index-24fab036.js} | 4 +- .../{index-6f8e9292.js => index-2701299c.js} | 4 +- .../{index-7e0a1d2c.js => index-2ab66d66.js} | 4 +- .../{index-0c25eea3.js => index-2b1c59a2.js} | 4 +- .../{index-40aedb60.js => index-2bfed728.js} | 8 +- .../{index-f819e53e.js => index-303605cc.js} | 8 +- .../{index-043be87f.js => index-35dfbee0.js} | 4 +- .../{index-87f0525d.js => index-3d206f46.js} | 6 +- .../{index-16f06676.js => index-4d1333f2.js} | 4 +- .../{index-1179d885.js => index-4e03f569.js} | 4 +- .../{index-b5bb516b.js => index-50ad21f0.js} | 8 +- zh-cn/assets/index-5130399c.js | 726 ++++++++++++++++++ .../{index-f533d09f.js => index-559b2f74.js} | 4 +- .../{index-a179aa93.js => index-5d88950d.js} | 4 +- .../{index-31f22a4e.js => index-5fa4b651.js} | 4 +- .../{index-a5e56ae7.js => index-6618c0b5.js} | 6 +- .../{index-494dac65.js => index-671b070b.js} | 4 +- zh-cn/assets/index-68779906.js | 80 ++ .../{index-a154d453.js => index-696ef44a.js} | 4 +- .../{index-71801d47.js => index-6a3ed4c3.js} | 4 +- .../{index-69ce89cf.js => index-7007c1ed.js} | 6 +- zh-cn/assets/index-81d1e484.js | 153 ++++ .../{index-b9ee750d.js => index-89698b14.js} | 4 +- .../{index-86e42443.js => index-90593fbc.js} | 4 +- .../{index-af83501f.js => index-9a9f68d0.js} | 8 +- .../{index-ffd93bc8.js => index-a1a1a279.js} | 4 +- .../{index-1dde53bb.js => index-b503fc36.js} | 10 +- .../{index-38e8d7df.js => index-bb28ce04.js} | 4 +- .../{index-f5cc00ea.js => index-c2d3b4f6.js} | 6 +- .../{index-da95a700.js => index-c7f65d1f.js} | 4 +- .../{index-1e46583f.js => index-cf17c7a4.js} | 4 +- .../{index-a59ad30d.js => index-d4dfb508.js} | 4 +- .../{index-213034fe.js => index-d654fc6e.js} | 4 +- .../{index-8cb22688.js => index-dfd283a0.js} | 4 +- .../{index-917f23ec.js => index-e01a3d91.js} | 4 +- .../{index-78a34e98.js => index-e7ccea1d.js} | 4 +- .../{index-4bc11ad1.js => index-eed6a3b1.js} | 8 +- .../{index-2a76e7d1.js => index-f9f53c26.js} | 34 +- .../{index-be0587a7.js => index-fa30bf44.js} | 4 +- .../{index-4820dca7.js => index-fd018bec.js} | 4 +- .../{index-9d285d88.js => index-fe9ae8f0.js} | 4 +- zh-cn/index.html | 2 +- 54 files changed, 1100 insertions(+), 141 deletions(-) create mode 100644 zh-cn/assets/cover-1ac6df35.webp create mode 100644 zh-cn/assets/cover-bb683e66.webp create mode 100644 zh-cn/assets/image1-67dc5aad.webp create mode 100644 zh-cn/assets/image2-5e5cc8ab.webp rename zh-cn/assets/{index-6a884c2a.js => index-02cd55c8.js} (99%) rename zh-cn/assets/{index-bccae718.js => index-0850e6f5.js} (98%) rename zh-cn/assets/{index-8a16857f.js => index-0c28844a.js} (99%) rename zh-cn/assets/{index-012cd7f5.js => index-0e3994dc.js} (99%) rename zh-cn/assets/{index-4da057d8.js => index-1407e949.js} (99%) rename zh-cn/assets/{index-7df3558a.js => index-17cb538a.js} (92%) rename zh-cn/assets/{index-5e43e574.js => index-192ae9c1.js} (92%) rename zh-cn/assets/{index-0f5b2c4d.js => index-22038a3d.js} (98%) rename zh-cn/assets/{index-25c20c62.js => index-24fab036.js} (95%) rename zh-cn/assets/{index-6f8e9292.js => index-2701299c.js} (93%) rename zh-cn/assets/{index-7e0a1d2c.js => index-2ab66d66.js} (97%) rename zh-cn/assets/{index-0c25eea3.js => index-2b1c59a2.js} (97%) rename zh-cn/assets/{index-40aedb60.js => index-2bfed728.js} (98%) rename zh-cn/assets/{index-f819e53e.js => index-303605cc.js} (98%) rename zh-cn/assets/{index-043be87f.js => index-35dfbee0.js} (91%) rename zh-cn/assets/{index-87f0525d.js => index-3d206f46.js} (98%) rename zh-cn/assets/{index-16f06676.js => index-4d1333f2.js} (98%) rename zh-cn/assets/{index-1179d885.js => index-4e03f569.js} (97%) rename zh-cn/assets/{index-b5bb516b.js => index-50ad21f0.js} (93%) create mode 100644 zh-cn/assets/index-5130399c.js rename zh-cn/assets/{index-f533d09f.js => index-559b2f74.js} (95%) rename zh-cn/assets/{index-a179aa93.js => index-5d88950d.js} (88%) rename zh-cn/assets/{index-31f22a4e.js => index-5fa4b651.js} (94%) rename zh-cn/assets/{index-a5e56ae7.js => index-6618c0b5.js} (98%) rename zh-cn/assets/{index-494dac65.js => index-671b070b.js} (95%) create mode 100644 zh-cn/assets/index-68779906.js rename zh-cn/assets/{index-a154d453.js => index-696ef44a.js} (98%) rename zh-cn/assets/{index-71801d47.js => index-6a3ed4c3.js} (95%) rename zh-cn/assets/{index-69ce89cf.js => index-7007c1ed.js} (93%) create mode 100644 zh-cn/assets/index-81d1e484.js rename zh-cn/assets/{index-b9ee750d.js => index-89698b14.js} (86%) rename zh-cn/assets/{index-86e42443.js => index-90593fbc.js} (99%) rename zh-cn/assets/{index-af83501f.js => index-9a9f68d0.js} (98%) rename zh-cn/assets/{index-ffd93bc8.js => index-a1a1a279.js} (95%) rename zh-cn/assets/{index-1dde53bb.js => index-b503fc36.js} (96%) rename zh-cn/assets/{index-38e8d7df.js => index-bb28ce04.js} (92%) rename zh-cn/assets/{index-f5cc00ea.js => index-c2d3b4f6.js} (97%) rename zh-cn/assets/{index-da95a700.js => index-c7f65d1f.js} (91%) rename zh-cn/assets/{index-1e46583f.js => index-cf17c7a4.js} (97%) rename zh-cn/assets/{index-a59ad30d.js => index-d4dfb508.js} (95%) rename zh-cn/assets/{index-213034fe.js => index-d654fc6e.js} (97%) rename zh-cn/assets/{index-8cb22688.js => index-dfd283a0.js} (95%) rename zh-cn/assets/{index-917f23ec.js => index-e01a3d91.js} (92%) rename zh-cn/assets/{index-78a34e98.js => index-e7ccea1d.js} (89%) rename zh-cn/assets/{index-4bc11ad1.js => index-eed6a3b1.js} (95%) rename zh-cn/assets/{index-2a76e7d1.js => index-f9f53c26.js} (93%) rename zh-cn/assets/{index-be0587a7.js => index-fa30bf44.js} (97%) rename zh-cn/assets/{index-4820dca7.js => index-fd018bec.js} (98%) rename zh-cn/assets/{index-9d285d88.js => index-fe9ae8f0.js} (98%) diff --git a/zh-cn/assets/cover-1ac6df35.webp b/zh-cn/assets/cover-1ac6df35.webp new file mode 100644 index 0000000000000000000000000000000000000000..ff7824ddbb2d2156f84fbad5f7ed97bc38c6f2e4 GIT binary patch literal 23514 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 literal 0 HcmV?d00001 diff --git a/zh-cn/assets/cover-bb683e66.webp b/zh-cn/assets/cover-bb683e66.webp new file mode 100644 index 0000000000000000000000000000000000000000..831e1c5add84f680cae639422f7faed4a296a043 GIT binary patch literal 39432 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

!o&>KlZkV=3S|N5kR7VrJVC;$Ke002F2TPOek literal 0 HcmV?d00001 diff --git a/zh-cn/assets/image2-5e5cc8ab.webp b/zh-cn/assets/image2-5e5cc8ab.webp new file mode 100644 index 0000000000000000000000000000000000000000..7a3fe51a6522df7556d1f5c2cb71c43c2bd814a3 GIT binary patch literal 9130 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 R*DQ5^ZzD1LC>R*ne*w!J$8G=s literal 0 HcmV?d00001 diff --git a/zh-cn/assets/index-6a884c2a.js b/zh-cn/assets/index-02cd55c8.js similarity index 99% rename from zh-cn/assets/index-6a884c2a.js rename to zh-cn/assets/index-02cd55c8.js index 910fa6f..24cd011 100644 --- a/zh-cn/assets/index-6a884c2a.js +++ b/zh-cn/assets/index-02cd55c8.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",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 项目进行详细的介绍。

+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],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!"},T=[{label:"引言",level:2},{label:"0.1 Poseidon 与零知识证明",level:3},{label:"0.2 Filecoin 分布式存储网络",level:3},{label:"Poseidon 哈希算法概述",level:2},{label:"1.1Poseidon 参数",level:3},{label:"1.2 Poseidon 详细计算流程",level:3},{label:"1.3Poseidon 算法特点",level:3},{label:"基于 SpinalHDL 和 Cocotb 的硬件设计与验证",level:2},{label:"2.1 SpinalHDL 和 Cocotb 概述",level:3},{label:"2.2 SpinalHDL 在硬件设计中的优势",level:3},{label:"2.3Cocotb 在验证中的优势",level:3},{label:"总体方案设计",level:2},{label:"3.1 开发平台",level:3},{label:"3.2 加速系统设计",level:3},{label:"加速器 IP 设计",level:2},{label:"4.1 模加电路的设计",level:3},{label:"4.2 模乘电路的设计",level:3},{label:"4.3 加速器架构设计",level:3},{label:"性能测试",level:2},{label:"5.1 Vivado Implementation 报告",level:3},{label:"总结",level:2}],C=`

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

引言

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

0.1 Poseidon 与零知识证明

@@ -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
  • 优化加速器架构:由于需要适配 Filecoin Poseidon 计算实例中不同大小的输入数据,目前在输入较小的情况下加速器中存在一些冗余的运算单元。通过进一步优化加速器的整体架构,使得在不同长度的输入数据下,所有运算单元都能得到更好的利用,能够进一步提升整体的加速性能。

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

    喷泉码简介

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

    喷泉码简介

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

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

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

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

    上述所说的局限性是受到信息论的约束的,无法进一步降低。那么我们有没有办法实现一种方式来降低计算资源的消耗呢?比如我们如果不需要恢复出全部的原始数据呢?受到这个思路的启发 Raptor 算法应运而生。

    Raptor 算法

    Raptor 本质上是一类混合编码方式,结合 LT 编码和 LDPC 编码,同时获取了两种编码的好处。如下图所示:

    -

    图片

    -

    Raptor 编码首先通过 LDPC 编码进行一次固定码率编码,形成一个中间编码层,然后再对该编码层进行 LT 编码,生成最终的编码数据块。当然 Raptor 编码也会有其他变种,不过原理大同小异,例如下图所示:

    图片

    +

    Raptor 编码首先通过 LDPC 编码进行一次固定码率编码,形成一个中间编码层,然后再对该编码层进行 LT 编码,生成最终的编码数据块。当然 Raptor 编码也会有其他变种,不过原理大同小异,例如下图所示:

    +

    图片

    该编码具有三层结构,中间编码结果经过了两层固定码率编码,分别是 Hamming 编码LDPC 编码,然后再进行 LT 编码生成最终的编码块。

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

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

    diff --git a/zh-cn/assets/index-8a16857f.js b/zh-cn/assets/index-0c28844a.js similarity index 99% rename from zh-cn/assets/index-8a16857f.js rename to zh-cn/assets/index-0c28844a.js index 124de29..c500077 100644 --- a/zh-cn/assets/index-8a16857f.js +++ b/zh-cn/assets/index-0c28844a.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}],C=`

    +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}],f=`

    简介

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

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

    `;export{I as assetURLs,f as default,P as metadata,D as toc}; diff --git a/zh-cn/assets/index-012cd7f5.js b/zh-cn/assets/index-0e3994dc.js similarity index 99% rename from zh-cn/assets/index-012cd7f5.js rename to zh-cn/assets/index-0e3994dc.js index 0df1c5a..854ed97 100644 --- a/zh-cn/assets/index-012cd7f5.js +++ b/zh-cn/assets/index-0e3994dc.js @@ -1,4 +1,4 @@ -const v="/zh-cn/assets/cover-92745c95.jpg",e="/zh-cn/assets/image1-638abd39.png",s="/zh-cn/assets/image2-2a8f796e.gif",p="/zh-cn/assets/image3-ae1841b7.png",a="/zh-cn/assets/image4-5bf432ec.png",n="/zh-cn/assets/image5-81eb5b8d.png",l="/zh-cn/assets/image6-537c8738.png",o="/zh-cn/assets/image7-b58de99e.png",i="/zh-cn/assets/image8-c6334c83.png",t="/zh-cn/assets/image9-6340ddaa.png",c="/zh-cn/assets/image10-ac1b70de.png",r="/zh-cn/assets/image11-1f1870d2.png",_="/zh-cn/assets/image12-01c249ea.png",m="/zh-cn/assets/image13-a48112ad.png",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=`

    数据流式编程的思想

    +const v="/zh-cn/assets/cover-92745c95.jpg",e="/zh-cn/assets/image1-638abd39.png",s="/zh-cn/assets/image2-2a8f796e.gif",p="/zh-cn/assets/image3-ae1841b7.png",a="/zh-cn/assets/image4-5bf432ec.png",n="/zh-cn/assets/image5-81eb5b8d.png",l="/zh-cn/assets/image6-537c8738.png",o="/zh-cn/assets/image7-b58de99e.png",i="/zh-cn/assets/image8-c6334c83.png",t="/zh-cn/assets/image9-6340ddaa.png",c="/zh-cn/assets/image10-ac1b70de.png",r="/zh-cn/assets/image11-1f1870d2.png",_="/zh-cn/assets/image12-01c249ea.png",m="/zh-cn/assets/image13-a48112ad.png",u="/zh-cn/assets/image14-d780d4f2.png",d="/zh-cn/assets/image15-f58a4d86.png",h="/zh-cn/assets/image16-79c3985b.png",k="/zh-cn/assets/image17-863e7adb.png",f="/zh-cn/assets/image18-931263d9.png",g="/zh-cn/assets/image19-8f35c101.png",b="/zh-cn/assets/image20-ef5a452f.png",P="/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,u,d,h,k,f,g,b,P,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 教授开创。

    图片

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

    图片

    +

    图片

    图 14 mkIfThenElse 节点示意图

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

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

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

    图片

    +

    图片

    图 15 mkForLoop 节点示意图

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

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

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

    图片

    +

    图片

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

        let permuter = mkFn_to_Pipe_Buffered (False, f_permute,
                                                 param_buf_permuter_output);
     
    -

    图片

    +

    图片

    图 21 在不同位置插入流水线寄存器

    如上述代码片段和图 21 所示,通过 mkFn_to_Pipe_Buffered 函数的两个输入参数来控制是否加入 FIFO,从而实现在流水线或组合逻辑之间的切换,使得程序可以在时序上做出简单的调整。

    return mkCompose (grouper,
    diff --git a/zh-cn/assets/index-4da057d8.js b/zh-cn/assets/index-1407e949.js
    similarity index 99%
    rename from zh-cn/assets/index-4da057d8.js
    rename to zh-cn/assets/index-1407e949.js
    index 3844344..d4dad96 100644
    --- a/zh-cn/assets/index-4da057d8.js
    +++ b/zh-cn/assets/index-1407e949.js
    @@ -1,4 +1,4 @@
    -const e="/zh-cn/assets/cover-ef46e9d6.jpg",B="/zh-cn/assets/image1-5a3b2330.jpg",E="/zh-cn/assets/image2-0cf6d643.jpg",l=[e,B,E],i={label:"开源Bluespec bsc编译器和可重用示例设计",description:"这篇介绍Bluespec以及设计示例的文章,是在2021年ICCAD(International Conference On Computer-Aided Design)发布的论文。达坦科技的open-rdma项目和推广的MIT体系结构学习社区都用到Bluespec,因此将此论文翻译成中文,以便大家了解2020年Bluespec开源后相关的开源项目。",cover:"./cover.jpg",location:"新疆",author:["朱莉·施瓦兹"],date:"2024-01-11",title:"Open source Bluespec bsc compiler and reusable example designs"},t=[{label:"I. 引言",level:2},{label:"II. BSV和BH高级硬件设计语言的背景",level:2},{label:"A. HLS与RTL、Chisel和其他硬件描述语言的比较",level:3},{label:"III. BSV和BH设计、bsc编译器和流程",level:2},{label:"A. 与现有RTL和C语言的互操作性",level:3},{label:"B. bsc内部实现和可选的图形用户界面",level:3},{label:"IV. 教程和书籍",level:2},{label:"V. BSV和BH示例设计",level:2},{label:"A. 开源RISC-V处理器(Bluespec, Inc.)",level:3},{label:"B. RISC-V系统的开源IP(Bluespec,Inc.)",level:3},{label:"C. AWSteria用于主机+FPGA系统的 Infra和Connectal",level:3},{label:"D. AWSteria-RISCV-Virtio (Bluespec, Inc.)",level:3},{label:"E. 安全RISC-V (剑桥大学)",level:3},{label:"F. Shakti RISC-V 处理器(马德拉斯理工学院)",level:3},{label:"G. 片上网络生成器(卡内基梅隆大学)",level:3},{label:"H. BlueCheck 通用硬件测试平台 (剑桥大学)",level:3}],s=`

    封面

    +const e="/zh-cn/assets/cover-ef46e9d6.jpg",B="/zh-cn/assets/image1-5a3b2330.jpg",E="/zh-cn/assets/image2-0cf6d643.jpg",i=[e,B,E],l={label:"开源Bluespec bsc编译器和可重用示例设计",description:"这篇介绍Bluespec以及设计示例的文章,是在2021年ICCAD(International Conference On Computer-Aided Design)发布的论文。达坦科技的open-rdma项目和推广的MIT体系结构学习社区都用到Bluespec,因此将此论文翻译成中文,以便大家了解2020年Bluespec开源后相关的开源项目。",cover:"./cover.jpg",location:"新疆",author:["朱莉·施瓦兹"],date:"2024-01-11",title:"Open source Bluespec bsc compiler and reusable example designs"},t=[{label:"I. 引言",level:2},{label:"II. BSV和BH高级硬件设计语言的背景",level:2},{label:"A. HLS与RTL、Chisel和其他硬件描述语言的比较",level:3},{label:"III. BSV和BH设计、bsc编译器和流程",level:2},{label:"A. 与现有RTL和C语言的互操作性",level:3},{label:"B. bsc内部实现和可选的图形用户界面",level:3},{label:"IV. 教程和书籍",level:2},{label:"V. BSV和BH示例设计",level:2},{label:"A. 开源RISC-V处理器(Bluespec, Inc.)",level:3},{label:"B. RISC-V系统的开源IP(Bluespec,Inc.)",level:3},{label:"C. AWSteria用于主机+FPGA系统的 Infra和Connectal",level:3},{label:"D. AWSteria-RISCV-Virtio (Bluespec, Inc.)",level:3},{label:"E. 安全RISC-V (剑桥大学)",level:3},{label:"F. Shakti RISC-V 处理器(马德拉斯理工学院)",level:3},{label:"G. 片上网络生成器(卡内基梅隆大学)",level:3},{label:"H. BlueCheck 通用硬件测试平台 (剑桥大学)",level:3}],s=`

    封面

    这篇介绍Bluespec以及设计示例的文章,是在2021年ICCAD(International Conference On Computer-Aided Design)发布的论文。达坦科技的open-rdma项目和推广的MIT体系结构学习社区都用到Bluespec,因此将此论文翻译成中文,以便大家了解2020年Bluespec开源后相关的开源项目。

    Science Technology

    摘要: bsc编译器是一个商业可用的编译器,在过去的二十年中被广泛使用,于2020年1月作为免费开源工具发布。本文简要介绍了bsc及其流程,提供了可用的教程材料,并介绍了多个可重用的开源设计案例,其中许多设计聚焦在RISC-V上(覆盖了从嵌入式到支持Linux的CPU和系统),所有设计均可部署在FPGA上。

    @@ -79,4 +79,4 @@ bsc编译器接受以高级硬件描述语言BSV和BH(如下所述)编写的
  • 完全可综合化(以BSV编写):Trstbench可以在FPGA上以DUT的速度运行。它可在https://github.com/CTSRD-CHERI/bluecheck上获取,遵循BERI硬件-软件许可证第1.0版。
  • 原文链接: -https://woset-workshop.github.io/PDFs/2021/a02.pdf

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

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

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

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

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

    线上研讨会

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

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

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

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

    -

    图片

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

    图片

    `;export{o as assetURLs,p as default,a as metadata,r as toc}; diff --git a/zh-cn/assets/index-5e43e574.js b/zh-cn/assets/index-192ae9c1.js similarity index 92% rename from zh-cn/assets/index-5e43e574.js rename to zh-cn/assets/index-192ae9c1.js index 54df414..9dc105f 100644 --- a/zh-cn/assets/index-5e43e574.js +++ b/zh-cn/assets/index-192ae9c1.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],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=`

    封面

    +const s="/zh-cn/assets/cover-48216986.png",t="/zh-cn/assets/image1-02771bf0.jpg",n="/zh-cn/assets/image1-f46bfcc6.jpg",r=[s,t,n],o={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,r as metadata,p as toc}; +

    图片

    `;export{r as assetURLs,a as default,o as metadata,p as toc}; diff --git a/zh-cn/assets/index-0f5b2c4d.js b/zh-cn/assets/index-22038a3d.js similarity index 98% rename from zh-cn/assets/index-0f5b2c4d.js rename to zh-cn/assets/index-22038a3d.js index 9f1196f..d89650f 100644 --- a/zh-cn/assets/index-0f5b2c4d.js +++ b/zh-cn/assets/index-22038a3d.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",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=`

    封面

    +const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png",i="/zh-cn/assets/image2-1161bb88.png",a="/zh-cn/assets/image3-136f9458.png",e="/zh-cn/assets/image4-75f70bf1.png",o="/zh-cn/assets/image5-64f0abbf.png",n="/zh-cn/assets/image6-29b079bb.png",t="/zh-cn/assets/image7-f8d2626b.png",s="/zh-cn/assets/image8-d242f7b7.png",c="/zh-cn/assets/image9-5e691a52.png",r="/zh-cn/assets/image10-b3a0ad40.png",g="/zh-cn/assets/image11-98ffaf6b.png",D="/zh-cn/assets/image13-d816729e.png",H="/zh-cn/assets/image14-20340934.png",h="/zh-cn/assets/image15-512cff4d.png",L="/zh-cn/assets/image16-ee33a0ea.png",S="/zh-cn/assets/image17-e2c28396.png",m="/zh-cn/assets/image18-69fe4409.png",V="/zh-cn/assets/image19-dfed79f8.png",C="/zh-cn/assets/image20-a636b8b5.png",b="/zh-cn/assets/image21-487e6dd2.png",d="/zh-cn/assets/image22-27167bbd.png",y="/zh-cn/assets/image23-8660cc2c.png",P="/zh-cn/assets/image24-4d2461fd.png",f="/zh-cn/assets/image25-3af02a99.png",v="/zh-cn/assets/image26-a854b9f0.png",I="/zh-cn/assets/image27-5b3ff402.png",z="/zh-cn/assets/image28-f02ef5c0.png",u="/zh-cn/assets/image29-44cafcf0.png",A=[l,p,i,a,e,o,n,t,s,c,r,g,D,H,h,L,S,m,V,C,b,d,y,P,f,v,I,z,u],B={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"},T=[{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}],R=`

    封面

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

    引言

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

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

    图片

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

    -

    图片

    +

    图片

    表2:从SpinalHDL到Verilog的映射。

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

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

    -

    图片

    +

    图片

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

    图片

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

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

    图片

    +

    图片

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

    基于Cocotb的验证

    4.1 Cocotb简介

    @@ -160,13 +160,13 @@ 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位宽度的大整数的加法运算:

    图片

    对任意位宽整数的加法操作的Python实现:

    -

    图片

    +

    图片

    在C程序中,超过64位宽度的整数以数组的格式存储,对这些数字进行加法和乘法等运算需要对数组的每个元素进行操作。然而,Python中的整数支持任意位宽,并且可以使用算术符号直接计算这些大整数的算术运算,而无需额外的代码。还有许多其他情况下,Python可以加速构建参考模型并减少错误的可能性。尽管Python在性能方面可能略逊于C/C++,但在硬件验证中,准确性和效率更为重要。

    4.2.2 繁荣的开源社区

    Python在许多编程场景中被广泛应用,并且具有多种类型的库或包。使用Cocotb,将这些现有的基于Python的算法或模型实现作为硬件设计的黄金模型进行重用是非常直接的。或者基于现有的Python库或包来构建参考模型也更加方便。例如,在设计深度学习加速器时,可以将Pytorch、Tensorflow和Caffe等Python库与Cocotb测试平台轻松结合。对于一些用于SoC集成的复杂总线协议(如AXI、PCIe等)的验证,Cocotb提供了相应的开源库。通过重用现有的Python库来构建黄金模型有两个显著的优势:

    @@ -174,7 +174,7 @@ const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png"
  • 条件黄金模型的正确性或降低错误的可能性。
  • 避免从零开始构建每个验证组件,大大减少工作量。
  • -

    图片

    +

    图片

    图13: Cocotb验证中使用的不同包

    除了便于构建参考模型外,还有许多开源的Python库和包可以帮助我们编写、组织和执行验证代码。在芯片验证过程中,与模拟器进行交互并在其上执行测试台是不可避免的。Cocotb自身提供了一个Makefile模板,帮助开发人员在不使用特定的Linux命令的情况下与模拟器进行交互。编写和执行Makefile以使代码在模拟器上运行仍然有点麻烦。但是,cocotb-test包封装了对模拟器的操作,并将其作为Python函数提供给开发人员。使用cocotb-test包,用户只需要调用一个Python函数并指定其参数即可启动模拟,为cocotb提供了标准的Python单元测试功能。

    基于使用cocotb-test包,您可以使用pytest更高效地编写和管理测试程序,pytest是一个实现了完整功能的成熟Python测试工具的Python包。此外,您还可以使用pytest-xdist或pytest-parallel包在多核处理器上并行运行您的验证代码,这有助于充分利用计算能力以减少执行时间。同时,pyuvm包已经实现了UVM(通用验证方法学)的主要部分,UVM是业界最广泛使用的验证框架。基于cocotb和pyuvm,开发人员可以使用Python而不是SystemVerilog来应用UVM方法学进行验证。

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

    `;export{A as assetURLs,R as default,B as metadata,T as toc}; diff --git a/zh-cn/assets/index-25c20c62.js b/zh-cn/assets/index-24fab036.js similarity index 95% rename from zh-cn/assets/index-25c20c62.js rename to zh-cn/assets/index-24fab036.js index 3253389..aff0a01 100644 --- a/zh-cn/assets/index-25c20c62.js +++ b/zh-cn/assets/index-24fab036.js @@ -1,4 +1,4 @@ -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 语言特性和开发工具提供强大、易用、高效的硬件设计能力。

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

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

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

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

    Tooling and flow:

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

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

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

    -

    图片

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

    图片

    `;export{a as assetURLs,s as default,p as metadata,t as toc}; diff --git a/zh-cn/assets/index-6f8e9292.js b/zh-cn/assets/index-2701299c.js similarity index 93% rename from zh-cn/assets/index-6f8e9292.js rename to zh-cn/assets/index-2701299c.js index 44f0b15..9e611f9 100644 --- a/zh-cn/assets/index-6f8e9292.js +++ b/zh-cn/assets/index-2701299c.js @@ -1,4 +1,4 @@ -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 在天空计算的场景中有着更好的性能表现。

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

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

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

    图片

    直播亮点:

    @@ -11,4 +11,4 @@ const t="/zh-cn/assets/image1-3ae2277f.jpg",e="/zh-cn/assets/image1-0a18e154.png

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

    图片

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

    -

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

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

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

    `;export{a as assetURLs,s as default,i as metadata,n as toc}; diff --git a/zh-cn/assets/index-7e0a1d2c.js b/zh-cn/assets/index-2ab66d66.js similarity index 97% rename from zh-cn/assets/index-7e0a1d2c.js rename to zh-cn/assets/index-2ab66d66.js index ec6d1be..dcec8e3 100644 --- a/zh-cn/assets/index-7e0a1d2c.js +++ b/zh-cn/assets/index-2ab66d66.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!"},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=`

    图片

    +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}],s=`

    图片

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

    图片

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

    封面

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

    封面

    倒计时

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

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

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

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

    封面

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

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

    `;export{o as assetURLs,p as default,r as metadata,e as toc}; diff --git a/zh-cn/assets/index-40aedb60.js b/zh-cn/assets/index-2bfed728.js similarity index 98% rename from zh-cn/assets/index-40aedb60.js rename to zh-cn/assets/index-2bfed728.js index 7811479..6c36a0b 100644 --- a/zh-cn/assets/index-40aedb60.js +++ b/zh-cn/assets/index-2bfed728.js @@ -1,4 +1,4 @@ -const s="/zh-cn/assets/image1-85650830.png",a="/zh-cn/assets/image2-d3ac686f.png",t="/zh-cn/assets/image3-d19685f7.png",e="/zh-cn/assets/image4-22c90bed.png",l="/zh-cn/assets/image5-060ec542.png",p="/zh-cn/assets/image6-e95accb5.png",n="/zh-cn/assets/image7-39b0aa47.png",c="/zh-cn/assets/image8-f5342e9f.png",i="/zh-cn/assets/image9-f8fdd108.png",r="/zh-cn/assets/image10-fea0520f.png",C="/zh-cn/assets/image11-3896bab5.png",o="/zh-cn/assets/image12-5d3c96d7.png",h="/zh-cn/assets/image13-56596c1a.png",d="/zh-cn/assets/image14-1cff1399.png",u="/zh-cn/assets/image15-f50d9208.png",g="/zh-cn/assets/image16-73064f95.png",m="/zh-cn/assets/image17-8fbf2614.png",R="/zh-cn/assets/image18-04a62cf7.png",_="/zh-cn/assets/image19-b4bc01e2.png",b="/zh-cn/assets/image20-41386794.png",j="/zh-cn/assets/image21-453c426e.png",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=`

    引 言

    +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",S="/zh-cn/assets/image22-e0049342.png",E="/zh-cn/assets/image23-989a38cf.png",y=[s,a,t,e,l,p,n,c,i,r,C,o,h,d,u,m,g,R,_,b,j,S,E],f={label:"基于BSV的高性能并行CRC硬件电路生成器",description:"循环冗余校验码,即Cyclic Redundancy Check (CRC), 是一种在各种通信系统中广泛应用的检错机制。CRC算法的工作原理和哈希函数类似,具体来说,其对任意长度的数据计算出一段唯一的标识(校验和), 然后根据这个标识来判断该数据在传输过程中是否发生变化。CRC检错码在实际生活中有着广泛的应用,诸如网络通信,存储系统等场景下都需要CRC来保证数据传输的正确性。而不同的应用场景往往需要采用不同的CRC配置参数,同时对计算的性能也有不同的需求。例如,在基于Ethernet协议的网络传输中需要采用IEEE802-3协议所规定的CRC参数,同时需要高吞吐率的CRC实现以和网络带宽相匹配。",location:"中国香港",author:["翁万正"],tags:["硬件加速"],date:"2023-07-27",title:"BSV based high performance parallel CRC hardware circuit generator"},x=[{label:"引 言",level:2},{label:"算法原理",level:2},{label:"CRC 计算的定义",level:3},{label:"电路架构与性能",level:2},{label:"架构设计",level:3},{label:"性能与面积",level:3},{label:"使用指南",level:2},{label:"配置参数",level:3},{label:"输入输出接口",level:3},{label:"BSV 使用接口",level:3},{label:"Verilog 使用接口",level:3},{label:"引用和链接",level:2}],v=`

    引 言

    循环冗余校验码,即 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)]相加。同样我们可以通过硬件查找表的方式完成这里校验和的计算。

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

      封面

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

      封面

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

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

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

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

    • 变量 msgs 作为消息池,用于记录所有正在传输的消息,初始值是一个空集。

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

    -

    图片

    +

    图片

    • TLA+ 中可以用上述方式定义类似于其它编程语言中"函数"概念的表达式,这样就无需对每一个 Resource Manager 都定义一个表达式了。
    • [type → "prepare", rm → r] 是一个 TLA+ 中的 record,类似于其它编程语言中的 struct。
    • @@ -114,7 +114,7 @@ Next 用于定义状态转换关系。

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

      图片

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

      -

      图片

      +

      图片

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

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

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

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

      我们的项目:Xline

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

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

      -

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

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

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

      `;export{m as assetURLs,A as default,g as metadata,h as toc}; diff --git a/zh-cn/assets/index-043be87f.js b/zh-cn/assets/index-35dfbee0.js similarity index 91% rename from zh-cn/assets/index-043be87f.js rename to zh-cn/assets/index-35dfbee0.js index cdbb6b7..28c9d38 100644 --- a/zh-cn/assets/index-043be87f.js +++ b/zh-cn/assets/index-35dfbee0.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],c={label:"直播预告 | RDMA软件接口高层封装",description:"RDMA 作为高速通信协议被数据中心广泛使用,但是因为底层接口设计得过于繁复,对使用者造成了很大的不便,因此我们使用 Rust 语言对 RDMA 进行了一层高层封装。这次分享将介绍这层封装的做法和原理。",cover:"./cover.png",location:"香港",date:"2022-05-17",title:"RDMA Software Interface High Level Package"},l=[{label:"嘉宾介绍",level:2},{label:"讨论内容",level:2},{label:"观看方式",level:2},{label:"特别鸣谢",level:2}],n=`

      嘉宾介绍

      +const p="/zh-cn/assets/cover-39643179.png",e="/zh-cn/assets/image1-a93ba076.jpg",t="/zh-cn/assets/image2-4624885a.gif",s="/zh-cn/assets/image3-ea54df7e.jpg",a=[p,e,t,s],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 岁以下创业者“称号。

      讨论内容

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

      图片

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

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

      -

      图片

      +

      图片

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

      `;export{a as assetURLs,n as default,c as metadata,l as toc}; diff --git a/zh-cn/assets/index-87f0525d.js b/zh-cn/assets/index-3d206f46.js similarity index 98% rename from zh-cn/assets/index-87f0525d.js rename to zh-cn/assets/index-3d206f46.js index 6ec03d7..61d3b2c 100644 --- a/zh-cn/assets/index-87f0525d.js +++ b/zh-cn/assets/index-3d206f46.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/cover-1329fc54.png",l="/zh-cn/assets/image1-03c3323d.png",s="/zh-cn/assets/image2-19f32eff.png",i="/zh-cn/assets/image3-7a5e2db9.png",a="/zh-cn/assets/image4-a055bd84.png",t="/zh-cn/assets/image5-b8622f96.png",p="/zh-cn/assets/image6-5093ee75.png",n="/zh-cn/assets/image7-9fa09d91.png",o="/zh-cn/assets/image8-84dd6aec.png",c="/zh-cn/assets/image9-2f762488.png",r="/zh-cn/assets/image10-f2b55246.png",h="/zh-cn/assets/image11-c5d501bb.png",d="/zh-cn/assets/image12-56434254.png",m="/zh-cn/assets/image13-1c12a6c5.png",u="/zh-cn/assets/image14-69943dbe.png",b="/zh-cn/assets/image15-45a7b638.png",g="/zh-cn/assets/image16-5b765721.jpg",f="/zh-cn/assets/image17-8fb19d7c.jpg",R="/zh-cn/assets/image18-c8c4d5a1.jpg",S="/zh-cn/assets/image19-fb1e5167.png",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=`

      图片

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

      图片

      在 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,v as metadata,M as toc}; +

      图片

      `;export{S as assetURLs,C as default,M as metadata,v as toc}; diff --git a/zh-cn/assets/index-16f06676.js b/zh-cn/assets/index-4d1333f2.js similarity index 98% rename from zh-cn/assets/index-16f06676.js rename to zh-cn/assets/index-4d1333f2.js index cfdab04..5b12e33 100644 --- a/zh-cn/assets/index-16f06676.js +++ b/zh-cn/assets/index-4d1333f2.js @@ -1,4 +1,4 @@ -const o="/zh-cn/assets/image1-fe10a0d4.jpg",t="/zh-cn/assets/image2-86112638.jpg",n=[o,t],r={label:"倒计时6天 | 机遇与挑战-生成式AI的发展趋势和落地应用",description:"生成式AI作为人工智能的重要分支,在语言模型、图像生成、音乐创作等领域都取得了突破性地进展。技术的发展,也伴随着机遇、挑战与难题。本周日(8月6日)在北京,将由亚马逊云科技和真格基金主办,达坦科技和INP协办举行一场关于生成式AI的闭门沙龙,主题为“机遇与挑战——生成式AI的发展趋势和落地应用”。",location:"新疆",date:"2023-08-01",title:"Countdown to 6 days l Opportunities and Challenges The Development Trend of Generative AI and its Application on the Ground"},e=[],s=`

      生成式 AI 作为人工智能的重要分支,在语言模型、图像生成、音乐创作等领域都取得了突破性地进展。技术的发展,也伴随着机遇、挑战与难题。本周日(8 月 6 日)在北京,将由亚马逊云科技和真格基金主办,达坦科技和 INP 协办举行一场关于生成式 AI 的闭门沙龙,主题为“机遇与挑战——生成式 AI 的发展趋势和落地应用”。

      +const o="/zh-cn/assets/image1-fe10a0d4.jpg",t="/zh-cn/assets/image2-86112638.jpg",n=[o,t],r={label:"倒计时6天 | 机遇与挑战-生成式AI的发展趋势和落地应用",description:"生成式AI作为人工智能的重要分支,在语言模型、图像生成、音乐创作等领域都取得了突破性地进展。技术的发展,也伴随着机遇、挑战与难题。本周日(8月6日)在北京,将由亚马逊云科技和真格基金主办,达坦科技和INP协办举行一场关于生成式AI的闭门沙龙,主题为“机遇与挑战——生成式AI的发展趋势和落地应用”。",location:"新疆",date:"2023-08-01",title:"Countdown to 6 days l Opportunities and Challenges The Development Trend of Generative AI and its Application on the Ground"},s=[],e=`

      生成式 AI 作为人工智能的重要分支,在语言模型、图像生成、音乐创作等领域都取得了突破性地进展。技术的发展,也伴随着机遇、挑战与难题。本周日(8 月 6 日)在北京,将由亚马逊云科技和真格基金主办,达坦科技和 INP 协办举行一场关于生成式 AI 的闭门沙龙,主题为“机遇与挑战——生成式 AI 的发展趋势和落地应用”。

      我们邀请了国内外知名的 AI Infra/应用创业者、硬核 NLP/LLM 专家、咨询大咖,分享在生成式 AI 研究和实践中的经验,通过具体的案例,探讨生成式 AI 在不同领域的落地应用和挑战,揭示其对产业升级和创新的重要作用。

      图片

      本次闭门沙龙邀请到的 AI Infra/应用创业者、硬核 NLP/LLM 专家、咨询大咖有(以下介绍按照姓氏字母排序):

      @@ -50,4 +50,4 @@ At Stochastic, he focus on developing Enterprise-ready LLM system that trains lo 通用工具与行业客户需求不匹配怎么办?
      是否要出海?中美两地的生态差异?
      AI PaaS+SaaS 工具选择最佳实践+避坑指南。
      -以及其他你在报名表中提交的想要讨论的话题......

      `;export{n as assetURLs,s as default,r as metadata,e as toc}; +以及其他你在报名表中提交的想要讨论的话题......

      `;export{n as assetURLs,e as default,r as metadata,s as toc}; diff --git a/zh-cn/assets/index-1179d885.js b/zh-cn/assets/index-4e03f569.js similarity index 97% rename from zh-cn/assets/index-1179d885.js rename to zh-cn/assets/index-4e03f569.js index b0b0d1b..e782740 100644 --- a/zh-cn/assets/index-1179d885.js +++ b/zh-cn/assets/index-4e03f569.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-9c53ea5f.png",l="/zh-cn/assets/image1-0a18e154.png",e=[t,l],s={label:"欢迎加入达坦科技硬件设计学习社区",description:"近年来随着Bluespec、Chisel、SpinalHDL、PyMTL等一众新一代HDL的推出,业界逐步感受到新一代HDL在数字芯片设计效率方面的提升。相比Verilog和VHDL,这些新一代HDL在语法表达能力、代码简洁程度、错误检查等方面有不小的提升;相比高阶综合HLS,这些新一代HDL支持RTL级描述能力,在芯片性能的把控方面远超HSL。数字芯片的敏捷设计,其目的就是为了提升硬件设计效率,减少人为错误。无论用哪一种语言进行硬件设计,背后扎实的硬件设计相关知识是必不可少的,特别是体系结构,因为体系结构专门研究CPU设计,而CPU是当今最复杂的数字芯片之一,各种常见的数字芯片设计问题在体系结构领域都能找到对应的参照,诸如流水线、缓存、内存管理、缓存一致性、异常处理等等。",cover:"./cover.png",location:"新加坡",date:"2023-01-12",title:"Welcome to join Datan Technology hardware design learning community"},r=[{label:"学习目的",level:2},{label:"学习内容",level:2},{label:"适合人群",level:2},{label:"学习方式",level:2},{label:"学习规划",level:2},{label:"参与方式",level:2}],o=`

      近年来随着 Bluespec、Chisel、SpinalHDL、PyMTL 等一众新一代 HDL 的推出,业界逐步感受到新一代 HDL 在数字芯片设计效率方面的提升。相比 Verilog 和 VHDL,这些新一代 HDL 在语法表达能力、代码简洁程度、错误检查等方面有不小的提升;相比高阶综合 HLS,这些新一代 HDL 支持 RTL 级描述能力,在芯片性能的把控方面远超 HSL。数字芯片的敏捷设计,其目的就是为了提升硬件设计效率,减少人为错误。无论用哪一种语言进行硬件设计,背后扎实的硬件设计相关知识是必不可少的,特别是体系结构,因为体系结构专门研究 CPU 设计,而 CPU 是当今最复杂的数字芯片之一,各种常见的数字芯片设计问题在体系结构领域都能找到对应的参照,诸如流水线、缓存、内存管理、缓存一致性、异常处理等等。

      +const t="/zh-cn/assets/cover-9c53ea5f.png",l="/zh-cn/assets/image1-0a18e154.png",e=[t,l],r={label:"欢迎加入达坦科技硬件设计学习社区",description:"近年来随着Bluespec、Chisel、SpinalHDL、PyMTL等一众新一代HDL的推出,业界逐步感受到新一代HDL在数字芯片设计效率方面的提升。相比Verilog和VHDL,这些新一代HDL在语法表达能力、代码简洁程度、错误检查等方面有不小的提升;相比高阶综合HLS,这些新一代HDL支持RTL级描述能力,在芯片性能的把控方面远超HSL。数字芯片的敏捷设计,其目的就是为了提升硬件设计效率,减少人为错误。无论用哪一种语言进行硬件设计,背后扎实的硬件设计相关知识是必不可少的,特别是体系结构,因为体系结构专门研究CPU设计,而CPU是当今最复杂的数字芯片之一,各种常见的数字芯片设计问题在体系结构领域都能找到对应的参照,诸如流水线、缓存、内存管理、缓存一致性、异常处理等等。",cover:"./cover.png",location:"新加坡",date:"2023-01-12",title:"Welcome to join Datan Technology hardware design learning community"},s=[{label:"学习目的",level:2},{label:"学习内容",level:2},{label:"适合人群",level:2},{label:"学习方式",level:2},{label:"学习规划",level:2},{label:"参与方式",level:2}],o=`

      近年来随着 Bluespec、Chisel、SpinalHDL、PyMTL 等一众新一代 HDL 的推出,业界逐步感受到新一代 HDL 在数字芯片设计效率方面的提升。相比 Verilog 和 VHDL,这些新一代 HDL 在语法表达能力、代码简洁程度、错误检查等方面有不小的提升;相比高阶综合 HLS,这些新一代 HDL 支持 RTL 级描述能力,在芯片性能的把控方面远超 HSL。数字芯片的敏捷设计,其目的就是为了提升硬件设计效率,减少人为错误。无论用哪一种语言进行硬件设计,背后扎实的硬件设计相关知识是必不可少的,特别是体系结构,因为体系结构专门研究 CPU 设计,而 CPU 是当今最复杂的数字芯片之一,各种常见的数字芯片设计问题在体系结构领域都能找到对应的参照,诸如流水线、缓存、内存管理、缓存一致性、异常处理等等。

      虽然国内大专院校计算机科学和电子工程专业都有开设体系结构或组成原理等相关课程,但是在实操环节缺失很多内容,特别是 CPU 里缓存、内存管理、异常处理相关的部分,基本上都不涉及。但是随着数字芯片的规模越来越大,芯片设计的复杂度指数级上升,对数字芯片的设计人员有很高的要求。当有志从事数字芯片设计的同学从学校走向社会,如何理解数字芯片设计的精髓,提升设计能力,成为能否胜任数字芯片设计工作的关键。

      为此,达坦科技在 2023 年始,发起成立硬件设计学习社区,诚邀所有对硬件敏捷开发设计感兴趣的同学加入我们的学习社区。这里有志同道合的小伙伴,共同学习目标的互助自学小组,有耐心答疑的助教。我们一起花一个月的时间,系统地学习计算机体系结构相关知识,并且通过动手项目来验证学习的成果。

      学习目的

      @@ -42,4 +42,4 @@ const t="/zh-cn/assets/cover-9c53ea5f.png",l="/zh-cn/assets/image1-0a18e154.png"
    • 准备好个人的简历,内容包括但不局限于:学校/专业、过往学术/项目经验
    • 扫码联系小助手报名邮箱info@datenlord.io注册学习档案,通过后加入硬件设计学习社区群即参与成功。
    -

    图片

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

    图片

    `;export{e as assetURLs,o as default,r as metadata,s as toc}; diff --git a/zh-cn/assets/index-b5bb516b.js b/zh-cn/assets/index-50ad21f0.js similarity index 93% rename from zh-cn/assets/index-b5bb516b.js rename to zh-cn/assets/index-50ad21f0.js index 93c613d..b5a596d 100644 --- a/zh-cn/assets/index-b5bb516b.js +++ b/zh-cn/assets/index-50ad21f0.js @@ -1,4 +1,4 @@ -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=`

    封面

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

    封面

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

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

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

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

    封面

    +

    封面

    • 提交报名表,报名通过后,给予学号,以便后续追踪同学的学习进展。
    • 引入打卡制度: @@ -44,6 +44,6 @@ const e="/zh-cn/assets/cover-2326b9d3.jpg",i="/zh-cn/assets/image1-62ba36d5.png"

      欢迎报名

      请扫描二维码, 填写报名表,加入 MIT 体系结构公开课学习社区项目。

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

      -

      图片

      +

      图片

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

      -

      图片

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

      图片

      `;export{s as assetURLs,n as default,a as metadata,c as toc}; diff --git a/zh-cn/assets/index-5130399c.js b/zh-cn/assets/index-5130399c.js new file mode 100644 index 0000000..1c642b2 --- /dev/null +++ b/zh-cn/assets/index-5130399c.js @@ -0,0 +1,726 @@ +const s="/zh-cn/assets/cover-bb683e66.webp",a="/zh-cn/assets/image1-67dc5aad.webp",l="/zh-cn/assets/image2-5e5cc8ab.webp",n=[s,a,l],p={label:"常见设计模式及其Rust实现",description:"本文提供了一个设计模式的综合概述,涵盖了设计模式的必要性,基本原则以及23种常见模式的概括性描述。结合Rust语言自身的特性,重点阐述了Rust中Builder,Combinator,RAII,Typestate(state machine), Command, Strategy和Visitor七种设计模式的应用。本文前半部分主要在阐述设计模式的思想和具体实例,如果读者已经很熟悉这一部分,可以自行跳转到第二小节。",cover:"./cover.webp",location:"中国香港",author:["邱奇琛"],date:"2024-04-25",title:"Common Design Patterns and Their Rust Implementations"},e=[{label:"速览设计模式",level:2},{label:"为什么需要设计模式",level:3},{label:"设计模式中的基本原则",level:3},{label:"常见设计模式",level:3},{label:"Rust 中设计模式的应用",level:2},{label:"Builder",level:3},{label:"Combinator",level:3},{label:"RAII",level:3},{label:"Typestate",level:3},{label:"Command",level:3},{label:"Strategy",level:3},{label:"Visitor",level:3},{label:"参考",level:2}],t=`

      封面

      +

      本文提供了一个设计模式的综合概述,涵盖了设计模式的必要性,基本原则以及 23 种常见模式的概括性描述。结合 Rust 语言自身的特性,重点阐述了 Rust 中 Builder,Combinator,RAII,Typestate(state machine), Command, Strategy 和 Visitor 七种设计模式的应用。本文前半部分主要在阐述设计模式的思想和具体实例,如果读者已经很熟悉这一部分,可以自行跳转到第二小节。

      +

      速览设计模式

      +

      为什么需要设计模式

      +
        +
      • 减小代码的耦合程度
      • +
      +

      低耦合度的系统更易于管理和扩展,同时降低了修改一个组件时影响其他组件的风险。具体来说,低耦合的系统能够更方便添加新的功能,也有益于单元测试的划分。

      +
        +
      • 良好的编程范式有利于避免一些逻辑错误
      • +
      +

      设计模式提供了一套经过验证的最佳实践,帮助程序员遵循良好的编程原则,如单一责任原则和开闭原则等。这些原则和模式指导开发者如何正确地组织代码结构和逻辑,从而减少编程中可能出现的逻辑错误。例如,在状态机模式中,使用者不能调用非当前状态的方法;在 RAII 模式中,资源会在变量被释放时自动释放。

      +
        +
      • 有利于代码复用
      • +
      +

      设计模式鼓励使用通用的方法来解决相似问题。这种方式使得核心算法的设计得以复用,而具体的步骤可以根据不同的需求进行调整和重用。

      +

      设计模式中的基本原则

      +

      设计模式中著名的 SOLID 原则概括了面向对象设计的五个基本法则,帮助开发者构建更健壮、灵活的系统。在设计代码架构时,开发者不应仅限于应用常见的设计模式,而应深入理解并实践 SOLID 的核心思想。

      +
        +
      • 单一职责 (Single Responsibility Principle, SRP)
      • +
      +

      每个类应只有一个引起变化的原因,即一个类应只负责一项任务或功能。

      +
        +
      • 开闭原则 (Open/Closed Principle, OCP)
      • +
      +

      软件实体(如类、模块、函数等)应对扩展开放,对修改关闭。这通常通过使用接口或抽象类实现,允许通过添加新的子类来扩展功能,而不需修改现有代码。

      +
        +
      • 里氏替换 (Liskov Substitution Principle, LSP)
      • +
      +

      子类对象应能够替换它们的父类对象而不破坏程序的正确性。设计子类时,应保证能够替代父类功能,不引入额外异常行为或削弱原有功能。

      +
        +
      • 接口隔离 (Interface Segregation Principle, ISP)
      • +
      +

      应将大接口(提供多功能的接口)拆分为更小、更具体的接口,使实现接口的类只需关心它们真正需要的方法。

      +
        +
      • 依赖倒置(Dependency Inversion Principle, DIP)
      • +
      +

      高层模块不应依赖于低层模块,两者都应依赖于抽象。抽象不应依赖于细节,细节应依赖于抽象。

      +
        +
      • 迪米特法则(Law of Demeter)
      • +
      +

      除此以外,GoF 一书还提到了迪米特法则(Law of Demeter),也称为最少知识原则。如果两个实体不需要直接通信,就不应发生直接调用。例如,使用 a.Method()而非 a.b.Method()可以减少系统耦合,增强可修改性和扩展性。

      +

      常见设计模式

      +

      介绍设计模式及其应用的博客在互联网上已经有很多,本文不打算再进行重复,而是试图用简短的语句向读者概括一下设计模式及其使用的场景。如果读者不了解设计模式,可以搜索对应的关键词查看其他博客。

      +

      下面简单介绍了各种模式的含义和常用场景。

      +

      建造型

      +
        +
      • 工厂模式 Factory
      • +
      +

      定义一个创建对象的接口,让子类决定实例化哪一个类,使得类的实例化延迟到子类中。
      +当类的初始化需要依赖于具体情况和配置时,往往会用这种方式

      +
        +
      • 抽象工厂 Abstract Factory
      • +
      +

      定义一个接口来创建几种不同种类的类,其中每个种类可能有若干相互依赖的组件。用户无需指定需要用哪些特定的组件。
      +当需要创建一组相关或依赖的对象时,会使用这种方式。

      +
        +
      • 建造者 Builder
      • +
      +

      定义一个接口,允许用户指定对象的步骤和过程;核心是分离的构造和表示两个步骤。
      +主要用于创建复杂的对象,或者希望用相同的创建过程可以创建不同的表示。

      +
        +
      • 原型 Prototype
      • +
      +

      通过复制的方式创建对象。
      +使用于构造表示比较复杂的对象。

      +
        +
      • 单例 Singleton
      • +
      +

      确保一个类只能有一个示例,并提供一个全局访问点来获取这个实例的设计模式
      +当全局只需要一个实例时常用这种模式(例如线程池)

      +

      结构型

      +
        +
      • 适配器 Adapter
      • +
      +

      创建一个中间层,使得已有接口和新接口能交互。
      +一般已有接口是不可变或不方便修改的,例如 glibc 库等等

      +
        +
      • 组合 Composite
      • +
      +

      将对象组合为树形结构,上层对象会对用下层方法完成某个操作。这使得对单个对象和组合对象的使用具有一致性。
      +一般在需要同时处理复杂对象和简单对象时,这种模式比较常用

      +
        +
      • 桥接 Birdge
      • +
      +

      将抽象部分和实现部分通过组合的方式分离(组合替代继承)
      +很多时候都会用到这个模式,例如拆分庞大功能的类。

      +
        +
      • 代理 Proxy
      • +
      +

      通过一个对象管理资源的访问
      +当访问资源开销较大,或需要权限检查等额外功能时,会使用这个模式

      +
        +
      • 装饰器 Decorator
      • +
      +

      定义函数的接口与被覆盖函数的接口相同,用户可以无感调用拓展功能的接口
      +适合在原接口上无感拓展新的功能。

      +
        +
      • 享元 Flywight
      • +
      +

      当有大量结构体共享一部分相同的数据时,将这部分数据独立出来,所有结构体共享这部分数据。
      +适用于不可变状态较多时节省内存。

      +
        +
      • 外观 Facade
      • +
      +

      将许多抽象的小接口汇聚为一个对象,对象内部不对接口做任何处理
      +主要用于向外部提供统一接口

      +

      行为型

      +
        +
      • 职责链 Chiain of responsibility
      • +
      +

      让请求以链式的形式逐一被处理。
      +解耦发送者和执行者时常用

      +
        +
      • 命令 Command
      • +
      +

      将操作抽象为对象(通过函数指针等形式),从而允许使用不同的请求、队列或日志来参数化其他对象。
      +常用于参数化对象或者排队执行一些操作。

      +
        +
      • 策略 Strategy
      • +
      +

      通过不同的上下文执行不同的算法变体,分离业务逻辑和具体的算法实现细节
      +通常用来抽象做一件事的多种方式。

      +
        +
      • 迭代器 Iterator
      • +
      +

      隐藏迭代的细节,简化用户访问某个数据结构的代码
      +访问各种数据结构时都可用

      +
        +
      • 状态 State
      • +
      +

      将不同的状态设计为不同的类
      +当涉及到状态控制和转移的时候常用

      +
        +
      • 备忘录 Memento
      • +
      +

      将数据结构的状态保存一份,用于后续恢复状态
      +常用于做 snapshot 等恢复状态的操作。

      +
        +
      • 模板 Template
      • +
      +

      在父类定义一个算法框架,子类实现算法的特定部分。
      +常用于一些有固定执行逻辑的算法。

      +
        +
      • 观察者 Observer
      • +
      +

      订阅监听模式,使用一个对象维护事件和对象间的一对多关系,当被监听事件产生时,会通知每个监听的对象
      +常用于需要处理事件,绑定回调函数的场景

      +
        +
      • 访问者 Visitor
      • +
      +

      将算法与其作用的对象结构分离,通过在被访问的对象中添加一个接受方法来接受访问者,从而实现在不修改这些对象的类的情况下定义新的操作。
      +通常访问异构数据结构(例如树型)时常用

      +
        +
      • 中介者 Mediator
      • +
      +

      引入一个中心对象来简化多个对象间的通信,从而减少这些对象之间的直接引用
      +通常用于解耦数据结构的的相互引用

      +
        +
      • 解释器 interprete
      • +
      +

      定义了一种语法用于特定的问题,并通过一个解释器来解释语言中的句子,用于实现语言的语法或表达式的解析和执行。 +当特定问题有特定的写法时,常用 interpreter 来解决。

      +

      Rust 中设计模式的应用

      +

      Rust 设计之初就在语言嵌入了很多优雅的模式,例如模式匹配,所有权机制,零成本抽象等等。下面,我们以 Rust 语言为例,介绍如何结合语言特性更好地利用设计模式。

      +

      Builder

      +

      Builder 可能是 Rust 中应用最多的设计模式。
      +定义一个函数的接口不总是那么简单,尤其是当你遇到下面的情况时:

      +
        +
      • 有大量参数
      • +
      • 有多个可选参数
      • +
      • 只有某些参数的组合是有效的
      • +
      +

      加之 Rust 语言设计没有类似 Python 的关键字参数等特性,且不支持直接的函数重载,让我们处理复杂的接口定义更加棘手。

      +
      +

      Rust 并不是没有重载,相反,trait 中可以定义一个和类型实现中同名的方法,这就是一种重载。可以参考这篇文章:
      +Abstraction without overhead: traits in Rust
      +https://blog.rust-lang.org/2015/05/11/traits.html

      +
      +

      例如,我们需要一个函数来处理打开文件的选项。

      +
      fn set_flag(
      +    is_read: bool,is_write: bool,is_append: bool,is_truncate: bool,is_create: bool,
      +) -> u32 {
      +    let mut flag = 0;
      +    if is_read {
      +        flag |= 0x0001;
      +    }
      +    // ....
      +    flag
      +}
      +
      +fn main(){
      +    let flag = set_flag(true, true, false, false, false);
      +}
      +
      +

      这种写法可读性很差,非常有可能导致你传错参数。

      +

      一种做法是将上面的参数组合为一个结构体,然后在结构体中实现约束。作为一个特殊的例子,我们可以直接用 bitflag 去抽象上面的参数。

      +

      另一种做法是使用 builder。std 中的 fs::OpenOptions 就使用了这种写法。

      +

      以用读/写权限打开 foo.txt 为例:

      +
      use std::fs::OpenOptions;
      +let file = OpenOptions::new()
      +    .read(true)
      +    .write(true)
      +    .open("foo.txt");
      +
      +

      这种写法就十分的清晰。让我们来看看 std 中这个结构体的实现:

      +
      // unix OpenOptions: library/std/src/sys/pal/unix/fs.rs
      +// library/std/src/fs.rs
      +pub struct OpenOptions(OpenOptions);
      +impl OpenOptions {
      +    pub fn read(&mut self, read: bool) -> &mut Self {
      +        self.0.read(read);
      +        self
      +    }
      +    pub fn write(&mut self, write: bool) -> &mut Self {
      +        self.0.write(write);
      +        self
      +    }
      +    pub fn open<P: AsRef<Path>>(&self, path: P) -> io::Result<File> {
      +        // self._open调用了对应操作系统抽象层的open函数
      +        self._open(path.as_ref())
      +    }
      +}
      +
      +

      可以看到,在设置完参数 flag(read/write)后,会返回 builder 自己的可修改引用,这样就能使用链式调用了。

      +

      Builder 这个设计模式的写法是相对比较固定的,因此有人开发了 derive_builder 这个 crate,你可以通过添加 attribute 的形式快速为一个结构体添加它的 builder。

      +
      #[derive(Default, Builder, Debug)]
      +#[builder(setter(into))]
      +struct Channel {
      +    token: i32,
      +    special_info: i32,
      +}
      +fn main() {
      +    let ch = ChannelBuilder::default()
      +        .special_info(42u8)
      +        .token(19124)
      +        .build()
      +        .unwrap();
      +    println!("{:?}", ch);
      +}
      +
      +

      这样生成出来的 Builder 模式是比较固定的,读者自己参照这个模式去实现。如果需要定制化地实现一个建造者,可以阅读 Rust API 指南中的几个 tips 后再进行实现。

      +

      Combinator

      +

      Combinator 是一个函数式编程的概念,但如今也在许多函数是一等公民的语言中。Combinator 指的是一个函数仅通过其他函数的组合来完成工作。在 Rust 中,最常见的应用是在异常处理中(Option and Result)。当然,上面的 builder 也是 combinator 一个特化形式。Option 和 Result 提供了大量 combinator 函数供用户转换和处理异常,同时提供了?语法糖简化常见的 match 语句。下面以 option 的 API 为例,简单介绍如何写出 combinator 风格的错误处理。Option 提供了一系列 Transform 高阶函数,例如:

      +
        +
      • Option -> Result : Option::ok_or, Option::ok_or_else
      • +
      • Option<T> -> Option<T> : Filter
      • +
      • Option<Option<T>> -> Option<T> : flatten
      • +
      • Option<T> -> Option<U> : map,map_or, map_or_else
      • +
      • Option<T> -> Option<(T,U)> : zip, zip_with, unzip.
      • +
      +
      let maybe_some_string = Some(String::from("Hello, World!"));
      +
      +let maybe_some_len = maybe_some_string.map(|s| s.len());
      +assert_eq!(maybe_some_len, Some(13));
      +
      +let x: Option<&str> = None;
      +assert_eq!(x.map(|s| s.len()), None);
      +
      +

      此外,我们可以对 Option 做 bool 操作。例如调用 Option::and。如果调用的 Option 不为空,且传入的 Option 也不为空,则返回 Option。我们也可以传入一个函数。Option::and_then()传入一个函数,该函数接收一个 Option 内部的类型。如果 Option 非空,则执行这个函数。and_then 能帮助你更好地处理异常。Rust example 上有这样一个例子。例如,有下面两种结构体,Food 和 Day。

      +
      #[derive(Debug)] enum Food { CordonBleu, Steak, Sushi }
      +#[derive(Debug)] enum Day { Monday, Tuesday, Wednesday }
      +
      +

      当 Food 为 Sushi 时,have_ingredients 返回一个 None,表示没有原料;当 Food 为 CordonBleu,have_recipe 返回一个 None,表示没有菜谱。

      +
      fn have_ingredients(food: Food) -> Option<Food> {
      +    match food {
      +        Food::Sushi => None,
      +        _           => Some(food),
      +    }
      +}
      +
      +fn have_recipe(food: Food) -> Option<Food> {
      +    match food {
      +        Food::CordonBleu => None,
      +        _                => Some(food),
      +    }
      +}
      +
      +

      接下来要实现一个 cookable 函数,表示一个食物既有菜谱,又有原料,如果使用 match 语句就会显得有点冗长。我们可以使用 option 中的 and_then 将其转化为 combinator。

      +
      fn cookable(food: Food) -> Option<Food> {
      +    have_recipe(food).and_then(have_ingredients)
      +}
      +
      +

      如果 have_recipe 返回 None,那么这个函数也会返回 None。否则,它会执行 have_ingredients 再去检查。事实上,and_then 内部也是一个 match 语句。虽然这样写编译的产物没有发生很大变化,但是使用 combinator 后整体的逻辑变得更加清晰,同时也有利于编译器做优化。

      +
          pub fn and_then<U, F>(self, f: F) -> Option<U>
      +    where
      +        F: FnOnce(T) -> Option<U>,
      +    {
      +        match self {
      +            Some(x) => f(x),
      +            None => None,
      +        }
      +    }
      +
      +

      RAII

      +

      RAII 指的是 Resource Acquisition Is Initialization,意思是资源初始化在对象的构造器中完成,最终化(资源释放)在析构器中完成。RAII 可以简化类似 C 中复杂的异常处理,同时又可以避免程序员一些逻辑错误导致资源没有释放。

      +

      图片

      +

      利用 RAII 的思想,可以设计一类 Guard 结构体,它们提供对资源访问的唯一安全接口。Rust 中 Mutex 等锁就利用了这一思想。

      +

      一个 C 风格的锁如下面的代码所示:

      +
      struct Mutex<T> {
      +    data: UnsafeCell<T>,
      +    system_mutex: SystemMutex,
      +}
      +
      +impl<T> Mutex<T> {
      +    pub fn new(t: T) -> Self { /* .. */}
      +    pub fn lock(&self) -> &mut T {
      +        self.system_mutex.lock();
      +        unsafe { &mut *self.data.get() }
      +    }
      +     pub fn unlock(&self) {
      +        self.system_mutex.unlock();
      +    }
      +}
      +
      +

      用户需要调用 unlock 来解锁。这么写可能有个问题:

      +
        +
      • 调用者调用 lock 后,忘记 unlcok 了,导致死锁,这种情形在多出口的 while 循环中很常见。
      • +
      +

      在标准库中,调用 Mutex::lock 后,不会返回对资源的直接引用,而是一个被 MutexGuard 保护的资源的引用:

      +
      pub struct MutexGuard<'a, T: ?Sized + 'a> {
      +    lock: &'a Mutex<T>,
      +}
      +
      +impl<'a, T> MutexGuard<'a, T> {
      +    fn new(lock: &'a Mutex<T>) -> Self {
      +        lock.system_mutex.lock();
      +        MutexGuard { lock }
      +    }
      +
      +     fn get(&mut self) -> &mut T {
      +        &mut *self.lock.get_mut()
      +    }
      +}
      +
      +

      调用者可以调用 guard 的 get 方法来获取内部引用。
      +同时,Guard 还实现了 drop 特性:

      +
      impl<'a, T:?Sized> Drop for MutexGuard<'a, T> {
      +    fn drop(&mut self) {
      +        self.lock.system_mutex.unlock();
      +    }
      +}
      +
      +

      当 Guard 离开作用域时,就会自动调用 unlock 方法解锁。除了使用 Guard 的方式保护内部变量,还可以提供回调接口的方式进行保护。比如

      +
      impl<T> Mutex<T> {
      +    pub fn lock_closure(&self, mut f: impl FnMut(&mut T)) {
      +        self.system_mutex.lock();
      +        f(self.get_mut());
      +        self.system_mutex.unlock();
      +    }
      +}
      +
      +
        +
      • Guard 保护的一般是完整的结构体,如果想要用户只能访问结构体内部的某些字段,除了可以用多个锁的方案,可以尝试 parking_lot 中的 try_map 方法。
      • +
      +

      Guard 最场景的用途是在锁资源的保护中,但并不意味着这种模式只能用于锁,当我们需要实现一些延迟访问或者批量处理的操作也可以用这个模式。

      +

      Typestate

      +

      typestate 是 Rust 中另一个经典的模式。传统的状态模式用一个枚举值来表示状态,而 Rust 中你可以利用 enum 的特性来实现使用基于类型的状态管理。这个模式被称为 Typestate,也有称为 session type。Typestate 相较于传统的枚举值有很多好处:

      +
        +
      • 防止用户从非开始状态进入
      • +
      • 防止发生错误的转换
      • +
      • 特别地,Rust 的所有权机制可以消耗掉状态,使得用户手上的状态发生转换后就不会存在。
      • +
      +

      下面以一个文件打开、读取操作为例,简单介绍 typestate 模式。

      +

      图片

      +

      一个文件的读写操作可能涉及到上面的状态转移图。我们可以用 Rust 抽象这一过程。完整的代码见此:

      +

      https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=46e1d2efa6954acfd7a5b028c70f4612

      +

      我们定义一个保存读取内容和 fd 的结构体:

      +
      pub struct File {
      +    fd: libc::c_int,
      +    buf: Vec<u8>,
      +}
      +
      +

      调用和封装 C FFI 的 open 和 read:

      +
      use std::ffi::CString;
      +impl File {
      +    pub fn open(path: String) -> Result<File, String> {
      +        let fd = unsafe { libc::open(CString::new(path).unwrap().as_ptr(), 0) };// 调用c ffi
      +        // 返回结果..
      +    }
      +    pub fn read(mut self, bytes: usize) -> Result<usize, String> {
      +        let bytes_read =
      +            unsafe { libc::read(self.fd, self.buf.as_mut_ptr() as *mut libc::c_void, bytes) };
      +        if bytes_read == -1 {return Err(std::io::Error::last_os_error().to_string());} // 处理异常
      +        unsafe{self.buf.set_len(self.buf.len() + bytes_read as usize)};
      +        Ok(bytes_read as usize)
      +    }
      +}
      +
      +

      注意到上面的代码中,如果 read 进入到 eof 状态时,它返回 bytes_read 小于期望读取的字符数,但是这里并没有做特殊的处理;同时,进入 eof 状态后,我们并不希望调用者再去调用 read 函数了。我们可以将 EOF 状态和正常状态分为两个结构体:

      +
      struct FileEof(i32);
      +pub enum ReadResult {
      +    File(File),
      +    FileEof(FileEof),
      +    Error(String),
      +}
      +
      +

      然后,在 read 方法中,针对 c ffi 中 read 的不同结果返回不同类型:

      +
        +
      • 如果 read 返回-1, 那么返回 ReadResult::Error
      • +
      • 如果 read 返回小于要求的字节数,说明到达 EOF 状态,返回 ReadResult::FileEof
      • +
      • 否则,返回 ReadResult::File 状态
      • +
      +
      impl File {
      +    pub fn open(path: String) -> Result<File, String> {// same as before}
      +
      +    pub fn read(mut self, bytes: usize) -> ReadResult {
      +        // same as before
      +        // bytes_read是read读取的字节数
      +        if (bytes_read as usize) < bytes {
      +            ReadResult::FileEof(FileEof(self.fd))
      +        } else {
      +            ReadResult::File(self)
      +        }
      +    }
      +}
      +
      +

      当 Read 返回时,除了异常状态,它可能返回的是一个正常的 File,也可能是一个 FileEof 结构体。对于前者,调用者仍然可以继续调用 read 读取;然而后者则没有实现 read 方法。这样,我们就从类型的层面隔离了两种状态。同时,用户也可以通过 match 等方法判断是否出现了文件读取 EOF 的情形。

      +

      我们还没实现 close 方法。close 方法无论是普通状态还是 EOF 状态都有。这样,我们就不得不分别为两个结构体实现一个相同的方法,这并不优雅。

      +

      注意到类似 C 语言中使用枚举值表示状态的写法,只需要写一个结构体,并且为该结构体实现方法。有没有办法既利用 Rust 的类型系统隔离两种类型,又只需要写一个结构体呢?Rust 的泛型和零成本抽象可以帮助我们解决这个问题。

      +
      use std::marker::PhantomData;
      +
      +pub struct Reading;
      +pub struct Eof;
      +
      +pub struct File<S> {
      +  fd: libc::c_int,
      +  buf: Vec<u8>,
      +  closed : bool,
      +  _marker: PhantomData<S>,
      +}
      +
      +pub enum ReadResult { File(File<Reading>), FileEof(File<Eof>), Error(String) }
      +
      +

      区分不同类型的枚举值仍然是类型,与之前不同的是,我们将类型作为 File 结构体的参数传入。例如,普通状态的 File 结构体是 File,而读取结束的 File 结构体则是 File。

      +

      然后,我们可以为 File 特化实现一个 Read 方法:

      +
      mpl File<Reading> {
      +    pub fn open(path: String) -> Result<File<Reading>, String> {
      +       // same as before
      +    }
      +
      +     pub fn read(mut self, bytes: usize) -> ReadResult {
      +       // same as before
      +    }
      +}
      +
      +

      然后再为 File和 File同时实现一个 close 方法:

      +
      impl<S> File<S> {
      +    pub fn close(mut self) -> Result<(), String> {
      +        if unsafe{libc::close(self.fd)} == -1 {
      +            Err(std::io::Error::last_os_error().to_string())
      +        } else {
      +            Ok(())
      +        }
      +    }
      +}
      +
      +

      当然,我们还应该将 close 实现为 drop trait,而不只是一个方法

      +
      impl<S> Drop for File<S> {
      +  fn drop(&mut self) {
      +    if !self.closed {
      +      unsafe { libc::close(self.fd); }
      +    }
      +  }
      +}
      +
      +

      许多开源项目都使用了 typestate 这种设计模式,例如

      +
      +

      hyper 中实现 http2 协议的部分代码如下 +https://github.com/hyperium/hyper/blob/master/src/proto/h2/server.rs#L92

      +
      +
      enum State<T, B>
      +where
      +    B: Body,
      +{
      +    Handshaking {
      +        ping_config: ping::Config,
      +        hs: Handshake<Compat<T>, SendBuf<B::Data>>,
      +    },
      +    Serving(Serving<T, B>),
      +    Closed,
      +}
      +
      +

      这里的 state 表示服务器的三个状态。Handshaking 表示在进行握手阶段,例如在建立连接时的初始握手。Serving 表示服务器已经成功握手并正在服务请求。它包含了一个 Serving 结构体,其中具体实现了请求的处理逻辑。.Closed 表示连接已经关闭,不携带任何额外数据。在 poll 函数中,hyper 实现了不同状态的转换。

      +

      Handshaking 状态:

      +
        +
      • 当服务器处于 Handshaking 状态时,它尝试完成握手过程。
      • +
      • 使用 poll 方法检查底层握手(hs)是否准备好继续进行。如果 hs 没有准备好,这将返回 Poll::Pending 并将当前任务注册到要通知的 Waker。
      • +
      • 如果握手完成,它检查是否需要配置 Ping 功能(基于 ping_config)。如果需要,它设置与 ping 相关的逻辑。
      • +
      • 状态转变为 Serving,这意味着服务器准备开始服务请求。
      • +
      +

      Serving 状态:

      +
        +
      • 在 Serving 状态中,服务器开始处理传入的请求。
      • +
      • poll_server 被调用以继续处理或完成请求。这可能涉及读取网络数据,执行应用程序逻辑,以及发送响应。
      • +
      • 如果服务器完成了所有的服务工作,它会返回 Poll::Ready(Ok(Dispatched::Shutdown)),表示服务器准备关闭。
      • +
      +

      Closed 状态:

      +
        +
      • 如果服务器在完成握手前已经被标记为关闭(Closed),则直接返回 Poll::Ready(Ok(Dispatched::Shutdown))。
      • +
      +
      impl<T, S, B, E> Future for Server<T, S, B, E>
      +where
      +    T: Read + Write + Unpin,
      +    S: HttpService<IncomingBody, ResBody = B>,
      +    S::Error: Into<Box<dyn StdError + Send + Sync>>,
      +    B: Body + 'static,
      +    E: Http2ServerConnExec<S::Future, B>,
      +{
      +    type Output = crate::Result<Dispatched>;
      +    fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
      +        let me = &mut *self;
      +        loop {
      +            let next = match me.state {
      +                State::Handshaking {ref mut hs,ref ping_config} => {
      +                   // 处理握手状态
      +                }
      +                State::Serving(ref mut srv) => {
      +                  // 处理连接状态
      +                }
      +                State::Closed => {
      +                  // 优雅关闭
      +                }
      +            };
      +            me.state = next;
      +        }
      +    }
      +}
      +
      +

      通过利用 typestate 机制,hyper 实现了一个编译期就能进行检查状态管理安全性的 Server 结构。

      +

      Command

      +

      命令模式的基本思想是将操作分离为对象,并将它们作为参数传递。在 Rust 中,主要有以下两种种方式可以绑定

      +
        +
      • Trait 对象
      • +
      • 函数指针
      • +
      +

      例如,我们要针对一个窗体执行一系列的 GUI 命令,有 open,close 等等.如果使用 Trait 的话,我们可以定义如下:

      +
      pub trait Command {
      +    fn execute(&self) -> &str;
      +}
      +
      +

      我们分别实现一个 Open 和 Close Command:

      +
      pub struct Open;
      +impl Command for Open {
      +    fn execute(&self) -> &str {
      +        "open"
      +    }
      +}
      +
      +pub struct Close;
      +impl Command for Close {
      +    fn execute(&self) -> &str {
      +        "close"
      +    }
      +}
      +
      +

      最后定义一个 Executor,逐一取出容器内的命令执行即可。

      +
      struct Executor {
      +    commands: Vec<Box<dyn Command>>,
      +}
      +
      +impl Executor {
      +    fn execute(&self) -> Vec<&str> {
      +        self.commands.iter().map(|cmd| cmd.execute()).collect()
      +    }
      +}
      +
      +

      如果命令本身比较简单,也可以直接将函数指针传入

      +
      type FnPtr = fn() -> &'static str;
      +pub struct Command{
      +    execute : FnPtr,
      +}
      +struct Executor; // same as before
      +
      +impl Executor {
      +    fn add_command(&mut self, command: FnPtr) {
      +        self.commands.push(Command { execute: command });
      +    }
      +    fn execute(&self) -> Vec<&str> {
      +        self.commands.iter().map(|cmd| (cmd.execute)()).collect()
      +    }
      +}
      +
      +

      但是这种形式的 command 没有类型上的隔离,可读性不如上一种。此外,我们可能在 Command 中存有其他的上下文或者变量。如果你的命令本身比较复杂的话,第一种方式会是更好的选择。

      +

      Strategy

      +

      策略模式和命令模式十分类似,但是策略模式更注重表达“做一件事的不同方式"。

      +

      例如,我们希望实现一个 Serializate 特定数据结构的类。

      +
      struct Point{
      +    x : f32,
      +    y : f32
      +}
      +
      +

      我们希望能将他转为以下两种形式:

      +
        +
      • 普通的字符串,形如"{x},{y}"
      • +
      • Json 字符串
      • +
      +

      我们可以实现一个 Trait,这个 trait 接受一个 Point 结构体,然后将其放入到字符串中

      +
      trait Serialize {
      +    fn serialize(&self, data: &Point, buf: &mut String);
      +}
      +
      +

      然后,分别为两种策略实现 serialize 方法

      +
      struct NormalSerializer;
      +
      +impl Serialize for NormalSerializer{
      +    fn serialize(&self, data: &Point, buf: &mut String) {
      +        buf.push_str(&format!("{},{}", data.x, data.y));
      +    }
      +}
      +
      +struct JsonSerializer;
      +impl Serialize for JsonSerializer{
      +    fn serialize(&self, data: &Point, buf: &mut String) {
      +        buf.push_str(&format!("{{"x":{}, "y":{}}}", data.x, data.y));
      +    }
      +}
      +
      +

      使用时,首先构建想要序列化的方法的结构体,然后调用其序列化方法即可。

      +
      fn main() {
      +    let point = Point { x: 1.0, y: 2.0 };
      +    let mut buf = String::new();
      +    let normal_serializer = NormalSerializer;
      +    normal_serializer.serialize(&point, &mut buf);
      +    println!("{}", buf);
      +}
      +
      +

      Visitor

      +

      Visitor 模式可以将对多种对象数据的行为单独放在一个类中,可以视为是 Command 的加强版。一般而言,在解析异构数据(例如树结构)时我们常常会用到 Visitor。Visitor 可以分离解析数据和操作数据两件事情。

      +

      在 Rust 中,常用 Visitor 的场景主要在遍历 AST 树和进行反序列化。

      +

      考虑上面 strategy 的例子,如果我们需要写一个反序列化器,从文本转为 Point。我们可以采用类似的思路

      +
      impl Deserialize<&str> for Point {
      +    type Error = PointDeserializationError;
      +
      +     fn deserialize(input: &str) -> Result<Self, Self::Error> {
      +        let split = input.split(",").collect::<Vec<_>>();
      +        Ok(Point {
      +            x: split[0].parse().map_err(|_| PointDeserializationError)?,
      +            y: split[1].parse().map_err(|_| PointDeserializationError)?,
      +        })
      +    }
      +}
      +
      +

      同样,如果要从 Json 形式转为 Point,可以用 newtype 封装一下 json

      +
      struct Json(String);
      +
      +impl Deserialize<Json> for Point {
      +    type Error = PointDeserializationError;
      +
      +     fn deserialize(input: Json) -> Result<Self, Self::Error> {
      +        todo!()
      +    }
      +}
      +
      +

      如果此时,你需要又要从 Hashmap 转为 Point。这个操作很简单。但是你可能突然想到,上面 Json 转为 Point,似乎也可以先从 Json 转为 Hashmap,再从 Hashmap 转为具体的数据结构。进一步来说,如果我有 M 种要反序列化的结构体,有 N 种目标结构体,使用一一对应的方式我们就需要实现 MN 种方式,而且这其中有许多代码是可以被复用的。而假如我们添加一个中间层,提供 X 种方式(X 是一个相对小的数),那么这样就只需要实现 MX + X*N 种方式了。Serde 的反序列化器定义类似下面的结构

      +
      trait Visitor<'de> {
      +    type Value;
      +    fn visit_map<M>(self, map: M) -> Result<Self::Value, M:: Error>
      +    where
      +        M: MapAccess<'de>;
      +}
      +
      +trait Deserializer<'de> {
      +    type Error;
      +    fn deserialize_struct<V>(self, visitor: V) -> Result<V::Value, Self::Error>
      +    where
      +        V: Visitor<'de>;
      +}
      +
      +

      Deserializer 中除了定义 deserialize_struct 还定义了其他反序列化方法,visitor 也是一样,这里仅列出两个本例中所提到的方法。

      +

      我们就可以将一个 Json 的反序列化实现为下面的形式。

      +

      首先我们需要定义一个 JsonDeserializer。这个结构体负责将 Json 格式的字符串转化为一个中间表示 MapAccess。

      +
      +

      MapAccess 是 Serde 中提供给 Visitor 的参数之一。读者可以阅读 Serde 文档了解更多关于 MapAccess 的信息,这里不再展开 +https://docs.rs/serde/latest/serde/de/trait.MapAccess.html

      +
      +

      类似地,当你再写其他更多的序列化器时,就可以专注于解析成特定的中间表示,而不是将这些功能都放在一个类中。

      +
      struct JsonDeserializer {//...}
      +impl<> JsonDeserializer {
      +    // 假设这里实现了解析Json的功能,并返回了一个MapAccess
      +    fn parse_map(&self) -> Result<Box<dyn MapAccess>, JsonError> {todo!()}
      +}
      +struct JsonError;
      +
      +

      接下来为 JsonDeserializer 实现 Deserializer Trait。这里我们调用 JsonDeserializer 的解析方法,然后将它传给一个实现了 visit_map 方法的 Visitor。Visitor 将会决定我们反序列化的结果是什么。

      +
      impl<'de> Deserializer<'de> for JsonDeserializer {
      +    type Error = JsonError;
      +    fn deserialize_struct<V>(self, visitor: V) -> Result<V::Value, Self::Error>
      +    where
      +        V: Visitor<'de>
      +    {
      +        let map = self.parse_map().map_err(|_| JsonError)?;
      +        visitor.visit_map(map).map_err(|_| JsonError)
      +    }
      + }
      +
      +

      我们还需要实现一个 Visitor,这个 visitor 接受一个 MapAccess 结构体作为参数,返回一个目标结构体——这里就是我们的 Point 结构体。

      +
      struct PointVisitor;
      +impl<'de> Visitor<'de> for PointVisitor{
      +    type Value = Point;
      +
      +    fn visit_map<M>(self, mut access: MapAccess<'de>) -> Result<Self::Value, M::Error>
      +    {
      +        let x = access.next_value()?
      +        let y = access.next_value()?
      +        Ok(Point{x,y})
      +    }
      +}
      +
      +

      如果此时,你接到了新的需求,需要将输出改为一个元组。这时你只需要简单的实现一个新的 Visitor 即可。

      +

      我们将这样的形式称为”双分派“。Visitor 只处理确定形式的结构体,例如 MapAccess 等等,由于 Rust 中没有直接的重载,调用者需要显式的调用”visit_map“。我们称这个操作为”分派“(dispatch)。在其他语言例如 C++,这里可以直接调用 visit 函数,由于其参数的类型是编译期就知道的,所以会产生一个静态的分派。

      +

      上面第一部分的 Deserializer 结构体对应的是是 Serde 文档中的 Implementing a Deserializer,而第二部分的 Visitor 则对应的是 Serde 文档中的 Implementing deserialize。读者可以进一步阅读这两个文档。

      +

      Visitor 模式可以很好的解耦数据解析和数据处理两个操作,在 Serde 中的反序列化被大量使用。

      +

      参考

      +
        +
      1. https://refactoringguru.cn/design-patterns/catalog
      2. +
      3. https://fomalhauthmj.github.io/patterns/
      4. +
      5. https://towardsdatascience.com/nine-rules-for-elegant-rust-library-apis-9b986a465247
      6. +
      7. https://rust-lang.github.io/api-guidelines/about.html
      8. +
      9. https://willcrichton.net/rust-api-type-patterns/
      10. +
      11. https://deterministic.space/elegant-apis-in-rust.html
      12. +
      13. https://docs.rs/derive_builder/latest/derive_builder/
      14. +
      15. https://doc.rust-lang.org/rust-by-example/error/option_unwrap/and_then.html
      16. +
      17. https://stanford-cs242.github.io/f19/lectures/08-2-typestate#sharing-state-methods
      18. +
      19. https://jelenkovic.xyz/posts/serde-visitor/
      20. +
      `;export{n as assetURLs,t as default,p as metadata,e as toc}; diff --git a/zh-cn/assets/index-f533d09f.js b/zh-cn/assets/index-559b2f74.js similarity index 95% rename from zh-cn/assets/index-f533d09f.js rename to zh-cn/assets/index-559b2f74.js index ef4d3dd..e1b3a67 100644 --- a/zh-cn/assets/index-f533d09f.js +++ b/zh-cn/assets/index-559b2f74.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-0645adbc.jpg",e="/zh-cn/assets/image1-4a25d469.jpg",o="/zh-cn/assets/image2-ee430ce0.png",n=[t,e,o],s={label:"达坦科技受邀在2022中国计算机学会芯片大会做硬件加速研究分享",description:"2022年7月29日至7月30日,由中国计算机学会(CCF)集成电路设计专业委员会、容错计算专业委员会、体系结构专业委员会和信息存储技术专业委员会联合举办的学术大会中国计算机学会芯片大会在江苏南京如期圆满举行。",cover:"./cover.jpg",location:"新加坡",date:"2022-08-04",title:"Dartan Technology Invited to Do Hardware Acceleration Research Sharing at 2022 China Computer Society Chip Conference"},a=[],c=`

      封面

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

      封面

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

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

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

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

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

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

      图片

      -

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

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

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

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

      图片

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

      图片

      内容简介:

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

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

      本周六(10 月 15 日)下午 3 点,达坦科技和 Rust 语言中文社区合作,由达坦科技的联合创始人施继成在 Rust 唠嗑室做开源分布式存储技术的分享,介绍 Xline 是如何实现高性能跨数据中心的数据一致性管理。欢迎大家预约收看!

      -

      图片

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

      图片

      `;export{n as assetURLs,a as default,e as metadata,o as toc}; diff --git a/zh-cn/assets/index-31f22a4e.js b/zh-cn/assets/index-5fa4b651.js similarity index 94% rename from zh-cn/assets/index-31f22a4e.js rename to zh-cn/assets/index-5fa4b651.js index b1d4c18..8dbcdb6 100644 --- a/zh-cn/assets/index-31f22a4e.js +++ b/zh-cn/assets/index-5fa4b651.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],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=`

      封面

      +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}],a=`

      封面

      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,n as default,i as metadata,o as toc}; +

      图片

      `;export{t as assetURLs,a as default,o as metadata,i as toc}; diff --git a/zh-cn/assets/index-a5e56ae7.js b/zh-cn/assets/index-6618c0b5.js similarity index 98% rename from zh-cn/assets/index-a5e56ae7.js rename to zh-cn/assets/index-6618c0b5.js index ce92d29..2cde4b2 100644 --- a/zh-cn/assets/index-a5e56ae7.js +++ b/zh-cn/assets/index-6618c0b5.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/e4031380f79f643b21d6bdfd37c46a1c-95e167c8.jpeg",s="/zh-cn/assets/8108518a82f752ddea6832ce7bc15560-3d5249bd.png",a="/zh-cn/assets/cf12e52cb9d0fbb7359c08e1cfc674bc-9774dac8.png",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=`

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

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

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

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

      封面

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

      封面

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

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

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

      @@ -37,4 +37,4 @@ Xline 的建设需要每一位对此感兴趣且愿意付出的你们的参与
    • Curp 相关文章:
      https://medium.com/@datenlord/curp-revisit-the-consensus-protocol-384464be1600
    • Xline 官网:www.xline.cloud
    • -
    `;export{e as assetURLs,n as default,i as metadata,t as toc}; +`;export{l as assetURLs,s as default,i as metadata,t as toc}; diff --git a/zh-cn/assets/index-68779906.js b/zh-cn/assets/index-68779906.js new file mode 100644 index 0000000..edd8c1e --- /dev/null +++ b/zh-cn/assets/index-68779906.js @@ -0,0 +1,80 @@ +const t="/zh-cn/assets/cover-1ac6df35.webp",r=[t],o={label:"达坦科技@了你,并邀请你参加2024开源之夏!",description:"开源之夏(英文简称“OSPP”)是中科院软件所“开源软件供应链点亮计划”指导下的系列暑期活动。达坦科技自开源之夏创办首期起每年参与,积极鼓励在校学生积极参与开源软件的开发维护,培养和发掘更多优秀的开发者。今年,达坦科技一如既往带着对开源的热忱与初心,携旗下开源项目第五次参与开源之夏。",cover:"./cover.webp",location:"中国香港",date:"2024-05-09",title:"DartanLord @ you and invited you to the 2024 Summer of Open Source!"},l=[{label:"开源之夏为什么值得参加?",level:2},{label:"达坦科技项目列表",level:2},{label:"题目一",level:3},{label:"题目二",level:3},{label:"学生参与指北:",level:2},{label:"活动日程",level:2}],n=`

    图片

    +

    开源之夏(英文简称“OSPP”)是中科院软件所“开源软件供应链点亮计划”指导下的系列暑期活动。达坦科技自开源之夏创办首期起每年参与,积极鼓励在校学生积极参与开源软件的开发维护,培养和发掘更多优秀的开发者。今年,达坦科技一如既往带着对开源的热忱与初心,携旗下开源项目第五次参与开源之夏。

    +

    开源之夏为什么值得参加?

    +
      +
    • 结识开源界小伙伴和技术大牛
    • +
    • 获得社区导师的专业指导,与开源项目开发者深度交流
    • +
    • 丰富项目实践经验,提升项目开发技能
    • +
    • 通过结项考核的学生将获得结项奖金和结项证书,更有机会获选优秀学生
    • +
    +

    达坦科技项目列表

    +

    题目一

    +

    项目名称:为开源 RDMA 网卡驱动程序适配 NVIDIA 或 AMD GPU

    +

    项目描述: 随着 AI 浪潮的到来,读写 GPU 显存成为了 RDMA 网卡必须支持的功能之一。本项目需要为开源 RDMA 网卡 blue-rdma 编写对应的内核态及用户态驱动程序,从而使之能够支持对 N 卡或 A 卡显存进行访问的能力。其中用户态驱动使用 Rust 开发,部分功能涉及到 Linux Kernel 开发以及 C-FFI 调用交互。

    +

    项目备注:
    +https://docs.nvidia.com/cuda/gpudirect-rdma/index.html
    +https://rocm.docs.amd.com/en/latest/

    +

    项目难度: 进阶

    +

    项目产出要求:

    +
      +
    • 设计文档
    • +
    • 扩展 blue-rdma 的内核态及用户态驱动程序,使得上层应用可以将显存注册为 RDMA 的 Memory Region,从而使得 blue-rdma 网卡具备对远程 GPU 显存的读写能力。
    • +
    • 测试用例
    • +
    +

    项目技术要求:

    +
      +
    • 熟悉 Rust 语言
    • +
    • 熟悉 Linux Kernel 开发
    • +
    • 对计算机体系结构有一定了解
    • +
    +

    项目成果仓库:
    +https://github.com/datenlord/open-rdma

    +

    题目二

    +

    项目名称:为开源 RDMA 网卡适配 lumina 测试工具

    +

    项目描述: lumina 是微软开源的一款 RDMA 网卡测试工具,由于 blue-rdma 项目对标准 RDMA 协议进行了优化调整,因此无法直接使用 lumina 测试工具。本项目要求参与者修改 lumina 项目,使之能够适配 blue-rdma 所使用的通信协议。

    +

    项目备注:
    +github.com/lumina-test/lumina
    +https://www.cs.jhu.edu/~zhuolong/papers/sigcomm23lumina.pdf

    +

    项目难度: 进阶

    +

    项目产出要求:

    +
      +
    • 设计文档
    • +
    • 编写 P4 交换机的数据包处理代码,使之能够解析修改后的 RDMA 协议。
    • +
    • 编写与 blue-rdma 协议所对应的测试用例,测试 blue-rdma 在丢包、乱序情况下的性能表现。
    • +
    +

    项目技术要求:
    +熟悉 C、Python 语言
    +有很强的学习能力,能够快速掌握 P4 交换机开发、能够快速掌握 RDMA 协议的基本概念和编程模型

    +

    项目成果仓库:
    +https://github.com/datenlord/open-rdma

    +

    学生参与指北:

    +
      +
    • 成功注册报名的学生自由选择项目。
    • +
    • 对于感兴趣的项目,学生与社区导师沟通实现方案,并在官网提交项目计划书。
    • +
    • 被选中的学生将在社区导师指导下,按计划完成项目开发工作,并将成果贡献给社区。
    • +
    • 社区评估学生的完成度,主办方根据评估结果,给出最终评审结论并发放活动奖金。
    • +
    • 详情请参考:
      +https://summer-ospp.ac.cn/help/student/
    • +
    +

    活动日程

    +

    03/11 - 03/31
    +社区报名与审核

    +

    04/30 - 06/04
    +学生注册、与导师沟通项目、提交项目申请
    +当前

    +

    06/05 - 06/25
    +项目申请审核

    +

    06/26
    +中选公示

    +

    06/26 - 06/30
    +项目开发预热

    +

    07/01 - 09/30
    +项目开发

    +

    10/01 - 10/31
    +结项审核-PR/MR 合并与导师审核

    +

    11/01 - 11/08
    +结项审核-组委会成果审核

    +

    11/09
    +结项公示

    +

    对于报名方式有任何疑问,或者对某一个任务非常感兴趣,并且想要深入了解的同学,欢迎扫码添加小助手微信:DatenLord_Tech,或发邮件至info@datenlord.com

    +

    “开源之夏”活动在众多的开源项目与高校学生之间搭建了一座桥梁。同学们通过参与“开源之夏”的活动,在开源项目导师的指导下,不但可以丰富项目实践经验,提升项目开发的技能,而且可以与开源项目的开发者进行深度的交流,以一种最直接的方式了解开源,深入开源,为后续的学业方向提供参考,职业发展积累人脉。欢迎各位同学热情参与体验 DatenLord 的开源之夏项目!

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

    图片

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

    图片

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

    Part.1

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

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

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

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

    结束语

    -

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

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

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

    `;export{e as assetURLs,r as default,a as metadata,l as toc}; diff --git a/zh-cn/assets/index-71801d47.js b/zh-cn/assets/index-6a3ed4c3.js similarity index 95% rename from zh-cn/assets/index-71801d47.js rename to zh-cn/assets/index-6a3ed4c3.js index 1fe4386..434a40f 100644 --- a/zh-cn/assets/index-71801d47.js +++ b/zh-cn/assets/index-6a3ed4c3.js @@ -1,4 +1,4 @@ -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=`

    图片

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

    图片

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

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

    `;export{e as assetURLs,r as default,n as metadata,s as toc}; diff --git a/zh-cn/assets/index-69ce89cf.js b/zh-cn/assets/index-7007c1ed.js similarity index 93% rename from zh-cn/assets/index-69ce89cf.js rename to zh-cn/assets/index-7007c1ed.js index dc1b8d9..750c022 100644 --- a/zh-cn/assets/index-69ce89cf.js +++ b/zh-cn/assets/index-7007c1ed.js @@ -1,4 +1,4 @@ -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

    +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!"},r=[{label:"Hackathon2023",level:2},{label:"主题",level:2},{label:"大赛时间线",level:2},{label:"背景介绍",level:2},{label:"赛题介绍",level:2},{label:"评估标准",level:2},{label:"赛题宣讲会",level:2}],s=`

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

    图片

    +

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

    `;export{a as assetURLs,s as default,e as metadata,r as toc}; diff --git a/zh-cn/assets/index-81d1e484.js b/zh-cn/assets/index-81d1e484.js new file mode 100644 index 0000000..27203a9 --- /dev/null +++ b/zh-cn/assets/index-81d1e484.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-03-28",title:"A short summary of the implementation of interval trees in Xline copy"},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-b9ee750d.js b/zh-cn/assets/index-89698b14.js similarity index 86% rename from zh-cn/assets/index-b9ee750d.js rename to zh-cn/assets/index-89698b14.js index b0d35f5..8ef61af 100644 --- a/zh-cn/assets/index-b9ee750d.js +++ b/zh-cn/assets/index-89698b14.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-ccfdc2fa.jpg",e="/zh-cn/assets/image1-9be7272d.jpg",n="/zh-cn/assets/image2-20a7bcaa.jpg",a=[t,e,n],s={label:"DatenLord X Segmentfault直播预告 | CURP协议的工业化实践",description:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源的分布式KV存储Xline,针对多数据中心场景,实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性,方便业务系统实现多地多中心多活部署。",cover:"./cover.jpg",location:"新加坡",date:"2023-08-15",title:"DatenLord X Segmentfault Live Stream Preview l CURP Protocol in Industrial Practice"},o=[{label:"CURP 协议",level:2}],c=`

    图片

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

    图片

    CURP 协议

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

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

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

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

    图片

    会议号:474-6575-9473

    -

    图片

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

    图片

    `;export{n as assetURLs,c as default,o as metadata,s as toc}; diff --git a/zh-cn/assets/index-86e42443.js b/zh-cn/assets/index-90593fbc.js similarity index 99% rename from zh-cn/assets/index-86e42443.js rename to zh-cn/assets/index-90593fbc.js index e71ef1d..9099a01 100644 --- a/zh-cn/assets/index-86e42443.js +++ b/zh-cn/assets/index-90593fbc.js @@ -1,4 +1,4 @@ -const s="data:image/png;base64,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",a="data:image/png;base64,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",n="data:image/png;base64,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",e="data:image/png;base64,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",l="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABGCAAAAABp19w+AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAPnSURBVFjD7ZZdTFtlGMd/UJhrGWAdlY91MO0mY4EOyFzAhIaBaYJbJMgFURc1DKfGiyGaxWYxdYshkixuQPwITozuioSQ7EInmhmihu7DlZZtpaFUmbU10kbo2jEYX1605RzkbAZkJkvOc3POeZ7/+Z2c//uc57xxC9yriL9nZBkto2W0jJbRMlpG/3/ohMUzdyAYDOVUrpgw6wwGgyHD9jujg/UAz6wcfdEEkLscvWhIXF0VkL/y99bUlgJ5ywtxwu5pthK6MlZhquM1NN3L06JldIFmNWSuwG6JtAg9CI+vhswAFN4dfQfFv8asRXqNBPScBQpWgx4BdZZEXuhr1xLFDZc7IV+nAJi+HC5JAbg6tE8ZLc9fd43l6FNjRpZyV7RYMfFFD0BWRzL0m4ADL8D3R/mpNVLv/8gD0FgDYIUiKbRgyICg6KnuUb/8SUeZ7zg4TaoTBXw2BefANgXwxyGTp9x82szJkaiRMavnwlLouf5Fq7tb0Z3an5d7EDt8zKniEAShErgFjDfZaDxakV1Rxi8RqzVRIwN1e3+VQI+AJhMASzuY04Br5OCyVW7yjsJGqKiCVJh/24exBgj7SAfsQldb/SgkvBYUnVCdAxNnOnkRK9X8AE8lAPvO7oiH805ogHnH+x79zqU9u/u5omwJ9KLCPgxXTZNeP6ojxdQY1XwFewASKQC6gPbbATeUmaJG6qOMB1+R6hBBcQ245UvONeaVJMK6dbg8qIoAnJTAvA1Uo0p1la5UGzNSejzE0ILCD8UnxJILUJ4I0KfeCRNAi16oDi4aeblr+mnxTI4XK4IuIAyblzz9EuwCCFirFBAGMkVVKxTi9cLFpk3Dx/wSaBsU8mlDCNIgLeZSAOA6bAU4QwWwEXgoWg/MRnp24a13mG+rOpSEQwJthfzb57YkwyMwHMn91VQ7DigjrD+/1G8DkjQQbd7e2g5+B3XmkK8Yu2f/kJ/tEmggvX/yScCg4scZgCv1tj2pgA7cMNVMIwB1cAlg+ngz5cTBNr7DwOY27bcUp4vQincjx6HfSPow8ch6SND24Uhx957ujH/9oAJI7WUwyfHBUFNkxOjsYz9vmDrf02rf1bIVVfeMV/25/qU4Vcb0ezMHdCJ07Afme9OH2hwZIpY2H6B+oiHqae/JSVC9YYzeMtn+NcBjz5cDWI5NssOcAfSZ+UYpgWbGdTM3JbZ8o2MbslMF0ZR3QvnoeuF63BPWZsXaNuRe0CsADl/Ye7hF/NUsrFXcNBgGxgxOIbF2uycFPNxszJXskP8YD9TzbPhVKa/XIMZvaEUzdU3R/4j7cxMso2W0jJbRMvr+QP8NsluKv9sZ0eAAAAAASUVORK5CYII=",p="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAABGCAAAAAA72CMwAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAcdSURBVGje7Zh9UFTXFcB/sHzlKcIGt5ZvGgIFhEi0aIN0MQmlJpJhbFCridRxJtOksUmcqYwmEidWbSWZMU4S2wQjaaJt/WKcItUSU4LSiIiiIBSYUJdsXCWga/h4lM/tH2/38d7uggszQf/Y89e955w9+3vnvHvvedfDwr0jnncbwA3jhnHDuGHcMPeCuGHcMBMVr+/+Lzr3DoP3i9OAz6t8NAzGZd09mF6xtwZ+mA0MtLRC3MNjeXpMRafXuhbCP/YE+N0XH4aM6Tcl70y98ATGWgC+fnxslqmBqZ37NBQDiE0Pj+M3FTAj1fNikqg0Af8h6S7DGMQkcqAEqAv53jiOjqvp1qWLjV0kLkqZplK3fZWqmSRMvfAAC7XmY7/040KKrG2++YjHHTJzbcPSN0o0ob3lW548rQqYu2dkspm5OFeDdw7iv+irT5a11ZvedFjJFqUMHNDrs4+bLZa+f+r1+k9GDTcW61sslhvnyksO/NUyQRlefNhisdzU63MtNfoOWT30kr7IzlNVpvY8A5kv+QN+meHPUxg732r432ZxfQwcOQSE/2KCibkqPgTcn1lmqLscMlNWa/JXF4Vkjlmm9hcNZG/ylybxz8B71spY3mxJywbi04TJvDJEAyyF4vM/VuhnbmX7f8eC6X2lg0dfkRXZYPi3NKw9xRoP4LHtOyYBUyO9+QlxlDfOURpSktg3FsxeE8IoC7OAL6XhUZJjpFEIE5bhC9Z9LgfsdpkVnGl2DlNfDOsCFSYdtAFgqmSFI7urUicmSoN0gfAglSlVR5FTmP6dIGQoTUPwFQAlCLZaezBBOfPBq3xU0gPgs5wUtVHzFGe7nMF8aoRlvsr0mkEAGDpGss1tojDf7jggcu4tEYAs5tuZE6BOMZWX9llAlZirwAMAbSIP2ZQKmMGG89d0MbND5dS2NhOW7HWyypi+Wn7EgBOKiLoKe9Y4uJDmCNNfCdoIpWM9EAXQAgmOz9z2mhFBhLXPSCH+8j6AdlYTtM5JxjXxjzJUvexYpitAqsqxBoi0wvzAIczpXGPCJ6XHVrHvN4OApeB9nnj3D0nmpvl/hNsulzEW06BjZuqkpI2KqRKIAbgO0+2DmPKJ3eWH9le63Y0fPQfVpYT/1ovQ1VwJ2yEulP0+dYrwU3kUCD1aB5g+QKv8wWFg7QyAHgSHFf0OZPsBLPnYvD8tngp4zAsiogxi/UKF37k7wEyHLkeYaUCAwt9cDMLTANwm0D7a9S9AWu2+aSVUxNNhNQjQrnTcfIcy+UO3Y5kiAUX1+DuwRqpOj2OVDID1yAuAZoiqpg9AlHZuOyn8BgBPD8/wJTNUlumg2GhsBYgEOhWJ+RtEZ9t4hx0yo3qaJlgIlSPQbECY6whzs7usrOxWT8+t2j899a4q2JCqvbMNw4CzP7NpB/NFtDv9pElQxy376CPAoDcAFhAh+fHPTNsWXzsEb9znCLORnI70rcDgrtLD389RWLqtG6s6M94vQLktNf2/r0co0FlnWsyyu7U3C5UqgpTOKBiuQ/vZhrdNug/m40Q6OvgRgHe2tGXI0iO9rXaZYVl5E/m7fQDaX28iept8QAfKWZBhHgSMAbaKpcPXHUvWN5umx87EqTRg3cR7QNWRd4G/Y2bQvKqjce0Zc3fjruVNLN8z2iwEglynYRgGdNlQDcA3FyEDbtMwlJiZOgYLlxEiAfgHpCsNnQj3O8kMkfv3HTRKS3FljjJqPDTZlkgP9A1rIPe0+c+zF8DAHnghAsIwrIz19vK5Lyhptq8jzHmkL4GiU2yYp9BbLpLo6QwGv18v/fJq24zIiBh/VaQ50CA9zv6TRjBnBa2fN/O9lzvyMmKGKlp4djkQtOhzs3WD0+al2rPcNBJwxTJiLG5NWK0ymkTVsadqyIODf+Ikx4HRrZelUa9R8IV+4xCE7j128NQpeHLNLICWBtndvOnDB+0i1MPJcugXozZGqgyNsEAxdeUWonA/JTMc1QNtvV7BUutmXiWGb4nw9ujvazpSQ/pWO8/dxUKpJwyfLCBrg9JQUBpbqJi60kdmQakTtU9McqK1jawSyY/x9fTw0z5SkECjvWcVKZ6AZkkGxy8p9LdLWab0cwUm+OccHBrX41v5dEATJh9UNuk0Ye3J40D5cXIcYdFEYViFuWJchxTYaj3ZKsp41M56Gaw9+XUIHtUPHGGlz4RhdM/xTtd4DtHPcyn3kKnXfP6110laZ2ettfav3DiKoPhyKjInr1I5unaNZtl5Im3buM14XaG1sxZWPGt/s5HTkbYd4Fp+K2+PXhad3ajbq25OXLzTG8y7uG7Z+C7tVzpFj6DQOXYXJy0GwwEWZGhGButOoNsy+hXXvka03wNcvWDs3tx2dFL3M3lysyckpyxWHNG7i9+y+4yamttOV+WeuiF3w7hh3DBuGDeMG+Zeg/k/Td6MoKrHenoAAAAASUVORK5CYII=",t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAABGCAAAAAAifw/TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAARbSURBVGje7ZhtTFtVGMd/UJjQCayOyngZ6OqGEOgYmQRMIAxMIzBBxIQ4lpkguvkJxgwbMabZTIjEJdsg0YXNF+YnEoLug8uYzky3gEBg5WWAlCoE6bJBhI7aAePFD325rWuFy4hL9J5PPec5//vrff7POefe67XM42nej4krgSWwBJbAElgCS2AJLIH/y2Afxy/DpMk0E5Up+goLgyaTaSbt+bWCTcUAr4kHt1cCRIsFO1LtVZgFxInPmbIgBYgRK/MS3iQWMqFhi3gy/e+ibBQrciouPSjXwqUXkkSLnMA98MJauNyEhEcBr0kPLLSupTYE8GIrxK8FPAyKMNEqYR3rXfT39AafOJUMYK7TnBwI0Dew198WXhrV341SB4HVohTxf1cAO+un65sAwuoCoKUSeOsA/HCcG2es8ZZPxgDK8gG6YJd4sJDqm4K+Ka9J8fbZulTjSRislJ+K57NZuAq6WYDbpZVj6dqvtJwetllkt3jRLB682OKwuPEMqvP7Y6LfoRs+5XziDJggE7gPTJXrKDueEZmRyq9Wi5U2iyYLc34TDR4GZSgArbWgDQZuEYVelxk+PgKbISMLgmDpmBFNPmA2EgJ0C6u4awKZR9LUHfdgQf855EXBdP1HvEkXefwE2T7AXmK94edBKIGlvkMG9U7XVZi07+NI99SFvvp9F9wXl0PfPQR9lZbxCeTvJ5KvUfAt7AHwJR5oAGrnJw2QWmmzSG27xqaDHu72w+8fGrKDBf0t4L4xIFoTk+wLGzagH0O+C2CQZFjSgXzEX5GlSomwW7TiRhtetOOLEfdgQT8Biaecp7RBui/ANcVOmAaq1UK0x2FRZ8NcrodTtRi+9lBcPZCESQ+YYavLlA7YDTDZlSUDMxDqFO2CBMbHob08fOjExEr3/hBYBwmcK5mBYAi2538SYBSeA7hIBrAZeMoWn1ywrsLl9z5gqSardCP9osFdEDd/9ZkAeBaGrGN/lBdMAf5W0p0L6u3ARiXYFmtzQR2/gyJ0wJhI99j+gQlW/xzidDqFtFheAtLkXH8A0Fus2xMEqMAAs1WUAVAIHQBzJ6tIxwu28x1pbK2JuEJiyKrB9uJKvEHjl/JcwO+olmOvz/3Sr5OX5XoD+depPjB/0VCuAuCVH3vP+mwbHeiY2l0aSajc0v5Nkzqe4OC5y2T/E8r1q6n90cd4xIhCa92sW2uMgOLFEpuXzactID+ssUkstZcAdhSlA7SesBCr3QJc03LZH7jS7EI4Yt1PS3U5Fe7APND/GR1oL6qRu09GBgmTZsen/bf5Cf2pMXNEmD1XM4ZltQygoi2nonrTQQydLuCXA23g7KPuUo1vrDAoU6lctH6uXRQKp06AbcO0tKGZuFQHfxOvXFyP2GTwdJUm2vMEV4/XD/xEMW+YD616utc6fqGfuhfh4VTsvW0+Z1EWBYYKfq4n2HMr1ckBLK8e/pfBbtr/7/1YAktgCSyBJbAElsCO9hdp+FP075MrqAAAAABJRU5ErkJggg==",c="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFwAAABGCAAAAABkyax5AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAATISURBVFjD7ZhtbFNVGMd/2xw0l21uSkM2HQPGJkzGYDpgBC8SlaBimjE3A3zgRTQKhGD8oCIYlQ8wjS8ENLwaEUTIBAkD4wJmEEeWDAbSjjoHS7c1bs7hLmDXrbDt+qFr77nt7VIaSDTp8+mc5/zPr895znPuubcxKvfOYu8hOwqPwqPwKDwK19l9kUza4oLY4mzAcTA+nv7hq+4evF/prYHeD4DuNiukPxFKqUZi/fNkWe5QVVVVK+SzIWWR5dzhLobjALSbZ4aURQavl16VKPcAXJgRWhYZ/EK+qRT3GaDHPvUuwwdqH2M+lAN2JofWBVdL168X7DeZ9GTBCJ27pXVmnK/d7M7FPKeq0Z6DNc3s83pqstOGhv/xeS1kP9RYVcVGWfDbVqfN8MNt0jgoruKHHOoK/BJPGVvH62m62rn1rSxbjiuq2lMpy/I+beDPeXKj1ntvnaqq6jJZvtYtV2nuWtnyV+hS7Fixg7n7nk8G09ztsKvWN9C73v1GlpDyqQAl8ONvTNKmFyxR3uoOtaEdq5qxvJPo7UxcDF8MDK7u48ZZFk3ncOcCzJE4fC59pABYktv0aQh499pO5qz1OyzQfNbbvHiKpTGa0Mp4AFMRyncFIixuGaeuGMN3tyFpbEYBV73Nw0zJEuacL/Ru7QtAnm4D88fwtSHcdgRWJwtDZmgBoK2alwS/q3qQmDqLgCqPWUR1gwHcUwbS06KyD1oBqEDSzrh9/2ucKPcOLCD9AX3tzYbTBvCTTigZLuj6FZAA+o4yRVvgll1OnNuuDGZB1rMx5VCj9fyHqAbQBe4AxgG0uMXF7xCzsJdAy7M3d/lX4wvJUw0po0WZDRgD0Ag5hGuPgjUoLfWA/sF8HsgYhI8NGz7WVwViWqzABFHVVg1kAbRDgt990hCZUOhrJcKNIHgPkCLqy4HlSQAuJG0/XZeN4E/5W5IRfARwvyBXjoBUDMB1hOovKho6LfFwPQieAdwWRMeApd5suISs+Oz3b278PWyvET1FUfztWAF+TQj8IGRafL/fH4TwDNjaUkMHHwB/eLDUvXZ7g5uUMpO38yBdQYDJm9IDHiv+sEgKgse/DlW+0D2bbEgf+e6vFJRgRpeTXCN2r3f79HBKJsCGWwB0rPmZzD3ZvpFk/W54zQqPGMFdGERO3Doz9uW/KP/YPyttoPRL7a5NxiAvF3k83giuiCdOu6Az9n91yLkegIUvivfLRGgYFQipIx/qfmp9eZre3yCuSLj9TSuLrjpakjJGZyXq9HlweXYA+5qTvIHtFdMbtgfA6wefdoFwSE01el9Nzmy6FOirh/Gf1O97n1tBK5puCs75EFZIw80A1yUyN7dsG5nAIr2/vRPhCIfzfj5/PycW6l3naGrfk8hmz3C9/xhp07VeOJGnLuBQn86jODG7Fx5QCWC7j1ISe2dwFqGcCUz5gc3SjqOBwkq39Ax3CDe/wlZd1q1MG1Yo46DybdHdsZMPE+8UzuJnlTLxn7Y68sGFmYpswdu30b1S95IUHjzmzfzq77Wuq4lcmETcadtzgmq3bW6pfl6Yn1g311j6/B2HXHxbVTtXyHKlIOmU3+3RT4qJ6H/FplEJAK3JSUPKIoOHaf/fb/8oPAqPwv/L8H8BwYY2Ks9nd80AAAAASUVORK5CYII=",r="data:image/png;base64,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",o="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAABGCAAAAAAifw/TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAASkSURBVGje7Zh/TJR1HMdfJ8jgSPEERBDBRCAcnErGkA2G4G6iBiNdbMVsM8iaaxCWSeZuukbS3FRoSWSU1dpsjOVaJjSbqYOEgOOHgByXMOJa3OVx8kNAPPrjfjxHnLaHaG71fP763vez9/N6ns/78/1+n+dk0zyaWPCIuBJYAktgCSyBJbAElsAS+L8MdneMdEazeTg0VfQVprrMZvNw0hNzBZv3ADwjHlxfCBApFuwotSwrDYgWXzP/nZuAKLEymfAlMZUK55aLJ9PxCv6VYkVOzaUF/7lwaYM40SIncCs8NRcuzbD+n4DnpAem6ubSGwL4fh3EzAXcA4og0SphHWtn6O9ode7RYW4AE40j8YsB2jt3eNnSlj7tYKjSB6wWbRJ/uwLYWT90tgogqHwR1BYCL+6GH45w7ZQ1X/tBP0B+JkATbBAPFkrdLOirMqoUuWXlifrj0FUoPxHDx+NwCTTjAL/lFfYnqz9Xc7LHZpHd4vsj4sH3ax0WV54i7Ex2VORLtMBpzsQOgxlSgbuAqUBD/pGUkJREfrFa7G+zyJi1/ZZocA/4BwJQVwpqP+AGoWg1qSsGesEXUtLABywH9agygRE9AUCLsIqbDLg9gDOuvTXu2mNBXwEZoTB0voIXaCKDK7DNHdjx3doF8FMX5ICl41i/ct3MVRj33IYQl9i7FV8BqtxlLsAOfUs3tBeODRiQH4olU6XgW9gMsJAY4BxQOmnUQWKhzSKl7RpL9rp+XMvbHW+FtL9f01y+dBZY0N8A7uoXRaqi4heChwfafuQbALqIB4sG5L1eirSwTcF2i/5uo73y88sqWVTAYcPpQ7PAgt4AsSecZdcheSHAZcU6GAKKlUK21WFR47mJdNenajNlEU+SGKSv2e/51+ZqhTjMWmAEVs6QNcBGAGNTmhuMAIFO2SZYz8AA1Bes6D5qcAn2gmGQrYLbs7paA+v5KGcY/MDPXn8jQB+sAThPCuAL2J0yTllX4fTrh7GUpOV50+ESvOvZ3ARADz6zwE0QPXlp1SJ4HLqtc7cLdpqs97sU+P0zZTjg7Q+2xVq9s5xfQRHYqY+lpT+704Dr9xC/fdke8EcvMd6zwEBA7dgWIEnO1XsAbXs0m32AMNDBeBH5AGRBA8DE8SKSkUE435PEypLgGmIDHtJin4BT19ubK/YalZ/K0wHPN9Uc3DVxs0Mjz09fAGRepXj35HldQRgAT//YVua+uq+zwbQxL4RA+Vj911XKGPz8Ji6y7SHcjm94w+n0s7/66PfrUaitm3VdiR5QJOTYvKw+OQby11Q2yVjpBYCI55MB6o6OsVa9HLis5qIXUFM9A7jfup8ac0yHVMwGc087GrnY3lS9g4+FCH3A+MCQ12pP4bepfyQ4yF6rYd200g3gwPXtB4qX7EXXOAO8dTHA6Ku6dxNmzE/PV4wmJTUPJnW5Tk7mb22ZnjbtMzhm3JmvcINlRapIlznLe12la+Bmm1BG2fz9UX62gohjvi5TH365JRzLvdrRL/4NMKY7wa5PxQvFtkHiO465+Ss1KBQPSDTbB2HC3Hw+saj4/30fS2AJLIElsASWwBLYEX8COk7eiUf+0c0AAAAASUVORK5CYII=",A="data:image/png;base64,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",i="data:image/png;base64,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",h="/zh-cn/assets/003b1add7c7cb3a3e1dc779588014fab-6e38a540.png",j="/zh-cn/assets/bfdd9f38cc1b1220f25734c917e16153-633580be.png",g="/zh-cn/assets/e05d5510aaeaf46a9e2cdf6ae3b818a2-b38efa29.png",d="/zh-cn/assets/7e948d626ced5b735cff1801c43863a5-6ab26544.png",u="/zh-cn/assets/dd296480837e3618f70d3410d656da79-b4b17dcf.jpeg",m=[s,a,n,e,l,p,t,c,r,o,A,i,h,j,g,d,u],y={label:"Xline 持久化存储设计与实现",description:"在 Xline 早期的原型阶段,我们采用了基于内存的存储来实现数据的持久化。这虽然简化了 Xline 原型设计的复杂度,提高了项目的开发和迭代速度,但带来的影响也是显著的:由于数据都存储在内存当中,因此一旦当进程 crash 后,节点的数据恢复需要依赖于从其他正常节点上拉取全量数据,这就需要较长的恢复时间。基于此方面的考虑,Xline 在最新发布的版本 v0.3.0 中引入了一个 Persistent Storage Layer,来将数据持久化到磁盘当中,同时向上层调用方屏蔽掉无关的底层细节。",location:"中国香港",author:["达坦科技"],tags:["Xline"],date:"2023-05-25",title:"Xline Persistent Storage Design and Implementation"},k=[{label:"引言",level:2},{label:"B+ Tree 读写放大分析",level:3},{label:"LSM Tree 读写放大分析",level:3},{label:"总结",level:3},{label:"持久化存储层设计与实现",level:2},{label:"整体架构与写入流程",level:3},{label:"接口设计",level:3},{label:"实现相关",level:3},{label:"性能评估",level:2}],f=`

    引言

    +const s="data:image/png;base64,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",a="data:image/png;base64,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",n="data:image/png;base64,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",e="data:image/png;base64,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",l="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABGCAAAAABp19w+AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAPnSURBVFjD7ZZdTFtlGMd/UJhrGWAdlY91MO0mY4EOyFzAhIaBaYJbJMgFURc1DKfGiyGaxWYxdYshkixuQPwITozuioSQ7EInmhmihu7DlZZtpaFUmbU10kbo2jEYX1605RzkbAZkJkvOc3POeZ7/+Z2c//uc57xxC9yriL9nZBkto2W0jJbRMlpG/3/ohMUzdyAYDOVUrpgw6wwGgyHD9jujg/UAz6wcfdEEkLscvWhIXF0VkL/y99bUlgJ5ywtxwu5pthK6MlZhquM1NN3L06JldIFmNWSuwG6JtAg9CI+vhswAFN4dfQfFv8asRXqNBPScBQpWgx4BdZZEXuhr1xLFDZc7IV+nAJi+HC5JAbg6tE8ZLc9fd43l6FNjRpZyV7RYMfFFD0BWRzL0m4ADL8D3R/mpNVLv/8gD0FgDYIUiKbRgyICg6KnuUb/8SUeZ7zg4TaoTBXw2BefANgXwxyGTp9x82szJkaiRMavnwlLouf5Fq7tb0Z3an5d7EDt8zKniEAShErgFjDfZaDxakV1Rxi8RqzVRIwN1e3+VQI+AJhMASzuY04Br5OCyVW7yjsJGqKiCVJh/24exBgj7SAfsQldb/SgkvBYUnVCdAxNnOnkRK9X8AE8lAPvO7oiH805ogHnH+x79zqU9u/u5omwJ9KLCPgxXTZNeP6ojxdQY1XwFewASKQC6gPbbATeUmaJG6qOMB1+R6hBBcQ245UvONeaVJMK6dbg8qIoAnJTAvA1Uo0p1la5UGzNSejzE0ILCD8UnxJILUJ4I0KfeCRNAi16oDi4aeblr+mnxTI4XK4IuIAyblzz9EuwCCFirFBAGMkVVKxTi9cLFpk3Dx/wSaBsU8mlDCNIgLeZSAOA6bAU4QwWwEXgoWg/MRnp24a13mG+rOpSEQwJthfzb57YkwyMwHMn91VQ7DigjrD+/1G8DkjQQbd7e2g5+B3XmkK8Yu2f/kJ/tEmggvX/yScCg4scZgCv1tj2pgA7cMNVMIwB1cAlg+ngz5cTBNr7DwOY27bcUp4vQincjx6HfSPow8ch6SND24Uhx957ujH/9oAJI7WUwyfHBUFNkxOjsYz9vmDrf02rf1bIVVfeMV/25/qU4Vcb0ezMHdCJ07Afme9OH2hwZIpY2H6B+oiHqae/JSVC9YYzeMtn+NcBjz5cDWI5NssOcAfSZ+UYpgWbGdTM3JbZ8o2MbslMF0ZR3QvnoeuF63BPWZsXaNuRe0CsADl/Ye7hF/NUsrFXcNBgGxgxOIbF2uycFPNxszJXskP8YD9TzbPhVKa/XIMZvaEUzdU3R/4j7cxMso2W0jJbRMvr+QP8NsluKv9sZ0eAAAAAASUVORK5CYII=",p="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAABGCAAAAAA72CMwAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAcdSURBVGje7Zh9UFTXFcB/sHzlKcIGt5ZvGgIFhEi0aIN0MQmlJpJhbFCridRxJtOksUmcqYwmEidWbSWZMU4S2wQjaaJt/WKcItUSU4LSiIiiIBSYUJdsXCWga/h4lM/tH2/38d7uggszQf/Y89e955w9+3vnvHvvedfDwr0jnncbwA3jhnHDuGHcMPeCuGHcMBMVr+/+Lzr3DoP3i9OAz6t8NAzGZd09mF6xtwZ+mA0MtLRC3MNjeXpMRafXuhbCP/YE+N0XH4aM6Tcl70y98ATGWgC+fnxslqmBqZ37NBQDiE0Pj+M3FTAj1fNikqg0Af8h6S7DGMQkcqAEqAv53jiOjqvp1qWLjV0kLkqZplK3fZWqmSRMvfAAC7XmY7/040KKrG2++YjHHTJzbcPSN0o0ob3lW548rQqYu2dkspm5OFeDdw7iv+irT5a11ZvedFjJFqUMHNDrs4+bLZa+f+r1+k9GDTcW61sslhvnyksO/NUyQRlefNhisdzU63MtNfoOWT30kr7IzlNVpvY8A5kv+QN+meHPUxg732r432ZxfQwcOQSE/2KCibkqPgTcn1lmqLscMlNWa/JXF4Vkjlmm9hcNZG/ylybxz8B71spY3mxJywbi04TJvDJEAyyF4vM/VuhnbmX7f8eC6X2lg0dfkRXZYPi3NKw9xRoP4LHtOyYBUyO9+QlxlDfOURpSktg3FsxeE8IoC7OAL6XhUZJjpFEIE5bhC9Z9LgfsdpkVnGl2DlNfDOsCFSYdtAFgqmSFI7urUicmSoN0gfAglSlVR5FTmP6dIGQoTUPwFQAlCLZaezBBOfPBq3xU0gPgs5wUtVHzFGe7nMF8aoRlvsr0mkEAGDpGss1tojDf7jggcu4tEYAs5tuZE6BOMZWX9llAlZirwAMAbSIP2ZQKmMGG89d0MbND5dS2NhOW7HWyypi+Wn7EgBOKiLoKe9Y4uJDmCNNfCdoIpWM9EAXQAgmOz9z2mhFBhLXPSCH+8j6AdlYTtM5JxjXxjzJUvexYpitAqsqxBoi0wvzAIczpXGPCJ6XHVrHvN4OApeB9nnj3D0nmpvl/hNsulzEW06BjZuqkpI2KqRKIAbgO0+2DmPKJ3eWH9le63Y0fPQfVpYT/1ovQ1VwJ2yEulP0+dYrwU3kUCD1aB5g+QKv8wWFg7QyAHgSHFf0OZPsBLPnYvD8tngp4zAsiogxi/UKF37k7wEyHLkeYaUCAwt9cDMLTANwm0D7a9S9AWu2+aSVUxNNhNQjQrnTcfIcy+UO3Y5kiAUX1+DuwRqpOj2OVDID1yAuAZoiqpg9AlHZuOyn8BgBPD8/wJTNUlumg2GhsBYgEOhWJ+RtEZ9t4hx0yo3qaJlgIlSPQbECY6whzs7usrOxWT8+t2j899a4q2JCqvbMNw4CzP7NpB/NFtDv9pElQxy376CPAoDcAFhAh+fHPTNsWXzsEb9znCLORnI70rcDgrtLD389RWLqtG6s6M94vQLktNf2/r0co0FlnWsyyu7U3C5UqgpTOKBiuQ/vZhrdNug/m40Q6OvgRgHe2tGXI0iO9rXaZYVl5E/m7fQDaX28iept8QAfKWZBhHgSMAbaKpcPXHUvWN5umx87EqTRg3cR7QNWRd4G/Y2bQvKqjce0Zc3fjruVNLN8z2iwEglynYRgGdNlQDcA3FyEDbtMwlJiZOgYLlxEiAfgHpCsNnQj3O8kMkfv3HTRKS3FljjJqPDTZlkgP9A1rIPe0+c+zF8DAHnghAsIwrIz19vK5Lyhptq8jzHmkL4GiU2yYp9BbLpLo6QwGv18v/fJq24zIiBh/VaQ50CA9zv6TRjBnBa2fN/O9lzvyMmKGKlp4djkQtOhzs3WD0+al2rPcNBJwxTJiLG5NWK0ymkTVsadqyIODf+Ikx4HRrZelUa9R8IV+4xCE7j128NQpeHLNLICWBtndvOnDB+0i1MPJcugXozZGqgyNsEAxdeUWonA/JTMc1QNtvV7BUutmXiWGb4nw9ujvazpSQ/pWO8/dxUKpJwyfLCBrg9JQUBpbqJi60kdmQakTtU9McqK1jawSyY/x9fTw0z5SkECjvWcVKZ6AZkkGxy8p9LdLWab0cwUm+OccHBrX41v5dEATJh9UNuk0Ye3J40D5cXIcYdFEYViFuWJchxTYaj3ZKsp41M56Gaw9+XUIHtUPHGGlz4RhdM/xTtd4DtHPcyn3kKnXfP6110laZ2ettfav3DiKoPhyKjInr1I5unaNZtl5Im3buM14XaG1sxZWPGt/s5HTkbYd4Fp+K2+PXhad3ajbq25OXLzTG8y7uG7Z+C7tVzpFj6DQOXYXJy0GwwEWZGhGButOoNsy+hXXvka03wNcvWDs3tx2dFL3M3lysyckpyxWHNG7i9+y+4yamttOV+WeuiF3w7hh3DBuGDeMG+Zeg/k/Td6MoKrHenoAAAAASUVORK5CYII=",t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAABGCAAAAAAifw/TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAARbSURBVGje7ZhtTFtVGMd/UJjQCayOyngZ6OqGEOgYmQRMIAxMIzBBxIQ4lpkguvkJxgwbMabZTIjEJdsg0YXNF+YnEoLug8uYzky3gEBg5WWAlCoE6bJBhI7aAePFD325rWuFy4hL9J5PPec5//vrff7POefe67XM42nej4krgSWwBJbAElgCS2AJLIH/y2Afxy/DpMk0E5Up+goLgyaTaSbt+bWCTcUAr4kHt1cCRIsFO1LtVZgFxInPmbIgBYgRK/MS3iQWMqFhi3gy/e+ibBQrciouPSjXwqUXkkSLnMA98MJauNyEhEcBr0kPLLSupTYE8GIrxK8FPAyKMNEqYR3rXfT39AafOJUMYK7TnBwI0Dew198WXhrV341SB4HVohTxf1cAO+un65sAwuoCoKUSeOsA/HCcG2es8ZZPxgDK8gG6YJd4sJDqm4K+Ka9J8fbZulTjSRislJ+K57NZuAq6WYDbpZVj6dqvtJwetllkt3jRLB682OKwuPEMqvP7Y6LfoRs+5XziDJggE7gPTJXrKDueEZmRyq9Wi5U2iyYLc34TDR4GZSgArbWgDQZuEYVelxk+PgKbISMLgmDpmBFNPmA2EgJ0C6u4awKZR9LUHfdgQf855EXBdP1HvEkXefwE2T7AXmK94edBKIGlvkMG9U7XVZi07+NI99SFvvp9F9wXl0PfPQR9lZbxCeTvJ5KvUfAt7AHwJR5oAGrnJw2QWmmzSG27xqaDHu72w+8fGrKDBf0t4L4xIFoTk+wLGzagH0O+C2CQZFjSgXzEX5GlSomwW7TiRhtetOOLEfdgQT8Biaecp7RBui/ANcVOmAaq1UK0x2FRZ8NcrodTtRi+9lBcPZCESQ+YYavLlA7YDTDZlSUDMxDqFO2CBMbHob08fOjExEr3/hBYBwmcK5mBYAi2538SYBSeA7hIBrAZeMoWn1ywrsLl9z5gqSardCP9osFdEDd/9ZkAeBaGrGN/lBdMAf5W0p0L6u3ARiXYFmtzQR2/gyJ0wJhI99j+gQlW/xzidDqFtFheAtLkXH8A0Fus2xMEqMAAs1WUAVAIHQBzJ6tIxwu28x1pbK2JuEJiyKrB9uJKvEHjl/JcwO+olmOvz/3Sr5OX5XoD+depPjB/0VCuAuCVH3vP+mwbHeiY2l0aSajc0v5Nkzqe4OC5y2T/E8r1q6n90cd4xIhCa92sW2uMgOLFEpuXzactID+ssUkstZcAdhSlA7SesBCr3QJc03LZH7jS7EI4Yt1PS3U5Fe7APND/GR1oL6qRu09GBgmTZsen/bf5Cf2pMXNEmD1XM4ZltQygoi2nonrTQQydLuCXA23g7KPuUo1vrDAoU6lctH6uXRQKp06AbcO0tKGZuFQHfxOvXFyP2GTwdJUm2vMEV4/XD/xEMW+YD616utc6fqGfuhfh4VTsvW0+Z1EWBYYKfq4n2HMr1ckBLK8e/pfBbtr/7/1YAktgCSyBJbAElsCO9hdp+FP075MrqAAAAABJRU5ErkJggg==",c="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFwAAABGCAAAAABkyax5AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAATISURBVFjD7ZhtbFNVGMd/2xw0l21uSkM2HQPGJkzGYDpgBC8SlaBimjE3A3zgRTQKhGD8oCIYlQ8wjS8ENLwaEUTIBAkD4wJmEEeWDAbSjjoHS7c1bs7hLmDXrbDt+qFr77nt7VIaSDTp8+mc5/zPr895znPuubcxKvfOYu8hOwqPwqPwKDwK19l9kUza4oLY4mzAcTA+nv7hq+4evF/prYHeD4DuNiukPxFKqUZi/fNkWe5QVVVVK+SzIWWR5dzhLobjALSbZ4aURQavl16VKPcAXJgRWhYZ/EK+qRT3GaDHPvUuwwdqH2M+lAN2JofWBVdL168X7DeZ9GTBCJ27pXVmnK/d7M7FPKeq0Z6DNc3s83pqstOGhv/xeS1kP9RYVcVGWfDbVqfN8MNt0jgoruKHHOoK/BJPGVvH62m62rn1rSxbjiuq2lMpy/I+beDPeXKj1ntvnaqq6jJZvtYtV2nuWtnyV+hS7Fixg7n7nk8G09ztsKvWN9C73v1GlpDyqQAl8ONvTNKmFyxR3uoOtaEdq5qxvJPo7UxcDF8MDK7u48ZZFk3ncOcCzJE4fC59pABYktv0aQh499pO5qz1OyzQfNbbvHiKpTGa0Mp4AFMRyncFIixuGaeuGMN3tyFpbEYBV73Nw0zJEuacL/Ru7QtAnm4D88fwtSHcdgRWJwtDZmgBoK2alwS/q3qQmDqLgCqPWUR1gwHcUwbS06KyD1oBqEDSzrh9/2ucKPcOLCD9AX3tzYbTBvCTTigZLuj6FZAA+o4yRVvgll1OnNuuDGZB1rMx5VCj9fyHqAbQBe4AxgG0uMXF7xCzsJdAy7M3d/lX4wvJUw0po0WZDRgD0Ag5hGuPgjUoLfWA/sF8HsgYhI8NGz7WVwViWqzABFHVVg1kAbRDgt990hCZUOhrJcKNIHgPkCLqy4HlSQAuJG0/XZeN4E/5W5IRfARwvyBXjoBUDMB1hOovKho6LfFwPQieAdwWRMeApd5suISs+Oz3b278PWyvET1FUfztWAF+TQj8IGRafL/fH4TwDNjaUkMHHwB/eLDUvXZ7g5uUMpO38yBdQYDJm9IDHiv+sEgKgse/DlW+0D2bbEgf+e6vFJRgRpeTXCN2r3f79HBKJsCGWwB0rPmZzD3ZvpFk/W54zQqPGMFdGERO3Doz9uW/KP/YPyttoPRL7a5NxiAvF3k83giuiCdOu6Az9n91yLkegIUvivfLRGgYFQipIx/qfmp9eZre3yCuSLj9TSuLrjpakjJGZyXq9HlweXYA+5qTvIHtFdMbtgfA6wefdoFwSE01el9Nzmy6FOirh/Gf1O97n1tBK5puCs75EFZIw80A1yUyN7dsG5nAIr2/vRPhCIfzfj5/PycW6l3naGrfk8hmz3C9/xhp07VeOJGnLuBQn86jODG7Fx5QCWC7j1ISe2dwFqGcCUz5gc3SjqOBwkq39Ax3CDe/wlZd1q1MG1Yo46DybdHdsZMPE+8UzuJnlTLxn7Y68sGFmYpswdu30b1S95IUHjzmzfzq77Wuq4lcmETcadtzgmq3bW6pfl6Yn1g311j6/B2HXHxbVTtXyHKlIOmU3+3RT4qJ6H/FplEJAK3JSUPKIoOHaf/fb/8oPAqPwv/L8H8BwYY2Ks9nd80AAAAASUVORK5CYII=",r="data:image/png;base64,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",o="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAABGCAAAAAAifw/TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAASkSURBVGje7Zh/TJR1HMdfJ8jgSPEERBDBRCAcnErGkA2G4G6iBiNdbMVsM8iaaxCWSeZuukbS3FRoSWSU1dpsjOVaJjSbqYOEgOOHgByXMOJa3OVx8kNAPPrjfjxHnLaHaG71fP763vez9/N6ns/78/1+n+dk0zyaWPCIuBJYAktgCSyBJbAElsAS+L8MdneMdEazeTg0VfQVprrMZvNw0hNzBZv3ADwjHlxfCBApFuwotSwrDYgWXzP/nZuAKLEymfAlMZUK55aLJ9PxCv6VYkVOzaUF/7lwaYM40SIncCs8NRcuzbD+n4DnpAem6ubSGwL4fh3EzAXcA4og0SphHWtn6O9ode7RYW4AE40j8YsB2jt3eNnSlj7tYKjSB6wWbRJ/uwLYWT90tgogqHwR1BYCL+6GH45w7ZQ1X/tBP0B+JkATbBAPFkrdLOirMqoUuWXlifrj0FUoPxHDx+NwCTTjAL/lFfYnqz9Xc7LHZpHd4vsj4sH3ax0WV54i7Ex2VORLtMBpzsQOgxlSgbuAqUBD/pGUkJREfrFa7G+zyJi1/ZZocA/4BwJQVwpqP+AGoWg1qSsGesEXUtLABywH9agygRE9AUCLsIqbDLg9gDOuvTXu2mNBXwEZoTB0voIXaCKDK7DNHdjx3doF8FMX5ICl41i/ct3MVRj33IYQl9i7FV8BqtxlLsAOfUs3tBeODRiQH4olU6XgW9gMsJAY4BxQOmnUQWKhzSKl7RpL9rp+XMvbHW+FtL9f01y+dBZY0N8A7uoXRaqi4heChwfafuQbALqIB4sG5L1eirSwTcF2i/5uo73y88sqWVTAYcPpQ7PAgt4AsSecZdcheSHAZcU6GAKKlUK21WFR47mJdNenajNlEU+SGKSv2e/51+ZqhTjMWmAEVs6QNcBGAGNTmhuMAIFO2SZYz8AA1Bes6D5qcAn2gmGQrYLbs7paA+v5KGcY/MDPXn8jQB+sAThPCuAL2J0yTllX4fTrh7GUpOV50+ESvOvZ3ARADz6zwE0QPXlp1SJ4HLqtc7cLdpqs97sU+P0zZTjg7Q+2xVq9s5xfQRHYqY+lpT+704Dr9xC/fdke8EcvMd6zwEBA7dgWIEnO1XsAbXs0m32AMNDBeBH5AGRBA8DE8SKSkUE435PEypLgGmIDHtJin4BT19ubK/YalZ/K0wHPN9Uc3DVxs0Mjz09fAGRepXj35HldQRgAT//YVua+uq+zwbQxL4RA+Vj911XKGPz8Ji6y7SHcjm94w+n0s7/66PfrUaitm3VdiR5QJOTYvKw+OQby11Q2yVjpBYCI55MB6o6OsVa9HLis5qIXUFM9A7jfup8ac0yHVMwGc087GrnY3lS9g4+FCH3A+MCQ12pP4bepfyQ4yF6rYd200g3gwPXtB4qX7EXXOAO8dTHA6Ku6dxNmzE/PV4wmJTUPJnW5Tk7mb22ZnjbtMzhm3JmvcINlRapIlznLe12la+Bmm1BG2fz9UX62gohjvi5TH365JRzLvdrRL/4NMKY7wa5PxQvFtkHiO465+Ss1KBQPSDTbB2HC3Hw+saj4/30fS2AJLIElsASWwBLYEX8COk7eiUf+0c0AAAAASUVORK5CYII=",A="data:image/png;base64,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",i="data:image/png;base64,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",h="/zh-cn/assets/003b1add7c7cb3a3e1dc779588014fab-6e38a540.png",j="/zh-cn/assets/bfdd9f38cc1b1220f25734c917e16153-633580be.png",g="/zh-cn/assets/e05d5510aaeaf46a9e2cdf6ae3b818a2-b38efa29.png",d="/zh-cn/assets/7e948d626ced5b735cff1801c43863a5-6ab26544.png",u="/zh-cn/assets/dd296480837e3618f70d3410d656da79-b4b17dcf.jpeg",m=[s,a,n,e,l,p,t,c,r,o,A,i,h,j,g,d,u],y={label:"Xline 持久化存储设计与实现",description:"在 Xline 早期的原型阶段,我们采用了基于内存的存储来实现数据的持久化。这虽然简化了 Xline 原型设计的复杂度,提高了项目的开发和迭代速度,但带来的影响也是显著的:由于数据都存储在内存当中,因此一旦当进程 crash 后,节点的数据恢复需要依赖于从其他正常节点上拉取全量数据,这就需要较长的恢复时间。基于此方面的考虑,Xline 在最新发布的版本 v0.3.0 中引入了一个 Persistent Storage Layer,来将数据持久化到磁盘当中,同时向上层调用方屏蔽掉无关的底层细节。",location:"中国香港",author:["达坦科技"],tags:["Xline"],date:"2023-05-25",title:"Xline Persistent Storage Design and Implementation"},f=[{label:"引言",level:2},{label:"B+ Tree 读写放大分析",level:3},{label:"LSM Tree 读写放大分析",level:3},{label:"总结",level:3},{label:"持久化存储层设计与实现",level:2},{label:"整体架构与写入流程",level:3},{label:"接口设计",level:3},{label:"实现相关",level:3},{label:"性能评估",level:2}],k=`

    引言

    在 Xline 早期的原型阶段,我们采用了基于内存的存储来实现数据的持久化。这虽然简化了 Xline 原型设计的复杂度,提高了项目的开发和迭代速度,但带来的影响也是显著的:由于数据都存储在内存当中,因此一旦当进程 crash 后,节点的数据恢复需要依赖于从其他正常节点上拉取全量数据,这就需要较长的恢复时间。

    基于此方面的考虑,Xline 在最新发布的版本 v0.3.0 中引入了一个 Persistent Storage Layer,来将数据持久化到磁盘当中,同时向上层调用方屏蔽掉无关的底层细节。

    ## 存储引擎选型

    @@ -476,4 +476,4 @@ StorageEngine Trait 定义(engine/src/engine_api.rs):

    性能评估

    在 v0.3.0 的新版本中,我们除了引入了 Persistent Storage Layer 以外,还对 CURP 的部分内容做了一些大型的重构。在重构完毕,添加新功能后,前不久通过了 validation test 和 Integration test。性能部分的测试信息,已经在 Xlinev0.4.0  中释放出来。

    性能报告请参考链接:

    -

    https://github.com/datenlord/Xline/blob/master/img/xline-key-perf.png

    `;export{m as assetURLs,f as default,y as metadata,k as toc}; +

    https://github.com/datenlord/Xline/blob/master/img/xline-key-perf.png

    `;export{m as assetURLs,k as default,y as metadata,f as toc}; diff --git a/zh-cn/assets/index-af83501f.js b/zh-cn/assets/index-9a9f68d0.js similarity index 98% rename from zh-cn/assets/index-af83501f.js rename to zh-cn/assets/index-9a9f68d0.js index e10ccf2..7540ddb 100644 --- a/zh-cn/assets/index-af83501f.js +++ b/zh-cn/assets/index-9a9f68d0.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/image1-b974e0d0.png",i="/zh-cn/assets/image2-599a44cc.jpg",a="data:image/png;base64,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",A="data:image/png;base64,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",o="/zh-cn/assets/image5-184dc93a.png",r="/zh-cn/assets/image6-18c75b26.jpg",n="/zh-cn/assets/image7-6a4a9bfe.png",t="/zh-cn/assets/image8-1849dbeb.png",s="/zh-cn/assets/image9-14a6fe14.jpg",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 的实践、挑战和经验的分享。

    +const e="/zh-cn/assets/image1-b974e0d0.png",i="/zh-cn/assets/image2-599a44cc.jpg",a="data:image/png;base64,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",A="data:image/png;base64,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",o="/zh-cn/assets/image5-184dc93a.png",r="/zh-cn/assets/image6-18c75b26.jpg",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,o,r,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"},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

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

    演讲摘要: 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,c as default,l as metadata,h as toc}; +

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

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

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

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

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

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

    嘉宾演讲 (Presenter & Topic)

    @@ -31,4 +31,4 @@ const e="/zh-cn/assets/cover-c938ebe8.png",t="/zh-cn/assets/image1-a88ec652.jpg"

    Meetup 报名方式 (Registration)

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

    阅读原文

    -

    图片

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

    图片

    `;export{r as assetURLs,o as default,n as metadata,i as toc}; diff --git a/zh-cn/assets/index-1dde53bb.js b/zh-cn/assets/index-b503fc36.js similarity index 96% rename from zh-cn/assets/index-1dde53bb.js rename to zh-cn/assets/index-b503fc36.js index 23a48ca..f49e372 100644 --- a/zh-cn/assets/index-1dde53bb.js +++ b/zh-cn/assets/index-b503fc36.js @@ -1,4 +1,4 @@ -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=`

    数据库隔离级别介绍

    +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],o={label:"数据库隔离级别及MVCC",description:"数据库在同时处理多个事务时需要决定事务之间能否看到对方的修改,能看到多少等等。根据隔离的严格程度,从严到松可以分为 Serializable, Repeatable reads, Read committed, Read uncommitted。我们用下面这个 KV 存储的例子来解释这四个隔离级别。KV 存储的初始状态如下:",location:"中国香港",tags:["Xline"],date:"2023-02-16",title:"Database isolation level and MVCC"},n=[{label:"数据库隔离级别介绍",level:2},{label:"Read uncommitted",level:3},{label:"Repeatable read",level:3},{label:"Serializable",level:3},{label:"Snapshot 隔离级别及 MVCC",level:2},{label:"一点联想",level:2},{label:"总结",level:2}],s=`

    数据库隔离级别介绍

    数据库在同时处理多个事务时需要决定事务之间能否看到对方的修改,能看到多少等等。根据隔离的严格程度,从严到松可以分为 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 的特性:

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

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

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

      -

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

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

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

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

      图片

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

      图片

      内容简介

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

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

      本周六(10 月 15 日)下午 3 点,达坦科技和 Rust 语言中文社区合作,由达坦科技的联合创始人施继成在 Rust 唠嗑室做开源分布式存储技术的分享,介绍 Xline 是如何实现高性能跨数据中心的数据一致性管理。欢迎大家预约收看!

      -

      图片

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

      图片

      `;export{e as assetURLs,o as default,n as metadata,a as toc}; diff --git a/zh-cn/assets/index-f5cc00ea.js b/zh-cn/assets/index-c2d3b4f6.js similarity index 97% rename from zh-cn/assets/index-f5cc00ea.js rename to zh-cn/assets/index-c2d3b4f6.js index 0d38c01..17909b1 100644 --- a/zh-cn/assets/index-f5cc00ea.js +++ b/zh-cn/assets/index-c2d3b4f6.js @@ -1,7 +1,7 @@ -const e="/zh-cn/assets/image1-d5e6eb74.jpg",t="/zh-cn/assets/image2-5d4b8e33.jpg",s="/zh-cn/assets/image3-a4b62ce6.jpg",a=[e,t,s],p={label:"创造性地精细造车轮:RDMA的Rust安全实践",description:"极客时间打造的QCon+案例研习社以案例讲解视频、主题直播、社群交互结合的全新线上学习模式,为数字化人才提供利用碎片化时间来提升知识和技能的平台",location:"新加坡",date:"2022-07-28",title:"Creatively fine tuned wheels: RDMA's Rust safety practices"},n=[{label:"讲解回顾",level:2},{label:"达坦宗旨",level:2},{label:"联系我们",level:2},{label:"推荐阅读",level:2}],i=`

      极客时间打造的 QCon+案例研习社以案例讲解视频、主题直播、社群交互结合的全新线上学习模式,为数字化人才提供利用碎片化时间来提升知识和技能的平台。

      +const t="/zh-cn/assets/image1-d5e6eb74.jpg",e="/zh-cn/assets/image2-5d4b8e33.jpg",s="/zh-cn/assets/image3-a4b62ce6.jpg",a=[t,e,s],p={label:"创造性地精细造车轮:RDMA的Rust安全实践",description:"极客时间打造的QCon+案例研习社以案例讲解视频、主题直播、社群交互结合的全新线上学习模式,为数字化人才提供利用碎片化时间来提升知识和技能的平台",location:"新加坡",date:"2022-07-28",title:"Creatively fine tuned wheels: RDMA's Rust safety practices"},n=[{label:"讲解回顾",level:2},{label:"达坦宗旨",level:2},{label:"联系我们",level:2},{label:"推荐阅读",level:2}],i=`

      极客时间打造的 QCon+案例研习社以案例讲解视频、主题直播、社群交互结合的全新线上学习模式,为数字化人才提供利用碎片化时间来提升知识和技能的平台。

      讲解回顾

      达坦科技联合创始人施继成受邀作为案例研习社的讲师,近日分享了达坦实用的、可落地的 Rust 技术应用开发经验和实践案例,介绍了达坦是如何使用以安全性著称的系统编程语言—Rust 去封装 RDMA 接口以达到安全高效的目的。

      -

      图片

      +

      图片

      在分享中,施继成简单介绍了 Rust 语言的三大特性。首先,Rust 语言的所有权(ownership)和借用(borrowing)机制对内存管理友好。这一特性非常严格地控制了如果一个内存被大家共享的时候的访问权限和边界。

      其次,Rust 提供了很方便的异步编程接口。它有 Async 和 Await 两个关键词,同时在它的标准库中有 Futures 的完整的接口支持。因此,Rust 天生支持异步 I/O 编程接口。

      最后,Rust 还支持零成本抽象。也就是说,在程序构建的过程中,它能提供一个比较高的抽象层,但是抽象层又不会带来性能损失。这带来两大优势: 第一,在构建程序的时候,得以用到比较高级的抽象层,减少了代码冗余;第二,又不会因为抽象层带来性能的损失,因为编译器已经帮忙将抽象展开。鱼和熊掌,两者兼得。

      @@ -13,7 +13,7 @@ const e="/zh-cn/assets/image1-d5e6eb74.jpg",t="/zh-cn/assets/image2-5d4b8e33.jpg

      欲了解此次分享中具体的技术细节和设计要点,请点击以下链接,领取极客时间 7 天会员,免费观看完整视频:
      https://time.geekbang.org/activity/promo?page_name=page_447

      有意观看完整视频,请扫如下的二维码:

      -

      图片

      +

      图片

      联系我们

      欢迎参与达坦科技开源项目 async-rdma,Github 链接:https://github.com/datenlord/async-rdma

      有意加入 Rust 前沿交流讨论群,请扫如下的二维码

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

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

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

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

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

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

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

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

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

      -

      图片

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

      图片

      `;export{e as assetURLs,r as default,s as metadata,n as toc}; diff --git a/zh-cn/assets/index-1e46583f.js b/zh-cn/assets/index-cf17c7a4.js similarity index 97% rename from zh-cn/assets/index-1e46583f.js rename to zh-cn/assets/index-cf17c7a4.js index d68d7c1..45a637e 100644 --- a/zh-cn/assets/index-1e46583f.js +++ b/zh-cn/assets/index-cf17c7a4.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}],p=`

      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}],o=`

      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,p as default,e as metadata,l as toc}; +

      图片

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

      图片

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

      图片

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

      图片

      `;export{t as assetURLs,s as default,l as metadata,r as toc}; diff --git a/zh-cn/assets/index-213034fe.js b/zh-cn/assets/index-d654fc6e.js similarity index 97% rename from zh-cn/assets/index-213034fe.js rename to zh-cn/assets/index-d654fc6e.js index e37ecd3..a4698aa 100644 --- a/zh-cn/assets/index-213034fe.js +++ b/zh-cn/assets/index-d654fc6e.js @@ -1,4 +1,4 @@ -const n="/zh-cn/assets/cover-99998007.jpg",s="/zh-cn/assets/image1-6f9cec09.jpg",e=[n,s],t={label:"精彩回顾|硬件敏捷开发与验证方法学研讨",description:"8月27日,作为2022年第二届RISC-V中国峰会的同期活动,达坦科技成功举办硬件敏捷开发与验证方法学研讨。虽然是线上分享活动,但大家热情依旧,会后在“硬件敏捷开发和验证方法学讨论群”中积极互动提问。长达四小时的就新一代HDL在数字芯片设计方面的实践经验分享,究竟碰撞出了什么新的火花呢?下面我们一起来回顾研讨会的精彩内容。",cover:"./cover.jpg",location:"中国香港",date:"2022-09-08",title:"Discussion on Hardware Agile Development and Verification Methodology"},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=`

      封面

      +const n="/zh-cn/assets/cover-99998007.jpg",e="/zh-cn/assets/image1-6f9cec09.jpg",s=[n,e],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",s="/zh-cn/assets/image1-6f9cec09.jpg"

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

      -

      图片

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

      图片

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

      SpinalHDL 是什么?

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

      SpinalHDL 是什么?

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

      达坦科技是谁?

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

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

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

      图片

      -

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

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

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

      `;export{a as assetURLs,i as default,n as metadata,p as toc}; diff --git a/zh-cn/assets/index-917f23ec.js b/zh-cn/assets/index-e01a3d91.js similarity index 92% rename from zh-cn/assets/index-917f23ec.js rename to zh-cn/assets/index-e01a3d91.js index 12e3bf7..de41ae0 100644 --- a/zh-cn/assets/index-917f23ec.js +++ b/zh-cn/assets/index-e01a3d91.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",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 的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注。

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

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

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

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

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

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

      图片

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

      -

      图片

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

      图片

      `;export{r as assetURLs,g as default,o as metadata,a as toc}; diff --git a/zh-cn/assets/index-78a34e98.js b/zh-cn/assets/index-e7ccea1d.js similarity index 89% rename from zh-cn/assets/index-78a34e98.js rename to zh-cn/assets/index-e7ccea1d.js index aa88b97..0c3885e 100644 --- a/zh-cn/assets/index-78a34e98.js +++ b/zh-cn/assets/index-e7ccea1d.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"},a=[{label:"内容介绍",level:2}],n=`

      封面

      +const t="/zh-cn/assets/cover-3674aa81.jpg",e=[t],n={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"},s=[{label:"内容介绍",level:2}],a=`

      封面

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

      内容介绍

      -

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

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

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

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

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

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

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

      图片

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

      图片

      @@ -34,7 +34,7 @@ const i="/zh-cn/assets/cover-964a3e23.png",e="/zh-cn/assets/image1-c300ce2e.png"

      陈莉君 西安邮电大学 教授 赖晓铮 华南理工大学计算机学院 副教授

      开源毕设项目的流程

      -

      图片

      +

      图片

      申请流程

      1. 简历投递: 需罗列本人擅长的专业技能、过往项目经历、研究成果等。
      2. @@ -44,6 +44,6 @@ const i="/zh-cn/assets/cover-964a3e23.png",e="/zh-cn/assets/image1-c300ce2e.png"

      如果你对开源毕业设计感兴趣,对毕设的项目要求和细节解读有疑问,对毕设的申请及流程想咨询,欢迎大家参与 2023 年 1 月 8 日 20:00 的直播。

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

      -

      图片

      +

      图片

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

      -

      图片

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

      图片

      `;export{i as assetURLs,a as default,p as metadata,r as toc}; diff --git a/zh-cn/assets/index-2a76e7d1.js b/zh-cn/assets/index-f9f53c26.js similarity index 93% rename from zh-cn/assets/index-2a76e7d1.js rename to zh-cn/assets/index-f9f53c26.js index 0c43da0..8e67d19 100644 --- a/zh-cn/assets/index-2a76e7d1.js +++ b/zh-cn/assets/index-f9f53c26.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}}}})(L2);(function(e){e.exports=L2})(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 b($){for(var le=r(h);le!==null;){if(le.callback===null)n(h);else if(le.startTime<=$)n(h),le.sortIndex=le.expirationTime,t(d,le);else break;le=r(h)}}function E($){if(D=!1,b($),!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(b(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),b(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 * @@ -34,10 +34,10 @@ var CE=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var nQ=CE((sQ,ou) `+Yf+e}var Vf=!1;function Hf(e,t){if(!e||Vf)return"";Vf=!0;var r=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(t,[])}catch(h){var n=h}Reflect.construct(e,[],t)}else{try{t.call()}catch(h){n=h}e.call(t.prototype)}else{try{throw Error()}catch(h){n=h}e()}}catch(h){if(h&&n&&typeof h.stack=="string"){for(var i=h.stack.split(` `),o=n.stack.split(` `),a=i.length-1,c=o.length-1;1<=a&&0<=c&&i[a]!==o[c];)c--;for(;1<=a&&0<=c;a--,c--)if(i[a]!==o[c]){if(a!==1||c!==1)do if(a--,c--,0>c||i[a]!==o[c]){var d=` -`+i[a].replace(" at new "," at ");return e.displayName&&d.includes("")&&(d=d.replace("",e.displayName)),d}while(1<=a&&0<=c);break}}}finally{Vf=!1,Error.prepareStackTrace=r}return(e=e?e.displayName||e.name:"")?Da(e):""}function rA(e){switch(e.tag){case 5:return Da(e.type);case 16:return Da("Lazy");case 13:return Da("Suspense");case 19:return Da("SuspenseList");case 0:case 2:case 15:return e=Hf(e.type,!1),e;case 11:return e=Hf(e.type.render,!1),e;case 1:return e=Hf(e.type,!0),e;default:return""}}function Rm(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Xo:return"Fragment";case Ko:return"Portal";case 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")&&(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,b[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===b.length)return r(y,P),et&&eo(y,O),T;if(P===null){for(;OO?(z=P,P=null):z=P.sibling;var ee=_(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=b.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=b.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,b,E){if(typeof b=="object"&&b!==null&&b.type===Xo&&b.key===null&&(b=b.props.children),typeof b=="object"&&b!==null){switch(b.$$typeof){case nc:e:{for(var T=b.key,R=w;R!==null;){if(R.key===T){if(T=b.type,T===Xo){if(R.tag===7){r(y,R.sibling),w=i(R,b.props.children),w.return=y,y=w;break e}}else if(R.elementType===T||typeof T=="object"&&T!==null&&T.$$typeof===yi&&Yy(T)===R.type){r(y,R.sibling),w=i(R,b.props),w.ref=ha(y,R,b),w.return=y,y=w;break e}r(y,R);break}else t(y,R);R=R.sibling}b.type===Xo?(w=uo(b.props.children,y.mode,E,b.key),w.return=y,y=w):(E=qc(b.type,b.key,b.props,null,y.mode,E),E.ref=ha(y,w,b),E.return=y,y=E)}return a(y);case Ko:e:{for(R=b.key;w!==null;){if(w.key===R)if(w.tag===4&&w.stateNode.containerInfo===b.containerInfo&&w.stateNode.implementation===b.implementation){r(y,w.sibling),w=i(w,b.children||[]),w.return=y,y=w;break e}else{r(y,w);break}else t(y,w);w=w.sibling}w=ch(b,y.mode,E),w.return=y,y=w}return a(y);case yi:return R=b._init,j(y,w,R(b._payload),E)}if(ja(b))return C(y,w,b,E);if(la(b))return D(y,w,b,E);mc(y,b)}return typeof b=="string"&&b!==""||typeof b=="number"?(b=""+b,w!==null&&w.tag===6?(r(y,w.sibling),w=i(w,b),w.return=y,y=w):(r(y,w),w=lh(b,y.mode,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 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;/** +`+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 b=t.stateNode.containerInfo;b.nodeType===1?b.textContent="":b.nodeType===9&&b.documentElement&&b.removeChild(b.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(H(163))}}catch(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 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]}/** + */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 b=l1(w,h),E=D.createHref(w);try{a.pushState(b,"",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 b=l1(w,h),E=D.createHref(w);a.replaceState(b,"",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,b=!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=b===!0||y.navigation.formMethod!=null&&Hn(y.navigation.formMethod)&&((J=L.state)==null?void 0:J._isRedirect)!==!0;i&&(n=i,i=void 0),ue(Oe({},N,{actionData:fe,loaderData:ie,historyAction:w,location:L,initialized:!0,navigation:dh,revalidation:"idle",restoreScrollPosition:Kt(L,N.matches||y.matches),preventScrollReset:ce,blockers:new Map(y.blockers)})),T||w===vt.Pop||(w===vt.Push?e.history.push(L,L.state):w===vt.Replace&&e.history.replace(L,L.state)),w=vt.Pop,b=!1,T=!1,R=!1,P=[],O=[]}async function st(L,N){if(typeof L=="number"){e.history.go(L);return}let V=wp(y.location,y.matches,o,a.v7_prependBasename,L,N==null?void 0:N.fromRouteId,N==null?void 0:N.relative),{path:J,submission:re,error:fe}=d1(a.v7_normalizeFormMethod,!1,V,N),ie=y.location,ce=ul(y.location,J,N&&N.state);ce=Oe({},ce,e.history.encodeLocation(ce));let ne=N&&N.replace!=null?N.replace:void 0,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),b=(V&&V.preventScrollReset)===!0;let J=i||n,re=V&&V.overrideNavigation,fe=ss(J,N,o);if(!fe){let ct=Br(404,{pathname:N.pathname}),{matches:tt,route:Yt}=v1(J);pt(),he(N,{matches:tt,loaderData:{},errors:{[Yt.id]:ct}});return}if(NR(y.location,N)&&!(V&&V.submission&&Hn(V.submission.formMethod))){he(N,{matches:fe});return}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(b=(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:b}):ie?await K(ne,ce,{overrideNavigation:{state:"loading",location:ce,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},fetcherSubmission:re,preventScrollReset:b}):await K(ne,ce,{overrideNavigation:{state:"loading",location:ce,formMethod:re?re.formMethod:void 0,formAction:re?re.formAction:void 0,formEncType:re?re.formEncType:void 0,formData:re?re.formData:void 0},preventScrollReset:b})}async function pr(L,N,V,J,re){let fe=await Promise.all([...V.map(ne=>ga("loader",re,ne,N,r,t,o)),...J.map(ne=>ne.matches&&ne.match&&ne.controller?ga("loader",va(e.history,ne.path,ne.controller.signal),ne.match,ne.matches,r,t,o):{type:St.error,error:Br(404,{pathname:ne.path})})]),ie=fe.slice(0,V.length),ce=fe.slice(V.length);return await Promise.all([w1(L,V,ie,ie.map(()=>re.signal),!1,y.loaderData),w1(L,J.map(ne=>ne.match),ce,J.map(ne=>ne.controller?ne.controller.signal:null),!0)]),{results:fe,loaderResults:ie,fetcherResults:ce}}function qs(){R=!0,P.push(...pt()),lt.forEach((L,N)=>{z.has(N)&&(O.push(N),ci(N))})}function Zs(L,N,V){let J=as(y.matches,N);Js(L),ue({errors:{[J.route.id]:V},fetchers:new Map(y.fetchers)})}function Js(L){z.has(L)&&ci(L),lt.delete(L),te.delete(L),G.delete(L),y.fetchers.delete(L)}function ci(L){let N=z.get(L);be(N,"Expected fetch controller: "+L),N.abort(),z.delete(L)}function Hl(L){for(let N of L){let J={state:"idle",data:Yr(N).data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};y.fetchers.set(N,J)}}function Fl(){let L=[],N=!1;for(let V of G){let J=y.fetchers.get(V);be(J,"Expected fetcher: "+V),J.state==="loading"&&(G.delete(V),L.push(V),N=!0)}return Hl(L),N}function ui(L){let N=[];for(let[V,J]of te)if(J0}function Dt(L,N){let V=y.blockers.get(L)||u1;return ze.get(L)!==N&&ze.set(L,N),V}function 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)}))}),b=[];return d.forEach((E,T)=>{if(!r.some(z=>z.route.id===E.routeId))return;let R=ss(h,E.path,g);if(!R){b.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)){b.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}))&&b.push({key:T,routeId:E.routeId,path:E.path,matches:R,match:P,controller:new AbortController})}),[w,b]}function MR(e,t,r){let n=!t||r.route.id!==t.route.id,i=e[r.route.id]===void 0;return n||i}function 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((b,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 b=v.headers.get("Location");if(be(b,"Redirects returned/thrown from loaders/actions must have a Location header"),!Y_.test(b))b=wp(new URL(t.url),n.slice(0,n.indexOf(r)+1),a,!0,b);else if(!c){let E=new URL(t.url),T=b.startsWith("//")?new URL(E.protocol+b):new URL(b),R=Fs(T.pathname,a)!=null;T.origin===E.origin&&R&&(b=T.pathname+T.search+T.hash)}if(c)throw v.headers.set("Location",b),v;return{type:St.redirect,status:j,location:b,revalidate:v.headers.get("X-Remix-Revalidate")!==null}}if(d)throw{type:g||St.data,response:v};let y,w=v.headers.get("Content-Type");return w&&/\bapplication\/json\b/.test(w)?y=await v.json():y=await v.text(),g===St.error?{type:g,error:new tg(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. @@ -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=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)&&(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),b=h.startsWith("//")?new URL(w.protocol+h):new URL(h),E=Fs(b.pathname,_);b.origin===w.origin&&E!=null?h=E+b.search+b.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,b="",E=i,T=o,R=n,P=b;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,b,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,b,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,b=P="",v=a;break;case 58:v=1+$n(P),k=C;default:if(D<1){if(w==123)--D;else if(w==125&&D++==0&&kO()==125)continue}switch(P+=og(w),w*D){case 38:y=g>0?1:(P+="\f",-1);break;case 44:c[h++]=($n(P)-1)*y,y=1;break;case 64:fo()===45&&(P+=fh(Zr())),_=fo(),g=v=$n(b=P+=TO(Jc())),w++;break;case 45:C===45&&$n(P)==2&&(D=0)}}return o}function k1(e,t,r,n,i,o,a,c,d,h,g){for(var v=i-1,_=i===0?o:[""],k=sg(_),C=0,D=0,j=0;C0?_[y]+" "+w:ye(w,/&\f/g,_[y])))&&(d[j++]=b);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(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;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,b){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 b(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{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; -`,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}};/*! +`,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 b(){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=b,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=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` +*/(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,b={},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)),b={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?(b={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}):b={currentSlide:j,trackStyle:pl(Ze(Ze({},t),{},{left:w})),lazyLoadedList:C,targetSlide:T};return{state:b,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&&b&&(b(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 b,E,T=D?C:k;switch(y){case"left":case"up":E=T+Lp(r),b=g?Pp(r,E):E,w.currentDirection=0;break;case"right":case"down":E=T-Lp(r),b=g?Pp(r,E):E,w.currentDirection=1;break;default:b=T}w.triggerSlideHandler=b}else{var R=gl(r);w.trackStyle=bg(Ze(Ze({},r),{},{left:R}))}return w};W.swipeEnd=RL;var NS=function(t){for(var r=t.infinite?t.slideCount*2:t.slideCount,n=t.infinite?t.slidesToShow*-1:0,i=t.infinite?t.slidesToShow*-1:0,o=[];nn[n.length-1])r=n[n.length-1];else for(var o in n){if(rt.swipeLeft*-1)return n=d,!1}else if(d.offsetLeft-r+Lu(d)/2>t.swipeLeft*-1)return n=d,!1;return!0}),!n)return 0;var a=t.rtl===!0?t.slideCount-t.currentSlide:t.currentSlide,c=Math.abs(n.dataset.index-a)||1;return c}else return t.slidesToScroll};W.getSlideCount=Lp;var Kd=function(t,r){return r.reduce(function(n,i){return n&&t.hasOwnProperty(i)},!0)?null:console.error("Keys Missing:",t)};W.checkSpecKeys=Kd;var pl=function(t){Kd(t,["left","variableWidth","slideCount","slidesToShow","slideWidth"]);var r,n,i=t.slideCount+2*t.slidesToShow;t.vertical?n=i*t.slideHeight:r=YS(t)*t.slideWidth;var o={opacity:1,transition:"",WebkitTransition:""};if(t.useTransform){var a=t.vertical?"translate3d(0px, "+t.left+"px, 0px)":"translate3d("+t.left+"px, 0px, 0px)",c=t.vertical?"translate3d(0px, "+t.left+"px, 0px)":"translate3d("+t.left+"px, 0px, 0px)",d=t.vertical?"translateY("+t.left+"px)":"translateX("+t.left+"px)";o=Ze(Ze({},o),{},{WebkitTransform:a,transform:c,msTransform:d})}else t.vertical?o.top=t.left:o.left=t.left;return t.fade&&(o={opacity:1}),r&&(o.width=r),n&&(o.height=n),window&&!window.addEventListener&&window.attachEvent&&(t.vertical?o.marginTop=t.left+"px":o.marginLeft=t.left+"px"),o};W.getTrackCSS=pl;var bg=function(t){Kd(t,["left","variableWidth","slideCount","slidesToShow","slideWidth","speed","cssEase"]);var r=pl(t);return t.useTransform?(r.WebkitTransition="-webkit-transform "+t.speed+"ms "+t.cssEase,r.transition="transform "+t.speed+"ms "+t.cssEase):t.vertical?r.transition="top "+t.speed+"ms "+t.cssEase:r.transition="left "+t.speed+"ms "+t.cssEase,r};W.getTrackAnimateCSS=bg;var gl=function(t){if(t.unslick)return 0;Kd(t,["slideIndex","trackRef","infinite","centerMode","slideCount","slidesToShow","slidesToScroll","slideWidth","listWidth","variableWidth","slideHeight"]);var r=t.slideIndex,n=t.trackRef,i=t.infinite,o=t.centerMode,a=t.slideCount,c=t.slidesToShow,d=t.slidesToScroll,h=t.slideWidth,g=t.listWidth,v=t.variableWidth,_=t.slideHeight,k=t.fade,C=t.vertical,D=0,j,y,w=0;if(k||t.slideCount===1)return 0;var b=0;if(i?(b=-Ua(t),a%d!==0&&r+d>a&&(b=-(r>a?c-(r-a):a%d)),o&&(b+=parseInt(c/2))):(a%d!==0&&r+d>a&&(b=c-a%d),o&&(b=parseInt(c/2))),D=b*h,w=b*_,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(b){return i.state.lazyLoadedList.indexOf(b)<0});v&&w.length>0&&v(w),!i.props.waitForAnimate&&i.animationEndCallback&&(clearTimeout(i.animationEndCallback),k&&k(C),delete i.animationEndCallback),i.setState(j,function(){h&&i.asNavForIndex!==a&&(i.asNavForIndex=a,h.innerSlider.slideHandler(a)),y&&(i.animationEndCallback=setTimeout(function(){var b=y.animating,E=PM(y,["animating"]);i.setState(E,function(){i.callbackTimers.push(setTimeout(function(){return i.setState({animating:b})},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),b=i.props.touchMove,E={className:"slick-list",style:w,onClick:i.clickHandler,onMouseDown:b?i.swipeStart:null,onMouseMove:i.state.dragging&&b?i.swipeMove:null,onMouseUp:b?i.swipeEnd:null,onMouseLeave:i.state.dragging&&b?i.swipeEnd:null,onTouchStart:b?i.swipeStart:null,onTouchMove:i.state.dragging&&b?i.swipeMove:null,onTouchEnd:b?i.touchEnd:null,onTouchCancel:i.state.dragging&&b?i.swipeEnd:null,onKeyDown:i.props.accessibility?i.keyHandler:null},T={className:a,dir:"ltr",style:i.props.style};return i.props.unslick&&(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; @@ -1508,7 +1508,7 @@ Error generating stack: `+o.message+` font-size: 0.145rem; line-height: 0.258rem; color: ${e=>e.theme.secondary02}; -`,h7=()=>{const e=ht();return l.jsx(n7,{id:"tech-share",children:l.jsxs(i7,{children:[l.jsx(o7,{children:"技术分享"}),l.jsx(s7,{children:e7.map(({key:t,cover:r,title:n,text:i,url:o})=>l.jsx(a7,{children:l.jsxs(l7,{onClick:()=>{e(o)},children:[l.jsx(c7,{src:r}),l.jsxs(u7,{children:[l.jsx(d7,{children:n}),l.jsx(f7,{children:i})]})]})},t))})]})})},m7="modulepreload",p7=function(e){return"/zh-cn/"+e},bw={},b=function(t,r,n){if(!r||r.length===0)return t();const i=document.getElementsByTagName("link");return Promise.all(r.map(o=>{if(o=p7(o),o in bw)return;bw[o]=!0;const a=o.endsWith(".css"),c=a?'[rel="stylesheet"]':"";if(!!n)for(let g=i.length-1;g>=0;g--){const v=i[g];if(v.href===o&&(!a||v.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${o}"]${c}`))return;const h=document.createElement("link");if(h.rel=a?"stylesheet":m7,a||(h.as="script",h.crossOrigin=""),h.href=o,document.head.appendChild(h),a)return new Promise((g,v)=>{h.addEventListener("load",g),h.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${o}`)))})})).then(()=>t())},kw="/zh-cn/assets/right-arrow-98730871.svg",Cw="/zh-cn/assets/dynamics-test-image-29ac43b9.png",{Heading:g7,Paragraph:v7}=Pe,{CNHead4:y7,CNTitleLarge:w7,CNTitleMedium:x7}=g7,{CNBodySmall:vb,CNMarkSmall:_7}=v7,S7=f.section` +`,h7=()=>{const e=ht();return l.jsx(n7,{id:"tech-share",children:l.jsxs(i7,{children:[l.jsx(o7,{children:"技术分享"}),l.jsx(s7,{children:e7.map(({key:t,cover:r,title:n,text:i,url:o})=>l.jsx(a7,{children:l.jsxs(l7,{onClick:()=>{e(o)},children:[l.jsx(c7,{src:r}),l.jsxs(u7,{children:[l.jsx(d7,{children:n}),l.jsx(f7,{children:i})]})]})},t))})]})})},m7="modulepreload",p7=function(e){return"/zh-cn/"+e},bw={},S=function(t,r,n){if(!r||r.length===0)return t();const i=document.getElementsByTagName("link");return Promise.all(r.map(o=>{if(o=p7(o),o in bw)return;bw[o]=!0;const a=o.endsWith(".css"),c=a?'[rel="stylesheet"]':"";if(!!n)for(let g=i.length-1;g>=0;g--){const v=i[g];if(v.href===o&&(!a||v.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${o}"]${c}`))return;const h=document.createElement("link");if(h.rel=a?"stylesheet":m7,a||(h.as="script",h.crossOrigin=""),h.href=o,document.head.appendChild(h),a)return new Promise((g,v)=>{h.addEventListener("load",g),h.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${o}`)))})})).then(()=>t())},kw="/zh-cn/assets/right-arrow-98730871.svg",Cw="/zh-cn/assets/dynamics-test-image-29ac43b9.png",{Heading:g7,Paragraph:v7}=Pe,{CNHead4:y7,CNTitleLarge:w7,CNTitleMedium:x7}=g7,{CNBodySmall:vb,CNMarkSmall:_7}=v7,S7=f.section` background: ${e=>e.theme.white00}; `,b7=f.div` max-width: 1440px; @@ -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-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` +`,Ew=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>S(()=>import("./index-35dfbee0.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>S(()=>import("./index-192ae9c1.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>S(()=>import("./index-c7f65d1f.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>S(()=>import("./index-5d88950d.js"),[]),"/src/articles/events/2022-11-11-Datan-Technology-invites-you-who-love-challenges-to-participate-in-Rust-China-Hackathon-2022/index.md":()=>S(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>S(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>S(()=>import("./index-17cb538a.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>S(()=>import("./index-e197de7f.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>S(()=>import("./index-eed6a3b1.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>S(()=>import("./index-4e03f569.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>S(()=>import("./index-1f0dff83.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>S(()=>import("./index-a1a1a279.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>S(()=>import("./index-d2a8186a.js"),[]),"/src/articles/events/2023-05-04-Meet-this-summer|Datan-Technology-invites-you-to-participate-in-the-2023-Open-Source-Summer/index.md":()=>S(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>S(()=>import("./index-2b1c59a2.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>S(()=>import("./index-e01a3d91.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>S(()=>import("./index-4d1333f2.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>S(()=>import("./index-89698b14.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>S(()=>import("./index-6a3ed4c3.js"),[]),"/src/articles/events/2023-09-07-The-2nd-Hardware-Agile-Development-and-Methodology-Workshop-l-2023-RISC-V-China-Summit-Concurrent-Events-Successfully-Held/index.md":()=>S(()=>import("./index-696ef44a.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>S(()=>import("./index-5fa4b651.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>S(()=>import("./index-dfd283a0.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>S(()=>import("./index-7007c1ed.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>S(()=>import("./index-24fab036.js"),[]),"/src/articles/events/2023-12-05-Ding!-2023-hackathon-tips-fresh-from-the-oven!-Last-week-to-sign-up-before-it's-too-late!/index.md":()=>S(()=>import("./index-2ab66d66.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>S(()=>import("./index-50ad21f0.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>S(()=>import("./index-cc4e4968.js"),[]),"/src/articles/events/2024-02-22-Recruitment-can't-stop-Dartan-Technology-2024-internship-positions-waiting-for-you/index.md":()=>S(()=>import("./index-db271263.js"),[]),"/src/articles/events/2024-02-29-A-Challenge-Letter-from-DatenLord-on-GSoC-2024/index.md":()=>S(()=>import("./index-d4dfb508.js"),[]),"/src/articles/events/2024-04-04-Come-and-get-your-own-mind-blowing-offer-from-Dartan-Technologies/index.md":()=>S(()=>import("./index-d70f9808.js"),[]),"/src/articles/events/2024-05-09-DartanLord-@-you-and-invited-you-to-the-2024-Summer-of-Open-Source!/index.md":()=>S(()=>import("./index-68779906.js"),[])}),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-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` +`,Aw=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>S(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>S(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>S(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>S(()=>import("./index-fe9ae8f0.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>S(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>S(()=>import("./index-9d5e23a7.js"),[]),"/src/articles/blogs/2022-05-27-Rust-implementation-of-RDMA-asynchronous-programming-(I):-epoll-based-implementation-of-RDMA-asynchronous-operation/index.md":()=>S(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>S(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>S(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>S(()=>import("./index-29c0b7ce.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>S(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>S(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>S(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>S(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>S(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>S(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>S(()=>import("./index-1bdc26aa.js"),[]),"/src/articles/blogs/2022-06-30-Ten-thousand-words-long-article,-detailing-the-hardware-acceleration-and-implementation-of-TRIDENT:-Poseidon-hash-algorithm!/index.md":()=>S(()=>import("./index-02cd55c8.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>S(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>S(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>S(()=>import("./index-bb28ce04.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>S(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>S(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>S(()=>import("./index-4b85dcd8.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>S(()=>import("./index-2701299c.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>S(()=>import("./index-b503fc36.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-6f20c5b7.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>S(()=>import("./index-303605cc.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>S(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>S(()=>import("./index-500d1a02.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-671b070b.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>S(()=>import("./index-3d206f46.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>S(()=>import("./index-90593fbc.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>S(()=>import("./index-7a966399.js"),[]),"/src/articles/blogs/2023-06-21-The-first-cross-cloud-metadata-KV-storage-Xline-officially-entered-the-CNCF-sandbox/index.md":()=>S(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-93097ad1.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>S(()=>import("./index-8bf3af0a.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>S(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>S(()=>import("./index-2bfed728.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>S(()=>import("./index-0850e6f5.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>S(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>S(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>S(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>S(()=>import("./index-6618c0b5.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>S(()=>import("./index-0e3994dc.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>S(()=>import("./index-0c28844a.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-b73b42f4.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>S(()=>import("./index-1b00c887.js"),[]),"/src/articles/blogs/2024-01-11-Open-source-Bluespec-bsc-compiler-and-reusable-example-designs/index.md":()=>S(()=>import("./index-1407e949.js"),[]),"/src/articles/blogs/2024-01-18-Xline-v0.6.1:-a-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-067c93db.js"),[]),"/src/articles/blogs/2024-01-25-Agile-Digital-Chip-Design-and-Verification-with-SpinalHDL-and-Cocotb/index.md":()=>S(()=>import("./index-22038a3d.js"),[]),"/src/articles/blogs/2024-02-01-Xline-Jepsen-test-analysis/index.md":()=>S(()=>import("./index-c0527a8b.js"),[]),"/src/articles/blogs/2024-03-07-Membership-Change-Source-Code-Interpretation/index.md":()=>S(()=>import("./index-836388b4.js"),[]),"/src/articles/blogs/2024-03-21-Early-Explorations-and-Practices-of-Xline-a-Stateful-Application-Managed-by-Karmada/index.md":()=>S(()=>import("./index-8cb7e806.js"),[]),"/src/articles/blogs/2024-03-28-A-short-summary-of-the-implementation-of-interval-trees-in-Xline copy/index.md":()=>S(()=>import("./index-81d1e484.js"),[]),"/src/articles/blogs/2024-04-11-RDMA-Driver-Exploration-Series-for-Linux-1/index.md":()=>S(()=>import("./index-f7c1c3db.js"),[]),"/src/articles/blogs/2024-04-18-A-short-summary-of-the-implementation-of-interval-trees-in-Xline/index.md":()=>S(()=>import("./index-9e270336.js"),[]),"/src/articles/blogs/2024-04-25-Common-Design-Patterns-and-Their-Rust-Implementations/index.md":()=>S(()=>import("./index-5130399c.js"),[])}),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; @@ -2304,7 +2304,7 @@ 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 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-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` +`,G9=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>S(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>S(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>S(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>S(()=>import("./index-fe9ae8f0.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>S(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>S(()=>import("./index-9d5e23a7.js"),[]),"/src/articles/blogs/2022-05-27-Rust-implementation-of-RDMA-asynchronous-programming-(I):-epoll-based-implementation-of-RDMA-asynchronous-operation/index.md":()=>S(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>S(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>S(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>S(()=>import("./index-29c0b7ce.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>S(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>S(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>S(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>S(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>S(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>S(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>S(()=>import("./index-1bdc26aa.js"),[]),"/src/articles/blogs/2022-06-30-Ten-thousand-words-long-article,-detailing-the-hardware-acceleration-and-implementation-of-TRIDENT:-Poseidon-hash-algorithm!/index.md":()=>S(()=>import("./index-02cd55c8.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>S(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>S(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>S(()=>import("./index-bb28ce04.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>S(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>S(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>S(()=>import("./index-4b85dcd8.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>S(()=>import("./index-2701299c.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>S(()=>import("./index-b503fc36.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-6f20c5b7.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>S(()=>import("./index-303605cc.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>S(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>S(()=>import("./index-500d1a02.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-671b070b.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>S(()=>import("./index-3d206f46.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>S(()=>import("./index-90593fbc.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>S(()=>import("./index-7a966399.js"),[]),"/src/articles/blogs/2023-06-21-The-first-cross-cloud-metadata-KV-storage-Xline-officially-entered-the-CNCF-sandbox/index.md":()=>S(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-93097ad1.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>S(()=>import("./index-8bf3af0a.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>S(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>S(()=>import("./index-2bfed728.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>S(()=>import("./index-0850e6f5.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>S(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>S(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>S(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>S(()=>import("./index-6618c0b5.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>S(()=>import("./index-0e3994dc.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>S(()=>import("./index-0c28844a.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-b73b42f4.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>S(()=>import("./index-1b00c887.js"),[]),"/src/articles/blogs/2024-01-11-Open-source-Bluespec-bsc-compiler-and-reusable-example-designs/index.md":()=>S(()=>import("./index-1407e949.js"),[]),"/src/articles/blogs/2024-01-18-Xline-v0.6.1:-a-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-067c93db.js"),[]),"/src/articles/blogs/2024-01-25-Agile-Digital-Chip-Design-and-Verification-with-SpinalHDL-and-Cocotb/index.md":()=>S(()=>import("./index-22038a3d.js"),[]),"/src/articles/blogs/2024-02-01-Xline-Jepsen-test-analysis/index.md":()=>S(()=>import("./index-c0527a8b.js"),[]),"/src/articles/blogs/2024-03-07-Membership-Change-Source-Code-Interpretation/index.md":()=>S(()=>import("./index-836388b4.js"),[]),"/src/articles/blogs/2024-03-21-Early-Explorations-and-Practices-of-Xline-a-Stateful-Application-Managed-by-Karmada/index.md":()=>S(()=>import("./index-8cb7e806.js"),[]),"/src/articles/blogs/2024-03-28-A-short-summary-of-the-implementation-of-interval-trees-in-Xline copy/index.md":()=>S(()=>import("./index-81d1e484.js"),[]),"/src/articles/blogs/2024-04-11-RDMA-Driver-Exploration-Series-for-Linux-1/index.md":()=>S(()=>import("./index-f7c1c3db.js"),[]),"/src/articles/blogs/2024-04-18-A-short-summary-of-the-implementation-of-interval-trees-in-Xline/index.md":()=>S(()=>import("./index-9e270336.js"),[]),"/src/articles/blogs/2024-04-25-Common-Design-Patterns-and-Their-Rust-Implementations/index.md":()=>S(()=>import("./index-5130399c.js"),[])}),Bw=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>S(()=>import("./index-35dfbee0.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>S(()=>import("./index-192ae9c1.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>S(()=>import("./index-c7f65d1f.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>S(()=>import("./index-5d88950d.js"),[]),"/src/articles/events/2022-11-11-Datan-Technology-invites-you-who-love-challenges-to-participate-in-Rust-China-Hackathon-2022/index.md":()=>S(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>S(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>S(()=>import("./index-17cb538a.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>S(()=>import("./index-e197de7f.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>S(()=>import("./index-eed6a3b1.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>S(()=>import("./index-4e03f569.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>S(()=>import("./index-1f0dff83.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>S(()=>import("./index-a1a1a279.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>S(()=>import("./index-d2a8186a.js"),[]),"/src/articles/events/2023-05-04-Meet-this-summer|Datan-Technology-invites-you-to-participate-in-the-2023-Open-Source-Summer/index.md":()=>S(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>S(()=>import("./index-2b1c59a2.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>S(()=>import("./index-e01a3d91.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>S(()=>import("./index-4d1333f2.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>S(()=>import("./index-89698b14.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>S(()=>import("./index-6a3ed4c3.js"),[]),"/src/articles/events/2023-09-07-The-2nd-Hardware-Agile-Development-and-Methodology-Workshop-l-2023-RISC-V-China-Summit-Concurrent-Events-Successfully-Held/index.md":()=>S(()=>import("./index-696ef44a.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>S(()=>import("./index-5fa4b651.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>S(()=>import("./index-dfd283a0.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>S(()=>import("./index-7007c1ed.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>S(()=>import("./index-24fab036.js"),[]),"/src/articles/events/2023-12-05-Ding!-2023-hackathon-tips-fresh-from-the-oven!-Last-week-to-sign-up-before-it's-too-late!/index.md":()=>S(()=>import("./index-2ab66d66.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>S(()=>import("./index-50ad21f0.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>S(()=>import("./index-cc4e4968.js"),[]),"/src/articles/events/2024-02-22-Recruitment-can't-stop-Dartan-Technology-2024-internship-positions-waiting-for-you/index.md":()=>S(()=>import("./index-db271263.js"),[]),"/src/articles/events/2024-02-29-A-Challenge-Letter-from-DatenLord-on-GSoC-2024/index.md":()=>S(()=>import("./index-d4dfb508.js"),[]),"/src/articles/events/2024-04-04-Come-and-get-your-own-mind-blowing-offer-from-Dartan-Technologies/index.md":()=>S(()=>import("./index-d70f9808.js"),[]),"/src/articles/events/2024-05-09-DartanLord-@-you-and-invited-you-to-the-2024-Summer-of-Open-Source!/index.md":()=>S(()=>import("./index-68779906.js"),[])}),K9=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels:-RDMA's-Rust-safety-practices/index.md":()=>S(()=>import("./index-c2d3b4f6.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord:-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>S(()=>import("./index-8f0491cb.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>S(()=>import("./index-d654fc6e.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>S(()=>import("./index-e7ccea1d.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>S(()=>import("./index-9a9f68d0.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>S(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>S(()=>import("./index-4ada4a0c.js"),[]),"/src/articles/highlights/2023-12-21-Highlights:-2023-SpinalHDL-Application-Prospect-Exploration-Workshop/index.md":()=>S(()=>import("./index-67a528fa.js"),[])}),X9=Object.assign({"/src/articles/news-honor-dynamic/2022-08-04-Dartan-Technology-Invited-to-Do-Hardware-Acceleration-Research-Sharing-at-2022-China-Computer-Society-Chip-Conference/index.md":()=>S(()=>import("./index-559b2f74.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>S(()=>import("./index-012df9e2.js"),[])}),Q9=()=>{const e=ht(),t=si(),{title:r}=Sn();I.useEffect(()=>{window.scrollTo(0,0)},[]);const i=(()=>{switch(r){case"blogs":return G9;case"events":return Bw;case"highlights":return K9;case"news-honor-dynamic":return X9;default:return Bw}})(),[o,a]=I.useState([]),c=async()=>{a(await Promise.all(Object.keys(i).map(d=>i[d]())))};return I.useEffect(()=>{c()},[t.pathname]),l.jsxs(l.Fragment,{children:[l.jsx(Ir,{cover:M9,children:r&&I9.get(r)}),l.jsx(N9,{children:l.jsx(z9,{children:o.reverse().map(({metadata:d,assetURLs:h})=>{const{date:g,title:v,label:_,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(b=>l.jsx(W9,{children:b},b))]})]})]})]},v)})})})]})},q9=(e,t)=>{const r=I.useRef({});I.useEffect(()=>{const n=c=>{r.current=c.reduce((g,v)=>(g[v.target.innerHTML]=v,g),r.current);const d=[];Object.keys(r.current).forEach(g=>{const v=r.current[g];v.isIntersecting&&d.push(v)});const h=g=>a.findIndex(v=>v.id===g);if(d.length===1)e(d[0].target.id);else if(d.length>1){const g=d.sort((v,_)=>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,11 +2345,11 @@ 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 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-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;mS(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>S(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>S(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>S(()=>import("./index-fe9ae8f0.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>S(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>S(()=>import("./index-9d5e23a7.js"),[]),"/src/articles/blogs/2022-05-27-Rust-implementation-of-RDMA-asynchronous-programming-(I):-epoll-based-implementation-of-RDMA-asynchronous-operation/index.md":()=>S(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>S(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>S(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>S(()=>import("./index-29c0b7ce.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>S(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>S(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>S(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>S(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>S(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>S(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>S(()=>import("./index-1bdc26aa.js"),[]),"/src/articles/blogs/2022-06-30-Ten-thousand-words-long-article,-detailing-the-hardware-acceleration-and-implementation-of-TRIDENT:-Poseidon-hash-algorithm!/index.md":()=>S(()=>import("./index-02cd55c8.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>S(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>S(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>S(()=>import("./index-bb28ce04.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>S(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>S(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>S(()=>import("./index-4b85dcd8.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>S(()=>import("./index-2701299c.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>S(()=>import("./index-b503fc36.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-6f20c5b7.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>S(()=>import("./index-303605cc.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>S(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>S(()=>import("./index-500d1a02.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-671b070b.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>S(()=>import("./index-3d206f46.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>S(()=>import("./index-90593fbc.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>S(()=>import("./index-7a966399.js"),[]),"/src/articles/blogs/2023-06-21-The-first-cross-cloud-metadata-KV-storage-Xline-officially-entered-the-CNCF-sandbox/index.md":()=>S(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-93097ad1.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>S(()=>import("./index-8bf3af0a.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>S(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>S(()=>import("./index-2bfed728.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>S(()=>import("./index-0850e6f5.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>S(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>S(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>S(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>S(()=>import("./index-6618c0b5.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>S(()=>import("./index-0e3994dc.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>S(()=>import("./index-0c28844a.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-b73b42f4.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>S(()=>import("./index-1b00c887.js"),[]),"/src/articles/blogs/2024-01-11-Open-source-Bluespec-bsc-compiler-and-reusable-example-designs/index.md":()=>S(()=>import("./index-1407e949.js"),[]),"/src/articles/blogs/2024-01-18-Xline-v0.6.1:-a-distributed-KV-store-for-metadata-management/index.md":()=>S(()=>import("./index-067c93db.js"),[]),"/src/articles/blogs/2024-01-25-Agile-Digital-Chip-Design-and-Verification-with-SpinalHDL-and-Cocotb/index.md":()=>S(()=>import("./index-22038a3d.js"),[]),"/src/articles/blogs/2024-02-01-Xline-Jepsen-test-analysis/index.md":()=>S(()=>import("./index-c0527a8b.js"),[]),"/src/articles/blogs/2024-03-07-Membership-Change-Source-Code-Interpretation/index.md":()=>S(()=>import("./index-836388b4.js"),[]),"/src/articles/blogs/2024-03-21-Early-Explorations-and-Practices-of-Xline-a-Stateful-Application-Managed-by-Karmada/index.md":()=>S(()=>import("./index-8cb7e806.js"),[]),"/src/articles/blogs/2024-03-28-A-short-summary-of-the-implementation-of-interval-trees-in-Xline copy/index.md":()=>S(()=>import("./index-81d1e484.js"),[]),"/src/articles/blogs/2024-04-11-RDMA-Driver-Exploration-Series-for-Linux-1/index.md":()=>S(()=>import("./index-f7c1c3db.js"),[]),"/src/articles/blogs/2024-04-18-A-short-summary-of-the-implementation-of-interval-trees-in-Xline/index.md":()=>S(()=>import("./index-9e270336.js"),[]),"/src/articles/blogs/2024-04-25-Common-Design-Patterns-and-Their-Rust-Implementations/index.md":()=>S(()=>import("./index-5130399c.js"),[])}),aW=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>S(()=>import("./index-35dfbee0.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>S(()=>import("./index-192ae9c1.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>S(()=>import("./index-c7f65d1f.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>S(()=>import("./index-5d88950d.js"),[]),"/src/articles/events/2022-11-11-Datan-Technology-invites-you-who-love-challenges-to-participate-in-Rust-China-Hackathon-2022/index.md":()=>S(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>S(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>S(()=>import("./index-17cb538a.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>S(()=>import("./index-e197de7f.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>S(()=>import("./index-eed6a3b1.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>S(()=>import("./index-4e03f569.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>S(()=>import("./index-1f0dff83.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>S(()=>import("./index-a1a1a279.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>S(()=>import("./index-d2a8186a.js"),[]),"/src/articles/events/2023-05-04-Meet-this-summer|Datan-Technology-invites-you-to-participate-in-the-2023-Open-Source-Summer/index.md":()=>S(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>S(()=>import("./index-2b1c59a2.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>S(()=>import("./index-e01a3d91.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>S(()=>import("./index-4d1333f2.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>S(()=>import("./index-89698b14.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>S(()=>import("./index-6a3ed4c3.js"),[]),"/src/articles/events/2023-09-07-The-2nd-Hardware-Agile-Development-and-Methodology-Workshop-l-2023-RISC-V-China-Summit-Concurrent-Events-Successfully-Held/index.md":()=>S(()=>import("./index-696ef44a.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>S(()=>import("./index-5fa4b651.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>S(()=>import("./index-dfd283a0.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>S(()=>import("./index-7007c1ed.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>S(()=>import("./index-24fab036.js"),[]),"/src/articles/events/2023-12-05-Ding!-2023-hackathon-tips-fresh-from-the-oven!-Last-week-to-sign-up-before-it's-too-late!/index.md":()=>S(()=>import("./index-2ab66d66.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>S(()=>import("./index-50ad21f0.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>S(()=>import("./index-cc4e4968.js"),[]),"/src/articles/events/2024-02-22-Recruitment-can't-stop-Dartan-Technology-2024-internship-positions-waiting-for-you/index.md":()=>S(()=>import("./index-db271263.js"),[]),"/src/articles/events/2024-02-29-A-Challenge-Letter-from-DatenLord-on-GSoC-2024/index.md":()=>S(()=>import("./index-d4dfb508.js"),[]),"/src/articles/events/2024-04-04-Come-and-get-your-own-mind-blowing-offer-from-Dartan-Technologies/index.md":()=>S(()=>import("./index-d70f9808.js"),[]),"/src/articles/events/2024-05-09-DartanLord-@-you-and-invited-you-to-the-2024-Summer-of-Open-Source!/index.md":()=>S(()=>import("./index-68779906.js"),[])}),lW=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels:-RDMA's-Rust-safety-practices/index.md":()=>S(()=>import("./index-c2d3b4f6.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord:-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>S(()=>import("./index-8f0491cb.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>S(()=>import("./index-d654fc6e.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>S(()=>import("./index-e7ccea1d.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>S(()=>import("./index-9a9f68d0.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>S(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>S(()=>import("./index-4ada4a0c.js"),[]),"/src/articles/highlights/2023-12-21-Highlights:-2023-SpinalHDL-Application-Prospect-Exploration-Workshop/index.md":()=>S(()=>import("./index-67a528fa.js"),[])}),cW=Object.assign({"/src/articles/news-honor-dynamic/2022-08-04-Dartan-Technology-Invited-to-Do-Hardware-Acceleration-Research-Sharing-at-2022-China-Computer-Society-Chip-Conference/index.md":()=>S(()=>import("./index-559b2f74.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>S(()=>import("./index-012df9e2.js"),[])}),uW=()=>{const{section:e,title:t}=Sn(),[r,n]=I.useState(),[i,o]=I.useState("");q9(o,r);const a=async()=>{console.log(`/src/articles/${e}/${t}/index.md`);const h=await(async()=>{switch(e){case"blogs":return await sW[`/src/articles/${e}/${t}/index.md`]();case"events":return await aW[`/src/articles/${e}/${t}/index.md`]();case"highlights":return await lW[`/src/articles/${e}/${t}/index.md`]();case"news-honor-dynamic":return await cW[`/src/articles/${e}/${t}/index.md`]()}})();n(h)};I.useEffect(()=>{console.log(r)},[]),I.useEffect(()=>{a(),window.scrollTo(0,0)},[]);const c=d=>{var h;(h=document.querySelector(`#${d}`))==null||h.scrollIntoView({})};return l.jsx(Z9,{children:l.jsxs(J9,{children:[(r==null?void 0:r.toc.length)!==0&&l.jsx(nW,{children:l.jsx(iW,{children:((r==null?void 0:r.toc)||[]).map(({label:d,level:h})=>{const g=d.split(" ").join("-").toLowerCase();return l.jsx(oW,{level:h,isActive:i===g,onClick:()=>c(g),children:d},d)})})}),l.jsxs(eW,{children:[l.jsx(tW,{children:r==null?void 0:r.metadata.label}),l.jsx(rW,{className:"content",dangerouslySetInnerHTML:{__html:(r==null?void 0:r.default)||""}})]})]})})};function kk(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var Zu={},dW={get exports(){return Zu},set exports(e){Zu=e}},Ww;function fW(){return Ww||(Ww=1,function(e,t){(function(r,n){e.exports=n()})(Go,function(){var r;function n(){return r.apply(null,arguments)}function i(s){r=s}function o(s){return s instanceof Array||Object.prototype.toString.call(s)==="[object Array]"}function a(s){return s!=null&&Object.prototype.toString.call(s)==="[object Object]"}function c(s,u){return Object.prototype.hasOwnProperty.call(s,u)}function d(s){if(Object.getOwnPropertyNames)return Object.getOwnPropertyNames(s).length===0;var u;for(u in s)if(c(s,u))return!1;return!0}function h(s){return s===void 0}function g(s){return typeof s=="number"||Object.prototype.toString.call(s)==="[object Number]"}function v(s){return s instanceof Date||Object.prototype.toString.call(s)==="[object Date]"}function _(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 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 +`+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:b()});function Rv(s,u){var m,p;if(u.length===1&&o(u[0])&&(u=u[0]),!u.length)return $e();for(m=u[0],p=1;pthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function 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=b,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; `,wW=f.div` @@ -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(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(); +`,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),b=1;b1?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-be0587a7.js b/zh-cn/assets/index-fa30bf44.js similarity index 97% rename from zh-cn/assets/index-be0587a7.js rename to zh-cn/assets/index-fa30bf44.js index 7e34670..c56b464 100644 --- a/zh-cn/assets/index-be0587a7.js +++ b/zh-cn/assets/index-fa30bf44.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-3674aa81.jpg",e="/zh-cn/assets/image1-af3445c2.png",s=[t,e],n={label:"精彩回顾 | Rust唠嗑室:Xline跨数据中心一致性管理",description:"2022年10月15日,达坦科技和Rust语言中文社区合作,在Rust唠嗑室活动中,由达坦科技(DatenLord)联合创始人施继成做了关于开源分布式存储技术的分享,着重介绍了达坦科技新的开源项目Xline,这一跨云的metadata(元数据)KV存储的产品是如何实现高性能跨数据中心的数据一致性管理的。",cover:"./cover.jpg",location:"中国香港",tags:["Xline"],date:"2022-10-20",title:"Wonderful review l Rust chat room: Xline cross data center consistency management"},o=[{label:"内容介绍",level:2},{label:"我们的产品:Xline",level:2}],r=`

      图片

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

      图片

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

      内容介绍

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

      @@ -13,4 +13,4 @@ const t="/zh-cn/assets/cover-3674aa81.jpg",e="/zh-cn/assets/image1-af3445c2.png"

      基于 CURP 这套协议,达坦科技开发了我们的产品 Xline,它是兼容 etcd 接口的 metadata 存储接口。施继成最后提出,我们最终的希望是在跨云部署的情况下可以替代 etcd 取得更好的性能,同时能够将 CURP 协议剥离出来,后续可以被其他人复用。

      现在 Xline 项目仍然处在早期状态,已经拥有了几个接口并且做了基本的测试。但是接口方面还有待完善,以及后续稳定性方面还需要迭代。我们手动搭建了一个容器环境模拟跨云场景,手动增加网络链接的延迟,当 Client 和 Leader 在一起时,Xline 延迟性方面的优越还无法体现,但当 Client 和 Leader 不在一个数据中心时,Xline 的优势就相当明显,这一测试结果也符合最初我们对原理的论述。

      Xline 项目是以 Rust 语言写就,欢迎大家参与我们开源项目,GitHub 链接:
      -https://github.com/datenlord/Xline.

      `;export{s as assetURLs,r as default,n as metadata,o as toc}; +https://github.com/datenlord/Xline.

      `;export{n as assetURLs,r as default,s as metadata,o as toc}; diff --git a/zh-cn/assets/index-4820dca7.js b/zh-cn/assets/index-fd018bec.js similarity index 98% rename from zh-cn/assets/index-4820dca7.js rename to zh-cn/assets/index-fd018bec.js index 2d4fc66..ac5019f 100644 --- a/zh-cn/assets/index-4820dca7.js +++ b/zh-cn/assets/index-fd018bec.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"},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 异步操作。

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

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

      RDMA 操作简介

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

      图片

      @@ -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,n as default,c as metadata,a as toc}; +https://github.com/datenlord/async-rdma/

      `;export{l as assetURLs,o as default,c as metadata,n as toc}; diff --git a/zh-cn/assets/index-9d285d88.js b/zh-cn/assets/index-fe9ae8f0.js similarity index 98% rename from zh-cn/assets/index-9d285d88.js rename to zh-cn/assets/index-fe9ae8f0.js index 4f0b969..9b7e61a 100644 --- a/zh-cn/assets/index-9d285d88.js +++ b/zh-cn/assets/index-fe9ae8f0.js @@ -1,4 +1,4 @@ -const l="/zh-cn/assets/image1-130a4039.jpg",a=[l],o={label:"Rust语言无锁数据结构的内存管理",description:"正如大家所熟知的,无锁数据结构在并发访问中往往具有更好的访问效率和并发度。",location:"河南",author:["施继成"],tags:["Rust"],date:"2022-05-27",title:"Memory Management for Lock Free Data Structures in the Rust Language"},s=[{label:"无锁数据结构内存管理",level:2},{label:"Epoch-Based Reclamation",level:2},{label:"Rust 语言实现 EBR",level:2},{label:"总结",level:2}],p=`

      无锁数据结构内存管理

      +const l="/zh-cn/assets/image1-130a4039.jpg",o=[l],a={label:"Rust语言无锁数据结构的内存管理",description:"正如大家所熟知的,无锁数据结构在并发访问中往往具有更好的访问效率和并发度。",location:"河南",author:["施继成"],tags:["Rust"],date:"2022-05-27",title:"Memory Management for Lock Free Data Structures in the Rust Language"},s=[{label:"无锁数据结构内存管理",level:2},{label:"Epoch-Based Reclamation",level:2},{label:"Rust 语言实现 EBR",level:2},{label:"总结",level:2}],p=`

      无锁数据结构内存管理

      正如大家所熟知的,无锁数据结构在并发访问中往往具有更好的访问效率和并发度。无锁数据结构的性能优势主要来自于以下两点:

      1. 数据结构的锁设计往往比较粗粒度,在很多可以并发访问的情况下,访问者被锁阻塞,无法实现并发访问。
      2. @@ -44,4 +44,4 @@ const l="/zh-cn/assets/image1-130a4039.jpg",a=[l],o={label:"Rust语言无锁数

    第一行和前面的例子类似,第二行的语义为从 map 中寻找 key 对应的 value,获取 value 的引用,其生命周期不超过 guard 的生命周期。通过生命周期的方法,我们限定了 value 引用的使用范围为 guard 的存活范围。

    总结

    -

    本文简单介绍了 Epoch-Based Reclamation 内存管理方法,并且从接口层面介绍了 Rust 的实现和使用。同时本文也分析了 EBR 在性能上的优越性,以及 Rust 语言从语言实现的优势。之后我们还会从 crossbeam epoch 的实现细节给大家带来深入的 Rust EBR 实现的分析。

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

    本文简单介绍了 Epoch-Based Reclamation 内存管理方法,并且从接口层面介绍了 Rust 的实现和使用。同时本文也分析了 EBR 在性能上的优越性,以及 Rust 语言从语言实现的优势。之后我们还会从 crossbeam epoch 的实现细节给大家带来深入的 Rust EBR 实现的分析。

    `;export{o as assetURLs,p as default,a as metadata,s as toc}; diff --git a/zh-cn/index.html b/zh-cn/index.html index 6efa04f..0c3c13b 100644 --- a/zh-cn/index.html +++ b/zh-cn/index.html @@ -5,7 +5,7 @@ 达坦科技 - +